ia64/xen-unstable

changeset 10920:b76e86966e7e

merge with xen-unstable.hg
author awilliam@xenbuild.aw
date Wed Aug 02 13:39:47 2006 -0600 (2006-08-02)
parents 4acc6d51f389 aa1ab056bfbf
children b13ea287f9c0
files buildconfigs/linux-defconfig_xen0_ia64 buildconfigs/linux-defconfig_xen_ia64 tools/ioemu/CVS/Entries tools/ioemu/CVS/Repository tools/ioemu/CVS/Root tools/ioemu/CVS/Tag tools/ioemu/audio/CVS/Entries tools/ioemu/audio/CVS/Repository tools/ioemu/audio/CVS/Root tools/ioemu/audio/CVS/Tag tools/ioemu/fpu/CVS/Entries tools/ioemu/fpu/CVS/Repository tools/ioemu/fpu/CVS/Root tools/ioemu/fpu/CVS/Tag tools/ioemu/hw/CVS/Entries tools/ioemu/hw/CVS/Repository tools/ioemu/hw/CVS/Root tools/ioemu/hw/CVS/Tag tools/ioemu/keymaps/CVS/Entries tools/ioemu/keymaps/CVS/Repository tools/ioemu/keymaps/CVS/Root tools/ioemu/keymaps/CVS/Tag tools/ioemu/pc-bios/CVS/Entries tools/ioemu/pc-bios/CVS/Repository tools/ioemu/pc-bios/CVS/Root tools/ioemu/pc-bios/CVS/Tag tools/ioemu/target-i386/CVS/Entries tools/ioemu/target-i386/CVS/Repository tools/ioemu/target-i386/CVS/Root tools/ioemu/target-i386/CVS/Tag tools/ioemu/tests/CVS/Entries tools/ioemu/tests/CVS/Repository tools/ioemu/tests/CVS/Root tools/ioemu/tests/CVS/Tag
line diff
     1.1 --- a/.hgignore	Tue Aug 01 14:58:20 2006 -0600
     1.2 +++ b/.hgignore	Wed Aug 02 13:39:47 2006 -0600
     1.3 @@ -156,6 +156,7 @@
     1.4  ^tools/xenstat/xentop/xentop$
     1.5  ^tools/xenstore/testsuite/tmp/.*$
     1.6  ^tools/xenstore/xen$
     1.7 +^tools/xenstore/xenstore-chmod$
     1.8  ^tools/xenstore/xenstore-exists$
     1.9  ^tools/xenstore/xenstore-list$
    1.10  ^tools/xenstore/xenstore-read$
     2.1 --- a/buildconfigs/linux-defconfig_xen0_ia64	Tue Aug 01 14:58:20 2006 -0600
     2.2 +++ b/buildconfigs/linux-defconfig_xen0_ia64	Wed Aug 02 13:39:47 2006 -0600
     2.3 @@ -1,7 +1,7 @@
     2.4  #
     2.5  # Automatically generated make config: don't edit
     2.6  # Linux kernel version: 2.6.16.13-xen0
     2.7 -# Fri Jun 30 12:59:19 2006
     2.8 +# Fri Jul 28 16:33:47 2006
     2.9  #
    2.10  
    2.11  #
    2.12 @@ -92,6 +92,7 @@ CONFIG_EFI=y
    2.13  CONFIG_GENERIC_IOMAP=y
    2.14  CONFIG_XEN=y
    2.15  CONFIG_XEN_IA64_DOM0_VP=y
    2.16 +CONFIG_XEN_IA64_VDSO_PARAVIRT=y
    2.17  CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
    2.18  CONFIG_DMA_IS_DMA32=y
    2.19  # CONFIG_IA64_GENERIC is not set
    2.20 @@ -180,6 +181,8 @@ CONFIG_ACPI_CONTAINER=y
    2.21  #
    2.22  CONFIG_PCI=y
    2.23  CONFIG_PCI_DOMAINS=y
    2.24 +CONFIG_XEN_PCIDEV_FRONTEND=y
    2.25 +# CONFIG_XEN_PCIDEV_FE_DEBUG is not set
    2.26  CONFIG_PCI_LEGACY_PROC=y
    2.27  # CONFIG_PCI_DEBUG is not set
    2.28  
    2.29 @@ -1513,7 +1516,7 @@ CONFIG_XEN_SKBUFF=y
    2.30  CONFIG_XEN_NETDEV_BACKEND=y
    2.31  CONFIG_XEN_NETDEV_FRONTEND=y
    2.32  # CONFIG_XEN_DEVMEM is not set
    2.33 -# CONFIG_XEN_REBOOT is not set
    2.34 +CONFIG_XEN_REBOOT=y
    2.35  # CONFIG_XEN_SMPBOOT is not set
    2.36  CONFIG_XEN_INTERFACE_VERSION=0x00030202
    2.37  
    2.38 @@ -1523,13 +1526,16 @@ CONFIG_XEN_INTERFACE_VERSION=0x00030202
    2.39  CONFIG_XEN_PRIVILEGED_GUEST=y
    2.40  # CONFIG_XEN_UNPRIVILEGED_GUEST is not set
    2.41  CONFIG_XEN_PRIVCMD=y
    2.42 +CONFIG_XEN_XENBUS_DEV=y
    2.43  CONFIG_XEN_BACKEND=y
    2.44 -# CONFIG_XEN_PCIDEV_BACKEND is not set
    2.45  CONFIG_XEN_BLKDEV_BACKEND=y
    2.46 -CONFIG_XEN_XENBUS_DEV=y
    2.47  # CONFIG_XEN_BLKDEV_TAP is not set
    2.48  # CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set
    2.49  CONFIG_XEN_NETDEV_LOOPBACK=y
    2.50 +CONFIG_XEN_PCIDEV_BACKEND=y
    2.51 +CONFIG_XEN_PCIDEV_BACKEND_VPCI=y
    2.52 +# CONFIG_XEN_PCIDEV_BACKEND_PASS is not set
    2.53 +# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
    2.54  # CONFIG_XEN_TPMDEV_BACKEND is not set
    2.55  CONFIG_XEN_BLKDEV_FRONTEND=y
    2.56  # CONFIG_XEN_SCRUB_PAGES is not set
     3.1 --- a/buildconfigs/linux-defconfig_xenU_ia64	Tue Aug 01 14:58:20 2006 -0600
     3.2 +++ b/buildconfigs/linux-defconfig_xenU_ia64	Wed Aug 02 13:39:47 2006 -0600
     3.3 @@ -1,7 +1,7 @@
     3.4  #
     3.5  # Automatically generated make config: don't edit
     3.6  # Linux kernel version: 2.6.16.13-xenU
     3.7 -# Mon May 22 15:05:32 2006
     3.8 +# Fri Jul 28 16:32:18 2006
     3.9  #
    3.10  
    3.11  #
    3.12 @@ -89,6 +89,7 @@ CONFIG_EFI=y
    3.13  CONFIG_GENERIC_IOMAP=y
    3.14  CONFIG_XEN=y
    3.15  CONFIG_XEN_IA64_DOM0_VP=y
    3.16 +CONFIG_XEN_IA64_VDSO_PARAVIRT=y
    3.17  CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
    3.18  CONFIG_DMA_IS_DMA32=y
    3.19  # CONFIG_IA64_GENERIC is not set
    3.20 @@ -177,6 +178,8 @@ CONFIG_ACPI_SYSTEM=y
    3.21  #
    3.22  CONFIG_PCI=y
    3.23  CONFIG_PCI_DOMAINS=y
    3.24 +CONFIG_XEN_PCIDEV_FRONTEND=y
    3.25 +# CONFIG_XEN_PCIDEV_FE_DEBUG is not set
    3.26  CONFIG_PCI_LEGACY_PROC=y
    3.27  # CONFIG_PCI_DEBUG is not set
    3.28  
    3.29 @@ -1380,8 +1383,15 @@ CONFIG_CRYPTO_DES=y
    3.30  #
    3.31  # Hardware crypto devices
    3.32  #
    3.33 +# CONFIG_XEN_UTIL is not set
    3.34  CONFIG_HAVE_ARCH_ALLOC_SKB=y
    3.35  CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
    3.36 +CONFIG_XEN_BALLOON=y
    3.37 +CONFIG_XEN_SKBUFF=y
    3.38 +CONFIG_XEN_NETDEV_FRONTEND=y
    3.39 +# CONFIG_XEN_DEVMEM is not set
    3.40 +CONFIG_XEN_REBOOT=y
    3.41 +# CONFIG_XEN_SMPBOOT is not set
    3.42  CONFIG_XEN_INTERFACE_VERSION=0x00030202
    3.43  
    3.44  #
    3.45 @@ -1389,13 +1399,15 @@ CONFIG_XEN_INTERFACE_VERSION=0x00030202
    3.46  #
    3.47  # CONFIG_XEN_PRIVILEGED_GUEST is not set
    3.48  CONFIG_XEN_UNPRIVILEGED_GUEST=y
    3.49 +CONFIG_XEN_PRIVCMD=y
    3.50 +CONFIG_XEN_XENBUS_DEV=y
    3.51  # CONFIG_XEN_BACKEND is not set
    3.52  CONFIG_XEN_BLKDEV_FRONTEND=y
    3.53 -CONFIG_XEN_NETDEV_FRONTEND=y
    3.54  # CONFIG_XEN_SCRUB_PAGES is not set
    3.55  # CONFIG_XEN_DISABLE_SERIAL is not set
    3.56  CONFIG_XEN_SYSFS=y
    3.57  CONFIG_XEN_COMPAT_030002_AND_LATER=y
    3.58  # CONFIG_XEN_COMPAT_LATEST_ONLY is not set
    3.59  CONFIG_XEN_COMPAT_030002=y
    3.60 +CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
    3.61  CONFIG_NO_IDLE_HZ=y
     4.1 --- a/buildconfigs/linux-defconfig_xen_ia64	Tue Aug 01 14:58:20 2006 -0600
     4.2 +++ b/buildconfigs/linux-defconfig_xen_ia64	Wed Aug 02 13:39:47 2006 -0600
     4.3 @@ -1,7 +1,7 @@
     4.4  #
     4.5  # Automatically generated make config: don't edit
     4.6  # Linux kernel version: 2.6.16.13-xen
     4.7 -# Thu Jun 29 16:23:48 2006
     4.8 +# Fri Jul 28 16:33:08 2006
     4.9  #
    4.10  
    4.11  #
    4.12 @@ -92,6 +92,7 @@ CONFIG_EFI=y
    4.13  CONFIG_GENERIC_IOMAP=y
    4.14  CONFIG_XEN=y
    4.15  CONFIG_XEN_IA64_DOM0_VP=y
    4.16 +CONFIG_XEN_IA64_VDSO_PARAVIRT=y
    4.17  CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
    4.18  CONFIG_DMA_IS_DMA32=y
    4.19  # CONFIG_IA64_GENERIC is not set
    4.20 @@ -180,6 +181,8 @@ CONFIG_ACPI_CONTAINER=y
    4.21  #
    4.22  CONFIG_PCI=y
    4.23  CONFIG_PCI_DOMAINS=y
    4.24 +CONFIG_XEN_PCIDEV_FRONTEND=y
    4.25 +# CONFIG_XEN_PCIDEV_FE_DEBUG is not set
    4.26  CONFIG_PCI_LEGACY_PROC=y
    4.27  # CONFIG_PCI_DEBUG is not set
    4.28  
    4.29 @@ -1519,7 +1522,7 @@ CONFIG_XEN_SKBUFF=y
    4.30  CONFIG_XEN_NETDEV_BACKEND=y
    4.31  CONFIG_XEN_NETDEV_FRONTEND=y
    4.32  # CONFIG_XEN_DEVMEM is not set
    4.33 -# CONFIG_XEN_REBOOT is not set
    4.34 +CONFIG_XEN_REBOOT=y
    4.35  # CONFIG_XEN_SMPBOOT is not set
    4.36  CONFIG_XEN_INTERFACE_VERSION=0x00030202
    4.37  
    4.38 @@ -1529,13 +1532,16 @@ CONFIG_XEN_INTERFACE_VERSION=0x00030202
    4.39  CONFIG_XEN_PRIVILEGED_GUEST=y
    4.40  # CONFIG_XEN_UNPRIVILEGED_GUEST is not set
    4.41  CONFIG_XEN_PRIVCMD=y
    4.42 +CONFIG_XEN_XENBUS_DEV=y
    4.43  CONFIG_XEN_BACKEND=y
    4.44 -# CONFIG_XEN_PCIDEV_BACKEND is not set
    4.45  CONFIG_XEN_BLKDEV_BACKEND=y
    4.46 -CONFIG_XEN_XENBUS_DEV=y
    4.47  # CONFIG_XEN_BLKDEV_TAP is not set
    4.48  # CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set
    4.49  CONFIG_XEN_NETDEV_LOOPBACK=y
    4.50 +CONFIG_XEN_PCIDEV_BACKEND=y
    4.51 +CONFIG_XEN_PCIDEV_BACKEND_VPCI=y
    4.52 +# CONFIG_XEN_PCIDEV_BACKEND_PASS is not set
    4.53 +# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
    4.54  # CONFIG_XEN_TPMDEV_BACKEND is not set
    4.55  CONFIG_XEN_BLKDEV_FRONTEND=y
    4.56  # CONFIG_XEN_SCRUB_PAGES is not set
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/docs/figs/acm_ezpolicy.eps	Wed Aug 02 13:39:47 2006 -0600
     5.3 @@ -0,0 +1,657 @@
     5.4 +%!PS-Adobe-2.0 EPSF-2.0
     5.5 +%%BoundingBox: 0 0 610 400
     5.6 +%
     5.7 +% created by bmeps 1.2.6a (SCCS=1.78)
     5.8 +%
     5.9 +/pstr
    5.10 +  610 string
    5.11 +def
    5.12 +/inputf
    5.13 +  currentfile
    5.14 +  /ASCII85Decode   filter
    5.15 +  /RunLengthDecode filter
    5.16 +def
    5.17 +gsave
    5.18 +0 400 translate
    5.19 +610 400 scale
    5.20 +610 400 8 [610 0 0 -400 0 0]
    5.21 +{ inputf pstr readstring pop }
    5.22 +image
    5.23 +r;Qmd6ps=,r^.#_8PW)W:fC4d:Jq*eJka?]JkgnmP"tsM!)EGd%7s,^8OZ0@77fs;
    5.24 +77'??705qG4Sf!e6pt0dBlJ$6H@:BtK8,-ULk:B'L4Y6'Lk:B'LAZi1L4b55LA6Du
    5.25 +I0Fb9BjEhVr;R-m;-@(3Bk_O*G'831IK"hMI=cm!I=cmrIK"NpI=6EfrcJ3er,r'_
    5.26 +rHA*Xrb2IA?VWW\rrbGT86&[h<YAS@?"./K?t*JP@UEMP?XI8M@=hm=@$4oL>KU.P
    5.27 +?s?uGrEfn8='8U';G^7f;cEWm%T$&$92/,W:eEo6!<5/JrCmAj;cQlt>52>&>5_TU
    5.28 +=+XM*=+XN'<sVf+;c?Oj:/+I^9E%Np8P)EB770F.5smgo+94/a6N0LZ9heG_;cWft
    5.29 +rE0#!!*0"rJl'QcJkptoO\bjL#Ydra8P)EB77I&?"@5=;5!8g*%Q6't*ATB46qBjC
    5.30 +9i+berDies#ZXl';c-Cf:/6C8Jk^hkJkZ>A:QXo4rs"Q\9heEFlgauZO%i5;8rW'*
    5.31 +rt:&I2DR$=.30ck4@D_29hnM`;u9So;Z]fm;#X2j9hg44b"I=Ya\%.Vn4>s,jHtgV
    5.32 +I!BaVEH,o8Bk_3g>%QEJ8P+s'R#6KCG]\+KEGoc0BkLjXA_N/87uZW-R?<GaKSG,3
    5.33 +J:N#pH?F+JhM2"b$RdA<+>PuC84ZHM;#O;n<E8ur!DuYl:B!t>8qKZt8qKY(8Qc"]
    5.34 +Xg"XjQ&q#bMM[(?IsQ-K=^(,_8cP6]YbdeROH,9WM2$Y4H?*\%>3e[Ks/*9:Ybn+b
    5.35 +S=,_1P`h&aK6h<Hl8CCN-mocQ1-.]l9jqaG@UWeYB4><7s+3no97fdX8qKY(8Q>_M
    5.36 +ZF-X&R$3VkN/NLGJ:)KU>snW`8cOgV[A][aPE:c_Mhm(;I!'726iTYEs-p[8Z`0do
    5.37 +SXZ%8QBRAfL44&>s#)bg-mocQ1-@oo8l\nn='Jo.<rc@fs+3mq97ffq92GS@W2lVY
    5.38 +Oc5*LJ:;fjG&hM8?:Orf9E0[DX.blBN/3.;IX6<`Ec5Yu7fPqGs-'dtXJDJWQBI>i
    5.39 +MMd.@J9u69s#)bg-n,oS1-@oo9%j!_lMlH/JkL\gN(Y,iJ=W=!O,8O?H?O=GChdZt
    5.40 +Ame7292#;8SY)8Bs!VPm?qUGg7/r=IX/+AIP)bETK7JFNaa8;R=oUB<0.87b,W7YM
    5.41 +8PB*YrqcWrn"3GU5QXKCkPG5V9+(@lPY78@PY78@p%(fWl1t3L!U9FI9*+;Qr(I%h
    5.42 +!r:o[fh2A7n*NdIrrW#WY4kQml1mtFn*f[;q>^"Y!U9E39BSs"8FT.Zs*U)uOc+pC
    5.43 +H?O:FC2!QX$"-C*84`c.Q'[X,rsNFN?qUGg7/r4?Un@Yd"H%teJ:.@r&UAV@=oUB<
    5.44 +0.81`,W7eQ8k]3Zrql]tLDXF&rkATFBGc!gr;QaLrC[OTs//K!s//K!s4/st9*5.n
    5.45 +0)S?Ds8O_>9*5.n0)\EIs8O0emJjZd9**Z;n4Nf6p&7Scn*W+%9*YFr++!>S\+iT#
    5.46 +s8O]En*W+%9*67Xs8W$>o1K/bs"8mrJkO]g)uk,DOc>0KI<]jPCM79h@Us%W9)hOW
    5.47 +s*'QeNV<A\A7]+?s$fEVLRk',QN$mcKn4[Ort9L!GB$ab3&WE<.2F0e4[Vb5s7lTl
    5.48 +rr^k4Gk_%6!f&JMrVlj\rC[O6s2@ISs2@ISs04`Z9*5.n+8eb5s8O2/9*5.n+8nh;
    5.49 +s8O06UAsdRo1K/bs"a+;!rr9Ur_!8M2XX3Cs8O06UAsdRq+CqlruXm,2E'np!rr9B
    5.50 +n4Ni_ruZhcJkO]g2#hcWMi!1>HZsLKCM.0e@:EbS8cMFVs*'?YM>r-RGB.V;B4PKO
    5.51 +@Urh;s$]?ULR=KsP`PhD!.b(K'6SA=G&UR`3&`K=.2F0e4\/:Bs7lTmrrT)Pa7fN7
    5.52 +f/SQbrr>[i9+[?fj?`&1j?`&1H::K`s8UsT9,.F+hXsPAruXnjs1qA.ruXnjs8UsT
    5.53 +9*Fqfs66<X9*OS[p&G%6rC[k)ruXm,s7nECs8UsK92".As5$CArVm$o9A]^KhYp.O
    5.54 +d.RG3\4cf#!)*=k"\VMFs8UsT9*P@Vq>]]Sr(@IuruXm,s7nEChZ*W4r_!=mru_7?
    5.55 +%SKIAp&F]p9BlJO9;DOUqF^niru_55"5a(XhYp.MhZ*W4r_!=mruZhcJkO]g2?.WL
    5.56 +LkgY6I!BdQD/!Tm@U`hR8H2=Us)<[JL];mPG]dtBBkCoU@Ui_8s$fKXJWlCbP)kS"
    5.57 +rtK^$FEMbF=8t6=2D6Ts-oaOa925H]rWN9$k:#fjrrYO$s8Vsj./!U$s6'DCs7@C,
    5.58 +fDiO^s4'h<s8T@11]RIshZ(827fWK1fDiO^s4.*C$o<hAmRp:2s26#Zru_265QCa*
    5.59 +9pPb0/kuBGZ*Q7<s1P?1eP/d<ruW?>s2Co9gJ-)qehc1*859-a+!45Wru]km]r1n\
    5.60 +9hkZfS"frG9DqR2s8O08Q2fDffDiO^s4'h<s8O08s8O1gs40!_b"0)CbtH[g]JfX[
    5.61 +(B=CV92!n:]VkeZ9@s3VVuP7>9E5#6JkL\gf1S%%Ck%(jK7A8nF`MA8B4YR^@pMS(
    5.62 +92#;$ItNFSIscK`Ec,Z*AcH4L>t4ic8H4.!P*;#gN/@Q6!do9;rcJ`h<rY9C2_QTu
    5.63 +-oaOa9i1lbrWE3#8@S0i"5bO$s8,PBhZ'k\S,]bneh^(truX`1q*@dUruX^$s8VEb
    5.64 +bo]DMs8O2;ruX`1q*@d4qYpL#2bs5L+%?50+8nr!s8O1,nG.Ap:B1>97S*CU+%H;+
    5.65 +5u.I[+&;\4+%?5*5P>$u5u'R1:B1>9:/:ih+8Z!Z7fW9M:B1>99E5#QrD"[=ru[Qr
    5.66 +q0G:%ruX`1q*@dUruY#9ru^q6+$iXb6Vd:E61t8(7Jfgqs8O09:AXu47fW9MqYqX,
    5.67 +s7nrUs8O0m:4c6m:,W&bH\$d"J:2`gF`D;6B4PL\>"&Bc:B,!SJV*oPI<p-\EGfN(
    5.68 +s'oJ@7/ohMs*BQaOcb]ar;RIXH$4=PCfLEr4#\]A)C[d892/7_q#1?pT4%0g!f)%#
    5.69 +qbT8is5`eop#Q.X5Z%L\+&N";02V]K+&Gf6s7u]U78Qh\ru_:@+&N";0C&SN0E;%o
    5.70 +;#gP;;#gP;rD<Im($(c9:/Luj+&Gf6ruY);s"@4KruY)7rrXqSru_/8(B=CV:f.2l
    5.71 ++92?_;#gPK;#gP;;#gP;rD<Im($(c9:B1>9;#gPK;#gP;;#gP;s8O2=:^4i;\c:h7
    5.72 +:A[j's8O0;;#gP;;#gPKs8O0;s8O`Ks8O0m;!:`-:@M"8s'p5#J:W6"H[9mXE,96"
    5.73 +@piD+s%Z>h@s39Ns+#QFH?XIMCh`oZ?s#er9M5>.L5_1SNrK%pL]@DJH?XLPBiG$r
    5.74 +5!(PO*%<s992JOdq#1?p)!Chs!P_M2,lhHOrrF8"qboJBs8Uh2huE_&92k]e+&i48
    5.75 ++&i4>+&c,<s,5h8`D]_8ru_+;+&i48+92?_9E5#6;u6M9;uck>rDNass8F)U5YtBX
    5.76 +s8O0>;u6M9;ucY8;uck>;u6Ol*s2<=+8f%Qs8O0>;uck>qYqX9s7ma8s8O0>s8O2>
    5.77 +;ZZpurZ;h>:fI5j+&i48+&i4>+&i4>+8Z!ZqbmXjs8T>dqG7t-ruY'6qYqX6s7mc5
    5.78 +ruY);q&`H5ruZhhJl(&q"TMhJH%#Ph-ZO$=An,.I5lXYWs'K_jIK+bEH[0gYEGfOk
    5.79 +@pW/#s%H,dF+T7.NrK%[M2-fart0HsE+`#I5<h4c/0$3&6V10Rrr3#urqucs^Hh_s
    5.80 +#JU6=,p`Nk;>^@oG_c,p2td3U6c8rp+&Z(ks09fJbqN,sruY3>s8O0;q>$4RqYqYj
    5.81 +s09fJbqS&TMp25$McAU6]N"q2+8o.?s8O2<<&XdV+&l4ms09fJbqN,nruY4gs2E4Y
    5.82 +fi6E"`DksP<)i_o+&l5>ru]qoZ-<6m0NA)P+&r:?+8o.?s8O2=<#"$cZ-<6m0N@oK
    5.83 ++&r:?+4C2.<9;g4<!:YLruXr2<#5N6+&l4ms09fJbqRiNZ-<6m0N@oK++dID<7b(P
    5.84 +s&s2[H2@OfEc,W(?s6Djs&;tt>&/5*s*K*=H?XOQDJK2Z>#@H_:/(\*I>*OWrre18
    5.85 +L4t6YrtBHkA5E4n6U*Xf*%X0?9i=nP2`CLk!IoUsrs1^e4S/T;!%#DXrrKT"qGmjZ
    5.86 +s*@D/s40..<\3),s48>_<r`1A<`]8#+'-)Ti)IDc]N3kgs48>_<o*f/h>aBO<pBYW
    5.87 +s8O2><W`=$+8](?s8O2?<\WA0s48>_<lP+=<`[TCs7MXI<m^F;p7=cT`W,s=<r`1A
    5.88 +<o*fUf,mL`s8O0As8O2><W`=$+8](Wh>dN,+%KAFq7Kc.ruY:go)JET7oiZ[s4/:f
    5.89 +<W`=$+9#:Ph>dN,+%KAfs8U[m7om>!]Rj2J<e=<?<!<5%Ao;_erss*eC1UaR9fi;R
    5.90 +<<$!2DKPUP1LF3X3r`&Qs(ck0L!K^RLPCM8J:@O>EGJrUs$T7>3\MI%4%;tC;c?Rn
    5.91 +<*!+(=]\a6TDecljs:#&rr2uBqYpW;3$8!$#"Th<>?Dt<rEB@p+!4,S>6,ffr`]mT
    5.92 ++'VrJ+%9C41/D+F+!4,S>7=%E8k:%&>?aB83?K@@>6,ffqHEtB+8oCG808pGr`^IA
    5.93 ++!4]k9JR\M<a/d%3?L7^>?arH+'Vqk+'Vr?+!4,S>6Q)j>?`0kr*'1D+8T1D808pG
    5.94 +r`^"61/D*r+'VrC3?L7^>?eN8Vb$Se!?WE^>6@D<+%lN:"%XLU9)`#r;_h.#>No@D
    5.95 +=7B8os&39<DZ"JdE,TQ-ARSeB8icoQ=8u3+BQ!`f'6%l+C1UgX<(]1N<)N[.F*`@g
    5.96 +KDpHHJU`)oGB7Y8?;(;g6pj!j*%!a::/b.o=^,3>?smDP@T]Q,rr^IF!6k0:!T,#O
    5.97 +>M<9as8Va6;hA5*>I[l@s%QU'ASD!U&SGZa?WpH+7Q19N>Q7E"?tF$LBfKa:@UE;=
    5.98 +:e!AC<)im,CiaiII!U-dH?j^VEG]E#>"AT_7moBn*%!a::/b(k=]o$;?X[AP@VD,,
    5.99 +rr^IF!5J7-!P^mO?.rQes5&Yo?%Q:4>I[lqls!.]='Ad1>$>'3=&i0p9Lh<?s'&^o
   5.100 +>>.pr>$>'4>$5!0<Du[e7mBZH=&eO&?t<tfChmkdCER>)AR]"N;Hj)m7moBn)C@O8
   5.101 +:/Fkh='&O/?!grI@>B+*rrOJHFT2:A,s7t#rrK<"Jm6o4!Zsj3Jm3h2[p)gtfi1+$
   5.102 +6:4%+6UF((5<V(h2bVbg>?dEH<'<Q76U=(,6:!k$4Zb\`9@oD0<0Q*H9Mn\c;,^Ck
   5.103 +;Gg:d9he2_g5eir6om(A-9F[l:ejhd<)m((r`]G0a#O"s#\*i7L!4$,-0G.*!FVOO
   5.104 +=k-Z,=+XM`<rlHgnc&g[PZ_'h=d8IV#4.OR<)HSVnc''aO%Mo16TQt@-9F[d9)_Nd
   5.105 +:f:3j<s2Z/s!ZLsrr>1Z!!&elrrVp3mt+Mj<.\)$<97'h;,gCg:ejb]:JOSU9M.qU
   5.106 +9En*Z8k_iI8,G[^3\hU#4$,hk5!M:tr^6ZR"%WC+5l:QaPYjPb^\e$4BUAaN7Y4+#
   5.107 +7Y3qK5ljABqEY0I4[&a+!BiRE4V9e>4?>M_3]B#W4$#,8-9F:Wr]U?I5PdVIs8Qc!
   5.108 +o)Ag43<0#15LhuM5(YtM54UlB4#8W3,rf7*p#lPYs7[r!o`#'_0\?@)K'7gMK'7gM
   5.109 +`omXq3[Pak3+#APkl1S`cR>.RrrTYX\,QDZk^r#Mk^r$<kQaL:-5n0i?VL.VrVlug
   5.110 +BK4W?rr_Fl8E]sOK'7gMK'7gM`omXq3[Pak3+#APkkkAea!`WkLVJn"5T$-js+9Hd
   5.111 +k^r#Mkf2fk6olY5,rf7*p#u5O#1%dD5]D4fq>^6R!!'dt!!%W7K'7gMPir??3[Pak
   5.112 +3+#AVkkkD_kQ'fHmcaQKr9+7`kQ'fHo&p&RroaC`kQ'c/!!)u]!!)lZ!!%W7K'7gM
   5.113 +Pir??3[Pak3+#AVkPtVZkPtVNkPtVXkPtV^kPtVRkPtV^kPtVDkPtV]kPtVZkPtU7
   5.114 +k^r#Mk`k996olY5,rf7*qre"[r9+7`kQ'i1rW)QR!!)o[r;Zo_!9jC^o]Q8TroaIb
   5.115 +kQ'i1rW!5fkQ'i1!9iVHo]Q8TrTF:_kii!G"6eqKkktL5k^r#MkaCW>6olY5,rf7*
   5.116 +qrmqX"m>sM!9aF^kPtVTkktJ_ki`$GkQCnL!9aFQkQ_+O!9iVHkQ(VG#QX&gki`$1
   5.117 +kQ(8=qZ$Z\!<20b!9aFH!<20^!.sEdk^r#ekQaL:-5n0i?VL@\!!)r\!s%NbkkkGQ
   5.118 +kPtV\kPtV^kQCnL!9aFQkQV%N!9iVHkkkDckQ'fHkQ'fHo]Q8TrTF7^kkkD_kQ'fH
   5.119 +roa=^K'7gMK'8Ze#=LU")C7@M9`+#R!;u$`!9aFH!:]1P!;u$\!<20b!9aFH!:f7X
   5.120 +!9aFHkQ'fHr9+=bkQ'fHkQ(8=!!)u]!W_Ear9+1^kQ(VG!!%W7K'7gMRcjuE3[Pak
   5.121 +3+#AVkPtV\kQCnL!9aF^kPtVTkPtV\kPtV^kQCnL!9aFPkPtV^kQ1bJ!<20a!9iVH
   5.122 +roa=^oB6/SrTF:_kQ(VG"9@WckQ(VG!!%W7K'7gMRcjuE3[Pak3F>JWkPtV\kQCnL
   5.123 +!9iYG!;#FP!!2<Ir;[#b!9iVH!:o=R!<20`!9iYG!<20^!<20^!;#CS!<)*_!9iYG
   5.124 +!!DHK!9j@]K'7gMK'8Wd#=LZu)C7CN9T\H<!.sEdk^r#akQaL<+rVaf?VL@\qZ,sG
   5.125 +qZ,mEqZ,aAq>g?T!!%W7K'7gMQKSQA4<b[i3F>I3k^r#Mk^r#nkQaL<+rVaf?VH(8
   5.126 +K'7gMK'8un#=LZu)C7CN9S2J[k^r#MkbI>H6p)Y3,ro=+K'7gMK'7gMUZ_qN4<b[i
   5.127 +3F>I3s+:9&s+:9Grs(qS+rVaf?VH(8K'7gMK'8un#=LZu)C7CN9S2J[kecQKs+9Hd
   5.128 +kkXEI6p)Y3,ro=+K'7gM_W^:bK'7gMq</&O4<b[i3F>I3k^r$8kj&2"k^r$okQaL<
   5.129 ++rVad?VH(8K':)8qYpWcT2>MP!_A[@qYu02K'<$o#=LZu)C7=L9S2J[kecQ\rr\#n
   5.130 +@'BRE"Li%]Gk_.9K'7gMq</&O4<b[i2d]71k^r$8kl(M`f/S$Lq>UMO0ZX.lK'7gM
   5.131 +q</&O4<b[i2d]71k^r$8kl1S`V_H0brrUe3L]7=*k^r$okQaL<+rVad?VH(8K':)8
   5.132 +"TSMb..?d-"$jX$s+9HdkkXEI6p)Y3,r]1)K'7gM_WV+%s%'Wirr_.,p]#j/K'<$o
   5.133 +#=LZu)C7=L9S2J[kecNbs.<]grrRt#s+9HdkkXEI6p)Y3,r]1)qWNOVK$MK`!rj,#
   5.134 +r;Qb=r?VGRqYpR=htcJfcAKmIchci16p)Y3,r]1)qre(+d":J5kfW)i^Hh_s#BTqG
   5.135 +4='t-A,H9,G_c.Z!RB&Dk_nX*dE_XQ#=LZu)C7=L9`4)Tcd7:-K':>?!IoUsrs)CI
   5.136 +PlLb\!'L/Y!OkVskQ0#VK'8'T!R]6kkQaL<+rVad?VLC]!7$2[K'3=#jPJYOg?R2h
   5.137 +@%[5o"2@\54T#-Za#Nt[!7$2[TBH@;hV7n\rmh#%"5DVfjSe9Bchuu36p)Y3,rT+(
   5.138 +r9+.+K'7gM"R+_#N_@VN!Ec8trs.\.,p`O;!'L/Y!T,$skQ&n[kb%&@hVaDeoe6J5
   5.139 +J)fPekQ&p+kQaL<,8qjd?VLC]!7$2[K'3@$gl?O$c2RfXQi-jg,lg&]b_6$Zqu6]3
   5.140 +5l9aFc@Y8PkQ9P"8+Y^A7ul[/kQ&p+kQaL<,8qjd?VLC]!7$2[K'3=#ge5i7rW.e!
   5.141 +rVm/I!%$e-s'l$kqu6]#;#BGVc@Y8PkRuZDd*P)*6-qpE6-qpE6-qpE9DmuRcMZl2
   5.142 +6p)\4,rT+(r9+.+K'7gM!pJAmrqt(=!QR1urs6gK!0mMY,lf7grrHN"qre%*K'8ij
   5.143 +"PYWV62^HR"4#4Hli$#IcMZl26p)\4,rT+(r9+.+K'7gM"6eMoqTSa:s!ZLtrs(Xd
   5.144 +!$qV-!%%RC!r!Q#qre%*K'8ij"5GTSc1Ul75KkhJrTF7,r9+AR4<kaj2IB/UkQ&n[
   5.145 +k^r""khIl8pB(B05lCWeF?F'Js+Q0urVlq4QiHsH!7$2[TBHC40Zc6HpB:34atW2\
   5.146 +kQ&p+kQaL<,8qjd?VLC]!7$2[K'3:"gb?qE"98C7Qh(.Ya#O,!qre%*K'8ij"5GTN
   5.147 +a7f0/oJFWCm/?,JcMZl26p)\4,rT+(r9+.+dHCT2!:/hL!!)3G!!&>KquHNU!<<,r
   5.148 +kQ(Y`lf\B)0['+ls8VgAht6pOmkEAns82![cFW3?!!(O4!<<,ikQ(Y`gZSY<!7L'5
   5.149 +gb?Z&rUp*hrq-Ed_o"1prTF7,r9+AR4<kaj2IB/UkQ&p&kkbA=kQ(Y`nE9lQ!<20_
   5.150 +!!)3G!!)o[qZ,O;!<<,ZkQ(Y`qWReVp#lPZ!9iVH!;Pa]!!)6H!!*#^!<<,ckQ9Nn
   5.151 +p%n:]!!*#j!!)BXquH?\rr3&G.$sZ-!k0Serr;lZ!7'KcqZ,gC!<<-!kQ(Y`l0/!E
   5.152 +o&p)S!:f7R!!)BLqZ-?R!<<,JkQBTo_86-C$ig;"oDem`o^aoU0^Sc%!7(N+#=L[!
   5.153 +)C7:K9`4)ScM6T(!!)u]!<<,GkQ(Y`j6-ICqWIq[!<20_!!(s@!<<,ZkQ(Y`qWIq[
   5.154 +!<20_!!)`V!<<,hkQ(Y`k3)m%0_P;7rW!#loDn:N!<<-!oDnplo^r+^"7Kn_fD>LL
   5.155 +k?pjDrVucY!7'Kc!<<-!kQ(Y`ki`$I!9E>E!!)HN!<<,RkQ(Y`roa@_!;G[X!!(I2
   5.156 +"5GTH2#d+U!!)Z`!!)Z`o>/6sm/?,JcMZl26p)\4,rT+(r9+.+puh_Y!<)*f!!)3_
   5.157 +!9aC_kihmDroj:\"R,%L!9jC^"R,%L!9j:[roj:\!U/bF!!MKc!9iYE!!MNL!!)6^
   5.158 +!;G[W!;bm[!!)u]!rr>bkkkD`ki`!Hkl(S\kktJdki`!HkPtVHqu?`\qu?`\rW)r]
   5.159 +qu?l`kPtVHrVuu_kkkGYkQ(Y`rTF=`!9iYE!!2<Ir;[&c!!)3_!9jC^"R,%L!9j=\
   5.160 +"R#gckihpE"R,%L!9jC^qWJ%:0_G#7oDJXko)SCRr;[/qo)Jd^!!)Tj!<)Ki!!*#i
   5.161 +#QOkr!!)TjoCMk[!;$*f$HFPKItte"Im=jCqu?QW!7'Kc!<<-!kQLqdki`!HroaLc
   5.162 +!9aC_kl(SXkkkD_kPtVHqu?`\rW)r]quHWX!<<,tkQ_(fki`!HkihsF#3b7N!9aC_
   5.163 +roaFa!9iYF!!VTM!!)6Hqu?l`kPtVHrW)iZ!<<-!kQLqdki`!HroaOd!9aC_kihpE
   5.164 +roj:\i919u0YP0so)Sgkrpp9`1qk[1rTF7,r9+AR4<kaj2IB/UkQ&p'kQ(Y`rTF:_
   5.165 +!9j=\!pBUaroaIb!9iVHroaC`!9jC^#3b7N!9aC_r9+7`!9iVHroaLc!9iVH!<20b
   5.166 +!!)3_!<20`!!)6^!!DHK!!)iY!!)iY!<<,ukQCkckPtV^kQ1_akl(Pdki`!Hki`$G
   5.167 +kQ1_akkkD_ki`!Hroaaj!9iVH!9iVH!9aC_roaC`!9jC^#O(@O!9iVH!;bm[!!)u]
   5.168 +"98Gc!!*#^$31(ikPtVHkPtVHrW!;hkPtVH!!)6H!!*#^"98Gc!!*#^!WW5arW!&a
   5.169 +kPtV[kQBTooCMkM!<D]h!"\W#!:o[\!:g*inc/[\!!)ug!<<-!ncAdko)/Onnc/[\
   5.170 +nc/[\q>UZFIs=4tJ%tgZqre%*hrk(@!<20c!!)6H!!*#^!WW5arW!&akPtVYkQ(Y`
   5.171 +roajm!9aC_ki`!Hki`!HkPtV^kQ(Y`r9+.]!;u$d!!)6H!!)3_!<20d!9aC_kPtV^
   5.172 +kQCkckPtV^kQV%N!!)3_!<20`!!)6^!!DHK!!)r\!<<-!kQLqdki`!HroaRe!9aC_
   5.173 +kPtV^kQCkckPtV^kPtVAkQBTo\ki7p!<<,unc\Ko\hNLLkQ&p+kQaL<,8qjd?VLC]
   5.174 +!7(B'!<<,ukQCkckPtV]kQ(Y`roa@_!;ks_!!)3_!<20b!!)3_!<)*^!!)lZ"TSPd
   5.175 +kPtV^kQCkckPtV^kQCkckPtV^kQ(Y`q<.eYq<.hZ!<)*a!!)3_!<20b!!)3_!<20_
   5.176 +!!)o["98Gc!!)r\!<<-!kR7Fkki`!Hki`!HkPtV^kQCkckPtV^kQLqdki`!HqWIq[
   5.177 +!<)*a!!)3_!<20j!!)6H!!)6H!!)3_!<20f!!)3_!9iVH!<20b!!)3_!<20b!!)3_
   5.178 +!<20_!!)o["5GU%oDA([!:o^[!!)Te!!r,q!:g*inc/[gnc8^jrpg0l!:g*irpg3m
   5.179 +!:o[\!;c6hna,?km/?,JcLg<#cJRj_!<20_!!*#^"98Gc!!*#^!WW5aqu?i_kPtV^
   5.180 +kRRXnkPtVHkPtVHkPtVH!!*#^!<<,tkkkG[kktJ`ki`!Hr9+7`!9aC_roaC`!9jC^
   5.181 +rTF@a!9aC_roaIb!9aC_roa@_!;u'X!<20_!!*#^#64bf!!)3_!<20`!!)6^!8coA
   5.182 +gb?=Nr:0jg!<)HknPHeNm/?,JcMZl26p)\4,rT+(r9+.+puh_Y!<)*a!!)3_!<)*^
   5.183 +!!*#^!rr>bkkb>]kPtV^kQCkckPtV^kQ(Y`rTO+Y"6eqK!<20b!!)3_!<20b!!)3_
   5.184 +!<20_!!)lZ!!)fX!<<,ukQ1_akkY8\kPtV^kQ:ebkihmD!pBUar9+.]!<20h!!)6H
   5.185 +!!)6H!!)6Z!!;?a!<20c!!)6H!!)lZ!<<,ukQ1_akkY8dki`!Hki`!HkPtV^kQh.g
   5.186 +kPtVHkPtV^kQCkckPtV^kQCkckPtV^kQ(Y`qre.;0_=o5nc/[hncSpmnc/[fo(`:a
   5.187 +nc8^jrpg0l!:g*irpg3m!:o[\!;c6hna,?km/?,JcLg<#cJRgg!!)3_!<)*^!!*#^
   5.188 +"98Gc!!*#^!<<,qkQ(Y`roadk!9aC_ki`!Hki`!HkkY;WkQ(Y`qWIq[!<20_!!)r\
   5.189 +"98Gc!!*#^!rr>bkktJcki`!HkPtV^kQCkckPtV^kQ(Y`r9+7`!9aC_rTF7^!<20c
   5.190 +!!)3_!9j7Z!U/bG!9!&Cgb?0>p@8@V\$e!WrTF7,r9+AR4<kaj2IB/UkQ&p'kQ(Y`
   5.191 +rTF@a!9aC_rTF7^!<20b!!)3_!<20b!!)3_!<20f!!)3_!9iVH!<)*^!!*#^"TSPd
   5.192 +kPtV^kQCkckPtV^kQCkckPtV^kQ(Y`qWInZpuh_Y!<)*a!!)3_!;ks\!!*#^"98Gc
   5.193 +!!*#^"98Gc!!)r\!<<-!kR7Fkki`!Hki`!HkPtV[kQ(Y`roaLc!9iVH!;bm[!!)u]
   5.194 +"98Gc!!)lZ#QOkgkPtVH!!*#^#QOkg!!)6H!!*#^"98Gc!!*#^"98Gc!!*#^!<<,s
   5.195 +kQBToo()\J!!)uf!s%ik!;l9i!!)QZ!!)re!<<-!nH8glnGiRgnHAmmnaQSZqXF^X
   5.196 +lf9bdrTF7,o]Q;#hrk4D!9iVH!<20_!!*#^"98Gc!!*#^!<<,qkQ(Y`roajm!9aC_
   5.197 +ki`!Hki`!HkPtVWkQ(Y`qrmtY"6eqK!;u$`!!)3_!<20_!!)u]rW!,c!!)3_!<20b
   5.198 +!!)3_!<20_!!)r\"TSPdkPtV^kQ(Y`roaRe!9aC_kPtVXkl(S@kQBToZa9T"!<<,u
   5.199 +nHA>`ZS:bEkQ&p+kQaL<,8qjd?VLC]!7(B'!<<,ukQCkckPtV]kQ:ebkii!G!pBUa
   5.200 +roaIb!9aC_roaRe!9aC_kPtV\kQ(Y`roaLc!9iVH!<20b!!)3_!<20b!!)3_!<20_
   5.201 +!!)o[!!)cW!<<-!kQLqdki`!HrTF=`kPtV^kQCkckPtV^kQCkckPtV\kQ(Y`roaaj
   5.202 +!9iVH!9iVH!9aC_rTF=`kPtV^kQLqdki`!HqWIq[!<20c!!)6H!!)u]$NTDS!!)6H
   5.203 +!!)3_!<20f!!)3_!9iVH!<20b!!)3_!<20b!!)3_!<20_!!)o["5GU$o)%qW!<)Eh
   5.204 +!:fUW!!i&a!!)QZ!!)odqu?ihnGiRfnb`C`nHA@Ij=os!kQ&p#kQ&ockQ(Y`roaRe
   5.205 +!9iVH!9iYG!!;?a!<20_!!)iY!<<-!kRRXnkPtVHkPtVHkPtVH!!)u]!!)r\!<<,t
   5.206 +kQh.gki`!HkPtV^kQh1P!!)3_!9iYG!!29`roaRe!9aC_kPtV^kQCkckPtV^kQ(Y`
   5.207 +r9+.]!<20e!!)6H!!)6HrW!,c!!)3_!<)*_!9aF^kQ(Y`iTLC!0XFjYnGrUirUC$[
   5.208 +['MIQrTF7,r9+AR4<kaj2IB/UkQ&p&kkb>^ki`!Hr94+["R#gckihmD!pBUaroaLc
   5.209 +!9aC_kkb>\kihmDroj=]"R#gckihpE"6eqK!<20_!!)o[!!)cWqZ-TYqu?c]kkbAZ
   5.210 +kkb>]kPtV[kl(PjkPtVHkPtVHkPtVHkkkD_ki`!Hroa@_!<23]!;u'X!<)-Z!<20f
   5.211 +!!)6H!!)3_!<20b!!)3_!<23]!!MKc!9iYE!!DHK!!*#^!<<,skQBTonaXuq!<<,r
   5.212 +n-&4Fj"TiukQ&p#kQ&ockQ(Y`rTF=`!9iYG!!VQd!9aC_roa@_!;PdW!"\8n!9aC_
   5.213 +ki`!Hki`!HkihpEqrmnW#j;6gki`!HkihsF"mG.M!9iYG!!MKc!9iYF!!VTM!!)6H
   5.214 +qu?i_kPtV^kQ(Y`r9+.]!<)*`!!)6HrW!2e!!)3_!9iYE!<23\!9!&Cgb>t9p@&4R
   5.215 +@'D?OrTF7,r9+AR4<kaj2IB/UkQ&ohkQ(Y`_<:k!jlc^F!.sD<kigeUnaY)tr;cZ_
   5.216 +"RkX90^Sc%!7(6#!7$2[TBHC40WeaVn-&3^XYB,?kQ&p+kQaL<,8qjd?VLC]!7'im
   5.217 +!!)u]!<<,9kPtVEkQ(Y`K'3C%khIl]nAju#mci^bm/?,JcLg<#c@Y8PkQBToX/bm^
   5.218 +"R]!a0^Sc%!7(N+#=L[!)C7:K9`4)ScKOKi!2J`Y!!%W7"6et(0ZEJ`mH<F^mJZ5K
   5.219 +cLg<#c@Y8PkQBToW(m!S"RW.f0^\i&!7(N+#=L[!)C7:K9`4)Sc@Y83kQ9u'0ZE;[
   5.220 +kMb2MmJZ5KcLg<#c@Y8PkQBToW2TFT"QrLX0^\i&!7(N+#=L[!)C7:K9`4)Sc@Y83
   5.221 +kQ^8,5fDO8h9+RXh:pPm5k"[8!7(6#!7$2[TBHsE5c@DU9rLdb9rLdb9rLdbW'KhM
   5.222 +kQ&p+kQaL<,8qjd?VLC]!7$2[K'3@$hgT:?a3Xt8[:Y'_rTF7,o]Q;#K'8ij"5ePt
   5.223 +G4^Lj7t^F3kQ&p+kQaL<,8qjd?VLC]!7$2[K'3@$jQM_!`\7K[K_"d6kQ&p#kQ&n[
   5.224 +kb%&@jQM_!oe6J5K_"d6kQ&p+kQaL<,8qje?VLC]!7$2[K'3C%kj7g1o]>c.q#9pg
   5.225 +p@e1FrTF7,o]Q;#K'8fi"75OKo_eC]q#9pgp@e1FrTF7,r9+AR4<b[i2d]8VkQ&n[
   5.226 +k^r$/kQ&p#kQ&n[k_J@%cMZl26p)Y3,r]1)r9+.+K'7gM\`a%>o]Q;#K'8!R!71T,
   5.227 +#=LZu)C7=L9`4)Tcd7:-K'9i1!R]6ckQ0#VK'8'T!R]6kkQaL<+rVad?VL@\!RB&D
   5.228 +k^r$3kQ0)Vo&p,"d":J>kQ0)Vqre8Q4<b[i2d]8Tk^q*3cFhF&cg^.McAKmIchci1
   5.229 +6p)Y3,r]1)K'7gMK'7gMUZ_qN4<b[i2d]71k^r#Mk^r#nkQaL<+rVad?VH(8K'7gM
   5.230 +K'8un#=LZu)C7=L9S2J[k^r#MkbI>H6p)Y3,r]1)K'7gMK'7gMUZ_qN4<b[i2d]71
   5.231 +k^r#Mk^r#nkQaL<+rVac?VH(8K'7gMK'8un#=L[!)C7:K9S2J[k^r#MkbI>H6p)\4
   5.232 +,rT+(K'7gMK'7gMUZ_qN4<kaj2IB.0k^r#Mk^r#nkQaL<,8qjd?VLC]JsV(U\!M^1
   5.233 +K';dh#=L[!)C7:K9`4)SQ\,6hs1/.0Q\+FQkjmpB6p)\4,rT+(r9+-IqYpd!q!ctH
   5.234 +aRk)aK)`mk!1/<$K';dh#=L[!)C7:K9`4)SQi$dhrpAIln&MTRnc".?K)`sm!1/<$
   5.235 +K';dh#=L[!)C7:K9`4)SQi$diq;BrLnB%i@b3o7\s+:9nrrAC;k^r$hkQaL<,8qjd
   5.236 +?VLC]!13T_$N8oDeaLP]Zan``K)^H&b5VI.K'7gMo&p<H4<kaj2IB/UkQ$tGrsI]G
   5.237 +g[N._ZEqEgon*3qs3(EBQ\+FQkjmpB6p)\4,rT+(r9+-IqYpu_oC)=l\&-G3ZHhq;
   5.238 +qZ$Npp\t6o!.t6&s5X+ZQ\+FQkjmpB6p)\4,r]1)r9+-Iqu7-!iVNEEd`KAF`Nutt
   5.239 +meZt_!.t6&s4@8NQ\+FQkjmpB6p)Y3,r]1)r9+-IrVmE%mHEL)qXi"OZEq3NZa\'R
   5.240 +rt,52rr<'!rr<'!rr<'!!!*'!r;_HLK)b*8!1/<$K';dh#=LZu)C7=L9`4)SQi6pp
   5.241 +gX4<rqYK`q\uiHR[Bm3Cqu79/!<3$!s8N'!s8N'!rr<'!!!%WNK)b!5!1/<$K';dh
   5.242 +#=LZu)C7=L9`4)SQi6pp^q7(lqYK]l[^3NS['R*Lqu6d!!<3$!rr;os"TSK%!<;ut
   5.243 +K)^H&kl1XLmHB/IPg09Tp#lWK4<b[i2d]8VkQ$tJrt!#Q[Cc%umC0F2]!o#PZ-<.G
   5.244 +q>^Qrs8;p$s8N'!s8W#tK)^H&l2LaMmcX\sd":JHkQ0)Vp?2`L4<b[i2d]8VkQ$tJ
   5.245 +rt!J_ZF/9"k-qY#Wi3),ZJGHY!<<-!rrE*"rr3!!!<3!!!!)ut!<<+Os+::8rrADS
   5.246 +kQ0#VK'8E^!R]6fkQaL<+rVad?VLC]!13Za&)=Cp['5AA^:^:pI$U\@kPY>\!!*#u
   5.247 +!<<-!rrE*"rr3$"!<;utK)^H&kl1XLn)sbsrTF=DhV7,FkLKRc"5DVfjS\4pQi-(-
   5.248 +VZ?bqkQ&s'kQaL<+rVad?VLC]!13Za&(I\m^nl51guG2R?YG(pl%8qes3:QDQga,<
   5.249 +cMcr/hVaDea=m]]J)fPdkQ$s(rrAD`kQ%OBD?92*rTF7,pZMiM4<b[i2d]8VkQ$tJ
   5.250 +rstZuh;PV\htlr+F]`<fG0Y^>K)a*q!130<!7(Q,"5JoZbfKedgi\Y<r9+-ILAq7?
   5.251 +r9+0ZDWh$$aR9*,kQ&p&kQaL<+rVad?VLC]!13Za%t:M;m^%,eoA,I;:L.7+Y(H\*
   5.252 +s3:QDQga,<cMcr.ge5i2rW<&@9DdoQQ\PM?Qi-%JVf(_u"3AROs8D-]cM-N-6p)Y3
   5.253 +,r]1)r9+-IrVmD#HZYIGDm$9m?"&/%M2fu9s+:9qrrADSkQ&p,kQ0Elrqsn8"8_XD
   5.254 +lhorHQeDB=!3cD&Qi-%LVf)P7lKA>kaR9*,kQ&p&kQaL<+rVad?VLC]!1/<;K)`C]
   5.255 +!130<!7(Q,!o,L+a8#i0mP+#*kQ$tIs8;rbs8;rorr<&&rrAD`kQ@`#s8VBJ"3ARO
   5.256 +s8D-]cM-N-6p)\4,r]1)r9+-IqYpd!q!ctHaRk)aK)`mk!130<!7(Q,!SfBLpB:3[
   5.257 +l7hT&kQ$tJrr<&arr<&mrr<&&rrAD`kQ@`#s8VBJ"3AROs8D-]cM-N-6p)\4,r]1)
   5.258 +r9+-Iqu7!%mG$7]a0*STrdt0%s2k9@Qga,<cMcr-gb@@Q!<<,to`5$mqXk!`n)uIl
   5.259 +r9+-Irr2ruqZ$Nprr;rt!WW3!!!<3#!;c`p!!N?%!<<)u!4;b+Qi-%LVf)P7roj=\
   5.260 +#NUn=/MTtVhu3TRkQAoImf37L!7(?&#=L[!)C7=L9`4)SQi$diq;BrLnB%i@b3o7\
   5.261 +s+:9nrrADSkQ&p,kQ0HmiV!0MqXjjh!;uKj!!)lg"SD0H0^S`$!13]b!!)or!!*#u
   5.262 +!W`6#q>UKrrrDrr!!*#u!W`6#r;Q`s[Jp5nr9+6\DZBb9kR[^nqN!6aDO6T53%9UX
   5.263 +s8W&]"3AROs8D-]cM-N-6p)\4,r]1)r9+-Iqu7$%i8iGWa0)bZf_C'uK)a!n!130<
   5.264 +!7(Q,!o,L&n+6V\!;?'a!;c<g!!)rh!<<,roE=dRk:l9#kQ$tKrr<&rrr<&urrN3#
   5.265 +!;ulq!!3*"qu6Wrrr3*$rrE*!r;a8*!13WI"/g&:s8M3cs8?a^K(Am?"o4W@?Ma^#
   5.266 +kQAoImf37L!7(?&#=L[!)C7=L9`4)SQhp^hi8r__`2p8N_T2>$s+:9orrADSkQ&p,
   5.267 +kQBToo^qSC!<<,qo)o$no)JdioDARhoCMk[qXXj\mH-+hr9+-Irr2ruqu6Wrrr3$"
   5.268 +rrE#t!!*#u!W`6#qu6Wrrr3*$rrE'!rr2ru[Jp5nr9+6\DZBb9kQLpF-S)_'rr^4p
   5.269 +JcG]4"3AROs8D-]cM-N-6p)\4,r]1)r9+-IqYpu_oC)=l\&-G3ZHhq;r;Qct!<3!!
   5.270 +!!)Zk!<<+Os+::7rrADSkQ&p,kQBTooCM>>!<<,sne2!'nc/[\nc/[\nc/[\!!)T\
   5.271 +!!)ld"S(j?0^S`$!13Za!!)rs!!*#u!W`6#rVlitrr3'#s8N)srr<&urr`?%!<3&u
   5.272 +rr<&,rrAD`kQ@`#s8W)^"l_(c9e<aLrrT,Je,AJ4aN3fLrTF7,pZMiM4<kaj2d]8V
   5.273 +kQ$tHrse\\qYKp6ahl$9ZaJ*Hr;Qct!<3!!!!)Zk!<<+Os+::7rrADSkQ&p,kQBTo
   5.274 +oCMkMr;Zigr;cZa!!)rf'*&%'!!)T\!!)T\!!)Qi!:o[\!;c6hna,?km/6&IQi-m^
   5.275 +!!3-"rW)rtrW!!!s8;rss8;ous8W&u"TSK%s8W#t[Jp5nr9+6\DZBb9kQZl!o^5L*
   5.276 +[/9k)rC225kQAoImf37L!7(?&#=L[!)C7=L9`4)SQi6ppp?h)%qYKj.`j2q`['R6`
   5.277 +r;Qct!<3!#!!*'!r;['%rr<'!!<;ut!<;rsK)^H&nG`KTn)sbsrTF@=0_4f$nGrUi
   5.278 +r:0U`%IjDunaQSZnGiRZnGiRcnHA@Ij=orukQ$s(rrAD`kQ@`#s8W)^#?>F:s6ic7
   5.279 +Zhsb'K0]D!"3AROs8D-]cM-N-6p)\4,r]1)r9+-IrVmD_dE^8<qXM81XgbpMZa6k5
   5.280 +s7u^#rr<'!rr<'!r;Zp!!!)or!<<+Os+::?rrADSkQ&p,kQBTonaZ&:!<<,rn,WLh
   5.281 +rpUEu!:TsgnF-DXn,NIXn,NIbn-&4Fj"TitkQ$s(rrAD`kQ@`#s8W)^!A]E/rr_^e
   5.282 +/$]$P!Mq=FkQAoImf37L!7(?&#=L[!)C7=L9`4)SQi6pp^q7(lqYK]l[^3NS['R*L
   5.283 +r;Qct!<3!"!!*&r!!<0#!<3!!!!)rs!<<+Os+::>rrADSkQ&p,kQBTonaZ,<!<<,p
   5.284 +n,WLhrpU!i!:]LU!!2TYquHT_"RkX90^S`$!1/H?!13WI"/g&:s8M3_0S03&"7T2<
   5.285 +YPnJ%UFQ6+"3AROs8D-]cM-N-6p)\4,r]1)r9+-IrVmDGZF.=9md7Ki\%9&TZa%aP
   5.286 +rrE*"rr3*$!<3$!r;Qct!<3!!!!)ut!<<+Os+::=rrADSkQ&p,kQBTonF4Qg"RbO6
   5.287 +0^S`$!1/H?!13WI"/g&:s8M3_94e&$"7T8>Y5\G%LHb\#"3AROs8D-]cM-N-6p)\4
   5.288 +,r]1)r9+-IrVmDTZa.!i_</54Yc=Y)Za/EbrrE*"rr3*$!<3$!r;Qct!<3!!!!*#u
   5.289 +!<<+Os+::<rrADSkQ&p,kQ0Hma6s/ukM\,^r9+-ILAq7?r9+6\DZBb9kQ6Mon,31j
   5.290 +nPq'?s8>K3rTF@)aR9*,kQ&p&kQaL<,8qje?VLC]!13Za&)=Cp['5AA^:^:pI$U\@
   5.291 +kPY>\!!*#u!rr?$s82iurr<&ts8Duus82kKs+::?rrADSkQ&p,kQ0Hma6EfjiS6-S
   5.292 +r9+-Irr;osmf*7err;osW;cjar9+6\DZBb9kQ9KgLAUuTnl@3>V^TaekQAoImf37L
   5.293 +!7(?&#=L[!)C7=L9`4)SQi6ppe?$9tV0:\Mj.pj*BS3JPK)^H&c2Rd1n)sbsrTFF@
   5.294 +5fDO8h9=^Zh:pPm5k"X7!13]b!!*#u!!)Bc!!&hp!13WI"/g&:s8M3as+)].qu6ik
   5.295 +=",kGs8D-`aN3fLrTF7,pZMiM4<kaj2d]8VkQ$tJrstZuh;PV\htlr+F]`<fG0Y^>
   5.296 +K)a*q!130<!7(Q,"5eQAX3&]kca@A;oDIePQi@!b!<3!"!<<)u!!3-"r;cisrW!'#
   5.297 +!<3&qs8E##rrAD`kQ@`#s8W)^"onF).ZjK)rrr7\-WBd>rTF@)aR9*,kQ&p&kQaL<
   5.298 +,8qje?VLC]!13Za%t:M;m^%,eoA,I;:L.7+Y(H\*s3:QDQga,<cMcr/jQM_!a=m]]
   5.299 +K_"d5kQ$tKrr<&urrN3#!<3!"!<3&urrN3#!<)p!!<3&rrr<&urr<&%rrAD`kQ@`#
   5.300 +s8W)^&-)\'I474"PEU5R.!G7_s8D-`aN3fLrTF7,pZMiM4<kaj2d]8VkQ$tJrst`K
   5.301 +FH`G;Y-3:[@=<0QNRNLZK)a*q!130<!7(N+"75OKo]Gi0q#9pgp@e1Fr9+-Irr;os
   5.302 +!WW2t!!3*"rr3'#rr<&urrN3#!;lcr!<2uu!3Z>%Qi-%LVf)P7roj=\#Ln2d.k3`*
   5.303 +d/F"CkQAoImf37L!7(?&#=L[!)C7=L9`4)SQ\,6hs1/.0Qga,<cF<!;Qi@!b!;uis
   5.304 +!;uis!<2uu!<3!%!!*$!rrDrr!!*#u!!'2%!13WI"/g&:s6AeMaN3fLrTF7,pZMiM
   5.305 +4<kaj2d]8VkQ$tGrs&JtnCb=moRd*ps2Y->Qga,<cF<!;Qi@!b!;uis!<3!"!<3&u
   5.306 +rr<&trriE&!<<'!r;Q`srr2ruY5\Kgr9+6\DZBb%kQAoImf37L!7(?&#=L[!)C7=L
   5.307 +9`4)SQi$dhrpAIln&MTRnc".?K)`sm!130<!7&(;!13]b!!)orrW!!!s8;ous8W&u
   5.308 +!rr9#rr;os!WW3!!3Q8$Qi-%LVf)P7lKA>kaR9*,kQ&p&kQaL<,8qje?VLC]!13T_
   5.309 +$MiW5bOEWV[E@q:K)^H&b5VI.n)sbs\**gYo)A[iQN$rOr9+3[DZAn@!Ug!dkQ&p&
   5.310 +kQaL<,8qje?VLC]!13T_$N8oDeaLP]Zan``K)^H&b5VI.n)sbs\**gYo)A[iQN$rO
   5.311 +r9+0ZDW]"@mf37L!7(?&#=L[!)C7=L9`4)SQhp^hi8r__`2p8N_T2>srrE*"K)^H&
   5.312 +rVlkan)sbsrTF=DhV7,FkLKRc"5DVfjS\3AQ\PM?Qi-%IVr[7Gs8D-]cM-N-6p)\4
   5.313 +,r]1)r9+-IqYpu_oC)=l\&-G3ZHhq;qu?Qoli6k_q>UHq!.t6&s8DrtQga,<cMcr/
   5.314 +hVaDea=m]]J)fPdkQ$s(rrAD`ki2X@kQ&p&kQaL<,8qje?VLC]!13T_%JJcWqY&@Z
   5.315 +_SsL#[Ee4<rrE*"kl1Y`!;6?m!!%WNK)bfL!130<!7(Q,"5JoZbfKedgi\Y<r9+-I
   5.316 +LAq7?g#rF]pZMiM4<kaj2d]8VkQ$tJrt"hjkhu=6oZY=\Zb3ZO\&nRJ!<<,ss8;rs
   5.317 +s8;ous8W#t"98B$!;lfp!!WE&!!*'!r;_HLK`;%=n)sbsrTF=<9?YBT!r^87qre$H
   5.318 +LAq7?g#rF]pZMiM4<kaj2d]8VkQ$tJrt!l3cID^en\)N9\%B&SZ`j<,!<<,trs/T)
   5.319 +s8N'!rr<&prr`<%rr<&srs/T)s8N'!rr<&srrE*"K)^Q)!130<!7(Q,!S]=-r5ng<
   5.320 +qXcK-r9+-ILAq7?g#rF]pZMiM4<kaj2d]8VkQ$tJrsuoW\&%q;n@?!6\[]#QZap#6
   5.321 +!<<,trs/T)s8N'!rr<&ss82iurr<&srsA`+s8N'!rr<'!s82kKs+UIQQga,<cMcr.
   5.322 +gbATFq#g9W0^S`$!1/H?!12C&!7(?&#=L[!)C7=L9`4)SQi6pp_m6\^oBu"TZa[NT
   5.323 +Za6p\r;Qct!;uj&!!*'!!!*$!!<)p'!!*'!!!*$!!;uj-!!*'!!!*$!!<3$!s8N'!
   5.324 +K)^Q)!130<!7(Q,!SfBLpB:3[l7hT&kQ$s(rrAD=kQ&p&kQaL<,8qje?VLC]!13Za
   5.325 +&(%Yg[FW1V\$E6<W33J4h>I9R!!)rs#QOl)rr<'!!!)ut#QOl)rr<'!!!)rs%fcV0
   5.326 +rr<'!!!*$!!<<'!!.t6)rrADSkQ&p,kQ0Hmde*V@!;Q3io^Cutm/6&IQ\PM?QeCR&
   5.327 +cM-N-6p)\4,r]1)r9+-IrVmD`Yd1X?Lto_WV1X/]Vn)!fs82its8W#trr;os!WW2t
   5.328 +!!3-"qu?cts8;p$s8N'!s8VusK)^Q)!130<!7(Q,!SfBfp&"gao`5$mq"4d^n)uIl
   5.329 +r9+-ILAq7?g#rF]pZMiM4<kaj2d]8VkQ$tJrt!V\]>17dh;%%dG$ep8Y3CQ<K)a*q
   5.330 +!130<!7(Q,!o,L&o(2q_!;#gd!!)Z`!!)fd!<<,poE=dRk:l9#kQ$s(rrAD=kQ&p&
   5.331 +kQaL<,8qje?VLC]!13Za&"TWSiN[L^qX]ek=D25gc@Z(Js3:QDQga,<cMcr/gbABm
   5.332 +p%&1a!:fX]!!*#i!rr>moDJXkoCDq^q""XZmH-+hr9+-ILAq7?g#rF]pZMiM4<kaj
   5.333 +2d]8VkQ$tJrssRXipO-seFVLW@o$B9<N^rRK)a*q!130<!7(Q,"5GU%oCqeV!!)KY
   5.334 +!<<-!nd>Etnc/[\nc/[\!!)fb"S(j?0^S`$!1/H?!12C&!7(?&#=L[!)C7=L9`4)S
   5.335 +Qi6ppT6k[DU2R3<IU-B1Ef#e)K)^H&c2Rd1n)sbsrTF@=0_=o2nc/[do)/Ogo)/Re
   5.336 +nc8^jrpg*j!:p!e!qH<kq!nRXm,]qfr9+-ILAq7?g#rF]pZMiM4<kaj2d]8VkQ$s$
   5.337 +s+:9]rrADSkQ&p,kQBToo()PF!<<,gnGrUirp^*k!:^$hr:'df!;Q'enE]-hm/6&I
   5.338 +Q\PM?QeCR&cM-N-6p)\4,r]1)r9+-IlMh!p:/=PBK)^H&ec,W9n)sbsrTF@=0_+]+
   5.339 +n,WLhnaHhb!:]IX!:]IX!;u<e!!)f`"RkX90^S`$!1/H?!12C&!7(?&#=L[!)C7=L
   5.340 +9`4)SQg4SR/2K(23.h0^s4.,LQga,<cMcr/gbA9goC)b\!;#^X!<)Eb!!;Wi!;Q$d
   5.341 +n*8pem/6&IQ\PM?QeCR&cM-N-6p)\4,r]1)r9+-IlMh,A2)Qj=Mi*CJK)^H&g&D&=
   5.342 +n)sbsrTF@=0_"SRmf`(Ci\9`skQ$s(rrAD=kQ&p&kQaL<,8qje?VLC]!13!N%kTXr
   5.343 +.:.^^F)(aTpo('eUk8Vus5<nWQga,<cMcr-gb?e;"RYC20^\f%!1/H?!12C&!7(?&
   5.344 +#=L[!)C7=L9`4)SQg4S]/N#C5Kp%U<C]FBg^qd:0K)^H&i;WeDn)sbsrTF:;0ZWG]
   5.345 +kMb2MmJQ/JQ\PM?QeCR&cM-N-6p)\4,r]1)r9+-IlMhAH2)Qb8P*0d"s7a@ij0=XB
   5.346 +s8E#prr<&_rr<%Ns,6mWQga,<cMcr1h*Ap8h;-<3"l7qb\j5`^kQ$s(rrAD=kQ&p&
   5.347 +kQaL<,8qje?VLC]!13!N%kTXr-\[_HE,5LJ_;jR\Nr/hV!;ZWp!9jF_!.t6/rrADS
   5.348 +kQ&p,kQB^kBrfA&"OFJfKCf$)!1/H?!12C&!7(?&#=L[!)C7=L9`4)SQg4S]/N#C5
   5.349 +Kp%U<C]F.Fj5[D)qu6]ts8W#t!WW3!!!WB&rrE*!rW!!!s8;rss8E!!s8W&uK)^i1
   5.350 +!130<!7(Q,"6A[.9?8dh5_S_#r9+-ILAq7?g#rF]pZMiM4<kaj2d]8VkQ$t7rsp\=
   5.351 +2(+*@P&OiVGJW>"Z&\_]!s&B$!<3!"!<3&urrE*"qu6]trrE&u!W`6#rr3$"rr@ZN
   5.352 +MuNdDn)sbsr9+7LnFQ;7p#l,Lo`Op]p$;P>!1/H?!12C&!7(?&#=L[!)C7=L9`4)S
   5.353 +Qg4S]/N#C5Kp%U*A7oGjj5[D)qu6`us8N)urrN3#!<2uu!<)rr!!3*"rr3!!s82it
   5.354 +rr@ZNMuNdDn)sbs\**gYLAq7?g#rF]pZMiM4<kaj2d]8VkQ$t7rsp\=2(+*@P%ncJ
   5.355 +B>W]hZ&\_]!s&B$!<3!"!<3&urr<&urr<&urrN3#!<3!"!<3&srr<%Ns,6mWQga,<
   5.356 +cF<!;Q\PM?QeCR&cM-N-6p)\4,r]1)r9+-IlMhAH2)Qb8P*0QqCM1NEj0=XArrW9$
   5.357 +rrE&u!W`6#rr2rurr2rurr3$"rrE&u!W`6#rr3$"rr@ZNMuNdDn)sbs\**gYLAq7?
   5.358 +g#rF]pZMiM4<kaj2d]8VkQ$t7rsp\=2(+*@P%ncJB>W]hZ&\b^rW!!!!<3!&!<<'!
   5.359 +!<3&ts8;ourrE&u!W`9#rW)rt!<<+Os,I$YQga,<cF<!;Q\PM?QeCR&cM-N-6p)\4
   5.360 +,r]1)r9+-IlMhAH2)Qb8P*0QqCM1NEj0=Vrs+::/rrADSkQ&o;kQ$s(rrAD=kQ&p&
   5.361 +kQaL<,8qje?VLC]!13!N%kTXr-\[_HC27Tt_W0[]Ne7:_s5<nWQga,<cF<!;Q\PM?
   5.362 +QeCR&cM-N-6p)\4,r]1)r9+-IlMhAH2)Qb8P*0QqCM1NEj0=Jns+::/rrADSkQ&o;
   5.363 +kQ$s(rrAD=kQ&p&kQaL<,8qje?VLC]!13!N%nfYm:ipu.AnPafOe88&m"57hs5<nW
   5.364 +Qga,<cF<!;Q\PM?QeCR&cM-N-6p)\4,r]1)r9+-IK)^H&\c2Yrn)sbs\**gYLAq7?
   5.365 +g#rF]pZMiM4<kaj2d]8VkQ$t7rrf`):J<_=s3Tt]s-<TaQga,<cF<!;Q\PM?QeCR&
   5.366 +cM-N-6p)\4,r]1)r9+-IlMgu<1G^I>oDd2$K)_,9!130<!7&(;!1/H?!12C&!7(?&
   5.367 +#=L[!)C7=L9`4)SQg4SV/N#C815h$IM"gqrk^ri"rrADSkQ&o;k_,;UkQ&p&kQaL<
   5.368 +,8qje?VLC]!13!N%kTXr.:.^^F)(aTpo('eV#LD@k^ri"rrADSkQ&n[k`P'/cM-N-
   5.369 +6p)\4,r]1)r9+-IlMhAH2)Qb8P*0d"s8Ibg^pA^ns3Tt]s-<TaQga,<c@Y8BkQ&s'
   5.370 +kQaL<,8qje?VLC]!13!N%kTXr-\[_HE,5LJ_;jR\NrK%ZkihpEqWInZki`!Hq<3G1
   5.371 +Q2^iNn)seud":JFkQ0)WpZMiM4<kaj2d]8VkQ$t7rsp\=2(+*@P&P4:pVGnMZ&\h`
   5.372 +!pJhJp?2JVki`!Hq<3G1Q2^iNmcX\sd":JHkQ0)Vp?2`L4<kaj2d]8VkQ$t7rsp\=
   5.373 +2(+*@P&P4:pVGnMZ&\h`!pJhJr9++\roa@_kl(PckQ'fHkii!G!U/bG!<23]!!2<I
   5.374 +rW)iZK)_,9!13*:K$KV+!71?%#=L[!)C7=L9`4)SQg4S]/N#C5Kp%U<@=*47j5[D)
   5.375 +rr3#_kktM\kQLtM!9iVHroa@_!;ks]!9aF^kQ1bJ!<20`!9aFYk^ri"rrAC;k^r$h
   5.376 +kQaL<,8qje?VLC]!13!N%kTXr-\[_H?=[\Z_rKd^NrK%[ki`$CkPtV^kPtV^kPtV]
   5.377 +kktJ^kQ(VG!<D?]!!29`q<3G1Q2^iNK'7gMo&p<H4<kaj2d]8VkQ$t7rsp\=2(+*@
   5.378 +P%ncJB>W]hZ&\h`!pJhJqWInZroa=^roa=^roa=^roaC`kQ(VG!W_Ear9++\q<3G1
   5.379 +Q2^iNK'7gMo&p<H4<kaj2d]8VkQ$t7rsp\=2(+*@P%ncJB>W]hZ&\h`!pJhJqre1`
   5.380 +kQ'i1!<20^!<20^!<20`!9aF^kQ1bJ!<20`!9aFYk^ri"rrAC;k^r$hkQaL<,8qje
   5.381 +?VLC]!13!N%kTXr-\[_HC27Tt_W0[]NrK%ZkihpE!U'O_kQV%NkPtVH!<)-[!!29`
   5.382 +roaC`kii!Groa@_!;ku3s-<TaQ\+FQkjmpB6p)\4,r]1)r9+-IlMhAH2)Qb8P*0Qq
   5.383 +CM1NEj0=XDs3Tt]s-<TaQ\+FQkjmpB6p)\4,r]1)r9+-IlMhAH2)Qb8P*0QqCM1NE
   5.384 +j0=XDs3Tt]s-<TaQ\+FQkjmpB6p)\4,r]1)r9+-IlMhAH2)Qb8P*0QqCM1NEj0=L@
   5.385 +s3Tt]s-<TaQ\+FQkjmpB6p)\4,r]1)r9+-IlMhAf:/4W-H$O"7B4[3tT8Dq6s3Tt]
   5.386 +s-<TaQ\+FQkjmpB6p)\4,r]1)r9+-IfDj4]K)_,9!1/<$K';dh#=L[!)C7=L9`4)S
   5.387 +Qg4SR[8'Lk2hM']s4.,LQ\+FQkjmpB6p)\4,r]1)r9+-IlMgu<1G^I>K)^H&ec,W9
   5.388 +K'7gMo&p<H4<kaj2d]8VkQ$t7rs1262(CA>MMd4As+::(rrAC;k^r$hkQaL<,8qje
   5.389 +?VLC]!13!N%kTXr.:.^^F)(aTpo('eUk8Vus5<nWQ\+FQkjmpB6p)\4,r]1)r9+-I
   5.390 +lMhAH2)Qb8P*0d"s8Ibg^pA]Gs+::/rrAC;k^r$hkQaL<,8qje?VLC]!13!N%kTXr
   5.391 +-\[_HE,5LJ_;jR\Nr8nW!<)ot!9X=[!.t6/rrAC;k^r$hkQaL<,8qje?VLC]!13!N
   5.392 +%kTXr-\[_HE,5LJ_;jR\Nr8nW!<)ot!9X:]!<2uu!.t60rrADQk^q*Ec2c2`kQaL<
   5.393 +,8qje?VLC]!13!N%kTXr-\[_HE,5LJ_;jR\Nr8nW!<)p!!<3&urrE-"rW!$"!!*#u
   5.394 +rW!!!s8;p!s8N)urr<&us8E#ts8E!!s8W&u!rr9#rr30&rrE'!s8W&u!WW3!!<3#t
   5.395 +!.t6\rrADRkQ/uUK'8K`!R]3dkQaL<,8qje?VLC]!13!N%kTXr-\[_HE++*;_;jR\
   5.396 +Nr8qS!!3*"rr36(rrE*!!<<'!r;QfurrE&u!W`6#rr3'#s8N)urrN3#!<)ot!<3!"
   5.397 +!<3&urrrK'!!*'!!<)ot!<3!"!<3%Ns0_k,Qga,=cd7:-PNW%pchHW.6p)\4,r]1)
   5.398 +r9+-IlMhAH2)Qb8P*0-^B4Sp?j0=XBrr<&trrN3#!<3!*!<3'!rrE*!!<<)t!!3*"
   5.399 +rr3!!s8;rss82iurr<&urr<&urrN3#!<3!"!<3&urr<&ts82iurr<%Ns0hq-Qga,<
   5.400 +cMcr.jPJYPg?7#cg&p*bhW4UuKU;W#j/2nWrTF7-pZMiM4<kaj2d]8VkQ$t7rsp\=
   5.401 +2(+*@P%ncJB>W]hZ&\b^!!)ut!W`6#rr3<*rrE*!!<<'!rrE&u!W`6#rr3-%rrE*!
   5.402 +!<2uu!;c]t!!*$!rr3$"rrE&u!W`6#rr2rurVlitqYpQr!.t6\rrADSkQ&p,kQB]"
   5.403 +N_@GI"$h@rir&!?Q\PM?Qi-%IVr_dsmf37L!7(?&#=L[!)C7=L9`4)SQg4S]/N#C5
   5.404 +Kp%U6CMRS"j5[D)r;Q`srVlp!rrE&u$3:)+s8N*!rrE'!rr3$"rrE&u!W`6#rr3'#
   5.405 +s8N)urr<&trrN3#!<3!"!<3&urrN3#!<2uu!<)ot!<2uu!<)ot!.t6\rrADSkQ&p,
   5.406 +kQBV#Fj.r,"5J$ZjS\3AQ\PM?Qi-%JVf(\t!m'g0rTF7,pZMiM4<kaj2d]8VkQ$t7
   5.407 +rsp\=2(+*@P%ncJB>W]hZ&\b^!!)ut!W`9#r;[0(!<<'!s8N*!s8;ourrE&u!W`6#
   5.408 +rVlp!s8W&u!WW3!!<3#t!<3#s!!3*"rVuis!WW3!!!3-"rW%QM\,QGpn)sbsrTF=<
   5.409 +9?YBT!r^87qre$HLAq7?r9+0ZDWq*&aN3fLrTF7,pZMiM4<kaj2d]8VkQ$t7rsp\=
   5.410 +2(+*@P%ncJB>W]hZ&XG9K)ad/!130<!7(Q,!S]=-r5ng<qXcK-r9+-Ig&D$PYQ"Th
   5.411 +r9+6\DZBb%kQAoImf37L!7(?&#=L[!)C7=L9`4)SQg4S]/N#C5Kp%U6CMRS"j5[D)
   5.412 +K)^H&i;WeDn)sbsrTF=<0`&ic"8)"8m/6&IQi-m^!:Bgb!;c]q!;?Hj!;c]q!9jF_
   5.413 +!9*qXQi-%LVf)P7lKA>kaR9*,kQ&p&kQaL<,8qje?VLC]!13!N%kTXr-\[_HC27Tt
   5.414 +_W0[]MLtk[s5<nWQga,<cMcr-gb?eC"SVBN0^S`$!13Za!!)<a!!)`m!!)`m!!)`m
   5.415 +!!)6_!!)!X!13WI"/g&:s6AeMaN3fLrTF7,pZMiM4<kaj2d]8VkQ$t7rsqat:/H%X
   5.416 +H"L]%AW`UWM<oioK)ad/!130<!7(Q,!SfB\o`5$mr:L'j!;c?ko^Cutm/6&IQi@!b
   5.417 +!;c`p!<3#t!!3-"rW!$"rrDoqrW!*$rrE*!rW)iq!!)rs!!*#u!<E0!!!WB&rrE*!
   5.418 +rW!!!s8;rss8E!!s8W&uj8T+Gr9+6\DZBb9kl(MdjGlnc0hmM^rVui["3AROs8D-]
   5.419 +cM-N-6p)\4,r]1)r9+-IK)^H&\c2Yrn)sbsrTF:;0]D^(!;c?h!!)ri!<<,ro`XpU
   5.420 +kV2B$kQ$tKrr<&rrr<&urrN3#!;ZWr!<3&rrr<&urrN3#!;uis!;ulq!<3!%!<3'!
   5.421 +rrE&u!<<,srrN3#!<3!"!<3&urrN3#!9*qXQi-%LVf)P7roamms8%d/12`GCGrR7-
   5.422 +q>^KnkQAoImf37L!7(?&#=L[!)C7=L9`4)SQg4SR[8'Lk2tR('k^rhmrrADSkQ&p,
   5.423 +kQ9Nnp$_MR!!)`brW)fe!<<,toDnplqXap^mcQ:jr9+-Irr2ruqu6Wrrr3$"rrDus
   5.424 +r;Zlu!;lcr!<3!$!<3'!s8;rqrr<&qrr<&urr<&urr<&ts8;ourrE&u!<E/t!!3*"
   5.425 +iVrnEr9+6\DZBb9kQV"bCaao+rVm&sRkJ+Es8D-`aN3fLrTF7,pZMiM4<kaj2d]8V
   5.426 +kQ$t7rral/1FY<Ts4Z[gs,6mWQga,<cMcr/gbABmmdgGZ!;Z3h!!)Tj!<2Tf!!2]_
   5.427 +quHTb"S1sB0^S`$!13]b!!)or!!*#u!W`6#rVlitrr3$"rrDrr!!*#u"9AH%rrE&u
   5.428 +!!)rs!!)lq!!*#u!!*#u!!*#u!!*#u!W`6#rr3$"rrDus!!)!X!13WI"/g&:s8M3b
   5.429 +s,ABV\GH4-`A)rDrTF@)aR9*,kQ&p&kQaL<,8qje?VLC]!13!N#V@nk.Pcp>MMV$,
   5.430 +g?=.gMuNdDn)sbsrTF@=0_=o&nc8^jqskC#!:g*io'ub\o'ub\nc/[\nc/[dnc\LL
   5.431 +jY6'!kQ$tJrr<&srr<&urrN3#!<)ot!<3!#!<<'!r;Q`srr3*$rrE'!rr30&s8N*!
   5.432 +rrDrr"T\Q&s8N)urr<&urr<&urrN3#!<3!"!<3&urrN3#!9*qXQi-%LVf)P7roaOF
   5.433 +/;$YJ[eg"*W%$3okQAoImf37L!7(?&#=L[!)C7=L9`4)SQg4S]/N#C7?A4)SCB+>/
   5.434 +W2?Gfrr:^9K)^c/!130<!7(Q,"5GU%oDA+W!!)Tg!;Z0c!;uC$!!)Qi!:o[\!:o[\
   5.435 +!:g*io'ub\qXOdZm,]qfr9+-Ir;Z]q!WW3!!<3#t!!3-"r;cisr;Zlus8E!$s8N*!
   5.436 +s8;p#s8N*!s82itrrE&u"p"]'!!*$!rVufr!WN0!rrN3#s8E#trrE*"j8T+Gr9+6\
   5.437 +DZBb9kQZl!o^5L*[/9k)rC225kQAoImf37L!7(?&#=L[!)C7=L9`4)SQg4S]/N#C5
   5.438 +Kp%U<C]FBg^qd:0rr;$B!W_EaqriY3MuNdDn)sbsrTF@=0_4f$nGrUir:0U`%IjDu
   5.439 +naQSZnGiRZnGiRcnHA@Ij=orukQ$s(rrAD`kQ@`#s8W)^#?>F:s6ic7Zhsb'K0]D!
   5.440 +"3AROs8D-]cM-N-6p)\4,r]1)r9+-IlMhAH2)Qb8P*0d"s7a@ij0=XDrrM?Ir;c*G
   5.441 +!W_EaqriY3MuNdDn)sbsrTF@=0_+]$n,WLhqX=Lc!<2Hu!!)Kg!:]IX!:TsgnF-DX
   5.442 +qX=XVlJjSbr9+-ILAq7?r9+6\DZBb9kQ*Gnrr3)h;(JpLrrJrHrTF@)aR9*,kQ&p&
   5.443 +kQaL<,8qje?VLC]!13!N%kTXr-\[_HE,5LJ_;jR\NrK%[ki`$GkPtVJkQ1bJ!;ku3
   5.444 +s,6mWQga,<cMcr/gbA9gnF-GY!;Q$a!!*#f!rr>jnGE7enF6>UqX=XVlJjSbr9+-I
   5.445 +LAq7?r9+6\DZBb9kQ*AgrVluh;C\mKrrJlErTF@)aR9*,kQ&p&kQaL<,8qje?VLC]
   5.446 +!13!N%kTXr-\[_HE,5LJ_;jR\NrK%[ki`$GkQ1bJkl(P`ki`$GkQV%N!9aFHkl(Pb
   5.447 +ki`$1!;ku3s,6mWQga,<cMcr/gbA6eamTB#l/FD`r9+-ILAq7?r9+6\DZBb9kQ+=f
   5.448 +r;Qlg<%>'MrrIm=rTF@)aR9*,kQ&p&kQaL<,8qje?VLC]!13!N%kTXr-\[_HE++*;
   5.449 +_;jR\NrK%[ki`$GkPtV\kQ1bJ!<20d!9aC_ki`$GkQCnL!9aF[k^rhmrrADSkQ&p,
   5.450 +kQ0Hma6s/ukM\,^r9+-Ig&D$PgA_3SrrCaP!13WI"/g&:s8M3`LGA8qrs/'o.]i[K
   5.451 +89Xsq"3AROs8D-]cM-N-6p)\4,r]1)r9+-IlMhAH2)Qb8P*0-^B4Sp?j0=XDrrM?I
   5.452 +r;ci\r;[)dkQ'fHki`$GkPtV^kQCnL!9aF[k^rhmrrADSkQ&p,kQ0Hma6EfjiS6-S
   5.453 +r9+-Ir;Z]qmJm+bqYpNqpAb'kl2LebrrCaP!13WI"/g&:s8M3`gF@sTrs&$p.B99o
   5.454 +bPgW,aN3fLrTF7,pZMiM4<kaj2d]8VkQ$t7rsp\=2(+*@P%ncJB>W]hZ&\h`!pJhJ
   5.455 +r9++\roaUfki`$1!9iVHroa=^roaIbkQ'fHqriY3MuNdDn)sbsrTFF@5fDO8h9=^Z
   5.456 +h:pPm5k"X7!13Za!!)<a!!)`m!!)`m!!*#u!!)<a!W`6#g&D&=r9+6\DZBb9kQCj9
   5.457 +/%,9S"nPeE0m*HokQAoImf37L!7(?&#=L[!)C7=L9`4)SQg4S]/N#C5Kp%U6CMRS"
   5.458 +j5[D)rr3&`kQ(PE!!*#^!!*#^!!*#^!!*#^!!*#^"9@WckQ(MDK)^c/!130<!7(Q,
   5.459 +"5eQAX3&]kca@A;oDIePQi@!b!;c`p!<3#t!!3-"rW!$"rrDoqrW!*$rrE*!rW)iq
   5.460 +!!*#u!W`9#rW!$"rrE&u"p"Z'rrE*!rW!*$rrE'!g&D&=r9+6\DZBb9kQV"_>q1s3
   5.461 +rVm&tO=+!$s8D-`aN3fLrTF7,pZMiM4<kaj2d]8VkQ$t7rsp\=2(+*@P%ncJB>W]h
   5.462 +Z&\h`!pJhJqrmtYroa=^roa=^rTO4\"R,%LkQ(MDK)^c/!130<!7(Q,"6A[.9?8dh
   5.463 +5_S_#r9+-Irr2ruqu6Wrrr3$"rrDlp!W`6#qu6Wrrr3$"rrDus!!)rs!!*#u!!)rs
   5.464 +!W`6#rr30&rr<'!rrE&u"9AH%rrCaP!13WI"/g&:s8M3ms8Ve@.6;U8PB]2<G4bh7
   5.465 +rTF@)aR9*,kQ&p&kQaL<,8qje?VLC]!13!N%kTXr-\[_HC27Tt_W0[]NrK(LkPtVJ
   5.466 +k^rhmrrADSkQ&p+kQC2@oCV2<kP5&L"8;H]lhorHQi@!b!;lcr!<3!"!<3&ss8;ou
   5.467 +rrDrr!!*#u"9AH%s8W#tr;Z]qrr;os#QOf(rrE*!!<2uu!<3!$!<3'!!87APQi-%L
   5.468 +Vf)P7roj=\#Ln2d.k3`*d/F"CkQAoImf37L!7(?&#=L[!)C7=L9`4)SQg4S]/N#C5
   5.469 +Kp%U6CMRS"j5[D)rr;QQ!!)<JK)^c/!130<!7&(;!13]b!!)or!!*#u!W`6#rVlit
   5.470 +rr3$"rrDrr!!*#u"9AH%rrE&u!!)rs!!)rs!!*#u#QXo)!<3'!rrE&u!!*#u"9AH%
   5.471 +rrCaP!13WI"/g&:s6AeMaN3fLrTF7,pZMiM4<kaj2d]8VkQ$t7rsp\=2(+*@P%ncJ
   5.472 +B>W]hZ&8P\g?=.gMuNdDn)sbs\**gYrVlitr;Q`srr3$"rrE#t!!*#u!s&B$!;uis
   5.473 +!<3!$!<3'!!<3!&!<<'!s8N)srr<&urr<&urr<&urr<&urr<&urr`?%!<3&PrrAD`
   5.474 +kQ@`#s8VBJ"3AROs8D-]cM-N-6p)\4,r]1)r9+-IlMhAf:/4W-H$O"7B4[3tT8Dq6
   5.475 +s4Z[gs,6mWQga,<cF<!;Qi-m^!!3-"rW)rtrW!!!s8;rss8;ous8W&u"TSK%s8W#t
   5.476 +"onT&s8N)rs8;rsrr<&urr<&ts8E!$s8N*!!87APQi-%LVf)P7lKA>kaR9*,kQ&p&
   5.477 +kQaL<,8qje?VLC]!12=;g?=.gMuNdDn)sbs\**gY_#FB7aSu7,r9+3[DZAn@!Ug!d
   5.478 +kQ&p&kQaL<,8qje?VLC]!13Q^#6+Defso,qK)^H&a8Z.+n)sbs\**gY_#FB7aSu7,
   5.479 +r9+0ZDW]"@mf37L!7(?&#=L[!)C7=L9`4)SQi$dhrpAIln&MTRnc".?K)`sm!130<
   5.480 +!7(Q,!p&4mjP&eIrn7J/gtq,ikQ$s(rrAD`kQ%OAmK!:ckQ&p&kQaL<,8qje?VLC]
   5.481 +!13T_$MiW5bOEWV[E@q:K)^H&b5VI.n)sbsrTF@?i/UIO0EXRij5U"#!1/H?!13WI
   5.482 +irAu@!7(?&#=L[!)C7=L9`4)SQi$dirSZben&MT;\_-\/s+:9nrrADSkQ&p,kQBV#
   5.483 +Fj.r,"5J$ZjS\3AQ\PM?QeCR&cM-N-6p)\4,r]1)r9+-IqYpo\jkK:CXKo1La7Y&a
   5.484 +K)a$o!130<!7(Q,!o-Gla8Q/=b"MWq!1/H?!12C&!7(?&#=L[!)C7=L9`4)SQhp^j
   5.485 +iUcO1a1&q2aKj+[rVZ]n!:0Xe!!*'!quD?KK)bQE!130<!7(Q,!S]=-r5ng<qXcK-
   5.486 +r9+-ILAq7?g#rF]pZMiM4<kaj2d]8VkQ$tHrse\\qYKp6ahl$9ZaJ*Hr;Qp#!<<'!
   5.487 +!9sLa!!%WNK)bEA!130<!7(Q,!o,L+a8#i0mP+#*kQ$s(rrAD=kQ&p&kQaL<,8qje
   5.488 +?VLC]!13Za&,,DSi;3<Bbf6rp]X5#Sao)/D!!*'!!!*'!r;Zlus82lrs8;p$rr<'!
   5.489 +!!)orr;_HLK)bcK!130<!7(Q,!SfBLpB:3[l7hT&kQ$s(rrAD=kQ&p&kQaL<,8qje
   5.490 +?VLC]!13Za&)5LWeGB%3]t1>T]="uOYPeD9!!*'!!!*$!!<<'!!<3$!s8N'!rr<&t
   5.491 +rr`<%rr<&srriB&s8N'!K)^H&rVlkan)sbsrTF:;0[fUp!!)fe"SD0H0^S`$!1/H?
   5.492 +!12C&!7(?&#=L[!)C7=L9`4)SQi6pp^q7(lqYK]l[^3NS['R*Lr;ZZp!WW2s!!iN(
   5.493 +!<<'!!<;ut#64]'!<3$!r;Qp#!<<'!!.t6&s8DrtQga,<cMcr-gb@^[quHKa!<<,p
   5.494 +o`XpUkV2B$kQ$s(rrAD=kQ&p&kQaL<,8qje?VLC]!13Za&&Y]\]CYIX\$NQT\$NEG
   5.495 +bl%JA!!)rs!<<,trs&N(s8N'!s8W#t"oeQ&rr<&srriB&s8N'!K)^H&rVlkan)sbs
   5.496 +rTF=<0_P#/!<<,koE>3po^i+`q"+Re!;Q0hoBtcqm/6&IQ\PM?QeCR&cM-N-6p)Y3
   5.497 +,r]1)r9+-IrVmDTZa.!i_</54Yc=Y)Za/EbrrE*"r;Qct!;uj#!!*'!!!)ut#64c(
   5.498 +!!*$!!;uj#!!*'!!!%WNK)bfL!130<!7(Q,"5GU&o_%eV!!)Q\!<<-!o)esmoCMn\
   5.499 +"7u*a!;Q-go'PQnm/6&IQ\PM?QeCR&cM-N-6p)Y3,r]1)r9+-IrVmD`Yd1X?Lto_W
   5.500 +V1X/]Vn)!grrE*"qu?Qo!<;rs!WW2u!!WE&!!*'!qu?cts8;qLs+::KrrADSkQ&p,
   5.501 +kQBTooCM_I!<<,gnc8^jrpgEs!:g*io'ub\nc/[bnc\LLjY6'!kQ$s(rrAD=kQ&p&
   5.502 +kQaL<+rVad?VLC]!13Za&(I\m^nl51guG2R?YG(pl0eQP!!%WNK)aj1!130<!7(Q,
   5.503 +"5GU%oD%kV!;c9b!!)Tg!<)Hh!!*#h!WW5kqZ$]g!!)fb"S(j?0^S`$!1/H?!12C&
   5.504 +!7(?&#=LZu)C7=L9`4)SQi6ppSYt<&Z#nn"o8n)sBOl;3mf*:f!.t6&s5O%YQga,<
   5.505 +cMcr/gbA<ip[J7a!:TFY!!*#g"98Gl!!)re!<<,pnHA@Ij=orukQ$s(rrAD=kQ&p&
   5.506 +kQaL<+rVad?VLC]!13Za%t:M;m^%,eoA,I;:L.7+Y(H\*s3:QDQga,<cMcr/gbA9g
   5.507 +p$_t^!:fOb!!)NX!!)NX!!)rd!<<,pn-&4Fj"TitkQ$s(rrAD=kQ&p&kQaL<+rVad
   5.508 +?VLC]!13Za&"e2jPG2uuYC9bcI<(1(dt7UOs3:QDQga,<cMcr/gbA9goC)b\!;#^X
   5.509 +!<)Eb!!;Wi!;Q$dn*8pem/6&IQ\PM?QeCR&cM-N-6p)Y3,r]1)r9+-IK)^H&\c2Yr
   5.510 +n)sbsrTF@=0_"SRmf`(Ci\9`skQ$s(rrAD=kQ&p&kQaL<+rVad?VLC]!13!N"LV!#
   5.511 +9K.S'K)aC$!130<!7(Q,!SfBLmf`%@i@sZskQ$s(rrAD=kQ&p&kQaL<+rVad?VLC]
   5.512 +!13!N"=u>b.6)qZK)aC$!130<!7(Q,!SfBLl3-;/gbA-nkQ$s(rrAD=kQ&p&kQaL<
   5.513 ++rVad?VLC]!13!N#V@nk.Pcp>MMQlaK)aO(!130<!7(Q,"l2G^hVI#3h?D`if=F69
   5.514 +r9+-ILAq7?g#rF]pZMiM4<b[i2d]8VkQ$t7rsp\=2(;jcKl_#/s7iOiVPJhDK)ad/
   5.515 +!130<!7(Q,"5eQAX3&]kca@A;oDIePQ\PM?QeCR&cM-N-6p)\4,r]1)r9+-IlMhAH
   5.516 +2)Qb8P*0d"s8Ibg^pA]Gs+::/rrADSkQ&p,kQBo0O\<bL"$hP1o_dnQQ\PM?QeCR&
   5.517 +cM-N-6p)\4,r]1)r9+-IlMhAH2)Qb8P*0d"s7a@ij0=XBs8E#prr<&_rr<%Ns,6mW
   5.518 +Qga,<cMZl.m-sW=k4Rp4rq-Bep@[bLkQ$s(rrAD=kQ&p&kQaL<,8qje?VLC]!13!N
   5.519 +%kTXr-\[_HE,5LJ_;jR\Nr/hV!;ZWp!9jF_!.t6/rrADSkQ&o;kQ$s(rrAD=kQ&p&
   5.520 +kQaL<,8qje?VLC]!13!N%kTXr-\[_HE,5LJ_;jR\Nr/hX!<<)t!!3-"rW!-%!<3'!
   5.521 +s8E!!s8W#trr;rt!WW3!!.t61rrADSkQ&o;kQ$s(rrAD=kQ&p&kQaL<,8qje?VLC]
   5.522 +!13!N%kTXr-\[_HE++*;_;jR\Nr/hY!<<'!rr3$"rrE&u!<<,srrN3#!<3!"!<3&u
   5.523 +rrN3#!.t6/rrADSkQ&o;kQ$s(rrAD=kQ&p&kQaL<,8qje?VLC]!13!N%kTXr-\[_H
   5.524 +?=[\Z_rKd^Nr/hY!<<'!rr3$"rrE&u!!)utr;Zlu!<3!!!<;rs!WN.Os,6mWQga,<
   5.525 +cF<!;Q\PM?QeCR&cM-N-6p)\4,r]1)r9+-IlMhAH2)Qb8P*0QqCM1NEj0=XArrW9$
   5.526 +rrE&u!W`6#rr2rurr2rurr3$"rrE&u!W`6#r;Q`sK)^c/!130<!7&(;!1/H?!12C&
   5.527 +!7(?&#=L[!)C7=L9`4)SQg4S]/N#C5Kp%U6CMRS"j5[D)qu6`us8N)urrN3#!<2uu
   5.528 +!<2uu!<3!"!<3&urrN3#!<3!"!<3%Ns,6mWQga,<cF<!;Q\PM?QeCR&cM-N-6p)\4
   5.529 +,r]1)r9+-IlMhAH2)Qb8P*0QqCM1NEj0=XBs8E!!rrE&u"p"]'!!*$!rVufr!WN0!
   5.530 +rrN3#s8E#trrE*"K)^i1!130<!7&(;!1/H?!12C&!7(?&#=L[!)C7=L9`4)SQg4S]
   5.531 +/N#C5Kp%U6CMRS"j5[D)K)^H&i;WeDn)sbs\**gYLAq7?g#rF]pZMiM4<kaj2d]8V
   5.532 +kQ$t7rsp\=2(+*@P%ncJB>W]hZ&XG9K)ad/!130<!7&(;!1/H?!12C&!7(?&#=L[!
   5.533 +)C7:K9`4)SQg4S]/N#C5Kp%U6CMRS"j5[D%K)^H&i;WeDn)sbs\**gYLAq7?g#rF]
   5.534 +pZMiM4<kaj2IB/UkQ$t7rsqat:/H%XH"L]%AW`UWM<oioK)ad/!130<!7&(;!1/H?
   5.535 +!12C&!7(?&#=L[!)C7:K9`4)SQ\,6hs1/.0Qga,<cF<"jQeCR&cM-N-6p)\4,rT+(
   5.536 +r9+-IlMh!p:/=PBK)^H&ec,W9n)sbsK'8?\!7(?&#=L[!)C7:K9`4)SQg4SR/2K(2
   5.537 +3.h0^s4.,LQga,<c@Y8BkQ&s'kQaL<,8qjd?VLC]!13!N#V@nk.Pcp>MMQlaK)aO(
   5.538 +!130<!RK,Ek`b32dEhRN#=L[!)C7:K9`4)SQg4S]/N#C7?A4)SCB+>/W2?GfK)^H&
   5.539 +i;WeDmcX\sd":JHkQ0)Vp?2`L4<kaj2IB/UkQ$t7rsp\=2(+*@P&P4:reA5(Z\3r1
   5.540 +K)ad/!13*:K$KV+!71?%#=L[!)C7:K9`4)SQg4S]/N#C5Kp%U<C]F.Fj5[D)r;ZZp
   5.541 +qYpNqkl1V_K)^i1!1/<$K';dh#=L[!)C7:K9`4)SQg4S]/N#C5Kp%U<C]F.Fj5[D)
   5.542 +r;Q`spAY*mkl1V_K)^i1!1/<$K';dh#=L[!)C7:K9`4)SQg4S]/N#C5Kp%U<C]F.F
   5.543 +j5[D)r;Q`sr;Q`srr3!!s8E!%rrE'!s8W&u!WW2u!<3#t!!3-"rW%QMO8f3HK'7gM
   5.544 +o&p<H4<kaj2IB/UkQ$t7rsp\=2(+*@P&OiVGJW>"Z&\b^r;cis"T\Q&s8N)urrE*"
   5.545 +qu6]trrE&u!W`6#rr3$"rr@ZNNW0!FK'7gMo&p<H4<kaj2IB/UkQ$t7rsp\=2(+*@
   5.546 +P$V[3AAdHfZ&\b^!!)lq!!*#u!!*#u!!)utr;Zlu!<3!!!<;rs!WN.Os,I$YQ\+FQ
   5.547 +kjmpB6p)Y3,rT+(r9+-IlMhAH2)Qb8P*0QqCM1NEj0=XBrr<&qrr<&urr<&urr<&u
   5.548 +rr<&urrN3#!<3!"!<3&srr<%Ns,I$YQ\+FQkjmpB6p)Y3,rT+(r9+-IlMhAH2)Qb8
   5.549 +P*0QqCM1NEj0=XBrr<&rrriE&!<<'!rr2rurr2rurr3$"rrE&u!W`6#rr3$"rr@ZN
   5.550 +NW0!FK'7gMo&p<H4<b[i2IB/UkQ$t7rsp\=2(+*@P%ncJB>W]hZ&\b^qu?ct!<3!&
   5.551 +!<<'!!<3&ts8;ourrE&u!W`9#rW)rt!<<+Os,[0[Q\+FQkjmpB6p)Y3,rT+(r9+-I
   5.552 +lMhAH2)Qb8P*0QqCM1NEj0=Vrs+::/rrAC;k^r$hkQaL<+rVac?VLC]!13!N%kTXr
   5.553 +-\[_HC27Tt_W0[]Ne7:_s5<nWQ\+FQkjmpB6p)Y3,rT+(r9+-IlMhAH2)Qb8P*0Qq
   5.554 +CM1NEj0=Jns+::/rrAC;k^r$hkQaL<+rVac?VLC]!13!N%nfYm:ipu.AnPafOe88&
   5.555 +m"57hs5<nWQ\+FQkjmpB6p)Y3,rT+(r9+-IK)^H&\c2YrK'7gMo&p<H4<b[i2IB/U
   5.556 +kQ$s$s+:9]rrAC;k^r$hkQaL<+rVac?VLC]!1/<;K)`C]!1/<$K';dh#=LZu)C7:K
   5.557 +9`4)SQ\,6hs1/.0Q\+FQkjmpB6p)Y3,rT+(r9+-IK)^H&\c2YrK'7gMo&p<H4<kaj
   5.558 +2IB/UkQ$s$s+:9]rrAC;k^r$hkQaL<,8qjd?VLC]!1/<;K)`C]!1/<$K';dh#=L[!
   5.559 +)C7:K9`4)SQ\,6hs1/.0Q\+FQkjmpB6p)\4,rT+(r9+-IK)^H&\c2YrK'7gMo&p<H
   5.560 +4<kaj2IB/UkQ$s$s+:9]rrAC;k^r$hkQaL<,8qjd?VLC]!1/<;K)`C]!1/<$K';dh
   5.561 +#=L[!)C7:K9`4)SQ\,6hs1/.0Q\+FQkjmpB6p)\4,rT+(r9+-IK)^H&\c2YrK'7gM
   5.562 +o&p<H4<kaj2IB/UkQ$s$s+:9]rrAC;k^r$hkQaL<,8qjd?VLC]!1/<;K)`C]!1/<$
   5.563 +K';dh#=L[!)C7:K9`4)SQ\,6hs1/.0Q\+FQkjmpB6p)\4,rT+(r9+-IK)^H&\c2Yr
   5.564 +K'7gMo&p<H4<kaj2IB/UkQ$s$s+:9]rrAC;k^r$hkQaL<,8qjd?VLC]!1/<;K)`C]
   5.565 +!1/<$K';dh#=L[!)C7:K9`4)SQ\,6hs1/.0Q\+FQkjmpB6p)\4,rT+(r9+-IK)^H&
   5.566 +\c2YrK'7gMo&p<H4<kaj2IB/UkQ$s$s+:9]rrAC;k^r$hkQaL<,8qjd?VLC]!1/<;
   5.567 +K)`C]!1/<$K';dh#=L[!)C7:K9`4)SQ\,6hs1/.0Q\+FQkjmpB6p)\4,rT+(r9+-I
   5.568 +K)^H&\c2YrK'7gMo&p<H4<kaj2IB/UkQ$s$s+:9]rrAC;k^r$hkQaL<,8qjd?VLC]
   5.569 +!1/<;K)`C]!1/<$K';dh#=L[!)C7:K9`4)SQ\,6hs1/.0Q\+FQkjmpB6p)\4,rT+(
   5.570 +r9+-IK)^H&\c2YrK'7gMo&p<H4<kaj2IB/UkQ$s$s+:9]rrAC;k^r$hkQaL<,8qjd
   5.571 +?VLC]!1/<;K)`C]!1/<$K';dh#=L[!)C7:K9`4)SQ\,6hs1/.0Q\+FQkjmpB6p)\4
   5.572 +,rT+(r9+-IK)^H&\c2YrK'7gMo&p<H4<kaj2IB/UkQ$s$s+:9]rrAC;k^r$hkQaL<
   5.573 +,8qjd?VLC]!1/<;K)`C]!1/<$K';dh#=L[!)C7:K9`4)SQ\,6hs1/.0Q\+FQkjmpB
   5.574 +6p)\4,rT+(r9+-IK)^H&\c2YrK'7gMo&p<H4<kaj2IB/UkQ$s$s+:9]rrAC;k^r$h
   5.575 +kQaL<,8qjd?VLC]!1/<;K)`C]!1/<$K';dh#=L[!)C7=L9`4)SQ\,6hs1/.0Q\+FQ
   5.576 +kjmpB6p)Y3,r]1)r9+-IK)^H&\c2YrK'7gMo&p<H4<b[i2d]8VkQ$s$s+:9]rrAC;
   5.577 +k^r$hkQaL<+rVad?VLC]!1/<;K)`C]!1/<$K';dh#=LZu)C7=L9`4)SQ\,6hs1/.0
   5.578 +Q\+FQkjmpB6p)Y3,r]1)r9+-IK)^H&\c2YrK'7gMo&p<H4<b[i2d]8VkQ$s$s+:9]
   5.579 +rrAC;k^r$hkQaL<+rVad?VLC]!1/<;K)`C]!1/<$K';dh#=LZu)C7=L9`4)SQ\,6h
   5.580 +s1/.0Q\+FQkjmpB6p)Y3,r]1)r9/a!JsXNElMlJ"K'<$o#=LZu)C7=L9S2J[kecQK
   5.581 +s+9HdkkXEI6p)Y3,r]1)K'7gM_W^:bK'7gMq</&O4<b[i2IB.0k^r$8kkb;\n"3GU
   5.582 +5QXKCkPG41k^r$okQaL<,8qjd?VH(8K':)8qu6bR(gsQH^BD#Z(jPfQs+9HdkkXEI
   5.583 +6p)\4,rT+(K'7gM_W^su"4oMWp\FgjLG6dIs+9HdkkXEI6p)\4,rT+(K'7gM_W_"!
   5.584 +#,a/qs-/5%qYpWK3/@M5K'7gMq</&O4<kaj2IB.0k^r$8kR%:hk:#g!s#^9Dq#:F]
   5.585 +^]4=ck^r$okQaL<,8qjd?VH(8K':)8"98Bl\,QC/49.M=rr_.,p]#j/K'<$o#=L[!
   5.586 +)C7:K9S2J[kecNbs.<]trrP:_4SSjWLNriNk^r$okQaL<,8qjd?VH(8K':)8!rj,#
   5.587 +rVls^!'Gu7,lj_;rrF8"K'7gMq</&O4<kaj2IB/UkQ9i%gOe/:g4IlAeH*EMr;QaZ
   5.588 +rW!'`,ldq?r;QeBLP"`AkkXEI6p)\4,rT+(r9+7>i/UH^0S2"%0EHZQr;R$b!!';(
   5.589 +o/m"!r;Qf,8:p&WkkXEI6p)\4,rT+(r9+7<NciQts+:9orrHN"r;Qg\!'L8\"/>hr
   5.590 +bl.PBa#J\7K'<$o#=L[!)C7:K9`4)Uge5hBrdt-lrW--!r;Qg\!'L8\"3^`Fbl.PB
   5.591 +h]RO7K'<$o#=L[!)C7=L9`4)TgG&X)K):/sbkhESQi-jb49.MCrr^IF!6kEA!P^mO
   5.592 +k^r$okQaL<,8qje?VLC]!o,L+K)(#ob4u'nGl7RC49-],rr[rT-0G1+!O#=Ok^r$o
   5.593 +kQaL<,8qje?VLC]!SfA\pO`.]pAr;or;R$b!!#m?UEon;r;Qe*T7Z9YkkXEI6p)\4
   5.594 +,r]1)r9+1:0S8ulo`5$me+E_A!;6$a!8@)H!!'b+!rj\#rVls^!+R>S!!+D!rVlrn
   5.595 +)"3(?K'<$o#=L[!)C7=L9`4)TgbA!cquH-W!<<,To`5$mrq-9l!8$lE!!)W`!<<,[
   5.596 +o`5$mp@SFd!8-rF!!)W`!<<-!o`5$me+EeB^Hhbt#F'qWk&`_-k5>5\BUAaNk^r$o
   5.597 +kQaL<,8qje?VLC]!o,L&lgt2X!9s+V!!(gH!<<,JoDnple+<Y@!;?$c!!([D!<<,k
   5.598 +oDnplht-pL!:oaas8Qc!o)Ag43<0#1k^r$okQaL<,8qje?VLC]"5GU&o^)/M!!)rg
   5.599 +"TSPo!;#g\!<2Tg!!2]_r;ZlioDJ[eo*YNuo)S@^!;#d^!;$*gqXaXc"7lKmoDARg
   5.600 +oDSahoDJ[doDJXqoCDq^oCDq^oCMn\$hF>uo)Jd^o)Jd^oDJXlo)Jd^oDJXioCMk[
   5.601 +r::F!!:p3^!!)W^!!)Tj!;#g\!;uHf!!`#p!:p3^oDJXioCMk[!;$0iqt'ad!V>p]
   5.602 +!!Vuc!!)W^r;cigr;Zihr;Zul!!)W^r;ZlioDAUWo)Sgko^`4cs7[r!o`#'_0\?@)
   5.603 +K'7gMq</&O4<kaj2d]8VkQBTooCM>>!<<,to)/Omnc/[\nc/[fncSpmnc/[hnc]!n
   5.604 +o'ub\rUTme%IsK!o'ub\nc/[\nc/[enc8^jrpg^&!:g*io'ub\o'ub\nc/[\nc/[g
   5.605 +ndb^#o'ub\nc/[\nc/[\!!)ug$NL1t!!)T\!!)Qi!<)I!!!)Qi!:o[\!:g*io'ub\
   5.606 +rUTme&Fof$o'ub\nc/[\!!)T\!!)ug!rr>lo)/P#nc/[\nc/[\!!)T\!!)T\!!)ug
   5.607 +!<<,une(p&o'ub\nc/[\!!)T\!!)Qi!<)Hh!!*#h%fcV#!!)T\!!)Qi!:o[\!:KCY
   5.608 +!!)``rr3&G.$sZ-!k0Serr7T6K'<$o#=L[!)C7=L9`4)VgbA?km.(/W!;uBg!!*#h
   5.609 +qZ$Zfo)&Ihnc/[ho(rFcnc8^jrpgKu!:o[\!:g*io'ub\o)/Oinc/[hndPR!nc/[\
   5.610 +nc/[\nc/[\qZ-TcqZ$Zfo)/Ojo'ub\rUL6p!:g*io'ub\o)/P#o'ub\nc/[\nc/[\
   5.611 +!!)T\!!)ug!<<-!nd,9ro'ub\nc/[\qZ-Tc"TSPnnc/[hndkd$o'ub\nc/[\nc/[\
   5.612 +nc/[go)/Oho()YX"7cElo(rCgnc/[gnc8^jrpgR"!:g*io'ub\nc/[\nc/[go)/Og
   5.613 +o)/Ranc/[ao)8Rjmq=]4qYpZ\?qBJZs+9HdkkXEI6p)\4,r]1)r9+7<0_4f$nGrUi
   5.614 +r:'df!<2Kh!!)re#QOkpnGiRZ!!*#g!<<,qnGrUirp^Bs!:fRZ!:^$hnaQSZqsa[e
   5.615 +!<2L!!!)Nh!:fRZ!:fRZ!:^$hq=+Ic!;l<b!!Dc]!!)uf$31(r!!)QZ!!)QZr;[E!
   5.616 +!!)Nh!:fRZ!:^$hnaQSZrUBmg!<2Kr!!)QZ!!)Nh!:^$hq=+Ug!:fRZ!<2L"!!)QZ
   5.617 +!!)Nh!:fRZ!:fRZ!;uBc!!;Zj!;u?i!!)Nh!;u?f!!)uf!<<-!nIGU"nGiRZnGiRZ
   5.618 +!!)QZ!!)HW!<<,nnb`=na!`WkLVJn"5T$-js+9HdkkXEI6p)\4,r]1)r9+7<0_+]"
   5.619 +n,WLhr9s^e!<2Hg!!)rd#QOkon,NIX!!*#f!<<,qn,WLhrpU<r!:]IX!:TsgnF-DX
   5.620 +qsXUd!<2Hu!!)Kg!:]IX!:]IX!:Tsgq="Cb!;u<l!!)NX!!)Kg!<)Bm!!)Kg!:]IX
   5.621 +!<)C"!!)Kg!:TsgnF-DXn,NIXn,NIen,WLhrpU9q!:]IX!:Tsgn,NIan-&dlnF-DX
   5.622 +rpUI!!:]IX!:TsgnF-DXnF-DXqX=Uf!:Tsgr9sgh!:Tsgr9s^e!<)Bf!!*#f%fcV!
   5.623 +!!)NX!!)Kg!:]IX!:]IY!!)Z\q>UZFIs=4tJ%tgZK'7gMq</&O4<kaj2d]8VkQBTo
   5.624 +naYr7qu?ff!!)uequ?cenGE7enF6DW!V#UV!<)Bf!!)uequ?rj!!)NX!!)lbrW!Ju
   5.625 +!!)Kg!:]IX!:]IX!:]LU!;u?a!!r&o!:]IX!:]LV!!Mck!:]LU!!)Ne!!Vl]!!)NX
   5.626 +r;[)ln,NIXn,NIen,WLhrUB^b"RlBknF6>UrU9sj!:]IX!<)Ec!"8;c!!)NX!!)NX
   5.627 +!!)uer;cidqu?lh!!)NXqu?cenGN=fnF6DW"RlBknF6AV#Oq3_!:]IX!:oU[!!)3O
   5.628 +"RkX90^ODTK';dh#=L[!)C7=L9`4)VgbA6eK("<[_!_Eol/FD`K'7gMo&p<H4<b[i
   5.629 +2d]8VkQ0HmK("<[^@)3lkM\,^K'7gMo&p<H4<b[i2d]8VkQ0HmK'IsQ^?PjaiS6-S
   5.630 +K'7gMo&p<H4<b[i2d]8VkQTd-`89>+K&2+9_qkRQgXj#%mt0bTkjmpB6p)Y3,r]1)
   5.631 +r9+7?IVGj7d"9W[cih\&AqT],k^r$hkQaL<+rVad?VLC]"6A[.97ejL0Y]:D5_S_#
   5.632 +K'7gMo&p<H4<b[i2d]8UkQC2@oCRY-iUqftj7rWH"8;H]l[n>PkjmpB6p)Y3,r]1)
   5.633 +K'7gMK'7gMUZ_qN4<b[i2d]71k^r#Mk^r#nkQaL<+rVad?VH(8K'7gMK'8un#=LZu
   5.634 +)C7=L9S2J[k^r#MkbI>H6p)Y3,r]1)K'7gMK'7gMUZ`"P4<kaj2d]7QRf8TQP_,'M
   5.635 +P(JjKP-:#KPl@!WS>&D6,8qje?VJtmrl,&X_SO(a_"kb=^APZr]RmeJ]RmfI]`#GB
   5.636 +^&GeT`QU_4,8qje?VKM:rn@G+rn-hopX];m!S,`re:Q/$dt6&#e)AaUdeqPreC)do
   5.637 +rm_D.gI+.K)C7=L9^D!CkQ'fFkk"!5k547ljFZHEjFZIGjS\'8iW.s9iX"R44<kaj
   5.638 +2d]8Vn+5uCm/cS?qs3k=K'@mOK'@mOjQQ^/kks]AkR$G86p)\4,r]1)rU'dTmI'E;
   5.639 +mJ6)Llg+H5q<@kA!U8j#k^r#Mk^r$TkkXBLk2tji6p)\4,r]1)rU'dTmI'E;mJ6)L
   5.640 +lg+H5q<@kA!U8j#k^r#Mk^r$TkkXBLk2tji6p)\4,r]1)rU'dTmI'E;mJ6)Llg+H5
   5.641 +q<@kA!U8j#k^r#Mk^r$TkkXBLk2tji6p)\4,r]1)rU'dTmI'E;mJ6)Llg+H5q<@kA
   5.642 +!U8j#k^r#Mk^r$TkkXBLk2tji6p)\4,r]1)rU'dTmI'E;mJ6)Llg+H5q<@kA!U8j#
   5.643 +k^r#Mk^r$TkkXBLk2tji6p)\4,r]1)rU'dTmI'E;mJ6)Llg+H5q<@kA!U8j#k^r#M
   5.644 +k^r$TkkXBLk2tji6p)\4,r]1)rU'dTmI'E;mJ6)Llg+H5q<@kA!U8j#k^r#Mk^r$T
   5.645 +kkXBLZa8iX6p)Y3,r]1)rU'dTmI'E;mJ6)Llg+H5q<@kA!U8j#k^r#Mk^r$TkkXBL
   5.646 +Za9\p6p)Y3,r]1)rU'dTmI'E;mJ6)Llg+H5q<@kA!U8j#k^r#Mk^r$TkkXBMk5YJE
   5.647 +6p)Y3,r]1)mJcDOm.9Q;lM]rLkih9qqrmn>K'%[IK'%[Ii8t%$qr[k=#=LZu)C7=L
   5.648 +9_@ZFl4*"Bkih9qkih9qkih9qqrmn>K'%[IK'%[IiT:.%roO`tZf^DVZfU::4<b[i
   5.649 +2d]8Ulh9W>kl^/5l08*/pZDS>k5OOqk(;`Ik(;aOjq"f)s5gSns5cX2+rVad?VL@]
   5.650 +rp'CFp#u57!TiGAk(;]HjauTGjj`B*jT#8AjT#8@6p)Y3,r]1)kND'mp?2A9nDs]3
   5.651 +jS.\die$0Aie$1MiWeH&j5T(Yj8%[>6p)Y3,r]1)o&BQ*p##l.hu2Jbhh'a;hh'b<
   5.652 +h\G#)Za8NFZa8NFZa8KD6p)Y3,r]1)o\B,okh:XAK%Yb/K%],9'=5%FfsA$bfsA$b
   5.653 +fL.hG)C7=L9^^O(f(%:Be:Q2%e:Q3-e.hr_eC=NueC4HtdmQ;B)C7=L9\eFsh;d;f
   5.654 +gOe.2g4J%1g=P$dg"=qF4<b[i2bm^Rnk+L%Jjb2YJjcq5#Wsaa)C7=2:.=_<JinWI
   5.655 +JinWIZTJ@L/gD8WYTr-Ong!]LnK[TKiZn"<dNdcrnK[TKJg8;\nfk=`![&C$Jf94Z
   5.656 +Jf94ZS/M
   5.657 +~>
   5.658 +grestore
   5.659 +currentdict /inputf undef
   5.660 +currentdict /pstr undef
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/docs/figs/acm_overview.eps	Wed Aug 02 13:39:47 2006 -0600
     6.3 @@ -0,0 +1,1463 @@
     6.4 +%!PS-Adobe-2.0 EPSF-2.0
     6.5 +%%BoundingBox: 0 0 1106 631
     6.6 +%
     6.7 +% created by bmeps 1.2.6a (SCCS=1.78)
     6.8 +%
     6.9 +/pstr
    6.10 +  1106 string
    6.11 +def
    6.12 +/inputf
    6.13 +  currentfile
    6.14 +  /ASCII85Decode   filter
    6.15 +  /RunLengthDecode filter
    6.16 +def
    6.17 +gsave
    6.18 +0 631 translate
    6.19 +1106 631 scale
    6.20 +1106 631 8 [1106 0 0 -631 0 0]
    6.21 +{ inputf pstr readstring pop }
    6.22 +image
    6.23 +K)^H&K)^H&K)^H&VuHbSm(WPPK)^H&K)^H&K)^H&K)^H&_Z']3LFD?d!FYAJs-s#g
    6.24 +mt/<E^B!_Ss+:9&s+:99rrL.gjT#<(hh(m!rrLFWJcM;@!=6Gls+:9&s+:9<rrMk=
    6.25 +rW!!JGdm%S"J83b!'#T1Sc8\>JcM5>!.TV#K)^H&K)_5<"F'nH#`%UC")%Z7^OlKW
    6.26 +rr[`N!2kF`T>(F-!.TV#K)^H&K)_8="NLKB.+dV]"7H3iO+RD'rr[`N!8iD.TDnrm
    6.27 +!.TV#K)^H&K)_;>"SX;E#g_T3![%JFK)_GB"+L:Nhh(m#rrN0#ItI]Ps+:9&s-iri
    6.28 +NrT08j8T3X!#YH^s.B;nIfKK+K)_JC!WW4MK)^H&K)^H&Rf<FK!#X_q"HNN_8FM01
    6.29 +T`5+D!!(o.s.B;m!!%M#s+:9&s+:9>rrN0#B]8sk5lL``3/'U!BSY35rr[`N!8iD.
    6.30 +TDnrm!.TV#K)^H&K)_>?"6TXaTAfeNmmr$1rVut,n"]mbIfKK+K)_JC!WW4MK)^H&
    6.31 +K)^H&S,WTJ!!'LcrrK<QKKoMSrVus9\"s$+IfKK+K)_JC!WW4MK)^H&K)^H&S,WTJ
    6.32 +!!'ccs5*bVcWL/H!-k@?"+L:Nhh(m#rrN0#ItI]Ps.TGnkD+Y=\UOX@n&YM2hZ*Yk
    6.33 +K)aX+"Lf3J!5GE2"+L:Nhh(m#rrN0#ItI]Ps.TGm0S0;6!!$-Brr_-Y!5F-cg]%E>
    6.34 +&-*jIVuHjK!!(o.s.B;m!!%Mbrrqk`Im?71JcM_L"UI@YBRe@Ks+16Z!!#:*rr_-Y
    6.35 +!5F-cgA_8I!!$u9rr[`N!8iD.TDnrm!.Vod!N/bG!1X#j+E6MdrrN0#ItI^4rrPFc
    6.36 +5fis-hZ*YkK)aO("#p8lpSe)oIfKK+K)_JC!WW4M`W#tJ0`:tR#XCY"Jq'\J!a%]1
    6.37 +r;Zm)E:;$N!WW4MK)`I_!^H`NaSuA"!!'ccs4RDSQN.$+W;csL!!(oprrg)j@q1b,
    6.38 +rrR9gA,H9+g&B4PrrRm:Z1@nr^P/rgrrN0#=SK'#ldGe6ha%/@!si#,pO`F=rrUf%
    6.39 +./j2I&<G*9!WW4MK)`I_!^H`NaSuA"!!'ccs4RDShZ*YSW;csL!!(pFrrV>:PhZ3=
    6.40 +bWPe'!0mE]!6hqP!3uM'"jI#HYrj?2!!4H/UZh^Yk1T_5!0mH_!87#E"Qh!1!5JC1
    6.41 +!WW3npQbg@e,KWm(]XOIL\HE#S,WN85lL`aB_TjQ!WW4MK)`I_!^H`NaSuA"!!'cc
    6.42 +s4RDSpAb2cW;csL!!(pKrr@cN,m"&HUYYqNfd6Lq!+Z$."MZ5_-/#j/!'L5\!nmV,
    6.43 +pAb4kk3N$LKd?^]rr2tPrVurBo`"p8rVuqPqYpTs!)*'P!9M`1"fDV+!-%CYs-N`h
    6.44 +^E<LV5k!)"!WW4MK)`I_!^H`NaSuA"!!'ccs4I>Q!!&Xirr[`N!8mMM!O3sH!!#mP
    6.45 +rr>pp!!=Mn4PB`6!'L5\!+WV?!5JL5"&]*ubk;#;--Y`U!%%UE"/GnrL&M&Pbk1o8
    6.46 +Pl:X_L&1fN!!#[dQ2p$srrfM*!!o3Ks-3Neml1:I3;:i#!WW4MK)`I_!^H`NaSuA"
    6.47 +!!'ccs4I>Q!!&Xirr[`N!8mPN!2K8g!'K-<!87;N!JT\5rr>pq!!%,Prr?R.!!C"9
    6.48 +s31HB"Asl,;'l/@!'KWJ!%%UE"2Fm9L&M&Pbk1o8L&M&PU\aul!!#[dQ2p$trrgXR
    6.49 +!"cnss-!BbpK.Cq=OI-M!!%M#s1A:45QF'jrr_-Y!5HSS!d$Q0p\t<"4JVfR!d$Q"
    6.50 +qu6bn,s9lYrr[?h4QaEY!WW4mW;csL!!(pOrrAhl!!4H/-2mlE4Pp)<Pl:X_A,6-,
    6.51 +fhj%m\c2aX!!#.\rrC:B!!%`Orr@cO!!&e]rr]Mg-$9.d!/:CP!6k*8!/:CP!6k<>
    6.52 +!WW3npQbg@fDc!:+92DNK)^r4"SY.]!/K#&!WW4MK)`I_!^H`NaSuA"!!'dTrrBh5
    6.53 +!!%`KrrAhn!!(^Nrr[rT!%%OB"!mpI;>gFr,ldq!^]+?8!2$4i"+L:Nhtd9P^\n-<
    6.54 +-*dLMo-FA:;;V<QA,ZH.bc^sGL&M&PPlC[_bl.SBL&CrNL&M&P;<IlYL&M&Pbk1o8
    6.55 +L&M&Pbkh>@!!#[dQ2p$urr[3?!0;a3NrK7N+92]1e,KIL!.TV#]Dhpt!'nX*"5a(Y
    6.56 +^W?ETg&1mNU\k&kZ2O_'-2dcC-2mlEU](2mbl.SB-2dcF,ldq!^]+?8!2$4i"+L:N
    6.57 +htm?Ro-OA9!@>tgrr]#B4PB6(!p533rVlo\g%bRL49,@-XoAJL!!">DrrC:B!!%`N
    6.58 +rrC:B!!#.Drr@cP!!(7<rrhKHs8Psq!!(7>rrN0#9D=_Pjk0S8cN!rAK)^f0"4$rI
    6.59 +:t,FG!!%M#s1A:45QEA1YlO+<rr_-Y!5HSS!2KMn!@?FtrrM7.rVur5rVllNr;Zh-
    6.60 +rVlkOr;ZiArVlsG!!%_frrN0#T;_blIfKK+qYpP*rVusFbk(i<k*0@<A#&r$$7,ZP
    6.61 +U]6#o,lf6FrVm8fb`jCR!$u_L4AiB^rr^"u4O!X$"jE3bKqmf/rr_CG-"HlQ"6M]l
    6.62 +;?$S&Yu-bcs1`Y<,pe9BrrM8Hr]C6ZPih]>!2KMn!+Z!-!6kEB!/:@N!5JL5!'L8\
    6.63 +"6M]lA,Q?/juaqerVlqQ4Al(W!/:CP!6k??!M_dU,m@..!!">-qYpTs!)*'P!9Ml5
    6.64 +"&Jstc[u1TrrZ't!700p!WW4MK)`I_!^H`4pm(pAdf0F,!!'dRrrAhn!!#.[rr>1\
    6.65 +!!&8]rrA;^!!#.[rr>1[!!&8^rrXPI!/82f!WW4mW;csL!!(pRrrBh4!!&ecrrI3f
    6.66 +qu?a[bl7VBbl.SC4AktU"GQmUUF#U6!87AO"!mpI4T#-ZKdHWs!@<I!rr@0?!!(7A
    6.67 +rr@cP!!gaJjs:!-PYq;X!2KMm!JMis!!+Bfp\t@Y!!">-rVllArVuqPrVlo\4T5<\
    6.68 +PlC[_FT)7?bl.PAL&M&Sbl@^rrVuq?rr2tPrVurBr;QaZpAb1>q>UKr!)*'P!9Mo6
    6.69 +"4mMQBS-8Arr_-a!*IbN!WW4MK)`I_!^H`4pm(pAdf0F,!!'dQrr?R.!!>@`s)e5?
    6.70 +!+Yp+!+Ys-!%%UD!%%RD!/:CO"!mpIKtmWh!!&Xirr[`N!8m\R!)`^q!+YX#!'L&W
    6.71 +"=<[>s310:"""!I4S8[Sg&D!R,ldokrVloB-27HB-/&;\rVurBrVljprW!#Ds310:
    6.72 +!'L8\!+Ya'!/:7K!2KMn!+Ys,!6kEB"_5d#P[c$=!!">Drr>1\!!(7Arr>pq!!CIF
    6.73 +s31HB!'L8\!/:CP!6kEA!'KrT!%%I@!WW3npQbg@g&D/(!!(>ss,$aX:]Ldqec,[N
    6.74 +!.TV#]Dhpt!%.K,!9MZ/"5a(Y^Vp-P4T5<]A$Q"5!'L,X!'L/Z"53_S^\e'34T59^
    6.75 +,ldq!^]+?8!2$4i"+L:Nhu*KSg&:sP-0Fk"!+Yp,!%%RD"(VB2bk_;?;*=gX!mL[u
    6.76 +q>gL@!Bc)7rrXPI!'L8\!SJdt!!4H/4T,6]L&WIu!!(^Nrr>1\!!:CEbkhA@,s;/,
    6.77 +"$HV`Z2FY),s4:9rVupEq>URD!!">-r;Qc@o`+usrVljDrVurOrVlj[rW!&Es8U=B
    6.78 +!!%-?rr@cP!!(7Brr?R.!!FTXKnWD&!!">@rrN0#9D=_Pjk9Y8-ibBAs+p[WT)\kh
    6.79 +ec,[N!.TV#]Dhpt!%.K,!9MZ/"5a(Y^Vp-Qo-OA9"=4$J--Z5c!%%OC"/GnrA,H<,
    6.80 +-2miG,ldq!^]+?8!2$4i"+L:Nhu*KSFT)7?A+]d$^\n-7A(gmHrW!$Hs8U=?!!8qq
    6.81 +bl.SKU]:A/PftER!'L&V"!mpI4T>?\;>pOr4MUmq!0mH_"blt&!!">Crr>1\!!:CE
    6.82 +bkqGIFQWTL!!#.]s#g8\!0mK_!0mH_!%%LA!/:CP!+Yp+!6k-:!@>MZrrXPI!%%RC
    6.83 +!'L5\"3gfFbl.SBL&V)PL&M&Xbl@_*,ldokbl.PAPl:X_-2IQB!!#[dQ2p%#rr^jQ
    6.84 +!-j+qM#RSG#QRuWrrN0#ItI^4rrPFc-MWl,jjO/2hZ*Yk_uBb]-2[`CPktC[bkhAH
    6.85 +A,lQT!!";F!%%UD"!mpIbeO/Z!!&Xirr[`N!8m_S!'L5\!5J1+!+Z!.!)`^p!+Z!.
    6.86 +!l+cZqu?hQs8U=B!!%`NrrXPI!'L)W!6kEB"$HV`^]"354T,3ZL&M&UL&WG!!%%RC
    6.87 +!'L5\!mL\gr;Zhmrr3-J!!#mr^]"39A,lS(4T,6[A,H90o-FA:-1h$6!6k'8!2KPn
    6.88 +"!mpI-2dcC4T5<_bl@]srVuqPrr2tPrW!&Es8S>_!!&ekrrXPI!'L)W!WW3npQbg@
    6.89 +gA_8a!!(&ks+gUU:]NK*rrN0#ItI^4rrPFc-MWl,jjO/2hZ*Yk_Z'V#r;Zh-q>UbT
    6.90 +!!"<-!!#.]^]"35L&M&Pbl7VE,ldqh^]+?8!2$4i"+L:Nhu*KV,ldokoD\e:rVurO
    6.91 +rVll4rW!"Rs31EA!'L8\!5JL5!/:@N"!mpI4Sf!Wbl.SE4TGFkrVuqnr;Qb=rW!,:
    6.92 +s!7XF-2dcI49,@-k5W[)!!$O-rro/D4PBaVrW!#)KdHWs!'L,X!+Z!.!/::L!6kEB
    6.93 +!)``L!FmGS!!ah's8OAF!%%RC#<Vtd-0G7-L&M&PL&V)PL&M&Vbl@]?!!">ArrXPI
    6.94 +!'L)W!WW3npQbg@gA_8I!!)K;rrJ@Ko`#!-L$"Qu!p53$qYpWgKp;E5"5.0]k0O&/
    6.95 +BE01*rrN0#IuaO0ft[N?!L2:&rr^"u-)8lf!^H`4pm(pAdf0F,!!'dNrr>1[!!$O)
    6.96 +rt.?n!'Gr8!%%YT!!">:,ldq0rr3'H!!(6XrrN0#T;_blIfKK+r;QjF!!">:rrXPI
    6.97 +!%%RC!6kEB!epZur;Zh^rr2tPrVuqPr;QjF!!#.WrrC:B!!YRcs#^8]-2[]B4T5<a
    6.98 +g&E>u!%%RC#!;kc-3+"hrVuqPq#:=VrVupEqu?a[U\aunjs:!--2IQ@bl.SBL&CrO
    6.99 +^HDJq##YF#,ldokr;Qj]!!">Err@cP!!%`Prr@cP!!^[Is#^8]4So'[,ldp-q>UKr
   6.100 +!)*'P!9Mr7!e11UeGfYK!!#.Dp\t>j!!"=ErrSrAFRoG3L&<4u!!&ekrrXPI!+Ym*
   6.101 +"$?P`4O=$/IfKK!rrN0#J+EU>g&B1sKfjIRrr@cL!!,3Wm/I/M!!">BrrJ@Zg&D+=
   6.102 +!%.K,!9MZ/"5a(Y^Vg'O;>U=nU\aun,ldpebl.SNUEom?A,eXk!+Z'/bl.SBbeO/Z
   6.103 +!!&Xirr[`N!8m_S"!mpI-2@KCg!'Krbl.SB4T,3Zbl.SDL&[D:!!+D.rr2tPrVuqP
   6.104 +r;QjF!!#.WrrC:B!!YRcs!7XF-2[]K,ldoks8OAF!%%RC#!;kc-3+"hrVuqPq#:=V
   6.105 +q>^OYU\OihA,ZH.U\Xoibl.SBL&1fU,ldokk5Q_-!%%RC"$?P`-3!oEL&M&PL&V)P
   6.106 +L&M&Vbl@]*!!#.XrrXPI!'L)W!WW3npQbg@gA_4f!$Kek!%%UE!@@@5rrAhm!!(6D
   6.107 +rrgOl!!&eerrKANq#CClr;QbNrVupEqu6Ykr;Zi4d/O37!!)35rrN0#J+WaAUHJAQ
   6.108 +!847L!%%C?!)`.`"$?P`-2dcF49,@DgA_4>!%.K,!9MZ/"5a(Y^Vp-PA,ZH34='t-
   6.109 +-0G.*!2KMn"i('`!!#.\!!p@>@fQKTs8U=B!!(6XrrN0#T;_blIfKK+r;QaCrVuqn
   6.110 +qu7#p@fQL+s8OAF!'L2Z!5JL5!gN_=rVupErVlkOrVuqPr;QjF!!#.WrrC:B!!YRc
   6.111 +s!7XF-2dcC^]"3;-3+!-!!">CrrtRc!%%[Fbl.SBL%tZJ4T,6],uMGOrrBh5!!#.V
   6.112 +rrC:B!!%`Lrr>1\!!UUH49,@-r;Qj]!!">Err@cP!!%`Prr@cP!!^[Is#^8]-2RWD
   6.113 +,ldp-q>UKr!)*'P!9Mr7!al!neGfMjr;Zg[qYpQ1r;Zg[WrE&]rVuq?pAY,fpAb1U
   6.114 +r;QaCr;Zhmr;Qb,r;Zh>d/O3?!!(p-rrN0#J+`gA;>:+kL!K]#ffUR&h>[I$pAb1U
   6.115 +mf*AO!!">DrrC:A!!(^,rrPFc-MWl,jjO/2hZ*Yk`W#pJrW!!Gk-=mc!'L2Z##P@#
   6.116 +-3+!Bqu@0Ps8S;`!%$e-bQ%Vhk.got!!&Xirr[`N!8m_S!-J2?!@>tgrrJl@rW!0L
   6.117 +s8OAF!%$e+rr>pq!!:jRL&M&P4T59[^]"35A,Q?/,ldp-q>UH=rW!-bs8OAF!%%RC
   6.118 +!)`^q"$HV`4T5<\bl.PG49,@-s8U=B!!%`Jrr>pq!!,sZqu6]Zbl.PA;>pOqU\Oih
   6.119 +bl.SBL&CrOUJ_!j"""!I4T5<\bl.PD49,@-rr2tPrVuqPrr2tPrW!&Es8R3?!!$O,
   6.120 +rrgOl!!">@rrN0#9D=_PjkB_9?iWI@rr?R-!!%-=rrM^;rVusFo;hlkA,QB-4SSjU
   6.121 +U\k)n,s3LQ!!#.[rrM7.r;Zh>r;QaCr;Zg[d/O3?!!(p-rrN0#J+imB4SJgUL!K]$
   6.122 +;#gSBk2-+C,ldp-bfmh!r;Zh>n,EJP!!">DrrhI1!!">!rrPFc-MWl,jjO/2hZ*Yk
   6.123 +`r?%'rW!'Ibl@]brVuq?rVm'J!!#.]s-3E]"(VB2g&:sTPlJr-!%#AZ!WW4mW;csL
   6.124 +!!(pSrrM7.rW!'I@teD=qu?g]s8QU.!!GFHs8QU.!!>@`s+UFP!'L5[!6kEB!'L2Z
   6.125 +"!mpI4Sf!Wbl.SE4TGFkrVuqPrr2t.r;Zp^s8RfP!"5%ks5qNO!!">Fs31HB!/:4J
   6.126 +!2KMn!@=N>rs.4e,liZ!s4RAO!'L#U!6kEB"a%tQF?ClI!!B"rs+UFP#aGAhk0,+O
   6.127 +!%%XE!/:CP!/:FP!/:CP"O-oGjsC!,"_6]ps-+i/!!">@rrN0#9D=_PjkB_9?iWI?
   6.128 +rr?R-!!&emrr>pq!!+CiX8`1)qu?^Cq#:?/r;[*LZ2ajq,ldpBrVll4qu?^ZrVlo\
   6.129 +-2dfD-.)YoT)\lKf)GdO!.XbC!'L2["!r&C4T5<\L!K\u4T5<\bhi@%,ldp-rVlkm
   6.130 +rVupEn,EJP!!">Crr^#5;;'\'!^H`4pm(pAdf0F,!!'dSrrAhn!!+CirVlj[rW!>$
   6.131 +s8V4-!!%-@s5kX+!!'e5rs0nN!)`c\!!">Crr^#G,uM__!WW4mW;csL!!(pRrrAhe
   6.132 +!!#mqrrM7.rW)pDr;Zr)s8RfP!!#.ZrrXPI!%%RC"!mpI4Sf!Wbl.SE4TGGrr;Zm]
   6.133 +@jV$Q"$HV`U\t2l-2dfG-0G6OrVuqPp\t4Ur;ZpG4?Oqg!!?a2s'u$.!2K;g!6k'8
   6.134 +!2KPn!2KJmr[%LC"=<41s+UFP!/:FP!/:CP!6kHB!-J/>r[%IB!%%I@!WW3npQbg@
   6.135 +gA_4^!'ns3!'L5\"=;:ls)e2>!2Jo\!p533rVlo\fua6po-O86!875K!V7W:!!+Ci
   6.136 +rVltp,s9lZrr@cN!!">DrrAhl!!"=lrr\kn!8lB-!WW4Mq#:>(r;Zh-rr3,`,ldq?
   6.137 +cMmlSrVuqPhu<]0rVup\r;Qb=rVurBnG`SQ!!"=mrrPFc-MWl,jjO/2hZ*YkaSu78
   6.138 +r;Zhmr;Qc3rW!$Hbl>od!!&8_rr>1\!!">Drs_g*!%%Z!!!"=!Ki'-Br;ZhOaSu;A
   6.139 +!2$4i"+L:Nhtm?QU\Ffi-'\?-!0m6Y!+Z$.!0mH_!/:@N"!mpI-2miHjs:!-4Sf!W
   6.140 +bl.SB4T>?\FS5\7L&V)P-2%<?bl>od!!%`IrrL=ipAbFEg&L1\!!">=rrC::!!,3s
   6.141 +r;QaCp&G3=s8RfP!!%`Prr@cP!!(7Arr>1S!!(^KrrN0#9D=_PjkB_9?iWI>rrLe!
   6.142 +rW!!Gk-=jb!+Yg(!SMSo498requ7!L!!&eoKdA#F-&(Xa!d$PYjo5<jrVupErVuqn
   6.143 +qYpP*rVusFbk1o84So*Yg&D!O;>U=nbgHFmT)\lKf)GdO!.XhE!0mE^!+Ys,!jPUe
   6.144 +p\t9VbhW4#UP6I)rW!%BKnZ;]rrC:B!!%-=rr@cP!!(74rrY@`!%%.7!mJmAjo5BI
   6.145 +!%.K,!9MZ/"5a(Y^W?ET-2mlEU\aujL&M&R4TEY)!!(7Brr@0?!!%`Orr@cP!!1;t
   6.146 +o`+usaSu;A!2$4i"+L:Nhtd9R^JQ<V!!4GmL&(`LUF#g<!@;jdrrC:B!!%`NrrY@`
   6.147 +!%%UD!6kEB!)`Ok"$?P`L&M#PKdHWs"Ci_X!/:FP!R)ka!!:CEbl.SBU\=]ho4'*D
   6.148 +!!OZGk5YJ*rVuqPp&>"<q>^RC;5=!f!R)ka!!gaJs5kU-!5JO5"-`cc-2[]CF=$ea
   6.149 +"!mpI-2IQB!!#[dQ2p%#rrQR.5g]N2Z2FY'4=0t,!'L&V!+Yj*!@=N?rrC:B!!,2Z
   6.150 +qZ$VMm/I'\rVurOkPkOerVusFA,ZH.FSl(<^\n-4U\"Kc-2RZB^]+65-2RZB^X<&`
   6.151 +T)\lKf)GdO!.XkF!Tk^-!!$O&rsRLB-):LT;'dLg-):D<!TnM&,m$2Nk4nrWUJ_":
   6.152 +!BcVFrr?R&!!#.ZrrJllr?VJAU[\9`bl.SBL&CrNA,ZH.bl%JEPWU6<4GE\4"$?P`
   6.153 +-2miGo/n<]qYpSM-2mlG-"H*:rrR9g;>L4ojuar3qYpU^!%.K,!9MZ/"5a(Y^W?EW
   6.154 +,ldq?q#:V0!!">Ff`2!urVlu^,lg(*rrqO2!!(6Xq#CLC-"F^1rrN0#T;_blIfKK+
   6.155 +p\t6UrlbB)pAY0UFT+B'FQWK#!b3NRqu6c',pf>brrC:B!!%`IrrJA!qu6l_PYjPQ
   6.156 +^Y/Sd!/:@N$):um4ER@',pcFfrrQ[V;=jemk+dW-4GBQmrVlu^,lf7`rs.[r4?S=O
   6.157 +UWiE2$):um4ER@',pcFerrV>:g&1jOP_HmJrs>HB4Ca)[s--Bqq>UKr!)*'P!9Mr7
   6.158 +!al!nci4!?q>^OBbk_8=4SJgX^]4>Xp&G(=m/I'>rVurBkPkNErVutQbl.SB4T#-Y
   6.159 +;>pOqA+T^$jsBm)"*FSC^\Rp1L!fo&T)\lKf)GdO!.XkF!+Z!.!'KrS"Ao.!,uOO>
   6.160 +!%%UD!M^t;!!+C@qu6]@4Sf$\-):M?-1q6<k5PA\;>C1l4RrFObl.SBL&M#OZ2O_'
   6.161 +-2miEYpK8I!@>tgrrY@`!%%UD!/:CP!2KJl!+Yj*"!s`BU](5nFSc";;>pOqg&(dN
   6.162 +5QE/+Q2p$prr_-Y!5HVT!ni:4pAYAO4L+qdZ%^m/rrM9+qYq#04GEh8Yrj<p4AggI
   6.163 +k/@9$!!&Xirr[`N!8klt"!mpnk3;mGU](5n^\%O+k2-+<bh)jpk1BV7!!#[dQ2p%#
   6.164 +rrQR.5gKB0A,?6+U\XoiFSu4=49-],!!?a2s31<>!DtuY!!(71rr@cP!!(7,rr@0?
   6.165 +!!YRcs!7XF-2dcCg&:sP-0Fh!!2KAj"$HV`A,ZH.4T5<\;:5CGT)\lKf)GdO!.XnG
   6.166 +!Tk^-!!'e,rr>1T!!CIFs0;:u!@?n,rrJl@p](CBs8R37!!#.\rr>1U!!$O"rrC:B
   6.167 +!!J#Us5o%6!!%`PrrB>!!!#.[rrY@`!%%UD!/:CP!/:CO!-Iu9![[l]r;Zi4r;Qc3
   6.168 +rVusFk55/[5QE/+Q2p$prr_-Y!5F-cf`)!Q!2$4i"+L:NhoG`tbi\-h!)`^q!82u(
   6.169 +q>UKr!)*'P!9Mr7!al!nc2Rbir;Zh-q>UW\,ldok^]+65A,ZH1;?-[?qZ$\ms31HB
   6.170 +!2K)a"L2H!4=0t,rB((bmJd4?-2mlH^]4<[rVurBrVlk>rVuq.o)A]"rW!15,ldok
   6.171 +s8ODE!!KPQ!!"=mrr\kn!8lB-!WW4Mqu6Y<rVupqo`"nRqu?dE;,R;m"3gfF-2mlE
   6.172 +4T:$7-2mlEPlC[`fd6Ut#:3lTKd?^!-3!oHftW5<rVuq.rlkBA!/:CP"=7Q3Kk()^
   6.173 +!%%49!/:CP"!p&U-2dfD4T>?]jsBs+!@9l,!!%`PrrY@`!%%UD!/:CP!6kHB!5JI4
   6.174 +$&-U<@fQKTs8P4\!!#.Zrr>pq!!$O*rrPFc-MWl,jjO/2hZ*YkK)aL'!WW4mW;csL
   6.175 +!!(oYrrAhn!!"<ss7lTq!!#[dQ2p%#rrQR.5gKB0A,H<,4Sf!WFT)7CPlKm"-2dfG
   6.176 +U]:A<qu?hQs8U=B!!%`Crr=A<!!(^?rr>pq!!H1!bfi3K!!%`Orr>1\!!'e)rr=AE
   6.177 +!!0>NrVuuC^]"3:-3#7k!%$%m".oPnhq%f/!!%NGrr=AE!!'e+rr>1[!!?a&s+UFP
   6.178 +!mL[urVuq.rr3"o-2mlEU]18n;>pOu--ZDhbl.SBA,H9+L&M&PL&:lU,ldokbl@_*
   6.179 +A,ZH.-1_'9L%bQJ4PB`6!+Z!."=:h_s.fPn!%%XE"$?P`-2miDFT)7?bl7VB;>pOq
   6.180 +L&M#TZ%_??s1eL4!/:FP!5JI4!875K!^H`4pm(pAdf0F,!!'ccs4I>Q!!&Xirr[`N
   6.181 +!8k3a"/@.g4T:$7;>gIpKnB@"rrN0#9D=_PjkB_9?iWI<rr@0;!!%-;rrtRc!%#j!
   6.182 +-2[`CA,cK.bl%MA4T>?\^]"35L%50C-2%<>-0F[r!0mE^!@9&h!!#mprrXPI!%%49
   6.183 +!87>O![[kVrVutQA,ZH0FT4K&!!'d^rr\kn!8lB-!WW4Mr;Qo^,ldokoD\eQrVuq.
   6.184 +rr3G&!!">-s!7XF-1h/$4T,6[-3!oEg&:sP--ZAg!6kEB!/:=M!2KMn!/:@N!2KMn
   6.185 +"GQlj@jV'R!/:"D!/:4K!@;jcrr=AE!!';&rsCjg!%$e-s#^8]-2miD4T5<_bl@^X
   6.186 +rVup\pAY,&rVupErr2sqrVupqq>UL]!%.K,!9MZ/"5a(Y^OlL<rrN0#T;_blIfKK+
   6.187 +[Jp4QpAb1UK)bTF!WW3npQbg@gA_4^!'np2!2KJm!%%RD!3uG$!%%C?!E$W1rrC:A
   6.188 +!!&8_rr@cP!!%`CrrM89r]L/["E]?O;6fTi!)`@g!%%UD"!mpI-1_'9L&M&R4TD2U
   6.189 +!!,2.rW!#Qs+UFP!-HZh".oPnhq%f/!!%NHrrC:B!!#.QrrbFa!%%78rsFHBZ2`r4
   6.190 +!!#l<-2[`D4O!g)!/:CP!-J2>!6kEB!/:=M!6kEB!/:@N"_.N4-&#4o!!+Bfnc&TC
   6.191 +rW)p[!E#*YrrC:B!!">Crr@cP!!^[Is#^8]-2miD4T5<_bl@]QrVur5pAY0U-2mlG
   6.192 +L&\pd!!'e0rrPFc-MWl,jjO/2hZ*YkK)aL'!WW4mW;csL!!(oarr>1V!!#lJs7ZHo
   6.193 +!!#[dQ2p%#rrQR.5gfT3U\t/o4TA:X!!+D;r;QaCqZ$[D;8<#.!0mH_!@?n-rr@cP
   6.194 +!!%`?rr@cP!!(7/rr>1W!!+Alr;ZiNrr3'H!!">?rrLfsrVlj[rW!%Ss5kX)!!>@`
   6.195 +s1eO5!'J^0".oPnhq%f/!!%NHrrC:B!!#.QrrY@`!%%F?!6k3<!Bd.Trr>1\!!(7A
   6.196 +rrC:B!!%`MrrC:B!!%-=rr>1W!!4HVk4&BNFT)7?g%YLHU](5nA,Q?,L&M&Vbl@]*
   6.197 +!!">Drr>1\!!^[Is!7XF-1q3;L&M&R-0A_:!!#mkrrPFc-MWl,jjO/2hZ*YkK)aL'
   6.198 +!WW4mW;csL!!(o`rrJ?Hr?VM-A&!Wqp&>'n!)*'P!9Mr7!al!ndf0<^r;ZsHbl?fO
   6.199 +rVupqr;QaCr;ZmFA*3Ue!/:CP!%%UD!/:CP!/9h?!/:CP!6jg0!Tk^-!!dV"^Wapa
   6.200 +s&&aq!0mK_!%%UE!2KGk"S6+'!)`aq!%%UE"3gfF-2RZBPlC[b,ldokdf0EA!!(p-
   6.201 +rrN0#J,K<Hbl.SB4Sf!Yk(T'!rrY@`!%%F?!6k9>!Bd.Rrr>1\!!(7ArrC:B!!%`M
   6.202 +rrC:B!!#.Zrr>1Y!!4HVk3i6O49,@-pAY,HrVuqPr;QbNrW!/Hs8P1]!%%UD!'L5\
   6.203 +#0d,I,ldp-oD\e:rVusr-2mlE^\Ig15QE/+Q2p$prr_-Y!5F-cf`)!Q!2$4i"+L:N
   6.204 +hh(m#rrN0#9D=_PjkB_9?iWI@rrL=irVusFbl7VBZ2FY&L&M#O-2mlEL&1fPg"HE*
   6.205 +L&M&P4T59[^]"35A*s9uPQ1\0li-rprVupEqYpPjrVupqrr2t?rVusFbl.PBUF#m>
   6.206 +"""!I^]"35-3!oEFSl+>-0G4,!'L5\!2J$C".oPnhq%f/!!%NGrr=AE!!'e2rsFu:
   6.207 +!!$O/s#^8]-2@K?bl%MC,uMGPrr>pq!!(7@rrXPI!/:=M!6kEB!'L2Z!'L2[!@<Hc
   6.208 +rrY@`!%%@=!6kEB!+Ys,$=a&9-0G7-49,@-rVlj[rW!/Hs8OAF!'KlQ!2KAj!)`Lj
   6.209 +!^H`4pm(pAdf0F,!!'ccs4I>Q!!&Xirr[`N!8iD.TDnrm!)*'P!9Mr7!al!neGfQn
   6.210 +-2dfD^\n*3A,QB-Z2Xb'A,ZH/4MUjp#/<8#!5JPfrVup\rVllArVup\m/I-@4L+5P
   6.211 +!%%UE!/:7K#UKHN-0G7-jsC!,"=7Q3@jV$Q"$HV`L&M&P4T>?\bkqG@4T59[A,ZH.
   6.212 +A(1G[T)\lKf)GdO!.XnG!)`^q!@>M[rrKl3r;[$as8P1]!%%F?"m.*2!%$=qrrq)0
   6.213 +Z2aiXrVuq?r;QjF!!#.YrrC:B!!#.Zrr?R.!!%-;rrJmKo)AeS!!">=rrqO2!!">:
   6.214 +rr3,F,ldokrr3'_!!">Drr>1\!!gaJs#^8]-0G+)!R0^'rr>1Y!!'e.rrPFc-MWl,
   6.215 +jjO/2hZ*YkK)aL'!WW4mW;csL!!(o.s.B;m!!#[dQ2p%5rrDf_rrQR.5h5l8fd6Rs
   6.216 +!2KDj!'L5\"XVCms5kX+!!=N04=0q+!i,dLrVup\r;QjF!!"=prrA;_!!">?rr?R.
   6.217 +!!&8_rrAhe!!#mqrr>pq!!#mprr=AD!!&8^rrAhn!!"=orr\kn!8m&@!;Gs^!WW4M
   6.218 +qu6]M-2dfF4?Oqe!!]4us#^8]-27E>;>pP(4JV'=s1`%D!%$e-g&:sT-,9K[k&gS&
   6.219 +!@?n+rrC:B!!#.ZrrBh4!"!/Zs8Uc:49,@koD\nT!!"><rr>pq!!GF!bbHK`!!%`P
   6.220 +rrY@`!%%UD!'L5\"3gfFL&M&Q4L+nc"GJ-%-0G.*!2KGl!)`Ii!^H`4pm(pAir9#Q
   6.221 +o)AgL!!'dtrrqQ/UP4EGmJd:N;*<(Mrs7ces3/63KqllarrRm:FP6Zq!!&Xirr[`N
   6.222 +!8iD.TDnrm!)*'P!9NSI!a(NXo)Ac!!'o*7!)`[p!2KAi!5JI4!'L8\!M^t8!!>@`
   6.223 +s-3K_!/:@N"!mpI-.Mqp;>pOqL%tZJ^]"354T59[U\Ffi-'\B.!'L5\!/:CO!+Z!.
   6.224 +!@?n,rrM7.rVurOeGfWC!!(p@rrVpSYOVVo!!%NFrrAhf!!+CNrr3'_!!">>rrBh3
   6.225 +!<+;C!!">Err>1[!<+;B!!%`NrrC:B!!#.Yrr>po!!+Alqu?_=oD\nT!!"><rrBh.
   6.226 +!!#.[rrY@`!%%UD!'L5\!6kHB!%%RDr[%LC!6k??!)`[p!2K8f!^H`4pm(pAir9(P
   6.227 +@,LVV"5a(Y^Zkb!jsBp*![V@JnG`TE!!#.[rrTrh^Y/VeL&NCq!!4HDZ2O\(UP7k0
   6.228 +rrXPI!6j0s!WW4mW;csL!!(o0rrQ%DKqSGI!!#[dQ2p%5rreqo(m"F`rrQR.5h5l7
   6.229 +4T5<\U\FcgU](5n-2miEfhqSG!@;jerrC:B!!%`NrrY@`!%$.p"0j-P4SJdWF8u<*
   6.230 +r;Qi5;'l2A![T.Hqu6Y+rVur5rVll4rVuqPqu6XYrVurBeGfWC!!(p?rrZX/0X(*J
   6.231 +!WW4Mq>UJj-2ITC-"HQFrrY@`!%%@=!M^t9!!+C@rr3#C-2%<=-2dcCbl.SB;>U:m
   6.232 +;>1%j4S&LS@fQKTo`"oFq#CFAbl.PD49,@-rVljprVurBrr3#C-27H?4So'XFT)7?
   6.233 +4SA^U5QE/+Q2p%+rri'%!+=^Xrr_-Y!5Idu!0m9Z!@>t[rr[rT!'L8\!87>O!5I7f
   6.234 +!'KoS#*f/fPQ1\0rr3'H!!(6srrN0#T;_blIfKK+e,KJH-"HWJ!i%&=`W$$^!!">$
   6.235 +rrTrhZ24J%fnH^,rrTH&FPQlt!!#[dQ2p%5rs%ot!!!jsp\+Ug?iWIBrr^J--&)$l
   6.236 +"-b)XFSl(Bfp%1Q;2)d^rrQ[V;>^@qYpC]ke,KI2bk1o9UVHX)!9X:)!9X+W"6NH,
   6.237 +L&:lOZ"'$prr^Ik!)_5F".oPnhrt(?\,H@.0X(0L!WW4Mq#:BWA,R\T4ET`_rrZ*u
   6.238 +!'KrS!p3u=qu?dEA(ge[!SL?J!!O[&@fQKkr;QcMrVuqnq>UMk4=0q+![Tsnnc&^E
   6.239 +,pd[)rrJl@qu?apg&1jPF8u;NrVlu7,lg(*rrV=[-2[`D4JV`P!%%UE!2K5e!^H`4
   6.240 +pm(pAiVrm[rVut,ht[3RhZ*Ykl2LsA!!"<-4=0t,!@?n!rr[rT!'L8\!2KMn!0l4;
   6.241 +!'L5\q^)4A"/GnrA,ZH4g&M'u!!(6srrN0#T;_blIfKK+eGfN5rVurBp\tBY,ldq!
   6.242 +a8Z;),ldoko`"u7-):)3!Tmnj,m+,I-0G.*"MZ5_!2KGk"PG($!-I&s!WW3npQbg@
   6.243 +li-rer;Zm9O8&GL!al!n`;]l#k(<X+rrCa#rr\kn!8lu>!#YY7!AL_OrrN0#J*Ht8
   6.244 +k$qoSo)Aj:^P/H,p\tBLP_Fh+rr3&)L$&:4!jPUepAY<Yb`mh*k1fn9U],rIg%kXK
   6.245 +bfoq`!872J"m2&';2*]urrAhn!!#.RrrPFc-MWl,jl-4>\,64,@,Lh\"5a(Y^Zkb#
   6.246 +K`D*8rr2tPrVuq.o)AfG!!#.[rrQ%D4PB`;49,A'k5>5\fp&92rr^q:-"HrS"!mpI
   6.247 +bhE'u!!&Xirr[`N!8l<+!/:CP!6k3;!0mH_!0kP(!/:CP!/:+G"JYqs-0Fn#!JMiq
   6.248 +!!&8]rr>pq!!#.Yrr?R.!!">$rrN0#9D=_Pjm2pHYPS;$(m"FfrrQR.5_B#jrr\kn
   6.249 +!8lu>!-%f8!AL_QrrN0#ItI^Frr>1\!!&8UrrPFc-MWl,jl$.=&GlG.@,Ln^"5a(Y
   6.250 +^Zkb#K`D*8rVlta!!">9rr[rT!'J^0"$?P`L$nsC,ldqhgA_3S!2$4i"+L:NhphZ+
   6.251 +L&M&PbkM,;4T5<\bfB_c,ldokp&>':-2mlE^\7[-A+os'L&M#PjsC!,!@?n+rr=AD
   6.252 +!!'djrrN0#9D=_Pjm2pHfD,CJ(m"FhrrQR.5_B#jrr\kn!8lu>!13K]!AL_SrrN0#
   6.253 +ItI^GrrBh5!!">:rrPFc-MWl,jl$.=3;EOT@,Lt`"5a(Y^Zkb#F8u;'rVluD!!">9
   6.254 +rr[rT!'KlQ!SP]VrrY@`!/9k@"!mpIbhE'u!!&Xirr[`N!8l<+!/:CP!6k3;!'L5\
   6.255 +!6iOa!5JL5!+Y^%!'L2[!/:1I!+Ys-"!p&l-2mlEL&M#OU\k)l^]"05jsBs+!/9;0
   6.256 +!WW3npQbg@li-tZpAb73O8&YR!al!nK)^T*".oPnhrk">\+]k'0X(HT!WW4MK)a-r
   6.257 +!+Z!.!+YX#!^H`4pm(pAi;WdZpAbD*huDR6!5Idu"$?P`FT)4AUAt9?rVm)a@lu&"
   6.258 +A+T[!",-^T4T>?_fd.r>r;Qu+49,@-4JVoU!`:8=qYpUo-&)$l#Wr(eL&_1sbi\d%
   6.259 +"/@.gg&D!R,ldqhr;QeO4T6W-;5<:R!WW4mW;csL!!(p+rr@cP!!(7;rraVJ!%$dK
   6.260 +rr>pq!!(^Grr@0=!!#.Vrr@cO!!GF;s8Tk5!!&8^rr@0=!!%`OrrAhl!!#mQrrN0#
   6.261 +'DEgR3U/j0"SMg"(m"Fk?iWHDs+^OUT)\jNk<K#(o`,1MYQ+V&!.TV#cMmkjrVurO
   6.262 +oD\kW!"/KJ!'/t&!$(Y3"CT+I!5Idu"$?P`L&V)TbU!5hA,cK/KdHWs!@?Furr[rT
   6.263 +!'L8\",-^T4T59[U\Xrp4TCWG!%$=rrr\Jc!%%=<!^$G_rZqRF!<+8EFT)4A49,A8
   6.264 +rr3'H!!(7BrrLe8q>^M*kPkS`!2$4i"+L:NhphZ+L&M&PbkM,>,ldokmJd3OL#2h4
   6.265 +js:!-4SJdT^\\!2-2IQ@^\n-44T,3\F<sf^rr>1Z!!#.[rr?R,!!#.<s3:TI(lqr&
   6.266 +5_B#jrrA\A!!G!Z!!%M#s3L]F^]"354S&LP5f3R%^Zkb.49,A'beIX6!!"=us8S>Z
   6.267 +!!#.\rr[rT!'L8\",-^T4T>?bfd-Uu,s3LQ!!1<srVup\r;QjF!!#.Srr>1T!!(^O
   6.268 +rrY@`!/:FP"!mpIbl7VB4T5?[-2mlE^Zb\!!!&Xirr[`N!8lc8!p4Ser$;A+g&D!O
   6.269 +L&M&PbkM,C,ldoks8UbLA,-'6Kfk(hs'l$/;?+Cb4Cb/]rrM8Hr]C6ZPih]>!+Z!.
   6.270 +!2K8f!'L,Y!@?n)rr>1\!!#.Qrr=AC!!">Drr=AC!!">%s3(HE#lm5Bs+^ORT@!W=
   6.271 +ItI^HrrAhn!!&8Srr>=%!!'durr>1V!",M$s5kU-!%!?CA,ZH4U]:@J!!#.\rrZa2
   6.272 +!'L8\$p4Li--ZDhPU03,s'u$.!2KPn!/:CP!2K5e!'KuU!%%UD"!mpIL&V)V,ldqh
   6.273 +s8RfP!!ebgs03jM!/9Y:!WW4mW;csL!!(p9rrJl@q#CClrr2t?rVurBp\tOG!!">F
   6.274 +s!7XFA,?3*Z2O_)U]2Y>!!">C!!+Ciqu6\N-2RZC-$8q^"Qh!1!'KuT!-J2?!B`LD
   6.275 +!!'e2rr@cP!!+D!o`"pEqZ$UBrr2uOqZ$UBhZ(h#"(5(.5_B#jrrA\A!!Ej_!!%M#
   6.276 +s3CWGF<sfSrr>=%!!'durr=AA!!+CNrr2t?rVur5rr39e!!$O/s+LFQ4T>?b49,@D
   6.277 +s8Skn!!'e0rrhp>!!">ErrXPI!'KoR"?ZYa-&)6?r;QjF!!%`Prs^7S!6kKC,ldq!
   6.278 +s5mf;rVurOkl1\a!2$4i"+L:NhrF_:^\7^.4T>?`49,@-k55/cbeJjc,ldoks5kX,
   6.279 +!!';$rr>1\!!8Db-2.B?-0G1+!+Ya'!/:7K!+Z!.!2K;g!SJdu!!0igrVuq?qu6XB
   6.280 +rVuq_oD\fcq>^W4s8R3;!!(7#rrN0#'DEgR3U/j0#5%s"@,Lul!'l/9LAq@J!!#"A
   6.281 +5QE_8!!X!an,E@fItI^4rrPFc$MYqJ3T*.&*q]L95c4S^^Zkb",ldrE,lpl<r;Qj]
   6.282 +!!#mprs=AZ!'L;]K`D*8rr39e!!%-@s%rar;>:(jL&M&RL&[D:!!&edrrY@`!/:+G
   6.283 +"!mpI^]+6@,ldqhs3(HC-*^;nrVusFUZ_XY!!&Xirr[`N!8li:!/:CP#<[^)b]Egb
   6.284 +A,cK849,@-s4O0$4=)<M!!=PIs&&aq!%%RC!2KMn"""!I-2%<=A,cK.Z2FY),s4:9
   6.285 +rVupEqYpQ1rVup\pAY+TrW!"0s1eO5!'L2Z!0mH_!'KiP!+Yj*",6dT-2mlE4T5<\
   6.286 +Pi)KB!!#[dQ2p%3s7QEn@,Lt`!al!nK)^T*".oPnhrk">^\7^0&:a0JrrN0#ItI^4
   6.287 +rrPFc-MWl,jl$.=@.sX*5em?V!!'durrXPI!6k6<"!mpIL&M#XK`D*8s8RcQ!'L8\
   6.288 +#s81fL&_0!!!'e-rs1^e!%%5!!!#.QrrY@`!/:+G"!mpIbl7VG,ldqhs.fDj![V@=
   6.289 +k5PJ_!2$4i"+L:NhrF_:;>pOqZ2O\(P[ikTrr>1\!!">;!!FVJs5kX,!!%->rr>1\
   6.290 +!!@?Cs!@UD#>r7[YpBAM-3!oE4T5<\PlC[_Pl:X_-2RWA;>pOqU\FcgPl:Xf-1h0!
   6.291 +,ldokr;QaZrVuqno)A\9rVuq.rW!!^s4RAO!@>#M!!$NdrrN0#9D=_Pjm2pHhtR0P
   6.292 +@,Ln^!al!nK)^T*".oPnhrk">TD8Hg&:a0HrrN0#ItI^4rrPFc-MWl,jl$.=5ktB\
   6.293 +5em<u"5a(Y^Zkb#,ldqhq#:FB!!%`Ors=AZ!'L;]K`D*8rr39e!!%`Qs!7Xkk4\fT
   6.294 +U](5n4T5<\U\"Kf49,A8p&>+?!!(7Brrj\K!6kIsqu?dEFQVZa!WW4mW;csL!!(p:
   6.295 +rrA;_!!4Hgk5##W4R`=N4T>?\L&M&T-0G7-U](5r-0G7--2mlEPl:U^A,ZH0^]2(J
   6.296 +!!Hg3s._^T!!$O+rrBh5!!#mjrrM^;rW!(Cs3/\5rVurBrVlsG!!">9rrCaO!!ah'
   6.297 +,ldoks)e5?!Fsg^!!#.=rrN0#9D=_Pjm2pH\,$(*@,Lh\!al!nK)bWG!i%l3r;Qhn
   6.298 +4GDbo!L/;Nrr\kn!8lu>!-nA@!YBkMqYpTs!.TV#]Dhpt!%.K,!9N/=!#YS5!AM:d
   6.299 +rr_-Y!5Idu"!mpIbkV2?,ldperVm1$!!$O/s+LFQ4T>?e49,A8s8OAF!6k-9!'L/Z
   6.300 +!%%49"$?P`L%YHJ,ldqhrr3-J!!(7CU](5o4I"h)!WW4mW;csL!!(p9rr>1[!!4HV
   6.301 +k55/Y4Sf$b,pcEBUWgq.!!#.[rr=AE!!?a2s#g8\!+Z$."$?P`-2dcCPl:XaL&Z8o
   6.302 +!!9EZ-2[`C4So'X4T5<\^\@a.A,QB.,piEg!0mK_!6kEB!'KiP!0mH_!^-K/rVuuC
   6.303 +-2mlJ^],S[!%$P&!WW3npQbg@li-ruqu?b*ht[3Q?iWI(rrC9ZrrCaO!!&8_rrCaO
   6.304 +!!&8DrrZa2!)^H0".oPnhrk">./a,I&:a0DrrN0#ItI^4rrPFc-MWl,jl-4>a8>o<
   6.305 +0X(?Q"5a(Y^Zkb#,ldqhq#:S/!!"=hs8Skn!!^4<s+LFQ4T>?f49,A's8P1]!'KlP
   6.306 +rrTr4A,Q?,^\e'3L%>6G49,A8p&>+?!!'e5rs9tO!6kK*,ldper;QhP,uNn+!WW4m
   6.307 +W;csL!!(p8rr>1Z!!+C"r;QaZrW!$_FHk#GrrXPI!'L5[!2KJm!PcDK!!+D.rr2s\
   6.308 +rVurOrVllArW!"Rs#g8\!%%OC!Bd.RrrAhn!!#mjrr=A;!!#mqrrC:B!!#.Prr>1\
   6.309 +!!7lSA,ZH.;>pOt-3+!-rVur5i;WiY!)*'P!9NSI!V[0)!!-KbpAY2%!'n6t"S4_U
   6.310 +-)8BX!6kEB!/:FP!6kEB!/9J5"$?P`-,'<\T)\lKkl1Y'rW!!2J+*+2!WW4MK)`I_
   6.311 +!^H`4pm(pAiVrmkrVusQYPA,"hZ*Ykl2Li3!!(7<rrBh5!!4H/4T5<\4T>?_K`D*8
   6.312 +rr30b!!#.]s.fPn"!qH24T5<\Pl1O];>pOq-1V!;49,A8p&>+?!!%`PrrsbL!6kKC
   6.313 +A,ZH.-2p"/,ldokkl1\a!2$4i"+L:Nhr+M8UHJGS!'L5["$?P`-2.?@,ldp-r;QaZ
   6.314 +rVusr;>pOqA,ZE-4T5<\bl.PAbl.SDL&X:3!!,3Wq#:IZ!!">-p\t4>q#CFA-2mlE
   6.315 +-3!oEbl.SB4S\pWbh;sp!%%UE!mL\>q>^V-s8R3?!!%-!rrN0#9D=_Pjm<!MY5eQ1
   6.316 +ht6pM?iWI*rr@cP!!">$rrQ[mZ0M>hbl.SBL&V)Pbl.SBL#`18,ldok^&J2,!!(p?
   6.317 +rrd9@&:a0@rrN0#ItI^4rrPFc-MWl,jl6:CpD<laYP.tuhZ*Ykl2Li3!!(7;rr@cL
   6.318 +!!+D!rr3(S!!#.\rrY@`!)`aq!+Yg)!@?FsrrAhn!!%`CrrY@`!/:+G"!mpIPlC[b
   6.319 +,ldqhrr2s\p](;9kl1\a!2$4i"+L:NhqnA6^JXq0!+Z$."!mpI-2.?@,ldp-r;Qc3
   6.320 +q>^OBk5G;[4T5<\bl.PAU](5pL&X:6!!4HD^\@a.L&M&PA,$!'U](5p-&%'PbQ@hE
   6.321 +-2mlMg&M*7,ldokk55/`ffT67L&_1frW!'Is8V4-qZ$`Os8Tk5!!#.>rrN0#9D=_P
   6.322 +jm<!K:gi2OrrQR.5e[0tPl:X_4Pp)?@fQKTlMgk.rVuqPrr2uBrVuqPj8T3-!!"=Y
   6.323 +rr\kn!8m&@"8=3nn+-J[!!%M#s1A:45QE/+Q2p%+rrTAXYOqhshZ*Ykl2Lfp,uO@8
   6.324 +!L+o/!!,48rVlu)!!&8_rr]MP-*dFK!JMiu!!4HVk55/\;#gSBnG`SQ!!%`Grr[?h
   6.325 +-0G4,!^$H/r;QhP,piNj![Tt(kPkS`!2$4i"+L:Nhq\53U](5n-3!oH,ldp-pAY4@
   6.326 +!!">Brr>pn!!$O,rr>1\!!(7Arr>pq!!8qq;>pOr;<IcU!TqW)rraVJ!%$e%rr>1\
   6.327 +!!$O*rr?R.!!&8_rr>1\!!,4RrVlnP-2mlH4TGG'rVup\rr2s\qu?^CrVm!H!!">-
   6.328 +iVrrZ!)*'P!9NSI!9`kO!al!n]`/(D,s9E.rr>1\!!(7/rrC:B!!%`PrrC:B!!%`5
   6.329 +rrXPI!'Isp".oPnhs(.Ap[@VO!WW4MK)`I_!^H`4pm(pAir9#Ao)AgL!!'ddrr^#i
   6.330 +L"Z>&!SQ/trr^#iKqnJD"Qh!1!/9qB",/$`k3`0Kbk_8=k5NTcrrN0#T;_blIfKK+
   6.331 +j8T1cKtmTd"S3o>!%%XE"!mpI4SJdW,ldokqu6Z2qu?aDk5>5Z4T5<\U]18nL&M&S
   6.332 +-0G6&rVusFU](2tfjc<.L&_1;rVuq.p\t6.r;Zi4qYpQ1rVup\rr2u'r;ZsHFG3R<
   6.333 +qu?h@s8P4\!!%-?rr@cN!!%->rr=AE!!&eQrrN0#9D=_PjkB_9?iWHWrr>pq!!&8L
   6.334 +rrC:B!!%`PrrC:B!!%`5rrXPI!'Isp".oPnhq%f/!!%M#s1A:45QE/+Q2p$prr_-Y
   6.335 +!5Gf="ChE3-0DB1!WW4mW;csL!!(p;rrCaO!!">E49-],!!#.\rrXPI!'KuT"!mpI
   6.336 +-2RWAA,QB-;>^@n4T,9Z-2dfDA,cK.4T,6^,s4:9r;[(4s8P1]!%$e%rr>pq!!#mk
   6.337 +rr=AE!!(^Orr?R%!!%-?rr=AE!!&8_rrCaM!!(^Nrr?R.!!#mTrrN0#9D=_PjkB_9
   6.338 +?iWI"rrTrh^]"05g#h]%"6Ri-L&M&SUWgsEmf*:2rVuqPrr2uBrVuqPkPkY.s8UdO
   6.339 +!!#-prr\kn!8lB-!WW4MhZ!bS@lukNPi2QBP_Iom!JU.Arr\L>Ktm9[!5JMe!87&F
   6.340 +!87@*!5I@i!^H`4pm(pAdf0F,!!'d=rrXPI!+W/2!WW4mW;csL!!(p;rrCaG!!BM+
   6.341 +s31HB!'KuT"!mpI-2RWAbl%MA^\e$24SJgU4T59\bU)u`"!uY#U](5nA+op&-2mlE
   6.342 +^\Ig/L&M&PL&M#OA,$$)4MUjp!%%UE!6kEA!%%UE!'L2Z!2KMn!%$V(!WW3npQbg@
   6.343 +gA_4^!'n6t"6NHCU]19$^An6[k5Sp;!$sb4qu6\l;>VXEFT;Ap,lf5;rW!'I!!"<B
   6.344 +qu6]ZPl<cGFP6Tl!6kEB!/:FP!6kEB!/::L!M`Nk49:/hq>U]^@jNE$,pd[4!!$NB
   6.345 +rr\kn!8lB-!WW4Mhu<^>!<"2F!%#DCrrI4qrr3!]-/JS&@fXaNrs$[n!$rokA,$!)
   6.346 +ffT96,ln!Up\t7k!<+8F!'K-<!^H`4pm(pAdf0F,!!'d>rrAhn!!'d9rrN0#T;_bl
   6.347 +IfKK+j8T.6-2ITB-):G="!mpIL%bNK;#gSBqYpP*rVupqqYpOXp](:Vqu6`h@jV!P
   6.348 +"XR%.s8RfP!!'e-rr[?C!+Ya&"$?Q0g&1jNUHJJT![Tt(qu6a\!!">Crr@cP!!'e3
   6.349 +rrhI1!!">(rrN0#9D=_PjkB_9?iWI*rrZ*u!%%XE!/:CP!Fn7h!!'e4rr>1V!!:jR
   6.350 +-2%<>-0G1+!FmGQ!!,sMrr2uBrVuqPrr2uBrVuqPr;Qf&-2ITA;>^@oUF#X7!/8,d
   6.351 +".oPnhq%f/!!%N,rsDU'A*3gkk(Nd]k3;mIbQ*@rrrJ@<hZ![f!!(7@rs'hr^]4=D
   6.352 +!/:4J#Wr*@s8V4D!/:7K#]p&Vk5YHk!)_YR!^H`4pm(pAdf0F,!!'d>rrZ*u!%"`H
   6.353 +!WW4mW;csL!!(p9rrM8HrB(*jU\k&mfnG[_rrRn.g%t^K-2mlE^\[s14T5<\;>rZY
   6.354 +A&%g=#Nhe8;*9Q-k5G;^YpBBIo`"sFbk1o9PihfA!87@qq#:H24?TnGrrSEpZ24J&
   6.355 +UEq4.iVrrZ!)*'P!9Mr7!al!n^&J'prW!&Es8RfH!!#mqrr>pj!!:CE;>'ti-3!oF
   6.356 +bWPY#!%%XE!6kEB!/:FP!6kEB!/:CO!2K8g!)`^p!2K2e!/8,d".oPnhq%f/!!%N-
   6.357 +rrV=/-2[]D@fV5IrrUCEL"lV2ffT6\!6kEA!gE\=rVlmE-2IQB^AqdBrrVd<-2IQA
   6.358 +,piKh!^$J9i;WjD!%.K,!9MZ/"5a(Y^U!kA49,A'XT&>%!2$4i"+L:Nhn/mgL&M&P
   6.359 +4Sf!W4T5<\bi\p+k01@8!TrP&rrN0#9D=_PjkB_9?iWI*rrY@`!%%XE!/::M"XRY)
   6.360 +!!">Err=AE!"EFl^S<mk-0G7-P]T#6rVup\re1@*rr2s\r;ZmF@o<4*!%%XE!6kEB
   6.361 +!/:FP!6kEB!/:FP!Tk^-!!">E4T5<a-0G7-jsC!,"?_BlF=$kc!/8,d".oPnhq%f/
   6.362 +!!%N-rrUCE4T#-[ffWdCrrhJ<@s"LBrsuku;2)dbs-.U*;2)dbP_K&8"J^'9L"ZG)
   6.363 +#JYumk(QZdg%YLNfd.quK`K?qrrP;/k5G;]F9')PrrSEIL&CrO4=0k(!nf\5r;Qh?
   6.364 +!6jC$!^H`4pm(pAdf0F,!!'d>rrUD,;60]u!!&Xirr[`N!8kEg!%%UE!2KAi!'L5\
   6.365 +!6g&pp\t9p!)*'P!9Mr7!al!n^&J0s!!">Err@cN!!ssqs+LFQ-0G6\rVup\rVlrP
   6.366 +A!Hlj!/:CP!/:=M!+Ys-"-iicbl.SB;?$Rqbl.SBL&V)Pbl.SBL&V)PA,ZH.A,cK/
   6.367 +^ErjZ"53_SA,ZH.A,ZE.o0!!P!2I7-".oPnhq%f/!!%N,rrOJm^\7[-U\uJ?!'JL(
   6.368 +rrHU0rZqpPA,fCP!$rqFs#_V,rrUD,!<+8F!-J5?!ehqbrZqUG!2K>h#0^T>s+LHs
   6.369 +rVlmE-2dcEUB$#=rrFDlo)AbR!86<1!^H`4pm(pAdf0F,!!'ccs4I>Q!!&Xirr[`N
   6.370 +!8kHh!5JL5!%%F?!'L5\!6g&pp\t9p!)*'P!9Mr7!al!n^&J0\!!">Err@cN!!C"9
   6.371 +s+UFP"3gfF-2mlF4L+V[!0mH_!/:@N!Tk^-!!&enrrC:B!!%`PrrC:B!!%`PrrC:B
   6.372 +!!%`Prs'hM!'L;]^JXq0!'L8\"!mpI4T#-YL&M&Pbe=#YT)\lKf)GdO!.Wr,"bcpV
   6.373 +-$6ours5k04PBc7PQ3iFrsWuLA+T`l;#lj\bQ*@rrrG5.rr3Wo!/:IQju`Wts8RcQ
   6.374 +!0mN`PQ3$%rrRlSbl.PB,s;,*!mCXSoD\lG!+YX#!l"^thu<aC!%.K,!9MZ/"5a(Y
   6.375 +^OlL<rrN0#T;_blIfKK+]`.t/rVuq?q#:=VrVurBK)bTF!WW3npQbg@gA_4^!'n6t
   6.376 +"!mpI-3!oEL&CuOA,cK.FT)7Bbl@^<qu?a[U\Oihbl.SBL&CrNPl:X_A,ZE-bl.SB
   6.377 +L&V)Pbl.SBL&V)Pbl.SEL&_1frW!"RUHJGS"=;:ls4RAO!/:=M!/:CP!6i.V".oPn
   6.378 +hq%f/!!%N+rrJlWrW!!G4I#gE!^%d^rVm(U!2KSo,piNi#3I4/s3(Isrr30b-3+"?
   6.379 +!+Z!-#P05fs8RcQFT)4@493UurrRlSbl.PB,s;,*!mCX,o`##g!%%7/rr^Ik!5IFk
   6.380 +!^H`4pm(pAdf0F,!!'ccs4I>Q!!&Xirr[`N!8kHh!%%UE!87/I!'L5\!6g&pp\t9p
   6.381 +!)*'P!9Mr7!al!n^&J0\!!">Err@cO!!(^Orr>1\!!(7BrrJl@qu?a[g%t^Kbl.SB
   6.382 +L&CrN;>pOq^]"04bl.SBL&V)Pbl.SBL&V)Pbl.SEL&_1,rVupEqu?aDL&M#Obl.SB
   6.383 +^\e$2L&M&Pbe=#YT)\lKf)GdO!.Wi)$e^4r,ldp-k5YH-4T,3`bQ(N?bQ)/KrrUCE
   6.384 +L&V)V4=1%-;#ni<rru=#bl<@sbl.PCF9'PXrrRlSbl.PB,s;,*!mCX,p&>,h!%#k]
   6.385 +rr^Ik!2JEN!^H`4pm(pAdf0F,!!'dns8L5os8)`s!!&Xirr[`N!8kKi!87>O!'L#U
   6.386 +!'L5\!82u(p\t9p!)*'P!9Mr7!al!n^&J0\!!">Err>pq!!">Drr>1\!!(7ArrV=m
   6.387 +-2dfE-):A;!6kEB!'L2Z!'L5\!6kEA!6kEB!/:FP!6kEB!/:FP!6kEB",6dTL&(cM
   6.388 +-&)6r!6kEB!6k??!/:CP!6i.V".oPnhq%f/!!%N%rs-;$!)`d?!!)mB"TU[bK`Hi&
   6.389 +rrUCEL&V)U4=1%-4=0n)#)*&As+LHsrVlqQ!6k-9!egWurVlmE4T,3\bQ)/Hrr[rT
   6.390 +--Z#]"0j-PUYYqO5QE/+Q2p$prr_-Y!5IUp!FmGT!!4HDg#i;7U](2n,uNLu!Du_k
   6.391 +rrLeMrZqPup&>#%rZqSBg#W/7!!&Xirr[`N!8kHh"(M<WZ1n8#YpBBIK)bQE!WW3n
   6.392 +pQbg@gA_4^!'n6t"!mpI-3!oE4T5<\;>pLp4T5<\bkqDAk(P,\!!+D.r;Qc@rVup\
   6.393 +r;QaZrVurBrVm#_,ldq!rr2uBrVuqPrr2uBrW!%Ss8RfN!!,3Wq>UH=rVuq?qu6YM
   6.394 +rVurB^&J2,!!(p-rrN0#J)UD.^P2Oa#4j,es3(HhqLo':s+LH,q>UN?!/:FP"["+2
   6.395 +s#_V)rs"/WPlHF;bl.PCK`K?irrRlSbl.PB,piKh!l"_hp\t>*!'Js,rr]"r-*c8*
   6.396 +!^H`4pm(pAdf0F,!!'dqrrP:_4T:$:49-\Okl1Zn-2miE,uNP!!b23mr;R#T,pdYe
   6.397 +;#k,#rs(Xd@tf"N-/%D[!WW4mW;csL!!(ogrrLg8p&>'Tb_#lfrrN0#9D=_PjkB_9
   6.398 +?iWI*rrXPI!%%XE!'L5\!/:CO!-J2?!2KAi!V8GQ!!%`NrrC:B!!#.Zrr@cP!!&8]
   6.399 +rrXPI!)`aq!6kEB!/:FP!6kEB",6dTPl:X`4MUam!6kHB"=4$J--Z;e!+Z!.!2I7-
   6.400 +".oPnhq%f/!!%N-rrP:_^\[s6494's,s:u&!mCXdr;Qqqbl>leL&V)V4=1%-;#ni<
   6.401 +rrus5bl<@sbl.PCK`K?irrRlSbl.PB4=0q*!egWLq#:CX!'KlQ"*=MhbhN.!5QE/+
   6.402 +Q2p$prr_-Y!5I[r!gE[pr;Qh_!'KKF!B_[^rrhq'!!#.ZrrQ$t^]+67@fX:>rrRlS
   6.403 +L&V)R^Aq-mrrN0#T;_blIfKK+K)_JC!WW3npQbg@gA_4^!'n6t"!mpI-3!oE4T5<\
   6.404 +L&M#OL&M&UL&_1,PhH$8!-J2?!/:@N!6kEB!'L2Z!5JL5!BfuQrrfSQ!!">ErrC:B
   6.405 +!!%`PrrC:B!!n;Ys5kU-!%!?trs.\?,lggBs'u$."XTrDs5m2W!!%_drr\kn!8lB-
   6.406 +!WW4MiVrtD!'L/Y#Nd<Ys8OAkk5G;aUEt$^js;>Orrj\ps3(Isrr30b-3+"0!-J/=
   6.407 +"skSqs+LHsrVlqQ!6k-9!egWurVlq@!2KMm!^%dkq>UM+!+YX#"/>iYo@j3G5QE/+
   6.408 +Q2p$prr_-Y!5I[r!^$J,qu6^D-0G+)!87,H!TrPBrrG5.p&>$Fp&>$Fp&>3#,lhF$
   6.409 +4T59]js<.grrUjR;>L4m;'l/?!@9&RrrN0#T;_blIfKK+K)_JC!WW3npQbg@gA_4^
   6.410 +!'n6t"!mpI-3!oE4T5<\L&M#O^]"374TA:X!!">E4T,6[U\t,lbl.SB4T#-Y-2mlH
   6.411 +-"CF2qu?hos8U=B!!%`PrrC:B!!%`Prr?R-!!FT14=)<Q!!FVJs5kX+!<+;B!!%_d
   6.412 +rr\kn!8lB-!WW4Mi;X`Y!'I%=s8SiV!/:IQPQ3i.s8U:h!5JR6@fU$<rsN<:L&]?s
   6.413 +;?-7f4=1",![RiArr345!-J8@K`K?qrrRlSbk:u;K`K?qrs7a5--ZDh@fU$<rs/.L
   6.414 +PlLcg!%%Kcrr34WL&_28,pfhnbhrF%5QE/+Q2p$prr_-Y!5I[r!`8rmqu6]Mbl.PG
   6.415 +Yrj<4,uNh&rr@cO,n#G,bU!5h,piTk,uO[A#3KDA!$rqUrVm+";;"em!$ua]rrkMI
   6.416 +Z2Z+4rVlqo!/:@N!@9&_rrFDljo5A^!2$4i"+L:Nhh(m#rrN0#9D=_PjkB_9?iWI*
   6.417 +rrXPI!%%XE!)`^q!6kEA!6kEB!^-K[pAb1Uqu6Z?rVup\qu6Yko`,(Vs8U=B!!%`P
   6.418 +rrC:B!!%`Orr>1T!!&enrrJl@p&G(i^&J2,!!(p-rrN0#J)C8-49,B\,m"&mFT)4E
   6.419 +@fRf;4=(!&rVm'a!$s`R!+Z$."sj6qL&X7]rr35I,lf5R,lhHSrrRlSbl.PCK`K?i
   6.420 +rrRlSbl%JFUEq3K,lg(+rrpUH4TGFYq#CC@rr3*I-3+"0p](<<i;WjD!%.K,!9MZ/
   6.421 +"5a(Y^ZPP!YlH(lg%bRQUAuToKjt*/k5PB#;#i_4Kff?Fo7\J:Kn]R,,s;5-js:";
   6.422 +KnVVhA,cK64=):NKleU@L%tZJ^]+66,s;/+!egWhr;Qd[-1h-<@fV5ErrN0#T;_bl
   6.423 +IfKK+dJj70L&O18FMHc6!JQcorrKBhqYpQXre1@7p&>0WP_Fgdnc&WDo?[F<!!#[d
   6.424 +Q2p%#rrQR.5e[1"@fQL+rr2tPrVurBr;QsI!!#.]juiG>!)`Um!6kEB!0m?[!M^t<
   6.425 +!!c@`!!">Fs4RAO!5JO5!87>O!5JI3!JMir!!,3sr;QfA4So*],p`NkKt[KgT)\lK
   6.426 +f)GdO!.Wl*!P`aU49:/uqu6i7F?D[-g&(dPUJX-NU](2sflU)ds-/68rreQK4Cc/)
   6.427 +rrTrhoDS[j^P2:PrrTrhoDAOjfjd-,Pl1Obo7`G/s-3;4rr3+TL&_1fpk8_>i;WjD
   6.428 +!%.K,!9MZ/"5a(Y^ZGJ#F<pne,uKohrVlu^,pi0^rs,;!;?-Zk!)`^p"["*ns#_V+
   6.429 +rrsc3s8PprPl:Ue493.rs#^9krr3&D,pi3`!@9l,rrRlSbl%JB493V"rrh";,li&J
   6.430 +rrN0#T;_blIfKK+df0BD,lmoj!WW41kPkVG;9]%>!@9kbrrUCj4T#-YU\lD<L%kTP
   6.431 +F<po5,lf78o`"u&!6idh!WW3npQbg@gA_4^!'n3s!McFgrr_CG-$9%a"*>hObl7VC
   6.432 +^LR4)!JT5%rrR9g;>:(tPYjP*FP6]oF?Hi-rrTHZU\t,nZ%\tKrs$5l@m"jtg%bRR
   6.433 +fnE9cKp:`Q@thSq".oPnhq%f/!!%M#s1A:45QE/+Q2p$prr_-Y!5IUp%H_aY,ldok
   6.434 +;=jhfPQ6sGrrtS3s8Pprbl.PF^P2^f4=0t+"XQ;2s!8uhrs-:=;?-YY-0G1+!@9&a
   6.435 +rrFE.rVlqQ!6kB@!^$J,p\tDl4?Oo9UZMLW!!&Xirr[`N!8l9*"2=g^U]18q^H;L<
   6.436 +kl1^<!6kHB!JQcqrr^Ik!'L2Z#ep@%k5XR+!5J@0#dF@l^]4=u!%%=<"(M<2bg6:j
   6.437 +!!#[dQ2p%#rrQR.5_B#jrr\kn!8lB-!WW4MK)`I_!^H`4pm(pAdf0F,!!'dmrsIn`
   6.438 +@jM+;s8PprFSpgr,ll0h,pi?d!B_\,rrj]2s3(I?qu6gG4TGFD-2dcD4=0Y"!@9l,
   6.439 +rrRlSbl%JB493Utrr^Ik!5I[r!WW4mW;csL!!(p*rrQ[1U\t,njs;>;rrRlSbhN.#
   6.440 +KdA#F4T,3\;#nB1rrV=/;>L4n4=0.grrR9BPkb7^ffT6\!6idh!WW3npQbg@gA_4^
   6.441 +!%<I!LAq@J!!(p-rrN0#ItI^4rrPFc-MWl,jjO/2hZ*YkhZ!fO491WG4951'"3gck
   6.442 +-2@K@4=0t+"XQ;2bQ*@orrj\ps8P2-r;Qd[-1q3<,s;/+!egWur;Qd[-1_';UB"fd
   6.443 +rrN0#T;_blIfKK+e,KJ3!6k??!b4@GrVm#8Ki*Q=qYpY^@q1c&rs4<U!-Eqds+Q^8
   6.444 +rreQrA!H-Srs+dQs1`YQPih`?"]57^bU#CLrrFDlr;Qd[-2IQA;'l/?!mCXuq>UZP
   6.445 +,pe8!!6idh!WW3npQbg@gA_4n!"ab^LAq=9!!(RL!WW4MK)`I_!^H`4pm(pAdf0F,
   6.446 +!!'dsrrUk"A,?30^Aq.2493V#rrFDlq#:@W-2miI,s;4O!)`Xn"XQ;2s#_V*rrG5.
   6.447 +o`"q<4T59]PQ6F8rrFDlq#:?Ir;QiB!'KED!WW4mW;csL!!(p*rrR9BA+fj&@fZKS
   6.448 +!<?!qrt2L^!$rok--ZB8,lf5;bl8tOrr34u,lf5;!%"E>rs1_L@fRf$!%$=nrrlo-
   6.449 +s8OB-rVlrC!)`[o!b25SoD\l6!0m<Z#0^T>s+LHsci4%H!)*'P!9Mr7"-3E^pO`F#
   6.450 +rrREF(tJWf!!%M#s1A:45QE/+Q2p$prr_-Y!5I^s"6LmUoDAOlYlJnGK`IA8rs"_&
   6.451 +s8P1]g&:pSUEu]84=0t+"XQ;2s!8uhrs$4<;?-YY-2dcD4=0Y"!@9l,rrUjR;>pLr
   6.452 +js<.crrFDlr;Qhn!+Y0k!WW4mW;csL!!(p*rs&'@!$tL,g%t^cF9#hBs8QR/A,lSk
   6.453 +,pfhrs03jrs8RcQbl7VZ,s;5-fd.rLs8Th[!5JR649-\Bs8QR/;=skh,s;/+!mCXu
   6.454 +r;QhP!2K2d"7mfbk4S`UK`K?CrrN0#9D=_PjkB_:VZ6_KK)^W+!al!^ec,[N!.TV#
   6.455 +]Dhpt!%.K,!9MZ/"5a(Y^ZPOu;#i`@rVm,b493.rf`4/5rs-ao-3+"?!+Z!-"]59Q
   6.456 +s#_V+rrsc3s8PprU](2s;#mBks#_V*rrG5.o`"q<4T,3\4=/5NrrQ[1U\Xok;#ljZ
   6.457 +rrP:_^ZPOt!!&Xirr[`N!8l6)!p3u=rW!!GA&&!B!@9&irru=Hk5TN'Pl:Ud@jTh.
   6.458 +K`K?rrrsc3s8QR/U](2t^Aq.2s#^:drVlmE-1q3<,s;/+!mCXur;QhP!/:(F!^$I:
   6.459 +o`"uH!6idh!WW3npQbg@gA_8q!!&@;s+gUU(][+WrrN0#ItI^4rrPFc-MWl,jjO/2
   6.460 +hZ*Ykjo5WL!$sa]Ki',rA,cK6F9"Fub`jCRU]19549/m+^LI7Rs8Ppr;0;j<,s;5-
   6.461 +fd-W?beI!T;?$Rr4=0q*!B_\#rrFE.r;R#,!%"Da@fSXirs_gObl@^r,liYCUHANd
   6.462 +jo5A^!2$4i"+L:Nhp;<1ULPSr!!%`Qs1\PUr;QtT!0mLG-0G%'!egWurr3-J4TGF-
   6.463 +-2[]G,piTk4=0q*!B_\#rrFE.rVlrC!/:@N!egW.p&>(U!+YX#!egWuci4%H!)*'P
   6.464 +!9Mr7"8<?,5_B#lrr^"9!/K,)!WW4MK)`I_!^H`4pm(pAdf0F,!!'dprrHUUrW!!G
   6.465 +4JViS!JMj!!!+C@r;Qq1,ldokFT2:Ffd-VEk5Q`)rr32U;'c2B-&)<t!Dt0@rrGtC
   6.466 +o`"q<;>^@sYpBAM,uOU?!`:8frr32H4='t--&(F[!WW4mW;csL!!(p#rs.\?!!'e6
   6.467 +K`Lrq"9=/U,pi?d!egWurr3-J4TGF-4T#-^494(74=0q*!B_\#rrFE.rVlrC!/:@N
   6.468 +!egWLp\t?K49/m^rrRlSbg6:j!!#[dQ2p%"rrZX/!9\t6M>mZk!!(p,rrN0#ItI^4
   6.469 +rrPFc-MWl,jjO/2hZ*Ykir9,6bfo5ErrUltg%bRJbfoq`!87,H!p7_Ng]%?!bi\Ns
   6.470 +!p7_Nir9&[!2$4i"+L:Nhp_T+Pe[(p#)*&!s+LGMqLo$ds!8udrrRlSbl7VG,s;5-
   6.471 +,s;))"Zue<s#_V*rrG5.o`"q<4T59]bQ)/NrrR9BbkV2?bU!7Cnc&ZE!6idh!WW3n
   6.472 +pQbg@g&D/`!!&(3s,-gYpD<lieGfRM!.TV#]Dhpt!%.K,!9MZ/"5a(Y^OlL<rrN0#
   6.473 +T;_blIfKK+eGfTo!'L,X#0['Es.]R9q#:@W-2dcIk+hPJK`K?rrrj]2s8OAkqu6gG
   6.474 +-3+!--2dcD4=0Y"!@9l+rrFE.r;Qg\-0G%'"0j-uU[\9bK`K?CrrN0#9D=_Pjk9Y:
   6.475 +pFlRapO`F'rr\;^!2n?H!WW4MK)`I_!^H`4pm(pAdf0F,!!'ccs4I>Q!!&Xirr[`N
   6.476 +!8l9*![RiAqu6kB!0mNG,piKh#%Jsas'l&(rVm(D!2KRJ!6kHB"slD3s%rd$rVm):
   6.477 +!'L;]4=0q*!B_\#rrFE.r;Qg\-0G4,!qR^#q>UQM,pge(rrRlSbg6:j!!#[dQ2p%!
   6.478 +rr]G)!0;a3N;j"S(]Z8=rrN0#ItI^4rrPFc-MWl,jjO/2hZ*YkK)aL'!WW4mW;csL
   6.479 +!!(p*rsGM$!+X7Qs4Ll^-3!oG@fU$<rt;(,-3+#-,pge8s3)c8s8RcQFT2:P,s;5-
   6.480 +^AoS(s8V4D!3uS(4=0q*!B_\#rrFE.r;R%t!'KlQo/m#Jrr34fL%G?E490L#bQ[V<
   6.481 +s7:r/qYpVN!6idh!WW3npQbg@fDbq,!"db6s,I$\BE/%9e,KIL!.TV#]Dhpt!%.K,
   6.482 +!9MZ/"5a(Y^OlL<rrN0#T;_blIfKK+df0WK,ldok,ldp-bl.PH49-Zi,lf78rr3S*
   6.483 +,pbZ9,pge8s1\O6--ZB84T>?cUEq3K4=);-rr3!]-2dcD4=0Y"!@9l*rrus5,s3IR
   6.484 +A,ZE1493V*g%YONL&_1s!'L,X!egWuci4%H!)*'P!9Mi4"Le@2+Qn@VO8f<;!!#:4
   6.485 +rrN0#ItI^4rrPFc-MWl,jjO/2hZ*YkK)aL'!WW4mW;csL!!(p(rs%VM;*6sNU\auo
   6.486 +ULQDKPihoD"m0nh4ET`ars#`<A&&%tPl:Uck&`^JFQWQ%!L/<9rrJ@<o`"rGPktC_
   6.487 +Yu*V\U\t,pP_J`/oD""C^]4?*Kp;H6!l'H\ci4%H!)*'P!9Mf3"HNN_3;8%)OoGQf
   6.488 +!!"/1df0@K!.TV#]Dhpt!%.K,!9MZ/"5a(Y^OlL<rrN0#T;_blIfKK+K)_JC!WW3n
   6.489 +pQbg@ec,bc!!"_1K)_&7"HNN_&D,>0!WW4MK)`I_!^H`4pm(pAdf0F,!!'ccs4I>Q
   6.490 +!!&Xirr[`N!8iD.TDnrm!)*'P!9Mc2"ntOf!#X%6s-<TeBE/#<\'Y-V!!%M#s1A:4
   6.491 +5QE/+Q2p$prr_-Y!5F-cf`)!Q!2$4i"+L:Nhh(m#rrN0#9D=_PjjX50E;fh<@,HS9
   6.492 +RK!G_+92Bacd2Um!!%M#s1A:45QE/+Q2p$prr_-Y!5F-cf`)!Q!2$4i"+L:Nhh(m#
   6.493 +rrN0#9D=_PjjO//Qi6sd#\^Dns.95lhiBJj!!,(BcMmqG!$HkY]0HE/!%.K,!9MZ/
   6.494 +"5a(Y^OlL<rrN0#T;_blIfKK+K)_JC!WW3npQbg@dJj7);#L@q&7C9F^SJUGQ[^^f
   6.495 +!!*q'bl7YKJcN7[!%.K,!9MZ/"5a(Y^OlL<rrN0#T;_blIfKK+K)_JC!WW3npQbg@
   6.496 +ci4$l:kA\9!!4!upWNR:QhE[r-Gh)0BD@bmjjO/2hZ*YkK)aL'!WW4mW;csL!!(o.
   6.497 +s.B;m!!#[dQ2p$krrVAM5_9!/!!4!N^V'SuQFN4\jjO/2hZ*YkK)aL'!WW4mW;csL
   6.498 +!!(o.s.B;m!!#[dQ2p$frrCZ&^SS[FpUL6TQFN4\jjO/2k5YLSK)aO("5a(YT;_bl
   6.499 +IfKK+K)_JC!WW3npQbg@K)^H&T`9V0\<[-VdJj7J!.TV#g&D0+!!'L,rr[`N!8iD.
   6.500 +TDnrm!)*'P!9Jh4K)_MDJsNp4!9MW.![%IkK)aO("+L:Nc`$jGIfKK+K)_JC!WW3n
   6.501 +pQbg@K)^H&T`9V0\<[-VdJj;n!!'ccs4dPUpD<lQVuHjK!!(o.s.B;m!!#[dQ2p#u
   6.502 +s+:9Ds+6QHQ2p$orrgpZ!$L`^s4mVVBE/%)VuHjK!!(o.s.B;m!!#[dQ2p#us+:9D
   6.503 +s+6QHQ2p$nrr\Sf!*FjQh>[Sd!!#Qerr[`N!2kF`T>(F-!)*'P!9Jh4K)_MDJsNp4
   6.504 +!9MQ,"@)qe37ic^iVs)UGQ7^TkGJ7ZIt@Zh!!#[dQ2p#us+:9Ds+6QHQ2p$mrs%@/
   6.505 +!!!:<f7O%ars%YI+92BQ\#'*)^OcHS!!$L&Q2p#us+:9&s+:9FrrMk=JcOU,!D)CK
   6.506 +rrC[E^AtZnE2[^UHM3X)jb!Mas+:9&s.KAma%1d^i;`lqT9]EVnq*0tQ2p#us+:9&
   6.507 +s+:9BrrM;t]70fVr;Zh9Z@;nYa-6N'nq*0tQ2p#us+:9&s+:9&s4.,LTD\`ihh(mE
   6.508 +rrDVAQCO6@jb!Mas+:9&s+::$rrA\i!!(o.s2"^8nq*0tQ2p#us+:9&s+:9&s4.,L
   6.509 +TD\`ihh(mErrDVAQCO6@jb!Mas+:9&s+::$rrA\i!!(o.s2"^8nq*0tQ2p#us+:9&
   6.510 +s+:9&s4.,LTD\`ihh(mErrDVAQCO6@jb!Mas+:9&s+::$rrA\i!!(o.s2"^8nq*0t
   6.511 +Q2p#us+:9&s+:9&s4.,LTD\`ihh(mErrDVAQCO6@jb!Mas+:9&s+::$rrA\i!!(o.
   6.512 +s2"^8nq*0tQ2p#us+:9&s+:9&s4.,LTD\`ihh(mErrDVAQCO6@jb!Mas+:9&s+::$
   6.513 +rrA\i!!(o.s2"^8nq*0tQ2p#us+:9&s+:9&s4.,LTD\`ihh(mErrDtKjdbE4pk&Nt
   6.514 +s+:9&s+::$rrA\i!!(o.s+:9&s+:9&s+:9&s+:9QrrA\i!!(o.s+:9&s+:9&s+:9&
   6.515 +s+:9QrrA\i!!(o.s+:9&s+:9&s+:9&s+:9QrrA\i!!(o.s+:9&s+:9&s+:9&s+:9Q
   6.516 +rrA\i!!(o.s+:9&s+:9&s+:9&s+:9QrrA\i!!(o.s+:9&s+:9&s+:9&s+:9QrrA\i
   6.517 +!!(o.s+:9&s+:9&s+:9&s+:9QrrA\i!!(o.s+:9&s+:9&s+:9&s+:9QrrA\i!!(o.
   6.518 +s+:9&s+:9&s+:9&s+:9QrrA\i!!(o.s+:9&s+:9&s+:9&s+:9QrrA\i!!(o.s+:9&
   6.519 +s+:9&s+:9&s+:9QrrA\i!!(o.s+:9&s+:9&s+:9&s+:9QrrA\i!!(o.s+:9&s+:9&
   6.520 +s+:9&s+:9QrrA\i!!(o.s+:9&s+:9&s+:9&s+:9QrrA\i!!(o.s+:9&s+:9&s+:9&
   6.521 +s+:9QrrA\i!!(o.s+:9&s+:9&s+:9&s+:9QrrA\i!!(o.s+:9&s+:9&s+:9&s+:9Q
   6.522 +rrA\i!!(o.s+:9&s+:9&s+:9&s+:9QrrA\i!!(o.s+:9&s+:9&s+:9&s+:9QrrA\i
   6.523 +!!(o.s+:9&s+:9&s+:9&s+:9QrrA\i!!(o.s+:9&s+:9&s+:9&s+:9QrrA\i!!(o.
   6.524 +s+:9&s+:9&s+:9&s+:9XrrC+:rrA\i!!(pSrrMT?K)^H&K)^H&K)^H&K)^H&]Dhto
   6.525 +(hhP#rrA\i!!(pUrr]H,#g\,&K)^H&K)^H&K)^H&K)`I_#PT&8!%;N1?Msj.G(3U2
   6.526 +!!#iIs+:9&s+:9&s+:9&s+:9]rrA,M!!(>ss+:9&s+:9&s+:9&s+:9]rrMj2o)Jbe
   6.527 +K)^H&K)^H&K)^H&K)^H&\,QGho)Jd:K)^H&K)^H&K)^H&K)^H&\,QL')"dk/:kJ_!
   6.528 +s+:9&s+:9&s+:9&s0_k,O7`JQc[u1Ks+:9&s+:9&s+:9&s0_k-pDEW)!)S:IK)^H&
   6.529 +K)^H&K)^H&K)`1W!0?jS!7-8sK)^H&K)^H&K)^H&K)`1W!V[H,!!#iIs+:9&s+:9&
   6.530 +s+:9&s+:9UrrA,U!!(>ss+:9&s+:9&s+:9&s+:9UrrMj2qZ$UmK)^H&K)^H&K)^H&
   6.531 +K)^H&YQ"T`qZ$WBK)^H&K)^H&K)^H&K)^H&YQ"Xt)#XF7:kJ_!s+:9&s+:9&s+:9&
   6.532 +s/l;$O8T%Yc[u1Ks+:9&s+:9&s+:9&s/l;(pD<l1:kJ_!s+:9&s+:9&s+:9&s/Z/%
   6.533 +NrT1+K)^H&K)^H&K)^H&K)^H&X8`7q(f5haK)^H&K)^H&K)^H&K)_hM!KYQYs+:9&
   6.534 +s+:9&s+:9&s+:9&s+:9&s+:9&s+:9&s+:9ds+8"U^AuT3s+:9&s+:9&s+:93rr>$1
   6.535 +!1NrgBS-89s+:9&s+:9&s,m<]hgtis!!"-ns+:9&s+:9&s+:95rr_-Y!-j+1T>(Fu
   6.536 +!$HmnK)^H&K)^H&K)^u5"5a(YT7[*8rrQR.+G0WFs+:9&s+:9&s,m<`hZ*YKK)_JC
   6.537 +!al!NK)^H&K)^H&K)^H&OoGO@!!&XCs.B;m?iV=$s+:9&s+:9&s+:95rr_-Y!2"lC
   6.538 +TDnt#!$HmnK)^H&K)^H&K)^u5"5a(YT7[*8rrQR.+G0WFs+:9&s+:9&s,m<`hZ*YK
   6.539 +K)_JC!al!NK)^H&K)^H&K)^H&OoGO@!!&XCs.B;m?iV=$s+:9&s+:9&s+:95rr_-Y
   6.540 +!2"lCTDnt#!$HmnK)^H&K)^H&K)^u5"5a(YT7[*8rrQR.+G0WFs+:9&s+:9&s,m<`
   6.541 +hZ*YKK)_JC!al!NK)^H&K)^H&K)^H&OoGO@!!&XCs.B;m?iUu:YlN%#s+:9&s+:9&
   6.542 +s+:9@rr_-Y!2"lCTDnt#!#,*m!5='bK)^H&K)^H&K)_A@"5a(YT7[*8rrQR.'DIdm
   6.543 +^4QB:s+:9&s+:9&s.')khZ*YKK)_JC!al!ApQbfnK)^H&K)^H&K)^H&SGr]K!!&XC
   6.544 +s.B;m?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y!2"lCTDnt#!#,*m!5='bK)^H&K)^H&
   6.545 +K)_A@"5a(YT7[*8rrQR.'DIdm^4QB:s+:9&s+:9&s.')khZ*YKK)_JC!al!ApQbfn
   6.546 +K)^H&K)^H&K)^H&SGr]K!!&XCs.B;m?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y!2"lC
   6.547 +TDnt#!#,*m!5='bK)^H&K)^H&K)_A@"5a(YT7[*8rrQR.'DIdm^4QB:s+:9&s+:9&
   6.548 +s.')khZ*YKK)_JC!al!ApQbfnK)^H&K)^H&K)^H&SGr]K!!&XCs.B;m?iUl7Q2nXN
   6.549 +s+:9&s+:9&s+:9@rr_-Y!2"lCTDnt#!#,*m!5='bK)^H&K)^H&K)_A@"5a(YT7[*8
   6.550 +rrQR.'DIdm^4QB:s+:9&s+:9&s.')khZ*YK[Jp8lUTjb!UQiUp!al!ApQbfnK)^H&
   6.551 +K)^H&K)^H&SGr]K!!&YVrr[s;L$$e_"$?P`FOC*hYrqq1!Frn1rrZa2!'J-u!al!A
   6.552 +pQbfnK)^H&K)^H&K)^H&SGr]K!!&YWrr@cP!!4HVk0s>4,ldp-dJj1mq#CFmk3`0N
   6.553 +49,@-r;QkQ,pf>0rrQR.'DIdm^4QB:s+:9&s+:9&s.')khZ*YKli-rIqu?dE;5;\A
   6.554 +"!mpI4OX60bkD)<--YfW"$?P`-2miDg&:sO--Q;i?iUl7Q2nXNs+:9&s+:9&s+:9@
   6.555 +rr_-Y!2&TW!'L&W!@<HOrrXPI!'J^0!6kEB"!p&l-2dfE-1gU*"$?P`-2miDbl.SC
   6.556 +-0EGO!al!ApQbfnK)^H&K)^H&K)^H&SGr]K!!&YWrr>1U!!,3sg&D.#!!#.0rrC:B
   6.557 +!!%`PrrJl@rVuq.n,EJP!!">CrrZ*u!+X4P!al!ApQbfnK)^H&K)^H&K)^H&SGr]K
   6.558 +!!&YWrrtRc!%"mI-2RZBL"cP/,ldp-df0<^rVuqPrVm#E,ldokn,EJP!!">BrrLg+
   6.559 +b5VNN!#,*m!5='bK)^H&K)^H&K)_A@"5a(YTBlL_49,@-s8V4k-2[`CA*X'pbh;Xg
   6.560 +"!mpI4OX60L&M&PPl1O`49,@-n,EJP!!"=^rrQR.'DIdm^4QB:s+:9&s+:9&s.')k
   6.561 +hZ*YKli.&L!!">CrrI3fr;Zh>q#:?/re1BJk55/a;#gU$s5q(M^\[s4,ldp-q>UQ@
   6.562 +P_HmLrrV>:^\Ig1UP7k%rr@cP!!(7@rrY@`!%%LA"3cIQbkh>A49,@-r;QhnKsCLS
   6.563 +"m0nh4Cb/arrTrhk4nrWPa(J5!al!ApQbfnK)^H&K)^H&K)^H&SGr]K!!&YWrrY@`
   6.564 +!%%OB!R*\)!!';$rrJ?1qu?dE;;(sK!87>O!^'=+rVusFFSu.@,ldp-qu6\N-2dfE
   6.565 +-&)?u"Qh!1!5JC1"-`cc-1h-:L&M&Pbl.PEfd-Uu-2miFo4'*F!!,3er;Qj]!!">D
   6.566 +rrB>'!!(^MrrJl@qu@!KL&_1X!!">:qYpY-!!#m^rrQR.'DIdm^4QB:s+:9&s+:9&
   6.567 +s.')khZ*YKli.&L!!">@rr>1\!!#.Zrr?R(!!FV1s8U=:!!$O-rrXPI!'L2Z!'L&W
   6.568 +"*FSCPl:X_4So'X-2mlEbk1o8L&M&Pbl7VCbU*5g!/:FP!R)kc!!';&rrY@`!%%UD
   6.569 +!/:CP!/:CO!2K;h!d+H>rVuq.qu6Z2rVupEli.#o!#,*m!5='bK)^H&K)^H&K)_A@
   6.570 +"5a(YTBlLZ49,@-q>UKX-2mlEU]18nPl1U]-2dfGFT;Bbo`,!,rr3'H!!#.[rr?R'
   6.571 +!!C"9jsC!,!-J/=!/:CP!'KlQ!+Z!."Ja2*;'l2A!%%UD!'L#V!%%UD"$?P`-2miD
   6.572 +L&M&PU]18ofd6Ut![TrTrW!!^s.fMm!3uJ%!)`^q!+Y?p!al!ApQbfnK)^H&K)^H&
   6.573 +K)^H&SGr]K!!&YWrrY@`!%%F?!/:CP!'L8\!%%UE!/:FP!-J2?"$HV`bkqGC4GAK!
   6.574 +rVupqrr3'H!!#.\rrAhm!!?)n^HDJq"&]*uL&M&Q-/&7s!%%UE!2K/c!'KuU!@>M[
   6.575 +rr?R-!!?`GUF#m>!0mK_"$?P`-2miDL&M&Pbl7VB;>pOqA,cK4YpC]ks8Psq!!#.[
   6.576 +rrBh5!!+D.li.#o!#,*m!5='bK)^H&K)^H&K)_A@"5a(YTBlLZ49,@-q#:T],ldok
   6.577 +s8S>_!!IEDs1_G0!!AJcs31EA!/:CO"!mpI-3!oH,ldp-rr2s\rVuq.rr3,m,ldok
   6.578 +rr2s\rVupqrr2tPrVupEo)A\Pp](=Wbl.PA-2mlEPlC[_^]"354T>?_49,@-rVljp
   6.579 +rW!&Es8Tk5!!#.UrrLe!rVuqPrr2sqrVupqlMgon!#,*m!5='bK)^H&K)^H&K)_A@
   6.580 +"5a(YTBlLZ49,@-p\tXJ!!">Fs#^8]-1dloqu?^ZrVlsG!!#.Zrr>1\!"R6Qs!7XF
   6.581 +4TGHD,ldokoDS[hA,ZH1bl@^<r;Zr7s8ODE!!%`Drr>1Y!!4H/Pl1O]U](5n4T,3]
   6.582 +,ldokrr3'_!!">Drr>1\!!CIFs&&aq!5J7-!+Z!."""!I^\n-4^Zth#?iUl7Q2nXN
   6.583 +s+:9&s+:9&s+:9@rr_-Y!2&TW"$?P`-27EH,ldoks8OAF!$rrh!!+C"r;QjF!!">C
   6.584 +rr@cP!"$mLs!7XF4TGH*rVup\r;QbNrVurBrr2sqrW!!^s-3K_!%%18"$?P`-2u*g
   6.585 +k5,)XL&M&PL&CrQ49,@-rr3'_!!">Drr>1\!!^[Is!7XF-2%9=o-OA9!d+H>rVupq
   6.586 +l2Lfm!#,*m!5='bK)^H&K)^H&K)_A@"5a(YTBlLZ49,@-q#:T],ldoks8ODA!!+C"
   6.587 +qYpXD!!">Crr@cP!"$mLs!7XF4TGG8rVuqPr;QbNrVurBrr2u5r;Zkn4T5<\L%50F
   6.588 +,ldp-pAY+TrVurBr;Qj]!!">ErrY@`!%%UD!'L5\!mL\grVuq?o`"oFrW!!G^ErjZ
   6.589 +!5Idu!al!ApQbfnK)^H&K)^H&K)^H&SGr]K!!&YWrrY@`!%%F?!/:CP"&]*u-2[`D
   6.590 +4JV]O"!mpI-2dcCFT)7Hbl@\h!!#.]s.fPn!/:@N!/:CP!6kEA!+Z!.!%%UE!%%.7
   6.591 +"!mpI4SJdTA,ZH.bl%JC49,@-rr3'_!!">Drr>1\!!:CEbl.SBL%G<E4T5<\-2mlE
   6.592 +;<\#]?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y!2&TW"!mpI-2IQAbU*5g"/Gnr-2mlF
   6.593 +;8;i)"!mpI-2dcC-2mlNg&M'u!!#.]s31HB!'L2Z"$?P`-2dcDjsBm)!/9qB"!mpI
   6.594 +4SJdTL&M&PFT)4Bjs:!-4T>?_49,@-rVlj[rW!#Ds4RAO!+YX#!2KAj!5Iat!al!A
   6.595 +pQbfnK)^H&K)^H&K)^H&SGr]K!!&YWrrXPI!%%LA!R)kh!!#.\rr>pq!!%-<rs<cn
   6.596 +-0G7-,ldokrVlk^rVupErr3'H!!#.\rr=AE!!&enrr?R.!!#mnrr?R,!!">6rrXPI
   6.597 +!'KuT!87>O"XVCms78AP!!&8_rrY@`!%%UD!'L5\#L*5J,ldok^]"07k$pNKqu6XY
   6.598 +qu?^okPkTk!#,*m!5='bK)^H&K)^H&K)_A@"5a(YTBlLW-2mlFA&&#e!i'6Or;Zi4
   6.599 +rr2u5r;[!I;2']d-2mlHPlLb0rW!$H4?Oqg!!%`PrrXPI!'L8\!/:@O!^&Rkr;Zi4
   6.600 +qu6]Z-2dfDFRT53,ldp-p&>"hrW!$H4?Oqh!!">DrrY@`!%%UD!'L5\"3gfFL&CuV
   6.601 +;2'^6,ldokqu6Z$qu?`3kPkTk!#,*m!5='bK)^H&K)^H&K)_A@"5a(YTBlLW-1_*:
   6.602 +U\t,lA+fm*-0G7--2.B>4T59^,ldp-rVlj[p](;9q>UG:rVusFk3r<P,ldp-p&>'G
   6.603 +-27H?Z2O\)49,@-rVlj[rVurBrr2s\pAb1>qYpOXrVup\k5PKj!#,*m!5='bK)^H&
   6.604 +K)^H&K)_A@"5a(YTBlLWFS,V7-):>:!L+o+!!,48rr2sEp](:Vr;QjF!!$O-rrM7E
   6.605 +q>^M*q#:=krVuq.mf*Ad!!$O$rrKk\qZ$XCU\t,o49,@DrVm"S!!">-rVljpq#CFm
   6.606 +g%t^K-2mlEUZVRX?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y!2&QV!l&4kq>^RC;;(^D
   6.607 +#F&(J,pbZq^\n*3-2moC,lp,mqu6bn4Ak8<rr@cO,lplXq#:N[,ldokk3`0LKn]*t
   6.608 +!Tmnj,lqN<qu6cB4?UCVrrRmOZ2=P%UJ^t9!Frn?rrAhn!!#.CrrQR.'DIdm^4QB:
   6.609 +s+:9&s+:9&s.')khZ*YKkPkb$Ki'sdKtlgN"!mpI-/8G"A,ZH.A%2I<k4\fT4T5<\
   6.610 +UZMLW?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y!2%:2"!mpI-/8G"-2mlE^T@G8^]"35
   6.611 +-05(-?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y!2%:2"!mpI-/AM#Pl:X_4KJJ^;>pOq
   6.612 +FQEH'?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y!2%:2"!mpI-/AM#4T5<\UTFJ!js:!-
   6.613 +-0F:g!al!ApQbfnK)^H&K)^H&K)^H&SGr]K!!&Y2rrXPI!%$J$!87>O!%"]G!0mH_
   6.614 +!'K<A!al!ApQbfnK)^H&K)^H&K)^H&SGr]K!!&Y2rrXPI!%$J$!0mH_!+W)0!)`^q
   6.615 +!2JTS!al!ApQbfnK)^H&K)^H&K)^H&SGr]K!!&Y2rrZ*u!+Xjb"Qh!1!5GT7"0hh+
   6.616 +-0"q+?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y!2%71!L/i'rrV>:^T%57^P1h0rrQR.
   6.617 +'DIdm^4QB:s+:9&s+:9&s.')khZ*YKK)_JC!al!ApQbfnK)^H&K)^H&K)^H&SGr]K
   6.618 +!!&XCs.B;m?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y!2"lCTDnt#!#,*m!5='bK)^H&
   6.619 +K)^H&K)_A@"5a(YT7[*8rrQR.'DIdm^4QB:s+:9&s+:9&s.')khZ*YKK)_JC!al!A
   6.620 +pQbfnK)^H&K)^H&K)^H&SGr]K!!&XCs.B;m?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y
   6.621 +!2"lCTDnt#!#,*m!5='bK)^H&K)^H&K)_A@"5a(YT7[*8rrQR.'DIdm^4QB:s+:9&
   6.622 +s+:9&s.')khZ*YKK)_JC!al!ApQbfnK)^H&K)^H&K)^H&SGr]K!!&Y;rr^rubiXNW
   6.623 +ec,\Y!#,*m!5='bK)^H&K)^H&K)_A@"5a(YT@*Z>KdH]u![Tt6k5PJE^]+66;'k&u
   6.624 +!l$&*qu6YMrZqSBg%PFHUHJN%!E%PErrLeMrZqPSci4&S!#,*m!5='bK)^H&K)^H&
   6.625 +K)_A@"5a(YT@3`G@fRfsKnWAM!0l^I!nelRrr3!r-/SY(bU!85r;R"3!)\Gl,ph7>
   6.626 +rs4;Y-$4iN!%$=ors.4'-$4iN!'JX.!al!ApQbfnK)^H&K)^H&K)^H&SGr]K!!&Y?
   6.627 +rr^pS4S/OO"3`&;k3;mIbQ*@NrrfSQ!!(7ArrTq8;?$RsbU$-^rr_C04S/RP!i#`m
   6.628 +q>ULn!5JO5!egW=dJj8U!#,*m!5='bK)^H&K)^H&K)_A@"5a(YT@<fAK`Hi(rrQ[1
   6.629 +U\k&kk4\fTbl%JBbQ*@irrCaGrrC:8rrlm4-"?r!rVlq/!5JL4!`8sNqYpV]!/:@N
   6.630 +!@9&grrVd<4T59]bQ'cQrrQR.'DIdm^4QB:s+:9&s+:9&s.')khZ*YKe,KK6!+Yp+
   6.631 +!qXY-rVlk-r?VH.r;R>];'c2g;;(tH,lf5;L&Y!rrVm(s4='tR;<IlX#DFJq@jM+$
   6.632 +;>:(pbU$cjK`K?qrrFDlr;QhP!0m?[!qX1Ar;QdD-1h-<^Aq-YrrQR.'DIdm^4QB:
   6.633 +s+:9&s+:9&s.')khZ*YKe,KR5,lhGip\tI\!+U_:490L&rt3!l-$4i_,ph6/F9#0l
   6.634 +^]-DBrr3XR!%!>Q@fRh.s8Rd!4?S=O49/7Rrs&)Ws8RcQbl.PB,s;,*!mCXuoD\m,
   6.635 +!'KoR"6M]G^X<&_?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y!2%^>#GWRF!$sa]g&1jO
   6.636 +@fV5]rs(Xdg&M(7!5JO5#,;0.s3(Isrr33c-3+"u!'KlPrs,;!;?-ZM!'L5[![T/T
   6.637 +p&>)I!6kEA!@9l+rrUCE4S/RS492Y[rreQK,pf>5rrQR.'DIdm^4QB:s+:9&s+:9&
   6.638 +s.')khZ*YKd/O034=0t,!BeU*rrFDlr;Qu9!-J7o!'L2Z"bj5]bQ*@rrrtS3s8R0@
   6.639 +U\t,r494(7K`InHrrQ$tbk:u;K`K?qrrFE.r;QiB!'KoR!^$Hmp&>2*4?NU+bgHFl
   6.640 +?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y!2%O9$,:R.!%$=uf`3>rKa)W!4TD/VL&(`M
   6.641 +bQ*@rrrtS3s8P1]g&1jSF9')UK`K?qrrRlSbk:u;K`K?qrrFE.r;QiB!'KuT"7nVT
   6.642 +A+BR#UAuUfrrQR.'DIdm^4QB:s+:9&s+:9&s.')khZ*YKb5VZU!)`d?!!)jA"B#2Q
   6.643 +!/:7K!mCXurr3-a-3+!--2[]HK`Hi,K`K?qrrRlSbk:u;K`K?qrrFE.r;QiB!/:1I
   6.644 +"3`%kA+0F!@fW:PrrQR.'DIdm^4QB:s+:9&s+:9&s.')khZ*YKe,KG24Sf!\,piT8
   6.645 +!'L&V!i#aLq>UN?!/:FP#!=43s#^;7r;QtT!5JPf!6kEA!egWup&>)I!6kEA!@9&i
   6.646 +rrSDbL%tZMYpBCFo`"p_r;QhP!/8l$!al!ApQbfnK)^H&K)^H&K)^H&SGr]K!!&Y?
   6.647 +rrOJH^\e$8o-HO!s!8uhrs%VMg&K7r;>gFt4Al.&!/:FP#!=43s)\79r;Qs`!87C+
   6.648 +!6kEA!egWup&>)I!6kEA!`8sNrVlq/!6k9="3`&;Z1\+ubU$-arrQ[1UXK/D?iUl7
   6.649 +Q2nXNs+:9&s+:9&s+:9@rr_-Y!2%a?",-_$^\n*:@fV5_s%rc\rVm+4!/:IQ4=/5N
   6.650 +rs$4<;?+i?FT2:E4=1%-^ApCprs-:=4TGG8!6kEA!egWup&>)I!6kEA!i#a*rr3&D
   6.651 +,s;#'"7mfbbk(i9,pge7rrUCj-.2_o?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y!2%^>
   6.652 +$"Er84EQ9e,lg(,rs7a5!+X6f@fSXjrt2L9-'ZW<,ph7Ef`3=?Z2Zp4rr3F;!'I%#
   6.653 +KdA%[s8RcQbl.PCK`K?irrRlSbl%JG49/m8UEooFrr35I,uO^BF9!Wa49/7XrrFDl
   6.654 +rr38!!%"DaPU-=)dJj8U!#,*m!5='bK)^H&K)^H&K)_A@"5a(YT@*Z?KdA&E!!+C"
   6.655 +r;QuS;'c2B,uOU?!O4cd!!,4+rr314,lhHT;'l2@#)+?'!$tLqrr3%R--Z>f!ehrE
   6.656 +p&>)I--Z8d"_/hY!%"E=rrpUm;?-Ynpa,q>!@9&jrrJl@rVus]Z-`LP?iUl7Q2nXN
   6.657 +s+:9&s+:9&s+:9@rr_-Y!2%U;"6RhOg%YLIbfok^!nkfNqYpQKp\t<=bi[^\!p7_N
   6.658 +iVru4bh:;A!al!ApQbfnK)^H&K)^H&K)^H&SGr]K!!&XCs.B;m?iUl7Q2nXNs+:9&
   6.659 +s+:9&s+:9@rr_-Y!2"lCTDnt#!#,*m!5='bK)^H&K)^H&K)_A@"5a(YT7[*8rrQR.
   6.660 +'DIdm^4QB:s+:9&s+:9&s.')khZ*YKK)_JC!al!ApQbfnK)^H&K)^H&K)^H&SGr]K
   6.661 +!!&XCs.B;m?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y!2"lCTDnt#!#,*m!5='bK)^H&
   6.662 +K)^H&K)_A@"5a(YT7[*8rrQR.'DIdm^4QB:s+:9&s+:9&s.')khZ*YKK)_JC!al!A
   6.663 +pQbfnK)^H&K)^H&K)^H&SGr]K!!&XCs.B;m?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y
   6.664 +!2"lCTDnt#!#,*m!5='bK)^H&K)^H&K)_A@"5a(YT7[*8rrQR.'DIdm^4QB:s+:9&
   6.665 +s+:9&s.')khZ*YKK)_JC!al!ApQbfnK)^H&K)^H&K)^H&SGr]K!!&XCs.B;m?iUl7
   6.666 +Q2nXNs+:9&s+:9&s+:9@rr_-Y!2"lCTDnt#!#,*m!5='bK)^H&K)^H&K)_A@"5a(Y
   6.667 +T7[*8rrQR.'DIdm^4QB:s+:9&s+:9&s.')khZ*YKK)_JC!al!ApQbfnK)^H&K)^H&
   6.668 +K)^H&SGr]K!!&XCs.B;m?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y!2"lCTDnt#!#,*m
   6.669 +!5='bK)^H&K)^H&K)_A@"5a(YT7[*8rrQR.'DIdm^4QB:s+:9&s+:9&s.')khZ*YK
   6.670 +K)_JC!al!ApQbfnK)^H&K)^H&K)^H&SGr]K!!&XCs.B;m?iUl7Q2nXNs+:9&s+:9&
   6.671 +s+:9@rr_-Y!2"lCTDnt#!#,*m!5='bK)^H&K)^H&K)_A@"5a(YT7[*8rrQR.'DIdm
   6.672 +^4QB:s+:9&s+:9&s.')khZ*YKK)_JC!al!ApQbfnK)^H&K)^H&K)^H&SGr]K!!&XC
   6.673 +s.B;m?iUl7Q2nXNs+:9&s+:9&s+:9@rr_-Y!2"lCTDnt#!#,*m!5='bK)^H&K)^H&
   6.674 +K)_A@"5a(YT7[*8rrQR.'DIdm^4QB:s+:9&s+:9&s.')khZ*YKK)_JC!al!ApQbfn
   6.675 +K)^H&K)^H&K)^H&SGr]K!!%7q^Rr7B8,s=tQ2nXNs+:9&s+:9&s+:9@rrCr.!1Elf
   6.676 +'DIdm^4QB:s+:9&s+:9&s-s#g."VGg!!"\HQ2nXNs+:9&s+:9&s+:9?rrDfd^Aru%
   6.677 +E!0#@!"rnaDua@LDub%SQ2nXNs+:9&s+:9&s+:92rrB=<Q2hp(!!#g:Q32(9!%O_/
   6.678 +!5='bK)^H&K)^H&K)^l2!3s8(r;Zgjad)oHrVuq2UQtnoK)^H&K)^H&K)^H&NrK*a
   6.679 +^6\]t!)(G"r;ZgjUQtnoK)^H&K)^H&K)^H&NrK*a^6\]t!)(G"r;ZgjUQtnoK)^H&
   6.680 +K)^H&K)^H&NrK*a^6\]t!)(G"r;ZgjUQtnoK)^H&K)^H&K)^H&NrK*a^6\]t!)(G"
   6.681 +r;ZgjUQtnoK)^H&K)^H&K)^H&NrK*a^6\]t!)(G"r;ZgjUQtnoK)^H&K)^H&K)^H&
   6.682 +NrK*a^6\]t!)(G"r;ZgjUQtnoK)^H&K)^H&K)^H&NrK*a^6\]t!)(G"r;ZgjUQtno
   6.683 +K)^H&K)^H&K)^H&NrK*a^6\]t!)(G"r;ZgjUQtnoK)^H&K)^H&K)^H&NrK+F^?,:n
   6.684 +!-63Cr;Zh<UZDLDK)^H&K)^H&K)^H&K)`smr;ZhIaoD;>!.TV#K)^H&K)^H&K)^H&
   6.685 +K)b*8r;ZhIaoD;>!.TV#K)^H&K)^H&K)^H&K)b*8r;ZhIaoD;>!.TV#K)^H&K)^H&
   6.686 +K)^H&K)b*8r;ZhIaoD;>!.TV#K)^H&K)^H&K)^H&K)b*8r;ZhIaoD;>!.TV#K)^H&
   6.687 +K)^H&K)^H&K)b*8r;ZhIaoD;>!.TV#K)^H&K)^H&K)^H&K)b*8r;ZhIaoD;>!.TV#
   6.688 +K)^H&K)^H&K)^H&K)b*8r;ZhIaoD;>!.TV#K)^H&K)^H&K)^H&K)b*8r;ZhIaoD;>
   6.689 +!.TV#K)^H&K)^H&K)^H&K)b*8r;ZhIaoD;>!.TV#K)^H&K)^H&K)^H&K)b*8r;ZhI
   6.690 +aoD;>!.TV#K)^H&K)^H&K)^H&K)b*8r;ZhIaoD;>!.TV#K)^H&K)^H&K)^H&K)b*8
   6.691 +r;ZhIaoD;>!.TV#K)^H&K)^H&K)^H&K)b*8r;ZhIaoD;>!.TV#K)^H&K)^H&K)^H&
   6.692 +K)b*8r;ZhIaoD;>!.TV#K)^H&K)^H&K)^H&K)b*8r;ZhIaoD;>!.TV#K)^H&K)^H&
   6.693 +K)^H&K)b*8r;ZhIaoD;>!.TV#K)^H&K)^H&K)^H&K)b*8r;ZhIaoD;>!.TV#K)^H&
   6.694 +K)^H&K)^H&W;cn9Xi8'R!!%Mjs8;otItI]Ps+:9&s+:9&s+:9Mrr=dg!!%5bs8;ot
   6.695 +?cBb[Y(H\*s+:9&s+:9&s+::6rrBsN!!#C.s1\O7"Ik#CK)^H&K)^H&K)^H&l2LaF
   6.696 +^&S.0aoB'T!#^CgK)^H&K)^H&K)^H&l2LaU^An9Kn&bS0$,6H?$A/;0s+:9&s+:9&
   6.697 +s+::8rrA\i!!&q9^AuEsrrI?F^]4?NK)^H&K)^H&K)^H&K)b*8!2'2i!8iY5!Ul`$
   6.698 +^Aph(!!"-ns+:9&s+:9&s+:9&s69O`TD\`ihh(mNrr?I+!!"-ns+:9&s+:9&s+:9&
   6.699 +s69O`TD\`ihh(mNrr?I+!!"-ns+:9&s+:9&s+:9&s69O`TD\`ihh(mNrr?I+!!"-n
   6.700 +s+:9&s+:9&s+:9&s69O`TD\`ihh(mNrr?I+!!"-ns+:9&s+:9&s+:9&s69O`TD\`i
   6.701 +hh(mNrr?I+!!"-ns+:9&s+:9&s+:9&s69O`TD\`ihh(mNrr?I+!!"-ns+:9&s+:9&
   6.702 +s+:9&s69O`TD\`ihh(mNrr?I+!!"-ns+:9&s+:9&s+:9&s69O`TD\`ihh(mNrr?I+
   6.703 +!!"-ns+:9&s+:9&s+:9&s69O`TD\`ihh(mNrr?I+!!"-ns+:9&s+:9&s+:9&s69O`
   6.704 +TD\`ihh(mNrr?I+!!"-ns+:9&s+:9&s+:9&s69O`TD\`ihh(mNrr?I+!!"-ns+:9&
   6.705 +s+:9&s+:9&s69O`TD\`ihh(mNrr?I+!!"-ns+:9&s+:9&s+:9&s69O`TD\`ihh(mN
   6.706 +rr?I+!!"-ns+:9&s+:9&s+:9&s69O`TD\`ihh(mNrr?I+!!"-ns+:9&s+:9&s+:9Z
   6.707 +rrC[9^B"#RrrA\i!!(oAs6@?!a3Xbc@/^-++G0WFs+:9&s+:9&s1/.1Va0DF!D)D#
   6.708 +rrA\i!!(oErrVqM.-LX4#^H*lrr?I+!!"-ns+:9&s+:9&s+:9_rrM:Rj8]3'n'V.8
   6.709 +TD\`ihjXQGa!g!K!*I\L!+>d+!$HmnK)^H&K)^H&K)`L`#,`"4!"`PAlG!F/!!$uc
   6.710 +rrA\i!!(oGrr@<C!!+L/lG!J*-ia7Ve,KDUrVup@K)^H&NW0&i;<EK1K)^H&[JpEV
   6.711 +#QOj4n)s]P5QDqSrrA\i!!(oHrreYg!!nACrr_Ei!-$Ee!+>d+!$HmnK)aX+!b4@-
   6.712 +p&>)g4L)m*"(M<2;?$Rqbk(i8g#dndK)^H&b5VV=0E;Bfjo5F<!!)K9rrA\i!!(oI
   6.713 +rrh3b!%?I\rrP.[8CRS=@/^-++G0WFs5!\W@fQKTpAY9K,ldqua8Z.SrW!-bs5kU-
   6.714 +--Z)_"(M<WZ%E"-s+:9orr[`N!/KY8"1J71T@3`>TD\`ihjscL5QCf)jSo<q!!qK3
   6.715 +rr?I+!!"-ns+::,rrY@`!%%@=!+Z!.!6iL`!+Z!.!i,dLrVusFZ2">!A,ZH.4G*Tb
   6.716 +s+:9prr_]q!''$="SW`5!-$D:!)NOn!,oDt!f+P2l2Ljp!!%9(rr]_1!#X48!&4BP
   6.717 +!"cSg!gg[RK)_qP"$?P`-2.?@,ldok`r?5h!!">Fs1eL4!@?Fqrr@0>!!%_)s+:9&
   6.718 +s31KFT)\khir9"fJcPcM!Z5nFm/I/q!!)3Arr?_a!<)s!.%c+kY5\Sd!!">=rrXPI
   6.719 +!%#\c!0mH_!/:FP!2KJm!'L/Y!3uJ&!+UW\K)^H&bPqZh!!r>XrrL/2JcPcM!>rlE
   6.720 +rrP.[5iDYCT.kisrVusikCW`<rrY@`!%%C>!6kEB!%#\c"$?P`-2dcCU\t/mA,ZE.
   6.721 +jsC!,!'Gl5K)^H&b5VNF!&0$)hu<bmO!su-!-mr3!Z1oVK)ad/#OfEW(]XOI[t=Xb
   6.722 +rrY@`!%%C>!6kEB!'KZK!R06RrrBh5!!$O+rr?R-!!%`Prr>1\!!+D.m/I+>fn06U
   6.723 +s+::0rrPFc5_B$krre)_!!&ASrrN0#ItI^Vrrqk!!!!;^K)`Rb!Mac7491*6rrY@`
   6.724 +!%%C>!6kEB"[)hbk(USFrsb`Wk5YHY!!';(k.cVbpAY--re1BJk4S`S;>pOq^\[s1
   6.725 +4T,6]U]4j&!!';!rrCaOK`RFkqu7"F!!%`Qk&`^34JRN.K)^H&l2LfM!'l/9g]%E.
   6.726 ++92])nG`Oi!.TV#g]%AZ!!#99s1nX8UF#^9!2KPn"$?P`-27E>bl.SH4TFOi!!'e1
   6.727 +rrnVe!%%ZurW!!^;'l2A!@;jarrJ?1qu?dE;;(aE!5JL5!)`Rl!V7W:!!+C"r;Zh-
   6.728 +q>UK14So*Z4L+kb"XO-K-)2da!!%+ms+:9&s6BUc5QF'$s4[JT^An7!nG`Oi!.TV#
   6.729 +gA_8"!!&@;s2+d9Z1e4uL&V)S,ldokq>UNYbbP.;!^-LIrVup\qYpOArVuuCbk;#:
   6.730 +A,Q?,A,$$)-0G%'!)`^q!5J=/!R)kd!!#.WrrAhg!!';'rr=A>!!+D.K)^H&K)b0:
   6.731 +!^H`NK)aO(")%Z7fCAkB!!%M#s4[JTpF$"aK)`^f!'L5\#:2KBF<pnePlC[h,ldp-
   6.732 +s8UceKfo>\qu?g]s5kX,!!%-=rr@cP!!5:_bk1r9^]+65Pl1U]-2dfDFSc";Z2O_'
   6.733 +;>1"iZ24M%-/&.p!SJdu!<"5C!!#.\rr=AB!!+AlrVuq_K)^H&K)b0:!^H`NK)aO(
   6.734 +"5a(YJ+<O?!!%M#s4RDSLB%=pK)`ag"=4$J-1h-9!p2U-rVm$I!!"<--1q6?;?-ZM
   6.735 +rVusFg&:pN-2mlGU]8R9!!>?;Kk()^!)`aq!%%UE!/:FP!-J2?!'L,X!'L5\!5J4,
   6.736 +!/:=N!3uA"!)`^q#\3#ss03jM!%%XE!%%OC#!DMK,ldpeK)^H&K)b0:!^H`NK)aL'
   6.737 +!\aU>nc&Xj!.TV#g&D0C!!&@;s24j:4T5<];;(aE!%%+7!/:FP!'L5\!)`aq!/:CP
   6.738 +"""!Ibl%MAL&M#U,ldoks8S>_!!IEDs1_G0!!&8\rrAhn!!$O$rr>1[!!+CiqYpQK
   6.739 +rW!*as8V4k-2mlE;?$Rq-2dfD4T>?_,ldp-K)^H&K)b0:!^H`NK)aL'!al!Vnc&Xj
   6.740 +!.TV#f`)!a!.TV#_uB_Ar;ZmF;8;u-!%%F@"XPHWFG4i9!!%`PrrAhm!!C"9s!@XE
   6.741 +!/:FP"!mpI4T,3Z4T5<dbl9d*!%%634T#0Z4So'\,ldokk4S`S4So*Y4So'XL&M&S
   6.742 +Z+j-^r;ZjEg&D!O-2dfD^]+68,ldp-K)^H&K)b0:!^H`NK)aL'!al!Nnc&Xj!.TV#
   6.743 +f`)!q!.TV#_Z'V2qZ$Xok5>5Z-2mlI,s5\%bl%J@bl.SBL&M#O;>pOs4TCZF!!">D
   6.744 +rrXPI!%%RC!/:CP#0d)n!!";kqu?aDL&1fLL&M&PA+fj%A,-*)A,H9+4T5<\-2[`E
   6.745 +-"H*9rr=AE!!#.\rrC:B!!#-5s+:9&s6K[d5QF'$s4I>Q?iV>>rrN0#J'7iqg!#/(
   6.746 +UY1q4![%JmK)`[e!P_M0!!+C@rVlsG!!#.UrrC:B!!%`OrrBh4!!/iWrVuqPrVlsG
   6.747 +!!">Crr@cP!!:CE-2ITB-&)0p"nO#?!%%71rr?R-!!-Sor;Zi&r;QaZq>^RCA*3^h
   6.748 +!Tk^-!!&8_rrC:B!!#-5s+:9&s6K[d5QF'crrR:)U\k&nUEr%UVZ-^*!$Lh3!WW4M
   6.749 +c2Rgt4So*Z4L+b_!l'H(U&P0:!.TV#^]+AM@jV'R#J^<=js:!-4SSjUbl.SBL&CrN
   6.750 +A,ZH.-2mlE-2dcF,ldokr;Qb=rW!#Ds!@RC!Bd.Orr?R.!!%`Hrr@0>!!>@`s&&aq
   6.751 +!@?n,rr>1Z!!4I#k5,)Xbl%MAbl7VBbl.SB4G*Tbs+:::rrPFc5f3O'K`D*!qu6aE
   6.752 +!!#lnrrQR.+S#I5!!%Mnrr@cJ!!$O,rrCaO!!'d.rrO;CItI^6rrM7ErW!$ts8U=B
   6.753 +!!$O'rrC:B!!#.ZrrM7.qZ$VMr;QjF!!">Crr=AE!!:jR-2mlF;8;i)"Qh!1!%%@=
   6.754 +!2KJm!'L8\!V7W:!!#.[rr>1\!!,3Wp\t6;rVupErVm#_,ldp-K)^H&K)b0:!^H`N
   6.755 +_Z'T^rVuqnrVllArVupEVZ-^*!$Lh3!WW4Mc2RctrW)pDr;Zh>rVlkmrVuq_UAk9;
   6.756 +!.TV#_uBbjbl%J@bl.SE4TGH*rVuqPp\t6;rVup\qu6Y+qu?^Cqu6aE!!">DrrA;_
   6.757 +!!=PIs&&aq!-J,<#';.;k5YHkrVuqPp\t5gr;Zg[r;Qc%r;Zh-rr2t_rVusrk5>5_
   6.758 +PU.W\s31HB!%%RC"!mpI-%c/Ks+:::rrPFc5f<U%g&1mNA,ZE-L&CuObbtIB?iV>>
   6.759 +rrN0#J'IuqK`D*8rr3"o-2mlEg&:pP;'e>urrO;CItI^=rrfS,!$tMAK`F77!!?*u
   6.760 +s31HB!/:1I!6kEB!'L/Y!Tk^,!!%-<rr=AE!!=N04=0q+",6dT^\n-9,uKAM4=0t,
   6.761 +#*f/f,ldokp\t5gr;ZjEbkqD?A,QB-U]18n-2mlJ,s6m8;'l2A!`B!ArVupEr;QaC
   6.762 +rVurOK)^H&K)b3;!^H`N_uB_$r;Zg[rVlj[r;Zh^VuHg+!$Lh3!WW4Mc2Rm"!!#.[
   6.763 +rrgOl!!%_ArrO;CItI^=rr@cH!!C"9s+UFP!/:1I!6kEB!'L,X!-J2?!@?n*rr=A>
   6.764 +!!#.[rr?R&!!=P0s+UFP!/:4J!Tk^-!!+Ciq>UFWr;Zr7s8Ske!!9G*bl.SB4T,3Z
   6.765 +4T5<\b_#kHs+::;rrPFc5f<U%A,QB--2miD-2dfDL%#$Cfho#errQR.+S#I5!!%Mn
   6.766 +rr[rT!'L2Z"$?P`L%kTPUP7D$s5qPLXT&>E!.TV#`;]l04S\sX-):J>!2KMn!2K8f
   6.767 +"!mpI4So'X;>pOqA,?3*-27H?4T#-ZPU6,*#X$f?s#^8]-0G"&!6kEB!@>tbrrL=i
   6.768 +rVuqPrr3#64S\sX-*dIL"!mpI4T,3ZFT)7?b_#kHs+::;rrPFc5f<U%4T#0]g&M)e
   6.769 +qu?^ZqYpT2A,[bT;5=*i#UKHs^N;Ra4GCZP!al!Nnc&Xj!.W8n",-^T4T59_o-FA:
   6.770 +L&V)`fd.r>s8Th6!'Kj_,ldokbkqD@^LR6h!E#Wjrrc1]^]0#d,m;Hl;'i"6rrQ%D
   6.771 +L"H>++96nCs2+d:PW\mj!^(Ser;Qh?4Ce'a"/@t@bkqDDjs:!--0G((!%%UEr?VJ,
   6.772 +Pkb7`PYjOh,s6:arVlss!!$O&rrY@`-,90R"MZ5_-,9BX#GYck,pbZ`U\t,o;#ho;
   6.773 +r;Ql6,lg&Zs+:9&s6K[d5QF'err=AC!!B"rs'ts,!%%OB!+Yj*"$HV`bl.SB-2[`C
   6.774 +4N%1#?iV>>rrN0#J'IuqK`D*8rr3#64T5<\g&D!UK`D*8s8RfP!!">C!!#.Zrr?R*
   6.775 +!!bXds-*K`,piHh"[&"L!%$=rrr\Jc!%$7s![%JmK)_>?!+Z!.!+Yj)"!mpI-0>.-
   6.776 +Pa(h?!6k'7!p54!mJd42k5,)Yk0/GWK)^H&lMgoN!'nL&!6k<?$"O#8,ldok!!">C
   6.777 +rr>1[!!+AlrW!#Ds313;!-H0Z!al!Nnc&Xj!.W8n!/:CP![TrTr;Zh>rVm(U!!#.]
   6.778 +s31??!%%UE!6kHB!'L2[!@9&k!!:CEL&1iQ,ldokg&:sO4T,3],ldp-fDbmp!.TV#
   6.779 +S,WI7rVur5q>UOC!!"<ss+:9&s,R*\5QF'frs=AZ!$s`-!'L:rrVuqPrVurBrr2tP
   6.780 +rW!6e^]1P=!%%[Fbl%MG-$4i'!!"=`rrQR.+S#I5!!%Mnrr@cJ!!+D.rVm(3!!#.]
   6.781 +s31B@#aG?O!!%`Qs+UFP#s?!&YlFbMs8RfO!!bX$bQ%Vhs'u$.!2KPn!/:CP!2J0G
   6.782 +![%JmK)_A@!0mH_!'L&V"!mpI-%c/Ks+:92rrPFc5fE[749,@DK`D*!s'l$/-1`D_
   6.783 +!0mK_"!mpI4T>?_K`D*!rr3'H!!$O.rrhp>!!(6^rrQR.+S#I5!!%Mnrr@cI!!+Ci
   6.784 +rr30b!!#.]s1eL4%!;OL49,A8s8OAF!'L8\#)*$W-3+"!rW!@:s8U:C!%%[:,ldok
   6.785 +rr3'H!!#.4rrO;CItI]jrr>1\!!&ehrrXPI!%!6sK)^H&NrK/G!'nL&"=4$JFNj^a
   6.786 +&>LNO!+Z$k!!$O/s.]Po-0G4,",-^T4T>?_,ldqhrVlsG!!%_lrrQR.+S#I5!!%Mn
   6.787 +rr[rT!%%Vu!H]Xe!"(%Ds8P1]!-J8@L&M&P-3!oN49,A8s.]Po-0G4,$&&?Z4TGG8
   6.788 +!!">DrrlmpU]:@JrW!"Rs-3K_!2J-F![%JmK)_DA!87>O!%%C>"!mpI-%c/Ks+:92
   6.789 +rrPFc5fNa'U](5s^],S[!'L5\$bu^O!!">Fs+LFQ-2miGK`D*8rr3'H!!%`OrrY@`
   6.790 +!/8Dl!al!Nnc&Xj!.W8n",-^T4T,3ZPl:XhFT;A'!!%`Qs+UFP!-J5?#Wr(eL&Zi,
   6.791 +!%%UD$&&?Z4TGG8!!#.Urs1^e!%%5!!!#.3rrO;CItI]krrA;_!!$O'rrXPI!%!6s
   6.792 +K)^H&NrK/G!'nO'##P@#-3+!Bqu@-Os8S;`!%$e-K`D*8rVlu7!!#.\rrXPI!/:CO
   6.793 +"$?P`KuO&n?iV>>rrN0#J'IuqK`D*8qu7(7!!#.]s#^8]L&_1,rVurBrr36d!!%`Q
   6.794 +K`D*8rVm2=!!#.]s+LFQ4SSjUU](5n4T5<\UXfAG+96nCs.0/mjs:!-^\@a1;#gT+
   6.795 +K)^H&K)^l2!^H`N`W$,g!!#.]s-3E]"(VB2g&:sTPlHF;!%%UD"3^`F-3!oH,ldq!
   6.796 +rVlsG!!&8&rrQR.+S#I5!!%Mnrr[rT!'L2Z&\gF.!)`dr49,A8s8QR/!%$e,rs1^e
   6.797 +!+Z%_!!">Drs?mL!%%[FK`D*8pAY+Tqu?^CeGfRm!.TV#SGrZQKtm<\!L/h#s+:9&
   6.798 +s,I$[5QF'hrs7a5!!%-@s5kX+!!'e5rrj\K!)`d2rVur5rr3>1!!">-s8OAF!/:FP
   6.799 +!+Z!.!85?k!al!Nnc&Xj!.W8n#_`6Y4TEX#@jV'R%);iB49,A's8P1]!%%UD"]57"
   6.800 +4TE1q!!'e5rs>q1!%$e-K`D*8pAY--qu?_NeGfRm!.TV#K)^H&K)^H&QN%"O!'nR(
   6.801 +!6kEB!0mK_!'L5\!%%UD%8d**-3*uk!!"<eKi'/q!"!08s!7XF,pbZ"rVupq`;]mH
   6.802 +!$Lh3!WW4Mc2RctrVupEq>^Mjrr39e!!#.]s'l$/-2miQK`D*!s8OAF!$u`@;'l2A
   6.803 +"_7Rd!!#.Srr>pq!!"=orrO;CItI]Ps+:9&s+:9:rrPFc5fWg(bl.SBbl7VBFT)7?
   6.804 +L&M#OL&M&Rbl=I4!!=PIs!@I@!@?mHrrQR.+S#I5!!%Mnrr@cJ!!,3srVm0d!!#mr
   6.805 +s+LFQ-2miJPQ1\0s8Skg!!O\KK`D*8p&>#erVuqPe,KIl!.TV#K)^H&K)^H&QN%"O
   6.806 +!'nR("5*YS-2miGjs:!ir;R&b,ldqhs8T>Mr;['bF?BOLs8ODA!!,sM_uBdG!$Lh3
   6.807 +!WW4Mc2Rgt-2dfG,pd'9qu6u-,pfhrs-*K`;>pLsf`2!urr3#(-2dfM4EN[c-3'_?
   6.808 +!)`Fh"&T$u-.;ep+96nCs8;ltPb[jM!L0A,rrL@+K)^H&K)^H&hu<aC!'nO'!jRI4
   6.809 +r;Qf[bkh>@Yrma<rr^K0PhH'9$^BfRs!7XFFHhKDftm[i?iV>>rrN0#J'@omk5ENn
   6.810 +rrSF=k5>5\P_Ifgrr^K0PhH'9"dJ0Ls-/61rrhI1!!%`$rrO;CJ%GX\g!&a]!R/dG
   6.811 +rrY@`!-Io6"$?P`FOU6l,lf7Ro)A`q4T$K+A&!WqK)^H&K)bWG!^H`NU&P3@!!%_d
   6.812 +rrQR.+S#I5!!%M.rrcg3!%$dUrrO;CJ%P^_K`D*8q#:DL,uOI;"(M<2;;qNW,ldp-
   6.813 +p&>+?!!#.2rrC:B!!%`Drr=A@!!,sZU]1F+,s9DmrrIgqg]%B<;'f(ks+:9grrPFc
   6.814 +5b\2[,ldq!^&J.A!$Lh3!WW4MNW0),!!$NVrrO;CJ%P^\4T5<\PktC[Z2O_'A,?3*
   6.815 +^]"35-/nk+,ldp-p&>+?!!#.2rrAhn!!%`ErrC:;!!+Cih>[Q=Kqm9"!p533q>UGZ
   6.816 +rVup\ao;I-!!#mZrrTrh^\Rm0;>pOqFFsOEs2=p=5QF'CrrXPI!/8,d!al!Nnc&Xj
   6.817 +!.U%/!2KMn!5Hq]![%Jm]DhkQrVup\qYpOXrVupEqYpP*rVup\iVs!+!!"><rrXPI
   6.818 +!'Jd2!/:CP!0m*T!6kEB"!p&l-2dfE-1g!n"!mpIPh?!<,ldq0qYpPLrVupEb5VIV
   6.819 +rVupEkl1XtrVurOqYpOXrVuq.K)^H&`;]m(!'m7X"!mpIKt[Kf?iV>>rrN0#IuaO2
   6.820 +;#gSBd/O.i!.VW\!87;N!87;M!2KGl!878L!%%UE!2JNQ"!mpI-2%9?,ldp-eGfN&
   6.821 +rVurBoD\g7rVuqPrr3"o-2mlEA)I:dbl.SB4PB`7bl.SB4So'\ju`ViUW`Z<o-O>8
   6.822 +!6j^-!/:CP!/::L"L06Q-/!nMK)`dh!^H`NU&P3@!!&e-rrQR.+S#I5!!%M/rrY@`
   6.823 +!-HTf![%Jm])MaVrVuq_r;QaZqu?`3r;Qo^,ldoki;Wm*!!"><rrXPI!'Jd2!/:CP
   6.824 +!6k'7!5JL5!/:CO"O&.l!%$P&!6kEB!%$=u!6kEB!%%F?!R0]Krr?R,!!&8Jrr@cP
   6.825 +!!$O(rrC8ps+:9frrPFc5b\2ZUHE&!rrQR.+S#I5!!%M/rrUD,;:#7D+96o&rr@cP
   6.826 +!!#.[rrM7.qu?_Nr;Qb]rVupqi;Wm*!!">BrrQ\-g&D!R,ldp-eGfMYrVurBoD\fE
   6.827 +rVuq_r;Qj]!!">%rrXPI!%$:t"!mpI-0"q*g"G?a!3uD$!+Y9n!6kEB!+UW\K)`@\
   6.828 +!^H`NK)aL'!al!Nnc&Xj!.TV#f`)!q!.VT["Qh!1!%%UD!0m?\!-J/=!'L5\!2KAi
   6.829 +"3cIQbkh>H^Qdm\s5p(u4ET`brrXPI!%%RC"$?P`-3!oH,ldp-q>UQ@P_HmFrrBh5
   6.830 +K`Kg$rs.\.4=):9PW\pF!86uD!/:CP!6kB@"$?P`-3!oFUSIhg"PK#L4I#[A"3d!`
   6.831 +^\e$5@jNE`rW)mC!E&"VrrAhnK`Jm^rrqP,4?R,Kr;Qk/,pb\Q!<"2E;<IlX!gJDl
   6.832 +q>UTNUP5K*qu7"F!!%`Qk&`^34JV3A!V7W7!!#.Urrp/I4?R`#rVm#_;'dMNrW)mC
   6.833 +!+Z$.!p52jrVlq/;;(gG!el?jqu6Ykre1?eK)^H&hZ!XB!'l/9f`)"\!$Lh3!WW4M
   6.834 +K)aL'![%Jm\c2XlrVur5rr2s\qZ$UYrVllNrVupEqu6`h@jV'R!BdXcrs$4<!%$<.
   6.835 +-2dfD-3!oH,ldokrVlj[rVupErr3'H!!#.YrrIg"r;ZjEL&(`LKdHWs!Bd.SrrI3f
   6.836 +p](:?o)A]DrVurBrVm;Z,ldoks8RcQ!)^L.qu?^or;QeO-2dfE-&)?u!5J1,!-J2>
   6.837 +!H]Xc!!+BUqYpSk-2[`G-&)C!^\%R2FT;A_!!">BrrKAer;ZjEA,Q?1,ldokUF#g<
   6.838 +!-IQ,!+Z!."ApHF!%%F?!+Ym+"?`shs)do6%);iB49,@Ys8Ppr!'L/Y"&T$u4T59\
   6.839 +F=$hb!@;6-s+::/rrPFc5_B$grrQR.+S#I5!!%M#s4I>Q+96o%rr@cP!!IEDs5kX)
   6.840 +!!">Drr?R.!!$O,rrL=iq#CE"rr2tPrVupEq>^kes8OAF!'L;]ff]35!/:FP"!mpI
   6.841 +4T,3Z4S\sWFSu.>ff]$0!-J2>!+Y^&!%%49!/:CP!6kHB!R)kh!!@rTs#fuT!87AO
   6.842 +!'L&W"*FSC^\%R,FT2:?4SSmV4T,3ZU\FfjFT9,K!!@?Cs#g8\!6kEA!+Yg)!'L5[
   6.843 +!%%@>!@?mqrrBh5!!4J/4T5<\bkh>>A,$$*Z2\q=!"$F?s!7XF-3*ukrVur5rVm#_
   6.844 +,ldokrr2s\p](:VK)^H&iVrsE!'l/9f`)"\!$Lh3!WW4MK)aL'![%Jm\c2Z_rW!$_
   6.845 +s8S>_!!FT1!!">DrraVJ!%$e*rr>1V!!">Err@cL!!">E!""AZs!7XF4TEVOr;Zh-
   6.846 +rVlsG!!#.[rr?R'!!'e5rrM^;r;ZmF4=0t,!'L8\!/:@O"!p&l-2dfD-1_'9A,ZH2
   6.847 +UWes"-2mlE-3!oE4Sf$X-2mlHbl@]QpAbE4s8Rd8,piKir]C0Xrr2t.r;cgCr;Zi4
   6.848 +rr3#P-2mlG,s3LQ!!YRcs+NQ]-2diC49/7XrrbFa!%$e,rrA;X!!%`Prr=AB!!+Al
   6.849 +rVuq_mJd/KrW!"Rs'u$.!/:=M!0mE^!^&RkrW!.Vs8QRk,piKir]C1&rr30K!!">F
   6.850 +s+UFP!)`^p!-J2?"(VB2A,QE,-2dfD^OlK;s5O%[5QF'$s4I>Q?iV>>rrN0#ItI^Q
   6.851 +rrO;CJ%5L_,ldoks8P4\!!-S>rW!&Es8Skn!!#morr?R-!!?`GUF#m>"-iicL&:oP
   6.852 +A&$7e!!n;Ys!7XF4MN3@!!$O,rrXPI!'L8\!2KJm"&Yi.4T5<\;?$Rq;>gIsL&_1,
   6.853 +rVuqPrr2sErVuq_rVlk-rVupEo)A\PpAb4?^]+654T,6^-$7gorW!#Ds.fMm"&Yi.
   6.854 +4T5<\;>^@q,ldokqu6Z2rVusFU]18n4T5<\L&V)P;>pOqA,cK1YpC]kqu6aE!!">A
   6.855 +rrY@`!%%XE!Tk^-!!>?Jb[^VP!%%XE!%%OC#!DMK,ldpemf*9@rW!$_s8S>_!!#mn
   6.856 +rr=AE!!&enrr[s$4PBZ4!6kEB!'L,X$RGcQ4TGHD,ldokk5PA\-2mlGg&Jhd!!+C@
   6.857 +rr2s\rVuqPK)^H&ir9'F!'l/9f`)"\!$Lh3!WW4MK)aL'![%Jm\GlPNrW!#7jsC!,
   6.858 +!Palu!!@rTs&&aq!5JI3!%%UE!0mK_!5JL5"$HV`L&CuRU]:A<rW!.Vs8OAF!%%OC
   6.859 +!-J,<"!mpI4T>?\4T5<\A,cK5o-FA:-3+"[r;Zhmrr2tPrW!&Es8Skn!!%`MrrXPI
   6.860 +!'KiP!'L#V!BeU)rr>1\!!FUls8RfP!!:CE4T5<\A,cK2o-FA:-2[]E,ldokqu6Xn
   6.861 +rW!)+s8SiVr;ZrQs8Tk5!!#.QrrXPI!%%LA"!mpI-3!oEFT)7?4T59[;>pOtbl@\h
   6.862 +r;Zg[rr3'H!!#.MrrM7.rW!%qs8U=B!!">Crr@cP!!$O$rrC:B!!#.YrrCaO!!#.\
   6.863 +rr>pq!!@rTs.fPn"&]*u;>pOuZ2aj!4T,6[fn06Us5O%[5QF'$s4I>Q?iV>>rrN0#
   6.864 +ItI^QrrO;CJ%5LY^]"36FG9\o!^-M,rW!."s5kU-!'L2Z!2KMn!'L2Z"sj6L-3+"!
   6.865 +rVuq?rVm'a!%$e-s!@LA!)`Um$RGcQ4TGHD,ldokoDS[hA,ZH0bl;2P!!%->rr@cP
   6.866 +!!^[Is'l$/-2RWD,ldp-o)A\PqZ$[D4I#aC!'L5\!3uP'$K`W74TFOi!!">:rVlk-
   6.867 +rVurBr;Qj]!!">BrrsbL!'L:8-2[`CA,cK.;>pOq^[qI-49,@-qYpXD!!">Err=AE
   6.868 +!!';&rrAhn!!@rTs!@UD!5JO5"!mpI4R`:M;>gIp4T6Z+!!+D.rVm!H!!">:oD\n=
   6.869 +!!#.YrrC:B!!#.\rrBh5!!=PIs&&aq$)@P#,ldp-s+Mcs!!$M\s+::0rrPFc5_B$g
   6.870 +rrQR.+S#I5!!%M#s4I>Q+96o$rrqO2!!#,-rW!4gs8OAF!%%YerVuq_r;QbNrVuqP
   6.871 +r;Qs`!!">Fs+UFP!6kB@!6kEA!%%F@!0mB\"sj6L4TGH*rVup\r;QbNrW!/Hs!7XF
   6.872 +-0G1+!/:CP#0d,I49,@-qYpXD!!#.PrrY@`!%%Wg!9X+W"$?P`-2[]Ebl@^erVup\
   6.873 +r;QbNrVurBr;Qj]!!">CrrC:B!!+Alqu?a[U](2p,ldoko)AeS!!">ArrXPI!%%XE
   6.874 +"!mpI-2dcCbl.SEL&_0!rVup\rr2uBrVup\nc&XP4S/URU]18nbl.SBA+KX%,ldp-
   6.875 +qu6Z?rVup\rVlj[rW!5=js:!--3+"hrVusF-2[`D4JRN.K)ad/!^H`NK)aL'!al!N
   6.876 +nc&Xj!.TV#f`)!q!.VKX!%%LB!%%XE#UKHN-.sRE!%%OB!'L5\!6kB@#!;kc-3+"!
   6.877 +rVurBq#:?<qu?^CrVusFbl%JF,ldp-s8RfP!!%`Nrr@cP!!UUH,ldokr;QbNrW!/H
   6.878 +s8P1]!'L,X"!mpI4S&LS,ldp-p&>+V!!">?rr@cP!!%`Nrr@cP!!(7@rr>1\!!(^N
   6.879 +rrC:=!!,3Wr;Qc@rVuq?o)A\PrVurOqu6jH!!">Fs31HB!'L2Z!6kEB",6d;-2mlE
   6.880 +PlC[_bl.SB4RrFObjtf7A,cK.L&M&P^[hC,,ldokqu6Z?rVup\rVlk^rVut/A,ZH1
   6.881 +L&_1sq#CFXUOrMts5*bW5QF'$s4I>Q?iV>>rrN0#ItI^QrrO;CJ%,FXA,?6+FT2:?
   6.882 +;>pOq;>pOqFSl(<A,ZH.bl%JF49,@-s8RfP!!(7<rrC:A!!7964T5<]-1h*8"sj6L
   6.883 +4TGGVrVuqPr;QbNrW!,Gs!7XF-2dcCPl:Xebl@]*!!">ArrXPI!'KiP"!mpI4SA^V
   6.884 +49,@-q#:>hrVuqPr;QbNrVurBr;QaZrVurBrVllAqZ$Xo^\[s1bl.SBL%>6D4T5<\
   6.885 +bkqDI,ldoks8V4-!!#.ZrrC:B!!7lSbl%MAbl7VBbl.SB4RrFOL&M&R,s5'(K`TDm
   6.886 +rVupErr2tPrVurBo)Ae<!!">BrrC:B!!#.ZrrXPI!%%UE!%%XE!6k<?!E$U`s+::+
   6.887 +rrPFc5j&(Jg!&.9rrV>:Pg'./k02'?rrSsLg"HB,?iV>>rrN0#J*-b4bfo59rrTrh
   6.888 +Z-<4Lg!%\2rrJ@<f`)!q!.VKX!2KGl!@?n-rr@cM!!+D.qu6YMrVuq?rVm,b,ldp-
   6.889 +s8RfP!!(7<rrC:B!!H1!s4J^t!!#mprrsbL!'L;]bl.SB4T,3d49,@-s8P1]!%$e+
   6.890 +rrC:B!!B"rs'u$.!0mE]"S3o>!'KiP"!mpI4SA^V49,@-q#:?<rVup\r;Qj]!!">B
   6.891 +rr>1\!!(7ArrC:A!!-T_q#:?IrVuq.o)A\PrVurBqu6aE!!">ErrXPI!%%RC!+Z!.
   6.892 +!mL\grVupErVm#_,ldp-nc&S8rVuqPqYpdH!!">-s8S>_!!&ebrrXPI!%%OB!6kEB
   6.893 +!'L2Z!+Ym+!/:FP!6kBA!Fsf7s+::)rrPFc5jA:Mfd.sD!!4HD^[M1);#gT\rVlo\
   6.894 +bh2psKdAk\,m=8K,pcE`r;QfNg&D!Rf`2!ug&D+]!$Lh3!WW4Ml2M$a,p`Nk,pd'`
   6.895 +n,EJ9!!(^NrrLg+f`)(a,s3J"rW!$H-"F^frrL@+rr3(b!!#mLrrO;CJ%,FXg&(gM
   6.896 +;>pLpbkhA?;>U:mg&:sT--ZDho0!!P"-iicL&M&PbkV2<^]"35L&V)PU\t/mPlC[b
   6.897 +,ldp-rr2sErVuqnrr2t.rW!$ts8QU.!!%`OrrAhn!!?a2s1eL4!0mK_!SKU7!!">9
   6.898 +rrXPI!'KrS"$?P`-27E>-2mlEU]18nA,ZH.;>^@n4T5<\bl%JD,ldokPl1Ogk#!Ee
   6.899 +s8OAF!%#DYrr_Cn4JVfR!'L5\!6k??"!mpI-3!oE;>pOqA,cK.U](5q-3+"hrVupE
   6.900 +r;QjF!!">9rrA;_!!+D.qYpP*rW!%Ss8UdO!!,4ErVlu7;*<)"rrXPI!%%OB!6kEB
   6.901 +!'L2Z!878M!@?n,rraVJ!%!m-rr_C\,s6eZK)aj1!^H`Nl2L`nq#CD:nG`SQ!!%`P
   6.902 +rr]MP!'Js7!%%==%6WeQs)\5@FT;Bb!!"=urrQR.+S#I5!!%N5rr=AA!!+C@nG`S:
   6.903 +!!(7Brr[?C!-Hrp!6k*9!)`aq#s826Z2aiX!!#.7rrO;CJ%#@W-2dfDU\t,l-2[`C
   6.904 +^\Rm0;>pOt,s4:9rVupErr2tPrVurBq#:>JrVuqPrVlk>rW!0Lk5YH-!!#.\rr@cO
   6.905 +!!58F-2dfG^]4>Kr;Zq0^Q_Uo!!">Err>pp!!=N04=0q+!%%49"!mpI4SA^V49,@-
   6.906 +p\t5Ir;Zm]4=0q+!5JF2!'L5\!6kB@!/:@O"XRZ4F?ClK!!:jRL&CuV;2'^6,ldok
   6.907 +qu6XYrVurBqu6aE!!">ErrBh4!!4H/4T,6^L&_1srVupEr;QaCrVurOoD\eQrVuq.
   6.908 +q>UH0rVupErr2sqrW!'I@tfV6rVup\qu6aE!!">BrrC:B!!#.Yrr>1[!!$O,rr@cO
   6.909 +!!OZYKlfF'rVurOK)^H&j8T0G!'ofK!^$G_r[%LC!+YR!"$?P`L&V)PA,ZH.bhE's
   6.910 +-1q6Hg&M'u!!">Fs3(HC-/&;"?iV>>rrN0#J*Ht7,ldrE-2dfDU[e?d,ldqhrr3'H
   6.911 +!!">!rrC:9!!=PIs5s:\##YF#K`D*8g&D*r!.VHW!)`^q!@@@8rr>1[!!">?rrLe!
   6.912 +p](<!rr2tPrVurBq#:>JrVuqPr;QaZrW!.Es8OAF!'L5[!'L#V!-J2>!'KoS"GQmU
   6.913 +jsB^$!@?n"rrXPI!'KrS"$?P`-2.?=4SSmVFSc";4T5<\bkqD?4SAaT4T>?\4SJgU
   6.914 +-2[]B4T5<\bkqDB,ldokrVlk-p](:Vrr2uBrVup\r;QaZrVurBo`"pErVusFk4nrV
   6.915 +4T5<`g&M**-2.B>;>^@q,ldokqu6Z?rVup\qu6YkrVusFk55/Y4SAaT4G*Tbs5O%[
   6.916 +5QF(6rs(Xd!/:IQUHJMU!5J+)"$?P`L&V)SYpBB4g&D1$!!%,Ur6,4r4GEe7$$6.I
   6.917 +FT;Bb!!"=urrQR.+S#I5!!%N5rsC%P!6kKCKd?^!-1V!;,ldqhrr3(B!!%,prrgOG
   6.918 +!%!?sbQGV%4L+nc#s81fZ2aiX!!#.7rrO;CJ%#@WPl1R^g&1jMPl1R^L%kTJ^EraW
   6.919 +!@=N>rr@cP!!(^IrrCaO!!&8]rrBh5!!\/Ws!7XFA,ZE.juiJ?!+Yp+!'L)X!%%UE
   6.920 +!'L8\!TlN@!!FSJ!%$e!rrZ*u!+Y^%"$?P`-2.?>juiJ?!+Yj)"$?P`-2IQAF=$b`
   6.921 +!@;7Rrr>pl!!,sMqu6a\!!">ArrZ*u!'L2Z!+Yj*!'L2Z"!mpI4T,3ZFT)7?bk(i:
   6.922 +,ldpep\tB2!!">-rr3#C4Sf$Y-"HfO"!mpI4So'[,ldpTqYpXD!!#mlrrI3fq>^OB
   6.923 +@tO`4s5EtZ5QF(6rrY@`!/:CO"$?P`A+KX%49,A8rVlo\bh2pt,ldqho`"sFbl7VE
   6.924 +bQ%Vhg&D+]!$Lh3!WW4Ml2Li3!!(7BrrgOl!!&ebrrXPI!6kEA!SP]Mrr^IF!%%7:
   6.925 +!R06rrr[rT!'Js7![%Jm[Jp>+,pd[1rrhI1!!#.SrrM7lr?VJSk5>5]^EikBpAY2J
   6.926 +4GEY3!i%kfrr3(q4Ak8<rr@cO,lplXq>UJj4T6W2;5=/r,pfhorsHMN4=):9FP0M;
   6.927 +L%50DKn]1!",/$IFS,S5L&E:u;8;o+"/@.gFSPkAk(Po[,pb[-k5,)YUJ^t9!Frn?
   6.928 +rr]#B-$9"`"6O*'g&(dMUHJN%!Bd.SrrZ*u-):D<"2?,^4S&LRk(T&mrrTH&^\e$3
   6.929 +PW\mj!HdK"rrZaW-*d=H!l%TSq>UQ@4Ajf,rs7b@4?Oo94GDpLs+::/rrPFc5jA:N
   6.930 +49,A8rVltR!!#.PrrY@`!/8l$"!mpIbjYQ6bQ%Vhg&D+]!$Lh3!WW4Ml2Li3!!(7A
   6.931 +rrY@`!/:"D"!mpIbgZRobQ%Vhmf*BC!!#.7rrO;CJ#`MNfnG.Bk5PG7OT,@Dk2H=?
   6.932 +k2ZIAk4JZRk2H=@bi\d%!TqVWrrD3RrrD25s+:9ZrrPFc5jA:N,ldq?rVltA!!#.Z
   6.933 +rreR.4GCQJrrY@`!/:FP!mEc(qu6i7;'dMNPl:U_FCY.H!b5a&p&>+?!!(79rrSrX
   6.934 +FT2:BbQ%Vhqu6l8F?DZ_Pih-.!al!Nnc&Xj!.X;6"O$iG-0G1+"$?P`L&M#Tk(R;B
   6.935 +L$&=5"!mpIbl7VDUHEYqrro/[,pcE`rr3&Q@tjdZ!ngG)p&>-<!!">;rrR:)U]18q
   6.936 +K`D*8qu6hp@luk`UZMLW+96nCs+:9&s+:9&s-EZd5QF(6rrXPI!6kHB"O&.l!0mK_
   6.937 +!L+o.!!%->rrY@`!/:FP"$?P`L&M#OU\b#q-):KM!!#mnrr[rT!)`Fh"=4$J@m'`:
   6.938 +"$A\Cg&:pW,ldqhs8U:C!%%RC!+Ym+!@=N(rrQR.+S#I5!!%N6rr^IF!%%UD!2KMn
   6.939 +!87AO!H]Xd!!+C@rVlsG!!(7BrrXPI!6kEA!+Ym+#!CT=49,A8qu6aq!!&8WrrpUH
   6.940 +!$u_LrZqV.4Ce?i"3^`F-3!oHK`D*8rVloO4So*Z--YQP![%JmK)^H&K)^H&K)_/:
   6.941 +!^H`Nl2M5>!!(7Ck(P)]!%$e-s+U7K!0mK_"$?P`L&V)S49,A8rr2u5r;ZgDrW!!G
   6.942 +s)e5?!0mH^"Qh!1!)`Fh!%%@>!'L5[#pfQObl@^e!!">Drr?R(!!(^9rrQR.+S#I5
   6.943 +!!%N6rs-aJ!%%[Ffjk!]!'L8\!)`Rm!@?FurrXPI!6kHB"!mpIbl7VBL&M&Q,piNj
   6.944 +##YC_!!"=urVlkmrVuq_pAY-:p&G)&rr3)E!!">Err[rT!'L5[!'L&W!%$h.![%Jm
   6.945 +K)^H&K)^H&K)_/:!^H`Nl2Lf2!!*!Er;[;%s8Uau!!"<TF<pne-3!oH49,A8rr3'_
   6.946 +!!%`Prsq3l!%#D[^H;Kns77N:!%%UD!+Z!.!5J4,!%%@>!'L5[#pfQObl@^e!!">E
   6.947 +rrAhn!!d#Xb`jCR!/9Y:!al!Nnc&Xj!.X;6!6kEB!@9&j!!FV$s8S>_!!4HgA,ZH.
   6.948 +;?$Rt,ldqhrr3TW!!(7Cs4J[u!'KE+UEonos1eO5!)`^p"$?P`-2%9<bk;#:FT2:B
   6.949 +^An6[rr3(S!!#.\rr?R.!!e5%b]G-2!6j[,![%JmK)^H&K)^H&K)_/:!^H`NlMgnI
   6.950 +-2ITB-):J>&Q&N.--ZDhbU!5h^]4<r!!%`PrsC%P!/:IQK`D*!bl.PAbl7VBPl:Xf
   6.951 +FT;C',ldpBo`#%?!!"<Bqh5%4rr2uBrW!/Hs8U:C!%%XE#<VtdA,lS(4T5<\^Zb\!
   6.952 +?iV>>rrN0#J*R%6U\Olj4O!g)$7,ZP4S/UQPQ1\0rr30K!!(7Cs31HB#0d,I;#gSY
   6.953 +r;QcMrr2t.rW!&*s8Skn!!%`GrrC:B!!+BUr.P-8rVltR!!">Ert0qb!'L;]js:!-
   6.954 +PlLc;,ldokkPkT+!.TV#K)^H&K)^H&QN%"O!'oiL!6k?@"!o78k5G;^,ldpTrVm0d
   6.955 +!!%`Qs#^8]L&V)Y,ldq?s8OAF!+Yd'#!;kc-0G5;rVur5o`#">!!(7:rtETV!%$e-
   6.956 +s3(HC-3+"u!!"=hKdHZt!+Y3l!al!Nnc&Xj!.X;6!/:=N![TsnrVllArVuqnrVmWZ
   6.957 +!!(7Cs!7XFbl@^e!!">-s5kU-!2K>h$K`W7!'L;]49,@-o`#$;!!"><rr[rT!%%XE
   6.958 +%#"Z]4TGGG!!#.D@jV'R!2J`W![%JmK)^H&K)^H&K)_/:!^H`NlMh%3!!"=hbkh>>
   6.959 +bl.SBbl.PJ49,A8s8P1]!/:FP#pfQObl?>r!%$e%rrB>'!!Qm4,ldpBoD\n=!!(7:
   6.960 +rr^IF!%%XE$HrJM-3+"[!!";kr;Zj\UZVRX?iV>>rrN0#J*R%;K`D*8bfoq`",-^T
   6.961 +-2dcX,ldqhs8OAF!6kKCbQ%Vhs8S;`!%%@=!-J2?!MdF/!!%`Frr^IF!%%=<",-^T
   6.962 +4T>?fK`D*8s8R0@!$rri!!,s3k5PK*!.TV#K)^H&K)^H&QN%"O!'oiL"3^`F-2@K?
   6.963 +bl.SBbl.PJ49,A8s8P1]!/:FP#UKHNbl>le!%%=<"Ao.!-"HoS!5J.*"!mpIbkD&=
   6.964 +bQ%Vhrr32H!!">Fs+U=M!Bd.<rrQR.+S#I5!!%N6rr[rT!'L&V",-^T-2dcX,ldqh
   6.965 +s8OAF!6kKCbQ%Vhs8RcQ!)`Fh#:0?M4Ac(Y-1h-=bQ%Vhp&>,J!!#.\rs"/W!'L;]
   6.966 +4T#0\,uMG<rrO;CItI]Ps+:9&s+:9:rrPFc5jJ@ObQ%Vhq#:?IrVurBrVm0M!!&8`
   6.967 +s#^8]L&V)X,ldqhs3(HC-2%9<^\\!24S&LS,ldqhpAY6=!!">Ers$[I!%%[FPl:Xa
   6.968 +,uMG:rrQR.+S#I5!!%N6rr[rT!'L&V"-`cc-2miZjs:!-g&M'u!!(7Cs3(HC-3+"!
   6.969 +!!#mhrr@cM!!$O#rr^IF!%%=<",-^T4T>?bK`D*8s8Psq!!4HVk2QCB+96nCs+:9&
   6.970 +s+:9&s-EZd5QF(7rr^IF!%%C>"!mpIA,cK8UAt9?k5YHD!!%`Prs9tO!6kK*,ldq?
   6.971 +rVlr]KtmQc!+Yp,!2K,b"!mpIbkD&=bQ%Vhrr3>L!!">Fs4IAP-'\?-!l&6!kl1]l
   6.972 +!$Lh3!WW4MlMgs?!!#.VrrCaO!!&8_rrZa2!%%XE&1%;Vbl@^e!!">Fs.]Po--Z>f
   6.973 +!l'HOr;QaZr;ZjEk4ATTbQ%Vhp&>,J!!#.\rsFG[!'L;]PQ1\0^\n*5UJ\;[rrO;C
   6.974 +ItI]Ps+:9&s+:9:rrPFc5jJ@ObQ%Vhp\t5'rW!!sKk()^!)`aq"$?P`L&V)V,ldq!
   6.975 +s8Psq!!d#K^LJPi-0G1+!Tk^-!!#.OrrXPI!6k0:!6kEB#0d,IbQ%Vhrr2s\rVupq
   6.976 +re1G:!!">/rrQR.+S#I5!!%N6rr[rT!'L#U!'L5\!b6p]rVuqPrr30K!!(7Cs31HB
   6.977 +%F"kP,ldokFNgLW!!#.ZrrAhm!!$O"rr^IF!%%=<",-^T-3!oWK`D*8s8V4-!!"<T
   6.978 +KnXUp!!#.FrrO;CItI]Ps+:9&s+:9:rrPFc5jJ@ObQ%VhpAY+Tq>^OBk5PA_49,A8
   6.979 +rr33L!!%`Qs4J^o!!+D.r;Qb,rVuqnnc&\;!!(7:rrC:B!!^[Is3(HC-3!oFfd6Cn
   6.980 +!)_t[!al!Nnc&Xj!.X;6",-^T4SSjVbU*)c!'L5["sj6Lbl@^erW!&Es8Skh!!#.Y
   6.981 +rraVJ!%$durr^IF!%%=<",-^T-3!oHK`D*8rr2tnpAb2Ikl1],!.TV#K)^H&K)^H&
   6.982 +QN%"O!'oiL"6Lm0;>1"jff]04!BeU)rrZ*u!5JO5"&T$ug&D!PbWPb&!E%PIrrY@`
   6.983 +!'KcN"!mpIbk:u;,lf7jrr^pS!'L5[!p3?+qu?aDA*<jn?iV>>rrN0#J*R%9YlFcX
   6.984 +pAY/u-2[`C;>gFq,lf7irrOJH-2miEUF#g<!@;7QrrhI1!!$O!rr^IF!%%=<"2=g9
   6.985 +;?$RtPQ1]*rVlo54So*Z-&(O^![%JmK)^H&K)^H&K)_/:!^H`Nl2LeHbk(i;ULQD`
   6.986 +U\aukKqnSG!R06orro0-4?R`=qYpQ1rVuqnnG`PP!%%:;!p7_hrVlr(L$&:4!Tp0V
   6.987 +K`JmLrrQR.+S#I5!!%N5rrLg+oD\rX;*8@'qu6`NKtmTd!p7_hqu6ha;*6t*k5,)\
   6.988 +K`D*!k4/HRjs:")o`"sFbl%JAPa)%E!SN_:K`K?YrrO;CItI]Ps+:9&s+:9:rrPFc
   6.989 +5dC=k;#gSBmf*:2_>aRE!$Lh3!WW4MZ2XnP!!#mbrrM9+_>aQZ!.TV#K)^H&K)^H&
   6.990 +QN%"O!'mji"Qh!1!/7QT!al!Nnc&Xj!.V<S!2KMn!5GZ9![%JmK)^H&K)^H&K)_/:
   6.991 +!^H`NZMt&L!!">-XoAH1!$Lh3!WW4MZMt"h!!"=HrrO;CItI]Ps+:9&s+:9:rrPFc
   6.992 +5dLCl,ldpBXT&?0!$Lh3!WW4MZi:0j,ldq!XT&>E!.TV#K)^H&K)^H&QN%"O!'mji
   6.993 +"!mpIUTFIs?iV>>rrN0#J$].XbQ%Vhk,eRa+96nCs+:9&s+:9&s-EZd5QF'TrrQ[V
   6.994 +4KJJ`?iV>>rrN0#J$T(U4=+L<rrO;CItI]Ps+:9&s+:9:rrPFc5_B$grrQR.+S#I5
   6.995 +!!%M#s4I>Q+96nCs+:9&s+:9&s-EZd5QF'$s4I>Q?iV>>rrN0#ItI^QrrO;CItI]P
   6.996 +s+:9&s+:9:rrPFc5_B$grrQR.+S#I5!!%M#s4I>Q+96nCs+:9&s+:9&s-EZd5QF'$
   6.997 +s4I>Q?iV>>rrN0#ItI^QrrO;CItI^crr>R2!!"*ms+:9&s+::6rrPFc5_B$grrQR.
   6.998 ++S#I5!!%M#s4I>Q+96nCs6BUb*>6OK!>kfgs+:9&s+::6rrPFc5_B$grrQR.+S#I5
   6.999 +!!%M#s4I>Q+96nCs6BUb*@/g8!A=G)s+:9&s+::6rrQ!s5_B$grrQR.+S#I5&-.33
  6.1000 +s4I>Q#QT@+s6BUb*@/g8!A=G)s+:9&s+::6rrQj6+G0XGrrP^k5k4jU-idY,s4I>Q
  6.1001 +!!%e+s6BUb*@/g8!A=G)s+:9&s+::6rr[`N!9\t6gA_9L&--,.rrPFc."_KPrr]_1
  6.1002 +!2kGKlMgl*,g0Nq0*$V(K)^H&K)b$6"2=g9LP#Q[rr]G)!2oAe"+L:Na+F?FrrZ@'
  6.1003 +#k*BFlMgl*,g0Nq0*$V(K)^H&K)b!5""4-Tf7O%Xrrhd-!#YJ#rrh3b!%@Sns4mVV
  6.1004 +^An71K)b*8!?EH/?NDe[K)^H&K)^H&k5PP0#QQi9s4mVV?iU2!n,EKV!!%7qs5!\X
  6.1005 +pE0GIkCW`urrF,cb?k9'!.t6&s+:9&s5j7`IfKI>kCW`lrrhdu!!#RWrrbRe!-n6i
  6.1006 +s5<n[a!^ofT7[+,rrF,cb?k9'!0[?^LWMd]T7[)ps,d6bpG`-Q&=;R3s5a1apSSi.
  6.1007 +!$LIlrrq9k!!"FNK)am2!T//$!!#iIs6'C_*@/g8!A=G9rrE*,b7am]*J4<Cs,[0\
  6.1008 +mpQ(o!'#QqjZieOrVusikNi-Kf/Wa0!"a`IjZif"rVus)LP#QgrrF,cb?k9'!0[?_
  6.1009 +!%,l`!?E24s+:91rrKSGJcO^/!>qHlrrIl\JcO^/!BA\_s5j7]*@/g8!A=G9rrE*H
  6.1010 +b=r!X*J4<Cs,6mXYAgO-r;Zg?^d%s7TC:nA!r&TpY<W(!rVup0]KcLBc[u2WrrF,c
  6.1011 +b?k9'!0[?_!%,l`!?E24s+:9&s0D\'!!%M#s3(EB5lL``5_B$+rrF,cb?k9'!0[?_
  6.1012 +!%,l`!?E24s+:9&s0D\'!!%M#s3(EB5lL``5_B$+rrF,cb?k9'!0[?_!%,l`!?E24
  6.1013 +s+:9&s0D\'!!%M#s3(EB5lL``5_B$+rrF,cb?k9'!0[?_!%,l`!?E24s+:9&s0D\'
  6.1014 +!!%M#s3(EB5lL``5_B$+rrF,cb?k9'!0[?_!%,l`!?E24s+:9&s0D\'!!%M#s3(EB
  6.1015 +5lL``5_B$+rrF,cb?k9'!0[?_!%,l`!?E24s+:9&s0D\'!!%M#s3(EB5lL``5_B$+
  6.1016 +rrF,cb?k9'!0[?_!%,l`!?E24s+:9&s0D\'!!%M#s3(EB5lL``5_B$+rrF,cb?k9'
  6.1017 +!0[?_!%,l`!?E24s+:9&s0D\'!!%M#s3(EB5lL``5_B$+rrF,cb?k9'!0[?_!%,l`
  6.1018 +!?E24s+:9&s0D\'!!%M#s3(EB5lL``5_B$+rrF,cb?k9'!0[?_!%,l`!?E24s+:9&
  6.1019 +s0D\'!!%M#s3(EB5lL``5_B$+rrF,cb?k9'!0[?_!%,l`!?E24s+:9&s0D\'!!%M#
  6.1020 +s3(EB5lL``5_B$+rrF,cb?k9'!0[?_!%,l`!?E24s+:9&s0D\'!!%M#s3(EB5lL``
  6.1021 +5_B$+rrF,cb?k9'!0[?_!%,l`!?E24s+:9&s0D\'!!%M#s3(EB5lL``5_B$+rrF,c
  6.1022 +b?k9'!0[?_!%,l`!?E24s+:9&s0D\'!!%M#s3(EB5lL``5_B$+rrF,cb?k9'!0[?_
  6.1023 +!%,l`!?E24s+:9&s0D\'!!$BF^Aum*rrC*Y^Aote!!#99s.')i*@/g8!A=GrrrM:)
  6.1024 +aT);fb=r!X*J4<Cs+:9Vs1\O7%&h>K!J:Nj!!#'3s.')i*@/g8!A=GrrrTq8;p0%Z
  6.1025 +!%,l`!?E24s+:9&s0D[=!!!nZrr<A?!!"-ns.')i*@/g8!A=GrrrTq8VT[cr!%,l`
  6.1026 +!?E24s+:9&s0DY)$,6H?#L!,IfY.=c.Y@\jrrF,cb?k9'!6bBD^At.Sh#RL&b=r!X
  6.1027 +*J4<Cs+:9Vrr@\d!!!bWrrCrk!!*,!K)_A@!?EH/?NDe[bPqXY!2drq!<=Ii9`Z7T
  6.1028 +K)^H&K)`+U!RZtI^Aph(!!".brrCsT!!%5_^B1s,mt1S/rrF,cb?k9'!6bBD^At.S
  6.1029 +h#RL&b=r!X*J4<Cs+:9&s760i@/^-++Nscbhu*NTT7[)ps4mVT*@/g8!A=GrrrTq8
  6.1030 +VT[cr!%,l`!?E24s+:9&s+::Arr?I+!!".brrCsT!!&XCs+::+rrF,cb?k9'!6bBD
  6.1031 +^At.Sh#RL&b=r!X*J4<Cs+:9&s760i@/^-++Nscbhu*NTT7[)ps4mVT*@/g8!A=Gr
  6.1032 +rrTq8VT[cr!%,l`!?E24s+:9&s+::Arr?I+!!".brrCsT!!&XCs+::+rrF,cb?k9'
  6.1033 +!6bBD^At.Sh#RL&b=r!X*J4<Cs+:9&s760i@/^-++Nscbhu*NTT7[)ps4mVT*@/g8
  6.1034 +!A=GrrrTq8VT[cr!%,l`!?E24s+:9&s+::Arr?I+!!".brrCsT!!&XCs+::+rrF,c
  6.1035 +b?k9'!6bBD^At.Sh#RL&b=r!X*J4<Cs+:9&s760i@/^-++Nscbhu*NTT7[)ps4mVT
  6.1036 +*@/g8!A=GrrrTq8VT[cr!%,l`!?E24s+:9&s+::Arr?I+!!".brrCsT!!&XCs+::+
  6.1037 +rrF,cb?k9'!6bBD^At.Sh#RL&b=r!X*J4<Cs+:9&s760i@/^-++Nscbhu*NTT7[)p
  6.1038 +s4mVT*@/g8!A=GrrrTq8VT[cr!%,l`!?E24s+:9&s+::Arr?I+!!".brrCsT!!&XC
  6.1039 +s+::+rrF,cb?k9'!6bBD^At.Sh#RL&b=r!X*J4<Cs+:9&s760i@/^-++Nscbhu*NT
  6.1040 +T7[)ps4mVT*@/g8!A=GrrrTq8VT[cr!%,l`!?E24s+:9&s+::Arr?I+!!".brrCsT
  6.1041 +!!&XCs+::+rrF,cb?k9'!6bBD^At.Sh#RL&b=r!X*J4<Cs+:9&s760i@/^-++Nscb
  6.1042 +hu*NTT7[)ps4mVT*@/g8!A=GrrrTq8VT[cr!%,l`!?E24s+:9&s+::Arr?I+!!".b
  6.1043 +rrCsT!!&XCs+::+rrF,cb?k9'!6bBD^At.Sh#RL&b=r!X*J4<Cs+:9&s760i@/^-+
  6.1044 ++Nscbhu*NTT7[)ps4mVT*@/g8!A=GrrrTq8VT[cr!%,l`!?E24s+:9&s+::Arr?I+
  6.1045 +!!".brrCsT!!&XCs+::+rrF,cb?k9'!6bBD^At.Sh#RL&b=r!X*J4<Cs+:9&s760i
  6.1046 +@/^-++Nscbhu*NTT7[)ps4mVT*@/g8!A=GrrrTq8VT[cr!%,l`!?E24s+:9&s+::H
  6.1047 +rrDNbrr?I+!!"/<rrDNArrD6ZrrCsT!!&YgrrDM>s+::2rrF,cb?k9'!6bBD^At.S
  6.1048 +h#RL&b=r!X*J4<Cs+:9&s7uZr:fsq"rr?I+!!"/?rr^kl+QqJY"0X,.hu<WUhu*NT
  6.1049 +TDnimpRauqK)^H&j8T-#,g0Nq0*'2q!l"`4bM<1!-Hf*a*?Bb3K)^H&K)bZH#L<AM
  6.1050 +(hf8N;>pP#*P\M%0E;)lf`).0!!#96\#90)#CO:A?jH`<kCW_cs5X+[*@/g8!A=Gr
  6.1051 +rrTq8VT[cr!%,l`!?E24s+:9&s+::Grr>md!!*Agf`(rTnGiQ.K)^H&ir9$",g0Nq
  6.1052 +0*'2q!l"`4bM<1!-Hf*a*?Bb3K)^H&K)bWG!7139!-$Nh!&4!E!=7k?s+::1rrF,c
  6.1053 +b?k9'!6bBD^At.Sh#RL&b=r!X*J4<Cs+:9&s7cNn;"O_g#j9e=!3bto!-!PiK)ag0
  6.1054 +!?EH/?NDGQb<Q+_!1_6g!<=Ii9`Z7TK)^H&K)^H&p\t6>oDel1eGfM&o`,!ukCW_c
  6.1055 +s5EtY*@/g8!>baZ0ENL"I*:=H!%,l`!?E2KrrBfcJ"1ug[t=Y#rr>mh!!*AgeGfNP
  6.1056 +o`+u2K)^H&i;Wfu,g0Nq(BDXo!g!D0bM<1!-Hf*a*?CUK!3^tSRK*>kK)`pl!71?=
  6.1057 +!-$Bd!&4-I!=7k?s+::/rrF,cb?k8d!6`.ZO8s[Oh#RL&b=r!X*Ld!.It@Zh!!%M#
  6.1058 +s2Y->;"t"k#j9Y9!3c+s!-!PiK)aa.!?EH/?NCrCbJ41@!.;uG!<=Ii9`Z7TRf<G=
  6.1059 +!!%WNT)Sil!.TV#a8Z.cp](;5d/O)"q#CF$kCW_cs53hW*@/g8!>ba\^]r$0X?`?=
  6.1060 +j3?B\!%,l`!?E2LrrRZM!.t6BrrN0#ItI^?rr>ml!!*Agd/O*Lq#CD6K)^H&hZ!Ts
  6.1061 +,g0Nq(BDt#"O>ren+l\W"T7uamc;mR!<=Ii9`Z7TRf<G=!!%WNT)Sil!.TV#`r?%b
  6.1062 +q>^M7cMmkuqZ$X&kCW_cs5*bV*@/g8!>bag^]VO-l20iI"9%iVhq6`c!%,l`!?E2L
  6.1063 +rrRZM!.t6BrrN0#ItI^>rr>mn!!*AgcMmmJqZ$V8K)^H&h>[Kr,g0Nq(BE4*!lEOQ
  6.1064 +jo5D]oB=oa!<=Ii9`Z7TRf<G=!!%WNT)Sil!.TV#`W#qaqu?_9bl7Ysr;Zj(kCW_c
  6.1065 +s5!\U*@/g8!>bal^]MC0qr%JTr9E(n!<=Ii9`Z7TRf<G=!!%WNT)Sil!.TV#`;]g6
  6.1066 +rVus)kKNr+YPeG$E.\+As4mVT*@/g8!>bam^]E$\pAY9I[srm8r'1BmIt+rZpAY0h
  6.1067 +k2+np!%,l`!?E2LrrRZM!.t6BrrN0#ItI^=rrCCE!!$u\rrb"U!!qb>s+::+rrF,c
  6.1068 +b?k8d!8tWn`pNR$!lodMn,NMTLX5bq!V5.+h#RL&b=r!X*Ld!0IfKJ#s.95l!!%M#
  6.1069 +s24j=:]Ldab5VRI!!$tis+::*rrF,cb?k8d!9(]of_bOF!nV)kl2Ul&Gh;fl!W;->
  6.1070 +h#RL&b=r!X*Ld!0IfKJ#s.95l!!%M#s24j<cN%q*rrOk[kCW_cs4dPS*@/g8!>baq
  6.1071 +^]<QorrKSgj8]3?\,-+)mc*%'!%,l`!?E2LrrRZM!.t6BrrN0#ItI^;rrH6baSu:E
  6.1072 +E.\+As4[JR*@/g8!>bar^]<QprrL_BhuEdKhu!ESo%rH`!<=Ii9`Z7TRf<G=!!%WN
  6.1073 +T)Sil!.Tq,\\A-T`kMM[Y.ju"K)`%S!?EH/?NCrCjhLo6lhg\^GkV1B)eEf*TqT-u
  6.1074 +f*8m]TlOpM'_hY/#`&<W!VP=2h#RL&b=r!X*Ld!0IfKJ#s.95l!!%M2rr^l&5VRci
  6.1075 +U]:N'5Y.7!K)`7Y!?EH/?NCrCk.h#9mJQtbh`1E3!ZPIKnCI`8<ttH1!BA^/rrMfL
  6.1076 +k1p%<-Hf*a*?CUK!e11Mdf0B`L"YMd"6NH,FRK/0biX`]!WW4MPlCgZLF@`SRfEIC
  6.1077 +YCce`rrF,cb?k8d!9_,u_Xm^*!RD>S!!3@2Y3OU>Ti(Xd!>*TTrrD`Sh#RL&b=r!X
  6.1078 +*Ld!0IfKK?rr^q#-"H':"2=g94QHGAL&M&PbjbW849-[)^UjFHUQjojrrN0#J!L$7
  6.1079 +T-4(4"!D9,LP!:>^BD#qIom9\!!+dgK)`C]!?EH/?NCrCkJ.)\r;Qf4&GlG.0=Bro
  6.1080 +!N74>!!*YWr;QcbkM6.=-Hf*a*?CUK!e11MoD\efrVurOk5PO;!!">*rr@cP!!(75
  6.1081 +rrA;]!!,s3^&J4F!!">-ec,[N!.U@8!T,=)!!49^c[u1hrrTZC)#aL98FM01]DhmP
  6.1082 +,g0Nq(BE[7!8.5L!P\p<!!*:Ej4==YAbuH.+Q*+s!9WM$!<=Ii9`Z7TRf<G=!!)Wj
  6.1083 +!'L5\!6jU*"$?P`4QHGAL&M&Pbjk]5L&(cN-$8:brr=AE!!&86rrN0#J!g6>^CUAF
  6.1084 +(nZE[Rf<TdIh2S[.+a(N]`/!Q,g0Nq(BE^8!QtB>rrL^_qu?aT[G]X;W$;->!?gk0
  6.1085 +rrN&Ul.l@?-Hf*a*?CUK!e11MoD\eQrVurBk5PNG!!#.Arr@cP!!(75rr@cJ!!+Bf
  6.1086 +_>aKtrVurOec,[N!.UF:!13Zb!Isiqs-N`hmoTPi&@[8k^&J*R,g0Nq(BE^8!:Tmd
  6.1087 +!Uh0/!!,4/p"'8fTn`J\!f`o#p"'5e./X&G3;<CO!:oC1!<=Ii9`Z7TRf<G=!!)Wj
  6.1088 +!'L5\!6jU*"$?P`4QHGAL&M&Pbjk]5L&M&Q4=0k)!BeTDrr_Cn4L*E9!WW4MRf<Mo
  6.1089 +!!!;&K)_&7"GZsW#g\,&^Ae3S,g0Nq(BEa9!8.5L!+>^)!Bea(f)s0?6Oi_h!uk*l
  6.1090 +d.l2nasd/f!.XqH!9WS&!<=Ii9`Z7TRf<G=!!)Wj!'L5\!6jU*"$?P`4QHGAL&M&P
  6.1091 +bjk]5L&M&SbiXU*qu?aDUQb]Z!!%M<rrg@J!"dJ.s,m<aY5ePFkCW`KrrF,cb?k8d
  6.1092 +!:.E$_YO01!2'/h!Bea)f)j*+%Ia?!%;!]Xf)a#Br;Zj(ci*kDq<Hc:!%,l`!?E2L
  6.1093 +rrRZM!;$3j4T5<\bi\p349,@Ds8TifL!8f]!/:CP!6k!5!/:CP!6kHB!M_dT!!&e]
  6.1094 +rr^q:4O!g)!R/dBrr^qO;;(sK!l'H5p](08!9WhO!WW4MSGr`T(]XiVK)^o3"HNN_
  6.1095 +3;8%)_#FEU,g0Nq(BEd:!8RPQ!V[H0!!+%cq:>Y:'^Pf#)lWSa!Q,BF!!#RfrrD9K
  6.1096 +h#RL&b=r!X*Ld!0IfKK?rr>1\!!(76rrKlEr?VJdk5G;`49,@D@jV'R!@=!*rrJ?H
  6.1097 +r?VJS^\n*3L&M&Pbjk]5L&M&Pbl%J@L&CuP--Z5c!M`Nk,lqN<r;R1&!!#.]YpBAM
  6.1098 +-):Kor?VGtq#:AZ4T6W-;5=$g"&U?jg&D!U49,@Ys)]Rd!!,4+r;Qhn4=0n*!@>#A
  6.1099 +rrN0#J"6N@Du]m)K)^i1")%Z7O+RDIrrF,cb?k8d!:7K%_YO01!0@$X!0m<2!++jh
  6.1100 +!-n=k!-nDA!3cA$!;Ys:!<=Ii9`Z7TRf<G=!!)Wj!'L5\!6k*8!V91b!!+Bfrr2s\
  6.1101 +p&G)&qu6]@4S\sWA,ZE-L&M&Pbjk]5L&M&PbkqD@^ErjZ!'L2Z!SKU4!!+C@rVm!H
  6.1102 +!!"=0qu?aD4So*YL&:lNUF#a:!BeU*rrC:B!!$O.rraVJ!$sc)!!#.[rr?R(!!#.P
  6.1103 +rrN0#J"?TAhZs3YK)^f0"SW`5)#&X^_>aNV,g0Nq(BEg;!8.8M!V[H0!!#C_f)a5c
  6.1104 +q>^U/:k,,8^B:*X:^Hmt!*B!J!%@dG!&4?N!9WY(!<=Ii9`Z7TRf<G=!!)Wj"$?P`
  6.1105 +-1q3<fd6@m"3gfF4S8[SL&M#PjsBa%!2KPn!/:CP!6k!5!/:CP!6k<>!R)kh!!&8_
  6.1106 +rrM7.q#CFAg&D!R,ldoko)Jb:r;Qb,pAb1Urr2uBrVup\rr2sEp&G30s8Skk!!">E
  6.1107 +!!#.PrrN0#J"?TA:]LLAK)^c/"0V\)O+RDJrrF,cb?k8d!:7K$n,<7dO8T%Z#/'ib
  6.1108 +!RNt+!!,'Wp&>*fT-4"2!)`UE!3#eq!5JL4!:oL4!<=Ii9`Z7TRf<G=!!)Wj"!mpI
  6.1109 +-1q3;4T,6e;3[h%!!">-s8P4[!!GEZbfjSr!!+D.rr2sqrW!'IFG5EGrVupqrr2tP
  6.1110 +rVurBnc&TCrVurBq>UGKrVup\rr2s\r;ZmF4=0t,!)`aq!%%LB!'L/Z![V>&rVurB
  6.1111 +rr2tnr;ZpGFKo?T!!$O.rrC:B!!%`Prr=AB!!.2+rW!%Ss8R3?!!d#Xg&J<'!/:"D
  6.1112 +!WW4MT)SoM!!#iIs,$aW0E;rAs2"^9*@/g8!>bb'^];IRrr=bO!!$@%f)T.T!!+4W
  6.1113 +nG`N]&GuM.Er+Af6i?ub;#UCprnd%u!<=Ii9`Z7TRf<G=!!)Wj"!mpI-2%9<L&CuO
  6.1114 +U]18q,ldokrr3*`!!"=0r;Qb,rW!%Bs8Tk5!!PLVs8ThrrVuq.rr2tPrVurBnc&TC
  6.1115 +rVurBq#:OE!!">-s.fMm$^C\kbU!5h-0G7--2[`DL!9Jq"&\4\FT)7?PlC[_-2mlI
  6.1116 +4S/UQL&M&PU]18n^]"35L&V)P-2[`LU]:??!!#mrs'u$.!0mH^!SO7<rrN0#J"HZB
  6.1117 +LB%=hK)^]-",?jV^OlL&rrF,cb?k8d!:@Q%hYmHS^\e'3[JSPUY5A8#+Q)Ve!RD>U
  6.1118 +!!*;,qpth;r;Zj(kPbD\l0[:-!%,l`!?E2LrrRZM!;$3m,ldokp&>"<rVuq_rVlsG
  6.1119 +!!#.\rrY@`!'L,X"sj6L4TGFkrW!&8s.`Hh!!'e5rr@cP!!(75rr@cP!!(7<rr>1\
  6.1120 +!!:CE;>pOqFT)4>FT)7BU]:??r;Zn`s31HB!'L8\!6kEB",6dTPl:X_4T59[L&M&P
  6.1121 +bl7VBL&M&PL&V)P-2dfDFT2:E,ldp-s8Skm!!,3WmJd4f!.UU?!^H_sK)^Z,"5a(Y
  6.1122 +BS-9$rrF,cb?k8d!:@Q%n,<7d@/U'*0Da9#0DtkO&D-dY#5R`J^Y\\_qYpT2#lO`'
  6.1123 +./MNq'`A"3L].5Qo'P66!%,l`!?E2LrrRZM!;$3m,ldokpAY-:rVup\r;QjF!!#.\
  6.1124 +rrY@`!'L,X$TnCh-3*uk!!"=!4T#0[-):G=!/:CP!6k!5!/:CP!6k6<!'L5\#0d)n
  6.1125 +!!">-rVllArW!%Ss8ODE!!?a2s4RAO!'L8\!87>O"$HV`4T5<\Z2O\&L&M&Pbl7VB
  6.1126 +L&M&PL&V)P-2mlE-3!oIjs:!-4T>?\A,H<-4JVBF!WW4MTDo#^!!$DYs+gUU2uk@Y
  6.1127 +s2+d:*@/g8!>bb(^];=Nrr<W/!!%cNf)VuO!!'5#rs\_YaM>TQ!.<VYipZjDrrA,X
  6.1128 +!!'2!f)TUb!!"_OrrE#bh#RL&b=r!X*Ld!0IfKK?rrXPI!%%@=!/:CP!/:@N"!mpI
  6.1129 +4T>?_49,@DqYpa^!!">Fs!@I@!@<Hsrr@cP!!(75rr@cP!!(7<rr>1\!!UU/,ldok
  6.1130 +r;Qc@rW!.Vs8OAF!%%UD"!mpI4T59d,ldp-s8OAF!%%RC!/:CP!6kHB!/:CP!/:FP
  6.1131 +!%%UE!+Z$.!6kEB!'L5[!H]Xc!!,sZnc&Xj!.UX@"4$rIYCce0rrRZM!.t6frrF,c
  6.1132 +b?k8d!:IW&eG]CI^\n-5#138!!(6\b!*K1!!U%>u^]KStI/Vk%i:[$J!&4?O!(6Y8
  6.1133 +!5/40!8mbT!93G&!<=Ii9`Z7TRf<G=!!)Wj"!mpI4SJdTL&M&PL&CrQ,ldp-rr3'_
  6.1134 +!!#.XrrtRc!%%[F-2RZC-&)0p!/:CP!6k!5!/:CP!6k6<"XO-K-3)3g!!#.ZrrC:B
  6.1135 +!!\/Ws!7XF-2miG,ldp-rVm0M!!">Fs!7XF-2dcCL&M&Pbl7VBL&M&SL&_1sr;Zi4
  6.1136 +rr2uBrVup\r;Qi\@jV'R!@?FirrN0#J"Q`C[f?ESeGfS[4L+SZ!jOkAW;ck[n,NC2
  6.1137 +"2@\qg&(dOk#"7UqYpZN4=,^-rr\kn!9\t6_uB`X,g0Nq(BEm=!9!hU!/LLQ!&+6$
  6.1138 +!Q,-?!!(@DrrMZ,r4iAq!.=_#!T*\OrrB8#!!'G(f)QN`!!&qqrrD<Oh#RL&b=r!X
  6.1139 +*Ld!0IfKK@rrC:B!!#.TrrA;_!!%`NrrY@`!'L8\"$?P`4T#-`fd-Uu4TGF-r;Zj\
  6.1140 +U\FcgL&M&Pbjk]5A,ZH.bk_8=L&M&V4TGF-!!">CrrAhn!!]4us!7XF-2miG,ldok
  6.1141 +rVm0d!!">-s!7XF-2dcC^]"35bl7VBL&M&SL&_1srVusFk5PA\bl.SB4Sf!XKdH]u
  6.1142 +!)`=e!WW4MTDo"c!!)34rr?R.!!%`IrrAhn!!&dorrR9B4S/RSk$o_7!!#mnrrY@`
  6.1143 +!%%LA!'L5\!5Hn\"1J71c[u27rrF,cb?k8d!:IW&li$h`=T&4"?Mi=SGl7UB;#L=n
  6.1144 +bko0WO8s\*h#Q[:rr=bO!!%9@f)S2:!!%9BrrDQVh#RL&b=r!X*Ld!0IfKK@rrC:B
  6.1145 +!!#.Xrrh#/U]8R;!!#.ZrrY@`!%%XE"$?P`4T,3[o0!!P#F,8g,ldokU\k&mk*2,0
  6.1146 +rr@cP!!(75rr>1\!!(7>rrAhm!!B"rs!@XE!5JL4$9S:g-0G7-,ldokrVls^!!">D
  6.1147 +rr>1\!!:CE4T5<\^]"04bl.SBL&V)PL&M&SL&_1srVupEr;QjF!!">?rrgOl!!">9
  6.1148 +rrN0#J"Q`BIfKJurr>pp!!&8ZrrAhm!!&7arrAhn!!&8VrrJl@q#CC@r;Qblr;Zhm
  6.1149 +r;QcMr;Zh-d/O3g!!'ccs24j;*@/g8!>bb(^]=!)rr=bO!!&#Uf)Rr3!!'5$rrDB]
  6.1150 +^]KStI/;Y!q>L<nO8T%Y;>\rFEr>t<;#UCoo^:N9!%,l`!?E2LrrRZM!;-9kbl.SB
  6.1151 +FT2:Bb`ksNrW!"Rs!@XE!0mK_!L+o0!!B"rs#g8\"XS9*b]G01!!#.\rr@cP!"C6.
  6.1152 +g&M)rF<pneU]:@JrVurBnc&SOrVuqnqu6YMr;Zg[rr2tPrW!'IUWgJ8rVupqrr3'H
  6.1153 +!!">Drr>1\!!(7Brr@0?!!8qqPl:Xd4Qc\Dfhq_K!'L8\!/:CP",6dTbl.SB-2dcL
  6.1154 +,ldoks8R1'FMIhT"MZ5_!%%49!WW4MTDntB!$Kek!SJdt!!'e2rrL=irVup\X8`4R
  6.1155 +-2mlEA+op&U\=`g-2dcC;>gIp;>gFoPl1R^-.)YohZ*YkK)`ag!?EH/?NCrCm_Ai"
  6.1156 +rVlj'r;Zi*r7:tr#5nN%hu3QTde^`\O8s\)h#Qd>rrBh4!!"5?f)V<=!!"GGrrDl_
  6.1157 +h#RL&b=r!X*Ld!0IfKK@rrBh5!!=N0,piBf!^-Kmr;ZmF4=0n*"&]*u4S8[S^]"04
  6.1158 +-2[`D,piHh"2Fm9L&M&Pbjk]54T,6[-2fq+-2dfE-/&7s!%%C?!@?FurrXPI!%%UD
  6.1159 +!-J2?!6kHB!/:CP",6d;-2mlG,s3LN!!C"9s+UFP",6dTbl.SB-2dcC4T5<]bfp"c
  6.1160 +r[%LC!)`=e!WW4MTDntB!$Kbj!R)kh!!+D;r;QaZrVusFk,\L^4T,6[4SSjUU\k)n
  6.1161 +;2',k!!">Crr=AD!!">Crr>pp!!"=lrr_-Y!5F-c_uB`X,g0Nq(BEp>!65!;!8%,K
  6.1162 +!7:Yq!3#hr!#YY6!6"`L!g!D0qV;/1rVlllqu?`Dr7:qVqu?`krr2usmbImD-Hf*a
  6.1163 +*?CUK!e11Mo`"odo)Jlts8P4S!!:jR4SJgV-*dCJ!R*\#!!$O.rr@cP!!(75rr?R$
  6.1164 +!!+Cir;Qf4-2@N@U](2p49,@-rVlkOrVuqnrr2u5rW!%1s8Ske!!?*us-3K_#DN3X
  6.1165 +js:!-4T,3Z;>pOsbiU5H!!+D!o)Aak!.UX@!e11mdf0<^r;Zg[rVlk-rVusFbcCaD
  6.1166 +L&:oN-2@K@bU*5g!@>M[rrZa2!'L5[!Tk^,!!">Crr=AC!!(6jrr_-Y!5F-c_uB`X
  6.1167 +,g0Nq(BEp>!6G-=!5JI4!#5=^!0-pW!(d(g!;60'!g!D0q:u&JrVljGr;Zi#r7:qq
  6.1168 +qu?`SrVu<A!<=Ii9`Z7TRf<G=!!)Zk!Tk^'!!=MnA(gh\!FmGS!":/`PU-;Uk5V\4
  6.1169 +,s3LP!!4HVk5##XKdHWs![U^KrVlu)!!#.MrrGtCpAb4Vg%t^LbWPe'!BdXbrr[rT
  6.1170 +!)`^p!/:CP!/:FP!87>O!)`aq!O4cb!!PK[49,@krr3'_!%$e,rrXPI!)`[o!0mH_
  6.1171 +"53^h4So*[,uN@crrN0#J"Q`BIfLV=rrA;^!!?a2s+UCO!0ljM"5-OKg&D!Q^P0nS
  6.1172 +rrLe!qZ$W?q>UFWrVusFbl%JBFCX#&rrBh2!!(7BrrCaL!!'d]rr_-Y!5F-c_uB`X
  6.1173 +,g0Nq(BEp>!7(QC!5JI4!%@`r!-8#<!-nJB!9a0n!g!D0q:u&ErVlj_r;ZhkqptfW
  6.1174 +r;ZiTrVu<A!<=Ii9`Z7TRf<G=!!)Wj!O4cc,m6>-KtldGrrhJZKnZ<$rrUl-^]"06
  6.1175 +k5YJ[bk1o<g!#/7bk_8>g!&g_"I)"p,lmoj!Frn<rrBh5K`Jm`rrLfsr;Qc3rVurO
  6.1176 +rVltA,s9lYrrC:BK`Kg*rrJ@Kr;Qc@r;Qi54Ce6f!b4?trVllNrIk9Ik3r<O!!%M@
  6.1177 +rrRZM+OL,gA,QB.KtmQd!)`Ok!L,_F,lqMjr;Qs`!!#mrF=$nd!BeTlrrP;/;<@fX
  6.1178 +4T5<\-2mlEPktC[FT)7@--Z#]!/::M!/:FP!/::M!/8i#"5a(Y^OlL'rrF,cb?k8d
  6.1179 +!:R]'d/EtE^\n-42>bu*C]+55J,TBIi;(.iO8s\(h#R0Irr>=_!!&_if)Qcg!!(pT
  6.1180 +s6e\D!%,l`!?E2LrrRZM!1*Wck02W\!l'H([/U1-!.UX@!e11mci3u-r;ZgDrVusF
  6.1181 +oD8IfbWP\$!+Z!-"=4$J,s;&)!'KWJ!0mH_!6jX+!/:CP!Bc)8!!$O+rrM7.rVuq_
  6.1182 +oD\eQqZ$V+rr2s\qZ$V+dJj=+!!'ccs24j;*@/g8!>bb)^];a[rrBh4!!"nRf)TUb
  6.1183 +!!%NIrrD!Q^]KStI/2RupAP!k5lCZ_U&3FA)uTa:hu3TCh#RL&b=r!X*Ld!0IfKJ#
  6.1184 +s.95l!!%M@rrRZM+O9ue4Sf$X^\[s2jsBa%!2KPn!%%==!5Iq$!/:CP!6j[,!Tk^-
  6.1185 +!!0@KrVupEqu6Y+rVupqo)A\9qZ$aFs8V4-qZ$UYdJj=+!!'ccs24j;*@/g8!>bb)
  6.1186 +^];a[rrBh4!!"nRf)TUb!!%NIrrD!Q^]KStI/2RupAP!k5lCZ_U&3FA)uTa:hu3TC
  6.1187 +h#RL&b=r!X*Ld!0IfKJ#s.95l!!%M@rrRZM+O9ufbU*/e!0m<Z!)`^q"=8/DKi.gL
  6.1188 +!)`aq!%%LB!HaS*!!%`?rr@cP!!(7,rr>pq!!Z=#s!7XF-2[]B-2mlE^[qI*g%k[N
  6.1189 +-3+"0rW!'`,ldokdJj=+!!'ccs24j;*@/g8!>bb,^]W$Cn+6MX!5JI4!&aZ*!,MN5
  6.1190 +!.XtI!;H<X!oq&Pq=XgerVlj_r;Zhkqptfer;ZiTrVlunoBYE,h#RL&b=r!X*Ld!0
  6.1191 +IfKJ#s.95l!!%M@rrRZM+O0od;>gIp4Sf!W^]"3:4S/UQ^HDJq!+Z$.!%%OC#,D4u
  6.1192 +,ldpBnc&T2r?_FCr?VGcmJd0krW!'Ik5YHDrVur5rVlkmrVup\o)A]SrVus]4T5<^
  6.1193 +^]-Fq!!/<HrVurOdf0F,!!'ccs24j;*@/g8!>bb.^]DaRq>UH0r;ZgTqptg`r;ZhI
  6.1194 +jSo3Fr;Zhkqptfer;ZiTq>UKfj7M..!%,l`!?E2LrrRZM!.t6BrrN0#J"Q`BIfLV:
  6.1195 +rr?R+!!';#rr?R.!!C"9UJ^ph!5JO5!%%RD!-J5?"!mpI4S&LQjsB[#!6jm2!'L5\
  6.1196 +"B!BsKdH]u!/:CO!+Z!.!0m'S!'L5\!L.^*!!dW.,ldoks'u$.!2J!B"5a(Y^OlL'
  6.1197 +rrF,cb?k8d!;=2/_WU[n!5JI4!&aZ*!,MN5!.X)0!'pJ_!29;A!#tk:!8mPN!:BI8
  6.1198 +!<=Ii9`Z7TRf<G=!!%WNT)Sil!.UX@!e11mci4!!q>^OBoDAOk,ldokKfo85!@=N>
  6.1199 +rr=AE!!">ErrhI1!!#.Orr>1T!!">6rrM7lo`+tSrVlj[rVurBo)A\9rVuuP^]"36
  6.1200 +4I#gF!`Au^rVuq.df0F,!!'ccs24j;*@/g8!>bb0^]<]orrBh4!!"nRf)TUb!!%N0
  6.1201 +rr>=_!!&_if)Qcg!!(pMrrM`JpY>iM-Hf*a*?CUK!e11MK)_GB!WW4MTDntB!$KYg
  6.1202 +!2KJm!B_\-!!#mnrr=A@!!+C"qu6XBrVuq.rr2uBrVup\nG`U7KnX%9!!K(@b_>3J
  6.1203 +rr>1R!!">Drr>1\!!(77rrBh5!!ahMs!7XF,piNj!i,e>rVupEdf0F,!!'ccs24j;
  6.1204 +*@/g8!>bb1^]<*]rrBh4!!"nRf)TUb!!%N0rr>=_!!&_if)Qcg!!(pLrrDZbh#RL&
  6.1205 +b=r!X*Ld!0IfKJ#s.95l!!%M@rrRZM+OU2hU\t/o-1eD?!!&8]rr=AB!!+C"qYpQ>
  6.1206 +r;Zi4rr2uBrVup\mJd0?rVurBli-rIquH[A!B_\-!!(7Brr>1\!!'e0rrSsL^]+65
  6.1207 +A,ZH1;?-YYqZ$UBrr3*I!!">-e,KO-!!'ccs24j;*@/g8!>bb2^]DIRr;QeQ+LV7O
  6.1208 +5aV6CrrD-Th#RL&b=r!X*Ld!0IfKJ#s.95l!!%M@rrRZM+O^8jbU*5g"=;:ls'u$.
  6.1209 +!@>tgrr=AD!!,3Wq#:?<rVusFk5PA\bl.SB4RN.KL&M&Pg$J_=^\n-5UWiZ9!+Z!.
  6.1210 +!/:FP!-J2?!)`Xn#j+ta!%$e-s!@XE"-iicFSc%<A,cK.4T5<\UXT5FhZ*YkK)`ag
  6.1211 +!?EH/?NCrCpqQmirVlom33iMb0^nu?!;6-C!<=Ii9`Z7TRf<G=!!%WNT)Sil!.UX@
  6.1212 +!e11me,KHm-2mlF--Z>f!'L5\!'L5["=4$J-):A;"m2&6s8U=B!!">CrrXPI!%%%4
  6.1213 +"0hh+-0tR2;>pOq4So'X^]"354T>?\g&1mNA,ZE.KdHZt"3gf--2mlHbl@^rqZ$W2
  6.1214 +rr2tPrVupqe,KO-!!'ccs24j;*@/g8!>bb2^]=91rr?H2!!#:_rrN,Vq:u&O-Hf*a
  6.1215 +*?FVK!8"@Q!e11MK)_GB!WW4MnG`L?Z2XlT!$Kek!R)kg!!';%rrBh4!!#mqrr@cP
  6.1216 +!":0-g&M)rF<pneU]8R;!!">CrrXPI!%%"3!l'HOm/I+K-2mlEU\Xoi-2mlEg&D!O
  6.1217 +A,QB0,s4:9qu?g]s8U=B!!">Drr=AD!!">DrrBh5!!"=orr_-Y!5F-c_uB`X,g0Nq
  6.1218 +(BF9H!6kEA!8"@R!8mbT!9a16!<=Ii9`Z7Tnc&Z_+LeKQ!e11MK)_GB!WW4Mo)Acp
  6.1219 +0UK'E!e11mec,[4-2dfDU\aujL&CuOA,cK.-2[`D,piHh!l+cZrVupEr;QaZrVurB
  6.1220 +ec,VkrVup\q#:>9rVuq?rVlj[p&G)&rr2tPrVupErVlk-r;Zh-r;QaCrVurBeGfX.
  6.1221 +!!'ccs24j;*@/g8!>bb3^]<$crr@<B!!#!gIfL>a!!'5$rrD?[h#RL&b=r!X*V9:5
  6.1222 +T-++NXT&?O!!("<!-J2d"$A\f^OlLFrrN0#J+WaDY:oq^n$2loIfLVArr@cO!!&eh
  6.1223 +rr>1[!!M!Ts3*V"!!d$6s5kU-!'L2Z!)`^q!6j!n!)`^q!2K>h"Qh!1!'L2Z!'L&W
  6.1224 +!BdXcrr@cP!!#.[rrBh4!!'e3rr>1\!!%`&rr_-Y!5F-c_uB`X,g0Nq(BF9H!8.8M
  6.1225 +!+>a*!2$e$!+>a*!2'5i!:'C9!<=Ii9`Z7Tp&>&b+T;?@E30'@IfKJgrrAhi!!+C1
  6.1226 +K)ap3!WW4MpAY/s0`D%P:pBs$IfLVArrA;_!!&efrr>1\!!(^NrrIg"qu?dE;6g*"
  6.1227 +"!mpI;>gFoPl:X_g"$*)ffUQjpAY5i,pg>'rrJlWr?VJAU\k&k^]"35U\t,o49,A'
  6.1228 +qu6YMrVuq_eGfX.!!'ccs24j;*@/g8!>bb3^]<$crr?I*!!&YjrrMB.]u9tDr;Zhi
  6.1229 +rVll_q:u&O-Hf*a*?FnS!M:M4!!(?HrrRZM!65$=L%bQJ4P>>dk5PJ_!.XeD!O"3T
  6.1230 +!!'4,rrRZM+OpDmKfl.'rr_ji-&)3q"PM"QPg'"(!l$j-qYpV,4L)j)!9WSH!i&Vf
  6.1231 +qYpSkbk_8?F<tGGrr_-Y!5F-c_uB`X,g0Nq(BF9H!8.8M!+>a*"/#Vn`Oh'/2#RCS
  6.1232 +TDecilM96:!%,l`!?E3VrrJ`7qZ$U5X8`6N!!(%=!/:CP!@9&h!!+C@K)b$6!WW4M
  6.1233 +qYpT"0_tbLpTXZ!IfLUCs+^OUhZ*YkK)`ag!?EH/?NCrCq7m!_rVlk*r;Zqls7_Sd
  6.1234 +MuY^5!!&YirrD?[h#RL&b=r!X*W,j;T-3q0!'mUb!e11M`r?$mrW!)Fs3-]iqu?`3
  6.1235 +K)b'7!WW4Mr;Qf$0_k\K+KteHIfLUCs+^OUhZ*YkK)`ag!?EH/?NCrCq7m!_rVlk*
  6.1236 +r;Znks7!UY!&XWS!2'5i!:'C9!<=Ii9`Z7TrVlnj+SPj9@&s;/IfKJgrr@cP!!(7A
  6.1237 +rrJ?1rVupEK)b'7!WW4Mrr3#&0_YPI5d11hIfLUCs+^OUhZ*YkK)`ag!?EH/?NCrC
  6.1238 +q7m!_rVlk*r;Znks7!UY!&XWS!2'5i!:'C9!<=Ii9a)OXs8S]6RfLJ.!/:CP!6kB@
  6.1239 +!R)kh!!&8Js8:(@k3`0Lbi\d%!R0^"rrLg+q#:EKbfo2Kr6,0'ir9/^!.Y$P0Ve[O
  6.1240 +0W0C#+G0WJrr_-Y!5F-c_uB`X,g0Nq(BF9H!8.8M!+>a*!h]M^\r6VGr;ZhirVll_
  6.1241 +q:u&O-Hf*c*?CapR/l+D!^%c+m/I'>rVurBqu6Y\rVup\qu6]3A,R\S4I#^B!i%k(
  6.1242 +qu?aDZ2=P%UJ_":!Ft9irrXPI-/&4r&L@E'Z2aj!,s9l\UHBh&!'Js4rrKAerW!!G
  6.1243 +;8;u-!P`.C,lp,mqYpVl4=0n*!@>#2rrW6$="p9I!cn>aK)^T*"5a(Y^OlL'rrF,c
  6.1244 +b?k8d!;XD1f_tgM@/U',TE"DlMuY^5!!&YirrD?[h#RL&b=r$Y&eLE1hu<\@rVurB
  6.1245 +mJd/`rVurBqYpXD!!#.Zrr@0:!!+CirVlk-p](:VrVloO4So*Z-):J>!2KMn!/:CO
  6.1246 +!6kEB#DN3X,ldpB4So*Y;>pLpU\OliA,Q?,FSPn;--Z>f!+Yd(!'K<A!WW3/T)\pk
  6.1247 +!$HmnLAqA5!!'ccs24j;*@/g8!>bb3^]<$crr?I*!!8emn@FPY2#RCSTDecilM96:
  6.1248 +!%,l`"<ANOIh8%Khu<\1rVurBmJd/KrVurBqu6Y+rVup\rVlk>pAb1Urr2tnqZ$UB
  6.1249 +rVup\rr3#]-2@ND-/&=uL&M&PL&M#OL&M&SL&_0!pAb1>rr2u'pAb3;rr2t?pAb1U
  6.1250 +rr2tnqZ$UBrVup\j8T5^!.0bDU&Y9,HN51?s+^OUhZ*YkK)`ag!?EH/?NCrCq7m!_
  6.1251 +rVlk*r;Znks7!UY!&XWS!2'5i!:'C9!<=Ii9a2UYs8VP;&G?)(33.N156(]@rr@cP
  6.1252 +!!(71rr>1\!!(7ArrM7lr;Zh>rr2u5r;ZstKnXUprW!&Rs8R3?!!d#Xg&J<'!/:FP
  6.1253 +!'L2[![TrTrW!$ts8Psq!!&emrr@cP!!@rTs!@RC"XRY)!!">Err=AE!"*5[b]G-2
  6.1254 +!87DP^\n-8;2'^G-2mlHg&M(orW!15bh<$$,liYZrrrH'J,f8()"mq0.'\7)Qfihu
  6.1255 ++G0WJrr_-Y!5F-c_uB`X,g0Nq(BF9H!8.8M!+>a*!h]M^\r6VGr;ZhirVll_q:u&O
  6.1256 +-Hf*a*?G+Y!q1UMp](:rX8`6N!!)'Z!-J/crW)mC!-Ic2!'L5\"a#HP@lu(9!!+D;
  6.1257 +rr2sqrVuq_rr2tPrW!'Ik5YHkrVuq_rVloOU]18nU\t0"PlLd-,ldokk5RRC!!(7A
  6.1258 +rr@cP!!@rTs!@UD$&/EZ49,@-s8RfP!!#mprrUl-^]+65;>pOqPlC[_L&M&T-0G7-
  6.1259 +A,ZH.Pl:U_fq[R,!WW4Mrr3&oNu7Wl!'%1^!e11mK)^T*"5a(Y^OlL'rrF,cb?k8d
  6.1260 +!;XD1f_tgM@/U',TE"DlMuY^5!!&YirrD?[h#RL&b=r!X*W,j<msboF!!#!ZrrRZM
  6.1261 +!9F.\jsB[#!6k$6!'KoS!@>thrs7a5!!#mrk&_pJ!!#mqrrAhm!!,3WqYpOmrVuq?
  6.1262 +rVlk>rW!"ps#g8\!6kEA!/:CP",6dT-2mlEPlC[i@fQKks8OAF!%$e&rs7a5!!#mr
  6.1263 +k&_pJ!!#mqrrAhm!!,3WhZ!WW!.XqH!r%`mq>^L4YQ"ZR!$HmnLAqA5!!'ccs24j;
  6.1264 +*@/g8!>bb3^]<$crr?I*!!8emn@FPY2#RCSTDecilM96:!%,l`!?E3VrrVY=&GuM/
  6.1265 +&GN:+!e11Mj8T*Ap&G(=nc&SOpAb7@A*3ai!2KMn!d%ouqu?^or;Qb,qu?a[U\t,p
  6.1266 +,ldokk5G;[bl.SDL&X:7!!(7Arr@cP!!^4<s!7XF4T,3^@o:qZU](5nFSGe8U](5p
  6.1267 +FCQWp!!#morr?R,!!,3Wi;WiY!.XkF!r%`mqZ$WZYl=cS!$HmnLAqA5!!'ccs24j;
  6.1268 +*@/g8!>bb3^]<$crr?I*!!8emn@FPY2#RCSTDecilM96:!%,l`!?E3TrrVY=&H)S/
  6.1269 +YH7a*IfKK.rr^K!Kk()^"Ja2bL$%q*!'L#V!@>#Jrr@cJ!!,s3qYpS<-2[`K;<IoY
  6.1270 +js:!--2dcCbl.SDL&X:7!!(7Arr@cP!!^[Is!7XF4S\pVA,ZH.g%YLHL%kWK;8;u-
  6.1271 +!H]Xc!!,sZir9&[!.XeD!r%`mr;ZhYYl=cS!$K\h!R.><K`Rt2lMgs?,s9D's4I>R
  6.1272 +hZ*YkK)`ag!?EH/?NCrCq7m!_rVlk*r;Znks7!UY!&XWS!2'5i!:'C9!<=Ii9`Z7T
  6.1273 +p&>3aIh2S[:osZuIfKK+rr@cP!!(71rr>1\!!">B!!+Bfr;QbNqZ$[D;8;l*!p3u=
  6.1274 +r;ZpGg&K:q!!#.ZrrC:B!!7lSFT)7?bl.PAL&M&Vbl@\h!!#.VrrY@`!%%@=!/::M
  6.1275 +![U^Yp\t<W@jV'R!@?FZrrN0#J+imGpQ$-k!&1YW!e11mdf0;EqZ$[D;8;Jt"!mpI
  6.1276 +4T,3\k(UR7rrTrhg!Tg%hZ*YkK)`ag!?EH/?NCrCq7m!_rVlkBr;Zmq^U1Rc!$D.>
  6.1277 +!2oeq!:'C9!<=Ii9`Z7ToD\s^Ih2nSXoAHP!!(pV!/:CP!86c>!'L5\"52@;-2[`D
  6.1278 +4PB`6!/:@O![V@=o)A`E-2mlK;?-YB!!">CrrAhn!!8qqL&M&P^]"04L&M&Vbl@\h
  6.1279 +!!#.VrrY@`!%%@=!/:@O![V@=o)A`E-2mlE;<.ZX!!%N@rri(W(]`0mrrRZM+Og>k
  6.1280 +jsBd&!-IW."!mpI4T59_fd-UuFI)q,Pl:X_Z-rXShZ*YkK)`ag!?EH/?NCrCq7m!Y
  6.1281 +rVllDXoJIJrVllYq:u&O-Hf*a*?F\M!q1W:XoAHP!!(pV"0hh+-1(X34T5<abl@_*
  6.1282 +@jV'R"=:>Qs.fPn!'L,X!l'HBq#:TC,ldoks8ODE!!'e4rrtRc!%$e-Pl:X_L&M#O
  6.1283 +L&M&Vbl@\h!!#.Vrr@0?!!&ekrrgR!s8Skn!!#.XrrTrhg%bRMbU!5h-0,",!!%N>
  6.1284 +rrVqUO0S]dIfLV?rrC::!!$NsrrXPI!'L5[!/:CP!%!s2!'L5\!)_2E"5a(Y^OlL'
  6.1285 +rrF,cb?k8d!;XD2_YsH5!'mag!$M4>!9!\/!<=Ii9`Z7TRf<G=!!(mU!l'HOm/I&J
  6.1286 +rVurBrVloO4T#0]^]4<[rW!I+^]4>rUJV!k4TGG'4ES@;rs-:b!!">Fs+UFP"=9he
  6.1287 +^HDJq"&]*ubl.SG4MT+TKfo>7#0d,I,ldp-q#:?/rVusFPlC[fUHAMVZ2ahMrW!I+
  6.1288 +^]4>rUJV!k4TGG'4ES@;rrg(_!!">*rrN0#J"Q`BIfLV?rrC:B!!IDfbbI<!!!':m
  6.1289 +rrXPI!'L5[!2KMn!)]'^!+Z!.!0kq3"5a(Y^OlL'rrF,cb?k8d!;O>0j8JuYh[$Lf
  6.1290 +!>+/errD]dh#RL&b=r!X*Ld!0IfKJgrr>1\!!(7?rr?R-!!>@`s+U@Nr[%LC!^-M,
  6.1291 +r;cgCr;Zgprr2sEp](=@g&D!O-2%<CPlLb0!!#.Urr>pp!<+;C!!@rTs+U@Nr[%LC
  6.1292 +!^-M,r;cgCr;Zgpj8T/\!.UX@!e11me,KElrVuqPrVlk-rVup\n,EJ9!!#.ZrrSrX
  6.1293 +A!HupKfk(:rr_-Y!5F-c_uB`X,g0Nq(BF6G!6kB@!S9<=!!3F.fDPXKj7qF2!%,l`
  6.1294 +!?E2LrrRZM!65$=4T5<\bkh>>U](5n4T>?\FS>b<--ZDO-27H@-/&:t!P]rV!!&em
  6.1295 +rr@07!!\/Ws!7XF4SJdT4SSmW-/&:t!-Ir8"=;:ljsBd&!@?FZrrN0#J"Q`BIfLV?
  6.1296 +rrA;_!!%`NrrY@`!%%+6"!mpI4G*Ucrr_-Y!5F-c_uB`X,g0Nq(BF3F!9O+X!T-HH
  6.1297 +!!@G[^UM1U!+c$.!I+#0rrDQ_h#RL&b=r!X*Ld!0IfKJgrr]MP!'L&V"0jsNbl.PC
  6.1298 +^JQ<T!!4HgoD\aj^HDAn![U^sr;QfA4T#0[4L+e`!H]Xc!!">E!!\\fs!7XFFS5Y7
  6.1299 +F=$hb!@<HsrrTr4-2[`E-$8bXrrKksqZ$[D;;'t/!WW4MTDntB!$Kbj!/:CP!5JI3
  6.1300 +"$?P`-1Cj9,ldp-nG`R6bi[LV!TqW(rrLfsqYpTLbl.PCKfk(grr^r=UZVLS!jOjt
  6.1301 +rr3)_UQjI'rrQ[mZ2Xb)b_<ggrr_-Y!5F-c_uB`X,g0Nq(BF3F!Q+O,rr?I*!!Akn
  6.1302 +s7F:^!/CFP!2'/g!;-!@!<=Ii9`Z7TRf<G=!!("<!TqVmrrgQ@Ktl=:rrCaNK`Rt2
  6.1303 +q#:?/re1?ep\tN6KnZ;Ts)]Psrr3&7;0;C/"J^ZJKtm?]"O*Wp^Y/G_!87=)!Mef8
  6.1304 +rrN0#J"Q`BIfLVWrrZaW4Qc&2!/:CP!6kB@"!mpI-2dcIk&`^3,s7t"rrXPI!'L5[
  6.1305 +"2?-.A,?30@jM*T,pe9DrrQ%DFSYq=YpC]koD]EU4=-d&^JQ:'!%"E?s+LFQA,Q?2
  6.1306 +K`D*8s8Skn!!9pZ4T5<]-$9.d#Nd<4!/:#A-2mlE;>gFrKdA%?rr314!!">FUF#m>
  6.1307 +!@=N:rrJm:r]C48k3r<PhZ*YkK)`ag!?EH/?NCrCp:p^Op&+gi@/U'-TE"r``Rb*E
  6.1308 +r;Zhir;Qcdp"]WK-Hf*a*?CUK!e11MK)_GB!WW4MTDntB!$LY.!87>O!/9h?!/:CP
  6.1309 +!6kEA!-J2?!)`^p!JMis!!#.ZrrXPI!'L5["?ZYa-0G.*!'L)X"!u1kA,ZH.Z24J&
  6.1310 +,ldokoD\qj!!"<BqZ$gHs8OAF!%%RC#!;kc-3+"!rVus]-2RZEU]:A<rVusF-2RZB
  6.1311 +A,ZE0,ldokrr2s\rVup\qZ$XCk5>5[KdHTr!@<Hhrr_-Y!5F-c_uB`X,g0Nq(BF*C
  6.1312 +!:0U`!+>a*"/#VnoYoD^LA_)PTDecimI]38!%,l`!?E2LrrRZM!.t6BrrN0#J"Q`B
  6.1313 +IfLVXrrC:B!!%`?rr@cP!!LOGs4Lo\!!'e5rr@09!!$O-rrXPI!'L5[!'L5\!6kEA
  6.1314 +!'L#V!^-L)rVusFoDJUgL&M&P4S/RQ4SAaYbl8sh!%%RC"sj6L-3+"!p&G1Ws8U=:
  6.1315 +!!">DrrXPI!%%XE!'KrT!-J2>!'KuU!'KfO"5a(Y^OlL'rrF,cb?k8d!;+&,kPbD\
  6.1316 +@/U'-TE"r``Rb*Er;ZhirVll_o\BNJ-Hf*a*?CUK!e11MK)_GB!WW4MTDntB!$LY.
  6.1317 +!6kEB!/9h?!'L5\!^&Rkqu?_,rr2u'r;ZmF4=0q+!5JO5"!mpI4T59^49,@-rVlkO
  6.1318 +rW!9OUWfJq!!#mrjsC!,!+Ys,!%%UE!2K/c!'L/Z![U]@rVuuCg&:sO-2dcI,ldok
  6.1319 +s8RfM!!k]^49,@-s8U=?!!4I2A,ZH.bl7VE,ldp-rr2s\qZ$e0UEom?4T>?\4T,6^
  6.1320 +4GAJdrVupEnc&^K!!'ccs24j;*@/g8!>bb.^]<Qrrr?I*!!@G[^UM1U!+l*/!2'5i
  6.1321 +!:'44!<=Ii9`Z7TRf<G=!!%WNT)Sil!.UX@!e11mnG`Na4T6Z+!<"2D;=XYd4SJgU
  6.1322 +A,ZE-4T5<`4Qc\DA,ZH.A,cK1,ldp-rVls^!!">Drr=AE!!'e4rrJ@Krr2tPr;Zi4
  6.1323 +rr2tPrVupEo)A\Pr;Zq0oDaOD!!1<frVup\r;QsI!!">Fs+U@N"$HV`L&M&Rg&K:o
  6.1324 +!!=Oks31HB!0mK_"!mpI4T>?\4T#0cA,lQk!!">Fs-3K_!@>MZrrXPI!%%18"5a(Y
  6.1325 +^OlL'rrF,cb?k8d!;+&,kPbD\@(61:TDecilL`m5!%,l`!?E2LrrRZM!.t6BrrN0#
  6.1326 +J"Q`BIfLV\rr=A<!!%`Drr>1W!!+C1rVllNrVusFk5G;^,ldokrr3'H!!#.[rrXPI
  6.1327 +!%%XE!/:CP!-Ir7!'L5\!)`aq!%%UE!/:"D!'L5\!+Z$."eu%t-0EGN!!#.ZrrsbL
  6.1328 +!%%[FL&CuS-0G7-L&M&Rbl>ob!!BM+s31HB",6dTbl.SB4T>?\4T,6[4T>?b49,@-
  6.1329 +s8ODE!!'e3rrXPI!%%18"5a(Y^OlL'rrF,cb?k8d!;+&,kPbD\@(61:TDecilL`m5
  6.1330 +!%,l`!?E2LrrRZM!.t6BrrN0#J"Q`BIfLV\rr@06!!'e)rr>1\!<,(]A#&r$!/:CP
  6.1331 +!+Ys,"$?P`-3!oH,ldp-rVlsG!!">ErrXPI!%%=<!3uJ&!l+bhrVupEnc&_S!!">:
  6.1332 +rVm"S4L+q1rVup\r;QsI!!#.]s+UCO!/:FP!+Z!.!mL\gr;Zgprr2tnrW!%Ss8U=B
  6.1333 +!!#.\rr>1[!!'e5rrj\K!%%ZurVup\r;Qo^,ldp-nc&^K!!'ccs24j;*@/g8!>bb.
  6.1334 +^]<Qrrr?I*!!Akns7F:^!/CFP!2'5i!:'44!<=Ii9`Z7TRf<G=!!%WNT)Sil!.UX@
  6.1335 +!e11mn,ELCP_Fhj!!IDfb`om4rrY@`!%%@=!+Z!.!2KJl"$?P`-3!oH,ldp-rVm3N
  6.1336 +!!">Fs5kU-!)`Cg!)`^q!^-K/rVuqPnc&\R!!">?rrC:B!!#.ZrrsbL!'L;]L&M&Q
  6.1337 +-0G4,!'L5\!mL\gr;Zhmrr2tPrW!%Ss8U=B!!#.\rr>1\!!">Drrj\K!%%Z?rVuqP
  6.1338 +r;Qc@rVuq.nc&^K!!'ccs24j;*@/g8!>bb.^]<Qrrr?I*!!Akns7F:^!/CFP!2'5i
  6.1339 +!:'44!<=Ii9`Z7TRf<G=!!%WNT)Sil!.UX@!e11mm/I(0rVuqPmJd87!!#.Trr>1\
  6.1340 +!!(7@rrY@`!%%XE"!mpI4T59a,ldoks8U=B!!%`FrrBh4!!#mq!!">7rrY@`!%%C>
  6.1341 +"!mpI4T,3`,ldp-s8P4\!!#.[rr>1\!!:CEL&M&P-2miDL&M&SL&_1srVup\rr2sE
  6.1342 +rVuq?rVm$I!!">FL&M&PL&CrNL&M&PL%50FhZ*YkK)`ag!?EH/?NCrCoY:IirVlk*
  6.1343 +r;Zqls8V`1f)UR(!!&YirrD?Vh#RL&b=r!X*Ld!0IfKJ#s.95l!!%M@rrRZM+RK+.
  6.1344 +bl.SBPjSJQ,ldp-pAY,HrVuqnr;QjF!!">ErrXPI!'L5["sj6L-3+"hrVuqPoD\f#
  6.1345 +q>^MLnG`SQ!!">>rrXPI!'L2Z"sj6L4TGFDrVuq.rVlj[rW!#Ds+UFP!%%UD!/:CP
  6.1346 +",6dTbl.SB4T>?\-2mlEU](2r,ldoks+UFP!/:@N!'L5\!2K)a"5a(Y^OlL'rrF,c
  6.1347 +b?k8d!;+&,kPbD\@/U'-TE"r``Rb*Er;ZhirVll_o\BNJ-Hf*a*?CUK!e11MK)_GB
  6.1348 +!WW4MTDntB!$LY."Qh!1!86c>"!mpI4SJdTU](5n;>pLpPl:X_A,cK1,ldp-rVlsG
  6.1349 +!!">ErrXPI!'L/Y!TqW'rrM7.qu?^Cn,EJP!!">>rrXPI!%%RC"sj6L4TGFDrVuqP
  6.1350 +rVlkOrW!"as+UFP!'L5[!6kEB"&]*ubl.SB4T>?\-2mlEbl.PA4T5<]ft[Ld!+Z!-
  6.1351 +!0mE^!6k!5"5a(Y^OlL'rrF,cb?k8d!;+&,kPbD\@/U'-TE"r``Rb*Er;ZhirVll_
  6.1352 +o\BNJ-Hf*a*?CUK!e11MK)_GB!WW4MTDntB!$LV-!p53Om/I/6!!#.Srr=AE!!?`T
  6.1353 +b_>uq!5JO5"!mpI4T59^,ldokrr2sqrW!4$g&M*7@jM+;qu6Y+qu?_Nn,EJP!!">>
  6.1354 +rr>1\!!J#"b`m5K!!>@`s#g8\!/:CO!/:CP!d+HrrVup\rVllArW!$_s8U=B!!#.\
  6.1355 +rr=AE!!(7Arr>1\!"$F?,ldok^]4=uqu?`@nc&^K!!'ccs24j;*@/g8!>bb.^]<Qr
  6.1356 +rr?I*!!Akns7F:^!/CFP!2'5i!:'44!<=Ii9`Z7TRf<G=!!(^P!P_M1,lqN<jo5>P
  6.1357 +rr3"/;;M6Rjuh>orrg)64?S>jrrM8(r]C1Fo)Acr4I#aC"MZ89s7?)@!5I7f!WW4M
  6.1358 +TDntB!$Kbj"!mpI4SA^SL%bQIA,ZE0,ldp-rVlsG!!">ErrBh3!<+;D!!">BrrM^;
  6.1359 +rVusFk3r<P49,@-p\t58p&G1@s8P4\!!&8^rrC:B!!5:_L&M&P;>gFu,ldoks8U=B
  6.1360 +!!#.\rr=AE!!(^Nrr@cP!!7lSFSu1?,piEg!86oB"5a(Y^OlL'rrF,cb?k8d!;+&,
  6.1361 +kPbD\@/U'-:Odk?`G5H@r;ZhirVll_o\BNJ-Hf*a*?CUK!e11MgA_5L!!*!\"!mpn
  6.1362 +^Zb\!o/qa+rrG5.h>[O=!6kB@#GV8F4?NU+oD&=jYpBB44='tio`#$b,liYrrrdEi
  6.1363 +s8U=>!!%`,rrN0#J"Q`BIfLV?rrXPI!'KoR!)`Ol!'L2Z"!mpI4T59^,ldokrVlkm
  6.1364 +pAb2'qYpOXrVuq.mf*AO!!">>rrM7.pAb:As8QU.!!(7ArrCaO!!5:_U](5nL&CrT
  6.1365 +,ldoks8UdO!!#.\rrXPI!%%RC!0mH_",6dT4Sf$[,ldoknG`UJ!!'ccs24j;*@/g8
  6.1366 +!>bb.^]<Qrrr?H:!!&YirrD?Vh#RL&b=r!X*Ld!0IfKK'rr_C0-,9EY!gE[2kl1_.
  6.1367 +!/:FP!SP]SrrhIH!!(7Ars7a54S/UQUB"g!rrOJm^]+67@fU$3rrZ*u!/:=M"smdZ
  6.1368 +s+LHJr6,04gA_3S!.UX@!e11me,KNF,pfhfrrI3fr;ZjEA,H9.49,AVrVltR,pd[2
  6.1369 +rrKksqu?dE;8;u-!87>O!@?mrrrZ*u!'KuT!R*\(!!aer!!">Fs-3K_!87;M"XO-K
  6.1370 +;?,>K!!&8]rrZ*u!%%XE"&T%EZ2Xb*;#gSBr;QcMrVuq_rr3"@-2dfH;02d<-1Lp:
  6.1371 +hZ*YkK)`ag!?EH/?NCrCoY:IirVlk*\,ZN$rVll_o\BNJ-Hf*a*?CUK!e11Mg]%>>
  6.1372 +!-J,<!`8s4l2Lh/!/92-"dC;5493V(rrR9BU](2o4=0.drrSqqFSu.>,pi9b"I&mK
  6.1373 +!/:@N#Nd>-s8PqBk1'D4!!%M@rrRZM+Me!\k*1RRPihfA!R06orrM9Eq>UWOKlggh
  6.1374 +k4nrVA,ZH.A*s9uk$qoSo`#6NP_Fh8s3*Sf^]+67F?Hi*rrTGfA,cK0PWXZsrr^qO
  6.1375 +;;(pJ!87;M"6NHXg&(dNKfk(drs6AnL"ZJg!!">7rr_-Y!5F-c_uB`X,g0Nq(BF*C
  6.1376 +!9a=\!+>a*"/#VnoYoD^LA_)PTDecilL`m5!%,l`!?E2LrrRZM!8IMTK`H5lrrTrh
  6.1377 +^]"09UHBhbA(ge[&E[Ib,s7t&s'n.k,s7Fl@o<4)"m0;W,s7Fjrs+ccs._\&4I#U?
  6.1378 +#0['0^P)[3rVlm\-2dcEK`InErrTrWPl1O^4=0b%"kb23K`Hi)rrJ?1rr3!F-.Dkq
  6.1379 +!!%M@rrRZM+Hla*jsC!,!83M7"!mpI4Ri@QhZ*YkK)`ag!?EH/?NCrCoY:IirVlk*
  6.1380 +r;Zqls8V`1f)UR(!!&YirrD?Vh#RL&b=r!X*Ld!0IfKK'rr^pS-):26#@d`[4?Oo9
  6.1381 +U]19*YpBB44='u;s'n.k,s7Fl4=1",#GWRF4?Oni4T>?dKdC4T4?OniFSPk?fq\TI
  6.1382 +K`K?qrrFDlr;Qi5!/:%E!p1dTp\tCZ4TC*8L&CrO;*=jX"slCH@m"89f`)!Q!.UX@
  6.1383 +!dF\NP5bN9rVupqOoGEVrVuq.nG`U:!!'ccs24j;*@/g8!>bb/^]DaTrVlk*r;Zql
  6.1384 +s8V`1f)UR(!!&YirrMiOp"]WK-Hf*a*?CUK!e11MgA_A!!!"<-L!9Go!egVarr38J
  6.1385 +,ph^Rs!8u+rr31"!5JQX!/:FP#<X=4s5kUR^]+6B@fU$=s+LG!bl@^e,pi3`!egWu
  6.1386 +rVlmE4T,3\bQ(N3rrQ[1L%tZPF9')UK`Hi)rsU3-s8U:C,lf5;!!%,orrN0#J"Q`C
  6.1387 +QN.$KPQ(V/rVuqnR/[01r;Qf4-2mlE^[V7*[f?ESK)`ag!?EH/?NCrCp:p[\qu6Y(
  6.1388 +r;Zqls8V`1f)UR(!!&YhrrN&[p>#`L-Hf*a*?CUK!e11Mg&D,g;'l2A!@;7SrrOJm
  6.1389 +oDS[nUB$PYUB#E7rs$5#Z2`#JL&V)V4=1%-PQ6F8rrsbqk5U,8Pl:U`493UurrRlS
  6.1390 +bl.PB,s;,*!mCX,o`"u&!'L&V#JU7ms8RcQL&M#]bQ->rs-*LG^]4>K,lj^orrN0#
  6.1391 +J"Q`C[f?ESPlC`urVupERK!EC,lf5;r]L,Z!'K`M".oPnkCW`OrrF,cb?k8d!;F80
  6.1392 +b5M5;!+>a*"/#VnoYoD^LA_)PTDSWhrSdM,!<=Ii9`Z7TRf<G=!!(UM$GU[F,lg(!
  6.1393 +s5kUir6,A?!'L:'!5J@0!mCXurr30b-3+!-!6kB@#%IYWs+LHsrVlqQ!6k-9!egWu
  6.1394 +rVlmE4T,3\bQ'currQ[14SSjV4?WWC!egW.rVln?-3!oFo?@.4!l"^tgA_3S!.UX@
  6.1395 +"4$rIYE]%eFT)7?A"!>sL%bQJ--YiX!dF\FK)`^f!?EH/?NCrCpV6e%r;QiULEZTr
  6.1396 +""6E"4iK8Y,5hKC18!b-rrMuQptYrN-Hf*a*?CUK!e11Me,KU649/mkbkM/@4T@MD
  6.1397 +bk_8?bQ*@rrrkM2s8P2-qu6kS!/:H,!6kEA!egWup&>)I!6kEA!@9l+rrUCEFS>_9
  6.1398 +;#i`QrrQ[Vbl7VDK`Hi*rrG5ZpAY.>-//A#!!%M@rr_]i!+;&k!+Z!.!83e?!SJdp
  6.1399 +!!,48mf*>:!%<I!_Z'WW,g0Nq(BF6G!7^rH!M9q1!!*@\r;Qc`ptYrN-Hf*a*?CUK
  6.1400 +!e11Mg]%:aA,?30js;>RbQ'd%bQQW!;#ni9rrUCEL&V)V4=1%-4=0.frs"/WU]6#J
  6.1401 +bl.PCK`K?irrRlSbl.PB,piKh!i#aLq#:HY49/mbrrFDGr$;RJ,pe9Fjs?errrFDl
  6.1402 +gA_3S!.UU?"$chtpQY[Z;'g=MrrJm:r]C6ZL"Ykn"5a(YG_5t4rrF,cb?k8d!;O>0
  6.1403 +oDS[hVm$.$TDeciqY8kI!%,l`!?E2LrrRZM!8IMT,ph^Mrrj\ps8OAkqu6iQs8RcQ
  6.1404 +U\t,q;3_+)!/:FP#!=43s'l&Dr;Qsu!6kIs!6kEA!egWup&>)I!6kEA!^%dkrVlq@
  6.1405 +!5J@0"7mf=FS5Y6;>`N^,lf5RPlIL)k5PA^@m&oOrrFDlgA_3S!.UU?".&uf[t=X:
  6.1406 +rr\#V!5F-c_Z'WW,g0Nq(BF9H!6G-=!V[G8!!*AorVllWq:u&O-Hf*a*?CUK!e11M
  6.1407 +g]%@c!'KlNrs+5XA,lQk!5JL4#)*%es1\P2rVm(s!-J7b!/:FP#!=43s.]R(rVm,b
  6.1408 +,piTkK`K?qrrRlSbk:u;K`K?qrrSDbL&M#P,pi?d!^$IXmf*?B!/:FP!Fn7jrrQ[1
  6.1409 +L&M#QPQ54IrrN0#J"HZBk5YKYK)^`."8=JL(kVe(rrF,cb?k8d!;XD1f)>UKVlg""
  6.1410 +\,H=,kP<p7!%,l`!?E2LrrRZM!8@H&49-[L^W`HM!%$e-s1\O[U]:@Y!%$e-s%rc+
  6.1411 +k5V\4-0G6O!%#D5s#_V,rs_'jA*3g+491WGs+LHsrVlqQ!6k-9!egWur;R!J!0mNG
  6.1412 +491*7rs+cNPlLcJ!%%Jqrr3!r;>L4nK`Hi+rrFEfrVm2d,lj20s-*L0k1]h:!!%M>
  6.1413 +rr[3?!7-8sMuNm?!!&(3s2"^9*@/g8!>bb3^]<$crr?I*!!8Men@FPY2#RCSTDeci
  6.1414 +lM96:!%,l`!?E2LrrRZM!87AQ;'l,?!E%PKrs,;F!$rok--Z>f##P@H,lf78rr30b
  6.1415 +!!%-@4=0t+##P@H,lf6Urr3%R!6kEA!egWup&>)I!6kB@#0]10,p`P$rVm%T!/:IQ
  6.1416 +4S\sW-3!oF,piBe#DE/3s8UaPbl%JG^Eik+,lg'Og&D*R!.UR>"6Tpi:kJ_+rri'5
  6.1417 +!#YH^s2"^9*@/g8!>bb3^]<$crr?I*!!8emn@FPY2#RCSTDecilM96:!%,l`!?E2L
  6.1418 +rrRZM!8.;Tk+dWaPhGm4"2BPD^\[s4fnG-Tqu6i7PhH)ibl%JCfnG-Tr;Qfhbl%JA
  6.1419 +o??k,!V=P2rr]$ML"ZD("nTt0s8UdIbl7VCbfon_#4p(1s8Tifq>UQ3Kn[:nrrN0#
  6.1420 +J"6N@Du]m!K)^i1"(2*/YCceirrF,cb?k8d!;XD1f_tgM@/U',TE"DlMuY^5!!&Yi
  6.1421 +rrD?[h#RL&b=r!X*Ld!0IfKJ#s.95l!!%M=rrhL-!!'K[s,[0^NrT/FK)`Uc!?EH/
  6.1422 +?NCrCq7m!_rVlk*r;Znks7!UY!&XWS!2'5i!:'C9!<=Ii9`Z7TRf<G=!!%WNT)Sil
  6.1423 +!.UL<"O@>R&C5t.OoGQf!!"/1K)`Uc!?EH/?NCrCq7m!_rVlk*r;Znks7!UY!&XWS
  6.1424 +!2'5i!:'C9!<=Ii9`Z7TRf<G=!!%WNT)Sil!.UI;"Kqe*#cE:SPQ(c@!!!;VK)`Rb
  6.1425 +!?EH/?NCrCq7m!_rVlk*r;Znks7!UY!&XWS!2'5i!:'C9!<=Ii9`Z7TRf<G=!!%WN
  6.1426 +T)Sil!.UF:!13Zb!Isiqs-N`hmoTPi&@[8k^&J*R,g0Nq(BF9H!8.8M!+>a*!h]M^
  6.1427 +\r6VGr;ZhirVll_q:u&O-Hf*a*?CUK!e11MK)_GB!WW4MR/[?)&-)\IT7[*3rs&4I
  6.1428 +&-)\Yf7O%8rrF,cb?k8d!;XD1f_tgM@/U',TE"DlMuY^5!!&YirrD?[h#RL&b=r!X
  6.1429 +*Ld!0IfKJ#s.95l!!%M8rrM"*rW!!BE6j.9TDnu%BGg^K!D)[2s1A:3*@/g8!>bb3
  6.1430 +^]<$crr?I*!!8emn@FPY2#RCSTDecilM96:!%,l`!?E2LrrRZM!.t6BrrN0#J!L$7
  6.1431 +T-4(4"!D!$ItGG6^BBUIIo$^T!!+dgK)`C]!?EH/?NCrCq7m!_rVlk*r;Znks7!UY
  6.1432 +!&XWS!2'5i!:'C9!<=Ii9`Z7TRf<G=!!%WNT)Sil!.U75!r%HuJcM8?!AL^/s0r"/
  6.1433 +*@/g8!>bb3^]<$crr?I*!!8emn@FPY2#RCSTDecilM96:!%,l`!?E2LrrRZM!.t6B
  6.1434 +rrN0#J!'a5f7-%FJcMSH":.7`Qf!Dp[Jp7J,g0Nq(BF9H!8.8M!+>a*!h]M^\r6VG
  6.1435 +r;ZhirVll_q:u&O-Hf*a*?CUK!e11MK)_GB!WW4MK)^H&K)^H&h>[Kr,g0Nq(BF9H
  6.1436 +!8.8M!+>a*"/#VnV7VZd2#RCSTDecilM96:!%,l`!?E2LrrRZM!.t6BrrN0#ItI]P
  6.1437 +s+:9&s5!\U*@/g8!>bb3^]<$crr?I*!!Jqos81$QW;o0]!!&YirrD?[h#RL&b=r!X
  6.1438 +*Ld!0IfKJ#s.95l!!%M#s+:9&s+::,rrF,cb?k8d!;XD1f_tgM@/U'*T=Fn$@/U'*
  6.1439 +TDecilM96:!%,l`!?E2LrrRZM!.t6BrrN0#ItI]Ps+:9&s5!\U*@/g8!>bb3^]<$c
  6.1440 +rr?I*!!&(irr?I*!!&YirrD?[h#RL&b=r!X*Ld!0IfKJ#s.95l!!%M#s+:9&s+::,
  6.1441 +rrF,cb?k8d!;XD1f)>UKVlg""\,H=,l1s-9!%,l`!?E2LrrRZM!.o]lIf]TMItI]P
  6.1442 +s+:9&s5!\U*@/g8!>bb3^];ISrrMj2YQ+\0n,<7djS@U4!%,l`!?E2Lrr@h+!1Elf
  6.1443 +ItI]Ps+:9&s5!\U*@/g8!>bb2^]=!)rrA[q!!&YirrDulh#RL&b=r!X*Ld!/f,0)>
  6.1444 +S,`R,c[u1Ks+:9&s5!\U*@/g8!>bb2^];m^rrJ/dZiC+4L]%/PnG(f?!%,l`!?E24
  6.1445 +s+:9&s+:9&s+:90rrF,cb?k8d!;F8/p&+gkhg\2,5QXKKkPY>\r87;*!<=Ii9`Z7T
  6.1446 +K)^H&K)^H&K)^H&N;io!,g0Nq(BF3F!QtA@rrN,^pY>iM-Hf*a*?Bb3K)^H&K)^H&
  6.1447 +K)^f0!?EH/?NCrCp:p[\X8`5"kP!^4!%,l`!?E24s+:9&s+:9&s+:90rrF,cb?k8d
  6.1448 +!;4,.deBpE!Vk[Ih#RL&b=r!X*J4<Cs+:9&s+:9&s,?sY*@/g8!>bb.^]MC0pTjf"
  6.1449 +p?;,(!<=Ii9`Z7TK)^H&K)^H&K)^H&N;io!,g0Nq(BF!@!QrpJhu^uM^>A8Zl/pjm
  6.1450 +h#RL&b=r!X*J4<Cs+:9&s+:9&s,?sY*@/g8!>baZ^]KStI*:=H!%,l`!?E24s+:9&
  6.1451 +s+:9&s+:90rrF,cb?k8d!6`.ZO8s[Oh#RL&b=r!X*J4<Cs+:9&s+:9&s,?sY*@/g8
  6.1452 +!>baZ^]KStI*:=H!%,l`!?E24s+:9&s+:9&s+:90rrF,cb?k8d!6`.ZO8s[Oh#RL&
  6.1453 +b=r!X*J4<Cs+:9&s+:9&s,?sY*@/g8!>baZ^]KStI*:=H!%,l`!?E24s+:9&s+:9&
  6.1454 +s+:90rrF,cb?k8d!6`.ZO8s[Oh#RL&b=r!X*J4<Cs+:9&s+:9&s,?sY*@/g8!>baZ
  6.1455 +^]KStI*:=H!%,l`!?E24s+:9&s+:9&s+:90rrF,cb?k8d!6`.ZO8s[Oh#RL&b=r!X
  6.1456 +*J4<Cs+:9&s+:9&s,?sY*@/g8!>baZ^]KStI*:=H!%,l`!?E24s+:9&s+:9&s+:90
  6.1457 +rrF,cb?k8d!6`.ZO8s[Oh#RL&b=r!X*J4<Cs+:9&s+:9&s,?sY*@/g8!>baZ^]KSt
  6.1458 +I*:=H!%,l`!?E24s+:9&s+:9&s+:90rrF,cb?k8d!6`.ZO8s[Oh#RL&b=r!X*J4<C
  6.1459 +s+:9&s+:9&s,?sY*@/g8!>baZ^]KStI*:=H!%,l`!?E24s+:9&s+:9&s+:90rrF,c
  6.1460 +b?k8d!6`.ZO8s[Oh#RL&b=r!X*J4<Cs+:9&s+:9&s,?sY*@/g8!>baZ^]KStI*:=H
  6.1461 +!%,l`!?E24s+:9&s+:9&s+:90rr=Bt!1s5k*eOEDs+:9&s+:9&s,?sXYKD=qDbnQ+
  6.1462 +!ddFabC9OkB?G](YCce+s+:9&s+:9Grr
  6.1463 +~>
  6.1464 +grestore
  6.1465 +currentdict /inputf undef
  6.1466 +currentdict /pstr undef
     7.1 --- a/docs/src/user.tex	Tue Aug 01 14:58:20 2006 -0600
     7.2 +++ b/docs/src/user.tex	Wed Aug 02 13:39:47 2006 -0600
     7.3 @@ -2060,6 +2060,988 @@ iptables:
     7.4  iptables -A INPUT -p tcp -{}-destination-port 8002 -j REJECT
     7.5  \end{verbatim}
     7.6  
     7.7 +%% Chapter Xen Mandatory Access Control Framework
     7.8 +\chapter{sHype/Xen Access Control}
     7.9 +
    7.10 +The Xen mandatory access control framework is an implementation of the
    7.11 +sHype Hypervisor Security Architecture
    7.12 +(www.research.ibm.com/ssd\_shype). It permits or denies communication
    7.13 +and resource access of domains based on a security policy. The
    7.14 +mandatory access controls are enforced in addition to the Xen core
    7.15 +controls, such as memory protection.  They are designed to remain
    7.16 +transparent during normal operation of domains (policy-conform
    7.17 +behavior) but to intervene when domains move outside their intended
    7.18 +sharing behavior.  This chapter will describe how the sHype access
    7.19 +controls in Xen can be configured to prevent viruses from spilling
    7.20 +over from one into another workload type and secrets from leaking from
    7.21 +one workload type to another. sHype/Xen depends on the correct
    7.22 +behavior of Domain0 (cf previous chapter).
    7.23 +
    7.24 +Benefits of configuring sHype/ACM in Xen include:
    7.25 +\begin{itemize}
    7.26 +\item robust workload and resource protection effective against rogue
    7.27 +  user domains
    7.28 +\item simple, platform- and operating system-independent security
    7.29 +  policies (ideal for heterogeneous distributed environments)
    7.30 +\item safety net with minimal performance overhead in case operating
    7.31 +  system security is missing, does not scale, or fails
    7.32 +\end{itemize}
    7.33 +
    7.34 +These benefits are very valuable because today's operating systems
    7.35 +become increasingly complex and often have no or insufficient
    7.36 +mandatory access controls.  (Discretionary access controls, supported
    7.37 +by of most operating systems, are not effective against viruses or
    7.38 +misbehaving programs.)  Where mandatory access control exists (e.g.,
    7.39 +SELinux), they usually deploy complex and difficult to understand
    7.40 +security policies.  Additionally, multi-tier applications in business
    7.41 +environments usually require different types of operating systems
    7.42 +(e.g., AIX, Windows, Linux) which cannot be configured with compatible
    7.43 +security policies. Related distributed transactions and workloads
    7.44 +cannot be easily protected on the OS level. The Xen access control
    7.45 +framework steps in to offer a coarse-grained but very robust security
    7.46 +layer and safety net in case operating system security fails or is
    7.47 +missing.
    7.48 +
    7.49 +To control sharing between domains, Xen mediates all inter-domain
    7.50 +communication (shared memory, events) as well as the access of domains
    7.51 +to resources such as disks. Thus, Xen can confine distributed
    7.52 +workloads (domain payloads) by permitting sharing among domains
    7.53 +running the same type of workload and denying sharing between pairs of
    7.54 +domains that run different workload types. We assume that--from a Xen
    7.55 +perspective--only one workload type is running per user domain. To
    7.56 +enable Xen to associate domains and resources with workload types,
    7.57 +security labels including the workload types are attached to domains
    7.58 +and resources. These labels and the hypervisor sHype controls cannot
    7.59 +be manipulated or bypassed and are effective even against rogue
    7.60 +domains.
    7.61 +
    7.62 +\section{Overview}
    7.63 +This section gives an overview of how workloads can be protected using
    7.64 +the sHype mandatory access control framework in Xen.
    7.65 +Figure~\ref{fig:acmoverview} shows the necessary steps in activating
    7.66 +the Xen workload protection. These steps are described in detail in
    7.67 +Section~\ref{section:acmexample}.
    7.68 +
    7.69 +\begin{figure}
    7.70 +\centering
    7.71 +\includegraphics[width=13cm]{figs/acm_overview.eps}
    7.72 +\caption{Overview of activating sHype workload protection in Xen.
    7.73 +  Section numbers point to representative examples.}
    7.74 +\label{fig:acmoverview}
    7.75 +\end{figure}
    7.76 +
    7.77 +First, the sHype/ACM access control must be enabled in the Xen
    7.78 +distribution and the distribution must be built and installed (cf
    7.79 +Subsection~\ref{subsection:acmexampleconfigure}). Before we can
    7.80 +enforce security, a Xen security policy must be created (cf
    7.81 +Subsection~\ref{subsection:acmexamplecreate}) and deployed (cf
    7.82 +Subsection~\ref{subsection:acmexampleinstall}).  This policy defines
    7.83 +the workload types differentiated during access control. It also
    7.84 +defines the rules that compare workload types of domains and resources
    7.85 +to provide access decisions. Workload types are represented by
    7.86 +security labels that can be attached to domains and resources (cf
    7.87 +Subsections~\ref{subsection:acmexamplelabeldomains}
    7.88 +and~\ref{subsection:acmexamplelabelresources}).  The functioning of
    7.89 +the active sHype/Xen workload protection is demonstrated using simple
    7.90 +resource assignment, and domain creation tests in
    7.91 +Subsection~\ref{subsection:acmexampletest}.
    7.92 +Section~\ref{section:acmpolicy} describes the syntax and semantics of
    7.93 +the sHype/Xen security policy in detail and introduces briefly the
    7.94 +tools that are available to help create valid security policies.
    7.95 +
    7.96 +The next section describes all the necessary steps to create, deploy,
    7.97 +and test a simple workload protection policy. It is meant to enable
    7.98 +anybody to quickly try out the sHype/Xen workload protection. Those
    7.99 +readers who are interested in learning more about how the sHype access
   7.100 +control in Xen works and how it is configured using the XML security
   7.101 +policy should read Section~\ref{section:acmpolicy} as well.
   7.102 +Section~\ref{section:acmlimitations} concludes this chapter with
   7.103 +current limitations of the sHype implementation for Xen.
   7.104 +
   7.105 +\section{Xen Workload Protection Step-by-Step}
   7.106 +\label{section:acmexample}
   7.107 +
   7.108 +What you are about to do consists of the following sequence:
   7.109 +\begin{itemize}
   7.110 +\item configure and install sHype/Xen
   7.111 +\item create a simple workload protection security policy
   7.112 +\item deploy the sHype/Xen security policy
   7.113 +\item associate domains and resources with workload labels,
   7.114 +\item test the workload protection
   7.115 +\end{itemize}
   7.116 +The essential commands to create and deploy a sHype/Xen security
   7.117 +policy are numbered throughout the following sections. If you want a
   7.118 +quick-guide or return at a later time to go quickly through this
   7.119 +demonstration, simply look for the numbered commands and apply them in
   7.120 +order.
   7.121 +
   7.122 +\subsection{Configuring/Building sHype Support into Xen}
   7.123 +\label{subsection:acmexampleconfigure}
   7.124 +First, we need to configure the access control module in Xen and
   7.125 +install the ACM-enabled Xen hypervisor. This step installs security
   7.126 +tools and compiles sHype/ACM controls into the Xen hypervisor.
   7.127 +
   7.128 +To enable sHype/ACM in Xen, please edit the Config.mk file in the top
   7.129 +Xen directory.
   7.130 +
   7.131 +\begin{verbatim}
   7.132 +  (1) In Config.mk
   7.133 +        Change: ACM_SECURITY ?= n
   7.134 +            To: ACM_SECURITY ?= y
   7.135 +\end{verbatim}
   7.136 +
   7.137 +Then install the security-enabled Xen environment as follows:
   7.138 +
   7.139 +\begin{verbatim}
   7.140 +  (2) # make world
   7.141 +      # make install
   7.142 +\end{verbatim}
   7.143 +
   7.144 +\subsection{Creating A WLP Policy in 3 Simple Steps with ezPolicy}
   7.145 +\label{subsection:acmexamplecreate}
   7.146 +
   7.147 +We will use the ezPolicy tool to quickly create a policy that protects
   7.148 +workloads.  You will need both the Python and wxPython packages to run
   7.149 +this tool.  To run the tool in Domain0, you can download the wxPython
   7.150 +package from www.wxpython.org or use the command
   7.151 +\verb|yum install wxPython| in Redhat/Fedora. To run the tool on MS
   7.152 +Windows, you also need to download the Python package from
   7.153 +www.python.org. After these packages are installed, start the ezPolicy
   7.154 +tool with the following command:
   7.155 +
   7.156 +\begin{verbatim}
   7.157 +  (3) # xensec_ezpolicy
   7.158 +\end{verbatim}
   7.159 +
   7.160 +Figure~\ref{fig:acmezpolicy} shows a screen-shot of the tool. The
   7.161 +following steps show you how to create the policy shown in
   7.162 +Figure~\ref{fig:acmezpolicy}.  You can use \verb|<CTRL>-h| to pop up a
   7.163 +help window at any time. The indicators (a), (b), and (c) in
   7.164 +Figure~\ref{fig:acmezpolicy} show the buttons that are used during the
   7.165 +3 steps of creating a policy:
   7.166 +\begin{enumerate}
   7.167 +\item defining workloads
   7.168 +\item defining run-time conflicts
   7.169 +\item translating the workload definition into a sHype/Xen access
   7.170 +  control policy
   7.171 +\end{enumerate}
   7.172 +
   7.173 +\paragraph{Defining workloads.} Workloads are defined for each
   7.174 +organization and department that you enter in the left panel. Please
   7.175 +use the ``New Org'' button (a) to create the organizations ``Avis'',
   7.176 +``Hertz'', ``CocaCola'', and ``PepsiCo''.
   7.177 +
   7.178 +You can refine an organization to differentiate between multiple
   7.179 +department workloads by right-clicking the organization and selecting
   7.180 +\verb|Add Department| (or selecting an organization and pressing
   7.181 +\verb|<CRTL>-a|). Create department workloads ``Intranet'',
   7.182 +``Extranet'', ``HumanResources'', and ``Payroll'' for the ``CocaCola''
   7.183 +organization and department workloads ``Intranet'' and ``Extranet''
   7.184 +for the ``PepsiCo'' organization. The resulting layout of the tool
   7.185 +should be similar to the left panel shown in
   7.186 +Figure~\ref{fig:acmezpolicy}.
   7.187 +
   7.188 +\paragraph{Defining run-time conflicts.} Workloads that shall be
   7.189 +prohibited from running concurrently on the same hypervisor platform
   7.190 +are grouped into ``Run-time Exclusion rules'' on the right panel of
   7.191 +the window.
   7.192 +
   7.193 +To prevent PepsiCo and CocaCola workloads (including their
   7.194 +departmental workloads) from running simultaneously on the same
   7.195 +hypervisor system, select the organization ``PepsiCo'' and, while
   7.196 +pressing the \verb|<CTRL>|-key, select the organization ``CocaCola''.
   7.197 +Now press the button (b) named ``Create run-time exclusion rule from
   7.198 +selection''. A popup window will ask for the name for this run-time
   7.199 +exclusion rule (enter a name or just hit \verb|<ENTER>|). A rule will
   7.200 +appear on the right panel. The name is used as reference only and does
   7.201 +not affect the hypervisor policy.
   7.202 +
   7.203 +Repeat the process to create a run-time exclusion rule just for the
   7.204 +department workloads CocaCola.Extranet and CocaCola.Payroll.
   7.205 +
   7.206 +\begin{figure}[htb]
   7.207 +\centering
   7.208 +\includegraphics[width=13cm]{figs/acm_ezpolicy.eps}
   7.209 +\caption{Final layout including workload definition and Run-time Exclusion rules.}
   7.210 +\label{fig:acmezpolicy}
   7.211 +\end{figure}
   7.212 +
   7.213 +The resulting layout of your window should be similar to
   7.214 +Figure~\ref{fig:acmezpolicy}. Save this workload definition by
   7.215 +selecting ``Save Workload Definition as ...'' in the ``File'' menu
   7.216 +(c).  This workload definition can be later refined if required.
   7.217 +
   7.218 +\paragraph{Translating the workload definition into a sHype/Xen access
   7.219 +  control policy.} To translate the workload definition into a access
   7.220 +control policy understood by Xen, please select the ``Save as Xen ACM
   7.221 +Security Policy'' in the ``File'' menu (c). Enter the following policy
   7.222 +name in the popup window: \verb|example.chwall_ste.test-wld|. If you
   7.223 +are running ezPolicy in Domain0, the resulting policy file
   7.224 +test-wld\_security-policy.xml will automatically be placed into the
   7.225 +right directory (/etc/xen/acm-security/ policies/example/chwall\_ste).
   7.226 +If you run the tool on another system, then you need to copy the
   7.227 +resulting policy file into Domain0 before continuing.  See
   7.228 +Section~\ref{subsection:acmnaming} for naming conventions of security
   7.229 +policies.
   7.230 +
   7.231 +\subsection{Deploying a WLP Policy}
   7.232 +\label{subsection:acmexampleinstall}
   7.233 +To deploy the workload protection policy we created in
   7.234 +Section~\ref{subsection:acmexamplecreate}, we create a policy
   7.235 +representation (test-wld.bin) that can be loaded into the Xen
   7.236 +hypervisor and we configure Xen to actually load this policy at
   7.237 +startup time.
   7.238 +
   7.239 +The following command translates the source policy representation
   7.240 +into a format that can be loaded into Xen with sHype/ACM support.
   7.241 +Refer to the \verb|xm| man page for further details:
   7.242 +
   7.243 +\begin{verbatim}
   7.244 +  (4) # xm makepolicy example.chwall_ste.test-wld
   7.245 +\end{verbatim}
   7.246 +
   7.247 +The easiest way to install a security policy for Xen is to include the
   7.248 +policy in the boot sequence. The following command does just this:
   7.249 +
   7.250 +\begin{verbatim}
   7.251 +  (5) # xm cfgbootpolicy example.chwall_ste.test-wld
   7.252 +\end{verbatim}
   7.253 +
   7.254 +\textit{Alternatively, if this command fails} (e.g., because it cannot
   7.255 +identify the Xen boot entry), you can manually install the policy in 2
   7.256 +steps.  First, manually copy the policy binary file into the boot
   7.257 +directory:
   7.258 +
   7.259 +\begin{scriptsize}
   7.260 +\begin{verbatim}
   7.261 +         # cp /etc/xen/acm-security/policies/example/chwall_ste/test-wld.bin \
   7.262 +         /boot/example.chwall_ste.test-wld.bin
   7.263 +\end{verbatim}
   7.264 +\end{scriptsize}
   7.265 +
   7.266 +Second, manually add a module line to your Xen boot entry so that grub
   7.267 +loads this policy file during startup:
   7.268 +
   7.269 +\begin{scriptsize}
   7.270 +\begin{verbatim}
   7.271 +         title Xen (2.6.16.13)
   7.272 +                root (hd0,0)
   7.273 +                kernel /xen.gz dom0_mem=2000000 console=vga
   7.274 +                module /vmlinuz-2.6.16.13-xen ro root=/dev/hda3
   7.275 +                module /initrd-2.6.16.13-xen.img
   7.276 +                module /example.chwall_ste.test-wld.bin
   7.277 +\end{verbatim}
   7.278 +\end{scriptsize}
   7.279 +
   7.280 +Now reboot into this Xen boot entry to activate the policy and the
   7.281 +security-enabled Xen hypervisor.
   7.282 +
   7.283 +\begin{verbatim}
   7.284 +  (6) # reboot
   7.285 +\end{verbatim}
   7.286 +
   7.287 +After reboot, check if security is enabled:
   7.288 +
   7.289 +\begin{scriptsize}
   7.290 +\begin{verbatim}
   7.291 +         # xm list --label
   7.292 +         Name        ID Mem(MiB) VCPUs State  Time(s)  Label
   7.293 +         Domain-0     0     1949     4 r-----   163.9  SystemManagement
   7.294 +\end{verbatim}
   7.295 +\end{scriptsize}
   7.296 +
   7.297 +If the security label at the end of the line says ``INACTIV'' then the
   7.298 +security is not enabled. Verify the previous steps. Note: Domain0 is
   7.299 +assigned a default label (see \verb|bootstrap| policy attribute
   7.300 +explained in Section~\ref{section:acmpolicy}). All other domains must
   7.301 +be labeled in order to start on this sHype/ACM-enabled Xen hypervisor
   7.302 +(see following sections for labeling domains and resources).
   7.303 +
   7.304 +\subsection{Labeling Domains}
   7.305 +\label{subsection:acmexamplelabeldomains}
   7.306 +You should have a Xen domain configuration file that looks like the
   7.307 +following (Note: www.jailtime.org or www.xen-get.org might be good
   7.308 +places to look for example domU images). The following configuration
   7.309 +file defines \verb|domain1|:
   7.310 +
   7.311 +\begin{scriptsize}
   7.312 +\begin{verbatim}
   7.313 +         # cat domain1.xm
   7.314 +         kernel = "/boot/vmlinuz-2.6.16.13-xen"
   7.315 +         memory = 128
   7.316 +         name = "domain1"
   7.317 +         vif = [ '' ]
   7.318 +         dhcp = "dhcp"
   7.319 +         disk = ['file:/home/xen/dom_fc5/fedora.fc5.img,sda1,w', \
   7.320 +                 'file:/home/xen/dom_fc5/fedora.swap,sda2,w']
   7.321 +         root = "/dev/sda1 ro"
   7.322 +\end{verbatim}
   7.323 +\end{scriptsize}
   7.324 +
   7.325 +If you try to start domain1, you will get the following error:
   7.326 +
   7.327 +\begin{scriptsize}
   7.328 +\begin{verbatim}
   7.329 +         # xm create domain1.xm
   7.330 +         Using config file "domain1.xm".
   7.331 +         domain1: DENIED
   7.332 +         --> Domain not labeled
   7.333 +         Checking resources: (skipped)
   7.334 +         Security configuration prevents domain from starting
   7.335 +\end{verbatim}
   7.336 +\end{scriptsize}
   7.337 +
   7.338 +Every domain must be associated with a security label before it can
   7.339 +start on sHype/Xen. Otherwise, sHype/Xen would not be able to enforce
   7.340 +the policy consistently. The following command prints all domain
   7.341 +labels available in the active policy:
   7.342 +
   7.343 +\begin{scriptsize}
   7.344 +\begin{verbatim}
   7.345 +         # xm labels type=dom
   7.346 +         Avis
   7.347 +         CocaCola
   7.348 +         CocaCola.Extranet
   7.349 +         CocaCola.HumanResources
   7.350 +         CocaCola.Intranet
   7.351 +         CocaCola.Payroll
   7.352 +         Hertz
   7.353 +         PepsiCo
   7.354 +         PepsiCo.Extranet
   7.355 +         PepsiCo.Intranet
   7.356 +         SystemManagement
   7.357 +\end{verbatim}
   7.358 +\end{scriptsize}
   7.359 +
   7.360 +Now label domain1 with the CocaCola label and another domain2 with the
   7.361 +PepsiCo.Extranet label. Please refer to the xm man page for further
   7.362 +information.
   7.363 +
   7.364 +\begin{verbatim}
   7.365 +  (7) # xm addlabel CocaCola dom domain1.xm
   7.366 +      # xm addlabel PepsiCo.Extranet dom domain2.xm
   7.367 +\end{verbatim}
   7.368 +
   7.369 +Let us try to start the domain again:
   7.370 +
   7.371 +\begin{scriptsize}
   7.372 +\begin{verbatim}
   7.373 +         # xm create domain1.xm
   7.374 +         Using config file "domain1.xm".
   7.375 +            file:/home/xen/dom_fc5/fedora.fc5.img: DENIED
   7.376 +            --> res:__NULL_LABEL__ (NULL)
   7.377 +            --> dom:CocaCola (example.chwall_ste.test-wld)
   7.378 +            file:/home/xen/dom_fc5/fedora.swap: DENIED
   7.379 +            --> res:__NULL_LABEL__ (NULL)
   7.380 +            --> dom:CocaCola (example.chwall_ste.test-wld)
   7.381 +         Security configuration prevents domain from starting
   7.382 +\end{verbatim}
   7.383 +\end{scriptsize}
   7.384 +
   7.385 +This error indicates that domain1, if started, would not be able to
   7.386 +access its image and swap files because they are not labeled.  This
   7.387 +makes sense because to confine workloads, access of domains to
   7.388 +resources must be controlled.  Otherwise, domains that are not allowed
   7.389 +to communicate or run simultaneously could share data through storage
   7.390 +resources.
   7.391 +
   7.392 +\subsection{Labeling Resources}
   7.393 +\label{subsection:acmexamplelabelresources}
   7.394 +You can use the \verb|xm labels type=res| command to list available
   7.395 +resource labels. Let us assign the CocaCola resource label to the domain1
   7.396 +image file representing \verb|/dev/sda1| and to its swap file:
   7.397 +
   7.398 +\begin{verbatim}
   7.399 +  (8) # xm addlabel CocaCola res \
   7.400 +           file:/home/xen/dom_fc5/fedora.fc5.img
   7.401 +      Resource file not found, creating new file at:
   7.402 +      /etc/xen/acm-security/policies/resource_labels
   7.403 +      # xm addlabel CocaCola res \
   7.404 +           file:/home/xen/dom_fc5/fedora.swap
   7.405 +\end{verbatim}
   7.406 +
   7.407 +Starting \verb|domain1| now will succeed:
   7.408 +
   7.409 +\begin{scriptsize}
   7.410 +\begin{verbatim}
   7.411 +         # xm create domain1.xm
   7.412 +         # xm list --label
   7.413 +         Name           ID Mem(MiB) VCPUs State  Time(s)  Label
   7.414 +         domain1         1      128     1 r-----     2.8  CocaCola
   7.415 +         Domain-0        0     1949     4 r-----   387.7  SystemManagement
   7.416 +\end{verbatim}
   7.417 +\end{scriptsize}
   7.418 +
   7.419 +The following command lists all labeled resources on the
   7.420 +system, e.g., to lookup or verify the labeling:
   7.421 +
   7.422 +\begin{scriptsize}
   7.423 +\begin{verbatim}
   7.424 +         # xm resources
   7.425 +         file:/home/xen/dom_fc5/fedora.swap
   7.426 +             policy: example.chwall_ste.test-wld
   7.427 +             label:  CocaCola
   7.428 +         file:/home/xen/dom_fc5/fedora.fc5.img
   7.429 +             policy: example.chwall_ste.test-wld
   7.430 +             label:  CocaCola
   7.431 +\end{verbatim}
   7.432 +\end{scriptsize}
   7.433 +
   7.434 +Currently, if a labeled resource is moved to another location, the
   7.435 +label must first be manually removed, and after the move re-attached
   7.436 +using the xm commands \verb|xm rmlabel| and \verb|xm addlabel|
   7.437 +respectively.  Please see Section~\ref{section:acmlimitations} for
   7.438 +further details.
   7.439 +
   7.440 +\begin{verbatim}
   7.441 +  (9) Label the resources of domain2 as PepsiCo.Extranet
   7.442 +      Do not try to start this domain yet
   7.443 +\end{verbatim}
   7.444 +
   7.445 +\subsection{Testing The Xen Workload Protection}
   7.446 +\label{subsection:acmexampletest}
   7.447 +We are about to demonstrate how the workload protection works by
   7.448 +verifying:
   7.449 +\begin{itemize}
   7.450 +\item that domains with conflicting workloads cannot run
   7.451 +  simultaneously
   7.452 +\item that domains cannot access resources of other workloads
   7.453 +\item that domains cannot exchange network packets if they are not
   7.454 +  associated with the same workload type
   7.455 +\end{itemize}
   7.456 +
   7.457 +\paragraph{Test 1: Run-time exclusion rules.} We assume that domain1
   7.458 +with the CocaCola label is still running. While domain1 is running,
   7.459 +the run-time exclusion set of our policy says that domain2 cannot
   7.460 +start because the label of domain1 includes the CHWALL type CocaCola
   7.461 +and the label of domain2 includes the CHWALL type PepsiCo. The
   7.462 +run-time exclusion rule of our policy enforces that PepsiCo and
   7.463 +CocaCola cannot run at the same time on the same hypervisor platform.
   7.464 +Once domain1 is stopped or saved, domain2 can start but domain1 can no
   7.465 +longer start or be resumed. The ezPolicy tool, when creating the
   7.466 +Chinese Wall types for the workload labels, ensures that department
   7.467 +workloads inherit the organization type (and with it any organization
   7.468 +exclusions).
   7.469 +
   7.470 +\begin{scriptsize}
   7.471 +\begin{verbatim}
   7.472 +# xm list --label
   7.473 +Name           ID Mem(MiB) VCPUs State  Time(s)  Label
   7.474 +domain1         2      128     1 -b----     6.9  CocaCola
   7.475 +Domain-0        0     1949     4 r-----   273.1  SystemManagement
   7.476 +
   7.477 +# xm create domain2.xm
   7.478 +Using config file "domain2.xm".
   7.479 +Error: (1, 'Operation not permitted')
   7.480 +
   7.481 +# xm destroy domain1
   7.482 +# xm create domain2.xm
   7.483 +Using config file "domain2.xm".
   7.484 +Started domain domain2
   7.485 +
   7.486 +# xm list --label
   7.487 +Name           ID Mem(MiB) VCPUs State  Time(s)  Label
   7.488 +domain2         4      164     1 r-----     4.3  PepsiCo.Extranet
   7.489 +Domain-0        0     1949     4 r-----   298.4  SystemManagement
   7.490 +
   7.491 +# xm create domain1.xm
   7.492 +Using config file "domain1.xm".
   7.493 +Error: (1, 'Operation not permitted')
   7.494 +
   7.495 +# xm destroy domain2
   7.496 +# xm list
   7.497 +Name           ID Mem(MiB) VCPUs State  Time(s)
   7.498 +Domain-0        0     1949     4 r-----   391.2
   7.499 +\end{verbatim}
   7.500 +\end{scriptsize}
   7.501 +
   7.502 +You can verify that domains with Avis label can run together with
   7.503 +domains labeled CocaCola, PepsiCo, or Hertz.
   7.504 +
   7.505 +\paragraph{Test2: Resource access.} In this test, we will re-label the
   7.506 +swap file for domain1 with the Avis resource label. We expect that
   7.507 +Domain1 will no longer start because it cannot access this resource.
   7.508 +This test checks the sharing abilities of domains, which are defined
   7.509 +by the Simple Type Enforcement Policy component.
   7.510 +
   7.511 +\begin{scriptsize}
   7.512 +\begin{verbatim}
   7.513 +# xm rmlabel res file:/home/xen/dom_fc5/fedora.swap
   7.514 +# xm addlabel Avis res file:/home/xen/dom_fc5/fedora.swap
   7.515 +# xm resources
   7.516 +file:/home/xen/dom_fc5/fedora.swap
   7.517 +    policy: example.chwall_ste.test-wld
   7.518 +    label:  Avis
   7.519 +file:/home/xen/dom_fc5/fedora.fc5.img
   7.520 +    policy: example.chwall_ste.test-wld
   7.521 +    label:  CocaCola
   7.522 +
   7.523 +# xm create domain1.xm
   7.524 +Using config file "domain1.xm".
   7.525 +   file:/home/xen/dom_fc4/fedora.swap: DENIED
   7.526 +   --> res:Avis (example.chwall_ste.test-wld)
   7.527 +   --> dom:CocaCola (example.chwall_ste.test-wld)
   7.528 +Security configuration prevents domain from starting
   7.529 +\end{verbatim}
   7.530 +\end{scriptsize}
   7.531 +
   7.532 +\paragraph{Test 3: Communication.} In this test we would verify that
   7.533 +two domains with labels Hertz and Avis cannot exchange network packets
   7.534 +by using the 'ping' connectivity test. It is also related to the STE
   7.535 +policy.{\bf Note:} sHype/Xen does control direct communication between
   7.536 +domains. However, domains associated with different workloads can
   7.537 +currently still communicate through the Domain0 virtual network. We
   7.538 +are working on the sHype/ACM controls for local and remote network
   7.539 +traffic through Domain0.  Please monitor the xen-devel mailing list
   7.540 +for updated information.
   7.541 +
   7.542 +\section{Xen Access Control Policy}
   7.543 +\label{section:acmpolicy}
   7.544 +
   7.545 +This section describes the sHype/Xen access control policy in detail.
   7.546 +It gives enough information to enable the reader to write custom
   7.547 +access control policies and to use the available Xen policy tools. The
   7.548 +policy language is expressive enough to specify most symmetric access
   7.549 +relationships between domains and resources efficiently.
   7.550 +
   7.551 +The Xen access control policy consists of two policy components. The
   7.552 +first component, called Chinese Wall (CHWALL) policy, controls which
   7.553 +domains can run simultaneously on the same virtualized platform. The
   7.554 +second component, called Simple Type Enforcement (STE) policy,
   7.555 +controls the sharing between running domains, i.e., communication or
   7.556 +access to shared resources. The CHWALL and STE policy components can
   7.557 +be configured to run alone, however in our examples we will assume
   7.558 +that both policy components are configured together since they
   7.559 +complement each other. The XML policy file includes all information
   7.560 +needed by Xen to enforce the policies.
   7.561 +
   7.562 +Figures~\ref{fig:acmxmlfilea} and \ref{fig:acmxmlfileb} show a fully
   7.563 +functional but very simple example policy for Xen. The policy can
   7.564 +distinguish two workload types \verb|CocaCola| and \verb|PepsiCo| and
   7.565 +defines the labels necessary to associate domains and resources with
   7.566 +one of these workload types. The XML Policy consists of four parts:
   7.567 +\begin{enumerate}
   7.568 +\item policy header including the policy name
   7.569 +\item Simple Type Enforcement block
   7.570 +\item Chinese Wall Policy block
   7.571 +\item label definition block
   7.572 +\end{enumerate}
   7.573 +
   7.574 +\begin{figure}
   7.575 +\begin{scriptsize}
   7.576 +\begin{verbatim}
   7.577 +01 <?xml version="1.0" encoding="UTF-8"?>
   7.578 +02 <!-- Auto-generated by ezPolicy        -->
   7.579 +03 <SecurityPolicyDefinition
   7.580 +      xmlns="http://www.ibm.com"
   7.581 +      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   7.582 +      xsi:schemaLocation=
   7.583 +          "http://www.ibm.com ../../security_policy.xsd ">
   7.584 +04     <PolicyHeader>
   7.585 +05         <PolicyName>example.chwall_ste.test</PolicyName>
   7.586 +06         <Date>Wed Jul 12 17:32:59 2006</Date>
   7.587 +07     </PolicyHeader>
   7.588 +08
   7.589 +09     <SimpleTypeEnforcement>
   7.590 +10         <SimpleTypeEnforcementTypes>
   7.591 +11             <Type>SystemManagement</Type>
   7.592 +12             <Type>PepsiCo</Type>
   7.593 +13             <Type>CocaCola</Type>
   7.594 +14         </SimpleTypeEnforcementTypes>
   7.595 +15     </SimpleTypeEnforcement>
   7.596 +16
   7.597 +17     <ChineseWall priority="PrimaryPolicyComponent">
   7.598 +18         <ChineseWallTypes>
   7.599 +19             <Type>SystemManagement</Type>
   7.600 +20             <Type>PepsiCo</Type>
   7.601 +21             <Type>CocaCola</Type>
   7.602 +22         </ChineseWallTypes>
   7.603 +23
   7.604 +24         <ConflictSets>
   7.605 +25             <Conflict name="RER1">
   7.606 +26                 <Type>CocaCola</Type>
   7.607 +27                 <Type>PepsiCo</Type>
   7.608 +28             </Conflict>
   7.609 +29        </ConflictSets>
   7.610 +30     </ChineseWall>
   7.611 +31
   7.612 +\end{verbatim}
   7.613 +\end{scriptsize}
   7.614 +\caption{Example XML security policy file -- Part I: Types and Rules Definition.}
   7.615 +\label{fig:acmxmlfilea}
   7.616 +\end{figure}
   7.617 +
   7.618 +\subsection{Policy Header and Policy Name}
   7.619 +\label{subsection:acmnaming}
   7.620 +Lines 1-2 (cf Figure~\ref{fig:acmxmlfilea}) include the usual XML
   7.621 +header. The security policy definition starts in Line 3 and refers to
   7.622 +the policy schema. The XML-Schema definition for the Xen policy can be
   7.623 +found in the file
   7.624 +\textit{/etc/xen/acm-security/policies/security-policy.xsd}. Examples
   7.625 +for security policies can be found in the example subdirectory. The
   7.626 +acm-security directory is only installed if ACM security is configured
   7.627 +during installation (cf Section~\ref{subsection:acmexampleconfigure}).
   7.628 +
   7.629 +The \verb|Policy Header| spans lines 4-7. It includes a date field and
   7.630 +defines the policy name \verb|example.chwall_ste.test|. It can also
   7.631 +include optional fields that are not shown and are for future use (see
   7.632 +schema definition).
   7.633 +
   7.634 +The policy name serves two purposes: First, it provides a unique name
   7.635 +for the security policy. This name is also exported by the Xen
   7.636 +hypervisor to the Xen management tools in order to ensure that both
   7.637 +enforce the same policy. We plan to extend the policy name with a
   7.638 +digital fingerprint of the policy contents to better protect this
   7.639 +correlation.  Second, it implicitly points the xm tools to the
   7.640 +location where the XML policy file is stored on the Xen system.
   7.641 +Replacing the colons in the policy name by slashes yields the local
   7.642 +path to the policy file starting from the global policy directory
   7.643 +\verb|/etc/xen/acm-security/policies|. The last part of the policy
   7.644 +name is the prefix for the XML policy file name, completed by
   7.645 +\verb|-security_policy.xml|. Consequently, the policy with the name
   7.646 +\verb|example.chwall_ste.test| can be found in the XML policy file
   7.647 +named \verb|test-security_policy.xml| that is stored in the local
   7.648 +directory \verb|example/chwall_ste| under the global policy directory.
   7.649 +
   7.650 +\subsection{Simple Type Enforcement Policy Component}
   7.651 +
   7.652 +The Simple Type Enforcement (STE) policy controls which domains can
   7.653 +communicate or share resources. This way, Xen can enforce confinement
   7.654 +of workload types by confining the domains running those workload
   7.655 +types. The mandatory access control framework enforces its policy when
   7.656 +domains access intended ways of communication or cooperation (shared
   7.657 +memory, events, shared resources such as block devices). It builds on
   7.658 +top of the core hypervisor isolation, which restricts the ways of
   7.659 +inter-communication to those intended means.  STE does not protect or
   7.660 +intend to protect from covert channels in the hypervisor or hardware;
   7.661 +this is an orthogonal problem that can be mitigated by using the
   7.662 +Run-time Exclusion rules described above or by fixing the problem in
   7.663 +the core hypervisor.
   7.664 +
   7.665 +Xen controls sharing between domains on the resource and domain level
   7.666 +because this is the abstraction the hypervisor and its management
   7.667 +understand naturally. While this is coarse-grained, it is also very
   7.668 +reliable and robust and it requires minimal changes to implement
   7.669 +mandatory access controls in the hypervisor. It enables platform- and
   7.670 +operation system-independent policies as part of a layered security
   7.671 +approach.
   7.672 +
   7.673 +Lines 9-15 (cf Figure~\ref{fig:acmxmlfilea}) define the Simple Type
   7.674 +Enforcement policy component.  Essentially, they define the workload
   7.675 +type names \verb|SystemManagement|, \verb|PepsiCo|, and
   7.676 +\verb|CocaCola| that are available in the STE policy component. The
   7.677 +policy rules are implicit: Xen permits a domain to communicate with
   7.678 +another domain if and only if the labels of the domains share an
   7.679 +common STE type.  Xen permits a domain to access a resource if and
   7.680 +only if the labels of the domain and the resource share a common STE
   7.681 +workload type.
   7.682 +
   7.683 +\subsection{Chinese Wall Policy Component}
   7.684 +
   7.685 +The Chinese Wall security policy interpretation of sHype enables users
   7.686 +to prevent certain workloads from running simultaneously on the same
   7.687 +hypervisor platform.  Run-time Exclusion rules (RER), also called
   7.688 +Conflict Sets, define a set of workload types that are not permitted
   7.689 +to run simultaneously. Of all the workloads specified in a Run-time
   7.690 +Exclusion rule, at most one type can run on the same hypervisor
   7.691 +platform at a time.  Run-time Exclusion Rules implement a less
   7.692 +rigorous variant of the original Chinese Wall security component. They
   7.693 +do not implement the *-property of the policy, which would require to
   7.694 +restrict also types that are not part of an exclusion rule once they
   7.695 +are running together with a type in an exclusion rule (please refer to
   7.696 +http://www.gammassl.co.uk/topics/chinesewall.html for more information
   7.697 +on the original Chinese Wall policy).
   7.698 +
   7.699 +Xen considers the \verb|ChineseWallTypes| part of the label for the
   7.700 +enforcement of the Run-time Exclusion rules.  It is illegal to define
   7.701 +labels including conflicting Chinese Wall types.
   7.702 +
   7.703 +Lines 17-30 (cf Figure~\ref{fig:acmxmlfilea}) define the Chinese Wall
   7.704 +policy component. Lines 17-22 define the known Chinese Wall types,
   7.705 +which coincide here with the STE types defined above. This usually
   7.706 +holds if the criteria for sharing among domains and sharing of the
   7.707 +hardware platform are the same. Lines 24-29 define one Run-time
   7.708 +Exclusion rule:
   7.709 +
   7.710 +\begin{scriptsize}
   7.711 +\begin{verbatim}
   7.712 +        <Conflict name="RER1">
   7.713 +          <Type>CocaCola</Type>
   7.714 +          <Type>PepsiCo</Type>
   7.715 +        </Conflict>
   7.716 +\end{verbatim}
   7.717 +\end{scriptsize}
   7.718 +
   7.719 +Based on this rule, Xen enforces that only one of the types
   7.720 +\verb|CocaCola| or \verb|PepsiCo| will run on a single hypervisor
   7.721 +platform at a time. For example, once a domain assigned a
   7.722 +\verb|CocaCola| workload type is started, domains with the
   7.723 +\verb|PepsiCo| type will be denied to start. When the former domain
   7.724 +stops and no other domains with the \verb|CocaCola| type are running,
   7.725 +then domains with the \verb|PepsiCo| type can start.
   7.726 +
   7.727 +Xen maintains reference counts on each running workload type to keep
   7.728 +track of which workload types are running. Every time a domain starts
   7.729 +or resumes, the reference count on those Chinese Wall types that are
   7.730 +referenced in the domain's label are incremented. Every time a domain
   7.731 +is destroyed or saved, the reference counts of its Chinese Wall types
   7.732 +are decremented. sHype in Xen covers migration and live-migration,
   7.733 +which is treated the same way as saving a domain on the source
   7.734 +platform and resuming it on the destination platform.
   7.735 +
   7.736 +Reasons why users would want to restrict which workloads or domains
   7.737 +can share the system hardware include:
   7.738 +
   7.739 +\begin{itemize}
   7.740 +\item Imperfect resource management or control might enable a rogue
   7.741 +  domain to starve another domain and the workload running in it.
   7.742 +\item Redundant domains might run the same workload to increase
   7.743 +  availability; such domains should not run on the same hardware to
   7.744 +  avoid single points of failure.
   7.745 +\item Imperfect Xen core domain isolation might enable two rogue
   7.746 +  domains running different workload types to use unintended and
   7.747 +  unknown ways (covert channels) to exchange some data. This way, they
   7.748 +  bypass the policed Xen access control mechanisms.  Such
   7.749 +  imperfections cannot be completely eliminated and are a result of
   7.750 +  trade-offs between security and other design requirements. For a
   7.751 +  simple example of a covert channel see
   7.752 +  http://www.multicians.org/timing-chn.html. Such covert channels
   7.753 +  exist also between workloads running on different platforms if they
   7.754 +  are connected through networks. The Xen Chinese Wall policy provides
   7.755 +  an approximation of this imperfect ``air-gap'' between selected
   7.756 +  workload types.
   7.757 +\end{itemize}
   7.758 +
   7.759 +\subsection{Security Labels}
   7.760 +
   7.761 +To enable Xen to associate domains with workload types running in
   7.762 +them, each domain is assigned a security label that includes the
   7.763 +workload types of the domain.
   7.764 +
   7.765 +\begin{figure}
   7.766 +\begin{scriptsize}
   7.767 +\begin{verbatim}
   7.768 +32     <SecurityLabelTemplate>
   7.769 +33         <SubjectLabels bootstrap="SystemManagement">
   7.770 +34             <VirtualMachineLabel>
   7.771 +35                 <Name>SystemManagement</Name>
   7.772 +36                 <SimpleTypeEnforcementTypes>
   7.773 +37                     <Type>SystemManagement</Type>
   7.774 +38                     <Type>PepsiCo</Type>
   7.775 +39                     <Type>CocaCola</Type>
   7.776 +40                 </SimpleTypeEnforcementTypes>
   7.777 +41                 <ChineseWallTypes>
   7.778 +42                     <Type>SystemManagement</Type>
   7.779 +43                 </ChineseWallTypes>
   7.780 +44             </VirtualMachineLabel>
   7.781 +45
   7.782 +46             <VirtualMachineLabel>
   7.783 +47                 <Name>PepsiCo</Name>
   7.784 +48                 <SimpleTypeEnforcementTypes>
   7.785 +49                     <Type>PepsiCo</Type>
   7.786 +50                 </SimpleTypeEnforcementTypes>
   7.787 +51                 <ChineseWallTypes>
   7.788 +52                     <Type>PepsiCo</Type>
   7.789 +53                 </ChineseWallTypes>
   7.790 +54             </VirtualMachineLabel>
   7.791 +55
   7.792 +56             <VirtualMachineLabel>
   7.793 +57                 <Name>CocaCola</Name>
   7.794 +58                 <SimpleTypeEnforcementTypes>
   7.795 +59                     <Type>CocaCola</Type>
   7.796 +60                 </SimpleTypeEnforcementTypes>
   7.797 +61                 <ChineseWallTypes>
   7.798 +62                     <Type>CocaCola</Type>
   7.799 +63                 </ChineseWallTypes>
   7.800 +64             </VirtualMachineLabel>
   7.801 +65         </SubjectLabels>
   7.802 +66
   7.803 +67         <ObjectLabels>
   7.804 +68             <ResourceLabel>
   7.805 +69                 <Name>SystemManagement</Name>
   7.806 +70                 <SimpleTypeEnforcementTypes>
   7.807 +71                     <Type>SystemManagement</Type>
   7.808 +72                 </SimpleTypeEnforcementTypes>
   7.809 +73             </ResourceLabel>
   7.810 +74
   7.811 +75             <ResourceLabel>
   7.812 +76                 <Name>PepsiCo</Name>
   7.813 +77                 <SimpleTypeEnforcementTypes>
   7.814 +78                     <Type>PepsiCo</Type>
   7.815 +79                 </SimpleTypeEnforcementTypes>
   7.816 +80             </ResourceLabel>
   7.817 +81
   7.818 +82             <ResourceLabel>
   7.819 +83                 <Name>CocaCola</Name>
   7.820 +84                 <SimpleTypeEnforcementTypes>
   7.821 +85                     <Type>CocaCola</Type>
   7.822 +86                 </SimpleTypeEnforcementTypes>
   7.823 +87             </ResourceLabel>
   7.824 +88         </ObjectLabels>
   7.825 +89     </SecurityLabelTemplate>
   7.826 +90  </SecurityPolicyDefinition>
   7.827 +\end{verbatim}
   7.828 +\end{scriptsize}
   7.829 +\caption{Example XML security policy file -- Part II: Label Definition.}
   7.830 +\label{fig:acmxmlfileb}
   7.831 +\end{figure}
   7.832 +
   7.833 +Lines 32-89 (cf Figure~\ref{fig:acmxmlfileb}) define the
   7.834 +\verb|SecurityLabelTemplate|, which includes the labels that can be
   7.835 +attached to domains and resources when this policy is active. The
   7.836 +domain labels include Chinese Wall types while resource labels do not
   7.837 +include Chinese Wall types. Lines 33-65 define the
   7.838 +\verb|SubjectLabels| that can be assigned to domains. For example, the
   7.839 +virtual machine label \verb|CocaCola| (cf lines 56-64 in
   7.840 +Figure~\ref{fig:acmxmlfileb}) associates the domain that carries it
   7.841 +with the workload type \verb|CocaCola|.
   7.842 +
   7.843 +The \verb|bootstrap| attribute names the label
   7.844 +\verb|SystemManagement|.  Xen will assign this label to Domain0 at
   7.845 +boot time. All other domains are assigned labels according to their
   7.846 +domain configuration file (see
   7.847 +Section~\ref{subsection:acmexamplelabeldomains} for examples of how to
   7.848 +label domains). Lines 67-88 define the \verb|ObjectLabels|. Those
   7.849 +labels can be assigned to resources when this policy is active.
   7.850 +
   7.851 +In general, user domains should be assigned labels that have only a
   7.852 +single SimpleTypeEnforcement workload type. This way, workloads remain
   7.853 +confined even if user domains become rogue. Any domain that is
   7.854 +assigned a label with multiple STE types must be trusted to keep
   7.855 +information belonging to the different STE types separate (confined).
   7.856 +For example, Domain0 is assigned the bootstrap label
   7.857 +\verb|SystemsManagement|, which includes all existing STE types.
   7.858 +Therefore, Domain0 must take care not to enable unauthorized
   7.859 +information flow (eg. through block devices or virtual networking)
   7.860 +between domains or resources that are assigned different STE types.
   7.861 +
   7.862 +Security administrators simply use the name of a label (specified in
   7.863 +the \verb|<Name>| field) to associate a label with a domain (cf.
   7.864 +Section~\ref{subsection:acmexamplelabeldomains}). The types inside the
   7.865 +label are used by the Xen access control enforcement.  While the name
   7.866 +can be arbitrarily chosen (as long as it is unique), it is advisable
   7.867 +to choose the label name in accordance to the security types included.
   7.868 +While the XML representation in the above label seems unnecessary
   7.869 +flexible, labels in general can consist of multiple types as we will
   7.870 +see in the following example.
   7.871 +
   7.872 +Assume that \verb|PepsiCo| and \verb|CocaCola| workloads use virtual
   7.873 +disks that are provided by a virtual I/O domain hosting a physical
   7.874 +storage device and carrying the following label:
   7.875 +
   7.876 +\begin{scriptsize}
   7.877 +\begin{verbatim}
   7.878 +        <VirtualMachineLabel>
   7.879 +          <Name>VIO</Name>
   7.880 +          <SimpleTypeEnforcementTypes>
   7.881 +              <Type>CocaCola</Type>
   7.882 +              <Type>PepsiCo</Type>
   7.883 +          </SimpleTypeEnforcementTypes>
   7.884 +          <ChineseWallTypes>
   7.885 +              <Type>VIOServer</Type>
   7.886 +          </ChineseWallTypes>
   7.887 +        </VirtualMachineLabel>
   7.888 +\end{verbatim}
   7.889 +\end{scriptsize}
   7.890 +
   7.891 +This Virtual I/O domain (VIO) exports its virtualized disks by
   7.892 +communicating both to domains labeled with the \verb|PepsiCo| label
   7.893 +and domains labeled with the \verb|CocaCola| label. This requires the
   7.894 +VIO domain to carry both the STE types \verb|CocaCola| and
   7.895 +\verb|PepsiCo|. In this example, the confinement of \verb|CocaCola|
   7.896 +and \verb|PepsiCo| workload depends on a VIO domain that must keep the
   7.897 +data of those different workloads separate. The virtual disks are
   7.898 +labeled as well (see Section~\ref{subsection:acmexamplelabelresources}
   7.899 +for labeling resources) and enforcement functions inside the VIO
   7.900 +domain must ensure that the labels of the domain mounting a virtual
   7.901 +disk and the virtual disk label share a common STE type. The VIO label
   7.902 +carrying its own VIOServer CHWALL type introduces the flexibility to
   7.903 +permit the trusted VIO server to run together with CocaCola or PepsiCo
   7.904 +workloads.
   7.905 +
   7.906 +Alternatively, a system that has two hard-drives does not need a VIO
   7.907 +domain but can directly assign one hardware storage device to each of
   7.908 +the workloads (if the platform offers an IO-MMU, cf
   7.909 +Section~\ref{s:ddsecurity}.  Sharing hardware through virtualization
   7.910 +is a trade-off between the amount of trusted code (size of the trusted
   7.911 +computing base) and the amount of acceptable over-provisioning. This
   7.912 +holds both for peripherals and for system platforms.
   7.913 +
   7.914 +\subsection{Tools For Creating sHype/Xen Security Policies}
   7.915 +To create a security policy for Xen, you can use one of the following
   7.916 +tools:
   7.917 +\begin{itemize}
   7.918 +\item \verb|ezPolicy| GUI tool -- start writing policies
   7.919 +\item \verb|xensec_gen| tool -- refine policies created with \verb|ezPolicy|
   7.920 +\item text or XML editor
   7.921 +\end{itemize}
   7.922 +
   7.923 +We use the \verb|ezPolicy| tool in
   7.924 +Section~\ref{subsection:acmexamplecreate} to quickly create a workload
   7.925 +protection policy. If desired, the resulting XML policy file can be
   7.926 +loaded into the \verb|xensec_gen| tool to refine it. It can also be
   7.927 +directly edited using an XML editor. Any XML policy file is verified
   7.928 +against the security policy schema when it is translated (see
   7.929 +Subsection~\ref{subsection:acmexampleinstall}).
   7.930 +
   7.931 +\section{Current Limitations}
   7.932 +\label{section:acmlimitations}
   7.933 +
   7.934 +The sHype/ACM configuration for Xen is work in progress. There is
   7.935 +ongoing work for protecting virtualized resources and planned and
   7.936 +ongoing work for protecting access to remote resources and domains.
   7.937 +The following sections describe limitations of some of the areas into
   7.938 +which access control is being extended.
   7.939 +
   7.940 +\subsection{Network Traffic}
   7.941 +Local and remote network traffic is currently not controlled.
   7.942 +Solutions to add sHype/ACM policy enforcement to the virtual network
   7.943 +exist but need to be discussed before they can become part of Xen.
   7.944 +Subjecting external network traffic to the ACM security policy is work
   7.945 +in progress. Manually setting up filters in domain 0 is required for
   7.946 +now but does not scale well.
   7.947 +
   7.948 +\subsection{Resource Access and Usage Control}
   7.949 +
   7.950 +Enforcing the security policy across multiple hypervisor systems and
   7.951 +on access to remote shared resources is work in progress. Extending
   7.952 +access control to new types of resources is ongoing work (e.g. network
   7.953 +storage).
   7.954 +
   7.955 +On a single Xen system, information about the association of resources
   7.956 +and security labels is stored in
   7.957 +\verb|/etc/xen/acm-security/policy/resource_labels|. This file relates
   7.958 +a full resource path with a security label. This association is weak
   7.959 +and will break if resources are moved or renamed without adapting the
   7.960 +label file. Improving the protection of label-resource relationships
   7.961 +is ongoing work.
   7.962 +
   7.963 +Controlling resource usage and enforcing resource limits in general is
   7.964 +ongoing work in the Xen community.
   7.965 +
   7.966 +\subsection{Domain Migration}
   7.967 +
   7.968 +Labels on domains are enforced during domain migration and the
   7.969 +destination hypervisor will ensure that the domain label is valid and
   7.970 +the domain is permitted to run (considering the Chinese Wall policy
   7.971 +rules) before it accepts the migration.  However, the network between
   7.972 +the source and destination hypervisor as well as both hypervisors must
   7.973 +be trusted. Architectures and prototypes exist that both protect the
   7.974 +network connection and ensure that the hypervisors enforce access
   7.975 +control consistently but patches are not yet available for the main
   7.976 +stream.
   7.977 +
   7.978 +\subsection{Covert Channels}
   7.979 +
   7.980 +The sHype access control aims at system independent security policies.
   7.981 +It builds on top of the core hypervisor isolation. Any covert channels
   7.982 +that exist in the core hypervisor or in the hardware (e.g., shared
   7.983 +processor cache) will be inherited. If those covert channels are not
   7.984 +the result of trade-offs between security and other system properties,
   7.985 +then they are most effectively minimized or eliminated where they are
   7.986 +caused. sHype offers however some means to mitigate their impact
   7.987 +(cf. run-time exclusion rules).
   7.988 +
   7.989  \part{Reference}
   7.990  
   7.991  %% Chapter Build and Boot Options
     8.1 --- a/linux-2.6-xen-sparse/arch/i386/kernel/ldt-xen.c	Tue Aug 01 14:58:20 2006 -0600
     8.2 +++ b/linux-2.6-xen-sparse/arch/i386/kernel/ldt-xen.c	Wed Aug 02 13:39:47 2006 -0600
     8.3 @@ -109,6 +109,7 @@ int init_new_context(struct task_struct 
     8.4  
     8.5  	init_MUTEX(&mm->context.sem);
     8.6  	mm->context.size = 0;
     8.7 +	mm->context.has_foreign_mappings = 0;
     8.8  	old_mm = current->mm;
     8.9  	if (old_mm && old_mm->context.size > 0) {
    8.10  		down(&old_mm->context.sem);
     9.1 --- a/linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c	Tue Aug 01 14:58:20 2006 -0600
     9.2 +++ b/linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c	Wed Aug 02 13:39:47 2006 -0600
     9.3 @@ -126,6 +126,8 @@ int direct_remap_pfn_range(struct vm_are
     9.4  	if (domid == DOMID_SELF)
     9.5  		return -EINVAL;
     9.6  
     9.7 +	vma->vm_mm->context.has_foreign_mappings = 1;
     9.8 +
     9.9  	return __direct_remap_pfn_range(
    9.10  		vma->vm_mm, address, mfn, size, prot, domid);
    9.11  }
    10.1 --- a/linux-2.6-xen-sparse/arch/i386/mm/pgtable-xen.c	Tue Aug 01 14:58:20 2006 -0600
    10.2 +++ b/linux-2.6-xen-sparse/arch/i386/mm/pgtable-xen.c	Wed Aug 02 13:39:47 2006 -0600
    10.3 @@ -694,6 +694,7 @@ void _arch_exit_mmap(struct mm_struct *m
    10.4  	task_unlock(tsk);
    10.5  
    10.6  	if (test_bit(PG_pinned, &virt_to_page(mm->pgd)->flags) &&
    10.7 -	    (atomic_read(&mm->mm_count) == 1))
    10.8 +	    (atomic_read(&mm->mm_count) == 1) &&
    10.9 +	    !mm->context.has_foreign_mappings)
   10.10  		mm_unpin(mm);
   10.11  }
    11.1 --- a/linux-2.6-xen-sparse/arch/x86_64/mm/pageattr-xen.c	Tue Aug 01 14:58:20 2006 -0600
    11.2 +++ b/linux-2.6-xen-sparse/arch/x86_64/mm/pageattr-xen.c	Wed Aug 02 13:39:47 2006 -0600
    11.3 @@ -159,7 +159,8 @@ void _arch_exit_mmap(struct mm_struct *m
    11.4  
    11.5      task_unlock(tsk);
    11.6  
    11.7 -    if ( mm->context.pinned && (atomic_read(&mm->mm_count) == 1) )
    11.8 +    if ( mm->context.pinned && (atomic_read(&mm->mm_count) == 1) &&
    11.9 +         !mm->context.has_foreign_mappings )
   11.10          mm_unpin(mm);
   11.11  }
   11.12  
    12.1 --- a/linux-2.6-xen-sparse/drivers/xen/netback/common.h	Tue Aug 01 14:58:20 2006 -0600
    12.2 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/common.h	Wed Aug 02 13:39:47 2006 -0600
    12.3 @@ -76,6 +76,10 @@ typedef struct netif_st {
    12.4  	struct vm_struct *tx_comms_area;
    12.5  	struct vm_struct *rx_comms_area;
    12.6  
    12.7 +	/* Set of features that can be turned on in dev->features. */
    12.8 +	int features;
    12.9 +	int can_queue;
   12.10 +
   12.11  	/* Allow netif_be_start_xmit() to peek ahead in the rx request ring. */
   12.12  	RING_IDX rx_req_cons_peek;
   12.13  
   12.14 @@ -119,4 +123,16 @@ int netif_be_start_xmit(struct sk_buff *
   12.15  struct net_device_stats *netif_be_get_stats(struct net_device *dev);
   12.16  irqreturn_t netif_be_int(int irq, void *dev_id, struct pt_regs *regs);
   12.17  
   12.18 +static inline int netbk_can_queue(struct net_device *dev)
   12.19 +{
   12.20 +	netif_t *netif = netdev_priv(dev);
   12.21 +	return netif->can_queue;
   12.22 +}
   12.23 +
   12.24 +static inline int netbk_can_sg(struct net_device *dev)
   12.25 +{
   12.26 +	netif_t *netif = netdev_priv(dev);
   12.27 +	return netif->features & NETIF_F_SG;
   12.28 +}
   12.29 +
   12.30  #endif /* __NETIF__BACKEND__COMMON_H__ */
    13.1 --- a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c	Tue Aug 01 14:58:20 2006 -0600
    13.2 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c	Wed Aug 02 13:39:47 2006 -0600
    13.3 @@ -51,23 +51,59 @@ static int net_open(struct net_device *d
    13.4  	netif_t *netif = netdev_priv(dev);
    13.5  	if (netif_carrier_ok(dev))
    13.6  		__netif_up(netif);
    13.7 -	netif_start_queue(dev);
    13.8  	return 0;
    13.9  }
   13.10  
   13.11  static int net_close(struct net_device *dev)
   13.12  {
   13.13  	netif_t *netif = netdev_priv(dev);
   13.14 -	netif_stop_queue(dev);
   13.15  	if (netif_carrier_ok(dev))
   13.16  		__netif_down(netif);
   13.17  	return 0;
   13.18  }
   13.19  
   13.20 +static int netbk_change_mtu(struct net_device *dev, int mtu)
   13.21 +{
   13.22 +	int max = netbk_can_sg(dev) ? 65535 - ETH_HLEN : ETH_DATA_LEN;
   13.23 +
   13.24 +	if (mtu > max)
   13.25 +		return -EINVAL;
   13.26 +	dev->mtu = mtu;
   13.27 +	return 0;
   13.28 +}
   13.29 +
   13.30 +static int netbk_set_sg(struct net_device *dev, u32 data)
   13.31 +{
   13.32 +	if (data) {
   13.33 +		netif_t *netif = netdev_priv(dev);
   13.34 +
   13.35 +		if (!(netif->features & NETIF_F_SG))
   13.36 +			return -ENOSYS;
   13.37 +	}
   13.38 +
   13.39 +	return ethtool_op_set_sg(dev, data);
   13.40 +}
   13.41 +
   13.42 +static int netbk_set_tso(struct net_device *dev, u32 data)
   13.43 +{
   13.44 +	if (data) {
   13.45 +		netif_t *netif = netdev_priv(dev);
   13.46 +
   13.47 +		if (!(netif->features & NETIF_F_TSO))
   13.48 +			return -ENOSYS;
   13.49 +	}
   13.50 +
   13.51 +	return ethtool_op_set_tso(dev, data);
   13.52 +}
   13.53 +
   13.54  static struct ethtool_ops network_ethtool_ops =
   13.55  {
   13.56  	.get_tx_csum = ethtool_op_get_tx_csum,
   13.57  	.set_tx_csum = ethtool_op_set_tx_csum,
   13.58 +	.get_sg = ethtool_op_get_sg,
   13.59 +	.set_sg = netbk_set_sg,
   13.60 +	.get_tso = ethtool_op_get_tso,
   13.61 +	.set_tso = netbk_set_tso,
   13.62  	.get_link = ethtool_op_get_link,
   13.63  };
   13.64  
   13.65 @@ -103,12 +139,16 @@ netif_t *netif_alloc(domid_t domid, unsi
   13.66  	dev->get_stats       = netif_be_get_stats;
   13.67  	dev->open            = net_open;
   13.68  	dev->stop            = net_close;
   13.69 +	dev->change_mtu	     = netbk_change_mtu;
   13.70  	dev->features        = NETIF_F_IP_CSUM;
   13.71  
   13.72  	SET_ETHTOOL_OPS(dev, &network_ethtool_ops);
   13.73  
   13.74 -	/* Disable queuing. */
   13.75 -	dev->tx_queue_len = 0;
   13.76 +	/*
   13.77 +	 * Reduce default TX queuelen so that each guest interface only
   13.78 +	 * allows it to eat around 6.4MB of host memory.
   13.79 +	 */
   13.80 +	dev->tx_queue_len = 100;
   13.81  
   13.82  	for (i = 0; i < ETH_ALEN; i++)
   13.83  		if (be_mac[i] != 0)
    14.1 --- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c	Tue Aug 01 14:58:20 2006 -0600
    14.2 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c	Wed Aug 02 13:39:47 2006 -0600
    14.3 @@ -40,17 +40,22 @@
    14.4  
    14.5  /*#define NETBE_DEBUG_INTERRUPT*/
    14.6  
    14.7 +struct netbk_rx_meta {
    14.8 +	skb_frag_t frag;
    14.9 +	int id;
   14.10 +};
   14.11 +
   14.12  static void netif_idx_release(u16 pending_idx);
   14.13  static void netif_page_release(struct page *page);
   14.14  static void make_tx_response(netif_t *netif, 
   14.15  			     netif_tx_request_t *txp,
   14.16  			     s8       st);
   14.17 -static int  make_rx_response(netif_t *netif, 
   14.18 -			     u16      id, 
   14.19 -			     s8       st,
   14.20 -			     u16      offset,
   14.21 -			     u16      size,
   14.22 -			     u16      flags);
   14.23 +static netif_rx_response_t *make_rx_response(netif_t *netif, 
   14.24 +					     u16      id, 
   14.25 +					     s8       st,
   14.26 +					     u16      offset,
   14.27 +					     u16      size,
   14.28 +					     u16      flags);
   14.29  
   14.30  static void net_tx_action(unsigned long unused);
   14.31  static DECLARE_TASKLET(net_tx_tasklet, net_tx_action, 0);
   14.32 @@ -100,21 +105,27 @@ static spinlock_t net_schedule_list_lock
   14.33  static unsigned long mfn_list[MAX_MFN_ALLOC];
   14.34  static unsigned int alloc_index = 0;
   14.35  
   14.36 -static unsigned long alloc_mfn(void)
   14.37 +static inline unsigned long alloc_mfn(void)
   14.38  {
   14.39 -	unsigned long mfn = 0;
   14.40 +	return mfn_list[--alloc_index];
   14.41 +}
   14.42 +
   14.43 +static int check_mfn(int nr)
   14.44 +{
   14.45  	struct xen_memory_reservation reservation = {
   14.46 -		.nr_extents   = MAX_MFN_ALLOC,
   14.47  		.extent_order = 0,
   14.48  		.domid        = DOMID_SELF
   14.49  	};
   14.50 -	set_xen_guest_handle(reservation.extent_start, mfn_list);
   14.51 -	if ( unlikely(alloc_index == 0) )
   14.52 -		alloc_index = HYPERVISOR_memory_op(
   14.53 -			XENMEM_increase_reservation, &reservation);
   14.54 -	if ( alloc_index != 0 )
   14.55 -		mfn = mfn_list[--alloc_index];
   14.56 -	return mfn;
   14.57 +
   14.58 +	if (likely(alloc_index >= nr))
   14.59 +		return 0;
   14.60 +
   14.61 +	set_xen_guest_handle(reservation.extent_start, mfn_list + alloc_index);
   14.62 +	reservation.nr_extents = MAX_MFN_ALLOC - alloc_index;
   14.63 +	alloc_index += HYPERVISOR_memory_op(XENMEM_increase_reservation,
   14.64 +					    &reservation);
   14.65 +
   14.66 +	return alloc_index >= nr ? 0 : -ENOMEM;
   14.67  }
   14.68  
   14.69  static inline void maybe_schedule_tx_action(void)
   14.70 @@ -136,6 +147,96 @@ static inline int is_xen_skb(struct sk_b
   14.71  	return (cp == skbuff_cachep);
   14.72  }
   14.73  
   14.74 +static struct sk_buff *netbk_copy_skb(struct sk_buff *skb)
   14.75 +{
   14.76 +	struct skb_shared_info *ninfo;
   14.77 +	struct sk_buff *nskb;
   14.78 +	unsigned long offset;
   14.79 +	int ret;
   14.80 +	int len;
   14.81 +	int headlen;
   14.82 +
   14.83 +	nskb = alloc_skb(SKB_MAX_HEAD(0), GFP_ATOMIC);
   14.84 +	if (unlikely(!nskb))
   14.85 +		goto err;
   14.86 +
   14.87 +	skb_reserve(nskb, 16);
   14.88 +	headlen = nskb->end - nskb->data;
   14.89 +	if (headlen > skb_headlen(skb))
   14.90 +		headlen = skb_headlen(skb);
   14.91 +	ret = skb_copy_bits(skb, 0, __skb_put(nskb, headlen), headlen);
   14.92 +	BUG_ON(ret);
   14.93 +
   14.94 +	ninfo = skb_shinfo(nskb);
   14.95 +	ninfo->gso_size = skb_shinfo(skb)->gso_size;
   14.96 +	ninfo->gso_type = skb_shinfo(skb)->gso_type;
   14.97 +
   14.98 +	offset = headlen;
   14.99 +	len = skb->len - headlen;
  14.100 +
  14.101 +	nskb->len = skb->len;
  14.102 +	nskb->data_len = len;
  14.103 +	nskb->truesize += len;
  14.104 +
  14.105 +	while (len) {
  14.106 +		struct page *page;
  14.107 +		int copy;
  14.108 +		int zero;
  14.109 +
  14.110 +		if (unlikely(ninfo->nr_frags >= MAX_SKB_FRAGS)) {
  14.111 +			dump_stack();
  14.112 +			goto err_free;
  14.113 +		}
  14.114 +
  14.115 +		copy = len >= PAGE_SIZE ? PAGE_SIZE : len;
  14.116 +		zero = len >= PAGE_SIZE ? 0 : __GFP_ZERO;
  14.117 +
  14.118 +		page = alloc_page(GFP_ATOMIC | zero);
  14.119 +		if (unlikely(!page))
  14.120 +			goto err_free;
  14.121 +
  14.122 +		ret = skb_copy_bits(skb, offset, page_address(page), copy);
  14.123 +		BUG_ON(ret);
  14.124 +
  14.125 +		ninfo->frags[ninfo->nr_frags].page = page;
  14.126 +		ninfo->frags[ninfo->nr_frags].page_offset = 0;
  14.127 +		ninfo->frags[ninfo->nr_frags].size = copy;
  14.128 +		ninfo->nr_frags++;
  14.129 +
  14.130 +		offset += copy;
  14.131 +		len -= copy;
  14.132 +	}
  14.133 +
  14.134 +	offset = nskb->data - skb->data;
  14.135 +
  14.136 +	nskb->h.raw = skb->h.raw + offset;
  14.137 +	nskb->nh.raw = skb->nh.raw + offset;
  14.138 +	nskb->mac.raw = skb->mac.raw + offset;
  14.139 +
  14.140 +	return nskb;
  14.141 +
  14.142 + err_free:
  14.143 +	kfree_skb(nskb);
  14.144 + err:
  14.145 +	return NULL;
  14.146 +}
  14.147 +
  14.148 +static inline int netbk_max_required_rx_slots(netif_t *netif)
  14.149 +{
  14.150 +	if (netif->features & (NETIF_F_SG|NETIF_F_TSO))
  14.151 +		return MAX_SKB_FRAGS + 2; /* header + extra_info + frags */
  14.152 +	return 1; /* all in one */
  14.153 +}
  14.154 +
  14.155 +static inline int netbk_queue_full(netif_t *netif)
  14.156 +{
  14.157 +	RING_IDX peek   = netif->rx_req_cons_peek;
  14.158 +	RING_IDX needed = netbk_max_required_rx_slots(netif);
  14.159 +
  14.160 +	return ((netif->rx.sring->req_prod - peek) < needed) ||
  14.161 +	       ((netif->rx.rsp_prod_pvt + NET_RX_RING_SIZE - peek) < needed);
  14.162 +}
  14.163 +
  14.164  int netif_be_start_xmit(struct sk_buff *skb, struct net_device *dev)
  14.165  {
  14.166  	netif_t *netif = netdev_priv(dev);
  14.167 @@ -143,30 +244,26 @@ int netif_be_start_xmit(struct sk_buff *
  14.168  	BUG_ON(skb->dev != dev);
  14.169  
  14.170  	/* Drop the packet if the target domain has no receive buffers. */
  14.171 -	if (unlikely(!netif_running(dev) || !netif_carrier_ok(dev)) ||
  14.172 -	    (netif->rx_req_cons_peek == netif->rx.sring->req_prod) ||
  14.173 -	    ((netif->rx_req_cons_peek - netif->rx.rsp_prod_pvt) ==
  14.174 -	     NET_RX_RING_SIZE))
  14.175 +	if (unlikely(!netif_running(dev) || !netif_carrier_ok(dev)))
  14.176  		goto drop;
  14.177  
  14.178 +	if (unlikely(netbk_queue_full(netif))) {
  14.179 +		/* Not a BUG_ON() -- misbehaving netfront can trigger this. */
  14.180 +		if (netbk_can_queue(dev))
  14.181 +			DPRINTK("Queue full but not stopped!\n");
  14.182 +		goto drop;
  14.183 +	}
  14.184 +
  14.185  	/*
  14.186  	 * We do not copy the packet unless:
  14.187  	 *  1. The data is shared; or
  14.188  	 *  2. The data is not allocated from our special cache.
  14.189 -	 * NB. We also couldn't cope with fragmented packets, but we won't get
  14.190 -	 *     any because we not advertise the NETIF_F_SG feature.
  14.191 +	 *  3. The data is fragmented.
  14.192  	 */
  14.193 -	if (skb_shared(skb) || skb_cloned(skb) || !is_xen_skb(skb)) {
  14.194 -		int hlen = skb->data - skb->head;
  14.195 -		int ret;
  14.196 -		struct sk_buff *nskb = dev_alloc_skb(hlen + skb->len);
  14.197 +	if (skb_cloned(skb) || skb_is_nonlinear(skb) || !is_xen_skb(skb)) {
  14.198 +		struct sk_buff *nskb = netbk_copy_skb(skb);
  14.199  		if ( unlikely(nskb == NULL) )
  14.200  			goto drop;
  14.201 -		skb_reserve(nskb, hlen);
  14.202 -		__skb_put(nskb, skb->len);
  14.203 -		ret = skb_copy_bits(skb, -hlen, nskb->data - hlen,
  14.204 -				     skb->len + hlen);
  14.205 -		BUG_ON(ret);
  14.206  		/* Copy only the header fields we use in this driver. */
  14.207  		nskb->dev = skb->dev;
  14.208  		nskb->ip_summed = skb->ip_summed;
  14.209 @@ -175,9 +272,18 @@ int netif_be_start_xmit(struct sk_buff *
  14.210  		skb = nskb;
  14.211  	}
  14.212  
  14.213 -	netif->rx_req_cons_peek++;
  14.214 +	netif->rx_req_cons_peek += skb_shinfo(skb)->nr_frags + 1 +
  14.215 +				   !!skb_shinfo(skb)->gso_size;
  14.216  	netif_get(netif);
  14.217  
  14.218 +	if (netbk_can_queue(dev) && netbk_queue_full(netif)) {
  14.219 +		netif->rx.sring->req_event = netif->rx_req_cons_peek +
  14.220 +			netbk_max_required_rx_slots(netif);
  14.221 +		mb(); /* request notification /then/ check & stop the queue */
  14.222 +		if (netbk_queue_full(netif))
  14.223 +			netif_stop_queue(dev);
  14.224 +	}
  14.225 +
  14.226  	skb_queue_tail(&rx_queue, skb);
  14.227  	tasklet_schedule(&net_rx_tasklet);
  14.228  
  14.229 @@ -208,116 +314,85 @@ int xen_network_done(void)
  14.230  }
  14.231  #endif
  14.232  
  14.233 -static void net_rx_action(unsigned long unused)
  14.234 +static u16 netbk_gop_frag(netif_t *netif, struct page *page, int count, int i)
  14.235  {
  14.236 -	netif_t *netif = NULL; 
  14.237 -	s8 status;
  14.238 -	u16 size, id, irq, flags;
  14.239 -	multicall_entry_t *mcl;
  14.240 -	mmu_update_t *mmu;
  14.241 -	gnttab_transfer_t *gop;
  14.242 -	unsigned long vdata, old_mfn, new_mfn;
  14.243 -	struct sk_buff_head rxq;
  14.244 -	struct sk_buff *skb;
  14.245 -	int notify_nr = 0;
  14.246 -	int ret;
  14.247 -	/*
  14.248 -	 * Putting hundreds of bytes on the stack is considered rude.
  14.249 -	 * Static works because a tasklet can only be on one CPU at any time.
  14.250 -	 */
  14.251 -	static u16 notify_list[NET_RX_RING_SIZE];
  14.252 -
  14.253 -	skb_queue_head_init(&rxq);
  14.254 -
  14.255 -	mcl = rx_mcl;
  14.256 -	mmu = rx_mmu;
  14.257 -	gop = grant_rx_op;
  14.258 -
  14.259 -	while ((skb = skb_dequeue(&rx_queue)) != NULL) {
  14.260 -		netif   = netdev_priv(skb->dev);
  14.261 -		vdata   = (unsigned long)skb->data;
  14.262 -		old_mfn = virt_to_mfn(vdata);
  14.263 +	multicall_entry_t *mcl = rx_mcl + count;
  14.264 +	mmu_update_t *mmu = rx_mmu + count;
  14.265 +	gnttab_transfer_t *gop = grant_rx_op + count;
  14.266 +	netif_rx_request_t *req;
  14.267 +	unsigned long old_mfn, new_mfn;
  14.268  
  14.269 -		if (!xen_feature(XENFEAT_auto_translated_physmap)) {
  14.270 -			/* Memory squeeze? Back off for an arbitrary while. */
  14.271 -			if ((new_mfn = alloc_mfn()) == 0) {
  14.272 -				if ( net_ratelimit() )
  14.273 -					WPRINTK("Memory squeeze in netback "
  14.274 -						"driver.\n");
  14.275 -				mod_timer(&net_timer, jiffies + HZ);
  14.276 -				skb_queue_head(&rx_queue, skb);
  14.277 -				break;
  14.278 -			}
  14.279 -			/*
  14.280 -			 * Set the new P2M table entry before reassigning
  14.281 -			 * the old data page. Heed the comment in
  14.282 -			 * pgtable-2level.h:pte_page(). :-)
  14.283 -			 */
  14.284 -			set_phys_to_machine(
  14.285 -				__pa(skb->data) >> PAGE_SHIFT,
  14.286 -				new_mfn);
  14.287 +	old_mfn = virt_to_mfn(page_address(page));
  14.288  
  14.289 -			MULTI_update_va_mapping(mcl, vdata,
  14.290 -						pfn_pte_ma(new_mfn,
  14.291 -							   PAGE_KERNEL), 0);
  14.292 -			mcl++;
  14.293 -
  14.294 -			mmu->ptr = ((maddr_t)new_mfn << PAGE_SHIFT) |
  14.295 -				MMU_MACHPHYS_UPDATE;
  14.296 -			mmu->val = __pa(vdata) >> PAGE_SHIFT;
  14.297 -			mmu++;
  14.298 -		}
  14.299 +	if (!xen_feature(XENFEAT_auto_translated_physmap)) {
  14.300 +		new_mfn = alloc_mfn();
  14.301  
  14.302 -		gop->mfn = old_mfn;
  14.303 -		gop->domid = netif->domid;
  14.304 -		gop->ref = RING_GET_REQUEST(
  14.305 -			&netif->rx, netif->rx.req_cons)->gref;
  14.306 -		netif->rx.req_cons++;
  14.307 -		gop++;
  14.308 +		/*
  14.309 +		 * Set the new P2M table entry before reassigning
  14.310 +		 * the old data page. Heed the comment in
  14.311 +		 * pgtable-2level.h:pte_page(). :-)
  14.312 +		 */
  14.313 +		set_phys_to_machine(page_to_pfn(page), new_mfn);
  14.314  
  14.315 -		__skb_queue_tail(&rxq, skb);
  14.316 +		MULTI_update_va_mapping(mcl, (unsigned long)page_address(page),
  14.317 +					pfn_pte_ma(new_mfn, PAGE_KERNEL), 0);
  14.318  
  14.319 -		/* Filled the batch queue? */
  14.320 -		if ((gop - grant_rx_op) == ARRAY_SIZE(grant_rx_op))
  14.321 -			break;
  14.322 +		mmu->ptr = ((maddr_t)new_mfn << PAGE_SHIFT) |
  14.323 +			MMU_MACHPHYS_UPDATE;
  14.324 +		mmu->val = page_to_pfn(page);
  14.325  	}
  14.326  
  14.327 -	if (!xen_feature(XENFEAT_auto_translated_physmap)) {
  14.328 -		if (mcl == rx_mcl)
  14.329 -			return;
  14.330 -
  14.331 -		mcl[-1].args[MULTI_UVMFLAGS_INDEX] = UVMF_TLB_FLUSH|UVMF_ALL;
  14.332 +	req = RING_GET_REQUEST(&netif->rx, netif->rx.req_cons + i);
  14.333 +	gop->mfn = old_mfn;
  14.334 +	gop->domid = netif->domid;
  14.335 +	gop->ref = req->gref;
  14.336 +	return req->id;
  14.337 +}
  14.338  
  14.339 -		if (mmu - rx_mmu) {
  14.340 -			mcl->op = __HYPERVISOR_mmu_update;
  14.341 -			mcl->args[0] = (unsigned long)rx_mmu;
  14.342 -			mcl->args[1] = mmu - rx_mmu;
  14.343 -			mcl->args[2] = 0;
  14.344 -			mcl->args[3] = DOMID_SELF;
  14.345 -			mcl++;
  14.346 -		}
  14.347 +static void netbk_gop_skb(struct sk_buff *skb, struct netbk_rx_meta *meta,
  14.348 +			  int count)
  14.349 +{
  14.350 +	netif_t *netif = netdev_priv(skb->dev);
  14.351 +	int nr_frags = skb_shinfo(skb)->nr_frags;
  14.352 +	int i;
  14.353 +	int extra;
  14.354  
  14.355 -		ret = HYPERVISOR_multicall(rx_mcl, mcl - rx_mcl);
  14.356 -		BUG_ON(ret != 0);
  14.357 +	meta[count].frag.page_offset = skb_shinfo(skb)->gso_type;
  14.358 +	meta[count].frag.size = skb_shinfo(skb)->gso_size;
  14.359 +	extra = !!meta[count].frag.size + 1;
  14.360 +
  14.361 +	for (i = 0; i < nr_frags; i++) {
  14.362 +		meta[++count].frag = skb_shinfo(skb)->frags[i];
  14.363 +		meta[count].id = netbk_gop_frag(netif, meta[count].frag.page,
  14.364 +						count, i + extra);
  14.365  	}
  14.366  
  14.367 -	ret = HYPERVISOR_grant_table_op(GNTTABOP_transfer, grant_rx_op, 
  14.368 -					gop - grant_rx_op);
  14.369 -	BUG_ON(ret != 0);
  14.370 +	/*
  14.371 +	 * This must occur at the end to ensure that we don't trash
  14.372 +	 * skb_shinfo until we're done.
  14.373 +	 */
  14.374 +	meta[count - nr_frags].id = netbk_gop_frag(netif,
  14.375 +						   virt_to_page(skb->data),
  14.376 +						   count - nr_frags, 0);
  14.377 +	netif->rx.req_cons += nr_frags + extra;
  14.378 +}
  14.379  
  14.380 -	mcl = rx_mcl;
  14.381 -	gop = grant_rx_op;
  14.382 -	while ((skb = __skb_dequeue(&rxq)) != NULL) {
  14.383 -		netif   = netdev_priv(skb->dev);
  14.384 -		size    = skb->tail - skb->data;
  14.385 +static inline void netbk_free_pages(int nr_frags, struct netbk_rx_meta *meta)
  14.386 +{
  14.387 +	int i;
  14.388  
  14.389 -		atomic_set(&(skb_shinfo(skb)->dataref), 1);
  14.390 -		skb_shinfo(skb)->nr_frags = 0;
  14.391 -		skb_shinfo(skb)->frag_list = NULL;
  14.392 +	for (i = 0; i < nr_frags; i++)
  14.393 +		put_page(meta[i].frag.page);
  14.394 +}
  14.395  
  14.396 -		netif->stats.tx_bytes += size;
  14.397 -		netif->stats.tx_packets++;
  14.398 +static int netbk_check_gop(int nr_frags, domid_t domid, int count)
  14.399 +{
  14.400 +	multicall_entry_t *mcl = rx_mcl + count;
  14.401 +	gnttab_transfer_t *gop = grant_rx_op + count;
  14.402 +	int status = NETIF_RSP_OKAY;
  14.403 +	int i;
  14.404  
  14.405 +	for (i = 0; i <= nr_frags; i++) {
  14.406  		if (!xen_feature(XENFEAT_auto_translated_physmap)) {
  14.407  			/* The update_va_mapping() must not fail. */
  14.408  			BUG_ON(mcl->result != 0);
  14.409 @@ -325,10 +400,9 @@ static void net_rx_action(unsigned long 
  14.410  		}
  14.411  
  14.412  		/* Check the reassignment error code. */
  14.413 -		status = NETIF_RSP_OKAY;
  14.414  		if (gop->status != 0) { 
  14.415  			DPRINTK("Bad status %d from grant transfer to DOM%u\n",
  14.416 -				gop->status, netif->domid);
  14.417 +				gop->status, domid);
  14.418  			/*
  14.419  			 * Page no longer belongs to us unless GNTST_bad_page,
  14.420  			 * but that should be a fatal error anyway.
  14.421 @@ -336,24 +410,166 @@ static void net_rx_action(unsigned long 
  14.422  			BUG_ON(gop->status == GNTST_bad_page);
  14.423  			status = NETIF_RSP_ERROR; 
  14.424  		}
  14.425 -		irq = netif->irq;
  14.426 -		id = RING_GET_REQUEST(&netif->rx, netif->rx.rsp_prod_pvt)->id;
  14.427 -		flags = 0;
  14.428 +		gop++;
  14.429 +	}
  14.430 +
  14.431 +	return status;
  14.432 +}
  14.433 +
  14.434 +static void netbk_add_frag_responses(netif_t *netif, int status,
  14.435 +				     struct netbk_rx_meta *meta, int nr_frags)
  14.436 +{
  14.437 +	int i;
  14.438 +
  14.439 +	for (i = 0; i < nr_frags; i++) {
  14.440 +		int id = meta[i].id;
  14.441 +		int flags = (i == nr_frags - 1) ? 0 : NETRXF_more_data;
  14.442 +
  14.443 +		make_rx_response(netif, id, status, meta[i].frag.page_offset,
  14.444 +				 meta[i].frag.size, flags);
  14.445 +	}
  14.446 +}
  14.447 +
  14.448 +static void net_rx_action(unsigned long unused)
  14.449 +{
  14.450 +	netif_t *netif = NULL; 
  14.451 +	s8 status;
  14.452 +	u16 id, irq, flags;
  14.453 +	netif_rx_response_t *resp;
  14.454 +	struct netif_extra_info *extra;
  14.455 +	multicall_entry_t *mcl;
  14.456 +	struct sk_buff_head rxq;
  14.457 +	struct sk_buff *skb;
  14.458 +	int notify_nr = 0;
  14.459 +	int ret;
  14.460 +	int nr_frags;
  14.461 +	int count;
  14.462 +
  14.463 +	/*
  14.464 +	 * Putting hundreds of bytes on the stack is considered rude.
  14.465 +	 * Static works because a tasklet can only be on one CPU at any time.
  14.466 +	 */
  14.467 +	static u16 notify_list[NET_RX_RING_SIZE];
  14.468 +	static struct netbk_rx_meta meta[NET_RX_RING_SIZE];
  14.469 +
  14.470 +	skb_queue_head_init(&rxq);
  14.471 +
  14.472 +	count = 0;
  14.473 +
  14.474 +	while ((skb = skb_dequeue(&rx_queue)) != NULL) {
  14.475 +		nr_frags = skb_shinfo(skb)->nr_frags;
  14.476 +		*(int *)skb->cb = nr_frags;
  14.477 +
  14.478 +		if (!xen_feature(XENFEAT_auto_translated_physmap) &&
  14.479 +		    check_mfn(nr_frags + 1)) {
  14.480 +			/* Memory squeeze? Back off for an arbitrary while. */
  14.481 +			if ( net_ratelimit() )
  14.482 +				WPRINTK("Memory squeeze in netback "
  14.483 +					"driver.\n");
  14.484 +			mod_timer(&net_timer, jiffies + HZ);
  14.485 +			skb_queue_head(&rx_queue, skb);
  14.486 +			break;
  14.487 +		}
  14.488 +
  14.489 +		netbk_gop_skb(skb, meta, count);
  14.490 +
  14.491 +		count += nr_frags + 1;
  14.492 +
  14.493 +		__skb_queue_tail(&rxq, skb);
  14.494 +
  14.495 +		/* Filled the batch queue? */
  14.496 +		if (count + MAX_SKB_FRAGS >= NET_RX_RING_SIZE)
  14.497 +			break;
  14.498 +	}
  14.499 +
  14.500 +	if (!count)
  14.501 +		return;
  14.502 +
  14.503 +	if (!xen_feature(XENFEAT_auto_translated_physmap)) {
  14.504 +		mcl = rx_mcl + count;
  14.505 +
  14.506 +		mcl[-1].args[MULTI_UVMFLAGS_INDEX] = UVMF_TLB_FLUSH|UVMF_ALL;
  14.507 +
  14.508 +		mcl->op = __HYPERVISOR_mmu_update;
  14.509 +		mcl->args[0] = (unsigned long)rx_mmu;
  14.510 +		mcl->args[1] = count;
  14.511 +		mcl->args[2] = 0;
  14.512 +		mcl->args[3] = DOMID_SELF;
  14.513 +
  14.514 +		ret = HYPERVISOR_multicall(rx_mcl, count + 1);
  14.515 +		BUG_ON(ret != 0);
  14.516 +	}
  14.517 +
  14.518 +	ret = HYPERVISOR_grant_table_op(GNTTABOP_transfer, grant_rx_op, count);
  14.519 +	BUG_ON(ret != 0);
  14.520 +
  14.521 +	count = 0;
  14.522 +	while ((skb = __skb_dequeue(&rxq)) != NULL) {
  14.523 +		nr_frags = *(int *)skb->cb;
  14.524 +
  14.525 +		atomic_set(&(skb_shinfo(skb)->dataref), 1);
  14.526 +		skb_shinfo(skb)->nr_frags = 0;
  14.527 +		skb_shinfo(skb)->frag_list = NULL;
  14.528 +
  14.529 +		netif = netdev_priv(skb->dev);
  14.530 +		netif->stats.tx_bytes += skb->len;
  14.531 +		netif->stats.tx_packets++;
  14.532 +
  14.533 +		netbk_free_pages(nr_frags, meta + count + 1);
  14.534 +		status = netbk_check_gop(nr_frags, netif->domid, count);
  14.535 +
  14.536 +		id = meta[count].id;
  14.537 +		flags = nr_frags ? NETRXF_more_data : 0;
  14.538 +
  14.539  		if (skb->ip_summed == CHECKSUM_HW) /* local packet? */
  14.540  			flags |= NETRXF_csum_blank | NETRXF_data_validated;
  14.541  		else if (skb->proto_data_valid) /* remote but checksummed? */
  14.542  			flags |= NETRXF_data_validated;
  14.543 -		if (make_rx_response(netif, id, status,
  14.544 -				     (unsigned long)skb->data & ~PAGE_MASK,
  14.545 -				     size, flags) &&
  14.546 -		    (rx_notify[irq] == 0)) {
  14.547 +
  14.548 +		resp = make_rx_response(netif, id, status,
  14.549 +					offset_in_page(skb->data),
  14.550 +					skb_headlen(skb), flags);
  14.551 +
  14.552 +		extra = NULL;
  14.553 +
  14.554 +		if (meta[count].frag.size) {
  14.555 +			struct netif_extra_info *gso =
  14.556 +				(struct netif_extra_info *)
  14.557 +				RING_GET_RESPONSE(&netif->rx,
  14.558 +						  netif->rx.rsp_prod_pvt++);
  14.559 +
  14.560 +			if (extra)
  14.561 +				extra->flags |= XEN_NETIF_EXTRA_FLAG_MORE;
  14.562 +			else
  14.563 +				resp->flags |= NETRXF_extra_info;
  14.564 +
  14.565 +			gso->u.gso.size = meta[count].frag.size;
  14.566 +			gso->u.gso.type = XEN_NETIF_GSO_TYPE_TCPV4;
  14.567 +			gso->u.gso.pad = 0;
  14.568 +			gso->u.gso.features = 0;
  14.569 +
  14.570 +			gso->type = XEN_NETIF_EXTRA_TYPE_GSO;
  14.571 +			gso->flags = 0;
  14.572 +			extra = gso;
  14.573 +		}
  14.574 +
  14.575 +		netbk_add_frag_responses(netif, status, meta + count + 1,
  14.576 +					 nr_frags);
  14.577 +
  14.578 +		RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&netif->rx, ret);
  14.579 +		irq = netif->irq;
  14.580 +		if (ret && !rx_notify[irq]) {
  14.581  			rx_notify[irq] = 1;
  14.582  			notify_list[notify_nr++] = irq;
  14.583  		}
  14.584  
  14.585 +		if (netif_queue_stopped(netif->dev) &&
  14.586 +		    !netbk_queue_full(netif))
  14.587 +			netif_wake_queue(netif->dev);
  14.588 +
  14.589  		netif_put(netif);
  14.590  		dev_kfree_skb(skb);
  14.591 -		gop++;
  14.592 +		count += nr_frags + 1;
  14.593  	}
  14.594  
  14.595  	while (notify_nr != 0) {
  14.596 @@ -974,8 +1190,13 @@ static void netif_page_release(struct pa
  14.597  irqreturn_t netif_be_int(int irq, void *dev_id, struct pt_regs *regs)
  14.598  {
  14.599  	netif_t *netif = dev_id;
  14.600 +
  14.601  	add_to_net_schedule_list_tail(netif);
  14.602  	maybe_schedule_tx_action();
  14.603 +
  14.604 +	if (netif_queue_stopped(netif->dev) && !netbk_queue_full(netif))
  14.605 +		netif_wake_queue(netif->dev);
  14.606 +
  14.607  	return IRQ_HANDLED;
  14.608  }
  14.609  
  14.610 @@ -1009,16 +1230,15 @@ static void make_tx_response(netif_t *ne
  14.611  #endif
  14.612  }
  14.613  
  14.614 -static int make_rx_response(netif_t *netif, 
  14.615 -			    u16      id, 
  14.616 -			    s8       st,
  14.617 -			    u16      offset,
  14.618 -			    u16      size,
  14.619 -			    u16      flags)
  14.620 +static netif_rx_response_t *make_rx_response(netif_t *netif, 
  14.621 +					     u16      id, 
  14.622 +					     s8       st,
  14.623 +					     u16      offset,
  14.624 +					     u16      size,
  14.625 +					     u16      flags)
  14.626  {
  14.627  	RING_IDX i = netif->rx.rsp_prod_pvt;
  14.628  	netif_rx_response_t *resp;
  14.629 -	int notify;
  14.630  
  14.631  	resp = RING_GET_RESPONSE(&netif->rx, i);
  14.632  	resp->offset     = offset;
  14.633 @@ -1029,9 +1249,8 @@ static int make_rx_response(netif_t *net
  14.634  		resp->status = (s16)st;
  14.635  
  14.636  	netif->rx.rsp_prod_pvt = ++i;
  14.637 -	RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&netif->rx, notify);
  14.638  
  14.639 -	return notify;
  14.640 +	return resp;
  14.641  }
  14.642  
  14.643  #ifdef NETBE_DEBUG_INTERRUPT
    15.1 --- a/linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c	Tue Aug 01 14:58:20 2006 -0600
    15.2 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c	Wed Aug 02 13:39:47 2006 -0600
    15.3 @@ -101,14 +101,12 @@ static int netback_probe(struct xenbus_d
    15.4  			goto abort_transaction;
    15.5  		}
    15.6  
    15.7 -#if 0 /* KAF: After the protocol is finalised. */
    15.8  		err = xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv4",
    15.9  				    "%d", 1);
   15.10  		if (err) {
   15.11  			message = "writing feature-gso-tcpv4";
   15.12  			goto abort_transaction;
   15.13  		}
   15.14 -#endif
   15.15  
   15.16  		err = xenbus_transaction_end(xbt, 0);
   15.17  	} while (err == -EAGAIN);
   15.18 @@ -353,6 +351,7 @@ static int connect_rings(struct backend_
   15.19  	unsigned long tx_ring_ref, rx_ring_ref;
   15.20  	unsigned int evtchn;
   15.21  	int err;
   15.22 +	int val;
   15.23  
   15.24  	DPRINTK("");
   15.25  
   15.26 @@ -367,6 +366,30 @@ static int connect_rings(struct backend_
   15.27  		return err;
   15.28  	}
   15.29  
   15.30 +	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-rx-notify", "%d",
   15.31 +			 &val) < 0)
   15.32 +		val = 0;
   15.33 +	if (val)
   15.34 +		be->netif->can_queue = 1;
   15.35 +	else
   15.36 +		/* Must be non-zero for pfifo_fast to work. */
   15.37 +		be->netif->dev->tx_queue_len = 1;
   15.38 +
   15.39 +	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg", "%d", &val) < 0)
   15.40 +		val = 0;
   15.41 +	if (val) {
   15.42 +		be->netif->features |= NETIF_F_SG;
   15.43 +		be->netif->dev->features |= NETIF_F_SG;
   15.44 +	}
   15.45 +
   15.46 +	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv4", "%d",
   15.47 +			 &val) < 0)
   15.48 +		val = 0;
   15.49 +	if (val) {
   15.50 +		be->netif->features |= NETIF_F_TSO;
   15.51 +		be->netif->dev->features |= NETIF_F_TSO;
   15.52 +	}
   15.53 +
   15.54  	/* Map the shared frame, irq etc. */
   15.55  	err = netif_map(be->netif, tx_ring_ref, rx_ring_ref, evtchn);
   15.56  	if (err) {
    16.1 --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c	Tue Aug 01 14:58:20 2006 -0600
    16.2 +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c	Wed Aug 02 13:39:47 2006 -0600
    16.3 @@ -46,11 +46,11 @@
    16.4  #include <linux/ethtool.h>
    16.5  #include <linux/in.h>
    16.6  #include <linux/if_ether.h>
    16.7 +#include <linux/io.h>
    16.8  #include <net/sock.h>
    16.9  #include <net/pkt_sched.h>
   16.10  #include <net/arp.h>
   16.11  #include <net/route.h>
   16.12 -#include <asm/io.h>
   16.13  #include <asm/uaccess.h>
   16.14  #include <xen/evtchn.h>
   16.15  #include <xen/xenbus.h>
   16.16 @@ -62,18 +62,13 @@
   16.17  #include <xen/interface/grant_table.h>
   16.18  #include <xen/gnttab.h>
   16.19  
   16.20 +#define RX_COPY_THRESHOLD 256
   16.21 +
   16.22  #define GRANT_INVALID_REF	0
   16.23  
   16.24  #define NET_TX_RING_SIZE __RING_SIZE((struct netif_tx_sring *)0, PAGE_SIZE)
   16.25  #define NET_RX_RING_SIZE __RING_SIZE((struct netif_rx_sring *)0, PAGE_SIZE)
   16.26  
   16.27 -static inline void init_skb_shinfo(struct sk_buff *skb)
   16.28 -{
   16.29 -	atomic_set(&(skb_shinfo(skb)->dataref), 1);
   16.30 -	skb_shinfo(skb)->nr_frags = 0;
   16.31 -	skb_shinfo(skb)->frag_list = NULL;
   16.32 -}
   16.33 -
   16.34  struct netfront_info {
   16.35  	struct list_head list;
   16.36  	struct net_device *netdev;
   16.37 @@ -121,6 +116,11 @@ struct netfront_info {
   16.38  	struct mmu_update rx_mmu[NET_RX_RING_SIZE];
   16.39  };
   16.40  
   16.41 +struct netfront_rx_info {
   16.42 +	struct netif_rx_response rx;
   16.43 +	struct netif_extra_info extras[XEN_NETIF_EXTRA_TYPE_MAX - 1];
   16.44 +};
   16.45 +
   16.46  /*
   16.47   * Access macros for acquiring freeing slots in tx_skbs[].
   16.48   */
   16.49 @@ -332,6 +332,18 @@ again:
   16.50  		goto abort_transaction;
   16.51  	}
   16.52  
   16.53 +	err = xenbus_printf(xbt, dev->nodename, "feature-sg", "%d", 1);
   16.54 +	if (err) {
   16.55 +		message = "writing feature-sg";
   16.56 +		goto abort_transaction;
   16.57 +	}
   16.58 +
   16.59 +	err = xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv4", "%d", 1);
   16.60 +	if (err) {
   16.61 +		message = "writing feature-gso-tcpv4";
   16.62 +		goto abort_transaction;
   16.63 +	}
   16.64 +
   16.65  	err = xenbus_transaction_end(xbt, 0);
   16.66  	if (err) {
   16.67  		if (err == -EAGAIN)
   16.68 @@ -575,10 +587,13 @@ static void network_alloc_rx_buffers(str
   16.69  	unsigned short id;
   16.70  	struct netfront_info *np = netdev_priv(dev);
   16.71  	struct sk_buff *skb;
   16.72 +	struct page *page;
   16.73  	int i, batch_target, notify;
   16.74  	RING_IDX req_prod = np->rx.req_prod_pvt;
   16.75  	struct xen_memory_reservation reservation;
   16.76  	grant_ref_t ref;
   16.77 + 	unsigned long pfn;
   16.78 + 	void *vaddr;
   16.79  
   16.80  	if (unlikely(!netif_carrier_ok(dev)))
   16.81  		return;
   16.82 @@ -591,15 +606,16 @@ static void network_alloc_rx_buffers(str
   16.83  	 */
   16.84  	batch_target = np->rx_target - (req_prod - np->rx.rsp_cons);
   16.85  	for (i = skb_queue_len(&np->rx_batch); i < batch_target; i++) {
   16.86 -		/*
   16.87 -		 * Subtract dev_alloc_skb headroom (16 bytes) and shared info
   16.88 -		 * tailroom then round down to SKB_DATA_ALIGN boundary.
   16.89 -		 */
   16.90 -		skb = __dev_alloc_skb(
   16.91 -			((PAGE_SIZE - sizeof(struct skb_shared_info)) &
   16.92 -			 (-SKB_DATA_ALIGN(1))) - 16,
   16.93 -			GFP_ATOMIC|__GFP_NOWARN);
   16.94 -		if (skb == NULL) {
   16.95 +		/* Allocate an skb and a page. */
   16.96 +		skb = __dev_alloc_skb(RX_COPY_THRESHOLD,
   16.97 +				      GFP_ATOMIC | __GFP_NOWARN);
   16.98 +		if (unlikely(!skb))
   16.99 +			goto no_skb;
  16.100 +
  16.101 +		page = alloc_page(GFP_ATOMIC | __GFP_NOWARN);
  16.102 +		if (!page) {
  16.103 +			kfree_skb(skb);
  16.104 +no_skb:
  16.105  			/* Any skbuffs queued for refill? Force them out. */
  16.106  			if (i != 0)
  16.107  				goto refill;
  16.108 @@ -608,6 +624,9 @@ static void network_alloc_rx_buffers(str
  16.109  				  jiffies + (HZ/10));
  16.110  			break;
  16.111  		}
  16.112 +
  16.113 +		skb_shinfo(skb)->frags[0].page = page;
  16.114 +		skb_shinfo(skb)->nr_frags = 1;
  16.115  		__skb_queue_tail(&np->rx_batch, skb);
  16.116  	}
  16.117  
  16.118 @@ -639,18 +658,20 @@ static void network_alloc_rx_buffers(str
  16.119  		ref = gnttab_claim_grant_reference(&np->gref_rx_head);
  16.120  		BUG_ON((signed short)ref < 0);
  16.121  		np->grant_rx_ref[id] = ref;
  16.122 +
  16.123 +		pfn = page_to_pfn(skb_shinfo(skb)->frags[0].page);
  16.124 +		vaddr = page_address(skb_shinfo(skb)->frags[0].page);
  16.125 +
  16.126  		gnttab_grant_foreign_transfer_ref(ref,
  16.127 -						  np->xbdev->otherend_id,
  16.128 -						  __pa(skb->head)>>PAGE_SHIFT);
  16.129 +						  np->xbdev->otherend_id, pfn);
  16.130  		RING_GET_REQUEST(&np->rx, req_prod + i)->gref = ref;
  16.131 -		np->rx_pfn_array[i] = virt_to_mfn(skb->head);
  16.132 +		np->rx_pfn_array[i] = pfn_to_mfn(pfn);
  16.133  
  16.134  		if (!xen_feature(XENFEAT_auto_translated_physmap)) {
  16.135  			/* Remove this page before passing back to Xen. */
  16.136 -			set_phys_to_machine(__pa(skb->head) >> PAGE_SHIFT,
  16.137 -					    INVALID_P2M_ENTRY);
  16.138 +			set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
  16.139  			MULTI_update_va_mapping(np->rx_mcl+i,
  16.140 -						(unsigned long)skb->head,
  16.141 +						(unsigned long)vaddr,
  16.142  						__pte(0), 0);
  16.143  		}
  16.144  	}
  16.145 @@ -889,19 +910,219 @@ static void xennet_move_rx_slot(struct n
  16.146  	np->rx.req_prod_pvt++;
  16.147  }
  16.148  
  16.149 +int xennet_get_extras(struct netfront_info *np,
  16.150 +		      struct netif_extra_info *extras, RING_IDX rp)
  16.151 +
  16.152 +{
  16.153 +	struct netif_extra_info *extra;
  16.154 +	RING_IDX cons = np->rx.rsp_cons;
  16.155 +	int err = 0;
  16.156 +
  16.157 +	do {
  16.158 +		struct sk_buff *skb;
  16.159 +		grant_ref_t ref;
  16.160 +
  16.161 +		if (unlikely(cons + 1 == rp)) {
  16.162 +			if (net_ratelimit())
  16.163 +				WPRINTK("Missing extra info\n");
  16.164 +			err = -EBADR;
  16.165 +			break;
  16.166 +		}
  16.167 +
  16.168 +		extra = (struct netif_extra_info *)
  16.169 +			RING_GET_RESPONSE(&np->rx, ++cons);
  16.170 +
  16.171 +		if (unlikely(!extra->type ||
  16.172 +			     extra->type >= XEN_NETIF_EXTRA_TYPE_MAX)) {
  16.173 +			if (net_ratelimit())
  16.174 +				WPRINTK("Invalid extra type: %d\n",
  16.175 +					extra->type);
  16.176 +			err = -EINVAL;
  16.177 +		} else
  16.178 +			memcpy(&extras[extra->type - 1], extra, sizeof(*extra));
  16.179 +
  16.180 +		skb = xennet_get_rx_skb(np, cons);
  16.181 +		ref = xennet_get_rx_ref(np, cons);
  16.182 +		xennet_move_rx_slot(np, skb, ref);
  16.183 +	} while (extra->flags & XEN_NETIF_EXTRA_FLAG_MORE);
  16.184 +
  16.185 +	np->rx.rsp_cons = cons;
  16.186 +	return err;
  16.187 +}
  16.188 +
  16.189 +static int xennet_get_responses(struct netfront_info *np,
  16.190 +				struct netfront_rx_info *rinfo, RING_IDX rp,
  16.191 +				struct sk_buff_head *list, int count)
  16.192 +{
  16.193 +	struct mmu_update *mmu = np->rx_mmu + count;
  16.194 +	struct multicall_entry *mcl = np->rx_mcl + count;
  16.195 +	struct netif_rx_response *rx = &rinfo->rx;
  16.196 +	struct netif_extra_info *extras = rinfo->extras;
  16.197 +	RING_IDX cons = np->rx.rsp_cons;
  16.198 +	struct sk_buff *skb = xennet_get_rx_skb(np, cons);
  16.199 +	grant_ref_t ref = xennet_get_rx_ref(np, cons);
  16.200 +	int max = MAX_SKB_FRAGS + (rx->status <= RX_COPY_THRESHOLD);
  16.201 +	int frags = 1;
  16.202 +	int err = 0;
  16.203 +
  16.204 +	if (rx->flags & NETRXF_extra_info) {
  16.205 +		err = xennet_get_extras(np, extras, rp);
  16.206 +		cons = np->rx.rsp_cons;
  16.207 +	}
  16.208 +
  16.209 +	for (;;) {
  16.210 +		unsigned long mfn;
  16.211 +
  16.212 +		if (unlikely(rx->status < 0 ||
  16.213 +			     rx->offset + rx->status > PAGE_SIZE)) {
  16.214 +			if (net_ratelimit())
  16.215 +				WPRINTK("rx->offset: %x, size: %u\n",
  16.216 +					rx->offset, rx->status);
  16.217 +			err = -EINVAL;
  16.218 +		}
  16.219 +
  16.220 +		/*
  16.221 +		 * This definitely indicates a bug, either in this driver or in
  16.222 +		 * the backend driver. In future this should flag the bad
  16.223 +		 * situation to the system controller to reboot the backed.
  16.224 +		 */
  16.225 +		if (ref == GRANT_INVALID_REF) {
  16.226 +			WPRINTK("Bad rx response id %d.\n", rx->id);
  16.227 +			err = -EINVAL;
  16.228 +			goto next;
  16.229 +		}
  16.230 +
  16.231 +		/* Memory pressure, insufficient buffer headroom, ... */
  16.232 +		if ((mfn = gnttab_end_foreign_transfer_ref(ref)) == 0) {
  16.233 +			if (net_ratelimit())
  16.234 +				WPRINTK("Unfulfilled rx req (id=%d, st=%d).\n",
  16.235 +					rx->id, rx->status);
  16.236 +			xennet_move_rx_slot(np, skb, ref);
  16.237 +			err = -ENOMEM;
  16.238 +			goto next;
  16.239 +		}
  16.240 +
  16.241 +		gnttab_release_grant_reference(&np->gref_rx_head, ref);
  16.242 +
  16.243 +		if (!xen_feature(XENFEAT_auto_translated_physmap)) {
  16.244 +			/* Remap the page. */
  16.245 +			struct page *page = skb_shinfo(skb)->frags[0].page;
  16.246 +			unsigned long pfn = page_to_pfn(page);
  16.247 +			void *vaddr = page_address(page);
  16.248 +
  16.249 +			MULTI_update_va_mapping(mcl, (unsigned long)vaddr,
  16.250 +						pfn_pte_ma(mfn, PAGE_KERNEL),
  16.251 +						0);
  16.252 +			mcl++;
  16.253 +			mmu->ptr = ((maddr_t)mfn << PAGE_SHIFT)
  16.254 +				| MMU_MACHPHYS_UPDATE;
  16.255 +			mmu->val = pfn;
  16.256 +			mmu++;
  16.257 +
  16.258 +			set_phys_to_machine(pfn, mfn);
  16.259 +		}
  16.260 +
  16.261 +		__skb_queue_tail(list, skb);
  16.262 +
  16.263 +next:
  16.264 +		if (!(rx->flags & NETRXF_more_data))
  16.265 +			break;
  16.266 +
  16.267 +		if (cons + frags == rp) {
  16.268 +			if (net_ratelimit())
  16.269 +				WPRINTK("Need more frags\n");
  16.270 +			err = -ENOENT;
  16.271 +			break;
  16.272 +		}
  16.273 +
  16.274 +		rx = RING_GET_RESPONSE(&np->rx, cons + frags);
  16.275 +		skb = xennet_get_rx_skb(np, cons + frags);
  16.276 +		ref = xennet_get_rx_ref(np, cons + frags);
  16.277 +		frags++;
  16.278 +	}
  16.279 +
  16.280 +	if (unlikely(frags > max)) {
  16.281 +		if (net_ratelimit())
  16.282 +			WPRINTK("Too many frags\n");
  16.283 +		err = -E2BIG;
  16.284 +	}
  16.285 +
  16.286 +	return err;
  16.287 +}
  16.288 +
  16.289 +static RING_IDX xennet_fill_frags(struct netfront_info *np,
  16.290 +				  struct sk_buff *skb,
  16.291 +				  struct sk_buff_head *list)
  16.292 +{
  16.293 +	struct skb_shared_info *shinfo = skb_shinfo(skb);
  16.294 +	int nr_frags = shinfo->nr_frags;
  16.295 +	RING_IDX cons = np->rx.rsp_cons;
  16.296 +	skb_frag_t *frag = shinfo->frags + nr_frags;
  16.297 +	struct sk_buff *nskb;
  16.298 +
  16.299 +	while ((nskb = __skb_dequeue(list))) {
  16.300 +		struct netif_rx_response *rx =
  16.301 +			RING_GET_RESPONSE(&np->rx, ++cons);
  16.302 +
  16.303 +		frag->page = skb_shinfo(nskb)->frags[0].page;
  16.304 +		frag->page_offset = rx->offset;
  16.305 +		frag->size = rx->status;
  16.306 +
  16.307 +		skb->data_len += rx->status;
  16.308 +
  16.309 +		skb_shinfo(nskb)->nr_frags = 0;
  16.310 +		kfree_skb(nskb);
  16.311 +
  16.312 +		frag++;
  16.313 +		nr_frags++;
  16.314 +	}
  16.315 +
  16.316 +	shinfo->nr_frags = nr_frags;
  16.317 +	return cons;
  16.318 +}
  16.319 +
  16.320 +static int xennet_set_skb_gso(struct sk_buff *skb, struct netif_extra_info *gso)
  16.321 +{
  16.322 +	if (!gso->u.gso.size) {
  16.323 +		if (net_ratelimit())
  16.324 +			WPRINTK("GSO size must not be zero.\n");
  16.325 +		return -EINVAL;
  16.326 +	}
  16.327 +
  16.328 +	/* Currently only TCPv4 S.O. is supported. */
  16.329 +	if (gso->u.gso.type != XEN_NETIF_GSO_TYPE_TCPV4) {
  16.330 +		if (net_ratelimit())
  16.331 +			WPRINTK("Bad GSO type %d.\n", gso->u.gso.type);
  16.332 +		return -EINVAL;
  16.333 +	}
  16.334 +
  16.335 +	skb_shinfo(skb)->gso_size = gso->u.gso.size;
  16.336 +	skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
  16.337 +
  16.338 +	/* Header must be checked, and gso_segs computed. */
  16.339 +	skb_shinfo(skb)->gso_type |= SKB_GSO_DODGY;
  16.340 +	skb_shinfo(skb)->gso_segs = 0;
  16.341 +
  16.342 +	return 0;
  16.343 +}
  16.344 +
  16.345  static int netif_poll(struct net_device *dev, int *pbudget)
  16.346  {
  16.347  	struct netfront_info *np = netdev_priv(dev);
  16.348 -	struct sk_buff *skb, *nskb;
  16.349 -	struct netif_rx_response *rx;
  16.350 +	struct sk_buff *skb;
  16.351 +	struct netfront_rx_info rinfo;
  16.352 +	struct netif_rx_response *rx = &rinfo.rx;
  16.353 +	struct netif_extra_info *extras = rinfo.extras;
  16.354  	RING_IDX i, rp;
  16.355 -	struct mmu_update *mmu = np->rx_mmu;
  16.356 -	struct multicall_entry *mcl = np->rx_mcl;
  16.357 +	struct multicall_entry *mcl;
  16.358  	int work_done, budget, more_to_do = 1;
  16.359  	struct sk_buff_head rxq;
  16.360 +	struct sk_buff_head errq;
  16.361 +	struct sk_buff_head tmpq;
  16.362  	unsigned long flags;
  16.363 -	unsigned long mfn;
  16.364 -	grant_ref_t ref;
  16.365 +	unsigned int len;
  16.366 +	int pages_done;
  16.367 +	int err;
  16.368  
  16.369  	spin_lock(&np->rx_lock);
  16.370  
  16.371 @@ -911,47 +1132,66 @@ static int netif_poll(struct net_device 
  16.372  	}
  16.373  
  16.374  	skb_queue_head_init(&rxq);
  16.375 +	skb_queue_head_init(&errq);
  16.376 +	skb_queue_head_init(&tmpq);
  16.377  
  16.378  	if ((budget = *pbudget) > dev->quota)
  16.379  		budget = dev->quota;
  16.380  	rp = np->rx.sring->rsp_prod;
  16.381  	rmb(); /* Ensure we see queued responses up to 'rp'. */
  16.382  
  16.383 -	for (i = np->rx.rsp_cons, work_done = 0;
  16.384 +	for (i = np->rx.rsp_cons, work_done = 0, pages_done = 0;
  16.385  	     (i != rp) && (work_done < budget);
  16.386 -	     i++, work_done++) {
  16.387 -		rx = RING_GET_RESPONSE(&np->rx, i);
  16.388 -
  16.389 -		skb = xennet_get_rx_skb(np, i);
  16.390 -		ref = xennet_get_rx_ref(np, i);
  16.391 +	     np->rx.rsp_cons = ++i, work_done++) {
  16.392 +		memcpy(rx, RING_GET_RESPONSE(&np->rx, i), sizeof(*rx));
  16.393 +		memset(extras, 0, sizeof(extras));
  16.394  
  16.395 -		/*
  16.396 -		 * This definitely indicates a bug, either in this driver or in
  16.397 -		 * the backend driver. In future this should flag the bad
  16.398 -		 * situation to the system controller to reboot the backed.
  16.399 -		 */
  16.400 -		if (ref == GRANT_INVALID_REF) {
  16.401 -			WPRINTK("Bad rx response id %d.\n", rx->id);
  16.402 +		err = xennet_get_responses(np, &rinfo, rp, &tmpq, pages_done);
  16.403 +		pages_done += skb_queue_len(&tmpq);
  16.404 +
  16.405 +		if (unlikely(err)) {
  16.406 +err:
  16.407 +			i = np->rx.rsp_cons + skb_queue_len(&tmpq) - 1;
  16.408  			work_done--;
  16.409 +			while ((skb = __skb_dequeue(&tmpq)))
  16.410 +				__skb_queue_tail(&errq, skb);
  16.411 +			np->stats.rx_errors++;
  16.412  			continue;
  16.413  		}
  16.414  
  16.415 -		/* Memory pressure, insufficient buffer headroom, ... */
  16.416 -		if ((mfn = gnttab_end_foreign_transfer_ref(ref)) == 0) {
  16.417 -			if (net_ratelimit())
  16.418 -				WPRINTK("Unfulfilled rx req (id=%d, st=%d).\n",
  16.419 -					rx->id, rx->status);
  16.420 -			xennet_move_rx_slot(np, skb, ref);
  16.421 -			work_done--;
  16.422 -			continue;
  16.423 +		skb = __skb_dequeue(&tmpq);
  16.424 +
  16.425 +		if (extras[XEN_NETIF_EXTRA_TYPE_GSO - 1].type) {
  16.426 +			struct netif_extra_info *gso;
  16.427 +			gso = &extras[XEN_NETIF_EXTRA_TYPE_GSO - 1];
  16.428 +
  16.429 +			if (unlikely(xennet_set_skb_gso(skb, gso))) {
  16.430 +				__skb_queue_head(&tmpq, skb);
  16.431 +				goto err;
  16.432 +			}
  16.433  		}
  16.434  
  16.435 -		gnttab_release_grant_reference(&np->gref_rx_head, ref);
  16.436 +		skb->nh.raw = (void *)skb_shinfo(skb)->frags[0].page;
  16.437 +		skb->h.raw = skb->nh.raw + rx->offset;
  16.438  
  16.439 -		/* NB. We handle skb overflow later. */
  16.440 -		skb->data = skb->head + rx->offset;
  16.441 -		skb->len  = rx->status;
  16.442 -		skb->tail = skb->data + skb->len;
  16.443 +		len = rx->status;
  16.444 +		if (len > RX_COPY_THRESHOLD)
  16.445 +			len = RX_COPY_THRESHOLD;
  16.446 +		skb_put(skb, len);
  16.447 +
  16.448 +		if (rx->status > len) {
  16.449 +			skb_shinfo(skb)->frags[0].page_offset =
  16.450 +				rx->offset + len;
  16.451 +			skb_shinfo(skb)->frags[0].size = rx->status - len;
  16.452 +			skb->data_len = rx->status - len;
  16.453 +		} else {
  16.454 +			skb_shinfo(skb)->frags[0].page = NULL;
  16.455 +			skb_shinfo(skb)->nr_frags = 0;
  16.456 +		}
  16.457 +
  16.458 +		i = xennet_fill_frags(np, skb, &tmpq);
  16.459 +		skb->truesize += skb->data_len;
  16.460 +		skb->len += skb->data_len;
  16.461  
  16.462  		/*
  16.463  		 * Old backends do not assert data_validated but we
  16.464 @@ -967,96 +1207,38 @@ static int netif_poll(struct net_device 
  16.465  		skb->proto_csum_blank = !!(rx->flags & NETRXF_csum_blank);
  16.466  
  16.467  		np->stats.rx_packets++;
  16.468 -		np->stats.rx_bytes += rx->status;
  16.469 -
  16.470 -		if (!xen_feature(XENFEAT_auto_translated_physmap)) {
  16.471 -			/* Remap the page. */
  16.472 -			MULTI_update_va_mapping(mcl, (unsigned long)skb->head,
  16.473 -						pfn_pte_ma(mfn, PAGE_KERNEL),
  16.474 -						0);
  16.475 -			mcl++;
  16.476 -			mmu->ptr = ((maddr_t)mfn << PAGE_SHIFT)
  16.477 -				| MMU_MACHPHYS_UPDATE;
  16.478 -			mmu->val = __pa(skb->head) >> PAGE_SHIFT;
  16.479 -			mmu++;
  16.480 -
  16.481 -			set_phys_to_machine(__pa(skb->head) >> PAGE_SHIFT,
  16.482 -					    mfn);
  16.483 -		}
  16.484 +		np->stats.rx_bytes += skb->len;
  16.485  
  16.486  		__skb_queue_tail(&rxq, skb);
  16.487  	}
  16.488  
  16.489  	/* Some pages are no longer absent... */
  16.490 -	balloon_update_driver_allowance(-work_done);
  16.491 +	balloon_update_driver_allowance(-pages_done);
  16.492  
  16.493  	/* Do all the remapping work, and M2P updates, in one big hypercall. */
  16.494 -	if (likely((mcl - np->rx_mcl) != 0)) {
  16.495 +	if (likely(pages_done)) {
  16.496 +		mcl = np->rx_mcl + pages_done;
  16.497  		mcl->op = __HYPERVISOR_mmu_update;
  16.498  		mcl->args[0] = (unsigned long)np->rx_mmu;
  16.499 -		mcl->args[1] = mmu - np->rx_mmu;
  16.500 +		mcl->args[1] = pages_done;
  16.501  		mcl->args[2] = 0;
  16.502  		mcl->args[3] = DOMID_SELF;
  16.503 -		mcl++;
  16.504 -		(void)HYPERVISOR_multicall(np->rx_mcl, mcl - np->rx_mcl);
  16.505 +		(void)HYPERVISOR_multicall(np->rx_mcl, pages_done + 1);
  16.506  	}
  16.507  
  16.508 +	while ((skb = __skb_dequeue(&errq)))
  16.509 +		kfree_skb(skb);
  16.510 +
  16.511  	while ((skb = __skb_dequeue(&rxq)) != NULL) {
  16.512 -		if (skb->len > (dev->mtu + ETH_HLEN + 4)) {
  16.513 -			if (net_ratelimit())
  16.514 -				printk(KERN_INFO "Received packet too big for "
  16.515 -				       "MTU (%d > %d)\n",
  16.516 -				       skb->len - ETH_HLEN - 4, dev->mtu);
  16.517 -			skb->len  = 0;
  16.518 -			skb->tail = skb->data;
  16.519 -			init_skb_shinfo(skb);
  16.520 -			dev_kfree_skb(skb);
  16.521 -			continue;
  16.522 -		}
  16.523 +		struct page *page = (struct page *)skb->nh.raw;
  16.524 +		void *vaddr = page_address(page);
  16.525  
  16.526 -		/*
  16.527 -		 * Enough room in skbuff for the data we were passed? Also,
  16.528 -		 * Linux expects at least 16 bytes headroom in each rx buffer.
  16.529 -		 */
  16.530 -		if (unlikely(skb->tail > skb->end) ||
  16.531 -		    unlikely((skb->data - skb->head) < 16)) {
  16.532 -			if (net_ratelimit()) {
  16.533 -				if (skb->tail > skb->end)
  16.534 -					printk(KERN_INFO "Received packet "
  16.535 -					       "is %zd bytes beyond tail.\n",
  16.536 -					       skb->tail - skb->end);
  16.537 -				else
  16.538 -					printk(KERN_INFO "Received packet "
  16.539 -					       "is %zd bytes before head.\n",
  16.540 -					       16 - (skb->data - skb->head));
  16.541 -			}
  16.542 +		memcpy(skb->data, vaddr + (skb->h.raw - skb->nh.raw),
  16.543 +		       skb_headlen(skb));
  16.544  
  16.545 -			nskb = __dev_alloc_skb(skb->len + 2,
  16.546 -					       GFP_ATOMIC|__GFP_NOWARN);
  16.547 -			if (nskb != NULL) {
  16.548 -				skb_reserve(nskb, 2);
  16.549 -				skb_put(nskb, skb->len);
  16.550 -				memcpy(nskb->data, skb->data, skb->len);
  16.551 -				/* Copy any other fields we already set up. */
  16.552 -				nskb->dev = skb->dev;
  16.553 -				nskb->ip_summed = skb->ip_summed;
  16.554 -				nskb->proto_data_valid = skb->proto_data_valid;
  16.555 -				nskb->proto_csum_blank = skb->proto_csum_blank;
  16.556 -			}
  16.557 +		if (page != skb_shinfo(skb)->frags[0].page)
  16.558 +			__free_page(page);
  16.559  
  16.560 -			/* Reinitialise and then destroy the old skbuff. */
  16.561 -			skb->len  = 0;
  16.562 -			skb->tail = skb->data;
  16.563 -			init_skb_shinfo(skb);
  16.564 -			dev_kfree_skb(skb);
  16.565 -
  16.566 -			/* Switch old for new, if we copied the buffer. */
  16.567 -			if ((skb = nskb) == NULL)
  16.568 -				continue;
  16.569 -		}
  16.570 -
  16.571 -		/* Set the shinfo area, which is hidden behind the data. */
  16.572 -		init_skb_shinfo(skb);
  16.573  		/* Ethernet work: Delayed to here as it peeks the header. */
  16.574  		skb->protocol = eth_type_trans(skb, dev);
  16.575  
  16.576 @@ -1065,8 +1247,6 @@ static int netif_poll(struct net_device 
  16.577  		dev->last_rx = jiffies;
  16.578  	}
  16.579  
  16.580 -	np->rx.rsp_cons = i;
  16.581 -
  16.582  	/* If we get a callback with very few responses, reduce fill target. */
  16.583  	/* NB. Note exponential increase, linear decrease. */
  16.584  	if (((np->rx.req_prod_pvt - np->rx.sring->rsp_prod) >
  16.585 @@ -1145,9 +1325,7 @@ static int xennet_set_tso(struct net_dev
  16.586  		if (xenbus_scanf(XBT_NIL, np->xbdev->otherend,
  16.587  				 "feature-gso-tcpv4", "%d", &val) < 0)
  16.588  			val = 0;
  16.589 -#if 0 /* KAF: After the protocol is finalised. */
  16.590  		if (!val)
  16.591 -#endif
  16.592  			return -ENOSYS;
  16.593  	}
  16.594  
  16.595 @@ -1210,7 +1388,7 @@ static void network_connect(struct net_d
  16.596  
  16.597  		gnttab_grant_foreign_transfer_ref(
  16.598  			ref, np->xbdev->otherend_id,
  16.599 -			__pa(skb->data) >> PAGE_SHIFT);
  16.600 +			page_to_pfn(skb_shinfo(skb)->frags->page));
  16.601  
  16.602  		RING_GET_REQUEST(&np->rx, requeue_idx)->gref = ref;
  16.603  		RING_GET_REQUEST(&np->rx, requeue_idx)->id   = requeue_idx;
    17.1 --- a/linux-2.6-xen-sparse/drivers/xen/pciback/pci_stub.c	Tue Aug 01 14:58:20 2006 -0600
    17.2 +++ b/linux-2.6-xen-sparse/drivers/xen/pciback/pci_stub.c	Wed Aug 02 13:39:47 2006 -0600
    17.3 @@ -232,6 +232,10 @@ static int __devinit pcistub_match_one(s
    17.4  		    && dev->bus->number == pdev_id->bus
    17.5  		    && dev->devfn == pdev_id->devfn)
    17.6  			return 1;
    17.7 +
    17.8 +		/* Sometimes topmost bridge links to itself. */
    17.9 +		if (dev == dev->bus->self)
   17.10 +			break;
   17.11  	}
   17.12  
   17.13  	return 0;
    18.1 --- a/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c	Tue Aug 01 14:58:20 2006 -0600
    18.2 +++ b/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c	Wed Aug 02 13:39:47 2006 -0600
    18.3 @@ -445,6 +445,9 @@ static struct xenbus_driver xenbus_pciba
    18.4  
    18.5  int __init pciback_xenbus_register(void)
    18.6  {
    18.7 +	if (!is_running_on_xen())
    18.8 +		return -ENODEV;
    18.9 +
   18.10  	return xenbus_register_backend(&xenbus_pciback_driver);
   18.11  }
   18.12  
    19.1 --- a/linux-2.6-xen-sparse/drivers/xen/pcifront/xenbus.c	Tue Aug 01 14:58:20 2006 -0600
    19.2 +++ b/linux-2.6-xen-sparse/drivers/xen/pcifront/xenbus.c	Wed Aug 02 13:39:47 2006 -0600
    19.3 @@ -284,11 +284,10 @@ static struct xenbus_driver xenbus_pcifr
    19.4  
    19.5  static int __init pcifront_init(void)
    19.6  {
    19.7 -	int err = 0;
    19.8 +	if (!is_running_on_xen())
    19.9 +		return -ENODEV;
   19.10  
   19.11 -	err = xenbus_register_frontend(&xenbus_pcifront_driver);
   19.12 -
   19.13 -	return err;
   19.14 +	return xenbus_register_frontend(&xenbus_pcifront_driver);
   19.15  }
   19.16  
   19.17  /* Initialize after the Xen PCI Frontend Stub is initialized */
    20.1 --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c	Tue Aug 01 14:58:20 2006 -0600
    20.2 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c	Wed Aug 02 13:39:47 2006 -0600
    20.3 @@ -58,6 +58,9 @@ struct xenbus_dev_data {
    20.4  	/* In-progress transaction. */
    20.5  	struct list_head transactions;
    20.6  
    20.7 +	/* Active watches. */
    20.8 +	struct list_head watches;
    20.9 +
   20.10  	/* Partial request. */
   20.11  	unsigned int len;
   20.12  	union {
   20.13 @@ -70,6 +73,8 @@ struct xenbus_dev_data {
   20.14  	char read_buffer[PAGE_SIZE];
   20.15  	unsigned int read_cons, read_prod;
   20.16  	wait_queue_head_t read_waitq;
   20.17 +
   20.18 +	struct mutex reply_mutex;
   20.19  };
   20.20  
   20.21  static struct proc_dir_entry *xenbus_dev_intf;
   20.22 @@ -100,14 +105,60 @@ static void queue_reply(struct xenbus_de
   20.23  {
   20.24  	int i;
   20.25  
   20.26 +	mutex_lock(&u->reply_mutex);
   20.27 +
   20.28  	for (i = 0; i < len; i++, u->read_prod++)
   20.29  		u->read_buffer[MASK_READ_IDX(u->read_prod)] = data[i];
   20.30  
   20.31  	BUG_ON((u->read_prod - u->read_cons) > sizeof(u->read_buffer));
   20.32  
   20.33 +	mutex_unlock(&u->reply_mutex);
   20.34 +
   20.35  	wake_up(&u->read_waitq);
   20.36  }
   20.37  
   20.38 +struct watch_adapter
   20.39 +{
   20.40 +	struct list_head list;
   20.41 +	struct xenbus_watch watch;
   20.42 +	struct xenbus_dev_data *dev_data;
   20.43 +	char *token;
   20.44 +};
   20.45 +
   20.46 +static void free_watch_adapter (struct watch_adapter *watch)
   20.47 +{
   20.48 +	kfree(watch->watch.node);
   20.49 +	kfree(watch->token);
   20.50 +	kfree(watch);
   20.51 +}
   20.52 +
   20.53 +static void watch_fired(struct xenbus_watch *watch,
   20.54 +			const char **vec,
   20.55 +			unsigned int len)
   20.56 +{
   20.57 +	struct watch_adapter *adap =
   20.58 +            container_of(watch, struct watch_adapter, watch);
   20.59 +	struct xsd_sockmsg hdr;
   20.60 +	const char *path, *token;
   20.61 +	int path_len, tok_len, body_len;
   20.62 +
   20.63 +	path = vec[XS_WATCH_PATH];
   20.64 +	token = adap->token;
   20.65 +
   20.66 +	path_len = strlen(path) + 1;
   20.67 +	tok_len = strlen(token) + 1;
   20.68 +	body_len = path_len + tok_len;
   20.69 +
   20.70 +	hdr.type = XS_WATCH_EVENT;
   20.71 +	hdr.len = body_len;
   20.72 +	
   20.73 +	queue_reply(adap->dev_data, (char *)&hdr, sizeof(hdr));
   20.74 +	queue_reply(adap->dev_data, (char *)path, path_len);
   20.75 +	queue_reply(adap->dev_data, (char *)token, tok_len);
   20.76 +}
   20.77 +
   20.78 +static LIST_HEAD(watch_list);
   20.79 +
   20.80  static ssize_t xenbus_dev_write(struct file *filp,
   20.81  				const char __user *ubuf,
   20.82  				size_t len, loff_t *ppos)
   20.83 @@ -116,6 +167,9 @@ static ssize_t xenbus_dev_write(struct f
   20.84  	struct xenbus_dev_transaction *trans = NULL;
   20.85  	uint32_t msg_type;
   20.86  	void *reply;
   20.87 +	char *path, *token;
   20.88 +	struct watch_adapter *watch, *tmp_watch;
   20.89 +	int err;
   20.90  
   20.91  	if ((len + u->len) > sizeof(u->u.buffer))
   20.92  		return -EINVAL;
   20.93 @@ -169,6 +223,56 @@ static ssize_t xenbus_dev_write(struct f
   20.94  		kfree(reply);
   20.95  		break;
   20.96  
   20.97 +	case XS_WATCH:
   20.98 +	case XS_UNWATCH:
   20.99 +		path = u->u.buffer + sizeof(u->u.msg);
  20.100 +		token = memchr(path, 0, u->u.msg.len);
  20.101 +		if (token == NULL)
  20.102 +			return -EILSEQ;
  20.103 +		token++;
  20.104 +
  20.105 +		if (msg_type == XS_WATCH) {
  20.106 +			static const char * XS_WATCH_RESP = "OK";
  20.107 +			struct xsd_sockmsg hdr;
  20.108 +
  20.109 +			watch = kmalloc(sizeof(*watch), GFP_KERNEL);
  20.110 +			watch->watch.node = kmalloc(strlen(path)+1,
  20.111 +                                                    GFP_KERNEL);
  20.112 +			strcpy((char *)watch->watch.node, path);
  20.113 +			watch->watch.callback = watch_fired;
  20.114 +			watch->token = kmalloc(strlen(token)+1, GFP_KERNEL);
  20.115 +			strcpy(watch->token, token);
  20.116 +			watch->dev_data = u;
  20.117 +
  20.118 +			err = register_xenbus_watch(&watch->watch);
  20.119 +			if (err) {
  20.120 +				free_watch_adapter(watch);
  20.121 +				return err;
  20.122 +			}
  20.123 +			
  20.124 +			list_add(&watch->list, &u->watches);
  20.125 +
  20.126 +			hdr.type = XS_WATCH;
  20.127 +			hdr.len = strlen(XS_WATCH_RESP) + 1;
  20.128 +			queue_reply(u, (char *)&hdr, sizeof(hdr));
  20.129 +			queue_reply(u, (char *)XS_WATCH_RESP, hdr.len);
  20.130 +		} else {
  20.131 +			list_for_each_entry_safe(watch, tmp_watch,
  20.132 +                                                 &u->watches, list) {
  20.133 +				if (!strcmp(watch->token, token) &&
  20.134 +				    !strcmp(watch->watch.node, path))
  20.135 +					break;
  20.136 +				{
  20.137 +					unregister_xenbus_watch(&watch->watch);
  20.138 +					list_del(&watch->list);
  20.139 +					free_watch_adapter(watch);
  20.140 +					break;
  20.141 +				}
  20.142 +			}
  20.143 +		}
  20.144 +
  20.145 +		break;
  20.146 +
  20.147  	default:
  20.148  		return -EINVAL;
  20.149  	}
  20.150 @@ -191,8 +295,11 @@ static int xenbus_dev_open(struct inode 
  20.151  		return -ENOMEM;
  20.152  
  20.153  	INIT_LIST_HEAD(&u->transactions);
  20.154 +	INIT_LIST_HEAD(&u->watches);
  20.155  	init_waitqueue_head(&u->read_waitq);
  20.156  
  20.157 +	mutex_init(&u->reply_mutex);
  20.158 +
  20.159  	filp->private_data = u;
  20.160  
  20.161  	return 0;
  20.162 @@ -202,6 +309,7 @@ static int xenbus_dev_release(struct ino
  20.163  {
  20.164  	struct xenbus_dev_data *u = filp->private_data;
  20.165  	struct xenbus_dev_transaction *trans, *tmp;
  20.166 +	struct watch_adapter *watch, *tmp_watch;
  20.167  
  20.168  	list_for_each_entry_safe(trans, tmp, &u->transactions, list) {
  20.169  		xenbus_transaction_end(trans->handle, 1);
  20.170 @@ -209,6 +317,12 @@ static int xenbus_dev_release(struct ino
  20.171  		kfree(trans);
  20.172  	}
  20.173  
  20.174 +	list_for_each_entry_safe(watch, tmp_watch, &u->watches, list) {
  20.175 +		unregister_xenbus_watch(&watch->watch);
  20.176 +		list_del(&watch->list);
  20.177 +		free_watch_adapter(watch);
  20.178 +	}
  20.179 +
  20.180  	kfree(u);
  20.181  
  20.182  	return 0;
    21.1 --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c	Tue Aug 01 14:58:20 2006 -0600
    21.2 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c	Wed Aug 02 13:39:47 2006 -0600
    21.3 @@ -141,7 +141,9 @@ static int read_otherend_details(struct 
    21.4  	}
    21.5  	if (strlen(xendev->otherend) == 0 ||
    21.6  	    !xenbus_exists(XBT_NIL, xendev->otherend, "")) {
    21.7 -		xenbus_dev_fatal(xendev, -ENOENT, "missing other end from %s",
    21.8 +		xenbus_dev_fatal(xendev, -ENOENT,
    21.9 +				 "unable to read other end from %s.  "
   21.10 +				 "missing or inaccessible.",
   21.11  				 xendev->nodename);
   21.12  		free_otherend_details(xendev);
   21.13  		return -ENOENT;
    22.1 --- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/mmu.h	Tue Aug 01 14:58:20 2006 -0600
    22.2 +++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/mmu.h	Wed Aug 02 13:39:47 2006 -0600
    22.3 @@ -12,6 +12,9 @@ typedef struct {
    22.4  	int size;
    22.5  	struct semaphore sem;
    22.6  	void *ldt;
    22.7 +#ifdef CONFIG_XEN
    22.8 +	int has_foreign_mappings;
    22.9 +#endif
   22.10  } mm_context_t;
   22.11  
   22.12  /* mm/memory.c:exit_mmap hook */
    23.1 --- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/mmu.h	Tue Aug 01 14:58:20 2006 -0600
    23.2 +++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/mmu.h	Wed Aug 02 13:39:47 2006 -0600
    23.3 @@ -17,6 +17,7 @@ typedef struct {
    23.4  	struct semaphore sem; 
    23.5  #ifdef CONFIG_XEN
    23.6  	unsigned pinned:1;
    23.7 +	unsigned has_foreign_mappings:1;
    23.8  	struct list_head unpinned;
    23.9  #endif
   23.10  } mm_context_t;
    24.1 --- a/tools/blktap/drivers/blktapctrl.c	Tue Aug 01 14:58:20 2006 -0600
    24.2 +++ b/tools/blktap/drivers/blktapctrl.c	Wed Aug 02 13:39:47 2006 -0600
    24.3 @@ -61,6 +61,7 @@
    24.4  #define MSG_SIZE 4096
    24.5  #define MAX_TIMEOUT 10
    24.6  #define MAX_RAND_VAL 0xFFFF
    24.7 +#define MAX_ATTEMPTS 10
    24.8  
    24.9  int run = 1;
   24.10  int max_timeout = MAX_TIMEOUT;
   24.11 @@ -626,13 +627,14 @@ int main(int argc, char *argv[])
   24.12  {
   24.13  	char *devname;
   24.14  	tapdev_info_t *ctlinfo;
   24.15 -	int tap_pfd, store_pfd, xs_fd, ret, timeout, pfd_count;
   24.16 +	int tap_pfd, store_pfd, xs_fd, ret, timeout, pfd_count, count=0;
   24.17  	struct xs_handle *h;
   24.18  	struct pollfd  pfd[NUM_POLL_FDS];
   24.19  	pid_t process;
   24.20  
   24.21  	__init_blkif();
   24.22  	openlog("BLKTAPCTRL", LOG_CONS|LOG_ODELAY, LOG_DAEMON);
   24.23 +	daemon(0,0);
   24.24  
   24.25  	print_drivers();
   24.26  	init_driver_list();
   24.27 @@ -651,18 +653,28 @@ int main(int argc, char *argv[])
   24.28  		goto open_failed;
   24.29  	}
   24.30  
   24.31 + retry:
   24.32  	/* Set up store connection and watch. */
   24.33  	h = xs_daemon_open();
   24.34  	if (h == NULL) {
   24.35  		DPRINTF("xs_daemon_open failed -- "
   24.36  			"is xenstore running?\n");
   24.37 -		goto open_failed;
   24.38 +                if (count < MAX_ATTEMPTS) {
   24.39 +                        count++;
   24.40 +                        sleep(2);
   24.41 +                        goto retry;
   24.42 +                } else goto open_failed;
   24.43  	}
   24.44  	
   24.45  	ret = add_blockdevice_probe_watch(h, "Domain-0");
   24.46  	if (ret != 0) {
   24.47 -		DPRINTF("adding device probewatch\n");
   24.48 -		goto open_failed;
   24.49 +		DPRINTF("Failed adding device probewatch\n");
   24.50 +                if (count < MAX_ATTEMPTS) {
   24.51 +                        count++;
   24.52 +                        sleep(2);
   24.53 +                        xs_daemon_close(h);
   24.54 +                        goto retry;
   24.55 +                } else goto open_failed;
   24.56  	}
   24.57  
   24.58  	ioctl(ctlfd, BLKTAP_IOCTL_SETMODE, BLKTAP_MODE_INTERPOSE );
   24.59 @@ -691,6 +703,7 @@ int main(int argc, char *argv[])
   24.60  		}
   24.61  	}
   24.62  
   24.63 +	xs_daemon_close(h);
   24.64  	ioctl(ctlfd, BLKTAP_IOCTL_SETMODE, BLKTAP_MODE_PASSTHROUGH );
   24.65  	close(ctlfd);
   24.66  	closelog();
    25.1 --- a/tools/firmware/hvmloader/hvmloader.c	Tue Aug 01 14:58:20 2006 -0600
    25.2 +++ b/tools/firmware/hvmloader/hvmloader.c	Wed Aug 02 13:39:47 2006 -0600
    25.3 @@ -31,7 +31,7 @@
    25.4  #define	ROMBIOS_PHYSICAL_ADDRESS	0x000F0000
    25.5  
    25.6  /* invoke SVM's paged realmode support */
    25.7 -#define SVM_VMMCALL_RESET_TO_REALMODE	0x00000001
    25.8 +#define SVM_VMMCALL_RESET_TO_REALMODE	0x80000001
    25.9  
   25.10  /*
   25.11   * C runtime start off
   25.12 @@ -133,15 +133,15 @@ cirrus_check(void)
   25.13  	return inb(0x3C5) == 0x12;
   25.14  }
   25.15  
   25.16 -int 
   25.17 -vmmcall(int edi, int esi, int edx, int ecx, int ebx)
   25.18 +int
   25.19 +vmmcall(int function, int edi, int esi, int edx, int ecx, int ebx)
   25.20  {
   25.21          int eax;
   25.22  
   25.23          __asm__ __volatile__(
   25.24  		".byte 0x0F,0x01,0xD9"
   25.25                  : "=a" (eax)
   25.26 -		: "a"(0x58454E00), /* XEN\0 key */
   25.27 +		: "a"(function),
   25.28  		  "b"(ebx), "c"(ecx), "d"(edx), "D"(edi), "S"(esi)
   25.29  	);
   25.30          return eax;
   25.31 @@ -200,7 +200,7 @@ main(void)
   25.32  	if (check_amd()) {
   25.33  		/* AMD implies this is SVM */
   25.34                  puts("SVM go ...\n");
   25.35 -                vmmcall(SVM_VMMCALL_RESET_TO_REALMODE, 0, 0, 0, 0);
   25.36 +                vmmcall(SVM_VMMCALL_RESET_TO_REALMODE, 0, 0, 0, 0, 0);
   25.37  	} else {
   25.38  		puts("Loading VMXAssist ...\n");
   25.39  		memcpy((void *)VMXASSIST_PHYSICAL_ADDRESS,
    26.1 --- a/tools/firmware/vmxassist/vm86.c	Tue Aug 01 14:58:20 2006 -0600
    26.2 +++ b/tools/firmware/vmxassist/vm86.c	Wed Aug 02 13:39:47 2006 -0600
    26.3 @@ -52,6 +52,31 @@ char *states[] = {
    26.4  static char *rnames[] = { "ax", "cx", "dx", "bx", "sp", "bp", "si", "di" };
    26.5  #endif /* DEBUG */
    26.6  
    26.7 +#define PT_ENTRY_PRESENT 0x1
    26.8 +
    26.9 +static unsigned
   26.10 +guest_linear_to_real(unsigned long base, unsigned off)
   26.11 +{
   26.12 +	unsigned int gcr3 = oldctx.cr3;
   26.13 +	unsigned int l1_mfn;
   26.14 +	unsigned int l0_mfn;
   26.15 +
   26.16 +	if (!(oldctx.cr0 & CR0_PG))
   26.17 +		return base + off;
   26.18 +
   26.19 +	l1_mfn = ((unsigned int *)gcr3)[(base >> 22) & 0x3ff ];
   26.20 +	if (!(l1_mfn & PT_ENTRY_PRESENT))
   26.21 +		panic("l2 entry not present\n");
   26.22 +	l1_mfn = l1_mfn & 0xfffff000 ;
   26.23 +
   26.24 +	l0_mfn = ((unsigned int *)l1_mfn)[(base >> 12) & 0x3ff];
   26.25 +	if (!(l0_mfn & PT_ENTRY_PRESENT))
   26.26 +		panic("l1 entry not present\n");
   26.27 +	l0_mfn = l0_mfn & 0xfffff000;
   26.28 +
   26.29 +	return l0_mfn + off + (base & 0xfff);
   26.30 +}
   26.31 +
   26.32  static unsigned
   26.33  address(struct regs *regs, unsigned seg, unsigned off)
   26.34  {
   26.35 @@ -70,7 +95,7 @@ address(struct regs *regs, unsigned seg,
   26.36  	    (mode == VM86_REAL_TO_PROTECTED && regs->cs == seg))
   26.37  		return ((seg & 0xFFFF) << 4) + off;
   26.38  
   26.39 -	entry = ((unsigned long long *) oldctx.gdtr_base)[seg >> 3];
   26.40 +	entry = ((unsigned long long *) guest_linear_to_real(oldctx.gdtr_base, 0))[seg >> 3];
   26.41  	entry_high = entry >> 32;
   26.42  	entry_low = entry & 0xFFFFFFFF;
   26.43  
   26.44 @@ -94,7 +119,7 @@ void
   26.45  trace(struct regs *regs, int adjust, char *fmt, ...)
   26.46  {
   26.47  	unsigned off = regs->eip - adjust;
   26.48 -        va_list ap;
   26.49 +	va_list ap;
   26.50  
   26.51  	if ((traceset & (1 << mode)) &&
   26.52  	   (mode == VM86_REAL_TO_PROTECTED || mode == VM86_REAL)) {
   26.53 @@ -755,7 +780,7 @@ load_seg(unsigned long sel, uint32_t *ba
   26.54  		return 1;
   26.55  	}
   26.56  
   26.57 -	entry =  ((unsigned long long *) oldctx.gdtr_base)[sel >> 3];
   26.58 +	entry = ((unsigned long long *) guest_linear_to_real(oldctx.gdtr_base, 0))[sel >> 3];
   26.59  
   26.60  	/* Check the P bit first */
   26.61  	if (!((entry >> (15+32)) & 0x1) && sel != 0)
    27.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    27.2 +++ b/tools/ioemu/.CVS/Entries	Wed Aug 02 13:39:47 2006 -0600
    27.3 @@ -0,0 +1,109 @@
    27.4 +D/audio////
    27.5 +D/hw////
    27.6 +D/linux-user////
    27.7 +D/pc-bios////
    27.8 +D/slirp////
    27.9 +D/target-arm////
   27.10 +D/target-i386////
   27.11 +D/target-ppc////
   27.12 +D/target-sparc////
   27.13 +D/tests////
   27.14 +D/fpu////
   27.15 +D/keymaps////
   27.16 +D/target-mips////
   27.17 +/.cvsignore/1.13/Thu May 25 18:22:25 2006//Trelease_0_8_1
   27.18 +/COPYING/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   27.19 +/COPYING.LIB/1.2/Wed May 17 14:47:01 2006//Trelease_0_8_1
   27.20 +/Changelog/1.116/Thu May 25 18:22:25 2006//Trelease_0_8_1
   27.21 +/LICENSE/1.2/Sat Feb 12 14:45:23 2005//Trelease_0_8_1
   27.22 +/Makefile/1.99/Thu May 25 18:22:25 2006//Trelease_0_8_1
   27.23 +/Makefile.target/1.107/Thu May 25 18:22:25 2006//Trelease_0_8_1
   27.24 +/README/1.12/Wed May 24 10:40:08 2006//Trelease_0_8_1
   27.25 +/README.distrib/1.2/Wed May 17 14:47:01 2006//Trelease_0_8_1
   27.26 +/TODO/1.38/Thu May 25 18:22:25 2006//Trelease_0_8_1
   27.27 +/VERSION/1.28/Thu May 25 18:22:25 2006//Trelease_0_8_1
   27.28 +/a.out.h/1.2/Wed May 24 10:40:08 2006//Trelease_0_8_1
   27.29 +/aes.c/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   27.30 +/aes.h/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   27.31 +/alpha-dis.c/1.3/Thu May 25 18:22:25 2006//Trelease_0_8_1
   27.32 +/alpha.ld/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   27.33 +/arm-dis.c/1.3/Wed May 24 10:40:08 2006//Trelease_0_8_1
   27.34 +/arm.ld/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   27.35 +/block-bochs.c/1.1/Tue Apr 26 21:34:00 2005//Trelease_0_8_1
   27.36 +/block-cloop.c/1.3/Thu May 25 18:22:25 2006//Trelease_0_8_1
   27.37 +/block-cow.c/1.5/Thu May 25 12:38:49 2006//Trelease_0_8_1
   27.38 +/block-dmg.c/1.4/Thu May 25 18:22:25 2006//Trelease_0_8_1
   27.39 +/block-qcow.c/1.6/Thu May 25 18:22:25 2006//Trelease_0_8_1
   27.40 +/block-vmdk.c/1.7/Thu May 25 18:22:25 2006//Trelease_0_8_1
   27.41 +/block-vpc.c/1.2/Thu May 25 12:38:49 2006//Trelease_0_8_1
   27.42 +/block-vvfat.c/1.5/Thu May 25 18:22:25 2006//Trelease_0_8_1
   27.43 +/block.c/1.26/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.44 +/block_int.h/1.4/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.45 +/bswap.h/1.5/Wed May 17 14:47:01 2006//Trelease_0_8_1
   27.46 +/cocoa.m/1.8/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.47 +/configure/1.100/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.48 +/console.c/1.5/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.49 +/cpu-all.h/1.54/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.50 +/cpu-defs.h/1.15/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.51 +/cpu-exec.c/1.78/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.52 +/dis-asm.h/1.11/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.53 +/disas.c/1.30/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.54 +/disas.h/1.7/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.55 +/dyngen-exec.h/1.27/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.56 +/dyngen-op.h/1.1/Mon Jan  3 23:40:55 2005//Trelease_0_8_1
   27.57 +/dyngen.c/1.42/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.58 +/dyngen.h/1.10/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.59 +/elf.h/1.6/Thu May 25 12:38:50 2006//Trelease_0_8_1
   27.60 +/elf_ops.h/1.3/Tue May  2 20:54:12 2006//Trelease_0_8_1
   27.61 +/exec-all.h/1.47/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.62 +/exec.c/1.79/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.63 +/gdbstub.c/1.36/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.64 +/gdbstub.h/1.2/Tue Apr 26 20:42:36 2005//Trelease_0_8_1
   27.65 +/i386-dis.c/1.5/Wed May 17 14:47:01 2006//Trelease_0_8_1
   27.66 +/i386-vl.ld/1.3/Wed May 17 14:47:01 2006//Trelease_0_8_1
   27.67 +/i386.ld/1.2/Wed May 17 14:47:01 2006//Trelease_0_8_1
   27.68 +/ia64.ld/1.1/Thu Apr  7 22:20:28 2005//Trelease_0_8_1
   27.69 +/keymaps.c/1.2/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.70 +/kqemu.c/1.10/Thu May 25 18:22:26 2006//Trelease_0_8_1
   27.71 +/kqemu.h/1.1/Wed Feb  8 22:39:17 2006//Trelease_0_8_1
   27.72 +/linux-2.6.9-qemu-fast.patch/1.1/Wed Dec  8 23:48:11 2004//Trelease_0_8_1
   27.73 +/loader.c/1.2/Wed Apr 26 22:05:26 2006//Trelease_0_8_1
   27.74 +/m68k-dis.c/1.1/Sun Nov  6 16:52:11 2005//Trelease_0_8_1
   27.75 +/m68k.ld/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   27.76 +/mips-dis.c/1.3/Thu May 25 18:22:28 2006//Trelease_0_8_1
   27.77 +/monitor.c/1.48/Thu May 25 18:22:28 2006//Trelease_0_8_1
   27.78 +/osdep.c/1.10/Wed May 24 10:40:10 2006//Trelease_0_8_1
   27.79 +/osdep.h/1.5/Wed May 24 10:40:10 2006//Trelease_0_8_1
   27.80 +/ppc-dis.c/1.7/Thu May 25 12:38:51 2006//Trelease_0_8_1
   27.81 +/ppc.ld/1.2/Thu May 25 12:38:51 2006//Trelease_0_8_1
   27.82 +/qemu-binfmt-conf.sh/1.4/Thu May 25 18:22:28 2006//Trelease_0_8_1
   27.83 +/qemu-doc.texi/1.87/Thu May 25 18:22:29 2006//Trelease_0_8_1
   27.84 +/qemu-img.c/1.8/Thu May 25 12:38:51 2006//Trelease_0_8_1
   27.85 +/qemu-img.texi/1.2/Thu May 25 12:38:51 2006//Trelease_0_8_1
   27.86 +/qemu-tech.texi/1.9/Thu May 25 18:22:29 2006//Trelease_0_8_1
   27.87 +/qemu_socket.h/1.1/Sun Apr 30 22:53:25 2006//Trelease_0_8_1
   27.88 +/readline.c/1.1/Tue May 23 19:16:56 2006//Trelease_0_8_1
   27.89 +/s390.ld/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   27.90 +/sdl.c/1.26/Thu May 25 18:22:29 2006//Trelease_0_8_1
   27.91 +/sdl_keysym.h/1.3/Tue Mar  1 21:43:41 2005//Trelease_0_8_1
   27.92 +/sh4-dis.c/1.1/Thu Apr 27 21:05:14 2006//Trelease_0_8_1
   27.93 +/softmmu_exec.h/1.1/Sun Oct 30 18:16:26 2005//Trelease_0_8_1
   27.94 +/softmmu_header.h/1.13/Thu May 25 18:22:29 2006//Trelease_0_8_1
   27.95 +/softmmu_template.h/1.16/Thu May 25 18:22:29 2006//Trelease_0_8_1
   27.96 +/sparc-dis.c/1.2/Thu May 25 18:22:29 2006//Trelease_0_8_1
   27.97 +/sparc.ld/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   27.98 +/tap-win32.c/1.2/Sun Feb 19 12:40:00 2006//Trelease_0_8_1
   27.99 +/texi2pod.pl/1.1/Wed May 17 14:47:02 2006//Trelease_0_8_1
  27.100 +/thunk.c/1.6/Wed May 24 10:40:10 2006//Trelease_0_8_1
  27.101 +/thunk.h/1.13/Wed May 17 14:47:02 2006//Trelease_0_8_1
  27.102 +/translate-all.c/1.14/Thu May 25 18:22:29 2006//Trelease_0_8_1
  27.103 +/translate-op.c/1.1/Sun Mar 13 16:53:06 2005//Trelease_0_8_1
  27.104 +/usb-linux.c/1.4/Sat Mar 11 18:03:38 2006//Trelease_0_8_1
  27.105 +/vgafont.h/1.1/Wed May 17 14:47:02 2006//Trelease_0_8_1
  27.106 +/vl.c/1.184/Thu May 25 18:22:30 2006//Trelease_0_8_1
  27.107 +/vl.h/1.116/Thu May 25 18:22:30 2006//Trelease_0_8_1
  27.108 +/vnc.c/1.4/Mon May  1 21:44:22 2006//Trelease_0_8_1
  27.109 +/vnc_keysym.h/1.1/Sun Apr 30 21:28:36 2006//Trelease_0_8_1
  27.110 +/vnchextile.h/1.1/Sun Apr 30 21:28:36 2006//Trelease_0_8_1
  27.111 +/x86_64.ld/1.1/Thu Jan  6 20:50:00 2005//Trelease_0_8_1
  27.112 +D/target-sh4////
    28.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    28.2 +++ b/tools/ioemu/.CVS/Repository	Wed Aug 02 13:39:47 2006 -0600
    28.3 @@ -0,0 +1,1 @@
    28.4 +qemu
    29.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    29.2 +++ b/tools/ioemu/.CVS/Root	Wed Aug 02 13:39:47 2006 -0600
    29.3 @@ -0,0 +1,1 @@
    29.4 +:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    30.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    30.2 +++ b/tools/ioemu/.CVS/Tag	Wed Aug 02 13:39:47 2006 -0600
    30.3 @@ -0,0 +1,1 @@
    30.4 +Nrelease_0_8_1
    31.1 --- a/tools/ioemu/CVS/Entries	Tue Aug 01 14:58:20 2006 -0600
    31.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    31.3 @@ -1,109 +0,0 @@
    31.4 -D/audio////
    31.5 -D/hw////
    31.6 -D/linux-user////
    31.7 -D/pc-bios////
    31.8 -D/slirp////
    31.9 -D/target-arm////
   31.10 -D/target-i386////
   31.11 -D/target-ppc////
   31.12 -D/target-sparc////
   31.13 -D/tests////
   31.14 -D/fpu////
   31.15 -D/keymaps////
   31.16 -D/target-mips////
   31.17 -/.cvsignore/1.13/Thu May 25 18:22:25 2006//Trelease_0_8_1
   31.18 -/COPYING/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   31.19 -/COPYING.LIB/1.2/Wed May 17 14:47:01 2006//Trelease_0_8_1
   31.20 -/Changelog/1.116/Thu May 25 18:22:25 2006//Trelease_0_8_1
   31.21 -/LICENSE/1.2/Sat Feb 12 14:45:23 2005//Trelease_0_8_1
   31.22 -/Makefile/1.99/Thu May 25 18:22:25 2006//Trelease_0_8_1
   31.23 -/Makefile.target/1.107/Thu May 25 18:22:25 2006//Trelease_0_8_1
   31.24 -/README/1.12/Wed May 24 10:40:08 2006//Trelease_0_8_1
   31.25 -/README.distrib/1.2/Wed May 17 14:47:01 2006//Trelease_0_8_1
   31.26 -/TODO/1.38/Thu May 25 18:22:25 2006//Trelease_0_8_1
   31.27 -/VERSION/1.28/Thu May 25 18:22:25 2006//Trelease_0_8_1
   31.28 -/a.out.h/1.2/Wed May 24 10:40:08 2006//Trelease_0_8_1
   31.29 -/aes.c/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   31.30 -/aes.h/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   31.31 -/alpha-dis.c/1.3/Thu May 25 18:22:25 2006//Trelease_0_8_1
   31.32 -/alpha.ld/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   31.33 -/arm-dis.c/1.3/Wed May 24 10:40:08 2006//Trelease_0_8_1
   31.34 -/arm.ld/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   31.35 -/block-bochs.c/1.1/Tue Apr 26 21:34:00 2005//Trelease_0_8_1
   31.36 -/block-cloop.c/1.3/Thu May 25 18:22:25 2006//Trelease_0_8_1
   31.37 -/block-cow.c/1.5/Thu May 25 12:38:49 2006//Trelease_0_8_1
   31.38 -/block-dmg.c/1.4/Thu May 25 18:22:25 2006//Trelease_0_8_1
   31.39 -/block-qcow.c/1.6/Thu May 25 18:22:25 2006//Trelease_0_8_1
   31.40 -/block-vmdk.c/1.7/Thu May 25 18:22:25 2006//Trelease_0_8_1
   31.41 -/block-vpc.c/1.2/Thu May 25 12:38:49 2006//Trelease_0_8_1
   31.42 -/block-vvfat.c/1.5/Thu May 25 18:22:25 2006//Trelease_0_8_1
   31.43 -/block.c/1.26/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.44 -/block_int.h/1.4/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.45 -/bswap.h/1.5/Wed May 17 14:47:01 2006//Trelease_0_8_1
   31.46 -/cocoa.m/1.8/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.47 -/configure/1.100/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.48 -/console.c/1.5/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.49 -/cpu-all.h/1.54/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.50 -/cpu-defs.h/1.15/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.51 -/cpu-exec.c/1.78/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.52 -/dis-asm.h/1.11/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.53 -/disas.c/1.30/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.54 -/disas.h/1.7/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.55 -/dyngen-exec.h/1.27/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.56 -/dyngen-op.h/1.1/Mon Jan  3 23:40:55 2005//Trelease_0_8_1
   31.57 -/dyngen.c/1.42/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.58 -/dyngen.h/1.10/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.59 -/elf.h/1.6/Thu May 25 12:38:50 2006//Trelease_0_8_1
   31.60 -/elf_ops.h/1.3/Tue May  2 20:54:12 2006//Trelease_0_8_1
   31.61 -/exec-all.h/1.47/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.62 -/exec.c/1.79/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.63 -/gdbstub.c/1.36/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.64 -/gdbstub.h/1.2/Tue Apr 26 20:42:36 2005//Trelease_0_8_1
   31.65 -/i386-dis.c/1.5/Wed May 17 14:47:01 2006//Trelease_0_8_1
   31.66 -/i386-vl.ld/1.3/Wed May 17 14:47:01 2006//Trelease_0_8_1
   31.67 -/i386.ld/1.2/Wed May 17 14:47:01 2006//Trelease_0_8_1
   31.68 -/ia64.ld/1.1/Thu Apr  7 22:20:28 2005//Trelease_0_8_1
   31.69 -/keymaps.c/1.2/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.70 -/kqemu.c/1.10/Thu May 25 18:22:26 2006//Trelease_0_8_1
   31.71 -/kqemu.h/1.1/Wed Feb  8 22:39:17 2006//Trelease_0_8_1
   31.72 -/linux-2.6.9-qemu-fast.patch/1.1/Wed Dec  8 23:48:11 2004//Trelease_0_8_1
   31.73 -/loader.c/1.2/Wed Apr 26 22:05:26 2006//Trelease_0_8_1
   31.74 -/m68k-dis.c/1.1/Sun Nov  6 16:52:11 2005//Trelease_0_8_1
   31.75 -/m68k.ld/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   31.76 -/mips-dis.c/1.3/Thu May 25 18:22:28 2006//Trelease_0_8_1
   31.77 -/monitor.c/1.48/Thu May 25 18:22:28 2006//Trelease_0_8_1
   31.78 -/osdep.c/1.10/Wed May 24 10:40:10 2006//Trelease_0_8_1
   31.79 -/osdep.h/1.5/Wed May 24 10:40:10 2006//Trelease_0_8_1
   31.80 -/ppc-dis.c/1.7/Thu May 25 12:38:51 2006//Trelease_0_8_1
   31.81 -/ppc.ld/1.2/Thu May 25 12:38:51 2006//Trelease_0_8_1
   31.82 -/qemu-binfmt-conf.sh/1.4/Thu May 25 18:22:28 2006//Trelease_0_8_1
   31.83 -/qemu-doc.texi/1.87/Thu May 25 18:22:29 2006//Trelease_0_8_1
   31.84 -/qemu-img.c/1.8/Thu May 25 12:38:51 2006//Trelease_0_8_1
   31.85 -/qemu-img.texi/1.2/Thu May 25 12:38:51 2006//Trelease_0_8_1
   31.86 -/qemu-tech.texi/1.9/Thu May 25 18:22:29 2006//Trelease_0_8_1
   31.87 -/qemu_socket.h/1.1/Sun Apr 30 22:53:25 2006//Trelease_0_8_1
   31.88 -/readline.c/1.1/Tue May 23 19:16:56 2006//Trelease_0_8_1
   31.89 -/s390.ld/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   31.90 -/sdl.c/1.26/Thu May 25 18:22:29 2006//Trelease_0_8_1
   31.91 -/sdl_keysym.h/1.3/Tue Mar  1 21:43:41 2005//Trelease_0_8_1
   31.92 -/sh4-dis.c/1.1/Thu Apr 27 21:05:14 2006//Trelease_0_8_1
   31.93 -/softmmu_exec.h/1.1/Sun Oct 30 18:16:26 2005//Trelease_0_8_1
   31.94 -/softmmu_header.h/1.13/Thu May 25 18:22:29 2006//Trelease_0_8_1
   31.95 -/softmmu_template.h/1.16/Thu May 25 18:22:29 2006//Trelease_0_8_1
   31.96 -/sparc-dis.c/1.2/Thu May 25 18:22:29 2006//Trelease_0_8_1
   31.97 -/sparc.ld/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   31.98 -/tap-win32.c/1.2/Sun Feb 19 12:40:00 2006//Trelease_0_8_1
   31.99 -/texi2pod.pl/1.1/Wed May 17 14:47:02 2006//Trelease_0_8_1
  31.100 -/thunk.c/1.6/Wed May 24 10:40:10 2006//Trelease_0_8_1
  31.101 -/thunk.h/1.13/Wed May 17 14:47:02 2006//Trelease_0_8_1
  31.102 -/translate-all.c/1.14/Thu May 25 18:22:29 2006//Trelease_0_8_1
  31.103 -/translate-op.c/1.1/Sun Mar 13 16:53:06 2005//Trelease_0_8_1
  31.104 -/usb-linux.c/1.4/Sat Mar 11 18:03:38 2006//Trelease_0_8_1
  31.105 -/vgafont.h/1.1/Wed May 17 14:47:02 2006//Trelease_0_8_1
  31.106 -/vl.c/1.184/Thu May 25 18:22:30 2006//Trelease_0_8_1
  31.107 -/vl.h/1.116/Thu May 25 18:22:30 2006//Trelease_0_8_1
  31.108 -/vnc.c/1.4/Mon May  1 21:44:22 2006//Trelease_0_8_1
  31.109 -/vnc_keysym.h/1.1/Sun Apr 30 21:28:36 2006//Trelease_0_8_1
  31.110 -/vnchextile.h/1.1/Sun Apr 30 21:28:36 2006//Trelease_0_8_1
  31.111 -/x86_64.ld/1.1/Thu Jan  6 20:50:00 2005//Trelease_0_8_1
  31.112 -D/target-sh4////
    32.1 --- a/tools/ioemu/CVS/Repository	Tue Aug 01 14:58:20 2006 -0600
    32.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    32.3 @@ -1,1 +0,0 @@
    32.4 -qemu
    33.1 --- a/tools/ioemu/CVS/Root	Tue Aug 01 14:58:20 2006 -0600
    33.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    33.3 @@ -1,1 +0,0 @@
    33.4 -:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    34.1 --- a/tools/ioemu/CVS/Tag	Tue Aug 01 14:58:20 2006 -0600
    34.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    34.3 @@ -1,1 +0,0 @@
    34.4 -Nrelease_0_8_1
    35.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    35.2 +++ b/tools/ioemu/audio/.CVS/Entries	Wed Aug 02 13:39:47 2006 -0600
    35.3 @@ -0,0 +1,19 @@
    35.4 +/alsaaudio.c/1.5/Sun Nov 20 18:53:05 2005//Trelease_0_8_1
    35.5 +/audio.c/1.9/Thu May 25 18:22:31 2006//Trelease_0_8_1
    35.6 +/audio.h/1.5/Thu May 25 18:22:31 2006//Trelease_0_8_1
    35.7 +/audio_int.h/1.7/Thu May 25 18:22:31 2006//Trelease_0_8_1
    35.8 +/audio_template.h/1.4/Sun Nov 20 16:24:34 2005//Trelease_0_8_1
    35.9 +/coreaudio.c/1.5/Sun Nov 20 18:53:42 2005//Trelease_0_8_1
   35.10 +/dsound_template.h/1.2/Sat Nov  5 18:55:27 2005//Trelease_0_8_1
   35.11 +/dsoundaudio.c/1.2/Sat Nov  5 18:55:27 2005//Trelease_0_8_1
   35.12 +/fmodaudio.c/1.5/Thu May 25 18:22:32 2006//Trelease_0_8_1
   35.13 +/mixeng.c/1.4/Thu May 25 18:22:32 2006//Trelease_0_8_1
   35.14 +/mixeng.h/1.2/Thu May 25 18:22:32 2006//Trelease_0_8_1
   35.15 +/mixeng_template.h/1.2/Thu May 25 18:22:32 2006//Trelease_0_8_1
   35.16 +/noaudio.c/1.4/Thu May 25 18:22:32 2006//Trelease_0_8_1
   35.17 +/ossaudio.c/1.9/Thu May 25 18:22:32 2006//Trelease_0_8_1
   35.18 +/rate_template.h/1.2/Sat Nov  5 18:55:27 2005//Trelease_0_8_1
   35.19 +/sdlaudio.c/1.6/Thu May 25 18:22:32 2006//Trelease_0_8_1
   35.20 +/sys-queue.h/1.1/Sun Oct 30 18:58:22 2005//Trelease_0_8_1
   35.21 +/wavaudio.c/1.6/Thu May 25 18:22:32 2006//Trelease_0_8_1
   35.22 +D
    36.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    36.2 +++ b/tools/ioemu/audio/.CVS/Repository	Wed Aug 02 13:39:47 2006 -0600
    36.3 @@ -0,0 +1,1 @@
    36.4 +qemu/audio
    37.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    37.2 +++ b/tools/ioemu/audio/.CVS/Root	Wed Aug 02 13:39:47 2006 -0600
    37.3 @@ -0,0 +1,1 @@
    37.4 +:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    38.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    38.2 +++ b/tools/ioemu/audio/.CVS/Tag	Wed Aug 02 13:39:47 2006 -0600
    38.3 @@ -0,0 +1,1 @@
    38.4 +Nrelease_0_8_1
    39.1 --- a/tools/ioemu/audio/CVS/Entries	Tue Aug 01 14:58:20 2006 -0600
    39.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    39.3 @@ -1,19 +0,0 @@
    39.4 -/alsaaudio.c/1.5/Sun Nov 20 18:53:05 2005//Trelease_0_8_1
    39.5 -/audio.c/1.9/Thu May 25 18:22:31 2006//Trelease_0_8_1
    39.6 -/audio.h/1.5/Thu May 25 18:22:31 2006//Trelease_0_8_1
    39.7 -/audio_int.h/1.7/Thu May 25 18:22:31 2006//Trelease_0_8_1
    39.8 -/audio_template.h/1.4/Sun Nov 20 16:24:34 2005//Trelease_0_8_1
    39.9 -/coreaudio.c/1.5/Sun Nov 20 18:53:42 2005//Trelease_0_8_1
   39.10 -/dsound_template.h/1.2/Sat Nov  5 18:55:27 2005//Trelease_0_8_1
   39.11 -/dsoundaudio.c/1.2/Sat Nov  5 18:55:27 2005//Trelease_0_8_1
   39.12 -/fmodaudio.c/1.5/Thu May 25 18:22:32 2006//Trelease_0_8_1
   39.13 -/mixeng.c/1.4/Thu May 25 18:22:32 2006//Trelease_0_8_1
   39.14 -/mixeng.h/1.2/Thu May 25 18:22:32 2006//Trelease_0_8_1
   39.15 -/mixeng_template.h/1.2/Thu May 25 18:22:32 2006//Trelease_0_8_1
   39.16 -/noaudio.c/1.4/Thu May 25 18:22:32 2006//Trelease_0_8_1
   39.17 -/ossaudio.c/1.9/Thu May 25 18:22:32 2006//Trelease_0_8_1
   39.18 -/rate_template.h/1.2/Sat Nov  5 18:55:27 2005//Trelease_0_8_1
   39.19 -/sdlaudio.c/1.6/Thu May 25 18:22:32 2006//Trelease_0_8_1
   39.20 -/sys-queue.h/1.1/Sun Oct 30 18:58:22 2005//Trelease_0_8_1
   39.21 -/wavaudio.c/1.6/Thu May 25 18:22:32 2006//Trelease_0_8_1
   39.22 -D
    40.1 --- a/tools/ioemu/audio/CVS/Repository	Tue Aug 01 14:58:20 2006 -0600
    40.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    40.3 @@ -1,1 +0,0 @@
    40.4 -qemu/audio
    41.1 --- a/tools/ioemu/audio/CVS/Root	Tue Aug 01 14:58:20 2006 -0600
    41.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    41.3 @@ -1,1 +0,0 @@
    41.4 -:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    42.1 --- a/tools/ioemu/audio/CVS/Tag	Tue Aug 01 14:58:20 2006 -0600
    42.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    42.3 @@ -1,1 +0,0 @@
    42.4 -Nrelease_0_8_1
    43.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    43.2 +++ b/tools/ioemu/fpu/.CVS/Entries	Wed Aug 02 13:39:47 2006 -0600
    43.3 @@ -0,0 +1,7 @@
    43.4 +/softfloat-macros.h/1.1/Sun Mar 13 16:54:06 2005//Trelease_0_8_1
    43.5 +/softfloat-native.c/1.3/Thu May 25 18:22:32 2006//Trelease_0_8_1
    43.6 +/softfloat-native.h/1.6/Thu May 25 18:22:32 2006//Trelease_0_8_1
    43.7 +/softfloat-specialize.h/1.1/Sun Mar 13 16:54:06 2005//Trelease_0_8_1
    43.8 +/softfloat.c/1.2/Sun Mar 13 18:52:28 2005//Trelease_0_8_1
    43.9 +/softfloat.h/1.3/Thu May 25 18:22:32 2006//Trelease_0_8_1
   43.10 +D
    44.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    44.2 +++ b/tools/ioemu/fpu/.CVS/Repository	Wed Aug 02 13:39:47 2006 -0600
    44.3 @@ -0,0 +1,1 @@
    44.4 +qemu/fpu
    45.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    45.2 +++ b/tools/ioemu/fpu/.CVS/Root	Wed Aug 02 13:39:47 2006 -0600
    45.3 @@ -0,0 +1,1 @@
    45.4 +:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    46.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    46.2 +++ b/tools/ioemu/fpu/.CVS/Tag	Wed Aug 02 13:39:47 2006 -0600
    46.3 @@ -0,0 +1,1 @@
    46.4 +Nrelease_0_8_1
    47.1 --- a/tools/ioemu/fpu/CVS/Entries	Tue Aug 01 14:58:20 2006 -0600
    47.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    47.3 @@ -1,7 +0,0 @@
    47.4 -/softfloat-macros.h/1.1/Sun Mar 13 16:54:06 2005//Trelease_0_8_1
    47.5 -/softfloat-native.c/1.3/Thu May 25 18:22:32 2006//Trelease_0_8_1
    47.6 -/softfloat-native.h/1.6/Thu May 25 18:22:32 2006//Trelease_0_8_1
    47.7 -/softfloat-specialize.h/1.1/Sun Mar 13 16:54:06 2005//Trelease_0_8_1
    47.8 -/softfloat.c/1.2/Sun Mar 13 18:52:28 2005//Trelease_0_8_1
    47.9 -/softfloat.h/1.3/Thu May 25 18:22:32 2006//Trelease_0_8_1
   47.10 -D
    48.1 --- a/tools/ioemu/fpu/CVS/Repository	Tue Aug 01 14:58:20 2006 -0600
    48.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    48.3 @@ -1,1 +0,0 @@
    48.4 -qemu/fpu
    49.1 --- a/tools/ioemu/fpu/CVS/Root	Tue Aug 01 14:58:20 2006 -0600
    49.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    49.3 @@ -1,1 +0,0 @@
    49.4 -:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    50.1 --- a/tools/ioemu/fpu/CVS/Tag	Tue Aug 01 14:58:20 2006 -0600
    50.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    50.3 @@ -1,1 +0,0 @@
    50.4 -Nrelease_0_8_1
    51.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    51.2 +++ b/tools/ioemu/hw/.CVS/Entries	Wed Aug 02 13:39:47 2006 -0600
    51.3 @@ -0,0 +1,72 @@
    51.4 +/adb.c/1.6/Thu May 25 18:22:32 2006//Trelease_0_8_1
    51.5 +/adlib.c/1.5/Thu May 25 18:22:32 2006//Trelease_0_8_1
    51.6 +/apic.c/1.8/Thu May 25 18:22:32 2006//Trelease_0_8_1
    51.7 +/arm_boot.c/1.1/Thu Apr 27 23:15:07 2006//Trelease_0_8_1
    51.8 +/arm_pic.c/1.1/Sun Apr  9 01:32:52 2006//Trelease_0_8_1
    51.9 +/arm_pic.h/1.1/Sun Apr  9 01:32:52 2006//Trelease_0_8_1
   51.10 +/arm_timer.c/1.1/Sun Apr  9 01:32:52 2006//Trelease_0_8_1
   51.11 +/cirrus_vga.c/1.21/Thu May 25 18:22:32 2006//Trelease_0_8_1
   51.12 +/cirrus_vga_rop.h/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   51.13 +/cirrus_vga_rop2.h/1.7/Thu May 25 12:52:49 2006//Trelease_0_8_1
   51.14 +/cuda.c/1.10/Thu May 25 12:38:51 2006//Trelease_0_8_1
   51.15 +/dma.c/1.14/Thu May 25 18:22:32 2006//Trelease_0_8_1
   51.16 +/es1370.c/1.4/Sun Nov 20 16:20:39 2005//Trelease_0_8_1
   51.17 +/esp.c/1.6/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.18 +/fdc.c/1.18/Wed May 24 10:40:13 2006//Trelease_0_8_1
   51.19 +/fmopl.c/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   51.20 +/fmopl.h/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   51.21 +/heathrow_pic.c/1.2/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.22 +/i8254.c/1.8/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.23 +/i8259.c/1.18/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.24 +/ide.c/1.42/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.25 +/integratorcp.c/1.9/Thu Apr 27 23:15:07 2006//Trelease_0_8_1
   51.26 +/iommu.c/1.6/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.27 +/lance.c/1.7/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.28 +/m48t59.c/1.7/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.29 +/m48t59.h/1.5/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.30 +/mc146818rtc.c/1.6/Wed May 17 14:47:01 2006//Trelease_0_8_1
   51.31 +/mips_r4k.c/1.16/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.32 +/ne2000.c/1.19/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.33 +/openpic.c/1.9/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.34 +/parallel.c/1.4/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.35 +/pc.c/1.53/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.36 +/pci.c/1.24/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.37 +/pckbd.c/1.15/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.38 +/pcspk.c/1.1/Mon Apr 24 21:58:30 2006//Trelease_0_8_1
   51.39 +/pl011.c/1.1/Sun Apr  9 01:32:52 2006//Trelease_0_8_1
   51.40 +/pl050.c/1.1/Sun Apr  9 01:32:52 2006//Trelease_0_8_1
   51.41 +/pl080.c/1.1/Sun Apr  9 01:32:52 2006//Trelease_0_8_1
   51.42 +/pl110.c/1.6/Tue Apr 18 19:02:59 2006//Trelease_0_8_1
   51.43 +/pl110_template.h/1.2/Sun Feb 19 12:31:32 2006//Trelease_0_8_1
   51.44 +/pl190.c/1.1/Sun Apr  9 01:32:52 2006//Trelease_0_8_1
   51.45 +/ppc.c/1.9/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.46 +/ppc_chrp.c/1.21/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.47 +/ppc_prep.c/1.26/Thu May 25 18:22:33 2006//Trelease_0_8_1
   51.48 +/ps2.c/1.4/Wed Apr 12 21:09:07 2006//Trelease_0_8_1
   51.49 +/rtl8139.c/1.1/Sun Feb  5 04:14:41 2006//Trelease_0_8_1
   51.50 +/sb16.c/1.19/Thu May 25 18:22:34 2006//Trelease_0_8_1
   51.51 +/serial.c/1.12/Thu May 25 18:22:34 2006//Trelease_0_8_1
   51.52 +/sh7750.c/1.1/Thu Apr 27 21:32:09 2006//Trelease_0_8_1
   51.53 +/sh7750_regnames.c/1.1/Thu Apr 27 21:32:09 2006//Trelease_0_8_1
   51.54 +/sh7750_regnames.h/1.1/Thu Apr 27 21:32:09 2006//Trelease_0_8_1
   51.55 +/sh7750_regs.h/1.1/Thu Apr 27 21:32:09 2006//Trelease_0_8_1
   51.56 +/shix.c/1.1/Thu Apr 27 21:32:09 2006//Trelease_0_8_1
   51.57 +/slavio_intctl.c/1.6/Thu May 25 18:22:35 2006//Trelease_0_8_1
   51.58 +/slavio_misc.c/1.3/Thu May 25 18:22:35 2006//Trelease_0_8_1
   51.59 +/slavio_serial.c/1.6/Thu May 25 18:22:35 2006//Trelease_0_8_1
   51.60 +/slavio_timer.c/1.3/Thu May 25 18:22:35 2006//Trelease_0_8_1
   51.61 +/smc91c111.c/1.3/Sat Feb  4 22:15:28 2006//Trelease_0_8_1
   51.62 +/sun4m.c/1.16/Thu May 25 18:22:35 2006//Trelease_0_8_1
   51.63 +/sun4u.c/1.8/Thu May 25 18:22:35 2006//Trelease_0_8_1
   51.64 +/tc58128.c/1.1/Thu Apr 27 21:32:09 2006//Trelease_0_8_1
   51.65 +/tcx.c/1.7/Thu May 25 18:22:35 2006//Trelease_0_8_1
   51.66 +/usb-hid.c/1.2/Wed Apr 12 21:09:07 2006//Trelease_0_8_1
   51.67 +/usb-hub.c/1.3/Sun Apr 30 21:53:59 2006//Trelease_0_8_1
   51.68 +/usb-uhci.c/1.8/Tue Apr 25 21:01:19 2006//Trelease_0_8_1
   51.69 +/usb.c/1.6/Mon Apr 24 21:18:20 2006//Trelease_0_8_1
   51.70 +/usb.h/1.4/Wed Apr 12 21:09:07 2006//Trelease_0_8_1
   51.71 +/versatilepb.c/1.2/Thu Apr 27 23:15:07 2006//Trelease_0_8_1
   51.72 +/vga.c/1.42/Thu May 25 18:22:36 2006//Trelease_0_8_1
   51.73 +/vga_int.h/1.6/Thu May 25 18:20:53 2006//Trelease_0_8_1
   51.74 +/vga_template.h/1.11/Wed May 17 14:47:01 2006//Trelease_0_8_1
   51.75 +D
    52.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    52.2 +++ b/tools/ioemu/hw/.CVS/Repository	Wed Aug 02 13:39:47 2006 -0600
    52.3 @@ -0,0 +1,1 @@
    52.4 +qemu/hw
    53.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    53.2 +++ b/tools/ioemu/hw/.CVS/Root	Wed Aug 02 13:39:47 2006 -0600
    53.3 @@ -0,0 +1,1 @@
    53.4 +:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    54.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    54.2 +++ b/tools/ioemu/hw/.CVS/Tag	Wed Aug 02 13:39:47 2006 -0600
    54.3 @@ -0,0 +1,1 @@
    54.4 +Nrelease_0_8_1
    55.1 --- a/tools/ioemu/hw/CVS/Entries	Tue Aug 01 14:58:20 2006 -0600
    55.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    55.3 @@ -1,72 +0,0 @@
    55.4 -/adb.c/1.6/Thu May 25 18:22:32 2006//Trelease_0_8_1
    55.5 -/adlib.c/1.5/Thu May 25 18:22:32 2006//Trelease_0_8_1
    55.6 -/apic.c/1.8/Thu May 25 18:22:32 2006//Trelease_0_8_1
    55.7 -/arm_boot.c/1.1/Thu Apr 27 23:15:07 2006//Trelease_0_8_1
    55.8 -/arm_pic.c/1.1/Sun Apr  9 01:32:52 2006//Trelease_0_8_1
    55.9 -/arm_pic.h/1.1/Sun Apr  9 01:32:52 2006//Trelease_0_8_1
   55.10 -/arm_timer.c/1.1/Sun Apr  9 01:32:52 2006//Trelease_0_8_1
   55.11 -/cirrus_vga.c/1.21/Thu May 25 18:22:32 2006//Trelease_0_8_1
   55.12 -/cirrus_vga_rop.h/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   55.13 -/cirrus_vga_rop2.h/1.7/Thu May 25 12:52:49 2006//Trelease_0_8_1
   55.14 -/cuda.c/1.10/Thu May 25 12:38:51 2006//Trelease_0_8_1
   55.15 -/dma.c/1.14/Thu May 25 18:22:32 2006//Trelease_0_8_1
   55.16 -/es1370.c/1.4/Sun Nov 20 16:20:39 2005//Trelease_0_8_1
   55.17 -/esp.c/1.6/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.18 -/fdc.c/1.18/Wed May 24 10:40:13 2006//Trelease_0_8_1
   55.19 -/fmopl.c/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   55.20 -/fmopl.h/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
   55.21 -/heathrow_pic.c/1.2/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.22 -/i8254.c/1.8/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.23 -/i8259.c/1.18/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.24 -/ide.c/1.42/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.25 -/integratorcp.c/1.9/Thu Apr 27 23:15:07 2006//Trelease_0_8_1
   55.26 -/iommu.c/1.6/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.27 -/lance.c/1.7/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.28 -/m48t59.c/1.7/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.29 -/m48t59.h/1.5/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.30 -/mc146818rtc.c/1.6/Wed May 17 14:47:01 2006//Trelease_0_8_1
   55.31 -/mips_r4k.c/1.16/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.32 -/ne2000.c/1.19/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.33 -/openpic.c/1.9/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.34 -/parallel.c/1.4/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.35 -/pc.c/1.53/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.36 -/pci.c/1.24/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.37 -/pckbd.c/1.15/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.38 -/pcspk.c/1.1/Mon Apr 24 21:58:30 2006//Trelease_0_8_1
   55.39 -/pl011.c/1.1/Sun Apr  9 01:32:52 2006//Trelease_0_8_1
   55.40 -/pl050.c/1.1/Sun Apr  9 01:32:52 2006//Trelease_0_8_1
   55.41 -/pl080.c/1.1/Sun Apr  9 01:32:52 2006//Trelease_0_8_1
   55.42 -/pl110.c/1.6/Tue Apr 18 19:02:59 2006//Trelease_0_8_1
   55.43 -/pl110_template.h/1.2/Sun Feb 19 12:31:32 2006//Trelease_0_8_1
   55.44 -/pl190.c/1.1/Sun Apr  9 01:32:52 2006//Trelease_0_8_1
   55.45 -/ppc.c/1.9/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.46 -/ppc_chrp.c/1.21/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.47 -/ppc_prep.c/1.26/Thu May 25 18:22:33 2006//Trelease_0_8_1
   55.48 -/ps2.c/1.4/Wed Apr 12 21:09:07 2006//Trelease_0_8_1
   55.49 -/rtl8139.c/1.1/Sun Feb  5 04:14:41 2006//Trelease_0_8_1
   55.50 -/sb16.c/1.19/Thu May 25 18:22:34 2006//Trelease_0_8_1
   55.51 -/serial.c/1.12/Thu May 25 18:22:34 2006//Trelease_0_8_1
   55.52 -/sh7750.c/1.1/Thu Apr 27 21:32:09 2006//Trelease_0_8_1
   55.53 -/sh7750_regnames.c/1.1/Thu Apr 27 21:32:09 2006//Trelease_0_8_1
   55.54 -/sh7750_regnames.h/1.1/Thu Apr 27 21:32:09 2006//Trelease_0_8_1
   55.55 -/sh7750_regs.h/1.1/Thu Apr 27 21:32:09 2006//Trelease_0_8_1
   55.56 -/shix.c/1.1/Thu Apr 27 21:32:09 2006//Trelease_0_8_1
   55.57 -/slavio_intctl.c/1.6/Thu May 25 18:22:35 2006//Trelease_0_8_1
   55.58 -/slavio_misc.c/1.3/Thu May 25 18:22:35 2006//Trelease_0_8_1
   55.59 -/slavio_serial.c/1.6/Thu May 25 18:22:35 2006//Trelease_0_8_1
   55.60 -/slavio_timer.c/1.3/Thu May 25 18:22:35 2006//Trelease_0_8_1
   55.61 -/smc91c111.c/1.3/Sat Feb  4 22:15:28 2006//Trelease_0_8_1
   55.62 -/sun4m.c/1.16/Thu May 25 18:22:35 2006//Trelease_0_8_1
   55.63 -/sun4u.c/1.8/Thu May 25 18:22:35 2006//Trelease_0_8_1
   55.64 -/tc58128.c/1.1/Thu Apr 27 21:32:09 2006//Trelease_0_8_1
   55.65 -/tcx.c/1.7/Thu May 25 18:22:35 2006//Trelease_0_8_1
   55.66 -/usb-hid.c/1.2/Wed Apr 12 21:09:07 2006//Trelease_0_8_1
   55.67 -/usb-hub.c/1.3/Sun Apr 30 21:53:59 2006//Trelease_0_8_1
   55.68 -/usb-uhci.c/1.8/Tue Apr 25 21:01:19 2006//Trelease_0_8_1
   55.69 -/usb.c/1.6/Mon Apr 24 21:18:20 2006//Trelease_0_8_1
   55.70 -/usb.h/1.4/Wed Apr 12 21:09:07 2006//Trelease_0_8_1
   55.71 -/versatilepb.c/1.2/Thu Apr 27 23:15:07 2006//Trelease_0_8_1
   55.72 -/vga.c/1.42/Thu May 25 18:22:36 2006//Trelease_0_8_1
   55.73 -/vga_int.h/1.6/Thu May 25 18:20:53 2006//Trelease_0_8_1
   55.74 -/vga_template.h/1.11/Wed May 17 14:47:01 2006//Trelease_0_8_1
   55.75 -D
    56.1 --- a/tools/ioemu/hw/CVS/Repository	Tue Aug 01 14:58:20 2006 -0600
    56.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    56.3 @@ -1,1 +0,0 @@
    56.4 -qemu/hw
    57.1 --- a/tools/ioemu/hw/CVS/Root	Tue Aug 01 14:58:20 2006 -0600
    57.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    57.3 @@ -1,1 +0,0 @@
    57.4 -:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    58.1 --- a/tools/ioemu/hw/CVS/Tag	Tue Aug 01 14:58:20 2006 -0600
    58.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    58.3 @@ -1,1 +0,0 @@
    58.4 -Nrelease_0_8_1
    59.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    59.2 +++ b/tools/ioemu/keymaps/.CVS/Entries	Wed Aug 02 13:39:47 2006 -0600
    59.3 @@ -0,0 +1,36 @@
    59.4 +/ar/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
    59.5 +/common/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
    59.6 +/da/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
    59.7 +/de/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
    59.8 +/de-ch/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
    59.9 +/en-gb/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.10 +/en-us/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.11 +/es/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.12 +/et/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.13 +/fi/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.14 +/fo/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.15 +/fr/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.16 +/fr-be/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.17 +/fr-ca/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.18 +/fr-ch/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.19 +/hr/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.20 +/hu/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.21 +/is/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.22 +/it/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.23 +/ja/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.24 +/lt/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.25 +/lv/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.26 +/mk/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.27 +/modifiers/1.2/Tue Mar  1 21:43:42 2005//Trelease_0_8_1
   59.28 +/nl/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.29 +/nl-be/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.30 +/no/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.31 +/pl/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.32 +/pt/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.33 +/pt-br/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.34 +/ru/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.35 +/sl/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.36 +/sv/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.37 +/th/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.38 +/tr/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   59.39 +D
    60.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    60.2 +++ b/tools/ioemu/keymaps/.CVS/Repository	Wed Aug 02 13:39:47 2006 -0600
    60.3 @@ -0,0 +1,1 @@
    60.4 +qemu/keymaps
    61.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    61.2 +++ b/tools/ioemu/keymaps/.CVS/Root	Wed Aug 02 13:39:47 2006 -0600
    61.3 @@ -0,0 +1,1 @@
    61.4 +:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    62.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    62.2 +++ b/tools/ioemu/keymaps/.CVS/Tag	Wed Aug 02 13:39:47 2006 -0600
    62.3 @@ -0,0 +1,1 @@
    62.4 +Nrelease_0_8_1
    63.1 --- a/tools/ioemu/keymaps/CVS/Entries	Tue Aug 01 14:58:20 2006 -0600
    63.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    63.3 @@ -1,36 +0,0 @@
    63.4 -/ar/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
    63.5 -/common/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
    63.6 -/da/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
    63.7 -/de/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
    63.8 -/de-ch/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
    63.9 -/en-gb/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.10 -/en-us/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.11 -/es/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.12 -/et/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.13 -/fi/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.14 -/fo/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.15 -/fr/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.16 -/fr-be/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.17 -/fr-ca/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.18 -/fr-ch/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.19 -/hr/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.20 -/hu/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.21 -/is/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.22 -/it/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.23 -/ja/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.24 -/lt/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.25 -/lv/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.26 -/mk/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.27 -/modifiers/1.2/Tue Mar  1 21:43:42 2005//Trelease_0_8_1
   63.28 -/nl/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.29 -/nl-be/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.30 -/no/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.31 -/pl/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.32 -/pt/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.33 -/pt-br/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.34 -/ru/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.35 -/sl/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.36 -/sv/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.37 -/th/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.38 -/tr/1.1/Sun Dec 12 16:56:30 2004//Trelease_0_8_1
   63.39 -D
    64.1 --- a/tools/ioemu/keymaps/CVS/Repository	Tue Aug 01 14:58:20 2006 -0600
    64.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    64.3 @@ -1,1 +0,0 @@
    64.4 -qemu/keymaps
    65.1 --- a/tools/ioemu/keymaps/CVS/Root	Tue Aug 01 14:58:20 2006 -0600
    65.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    65.3 @@ -1,1 +0,0 @@
    65.4 -:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    66.1 --- a/tools/ioemu/keymaps/CVS/Tag	Tue Aug 01 14:58:20 2006 -0600
    66.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    66.3 @@ -1,1 +0,0 @@
    66.4 -Nrelease_0_8_1
    67.1 --- a/tools/ioemu/patches/ioemu-ia64	Tue Aug 01 14:58:20 2006 -0600
    67.2 +++ b/tools/ioemu/patches/ioemu-ia64	Wed Aug 02 13:39:47 2006 -0600
    67.3 @@ -1,7 +1,7 @@
    67.4  Index: ioemu/hw/iommu.c
    67.5  ===================================================================
    67.6 ---- ioemu.orig/hw/iommu.c	2006-07-28 09:56:58.571272016 +0100
    67.7 -+++ ioemu/hw/iommu.c	2006-07-28 10:02:10.171049510 +0100
    67.8 +--- ioemu.orig/hw/iommu.c	2006-08-02 09:46:38.774790244 +0100
    67.9 ++++ ioemu/hw/iommu.c	2006-08-02 09:46:39.030761544 +0100
   67.10  @@ -82,7 +82,11 @@
   67.11   #define IOPTE_VALID         0x00000002 /* IOPTE is valid */
   67.12   #define IOPTE_WAZ           0x00000001 /* Write as zeros */
   67.13 @@ -16,8 +16,8 @@ Index: ioemu/hw/iommu.c
   67.14   
   67.15  Index: ioemu/cpu-all.h
   67.16  ===================================================================
   67.17 ---- ioemu.orig/cpu-all.h	2006-07-28 09:58:38.815935452 +0100
   67.18 -+++ ioemu/cpu-all.h	2006-07-28 10:02:10.171049510 +0100
   67.19 +--- ioemu.orig/cpu-all.h	2006-08-02 09:46:38.969768383 +0100
   67.20 ++++ ioemu/cpu-all.h	2006-08-02 09:46:39.030761544 +0100
   67.21  @@ -835,6 +835,31 @@
   67.22                   :"=m" (*(volatile long *)addr)
   67.23                   :"dIr" (nr));
   67.24 @@ -52,8 +52,8 @@ Index: ioemu/cpu-all.h
   67.25   /* memory API */
   67.26  Index: ioemu/vl.c
   67.27  ===================================================================
   67.28 ---- ioemu.orig/vl.c	2006-07-28 09:58:59.672577418 +0100
   67.29 -+++ ioemu/vl.c	2006-07-28 10:02:10.174049171 +0100
   67.30 +--- ioemu.orig/vl.c	2006-08-02 09:46:39.020762665 +0100
   67.31 ++++ ioemu/vl.c	2006-08-02 09:47:02.896085814 +0100
   67.32  @@ -5578,6 +5578,7 @@
   67.33           exit(-1);
   67.34       }
   67.35 @@ -82,7 +82,7 @@ Index: ioemu/vl.c
   67.36  +    }
   67.37  +
   67.38  +    if (xc_ia64_get_pfn_list(xc_handle, domid, page_array,
   67.39 -+                             nr_pages + (GFW_SIZE >> PAGE_SHIFT), 1)!= 1){
   67.40 ++                             IO_PAGE_START >> PAGE_SHIFT, 1) != 1){
   67.41  +        fprintf(logfile, "xc_ia64_get_pfn_list returned error %d\n", errno);
   67.42  +        exit(-1);
   67.43  +    }
   67.44 @@ -91,7 +91,7 @@ Index: ioemu/vl.c
   67.45  +                                       PROT_READ|PROT_WRITE,
   67.46  +                                       page_array[0]);
   67.47  +
   67.48 -+    fprintf(logfile, "shared page at pfn:%lx, mfn: %l016x\n",
   67.49 ++    fprintf(logfile, "shared page at pfn:%lx, mfn: %016lx\n",
   67.50  +            IO_PAGE_START >> PAGE_SHIFT, page_array[0]);
   67.51  +#endif
   67.52   #else  /* !CONFIG_DM */
   67.53 @@ -99,8 +99,8 @@ Index: ioemu/vl.c
   67.54   #ifdef CONFIG_SOFTMMU
   67.55  Index: ioemu/target-i386-dm/exec-dm.c
   67.56  ===================================================================
   67.57 ---- ioemu.orig/target-i386-dm/exec-dm.c	2006-07-28 09:58:22.882736989 +0100
   67.58 -+++ ioemu/target-i386-dm/exec-dm.c	2006-07-28 10:03:19.972165675 +0100
   67.59 +--- ioemu.orig/target-i386-dm/exec-dm.c	2006-08-02 09:46:38.903775782 +0100
   67.60 ++++ ioemu/target-i386-dm/exec-dm.c	2006-08-02 09:46:39.034761096 +0100
   67.61  @@ -341,6 +341,23 @@
   67.62       return io_mem_read[io_index >> IO_MEM_SHIFT];
   67.63   }
   67.64 @@ -137,8 +137,8 @@ Index: ioemu/target-i386-dm/exec-dm.c
   67.65                   memset(buf, 0xff, len);
   67.66  Index: ioemu/exec-all.h
   67.67  ===================================================================
   67.68 ---- ioemu.orig/exec-all.h	2006-07-28 09:56:58.572271903 +0100
   67.69 -+++ ioemu/exec-all.h	2006-07-28 10:02:10.175049059 +0100
   67.70 +--- ioemu.orig/exec-all.h	2006-08-02 09:46:38.881778248 +0100
   67.71 ++++ ioemu/exec-all.h	2006-08-02 09:46:39.034761096 +0100
   67.72  @@ -462,12 +462,13 @@
   67.73   }
   67.74   #endif
   67.75 @@ -158,8 +158,8 @@ Index: ioemu/exec-all.h
   67.76   
   67.77  Index: ioemu/target-i386-dm/cpu.h
   67.78  ===================================================================
   67.79 ---- ioemu.orig/target-i386-dm/cpu.h	2006-07-28 09:56:58.572271903 +0100
   67.80 -+++ ioemu/target-i386-dm/cpu.h	2006-07-28 10:02:10.175049059 +0100
   67.81 +--- ioemu.orig/target-i386-dm/cpu.h	2006-08-02 09:46:38.902775894 +0100
   67.82 ++++ ioemu/target-i386-dm/cpu.h	2006-08-02 09:46:39.034761096 +0100
   67.83  @@ -80,7 +80,11 @@
   67.84   /* helper2.c */
   67.85   int main_loop(void);
   67.86 @@ -175,7 +175,7 @@ Index: ioemu/target-i386-dm/cpu.h
   67.87  Index: ioemu/ia64_intrinsic.h
   67.88  ===================================================================
   67.89  --- /dev/null	1970-01-01 00:00:00.000000000 +0000
   67.90 -+++ ioemu/ia64_intrinsic.h	2006-07-28 10:02:10.176048946 +0100
   67.91 ++++ ioemu/ia64_intrinsic.h	2006-08-02 09:46:39.035760983 +0100
   67.92  @@ -0,0 +1,276 @@
   67.93  +#ifndef IA64_INTRINSIC_H
   67.94  +#define IA64_INTRINSIC_H
    68.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    68.2 +++ b/tools/ioemu/pc-bios/.CVS/Entries	Wed Aug 02 13:39:47 2006 -0600
    68.3 @@ -0,0 +1,15 @@
    68.4 +/Makefile/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
    68.5 +/README/1.7/Thu May 25 12:38:52 2006//Trelease_0_8_1
    68.6 +/bios.bin/1.13/Thu May 25 18:22:37 2006/-kb/Trelease_0_8_1
    68.7 +/bios.diff/1.11/Thu May 25 18:22:37 2006//Trelease_0_8_1
    68.8 +/linux_boot.S/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
    68.9 +/linux_boot.bin/1.1/Wed May 17 14:47:01 2006/-kb/Trelease_0_8_1
   68.10 +/ohw.diff/1.2/Thu Jul  7 22:38:00 2005//Trelease_0_8_1
   68.11 +/ppc_rom.bin/1.6/Thu May 25 12:39:00 2006/-kb/Trelease_0_8_1
   68.12 +/proll.elf/1.5/Thu May 25 18:22:38 2006/-kb/Trelease_0_8_1
   68.13 +/proll.patch/1.6/Thu May 25 18:22:38 2006//Trelease_0_8_1
   68.14 +/vgabios-cirrus.bin/1.6/Thu May 25 18:22:38 2006/-kb/Trelease_0_8_1
   68.15 +/vgabios.bin/1.5/Thu May 25 18:22:39 2006/-kb/Trelease_0_8_1
   68.16 +/vgabios.diff/1.2/Thu May 25 18:22:39 2006//Trelease_0_8_1
   68.17 +/video.x/1.1/Sun Jul  3 14:00:51 2005/-kb/Trelease_0_8_1
   68.18 +D
    69.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    69.2 +++ b/tools/ioemu/pc-bios/.CVS/Repository	Wed Aug 02 13:39:47 2006 -0600
    69.3 @@ -0,0 +1,1 @@
    69.4 +qemu/pc-bios
    70.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    70.2 +++ b/tools/ioemu/pc-bios/.CVS/Root	Wed Aug 02 13:39:47 2006 -0600
    70.3 @@ -0,0 +1,1 @@
    70.4 +:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    71.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    71.2 +++ b/tools/ioemu/pc-bios/.CVS/Tag	Wed Aug 02 13:39:47 2006 -0600
    71.3 @@ -0,0 +1,1 @@
    71.4 +Nrelease_0_8_1
    72.1 --- a/tools/ioemu/pc-bios/CVS/Entries	Tue Aug 01 14:58:20 2006 -0600
    72.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    72.3 @@ -1,15 +0,0 @@
    72.4 -/Makefile/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
    72.5 -/README/1.7/Thu May 25 12:38:52 2006//Trelease_0_8_1
    72.6 -/bios.bin/1.13/Thu May 25 18:22:37 2006/-kb/Trelease_0_8_1
    72.7 -/bios.diff/1.11/Thu May 25 18:22:37 2006//Trelease_0_8_1
    72.8 -/linux_boot.S/1.1/Wed May 17 14:47:01 2006//Trelease_0_8_1
    72.9 -/linux_boot.bin/1.1/Wed May 17 14:47:01 2006/-kb/Trelease_0_8_1
   72.10 -/ohw.diff/1.2/Thu Jul  7 22:38:00 2005//Trelease_0_8_1
   72.11 -/ppc_rom.bin/1.6/Thu May 25 12:39:00 2006/-kb/Trelease_0_8_1
   72.12 -/proll.elf/1.5/Thu May 25 18:22:38 2006/-kb/Trelease_0_8_1
   72.13 -/proll.patch/1.6/Thu May 25 18:22:38 2006//Trelease_0_8_1
   72.14 -/vgabios-cirrus.bin/1.6/Thu May 25 18:22:38 2006/-kb/Trelease_0_8_1
   72.15 -/vgabios.bin/1.5/Thu May 25 18:22:39 2006/-kb/Trelease_0_8_1
   72.16 -/vgabios.diff/1.2/Thu May 25 18:22:39 2006//Trelease_0_8_1
   72.17 -/video.x/1.1/Sun Jul  3 14:00:51 2005/-kb/Trelease_0_8_1
   72.18 -D
    73.1 --- a/tools/ioemu/pc-bios/CVS/Repository	Tue Aug 01 14:58:20 2006 -0600
    73.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    73.3 @@ -1,1 +0,0 @@
    73.4 -qemu/pc-bios
    74.1 --- a/tools/ioemu/pc-bios/CVS/Root	Tue Aug 01 14:58:20 2006 -0600
    74.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    74.3 @@ -1,1 +0,0 @@
    74.4 -:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    75.1 --- a/tools/ioemu/pc-bios/CVS/Tag	Tue Aug 01 14:58:20 2006 -0600
    75.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    75.3 @@ -1,1 +0,0 @@
    75.4 -Nrelease_0_8_1
    76.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    76.2 +++ b/tools/ioemu/target-i386/.CVS/Entries	Wed Aug 02 13:39:47 2006 -0600
    76.3 @@ -0,0 +1,13 @@
    76.4 +/cpu.h/1.36/Thu May 25 18:22:39 2006//Trelease_0_8_1
    76.5 +/exec.h/1.29/Thu May 25 18:22:39 2006//Trelease_0_8_1
    76.6 +/helper.c/1.65/Thu May 25 18:22:39 2006//Trelease_0_8_1
    76.7 +/helper2.c/1.41/Thu May 25 18:22:39 2006//Trelease_0_8_1
    76.8 +/op.c/1.44/Thu May 25 18:22:39 2006//Trelease_0_8_1
    76.9 +/opreg_template.h/1.3/Wed May 24 10:40:25 2006//Trelease_0_8_1
   76.10 +/ops_mem.h/1.7/Thu May 25 18:22:39 2006//Trelease_0_8_1
   76.11 +/ops_sse.h/1.6/Tue Apr 26 20:38:17 2005//Trelease_0_8_1
   76.12 +/ops_template.h/1.10/Wed May 24 10:40:25 2006//Trelease_0_8_1
   76.13 +/ops_template_mem.h/1.6/Thu May 25 18:22:39 2006//Trelease_0_8_1
   76.14 +/translate-copy.c/1.7/Wed May 24 10:40:25 2006//Trelease_0_8_1
   76.15 +/translate.c/1.56/Thu May 25 18:22:39 2006//Trelease_0_8_1
   76.16 +D
    77.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    77.2 +++ b/tools/ioemu/target-i386/.CVS/Repository	Wed Aug 02 13:39:47 2006 -0600
    77.3 @@ -0,0 +1,1 @@
    77.4 +qemu/target-i386
    78.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    78.2 +++ b/tools/ioemu/target-i386/.CVS/Root	Wed Aug 02 13:39:47 2006 -0600
    78.3 @@ -0,0 +1,1 @@
    78.4 +:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    79.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    79.2 +++ b/tools/ioemu/target-i386/.CVS/Tag	Wed Aug 02 13:39:47 2006 -0600
    79.3 @@ -0,0 +1,1 @@
    79.4 +Nrelease_0_8_1
    80.1 --- a/tools/ioemu/target-i386/CVS/Entries	Tue Aug 01 14:58:20 2006 -0600
    80.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    80.3 @@ -1,13 +0,0 @@
    80.4 -/cpu.h/1.36/Thu May 25 18:22:39 2006//Trelease_0_8_1
    80.5 -/exec.h/1.29/Thu May 25 18:22:39 2006//Trelease_0_8_1
    80.6 -/helper.c/1.65/Thu May 25 18:22:39 2006//Trelease_0_8_1
    80.7 -/helper2.c/1.41/Thu May 25 18:22:39 2006//Trelease_0_8_1
    80.8 -/op.c/1.44/Thu May 25 18:22:39 2006//Trelease_0_8_1
    80.9 -/opreg_template.h/1.3/Wed May 24 10:40:25 2006//Trelease_0_8_1
   80.10 -/ops_mem.h/1.7/Thu May 25 18:22:39 2006//Trelease_0_8_1
   80.11 -/ops_sse.h/1.6/Tue Apr 26 20:38:17 2005//Trelease_0_8_1
   80.12 -/ops_template.h/1.10/Wed May 24 10:40:25 2006//Trelease_0_8_1
   80.13 -/ops_template_mem.h/1.6/Thu May 25 18:22:39 2006//Trelease_0_8_1
   80.14 -/translate-copy.c/1.7/Wed May 24 10:40:25 2006//Trelease_0_8_1
   80.15 -/translate.c/1.56/Thu May 25 18:22:39 2006//Trelease_0_8_1
   80.16 -D
    81.1 --- a/tools/ioemu/target-i386/CVS/Repository	Tue Aug 01 14:58:20 2006 -0600
    81.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    81.3 @@ -1,1 +0,0 @@
    81.4 -qemu/target-i386
    82.1 --- a/tools/ioemu/target-i386/CVS/Root	Tue Aug 01 14:58:20 2006 -0600
    82.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    82.3 @@ -1,1 +0,0 @@
    82.4 -:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    83.1 --- a/tools/ioemu/target-i386/CVS/Tag	Tue Aug 01 14:58:20 2006 -0600
    83.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    83.3 @@ -1,1 +0,0 @@
    83.4 -Nrelease_0_8_1
    84.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    84.2 +++ b/tools/ioemu/tests/.CVS/Entries	Wed Aug 02 13:39:47 2006 -0600
    84.3 @@ -0,0 +1,18 @@
    84.4 +/.cvsignore/1.4/Wed May 17 14:47:02 2006//Trelease_0_8_1
    84.5 +/Makefile/1.36/Thu May 25 18:22:40 2006//Trelease_0_8_1
    84.6 +/hello-arm.c/1.1/Wed May 17 14:47:02 2006//Trelease_0_8_1
    84.7 +/hello-i386.c/1.1/Wed May 17 14:47:02 2006//Trelease_0_8_1
    84.8 +/linux-test.c/1.3/Wed May 17 14:47:02 2006//Trelease_0_8_1
    84.9 +/pi_10.com/1.1/Wed May 17 14:47:02 2006/-kb/Trelease_0_8_1
   84.10 +/qruncom.c/1.4/Thu May 25 18:22:41 2006//Trelease_0_8_1
   84.11 +/runcom.c/1.3/Wed May 17 14:47:02 2006//Trelease_0_8_1
   84.12 +/sha1.c/1.1/Wed May 17 14:47:02 2006//Trelease_0_8_1
   84.13 +/test-i386-code16.S/1.3/Wed May 24 10:40:26 2006//Trelease_0_8_1
   84.14 +/test-i386-muldiv.h/1.2/Wed May 24 10:40:26 2006//Trelease_0_8_1
   84.15 +/test-i386-shift.h/1.5/Thu May 25 18:22:41 2006//Trelease_0_8_1
   84.16 +/test-i386-vm86.S/1.1/Wed May 17 14:47:02 2006//Trelease_0_8_1
   84.17 +/test-i386.c/1.49/Wed May 24 10:40:26 2006//Trelease_0_8_1
   84.18 +/test-i386.h/1.2/Wed May 24 10:40:26 2006//Trelease_0_8_1
   84.19 +/test_path.c/1.1/Wed May 17 14:47:02 2006//Trelease_0_8_1
   84.20 +/testthread.c/1.2/Wed May 17 14:47:02 2006//Trelease_0_8_1
   84.21 +D
    85.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    85.2 +++ b/tools/ioemu/tests/.CVS/Repository	Wed Aug 02 13:39:47 2006 -0600
    85.3 @@ -0,0 +1,1 @@
    85.4 +qemu/tests
    86.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    86.2 +++ b/tools/ioemu/tests/.CVS/Root	Wed Aug 02 13:39:47 2006 -0600
    86.3 @@ -0,0 +1,1 @@
    86.4 +:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    87.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    87.2 +++ b/tools/ioemu/tests/.CVS/Tag	Wed Aug 02 13:39:47 2006 -0600
    87.3 @@ -0,0 +1,1 @@
    87.4 +Nrelease_0_8_1
    88.1 --- a/tools/ioemu/tests/CVS/Entries	Tue Aug 01 14:58:20 2006 -0600
    88.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    88.3 @@ -1,18 +0,0 @@
    88.4 -/.cvsignore/1.4/Wed May 17 14:47:02 2006//Trelease_0_8_1
    88.5 -/Makefile/1.36/Thu May 25 18:22:40 2006//Trelease_0_8_1
    88.6 -/hello-arm.c/1.1/Wed May 17 14:47:02 2006//Trelease_0_8_1
    88.7 -/hello-i386.c/1.1/Wed May 17 14:47:02 2006//Trelease_0_8_1
    88.8 -/linux-test.c/1.3/Wed May 17 14:47:02 2006//Trelease_0_8_1
    88.9 -/pi_10.com/1.1/Wed May 17 14:47:02 2006/-kb/Trelease_0_8_1
   88.10 -/qruncom.c/1.4/Thu May 25 18:22:41 2006//Trelease_0_8_1
   88.11 -/runcom.c/1.3/Wed May 17 14:47:02 2006//Trelease_0_8_1
   88.12 -/sha1.c/1.1/Wed May 17 14:47:02 2006//Trelease_0_8_1
   88.13 -/test-i386-code16.S/1.3/Wed May 24 10:40:26 2006//Trelease_0_8_1
   88.14 -/test-i386-muldiv.h/1.2/Wed May 24 10:40:26 2006//Trelease_0_8_1
   88.15 -/test-i386-shift.h/1.5/Thu May 25 18:22:41 2006//Trelease_0_8_1
   88.16 -/test-i386-vm86.S/1.1/Wed May 17 14:47:02 2006//Trelease_0_8_1
   88.17 -/test-i386.c/1.49/Wed May 24 10:40:26 2006//Trelease_0_8_1
   88.18 -/test-i386.h/1.2/Wed May 24 10:40:26 2006//Trelease_0_8_1
   88.19 -/test_path.c/1.1/Wed May 17 14:47:02 2006//Trelease_0_8_1
   88.20 -/testthread.c/1.2/Wed May 17 14:47:02 2006//Trelease_0_8_1
   88.21 -D
    89.1 --- a/tools/ioemu/tests/CVS/Repository	Tue Aug 01 14:58:20 2006 -0600
    89.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    89.3 @@ -1,1 +0,0 @@
    89.4 -qemu/tests
    90.1 --- a/tools/ioemu/tests/CVS/Root	Tue Aug 01 14:58:20 2006 -0600
    90.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    90.3 @@ -1,1 +0,0 @@
    90.4 -:pserver:anonymous@cvs.savannah.nongnu.org:/sources/qemu
    91.1 --- a/tools/ioemu/tests/CVS/Tag	Tue Aug 01 14:58:20 2006 -0600
    91.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    91.3 @@ -1,1 +0,0 @@
    91.4 -Nrelease_0_8_1
    92.1 --- a/tools/misc/lomount/lomount.c	Tue Aug 01 14:58:20 2006 -0600
    92.2 +++ b/tools/misc/lomount/lomount.c	Wed Aug 02 13:39:47 2006 -0600
    92.3 @@ -158,7 +158,7 @@ load_gpt (const char *diskimage, struct 
    92.4  	entry_size = read_le4 (&data[84]);
    92.5  
    92.6  #ifdef DEBUG
    92.7 -	fprintf(stderr, "lba entries: %lu, nbr_part: %u, entry_size: %lu\n",
    92.8 +	fprintf(stderr, "lba entries: %llu, nbr_part: %u, entry_size: %lu\n",
    92.9  		entries_lba, nbr_part, entry_size);
   92.10  #endif
   92.11  	part = malloc (nbr_part * sizeof (struct pentry));
   92.12 @@ -404,7 +404,7 @@ int main(int argc, char ** argv)
   92.13  	   value is off by (larger than) a value less than one. */
   92.14  	sec = 512; /* TODO: calculate real sector size */
   92.15  #ifdef DEBUG
   92.16 -	printf("sec: %d\n", sec);
   92.17 +	printf("sec: %llu\n", sec);
   92.18  #endif
   92.19  	if (partition > nbr_part)
   92.20  	{
   92.21 @@ -421,7 +421,7 @@ int main(int argc, char ** argv)
   92.22  
   92.23  	pnum = sec * num;
   92.24  #ifdef DEBUG
   92.25 -	printf("offset = %d\n", pnum);
   92.26 +	printf("offset = %llu\n", pnum);
   92.27  #endif
   92.28  	snprintf(buf, sizeof(buf), "mount -oloop,offset=%lld %s %s",
   92.29  		 pnum, diskimage, argv2);
    93.1 --- a/tools/python/xen/util/auxbin.py	Tue Aug 01 14:58:20 2006 -0600
    93.2 +++ b/tools/python/xen/util/auxbin.py	Wed Aug 02 13:39:47 2006 -0600
    93.3 @@ -21,8 +21,8 @@ LIB_64 = "/usr/lib64"
    93.4  LIB_BIN_SUFFIX = "xen/bin"
    93.5  
    93.6  ## The architectures on which the LIB_64 directory is used.  This
    93.7 -# deliberately excludes ia64.
    93.8 -LIB_64_ARCHS = [ 'x86_64', 'ppc64', 's390x', 'sparc64']
    93.9 +# deliberately excludes ia64 and ppc64.
   93.10 +LIB_64_ARCHS = [ 'x86_64', 's390x', 'sparc64']
   93.11  
   93.12  
   93.13  import os
    94.1 --- a/tools/python/xen/xm/main.py	Tue Aug 01 14:58:20 2006 -0600
    94.2 +++ b/tools/python/xen/xm/main.py	Wed Aug 02 13:39:47 2006 -0600
    94.3 @@ -78,7 +78,9 @@ help_spacer = """
    94.4  sysrq_help =   "sysrq   <DomId> <letter>         Send a sysrq to a domain"
    94.5  domid_help =   "domid <DomName>                  Converts a domain name to a domain id"
    94.6  domname_help = "domname <DomId>                  Convert a domain id to a domain name"
    94.7 -vcpu_set_help = """vcpu-set <DomId> <VCPUs>         Set the number of VCPUs for a domain"""
    94.8 +vcpu_set_help = """vcpu-set <DomId> <VCPUs>         Set the number of active VCPUs for a domain
    94.9 +                                    within the range allowed by the domain
   94.10 +                                    configuration"""
   94.11  vcpu_list_help = "vcpu-list <DomId>                List the VCPUs for a domain (or all domains)"
   94.12  vcpu_pin_help = "vcpu-pin <DomId> <VCPU> <CPUs>   Set which cpus a VCPU can use" 
   94.13  dmesg_help =   "dmesg [-c|--clear]               Read or clear Xen's message buffer"
    95.1 --- a/tools/security/Makefile	Tue Aug 01 14:58:20 2006 -0600
    95.2 +++ b/tools/security/Makefile	Wed Aug 02 13:39:47 2006 -0600
    95.3 @@ -32,6 +32,7 @@ SRCS_XML2BIN  = secpol_xml2bin.c secpol_
    95.4  OBJS_XML2BIN := $(patsubst %.c,%.o,$(filter %.c,$(SRCS_XML2BIN)))
    95.5  
    95.6  ACM_INST_TOOLS    = xensec_tool xensec_xml2bin xensec_gen
    95.7 +ACM_EZPOLICY      = xensec_ezpolicy
    95.8  ACM_OBJS          = $(OBJS_TOOL) $(OBJS_XML2BIN) $(OBJS_GETD)
    95.9  ACM_SCRIPTS       = python/xensec_tools/acm_getlabel
   95.10  
   95.11 @@ -56,6 +57,7 @@ all: build
   95.12  install: all $(ACM_CONFIG_FILE)
   95.13  	$(INSTALL_DIR) -p $(DESTDIR)/usr/sbin
   95.14  	$(INSTALL_PROG) -p $(ACM_INST_TOOLS) $(DESTDIR)/usr/sbin
   95.15 +	$(INSTALL_PROG) -p $(ACM_EZPOLICY) $(DESTDIR)/usr/sbin
   95.16  	$(INSTALL_DIR) -p $(DESTDIR)$(ACM_CONFIG_DIR)
   95.17  	$(INSTALL_DIR) -p $(DESTDIR)$(ACM_POLICY_DIR)
   95.18  	$(INSTALL_DATA) -p policies/$(ACM_SCHEMA) $(DESTDIR)$(ACM_POLICY_DIR)
    96.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    96.2 +++ b/tools/security/xensec_ezpolicy	Wed Aug 02 13:39:47 2006 -0600
    96.3 @@ -0,0 +1,1628 @@
    96.4 +#!/usr/bin/env python
    96.5 +#===========================================================================
    96.6 +# This program is free software; you can redistribute it and/or
    96.7 +# modify it under the terms of version 2.1 of the GNU Lesser General Public
    96.8 +# License as published by the Free Software Foundation.
    96.9 +#
   96.10 +# This library is distributed in the hope that it will be useful,
   96.11 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
   96.12 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   96.13 +# Lesser General Public License for more details.
   96.14 +#
   96.15 +# You should have received a copy of the GNU Lesser General Public
   96.16 +# License along with this library; if not, write to the Free Software
   96.17 +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   96.18 +#============================================================================
   96.19 +# Copyright (C) 2006 International Business Machines Corp.
   96.20 +# Author: Reiner Sailer
   96.21 +#============================================================================
   96.22 +# use 'yum install wxPython' to get wx or download from www.wxpython.org
   96.23 +import sys, time, string
   96.24 +import wx
   96.25 +import wx.lib.buttons as buttons
   96.26 +"""
   96.27 +This program creates a default policy based on names of organizations and departments.
   96.28 +The resulting policy can be refined using the policy generation tool (xensec_gen).
   96.29 +"""
   96.30 +
   96.31 +helpprovider = wx.SimpleHelpProvider()
   96.32 +wx.HelpProvider_Set(helpprovider)
   96.33 +
   96.34 +ID_CS_START=1000
   96.35 +
   96.36 +realm_bmp = None
   96.37 +workload_bmp = None
   96.38 +conflict_bmp = None
   96.39 +realm_icon = None
   96.40 +workload_icon = None
   96.41 +
   96.42 +class orgTreeCtrl(wx.TreeCtrl):
   96.43 +
   96.44 +    event = None
   96.45 +
   96.46 +    def __init__(self, parent, id, pos, size, style, validator, name):
   96.47 +        wx.TreeCtrl.__init__(self, parent, id, pos, size, style,
   96.48 +                             validator, name)
   96.49 +        self.parent = parent
   96.50 +        orgs_root = self.AddRoot(text="Organization / Department")
   96.51 +        rootfont = wx.Font(pointSize=12, family=wx.FONTFAMILY_DEFAULT,
   96.52 +                          style=wx.FONTSTYLE_NORMAL, weight=wx.FONTWEIGHT_LIGHT)
   96.53 +        self.SetItemFont(orgs_root, rootfont)
   96.54 +        self.SetItemBackgroundColour(orgs_root, wx.LIGHT_GREY)
   96.55 +
   96.56 +
   96.57 +    def LabelExists(self, label, item):
   96.58 +        for i in iterchildren(self.GetItemParent(item)):
   96.59 +            if (self.GetItemText(i) == label) and (i != item):
   96.60 +                return True
   96.61 +        return False
   96.62 +
   96.63 +
   96.64 +    def _OrgEdt(self, event):
   96.65 +        item = self.event.GetItem()
   96.66 +        self.OrgEdt(item)
   96.67 +
   96.68 +
   96.69 +    def OrgEdt(self, item):
   96.70 +        oldlabel= self.GetItemText(item)
   96.71 +        #get new name
   96.72 +        dlg = wx.TextEntryDialog(self, "Please enter org/dept name:",
   96.73 +                                 "Naming a Workload",
   96.74 +                                 style=wx.CANCEL | wx.OK | wx.CENTRE | wx.TE_NOHIDESEL)
   96.75 +        dlg.SetValue(oldlabel)
   96.76 +        ret = dlg.ShowModal()
   96.77 +        newlabel = dlg.GetValue()
   96.78 +        dlg.Destroy()
   96.79 +        if (ret == wx.ID_CANCEL) or (newlabel == ''):
   96.80 +            return False
   96.81 +
   96.82 +        #now check if the new name is permissible
   96.83 +        if self.LabelExists(newlabel, item):
   96.84 +            dlg = wx.MessageDialog(self, 'Item with name ' + newlabel + ' already exists!',
   96.85 +                                   'Rename', style=wx.OK)
   96.86 +            dlg.ShowModal()
   96.87 +            dlg.Destroy()
   96.88 +            return False
   96.89 +
   96.90 +        #all checkspassed, change item and adapt runtime exclusion rules
   96.91 +        self.SetItemText(item, newlabel)
   96.92 +        app.win.LabelReplaceInConflictsets(item, oldlabel, newlabel)
   96.93 +        return True
   96.94 +
   96.95 +
   96.96 +    def _OrgRAdd(self, event):
   96.97 +        self.OrgRAdd()
   96.98 +
   96.99 +
  96.100 +    def OrgRAdd(self):
  96.101 +        new = self.AppendItem(self.GetRootItem(), text="")
  96.102 +        self.SetItemBold(new, True)
  96.103 +        self.SetItemImage(new, realm_icon, wx.TreeItemIcon_Normal)
  96.104 +        self.EnsureVisible(new)
  96.105 +        if not self.OrgEdt(new):
  96.106 +            self.Delete(new)
  96.107 +
  96.108 +
  96.109 +    def _OrgWAdd(self, event):
  96.110 +        item = self.event.GetItem()
  96.111 +        self.OrgWAdd(item)
  96.112 +
  96.113 +
  96.114 +    def OrgWAdd(self, item):
  96.115 +        new = self.AppendItem(item, text="")
  96.116 +        self.Expand(item)
  96.117 +        self.SetItemImage(new, workload_icon, wx.TreeItemIcon_Normal)
  96.118 +        self.EnsureVisible(new)
  96.119 +        if not self.OrgEdt(new):
  96.120 +            self.Delete(new)
  96.121 +
  96.122 +
  96.123 +class OrgsPanel(wx.Panel):
  96.124 +    ID_CONSADDBTN = 145
  96.125 +    ID_REALMADDBTN = 144
  96.126 +
  96.127 +    def __init__(self, parent, ID):
  96.128 +        global realm_icon, workload_icon
  96.129 +
  96.130 +        wx.Panel.__init__(self, parent, -1)
  96.131 +
  96.132 +        #create image list
  96.133 +        imagelist = wx.ImageList(16, 17, True)
  96.134 +        #define generic function and use it for all input
  96.135 +        realm_icon = imagelist.Add(realm_bmp)
  96.136 +        workload_icon = imagelist.Add(workload_bmp)
  96.137 +
  96.138 +        #left tree control for organizations / workload definitions
  96.139 +        orgshdrbox = wx.StaticBox(self, -1, "")
  96.140 +        orgshdrboxsizer = wx.StaticBoxSizer(orgshdrbox, wx.HORIZONTAL)
  96.141 +        orgshdr = wx.StaticText(self, -1, "Organization / Department Definition",
  96.142 +                                style=wx.ALIGN_CENTER)
  96.143 +        orgshdr.SetHelpText(RealmWorkloadPanelHelp)
  96.144 +        points = orgshdr.GetFont().GetPointSize()  # get the current size
  96.145 +        hdrfont = wx.Font(points + 2, family=wx.DEFAULT,
  96.146 +                          style=wx.FONTSTYLE_NORMAL, weight=wx.BOLD)
  96.147 +        orgshdr.SetFont(hdrfont)
  96.148 +        orgshdr.SetForegroundColour('MEDIUMBLUE')
  96.149 +        orgshdr.SetBackgroundColour('SNOW')
  96.150 +        orgshdrboxsizer.Add(orgshdr, proportion=1, flag=wx.EXPAND | wx.ALL | wx.ALIGN_LEFT, border=5)
  96.151 +        addorgsbutton = wx.Button(self, self.ID_REALMADDBTN, "New Org", style=wx.BU_EXACTFIT)
  96.152 +        addorgsbutton.SetToolTipString("Add A New Organization")
  96.153 +        addorgsbutton.SetHelpText(NewRealmButtonHelp)
  96.154 +        addorgsbutton.SetForegroundColour('MEDIUMBLUE')
  96.155 +        addfont = wx.Font(points, family=wx.DEFAULT,
  96.156 +                          style=wx.FONTSTYLE_NORMAL, weight=wx.BOLD)
  96.157 +        addorgsbutton.SetFont(addfont)
  96.158 +        orgshdrboxsizer.Add(addorgsbutton, proportion=0, flag=wx.EXPAND | wx.ALL | wx.ALIGN_RIGHT, border=0)
  96.159 +
  96.160 +        self.orgs = orgTreeCtrl(self, -1,
  96.161 +                                pos=wx.DefaultPosition,
  96.162 +                                size=wx.DefaultSize,
  96.163 +                                style=wx.TR_HAS_BUTTONS | wx.TR_HIDE_ROOT | wx.TR_NO_LINES
  96.164 +                                | wx.TR_MULTIPLE,
  96.165 +                                validator=wx.DefaultValidator,
  96.166 +                                name="orgs")
  96.167 +        self.orgs.AssignImageList(imagelist)
  96.168 +        self.orgs.SetHelpText(RealmWorkloadPanelHelp)
  96.169 +
  96.170 +        self.addconsbutton = wx.Button(self, self.ID_CONSADDBTN,
  96.171 +                                       "Create run-time exclusion rule from selection -->",
  96.172 +                                       style=wx.BU_EXACTFIT)
  96.173 +        self.addconsbutton.SetToolTipString("Create New Exclusion rule From Above Workload Selection")
  96.174 +        self.addconsbutton.SetHelpText(CreateRunTimeButtonHelp)
  96.175 +        self.addconsbutton.SetForegroundColour('MEDIUMBLUE')
  96.176 +        addfont = wx.Font(points, family=wx.DEFAULT,
  96.177 +                          style=wx.FONTSTYLE_NORMAL, weight=wx.BOLD)
  96.178 +        self.addconsbutton.SetFont(addfont)
  96.179 +        self.addconsbutton.Bind(wx.EVT_BUTTON, self._AddConflict, id=self.ID_CONSADDBTN)
  96.180 +
  96.181 +        orgsvbox = wx.BoxSizer(wx.VERTICAL)
  96.182 +        orgsvbox.Add(orgshdrboxsizer, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
  96.183 +        orgsvbox.Add(self.orgs, proportion=1, flag=wx.EXPAND | wx.ALL, border=5)
  96.184 +        orgsvbox.Add(self.addconsbutton, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
  96.185 +        self.SetSizer(orgsvbox)
  96.186 +        addorgsbutton.Bind(wx.EVT_BUTTON, self.orgs._OrgRAdd, id= self.ID_REALMADDBTN)
  96.187 +
  96.188 +
  96.189 +    def _AddConflict(self, event):
  96.190 +        app.win.conspanel._AddNewConflict(event)
  96.191 +
  96.192 +
  96.193 +class ConsPanel(wx.Panel):
  96.194 +    ID_CONSSELECT = 151
  96.195 +    ID_CONSADD = 152
  96.196 +    ID_CONSRENAME = 153
  96.197 +    ID_CONSDEL = 154
  96.198 +    ID_CONSSELECTSUB= 155
  96.199 +
  96.200 +    conflictMAX = ID_CS_START
  96.201 +
  96.202 +    def __init__(self, parent, ID):
  96.203 +        self.conflictsets = []
  96.204 +        self.parent = parent
  96.205 +        wx.Panel.__init__(self, parent, -1)
  96.206 +        #header
  96.207 +        conshdrbox = wx.StaticBox(self, -1, "")
  96.208 +        conshdrboxsizer = wx.StaticBoxSizer(conshdrbox, wx.HORIZONTAL)
  96.209 +        conshdr = wx.StaticText(self, -1, "Run-time Exclusion Rules", style=wx.ALIGN_CENTER)
  96.210 +        conshdr.SetHelpText(RunTimeExclusionPanelHelp)
  96.211 +        points = conshdr.GetFont().GetPointSize()  # get the current size
  96.212 +        hdrfont = wx.Font(points + 2, family=wx.DEFAULT,
  96.213 +                          style=wx.FONTSTYLE_NORMAL, weight=wx.BOLD)
  96.214 +        conshdr.SetFont(hdrfont)
  96.215 +        conshdr.SetForegroundColour('ORANGERED')
  96.216 +
  96.217 +        #context help button
  96.218 +        ctxHelp = wx.ContextHelpButton(self)
  96.219 +        ctxHelp.SetHelpText("Context Help Button.")
  96.220 +        ctxHelp.SetToolTipString("Context Help: Press this button, then press any other button or panel to get help.")
  96.221 +
  96.222 +
  96.223 +        conshdrboxsizer.Add(conshdr, proportion=1, flag=wx.EXPAND | wx.ALL | wx.ALIGN_LEFT, border=5)
  96.224 +        conshdrboxsizer.Add(ctxHelp, proportion=0, flag=wx.EXPAND | wx.ALL | wx.ALIGN_RIGHT, border=0)
  96.225 +        #scrolledwindow for all the run-time exclusion rules
  96.226 +        conflictspanel = wx.ScrolledWindow(self, -1, (0,0),
  96.227 +                                           style = wx.FULL_REPAINT_ON_RESIZE |
  96.228 +                                                   wx.VSCROLL )
  96.229 +        conflictspanel.SetVirtualSize((1000, 1000))
  96.230 +        conflictspanel.SetScrollRate(5,5)
  96.231 +        self.conflictsboxsizer = wx.BoxSizer(wx.VERTICAL)
  96.232 +
  96.233 +        #self.conflictsboxsizer.Fit(self)
  96.234 +        conflictspanel.SetSizer(self.conflictsboxsizer)
  96.235 +        consvbox = wx.BoxSizer(wx.VERTICAL)
  96.236 +        consvbox.Add(conshdrboxsizer, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
  96.237 +        consvbox.Add(conflictspanel, proportion=1, flag=wx.EXPAND | wx.ALL, border=5)
  96.238 +        self.SetSizer(consvbox)
  96.239 +        self.consvbox = consvbox
  96.240 +        self.conflictspanel=conflictspanel
  96.241 +
  96.242 +        self.cmenu = wx.Menu()
  96.243 +        self.cmenu.Append(self.ID_CONSRENAME, "Rename Run-time Exclusion Rule", "Rename Run-time Exclusion Rule")
  96.244 +        self.cmenu.AppendSeparator()
  96.245 +        self.cmenu.Append(self.ID_CONSDEL,    "Delete Run-time Exclusion Rule", "Delete Run-time Exclusion Rule")
  96.246 +        self.Bind(wx.EVT_MENU, self._CSRename, id=self.ID_CONSRENAME)
  96.247 +        self.Bind(wx.EVT_MENU, self._CSDelete, id=self.ID_CONSDEL)
  96.248 +
  96.249 +
  96.250 +    #Helper methods called from anywhere
  96.251 +    def New(self):
  96.252 +        #delete all run-time exclusion rules
  96.253 +        for i in self.conflictsets:
  96.254 +            i.Disable()
  96.255 +            i.Destroy()
  96.256 +        self.conflictsets = []
  96.257 +        self.conflictsboxsizer.Layout()
  96.258 +        size=self.GetSize()
  96.259 +        self.Fit()
  96.260 +        self.SetSize(size)
  96.261 +
  96.262 +
  96.263 +    def DelCSById(self, delid):
  96.264 +        #delete CS representation
  96.265 +        delpos, item = self.GetCSBox(delid)
  96.266 +        if item:
  96.267 +            self.DelCSByItem(item)
  96.268 +
  96.269 +
  96.270 +    def DelCSByItem(self, item):
  96.271 +        #delete CS representation
  96.272 +        self.conflictsets.remove(item)
  96.273 +        exists = self.conflictsboxsizer.Detach(item)
  96.274 +        if exists:
  96.275 +            item.Destroy()
  96.276 +        self.RefreshMe()
  96.277 +
  96.278 +
  96.279 +    def RefreshMe(self):
  96.280 +        size=self.parent.GetSize()
  96.281 +        self.parent.Fit()
  96.282 +        self.parent.SetSize(size)
  96.283 +
  96.284 +
  96.285 +    def GetOrgSelection(self):
  96.286 +        (tree, selection) = GetOrgsSelection()
  96.287 +        if not len(selection):
  96.288 +            dlg = wx.MessageDialog(self, 'You must select first at least one Organization/Department workload!',
  96.289 +                                   'Creating A New Run-time  Rule', wx.OK | wx.ICON_ERROR)
  96.290 +            dlg.ShowModal()
  96.291 +            dlg.Destroy()
  96.292 +            return None,None
  96.293 +        # now rewrite selection (realm.workload extension, check consistency)
  96.294 +        alist = []
  96.295 +        for i in selection:
  96.296 +            if isRealm(i):
  96.297 +                alist.append(tree.GetItemText(i))
  96.298 +            else:
  96.299 +                alist.append(tree.GetItemText(tree.GetItemParent(i))
  96.300 +                            + "." + tree.GetItemText(i))
  96.301 +
  96.302 +            if isRealm(i):
  96.303 +                for j in selection:
  96.304 +                    if tree.GetItemParent(j) == i:
  96.305 +                        violation = ("[ " + tree.GetItemText(i) + ", " +
  96.306 +                                     tree.GetItemText(i) + "." + tree.GetItemText(j) + " ]")
  96.307 +                        dlg = wx.MessageDialog(self,
  96.308 +                                               'Invalid Selection ' + violation + '.\n\n' +
  96.309 +                                               'You can only select EITHER an Organization OR specific Department!',
  96.310 +                                   'Creating A New Run-time Exclusion Rule', wx.OK | wx.ICON_ERROR)
  96.311 +                        dlg.ShowModal()
  96.312 +                        dlg.Destroy()
  96.313 +                        return None,None
  96.314 +        return (alist, selection)
  96.315 +
  96.316 +
  96.317 +    def AddConflict(self, name, types):
  96.318 +        csbox = myCSPanel(self, self.conflictMAX, name, types)
  96.319 +        self.conflictsboxsizer.Add(csbox, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
  96.320 +        self.conflictsets.append(csbox)
  96.321 +        self.conflictMAX = self.conflictMAX+3
  96.322 +        self.RefreshMe()
  96.323 +        csbox.RefreshMe()
  96.324 +
  96.325 +
  96.326 +    def GetCSBox(self, id):
  96.327 +        pos = -1
  96.328 +        i = 0
  96.329 +        while self.conflictsboxsizer.GetItem(i):
  96.330 +            item = self.conflictsboxsizer.GetItem(i).GetWindow()
  96.331 +            if ((item.cbmp.GetId() == id) or
  96.332 +                (item.add_selection.GetId() == id) or
  96.333 +                (item.del_selection.GetId() == id)):
  96.334 +                pos = i
  96.335 +                box = item
  96.336 +                break
  96.337 +            i = i +  1
  96.338 +        if pos < 0:
  96.339 +            print "Run-time Exclusion Rule Not Found ERROR!"
  96.340 +            return (None, None)
  96.341 +        else:
  96.342 +            return (pos, box)
  96.343 +
  96.344 +
  96.345 +    #bind methods
  96.346 +    def _AddNewConflict(self, event):
  96.347 +        # first get the conflicting workload types with current selection
  96.348 +        types, items = self.GetOrgSelection()
  96.349 +        if not types:
  96.350 +            return
  96.351 +        #get name for conflict set
  96.352 +        dlg = wx.TextEntryDialog(
  96.353 +            self, 'Please enter a name for the Run-time Exclusion Rule:', 'Creating A New Run-time Exclusion Rule')
  96.354 +        dlg.SetValue("")
  96.355 +        ret = dlg.ShowModal()
  96.356 +        name = dlg.GetValue()
  96.357 +        dlg.Destroy()
  96.358 +        if ret != wx.ID_OK:
  96.359 +            return
  96.360 +        self.AddConflict(name, types)
  96.361 +
  96.362 +
  96.363 +    def _OnClick(self, event):
  96.364 +        self.event = event
  96.365 +        app.win.SetStatusText("")
  96.366 +        self.PopupMenu(self.cmenu)
  96.367 +
  96.368 +
  96.369 +    def _CSRename(self, event):
  96.370 +        delpos, item = self.GetCSBox(self.event.GetId())
  96.371 +        if not item:
  96.372 +            return
  96.373 +        #allow to name the conflict set
  96.374 +        dlg = wx.TextEntryDialog(
  96.375 +            self, 'Please enter a new name for the Conflict Set:', 'Renaming A Run-time Exclusion Rule')
  96.376 +        dlg.SetValue(item.box.GetLabel())
  96.377 +        ret = dlg.ShowModal()
  96.378 +        name = dlg.GetValue()
  96.379 +        dlg.Destroy()
  96.380 +        if ret != wx.ID_OK:
  96.381 +            return
  96.382 +        item.box.SetLabel(name)
  96.383 +        item.box.SetFont(wx.Font(item.GetFont().GetPointSize(), family=wx.DEFAULT,
  96.384 +                                style=wx.FONTSTYLE_NORMAL, weight=wx.BOLD))
  96.385 +
  96.386 +
  96.387 +    def _CSDelete(self, event):
  96.388 +        delid = self.event.GetId()
  96.389 +        self.DelCSById(delid)
  96.390 +
  96.391 +
  96.392 +    def _AddOrgSelection(self, event):
  96.393 +        addid = event.GetId()
  96.394 +        addpos, item = self.GetCSBox(addid)
  96.395 +        alist, items = self.GetOrgSelection()
  96.396 +        if not alist:
  96.397 +            return
  96.398 +        existing = []
  96.399 +        for i in range(0, item.clb.GetCount()):
  96.400 +            existing.append(item.clb.GetString(i))
  96.401 +
  96.402 +        #now make sure that we don't get realm + workload into the same CS
  96.403 +        for i in items:
  96.404 +            if isRealm(i):
  96.405 +                #ensure no workload of this realm is already in CS
  96.406 +                realm = app.win.orgs.GetItemText(i)
  96.407 +                for j in iterchildren(i):
  96.408 +                    workload = app.win.orgs.GetItemText(j)
  96.409 +                    try:
  96.410 +                        idx = existing.index (realm + "." + workload)
  96.411 +                    except:
  96.412 +                        #ok, does not exist
  96.413 +                        continue
  96.414 +                    #nok, exists already
  96.415 +                    violation = ("[ " + realm + ", " +
  96.416 +                                  realm + "." + workload + " ]")
  96.417 +                    dlg = wx.MessageDialog(self,
  96.418 +                            'Invalid Selection ' + violation + '.\n\n' +
  96.419 +                            'You can only have EITHER an Organization OR a specific Department workload\n' +
  96.420 +                            'in a single Run-time Exclusion Rule',
  96.421 +                            'Adding Orgs/Depts workloads to a Run-time Exclusion Rule',
  96.422 +                            wx.OK | wx.ICON_ERROR)
  96.423 +                    dlg.ShowModal()
  96.424 +                    dlg.Destroy()
  96.425 +                    return
  96.426 +
  96.427 +            else:
  96.428 +                #ensure realm of this workload is not in CS
  96.429 +                realm = app.win.orgs.GetItemText(app.win.orgs.GetItemParent(i))
  96.430 +                try:
  96.431 +                    idx = existing.index(realm)
  96.432 +                except:
  96.433 +                    #ok, does not exist
  96.434 +                    continue
  96.435 +                #nok, exists already
  96.436 +                violation = ("[ " + realm + "." + app.win.orgs.GetItemText(i) +
  96.437 +                                 ", " + realm + " ]")
  96.438 +                dlg = wx.MessageDialog(self,
  96.439 +                            'Invalid Selection ' + violation + '.\n\n' +
  96.440 +                            'You can only have EITHER an Organization OR a specific Department workload\n' +
  96.441 +                            'in a single Run-time Exclusion Rule',
  96.442 +                            'Adding Orgs/Depts workloads to a Run-time Exclusion Rule',
  96.443 +                            wx.OK | wx.ICON_ERROR)
  96.444 +                dlg.ShowModal()
  96.445 +                dlg.Destroy()
  96.446 +                return
  96.447 +        #check if any of the selections are already in the conflict set
  96.448 +        overlap=[]
  96.449 +        for l in alist:
  96.450 +            for e in existing:
  96.451 +                if l == e:
  96.452 +                    overlap.append(str(l))
  96.453 +        if len(overlap):
  96.454 +            if len(overlap) == 1:
  96.455 +                message = "Selected item " + str(overlap) +\
  96.456 +                    " is already in the Run-time Exclusion rule and will be ignored.\n\n Continue?"
  96.457 +            else:
  96.458 +                message = "Selected items " + str(overlap) +\
  96.459 +                    " are already in the Run-time Exclusion rule and will be ignored.\n\n Continue?"
  96.460 +            dlg = wx.MessageDialog(self,
  96.461 +                            message, 'Adding Orgs/Depts workloads to a Run-time Exclusion rule',
  96.462 +                            wx.YES | wx.NO | wx.ICON_EXCLAMATION)
  96.463 +            ret = dlg.ShowModal()
  96.464 +            dlg.Destroy()
  96.465 +            if ret != wx.ID_YES:
  96.466 +                return
  96.467 +
  96.468 +        for s in alist:
  96.469 +            try:
  96.470 +                existing.index(s)
  96.471 +            except Exception:
  96.472 +                # s not yet in list box, add it
  96.473 +                item.AddTypes([s])
  96.474 +        self.RefreshMe()
  96.475 +
  96.476 +
  96.477 +    def _DelConSelection(self, event):
  96.478 +        eventid = event.GetId()
  96.479 +        pos, item = self.GetCSBox(eventid)
  96.480 +        idtuple = item.clb.GetSelections()
  96.481 +        idlist = []
  96.482 +        for i in idtuple:
  96.483 +            idlist.append(i)
  96.484 +        #delete reverse, otherwise item mubers get messed up while deleting
  96.485 +        idlist.reverse()
  96.486 +        for i in idlist:
  96.487 +            item.clb.Delete(i)
  96.488 +        item.RefreshMe()
  96.489 +        if item.clb.GetCount() < 2:
  96.490 +            dlg = wx.MessageDialog(self,
  96.491 +                    """Run-time exclusion set has less than two types.\n\n
  96.492 +                    Do you want to delete this rule?""",
  96.493 +                    'Deleting Orgs/Depts workloads from a Run-time Exclusion rule',
  96.494 +                    wx.YES| wx.NO | wx.ICON_QUESTION)
  96.495 +            ret = dlg.ShowModal()
  96.496 +            dlg.Destroy()
  96.497 +            if ret == wx.ID_YES:
  96.498 +                self.DelCSById(eventid)
  96.499 +            return
  96.500 +        else:
  96.501 +            for i in item.clb.GetSelections():
  96.502 +                item.clb.Deselect(i)
  96.503 +        self.RefreshMe()
  96.504 +
  96.505 +
  96.506 +class myCSPanel(wx.Panel):
  96.507 +    def __init__(self, parent, ID, title, list=[]):
  96.508 +        wx.Panel.__init__(self, parent.conflictspanel, -1)
  96.509 +        self.parent = parent
  96.510 +        cspansizer = wx.BoxSizer(wx.VERTICAL)
  96.511 +        self.box = wx.StaticBox(self, -1, title)
  96.512 +        csboxsizer = wx.StaticBoxSizer(self.box, wx.HORIZONTAL)
  96.513 +        #left: type add/del
  96.514 +        typesizer = wx.BoxSizer(wx.VERTICAL)
  96.515 +        self.add_selection = wx.Button(self, ID+1, "--> Add", style=wx.BU_EXACTFIT)
  96.516 +        self.add_selection.SetToolTipString("Add Workload Selection To Run-time Exclusion rule")
  96.517 +        self.add_selection.SetHelpText(AddToExclusionButtonHelp)
  96.518 +        self.add_selection.SetForegroundColour('MEDIUMBLUE')
  96.519 +        points = self.add_selection.GetFont().GetPointSize()
  96.520 +        addfont = wx.Font(points, family=wx.DEFAULT,
  96.521 +                          style=wx.FONTSTYLE_NORMAL, weight=wx.BOLD)
  96.522 +        self.add_selection.SetFont(addfont)
  96.523 +        self.box.SetFont(addfont)
  96.524 +        typesizer.Add(self.add_selection, proportion = 0, flag = wx.EXPAND | wx.ALL,border=0)
  96.525 +        typesizer.Add((5,5))
  96.526 +        self.del_selection = wx.Button(self, ID+2, "<-- Del", style=wx.BU_EXACTFIT)
  96.527 +        self.del_selection.SetToolTipString("Delete Workload Selection From Run-time Exclusion Rule")
  96.528 +        self.del_selection.SetHelpText(DelFromExclusionButtonHelp)
  96.529 +        self.del_selection.SetForegroundColour('ORANGERED')
  96.530 +        self.del_selection.SetFont(addfont)
  96.531 +        typesizer.Add(self.del_selection, proportion = 0, flag = wx.EXPAND | wx.ALL, border=0)
  96.532 +        csboxsizer.Add(typesizer, proportion = 0, border=0)
  96.533 +        csboxsizer.Add((5,5))
  96.534 +        #middle: types
  96.535 +        self.clb = wx.ListBox(self, id=-1, choices=list,
  96.536 +                              style= wx.LB_MULTIPLE | wx.LB_SORT )
  96.537 +        self.clb.SetHelpText(ExclusionSetHelp)
  96.538 +        csboxsizer.Add(self.clb, proportion=1, flag=wx.EXPAND | wx.ALL, border=0)
  96.539 +        csboxsizer.Add((5,5))
  96.540 +        #right: Conflictset-global ops button
  96.541 +        bmpsizer = wx.BoxSizer(wx.VERTICAL)
  96.542 +        self.cbmp = buttons.GenBitmapButton(self, ID, conflict_bmp, style=wx.BU_EXACTFIT)
  96.543 +        self.cbmp.SetHelpText(ManageExclusionButtonHelp)
  96.544 +        self.cbmp.SetToolTipString("Rename/Delete\nAssociated Run-time Exclusion Rule")
  96.545 +        bmpsizer.Add(self.cbmp, proportion = 0, flag = wx.EXPAND | wx.ALL, border=0)
  96.546 +        csboxsizer.Add(bmpsizer, proportion=0, border=5)
  96.547 +        cspansizer.Add(csboxsizer,  proportion=0, flag=wx.EXPAND | wx.ALL, border=0)
  96.548 +        self.csboxsizer=csboxsizer
  96.549 +        self.cspansizer=cspansizer
  96.550 +        self.SetSizer(cspansizer)
  96.551 +        self.cbmp.Bind(wx.EVT_LEFT_DOWN, parent._OnClick, id=ID)
  96.552 +        self.add_selection.Bind(wx.EVT_BUTTON, parent._AddOrgSelection, id=ID + 1)
  96.553 +        self.del_selection.Bind(wx.EVT_BUTTON, parent._DelConSelection, id=ID + 2)
  96.554 +
  96.555 +    # append and delete an item to get rid of
  96.556 +    # the ugly vertical scroll bar on the Listbox on Linux
  96.557 +    def RefreshMe(self):
  96.558 +        x = self.clb.Append(" ")
  96.559 +        app.win.conspanel.RefreshMe()
  96.560 +        self.clb.Delete(x)
  96.561 +        self.Layout()
  96.562 +        app.win.conspanel.Layout()
  96.563 +
  96.564 +
  96.565 +    def AddTypes(self, list):
  96.566 +        for i in list:
  96.567 +            self.clb.Append(i)
  96.568 +        self.RefreshMe()
  96.569 +
  96.570 +
  96.571 +    def GetTypes(self):
  96.572 +        alist = []
  96.573 +        for i in range(0, self.clb.GetCount()):
  96.574 +            alist.append(self.clb.GetString(i))
  96.575 +        return alist
  96.576 +
  96.577 +
  96.578 +    def GetBoxName(self):
  96.579 +        return self.box.GetLabel()
  96.580 +
  96.581 +
  96.582 +    def Replace(self, oldlabel, newlabel):
  96.583 +        index = self.clb.FindString(oldlabel)
  96.584 +        if index != wx.NOT_FOUND:
  96.585 +            self.clb.SetString(index, newlabel)
  96.586 +
  96.587 +
  96.588 +    def Delete(self, label):
  96.589 +        index = self.clb.FindString(label)
  96.590 +        if index != wx.NOT_FOUND:
  96.591 +            self.clb.Delete(index)
  96.592 +
  96.593 +
  96.594 +class myHelpPanel(wx.Panel):
  96.595 +    def __init__(self, parent, ID):
  96.596 +        wx.Panel.__init__(self, parent, -1)
  96.597 +
  96.598 +
  96.599 +class ezFrame(wx.Frame):
  96.600 +
  96.601 +    ID_ABOUT  = 101
  96.602 +    ID_NEW    = 102
  96.603 +    ID_OPEN   = 103
  96.604 +    ID_SAVE   = 104
  96.605 +    ID_SAVEAS = 105
  96.606 +    ID_EXIT   = 106
  96.607 +    ID_HELP   = 107
  96.608 +
  96.609 +    ID_ITRENAME = 111
  96.610 +    ID_ITADD    = 112
  96.611 +    ID_ITDEL    = 113
  96.612 +
  96.613 +    ID_COLLAPSEALL = 121
  96.614 +    ID_EXPANDALL = 122
  96.615 +    ID_SORTALL = 123
  96.616 +
  96.617 +    ID_TRANSLATE = 131
  96.618 +
  96.619 +    ID_ORGEDT = 141
  96.620 +    ID_ORGADD = 142
  96.621 +    ID_ORGDEL = 143
  96.622 +
  96.623 +    def __init__(self, parent, ID, title):
  96.624 +        global realm_bmp, workload_bmp, conflict_bmp
  96.625 +
  96.626 +        wx.Frame.__init__(self, parent, ID, title,
  96.627 +                         wx.DefaultPosition,
  96.628 +                         wx.Size(700,450)
  96.629 +                          )
  96.630 +
  96.631 +        realm_bmp = GetIconBitmap('Organization')
  96.632 +        workload_bmp = GetIconBitmap('Department')
  96.633 +        conflict_bmp = GetIconBitmap('Conflict')
  96.634 +        self.SetHelpText(GetHelp)
  96.635 +        self.orgfilename = None
  96.636 +        self.CreateStatusBar()
  96.637 +        self.SetStatusText("")
  96.638 +        self.bkg = wx.Panel(self)
  96.639 +
  96.640 +        self.orgswin =  wx.SashLayoutWindow(
  96.641 +            self.bkg, -1, wx.DefaultPosition, (300, 150),wx.SW_3DSASH | wx.SW_BORDER)
  96.642 +
  96.643 +        self.orgswin.SetDefaultSize((300,150))
  96.644 +        self.orgswin.SetOrientation(wx.LAYOUT_VERTICAL)
  96.645 +        self.orgswin.SetAlignment(wx.LAYOUT_LEFT)
  96.646 +        self.orgspanel = OrgsPanel(self.orgswin, -1)
  96.647 +        self.orgs = self.orgspanel.orgs
  96.648 +
  96.649 +        self.realm_menu = wx.Menu()
  96.650 +        self.realm_menu.Append(self.ID_ORGADD, "Add Department\tctrl-a", "Add Department Workload")
  96.651 +        self.realm_menu.AppendSeparator()
  96.652 +        self.realm_menu.AppendSeparator()
  96.653 +        self.realm_menu.Append(self.ID_ORGEDT, "Rename Organization\tctrl-r", "Rename Organization Workload")
  96.654 +        self.realm_menu.Append(self.ID_ORGDEL, "Delete Organization\tctrl-d", "Delete Organization Workload")
  96.655 +        self.realm_menu.Bind(wx.EVT_MENU, self.orgs._OrgEdt, id= self.ID_ORGEDT)
  96.656 +        self.realm_menu.Bind(wx.EVT_MENU, self.orgs._OrgWAdd, id= self.ID_ORGADD)
  96.657 +        self.realm_menu.Bind(wx.EVT_MENU, self._ItemDel, id=self.ID_ORGDEL)
  96.658 +
  96.659 +        self.workload_menu = wx.Menu()
  96.660 +        self.workload_menu.Append(self.ID_ORGEDT, "Rename Department\tctrl-r", "Rename Department Workload")
  96.661 +        self.workload_menu.Append(self.ID_ORGDEL, "Delete Department\tctrl-d", "Delete Department Workload")
  96.662 +        self.workload_menu.Bind(wx.EVT_MENU, self.orgs._OrgEdt, id= self.ID_ORGEDT)
  96.663 +        self.workload_menu.Bind(wx.EVT_MENU, self._ItemDel, id=self.ID_ORGDEL)
  96.664 +
  96.665 +        self.orgs.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self._OrgRightClick)
  96.666 +        self.orgs.Bind(wx.EVT_TREE_SEL_CHANGED, self._OrgSelectionChanged)
  96.667 +
  96.668 +        self.conswin =  wx.SashLayoutWindow(
  96.669 +            self.bkg, -1, wx.DefaultPosition, (300, 150),
  96.670 +            #wx.NO_BORDER | wx.SW_3D
  96.671 +            wx.SW_3DSASH | wx.SW_BORDER
  96.672 +            )
  96.673 +        self.conswin.SetDefaultSize((300,150))
  96.674 +        self.conswin.SetOrientation(wx.LAYOUT_VERTICAL)
  96.675 +        self.conswin.SetAlignment(wx.LAYOUT_RIGHT)
  96.676 +        self.conswin.SetSashVisible(wx.SASH_LEFT, True)
  96.677 +        self.conswin.SetSashVisible(wx.SASH_RIGHT, False)
  96.678 +
  96.679 +        #right tree control for non-concurrent workload execution
  96.680 +        self.conspanel = ConsPanel(self.conswin, -1)
  96.681 +        self.conspanel.RefreshMe()
  96.682 +        self.bkg.Bind(wx.EVT_SASH_DRAGGED_RANGE, self._OnSashDrag, id=self.conswin.GetId(),
  96.683 +                      id2=self.conswin.GetId())
  96.684 +        self.bkg.Bind(wx.EVT_SIZE, self._OnSize)
  96.685 +
  96.686 +        # Main Menu
  96.687 +        #      -File
  96.688 +        fmenu = wx.Menu()
  96.689 +        fmenu.Append(self.ID_OPEN, "Open Workload Definition...\tctrl-o", "Open current workload definition")
  96.690 +        fmenu.Append(self.ID_SAVE, "Save Workload Definition\tctrl-s", "Save workload defintion")
  96.691 +        fmenu.Append(self.ID_SAVEAS, "Save Workload Defintion as...\talt-s", "Save into new file")
  96.692 +        fmenu.AppendSeparator()
  96.693 +        fmenu.Append(self.ID_TRANSLATE, "Save as Xen ACM Security Policy ...\talt-t", "Create Xen ACM security policy")
  96.694 +        fmenu.AppendSeparator()
  96.695 +        fmenu.Append(self.ID_NEW, "New\tctrl-n", "Create a new oganization definition")
  96.696 +        fmenu.AppendSeparator()
  96.697 +        fmenu.Append(self.ID_EXIT, "Exit\tctrl-x", "Terminate the program")
  96.698 +        self.fmenu = fmenu
  96.699 +
  96.700 +        #      -Edit
  96.701 +        emenu = wx.Menu()
  96.702 +        emenu.Append(self.ID_ITRENAME, "Rename\tctrl-r", "Rename Selected Organization/Department")
  96.703 +        emenu.Append(self.ID_ITADD, "Add\tctrl-a", "Add Child to Selected Organization/Department")
  96.704 +        emenu.Append(self.ID_ITDEL, "Delete\tctrl-d", "Delete Selected Organization/Department")
  96.705 +        self.emenu = emenu
  96.706 +        #      -Help
  96.707 +        hmenu = wx.Menu()
  96.708 +        hmenu.Append(self.ID_HELP, "Step-By-Step Help\tctrl-h", "More information about this program")
  96.709 +        hmenu.Append(self.ID_ABOUT, "About", "More information about this program")
  96.710 +        self.hmenu = hmenu
  96.711 +
  96.712 +        #      -View
  96.713 +        vmenu = wx.Menu()
  96.714 +        vmenu.Append(self.ID_SORTALL, "Sort All", "Sort Entries In All Trees")
  96.715 +        vmenu.Append(self.ID_COLLAPSEALL, "Collapse All\tctrl-c", "Collapse All Trees")
  96.716 +        vmenu.Append(self.ID_EXPANDALL, "Expand All\tctrl-e", "Expand All Trees")
  96.717 +        self.vmenu = vmenu
  96.718 +
  96.719 +        menuBar = wx.MenuBar()
  96.720 +        menuBar.Append(fmenu, "&File");
  96.721 +        menuBar.Append(emenu, "&Edit");
  96.722 +        menuBar.Append(vmenu, "&View");
  96.723 +        menuBar.Append(hmenu, "&Help");
  96.724 +
  96.725 +        self.SetMenuBar(menuBar)
  96.726 +
  96.727 +        self.Bind(wx.EVT_MENU, self._OpenSpec,  id=self.ID_OPEN)
  96.728 +        self.Bind(wx.EVT_MENU, self._SaveSpec,  id=self.ID_SAVE)
  96.729 +        self.Bind(wx.EVT_MENU, self._SaveAsSpec,id=self.ID_SAVEAS)
  96.730 +        self.Bind(wx.EVT_MENU, self._NewSpec,   id=self.ID_NEW)
  96.731 +        self.Bind(wx.EVT_MENU, self._TimeToQuit,id=self.ID_EXIT)
  96.732 +        self.Bind(wx.EVT_MENU, self._TranslateSpec, id=self.ID_TRANSLATE)
  96.733 +
  96.734 +        self.Bind(wx.EVT_MENU, self._ItemRename, id=self.ID_ITRENAME)
  96.735 +        self.Bind(wx.EVT_MENU, self._ItemAdd,    id=self.ID_ITADD)
  96.736 +        self.Bind(wx.EVT_MENU, self._ItemDel,    id=self.ID_ITDEL)
  96.737 +
  96.738 +        self.Bind(wx.EVT_MENU, self._SortAll,    id=self.ID_SORTALL)
  96.739 +        self.Bind(wx.EVT_MENU, self._CollapseAll,id=self.ID_COLLAPSEALL)
  96.740 +        self.Bind(wx.EVT_MENU, self._ExpandAll,  id=self.ID_EXPANDALL)
  96.741 +
  96.742 +        self.Bind(wx.EVT_MENU, self._Help, id=self.ID_HELP)
  96.743 +        self.Bind(wx.EVT_MENU, self._OnAbout, id=self.ID_ABOUT)
  96.744 +        self.Bind(wx.EVT_CLOSE, self._TimeToQuit)
  96.745 +
  96.746 +
  96.747 +    def RefreshMe(self):
  96.748 +        size=self.GetSize()
  96.749 +        self.Fit()
  96.750 +        self.SetSize(size)
  96.751 +
  96.752 +    #helper methods
  96.753 +    def Load(self, file):
  96.754 +        self.orgfilename = file
  96.755 +        dictname = 'ezpolicy'
  96.756 +        d = {}
  96.757 +        # read in the config file
  96.758 +        globs = {}
  96.759 +        locs = {}
  96.760 +        execfile(file, globs, locs)
  96.761 +        for (k, v) in locs.items():
  96.762 +            if k == dictname:
  96.763 +                d = v
  96.764 +                break
  96.765 +        dict2org(d)
  96.766 +        self.orgspanel.orgs.UnselectAll()
  96.767 +        self.SetTitle("ezPolicy: " + self.orgfilename)
  96.768 +        self._ExpandAll(None)
  96.769 +
  96.770 +
  96.771 +    def Save(self, file):
  96.772 +        dictname = 'ezpolicy'
  96.773 +        d = org2dict()
  96.774 +        fd = open(file, "w")
  96.775 +        fd.write(dictname + " = ")
  96.776 +        fd.write(str(d))
  96.777 +        fd.close()
  96.778 +
  96.779 +
  96.780 +    def New(self):
  96.781 +        self.orgspanel.orgs.DeleteChildren(self.orgspanel.orgs.GetRootItem())
  96.782 +        self.conspanel.New()
  96.783 +
  96.784 +
  96.785 +    def LabelReplaceInConflictsets(self, item, oldlabel, newlabel):
  96.786 +        if isRealm(item):
  96.787 +            replace = [[ oldlabel, newlabel]]
  96.788 +            for i in iterchildren(item):
  96.789 +                replace.append([(oldlabel + "." + self.orgs.GetItemText(i)),
  96.790 +                                (newlabel + "." + self.orgs.GetItemText(i))])
  96.791 +        else:
  96.792 +            parent = self.orgs.GetItemParent(item)
  96.793 +            replace =   [
  96.794 +                            [(self.orgs.GetItemText(parent) + "." + oldlabel),
  96.795 +                             (self.orgs.GetItemText(parent) + "." + newlabel)]
  96.796 +                        ]
  96.797 +        for r in replace:
  96.798 +            for i in self.conspanel.conflictsets:
  96.799 +                if r[0] in i.GetTypes():
  96.800 +                    i.Replace(r[0], r[1])
  96.801 +
  96.802 +
  96.803 +    def OrgDelItem(self, item):
  96.804 +        label = self.orgs.GetItemText(item)
  96.805 +        if isRealm(item):
  96.806 +            delset = [label]
  96.807 +            for i in iterchildren(item):
  96.808 +                delset.append(label + "." + self.orgs.GetItemText(i))
  96.809 +        else:
  96.810 +            parent = self.orgs.GetItemParent(item)
  96.811 +            delset = [self.orgs.GetItemText(parent) + "." + label]
  96.812 +        for i in self.conspanel.conflictsets:
  96.813 +            for l in delset:
  96.814 +                i.Delete(l)
  96.815 +        #need to run in reverse order when deleting items
  96.816 +        rev = []
  96.817 +        for i in self.conspanel.conflictsets:
  96.818 +            rev.append(i)
  96.819 +        rev.reverse()
  96.820 +        for i in rev:
  96.821 +            if len(i.GetTypes()) < 1:
  96.822 +                self.conspanel.DelCSByItem(i)
  96.823 +        self.orgs.Delete(item)
  96.824 +
  96.825 +
  96.826 +    def _OnSashDrag(self, event):
  96.827 +        if event.GetDragStatus() == wx.SASH_STATUS_OUT_OF_RANGE:
  96.828 +            return
  96.829 +        w = event.GetEventObject()
  96.830 +        if w is self.conswin:
  96.831 +            self.conswin.SetDefaultSize((event.GetDragRect().width, 1000))
  96.832 +        wx.LayoutAlgorithm().LayoutWindow(self.bkg, self.orgswin)
  96.833 +        self.RefreshMe()
  96.834 +
  96.835 +
  96.836 +    def _OnSize(self, event):
  96.837 +        wx.LayoutAlgorithm().LayoutWindow(self.bkg, self.orgswin)
  96.838 +
  96.839 +
  96.840 +    def _OrgSelectionChanged(self, event):
  96.841 +        self.orgs.event = event
  96.842 +        item = self.orgs.event.GetItem()
  96.843 +        if not item.IsOk() or not self.orgs.IsSelected(item):
  96.844 +            self.emenu.Enable(self.ID_ITRENAME, False)
  96.845 +            self.emenu.Enable(self.ID_ITADD, False)
  96.846 +            self.emenu.Enable(self.ID_ITDEL, False)
  96.847 +            return
  96.848 +        self.SetStatusText("")
  96.849 +        #enable/disable edit menu functions
  96.850 +        if isRealm(item):
  96.851 +            self.emenu.Enable(self.ID_ITRENAME, True)
  96.852 +            self.emenu.Enable(self.ID_ITADD, True)
  96.853 +            self.emenu.Enable(self.ID_ITDEL, True)
  96.854 +        elif isWorkload(item):
  96.855 +            self.emenu.Enable(self.ID_ITRENAME, True)
  96.856 +            self.emenu.Enable(self.ID_ITADD, False)
  96.857 +            self.emenu.Enable(self.ID_ITDEL, True)
  96.858 +        if len(self.orgs.GetSelections()) > 1:
  96.859 +            self.emenu.Enable(self.ID_ITRENAME, False)
  96.860 +            self.emenu.Enable(self.ID_ITADD, False)
  96.861 +
  96.862 +
  96.863 +    def _OrgRightClick(self, event):
  96.864 +        self.SetStatusText("")
  96.865 +        self.orgs.event = event
  96.866 +        item = self.orgs.event.GetItem()
  96.867 +        #del not permitted on root items
  96.868 +        if isWorkload(item):
  96.869 +            self.workload_menu.Enable(self.ID_ORGDEL, True)
  96.870 +            self.workload_menu.Enable(self.ID_ORGEDT, True)
  96.871 +            if len(self.orgs.GetSelections()) > 1:
  96.872 +                self.workload_menu.Enable(self.ID_ORGEDT, False)
  96.873 +            self.PopupMenu(self.workload_menu)
  96.874 +        else:
  96.875 +            self.realm_menu.Enable(self.ID_ORGDEL, True)
  96.876 +            self.realm_menu.Enable(self.ID_ORGEDT, True)
  96.877 +            self.realm_menu.Enable(self.ID_ORGADD, True)
  96.878 +            if len(self.orgs.GetSelections()) > 1:
  96.879 +                self.realm_menu.Enable(self.ID_ORGEDT, False)
  96.880 +                self.realm_menu.Enable(self.ID_ORGADD, False)
  96.881 +            self.PopupMenu(self.realm_menu)
  96.882 +
  96.883 +
  96.884 +    def _OpenSpec(self, event):
  96.885 +        filediag = wx.FileDialog(self, defaultFile="myspec.wld",
  96.886 +                                wildcard="*.wld", style=wx.OPEN | wx.OVERWRITE_PROMPT,
  96.887 +                                message="Select Workload Definition file name")
  96.888 +        ret = filediag.ShowModal()
  96.889 +        name = filediag.GetPath()
  96.890 +        filediag.Destroy()
  96.891 +        if ret not in [wx.ID_OK]:
  96.892 +            return
  96.893 +        self.orgfilename = name
  96.894 +        self.Load(self.orgfilename)
  96.895 +        self.SetTitle("ezPolicy: " + self.orgfilename)
  96.896 +
  96.897 +
  96.898 +    def _SaveSpec(self, event):
  96.899 +        if not self.orgfilename:
  96.900 +            filediag = wx.FileDialog(self, defaultFile="myspec.wld",
  96.901 +                                    wildcard="*.wld", style=wx.SAVE | wx.OVERWRITE_PROMPT,
  96.902 +                                    message="Select Workload Definition file name")
  96.903 +            ret = filediag.ShowModal()
  96.904 +            name = filediag.GetPath()
  96.905 +            filediag.Destroy()
  96.906 +            if ret not in [wx.ID_OK]:
  96.907 +                return
  96.908 +            self.orgfilename = name
  96.909 +        self.Save(self.orgfilename)
  96.910 +        self.SetTitle("ezPolicy: " + self.orgfilename)
  96.911 +
  96.912 +
  96.913 +    def _SaveAsSpec(self, event):
  96.914 +        if not self.orgfilename:
  96.915 +            self.orgfilename = "DEFAULT.wld"
  96.916 +        filediag = wx.FileDialog(self, defaultFile=self.orgfilename,
  96.917 +                                wildcard="*.wld", style=wx.SAVE | wx.OVERWRITE_PROMPT,
  96.918 +                                message="Select Workload Definition file name")
  96.919 +        ret = filediag.ShowModal()
  96.920 +        name = filediag.GetPath()
  96.921 +        filediag.Destroy()
  96.922 +        if ret not in [wx.ID_OK]:
  96.923 +            return
  96.924 +        self.orgfilename = name
  96.925 +        self.Save(self.orgfilename)
  96.926 +        self.SetTitle("ezPolicy: " + self.orgfilename)
  96.927 +
  96.928 +
  96.929 +    def _NewSpec(self, event):
  96.930 +        self.orgfilename = None
  96.931 +        #reset trees etc
  96.932 +        self.New()
  96.933 +        self.SetTitle("ezPolicy: *New File*")
  96.934 +
  96.935 +
  96.936 +    def _TranslateSpec(self, event):
  96.937 +        policyname = transInfo()
  96.938 +        if not policyname:
  96.939 +            return
  96.940 +        path="/etc/xen/acm-security/policies/"
  96.941 +        nameparts=string.split(policyname, ".")
  96.942 +        if len(nameparts) > 1:
  96.943 +            path = path + "/".join(nameparts[0:len(nameparts)-1])
  96.944 +        deffile = nameparts[len(nameparts) - 1] + "-security_policy.xml"
  96.945 +        filediag = wx.FileDialog(self, defaultDir=path, defaultFile=deffile,
  96.946 +                                wildcard="*.xml", message="Select Policy File Name",
  96.947 +                                style=wx.SAVE | wx.OVERWRITE_PROMPT)
  96.948 +        ret = filediag.ShowModal()
  96.949 +        filename = filediag.GetPath()
  96.950 +        filediag.Destroy()
  96.951 +        if ret not in [wx.ID_OK]:
  96.952 +            return
  96.953 +        #translate data into default policy
  96.954 +        timestamp = time.asctime()
  96.955 +        d = org2dict()
  96.956 +        types = []
  96.957 +        for i in d['orgs']:
  96.958 +            types.append(str(i[0]))
  96.959 +            for j in i[1]:
  96.960 +                types.append(str(i[0]) + "." + str(j))
  96.961 +        f = open(filename, "w")
  96.962 +        printPolicyHeader (f, policyname, timestamp)
  96.963 +        printPolicy(f, types, d['cons'])
  96.964 +        printLabels(f, d, types)#, d['cons'])
  96.965 +        printTrailer(f)
  96.966 +        f.close()
  96.967 +
  96.968 +
  96.969 +    def _ItemRename(self, event):
  96.970 +        #ensure only 1 item is selected
  96.971 +        sels = self.orgs.GetSelections()
  96.972 +        if len(sels) != 1:
  96.973 +            return
  96.974 +        self.orgs.OrgEdt(sels[0])
  96.975 +
  96.976 +
  96.977 +    def _ItemAdd(self, event):
  96.978 +        #ensure only 1 item is selected + add figure
  96.979 +        sels = self.orgs.GetSelections()
  96.980 +        if len(sels) != 1:
  96.981 +            return
  96.982 +        self.orgs.OrgWAdd(sels[0])
  96.983 +
  96.984 +
  96.985 +    def _ItemDel(self, event):
  96.986 +        sels = self.orgs.GetSelections()
  96.987 +        for i in sels:
  96.988 +            self.OrgDelItem(i)
  96.989 +
  96.990 +
  96.991 +    def _CollapseAll(self, event):
  96.992 +        for i in iterchildren(self.orgs.GetRootItem()):
  96.993 +            self.orgs.Collapse(i)
  96.994 +
  96.995 +
  96.996 +    def _ExpandAll(self, event):
  96.997 +        for i in iterchildren(self.orgs.GetRootItem()):
  96.998 +            self.orgs.Expand(i)
  96.999 +
 96.1000 +
 96.1001 +    def _SortAll(self, event):
 96.1002 +        #would be nice to also sort the organizations
 96.1003 +        for i in iterchildren(self.orgs.GetRootItem()):
 96.1004 +            if self.orgs.GetChildrenCount(i) > 0:
 96.1005 +                self.orgs.SortChildren(i)
 96.1006 +
 96.1007 +
 96.1008 +    def _OnAbout(self, event):
 96.1009 +        dlg = wx.MessageDialog(self,
 96.1010 +                               "This program helps you to define the structure\n"
 96.1011 +                               "of organizations and their departments.\n\n"
 96.1012 +                               "It translates this \'Workload Definition\' into\n"
 96.1013 +                               "a simple workload protection policy for the\n"
 96.1014 +                               "Xen Access Control Module.\n\n\n"
 96.1015 +                               "Copyright (c) 2006: IBM Corporation\n"
 96.1016 +                               "Author:\nReiner Sailer <sailer@us.ibm.com>",
 96.1017 +                              "About Me", wx.OK | wx.ICON_INFORMATION)
 96.1018 +        dlg.ShowModal()
 96.1019 +        dlg.Destroy()
 96.1020 +
 96.1021 +
 96.1022 +    def _Help(self, event):
 96.1023 +        hpopup = wx.Frame(self,-1, "HELP: Creating a Xen Security Policy in 3 Steps" )
 96.1024 +        HelpHtmlWindow(hpopup, -1)
 96.1025 +        hpopup.SetSize((650,650))
 96.1026 +        hpopup.Show(True)
 96.1027 +
 96.1028 +
 96.1029 +    def _TimeToQuit(self, event):
 96.1030 +        self.Bind(wx.EVT_CLOSE, None)
 96.1031 +        self.orgs.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, None)
 96.1032 +        self.orgs.Bind(wx.EVT_TREE_SEL_CHANGED, None)
 96.1033 +        self.Close(True)
 96.1034 +
 96.1035 +
 96.1036 +class ezApp(wx.App):
 96.1037 +
 96.1038 +    def OnInit(self):
 96.1039 +        self.win = ezFrame(None, -1, title="EZ Workload Protection Policy Tool")
 96.1040 +        self.win.Show(True)
 96.1041 +        self.SetTopWindow(self.win)
 96.1042 +        return True
 96.1043 +
 96.1044 +
 96.1045 +    def Load(self, file):
 96.1046 +        self.win.Load(file)
 96.1047 +
 96.1048 +
 96.1049 +    def New(self):
 96.1050 +        self.win.New()
 96.1051 +
 96.1052 +
 96.1053 +def isRealm(it):
 96.1054 +    if not it:
 96.1055 +        return False
 96.1056 +    return (app.win.orgspanel.orgs.GetItemParent(it) == app.win.orgspanel.orgs.GetRootItem())
 96.1057 +
 96.1058 +
 96.1059 +def isWorkload(it):
 96.1060 +    if not it or not app.win.orgs.GetItemParent(it):
 96.1061 +        return False
 96.1062 +    return (app.win.orgspanel.orgs.GetItemParent(app.win.orgspanel.orgs.GetItemParent(it))
 96.1063 +            == app.win.orgspanel.orgs.GetRootItem())
 96.1064 +
 96.1065 +
 96.1066 +def GetOrgsSelection():
 96.1067 +        return (app.win.orgspanel.orgs, app.win.orgspanel.orgs.GetSelections())
 96.1068 +
 96.1069 +
 96.1070 +def transInfo():
 96.1071 +    info = wx.TextEntryDialog(app.win, message="POLICYNAME",
 96.1072 +                              caption="Translate: Creating The Xen/ACM Policy")
 96.1073 +    ret = info.ShowModal()
 96.1074 +    name = info.GetValue()
 96.1075 +    info.Destroy()
 96.1076 +    if ret in [wx.ID_OK]:
 96.1077 +        return name
 96.1078 +    return None
 96.1079 +
 96.1080 +
 96.1081 +def iterchildren(node):
 96.1082 +    cid, citem = app.win.orgspanel.orgs.GetFirstChild(node)
 96.1083 +    while cid.IsOk():
 96.1084 +        yield cid
 96.1085 +        cid, citem = app.win.orgspanel.orgs.GetNextChild(node, citem)
 96.1086 +
 96.1087 +
 96.1088 +def dict2org(d):
 96.1089 +    # release old structure
 96.1090 +    app.New()
 96.1091 +    # fill them with dict content
 96.1092 +    for i in d['orgs']:
 96.1093 +        orgnode = app.win.orgspanel.orgs.AppendItem(app.win.orgspanel.orgs.GetRootItem(), text=i[0])
 96.1094 +        app.win.orgspanel.orgs.SetItemBold(orgnode, True)
 96.1095 +        app.win.orgspanel.orgs.SetItemImage(orgnode, realm_icon, wx.TreeItemIcon_Normal)
 96.1096 +        for j in i[1]:
 96.1097 +            wlnode = app.win.orgspanel.orgs.AppendItem(orgnode, text=j)
 96.1098 +            app.win.orgspanel.orgs.SetItemImage(wlnode, workload_icon, wx.TreeItemIcon_Normal)
 96.1099 +    for i in d['cons']:
 96.1100 +        app.win.conspanel.AddConflict(i[0], i[1])
 96.1101 +
 96.1102 +
 96.1103 +def org2dict():
 96.1104 +    global app
 96.1105 +    dic = {}
 96.1106 +    o= []
 96.1107 +    for i in iterchildren(app.win.orgs.GetRootItem()):
 96.1108 +        d = []
 96.1109 +        for j in iterchildren(i):
 96.1110 +            d.append(str(app.win.orgspanel.orgs.GetItemText(j)))
 96.1111 +        o.append([str(app.win.orgspanel.orgs.GetItemText(i)) , d])
 96.1112 +    dic['orgs'] = o
 96.1113 +    c=[]
 96.1114 +    for i in app.win.conspanel.conflictsets:
 96.1115 +        c.append([i.GetBoxName() , i.GetTypes()])
 96.1116 +    dic['cons'] = c
 96.1117 +    return dic
 96.1118 +
 96.1119 +
 96.1120 +def dict_read(dictname, filename):
 96.1121 +    """Loads <filename> and returns the dictionary named <dictname> from
 96.1122 +       the file.
 96.1123 +    """
 96.1124 +    dic = {}
 96.1125 +
 96.1126 +    # read in the config file
 96.1127 +    globs = {}
 96.1128 +    locs = {}
 96.1129 +    execfile(filename, globs, locs)
 96.1130 +
 96.1131 +    for (k, v) in locs.items():
 96.1132 +        if k == dictname:
 96.1133 +            dic = v
 96.1134 +            break
 96.1135 +    return dic
 96.1136 +
 96.1137 +#==================== Policy Generation/Translation functions
 96.1138 +
 96.1139 +def printPolicyHeader (fd, policyname, timestamp):
 96.1140 +    fd.write( """<?xml version=\"1.0\" encoding=\"UTF-8\"?>
 96.1141 +<!-- Auto-generated by ezPolicy        -->
 96.1142 +<SecurityPolicyDefinition xmlns=\"http://www.ibm.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.ibm.com ../../security_policy.xsd \">
 96.1143 +    <PolicyHeader>
 96.1144 +        <PolicyName>%s</PolicyName>
 96.1145 +        <Date>%s</Date>
 96.1146 +    </PolicyHeader>
 96.1147 +""" % (policyname, timestamp))
 96.1148 +
 96.1149 +
 96.1150 +
 96.1151 +def printPolicy(fd, types, cons):
 96.1152 +    fd.write("""
 96.1153 +    <SimpleTypeEnforcement>
 96.1154 +        <SimpleTypeEnforcementTypes>
 96.1155 +            <Type>SystemManagement</Type>\n""")
 96.1156 +
 96.1157 +    # add dynamically created type definitions org.dept
 96.1158 +    for i in types:
 96.1159 +        fd.write("""            <Type>%s</Type>\n""" % i)
 96.1160 +
 96.1161 +    fd.write("""        </SimpleTypeEnforcementTypes>
 96.1162 +    </SimpleTypeEnforcement>
 96.1163 +
 96.1164 +    <ChineseWall priority="PrimaryPolicyComponent">
 96.1165 +        <ChineseWallTypes>
 96.1166 +            <Type>SystemManagement</Type>\n""")
 96.1167 +
 96.1168 +    #add dinamically created cw types
 96.1169 +    for i in types:
 96.1170 +        fd.write("""            <Type>%s</Type>\n""" % i)
 96.1171 +
 96.1172 +    fd.write("""        </ChineseWallTypes>\n\n""")
 96.1173 +
 96.1174 +    if len(cons):
 96.1175 +        fd.write("""        <ConflictSets>\n""")
 96.1176 +        for i in cons:
 96.1177 +            if len(i[1]) < 2:
 96.1178 +                print "Ignoring Run-time exclusion set %s (less than 2 types}" % i[0]
 96.1179 +                continue
 96.1180 +            #name is optional but must be set
 96.1181 +            if i[0]:
 96.1182 +                rer_name = str(i[0])
 96.1183 +            else:
 96.1184 +                rer_name = str("RER")
 96.1185 +            fd.write("""            <Conflict name=\"%s\">\n""" % rer_name)
 96.1186 +            for j in i[1]:
 96.1187 +                fd.write("""                <Type>%s</Type>\n""" % str(j))
 96.1188 +            fd.write("""            </Conflict>\n""")
 96.1189 +        fd.write("""       </ConflictSets>\n""")
 96.1190 +
 96.1191 +    fd.write("""    </ChineseWall>\n\n""")
 96.1192 +
 96.1193 +
 96.1194 +
 96.1195 +def printLabels(fd, d, types): #, cons):
 96.1196 +    fd.write( """    <SecurityLabelTemplate>
 96.1197 +        <SubjectLabels bootstrap=\"SystemManagement\">""")
 96.1198 +
 96.1199 +    # create default boot label for dom0
 96.1200 +    fd.write("""\n            <VirtualMachineLabel>
 96.1201 +                <Name>SystemManagement</Name>
 96.1202 +                <SimpleTypeEnforcementTypes>
 96.1203 +                    <Type>SystemManagement</Type>\n""")
 96.1204 +    # add dynamically created type definitions org.dept
 96.1205 +    for i in types:
 96.1206 +        fd.write("""                    <Type>%s</Type>\n""" % i)
 96.1207 +
 96.1208 +    fd.write("""                </SimpleTypeEnforcementTypes>
 96.1209 +                <ChineseWallTypes>
 96.1210 +                    <Type>SystemManagement</Type>
 96.1211 +                </ChineseWallTypes>
 96.1212 +            </VirtualMachineLabel>\n""")
 96.1213 +
 96.1214 +    # create one Udom label for each type ste type
 96.1215 +    for i in d['orgs']:
 96.1216 +        organization = i[0]
 96.1217 +        fd.write("""\n            <VirtualMachineLabel>
 96.1218 +                <Name>%s</Name>
 96.1219 +                <SimpleTypeEnforcementTypes>
 96.1220 +                    <Type>%s</Type>
 96.1221 +                </SimpleTypeEnforcementTypes>
 96.1222 +                <ChineseWallTypes>
 96.1223 +                    <Type>%s</Type>
 96.1224 +                </ChineseWallTypes>
 96.1225 +            </VirtualMachineLabel>\n""" % (organization, organization, organization))
 96.1226 +        for j in i[1]:
 96.1227 +            workload = organization + "." + j
 96.1228 +            fd.write("""\n            <VirtualMachineLabel>
 96.1229 +                <Name>%s</Name>
 96.1230 +                <SimpleTypeEnforcementTypes>
 96.1231 +                    <Type>%s</Type>
 96.1232 +                </SimpleTypeEnforcementTypes>
 96.1233 +                <ChineseWallTypes>
 96.1234 +                    <Type>%s</Type>
 96.1235 +                    <Type>%s</Type>
 96.1236 +                </ChineseWallTypes>
 96.1237 +            </VirtualMachineLabel>\n""" % (workload, workload, organization , workload))
 96.1238 +
 96.1239 +    fd.write("""        </SubjectLabels>\n\n""")
 96.1240 +
 96.1241 +    #create resource labels for each type
 96.1242 +    fd.write("""        <ObjectLabels>""")
 96.1243 +    for i in ['SystemManagement'] + types:
 96.1244 +        fd.write("""\n            <ResourceLabel>
 96.1245 +                <Name>%s</Name>
 96.1246 +                <SimpleTypeEnforcementTypes>
 96.1247 +                    <Type>%s</Type>
 96.1248 +                </SimpleTypeEnforcementTypes>
 96.1249 +            </ResourceLabel>\n""" % (i, i))
 96.1250 +    fd.write("""        </ObjectLabels>
 96.1251 +    </SecurityLabelTemplate>\n""")
 96.1252 +
 96.1253 +def printTrailer(fd):
 96.1254 +    fd.write( """</SecurityPolicyDefinition>\n""")
 96.1255 +
 96.1256 +#============== the icons/bitmaps ======================================
 96.1257 +# to ensure the program runs anywhere, we include the buttons right here
 96.1258 +# while this makes the file even bigger, it also makes it easier to use
 96.1259 +import cStringIO
 96.1260 +
 96.1261 +def GetIconBitmap(name):
 96.1262 +    return wx.BitmapFromImage(GetIconImage(name))
 96.1263 +
 96.1264 +def GetIconImage(name):
 96.1265 +    if name == 'Organization':
 96.1266 +        iostream = cStringIO.StringIO(GetOrganizationIconData())
 96.1267 +    elif name == 'Department':
 96.1268 +        iostream = cStringIO.StringIO(GetDepartmentIconData())
 96.1269 +    elif name == 'Conflict':
 96.1270 +        iostream = cStringIO.StringIO(GetConflictIconData())
 96.1271 +    else:
 96.1272 +        sys.exit("UNKNOWN ICON NAME")
 96.1273 +    return wx.ImageFromStream(iostream)
 96.1274 +
 96.1275 +def GetOrganizationIconData():
 96.1276 +    return \
 96.1277 +'\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\
 96.1278 +\x00\x00\x00\x10\x00\x00\x00\x11\x08\x02\x00\x00\x00\x5b\xcd\xbb\
 96.1279 +\x93\x00\x00\x00\x03\x73\x42\x49\x54\x08\x08\x08\xdb\xe1\x4f\xe0\
 96.1280 +\x00\x00\x02\x7b\x49\x44\x41\x54\x28\x91\x5d\xd1\xcb\x4f\x13\x51\
 96.1281 +\x14\x06\xf0\x73\x1f\x74\x3a\x33\x9d\x96\x87\x0a\x14\x30\x3c\xd4\
 96.1282 +\x60\x34\xf1\xb1\x70\xa5\x26\x2e\xfc\x87\x4d\xdc\x18\x17\x26\x08\
 96.1283 +\x26\x44\x01\xc1\x07\x10\x52\x1e\x96\xb6\x94\x4a\x87\x0e\x33\x73\
 96.1284 +\xef\xdc\x7b\xcf\x71\x01\x31\x81\x6f\x73\x36\xe7\xb7\xf8\xf2\x31\
 96.1285 +\x22\x82\xab\x50\x51\x68\xa5\xd2\x6e\x77\xbf\xdd\xf8\x36\x52\x1b\
 96.1286 +\x5f\x78\xfc\xc6\x0f\x6b\x70\x3d\xf2\xea\x97\x28\x8e\xbb\xfd\x7e\
 96.1287 +\xd7\xb9\xb4\x3e\xe9\xe3\x99\x1d\x34\x3f\x34\xb9\xaa\x2f\xbe\x0d\
 96.1288 +\x2a\xa3\x8c\xb1\xff\x80\x5f\x1e\x63\x4c\x9a\x1e\x23\xaa\x24\xd1\
 96.1289 +\x8c\x91\xe0\xae\x04\xb1\xed\x7e\x6a\xff\x7e\x7f\x11\xb7\x01\xe8\
 96.1290 +\x26\x90\x52\x02\x98\x30\xac\xf8\x7e\x95\x88\x13\x5a\x0e\x4e\xe0\
 96.1291 +\xb9\xe9\x6f\xf5\xbb\x87\x5a\x17\x37\x01\xe7\x1c\x00\x38\x37\x9e\
 96.1292 +\x87\x9c\x91\xb3\xce\x21\x2f\xc8\x4b\xac\xec\xf5\xf6\x76\xd7\xdf\
 96.1293 +\xa9\x6c\x70\xad\x03\x00\x30\xc6\x6b\x35\x19\x86\x5c\x48\x42\x59\
 96.1294 +\x71\xd1\x3d\x88\x26\x82\x68\x8a\xf4\xa0\x68\x7f\x69\xed\xc0\x9d\
 96.1295 +\xb9\xd7\x41\xf5\xf6\x15\x50\x2a\x07\x60\xe5\xb2\x04\x00\x6b\x1d\
 96.1296 +\x56\x67\x71\x68\xbc\x67\x43\xe3\xa2\x49\x8c\xcb\x10\xe7\xad\xa5\
 96.1297 +\x53\x80\x5b\xb3\xaf\xa4\x52\x79\x9e\x0f\x8c\x4d\x01\xdc\x25\xb6\
 96.1298 +\x08\x27\x38\xaa\xb9\x3b\x4a\xb4\x13\x30\x02\x69\xc0\x1c\xc7\x9e\
 96.1299 +\xea\x2c\x1f\x1b\x23\x9b\xad\x46\xaa\xce\x53\x60\x7e\x09\xa7\x2e\
 96.1300 +\x81\xc3\xf6\x05\x58\xc7\x12\x2c\x45\x1e\x17\x45\xce\x19\x32\x42\
 96.1301 +\x61\xbb\x67\xad\x75\x79\xd0\x69\x9f\x23\x0e\xc0\x1f\x2e\xb3\x67\
 96.1302 +\x00\x00\x80\x04\x85\x25\x72\x56\x7a\xa1\xc7\x32\x61\x33\xb8\x1a\
 96.1303 +\x97\xca\xc1\xa8\x74\xa2\xd2\xd3\x8a\x0b\xc8\x0c\x68\xa5\x8c\xb1\
 96.1304 +\x8e\x0d\x21\x22\x3a\xc7\x3c\xe9\x51\x21\x51\x01\x21\x00\x38\xe4\
 96.1305 +\x95\xb1\xfb\x7c\xb8\x12\x0a\x00\xb2\x46\x19\x6c\xfd\x39\xdc\xda\
 96.1306 +\xda\x56\xca\x5c\x6e\x6f\xb4\x4e\xe2\x93\xbf\x49\xac\x8d\x23\x00\
 96.1307 +\xc7\x82\x70\x64\x5a\xd6\xc2\x00\x6d\x47\x08\x40\x12\x8d\x9d\x5f\
 96.1308 +\x5f\x77\xe2\xdb\x33\x73\x51\x89\x98\x60\x71\xaf\xf9\xf3\x70\xa5\
 96.1309 +\x99\x1c\x3c\x19\xe3\xf5\x9a\x57\x1d\x1e\xf5\x82\x31\x59\xe8\x84\
 96.1310 +\x9b\x6c\x38\x08\x98\xc7\xb2\x76\x7a\xd2\xcf\x38\xc0\xf3\x49\xe6\
 96.1311 +\x97\x82\xc1\xc9\xd2\x86\x5b\xdf\x3f\x75\x8d\x01\x3d\xb9\x55\x79\
 96.1312 +\x51\xf2\x26\x84\x2f\x3f\xaf\x7d\x0c\xfd\xe0\xe9\xdd\xa7\xbe\x70\
 96.1313 +\xdb\x1d\x1f\x31\x16\x9c\xcd\x4f\x8d\x29\xad\x3b\x71\x13\x88\x72\
 96.1314 +\x8d\x22\xa2\x8d\x63\xdd\xef\x37\xa2\xf9\x16\xdf\x6d\x6f\x4a\x91\
 96.1315 +\xf9\x43\xae\x1a\xf9\x82\x0b\x21\xf8\x45\x9a\x69\x5d\x74\xba\xa7\
 96.1316 +\x44\x90\xb7\x1c\x9d\x1b\x8c\x2d\xa5\xf4\xeb\xa8\xb9\x77\xb4\x2f\
 96.1317 +\x1f\xd5\x17\xbf\x6f\xad\x2d\xaf\xad\x3e\x9c\x78\x50\xaf\x08\xa5\
 96.1318 +\xcc\xee\xee\xfe\x4e\x63\x73\xe5\xc7\xea\x41\xe3\xf8\x0e\x8a\x97\
 96.1319 +\xf7\x66\x92\x3c\xa9\x4f\x4f\x64\xa5\xb9\x87\x0b\x8b\xff\x00\x63\
 96.1320 +\xce\x84\xe6\xf7\x5b\x7e\xce\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
 96.1321 +\x42\x60\x82'
 96.1322 +
 96.1323 +def GetDepartmentIconData():
 96.1324 +    return \
 96.1325 +'\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\
 96.1326 +\x00\x00\x00\x10\x00\x00\x00\x11\x08\x06\x00\x00\x00\xd4\xaf\x2c\
 96.1327 +\xc4\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\
 96.1328 +\x88\x00\x00\x01\x52\x49\x44\x41\x54\x38\x8d\xd5\x92\x3d\x4b\x42\
 96.1329 +\x61\x18\x86\xaf\xf3\xfa\xfa\x81\xa9\x58\x48\x60\x08\x49\xd2\x26\
 96.1330 +\xb4\x37\x4a\x14\x6d\x6d\x42\x42\x7f\x20\x68\xae\x31\x28\xff\x85\
 96.1331 +\x83\xd0\x90\x05\x0d\x6d\x0d\xd2\x2a\x89\x24\x48\xb8\x85\x49\x1a\
 96.1332 +\x48\x87\xd4\xca\x93\xbe\xd4\x69\x38\x39\x1c\xa8\x34\x1a\xa2\x7b\
 96.1333 +\xbb\x79\xb8\xaf\x87\xe7\x43\x0b\x2f\x6c\xad\x05\x23\x4b\x39\x4d\
 96.1334 +\x38\x5d\xe6\xdb\x80\x9b\xab\xd3\x7a\xaf\x96\x99\x65\x4c\xc9\xfb\
 96.1335 +\x97\xd9\xdc\x43\xb3\xef\x82\x3e\xaf\xc6\x2d\x4a\x9b\x33\xc7\x0d\
 96.1336 +\x03\x48\x25\xa3\x4e\x25\x86\x0d\x0d\xbc\x8e\x8e\xff\x28\x95\x3a\
 96.1337 +\x70\x08\x21\x01\x0e\xcb\xe5\x5a\xb6\x52\xd9\xfe\x12\x60\x73\xa6\
 96.1338 +\x62\x7f\xae\x3a\x15\xf5\xf8\x52\x00\x8d\x6e\x97\xc5\x40\xe0\x32\
 96.1339 +\x0b\xdb\x00\x3e\x9f\xf0\xa4\xd3\x33\x9b\x5e\xaf\x70\x01\xe4\xf3\
 96.1340 +\x9d\xb6\x1d\xf0\xd6\x67\x3d\xe4\x60\xfa\xc3\xb6\x0d\x03\xb7\x10\
 96.1341 +\xc3\xaa\xd8\xd9\x99\x3c\x49\x24\x3c\xab\x00\xdd\xae\xc2\x30\x1e\
 96.1342 +\xaf\xed\x80\xef\xe5\x4e\x26\xf5\x95\x58\x4c\x07\xa0\x50\x80\x60\
 96.1343 +\x10\xc4\x88\xd0\x48\xfd\x1a\x30\x72\x84\x62\x24\x12\x9b\xdf\xdd\
 96.1344 +\x3d\x33\x95\x12\x26\x7b\xda\x8f\x00\xe7\x42\x70\x1c\x8f\x07\x34\
 96.1345 +\x29\x97\x91\x12\xd0\x00\xfb\x9b\x7c\x0b\xd0\xc3\x61\x5a\xa1\x90\
 96.1346 +\x65\x06\x03\xcc\x4f\x5e\xec\xef\x97\xf8\xcf\x01\x4f\x4f\xd4\x25\
 96.1347 +\xbd\xea\x05\x4a\xb7\xee\xdb\xab\x3e\x17\x5a\xad\x89\xa0\xdb\x0d\
 96.1348 +\x40\x43\x08\x0d\xbf\xdf\xda\xbd\x52\x14\x8b\x26\x77\x4d\x2b\x5c\
 96.1349 +\x2a\xa1\x67\x32\x6c\xbc\x03\x17\xdb\x6e\x97\x68\x69\xf7\x4f\x00\
 96.1350 +\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82'
 96.1351 +
 96.1352 +def GetConflictIconData():
 96.1353 +    return \
 96.1354 +'\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\
 96.1355 +\x00\x00\x00\x10\x00\x00\x00\x10\x08\x02\x00\x00\x00\x90\x91\x68\
 96.1356 +\x36\x00\x00\x00\x03\x73\x42\x49\x54\x08\x08\x08\xdb\xe1\x4f\xe0\
 96.1357 +\x00\x00\x02\x45\x49\x44\x41\x54\x28\x91\x6d\x92\x4f\x48\x9a\x71\
 96.1358 +\x18\xc7\x7f\xbe\xef\xab\xcd\xed\x95\xcd\x8c\x25\x83\xc0\x24\xa9\
 96.1359 +\xc3\x4a\x17\xce\xea\x96\x3b\xe4\x0e\x5d\xba\xce\xa8\x88\xe8\x20\
 96.1360 +\x1a\x15\x1d\x3a\x78\x09\xf2\xed\xcf\xe8\x32\x68\x45\x56\x93\x66\
 96.1361 +\x94\x78\x99\x53\x68\x4e\x1b\xe1\x61\x30\xc2\x19\x5b\x16\xac\x9c\
 96.1362 +\x76\x19\x92\x2e\x35\xa6\x7b\xf7\xda\xfb\x3e\x3b\xd8\x9c\x9b\x7e\
 96.1363 +\x8e\xdf\xdf\xf3\x81\xdf\xf3\x87\x07\x00\xe8\x0f\x99\xb3\xb3\xd0\
 96.1364 +\xca\xca\x17\x97\x2b\x75\x7a\x8a\xf1\xf9\x77\xea\xeb\xe5\x3a\xdd\
 96.1365 +\x83\xe1\xe1\x6a\x85\xa2\x58\xc3\x2b\x08\x5c\x3e\x1f\x98\x9a\xfa\
 96.1366 +\xb0\xb0\x80\xf3\xf9\x72\x9d\xae\x56\xa5\xe2\x58\x36\x13\x8b\x9d\
 96.1367 +\xb8\xdd\x3f\x2f\x2e\x1e\x8e\x8c\x3c\x9a\x9d\xc5\xab\xaa\x10\x42\
 96.1368 +\x08\x00\x38\x96\x75\xf6\xf4\x58\x78\xbc\x37\x46\x23\x9d\x4e\x43\
 96.1369 +\x09\x57\x34\xfd\x7e\x6e\x6e\x4e\x28\xb4\x6b\xb5\x2c\xc3\x00\x00\
 96.1370 +\x02\x80\x77\x93\x93\xd3\x08\x51\x04\x71\xec\x74\x42\x25\xbe\xfa\
 96.1371 +\x7c\xf3\x24\xb9\x63\x30\x00\x00\x4a\x45\x22\x33\x02\x81\xd7\x64\
 96.1372 +\x5a\x69\x6e\x9e\xe1\xf3\x8f\x1c\x8e\x8a\xce\xc7\xe5\x65\x0b\x86\
 96.1373 +\x7d\xdb\xdf\x47\xfe\x89\x89\xa7\x22\xd1\xaf\xcb\xcb\x6c\x22\x61\
 96.1374 +\x55\x2a\x29\x82\x08\x6f\x6d\x95\x0b\x1c\xcb\x3e\x57\x28\x3c\x43\
 96.1375 +\x43\x68\x5d\xa3\x71\x74\x77\x17\xd2\x5c\x32\x69\x55\xa9\x28\x82\
 96.1376 +\x38\xdc\xdc\x2c\x77\xbc\x26\xd3\xb3\xba\x3a\xec\xfb\xf1\xb1\xb8\
 96.1377 +\xa1\xa1\x30\x32\xa1\x44\xa2\xdf\xdd\xbd\xdb\xd2\xf2\xba\xbf\xff\
 96.1378 +\xd0\x6e\x47\xff\x22\x69\x6a\xfa\x11\x8f\x63\x1c\xcb\xb2\x0c\x53\
 96.1379 +\x4c\x85\xd5\xd5\x7a\xbf\xbf\x56\xa9\x74\x0f\x0c\x7c\xde\xd8\x28\
 96.1380 +\x15\x80\xe3\x80\xe3\xb0\xdb\x32\x59\x26\x1a\x2d\x7d\xb8\x21\x16\
 96.1381 +\x3f\xf1\xf9\xa4\xad\xad\x9e\xc1\xc1\x4f\x36\x5b\x31\x4f\x47\xa3\
 96.1382 +\xa4\x54\x8a\x7c\xe3\xe3\xf3\x24\x99\x4b\x26\xff\xfb\x31\x9d\x4a\
 96.1383 +\xad\x6b\x34\x14\x8e\x1f\xac\xad\x15\x9a\x5e\x6a\x6c\x74\xf5\xf5\
 96.1384 +\xa1\x44\x38\x4c\xe1\xf8\xdb\xd1\xd1\xf2\x2e\xe9\x74\xfa\x45\x7b\
 96.1385 +\xbb\x05\xc3\x42\x56\x6b\x70\x69\xc9\xc2\xe3\x9d\x05\x02\x08\x00\
 96.1386 +\x76\x0c\x06\x8a\x20\xc2\xdb\xdb\x15\x9c\x4c\xc6\xd6\xd1\x61\xc1\
 96.1387 +\xb0\x79\x92\x7c\xa5\xd7\x5f\x6f\x9a\x65\x98\x97\x9d\x9d\x14\x8e\
 96.1388 +\xef\x99\xcd\x57\x34\x5d\x2a\xb0\x0c\xb3\x67\x36\x4f\x23\xb4\xae\
 96.1389 +\x56\xe7\x73\x39\x00\xb8\x3e\xbe\x7c\x2e\xe7\x1b\x1b\x3b\x58\x5d\
 96.1390 +\xbd\x59\x53\x23\xef\xea\x2a\x0c\x3a\x13\x8b\x45\xbc\xde\x6c\x3c\
 96.1391 +\x7e\xbf\xb7\xf7\xf1\xe2\xa2\x40\x24\xfa\x7b\xad\x05\xe2\xc1\x60\
 96.1392 +\xc8\x6a\x3d\xf1\x78\xb2\xe7\xe7\x88\xe3\x6e\x49\xa5\x32\xad\x56\
 96.1393 +\x6d\x34\xde\x6b\x6b\x2b\xd6\xfc\x06\xb3\xcb\xb3\xdb\x2f\x3f\x31\
 96.1394 +\xa9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82'
 96.1395 +
 96.1396 +#=============== help texts
 96.1397 +
 96.1398 +NewRealmButtonHelp = \
 96.1399 +    "Use this button to add a new top-level REALM type. \n\n\
 96.1400 +You can refine an existing realm by right-clicking it \
 96.1401 +and selecting \"Add workload\" from the pop-up menu.\n\n<Ctrl>-h for help"
 96.1402 +
 96.1403 +RealmWorkloadPanelHelp = \
 96.1404 +    "\
 96.1405 +Use this panel to define names for  types of workloads that \
 96.1406 +shall be confined against each other.\n\n<Ctrl>-h for help"
 96.1407 +
 96.1408 +RunTimeExclusionPanelHelp = \
 96.1409 +    "\
 96.1410 +The run-time exclusion rules restrict which workload types \
 96.1411 +can run simultaneously on the same platform. At most one \
 96.1412 +type in an exclusion rule can run. If a domain starts, its \
 96.1413 +workload type is looked up and if it is in any exclusion rule \
 96.1414 +of which another type is already running, then it is denied \
 96.1415 +to start.\n\n<Ctrl>-h for help"
 96.1416 +
 96.1417 +CreateRunTimeButtonHelp = \
 96.1418 +    "\
 96.1419 +This button creates a new run-time exclusion rule using the \
 96.1420 +selection from the left side workload definition panel.\n\n<Ctrl>-h for help"
 96.1421 +
 96.1422 +AddToExclusionButtonHelp = \
 96.1423 +    "\
 96.1424 +This button adds the current selection in the left side \
 96.1425 +workload definition panel to the associated exclusion rule.\n\n<Ctrl>-h for help"
 96.1426 +
 96.1427 +DelFromExclusionButtonHelp = \
 96.1428 +    "\
 96.1429 +This button deletes the current selection of the associated \
 96.1430 +exclusion rule from the associated exclusion rule.\n\n<Ctrl>-h for help"
 96.1431 +
 96.1432 +ManageExclusionButtonHelp = \
 96.1433 +    "\
 96.1434 +This button allows to rename or delete the associated exclusion \
 96.1435 +rule. Left-click the button for the menu.\n\n<Ctrl>-h for help"
 96.1436 +
 96.1437 +ExclusionSetHelp = \
 96.1438 +    "\
 96.1439 +Of the workload types specified in an exclusion rule, \
 96.1440 +only one can run at a time on the same platform.\n\n<Ctrl>-h for help"
 96.1441 +
 96.1442 +GetHelp = \
 96.1443 +    "\
 96.1444 +Use <CTRL>-h to open the help window. Use the context help on buttons."
 96.1445 +
 96.1446 +#================ html help page =================
 96.1447 +# for ez use included in a single file, one could also
 96.1448 +# optionally try to fetch the page from a public location
 96.1449 +import wx.html as html
 96.1450 +
 96.1451 +class HelpHtmlWindow(html.HtmlWindow):
 96.1452 +    def __init__(self, parent, id):
 96.1453 +        html.HtmlWindow.__init__(self, parent, id, style=wx.NO_FULL_REPAINT_ON_RESIZE)
 96.1454 +        if "gtk2" in wx.PlatformInfo:
 96.1455 +            self.SetStandardFonts()
 96.1456 +        self.SetPage(helptext)
 96.1457 +
 96.1458 +helptext = """
 96.1459 +<HTML>
 96.1460 +<HEAD>
 96.1461 +<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 96.1462 +<META name="GENERATOR" content="IBM WebSphere Studio Homepage Builder V6.0.2 for Windows">
 96.1463 +<META http-equiv="Content-Style-Type" content="text/css">
 96.1464 +<TITLE>Overview</TITLE>
 96.1465 +</HEAD>
 96.1466 +<BODY bgcolor="#dfdfdf" text="#000000">
 96.1467 +<H3><FONT color="#000000" face="Palatino Linotype">Creating A Xen Workload-Protection Security Policy</FONT></H3>
 96.1468 +<FONT face="Palatino Linotype">The purpose of this tool is to create a Xen security policy that understands
 96.1469 +the workload types that you want to confine against each other. For this
 96.1470 +purpose you enter the names of workload types that you want to assign to
 96.1471 +domains and resources. You can also define groups of workload types that
 96.1472 +should not run on the same system simultaneously for any reason; such groups
 96.1473 +are called Runtime Exclusion Sets. Please refer to the Xen User Guide for
 96.1474 +more information.<BR>
 96.1475 +<BR>
 96.1476 +This tool will create a unique security label for each workload type. Every
 96.1477 +domain and resource must be labeled so that the hypervisor system can correctly
 96.1478 +identify the associated workload type and control the sharing among domains
 96.1479 +in a way that keeps different workload types confined from each other.
 96.1480 +This tool ensures two things:<BR>
 96.1481 +<BR>
 96.1482 +1. The created security policy includes a distinctive label for each workload
 96.1483 +type defined in step 1 below. These labels must later be assigned to Domains
 96.1484 +and Resources to enable Xen to enforce the confinement.<BR>
 96.1485 +<BR>
 96.1486 +2. The created security policy includes access control rules that are enforced
 96.1487 +by the Xen Hypervisor (independently of the guest Domains) and guarantee
 96.1488 +that:</FONT>
 96.1489 +<BLOCKQUOTE><FONT face="Palatino Linotype">(i) Domains that are assigned the same workload type label can
 96.1490 +share (communicate,
 96.1491 +use common resources) without restriction through the hypervisor. Their
 96.1492 +interoperation can still be constraint by the domains (domain-internal
 96.1493 +means).</FONT></BLOCKQUOTE>
 96.1494 +<BLOCKQUOTE><FONT face="Palatino Linotype">(ii) Domains that are assigned different workload type labels cannot share,
 96.1495 +i.e., cannot communicate or use common resources. Independently enforced
 96.1496 +by the hypervisor, the domains cannot overrule this decision.</FONT></BLOCKQUOTE>
 96.1497 +<BLOCKQUOTE><FONT face="Palatino Linotype">(iii) Once a Domain labeled with a workload type of a Runtime Exclusion
 96.1498 +Rule is running, no other domain labeled with another workload type of
 96.1499 +the same Runtime Exclusion Rule can start. This holds for all Runtime Exclusion
 96.1500 +Rules.</FONT></BLOCKQUOTE>
 96.1501 +<FONT face="Palatino Linotype">While all workloads share common hardware resources, the core hypervisor
 96.1502 +isolation and virtualization in combination with the Xen access control
 96.1503 +policy ensure that, e.g., viruses in one workload type cannot infect other
 96.1504 +workload types and that secrets used within one workload type cannot leak
 96.1505 +into another workload type. Currently the Xen access control enforcement
 96.1506 +covers domains, local storage resources, and the local virtual network
 96.1507 +interfaces. Protecting sharing through the open network is subject of ongoing
 96.1508 +work; such protection must currently be setup manually using IP filtering
 96.1509 +rules in Domain0.
 96.1510 +<BR>
 96.1511 +</FONT>
 96.1512 +<H2><FONT color="#000000" face="Palatino Linotype">Step 1</FONT></H2>
 96.1513 +<FONT face="Palatino Linotype">The first step of creating a workload protection policy is to determine
 96.1514 +names for the different workload types. The left panel offers the means
 96.1515 +to define and and manage workload type definitions.<BR>
 96.1516 +<BR>
 96.1517 +A workload can be an organization name (coarse-grained type), e.g. a corporate
 96.1518 +realm such as IBM or PepsiCo. An organization can be refined to describe
 96.1519 +independent functional groupings within the organization, such as IBM.Financing
 96.1520 +or Pepsi.Payroll. Use the<B><I> &lt;New Org&gt;</I></B> button on the left panel
 96.1521 +to create a new organization workload. To refine such a workload, right-click the
 96.1522 +organization and chose <B><I>&lt;Add Department&gt;</I></B>. You can add multiple
 96.1523 +departments to an organization but you do not have to add any.<BR>
 96.1524 +<BR>
 96.1525 +This tool will create a separate label name for each organization and for
 96.1526 +each department workload. The policy will be computed so that there is
 96.1527 +no sharing between organizations or departments by default. IBM, IBM.Financing,
 96.1528 +Pepsi, and Pepsi.Payroll will by default not be able to share in this simple
 96.1529 +policy example. You can introduce controlled sharing by refining the policy,
 96.1530 +which is beyond the scope of this help.<BR>
 96.1531 +<BR>
 96.1532 +As an example, define the four organizations PepsiCo, CocaCola, Avis, Hertz.
 96.1533 +Define department workloads Payroll, HumanResources and Financing for Avis
 96.1534 +and CocaCola, and PepsiCo.<BR>
 96.1535 +</FONT>
 96.1536 +<H2><FONT color="#000000" face="Palatino Linotype">Step 2</FONT></H2>
 96.1537 +<FONT face="Palatino Linotype">In this second step, we enter those workload types that should not run
 96.1538 +simultaneously on the same hardware platform. There might be multiple reasons
 96.1539 +for this, e.g., imperfect resource control.<BR>
 96.1540 +<BR>
 96.1541 +As an example, we will create a policy that guarantees that PepsiCo workloads
 96.1542 +and CocaCola workloads never run simultaneously on the same platform: <BR>
 96.1543 +<BR>
 96.1544 +1. Select the PepsiCo organization on the left panel by left-clicking it..<BR>
 96.1545 +<BR>
 96.1546 +2. Press the &lt;Ctrl&gt;-Key and then select CocaCola organization by
 96.1547 +left-clicking it while keeping the &lt;Ctrl&gt;-Key pressed..<BR>
 96.1548 +<BR>
 96.1549 +3. Click the <B><I>&lt;Create run-time exclusion rule from selection&gt;</I></B>
 96.1550 +button and enter a name for this Run-time Exclusion rule (e.g., RER1). The name is
 96.1551 +for your reference only. It has no impact on the policy. On the right panel, a run-time
 96.1552 +exclusion rule with the chosen name appears. <BR>
 96.1553 +<BR>
 96.1554 +The interpretation of the rule is as follows: If a domain labeled PepsiCo
 96.1555 +is running, then another domain labeled CocaCola cannot start on the same
 96.1556 +system and the other way round. This also holds for departments of PepsiCo
 96.1557 +and CocaCola (organizations dominate their departments). If PepsiCo or
 96.1558 +PepsiCo.Payroll etc. are running, then a domain with label CocaCola or
 96.1559 +CocaCola.Payroll etc. cannot start. If you want to restrict concurrency
 96.1560 +between specific subtypes, then you must create a Run-time Exclusion rule
 96.1561 +that specifies the department workload types. To exclude only CocaCola.Payroll
 96.1562 +and PepsiCo.Payroll from running simultaneously the Run-time Exclusion
 96.1563 +rule must be formed using Coca.Cola.Payroll and PepsiCo.Payroll, not their
 96.1564 +organizations. Consequently it does not make sense to add both an organization
 96.1565 +and any of its departments to the same Run-time Exclusion rule because
 96.1566 +any department is already covered by its organization (this tool will not
 96.1567 +allow it).<BR>
 96.1568 +<BR>
 96.1569 +You can create multiple Run-time Exclusion rules, all of which will be
 96.1570 +enforced simultaneously by the hypervisor. You do not need to define any
 96.1571 +Run-time Exclusion rule if you do not find it necessary. You can add or
 96.1572 +delete workload types from Run-time Exclusion rules using the <B><I>&lt;Add&gt;</I></B>
 96.1573 +and <I><B>&lt;Del&gt;</B></I> buttons associated with the rule. The <I><B>&lt;Add&gt;</B></I>
 96.1574 +button adds the workload types selected in the left panel to the Run-time
 96.1575 +Exclusion rule. The <I><B>&lt;Del&gt;</B></I> button deletes the workload types selected
 96.1576 +in the associated Run-time Exclusion rule from the rule. <BR>
 96.1577 +</FONT>
 96.1578 +<H2><FONT color="#000000" face="Palatino Linotype">Step 3</FONT></H2>
 96.1579 +<FONT face="Palatino Linotype">Now that we have defined the workloads and Run-time Exclusion rules, we
 96.1580 +can save the workload definition for later reference or refinement. Select
 96.1581 +the <I><B>File-&gt;Save Workload
 96.1582 +Definition as..</B></I> menu entry and choose a file name.<BR>
 96.1583 +<BR>
 96.1584 +Please use the <B><I>File-&gt;Save as Xen ACM Security Policy..</I></B> menu entry and choose a policy
 96.1585 +name to create a Xen Workload Protection
 96.1586 +security policy from the current workload definition. To simplify the succeeding
 96.1587 +steps, please use a name of the form &quot;example.chwall_ste.NAME&quot;
 96.1588 +where you merely replace &quot;NAME&quot; with a policy name of your choice.
 96.1589 +Save the policy under the name proposed by the tool in the proposed directory
 96.1590 +if you are using this tool in your Xen environment. Otherwise, you need
 96.1591 +to copy the resulting file into your Xen environment to the directory
 96.1592 +&quot;/etc/xen/acm-security/policies/example/chwall_ste/&quot;.<BR>
 96.1593 +<BR>
 96.1594 +This tool creates policies for the Xen Chinese Wall and Simple Type Enforcement
 96.1595 +policy. The Xen access control policy in general is more expressive and
 96.1596 +this tool only uses a small subset of the possible configurations. <B><BR>
 96.1597 +<BR>
 96.1598 +Where to go from here.</B> <BR>
 96.1599 +<BR>
 96.1600 +Before the new policy can be activated, we need to translate the policy into a representation that
 96.1601 +Xen and the Xen-tools can work with. To this end, in your Xen environment, please issue the command
 96.1602 +<B><I>xm makepolicy example.chwall_ste.NAME</I></B> where NAME must be replaced by the name you chose
 96.1603 +for your policy in step 3 above. Then, we need to make the policy available to the Xen hypervisor. In
 96.1604 +your Xen environment, please issue the command <B><I>xm cfgbootpolicy example.chwall_ste.NAME</I></B>
 96.1605 +to install the policy for the next reboot. If the command cannot find the correct boot title, then you
 96.1606 +can manually install it as described in the xm man page.<BR>
 96.1607 +<BR>
 96.1608 +Finally, reboot your security-enabled Xen environment. Please refer to the xm man page for how to enable
 96.1609 +Xen security. After reboot, you can use <I><B>xm labels type=any</B></I> to list all the created workload l
 96.1610 +abels. Use the <I><B>xm addlabel</B></I> command to assign workload type labels to the associated domains
 96.1611 +and resources.<BR>
 96.1612 +<BR>
 96.1613 +From here, please check the Xen user guide.<BR>
 96.1614 +</FONT></BODY>
 96.1615 +</HTML>
 96.1616 +"""
 96.1617 +
 96.1618 +#=============== main =====
 96.1619 +
 96.1620 +def main():
 96.1621 +    global app
 96.1622 +    app = ezApp(0)
 96.1623 +    if len(sys.argv) in [2]:
 96.1624 +        app.Load(sys.argv[1])
 96.1625 +    app.MainLoop()
 96.1626 +    print "Goodbye"
 96.1627 +
 96.1628 +if __name__ == '__main__':
 96.1629 +    main()
 96.1630 +
 96.1631 +#==== end of file
    97.1 --- a/tools/xenstore/Makefile	Tue Aug 01 14:58:20 2006 -0600
    97.2 +++ b/tools/xenstore/Makefile	Wed Aug 02 13:39:47 2006 -0600
    97.3 @@ -26,7 +26,7 @@ TESTDIR  = testsuite/tmp
    97.4  TESTFLAGS= -DTESTING
    97.5  TESTENV  = XENSTORED_ROOTDIR=$(TESTDIR) XENSTORED_RUNDIR=$(TESTDIR)
    97.6  
    97.7 -CLIENTS := xenstore-exists xenstore-list xenstore-read xenstore-rm
    97.8 +CLIENTS := xenstore-exists xenstore-list xenstore-read xenstore-rm xenstore-chmod
    97.9  CLIENTS += xenstore-write
   97.10  CLIENTS_OBJS := $(patsubst xenstore-%,xenstore_%.o,$(CLIENTS))
   97.11  
   97.12 @@ -102,7 +102,7 @@ libxenstore.a: xs.o xs_lib.o
   97.13  
   97.14  .PHONY: clean
   97.15  clean: testsuite-clean
   97.16 -	rm -f *.o *.opic *.so*
   97.17 +	rm -f *.a *.o *.opic *.so*
   97.18  	rm -f xenstored xs_random xs_stress xs_crashme
   97.19  	rm -f xs_test xenstored_test xs_tdb_dump xenstore-control xenstore-ls
   97.20  	rm -f $(CLIENTS)
    98.1 --- a/tools/xenstore/xenstore_client.c	Tue Aug 01 14:58:20 2006 -0600
    98.2 +++ b/tools/xenstore/xenstore_client.c	Wed Aug 02 13:39:47 2006 -0600
    98.3 @@ -60,6 +60,8 @@ usage(const char *progname)
    98.4      errx(1, "Usage: %s [-h] [-s] [-t] key [...]", progname);
    98.5  #elif defined(CLIENT_exists) || defined(CLIENT_list)
    98.6      errx(1, "Usage: %s [-h] [-s] key [...]", progname);
    98.7 +#elif defined(CLIENT_chmod)
    98.8 +    errx(1, "Usage: %s [-h] [-s] key <mode [modes...]>", progname);
    98.9  #endif
   98.10  }
   98.11  
   98.12 @@ -78,10 +80,61 @@ do_rm(char *path, struct xs_handle *xsh,
   98.13  }
   98.14  #endif
   98.15  
   98.16 +#if defined(CLIENT_chmod)
   98.17 +#define PATH_SEP '/'
   98.18 +#define MAX_PATH_LEN 256
   98.19 +
   98.20 +static void
   98.21 +do_chmod(char *path, struct xs_permissions *perms, int nperms, int upto,
   98.22 +	 int recurse, struct xs_handle *xsh, xs_transaction_t xth)
   98.23 +{
   98.24 +    int ret;
   98.25 +
   98.26 +    if (!path[0])
   98.27 +	return;
   98.28 +
   98.29 +    ret = xs_set_permissions(xsh, xth, path, perms, nperms);
   98.30 +    if (!ret)
   98.31 +	err(1, "Error occurred setting permissions on '%s'", path);
   98.32 +
   98.33 +    if (upto) {
   98.34 +	/* apply same permissions to all parent entries: */
   98.35 +	char *path_sep_ptr = strrchr(path, PATH_SEP);
   98.36 +	if (!path_sep_ptr)
   98.37 +	    errx(1, "Unable to locate path separator '%c' in '%s'",
   98.38 +		 PATH_SEP, path);
   98.39 +	
   98.40 +	*path_sep_ptr = '\0'; /* truncate path */
   98.41 +	
   98.42 +	do_chmod(path, perms, nperms, 1, 0, xsh, xth);
   98.43 +
   98.44 +	*path_sep_ptr = PATH_SEP;
   98.45 +    }
   98.46 +
   98.47 +    if (recurse) {
   98.48 +	char buf[MAX_PATH_LEN];
   98.49 +
   98.50 +	/* apply same permissions to all child entries: */
   98.51 +	unsigned int xsval_n;
   98.52 +	char **xsval = xs_directory(xsh, xth, path, &xsval_n);
   98.53 +
   98.54 +	if (xsval) {
   98.55 +	    int i;
   98.56 +	    for (i = 0; i < xsval_n; i++) {
   98.57 +		snprintf(buf, MAX_PATH_LEN, "%s/%s", path, xsval[i]);
   98.58 +
   98.59 +		do_chmod(buf, perms, nperms, 0, 1, xsh, xth);
   98.60 +	    }
   98.61 +
   98.62 +	    free(xsval);
   98.63 +	}
   98.64 +    }
   98.65 +}
   98.66 +#endif
   98.67  
   98.68  static int
   98.69  perform(int optind, int argc, char **argv, struct xs_handle *xsh,
   98.70 -        xs_transaction_t xth, int prefix, int tidy)
   98.71 +        xs_transaction_t xth, int prefix, int tidy, int upto, int recurse)
   98.72  {
   98.73      while (optind < argc) {
   98.74  #if defined(CLIENT_read)
   98.75 @@ -168,6 +221,41 @@ perform(int optind, int argc, char **arg
   98.76  	}
   98.77  	free(list);
   98.78  	optind++;
   98.79 +#elif defined(CLIENT_chmod)
   98.80 +#define MAX_PERMS 16
   98.81 +	struct xs_permissions perms[MAX_PERMS];
   98.82 +	int nperms = 0;
   98.83 +	/* save path pointer: */
   98.84 +	char *path = argv[optind++];
   98.85 +	for (; argv[optind]; optind++, nperms++)
   98.86 +	{
   98.87 +	    if (MAX_PERMS <= nperms)
   98.88 +		errx(1, "Too many permissions specified.  "
   98.89 +		     "Maximum per invocation is %d.", MAX_PERMS);
   98.90 +
   98.91 +	    perms[nperms].id = atoi(argv[optind]+1);
   98.92 +
   98.93 +	    switch (argv[optind][0])
   98.94 +	    {
   98.95 +	    case 'n':
   98.96 +		perms[nperms].perms = XS_PERM_NONE;
   98.97 +		break;
   98.98 +	    case 'r':
   98.99 +		perms[nperms].perms = XS_PERM_READ;
  98.100 +		break;
  98.101 +	    case 'w':
  98.102 +		perms[nperms].perms = XS_PERM_WRITE;
  98.103 +		break;
  98.104 +	    case 'b':
  98.105 +		perms[nperms].perms = XS_PERM_READ | XS_PERM_WRITE;
  98.106 +		break;
  98.107 +	    default:
  98.108 +		errx(1, "Invalid permission specification: '%c'",
  98.109 +		     argv[optind][0]);
  98.110 +	    }
  98.111 +	}
  98.112 +
  98.113 +	do_chmod(path, perms, nperms, upto, recurse, xsh, xth);
  98.114  #endif
  98.115      }
  98.116  
  98.117 @@ -183,6 +271,8 @@ main(int argc, char **argv)
  98.118      int ret = 0, socket = 0;
  98.119      int prefix = 0;
  98.120      int tidy = 0;
  98.121 +    int upto = 0;
  98.122 +    int recurse = 0;
  98.123  
  98.124      while (1) {
  98.125  	int c, index = 0;
  98.126 @@ -193,6 +283,9 @@ main(int argc, char **argv)
  98.127  	    {"prefix", 0, 0, 'p'},
  98.128  #elif defined(CLIENT_rm)
  98.129              {"tidy",   0, 0, 't'},
  98.130 +#elif defined(CLIENT_chmod)
  98.131 +	    {"upto",    0, 0, 'u'},
  98.132 +	    {"recurse", 0, 0, 'r'},
  98.133  #endif
  98.134  	    {0, 0, 0, 0}
  98.135  	};
  98.136 @@ -202,6 +295,8 @@ main(int argc, char **argv)
  98.137  			"p"
  98.138  #elif defined(CLIENT_rm)
  98.139                          "t"
  98.140 +#elif defined(CLIENT_chmod)
  98.141 +			"ur"
  98.142  #endif
  98.143  			, long_options, &index);
  98.144  	if (c == -1)
  98.145 @@ -222,6 +317,13 @@ main(int argc, char **argv)
  98.146  	case 't':
  98.147  	    tidy = 1;
  98.148  	    break;
  98.149 +#elif defined(CLIENT_chmod)
  98.150 +	case 'u':
  98.151 +	    upto = 1;
  98.152 +	    break;
  98.153 +	case 'r':
  98.154 +	    recurse = 1;
  98.155 +	    break;
  98.156  #endif
  98.157  	}
  98.158      }
  98.159 @@ -246,7 +348,7 @@ main(int argc, char **argv)
  98.160      if (xth == XBT_NULL)
  98.161  	errx(1, "couldn't start transaction");
  98.162  
  98.163 -    ret = perform(optind, argc, argv, xsh, xth, prefix, tidy);
  98.164 +    ret = perform(optind, argc, argv, xsh, xth, prefix, tidy, upto, recurse);
  98.165  
  98.166      if (!xs_transaction_end(xsh, xth, ret)) {
  98.167  	if (ret == 0 && errno == EAGAIN) {
    99.1 --- a/tools/xenstore/xenstored_core.c	Tue Aug 01 14:58:20 2006 -0600
    99.2 +++ b/tools/xenstore/xenstored_core.c	Wed Aug 02 13:39:47 2006 -0600
    99.3 @@ -80,6 +80,7 @@ static void check_store(void);
    99.4  int quota_nb_entry_per_domain = 1000;
    99.5  int quota_nb_watch_per_domain = 128;
    99.6  int quota_max_entry_size = 2048; /* 2K */
    99.7 +int quota_max_transaction = 10;
    99.8  
    99.9  #ifdef TESTING
   99.10  static bool failtest = false;
   99.11 @@ -1342,6 +1343,7 @@ struct connection *new_connection(connwr
   99.12  	new->write = write;
   99.13  	new->read = read;
   99.14  	new->can_write = true;
   99.15 +	new->transaction_started = 0;
   99.16  	INIT_LIST_HEAD(&new->out_list);
   99.17  	INIT_LIST_HEAD(&new->watches);
   99.18  	INIT_LIST_HEAD(&new->transaction_list);
   99.19 @@ -1739,6 +1741,7 @@ static void usage(void)
   99.20  "  --entry-nb <nb>     limit the number of entries per domain,\n"
   99.21  "  --entry-size <size> limit the size of entry per domain, and\n"
   99.22  "  --entry-watch <nb>  limit the number of watches per domain,\n"
   99.23 +"  --transaction <nb>  limit the number of transaction allowed per domain,\n"
   99.24  "  --no-recovery       to request that no recovery should be attempted when\n"
   99.25  "                      the store is corrupted (debug only),\n"
   99.26  "  --preserve-local    to request that /local is preserved on start-up,\n"
   99.27 @@ -1755,6 +1758,7 @@ static struct option options[] = {
   99.28  	{ "output-pid", 0, NULL, 'P' },
   99.29  	{ "entry-size", 1, NULL, 'S' },
   99.30  	{ "trace-file", 1, NULL, 'T' },
   99.31 +	{ "transaction", 1, NULL, 't' },
   99.32  	{ "no-recovery", 0, NULL, 'R' },
   99.33  	{ "preserve-local", 0, NULL, 'L' },
   99.34  	{ "verbose", 0, NULL, 'V' },
   99.35 @@ -1774,7 +1778,7 @@ int main(int argc, char *argv[])
   99.36  	const char *pidfile = NULL;
   99.37  	int evtchn_fd = -1;
   99.38  
   99.39 -	while ((opt = getopt_long(argc, argv, "DE:F:HNPS:T:RLVW:", options,
   99.40 +	while ((opt = getopt_long(argc, argv, "DE:F:HNPS:t:T:RLVW:", options,
   99.41  				  NULL)) != -1) {
   99.42  		switch (opt) {
   99.43  		case 'D':
   99.44 @@ -1804,6 +1808,9 @@ int main(int argc, char *argv[])
   99.45  		case 'S':
   99.46  			quota_max_entry_size = strtol(optarg, NULL, 10);
   99.47  			break;
   99.48 +		case 't':
   99.49 +			quota_max_transaction = strtol(optarg, NULL, 10);
   99.50 +			break;
   99.51  		case 'T':
   99.52  			tracefile = optarg;
   99.53  			break;
   100.1 --- a/tools/xenstore/xenstored_core.h	Tue Aug 01 14:58:20 2006 -0600
   100.2 +++ b/tools/xenstore/xenstored_core.h	Wed Aug 02 13:39:47 2006 -0600
   100.3 @@ -79,6 +79,7 @@ struct connection
   100.4  	/* List of in-progress transactions. */
   100.5  	struct list_head transaction_list;
   100.6  	uint32_t next_transaction_id;
   100.7 +	unsigned int transaction_started;
   100.8  
   100.9  	/* The domain I'm associated with, if any. */
  100.10  	struct domain *domain;
   101.1 --- a/tools/xenstore/xenstored_transaction.c	Tue Aug 01 14:58:20 2006 -0600
   101.2 +++ b/tools/xenstore/xenstored_transaction.c	Wed Aug 02 13:39:47 2006 -0600
   101.3 @@ -66,6 +66,7 @@ struct transaction
   101.4  	struct list_head changes;
   101.5  };
   101.6  
   101.7 +extern int quota_max_transaction;
   101.8  static unsigned int generation;
   101.9  
  101.10  /* Return tdb context to use for this connection. */
  101.11 @@ -125,7 +126,6 @@ void do_transaction_start(struct connect
  101.12  {
  101.13  	struct transaction *trans, *exists;
  101.14  	char id_str[20];
  101.15 -	int started;
  101.16  
  101.17  	/* We don't support nested transactions. */
  101.18  	if (conn->transaction) {
  101.19 @@ -133,11 +133,7 @@ void do_transaction_start(struct connect
  101.20  		return;
  101.21  	}
  101.22  
  101.23 -	started = 0;
  101.24 -	list_for_each_entry(trans, &conn->transaction_list, list)
  101.25 -		started++;
  101.26 -
  101.27 -	if (started > 5) {
  101.28 +	if (conn->transaction_started > quota_max_transaction) {
  101.29  		send_error(conn, ENOSPC);
  101.30  		return;
  101.31  	}
  101.32 @@ -166,6 +162,7 @@ void do_transaction_start(struct connect
  101.33  	list_add_tail(&trans->list, &conn->transaction_list);
  101.34  	talloc_steal(conn, trans);
  101.35  	talloc_set_destructor(trans, destroy_transaction);
  101.36 +	conn->transaction_started++;
  101.37  
  101.38  	sprintf(id_str, "%u", trans->id);
  101.39  	send_reply(conn, XS_TRANSACTION_START, id_str, strlen(id_str)+1);
  101.40 @@ -188,6 +185,7 @@ void do_transaction_end(struct connectio
  101.41  
  101.42  	conn->transaction = NULL;
  101.43  	list_del(&trans->list);
  101.44 +	conn->transaction_started--;
  101.45  
  101.46  	/* Attach transaction to arg for auto-cleanup */
  101.47  	talloc_steal(arg, trans);
   102.1 --- a/tools/xenstore/xsls.c	Tue Aug 01 14:58:20 2006 -0600
   102.2 +++ b/tools/xenstore/xsls.c	Wed Aug 02 13:39:47 2006 -0600
   102.3 @@ -3,8 +3,19 @@
   102.4  #include <string.h>
   102.5  #include <err.h>
   102.6  #include <xs.h>
   102.7 +#include <getopt.h>
   102.8 +#include <unistd.h>
   102.9 +#include <sys/ioctl.h>
  102.10  
  102.11 -void print_dir(struct xs_handle *h, char *path, int cur_depth)
  102.12 +static int max_width = 80;
  102.13 +static int desired_width = 60;
  102.14 +
  102.15 +#define TAG " = \"...\""
  102.16 +#define TAG_LEN strlen(TAG)
  102.17 +
  102.18 +#define MIN(a, b) (((a) < (b))? (a) : (b))
  102.19 +
  102.20 +void print_dir(struct xs_handle *h, char *path, int cur_depth, int show_perms)
  102.21  {
  102.22      char **e;
  102.23      char newpath[512], *val;
  102.24 @@ -16,33 +27,103 @@ void print_dir(struct xs_handle *h, char
  102.25          err(1, "xs_directory (%s)", path);
  102.26  
  102.27      for (i = 0; i<num; i++) {
  102.28 -        int j;
  102.29 -        for (j=0; j<cur_depth; j++) printf(" ");
  102.30 -        printf("%s", e[i]);
  102.31 +        char buf[MAX_STRLEN(unsigned int)+1];
  102.32 +        struct xs_permissions *perms;
  102.33 +        unsigned int nperms;
  102.34 +        int linewid;
  102.35 +
  102.36 +        for (linewid=0; linewid<cur_depth; linewid++) putchar(' ');
  102.37 +        linewid += printf("%.*s",
  102.38 +                          (int) (max_width - TAG_LEN - linewid), e[i]);
  102.39          sprintf(newpath, "%s%s%s", path, 
  102.40                  path[strlen(path)-1] == '/' ? "" : "/", 
  102.41                  e[i]);
  102.42          val = xs_read(h, XBT_NULL, newpath, &len);
  102.43 -        if (val == NULL)
  102.44 +        if (val == NULL) {
  102.45              printf(":\n");
  102.46 -        else if ((unsigned)len > (151 - strlen(e[i])))
  102.47 -            printf(" = \"%.*s...\"\n", (int)(148 - strlen(e[i])), val);
  102.48 -        else
  102.49 -            printf(" = \"%s\"\n", val);
  102.50 +        }
  102.51 +        else {
  102.52 +            if (max_width < (linewid + len + TAG_LEN)) {
  102.53 +                printf(" = \"%.*s...\"",
  102.54 +                       (int)(max_width - TAG_LEN - linewid), val);
  102.55 +            }
  102.56 +            else {
  102.57 +                linewid += printf(" = \"%s\"", val);
  102.58 +                if (show_perms) {
  102.59 +                    putchar(' ');
  102.60 +                    for (linewid++;
  102.61 +                         linewid < MIN(desired_width, max_width);
  102.62 +                         linewid++)
  102.63 +                        putchar((linewid & 1)? '.' : ' ');
  102.64 +                }
  102.65 +            }
  102.66 +        }
  102.67          free(val);
  102.68 -        print_dir(h, newpath, cur_depth+1); 
  102.69 +
  102.70 +        if (show_perms) {
  102.71 +            perms = xs_get_permissions(h, XBT_NULL, newpath, &nperms);
  102.72 +            if (perms == NULL) {
  102.73 +                warn("\ncould not access permissions for %s", e[i]);
  102.74 +            }
  102.75 +            else {
  102.76 +                int i;
  102.77 +                fputs("  (", stdout);
  102.78 +                for (i = 0; i < nperms; i++) {
  102.79 +                    if (i)
  102.80 +                        putchar(',');
  102.81 +                    xs_perm_to_string(perms+i, buf);
  102.82 +                    fputs(buf, stdout);
  102.83 +                }
  102.84 +                putchar(')');
  102.85 +            }
  102.86 +        }
  102.87 +
  102.88 +        putchar('\n');
  102.89 +            
  102.90 +        print_dir(h, newpath, cur_depth+1, show_perms); 
  102.91      }
  102.92      free(e);
  102.93  }
  102.94  
  102.95 +void usage(int argc, char *argv[])
  102.96 +{
  102.97 +    fprintf(stderr, "Usage: %s [-p] [path]\n", argv[0]);
  102.98 +}
  102.99 +
 102.100  int main(int argc, char *argv[])
 102.101  {
 102.102 +    struct winsize ws;
 102.103 +    int ret;
 102.104 +    int c;
 102.105 +    int show_perm = 0;
 102.106 +
 102.107      struct xs_handle *xsh = xs_daemon_open();
 102.108  
 102.109      if (xsh == NULL)
 102.110          err(1, "xs_daemon_open");
 102.111  
 102.112 -    print_dir(xsh, argc == 1 ? "/" : argv[1], 0);
 102.113 +#define PAD 2
 102.114 +
 102.115 +    memset(&ws, 0, sizeof(ws));
 102.116 +    ret = ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws);
 102.117 +    if (!ret)
 102.118 +        max_width = ws.ws_col - PAD;
 102.119 +
 102.120 +    while (0 < (c = getopt(argc, argv, "p"))) {
 102.121 +        switch (c) {
 102.122 +        case 'p':
 102.123 +            show_perm = 1;
 102.124 +            max_width -= 16;
 102.125 +            break;
 102.126 +        case ':':
 102.127 +        case '?':
 102.128 +        default:
 102.129 +            usage(argc, argv);
 102.130 +            return 0;
 102.131 +        }
 102.132 +    }
 102.133 +
 102.134 +    print_dir(xsh, (argc - optind) == 1 ? argv[optind] : "/", 0, show_perm);
 102.135  
 102.136      return 0;
 102.137  }
   103.1 --- a/xen/Makefile	Tue Aug 01 14:58:20 2006 -0600
   103.2 +++ b/xen/Makefile	Wed Aug 02 13:39:47 2006 -0600
   103.3 @@ -72,7 +72,7 @@ build install debug clean distclean csco
   103.4  .PHONY: delete-unfresh-files
   103.5  delete-unfresh-files:
   103.6  	@if [ ! -r include/xen/compile.h -o -O include/xen/compile.h ]; then \
   103.7 -		rm -f include/xen/{banner,compile}.h; \
   103.8 +		rm -f include/xen/compile.h; \
   103.9  	fi
  103.10  
  103.11  # acm_policy.h contains security policy for Xen
  103.12 @@ -91,7 +91,7 @@ include/xen/acm_policy.h:
  103.13  
  103.14  # compile.h contains dynamic build info. Rebuilt on every 'make' invocation.
  103.15  include/xen/compile.h: LANG=C
  103.16 -include/xen/compile.h: include/xen/compile.h.in include/xen/banner.h
  103.17 +include/xen/compile.h: include/xen/compile.h.in
  103.18  	@sed -e 's/@@date@@/$(shell date)/g' \
  103.19  	    -e 's/@@time@@/$(shell date +%T)/g' \
  103.20  	    -e 's/@@whoami@@/$(shell whoami)/g' \
  103.21 @@ -103,11 +103,7 @@ include/xen/compile.h: include/xen/compi
  103.22  	    -e 's/@@extraversion@@/$(XEN_EXTRAVERSION)/g' \
  103.23  	    -e 's!@@changeset@@!$(shell ((hg parents || head -n 7 ../ChangeLog || echo date: unavailable) | awk '{FS="changeset:[ ]+"}/^changeset/{CS=$$2};{FS="date:[ ]+"}/^date/{D=$$2}; END {print D, CS}') 2>/dev/null)!g' \
  103.24  	    < include/xen/compile.h.in > $@.new
  103.25 -	@cat include/xen/banner.h >> $@.new
  103.26 -	@mv -f $@.new $@
  103.27 -
  103.28 -include/xen/banner.h:
  103.29 -	tools/figlet/figlet -d tools/figlet Xen $(XEN_FULLVERSION) > $@.new
  103.30 +	tools/figlet/figlet -d tools/figlet Xen $(XEN_FULLVERSION) >> $@.new
  103.31  	@mv -f $@.new $@
  103.32  
  103.33  include/asm-$(TARGET_ARCH)/asm-offsets.h: arch/$(TARGET_ARCH)/asm-offsets.s
  103.34 @@ -150,3 +146,15 @@ endef
  103.35  .PHONY: MAP
  103.36  MAP:
  103.37  	$(NM) $(TARGET) | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map
  103.38 +
  103.39 +.PHONY: FORCE
  103.40 +FORCE:
  103.41 +
  103.42 +%.o %.i: %.c FORCE
  103.43 +	$(MAKE) -f $(BASEDIR)/Rules.mk -C $(*D) $(@F)
  103.44 +
  103.45 +%.o %.s: %.S FORCE
  103.46 +	$(MAKE) -f $(BASEDIR)/Rules.mk -C $(*D) $(@F)
  103.47 +
  103.48 +%/: FORCE
  103.49 +	$(MAKE) -f $(BASEDIR)/Rules.mk -C $* built_in.o
   104.1 --- a/xen/Rules.mk	Tue Aug 01 14:58:20 2006 -0600
   104.2 +++ b/xen/Rules.mk	Wed Aug 02 13:39:47 2006 -0600
   104.3 @@ -43,7 +43,6 @@ include $(BASEDIR)/arch/$(TARGET_ARCH)/R
   104.4  
   104.5  # Do not depend on auto-generated header files.
   104.6  HDRS := $(subst $(BASEDIR)/include/asm-$(TARGET_ARCH)/asm-offsets.h,,$(HDRS))
   104.7 -HDRS := $(subst $(BASEDIR)/include/xen/banner.h,,$(HDRS))
   104.8  HDRS := $(subst $(BASEDIR)/include/xen/compile.h,,$(HDRS))
   104.9  
  104.10  # Note that link order matters!
  104.11 @@ -106,3 +105,9 @@ clean:: $(addprefix _clean_, $(subdir-al
  104.12  
  104.13  %.o: %.S $(HDRS) Makefile
  104.14  	$(CC) $(CFLAGS) $(AFLAGS) -c $< -o $@
  104.15 +
  104.16 +%.i: %.c $(HDRS) Makefile
  104.17 +	$(CPP) $(CFLAGS) $< -o $@
  104.18 +
  104.19 +%.s: %.S $(HDRS) Makefile
  104.20 +	$(CPP) $(CFLAGS) $(AFLAGS) $< -o $@
   105.1 --- a/xen/arch/ia64/xen/dom_fw.c	Tue Aug 01 14:58:20 2006 -0600
   105.2 +++ b/xen/arch/ia64/xen/dom_fw.c	Wed Aug 02 13:39:47 2006 -0600
   105.3 @@ -19,7 +19,7 @@
   105.4  #include <asm/sal.h>
   105.5  #include <asm/meminit.h>
   105.6  #include <asm/fpswa.h>
   105.7 -#include <xen/compile.h>
   105.8 +#include <xen/version.h>
   105.9  #include <xen/acpi.h>
  105.10  
  105.11  #include <asm/dom_fw.h>
  105.12 @@ -353,7 +353,8 @@ dom_fw_fake_acpi(struct domain *d, struc
  105.13  	strcpy(xsdt->oem_id, "XEN");
  105.14  	strcpy(xsdt->oem_table_id, "Xen/ia64");
  105.15  	strcpy(xsdt->asl_compiler_id, "XEN");
  105.16 -	xsdt->asl_compiler_revision = (XEN_VERSION<<16)|(XEN_SUBVERSION);
  105.17 +	xsdt->asl_compiler_revision = (xen_major_version() << 16) |
  105.18 +		xen_minor_version();
  105.19  
  105.20  	xsdt->table_offset_entry[0] = dom_pa((unsigned long) fadt);
  105.21  	tables->madt_ptr = dom_pa((unsigned long) madt);
  105.22 @@ -367,7 +368,8 @@ dom_fw_fake_acpi(struct domain *d, struc
  105.23  	strcpy(fadt->oem_id, "XEN");
  105.24  	strcpy(fadt->oem_table_id, "Xen/ia64");
  105.25  	strcpy(fadt->asl_compiler_id, "XEN");
  105.26 -	fadt->asl_compiler_revision = (XEN_VERSION<<16)|(XEN_SUBVERSION);
  105.27 +	fadt->asl_compiler_revision = (xen_major_version() << 16) |
  105.28 +		xen_minor_version();
  105.29  
  105.30  	strncpy(facs->signature, FACS_SIG, 4);
  105.31  	facs->version = 1;
  105.32 @@ -413,7 +415,8 @@ dom_fw_fake_acpi(struct domain *d, struc
  105.33  	strcpy(dsdt->oem_id, "XEN");
  105.34  	strcpy(dsdt->oem_table_id, "Xen/ia64");
  105.35  	strcpy(dsdt->asl_compiler_id, "XEN");
  105.36 -	dsdt->asl_compiler_revision = (XEN_VERSION<<16)|(XEN_SUBVERSION);
  105.37 +	dsdt->asl_compiler_revision = (xen_major_version() << 16) |
  105.38 +		xen_minor_version();
  105.39  
  105.40  	/* Trivial namespace, avoids ACPI CA complaints */
  105.41  	tables->aml[0] = 0x10; /* Scope */
  105.42 @@ -454,7 +457,8 @@ dom_fw_fake_acpi(struct domain *d, struc
  105.43  	strcpy(madt->header.oem_id, "XEN");
  105.44  	strcpy(madt->header.oem_table_id, "Xen/ia64");
  105.45  	strcpy(madt->header.asl_compiler_id, "XEN");
  105.46 -	madt->header.asl_compiler_revision = (XEN_VERSION<<16)|(XEN_SUBVERSION);
  105.47 +	madt->header.asl_compiler_revision = (xen_major_version() << 16) |
  105.48 +		xen_minor_version();
  105.49  
  105.50  	/* An LSAPIC entry describes a CPU.  */
  105.51  	for (i = 0; i < MAX_VIRT_CPUS; i++) {
   106.1 --- a/xen/arch/ia64/xen/domain.c	Tue Aug 01 14:58:20 2006 -0600
   106.2 +++ b/xen/arch/ia64/xen/domain.c	Wed Aug 02 13:39:47 2006 -0600
   106.3 @@ -30,7 +30,7 @@
   106.4  #include <asm/processor.h>
   106.5  #include <xen/event.h>
   106.6  #include <xen/console.h>
   106.7 -#include <xen/compile.h>
   106.8 +#include <xen/version.h>
   106.9  #include <xen/elf.h>
  106.10  #include <asm/pgalloc.h>
  106.11  #include <asm/offsets.h>  /* for IA64_THREAD_INFO_SIZE */
  106.12 @@ -1069,7 +1069,8 @@ int construct_dom0(struct domain *d,
  106.13  		panic("can't allocate start info page");
  106.14  	si = page_to_virt(start_info_page);
  106.15  	memset(si, 0, PAGE_SIZE);
  106.16 -	sprintf(si->magic, "xen-%i.%i-ia64", XEN_VERSION, XEN_SUBVERSION);
  106.17 +	sprintf(si->magic, "xen-%i.%i-ia64",
  106.18 +		xen_major_version(), xen_minor_version());
  106.19  	si->nr_pages     = max_pages;
  106.20  	si->flags = SIF_INITDOMAIN|SIF_PRIVILEGED;
  106.21  
   107.1 --- a/xen/arch/ia64/xen/xensetup.c	Tue Aug 01 14:58:20 2006 -0600
   107.2 +++ b/xen/arch/ia64/xen/xensetup.c	Wed Aug 02 13:39:47 2006 -0600
   107.3 @@ -13,7 +13,7 @@
   107.4  #include <xen/mm.h>
   107.5  #include <public/version.h>
   107.6  #include <xen/gdbstub.h>
   107.7 -#include <xen/compile.h>
   107.8 +#include <xen/version.h>
   107.9  #include <xen/console.h>
  107.10  #include <xen/domain.h>
  107.11  #include <xen/serial.h>
  107.12 @@ -547,11 +547,13 @@ printk("num_online_cpus=%d, max_cpus=%d\
  107.13  void arch_get_xen_caps(xen_capabilities_info_t info)
  107.14  {
  107.15      char *p=info;
  107.16 +    int major = xen_major_version();
  107.17 +    int minor = xen_minor_version();
  107.18  
  107.19 -    p += sprintf(p,"xen-%d.%d-ia64 ", XEN_VERSION, XEN_SUBVERSION);
  107.20 +    p += sprintf(p,"xen-%d.%d-ia64 ", major, minor);
  107.21  
  107.22      if (vmx_enabled)
  107.23 -        p += sprintf(p,"hvm-%d.%d-ia64 ", XEN_VERSION, XEN_SUBVERSION);
  107.24 +        p += sprintf(p,"hvm-%d.%d-ia64 ", major, minor);
  107.25  
  107.26      *(p-1) = 0;
  107.27  
   108.1 --- a/xen/arch/powerpc/boot_of.c	Tue Aug 01 14:58:20 2006 -0600
   108.2 +++ b/xen/arch/powerpc/boot_of.c	Wed Aug 02 13:39:47 2006 -0600
   108.3 @@ -22,7 +22,7 @@
   108.4  #include <xen/init.h>
   108.5  #include <xen/lib.h>
   108.6  #include <xen/multiboot.h>
   108.7 -#include <xen/compile.h>
   108.8 +#include <xen/version.h>
   108.9  #include <xen/spinlock.h>
  108.10  #include <xen/serial.h>
  108.11  #include <xen/time.h>
  108.12 @@ -976,9 +976,9 @@ multiboot_info_t __init *boot_of_init(
  108.13  
  108.14      of_printf("%s\n", "---------------------------------------------------");
  108.15      of_printf("OF: Xen/PPC version %d.%d%s (%s@%s) (%s) %s\n",
  108.16 -              XEN_VERSION, XEN_SUBVERSION, XEN_EXTRAVERSION,
  108.17 -              XEN_COMPILE_BY, XEN_COMPILE_DOMAIN,
  108.18 -              XEN_COMPILER, XEN_COMPILE_DATE);
  108.19 +              xen_major_version(), xen_minor_version(), xen_extra_version(),
  108.20 +              xen_compile_by(), xen_compile_domain(),
  108.21 +              xen_compiler(), xen_compile_date());
  108.22  
  108.23      of_printf("%s args: 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx\n"
  108.24              "boot msr: 0x%lx\n",
   109.1 --- a/xen/arch/powerpc/domain_build.c	Tue Aug 01 14:58:20 2006 -0600
   109.2 +++ b/xen/arch/powerpc/domain_build.c	Wed Aug 02 13:39:47 2006 -0600
   109.3 @@ -25,7 +25,7 @@
   109.4  #include <xen/init.h>
   109.5  #include <xen/ctype.h>
   109.6  #include <xen/iocap.h>
   109.7 -#include <xen/compile.h>
   109.8 +#include <xen/version.h>
   109.9  #include <asm/processor.h>
  109.10  #include <asm/papr.h>
  109.11  #include "oftree.h"
  109.12 @@ -153,7 +153,7 @@ int construct_dom0(struct domain *d,
  109.13      printk("xen_start_info: %p\n", si);
  109.14  
  109.15      sprintf(si->magic, "xen-%i.%i-powerpc%d%s",
  109.16 -            XEN_VERSION, XEN_SUBVERSION, BITS_PER_LONG, "HV");
  109.17 +            xen_major_version(), xen_minor_version(), BITS_PER_LONG, "HV");
  109.18      si->flags = SIF_PRIVILEGED | SIF_INITDOMAIN;
  109.19  
  109.20      si->shared_info = ((ulong)d->shared_info) - rma;
   110.1 --- a/xen/arch/powerpc/mpic_init.c	Tue Aug 01 14:58:20 2006 -0600
   110.2 +++ b/xen/arch/powerpc/mpic_init.c	Wed Aug 02 13:39:47 2006 -0600
   110.3 @@ -21,7 +21,6 @@
   110.4  #include <xen/config.h>
   110.5  #include <xen/init.h>
   110.6  #include <xen/lib.h>
   110.7 -#include <xen/compile.h>
   110.8  #include <asm/mpic.h>
   110.9  #include "mpic_init.h"
  110.10  #include "oftree.h"
   111.1 --- a/xen/arch/powerpc/ofd_fixup.c	Tue Aug 01 14:58:20 2006 -0600
   111.2 +++ b/xen/arch/powerpc/ofd_fixup.c	Wed Aug 02 13:39:47 2006 -0600
   111.3 @@ -21,7 +21,7 @@
   111.4  #include <xen/config.h>
   111.5  #include <xen/lib.h>
   111.6  #include <xen/sched.h>
   111.7 -#include <xen/compile.h>
   111.8 +#include <xen/version.h>
   111.9  #include <public/xen.h>
  111.10  #include "of-devtree.h"
  111.11  
  111.12 @@ -420,7 +420,7 @@ static ofdn_t ofd_xen_props(void *m, str
  111.13          ofd_prop_add(m, n, "name", &path[1], sizeof (path) - 1);
  111.14  
  111.15          xl = snprintf(xen, sizeof (xen), "Xen-%d.%d%s",
  111.16 -                XEN_VERSION, XEN_SUBVERSION, XEN_EXTRAVERSION);
  111.17 +                xen_major_version(), xen_minor_version(), xen_extra_version());
  111.18          ASSERT(xl < sizeof (xen));
  111.19          ofd_prop_add(m, n, "version", xen, xl + 1);
  111.20  
   112.1 --- a/xen/arch/powerpc/powerpc64/traps.c	Tue Aug 01 14:58:20 2006 -0600
   112.2 +++ b/xen/arch/powerpc/powerpc64/traps.c	Wed Aug 02 13:39:47 2006 -0600
   112.3 @@ -22,7 +22,7 @@
   112.4  #include <xen/lib.h>
   112.5  #include <xen/console.h>
   112.6  #include <public/xen.h>
   112.7 -#include <xen/compile.h>
   112.8 +#include <xen/version.h>
   112.9  #include <xen/sched.h>
  112.10  
  112.11  void show_registers(struct cpu_user_regs *regs)
  112.12 @@ -32,7 +32,7 @@ void show_registers(struct cpu_user_regs
  112.13      console_start_sync();
  112.14      
  112.15      printk("----[ Xen-%d.%d%s     ]----\n",
  112.16 -           XEN_VERSION, XEN_SUBVERSION, XEN_EXTRAVERSION);
  112.17 +           xen_major_version(), xen_minor_version(), xen_extra_version());
  112.18      printk("CPU: %08x   DOMID: %08x\n",
  112.19             smp_processor_id(), current->domain->domain_id);
  112.20      printk("pc %016lx msr %016lx\n"
   113.1 --- a/xen/arch/x86/dom0_ops.c	Tue Aug 01 14:58:20 2006 -0600
   113.2 +++ b/xen/arch/x86/dom0_ops.c	Wed Aug 02 13:39:47 2006 -0600
   113.3 @@ -429,7 +429,7 @@ long arch_do_dom0_op(struct dom0_op *op,
   113.4          ret = 0;
   113.5  
   113.6          hypercall_page = map_domain_page(mfn);
   113.7 -        hypercall_page_initialise(hypercall_page);
   113.8 +        hypercall_page_initialise(d, hypercall_page);
   113.9          unmap_domain_page(hypercall_page);
  113.10  
  113.11          put_page_and_type(mfn_to_page(mfn));
   114.1 --- a/xen/arch/x86/domain.c	Tue Aug 01 14:58:20 2006 -0600
   114.2 +++ b/xen/arch/x86/domain.c	Wed Aug 02 13:39:47 2006 -0600
   114.3 @@ -819,7 +819,7 @@ unsigned long hypercall_create_continuat
   114.4  #if defined(__i386__)
   114.5          regs->eax  = op;
   114.6  
   114.7 -        if ( supervisor_mode_kernel )
   114.8 +        if ( supervisor_mode_kernel || hvm_guest(current) )
   114.9              regs->eip &= ~31; /* re-execute entire hypercall entry stub */
  114.10          else
  114.11              regs->eip -= 2;   /* re-execute 'int 0x82' */
   115.1 --- a/xen/arch/x86/domain_build.c	Tue Aug 01 14:58:20 2006 -0600
   115.2 +++ b/xen/arch/x86/domain_build.c	Wed Aug 02 13:39:47 2006 -0600
   115.3 @@ -15,7 +15,7 @@
   115.4  #include <xen/elf.h>
   115.5  #include <xen/kernel.h>
   115.6  #include <xen/domain.h>
   115.7 -#include <xen/compile.h>
   115.8 +#include <xen/version.h>
   115.9  #include <xen/iocap.h>
  115.10  #include <xen/bitops.h>
  115.11  #include <asm/regs.h>
  115.12 @@ -704,7 +704,7 @@ int construct_dom0(struct domain *d,
  115.13              return -1;
  115.14          }
  115.15  
  115.16 -        hypercall_page_initialise((void *)hypercall_page);
  115.17 +        hypercall_page_initialise(d, (void *)hypercall_page);
  115.18      }
  115.19  
  115.20      /* Copy the initial ramdisk. */
  115.21 @@ -726,7 +726,8 @@ int construct_dom0(struct domain *d,
  115.22      si->nr_pt_frames = nr_pt_pages;
  115.23      si->mfn_list     = vphysmap_start;
  115.24      sprintf(si->magic, "xen-%i.%i-x86_%d%s",
  115.25 -            XEN_VERSION, XEN_SUBVERSION, BITS_PER_LONG, xen_pae ? "p" : "");
  115.26 +            xen_major_version(), xen_minor_version(),
  115.27 +            BITS_PER_LONG, xen_pae ? "p" : "");
  115.28  
  115.29      /* Write the phys->machine and machine->phys table entries. */
  115.30      for ( pfn = 0; pfn < d->tot_pages; pfn++ )
   116.1 --- a/xen/arch/x86/hvm/hvm.c	Tue Aug 01 14:58:20 2006 -0600
   116.2 +++ b/xen/arch/x86/hvm/hvm.c	Wed Aug 02 13:39:47 2006 -0600
   116.3 @@ -27,6 +27,7 @@
   116.4  #include <xen/softirq.h>
   116.5  #include <xen/domain.h>
   116.6  #include <xen/domain_page.h>
   116.7 +#include <xen/hypercall.h>
   116.8  #include <asm/current.h>
   116.9  #include <asm/io.h>
  116.10  #include <asm/shadow.h>
  116.11 @@ -329,6 +330,65 @@ void hvm_print_line(struct vcpu *v, cons
  116.12  	pbuf[(*index)++] = c;
  116.13  }
  116.14  
  116.15 +#if defined(__i386__)
  116.16 +
  116.17 +typedef unsigned long hvm_hypercall_t(
  116.18 +    unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
  116.19 +#define HYPERCALL(x) [ __HYPERVISOR_ ## x ] = (hvm_hypercall_t *) do_ ## x
  116.20 +static hvm_hypercall_t *hvm_hypercall_table[] = {
  116.21 +    HYPERCALL(mmu_update),
  116.22 +    HYPERCALL(memory_op),
  116.23 +    HYPERCALL(multicall),
  116.24 +    HYPERCALL(update_va_mapping),
  116.25 +    HYPERCALL(event_channel_op_compat),
  116.26 +    HYPERCALL(xen_version),
  116.27 +    HYPERCALL(grant_table_op),
  116.28 +    HYPERCALL(event_channel_op)
  116.29 +    /*HYPERCALL(hvm_op)*/
  116.30 +};
  116.31 +#undef HYPERCALL
  116.32 +
  116.33 +void hvm_do_hypercall(struct cpu_user_regs *pregs)
  116.34 +{
  116.35 +    if ( ring_3(pregs) )
  116.36 +    {
  116.37 +        pregs->eax = -EPERM;
  116.38 +        return;
  116.39 +    }
  116.40 +
  116.41 +    if ( pregs->eax > ARRAY_SIZE(hvm_hypercall_table) ||
  116.42 +         !hvm_hypercall_table[pregs->eax] )
  116.43 +    {
  116.44 +        DPRINTK("HVM vcpu %d:%d did a bad hypercall %d.\n",
  116.45 +                current->domain->domain_id, current->vcpu_id,
  116.46 +                pregs->eax);
  116.47 +        pregs->eax = -ENOSYS;
  116.48 +    }
  116.49 +    else
  116.50 +    {
  116.51 +        pregs->eax = hvm_hypercall_table[pregs->eax](
  116.52 +            pregs->ebx, pregs->ecx, pregs->edx, pregs->esi, pregs->edi);
  116.53 +    }
  116.54 +}
  116.55 +
  116.56 +#else /* __x86_64__ */
  116.57 +
  116.58 +void hvm_do_hypercall(struct cpu_user_regs *pregs)
  116.59 +{
  116.60 +    printk("not supported yet!\n");
  116.61 +}
  116.62 +
  116.63 +#endif
  116.64 +
  116.65 +/* Initialise a hypercall transfer page for a VMX domain using
  116.66 +   paravirtualised drivers. */
  116.67 +void hvm_hypercall_page_initialise(struct domain *d,
  116.68 +                                   void *hypercall_page)
  116.69 +{
  116.70 +    hvm_funcs.init_hypercall_page(d, hypercall_page);
  116.71 +}
  116.72 +
  116.73 +
  116.74  /*
  116.75   * only called in HVM domain BSP context
  116.76   * when booting, vcpuid is always equal to apic_id
   117.1 --- a/xen/arch/x86/hvm/i8259.c	Tue Aug 01 14:58:20 2006 -0600
   117.2 +++ b/xen/arch/x86/hvm/i8259.c	Wed Aug 02 13:39:47 2006 -0600
   117.3 @@ -590,7 +590,7 @@ int cpu_get_pic_interrupt(struct vcpu *v
   117.4  
   117.5      /* read the irq from the PIC */
   117.6      intno = pic_read_irq(s);
   117.7 -    *type = VLAPIC_DELIV_MODE_EXT;
   117.8 +    *type = APIC_DM_EXTINT;
   117.9      return intno;
  117.10  }
  117.11  
  117.12 @@ -598,7 +598,7 @@ int is_pit_irq(struct vcpu *v, int irq, 
  117.13  {
  117.14      int pit_vec;
  117.15  
  117.16 -    if (type == VLAPIC_DELIV_MODE_EXT)
  117.17 +    if (type == APIC_DM_EXTINT)
  117.18          pit_vec = v->domain->arch.hvm_domain.vpic.pics[0].irq_base;
  117.19      else
  117.20          pit_vec =
   118.1 --- a/xen/arch/x86/hvm/io.c	Tue Aug 01 14:58:20 2006 -0600
   118.2 +++ b/xen/arch/x86/hvm/io.c	Wed Aug 02 13:39:47 2006 -0600
   118.3 @@ -695,12 +695,11 @@ void hvm_io_assist(struct vcpu *v)
   118.4  
   118.5              if ( p->type == IOREQ_TYPE_PIO )
   118.6                  hvm_pio_assist(regs, p, io_opp);
   118.7 -            else {
   118.8 +            else
   118.9                  hvm_mmio_assist(regs, p, io_opp);
  118.10 -                hvm_load_cpu_guest_regs(v, regs);
  118.11 -            }
  118.12  
  118.13              /* Copy register changes back into current guest state. */
  118.14 +            hvm_load_cpu_guest_regs(v, regs);
  118.15              memcpy(guest_cpu_user_regs(), regs, HVM_CONTEXT_STACK_BYTES);
  118.16          }
  118.17          /* else an interrupt send event raced us */
   119.1 --- a/xen/arch/x86/hvm/platform.c	Tue Aug 01 14:58:20 2006 -0600
   119.2 +++ b/xen/arch/x86/hvm/platform.c	Wed Aug 02 13:39:47 2006 -0600
   119.3 @@ -827,7 +827,6 @@ void handle_mmio(unsigned long va, unsig
   119.4  
   119.5      /* Copy current guest state into io instruction state structure. */
   119.6      memcpy(regs, guest_cpu_user_regs(), HVM_CONTEXT_STACK_BYTES);
   119.7 -
   119.8      hvm_store_cpu_guest_regs(v, regs, NULL);
   119.9  
  119.10      if ((inst_len = hvm_instruction_length(v)) <= 0) {
   120.1 --- a/xen/arch/x86/hvm/svm/intr.c	Tue Aug 01 14:58:20 2006 -0600
   120.2 +++ b/xen/arch/x86/hvm/svm/intr.c	Wed Aug 02 13:39:47 2006 -0600
   120.3 @@ -76,7 +76,7 @@ interrupt_post_injection(struct vcpu * v
   120.4  
   120.5      switch(type)
   120.6      {
   120.7 -    case VLAPIC_DELIV_MODE_EXT:
   120.8 +    case APIC_DM_EXTINT:
   120.9          break;
  120.10  
  120.11      default:
  120.12 @@ -112,7 +112,7 @@ asmlinkage void svm_intr_assist(void)
  120.13      struct hvm_domain *plat=&v->domain->arch.hvm_domain; 
  120.14      struct periodic_time *pt = &plat->pl_time.periodic_tm;
  120.15      struct hvm_virpic *pic= &plat->vpic;
  120.16 -    int intr_type = VLAPIC_DELIV_MODE_EXT;
  120.17 +    int intr_type = APIC_DM_EXTINT;
  120.18      int intr_vector = -1;
  120.19      int re_injecting = 0;
  120.20      unsigned long rflags;
  120.21 @@ -172,9 +172,9 @@ asmlinkage void svm_intr_assist(void)
  120.22      /* have we got an interrupt to inject? */
  120.23      if (intr_vector >= 0) {
  120.24          switch (intr_type) {
  120.25 -        case VLAPIC_DELIV_MODE_EXT:
  120.26 -        case VLAPIC_DELIV_MODE_FIXED:
  120.27 -        case VLAPIC_DELIV_MODE_LPRI:
  120.28 +        case APIC_DM_EXTINT:
  120.29 +        case APIC_DM_FIXED:
  120.30 +        case APIC_DM_LOWEST:
  120.31              /* Re-injecting a PIT interruptt? */
  120.32              if (re_injecting && 
  120.33                  is_pit_irq(v, intr_vector, intr_type)) {
  120.34 @@ -185,10 +185,10 @@ asmlinkage void svm_intr_assist(void)
  120.35              svm_inject_extint(v, intr_vector, VMX_DELIVER_NO_ERROR_CODE);
  120.36              interrupt_post_injection(v, intr_vector, intr_type);
  120.37              break;
  120.38 -        case VLAPIC_DELIV_MODE_SMI:
  120.39 -        case VLAPIC_DELIV_MODE_NMI:
  120.40 -        case VLAPIC_DELIV_MODE_INIT:
  120.41 -        case VLAPIC_DELIV_MODE_STARTUP:
  120.42 +        case APIC_DM_SMI:
  120.43 +        case APIC_DM_NMI:
  120.44 +        case APIC_DM_INIT:
  120.45 +        case APIC_DM_STARTUP:
  120.46          default:
  120.47              printk("Unsupported interrupt type: %d\n", intr_type);
  120.48              BUG();
   121.1 --- a/xen/arch/x86/hvm/svm/svm.c	Tue Aug 01 14:58:20 2006 -0600
   121.2 +++ b/xen/arch/x86/hvm/svm/svm.c	Wed Aug 02 13:39:47 2006 -0600
   121.3 @@ -456,6 +456,28 @@ void svm_init_ap_context(struct vcpu_gue
   121.4      ctxt->flags = VGCF_HVM_GUEST;
   121.5  }
   121.6  
   121.7 +static void svm_init_hypercall_page(struct domain *d, void *hypercall_page)
   121.8 +{
   121.9 +    char *p;
  121.10 +    int i;
  121.11 +
  121.12