summaryrefslogtreecommitdiff
path: root/support/vvcode
diff options
context:
space:
mode:
Diffstat (limited to 'support/vvcode')
-rw-r--r--support/vvcode/00README10
-rw-r--r--support/vvcode/binaries/msdos/vvdecode.boo1528
-rw-r--r--support/vvcode/binaries/msdos/vvencode.boo1308
-rw-r--r--support/vvcode/binaries/os2/vvdecode.boo1775
-rw-r--r--support/vvcode/binaries/os2/vvencode.boo1589
-rw-r--r--support/vvcode/checkos.h476
-rw-r--r--support/vvcode/decode.xlt29
-rw-r--r--support/vvcode/descrip.mms186
-rw-r--r--support/vvcode/doc/texinfo.tex3229
-rw-r--r--support/vvcode/doc/vvcode.tex255
-rw-r--r--support/vvcode/doc/vvfiles.tex1287
-rw-r--r--support/vvcode/doc/vvinstal.tex17
-rw-r--r--support/vvcode/doc/vvintro.tex483
-rw-r--r--support/vvcode/doc/vvport.tex704
-rw-r--r--support/vvcode/doc/vvtest.tex432
-rw-r--r--support/vvcode/doc/vvuser.tex200
-rw-r--r--support/vvcode/encode.xlt29
-rw-r--r--support/vvcode/globals.h1108
-rw-r--r--support/vvcode/local.h250
-rw-r--r--support/vvcode/machine.h889
-rw-r--r--support/vvcode/ms-bcc.mak160
-rw-r--r--support/vvcode/ms-msc.mak160
-rw-r--r--support/vvcode/msdos.c1883
-rw-r--r--support/vvcode/msdos.mak160
-rw-r--r--support/vvcode/os2-cset.mak161
-rw-r--r--support/vvcode/os2-gcc.mak161
-rw-r--r--support/vvcode/os2-msc.mak161
-rw-r--r--support/vvcode/os2.c1774
-rw-r--r--support/vvcode/os2.mak161
-rw-r--r--support/vvcode/random.tbl1
-rw-r--r--support/vvcode/reverse.xlt29
-rw-r--r--support/vvcode/specific.h1089
-rw-r--r--support/vvcode/unix.c1681
-rw-r--r--support/vvcode/unix.mak353
-rw-r--r--support/vvcode/uucode.tbl5
-rw-r--r--support/vvcode/vaxvms.c2655
-rw-r--r--support/vvcode/vmcms.c1829
-rw-r--r--support/vvcode/vmsbuild.com120
-rw-r--r--support/vvcode/vvcode.cld465
-rw-r--r--support/vvcode/vvdecode.c3562
-rw-r--r--support/vvcode/vvencode.c2349
-rw-r--r--support/vvcode/vveparse.c913
-rw-r--r--support/vvcode/vveparse.h109
-rw-r--r--support/vvcode/vvutils.c2729
-rw-r--r--support/vvcode/vvutils.h178
45 files changed, 38632 insertions, 0 deletions
diff --git a/support/vvcode/00README b/support/vvcode/00README
new file mode 100644
index 0000000000..247390903d
--- /dev/null
+++ b/support/vvcode/00README
@@ -0,0 +1,10 @@
+THIS SOFTWARE IS STILL UNDER DEVELOPMENT!!!
+
+
+Use it at your own risk, and be aware that the software and documentation
+may change at any time.
+
+The author can be contacted as Kempson@tex.ac.uk, but please do not mail
+him except to report bugs or offer improvements.
+
+December 1992
diff --git a/support/vvcode/binaries/msdos/vvdecode.boo b/support/vvcode/binaries/msdos/vvdecode.boo
new file mode 100644
index 0000000000..d2fc3532e6
--- /dev/null
+++ b/support/vvcode/binaries/msdos/vvdecode.boo
@@ -0,0 +1,1528 @@
+VVDECODE.EXE
+CEZ@07D00@0P~3oomQ3X00~6?P000040ne1ZLP00~J0@00~~~~~~~~~~~i^_h9;XTFS@:d<<dQ
+Rbh208\N;02>fZ>B08`6T0297X`0RBjX0>R10L@nRP2;ah_H^Omoo?:^hf539SP5MOJ0cH3gfHT>
+RP2i0@3Chh?328?Sn8TNSP2<fR_ZRci8=H7o009c1kl00XTnB3F1abI6LRP3?V0dLR:a1=?_Ac__
+LQV3?TPe07@7PciP=01e3[l043__M`N;oN\3jM`1Rml3fXTNX0297Z@0XI00:mR>`;A:EldQGm?W
+nXkBRnOk<l0^SPJ=0[mJ>[TVAR_?o?>ZPchb=1AfAh0nTP03LT1g1h0nT`0NLSNh0ERk0P3=8G8Z
+]6N;7S8dcB5b8;A8^`40cB5b5d2SZ018S\2dBLdQLPZh0ERk~2cB5c0nUK0K@0cAZ95YH0R@jH
+00[0M0bh@02>`;]`02K61`4ckBj>1Xd2_T8j_eXjj=00ocJ80?lfQP3o=X@0j:8[D>RSHbj>1Xd2
+EUNnFSZoFS[X[@1OG\=FEbj>1Xd2<l2;l;T_02H2183D04KRmbeL3G@9^AT0^Rl0j=`0Gek3Rnbd
+C8Y60\dQ^@h0^TP0jMD07[P0=LdQRAid08`6MP2h13G=8HTNN02<1WX0^0DecB697W`0S0In0;P6
+=LdQRAj008`6PP2h02F<bXkJ^Z01cB4O`ajh02G55W@0cB4O7[P49LDFN03=8AlN^0DUaAIl0<dQ
+7ajh1RG55X00cB4O`h7n@SYd13;Tj`:doh_GRmhkgg@S9X0oog@HPOi2>W@69SYW0N\49SQW0GL6
+9XYW0H_CPl<6jmTkeg@KRmXVP3l09\H7o`Id1bKoG`87jk4VoeL21n^Z`kA0^`80cB73^Ah0^UH0
+;XhNS@;Xj_nh0`1@j85R~20@1ERnb3k79FEh]f18]n33TVW01b0nPjMh1l0`5e6omd15OXnIAI
+FENh4P=@<l1@j65>Pl@6\07[J8e6SU3oMPKXkR1IFHQ6oh1no`5d5[SE?E2h5P=@^040D>RlG8?4
+1[00jm>=AXi@^3l3D?lfbc_XN9:3a0JheCe@ocK;>kP1053XU5b3a0IGSDJ>D?mf2_mf2>SI5X?4
+28Q6ohY6on^FGej;iEg3EH_\Pn`nEULi9Y`0LP?XVWJhFC]@ocIc>[QV0e3o=\\kj22BPl@8^=Dm
+D?lfbc^h0@1@j3aLPl@6ocJ_>olf[C_o=W<j^8d3D?lfbc_Xm963a0ZheCe@ocK;>kP1053X45b3
+a0K7A_`00<M6nP0@^;@3D?mfn^QF<UUIRDKVadKd~2RdKVRDK^^7DjD;QI>e3o=\lkocIL>S?0
+^P08D5;XLC63a0b;l0_fMCR;7ZXkmdL2801d2KSE?E2h`P?[1kSE?E2hj`=@^0@0D>RSFh?41S?0
+D;QI>e3X34MIFNQfCnRHG8X4V=7PRmR3_hHnogDi^5TkD?lf[c_o=ZdkRPBHD8X4V52h1PA@ocK;
+>nPcTH?43[SE?E3o=\\k^0@0D>Q?Fh?41^QCG>\>RPBHdN2;f8^7QSj9A_16Pgk`07d`ogK`^3d4
+D?lfbc_XmY23a0JheCe@ocK;>kP4053X4U^3a0IF^5TkD>QmAUUIj0aLPgk`07@3jJ01^7DjD;QI
+>e3o=\lkocIL>S?0^P08D5;XPC23a0b;l0_fMBBheCe@^5d4D;P4053XaeZ3a0Hc`52hFC]@j316
+FEWXVTkX_5^h9@5@E[QI>e3X?3J3a0J9A_:;A_8m201d23d>07@bjAP1ocJ_>olf[C_o=W<j^7P4
+D?lfbc_XBi23a0ZheCe@ocK;>kP1053XIeZ3a0KY]`B3?V@j0W@aocI[0KRO153o=\\kj1f@Pl@6
+^=DmD?lfbc^h101@j3UJPl@6E[QI>e3XY4EIFNPcFh]6l[X50?OZ1BD1D5JhFC]@j4hkPl@6SDK\
+D;S5152;A_:j1@3gjX_HokLX0NP_T8?41_l6LcZ;A^`k1W<jM3CoM^co=V\1^<T4D?lfbc_XZHn3
+a0RheCe@ocK;>kP4053XaEV3a0IF^5TkD>P`AEUIj;mJocJ_>olf[C^;A^a8D;SL153o=\\kj6n?
+Pl@:^=DmD?lfbc^h0@1@j8]IPl@6^5TkD?lfLc[Xj@EIFNW40kSE?E2h0`E@^0@0D>QYFH?41UJh
+FC]@j=A4FEWXHeZ;A_050P2k0`2Imo_Ah=7PRDKfPciJ>P1d2olfFS[X0I9I0DKfE^SiTETkA_Ic
+=UKXki5ID?mfm[PH1E3o=\\kj>R>Pl@8^=DmD?lfbc^h0`1@j0AIPl@6E[QI>e3XKdAIFNU30h<n
+dcX3M@?Y^@2;A^J9A^j;A_29A_k[7omfkUKoM_kX;P>3a0J9A_R3aPB;A_P1A^j;A_PYA_j3O_h0
+Om\con\fRekVX5Dk<P4Tok@0dN3Ah8_HRhN=@8^GRd1@DX\FEc^QEC^a2>PAGe\cf5Pc`Z=G>hTN
+EC]7>gk`L\F0?^P00GDN<oo[5H]NiXX1]03Ah8_HRXOE>h]NiXP1Ac]nl7;V^>TjD?mfiX]6l9UB
+D>R=FH?428]6l9T11U4k4AIC>nUm0X=nm01d0nV60He6`U1F^080D>Qh0X?41XU6n8Y6`YRI9Ol0
+Pn80\@SXJej9E^B9A^::A\>HVBGo08?R0056hQ5Fi8=ni01l5WD6PgkR078>PgkT07`kO`J3O^;o
+MS?oM^CoM^:h>PE@ocK;>nRDSH?42;SE?E3o=\\k^0@0D>R`Eh?41UJhFC]@j1]3FEWXZUR;A^B;
+E^8kA_am0nV507l5>eKjMWkoM^;oM^KXgVmIFHU6iX=niP1e:Omfi?mfh[QO1E3o=\\kj3R=Pl@8
+^=DmD?lfbc^h101@j5AGPl@6j5QHRdKTReKRRDKlREKjP3j8@05e;[RC1E2h4S=@j3UnFEWoM^Co
+M^:hV`E@^18cD>PVOX?42;S?1E2h4S=@j1QnFEV;A_29A_j;A^J9A^koM^iFogKnj5<1Pl@6RDKh
+PlH4Rek^RTL2Rek^R0OoA^k[6OmfkUKoM_kX<063a0J9A_R3aPB;A_P1A^j;A_PYA_j3O_h0Om_7
+A_@108]6i8]FhXU6jXUFj8=^l0;[;H]6l8U6o^\OogK^E_mfo^S\08?41XU6n8?618]6n056kX]6
+n2U6oX=noP1ofh]6l9TYA^PIE^Z3O^X0OP?Y[P1e2H=nj01f0nVS03?ojcJ;G^JPEC\b0BCo]03A
+h=7PRmR;Qhe0RiN;@51BRaIG>j5E>k48j;5LFc?HF3?2XeLkRAiE>dLkO^9baH0nj001MAhcon\E
+RekVRP6d0=7PRmR:QmDkRekVR057>gkRL^J3?T<k0gDB^>TjD?mfi_mfi?mfh^QfEn\@^>TjD?mf
+i_mfi?mfh^PDEh?42<M6m000RdKTReKR0AIA>a46Dc_Yb?WoM^KXhF]IGej;iEg3EH_\Pn`<EULi
+9Y`0LP?Xc6lcmX=n105m0nWN08]N1XX7V=7PRmR3_hHnogDo^5TkD?lf[c_o=ZdkReh6RPNHD8]N
+1XX7V52hd@E@ocK;>nPTRh?43[SE?E3o=\\k^0@0D>Q0EH?41^Q4E^\AReh6RPNHdN2;f8^7QSj9
+A_j;GPJ:A`6HdN2;f8>oQSkoMD6hFC]@ocJ_>olf[C^;GPJ:A`6HD8]N1XY70IQ@^0P6D?lfbc_X
+`8Z3a0jheCe@ocK;>kP4053Xg5B3a0KXh5G[3h]N1XY70ISAh8_HRkn6?X]6o]7PdN2;ek44doX;
+`XU6n8]N28Y6n8P7AX=n109m0nV108]N1XY70YSAh8_HPkn6?_me@KQI>e3o=ZlkocJ]>h]N1XY7
+0YQ@Reh6RTL2V52h?`I@ocK;>nPjRX?43[SE?E3o=\\k^0@0D>QFE8?41^QJEN\BReh6RTL2V=7P
+RmR;QhHnRDKlRlNa1=?PReKldO[AnP_2RDKfReh8RTKfR4L1AX=n10=lO8]N1XY70iSAh8_HPkn6
+?_me@KQI>e3o=ZlkocJ]>h]N1XY70iQ@Reh6RTL3V52hMPI@ocK;>nRcRH?43[SE?E3o=\\k^0@0
+D>S?Dh?41^SCE>\BReh6RTL3V=7PRmR;QhHnRDKjRdKl\@KCh0]6nXU6m8]N28Y6m8Q70TJ;a^\0
+Gej;iEg3EH_\Pn`8EUN;MPHi9Y`0LP?X^Ff3OPASORNhH`1@^:d6D?lfbc_X?HV3a0JheCe@ocK;
+>kP4053XFE>3a0KXGEC7A_P108]4EX]DE8U6o8UFn[Qe>U1FocK?>olfG3Xc`;X0251Bj<dXPl@<
+RoP;og@3jHD1ReaAmdL2801e0nUG0H1lD`5e=?mfn;SB1U3o=\\kj=28Pl@6^=DmD?lfbc^h101@
+j>aBPl@6<l1@^5TkD>QE?UUIj>ACjfR0?XQ00GD[^?@6D;PB<e3XcgUIFOmfn;Sl1U2h4S=@j;mi
+Pl@6^2h7D;PB<e3X\GUIFH0nR401MBnh<0M@^18cD>RMNEUIE_mdE_mdE;Ph1e2h4S=@j8UiPl@:
+^6L7D;PB<e3XNgUIFH]6n3d107@<?@80M7Lm0`1dBn]`P3j8@05e:KQY1e2h4S=@j5=iFEUF^747
+D;PB<e3XAGV3a0JhU@M@^18cD>PgNEUIogAAj9^6FLM4EP00adAD~2adKh0P3YQP5FogH4^9L7
+D?lfbc_XeXN3a0RheCe@ocK;>kP4053XlU63a0KXmU;oM_Rh^PM@ocK;>nR`Qh?41[SE?E3o=\\k
+^0@0D>S<DH?41S?0D5KX>3eIFNS7D^\Q^=DmD;SL1e2h101@j:aAPl@6<l1@E^PH?EUIj895j:AB
+Pgkh0WERRdAFReAD>dKlO5Me1C]FnW9@P3j8@05e;;S_1e2h4S=@j7UhFEUFogH4^?L7D;PB<e3X
+J7R3a0Rh:PQ@^18cD>QJN5UIE^SD:5UFogH4j1h7FEW7A_P30<M4EP00adAD~2^2D1D5MFj;l\
+Pl@6RDKnPgkn3GE4E[QV0E3o=\TkogH4EnQM7h?42S`1MB_oM5KoM5CoMPBh;0Q@ocK;>nS4QX?4
+2[SE?E3o=\\k^040D>SPD8?41^]]jdb0?[P00GA5Pgkn3gDoE[Q`0E1Gj<@9Pl@6RoP;ogDN^=Dm
+D;QC252h101@j:]@Pl@6<l1@E^PG?5UIj:IAocIc0KQ5?U3XUXQIFN\L^7DjD5Ko=\lkocIL>S?0
+^P08D5;X62J3a0b;n>U8oEmNRnEM`eF;k8?\LUHi9Y`0LP?XTF[71Zlk~2a`J]>`00a`Ic>P40
+^5TkD;P90E3Xb0AIFKQ`252hD@1@j8\VFEV;l3?0D3?0D5Hc`52hFC]@j:=>Pl@:P3kF005e2<L6
+JcX10>\EP3j\>`5e2<L6JcX00>\6a`I[>P80^=DmD?lfJcYF^<L0D>S9;h?42;Re252hYPQ@^9`8
+D;Qn253o=\\kj9Z5Pl@:^=DmD?lfbc^h0@1@j;I?Pl@6^5TkD;S1253o=\\kj7J5Pl@6^=DmD?lf
+bc^h0@1@j99?Pl@6P3kF005e1KP=2N\3^149D;SW253o=\\kj4J5Pl@6^=DmD?lfbc^h0@1@j69?
+Pl@6^=DmD;PD2E3o=\\kj2:5Pl@6^=DmD?lfbc^h0@1@j3i?Pl@6<l1@j2aOFE9@j;Y>FEVhFSY@
+^5`jD;QT>U2ho@1@^?L0D>PR48?42[PU0E2hFC]@ocIT>^Pg2h?41X<nI3X2M0?YQ02hHSY@^4P1
+D>Qc7UUIPciR>P1n:kQI>e3o=V8j^3X9D?lfbc_XXXB3a0RheCe@ocK;>kP4053X_Tj3a0KX`To6
+1WTj0;Qi>U2h5@5@^5L1D>R27h?41[Qi>U2h6`5@^581D>R]7X?41[Qi>U2hH@5@j;DPFEVhNCY@
+^7D1D>Qd8UUIjc_71V8j~2aPIi>P371]<j0@371]4j~2a`KO>P20a`KM>P40a`KG>_ooa`KE>_oo
+a`KK>_ooa`KI>_oo^60jD;QL0E3Xb1mIFKQN>U2h>@5@j14MFEWo=\Tk^7X9D?lfbc_XhH>3a0Jh
+eCe@ocK;>kP1053XoDf3a0JhACi@^400D;Re053XR@n3a0JhQSi@^001D;Q5?U2h@01@j1ThPl@8
+a`KA>`00a`KC>`00P3kX005d4KRP2E3o=Uhjj=TiFET;`7A6SDJ>D;RV2E3o=Uhj^>\0D;SU053X
+Oo23a0Z8A_n0O_l1MA6hO`5@^=4kD8e6SU3X@3S[3kSE?E2h[0U@^040D>Q[CH?41X<ndC\0M@?Y
+aP23?]<k07D3jK`0ocKA>olfGS[XKSUIF@_0M4co=]<kocKA>kSE2E3o=\\kj0:3Pl@8^=DmD?lf
+bc^h0P1@j1i=Pl@6ocIN>[P32U3o=\\kj=j2Pl@6^=DmD?lfbc^hoom@j?Y<Pl@6ocKC>kPR2U3X
+4CUIF@_0M4co=]<kocKA>kPX2U3o=\\kj:F2Pl@8^=DmD?lfbc^h0P1@j<5<Pl@6^78:D;QF2U3o
+=\\kj862Pl@6^=DmD?lfbc^hoom@j9e<Pl@6jeVhN0Y@ocIN>^Rb>5UI2l1dB?lfGSZhOPY@ocK;
+>nQ:PX?41[SE?E3o=\\k^080D>QVC8?41[Ri2U2hW@Y@ocK;>nPVPX?41[SE?E3o=\\k^?ooD>Q2
+C8?41[SY>U2h5@5@^7TjD;S=053XhQ23a0RhjCY@^1\1D?lfH3ZhNCY@^;\0D>P=3h?42[SY>U2h
+NCY@^=T0D>Pk4X?41[SY>U2hNCY@^=l0D>Q^4h?41[QV>U2hjCY@^?40D>Q04H?41[SY>U3o=\Tk
+ocI[>[P?0E3XY@:3a0RhRd1@^;S]^R23D5:h005@j6HXPl@8a`IG>oooa`IE>oooa`IC>`00a`IA
+>`00a`K3>`00a`K1>`00a`Ig>P00a`Ie>P00E^R_HEUNRnEM`eF;k5IGRgh4RgH6>BJL0783j9QU
+P7d30G@W^=l:D;Ro2U3o=\\kj1b1Pl@6^=DmD?lfbc^h101@j3Q;Pl@6j3a<adAA~2adAH0@37
+A5X10<M4G_ooadALooo7A6;oolM4H?oo^>`:D?me1>SKPUUI2l1e5KS^2U1Fj?b2FEW7A57b<\I4
+D`7[Come15KXj89IFEJhm0Y@<l1@j50lPl@6P3j8@05e:KSh2U2h4S=@j<YaFEUF^00;D;PB<e3X
+_763a0Jh9P]@^18cD>R^LEUIE^Rk?UV9A563O540MBAF^2P;D?lfbc_XFh23a0JheCe@ocK;>kP4
+053XMdZ3a0KXNd^0O5<1M0UFj510F@[0MCV0?XQ00GDY^4H;D;PB<e3XFG5IFEJhCP]@^18cD>Q;
+LH?41[Qg2e2h4S=@j3eaFEW6A5<1E^PNB5UOGUg3EH_\Pna8EUN;OPB;MPHi9Y`0LP?XAfAG^7T;
+D8e6nU3Xe7n3a0IFSDKjD>RE?eUIE^QY?eVH2l1e@5IG^7l;D?lfbc_X\7n3a0RheCe@ocK;>kP3
+053Xc4V3a0IG^9l;D8e6^53XSgn3a0IF^500D8e6^53XS463a0J0?XQ00GDY^<H;D;PB<e3XXW1I
+FEJhcP]@^18cD>RDL8?41[Sd2e2h4S=@j8I`FEUFj9<mFHU4DH=lD@1e95JhmP]@ocK;>nPcOh?4
+1[SE?E3o=\\k^0@0D>Q?BH?41^QCBUIG^1<<D?lfbc_X3Wn3a0RheCe@ocK;>kP1053X:TV3a0IO
+GX_UGL=ERnb3k0IFEh]n18]f2STVW01b0nQ3HlM4D@00^3X<D;QA053XEamIFHU6n[Q:352hD@1@
+j4LOFEV9A_jhE`a@^540D>Pg7eUIRDKlP7d30G@3jJD0^6<<D?me1>RHP5UI2l1e5LI4D`6hI@a@
+E^ReP5UIadAA0S?[O_me15KXYH1IFH0n<@41MC;oMPSX]SiID?mfn^R>P5UI<l1@ogKlogKn<l1@
+ogKjj?m6Pl@:E_mfo?mfo^SR>H?41X0nR401MBVhK0a@^18cD>QLKeUIE[Qd352h4S=@j4i_Pl@6
+^9\<D;PB<e3X@6mIFEKoMPKXeCaIFHU4DN]jP3ha0@5eC?mf2>Po?UU@E^PIP5UIP3j8@05e:KRM
+352h4S=@j0U_FEUF^:D<D;PB<e3Xnfj3a0Jhc0a@^18cD>S]KUUIE_mf1^R2?5UIRDAAjbNhkPa@
+^<h<D?lfbc_XUgf3a0JheCe@ocK;>kP4053X\dN3a0KX]dR3O540MBAF^?\<D?lfbc_XKGf3a0Jh
+eCe@ocK;>kP4053XRDN3a0KXSDQF^1X=D?lfbc_XBGf3a0JheCe@ocK;>kP1053XIDN3a0J0O5<1
+M0UFj44mF@[0MCV0?XQ00GDY^40=D;PB<e3XBViIFEJhB0e@^18cD>PlKX?41[Qa3E2h4S=@j2i^
+FEW6A5<1E^P?AEWoM_kXBUeIogKlj4=MFOmfn^PlGEUOGX_UGL=ERnb1k0H2EULi9Y`0LP?X9V6;
+GPK6A`80^7<=D;Q1053X>1eIFH_hSHKjoE2hN`e@ogH4j?ilPl@6RDKlPgkl0GEISHKjoE3XgcMI
+SHKjoE3XM7mIRo23oT1o3Hf6n_e@EnROOUUIjc5F^8D=D?lfbc_XG7b3a0JheCe@ocK;>kP3053X
+N4J3a0Hc`53oMPSXhS5IFC?0jKD0j`?61@1Gj2EoFH_`^7DjD?mf2?lfcc_o=U`j<l2j00Q@D^SR
+6h?438U6oX=noP1e8[SE?E2h\0e@^0<0D>PUAX?41S?0D?mf2>R?<EUIj?TijjRh9@5@ogKnogH8
+j9\QPl@6?OooM0;[9omfo^RnOUV;eP?@Ro:3oT1o2omfoUOXOgeIFN\7E[S=3NU5onUdoeOXVGiI
+?D00M0MF^?P=jC7oReh6aTL20H]N1XUo0h]6o^U8oemNRnEM`eF;k87\40QFEh]f23TVW01b0nS>
+GlM4F040adAJ0@37A5koolM4G?ooadARooo7A63oolM4EP00adAD~2E^R5>EV9A563O540MBAF
+^2X>D?lfbc_X9G^3a0JheCe@ocK;>kP4053X@DF3a0KXADK6A_T0jDh1PdAD0H=DEP1FSHKfoE0c
+`;X00U1Bj>`mPl@8REKnRDKlPgkn07lfO0J3O_`0Lbj;G57gA`8P07@3jA\1^=DmD;QD3U2h0`1@
+j>U4Pl@6<l1@E^QE<5UIj;lhjOX0aTKf0;PS052=Q_KmD>Rh<5UIRoP;og@3aPD0SHKfoE3XgcEI
+SHKfoE3XM7eI2l1e0nVm08f6l?M@SHKbnE2=Q_CkD;Qi3U2=Q_KmD>RnNX?42XU6nX=nnP=d7kSE
+?E2hPPi@^0<0D>Q]A8?41Xf6m_e@E^SG;eUIjgN0?XQ00GDm^;@>D;PB<e3XE6]IFHf6l?M@SHKb
+nE2=Q_CkD?mdE_mdE;Rl3U2h4S=@j39[Pl@>^?H>D;PB<e3X96]IFOmf18f6m?]@j3<`FET;`7DR
+ogH6SHKbnE3X8S1IF@_0MA6=Q_3gD?mf2^SaNeUIaTKi0H1nn@5d0nVYoUKXHQ]IRTKij`1OGX_U
+GL=ERnb3k09FEh]f1STVW01b0nSbGKQe>U1FocK?>olfG3Xc`;X0251Bj4@IPl@<RoP;ogE7ReaA
+mdL2801d7?lf;`6hn0i@ocK;>nQBNH?41[SE?E3o=\\kj`RheCe@^1\?D;P4053XI4>3a0Hc`51F
+j=0^FEWX>SOXG4CoMPQGE^SP7X?41XU6oX=n109dBh]NoX?k47M1dN<^ojNL7X]6o[X50?OZRmSo
+]bD1^3H?D?lfbc_Xj7R3a0JheCe@ocK;>kP4053X14>3a0IGE^Qb;UUIj054j`;[08]NoT>3na5f
+0nUX0M7S;_nWN1kYQ`6;A_jj1@3gjX]N20?HP7l20GDiRdKn^PD0mnZ;GPP3f?lg^68?D?lfbc_X
+PWR3a0JheCe@ocK;>kP4053XWT:3a0IGE^P<;UUIj9]3^<TkD8]6o[X50?OZReH80m1BocIT>UIG
+j2HGPl@:jCT1RdKn^PD0mnZ;EPP3d59GE^Q86N]ORdKn^PD0mnZ;GPP3f81o0P5e>H]6o[X50?OZ
+Reh80mSo=kQg3e3o=\\kj01hPl@6^=DmD?lfbc^h101@j1a2Pl@6EeKXRReIFNPI@h]6o[X50?OZ
+ReH80m1BEeKX=B>3a0KYX01FRdKn^PD0mnZ;EPP3d59Gj>CjPl@6RoP;ogDN^=DmD;R<3e2h101@
+j<]1Pl@6<l1@E^Pg;EUIj<I2jGl0RdKn^PD0mnZ;GPP3f?lg^:T?D?lfbc_XLGN3a0JheCe@ocK;
+>kP2053XSD63a0IGE^Sk;5UIjb_[:KS[3e2hb`m@ocK;>nQ2Mh?41[SE?E3o=\\k^0@0D>QN@H?4
+1^QR@^\0^7DjD5Ko=\lkocIL>S?0^P08D5;XhAJ3a0b;n>VJoEmNRnEM`lTLl1g`7L`L:1i>7CTM
+:1i>7BPNCQe>7DhMCQdX7RPN\ae>7GXLNQbd77XLNQaj77XLNQbd77XLNQaj77XLNQaj7;@LNQaE
+Rnb3k0IFEh]n2STVW01b0nP@FlM6o000jL`1^7DjD?mf1_lfcc_o=U`j<l2j00Q@D^QH5X?438U6
+oX=noP1e0nV]0EOoM_koMPKX<ab3a0J;l8?n0g@3jLT0Pgh40W@^RlJj1@3gjX_Hoc6hn0m@ocK;
+>nQ6MX?41[SE?E3o=\\k^0@0D>QR@8?41^QV@H_6^PD0mnZ;e`?@D_mfo_mf1^R08H?41X]620EX
+052h9A1@RlJj1@3gjX_Hog43j61fPl@6RDKjPgkj0GDAReh8PgmZ07m;O0J3OfP0Ld>;a[X50?OZ
+RmSo<KPY453o=\\kj<UePl@6^=DmD?lfbc^h0`1@j>DoPl@6ogKnogH6j4l[FEV;a[X50?OZRmS6
+@@80jL40Poh6M0?Y]`23OP@2M2j;a[X50?OZRmSo<KQ<453o=\\kj7EePl@6^=DmD?lfbc^h101@
+j94oPl@6j9E0RlJj1@3gjX_G0m1BogKnogH6j:lPPl@6RdH81F`0D;Qi452;a[X50?OZRmSoL@?X
+SgF3a0J9A_Z3O_X1M4>;a[X50?OZRmSo<KQm453o=\\kj0UePl@6^=DmD?lfbc^h0`1@j2DoPl@6
+ogKnogH6j8lZFEV;a[X50?OZRmS6@@80j`;[3?m6o8=no09m0nT[oUmNRnEM`eF;k5IGRgH8Rgh:
+>BJL0783j1UIReh4P7l30GDSa`@10<L5~2Reh<a`L00;SE?E2hX11@^040D>Ri?X?41^]>Reh6
+P7l30GDHa`@30<L5~2Reh<a`L00;SE?E2hba3[8\L40P2hmQ1@j54_FHT5^?T@D>Q7;eV;GPb9
+1kSE?E2hna1@^040D>QY?X?41UmNGL=ERnb3k79FEh]n18]f23TVW01b0nR4F81m0`5eG_me18e6
+SU3X@7IIFHe6SU2h9Q5@<l1@j:D_Pl@6E_mf1Xe6SU3X8R>3a0JHRDKnPgkn07DWSDJ>D;PZ4E3o
+=\\kj==cPl@6^=DmD?lfbc^h101@j>lmPl@6j?<njg60?W810GDI^5TkD8e6SU3XfWEIFOlfL`5F
+j=1eFEW[DJ5T>Sd107@<?@80M38m0`1d6n\[^54AD8e6SU3X[GEIFKQP4E1Fj:=eFEW[9;RQ4E2=
+AXi@j9AeFEVh\17[iKSa4E2=AXi@j89eFEVh01;[dhe6SU2h@A9@ocK;>nPiLh?41[SE?E3o=\\k
+^040D>QE?H?41UJhJ19@ocK;>nPHLh?41[SE?E3o=\\k^040D>Pd?H?41X_61B00D;RA4U3o=\\k
+j?9bPl@6^=DmD?lfbc^h0@1@j0hmPl@6Gej;iEg3EH_\Pn`2EUN;OPJ;MP`i9Y`0LP?X9eOoMP[o
+MPCX`1AIFHU6oX=no_md2H]6oXU4F^V40;Rj4U3oMPSXk2QIF@_0M4SoMPRh`A9@ocK;>nR5LX?4
+1[SE?E3o=\\k^080D>RQ?8?41[SE?E2hn19@^?ooD>R??8?41X=lF01e1KP10>\3^040RDAJjbbh
+<A=@ogH8j9@XFET;`7D;PgeJog@5RdEJj`j3O5P0M@Fh0@3[0kP108U4FX]4FSd107@>?@80M0Lm
+0`1d1^\6jaO[5N\CPgaH07D5^040j`>h0@29A5[[08=lF_md;8]4F]7PReh:0mSo=kPh4e3o=\\k
+j=EaPl@6^=DmD?lfbc^h0@1@j?4kPl@6Gej;iEg3EH_\EUN;OP@i9Y`0LP?X45J0O@<1MAooM@Co
+MPKXcG=IFOmf1[QN4e0c`53X<bf3a0J`0N]T<oJhHQ<;`7@V^70CD>Q[M5T;`7HJ^7hCD>R8J5V;
+l0_fM0aFj5AdF@_0MP=FjbL;mWD]^8`C2l1d9[RG4e3X>WAI2l1f6[RR4e3XgC1I2\1d3[R]4e3o
+MPKXFg=IFN^L\03[VUmNGL=ERnb3k09FEh]n1X]f2STVW01b0nQ\EOmf2?mf1>SO4eUIRDKnPgkn
+og@8RdKnRDAHja>3OESoM0R;AER9A5S[1LM4F000RdAH2l1d1cd107@2j`;[9_mdF;Rh4e3o=\\k
+j;Q`Pl@6^=DmD?lfbc^h101@j=@jPl@6j=PkRdAHdN2;GPP3f?lg^=`CD?lfbc_XRG23a0JheCe@
+ocK;>kP1053XYCZ3a0IOGX_UGL=ERnb3k0AFEh]n18]f23TVW01b0nRnE81m0`5dAH0nR401MBNh
+0aA@^18cD>QfHEUI^0\DD;PB<e3XJF5IFKPk552h4S=@j5aQFEV;GPJ3OeP0M@O7A_h00>\5adKn
+803[=lM6o_ooSDKnD;Pm553oM@CXGG23a0J9A_b3O_`1M@f3O_h0O0N1O_ko07h;^40DD>R81EWX
+3C^:A_hTohP4Reh6PgmJ0WDXRPBHD8X4V52hKaA@ocK;>nRbKh?42;SE?E3o=\\k^040D>S>>H?4
+1UmNRnEM`eF;k8?\15IGRgh6RgH8>BJL0783j>MCE_mf1>PU4eUIREKnRDKlPgknogD6Pgklog@>
+RdKnReKlRDANREALjbB3OEkoM@J3OEcoM0j;AEj;EEb9A5j9E5c[2\M4G_ooadALoon3O5koM@V3
+O5coM@?Yc023O5X3MDR3O5h0O1Me1X=lG05b3h=lGP1l<Wl7PGaLoGmf:OmdG_mdG;RN553o=\\k
+j?1^Pl@8^=DmD?lfbc^h101@j0`iPl@6j10jjdb3O5X2MDJ3O5h0O1Me1X=lG05b3h=lGP1l<Wl7
+PGaLogmf:OmdG_mdG;S<553o=\\kj:9^Pl@8^=DmD?lfbc^h101@j;hhPl@6j<8iPgaJ0W@6PgaJ
+0gDVogANogAL^?dDD?lfbc_XKFj3a0RheCe@ocK;>kP1053XRCR3a0IOGX_UGL=ERnb3k0AFEh]n
+1X]f23TVW01b0nRRD_mf1>QB4eV9E_j9A_b1O_h0P7D6Pgkl0G@>RdKnReKlRDAVREATjbF1OFH0
+P7D6PgeT0G@>RdEVReETRDAVREATj`[7A6H0P<M4I040PGaV081e1X=lI05d;?mdI_mdI>QQ9UUI
+D;PT5E3o=\\kj<Y]Pl@6^=DmD?lfbc^h0@1@j>HgPl@6Gej;iEg3EH_\Pn`>>BJL0783j0MBXELk
+RaIE>h?bocGooj=G>hTFEC^QMcZ;5WDj0AK1>a46`c^h9@5@^7TjD;QI>e3o=V@jj:gfPl@8P3h<
+0@5e484nZS_b<W@8^5TkD>P83eV0?Q810G@:P3ha0@5d0nWI084n>S\2<gD3jLh0aTKo08<n@c\2
+M0?Y^03o=TLkocI5>olfDc_o=U4kj0Lm2l9e0nVN0:5C>h\FDC\35TDk4`I7>h?2oaGoohU6n8UF
+m_lfAc_o=TDkogKhogKfj<DlREKhRDKfRdkhRekfRaI7>j55>nPj?hUFo8U6nZ5C>h\FDC\YE_XI
+A_c7A_@00<M6lP00jbNhjCY@^6HjD3?0^P40D5;X4CR3a0R31U4k0H<FDc\0PdKb0H=Fm02;A_B;
+E_8kA_alcWD5>eKjL\O6A_l1^>TjD>PN3UWo=\<kocK1>kQ:5E3o=\\kj5=\Pl@8^=DmD?lfbc^h
+0@1@j6lfPl@6ocIc>[Qb5E3o=\\kj2m\Pl@6^=DmD?lfbc^h0@1@j4\fPl@6P3hf0@5d0nVT0:7S
+>X\FhCXk1U<kMC0k5U4kMB[o=U<kocIA>kRH5E3o=\\kj>Y[Pl@8^=DmD?lfbc^h0@1@j0HfPl@6
+jfGo=U<kocIA>kS45E3o=\\kj<1[Pl@8^=DmD?lfbc^h0@1@j=`ePl@6P7ko0GD?X6HjV52PISZH
+D;S[5N\;ocKS>_lfhCZh6AI@ocK;>nR3Jh?42;SE?E3o=\\k^080D>RO=H?41^\XocIC>olfDC^h
+AQI@ocK;>nQIJh?42;SE?E3o=\\k^040D>Qe=H?41X0nA@41M0?YR02QicZ;5^Dj>`IG>gDY>aIE
+>gDSocIG>olfEC^hO1I@ocK;>nPDJh?42;SE?E3o=\\k^040jdWo=ULkocIE>kRZ5U3o=\\kj?5Z
+Pl@8^=DmD?lfbc^h0@1@j0dePl@6ocKW>_lfiCZhdaI@ocK;>nS9JX?42;SE?E3o=\\k^080D>SU
+=8?41^\XocIG>olfEC^hoaI@ocK;>nROJX?42;SE?E3o=\\k^040D>Rk=8?41X0n?3\1M1N1?Tlk
+081e1h<nCC\1M0RhjCY@j84aFH0nbP01MA21?RHn4S=d2;SE?E3X3@aIRnEM`eF;k3TVW01b0nR\
+C[Q`5e2hHAM@^5LGD;Pg5e2h4S=@j6EKPl@:ogH4^7`GD;PB<e3XE5^3a0JhRaM@^18cD>Q6FeUI
+^<HGD;PB<e3X>E]IFOlf[`2hjQM@^>0GD;PB<e3X95^3a0Rh1aQ@ocJe0;P4652hkAM@^18cD>P:
+Fh?42_lf8@6hE1Q@ocHM0KQB653o=Ql1^50HD?lf6`6hC1Q@ocJk0;Q9652h2aQ@^18cD>SDFX?4
+6?lf`@2hH1Q@^5HHD;PB<e3X_UZ3a0RhOAQ@ocK[0;Qj652hHaQ@^18cD>RTFX?42[RM653o=\L0
+^9XHD;R1652h4S=@j8YJPl@:^>@HD?lfc@2hhAQ@^:4HD;PB<e3XL5Z3a0[o=]<0^?8HD;SX652h
+4S=@j5YJPl@8^1PID?lfl@2h5AU@^?DHD;PB<e3X@5Z3a0Zh<QU@ocKI0;P_6E2h71U@^18cD>PV
+FX?42[Q=6E3o=]l0^4XID;Pf6E2h4S=@j0aJPl@:^6\ID?lfi@2hJ1U@^54ID;PB<e3XlUV3a0[o
+=_L0^7TID;Q_6E2h4S=@j=aIPl@8ocKm0;R76E2hO1U@^18cD>S6FH?42<L6RD040>Rk<eg3EH_\
+ESTVW01b0nSKC<L6RD010;h045KXVTUIXl\kPck;>`1e65JhRQU@^18cD>R7FH?41\L6RD040>Ql
+<h0nR401MBbh_QU@^18cD>QYFEUI<l1@E[S66E2h4S=@j5QIPl@8^?LID;PB<e3XBUUIFKSi6E2h
+00Q@j948FEVScc^h1AY@^008D>R125UIXldk^0l1D;P90E2h[`1@^1@JD;PA6U3oMPKoMPCX]b^3
+a0j0?\@00GD8^1PJD>QboEV0?[800GDGP3k:005d2lH6bP01a`K;~3aPJ8@060?P`10G@8^2LJ
+D>Q5oEWXF>7XBmGXgOWX`C8c`>\0GUg3EH_\PN`60UIGRgH4Rgh:>BJL0783j=5;^4TJD8f6n_e@
+j95YFEV=Q_[mD8e6oU2hBQY@E^R_Ih?428U6o8=no09m;_le^5PJD?lfbc_X<VN3a0JheCe@ocK;
+>kP4053XCS63a0IFogH<j;XLFEWXBC:=Q_[mD>QR8UV;A_hkAPIe5Hf6n_e@ogH8j?UXFET;`7D4
+\07[1;00joYOGX_UGL=ERnaFEh]n18]f1STVW01b0nPdBh1m0P5dCKQh6U3X]b5IR@BheCe@^7hJ
+D;P1053Xg323a0JheCe@^:hJD;P2053XbS23a0JhmaY@^=HJD?lfbc_XRVJ3a0JheCe@ocK;>kSo
+on\TogD3j6\QFHT4ocBhoAY@ocK;>nQTIX?41[SE?E3o=\\k^040D>R0<8?41UmNGL=ERnb3k09F
+Eh]f18]n1STVW01b0nRKB\L5~2P7`20G@D^=DmD;PS6e2h0@1@j4T`Pl@6jeUG^5<KD?md0nQ_
+IX?41XU6oX=noP5d8?md0old^5LKD?lfbc_XkfF3a0RheCe@ocK;>kP30>\KocFhOA]@ocK;>nSB
+IH?41[SE?E3o=\\k^040D>S^;h?41UmNRnEM`eF;k8?\0UIGRgH4Rgh8>BJL0783j0M:adEJoon0
+O081M1FheCe@^:DKD;P1053X]2n3a0KYQP0c`50c`53oM0?oMPKXcPb3a0R9A_j;A_hm0@1d33d2
+07@7?@<0M0;[=8]6o]7PReh60mSo=kSE6e3o=\\kj41UPl@6^=DmD?lfbc^h0@1@j5`_Pl@6RdKn
+RDEJjbOoM0?o=;Sk6e3o=\\kj1=UPl@8^=DmD?lfbc^h0`1@j2l_Pl@6j`3[05mNRnEM`eF;k8?\
+0UIGRgH4Rgh8>BJL0783j4A9adEHoon0O081M1FheCe@^1\LD;P1053XlBj3a0KYP00c`50c`53o
+M0?oMPKX2`b3a0R9A_j;A_h;`7@7?@40M0;[=8]6o]7PReh60mSo=kQ<753o=\\kj8=TPl@6^=Dm
+D?lfbc^h0@1@j9l^Pl@6RdKnRDEHjbOoM0?o=;Qc753o=\\kj5ITPl@8^=DmD?lfbc^h0`1@j78^
+Pl@6j`3[05mNRnEM`eF;k5IGRgh4RgH6>BJL0783j8Y8P7d20GA=^9<LD>P=7eV91;SE?E2hVQa@
+^040D>Pb;X?41[SE?E2hbQa@^080D>PP;X?41[PI7E2hmAa@ocK;>nSPHh?41[SE?E3o=\\k^?oo
+jbCoM@?X`AiIR@Co=;PP7E3o=\\kj;YSPl@6^=DmD?lfbc^h0@1@j=H]Pl@6GeiM`eF;k87\20AF
+Eh]f18]n1STVW01b0nS`AlM5G_ooadELooo7AF;oolM5H?ooP7`20G@W^=DmD;Q67E2h0@1@j8h]
+Pl@6^=DmD;Qf7E2h0@1@j7`]Pl@6jFd1SHKhne2=Q_[mD;RV7E3oM0?XV6>3a0R9A_j;A_hm0@1e
+0nVE03d207@3jAT1RlL5H01@^:`MD8f6n?]@j6eSPl@6RDKlPgkl0GDLPgeR07`FM@J3OF00LPj3
+OF80O39o1X=mH?mf:\M5H_ooadEPooooM0?o=;R`7E3o=\\kj<MRPl@8^=DmD?lfbc^h0`3[7ome
+H_meH;SJ7E3o=\\kj:IRPl@8^=DmD?lfbc^h0@1@j<8\Pl@6jK<0RlL5G01@^04ND8f6n_e@j>1R
+Pl@6RDKlPgkl0GDLPgeN07`FM@J3OE`0LPj3OEh0O39o1X=mG?mf:\M5G_ooadELooooM0?o=;P5
+7U3o=\\kj3YRPl@8^=DmD?lfbc^h0`3[7omeG_meG;P^7U3o=\\kj1URPl@8^=DmD?lfbc^h0@1@
+j3D\Pl@6jbOoM0?o=;QE7U3o=\\kj?9QPl@8^=DmD?lfbc^h0`1@j0h\Pl@6j`1OGX_UGL=ERnb3
+k0AFEh]f18]n1STVW01b0nPUA\M5IP20adET0@20O081M1BheCe@^7\ND;P1053XcB^3a0K[L_md
+0nR43EV9E_j9A_b1O_h0P7D6Pgkl0G@cRdKnReKlRDEVREETogEVogETj?@IFEU@^:\ND?lfbc_X
+GF63a0JheCe@ocK;>kP10>\Nog@3ocBhdAi@ocK;>nPmHH?42;SE?E3o=\\k^0<0D>QI:h?41UmN
+RnEM`eF;k8?\15IGRgh:RgH<>BJL0783j795a`@00;Sa7U2h0@9@j8L1FEV9A_j3OPP2MEKoM_jh
+11m@ogH4j4QQPl@6RDKlPgkl0GD;ogKnj<TKFHT4jc3o=KP>7e3o=\\kj<1PPl@6^=DmD?lfbc^h
+101@j=`ZPl@6ogH4ogH6j4HFFEWXeB_[E?mfo[Pa7e3oMPCXlV23a0J9A_b3O_`1M@_oM_kXLa]I
+R@C[<?le^3lOD?lfbc_XJV23a0JheCe@ocK;>kP4053XQRZ3a0KoMPCoMPKXl1EIFNQo:oldj9\K
+FLI50P7oM_kXVd1IGej;iEg3EH_\Pn`8EUN;OPR;MPXi9Y`0LP?XP4CoMPaFogH6ogH4j0XSPl@8
+REKlRDKjReh4BlH008=no01o37`6Pgkj07<4<l3[KeKXgF9IReh>0@N3E`80^0X0D5KXTaMIFHU6
+oX=noP1d28]No\H70>\;RdH4B8_F0m29E_j;GPb3Ae@1PeMF00_oM0F0?@1e1>\QjaaGj95RFHU6
+n?mfn5MFj;lFPl@62l1e1@=fn>\3jFKoRlK[SemNRnEM`eF;k8?\0UIGRgh6>BJL0783j<Q3RgH4
+E^R=@5V9A_j3O_h0MBYG<l1@E[R97e3o=\\kj41OPl@:^=DmD?lfbc^h101@j5`YPl@6j60ZjcB0
+?XQ00GD]^;@OD;PB<e3XBe1IFELc`51F^;`OD;PB<e3X>E23a0ZhlAm@^18cD>P[D5UIRdKnj`1O
+GX_UGL=ERnb3k09FEh]f23TVW01b0nPj@lI40P37A0<00;Sc7e2h0@9@j4[oFEV;n5Nh1R1@ogH6
+j1AOPl@6RDKnPgkn0GDSEkP@853o=\\kj9QNPl@6^=DmD?lfbc^h0@1@j;@XPl@6jbgo=;Pb853o
+=\\kj7ANPl@6^=DmD?lfbc^h0`1@j90XPl@6ogH6ogH4j?XCFEUGj;@nFEmNRnEM`eF;k8?\0UJ;
+MP@i9Y`0LP?XWD:3O540M3CoM57XADaIRDKnPgkn07@TE[QE853o=\\kj1ANPl@6^=DmD?lfbc^h
+0`1@j30XPl@6j0lLGX_UGL=ERnaFEh]f13TVW01b0nQ=@X1l0`5d=80nR401MBNhKB1@^18cD>P5
+CeUI^7DPD;PB<e3Xn4iIFKR[852h4S=@j>]>FEVhoooYP`0c`52h0@1@og@4ogH6j?T4Pl@8RoR;
+gh?k0gL?dN<^ojMF>>\Ojag[6n\Iog@4^:dPD?lfbc_XLef3a0Ko=\\kj1ScFH0nR401MC>h`B1@
+^18cD>R=CUUIRlOAh8]N1P?HocNhbB1@^18cD>QeCX?41[Si852h4S=@j6M>FEV;anUjoemNGL?h
+=o@glSOf=eF;k5IGRgH4>BJL0783j7=1P7`30G@cP3j8@05e9kSk852h4S=@j2]>FEVh0b5@^18c
+D>PNCUUI^3DQD;PB<e3X4DiIFKSoon]k<l1@^040D?md1?mf1^PP18?428_hRlL;`7@7?@40M0;[
+0^\Iog@4^3LQD?lfbc_XXEb3a0Ko=\\kj4KbFH0nR401MC>hBB5@^18cD>RkCEUIRlOAh8]N1P?H
+ocNhDB5@^18cD>RSCH?41[Qm8E2h4S=@j9E=FEV;an^3GeiM`eF;k8?\1UIGRgH4Rgh6>BJL0783
+j:A0P7`30G@gP3j8@05e9kQo8E2h4S=@j5a=FEVhQb5@^18cD>Q?CEUI^<@QD;PB<e3X@TeIFK[o
+okSoonTG0LM6o_ooadKloon=A_a@^<HQD?md1>Q<G8?41XU6nX=nnP5d6Omd1;S:8E3o=\\kj<iK
+Pl@6ocK;>nQclEV3OEX3MDV3O_h0O1Me1X=no05b3h=noP1l<gl7PGkloGmf:_mfo_mfo3?0^_eo
+D58c`;X1051B^>lQD?lfbc_XPE^3a13o=\\kj2KaFN]=PgeJ0WE7Pgkn07`GM@J3O_`1LPn3O_h0
+O3=o1h5no?moMR[oM_koM_`c`;[oOe1B<l2j0@1@D[PT8U3o=\\kj39KPl@@ocK;>nSGl5V0?XQ0
+0GD^^5TRD;PB<e3XC4aIFOmfo_mfo;QQ8U2h4S=@j3U<Pl@8^:4RD;PB<e3X:daIFH]FoX]6o>WV
+oUmNRnEM`eF;k8?\15J;MP@i9Y`0LP?X=cn0O0<1M3J0?XQ00GDW^:<RD;PB<e3Xkd]IFKR[8U2h
+4S=@j>9;FEVhib9@^18cD>SEBeUI^P20^040je>3O0@0M0R;G0B0?`1e2Xe6o53XY3AIjc?oM0CX
+IPIIREKnRDKlPGkn081e7h=no05e6Omd1;SY8U3o=\\kj5AJPl@6ocK;>nSikeV;E_j;A_c[Zej;
+iEg3EH_\Pn`4EUN;OPHi9Y`0LP?XSch;og@5P3d0M@JhoooYm`37A_cooc?fjIP0RlJj1@3gjX]N
+20?HocOXmEaIRDKnogKnEh_6^PD0mnZ;GPP3f?lgj1HAPl@62l1eIX0nR401MCJh4B=@^18cD>P3
+BeUIRlJj1@3gjX]N20?HocNh6B=@^18cD>SXBX?41[Q48e2h4S=@j=Y:FEV3O_`0O@F9M_c[7[SE
+?E2hAR=@^0<0D>Re8h?41UOoMPCX8@mIFNUIodJ;a[X50?OZReh80mR3?`1d0nUDoh=no01m=H0n
+R401MBVhGb=@^18cD>R2BUUIEkQW8e2h4S=@j7A:Pl@6^9XSD;PB<e3XITYIFNT;on\6RdKlj@Ko
+Gej;iEg3EH_\Pn`4ESTVW01b0nQc?C?9je_7A_h008U>o3?fjc>;A_j;E_b3hP4U~22m1d4X]6
+oX]Fo=7XdMXcEPHcAPS[2X]6oX]Fo=7XdMZ9A_j9E_a6Poh8L\R;`M7PdN2;GPX3f8]6oX]Fo8U7
+0XTG@C]>17:PGX_UGL=ERnb3k09FEcTVW01b0nSi?8=n1P1d28]N1X0o07D6^?kojI<0ogH6j6mK
+FHU6o[oooc?fjfn3OPP0MA:;a]7PReh40mSo=nQ@FeV9A_j3OPX0MBWoM_koMPJ;a]7PReh40mSo
+=nQ\3h?41P_0M@b3oome18_nj`>oo_o[9omfo_mf1X_6dN2;GP@3f?lgj>h>Pl@62l1e38?oogD4
+Rok[0konodJ;a]7PReh40mR3?`1ePh_7jF[oGej;iEg3EH_\Pn`:EUN;OP@i9Y`0LP?X>3b0?XQ0
+0GDa^9`SD;PB<e3XmTQIFOme1_me2?me2[RT8e2h4S=@j>18Pl@:^<hSD;PB<e3XdTQIFH0nR401
+MC2hd2=@^18cD>RnB5UIocGoM@;oM@Bhf2=@^18cD>RYB8?42[P2952h4S=@j9]8FEV3O@Y6O@Lc
+dS?0jF@1adKn~2adKl~2adKf\PO[Ah56o6d1PeKn08]6m[\409Wgn`_BMBj;A_JkI02Imo\;dWD=
+RdKf^i01VOOk2m9e1KP10>\2<l0m0@1e28=6o063E_h0odKfRdD:1F`7>dKfOjk7A_H00>]MRekf
+dN>;Qg4OV@56o15FoX=nmP5eA8]52PE\1k\409Wgn`_BMCB;A@X5K0NkI02Imo\;dWD@RdD:1F`7
+^i01VOOk2m9e1KP10>\2<l0m0@1e28=6o063E_h0odKfRdD8>dKfOi^;A@I8V@56o15FoX]>oX]N
+o;X10;R0DNSL:52;A@ABVE1B<m:h40iIFnS::5]I0lPCfX]50YUADe1B<m:h?01IFnRb:5]I0lPC
+fX\5V@?84mZ9G_Z9C_R0?XQ00GD^^0@TD;PB<e3XE4MIFOmfn_mfn;P<952h4S=@j457Pl@8^3<T
+D;PB<e3X<dMIFH]FnX]6n>VIoUmNRnEM`eF;k5IGRgh4RgH:>BJL0783j3hjadAA~2adAH0@37
+A5X10<M4G_ooadALooo7A6;oolM4H?ooP7d30G@aP3j8@05e9kPe952h4S=@j==6FEVh?BA@^18c
+D>S6AUUI^7LTD;PB<e3X^DIIFNWP08=m101dEOme15KXXeMIFEJhNBA@ogH6j0\APl@6P3j8@05e
+:KQm952h4S=@j8E6FEUF^8DTD;PB<e3XMdJ3a0JhZRA@^18cD>QYAUUIE_mf2>Sn4eUIRDAAja>h
+[2A@E^Q=EeUIadAA4S?6A5<1PgaA07DTE[Rc953o=\\kj?eDPl@6^=DmD?lfbc^h101@j1TOPl@6
+j1dPP7aC0G@9E^Sb55T:`7DiP3j8@05e:KS?952h4S=@j?]5FEUF^=LTD;PB<e3XkDF3a0Jh0BE@
+^18cD>SOAEUIaTAC0EKX`1aIGeiM`eF;k8?\0UIGRgH8>BJL0783j>`haT@20<M40`00^0<UD;P1
+0U3Xo?AIFH_hEkP99E3oMPKXaUB3a0J9A_j3O_h1M@iGj4T?FHU40lI40P7[;Old^10UD?lfbc_X
+>eB3a0JheCe@ocK;>kP3053XEaj3a0KoMPKoMPCX`@UIFEOXNcAIGej;iEg3EH_\Pn`FEUN;MP@i
+9Y`0LP?XHcS7A_h0P<M6o0402oId1H0l07D9^P20^040jH01P3j8@05e:KPc9E2h4S=@j0E5FEUF
+^3\UD;PB<e3XmdB3a0JhJbE@^18cD>SYA5UIadKd\PO7A_810<M6l040adK^~2adK\~2adKZ~2
+SDKZD8e6k52=A^i@SDK`D8e6lU2=A_A@^6dUD5KXeU>3a12;n8?o0G`5Pol6ORAF^8\UD?lfbc_X
+Ee>3a0JheCe@ocK;>kP3053XLaf3a0KYE_n1O_Bb1g`7PGkdm@Mn2?mfm;R_9N_:PFkdK0N3O_81
+O0J3O_8<OPSoM_:hi2G[\Om>lX=nl05l1X=nl1mn2?mfl;PC9^^JPgk^07`6Pgk^5gh8ogK^^40V
+jhJ3O^`0O0J3O^`kOPWoM^bhKbKYLOn3O^X0O0J3O^XkOPWoM^ZhX2KYG?o7A_H00<M6n000adKj
+~2SDKZD>S0nUV9E_j9A_b0?XQ00GD^^=4VD;PB<e3X`d=IFOmfo_mfo;SI9U2h4S=@j;13Pl@8
+^00WD;PB<e3XXT=IFH]FoX]6o>UmoUmNRnEM`eF;k8?\35IG>BJL0783j;0faTKe0KP29e2h011@
+j<GbFEV9A_J;MP@con\1AX0l07@<RPBHRmSfQn\a0GG^P3`0M@GY107[0hUfn>\1AX0l07@?RPBH
+RmR:Qn\aV:T107C[RGKlRdKl:dKh@8U6n_mfn_mfn?mfm^PdEH?41X]NmP=Nn\H708_7dN2;EPH3
+d8?215:h2bM@ogKfj21BPl@6RDKnPgkn0G@[ogKfRlM0D;P?9e3o=\\kj9iAPl@8^=DmD?lfbc^h
+0`1@j;XKPl@6aTKe08_7dN2;GPH3f8=o1?ml48_7dN2;GPH3f85o1?l0OSB;ad1@RlOAh8]N1P?H
+ogL4^40WD?lfbc_XBe63a0RheCe@ocK;>kP3053XIa^3a0K6A_D0RlOAh8]N1P?HPgl4ogD?RlOA
+h8]N1P?HRdH8RDL4AnWPoX1nm@5e:h7o005d9ENhLRM@ocK;>nShD8?41[SE?E3o=\\k^0<0D>PD
+6h?41\I6m@3oM_KX?C5IRTKej`1OGX_UGL=ERnb3k0YFEh]f13TVW01b0nPP=KRQ9e2h0@9@j3Wa
+FEV;n<M4F040adAJ0@37A5koolM4G?ooadARooo7A63oolM4EP00adAD~2E^S83UV9A563O540
+MBAF^:PWD?lfbc_XJ523a0JheCe@ocK;>kP3053XQ1Z3a0KXR1^;GPS61`36A_\1ogH8j3MCFHU6
+o8=4E063E5H0EULc`;X00U1Bj2HCPl@8REKhRDKfPgkh07leO0J3O_H0Lbf;G57gA`8P07@3jI40
+^=DmD;S?9e2h0`1@j2<JPl@6<l1@E^R?1EUIj?T=jfS6QOl10;P:051Gj?H5FEV9A_j3O_h0M0J;
+G_k61`1Gj;UBFH]Fo0?@REKlRdKl>dH6O`]GogH8j7EAFEW[<?mfo;Sa9e3o=\\kj9Q?Pl@6^=Dm
+D?lfbc^h0`1@j;@IPl@6EeKX8PEIFLI6n`3[0nT]oh]6o3]61WdWogKl^20XD?lfbc_XGDn3a0Jh
+eCe@ocK;>kP3053XNAV3a0K6A_\0E^Sgl5UGj9l_FHY6nn\0Gej;iEg3EH_\PN`F0UIGRgH4Rgh6
+>BJL0783j7hcadEH0@37AEX10<M5G_ooadELooo7AF;oolM5H?ooadEF~2adED~2EnPe3EV9AE63
+OE40MBAG^54XD?lfbc_XeDj3a0JheCe@ocK;>kP4053XlAR3a0KXmAVhMBQ@^00@D>PmkeUIRDK\
+Rek\aPL0aTKa0NT\0_mfk>RADEV9A_Z3AE@1PeEF05N=Q^[mD3?0^P02D5;XO163a0R9E_j9A_b3
+O_h0OcYl1X=no01c<X]MDOM70R00M0?Yk`6heCe@^80XD;P3053XNAR3a0Hc`51Gj>D3FEWXC`c6
+A_40jL41aTKX2\I6j@2h8`1@SHKZoE3X@0AIFHU6n8=nn01d3h]Nn<H72_m6n8]Nn<H70;P:052=
+Q^[mD>PJ15UIRDKfPgkf07@6RekfaPLPSHKZoE3XfE1IReKj0m29E_Z0O081M@n0O0`1M@V0O0L1
+M@?Y]`1FSHKZoE1Gj7kcPl@6RDKbRekb@h?k0gMbdN<^ojOUBNVA08]6l[X50?OZRmR0N081MCf;
+A_:j1@3gjX_Hoc2hWbQ@ocK;>nQjCH?41[SE?E3o=\\k^0<0D>RF5h?41Xf6j_e@EnP00eUIaTKa
+0>\IRdKb^PD0mnZ;eP?@DXf6j_e@EnRUn8?41^\Y^>PXD;S8:53o=\\kj2Y=Pl@6^=DmD?lfbc^h
+101@j4HGPl@6j4XHj`3YV@2=A^i@^?@XD?md3NQSCH?41XU6m8=nm05e3H=nkP1l1h5nk_l0ORSo
+M0goM0Zhn2Q@ocK;>nSEC8?42;SE?E3o=\\k^0<0D>Sa5X?41^]4PGkj011o3hf6j_e@ogK\j7M>
+FEW[=?mfn[P\:E3o=\\kj9Y<Pl@6^=DmD?lfbc^h0`1@j;HFPl@6SHKZoE1Gj202FEW6A_40j`V0
+O_41M@?YboeGj1k^FH1l0P5d:?ld^5PYD?lfbc_XDdb3a0JheCe@ocK;>kP3053XKaJ3a0K6A_40
+jgN0O0`1M2WoM0ZhPRU@ocK;>nPTC8?41[SE?E3o=\\k^0<0D>Q05X?41\I6l@3[B81l1`5d:Omd
+1KR\:E3o=\\kj?E;Pl@6^=DmD?lfbc^h0`1@j14FPl@6aTKa0>\Iog@3j<\6FH]N28T7og@8j;l6
+FH]N28U70X1nl@5e4_mfk_mf2?mfk>QEnH?41XQ6lOmfk>P7;5V:A_6Hj`1OGX_UGL?GAmY7fTOJ
+AeF;k5IGRgh6>BJL0783j>@_<oK[3X_6dN2;GPX3f<L7oom6>gH8O>dcm^];Rmj:0ISAh8]N2P?H
+PcooMA2;gXX1V=7PReh:0mR9=n\YRmj:0IQ@^=HYD?lfbc_X<4^3a0JheCe@ocK;>kP3053XC1F3
+a0KXD1I6>gH4O;1OGUg3EH_\Pn`2EUN;OPB;MPHi9Y`0LP?XGRmG^0\ZD3?0D>RD1X?41\L4~2
+ad@2~2EUOoMPSXZO^3a0J9A_j3O_h0OBAG^0lZD?lfbc_X`4Z3a0JheCe@ocK;>kP4053Xg1B3
+a0KXh1EG^3TZD?lfbc_XW4Z3a0JheCe@ocK;>kP1053X^1B3a0KoM0;o=;QP:U3o=\\kj7M:Pl@8
+^=DmD?lfbc^h0@1@j9<DPl@6Gej;iEg3EH_\EUN;MPB;OPHi9Y`0LP?X[bh;og@hE_mdE_mdE;R@
+:U3o=\\kj39:Pl@:^=DmD?lfbc^hoom@j4hDPl@6EkR_:U3o=\\kj15:Pl@6jaEFogAFogAD^;XZ
+D?lfbc_XnTV3a0ZheCe@ocK;>kSooe3X5QB3a0IOGUg3EH_\Rdh4>BJL0783j3T^<m;[4X_I0mZ:
+1cY61WD6Rl43`^\>@X_I0mZ0?`1eiC?0jo1M`eF;k8?\15IGRgh4>BJL0783j00^<oK[F8_NRP6H
+RmSfQn\a27@<Rmj:0IQ@j00TFN\5Rmj:0IR9A_j;GPJ:09R;f?J7jc48M0f;GPJ:09Q@j=`SFN\6
+Reh6RP2HRDKlRdKn>dKlM0R;A_h[A_c[54J;gX0i07FQReh6P3P0MITc`>_ZGej;iEg3EH_\EX]>
+18]f1STVW01b0nQh;C?Bjb:;f@?JRPN;fSX0M1F;f@?JRPN;fSX0M0Fh0@3[0S?0jaY2>eH8OA2;
+f@?JP3l0MM2;fX0h07G9<l3[i5iM`eF;k8?\15IGRgh4>BJL0783j28]<oK[F8_NRP6HRmSfQn\a
+27@<Rmj:0IQ@j28SFN\5Rmj:0IR9A_j;GPJ:09R;f?J7jc48M0f;GPJ:09Q@j?hRFN\6Reh6RP2H
+RDKlRdKn>dKlM0R;A_h[A_c[6DHkMPQm3h_NP3T0MIb;GPJ0>01eU3?0jnEOGX_UGL=ERnb3k09F
+Eh]n13TVW01b0nRD;5OX84]IRDKnRdKnB8_`ja2;gXX1>TH6M@J;a`?6j`U>2oImk3?0joEOGX_U
+GL=ERnb3k09FEh]n13TVW01b0nQB;5OXgTYIRDKnRdKnB8_`jaV;gXX1V53oMPKXk_eIF@_0M0J;
+a`?6j`U>2oImhc?0joEOGX_UGL=ERnaFEh]n13TVW01b0nP:;3?fjaV;gXX1V53oMPKX\_eIF@_0
+M0J;a`?6j`a6Rmj0>@1eh3?0jo9OGUg3EH_\Pn`LEULi9Y`0LP?XcB^0?XQ00GD^^=TZD;PB<e3X
+RcQIFOmf1_mf1;SQ:U2h4S=@j7PhPl@8^0\[D;PB<e3XJSQIFH=n1P1o>7`6Pgh407<`ogH6ogH4
+^0d[D?lfbc_X4TN3a0RheCe@ocK;>kP2053X;Q63a0K7APH00<M61000adKf0@37A_B0DLM6k^41
+adK\P3>;A^j;E^b1`X1A5@40RDKZREKX_[87RlJk102Imo\;dWDPRlJkI02Imo\;dWD<RlJkT06I
+mo\;dWD8RdKZReKXj`J;A^j;E^b9A^J9E^B;APJ;EP@kA^Il5GD5>eKTLPj;A^J;E^@YEP@IAPK[
+0^\3A^^S<on;gm7SRhMa7iV9E_:9A_23o`5e;8_6^`@0VOOk2m9e88_6^f@0VOOk2m9e38_6^i01
+VOOk2m9e28=6l063E_80RdkfRekdReKbRdK`j8\H>eH6Oaie1C]617LGRdkfRekdReKbRdK`j70H
+:DH46EH6j`;[0dO[RDOoM_KoM_CoMPKoMPCXb1F9A_koA_koM_KoM_CoMPKoMPCX`QF9EPJ9AP@c
+`;X@3U1BogH6ogH4j9dERDKl<l2j40i@D_mf1_mf1>RI5HUF1XU613?0^S`0D5;oMPKoMPCXM1F9
+A_Xc`;Xl051BogH6ogH4j70EREH6RDH4RdH4RDKhogKhogKjogKlogKnEeJh=R]@^8a4D>QGAH?4
+4;QD:e2hS4A@j1A7FEV0?XQ00GD\^5T[D;PB<e3XK3IIFKR<A52hHB]@^18cD>QK=X?41[RI:e2h
+4S=@j4dfFEVhS4C[05mNRnEM`eF;k8?\0UIGRgH4>BJL0783j5`YE^SXAeU0RDKnogKnj1TVFH_h
+2ome9eKoM_jhVb]@ocK;>nS@A8?42;SE?E3o=\\k^0@0D>S\3X?41^S`3eIGj>I6FEV;an\0Gej;
+iEg3EH_\Pn`2EUN;MP@i9Y`0LP?XnRP;mW@5P3`0M@B;a^\XE^QiAeV9A_j;aP=6oTR;n>\4aPD0
+Cc_nLPb:1IR;f?J7jc41MNc[e5mNRnEM`eF;k8?\E5IGRgH4Rgh6>BJL0783j:PX<l1@SDK`D8e6
+mU2=AZa@ogH8j>@<Pl@:RDK^mdK^0P1e4`_fM0nh201@EXe6mU3XI4N3a0KgA^h407DC2omd3kP4
+051GSDK`D>Q:Ah?41_mf23?0D8e6l52=A_I@SDJ\D>Pb1H?42UmNRnEM`eF;k5Hi9Y`0LP?X;RSo
+MPBhcb]@^18cD>S`=8?41[PB<e3X?c9Io`kb<W`>Rakl<_l6o3::1k@0j`RhlS9@j6liFH_`Poko
+MANheCe@^=\[D;P3053XZPf3a0JnCP3[4_J4jc48M0MFj>\MFN\2RlJ;l8?nCW@5PoiIMJZ3oUUe
+1;01j`:`0>\0GUg3EH_\PN`T0UIGRgH4>BJL0783j9XWadAHooo7A5[oolM4G_ooadALooo7A6;o
+olM4H?ooadAV0837A6@10;Sj:e1Fj1\dFEV9A563O540MBMF^?d[D?lfbc_Xk4:3a0JheCe@ocK;
+>kP3053X20f3a0KXi`3YgP1Fj>@2F@[0MD60?XQ00GDY^1l\D;PB<e3XkC=IFEJh9ba@^18cD>SO
+<h?41[Q@;52h4S=@j=4cFEUFj4_TFLI4D`77A5400>VD0?mdDKP00U2h0@1@SHKjoE3XU3B3a0R9
+A_k7A_`003?ojaV0^o[m3GDARmm3SHKjo@?HP3l:M@?oA_a7RdKnB3_7MmmFj?OSFLM4D@00RdKl
+^U00mnXkA_ic1lM4F000j`G7A5P10<M4FP40SHKLoE1Fj;92FEV9A_Z3O_X0M0MF^58\j@goRhKd
+oH^Fl_f9A6J9E6AOGX_UGL=ERn`i9Y`0LP?XB2Ko=Y@0j<=4FE2hM2a@ocK;>nS=@H?41[SE?E3o
+=\\k^?ooD>SY2h?41Ug3EH_\EUN;MP@i9Y`0LP?X32J;A5P;`7@7?@40M13[4kR9;51Fj:LbFEV;
+n>\\^8`\jo3oM5RhSba@ocK;>nQf@H?41[SE?E3o=\\k^0<0D>RB2h?41S?0jbh;ogDVE[R`;53o
+=\\kj4e1Pl@6^=DmD?lfbc^h0`1@j6T;Pl@6j4Sojm:;an_@GeiM`eF;k5IGRgH6>BJL0783j84U
+Pgh40GA9E^Rf05T:`7A0Pgh40WDdE[SB;53o=\\kj?U0Pl@6ocK;>nPKoEVH2l1e5[SE?E2hlBa@
+^?ooD>P82h?41S?0jgG[1UJh1Bg[9h]4F0_0M0Lm0@1d4>\C^1H]D5KXcC5IFH_hjb>h6Bg[l?md
+F;PL;E3o=\\kj9a0Pl@6^=DmD?lfbc^h0`3[[P_oMBIF^3d]D?lfbc_XO423a0JheCe@ocK;>kP3
+053XV0Z3a0KXMok[Rh_7jhUOGUg3EH_\>BJL0783j;DT<l1@ogH4j;hTFET;`7D5^040j`8c`>\0
+GL=ERnb3k4aFEh]f18]n1STVW01b0nR490_fM@;[:3?0D3?0D8e6mU2=A[A@EnRm28?42ULc`51F
+SDKfD8e6]53XA`63a0YOGX_UGL=ERnb3k0AFRgH4>BJL0783j3dTReaARTL4V8U6o_mfo^SV45V9
+A_b3O_`0M@J`0N\6j`B`0>_hGX_UGL=ERnb3k19FEh]n13TVW01b0nP095OXS?YIRDK^^2h0D?mf
+k^RVmEUIRo0;mW@H^0@0D5J=A_1@j<Q2Pl@6aTKd0<H40>\=^60]D8e6l53XSd5IFKP8053oM^j=
+A_I@j:52Pl@6aTKn08e6mX_`jaF:19Q@^64]D>QBmEUI2l1e0lH4GdJ0?01eiXe6lH_`jaF:19Q@
+^:\]D>PamEUI2l1e0lH4GdJ0?01eiXe6mU2h[4A@j2]1FEV=A_1@^:a4D>Rf@5UI^:a4D5OXiD1I
+F@_0M2Fh[4A@EkSe;E3o=\\kj<\nPl@8^=DmD?lfbc^h0P1@j>L8Pl@6^:a4j`1OGX_UGL=ERnb3
+k0AFEh]f28]n33TVW01b0nSk8[PV;U1Gj;m0FEV3OP@0M4f;GPB0?`1dAKQ0053oMPAGj891Pl@6
+ogH4j5m1FHU6oX]NoP=N18Y7oiQ@^2L^D>Qam5UIRDKlPgkl07D@Pgkn@7d:^2X^D5OX141IFH=n
+1P1d3[P8053oMPIGj3M1Pl@62oId9H0l07@PP3`^M0nh;2i@EnSH?eUI^0<0j`>h101@EUOX3T63
+a0IOGX_UGL=ERnaFEh]n23TVW01b0nQ:8_mf1;P^;U2h4S=@j0`_Pl@6^18cD>QK;5VhlS9@ogH6
+EnS<;8?41X_`2oIe6;SE?E2h<Ri@^0@0D>SE1h?41^RdnnSF2;P:051Gj;GcFEV;l0_fM0?6101O
+GUg3EH_\Pn`6EX]f2STVW01b0nSK8LM6oP00adKl~2jdOoM57XCc=IRDKjPgkjogDTReaAmdL2
+401d2;[ookSnon\oRdKl2dKnM@Rjoonhooo[k^\UReh80eklRTKjR0N3A_`1PeKn08]6oX]Fo3]6
+1Wb^M@DkEPAbYh]FoX]6o>^oGX_UGL=ERnb3k09FEh]n28]f2STVW01b0nQB8OmdDOmf15OXkR^3
+a0J9A_j;GPA;aP40Pgkn07DTReaAmdL2401d2;[ookSnon\KReaAmdL2801d2;[ookSoon_\EnRM
+?eTcd^_SGej;iEg3EH_\Pn`4EUN;OPR;MPXi9Y`0LP?Xjb23O5P1MAIFEomf1_mf1>Qaoh?428UF
+oXU6o>\mReaAmdL2801d2;[ookSoon\cogAAogH4^040D5OXJ2j3a0S7A_h008U6o8]LDOM70Q00
+M0Rjoonho_o[dh]FoX]6o>_;Gej;iEg3EH_\Pn`>EUN;MP`i9Y`0LP?XL237A_800<M6o040jOl2
+RdKldN2;GPH3f8\7RDKnP7`30GD5aPJ8@060?XQ00GD[^58^D;PB<e3X1beIFOmfo[QJ;U2h4S=@
+j?L\Pl@6^8D^D;PB<e3XjBaIFH]NoXX7V53oMPSX`_5IF@_0M@?Y@P:hQbi@ogKnj9@mFET;`7D3
+jBl2Pgkb07@7ogKbj=lKFH]6oT1@j6WfFHU6l_mf2_mfl^RaleUIRDKfadKd~2Pgkf07@=Rekf
+aPL0RdKf@8U6m?mfl^Pi?UV9A_Zoooo7A_P00>V50?mfn_mflX]6n;X60?OZRmSo<>Q?lX?41P_0
+MFH;oge0RgkhP3j8@05e=;R9;U2h4S=@j3D\FEV;A_Rj1P3gjX_Hoc2hTBi@^18cD>PL;8?41[Rm
+;U2h4S=@j0h\FEW[8X]6o=7PReh60mSo=kRo;U3o=\\kj;`jPl@6ocK;>nQQd5WoA_R;A_Rj1P3g
+jX_HPcP0M0?YJOl;ogdRRdKldN2;GPH3f?lg^=P^D?lfbc_XPCZ3a0Ko=\\kj2K@FH=nmP1eE8_7
+^PH0mnZ;f81h0P1e9h_7^PH0mnZ;f?l`^1@_D;S_;U3o=\\kj4LjPl@8ocK;>nS\ceW[6h_7^PH0
+mnZ;f<I00`6;akX60?OZRmS7@0@00>W208]Nm80o07DURdKldN2;GPH3f?lg^1L_D?lfbc_XoCV3
+a0Ko=\\kj:;?FNVE08_7^PH0mnZ;f81h0P5e9h_7^PH0mnZ;f?l`^6<_D;Pj;e3o=\\kj<HiPl@8
+ocK;>nQ[ceW[Gomfm>RZm5U@RlNj1P3gjX_HF8U018_7^PH0mnZ;f<I00`60?XQ00GDd^6H_D;PB
+<e3X_2YIFH_7^PH0mnZ;f?m`1;Q^;e2h4S=@j:<ZPl@6^9X_D;PB<e3XUBYIFN]JjeR;GPj0O`<0
+MAn;GPk6A`<1RdKldN2;GPH3f?lgj33dFH]N3XU71>\`Reh@P7l307DOReh@aTL30H]6o=7PReh6
+0mSo=nP8m5V;GQ29A`C[2;RL;e3X\<iIodKlRdKl>dH4O@?Ym_aOGX_UGL=ERnb3k09FEh]f13TV
+W01b0nPo7H0nR401MCBh^Rm@^18cD>Sm:EUIRlH5I01@j<8PFE1F^<8_D;PB<e3Xi2V3a0RhkBm@
+^18cD>SF:EUIRlH5I01@j4LPFH_hPgd:D7ePogAVogATj0_aFEU@E[S_;e3o=\\kj7<hPl@8^=Dm
+D?lfbc^h0P1@j8l2Pl@6^=DmD;P?<52hoom@j7d2Pl@6E[Q7<53o=\\kj40hPl@6^=DmD?lfbc^h
+0P1@j5`2Pl@6ogAVogATE^Qh18?41XU6oX=noP1d;h_61F@0D>PC85U@E[Qe<53o=\\kj?hgPl@8
+^=DmD?lfbc^h0`1@j1X2Pl@6j?Wej`1OGX_UGL=ERnb3k09FEh]f13TVW01b0nPa78]LDHY719R;
+n8]4F0_0M0Lm0@1d4N\D^020D5OXK3IIFHU6o^\\^010jnnh^c1@^9\`D?lfbc_XT3N3a0JheCe@
+ocK;>kP4053X[063a0KX\0:3O_h0OBAF^<T`D?lfbc_XISN3a0JheCe@ocK;>kP3053XPP63a0KX
+HOEOGX_UGL=ERnb3k5QFEh]n1STVW01b0nRK6`_oM0?61@23OPP0M0J;GPS61`23OPX0M0J;GP[6
+1`23OP`0M0J;GPc61`37A_X008=n101d28]N180o07D6RdKjjJ<0ogH4SDJXD>PI>EUISDJXRo2h
+jC1@E^SHkUUIRDKnPgkn07@\Pdkj20_oM1k7A_`00>\9RPB81DI7odKlPgkl@7d5>gKnM^c61@3o
+A_j;M_jh;P1@E^Rgk5UIRDKnPgkn07@PPdkj18=n2P1d4;P4053oM_koMP[XbcV3a0J;G_k61`20
+?01d68=>nP:3OPP0M0jh201@E_mf2>RX>H?41^UGoemNRnEM`eF;k8?\8UHi9Y`0LP?XWQZhk31@
+j50]FHU6oX=noP1e8[S_<52=A]i@j4hhFEVhlc1@SDKND>SI=eUISDKND>PM<eWXTSb=APA@j:dM
+FH_`Pg`@07hARaHZ>Z4X>PG`lH?Bon\;j`V;5RXjXBPjjo=NRnEM`eF;k8?\15IGRgh8>BJL0783
+j2DJadKn0@0cmX]N14>3n`Eg;M7S;_nWYf37A_ck<>]9adKlo33[4lM6o04aj`c7A_`<<N\5adKl
+5C6n0@3[:[Pn<E2h7S5@ocK;>nQb=H?41[SE?E3o=\\k^0@0D>R>oh?41^RB0>R?08=n1P1d28]N
+1X0o07DARdH4>`J9@7h6RdH4XhU0jej3OE40M@G7A_h008=noP1d3@_fM0V1OE4B<gD2<oH;mW@D
+ogH6ogKl^4\aD;PB<e3X?2J3a0R3O_h0M1?oMPKoM_bhDC5@ogEAj2<VPl@8RdH4>`J9@7h6RdH4
+XhU0Gej;iEg3feoDGmAOhUoYGo1OEH_\>BJL0783j2<IRaj9@8?k17LJdN<^ojOYH3?0D>PZ15W[
+3kP10>_d^080jnnh0`3[jUg3cf3?H=QPgF3RH5F;k8?\15J;MPXi9Y`0LP?Xg1S7A_h00<M6o000
+ja[oM56;GPP3G_b:1iQ@j:X^FEV3A_`1PeKn08]6oX]Fo3]61WcKM@DkEPAbe5j;iEg3EH_\Pn`4
+EX]f2STVW01b0nR<68]61X]F18U6oXUFo8=lGP1lDWl6PgaL07I:RdANReAL>dKnOcml1C]Fo7<h
+ogANogALogKnogKl^5LaD?lfbc_XhS>3a0bheCe@ocK;>kP3053Xo_f3a0J;A5j;E5b9A_j9E_co
+M57oM_bh0@1@ogH8j<<XPl@8GX_UGL=ERnb3k0QFEh]n13TVW01b0nSl5kP4051Gj?P[FEV9A_j3
+O_h0OBYG^94aD?lfbc_XMS>3a0JheCe@ocK;>kP3053XT_f3a0KXLO6hoooY;06=API@j0@KFH_`
+R`Bk0P2Imo\U7`0U7`20I_SP24KhRd@29Cl09Cl0PFKh7oRa1M?P2DKhRd@49Al09Al0P6Ki1m7P
+dN3Ah0Q6nH]41RDO02DO081Vn^08A_Z;A0Q09@l09@l0PFKj7oja1M?P2DKjPg`:D7dLP6Khh85V
+n1ohP6Ki1h1Vn^21I_XOoX1Vn`7[5H]42PF`obEo02Eo081Vn`7Ah0Q6nhe6n53oM_kXg0]IFHU6
+o8=no01d=he61U3XW1YID5NhZC5@ocK;>nR7<X?42;SE?E3o=\\k^0<0D>RSo8?41^R2l?mfo^RZ
+5eWY1oooM_kXX1MIRDKlPgkl07dTEkS?<E3o=\\kj4TbPl@6^=DmD?lfbc^h0`1@j6GlPl@6jM?n
+<l3YdOiOGX_UGL=ERnb3?^Pa87D5^040ja>;7^PadN>;APB9Qoi4o`KX<C?0GL=ERnbd@c;0ReH4
+cB5b2H]N1XT?<l3[153Xm@9M`eF;k;A3\06;EPB;CPK=8G84<l3[153XfP9M`eF;k5J;MPBd6LdQ
+]010R@ANGL=ERnaFRgH6RUH4o\Zd3\dQ]02915iM`eF;k8?\35IGXBXjRaHX>XU6n8UFmZ4\>XU6
+m8]>18]F1X_aRoZkh04Sf[45dn^3hQni0?hScm7YQ\gf`@=e1X3k0WH1@]7SRil8>P?JBhUNo831
+2XU>nX_1@=7XdNP3f;Q]0OOQ0mRh`:Sghm7PdM:FRmY@\@?Cj8QVo\I6o`19d^Ri?026`OKT0l6a
+??OQFH?Q7m7Q0l4BeP?64m<3A_HCE_R3O_@0M2E@D_mfo_mfo3?0D?mfn^SV>0_0M0Fh40k[0S?0
+Ro1JF2_6PmX0Gej;iEg21033EH_\EX]f20_fMAk[3_l>j36;7^PadN?oUoi4PckX<@1ejnR5W?lF
+k3;X3YgXSYb3OPH0MA<;mWD8oaK^<_lFl3;oMPCXWYaIGUg21P1ERn`c`51@ogH4j:KoGL=ERnbh
+0@1@<l1@ogH4j9CoGL<c`52h0@1@<l1@j8Go`kP1051@<l1@j7Wo`eF;k5J;MPBd:\dQR@b9E09N
+GL=ERnaFRgH4]2c=8HT<RE@2GUg3F@iA<lW[5UT>DKT10>\>F@iA^@80j`II3U6i0`1EEUN;k8_i
+RdH:ReH<Reh>Rdh@2lUe20_BM6T;fgAUmlL107DL2m9i2_OJmmR3fP23c``;bGT:mmWgfh?I08?g
+18_Y^B00Ec?o<oKAh=7BdMKAec_mLP]g13_cLPD[la_m@>;WFoO30P1d1X_6RmOAjoO3101d1oOJ
+mmR3fP1OGUg:203gloO70P1d0I8cd^_]F`iCP?T@La2;f=?Pdn;ffH314=?[2m?;P>T@TS?0dn;;
+F`iCP?T@La2;f]?Xdn[ffH314=?S2l?;P>T@TS?BdnS;EH_\EX]f10_fO1F3oUQn0kiG08TfHSB:
+Q6@dV8_`j`gggX?n8goYa`IR=?ooRCJD0;SooeiM`P80EH_\EX]f15KX_?n;aUiM`P80EH_\^014
+Reh4cB6B9H00GL=ERnb3k29FE`J;OPXN1h]N28?k97MHP?\2LU>;APb;CPh;bGdAP7h607@;aPD]
+AoOImmR3f@2=M]kS3i4[d_OcTOOcR1A6h`W[lB_Bmo>854H;`7GeSDkNmmT3c_a>RP@\2W<413[[
+0`961:[Rkk00ZPN;APYOGX_UGL8<05F;k3?0D?mf1_mf1;P:052`052`HE3XJ_mM`P@0EH_\Reh4
+dN>1Yc@doofd@XY62X]N18]>28]F1\dQLP;[1E3Xi?jIGL=ERnaFRgH8ReH62oIe0khnAOmf10_B
+M@Fh_SC[0X_2D5KXLPeIFE3XT?nh`SA@E^RU;eUIRlINGL8605F;k8?\0UIGRgH6Rgh4ES?0D8<m
+ogD5^080j`>h0@011H\5D>RNoh_`SDKnD5KXW_]IF@_0M=N;aUmNRnEM`P@0EYJBQL1d0_OSh`FA
+mnH3`IKgh`?FG\=ERnaFEak5MPC4OPSldNWcYA?9lj@OGeiM`PP0EH_\Reh4dN?gQc@d0P1d1[P5
+053[4[@oReh4Rdh8ReH6cB5b0^\4D>P7oUg3EH_\Pn`ZEUO7A_`00<M6nP00jaV;OPcfA_lPM0O4
+?H=630C3RcdN1h=630;31_b;MPZ\2\1dGS`UM5fHUom6n_mf2?mF15T;`7`VV0_oN3:0_LPd0GD[
+T`[KN1R0_lPd0GDAodKjogH8oeH4F@_0OnKYCP?oMPQCoeH6FEWoC_[[\3_7M:coMPQ@oeH6FEWo
+C_[Y@@?Y?P?7A_KoolI6o`2\V8Uf2YL;og`IRYg8=3;oPo\EMP?Y2@?AhbkoYkA\UnUgonT?0h1>
+o`7[e8?_<8MnmP_oO<Zh2P3gi`56m^_0P4ko2>^jP4ko1>^dP4ko0^^^P6Kogn^XP4ko8>^RRdKj
+:m;fA_l1M53[UKh80>\<_PX0j`Nn403[0S?fmlLP07D9PomHM0B0C_l4SDKhD8e6nU2;A_HUogm@
+E_mf2?mf1_mf1>Qh0h?43X=nn01n6?I6o`5e3om6o>RgoZ_fA_l4M0:BZnW6oW`3jFP2jE42j000
+jFH2ogH8D?mF1UUIodkjPFKfogoX~2jGD2DS`jM1D;`7h<ogH8D?mF1UUIodkjFXcKja_X~2jED2
+F`_0OQ1BDomf253oEPIIFOm>nU]JmTKo0GD@j4SnodKlTZ_fA_lPM0:CZnUCo^WS0He6n52=A_Y@
+^?mo8dKfD?mf2?mf1_mf1>PE3X?438=nn01n>8Y6oiRY0@1e:NP5o_m6o?I6o`Ad1KP40>\=mTKo
+27@5^0P0j`8c`51Gj>@=Pl@4jO[mj=l=jOCmj=T=O9cYT`7X~2jI@1mTKo0GD6j<;modKlPFKf
+ogmd:OI6o`5e0J[oA_X6ogH8oeH4F@L;`7hB2\1h2I>0_lPd0I=n1Om>mWoG1_mf253oEPIIF@Oo
+C_[fA_l1M@>`0:[YT?gfA_l1M@?XK?f;M_H;mWd3_P40M1[oA_X6ogH8oeH4F@L;`7`FmTKo0GD1
+ZTioi_I6o`5e0om6o>UEoNWU02_0o1H7SGkF^A00lj^\P6KokcaNM@F0C_l@[;@0R]2;n;43dnni
+1`4Rb];U26_F[3`0M2HlGG@U?2eehCXDMmf0?5edf:`Z`WCU0]3@aH?G00Q[e_k8MOC[eNVL08Uf
+2X5Vm_moRgKfmTKo0GD3j<KlCWa@odKj1_mf2?mF15T72l1lCiJ;g[43dnji1`4Rbm;UQ6[FUY=d
+2?I6oa1d2>\?mTKo47@9mTKo0GG4Z^_11_mf253oEPIIF@OoC_Y6>gKfO@WfA_l1M@KoA_b`0:[Y
+Ooa6>gKfO@cfA_l1M@J`0:[oA_coMPRhoom@oeH6FEV3O_`1Pekl00N;A_cYQP3oA_[oMPSoEPAI
+2l1n4`[0N0VCP;o8=06CM>EIPl43on5dn5W[_b_B^@@0odkfO4EBDOm6n_mf2?mF15UIFP_0OSGn
+bG`aR^R0kC1b:X3m2W8GP>dALR20o@Ib2X3]878FP?d6La60a@[Ah]7RdN;AhP;EjkH[`83i17@6
+FH?10ooQFNUOoemNRnEM`b5\8F`QK0]Y4VTHJNYZG6ULJFIY:VX\JCQY<VUGJHiZ:6]:JF5Y_6Tn
+JDAYDh3[<78RP?\9MQ:0nbYg1H3[1n\3P>\WP?\9MP\jfG<7A4Ch]`3[0U_i`eF;k8?\1UIGaTKo
+0<M6o000adKj0@3oA_coMPSoEPAI2l1lJ9RCm\>0M@Rojc7f0@5ehi?oCPalFS`[M0Ll;GDFoTKo
+odh<O4[oA_coMPSoEPAI2l1l=B_fRoj;CP[SCH?i97L^P?T2LRTl<7E[P?T@MFCoCPal<_m6o?mf
+2?mF15TlN7AA?5QdCN]cadKjooo[1LM6nP00ogH8D?mF1UUIodkl:l2IjJL0jI@0?337APX:07DS
+odh<O>ooA_coMPSoEPAIadH:200lN7@4?5Qe;LM62Q00jaN;CPZCj?GnTg:`U^\:U_MV2P?`4oYe
+;?m>37a<odKlogH8oeH4FH]>2Y?XcojCLmg[:YKghIN7b_OR0oLC`ILBeWE7odh<O23oA_coMPSo
+EPAIRdh:TnRSoY=ce_mf253oEPIIFOm>o8_GUX1no`1d1oOJmmR3fP2;OPj;G_`17H]n48]NnXTM
+jaJhoonjogl2A_n0e023dP37A_X20>_HGej;iEg3EH_\E[@[RgH4R`b;E0;=8EiM`eF;k5Jd;H]f
+18\<Re@2cB5NGL=ERnaG^05GReh4Rgh6R`f;E@;=8G84<l3[153XP_MOGL>j1@0k5S8dLb^;f]7S
+ahLd=000RmZa1=?SaXOf<_n;`]?P1O8bRm[ChhV703=2>aHb=7;EX?HbV53XS_MI2l1e1X4Vm3;o
+oKP00U3g1_@b009d1KP10>\2<l1@<l1@^?8bD>QE9H?42:06<iQ@j5[gF@_0M@J19P@coofh009@
+m`H4<`02M0Fh0P3[0S?0D3?0D;P2<e3X8BF3a0S3EH_\Pn`8SDKhD8e6o52;GPCoM`;o=nRg:X?4
+28e6o53XnOiISDKhD>P4oeTc`8_UGL=ERnb3k0aFRgH4SDKlD>R9mEV=A_Q@j9CeFHe6n52=A_a@
+j68YFEV9E_J9A_@;mW@;RdKfReKdRD@2RAB;E_J;A_ANRnEM`eF;k;P1050c`51@ogH4j4kgPl@8
+GL=ERnb;EPB3n_me1KSoon\JR\:d08_HmXO[<@Qd2H[2]005h?o[18[2]01M`eF;k;A1ReH4cB5b
+13?0j`A@j1?fGL>:a^P208[2e126h>P208KP190W540WZ\=ERnb1k9H0EUO7A^h00<M6k500adKZ
+~2jdIG^Ooo<\3b[_OABEo3=XP5Aoi>k7D_De5B1Xf6J_l[n8f6J_m@Eomf2?mF2P_0M@G7A^X1
+0<M6k5000Gk^SKiZo`MJFE_31_b=_V[oRGklRgklRgH6[0[0M18l9G@A=XP5Aoi>k7o^j:cojnWY
+e@>9M_2\?2EdihUno3?9RDkbRDknR4keadKhooo7A_Koon\1[3;TRm2;f83[883kH7<CRYmA=H?k
+5gH3jHP3dN<^ojOEM>Un0h3m07OhPdkn0N_@P?d0Mnf3C_h2jlF0o@1ghX1nmB]d0hQFmN^ePfKn
+gn\4Pdkn8;D5jjN0o@1gCOM6oP80MBV3C_h8]@7[TnTc0h]n13J;1H=610:0o@9c4P_0N@Kgf8=>
+oP:9A_Re0nU_oh3m17GGRDKfo\GYH_n0o@Acb[D4odKfjEGoTR``V83m0WLI]@:7A_P;`7cAdN2;
+d=7PdN03`P56n>Tcoh3m17FKQdKf2l1d]M7PRm3Ah=7P0l81A_KY5on3C_h@jFGoPDkn0063I_k_
+jEWo]`S[2[L:j`Zg4;?Y0][6A_D0R5Kk<m:8E_Z;OP@fR`G[4;L:aTKj0HQFnh]n13J;1IU7AhUf
+1_M6oQ00M0DfRaE7AhUn18en^`_0M@d;dWD9Pgkf07D7jFSnPdkn159@Eh[7V52:A_Y@DnQ1m1H7
+ReKf2m9m0nWb0>Wm08QFnhUf1Xen^X]N13Ko=d=3REh4mdKn801d43J;5d=3REh45POXWOf`>ZXF
+1e[XU?dfaPD0aTKj08=Vo_^=C[X[nHO?ReKf>m5o0X_AjIl0RGH6R5KkRgh4=X\5PdH40QH7SGjk
+<^@fR@Fi0@3Y`P29MPJ8E_^;OPCgA_hP07D==X\mPdH40Qh72oo[2cK4?H=610B<`0_7M@DN1km:
+=NQEoC]>mWH3RdkfjHD0RGH6R5KkRgh4Rdkf2lUm0kT605MASEjkDe:h0@0SA_i@RdKnZ@01M0Vh
+2023AP@:j`N3AP@8^0H0D>Sb11H7SGjkmdKn201d68]Fn0_BOQ7Xmo`VP3d]M@59:m5n0hUFlRJ0
+?Bed2hY6m@[0M1A?9XP5Pgkb07h:Rdkf2lUm0om>l^S5o8_gRgklRekh^0D08dKn?@D0MA>:I_^0
+o6me3H=nlP1o1LM6lP40ja^0o7Qd1H3lF7DAPdkn@4];Pfkb0Wd5adKb~20dkbmdKn0P1e3>\6
+\23XO_a;>mUom_M6oT00M0^`<>Q]o8Y6nnQWo8]FlP_BORL[bR_J9XX4?2ed23`PM0@l:gD79ZcX
+B?a9BhO:h`N`<>Pmo>;iQl[S4R_I9Z`fR0E7oTk\O`?X<?cRl0_KOPV;bk0Pj1[lh_WYF_b9MPJ;
+OPCgA_hP07D;=X\mPdH40Qh7j`Lfa3f3AP@4^500:TK\0dK^9XT5mdKn401d1dM79\L5~2jA_l
+RgK`Rgkl\2GXc_^\2\1en81nk51m0nS9n`N3O^X0M0Fhooo[0h]6kUmNRnEM`PP0?G4WLG9a<W6P
+LJeajg7bLOMaFg4PL_ia0W86LWYb9g?:L^YbJGBUM:EdYGA=LE=aEH_\EUN;OPCoMPKXGb=IRo10
+D?mf1UOXfaN3a0J;a`?6GeiM`eF;k8]618_DPNX00S_2L`NSW00c`>\9a`JD00P0^?ooGL=ERnb;
+APB;EPH31Y`0Pm80RlP;dWD@PL400W8:>lac1XL6W03[2LL6U0080;Sooeg3EH_\ogH4j:CoFEg3
+EH_\RdH4VE9@j;OoFEUM`kZb=N\3^[Le^@D0]42k0P3=8KTW0;Zl=KA0cB7Y`8aERnb;EPRdA8Y6
+1X]N18]>2\dQLPb3OPH0M@B;`^\6j`A@j7?`GL=FEh_dRe`6Pn\4LPhk7^HeM0GX@P3[0nP305mN
+`cTNi3Ed8h]g0_H40G@6RCKV=N\P>cKT=G@=RmkXE02;A`:SiSG[3H_N<l2Si3FSiSFSj3ECj?Kn
+Fl?o3c\Ni3Ed68]g0X\4Z05e3`<7R@B;?`?kRGD2Rmk[0nPb08\o0o^;1JP1M0730@N;m`?`RE`2
+Rmn;O`Hkgg@>RCkX=H]g18Ue18Ul1\?71^Pe~2`h\fj3D;mW@@Rg`6RE`6REd4RGl6RGL4`hTN
+j3F9G`B9G`K3EUN;m8]41P_0M5851@1b=RGnocd807<3^0P0PckT=@1d7h\Nj3D;fg@=Rm<i1g<J
+Rel6>mYemNQV0>\Qj8X0jacX703[5c?0ja>;l8?623TgLnWXJooo1h_31@@0Gek3D3?0D53X=_iK
+FbD107@9<m9BD>PXoU]KF50cfe=@j1gnFe\moomd58_HRAkT=HTNiSEH@8T7Pl<4Rl?3Fc?0`e0c
+fe=@j?KmFe\moomd5X_HXNHeRDL2RAkV=EQ0R@N3``B;`l=H<l33:@N;l`<gRoh3n42918UL0XUe
+0X?618_6`h_\De1AD>PEoe^;f0_0M1lN1ob;n8]foX\<PlH4EX?Y1M7YljF9A_kX9?iKReknPl@6
+`h_2Pl88>m5g=H_A>akV=GD?R@Oo1`?3De3XBoeKFn\NRo\3n8UM0R_@:AN;m`?bRG`2@XTERl^;
+gnPgoX_IPl<4`eIGEH_\Reh8RdH:2l1d=`_KM2f3j`B;3dV;d8?21H?RoX?j27<3^PP0>lYb37L5
+Pl<4j`SXQoo[0nQ?oh_3j`e@j6Gnj`ICj93m<l1KGEmN`olV>S[o9S`jobHn>_lV@3X008l6kSF?
+1_0eS`Kb=Bj<7VIhRCKd=HTnmSGlSPJ@0;j003;T9Za0S<F7eY>;=XX0ATJi0@20?Y800g8ASPJ<
+08_n\Glb`?:^hfj0lGm@Rl43`d0Uo_n;o2_hLUb;i`HO5PMABO>T<\2ZS]f7lXOIRl>;d4?X6@1g
+1g90j180MoTl87@8?0ed13`9MNPb`>_T2l1d1d:Z2\1e0D>6h3;0nN<E[4T\8W@?128lG7D7P3`R
+M@:\B@_f`nUFRET3bRj>7VIhRAkZ=D<3fh_dRn`[jg;VRnF9;^`eh`j9MP23a@8f[0[0h?Ydl3?0
+RDH0;XhNIWR;=_@eRckf=OlflSGo=_0eXNXeXh@0XN`eXhH0obK^=EIGR`j:057X:oeIRoP;`7@R
+7Qh7SQj<03?fo?>T7h_h1_lfSP3X3OeKRmP7XoPe2l1e0nW9R3?0^OooP3d0M0b9?h?30_:^9SP5
+MOB91emNXOPeXhP0`e=dHF=[86mfIG9VK6mg8@d:98cKS<R>f;[@NK@9cB6>fnTJjeF;k3?0D?mf
+1>RQ05UIRm23n_md6_M61P80M0Kg`P40M@@c`>\9a`JD00D0^?ooGL=ERnaFEeF;MPCl:l2I^@X0
+]`2ojc6:74Kf0@5en;d0083k:g@6P?\]M@A5RQa6P?\iMbj0jc1b:OOQ0l<BeWC[ja:;n[T:0?OQ
+UhOAmn:BU`?34m6:74J0ncUg1H3[<7?QCG`7mm[gf8?J05eOGUg3EH_\ogH4j8OoFEg3EH_\Rdh8
+]4>:APJ;EPC=8G83TN\4D>RFjeg3EH_\ReH4>aHb=789^0H0D>R1jn\?Rm[AhlN7=3@005;X0`1I
+GL=ERnbd?X]N1<dQLPcAhlN7=3@003?0j`A@j5;[GL=ERnaF<l2j?01@D_mf1_mf1>QKjZ=VAC?0
+^S`0D5;oMPKoMPCX>NZ9EPJ9AP@c`;Xl051BogH6ogH4j3;ZXfQ5<l2j?01@D_mf1_mf1>P@jXUF
+1XU613?0^_R8D5;oMPKoMPCXn^V;f=7PdN2SL4F31W15AX_3^[D5mnZ;l3?0^_R8D5;oMPKoMPCX
+h^V9EPJ9APBi>2;g1W150`1e0h?168_1VC]F1W`7OahkAPAg6H_1^aP0VOOk0o3o1W15Rl6I:DH4
+6EH6jlZ3OPP0M4Z3?R`j07A3<l2j601@D_mf1_mf1>R9jE0c`;XH051BogH6ogH4j6WYD3?0D:5`
+A@Fjoe3XMR4;`7@@PdH40H=F1P371WI50@3[1\L6MTD003?0^QP0D5;oMPKoMPCX@>VSJTDc`;XH
+051BogH6ogH4j1kYREH6RDH4XgA51@@00o2;a[\703?Bmo>95W95PdH40H=F1P3g1W150`1e<X=n
+1P1l4Wl6Pgh4?7H:Pfh40H=N1P3[6X=n1P1e58=n13ae3\L6KTD10<L6K4DM0>\ha`I^A@00jaB;
+7Vi5RXOj=IRI:DH46EH6o`I^AH\NKTF:QoXeV9TkEPIlgGD5>dH4L]J;APBSK4FhITENGL=ERnaF
+RgH6Rd@:1F`7D?ldog@2og@4og@6Re`8dN?o]cXfRe`<dN?o]ahf^4lgD?mf1>QY68?44UiM`eF;
+k3?0D8]N1?mg0_lgj=OmPl@6GL=ERnb3k0CXeAj;GPB;A`:;5b\F:3XK1RXjRDKnREKl^040D?mf
+oU;XZ?f3a0J;iEg3EH_\E_mf1;Q<AE3XL?mIFH_`aXA<A@Y6aXA<A@2hC4ENGL=ERncoMPCXXomI
+D>S?oeUM`eF;k8?\25IGRgh6Pgh4AW`7PGh4RP1n2K[ookSoonUY0H]63[\l09Wgn`5638]63YWg
+nhUF3X]639Wgn`562X]639WgnhUF38]62[\H09Wgn`5628]62YWgnhUF2^\QmdH40`1e4H?o0GD<
+Pgh877h[Pfh87N\8RXGj=IPYAPQ7RlNk302Imo\1APB;aiWgnh_jRXGj=IPkAPQn`h=^14J;AP@5
+0P2k102Imo^;l8]610E60:T307D6Pol2O@5>RdH4VE1B<m:hK@5IFnR9jE2;aU:IFeT3b1?JRoOA
+iX^41SJI0lPCfX]629T3b1?JREknRDklRdknRekl^P40^81Aj5CYD8]62U:ID58cd[P@3UUKj4;Y
+FeT3b1?JRdH<VE5CD58cd[Pl05UKj2[YFeT3b1?JRdH>V@?84mX33RPj4ahZ>XUNnXU>n8<n;3X0
+M1goMP[oMPR;ad1@ogH4j8LN2l1d2H5^n10>Pekj08=nnP1l47l6Pgkh07H8ReKjRdKhj`Jjoonh
+oomOGX_UGL=ERnb3k0AFRgH4ocCoM0;oM0B;A0I8D?md2?md2^Q@oX?438UFoXU6o8=no_me1X=n
+o?md5He6o53XcoeI7UJhITDND;TB0>REj8]FoX]6o5j;iEg3EH_\Pn`PEUN;MPZ=A^29A_k7A_`1
+0>T70h]N280o9G@@odKlRPN;GPB81om61>WV0[Q]=e2=A^1@j?XGFEWoAPR;GPR:1iR9A_Zi5P2k
+ah8^R`LkA_Yd28?30^;cjH82;_mW;8]L3=7SRhLN=XU6o^U_0X]L3=7SRhL\=^__Re`8dN>;QcXf
+jnB;G0SAhh^7DSK[fEKoM_kXb_aIFNU20_md1X=l1PYm0nT<0S?0SEKP0l;Y5@;oM0B3O0@:ONgY
+mP7[j8=l10ae1Kl<0>\;Rd@4^``0VOOkRoYGPol:OLcYe@7[ah]l3TMGPol:O@Fh0@3[0S?0D8?o
+I7d5^040j`8c`5X3d8e6h0?@D^Vm0H]l24MGPol:OI?YW07[S_md0X=l0PYmQNV>0N^0Rd@4^``0
+VOOkdN2;f8^7JSKY;Ooo=8<l2W`3jF;ojF\1jEcoRd@>^`L0VOOkRg`<:oX;ogd3PlL7Rd@>0lNk
+1`2Imo^;n523o`Yl0nTaonTj0NT[oomd3>U10H]43[\709Wgnh]l32_j2omm0h?71h]43P?7B;\7
+09Wgnh_hD8?o2W`3jOWnj@81jO?nRe`<dN?o]ahfSDKPD>Q]5UUI^70gD8e6h53Xn1EIFH]L2=7S
+okLj=Xe6h53XiQEIFKQb=e2=A^1@j=TEFEWoM0J=A^1@j?TFFHeFh0?2D>RViKQd=e2=A^1@j;PE
+FEV;A0X5K0M@SDKPD>SD5UWYQ?koM0B3O0@:O@Fh0@3[0S?0SEKP0l9@j6kU^7LgD8e6h53XP1EI
+FOmd0Xe6h53XX1IISEKP0l9@Pg`22Gh5^040j`8c`5X[d5;X?>FhNSM@SDKPD>Q>5EUIocB=A^1@
+j6lFFHeFh0?2D8<l2Gh5^040j`8c`5X[d>UWoX]42[]T09Wgnh_jDX?o2W`3jOCm^040jO3mjN_m
+Rd@:1F`7D8e6h53Xh^C[4H]L4=7SRhLT>^V@oLM6oWdgogKnj18FFH]F1R]Fo3_2L`WoM_kX0AII
+j`J;APH[A_b;n53oM_koMPCXBQJ3a0H1O_`1OPCoAPR=A^29A_j;A_`kAPIc2h]N280o07@3jNKl
+Reh4aPL0Reh8P3l0M0@c`>\4RdKlB5mNRnEM`bD0@@1204P0B@1=05<0E@1G05P0F@1J0640HP1S
+06@0JP1]0700M`1h07T0EH;[O`60;X0lP9J0^838P?n0XX4iPTV2g7ofO`b0681MP8N0Y83iP361
+789ERnb3k0B;AP@k1S8dLPJh1P1@je^;GPCAhoN7=3@00W@5^040jdbh04B;GPC=8G8nm\:0MCFh
+0D8cbH_AcB5b;U9@^092<lV;dLdQRDKlREKnFUUb6KP0@\dQLQ8kE_ib2GL5>dKlLP;[]c?0j`A@
+j;kRRnEM`eF;k5IGRgh4__oo>Gd>MEn3O@H0M1b3?@1m2EOXEP1I2l1eBoM50P@0M0OoM@SX6?9I
+P7d407`;RTD4V53Xi_IIRo37A@800<M51P00a`D00<I51?n3O@`0M1@c`51@ogD<j7CSD>PZk5W7
+A@`008_6GeiM`eF;k5IGRgh42ome1NS>0>]V>Gd>M0Fhooo[GX<m07`YmdD2201e2X_71@D0>DD:
+MDK71@00RlL51@0iA@Ye>8]528U52^\`jbj;A@H31D2;l2TeD8]528U52U2:A@BHD>S\6H?41S_6
+M0ggA@800WD6Pdd24>^O<l1OGUg3EH_\EULcdX]n1>\3R1E7PoX:M2KoCPIn8H]N2?l?O0b;M`[o
+A`Z:1;@0j`OoMPSXW@IIRm0moomedX?jogD9>gh4M@@c`>\DaPD0Reh8mdL2401d13?0j`>;APAO
+GUg3EH_\Pn`2EUO7A_h008\n<SBnlS;[4_M40P<0M0QFj0;oFOm6oX?648_7C`_0MNN;A_iOGX_U
+GL=ERnb3k09FEh]f2<M6oP00Rmi6RPn:`CabM@Rj0@2o0@3[883iMgD5^P83j`R0nF5e3KX22LM6
+oX00_`80j`@c`>]YRPa6P?T[M0n0?2]e7h3iM7@5P?URMAF0nB]e0XX<Pn;lPlX4adKnP06o0`20
+nGAe1X7:043[7H3iHWD6PLX0P>\?XE`d9@302m2;`ZT0P7@3Plm0a`K^<YROReh6RAN;GPB;A_j9
+1h_7Gej;iEg21P1ERnb3k0AFRgH:ogH6SDKnD8e6o53X=?n9A08;`7@PP7`407dWogKlRdKn2dH4
+D?mf2>SM1h?41XQ410[0O@g6A0Coad@2~2<l3[@HY419Q@j7?PF@_0M0F1C0800[P00U3gA080
+0W@5^040j`8c`50c`51Fj3l>Pl@82l1d1eKX?oeIjl;7A0`008_6GX_UGL8805JnlS:0O0@0O1>Q
+<SBa1=?P1O8bRmJ3aQ0k`WOWP7`407`4<l3[0X_6G\=ERncXcon;d0_0M@@c`>\=D_mf1?mf1S?0
+D>PToeg3EH_\^0:AD?mf1?mf1Xe6253XTNUM`eF;k5IGjKT0odH6Reh4RdL6>dH6MPF;APK[1X]N
+18]71X_hReh4mdL2@01dHH=o1P1dFh]71S]61W=CPcl0MDkoCPHcon\<Reh40gl6RdL6:DH6Reh4
+RdL6>dH6M^UGogH8RTL4V53Xk>23a0J;d05F23_GM4^;ab_20DH6Reh4Pdl28>]4Reh8R1OoAPSo
+CPJ;APH;`7@TCg@QReh4o`ml38]g2_m72XX4]03[1omf1>SK0eV;d3googG:Po[oM;b3OPH0M0?Y
+?_n;APIOGUg21P1ERnb3k0AFRgH62oId=X_N<lV;APPcd^Pfh8UFoXU6o8?j0GLOLP@;`7<IogH4
+ogKlogH:j?KnReKl:m1B<m9HmoK[0S?0GX_UGL=ERnaFEh]f18<l07d:Re@60aA2Ro[[2h\4VC?2
+:l:;d8_hmd@2@01e;8]<2X<l07dMj`U9RmV0?`Ye0DN;`TX;`7G`ja2;fD60?`Ye0DN;`TX;`7G`
+RlMOGUg20P1ERnaFEh]f18]n2UKX^O]I2l1d1KSoon]7Pol1MA23?01n2eKXO?nI:DH66EH8PF@2
+Gok71000Rd@8RD@:Eomf2?mf1XY419Q@j;ONPl@8Po[oM@Xmoome1KSoon\2<l1OGUg3EH_\Pn`4
+EX]f18Y419Q@j2kWFHUFoXU6o8?jogD5?OooM1f3?01m3EKX4onI0DKl4EKnj`]Fj0KoVBU6o1UF
+oX]FoX]6o5j;iEg3EH_\RdH4?E`0M0Dm;`1e1KP10>\2<l1M`P80EH_\Pn`8EUNhX@1@j9;]FHU6
+oP_0M@Dc`>UN0H]n1XX5V8_HmXO[<@ad781m0CYe5XX5V8U6nU3X]NII1L3oRDKhPlL2ja:=A_Q@
+j5KJFH]6n0E104R9A_Z:1IQ@j8Go2l1e?;RQ053oM_koM_SXWP:3a0H;`7D9ogKnj5C\FN^FogKn
+j=h>FH]FoP?@Ro::A?nHD>Q>o`_0MA;615c[38]foXY6nXP4A\H4>TIGE^S_3EUIRgKnRoj;gdN:
+1iR9A_`;`7@8D>PKo`_0M6^0O?l^MA6:A?jHD>P9o`_0M0F3kP;[<X1lobie;81loRie9XY4oIQ@
+j>cn2l1d6X?^0h1locYe0nU_odj;gXX7V53Xd_h;`7CbPgkl07DLRTCoV53X`?h;`7@1CX1locYe
+1<H4G4K6103[2HY6o8P4A^Ugoomfo^PM3UU0Rm23OP@0M1lkEPQf0nTNoomfo_mf1>Pn3EUIogKn
+j6O[FH]61>\9D_mfo^R0kEUIGej;iEg3EH_\Pn`4EUN;MPJ;OPP;mWD4RlO[<8_N<lV;ac?Bj3gM
+REKnRDKlPoX1MaQb10_0La;oMPCoM_coMP[X=`Hcd_Ofj`8c`5mNRnEM`eIG_a@0__8bja>;A08U
+00<m00=e1EKX6OUIPlH@RlM?2l1eiUmN`eF;k5J;MPCgA0800W@3j<Soog@6Rd@8RD@:D8Y419Q@
+j3<8Pl@6R@@;`7h8Pf@2gc?0jaj3?01e3X]40REooPdP08U40^\8a`@008=<0Q2hoomNGL8205F;
+k5J;MPCo15KX101IGUg3EH_\EX]f10_fM@JhoooYU`23?01n3Ol<Re`:od@:RPOYP`23?01lE?M4
+0Q01MDggA08107A6PD`2P023O0H0M0aFj5?o2l1dcN_0jlWgA0800W@3j1[o^040D;QhAE2:A0BH
+D>R71h?41P_0MB>:A0BHD>Q1meTm0@1d1X=<0Q3[RH]40REooPdP08U40^Ujoh0nN4D=M@OgA090
+07B^Pf@2gj1hAK@0GUg3^?8bD>Q>oeW3EH_\Pna8EUN;OPJ;APB9A_h;`7D:]1W=8K@0@8U6oXY6
+oPA0R4JhaTJi>\I6^Ub=M[^dAhYFo\dQL`@c`>\jSDJhD>P@35TkAPQb2<L6U00R0>_W2ome5Omf
+2>PdjUV;n0_0M@S71Y@0203[cXe6^51Gj1d;FEV;aemNRnEM`eF;k8?\0UIGRgh47PL;og@J\02:
+9KWooocb[_OABG@;Rckh=@_oRGknM@\c`>\ZPdKn0X]noX\m2omdkhX52\1djC[PMNV;fH0i?GGR
+RgH4ljJ7bgGIAh_7Gej;iEg3EH_\EULN1h]n18]f1X]>2=7Yo?>UL`6TRdH4GeiM`eF;k5LN1h]n
+18]>1XY628[Po?O70@1d1><9ZTWAjO>[L`6ZGeg3EH_\EX]f18Y61U3oMPQFj<SoPl@6RlINGL=E
+RnaFEah7RdH4>dH6L`Km^040j`?l<l2;MPB;OPJ;CPP;`7@60o5>0oU?mlL107@4ha6TBB_`:oSA
+jO>UL`D3l0?hY?aOGUg3EH_\EX]f1?mf25KoMPKXY_n3a0J;aUiM`eF;k8]>1;@lReH6cB5b0^\4
+D>R0f5g2101ERnb;GP@[bB_B]43=8Eg20P1ERnb3k0AFEh]f1X]n2?O60<1e2:5L=2D0`0_`<l1@
+ogH4j9K\FEV9A_kgaP01M7PS?UhdRlNYP05e1kP1053X:=R3O_koMB>3?V8d0W@:ocIR=>PDf>W]
+0?O7P01d13?0j`>h0@29A_k[3?O600Ad=kQ@053[g?O6l01d6Omf13?0D>Q?oh_h2l1m0nVe05OX
+JNaIja;oMPCoM_kX=_n;n0_0OFcYW01FogH4j9d0FEV;n0_0O5Xc`51Gj1CWFEV9A_bYP01d7X7>
+023gaP20M1hUo`0=801@^040D5OXlNJ3a0K[2_O6009d15OXo_kgA_h107@JmlH00G@DmlK`07@>
+^040D53oMPCX[N^3a0H;og`_mlH00g@5^00@j`8c`8_FPN;on0_@D_M6oP40M0@c`>\3^001FP_@
+RmoAhhVG=3B;aemNRnEM`eF;k8?\0[01Rdh6ml4207D:\0;g`@@0M@:`08]F1;7`8Th62\6d?LdQ
+LQZ9A_j;APHUokP=082;G_kAhhV7=3B;A_k[153XeMJ;iEg3EH_\XI@0>`K:=gdCPcjD~2O0b;
+7Y@0dN>;Uh0gj`>ja3UBogH4^=8iD;PB<e3X0_N3a0QM`eF;k5J;MPKo35J:APBHD>P505UIGUg3
+EH_\EUN;OPJ:APBRNTF3?Omm>_l5Red:odD:R0OgA@8807D3jOD0P3ijA@Yd2X0nNTD=M0?Yi01G
+j0?dF@_0M@?Yf02hoooYe`3Yc`3gA@:@07D7mdD20P1e1X==0Q3[hh5=0P01Pgd607A5Pcd0M0UG
+j<[cF@_0MLZ;A@Kgf8T5Red:odD:X7Y5R0OgA@8807D3jHH0P3ijA@Yd1h0nNTD=MGQGj9OcF@_0
+M6o[UN][RTD4V=7PRmSgQc@d00Qd4kP2050c`51@RTD4V53XZMJ3a0R0?WY52WDOmdD2@01e6;P1
+052hfSU@RTD4V53XX0j3a0Hm0@1e6;P1052hNTE@RTD4V53XR0j3a0Hm0@1d2_M50P02M@?Y?onP
+NTFd05mNGL=ERnbh0S=@ogH4j<knFEUM`eF;k8?\0UIGRgh4RdH6RDKnmdD2201d:N\JEh]N2?m6
+28X7V53XX_iIFCgoogD5<l3YE@6;APKoCPH;`7GLjDD1mdD2@01e0nWO08=m1P1e0nVH08]51S]6
+1W=?Pcd0M0UGj:CbF@_0MLF:A@BHdN2;f?N7=3@027@C^080D3?0D52:A@BHD>RjeH?42?mf1_mf
+28Y519Q@j<4=Pl@6>dH6LP?Yh03[QnWK08\50dH6O1^3?@1e2[Soob]51XT5j`aGj4CbF@_0M0?Y
+H_ooMPKoMPSoM@[X7o^3a0J;1@=61XT5RdH60DD:jIX0RTD4V=7PRmSgQc@d00Qd4kP2050c`51@
+RTD4V53X>=F3a0SoMPKoMPR:A@BHD>Po3H?41S]61W=Qj@Oojeb3O@H0M3g[;ol5OAB;G@[oA@Z;
+MPSoAPR:18P7]03[3eN;GPSoAPR:1e3XG?eIFCgoogD3jLknRdH6odh62l1ean\IogH6ogH8RTD4
+V53Xg@^3a0HkAPIc0nVYoX]6oUmNRnEM`PH0EH_\Pn`2EUOoMPCX;`EIRDH4Pgh407@SRgh47PL;
+og@JRRF`?KWooocb[_OABG@;Rckh=@_oRGknMA?oMPCX2n=I^?oojgJ3A_h2RgknRcd;og@TRPD:
+`7@N>^1ejH_IP3TmMN:;MPCcYXO;MMV;O_j;APB91N]3Rekn:akh=H?30S\NSP1b9h?325?XS>=I
+RoPN1`_oM:>73Xh0DH\fn3GcY8L6n3E@j:7RPl@2Fh\nn3F;APB7@Oj90C?0Gej;iEg3EH_\Pn`4
+EUN;AP@k1S8dLPZh1P1@j>;BjJL0RdH8@3d2078=Reh4dN?gQc@d009d1C?0jH`0ogH8ogH6ogH4
+j8KDPl@6RDKn@3d2078=Reh4dN?gQc@d041e1H]6o^]RRdknRgH67PN;oX_No:`l6W@]?0ed1J[R
+m>\Lh_06DkP1052=A_e@ogH4j3_DPl@6F`OlRTKmZS_kM@;[VN\PDkP1053gfA_0D57oMPCX@=>3
+a0R;GPCAhh6?=3@00U\[niMOGX_UGL=ERnaFRgH4<l1@D51Fj1GdPl@82l1e18=T0^mNGL=ERnaF
+RgH4Rdh6>cHb=785^0H0jc>;dH7R0<2;`S_1MBB1nP30M1j;g]7SRhld=8_NdN>;`BGo?`_2RHLd
+=8_19@30j`Nh0@1@j<SAGUg3EH_\EUN;MPB;OPXiM0ie38=n209o1X7oogmf1[SoonVT08<ngST0
+M@j1oP8cM@S71]hi0@3[4h<ng3T0M@b1o_8bM@K71]`i0@23?01d3kP1050c`51@E^QMlh?42?M4
+0P@0M0OoM0SXjN1IPf@2llM41P00RlH51@29A0R9A0Z3OPP2M3h;ogHja`K\<[jOPgh607DHEnR9
+hEV9APH;`7D3jGOoPd`21>\3jFkoRdH6RD@:RD@8RG`6Pgh80GD4Pd`223?0GeiM`eF;k5IGRgh6
+RgH4Eomf2?ldj97gPl@60Cb;7<H708_7GeiM`PH0EH_\Reh4aPL0^5FED8e6153oMPJ=APQ@j<7J
+GL=ERnb;GPC61`2hEIE@SDH4D?mf1_mf2>RUfUg3EH_\EX]f18\Lo`B:5h[22\1e1KSoon\4R\:d
+05iM`eF;k5J;MPKo35iM`eF;k8e6253oMPJ=APA@^=>ED;RdUE3XDm:3a0YM`eF;k?mf2?mf1Xe6
+152hdiE@^;BED>PfdX?42Ug3EH_\Pn`dEUN=E\bd6\dQLPn;EPBi5P2dC\dQLP?YU029A_jhh3U@
+ogH4j;D2FET;`7D2jgLc`53oMPA@j;CbPl@6RDKl2l1dHh]No8X7V8U6nXY70iR9A_R3O_P0MCQC
+j6;OFH=nnV5l2X=nnWYo1;1Qj`:`@HYFnR[@R5K<adKR~2adKT8@37A^P00<M6iP00_T11jdJ;
+E_bi5P2dC\dQW?mfo>PMgeVML`SoM_kXQ<o[LXYFhB_fm\90MB^1cP01oTk<m\8@M@n1cP21m\81
+M@Z1cX00j`B1cT10ogKTogKRj=_<TN\=adK<oon1cX0Q:lV;dH]n1Qh7o8Y6c9R[Tb_0ZiJ[^040
+ZiJ[Zi>[RdKVZh]6j:^AZi:[TZ^BZi:[TZ\c`5mNRnEM`eF;k5IGo8]n11h7RmLb`;Wooo:^SGGo
+Rgh6^OoolZkgdB_iQoOgaP40M0:TBM7YljEc0JBBGeiM`eF;k5IGS=R>`?`c`8_HRgh6RoLb`;Wo
+oo:^mm6;oX]f1?>VRTCoRUgo:l=OGUg3EH_\EULN1ob;OPJ;mc;0^OoolZkgdH]n1?>TRdH4GeiM
+`eF;k8?\0UIGRgH4E^RC05U0RDKnD>S6gUV;n0_0M0_oM_iFD>P3mH?41X_7Gej;iEg3EH_\EX]F
+1X]f13\FbSMm3P_BO0Z;f]7SRiN0=n\3^^@i2oId5h0l07@BDUJhlSU@^7a5D>Q2oH?42>\?D[Sj
+>E2hO4E@j37mPl@6^7a5GUg2101ERnco=Y@0ogH4j:3oGL=ERncoMP@c`53XT_mM`eF;k5N<f8k0
+Rgh4<l3l^OoolZjAmm18Geg3EH_\Pn`2EUN;OPAGj=OoFHU6o_mf1^S=oeV;l3]f27H3RgH8EX_7
+0dKnD?mf1^RLm8?41X]NoP?NaP40RlMOGX_UGL=ERnaFEhcHS\3lRgh6RoLb`8]N28_;lZh[fH]n
+18O;ljB;bo>ZRdH4GeiM`eF;k5IGRgh4jaJ;MPK[2hX5>PAe18_7j`i6P3`0MO17P3d0MNDc`5mN
+GL=ERnb3k0AFEh]n1>SG0Z4Z>X\F:3Z1`P2V5LhBRDKnREKlRcF1aTChRlKAn=7hVE1B^XH7^80O
+FE_XR<h1A_`AE_j;aRD309U@D[[Q0KR0<eUKj6o>0DKl4EKnmlH307@9PDKlP563E_h1<lV:A@>H
+B8_`j`Q>RXCn>IP3b0_fOoB:A@:HB0?8P7d30Wh7m`D307D1@H]N1XY70K@0D8_1^QP0mnYJ0l:;
+l8<n;3X0M1R:A`6d051A<l1@R`D5C_Q@j9032l1d0Dj;aYU@DS?B^10>FE_Xk<d1A_`AE_j;GPJ:
+1k@0VE1B<m:h?01IFnSBcH]N1XYO0kL0D8_3DYUKF@?84mX1C_`AG_j;E_j;A_aOGX_UGL=ERnaF
+Eh]f28]n2^S00J4Z>X\F:3Z1`P2V5LhB:EH46DH6aTD203?0^S`0D5;oMPKoMPCXnlZ8A@<c`;Xl
+051BogH6ogH4j=W:REH6RDH4<l2j?01@D_mf1_mf1>SBbXP5<l2j?01@D_mf1_mf1>RabXUF1XU6
+13?0^_R8D5;oMPKoMPCXVl[Ah=7P1K`7R@@c`;[hR51BogH6ogH4j97:REH6RDH4Pgh607`lM@N1
+OPA@8W8cPFh4D2:3GPH0o`@c`;Xh8U1BogH6ogH4j5;:0@@c`;Xh8U1BogH6ogH4j4o:REH6RDH4
+Pch\>P1d>S?0^QP0D5;oMPKoMPCX<\Y@<l2j601@D_mf1_mf1>PBbU0c`52;10E>n53X808;`7@8
+PdH40H=F1P0c`;XH051BogH6ogH4j?S9R4D1<l2j601@D_mf1_mf1>SFbHUF1XU618=61063EPH0
+m`@307D^Pgh607`BO`J3OP@lMPZ3KP@1Peh60>\FPgh607D@Pgh4?7D:aT@30\I40Qg[?<I40`3[
+5HY40iR;f8Z7oSVHVBU611UF1_i40hY40iR;f8Z7oSVHVC]F1WcJM@DkAPAbdoi40hY618Q40UmN
+GL=FEkP^>U3XQ_1IRoP;`7AbD>QBo5Tm101bJ8X5V8_HRXO[<IRY301dFHY50IR;f8Z7jc6HZ@`0
+M4V:A@:HRmR:Qn\aV:T<07@iP7d3;G@CP7d3:g@=RTD3V8_HmXO[<@9d88Y50iR;f8Z7jc6HZ@80
+MCn:A@BHRmR:Qn\aV:T207D_a`H\>P40a`HZ>P00a`HX>U16^34jD?lf93[X0o]IFKPe>U3o=RHj
+j?KjFEWY^`2h101@<l1@ocHV>^Qdl8?41[P3051GocHT>^Sfnh?41X\N93[6A`<0RlL50`1@j3OM
+FE1B<m:h40iIFnS`bXTF:SZS:3[71R`j~2_P<0jfB;gXX1V8_HmXO[<@adEH_70lI@j4okFCd3
+079?Rmn:@06HRmR:Qn\aV:T<07@mRmn:@0:HRmR:Qn\aV:T<07@[^0<0D8_70lI@ocHV>^Qcnh?4
+1X\N9S[6A`<0a`H\>P40j`Q6Rmj0>@1eUEmN`eF;k5J3OPH0MBb;MPR3OPPkLPb;AP@5AP2Y0`1e
+0Dk7APH00>\3odH6Reh6dN<i]`XjM_;[8H=n1P=b2h]610E60:T307@3odh8Reh6Bm7SRhL:>P56
+28=n1PAbNg@8Pgh62WMcMFb;GPKAhh=n111n3h=n1PAe2H^?23Z3`@O[18^?2SZ;GPB1`k87m\<3
+M059Reh4@m7kdO\3fKQ]0OMV10?31@@0<m:k1`3glb_:RdH8Pgh617D>>l5g5WDIP7h:0W8Cj``k
+`G88M@^0OPX1M`Fh0@3[0S?0GUg2201ERnb1k8P0EUN;OPB;MPHk?S8dLPZh1P1@j=[7jMl0RdH8
+@3d207<5<l3Yd@2;gm7SmhLd=008M0nh0P1@<l1@D5OXYlR3a0R;gm7SmhLd=010M@koMPQFEnRX
+08?41^VL08_OdN>1Yc@doof9M_Z;APR9A_k[COm>oX]Nn_m6nXX7R4Km?0Ye1<H43DJ:A_f814J=
+QWSoRmH[d87jP01l9b_`EU1Gj5\0Pl@6Rm0kaW@BPo[oM@Fhooo[?H]622]6o^\aSKIhoh=noP1e
+ZHf6N?l[l8_62l1f8EJ=QWSoD5OX8023a0J;d3_6M0j3n_mdaH]620?2:lK[0h]625mNRnEM`eF;
+k8]N1=7SmhLd=040M0Jh1@1@jand@8]N18]>28]F1\dQLPm@Reh4dN>1Sc@d011Hj`A@j;[6GL=F
+Ec?o__8b>chb=7<Fmd@20`1d1EKXi^=IPlH@Ac\n<SAbjUmN`eIG_`@0__8bja3gA08307@5E^Ph
+i5U?PlH@2omek5mN``00~3@VmbK65^I213:b\P;B13Kg1iLVUWJ7@P<CTi<B12Kg9\HFiT84U^
+M6`^04ieK6`PL6mYKWAULR1QLg=YIfi]IFid3@Y4JGIYI6DPIG9bKg8=2T5RKVmbKF5\871bKfMb
+HFdPM6EbKFU^HGAYKfh=2P00~T9THVAP00~:94UT902C0@40~2V@40~3Z040~3[`41~3]042~3
+^040~3_@41~3a`40~3e@42~3g`40~3l040~3n`40~32@81~34P81~50@0001\2~49P80~3<P8i
+0P00?P960Td2D`8005`2~3IP80~2KP80~2M080~2OP80~2R`80~2T`80~2V@80~2Y`80~2Z`80
+~2\P80~2]`80~2a`80~2e080~2g@80~2i080~2jP80~7m080~2o@80~210<0~7I6ERMFL0IFiS
+KfAYKVMOM65RK6D0IVmbKF5d06QUK700K6mW06e_I6D0KgIULWMbJGAU079UHfmbI5m\IFiWM6P0
+M6U]IG=dHFe`07AbHFicK65dJFm^GfIYK6D0JFiTIGQOIVU\I@1`HFAOHfQQLV5SM6Eb07EeI6ES
+KfAU07QhI6ESKfAU06U^L7EdGfIYK6D0KgEdL7EdGfIYK6D0HVU^HG9i07AUN7@0I6EVHGE\M01c
+M79UHFd0IVUhIF@0MV5bJF5RK6D0HGAdLV9UIfU^065dM79UKV@0HVEWJFh0HWUdIF=_MFid06=X
+HG9QHgAULW=UM01SKfe]IFid06=bHc<b06AUHfmTIGIULW=YKfh0IFiT06I_LVeQM01]KfAU06m`
+IG9QM6U^Ig=iLgAUK@1bIF=_LVA\IFiWM6P0Lf]YL6IbKfd0Lf]YL7A_07AQHVaU07AYKFEcM65]
+L01hK7@]IW9_K@1hK7@]M6l0N6ad;G=eHW=dHfQQLP1hK7@02UAbHFicK65dJFm^86U^I6Eh86IY
+K6Dj820P820P820P820PKVm^I@0:E79QKW=\HGAYKfhPJFiTIGPPIVU\ICXP820P820P820P820U
+L`0:D65bM20U<f@PBBm@86IYK6Dj820P820P820P820P820P820UL`1@HG9d82DcI21cM65bM7<P
+KfhPK6U^ICXP820P820P820P82E\I01bIF=_LVAOHWEVIVEb071bIFeQM7EbIB15CdHPIFiSKgE^
+M6EbIF@PMfQYK6DPI6ESKfAYKVL0IG9bKg8PLVEQI6U^Ib1UKV=_I6ET86AQM640JFifHFaYI21S
+J65bHF=dIG8P9F@P:31h9C0bF2TPKfhPK6U^IB0UK6@PKfHPIVU\IB1P9G<W06U^MV5\JF@PIFiS
+KfAUI21RNGAU86=_MFid82PUI2T0IG9bKg8PLVEQI6U^Ib1UKV=_I6ET86AQM640D65bM20U<f@P
+IFiTLb1_KR1\JFiU>R0P820P820P820P820UK6@0H2Ec9b1XIF5TIG8PKfi\NB1QK6a_MfET86U^
+85IFAB1VJFaUL`0UJ6@0EFiUN71UHgAUI21P9G<P9F@W051QLW@P9C=T86E^I7<PKfhPK6U^ICXP
+820P820P820P820P9FaT06U^MV5\JF@PJ6EQI6Eb86I_MFiT02ET86=XHG9QHgAULW<PIGQ`IF=d
+IF@P;B0UI21VKgE^I01YKWIQK6UT879UHfmbI21\IFiWM6PPLVESKg9TIF@P:2E\I2T0HfmeK6A^
+9g@PLVEQK6a_Hf5dIB0UK6@PHWUdIG<PIVmb87AXIB1bIF=_LV@PHWEVIVEb04A5@UE7>R00I6ES
+KfAU>R1bIF5\K6mSHGAUI20UK6@PHWUdIG<PIVmb87AXIB1bIF=_LV@PHWEVIVEb00X0JFifHFaY
+I21SJ65bHF=dIG8P9F@P:31h9C0bF2TPKfhPK6U^IB0UK6@PKfHPIVU\IB1P9G<W06U^MV5\JF@P
+HfQQLV5SM6Eb82ET82P`N2D`<UPY86m^86aYKVDP9FaT86mV86IYK6DPH2Ec9`1YKWIQK6UT86=X
+HG9QHgAULR0UI20X<7PU<39H:B1_KR1\JFiU82E\I21_IR1VJFaU860ULbL0JFifHFaYI21SJ65b
+HF=dIG8P9F@P:31h9C0bF2TPKfhPK6U^IB0UK6@PKfHPIVU\IB1P9G<W06eQN6U]MFdPKWE]HVEb
+86mV871QLWAc879UHF=XIF@P:2ET:@15CdHPIFiSKgE^M6EbIF@PKfhPLfEQLV=X871QLg<P9F@0
+A4E2EDLj801VJFiTGfiUN7AOL65bM3XPADm686E^HfmeKWAULVET86m^87=UHG9SJ21`HG=c82ET
+00X0A4E2EDLj801VJFiTGfiUN7AOL65bM3XP@fm^M6EhM3XPK6U^IB0UK6@PKfHPIVU\IB1P9G<W
+00X0A4E2EDLj801VJFiTGfiUN7AOL65bM3XPDVEgJFiTJFiW86IYK6DPH2Ec9`0:06=_MFaTKRMd
+86IYKV@PL65bM20UI21YKR1VJFaU860ULbL0ADm686E^HfmeKWAULVET86m^87=UHG9SJ21`HG=c
+82ET06EbLVmb879UHFAYKVLPIVU\I@14AD9EAcXP06IYKVAOKVEhM5m`HG9d>R13KgE\I6hWM21V
+JFiT871QLW@P9F@PJFhPIVU\IB1P9G<W00X0D65bM20U<f@PLgAQLWAc86m^86aYKVDj820P820P
+820P820UK6@0IG9bKg8PLVEQI6U^Ib1UKV=_I6U^Ib1dHF9\I@1TIFIOIVU\IEm^HFeU05IFI6ES
+KfAU82Ec;20ULb1bIFaUHG=U82PULbT:030^>CLPHVEdH@1=Dbe4Ce<PE7EbHVlP@`0b=B1>KgHP
+<CTi<P19;e0PIVU\ICXP820P820P820P820P820P820P820P820P82Ec04mfIG9gLVUdIB1UN6Uc
+M6U^Ib1VJFaULcXP820P820P820P9G<0NFEc06i_04a_Ib1VJFaU>R0P820P820P820P820P820P
+820P820P820P9G<0EUITIF=_I6DPMVEbLfU_KR0UJ6@^<21_LR1\HGAULR1YLg9ULGEYLVET87A_
+86AUHfmTIB1VJFaU860ULbL:05IFAB1XIF5TIG8PIVU\IB1cL6ES>R0P820P820P820P820P9G<0
+@E=3BDT0@E=3BDT02UAbHFicK65dJFm^871ULVI_LVeUI3XP820P820P820P820PKVm^I@1dLV5^
+LfaQM6U_KR1VJFaU87AbHFicK65dIG<PIW9_KB1P9G<W87A_860ULbL0EUI586IYK6DPHfQQLV5S
+M6Eb87=UM21YLb1P9G<W045C@dU907AbHFicK65dJFm^86IYK6DPM79QKW=\HGAULb1VLVm]860U
+LbLPM6lPH2Ec9`1\Kf=QK21SJ65bHF=dIG8PLfEd86Uc860ULbL0@E=3BDT0@E=3BDT0EUI586IY
+K6DPHfQQLV5SM6Eb87=UM21YLb1P9G<W06a_Hf5\86=XHG9QHgAULR1cIG@PJG<PH2Ec9`11Dd=9
+B@19KWAULViQK21ULW9_LR1TIGAUHgAUI21YKR0ULbPY06m`IFiOJG1OIVU\I@0]07=dI6U^07If
+I@14AD9EAcXP06m`IFiOJG1OIVU\ICXPKg1UKVU^Ib1YKW1eM21VJFaU860ULbL02P1ULW9_LR1_
+L6E^JFiW86U^L7Ed86IYK6DPH2Ec9`14AD9EAcXP06m`IFiOJG1OIVU\ICXPH2Ec9b1YLb1^Kg@P
+HB1bIFMeK65b86IYK6D02P1f9C0bI01SKgE\I6hWM21VJFiT871QLW@P9F@PIVU\IB1P9G<W04E^
+M6Eb86IYK6DPLg1UHfUVJF=QM6U_KR1VKg8PL65bM20UI3XP04A5@UE7>R00Kg1UKUmYL5mVJFaU
+>R1_L6E^JFiW86U^L7Ed86IYK6DPH2Ec9`0:06=_MFaTKRMd86m`IFhPL65bM21VJFaU860ULbL0
+2U1QLW@P9C=T84T_D21VJFaU>R0P820P820P820P820P820P9G<0K6EWHFaOJ6AbIUmcL6ES07If
+GfIYK6EOKV5]I@1fMUmVJFaUGfEhM00]07=dI6meM014AD9EAcXP06m`IFiOKg1OIVU\ICXPKg1U
+KVU^Ib1_MGA`MG@PIVU\IB1P9G<W00X0A4E2EDLj801_L6E^Gfm`GfIYK6Dj86m`IFiYKVLPKgEd
+L7Ed86IYK6DPH2Ec9`0:04U^M6EbKV5\86EbLVmb86AUM6ESM6ET86U^82Ec:2T0Kg1UKUm_L5mV
+JFaU06EbLVmb86m`IFiYKVLPKgEdL7Ed86IYK6DPH2Ec9`1?;e0PIVU\ICXP820P820P820P820P
+820P820P820P820P82Ec04A5@UE7>R00Kg1UKUm_L5mVJFaU>R1P9G<W86Uc86i_M21Q879UIgE\
+HG8PIVU\I@0:07A]L5m`M7809BYc82EKGPYM07A_Kb1]HFii86=XHG9QHgAULW<P:2ET:B1YKR1U
+KV=_I6U^Ib1dHF9\I@1ULW9_LR1bIF5TJFiW86E^HfmTJFiW87AQHVaU07A_Kb1]HFii86=XHG9Q
+HgAULW<P:2ET:B1YKR1UKV=_I6U^Ib1dHF9\I@1gLVm^Ib1^MFeRIG8PKfHPHfQQLV5SM6EbLb0X
+9F@Y86U^86E^HfmTJFiW87AQHVaU06EbLVmb86m`IFiYKVLPM79QKW=\HGAYKfhPJFiTIGPPIVU\
+IB1P9G<W06EbLVmb879UHFAYKVLPM79QKW=\HGAYKfhPJFiTIGPPIVU\I@0ULb0ULb0UL`1ULW9_
+LR1`HG9cJFiW83<PIFidLVUULb1YKR1dLV5^LfaQM6U_KR1YKVAUN21VJFaU04A5@UE7>R00L79c
+GfUTN5mVJFaU>R0U<3A\I3XPAW9_KCXPH2Ec9b`PE6lj860ULbL\85Q<E2eVJFaU>R1P9G<W00X0
+ADm686E^HfmeKWAULVET869UIVmbIB1P9G<W86QUHFAULP1ULW9_LR1bIF5TJFiW86IYK6DPJ6EQ
+I6EbL`1FEV=_I6DPJ6EQI6Eb860ULbLPIVmeKV@PMfQUKR1EEBmHF6AUHfmTJFiW06QUHFAULR1P
+9G<W879UL6EQM6ET06QUHFAULR1P9G<W879UL6EQM6ET06EbLVmb879UHFAYKVLPIFiSKfAYKVLP
+M65RK6D0EUI586QUHFAULR1P9G<W86i_M21iIG@PLgE`L6mbM6ET04U^M6EbKV5\86EbLVmb86AU
+M6ESM6ET86U^82Ec:2T0LVAVJEmXIF5TIG9c06QUHFAULR1P9G<W86i_M21cMG1`Kg9dIF@PMfQU
+KR1EEBmHF6AUHfmTJFiW02E\I01ULW9_LR1`HG9cJFiW87IQK7EU86mV860ULbLPJ6EQI6Eb06QU
+HFAULR1P9G<W86i_M21cMG1`Kg9dIF@PMfQUKR1EEBmHF6AUHfmTJFiW02E\N01ULW9_LR1`HG9c
+JFiW87IQK7EU86mV860ULbLPJ6EQI6Eb04AUHfmTJFiW86eUM6Q_I3XP820P820P820P820P820P
+820PEEESKfAU2P14IF=_I6U^Ib1]IGAXKf@j820P820P820P820P820P820P85QHHfmTI@X0EWH0
+EP14IF=_I6U^Ib1]IGAXKf@j820P820P820P820P820P820P85IFHfmTI@X0M69\06EbLVmb879U
+HFAYKVLPIFiSKfAYKVLPM65RK6DPIVU\IB1P9G<W06AUIV5eK7@PEEESKfAU060Q8R<T9BHW:2TZ
+:b`];Rl`<C8c=3Df=cPi>S\l?Cho@452@dA5ATM8BDY;C4e>Ce1ADU=DEEIGF5UJFeaMGUl0I6EV
+HGE\M21HF6=_I6D0:bd`<C8c=3Df=cPi@D93A4E6AdQ9BT]<CDi?D55BDeAEEUMHFEYQHV=TIFIW
+J6UZJfa]KVm`LG9cM7EfMgQiNP1TIFIQMFad85IFHfmTI@0[;C0a<S<d=CHg>3U1@T=4ADI7B4U:
+Bda=CTm@DE9CE5EFEeQIFV5RHfAUIVMXJFY[K6e^Kg1aLW=dMGIgN7Uj00Y5KV=_I6U^Ib1dHF9\
+IB1cKgEbHfDj820P820P820P820P82Ec04E^HfmTJFiW87AQHVaU86=_KWAUKWAc>R0P820P820P
+820P9Bhc<W<0820P820P820P820P820P820P820P820P820P820P820P820U;S<bL`1=Dbe4Ce<0
+EUI586IYK6DPHg9UHGAUI21_KR1Q86AYIVIULVE^M21_L6EbHGAYKVLPLgUcM6E]>R1P9G<W07AX
+IB1_MGA`MG@PIVU\IB1gJFa\869U86=bIF5dIF@PMG=YKVLPM6QU86AUIV5eK7@PIVmbKF5d04eC
+;DA?D`1?;e0PIVU\IB1VKg9]HG@j820P820P820P820P820P820P82Ec06UTN01FEUm9CTA5F5m6
+BDa505IFGdU>A4EHGdI9C4D0EUIOBDi4AEQOATU<A@1fMRehK7@^JFAh07If;GQ\M2iYI7P0MWH]
+N6ad;VUTN01fMRehK7@^JFAh06U^MV5\JF@PIVU\IB1UKV=_I6U^Ib1]KfAU87=UM20X9F@Y00Y?
+;e0PIVU\IB1]KfAU>R0P820P820P820P820P820P820P82Ec04A5@UE7>R00L65T86=XHG9QHgAU
+LR1^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P0UI01`HF@PHfQQLV5SM6Eb87IQ
+K7EU86eeLg@PHVDPJFhPM6QU879QKVMU830]<SDe04l_D21VJFaU871QI6AYKVLPHfQQLV5SM6Eb
+>R0P820P820P9F@P:31h9C0bN2T0JFifHFaYI21]HGQYKGE]86IYN6ET879UHfmbI21\IFiWM6PP
+LfEd82PUK6@Y06U^MV5\JF@PKF5hJFeeKB1fHG9YHF9\IB1bIF=_LV@PK6E^IgAX87=UM20X9FaT
+:@1?;e0PIVU\IB1]HGQYKGE]879UHfmbI21\IFiWM6Pj820P82E\I01?;e0PIVU\IB1dJFeULgAQ
+KG0j820P820P820P820P820P82Ec00YDKgAQK21RNGAULb1bIF5T>R0P820P820P820P820P820P
+82E\I01DKgAQK219;e0PL65bM7<PLVEQI3XP820P820P820P820P82ET05A_M65\869iM6Ec87Mb
+JGAdIFhj820P820P820P820P820P9FaT85]?Bed0E6mdHF`PHWUdIG<PMg9YM7AUKSXP820P820P
+820P820P820UK6@0K65cM21bIF=_LV@PMf5c871QI6AUI21gJGAX87IQK7EU82ET82P`N2D`<WPY
+06IYK6DPLfUjIB1TKfEc86i_M21]HGASJ21dJ65d879UHfmbI6ET85\UK6AM05A_M65\869iM6Ec
+87MbJGAdIFhj820P820P820P820P820P9FaT85]^Kg@PLVESKg9TIFAM04=B@bdc<SXP820P820P
+820P820P820P820P820P820P820P9C0hK7PPFdm;G@13DT<]<c8j820P820P820P820P820P820P
+820P820P820P82D`>6ah04=B@bdc<R1TKfEc86i_M21]HGASJ21dJ65d879UHfmbI6ET85\U<3Q\
+N5d0@e93;C<b>R0P820P820P820P820P820P820P820P820P820U<3Q\N21KKVmd879UHfmbI6ET
+G@0:EUITIF=_I6DP9G<\82Ec879UK6EQLfDP:2Ec:@X:030^>CLPHVEdH@1=Dbe4Ce<PE7EbHVlP
+@`0b=B1>KgHP<CTi<P1FEVAUHfmTICXP9G<:2P1ELf5WICXPEUITIF=_I6DP85]aMF5\JFIYIG9c
+GB0PJFi`MGAOIVU\IB0PFfmeM71eM5mVJFaUG@X:020PEV5\JF@PLGEQK6UVJFEbLb1QLVDj2PX0
+820U;S5c9G<:02l]020P9BhaLbEc9BhaLfIYK6D]Lg1UH`X0;bd0?CX]020P9BhaLbEc9BhaLfIY
+K6D]IVmbKF5d820XIVmbKF5dLb1cMG1`Kg9dIF@j82Ec9G<ULbEc9G<ULbEc:@X0;bd0?CX]0200
+800P020P9BhaLbEc2P0_;@0P82D^<G<ULbD^<G=VJFaU;G=`IF<:02l]03dj;@0P82D^<G<ULe\U
+;S5cIVU\IBecL6ESG@X0;bd0?CX]020P9BhaLbEc9BhaLfIYK6D]IFiSKfAYKVL]KFmTIB0P:6e_
+I6Ec87=eL71_LWAUI3XPHVU^HG9i87AUN7@Y2P0_;@0m>Rd0820U;S5c9G<:02l]020P9BhaLbEc
+9BhaLfAUHfU]HF`]HfQQLRefHFaeI@X0;bd0?CX]020P9BhaLbEc9BhaLf9iM6Ec2P0_;@0m>Rd0
+820U;S5c9G=K9BhaLgAYKFEM2P0_;@0m>Rd0820U;S5c9G<U;S5cIVU\IBecL6ES2P0_;@0m>Rd0
+820U;S5c9G<:02l]020P9BhaLbEc2PX0;bd0MFiQHVaU87A_865\K6mSHGAU82E\I21RNGAULb1V
+Kg8PHWEVIVEb8617GgA]L5m]LfLW04A5@UE7>R00KF5YKSXPHFa\Kf=QM6ET82E\I21RNGAULb1V
+Kg8PHWEVIVEb8617GgA]L5m]LfLW00X0AemYL5mRMFIVIG80Aem_L5mRMFIVIG80;bd0?CX]06QU
+K70PLVEaMFEcM6ET06U^L7Ed86IYK6DPKGEcM21RIB1cL6ESJFIYIF@094UT90009BYc82EXI20U
+Feh:G@1ULW9_LR1`HG9cJFiW860ULbLPJ6EQI6Eb87IQK7EU045C@dU905IFAB1SJ65bHF=dIG8P
+LfEd>R0P820P820P820P820P820PKVmd879UHfmbI6ET05IFAB1VJFaU86=XHG9QHgAULR1cIG@P
+Mf5c86i_M21bIF=_LVAUI01\Kf=QK21SJ65bHF=dIG8PLfEd860ULbLPHG=cMFeUI011Dd=9B@1F
+ETDPHfQQLV5SM6Eb87=UM3XP820P820P820P820P820P82Ec05IFAB1]JFiYKGE]86AUHfmTIB1f
+IG9cJFm^>R0P820P820PKVmd879UHfmbI6ET02EXI015LW9_LR1`HG9cJFiW860ULbLPJ6EQI6Eb
+87IQK7EU>R1P9G<W05IFAB1]JFiYKGE]86AUHfmTIB1fIG9cJFm^>R0P820P820P9F@^<01FETDP
+IVmbKF5d>R0P820P820P820P820P820P820P820P86i_M21bIF=_LVAUI01FETDPIVmbKF5d>R0P
+820P820P820P820P820P820P820P82Ec06U^MV5\JF@PH2Ec9b1XIF5TIG8PMV5\MFDj860ULbL0
+2UIFAB1]KfAU>R0P820P820P820P820P820P820P820P820PKVmd879UHfmbI6ET00YFETDPKFmT
+ICXP820P820P820P820P820P820P820P820P82Ec06U^MV5\JF@PH2Ec9b1XIF5TIG8PMV5\MFDj
+860ULbL0CE<]A4mC05IFAB1_L6EbHGAYKVLPLgUcM6E]>R0P820P820P820P820PKVmd879UHfmb
+I6ET05IFAB1VJFaU86m`IG9QM6U^Ib1cNG=dIFdPMf5c86i_M21bIF=_LVAUI01\Kf=QK21_L6Eb
+HGAYKVLPLgUcM6E]860ULbLPHG=cMFeUI01=Dbe4Ce<0EUI586m`IG9QM6U^Ib1cNG=dIFdj820P
+820P820P820P820UL`1FETDPK6m^IfEcM21bIF=_LV@PK6E^IgAX>R0P820P820P86i_M21bIF=_
+LVAUI01FETDPKF5hJFeeKB1bIF=_LV@PK6E^IgAX>R0P820P820P86i_M21bIF=_LVAUI00ULb0U
+L`0UK6@0BFifHFaYI21cIF=_KV@PMV5\MFDPKfHPH2Ec9b1XIF5TIG8j860ULbL0EUI586a_KVMU
+Lg@PLVESKg9T86aUKVMdJ3XP820P820P820UK6@09FaT04U^MV5\JF@PIVUbLg@PMV5\MFDPKfHP
+H2Ec9b1XIF5TIG8j860ULbL0EUI586eQN6U]MFdPLVESKg9T86aUKVMdJ3XP820P820P820UK6@0
+AG9bKg8PL65bLfU^Ib1P9G<W86QUHFAULR1fHFaeICXPH2Ec9`1FETDPM6U]IG=dHFe`>R0P820P
+820P820P820P820P820P86i_M21bIF=_LVAUI01FETDPM6U]IG=dHFe`>R0P820P820P820P820P
+820P820P82Ec06U^MV5\JF@PH2Ec9b1XIF5TIG8PMV5\MFDj860ULbL0HVEWJFiOMV5\MFEOHWEV
+IVEb02DZLb0UFeh:G@1ULW9_LR1`HG9cJFiW87IQK7EU86mV860ULbLPJ6EQI6Eb02DZLb0U:W<P
+9E]N2Ud0IG9bKg8PL65bLfU^Ib1fHFaeIB1_IR1EEBmHF6=_I6DPH2Ec9b1XIF5TIG8094UT900O
+01`07`0N01l07P0O01l07P0O01h07`1ULW9_LR1QK6a_Hf5dJFiW82E\I21RNGAULb1VKg8PHWEV
+IVEb860ULbL0A4E2EDLj801QK6a_Hf5dIEmRMFIVIG8j865\K6mSHGAUI20UK6@PHWUdIG<PIVmb
+869eIVIULR1P9G<W00X0Hfm]KFE^M5mcM79OHWEVIVEb02DZLb0UFeh:G@1FETDPIVU\IB1SKfe]
+IFid>R0P820P820P820P820P9G<0IG9bKg8PL65bLfU^Ib1fHFaeIB1_IR1P9G<W86QUHFAULP1U
+LW9_LR1SK6mcJFiW86IYK6DPH2Ec9`14AD9EAcXP06MUM6=OIVmbKF5d>R1VKg9]HG@PKVmd87=`
+IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0JFifHFaYI21VKg9]HG@PH2Ec9`14AD9EAcXP
+06MUM6=OIVmbKF5d>R1SKfe]HFiT86aYKVDPLg1UHfUVJFEc86I_LVeQM21P9G<W00X0A4E2EDLj
+801WIGASGfe_I6Dj86e_I6DPKVmd87=`IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0JFif
+HFaYI21]KfAU860ULbL0A4E2EDLj801WIGASGfe_I6Dj86=_KFeQKV@PK6U^IB1cL6ESJFIYIG<P
+KFmTIB1P9G<W00X0A4E2EDLj801WIGASGg9UHfaUKSXPLVESKg9T86aUKVMdJ21^Kg@PLg1UHfUV
+JFET86m^87AXIB1SKfe]HFiT86aYKVD02P0UK6@0JFifHFaYI21bIF=_LV@PK6E^IgAX87=`IF=Y
+IVUUI21P9G<W079UHfmbI21\IFiWM6PPKGEcM21RIB1YKR1dJ6DPLV5^IfDP9FaT;BE\I20XKVmd
+82E\I2T0LVESKg9T86aUKVMdJ21]MG=d869U86U^87AXIB1bHFiWIB0UK6@]9FaT82Q^Kg@P9FaT
+:@14AD9EAcXP06MUM6=OLVESK6E^>R1SKfe]HFiT86aYKVDPLg1UHfUVJFEc86eQN6U]MFdPLVES
+Kg9T86aUKVMdJ21P9FaT9`0:04A5@UE7>R00IfEdHemdJFeULgAQKG0j87AYKFEcM65]L21^Kg@P
+Lg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P1YKWIQK6UT87AYKFEcM65]L21cM79YKVLP
+Lg1UHfUVJFET860ULbL0A4E2EDLj801XIF5TIG9OM7U`ICXPEUI586aYKVDPKF5dHfQULb1XIF5T
+IG8j860ULbL02P1QKF9YIgE_MG<PJ6EQI6Eb86UWKVmbIF@0A4E2EDLj801XIF5TIG9OM7U`ICXP
+JFM^Kg9UI21eKV]^KgM^85IFAB1XIF5TIG8PK6U^ICXPH2Ec9`0:04A5@UE7>R00KF5[IEmdJFeU
+>R1THGAU871bKgIYI6ET83dP9C0dI2lU<39T;bD`<V@02P14AD9EAcXP06eQJfEOM6U]ICXPM6U]
+IB1`LVmfJFAUI20m82D`<V@j9C0bI3XU<39T00X0A4E2EDLj801]HF]UGgAYKFDj87AYKFEOM21f
+HFaeIB1bIGAeLViUI20m82E\I00:04A5@UE7>R00Kg1UKUm\KfMOIVU\ICXPK6mW86IYK6DPKVmd
+87=`IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0K6mW04A5@UE7>R00Kg1UKUm\KfMOIVU\
+ICXPKg1UKVU^Ib1\KfLPIVU\IB1P9G<W00X0LgATIG9b06EbLVmb86m`IFiYKVLPK6mW86IYK6DP
+H2Ec9`14AD9EAcXP06m`IFiOK6mWGfIYK6Dj860ULbLPJG<PKVmd864PLVEWMFaQLR1VJFaU00X0
+I7E]KGT09BYc82Ec06EbLVmb871QLW=YKVLPMV5\MFDPKfHPH2Ec9b1XIF5TIG80A4E2EDLj801`
+HG9cGgAYKFDj85IFAB1dJFeULgAQKG0PLgAbJFiW871bKgIYI6ET83dPH2Ec9`0:02D`=6@^9C0b
+I2hU<39T;BD`<V@j9C0bI3XU<39T06EbLVmb871QLW=YKVLPM6U]IG=dHFe`87=dLVU^Ib1P9G<W
+07UUHG8P:5UIFETY86eeLg@PHVDPJFhPM6QU879QKVMU834i=c0]<S0c=b0XKVmd82ET:@X0KFm^
+M6PP:4e=:B1]MG=d869U86U^87AXIB1bHFiWIB0a;C4b82Q^Kg@P9F@Y2P1THGTP:4A4:B1]MG=d
+869U86U^87AXIB1bHFiWIB0a;C<a82Q^Kg@P9F@Y2P1XKgEbLb0XB4PY86eeLg@PHVDPJFhPM6QU
+879QKVMU830]<S<P:6i_M20UI2T:06eYKWEdIG<P:4e=:B1]MG=d869U86U^87AXIB1bHFiWIB0`
+;CDi82Q^Kg@P9F@Y2P1cIF=_KVAc82QCDbTPKGEcM21RIB1YKR1dJ6DPLV5^IfDP<2de>B0XKVmd
+82ET:@X0A4E2EDLj801`HG9cGgAYKFDj87AYKFEOM21fHFaeIB1bIGAeLViUI20m82E\I00:06Ud
+IFeOLgAb02EXI01ULW9_LR1`HG9cJFiW86UdIFdP9F@P:60ULbLY86U^87AbHFicK65dJFm^86IY
+K6D0JFifHFaYI21fHFaeIB0X9F@Y86mV86UdIFdP9F@PJFhPM79QKW=\HGAYKfhPIVU\I@1gLVm^
+Ib1^MFeRIG8PKfHPMV5\MFEc86U^87AbHFicK65dJFm^86IYK6Dj82ET069eIVIULP1ULW9_LR1_
+L6E^JFiW86E^HfmTJFiW87AQHVaU86IYK6DPH2Ec9`1ULW9_LR1bIF5TJFiW86E^HfmTJFiW87AQ
+HVaU86IYK6D0M6m_86eQKWTPHfQQLV5SM6EbLb1YKR1UKV=_I6U^Ib1dHF9\IB1VJFaU>R0UI01^
+Kg@PIFi_MFMX86=XHG9QHgAULW<PJFhPIFiSKfAYKVLPM65RK6DPIVU\ICXP9F@0IG9bKg8PKg1U
+KVU^Ib1dLV5^LfaQM6U_KR1VJFaU860ULbL0N6adGf9eIVIULP1ULW9_LR1bIF5TJFiW87AbHFic
+K65dJFm^86IYK6D0J6EQI6Eb860ULbLPLVE`IF5dIF@PJFhPM79QKW=\HGAYKfhPIVU\I@19KWAU
+LViQK21ULW9_LR1TIGAUHgAUI21YKR0ULbPY079TGgQ\M5mVJFaU02EXI01YKWIQK6UT860ULbLP
+J6EQI6Eb87IQK7EU86U^87AbHFicK65dJFm^86IYK6Dj860ULbL0M6m_86eQKWTPHfQQLV5SM6Eb
+Lb1YKR1dLV5^LfaQM6U_KR1VJFaU>R0UI01XIF5TIG8PH2Ec9b1^Kg@PIVmeKV@PJFhPM79QKW=\
+HGAYKfhPIVU\I@1XIF5TIG8PH2Ec9b1^Kg@PIVmeKV@PJFhPM79QKW=\HGAYKfhPIVU\I@1XIF5T
+IG8PH2Ec9b1^Kg@PIVmeKV@PJFhPM79QKW=\HGAYKfhPIVU\I@1YKWIQK6UT86E^HfmTJFiW87AQ
+HVaU82dPHfQQLV5SM6Eb831h9C0bF21TMG1\JF=QM6ET07Q\M01ULW9_LR1bIF5TJFiW87AbHFic
+K65dJFm^87AQHVaU86IYK6DPH2Ec9`0:E79QKW=\HGAYKfhPM65RK6DPLfmeLV=U>R0P820P820P
+820UL`1DLV5^LfaQM6U_KR1`IG9VKg9]IF@j820P820P820P820P860ULbLPM6lPH2Ec9`1SKfid
+IGQd>R1\JFiU82E\I21_IR1VJFaU860ULbL0M6EhM3XPH2Ec9`1SKfidIGQd>R1\JFiU82E\I21_
+IR1VJFaU860ULbL0A4E2EDLj801fMUmdJFeULgAQKG0j87AYKFEOM21fHFaeIB1`LVmfJFAUI20m
+82E\I00:07AYKFEOM21fHFaeIB0l830P:2E\I2TP;B1SKfifIG9dIF@PM6lP<0X09C0dI2hU<39T
+;RD`<V@]9C0bI3XU<39T>RD`<V@084M=E014AD9EAcXP07IfGgAYKFEcM65]L3XPEUI587AYKFEc
+M65]L21cM79YKVLPLVEdMG9^87IQK7EU83dPH2Ec9`X02P1SKgE\I6hWM21QK6a_Hf5dIB0UI21R
+NGAULb1dKb1SKg1i87=dLVU^Ib1P9G<W02A9I2@02REc85]I;diM>R00ADm686AUM6ESM6ET86m^
+87=dHFiTHG9T86U^L7Ed079R06=_MFaTKRMd86EhHFeYKVDP:6m`IFhY86IYK6DPH2Ec9`14AD9E
+AcXP06EhHFeYKVEOIVU\ICXPH2Ec9b1YLb1^Kg@PHB1bIFMeK65b86IYK6D02P1SKgE\I6hWM21U
+N65]JFiU82QcM65d:B1VJFaU860ULbL0LVEQLfm^86I_LR1ULW9_LSXP9G<0LV80LW@0JFifHFaY
+I21VJFaU86e_I6DPLg1UHfUVJFET82PUI2T0IG9bKg8PKg1UKVU^Ib1VJFaU860ULbLPIVmb86U^
+L7Ed04IYK6DPH2Ec9b1UN6UcM7<^821?MVEbMg9YM6DP?`1_L6EbHGAYKfhPHf5^HfE\K6ET06IY
+K6DPH2Ec9b1UN6UcM7<0Mf80Mg@0JFifHFaYI21VJFaU86e_I6DPLg1UHfUVJFET82PUI2T0IG9b
+Kg8PKg1UKVU^Ib1VJFaU860ULbLPIVmb86meM71eM000@2<T9EhV;Elm:f5RHfAUIVMXJFY[K6e^
+Kg1aLW=dMGIgN7Uj@D93A4E6AdQ9BT]<CDi?D55BDeAEEUMHFEX`<C8c=3Df=cPi<0108b@UGRH]
+Gcd[HF9SI6EVIfQYJV]\KFi_L75bLgAeMWMhNGY1@T=4ADI7B4U:Bda=CTm@DE9CE5EFEeQIFS0a
+<S<d=CHg>3T`07=eLg1YHfU_MG<PJ6EQI6Eb86IYK6DPLg1UHb1P9G<W86=XHFiWIF@PM6lPH2Ec
+9`00G3X0G00^00XUL`1ULW9_LR1bIF5TJFiW87=dLVU^Ib1VLVm]87=dI6U^04A5@UE7>R00Lf=Q
+KUmSKFAOK6U^ICXPHfm]KF5^I21\JFiU865bIgE]IFid>R1P9G<W00X0;@14AD9EAcXP07=SHFiO
+HfeTGfaYKVDj86eQM6=XIG<PLGEQK6UVJFEb>R0P820P860ULbL02P1QKF9YIgE_MG<PLGEQK6UV
+JFEb860ULbL0MFi[KVmgKR1aMF5\JFIYIG8PH2Ec9`1aMF5\JFIYIG8PH2D^<G<ULbLPKGEcM21d
+HF]U864PMV5\MFD0;bd0MV5\MFDPKFUcLfU^Ib1QIWAULR1aMF5\JFIYIG8PH2Ec9`1aMF5\JFIY
+IG8PH2D^<G<ULbLPI6mULb1^Kg@PM65[IB1Q87IQK7EU02l]04A5@UE7>R00Lf=QKUmSKFAOK6U^
+ICXPLGEQK6UVJFEb87IQK7EU>R0P820P820PH2Ec9`0:07A_Kb1]HFii86IYK6DPKV5]IG<PLg1U
+HfUVJFET04A5@UE7>R00LfEdGfIdJFeU>R1cIGAdJFiW86IYK6DPH2Ec9b1dJFeU87A_82D^<SAc
+00X0@f5^KVmd87=UM21VJFaU860ULbLPM6U]IB1dKb0UL`1bIF5cKfhj84eC;DA?Db1TKfEc86i_
+M21cMG1`Kg9d86IYK6DPM6U]IG<PHVEVKg9U834i>30^04IYK6DPH2Ec9b1dJFeU87=UM21dKb0a
+>CP`;S0a;S0a;C0`>S0`>S0`84M=E01ULW9_LR1cIGAdJFiW86IYK6DPH2Ec9b1dJFeU87A_82D^
+<SAc04U^M6EbKV5\86EbLVmb86AUM6ESM6ET86U^82Ec:2T0LfEdGg1YL6EOKFmTI@1ULW9_LR1c
+IGAdJFiW86e_I6DPKfHPIVU\IB1P9G<W03YL05AJ05AJ?@17CE@`@U=D~282d]800:Ed5BCTU>
+AcXP00Y5DU9?DSXP00Y6@EA1C3XP04U^M6EbKV5\86EbLVmb86AUM6ESM6ET86U^82Ec:2T0MG=U
+LUm]IG=cHFMU02Ec9G<:02Ec9G<:06meM71eM21bIF=_LV@PM6m_86a_KVLP:2E\I21RNGAULb`P
+KF5h83dP9FaT:B0]87AbMFiSHGAUI01ULW9_LR1_L6E^JFiW86IYK6DPH2Ec9`1ULW9_LR1cIGAd
+JFiW86IYK6DPH2Ec9b1dJFeU87A_82D^<SAc06EbLVmb86=\Kg=YKVLPIVU\IB1P9G<W~5820P
+820P820P8B4Q8B4P820P820P820P820P820P8201@410@410@410@410@4100P820P820P820T10
+@410@40D51@D51@410@410@410@410@410@410@41410@410@1PH61PH60P820P820P820P820P8
+20P820P8@410@200~~~b\FBaI;5T~22@80~9lS8000X20@00~70S<000820P00~74S<004<20`00
+~78S<004821000~7<S<0~~~~~~~55001H09P0V04X0:P~O@?oo~54`8210D620P851D54olF1A42
+ooooooooooooooooo`D5ooooooooooooooooooooo`oo8`;o3ooooolCool20PD?0_oooa?ooooo
+ooooob?ooooo8olCo`1DCE00;R@T900000820P820P820@410@420P820P820P820P820P820P81
+0P820P<20P8210820P821@D51@D51@D51@820P820P820P872QD:30T20P\250h20P820PP20Q82
+0Q0240820P821PL:2PX<2@823@8A3Q<20Pl220824P820P820P8042Q^MFa\:@0051@151DD51@D
+0P0D0`@D2@D51@D51@D51A@D51@D51@D51@D3aL?21@D50LD5Q@D51@D51@D50dD51@D51@D51@D
+40X?3`l82Q@D1Q@B2`hD514D31@D3A@D51@D51@0L79YKW@PLf=QKVHP>R1VK6mQM6U^Ib1`KfU^
+M21VKg9]HGAc86i_M21\JFi[IF@=2P00~E7a`O7QlN7alN7ahO~27`0k05X0N02G0;D0e03c0141
+<05>0FhfLSIf=WXfOSJ2=XHfRSJA=YPfX3JZ=[<f^SK3=\LfbcK?=]<fecKK=]lfhcKW=^\fkcKc
+=_\f13L:=a0g53LI=ahg9CL_=cLg@3M9=d`gDgE^04e_KP1DMFD0EfET05AXM@16LVT0Df5d05=e
+KVAQN@1=KfiTHGT0E7EULfAQN@1GIFA^IG=THGT0E6QeLW=THGT0AW9YI65i05=QM7EbI65i04YQ
+KP16IF80CF5b045`LP1=HGT0BWE^04YeK011MFL0DfE`04mSM01>KgH0A6ES04YQKWEQLWT0AVER
+LWEQLWT0CF5bHfP0@G1bJF`0CF5i04YeKVD0BWE\N@11MFMeLg@0DfE`M6E]HVEb04mSM6mRIG80
+CVmfIFeRIG80A6ESIFeRIG80@Dd0D4d09G<P9G<P9C0bI20U<39T>RD`<V@j9C0bI20U=6@0<300
+800P02`P03X`03X`02D00<`ge3O\=`Hh5CPY>3\hBcQP>78hScRS>;8haSP00=<hhSP8>APi9STg
+>DPiFST0~CK3Uj>H\i\STU04EbLVmb8300BFifHFaYI21VMFiSM6U_KR1^MFeRIG80CVlPLgES
+J21VJFaU86mb86AYLVESM6mbN@1@HGAX86i_M21VKgE^I01DKflPKF5^NB1_L6E^86IYK6Ec051U
+LVeYLg=YKfhPI6E^JFET049QI21VJFaU86ieKF9ULP1=IFe_LWTPHG9UKV4PM79QLfQUI01>Kg@P
+IFi_MFMX86eUKFmbN@19KWIQK6UT86eUKFmbNB1RK6mSJb1QI6AbIG=c04U^MV5\JF@PIFifJG9_
+KVeUKW@0BFifHFaYI21VKg9]HG@0BFifHFaYI21QHf=ULg<PHfmTI@19KWIQK6UT86AQM640CVlP
+LgESJ21TIGIYHfD0@GAdIFe`M6ET87A_879UKFmfIB1SMG9bIFid86AYLVESM6mbN@1>Kg@PLf5]
+IB1TIGIYHfD0CVlPKFmbIB1VJFaUL`19KWIQK6UT865bIgE]IFid045bIb1\JG=d87A_Kb1RJFL0
+AGQUHb1VKg9]HG@PIG9bKg80@g9_Lg<]I6EfJF=U86aYKV\0CF5dJ21QLVMeKFE^M01BIG=eK7@P
+M6m_86aQLVMU04IYK6DPHFabIF5TNB1UN6UcM7=6JFaU865\LVEQI7TPIGQYLgAc051_Lg=YHVaU
+86AUHFA\Kf=[05E^Jfi_MfhPIG9bKg809G<j82Ec2P0=~5G2l^05E^Jfi_MfhPIG9bKg809G<j
+82Ec2P0UL`X07a`O7QlN7alN7ahO~27`0k05X0N02G0;D0e03c0141<05>0Fd18THNAU16~20@1D
+FP15De@0ADAD~2VGFNMIieWWD00]5^~346Qh~347Ui~37PbL~~~~~~~~~~~~~~~~~~~~~~~~~~
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Xne8@0j`J~2UP9e0J80
+:`A30@@0~2\01I1`@01004093X~60@00~38000~;[0HQJ000~>0@0005`1~30P0006l1~30`00
+09L1~310000>`1~31@0007P2~31P0008d2~31`0008l2~320260942~260T0Q@0g0`0060X0Q005
+2P0060\0P`0E300060`0PP113`0060d0P@0f500060h0P0245@0060l0O`285P006100OP2Z6000
+6140O@3o6@006180O03L6`0061<0N`2n7P0061@0NP2e800061D0N@178@0061H0N02T8P0061L0
+M`318`0061P0MP1O900061T0M@0=9@0061X0M03T9@0061\0L`0Y9`0061`0LP3<9`0061d0L@0Z
+:`0061h0Q`3j;00061l0`P3i;@006200`@2J;P006240`00`;`006280_`34;`0062<0_P27<000
+62@0_@14<@0062D0_03J<@0062H0^`2V<`0062L0^P1I=00062P0^@1;=@0062T04`46=P0062X0
+4P6D=P0062\04@4b=`0062`04064=`0062d03`5N>00062h03P4W>@0062l03@6H>P006300304o
+>`0063402`5O?00063802P7H?00063<02@6F?@0063@0206@?`0063D01`7R@00063H01P5[@@00
+63L01@4Q@`0063P0106^A00063T00`5<AP0063X00P7]B@0063\00@5]BP0063`0004OB`0063d0
+o`2JB`0063h0oP3>B`0063l0o@1GC0006400o02\C0006440n`0jC@006480nP1lC@0064<0n@37
+C@0064@0n004CP0064D0m`1bD00064H0mP3DD00064L0L`4SD@0064P0LP6WD@0064T0L@4cDP00
+64X0L06>D`0064\0K`75D`0064`0KP5@E00064d0K@4QE@0064h0K057E@0064l0J`6BE@006500
+JP7>E@006540J@7@EP006580J067E`0065<0I`7dE`0065@0IP5iF00065D0I@7PF00065H0I05N
+F@0065L0H`6?G00065P0HP6MG@0065T0H@4cGP0065X0H04dG`0065\0G`6YG`0065`0GP6cH000
+65d0G@7cH00065h0G053H@0065l0~2EF<0~2H00007US~3H@0009IS~3HP000;5S~3H`000<AS
+~3I0000=]S~3I@1?0OmT~3IP0000iU~3I`00021U~3J00002iU~3J@0003YU~3JP0004eU~3J`3L
+061U~3K00006=U~3K@0006=U~3KP0006MU~3K`0006YU~3L00006YU~3L@3L06mU~3LP00079U
+~3L`00079U~3M00007MU~3M@0007YU~3MP0007YU~3M`0`00iV~3N000015V~3N@00015V~3NP0`
+02mV~3N`00039V~3O000039V~3O@00051V~3OP0008UV~3O`0e0I]V~3P0000:aV~3P@0002UW
+~3PP0004IW~3P`0006mW~3Q0000:YW~3Q@3L0>]W~3QP00009X~3Q`0001iX~3R00004]X~3R@00
+00]]~3RP0008Y^~3R`0009e^~3S00c0K1^~3S@000=5^~3SP0006i_~3S`3W0:1_~3T0000>M_
+~3T@140Oe_~3TP0002U`~3T`0005M`~3U00000Ee~3U@0002Ye~3UP0004ae~3U`0007ee~3V000
+08Ue~3V@000;Qe~3VP1>0Mme~3V`3^0:if~3W01W00Eh~3W@0005Ih~3WP0005Yh~3W`0005ih
+~3X000069h~3X@0a0N9i~3XP000>9i~3X`000>9i~3Y00g0OAi~3Y@0002Ej~3YP0009Ej~3Y`00
+0:5j~3Z00f0Kaj~3Z@000>9j~3ZP0001Qm~3Z`110Bim~3[00005mm~3[@120H9m~3[P0002=o
+~3[`0007Qo~3\00001n3~3\@3d09J3~3\P1J0@^4~3\`1H0HR4~3]0000>R4~3]@000=B5~3]P00
+06R6~3]`1G0I>6~3^01F0K:6~3^@1D0I^7~3^P0004>8~3^`000:N8~3_00000f9~3_@1C0Hf:
+~3_P1@0EN;~3_`1I0FR;~3`00006R;~3`@0001><~3`P0001b<~3``1=0I^<~3a0000?Z<~3a@00
+01V=~3aP0003n=~3a`0005V=~3b0000::=~3b@0d0NJ=~3bP0003:?~3b`0007n?~3c0000;F?
+~3c@1E0Lb?~3cP000?6@~3c`0000:A~3d01<0I>B~3d@0005JC~3dP1^01jD~3d`0b0CbD~3e000
+08^D~3e@1B0G^E~3eP0009RE~3e`3a0=nE~3f0000?fE~3f@130AZF~3fP1;0DJG~3f`1:0GnG
+~3g0190JjG~3g@000=2G~3gP0005FH~3g`1A0FBH~3h0180G:H~3h@170HbH~3hP160M2H~3h`00
+0?bH~3i00002NI~3i@0003jJ~3iP100@bL~3i`0007^M~3j00005ZN~3j@0005jO~3jP0009RO
+~3j`000;jO~3k000~3oPT0k@0007@0oPT0kP0007P0oPT0k`0007`0oPT0l0000800oPT0l@00
+08@0oPT0lP0008H0oPT0l`0008P0oPT0m00008X0oPT0m@0008`0oPT0mP0008h0oPT0m`000900
+oPT0n0000980oPT0n@000980oPT0nP000980oPT0n`0009<0oPT0o00409@0oPT0o@0009H0oPT0
+oP0009X0oPT0o`0a0I`0oPT0004009h0oPT00@400:80oPT00P400:H0oPT00`6;01D1oPT0106:
+01\1oPT01@6902D1oPT01P6807l1oPT01`400>PaoPT020550NXaoPT02@400>`boPT02P400>hb
+oPT02`400?0boPT0305K0O8boPT03@40038doPT03P4003@doPT03`4005`doPT0404005hdoPT0
+4@40060doPT04P40068doPT04`4006@doPT0504004PeoPT05@400>@eoPT05P400>HeoPT05`40
+0>PeoPT060400>XeoPT06@400>`eoPT06P400?PeoPT06`40080goPT070400<XgoPT07@4000Xj
+oPT07P4002@joPT07`4602PjoPT0804002`joPT08@4003XjoPT08P4003`joPT08`4J05XjoPT0
+904J05`joPT09@4J05hjoPT09P4J060joPT09`44068joPT0:04406@joPT0:@4206HjoPT0:P46
+06LjoPT0:`4406\joPT0;04406djoPT0;@4606ljoPT0;P4407<joPT0;`4607DjoPT0<04M07Tj
+oPT0<@4M0>TjoPT0<P4M05TkoPT0<`4J0<TkoPT0=04J0<\koPT0=@4J0<dkoPT0=P4J0<lkoPT0
+=`6<0=4koPT0>04M0=DmoPT0>@6>04DnoPT0>P6?08HnoPT0>`4208Q0oPT0?04408U0oPT0?@6@
+08]0oPT0?P400?i4oPT0?`4`~51D01~61D41~61D81~2300000E30@00010000E60A`0300000Y7
+0A\02P0000Y80A\0200000Y90AP01P0000Y:0AP0100000Y;0@80ool0009<0Ad0S_l0009:0AP0
+1P0000a90AP01P0000Y80A\0200000Y70A\02P0000Y60A`01`0000a=0B80`_l0009>0@H0h_l0
+009?0AX0i_l0009@0@H0j?l0009A0@@0k?l0009B0AX0k_l0009C0@@0l?l0009D0AX01P0000AE
+0@@0l_l0009F0@@0m?l0009G0@X0m_l0009H0@@0n?l0009I0@H0n_l0009J0@X01`0000AK0@@0
+o_l0009B0AX0200000YD0A\01P0000YK0@@0100000YH0@@01P0000AL0@@0m?l0009M0@@0m_l0
+009N0@@0n?l0009O0@@0n_l0009P0@@0o?l0009Q0@@01`0000AR0@@0o_l0009K0@@0100000YD
+0A\01P0000YB0AX0200000YS0A`01P0000YT0@@0100000YU0@@0n?l0009V0@H0n_l0009E0@@0
+o_l0009W0AX01`0000AT0@@0100000YS0A`01P0000a60Ad0S_l0009;0@80ool0009X0AX01P00
+00AS0A`01P0000YY0AP0100000YY0AP01`0000aS0A`01P0000aS0A`01P0000YT0@@0100000YZ
+0B<0^?l0009[0B@0n_l0009T0@@01`0000aS0A`01P0000a\0A`02P0000Y]0A\0200000Y^0@@0
+1P0000Y_0AP0100000Y`0AX0n_l0009a0AX0o?l0009b0AX0o_l0009_0AP01`0000a^0@@01P00
+00Y]0A\0200000Y\0A`01P0000aS0A`0200000Yc0BD01P0000Yd0A\0100000Ye0@@0o?l0009f
+0@@01P0000Ag0AX01`0000Ah0BL0n_d0009W0AX0o_l0009d0A\0100000Yc0BD01P0000YS0A`0
+200000Y60A`02P0000Y<0A`0200000Y70A\01P0000Y80A\0100000Yi0@80nOl0009j0BP0l?L0
+009k0BT0l_T0009l0BX0m?\0009e0@@0n_l0009m0AX01`0000An0@H0o?l0009o0B\0m_d00098
+0A\0100000Y70A\01P0000Y<0A`01P0000a60A`02P0000Z00BD0200000YS0A`01P0000Z10@@0
+100000YE0@@0o_l0009W0AX01`0000B10@@0100000YS0A`01P0000b00BD0200000Z00BD02P00
+00Z20A`0200000YS0A`01P0000Z10@@0100000Y;0@@0n_l000:30@@0o?l0009E0@@01P0000AW
+0AX0o_l000:10@@0100000YS0A`01P0000Z20A`0200000Z00BD01`0000b40Bd0300000Z50Bd0
+2P0000Z10B`0200000Z60AP01P0000Z70AP0100000Z70AP0100000Z60AP01P0000Z10B`01P00
+00b50Bd01`0000b40Bd0300000Z80AX0200000Z90@@01P0000Z:0AP0100000Y;0@@0o_l000:;
+0Ad0S_l000::0AP01`0000b90@@01P0000Z80AX01P0000a\0A`0300000Z<0Bl02P0000Z=0A\0
+200000Z20Bh01P0000Z>0AP0100000Z?0@@0o_l000:>0AP0100000Z20Bh01`0000b=0A\02000
+00Z<0Bl02P0000Y\0A`01P0000a<0A`01P0000Y90AP0100000Yg0AX01P0000A90AP01`0000a<
+0A`01P0000Y\0A`02P0000Z@0Bl0200000Z20Bh01P0000ZA0AP0100000ZB0@@0o_l000:A0AP0
+100000Z20Bh01`0000b@0Bl0200000Y\0A`01P0000bC0AX0200000Y\0Bh01P0000ZD0AP01000
+00Y;0@@0o?l000:E0@@0o_l000:D0AP01`0000a\0Bh01P0000ZC0AX01P0000a\0A`0200000Z2
+0Bh01P0000ZF0AP0100000ZG0@H0o?l000:F0AP0100000Z20Bh01`0000a\0A`01P0000a\0A`0
+200000Z20Bh01P0000ZH0AP0100000ZI0@H0o?l000:H0AP0100000Z20Bh01`0000a\0A`01P00
+00bJ0@H0l_l000:K0@H0m_l000:L0@H0n_l000:M0@80ool000:N0A\0100000ZN0A\0100000ZO
+0Bl01P0000ZP0@@0100000ZQ0@X01P0000BP0@@0100000ZO0Bl01P0000ZV0H`0~41ZL17@00
+~31ZP19P00~31ZT16@00~31ZX11P00~31Z\11000~31Z`13000~31Zd12P00~31Zh12000~31Zl1
+2000~31[010P00~31[411P00~31[811P00~31[<10P00~31[@11000~31[D18000~31[H11P00
+~31[L12P00~31ZD1TP2Z0?h90:@1T@2_0?h90:<16@090Oh90:816@0?0Oh906<1U`0<~32]H1
+U00:~32]L1T`08~32V@11006~32W@1T`04~32WD1103lo`000]P1103no`000]T1W@3jo@000W@1
+T`06~336@11006~32]L1T`08~32]H1U007~336<1U`0<~32]X1WP06~32]\1U004~32]\1U007
+~33=X1WP06~33=`1W`06~32]d1U004~32WD1103no`000]d1U006~33=`1W`07~33881U`08~3
+2]h1X006~32]l1U004~32^01103no`000]l1U006~33=h1X006~32X81U`07~33881U`08~32Y01
+X006~32^41U004~32^81103no`000^41U006~33901X006~32X81U`07~33><1WP06~32^@1U004
+~32^@1U007~33><1WP06~33881U`06~32^D1U004~32T\1103lo`000^H1X@3hn`000^L1XP3j
+o@000^P1103no`000^D1U006~33881U`07~33881U`06~32^T1U004~32^X11P3lo`000^T1U006
+~33881U`07~33=L1WP0<~32W<1Y00:~32X411008~32V<1X`06~32W@1T`04~32WD1103lo`00
+0^\1UP3no`000W@1T`04~32V<1X`06~32X411008~32W<1Y007~33=L1WP06~33>`1Y@0>~32V<1
+U`0<~32Wl1UP0:~32XD1T`08~32^d11P04~32^h1103ho`000T\11P3jo`000^l1UP3no`000^d1
+1P04~32XD1T`07~337l1UP06~336<1U`0<~32^`1Y@0>~32ZL1V000~31ZP1U@00~31ZX11P00
+~31Z\11000~31Z`13000~31Zd12P00~31Zh12000~31Zl12000~31[010P00~31[411P00~31[81
+1P00~31[<10P00~31[@11000~31[D1V`00~31[H11P00~31[L12P00~31ZD1``146_h90?<1a006
+~32_@12P04~32VL1a@3no`000_D12P06~31?@12P04~32_<1a007~337<1c008~32W@1a006~3
+2V<1aP04~32WD1103no`000_H1a@07~316<1aP04~32W@1a006~32W<1c006~33?L1cP04~32T\1
+103no`000_L1cP06~338`1d@06~32_P1c`04~32^011007~31?P1c`06~338`1d@06~32Y01d@06
+~32_T1c`04~32^811007~31?T1c`06~33901d@06~32V<1aP06~32_X1c`04~32T\1103jo`00
+0_\11P3lo`000_X1c`06~336<1aP07~33?`1c`04~32YT11P3lo`000_`1c`06~33?d1dP08~3
+2W@1a006~32V<1aP04~32UD11006~31?h1103lo`000_l1103no`000V<1aP04~32W@1a007~3
+3?d1dP08~32P02d`0:~32P423006~32P821004~32P<2303lo`000P@22P06~315X12P01~31082
+1004~32P423006~32P02d`0:~32PD2100:~32PH21008~32PL2a006~32PP2d@04~32PT21007
+~31?l1103no`000PX21006~310P2d@04~32PL2a006~32PH21008~32PD2100:~32P`2e004~3
+2X<1103fo`000Pd21P3ho`000Ph21P3lo`000P`2e007~330l2cP0:~32Vh11008~32VP1a006
+~32Q02c`04~32Q02c`07~336P1a006~32Vh11008~32Pl2cP06~337<1c008~32W@1a006~32V<1
+aP04~32WD1103no`000WP1a@07~316<1aP04~32W@1a006~32W<1c006~33142a004~32Q82e@3Z
+o`000Q<21P3lo`000Q@21007~31142a006~331D21008~32QH2eP06~32QL2a004~32T\10P3e
+o`000QP2a@3fo`000QT2a@3ho`000QX22P3jo`000Q\21007~311`2a@3lo`000WD1103no`00
+0Qd2a@06~311L2a004~32QH2eP06~32QD21008~32XP1a@08~32XT11006~32X\1cP04~32Qh2
+1P3fo`000Ql20P3ko`000WH1103lo`000R02a@3no`000Wl1a@07~318\1cP06~338T11006~3
+2XP1a@08~32QH2eP08~32TH1cP06~32R42c004~32QL2a@3\o`000QD2103^o`000Ql20P3ao`00
+0UD1103bo`000WD1103do`000R02a@3fo`000Wd1a@3ho`000WH1103jo`000Wh11P3lo`000Wl1
+f@3Zo@000R42c006~334H1cP07~331H2eP08~32R82fP0:~32R<21008~32XP1a006~32XT11004
+~32X<11006~318T11004~32XP1a007~332<21008~32R82fP0:~32R42c008~32R@2eP06~32TH1
+cP04~32T\1103no`000TH1cP07~332@2eP06~33242c008~32RD2a006~32RH2aP04~32RH2aP06
+~332D2a007~332L21006~32RP2a004~32X<11002~312P2a001~332L21006~32RT2a006~32RX2
+a004~32R\2103lo`000R`2103no`000X<11006~312X2a007~332T2a006~32^d11008~32RT2
+a006~32RX2a004~32X<11002~312X2a001~332T2a006~33>d11008~32^d11008~32RT2a006
+~32RX2a004~32R\2103lo`000R`2103no`000X<11006~312X2a007~332T2a006~32^d11008
+~32RL21006~32RP2a004~32Rd2103no`000X<11006~312P2a007~332L21006~32Rh2a006~3
+2RP2a004~32Rd2103no`000X<11006~312P2a007~332h2a006~32Rh2a006~32RP2a004~32UX1
+1006~312P2a007~332h2a006~32Q<21P04~32Rl21P3To`000S021P3Xo`000S421P3\o`000S82
+1P3`o`000S<21P3do`000S@2103ho`000SD2103jo`000SH2103lo`000SL2103no`000SP21007
+~313T21006~311<21P04~32SX2f`2<A?h902P2a004~32S\22P3no`000WL1a@07~312P2a006
+~332P2a@04~32Rd2103no`000S`2a@07~312P2a@06~33:H1e`00~31ZL1a`00~31ZP1c@00~3
+1ZT1d000~31ZX11P00~31Z\11000~31Z`13000~31Zd12P00~31Zh12000~31Zl12000~31[01
+0P00~31[411P00~31[811P00~31[<10P00~31[@11000~31[D1bP00~31[H11P00~31[L12P00
+~31P\2e@00~31jD15@5\7oh903d2505a7oh904X25`48~32T\25P46~32T`25P44~32Td2606\
+o`000Th22P3^o`000Tl26@7`o`000U026P7fo`000T`25P46~334\25P47~334X25`48~32U42
+5P44~32U821006~315425P44~32U<26`44~32UD28@7Lo@000X<1103jo`000UH22P3lo`000UL2
+2P07~317h12P3no`000UP28P7jo@000U<26`46~336<16`44~32[d17P47~316<16`46~336`1
+6`46~32UT21004~32[d17P47~315T21004~32V`16`46~33;`15P44~32[`15P44~32TX25`46
+~32UX25P44~32Td28`6do`000U02907fo`000UX25P46~334X25`47~335<29@44~32T\1103l
+o`000U\2103no`000U<29@46~335`25P44~32WL15`46~315h25`7^o`000Ul29`7`o`000V02
+:07fo`000U`25P47~335d29P6\A?h904X25`4<~32V425P4:~32Tl25P48~32U025P46~32Td2
+5P44~32WL15`7lo`000V82103no`000Td25P44~32U025P46~32Tl25P46~336425P4:~32TX2
+5`47~336<25`48~32V@21006~32U425P44~32T\15`46~315425P44~32V@21006~32V<25`47
+~336<16`4:~32Wl15`48~32VD21P04~32VH2103jo`000UX11P3lo`000VD21P04~32Wl15`48
+~32V<16`46~336<16`4:~32Wl15`48~32VD21P04~32WL15`7no`000VD21P04~32Wl15`47~3
+36<16`46~336<16`4:~32Wl15`48~32VD21P04~32Wh11P3lo`000VD21P04~32Wl15`47~336<1
+6`46~336L2:P4@~32VP2:P4>~32VT2:P4<~32VX25P4:~32V\25P48~32V`2:@46~32Vd21004
+~32Vh25`7bo`000Vl25`7do`000W025`7fo`000W42103ho`000W821007~31682103jo`000W<2
+103lo`000W@25`7no`000Vd21004~32V`2:@46~32V\25P48~32VX25P4:~32VT2:P46~336P2
+:P4>~32VL2:P4@~32_L16`44~32WD2;047~314\1103no`000_L16`46~33?L16`44~32T\1103n
+o`000U\21007~31?L16`46~336425`4<~32Tl25`4:~32U025`48~32Td25`46~32TX25P44~3
+2WH22P3jo`000UX1103lo`000WL15`7no`000WL25`46~317P2;P6Xo`000TX25P44~32Td25`47
+~335025`48~32Tl25`4:~32V425`4<~32WT21P04~32WX2;`7No`000W\25`7no`000P\2;046
+~317T21P04~32Pl26`48~32W`25P46~32T\11004~32Wd25`7lo`000Wh2103no`000Wl21006
+~314\11004~32W`25P46~32Pl26`47~336`16`4:~32Wl15P48~32VD21P04~32UX11P3lo`00
+0VD21P04~32Wl15P48~32V`16`46~336`16`4:~32Wl15P48~32VD21P04~32S\21P3lo`000VD2
+1P04~32Wl15P48~32V`16`46~338021P06~32[`15`44~32WD2;046~31882<07ho`000T\1103l
+o`000X<2103no`000[`15`47~338021P06~32ZL17040~31ZT1:`40~31ZX11P00~31Z\11000
+~31Z`13000~31Zd12P00~31Zh12000~31Zl12000~31[010P00~31[411P00~31[811P00~31[<1
+0P00~31[@11000~31[D17`40~31[H11P00~31[L12P00~31X42<040~31`\2;@40~31e@28@40
+~31h@2M07BH@006:D1M@7::oh904D10@T80QH00@0100400@3E0@49K08A00800@020040lP41
+2EP35@0300400`0104T20@TG11D0100100@00@3C0FZ_Fa[`0GB_FaY70WZ_FaZF0S6_FaZo0942
+e`2X0]T0[P;R0;L2i@350_00b@;b0=P2m03N0_D0l0;g0?@2o`0H0`01;0<10C43I@4g0h01B0>2
+0G03S`6L0i01YP>A0KD3TP6j0i\1`0>L0L03WP7O0j01h`>R0Nh3YP7g0jP12@BY0AD4ZP4H1;<1
+6`Bd0G04]P5a1;P1M`Bi0IX4^P6T1<<1Y`C50K04a`6`1<T1c`C;0M<4c07U1<d1l@C>0O@4e`7g
+1=T12@GR0AT5h`551N\1B0G^0Dl5k`5c1O01O@Gb0H05l`6G1OD1\`Gf0KL5n@701OX1i`Gk0O45
+o`7d1@028@H10Rh62@8a1PX2@`H;0Td65@9@1QL2H`HI0VX6709e1Ql2O`HP0ZP68@:b1RT2]@Hc
+0[l6=0;51SP2c@Hi0\d6>P;M1S\2h0Hl0^H6=P;\1Sl2lPI10_H6BP8a1d`2>0M>0S`7C`8l1e@2
+EPME0VT7EP9e1f<2N0MU0X47IP:C1fL2Z@M^0[X7L@;F1g82o0Mc0PH8O`8928427PR20Qh8P`8\
+28H2<PR70UP8R@9K28\2I`RJ0Y`8V`:R29`2Z0RM0ZP8WP:h29l2^`RP0\H8ZP;;2:\2b`R\0]\8
+[@;N2:h2i0RX0^X8\@;`2;82m@Rc0P49_`872L<23`W40Pl9a@8O2LH28PW70RP9`@8^2LT2=0WC
+0Sh9e@9B2ML2EPWP0Y49hP:H2N@2W0WU0Y`9kP:f2O02_@Wd0\l9mP;R2OL2i`Wk0_P9o0;o2AX3
+1@Xb0aH:=0<H2SH38@Xg0h8:>0?T2ST3mPXj0oh:?@?o2Sl320]00fd;@@=o2d83R0]50hT;A`>?
+2dP3m0]90`4<BP<:34`32`a=0`l<K`<E3843:@b30bl<Q0=C38H3EPb70e\<SP=W38l3I`bB0h<<
+VP>:3:43U`bT0id<Y@?03:H3c0bW0ll<Z`?A3:d30`fe0cT=^@==3KX3O@fk0h@=_0>>3L<3UPg4
+0kX=b0>m3LT3h0g:0nT=c0?\3MD3kPgF0`0>e`<93]P330kR0`l>i@<W3^H3FPkW0el>j0=X3^T3
+K@kb0gL>n`>63_d3S0kn0h`>0@BS3P84c0h41<h>3@C@3Pl4g@hA1>\>4`C_3Q@40@lE10X?5`@=
+3aP46PlJ11`?6`@L3ad4>`lk144?B@AA3dX4G@mA16<?DPA`3e<4O`mD17l?F`BC3ed4VPmN1:0?
+H0BR3f84Z@mS1:l?IPBa3fh4]`m_1;L?M`C:3gP4mPmj11X@N`A:4884KQ2317`@Q0Al48\4UQ2B
+1:P@V@Bb49X4\Q2L1;l@X0C64:44kQ2Y1?4@ZPCf4:\4216\11XA[@@W4Jh4=16a13HA\P@l4K<4
+@A6d14LA]@A=4KH4FA6g16DA^@Aa4KX4LA6k17hA_@B;4L@4[a751<4AaPC14Ld4ea7>1=dAd0CS
+4M84na7E1?\Ae`@H4]T47Q;M12lBi`A14^T4EA;\16HBk@B>4_04\Q;c1<<Bm0C[4_H43a?i114C
+n`@R4o`4AQ<61FXC1`F04`P5P1<91IXC2PF\4`\5_Q<B1M0C6@GV4aX5o1<K1@PD70DD51d581@N
+1B`D7`Da53d5=QA;1DXDC@E@55D5MaAF1G`DE`F155P5QQAI1I0DH0FJ5685ZQAS1K@DI0Fi56D5
+_AAX1KlDL0G857@5eQAe1@HEO@D>5Gl551F01CDER0Dh5H\5AaF<1GLES@Ek5Hl5P1F]1H@E^0FK
+5KT5ZQFk1K@E_PFn5Kl5h1G01N0E`@G_5LT5oQG:1BhFc0Df5\h5?1K?1EdFdPEP5]<5PQH01XPF
+4@JO5Q86Y1HC1[@F50K45Q\6e1HM1]dF7`K]5R06lAHQ1_\F8PH05b\60QL^1P\G<0HB5c468QLb
+1R8G<`Hg5cP6A1Li1W@G>`J05d<6PQM51XTGAPJG5dL6aaM81]<GD@KE5eT6o1MK1P8HG0HS65h6
+9QQV1TLHJ@IF66X6QQQ[1XXHKPJ?66l6UQQ`1YdHL@JT68l6ZQRT1[`HY@K36:H6dQR]1^LH[`K]
+6;06mQRb1P4I]0H66KD64AVi1Q<I^PHd6K\6?aVm1T@I`0I66LX6BAW;1U0Ic0I@6Lh6KaW@1WDI
+d@J76M86TQWK1YLIg@J\6Ml6[QWQ1[\Ih`K06N@6bAWX1\\Il`KE6OH6gaWj1^HIn`K]6O`6laWm
+1_TI7POo6CH751Xg1aTJ>0LN6ST7:1Xj1c8J@@Ll6T<7A1Y61dXJA`M[6Tl7KQYC1gDJE0Mm6UH7
+UQYH1j@JFPN^6U`7\AYM1l<JGPO<6Ul7caYW1m8JJ0OF6VX7iQY\1nXJKPO]6W07mQYb1`<KNPL6
+6g\71Q]m1bLKO`L]6h07?a^11dXKQPM<6hd7T1^>1i0KT0Nb6i47_a]A1l<KU0O<6iD7dA^F1mHK
+]0OL6lL7l1_81o0Kc0L<7<h741cA1aXLf0Lf7=T7B1cJ1e4Lf`MD7>@7Eac[1fDLk@M[7?h7NQco
+1jPL00R_7048\Q`32;@L30Rf70l8bA`A2<`L50SO71D83QdF21DM60PH7AT861dJ23HM70Pi7BD8
+CQdX264M:@R@7BX8Uad\29XM;@R`7CH8\adg2;<M>@S;7C\8cadl2>4M?@SZ7Cl8kAe32?0MA0PO
+7TD89Qi;22PNC@PZ7Th8DAi@25<ND@QC7U<8LQia2;hNP`SB7XD8fQj62=XNR0Si7XX8oaj<208O
+T`PA7iD86AnH21lOV@Q:7i`8CAnM26DOWPQU7j08QAnS29`OY0S77jD8dQnW2=lO[`SR7k88jQne
+2?0O]PPK8;T87R2j23HP^`Pf8;d8ER3025`P`@R78<88TR3429lPc@RQ8=08[b3^2;DP1@W980L9
+dR082MHP2@WJ80X9hB0;2O<P30We80h9oR0?2@8Q40T68A493B4E2AHQ5PTJ8AL9924H2C4Q6PU3
+8CP9Ab5;2EhQC@UT8EH9L25I2H4QF`VC8Eh9VB5O2KdQH@W08FT9`R5[2LTQK0WF8Fd9h25g2N8Q
+NPWf8G\90b9l2@dROPT?8Wl972:32B4RQ0T^8Xh9<b:?2ELRT0Uh8Y89WR:o2J@Re@Vk8]h9bB;P
+2LlRh@WE8^X9f2;]2NPRkPT;8nl97B?`2AdSl@T^8o\9<2?l2C0SoPU68`P:Bb<92T\S4@YL8a`:
+L2<^2W8S@0Yd8d\:MR=<2WHSC@Z78eL:RB=J2XlSG0Zk8gX:`B>:2]8SS0[H8iD:hb>H2_<SV`[g
+8j8:nB>T2P`TYPXF9:P:8bBb2RHT\`XV9;D:BBBh2ULT^@YK9>4:GbCe2WHTm`Z49?T:RRCj2Y0T
+o0ZB9?h:V2Co2YhT0P^P90`;YB@@2k<T4P^e91<;f2@F2m\T5`\79CD;3BE72b@UB@\Z9D\;F2E=
+2f4UCP]V9E4;J2EC2fdUEP]_9EL;M2EI2hPUF`^K9E`;XbEP2jHUHP^]9FD;]REX2mhUS`_T9J4;
+nbFS2`XVY@\F9ZH;8RJX2b@VZP\`9Z\;?2J^2chV^P]89[`;E2Jo2eLV`@]M9\8;GBK52gXVaP^P
+9\P;XbK;2jDVc@^[9\h;ZbKA2lPVdP_^9]d;lBKP2odVhP\S9`P<:BLJ340W70a=9ah<FRLO36HW
+8@aX9b<<MBLT384W9`b39bl<SBLb39XW=0c69e8<c2ML3=\WG@c_9eh<oRMV31@XJ0`S:70<:bQi
+34LXNPa;:7\<BbQm36lXOPb::80<XBR13;LXP`c4:8D<d2R63>DXR0`9:HX<3BV=31DYSP`m:ID<
+HBVG36\YVPan:I\<YRVO3:PYX@c@:J@<eRVY3>DY[0`=:[0<3bZh33LZ^Pa1:[d<E2[237LZa0bO
+:\H<ab[:3<TZd`ca:]D<1b_M30l[g``N:n4<9R_o32X[2`df:``==R\=3E0[3PeQ:`l=HB\@3Fh[
+60ek:aT=Nb\Q3I4[8PfA:bT=Zb\k3J\[APgQ:dL=hB]83OL[B@gg:dX=4Ba;3A4\C0d[;4h=:ba?
+3DD\D0e5;5L=FbaH3E\\F@ee;5X=MBaK3Hl\G0f?;6<=ZBaT3JT\I@g3;6H=`baW3MT\J0gI;6X=
+kba[3OD\K0gh;8X=nRbI3@L]VPd=;I\=42fM3AP]W`dO;J0=7bfQ3Bh]XPdd;JD==bf\3FX][@ej
+;K@=RRfe3HX]a0fZ;LH=\Bg?3KT]d@g0;M<=abgD3L`]ePgB;Mh=ebgP3Mh]h`gV;N@=jBgV3N`]
+i`g_;NP=lRgZ3OH]N03i;H\04BjH01l^VP0f;Y`0?2jM05h^WP1W;Z00JRjW07<^Z@2<;Z\0T2j\
+09@^bP2J;]T0[RkK0;@^g02n;]d0d2kN0>8^h`01;n@02RoV02`_104`;aD1AblF0D\_605A;aT1
+HblL0FD_7P5f;b41O2lU0I`_9`6n;dD1a2mF0M\_F07P;eX1iRmK0OP_H`7k;f@1nbmV0A0`K04T
+<6d1D31^0EH`L@5H<781OC1d0Gl`M@61<9<1Qc2T0Ih`YP6S<:P1ZC2Y0K\`\@6n<;81_S2d0M<`
+^@7Q<;X13C6k0A<a_P4E<Kl1>S710C`a`P4n<N01A37`0EPalP5N<O<1J37d0GXam@6<<OT1Zc7j
+0K@ao07F<A`2fS4^0_8a;`;l<C421S8c0P`b=08N<SD2<38n0S<b@09=<TP2H3990WPbB`9h<Td2
+VS9?0Z@bE0;4<UH2jS9N0^dbG`85<f421C=S0RLcI@8a<fX2DC=\0WLcM@9i<gH2WS=h0Z0cUP:V
+<jD2_C>W0\LcZ@;=<jX2gc>b0^4c]0;^<kH2nc>h0PLd_@8^=;l2DcCM0UTdl09`=?42M3Cb0W@d
+n@:4=?\2RS@20idd10>S=0D3[3@90jhd2P?@=0\3fc@>0mhd5`?P=1T3lc@K0oTd70<2=B0313DQ
+0bHe8P<a=BD3=3DV0cXe9`<n=BP3ACE60d\eH0=R=F43N3ES0gleI@>==Fd3TCE^0ileL0>\=G83
+\SEc0kPeMP>j=GP3aCEo0m0eP@?I=H83fcF50mdeQP?U=HP3m3F90oLeS@?l=Hh303JW00Hf\`0J
+=[@07CJf02Df^@0[=[X0D3Jk05<f_`1E=\40RCK208hfh02D=^d0Z3K^0:`fk`2a=_00\CKg0<0f
+n03A=_X0ecKk0?PfoP3j=_l073L10BLg0P4\=b01<SLX0DDg:P5;=b`1ECL^0E\g;`5l=c81OcM@
+0H@gG`6E=f41VcMR0LTgJP7?=f\1ccM]0N@gN07b=hL1m3NF0OHgX`7h=j\1nSN_0A<h\05=>;41
+DSS?0EhhgP5_>>01MCSQ0J<hj@6X>>X1Z3S\0Kdhl07:>?81c3Sf0NDhm`4O>OP18cTF0RLi9P8n
+>BP2A3TY0W8i<@9k>C82QCTd0YTi=P:O>Ch2^3U00[hi@@:n>DD2fcU70PDjC`87>U423CYB0Pdj
+EP8Z>U\2E3YL0XTjG@:B>W\2V3Z80Z\jRP:a>X\2gcZC0^LjU@;e>YH2oCZI0_ljV`8<>ih26C^Q
+0S8kXP8j>l02?c_D0U<keP9L>mh2HS_P0VLkhP9\>n@2PC_W0Ydkj@;J>n\2h3_\0^<kk`;U>o02
+mc_a0P0ln`8H??h27S`00e4l0`=C?0D3FC`S0ell<P=_?3@3Lc`e0g\l=`=o?3T3Sc`m0j4l@0>g
+?483dcaP0mPlMP?Y?7P3mcaj0odlN`<7?H832Sf:0`hmS0<D?I@39SfF0b`mV0=7?IX3C3fK0dhm
+WP=@?J43DcfT0eDmYP=`?JP3MCfY0gLm[0=i?K83Rcfc0i0me@>F?N03ZSgR0n8mjP<I?^`37ckd
+0bHnm@<`?_L3=ckh0d0nnP=c?_h3RCh0190n0@BP?P<4hSh<1?Dn3P@0?a4403lC14`o50B1?aD4
+RSlc190oAPBT?dL4ZCm81:hoB@Bc?dX4_CmA1<LoD`C=?e@4ncmL1?hoGP@4@6L43D1Z11]0J`A;
+@6`4Ed1e15U0MPAS@7L4J41o16a0P@Ab@884Td2:19I0S@BU@8h4eD2?1=U0T@CN@:l4hT2l1?I0
+_@Cj@;h4od2o10i1aP@O@LP49D7912e1bP@a@Ld4<d7>15E1d0AP@M44ID7_16]1oPAo@@05RD42
+1I911@FK@@`5bd4=1M113PGE@@l5fT4@1Mm14@GT@A<5jD4E1NU170D>@Qh5648W1Ca2:PE:@Rd5
+DT8_1EM2<PES@SD5Jd8g1Fi2>PEj@Sh5PT911Hi2A@FF@TP5XT9<1J]2C`Fg@U<5`49D1LE2E@G:
+@U`5cd9M1Me2G`DB@f056d=n1B53U`Db@iP5=T>I1DI3V`E9@j@5CD>R1Di3YPEO@jP5I4>Y1FM3
+[0EY@kH5KT>d1Fm3^0F3@kl5QT?01I13`@FO@l<5Z4?41JQ3a@G5@lP5bd?91O93d@Gf@m85mT?E
+1AE4ePE5A=h5BDCP1EQ4j@E[A>`5MdC]1IQ4k`FLA?05XdCa1JQ43`J^A2@6`T@U1]549PKFA2L6
+fd@X1^E4:@K_A306nD@b1P55=@H7ACH6:4Dn1R]5?`HaADP6=DE91Sm5B`I7ADd6G4E?1VY5D@Id
+AE@6MdEE1XU5EPJBAF06UdEQ1Ya5H`JYAFD6[dEW1[E5J@K2AF\6bTE\1]=5L0KEAG46n4Eb1_m5
+L`H3AW`624Io1Q16P0HcAXP6=dJ91Sa6RPI1AX\6ATJY1Ta6``ITA\@6JDK51Vi6aPIhA\L6PTK>
+1Xa6d0JDA]<6VTKD1[]6g0JnA]d6cTKN1]A6i`KKA^P6iDKY1^e6j`H6And654O_1Qi7l@HQAo86
+<dOc1Sa7m0HoAoD6@dOm1TI7oPI:Aol6CTL11em70`MUA`@7JdL<1gA73PN5Aa07RdLB1i576@NR
+Aa\7XTLM1kM77`O7Ab87edLV1mY7:@OZAbX75TP[1b58;0LUB2l79dPa1d18<`M2B3@7JDPf1f]8
+?PM^B3l7KTQ01h98A0NEB4h7_DQ@1lA8D@OAB5D7ddQF1oI8E`L1BEP71DWU1PM9F`L@BF<75DUV
+1a]9I`LmBFP7@DUY1d=9K0M9BFd7K4U^1g19K`MbBG87N4Uc1i]9M0NOBGL7XDUh1je9P@NjBH<7
+`4V61m99Q`OIBHP7gdVV1ne9^POnBK`70T[41aE:aPLIB\P7:T[91cQ:c@LjB\h7H4[A1fU:k`M]
+BP88Q4X:299:2`RFBP`8VdX>2:U:4@R_BQ88d4XE2==:5`SdBQT86D\g21m;?`PcBd88=d]325i;
+B0Q_BdX8UT]X29Y;L@RYBg<8[D]e2;Q;N0S8BgT8c4^G2<i;XPSRBjD8iT^V20Q<Y`P]C:T8=Db[
+23e<X`PnC:d8CDb^255<c0QGC=L8JTcJ26i<g0QjC=h8SdcH291<h0RUC>48ZDco2:a<30W0C0l9
+a4`@2NI<4@T;CA<94ddE2A]=3@TLCAL9<4dH2CA==PTjCD09CTe22EI=A0UNCDH9Ide92G9=BPUf
+CFP9O4eb2I1=M0VHCGH9X4eh2K9=N`VmCG`9`DfJ2LM=X`WHCJD9g4fW2Ni=ZPWlCJ\904k92@A>
+h@TEC^<9BTkU2EQ>iPUnC^T9R4kZ2I9>j`VLC_89[dke2K9>m`WFC_\9gTh32^Y>1@[lCPH:24l9
+2PY?4PX?Ca@:4DlF2R1?60Y9Ca\:DDlM2Va?7PZ1Cb4:PdlT2XQ?:`Z9Cb`:Vdl]2Yi?;`ZcCc0:
+aTlb2]a?<`[_CcD:1E0l2P]@?@X;D3h:9e102SA@@@YWD48:K51P2W9@J@Z6D6X:Se1\2YQ@K`ZL
+D70:`51b2\=@L`[:D7@:cU2B2]A@V`[XD9d:lE2P2_E@X@[mD:D:1e6V2PYAX`X;DJT:7E6V02=A
+]P0jDKT0EE6k061A_P1_DL00NU7308UAa02QDM@0Ye7L0;AAg@35DN40cE7S0>]Ai@3`DNH00U;W
+00EBjP07D^`06E;^02=Bk`0`DP41<e8E0DQB5P5=DQL1DU8H0EaB6@5VDR01L58R0GeB9063DRD1
+Y58V0JMB;P6ZDS41\e8b0N=B<`7XDS@1k58e0O5B?@7dDSh1m58o0@eC@@4BDd<15U=50B]CB04g
+DdT1?5=@0D5CDP5>DeL1EE=H0EYCH05ODf81KE=T0G=CJ05jDfX1R5=j0HiCO`6JDh01`e>@0LEC
+W@7FDj01i5>Q0O1CX`7bDjH1me>W0AYDZP4NE:`18UB]0D=D\058E;41C5C10E1Dd05QE=41HECC
+0G1De@5fE=H1MUCH0HEDfP6BE=\1Y5CM0JQDh06ZE>X1\5C]0KiDkP7:E?01c5Cc0M5Dm`7_E?T1
+leCj0AAEo@4IEOh17ED>0R5E5P8]EAd2AED]0TME>09NECX2HUDl0VAE?@9iECh2S5E>0Y9EE`:U
+EEP2[eEJ0[UEG0:oEEd2`eEP0\EEHP;9EG82cUF30^9EQ0;ZEHH2n5F80_aER@8;EXX23eJ;0Q9F
+SP8DEY028EJA0S9FV08fEYX2?EJL0TiFY@9GEZL2GUJY0VmF\P9hE[<2QEJe0Y9F^0:PE[X2aEJk
+0\YFb`;@E^<2ieKa0_5Fl`;oE_@23EOe0QMGm`8^EoT2>UL20dAG10=:E`d3F5L?0f5G4@=VEa83
+L5LF0gEG6@>1EbT3QeLf0iQG=`>YEcP3\ELj0l5G?0?5Ecd3eeLn0mYG@@?MEd83jEM40neGAP?`
+EeH3m5MS0`MHI@<CF6L37EQY0b=HJ`<]F6h3=EQ`0ceHLP=5F7@3AeQf0faHM`=dF8L3NERC0i1H
+U0>PF9H3YeRH0jeHVP>gF9d3_eRO0lUHXP?AF:<3fURc0n1Hb0?gF<X3oES;0a5IcP<CFM037EWB
+0bEId`<UFMD3?UWG0dQIfP=@FN83F5Wb0eiI5@AbFAL4MeTI17mI80B>FB84U5TT19UI;PC;FBl4
+beTi1?AI>`CjFCd40EXn10eJ?`@KFT4485Y312IJA0@\FTd4<eY>13eJD0A0FU84B5YJ16AJG0AX
+FUh4JeYO1:IJHPBXFV`4geY^1>=JMP@5FgP42e]k11YKO0@oFgl4@E^014iKPPALFhX4Ge^=16MK
+SPB9Fi04S5^C19]KU0C0FiL4`U^H1=MKVPCTFi\47ebN125LY`@SG:T4;5bZ13=LZ`A9G:d4Beb_
+15AL\0AKG;44LEbd17=L^0B9G<P4SecK1:=Li0CNG>D4jUcX1?1Lj@@MGN\4;egk151M0`EPG@H5
+IUd71I9M2@FEG@\5UedK1IeM90FaGBD5^UdX1LQM:@GEGB\5eed^1MaM<@D3GS<52Ehd1BYN=PD]
+GTH5<eiQ1DMNH`E;GVD5CUiW1EANJ@EJGV\5H5i]1FINK`E\GW45LUic1GMNM@F5GWP5Reii1IMN
+P0FLGX85ZEj41JmNQPFcGXP5]ej;1KiNR@G4GXd5dUj?1MENU`GKGYP5j5jJ1NiNW0GbGYh5n5jP
+1@QOZ0D>GjX54en\1AMO[PDMGk<5;Uo31CAOdPE4Gm@5CeoF1EEOe`ERGmP5KeoJ1GMOf`EjGmd5
+Q5oO1HYOh0FIGn<5VeoU1JAOm@FYG`X6_El;1\9O3@K4Ga46e5lB1]UO50KKGaP6hUlL1^UO80K`
+Gb46mElR1_QO90KjGbD68F0^1RAP<0HbH386>f0d1T5P?0I3H3h6BF181TiPBPIHH4`6Gf1E1V5P
+E`IUH606NF1R1WmPJPJBH6`6Vf1^1Z5POPJcH8<6_f271\mPR0KFH8X6f62=1]ePT@KRH9@6if2T
+1_=P\0H6HK864V6d1SiQa0I3HMT6EV7Q1V9Qi0J2HND6[V7W1[YQkPK=H@l7dV4K1nIQ7@OcHAl7
+nF4P1aYR8@LMHRT78f8Z1beR:`M2HR`7Ef8]1feR;PMmHSD7Tf8g1iUR>0NMHST7XV8j1jIR>`NZ
+HS`7[f8m1k=R@0NeHT87bV941mURA`OOHTP72F=91`aSDPLFHe@786=F1bISF@M:HeX7Cf=40@D0
+~4T@:V04T11`01~3W`:H~9=`?>1U013`03~3?`?61Ul10`00~31@X@0V812`05~33@X80Vd10P00
+~35@`\0fl11P07~380`Q0`00~6@@oe17D10`09~3B0o^17P10P00~3=QA>0GX10P0;~3@AA30G`1
+0P00~3Q1D40Gh1100=~3TQGf08811000~3R1HR0XH11`0?~3UQHD0Xd10`00~3ZQQE0I01200A
+~3\aQ<0IP11000~3oaWM0I`1300C~32a[A0JP10`00~3g1^L0Z\11@0E~3ia^A0[011000~3_Qkg
+0K@1200G~3bAk\0K`11@00~3]B2B0<411@0I~3`2270<H10`00~3Ab5M0LT11@0K~3EB5?0Lh1
+1@00~3Y28M0M<11P0M~3\R8?0MT10P00~3`B>N0=\10`0O~3bB>F0=h11000~3GbB^0>811@0Q
+~3KBBP0>L10`00~33BGG0>X11@0S~36bG90>l10`00~3i2E50O81100U~3lRDg0OH10`00~3:BNS
+0?T1100W~3=bNE~9c2MN0od1100Y~3dRMH0`420@00~3:R_@0@820@0[~3;B_=0@<20P00~3nRco
+00D20`0]~3oRck01h21@00~3nBfQ02<2200_~322jB02\20P00~3VRjF02d20P0a~3YBj;02l2
+0P00~3<2nD03420`0c~3?Rn603@20`00~3a2o303L2100e~3dRne03\20`00~3Qc2m03h2100g
+~3UC2_04820P00~3A36F04@20P0i~3Cc6;04H20P00~3fS7<0DP21P0k~3jC6m0Dh20P00~3YS>c
+05020`0m~3]3>U05<21@00~3FCCb05P21`0o~3IcCT05l21@00~3BcFk06@22011~3FCF]07d2
+0P00~31SJ>07l21013~34CJ308<20`00~3U3JN08H21@15~3WcJC08\20@00~3<SMB08`20P17
+~3?3M808h20P00~3Q3OB09020`19~3S3O:09<20P00~3GSS909D20`1;~3ISS109P20P00~39cUa
+0IX2101=~3=CUS0Ih20@00~3V3ZW09l20P1?~3XSZM0:420`00~3?c\P0J@21P1A~3BS\E0JX2
+0`00~3Gcai0:d21P1C~3ISab0;<21000~3f3bn0;L21`1E~3h3bf0;h20@00~3USgj0Kl2101G
+~3XCg_0L<21000~3T3mB0LL2101I~3Vcm70L\20`00~3hT290<h21@1K~3kD1n0=<20@00~3Jd6f
+0M@2101M~3MT6[0MP20`00~38D>=0M\22`1O~3:D>50NH20`00~3[TBN0NT2201Q~3^DBC0O42
+0`00~3C4JI0o@23@1S~3FdJ:0`431000~3kDV000D31@1U~3mDUh00X30`00~3KDZb00d3101W
+~3NdZT01430P00~37d]k01<30P1Y~3:T]`01D30P00~3VT\d01L30`1[~3X4\^01X30P00~3cT^9
+01`31@1]~3fD]n02430`00~3EdaE02@3101_~3HDa;02P30`00~3[4b>02\31P1a~3]db30343
+0P00~3>Te203<3101c~3ADdg03L30P00~3O4e;03T3101e~3Qde003d30P00~3addm03l30`1g
+~3cdde04830@00~314i^0T<33@1i~334iV0U030@00~3LU1R05430`1k~3OE1G05@30@00~3e51?
+05D30`1m~3ge1406d30`00~38e6407031`1o~3<E5f07L30@00~3Ye6<07P30P21~3Ze6807X3
+0@00~3<e9K0G\31`23~3?e9?0@00~6SU<g~5Q@00095C=0220`40~4aE>;08<30P27~3cE>308D3
+0P00~3D5CA08L30`29~3F5C908X30@00~38EDV08\30@2;~395DS08`30P00~3AeE;08h3102=
+~3EEDm09830@00~3TUDl09<30`2?~3W5Db09H30@00~3cUD20IL31P2A~3fEGg09d31@00~3d5Jg
+0:831`2C~3gUJY0:T30`00~3QeM]0:`3102E~3SeMU0;030`00~3m5N50;<31@2G~3oUMk0;P3
+0`00~3NEQW0;\3102I~3QeQI0;l30`00~3h5Qn0<83102K~3kUQ`0<H31`00~3GUTa0ld33`2M
+~3JETV0m`30@00~3Se`>0Md30`2O~3VU`30N030@00~3WEfF0>430`2Q~3Z5f;0>@31@00~3<eh1
+0NT32P2S~3?Ukf0?<30@00~3=5me0?@3102U~3>em^0?P30`00~3ZEon0?\31P2W~3]5oc~9\f0f
+~5Z@000;IP<`0110<0~4lf1@00@4102[~3oF1600P40`00~3@f6?00\4102]~3CF6500l40P00
+~3dV630A441P2_~3gF5h0@40~2T@9X:`40;P0100400P000?T]3@P_01@00P0100<0~21SHM6d<0
+?0030040100002=A<Q9o0380100100400@0102830P0202<3V00300<0^`<@0P@0103;1Hl1~8
+10000@000P20ooooO`0000D0008000@0083ooomo~21P0010001P00~2P?ooogl8~20@002000
+~3o`0000T0008000X0~4ool000X000@000`0~4ooooo`d000@0~33`002000~240002P00~23P00
+1P00~2:0000@00~230000@004`00~3o`0000L000P0~32`002000~2:`002P00~25@000P046@0N
+~21P000@0E~20P040P0E~20P040P0E~20P047@0N~2L0001P0J~2D@000P0E~20P04800N~24000
+4P0E~20P04200J~280000P0J~2@@000P0J~21@000P0E~20P049P0N~21@00700J~20@800P0J
+~20@800P0J~20@800P0J~20@800P0J~20@800P0E~20P04100E~20P046P0E~20P047@0E~20P04
+6`0S~41@@08`00~36P0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50P0S
+~56P0S~56P0S~56P0S~5100S~56P0S~50@0S~50@0S~50@0S~50P0S~50@0S~50@0S~50@0S~5
+100S~51P0S~51P0S~5100S~5100S~50@0S~50@0S~56P0S~50@0S~50@0S~50@0S~50@0S~51P0S
+~52P0S~50@0S~50@0S~50@0S~51P0S~50@0S~56P0S~50P0S~50@0S~50P0S~57`0S~57`0S~5
+0@0S~50@0S~51P0S~52P0S~56P0S~5100S~56P0S~5J00E~20P040@0S~5J00S~56P0S~50@0S
+~4P0@08`00~2P0@08`00~30@0S~4P0@06P00~3800S~50@0S~50@0S~50@0S~50@0S~50@0S~5
+0@0S~50P0S~50@0S~50@0S~50@0S~50@0S~50@0S~50P0S~56P0S~50@0S~50@0S~50@0S~50@0S
+~50@0S~5100S~50@0S~50P0S~5100J~250009P0J~2FP009P0J~22P006`0J~21P006`0N~21080
+800J~30P0401X0044000806P000P80100J~3100<01X005X001T06P001@000P0E~20P040P0E
+~20P04U@0N~21@00900E~20P040P0E~20P04V00N~2L000:00J~2D@000P0E~20P04V`0N~24000
+=00E~20P04200J~20@800P0E~20P04UP0E~20P04100E~20P04T`0J~20@800P0J~20@800P0E
+~20P04V00E~20P04U@0E~20P041P0S~41@@08`00~3UP0S~5UP0S~5UP0S~5UP0S~5100S~50@0S
+~51P0S~5100S~5UP0S~50@0S~50@0S~51P0S~52P0S~5UP0S~5100S~50@0S~4P0@08`00~2P0@0
+8`00~3UP0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50P0J~21@000P0E
+~20P040P0E~20P040P0E~20P04a`0N~2L000?P0J~2D@000P0E~20P04bP0N~24000BP0E~20P04
+200E~20P04c@0N~21@00E00E~20P04a`0E~20P04d00N~21P00F00E~20P04a00E~20P04c@0E
+~20P04300E~20P04e@0N2`8B~2G@0E~20P04e`0N~21080I`0J~30P0401X0004200805@000P04
+100J~280000P0S~41@@08`00~30@0S~50@0S~50@0S~51P0S~50P0S~5b@0S~5b@0S~50@0S~5
+0@0S~50@0S~51P0S~5100J~50P0S~5a@0S~52P0S~5a@0S~5a@0S~5k`0E~20P040@0S~50@0S
+~4P0@08`00~2P0@08`00~2P0@08`00~3100J~5bP0S~5a@0S~5a@0S~5a@0S~5a@0S~5a@0S~5
+a@0S~5100S~5100S~5100S~5a@0S~50@0S~50@0S~50@0S~5100S~50P0S~50P0S~51P0S~50@0S
+~50@0S~51P0S~5100S~50@0S~5100S~51P0S~51P0S~5100S~5100S~50@0S~50@0S~5a@0J~2
+6000100J~21@000P0E~20P040P0E~20P040P0J~2@@000P0J~21@000P0J~22@000P0E~20P04
+704N~2L000J`0J~2D@000P0E~20P047`4N~24000M`0E~20P04200NE08N~2P@0J~30P0201X0
+044000806P002@000P0E~20P04704J~2D@000P0J~21@000P0J~22@000P0E~20P045P4E~20P04
+:`4N~21P00S@0E~20P04;@4N2`8B~2TP0J~2D@000P0J~280000P0NP@84~2W00S~41@@08`00
+~3100S~5100S~4P0@08`00~3100S~5100S~5100S~55`4S~55`4S~55`4S~55`4S~5100S~55`4S
+~50@0S~50@0S~50@0S~5;04S~55`4S~5100S~5100J~50P0S~55`4S~55`4S~52P0S~55`4S~5
+100S~55`4S~5100S~55`4S~50@0S~50@0S~5100S~55`4S~4P0@08`00~32P0S~52P0S~5100S
+~4P0@08`00~37P4S~55`4S~5100S~5100J~57`4S~50@0S~50@0S~50@0S~50@0S~51P0S~52P0S
+~50@0S~50@0S~50@0S~51P0S~51P0S~51P0S~50@0S~50@0S~55`4S~50P0S~50@0S~50P0S~5
+7P4S~57P4S~50@0S~50@0S~50P0S~50@0S~5100J~21@000P00^04J~2^@42~2^P42~2^`4J0<06
+~4_04N~2_@4O~2_P42~2_`46~2`044~2`@44~2`P46~2``46~2a046~2a@46~2aP4<0<1`~4a`44
+~2b04:~2b@42~2bP48~2b`44~2O`4Q~2c04Q~2c@4:~2cP440<0@~4c`4J~2^P42~2^`4J0<05
+~4d04J~2d@4J~2dP6=0<040P000<l1UP00^P42~2^`6F0<05~4_06I~2_@6J~2_P42~2_`46~2
+`044~2`@44~2`P46~2``46~2a046~2a@46~2aP4<0<1`~4a`44~2b04:~2b@42~2bP48~2b`44
+~2O`6L~2c06L~2c@4:~2cP440<0@~4_078~2_@79~2_P42~2_`46~2`044~2`@44~2`P46~2``46
+~2a046~2a@46~2aP4<0<1`~4a`44~2b04:~2b@42~2bP48~2b`44~2O`7;~2c07;~2c@4:~2cP44
+0<0@~4c`75~2^P42~2^`750<05~4^075~2^@42~2^P42~2^`750<06~4?P84~2?`84~2@084~2
+@@84~2@P84~2@`84~2A084~2A@84~2AP840<0B~4d075~2d@75~2dP7H0<040P000;`17@40_@4N
+0@2n0@800;l11P00`044~2`@44~2`P46~2``46~2a046~2a@46~2aP4<0<1`~4a`44~2b04:~2
+b@42~2bP48~2b`44~2O`4P0@3<0B010<d12P00cP440<0@~4Q@84~2QP84~2Q`84~2R084~2R@84
+~2RP84~2R`84~2S086~2S@86~2SP86~2S`860<0N~4^04G0@2i0@800;X10P00^`4G0L06~4?P84
+~2?`84~2@084~2@@84~2@P84~2@`84~2A084~2A@84~2AP840<0B~31I022P06T@8:00FB0PX0
+1I<22P04U08:00NE0PX0`0@0~20@1H0^P24`FA0Yl2Y@:X0Zh2a`;90]h2m08a0cL3?`=50dP3
+`0?S0nh3m`?n0`T46`@Y1684L0Ag1:L4\0CC1?L42@D<1A455PDI1DP5C`F01L05m0Da1U06JPIe
+1Wl6]@Jo1\d6k0Kb1_H6:`L\1c47>0Ll1e07D@MF1gP7P@O01l87b0O>1m07ePL921L86@PN2388
+F`Q^29`8b`ST2>X8l0P72@l9;PTd2Ch9A`U92E89EPV;2H`9T@VH2I`9\0Va2KH9_@W?2Ml9hPWe
+2OP9o`T52Pd:4`XF2R4:<PYa2X8:U0[E2^@:o`X82aX;F`]]2hT;S`^Q2n8;m0\;30l<5@`P32H<
+:@`_35H<P`b:39L<W@cA3=P<0`d:3CT=?0e13DH=B`e=3E@=O@fF3Kd=k0g^3@l>5@hP3R8>9`h^
+3UX>M`j<3Z<>cPk@3]L>g@k_3Pd?70lh3c\?@@m83dh?D@nJ3j8?Z@na3kL?8A0V42T@\Q364?4@
+=Q5a4NXAna4N4RlB?Q914T\BEA9V4[8B`a8?4a4C8Q=Z4c4D=QA154LDBQA@57LDZQBo5=dD1QD>
+5A@E>1Dn5DLECQEg5H0EQ1FB5IPEVaFn5OhE1AH^5S`FH1J25XPFUQJL5YlFgAK]5P8G4QM45d\G
+M1N05h8GRANN5lLGeAOl5`8H9QQ=65HHGAR668lHY1RZ6;<H^ARl6>dH1QTC6ALI?aU16D@IAQU9
+6GDIUaV\6JhI`1W;6M8IeAWO6NHInAWo6@\J4AXD6TXJKQYe6Y`JWQZT6ZhJ\A[B6^XJkAX36`HK
+;A]<6e<KT1^Q6k8K`a_<6mHKg1_W6ndKl1\<710L6Q`f73hLEaa[76hLLaaj7;@L]Qbi7<8LbAc<
+7=lL61di7DhMHAfJ7JdM\ag?7NdMl1dX7RXNDai_7W8N_Qk97\lNdQkJ7_lN0QlI7alOCAn;7i@O
+UQnL7mlOhQoZ7o0O7R1L89lPXB2S8:HP[b2e8<0PaR398=8PmB3n81HQ>2538DLQEB5K8EhQI26I
+8L0Q`R798N8QiB7Z8NlQm27f8@HR3b8Q8S<RWR:T8[8R^2:k8\lRf2;X8R<S:2<[8c0S@2=68d\S
+DB=F8eTSG2=O8f@SJB=^8g0SLR=d8gHSO2>18h@SRB>?8k\S`B?98llSdR?H8o<SmB?g8`0T32@J
+92<T9R@Z934T?BA994dTEbAK95lTKBAc97HTRRBB99PTX2BU9:PT[2Ba9;<T]BCK90LU3BDK9B4U
+92DZ9C4UF2EQ9FPUKBE_9HhUU2FK9JHU]RGN9N@UlRGh9O\U42HF9R@V:RH`9ShVB2I>9U@VEbIM
+9V<VIBI[9W4VLbIj9Z<VYBJ[9[4V\bJi9[lV`BK89_4VmbKm9R<W:BLg9cdW@2MD9eXWJ2M_9gDW
+PbN=9i@WVRO69l`WdROH9m\W6bPS:2\X<RPl:4LXEBQ_:=0XkbSg:08Y12T9:@dY5BU[:GPYORVX
+:MHYiBW`:@dZ3bXg:T4ZCRYD:WLZ`2[7:\TZlB[h:P0[1b\?:aH[7R\V:bX[;B\c:cH[n2cj;?h\
+12d7;Al]=bdn;FX]\Bfi;L0]abgB;ML]gRgV;OH]nBd8;Ph^4Bhl;VX^Nbj<;Xh^T2jD;YX^YBj[
+;Zh^]2h1;bD_;2l`;ch_A2m7;e4_IBml;i`_]bnn;l@_dRoH;m\_iRok;a0`4c0H<1d`8S0T<5P`
+Oc21<8L`UC2K<9h`ZC2n<=<`eS3J<=l`hC0E<C`a?S54<DlaEC5H<EhaZc7?<MHafS7Y<NlalS4<
+<S<bCC9@<UPbGC9P<WhbQ3:6<X`bTS:D<YXba3;S<^XbkC8;<a4c4c<I<alc8C<W<e4cL3=g<gTc
+X3>V<k@c^S>m<ldchC?e<o\c;SA<=5<dFCAW=6ddL3B:=:<d[SCN=>0dnC@4=C@eACE;=ETeGcER
+=HDeQcF==HleTCFb=KXeaCGD=MTefcGM=O@enCGl=@0f1SHA=QLf6SH[=UDfG3J9=XhfU3JO=ZDf
+Z3KG=_Xf9cL\=c8g?3M2=dDgBcMK=glgQ3N<=i8gUCNK=j8gbCO<=llgi3OV=n\glSOd=oHgn3Oj
+=a<h6SQ=>58hGSQV>6`hKcQe>7`hXcRV>:Ph_CRo><<hb3S:><`hiCS\>1li8cTW>CDi>cTn>D@i
+BcUb>GPiNcVO>KPi_SW4>LHic3WB>M@ifcT5>PLj3CXC>QDj6cXQ>R<j:SYD>U\jRCZB>YPjXSZX
+>Z\j\CZh>]ljiC[W>^djmC[o>Q<k6C\b>cXk?c]:>e0kDc]G>e`kGc]R>f`kWC^T>mXkh3_U>`<l
+13`H?1hl9Ca>?54lDcaI?5llISa\?6llLcao?8llXCb[?;4l\Sbg?<dlcScC?=Plh3cV?>Tlkccg
+??XloC`>?A@m9Sd\?DLmC3e@?E<mECe`?GDmNCel?GdmRcf@?IHmXCfW?JXm\CgR?NTm6ChO?R<n
+9Shg?TdnFSiW?V`nKSic?W\nOSj9?Y0nYSjf?\HneSkK?]dnhSkZ?^dnmCiC?h4oRSn@?i\oXCnT
+?ldoe3ok?oho140R@4]0FD1\@790UT2L@:E0[43E@=i0hT3]@?=0mT0U@C=1H45U@F]1MT5l@Gm1
+SD6B@IQ1Vd6R@L]14d8H@Qa2?493@TY2DT9M@V=2Jd9d@WY2PT:8@Xi2UT:L@Z92Zd:a@[M2`4;T
+@Q936d<Q@bU3;d<b@d]3CD=>@e=3Gd=T@fM3JD=\@fi3Kd=d@h=3bd?f@`E45DA9A5Q4IdA[A754
+MdBLA:Q4[TBiA;m4`T@7AB]5=DERAFA5JTEdAGM5UdF_AKE5bTGEAOm51DH8AQ16=dI6ATa6FdIQ
+AVA6VTJnA]]634L>AaA77TLQAdI7IDMdAh]7TDNXAji7]dO7AlY7d4OGAmY7jTLWB418@TQ[B6i8
+R4R>B9E8_DS4B==80DT7BA196dU3BDU9LTUhBJ59^TW0BM99gdW]BOE9ndWnB@9:3dX@BQE:6DXZ
+BSY:HdYTBVU:KDYkBX5:Q4Z_B]=:6D\OBbY;<4\cBcM;Kd^4BiI;VT^PBjI;ZD^]BkQ;_4^nBkm;
+b4_<Bli;fD_OBn9;iT_dB`1<1D`GC2A<:T`eC3]<?D`nC4E<CDaAC5M<HDaWC6Y<KTajC8I<Rdb=
+C8m<T4bEC9i<YDbYC:a<]dbmC<1<a4cBC=i<hdceC09=24dCCAU=6ddLCB5=:4d`CCA=>Te5CD]=
+CTeNCFM=Jde]CFi=LTefCGa=Qdf=CI1=X4fbCKI=^4fiCKe=`Dg7CLm=eDgHCMa=kTgbCOA=mDgl
+C@1>14h<CQ9>5DhLCTY>D4iBCUQ>R4jbC[i>bTkFC]i>i4kZC_E>mdklCPY?34l?Ca5?9DlaCce?
+BDmACfE?Idm\Ch=?QDn8Cc]@Ie1\D79@OE23D8I@W533D<i@e53OD>E@j53\D?5@mE07D@]A3e4K
+DAeA8e4aDCMA>U5LDF1AKe5fDGYARE6QDJMAZe6aDKAAcE7CDN5AjE7`D@MB3U8EDQMB6E8NDR=B
+:58\DRiB<58cDSmBAE98DX=BQe:ZD[=B^U;SD_AB5U<MDb]C;U<_DcMCCU=EDeYCGe=cDgYCR5>>
+Di5CUe>JDl=CaE?=Dm=CeU?IDmeChU?TDnMClU?gDaYD75@NE29DB5A<E51DF5ANE65DIeA`E7ID
+TUBME:ADYUBXE:YD\5BcE;MD_5BnE<5Dc5CAE=MDkeCcE1UE7EDQEBAE:UD]ECaE@EE3EDEEAeEE
+EE]EGUEREFAES5FBEIaEXUFUEKmE`EG3ELEEbEG>EMUEgeGREOaE55HQESeFCUIAEU9FEeINEVmF
+LUIcEWQFX5K5E\YFd5KNE^AFieKgE_mF=5LjEdAGBUMHEeaGHEMVEgEGN5N1EhMGSeNEEiQGaEOM
+EneGl5OdEoiG15P7F1=H8eP]F3=H=EPmF4EHAeQBF5YHIEQWF6aHM5QiF8MHSER@F:eH]eRmF;mH
+bESAF=YHh5S^F?AHmeSmF1=I7ETSFBEIB5U@FEQIGUUYFFmILUUoFIAIVEVPFL]IhEWdFOYI0EXV
+FS=JB5YTFVQJLUZVFZQJbU[=F]mJheX5F`]K6U]1FeaKGe]WFhaKVe_2Fn]K7e`QG2=L;5a;G5AL
+LeakG7iLREb?G9YLX5bSG:YLgUc`G51MIUfEGIMMWEfXGJiM\EfjGKeM`Eg6GLQMbegGGMaM0eh9
+GReN<ehnGTANAei;GTiNE5iJGV1NIUi\GW9NOEj5GX]N[ejgG[iNa5k7G\eNdUkEG]]NkUkhGPQO
+3UlCGaeO:el^GcAO>em1GdAOEEmgGhYOUenIGi]OY5nYGkAO^UnmGlAOaeo=GmAOfeoRGnUOl5oe
+GoYO960ZH39P>f11H4=PBF1>H5APF61OH65PIF1iH7mPTV2KH:5P\f2fH;aP_f33H<QPcf3AH=QP
+gF3RH>MPlf3mH0=Q1V4BHBAQ;64gHCUQ?V53HDeQDf5FHFQQJV5`HG]QOF62HKYQcF7BHMeQhf7V
+HOUQ7F8PHR=RVF:eH\YRgf8FHbISBV=?H`00~>GemSK6EQKWE`05mOHfQUHf]^MFa\05mOM6Eb
+KFU^HGAU05mOLVEcM6mbIGYULVl0Gf5RKg9d04A7DTmED400Gem=CDm4AD`0Gf=XKfmcIEmhK7AO
+M65RK6D0GfAUHfmTI@1OI6ESKfAUGf9iM6Ec05mVJFiTGfiUN7AOL65bM01OJFiYM6UQK6UjI@1O
+Kg1UKUmYL5mVJFaU05m_L6E^GfiUN7AOL65bM01OKg1UKUm_L5mVJFaU05m`HG9cIEmUKV=OM69\
+05m`LW=OJFAhGfIYK6D0Gg9TIVUOJ6EQI6EbL`1OLVAVJEmdLV5YK6EbL`1OLfEdGfAUHfmTJFiW
+GgAiL6D0Gg=UM5mUKV=OM69\05mcIGAOIVmbKF5d05mcIGAOJFAhGfIYK6D0Gg=UM5m]KfAU05mc
+IGAOL65TGf=XHG80Gg=UM5mbIF=_LVAOK6E^05mcIGAOM6U]IG=dHFe`05mdIG9]JFiQM6D0GgEc
+HFMUGfEbLVmb05m]HFU^05mSJ6]OLf]YL6IbKfd0GfMUM7IOHfQQLV5SM6EbLfEd05mWIGAfGfAU
+HfmTIGIULW=YKfh0GfMUM7IOIVmbKF5d05mWIGAfGfe_I6D0GfMUM7IOKg1ULV5dJFiWLgUcM6E]
+05mWIGAfGg9UHfaUKP1OIfEdMUmdJFeULgAQKG00Gg1QLW=UGf9UIfU^GfQUHFAULP1OLVAOKVEh
+M5m\JFiU05mQK6a_Hf5dIEmRMFIVIG80GfAYLg1\HGUOHfm]KFE^M01OIUmSK6mcI@1OIfEdHemV
+Kg9]HG@0GfMUM6=OKFmTI@1OIfEdHembIF=\IFh0GfMUM6=OM6U]IG=dHFe`05mXIF5TIG9OM7U`
+I@1OJFiYM5mSLV<c<UmdHF9\I@1OK6m_JgE`Gf]UN@1OKF5[IEmdJFeU05m_L6E^Gfa_IemVJFaU
+05m`HG9cIEmXIF5TIG80Gg1QLW=OM6U]I@1OL65bLemhK7AOM69\05mbI5mUKV=OM69\05mbI5mh
+K7AOM69\05mcIGAOI6ESGgARK01OLfEdGgQ\M5mdHV`0Gg=XKgMOIVU\IEmSKfidIGQd05mfLgAb
+HfQb05mfLgAbJF=]L01OMW=dLViSKG00GgIcM79^JF=]L01OMW=dLW9SJ780GgIcM79bLgAb05mf
+LgAbLgAb05mfMUmdJFeULgAQKG00GgIcM79TMG00GgIcM79dLWMc05mQL71\NEmTIFIQMFadL`1O
+Hfm^IVUbKEmiIG=^K`1OIGQQKFU^IEmVJFaU05mUN71\HFU^GfEbLVmb05mVGfm`IFiOJFh0GfIO
+Kg1UKUm_MG@0GfIYK6EOIGQYLgAc05mVKg9SIEmVJFaUGfEhM01OJG=OHEmVJFaU05m\IFMQK5mV
+JFaULg1UH`1OKF5[IEmVJFaUGg=`IF<0Gg1bKfe`M5mVKg9OLgAbJFiW05mbIF5TGf9iM6Ec05mb
+IF5TGfaYKVD0Gg9UHFAOLVESKg9T05mcHf5^Gf=]I5m\JFiU05mcIGAOIWAYKFD0Gg=UM5m`JG1U
+Gfe_I6D0Gg=`K6UdGfIYK6EOLg1UH`1OM7YOKfIVLfEd05meLfEbGfeULg=QIfD0GgIfGfEhJG@0
+GgMbJGAUGf9iM6Ec05mgLVUdIEmbIF=_LV@0Gf5dIGQYM01OGfA_LemWIGAVJFaUHGAdLP1OGfA_
+LemcIGAVJFaUHGAdLP1OGfA_LemWIGATLVUfI@1OGfA_LemcIGATLVUfI@1OGdA?DeA9CDEDCeD0
+GfEhJG@0GemUN6Ud05mOHfEhJG@0GemSGfEhJG@0GfMUM6AQM6D0GfMUM7AYKFD0CUm<A4UF@01<
+A4UF@016Gda4BEI004iOC5E4BEI004IOC5E4BEI004aEA4UF@01>Gda=CdA004IOC4e?A400C4e?
+A400CUm<EDe?A400C5E=CdA004IOC5E=CdA004iOC5Q<DdQ004aHC5=8@016GdaHC5=8@01>GdaH
+EE9CB400C5QEDU=8@016GdaHEE9CB400Gem9CdEBDTmB05mOA4mCAE9BCe80GfUcHGAdN@1OGda?
+CTMDCd40GemEE4m105m\LfEUJ`1OGde;CT5=A@1OGeA=D4i1C@1>GdaHCEE<@01>Ge=3Ce1I@01O
+Gg9UHF@0GemcHf5^KVEb05mOLf=QKWA_K01OLfEdI65dI@1OLfEdM6U]I@1OLfEdIWAYKFD0Gemc
+IGAeL6U_05mcM6U]I@1OM6U]I@1OM6E\K01OM6meL71ULP1OMFi\JFi[05mOEU1BBDiDAE80Gemc
+M71SL7T0GemOHW9[05mOGg=RLV\0Gf9bJ`1OLf9bJ`1OJFmSM6`0GfIbIFD0GfeQK6a_H`1OLVEQ
+K6a_H`1OGe95@Da3EU@0GemcHf5^M6mT05mOLf=QKW9cK7@0GemcHf5^L6m`04iOCeI5DTI<CeM0
+04IOCeI5DTI<CeM004mFAE96C4mG@01OHF=SIG=c05mQM6m\05mQM6mY05mOHfQ]Kf@0Gf=\Kg=U
+05mOHfa_LfD0GfM]M6U]I@1OK6mSHFadJFeU05mQLf=dJFeU05mSM6U]I@1OKF]dJFeU05mcM79V
+M6U]I@1OIFmV05mVHfa_LfD0GfIVK7EcJ01OIVMUM7<0GfI\MG=XHFa\05mOCe15CTI@05mOAdED
+AU00GfI_L6E^05mVL79YKWAV05mVLVEQI01OIW=UIF\0GfIdIFa\05mOIWE\K71QM6P0GfIgLVUd
+I@1OGfIWIGAS05mVIfEdH`1OGdiVIfEdH`1OIVMUM6=XHG80GemWIGATHgMT05mWIGAUKWH0GfeU
+KF=`N@1OLfEdKFE]05m]IFecIG@0Gfe_MVeUK@1OKFE]KFmfI@1OKg1UKP1OGfm`IFh0Gg1ULW9_
+LP1OGfI`MGAS05mVL7EdH`1OIW1eM6=XHG80Gem6D5EDCP1OL7EdIFif05mOGg9UHF@0Gg9UMfU^
+I01OLfEdKFmTI@1OLfEdMV9eIP1OLg1bJFidIP1OMW=`LVU^M6H0Gg=cHf5^IP1OMW=cHf5^IP1O
+LgAQM01OLgAbHf5d05mcM79SKG00Gg=dLV=`N@1OLgAbI7E`05mOLgAbIG9bKg80Gg=dLVEbLVmb
+05mcM79\IFh0Gg=dLViSHG@0Gg=dLViSL7T0Gg=dLW1RLV\0GfA_LgA_MFiYN01OMFiYN7A_I6mc
+05mdNW=UM01OGdUCA5=D05mOGgMbJGAU05mOMg9YM6D0GemhIV=\Kg=U05mON6IVK7EcJ014@EA1
+DdE7@01OGdU^M31FIF=dKg80Gem9KW@dEVESM6mb05mOBFid=EIUHgA_LP1OGdU^M3IFIF=dKg80
+Gem3<65bIf<0Gem3<65bIgH0Gem3<6E^MVUbKfh0GemUKWI<KVL0GemUKWIcIFL0GemUKWICJGYU
+05mOL7=`05mOKg=fIG9cJFm^05mOKg=]HFY_LP1OGgIULW=YKfh0Gem_LfeYKVmb05mULW9^K`1O
+Ge=dHG9dE6U]I@1OGemXIF5`HV5cI@1OGemRLV]\MV`0GemXIF5`HV5cI@1OGf9bJfafK01OGfQU
+HG1dKg00GdMOKFmTIEmcM780GdMOIVedGg=dLP1OAemfMVEXI780GdMON6adJ6Ab05mOHGAUN6Ud
+Hfid05mOHgAiL6D0GemUN6UdHWEV05mOIGQYM6I_L6E^05mOIGQYM6m`IFh0GemcM79UHFec05mO
+KVIYK6D0Gem_L6E^IV@0GemVKFmTI@1OGfi_M5E]HG=[05mOJ6EQL6aUKP1OGfA_LfEbLVi_05mO
+I6mcAG9bKg9DKe=F05mOLgA[K6E^05mOIVUbLg@0Gem\HG=d05mOLVmfIG80GemQLVMS05mOHG9W
+MP1OIFifJG9_KP1OLgUcGfEbLVaYLg@0Gg=iLem^IG9b05mOKFm^M6Q4HGT0GgAjKV5]I@1OM6U]
+IGY_KVD0GfAQNFaYIfQd05mODVEQK4=fM5IUHgA_LP1OGe=SHFiDKfAFIF=dKg80GdMOIFm\GfeQ
+LV]ULP1OAemfMUm`LVEVJGP0GdMOMWIOHfQQLV5SM6EbGg=UM01OAemfMUm_L6EbHGAYKVMOLgUc
+M6E]05m7GgIfGfAUHfmTIEmfIG9cJFm^05m7GfAUHemdNG1U05m7Gfm`Gg1QI6=XHG80GdMOLg1\
+JGAOLfUjI@1OAem_MVEbMg9YM6EOIVaQI`1OAem_L71dGfi_05m7Gfm`L65bM5mRNGAUL`1OAemY
+L71dGfi_05m7GfU`L65bM5mRNGAUL`1OAemfMUmVJFaU05m7Gfm`GfIYK6D0GdMOJG1OIVU\I@1O
+AemXI79VGg=`IF<0GdMOM6e`GfecI`1OAem_L5mRMFIVIG80GdMOJG1OHWEVIVEb05m7GgQ\M5md
+HF9\I@1OAem\KfMOIVU\I@1OAemUKV=_I6EOM65RK6D0GdMOI6ESKfAUGgAQHVaU05m7GfAUHWEW
+IfU^I`1OAemcM65dMG<0GdMOHg9S<c9OM65RK6D0GemQM6EhJGAdHV`0GemcIGAQLVMfGel0GemS
+MWAVHF\0GemcIGAUKWI`Gel0Gem1B5=8BDID05mO@DQ9CT=B07IfI6ESKfAU;V<0EUI4AD=?A4D0
+N6adGfIYK6D0M6mOHfQQLW=UM01VLVm]Gf=XHG9cIG@0JFAhGg5eHFaYIVUULP1hK7AOLGEQK6UV
+JFEb07=dHGAeL`1YI7QOIVU\I@1fHG9OLVESGg=YNVD0LVESKg9TGfaUKVMdJ01bIF=_LVAOHWEV
+IVEb079UHemRNGAULem\IFId071QLWAOIFiTJFiW06m`Gf9eIUm`M780KVmOHWUdIG=OIFiSKfAU
+I01YL5mRMFIOL7Ab06QTLUm^K`1TIF=_I6EOLgAQM6D0HWUdIG=OIGQ`IF=dIF@0HWUdIG=OI6ES
+KfAUI01RMFIVIG9OLfUjI@1YI7P0HWUdIG=OK6EVM01S<`1S<P1S<@1dKG0c07A]L380M6e`<@1d
+KG0`06U`GfIYK6D0L65bM5m^IFETIF@0LfEQLV=XGg1QLg<0LgAQLWAOK6U^IEm^K`1RMFIOL7Ab
+06AUIUmVJFaUGfiQKFD0JG1OLGEQK6UVJFEb071bKfe`M5mcM780IVU\IEmUN7@0Kg1OIVU\I@1f
+MVEOJ6AbGg=`IF<0KgIULWMbJGAUGfI\HFL0Kg1OLGEQK6UVJFEb06aUIf5\GfQTLVIOLg1UH`1f
+MUmVJFaUGfEhM01fMUmVJFaUGfiQKFD0J6AbGg=dLWESM01\JFiUGg1dLP1VJFE\I7=OLVEQI01S
+J65bLembIF5T07A]L5m`M780I7E]KGT0N6adGfI_MFiT06UTN5mhK7AOIVU\IG=`IF<0JFAhGgA_
+Gf=XHG9cIG@0JFAhGfIbKfeOHfQQLW=UM01SKfe]IFid069iM6EcGg9UHF@0HWEVIVEb07IfIEmX
+I79OHG9bHGT0I6ESKfAYKVMOM7U`I@1fMVEOIVU\I@1Y07IfIEmUKfaOKF5bJfEb07IfIEm\JFiU
+Gg1bIFIYN01hN5maMF5\JFIYIG80MGEOLGEQK6UVJFEb06E^HfmTIEmdHF9\I@1UKV=OM69\GfaU
+KP1UKV=OLGEQK6UVJFEb06E^HemVJFaU06I]M5mcM79OHG9bHGT0MWIUGfmcGg=dLP1VKGAOLGEQ
+K6UVJFEb06=]I5mVKg9]HG@0KFmTIEmcM79OHG9bHGT0KFmTIEmaMF5\JFIYIG80HfeTGfe_I6D0
+L65TGf=XHG80L65TGg5eHFaYIVUULP1dKG1OL65TGf=XHG80LVESGg5eHFaYIVUULP1SKFAOLVES
+K6E^07AYKFEOLGEQK6UVJFEb06=]I5mdJFeULgAQKG00HfmeKW@0M6mdHFaOLVESKg9TL`1RNGAU
+LemdKemgLVUdI@1VJFaUGgMQLem`HFATIF@0LVEQLfm^065bIgH0HG9WH`1RNGAULembIG5T04MO
+HfeTGfm`IVU\I@17Gf=]I5mYL6IYK6D0AemSKFAaMF5\079SLfUT05Q\M5mCM79eHg@0AVU\IEm9
+KVI_04QUHFAULUmCM79eHg@0DGEQK6UVJFEbGe=dLWESM019KW@c<P19KW@a=P1EKW=YIfiUI3<b
+05E^LfUWKVET<CH0EFicJFM^IF@h049iM6D0@Vm_K6EQKP1SK6mSJemd07AYKFEOM01gHfQQLUmd
+071dLVAYIVIOM016BDa506I`Kg=OM01cJGYUGg@0LEmcM79YKVL0MV5\GfiUIFAUI01`LVEcIFid
+07IQK7EU06IYK6EOLg1UH`1VJFaUGg1dLP1`JG1UGfI\HFL0K6U^IEm^K`1]KfAU06I_LVeQM01]
+HGQOLVESGfaUKP1\KVMOLVESGfaUKP1]KfAOM6U]I@1RNGAUHfmeKW@0Hg9S<c80K6EfIF`0IVaQ
+Ig<0IV@0J6m\I01RLfUjI@1SMG9`06UcM6E]L01dKf]UKP1XGg=dLVU^I`1hK7AOIW9_K@1hK7AO
+M6l0N6adGgARK01FETA5@dm4ABi307IfIG1QLW=U;V<0EUI5D45BDdD0Lf]YL6IbKfeOJ6Ab06QT
+LUmVJFaUGg=`IF<0L7AOKVl0L7AOIVU\IEmcL6ES06=XHG9QHgAULUmcIG@0HfQQLV5SM6EbLfEd
+GfQTLP1TIF=_I6EOMVEbLfU_KP1TIF=_I6EfIG9cJFm^GfQTLP1VKg9]HGAOLgAbGf5bLV5i06I_
+LVeQM5mXI780IVmbKF5dGfi_06e_I6EOJ6Ab06e_I6EOKVl0Kg1ULV5dJFiWGg=iLgAUK@1_L6Eb
+HGAYKVMcNG=dIFeOJ6Ab079UHfaUKUmXI780I7E]KGTb06AeKFei<@1^KemfHFaeIG<0M6U]IG=d
+HFe`GfQTLP1dJFeULgAQKG00HVEWJFiOMV5\MFEOHWEVIVEb069iM6EOHfmeKW@0KF5hGf=XHG9c
+071VN5m\IFh0IFm\Gg1dLP1FETE@@E9CABi307IfMGAYK7<^H`1FEUEDBDaC069eIUm^HFeU069e
+IUm\IFh0HWUdIG=OLVEaMFUbIF@0Hfm]KFE^M5mcM79OHWEVIVEb07AQLVMUM5mVJFaU075eHFaO
+IVmbKF5d075eHFaOKFmTI@1aMF5\Gg9UHfaUKP1bIF=_LVAOK6E^075eHFaOM6U]IG=dHFe`06QT
+LUmQLW9QN@1XI79OIVmeKV@0Hfe`GfaUKP1SLV=OM65RK6D0Hg9SGg1_K7U^KfeYHF`0Hg9SGgAQ
+HVaUGg=YNVD0LP1Z06=QLfEOLfE^LfUdJGIYM7T0HFa\KgMOHF9RLVEfL`1cM79YKVL0JfEiGfaY
+Lg@0K6m_JemcM65dMG<0JfEiGfi_07A]07AOLgAbMF=d07A_M65\Gg=UHg<0M6mdHFaOI65iL`1\
+KfMOIVU\I@1\KfMOLGEQK6UVJFEb07AYKFEOLgAb07A]Gg=dLWESM01dJFeUGgIQK01QLVMc07=e
+HW=dGf=XHG80N6adGgARK5mcM79eHg@0N6adGf9eIVIULP1YM6E]Gg=dLP1YM6E]Gg=dHG9d06Ud
+IFeOK6E^06UdIFeOKWE]06UdIFeOIFiT06=eLW9OL7Ab079UHFAOLgAQM7Ec079UM5mcM65dMG<0
+IFiTGfmVGfaYKVD0N6adGfQTLUmQLW9QN@1TIF=_I6EOM65RK6D0I6ESGgARK5m\IFh0N6adGgAQ
+HVaU06IYK6EOM6EhM01VJFaU06=X07=dLP1cM78b07=dLS40MC80MC40K6E^IgAX07=UHG9SJ5mc
+M780M6QYLemiIF5bGg=UHg<0K6EQL5miIF5bGg=UHg<0NFEQLUmcIF=c06AQNG=OM6QYLem]Kfid
+J01THGUOLfESL`1cIF=c06eYKW<0J6meLW<0KFAQN@1]KfidJ01iIF5b07AYKFEOLgAbJFiW06i_
+Gf9iM6Ec06E^I5m`M780KFm^M6QOI65iL`1dKEmcIF<0M6eOKFU^07A]GfQ_MG80M6eOKFAQN@1d
+KEm]Kfh0M6eONFEQLP1dKEmgI65i07A]GgUTHGT0M6eOJG=TLg@0EUIEE4U<Dbi306ecI6mc;V<0
+CE=4Ce<0IWE\K5mcL6ES06AUIV5eK7AOIGQd06AUIV5eK7AOKV5]I@1`LVEQKF9\I@1`HGAXGg1Q
+LWAc06EhM6E^LfU_KP1^HFeU06=_KVIYLVeOLgAb065^LgMULP1UN5mVJFaU07=dHG@0LgAQM5mR
+MFIVIG80IFm\Gf=_MFid069S07A]L5mRMFIVIG80KgIULWMbJGAUGfIYK6Ec06I_LV=UI5mUN7@0
+IVU\IEmXHFiTK6D0J6AbIUmcL6ES06m`IUmcL6ES07A]L6IOLg1UH`1dKG1VGfEhM01dKG1VGfiQ
+KFD0L6mcM65]HVaU06aUKP1bIGAeLViOHWEVIVEb069eIUmcJGYU06eQN5mRNGAUL`1dIFe`075e
+HFaOKg1VJFaU075eHFaOJG1VJFaU075eHFaOHG9bHGT0LEmcIG1OLgAb075OJFidLVmOLgAb075Q
+LVMf075QLVMS07A]L5maLgAbGg1dLP1aMV5\MFEOL7Ab075cIG1OL7Ab075OKVl0LGEQK5mVKgE^
+I01QLVMOKVl0HG9W07A]L`1`HGAXGf=_KG1_KVE^M7<0LgAQLWAOL7Ab07A]L5mVMFa\Gg=`IF<0
+M6QUGgAYKFD0LfEdGgAjGg=dLP1dNUmcM780KG=WGg=dLP1cM65dMG=OLgAb07A_Gfa_IfIYK6D0
+M6mOLgATIG9b06IYK6EOM6U]I@1VM6U]I@1VM7<0J65^I6aU05A3GgEdJFeU07=dGfAUMP1cM5mY
+KVl0LgAOKFmTI@1cM5m^K6U^J`1cM5meJF@0LgAOIfUT07=dGg9TIGH0LgAOLfUjI@1cM5mQM6U]
+I@1cM5m]M6U]I@1cM5mSM6U]I@1VM5mdLfES06IdGfeYKP1VM5mXKgEb06IdGfAQN@1VM5m]Kfid
+J01VM5miIF5b04eCA4mC;T<0~2
diff --git a/support/vvcode/binaries/msdos/vvencode.boo b/support/vvcode/binaries/msdos/vvencode.boo
new file mode 100644
index 0000000000..164164d92d
--- /dev/null
+++ b/support/vvcode/binaries/msdos/vvencode.boo
@@ -0,0 +1,1308 @@
+VVENCODE.EXE
+CE[P06L00@0P~3oonV3800~6?P000040ne1ZLP00~J0@00~~~~~~~~~~~i^^L8;XTFS@:d<<dQ
+Rbh208\N;02>fZ>B08`6T0297X`0RBjX0>R10L@nRP2;ah_H^Omoo?:^hf539SP5MOJ0cH3gfHT>
+RP2i0@3Chh?328?Sn8TNSP2<fR_ZRchN:h7o009c1kl00XTn7R^1anhkLRP3?SHZLR:a1=?_Ac__
+LQV3?Qh[07@7Pchf:P1e3[l043__M`N;oN\3jM`1Rml3fXTNX0297Z@0XI00:mR>`;A:EldQGm?W
+nXkBRnOk<l0^SPJ=0[l`<;W^>b_?o?>ZPch8:QAfAh0nTP03LT1g1h0nT`0NLSNh0ERk0P3=8G8Z
+]6N;7PPZcB5b8;A8^`40cB5b5d2SZ018S\2dBLdQLPZh0ERk~2cB5c0nUK0K@0cAZ95YH0R@jH
+00[0M0bh@02>`;]`02K61`4ckBj>1Xd2_QP`_c0`j=00ocJ80?lfQP3o=X@0j2DRD>PVDRj>1Xd2
+EUNn<32o<33X[@1OG\=FEbj>1Xd2<l2;l;T_02H2183D04KRmbeL3G@9^AT0^Rl0j=`0Gek3Rnbd
+C8Y60\dQ^@h0^TP0jMD07[P0=LdQRAid08`6MP2h13G=8HTNN02<1WX0^0DecB697W`0S0In0;P6
+=LdQRAj008`6PP2h02F<bXkJ^Z01cB4O`ajh02G55W@0cB4O7[P49LDFN03=8AlN^0DUaAIl0<dQ
+7ajh1RG55X00cB4O`h7n631d13;Tj`:doh_GRmhkgg@S9X0oog@HPOhH<7@69SYW0N\49SQW0GL6
+9XYW0H_CPl<6jmTkeg@KRmXVP3l09\H7o`Id1bKoG`87jk4VoeL21n^Z`kA0^`80cB73^Ah0^UH0
+;XhNS@;Xj_nh0`1@j0AA~20@1ERnb1k:`0EULi9Y`0LP?XkVF3?W`a0gD<adKj~2adKhoGo[2\M6
+nP00adKh012hR@E@ogKhj;lQFEV9A_j3?W`a0gEm^28aD?mfoS?0^_eoD5;XO4B3a0R9E_:9A_23
+O_80O`]l1X=nl01c0nW:0X]6lX]Fl04FRS4A1X`aP3iA=P5e=[RC1E2hj2Q@j41bFEWo=X`aocJ:
+<Omfl_mfl;RK1E2hj2Q@j2EbPl@<^=85D;SX:53X5g9IFLM6jP00jcVh8S5@ogKn<l2j;@1@D^PC
+@h?428UFlXU6l8=nlP1o2gD6Pgk`07L3jDd2RdKbReK`0AJ:<A46S360?^P00GDN<oo[5H]NoXX1
+]03Ah8_HRXNN<H]NoXP1Ac]nl7;V<oo[=X]NoZ2><C819?nd0=7PdN2;f8^7ESJ;Ue@fD5:;5Y0a
+XHha\@SXeE1K<mQH<l:ST3697XhaAc]nl7;5RdKbReK`RDKfREKdRdKnRDKljJl1Pcil<@=d0nVY
+08=njP1d0nVP08=nmP1o47`6Pgkd:g<8ReKfRdKdj`Dcd[P[08UFkXU6k3?0^P01D5;oM_;oM_3X
+VTn8AZhc`;X00E1BogKbogK`j9I?R4J_<oo[58_OPl<2SDJ^0mQCReknRP5KR0M7>gk\L^N=QUCo
+D8]6kX]Fk8?20QD0051BSDJ^D>Sj5H?428UFj8U6iX]6kX]Fk2UFm1U6mX]6k056o<M6jP40jdf3
+O_H0Oa1l1X=nm2ec28]FmX]6m>\5<m:h;@29E^j9A^b=QUCoD?mfk_mfk?mfo>RV5H?428UFj8U6
+iX]6kX]Fk2UFm1U6mX]6k056o80nm001MF:;A^R;E^J3`SdE~2RDKTREKRXCX`RaHh<0=FhQ=6
+i3\6<S1l?GD6>aH`<78e^3H`D;Rb<53o=S@`j;P?Pl@6XCX`RaHh<04F6S4A1Q`aa`Hj<000a`Hh
+<000ocHf<>Q?5UV=QUCoD?lfUS7XTWiIFOlfUS7XP85IadKP~2RDKN^;8`D?lfUS7oM^3oM]kX
+fDV3a0R;A^2;E]j3`P4E~20AHh<146>S23O_H0OP?YB?ie2H=nm01f0nTmo^T4oEmNRnEM`eF;
+k87\h01F>BJL0783j:mR^28aD;Sm053XC0UIFKSD1E2hD@1@j8lNFEV;l3?0D3?0D5Hc`52h8S5@
+j:M6Pl@:P3kF005e2<L6=3010>\EP3ie<@5e2<L6=3000>\6a`Hd<080^9hcD?lf=31F^<L0D>S=
+9h?42;PI1U2h2PI@^006D;SR1E3o=Y@aj:amPl@:^9hcD?lfU36h0@1@j;Y7Pl@6^28aD;PU1U3o
+=Y@aj8QmPl@6^9hcD?lfU36h0@1@j9I7Pl@6P3kF005e1KQa1^\3^7D6D;Q;1U3o=Y@aj5QmPl@6
+^9hcD?lfU36h0@1@j6I7Pl@6^9hcD;Qh1U3o=Y@aj3AmPl@6^9hcD?lfU36h0@1@j497Pl@6^9hc
+D;RN1U2h0@1@j317Pl@6<l1@j1iGFE9@j:a6FEV0?WDa0GD3jCD1^28aD8e6T53X7GmIFHe6T53X
+RcUIPgkXog@;RekXdN>;Q`T1j`>hk`I@^<T6D?lfU37X`7b3a0JhWS=@ocJD<KP1053XcTJ3a0J3
+O^[oM0^;G^[Ahh^73`7[0kPM1e2hm`I@ocJD<NR;O8?41[RN<e3o=Y@a^040D>RIAX?41X=nl_me
+1X=nl?md7_mfl_mfl;PU1e3o=Y@aj5UlPl@8^9hcD?lfU37[2;RN<e2hC0M@^040D>QMAX?41X=n
+k_me1X=nk?md7_mfk_mfk;Qg1e3o=Y@aj1elPl@8^9hcD?lfU37[2;RN<e2hWPM@^040D>PQAX?4
+1X5nmP20M@J3O_@1M0goM_KoM_CXHcAIFN\3^?07D;S91e3o=Y@aj=EkPl@6^9hcD?lfU36h0@1@
+j>=5Pl@6^28aD;P90E2=AY1@^<d0D>Q81h?42;PR<E2h3`5@SDJ@D;Rk053XM`F3a0Rh8S5@SDJ@
+D;SI053Xf`N3a0Jh8S5@SDJ@D;SO053X[@^3a0JhTS5@^28aD;S[053XfPF3a0Jh3SA@^400D;Re
+053XoP>3a0JhCcA@^001D;P>=52h@01@j9d_Pl@8P3kX005d0nV00?lfj@2=QR3oD>QCOEUI^8L1
+D;RJ<E2=QR3oD>Sb;h?41_lfVS6hn0M@j4DaFET;`7A<ocJL<OlfVS6hoPM@ocJD<NSWNX?42;RN
+<e3o=Y@a^080D>SeA8?41[Q8252h;0Q@ocJD<NS3NX?41[RN<e3o=Y@a^?ooD>SAA8?41^\B^9hc
+D;Q>252h0@1@j;e4Pl@6^28aD;Sm053XQ@1IFKRb<53o=S@`E[P30E3XK`63a0Rh<31@^?40D;Rb
+<53XM@V3a0JhE3I@^;S]^R23D5:h005@j2\QPl@8a`J@<Oooa`J><Oooa`J<<@00a`J:<@00a`HL
+<@00a`HJ<@00a`Hj<000a`Hh<000a`Hf<040E^RJFUWo=SH`j<0AFEj;iEg3EH_\EUN;OPB;MPHi
+9Y`0LP?XNej0O@<1M2NhUPQ@^7H8D?lfU37XhGV3a0JhWS=@ocJD<KP4053Xkd>3a0KXldB0O5<1
+M@O7A578:>\hP3iA=P5e:KRS252hj2Q@j?mZFEUF^:\8D;SX:53XlFZ3a0Jhb`Q@^>PXD>SSJUUI
+E^S4=eV9A563O540MBAF^<d8D?lfU37XLWV3a0JhWS=@ocJD<KP4053XP4>3a0KXQ4B0O5<1M0UF
+j5TiF@[0MCV0?U4f0GDY^>\8D;SX:53XSVYIFEJhl`Q@^>PXD>R0JX?41[PL2E2hj2Q@j79ZFEW6
+A5<1E^PW@EUOGUg3EH_\EUN;OPB;MPXi9Y`0LP?XOeg7A5400<M4F040adAJ0@37A5koolM4G?oo
+adARooo7A63ooh1m0`5d0nUo0;PN2E3oM@CXb7YIF@_0MA[6A5<1^209D5KXiGYIFLM4DMPXadAJ
+0@3[Dome15KXd7YIFEJh9`U@ogH6j2XdPl@6P3iA=P5e:KP[2E2hj2Q@j=1YFEUF^3<9D;SX:53X
+`VV3a0JhFPU@^>PXD>RdJEUIE_mf2>PM=eUIRDAAjfNhG0U@E^QjNUUIES?0D3?0D?mf1S?0D>Ql
+>H?42UJhG@U@<l1@j<4cPl@6P3iA=P5e:KQQ2E2hj2Q@j6MYFEUF^6T9D;SX:53XFFV3a0JhT0U@
+^>PXD>Q;JEUIE_mf2>Rd=UUIRDAAPgaA07DTE[RB2E3o=Y@aj=IgPl@6^9hcD?lfU36h101@j>A1
+Pl@6j>Q2E[Ra2E3o=Y@aj;9gPl@6^9hcD?lfU36h0@1@j<11Pl@6P7aC0G@9E^RL=eT:`7DiP3iA
+=P5e:KSH2E2hj2Q@j=5XFEUF^>09D;SX:53X`fR3a0Jh2@Y@^>PXD>ReJ5UIaTAC0EKXJSmIGeiM
+`eF;k8?\LUIGRgH4Rgh8>BJL0783j;mKP7`30GENog@4SDJ>D>QMNEUISDJ>D;P;2U0c`53X]3:3
+a0IGogH6SDJ>D>Pa9X?41YR9A_j3O_h0MBN=AXi@^0l:D?lfU37Xl7J3a0JhWS=@ocJD<KP4053X
+oT23a0KX0T;[AH0nDCH1MBNh=PY@^>PXD>PIJ5UI^3h:D;SX:53X36QIFKQ_2U2hj2Q@j?mWFEVh
+L@Y@SDJ>D>S@N5UI^80:D5OXaWQIFHe6SU2h`@Y@ocJD<NR2MX?41[RN<e3o=Y@a^040D>R@@8?4
+1UNhj0Y@ocJD<NQQMX?41[RN<e3o=Y@a^040D>Q_@8?41X_71B00D;PA2e3o=Y@aj3]fPl@6^9hc
+D?lfU36h0@1@j4U0Pl@6Gej;iEg3EH_\Pn`2EUN;OPJ;MPXi9Y`0LP?XSU[oMPSoMPCXnaMIFHU6
+oX=no_md28]6oXU4F^\XP7aC0GD7adAJ0@3[6h=mF_md28]5FXU4F^\=PgaH07D2j`37A5X108=l
+F_md3X]4F]7PReh80mR;1n\3^60;D;Pj2e3o=Y@aj:9ePl@6^9hcD?lfU36h0@1@j;0oPl@6Gej;
+iEg3EH_\Pn`@EUN;OPPi9Y`0LP?Xn5VhK@]@^042D>SU5EUIR@F;GPB0O`<1M@n;GPCoM`Co=NR3
+MeUIje4c`52=A_1@SDKfD3?0D?mf1^SR?H?42_le<l1@SDK`D8e6mU0c`53XJCJ3a0Z;=N\KRPBH
+RmSfQl4W17@:RPBHD>QlCeW[0XX4R0A6P3`0MN3o=KQk2e3o=Y@aj>idPl@6^9hcD?lfU36h0@1@
+j?`nPl@6Gej;iEg3EH_\EUN;MPB;OPHi9Y`0LP?XA5V0O0<1M2Nh`@]@^:4;D?lfU37XZWB3a0Jh
+WS=@ocJD<KP4053X^3j3a0KX_3nhd@]@og@4j8afFET;`7D@^=<;D5OX[GIIFLI5D`7[2Omd15OX
+WWIIFEmNGL=ERnb3k09FEh]n1X]f2STVW01b0nSCF?mf2?mf1>PJ5eUIRDKnPgknog@8RdKnRDAH
+jb20O5<1M@O7A5P00>\CPgeHog@8RdEHRDAHj`G7A5P008]4F0_0M0Lm0@1d0^\2jbKoM5Rhf@]@
+ocJD<NSdLh?41[RN<e3o=Y@a^0@0D>P2?X?41^P6?h]4F=7PReh80mSo=kSm2e3o=Y@aj<EcPl@6
+^9hcD?lfU36h0@1@j=<mPl@6Gej;iEg3EH_\Pn`4EUN;OPJ;MPPi9Y`0LP?X65QFogH4j2XGFEV9
+E_j9A_b3O_koM@J3O_coM1R;A_j;E_b9A5j9E5c7A6;oolM4H?oojeJ0O5<1MAK7A5koolM4G?oo
+adARooo7A63oon\jPgeNogD6PgeLog@JRdENReELRDANREALRdERReEPRDARREAPjaC7A5koolM4
+G?ooadARooo7A63ooh=lH_me6h=lH?me5KRN<e2h8`a@^040D>P??H?41^WV08=lFP=eKX=lHP1l
+5gD6PgaP0G8?PgaR07`bO`N1O63mOgHYogARogAP^5<<D?lfU37X]G:3a0RhWS=@ocJD<KP4053X
+`cb3a0KXacgoM6;oM62hN`a@ocJD<NR<LX?42;RN<e3o=Y@a^040D>RJ?8?41^]bPgaJ0WE\PgaR
+07`GM@J3O601LPn3O680O39o1h5lH?moMRWoM6;oM62hXPa@ocJD<NQ1LX?42;RN<e3o=Y@a^0@0
+D>Q??8?41^QC?OmdH_mdH;S:353o=Y@aj1QbPl@8^9hcD?lfU36h0@1@j2HlPl@6PgaNogDKPgaL
+ogDE^9hcD;Sa352h0@1@j0PlPl@6jNH0PgaJ0gE^PgaN07`GM@J3O5`1LPn3O5h0O39o1h5lG?eo
+MRWoM5koM5bh8@e@ocJD<NR^LH?42;RN<e3o=Y@a^0@0D>Rl>h?41^S0??mdG_mdG;Q93E3o=Y@a
+j8EaPl@8^9hcD?lfU36h0@1@j9<kPl@6jg:3O5X2MFb3O5h0O1Me1X=lG05b3h=lGP1l<Wl7PGaL
+ogmf:OmdG_mdG;Q`3E3o=Y@aj3YaPl@8^9hcD?lfU36h101@j4PkPl@6j4`logANogAL^9P=D?lf
+U37X4G63a0RhWS=@ocJD<KP1053X7c^3a0IOGX_UGL=ERnb3k0IFEh]n18]f1STVW01b0nQTEH1l
+0`5d>H0nDCH1MBNh_`e@^>PXD>PLHUUI^<L=D;SX:53X3f9IFKSd3E2hj2Q@j09RFEVhWS=@^?H=
+D>W:081mD`5e7lI40`2hWS=@^2@>D;P2053XYcZ3a0JhWS=@^5D>jmO7A_koolM6o?ooSDKlD;R3
+3U3oM0CXag23a0J9A_Z3O_X1M@j3O_h0Ob5e1X=no01g6Omd1;R73U3o=Y@aj3]`Pl@6ocJD<NPE
+1EV3O_h0ObEl1X=no0Ac7C?0^P@0D5:hZ@i@ocJD<NP@L8?42?lfU37XjPAIReKnRdKl\@[XOd2;
+GPR9E`:91omfo_mfo;S<3U3o=Y@aj>5_Pl@8^9hcD?lfU36h0@1@j>liPl@6Gej;iEg3EH_\Pn`4
+EUN;OPJ;MPPi9Y`0LP?X=5CoMPCX^1AIREKnRDKlPGkn081e1X=no05d3X]6oX]Fo8U4IXUDI>\g
+P7aC0GD<adAV0837A6@10>\UPGeV081e1X=mI05d3X]5IX]EI8U4IXUDI>\:adAV0837A6@1085l
+IP20M@J3O6@1M0goM6KoM6CX]BMIFN\3^1`?D;Sf3U3o=Y@aj2M_Pl@6^9hcD?lfU36h0@1@j3Di
+Pl@6Gej;iEg3EH_\Pn`ZEUN;MPJ;OPPi9Y`0LP?XNU?o1H\5?F<0ORNhH`1@^2T?D?lfU37XgFj3
+a0JhWS=@ocJD<KP4053XjcR3a0KXkcV=A]I@<l1@D;Q>3e3X>PF3a0R=A]I@ocJF<NRXKUUIocJF
+<NRFLEW7A_P008U6m[Rb<53o=YHaogKhogKfj>liPl@8RdKhReKfPl815@000AHh<146>S3o=KQL
+3e2hC`m@ocJF<NQMKX?42?lfUS7XBW5IadKh~2RDKf^;8`D?lfUS7oM_SoM_KXXcV3a0R;A_R;
+E_J3`P4E~20AHh<146>S1Fj<L?FOlf>S3o=SP`R`E8D;QO3e3o=Y@aj0I^Pl@:^9hcD?lfU36h
+0@1@j1@hPl@6ocFhQPm@SDKjD>STKH?41UJ=A_Y@j9L]FEUFogH4j9L\FEV9A563O540MBAF^8`?
+D?lfU37X^Ff3a0JhWS=@ocJD<KP4053XacN3a0KXbcQOGX_UGL=ERnb3k2@i9Y`0LP?X4E:QT36;
+5XhaPo;o=OooXi0aRAJ><He6g50c`51@^:\?D>S]0h?428e6g53o=YHaj5]]FEWo=YHaj4U`FLM6
+oP00RDKl^;8`D?lfUS7oM_koM_cXXSR3a0R;A_j;E_b3`P4E~20AHh<146>S3o=UD1^;8?D;R\
+3e3o=YHaj0i]Pl@8ocJF<NSkKeW7A_h008U6o;Rb<53o=YHaogKnogKlj5@hPl@8RdKnReKlPl81
+5@000AHh<146>S3o=X`aocJ:<Olf?06h_`m@^;D?D?lfUS7X^6b3a0co=YHaj:E_FLM6oP00RDKl
+^;8`D?lfUS7oM_koM_cXoSN3a0R;A_j;E_b3`P4E~20AHh<146>S3o=Y0aocJ><OlfB`6hcPm@
+^<8?D?lfUS7XHVb3a0co=YHaj4m_FLM6oP00RDKl^;8`D?lfUS7oM_koM_cXZ3N3a0R;A_j;E_b3
+`P4E~20AHh<146>S2Q>S2;5SP`0AHJ<A46737o=SX`ocHh<?lf=S2hd@m@ocJD<NP1K8?42[RN
+<e3o=Y@a^040D>P?=X?41X4nLc78:7@8^28aD>R63EV1?P<af2Qd2;Rb<53XMPeIocJ@<OlfSS6h
+n0m@ocJD<NRiJh?42;RN<e3o=Y@a^040D>S7=H?41_lfS37o=XXa^28@D?lfU37XTF^3a0RhWS=@
+ocJD<KP1053XWcF3a0Ko=Q`aocHJ<KQ9453o=Y@aj6U[Pl@8^9hcD?lfU36h0@1@j7LePl@6ocHf
+<;Q`453o=Y@aj4E[Pl@6^9hcD?lfU36h0@1@j5<ePl@6PCk_<nPXM0RhWS=@j<X<FH_UGL=ERn`i
+9Y`0LP?XUDnhca1@^<0@D;Rf452hUQ1@^>PXD>Q>G8?42_mf1;SK452hj2Q@j3eLPl@6^>X@D;SX
+:53X;eaIFKPU4E2hj2Q@j29LFEWo=Zl0^4TAD;Po4E2hj2Q@j0eLPl@8^6HAD?lf]@2hHa5@^4`A
+D;SX:53Xle^3a0[o=QD1^;0AD?lf4@6h[Q5@ocHC0KR\4E2hZ15@ocJk0;RU4E2hJQ5@^>PXD>S1
+Fh?45[S<4E3o=^\0^<TAD;Rb4E2hj2Q@j:MKPl@:ocK10;SJ4E2hd15@^>PXD>RAFh?42;Si4E3o
+=\L0^?HAD;SM4E2hj2Q@j7MKPl@:^3LBD?lfc@2h=19@^?dAD;SX:53XGE^3a0[o=]<0^4DBD;Pk
+4U2hj2Q@j4MKPl@8^5hBD?lff@2hFa9@^4PBD;SX:53X;E^3a0ZhNA9@ocKa0;Qf4U2hHQ9@^>PX
+D>PCFh?42[RD4U3o=]l0^94BD;Qm4U2hj2Q@j?UJPl@:^;<BD?lfi@2h\19@^9PBD;SX:53XgeZ3
+a0[71U8f103XZ3AM`eF;k8?\2UIGRgh:>BJL0783j>e=^;LBD5OXTf]IFEOXDFaIRo2;GPJ3hcn:
+Q`hdRmj80DK7A_H00>Vm08]N10=NmXX7V=7hdOR9A_j;GP@3G_J:1iRa1=?P9C00ReKf@X]N10?J
+D8X7V;44doPU3`1J2m29E_b;A_I0Reh40mR:1iSAh=7P9C`0ReKfPl82Reh40mY@RPNH\@KCn2D3
+05X;d8UFnX]6mPD208]N10?HRPNH9Cl0RDKhReknPn<oRXL>=8_NR056ReklPn<oRXL>=8_NR056
+RekjPn<oRXL>=8_NR056RekhPn<oRXL>=8_NR056PdKf0h]6mS]61W<3jCSoRmk60@2h^Q9@EnPf
+JUUI^;`BD5OX;6YIFEOXDV]I<m;[05mNRnEM`eF;k8?\15Hi9Y`0LP?XaDbh\S1@ocHf<;Rn4U3o
+=Y@aj2eXPl@8^9hcD?lfU36h0@1@j3\bPl@6ocJ<<OlfRS7o=SH`^>DBD?lfU37X0FR3a0ZhWS=@
+ocJD<KP1053X3c:3a0Hcm^]?RmkAhong6@6h31=@ocJF<NSEIh?41_lfUS7X`VYIadKn~2RDKl
+^;8`D?lfUS7oM_koM_cX6c>3a0R;A_j;E_b3`P4E~20AHh<146>S16RmkAhh>o6@40MJJh:A=@
+^10CD?lfUS7XOfN3a0Ko=YHaj6aZFLM6oP00RDKl^;8`D?lfUS7oM_koM_cXaC:3a0R;A_j;E_b3
+`P4E~20AHh<146>S2hGQ=@^4lCD;Pc4e3o=YHaj35WPl@8ocJF<NPNJUW7A_h008U6o;Rb<53o
+=YHaogKnogKlj7LbPl@8RdKnReKlPl815@000AHh<146>S2hJQ=@ocJF<NS[IUUIocJF<NSIJEW7
+A_h008U6o;Rb<53o=YHaogKnogKlj38bPl@8RdKnReKlPl815@000AHh<146>S23OP@1M0?Ye0@c
+`53o=U01^7DCD;Q\4e3o=YHaj99VPl@:ocJF<NQoJEW7A_h008U6o;Rb<53o=YHaogKnogKlj=Pa
+Pl@8RdKnReKlPl815@000AHh<146>S2hQ1=@ocIT0KR14e2hN1=@ocJF<NQ0IX?42_lfUS7X;FUI
+adKn~2RDKl^;8`D?lfUS7oM_koM_cXQS63a0R;A_j;E_b3`P4E~20AHh<146>S20?^P00G@3jJH0
+ocJL<Olf@@6hU1=@^8\CD?lfUS7Xi6F3a0[o=YHaj=5XFLM6oP00RDKl^;8`D?lfUS7oM_koM_cX
+:S63a0R;A_j;E_b3`P4E~20AHh<146>S2h`a=@ocI60KS04e2hUa=@ocJF<NRBIH?42_lfUS7X
+OfQIadKn~2RDKl^;8`D?lfUS7oM_koM_cXf323a0R;A_j;E_b3`P4E~20AHh<146>S3[D[SE4e3o
+=T41^=8CD;S94e3o=YHaj3iUPl@:ocJF<NP[J5W7A_h008U6o;Rb<53o=YHaogKnogKlj8@`Pl@8
+RdKnReKlPl815@000AHh<146>S2;7WXadN?o]`T1ocIO0KST4e2hfa=@ocJF<NSVI8?42_lfUS7X
+dfMIadKn~2RDKl^;8`D?lfUS7oM_koM_cX;323a0R;A_j;E_b3`P4E~20AHh<146>S2;7W`adN?o
+]`l1ocIJ0KS`4e2hia=@ocJF<NR>I8?42_lfUS7XNfMIadKn~2RDKl^;8`D?lfUS7oM_koM_cX
+e2n3a0R;A_j;E_b3`P4E~20AHh<146>S23?X0aogD:Pcin<Ome0nW408<nQ37oM@N3?X8aogAP
+ocJ4<OlfPS7o=X0aocIn<OlfJ@6h0AA@^?<CD?lfUS7X4FB3a13o=YHaj?iVFLM6oP00RDKl^;8`
+D?lfUS7oM_koM_cXEbn3a0R;A_j;E_b3`P4E~20AHh<146>S3[E_lfP37o=WhaocIY0KP>552h
+11A@ocJF<NRiHh?43?lfUS7XYVIIadKn~2RDKl^;8`D?lfUS7oM_koM_cXobj3a0R;A_j;E_b3
+`P4E~20AHh<146>S21?XPa081e1h<nQS41M5co=XPaocJ6<NSO6eUID?lfO@6h6QA@^14DD?lf
+US7XCV>3a0[o=YHaj3]VFLM6oP00RDKl^;8`D?lfUS7oM_koM_cXU2j3a0R;A_j;E_b3`P4E~2
+0AHh<146>S3o=WP1^2<DD;PM553o=YHaj01SPl@8ocJF<NS]IEW7A_h008U6o;Rb<53o=YHaogKn
+ogKlj4H^Pl@8RdKnReKlPl815@000AHh<146>S2h3SA@^2lDD;PV553o=YHaj;9RPl@8ocJF<NRO
+IEW7A_h008U6o;Rb<53o=YHaogKnogKlj?P]Pl@8RdKnReKlPl815@000AHh<146>S2h;SA@^3\D
+D;Pb553o=YHaj6ARPl@8ocJF<NQAIEW7A_h008U6o;Rb<53o=YHaogKnogKlj:X]Pl@8RdKnReKl
+Pl815@000AHh<146>S3o=Y8aocHg0KQ7552h?QA@ocJF<NPBHX?42_lfUS7XofAIadKn~2RDKl
+^;8`D?lfUS7oM_koM_cXF2f3a0R;A_j;E_b3`P4E~20AHh<146>S3Y@07o=WP1^50DD;Q:553o
+=YHaj<5QPl@8ocJF<NR^I5W7A_h008U6o;Rb<53o=YHaogKnogKlj0L]Pl@8RdKnReKlPl815@00
+0AHh<146>S2h3SA@^5`DD;QC553o=YHaj7=QPl@8ocJF<NQPI5W7A_h008U6o;Rb<53o=YHaogKn
+ogKlj;T\Pl@8RdKnReKlPl815@000AHh<146>S2h;SA@^6PDD;QO553o=YHaj2EQPl@8ocJF<NPB
+I5W7A_h008U6o;Rb<53o=YHaogKnogKlj6\\Pl@8RdKnReKlPl815@000AHh<146>S3o=Y8aocHf
+<?lfKP6hMaA@^6\DD?lfUS7Xcf23a0co=YHaj;aSFLM6oP00RDKl^;8`D?lfUS7oM_koM_cX5Bb3
+a0R;A_j;E_b3`P4E~20AHh<146>S1NRnEM`eF;k5Hi9Y`0LP?X1dG71U8f0@361U4f0;h045KX
+`D5IXi@aPcjD<@1e75JhWaA@^7XDD;SX:53XZU63a0S71U8f103XLb^0?U4f0GD`^;TDD;SX:53X
+S55IFKS[550c`51F^<4DD;SX:53XMe63a0ZhmAA@^>PXD>QYDEUI^?LDD;P0253XQ01IFJ>H<KP3
+5E2h00Q@j7@0FEVSUS6h0`5@^?d0D;R_052h4QE@^0lED?mf1_mf1>RZ8h?43X0na001M@Rh5QE@
+j:SdFH0n\P01MAO61U4f0H0nbP01M0_61\X00LL6b`00080n0041M0Rh9AE@j7_dFNQHhNPEg^Sb
+lNRd:S?0j`1NGL=ERnb3k09FEh]n1STVW01b0nSd@h]f15KX^D1IRDKnPgkn07DZEc?0D5JhGaE@
+ocJD<NQ>Gh?42[RN<e3o=Y@a^0@0D>QL:H?41^QP:^\dP3iA=P5e;KR:5E2hj2Q@j7M@FEUG<l1@
+E[RB5E2hj2Q@j6E@Pl@:^<LED;SX:53XEe1IFH]6o^\0Gej;iEg3EH_\Pn`2EUN;MPPi9Y`0LP?X
+IT?6A080ad@3~2^<TED;P10U3XB_mIFH_hEkSL5E3oMPKX8Un3a0J9A_j3O_h1MB=G^>HED?lf
+U37XYUj3a0JhWS=@ocJD<KP1053X]2R3a0K[;Old^0PFD?lfU37XPUj3a0JhWS=@ocJD<KP3053X
+T2R3a0KoMPKoMPCXnQ=IFEOXh3iIGej;iEg3EH_\Pn`2EX]f13TVW01b0nS9@X=lD@1d=?mdDNQa
+C5V9A_j3O_h0M2AF^2\FD?lfU37X8Uj3a0JhWS=@ocJD<KP3053X<2R3a0KX3aaNRnEM`eF;k5IG
+RgH4>BJL0783j7U2P7`30G@dP3iA=P5e9kQ35U2hj2Q@j35?FEVhBaI@^>PXD>PTCeUI^84FD;SX
+:53X5dmIFKSoonV303?0D;P1053oM0CoMPKXn@B3a0R;n8_OPo\3M`oAhbkoYmTVjao[7N\KjaWo
+M0BhPaI@ocJD<NR1GH?41_lfU37XFo9IP3iA=P5e<kRG5U2hj2Q@j;U>FEV;am7PReh60mSo=kRO
+5U2hj2Q@j:5>Pl@6^<lFD;SX:53XTdiIFH_7jG[oGeiM`g\VMbIe9WTVEH_\EUN;MP@i9Y`0LP?X
+Wd60O0<1M3>0?U4f0GDW^=4FD;SX:53XEdiIFKSI5U2hj2Q@j4Y>FEVh2aM@^>PXD>PmCUUI^?oo
+jg\c`52h0@1@og@4ogH6j204Pl@8RoR;a`_0M0Lm0@1d0^\2jaWoM0Bh3AM@ocJD<NR_G8?41_lf
+U37XRO5IP3iA=P5e<kPO5e2hj2Q@j>M=FEV;am7PReh60mSo=kPW5e2hj2Q@j<m=Pl@6^5<GD;SX
+:53X`DeIFH_7jh=OGUg3EH_\Pn`6EUN;MPB;OPHi9Y`0LP?Xd420O0<1M3N0?U4f0GDW^5DGD;SX
+:53XR4eIFKQM5e2hj2Q@j7]=FEVhVQM@^>PXD>Q^CEUI^_oo^?oojAL1adKnooo7A_coohe6o52h
+W1M@og@4j5YLPl@6RDKjPgkj0G@Iog@4^:0GD?lfU37Xg5^3a0Ko=Y@aj;K`FH=mFP=eBH=noP1l
+5gD6Pgkl0G8?Pgkn07`cO`N1O_cmOgHZogKnogKl<l2joGm@DS?0^P40D5:haAM@ocJD<NR?Fh?4
+4?lfU37XJO1Ijdf3OEX2MDN3O_h0O1Me1X=no05b3h=noP1l<gl7PGklogmf:_mfo_mfo3?0^_mo
+D58c`;X1051B^?XGD?lfU37X@5^3a13o=Y@aj1[`FH0nDCH1MBjh;aQ@^>PXD>QhC5UIogKnogKl
+^3LHD;SX:53XIDb3a0RhMaQ@^>PXD>QGC5UIReKnRdKljNKnGej;iEg3EH_\Pn`4EX]f13TVW01b
+0nQS?h1l0`5d=X0nDCH1MBNhNAQ@^>PXD>PKC5UI^84HD;SX:53X3TaIFKRm652hj2Q@j05<FEVj
+082h0@3[Dh=l101d28]L180o07D:SDKlD>RT=5W[<omd1>QV1UV9E_j9A_b1O_h0P7DOPgkl0GDI
+og@4^;lHD?lfU37XHUZ3a0Ko=Y@aj3c_FH]FoX]6o>^[GX_UGL=ERnb3k0AFEh]n1STVW01b0nRk
+?P_oM0F0?@1e1[SoonWg0<M6o?oo<oKYV02;a[X50?OZReh80mSo=nP3GEV9A_koM_iGRlJj1@3g
+jX]N20?HocOX5Q63a0H;`7EVP3iA=P5e=[SW652hj2Q@j2m;FEV;a[X50?OZReh80mSo=kS_652h
+j2Q@j1A;Pl@6^1XID;SX:53X1T]IFH=no01m1HUfo>\N^9hcD;PL6E2h0`1@j;DSPl@6Eomf1>PQ
+3eUIjEWoAX_6^PD0mnZ;GPP3f8<o07@3jECoPgkl07deP3iA=P5e:KPe6E2hj2Q@j:i:FEUG^3dI
+D;SX:53XX4Z3a0JhL1U@^>PXD>RBBUUIj@_oj`J;A_cY1_mOGX_UGL=ERnb3k0AF>BJL0783j9lm
+<lW[FlM6oP00RDkl<oK[<h]6oX]Fo8?R0BD000_@M1:;A_j;E_cAj=7J<eH6<dH8j`Z;A_j;E_cA
+j=7JRDKnREKlAX?n27;8Rl7Ah=7PReh:0mR;A_j;E_b9A`:95d4kCPAbX5j;iEg3EH_\Pn`2EULi
+9Y`0LP?X9Cf3OPH0M0R;GPJ0?`1e1[SnonVC0?mf1^QmFeV9A_jooolcm^]_Pgh807DBRlKAh8]N
+10?HocOXGU]IRDKnPgh:07DYogKnogH6RlKAh8]N10?HocOXK0n3a0H;`7D<PoooM@B;o^\3_oko
+jbOoM_koMPJ;a]7PReh40mSo=nS^3X?41P_0M@b3oome18_nj`>oo_m6RlKAh8]N10?HPcl0MH>;
+anUZoemNRnEM`eF;k8?\2UIGRgh4>BJL0783j6@lP3iA=P5e<KQb6E2hj2Q@j299FEWoM@KoM@So
+M@ZhNQU@^>PXD>P<BH?42[RT6E2hj2Q@j?i8FEV0?U4f0GD`^:HID;SX:53XjTQIFOleogD2ogD4
+^:hID;SX:53XeDR3a0Zhf1U@^>PXD>S7B5UIPgd:AWd7<m8c`>UT0LM6oP00adKl~2adKf\PO[
+Ah56o6d1PeKn08]6m[\409Wgn`_BMBj;A_JkI02Imo\;dWD=RdKf^i01VOOk2m9e1KP10>\2<l0m
+0@1e28=6o063E_h0odKfRdD:1F`7>dKfOjk7A_H00>]MRekfdN>;QdLEV@56o15FoX=nmP5eA8]5
+2PE\1k\409Wgn`_BMCB;A@X5K0NkI02Imo\;dWD@RdD:1F`7^i01VOOk2m9e1KP10>\2<l0m0@1e
+28=6o063E_h0odKfRdD8>dKfOi^;A@I8V@56o15FoX]>oX]No;X10;R0DNSL:52;A@ABVE1B<m:h
+40iIFnS::5]I0lPCfX]50YUADe1B<m:h?01IFnRb:5]I0lPCfX\5V@?84mZ9G_Z9C_R0?U4f0GD^
+^=XID;SX:53XP4MIFOmfn_mfn;SR6E2hj2Q@j6e7Pl@8^0TJD;SX:53XGdMIFH]FnX]6n>VIoUmN
+RnEM`eF;k5IGRgh4RgH:>BJL0783j6XjadAA~2adAH0@37A5X10<M4G_ooadALooo7A6;oolM4
+H?ooP7d30G@aP3iA=P5e9kP;6U2hj2Q@j?m6FEVh4aY@^>PXD>SbAUUI^4dJD;SX:53XiDIIFNWP
+08=m101dEOme15KX\EMIFEJhCaY@ogH6j0\APl@6P3iA=P5e:KQC6U2hj2Q@j;56FEUF^5\JD;SX
+:53XXdJ3a0JhP1Y@^>PXD>REAUUIE_mf2>Sn4eUIRDAAja>hPQY@E^QKEeUIadAAj2S6A5<1PgaA
+07DTE[R96U3o=Y@aj0]EPl@6^9hcD?lfU36h101@j1TOPl@6j1dPP7aC0G@9E^Sb55T:`7DiP3iA
+=P5e:KRU6U2hj2Q@j2M6FEUF^:dJD;SX:53X6DJ3a0JheaY@^>PXD>P;AUUIaTAC0EKX`1aIGeiM
+`eF;k8?\0UIGRgH8>BJL0783j1PiaT@20<M40`00^=TJD;P10U3Xo?AIFH_hEkSO6U3oMPKXe5B3
+a0J9A_j3O_h1M@iGj4T?FHU40lI40P7[;Old^>HJD?lfU37XBEB3a0JhWS=@ocJD<KP3053XEaj3
+a0KoMPKoMPCX`@UIFEOXYcAIGej;iEg3EH_\Pn`FEUN;MP@i9Y`0LP?XScS7A_h0P<M6o0402oId
+1H0l07D9^P20^040jH01P3iA=P5e:KP96e2hj2Q@j355FEUF^14KD;SX:53X8dF3a0Jh@A]@^>PX
+D>PEAEUIadKd\PO7A_810<M6l040adK^~2adK\~2adKZ~2SDKZD8e6k52=A^i@SDK`D8e6lU2=
+A_A@^4<KD5KXi5>3a12;n8?o0G`5Pol6ORAF^64KD?lfU37XIE>3a0JhWS=@ocJD<KP3053XLaf3
+a0KYE_n1O_Bb1g`7PGkdm@Mn2?mfm;R56n_:PFkdK0N3O_81O0J3O_8<OPSoM_:h^Q_[\Om>lX=n
+l05l1X=nl1mn2?mfl;SY6n^JPgk^07`6Pgk^5gh8ogK^^1HLjhJ3O^`0O0J3O^`kOPWoM^bhAAcY
+LOn3O^X0O0J3O^XkOPWoM^ZhMQcYG?o7A_H00<M6n000adKj~2SDKZD>S0nUV9E_j9A_b0?U4f
+0GD^^:LLD;SX:53Xkd=IFOmfo_mfo;R_752hj2Q@j=a3Pl@8^=HLD;SX:53XcT=IFH]FoX]6o>Um
+oUmNRnEM`eF;k8?\35IG>BJL0783j=`faTKe0KSH752h011@j<GbFEV9A_J;MP@con\1AX0l07@<
+RPBHRmSfQl4W0GG^P3`0M@GY107[0hUfn>\1AX0l07@?RPBHRmR:Ql4WV:T107C[RGKlRdKl:dKh
+@8U6n_mfn_mfn?mfm^Q2EH?41X]NmP=Nn\H708_7dN2;EPH3d8?215:hhAa@ogKfj2iBPl@6RDKn
+Pgkn0G@[ogKfRlM0D;SU753o=Y@aj:aAPl@8^9hcD?lfU36h0`1@j;XKPl@6aTKe08_7dN2;GPH3
+f8=o1?ml48_7dN2;GPH3f85o1?l0OSB;ad1@RlOAh8]N1P?HogL4^1HMD?lfU37XFE63a0RhWS=@
+ocJD<KP3053XIa^3a0K6A_D0RlOAh8]N1P?HPgl4ogD?RlOAh8]N1P?HRdH8RDL4AnWPoX1nm@5e
+:h7o005d9ENhB1e@ocJD<NP6DH?41[RN<e3o=Y@a^0<0D>PD6h?41\I6m@3oM_KXJC5IRTKej`1O
+GX_UGL=ERnb3k0YFEh]f13TVW01b0nQ<=KQg7E2h0@9@j3WaFEV;n<M4F040adAJ0@37A5koolM4
+G?ooadARooo7A63oolM4EP00adAD~2E^S83UV9A563O540MBAF^7hMD?lfU37XMU23a0JhWS=@
+ocJD<KP3053XQ1Z3a0KXR1^;GPS61`36A_\1ogH8j4ECFHU6o8=4E063E5H0EULc`;X00U1Bj2HC
+Pl@8REKhRDKfPgkh07leO0J3O_H0Lbf;G57gA`8P07@3jI40^9hcD;RU7E2h0`1@j2<JPl@6<l1@
+E^R?1EUIj?T=jfS6QOl10;P:051Gj?H5FEV9A_j3O_h0M0J;G_k61`1Gj<MBFH]Fo0?@REKlRdKl
+>dH6O`]GogH8j8=AFEW[<?mfo;S77E3o=Y@aj:I?Pl@6^9hcD?lfU36h0`1@j;@IPl@6EeKX8PEI
+FLI6n`3[0nT]oh]6o3]61WdWogKl^?HMD?lfU37XJdn3a0JhWS=@ocJD<KP3053XNAV3a0K6A_\0
+E^Sgl5UGj<\_FHY6nn\0Gej;iEg3EH_\PN`F0UIGRgH4Rgh6>BJL0783j:XcadEH0@37AEX10<M5
+G_ooadELooo7AF;oolM5H?ooadEF~2adED~2EnPe3EV9AE63OE40MBAG^2LND?lfU37Xhdj3a0Jh
+WS=@ocJD<KP4053XlAR3a0KXmAVhBai@^00@D>PmkeUIRDK\Rek\aPL0aTKa0NT\0_mfk>RODEV9
+A_Z3AE@1PeEF05N=Q^[mD3?0^P02D5;XO163a0R9E_j9A_b3O_h0OcYl1X=no01c<X]MDOM70R00
+M0?Yk`6hWS=@^5HND;P3053XNAR3a0Hc`51Gj>D3FEWXC`c6A_40jL41aTKX2\I6j@2h8`1@SHKZ
+oE3X@0AIFHU6n8=nn01d3h]Nn<H72_m6n8]Nn<H70;P:052=Q^[mD>PJ15UIRDKfPgkf07@6Rekf
+aPLPSHKZoE3Xie1IReKj0m29E_Z0O081M@n0O0`1M@V0O0L1M@?Y]`1FSHKZoE1Gj7kcPl@6RDKb
+Rekb@h?k0gMbdN<^ojMX>>VA08]6l[X50?OZRmR0N081MCf;A_:j1@3gjX_Hoc2hMAi@ocJD<NR8
+CH?41[RN<e3o=Y@a^0<0D>RF5h?41Xf6j_e@EnP00eUIaTKa0>\IRdKb^PD0mnZ;eP?@DXf6j_e@
+EnRUn8?41^\Y^;hND;RN7U3o=Y@aj3Q=Pl@6^9hcD?lfU36h101@j4HGPl@6j4XHj`3YV@2=A^i@
+^<XND?md3NQaCH?41XU6m8=nm05e3H=nkP1l1h5nk_l0ORSoM0goM0ZhcQi@ocJD<NSSC8?42;RN
+<e3o=Y@a^0<0D>Sa5X?41^]4PGkj011o3hf6j_e@ogK\j8E>FEW[=?mfn[P27e3o=Y@aj:Q<Pl@6
+^9hcD?lfU36h0`1@j;HFPl@6SHKZoE1Gj202FEW6A_40j`V0O_41M@?YboeGj1k^FH1l0P5d:?ld
+^2hOD?lfU37XHDb3a0JhWS=@ocJD<KP3053XKaJ3a0K6A_40jgN0O0`1M2WoM0ZhF1m@ocJD<NPb
+C8?41[RN<e3o=Y@a^0<0D>Q05X?41\I6l@3[B81l1`5d:Omd1KR27e3o=Y@aj0=<Pl@6^9hcD?lf
+U36h0`1@j14FPl@6aTKa0>\Iog@3j<\6FH]N28T7og@8j;l6FH]N28U70X1nl@5e4_mfk_mf2?mf
+k>QEnH?41XQ6lOmfk>Pc;5V:A_6Hj`1OGX_UGL=J=UdfGCIM=UF;k5IGRgh6>BJL0783j10`<oK[
+3X_6dN2;GPX3f<L7oom6>gH8O>dcm^];Rmj:0ISAh8]N2P?HPcooMA2;gXX1V=7PReh:0mR9=n\Y
+Rmj:0IQ@^:`OD?lfU37X?T^3a0JhWS=@ocJD<KP3053XC1F3a0KXD1I6>gH4O;1OGUg3EH_\Pn`2
+EUN;OPB;MPHi9Y`0LP?XRRmG^>4OD3?0D>RD1X?41\L4~2ad@2~2EUOoMPSXZO^3a0J9A_j3O_h0
+OBAG^>DOD?lfU37XcTZ3a0JhWS=@ocJD<KP4053Xg1B3a0KXh1EG^0lPD?lfU37XZTZ3a0JhWS=@
+ocJD<KP1053X^1B3a0KoM0;o=;Pf853o=Y@aj8E:Pl@8^9hcD?lfU36h0@1@j9<DPl@6Gej;iEg3
+EH_\EUN;MPB;OPHi9Y`0LP?Xfbh;og@hE_mdE_mdE;QV853o=Y@aj41:Pl@:^9hcD?lfU36hoom@
+j4hDPl@6EkR5853o=Y@aj1m:Pl@6jaEFogAFogAD^90PD?lfU37X24Z3a0ZhWS=@ocJD<KSooe3X
+5QB3a0IOGUg3EH_\Rdh4>BJL0783j6D^<m;[4X_I0mZ:1cY61WD6Rl43`^\>@X_I0mZ0?`1eiC?0
+jo1M`eF;k8?\15IGRgh4>BJL0783j2`^<oK[F8_NRP6HRmSfQl4W27@<Rmj:0IQ@j2`TFN\5Rmj:
+0IR9A_j;GPJ:09R;f?J7`BL8M0f;GPJ:09Q@j0PTFN\6Reh6RP2HRDKlRdKn>dKlM0R;A_h[A_c[
+54J;gX0i07FQReh6P3P0MITc`>_ZGej;iEg3EH_\EX]>18]f1STVW01b0nRT;C?Bjb:;f@?JRPN;
+fSX0M1F;f@?JRPN;fSX0M0Fh0@3[0S?0jaY2>eH8OA2;f@?JP3l0MM2;fX0h07G9<l3[i5iM`eF;
+k8?\15IGRgh4>BJL0783j4h]<oK[F8_NRP6HRmSfQl4W27@<Rmj:0IQ@j4hSFN\5Rmj:0IR9A_j;
+GPJ:09R;f?J7`BL8M0f;GPJ:09Q@j2XSFN\6Reh6RP2HRDKlRdKn>dKlM0R;A_h[A_c[6DHkMPQm
+3h_NP3T0MIb;GPJ0>01eU3?0jnEOGX_UGL=ERnb3k09FEh]n13TVW01b0nS0;5OX;T]IRDKnRdKn
+B8_`ja2;gXX1>TH6M@J;a`?6j`U>2oImk3?0joEOGX_UGL=ERnb3k09FEh]n13TVW01b0nQn;5OX
+k4YIRDKnRdKnB8_`jaV;gXX1V53oMPKXk_eIF@_0M0J;a`?6j`U>2oImhc?0joEOGX_UGL=ERnaF
+Eh]n13TVW01b0nPf;3?fjaV;gXX1V53oMPKX\_eIF@_0M0J;a`?6j`a6Rmj0>@1eh3?0jo9OGUg3
+EH_\Pn`LEULi9Y`0LP?XnB^0?U4f0GD^^:lPD;SX:53X]cQIFOmf1_mf1;Rg852hj2Q@j:@hPl@8
+^>4PD;SX:53XUSQIFH=n1P1o>7`6Pgh407<`ogH6ogH4^><PD?lfU37X84N3a0RhWS=@ocJD<KP2
+053X;Q63a0K7APH00<M61000adKf0@37A_B0DLM6k^41adK\P3>;A^j;E^b1`X1A5@40RDKZREKX
+_[87RlJk102Imo\;dWDPRlJkI02Imo\;dWD<RlJkT06Imo\;dWD8RdKZReKXj`J;A^j;E^b9A^J9
+E^B;APJ;EP@kA^Il5GD5>eKTLPj;A^J;E^@YEP@IAPK[0^\3A^^S<on;gm7SRhM75IV9E_:9A_23
+o`5e;8_6^`@0VOOk2m9e88_6^f@0VOOk2m9e38_6^i01VOOk2m9e28=6l063E_80RdkfRekdReKb
+RdK`j8\H>eH6Oaie1C]617LGRdkfRekdReKbRdK`j70H:DH46EH6j`;[0dO[RDOoM_KoM_CoMPKo
+MPCXb1F9A_koA_koM_KoM_CoMPKoMPCX`QF9EPJ9AP@c`;X@3U1BogH6ogH4j9dERDKl<l2j40i@
+D_mf1_mf1>RI5HUF1XU613?0^S`0D5;oMPKoMPCXM1F9A_Xc`;Xl051BogH6ogH4j70EREH6RDH4
+RdH4RDKhogKhogKjogKlogKnEeJh325@^5@jD>QUAH?44;PZ8E2hE3Y@j297FEV0?U4f0GD\^2lQ
+D;SX:53XV3IIFKQD>U2h=b5@^>PXD>R7=X?41[Q_8E2hj2Q@j7TfFEVhE3[[05mNRnEM`eF;k8?\
+0UIGRgH4>BJL0783j8PYE^SfAeU0RDKnogKnj4DVFH_h2ome9eKoM_jhLB5@ocJD<NSNA8?42;RN
+<e3o=Y@a^0@0D>S\3X?41^S`3eIGj?A6FEV;an\0Gej;iEg3EH_\Pn`2EUN;MP@i9Y`0LP?X9RT;
+mW@5P3`0M@B;a^\XE^R7AeV9A_j;aP=6oTR;n>\4aPD0Cc_nLPb:1IR;f?J7`BL1MNc[e5mNRnEM
+`eF;k8?\E5IGRgH4Rgh6>BJL0783j=@X<l1@SDK`D8e6mU2=AZa@ogH8j>@<Pl@:RDK^mdK^0P1e
+4`_fM0nh201@EXe6mU3XLTN3a0KgA^h407DC2omd3kP4051GSDK`D>QHAh?41_mf23?0D8e6l52=
+A_I@SDJ\D>Pb1H?42UmNRnEM`eF;k5Hi9Y`0LP?XFRSoMPBhYB5@^>PXD>PL=H?41[SX:53XJc9I
+o`k8:7`>RakB:?l6dRR:1k@0j`Rhb2Q@j9\iFH_`PokoMANhWS=@^;4QD;P3053XZPf3a0JnCP3[
+4_J4`BL8M0MFj1LNFN\2RlJ;l8?nCW@5PoiIMJZ3oUUe1;01j`:`0>\0GUg3EH_\PN`T0UIGRgH4
+>BJL0783j<HWadAHooo7A5[oolM4G_ooadALooo7A6;oolM4H?ooadAV0837A6@10;S@8E1Fj4Ld
+FEV9A563O540MBMF^=<QD?lfU37XnT:3a0JhWS=@ocJD<KP3053X20f3a0KXi`3YgP1Fj>@2F@[0
+MD60?U4f0GDY^?DQD;SX:53X6CAIFEJhoB5@^>PXD>P;=8?41[PV8U2hj2Q@j?dcFEUFj4_TFLI4
+D`77A5400>VD0?mdDKP00U2h0@1@SHKjoE3X`3B3a0R9A_k7A_`003?ojaV0^o[m3GDARmm3SHKj
+o@?HP3l:M@?oA_a7RdKnB3_7MmmFj?OSFLM4D@00RdKl^U00mnXkA_ic1lM4F000j`G7A5P10<M4
+FP40SHKLoE1Fj<12FEV9A_Z3O_X0M0MF^2PRj@goRhKdoH^Fl_f9A6J9E6AOGX_UGL=ERn`i9Y`0
+LP?XM2Ko=Y@0j=54FE2hBR9@ocJD<NSK@H?41[RN<e3o=Y@a^?ooD>SY2h?41Ug3EH_\EUN;MP@i
+9Y`0LP?X>2J;A5P;`7@7?@40M13[4kQO8U1Fj=<bFEV;n>\\^68Rjo3oM5RhIB9@ocJD<NR4@H?4
+1[RN<e3o=Y@a^0<0D>RB2h?41S?0jbh;ogDVE[R68U3o=Y@aj5]1Pl@6^9hcD?lfU36h0`1@j6T;
+Pl@6j4Sojm:;an_@GeiM`eF;k5IGRgH6>BJL0783j:dUPgh40GA9E^Rf05T:`7A0Pgh40WDdE[RX
+8U3o=Y@aj0M1Pl@6ocJD<NPKoEVH2l1e5[RN<e2hab9@^?ooD>P82h?41S?0jgG[1UJhfb;[9h]4
+F0_0M0Lm0@1d4>\C^>`RD5KXnC5IFH_hjb>hkb;[l?mdF;Sb8U3o=Y@aj:Y0Pl@6^9hcD?lfU36h
+0`3[[P_oMBIF^1<SD?lfU37XRT23a0JhWS=@ocJD<KP3053XV0Z3a0KXMok[Rh_7jhUOGUg3EH_\
+>BJL0783j>4T<l1@ogH4j>XTFET;`7D5^040j`8c`>\0GL=ERnb3k4aFEh]f18]n1STVW01b0nR`
+90_fM@;[:3?0D3?0D8e6mU2=A[A@EnRm28?42ULc`51FSDKfD8e6]53XA`63a0YOGX_UGL=ERnb3
+k0AFRgH4>BJL0783j6TTReaARTL4V8U6o_mfo^SV45V9A_b3O_`0M@J`0N\6j`B`0>_hGX_UGL=E
+Rnb3k19FEh]n13TVW01b0nP\95OXS?YIRDK^^2h0D?mfk^RVmEUIRo0;mW@H^0@0D5J=A_1@j=I2
+Pl@6aTKd0<H40>\=^3HSD8e6l53XWD5IFKP8053oM^j=A_I@j:m2Pl@6aTKn08e6mX_`jaF:19Q@
+^3LSD>QBmEUI2l1e0lH4GdJ0?01eiXe6lH_`jaF:19Q@^84SD>PamEUI2l1e0lH4GdJ0?01eiXe6
+mU2hM3Y@j3U1FEV=A_1@^7@jD>S4@5UI^7@jD5OXld1IF@_0M2FhM3Y@EkS;8e3o=Y@aj=TnPl@8
+^9hcD?lfU36h0P1@j>L8Pl@6^7@jj`1OGX_UGL=ERnb3k0AFEh]f28]n33TVW01b0nPW8kSl8e1G
+j<e0FEV3OP@0M4f;GPB0?`1dAKQ0053oMPAGj911Pl@6ogH4j6e1FHU6oX]NoP=N18Y7oiQ@^?dS
+D>Qam5UIRDKlPgkl07D@Pgkn@7d:^00TD5OX4T1IFH=n1P1d3[P8053oMPIGj4E1Pl@62oId9H0l
+07@PP3`^M0nh0RA@EnSV?eUI^0<0j`>h101@EUOX7463a0IOGX_UGL=ERnaFEh]n23TVW01b0nQf
+8_mf1;P4952hj2Q@j3P_Pl@6^>PXD>R7;5Vhb2Q@ogH6EnSh;8?41X_`2oIe6;RN<e2h22A@^0@0
+D>SE1h?41^RdnnSF2;P:051Gj;GcFEV;l0_fM0?6101OGUg3EH_\Pn`6EX]f2STVW01b0nP78\M6
+oP00adKl~2jdOoM57XNc=IRDKjPgkjogDTReaAmdL2401d2;[ookSnon\oRdKl2dKnM@Rjoonh
+ooo[k^\UReh80eklRTKjR0N3A_`1PeKn08]6oX]Fo3]61Wb^M@DkEPAbYh]FoX]6o>^oGX_UGL=E
+Rnb3k09FEh]n28]f2STVW01b0nQn8OmdDOmf15OX6Rb3a0J9A_j;GPA;aP40Pgkn07DTReaAmdL2
+401d2;[ookSnon\KReaAmdL2801d2;[ookSoon_\EnR[?eTcd^_SGej;iEg3EH_\Pn`4EUN;OPR;
+MPXi9Y`0LP?X5b63O5P1MAIFEomf1_mf1>Qaoh?428UFoXU6o>\mReaAmdL2801d2;[ookSoon\c
+ogAAogH4^040D5OXU2j3a0S7A_h008U6o8]LDOM70Q00M0Rjoonho_o[dh]FoX]6o>_;Gej;iEg3
+EH_\Pn`>EUN;MP`i9Y`0LP?XW237A_800<M6o040jOl2RdKldN2;GPH3f8\7RDKnP7`30GD5aPIA
+=P60?U4f0GD[^2PTD;SX:53X<beIFOmfo[P`952hj2Q@j2<]Pl@6^5\TD;SX:53X5BeIFH]NoXX7
+V53oMPSX`_5IF@_0M@?Y@P:hGBA@ogKnj:8mFET;`7D3jBl2Pgkb07@7ogKbj0\LFH]6oT1@j6Wf
+FHU6l_mf2_mfl^RaleUIRDKfadKd~2Pgkf07@=RekfaPL0RdKf@8U6m?mfl^Q7?UV9A_Zoooo7
+A_P00>V50?mfn_mflX]6n;X60?OZRmSo<>Q?lX?41P_0MFH;oge0RgkhP3iA=P5e=;QO952hj2Q@
+j64\FEV;A_Rj1P3gjX_Hoc2hIbA@^>PXD>Q8;8?41[RC952hj2Q@j3X\FEW[8X]6o=7PReh60mSo
+=kRE953o=Y@aj<XjPl@6ocJD<NRTceWoA_R;A_Rj1P3gjX_HPcP0M0?YJOl;ogdRRdKldN2;GPH3
+f?lg^:hTD?lfU37XScZ3a0Ko=Y@aj6W?FH=nmP1eE8_7^PH0mnZ;f81h0P1e9h_7^PH0mnZ;f?l`
+^>XTD;S5953o=Y@aj5DjPl@8ocJD<NP_ceW[6h_7^PH0mnZ;f<I00`6;akX60?OZRmS7@0@00>W2
+08]Nm80o07DURdKldN2;GPH3f?lg^>dTD?lfU37X2cZ3a0Ko=Y@aj>G>FNVE08_7^PH0mnZ;f81h
+0P5e9h_7^PH0mnZ;f?l`^3TUD;P@9E3o=Y@aj=@iPl@8ocJD<NR^cUW[Gomfm>RZm5U@RlNj1P3g
+jX_HF8U018_7^PH0mnZ;f<I00`60?U4f0GDd^3`UD;SX:53Xj2YIFH_7^PH0mnZ;f?m`1;Q49E2h
+j2Q@j<lZPl@6^70UD;SX:53X`BYIFN]JjeR;GPj0O`<0MAn;GPk6A`<1RdKldN2;GPH3f?lgj33d
+FH]N3XU71>\`Reh@P7l307DOReh@aTL30H]6o=7PReh60mSo=nP8m5V;GQ29A`C[2;Qb9E3XlleI
+odKlRdKl>dH4O@?Ym_aOGX_UGL=ERnb3k09FEh]f13TVW01b0nQ[7H0nDCH1MCBhT2E@^>PXD>PY
+:UUIRlH5I01@j>hPFE1F^9PUD;SX:53X42Z3a0Rh`bE@^>PXD>P2:UUIRlH5I01@j7<PFH_hPgd:
+D7ePogAVogATj0_aFEU@E[S59E3o=Y@aj84hPl@8^9hcD?lfU36h0P1@j8l2Pl@6^9hcD;SU9E2h
+oom@j7d2Pl@6E[PM9U3o=Y@aj4hhPl@6^9hcD?lfU36h0P1@j5`2Pl@6ogAVogATE^Qh18?41XU6
+oX=noP1d;h_61F@0D>Po85U@E[Q;9U3o=Y@aj0`hPl@8^9hcD?lfU36h0`1@j1X2Pl@6j?Wej`1O
+GX_UGL=ERnb3k09FEh]f13TVW01b0nQM78]LDHY719R;n8]4F0_0M0Lm0@1d4N\D^020D5OXNSII
+FHU6o^\\^010jnnhTBI@^74VD?lfU37XWSN3a0JhWS=@ocJD<KP4053X[063a0KX\0:3O_h0OBAF
+^9lVD?lfU37XM3N3a0JhWS=@ocJD<KP3053XPP63a0KXHOEOGX_UGL=ERnb3k5QFEh]n1STVW01b
+0nS76`_oM0?61@23OPP0M0J;GPS61`23OPX0M0J;GP[61`23OP`0M0J;GPc61`37A_X008=n101d
+28]N180o07D6RdKjjJ<0ogH4SDJXD>PW>EUISDJXRo2h_bI@E^SHkUUIRDKnPgkn07@\Pdkj20_o
+M1k7A_`00>\9RPB81DI7odKlPgkl@7d5>gKnM^c61@3oA_j;M_jh;P1@E^Rgk5UIRDKnPgkn07@P
+Pdkj18=n2P1d4;P4053oM_koMP[XfCV3a0J;G_k61`20?01d68=>nP:3OPP0M0jh201@E_mf2>Rf
+>H?41^UGoemNRnEM`eF;k8?\8UHi9Y`0LP?XbQZh`RI@j7`]FHU6oX=noP1e8[S59U2=A]i@j5`h
+FEVhbBI@SDKND>SW=eUISDKND>Q9<eWXX3b=APA@j=TMFH_`Pg`@07hARaH0<:7n;`G`lH?Bon\;
+j`V;5P0`XOh_jo=NRnEM`eF;k8?\15IGRgh8>BJL0783j54JadKn0@0cmX]N14>3n`Eg;M7S;_nW
+:To7A_cA9^]9adKldRK[4lM6o=LVj`c7A_cR9^\5adKljbJn0@3[:[PD9e2hm2I@ocJD<NR0=H?4
+1[RN<e3o=Y@a^0@0D>R>oh?41^RB0>R?08=n1P1d28]N1X0o07DARdH4>`IB=Wh6RdH4Xe8fjej3
+OE40M@G7A_h008=noP1d3@_fM0V1OE7X:7D2<oH;mW@DogH6ogKl^24WD;SX:53XJ2J3a0R3O_h0
+M1?oMPKoM_bh9bM@ogEAj4lVPl@8RdH4>`IB=Wh6RdH4Xe8fGej;iEg3GTiGCUM>IDi\CW=>EH_\
+>BJL0783j4lIRaiB=X?k17LJdN<^ojM\Cc?0D>PZ15W[3kP10>_d^080jnnh0`3[jUg3DTmBCe]?
+H4mUCeF;k8?\15J;MPXi9Y`0LP?X21W7A_h00<M6o000ja[oM56;GPP3G_b:1iQ@j=H^FEV3A_`1
+PeKn08]6oX]Fo3]61WcKM@DkEPAbe5j;iEg3EH_\Pn`4EX]f2STVW01b0nRh68]61X]F18U6oXUF
+o8=lGP1lDWl6PgaL07I:RdANReAL>dKnOcml1C]Fo7<hogANogALogKnogKl^2dWD?lfU37Xl3>3
+a0bhWS=@ocJD<KP3053Xo_f3a0J;A5j;E5b9A_j9E_coM57oM_bh0@1@ogH8j>lXPl@8GX_UGL=E
+Rnb3k0QFEh]n13TVW01b0nPX6;P4051Gj2@\FEV9A_j3O_h0OBYG^6LWD?lfU37XQ3>3a0JhWS=@
+ocJD<KP3053XT_f3a0KXLO6hoooY;06=API@j30KFH_`R`Bk0P2Imo\U7`0U7`20I_SP24KhRd@2
+9Cl09Cl0PFKh7oRa1M?P2DKhRd@49Al09Al0P6Ki1m7PdN3Ah0Q6nH]41RDO02DO081Vn^08A_Z;
+A0Q09@l09@l0PFKj7oja1M?P2DKjPg`:D7dLP6Khh85Vn1ohP6Ki1h1Vn^21I_XOoX1Vn`7[5H]4
+2PF`obEo02Eo081Vn`7Ah0Q6nhe6n53oM_kXg0]IFHU6o8=no01d=he61U3Xb1YID5NhObM@ocJD
+<NRE<X?42;RN<e3o=Y@a^0<0D>RSo8?41^R2l?mfo^SF5eWY1oooM_kXc1MIRDKlPgkl07dTEkRU
+9e3o=Y@aj5LbPl@6^9hcD?lfU36h0`1@j6GlPl@6jM?n<l3YdOiOGX_UGL=ERnb3?[hW87D5^040
+ja>;7[hWdN>;APB9QlHjo`Jn9c?0GL=ERnbd@c;0ReH4cB5b2H]N1XT?<l3[153Xm@9M`eF;k;A3
+\06;EPB;CPK=8G84<l3[153XfP9M`eF;k5J;MPBd6LdQ]010R@ANGL=ERnaFRgH6RUH4o\Zd3\dQ
+]02915iM`eF;k8?\35IGX@0`RaKn;hU6n8UFmZ42<8U6m8]>18]F1X_aRoZkh04Sf[45dn^3hQni
+0?hScm7YQ\gf`@=e1X3k0WH1@]7SRioN;`?JBhUNo8312XU>nX_1@=7XdNP3f;Q]0OOQ0mRh`:Sg
+hm7PdM:FRmY@\@?Cj8QVo\I6o`19d^Ri?026`OKT0l6a??OQFH?Q7m7Q0l4BeP?64m<3A_HCE_R3
+O_@0M2E@D_mfo_mfo3?0D?mfn^Sd>0_0M0Fh40k[0S?0Ro1JF2_6PmX0Gej;iEg21033EH_\EX]f
+20_fMAk[3_l>_RN;7[hWdN?oUlHjPcjn9`1ejnP2[_lF`RSXRjkX2jj3OPH0MA<;mWD8oaK4:?lF
+aRSoMPCX6jiIGUg21P1ERn`c`51@ogH4j:KoGL=ERnbh0@1@<l1@ogH4j9CoGL<c`52h0@1@<l1@
+j8Go`kP1051@<l1@j7Wo`eF;k5J;MPBd:\dQR@b9E09NGL=ERnaFRgH4]2c=8HT<RE@2GUg3F@iA
+<lW[5UT>DKT10>\>F@iA^@80j`II3U6i0`1EEUN;k8_iRdH:ReH<Reh>Rdh@2lUe20_BM6T;fgAU
+mlL107DL2m9i2_OJmmR3fP23c``;bGT:mmWgfh?I08?g18_Y^B00Ec?o<oKAh=7BdMKAec_mLP]g
+13_cLPD[la_m@>;WFoO30P1d1X_6RmOAjoO3101d1oOJmmR3fP1OGUg:203gloO70P1d0I8cd^_]
+F`iCP?T@La2;f=?Pdn;ffH314=?[2m?;P>T@TS?0dn;;F`iCP?T@La2;f]?Xdn[ffH314=?S2l?;
+P>T@TS?BdnS;EH_\EX]f10_fO1F3oUQn0kiG08Tf>2Z:Q3XZV8_`j`gggX?n8goYa`Hh:_ooRCJD
+0;SooeiM`P80EH_\EX]f15KX_?n;aUiM`P80EH_\^014Reh4cB6B9H00GL=ERnb3k29FE`J;OPXN
+1h]N28?k97MHP?\2LU>;APb;CPh;bGdAP7h607@;aPD]AoOImmR3f@2=M]kS3i4[d_OcTOOcR1A6
+h`W[lB_Bmo>854H;`7GeSDkNmmT3c_a>RP@\2W<413[[0`961:[Rkk00ZPN;APYOGX_UGL8<05F;
+k3?0D?mf1_mf1;P:052`052`HE3XJ_mM`P@0EH_\Reh4dN>1Y`XZoofd@XY62X]N18]>28]F1\dQ
+LP;[1E3Xi?jIGL=ERnaFRgH8ReH62oIe0kh6>omf10_BM@FhU2[[0X_2D5KXWPeIFE3XT?nhV2Y@
+E^Rc;eUIRlINGL8605F;k8?\0UIGRgH6Rgh4ES?0D8<mogD5^080j`>h0@011H\5D>RNoh_`SDKn
+D5KXW_]IF@_0M=N;aUmNRnEM`P@0EYJBQL1d0_OSh`FAmnH3`IKgh`?FG\=ERnaFEak5MPC4OPSl
+dNWcYA?9lj@OGeiM`PP0EH_\Reh4dN?gQ`XZ0P1d1[P5053[4[@oReh4Rdh8ReH6cB5b0^\4D>P7
+oUg3EH_\Pn`ZEUO7A_`00<M6nP00jaV;OPcfA_lPM0O4?H=630C3RcdN1h=630;31_b;MPZ\2\1d
+GS`UM5fHUom6n_mf2?mF15T;`7`VV0_oN3:0_IhZ0GD[T`[KN1R0_ihZ0GDAodKjogH8oeH4F@_0
+OnKYCP?oMPQCoeH6FEWoC_[[\3_7M:coMPQ@oeH6FEWoC_[Y@@?Y?P?7A_KoolI6o`2\V8Uf2YL;
+og`IRYfN:S;oPo\EMP?Y2@?AhbkoYcMKUnUgonT?0h1>o`7[e8?_<8MnmP_oO<Zh2P3gi`56m^_0
+P4ko2>^jP4ko1>^dP4ko0^^^P6Kogn^XP4ko8>^RRdKj:m;fA_l1M53[UKh80>\<_PX0j`Nn403[
+0S?fmlLP07D9PomHM0B0C_l4SDKhD8e6nU2;A_HUogm@E_mf2?mf1_mf1>Qh0h?43X=nn01n6?I6
+o`5e3om6o>RgoZ_fA_l4M0:BZnW6oW`3jFP2jE42j000jFH2ogH8D?mF1UUIodkjPFKfogoX~2
+jGD2DS`jM1D;`7h<ogH8D?mF1UUIodkjFXcKja_X~2jED2F`_0OQ1BDomf253oEPIIFOm>nU]J
+mTKo0GD@j4SnodKlTZ_fA_lPM0:CZnUCo^WS0He6n52=A_Y@^?mo8dKfD?mf2?mf1_mf1>Q13X?4
+38=nn01n>8Y6oiRY0@1e:NP5o_m6o?I6o`Ad1KP40>\=mTKo27@5^0P0j`8c`51Gj10>Pl@4jO[m
+j0\>jOCmj0D>O9cYT`7X~2jI@1mTKo0GD6j<;modKlPFKfogmd:OI6o`5e0J[oA_X6ogH8oeH4
+F@L;`7hB2\1h2I>0_ihZ0I=n1Om>mWoG1_mf253oEPIIF@OoC_[fA_l1M@>`0:[YT?gfA_l1M@?X
+K?f;M_H;mWd3_P40M1[oA_X6ogH8oeH4F@L;`7`FmTKo0GD1ZTioi_I6o`5e0om6o>UEoNWU02_0
+o1H7SGkF^A00lj^\P6KokcaNM@F0C_l@[;@0R]2;n;43dnni1`4Rb];U26_F[3`0M2HlGG@U?2ee
+hCXDMmf0?5edf:`Z`WCU0]3@aH?G00Q[e_k8MOC[eNVL08Uf2X5Vm_moRgKfmTKo0GD3j<KlCWa@
+odKj1_mf2?mF15T72l1lCiJ;g[43dnji1`4Rbm;UQ6[FUY=d2?I6oa1d2>\?mTKo47@9mTKo0GG4
+Z^_11_mf253oEPIIF@OoC_Y6>gKfO@WfA_l1M@KoA_b`0:[YOoa6>gKfO@cfA_l1M@J`0:[oA_co
+MPRhoom@oeH6FEV3O_`1Pekl00N;A_cYQP3oA_[oMPSoEPAI2l1n4`[0N0VCP;nN:P6CM>EIPl43
+on5dn5W[_b_B^@@0odkfO4EBDOm6n_mf2?mF15UIFP_0OSGnbG`aR^R0kC1b:X3m2W8GP>dALR20
+o@Ib2X3]878FP?d6La60a@[Ah]7RdN;AhP;EjkH[`83i17@6FH?10ooQFNUOoemNRnEM`jAJY5ZT
+FXiGUENKEfeIgeOOEnUG[ER_Ek]G]EOJEa5IZeW=EnAG?eS1ElMGDh3[<78RP?\9MQ:0nbYg1H3[
+1n\3P>\WP?\9MP\jfG<7A4Ch]`3[0U_i`eF;k8?\1UIGaTKo0<M6o000adKj0@3oA_coMPSoEPAI
+2l1lJ9RCm\>0M@Ro`BOf0@5ehi?oCPalFS`[M0Ll;GDFoTKoodh<O4[oA_coMPSoEPAI2l1l=B_f
+Roj;CP[SCH?i97L^P?T2LRTl<7E[P?T@MFCoCPal<_m6o?mf2?mF15TlN7AA?5QdCN]cadKjooo[
+1LM6nP00ogH8D?mF1UUIodkl:l2IjJL0jI@0?337APX:07DSodh<O>ooA_coMPSoEPAIadH:200l
+N7@4?5Qe;LM62Q00jaN;CPZCj?GnTg:`U^\:U_MV2P?`4oYe;?m>37a<odKlogH8oeH4FH]>2Y?X
+cojCLmg[:YKghIN7b_OR0oLC`ILBeWE7odh<O23oA_coMPSoEPAIRdh:TnRSoY=ce_mf253oEPII
+FOm>o8_GUX1no`1d1oOJmmR3fP2;OPj;G_`17H]n48]NnXTMjaJhoonjogl2A_n0e023dP37A_X2
+0>_HGej;iEg3EH_\E[@[RgH4R`b;E0;=8EiM`eF;k5Jd;H]f18\<Re@2cB5NGL=ERnaG^05GReh4
+Rgh6R`f;E@;=8G84<l3[153XP_MOGL>j1@0k5PPZLb^;f]7SahL::P00RmZa1=?SaXO<:?n;`]?P
+1LPXRm[ChhV7eRQ2>aH8:W;EX<`XV53XS_MI2l1e1X4VbRSooKP00U3g1\XX009d1KP10>\2<l1@
+<l1@^<PXD>QS9H?42:3L:9Q@j5[gF@_0M@J19]XXoofh009@m`KJ:002M0Fh0P3[0S?0D3?0D;SH
+:53X;bF3a0S3EH_\Pn`8SDKhD8e6o52;GPCoM`;o=nS5:X?428e6o53XnOiISDKhD>P4oeTc`8_U
+GL=ERnb3k0aFRgH4SDKlD>R9mEV=A_Q@j9CeFHe6n52=A_a@j70YFEV9E_J9A_@;mW@;RdKfReKd
+RD@2RAB;E_J;A_ANRnEM`eF;k;P1050c`51@ogH4j4kgPl@8GL=ERnb;EPB3n_me1KSoon\JR\:d
+08_HmXO19`Ad2H[2]005803[18[2]01M`eF;k8]F18?jogD5^?oojaZ:`[@0RmSfQl4W27@9R\:d
+00GPon\4R\:d05g3EH_\]46;EPC=8G84<l3[153XioEM`h[6j080R\;D48KPj080Q^04T2LD@2NZ
+`eF;k87\UP1FElM6kP00adK\D037A^X00>]6EkWooc;0lZkgdDUO`cJ81DOnC^ae;e=ADPJ=QV[o
+:oR=QV[oD5OoMPSoEPX;`7D5adKZ0@37A^a@005nkXfnJ_l7FUUK``KlSKiZohUno8]no8]f1Z`:
+`7@B?2Ed4CJ81DOnC^aok^R\on_YjMD3RGK`[3`UM>N9O_`cbHU>lXU>oXQ>mLM6n?ooadKfooo[
+0J`bi8_@RmR0jb20nf1c4hZO9b^3naMf0nV80m7S;_nWQ6?YOP>0o@1gn8=>oP7[d83m07O]Pdkn
+0^_5P?d0Mn:0O_D[M0>8E_G[]H=Vo]o[18=>oR2e1N^WP?d0MdggA_h207DYPdkn2;D1ji?Y<`>;
+OP@fR`F3AP@2P?d2La8;`7T6mmR3C_h2RDKh]@?YKon0o@AeehU6m_k5jF;oP?d4LlZe1?m6m^UE
+oi8\<9R0o@9g6KD2QdKh2l1ldM7PRm3Ah=7P0l81A_SY<on0o@AeVhM6mP_0M;GAh8_@dN3Ah0?2
+0DKfjAOoPdkn4>UUoh5>oP01PfKnknUIokL8j`Zg2^\:]a2cj@;JaTKe08QFnc?BR5KjRgh4=X\5
+ja2g2\I6nP68E_^;OP@fR`FIAdN9MPKgA_h@07@5=X\EAdN9OPB=O[\;`7D=2m9e2H=nmP1e1nUX
+oX=>oPABD5N:aiQ@RTKjD5?X5O@F1h]FmP_BO@?YlP3Yo@28E_^9MPJ=O[Z;GP@focM3@hUN1?M6
+oR00M10fRaM3@hUN11H7j9gm\3ZZ5PMJj9Cm=\H50<I6nP23I_kkSDjj:oV7ch]FmS_AO`:;dNVO
+08Uf1XQFnh]n13J;1H=6108F1hen^c;T=XT5^@40jL80RGH6R5KkRgh4mdKn801e3CJ;?H=6108N
+1`_oj`\fa3f3AP@4S<0;agD57PNo82_XEOdkC_If0h]>m^V508Uf1XQFnh]n18]>mP_9O@>i1P1G
+DHeN^e=B^0408dKnD8]6oZT00G@9^0P0PdH42^\7PdH42;P6053XlP@F1hen^oM6oPP0M1R;E_P;
+dWhAj?Ol9X0m;GD1BB_AOP>9E_8VP3d]M0^:A_D:`7@DCbJ81H=nlP1n2X]>mP_9O@?oC_;XaOb;
+mh]no8]Nn;P502=6oSd507DCRVKkP?a_M@f3O_80O`G7A_810>\KP?ahM0F0o5Qe4H=>oT1;Bh=^
+lP9m1LM6lP000dkbmdKn0P1e3>\6\23XO_a;>mUom_M6oT00M0^`<>Q]o8Y6nnQWo8]FlP_BORL[
+bR_J9XX4?2ed23`PM0@l:gD79ZcXB?a9BhO:h`N`<>Pmo>;iQl[S4R_I9Z`fR0E7oTk\O`?X<?cR
+l0_KOPV;bk0Pj1[lh_WYF_b9MPJ;OPCgA_hP07D;=X\mPdH40Qh7j`Lfa3f3AP@4^500:TK\0dK^
+9XT5mdKn401d1dM79\L5~2jA_lRgK`Rgkl\2GXc_^\2\1en81nk51m0nS9n`N3O^X0M0Fhooo[
+0h]6kUmNRnEM`PP0k5oFGb5PhEm?H5aPVV2QH:IP2V3?H:eP\F2eH2UQeV5iHIUQ66=DHeASE6?l
+G`9PEH_\EUN;OPCoMPKX@B=IRo10D?mf1UOXfaN3a0J;a`?6GeiM`eF;k8]618_DPNX00S_2L`NS
+W00c`>\9a`JD00P0^?ooGL=ERnb;APB;EPH31Y`0Pm80RlP;dWD@PL400W8:>lac1XL6W03[2LL6
+U0080;Sooeg3EH_\ogH4j:CoFEg3EH_\RdH4VE9@j;OoFEUM`kZ8:n\3^Xd[^@D0]42k0P3=8KTW
+0;ZB:kA0cB7Y4IiERnb;EPRdA8Y61X]N18]>2\dQLPb3OPH0M@B;`^\6j`A@j4O`GL=FEh_dRe`6
+Pn\4LPhk7[`[M0GX@P3[0nP305mN`cTN^R]d8h]g0_H40G@6RCJl:n\P>cJj:g@=RmkXE02;A`:S
+_2_[3H_N<l2S^R^S_2^S_R]Cj?KnFl?o3c\N^R]d68]g0X\4Z05e3`<7R@B;?`?kRGD2Rmk[0nPb
+08\o0o^;1JP1M0730@N;m`?`RE`2Rmn;O`Hkgg@>RCjn:h]g18Ue18Ul1\?71[h[~2`h\f_R\;
+mW@@Rg`6RE`6REd4RGl6RGL4`hTN_R^9G`B9G`K3EUN;m8]41P_0M5851@1b=RGnocd807<3^0P0
+Pcjj:`1d7h\N_R\;fg@=Rm<i1g<JRel6>mYemNQV0>\Qj8X0jacX703[5c?0ja>;l8?623TgLnWX
+Jooo1h_31@@0Gek3D3?0D53X=_iKFbD107@9<m9BD>PXoU]KF50cfe=@j1gnFe\moomd58_HRAjj
+:hTN_2]H@8T7Pl<4Rl?3Fc?0`e0cfe=@j?KmFe\moomd5X_HXK`[RDL2RAjl:eQ0R@N3``B;`l=H
+<l33:@N;l`<gRoh3n42918UL0XUe0X?618_6`h_\De1AD>PEoe^;f0_0M1lN1ob;n8]foX\<PlH4
+EX?Y1M7YljF9A_kX9?iKReknPl@6`h_2Pl88>m5g=H_A>ajl:gD?R@Oo1`?3De3XBoeKFn\NRo\3
+n8UM0R_@:AN;m`?bRG`2@XTERl^;gnPgoX_IPl<4`eIGEH_\Reh8RdH:2l1d=`_KM2f3j`B;3dV;
+d8?21H?RoX?j27<3^PP0>lYb37L5Pl<4j`SXQoo[0nQ?oh_3j`e@j6Gnj`ICj93m<l1KGEmN`olV
+433o9Q8`obHD<?lV5S0008l6a2^?1\H[S`K8:bj<7QEWRCK::hTnc2_lSPJ@0;j003;T9Za0S<F7
+eY>;=XX0ATJi0@20?Y800g8ASPJ<08_n\Glb`?:^hfj0lGm@Rl43`d0Uo_n;o2_hLUb;i`HO5PMA
+BO>T<\2ZS]f7lXOIRl>;d4?X6@1g1g90j180MoTl87@8?0ed13`9MNPb`>_T2l1d1d:Z2\1e0D>6
+h3;0nN<E[4T\8W@?128lG7D7P3`RM@:\B@_f`nVWVUT3bRj>7QEWRAk0:d<3fh_dRn`[jg;VRnF9
+;\8[h`j9MP23a@8f[0[0h?Ydl3?0RDH0;XhN5FN;=\X[Rck<:olfb2_o=\H[XL0[Xh@0XL8[XhH0
+obK4:eIGR`j:057X:oeIRoP;`7@R7Qh7SQj<03?fo?>T7h_h1_lfSP3X3OeKRmP7Xlh[2l1e0nTJ
+VS?0^OooP3d0M0b9?h?30_:^9SP5MOB91emNXLh[XhP0`e=dHF=[86mfIG9VK6mg8@d:98cKS<R>
+f;YoJ;@9cB6>fnW^jUF;k3?0D?mf1>RQ05UIRm23n_md6_M61P80M0Kg`P40M@@c`>\9a`JD00D0
+^?ooGL=ERnaFEeF;MPCl:l2I^@X0]`2o`BN:74Kf0@5en;d0083k:g@6P?\]M@A5RQa6P?\iMbj0
+jc1b:OOQ0l<BeWC[ja:;n[T:0?OQUhOAmn:BU`?34m6:74J0ncUg1H3[<7?QCG`7mm[gf8?J05eO
+GUg3EH_\ogH4j8OoFEg3EH_\Rdh8]4>:APJ;EPC=8G83TN\4D>QZjeg3EH_\ReH4>aH8:W89^0H0
+D>QEjn\?Rm[AhlN72RX005;X0`1IGL=ERnbd?X]N1<dQLPcAhlN72RX003?0j`A@j2K[GL=ERnaF
+<l2j?01@D_mf1_mf1>P_jZ<^>c?0^S`0D5;oMPKoMPCX3NZ9EPJ9AP@c`;Xl051BogH6ogH4j0KZ
+Xc0k<l2j?01@D_mf1_mf1>STjHUF1XU613?0^_R8D5;oMPKoMPCXc^V;f=7PdN2S>3^31SPkAX_3
+^[D5mnZ;l3?0^_R8D5;oMPKoMPCX]^V9EPJ9APBi>2;g1SPk0`1e0h?168_1VC]F1W`7OahkAPAg
+6H_1^aP0VOOk0o3o1SPkRl6I:DH46EH6jlZ3OPP0M4Z3?P8`07A3<l2j601@D_mf1_mf1>QMjE0c
+`;XH051BogH6ogH4j3gYD3?0D:4h>`Fjoe3XF24;`7@@PdH40H=F1P371Shk0@3[1\L6?S\003?0
+^QP0D5;oMPKoMPCX5>VS<S\c`;XH051BogH6ogH4j?;XREH6RDH4Xc`k1@@00o2;a[\703?Bmo>9
+5SXkPdH40H=F1P3g1SPk0`1e<X=n1P1l4Wl6Pgh4?7H:Pfh40H=N1P3[6X=n1P1e58=n13ae3\L6
+=S\10<L6=3\M0>\ha`Hf>`00jaB;7SHkRXO@:iRI:DH46EH6o`Hf>h\N=S^:Qm0[V9TkEPIlgGD5
+>dH4L]J;APBS=3^h;S]NGL=ERnaFRgH6Rd@:1F`7D?ldog@2og@4og@6Re`8dN?o]a0\Re`<dN?o
+]o@[^2D]D?mf1>Q;68?44UiM`eF;k3?0D8]N1?mg0_lgj=OmPl@6GL=ERnb3k0CX]aj;GPB;A`:;
+5b\FoRlK1P0`RDKnREKl^040D?mfoU;XZ?f3a0J;iEg3EH_\E_mf1;PD>e3XL?mIFH_`aX@D>`Y6
+aX@D>`2h53]NGL=ERncoMPCXXomID>S?oeUM`eF;k8?\25IGRgh6Pgh4AW`7PGh4RP1n2K[ookSo
+onUY0H]63[\l09Wgn`5638]63YWgnhUF3X]639Wgn`562X]639WgnhUF38]62[\H09Wgn`5628]6
+2YWgnhUF2^\QmdH40`1e4H?o0GD<Pgh877h[Pfh87N\8RXG@:iPYAPQ7RlNk302Imo\1APB;aiWg
+nh_jRXG@:iPkAPQn`h=^14J;AP@50P2k102Imo^;l8]610E60:T307D6Pol2O@5>RdH4VE1B<m:h
+K@5IFnQMjE2;aU:IFeT3b1?JRoOAiX^4g2^I0lPCfX]629T3b1?JREknRDklRdknRekl^P40^81A
+j2SYD8]62U:ID58cd[P@3UUKj1KYFeT3b1?JRdH<VE5CD58cd[Pl05UKj?kXFeT3b1?JRdH>V@?8
+4mX33_h_4ah0<8UNnXU>n8<n0S00M1goMP[oMPR;ad1@ogH4j6TN2l1d2H5^n10>Pekj08=nnP1l
+47l6Pgkh07H8ReKjRdKhj`JjoonhoomOGX_UGL=ERnb3k0AFRgH4ocCoM0;oM0B;A0I8D?md2?md
+2^Q@oX?438UFoXU6o8=no_me1X=no?md5He6o53XcoeI7UJh;S\ND;TB0>QYj8]FoX]6o5j;iEg3
+EH_\Pn`PEUN;MPZ=A^29A_k7A_`10>T70h]N280o9G@@odKlRPN;GPB81om61>WV0[Q3;E2=A^1@
+j=`GFEWoAPR;GPR:1iR9A_Zi5P2kMW4^R`LkA_Yd28?30^;cjH82;_mW;8]L3=7SRhOd:hU6o^U_
+0X]L3=7SRhL2;>__Re`8dN>;Qa0\jnB;G0SAhh^7:2c[fEKoM_kXb_aIFNU20_md1X=l1PYm0nT<
+0S?0SEKP0l;Y5@;oM0B3O0@:ONgYmP7[j8=l10ae1Kl<0>\;Rd@4^``0VOOkRoYGPol:OLcYe@7[
+ah]l3TMGPol:O@Fh0@3[0S?0D8?oI7d5^040j`8c`5X3d8e6h0?@D^Vm0H]l24MGPol:OI?YW07[
+S_md0X=l0PYmQNV>0N^0Rd@4^``0VOOkdN2;f8^7@2cY;Ooo=8<l2W`3jF;ojF\1jEcoRd@>^`L0
+VOOkRg`<:oX;ogd3PlL7Rd@>0lNk1`2Imo^;n523o`Yl0nTaonTj0NT[oomd3>U10H]43[\709Wg
+nh]l32_j2omm0h?71h]43P?7B;\709Wgnh_hD8?o2W`3jOWnj@81jO?nRe`<dN?o]o@[SDKPD>Q?
+5UUI^4H]D8e6h53XfQEIFH]L2=7SokL@;8e6h53Xb1EIFKQ8;E2=A^1@j;\EFEWoM0J=A^1@j=\F
+FHeFh0?2D>QjiKQ:;E2=A^1@j9XEFEV;A0X5K0M@SDKPD>Rf5UWYQ?koM0B3O0@:O@Fh0@3[0S?0
+SEKP0l9@j4;U^4d]D8e6h53XHQEIFOmd0Xe6h53XPQIISEKP0l9@Pg`22Gh5^040j`8c`5X[d5;X
+4>FhD2e@SDKPD>P`5EUIocB=A^1@j54FFHeFh0?2D8<l2Gh5^040j`8c`5X[d>UWoX]42[]T09Wg
+nh_jDX?o2W`3jOCm^040jO3mjN_mRd@:1F`7D8e6h53X]^C[4H]L4=7SRhOj;nV@oLM6oU<]ogKn
+j?@EFH]F1R]Fo3_2L`WoM_kXhaEIj`J;APH[A_b;n53oM_koMPCX;1J3a0H1O_`1OPCoAPR=A^29
+A_j;A_`kAPIc2h]N280o07@3jNKlReh4aPL0Reh8P3l0M0@c`>\4RdKlB5mNRnEM`bD0@@1204P0
+B@1=05<0E@1G05P0F@1J0640HP1S06@0JP1]0700M`1h07T0176JK[1^gFk[KTE_IfmgKji_DG3X
+L?Q`RfjUK[]^afh<KcI_DfnXKn1_bg1ERnb3k0B;AP@k1PPZLPJh1P1@je^;GPCAhoN72RX00W@5
+^040jdbh04B;GPC=8G8nm\:0MCFh0D8cbH_AcB5b;U9@^092<lV;dLdQRDKlREKnFUUb6KP0@\dQ
+LQ8kE_ib2GL5>dKlLP;[]c?0j`A@j9;RRnEM`eF;k5IGRgh4__oo>Gd>MEn3O@H0M1b3?@1m2EOX
+EP1I2l1eBoM50P@0M0OoM@SX6?9IP7d407`;RTD4V53Xi_IIRo37A@800<M51P00a`D00<I51?n3
+O@`0M1@c`51@ogD<j4SSD>PZk5W7A@`008_6GeiM`eF;k5IGRgh42ome1NS>0>]V>Gd>M0Fhooo[
+GX<m07`YmdD2201e2X_71@D0>DD:MDK71@00RlL51@0iA@Ye>8]528U52^\`jbj;A@H31D2;l2Te
+D8]528U52U2:A@BHD>S>6H?41S_6M0ggA@800WD6Pdd24>^O<l1OGUg3EH_\EULcdX]n1>\3R1E7
+PoX:M2KoCPIn8H]N2?l?O0b;M`[oA`Z:1;@0j`OoMPSXW@IIRm0moomedX?jogD9>gh4M@@c`>\D
+aPD0Reh8mdL2401d13?0j`>;APAOGUg3EH_\Pn`2EUO7A_h008\n22Znb2S[4_M40P<0M0QFj0;o
+FOm6oX?648_7C`_0MNN;A_iOGX_UGL=ERnb3k09FEh]f2<M6oP00Rmi6RPn:`CabM@Rj0@2o0@3[
+883iMgD5^P83j`R0nF5e3KX22LM6oX00_`80j`@c`>]YRPa6P?T[M0n0?2]e7h3iM7@5P?URMAF0
+nB]e0XX<Pn;lPlX4adKnP06o0`20nGAe1X7:043[7H3iHWD6PLX0P>\?XC8Z9@302m2;`ZT0P7@3
+Plm0a`K4:2V>Reh6RAN;GPB;A_j91h_7Gej;iEg21P1ERnb3k0AFRgH:ogH6SDKnD8e6o53X=?n9
+A08;`7@PP7`407dWogKlRdKn2dH4D?mf2>SM1h?41XQ410[0O@g6A0Coad@2~2<l3[@HY419Q@
+j4OPF@_0M0F1C0800[P00U3gA0800W@5^040j`8c`50c`51Fj24>Pl@82l1d1eKX?oeIjl;7A0`0
+08_6GX_UGL8805Jnb2R0O0@0O1>Q22Za1=?P1LPXRmJ3aQ0k`WOWP7`407`4<l3[0X_6G\=ERncX
+con;d0_0M@@c`>\=D_mf1?mf1S?0D>PToeg3EH_\^;5oD?mf1?mf1Xe6253XTNUM`eF;k5IGjKT0
+odH6Reh4RdL6>dH6MPF;APK[1X]N18]71X_hReh4mdL2@01dHH=o1P1dFh]71S]61W=CPcl0MDko
+CPHcon\<Reh40gl6RdL6:DH6Reh4RdL6>dH6M^UGogH8RTL4V53X`>23a0J;d05F23_GM4^;ab_2
+0DH6Reh4Pdl28>]4Reh8R1OoAPSoCPJ;APH;`7@TCg@QReh4o`ml38]g2_m72XX4]03[1omf1>SK
+0eV;d3googG:Po[oM;b3OPH0M0?Y?_n;APIOGUg21P1ERnb3k0AFRgH62oId=X_N<lV;APPcd^P:
+h8UFoXU6o8?j0GLOLP@;`7<IogH4ogKlogH:j?KnReKl:m1B<m9HmoK[0S?0GX_UGL=ERnaFEh]f
+18<l07d:Re@60aA2Ro[[2h\4VC?2:l:;d8_hmd@2@01e;8]<2X<l07dMj`U9RmV0?`Ye0DN;`TX;
+`7G`ja2;fD60?`Ye0DN;`TX;`7G`RlMOGUg20P1ERnaFEh]f18]n2UKX^O]I2l1d1KSoon]7Pol1
+MA23?01n2eKXO?nI:DH66EH8PF@2Gok71000Rd@8RD@:Eomf2?mf1XY419Q@j8_NPl@8Po[oM@Xm
+oome1KSoon\2<l1OGUg3EH_\Pn`4EX]f18Y419Q@j0;WFHUFoXU6o8?jogD5?OooM1f3?01m3EKX
+4onI0DKl4EKnj`]Fj0KoVBU6o1UFoX]FoX]6o5j;iEg3EH_\RdH4?E`0M0Dm;`1e1KP10>\2<l1M
+`P80EH_\Pn`8EUNhX@1@j9;]FHU6oP_0M@Dc`>UN0H]n1XX5V8_HmXO19`ad781m0CYe5XX5V8U6
+nU3X]NII1L3oRDKhPlL2ja:=A_Q@j2[JFH]6n0E104R9A_Z:1IQ@j8Go2l1e?;RQ053oM_koM_SX
+WP:3a0H;`7D9ogKnj5C\FN^FogKnj<0>FH]FoP?@Ro::A?nHD>Q>o`_0MA;615c[38]foXY6nXP4
+A\H4>TIGE^SA3EUIRgKnRoj;gdN:1iR9A_`;`7@8D>PKo`_0M6^0O?l^MA6:A?jHD>P9o`_0M0F3
+kP;[<X1lobie;81loRie9XY4oIQ@j>cn2l1d6X?^0h1locYe0nU_odj;gXX7V53Xd_h;`7CbPgkl
+07DLRTCoV53X`?h;`7@1CX1locYe1<H4G4K6103[2HY6o8P4A^Ugoomfo^So3EU0Rm23OP@0M1lk
+EPQf0nTNoomfo_mf1>PP3EUIogKnj6O[FH]61>\9D_mfo^R0kEUIGej;iEg3EH_\Pn`4EUN;MPJ;
+OPP;mWD4RlO[<8_N<lV;ac?Bj17MREKnRDKlPoX1MaQb10_0La;oMPCoM_coMP[X=`Hcd_Ofj`8c
+`5mNRnEM`eIG_a@0_\PXja>;A08U00<m00=e1EKX6OUIPlH@RlM?2l1eiUmN`eF;k5J;MPCgA080
+0W@3j<Soog@6Rd@8RD@:D8Y419Q@j3<8Pl@6R@@;`7h8Pf@2gc?0jaj3?01e3X]40REooPdP08U4
+0^\8a`@008=<0Q2hoomNGL8205F;k5J;MPCo15KX101IGUg3EH_\EX]f10_fM@JhoooYU`23?01n
+3Ol<Re`:od@:RPOYP`23?01lE?M40Q01MDggA08107A6PD`2P023O0H0M0aFj5?o2l1dcN_0jlWg
+A0800W@3j1[o^040D;Q0>e2:A0BHD>R71h?41P_0MB>:A0BHD>Q1meTm0@1d1X=<0Q3[RH]40REo
+oPdP08U40^Ujoh0n@3\=M@OgA09007B^Pf@2gj10>k@0GUg3^<PXD>Q>oeW3EH_\Pna8EUN;OPJ;
+APB9A_h;`7D:]1W=8K@0@8U6oXY6oPA0R4JhaTJi>\I6^Ub=M[^dAhYFo\dQL`@c`>\jSDJhD>Sb
+2eTkAPQb2<L6U00R0>_W2ome5Omf2>PdjUV;n0_0M@S71Y@0203[cXe6^51Gj?l:FEV;aemNRnEM
+`eF;k8?\0UIGRgh47PL;og@J\02:9KWooocb[_OABG@;Rck>:`_oRGknM@\c`>\ZPdKn0X]noX\m
+2omdkhX52\1djC[PMNV;fH0i?GGRRgH4ljJ7bgGIAh_7Gej;iEg3EH_\EULN1h]n18]f1X]>2=7Y
+o?>UL`6TRdH4GeiM`eF;k5LN1h]n18]>1XY628[Po?O70@1d1><9ZTWAjO>[L`6ZGeg3EH_\EX]f
+18Y61U3oMPQFj<SoPl@6RlINGL=ERnaFEah7RdH4>dH6L`Km^040j`?l<l2;MPB;OPJ;CPP;`7@6
+0o5>0oU?mlL107@4ha6TBB_`:oSAjO>UL`D3l0?hY?aOGUg3EH_\EX]f1?mf25KoMPKXY_n3a0J;
+aUiM`eF;k8]>1;@lReH6cB5b0^\4D>QDf5g2101ERnb;GP@[bB_B]43=8Eg20P1ERnb3k0AFEh]f
+1X]n2?O60<1e2:4b:RD0`0_`<l1@ogH4j9K\FEV9A_kgaP01M7PS?S@ZRlNYP05e1kP1053Xo=N3
+O_koMB>3?SPZ0W@:ocHh:^SXenW]0?O7P01d13?0j`>h0@29A_k[3?O600Ad=kQ@053[g?O6l01d
+6Omf13?0D>Q?oh_h2l1m0nVe05OXJNaIja;oMPCoM_kX=_n;n0_0OFcYW01FogH4j9d0FEV;n0_0
+O5Xc`51Gj1CWFEV9A_bYP01d7X7>023gaP20M1hUo`0=801@^040D5OXlNJ3a0K[2_O6009d15OX
+o_kgA_h107@JmlH00G@DmlK`07@>^040D53oMPCX[N^3a0H;og`_mlH00g@5^00@j`8c`8_FPN;o
+n0_@D_M6oP40M0@c`>\3^001FP_@RmoAhhVG2RZ;aemNRnEM`eF;k8?\0[01Rdh6ml4207D:\0;g
+`@@0M@:`08]F1;7`8Th62\6d?LdQLQZ9A_j;APHUokP=082;G_kAhhV72RZ;A_k[153XZMJ;iEg3
+EH_\XI@0>`JP;GdCPcjD~2O0b;7Y@0dN>;UeH]j`>jVRmBogH4^:P_D;SX:53X0_N3a0QM`eF;
+k5J;MPKo35J:APBHD>P505UIGUg3EH_\EUN;OPJ:APBR@S^3?Omm>_l5Red:odD:R0OgA@8807D3
+jOD0P3i2>`Yd2X0n@S\=M0?Yi01Gj0?dF@_0M@?Yf02hoooYe`3Yc`3gA@:@07D7mdD20P1e1X==
+0Q3[hh5=0P01Pgd607A5Pcd0M0UGj<[cF@_0MLZ;A@Kgf8T5Red:odD:X48kR0OgA@8807D3jHH0
+P3i2>`Yd1h0n@S\=MGQGj9OcF@_0M6o[UN][RTD4V=7PRmSgQ`XZ00Qd4kP2050c`51@RTD4V53X
+OMJ3a0R0?T8k2WDOmdD2@01e6;P1052h\2m@RTD4V53XPPj3a0Hm0@1e6;P1052h@S]@RTD4V53X
+JPj3a0Hm0@1d2_M50P02M@?Y?onP@S^d05mNGL=ERnbhf2Q@ogH4j<knFEUM`eF;k8?\0UIGRgh4
+RdH6RDKnmdD2201d:N\JEh]N2?m628X7V53XX_iIFCgoogD5<l3YE@6;APKoCPH;`7GLjDD1mdD2
+@01e0nWO08=m1P1e0nVH08]51S]61W=?Pcd0M0UGj:CbF@_0MLF:A@BHdN2;f?N72RX027@C^080
+D3?0D52:A@BHD>R>eH?42?mf1_mf28Y519Q@j:<=Pl@6>dH6LP?Yh03[QnWK08\50dH6O1^3?@1e
+2[Soob]51XT5j`aGj4CbF@_0M0?YH_ooMPKoMPSoM@[X7o^3a0J;1@=61XT5RdH60DD:jIX0RTD4
+V=7PRmSgQ`XZ00Qd4kP2050c`51@RTD4V53X3=F3a0SoMPKoMPR:A@BHD>PQ3H?41S]61W=Qj@Oo
+jeb3O@H0M3g[;ol5OAB;G@[oA@Z;MPSoAPR:18P7]03[3eN;GPSoAPR:1e3XG?eIFCgoogD3jLkn
+RdH6odh62l1ean\IogH6ogH8RTD4V53X_`^3a0HkAPIc0nVYoX]6oUmNRnEM`PH0EH_\Pn`2EUOo
+MPCX4@EIRDH4Pgh407@SRgh47PL;og@JRRF`?KWooocb[_OABG@;Rck>:`_oRGknMA?oMPCX2n=I
+^?oojgJ3A_h2RgknRcd;og@TRPD:`7@N>^1ejH_IP3TmMN:;MPCcYXO;MMV;O_j;APB91N]3Rekn
+:ak>:h?30S\NSP1b9h?325?XS>=IRoPN1`_oM:>73Xh0DH\fcR_cY8L6cR]@j:7RPl@2Fh\ncR^;
+APB7@Oj90C?0Gej;iEg3EH_\Pn`4EUN;AP@k1PPZLPZh1P1@j;KBjJL0RdH8@3d2078=Reh4dN?g
+Q`XZ009d1C?0jH`0ogH8ogH6ogH4j5[DPl@6RDKn@3d2078=Reh4dN?gQ`XZ041e1H]6o^]RRdkn
+RgH67PN;oX_No:`l6W@]?0ed1J[Rm>\Lh_06DkP1052=A_e@ogH4j0oDPl@6F`OlRTKmZS_kM@;[
+VN\PDkP1053gfA_0D57oMPCX5=>3a0R;GPCAhh6?2RX00U\[niMOGX_UGL=ERnaFRgH4Rdh6>cH8
+:W85^0H0jc>;dH7R0<2;`S_1MBB1nP30M1j;g]7SRhl::X_NdN>;`BGo?`_2RHL::X_19@30j`Nh
+0@1@j;[AGUg3EH_\EUN;MPB;OPXiM0ie38=n209o1X7oogmf1[SoonVT08<n]2l0M@j1o]PXM@S7
+1[@_0@3[4h<n\Rl0M@b1o\PXM@K71[8_0@23?01d3kP1050c`51@E^Qklh?42?M40P@0M0OoM0SX
+1n5IPf@2llM41P00RlH51@29A0R9A0Z3OPP2M3h;ogHja`K2:4n>Pgh607DHEnRWhEV9APH;`7D3
+jGOoPd`21>\3jFkoRdH6RD@:RD@8RG`6Pgh80GD4Pd`223?0GeiM`eF;k5IGRgh6RgH4Eomf2?ld
+j:ogPl@60Cb;7<H708_7GeiM`PH0EH_\Reh4aPL0^>J3D8e6153oMPJ=APQ@j=oJGL=ERnb;GPC6
+1`2hiX=@SDH4D?mf1_mf2>S3fUg3EH_\EX]f18\Lo`B:5h[22\1e1KSoon\4R\:d05iM`eF;k5J;
+MPKo35iM`eF;k8e6253oMPJ=APA@^6B4D;Q5Q53XAM:3a0YM`eF;k?mf2?mf1Xe6152hI8A@^4F4
+D>PXdX?42Ug3EH_\Pn`dEUN=E\bd6\dQLPn;EPBi5P2dC\dQLP?YU029A_jh]Rm@ogH4j;D2FET;
+`7D2jgLc`53oMPA@j=;bPl@6RDKl2l1dHh]No8X7V8U6nXY70iR9A_R3O_P0MCQCj83OFH=nnV5l
+2X=nnWYo1;1Qj`:`@HYFnR[@R5K<adKR~2adKT8@37A^P00<M6iP00_T11jdJ;E_bi5P2dC\dQ
+W?mfo>PkgeVML`SoM_kXM\o[LXYFhB_fm\90MB^1cP01oTk<m\8@M@n1cP21m\81M@Z1cX00j`B1
+cT10ogKTogKRj<g<TN\=adK<oon1cX0Q:lV;dH]n1Qh7o8Y6c9R[Tb_0ZiJ[^040ZiJ[Zi>[RdKV
+Zh]6j:^AZi:[TZ^BZi:[TZ\c`5mNRnEM`eF;k5IGo8]n11h7RmLb`;Wooo:^SGGoRgh6^OoolZkg
+dB_iQoOgaP40M0:TBM7YljEc0JBBGeiM`eF;k5IGS=R>`?`c`8_HRgh6RoLb`;Wooo:^mm6;oX]f
+1?>VRTCoRUgo:l=OGUg3EH_\EULN1ob;OPJ;mc;0^OoolZkgdH]n1?>TRdH4GeiM`eF;k8?\0UIG
+RgH4E^RC05U0RDKnD>STgUV;n0_0M0_oM_iFD>PQmH?41X_7Gej;iEg3EH_\EX]F1X]f13\FX2em
+3P_BO0Z;f]7SRiMF;N\3^[X_2oId5h0l07@BDUJhb2m@^4@kD>Q2oH?42>\?D[S@;e2hA3]@j37m
+Pl@6^4@kGUg2101ERnco=Y@0ogH4j:3oGL=ERncoMP@c`53XT_mM`eF;k5N<f8k0Rgh4<l3l^Ooo
+lZjAmm18Geg3EH_\Pn`2EUN;OPAGj=OoFHU6o_mf1^S=oeV;l3]f27H3RgH8EX_70dKnD?mf1^Rj
+m8?41X]NoP?NaP40RlMOGX_UGL=ERnaFEhcHS\3lRgh6RoLb`8]N28_;lZh[fH]n18O;ljB;bo>Z
+RdH4GeiM`eF;k5IGRgh4jaJ;MPK[2hX5>PAe18_7j`i6P3`0MO17P3d0MNDc`5mNGL=ERnb3k0AF
+Eh]n1>SG0Z40<8\FoRn1`P2V5LhBRDKnREKlRcF1aTChRlKAn=7hVE1B^XH7^80OFE_XN\h1A_`A
+E_j;aRD309U@D[[Q0KR0<eUKj67>0DKl4EKnmlH307@9PDKlP563E_h1<lV:A@>HB8_`j`Q>RXCD
+;iP3b0_fOoB:A@:HB0?8P7d30Wh7m`D307D1@H]N1XY70K@0D8_1^QP0mnYJ0l:;l8<n0S00M1R:
+A`6d051A<l1@R`D5C_Q@j9032l1d0Dj;aYU@DS?B^10>FE_Xg\d1A_`AE_j;GPJ:1k@0VE1B<m:h
+?01IFnS4cH]N1XYO0kL0D8_3DYUKF@?84mX1C_`AG_j;E_j;A_aOGX_UGL=ERnaFEh]f28]n2^S0
+0J40<8\FoRn1`P2V5LhB:EH46DH6aTD203?0^S`0D5;oMPKoMPCXkLZ8A@<c`;Xl051BogH6ogH4
+j<_:REH6RDH4<l2j?01@D_mf1_mf1>S4bXP5<l2j?01@D_mf1_mf1>RSbXUF1XU613?0^_R8D5;o
+MPKoMPCXSL[Ah=7P1K`7R@@c`;[hR51BogH6ogH4j8?:REH6RDH4Pgh607`lM@N1OPA@8W8cPFh4
+D2:3GPH0o`@c`;Xh8U1BogH6ogH4j4C:0@@c`;Xh8U1BogH6ogH4j47:REH6RDH4Pch2<01d>S?0
+^QP0D5;oMPKoMPCX9<Y@<l2j601@D_mf1_mf1>P4bU0c`52;10E>n53X808;`7@8PdH40H=F1P0c
+`;XH051BogH6ogH4j>[9R4D1<l2j601@D_mf1_mf1>S8bHUF1XU618=61063EPH0m`@307D^Pgh6
+07`BO`J3OP@lMPZ3KP@1Peh60>\FPgh607D@Pgh4?7D:aT@30\I40Qg[?<I40`3[5HY40iR;f8Z7
+e2nHVBU611UF1_i40hY40iR;f8Z7e2nHVC]F1WcJM@DkAPAbdoi40hY618Q40UmNGL=FEkP4<53X
+Y?1IRoP;`7AbD>QBo5Tm101bJ8X5V8_HRXO19iRY301dFHY50IR;f8Z7`BNHZ@`0M4V:A@:HRmR:
+Ql4WV:T<07@iP7d3;G@CP7d3:g@=RTD3V8_HmXO19`9d88Y50iR;f8Z7`BNHZ@80MCn:A@BHRmR:
+Ql4WV:T207D_a`H2<040a`H0<000a`Kn;e16^0L`D?lfnRoX0o]IFKP;<53o=_`_j?KjFEWY^`2h
+101@<l1@ocKl;nRBl8?41[P3051GocKj;nSfnh?41X\NnRo6A`<0RlL50`1@j5GMFE1B<m:h40iI
+FnSRbXTF032SoRo71P8`~2_P<0jfB;gXX1V8_HmXO19`adEH_70lI@j4okFCd3079?Rmn:@06H
+RmR:Ql4WV:T<07@mRmn:@0:HRmR:Ql4WV:T<07@[^0<0D8_70lI@ocKl;nQcnh?41X\No2o6A`<0
+a`H2<040j`Q6Rmj0>@1eUEmN`eF;k5J3OPH0MBb;MPR3OPPkLPb;AP@5AP2Y0`1e0Dk7APH00>\3
+odH6Reh6dN<i]n0_M_;[8H=n1P=b2h]610E60:T307@3odh8Reh6Bm7SRhOP;`5628=n1PAbNg@8
+Pgh62WMcMFb;GPKAhh=n111n3h=n1PAe2H^?gRn3`@O[18^?h2n;GPB1`k87m\<3M059Reh4@m7k
+dO\3fKQ]0OMV10?31@@0<m:k1`3glb_:RdH8Pgh617D>>l5g5WDIP7h:0W8Cj``k`G88M@^0OPX1
+M`Fh0@3[0S?0GUg2201ERnb1k8P0EUN;OPB;MPHk?PPZLPZh1P1@j<c7jMl0RdH8@3d207<5<l3Y
+d@2;gm7SmhL::P08M0nh0P1@<l1@D5OXVLR3a0R;gm7SmhL::P10M@koMPQFEnRX08?41^VL08_O
+dN>1Y`XZoof9M_Z;APR9A_k[COm>oX]Nn_m6nXX7R4Km?0Ye1<H43DJ:A_f814J=QWSoRmH[d87j
+P01l9b_`EU1Gj5\0Pl@6Rm0kaW@BPo[oM@Fhooo[?H]622]6o^\aSKIhoh=noP1eZHf6N?l[l8_6
+2l1f8EJ=QWSoD5OX8023a0J;d3_6M0j3n_mdaH]620?2:lK[0h]625mNRnEM`eF;k8]N1=7SmhL:
+:P40M0Jh1@1@jand@8]N18]>28]F1\dQLPm@Reh4dN>1S`XZ011Hj`A@j:c6GL=FEc?o_\PX>ch8
+:W<Fmd@20`1d1EKX1>AIPlH@Ac\n22YbjUmN`eIG_`@0_\PXja3gA08307@5E^QFi5U?PlH@2ome
+k5mN``00~2@VmbK65^I213:b\P;B13Kg1iLVUWJ7@P<CTi<B12Kg9\HFiT84U^M6`^04ieK6`P
+L6mYKWAULR1QLg=YIfi]IFid3@Y4JGIYI6DPIG9bKg8=2T5RKVmbKF5\871bKfMbHFdPM6EbKFU^
+HGAYKfh=2P00~TkS_^>`00~:94UT902K0@40~2X@40~3\040~3]`41~3_042~3`040~3a@41~3
+c`40~3g@42~3i`40~3n040~32080~50@0001<2~47P80~3:P8a0P00=P8n0TD2B`8005@2V`;R
+0RT3L0>g0oh3A@B<1000d`@0~2g@@0~2i@@0~2j`@0~2m@@0~20PD0~22PD0~240D0~27PD0~2
+8PD0~2:@D0~2;PD0~2?PD0~2B`D0~2E0D0~2F`D0~2H@D0~7J`D0~2M0D0~2N`D0~7I6ERMFL0
+IFiSKfAYKVMOM65RK6D0IVmbKF5d06QUK700K6mW06e_I6D0KgIULWMbJGAU079UHfmbI5m\IFiW
+M6P0M6U]IG=dHFe`07AbHFicK65dJFm^GfIYK6D0J6EQI6EbGfIYK6EcL6ES07=`K6UdGg=YNVD0
+JFi`MGAOIVU\I@1_MGA`MGAOIVU\I@1RJFiQLWT0M6EhM01TIFIQMFad07=dLVEQK@1VJGQUI01f
+HG9YHF9\I@0Z:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ
+:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ02XZ821DJ6Uc86Uc864PEUIUKV=_I6ET86IYK6D^8219KG1\
+IFeUKWAQM6U_KW<PKfHPEUI4AD=?A4DPHFiT820P820P:RX0:RXP85IFADi3CdA5865bIB1VLVEU
+K7TPHGIQJFaQHVaU86I_LR1]HFii86AYIVIULVE^M21SKfe`MGAULW<PHFiT820Z:P0Z:R0PKg1U
+LV5dJFiW87=iLgAUKG<^821DJ6DPKF5cM6Eb871_LWAQHVaU84<PLfmeLV=U86Uc865fHFU\HF9\
+IB0P82XZ02XZ821VLVm]87AXIB11LgA_KR1EKVUfIG9cJGAi85AUF21QLV=XJGIU82dPM6QU86Q_
+KFDPKfHPEUI3CdA5;R0P820P:RX0:RXP820P820P820P820P820P820P820P820P820P820P820P
+820P820P820P820P820P820P820P820P820P820P820Z:P0Z:R0PBFHPNFme87MQKW@PM6lPIVU^
+I21_MG@PKFmbIB1QHVmeM21FET=?A4D\87=UKV@PHB1]IG=cHFMU87A_820P82XZ02XZ821<JG=d
+Ge=ULWIULT1DIEP^@F<^EF\PMfUdJ21dJ6DPLgERJVESM21dIGQd82M8ADa@85IF@dm4ABLP820P
+820P:RX0:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ
+:RXZ:RXZ:RXZ:RXZ:RXZ:RXZ:P1QM7AbHVEWJFh0HGAdLVE^I01RIFMYKP1RNGAUHfmeKW@0HfQQ
+LV5SM6EbLfEd06=_KFeUKW@0Hg9S<c80I6ESKfAUMVEbLfU_KP1UKV@0IVmbKF5d06e_I6D0Kg1U
+LV5dJFiWLgUcM6E]079UHfmbI6aUKVMdJ01cJfU`IW9_K@1cJfU`M6l0M65RK6D0M6U]IG=dHFe`
+07Q\M2eVLVm]07Q\M2edK`1hK7@]LgERLgASJ65b06U`Gf9eIVIULP14AD9EAcXP06E^HfmTICXP
+LVESKg9T86aUKVMdJ20m82DeK6@\87A_M65\869iM6Ec879UHF@P?B0U<C1\I00:06AUIUmVJFaU
+GfiQKFD0EUIUKV=_I6DP9G<\82Ec879UK6EQLfDP:2Ec:@X0<2hi=b1RIGAQ04eC;DA?Db1DMG9R
+Kb13038e84i_MR0a>CTb04T_D21VJFaU>R0P820P820P820P820P820P820P820P820P9G<0CgIU
+LWMbJGAU86EhJG=dJFiW86IYK6Ec>R0P820P820P820UL`1iIG<0KVl0C6mW86IYK6Dj820P820P
+820P820P820P820P820P820P820UL`15KV=_I6U^Ib1]IGAXKf@j820P820P820P820P820P820P
+85IFHfmTI@X0BBm@86IYK6DPKFmTICXP820P820P820P820P820P820P820UL`1eKV]^KgM^04T_
+D21VJFaU86I_LVeQM3XP820P820P820P820P820P820P9G<0MFi[KVmgKP19;e0PIVU\IB1\KfiW
+IG=d879UHfmbI21\IFiWM6Pj820P82E\I019;e0PIVU\IB1\KfiWIG=d879UHfmbI21\IFiWM6Pj
+820P87E^Jfi_Mfh0BBm@86IYK6DPKF5hJFeeKB1bIF=_LV@PK6E^IgAX>R0P820UK6@0BBm@86IY
+K6DPKF5hJFeeKB1bIF=_LV@PK6E^IgAX>R0P821eKV]^KgM^04T_D21VJFaU87AYKFEcM65]L3XP
+820P820P820P820P820P9G<:07E^Jfi_Mfh0@E=3BDT0M79QKW=\HGAYKfhPIVU\IB1dLV5^LfaQ
+M6Ec86IbKfdPH2Ec9b1dKb1P9G<W06a_Hf5\86=XHG9QHgAULR1cIG@PJG<PH2Ec9`11Dd=9B@1D
+LV5^LfaQM6U_KR1`IG9VKg9]IF@j820P820P820P820P86i_KVD0BFidIG9^HF`PIG9bKg8PI6Ed
+IF=dIF@PJFhP9G<X:@1_L6E^GfU`GfIYK6D0A4E2EDLj801UKV=_I6Dj86m`IFiYKVLPJFi`MG@P
+IVU\IB1P9G<W00X0IG9bKg8PKg1UKVU^Ib1YKW1eM21VJFaU860ULbL0A4E2EDLj801_L6E^GfU`
+GfIYK6Dj860ULbLPJG<PKVmd864PLVEWMFaQLR1VJFaU00X0;@1cM6A_MG@0MWIU04A5@UE7>R00
+Kg1UKUm_L5mVJFaU>R1_L6E^JFiW86meM71eM21VJFaU860ULbL02P00MWIU04A5@UE7>R00Kg1U
+KUm_L5mVJFaU>R1_L6E^JFiW86meM71eM21VJFaU860ULbL02P1ULW9_LR1_L6E^JFiW86meM71e
+M21VJFaU860ULbL02UIFAB1?;e0PIVU\ICXP820P820P820P820P820P820P820P9G<0A4E2EDLj
+801_L6E^Gfm`GfIYK6Dj860ULbLPJG<PKVmd864PLVEWMFaQLR1VJFaU00X0M69\06EbLVmb879U
+HFAYKVLPIFiSKfAYKVLPM65RK6DPIVU\IB1P9G<W04A5@UE7>R00IFiSKfAYKVLPM65RK6DPKVmd
+87=`IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0I6EVHGE\M21FET=?A4D0:bd`<C8c=3Df
+=cPi@D93A4E6AdQ9BT]<CDi?D55BDeAEEUMHFEYQHV=TIFIWJ6UZJfa]KVm`LG9cM7EfMgQiNP0:
+AFiSKfAYKVLPM65RK6DPLfmeLV=U>R0P820P820P820P820UL`15KV=_I6U^Ib1dHF9\IB1SKfid
+IFidLcXP820P820P820P82D^<c9c020P820P820P820P820P820P820P820P820P820P820P820P
+9Bhc<W<0EUI586E^HfmTJFiW86I_LVeQM3XP820P820P820P820P820UL`1^Kg@PLVESKg9TIF@0
+J6AbGfIYK6EOLg1UH`1FETDPJ6EQI6Eb86IYK6DPLg1UHcXP820P820P820P820P82Ec04U^M6Eb
+KV5\86EbLVmb86AUM6ESM6ET86U^82Ec:2T0LfEdGfU`GfIYK6EcL6ES02d0LgATJFh0JFifHFaY
+I21VJFaU86E^HfmTJFiW86e_I6DPLfEd82PUI2T0EUI586E^HfmTJFiW86e_I6Dj820P820P820P
+820P820P820UL`1FETDPK6m^IfEcM21bIF=_LV@PK6E^IgAX>R0P820P820P86i_M21bIF=_LVAU
+I01YKWIQK6UT86a_KVMULg@PLVESKg9T86aUKVMdJ21cIG@P:2E\I2T0EUI586a_KVMULg@PLVES
+Kg9T86aUKVMdJ3XP820P820P820UK6@0JFifHFaYI21\KfiWIG=d879UHfmbI21\IFiWM6PPLfEd
+82PUK6@Y05IFAB1\KfiWIG=d879UHfmbI21\IFiWM6Pj820P820P820P9FaT05IFAB1]HGQYKGE]
+879UHfmbI21\IFiWM6Pj820P820P820PKVmd879UHfmbI6ET06U^MV5\JF@PKF5hJFeeKB1bIF=_
+LV@PK6E^IgAX87=UM20X9FaT:@1FETDPKF5hJFeeKB1bIF=_LV@PK6E^IgAX>R0P820P820P82E\
+I01YKWIQK6UT86eQN6U]MFdPLVESKg9T86aUKVMdJ21cIG@P:2E\I2T0EUI586eQN6U]MFdPLVES
+Kg9T86aUKVMdJ3XP820P820P820UK6@0A4E2EDLj801cL6aYM21cJGYU86i_M21cL6ESJFIYIF@P
+KfhPM6QU86=_KFeQKV@PK6U^I@0:05IFAB1?;e0PIVU\IB1]HGQYKGE]87=YNVDj820P820P820P
+KVlPKF5hJFeeK@1^Kg@PIFiSKfAYKVLPM6lPHB1VJFaU82dPIVU\IB1cL6aYM7AYKVLPI6UcHF9\
+IF@0EUI584l_D21VJFaU86eQN6U]MFdPLfUjICXP820P820P821^Kb1]HGQYKGE]02E\I01YKWIQ
+K6UT87=`K6Ud87=YNVDPLg1UHfUVJFET860ULbL0Lg1\JG@PLfUjIB1]MG=d869U865d86aUHG=d
+82E\I21[@P1FETDPCbm@86IYK6DPKF5hJFeeKB1cJGYU>R0P820P820P82E\I21[@P1FETDPIVU\
+IB1dJFeULgAQKG0j820P820P820P820P820P82Ec06i_M21bIF=_LVAUI01]HGQYKGE]86ieKF9U
+LR1_IR1`HG9dLb1bIF5SJ6ET82PUI2T002EcLf]YL7A_82ET2P1FMP1@HG9d82DcI21RNGAULb1g
+LVUdM6E^>R0P820P820P820P82E\I01f9C0bI01ULW9_LR1_L6E^JFiW86meM71eM21VJFaU860U
+LbL002Ec9G<:05If02Ec9G<P9FaT2P1FMP0ULbEc82D`>6ah2P1FMP1@HG9d82DcI21RNGAULb1g
+LVUdM6E^>R0P820P820P820P82E\I00:@e93;C<b>R0P820P820P820P820P820P820P820P820P
+820U<3Q\N01DKgAQK21RNGAULb1bIF5T>R0P820P820P820P820P820P82E\I01DKgAQK21RNGAU
+Lb1gLVUdM6E^>R0P820P820P820P820P82E\I01DKgAQK21?;e0PL65bM7<PMg9YM7AUKSXP820P
+820P820P82ET00YFEVE^HfmTIB0ULb`P9G<PLVE\IF5cIB0X9G<Y2PX0<2hi=b1RIGAQ04eC;DA?
+Db1DMG9RKb13038e84i_MR0a>CTb05IFIFiSKfAU>R0UL`X:05EcHFMU>R1FEVE^HfmTIB0PFg5e
+HFaYIVUULW=M821YKW1eM5mVJFaU821KKgEdL7EdGfIYK6EM2PX0821FHFaYI21aMF5\JFIYIG9c
+865bICX:2P0P82D^<G<UL`X0;bd0820U;S5c9G<U;S5cIVU\IBecL6ES2P0_;@0m>Rd0820U;S5c
+9G<U;S5cIVU\IBeVKg9]HG@P82QVKg9]HGAc87=eL71_LWAUI3XULbEc9G<ULbEc9G<Y2P0_;@0m
+>Rd0800P0200820U;S5c9G<U;S5cIVU\IBecL6ES2P0_;@0m>Rd0820U;S5c9G<:02l]020P9Bha
+LbEcFbD^<G=VJFaU;G=`IF=M2P0_;@0m>Rd0820U;S5c9G<U;S5cIVU\IBe]KfAU820XKFmTIG<P
+LgE`L6mbM6ET>R1RJFiQLWTPM6EhM2T:02l]03dj;@0P82D^<G<UL`X0;bd0820U;S5c9G<U;S5c
+HWUdIG<:02l]03dj;@0P82D^<G<ULbD^<G=[HWUdIG<:02l]03dj;@0P82D^<G<ULe\U;S5cM6U]
+IEd:02l]03dj;@0P82D^<G<ULbD^<G=VJFaU;G=`IF<:2P0_;@0m>Rd0EWH0EP0:00Y@HG9d82Dc
+I21?;e0PIVU\ICXP820P820P820P820P820P82Ec051QLW@P9C=T87=dHG9dIF@PHG@PBBm@869i
+M6Dj820P820P9FaT02Ec2P1GLVUdM6E^869i85IFIFiSKfAU82Ec;0X0<2hi=b1RIGAQ020P820P
+820P820P9G<PLVE\IF5cIB0X9G<Y2P1=Dbe4Ce<PE7EbHVlP@`0b=B1>KgHP<CTi<P0:02Ec9G<P
+9F@:05If02Ec9G<P9G<:05If04eC;DA?D`0ULbEc82Ec2P1FMP0ULbEc84mbJFMYKV5\86IYK6DP
+HfQQLV5SM6Eb87=UM21gHG<P9G<:05If045C@dU902Ec9G<P9G<:05If045C@dU902Ec9G<P9G<:
+05If02Ec9G<P9G<:05If02Ec9G<P9FaT82E\I0X0EWH09G<ULb0UK6@:05If02Ec9G<P9G<:05If
+02Ec9G<:05If02Ec9Bhc<W<:05If02Ec9Bhc<W<:05If02Ec9G<P9G<:05If02Ec9G<:05If02Ec
+9Bhc<W<:05If02Ec9Bhc<W<:05If02Ec9G<P9F@P9G<:05If02Ec82E\I21RNGAULb1VKg8PM6QU
+86eULg=QIfDPHWEVIVEb2P16@EA1C3XPMFiQHVaU87A_865\K6mSHGAU04A5@UE7>R00KF5YKSXP
+HFa\Kf=QM6ET82E\I21RNGAULb1VKg8PHWEVIVEb860ULbL0AemdKG1OKG=W00X0AemYL5mRMFIV
+IG80Aem_L5mRMFIVIG80;bd0?CX]06QUK70PLVEaMFEcM6ET06U^L7Ed86IYK6DPKGEcM21RIB1c
+L6ESJFIYIF@094UT900O01`07`0N01l07P0O01l07P0O01h07`1ULW9_LR1QK6a_Hf5dJFiW82E\
+I21RNGAULb1VKg8PHWEVIVEb860ULbL0A4E2EDLj801QK6a_Hf5dIEmRMFIVIG8j865\K6mSHGAU
+I20UK6@PHWUdIG<PIVmb869eIVIULR1P9G<W00X0Hfm]KFE^M5mcM79OHWEVIVEb02DZLb0UFeh:
+G@1FETDPIVU\IB1SKfe]IFid>R0P820P820P820P820P9G<0IG9bKg8PL65bLfU^Ib1fHFaeIB1_
+IR1P9G<W86QUHFAULP1ULW9_LR1SK6mcJFiW86IYK6DPH2Ec9`14AD9EAcXP06MUM6=OIVmbKF5d
+>R1VKg9]HG@PKVmd87=`IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0JFifHFaYI21VKg9]
+HG@PH2Ec9`14AD9EAcXP06MUM6=OIVmbKF5d>R1SKfe]HFiT86aYKVDPLg1UHfUVJFEc86I_LVeQ
+M21P9G<W00X0A4E2EDLj801WIGASGfe_I6Dj86e_I6DPKVmd87=`IF=YIVUUI21_KR1dJ6DPHfm]
+KF5^I21\JFiU00X0JFifHFaYI21]KfAU860ULbL0A4E2EDLj801WIGASGfe_I6Dj86=_KFeQKV@P
+K6U^IB1cL6ESJFIYIG<PKFmTIB1P9G<W00X0A4E2EDLj801WIGASGg9UHfaUKSXPLVESKg9T86aU
+KVMdJ21^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P0UK6@0JFifHFaYI21bIF=_
+LV@PK6E^IgAX87=`IF=YIVUUI21P9G<W079UHfmbI21\IFiWM6PPKGEcM21RIB1YKR1dJ6DPLV5^
+IfDP9FaT;BE\I20XKVmd82E\I2T0LVESKg9T86aUKVMdJ21]MG=d869U86U^87AXIB1bHFiWIB0U
+K6@]9FaT82Q^Kg@P9FaT:@14AD9EAcXP06MUM6=OLVESK6E^>R1SKfe]HFiT86aYKVDPLg1UHfUV
+JFEc86eQN6U]MFdPLVESKg9T86aUKVMdJ21P9FaT9`0:04A5@UE7>R00IfEdHemdJFeULgAQKG0j
+87AYKFEcM65]L21^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P1YKWIQK6UT87AY
+KFEcM65]L21cM79YKVLPLg1UHfUVJFET860ULbL0A4E2EDLj801XIF5TIG9OM7U`ICXPEUI586aY
+KVDPKF5dHfQULb1XIF5TIG8j860ULbL02P1QKF9YIgE_MG<PJ6EQI6Eb86UWKVmbIF@0A4E2EDLj
+801XIF5TIG9OM7U`ICXPJFM^Kg9UI21eKV]^KgM^85IFAB1XIF5TIG8PK6U^ICXPH2Ec9`0:04A5
+@UE7>R00KF5[IEmdJFeU>R1THGAU871bKgIYI6ET83dP9C0dI2lU<39T;bD`<V@02P14AD9EAcXP
+06eQJfEOM6U]ICXPM6U]IB1`LVmfJFAUI20m82D`<V@j9C0bI3XU<39T00X0A4E2EDLj801]HF]U
+GgAYKFDj87AYKFEOM21fHFaeIB1bIGAeLViUI20m82E\I00:04A5@UE7>R00Kg1UKUm\KfMOIVU\
+ICXPK6mW86IYK6DPKVmd87=`IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0K6mW04A5@UE7
+>R00Kg1UKUm\KfMOIVU\ICXPKg1UKVU^Ib1\KfLPIVU\IB1P9G<W00X0LgATIG9b06EbLVmb86m`
+IFiYKVLPK6mW86IYK6DPH2Ec9`14AD9EAcXP06m`IFiOK6mWGfIYK6Dj860ULbLPJG<PKVmd864P
+LVEWMFaQLR1VJFaU00X0I7E]KGT09BYc82Ec06EbLVmb871QLW=YKVLPMV5\MFDPKfHPH2Ec9b1X
+IF5TIG80A4E2EDLj801`HG9cGgAYKFDj85IFAB1dJFeULgAQKG0PLgAbJFiW871bKgIYI6ET83dP
+H2Ec9`0:02D`=6@^9C0bI2hU<39T;BD`<V@j9C0bI3XU<39T06EbLVmb871QLW=YKVLPM6U]IG=d
+HFe`87=dLVU^Ib1P9G<W07UUHG8P:5UIFETY86eeLg@PHVDPJFhPM6QU879QKVMU834i=c0]<S0c
+=b0XKVmd82ET:@X0KFm^M6PP:4e=:B1]MG=d869U86U^87AXIB1bHFiWIB0a;C4b82Q^Kg@P9F@Y
+2P1THGTP:4A4:B1]MG=d869U86U^87AXIB1bHFiWIB0a;C<a82Q^Kg@P9F@Y2P1XKgEbLb0XB4PY
+86eeLg@PHVDPJFhPM6QU879QKVMU830]<S<P:6i_M20UI2T:06eYKWEdIG<P:4e=:B1]MG=d869U
+86U^87AXIB1bHFiWIB0`;CDi82Q^Kg@P9F@Y2P1cIF=_KVAc82QCDbTPKGEcM21RIB1YKR1dJ6DP
+LV5^IfDP<2de>B0XKVmd82ET:@X0A4E2EDLj801`HG9cGgAYKFDj87AYKFEOM21fHFaeIB1bIGAe
+LViUI20m82E\I00:06UdIFeOLgAb02EXI01ULW9_LR1`HG9cJFiW86UdIFdP9F@P:60ULbLY86U^
+87AbHFicK65dJFm^86IYK6D0JFifHFaYI21fHFaeIB0X9F@Y86mV86UdIFdP9F@PJFhPM79QKW=\
+HGAYKfhPIVU\I@1gLVm^Ib1^MFeRIG8PKfHPMV5\MFEc86U^87AbHFicK65dJFm^86IYK6Dj82ET
+069eIVIULP1ULW9_LR1_L6E^JFiW86E^HfmTJFiW87AQHVaU86IYK6DPH2Ec9`1ULW9_LR1bIF5T
+JFiW86E^HfmTJFiW87AQHVaU86IYK6D0M6m_86eQKWTPHfQQLV5SM6EbLb1YKR1UKV=_I6U^Ib1d
+HF9\IB1VJFaU>R0UI01^Kg@PIFi_MFMX86=XHG9QHgAULW<PJFhPIFiSKfAYKVLPM65RK6DPIVU\
+ICXP9F@0IG9bKg8PKg1UKVU^Ib1dLV5^LfaQM6U_KR1VJFaU860ULbL0N6adGf9eIVIULP1ULW9_
+LR1bIF5TJFiW87AbHFicK65dJFm^86IYK6D0J6EQI6Eb860ULbLPLVE`IF5dIF@PJFhPM79QKW=\
+HGAYKfhPIVU\I@19KWAULViQK21ULW9_LR1TIGAUHgAUI21YKR0ULbPY079TGgQ\M5mVJFaU02EX
+I01YKWIQK6UT860ULbLPJ6EQI6Eb87IQK7EU86U^87AbHFicK65dJFm^86IYK6Dj860ULbL0M6m_
+86eQKWTPHfQQLV5SM6EbLb1YKR1dLV5^LfaQM6U_KR1VJFaU>R0UI01XIF5TIG8PH2Ec9b1^Kg@P
+IVmeKV@PJFhPM79QKW=\HGAYKfhPIVU\I@1XIF5TIG8PH2Ec9b1^Kg@PIVmeKV@PJFhPM79QKW=\
+HGAYKfhPIVU\I@1XIF5TIG8PH2Ec9b1^Kg@PIVmeKV@PJFhPM79QKW=\HGAYKfhPIVU\I@1YKWIQ
+K6UT86E^HfmTJFiW87AQHVaU82dPHfQQLV5SM6Eb831h9C0bF21TMG1\JF=QM6ET07Q\M01ULW9_
+LR1bIF5TJFiW87AbHFicK65dJFm^87AQHVaU86IYK6DPH2Ec9`0:E79QKW=\HGAYKfhPM65RK6DP
+LfmeLV=U>R0P820P820P820UL`1DLV5^LfaQM6U_KR1`IG9VKg9]IF@j820P820P820P820P860U
+LbLPM6lPH2Ec9`1SKfidIGQd>R1\JFiU82E\I21_IR1VJFaU860ULbL0M6EhM3XPH2Ec9`1SKfid
+IGQd>R1\JFiU82E\I21_IR1VJFaU860ULbL0A4E2EDLj801fMUmdJFeULgAQKG0j87AYKFEOM21f
+HFaeIB1`LVmfJFAUI20m82E\I00:07AYKFEOM21fHFaeIB0l830P:2E\I2TP;B1SKfifIG9dIF@P
+M6lP<0X09C0dI2hU<39T;RD`<V@]9C0bI3XU<39T>RD`<V@084M=E014AD9EAcXP07IfGgAYKFEc
+M65]L3XPEUI587AYKFEcM65]L21cM79YKVLPLVEdMG9^87IQK7EU83dPH2Ec9`X02P1SKgE\I6hW
+M21QK6a_Hf5dIB0UI21RNGAULb1dKb1SKg1i87=dLVU^Ib1P9G<W02A9I2@02REc85]I;diM>R00
+ADm686AUM6ESM6ET86m^87=dHFiTHG9T86U^L7Ed079R06=_MFaTKRMd86EhHFeYKVDP:6m`IFhY
+86IYK6DPH2Ec9`14AD9EAcXP06EhHFeYKVEOIVU\ICXPH2Ec9b1YLb1^Kg@PHB1bIFMeK65b86IY
+K6D02P1SKgE\I6hWM21UN65]JFiU82QcM65d:B1VJFaU860ULbL0LVEQLfm^86I_LR1ULW9_LSXP
+9G<0LV80LW@0JFifHFaYI21VJFaU86e_I6DPLg1UHfUVJFET82PUI2T0IG9bKg8PKg1UKVU^Ib1V
+JFaU860ULbLPIVmb86U^L7Ed04IYK6DPH2Ec9b1UN6UcM7<^821?MVEbMg9YM6DP?`1_L6EbHGAY
+KfhPHf5^HfE\K6ET06IYK6DPH2Ec9b1UN6UcM7<0Mf80Mg@0JFifHFaYI21VJFaU86e_I6DPLg1U
+HfUVJFET82PUI2T0IG9bKg8PKg1UKVU^Ib1VJFaU860ULbLPIVmb86meM71eM000@2<T9EhV;Elm
+:f5RHfAUIVMXJFY[K6e^Kg1aLW=dMGIgN7Uj@D93A4E6AdQ9BT]<CDi?D55BDeAEEUMHFEX`<C8c
+=3Df=cPi<0108b@UGRH]Gcd[HF9SI6EVIfQYJV]\KFi_L75bLgAeMWMhNGY1@T=4ADI7B4U:Bda=
+CTm@DE9CE5EFEeQIFS0a<S<d=CHg>3T`07=eLg1YHfU_MG<PJ6EQI6Eb86IYK6DPLg1UHb1P9G<W
+86=XHFiWIF@PM6lPH2Ec9`00G3X0G00^00XUL`1ULW9_LR1bIF5TJFiW87=dLVU^Ib1VLVm]87=d
+I6U^04A5@UE7>R00Lf=QKUmSKFAOK6U^ICXPHfm]KF5^I21\JFiU865bIgE]IFid>R1P9G<W00X0
+;@14AD9EAcXP07=SHFiOHfeTGfaYKVDj86eQM6=XIG<PLGEQK6UVJFEb>R0P820P860ULbL02P1Q
+KF9YIgE_MG<PLGEQK6UVJFEb860ULbL0MFi[KVmgKR1aMF5\JFIYIG8PH2Ec9`1aMF5\JFIYIG8P
+H2D^<G<ULbLPKGEcM21dHF]U864PMV5\MFD0;bd0MV5\MFDPKFUcLfU^Ib1QIWAULR1aMF5\JFIY
+IG8PH2Ec9`1aMF5\JFIYIG8PH2D^<G<ULbLPI6mULb1^Kg@PM65[IB1Q87IQK7EU02l]04A5@UE7
+>R00Lf=QKUmSKFAOK6U^ICXPLGEQK6UVJFEb87IQK7EU>R0P820P820PH2Ec9`0:07A_Kb1]HFii
+86IYK6DPKV5]IG<PLg1UHfUVJFET04A5@UE7>R00LfEdGfIdJFeU>R1cIGAdJFiW86IYK6DPH2Ec
+9b1dJFeU87A_82D^<SAc00X0@f5^KVmd87=UM21VJFaU860ULbLPM6U]IB1dKb0UL`1bIF5cKfhj
+84eC;DA?Db1TKfEc86i_M21cMG1`Kg9d86IYK6DPM6U]IG<PHVEVKg9U834i>30^04IYK6DPH2Ec
+9b1dJFeU87=UM21dKb0a>CP`;S0a;S0a;C0`>S0`>S0`84M=E01ULW9_LR1cIGAdJFiW86IYK6DP
+H2Ec9b1dJFeU87A_82D^<SAc04U^M6EbKV5\86EbLVmb86AUM6ESM6ET86U^82Ec:2T0LfEdGg1Y
+L6EOKFmTI@1ULW9_LR1cIGAdJFiW86e_I6DPKfHPIVU\IB1P9G<W03YL05AJ05AJ?@17CE@`@U=D
+~282d]800:Ed5BCTU>AcXP00Y5DU9?DSXP00Y6@EA1C3XP04U^M6EbKV5\86EbLVmb86AUM6ES
+M6ET86U^82Ec:2T0MG=ULUm]IG=cHFMU02Ec9G<:02Ec9G<:06meM71eM21bIF=_LV@PM6m_86a_
+KVLP:2E\I21RNGAULb`PKF5h83dP9FaT:B0]87AbMFiSHGAUI01ULW9_LR1_L6E^JFiW86IYK6DP
+H2Ec9`1ULW9_LR1cIGAdJFiW86IYK6DPH2Ec9b1dJFeU87A_82D^<SAc06EbLVmb86=\Kg=YKVLP
+IVU\IB1P9G<W~5820P820P820P8B4Q8B4P820P820P820P820P820P8201@410@410@410@410
+@4100P820P820P820T10@410@40D51@D51@410@410@410@410@410@410@41410@410@1PH61PH
+60P820P820P820P820P820P820P8@410@200~~~b=5<dDcAC~22@80~9b2P000X20@00~7f2P0
+00820P00~7j2P004<20`00~7n2P004821000~722T0~~~~~~~55001H09P0V04X0:P~O@?oo~5
+4`8210D620P851D54olF1A42ooooooooooooooooo`D5ooooooooooooooooooooo`oo8`;o3ooo
+oolCool20PD?0_oooa?oooooooooob?ooooo8olCo`1DCE00;R@T900000820P820P820@410@42
+0P820P820P820P820P820P810P820P<20P8210820P821@D51@D51@D51@820P820P820P872QD:
+30T20P\250h20P820PP20Q820Q0240820P821PL:2PX<2@823@8A3Q<20Pl220824P820P820P80
+42Q^MFa\:@0051@151DD51@D0P0D0`@D2@D51@D51@D51A@D51@D51@D51@D3aL?21@D50LD5Q@D
+51@D51@D50dD51@D51@D51@D40X?3`l82Q@D1Q@B2`hD514D31@D3A@D51@D51@0L79YKW@PLf=Q
+KVHP>R1VK6mQM6U^Ib1`KfU^M21VKg9]HGAc86i_M21\JFi[IF@=2P00~E7a`O7QlN7alN7ahO
+~27`0k05X0N02G0;D0e03c0141<05>0D@\B2a<;50\E2aH;5`\H2aW;6h\MRb0;8T\T2bI;9d\
+XBbU;:T\[Bba;;D\^Bbm;<4\aBc9;=4\fRcP;>H\jRc_;?@\nb`5;@d]5RdO;B8]DgE^04e_KP1D
+MFD0EfET05AXM@16LVT0Df5d05=eKVAQN@1=KfiTHGT0E7EULfAQN@1GIFA^IG=THGT0E6QeLW=T
+HGT0AW9YI65i05=QM7EbI65i04YQKP16IF80CF5b045`LP1=HGT0BWE^04YeK011MFL0DfE`04mS
+M01>KgH0A6ES04YQKWEQLWT0AVERLWEQLWT0CF5bHfP0@G1bJF`0CF5i04YeKVD0BWE\N@11MFMe
+Lg@0DfE`M6E]HVEb04mSM6mRIG80CVmfIFeRIG80A6ESIFeRIG80@Dd0D4d09G<P9G<P9C0bI20U
+<39T>RD`<V@j9C0bI20U=6@0<300800P02`P03X`03X`02D00:8]ZRg2;M`]jbgo;A4^8Bhf;TP^
+IBii;XP^W2h00:T^^2kN;^h^o2h=;ah_<2l0~C@Rm@;f4_R2lU04EbLVmb8300BFifHFaYI21V
+MFiSM6U_KR1^MFeRIG80CVlPLgESJ21VJFaU86mb86AYLVESM6mbN@1@HGAX86i_M21VKgE^I01D
+KflPKF5^NB1_L6E^86IYK6Ec051ULVeYLg=YKfhPI6E^JFET049QI21VJFaU86ieKF9ULP1=IFe_
+LWTPHG9UKV4PM79QLfQUI01>Kg@PIFi_MFMX86eUKFmbN@19KWIQK6UT86eUKFmbNB1RK6mSJb1Q
+I6AbIG=c04U^MV5\JF@PIFifJG9_KVeUKW@0BFifHFaYI21VKg9]HG@0BFifHFaYI21QHf=ULg<P
+HfmTI@19KWIQK6UT86AQM640CVlPLgESJ21TIGIYHfD0@GAdIFe`M6ET87A_879UKFmfIB1SMG9b
+IFid86AYLVESM6mbN@1>Kg@PLf5]IB1TIGIYHfD0CVlPKFmbIB1VJFaUL`19KWIQK6UT865bIgE]
+IFid045bIb1\JG=d87A_Kb1RJFL0AGQUHb1VKg9]HG@PIG9bKg80@g9_Lg<]I6EfJF=U86aYKV\0
+CF5dJ21QLVMeKFE^M01BIG=eK7@PM6m_86aQLVMU04IYK6DPHFabIF5TNB1UN6UcM7=6JFaU865\
+LVEQI7TPIGQYLgAc051_Lg=YHVaU86AUHFA\Kf=[05E^Jfi_MfhPIG9bKg809G<j82Ec2P0=~5
+G2l^05E^Jfi_MfhPIG9bKg809G<j82Ec2P0UL`X07a`O7QlN7alN7ahO~27`0k05X0N02G0;D0
+e03c0141<05>0Fd1jS_V>e16~20@1DFP15De@0ADAD~2B6A=I4eTCF@00UAM~341MW~342QX~3
+7Yf:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+~~~~~~~~~~~Bne8@0llF~2CP8[0HP0Q`<]0@<0~2[`1e1@<00`030>3<~60@00~38000~;K`E1
+E@00~>0@0005`1~30P0006l1~30`0009L1~310000>`1~31@0007P2~31P0008d2~31`0008l2
+~3201Z0942~260T0J@3A1@0060X0J0022P0060\0I`3n2P0060`0IP2k300060d0I@3\3@0060h0
+I0253P0060l0H`0i3`006100HP2W3`006140H@1R40006180H00F4`0061<0G`16500061@0GP00
+5@0061D0G@1a5P0061H0G03`600061L0J`2@6P0061P0F`2l6`0061T0K01m8`0061X0b@299000
+61\0b00G9@0061`0a`2e9@0061d0aP079P0061h0a@3Q9P0061l0a02Z9`006200``0K:@006240
+`P32:@006280`@3R:P0062<0`01K:`0062@0_`0I;00062D0_P0C;P0062H0_@1U;`0062L0_03^
+;`0062P0^`2T<@0062T0^P0a<`0062X0^@3?=00062\0^01`>00062`0]`3`>00062d0]P2R>@00
+62h0]@0M>P0062l0]01A>P006300\`3J>P006340\P0_>`006380\@2m>`0063<0\03o>`0063@0
+[`1:?00063D0[P27?00063H0[@3e?P0063L0[01G?`0063P0:@6V?`0063T0:04Z@00063X09`6f
+@00063\09P4A@P0063`09@58@P0063d0907C@P0063h08`6T@`0063l08P7:@`0064008@4EA000
+6440805AA00064807`5CA@0064<07P4:AP0064@07@5gAP0064D0707lAP0064H06`5SA`0064L0
+6P7QA`0064P06@4BB`0064T0604PC00064X05`6fC00064\05P6gC@0064`05@4\CP0064d0504f
+C`0064h04`5fC`0064l04P76C`006500~2f540~2D@000?aA~3DP0001UB~3D`0003AB~3E000
+04MB~3E@0005iB~3EP050H9C~3E`00095C~3F0000:=C~3F@000;5C~3FP000;eC~3F`000=1C
+~3G02B0>=C~3G@000>IC~3GP000>IC~3G`000>YC~3H0000>eC~3H@000>eC~3HP2B0?9C~3H`00
+0?EC~3I0000?EC~3I@000?YC~3IP000?eC~3I`000?eC~3J00_095D~3J@0009AD~3JP0009AD
+~3J`0_0;9D~3K0000;ED~3K@000;ED~3KP000==D~3K`0000aE~3L03[01iE~3L@0002mE~3LP00
+0:aE~3L`000<UE~3M0000?9E~3M@0002eF~3MP2B06iF~3M`0008EF~3N0000:5F~3N@000<iF
+~3NP0008iK~3N`0000eM~3O000021M~3O@3Y03=M~3OP0005AM~3O`000?5M~3P02M02=N~3P@00
+06YN~3PP1>081N~3P`3j0:aN~3Q0000=QN~3Q@0000IO~3QP000;AS~3Q`000=US~3R0000?]S
+~3R@0002aT~3RP0003QT~3R`0006MT~3S0040HiT~3S@2T05eU~3SP000;AV~3S`0000EW~3T000
+00UW~3T@0000eW~3TP00015W~3T`3W095X~3U000095X~3U@00095X~3UP3]0:=X~3U`000=AX
+~3V00004AY~3V@00051Y~3VP3\06]Y~3V`00095Y~3W0000<M[~3W@3g0=e[~3WP0000i\~3W`3h
+035\~3X0000=9]~3X@0002M^~3XP000<ia~3X`2Z04Eb~3Y00@0KYb~3Y@0>0CMc~3YP0009Mc
+~3Y`0008=d~3Z00001Me~3Z@0=0D9e~3ZP0<0F5e~3Z`0:0DYf~3[0000?9f~3[@0005Ig~3[P00
+0;ag~3[`090Cai~3\0060@Ij~3\@0?0AMj~3\P0001Mj~3\`000<9j~3]0000<]j~3]@030DYk
+~3]P000:Uk~3]`000<Qk~3^0000>ik~3^@0000Ql~3^P00055l~3^`3Z09El~3_0000>5m~3_@00
+02in~3_P0006An~3_`0;0G]n~3`0000:1o~3`@000;5o~3`P020D:1~3``0000F2~3a03X0<f2
+~3a@0001b3~3aP080@b4~3a`0002V4~3b02W0724~3b@0008j4~3bP3i0:^4~3b`010MN5~3c000
+0A26~3c@3o03n6~3cP000666~3c`000>J6~3d0070OF6~3d@3n00>7~3dP3m01f7~3d`3l0667
+~3e00008f7~3e@000;R7~3eP000<n8~3e`3f09f:~3f00000b<~3f@000>^<~3fP000>n=~3f`00
+02V>~3g00004n>~3g@00~3i`P0gP0007@0i`P0g`0007P0i`P0h00007`0i`P0h@000800i`P0
+hP0008@0i`P0h`0008H0i`P0i00008P0i`P0i@0008X0i`P0iP0008`0i`P0i`0008h0i`P0j000
+0900i`P0j@000980i`P0jP000980i`P0j`000980i`P0k00009<0i`P0k@0409@0i`P0kP0009H0
+i`P0k`0009X0i`P0l03W09`0i`P0l@0009h0i`P0lP000:80i`P0l`000:H0i`P0m01a00T1i`P0
+m@1`00l1i`P0mP1_02d1i`P0m`1]08L1i`P0n0000;hWi`P0n@3k0<0Wi`P0nP000<8Xi`P0n`00
+0<@Xi`P0o0000<HXi`P0o@0A0LPXi`P0oP0000PZi`P0o`0000XZi`P00040038Zi`P00@4003@Z
+i`P00P4003HZi`P00`4003PZi`P0104003XZi`P01@4001h[i`P01P400;X[i`P01`400;`[i`P0
+20400;h[i`P02@400<0[i`P02P400<8[i`P02`400<h[i`P0304005H]i`P03@400:0]i`P03P40
+0>0_i`P03`400?X_i`P040460?h_i`P04@40008`i`P04P40010`i`P04`40018`i`P05046030`
+i`P05@4403@`i`P05P4403H`i`P05`4603P`i`P0604403``i`P06@4603h`i`P06P4K048`i`P0
+6`4K0;8`i`P0704K028ai`P07@4J098ai`P07P4J09@ai`P07`4J09Hai`P0804J09Pai`P08@5b
+09Xai`P08P4K09hci`P08`5d00hdi`P0905e04ldi`P09@42054fi`P09P44058fi`P09`5f05@f
+i`P0:0400<Hji`P0:@4_~51BX1~61B\1~61B`1~2300000D]0@00010000D`0@H0g_l0008a0@H0
+h_l0008b0@H0i_l0008c0AP0E?l0008d0AT0[_l0008e0@X01`0000@f0@@0j_l0008g0@H0k?l0
+008h0@H0l?l0008i0@H0m?l0008j0@H0n?l0008k0AX0o?l0008l0AX0o_l0008m0A\08?l0008n
+0AX01P0000@o0A\0T?l000900B801P0000Y10B00100000Y10B001`0000a00B801P0000a20B80
+2P0000Y30@@0200000Xn0B<01P0000Y40B00100000Y40B001`0000`n0B<01P0000Y30@@02000
+00Y20B801P0000a50AX0200000Y60@@01P0000Y70B00100000Y80@@0o_l000990A\0S_l00097
+0B001P0000a60@@01P0000Y50AX01`0000a00B802P0000Y:0BD0200000Y;0B@01P0000Y<0B00
+100000Y=0@@0o_l0009<0B00100000Y;0B@01`0000a:0BD0200000Y00B801P0000a>0BH02000
+00Y00B@01P0000Y?0B00100000Y@0AX01P0000AA0BL0l?l0009B0BP0m_l0009?0B00100000Y0
+0B@01P0000Y>0BH01`0000a00B801P0000Y10B00100000Y10B001P0000a00B801`0000a00B80
+2P0000YC0BD0200000Y;0B@01P0000YD0B00100000YE0@@0o_l0009D0B00100000Y;0B@01`00
+00aC0BD0200000Y00B801P0000a00B80200000Y;0B@01P0000YF0B00100000YG0@H0o?l0009F
+0B00100000Y;0B@01`0000a00B801P0000aH0BX0200000YI0BT01P0000Y20B@0100000Y80@@0
+n_l0009J0@H0o?l000920B@01`0000aI0BT01P0000aH0BX0200000Y00B80200000Y;0B@01P00
+00YK0B00100000YL0@H0o?l0009K0B00100000Y;0B@01`0000a00B801P0000aM0B\0200000Y2
+0B801P0000Y30@@0100000X`0@H0m_l0008`0@H0m_l0008d0B`0e_l0009N0Bd0n_l000930@@0
+100000Y20B801P0000aM0B\01`0000``0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0
+008d0Bh0g?l0009O0B<0100000YO0B<0100000YP0AX02P0000YQ0@H01P0000Xl0B<0100000YR
+0@@01P0000@e0@X0m_l0009S0@@0n?l0009T0@@0n_l0009U0@@0o?l0009V0@@0o_l0008l0B<0
+100000YQ0@H01P0000YP0AX01`0000aW0@@0100000X`0@H0o?l0008`0@H0o?l0008`0@H0o?l0
+008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`
+0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0
+o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0008`0@H0o?l0
+009X0@@01P0000AW0@@0100000YY0BD01P0000YZ0@@0100000Y[0@X01P0000AZ0@@0100000YY
+0BD01P0000Ya0G80~41W816`00~31W<1KP00~31W@18@00~31WD11P00~31WH11000~31WL13000
+~31WP12P00~31WT12000~31WX12000~31W\10P00~31W`11P00~31Wd11P00~31Wh10P00~31Wl1
+1000~31X017P00~31X411P00~31X812P00~31W01N@2Z0>L806l1N02_0>L806h18@3m0>L806d1
+8@030NL806`1M`0I0NL80:81NP06~32Z<12P04~32S\1N`3no`000Z@12P06~31:<12P04~32Z81
+NP07~33:D1PP08~32ZH1NP06~32T01O004~32ZL1103no`000ZP1N`07~31401O004~32ZH1NP06
+~32ZD1PP06~33:T1Q004~32TP1103no`000ZT1Q006~334X1Q`06~32ZX1Q@04~32Z\11007~3
+1:X1Q@06~334X1Q`06~32U<1Q`06~32Z`1Q@04~32Zd11007~31:`1Q@06~335<1Q`06~32T01
+O006~32Zh1Q@04~32TP1103jo`000Zl11P3lo`000Zh1Q@06~33401O007~33;01Q@04~32U`1
+1P3lo`000[01Q@06~33;41R008~32ZH1NP06~32T01O004~32[811006~31;<1103lo`000[@1
+103no`000T01O004~32ZH1NP07~33;41R008~32[D1R@0:~32[H13006~32[L11004~32[P1303l
+o`000[T12P06~313D12P01~31;L11004~32[H13006~32[D1R@0:~32[X1100:~32[\11008~3
+2[`1NP06~32[d1Q`04~32[h11007~31;@1103no`000[l11006~31;d1Q`04~32[`1NP06~32[\1
+1008~32[X1100:~32\41RP04~32\81103fo`000\<11P3ho`000\@11P3lo`000\41RP07~33<D1
+Q00:~32T<11008~32Sh1NP06~32\H1Q@04~32\H1Q@07~333h1NP06~32T<11008~32\D1Q006
+~33:D1PP08~32ZH1NP06~32T01O004~32ZL1103no`000\L1N`07~31401O004~32ZH1NP06~3
+2ZD1PP06~33<P1NP04~32\T1R`3Zo`000\X11P3lo`000\\11007~31<P1NP06~33<`11008~3
+2\d1S006~32\h1NP04~32TP10P3eo`000\l1N`3fo`000]01N`3ho`000]412P3jo`000]811007
+~31=<1N`3lo`000ZL1103no`000]@1N`06~31<h1NP04~32\d1S006~32\`11008~32TD1N`08
+~32TH11006~32TT1Q004~32]D11P3fo`000]H10P3ko`000]L1103lo`000]P1N`3no`000Y<1
+N`07~314T1Q006~334H11006~32TD1N`08~32\d1S008~32Sd1Q006~32]T1PP04~32\h1N`3\
+o`000\`1103^o`000]H10P3ao`000[81103bo`000ZL1103do`000]P1N`3fo`000]X1N`3ho`00
+0]L1103jo`000SP11P3lo`000Y<1S`3Zo@000]T1PP06~333d1Q007~33<d1S008~32]\1T00:
+~32]`11008~32TD1NP06~32TH11004~32\811006~314H11004~32TD1NP07~33=`11008~32]\1
+T00:~32]T1PP08~32]d1S006~32Sd1Q004~32TP1103no`000Sd1Q007~33=d1S006~33=T1PP08
+~32]h1NP06~32]l1O004~32]l1O006~33=h1NP07~33>011006~32^41NP04~32\811002~31>41
+NP01~33>011006~32^81NP06~32^<1NP04~32^@1103lo`000^D1103no`000\811006~31><1
+NP07~33>81NP06~32^H11008~32^81NP06~32^<1NP04~32\811002~31><1NP01~33>81NP06
+~33>H11008~32^H11008~32^81NP06~32^<1NP04~32^@1103lo`000^D1103no`000\811006
+~31><1NP07~33>81NP06~32^H11008~32^011006~32^41NP04~32^L1103no`000\811006~3
+1>41NP07~33>011006~32^P1NP06~32^41NP04~32^L1103no`000\811006~31>41NP07~33>P1
+NP06~32^P1NP06~32^41NP04~32SD11006~31>41NP07~33>P1NP06~32\X11P04~32^T11P3T
+o`000^X11P3Xo`000^\11P3\o`000^`11P3`o`000^d11P3do`000^h1103ho`000^l1103jo`00
+0_01103lo`000_41103no`000_811007~31?<11006~31<X11P04~32_@1T@1D>^L80>41NP04
+~32_D12P3no`000U01N`07~31>41NP06~33>41N`04~32^L1103no`000_H1N`07~31>41N`06
+~33741S@00~31W81O@00~31W<1P`00~31W@1QP00~31WD11P00~31WH11000~31WL13000~31WP1
+2P00~31WT12000~31WX12000~31W\10P00~31W`11P00~31Wd11P00~31Wh10P00~31Wl11000
+~31X01P000~31X411P00~31X812P00~31\01R`00~31g01b`125NL80?L1bP175NL800@2c@08
+~32PD2c006~32PH2c004~32PL2cP2\o`000PP22P3^o`000PT2c`3`o`000PX2d03fo`000PH2
+c006~330D2c007~330@2c@08~32P\2c004~32P`21006~310\2c004~32T\1d@04~32Ph2e`3L
+o@000\81103jo`000Pl22P3lo`000Q022P07~313P12P3no`000S@1f03jo@000T\1d@06~33401
+d@04~32X@1e007~31401d@06~33481d@06~32Q421004~32X@1e007~311421004~32T81d@06
+~338<1c004~32X<1c004~32P@2c@06~32Q82c004~32PL2f@2do`000PX2fP3fo`000Q82c006
+~330@2c@07~334\1f`04~32TP1103lo`000Q<2103no`000T\1f`06~331@2c004~32U01c@06
+~311H2c@3^o`000QL2g@3`o`000QP2gP3fo`000Q@2c007~331D2g01d>^L800@2c@0<~32QT2
+c00:~32PT2c008~32PX2c006~32PL2c004~32U01c@3lo`000QX2103no`000PL2c004~32PX2
+c006~32PT2c006~331T2c00:~32P@2c@07~331\2c@08~32Q`21006~32P\2c004~32TP1c@06
+~310\2c004~32Q`21006~32Q\2c@07~33401d@0:~32Y<1c@08~32Qd21P04~32Qh2103jo`00
+0SD11P3lo`000Qd21P04~32Y<1c@08~32T01d@06~33401d@0:~32Y<1c@08~32Qd21P04~32U01
+c@3no`000Qd21P04~32Y<1c@07~33401d@06~33401d@0:~32Y<1c@08~32Qd21P04~32SP11P3l
+o`000Qd21P04~32Y<1c@07~33401d@06~331l2h00@~32R02h00>~32R42h00<~32R82c00:~3
+2R<2c008~32R@2g`06~32RD21004~32RH2c@3bo`000RL2c@3do`000RP2c@3fo`000RT2103h
+o`000RX21007~311X2103jo`000R\2103lo`000R`2c@3no`000RD21004~32R@2g`06~32R<2
+c008~32R82c00:~32R42h006~33202h00>~32Ql2h00@~32ZT1d@04~32Rd2hP07~314P1103n
+o`000ZT1d@06~33:T1d@04~32TP1103no`000Q<21007~31:T1d@06~331T2c@0<~32PT2c@0:
+~32PX2c@08~32PL2c@06~32P@2c004~32Rh22P3jo`000SD1103lo`000U01c@3no`000Rl2c@06
+~31302i02Xo`000P@2c004~32PL2c@07~330X2c@08~32PT2c@0:~32QT2c@0<~32S421P04~3
+2S82i@3No`000S<2c@3no`000\01hP06~313421P04~32\D1d@08~32S@2c006~32TP11004~3
+2SD2c@3lo`000SH2103no`000SL21006~314P11004~32S@2c006~32\D1d@07~33481d@0:~3
+2Y<1c008~32Qd21P04~32SD11P3lo`000Qd21P04~32Y<1c008~32T81d@06~33481d@0:~32Y<1
+c008~32Qd21P04~32_D11P3lo`000Qd21P04~32Y<1c008~32T81d@06~333P21P06~32X<1c@04
+~32Rd2hP06~313X2iP3ho`000TP1103lo`000S\2103no`000X<1c@07~333P21P06~32W81dP00
+~31W@1h@00~31WD11P00~31WH11000~31WL13000~31WP12P00~31WT12000~31WX12000~31W\1
+0P00~31W`11P00~31Wd11P00~31Wh10P00~31Wl11000~31X01e@00~31X411P00~31X812P00
+~31ST2iP00~31l01h`00~31`d2e`00~31c`2:P5ED0006701:`6P8NL802l10@W20AL00@010040
+0@2Q0@49]08E00800@0200400`812G<35@0300400`0109l1KZmK6P42NZmK6Th2<JmK6ZD0T@:n
+0:<2`02Z0\40]0;40;H2aP300]D0c`;G0=H2f03F0]T0l0;K0?h2g@010ml03`?P04`3h@1A0nX0
+D`?[05<3k01]0nh0N`?`07h3n@2<0o\0T`?m09L3oP2G0`L1\@<90KD34`7`0a@1o0<S0@D49045
+12H160@W0CT4:05<12X1G`@\0F<4;P5l12l1O0@`0Il4<@6[1381\@@c0KH4>`6h13`1f@@m0MT4
+?P7c13l1o`A90@D5B`4<1D`130E>0Ah5D04i1E41>@EB0D\5D`5J1E@1IPEM0Fh56`6d1F01b`Eo
+0M45SP7R1Hl1k`F@0Oh5T@7n1IP14PJJ0AT6V`4O1Yd18@JO0BP6X04^1Z<1<0J]0CH6[P4f1[H1
+B@Jg0GD6^@6I1[X1b@Jk0Nd6`P7o1\X13@O<0AL7c@4T1m41;0OD0F47eP6F1mT1XPOM0L07h07B
+1n<1gPOW0O`7k04>2?D1C0Sf0F88m`5h2?P1RPSo0I`81P:^20L2`0P80\083`;F2142h0PB0^h8
+50812AL24PTH0SX96P9N2Ad2H0TU0W89;09o2Bd2TPTd0Z@9=@:j2CH2aPTg0]89>0;N2CT2jPTj
+0_09@@;e2D82o@UP0P8:KP8F2W0270Yh0T<:NP992W\2CPYn0U0:O`:02XL2R0Z90Xh:RP:_2Y82
+\PZE0\4:UP;a2YL2m@ZI0_X:]`;n2\X24P_;0QL;c08L2ld28@_>0R\;e@8e2mh2?P_P0Th;h@9B
+2n82G0_S0V4;i09V2nT2J0_b0W4;mP9o2oL2[`_i0[\;2P>m2`\3a`\<0mX;3@?X2`h360`H0b@<
+6P<Z31\3B``M0dh<90=_32L3OP`X0jh<:@>b32\3]`a90k\<G0?B35h3f0aW0n@<JP?e36`31`e_
+0`d=L0<a3G83=0ek0cH=O0=T3Gd3L@f50g\=QP>O3HL3`0f80nH=]@?\3L\30`k=0a4>c`<G3]03
+7@kB0al>e0<U3]D3:PkG0b`>f@<b3]X3>0kM0cX>h`=23^h3A`k_0gl>3@B53RH4V@hW1:P>:@Ba
+3RX4_Ph]1<0>;PC03Rl4e`hb1>d>=0Ca3Sl44@m013<?GP@i3fL4C@mY15<?KPAj3g04RPma19@?
+LPBH3gD4VPmn1:<?[@BW3l<4_Po51<`?a`CB3lP4f0o:1=X?c0CP3ld4i@o?1>L?d@C]3m84l`oE
+1?D?g`Cj3n<4213U10X@iP@]4>l4<13`15`@7@ER4345NA0c1HP@=@FD43H5X10g1JX@>@F\43\5
+\Q0l1K`@?@G643l5b1111M@@@PGP44<5k1161Nh@A`Gh45850Q5D1@hAE@DP4EH58a5H1BTAF@DY
+4E`5AQ5M1F`AH0E_4F45UA5R1ILAI0FM4FD5WA5X1KXAJ@GP4F`5ha5i1@TBN`DE4W`59a9m1BXB
+O`D`4X05<1:31DdBQ0Ec4XL5MQ:81I`BR@FN4X\5Y1:<1J@BS`G14Y05ia:C1NXBU@D@4k<55Q?1
+1BdC``Dc4l@5HA?=1F`Cc`Eb4m05MQ?A1HPCfPFA4m\5Va?M1JlCg`G34n85g1?T1NXCiPD75>d5
+6QC^1D0D6@I652d6GA@_1VXD<@Ig5386Pa@d1XDD=PJ;53L6UA@i1YLD>`JT53`6\1@o1[8DB@Jl
+54X6nQAX1P0EN`HG5Gd681En1T@EQPI75HL6FAF91YhERPKZ5Hd6kaFD1Q\FU@H[5YH6=AJH1T4F
+VPI75Y\6J1JM1V\F^`Ia5\86P1K:1Y@Fb`JV5]86jaKJ1STGhPJ?5n<6iAOU1_@Gk0HP6>h6:1Sf
+1S0Hn0Hh6007@1P11fPH0PN@60<7^1P51m`H1`OT60X7k1PX1o0H=0Ol63D7o1Pf1aHI=`LW6CP7
+9aTi1c@I@@M16DT7EaU:1eLID@Ma6F47LAU[1j<IK0NS6Fd7_AU^1kdIK`OC6G07daUa1ndILPO]
+6GT71aYj1`LJN`LM6W`77AYm1cLJOPLg6XD7DAZ61e4JQ`M[6XP7JaZ:1hDJR`N;6X`7SQZZ1i0J
+`0NT6\47[Q[21kDJb@O46\\7c1[<1m`Jc@OL6\h71Q_?1`HKd0Le6m87BA_C1ePKe0MW6mD7MQ_G
+1i@Kf0NI6mT7Xa_J1jdKf`Nf6oT7_1\22<`K10Sd6`\881`=22@L3`Qn7108b1`A21HM60QK7B48
+I1dY2;DM=0P77SL84Ahj26<N>`Re7Sl8]ai820TOD0QQ7eX8^AmL2<XOH0SH7f48=R1V23PPL@R>
+87D8WB1o2?TPP0Q78H48UB692><QRPPe8YD8>2:F28HRU`SD8Yl88R>Q27PS_`Qm8lP8RR?9290S
+d@RE8m88V2?D2:0SePRW8mL8Yb?I2;XSfPS08md8`b?T2?XSi@P:9>`86RC]21XT0`Tj90D9@B@>
+2DTT40U@9149EB@C2E`T50UQ91d9Ib@O2FhT8PUf92<9NB@T2G`T:`Uo92`9PR@]2HHTY`299;<0
+WBBd0:0T]P2X9;T0[RBj0=<T^`3F9;l0f2C100`U`P0A9N005bG]02\UkP0_9Nl0=2G`03@Um`13
+9OP0E2Gj05XUn`1k9Oh0OBGo09lU0@6Z9@81[bDP0KDU:0789BX1cRD\0MPU;P7N9Bl1obDb0@8V
+D0479Ul162IQ0AhVHP5<9VX1DRI[0E8VK@5W9WP1MBJ70GLVUP5i9Z<1NbJ[0GdV[`6F9[01d2Ja
+0MDVc`7Q9]h1lRKP0OPVh@4V9nT1:bOZ0B\Wk0509o01CBOb0DlWmP5X9oL1XROh0JHW5P:Z9bH2
+`BLX0\LW:@;e9c42oRLb0PPX=08L:3H28RPn0S\X@091:442@BQ50UhXA`:8:4l2RRQA0Y0XDP:@
+:5H2[BQK0]LXG08<:Ed25BUk0Q\YR08^:HX2=2V;0V8YT`9Z:ID2N2VF0X0YV@:2:I\2SbVN0Y`Y
+X@:e:J82_BW00\8Ye0;F:MH2gbWN0^DYh0;Z:N82kbWT0P@Zi`8P:^T2GB[[0V<Zk09V:^l2J2[`
+0WXZl@:3:_\2Vb[n0Z4Z00?D:P<3eRX50m`Z8`?R:S83lRXd0oHZ=@?n:SL30R\i0a8[?@<T:d03
+>R]20eH[H0=K:gH3K2]h0gX[NP>0:g\3RR^20hd[RP>A:h`3Ub^D0jT[UP>_:iP3bR^J0ll[V`?A
+:ih3db^Q0mH[Y0?H:jH3lb^X0oP[Z@?j:j`3o2^b0`h\\`<C;=D36BcP0bd\hP=U;>X3W2c\0j8\
+m0>Y;?D3\bcg0kX\n0?3;?X3mRcn0``]00@C;@448bd316D]30Ah;@h4PbdA18<]4`C?;A@412hE
+10d^<`@C;TH49bi712`^B0@a;TT4=Ri:140^D@A:;U<4D2iD17h^G0B1;Uh4QbiW190^JPBN;V\4
+cRi\1=X^M@CL;WH4iRig1>\^O`C_;X44mBj211H_RP@I;hd4:2n>15P_S`AL;i44HBn_16D__0Ai
+;kd4OBnn188__`BA;lH4XRo81:P_b@B`;lX4]2o=1;H_cPCH;m04hboA1>P_k`C^;oh40S001@``
+0PDE<0D57S0<1Dh`3@EC<0h5F30?1Ed`40ER<145Ic0C1F``5@E\<1`5TC0N1I\`9`Fo<2X5cC0]
+1MD`;`GJ<385iS0e1Nh`=`Ga<3X5oC0n1@Da@@DA<DD56C581BDaC0D^<Dl5>S5C1D<aE0E8<ED5
+CC5L1E8aG@EP<El5UC5P1IhaOPFT<IL5]C6H1KTaV@G9<I\5c36T1M0aXPGA<JH5hS6X1NLaZ@GZ
+<J`5k36f1O4a]0Gb<KP51S:o1@Tb`0DC<\458S;31B\ba0D[<\D5B3;81Dhbb@Ee<]45NC;B1GTb
+e@FH<]H5b3;N1L`bh0GK<^T5kS;\1OXbk@DK<nl57c?`1BHcl@D[<`l6<C<T1TDc9@ID<bH6FC<W
+1Uhc:0IX<bT6LS<`1W`c<PJ4<cD6RS<f1Z\c?PJ^<cl6]3=81[PcB@K2<d\6bS==1]lcC`K]<e46
+mc=D1_XcE@H<=5H65CAP1QXdH@HO=6<6;3AU1S8dI`Hh=6T6ACA[1TddK0IF=706F3Aa1W\dLPJ2
+=7<6QSAl1X\dO`JC=806]SB81[XdR@Jo=8X6a3B;1\TdZ@K?=<<6icC41^`da@Ka=<H6ncC71PDe
+cPH?=M065cGC1Qdee0Hn=M`6@CGM1U4egPIG=NL6GSGX1VPej@I`=N\6RCG]1YLek`JQ=O46Y3Gb
+1[Hel`Jo=O@6`SGe1\Heo@K9=Oh6cCGo1]4e0@OR=@<7j3D41nhe30Og=@h723H@1`hf4PLD=QT7
+9CHK1bDf7@Lj=Ql7BSHR1eXf9PMM=RT7KCHZ1iTf:`NT=R`7Z3H_1jXf<@O3=S<7aCHd1n`f=PO^
+=Sh7lCHo1o4f@0L5=d@763M>1d0gD0M7=e47E3ME1eHgEPMi=eL7Q3MH1hPgi@J:=e\7TcMS1iPg
+IPNN=fL7`3MX1l@gJ@O6=f`7c3M]1nlgKPOc=fl7mCMb1o\gL`LN>7@78SQg1b@hN0L`>847?CR3
+1d<hQPME>8L7G3R81f8hYPM`>;X7PCRl1hDha0NH><H7W3S81jdhb@Nk><d7_CS>1n<hd@O\>>l7
+l3P220Li2PPE>@\86CT<21hi3PP\>A48<STB25<i5@QF>AL8McTI29`i=`RR>Cl8]SU22;Xi@`SQ
+>DP8lSU:21TjJ0PM>W48;3Yc230jM@Pk>WP8BcYi24ljU`QA>Z88ICZU26TjYPR;>ZL8\3ZY2;Pj
+Z`S0>Z<8`CZ]2=0j[PSD>\`8fS[G2>djfPSa>]`8oC[N218kf0PC>n08:3_Q22`ko`P_>``9@c\?
+2DLk40UY>a49SS\C2IHk5@VN>`d9Wc\G2K<k60Vg>cH9_C]02M4k@PWI>d@9hC]62NXkB@We>dX9
+nC]X2OlkLPTC?7@96caf2B<lN0Te?7\9@3al2D@lVPU:?:<9FcbU2EllY`Ua?:X9Ocb[2H<lb@V7
+?>49V3cS2Ldli@WK?>H90CgY2@\mjPTE?N\97cgb2C8mm@Te?OL9FCgk2F4m0`Y]?@D:Ocd62X\m
+2@Z=?A8:TSdD2Y@m5PZS?AP:c3dK2]@m7@[_?Ah:13hQ2PHn90X;?R\:33h\2Qhn;@XQ?Rl:=Sh`
+2TTn<PYO?S<:LShe2XPn?0Z>?Sd:SShn2ZXn@0Zg?T4:jSi22^lnH0[e?VT:2CmZ2Q8oK0XK?fl:
+7cm`2T<oLPY6?g<:CCmd2U4oTPYG?i\:JcnM2W@oX0Yh?j4:P3nU2XXoYPZ=?j<:SSnY2Z0oYP2V
+?kH0_Cni0=Po^`3S?kh0lSo00?do``0<@<@0943D02Y0g00g@=d0B43Q0510h`1^@>D0Ld3V08E0
+i`28@>X0RT3\09a0kP2V@>l0\d010KI05@7;@1H1d40G0ME0607O@1T1jD0P0O=08P40@B@11T4U
+0BM19P4Z@Bh1;D4a0CI1<P5V@C<1Jd4d0Fm1=@5d@Cd1Md4n0GM1?`6@@D41UD530IU1A@6^@DP1
+^T590Km1D074@E81dD5G0MQ1F07M@F01hT5R0O11I07f@FP1oD5Z0@]2NP4A@Wl17D:00DI2T058
+@Yd1FD:P0FM2X@5c@Z<1MD:V0GY2Y`6M@ZX1XD:\0JE2[@76@[01bd:a0Lm2`@7C@]01i4;A0NA2
+d`7c@]D1nD;F0OU2f048@mX15D?K0BM3g@4[@n01;D?Z0C=3k@51@nh1CD?`0Dm3l`5D@oL1LT?i
+0GI3nP6G@od1W4?n0J133P:T@aH2\4<M0\Q3;@;:@cP2hD<j0^E3?0;W@cd2o4<n0Pm4CP8EA5L2
+:4AH0S94FP8lA5`2@TAM0TI4H098A682C4Ab0U54P`9UA8@2KDB60W]4R09oA8T2STB:0Y94R`:E
+A8h2UdB@0ZA4T@:eA9P2^DBJ0\14W0;AA:D2fTBW0^54Z@;bA;82ndBc0PQ5]@8EAKP28dFj0TQ5
+^`9=AL\2DdGS0VY5l@9dAO<2PTGd0Y15m@:JAOL2\DGi0[e50P?7A@@3cDD=0m]53`?TAA43jDDB
+0o=55P?hAAT314HY0`Y6=P<KASL3;4Hh0cA6>P=4AS`3B4Hm0eY6?P=MAT43H4I20fa6A0=`ATH3
+LdIF0gM6H`>:AVD3UTIW0j16J@>VAV\3\4I^0kQ6L0?0AW83b4Id0lY6MP?_AWL3mdJ70oa6T`<C
+Ai@38dNF0bY7V0<`AiX3>TNM0d97W`=<Aj83E4NS0ee7\`=SAlP3NTO:0h17b`>DAlh3UTO@0j17
+dP>XAm<3Z4OE0l57e`?;AmX3ddOR0m]7lP?QAaD4mDLG1?Y76@@2B2044DPR11M890@LB2h4CTP_
+14i8>@AgB3\4ODPm18A8?PB@B3l4WTQ11:=8@`BYB4@4[dQ=1;I8CPC0B504`dQB1<]8FPCWB5`4
+jdQN1>i8G`@YBF84:dU\1699KPAVBGH4R4Uh18i9N`BMBG`4`TUo1<A9P0CABH84gdV:1>99S@CZ
+BHh434Z@10m:T`@NBY@4@dZG14E:V0AJBYX4IdZK1:9:WPBTBZL4YTZY1:m:ZPBfBZ\4c4Z]1<i:
+[`CGB[04gTZa1?A:]0CfB[P434_8119;f`@VBn@4HD_U16e;j0AcBnT4X4_[1;9;n`CCB`<5hd\6
+1NU;1`DEC0T564`;1AY<6`DPC2@5=4`U1Ce<:0E;C2T5F4`[1EY<;PEOC345QT`c1Ha<=0F]C3H5
+\4a61KI<H@G:C6<5cTaU1M5<I`GGC6T5gDa[1N=<K@GYC6l5kdaa1OE<L`GjC7D524eh1@i=N@DJ
+CH057df21Ba=Q0DbCHH5=Tf81CY=R`E1CHT5Adf=1EE=S`EHCIL5GTfH1F]=VPEaCI`5MDfN1G]=
+X0F;CJP5TDfZ1II=[0FJCJh5X4fc1K5=``FgCM85adgD1M9=ePGHCML5iDgH1O9=fPGjCM\5oDgM
+1@M>g`D=C^0574kS1Ai>i@DWC_D5;4h:1T1>2`I5CPd6AdhA1UM>4PILCQ@6GThH1VE>70I\CR06
+LdhQ1WQ>8PIkCR@6ODhU1ZA>;PJWCS06]Dhb1[i>=0K4CS`6aThn1\a>B0KACTX6fdi<1^9>E@KT
+CUL6j4iP1_a>HPH2CfX65Dm\1Qi?KPHTCgh6=Tn31T9?Q`IBChP6FDn:1U]?S@IPCi46IDnD1VY?
+Y0IfCk06RDnb1YE?]0K1Cl@6aToI1]U?h@KUCn@61E3U1S5@i`HmD>h6D50?1eE@6`MYD1d7MU0O
+1ga@80NMD247X50Y1jI@:PN`D2\7aE0\1mY@;@O`D2h7054e1aIA=`LLDCP7854i1bEA>PLYDC\7
+;E4l1c9A?@LfDD07>5521deAA0MLDDL7HU581haAB@N?DE87VE5D1j=AEPNYDET7cE5J1m9A~8
+T@900bl13001~3VP8g0bh10@02~3O0Dh~9d@Da13\10`04~3f@DY13h10P00~30P[l04010P06
+~33@[a04811000~3oPZm0DH11008~32@^b0DX10`00~3^``a0Dd11@0:~3b@`S0E811000~3k0fI
+05H11@0<~3nPf;05\10`00~3Q@jd05h11P0>~3T0jY06@10P00~3>@m^06H10P0@~3A0mS06P1
+1000~3Y`nk06`11@0B~3]@n]07410`00~3HQ2d0W@1100D~3L12V0WP10`00~35Q<`0G\11@0F
+~391<R0H010`00~3AQBj08<1100H~3E1B\08L10`00~45G41S04501X0~23QES0HX10@0K~3IQDh
+08\10@0K~3\QDh~9LAIo0YD10@0N~3MaIi0Y410@0O~3\aHh09810@0O~30ALh09<10@0O~3EaLh
+09@10@0O~3[ALh09H10@00~3l1RP0IL10@0T~3laRM0IP10`00~3T1X\0I\12@0V~3VaXQ0J@1
+0@00~3_1_11k\10P0X~3`a^j1jD10@0Y~3>Q`h0:H10@0Y~3T1`h0:L10@0Y~3gQ`h0:P10@0Y
+~38adh0:T10@0Y~3OAdh0:X10@0Y~3cadh0:\10@0Y~3:ahh0:`10@0Y~3OAhh0:d10@0Y~3dAhh
+0:h10@0Y~3:Alh0:l10@0Y~3PAlh0;010@0Y~3oQlh0;410@0Y~3ER0h0;810@0Y~3`B0h0;<1
+0@0Y~33b4h0;@10@0Y~3GB4h0;D10@0Y~3Zb4h0;H10@0Y~3oB4h0;L10@0Y~3CR8h0;P10@0Y
+~3W28h0;T10@0Y~3jR8h0;X10@0Y~3@2<h0;d10P00~3OB<<0Kl10`10~3PB<80MT10P00~3RBB>
+0=\11012~3U2B30=l10`00~35bFN0>811@14~38RFC0>L10@00~3]BEB0>P10P16~3_bE80>X1
+0P00~31bKB0>`10`18~33bK:0>l10P00~3hBK90?410`1:~3jBK10?@10P00~3ZRMa0OH1101<
+~3^2MS0OX10@00~36bVW0?\10P1>~39BVM0?d10`00~3`RTP0@021P1@~3cBTE0@H20`00~3hRYi
+00T21P1B~3jBYb00l21000~3Fb^n01<21`1D~3Hb^f01X20@00~36Bcj0A\2101F~392c_0Al2
+1000~34biB0B<2101H~37Ri70BL20`00~3IBn902X21@1J~3L2mn02l20@00~3kRnf0C02101L
+~3nBn[0C@20`00~3Y36=0CL22`1N~3[3650D820`00~3<C>N0DD2201P~3?3>C0Dd20`00~3ccBI
+0e023@1R~3gSB:0ed21000~3L3R006421@1T~3N3Qh06H20`00~3l3Rb06T2101V~3oSRT06d2
+0P00~3XSUk06l20P1X~3[CU`07420P00~37CXd07<20`1Z~38cX^07H20P00~3DCZ907P21@1\
+~3G3Yn07d20`00~3fSYE0802101^~3i3Y;08@20`00~3;c^>08L21P1`~3>S^308d20P00~3_C]2
+08l2101b~3b3\g09<20P00~3oc];09D2101d~32Sa009T20P00~3BS`m09\20`1f~3DS`e09h2
+0@00~3Qca^0Yl23@1h~3ScaV0Z`20@00~3mCiR0:d20`1j~4?eL0\081~5Ecm?0;420`1l~3HSm4
+0<T20`00~3YSn40<`21`1n~3]3mf0=<20@00~3:T2<0=@20P20~3;T280=H20@00~3]T1K0ML2
+1`22~3`T1?0@00~64D8g~5Q00001A2=03N0P40~4B4:;0=l20P26~3D4:30>420P00~3dd;A0><2
+0`28~3fd;90>H20@00~3Y4<V0>L20@2:~3Yd<S0>P20P00~3bT=;0>X2102<~3f4<m0>h20@00
+~35D@l0>l20`2>~37d@b0?820@00~3DD@20O<21P2@~3G4Cg0?T21@00~3DdFg0?h21`2B~3HDFY
+00D30`00~32TI]00P3102D~34TIU00`30`00~3MdJ500l31@2F~3PDIk01@30`00~3o4IW01L3
+102H~32TMI01\30`00~3HdMn01h3102J~3LDM`02831`00~3hDLa0bT33`2L~3k4LV0cP30@00
+~34T\>0CT30`2N~37D\30C`30@00~384bF03d30`2P~3:db;04031@00~3]T`10DD32P2R~3`Dcf
+04l30@00~3]dee0503102T~3_Te^05@30`00~3;4kn05L31P2V~3=dkc~9=Tlf~5Z00003U?<`1M
+0`<0~4MTm@0603102Z~3P4m606@30`00~3aTn?06L3102\~3d4n506\30P00~3EE230Fd31P2^
+~3H51h0@40~2T@;h8@40@@0100400P0008TT7A]203`00P0100<0~2YSlb4Wh0<P0300400@01
+0040eP420080e`4@0P<00`3W0hl1~810000@000P20ooooO`0000D0008000@0083ooomo~21P00
+10001P00~2P?ooogl8~20@002000~3o`0000T0008000X0~4ool000X000@000`0~4ooooo`d0
+00@0~33`002000~240002P00~23P001P00~2:0000@00~230000@004`00~3o`0000L000P0~3
+2`002000~2:`002P00~26P00FP000P0J~2;`000P0E~20P040P0N~2L0000@0J~2D@000P0E~2
+0P047P0N~240003@0E~20P04200E~20P048@0N~21P005`0E~20P046`0E~20P040P0E~20P04
+6`0E~20P048`0E~20P046P0J~21@000P0J~22@000P0E~20P048@0E~20P041P0E~20P04100J
+~280000P0J~21@000P0J~280000P0S~41@@08`00~36P0S~5100S~50@0S~50@0S~50P0S~50@0S
+~50@0S~51P0S~51P0S~5100S~5100S~50@0S~56P0S~50@0S~50@0S~50@0S~51P0S~52P0S~5
+0@0S~50@0S~51P0S~51P0S~50@0S~50P0S~50@0S~57@0S~57@0S~50@0S~50@0S~51P0S~5100J
+~50P0S~52P0S~56P0S~5100S~56P0S~5E@0E~20P040@0S~50@0S~4P0@08`00~2P0@08`00~2
+P0@06P00~37P0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S
+~50@0S~50@0S~50@0S~50@0S~50@0S~50@0S~51P0S~5100J~25000KP0N~21@00700J~2FP00
+KP0J~22P008`0J~21P008`0N~21080800J~30P0401X0044000806P000P80100J~3100<01X0
+01@002<06P00CP008@0J~21@000P0E~20P040P0E~20P040P0E~20P04O@0N~2L000900J~2D@00
+0P0E~20P04P00N~24000<00E~20P04200E~20P04P`0N~21@00>P0E~20P04O@0E~20P04QP0N
+~21P00?P0E~20P04NP0E~20P04P`0E~20P04300E~20P04R`0N`04B~2@`0E~20P04S@0N~21080
+C@0J~30P0401X0004200805@000P04100J~280000P0S~41@@08`00~30@0S~50@0S~50@0S~5
+1P0S~50P0S~5O`0S~5O`0S~50@0S~50@0S~50@0S~51P0S~5100J~50P0S~5N`0S~52P0S~5N`0S
+~5N`0S~5Y@0E~20P040@0S~50@0S~4P0@08`00~2P0@08`00~2P0@08`00~3100J~5P00S~5N`0S
+~5N`0S~5N`0S~5N`0S~5N`0S~5N`0S~5100S~5100S~5100S~5N`0S~50@0S~50@0S~50@0S~5
+100S~50P0S~50P0S~51P0S~50@0S~50@0S~51P0S~5100S~50@0S~5100S~51P0S~51P0S~5100S
+~5100S~50@0S~50@0S~5N`0J~26000100J~21@000P0E~20P040P0E~20P040P0J~2@@000P0J
+~21@000P0J~22@000P0E~20P04dP0N~2L000D@0J~2D@000P0E~20P04e@0N~24000G@0E~20P04
+200N3@8N~2I`0J~30P0201X0044000806P002@000P0E~20P04dP0J~2D@000P0J~21@000P0J
+~22@000P0E~20P04c00E~20P04h@0N~21P00L`0E~20P04h`0N`04B~2N00J~2D@000P0J~28000
+0P0N>@84~2PP0S~41@@08`00~3100S~5100S~4P0@08`00~3100S~5100S~5100S~5c@0S~5c@0S
+~5c@0S~5c@0S~5100S~5c@0S~50@0S~50@0S~50@0S~5hP0S~5c@0S~5100S~5100J~50P0S~5
+c@0S~5c@0S~52P0S~5c@0S~5100S~5c@0S~5100S~5c@0S~50@0S~50@0S~5100S~5c@0S~4P0@0
+8`00~32P0S~52P0S~5100S~4P0@08`00~3e00S~5c@0S~5100S~5100J~5e@0S~50@0S~50@0S
+~50@0S~50@0S~51P0S~52P0S~50@0S~50@0S~50@0S~51P0S~51P0S~51P0S~50@0S~50@0S~5
+c@0S~50P0S~50@0S~50P0S~5e00S~5e00S~50@0S~50@0S~50P0S~50@0S~5100J~21@000P00
+P`4L~2Q04M~2Q@42~2QP46~2Q`44~2R044~2R@46~2RP46~2R`46~2S046~2S@4<0<1`~4SP44
+~2S`4:~2T042~2T@48~2TP44~2T`4O~2U04O~2U@4:~2UP440<0@~4U`4J~2V042~2V@42~2VP4J
+0<06~4V`4J~2V@42~2VP4J0<05~4W04J~2W@4J~2WP5c0<040P0008<1OP00Q05o~2Q@42~2QP46
+~2Q`44~2R044~2R@46~2RP46~2R`46~2S046~2S@4<0<1`~4SP44~2S`4:~2T042~2T@48~2TP44
+~2T`61~2U061~2U@4:~2UP440<0@~4V`5k~2V@42~2VP5k0<05~4U`5k~2V042~2V@42~2VP5k
+0<06~4n044~2n@44~2nP44~2n`44~2o044~2o@44~2oP44~2o`44~30P@0`180~3W05k~2W@5k
+~2WP6>0<040P0008<1d`00Q07D~2Q@42~2QP46~2Q`44~2R044~2R@46~2RP46~2R`46~2S046
+~2S@4<0<1`~4SP44~2S`4:~2T042~2T@48~2TP44~2T`7F~2U07F~2U@4:~2UP440<0@~4?@84
+~2?P84~2?`84~2@084~2@@84~2@P84~2@`84~2A086~2A@86~2AP86~2A`860<0N~4U`7=~2V042
+~2V@42~2VP7=0<06~4n044~2n@44~2nP44~2n`44~2o044~2o@44~2oP44~2o`44~30P@0`180
+~21DP22P06B@8:00E:0PX01D\22P04C08:00M=0PX0`0@0~20@2[0MH3T@:J0Z02X`:Z0[H2`0;?
+0]H2mP;h0_h20@<F0d`3D`=c0gD3N`=n0h`3T`>G0j\3[0>a0kD3jP?[0o031@@?11P47P@P12H4
+;P@c16<4MPAg17`4^0Bn1<04aPC>1=<41@D<1C45<`Di1Fh5O0Fd1Kd5_`G81L\5d@GI1Ml5hPDI
+1R46:0H`1SH6X0JU1ZP65`Lb1cd7@0MW1g87M@NL1j87`0O81m87f0ON1o`710P>21D86`PX22\8
+C0SP2189GPUP2G89o@T22Pd:4`XF2Q`:@`Y92U0:E`Z02XP:SPZb2[P:`@[82_4:nP[n2PT;3`\B
+2ch;CP]X2hH;[`^k2kd;k`\H32@<:Pa>37D<OPb53:h<]`bk3<T<c`cB3=P<3@dd3CH=?@eT3G\=
+iPg\3OX=00h33QL>7`hU3R`><Phj3T0>@Pi73Td>F`iN3Wl>Q@j@3YH>V@ja3\0>l@km3PL?2@l;
+3``?4@lc3cT?A0m:3dd?D`mj3hX?VPnS3jL?]@nk3kh?dPoJ3n0?i`o]3oD?nPom3`4@1Q0840X@
+<11L468@L11f47T@SQ2D4:`@\Q384<h@e13^408A214>4B<A:A4_4C4A=a4m4ClAAQ5_4ILAWA6S
+4JDAZa6a4K<A^Q7S4@TB3a8E4RXB<18f4SPB?Q944THBCA9f4YhBY1:Z4Z`B\Q:h4[XB`A;Z4Q0C
+5Q<T4bXC;A<c4cXCHA=X4f`CLQ>A4kDC^a>m4l<Cg1?R4n@CjQ<753HD@1A655@DFQAM574DMaB5
+58\DUaBN5:@D\QBl5<<DbACF5=TDnQ@05@hE51DG5B0EAaEV5IhE\QGZ5DLFJaIa5WLFOAJ05[<F
+jaH15cTGEaN?5jdGiALX630H>1Q06>@Hk1S`6?<HnASl68hJT1ZK6Z4JY1[<6XDKRA^D6kHK_1_3
+6lTKc1\T73XLLQac77hLT1c87=hL5QdS7E\MI1em7KDMcad77Q4N:aiS7WdN]Ajg7]4N2AlY7f4O
+PAni7l0ObQoA7mPOoQlf83PPER2>89HPWB318?TP3b578EdQUB6[8N<QoB4e8SPRCR:68Y`Re2;Z
+8R8S@2=h8gdSPB>78hXSYb?38lXSnR=194TTD2AL96LTKRAf98HTRBBD99XTWBB^9=PTgb@<9A4U
+5bDR9BPU:bEJ9GdUZRF_9KDU_bG59LPUcRGN9@8V1bH?9QDV62HN9RDVC2I?9U8VIbIY9VhVMBIg
+9WTVNbIm9YHVWBK@9]DVhBKY9^lVlRKh9_lV9RLY9b\W@2M29dHWBbM=9dlWJ2M_9j8WYRNZ9kPW
+_RO19lLWcROe9o\WoRLR:3\X@BQ7:4TXCbQE:5LXGRR8:8XXT2RF:9PXWRRT::HX[BSG:=hX32TE
+:A\Y9BT[:BhY=2Tk:F8YJ2UZ:G0YN2V2:IHYW2Ve:KdY`RW=:M<YeRWJ:MlYhRWU:NlY82XW:UdZ
+HbYX:XHZQbZK:Z4ZZ2[A:]@ZeR[L:^8ZjB[_:_8ZmRX2:a8[92\^:c@[=B\j:e0[DB]F:e\[Hb]Y
+:f`[LR]j:gd[P2^A:iL[ZB^_:lX[cb_C:mH[f2_c:oP[o2_o:`0\3R`C;1T\92`Z;2d\=2aU;6`\
+W2bR;:H\ZBbj;=0\gBcZ;>l\lBcf;?h\0Bd<;A<]:Bdi;DT]FBeN;F0]IBe];G0]N2gF;@@^3BhC
+;Qh^92hW;U0^Ebin;X4^QbjU;\h^g2k_;_D^6BlO;bP_;bmH;f4_IBm`;gH_NBnX;kH_hboX;nh_
+nBoo;`8`430E<1\`7S0U<4h`US2K<9l`_c36<<d`eC3P<>H`kS3g<?d`1C4;<A4a6C4O<BDa;S4d
+<CXa@c5W<IDaWS6T<J`a\S6e<Lhad37A<MHahS7W<NXak37_<O4alS7g<@HbCS9i<XPbV3;<<]\b
+jS;^<_@bnS8O<b\c<C<l<d8cAC>:<jhc^3?U<nLckC?g<oXc6S@b=3PdCCAH=88dR3B;=9<d^SC9
+=<ldgSCT=>Ld7CE1=EheScFA=ILeXCFT=LTej3Gg=@hf53H[=S4f>SI:=TdfDcIJ=UdfKCJZ=\<f
+aCK^=_4f2cLA=aPg@3M7=eHgQ3N:=i<gWSO6=l`gmCOk=b@h?CQ3>5DhHSQ`>7PhOSR1>8DhTSRC
+>9PhW3R]>;dhiSSW>>`hl3Sn>0@i1cTb>EHiW3VR>Jdi\cVf>KXilST7>QTj7CXS>RTj;3X`>S\j
+?cY1>T8jBcY?>U4jG3YR>VDjJCYg>X<jR3ZJ>ZLj[CZh>[hj`3[1>\Pjd3[D>]Xji3[Z>^djlC[m
+>PTk3S\@>a8k4c\H>b4k:3\\>blk>S]0>d<kAc]E>f4kIS]h>hDkRc^F>i`kWS^O>j@kZc^c>kLk
+_C_8>lhkdC_Q>nXkkS_`>o4kmC_i>olk2S`@?1<l8c`e?3Tl>c`l?40lA3a:?58lF3aK?5llLCae
+?7LlN3ao?8<lQcb??9DlV3bO?<dldccE?=\l2cde?D4mCCeI?F4mIce]?GPmNSeo?HdmScfB?I@m
+Z3fd?L0mc3gD?NPmjSg_?@Hn23h;?[hnjSk_?_Dn03l6?`To7cm6?e4oEcmR?fPoJcm_?g@oN3n:
+?hhoTSnN?j0oYSnd?kXo_CoO?n<olSoi?odo340T@2Y0;T0d@3M0D41F@6A0K41c@8Y0TD2H@9Y0
+W42Q@:I0Zd2_@;50\d2f@<90b43;@0I12T4]@CI1?D5V@GM1VD6P@Ji1\D6b@KY1dD7H@Me1hT7f
+@Oe12d8A@QA26T8M@TI2B49@@UI2FD9L@V12ID9W@VY2MD9j@Ye2Wd:Q@ZE2bd;?@]=2fd;Q@^A2
+jT;c@_U25D<P@bM3:D<[@be3<d<f@cY3?d=1@dA3Cd=D@eY3LT=f@ia3X4>T@jM3[D>`@km3a4?6
+@lQ3bT?H@mi3hD?U@nM33d@EA1m49D@XA494A4A6A4Q4C4AAA5a4HTAUA7m4UdBTA<14dDCDA=E4
+fTCQA?94mDCfA?]48dE8ADe5DdEQAFM5JTEjAH95]dFmALM5cDGKAMm5i4GYAOQ5ndD4APY64THH
+AQ]6B4IPAW16LdIgAX56QdJ:AYI6YTJ`A[I6^4K0A\Q6bTKEA]e6j4KZA^m6mdKlAPY744LCAc17
+>TM0Ad97C4MDAee7HdMaAgM7NTN0AiI7X4NVAjQ7bdOCAm]7hDO\Ao97mDL2B1M874PSB4i8I4Qg
+B7e8Q4RYB;I8bdSWB>]8mDPYBB]9CDU@BF99ITV8BHi9WDW4BMm9hTWZB@m:7TY5BVi:XTZTBZI:
+[d[>B]M:mT[nBP5;34\BBae;8d\VBbe;HD]cBm=;jD\HC1Y<84`[C35<=4`mC41<A4a9C4]<CTaJ
+C5m<QTb<C;1<]Tc1C<M<bTc>C=5<edcMC>=<jDc_C?E<04d8C@i=<TdjCD5=Ade:CE1=EDeHCEi=
+LDekCH]=TDfFCJ1=[TfaCKM=_Tg4CLM=f4gjC@e>6ThLCQi>9dh\CSM>?Di0CTM>BTi@CUM>GTiU
+CVa>LdihCWe>Ydj]C[E>_Tk4C\I>c4kAC]M>fdkRC^A>j4klCP9?5DlNCbA?=TliCcm?@Tm6Cd]?
+DTmDCe]?H4mUCfY?MTn0ChI?RDnECjM?[dnjCka?`Do6Cm1?eToICn]?kDocCoi?0505D3e@D51E
+D61@IU1YD7a@X52SD:I@754hDDeAHU6IDJUAcE7BD@00~:GemSK6EQKWE`05mOHfQUHf]^MFa\
+05mOM6EbKFU^HGAU05mOLVEcM6mbIGYULVl0Gf5RKg9d04A7DTmED400Gem=CDm4AD`0GfE^HfmT
+I@1OJFiYM6UQK6UjI@1OKg1UKUmYL5mVJFaU05m_L6E^Gfm`GfIYK6D0Gg=UM5mUKV=OM69\05mc
+IGAOIVmbKF5d05mcIGAOJ6AbGfIYK6EOLg1UH`1OLfEdGfU`GfIYK6EcL6ES05mcIGAOKFmTI@1O
+LfEdGg9UHfmbI5m\IFh0Gg=UM5mcL6aYM5mcJGYU05mcIGAOM6U]IG=dHFe`05mcM65bM5m^IGQd
+Gfm`GfIYK6D0GgAULVeYKV5dI@1OMG=QIfEOIG9bKg80GfE^Hem\JFiU05mgLUmXIF5TIG9c05m]
+HFU^05mQK6a_Hf5dIEmRMFIVIG80GfAYLg1\HGUOHfm]KFE^M01OIUmSK6mcI@1OIfEdHemVKg9]
+HG@0GfMUM6=OKFmTI@1OIfEdHembIF=\IFh0GfMUM6=OM6U]IG=dHFe`05mXIF5TIG9OM7U`I@1O
+JFiYM5mSLV<c<UmdHF9\I@1OK6m_JgE`Gf]UN@1OKF5[IEmdJFeU05m_L6E^Gfa_IemVJFaU05m`
+HG9cIEmXIF5TIG80Gg1QLW=OM6U]I@1OL65bLemhK7AOM69\05mbI5mUKV=OM69\05mbI5mhK7AO
+M69\05mcIGAOI6ESGgARK01OLfEdGgQ\M5mdHV`0Gg=XKgMOIVU\IEmSKfidIGQd05mfLgAbHfQb
+05mfLgAbJF=]L01OMW=dLViSKG00GgIcM79^JF=]L01OMW=dLW9SJ780GgIcM79bLgAb05mfLgAb
+LgAb05mfMUmdJFeULgAQKG00GgIcM79TMG00GgIcM79dLWMc05mQL71\NEmTIFIQMFadL`1OHfm^
+IVUbKEmiIG=^K`1OIGQQKFU^IEmVJFaU05mUN71\HFU^GfEbLVmb05mVGfm`IFiOJFh0GfIOKg1U
+KUm_MG@0GfIYK6EOIGQYLgAc05mVKg9SIEmVJFaUGfEhM01OJG=OHEmVJFaU05m\IFMQK5mVJFaU
+Lg1UH`1OKF5[IEmVJFaUGg=`IF<0Gg1bKfe`M5mVKg9OLgAbJFiW05mbIF5TGf9iM6Ec05mbIF5T
+GfaYKVD0Gg9UHFAOLVESKg9T05mcHf5^Gf=]I5m\JFiU05mcIGAOIWAYKFD0Gg=UM5m`JG1UGfe_
+I6D0Gg=`K6UdGfIYK6EOLg1UH`1OM7YOKfIVLfEd05meLfEbGfeULg=QIfD0GgIfGfEhJG@0GgMb
+JGAUGf9iM6Ec05mgLVUdIEmbIF=_LV@0Gf5dIGQYM01OGfA_LemWIGAVJFaUHGAdLP1OGfA_Lemc
+IGAVJFaUHGAdLP1OGfA_LemWIGATLVUfI@1OGfA_LemcIGATLVUfI@1OGdA?DeA9CDEDCeD0GfEh
+JG@0GemUN6Ud05mOHfEhJG@0GemSGfEhJG@0GfMUM6AQM6D0GfMUM7AYKFD0CUm<A4UF@01<A4UF
+@016Gda4BEI004iOC5E4BEI004IOC5E4BEI004aEA4UF@01>Gda=CdA004IOC4e?A400C4e?A400
+CUm<EDe?A400C5E=CdA004IOC5E=CdA004iOC5Q<DdQ004aHC5=8@016GdaHC5=8@01>GdaHEE9C
+B400C5QEDU=8@016GdaHEE9CB400Gem9CdEBDTmB05mOA4mCAE9BCe80GfUcHGAdN@1OGda?CTMD
+Cd40GemEE4m105m\LfEUJ`1OGde;CT5=A@1OGeA=D4i1C@1>GdaHCEE<@01>Ge=3Ce1I@01OGg9U
+HF@0GemcHf5^KVEb05mOLf=QKWA_K01OLfEdI65dI@1OLfEdM6U]I@1OLfEdIWAYKFD0GemcIGAe
+L6U_05mcM6U]I@1OM6U]I@1OM6E\K01OM6m\KgMULP1OM6meL71ULP1OMFi\JFi[05mOEU1BBDiD
+AE80GemcM71SL7T0GemOHW9[05mOGg=RLV\0Gf9bJ`1OLf9bJ`1OJFmSM6`0GfIbIFD0GfeQK6a_
+H`1OLVEQK6a_H`1OGe95@Da3EU@0GemcHf5^M6mT05mOLf=QKW9cK7@0GemcHf5^L6m`04iOCeI5
+DTI<CeM004IOCeI5DTI<CeM004mFAE96C4mG@01OHF=SIG=c05mQM6m\05mQM6mY05mOHfQ]Kf@0
+Gf=\Kg=U05mOHfa_LfD0GfM]M6U]I@1OK6mSHFadJFeU05mQLf=dJFeU05mSM6U]I@1OKF]dJFeU
+05mcM79VM6U]I@1OIFmV05mVHfa_LfD0GfIVK7EcJ01OIVMUM7<0GfI\MG=XHFa\05mOCe15CTI@
+05mOAdEDAU00GfI_L6E^05mVL79YKWAV05mVLVEQI01OIW=UIF\0GfIdIFa\05mOIWE\K71QM6P0
+GfIgLVUdI@1OGfIWIGAS05mVIfEdH`1OGdiVIfEdH`1OIVMUM6=XHG80GemWIGATHgMT05mWIGAU
+KWH0GfeUKF=`N@1OLfEdKFE]05m]IFecIG@0Gfe_MVeUK@1OKFE]KFmfI@1OKg1UKP1OGfm`IFh0
+Gg1ULW9_LP1OGfI`MGAS05mVL7EdH`1OIW1eM6=XHG80Gem6D5EDCP1OL7EdIFif05mOGg9UHF@0
+Gg=UM6e_I6D0Gg=UM7IRMFH0Gg=`LVU^M6H0GgIcL79YKWAV05mcLf=QKVH0GgIcLf=QKVH0Gg=d
+HG@0Gg=dLV=QM01OLgAbHfe`05mcM79SL7T0Gg=dLVAeL01OGg=dLVEbLVmb05mcM79ULW9_LP1O
+LgAbK6E^05mcM79^Hf5d05mcM79^Hg1i05mcM79`HW9[05mTKg=dKgE^JGP0GgE^JGQdKfA_L`1O
+M7YcIG@0Gem9DdACE01OGemgLVUdI@1OGgMbJGAU05mON6ISK6mcI@1OGgQVIVaeLfP0A45D@E=5
+Ad00Gem9KW@`EVESM6mb05mOBFid=5IUHgA_LP1OGdU^M3EFIF=dKg80Gem9KW@fEVESM6mb05mO
+@c1QLVMS05mO@c1QLVMf05mO@c1UKWIYLVm^05mOIFifC6iW05mOIFifLfEW05mOIFifDfUjI@1O
+Gg1cL01OGfmcMVEbLfU_KP1OGfmcKF5ZKg80GemfIG9cJFm^05mOKg=]JFi_LP1OIG9bKVl0GemC
+M65bM5AYKFD0GemOJ6EQL69QLfD0GemOHW9[K7I\05mOJ6EQL69QLfD0GemRLV]\MV`0GemXIF5`
+M6m`05m7Gfe_I6EOLgAb05m7GfI]M5mcM780GdMOMWIUJ6Ab05m7GgQ\M6QTLP1OGf5dIGQYM6=^
+M01OGf=dNG1U05mOIGQYM69eIP1OGfEhJGAVKg1UKP1OGfEhJGA_L6E^05mOLgAbIF5]L`1OGfiV
+JFaU05mOKg1UKVIT05mOIVe_I6D0Gem^KgAEKF5cJ`1OGfQUHG1\IFh0GemTKg=ULW9^K`1OGfA_
+LdEbLVmbE6mCEP1OGg=dJfaUKP1OGfIYLW=d05mOK65cM01OGg9_MVEb05mOHG9WH`1OGf5bIgH0
+GfE^MVUbKfh0Gg=iLemULW9\JG=d05mcNG=OKVEbLP1OGfe_KWAXA65i05mdNViQKFD0GgAYKFEj
+KfiU05mTHGU\JFMXM01OGe9UHFa3MWAFIF=dKg80GemCHf5^E6mTEVESM6mb05m7Gg=`K6UdGg=Y
+NVD0GdMOKgIULWMbJGAUGfI\HFL0GdMOKg1`M5m^K`1OAem_L71QLWAOHWUdIG<0GdMOJG1`M5m^
+K`1OAemYL71QLWAOHWUdIG<0GdMOMWIOIVU\I@1OAem_L5mVJFaU05m7GfU`GfIYK6D0GdMOJ6Ab
+IUmcL6ES05m7GgA]L5m]LfL0GdMOKg1OHWEVIVEb05m7GfU`Gf9eIVIULP1OAemhK7AOM65RK6D0
+GdMOK6mWGfIYK6D0GdMOIFiSKfAUGgAQHVaU05m7GfAUHfmTIEmdHF9\I@1OAemTIF9eIfMYKVL0
+GdMOLgAQM7Ec05m7Gf=bHc<bGgAQHVaU05mOHGAUN6UdM69\05mOLfEdHG9WMUmO05mOHgIdIV5[
+05mOLfEdIFifL5mO05mO@DQCB4U6E01OGd58BDi3DP1fMVE^HfmTIBiS05IFADi3CdA506ecIem\
+IFiWM6P0MWIUGg9_KfeOKVEUI6ET07IfIEm\JFiUGf9iM6Ec07IfGf9eIVIULP1dKG1OHWEVIVEb
+06UTN01UKV=_I6EOLgAQM6D0HWUdIG=OM6mOIFiSKfAU069iM6EcGg9UHF@0HWUdIG=OK6EVM01R
+MFIVIG9OLfUjI@1RMFIOL7Ab06U`Gf9eIVIULP1hK7AOIVU\I@1TIFIOIVU\IEm^HFeU06EhGfIY
+K6EOJFiVK`1YL5mVJFaU06U`Gg5eHFaYIVUULP1_L5mVJFaU06mfIG9gLVUdIEmVK65W06m`Gg5e
+HFaYIVUULP1UKV=_I6EOM65RK6D0IFiSGgARK5m\IFh0IFiSGg5eHFaYIVUULP1cM65dMG<0IFiS
+GfIYK6D0IVedGg=dLUmQLW9QN@1UN5mVJFaU06I]M5maMF5\JFIYIG80HfeTGfI_LVeQM01XI79O
+IVU\IEmcL6ES06QTLUmaMF5\JFIYIG80M6e`Gg1dLP1VJFaUGfEhM01VJFaUGfiQKFD0KFmTIEmc
+M79OHG9bHGT0KFmTIEmaMF5\JFIYIG80HfeTGfe_I6D0LVESGg5eHFaYIVUULP1SKFAOLVESK6E^
+07=`K6UdGg=YNVD0Lg1\JGAOLGEQK6UVJFEb07A]L5mcL6aYM5mcJGYU07AYKFEOLGEQK6UVJFEb
+06=]I5mdJFeULgAQKG00Kg1OL65bM5m^K`1^IGQdGfIYK6EOIGQd079UHG=_KP1_L5mRMFIVIG80
+KWE]Gf9iM6Ec06mVIW=UM01S=01S<`1S<P1S<@1`HG9dGfi_065TMUm\JFiU065bIgH0HG9WH`1R
+NGAULembIG5T04MOMWIOHFAfIG9d04MOHfeTGfm`IVU\I@17Gf=]I5mYL6IYK6D0AemSKFAaMF5\
+079SLfUT05Q\M5mCM79eHg@0AVU\IEm9KVI_04QUHFAULUmCM79eHg@0DGEQK6UVJFEbGe=dLWES
+M019KW@c<P19KW@a=P1EKW=YIfiUI3<b05E^LfUWKVET<CH0EFicJFM^IF@h049iM6D0@Vm_K6EQ
+KP1SK6mSJemd07AYKFEOM01gHfQQLUmd071dLVAYIVIOM016BDa506I`Kg=OM01cJGYUGg@0IVU\
+IEmcL6ES06IYK6EOL7Ab071YL6EOIVaQI`1\JFiUGfi_06e_I6D0IVmbKF5d06eQN5mbIF=OK6E^
+06a^IembIF=OK6E^06e_I5mdJFeU069iM6ESKgE^M01SLV<c<P1\IGIUK01VK65WL`1VI01XKfaT
+069cJGYU069eIVIULP1SMG9`06UcM6E]L01dKf]UKP1aGg=dLVU^I`1fHFaOKVEUI6ET071bIG=U
+KW@0MV5\MFD0J5mcM79YKVL0N6adGfIbKfd0N6adGgA_07Q\M5mdHV`0EUI5CT=?A4D^@`1fMWEd
+JFac;V<0EUIEE4U<D`1RMFIOKV5]I@1RMFIOK6E^069iM6EcGg9ULGEYLVET06QTLUmcM79eHg@0
+K6U^IEm`M780IVUUK6AcGg9UHF@0Hfm]KFE^M5mcM79OHWEVIVEb07AQLVMUM5mVJFaU075eHFaO
+IVmbKF5d06I_LVeQM5m^K`1aMF5\Gfe_I6D0KFmTIEm^K`1aMF5\Gg9UHfaUKP1bIF=_LVAOK6E^
+075eHFaOM6U]IG=dHFe`06QTLUmQLW9QN@1XI79OKVl0J6AbGfI_MFiT06=]L5m\IFh0Hg9SGgAQ
+HVaU06=bHem`KfaiKVm]JF5\06=bHemdHF9\IEmcJGYU0780JP1SHG=UGg=UKW=YM6UfJGAi065\
+K6mgGf5RHW9UMW<0LgAbJFiW06]UNEm\JG=d06a_Kf]OLgAQM7Ec06]UNEm^K`1dK@1dGg=dLWES
+M01Y07A_M65\Gg=UHg<0M6mdHFaOI65iL`1\KfMOIVU\I@1\KfMOLGEQK6UVJFEb06AeKFei07AY
+KFEOLgAb07A]Gg=dLWESM01dJFeUGgIQK01QLVMc07=eHW=dGf=XHG80N6adGgARK5mcM79eHg@0
+N6adGf9eIVIULP1YM6E]Gg=dLP1YM6E]Gg=dHG9d06UdIFeOK6E^06UdIFeOKWE]06UdIFeOIFiT
+06=eLW9OL7Ab079UHFAOLgAQM7Ec079UM5mcM65dMG<0HfQQLW=OLVEQI01UKVAOKfIOK6U^I@1h
+K7AOJ6AbGf5bLV5i06=_KFeUKW@0I6ESKfAUGgAQHVaU06AUHemdHVaOK6E^07Q\M5mdHF9\I@1V
+JFaUGgAUN7@0IVU\I@1SJ01cM780LgAb<P1cM78a07Db07Da06eQN5mSJ65bL`1\IFiWM6P0LfEQ
+LV=XGg=dLP1dJ6UcGgUUHG9OLfESL`1\IF5`GgUUHG9OLfESL`1iIF5bGg=UHg<0I65iLemdJ6Uc
+Gfe_KWAX06AQNEmcIF=c07=UHg<0KFU^L`1XKgEbL`1]I65i06e_KWAX07UUHG80M6U]IEmcM79Y
+KVL0KVmOHWUdIG<0IFiTGg1dLP1]KfidJ5mTHGUc07A]Gg=UH`1dKEm]JFh0M6eOJ6meLP1dKEm]
+I65i07A]Gfe_KP1dKEmiIF5b07A]GgMTHGT0M6eONFAQN@1dKEmYLfAcM01FEUEDBDaC;T<0KG=T
+Kg<^H`1=DdA?D`1VMFa\Gg=`IF<0I6EVHGE\M5mUN7@0I6EVHGE\M5m^HFeU071bIF5]HVaU071Q
+M6QOL65bM7<0IGQdIFicJFm^06iQKFD0Hfm^IVUbKEmcM780HFicMfEb07=dHG@0LgAQM5mRMFIV
+IG80IFm\Gf=_MFid069S06mfIG9gLVUdIEmVJFaUL`1VKg9SIFAOIGQd06IYK6EOJ65^I6aU06QT
+LVIOLg1UH`1_L6IOLg1UH`1dKG1VGg=`IF<0M6e`IUmUN7@0M6e`IUm^HFeU071_LgAQKF9\I@1\
+IFh0LVEdMG9^Gf9eIVIULP1RMFIOLfUjI@1]HGQOHWUdIG<0M6E]L01aMF5\Gfm`IVU\I@1aMF5\
+GfU`IVU\I@1aMF5\Gf5bLV5i075OLfE`Gg=dLP1aGfU^M79_Gg=dLP1aHG9WMP1aHG9WH`1dKG1O
+LG=dLUm`M780LGIQK7EUGg1dLP1aLfE`Gg1dLP1aGfi_075eHFaOIVmeKV@0HG9WGfi_065bI`1d
+KG<0L65dJ5mSKfe`KfiUKWAc07=dHG9dGg1dLP1dKG1OIWE\K5mcL6ES07AXIEmdJFeU07=UM5md
+NUmcM780M7YOLgAb06ecIemcM780LgAQM7EcGg=dLP1dKem\KfMVJFaU07A_Gg=dI6EbLP1VJFaU
+GgAYKFD0IWAYKFD0IWAc06QQKVA\I@1D@emeM6U]I@1cM5mTIGH0LgAOJFi_07=dGfe_I6D0LgAO
+KVaYKV\0LgAOMFUT07=dGfMYI01cM5mbI6Ef07=dGg=YNVD0LgAOHGAYKFD0LgAOKGAYKFD0LgAO
+HgAYKFD0IWAOM7=UH`1VM5m]JFh0IWAOJ6meLP1VM5mTHGT0IWAOKFm^M6P0IWAONFEQLP1=DdA?
+Dbi3~3
diff --git a/support/vvcode/binaries/os2/vvdecode.boo b/support/vvcode/binaries/os2/vvdecode.boo
new file mode 100644
index 0000000000..5a7355637b
--- /dev/null
+++ b/support/vvcode/binaries/os2/vvdecode.boo
@@ -0,0 +1,1775 @@
+VVDECODE.EXE
+CE[@00<0~210000?oo~2_P00~5@000~QP00000hO^Ph0]0W=8KP1C<dQE6QYLb1`LVmWLV5]86=Q
+KVi_M21RIB1bMFhPJFhPHB14Ce<PLfEcLfU_KRh=3@XT~2C5P0~50P01~30P0@0P006P000040
+~2i8d00080~2D7P0~24000100007@2~63@40~5a0000080~2m0000=04~:a0400=01~:d@4003d2
+~2=0@000<0~2A@@0~5d0@0~A0P00~=1@00~68000~D=4P1~30@0580000@0001D0~6D7P0~30`03
+80005P0000D0~6R`@0~24000R`D0~24000R`H0~24000R`L0~24000R`P0~24000R`T0~24000
+R`X0~24000R`\0~24000R``0~24000R`d0~24000R`h0~24000R`l0~24000Ra00~24000Ra40
+~24000Ra80~24000Ra<0~24000Ra@0~24000RaD0~24000RaH0~24000RaL0~24000RaP00408
+~6R@l10?T0~2nPh10>T1~2hPl10>P2~2Z`d10<<3~2P0`000QfMVAUHfmTI@00~V=P0004@0~2
+J@0007d0~2X`000:<0~2X`000<H0~2:`4004<1~2H0400801~2m`400?L1~2m`400?L1~2m`40
+0?L1~2284V2`86204^3@5L0@R1N`d1h2P10P4X0MP==PhX0@H1:`762`D<>0ag3:X<j@`80GX9
+0CP1205e1P400@P1C`d1<0480A<70@01284d2@7V206M1`6Y0@P1U@L1ZP4X0@81:`7C0?01204U
+1@410@R1?`D1KPP1L@D1<04X0@81005P2DD::0450AX1J@_d2f8<=0fN3BP10`4`0B87>PMB1`P1
+j`D1B`480GH90Dh1206O3@5?0@P1S`T1>0480J850GX1:0430@01f0O42>T?205P204@0BP10P4A
+0K469@LX0@816@4V2>4>:04;0AX1S@VR2KL93@XR2SL:GPYc2XP:o0X@2`P1FP81I048PDT>0NX8
+0N\40B\1206S0P5j0@P1h0H1OP4X0@81005\0<D0204]004I0@P1K`<1:`48PIL10Ml80NH60B\1
+:0450C01N`2M1El6YP`Z3PP1O@`10@480FT<0A41:8420Mo\2oT>:8420N3H3DH>:0440@41l@0k
+0JH2^`88PB\80`H80GX00A41204_004C0@P1a`015`48PG`20MX8PA410NHXP@81j983Q`@XP@81
+jCT4Q@D80F450B`1204_1@4]0@P16@@1<@480JH40CP1:0420G`1R`>012P10P5m0D@4T0D8A4mC
+@d5<C5<3CTaC0deCA`00~90@0S0;P20`300P<0~4b0830=020`3H0P<0h083~5k0832@01~20@03
+0?P20`X00@000P0100<9004000400`080`<9004000400`0D0`<9004000400`0T0`<900400040
+0`0\0`<9004000400`0d0`<9004000400`140`<9004000400`180`<9004000400`1@0`<90040
+00400`1H0`<9004000400`1X0`<9004000400`1h0`<9004000400`240`<9004000400`2<0`<9
+004000400`2D0`<E004000400`2P0`<9004000400`2\0`<9004000400`2d0`<E004000405`0T
+BF@T~4o0430040~610832@01~20@0301@20`T00@000@0K01`20`01~790830080~6:0832@01
+~20@0?03020`01~7?0832@01~20@0?04`20`02~7F0832@01~20@0306`20`T00@000@0307P2
+0`T00@000@0A08P20`01~7U083004;004000402`01~7X0832@01~20@030:`20`T00@000@3T
+0FAUHWEW~3IFiSKfAYKVMOM65RK6D006I_LVeQM000J6E\L000~2K6mW06e_I6D0~3KgIULWMb
+JGAU~3LVESKg9TGfaUKVMdJ00007AYKFEcM65]L00007AbHFicK65dJFm^GfIYK6D0~3JFiTIGQO
+IVU\I@00L65TGf=XHG9QHgAULP0007EeI6ESKfAU~4N7QTIF=_I6D0~3JFi`MGAOIVU\I@00KgEd
+L7EdGfIYK6D0HVU^HG9i~2M6EhM000~2I6EVHGE\M01cM79UHFd006IYN6ET~3MV5bJF5RK6D0
+~3HGAdLV9UIfU^~3HGAdLVE^I01RIFMYKP00069iM6ESKgE^M00006=XHG9QHgAULW=UM000~2
+Hfm]KFE^M01SLV<c<P0006AUHfmTIGIULW=YKfh0~2IFiT06I_LVeQM000KFmTI@00~2Kg1ULV5d
+JFiWLgUcM6E]079UHfmbI6aUKVMdJ000~2Lf]YL6IbKfd0~3Lf]YL7A_~2M65RK6D0~2M6U]IG=d
+HFe`~3N6ad;FIbKfd0~3N6ad;GA_~2N6ad;G=eHW=dHfQQLP0007Q\M00:E79QKW=\HGAYKfhP
+JFiTIGPPIVU\ICX<00408040801^KfiU~42UAbHFicK65dJFm^86U^I6Eh86IYK6Dj30010201
+01L09G<000Y@HG9d82DcI219;e0PIVU\ICXA00408040700UL`00D65bM20U<f@PLgAQLWAc86m^
+86aYKVDj2`0102010>L09FaT~2LVESKg9TGf9eIVIULP00071bIFeQM7EbIB15CdHPIFiSKgE^
+M6EbIF@PMfQYK6DPI6ESKfAYKVL0~3IG9bKg8PLVEQI6U^Ib1UKV=_I6ET86AQM64006U^MV5\
+JF@PHfQQLV5SM6Eb82ET82P`N2D`<UPY86m^86aYKVDP9FaT86mV86IYK6DPH2Ec9`00JFifHFaY
+I21UKV=_I6ET869iM6DPHfmeKW@P:2ET:@1ULW9_LR1bIF5TJFiW86E^HfmTIF@PI65dH@00D65b
+M20U<f@PIFiTLb1_KR1\JFiU>Pd00@0P0@1K02E\I000H2Ec9b1XIF5TIG8PKfi\NB1QK6a_MfET
+86U^85IFAB1VJFaUL`0002EXI01EKVEhL6ESM6ET860ULb0UI2L0051QLW@P9C=T86E^I7<PKfhP
+K6U^ICX=00408040I@<UK6@006U^MV5\JF@PJ6EQI6Eb86I_MFiT~49F@PHfQQLV5SM6EbLb1U
+N71UHgAUI20]82ET86I_MFiT~3JFifHFaYI21bIF=_LV@PK6E^IgAX879UHfmbI6ET82PUK6@Y
+~4HfmeK6A^9g@PLVEQK6a_Hf5dIB0UK6@PHWUdIG<PIVmb87AXIB1bIF=_LV@PHWEVIVEb04A5
+@UE7>R00I6ESKfAU>R1bIF5\K6mSHGAUI20UK6@PHWUdIG<PIVmb87AXIB1bIF=_LV@PHWEVIVEb
+00X0~2JFifHFaYI21SJ65bHF=dIG8P9F@P:31h9C0bF2TPKfhPK6U^IB0UK6@PKfHPIVU\IB1P
+9G<W~2JFifHFaYI21SJ65bHF=dIG8P9F@P:31h9C0bF2TPKfhPK6U^IB0UK6@PKfHPIVU\IB1P
+9G<W~2JFifHFaYI21SJ65bHF=dIG8P9F@P:31h9C0bF2TPKfhPK6U^IB0UK6@PKfHPIVU\IB1P
+9G<W~2JFifHFaYI21SJ65bHF=dIG8P9F@P:31h9C0bF2TPKfhPK6U^IB0UK6@PKfHPIVU\IB1P
+9G<W~2KF5hJFeeKB1^MFeRIG8PKfHPL65bM7<PLVEQHfQUI20X9F@Y~4ADm686E^HfmeKWAULVET
+86m^87=UHG9SJ21`HG=c82ET~3A4E2EDLj801VJFiTGfiUN7AOL65bM3XPADm686E^HfmeKWAU
+LVET86m^87=UHG9SJ21`HG=c82ET00X0A4E2EDLj801VJFiTGfiUN7AOL65bM3XP@fm^M6EhM3XP
+K6U^IB0UK6@PKfHPIVU\IB1P9G<W00X0~3A4E2EDLj801VJFiTGfiUN7AOL65bM3XPDVEgJFiT
+JFiW86IYK6DPH2Ec9`0:~3HfmeK6A^9g@PIVU^I21`HG9d82ET86U^86IYK6DPH2Ec9`00ADm6
+86E^HfmeKWAULVET86m^87=UHG9SJ21`HG=c82ET~3IG9bKg8PLVEQI6U^Ib1VJFaU~2A4E2EDLj
+801VJFiTGfiUN7AOL65bM3XP@fmeK6A^9g@PIVU^I21`HG9d82ET86U^86IYK6DPH2Ec9`0:~4
+D65bM20U<f@PLgAQLWAc86m^86aYKVDj2`01020108h09FaT~2IG9bKg8PLVEQI6U^Ib1UKV=_
+I6U^Ib1dHF9\I@00~2I6EVGfIYK6EOKV5]I@0005IFI6ESKfAU82Ec;20ULb1bIFaUHG=U82PU
+LbT:~3<2hi=b1RIGAQ~3Ce<_<R0b;WPPBD9=84<PDfEd;c80~3<SDPCVmf834i>C80BBm@86IY
+K6Dj6P01020101h09G<0~2CgIULWMbJGAU86EhJG=dJFiW86IYK6Ec>PX00@0P0@0F02Ec~3NFEc
+06i_~2C6mW86IYK6Dj6P01020105X09G<0~2EUITIF=_I6DPMVEbLfU_KR0UJ6@^<21_LR1\HGAU
+LR1YLg9ULGEYLVET87A_86AUHfmTIB1VJFaU860ULbL:05IFAB1XIF5TIG8PIVU\IB1cL6ES>Ph0
+0@0P0@0\02Ec~3@E=3BDT0~2@E=3BDT0~22UAbHFicK65dJFm^871ULVI_LVeUI3X=00408040
+L`9^KfiU~4M79QKW=\HGAYKfhPIVU\IB1dLV5^LfaQM6Ec86IbKfdPH2Ec9b1dKb1P9G<W~3EUI5
+86IYK6DPHfQQLV5SM6Eb87=UM21YLb1P9G<W~2@E=3BDT0~2M79QKW=\HGAYKfhPIVU\IB1dLV5^
+LfaQM6Ec86IbKfdPH2Ec9b1dKb1P9G<W~3K6mSHF`PHfQQLV5SM6Eb87=UM21YLb1P9G<W045C
+@dU9~3@E=3BDT0~2EUI586IYK6DPHfQQLV5SM6Eb87=UM21YLb1P9G<W~2K6mSHF`PHfQQLV5S
+M6Eb87=UM21YLb1P9G<W045C@dU9~3BFidIG9^HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1_
+L6E^GfU`GfIYK6D0;@00LgATJFh0~2MWIU04A5@UE7>R00Kg1UKUmYL5mVJFaU>R1_L6E^JFiW
+86U^L7Ed86IYK6DPH2Ec9`0:06EbLVmb86m`IFiYKVLPJFi`MG@PIVU\IB1P9G<W~3A4E2EDLj
+801_L6E^GfU`GfIYK6Dj860ULbLPJG<PKVmd864PLVEWMFaQLR1VJFaU00X007HU<39T~3Hfme
+K6A^9g@PIVU^I21`HG9d82ET86IYK6DPH2Ec9`15KWAULR1VJFaU87=`IF=YIVUSHGAYKfhPIVmb
+871QLW@P9F@j8000A4E2EDLj801_L6E^GfU`GfIYK6Dj86m`IFiYKVLPJFi`MG@PIVU\IB1P9G<W
+00X0HfmeK6A^9g@PKg1UKR1`HG9d86IYK6DPH2Ec9`00~22U1QLW@P9C=T84T_D21VJFaU>Q40
+0@0P0@3m02Ec~2K6EWHFaOJ6AbIUmcL6ES07IfGfIYK6EOKV5]I@00~2MWIOIVU\IEmUN7@0;@00
+07=dI6meM000A4E2EDLj801_L6E^Gfm`GfIYK6Dj86m`IFiYKVLPKgEdL7Ed86IYK6DPH2Ec9`0:
+~4A4E2EDLj801_L6E^Gfm`GfIYK6Dj86m`IFiYKVLPKgEdL7Ed86IYK6DPH2Ec9`0:~4BFidIG9^
+HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1_L6E^Gfm`GfIYK6D0~3IG9bKg8PKg1UKVU^Ib1_
+MGA`MG@PIVU\IB1P9G<W~2Cbm@86IYK6Dj6P01020109419G<0~2A4E2EDLj801_L6E^Gfm`GfIY
+K6Dj860ULbLPJG<PKVmd864PLVEWMFaQLR1VJFaU00X007A]L5m`M7809BYc82EKGPYM~3M6m_
+86eQKWTPHfQQLV5SM6EbLb0X9F@Y86U^86E^HfmTJFiW87AQHVaU~2IG9bKg8PLVEQI6U^Ib1U
+KV=_I6U^Ib1dHF9\I@00~2M6m_86eQKWTPHfQQLV5SM6EbLb0X9F@Y86U^86E^HfmTJFiW87AQ
+HVaU~2Mg9_KVLPKWE]HVEb86mV86=XHG9QHgAULW<P:2ET:B1YKR1UKV=_I6U^Ib1dHF9\I@00
+06EbLVmb86m`IFiYKVLPM79QKW=\HGAYKfhPJFiTIGPPIVU\IB1P9G<W~3IG9bKg8PLVEQI6U^
+Ib1dLV5^LfaQM6U_KR1YKVAUN21VJFaU~49G<P9G<P9G<0~3IG9bKg8PL65bLfU^Ib0c86E^M79Y
+IG<PJFhPM79QKW=\HGAYKfhPJFiTIGPPIVU\I@0004A5@UD0~60@0@0TLj801`LW=OJFAhGfIY
+K6Dj82D`=6aT>R16LVm]>R1P9G<W;21DKcXPH2Ec9b`PF4aD;FIYK6Dj860ULbL02P15CdHPIFiS
+KgE^M6EbIF@PHVEVKg9U860ULbLPJ6EQI6Eb~2IG9bKg8PLVEQI6U^Ib1VJFaU86QUHFAULW<0
+05IFHfmTIB1XIF5TIG8PH2Ec9b1VKgE^I21gJ6E^85EE;eQHI6ESKfAYKVL0J6EQI6Eb860ULbLP
+LVE`IF5dIF@0~3J6EQI6Eb860ULbLPLVE`IF5dIF@0~3IG9bKg8PLVEQI6U^Ib1UKV=_I6U^Ib1d
+HF9\I@00~2EUI586QUHFAULR1P9G<W86i_M21iIG@PLgE`L6mbM6ET~3BFidIG9^HF`PIG9bKg8P
+I6EdIF=dIF@PJFhP9G<X:@1bI6IYGfQUHFAULW<0~3J6EQI6Eb860ULbLPKVmd87=eL71_LWAU
+I21gJ6E^85EE;eQHI6ESKfAYKVL0~39FaT06EbLVmb871QLW=YKVLPMV5\MFDPKfHPH2Ec9b1X
+IF5TIG8006QUHFAULR1P9G<W86i_M21cMG1`Kg9dIF@PMfQUKR1EEBmHF6AUHfmTJFiW~49Fah
+06EbLVmb871QLW=YKVLPMV5\MFDPKfHPH2Ec9b1XIF5TIG8004AUHfmTJFiW86eUM6Q_I3XC0040
+80406@1EEF=_I6D:~2A6ESKfAYKVLPKFEdJ6mT>Q<00@0P0@0M05QHHfmTI@X0EWH0EP14IF=_
+I6U^Ib1]IGAXKf@j4`01020104P1EUISKfAU2P00M69\06EbLVmb879UHFAYKVLPIFiSKfAYKVLP
+M65RK6DPIVU\IB1P9G<W~2I6EVHGE\M21EEF=_I6D0060Q8R<T9BHW:2TZ:b`];Rl`<C8c=3Df
+=cPi>S\l?Cho@452@dA5ATM8BDY;C4e>Ce1ADU=DEEIGF5UJFeaMGUl0~3I6EVHGE\M21HF6=_
+I6D002\]<34b<c@e=SLh>D52@dA5ATM8BDY;C4e>Ce1ADU=DEEIGF5UJHF9SI6EVIfQYJV]\KFi_
+L75bLgAeMWMhNGX0~3I6EVHGE\M21FEV=_I6D002\]<34b<c@e=SLh>D52@dA5ATM8BDY;C4e>
+Ce1ADU=DEEIGF5UJHF9SI6EVIfQYJV]\KFi_L75bLgAeMWMhNGX0~32TE^HfmTJFiW87AQHVaU
+87=_MG9SICX=00408040700UL`00AFiSKfAYKVLPM65RK6DPHfm^M6E^M7<j2`01020100T09Bhc
+<W<0~38`01020107D19Bhc<W<0~3Ce<_<P00~2EUI586IYK6DPHg9UHGAUI21_KR1Q86AYIVIU
+LVE^M21_L6EbHGAYKVLPLgUcM6E]>R1P9G<W~2M6QU86meM71eM21VJFaU87MYK6`PHVDPHg9U
+HGAUI21eLfU^Ib1dJ6DPI6EVHGE\M21VKg9]HG@0~3Ce<_<P00~2IVmbKF5d860ULbLPJG<PKVmd
+87=eL71_LWAUI21RNB1dJ6Uc86U]L6aUKFE^M65dJFm^06meM71eM21VJFaU87MYK6`PHVDPHg9U
+HGAUI21eLfU^Ib1dJ6DPI6EVHGE\M21VKg9]HG@0~3IVmbKF5d860ULbLPJG<PKVmd87=eL71_
+LWAUI21RNB1dJ6Uc86U]L6aUKFE^M65dJFm^06meM71eM21VJFaU87MYK6`PHVDPHg9UHGAUI21e
+LfU^Ib1dJ6DPI6EVHGE\M21VKg9]HG@0~3Cbm@86IYK6DPIVmbKF5d>Q<00@0P0@2002Ec~3JFAh
+05IFGdU>A4EHGdI9C4D0~2EUIOBDi4AEQOATU<A@0007If;GQ\M2iYI7P007If;GQ\M2iYI7P0
+07If;GQ\M2iYI7P006U^MV5\JF@PIVU\IB1UKV=_I6U^Ib1]KfAU87=UM20X9F@Y00Y?;e0PIVU\
+IB1]KfAU>QD00@0P0@2?02Ec~2A4E2EDLj801`HF@PHfQQLV5SM6Eb86i_M21cL6ESJFIYIF@P
+KfhPM6QU86=_KFeQKV@PK6U^I@0:02ET~4L65T86=XHG9QHgAULR1fHFaeIB1]MG=d869U86U^
+87AXIB1bHFiWIB0`;C8e=@00Cbm@86IYK6DPL65TI6U^Ib1SJ65bHF=dIG8j200102010:`09F@P
+:31h9C0bN2T006U^MV5\JF@PKF5hJFeeKB1VJGQUI21bIF=_LV@PK6E^IgAX87=UM20X9FaT:@00
+06U^MV5\JF@PKF5hJFeeKB1fHG9YHF9\IB1bIF=_LV@PK6E^IgAX87=UM20X9FaT:@00~2Cbm@
+86IYK6DPKF5hJFeeKB1bIF=_LV@PK6E^IgAX>R0P820UK6@004l_D21VJFaU87AYKFEcM65]L3X@
+004080405`0UL`0000YDKgAQK21RNGAULb1bIF5T>Q800@0P0@0I02E\I01DKgAQK219;e0PL65b
+M7<PLVEQI3X>004080406@0UI00005A_M65\869iM6Ec87MbJGAdIFhj3`01020101d09FaT85]?
+Bed0E6mdHF`PHWUdIG<PMg9YM7AUKSX?00408040N@0UK6@006aQLg@PLVESKg9T87MQLb1`HFAT
+IF@PMfUdJ21fHFaeIB0UI20X<7PU<39h:@0006IYK6DPLfUjIB1TKfEc86i_M21]HGASJ21dJ65d
+879UHfmbI6ET85\UK6AM~4E6mdHF`PHWUdIG<PMg9YM7AUKSX?00408040700UK6@PFfi_M21b
+IF=_LVAUI5d0~2@e93;C<b>Q`00@0P0@0D02D`>6ah85]?Bed0~2@e93;C<b>Q`00@0P0@0l02D`
+>6ah~4@e93;C<b86A_IG<PKVmd86eQM6=X87AXHG@PLVESKg9TIF@PFbD`>6ahG@13DT<]<c8j
+7001020105T39C0hK7PPFfi_M21bIF=_LVAUI5d02UIFI6ESKfAU82Ec;20ULb1bIFaUHG=U82PU
+LbT:2P0`;STg869UM640~2Ce<_<R0b;WPPBD9=84<PDfEd;c80~3<SDPCVmf834i>C80EUITIF=_
+I6Dj82Ec2PX005EcHFMU>R1FEVAUHfmTIB0PFg5eHFaYIVUULW=M821YKW1eM5mVJFaU821KKgEd
+L7EdGfIYK6EM2PX0020PEV5\JF@PLGEQK6UVJFEbLb1QLVDj2PX0~2820U;S5c9G<:02l]~4820U
+;S5c9G<U;S5cIVU\IBecL6ES2P0_;@0003dj;@0P82D^<G<ULbD^<G=VJFaU;FI_LVeQM20P:6I_
+LVeQM7<PLgE`L6mbM6ET>R0ULbEc9G<ULbEc9G<ULbT:02l]~4?CX]~38000~3820U;S5c9G<:
+02l]~4820U;S5c9G<U;S5cIVU\IBecL6ES2P0_;@0003dj;@0P82D^<G<ULe\U;S5cIVU\IBec
+L6ESG@X0;bd0?CX]020P9BhaLbEc9BhaLfIYK6D]IFiSKfAYKVL]KFmTIB0P:6e_I6Ec87=eL71_
+LWAUI3XPHVU^HG9i87AUN7@Y2P0_;@00?CX]020P9BhaLbEc2P0_;@00~2820U;S5c9G<U;S5c
+I6ESJFeQK2eSJ65b;GIQK7EU2P0_;@00?CX]020P9BhaLbEc9BhaLf9iM6Ec2P0_;@0003dj;@0P
+82D^<G<ULe\U;S5cM6U]IEd:02l]~2?CX]020P9BhaLbEc9BhaLfIYK6D]Lg1UH`X0;bd0~2?CX]
+020P9BhaLbEc2P0_;@00~2820U;S5c9G<:2P0_;@0007E^HF9\IB1dKb1QK6a_Hf5dIB0UK6@P
+HWUdIG<PIVmb869eIVIULR1PAemdKG1OKG=W9`14AD9EAcXP06eQJFhj865\K6mSHGAUI20UK6@P
+HWUdIG<PIVmb869eIVIULR1PAemdKG1OKG=W9`0:~2AemYL5mRMFIVIG80Aem_L5mRMFIVIG80
+;bd003dj;@1XIFa`879ULGEULgAUI000JFi`MG@PIVU\IB1]MG=d869U87=`IF=YIVUUI000~2
+94UT90P00@000@1:02DZLb0UJ6@P9E]N2Ud0~2IG9bKg8PL65bLfU^Ib1P9G<W86QUHFAULR1f
+HFaeI@11Dd=9B@0005IFAB1SJ65bHF=dIG8PLfEd>Q400@0P0@1c06i_M21bIF=_LVAUI01FETDP
+IVU\IB1SJ65bHF=dIG8PLfEd87MQLb1^Kg@PLVESKg9TIF@0K6mSHF`PHfQQLV5SM6Eb87=UM21P
+9G<W865cLgE]IF@0~3@E=3BDT0~2EUI586=XHG9QHgAULR1cIG@j4@01020102009G<0~2EUI5
+86eYKVU]MFdPI6ESKfAU87IULW=YKfhj2001020105@0KVmd879UHfmbI6ET02EXI015LW9_LR1`
+HG9cJFiW860ULbLPJ6EQI6Eb87IQK7EU>R1P9G<W~3EUI586eYKVU]MFdPI6ESKfAU87IULW=Y
+Kfhj2001020101009F@^<01FETDPIVmbKF5d>QP00@0P0@0H06i_M21bIF=_LVAUI01FETDPIVmb
+KF5d>QP00@0P0@0_02Ec~3JFifHFaYI21P9G<W86QUHFAULR1fHFaeICXPH2Ec9`0:EUI586e_
+I6Dj6P01020101X0KVmd879UHfmbI6ET~42UIFAB1]KfAU>QX00@0P0@1102Ec~2JFifHFaYI21P
+9G<W86QUHFAULR1fHFaeICXPH2Ec9`1?Dblb~4EUI586m`IG9QM6U^Ib1cNG=dIFdj3P010201
+07X0KVmd879UHfmbI6ET05IFAB1VJFaU86m`IG9QM6U^Ib1cNG=dIFdPMf5c86i_M21bIF=_LVAU
+I000K6mSHF`PKg1ULV5dJFiW87=iLgAUKB1P9G<W865cLgE]IF@0Ce<_<P00~2EUI586m`IG9Q
+M6U^Ib1cNG=dIFdj3P01020100d09G<0~2EUI586a_KVM^JFiW87@10180IG=d879UHfmbI21\
+IFiWM6Pj2@01020102L0KVmd879UHfmbI6ET05IFAB1]HGQYKGE]879UHfmbI21\IFiWM6Pj2@01
+020105l0KVmd879UHfmbI6ET02Ec82Ec~39FaT04U^MV5\JF@PLfESKfiT87IQK7EU86mV860U
+LbLPJ6EQI6Eb>R1P9G<W~3EUI586a_KVMULg@PLVESKg9T86aUKVMdJ3X900408040C`0UK6@0
+02E\I019KWIQK6UT86IYLW=d87IQK7EU86mV860ULbLPJ6EQI6Eb>R1P9G<W~4EUI586eQN6U]
+MFdPLVESKg9T86aUKVMdJ3X900408040>`0UK6@004EbLVmb871QLW=YKVLPH2Ec9b1XIF5TIG8P
+MV5\MFDj860ULbL0~2EUI587AYKFEcM65]L3XE004080406`1^Kg@PLVESKg9TIF@0EUI587AY
+KFEcM65]L3XE00408040OP4UL`0006U^MV5\JF@PH2Ec9b1XIF5TIG8PMV5\MFDj860ULbL0HVEW
+JFiOMV5\MFEOHWEVIVEb~29BYc82EKGPYM~3IG9bKg8PL65bLfU^Ib1fHFaeIB1_IR1P9G<W86QU
+HFAULP009BYc82DZLb0UFeh:G@0006EbLVmb871QLW=YKVLPMV5\MFDPKfHPEED_F5QSKfAU860U
+LbLPJ6EQI6Eb~494UT9000~27`0001`0~27`0001h0~27`0001h0~27`0001l0~27P0001l0~2
+7P0001l0~2IG9bKg8PHFa\Kf=QM6U^Ib0UK6@PHWUdIG<PIVmb869eIVIULR1P9G<W~2A4E2EDLj
+801QK6a_Hf5dIEmRMFIVIG8j865\K6mSHGAUI20UK6@PHWUdIG<PIVmb869eIVIULR1P9G<W00X0
+06=_KFeUKWAOLgAbGf9eIVIULP009BYc82EKGPYM~3EUI586IYK6DPHfm]KFE^M3X>00408040
+j`XUL`0006EbLVmb871QLW=YKVLPMV5\MFDPKfHPH2Ec9b1XIF5TIG8006EbLVmb86=\Kg=YKVLP
+IVU\IB1P9G<W04A5@UE7>R00IfEdHemVKg9]HG@j86I_LVeQM21^Kg@PLg1UHfUVJFET86m^87AX
+IB1SKfe]HFiT86aYKVD02P1VKg9]HG@PH2Ec9b1YLb1^Kg@PLgE`L6mbM6ET869i87AXJG<PJFe`
+K6E]IFidHGAYKfh0IVmbKF5d860ULbLPJG<PKVmd87=eL71_LWAUI21RNB1dJ6Uc86U]L6aUKFE^
+M65dJFm^06U^MV5\JF@PIVmbKF5d860ULbL0A4E2EDLj801WIGASGfI_LVeQM3XPHfm]KF5^I21\
+JFiU87=`IF=YIVUULb1VKg9]HG@PH2Ec9`0:~3A4E2EDLj801WIGASGfe_I6Dj86e_I6DPKVmd
+87=`IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0JFifHFaYI21]KfAU860ULbL0~2A4E2
+EDLj801WIGASGfe_I6Dj86=_KFeQKV@PK6U^IB1cL6ESJFIYIG<PKFmTIB1P9G<W00X0~2A4E2
+EDLj801WIGASGg9UHfaUKSXPLVESKg9T86aUKVMdJ21^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe]
+HFiT86aYKVD02P009FaT06U^MV5\JF@PLVESKg9T86aUKVMdJ21cL6ESJFIYIF@PH2Ec9`00~2
+LVESKg9T86aUKVMdJ21]MG=d869U86U^87AXIB1bHFiWIB0UK6@]9FaT82Q^Kg@P9FaT:@00~2
+LVESKg9T86aUKVMdJ21]MG=d869U86U^87AXIB1bHFiWIB0UK6@]9FaT82Q^Kg@P9FaT:@00~2
+A4E2EDLj801WIGASGg9UHfaUKSXPHfm]KF5^I21\JFiU87=`IF=YIVUULb1]HGQYKGE]879UHfmb
+I21\IFiWM6PPH2E\I2L02P0004A5@UE7>R00IfEdHemdJFeULgAQKG0j87AYKFEcM65]L21^Kg@P
+Lg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P0006U^MV5\JF@PM6U]IG=dHFe`87=dLVU^
+Ib1cL6ESJFIYIF@PH2Ec9`14AD9EAcXP06QUHFAULUmdNG1U>R1FETDPK6U^IB1]HGASJ6Ec86QU
+HFAULSXPH2Ec9`0:~4HFeRJFMeKgEc86QUHFAULR1YIfi_LVET~4A4E2EDLj801XIF5TIG9OM7U`
+ICXPJFM^Kg9UI21eKV]^KgM^85IFAB1XIF5TIG8PK6U^ICXPH2Ec9`0:~4A4E2EDLj801]HF]U
+GgAYKFDj86AQM6DPL79_MVUTIF@P?B0U<3AT;bD`<V@_9C0bI00:04A5@UE7>R00KF5[IEmdJFeU
+>R1dJFeU871bKgIYI6ET83dP9C0bI3XU<39T>RD`<V@02P14AD9EAcXP06eQJfEOM6U]ICXPM6U]
+IEmd87IQK7EU879UM7EbKVET83dP9FaT00X0~3A4E2EDLj801_L6E^Gfa_IemVJFaU>R1\KfLP
+IVU\IB1^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P1\KfL0A4E2EDLj801_L6E^
+Gfa_IemVJFaU>R1_L6E^JFiW86a_Ib1VJFaU860ULbL02P00LgATIG9b~2IG9bKg8PKg1UKVU^
+Ib1\KfLPIVU\IB1P9G<W04A5@UE7>R00Kg1UKUm\KfMOIVU\ICXPH2Ec9b1YLb1^Kg@PHB1bIFMe
+K65b86IYK6D02P1TMFe]N@0002DZLb0UL`00IG9bKg8PL65bLfU^Ib1fHFaeIB1_IR1P9G<W86QU
+HFAULP00A4E2EDLj801`HG9cGgAYKFDj85IFAB1dJFeULgAQKG0PLgAbJFiW871bKgIYI6ET83dP
+H2Ec9`0:~39C0dI2hU<39T;RD`<V@]9C0bI3XU<39T>RD`<V@0~2IG9bKg8PL65bLfU^Ib1dJFeU
+LgAQKG0PLgAbJFiW860ULbL0NFEQLR0XFEUIFBTPKGEcM21RIB1YKR1dJ6DPLV5^IfDP<CTg<2db
+<3<g82Q^Kg@P9F@Y2P00~2KFm^M6PP:4e=:B1]MG=d869U86U^87AXIB1bHFiWIB0a;C4b82Q^
+Kg@P9F@Y2P00I65i82Q4A2TPKGEcM21RIB1YKR1dJ6DPLV5^IfDP<Bdc<B0XKVmd82ET:@X0~3
+J6meLW<P:4Q8:B1]MG=d869U86U^87AXIB1bHFiWIB0`;C8c82Q^Kg@P9F@Y2P00KFU^MGAULb0X
+CDdY86eeLg@PHVDPJFhPM6QU879QKVMU830]=CTP:6i_M20UI2T:~4LfESKfiTLb0XDe<Y86ee
+Lg@PHVDPJFhPM6QU879QKVMU830]=CTP:6i_M20UI2T:~4A4E2EDLj801`HG9cGgAYKFDj87AY
+KFEOM21fHFaeIB1bIGAeLViUI20m82E\I00:~4JGAUKEmcM780~39FQT06EbLVmb871QLW=YKVLP
+JGAUKB0UI20XH2Ec9bTPJFhPM79QKW=\HGAYKfhPIVU\I@00~2JFifHFaYI21fHFaeIB0X9F@Y
+86mV86UdIFdP9F@PJFhPM79QKW=\HGAYKfhPIVU\I@0007MbKfiW86ieKF9ULR1_IR1fHFaeIG<P
+JFhPM79QKW=\HGAYKfhPIVU\ICXP9F@0069eIVIULP00IG9bKg8PKg1UKVU^Ib1UKV=_I6U^Ib1d
+HF9\IB1VJFaU860ULbL006EbLVmb879UHFAYKVLPIFiSKfAYKVLPM65RK6DPIVU\I@0007A_Kb1]
+HFii86=XHG9QHgAULW<PJFhPIFiSKfAYKVLPM65RK6DPIVU\ICXP9F@006i_M21UKVmeIfPPHfQQ
+LV5SM6EbLb1YKR1UKV=_I6U^Ib1dHF9\IB1VJFaU>R0UI000~2IG9bKg8PKg1UKVU^Ib1dLV5^
+LfaQM6U_KR1VJFaU860ULbL0N6adGf9eIVIULP00IG9bKg8PLVEQI6U^Ib1dLV5^LfaQM6U_KR1V
+JFaU~2J6EQI6Eb860ULbLPLVE`IF5dIF@PJFhPM79QKW=\HGAYKfhPIVU\I@00~2BFidIG9^HF`P
+IG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1bI5mhK7AOIVU\I@0UJ6@0JFifHFaYI21P9G<W86QUHFAU
+LR1fHFaeIB1YKR1dLV5^LfaQM6U_KR1VJFaU>R1P9G<W07A_Kb1]HFii86=XHG9QHgAULW<PJFhP
+M79QKW=\HGAYKfhPIVU\ICXP9F@0J6EQI6Eb860ULbLPKVmd86I_MFiT86U^87AbHFicK65dJFm^
+86IYK6D0~2J6EQI6Eb860ULbLPKVmd86I_MFiT86U^87AbHFicK65dJFm^86IYK6D0~2J6EQI6Eb
+860ULbLPKVmd86I_MFiT86U^87AbHFicK65dJFm^86IYK6D0~2JFifHFaYI21UKV=_I6U^Ib1d
+HF9\IB0]86=XHG9QHgAULR0`N2D`<UPPI7E`K6USHGAUI000~2N6ad06EbLVmb879UHFAYKVLP
+M79QKW=\HGAYKfhPM65RK6DPIVU\IB1P9G<W~32UAbHFicK65dJFm^87AQHVaU87=_MG9SICX:
+004080406P0UL`00E79QKW=\HGAYKfhPL6EbIVmbKFET>Pd00@0P0@3=0F0ULbLPM6lPH2Ec9`1S
+KfidIGQd>R1\JFiU82E\I21_IR1VJFaU860ULbL007AUN7@j860ULbL006=_KWAUN7@j86aYKVDP
+9FaT86mV86IYK6DPH2Ec9`00A4E2EDLj801fMUmdJFeULgAQKG0j87AYKFEOM21fHFaeIB1`LVmf
+JFAUI20m82E\I00:07AYKFEOM21fHFaeIB0l830P:2E\I2TP;B1SKfifIG9dIF@PM6lP<0X0~3
+9C0dI2hU<39T;RD`<V@]9C0bI3XU<39T>RD`<V@0~284M=E000~2A4E2EDLj801fMUmdJFeULgAQ
+KG0j85IFAB1dJFeULgAQKG0PLgAbJFiW879UM7EbKR1fHFaeIB0m860ULbL:00X0~2HfmeK6A^
+9g@PHFa\Kf=QM6DP9F@PHWUdIG<PM6lPHfm`NB1cM79YKVLPH2Ec9`0094UT9000~22REc85]I
+;diM>R00ADm686AUM6ESM6ET86m^87=dHFiTHG9T86U^L7Ed079R~3HfmeK6A^9g@PIGQQKFU^
+IB0XKg1UKRTPIVU\IB1P9G<W~3A4E2EDLj801UN65]JFiUGfIYK6Dj860ULbLPJ@00~<0@2K0g<P
+KVmd864PLVEWMFaQLR1VJFaU00X006=_MFaTKRMd86EhHFeYKVDP:7=dHG@Y86IYK6DPH2Ec9`00
+079UHG=_KR1VKg8PIG9bKg8j82Ec079R0780~2JFifHFaYI21VJFaU86e_I6DPLg1UHfUVJFET
+82PUI2T0~3IG9bKg8PKg1UKVU^Ib1VJFaU860ULbLPIVmb86U^L7Ed~3AVU\IB1P9G<W86EhJG=d
+LbhP84mfIG9gLVUdIB0o~2Kg1ULV5dJFm^86=QKV=UK6aUI01VJFaU860ULbLPIGQYLgAc07MR
+07L0~2JFifHFaYI21VJFaU86e_I6DPLg1UHfUVJFET82PUI2T0~3IG9bKg8PKg1UKVU^Ib1VJFaU
+860ULbLPIVmb86meM71eM000@2<T9Eh]Gcd[HF9SI6EVIfQYJV]\KFi_L75bLgAeMWMhNGY1@T=4
+ADI7B4U:Bda=CTm@DE9CE5EFEeQIFS0a<S<d=CHg>3T`~4@2<T9Eh]Gcd[HF9SI6EVIfQYJV]\
+KFi_L75bLgAeMWMhNGY1@T=4ADI7B4U:Bda=CTm@DE9CE5EFEeQIFS0a<S<d=CHg>3T`~4LgEc
+L6USJFmeLb1XIF5TIG8PIVU\IB1cL6ES860ULbLPHfQQKVMUI21dKb1P9G<W~2G3X0G00^~42REc
+06EbLVmb879UHFAYKVLPLgAbJFiW86IbKfdPLgATJFh0BFidIG9^HF`PIG9bKg8PI6EdIF=dIF@P
+JFhP9G<X:@1bIF5TGg9UHfmbI014AD9EAcXP07=SHFiOHfeTGfaYKVDj86=_KFeQKV@PK6U^IB1Q
+LVMeKFE^M3XPH2Ec9`0:02d004A5@UE7>R00Lf=QKUmSKFAOK6U^ICXPKF5dHfQULb1aMF5\JFIY
+IG8j820P820PH2Ec9`0:~3HFeRJFMeKgEc875eHFaYIVUULR1P9G<W~4MFi[KVmgKR1aMF5\JFIY
+IG8PH2Ec9`00LGEQK6UVJFEb860U;S5c9G<W86eeLg@PM65[IB1Q87IQK7EU02l]07IQK7EU86eY
+Lg=YKVLPHFIdIG8PLGEQK6UVJFEb860ULbL0075eHFaYIVUULR1P9BhaLbEc9b1TKfEc86i_M21d
+HF]U864PMV5\MFD0;bd0A4E2EDLj801cHf5^Gf=]I5m\JFiU>R1aMF5\JFIYIG8PMV5\MFDj2001
+02010544H2Ec9`0:~3M6m_86eQKWTPIVU\IB1^HFeULb1cL6ESJFIYIF@0~2A4E2EDLj801cIGAO
+IWAYKFDj87=UM7AYKVLPIVU\IB1P9G<W87AYKFDPM6lP9Bhb=7<02P00~2@f5^KVmd87=UM21V
+JFaU860ULbLPM6U]IB1dKb0UL`1bIF5cKfhj84mC;c8PI6mULb1^Kg@PLgE`L6mbM21VJFaU87AY
+KFEc869UIVmbIB0a>CP`;P0004IYK6DPH2Ec9b1dJFeU87=UM21dKb0a>CP`;S0a;S0a;C0`>S0`
+>S0`84M=E00006EbLVmb87=UM7AYKVLPIVU\IB1P9G<W87AYKFDPM6lP9Bhb=7<0~2BFidIG9^
+HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1cIGAOL6U`IEm]KfAU~3IG9bKg8PLfEdM6U^Ib1]
+KfAU86mV86IYK6DPH2Ec9`0jG01DFP0005AJ?@17CE@`@U=D~582d]8000~22UM1DTi9CTLj8000
+2TEBDTmB>R00~32TI1E45<>R00~3BFidIG9^HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1eLfEb
+GfeULg=QIfD0~39G<UL`X0~29G<UL`X0~2BFidIG9^HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X
+:@1gLVUdIEmbIF=_LV@0~3DgE^84e_KR1DMFDPEfET85AXMB16LVTPDf5d84YQKR16IF8PCF5b
+845`LR1=HGTPBWE^84YeK211MFLPDfE`84mSM21>KgHPA6ES8>0h0`10>@<0X3T3~2>P<0~2800P
+0200800P0200800P0200:00X02P0:00X0200800P0200800P0200800P0200800P0200800P0200
+800P00`0400@0100400@0100400@0100400@0100400@01000`0300<00`0300<00`0300<00`0@
+0100400@0100400@0841P@610H41P@610H01P0600H01P0600H01P0600H01P0600H01P0600H01
+P0600H01P04@0100400@010040110D41@@510D41@@500D01@0500D01@0500D01@0500D01@050
+0D01@0500D01@0500D01400@0100400P~30@000516~20@00~40@40~20P000<0n0`34?P<0b3h3
+0<`n0`3@?P<0e3h30=Pn0`3L?P<0i3h30>`n0`3d?P<003l300`o0`0D?`<083l302@o0`0X?`<0
+;3l3030o0`0d?`<0>3l303`o0`10?`<0A3l304Po0`1<?`<0D3l305Po0`1T?`<0K3l3030o0`1d
+?`<0O3l308@o0`2<?`<0V3l30:0o0`2\?`<0^3l30<@o0`3@?`<0hSl30>Do0`0\0@00AE=D00@0
+~22P000040~2ooooo`P00@000@0C010>~281`0010>~2ADAD02`g0`d00@000@0X0>Po0`3Z?`<0
+jSl30>Xo0`3Z?`<0jSl30>Xo0`3Z?`<0jSl30>Xo0`080040o`403@0`=`<0g3L3~589@00@00
+0@01010V004000404P010?oo0@00~50@00020>5P01~20@0100<@004000400@0@4P01~20@07
+0040~2h3P33@01~20@0B0040ool2~70@00020>5P01~20@0100<@004000400@0@4P01~20@07
+0080~2@3T33@01~20@0B0040ool2~70P00020>5P01~20@0F00<0~2ADA3<dM<Cd80~20@00~2
+D4IV004000400@13e`01~20@0302`g0`d00@000@0X0>Po0`3Z?`<0jSl30>Xo0`3Z?`<0jSl3
+0>Xo0`3Z?`<0jSl30>Xo0`080040o`408`0`=`<0g3L300`h0`3\?`<0~4E3P30;1?0`00~3X3T3
+?@01~20@1T0R83~2E5X004ECE015A5@0~47`0003\0~2FP0007P0~2U`000;D0~2e0000?<0~2
+4@400301~2CP4006d1~67`0003`0~2F`0007T0~2V0000;H0~2e@000?@0~24P400341~2C`40
+06h1~2Gd=\Kg=UDgAbIF5]~40@0000d:00d:~39F@005PW9CAH9`00~47`0003\0~2FP0007P0
+~2U`000;D0~2e0000?<0~24@400301~2CP4006d1~67`0003`0~2F`0007T0~2V0000;H0~2e@00
+0?@0~24P400341~2C`4006h1~2P?8100D00<010P01T`00`043T`4200700@0002L00<00~20Ih0
+0<010P01U000`043PP6E~2`043P`6G~2`043P@6H~2`043Q06I~2`043R`6J~2`043Q@4L~2`041
+006K~2`043T@4U~2`000004M~2`041004X~2`0000046~2`000004T~2`000006M~2`0410041
+0060~30Oooool0~3V`00`1`00<05~2`9d00<010060W000`9<00<2N~2`9@00<2E~2`9H00<2G
+~2`9P00<2I~2`9X00<06~2`2@00<0U~2`1d00<0W~2`2P00<00~3IP0006L0~2J00008<0~2JP00
+06h0~2K`0008@0~2Q@0008H0~2Q`0008P0~2R@0008X0~2R`0008`0~2S@0008h0~2S`000900
+~2T@00~5200103l10:@1~4Gdm`IFiCM79UHFd0Gdm`IFi2NGAU~3Gdm`IFi2NGAU~3K40305=5
+E5E@@E97;T5CC@00~2;P0006=_K@1UN6D0HfeT05aCB45BADe5CEa4A4Dd@410@2i0@40005=e
+KP1=Kfh0E7EU05MUI01DJ7D0AW9Y05=QM01CMFiTHGT004e_KVAQN@00E7EULfAQN@1GIFA^IG=T
+HGT0~2E6QeLW=THGT0~3AW9YI65i~2Df5dMG9THGT0~3BV5^04IUHP1=HG80@G1b04eQN@1:MFh0
+BWE\045eI`1CIG00Cf=d04i_MP14IF<0BV5^MF5bN@16IF9bMF5bN@00~2CF5bHfP0~2@G1bJF`0
+~2BWE^I@00~2BWE\N@00~2@GEWMG=d~2DfE`M6E]HVEb~3Cf=dKf9ULP1>KgIUKF9ULP00~2A6ES
+IFeRIG80~39Fd_9F@_9GT0~39DTj9Ddj9E<0~39GT_9Fd_9F@P9DTj9Ddj9E<0HFd0L6d0;P00
+04<0~6A4E6@EE<E5m<Cd=1HFAYKVM<A@00E4E=D4e5C@0P2@00<34b<c@e=SLh>D52@dA5AP00
+~2<34b<c@e=SLh>F5RHfAUIP00~2HVa[LfUjI@1\LVESK000079UHfI]~3M7U`I@00~2KFE]Kg9i
+~2J6a<05d0~2;@0[04A4AC@^CE=7~4BFidIG9^HF`PK6URLV5bNB1ULW9_LR1YKR1VMFiSM6U_
+KSXPGdMUM4EbLTecI`00:34Y00d:~2CFEcLf5WIB1^Kg@PIVmeKV@PJFhPKFEcLf5WIB1VJFaU
+;P00:38Y02Pc:@1=IG=cHFMU86IYK6DPKVmd86I_MFiT;P1>@Dh0BDi6BDi9E5T0~3BDi604i1
+CP19CTI9CTUDF@00~2BDi6~:P000~:l7l0~5403oooooooo_O`00~4l7l0~5n7ooooooooogO`00
+~4l7l0~5n?ooooooooogo`00~4l?l00<1ooonoO`00P7l00<3ooonoo`00P?l0~70@3ooooooooo
+ooio~7P?mo~7`?mooooooooookooO`00~5P?mo~7`?oooooooooookooo`00~5P?oo~6<34b<c@e
+=SLh>F5RHfAUIVMXJFY[K6e^Kg1aLW=dMGIgN7Uj~:941o0`00~6941o0`00~7P?lo~7X090~7
+b0E0~7nPQ0~6@9`<@000~4D<<?@000~49?@B@000~3P9JH5T00~48;bn6D00~4:6_^7400~4n@:E
+8400~3@;M3^R=0~44:GDj2I0~4:^N4TBY0~3P?@Pi[D]@0000:0aZEoS<400~21;o96hhd@000
+0<D^_::a=d00041f>V\;gSY0~2j8T48lN:?T0006:\aN]h[D50081j5kLVemQ4@02@[6hbN8J7
+B400]5L:?aIXZD]00:7]c<hK`]=>@:24541QDEV4DT38YAV@^JE_YEE0>PlPm2N?bliH@8@9U?Qh
+>Cn1G43U2kTfe`N?XEm0gdiW1<g9l\UR@9HRPDE0O6olID2N]G0[Z:g5WFU01N=<=Q8I=lE\@<LK
+h<=FghCfKd1L4F`jUP\CVW=0\aD7bG_>Ul1f@23KB;\J`[g`ND3dR0feD9UfUWe0<N]@hZ@o5;b0
+@?dUiAZ>CaW[Pd2n=lo@^=7_TXM0[PD31BO6ZkN:@1W7@lJ`]iKUSD1`G>YkcS9nSi50S??T6X:o
+GK>D@6l`WZ5R;cGPUd15gP:UWCdQS9]0eiE33PF=:JnN@4ake556l??JXD0@cBCc:gKHR:E0E03^
+kkJC3Z^X@6R0jJ^T>=;EZd11l77[IV>SQJm0DVa>YT0l3:Nb@6H7h\m@Blo@]D2PA>f14Xn1P[U0
+b9EX8]Ob8J>l@3Zk0^^<Kn[;_d08J\<UL0_Uo\90AB:J5bHWCio6@=JZP9g_l2;7bD2<eN24:jg[
+n<a0MhD<<c]<Ti_@@000~5P?loeJK?odTON<;C@>2<jH39AkZCZ45[EBLiSOM`h7a2S]kiWO_[
+OZYA@gKSc?8Y;hB19T@GZ_R^4>?5a?Y4e??gjn5:NYG?ALNA3ZJ^X1WSXdKmUFM[RO^3[7Q77Ie:
+iI7g38==B<`1SamZXa[78DV<YP3=Z9`oUoI93WmcS@]Jb^G:B^[KeN<\:hn^Wd_Bcbh=:VNJQ7A<
+5`aePHIeM\U8CCBHNYTfC@ZI7DkQ_c\L63b3j?5>=^BlRWV=X;36Cl]^QN\>S2b6Ve22l6a6eVkI
+bfmA1@k_U]A\fYY4DPZkMjRBGdC[65?TYi<i>cFh\^eC_k3dc8Md`hO2E8kkmn@:YD?>UUDiD`9_
+o@^`W6]FS;Q:TXCM3NhoEfICZLYf=MJd55Q=08I;1bmORNUH<oN4WAL^]M2mFNEM?LEM>h^NTUXY
+4GdW@loOl6IKm]H4aVZQn[HkG4V5n=4[b_n:45e_P?A1<R0^dnAM@;JMc]@;K:2iG^24`8U`C[[c
+SEmC_50@T8`U^F9PY_2Q8<1DYH`gHHi_N_oCTJkE2f;m0O7ZM8iBX^1RJ^F^UoadWOJdHlagfI^J
+2UNkRFBg@^;C^me?SUiU3GkS:[ZI=]PbIYnU0D24e3jT1fN;FX_H9Ef9nM]WKGfT6gX_Skf`J>eA
+;na3M?n?QFWUJTH?idk6fUUZAOjIEWg_<:H^J`nOcVYj8Gkl0V`NMZJhFPo>_mM\[^JlEj\W]96\
+KOSc9knRb5gMP6hMaf>i3o4XZ5E_dJj6mMSLNolYL=P37lVU_Q?2oW1^ClImL`M^Tm=aTA4Ij7\N
+oMnWLX9>ZIDPjbJZO7?F>dW>>5E1PE5dViLPRP9BH<@UMB]OO\]<8bfEnWF<mmJXB6RTh\if2S3n
+GL__:ZbSMk@LhG_SD\V2N7Qfkd[KE]jcaTaiD]NZ@QN;lIHQNUmfm6TW_U?UmG[`FME^HQ4e[\Yk
+JJebQUOeEHBOO1CW__c7N0k9Lge5CO09hdjkV4QnKFdD^Glh2nPLOnLe2[E_HTF`lGl0~7g2X2
+058[0P00~2P1b60@22QP40~3P9260@21R040~3P9280@3_R040~3P?b80@0lR@40~3P4R90@2c
+S@40~3P>B=0@1bSP40~4M8h10=^>0@00~2P>R>0@1aS`40~3P82?0@02T040~3P12@0@3_T@40
+~3P?bA0@1LU`40~3P6RG0@3\U`40~3P?RG0@2NV@40~3P:bI0@3nW040~3P0bM0@2UW@40~3P;BM
+0@2ZWP40~3P;RN0@1TW`40~3P72O0@1TXP40~3P72R0@2CXP40~3P:2R0@1TY040~3P72T0@17
+YP40~3P5BV0@27Y`40~3P:BW0@3JY`40~3P>RW0@0=Z040~3P1bX0@1:Z040~3P5RX0@1`Z040
+~3P7bX0@2AZ040~3P:2X0@3JZ040~3P>RX0@0GZ@40~3P2BY0@2NZ@40~3P:bY0@3h[P40~3P0B_
+0@1e]040~3P8Bd0@2D]040~3P9Rd0@2`]@40~3P<Rg0@3Y]`40~3P?Rg0@2iaP40~3P<S60@2g
+a`40~3P<C70@14b040~3P5380@3ib@40~3P0S:0@3Tc@40~3P?3=0@0We@40~3P3CE0@05eP40
+~3P1CF0@1YlP40~3P83b0@27lP40~3P9Cb0@0Hm@40~3P2Ce0@1>0`80~3P5`30P3d2080~3P009
+0P0I2`80~3P2P;0P0O3@80~3P20=0P3h3@80~3P0@>0P0o3P80~3P40>0P1B3P80~3P>0A0P19
+4`80~3P5PC0P3N4`80~3P>`C0P1_6@80~3P7`I0P2O7P80~3P:`N0P2C7`80~3P:0O0P3b7`80
+~3P00P0P0Q8080~3P2@P0P0[8080~3P3PP0P0o8080~3P4`P0P088@80~3P1@Q0P0I8P80~3P2PR
+0P398`80~3P=PS0P2D9P80~3P:0V0P0E9`80~3P2@W0P2L:080~3P:PX0P3^:080~3P?`X0P27
+:@80~3P9@Y0P3>:P80~3P5@[0P0c;080~3P40\0P3?;@80~3P>@]0P1>;P80~3P5`^0P2F;P80
+~3P9P^0P0i;`80~3P4P_0P1R<080~3P70`0P1I<@80~3P6Pa0P2Z<@80~3P;Pa0P12<P80~3P50b
+0P31<`80~3P=0c0P2V=080~3P;@d0P3?=080~3P=`d0P3[=080~3P?Pd0P3o=080~3P0`e0P3\
+=@80~3P?0e0P2c=P80~3P;@f0P0D=`80~3P20g0P1V>@80~3P7@i0P3@>@80~3P=`i0P31>`80
+~3P=0k0P3P?080~3P>`l0P2h?@80~3P<@m0P3l?@80~3P0Pn0P3A?P80~3P>0n0P1<@080~3P5Q0
+0P3^@P80~3P?a20P1`AP80~3P7a60P1FA`80~3P6A70P3fA`80~3P000~6EH_\PNb8~3RDD8RED<
+RDd@RdD8PWP50GDYRdD8Re08RdDHj?>W~2RddH^\@30`2h~4j<U]~2\07YOP0008_0SEF8RdD<
+j=T^~2R4F7PWf70G@L^NA?0`2jb0<306Jh0@3XjH800;00jDh0~2Rl2=AHQ@^_@30`2Qd4l308?\
+2>PVR000^NA?0`2;5M1?0`1V^040j;J2~2ogDHSDf8ReDDRdD@Pn`<j6XO~2Pl@LR4F7RTF7j`>=
+@023a0c9`he005F;k8?\H6P<D`<03kl5X503052j70@30:7@C`<0Pn`8j<>7~2^NA?0`2;5M1?
+0`1V^040j5>2~2ocEXD`<03kl5X503052jA0@30:7@C`<0Pn`8j8n7~2^NA?0`2;5M1?0`1V^040
+j1n2~2adGd01000;Y\10<0RdGdj==5~2Pl@PRDG@I\M5jP00RdG@RDGLo6S0C`<0J0aC0`2;3@a?
+0`2;5CAH0`2h00P008?\3>RAA000Pl@DRDGTPggT00n5E@000:5PD`<0mT080@n46P000;WTC`<0
+^W`40`1V^0@0j:>1~2jAD0~2Rl2ii4l30;ZX10<0I[P40>R9P@00^P00~2^0aC0`3XLV<00>Ri
+L000j323~2RdgT<l2:0FJ3?4F0C0<0ogE>J0aC0`3o=FQC0`2;CN@c`8X1D8]=i3?0RP5@^\@4
+0`2Qd4l308?\2>R=QP00^NA?0`2;5M1?0`1V^0@0j1f1~2j=R2~2Pl@HjA<0~2RdgT<l2:0FJ;
+14F0C0<0IXU5hX]5i429ANAVPggR07e03km5hU2jo0@30:7@C`<0Pn`8j3B6~2^NA?0`2;5M1?
+0`1V^0@0j<B0~2ReGT^0aC0`3X[f800>QbPP00Pl@<IX=mhP0?QB`2~2J<1?0`1X35<308\=34l3
+08\E=5P30;P02000Pn`<j3e3~2Pl@DRDGTPggT00n5;0000;WTC`<0^Q`50`1V^0@0j5j0~2^P00
+~2^0aC0`3XAf800>R>K`00j0F2~2^B000`2;ENBh35<30>S[BP00IXU5j0noANSYVP4008_0ocEX
+D`<03kl5X503052j>0D30:7@C`<0Pn`8j625~2^NA?0`2;5M1?0`1V^040j?1o~2Pl@@jBP6~2
+IX<mQ5<3009d@Oleb0030;YP1@<0XM1?0`23k0SX8XD00;WTC`<0RaG@C`<0I[P40>RbO`00ReGT
+^0aC0`3XWF400>QPP@00Pl@<3km=j6_93871800308]Ei;P<D`<0j?mA~2SDGJD;Z81@<03km5
+j6_038^0:00308?\2>P]Q@00Pl@<IZ6PD0<0IT1VXj1@0`1VXJ1@0`1V>DGJM4H?_dGJD?leb003
+0;Z<1@<0XM1?0`23k0SXQh@00;WTC`<0RaG@C`<0I[P40>PGO`00ReGT^0aC0`3X0V400>S5P000
+Pl@@ocEXD`<03km5fTQ@^Z050`2Qd4l308?\2>Q0Q000^NA?0`2;5M1?0`1V^040j=1n~2^PaC
+0`1VXJ1@0`3X]0L008?44>WX1000^NA?0`2jb0D306Jh103XYGh008]Ei;P<D`<0j91P~2j5>0
+~2jAH0~2Rl23n0P?Q5onoon3n0h?Q9;nooo[`0noAN:3`0:i0`0009WgnL7P0XU5k8<mP4l3~2
+M12QP4l30>QhX`000dG\RDG\RdGTj6ZS~2>dG\Ldf;ANB3k0CXFZ<008?4153oMNbjh0D30:7@
+C`<0Pn`8j7F3~2^NA?0`2;5M1?0`1V^0<0j0En~2ReGT^0aC0`3Xl5l008?44>TX1000IX<miTh3
+00<?Q?h0~2RdG@RDGLIX]5hVJ9AOiVPggn07hiRdgLReGTIX]5o^P61000IXU5lX]5i8?018U5
+i0noCO:;AM`3`HU5g6J;AOiV:dGbIXU5o^_3SD00adGh~4o0noAN8kAOQf=h]5d8]En8X=;5P3
+038<483Qoh7Qo`000:4\F0<0`NP8<`B=V5<30:<\F0<0RdGh@8U5n>_2Rl22?J410`01MCO7AOP0
+~33km5hS]5n7HWRdg@ReGh<l2:115VRaA5\50308]5d8]=n8PD28]5n429AOS[dX_0^KQG0`2;
+EM0?_dGRj2mo~23km5hP<5:5P30:<XF0<0jAL3~2SD00IX=mjP0?QMd1~2SDf\ReGTI[P20>PB
+0`00IXU5lS?0RTF\9Ol0~2`N08RDG<<l2:AJdUo`0000=5c8U5c8=mc00?S1@0~2PGg<ool000n?
+1`000>U0~3Rl3oMLbj10H30:7@C`<0Pn`8j<n1~2^NA?0`2;5M1?0`1V^0@0j5ml~2ReGT^0aC
+0`3XBUh00>P=OP00Pl@<RdGd>DG<3hj>~3ReG<RdG@j4nM~2RDG@Pgg@00n5<@000?mec;X\1P<0
+XM1?0`23k0SXKH400;WTC`<0RaG@C`<0I[P40>SmN`00j;Qm~2Pl@<RdG<RDGdPSg8C`<00GDf
+^V060`2Q33H30>S3OP00ogG<^VP60`2Q33H308?\2>R^OP00^Y`60`2Q33H30>ROOP00Pl@<IX]5
+hVJ9AOj;AM29AMb;CMb;ENAVRdGnj=\1~2IXU5lX]5i8?018U5i8]5g8Y80X]5g8P8RdGL@8U5
+g6J;AOiV:dGbIXU5oVJ3OOh0OSV;CMb;ENAVRdGnj9X1~2IXU5lX]5i8?018U5i0noCO:;AM`3
+`HU5g6J;AOiV:dGbIXU5o^_3SD00I\M5jP40RdG<RDGDIX]5hVJ3j09VRDGR3km=hX]5e2_1RDGD
+jEL0~2SD00IX]5hVJ9AOiVPggn07hiRdgLReGTIX]5o^PV0@00IXU5lX]5i8?018U5i0noCO:;
+AM`3`HU5g6J;AOiV:dGbIXU5o^_3SD003km=hX]5e2_1RDGDPggD00n?cP000<M5n000~2SD00
+RdG<>dGhMSR;AM2;EOR:3BaH0`0b3120hOn1hOl0~2XBaH0`31j0Pc18fHD`<0XbaH0`2;AOQ0
+RDGhjl>=@022?J410`01MCO7AOP0~3RdG<>dGhMRR;CM2;EOPc`8X44FJ;54F`D0<0RdG@Rdgh
+R1@8RdGh@8U5n>_CSD00IX<m6UP300=e5[VhE`<0ReG@RdG<j7Yl~2jA40~2o;VhE`<0ReG@RdG<
+j1Ql~2I\M5jP00RdG<0`DXF0<0XbQH0`3YdoOoohe008]5d>QhT`00Pl@<bL>=@01ERnb3k1aV
+RDD8RED<RDd@I\M5l000IX=m204?S1d1~2Rdd<<l2:0FJ3?4F0C0<0o`n5D@0006P<D`<0ocEX
+D`<0Rdd<<l2:0E2;C@`c`8X1D;ZP1P<0XM1?0`23k0SX\7h00;WTC`<0RaG@C`<0I[P40>Q0N@00
+j?]j~2Pl@HjAH0~2SD00Rdd<<l2:0FJ;14F0C0<0IXU5oX]=33?0RT41IX<lAH1<0`3oME9X35<3
+0?leJ5<308]=33?0RT41D8]=33?0RT41D;[H1P<0XM1?0`23k0SX=gh00;WTC`<0RaG@C`<0I[P4
+0>S7N000j89j~2Pl@HjAH0~2Rl2;C@`c`8Y10FJ;14F0C0<0IXU5o6J;COiV`N42IX]5o6K1n0AV
+2l5VRDGfRdD@IX]=mXP8IX]5l6I0IXU5l6J3O@P23hbV~3Rdd<<l2:@@9VPca5P4`30?l?QE00
+~2J0aC0`3o=FQC0`2;C@`c`8Y10U2;C@`c`8Y10U2j40L30:7@C`<0Pn`8j8Em~2^NA?0`2;5M1?
+0`1V^0@0j1Eh~2j=1i~2Pl@HjA@0~2Rdd<<l2:@@9VR`A5P4`306J9AOYVRdglI\7Q16J;AOYV
+`OP2IP_1IXU5m8]546J;COB8B05VRdG`IT1VRDG`IX=m20<?S:80~2Rdd<<l2:@@=VPca5P4`3
+0?l?QE<0~2J0aC0`3o=FQC0`2;C@`c`8Y10e2;C@`c`8Y10e2jB0L30:7@C`<0Pn`8j=Al~2^NA?
+0`2;5M1?0`1V^0@0j6Ag~2j1mi~2Pl@HjAL0~2SD00Rdd<<l2:@@=VR`A5P4`306J9AOQVRdGj
+I\7P1VH;AOQVRDGbRdD@IX]=lXQ80VJ;AO1V@6J9AO1VRdG`j`:;`8?43<W3SD00EH_\Pn`LIXU5
+28UE36J3O@QS3hh`~3JV>jP0L30:7@C`<0Pn`8j3al~2^NA?0`2;5M1?0`1V^0@0j<af~2j8Mh
+~2Pl@<I\M5lP40RdD<Rd1LRDGdJ<1?0`3oM@b;3@a?0`2;5CAH0`2h00P008?\3>Q@>@00Pl@D
+RDGlRl23OO`03hE<0P00RdD<Rd1DmT080@n44P8008]5389hF04?QDT0~23km5lU2jZ0L30:7@
+C`<0Pn`8j:Yk~2^NA?0`2;5M1?0`1V^0@0j3Yf~2^P00~2^0aC0`3X8eP00>SVM`00Pl@<jH`0
+~2Rl22?LQ?0`013hDh~3^\`70`2Q33H30>S\N0003km5lU2je0L30:4<=P<0Pn`8j=Eh~2^PH8
+0`2Q33H30>S6N000Pl@<PSg8C`<00GDl^PP80`2Q33H30>R[N000ogD<RdD<og1L^Q080`2Q33H3
+08?\2>R@N000^Sl80`2Q33H30>R1N000Pl@@3km5l^T50@00o88mb4l3005e=[Y420<0X@`f0`3X
+G7P00?me3;Y<20<0X@`f0`23k0SXAgP00;Y`20<0X@`f0`3X>7P008?438]538]0E>PnV000RdD<
+ad1L~4I\M5lP80J<1?0`3oM@b;3@a?0`2;5CAH0`2h00P008?\3>S9=`00Pl@DRDGljH42~2Rl3o
+M@`?_dD8D;Yd20<0XM1?0`23k0SX@WX00;WTC`<0RaG@C`<0I[P40>SBM000j8ef~2Pl@@3km5
+lU2jV0P30:7@C`<0Pn`8j0mj~2^NA?0`2;5M1?0`1V^0@0j9md~2^P00~2RdD<j8YF~2j4ef~2
+Pl@<jAd0~2o8?h0@n4lokooh?h0`n4L_oooh?h0WBSjj6=@03Y;@0008e00;WTC`<0^[`80`1V
+^0@0j4ed~2^P00~2RdD<j3QF~2j7mS~2j?Ie~2IX=mlP8?QG\0~2RdD<Rdgd>DQL3ha\~3PSg8
+C`<00@n5>`000;[@20<0X@`f0`3Xk7H00?me30noA@Q@^]P80`2Q33H308?\2>SBMP00^P\90`2Q
+33H30>S3MP00Pl@@RdD<j1Pi~2ReD<IX]52>R\2@00I\M5lP<0RdD<ad1L~4^B000`2;EOb;A@cX
+F3h006J9AOYVPggj3@n5J@000?me36Rl00<0R`dlF0<0IX]E28]5o8?\3>Q@;000Pl@D?04?QCT0
+~2RdD<og1L3km5252j40T30:7@C`<0Pn`8j:Qh~2^NA?0`2;5M1?0`1V^040j3Qc~2Pl@@jK@0
+~2jH<0~2SD00PSe10@<00@nD`8?P0H?0oa_0@0_03hAU~3IX=mnPl?QEX0~2Rdd<^R000`21`[@0
+~2RdGlj30=~2RDGlPggl00n59@000;WTC`<0^SP90`1V^0@0j<ab~2^P00~2RdD<j;MD~2j7Yd
+~2RaGL00<0^1Q?0`3XLYL00>\WJ<1?0`3oM@b;3@a?0`2;5CAH0`2h00P008?\3>Q3=@00Pl@D
+RDGljO3koon3a0c9`he005F;k87\T0000<L5J5<3~5I\L5X5030040^PaC0`2hi0430>QM1P00
+^UP90`2hD@000>P2=P00RDGlJP1Z08]=o;X0~3^0aC0`23k0cXkVl008?4588mO@43004?Q@h0
+~2I\L5[5L30040jB40~2PSeTD`<00GD?I\L5[5L3~3j@X0~2o6K71JaG0`0206STC`<0IX\=[5L3
+08]Eo;P`0@<0Pl0`Pn`<j5Q2~2J:`90`1XU0T306R82@<0^VP90`2Qd4l308?\2>SkMP00^NA?
+0`2;5M1?0`1V^040j8]a~2J0aC0`2j^0T30:7@C`<0Pn`8j=1f~2^NA?0`2;5M1?0`1V^040j61a
+~2Pl@`PSem0@<00GD<ahEloooo20X30>\:ahEloooo30X30?neO?oook[P2@<0XM1?0`23k0SX
+PWH00;WTC`<0RaG@C`<0I[P10>PBL@00J>A?0`2j40X30:7@C`<0Pn`8j5Mf~2^NA?0`2;5M1?
+0`1V^040j>M`~2^000~2Pn`4j:ZF~2Pl@4j1i`~2J81?0`1X=5P30;V4D`<0^S010`21`Y`0~2
+^3010`05T00008?\3>Sb5P00^B000`2j35<306JQQ5<30>SQ3`00Pl@\IX<mQ5<3008?QL00~2
+^Y1C0`2h800308?0E>SZ:P00IX<mT5<3~23hhk~3J0aC0`0?_`F@D`<0D;Xh2P<0XM1?0`23k0SX
+WGD00;WTC`<0RaG@C`<0I[P40>P]L000j>Qa~2Pl@@aPF4CP<00;V4CP<0^P000`2h800308?0
+N>Q[;000^HA>0`2j30030;PP00<0Pl1\j3`[~2^XA>0`2h800300F@~3j1P^~2^XA>0`2h8003
+00G0~3j6@`~2jD<0~2SD00I\L5T5<3~3aPF4CP<006K71NI>0`0106K71NA>0`000<L5l4h30040
+08371NQ>0`3oooooa`G\CP<0oooookX4D`<0^2000`05Q0000>SL;000^ZQG0`2h800308?0<>P:
+:@00ocDlF0<0^WP:0`2Qd4l308?\2>RNM000^NA?0`2;5M1?0`1V^040j2i_~2^AQ?0`1V^T00
+^3010`23`0cX=1H006R0C0<0I[T00KXHC`<0I[Q008?\3>PbC`00Pl@La`FXD0<0~4a`F\D0<0
+~4PSfQ0@<00G@J^Z0:0`2QZ5L30>S?D@002l1e1nUU~3Rl2=AH1@J:P:0`2;3JQG0`2j<04308?2
+N;P`0@<0Pl1\Pn`<j4W[oon3a1B8AO^2OO\13hDI~3^OP00`2jZ50308e5P>R?C`00jAD0~2Rl2i
+i4l30;Z`2P<0I[P10>QQKP00PcfXD0<000n4004008<m[503~23hCc~3RaFXD0<0XJQG0`3X=e40
+00_03hAQ~3ocF\D0<0ocFXD0<0^]`:0`2Qd4l308?\2>Q]L`00^NA?0`2;5M1?0`1V^080j?e]
+~2ocFXE`<0^P`;0`2Qd4l308?\2>Q1L`00^NA?0`2;5M1?0`1V^?ooj=5]~2Pl@LRaF\D0<0^2`;
+0`3X_U0000_0M63o=Ja@0`3o=JQ@0`2j=0\30:7@C`<0Pn`8j?Qb~2^NA?0`2;5M1?0`1V^080
+j8Q]~2J80;0`2jI0\30:7@C`<0Pn`8j<eb~2^NA?0`2;5M1?0`1V^?ooj5e]~2Pl@LjG80~2o;Z8
+2`<0XJQG0`3XAE0000_03hAJ~3ocFXE`<0^Y0;0`2Qd4l308?\2>R1LP00^NA?0`2;5M1?0`1V
+^080j15]~2J<`;0`2j\0\30:7@C`<0Pn`8j5Ib~2^NA?0`2;5M1?0`1V^?ooj>I\~2Pl@HJ;QG
+0`2i~20`2jQ4h30;P`0@<0Pl0lPn`<j6PI~2J;QG0`1X300308\=15<30;Z4CP<0^3010`23`1R3
+k0cX^aD00;VhE`<0^XA>0`2h<04308?0E>Q@6`00^KQG0`2jQ4h30;P`0@<0Pl1Pj<4L~2^KAG
+0`2j^5L30;P`0@<01H@0~2j?@I~2J;QG0`2;3CaH0`1VRaF\E`<0^?010`23k0cXQ@<00;VHD`<0
+^R23^>eV^001j7Hh~2a`D\F0<0ooooolL5:5P3~5a`ElD`<0~4a`G0C`<0~4RdGlj:j5~2Pl@d
+Pl@<bL>;`5F;k8?\38U528UE38]5289h1@4?Q3<0~2J?@;0`2je0\30:7@C`<0Pn`8j1Qa~2^NA?
+0`2;5M1?0`1V^0@0j:Q[~2j6=]~2Pl@<RdD<ad1D~4RdD<I\M0H040RdD<I\M0HP40RdD<ad1T
+oooooh]53<M0J?oooonj0@`308]528]02>SdS`002l1e;;T6~3^P@<0`2;A@cXIXX008]538\=
+13H308U8E8]53<I0F07YM@0008_0RdD8Re08RdD<j>Z?~2Rdd<^P`<0`2h~4j<1E~2PSg8C`<0
+0@n5=P000;X@30<0X@`f0`3Xh6d00?me3;XH30<0X@`f0`23k0SXbfd00;Xn30<0X@`f0`3X_6d0
+08?438]53>QAFP00RlR;A@b9B5B;A@b3N5@0MC7oM@bj@0`30:7@C`<0Pn`8j?]_~2^NA?0`2;
+5M1?0`1V^0@0j8]Z~2j4I\~2Pl@<RdD<PWQH0G@>RdD<j0YM~22\1d0^]BPSg8C`<00@n5=P00
+0;YP30<0X@`f0`3X?6d00?me3;YX30<0X@`f0`23k0SX9fd00;ZA30<0X@`f0`3X66d008?438]5
+3<I0F06;A@cX6VL008?43<W3o5F;k8?\F6J9A@R9E@`?_dD8D;ZD30<0SDGhPn`8j4i_~2ReD<
+SDGhj3=L~2RdD<j?mK~2Pl@<9Ol0~2Pl3o6l102l0?Q5D0~2ogD<3km5252jW0`30:7@C`<0Pn`8
+j0]_~2^NA?0`2;5M1?0`1V^0<0j9]Y~23km5252j_0`308e5]8?\2>SRKP00Rdd<I[Y@08e5]>Sc
+GP00Pl@LPSg8C`<00GDf^^@<0`2Q33H30>Q8K000ogD<^^`<0`2Q33H308?\2>PcK000^Q8=0`2Q
+33H30>PTK000Pl@<RdD<j;UH~2RlR;A@b9B5B;A@b3N5@0MC7oM@bj50d30:7@C`<0Pn`8j6=^
+~2^NA?0`2;5M1?0`1V^0@0j?=X~2j:iZ~2Pl@<ogD<3km5252j=0d30:7@C`<0Pn`8j2e^~2^NA?
+0`2;5M1?0`1V^040j;eX~2Pl@@Pl@<bL?lEH_\Pn`HRDD8IXUE38U=48]55<M0E000~2^U`=0`2h
+D@000>QC;000RDGd^V`=0`2hD@000>Q1;000RDGl^W`=0`2hD@000>P_;000RDGhRdD8PWP50@n5
+m`000;Z83@<0RdD8Rd08j=^<~22l0?QB\0~2RdDDaT1H0KT7~3^X`=0`2;AACX@XL008]558\=
+23H308U8E>V`~3o8]528]@28]55>S>S000PSdl00<00@n5@@0008]548?\1>SBFP00Pl@4Rm2;
+AOCXZH`006X0ogGhRdgl^P00~2RdGdPn`<j9UU~2RddDReGhRdGlj6]B~2Pl@DPSg8C`<00GDf
+^Y@=0`2Q33H30>R<JP00ogDD^Y`=0`2Q33H308?\2>QgJP00^\<=0`2Q33H30>QXJP00Pl@<ReDD
+IX]53>SUE`00RlR;AAB9B5CY]`00088m?003004?QGL0~2RdD@Pn`4j2aJ~2Pl@4Rm2;AACX0h`0
+088mb4l3004?QCH0~2^\P=0`2Q33H30>P;JP00ogDD^]0=0`2Q33H308?\2>SfJ@00^_L=0`2Q
+33H30>SWJ@00Pl@<ReDDIX]53>QTE`00RlR;AAB9B5CY=P0008e006PL3P<0^_`=0`2Qd4l308?\
+2>PQK000^NA?0`2;5M1?0`1V^0@0j;5V~2j6aX~2Pl@<RdDDPgQD07DaogDD^R`>0`2Qd4l308?\
+2>SWJ`00^NA?0`2;5M1?0`1V^0@0j7MV~2j39X~2Pl@<ogDD^T`>0`2Qd4l308?\2>RfJ`00^NA?
+0`2;5M1?0`1V^040j4IV~2Pl@<RdDDPWQH0G@>RdDDj<YH~22\1d0^]BPSg8C`<00@n5=P000;Yd
+3P<0X@`f0`3Xo6P00?me5;Yl3P<0X@`f0`23k0SXifP00;ZU3P<0X@`f0`3Xf6P008?438]55<I0
+F06;AACXfV8008]5o>R:O`00RdGhj89o~2RdGdj7Yo~2Pl@<bL?lEH_\PN`P0P00RDD8RED<RDd@
+RdD<aT040;ZX3P<0^440~2j5`Y~2RHGdoOooSHGhoOooD;Z`3P<0RdD8Pn`8j3m[~2Pl@<RHG\
+oOooPkg\oOoo0@n5T@0008f5n?goonQjC`00SHGhoOooj7>:~2RHG`oOooPkg`oOoo@0n?6000
+08fEn?gooh^5m?goonS_R@00jDX0~2Rl3o]O3moonj_0h30:7@C`<0Pn`8j6AZ~2^NA?0`2;5M1?
+0`1V^0<0j?AT~2^P00~2RdD@j=m6~2Pl@<^000~2jIX1~2Rl3Y300008e008^5m?goolH008e0
+08^5m?goonSQR@00RHG`oOooJ<1?0`3oMA2;3@a?0`2;5CAH0`2h00P008?\3>Q>9`00Pl@DRDGl
+Pggl00n5<P000;WTC`<0^^P>0`1V^0<0j6mT~2^P00~2RdD@j5Y6~2j:5C~2^000~2jA<1~2SD00
+^B000`2;EOb;AA3Xn2h006J3n?md1^V5~3o8]5o>QDR@00RlR;QO3mool3`HV5l?gooh>ml?go
+od1o4h]Eo8^5m?goonQER000jDP0~2okG`oOoo^PP?0`2Qd4l308?\2>Q4J@00^NA?0`2;5M1?
+0`1V^0<0j=AS~2^P00~2RdD@j;m5~2Pl@<^000~2jGX0~2Rl3Ykokoohe008^5m?goonS=R000
+PoQ0M4So]O3moonj=0l30:7@C`<0Pn`8j>AX~2^NA?0`2;5M1?0`1V^0<0j7AS~2^P00~2RdD@
+j5m5~2Pl@<^000~2jAX0~2Rl2;A@c6@0@1RdD<RhgdoOooRDP8RdGlj`23a0c9`he005F;k<J4
+9=cgool0PN``2000RDD8RED<RDd@RdD@I\M0H040RdD@I\M0HP40RdD@ad1Toooooh]54<M0J?oo
+oon;AA37@5`0~3RdD@j79B~2RlR;AA29B5B;AA23N5@03hDa~3ogD@^VP?0`2Qd4l308?\2>PH
+J000^NA?0`2;5M1?0`1V^0@0j:QR~2j6=T~2Pl@<aXGSmooo0?b2_N?gool13hC30@00RdD@RHGL
+moooRdQL@H^5g?OoohU8G8]=48fEo?gookP00P00j09I~2RHGhoOooPkghoOoo00n=@`0008]5
+48]0E?I0204?Q0L0~2jG81~2Rl2ii4l30;ZD3`<0I[P30>PUHP00^P00~2RdD@j114~2j5MA~2
+jDH1~2Rl36AO`0^R<0~2SHGloOooj:14~2RHGdoOooPkgdoOoo07@9RhGdoOooaP00SHGloOoo
+j?U;~2SHGloOooj?:6~22l1e1^Wa~3o8f5i?Oooe2=QNSioom@SHG\noooD;Zl3`<0SHGloOoo
+Pn`8j61W~2Pl@DRHG`oOooPkg`oOoo0g@V^NA?0`2jb0l306Jh0`3XLf4008fEo?gooh]54>QM
+@`00jI00~2PSg8C`<00GE>^_`?0`2Q33H30>PdI000SHGTmoooD8f5j?Wooe2=QNckoom@RdD@
+og1L^P@@0`2Q33H308?\2>P7I000^Sh@0`2Q33H30>ShH`00Pl@HReD8SHG\noooj?]3~22l1e
+9h]E38f5j?WoonSY@`002l1e5HfEi?Oooh]55>ROQ@00aXGSmooo0NTco_ooSD00RdD@j0`V~2
+RXGSmoooj`23a0c9`he005F;k8?\56J9A@R9E@b9CA1X`4l30?me38\=34l308\E=5P30;P02000
+Pn`<j3\S~2Pl@DRDGlo8=mo00?QHP0~2RdD<Rd1DmT080@n4CP000?le>0030;Y040<0XM1?0`23
+k0SXXVD00;WTC`<0RaG@C`<0I[P40>PbH000^P00~2RdD<j1e2~2j6A?~2j=]Q~2Pl@<jBd0~2
+SD00^NA?0`2jI10306Jh103XoEl00;X0~3RdD<j>Q1~2j2m?~2j:IQ~2Rdd@ReGlRdD<j90Z~2
+IXU5nVJ3O@P23hC9~33km5n^UL~33km5nV_03?n`80030;Z040<0XM1?0`23k0SXoF@00;WTC`<0
+RaG@C`<0I[P40>R=G`00ReGlRdD<j7Y1~2j3eQ~2Pl@<jGD0~2o>U_~3SD00jFL0~2SD002l1d
+X8?h0GBKPoP3M9J3n0AdTH?h1GB<PoP6M8N3n0MdPX?h2@n4NOoooh?h2Pn4L?oooh?h2`n4Iooo
+oh?h30n4G_oooh?h3@n4EOoooh?h3Pn4C?oooh?h40n4@oooon^=o0noAO[Yo`4008e00>VO0P00
+SD00RdD@3km=nV_9389l20@1MDJ;AA0?_dgjJlT<oc@8^Z`@0`2Qd4l308?\2>PHI000^NA?0`2;
+5M1?0`1V^0@0j:QN~2ReGlRdD<j9E0~2j5QP~2Pl@<J3aH0`2;AA0?_dgjJlT<0l5@IX\=Q5<3
+08]E38]5o8?\3>SR7`00Pl@DjD82~2Rl2;CA0?_dGjJl0<0lR;EOb;A@cXbB800>Wh0@00RdD@
+3km=nV_9389l20@1MDJ;AA0?_dgjJlT<oc@8^\@@0`2Qd4l308?\2>QdH`00^NA?0`2;5M1?0`1V
+^0@0j0AN~2ReGlRdD<j?4o~2j;AO~2Pl@<Rdd@3km5nV_030?8ReGlRdD<j5H`~2jHD1~2o8]=
+38]E40noAOY[`0`3d8]5o>P1n?ooRDGlPggl07DU^NA?0`2jg10306Jh103XXEd00;X0~3RdD<
+j8`o~2j4mO~2jF41~2Rl2;AA0?_dgjJlT<oc@8^_`@0`2Qd4l308?\2>S5HP00^NA?0`2;5M1?
+0`1V^080j5EM~2ReGlRdD<j48o~2Pl@<jO80~2Rl3Yj`0008e006Q04@<0^R0A0`2Qd4l308?\
+2>QmHP00^NA?0`2;5M1?0`1V^0@0j0eM~2j<QN~2Pl@<jK00~2jJ\0~2SD00PoSo3hCkoOooPoP2
+3hCjoOooPoP53hAio_ooPoP43hB<o_ooPoP73hB3o_ooPoP93hAjo_ooPoP:3hAao_ooPoP;3hAX
+o_ooPoP<3hAOo_ooPoP@3hAFo_ooPoP?3hC1o_oo2l0?Q0Gooon3n04?Q?cnoon3n0d?Q3_ooon3
+n0h?Q3;ooon3n0P?Q2Wooon3n0<?Q23ooon3n0H?Q1OooooY6_oooh_0J<1?0`3oM@b;3@a?0`2;
+5CAH0`2h00P008?\3>S[7P00Pl@DRDGljJckoon3a0c9`he005F;k8?\76J9A@R9E@b9CA37AO@0
+~3o8=mm08?SCh2~2J<1?0`3oM@b;3@a?0`2;5CAH0`2h00P008?\3>RE7P00Pl@DRDGlPggl00n5
+1@000>T80P00RddDReGlRdD<j6hV~23ko0RDGhPggh0`n5jP0006J3O@P23h@j~3RdDDRdghJlT<
+oc@8^U0A0`2Qd4l308?\2>SIH000^NA?0`2;5M1?0`1V^0@0j6UK~2j2AM~2Pl@<RddDRdGhJl0<
+0lR;EOb;A@cXabd008]548?0L52jP14308]558]=n6_938]420R3k0SXlV0008?438U5l8=ml05e
+3X]548=hL01l1NU>~3RdDDRdghJlT<oc@8^X@A0`2Qd4l308?\2>Q>H000^NA?0`2;5M1?0`1V
+^0<0j=iJ~2ReGlRdD<j<\l~2Pl@<RdDDRdghJlT<aT@8103Ym@000?b3OOP63hGR~3IX=m208?
+Q3X0~2RdDDRdghJlT<oc@8^ZPA0`2Qd4l308?\2>SUG`00^NA?0`2;5M1?0`1V^0@0j7EJ~2j31L
+~2Pl@<RddDRdGhJl0<0lR;EOb;A@cXdb`008]548?0M52jf14308]558]=n6_938]420R3k0SX
+oUl008?438U5l8=ml04?Q4h0~2RdDDRdghJlT<oc@8^]`A0`2Qd4l308?\2>QTG`00^NA?0`2;
+5M1?0`1V^0<0j?AI~2ReGlRdD<j>4k~2Pl@<RdDDRdghJlT<aT@8103Y2`0008e00>T?~3SD00
+RdGd@8U5m>VhoOooPl@<bL>=@01ERnb3k0b9A@R9E@b9CA2;A@R2N0D13hDd~3RdD@I\L00@2;
+AAC7~5RdDHa`00~3^NA?0`2j018306Jh0@3XJeT00>Uk~3Rl2;A@b2N0D1MC>;AA1Va`0308]5
+5<L0~4RdDHa`00~3^NA?0`2j;18306Jh0@3X;UT00>Tn~3o8]546K70080^5LB0`3X`T8008_8
+RdDDR@RhFQ830>Ra@P00RlR;AAR92;WTC`<0^U`B0`1V^040j>]H~2Pl@<bL>;`5F;k87\R000
+08U526J9E@b9CA2;A@R2N0D13hF4~3RdD8Re08SDF8j7im~2SDf8^XPB0`2h~4j5A3~2Rdd@IX]E
+38e5R>Pm<@009Ol0~2RDF4Pgf400nD`2Go~32l0?Q380~2SDF8D;Z<4P<0XM1?0`23k0SX_ed0
+0;WTC`<0RaG@C`<0I[P40>Q?F000j0YJ~2Pl@<jMH0~2Rl22?MP00`01MB>j35<308e5R>SbO000
+RaGL00<0RdD@j>Al~2jJ\0~2SD003kl5Q5<30>V4~3^@l0~2^[@B0`2=AHSX4WL00;U1~3^\@B
+0`2;AA3X07L00>Uc~3SD00^@l0~2^PPC0`2=AHSXiWH00;U1~3^QPC0`2;AA3Xe7H00>]:Rl2i
+3`000;YL4`<0SDF8j;if~2^D40~2^V`C0`2;AA3X[7H00>\RRl3Y6`0008e008?h0@n4Looooh?h
+0gBJPoP2M;g[^he008e5R52j\1<30:7@C`<0Pn`8j;9L~2^NA?0`2;5M1?0`1V^040j49G~2ogD@
+^]PC0`2Qd4l308?\2>R9G000^NA?0`2;5M1?0`1V^040j1UG~2RdD@Pl0PD;X450<0XM1?0`23
+k0SXG5`00;WTC`<0RaG@C`<0I[P10>S\EP00Pl@TPl@<bL=ERnb3k2B9A@R9E@b9CA2;EAB;A@SX
+NQ`006J9AOiVPggno`n44`0008]566J;COiVRDQRjNP0~2SD00^S0D0`2;AA3XVcT000_03hAc
+~3ogD@^SPD0`2Qd4l308?\2>SJF`00^NA?0`2;5M1?0`1V^080j6YF~2^NA?0`2jL1@306JhoooX
+EeH008?438]566J3N6003hD>~3adGh0@000>T9~3Rl37AOP1~3RdghRdDHIXU8H^UO~3Rl2j[1@3
+08]54>PC>@002l1e7h]536J3N6;oM1F;A@aVRdQRRdDHIXU8H^T_~3Rl2;AAQVPgQP00n53P00
+0<M5m040~2j@T0~2Rl37AO@1~3RdgdRdDHIXU8HX]560no@6;Y8`4008e008]558]=60noBF;o
+=8Rj]1@30:7@C`<0Pn`8j?5J~2^NA?0`2;5M1?0`1V^080j85E~2^NA?0`2jj1@306JhoooXKUD0
+08?438]566J3N600M@W7AO01~3j`O7AO01~3Rdg`RdDHIXU8H^W>~3Rl3Ya`0008e008]558]=
+60noBF;o=8Rj81D30:7@C`<0Pn`8j7EJ~2^NA?0`2;5M1?0`1V^080j0EE~2^NA?0`2jE1D306Jh
+oooXlU@008?438]566J3N600M@W7AN`1~3j`O7AN`1~3Rdg\RdDHIXU8H^UB~3Rl2;AAQVPgQP
+07D:adGX0@000>\8o<M5j040~2RdgXRdDHIXU8H^\Yo>TS~3SD00PoP23hCGo_ooPoP13hA2oooo
+PoP33hA1oooojk>=@02;AAQVPgQRog@fRdDDRddH3km9H_ldR;Z<5@<0XM1?0`23k0SXYeT00;WT
+C`<0RaG@C`<0I[P10>PgE000Pl@<Pl@<bL>=@01ERnb3k129A@R9E@b;A@R2N0D13hDW~3RdD8
+Re08RdD<j<eh~2Rdd<^[@E0`2h~4j:<n~2\07YR0000<M5o000~2^;PE0`23n01d>kS85@<0j35^
+~2RDGlPggl00n4900008]5o>STN0002l0?QQ@0~2ReGlRdD<j75h~2\07Y?P0008_0Pggl07Db
+^=PE0`23n01d:;ST5@<0j:I5~22\1d6[T;~3^_0E0`2;A@cXS7800;01j@D0~2o;00j`23a0c9
+`he005F;k8?\48U528UE38U=48]E48]52>Qn6P00IXU5oVJ3OOko3h@C~3RdDDIX]=oVJ9B63Y
+;00008e008]536J3N63oM1J;A@aVRdQPRdDDIXU8H>T<~3SD00RdDDI\M0H000RdDD3km0H>]2
+Rl3[BX_0RdDD3km0H52jo1D30:7@C`<0Pn`8j2YH~2^NA?0`2;5M1?0`1V^0@0j;YB~2j7ED~2
+Pl@<j@d0~2o0_0M;b3n05d]n^io8]548]=50noBF3o=8Rj81H30:7@C`<0Pn`8j=eG~2^NA?0`2;
+5M1?0`1V^040j6eB~2Pl@<Pl@<bL?lEH_\Pn`DRDD8RED<RDd@RdD8PWP50@n4G000088mb4l3
+004?QBd0~2^TPF0`2Q33H30>PHE@00^U0F0`2Q33H30>P9E@00^X0F0`2Q33H30>SjE000RdD<
+IX=hH01e3<M5o000~2j@L0~2adGl80000>UK~3adGlooooohe5o52jPQH308]528]028?\2>RF
+E`00Pl@<RDGhPggh0@n57P0008=mo00?S1@0~2PGglo`0000n?1`000>TA~3Rl2hR1H30>R21P00
+j55C~2RdglPN7o~3RdD@R0R;A@aVPgQR0WDiRdd@<l2:0E2;CA0c`8X1D;Zh5P<0XM1?0`23k0SX
+\eH00;WTC`<0RaG@C`<0I[P10>Q3D@00Pl@@Pl@<bL>=@01ERnb3k129A@R9E@b9CA2;EA2;A@SX
+JQT008U5o8=mo?l?Q140~2RdD@RdglRDQTjBT0~2SD00RdD<PgQTog@CRdD<RdQTRdD@RDQTj@`0
+~2Rl2;AA37@6CoooooRdD@PgQTogD5jAL1~2RdD@IX=hHP<?QEh0~2RdD@PgQTo`n<5@0008]5
+48=hI?l?S`P0~2jCL0~2SD00RdD@og1T^^PF0`2Qd4l308?\2>SPE@00^NA?0`2;5M1?0`1V^0@0
+j71@~2j2]B~2Pl@<jFL0~2SD00RdD@IX=hHP8?QEH0~2RdD@PgQTo`n<5@0008]548=hI?l?S`P0
+~2jCL0~2SD00RdD@og1T^QPG0`2Qd4l308?\2>QdE@00^NA?0`2;5M1?0`1V^0@0j0A@~2j;mA
+~2Pl@<RdD@IX=hHP9d3X]546J3N683M0C[<H_0RdD@og1T^T`G0`2Qd4l308?\2>PXE@00^NA?
+0`2;5M1?0`1V^040j;Q?~2Pl@<Pl@<bL=ERnb3k129A@R9E@b9CA2;A@SXOAT008U5o85mo040
+080?Q140~2RdD@RdglRDQ\jBd0~2SD00RdD<PGQ\0@00P7@DRdD<RdQ\RdD@RDQ\j@d0~2SD00
+RdD@ad1\0@00P8]5485hK040081d>h]548]0K8?\1>P@=P00Pl@4D;Yd5`<0XM1?0`23k0SXNU@0
+0;WTC`<0RaG@C`<0I[P10>P:C`00Pl@<Pl@<bL>;`5F;k8?\7:4\F0<0mm2S;5P30:70C`<00`El
+D`<0XgaC0`1X80030;V4CP<0^PaC0`1VXHAC0`23k0cXYO;ooh?4488mj@43004?QA\0~2X@@f
+0`0i1F1C0`0?Q0X0~2^0aC0`3XhQ<0088mm@43005d4H8m?003005d2>Ve~3SD00X@Pf0`0i1@aH
+0`0?Q:40~2aTGo06J3?AYH0`023hF5~3XBQH0`2ImcdLF0<02m8?Q740~2XAaH0`031BQH0`18
+RDGdRdGdVOLm75P308U5m:4LF0<03jm5m8U5n8]5n2\5:5P308U5n<M5l000~2Rl2;AOPiAO1m
+:;VhE`<0^[AG0`2h0@000>PPD000XBQH0`10XbQH0`2;AO10RDG`jm36AOl1^;QG0`3X5Q<00?le
+O5<30;ZL5`<0XM1?0`23k0SX3U<00;WTC`<0RaG@C`<0I[P10>RNC@003kl5X503052ja1L30:7@
+C`<0Pn`8j>1B~2^NA?0`2;5M1?0`1V^040j71=~2Pl@HPSe800<00@n5m0000:4XF0<0>@GdCP<0
+3hDg~3ocDXF0<0^^`G0`2Qd4l308?\2>RCDP00^NA?0`2;5M1?0`1V^040j2==~2Pl@<jJX0~2
+SD00ocDXF0<0^QPH0`2Qd4l308?\2>QLDP00^NA?0`2;5M1?0`1V^040j>a<~2Pl@<PWgo0@n5
+?`0003?0X;AG0`1@<l2P]5L3052j@1P30:7@C`<0Pn`8j1UB~2^NA?0`2;5M1?0`1V^080j:U<
+~2Pl@@jC00~2o?lem4h30;Y`60<0XM1?0`23k0SXi5400;WTC`<0RaG@C`<0I[P20>QdC000Pl@<
+jBl0~2ocDXF0<0^Z0H0`2Qd4l308?\2>R`D@00^NA?0`2;5M1?0`1V^040j41<~2Pl@<PSe\00<0
+0@n5Z0000:4\F0<0>@GhCP<03hDg~3ocD\F0<0^]PH0`2Qd4l308?\2>QSD@00^NA?0`2;5M1?
+0`1V^040j?=;~2Pl@<jEh0~2SD00ocD\F0<0^PPI0`2Qd4l308?\2>P\D@00^NA?0`2;5M1?0`1V
+^040j;a;~2ocGhCP<0^S@I0`2Qd4l308?\2>P0D@00^NA?0`2;5M1?0`1V^080j91;~2Pl@HjBl0
+~2ocD\F0<0^V0I0`2Qd4l308?\2>S<D000^NA?0`2;5M1?0`1V^040j5a;~2Pl@<PSd@F0<00G@F
+PCdTF0<00@00P7@:^;QG0`3X_TH0088mI@43005e5j4<=P<0>@DhD0<0M0Zhi4l30>QV4000Pl@<
+bL?lEH_\Pn`8RDD8J=`I0`1Xa1T306Rh6@<0^YPI0`2Q33H308?\2>SFC@00ogD8^^PI0`2Q33H3
+08?\2>S1C@00^_PI0`2Q33H30>RbC@00^S@J0`2Q33H30>RSC@00ocD`0@<0J5XJ0`2jD1X30:4<
+=P<0Pn`8j8I=~2J7`J0`3o=C`10`1XMaX30;YP6P<0X@`f0`23k0SXI4d006S=6P<0J<`J0`3o
+=A000`1XbQX306S96P<0J<PJ0`3o=@`00`1Xa1X30?leB04306Rn6P<0^X0J0`2Q33H308?\2>PM
+C@00ocED0@<0J=XJ0`2jd1X30:4<=P<0Pn`8j01=~2J?`J0`3o=JP10`1XmaX30;[P6P<0X@`f
+0`23k0SXgT`006PL6`<0ocEP0@<0J1TK0`2j01\30:4<=P<0Pn`8j;a<~2J6@K0`3o=F`10`1X
+H1\30;XP6`<0X@`f0`23k0SXVT`00?leN04306Qb6`<0^VPK0`2Q33H308?\2>QmC000J9`K0`3o
+=K@10`1XV1\30;Yh6`<0X@`f0`23k0SXFd`006Rh6`<0ocF40@<0J;<K0`2jX1\30:4<=P<0Pn`8
+j3U<~2J=@K0`3o=I010`1Xd1\30;Zl6`<0X@`f0`23k0SX5d`00874304006Sd6`<0ocFL0@<0
+J>lK0`2jf1\30:4<=P<0Pn`8j>m;~2ocG00@<0J08L0`2jn1\30:4<=P<0Pn`8j=9;~2ocG<0@<0
+J1<L0`2j21`30:4<=P<0Pn`8j;E;~2I\L50E<300@0j7]:~2Pl@dPl@8bL>=@01ERnb3k0b9A@R9
+E@aVa`D1D`<00@37AO`04000RdGlj9QU~2Xm1?0`23?M1?0`003hDV~3ogGl^QPL0`2Q33H308?\
+2>QAB`00I\L50E<300@0j1M:~2Pl@<PSg8C`<00GDg^T`L0`2Q33H30>PXB`00RdGlD;YD70<0
+X@`f0`23k0SX4T\00;Z570<0X@`f0`3X0d\008?43;Z870<0^008~2j<d;~2X`a?0`2jU1`30;P0
+2000j;T;~2Xha?0`1Xl04306ST0@<0J3010`1XY1`30;VP70<0ReD<RdD8Pn`<j3To~2Pl@LPSeI
+0@<00GD:^:PL0`3XVocooh8m=@43005e<h8mI@43004?U<23h063`?lK`40;`0n44@000<H5I@43
+00771FP10`00~3aPG8C`<00H8mj@43004?U<23h063`?lK`40;`7@:^;PL0`3X?_coonSIe?oo
+j;c4oooX@oSoonSnB000^000~2j`^=@02h~4j`7lPl@8bL<0~2EH_\PN`H0P00RDD8IXUE38U=
+4;T1~3^^0L0`2=QOcmoooX66H008f5o?gooe2=QO[moom@^^@L0`2;A@R3k0SXYT`008?448V5
+m?gooh>mm?goo`9m?X]55?l`^_@L0`2Qd4l308?\2>PAC000^NA?0`2;5M1?0`1V^0@0j:56~2
+ReD8RdDHj8hX~2j558~2Pl@<SHGloOooj:L`~2IX]536HiQO[moome6XfEo?gooh]54>SlJP00
+2l1e2;01j@D0~2o;00j`23a0c9`he005F;k8?\38U528UE38]5289h104?Q6\0~2^1@M0`3XfBl0
+08_8RdD<R@Rii4l30;XL7@<0I[P10>PCAP00^NA?0`2jC1d306Jh0P3X04H006RH7@<0^W@M0`2Q
+d4l308?\2>Q5B`00^NA?0`2;5M1?0`1V^?ooj=E5~2Pl@<jD40~2o8]528]02>Q];`00RlR;A@b9
+28]53?l`^Z0M0`2Qd4l308?\2>SoBP00^NA?0`2;5M1?0`1V^040j8m5~2Pl@<Pl@<bL>=@01E
+Rnb3k129A@R9E@b;A@aVa`0008]5289h104?Q1\0~2^NA?0`2jb1d306Jh0@3XD4D00>V?~3SD00
+ogD<^_PM0`2;A@R;@0R3k0SXnTX008?438U5o8=mo05d>X]52?m`28]52?l`^_`M0`2Qd4l308?\
+2>QUBP00^NA?0`2;5M1?0`1V^0<0j?E4~2Pl@@jC40~2o8]530no052j91h30:7@C`<0Pn`8j2m:
+~2^NA?0`2;5M1?0`1V^040j;m4~2Pl@<Pl@<bL>=@01ERnb3k129A@R9E@b9CA2;AA1Vad1Roon;
+A@R2N0@13h@K~3^NA?0`2jC1h306Jh0@3XO4@00>WC~3SD00JP1V^@00RdD8Re08RdD<Pn`<j3dA
+~2Pl@@IXU5oPnoAOkYQ@000?b;A@`?_dgnocB8^W`N0`2Qd4l308?\2>R<B@00^NA?0`2;5M1?
+0`1V^040j1a4~2Pl@<RdD@IX]=oVJ9B6;YH@000?b;A@SoL0R;A@So<;ZT7P<0XM1?0`23k0SX
+AdT00;WTC`<0RaG@C`<0I[P30>SG@`00Pl@@jbZ;`>TS~3SD00PoP23hAcooooPoP13hAZoooo
+PoP33hAQoooojj>=@03[0X_0Pl@<bL>=@01ERnb3k129A@R9E@b9CA2;AA1Vad1Poon;A@R2N0@1
+3h@K~3^NA?0`2ja1h306Jh0@3XI4<00>W7~3SD00JP1V^@00RdD8Re08RdD<Pn`<j2D@~2Pl@@
+IXU5oPnoAOkYQ@000?b;A@`?_dgnocB8^_PN0`2Qd4l308?\2>QdB000^NA?0`2;5M1?0`1V^040
+j0A3~2Pl@<RdD@IX]=oVJ9B63YE@000?b;A@SoL0R;A@So<;XP7`<0XM1?0`23k0SX;dP00;WT
+C`<0RaG@C`<0I[P30>Ro@P00Pl@@jaj;`>TG~3SD002l0?Q7Cooon3n04?Q6_oooo[[Oc[0X_0
+Pl@<bL>=@01ERnb3k0b9A@R9E@b;A@R2N0@13hA[~3^40O0`3X6B`008_8RdD<R@Rii4l30;Y8
+7`<0I[P10>QC@P00^NA?0`2jN1l306Jh0P3X@48006S87`<0^Z@O0`2Qd4l308?\2>R5A`00^NA?
+0`2;5M1?0`1V^?ooj1E2~2Pl@<jD40~2o8]528]02>R]:`00RlR;A@b928]53?l`^]0O0`2Qd4l3
+08?\2>PoA`00^NA?0`2;5M1?0`1V^040j<m1~2Pl@<Pl@<bL>=@01ERnb1k1`4~2RDD8RED<RdD<
+ad1Toooooh]53<M0J?oooon;A@R2N0@13h@\~3^NA?0`2jn1l306Jh0@3XPD400;WTC`<0^RPP
+0`1V^040j6i1~2jOd1~2o8f5m?_ooe2=QOSmoom@^UPP0`2;A@R;@0R3k0SX3dL008?448U5o8]5
+o>Vi0@00o8]538?0J52jH20308f5m?_ooh?\2>SVAP00Pl@<RHG`noooPkg`nooo0GDHRdD<PgQX
+07`?RdD<PGQXool007l3jdGlRdD<ad1Xoooooh]52?m`28]52?l`^V@P0`2Qd4l308?\2>PYAP00
+^NA?0`2;5M1?0`1V^0<0j;U0~2Pl@@jC00~2o8]53?m`J;Z@80<0XM1?0`23k0SXm4D00;WTC`<0
+RaG@C`<0I[P10>R4@000Pl@<jA01~2RdD<Pl1TD;Zh80<0SHGhoOooPn`8j2Y6~2Pl@<RHG`nooo
+Pkg`nooo0GDHRdD<PgQT07`?RdD<PGQTool007l3jdGlRdD<ad1Toooooh]52?m`28]52?l`^[`P
+0`2Qd4l308?\2>Q]A@00^NA?0`2;5M1?0`1V^0<0j?do~2Pl@@jC00~2o8]53?m`I;[X80<0XM1?
+0`23k0SX>4D00;WTC`<0RaG@C`<0I[P10>S8?`00Pl@<jE@0~2RdD8og08RdD8oc2j42430:7@
+C`<0Pn`8j?m4~2^NA?0`2;5M1?0`1V^0<0j8lo~2Pl@@jaj;`>TG~3SD00PoP23h@oo_ooPoP1
+3hCbo_oojjb3a0c9`he005F;k8?\48U528UE38]53<M0K040082;A@R2N0@13h@I~3^NA?0`2j
+>24306Jh0@3X;Sl00>VE~3o8]528]02>QE4P00RDGlPGgl0@00P7A9RdD<RdglRDQ\RdD<Rd1\
+Pn`4j=HU~2Pl@4D;YX8@<0XM1?0`23k0SX@4@00;WTC`<0RaG@C`<0I[P10>S@?P00Pl@<jC@0
+~2RdD8og08RdD8oc2jT2430:7@C`<0Pn`8j0M4~2^NA?0`2;5M1?0`1V^0<0j9Ln~2Pl@@Pl@<
+bL>=@01ERnb3k1B9A@R9E@aVRDd@RdDHa`00~3^[0Q0`2h0@800>P\0P00RDGlIX=m408?QGh0
+~2ogGl^\@Q0`2;A@R3k0SX2d@008?438U5n8=mn04?QAL0~2RdGlj=LW~2RlR;AAR92>U1~3SD00
+RdDDoc2jd2430:7@C`<0Pn`8j653~2^NA?0`2;5M1?0`1V^0@0j?4m~2ReD8RdD<j=hO~2j:4o
+~2Pl@<jGL0~2o?meo;[d8@<0RdD8Pn`8j8e3~2Pl@<RDGhPggh0@n55@0008]5o>QI9`00RlR;
+AAR92>To~3o8]55?l`^P@R0`2Qd4l308?\2>SU@P00^NA?0`2;5M1?0`1V^0@0j7Dm~2ReD8RdD<
+j68O~2j2Do~2Pl@<RdDHR`3XO2L008]55<I0106;AOcX0EL008?43<W3EH_\Pn`DDh?\38U528UE
+38U=4?b;CAB;EA2;A@SX`S<008U5n8]548]=2<I42?l0Pggh00n=2P000;P0~3jL00~2RdDHRDG\
+RaR;AA3X668008_;0lR;ANb92;X:~3RdD@j88R~2RDGlPggl07@=RdGlaP00j@h0~2Rl2;AA2;
+G@Q;0l>9AOb;AAB9AO2;F5a3RdG`REQLPgd<07@:RdD<PSP0M0;[4>U;~3SD00jC\0~2SD00RdD<
+j:QQ~2RDGdIX]=m0nobH]E38]54>So80002l0?QA<0~2RdD@Regd0l>9AA3Y2`0008e00>TKoooo
+SD00RdD@j`>=@023a0aKbL<005F;k8?\58U528UE38]528U5o8]5o>PZF@00RDGhPggh07DmogD<
+RdGlD;Y\8P<0XM1?0`23k0SXF4400;WTC`<0RaG@C`<0I[P40>SX>`00j:<m~2Pl@@jDX0~2SD00
+PSg8C`<00@n5>P000;ZH8P<0X@`f0`3XZ3h00?me38]5o52jX2830:4<=P<0Pn`8j8ln~2^]DR
+0`2Q33H30>R0?P00Pl@@RdGhj`23a0c9`he005F;k8?\58U528UE38U=48]54<I0102;AA37@0P0
+~3^]PR0`2h0@800>PMooooRDGlogGl^^`R0`2;A@b3k0SX1d4008?438U5n8=mn04?QC<0~2ogGl
+^_PR0`2Qd4l308?\2>Qf@000^NA?0`2;5M1?0`1V^040j0Hk~2Pl@<jC\0~2Rl2;AA3o<;XL8`<0
+XM1?0`23k0SX@D000;WTC`<0RaG@C`<0I[P30>SA>P00ReD<RdD8j;hL~2Pl@<RdGlj7=D~2Pl@<
+bL>;`5F;k8?\48U528]528=hE00?Q4T0~2RdD8Rd1Dj2M6~2RDGlPggl00n4<@000?me2;Y08`<0
+XM1?0`23k0SXcCl00;WTC`<0RaG@C`<0I[P30>QM>P00j9`Y~2Pl@<Pl@<bL=ERnb3k0b9A@R9
+E@b;A@R2N0D13hA3~3PSg8C`<00@n5;@000;YH8`<0X@`f0`3X1cd00;YP8`<0X@`f0`3Xn3`0
+0;ZF8`<0X@`f0`3XjC`006JhoooY:04006X0I[T108]528]@28]538?\3>Rm1P00Pl@@IXU5oPno
+AOkYV@000?b;A@`?_dgnocB8^YPS0`2Qd4l308?\2>P<?`00XM1?0`3XT^kooh?43>V6~3Rl3Y
+O`0008e008]530noCOko=8Rjc2<30:7@C`<0Pn`8j=@n~2XM1?0`3XF^kooh?43>U>~3Rl3[BX_0
+RdD8og08^P0T0`2Qd4l308?\2>RT?P00XM1?0`3X:^kooh?43>TN~3Rl23n08?Q5oooon3n05d
+RX?h0gB=2l1d^N^kSD00PSg8C`<00GDm^Q@T0`2Q33H30>S\>`00RdD<3km=o_ldR;XL90<0X@`f
+0`23k0SXd3\00;Y<90<0X@`f0`3X`C\008?436J;AOk[08?42<W3SD00EH_\Pn`<RDD8RED<RdD8
+PWP50@n4@`00088mb4l3004?QBd0~2^U0T0`2Q33H30>Qk>`00^UPT0`2Q33H30>Q\>`00^XXT
+0`2Q33H30>QM>`00I[SoonV\~3JP1V^@40RdD8Re08RdD<Pn`<j345~2Pl@@IXU5oPnoAOk[<>\j
+Rl2;A@SoL0RjS2@30:7@C`<0Pn`8j8@m~2XM1?0`3X2^gooh?43>T>~3Rl0;`7C<PoP1M<O[bOb2
+?LQ?0`01MCfjX2@30:4<=P<0j=`j~2RdD<3km=o_ldR;ZX90<0X@`f0`23k0SX`3X00;[D90<0
+X@`f0`3X\CX008?436J;AOk[08?42<W3SD00EH_\Pn`@RDD8RED<RdD8PWP50@n4A`00088mb4l3
+004?QBd0~2^]PT0`2Q33H30>Q[>P00^^0T0`2Q33H30>QL>P00^QdU0`2Q33H30>Q=>P00^?oo
+oooY<`4008e00<M5o?oooon=AOa@^R0U0`2;A@R;@0R3k0SXoS`008?438U5n8=mn05d9H]52?m`
+2;XT9@<0XM1?0`23k0SXKS`00:7@C`<0j?C[oon3a0b;A@aVPgQR0gE7Pgglo`n<4@0008=mo?l?
+S`L0~2jBP0~2Rl3oMOaZof[o^T`U0`2Qd4l308?\2>PS?000XM1?0`3XZN_ooh?45>U;~3o8]5
+36J3N682MD23OOco3h`@~3Pgglo`n?1P000>TW~3o?meo6[oJ_njQ2D30:7@C`<0Pn`8j=<k~2
+XM1?0`3XFN_ooh?4588mb4l3005e=[Zl9@<0X@`f0`3X?ST00?meo;[49@<0X@`f0`23k0SX:CT0
+0;X49P<0X@`f0`3X6ST008?438]5o>\2Rl23a0S9`he005F;k8?\38U528]5289h1@4?Q4H0~2
+PSg8C`<00@n5;@000;X89P<0X@`f0`3XeSP00;X@9P<0X@`f0`3XacP00;Y<9P<0X@`f0`3X^3P0
+0;P1~2P>Ub~3Rl2;A@R3N0P0M0n;A@R;@0R2>01d1>\BRl2=AOcXL5\00>U3~3SD00RdD8Rd08
+j<D8~2RDGlPGgl0@00P0n59@0008]52?m`2;Y@9P<0XM1?0`23k0SX`CX00:7@C`<0j4OZoon3
+a0b;AOc[0he008?42<W3SD00EH_\Pn`8Dh?\38U528UE38U=48=m300?Q1<0~2RdD<PSP03h@7
+~3j@h0~2Rl1V^?oojEL1~2SD00I\M5n_ooI\M5n000RdD@3km=n6_938<l200?Q=00~2RdD@3km=
+n6_938\42>P2FP00RDGlRdglReD<RdD@3kmMn6_K38\46>QC6@002l0?QH\0~2PSg8C`<00@n5
+@0000;Yh9P<0X@`f0`3XQcL008]540noCOQ[b@co=0RjP2H30:4<=P<0Pn`8j6Pg~2^Z\V0`2Q
+33H30>QI=`00Pl@<IX=mnP1m3fJ;AOQVRDGjjBX0~2Rl2ii4l30;Z`9P<0I[P30>Q1=000ReD<
+RdD8j2hF~2I[SoonUe~3o6J;AOQV@6J9AOSY7OooooaVPggj07eAPSg8C`<00@n5=P000;[<9P<0
+X@`f0`3XiCH00?me3;[D9P<0X@`f0`23k0SXd3H00;X79`<0X@`f0`3X`CH008?436Jhooo[5>T?
+~3SD00IX]5n^T3~3SD00Pl@<FlW3Rl1ERnb3k0QVRDD8RED<RDd@I\M5oP00Rl1VRdD8IS]5oPn6
+IP0003?0IX]5oXU5n6K7AO`008e006J;AOaVPoP8LbkfAOP13h@@~3RdGhdNPcA@b9AOSY2000
+08]5n=7XRDGhIX]5o6I0IXU5o>_8RdD@<lUVRdgnReGhRAB8IX]5oVI0IXU5o^^=o<W3Rl1ERnb3
+k0aCPn`<RDD8RED<IXU=48=m300?Q180~2RdD<PSP03h@6~3j@d0~2o6Jho_oYj`0008e008]5
+3>P4F000RDGhI\M5m_ooI\M5oP00o8]520noCOj3?8P03hBg~3IX=m400?QA80~2RdD83km=oX\4
+R>S9E`00RDGhIX=m501e@h]=n8]E38]520noGOj;19SX5QL000_03hDP~3IX=mm_l?Q@l0~2IX]5
+oVJ9AOKY200008_0I\M5m_kojCl0~2o8]=n8]E38]520noGOj;19SXAaH000_03hDQ~3IX=mm_l?
+QA00~2IX]5oVJ9AOKY2@0008e006K7AOKnofJ;AOiV@6J9AOkY>oooohe006J;AOK[0X_0Pl@<
+FlW3Rl1ERnb3k1b9A@R2?LQ?0`013hE5~3^P`W0`2Q33H30>Rk=000RdD8og0<RdD8og0@RdD8
+og0D^Q@W0`2Q33H308?\2>RG=000^ShW0`2Q33H30>R8=000Pl@DPSg8C`<00GE4^T0W0`2Q33H3
+0>Q]=000RdD8oc2;A@SoL0B;A@SoL0RjB2L30:4<=P<0Pn`8j4Xd~2^W8W0`2Q33H30>Pk=000
+Pl@DRdD8PgPDAWd;^000~2jLT1~2o<M5o000~2adGd\PL008_0RdD8Rd0D1F`7~2>dGd3hid~3
+RdGl1Fd1~2RDGlRdGdVC?2:l:3h0<c`R_22l0?QDH0~2RdGd^F@0~2VOOi2m8?QAl0~2RdGd^I01
+~2VOOi2m8?Q0`0~2adG`~4j@L0~2adG`0@0008=ml05e1h]5o429AOb;AOA0RDGdjGSoooo7AO@0
+~3o8]528]=m3U840n>W@0008]=m8]5o0<4SC`R0`29AOb3OO@13hEg~3RdD8Rd0D1F`7~2VC?2
+:l:3h0<c`R_22l0?QEP0~2RdD8Rd0D1F`7~2^F@0~2VOOi2m8?QBT0~2RdD8Rd0D1F`7~2^I01
+~2VOOi2m8?Q0h0~2adG\~4j@T0~2Rl37AN`1~3Pgg\0GD7RdGl@8U5o8]5m429AOCYE?oooh]5
+28]034P3AOb9AOb;A@R;@0QY`10>~2RdglJLV0D@400lR;A@R;@0A[`3`3`H]=20<1RDGhPSg8
+C`<00GDf^W@W0`2Q33H30>R9<P00ogGh^W`W0`2Q33H308?\2>Qd<P00^Z<W0`2Q33H30>QU<P00
+Pl@<RdGhj`7lPl@8bL>=@01ERnb3k0b9A@R9E@aVRDd@RdDDad1D~4RdDDI\M0H040RdDDI\M0
+HP40RdDDad1Toooooh]55<M0J?oooon;A@R2N0D13h@o~3PSg8C`<00@n5;@000;ZX9`<0X@`f
+0`3Xjc400;Z`9`<0X@`f0`3Xg3400;[Z9`<0X@`f0`3XcC400>UB0@00RdD8PgP800n4N`0008]5
+28]@28]55>R9D`00RddD^^`W0`2;A@cXHAT0088mb4l3004?QCH0~2^_0W0`2Q33H30>R1<@00
+ogDD^_PW0`2Q33H308?\2>Q\<@00^QdX0`2Q33H30>QM<@00Pl@<ReDDIX]54>SJ7P00RlR;AAB9
+B5CY9P000?bi1`000;XP:0<0RdDDj5i=~2RdDDR`d<=P<0RDQDRdDDaT1H0H]558=hE01e<Ome
+5;XX:0<0XM1?0`23k0SXKC<00;WTC`<0RaG@C`<0I[P40>Sm;@00j;P_~2Pl@<RdDDPWQH0G@@
+RdDDj7`P~22\1d1>]DRl22?LQ?0`013hDf~3^T@X0`2Q33H30>R\<000ogDD^T`X0`2Q33H308?\
+2>RG<000^WHX0`2Q33H30>R8<000Pl@<RdDDaT1H0H]55>R::P00Pl@<bL?lEH_\Pn`DRDD8RED<
+RDd@RdD@aT0408]54<M02000~2^WPX0`2h0@800>PMlOooRDGlogGl^X0X0`2;A@b3k0SX1c<0
+08?438U5n8=mn04?QAl0~2RdGlj=<F~2RlR;AA29B0R;AA36@0@1jC`0~2SD00RdD@oc2jR2P3
+0:7@C`<0Pn`8j5Db~2^NA?0`2;5M1?0`1V^0<0j>D\~2ReD<RdD8j=8>~2Pl@<RdGlj8M6~2Pl@<
+bL>;`5F;k8?\>8U52<M5n0400823O@P03h@B~3RdD8PSP03h@6~3j@d0~2o;P1~2P>T>0`00Rl22
+?LQ?0`01MCJj[2P30:4<=P<0j6@_~2ogD8^[@X0`2Q33H308?\2>Q?;`00^^@X0`2Q33H30>Q0
+;`00Pl@<adGX\PL00<M5i040~2adGP0@000<M5g000~2adGH~4adGD~4SDGDD8e5f52=AMa@SDGP
+D8e5i52=ANQ@^^PX0`2;A@R3k0SXac4008?488U5o8=mo05l2h=mo0Io1N\kSD00ogD8^PPY0`2Q
+d4l308?\2>P_<@00^NA?0`2;5M1?0`1V^0<0j;l[~2Pl@<^040083Y;P8008_0PGgX\PL007`;
+PGgXm@L007l2jcSoMNRj;2T30:7@C`<0Pn`8j><`~2^NA?0`2;5M1?0`1V^0<0j7<[~2Pl@<^040
+083YhP4008_0RdGX;F`7~2RDGXPggT0G`;PggT37l5jc^=@03oMNBjI2T30:7@C`<0Pn`8j8l`
+~2^NA?0`2;5M1?0`1V^0<0j1l[~2Pl@<^040083YSP4008_0RdGTB8U5i8=mh05l2h=mh1mo1N\k
+SD00ogGP^Y@Y0`2Qd4l308?\2>Po<000^NA?0`2;5M1?0`1V^0<0j<lZ~2Pl@<^040083Y?P40
+08_0PggL07`:PggL5gl4jcZ;`?meg;[4:@<0XM1?0`23k0SXmbl00;WTC`<0RaG@C`<0I[P30>R7
+:P00Pl@<^040083YmP0008_0PggH07`:PggH>gl4jcZ;`?mef;[d:@<0XM1?0`23k0SX[bl00;WT
+C`<0RaG@C`<0I[P30>Po:P00Pl@<^040083Y[P0008_0PggD07`:PggD>gl4jcZ;`?mee;XX:P<0
+XM1?0`23k0SXIbl00;WTC`<0RaG@C`<0I[P30>Sg:@00Pl@<^040083YIP0008_0adG\~4adG`
+~4adGd~4SDGDj=Ogoon9AOR2?LQ?0`01MCJjG2X30:4<=P<0j9`\~2ogGh^V@Z0`2Q33H308?\
+2>R7;000^X\Z0`2Q33H30>Qh;000Pl@<RdGhj`23a0c9`he005F;k8?\;8U528UE36J9CA36AN<1
+^Y0Z0`2h01000>PQkOooRDGTRdD8RDGladG`~4o8]5o88h07@LR`eTC`<0RdGl<m::43?0IX\4
+DOK027@4j`J;`>\>Rl2;AOa0RDGljln=@02;AOb2>01e4>UK0@00SD00j@T0~2SD00RdGlRDGX
+Rl2;AOb2>01d98\=I4l308]5o3?BRQ0c`6J;1563h0R3`?lK`40;`7@4j`J;`>\>Rl2;AOa0RDGl
+jlN=@02;AOb9AOB;AO@[ANQ0RDG\Rdg\ReGXRdGTj2i>~2RdGTRdg\aP@808]538]=l8e4B0Q@
+^Y`Z0`2;ANB3k0SX?Bh008?438U5n8=mn05d=Omei8]5l41@^Z0Z0`2Qd4l308?\2>R[;@00^NA?
+0`2;5M1?0`1V^0<0j3\X~2Pl@@aTGS08]538]=l6J3O4P8og`BRdD<Rdg`IX5lB0So07l3jcol
+RdG`@52;A@b;CO0?_dA8252je2X30:7@C`<0Pn`8j4d]~2^NA?0`2;5M1?0`1V^0<0j=dW~2Pl@@
+aTGS08]538]=l6J3O4P8ogD?RdD<Rdg`IX]E46J9E4P8RdG`@8U5l>UUo_ooo89mh`5e>H5ml001
+~2M33oMO2j22\30:7@C`<0Pn`8j>@\~2^NA?0`2;5M1?0`1V^0<0j7@W~2Pl@<aTGS08]5i>PM
+@@00RTGSj`23a0c9`he005F;k8?\98U526J9E@b9CA2j>2\30;P10P00j07[oon9AOb;A@QVad1P
+0@2;A@QVad1R0@2;A@S7@6CoooooRdD8ad1Xoooooh]52<M0G000~2RdD8j8XF~2RlR;A@R9B5B;
+A@R3N5@03hDa~3ogD8^T0[0`2Qd4l308?\2>P`;000^NA?0`2;5M1?0`1V^0<0j<0V~2j7\X~2
+Pl@<RdD@aP00aTGc0H_0RdD@j<a;~2RDGdRdD8RDGXRdQL@H]5j8U8G8]=28]Eo;P00P00j24M
+~2RDG\Pgg\00n=B00008]528]0E?I0204?Q0P0~2jLl0~2SD00^NA?0`2jJ2\306Jh0`3XBBH0
+0;X0~3RdD8j3@8~2j7\E~2aTGc0>VN~3Rl2;AOc6P?l1~3^PX0~2RdGlj;d8~2RDGhPggh07@6
+RdGhaP00RdGlj2I;~2RlR;AO@3`HU5m0noA@`kAOAl4h]Eo8]54>P`BP00jD<0~2SD00ogGd^X`[
+0`2Qd4l308?\2>PO:`00^NA?0`2;5M1?0`1V^0<0j:lU~2ReGlRdD8j9`7~2Pl@<aTGc0>T8~3
+jNOnoon=@00?_dD<>dGdOS3oMOBj_2\30:7@C`<0Pn`8j<hZ~2^NA?0`2;5M1?0`1V^0<0j5hU
+~2Pl@<aTGc08]52>RKj_ooRdGlj?ln~2RTGcj`:;`8?43<W3SD00EH_\PN`d0P00RDD8RED<RDd@
+RdD<I\M0H040RdD<I\M0HP40RdD<ad1Toooooh]53<M0J?oooon;A@c7@5`0~3RdD<j7XD~2RlR;
+A@b9B5B;A@b3N5@03hDa~3ogD<^_0[0`2Qd4l308?\2>PP:P00^NA?0`2;5M1?0`1V^0@0j;0T
+~2j6\V~2Pl@<^Q@\0`2h01000>QQj?ooRHGLoOooRhGLoOooaP00aXGUoOoo0He008:miOgoo`4?
+QF\3~2RhGLoOooj919~2RHGdoOooRdD<RHGHoOooRdQL@H^5f?goohU8G8]=38fEo?gookP00P00
+j=TJ~2RHGhoOooPkghoOoo00n=BP0008]538]0E?I0204?Q0H0~2j@T3~2o;WTC`<0^R0\0`1V
+^0<0j?dS~2^P00~2RdD<j>P5~2j2lC~2aXGUoOoo0>W?0P00SD00aTGj2\I5n`2j8`0008f5o?go
+onQ\1P00RHG`oOooPkg`oOoo07@ORhG`oOooaP0:RhG`oOoo@8V5l?gooh^5l?goolH00;X:~3
+SHGloOooj2h6~2RHG\oOooPkg\oOoo07@9RhG\oOooaP0PSHGloOooj8]8~2RlR;QOCmool3`HV5
+m?gooh]5289h105e6X]5289h705e4H]5289h405e2>T[0@00SD00Rdd8SIGloOooRdD<j=O]oomV
+RHGVoOoo3kn5i_goonWD~3jOL0~2SD00RdD83kn=i_goof_9389l20@1MEB;A@P?_hgVoOooJlT<
+oc@8^T0\0`2Qd4l308?\2>PZ:000^NA?0`2;5M1?0`1V^0<0j;XR~2SIGloOooRdD<j:@4~2Pl@<
+aXGUoOoo0>TN~3o8]=20noQNKmoom[`0`3b8fEo?gooh]53>Skm?oojFX0~2Rl1XS2`30;Y\;0<0
+XM1?0`23k0SX_BL00;WTC`<0RaG@C`<0I[P40>Q=8P00j0PT~2Pl@<jc>=@03Y:`0008e008?h
+o`n48oooo`_03h@SooooPoP23h@JooooPoP13h@Aooooji^=@03Yn`0008e008f5h_gooe2jV2`3
+08]528]088?\2>Rf9`00Pl@<RHGXoOooPkgXoOoo0GDHIX>mh_goo`1l3VJ1_N;moooo07l3jdGl
+RdD8og0PRdD8og0H^Y`\0`2Qd4l308?\2>P29`00^NA?0`2;5M1?0`1V^0<0j98Q~2Pl@@aXGU
+oOoo0>Uk~3SD00PKgdoOoo010007lHSIGloOooRhGLoOooj;=5~2jDh0~2Rl3o]OCmoonjd2`3
+0:7@C`<0Pn`8j:0V~2^NA?0`2;5M1?0`1V^0<0j30Q~2SIGloOooRdD<j1X3~2Pl@<aXGUoOoo
+0>T;~3SD00jH_loon=@02;A@cXC>Kooh]5289h105d>h]52?l`^_`\0`2Qd4l308?\2>Pl9P00
+^NA?0`2;5M1?0`1V^0<0j<`P~2Pl@<aXGUoOoo0>V^~3o8]5289h705d>h]52?m`6;XX;@<0XM1?
+0`23k0SXmbD00;WTC`<0RaG@C`<0I[P30>R78000Pl@<aXGUoOoo0>UY~3RdD8PWP@0G@kRdD8
+og0<^U@]0`2Qd4l308?\2>Rc9@00^NA?0`2;5M1?0`1V^0<0j4<P~2Pl@<aXGUoOoo0>TU~3RdD8
+Rd08j=D9~2RlR;AA2928]528]05>S32@00RlR;AA29B0B2_NGmool1MA]VRhgRoOooReD@RhGL
+oOooj7Gfoon8QNGmoon;QMcmoooXV3T006Hc`8Z5iOgoon\1o8?43<W3SD00EH_\Pn`4Dh?\36J9
+A@R9E@aVRDd@I\M5oP00o6J;AA1V>DGnOAZ;AA@?_dgnI\L4B?ooIX]5oVI0IXU5o^_Mo6K7AOh0
+08_0IX]526HiAOh?SH80~2RdDDReD<3kmMoS?9RP`JIX<lB?l?QA`0~2RdDDReD<3kmMoS?9RP`J
+IX]EoVJ954SY>`0008]M30noCOhc`8X42e2jP2d30:7@C`<0Pn`8j7dT~2^NA?0`2;5M1?0`1V
+^0<0j0dO~2j<PP~2Pl@<IX]5oVI0IXU5o^UbooooRl23a0aKbL>;`5F;k8?\48U528UE38U=48]=
+2;Zh;@<0^000~2j7\9~2RdD<a`00~3RdD<ad04~4Rdd<ReD8RdD@j7;ioomVRDGnIX=moP0?SC40
+~2ogD8^[`]0`2Qd4l308?\2>SR8`00^NA?0`2;5M1?0`1V^0@0j78N~2j2dP~2Pl@<ogD8^^P]
+0`2Qd4l308?\2>Ra8`00^NA?0`2;5M1?0`1V^040j44N~2RdD<og04RdD<oc2j42h30:7@C`<0
+Pn`8j80S~2^NA?0`2;5M1?0`1V^040j10N~2Pl@LPl@<bL=ERnb3k0b9A@R9E@b3O@`03hAR~3
+ogD8RdD8og1L^T0^0`2Qd4l308?\2>Pc8`00^NA?0`2;5M1?0`1V^?ooj<<M~2ogD<^V0^0`2Q
+d4l308?\2>P:8`00^NA?0`2;5M1?0`1V^?ooj9XM~2Pl@LjC@0~2Rl3oM@R;A@SoL5bjK2h30:7@
+C`<0Pn`8j=4R~2^NA?0`2;5M1?0`1V^?ooj64M~2Pl@@Pl@<bL?lEH_\Pn`4RDD8RED<adGl~4
+o8]528]=o88l201d;8]528]=o8YE33PD20n53P0008]528]=o0?1jAD0~2o8]5o429AOc[bhe0
+0;P0~3j`7lbL>;`5F;k8?\55>9A@R9E@c7AO`0~3RdD8RdglPS`807DDRdD<RdglPS`807D8jL\0
+~2SD00R`eTC`<0RdD8Regl<m::51Pc`6J;157f`40?Q2@0~2XFA?0`2;E@R;GO`cbHX<6VJ;Q4P2
+0P003ko0RDG`j@l0~2o8]M28]=o3?0RP@;RDG`RdG`RDGhRaeTC`<0RdD<ReGl<lV:310c`6J;
+14_f`41d8:5TC`<0Rdd<ReGl<m^:715VRhAH0P8000no`8U5k>\>Red<Rdgl<l2:10^9ANb;ANb9
+AOB;AO@iAOQd38]5n2]5m>TE~3o8]5o429AOcY6?oookP0~3j`7lFlW3o5F;k8?\15>9A@R9E@b9
+CA37AO`0~3o8]543U5o7dHRdD8RdglPS`807D@RdD<RdglPS`807D4jdJ;`8]E38]Mo8]528]=
+o8XD6SPD20n4800008]E38]Mo8]528]=o8XD6SPD20nE`8?P0NTG~3SD00RdGl@8U5o>^KSD00
+^000~2j`7lFlW3o5F;k8?\55>9A@R9E@b9CA37AO`0~3o8]543U5o7dHRdD8RdglPS`807DDRdD<
+RdglPS`807D8jL\0~2SD00R`eTC`<0RdD8Regl<m::51Pc`6J;157f`40?Q2@0~2XFA?0`2;E@R;
+GO`cbHX<6VJ;Q4P20P003ko0RDG`j@l0~2o8]M28]=o3?0RP@;RDG`RdG`RDGhRaeTC`<0RdD<
+ReGl<lV:310c`6J;14_f`41d8:5TC`<0Rdd<ReGl<m^:715VRhAH0P8000no`8U5k>\>Red<Rdgl
+<l2:10^9ANb;ANb9AOB;AO@iAOQd38]5n2]5m>TE~3o8]5o429AOcY4?oookP0~3j`7lFlW3o5F;
+k8?\38U528UE38]52>Q\?`00RDGhRdGhB8U5o8_0Pggl07`^RdD8RdglRUD<>1@83hD@~3RdD8
+Rdgl0l7Y5`0008e008]5o4R9AOc[che00;P0~3j`7lPl@4bL>=@01ERnb3k129A@R9E@b;A@SX
+23l008U5n8]5n4R9AOb;`8=mo01l=X]528]=o3?BRQ@8RdD<j6?lool;`0n43`0008]528]=o0?1
+jAH0~2Rl2;AOa8RDGljlN=@02h~4j`7lPl@8bL>=@01ERnb3k0b9A@R9E@c7AO`0~3o8]528]=
+o88l201d=8]528]=o3?BRQ@8RdD<j?gkool;`0n43@0008]528]=o0?1jA@0~2RdGl@8U5o>_3
+SD00^000~2j`7lPl@8bL>=@01ERnb3k31CEh?\38U5288mb4l3004?QCH0~2^X`^0`2Q33H30>SV
+6`00ogD8^Y@^0`2Q33H308?\2>SA6`00^[h^0`2Q33H30>S26`00Pl@<Pgd807dcogD8^\0^0`2Q
+d4l308?\2>PD7P00^NA?0`2;5M1?0`1V^080j:@H~2Pl@<adD8~4adGTP5410<M5g80ch@6;AM`5
+P54108U5f<M5o;87~2Rl2;AObI<l8[`X?P0c?2:l8;`0n59P0008]5o;UT~3VOOi2m8?QAH0~2
+RdGl^I01~2VOOi2m8?Q0<0~2j`glRdGHRDGDj@L0~2o8]5g8U5e8]5e3U527`>RdD8:dGDRDD8
+j@P0~2j@l0~2SD00RdGl@8U5o>^7SD00adGh~4o8]5n8\4QC`R0`29AN23OOP13hDm~3RdGlVC?2
+:l:3h0<c`R_22l0?QBH0~2RdGl^F@0~2VOOi2m8?QAL0~2RdGl^I01~2VOOi2m8?Q0@0~2j`V;
+`8]5h429AN2;AN0?[dGT>dD8OaF;CN0?[dgTRdD8:l69A@SY2@000?cY3`0008e008]5n429AOSY
+K?oooh]5n429AOR;A@RImggTRDGdRdGd@8U5m8]529WgONB9E@R;A@Ri40h009WgnHU5l8]52;T@
+3P00VOOiRED8RdD8^C`0~2VOOiRDG\RdD8^C`0~2VOOiRED8RdD8RDGXogGXogG\ogG`ogGdogGh
+ogGl^^`^0`2hT4l308?\2>Ph7000adG@T4l30;\5~3_``_0`2hT4l308?\3>SV>`00RmN;bh_H
+Pl@4RdG@0l>3k?SXa3D008?4888mb4l3005e>;XD;`<0X@`f0`3XNAT006R@C`<0^Q`_0`2Q33H3
+08?\2>QR6@00^U@_0`2Q33H30>QC6@00Pl@<^91?0`3[0Ob3a0aOFlW3o5F;k8?\58U528]52>Q[
+>`00@8U5n8]5n>Q3<`00RDGlPggl00n5=0000?me2?men;YH;`<0XM1?0`23k0SXKQ\00;WTC`<0
+RaG@C`<0I[P40>Sn5@00j;TG~2Pl@@ReD8RdGlj;<j~2RdGlj`:;`8?43<W3SD00EH_\Pn`<RDD8
+Pgd800n44@0008]5288h00n41@000>T8~3RdD8jEP0~2RdD8j=0j~2RDGhRdD8Rdgh0l58RDGl
+o8]523U5o78LR`eTC`<0RdGl<m::43?0IX\4DOK027@4j`J;`>\BRl2;AOc6~2RdGlB8U5o>_9
+o8]52>\3SD00Pl@4bL<0~2EH_\PnaTRDD8RED<RDd@JP2=ANa@SDgdSEFXRdD@Pn`<j?XB~2Pl@D
+IXU5jS?0IX]5j_K00WDFPgd807@@^@P0~2ReD8SDGdj9Hj~2<l1VRdGZm\04MAJ3O@`0M12i1000
+08]E38e5k>Qe>P00ogD@JP2=CNb=EOB=AJR3k0cXo`P008?458?43<W3SD00EH_\Pna0RDD8ogD8
+^Y0_0`2Q33H308?\2>R>5`00X@`f0`3Xa20008?43?bQ13H308=h6P4?QJ40~2X@@f0`23N100
+3h@b~3X@@f0`29ALb9AM2;B119RdG@RDP@R`d4=P<0RdG<Re0@<l2:A14HRDG`jEX0~2SD00X@@f
+0`23N0@0M3VQ13H308U5e8]814V;AMB9B0BQ13H308U5f8\8RDgL@H]5f8T8RdgL<l2:0HU5n8]5
+n8U5m>\?Rl2Q13H30>Rb8000RDGdRdGdRDG`RdG`RDG\j`klX@@f0`3XUR0008U5k8]5k8U5o8=m
+o?me7kWTC`<0^Y`_0`1V^0<0j;PC~2adGlCP000>U0~3R`eTC`<0ReGl<l1VR`AAm\103h@L~3
+XFA?0`2;COaVRhA80P8000no`8U5j>T7~3o8]5o8U5j8]5j8U5o8=mo4h?Q1H0~2PgglF@n43000
+0<M5i000~2j@L0~2adGT0@0008=mi00?U<0Uo`0000_03hFMo_ooPgglFGD;adGP0@000>\9Rl37
+AN00~3RTGPj`23a0c9`he005F;k87\?08008U528]526K7@63ooh]526K7@6;ooh]52<M0I?oo
+oon;A@S7@6SoooooRdD8ad1\0@00P;Zk;`<0RdD8j=LV~2RlR;A@R9B5B;A@R3N5@03hDf~3ogD8
+^\0_0`2Qd4l308?\2>Se5`00^NA?0`2;5M1?0`1V^0<0j8DB~2j<@1~2Pl@<jK@1~2RdD8j0P5
+~22\0?QF@0~2PSg8C`<00@n5=P000;[T;`<0X@`f0`3X>1D00?me2;[\;`<0X@`f0`23k0SX8aD0
+0;XE<0<0X@`f0`3X51D008?438]52>QYeoooRdD8aT1H0H]52<M0E000~2jD<1~2SD00RdD8og1D
+^@02~2^P40~2SHD0o_ooPn`<j3hX~2Pl@@RHGloOooahGdoOoo~4ahGhoOoo~4o8^5o?goodPk
+QOSmoomfAH^5n?gooh:l1@3nool=3hDQ~3RhGhoOooP[`50Okoo`X?Q@d0~2RhGdoOoo@8V5m?go
+oh^5n?good29QOSmooo[[Ob;A@SX^=Kooh]52<M0E000~2RhGdoOooJl1@>hGloOooLaV;A@QV
+ad1P~2RdD8I\M0HP40jA@0~2Rl2;A@QVad1P0@2;A@QVad1R0@2=UM3moon;A@SXY<`008V5l?go
+oh>ml?goo`1d>Ome2;XH<0<0XM1?0`23k0SXD1H00;WTC`<0RaG@C`<0I[P30>SP4000j1l0~2
+Pl@<j@l0~2SD00RdD8RhgXoOooRDQ\Pl@<bL>=@01ERnb3k0bQG50308?\1>R]=@00Pl@4D;Xl
+<0<0XM1?0`23k0SXkaD00;WTC`<0RaG@C`<0I[SoonQo4000Pl@<Pl@<bL>=@01ERnb3k129A@R;
+A@P?_d1PjGL0~2SD00^U4`0`2;A@SXHb@008U5o>U[~3SD00^U@`0`2;A@SXBb@008U5o>UC~3
+SD00RdD83km0H52jF3030:7@C`<0Pn`8j6hE~2^NA?0`2;5M1?0`1V^0<0j?h?~2Pl@<^000~2
+jF40~2o>T?~3SD002l1dR8?h0GBKjk7lPggl07DnogD8^W``0`2Qd4l308?\2>PM5@00^NA?0`2;
+5M1?0`1V^0<0j:d?~2j>cnoon3a0bh~4j@\0~2SD00RdGlj`>=@023a0c9`he005F;k8?\46J9
+A@R9E@aVPgd80@n4\00008]53>R80@002\0?Q:00~2IX=m208?QEd0~2ogD<^Z0`0`2Qd4l308?\
+2>RL5000XM1?0`3XM_[ooh?432Go~3Pl3o6l102l0?Q200~2^NA?0`2j`30306JhoooX3@l00;P0
+~3jA\1~2SD00jC\0~2SD00ogD<^]@`0`2Qd4l308?\2>Po5000^NA?0`2;5M1?0`1V^0<0j<l>
+~2Pl@<^000~2jMX0~2Rl2;A@`?_d1PjG@0~2^^D`0`2;A@cX^b8008U5o>U[~3SD00^^P`0`2;
+A@cXXb8008U5o>UC~3SD00RdD<3km0H52jk3030:7@C`<0Pn`8j<HC~2^NA?0`2;5M1?0`1V^0<0
+j5H>~2Pl@<^000~2jF40~2o>T?~3SD002l1dR8?h0GBKjk7lPggl07DnogD<^Q0a0`2Qd4l308?\
+2>Qe4`00^NA?0`2;5M1?0`1V^0<0j0D>~2j4Cmoon3a0bh~4j@\0~2SD00RdGlj`>=@023a0c9
+`he005F;k8?\28U52;X0~3RdD8j4K6~2Pl3o6l10j@<0~2SD00Pl@8bL>=@01ERnb3k529A@R9
+E@b3O@P03hD6~3jBl0~2o6X0JP2=COB=EK2;A@b3k0cXD`\00?me36X0Rdd8SEGdSDF`Pn`<j:41
+~2Pl@XbL=ERnb3k0b9A@R;A@R;@5CXk<H008U5o8]5o>Ria`00RDGhPggh00n540000;01jA40
+~2o>T;~3SD00\03Y0@000?b3a0C9`he005F;k8?\:8U528]52>Rgm_ooRDGX^Rh0~2RdGXj:?_
+oon9ANB3ON@03h@R~3^@@0~2ReGTSDG\j78b~2aTG`08]5i<H00>TE~3SD00^@40~2^S<a0`2=
+ANcXeR\00;T8~3ReGXSDGdj3hb~2aTGl08e5m8U5i8]5i88h07@XRdGT<m::4;Pd<@<0j2o_ool;
+`0n51P0008]5i<H0Gh]5i429ANC[d8e5kHU5i8_0RdGTPSP0M2R;AN@cdXX@^80a0`3Xmnkoo`_0
+3hD6~3RdGTaP1ORdGT@8U5i>_@SEGd^;1B0`3Xlc0008eEk;R`DP<0j6h`~2^[1B0`2;A@SXYC00
+00_0M35X\5830?me2;[<<@<0XM1?0`23k0SXCa400;WTC`<0RaG@C`<0I[P20>SO2`00Pl@@^;1B
+0`3[0Ob3a0c9`he005F;k8?\45=GPn`<RDD8RED<RDd@^@40~2^_da0`2;AASX`RX008=m200?
+Q880~2RdD8PSP03hAf~3^D00~2ReD8RdDHj<``~2RdD8j:0`~2RDGlRdD8Rdgl<m::E0So^?ha
+0`3X1nkoohU5n8=mn00?QCP0~2Pggl@0n3;P0008]568U5l;\2~3_`4b0`23k0cXF30008_GRl^;
+f8?418]5l0?3Pnchj3HZ~2Pgd<07@@^@P0~2ReD<RdDHj50`~2Pgd@00n4KP0008]5488h00n4
+HP0008]5488h;Pn4AP0008]568U5m;\2~3_`<b0`23k0cXlRl008_GRl^;f8?418]5m0?3Pnch
+j=0Y~2^@<0~2ReD@RdDHj?0_~2jA<0~2SD00^@@0~2ReD@RdDHj=P_~2Pl@<Ge_9`oaERnb3k129
+A@QVRED<RDd@ogD8^PPb0`2Q33H308?\2>Q;3@00X@`f0`3XPAH008\=13H300noE@b;AA3XjaP0
+08?438U5o8=mo00?QAd0~2^NA?0`2j338306Jh103X80X00>QOnOooj=H;~2^PX0~2RdD@j;7\
+oon9AOb3OO`0M0J;AOc6~2Pl@<bL?lEH_\Pn`<RDD8RED<RDd@adGl~4Rl2;A@PiAO`?SF00~2
+RdD@Rd1Dj84F~2RDGhPggho`n5<00008]548]0E?I0208?Q0`0~2^?kooooY=P0008_0Pggl07D:
+^?oooooY90000>\JRl2;A@b;COb;EOR850R;AOa0RDGljiN=@02;AOc[0he008?41<W3SD00EH_\
+Pn`@RDD8RED<RDd@RdD@RdQDReD8RdD<j>PG~2RDGlRdD<Rdd8BLH42023OO`03hDd~3RdD@Rd1D
+mT080Pn430000;SnoooojBH0~2Rl2;AA2;@5Cf@0P1M0bhooooonT>~3Rl2;A@cX52h00>\2Rl23
+a0c9`he005F;k8?\38U528UE38U=46Q<<P<0^R`b0`2Qd4l308?\2>PF3P00^NA?0`2;5M1?0`1V
+^0@0j:H8~2j64:~2Pl@<^?kooooY~4Pl@<bL>=@01ERnb3k21CEX?\38U528UE38U=4<M5h000
+~2adGh0@0008_0RdD8>DGh3hgH0`00RdD<RdghR`B8RDGlRdDHPWP50@n51`000<H5b4l30062
+?LQ?0`01MCJjF3830:4<=P<0j10;~2ogGl^V0b0`2Q33H308?\2>Sk2P00^X\b0`2Q33H30>S\
+2P00Pl@<RdGl<m::48]54>RFj_oo2l0?Q>h2~2^Xdb0`2;AOcXKB`000_03hCI0P00PggP00n4
+200008]5h>Qg8@00RdGl@>QRlOooRDGPReDDRdGPj23^oon9ANS7AN@0~3PggX07@=RdGXaP00
+RdGX@8U5i8]5h>R[;000RDGdadG`ooooolM5k000~2Rl2;AAR;CNa[b@b3?0P03hBe~3RdgdReGP
+RdDHReg\Jm\<R`@Hj=[[ool;`0n5RP0008=ml00?SEP0~2RdG\RDG`PSg8C`<00@n5?`000;Z@
+<P<0X@`f0`3XoPT008]568]=k6_93?ld2;ZH<P<0X@`f0`23k0SXh0T00;[4<P<0X@`f0`3Xd@T0
+08?43>TY~3o8]538]Mn?ldV;[8<P<0XM1?0`23k0SX7@`00:7@C`<0j:>koon3a0b;ANa0RDG\
+jCSooon3OO00OBR;A@b;GOSo=9Rji3830:7@C`<0Pn`8j><;~2XM1?0`3XJK_ooh?438=mj00?
+QG00~2RdDHReg`Jm\<PW`H100?QCP0~2RdDHReg`Jm\<oc@HJ24c0`2jo3830:7@C`<0Pn`8j9D;
+~2XM1?0`3X6k_ooh?44>TR~3SD00RdDHReg`Jm\<aT@H1@6;AAR;GO1[f`c7A1P8~4j@01~2RdGT
+PSP03hD`~3RdD<ReghocBH^R@c0`2Qd4l308?\2>Pe2`00XM1?0`3X^k[ooh?43>W7~3SD00RdDH
+Reg`Jm\<PW`H105e>8]568]Ml6_K3?ld66Qa<`<0^TPc0`2Qd4l308?\2>S]2P00XM1?0`3XLk[o
+oh?44>Uo~3SD00RgDHReg`Jm\<RdGTj1O_oon;b8_6RD`H28]568]Ml6_K3<I460D1PSg8C`<0
+0@n5@0000;Yd<`<0X@`f0`3X9@P008]568]Ml6_K3?md60RjO3<30:4<=P<0Pn`8j0H8~2^ZPc
+0`2Q33H30>Sg1`00Pl@<jG40~2SD00jFT0~2SD00RdDLPWP500n58`0008]57<I01@6;A@b;GOR;
+19SXP^kooh_HRdDLREP8jCL0~2o8]5889h1@1e8h]58<I01@6;A@b;GOR;19SXE^kooh_HRdDP
+REP8j@\0~2o;R\<`<0j7jioon;AOQ0RDGhjAkloon;`8?435iKbL?lEH_\Pn`LRDD8PSg8C`<0
+0@n5D`000;[<<`<0X@`f0`3X@`L008]528?0K8?\1>R]7`00Pl@4Pn`4j7X7~2Pl@4D?me2;[D
+<`<0X@`f0`23k0SX4@L00;[o<`<0X@`f0`3X0PL008?448]528?0K>Q\7`00RDGhRdGhPgPDD0n=
+NP0008]528]0K8?\1>S6j_ooPl@4D?me2;X4=0<0XM1?0`23k0SX;@T00;WTC`<0RaG@C`<0I[P2
+0>Rm0`00^NA?0`2j93@306JhoooXZP<00?me2;YL=0<0XM1?0`23k0SXl@P00;WTC`<0RaG@C`<0
+I[P20>R10`00Pl@LRdD8Rd1\RDG`RdD8Rd1\RDGdSEG`RdD8j6G0~2RDGlPggl07A>RdD8Pl1\
+Pn`4j:hN~2Pl@4Pn`4j7\6~2Pl@4D?me2;Z<=0<0XM1?0`23k0SXPPP00;WTC`<0RaG@C`<0I[P3
+0>PB0`00j57boon3a13[08?43<W3SD00EH_\Pn`DRDD8RdD8Rd1Dj8Bl~2RDGlRdD83km0H>UU
+~3o;X0P000RdGlj8>m~2RDGhjE\0~2SD00^P10~2RdGlj6^m~2RDGhjdJ;`6SD=0<0^[@d0`2Q
+d4l308?\2>Se1`00^NA?0`2;5M1?0`1V^0@0j8D2~2j404~2Pl@<j@`0~22l1dV8?h0GB[jkgl
+Pggh07daogD8^^@d0`2Qd4l308?\2>R]1`00^NA?0`2;5M1?0`1V^0<0j3d2~2j7caoon3a0b3
+a0c9`eF;k8?\N8U528UE38U=48=m300?Q0H0~2RdD<aP00Pgd@07@6RdD@aP00PgdD07@6RdDD
+aP00PgdH07@6RdDHaP00I\M5WP00Pgd807@=RdD8PSP0M0G[3he006J;AIkY3`4008e008]E28e5
+[>R59P00SDF\RDFX^P@e0`2;AJSX]^OoohU5Y8=mY00?Q6`0~2IX]5WX;826J9AIj3O@`03hA:
+~3adFP~4o8=mX41m2X]5Y3U5Z7L2j`C[:X_0RdD<RDFD@8U538]5Z8U5V429AJR;AIR:28]5U8P8
+RdFP@8U5X>_5o8]53<H008]5Y429AJB;AJB9AJRj;P0008]5Z>S<hoooRDFTPgfT07@[IX]5WX;8
+16J9AIj3OA@03h@@~3^@@0~2ReFTRdDDj8XV~2RdFTaP00RdFXPSP0M2EVRdFNP\P2IXU5WX=m
+400?Q100~2^@P0~2ReFXRdD@j5LV~2IX]5W^\1o8?43<W3SD00EH_\Pn``DeN3k0b9A@Rh1cD3
+0>Sl6P00RDGhPggh00n5B0000;T4~3^P`e0`2=AMSXVAl008e5f8U5d;\8~3_a0e0`23k0cXSBD0
+08_GRl^;f8?418]5d0?3Pnchj6\O~2SDGHj9<O~2j88W~2XA`g0`29AMB=A@SXUQ\008U5o8]5
+o8=h801n5X]5e2d@3P00jA40~2o>T;~3SD00RdGDj@00~2Pl@<Ge_9`oaERnb3k1QVRDD8RED<
+RDd@adGh0@000<M5o000~23km52>VM~3o<M5m1Pe0`3Yb0000<M5m1`e0`37AO`1~3jKD0~2o<M5
+m2@e0`37AO`1~3jJ40~2o<M5m30e0`37AO`1~3jHd0~2o<M5m3`e0`37AO`1~3jGT0~2o6QX=@<0
+^TPe0`2Qd4l308?\2>S11000^NA?0`2;5M1?0`1V^0@0j57ooooX30400>P70@00Pl@<jC\0~2
+SD00PoP13hAKoooo2l0?Q5?ooon3n?l?Q5Kooon3n08?Q67ooon3n0<?Q6cooon3n0@?Q7Ooooo[
+ROb3O@`0M0Z;A@b2>01d0^\PIZ41D`<0ISU520n>2P0006J;A@QVX`5C0`3YS`000?b;AA23N5@0
+M@O7AOP0~3Pggh07@OPggl07@IRdD@R`d<=P<0>DQD3hD7~3adGl~4Pggl07@KogD<ogGd^WPe
+0`2Q33H308?\2>Q]0@00Pl@@Pggh07@LogD<ogGd^X0e0`2;AA2;@5B3k0SXB`4008?446JQ0E<3
+06HiA@Qn2VJ;A@QVX`5C0`23a0c9`oaERnb3k0@?_`D1D`<0jCh0~2Rl2h~4j489~2jDT0~2o;P1
+~3j389~2jcbh0P000>PV2@00jc2h0`000>PJ2@00jbCY7`0008e008?h0GBo2l1d^h?h0WC6PoP3
+M<f3n0Ade>_BRl23a0C9`he005F;k8?\15>3k0R9A@R9E@b9CA37AO`0~3Rl2;A@PiAOam88]5
+48]@E8]=38]Mo3?0RP@Ij3HB~2RdGl@8U5o>_Io8?425_9`h_0EH_\Pn`<RDD8RED<RDd@J:Pe
+0`2jR3D30:7@C`<0Pn`8j;H2~2^NA?0`2;5M1?0`1V^0@0j4KmoooX0Ooooh?438?43<W305F;
+k8UE36X0SDd@DH]=38_@^040~2Pn`<j;ha~2Pl@DbL?lEFQH0080I?le~4RnaTRBd0~3REDDJP6=
+CAQARddDRm2h0@0008?\3>R7<@00Pl@DRnETS`D0~3Pl@4GL<0~=EH_\DeN3k1R9A@P;`7D9<l23
+a1QOFlW3R`g<C`<0RDg\2lUe7kPJ~3j:4I~2Xla?0`29AN`;`7D9<l23a1QOFlW3^@@0~2Red8
+Re<HSABE^3D308]mk8_7j80K~2Z@00E02=A`Bi100008]C48dDUM@e0`3XI1\00:T005@0Rl^=
+G`R9GNbj2P0008]138?\28e=l57XVc0008?438]=l0_9M@f3`B282h?72HUmk>\?Reg`Pl<`RdG\
+R1Q0RDG\RdgdPl4`Reg\R0^=B`760B2j2P0008]m28]728?\28e=l57XCC0008e;0X]El8?2<8PA
+SD\3ReGdPl8`R16=B`C60CZj2P0008]718?\28e=l57X7C0008e;1H]El8?2<8PASD\6ReGdPl8`
+R16=B`O60CZj2P0008\7Pn`8SDg`DNS^;`00SD\8ReG`Pl8`R16=B`V;EOB3`S284He;2\H18;[X
+0`00RdLD1F`7~2Pn`8SDg`DNRi;`00SG\;Rdg`Pl4`R0njI00008]5m8?\28e=l57XVRl008ek
+38]=l8?1<8P?^PX0~2RdGdPn`8SDg`DNQk;`00PlA8SG\=Rdg`Pl4`R0n=N`j;COB3`C283he;
+3lH12X?348UMk<H30:7<C`<0Pl@HGe_9``00~=EH_\RED<JP2=CA1ARdd<Rm0c`8?\3>Q=;`00
+Pl@DbL=EJ5P00P1TocD0~3RnaTRBd0~3REDDJP6=CAQARddDRm0c`8?\3>PJ;`00Pl@DRnETS`D0
+~3Pl@4GL<0~<EH_\RED<JP2=CA1ARdd<Rm0c`8?\3>QaC@00Pl@DbL=ERnb9E@aZ0He=456;C@b;
+d3?0Pn`<j55=~2Pl@DbL<0~;EH_\DeIGPn``^Ql0~2^2@j0`3X92\000_0M0Xc`8?4<5mNFlW3
+J;`k0`2=CNAA\0;X~4XA0f0`3XV8<008?428?hogDI<lTcd[QT~3j3:1~2PlSoPl@`GeiKbL>h
+1PH00>R]5P00RDGX2l1e6C?9<m:hI0000>P8P@00PlSoPl@`GeiKbL>;ONR=A`:S43P30:=D>`<0
+XfA?0`2n53H30;U0~3ljEVYH_GPNX20@00SKX20@00<l2i@0000?>[RoZ=U`82~2REGXI\L2oon1
+a`@2~2RmMV<lUVPoUQLPiVPoUjM`R=@N1VR@;[0fJ92X_1@H?20VJ1nOl0M]aVa`;ooh?20VHc
+bOaVPoU1LPiVPoUJM`R=@B1VR@;[0fJ92X_1@H?20VJ1nOl0M]bh00800>SJ5@00Xa@h0`0;`7DI
+<lTcd[QT~3j3>0~2PlSoPl@`GeiKbL>;?A@h0`0cdXYGoOK287@9<l2iP0000?>[R`dD>0<0R@eH
+>`<0^?@o0`3XgA8008U5j0_0M2^;n8_g^@D0~2<l3b[U4[oX_?RcfL>`<0Rl71j@;cYH_8Pn43
+ljAI<l3cZ\M5k000~2adG`~4ocFX>`<0SDg\DFX@\0?X~4Pl@<2l1d2\L5Z3\3~5^0A00`3XKa80
+08U5j0_0M3V:28;iKg@5P_U?MBf;ANR:@04lKW@4?4ie7kX<@0<0RegXPl<2Rl?XS880088l0`1e
+1h8=93X3006hh3P30>SE0@00^40i0`3Xb`400;RP>@<0j<41~2a`D8>@<0@3T30<L5J3T30:0i
+0`1Z4fP04000J>0h0`2`0nP0~3Pl@<2l1d6C?9<m:hI0000>SaOP00PlSoPl@`GeiKbL>;3N0h
+0`293B`i0`1Z4fP08000J1`i0`2`0nP0~3Pl@<2l1d6C?9<m:hI0000>RbOP00PlSoPl@`GeiK
+bL=Z4fP04000J40i0`2`0nP0~3Pl@<2l1d6C?9<m:hI0000>QoOP00PlSoPl@`GeiKbL>;3D0i
+0`293H`i0`1Z4fP08000J7`i0`2`0nP0~3Pl@<2l1d6C?9<m:hI0000>Q0OP00PlSoPl@`GeiK
+bL=Z4fP04000J:0i0`2`0nP0~3Pl@<2l1d6C?9<m:hI0000>P=OP00PlSoPl@`GeiKbL>;3J0i
+0`293N`i0`1Z4fP08000J=`i0`2`0nP0~3Pl@<2l1d6C?9<m:hI0000>S>O@00PlSoPl@`GeiK
+bL?71HQC0`3P=`<0a`F<D`<023P306XDSDg@DFX?JP^`1>P0~3Pl@@Rdg@R0ePC`<0RdgDR0f8
+C`<0RdgLR@dH>P<0RdgPR@dD>P<0<l23a31OGU_9`oaERnb3k0QCRmR=COQASDglDOmc8;03j000
+~2Pl@<2l2;`gDXRdglPN7o~3IP_9M1Z0B4B0RdglPN7o~3IX?i0GD7ad100P0005_9``00~;EH_\
+Pgd807D5j?Xh~2J<2=0@1Z0k02j000~2Pl@8bL>7fi1ERnaXL08206Co=@00~2j53koon3n?md
+KXe5n6BS~4^83b0@23k0CXOFL008?419_I;O0k0`2;AAB3k0CX07d006S0S@40^07o~2D;02j000
+~2Pl@<R`elC0<0DH\Ek3\305:Qj3\3053XCZcooheUn8?\1>PC~3SFGhI8l5~4^0P0~2GL>@05EX
+F00206Co=@00~2RnaTRBd0~3EUN3k0B;3A0f0`2;\J@1~2Rdh82lUd8dV9CPR3OPP0O1V;n8]>
+28eAohUF28]DSPcodX_7Pgh807gWj7Io~2Pl@4GeiTS`D0~3Pl@4GL<0~<EFQH0080I?le~4RnaT
+RBd0~3Pn`@2l1e7<L5G50300`0~2PlSoPl@@I8l5~4Pl@4GL>;3A0f0`2;RK01~2RDgl2lUd3S_8
+M0N;BB@;bGGeRDglRdGl2l1d3c?Bj4PU~2RDGhj`Z=@037AOSoooooRdGhPl@@I8l5~4Pl@4GL<0
+~>EFQH0080I?le~4RnaTRBd0~3EX?\4<M5l000~22l1e6h\=43H308^9\04008U=n<M5m000~2
+j`b=@029AOR;B2B9COB;MOPkMOAd7Xe008_6j7Dh~2PoP1M@O7AO3oooooRgHT>gGdMNF;AO23
+a11NI8l5~4Pl@4GL<0~=EFQH0080I?le~4RnaTRBd0~3Dh?\78U5n0_0MAg71Ea@0`0<~3PlSo
+Pl@LFfB?1@00~2Pl@4GL?7AO@0~3RdGhmT080W@Fa`ELD0<020000<M5m?ooooo[>he008]5n89h
+6P9e4lL5G50301`0~2adGdooooon\LRdGhRd0hPn09MA771Ea@0`0N~3adGdoooooh=mm?me3X]5
+n89820;Y7P4008_0RdghRe4@2m9d4TZ9DA0c`8Y44AR9AOCYl`0008]=n8=i@0<?Q7<0~2PgT4
+00n5C@0008]133d08000L`?[1_bh020008_8RdGhRe0lj4im~2RDG`2l1e3lM5m?oooooY]`00
+08e008]=l8]Mn8]CC8_3j8@T~2RD<4Rd]<R@^;AOR;28eI0HTH<m^:6HUMm?m81>Uf~3SD00RdGh
+PWPe0G@6PWPd07D]^@40~2SEG_RdGhj>El~22l1d3C?KRUg_REgdjdJ=@037AOCooooojcZ=@02i
+0@0008]Mn8]C?8_3j;Il~22l2;`g@H^@40~2SEG_j?lS~2<lV:CNn9COC[2?c7AOCoooooPggd
+og@7RdGhaT0J0H]5m8?475]TS`D0~3Pl@4GL<0~<EFQH0080I?le~4RnaTRBd0~3DeIGPn`hRDD@
+REDDRDg`2lUe7\L5G50300`0~2<l23a3QOGU]TS`D0~3Pl@4GL>;CA29CNb;CAB3n@9m>8?i0GdK
+Rdg`PTT80S?0Pl@hGeiKI8l5~4Pl@4GL>;ANc6~2Pl@hGeiKI8l5~4Pl@4GL?7AM`0~3RdG`mT08
+0W@Ca`ELD0<020000<M5g?ooooo[>8]5l89h6P9e4lL5G50301`0~2adGLooooon\LRdG`Rd0h
+Pn09MA771Ea@0`0N~3adGLoooooh=mg?me5X]5l89820;7AN`0~3jDX4~2SD00RgG`Pgh@00n4
+C`0008]E58?j0@n>@`0008]Mk8]644R9AQ2:A0HHR0=3?0Ye7<H30<I66P6;AA23a3QOGU]TS`D0
+~3Pl@4GL=:Pgh@07@5PoX1OlJ9EAB9GNb3OA@1M@j;ANc6~2jJ@3~2SD00Reg`Pg]00`n4L`40
+08=k101e?h]333d08000L`?[1_bh020008_8Reg`Re<lRl?X_7X008U5i0_0MQN;b8]CC8_3j0DR
+~2RDGPRD<4Rd]<R@^;AO23N0@03hI20`00o8]554R;f8]=l3]I17L6RDGXj`[lRdG`Rd04RDGX
+Reg`Rc>;o[P:~3RdgX2nCb[Xeoog@2<on9OM0;og@nRmN9OLP[eT:9EMR;GNb;nh_:Rl69CLc1
+j@;cYH_8RdG`Pn43ljB;CLR;OL`YN0A1R@P3fXUMk>W70P00Rl2;AO2;68]5k8_cRoR9ALR;ENR;
+`X_8`NT2ljF;b8]5l8?Q0o>TRdg8RggX0mn968]H12_JREP4ReDD:mN9EA@3chU=k8?j0@n>N080
+00_KMD6;@0`m020007<5j`R=@02h020008_8Reg`Re<lRl?XX7T008U5i0_0MQN;b8]CC8_3j>TP
+~2RDGPRD<4Rd]<R@^;AO23N0@03hOUo_oojB42~2RdG`PWPe0G@DPWPd00n5G@000?I0A80?Q5<0
+~2^@40~2ReG\RdG`j4=i~22l0?Q>`1~2SD00RedDBhUM58]=k8eA0HUEk88i2Pn4d04008?k0@n4
+a`400;T1~3RdG`j0Ui~22l1ecNVa0@00RdG`PWPd0@n5J`000?I0A80?Q640~2^@40~2Re0lj=ah
+~22l0?Q8D1~2^@40~2Reg\Rm>;MO2;a^PL8000RlJ;CAA9RDdDSE<1REG\PS\:3hAI0@00PoT1
+3hA@0@00^@40~2Re0lj99h~22l1e^^Tj0@00o8]554R9AMP?Q2`1~2?OP?~2O@C[1h_0^?P?~2
+RlR;AO2;D3cXGWP008U5i0_03hH40@00SD00RegTRl^;ONb;eh]el8_6j9PO~2RlR9CN2h2P00
+00_TlZj=Oomd0S?oRGg@2ol?Q900~2ReHlRoZh2P0008_;2nCb[Xeoog@2<ol;o`n4I`0008e5
+e51Z0B_jAb_kEomf8;04j000~2Pl@@RDGL2l1d5LL5G50303`0~2Xd1H0`22CPP2jaR;AO2;F0R2
+hoj9F0R2hof9F0QVad0foon3OM`0M1@c`8?4>5mNFfB?1@00~2Pl@4GL>;AM10RDG\jcklRdg\
+RegP0l^9CNb;AMP[`hU5f7@X?OP?~2O@C[1h_0^?P?~2RlR;AO2;D3cXFWL008U5i0_03hOoo_oo
+RdD@>DG\MRN;AO36@1X1mT080W@:adG\~4jaSlRdG\aP00RdD@RDG\j`V;`<M5k000~2RdG\Pl@h
+GeiKI8l5~4Pl@4GL<0~;EFQH0080I?le~4RnaTRBd0~3Dh?\8<M5n000~22l1d1H8h07D>a`EL
+D0<010000>\kRl0;dWD<a`ELD0<00`000>\YRlZ;f8eEi8_1j38f~22l2;`gDEJP0cbHeEi8?\
+3>R9J`00Pl@@RDGhRdGhPl@PFfB?1@00~2Pl@4GL<0~;EFQH0080I?le~4RnaTRBd0~3Dh?\68UE
+n0_BMAg71Ea@0`0<~3PlSoPl@HFfB?1@00~2Pl@4GL?7AO@1~3RdghmT480W@Fa`ELD0<02000
+0<M5m?oooooYC00008]=n8]9>8?Q3WDEa`ELD0<0:0000<M5m?ooooo[;X_0RdghPWTJ0GDSRdT8
+Pn41MA?71Ea@0`0Y~3adGdooooon\8RdghRe5<RA63OOCoM@j;COR2B@P2jM40~2Rl28AO>;GOR3
+Nd033hB@~3Rd\<>D\43i?22]9d:X]CC8_3j2Da~2>d<<M0c7AOCooooojIL0~2RdGhReQ<RAS7
+@0@0~3Reghod<4R`^=D@694hYElhPAPg]00Pn5G@00089ml`X?QE<0~2Rd\4Re=<Rl?XdS0003]3
+17@=adGdooooonU4~3o8]5n8]HC8THad04~4jb>=@02i0@0008eElh]5n>QdN000RDGd2l1e2LM5
+m?ooooo[3h]5n<I06P8c`8Y5lhU5m8]5m8?465]TS`D0~3Pl@4GL<0~=EFQH0080I?le~4RnaT
+RBd0~3DeIGPn`DRedLREg`2m]e7\L5G50300`0~2<l23a1AOGU]TS`D0~3Pl@4GL<;dW@42lUe
+53?0Pl@DGeiKI8l5~4Pl@4GL?7AN`0~3Reg`mT<80W@@a`ELD0<020000>Uo~3o8]Ml8]k>8?W
+2GDEa`ELD0<07P00089;20;YH00008_0Reg`PW\J0WDCa`ELD0<07000089;20;[AHe008]Ml8=k
+@0=d7h_jRo6C3jo?Rm?XF04008_><m;gmh_GThUMk>\LRl2;fPn_bh_@RdG`j2d0~2Rl\cd_Oa
+Rm69ANb3ON`0MPN;AO36@1X1RdG\Pl@DGeiKI8l5~4Pl@4GL=ERnaCEUN3k229A@R9E@b9CA37
+AO00~3adG\~4PgP@07@[<oJ;F11;REP@RU`H68PJAT8klGD:RlJ3a21OGU_9`h=h401egHUE38Ue
+l8]el3Ue40n6Y00008]mj8]E38]Mk8]528e0089h=@0?QE80~2Rdd@:lj1n@0P~2L`F;nN\6o;l0
+8000REGPREgTRmR;ch]C?8MMi>SbLP00ReGPRlR;AN@;bGA@RmZCRDGTRl?X=AX008]Ei8_8Rl>;
+fN\[Rl2;fY>;CA0[cXU5h8_3j;Yb~2ReGPRlR;`h_I2lUe2X_6Pl@PGeiKbL<3d`?c>gD@3h9^
+ooooRGG`RdG`Pl@PGeiKbL=ERnaCEUN3k229A@R9E@b9CA37AO00~3PgP@07@^<oJ=@02;F11;
+REP@RU`H68PJAT8klGD:RlJ3a21OGU_9`h=h401egHUE38Uel8]ml3Um40n6`P0008]Mk8]ej8]5
+28_0PgP400n5F00008]@387j020007<7Rm[[28e00;\08000RGgTRoR;bh]G?8Mmi>SaL@00Rm2;
+AN@;dPn4M00008UMi8_JTh_8Re=<Rl>7GNCX:aT008_8RdGTRDP4RdQ<R@R;D0B;CA0[cc_:MPJ;
+l^\7Rl2;MA0[mhUMh8_>Ra29ANB;G@b;`hMMh>RT1@00Z@00E02;CN2;ANB;40?FRA03cXU=32U`
+10?n>gd@3h9<ooooRGg`RdG`Pl@PGeiKbL<0~=EFQH0080I?le~4Rnb3k0QTRBd0~32l0?Q6X0
+~2SDS`RDglIX5i3]FU3hEH~3I\M13P00PWT<478IDK01j000~2Pl@4RnETS`D0~3Pl@4GL>;COb2
+B@dP<l2:@@b9AOS7@@@0~3P64:06J1H@P008]5n8\DQF1@0`294HT<QF1@0`2;iFB?1@00~2Pl@4
+GL<0~>EFQH0080I?le~4Rnb3k1ATRBd0~3DeIG2l1e4c?0GeiKRnETS`D0~3Pl@4GL>;d8_j<l23
+bOob[X_2mm59RDglRad@=P<0REgdadGh~4Pg\\00n6E@0003?BRl2;n8U5k8]=o8_g<l3b[XU5
+l2_nRln;@cB=?9D0~3R`@hRoR7AO0c`?>VM0DK`8?Hoh]mk8]=l9L;ogD9RgglPS`i?G@8@X_:
+>d\\L[:9EOR;GOB;COPkBbac8h]K=8]=n<7Q0X\42h]Mo0?3@5mNFh_UI8l5~4Pl@4GL<c`5mN
+Fh_UI8l5~4Pl@4GL<0~=EH_\Dh?\38\=43H308^9U04008\I2m]m1oOKja6=@02;7A0f0`2;Vi@1
+~2Ra^1nj05~2OPj;3A0f0`2;BA3[7He008\M43H308^KU04008\;SAb=~4`N46:l^9COB;7A1?
+0`29GOP;fgDVRmRh90000>P^0@00RDGh2l2;`gD8<l23a0aKbL>;GOR97A1?0`1Z0FX1RdgdReGh
+Pn`<j<hB~2Pl@PFlW3~<EH_\Pn`<DeIGRDD8RED<RDd@<m^:F@f;nh?W7hUmo8eJoc_H3hbS~3
+RgGhSD00Rm6=B`Fn0@0003?0PoTO3io0B2?`dnJ;bP?aRT4;R4H;Po\7O229COB=BoVh0@0003?B
+PoTO3io2BR?2ReGddn2;bPQ12hQN38\4WF1@0`291XTdWF1@0`2:D@f0h^2:APdT7`[2R4H=adH4
+~4P6H:06J1IPP004N:APdTh2Go~30lN8APeVadH>~2Bc]M20n=I_ooohUmo8]548YH3H3Sh87S
+o`0000=Mo8QH3H]M28QH35mNFlW3SD00EFQH0080I?le~4RnaTRBd0~3DeN3k2@;`7@5PoS_MQ<c
+`8?495mKI8l5~4Pl@4GL>;f8ek48_7j=EA~2PnP4RmOgfR?G>mL?U<:1h_l0~2:l:9AO2;`cg`
+o`l03hIH~3JQ=GSDgdDK03j000~2Pl@<2l2;`g@C<l23a2AOFfB?1@00~2Pl@4GL>;GOAVad<>
+eJF;GO2;OOB8G`b;GOB90h]5m8?048?495mKI8l5~4Pl@4GL>;GO2=79ePD0<0R`\;bG@?RDgd
+R`V92nWi~3SD00Rdg`@HU=k8?i47dOPcb=H503~2MAF;`463nA1m2X<lSF1@0`00M?29CNb;ENb3
+nQ1d;H_hS@bEH50308\IREgdR`>90LL3~4RdgdRdG`j=[moon9AOB;anVF~3adGX~4Rdg`Pl45
+^`40~2<m:3nAl?Wl9:8m[ChhUMh87k~20@1c4\M5i0000@37ANP1~3j`R;`8]Mh8UMi8_hJQ?o
+MNB=GOAC\0?X~4Pl@<2l2;ag@C<l23a2AOFfB?1@00~2Pl@4GL>3ONP0M22;n8]Mm<L3~4Rdgd
+^P\0~2RdG`j3omoon9AOB;ah]Mm6K7@`kEYH]Ml8]mm8QO38]Mm8T3RdGdPl0@Pl@TGe]TS`D0
+~3Pl@4GL<0~;EH_\EUN7dH_aRoR;b\7Y0_>URlZ3h@?cY8_::oV;aemNbL<0~<EFQH0080I?le
+~4RnaTRBd0~3DeIGPn`PRDD@2l1e5H?8oh?485mNFfB?1@00~2Pl@4GL>;CA29CNR:0C`mM18:
+`7@>@HX1?3ed10[0MOF9CNR;CNP[CA2;7A0f0`29GO37AN`0~3Pg\\00n6E@0003?BRl6;OA29
+AN2;mc?0lZj9AM`[oX_?Rd<dSCbE~4R`@hRoR7AM`c`?>VM0DK`8?Hoh]mg8]=h9L;ogD;RP@8
+?3ed30[0M0Q2Rl8k@bab\8UEk8]Ml8]Ek3]C;0n3C`0008]c=8]Ek<7R0X\l5S?0PlWolZkgdDV;
+Lc0[lHUeh8]e48_n<l23bOob[X]5h?OAB@?1RD<`Re\dRC@C<l23a21OGU]TS`D0~3Pl@4GL>;
+GO2;Dbbi3`0002?:MD:3`Q71hP:;@cCXRP0008U5i0_0MAo71Ea@0`0=~3PlSoPl@PGeiKI8l5
+~4Pl@4GL>;GO2;ANB9@cBSO4`308]Ml8]c;8eF0HUC;<7V0X]C=8]m48Tl<X]c;<7V0X]C=<L4
+<P00~2<l23bOob[_OABD41Bc0c`8?485mNFfB?1@00~2Pl@4GL<0~;EFQH0080I?le~4RnaTRBd0
+~3DeIGPn`LRDD@REDD2l1e6H_2j<?koon3a1aOGU]TS`D0~3Pl@4GL>3OA@0MAb;AA3XCoSooc?0
+Pl@LGeiKI8l5~4Pl@4GL>;CA23jA29CO1VPGT>eJEd53?0Pl@LGeiKI8l5~4Pl@4GL>;CO22N@`@
+3h9Y~3RdDDj5Gkoon9AN`;`7DD<l23a1aOGU]TS`D0~3Pl@4GL>;CO2;0C]557<4j`F;`8]558]e
+l8?648]Mk8_kRlS1j@;cYH_8Pn43ljB;AA3X]?Oooh_3Pl@LGeiKI8l5~4Pl@4GL>3OAC_MQ@c
+`8?475mNFfB?1@00~2Pl@4GL>;MAB=OQ2;anSUC000UX?^18_?mmTScc_?3iC1PN7o~3:o69MNR;
+EO0cbHY:38U=i3_a3hiH~3j9_joon9AN`;`7DD<l23a1aOGU]TS`D0~3Pl@4GL>;AA2;ENb;l8_j
+Reg`Ra^;bl7Y0_>URl^3h@?cY8_bj0Sgoon;aX?475mNFfB?1@00~2Pl@4GL>;ENB;ANPk`Wd8
+Rdg`j4Kioon;AO2;GAB968?048?475mNFfB?1@00~2Pl@4GL<0~<EFQH0080I?le~4RnaTRBd0
+~3Dh?\48U5n0_0MA[71Ea@0`0<~3Pl@@FfB?1@00~2Pl@4GL>;AOSf@4B0M1[71Ea@0`0C~3Pl@@
+FfB?1@00~2Pl@4GL?7AO01~3RdGhPWPe0GDFRdPPRdT@RDQ@ad1D~4jF00~2o8]Mn89k=@0?QE80
+~2Pg]00g@GRl?XGR4000_0M0c7@`@0~3Rd]<R@^=COAAJP1Z08]=n?ma8;04j000~2Pl@@RlP;
+`7@Ga`ELD0<0?00008T=@5P30<M5l000~2Pgg`07@cRdGhad0@~4RdP8P^7nRDP8P^7mRDP8aT0J
+0fK7@3Kooh?445]TS`D0~3Pl@4GL>;AOR2B0P2Pl@@FfB?1@00~2Pl@4GL<0~<j@00~2Qm^@j@00
+~5EH_\DeIGRlZ;d8_iRoLc`8?9oo:^Ro[gdH_IPlWolZi?Rl_1j@;cYH_;Pn43ljB;`UmNFlW3
+~>EH_\EUN;bX_@RoTc`8?9oo:^mm4[nH_bljId1A_0PmSoGek9``00~=EH_\EUN;bX_@RoV;mc?0
+PlWolZkgdH_1Ro[1j@;cYH_8Pn43lj@[n8_7Gek9``00~<EH_\Pn`8RDD8<m:=A@SXbB`008?4
+2<W3~<EH_\Eh_h<l23bOob[_OABH_1GlW3~?EH_\DeIGRoZ;d8_g<\3b[X_2:oj;eh_hRmn3bOlb
+`?:^Rl=?Rl[1j@;cYH_:Pn43ljC61`1OGU_9``00~<EH_\EUN;nX_@RoLc`?:^DB_nRln;nX_1
+`NT2ljF;b8?Q0o>TFC?0ljZ;`UmNbL<0~<EH_\Dh?\=8_HSDg<DK01j000~2Pl@4<lV:CLj9CMPc
+bHY=cHU=g3?9RTg<RDgP<lV:CM29CN@cbHY=dDV9CNPcbFJ;CM:1jF`7~2RDg\adGh100000_K
+M1:=AMSX3TT008_;R@63a3AKbL>=AMSXo4P008?4=5_9``00~<EH_\Pn`<DeIGRED<RDd@RDGl
+2lUd@H8h;7DeSG01RGGlRaeTC`<0<m::5S?0IX\4DoK027@QRl16<lV:3S?0IX\4BoK027G`RGGl
+j`Z=@00c`5mNFlW3adGd~4RdGlPSP]M@k7AO@1~3@8U5o>\=o8]5o88h:gD4@8U5o<M5n000~2
+RceTC`<0RgGl<lV:3S?0IX\4CoK00W@[<m^=@02;`c?KRQj3jc03`8d4P0?HAS?9RPhc`6J;14of
+`09eh8UMn8Ueo8]M38]=o8T;Pggd07@8RdGhmmS[1?b;AOQOGU_9`eF;k5=FEh?\>;Sd>`<0j0gc
+oon9ANb9AO0;`7@5PSP0MEVQ43H308^0U04008?018\=n3\308T8XA0f0`2;P9@1~2a`0\0@00
+XA0f0`2;P9@1~2Pl0\R`gl>`<0R@S71A`g0`1@AP00a`DH=`<00@0008?4>5mNFlW3ReG\RoXc
+`8?9oo:^Qm7gdTZ3nP<?P\L3~2RaD@=P<0RkZD0@00PlL4Ro5VYJB;5A0f0`2;TY@1~2aT87088i
+07@LSE41REG\PSX0M16=D@:9ENb2>P1d1X?10hU=k8]5k88h07DlXA0f0`2;P9@1~2a`00~3XA0f
+0`2;P9@1~2aT0\0<L573L3~5a`DH=`<0~4Pl@hGeiKbL<cbHeEl8]5k>S]oOooRDG8R`d@=P<0
+RhVD0@00RdG8JM0l~3RA6;CO29CNb2>@1e=8\=43H308^9U0400<I1;031h0B=1<2=342=3<R9
+3A`g0`371APg0`00~3Pl@hGeiKbL>Q43H308^hU04008?7;8]Ek8_bIZFTXA0f0`2;P9@1~2aT0_
+08]Mb<7S18dLfhd4Fhd4`j<L=`<0a`DH=`<00@00088j07@C<lV;`491PSX0M0F3n@=lm8UEk8]5
+k88h00n4L@800;T1~3SEG`j23moon9ALR;GLR3n`4?S5D2~2Po\<3hm<0P00RdG`RDG\^@40~2
+SEG`j?Gloon9ALb;AO0kAN`?Q2X2~2Reg<Po_l3h`N0P00Po\43hlE0P00RDG\^@40~2SEG`j<7l
+oon9AM2;GN`iGO0?Q?H1~2Pgg<07DEReg@Po\13hcT0@00Po\O3hoK0@00Pgg<07@DRdG@2l0?
+S<X1~2PoP63ho10@00RdG`RDG\^@40~2SEG`j6[loon9AMB;AO0kAN`?Q9l1~2RDG\^@40~2SEG`
+j4_loon9AMR;GMR3n`4?S801~2Po\<3hmg0@00RdG`RDG\^@40~2SEG`j23loon9AMb;AO0kAN`?
+Q5D1~2RegLPo_l3ha90@00Po\43hm00@00RDG\^@40~2SEG`j>ckoon9AN2;GN`iGO0?Q241~2
+PggL07DERegPPo\13h`?0@00Po\O3hl60@00PggL07@DRdGP2l0?S?D0~2PoP63ho\~3RdG`RDG\
+^@40~2SEG`j9Gkoon9ANB;AO0kAN`?Q<X0~2RDG\^@40~2SEG`j7Kkoon9ANR;GO0kGN`?Q:\0
+~2PS\03hFR~3Rad@=P<0Ri^D0@00Rdg8RD\8Rdg<Rad@=P<0Ri^D0@00RD\@Rdg@Rad@=P<0Ri^D
+0@00RD\HRdgDRad@=P<0Ri^D0@00RD\PRdgHRad@=P<0Ri^D0@00RD\<RdgLRad@=P<0Ri^D0@00
+RD\DRdgPRad@=P<0Ri^D0@00RD\LRdgTRad@=P<0Ri^D0@00RD\TRdgXRad@=P<0Ri^D0@00RD\X
+Pl@hGeiKbL<0~;EH_\DeLk`WhK>lQo2c_:O0Lcfn\8SD00^`40~2Ro_[5he003_8OP`kbWd8^`40
+~2j`?l<m^;n`_oMCHkb7DGRad@=P<0Rk^D0@00RelX0elP>edDOQ\kbWDPRad@=P<0Rk^D0@00
+RelT:elX>edDOPVh0P0005mKbL<kb7DVRad@=P<0Rh>D0@00RePPRgdD>mmo40=H:3_OOPVh0@00
+05mKbL<kbWDaXA0f0`2;^9@1~2RdLTRedD>l=n72]7:3_3OaF3OAP0M0Vh0`000>\4Rl0c`5mK
+bL<c`5mKbL=ERnb3k0QCEUL;bG@CRad@=P<0Ri^D0@00Re\8ja6;`8\M43H308^KU04008]K38UM
+o0_9M1:;?A0f0`2;_i@1~2Rgl@ja3lRad@=P<0Ri^D0@00Rg\DRGgh2lUd4X\M43H308^KU040
+08]K6>\@o8\M43H308^KU04008]K78_hRdglR`b:RdDD0l63`0Fn1`0009WgoX_70l\[bX]Mn?OK
+Bhdlg@00~2:o\[cdV925mNFlW3Rl1ERnb3k0QCEUL;bG@CRad@=P<0Ri^D0@00Re\8ja6;`8\M
+43H308^KU04008]K38UMo0_9M1:;?A0f0`2;_i@1~2Rgl@ja3lRad@=P<0Ri^D0@00Rg\DRGgh
+2lUd4X\M43H308^KU04008]K6>\@o8\M43H308^KU04008]K78_8RgglRgbjo4N;AA@3ah?01Kh7
+~3VOOnmmZ3`PNn1`0008_2VOOnRl6;MOQ>S@ce~4:lh3b`?:0lm9R@QOGU_9`he005F;k5>9E@b9
+CA2;5A0f0`2;TY@1~2PgX@07D@ReX8Re8H0eBIo4Z94>]7o8\M43H308^KU04008=k401n7X_H
+ogDD^@40~2ReD@Pn`<j>Gnoon;`h?44>\HRl3oMABi0@0008]E48?\3>PAo_ooPl@@XA0f0`2;
+V9@1~2Pg\D07DFRdD@Rd\<Re\L0eb8o4^;A@b965_9`j4@=P<0Rh2D0@00PgPD07h?ReD@RdD<
+<lUKbNUoo_ooReD@RdD<<lUKbNVhoOooEH_\Pn`TDeIGRED<2l1d1H<hogD7<l1OGU_9`h\@:m69
+EOP;dWd7<l1OGU_9`h]=n8_1^h1A0@2Imo^;f8fk:eh008Umk8d4_@00~2_[D5~2VOOnRo29MNQ8
+VHOjUX?W0`?g`Oh2JOQ]0@000oj9OM`[edZ9EOC1h`N=7=^=5=^=59>=55<[bXU=o9Tc`R_2Pn03
+<l8[`WD:^3@l0`3[28e00;P0?0<0RDG`PgdD00n4kP0008\M43H308^KU040089k;01e48]M3<M3
+8?oooooYe`000?coMMb;CO2=EN2=ANB3k0cXC?kooh]M60_K3iC1PN7o~3DOmeo8]=m8]Eh8]5
+i8?\3>S9noooPl@TRdd<RD4P2m]e2H?h0@n5R@0008]M38=k800?SW`0~2Rad@=P<0Ri^D0@00
+RdGl0d<X^h1A0@2Imo\;`7i0odG\PGgdK@4007D8odGX<l3[2?b;AOA0RDGdRDGdRad@=P<0Ri^D
+0@00RdGl0d<X^h1A0@2Imo^9EOc[8He00:4@=P<0Rh2D0@00Rd0X0DGlj`_lRdD<ad0P~4RdGX
+Pl04ReD<RD8DRegdREXLad8@~4RgG`PlH4RGG`>Aio3Om248?613TNO_J9MO2;CO23j@B9CO2;
+M@b;GQ`[6D>9GPb;ANb3`0Fk1`0009WgnhUF68]mo8_7^a0>~2VOOkRlZ;f8UN28d4W@00~2`N<6
+:mR;akll~3VOOo:l>9APBk?00008_1VOOkRlJ945mNFlW3~?EH_\3j\@^000~23i;0bL>@~3EH_\
+Dh?\38U528UE3<M5n000~2PgQ00g@ORdQ4Pn41MAN2N1X2MA7XRa<008?h0GD7adGhoooooh=m
+n00?QK00~2Rdd8<l2:@CD;`7@ePoP1M0SYR`0008e008]528]8A8?Q0GD=Rd0PodP8jH40~2Rl2;
+A@R;@23XcGP00>U_~3Red8og<P\07X~4Pl@4RDGh2l1e6_I3A05d;omc<;01j000~2Pl@4RDGh
+2l1d6h]5289820;71Ea@0`0l~3RdGhXd1H0`3[8h]=2?ma?;01j000~2Pl@4ja6;`;[k~3^6Pl
+0`3X7G<008=mn01e3h]E38]52>R`JP00j`V;`<M5n?oooon;AOR3a0aKbL<0~;EH_\DeIGPn`X
+RDD8RED<RDd@mT080W@Aad04~4<l23a2QOGU_9`h]528]`?8Uel8]m38Umk89h=01e6h]548_@
+Rl[1j@;cYH_:Pn43ljB3a2QOGU_9`h]548?h0GHSRdg`PW`1o`d?QGd0~2B8U548]526K7@3H=
+0>U[~3SD00Reg`RP^;MNb83X8k3@n5B00008\=G50308U=j;T1~3Rm>;O@R;anScE`00PoP1MAZ:
+2h;i2W@;IX7Qo`1VRDlfjaN;ANc600[[3h]5j:=LD0<0RdD8PV08o[P1~3Pl@XGeiKbL>;GO29
+GNBh3@0008]e28_k:ghlReD@RlX[ch]mi0_TlZj=Oomd0S?oRlZ;aP_o3hBh~3RmN;MNb=@022
+NP4:MCZ9AMR;aXU=g9>;l8_kREgPRmX[f8_3RlS1j@;cYH_8RdGHPn43ljB;CMb;MN03llH62TJ=
+FP;[=X_0Roj9CMb7nhU5h8_::lm1RoN;nh_1RDgH`NT2ljF;b8]5h8?Q0o>TRdgLRggHRo>=FP43
+mhUeh8_iRm29GMbh3@0008_c:g8lQggL:lj;MN0;i?:^SGooM08coh]=g8_2RmL;o`n5E_ooohUe
+k8UMl8]El8]Mk8_bRo^;A@P[D3b;AA0[`X_@Rl[1j@;cYH_:Pn43lj@[G@`3`h?4:5mNFlW3~2
+EH_\Pn`8RlZImoV9AOR9EOb;A@R;COR928]=o8U81<W3~?EH_\DeIGPNb8~3RDD8RDd@2lUd20_0
+MA8;dWD>PlSoPLB8~3GeiKbL<;dWDNPgd80GDHa`ELD0<0300008?8oh74R00005mNFlW3RdD8
+RDF@2l1e3<M5c9C10@29EIC[?H_J^?01~2j?SWoon;dhU5W0_0MAO71Ea@0`0=~3adGPooooonWo
+2000o8UEU<M5X000~2adG<U<810<M5h000~2PgdH00nD`8Q5YX]m]8]=48_GRmV;nc?0PlWolZkg
+dB_i^2D0~2lZj=Oomd0S?oRl^7ehUE`0_B3h@V2000JR1Z02_CDU>=EI1B\0GoELb;bh?458?h
+nWD;megPj@<8~2SD00RmV;CL2;AN03`B_3RDGP@LM5f000~2^`40~2<oJ;`8_A@C?0RP:3j223
+n10?QhT0~2obB5@;T108_0W;T10<2i0@30^@40Z;T10<2i0@30^@40`;T10<2i0@30^@40`;T1
+0<2i0@2@^@40`;T108Bi0@30^@40`;T10;Bi0@2;aX;80H_`jcJ=@02;aX;80X_`jbZ=@02;aX;8
+18_`jaj=@02;aX;828_`ja:=@02;aX;848_`j`J=@00cfdT;f`n5FOoooh_FREGHPSTZMB>;AAB=
+F0B9GAB;08U5e0_0O@f2bP6;lXUef?OHRDGD@N\do<M5e000~2RaeTC`<0<oKl<m::4FJ;15>3
+h09d4h_6Ro:3kS03`8d4P0?`@N_RRl29MMB2>Bid3<M5g?oooooYD`0008_a@H8i:WDHRlj;AAB=
+F0B9GAB;08U5g8?10^\fSD00adGL~4RaeTC`<0<oKl<m::4FJ;15>3h09d4h_6Ro:3kS03`8d4
+P0?`@N_RRl29MMb:0CaXM0PlK7@4?4ae2hX1R4FW@N\7SD00aTFW83?0RP63n2D?Q><0~2PnQ5
+PoPc3hLO1P00obB5c;X108bl0@2<_040S;`10>C00@3T`040i<010>C00@3T`040i<010>C00@3T
+`040i<010>C00@3T`040i<010>C00@3T`040i<010>C00@0d_@40i<010>C00@3T`040i<010>C0
+0@3T`040i<010>C00@3T`040i<010;bk0@0d_@40S;`108bl0@2<_040i<0103Bm0@3T`040i<01
+0>C00@3T`040a;l103Bm0@0d_@40i<010>C00@3l_`40i<0103Bm0@3T`040i<0103Bm0@2;fFXP
+JP1Z0E>=AI1@\0GoELb;bh?458U5j>Ta1@00o89mYf`?QGH0~2RmV;AAB=D0B9EAAVRa2=AJ[X
+m7L008_;RDGXPoSoM@k7ANP0~3jOX4~2Rl2;AM@[ANR9AM0;`7l;adG@~4j`^;`?I5f05d0oMM
+d8_IJR3oMM2;ANQ@SDFZD8e5T52`1OmEc8_;Pl@DRDGXjK84~2Rl2;AAB=F0B9GAB;08Q5ZX]5
+e4R9AM0;`7d;adG@~4j`^;`?I5f05d0oMMd8_IJR3oMM1Z0He5ZU2=AI1@\0GoELb;bh?458U5
+j>UP1000PSU6MA>2OJH0M0g7ANP0~3BNU81000RP68AJ^;ALb9AIR:AJN8AJZ2OJY<MBF;GAB=
+@a29AAB;0hV5M?oooh]318V5N?oooh]328V5O?ooon\DRedDSD<8RDDDR`>9ANb;@`B9AO22OJM<
+M@Z=QGCoooo[1H_0SDG\RmWoMAR=EJYBogGLogGDRdgHSEF@Pn`<j91g~2Rl^3a1b9ANSY^`<0
+08e0089mYfQe5X8iL7@ARdDDSEP4REdD3kl0RDGTj`j;AAB=F0B9GAB;08U5i8=mg01m3<M5g040
+~2jan=@023OM`0MA:3ON@0M@c7ANP0~3jF@3~2PVGHkh8iL7D;aTFZK<I5ZeS[3?b:AJN8AJZ:
+0HQ5ZhemShUm[89mZfme2LM5^0P0~2ja^:AJ\lN7@4?5Qe2LM5^100~2j`O7AKP:~3adG8~4RTF[
+?6Ad23aY3hE0~3RdGT2l1m5<I5Z2g7ALP1~3mmR9ANC[9h_0mTGH0W@>aTFX:lM5b040~2ja;l
+mTGH17@;aTFX8<M5b040~2PWf[F7D9^1100`3[1h_0^2A00`29AK22OJYXM@eVRegTPN?oo`00
+REgTRgGT2oId9X]E\8]M^8U=4?a?RlJ;lS?Bmo>7lXX<<XP?Ro0;`7GZRGGTRdd@SEf?:mn9GKb;
+AM`[`hU5i0_0OPC[18_0<l29ALCfAMP83h@i~3Pgfl07HcPWf[KgDARmR3n`5c9\M5a040~2jagl
+RTF[?7Qd13aHMA76AJP`RTF[R4FYadG80P0008]5e2]5_2]5b2]5a8U5i0_0ORGfAMP1M0Ogf8U5
+i>\OmTGH47@IRdGT0DG4adGT~4j`Z=@037AN@0~3RdGT2l1n0^\2<l2;fFXPD?meb8eEZ5:=EI1B
+\0F;MLcoeX_;RmJ3a1B9ANR3n?Yd6VX`RdG4D?me_5N=AI1@\0GodX_;Pl@DRDGXPggXnW@XRdGT
+2l1m1N\5SD00<l2;fFXPD6X0JP2=EI1B\0GoELb;bh?458U5j8=mj?X?Q4H1~2RdGTVC?2:l:;
+GL@3GK`3GLP3f8UMj>T[0@00SD00PWfWJ7DFRdDDSEP4REdDR`2;GN1VRAS[4he008]558eH18UM
+58\0RegPRAS7ANP0~3jO00~2RdDDSEP4REdDR`29AL0;`7DZadGXn_oooh=mX00?Q<d0~2RmV=
+AI1@\07X408008_;Pl@4jKH0~2Rl22OJM\MBj;fH]5c8U5V?meg?mee?mef8e5T53oML2`1NRW
+1000Rl^3a1B9ANSYPP0008_0RoN;fH]m`3?0PlWolZj7fH_nmm=;REgXPggL07d6REgLja?lRdGX
+>dGLO@C[1H_0RdGLRDGXRdGD:dGXRDG@2l1m2LM5d000~2j`WfAMP1M0?gGM2;fFXPogG@RdGX
+D?me`8e5T52`1OmEc8_;Pl@DRDGXj`Z;`<M5j000~2BH=mj?Ye1_MMh>\=o46;ANP1AN3Y[?Oo
+ohUm]8U=48]Mh0_K3haS~3ReD@RoXc`8?9oo:^mm59RDgXJR1Z055BSEF@D[05oeG<Pl@DPoSj
+M@[gfhUMh>\cSD00RdGX0DGPPgd807D8RdFDaP00jab3OJ00M1J=CI1A\07Xc`0008?418?hnWD3
+megPPgd807@8RdFLj8KKoon;AN21a8P0~2GeiKbL=ERnaCEUN;MA@;mWh^<l2:AAR:h8_8`N4@
+2l6;E@R;NPB;gX_;`NT2lj^;bh?Q0o>ZRlj;@P@3`HU218]E40_BMR6;A@R;N0B;M@b;fX_;`NT2
+ljF;bh?Q0o>TReP40mZ9F0B;MA@;mWdammj9MA@c`8Y568[PRmS1ha0;`h]M28]k18_FRl[1j@;c
+Zh_:Pn43ljZ;D`@3eXUC18]550=545mNFlW3Rl1ERnb3k0b;A@R3>05e7H]848]@18]03>QDG000
+PoSoMBJhn_oooh?43<W3Rdd8Re4@Rd4<j8=b~22l1d2[SjooooPl@<bL>;C@S7@A00~3<l23a0c9
+`eF;k8?\55=FElM5o000~2RgD8Reh@mm^1`o01~2REghRgdD2ol?SZh0~2RGglRUDHRl0kn`n<
+H00008Uml0nf`XUEm8[PRlS1hA0;`H]n38]>48Uek0?iRm>;lX_>`NT2lj^;cX]ek8?Q0o>ZRgg`
+0EH@E[01j2cooon;EOB3a0B3n?Ye2LM5o?[oooo[32_k^o01~2ji^=@028EAR9OAB9GOPc`8Y5
+68[PRlS1hA0;`H]e28]n38]>40?iReDDRmZ;bl7Y0_>[Rl^3h@?cZP5F48]e52Uen8]E40_B3hJh
+~3RdGlPoSj3hB\~30l:9AOb;O@b;MOR;G@SlRlHk`Pn7GP0008Uek8_?REG`Rg\<Re<@0oZ;lHU=
+m8_@Rl[1j@;cYH_:ReG\Pn43ljB;OOB;lP5345>`0NQVo_ooReG`Pl@4PoSjM@_7AOcjooooja:;
+`8_6:m03o[k`0@00ji^=@029EA29O@b9MOR;A@R;N0b;F103nh]e38]M48_CRl[1j@;cYH_:Pn43
+lj@1F12;AOP[`hU5n8]m50_o3hfm~3RdGlPoSj3hBa~3mmn9OA@3ahU5o8YE68]Mn8]e2?`kn`n<
+H00008Uml0nf`XUEk8[PRlS1hA0;`H]n38]>48Uem0?iRm>;lX_>`NT2lj^;cX]em8?Q0o>ZRgg`
+0EH@E[01j9Smoon;ENb3a0B3n?Ye2LM5o?[oooo[32_k^o01~2ji^=@028EAR9OA@c`8Y568[P
+RlS1hA0;`H]e28]n38]>40?iReDDRmZ;bl7Y0_>[Rl^3h@?cZP5F48]5o5mNFlW3SD00EH_\DeIG
+Pn`PPgdH00n==`0008]=28U=j6J3>@1d3Ob3`@9VPcT0MON9CNR;ANP[A@RIPn810l;An8U568]=
+48?Q27D5dN29AAR3OAP0MB2;C@b;D@QZ8?me56X0ogD8DK05om:3a1B9AO3Y>P400?I540P?Q9H0
+~2RdDHdN3Xf=[oohU5k0_0MAW7AO3jooooa`ELD0<03@000>Vi~3SD00Reg\REgPRgD8RGGXRgdH
+2ol?Q3d0~2IX<n07@gRdg`IX\FRl?XoVd008_8PoSoM@Nin_ooon\@0mU?PlH22omd1VJ3?P1e
+f8U=l8Um68UMh8Uej8=ml?X?Q5P0~2RdGP:dG\RDG`jDX0~2RdDHj4CJoon9AN`;`7DEadG`n_oo
+olL5G50300d0~2jbR;`8]M68_3j1kJoon;bhU5k8]E2>P1K000RDG`PoSoM@O7AO3jooooReg`
+Po_j3h@l~3RdDD:l>9AN@;`7d:adGT~4j`[lmTD@0G@3megTRdd<Rg48JR3oMNB;EO1BogG\DK05
+omJ3a1B9AO2;ANcXG]Kooh]5l8?485mNFlW3~?EH_\Pn`8^Qh0~2XA0f0`23`2CXY>goo`_03hG:
+~3R`d@=P<0mT4T0Pn5^P000>S7~3X@Pf0`3XNLSooj4<=P<0j6o8oon;3@`f0`2;BC`;bG@;DK01
+j000~2Pl@4R`d4=P<0RdTl2lUd2e6`0NP0~3Pl@4R`d8=P<0RdTl2lUd2e6`0NP0~3Pl@4<m:Q
+13H30>SWF000<m:Q23H30>SKF000<m:Q33H30>S?F000R`d@=P<0Rd4dj87EoonQI4l308?X0^Qd
+eOooR`d@=P<0Rh5H0@00j6?Eoon3a0S9j@YM~2Pl@8bL<0~<EFQH0080I?le~4RnaTRBd0~3Pn`D
+adGl~4XA0f0`2;P;01~2RDGh2l1d?8_0RdGhRdPTRDgdRdQ4Pn4PMAlcd^R8k?oo2l1e2?m5o>\?
+SD00adGlooooon\=SD00RdGdRDGh2l1eaX]5o8?456B?1@00~2Pl@4GL<0~;EH_\DeIGPn`DRDD8
+mT080W@Ga`ELD0<020000;P1~3Pl@DGeiKbL>;C@R2NAX0M@k6@AX4<l23a1AOGU_9`h]=28=i
+@0=e5LM14000~2aT4J13?0Pl@DGeiKbL>;A@R;B0B9CO1VPgPfog@:@HU=l6K7@3Kooh]e289n
+6P4?QLl0~2adH@~4ReG`2m8?Q:L0~2RdI49H00~23hFI~3PWhd0@n5C00008\n^0X0~2Rdh42nCb
+[Xeoog@2<on;aP_oM36;mh_>Ro12@H_i^0X0~2RmT[7X]>12_;2nCb[Xeoog@2<on;aX_g2ome
+ehUEl8U528e=k55Z0H]=l?OIDH]=2?ma8;04j000~2Pl@@2l1d7<L5G50303`0~2Xd1H0`2h0@00
+08?455mNFlW3RdD8PV15kh]528]HC8THad04~4jDH0~2Rl2;G@R2NaX2MC^;OO2;ch]CC8_3j4`0
+~2>lMd6LM31000~2Rd]<R@^h0@0008?455mNFlW3RdD8ad04~4ReQ<RAR;G@S6@aX4<l23a1AO
+GU_9``00~=EH_\Pn`XDeIGRDD8RmR9E@b9CA37AM`0~3adGl~4adG\~4mT<h17@hSD=8D6X2JP3o
+Lb2`1>P0~3Pl@@RDGX2l1d7<L5G50303`0~2Xd1H0`2;`h98208c`5mNFlW3Red8PW\d0@n53P<0
+08]538U5n8]548U5l<M5m00P~2Re\lREgT2l0?QW\2~2SD00ReghRo^h2P0008]=l0_TlZj=Oomd
+0S?o2ol?Q2P2~2:o^9ON0kOOAc1X_7j`F;`8]5m8_@ReghRdGTRo>9GMR;n8_JRl_1j@;cYH_;
+RegHPn43ljB;nh_b0oj9OOP3aXU5i8]Mm2_NREgdReG`:mJ9EO0YMN2;CN`3cXU=k8?k0Pn2\@00
+06J;=G`l0`1VRC17RGgh@HU=k8?00XU5i4Z9EO23j`:9GOCoAM`;f`n5^P4008eMo5=X020008]M
+2?mc??mc8;04j000~2Pl@@RDGXPGgl020007D42l1d>h]M289;20;71Ea@0`0l~3RdGX2l1d1>\7
+Rl2h7@000:=0F0<0RegLmm^1``0P~2RdG\:l=OGU_9`lM5g000~2RdD8Rd0lRDGTadGd02000>Tg
+0@00o8e=o56;GOCgfh73020005>;C@SoLCcoLB2`1>P0~3Pl@@RDGX>eglM@@;`7@oRed8PT\8
+0\L5G50303`0~2RdGX2l1d1N\8SD00^1d0~2Xd1H0`2;GOCgfh73020008]5g0=5k2_3GeiKbL>;
+GN0;f`n6I@0008e=o55CogGhRdd8og4P\0CX~4Pl@@RDGX>EglM@@;`7@]Red8PT\80\L5G503
+03`0~2RdGX2l1d0n\6o;PM~3Xd1H0`2;ANaOGU_9`h]5o2U5h2U5l8]Mn0?HREgh0DG\RdD8Rd0l
+IX\MOc`306J96?m5n8?00XU5i?m5k?m=l<M5m?hO~2adGL0@000>\YSD00RgGhRggTRdG`RmR;
+bl7Y0_>URl^3h@?cY055k2U5m<M5l000~2Pgg`00n7R?goohe=o56;GOCgfh73020005>;C@So
+LCcoLB2`1>P0~3Pl@@RDGX>eglM@P;`0n4T@0008]M289;20;71Ea@0`0l~3RdGX2l1d1N\8SD00
+^1d0~2Xd1H0`2;GOCgfh73020008]5g0=5k2_3GeiKbL>=COaARed@Dome38]=2?ma8;04j000
+~2Pl@@RDGX>EglM@@;`7@URed8PT\80\L5G50303`0~2RdGX2l1d0n\6o;PM~3Xd1H0`2;AOb9
+ANb;ANaOGU_9``00~:EH_\Dh?\78U528UE3<M5l000~2adG\0@000<H20LI20@?7@PP0~3ad8<
+01000<M21000~2ad8@3P0008\=I4l303?KRQPcdVJ;55Wf`PQd5?a0<m::43?KIX\LDOK327G`
+RDD8Red8<l2:0h?XHH?h5Pn7RP000?lTQGC>0@2=@03XcP40m<h10?C>0@3dcP40m<h10?C>0@3d
+cP40m<h10?C>0@3dcP40m<h10?C>0@3dcP40m<h10?C>0@3dcP40m<h10=3>0@3dcP40m<h10?C>
+0@3dcP40g<h108]53898107[8he008]5389810;[5he008]5389810C[2he00>TI1P00SD00Red8
+@hUM23?0RP>3n2]d38?hHW@WjD80~2Rl2;G@b2B`@8RdD8SDP1RDd8PSURMB_60`23`0:9A@S[
+88]M3<H308]528e80HU=288i:gD<PT\428?00XU52>\0RdD8PSP03hBP1@00R`eTC`<0RdD8<m::
+43?KIX\LDOK327@H@3?BRQ0cffJ;757f``Qel8U52>\ESD00Pgg\07@<RdD8PSP\3hE\1@00XFA?
+0`2;C@PcfhXIIX^4F0@4~23ko02l0?Q3<5~2PoP\M6:3j6:3n18?Qah5~2obB5h<l108e004c@
+0@3de040m=@10?CD0@3de040m=@10?CD0@3de040m=@10?CD0@2<d@40m=@10?CD0@3de040m=@1
+0?CD0@3<dP40m=@100SD0@23OO003hGL1000odD8adG`0@000<M5k000~2jJ`4~2^@L0~2^SQ0
+0`2;G@R;`nPhGP002l2;``n5Z0@008?01hU528\=I4l303?KRQPcdVJ;55Wf`PQd5Xe0040cdXX@
+<m]VRaaAm\<8MO29A@R;G@R=@`69A@R2>cd?QFD4~2R`eTC`<0<m::43?KIX\LDOK327@ERl10
+<m::43?KIX\LDOK327G`RDD8^@X0~2SEGdRed8Rl?XQel008U5n3]Mm0n47@@008]=3?I1405d
+73gdO`00MS?71Ea@0`0a~3^040~2Pl@LFlW3PGghn7l007HEa`ELD0<0<@000;P1~3Pl@LFlW3
+Red<Rd\@Pn42MAf;COPiB`Qf5LL5G50303<0~2^040~2Pl@LFlW3Regh2m]d2X]538UH389P4?^;
+AOB9A@S7AO00~3adG\0@000>U^0`00Rl2i1@000;Y0@0<0Red8Rl?Xn5`000_0Rl<?QFP3~2Pl05
+RDD8R`eTC`<0<m^:63?BIX\DFOK227@FSD00@3?BRQ0cffJ;757f``Qel8U528]M28e30HU5288k
+?@n59@<008\=I4l303?BRQ0cffJ;757f``Qd5H_0@3?BRQ0cffJ;757f``Qel8U52;T:~3SEGd
+Red8Rl?XAeh008U5n3]Mm0n4g@8008]=3?I1405d73gdO`00MS?71Ea@0`0a~3^040~2Pl@LFlW3
+PGghn7l007HEa`ELD0<0<@000;P1~3Pl@LFlW3Red<Rd\@Pn44MAf;COPiB`ac5LL5G50303<0
+~2^040~2Pl@LFlW3Regh2m]d2X]538UH289P4?f;AOB9A@S7AO00~3adG\0@000>T^0P00Rl2i
+1@000;Y8@0<0Red8Rl?X^5\000_0Rl<?QBP2~2Pl05RDD8R`eTC`<0<m^:63?BIX\DFOK227@F
+SD00@3?BRQ0cffJ;757f``Qel8U528]M28e30HU5288k?@n5i@4008\=I4l303?BRQ0cffJ;757f
+``Qd5H_0@3?BRQ0cffJ;757f``Qel8U52:5TC`<0Rdd8<m^:6FJ;Q5P410003ko0PoQVM0f3n7Id
+5>U3~3SD00RdD<PV0@o^\oSD00Red<Rd\@Pn44MAj1N`cdO`00MQG71Ea@0`0a~3^040~2Pl@L
+FlW3RdD<PTP@0N\:Rl3YC@4008e008]528e@0HUE28\MI4l303?9RPYVPka;10@0069e1X?00XU5
+28]5389P4?O7AO00~3adG\0@000>Wb~3Rl2i10000;Y@@0<0Red8Rl?XO5X000_0Rl<?QN`0~2
+Pl04RDD8R`eTC`<0<m^:63?BIX\DFOK227@FSD00@3?BRQ0cffJ;757f``Qel8U528]M28e30HU5
+288k?@n5Z@0008\=I4l303?BRQ0cffJ;757f``Qd5H_0@3?BRQ0cffJ;757f``Qel8U52:5TC`<0
+Rdd8<m^:6FJ;Q5P410003ko0PoQ]M0G[;he00;T6~3^UQ00`2;G@R;`nS@F@002l0?QD80~2Rdd<
+aT410H?31XUM2>\5o>\`Rl37AO00~3adG\0@000>\4jab;`8]5288h00n5H?[ooh=ml01e23?0
+Pl@LFlW3a`ELD0<00`000;P1~3Pl@LFlW3~=EH_\Dh?\98U528UE38e=g8U=m0_0MCF;3IAC0`29
+COP;bGDN^>`0~2j?k:oonSU5<308U5n0_0M@Pc`8?495_9`j5LD0<0RDG`jc>;3C1H0`29COP;
+bGDN^>`0~2j<W:oonS<5P308U5n0_0M@Pc`8?495_9`h]528\0RDG`Pgg`?7DSocE0F0<0^X@l
+0`2;AOB3k0SXhK;ooh?43<M5k040~2j`SladG\~4ogG\SDgdDH]=38]Mn8_CRdG`Pn`<j0<c~2
+Rl>3a3QKbL<0~>EH_\bNVoGP00SD00EH_\Rd08bNWlB`00EH_\Dh]8288i07D8Pl_oja2=@02;
+B0R=F@69F0PcfhXIRl=KbL>;`5F;k8?hog@6bNV2GP00bL=ERnb3n?md2H]B2<WY@e\00<W3o5F;
+k8?hog@3odX8bL>=@01ERnaCPna0RDd@adGd~4adGh~42lUe23?0PlA0FlW3PoP1M0N3n09d8^\`
+2m9e2H?8oh?4@5_9`lM5i23F0@37ANQTeP40REG\jbk7AN@DeP40adGXE=H10>\N2m9e2H?8oh?4
+@5_9`lM5i2cF0@37ANQheP40REG\RdDDRDGLRdDHRDGPRl2;CA0c`8X12l1d2H?h9G@<jbj;`>VK
+~3SD00ReD@@Xe5b>Pd4@00RDD@RdgdSEG8SDGTj2\H~2RDG`jaf;`8eEi8]M48X3j0<1~2RDG`
+@hUM4<M5b040~2RdG`Pl06PoP5Mc[o98F4e`40SD00[=L10;CG0@2de`40ZML10;CG0@2Le`40
+Pggh07l7adGhooooon\Mo?m=4>UPooooRdG`0DGdPgg807D3odGhjDcooon;AOR3a41KbL>=@01E
+RnaCEUN3k129A@R9E@b9CA37AO00~3PgT407D:<l23a11OGU_9`h]M38\cRl?oeX_CRDG\RmR;
+MO2;A@SlPo_oM2>;CA0iL@An6`_0M0>8642;fX_hAX\CRl?odX_CRmR;an_Io8UMk8Uel8]E38]b
+18]5k?oFRdG`2l1n1>\5Rl23b?n3a11OGU_9`oaERnaCEh?\48Q528_8RED<adG`~4XFA?0`0?
+]]TcbFJ;35Sf`@Qd>h_0RmZ;4h_3om:;dhU5m8\MI4l306J;34>3h@Qd2?m5l>_OSD00ReD<RdX4
+RdGdom6;AO23a11OFlW3RdD<Ra3odXU5m3?9RTd8>l5e3;P1~3Pl@@Ge_9`h]E38]:18]mm8_7
+om63oome1X?8on\6o;SmooooPl@@Ge_9`eF;k8?\3=]m33?9RTP8PoU<M363nFad2>UC~3SD00
+RdPDSE44RE0DR`V9CO`;bGD4<l39`h]=o=]]3=dIjD\0~2o8]858eA18U@58\9RDgh2lUe13?0
+bL>;COR;E@b94H]E48UA18]E58UA2>\NRdPDSE44RE0DR`V9CO@;bGD4<l39`h]5m=]]3=TH^040
+~2bL>=@01ERnb3k1ACEc?KRUP8Po]<3hBN~3Po]\M0GY>04008]H58ek18Uh58\KREgl2m]e1S?0
+Ge_9`h_IPo\1M0f3n`=d?>VB0@00SD002m9d78]Mo8\mC44308TkRce@@@<0RG\4jG81~2SD00
+Reglg@E<@@<0fN3M6nUM0@00Rl0;dW@LReglRcd\@@<0RC^;?C110`29N`CY?P4008e008]Mo=d5
+;4430=WPgA_Y:@4008_0RePDSG\4RGPDRa^9GOP;fgD6<l1OFlW3RmV3n`5d3H?k0gA4jOh0~2
+SD002m9d98]Mn8\m\T4308TkRcff@@<0RG\4Rcfj@@<0RG\8jMD0~2Rl2;GOSK;K910`3Ih=\k
+jL40~2Rl0;dW@TReghRcg6@@<0RC^;?LY10`29N`B;?Li10`29N`SYV@0008_0Reghfbg6@@<0
+fN3K>nV5~3Rl2;F1B=N`B9N1B;6hUMm0_KM@Hc`5mKbL>3n@5d2h?i0g@fjE`0~2o0_BM12;AOB;
+7Ga10`296>]:SD00RdGdRael@@<0PO<0~2P8UMl=U5l=THjbj=@00;dW@@RdGdRaf4@@<0RAS[
+6Xe008]5m8\MQ443087c~3P8UMk=U5k=TH^040~2Ge_9`eF;k<J49?o_ool0DeIGPNb\4`00RDD8
+RED<Rm[7ANP0~3adGP~4adG@~4adGL~4adGH0@0008];18U=i0_9MB^3>`1e6M\]L4l308_3j2Wm
+oon;d`_0M@K70P40~2<l21a:`C~2GeiKbL>;A@SlRmR;4ooBThUMl8\EI4l306J;35Z3h@Qd1om5
+j>_RRl37AMAF4`00adG8~4adG<~4adG4~4adG0~4SHEPk?ooRDG\RdG`PoP]M0F3n2]e>h]Mi4^9
+GNAe4;SmooooPLB\4`00GeiKbL>;AO2;GNb80d>9GNb3n2ee1lM5f000~2RdD8Ra3odXU5l8]5
+38=h600?Q5h2~2RdG`PoQ>M0V3n6h?QIL0~2Red8Ra>;`ooBRm>9AO23n65d6X?h@G@ERdX4om6h
+oOoooh74[1<005mNFlW3Red8Ra>;`ooBRm>9AO23n4id6X?hKW@ERdX4om6hoOoooh74[1<005mN
+FlW3Red<Pc\0MAVi0@0008]Ef8_3j87lool;`7D6a`<1~3RdG\0dGXSIePk?oo:l>3`0>1a:`C
+~2GeiKbL>;AO23n6Ud2H?hB@n5Y@4008]M28\CRl?odX_CRDG`PoQ^M1Z3n4id5H]:1?oA^?go
+oon1a:`C~2GeiKbL>;G@R;4h_3om:;dhU5l8?hIW@JPoQ6M1F;BPCodKSmooooPLB\4`00GeiK
+bL>;G@R;4h_3om:;dhU5l8?hJGA7PoQ9M4:;BPCodH]M38<k07DI^@<0~2ReGHRl?X_?_oo`_0
+M@K70`40~2RdG\0dGXSIePk?oo:l>3`0>1a:`C~2GeiKbL>;G@R;4h_3om:;dhU5l8?hKW@JPoQ>
+M1F;BPCodKSmooooPLB\4`00GeiKbL>;G@R;4h_3om:;dhU5l8?hJG@JPoQ9M1F;BPCodKSmoooo
+PLB\4`00GeiKbL>;G@R;4h_3om:;dhU5l8?hM7@JPoQDM1F;BPCodKSmooooPLB\4`00GeiKbL>;
+G@R;4h_3om:;dhU5l8?hNG@JPoQIM1F;BPCodKSmooooPLB\4`00GeiKbL>;G@b3>`1e6KT3~3
+ReGHRl?Xbo[oo`_0M@K70`40~2RdG\0dGXSIePk?oo:l>3`0R1a:`C~2GeiKbL>;ANc60310RDG\
+Rdg0Rgg@Reg`RgFlSD00RdGTB8U5i0_03hb=0@00Pgg<00n4N`0008_3PoP[M0R3n2ed0n\]o8=m
+a01e1X=mg01n3;T1~3jB<1~2Rl37AL@1~3_P40~2jA01~2SD00RHeLk?ooXA0f0`2;P9P1~2Re04
+Rl\c`6J;14Z;SEc\ooof`09d3Om5g;h1~3j`R=@02i0@000>W?~3Rl2;`h?h<7@iPoQ5M0b3n6Ed
+1nUB~3Rl0;ogl6PggP07@BadG<0@000;h1~3jIX0~2o;T1~3jHl0~2Rl0;ogl<Pgg807D6<l3[
+1h_0^040~2Ro0;`0n4KP0004OYJ00008e008V=G>cooj4@=P<0Rh2H0@00Re04Rl\c`6J;14Z;
+SEc\ooof`09d2DNn0@000>\fo:4@=P<0Ri1P0@00<l2:0S_3MAf3OLP0M0Ni0@000>\EadG80@00
+0;h1~3j`N;`;T1~32lUe=`_fM1^;AMB=D?n9EM@;`7h>RdG\R1Q0RDG\j`J=@03oAN2;fH]528\@
+om:;bh_HjFOnoon=@029OM29GO2;E@R;LPB;AO3oeX=md01e1X=mh01d38=mc01d?h=mg01e>H=m
+l?me8H]Mk8f=H>coob_IB`_KOPVhoOooon\5Rl23b?n;f>\6o;_mooooRl>1a:`C~2GeiKbL>;
+ANc6~2RgD<Pch03hES~3PWh8C7DZ<m:=QF3\oon3k0SXESP008_6Pl@8j<Cgoon3`?lK`40Uo`00
+0>\YSD00<m:=QF3\oon3k0SXk38008?428]53>RImoooPl3o6l109Ol0~22l1d2H]M3<L30@00
+08]5k8fMH>coob_3B8]Mj0=Mh0?3PLB\4`00GeiKbL>;`5F;k5=FEh?\88U528UE38_JRDd@adG`
+~4aTGS08]578<h40n5B@0008?i<0n5@0000<M5l040~2R4gSRdDDRa3odX_CRDD@SD[oRDd<2lUn
+88?hN7@5PoQHMAJ;CA28CN>;AAB;4?oBRDD@odd<odG`RddLPcT03hEY~3Rdd@PoT`3hED~3odG`
+R4gSRdDDRa3odXU548]=34V9C@`;bGh]PoQhM0F3n5Qe8h]=7<L1400008]=48Q=hh]558\@om:9
+AA3oAO3oC@c[5h_0RdDLa`08~3j`[lRdDLa`0:~3Reg`RdDH0AR;AAb3>0Qe1kX;~3jaN;GAb3
+>a1e2;P8~3j`Kl^0X0~2Rm2;A@R9ANa2RmZ;MNB;CA2;`8]E34Z9E@`;dPn<`@0008U5g8\E43H3
+08^BV04008]j18_1<m9VRaA7RdGLm\82M0^=LM3YF00008e008U5g8\E43H308^BV04008]j18_1
+<m9VRaA7RdGLm\90M0J=LJW[;_b9AMb;5A0f0`2;TYP1~2RgX4Rl4cdVJ;54N;AMcf`X1d1Xea
+bN\6o;kooomoReDL>C9n>0_fM@V;d2]Ek0_BOPn;dd\;dWh8R0Q0j`R=@02;EASo0X_hR4gSRdDD
+Ra3odX_8RlOY<_oooh_0RDD8RDd@ReDDRg84RdD@omJ;A@P[ANb9ANP;`7l6PWgS<7D8RdGXjbR=
+@023OO00OPZkoOooon\FSD00Pgd@ogD6PlSoj`Kl^?gooon;f8_3Pl@PGeiKbL>=@01ERnaCEh?\
+48U528UE38U=4<M5m000~2PgT407DB2l1d0lH003?0Pl@@Ge_9`h_0RdD<RcSoehU5l8?hog@e
+Rdd@ReGd>E44ORZ;N@b;BA0;i?:^SGooM08co`_oM1F;E@P;dW@6R092RED8odGdjkn=@02;E@b;
+NPB;AO3oeh=mm01n2X]520_0M0?6~2Regd2m]n0^\CPgg`ogD6PlSoj`Kl^?gooon;f8_3Pl@@
+Ge_9`eF;k5>3k2R9A@R9E@c7AO@0~3RdT4RDg`2lUe23?0Pl@XFlW3RdD<Ra3odXU5n8?hogD9
+PlSoPl@XFlW3adG\~4Pgg`00n>i0000?b;COR8CN:i0P0008eEhXe5h>QjA000RDGXPoSoM0Z3
+n09d:^Ul~3ReD<RdX4RdGhom63ON`0M@^hoOoooh?4:5_9`h]5m8?4:5_9`h]M38\CRl?odX_C
+RDGTPoSoMB2;BPB;AOSodH=mk01e2H?8oh?4:5_9`h]5m8?4:5_9`h]Mn8QMhX]Mi8QMhkT2~3
+SEGRSDGPj?A3~2RDGXj`>=@037AN`1~3RdGX0DGdRdD82l1d3FJ;GN1VRAR3`0:9A@R;GO1;REg`
+RdD<Ra3odXU5n8?hog@82m\?Sagooon;E@b;BPB;AOSodH]5m8?4:5_9`oaERnaCEh?\;8U528UE
+3<M5l000~2adG\~4RdT4RDgX2lUe4P_0M0EVa`0003?0Pl@\Ge_9`h]E3?b;fX\CRl?odX_CRDGd
+RaeTC`<0IX\<@h?Q27@8odG\jmn=@023OOCoM@Z3b?n3a2aOFlW3adGT~4PggX00n>6@4008e0
+08]Mm8QMf[T2~3SEGJSDGHj?i2~2RDGPPoSoM0Z3n09d>nVL~3ReD<RdX4RdGdom63ON@0M@bh
+oOoooh?4;5mKbL>;A@P;`7@5I\L0~2RdG\0dG`Pl@\Ge_9`h]M38\CRl?odX_CRDGLPoSoMC6;
+BPB;AOCodH=mi01e2X?8oh?4;5mKbL>;A@P;`7@5I\L0~2RdG\0dG`Pl@\Ge_9`h]Mm8QMfX]M
+g8QMfkT2~3SEGJSDGHj5I2~2RDGPj`7ladGT0@0008]5h055l8]520_0M0eVRegHIXTHPl02RDD8
+RegXBhUMj8]538\@om:9AOB;5FA?0`2;n3?9IX\<N_K127D=PoSoM0P;f`n?j_kooh]E38]j18]5
+m?oGRdD82l1d1FK7~3RdG\0dG`Pl@\Ge_9`h_0EH_\DeN3k129A@R9E@b9CA37AO@0~3PgT407DB
+2l1d0lH003?0Pl@@Ge_9`h_0RdD<RcSoehU5l8?hog@eRdd@ReGd>E44ORZ;N@b;BA0;i?:^SGoo
+M08co`_oMAF;E@P;dW@6R092RED8odGdjkn=@02;E@b;NPB;AO3oeh=mm01n2X]520_0M0?6~2
+Regd2m]n0^\CPgg`ogD6PlSoj`Kl^?gooon;f8_3Pl@@Ge_9`eF;k5=GPn`@RDD8RED<R`eP@0<0
+RDgdPSXZM@c70040~2@XUE3>\9RdD8a`00~3R`d@=P<0RhVH0@00Rd44ReD<<m^:6S?9IX\<F?K1
+0Pn4JP0008]52<M01000~2R`d@=P<0RhVH0@00RgT4<m^:6S?9IX\<GoK10W@hRl0cbHX:PnT`
+ReP40m^=79\3fHUH14:;7A0f0`2;ViP1~2Rg\4<lV:2S?KIX\LCoK30WG=RED<adG`0@000>\8
+o<M5l000~2SGgdRed<RQ<?]\:i0`000?:^SGooM08coh_22omd3X]E28Q224>9G@c[2H_0RdD8
+aT0888]538X8Rgd8R4l9SEP1REd<P_UK3hEW~3RQ^2neie2HQO2H?00XU538]=28]538U1388h
+07D5<m_[;?b;G@R;F`b2>eee4KYT@0<0RdD<@>RKA000@>\=^VA00`2;A@cXRd@008_HRdD8REP@
+Rl^;A@`3`HU5388hGGD4@8U538=ml01e78]5289h2F=e2LM01040~2j`Z;A@S7@0CooomoRdD<
+Pl@@Ge_9`eF;k5>3k0c7AOP0~3Rl2;f8\Com:CREgdRaETC`<0IX\<FX?Q27@7odGhjn:;`8=m
+m2Ee2X]5n423a0aKbL>3OOCoM@J3b?o[1_bhoOoooh?435_9`oaERnb3k0aC<lV:B0R3nFQd2h?i
+K7@VjD40~2o8]858eI18UH58\9RDgl2lUe1C?0FlW3ReglIXTCjcglRePDSD\4RDPDRa^9GOP;
+fgD5<l1KbL>;GOR94n\NRl2;F1B=B`B9B1B;6hUMm0_KM@Dc`5_9`h]5m8T@^040~2FlW3EH_\
+DeN3k1B9A@R9E@c7AO@0~3adG\~4PgT407D@2l1d0lH003?0Pl@DGe_9`h]E38e008_jRmV;5h_7
+om:;eh_;RoR9OO2;7FA?0`1VR`AkPn08M0KoANc[fOb;GO23nomd?8\EI4l308_k<l1VR`Ajm\08
+MBV;AO@i@@An8H]520_0M0J86429A@R;fOm5m8]538\@om:;bhU5l>^mo8=mm01n2X]520_0M0?6
+~2ReD<RgX4RdG`omN;AO@;`7h60dG\j`ClPlSoPl@DGe_9`h_0EH_\Pn`<Dc?9RTP8PoUXM0^3
+nFad9^U1~3o8]858eI18UH58\9RDgl2lUe1C?0FlW3ReglIXTCjcglRePDSD\4RDPDRa^9GOP;
+fgD5<l1KbL>;GOR94n\NRl2;F1B=B`B9B1B;6hUMm0_KM@Dc`5_9`h]5m8T@^040~2FlW3EH_\
+Dh?\=8U528UE38U=4<M5j000~2adG\~4PgT407DnPcT0MC62N@U`MAF;@AB=D0B9DAB;0<L0~4
+jaR;`3?BRed@Rl?X<?ooo`_0M@K70`40~2<l23a3AKbL>=AMB9AOR;E@clRmZ;4h_3om:;dhU5
+m8\MI4l306J;34>3h@Qd2?m5j>_OSD00RdD@Rd04RDG`RdGdPoP[M0F3n2ee:X]Ml4^9GO1e2kSm
+ooooPl@dFlW3RdgdReghR0^;A@b;4?oBRDGd@hUMn8]5n<H0<429AOR=G@QCSEg\Dome38]=m8]E
+l8?\3>Qam?ooPl@HRDGTPoSmM2N3n?md1N\[SD00ReghSDgD:mU;2m]n1kSmooooj`>3b?n3a3AK
+bL>hoOoooh?4=5_9`h]=n8]Ei0?:RDghaP40ReD@PcX03hEK~3PWX9L7D\RdXDSD44RD8DRaT;
+fg@ARdd8<m:=AMCX_48008T3jcF;AA370040~2jb[lRdd8<m:=AMB3k0cXW48008?438_@Red@
+Rl?XiOgoo`_0M@K70`40~2RdGhSEgD:l=8RegX0eg\0l>3a3AKbL>3a3AKbL>;`5F;k5>3k329
+A@R9E@b9CA2;fLM5j000~2adG\~4Rd<4RDG`2l1e8X<k07DE<m:;`nP\o?ooRl\;`7D6a`41~3
+<l23a31KbL>=AMB9AOR;E@b=@02;fX\CRl?odX_CRDGdRaeTC`<0IX\<@h?Q27@8odGXjmn=@02;
+AOB3n2ed1H?h:gDZReg`BhUMl7D;^?gooon3a31KbL>;COB;GOR82h]538\@om:9AOA3REghRdGh
+aP0`@8U5n8eM25>=GNaCogD<RdgdReG`Pn`<j<[boon3a1R9ANB3n?ed98?hog@2jbR;GOR=CM@[
+fD\;fgh7^?goooo[0h?8oh?4<5_9`kSmooooPl@`FlW3RdghReGT0lZ9COS60@2;GA23>`1e9X]=
+23?BSDGDPn`<j0I0~2Pl@<Rm2;`nPRnooo2l1e1\L30@0008]5n8eMe2_3B8]Mj0=Mk0?3Pl@`
+FlW3Pl@`FlW3SD00EH_\Pn`8RDD8RED<RDd@<l2:@PV3n2D?Q;02~2PnQ5PoPc3hNi0P00obB5
+Z>l10=W`0@3Il040fO0105[b0@1JlP40F_8105[b0@1JlP40F_8105[b0@1JlP40F_8105[b0@1J
+lP40F_8105[b0@1JlP40F_8105[b0@35l040F_8105[b0@1Ml@40F_8105[b0@29l@40F_8105[b
+0@1JlP40F_810;Ga0@1hl040fO010=W`0@3Il040F_8108c`0@1JlP40F_8105[b0@1JlP409O81
+09g`0@0AlP40F_8105[b0@01l@40F_810;7`0@1JlP40F_810<G`0@2;C@b;E@Rh2P0008?42<WY
+P?gooh]=38]E23?0Pl@8bNU_oOooRdd<ReD8^0P0~2Pl@8bNVGnoooRdd<ReD8^0X0~2Pl@8bNV3
+noooRdd<ReD8^100~2Pl@8bNU_noooRdd<PWT9AWD@PgTH07D:^?[ooon3a0S9`h]E38]528?4
+2<WYQn[ooh]=389i26ae9h<i07@5<l3[3ob;E@b;BQB=@@B9@QB;0H]=38]E28?42<WYboCooh]=
+38<i07@7<l3[4He008]E38]:58e118U258\1Rdd<ReD8Pl@8bNVCnOooRdd<PcT0M0Lc`>\ASD00
+ReD<RdXDSD44RD8DR`6;C@b;E@R3a0S9jGOboon;C@b3>@1d1c?0ja6=@02;E@b;BQB=@@B9@QB;
+0H]=38]E28?42<WY1oKooh]=389i26ae9h<i07@5<l3[3ob;E@b;BQB=@@B9@QB;0H]=38]E28?4
+2<WYco;ooh]=38<i07@7<l3[4He008]E38]:58e118U258\1Rdd<ReD8Pl@8bNW3iOooRdd<ReD8
+^100~2Pl@8bNTSn_ooRdD<PcP0M@R;EA3X>oSooh]=3<L10@0003?0Pl@8bL>;C@c70@40~2RdD8
+Pl@8bNVnmooo^?[ooon3a0S9`h?42<W3~?RlP?_L73~2EH_\<l39``00~;EH_\Pn`HDeIGRg0@
+2oH?SE00~2RlSggXUa48_6^``0~2VOOkRmJARDgdSAb=~4SAaK:m=e3bU85<M04000~2jD00~2
+RegdSD\1:DPD`N<2SAaK:eP@Pl<<REP@jbJ;`8]H48?k2ghLTkT<~3VOOiThUMm05H58]Mm<7S
+0XdLFbUH48]H5873K0L0087k\PL007`8PO_e1`00OPR3b?mOGU_9`h\M43H308^KU04008\K2m]m
+1OOKj`olRad@=P<0Ri^D0@00Ra^1nj05~2OPj;3A0f0`2;BA3[7He008\M43H308^KU04008\;
+SAb=~4`N46:l^;f8U=k8]359VC<mX[fX?S0c?J:mYe1k[4?0<0j`FjT3`308UEl<M5n000~2RdPD
+PL5[1`00POVb1`00O3@cfh_0Ro>;f8_1VI<cfR_JPn<3<mX[fPnD`h7So`000873K@4000?NBH7i
+\PL007gCREghRo2;GO2;CQ2;OP`3?8]?0gghRGghRdH8Rdh4RaK1i`N=??n=7?n=79n=75l3fXdD
+S@00~2`N46:lX3bl7P18d4`8dL@8dLf0?IRdg\0mV9GOb;GR29GNQZ06X1RmJ=AOb3k0cX_kgo
+oh_6Pl@DRdPPPl41PoT43hMk~3obB=R?@100Ce0@04m@401?D109cd0@2dm040Rad@=P<0Ri^D
+0@00Re\X:EgljE40~2o8=mj01e2\M08000~2jd7lPggX17DNRad@=P<0Ri^D0@00Re\X:Eglad0P
+0P000>\OSD00XA0f0`2;P9@1~2Rd0X:DGlj`WlPlSoGeiKbL>3OO`0O@J3b?o[1?b;AOaOGU_9
+``00~:EH_\X`1?0`295@A?0`39`eF;k;W8A`<0POUhC0<0Lb2ib4L308e003T1M`Ti@@Af18_1
+bL>3`@b1nGQ<0`1bj8\=04l300_9M1j;5@A?0`0kbW<D>@5g2CU117H4Rl79`h?133_:L^`c`<W3
+EH_\Dh?\28_HSDghDFX1\0;X~4Pl@82l2;`gD:a`GlCP<00@000>P6~3Pl@8FlW3EH_\POR0lP40
+M0FSn3`308<m24l3~2MAEZ06X0J0Q?0`1Z0;04j000~2Pl@@bL=EJ5P00P1TocD0~3RnaTRBd0
+~3DeN3k1B9AA29EAB9CASf@0@2M1<c`8?455mKI8l5~4Pl@4GL>;CA3f@@@@M1n;3A0f0`3f@B@2
+M1<c`8?455mKI8l5~4Pl@4GL>;AA2;03fF~2`0n4f@0003fL~2`0n4B04003d30070M0GY[@40
+06X0ogDHogDDogD@\0CXGPP008?448?hogDDPlSoPl@DGe]TS`D0~3Pl@4GL>;AA2;@1B3n05d
+;h?h17@2jdbi0@0003?B^0X0~2j0\g~22l0?Q5D0~2<lV;EAR;AA3XHP800>]6^@40~2<m:h1P00
+0>SS=P002l1d<C?9ReDHRdD@j3h2~2jb:i0@0003?B^0@0~2j;lf~22l1d3C?9ReDHRdD@j1X2
+~2PlSoPl@DGe]TS`D0~3Pl@4GL=Z0?me6?me5?me4;04j9`7~2Pl@@PoSoMAB3b?n3a1AOFfB?
+1@00~2Pl@4GL>i0@000;Z6~3^0<0~2j5Pf~22l1d3C?9ReDHRdD@j;<1~2RddHPl44<m9VRe44
+P>80IXUA18?8oh?455mKI8l5~4Pl@4GL=Z0?me6?me5?me4;04j287~2Pl@@PoSoMAB3b?n3a1AO
+FfB?1@00~2Pl@4GL>i0@000;ZB~3^0<0~2j=he~22l1d3C?9ReDHRdD@j3T1~2RddHPZ6U~3mh?8
+oh?455mKI8l5~4Pl@4GL?7AOCl?0<0Pcgl?0<0o`n4l@0008]568?028U5l8_0Rdd@ReGdR`4i
+0Pn5a000089j101d;6X0ogDHogDDDK04j7h6~2Pl@@PoSoMAB3b?n3a1AOFfB?1@00~2Pl@4GL>;
+COB:@@D:`0n4K00008]m484oV@00`7DiRedHmP<8M36;CO3f@@42M2Ri0@000;Z:~39Ol0~2j10e
+~2Rm<;`8_7M3@cbNQ]~3jb^=@02i0@0008]Mm3?BRU<6<l2:@`GXiC@000_0M0dcbH]E68]54>Q0
+~3RdGdPWP707@Q<lV;EAR;AA3X:P000>\BRdGdPl08RDGdPcSo3hDJoooo<l23a1AOFfB?1@00
+~2Pl@4GL>=@01ERnaCEUN3k5b9A@R9E@b9CA37AM@1~3adG`~4J31e~2ocD8C`<0\0;X~4R`d@
+=P<0PTTT0Xe=a56=CM1A\0;X~4Pl@@adGP~4Pcgl?@<007@X<oJ=1;FT?@<0Rdd8R`Ti27D8Rd1H
+RDG`j`]6Pcbeo3d3~2MMf9MN37AM`2~3RdGPPcb5o3d3~23hEL~3RdD8PCP30070MD?7AM@0~3
+adGL~4Rd0DPoP1M1F3n0Ad1>\JRl37AO1[~3jbV=@037AO1\~3jaf=@037AO1]~3ja6=@037AO1`
+~3adGL0`0008]M2?lcJPR;AM2;@0co<6X4Rd<<D6X8ogGLogG`\0SXGP<008?48?I3105d3VX0
+JW6`0^Q:0`00Pl@8PggD00n43`<008]M3?H30G@URdD@2l1d0^\6Red8Rd<<Rm2;G@b;PiP0~2
+j0H8~2RDGHj`SladGH~4RdGH2l1d6_m`16X8JP5XP@000;04j>l2~2Pl@@jaf;`8]540_0M1A@
+JPQZ0FR1~3\0CXd08008?448]M3?H30W@9^0P0~2j`N;`;ShooooRDG\Red<mP<1M0Rk20000>\6
+o;_hooooREg<RdD<mP01M0Rh10000>\6o;SlooooRDG8Red<mP<4M0c7ANP4~3j`Z=@037ANSl
+ooooSDFXj;D_~2JP1ZM;02j5H2~2Red<ok>D~3Rgg\EoncT00005Oo\h`0~2EoncR00005MZ16Ye
+\0[X:@800?ncZ00008]5c53o\h@0~2EoncP00005Oo\iP0~2D6X4JWJ`2^So0@00ogF\JPSoLgb;
+ONQGogFXJPSo\j00~2RgG8EVX4JWN`2^SI0@00ogFdJPSoLgAGogF`JPSoLgQGJPAZN;0:j;`1
+~2ogFlJPSo\j`0~2E_me^6X8og=`EfX4JWV`2^RL0@00PLC@~3mP<83h@j0@00JP1ZO;02j881
+~2SG\DocMZ1?mc46X8SG<<ocIZ1?mc16X4JPAZOK0:j5l1~2og<LJPCoLaQZ28\7`NP@D6X4SG\8
+ocMZ16X4JWj`2^Pk0@00R`HUool008U5i6X0JWn`0^PV0@00Rm>3a62;MNB1o_oo~23hB^~3RlK1
+h10;aXU5i<M5h000~2R`o1j@^3h@OAhKl3~3<l23nAl?Wl188oSCih]=`3?K<oJ;`8]5i2?7>lL?
+Q5P0~2<l1VRd@J:?K4P7@7^FQ00`3[1KUZ@0<0Rl:=51R9AJ3oLR1Z2?mb96X8IX]2:2GoO`00
+D6X4DHU=Y6X0RlI@JP5Z1FR0~3\0cXP00008]EX8]=Y8?4<<7W0TJ3``Z3oPQlShUeh>\CRl1Z
+06R2~3\0;XEP0008?428]52?I0111d3VX0JW:`0^Po~3Pl@8JP1ZLk02j340~2Pl@8ocD8C`<0
+\07X~4Pl@4Rdd8mT440GD:^6<0~2j8L@~2PlALGeiKbL>=@01ERnaCEUN1k:00~2Pgd<00n>o000
+0<M5l000~2ReG\RggXSEd@<oJ=@`B;4h]k18?320_BOA6=PU`n0`29A;G4jKh0~2Rl0;dWD<RGbe
+a>V_~3SD00RKEPooooRoN9WFcooon;f[T@~3Rgg`SI@mL?oooh_6RKETooooj;@Z~2RmN;n3?0
+PlWolZkgdDV9SFSooonh<30`<8fl5G3ooon;lh_>`NT2lj^;cX^eH?oooh?Q0o>ZRkeToooo^A00
+~2SD@Em8fD67cooon7WFcooon;QFSoool[d8_7Pn`<j50Z~2Pl@<j;@b~2RiE\ooooRdg`SH`=
+L?ooohU<]LA6PdG`2C]e30n<5_oooh]=38eEa8]52>S\2`00PLBP~3GeiKbL?lEFQH0080I?le
+~4RnaTRBd0~3DeIGPn`DadG`~4R`d@=P<0mT4T0W@D<l23a1AOGU]TS`D0~3Pl@4GL>;CA2;@@cX
+m_GoohU5k0_0M0aVRdP:PN40P000MA@c`8?455mNFfB?1@00~2Pl@4GL>;ON`cbFJ;C`[faD0?
+Q<X0~2RgD@R`j1nA`00<0?U<>1hol0~2POVG~2`0nD`2Go~32mR1nI@00<0?U<:1h_l0~22m>1
+nID00<0?U<>1hol0~22mZ1nIH00<0?U<:1h_l0~22m>;g`_@POVH~2`0nD`2Go~32l:1nIT00<0?
+U<:1h_l0~22m21nIX00<0?U<61hOl0~22lYd>h]m68]74>PSmOooRmJ;cc_3M@hc`6J;@`SX0200
+08U5l8]5l8?hogDBPl@DGeiKI8l5~4Pl@4GL<c`8?455mNFfB?1@00~2Pl@4GL>=@01ERnb3k1C7
+AOP0~3RdD8RdP4^P80~28m4?QNT0~2RaD@=P<0mT8T0W@<P\T1RDP4jM80~2o8]538?028U5o8]5
+28\0?@40080?Q;P0~2;Il00<23n04?QZX0~2;F;o~2PoP23hN;~3obB5c00206410P3H0080f002
+08<m54l3~2MAB;AOb3`0B;28T=K4l30<L032\208]5284h0`01`7DdRd0DPoP1M0R3n0Ad3n\I
+o88=54l300C[;He0088=54l300;[8He0088=54l300S[5He008]5284h0P01`7D7PPdDC`<04<M5
+n?ooooo[4_b;AOb;B0B;EA2;A@SXioOooh]5n8?45<W3SD00EH_\Pn``XFa?0`29AOb;`<M5f000
+~2adGL~4adGP~4adGT~4adGX~4adG\~4adG`~4adGd~4adGh~4^P@0~2^1A?0`3X:RT000_0M0k7
+AMP20070jG<0~2Rl37ANP4~3^P80~2^1A?0`3X0RT000_0M1;7AMP30070adG\0@000>]7Rl2j
+0@000;PDC`<0j=dX~22l1d4LM5f0<00L37AN`4~3jb;l^P<0~2^1A?0`3X^BP000_0M0k7AMP3
+0070adG\0`0008=mf01d5He=f56`0NP0~3Pl@4jAKooon;`8]5o8?4<<W3EH_\Pn`@RdD8RdP4
+Pn44MA2;CA2;E@cXJ??ooh?44<W3PcglCP<007@@SDglDFX0\0;X~4Pl@8<l23a139`he005F;
+k5=FPn`8RDD8RmR9E@`;f`n4N@0008_2j67bool;`0n4JP0003?9IX]82X_3m\F03hAI~3R`R9
+CO@;b@n4@P0008]01>Pcl_oo2l1d=S?9IX]82_K5P7@[RgGdo8_6RDD8RaR;l`_KM1N;@0CX2o;o
+o`_0M0\cffJ;F0[fah1eg8Uem8]528?425iKbL<c`8?425iKbL<0~=EH_\Pn`\RED<RDd@PSP0
+MBO7AN00~3adGT01000<M5j000~2aTG\0LM5l1P0~2RDGdjbN;`;T1~3SEGPj;<W~2PoP1MA>;
+AA@;`7@5j5ZIoolc`8?4;<W3RddDRDglRdd<SEGPSDGlj5LS~2PoP1M@Lc`8?4;<W3Pgd@07@7
+RdGlPTQ40H]=o89i=@=e>H]1<>RY6`00RDGh2l1d7X]=o<I1=@6;COc7@D03~3Rdglad4<~4jb7l
+RdGlaT0e0>\GSD00RdglPWTe0GD;Rd4`j6LK~2RDGhRdgl<l2:@CF3n08?Qml0~2obB5E0@20;T4
+0P1P1080Z0@208eEn8]5o>SE9`00PoP1MA4cdX]5o>SB6`00<l23a2c9`h]5o8]=n8U888]5n8]8
+48]5o8U8D8]5o<M0E000~2jIH0~2SD00<m:;AOcXVQ\003?0Pl@\bL>:ENb;AOcXP00008?h0GDA
+<m:;AOcXNA\003?0Pl@\bL=Z4fP08000RdglPl4lDK03j000~2Pl@<2l1d4C?BRdGlj4`K~2<l23
+a2c9`h]5o8=h@0=d:nR;8@002l1d8S?BRdGlj2TK~2<l23a2c9`n\?^SH1~2^60n0`3XKB<008]5
+o8?4;<W3o5F;k5>3k329A@S7AOR08000PN;o~3PoX3Mc3o99EX1@80o7P50P201@80T0D208P5
+0P22COP@jb6;`89=n23[6H_0PTgh@>\ARl2j_@400;Q\?P<0j0TS~2RdD8Rd0hPoP<3hNJ~3obB5
+^0D208e004P60P3\1@8020H204P60P0X1P80B0H204P60P181P80B0H20?P50P0H1P80B0H203P6
+0P37AO@1~3jEl0~2PTgh0\M5m040~2jDl0~2PTgh0LM5m180~2jd:=@022COP2adGd4P000>\b
+SD00PTgh0\M5m140~2jb:=@022COP2adGd4@000>\BSD00^_41~2^7Pn0`3XDB8008]52?I0A0Ad
+189=nD2i104008]E28]B<3?0j9hJ~2RDGX2l1e2kP1~3Pl@`FlW3Red8Rd<`j7VFoon;ANR9@c1Z
+0?men?mem6X0JP2=CNaASD\PDE2`2>P0~3RmR3a229GO0;f`n4`P0008?k10n5H@000<M5i400
+~2SDgLDHe=i56`0^P0~3Pl@8PggT07DKa`ELD0<0?00008TM@5P30;P1~3Pl@`FlW3JP3oMOSo
+MOAZ06X0SDg\DH]=28eA85;oLC2`2>P0~3Pl@PRDG`Pgg`87DEa`ELD0<02@000;P1~3Pl@`FlW3
+Pgg`KWDEa`ELD0<02P000;P1~3Pl@`FlW3Reg`2m]d6lL5G50303`0~2RAe0F0<0^040~2Pl@`
+FlW3Pgg\0GD7RdD8PV14oX]M28_3j<J5oon2Nc@13hGW~3Rd=49H00~23hGI~3Rd<hm\04M@Wf
+`0P?Q<P0~2Rdd8SE58DVX2J_ooLB2`1>P0~3Pl@@RDG`2l1d;Cf3~3M@Pc`8?4<5_9`lL5G503
+03`0~2Reg`RAe0F0<0^040~2Pl@`FlW3SDgPDFX1SDgKDH]=2?ma8;04j000~2Pl@@RDG`2l1d
+6\L5G50303`0~2Xd1H0`2h0@0008?4<5_9`h9mfaYe>h]=2?maB?ma8;02j000~2Pl@8RDG`2l1d
+6\L5G50303`0~2Xd1H0`2h0@0008?4<5_9`h]52898AB2;G@R;BdB1hH00~23hE;~3mT<h17@9
+^080~2j`B;`3?0Red8SD]8DH_8DFX0og<P\0CX~4Pl@@RDG`2l1d6\L5G50303`0~2Xd1H0`2h
+0@0008?4<5_9`c?0Pl@`FlW3~<EH_\Pn`8EUN9A@R9E@`;bG@jPST0M3F2>@1d7[h1~3SD00RP68
+0T52PST0M0R;aTJ3n5ilkHUE38]53<H0>Xe80LH188?00XU538e=n57o=H@n0`3oM@QXS00008]=
+38]E68]558?\3>RA5P00Pl@LRDGl?C`1~2MDQX>5P306X^J7Q00`1Z0[04j000~2J3QH0`1Z0fRX
+@0<0JP:`1>P0~3J3QH0`1Z0VR\@0<0JP:`1>P0~3Pl@`jOX0~2o85mo3d1~2MBJn\40308]E38_j
+^@P0~2ljEVYJB;nS?0PlWolZkgdDV;`EmNbL>1OO`n0@00MDQX>5P306X^J7Q00`1Z0[04j000
+~2J3QH0`1Z0fSD@0<0JP:`1>P0~3J3QH0`1Z0VR\@0<0JP:`1>P0~3Pl@`jGX0~2o85mo3l1~2
+MDMX>5P306X^J7Q00`1Z0[04j000~2J3QH0`1Z0fSH@0<0JP:`1>P0~3J3QH0`1Z0VR\@0<0JP:`
+1>P0~3Pl@`jbb=@023OO`2MB>ng40308]E38_j^@H0~2ljF;nS?0PlWolZkgdDV;`EmNbL>;C@b;
+EOS61140RdGhGek9`h_0EH_\PNc`~3DE8cbHfE4?oooh?\3>PEo_ooSDglDE2=SA3ooomAJP:`
+1>P0~3SDglDFX2J:a00`1Z0[04j000~2Pl@dbL<0~>EH_\DeIGRoRh~4mPOoM@j3k`;mlZklAhOK
+Qm^7feNioooooo:^mm59Rm5ARoNo0@000;\0~3Qm^7fhOK[3`03hB7~3?21d7c`9M1\lG7@[?29d
+DoO30@0007D7Ah?;0HOKT4;[eI3g``80~2M0A2jlV@Pn?njl>7fi3g``40~2M@A7Pl\1^Ooooon7
+o_>^CoOAQoj\?29d1@?AC^^LdNUc44;[UI3g``40~2M@A7Pl\1ml<2~3M@R3b`;YN?oooh?SoNU`
+ooooRCgX>`<00mM7`NL20mN;`X?\1>Q@U?ooPl@4PoP0MB2i~4^P00~2\6B3k0cXY?kooh?436X8
+JP7X20800:?\>`<0^`00~2FD6;d5h3nXTjPl84ljB7fhOKQm^7fj`l00n4Y`0003`PM2<l2G@O
+?5ad=c`RM6og``40~2M@^9>X?218?;0HOKT:[[dI3g``80~2M0BZjlF@ml<1~3M;b3hoj`0:[[
+]?O30@0007D8RCZ3`PB3b`6iooooohOnlji?mm67oZ`l8[1LM0OcZTk[RXOKdNWcZW<J\2:ZjG[o
+oon7foO30@0007D8RCZ3`PB3b`7g``80~2M@R3b`;YF?oooh?SoNU@ooooml<1~3M0B`0:Z@a`80
+~3GeiKbL>@EH_\DeIGPn`8RDD8RhRl0@00Rg4@adG`~4PSh0M2\cd_b;gX_`Ro\c`8?9oo:^Ro^;
+a_OABHdd3dJ;cR_?0DP`@X8n07GKREG`RdG`Pl0?P^3`@8U5l<7P0^SOT_ooRed8RD<d2l1e2h?8
+oh?425mNFlW3RdD8RiRl0@00Rg<@PSh0M2_lRm2;BRb=F@69FRc1h@:;FSB9=0^;oS?0PlWolZj;
+`_OAB@?aAX8n07GFRed8Re<\`N82Rd\da`@A~4Re\dRAelC0<0<l23a0QOGU_9``00~:EH_\DeIG
+Ro29M@R;nX_O\02ioooooo:^mm6;dHOKQm^\?01d2h_klZh;bH_:MO6@RlI8:dD8GeiKbL>@EH_\
+D6X1\0;X~4Pl@8bL<0~=EH_\Pn`PDeIGRDD8RED<RDd@adGl~4adGh~4PWPe00n5K08006J;F3IV
+Po_oM0n86TV9CA3oAOQVad0foon;A@Sf@4D@M1b3OA00MPj2B0P1a`ELD0<07@0008]5n5mNFlW3
+SDglDOme48]=38]En0?:DH]M2?mc8;04j000~2Pl@@RlP;`7@KPT\80\L5G50303`0~2R@e0F0<0
+<l1OGU_9`h]Mn0=Mo8UMo7DHRed8PT\80LL5G50301d0~2<l1OGU_9`h]M289k=04?QIl2~2Re=4
+m\:0REGT3hA=~3ReD<RoZh6P0008]=o0_TlZj=Oomd0S?oRdGTRGgd2omd8h;<48U3A3_jM@j2
+B`P1a`ELD0<07@0008]5m2]535mNFlW3RdGlGeiKbL>;A@b;GOb2O1So6Pn5<P8008]528]8A87Q
+020000n5808003]M40n3F@0008?k0GDBPTP80LL5G50301d0~2jc^;`8e=n55Z0F[oRed8og<P
+\0CX~4Pl@@RlP;`7@KPT\80\L5G50303`0~2R@e0F0<0<l1OGU_9`h]5o4QOGU_9`he=n55Z0He=
+je6;G@SoLb2`1>P0~3Pl@@RlP;`7@KPT\80\L5G50303`0~2R@e0F0<0<l1OGU_9`h=mn01d?He=
+n55Z0F[oRed8og<P\0CX~4Pl@@RlP;`0n4F`40089;20;71Ea@0`0l~3R@e0F0<0<l1OGU_9`h=m
+o05e5X]5289820771Ea@0`0M~3jcb=@02=COQAJP5Zoh]M2?mc8;04j000~2Pl@@RlP;`7@KPT\8
+0\L5G50303`0~2R@e0F0<0<l1OGU_9`h]5o4QOGU_9`h]=o3U=40n6eP0008]E38]el8]Mk8]5
+28_0RdPPRgQ@>GTDMA6;N5@iNAQo2KT1~3j`B;`3?92lUd6X98AA22B0P1a`ELD0<07@0008]5
+o5mNFlW3PGQDn0l000nD`@[9M0n;B52;2HU8D<M0E000~2RdPPRgQ@>GTDM@R;LAP[L5C[2h]`
+E?ONPLKh3`00Rgd@>oic1X_Oj`B;`8_NRGGTRg1@RdQDRDGP0o63aPR;nX_3RlS1j@;cYH_8RdGP
+Pn43ljB;MN@3d`5Mo8]8E0?;RDQDRdgl>Dd@3hLhooooRdGlGeiKbL=ERnaCEUN3k1B9A@R9E@b9
+CA37AO00~3PWPe07D=j0Bhoon9AO3Y<P4008]52?I0>0Ad4X]888]958U8D8]888]968U8E8=m
+400?Q]d0~2SD00RdD8PGQDn0l000nD`@[93hA4~3RdQ@R`T;bG@6RDQ@jbclRed8Rd<Pj?D0~2
+PoP1M@n2B`P2RdG`Pl@DGeiKbL>;A@R;F22;FaB9F52;A@S7@5@0~3Red8Re]Dmm^1`oP?~2REg\
+RdD@>mQf0n\4o8]5k8]M28]kD8]CE0?jPlL8ReD<Ro:;b<7Y0_>URlR3h@?cY8_:RdG\ReD@>m1f
+60?8RDd<:m29EA01AO2;De@3d8UCE>\Eo8]=405=l8]528]HE0?IREQDj`_lPgd@00n79_oooh]=
+28]I88]AD3UC57D@RdUD>D\HO`Rh0@000>\3o3?02l1d38]=28]I88]9E8U;68]5l8?455mNFlW3
+~?EH_\Pn`4Dh_HJQ=X010008e=o56`0nP0~3Pl@<2l2;`g@Ba`ELD0<03@000;P1~3FlW3Regl
+a`<0~3PgP@07DKReglREP@Reglad<4~4ad0P~4ja>;`8]H58]=o8T;RdPDReglRD\4ReglREPD
+ad0H~4od0P<l1KbL<0~=EH_\Pn`4JP2=COlcdX?\3>R3~3Pl@@bL>;`5F;k8?\16X1SDgo<m:3
+k0cXI`0008?44<W3Rl1ERnb3k0aZ08e=mh?\3>Q=~3Pl@@gEghPWgg07@:a`ELD0<00P000=e5
+n<W3Rl1ERnb3k0aZ0He=mh?\3>PM~3Pl@@gEghPWgg07@:a`ELD0<00P000=e5n<W3Rl1ERnaC
+EX?\@8U528UE38U=4<M5l000~2adGX~4adGT0@0008e=a8U=m<M5k040~2SDgIRDgL2m9d0XT2
+Rdd@aP40RcETC`<0RdD8Rl0cdXX@IX\<EX?Q27@3@>_`RDD8ReD8<lV:2X?i:g@@PoT]M0C[38_0
+adG\~4odD8R`d@=P<0Rh6H0@00Rg04RdD8RP0?]]QVRaANPn823hFc0@00RhUP0@00>04?Q:D1
+~2PgdD00n4SP4002Go~3PnQ9PoPU3hMm0@00obB5G1D208_0A1H20=0F0P3@5P80d1H20=0F0P3d
+5@80d1H20=0F0P3@5P80d1H20=0F0P3@5P80d1H20=0F0P3@5P80d1H20=0F0P3@5P80d1H20=0F
+0P3@5P80d1H20=0F0P3@5P80d1H20=0F0P3@5P80d1H20=0F0P3@5P80d1H20=0F0P145P80d1H2
+0=0F0P3@5P80d1H20?@E0P2i0`000;[d@0<0Red8Rl?XT1P000_03hG0~3Rdd<2lUd1H?30hTI
+Pgg\07@=g@E<@@<0PlA0GU_9`md5C4430=WPPlA0GU_9`nV=~3o;T8~3^_Q00`2;G@R;`nQ06000
+2l1e;X]=30_9M0F3``R96H=mk01d3Md5;44308?4@5iKbL?M1Ba10`3Ih8?4@5iKbL>i0`000;X4
+@@<0Red8Rl?XnQL000_0MBj;C@`;bG@5Pl<3RAV3ON`0M0gM1Ba10`23a41NFlW3g@D\@@<0fN23
+a41NFlW3g@FHE`<0PlA0GU_9`h\M43H308^cH04008]528X8>0ie98^KV04008]c13?KRUP1IX\4
+GX?P0WD=g@FHE`<0PlA0GU_9`h]5288h<7D>Rl10PSP`M?Z9A@R=@02Q43H308^0V04008]818]5
+28XH3kKCIX\4DH?P0W@MRdGdSDgH>lQf2hPH@8U5m>\6SD00odG`odD8jlB;7A0f0`2;Vf01~2
+RdD8RPPh2`n5G`000429A@R=GL@iGOAe6h8h<7DFRgG`SD00@4j2>31dnHUel8U528e00:4@=P<0
+Rh2H0@00RdP4RdD8RQP?]]=VR`AAPn02M1V;AOB=CMPkb7H9R1SoCO10RDGdodD8jlWlRdD8RP0l
+IG@8?4D?QJD0~2Red8@hUM23?0RP>3n2]d3X?h;G@2j`[7ANCoooooodD8XA0f0`2;P9P1~2Rd04
+Red8<lV:2c?KIX\LB?K30WA2RDGPSD00RdgPRdD8RQP?]]=VR`AAPn023hA6~3RdGX?FIVIPIc
+4h7So`0008?S3`?0S@B00l>9ANSoA@S[aX_0RdD8B8U52?b:68;kIG@9P_]5M0A8jo7lRDD8adGT
+0@0008]530_0M0F;G@R968e5a3U5m7DPPgg\07@=g@FHE`<0PlA0GU_9`md5X5L308?4@5iKbL>1
+ONQVIVH63h9D~3PggT0GDXRdD@aP01Pgg\07@=g@D\@@<0PlA0GU_9`md5;4430=WPPlA0GU_9
+`h]54<H00X=mk01d3Md5V5L308?4@5iKbL?M1J1G0`23a41NFlW3RdGT3jm5j8]El0?@REG`RdGd
+aP00Pgg\07@BRdd@SDG4j9lL~2PlA0GU_9`h]=48]El8e5a>R:7000fN23a41NFlW3~=EH_\Pn`@
+SDgo<m;X=00008?44<W3SD00EH_\Pn`PSDgoj1h0~2fgg\PWgo07@:a`ELD0<00P000=]]k8?4
+8<W3SD00EH_\DeJ3k529A@R9E@b9CA37AO00~3adGX~4adGT0@0008e=]8U=m<M5k040~2SDgI
+RDgL2m9d0XT2Rdd@aP40RcETC`<0RdD8Rl0cdXX@IX\<EX?Q27@3@>_`RDD8ReD8<lV:2X?i:g@@
+PoT]M0C[38_0adG\~4odD8R`d@=P<0Rh6H0@00Rg04RdD8RP0?]]QVRaANPn823hFW0@00RhUP
+0@00>04?Q9T1~29Ol0~2PnQ9PoPU3hMk0@00obB5S1X207@K0P00708001`2~2708001`202@K
+0P00708001`2~2708001`2~2708001`2~2708001`2~2708001`2~2708001`2~2708001`2~2
+708001`2~2708001`2~2708001`2~2708001`2~2708001`2~2708001`207@K0P00708001`2
+~2708001`202@K0P2i0`000;X8@@<0Red8Rl?XH1<000_03hG0~3Rdd<2lUd1H?30hTIPgg\07@=
+fbfb@@<0PlA@GU_9`m\]\T430=WPPlA@GU_9`nV=~3o;T8~3^Pa10`2;G@R;`nP@4`002l1e;X]=
+30_9M0F3``R96H=mk01d3M\]aT4308?4D5iKbL?K;LI10`3Ih8?4D5iKbL>i0`000;XH@@<0Red8
+Rl?XbQ8000_0MBj;C@`;bG@5Pl<3RAV3ON`0M0gK;LI10`23a51NFlW3fbg6@@<0fN23a51NFlW3
+fbgDC`<0PlA@GU_9`h\M43H308^cH04008]528X8>0ie98^KV04008]c13?KRUP1IX\4GX?P0WD=
+fbgDC`<0PlA@GU_9`h]5288h<7D>Rl10PSP`M?Z9A@R=@02Q43H308^0V04008]818]528XH3kKC
+IX\4DH?P0W@MRdGdSDgH>lQf2hPH@8U5m>\6SD00odG`odD8jlB;7A0f0`2;Vf01~2RdD8RPPh
+2`n5G`000429A@R=GK@iGOAe6h8h<7DFRgG`SD00@4j2>31dnHUel8U528e00:4@=P<0Rh2H0@00
+RdP4RdD8RQP?]]=VR`AAPn02M1V;AOB=CMPkb7H9R1SoCO10RDGdodD8jlWlRdD8RP0lIG@8?4D?
+QJD0~2Red8@hUM23?0RP>3n2]d3X?h;G@2j`[7ANCoooooodD8XA0f0`2;P9P1~2Rd04Red8<lV:
+2c?KIX\LB?K30WA2RDGPSD00RdgPRdD8RQP?]]=VR`AAPn023hA6~3RdGX?FIVIPIc4h7So`00
+08?S3`?0S@B00l>9ANSoA@S[aX_0RdD8B8U52?b:68;kIG@9P_]5M0A8jo7lRDD8adGT0@0008]5
+30_0M0F;G@R968e5]3U5m7DPPgg\07@=fbgDC`<0PlA@GU_9`m\]744308?4D5iKbL>1ONQVIVH6
+3h9D~3PggT0GDXRdD@aP01Pgg\07@=fbfX@@<0PlA@GU_9`m\]Z4430=WPPlA@GU_9`h]54<H0
+0X=mk01d3M\]e4l308?4D5iKbL?K;Aa10`23a51NFlW3RdGT3jm5j8]El0?@REG`RdGdaP00Pgg\
+07@BRdd@SDFdj8\F~2PlA@GU_9`h]=48]El8e5]>Qf5P00fN23a51NFlW3~=EH_\DeN3k1S7AO00
+~3REGdmT880W@Ha`ELD0<020000<M5l?oooooYCP0008_0ReGdRe8hPn8>MAG71Ea@0`0X~3adG`
+ooooon\^Rl2;EOB2NQX1MB>;DPR3hP5e4lL5G50302T0~2adG`ooooon\8ReGdReY<RAZ3OO3o
+MA6;GOB2B`P2PlSoPl@HGe_9`h]mm8=o@0=d58_IUh_Gj<hG~2Rl^9ANb;an\Bo8_IRm2;AOCX
+N?;ooh_;RDG\Pgg\07@7RdGdaT0J0SU=k7d:PlSoPl@HGe_9`h]5k8?465mKbL<0~<EH_\DeIG
+PSP0M42;3A0f0`2;TKP1~22m9d<?b;f8_k<l23bOob[_OA:oV;LPccYW@56l23f?n;bi4;bGD7
+Rl9OGU_9`h\B2m9edC?0GeiKbL<0~=EE=FEh_\ogD\ogDXogDTogDPDE9@j?`W~2RnEOGU]M`i00
+05F;k3?0bL<0~<EH_\<l39``00~;EH_\Dh?\18U528UE38=h@0=d>X]8A8?Q0WDbRdQ<2lUd:h_1
+9Ol?~2M@eA\07X~4Pl@4j`^;A@R;@4cXOGcooh]52<M0C000~2Red8Rd=4Pn0P3hEJ~3Pgd<00n5
+D00008]3;>QBO?ooRd<`j4Yloon;@b@;`7@6Rd\XRDPXRed8Rd<X2l1d2h]K98UH9>\DSD00RdD8
+RePTXA0f0`29V;01~2RdD8Pl@4FlWY2Wcooh?415_9``00~:EH_\EUN3k0b9A@R9E@b9CO@;dWD7
+adD<V3h308]m33?0PlWolZkgdDV1n@@1~2LQ?71Ea@0`02~3<l23a0aOG\W3Pgd807D[^0@1~2
+j?Qnoon9A@P;`7DCa`ELD0<03@0003?0Pl@<Gek9`lM5m0@1~2ogGdogD8JPGoM@b`1>P0~3Pl@@
+RDG`2l1d;X?hKgD>a`ELD0<00P000>\DRl371Ea@0`0l~3RdG`Xd1H0`0c`8?435mNbL>;M@R2
+?P1d3ob2?Rme0lH6G4J2?P1elX]E28_j<l23bOob[_OABH8l2Uae48_j<l23bOob[_OABLH42P2;
+A@R3a0aOG\W3~?EH_\Dh?\78U5n<M5m000~2mT080W@Ea`ELD0<020000<M5m?ooooo[>X_0RdGh
+PWPJ0WDCa`ELD0<070000<M5m?ooooo[78]5n8]0>8?P2GDAa`ELD0<07P000<M5m?oooon3OOCo
+MA2;COR2B@P2PlSoPl@LFlW3RdghRe4@2m9d54Z9DA0c`8Y44AR9AOCYm@0008_0RdghPgU00`n4
+L`0008=i100?QDd0~2Rd4<?@0P~2L`?[1_bh020008_8RdGhRe0lj6[[oon9AO0;`7D?adGdoooo
+onVZ~3SD00Rdg`ReghRe=<Rl?XX9;oohU318];C8T;RdGhR`R=F@6963?KRQV9GOCoB0CYMP00
+08e008]5n89h=@5d1X9h=01e;KT1~3SEG_RdGhj07[ool;`7@=<m^:GNn9GOC[AXe00<M5m?oo
+ooo[>Xe00;T1~3ReghRe<lRl?Xd^[oo`_0Rl=d6;T1~3SEG_j1^BoolcbHY=khU=m>\8o<M5m?oo
+oon3OOCoM0N;AOS6@1X1RdGdPl@LFlW3~?EH_\Pn`8DeJ;l0nfbX?11K\1~3<l23nAl?Wl188mR;
+a]?SREghP_X7L`cgdh_88l^9COc[<Ob=B_Vj0@0003?KP_TO3io3Bb?Cdn:1h_l0~2<m^:F0^5
+fW@4RmS[1B]5n8_HREglRdGlGU_9`oaERnb3k0QCEX_`3kK:Pl45^`40~2<l23nAl?Wl188mR;
+a]?SREglP_X7L`b;b3?;RDghjcN=@02=B_Vj0@0003?KP_TO3io3Bb?Cdn:1h_l0~2<m^:F0^5
+fW@8RmP3GOc[1_`[AOb;f8UMn8]5n5iKbL?lEFQH0080I?le~4RnaTRBd0~3DeIGPn`P<\V;`0nf
+`H\dQF1@0`0;mPn4QP4008_ASD[i^040~2<m^2nAl?Wl=;8l?Ch8_:mm28AN<coh]Mj8e008Y6
+3H?P7hU5k0n45@4008_IR]>;a^PJooooRl^;f8Y@3H?R7c]Ek0n5k`0006J1N0kEY@n4h`0000_o
+MA\?]]6=59EPD0<0REGTR`J90X]Ei8\BREG`j`N;1XT7RDG`<l2:@`gf`40?Q:<0~2Pgg\0GDU
+R]69CMb;aX?\2>Q2o_ooPl@8D;01j000~2RdgLPl@4jG`0~2RmV:dh_6j27noon;bh_HRU0=Pn8O
+PoX1OAF3b?n3a21OGU]TS`D0~3Pl@4GL>:@`gnb8Q33BGo~3P^2oR4<=P_T7LPJ:AN<P@`^2B`dP
+3kK1RaB5I50308TCRAb5I5030<M31000~2P6<:06J1H`P00>\5o89>3D2;MO3[?8e008_nRcK[
+<h_0RGG`2ome4@nf`H\FRAB5H5030>\7SD00R`J91hU=g8\fogG`\07X~4RdgLPl@42oH?QJ?n
+oon9GNR;`D62nA0?PUcnoolc`8?485mNFfB?1@00~2Pl@4GL<0~;EH_\Dh?\18]H387kl0l007LV
+TnRXNOooRlR;`hU8C0_9MDG71Ea@0`0=~3^040~2Pl@4FlW3RmQZ4omc38e;C56`0nP0~3Pl@<
+2l2;`g@Ea`ELD0<03@000;P1~3Pl@4FlW3ReQ<RAPc`8?415_9``00~=EH_\DeIGPn`<PcP0MCR;
+lX_iRmRjH0000;P1~3j6d?~2RmJ;ci>9GO0;fgDPa`ELD0<03@000;P1~3Pl@<GeiKbL>;68UM
+l8=SA23f@Q01M0N;GO22Bd@4mT4@0G@7Reg`PT]44?I1409d3OI240Qd1h]Ml89;A@;f@A04M0gf
+@Q0@M0N;GO22BdD4mT4@27@7Reg`PT]528_`RcZ;GO29Nbb;NQB9Nc2:0HQ3=8Y10HQ3=H_6I\M3
+=_ooPWT10G@6mT8@17@IReg`aT<e0LM3@0<0~2ad<<~4ja>;`8]Ml<M3@040~2ad<<010008]M
+l8=k@0=d8h]i48?W17D:RgT<RG\<ja>;`8]J48?S47D9RgX4Reg`RG\<ReT4ReG`REXhaT8J0<I2
+G0?7@UP0~3PcP0MC2948\M43H308^K\04008UJ9<M2:000~2ReXT2m]d0hUC::4@=P<0Reg`RIR`
+0@00<l23a0aOGU_9``00~:EH_\Pn`PRlZARDgh^@X0~2SEG\j3\0~2RDGl^@80~2SEGh^6<0~2
+j?[QoonQ43H3089890:hH`000>QGiOooPl@PbL<0~=EH_\Pn`\DeIGSEgeREglREGh2l1e4<H2
+<8e20LH008_2GeiKbL>;GOa;REglaP<02l1m2h?i2WD6mmS60Re22l1d8X]eo8_0RmY>RoTcd_Og
+QmZCRX3d@@<0R0J;``_KMNJ9MOb;OOb;mc?0PlWolZkgdH_1Ro[1j@;cYH_8Pn43ljB;AOQOGU_9
+``00~;EH_\Pn`@EXU528U=40_BM@Dc`5k9`h=m401e1X?8oek9`hUEo88j07DARdD82l1d1FK7
+~3<l1NbL>Q43H308^0D040088h0GDJRdD82l1d2h]Eo6HcbHX:IXT8^040~2G\W3XA0f0`2;P:P1
+~2RDGh2l1e3LM5m?oooooYF0000?c7AO@0~3RgGhRPJ8AO4:`0n4@00008Y60HQ5l0[0M3J=@02;
+AOb:03Y5lG8>>TG`M`W7AO@1~3jaR;aXe`0XX>R4ga2\Ud2XY00hQ5l0[0MM29MOR3OOCoM@J3
+b?mNbL>3OO@0MAZ;M@P;mW@;RdglIS?0RP5VR@Jh0@0005k9`h=m409c1X?8oek9`h]520_0M1R;
+COb:4HQEld69COb:2HQ=lVJ;CO9VR@Rh0P0005k9``00~<Rd@T18]D90R;C2@<Pn`<j0C;oon3
+a0c3<lT?\a0CbH_1`hOKEH_\DE9@oeDDbL>@D>QJe_ooQ`@T`hOKEH_\S<WX9@0008cIj1h0~2
+S<7X5`0008cQj100~2S>WX2@0008cAj080~2bL<[dPl3dHT@Pl04`i00EH_\DeIGPn`8RDD8RED<
+RcETC`<0SD00<m^:66J;55j3hPQd0d3[l8U528]528X02\1d13`\M@fh0@0008?425mNFlW3RmV;
+A@SXd@d008_;RDD82l1e5lL5G50300d0~2^040~2Pl@8GeiKbL<;bG@LRdD<ad0401000<M02000
+~2aT0<0LM041P0~2Red<a`<0~3RgD8RG<DRohc`8?9oo:^mm590o5>RGG`RaeTC`<0Rl0cbHX>
+IX\4Bh?P27@3C^_`RGG`RdG`@8U5l<H003?0Pl@8GeiKbL<0~<EH_\DeJ3k0b9A@R9E@b;2XU=
+m0_93hBM~3PgT807@PmT0h0Pn4P0000<L5G50300T0~2^040~2Pl@<GU_9`h]52?I0>08?Q5d0
+~2RdGdRd0@Rc0;mW@hReg`SD00RaiF\07X~4Pl@42l1d6lL5G50303`0~2Xd1H0`2h0@0008?4
+35iKbL>;l`_KMLj;AOB;F1370`00~2ReP@REPDad0H~4RdGdod08jM00~2Rl2;G@Sf@cP1M1K7
+1Ea@0`0:~3^040~2Pl@<GU_9`kPT~3j3mcoon9AO@;`7DFa`ELD0<03@000;P1~3Pl@<GU_9`h]=
+38]em8TaadH@~4RlKX1>Koo`_0RlId4NR]Kooo^040~2Pl@<GU_9`h]M28]3<>Sn2`00RegdRD<<
+2l1e4h_3j8E_oonh0@0008?435iKbL>;GOC7@`P1~3ad<4~4XA0f0`2;P;P1~2R@<;`7@3REP4
+XA0f0`2;GOB9V;P1~2<l23a0aNFlW3~=^040~2``00EH_\EUN3k0B;20_9M0J;D0B9D@B;B0@;
+bG@9Ra294N\ASD00Ra2;3A0f0`29TKP1~2Rg0@2oId6Xe008_>RoR;<E6`0NP0~3RlN3a0@;mWGY
+Ro2;APcXbfkooh_6Pl@4Gek9jKi^ool0~=EH_\DeIGRo2;gX_j\02ioooooo:^mm6;dB_jQm^7
+fi2\?01d2o:^:oX;bH_:M?6@RlI8:l=OGU_9`i00EH_\Pn`4DeIG2lUe1c?0GeiKbL>9COb;?FA?
+0`0cbHX:RQP?]_=VRha?10@006HiS7L41000RdglMC\:fg@gB@_9M3:9COa0@X\mI4l303?9RPZ:
+60nflfJ;S4l41000ISV<M`@4~2RdglM@T:fg@5B@_9MLj;?FA?0`0cfhXHIX^4G`@4~23ko0<m^:
+6VJ;W5l410003koK:l=OGU_9``00~=EH_\DeIGPn`XRo:9CA29AO2;7FA?0`0cdXX@<lUVR`aC
+RmKf`@Qd6h_`Rl2;n4Hc`8X6<lUVR`a3RlOf`@Qek8Uel<M5k000~2Reg`PS\]M@k7AN`1~3@hUM
+l>\=o8]Ml88k:gD4@hUMl8_JRo2=CMR;EA2;AO3X5PX008_CRlH;dW@@PggT07@8RegHRA[[0ob9
+0X=mj01d5<L5G5030040~2<l23a2QOGU_9`h=mk01d<h=mh01e2H5mg000081f5lL5G5030080
+~2^0000823a2QOGU_9`h]5g?OHPl@XGeiKbL>3ON00M@V1OMcooomoMQO71Ea@0`02~3^?ooogn3
+a2QOGU_9`h]5g8?4:5mNFlW3~>EH_\DeIGPn`XRo:9CA29AO2;7FA?0`0cdXX@<lUVR`aCRmKf
+`@Qd6h_`Rl2;n4Hc`8X6<lUVR`a3RlOf`@Qek8Uel<M5k000~2Reg`PS\]M@k7AN`1~3@hUMl>\=
+o8]Ml88k:gD4@hUMl8_JRo2=CMR;EA2;AO3XkPP008_CRlH;dW@@PggT07@8RegHRA[[0ob90X=m
+j01d5<L5G5030040~2<l23a2QOGU_9`h=mh01d5LL5G5030080~2PlSoPl@XGeiKbL>3ON`0M0f;
+AMcgf8?4:5mNFlW3RdGLPl@XGeiKbL<0~>EH_\Pn`4RDGlR`eTC`<0<m::46J;S5420P00R0P:
+bG@LSD00@8\=I4l303?BRQ1VRhaA0P8008P82\Ueih]5o<W3~>EH_\Pn`4DlM5o?ooooof@PP2
+M1371Ea@0`08~3jF40~2o89j6P9e5\L5G5030240~2PTX80^U7~3SD00RdXhPn49MA371Ea@0`0N
+~3PTX80^\\PgX@0W8>a`ELD0<07`000>\JRl2;BQ2=F@69FQ28A0XHaT8J0H9R2?j9AOb;AOaK
+bL<0~=EH_\Pn`@EXUE38U=40_BM0@;`7D5<l1NbL>;CA29COb;5A0f0`2;TU01~2PSX13hE;~3
+2lT?Q2\1~2SD00Rdd<IX\9IXU=lX9ml`1d1X?8oek9`h9mlP1e2<H00>T40@00RTgbR0R;COa9
+RDglPdD<0T0;bGG7jNX0~2Rl23OO`03hCN~3Rl2;C@aVR`UVRDgbPWgc07DHRTgbR0Q02\T?Q;h0
+~2odgljJP0~2Rl2;3A0f0`2;RJP1~2RDgh2lUe3LM5m?oooooYF0000?c7AO@0~3RgGhRPj8CO4:
+b@n4@00008Y>0HQ=l0[9M3J=@02:CO<jCO5b43Y=l7L;adGd0@000>\JRl2;cXea0XXFR5Ga2]9d
+2XY90hQ=l0[9MM29MOR3OO@1MB>;COb3n@9b;hYElhP@SG01RUGbR1J3j@:9COb3`0;[2He008?8
+oek9`h=530:3OO`03hDTooooRdD@:dGlG\W3~?EH_\Pn`<D`_0M@Dc`5_9`fJ9EOJ2OOL0M@f:
+COJ82;P1~3FlW3R`d@=P<0RhU@0@00PST1M@J3b?mKbL>;3A0f0`2;RJP1~2RDgl2lUe3lM5n?oo
+oooYFP0008e00<M5n000~2RdglRQ68EOD:dPn4@00008YA0HQEm0[BM3J=@02:EOLjEOEb43YE
+m7L;adGh0@000>\JRl2;dHe:0XXIR5ge2]]d2XYB0hQEm0[BMM29COb3OOP1MA>:GON8642:GOJ8
+6;P2~3FlW3PlSoFlW3~>EH_\Pn`<<lTcd[QR~3j0SFoolc`8?43<W3~=EH_\<l39`oaERn`c`<W3
+~=EH_\<l39``00~;b0h005JKfGglVmT]948309_Kh]W^PoX0O0j1nX0C~23hfU~3j`b1nX3\ool?
+SY80~2Ro2h~4[3`0M13L3Aa20`0T3hU5m=Y5m>_[PoX0M5ao;oOJRl:3h3l3`8d4P=^X=4830=ki
+Rl8U`1l007@m`NP60l2=183KZ;A40`3NnN\[Rl:3h3l3`8d4P=^X=4830=k9Rl8U`1l007@@`NP6
+0l2=183KZ;A40`3NbM\]Z4430=SIVmoPWW@DVmoPZ11d4<H10^\;gMSK;JQ10`360@6Kfn:KfFgl
+G\W3T0000<P<~2EY_IOObKfBd`@P<0Vm_RfNj3nP1l2X7j008007ekj`b1nP3nool?SXH0~2Ro2h
+~4[3`0M13L3BQ20`0T3hU5m=Y5m>_[Rl:3n01d>7l2mmR;l8?P?`?0S@B0fjPd@P<0RlHU`040
+07@@`NP60l2=183KZ;A40`3NbH?j07d4g_W[0]k9gEgdgDGdg1Dl@@<0VmoPWWH=gMSM1DA10`36
+0@7[3m`E=44309_Oh9ic0lH10Y_KhY_IKOaNbL>@EFQH0080I?le~4RnaTRBd0~3DeN3k0R;fPn_
+f8_3j8EYoon;b8U=m0_9M1`cdXYAoOK287@B<l2;nH_;`NT2lj^;bh?Q0o>ZRdGdPl@8Ge]TS`D0
+~3Pl@4GL<0~;EH_\DeIGPn`\RDD8RmR9E@b9CA37ANP0~3REG`Rd\<>D\43i?02\1d:8]CC8_3
+j;>Boon;bc]137@8Pl@\GeiKbL>;A@R;F4b96<M01000~2ReD8PgY00Pn56`4008]J32]J18UM
+i8]Ml8_k^0X0~2RgD@Rlh;i?:^SGooM08coh_>2omd<h_go8_6:l<[b8eN0G@OSE7oRo^h2P00
+08_:2nCb[Xeoog@2<on;bX_g2omeeXUMl8U=48]El8]e32_FREG\2m8?QZ`0~2>eGT3hMD~3Red8
+Rc^;`X_8`NT2ljF;b8?Q0o>TRlZ;0`?1R@<3B`B9B`B;Ddb;`nSSTOoo>d<4M0R3a2aOGU_9`h]5
+28]HC8THad04~4RdG\RDGXjDl0~2Red8Rd\42lUf9X]CC8_3j:RAoolk@`Ad28?4;5mNFlW3RdD8
+ReQ<RAS7@0@0~3Reg\Rl^;E@b;A@SXO97oohU5j3_3M0R3a2aOGU_9`h]=40_93hJe~3RgGXRegP
+RdD8o8]@32]@18UEi3_AMPN;fN\6SD00RegTRGGDRDgHRl^9CNb;>8]El8_bRDgL`NT2ljF;bh]M
+e8?Q0o>TRdgHRggLRo>;60?ORAP3ehUEl8]H10?OREP4:ll3mh]@33_J3i?32]^;gg@h2lUf=8U=
+g8_:RoR;EdcXgI3ooh]=g9N;D0`knW@>RlL3aR_2Pl@\GeiKbL>;D4b94<M01000~22lT?QeSo
+oon9MNR;ANR3a2aOGU_9``00~<EH_\EUN3k0R;d8_j<l23bOob[X_jmm59@H_1j<aVoon;d8_7
+REGd2m9d7H_g<l23bOob[_OARl6;n\7Y0_>URlR3h@?cY>\:a`ELD0<03@0008]5m8?425mNbL<0
+~;EH_\Pn`DDeIGRDD8RED<RDd@ad4@~4ad4<~4ad48~4ad44~42m9l2X?j0G@5PoXTOPn;AA37
+@101~3GeiKbL>3O@`03hE_~3RdD8PSP`3hEG~3@8U528X0?7Qd13aHMC6Q43H308^0V04008]@
+18]5240cfhXH<lUVR`aJm\41M129A@S7A@`@~3jF@0~2o8]54<M03040~2adD<20000>U=~3Rl37
+A@`:~3jCl0~2Pgd<47DiRdD8PSP`MC6:@04lN7@4?5Qe9Z4@=P<0Rh2H0@00RdP4RdD8Pl02<m::
+43?KIX\LDOK30G@3RDD8adGl~4Red<PlSo<m;glhU5n8UEm3?KRdD8RgG`Rl29GNb;3A0f0`2;
+RIP1~2RgT4RPP?]]TcdVJ;55n;GNcf`P9d3h7Qo`0008_aPnh`jcN;`8\=43H308^9V04008]i
+13?9RPR=34lcdVJ;4OK60G@@IX^a10@000nomX?^En\6o;kooomoRdd<>lif>8]=4<M13040~2
+Rdgh>mUg2C_IMA<kMOAf3X]=4<M12040~2<m_[2X_;Red<3joI0mi0jESooon9GOb9A@R;CA2;
+EOb9D@B;E@R94EmNFlW3~?EH_\Pn`XDhU520_BMC>;fVXHSDgHDFX1D;04j000~2Rm>3a129AO`;
+`7@@a`ELD0<05`0008?8oe_9`c?0FlW3PoX6M@[7AOQ28000jc7lPoX4M@_7AOQ08000jb:;`8?j
+0WD;adGh@B000>\BRl371Ea@0`0T~3PlSoFlW3JP3oMOQZ0FX0JP2=CO1ASDgdDOme2;08j000
+~2Pl@PRDGl2l1e4_mem;01j000~2Pl@4<l1KbL>;AOb3n09d3h?h0g@:PoQkM0F3n6ie3<L5G503
+01L0~2jbj;AOb3n0Ed1H?h87D?a`ELD0<060000>\ESD00a`ELD0<0?00008]5o:=0F0<0PlSo
+FlW3~<EFQH0080I?le~4RnaTRBd0~3Pn`HRDGl2l1e7<L5G50300`0~2PlSoPl@HI8l5~4Pl@4
+GL>;AOb2N3D0M1O71Ea@0`0W~3adGhooooonUO~3o8]5o8]888U=n?I0>0Ad2LM5m0@0~2j`O7
+AO@0~3RdGlPWPd0GD<adG`0P000>\:SD00adG`~4RdglmT5587@8^100~2j`?l<l2;EO@;EO0;
+d8]5n>P62000RdGhPl@HI8l5~4Pl@4GL<0~;EH_\Pn`8SDghDHe=o56;b56`0nP0~3Pl@<2l1e
+5H]=o87Qo`0008?i0GD7^040~2bL<c`<W3~<EH_\Dh?\68U5287j080007@KPOX0@000M1?71Ea@
+0`0T~3PlSoPl@HFlW3RmZ=AOA@SDGhD8]5252`0nP0~3Rm>3a0`;`7@Ca`ELD0<0:`0008?8oh?4
+65_9`h_JRdD8j6`7~2Rm=VRDG^mTGho`nE`H7Qo`0008U=l87j080007D6<l3[1h_0^080~2IX]M
+kVJj701V8m<?_m8;AO0;d8]52>Sh1P003koKm\<2M0Rk04000>\6o;\0P000Rl>3a1QKbL<0~>
+EH_\Dh?\;8U528UE36XHSDgHDFX1D;04j000~2Pl@@2l1d4lL5G50301L0~2PlSoPl@\FlW3Red<
+I\M30P00I\M32000I\M32P00SEGHRl?XAPL006K7@`@003?0IX]5k?K047@=I\M31<11jI80~2
+Rl1VRdG\Pn083hF3~3RdD<IX]H16J1b`21IXUH16J;CNb3h@5e1h3;P6J9F0B;C@R9COR2>@1d
+2D62>@1enXU=n8]5n8eHo8UMn3]M27I1PS\^MA6jW3h308?X0nR_1`002l1d9;ZP?P<0Regh@h_3
+j9\7~22l2;`g@>^Z@n0`3XR`L000_0M@N;A@b2B0A0RaeTC`<0RdD8<lV:26J;W4\41000IX_;
+P_UQLR>2nGYg7X9h0CYe687So`0008?[HH]536J9F0aVRAS[8he008e=l56=COAA\0;X~4Pl@8
+ReGdBX]=36J9D@aVRA4c`8?4;5_9``00~:EH_\Pn`dRED<JP1X4B0006X1JP1Z08e=n56=COaA
+D;08j000~2Pl@PIXU5mVH;`7@_IX?h17D<a`ELD0<06@000>\EIX=mmVh?UL0Uo`0008?05j=L
+D0<0PlSoPl@dbL=Z68e=g55Z0Omeo;04j000~2Pl@@IXU5mVH;`7@Ya`ELD0<0?00002Goo`00
+Xd1H0`3oMOb`0NP0~3Pl@4PlSoPl@dbL>3O@`03hGF~3SDg@DK01j000~2Pl@4IXU5mVH;`7@Y
+a`ELD0<0?00002Goo`00Xd1H0`3oMOb`0NP0~3Pl@4PlSoPl@dbL<c`8Y5e8Y=i8;Qh2@O2\R8
+CN@c`8Y5eFJ;CNAVPN4Oo\7P1FHUo`5V2lQVRDgT<l1VRdGF;K`7~2RTgUP>41dN0:b8Q=iC?0
+RTGBVH?R0@?2dOR:CNJ2hN0T7`[8R4gV<l2:AM5VRdgVIX7Q7oS1h0EV9Ol7IP_8IXU=iS?0RTG@
+RTgWP>47`N032\R8CNOYT00008_0RdD<Pl04j<eLoon;b8]138YEi8;Rh2@O2]28ENB;@A10IX]E
+i6J1hQon`N05IRGo0FH;d6J9ENB;@AB3j52:ENF0hP7Ah0[@R5GUR`6ITX?P0@?@dOZ:ANHTh8;R
+7`[2R4GVRe44IX]5iVHU7oS1hPEVPN;o1fH;`VJ9ANJ;@@R:CNN0h@O1h0<:b8Q=ifXHSDgLDFX1
+ogGl\0CX~4Pl@@IXU5mVH;`7@Ya`ELD0<0?00002Goo`00Xd1H0`3oMOb`0NP0~3Pl@4PlSoPl@d
+bL?oMOb`0NP0~3Pl@4IXU5mVH;`7@La`ELD0<0?00002Goo`00Xd1H0`23b?n3a3C9`c?0Pl@d
+bL<0~=EH_\Dh?\13goo`00O`@;`7d8<l23a0AKbL>3?K1G0`00MAF;f>Pj0@002l2;`gD8<l23
+a0AKbL>;7K1G0`0i@cao5H_Hj280~22l2;`g@8<l23a0AKbL>;7K1G0`2=18>3`423a0AKbL>;
+`5EXF00206Co=@00~2Rnb3k1QTRBd0~3Dh_HSDg\DK01j000~2<\3X~4Rl>3a0@;`7DMR`f`E`<0
+RDgladGh01000<M5m?03~2jD\0~2o8\=\5L308]I?3_HObn=39V3`D29COa0:l?1h098VH7Ro`l0
+00?2`OP<@<7P38U5n<M5m004~2ja6=@037AO`0~3adG`~4Rdgl2lUd:FP@1000ogGhDK03j000
+~2Pl@<RDG`2l1e3h\=\5L308]A?0=Em8UA?3;0j000~2SDgXDK01j000~2Pl@4RdG`Fh_UI8l5
+~4Pl@4GL>=@01EJ5P00P1TocD0~3RnaTRBd0~3Pn`lSDgXDK01j000~2<\3X~4Pl@4Pcf`E`<0
+00n5i`0008e=k56=CNAA\0;X~4^B@0~2SEG@RdG\R`3X@>Cooh?428e=d8U=m89md01d2_a1PST0
+MOZ9COC7AObX?P<0PSfX?P<007@C^JPn0`2;`462>@1enXU=o8e008]5o8e8ohU=o88i;WD6PnP2
+RDGlRdgdBHU=m8X1ReGlR0:=EM0kbWOGJP=XZ3h308e=n56`0nP0~3Pl@<RDG`2l1e2h]=n8T=
+\5L30>\jPgg`0WDdJP=X010406RX?P<0SDghDK04j000~2Pl@@RDG`2l1e4h]=n8T=\5L303?0
+j>Wmoon9AO0b`>P0~3SDgPDK01j000~2Pl@4XK1G0`23a3aTS`D0~3Pl@4GL?lEH_\Dh?\28_J
+j4;moon;dhU5n0_0M@YVPlSoPl@8FlW3RdGhIXT@IX_2Pl@8FlW3EH_\Pn`8j1Gmoon9AO`;`7D8
+IS?0Pl@8bL>;COaVR`63a0S9`he005F;k5>3k0R;f^SZo?ooRm>9AOP;`7D:IX?8oh?425_9`h]5
+n6H;46J946J;`X?425_9`oaERnaCPn`8Rm[X]_cooh_CRDGh2l1e23?0Pl@8FlW3RdGh3kl03koB
+QM0?UL0Uo`0008?425_9``00~:EH_\DeN3k0b;fX_h<lV=D`R=@`[X?`0008U768_8SE<4SD<6
+j2l0~2RDLDRdlHRm>=@`;X7`0008_CRlR;ahU878]:38U846K7@0H108?435mKbL>=@01ERnb3
+k2QVPcX0MA5VPcP0M@\;bG@7Rl63a2S9`hX8Pn4OdN69CMaVR`R1hOl7~2`NT5RDgPRTP1PN7o
+~3`NT3RDgTRPZ3hAn9CNQVR`Z1hOl1~2`NT5BHU=k8Y:0H7Qo`000=7YPl5@RDg`adGlooooohe5
+g>Q3ZoooPl@XbL<0~=EH_\Pn`4DeIGRlZ;7FA?0`0cdXXARDglRPP?]_UVRkAC10@008]Eo6Hi
+]7\41000MCD:bG@aRl10SEX1R`eTC`<0<m::4hUMo8XH3kKkIX^dD@@4~2ReGlISVdN@@4~2M@@:
+fgGARceTC`<0<m^:66J;Q5l410003ko0<m^:6VJ;W5l410003koK:l=OGU_9``00~<odeCAe=5
+Ac<b0060~2<4P108d514P2051ERnb;A@B7A@R9A@AMj@00~2o`00ool0~=
diff --git a/support/vvcode/binaries/os2/vvencode.boo b/support/vvcode/binaries/os2/vvencode.boo
new file mode 100644
index 0000000000..6386ca395a
--- /dev/null
+++ b/support/vvcode/binaries/os2/vvencode.boo
@@ -0,0 +1,1589 @@
+VVENCODE.EXE
+CEZ`00<0~210000?oo~2_P00~5@000~QP00000hO^Ph0]0W=8KP1C<dQE6QYLb1`LVmWLV5]86=Q
+KVi_M21RIB1bMFhPJFhPHB14Ce<PLfEcLfU_KRh=3@XT~2C5P0~50P01~30P0@0P0060000040
+~2B7000080~2d6`0~24000100006P2~6o@00~5a0000080~2m0000;04~:]0400<01~:`@4002D2
+~260@000<0~2:@@0~5\0@0~A0P00~=1@00~68000~DF2T1~30@0580000@0001<0~6d6`0~30`03
+8000500000D0~6e0<0~24000e0@0~24000e0D0~24000e0H0~24000e0L0~24000e0P0~24000
+e0T0~24000e0X0~24000e0\0~24000e0`0~24000e0d0~24000e0h0~24000e0l0~24000e100
+~24000e140~24000e180~24000e1<0~24000e1@0~24000e1D00609~6Y`h10>\0~2a0l10>P1
+~2f0d10<H2~2d0l10<<3~2404000QfMVE^HfmTI@00~N;00004@0~2HP0007H0~2W00009`0~2
+W0000;l0~27`4003`1~2F@4007H1~2l`400?<1~2l`400?<1~2l`400?<1~2286:3@86206B3`5L
+0@R1g`l1h2P11P4[0BX>J@jL3]\>3Pm=3`P1gP\1>0480MT80@01:0420BP1?02J00P1\`l1<048
+PG@80NH80Md60JT1207E1P6Z0BP10P4[0CL3E0@80FD40@41285o105^206a104`0BP10P400J08
+Q@TX0@D16P6Y2S@;XP]d3=h<:0430C01HPIj1Y86204[1@5;0@P1]PP1CP480Ml<0Dl1207?204h
+0@P1hP@1NP4X0@81004H1`@8206P1`4@0BP10P4A0O45I@H80FH70AT1:04;0AX1c@SR2?L8C@UR
+2GL9WPVc2LP9?0Y@2PP1VP41I048PFd?0NX80B\40B\1207S0@5j0@P180H1OP4X0@<1004=0I01
+j@4X0@816@450541206C104[0@R1^`81g`P12PP1:`4X0@D1<06O0L46P`O:3Dh?206Q3@410@P1
+S@d14@48PA0=0MlXP@81h?`>JPlX0@@10@4E0Ul2bP?O0`R1C`T31PP1WP414@480E<10A<1207[
+0@4G0@R1X0<1fPR17@01g`R1=@81iRR10P7X]PB[1BR10P7YG@FY1PP1Q@H1;0480E<60Bd1204m
+1@4a0@P1bPD1>04X0@81O06_1:@5:0420Gd1J0Fd1PQ4Ce=3@Da<D`=>C5<3CE=7~70@0S0;02
+0`2h0P<0~4`0830<P20`3@0P<0f083~5K0D32@01~20@0307P50`T00@000@0308050`T00@00
+0@0308P50`T00@000@0309@50`T00@000@030:@50`T00@000@030:`50`T00@000@030;@50`T0
+0@000@030<@50`T00@000@030<P50`T00@000@030=050`T00@000@030=P50`T00@000@030>P5
+0`T00@000@030?P50`T00@000@0300@60`T00@000@0300`60`T00@000@0301@60aD00@000@03
+02060`T00@000@0302`60`T00@000@0303@60aD00@000@0G02A9I2@0~330830040~650832@01
+~20@0302@20`T00@000@0K02`20`01~7=0830080~6>0832@01~20@0?04020`01~7C0832@01
+~20@0?05`20`02~7J0832@01~20@0307`20`T00@000@0308`20`d00@000@0;0040~6V0832@01
+~20@030:@20`T00@000@000N@20`0\0`<0M0<30;`30`0410<0C0@309@40`3L10<090D3~5I6ER
+MFL0~2IFiSKfAYKVMOM65RK6D006I_LVeQM000J6E\L000~2K6mW06e_I6D0~3KgIULWMbJGAU
+~3LVESKg9TGfaUKVMdJ00007AYKFEcM65]L00007AbHFicK65dJFm^GfIYK6D0~3J6EQI6EbGfIY
+K6EcL6ES07=`K6UdGg=YNVD006U^L7EdGfIYK6D006meM71eM5mVJFaU069YKV5bN@00M6EhM000
+~2I6EVHGE\M01cM79UHFd006IYN6ET~3MV5bJF5RK6D0~3AP0102X102@1~2:RXP85AXJG<PJG<P
+HB1FEVE^HfmTIF@PIVU\IBhP84U]L6aUKFE^M65dJFm^Lb1_IR1FETA5@dm4AB1QKV@P820P820Z
+:P00:RXP85IFADi3CdA5865bIB1VLVEUK7TPHGIQJFaQHVaU86I_LR1]HFii86AYIVIULVE^M21S
+Kfe`MGAULW<PHFiT820Z:P00:RXP86m`IG9QM6U^Ib1cNG=dIFec;R0PE6QU86eQLgAULR1`Kg9d
+HF9\IB1387=_MG9SIB1YLb1QMV5YK65RK6DP820Z:P00:RXP86IbKfdPM6QU845cM6m^85E^JGIU
+LW=YM7TPE6EH865bHfQYMVDP;B1dJ6DPJ6m]IB1_IR1FET=?A4D^820P820Z:P00:RY200408040
+U00Z:P00:RXP84UV87U_MB1gHFid87A_86IYKV@PKgEd86e_LVDPHF9_MG@PEUI3CdA5;21cIFiT
+864PKFEcLf5WIB1dKb0P820Z:P00:RXP84aYLgAODfEbMVEb@5AUF2i1HbiEJb1gJGAX87AXIB1c
+MF9ZIF=d87AUN7@P9dQ5C50PEUI3CdA59b0P820P820Z:P00AP0102X109<1~2HGAdLV9UIfU^
+~3HGAdLVE^I01RIFMYKP00069iM6ESKgE^M00006=XHG9QHgAULW=UM000~2Hfm]KFE^M01SLV<c
+<P0006AUHfmTIGIULW=YKfh0~2IFiT06I_LVeQM000KFmTI@00~2Kg1ULV5dJFiWLgUcM6E]079U
+HfmbI6aUKVMdJ000~2Lf]YL6IbKfd0~3Lf]YL7A_~2M65RK6D0~2M6U]IG=dHFe`~3N6ad;FIb
+Kfd0~3N6ad;GA_~2N6ad;G=eHW=dHfQQLP0006U`Gf9eIVIULP0004A5@UE7>R00IFiSKfAU>R1b
+IF=_LV@PK6E^IgAX83dP9CE\I2`PM6mdHF`PHWUdIG<PLVEQI20m82Da<6aT00X0~3I6EVGfIY
+K6EOKV5]I@0005IFIFiSKfAU82Ec;20ULb1bIFaUHG=U82PULbT:~3<2hi=b1RIGAQ~3Ce<_<R0b
+;WPPBD9=84<PDfEd;c80~3<SDPCVmf834i>C80BBm@86IYK6Dj6P01020101h09G<0~2CgIULWMb
+JGAU86EhJG=dJFiW86IYK6Ec>PX00@0P0@0F02Ec~3NFEc06i_~2C6mW86IYK6Dj6P01020101D0
+9G<0~2AFiSKfAYKVLPKFEdJ6mT>Q<00@0P0@0G05IFHfmTI@X004T_D21VJFaU86e_I6Dj5@01
+020101d09G<0~2MFi[KVmgKP19;e0PIVU\IB1VKg9]HG@j4`0102010<P09G<0~2MFi[KVmgKP19
+;e0PIVU\IB1\KfiWIG=d879UHfmbI21\IFiWM6Pj820P82E\I000BBm@86IYK6DPK6m^IfEcM21b
+IF=_LV@PK6E^IgAX>R0P821eKV]^KgM^~2BBm@86IYK6DPKF5hJFeeKB1bIF=_LV@PK6E^IgAX
+>R0P820UK6@004T_D21VJFaU86eQN6U]MFdPLVESKg9T86aUKVMdJ3XP820PMFi[KVmgKP00BBm@
+86IYK6DPM6U]IG=dHFe`>Q000@0P0@1o02Ec2P00MFi[KVmgKP11Dd=9B@0007AbHFicK65dJFm^
+86IYK6DPM79QKW=\HGAULb1VLVm]860ULbLPM6lPH2Ec9`0006a_Hf5\86=XHG9QHgAULR1cIG@P
+JG<PH2Ec9`11Dd=9B@0005AbHFicK65dJFm^871ULVI_LVeUI3X=00408040G`5^KfiU04U^M6Eb
+KV5\86EbLVmb86AUM6ESM6ET86U^82Ec:2T0Kg1UKUmYL5mVJFaU~4A4E2EDLj801UKV=_I6Dj
+86m`IFiYKVLPJFi`MG@PIVU\IB1P9G<W00X0~2IG9bKg8PKg1UKVU^Ib1YKW1eM21VJFaU860U
+LbL0~2A4E2EDLj801_L6E^GfU`GfIYK6Dj860ULbLPJG<PKVmd864PLVEWMFaQLR1VJFaU00X0
+;@00~2LgATKgEd~2MWIU04A5@UE7>R00Kg1UKUm_L5mVJFaU>R1_L6E^JFiW86meM71eM21VJFaU
+860ULbL02P00~2MWIU04A5@UE7>R00Kg1UKUm_L5mVJFaU>R1_L6E^JFiW86meM71eM21VJFaU
+860ULbL02P00~2IG9bKg8PKg1UKVU^Ib1_MGA`MG@PIVU\IB1P9G<W~22UIFAB1?;e0PIVU\ICXF
+004080402`4UL`00A4E2EDLj801_L6E^Gfm`GfIYK6Dj860ULbLPJG<PKVmd864PLVEWMFaQLR1V
+JFaU00X007ARK01ULW9_LR1bIF5TJFiW86E^HfmTJFiW87AQHVaU86IYK6DPH2Ec9`00A4E2EDLj
+801UKV=_I6U^Ib1dHF9\IB1^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P00I6EV
+HGE\M21FET=?A4D002\]<34b<c@e=SLh>D52@dA5ATM8BDY;C4e>Ce1ADU=DEEIGF5UJHF9SI6EV
+IfQYJV]\KFi_L75bLgAeMWMhNGX0~32TE^HfmTJFiW87AQHVaU87=_MG9SICX=00408040700U
+L`00AFiSKfAYKVLPM65RK6DPHfm^M6E^M7<j2`01020100T09Bhc<W<0~38`01020101d09Bhc
+<W<0~3EUI586E^HfmTJFiW86I_LVeQM3X?00408040>P0UL`0006i_M21bIF=_LVAUI000~2J6Ab
+GfIYK6EOLg1UH`0005IFAB1XIF5TIG8PIVU\IB1cL6ES>Ph00@0P0@1g02Ec~3BFidIG9^HF`P
+IG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1cIGAOJG1OIVU\IG=`IF<0;@0007=dI6U^~3JFifHFaY
+I21VJFaU86E^HfmTJFiW86e_I6DPLfEd82PUI2T0EUI586E^HfmTJFiW86e_I6Dj4@01020101l0
+9G<0~2EUI586a_KVMULg@PLVESKg9T86aUKVMdJ3X900408040C`1^Kg@PLVESKg9TIF@0JFif
+HFaYI21\KfiWIG=d879UHfmbI21\IFiWM6PPLfEd82PUK6@Y05IFAB1\KfiWIG=d879UHfmbI21\
+IFiWM6Pj2@01020104L09FaT~2JFifHFaYI21\KfiWIG=d879UHfmbI21\IFiWM6PPLfEd82PU
+K6@Y05IFAB1\KfiWIG=d879UHfmbI21\IFiWM6Pj2@01020101l09FaT~2EUI586eQN6U]MFdP
+LVESKg9T86aUKVMdJ3X900408040C`1^Kg@PLVESKg9TIF@0JFifHFaYI21]HGQYKGE]879UHfmb
+I21\IFiWM6PPLfEd82PUK6@Y05IFAB1]HGQYKGE]879UHfmbI21\IFiWM6Pj2@01020104L09FaT
+~2JFifHFaYI21]HGQYKGE]879UHfmbI21\IFiWM6PPLfEd82PUK6@Y05IFAB1]HGQYKGE]879U
+HfmbI21\IFiWM6Pj2@01020105L09FaT~2A4E2EDLj801cL6aYM21cJGYU86i_M21cL6ESJFIY
+IF@PKfhPM6QU86=_KFeQKV@PK6U^I@0:~2EUI584l_D21VJFaU86eQN6U]MFdPLfUjICX90040
+8040F`1^Kb1]HGQYKGE]~3KVmd86E^HfmTJFiW87A_864PIVU\IB0]86IYK6DPLg1\JGAdJFiW
+86AYLf5RK6ET~4EUI584l_D21VJFaU86eQN6U]MFdPLfUjICX900408040J@1^Kb1]HGQYKGE]
+~39FaT06U^MV5\JF@PLg1\JG@PLfUjIB1cL6ESJFIYIF@PH2Ec9`0007=`K6Ud87=YNVDPKGEc
+M21RIB1QM21\IF5cM20UK6@PJd8005IFAB1?;e0PIVU\IB1]HGP0~80@0:06U]MFdPLfUjICX9
+00408040700UK6@PJd80~2EUI586IYK6DPM6U]IG=dHFe`>Q000@0P0@1T02Ec~3KVmd879UHfmb
+I6ET~4KF5hJFeeKB1^MFeRIG8PKfHPL65bM7<PLVEQHfQUI20X9F@Y~49G=cJfU`M6lP9F@:05If
+051QLW@P9C=T869iM6Ec87MbJGAdIFhj3001020107009FaT~2MRD`<V@0~2IG9bKg8PKg1UKVU^
+Ib1_MGA`MG@PIVU\IB1P9G<W~29G<UL`X0EWH0~39G<ULb0UK6@:05If~49G<ULb0U<3Q\N0X0
+EWH0051QLW@P9C=T869iM6Ec87MbJGAdIFhj3001020100d09FaT~22T=B@bdc<SXL00408040
+6@0U<3Q\N00005A_M65\869iM6Ec879UHF@j4P01020101T09FaT~2E6mdHF`PHWUdIG<PMg9Y
+M7AUKSX?004080407@0UK6@005A_M65\84l_D21`HG9dLb1gLVUdM6E^>P\00@0P0@1X0RET~3
+2UIFIFiSKfAU82Ec;20ULb1bIFaUHG=U82PULbT:2P0`;STg869UM640~2Ce<_<R0b;WPPBD9=
+84<PDfEd;c80~3<SDPCVmf834i>C80EUIUKV=_I6Dj82Ec2PX005EcHFMU>R1FEVE^HfmTIB0P
+Fg5eHFaYIVUULW=M821YKW1eM5mVJFaU821KKgEdL7EdGfIYK6EM2PX0020PEV5\JF@PLGEQK6UV
+JFEbLb1QLVDj2PX0~2820U;S5c9G<:02l]~4820U;S5c9G<U;S5cIVU\IBecL6ES2P0_;@0003dj
+;@0P82D^<G<ULbD^<G=VJFaU;FI_LVeQM20P:6I_LVeQM7<PLgE`L6mbM6ET>REc9G<ULbEc9G<U
+LbT:02l]~3?CX]~38000~3820U;S5c9G<U;S5cIVU\IBecL6ES2P0_;@0003dj;@0P82D^<G<U
+L`X0;bd0~3820U;S5c9G=K9BhaLfIYK6D]Lg1UHed:02l]03dj;@0P82D^<G<ULbD^<G=VJFaU
+;Fe_I6DP82Q]KfAULb1cMG1`Kg9dIF@j869YKV5bNB1dIGQd:@X0;bd0~2?CX]020P9BhaLbEc
+2P0_;@00~2820U;S5c9G<U;S5cHWUdIG<:02l]~3?CX]020P9BhaLbEc9BhaLf]RNGAUL`X0;bd0
+03dj;@0P82D^<G<ULe\U;S5cM6U]IEd:02l]~2?CX]020P9BhaLbEc9BhaLfIYK6D]Lg1UH`X:
+02l]~2?CX]05If05H02P002U1QLW@P9C=T84l_D21VJFaU>Q400@0P0@1H02Ec~2D65bM20U<f@P
+LgAQLWAUI21QM219;e0PHWUdICXP820P820UK6@002Ec2P1GLVUdM6E^869i85IFIFiSKfAU82Ec
+;0X0~3<2hi=b1RIGAQ~32`01020100839G<PLVE\IF5cIB0X9G<Y2P1?Dblb838^N219@TdP@b1C
+IG@_<P00~2<SDPCVmf834i>C802P0002Ec9G<P9F@:05If02Ec9G<P9G<:05If04mC;c80~39G<U
+Lb0UL`X0EWH09G<ULb1?LVUWJFiQK21VJFaU86=XHG9QHgAULR1cIG@PMf5c82Ec2P1FMP11Dd=9
+B@0002Ec9G<P9G<:05If045C@dU9~39G<ULb0UL`X0EWH09G<ULb0UL`X0EWH09G<ULb0UK6@P
+9FaT2P1FMP00~29G<ULb0UK6@:05If~49G<ULb0UL`X0EWH09G<UL`X0EWH0~39G<U;S<bL`X0
+EWH09G<U;S<bL`X0EWH09G<ULb0UL`X0EWH09G<UL`X0EWH0~39G<U;S<bL`X0EWH09G<U;S<b
+L`X0EWH09G<ULb0UI20UL`X0EWH002Ec82E\I21RNGAULb1VKg8PM6QU86eULg=QIfDPHWEVIVEb
+2P00~2AT5D@D`j87E^HF9\IB1dKb1QK6a_Hf5dI@0004A5@UE7>R00KF5YKSXPHFa\Kf=QM6ET
+82E\I21RNGAULb1VKg8PHWEVIVEb860ULbL0~2AemdKG1OKG=W00X0AemYL5mRMFIVIG80Aem_
+L5mRMFIVIG80;bd003dj;@1XIFa`879ULGEULgAUI000JFi`MG@PIVU\IB1]MG=d869U87=`IF=Y
+IVUUI000~294UT9000~27`0001`0~27`0001h0~27`0001h0~27`0001l0~27P0001l0~27P00
+01l0~2IG9bKg8PHFa\Kf=QM6U^Ib0UK6@PHWUdIG<PIVmb869eIVIULR1P9G<W~2A4E2EDLj801Q
+K6a_Hf5dIEmRMFIVIG8j865\K6mSHGAUI20UK6@PHWUdIG<PIVmb869eIVIULR1P9G<W00X006=_
+KFeUKWAOLgAbGf9eIVIULP009BYc82EKGPYM~3EUI586IYK6DPHfm]KFE^M3X>00408040A@PU
+L`0006EbLVmb871QLW=YKVLPMV5\MFDPKfHPH2Ec9b1XIF5TIG8006EbLVmb86=\Kg=YKVLPIVU\
+IB1P9G<W04A5@UE7>R00IfEdHemVKg9]HG@j86I_LVeQM21^Kg@PLg1UHfUVJFET86m^87AXIB1S
+Kfe]HFiT86aYKVD02P1VKg9]HG@PH2Ec9b1YLb1^Kg@PLgE`L6mbM6ET869i87AXJG<PJFe`K6E]
+IFidHGAYKfh0IVmbKF5d860ULbLPJG<PKVmd87=eL71_LWAUI21RNB1dJ6Uc86U]L6aUKFE^M65d
+JFm^06U^MV5\JF@PIVmbKF5d860ULbL0A4E2EDLj801WIGASGfI_LVeQM3XPHfm]KF5^I21\JFiU
+87=`IF=YIVUULb1VKg9]HG@PH2Ec9`0:~3A4E2EDLj801WIGASGfe_I6Dj86e_I6DPKVmd87=`
+IF=YIVUUI21_KR1dJ6DPHfm]KF5^I21\JFiU00X0JFifHFaYI21]KfAU860ULbL0~2A4E2EDLj
+801WIGASGfe_I6Dj86=_KFeQKV@PK6U^IB1cL6ESJFIYIG<PKFmTIB1P9G<W00X0~2A4E2EDLj
+801WIGASGg9UHfaUKSXPLVESKg9T86aUKVMdJ21^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe]HFiT
+86aYKVD02P009FaT06U^MV5\JF@PLVESKg9T86aUKVMdJ21cL6ESJFIYIF@PH2Ec9`00~2LVES
+Kg9T86aUKVMdJ21]MG=d869U86U^87AXIB1bHFiWIB0UK6@]9FaT82Q^Kg@P9FaT:@00~2LVES
+Kg9T86aUKVMdJ21]MG=d869U86U^87AXIB1bHFiWIB0UK6@]9FaT82Q^Kg@P9FaT:@00~2A4E2
+EDLj801WIGASGg9UHfaUKSXPHfm]KF5^I21\JFiU87=`IF=YIVUULb1]HGQYKGE]879UHfmbI21\
+IFiWM6PPH2E\I2L02P0004A5@UE7>R00IfEdHemdJFeULgAQKG0j87AYKFEcM65]L21^Kg@PLg1U
+HfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P0006U^MV5\JF@PM6U]IG=dHFe`87=dLVU^Ib1c
+L6ESJFIYIF@PH2Ec9`14AD9EAcXP06QUHFAULUmdNG1U>R1FETDPK6U^IB1]HGASJ6Ec86QUHFAU
+LSXPH2Ec9`0:~4HFeRJFMeKgEc86QUHFAULR1YIfi_LVET~4A4E2EDLj801XIF5TIG9OM7U`ICXP
+JFM^Kg9UI21eKV]^KgM^85IFAB1XIF5TIG8PK6U^ICXPH2Ec9`0:~4A4E2EDLj801]HF]UGgAY
+KFDj86AQM6DPL79_MVUTIF@P?B0U<3AT;bD`<V@_9C0bI00:04A5@UE7>R00KF5[IEmdJFeU>R1d
+JFeU871bKgIYI6ET83dP9C0bI3XU<39T>RD`<V@02P14AD9EAcXP06eQJfEOM6U]ICXPM6U]IEmd
+87IQK7EU879UM7EbKVET83dP9FaT00X0~3A4E2EDLj801_L6E^Gfa_IemVJFaU>R1\KfLPIVU\
+IB1^Kg@PLg1UHfUVJFET86m^87AXIB1SKfe]HFiT86aYKVD02P1\KfL0A4E2EDLj801_L6E^Gfa_
+IemVJFaU>R1_L6E^JFiW86a_Ib1VJFaU860ULbL02P00LgATIG9b~2IG9bKg8PKg1UKVU^Ib1\
+KfLPIVU\IB1P9G<W04A5@UE7>R00Kg1UKUm\KfMOIVU\ICXPH2Ec9b1YLb1^Kg@PHB1bIFMeK65b
+86IYK6D02P1TMFe]N@0002DZLb0UL`00IG9bKg8PL65bLfU^Ib1fHFaeIB1_IR1P9G<W86QUHFAU
+LP00A4E2EDLj801`HG9cGgAYKFDj85IFAB1dJFeULgAQKG0PLgAbJFiW871bKgIYI6ET83dPH2Ec
+9`0:~39C0dI2hU<39T;RD`<V@]9C0bI3XU<39T>RD`<V@0~2IG9bKg8PL65bLfU^Ib1dJFeULgAQ
+KG0PLgAbJFiW860ULbL0NFEQLR0XFEUIFBTPKGEcM21RIB1YKR1dJ6DPLV5^IfDP<CTg<2db<3<g
+82Q^Kg@P9F@Y2P00~2KFm^M6PP:4e=:B1]MG=d869U86U^87AXIB1bHFiWIB0a;C4b82Q^Kg@P
+9F@Y2P00I65i82Q4A2TPKGEcM21RIB1YKR1dJ6DPLV5^IfDP<Bdc<B0XKVmd82ET:@X0~3J6me
+LW<P:4Q8:B1]MG=d869U86U^87AXIB1bHFiWIB0`;C8c82Q^Kg@P9F@Y2P00KFU^MGAULb0XCDdY
+86eeLg@PHVDPJFhPM6QU879QKVMU830]=CTP:6i_M20UI2T:~4LfESKfiTLb0XDe<Y86eeLg@P
+HVDPJFhPM6QU879QKVMU830]=CTP:6i_M20UI2T:~4A4E2EDLj801`HG9cGgAYKFDj87AYKFEO
+M21fHFaeIB1bIGAeLViUI20m82E\I00:~4JGAUKEmcM780~39FQT06EbLVmb871QLW=YKVLPJGAU
+KB0UI20XH2Ec9bTPJFhPM79QKW=\HGAYKfhPIVU\I@00~2JFifHFaYI21fHFaeIB0X9F@Y86mV
+86UdIFdP9F@PJFhPM79QKW=\HGAYKfhPIVU\I@0007MbKfiW86ieKF9ULR1_IR1fHFaeIG<PJFhP
+M79QKW=\HGAYKfhPIVU\ICXP9F@0069eIVIULP00IG9bKg8PKg1UKVU^Ib1UKV=_I6U^Ib1dHF9\
+I@00~:0@2V0R1VJFaU860ULbL006EbLVmb879UHFAYKVLPIFiSKfAYKVLPM65RK6DPIVU\I@00
+07A_Kb1]HFii86=XHG9QHgAULW<PJFhPIFiSKfAYKVLPM65RK6DPIVU\ICXP9F@006i_M21UKVme
+IfPPHfQQLV5SM6EbLb1YKR1UKV=_I6U^Ib1dHF9\IB1VJFaU>R0UI000~2IG9bKg8PKg1UKVU^
+Ib1dLV5^LfaQM6U_KR1VJFaU860ULbL0N6adGf9eIVIULP00IG9bKg8PLVEQI6U^Ib1dLV5^LfaQ
+M6U_KR1VJFaU~2J6EQI6Eb860ULbLPLVE`IF5dIF@PJFhPM79QKW=\HGAYKfhPIVU\I@00~2BFid
+IG9^HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1bI5mhK7AOIVU\I@0UJ6@0JFifHFaYI21P9G<W
+86QUHFAULR1fHFaeIB1YKR1dLV5^LfaQM6U_KR1VJFaU>R1P9G<W07A_Kb1]HFii86=XHG9QHgAU
+LW<PJFhPM79QKW=\HGAYKfhPIVU\ICXP9F@0J6EQI6Eb860ULbLPKVmd86I_MFiT86U^87AbHFic
+K65dJFm^86IYK6D0~2J6EQI6Eb860ULbLPKVmd86I_MFiT86U^87AbHFicK65dJFm^86IYK6D0
+~2J6EQI6Eb860ULbLPKVmd86I_MFiT86U^87AbHFicK65dJFm^86IYK6D0~2JFifHFaYI21UKV=_
+I6U^Ib1dHF9\IB0]86=XHG9QHgAULR0`N2D`<UPPI7E`K6USHGAUI000~2N6ad06EbLVmb879U
+HFAYKVLPM79QKW=\HGAYKfhPM65RK6DPIVU\IB1P9G<W~32UAbHFicK65dJFm^87AQHVaU87=_
+MG9SICX:004080406P0UL`00E79QKW=\HGAYKfhPL6EbIVmbKFET>Pd00@0P0@1X1F0ULbLPM6lP
+H2Ec9`1SKfidIGQd>R1\JFiU82E\I21_IR1VJFaU860ULbL007AUN7@j860ULbL006=_KWAUN7@j
+86aYKVDP9FaT86mV86IYK6DPH2Ec9`00A4E2EDLj801fMUmdJFeULgAQKG0j87AYKFEOM21fHFae
+IB1`LVmfJFAUI20m82E\I00:07AYKFEOM21fHFaeIB0l830P:2E\I2TP;B1SKfifIG9dIF@PM6lP
+<0X0~39C0dI2hU<39T;RD`<V@]9C0bI3XU<39T>RD`<V@0~284M=E000~2A4E2EDLj801fMUmd
+JFeULgAQKG0j85IFAB1dJFeULgAQKG0PLgAbJFiW879UM7EbKR1fHFaeIB0m860ULbL:00X0~2
+HfmeK6A^9g@PHFa\Kf=QM6DP9F@PHWUdIG<PM6lPHfm`NB1cM79YKVLPH2Ec9`0094UT9000~2
+2REc85]I;diM>R00ADm686AUM6ESM6ET86m^87=dHFiTHG9T86U^L7Ed079R~3HfmeK6A^9g@P
+IGQQKFU^IB0XKg1UKRTPIVU\IB1P9G<W~3A4E2EDLj801UN65]JFiUGfIYK6Dj860ULbLPJG<P
+KVmd864PLVEWMFaQLR1VJFaU00X006=_MFaTKRMd86EhHFeYKVDP:7=dHG@Y86IYK6DPH2Ec9`00
+079UHG=_KR1VKg8PIG9bKg8j82Ec079R0780~2JFifHFaYI21VJFaU86e_I6DPLg1UHfUVJFET
+82PUI2T0~3IG9bKg8PKg1UKVU^Ib1VJFaU860ULbLPIVmb86U^L7Ed~3AVU\IB1P9G<W86EhJG=d
+LbhP84mfIG9gLVUdIB0o~2Kg1ULV5dJFm^86=QKV=UK6aUI01VJFaU860ULbLPIGQYLgAc07MR
+07L0~2JFifHFaYI21VJFaU86e_I6DPLg1UHfUVJFET82PUI2T0~3IG9bKg8PKg1UKVU^Ib1VJFaU
+860ULbLPIVmb86meM71eM000@2<T9Eh]Gcd[HF9SI6EVIfQYJV]\KFi_L75bLgAeMWMhNGY1@T=4
+ADI7B4U:Bda=CTm@DE9CE5EFEeQIFS0a<S<d=CHg>3T`~4@2<T9Eh]Gcd[HF9SI6EVIfQYJV]\
+KFi_L75bLgAeMWMhNGY1@T=4ADI7B4U:Bda=CTm@DE9CE5EFEeQIFS0a<S<d=CHg>3T`~4LgEc
+L6USJFmeLb1XIF5TIG8PIVU\IB1cL6ES860ULbLPHfQQKVMUI21dKb1P9G<W~2G3X0G00^~42REc
+06EbLVmb879UHFAYKVLPLgAbJFiW86IbKfdPLgATJFh0BFidIG9^HF`PIG9bKg8PI6EdIF=dIF@P
+JFhP9G<X:@1bIF5TGg9UHfmbI014AD9EAcXP07=SHFiOHfeTGfaYKVDj86=_KFeQKV@PK6U^IB1Q
+LVMeKFE^M3XPH2Ec9`0:02d004A5@UE7>R00Lf=QKUmSKFAOK6U^ICXPKF5dHfQULb1aMF5\JFIY
+IG8j820P820PH2Ec9`0:~3HFeRJFMeKgEc875eHFaYIVUULR1P9G<W~4MFi[KVmgKR1aMF5\JFIY
+IG8PH2Ec9`00LGEQK6UVJFEb860U;S5c9G<W86eeLg@PM65[IB1Q87IQK7EU02l]07IQK7EU86eY
+Lg=YKVLPHFIdIG8PLGEQK6UVJFEb860ULbL0075eHFaYIVUULR1P9BhaLbEc9b1TKfEc86i_M21d
+HF]U864PMV5\MFD0;bd0A4E2EDLj801cHf5^Gf=]I5m\JFiU>R1aMF5\JFIYIG8PMV5\MFDj2001
+02010544H2Ec9`0:~3M6m_86eQKWTPIVU\IB1^HFeULb1cL6ESJFIYIF@0~2A4E2EDLj801cIGAO
+IWAYKFDj87=UM7AYKVLPIVU\IB1P9G<W87AYKFDPM6lP9Bhb=7<02P00~2@f5^KVmd87=UM21V
+JFaU860ULbLPM6U]IB1dKb0UL`1bIF5cKfhj84mC;c8PI6mULb1^Kg@PLgE`L6mbM21VJFaU87AY
+KFEc869UIVmbIB0a>CP`;P0004IYK6DPH2Ec9b1dJFeU87=UM21dKb0a>CP`;S0a;S0a;C0`>S0`
+>S0`84M=E00006EbLVmb87=UM7AYKVLPIVU\IB1P9G<W87AYKFDPM6lP9Bhb=7<0~2BFidIG9^
+HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1cIGAOL6U`IEm]KfAU~3IG9bKg8PLfEdM6U^Ib1]
+KfAU86mV86IYK6DPH2Ec9`0jG01DFP0005AJ?@17CE@`@U=D~582d]8000~22UM1DTi9CTLj8000
+2TEBDTmB>R00~32TI1E45<>R00~3BFidIG9^HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X:@1eLfEb
+GfeULg=QIfD0~39G<UL`X0~29G<UL`X0~2BFidIG9^HF`PIG9bKg8PI6EdIF=dIF@PJFhP9G<X
+:@1gLVUdIEmbIF=_LV@0~3DgE^84e_KR1DMFDPEfET85AXMB16LVTPDf5d84YQKR16IF8PCF5b
+845`LR1=HGTPBWE^84YeK211MFLPDfE`84mSM21>KgHPA6ES88@]0`3T;@<0A2h30:@^0`000200
+800P0200800P0200800P02P0:00X02P0:00P0200800P0200800P0200800P0200800P0200800P
+0200800<0100400@0100400@0100400@0100400@0100400@00<00`0300<00`0300<00`0300<0
+400@0100400@010040210H41P@610H41P@600H01P0600H01P0600H01P0600H01P0600H01P060
+0H01P0600H01400@0100400@0100@@510D41@@510D41@0500D01@0500D01@0500D01@0500D01
+@0500D01@0500D01@0500A00400@010080000040~2D4H00040~50@40~20P0006@c0`1X<`<0
+K3<3070c0`1d<`<0N3<307`c0`20<`<0R3<3090c0`2H<`<0Y3<30;0c0`2h<`<0a3<30<Pc0`3<
+<`<0d3<30=@c0`3H<`<0g3<30>0c0`3T<`<0j3<30>`c0`3`<`<0m3<30?`c0`08=0<043@30=@c
+0`0H=0<083@302Pd0`0`=0<0?3@304@d0`1@=0<0G3@306Pd0`1d=0<0QS@308Td0`0\0@00AE=D
+00@0~22P000040~2ooooo`P00@000@0C010>~281`0010>~2ADAD0=0[0`d00@000@0X08`d0`2>
+=0<0SS@308hd0`2>=0<0SS@308hd0`2>=0<0SS@308hd0`080040o`403@3D:`<0P2`3~589@0
+0@000@01010V004000404P010?oo0@00~50@00020>5P01~20@0100<@004000400@0@4P01~2
+0@070040~2Q2d33@01~20@0B0040ool2~70@00020>5P01~20@0100<@004000400@0@4P01~2
+0@070080~2i2d33@01~20@0B0040ool2~70P00020>5P01~20@0F00<0~2ADA3<dM<Cd80~20@00
+~2D4IV004000400@13e`01~20@030=0[0`T00@00MG=d869U86T102`0~4S3@308hd0`2>=0<0
+SS@308hd0`2>=0<0SS@308hd0`2>=0<0SS@300P00@3o0@0S0=@[0`20;0<0\2`3090d0`00~3
+n2`304A40`00~3A2h3?@01~20@1T0R83~2E5X004ECE015A5@0~47`0003\0~2FP0007P0~2U`00
+0;D0~2e0000?<0~24@400301~2CP4006d1~67`0003`0~2F`0007T0~2V0000;H0~2e@000?@0
+~24P400341~2C`4006h1~2Gd=\Kg=UDgAbIF5]~40@0000d:00d:~39F@005PW9CAH9`00~47`00
+03\0~2FP0007P0~2U`000;D0~2e0000?<0~24@400301~2CP4006d1~67`0003`0~2F`0007T0
+~2V0000;H0~2e@000?@0~24P400341~2C`4006h1~2`=4100D00<010P01T`00`043T`420070
+0@0002L00<00~20Ih00<010P01U000`043PP6E~2`043P`6G~2`043P@6H~2`043Q06I~2`043
+R`6J~2`043Q@4L~2`041006K~2`043T@4U~2`000004M~2`041004X~2`0000046~2`000004T
+~2`000006M~2`04100410060~30Oooool0~3V`00`1`00<05~2`9d00<010060W000`9<00<2N
+~2`9@00<2E~2`9H00<2G~2`9P00<2I~2`9X00<06~2`2@00<0U~2`1d00<0W~2`2P00<00~3IP00
+06L0~2J00008<0~2JP0006h0~2K`0008@0~2Q@0008H0~2Q`0008P0~2R@0008X0~2R`0008`0
+~2S@0008h0~2S`000900~2T@00~5200103l10;l2~4Gdm`IFiCM79UHFd0Gdm`IFi2NGAU~3Gdm`
+IFi2NGAU~343D305=5E5E@@E97;T5CC@00~2;P0006=_K@1UN6D0HfeT05aCB45BADe5CEa4A4Dd
+@410@2i0@40005=eKP1=Kfh0E7EU05MUI01DJ7D0AW9Y05=QM01CMFiTHGT004e_KVAQN@00E7EU
+LfAQN@1GIFA^IG=THGT0~2E6QeLW=THGT0~3AW9YI65i~2Df5dMG9THGT0~3BV5^04IUHP1=HG80
+@G1b04eQN@1:MFh0BWE\045eI`1CIG00Cf=d04i_MP14IF<0BV5^MF5bN@16IF9bMF5bN@00~2
+CF5bHfP0~2@G1bJF`0~2BWE^I@00~2BWE\N@00~2@GEWMG=d~2DfE`M6E]HVEb~3Cf=dKf9ULP1>
+KgIUKF9ULP00~2A6ESIFeRIG80~39Fd_9F@_9GT0~39DTj9Ddj9E<0~39GT_9Fd_9F@P9DTj9Ddj
+9E<0HFd0L6d0;P0004<0~6A4E6@EE<E5m<Cd=1C4D005A5CE1=ADd080T0030a<S<d=CHg>3U1
+@T=4ADH0~3<34b<c@e=SLh>F5RHfAUIP00~2HVa[LfUjI@1\LVESK000079UHfI]~3M7U`I@00
+~2KFE]Kg9i~2J6a<05d0~2;@0[04A4AC@^CE=7~4BFidIG9^HF`PK6URLV5bNB1ULW9_LR1YKR1V
+MFiSM6U_KSXPGdMUM4EbLTecI`00:34Y00d:~2CFEcLf5WIB1^Kg@PIVmeKV@PJFhPKFEcLf5W
+IB1VJFaU;P00:38Y02Pc:@1=IG=cHFMU86IYK6DPKVmd86I_MFiT;P1>@Dh0BDi6BDi9E5T0~3
+BDi604i1CP19CTI9CTUDF@00~2BDi62P01~20@01080<00400040HP3`O`00~4403oooooooo_
+O`00~4l7l0~5n7ooooooooogO`00~4l7l0~5n?ooooooooogo`00~4l?l00<1ooonoO`00P7l0
+0<3ooonoo`00P?l8004000400P0100P00@3o0@0b0?io~7P?mo~7`?mooooooooookooO`00~5
+P?mo~7`0T00@3o0@0g0;ooo`00~5P?oo~6<34b<c@e=SLh>F5RHfAUIVMXJFY[K6e^Kg1aLW=d
+MGIgN7Uj2P01~20@0402A0O`<800400040100T@7l32@01~20@251H3o?`00~5X090~7b0E0~7
+nPQ0~6@9`<@000~4D<<?@000~49?@B@000~3P9JH5T00~48;bn6D00~4:6_^7400~4n@:E8400
+~3@;M3^R=0~44:GDj2I0~4:^N4TBY0~3P?@Pi[D]@0000:0aZEoS<400~21;o96hhd@0000<D^
+_::a=d00041f>V\;gSY0~2j8T48lN:?T0006:\aN]h[D50081j5kLVemQ4@02@[6hbN8J7B400
+]5L:?aIXZD]00:7]c<hK`]=>@:24541QDEV4DT38YAV@^JE_YEE0>PlPm2N?bliH@8@9U?Qh>Cn1
+G43U2kTfe`N?XEm0gdiW1<g9l\UR@9HRPDE0O6olID2N]G0[Z:g5WFU01N=<=Q8I=lE\@<LKh<=F
+ghCfKd1L4F`jUP\CVW=0\aD7bG_>Ul1f@23KB;\J`[g`ND3dR0feD9UfUWe0<N]@hZ@o5;b0@?dU
+iAZ>CaW[Pd2n=lo@^=7_TXM0[PD31BO6ZkN:@1W7@lJ`]iKUSD1`G>YkcS9nSi50S??T6X:oGK>D
+@6l`WZ5R;cGPUd15gP:UWCdQS9]0eiE33PF=:JnN@4ake556l??JXD0@cBCc:gKHR:E0E03^kkJC
+3Z^X@6R0jJ^T>=;EZd11l77[IV>SQJm0DVa>YT0l3:Nb@6H7h\m@Blo@]D2PA>f14Xn1P[U0b9EX
+8]Ob8J>l@3Zk0^^<Kn[;_d08J\<UL0_Uo\90AB:J5bHWCio6@=JZP9g_l2;7bD2<eN24:jg[n<a0
+MhD<<c]<Ti_@@000~5P?loeJK?odTON<;C@>2<jH39AkZCZ45[EBLiSOM`h7a2S]kiWO_[OZYA
+@gKSc?8Y;hB19T@GZ_R^4>?5a?Y4e??gjn5:NYG?ALNA3ZJ^X1WSXdKmUFM[RO^3[7Q77Ie:iI7g
+38==B<`1SamZXa[78DV<YP3=Z9`oUoI93WmcS@]Jb^G:B^[KeN<\:hn^Wd_Bcbh=:VNJQ7A<5`ae
+PHIeM\U8CCBHNYTfC@ZI7DkQ_c\L63b3j?5>=^BlRWV=X;36Cl]^QN\>S2b6Ve22l6a6eVkIbfmA
+1@k_U]A\fYY4DPZkMjRBGdC[65?TYi<i>cFh\^eC_k3dc8Md`hO2E8kkmn@:YD?>UUDiD`9_o@^`
+W6]FS;Q:TXCM3NhoEfICZLYf=MJd55Q=08I;1bmORNUH<oN4WAL^]M2mFNEM?LEM>h^NTUXY4GdW
+@loOl6IKm]H4aVZQn[HkG4V5n=4[b_n:45e_P?A1<R0^dnAM@;JMc]@;K:2iG^24`8U`C[[cSEmC
+_50@T8`U^F9PY_2Q8<1DYH`gHHi_N_oCTJkE2f;m0O7ZM8iBX^1RJ^F^UoadWOJdHlagfI^J2UNk
+RFBg@^;C^me?SUiU3GkS:[ZI=]PbIYnU0D24e3jT1fN;FX_H9Ef9nM]WKGfT6gX_Skf`J>eA;na3
+M?n?QFWUJTH?idk6fUUZAOjIEWg_<:H^J`nOcVYj8Gkl0V`NMZJhFPo>_mM\[^JlEj\W]96\KOSc
+9knRb5gMP6hMaf>i3o4XZ5E_dJj6mMSLNolYL=P37lVU_Q?2oW1^ClImL`M^Tm=aTA4Ij7\NoMnW
+LX9>ZIDPjbJZO7?F>dW>>5E1PE5dViLPRP9BH<@UMB]OO\]<8bfEnWF<mmJXB6RTh\if2S3nGL__
+:ZbSMk@LhG_SD\V2N7Qfkd[KE]jcaTaiD]NZ@QN;lIHQNUmfm6TW_U?UmG[`FME^HQ4e[\YkJJeb
+QUOeEHBOO1CW__c7N0k9Lge5CO09hdjkV4QnKFdD^Glh2nPLOnLe2[E_HTF`lGl900400040T`<<
+0P1f3080~3P81X0@3VJ040~3P?AX0@3UJP40~3P?AZ0@1CJ`40~3P61[0@2PJ`40~3P:a[0@0G
+L040~3P4Q`0@3FL040~4f70103ma0@00~2P4aa0@3EL@40~3P>Aa0@1VLP40~3P7Ab0@1CM040
+~3P61d0@30N@40~3P<ai0@1@NP40~3P5aj0@02O040~3P11l0@1RO`40~3P71o0@09P040~3P1R0
+0@0>P@40~3P1b10@38P@40~3P=B10@38Q040~3P=B40@3gQ040~3P0B50@38QP40~3P>B60@0J
+Q`40~3P2R70@1=Q`40~3P5b70@2:Q`40~3P9R70@2`Q`40~3P;b70@3AQ`40~3P>270@0JR040
+~3P2R80@1GR040~3P6B80@3NR040~3P>b80@0hSP40~3P4B>0@2eT`40~3P<BC0@3DT`40~3P=RC
+0@3`U040~3P0RG0@0YU`40~3P3RG0@3iY@40~3P0RV0@3gYP40~3P0BW0@24Y`40~3P92W0@0i
+Z@40~3P4RY0@0T[@40~3P32]0@1W]040~3P7Bd0@15]@40~3P5Be0@2Yd@40~3P<3A0@37d@40
+~3P=CA0@1He040~3P6CD0@2>hP40~3P9cR0@0dj040~3P43X0@1IjP40~3P6SZ0@0ok040~3P4c\
+0@13kP40~3P4C^0@0Lk`40~3P2S_0@1Sk`40~3P6C_0@1fk`40~3P0Cc0@1]m040~3P7cd0@02
+m@40~3P13e0@2CnP40~3P:3j0@33o`40~3P=3o0@2g0080~3P<@00P0F0@80~3P2@10P150@80
+~3P4P10P1?0@80~3P5`10P1S0@80~3P7010P0\0P80~3P3P20P0m0`80~3P4`30P3]1080~3P?`4
+0P2h1`80~3P<@70P0i2080~3P4P80P302@80~3P<`90P0B2P80~3P20:0P2[2P80~3P;P:0P3b
+2`80~3P7P<0P1G3@80~3P6@=0P3c3P80~3P0P?0P1b3`80~3P80?0P2j3`80~3P;`?0P1M4080
+~3P6`@0P264@80~3P9@A0P1m4P80~3P8`B0P3>4P80~3P=`B0P1V4`80~3P7@C0P3U5080~3P?@D
+0P3:5@80~3P=PE0P3c5@80~3P00F0P0?5P80~3P1`F0P0S5P80~3P30F0P0@5`80~3P1@G0P3G
+5`80~3P=PG0P0h6080~3P4@H0P2:6P80~3P9PJ0P3d6P80~3P00K0P3U7080~3P?@L0P047P80
+~3P10N0P3L7P80~3P>PN0P0P7`80~3P2`O0P3e7`80~3P0@P0P1`8@80~3P7`Q0P0B9080~3P20T
+0P2D9`80~3P:0W0P1j:080~3P8PX0P0J:@80~3P5F;k87\c00006J3?Oi70`03M@W7AOCooooo
+j`O7AO@04000^T@60`2;AOCXD2T008U5o?aVPcgnA`<00`n5PP000;VLA`<0ReGl^?oooooXQ5`0
+08U5k8=mk01m1nTN0`00Rl2;AN`31@a80`2S34P3088mG4@3005e?;Y@1P<0XK0Z0`3X6VP00?le
+34P30?mek;YH1P<0XK0Z0`23k0SXofL00;Z?1P<0XK0Z0`3Xl6L008?446K7ANH00>Td~3Rl2i
+W4L308]Eo;P]~3j>iJ~2RDG\Pgg\00n?1@000>VH0P00RdG\0`D<B0<0X`a80`22?J410`01MCW7
+AN00~3Rl2;AN`kAN1f:8]=o8]Eh3?0RP@AIX\DADA50`2;AOb;CN2850R;AN10RDGPjm>=@037
+AN00~3o8]5k3]5h7HhRdGlReGPRPd@B0<0<P`@P>7oPN7o~3XA180`31j0Pc18dTB0<0Xa180`2;
+AN10RDGPjl>=@02;ANb9AO2;AOb9AOR3OO003hkR0@00IX<moTL300<?QL@0~2IX=miP0?QKT0
+~2Pgg`:`n=3`0008]5l8V5B?ooonT;~3o<N5B?ooob\0~2RhE8ooooRDGXRdG\VH7Ro`0000?2
+`OP8R4F`RdG\VC?2:l8Uo`0003?2:l:8AK77AN00~3RdGX>dGPMQb;AN2;COb;EN2:3168C0Fb
+RdGP@8U5h>_OSD00SHeDooooReGXPl82SDF`j=@K~2RHE@ooooRdG`:dGXRDG`RdgXRdGh0l69
+AOQVadGV0@3YF@0008e008=ml2d?S@h0~2RdG`RHE4ooooj@X0~2ahE4oooo;@0008^5A?ooohU5
+j8f=E?oooh]Ej8]5n>Q`6`00RHE@ooooRdG`:dGXRDG`RdgXRdGh0l69AOR2?KT10`01MF:;QE3o
+oom0Pl0lRHE<ooooRhE<oooo0`DhA@<0>`DHA0<03h`j~3^AA80`2j?4`306JQ=4`30>RL5000
+XCQ50`031Ja<0`2S[4`30<L5>4D3~5IZ4DB0<0j<LL~2SIEDooooXB140`3XffL00:4PA0<0j7V4
+~2RHE0oooo^Ca<0`2;5B140`2;QD3ooooXSF@008^5@?oood031CQ50`2S>4D30>TFo_ooRl3Y
+]ocoohe008?43<W3SD00EH_\PN`@0@00^Ya70`2hc0430>ST3000^Y@60`2hD@000>SA9@00RDF4
+JP1Z08]=Q;X0~3^9a70`23k0cX_El008?4588mO@43004?QA40~2I\L5=4`30040jB@0~2SD00
+PSgdA`<00GD?I\L5=4`3~3j@X0~2o6K71CA<0`0206QhA0<0IX\==4`308]EQ;P`0@<0Pl0`Pn`<
+j2@b~2J>P60`1Xd0H306S41P<0^Z@60`2QI4@308?\2>S7IP00^GQ40`2;5FA40`1V^040j5MQ
+~2J9a70`2jm0H30:5TA0<0Pn`8j9aV~2^GQ40`2;5FA40`1V^040j2aQ~2Pl@`PSem0@<00GD<
+ahD8ooooA0L30>\:ahD8ooooB0L30?ne2?oookXL1`<0XFA40`23k0SXCVH00;UhA0<0RaETA0<0
+I[P10>SNH000J7Q40`2jC0L30:5TA0<0Pn`8j2=V~2^GQ40`2;5FA40`1V^040j;=P~2^GQ40`2j
+M0L306Jh0@3XX6000;P0~3Pn`4j3n3~2Pl@4j=MO~2Pl@HPSgdA`<00@n4[0400;ZLA`<0SDF8
+j1:2~2SDF8j5Y=~2IX=mj?l?Q1L0~23km5j8\4Q@000`29Q@CooooY2`000?c7Q@Coooo81`<0
+okD4oooo^Z070`2QI4@308?\2>QnI@00^GQ40`2;5FA40`1V^040j0iP~2Pl@<IX=mj_md50no
+ANZ;18D<00<0RHD0ooooj`_lahD0oooon0L30?ne0?oook[@1`<0XFA40`23k0SX:VD00;UhA0<0
+RaETA0<0I[P10>RjG`00Pl@<Pgg`og@aogG`^P080`2QI4@308?\2>ShI000^GQ40`2;5FA40`1V
+^040j8QO~2Pl@<jA<0~2^GQ40`2j:0P306Jh0@3XKEl008=mk?md<omek;YD20<0XFA40`23k0SX
+[V@00;UhA0<0RaETA0<0I[P10>PnG`00Pl@<jAD0~2Rl2iN4@30;Yl20<0I[P10>PQG`00PGgd
+0@00P7@@RdGdj>a5~2RHGlo_ooj`[7QOcnooo@20<0okGlo_oo^ZP80`2QI4@308?\2>Q2I000
+^GQ40`2;5FA40`1V^040j=9N~2Pl@<J9a70`2i~20`2=EHRh<04308?0?8?\3>PB2P00J9a70`2i
+300308eER;P`0@<0Pl0HPn`<j547~2^Ia70`2=EHRh<04308?0E>S`2P00^Ia70`2=EHRh<043
+08?0H>R33`00^Ka<0`2jW4L30;P`0@<0Pl1hj008~2^K130`1V^T00^3010`23`0cXKPD006PH
+@@<0I[T00KZ`@`<0I[Q008?\3>QH?P00Pl@`PSfQ0@<00@n5Y00008\EY04308f53?ooonRWO`00
+^OP00`2j?4D308f53?ooonP2?`00RaDlA@<0^=P80`3XgT0000_03hAP~3ocE0A@<0ocDlA@<0
+^^080`2QI4@308?\2>PDH`00^GQ40`2;5FA40`1V^080j:AM~2J2`90`2j40T30:5TA0<0Pn`8
+j>UR~2^GQ40`2;5FA40`1V^?ooj7UM~2Pl@LjA@0~2o;UhA0<0^S@90`1V^040j5eM~2^Ya70`2h
+c0430>RF~3J3a<0`1VR`ddC0<0ReF4^=P10`23k0cXgP400;THA0<0^S010`21`X@0~2^3a<0`3X
+b0`00;TTB0<0^R23^>eV^001j5DY~2a`D@B0<0ooooolL534P3~5a`F\C0<0~4a`DhA@<0~4I\L5
+54P30040RdF4j8Af~2IZ4DB0<0j?TF~2Pl@@Pl@<bL?lEH_\Pn`<RDD8RED<RdD8PWP50@n4<`00
+06Ql2@<0^U`90`2QI4@308?\2>STH@00^GQ40`2;5FA40`1V^0@0j7AL~2j2mN~2Pl@<RdD<PWQH
+0GDCRdD<R`fX:P<0RDQDjED0~2Rl22?Ea40`013hDf~3^X`90`2Q\2X30>PPG`00ogD<^Y@90`2Q
+\2X308?\2>P;G`00^[@90`2Q\2X30>SlGP00Pl@<RdD<j95;~2RlR;A@b9B5B;A@b3N5@0MC7o
+M@bj^0T30:5TA0<0Pn`8j3]Q~2^GQ40`2;5FA40`1V^0@0j<]K~2j8IM~2Pl@<RdD<PWQH0G@>
+RdD<j4Y>~22\1d0^]BPSeLA0<00@n5=P000;[H2@<0XK0Z0`3XO5h00?me3;[P2@<0XK0Z0`23
+k0SXIeh00;X92P<0XK0Z0`3XF5h008?438]53<I0F06;A@cXFUP008?43<W3o5F;k8?\38U528UE
+36J9CA2;AAC7@5@0~3RdDDI\M0H040RdDDI\M0HP40RdDDad1Toooooh]55<M0J?oooon;A@R2
+N0D13hG7~3^P\:0`2;A@R;@0SXIg`000_03hDc~3RdDDaT1H0KT7~3^Q0:0`2;AACXlWT008]5
+58\=[2X308U8E8]556K7@6810>Ue~3RdD8Re08RdDDj59l~2RddD^QP:0`2;A@cXCTD0088mG4@3
+004?QCH0~2^Q`:0`2Q\2X30>Q^G@00ogDD^R@:0`2Q\2X308?\2>QIG@00^T\:0`2Q\2X30>Q:
+G@00Pl@<ReDDIX]54>S7BP00RlR;AAB9B5CYVP0008_0^@40~2^Td:0`2;AACXBWT00?me56X0
+^@00~2ReD<^000~2Pn`<j4Q>~2RddD^U0:0`2h~4j;94~2Pl@DPSeLA0<00@n5=P000;YD2P<0
+XK0Z0`3Xce`00?me5;YL2P<0XK0Z0`23k0SX^U`00;Z32P<0XK0Z0`3XZe`008?438]E56J;AA3X
+:4X008_8RdDDRDQDRdDDPgQD07DaogDD^XP:0`2QI4@308?\2>SVGP00^GQ40`2;5FA40`1V^0@0
+j7II~2j35K~2Pl@<ogDD^ZP:0`2QI4@308?\2>ReGP00^GQ40`2;5FA40`1V^040j4EI~2Pl@<
+RdDDPWQH0G@ARdDDj<U;~22\1d1N]ESD00PSeLA0<00@n5=P000;[@2P<0XK0Z0`3Xn5\00?me
+5;[H2P<0XK0Z0`23k0SXhe\00;X12`<0XK0Z0`3Xe5\008?438]55<I0F06;AACXeUD008?43<W3
+o5F;k87\R00008U526J9E@b9CA2;A@R2N0D13hF4~3RdD8Re08SDF8j4Ij~2SDf8^P@;0`2h~4
+j413~2Rdd@IX]E38e5R>PY<@009Ol0~2RDF4Pgf400nD`2Go~32l0?Q380~2SDF8D;X82`<0XFA4
+0`23k0SXZed00;UhA0<0RaETA0<0I[P40>PkF000j?II~2Pl@<jF00~2Rl22?Ea40`013hD]~3
+^S0;0`2Q\2X30>SlFP00^SP;0`2Q\2X30>S]FP00^VT;0`2Q\2X30>SNFP00^@l0~2^V`;0`2=
+AHSXo7H00;U1~3^W`;0`2;AA3XjWH008e5R52j`0\30:5TA0<0Pn`8j1AM~2^GQ40`2;5FA40`1V
+^040j:AG~2ogD@^^P;0`2QI4@308?\2>S[G000^GQ40`2;5FA40`1V^040j7]G~2RdD@Pl0PD;XD
+30<0XFA40`23k0SX_U`00;UhA0<0RaETA0<0I[P10>Q>E`00Pl@TPl@<bL>;`5F;k8?\58U528UE
+38U=48]E48]52>SJ7000IXU5oVJ3OOko3h@C~3RdDDIX]=oVJ9B6;YH00008e008]5589hF05e
+3h]556K7@6810>U6~3o8]536J3N6;oM1J;A@aVRdQRRdDDIXU8H^TX~3SD00RdDDIX=hH00?Q@h0
+~2RdDDI\M0HP40j@T0~2RdDDI\M0HP40RdDDIX=hH_md5H]548]=50noBF:;18R9AOS[2Xe00<M5
+n6P<0`3oMORj@0`30:5TA0<0Pn`8j<aK~2^GQ40`2;5FA40`1V^040j5aF~2Pl@<Pl@<bL=ERnb3
+k2R9A@R9E@b9CA2jN0`30;P10P00j?hI~2RlR;AA2928]5289h1@4?QAH0~2RdD8Re08RdD@R`3X
+]WL00>VU~3o6X0SDG\D8e=m;X0~3RdD<Pn`<j<=C~2RdD@oc1Z08e=k8eEm;P0~3Pn`<j0e:~2
+Pl@XRdD@R`29ANR;`8]5j88h00n4F00008\=o4<308]5j3?BRQ0c`6J;157f`80?Q200~2XOa3
+0`2;ENPcbHX:IX^4B0@4~23ko0RDGTj@\0~2o8]=j3?0RP69ANB;CNB;ANR828]5j429ANS[WOb;
+AA3o<;Z830<0XFA40`23k0SX[EX00;UhA0<0RaETA0<0I[P10>PmE@00Pl@<Pl@<bL?lEH_\Pn`<
+RDD8RED<RdD8PWP50@n4<`0006S@30<0^[0<0`2QI4@308?\2>QPFP00^GQ40`2;5FA40`1V^0@0
+j?1D~2j:]F~2Pl@<^^0<0`2;A@R;@0SXB7H000_0MB2i1P000;[T30<0RdD<j=ic~2RdD<aT1H
+0NT@~3Rl2;A@R;D0R;A@cXBWH008?43<W3o5F;k8?\48U528UE38U=48]E48]52>S26`00IXU5
+oVJ3OOko3h@C~3RdDDIX]=oVJ9B63YA00008e008]5589hF05e3h]556K7@6000>TZ~3o8]536J3
+N63oM1J;A@aVRdQPRdDDIXU8H>T<~3SD00RdDDI\M0H000RdDD3km0H>]2Rl3[BX_0RdDD3km0
+H52jk0`30:5TA0<0Pn`8j5II~2^GQ40`2;5FA40`1V^0@0j>IC~2j:5E~2Pl@<j@d0~2o0_0M;b3
+n05d]n^io8]548]=50noBF3o=8Rj40d30:5TA0<0Pn`8j0UI~2^GQ40`2;5FA40`1V^040j9UC
+~2Pl@<Pl@<bL?lEH_\Pn`@RDD8RED<RDd@ReD@RdD8j<8K~2RDGlPgglo`n46@0008]548]=o8U8
+I8]54<M0J?oooooYH@000?b;AA22N5P1MA^;AA37@6CoooooRdD@ad1XooooonTn~3Rl2;A@b3
+N6CoM1n;A@b;B6B;AA29B6B;A@b;B6R;AA29B6SY5P0008_0RdD@ad1Toooooh]54<M0J?oooon;
+AA23N6SoMA^iN4@30;Xh3@<0I[P10>SDDP00jBh1~2SD00RdD@IX=hHP<?QHX0~2RdD@PgQXo`n<
+5@0008]548=hJ?l?S`P0~2jCL0~2SD00RdD@og1X^VP=0`2QI4@308?\2>SPE`00^GQ40`2;5FA4
+0`1V^0@0j71B~2j2]D~2Pl@<RdD@og1X^Y0=0`2QI4@308?\2>R\E`00^GQ40`2;5FA40`1V^040
+j3aB~2Pl@<jI<0~2RdD@IX=hHP8?QHD0~2RdD@PgQXo`n<5@0008]548=hJ?l?S`P0~2jCL0~2
+SD00RdD@og1X^[P=0`2QI4@308?\2>Q8E`00^GQ40`2;5FA40`1V^0@0j=QA~2j9=C~2Pl@<RdD@
+og1X^^0=0`2QI4@308?\2>PDE`00^GQ40`2;5FA40`1V^040j:AA~2Pl@<RdD@PgQTogDH^GQ4
+0`2j20h306Jh0@3XQE400>T[0@00RdD@IX=hHP<?QHX0~2RdD@PgQTo`n<5@0008]548=hI?l?
+S`P0~2jCL0~2SD00RdD@og1T^SP>0`2QI4@308?\2>RDEP00^GQ40`2;5FA40`1V^0@0j2AA~2
+j=mB~2Pl@<RdD@og1T^V0>0`2QI4@308?\2>QPEP00^GQ40`2;5FA40`1V^040j?1@~2Pl@<jI<0
+~2RdD@IX=hHP8?QHD0~2RdD@PgQTo`n<5@0008]548=hI?l?S`P0~2jCL0~2SD00RdD@og1T^XP>
+0`2QI4@308?\2>SlE@00^GQ40`2;5FA40`1V^0@0j8a@~2j4MB~2Pl@<RdD@og1T^[0>0`2QI4@3
+08?\2>S8E@00^GQ40`2;5FA40`1V^040j5Q@~2Pl@<Pl@<bL=ERnb3k1B9A@R9E@b9CA2;A@b2
+N0D13hAD~3PSeLA0<00@n5;@000;[H3P<0XK0Z0`3X15<00;[P3P<0XK0Z0`3XmE800;X=3`<0
+XK0Z0`3XiU800;UhA0<0^Q0?0`1V^040j>M?~2jOD0~2Rl2;A@R2N5P1MC>;A@c6@0D0^GQ40`2j
+@0l306Jh0P3X_Dl00;UhA0<0^W@?0`1V^040j:Y?~2jKP0~2o<M5o?oooon=AOa@^Z@?0`2;A@b;
+@0R3k0SXCUD008?438U5n8=mn05e2X=mo01n1>\WRl2;A@coL0RjZ0l30:5TA0<0Pn`8j;AD~2
+XFA40`3XQPD008?438=mo0Am8FX4^\`?0`2QI4@308?\2>R=E000XFA40`3XG`D008?438]=o<7Q
+2X]548T8ogGl^_0?0`2QI4@308?\2>QPE000^GQ40`2;5FA40`1V^040j?1>~2Pl@<Pl@<bL=E
+Rnb3k1B9A@R9E@b9CA2;A@SX]AP008U5o85mo040080?Q140~2RdD@RdglRDQ\jDD0~2SD00RdD@
+PWQH0GD?RdD@ad1\0@00P>TZ~3RdD<PGQ\0@00P7@DRdD<RdQ\RdD@RDQ\j@d0~2SD00RdD@ad1\
+0@00P8]5485hK040081d4X]548]0K>Pc=@00RDGhj`V;`<M5n4@@0`3oMORj71030:5TA0<0Pn`8
+j91C~2^GQ40`2;5FA40`1V^040j21>~2Pl@<Pl@<bL=ERnb3k4AVRDD8RED<RDd@RdD@RDG8RDG<
+IX\8IT6;ALaVR@R;ALQVPcQS3hh`~3JV>jE1030:5TA0<0Pn`8j2mC~2^GQ40`2;5FA40`1V^0@0
+j;m=~2j7Y?~2Pl@<SDgH^P00~2^7T@0`3X0@H008eEf:4PA0<0j?AB~2XB140`3XTVl008U5e;Tl
+C0<0RaDPA0<0RdGDj:a?~2RdGD@0<5>4D30:<hA@<0RdD@3kl0D6R940<0^W`@0`2Q84@308?\
+2>RWDP00XB140`3XAFl008U5d;TlC0<0RaDPA0<0RdG@j5m?~2RdG@@0<5>4D30:<hA@<0RdD<
+j60B~2ocDhA@<0RdD@3kl0B52jS1030:5TA0<0Pn`8j51B~2^GQ40`2;5FA40`1V^040j>1<~2
+RdD@3kl0D;Zd40<0SDGhPn`8j2EB~2ReD<SDGhj0Xo~2ReD<IX]52>PZ?@00RlR3a2b;A@b9B5B;
+A@b3N5@03hDa~3ogD<^[`@0`2QI4@308?\2>SQD@00^GQ40`2;5FA40`1V^0@0j75<~2j2a>~2
+Pl@<Pl@<bL=ERnb3k3bQ44P30?O@Xa180`2=CN2j~4^=\@0`3XW0@008eEh:4PA0<0j8mA~2XB14
+0`3X;Fh008U5g;TlC0<0RaDPA0<0RdGLj4M>~2RdGL@0<5>4D30:<hA@<0ocF000<0J>8@0`2j
+g1030:4PA0<0Pn`8j4=A~2XB140`3XhFd008U5f;TlC0<0RaDPA0<0RdGHj?]=~2RdGH@0<5>4D3
+0:<hA@<0ocD<B0<0ocE400<0J?8@0`2jj1030:4PA0<0Pn`8j?5@~2XB140`3XSfd008U5e;Tl
+C0<0RaDPA0<0RdGDj:U=~2RdGD@0<5>4D30:<hA@<0ocD@B0<0ocEX00<0J0@A0`2jn1030:4P
+A0<0Pn`8j9m@~2XB140`3X?Fd008U5d;TlC0<0RaDPA0<0RdG@j5M=~2RdG@@0<5>4D30:<hA@<0
+XCQ50`031Ja<0`2S[4`30?le>4D300no1AA80`1@^PPA0`2QI4@308?\2>Q0D000^GQ40`2;5FA4
+0`1V^040j=1:~2PlA8XJPZ0`0i1O170`0?Q0X0~2^9a70`3XoPl00:6\:P<0>@F@C0<0M0Zh?4`3
+0>SW3`00ocD@B0<0^S0A0`2QI4@308?\2>SOC`00^GQ40`2;5FA40`1V^040j6m:~2ocD<B0<0
+^U`A0`2QI4@308?\2>RcC`00^GQ40`2;5FA40`1V^040j4=:~2ocF\C0<0^X@A0`2QI4@308?\
+2>R7C`00^GQ40`2;5FA40`1V^040j1M:~23kl554P3052j[1430:5TA0<0Pn`8j5U?~2^GQ40`2;
+5FA40`1V^040j>U9~2Pl@`XK0Z0`0i1La40`1d2[QhA0<0j1\?~2Pl@<bL>;`5F;k8?\28U526PH
+4P<0J00B0`1Xm1430;[D4@<0XK0Z0`23k0SXRT`00?me2;XT4P<0XK0Z0`23k0SXMD`00;Xd4P<0
+XK0Z0`3XIT`00;Y`4P<0XK0Z0`3XEd`00?le<04306RF4P<0^X`B0`2Q\2X308?\2>PjC000J;PB
+0`3o=C`10`1X\a830;ZL4P<0XK0Z0`23k0SX64`006P54`<0J0@C0`3o=A000`1X0Q<306P14`<0
+J00C0`1Xo1830?leB04306Sg4P<0^[`B0`2Q\2X308?\2>SGB`00J2@C0`3o=JP10`1X7a<30;X8
+4`<0XK0Z0`23k0SX]D\00?leE04306Pb4`<0^RPC0`2Q\2X308?\2>RHB`00J5@C0`3o=F010`1X
+DA<30;Xh4`<0XK0Z0`23k0SXMT\006RD4`<0ocE\0@<0J8lC0`2jF1<30:6`:P<0Pn`8j5A;~2
+ocEh0@<0J:8C0`2jV1<30:6`:P<0Pn`8j3M;~2J<0C0`3o=H@10`1X^a<30;ZX4`<0XK0Z0`23
+k0SX5D\006SL4`<0ocFd0@<0J=PC0`2ja1<30:6`:P<0Pn`8j?=:~2J?PC0`3o=I010`1Xm1<3
+0;[P4`<0XK0Z0`23k0SXdDX00874204006PH50<0ocFL0@<0J1@D0`2jo1<30:6`:P<0Pn`8j:U:
+~2I\L5UDL300@0j6m9~2Pl@DPl@8bL>=@01ERnb3k3ACEh?\38U528UE38U=4;T3~3^Q`D0`2;
+AA3XVVH008]54>QjJ@00RDGXRdGXRDG<@8U5j8]538?P?hZ@\4<308]548]=c8PD2<M5k000~2
+o8]533]5k0n6004008]=28]Ek3?0RP@A`OP2RDGlRdD8ReG\<lV:C101`NT4Pn4?ReD8Reg\<l2:
+11[1h0B3h30;`HU5n8]528]Ek3?9RT`@0\7Y1X?Q0h]E28]Mk3?0RT@J0L7P0X?P?0_1RDGdRdd8
+ReG\<l2:A142Pn0oRDG`RdGXRDG@@8U5j8]5o8?P?hZ@\4<308]548]=d8PD28]5j8U5e429ANR;
+AOR3h3n:T;130`2;AA2;CMB850R;ANR9AMQ0RDGXRdGdPn0oRY2`@`<0RdD@RdgHR1@8RdGXRDGL
+@8U5j8]5l8?P?hZ@\4<308]548]=g8PD28]5k8?00hU5k>Wfo_ooRl2;AA2;GNS611P0RdD@RDGP
+^`80~2_alD0`23k0cX8VP008_GRl^;f8?418]5h0?3Pnchj2AU~2RdD@RDGT^`80~2_b4D0`23
+k0cXm6L008_GRl^;f8?418]5i0?3Pnchj?IT~2RdD@j=IW~2j`23a0aOFlW3o5F;k8?\J6J9A@QX
+?4`300no1AA80`1@^R@D0`2QI4@308?\2>SkBP00^GQ40`2;5FA40`1V^040j8]5~2ocD<B0<0
+3kl554P3052jC1@30:5TA0<0Pn`8j<M:~2^GQ40`2;5FA40`1V^040j5M5~2Pl@PI\M5oP00Rl0?
+_dGnPcb5i043~23hAN~33km5o_ldQN@10`2jM1@30:4PA0<0Pn`8j7U:~2XB140`3X5fL008U5
+n;TlC0<0RaDPA0<0RdGhj357~2Pl@<RdGh@0<5>4D30:<hA@<0IX]5oVI0IXU5o^^CSD00J9@D
+0`2jN1@30:4PA0<0Pn`8j25:~2XB140`3X_fH008U5m;TlC0<0RaDPA0<0RdGdj=U6~2RdGd@0<5
+>4D30:<hA@<0J=@D0`1X_1@30;ZP50<0XB140`23k0SXeTT00:4PA0<0j7AV~2RDG`^Ca<0`2;
+5B140`2;AO3XSTH008]5l4031CQ50`2S>4D30;[P50<0XB140`3XV4T00:4PA0<0j3IV~2RDG\
+^Ca<0`2;5B140`2;ANcXD4H008?478]5k4031CQ50`2S>4D306J3O@P13hGW1000JP3o=G@00`1X
+kA@30;[T50<0XB140`23k0SX?4T00:4PA0<0j=YU~2RDGX^Ca<0`2;5B140`2;ANSXm4D008]5
+j4031CQ50`2S>4D306Sl50<0ocFT00<0J?TD0`2jl1@30:4PA0<0Pn`8j>]8~2XB140`3XRFD0
+08U5i;TlC0<0RaDPA0<0RdGTj:=5~2Pl@XRdGT@0<5>4D30:<hA@<0PSfQ0@<00@n5[0000?le
+@4D30?leD00306P=5@<0^P@E0`2Q84@308?\2>R9B000XB140`3X9fD008U5h;TlC0<0RaDPA0<0
+RdGPj455~2RdGP@0<5>4D30:<hA@<0J3`E0`3o=E`00`1X>AD30;X@5@<0XB140`23k0SX>4P0
+0:4PA0<0j=IT~2RDGL^Ca<0`2;5B140`2;AMcXl4@008?4:8]5g4031CQ50`2S>4D30>UE~3o6Q@
+5@<0ocE@00<0J4dE0`2jA1D30:4PA0<0Pn`8j=i7~2XB140`3XO6@008U5f;TlC0<0RaDPA0<0
+RdGHj9I4~2Pl@DRdGH@0<5>4D30:<hA@<03kl5o4L30?ldQ@000`3o=IP00`1XHAD30;YH5@<0
+XB140`23k0SXPDL00:4PA0<0j1mT~2RDGD^Ca<0`2;5B140`2;AMCX>D@008]5e4031CQ50`2S
+>4D300no1Oi70`3o=8D<00<0ocF<00<0J6dE0`2jI1D30:4PA0<0Pn`8j2M7~2XB140`3XaF<0
+08U5d;TlC0<0RaDPA0<0RdG@j=m3~2Pl@XRdG@@0<5>4D30:<hA@<0Pcd0B0<0o`n4a@0008<m
+14P30?l?Q6<0~2ocD4B0<0ocD0B0<0ocF`00<0J7hE0`2jL1D30:4PA0<0Pn`8j;96~2XB140`3X
+D6<008U5c;TlC0<0RaDPA0<0RdG<j6Y3~2Pl@HRdG<@0<5>4D30:<hA@<0jEP0~2SD00ocD0B0<0
+ocF`00<0J8hE0`2jQ1D30:4PA0<0Pn`8j5E6~2XB140`3Xlf8008U5b;TlC0<0RaDPA0<0RdG8
+j0e3~2Pl@DRdG8@0<5>4D30:<hA@<0PCd8B0<00@00P0n4H0000:48B0<0Pn`4j8HW~2Pl@4D?le
+h00306RM5@<0^Y@E0`2Q84@308?\2>SUA@00XB140`3XPf8008U5a;TlC0<0RaDPA0<0RdG4j9e2
+~2Pl@DRdG4@0<5>4D30:<hA@<0ocGD00<0J:HE0`2jX1D30:4PA0<0Pn`8j9I5~2XB140`3X=680
+08U5`;TlC0<0RaDPA0<0RdG0j4i2~2RdG0@0<5>4D30:<hA@<0J;130`1X]AD30;Z\5@<0XB14
+0`23k0SXBdD00:4PA0<0j>UQ~2RDFl^Ca<0`2;5B140`2;AKcX0d8008]5_4031CQ50`2S>4D3
+06S@@`<0J<4E0`2j^1D30:4PA0<0Pn`8j015~2XB140`3XWV4008U5^;TlC0<0RaDPA0<0RdFh
+j;Q1~2RdFh@0<5>4D30:<hA@<0ocFlC0<0ocDh00<0J<dE0`2ja1D30:4PA0<0Pn`8j:i4~2XB14
+0`3XC64008U5];TlC0<0RaDPA0<0RdFdj6I1~2PlA4RdFd@0<5>4D30:<hA@<0jD81~2SD00ocGD
+00<0J=HE0`2jd1D30:4PA0<0Pn`8j5M4~2XB140`3XmF0008U5\;TlC0<0RaDPA0<0RdF`j0m1
+~2RdF`@0<5>4D30:<hA@<0J;130`1XiAD30;[L5@<0XB140`23k0SX34@00:4PA0<0j:YP~2RDF\
+^Ca<0`2;5B140`2;AJcXa40008]5[4031CQ50`2S>4D306S@@`<0J?4E0`2jj1D30:4PA0<0Pn`8
+j<53~2XB140`3XGf0008U5Z;TlC0<0RaDPA0<0RdFXj7U0~2RdFX@0<5>4D30:<hA@<0ocFlC0<0
+3kl554P3053o=K`00`1X01H30;[d5@<0XB140`23k0SXId<00:4PA0<0j0EP~2RDFT^Ca<0`2;
+5B140`2;AJCX7d0008?4B8]5Y4031CQ50`2S>4D308?43<W3EH_\Pn`<RDD8RED<I\L5UDL30040
+aPELA0<00<M5o00@~2RdGlj;EJ~2XfA40`23?FA40`003hD[~3ogGlJ2`F0`2j11H30:6`:P<0
+Pn`8j6U0~2I\L5UDL300@0j2lo~2Pl@@PSeLA0<00GDl^TPF0`2Q\2X30>Q0@000J7`F0`2;AOa@
+^U0F0`2Q\2X308?\2>PU@000^XHF0`2Q\2X30>PF@000Pl@@^XPF0`2h00P00>SP~3XjA30`2j
+U1H30;P02000j<`0~2Xb140`1Xf04306S<0@<0J3010`1XY1H30;VP5P<0ReD<RdD8Pn`<j4`d
+~2Pl@LPSeI0@<00GD:^:PF0`3Xn_;ooh8m=@43005e<lH5G4@30062?FD10`013iC0Pn01Pl3o
+6l102l0?Q140~2aPEU0@<00LL5J043~5PSgA0@<00@nD`8?P0H?0oa_0@0_0M0Zh^1H30>RMl_oo
+j33JoooXXmKoonSbkoooj14n~2^000~2j`Z;`;P0~3j`7lPl@8bL<0~2EH_\Pn`DRDD8RED<RdD8
+RDGlRdGlj2YI~2RDGhPggh07DmogD<RdGlD;X@5`<0XFA40`23k0SXF4400;UhA0<0RaETA0<0
+I[P40>SX>`00j:<m~2Pl@@jDX0~2SD00PSeLA0<00@n5>P000;Xl5`<0XK0Z0`3XZ3h00?me38]5
+o52jA1L30:6`:P<0Pn`8j8ln~2^WTG0`2Q\2X30>R0?P00Pl@@RdGhj`23a0c9`he005F;k8?\
+58U528UE38U=48]54<I0102;AA37@0P0~3^W`G0`2h0@800>PMooooRDGlogGl^Y0G0`2;A@b3
+k0SX1d4008?438U5n8=mn04?QC<0~2ogGl^Y`G0`2QI4@308?\2>Qf@000^GQ40`2;5FA40`1V
+^040j0Hk~2Pl@<jC\0~2Rl2;AA3o<;[05`<0XFA40`23k0SX@D000;UhA0<0RaETA0<0I[P30>SA
+>P00ReD<RdD8j;hL~2Pl@<RdGlj7=D~2Pl@<bL>;`5F;k8?\48U528]528=hE00?Q4T0~2RdD8
+Rd1Dj2M6~2RDGlPggl00n4<@000?me2;[T5`<0XFA40`23k0SXcCl00;UhA0<0RaETA0<0I[P3
+0>QM>P00j9`Y~2Pl@<Pl@<bL=ERnb3k0b9A@R9E@b;A@R2N0D13hA3~3PSeLA0<00@n5;@000;[l
+5`<0XK0Z0`3X1cd00;X460<0XK0Z0`3Xn3`00;Xj60<0XK0Z0`3XjC`006JhoooY:04006X0I[T1
+08]528]@28]538?\3>Rm1P00Pl@@IXU5oPnoAOkYV@000?b;A@`?_dgnocB8^S`H0`2QI4@308?\
+2>P<?`00XFA40`3Xg^oooh?43>V6~3Rl3YO`0008e008]530noCOko=8RjL1P30:5TA0<0Pn`8
+j=@n~2XFA40`3XY^oooh?43>U>~3Rl3[BX_0RdD8og08^Z@H0`2QI4@308?\2>RT?P00XFA40`3X
+M^oooh?43>TN~3Rl23n08?Q5oooon3n05dRX?h0gB=2l1d^N^kSD00PSeLA0<00GDm^[PH0`2Q
+\2X30>S\>`00RdD<3km=o_ldR;[060<0XK0Z0`23k0SXd3\00;[`60<0XK0Z0`3X`C\008?436J;
+AOk[08?42<W3SD00EH_\Pn`<RDD8RED<RdD8PWP50@n4@`00088mG4@3004?QBd0~2^_@H0`2Q
+\2X30>Qk>`00^_`H0`2Q\2X30>Q\>`00^RhI0`2Q\2X30>QM>`00I[SoonV\~3JP1V^@40RdD8
+Re08RdD<Pn`<j345~2Pl@@IXU5oPnoAOk[<>\jRl2;A@SoL0Rj<1T30:5TA0<0Pn`8j8@m~2XFA4
+0`3XE^kooh?43>T>~3Rl0;`7C<PoP1M<O[bOb2?Ea40`01MCfjA1T30:6`:P<0j=`j~2RdD<3km=
+o_ldR;Y<6@<0XK0Z0`23k0SX`3X00;Yh6@<0XK0Z0`3X\CX008?436J;AOk[08?42<W3SD00EH_\
+Pn`@RDD8RED<RdD8PWP50@n4A`00088mG4@3004?QBd0~2^W`I0`2Q\2X30>Q[>P00^X@I0`2Q
+\2X30>QL>P00^\4I0`2Q\2X30>Q=>P00^?oooooY<`4008e00<M5o?oooon=AOa@^\@I0`2;A@R;
+@0R3k0SXoS`008?438U5n8=mn05d9H]52?m`2;[86@<0XFA40`23k0SXKS`00:5TA0<0j43]oon3
+a0b;A@aVPgQR0gE7Pgglo`n<4@0008=mo?l?S`L0~2jBP0~2Rl3oMOaZof[o^_0I0`2QI4@308?\
+2>PS?000XFA40`3XmNcooh?45>U;~3o8]536J3N682MD23OOco3h`@~3Pgglo`n?1P000>TW~3
+o?meo6[oJ_nj:1X30:5TA0<0Pn`8j=<k~2XFA40`3XYNcooh?4588mG4@3005e=[YP6P<0XK0Z
+0`3X?ST00?meo;YX6P<0XK0Z0`23k0SX:CT00;ZX6P<0XK0Z0`3X6ST008?438]5o>\2Rl23a0S9
+`he005F;k8?\38U528]5289h1@4?Q4H0~2PSeLA0<00@n5;@000;Z\6P<0XK0Z0`3XeSP00;Zd
+6P<0XK0Z0`3XacP00;[`6P<0XK0Z0`3X^3P00;P1~2P>Ub~3Rl2;A@R3N0P0M0n;A@R;@0R2>01d
+1>\BRl2=AOcXC5P00>U3~3SD00RdD8Rd08j<D8~2RDGlPGgl0@00P0n59@0008]52?m`2;[d6P<0
+XFA40`23k0SX`CX00:5TA0<0j9?[oon3a0b;AOc[0he008?42<W3SD00EH_\Pn`8Dh?\38U528UE
+38U=48=m300?Q1<0~2RdD<PSP03h@7~3j@h0~2Rl1V^?oojEL1~2SD00I\M5n_ooI\M5n000RdD@
+3km=n6_938<l200?Q=00~2RdD@3km=n6_938\42>SNEP00RDGlRdglReD<RdD@3kmMn6_K38\4
+6>QC6@002l0?QH\0~2PSeLA0<00@n5@0000;XL6`<0XK0Z0`3XQcL008]540noCOQ[b@co=0Rj
+91\30:6`:P<0Pn`8j6Pg~2^TlK0`2Q\2X30>QI=`00Pl@<IX=mnP1m3fJ;AOQVRDGjjBX0~2Rl2i
+N4@30;YD6`<0I[P30>Q1=000ReD<RdD8j2hF~2I[SoonUe~3o6J;AOQV@6J9AOSY7OooooaVPggj
+07eAPSeLA0<00@n5=P000;Y`6`<0XK0Z0`3XiCH00?me3;Yh6`<0XK0Z0`23k0SXd3H00;Z[6`<0
+XK0Z0`3X`CH008?436Jhooo[5>T?~3SD00IX]5n^T3~3SD00Pl@<FlW3Rl1ERnb3k0QVRDD8RED<
+RDd@I\M5oP00Rl1VRdD8IS]5oPn6IP0003?0IX]5oXU5n6K7AO`008e006J;AOaVPoP8LbkfAOP1
+3h@@~3RdGhdNPcA@b9AOSY200008]5n=7XRDGhIX]5o6I0IXU5o>_8RdD@<lUVRdgnReGhRAB8
+IX]5oVI0IXU5o^^=o<W3Rl1ERnb3k0aCPn`<RDD8RED<IXU=48=m300?Q180~2RdD<PSP03h@6
+~3j@d0~2o6Jho_oYj`0008e008]53>SPE000RDGhI\M5m_ooI\M5oP00o8]520noCOj3?8P03hBg
+~3IX=m400?QA80~2RdD83km=oX\4R>RUE000RDGhIX=m501e@h]=n8]E38]520noGOj;19SX5QL0
+00_03hDP~3IX=mm_l?Q@l0~2IX]5oVJ9AOKY200008_0I\M5m_kojCl0~2o8]=n8]E38]520no
+GOj;19SXAaH000_03hDQ~3IX=mm_l?QA00~2IX]5oVJ9AOKY2@0008e006K7AOKnofJ;AOiV@6J9
+AOkY>oooohe006J;AOK[0X_0Pl@<FlW3Rl1ERnb3k1b9A@R2?Ea40`013hE5~3^[0K0`2Q\2X3
+0>Rk=000RdD8og0<RdD8og0@RdD8og0D^[PK0`2Q\2X308?\2>RG=000^^8K0`2Q\2X30>R8=000
+Pl@DPSeLA0<00GE4^^@K0`2Q\2X30>Q]=000RdD8oc2;A@SoL0B;A@SoL0Rjk1\30:6`:P<0Pn`8
+j4Xd~2^QHL0`2Q\2X30>Pk=000Pl@DRdD8PgPDAWd;^000~2jLT1~2o<M5o000~2adGd\PL008_0
+RdD8Rd0D1F`7~2>dGd3hid~3RdGl1Fd1~2RDGlRdGdVC?2:l:3h0<c`R_22l0?QDH0~2RdGd^F@0
+~2VOOi2m8?QAl0~2RdGd^I01~2VOOi2m8?Q0`0~2adG`~4j@L0~2adG`0@0008=ml05e1h]5o429
+AOb;AOA0RDGdjGSoooo7AO@0~3o8]528]=m3U840n>W@0008]=m8]5o0<4SN0F0`29AOb3OO@1
+3hEg~3RdD8Rd0D1F`7~2VC?2:l:3h0<c`R_22l0?QEP0~2RdD8Rd0D1F`7~2^F@0~2VOOi2m8?
+QBT0~2RdD8Rd0D1F`7~2^I01~2VOOi2m8?Q0h0~2adG\~4j@T0~2Rl37AN`1~3Pgg\0GD7RdGl
+@8U5o8]5m429AOCYE?oooh]528]034P3AOb9AOb;A@R;@0QY`10>~2RdglJLV0D@400lR;A@R;
+@0A[`3`3`H]=20<1RDGhPSeLA0<00GDf^QPL0`2Q\2X30>R9<P00ogGh^R0L0`2Q\2X308?\2>Qd
+<P00^TLL0`2Q\2X30>QU<P00Pl@<RdGhj`7lPl@8bL>=@01ERnb3k0b9A@R9E@aVRDd@RdDDad1D
+~4RdDDI\M0H040RdDDI\M0HP40RdDDad1Toooooh]55<M0J?oooon;A@R2N0D13h@o~3PSeLA0<0
+0@n5;@000;Y<70<0XK0Z0`3Xjc400;YD70<0XK0Z0`3Xg3400;Z>70<0XK0Z0`3XcC400>UB0@00
+RdD8PgP800n4N`0008]528]@28]55>QUD000RddD^Y0L0`2;A@cXHAT0088mG4@3004?QCH0~2
+^Y@L0`2Q\2X30>R1<@00ogDD^Y`L0`2Q\2X308?\2>Q\<@00^\4L0`2Q\2X30>QM<@00Pl@<ReDD
+IX]54>SJ7P00RlR;AAB9B5CY9P000?bi1`000;[470<0RdDDj5i=~2RdDDR`f`:P<0RDQDRdDD
+aT1H0H]558=hE01e<Ome5;[<70<0XFA40`23k0SXKC<00;UhA0<0RaETA0<0I[P40>Sm;@00j;P_
+~2Pl@<RdDDPWQH0G@@RdDDj7`P~22\1d1>]DRl22?Ea40`013hDf~3^^PL0`2Q\2X30>R\<000
+ogDD^_0L0`2Q\2X308?\2>RG<000^QXM0`2Q\2X30>R8<000Pl@<RdDDaT1H0H]55>R::P00Pl@<
+bL?lEH_\Pn`DRDD8RED<RDd@RdD@aT0408]54<M02000~2^Q`M0`2h0@800>PMlOooRDGlogGl
+^R@M0`2;A@b3k0SX1c<008?438U5n8=mn04?QAl0~2RdGlj=<F~2RlR;AA29B0R;AA36@0@1jC`0
+~2SD00RdD@oc2j;1d30:5TA0<0Pn`8j5Db~2^GQ40`2;5FA40`1V^0<0j>D\~2ReD<RdD8j=8>
+~2Pl@<RdGlj8M6~2Pl@<bL>;`5F;k8?\>8U52<M5n0400823O@P03h@B~3RdD8PSP03h@6~3j@d0
+~2o;P1~2P>T>0`00Rl22?Ea40`01MCJjD1d30:6`:P<0j6@_~2ogD8^UPM0`2Q\2X308?\2>Q?
+;`00^XPM0`2Q\2X30>Q0;`00Pl@<adGX\PL00<M5i040~2adGP0@000<M5g000~2adGH~4adGD
+~4SDGDD8e5f52=AMa@SDGPD8e5i52=ANQ@^X`M0`2;A@R3k0SXac4008?488U5o8=mo05l2h=m
+o0Io1N\kSD00ogD8^Z`M0`2QI4@308?\2>P_<@00^GQ40`2;5FA40`1V^0<0j;l[~2Pl@<^040
+083Y;P8008_0PGgX\PL007`;PGgXm@L007l2jcSoMNRjd1d30:5TA0<0Pn`8j><`~2^GQ40`2;
+5FA40`1V^0<0j7<[~2Pl@<^040083YhP4008_0RdGX;F`7~2RDGXPggT0G`;PggT37l5jc^=@03o
+MNBj21h30:5TA0<0Pn`8j8l`~2^GQ40`2;5FA40`1V^0<0j1l[~2Pl@<^040083YSP4008_0RdGT
+B8U5i8=mh05l2h=mh1mo1N\kSD00ogGP^SPN0`2QI4@308?\2>Po<000^GQ40`2;5FA40`1V^0<0
+j<lZ~2Pl@<^040083Y?P4008_0PggL07`:PggL5gl4jcZ;`?meg;YX7P<0XFA40`23k0SXmbl0
+0;UhA0<0RaETA0<0I[P30>R7:P00Pl@<^040083YmP0008_0PggH07`:PggH>gl4jcZ;`?mef;ZH
+7P<0XFA40`23k0SX[bl00;UhA0<0RaETA0<0I[P30>Po:P00Pl@<^040083Y[P0008_0PggD07`:
+PggD>gl4jcZ;`?mee;[<7P<0XFA40`23k0SXIbl00;UhA0<0RaETA0<0I[P30>Sg:@00Pl@<^040
+083YIP0008_0adG\~4adG`~4adGd~4SDGDj=Ogoon9AOR2?Ea40`01MCJj01l30:6`:P<0j9`\
+~2ogGh^PPO0`2Q\2X308?\2>R7;000^RlO0`2Q\2X30>Qh;000Pl@<RdGhj`23a0c9`he005F;
+k8?\;8U528UE36J9CA36AN<1^S@O0`2h01000>PQkOooRDGTRdD8RDGladG`~4o8]5o88h07@L
+R`gl@`<0RdGl<m::43?0IX\4DOK027@4j`J;`>\>Rl2;AOa0RDGljln=@02;AOb2>01e4>UK0@00
+SD00j@T0~2SD00RdGlRDGXRl2;AOb2>01d98\=o4<308]5o3?BRQ0c`6J;1563h0R3`?lK`40;
+`7@4j`J;`>\>Rl2;AOa0RDGljlN=@02;AOb9AOB;AO@[ANQ0RDG\Rdg\ReGXRdGTj0Y;~2RdGT
+Rdg\aP@808]538]=l8e4B0Q@^T0O0`2;ANB3k0SX?Bh008?438U5n8=mn05d=Omei8]5l41@^T@O
+0`2QI4@308?\2>R[;@00^GQ40`2;5FA40`1V^0<0j3\X~2Pl@@aTGS08]538]=l6J3O4P8og`B
+RdD<Rdg`IX5lB0So07l3jcolRdG`@52;A@b;CO0?_dA8252jN1l30:5TA0<0Pn`8j4d]~2^GQ4
+0`2;5FA40`1V^0<0j=dW~2Pl@@aTGS08]538]=l6J3O4P8ogD?RdD<Rdg`IX]E46J9E4P8RdG`
+@8U5l>UUo_ooo89mh`5e>H5ml001~2M33oMO2j[1l30:5TA0<0Pn`8j>@\~2^GQ40`2;5FA40`1V
+^0<0j7@W~2Pl@<aTGS08]5i>PM@@00RTGSj`23a0c9`he005F;k8?\98U526J9E@b9CA2jg1l3
+0;P10P00j07[oon9AOb;A@QVad1P0@2;A@QVad1R0@2;A@S7@6CoooooRdD8ad1Xoooooh]52<M0
+G000~2RdD8j8XF~2RlR;A@R9B5B;A@R3N5@03hDa~3ogD8^^@O0`2QI4@308?\2>P`;000^GQ4
+0`2;5FA40`1V^0<0j<0V~2j7\X~2Pl@<RdD@aP00aTGc0H_0RdD@j:Q8~2RDGdRdD8RDGXRdQL
+@H]5j8U8G8]=28]Eo;P00P00j24M~2RDG\Pgg\00n=B00008]528]0E?I0204?Q0P0~2jLl0~2
+SD00^GQ40`2j320306Jh0`3XBBH00;X0~3RdD8j3@8~2j7\E~2aTGc0>VN~3Rl2;AOc6P?l1~3
+^PX0~2RdGlj;d8~2RDGhPggh07@6RdGhaP00RdGlj098~2RlR;AO@3`HU5m0noA@`kAOAl4h]E
+o8]54>P<A`00jD<0~2SD00ogGd^S0P0`2QI4@308?\2>PO:`00^GQ40`2;5FA40`1V^0<0j:lU
+~2ReGlRdD8j9`7~2Pl@<aTGc0>T8~3jNOnoon=@00?_dD<>dGdOS3oMOBjH2030:5TA0<0Pn`8
+j<hZ~2^GQ40`2;5FA40`1V^0<0j5hU~2Pl@<aTGc08]52>RKj_ooRdGlj?ln~2RTGcj`:;`8?4
+3<W3SD00EH_\PN`d0P00RDD8RED<RDd@RdD<I\M0H040RdD<I\M0HP40RdD<ad1Toooooh]53<M0
+J?oooon;A@c7@5`0~3RdD<j7XD~2RlR;A@b9B5B;A@b3N5@03hDa~3ogD<^Y@P0`2QI4@308?\
+2>PP:P00^GQ40`2;5FA40`1V^0@0j;0T~2j6\V~2Pl@<^[PP0`2h01000>QQj?ooRHGLoOooRhGL
+oOooaP00aXGUoOoo0He008:miOgoo`4?QF\3~2RhGLoOooj6a6~2RHGdoOooRdD<RHGHoOooRdQL
+@H^5f?goohU8G8]=38fEo?gookP00P00j=TJ~2RHGhoOooPkghoOoo00n=BP0008]538]0E?I0
+204?Q0H0~2j@T3~2o;UhA0<0^\@P0`1V^0<0j?dS~2^P00~2RdD<j>P5~2j2lC~2aXGUoOoo0>W?
+0P00SD00aTGj2\I5n`2j8`0008f5o?goonQ\1P00RHG`oOooPkg`oOoo07@ORhG`oOooaP0:RhG`
+oOoo@8V5l?gooh^5l?goolH00;X:~3SHGloOooj2h6~2RHG\oOooPkg\oOoo07@9RhG\oOooaP0P
+SHGloOooj6M5~2RlR;QOCmool3`HV5m?gooh]5289h105e6X]5289h705e4H]5289h405e2>T[
+0@00SD00Rdd8SIGloOooRdD<j=O]oomVRHGVoOoo3kn5i_goonWD~3jOL0~2SD00RdD83kn=i_go
+of_9389l20@1MEB;A@P?_hgVoOooJlT<oc@8^^@P0`2QI4@308?\2>PZ:000^GQ40`2;5FA40`1V
+^0<0j;XR~2SIGloOooRdD<j:@4~2Pl@<aXGUoOoo0>TN~3o8]=20noQNKmoom[`0`3b8fEo?go
+oh]53>Skm?oojFX0~2Rl1X<2430;X@8@<0XFA40`23k0SX_BL00;UhA0<0RaETA0<0I[P40>Q=
+8P00j0PT~2Pl@<jc>=@03Y:`0008e008?ho`n48oooo`_03h@SooooPoP23h@JooooPoP13h@A
+ooooji^=@03Yn`0008e008f5h_gooe2j?24308]528]088?\2>Rf9`00Pl@<RHGXoOooPkgXoOoo
+0GDHIX>mh_goo`1l3VJ1_N;moooo07l3jdGlRdD8og0PRdD8og0H^T0Q0`2QI4@308?\2>P29`00
+^GQ40`2;5FA40`1V^0<0j98Q~2Pl@@aXGUoOoo0>Uk~3SD00PKgdoOoo010007lHSIGloOooRhGL
+oOooj8m2~2jDh0~2Rl3o]OCmoonjM2430:5TA0<0Pn`8j:0V~2^GQ40`2;5FA40`1V^0<0j30Q
+~2SIGloOooRdD<j1X3~2Pl@<aXGUoOoo0>T;~3SD00jH_loon=@02;A@cXC>Kooh]5289h105d
+>h]52?l`^Z0Q0`2QI4@308?\2>Pl9P00^GQ40`2;5FA40`1V^0<0j<`P~2Pl@<aXGUoOoo0>V^
+~3o8]5289h705d>h]52?m`6;[<8@<0XFA40`23k0SXmbD00;UhA0<0RaETA0<0I[P30>R78000
+Pl@<aXGUoOoo0>UY~3RdD8PWP@0G@kRdD8og0<^_PQ0`2QI4@308?\2>Rc9@00^GQ40`2;5FA4
+0`1V^0<0j4<P~2Pl@<aXGUoOoo0>TU~3RdD8Rd08j=D9~2RlR;AA2928]528]05>S32@00RlR;
+AA29B0B2_NGmool1MA]VRhgRoOooReD@RhGLoOooj7Gfoon8QNGmoon;QMcmoooXV3T006Hc`8Z5
+iOgoon\1o8?43<W3SD00EH_\Pn`4Dh?\36J9A@R9E@aVRDd@I\M5oP00o6J;AA1V>DGnOAZ;AA@?
+_dgnI\L4B?ooIX]5oVI0IXU5o^_Mo6K7AOh008_0IX]526HiAOh?SH80~2RdDDReD<3kmMoS?9
+RP`JIX<lB?l?QA`0~2RdDDReD<3kmMoS?9RP`JIX]EoVJ954SY>`0008]M30noCOhc`8X42e2j
+92830:5TA0<0Pn`8j7dT~2^GQ40`2;5FA40`1V^0<0j0dO~2j<PP~2Pl@<IX]5oVI0IXU5o^Ub
+ooooRl23a0aKbL>;`5F;k8?\48U528UE38U=48]=2;YL8P<0^000~2j7\9~2RdD<a`00~3RdD<
+ad04~4Rdd<ReD8RdD@j7;ioomVRDGnIX=moP0?SC40~2ogD8^V0R0`2QI4@308?\2>SR8`00^GQ4
+0`2;5FA40`1V^0@0j78N~2j2dP~2Pl@<ogD8^X`R0`2QI4@308?\2>Ra8`00^GQ40`2;5FA40`1V
+^040j44N~2RdD<og04RdD<oc2j]2830:5TA0<0Pn`8j80S~2^GQ40`2;5FA40`1V^040j10N~2
+Pl@LPl@<bL=ERnb3k0b9A@R9E@b3O@`03hAR~3ogD8RdD8og1L^^@R0`2QI4@308?\2>Pc8`00
+^GQ40`2;5FA40`1V^?ooj<<M~2ogD<^P@S0`2QI4@308?\2>P:8`00^GQ40`2;5FA40`1V^?oo
+j9XM~2Pl@LjC@0~2Rl3oM@R;A@SoL5bj42<30:5TA0<0Pn`8j=4R~2^GQ40`2;5FA40`1V^?oo
+j64M~2Pl@@Pl@<bL?lEH_\Pn`4RDD8RED<adGl~4o8]528]=o88l201d;8]528]=o8YE33PD20n5
+3P0008]528]=o0?1jAD0~2o8]5o429AOc[bhe00;P0~3j`7lbL>;`5F;k8?\55>9A@R9E@c7AO`0
+~3RdD8RdglPS`807DDRdD<RdglPS`807D8jL\0~2SD00R`gl@`<0RdD8Regl<m::51Pc`6J;157f
+`40?Q2@0~2XOa30`2;E@R;GO`cbHX<6VJ;Q4P20P003ko0RDG`j@l0~2o8]M28]=o3?0RP@;RDG`
+RdG`RDGhRagl@`<0RdD<ReGl<lV:310c`6J;14_f`41d8:7l@`<0Rdd<ReGl<m^:715VRhAH0P80
+00no`8U5k>\>Red<Rdgl<l2:10^9ANb;ANb9AOB;AO@iAOQd38]5n2]5m>TE~3o8]5o429AOcY
+6?oookP0~3j`7lFlW3o5F;k8?\15>9A@R9E@b9CA37AO`0~3o8]543U5o7dHRdD8RdglPS`807D@
+RdD<RdglPS`807D4jdJ;`8]E38]Mo8]528]=o8XD6SPD20n4800008]E38]Mo8]528]=o8XD6SPD
+20nE`8?P0NTG~3SD00RdGl@8U5o>^KSD00^000~2j`7lFlW3o5F;k8?\55>9A@R9E@b9CA37AO`0
+~3o8]543U5o7dHRdD8RdglPS`807DDRdD<RdglPS`807D8jL\0~2SD00R`gl@`<0RdD8Regl<m::
+51Pc`6J;157f`40?Q2@0~2XOa30`2;E@R;GO`cbHX<6VJ;Q4P20P003ko0RDG`j@l0~2o8]M28]=
+o3?0RP@;RDG`RdG`RDGhRagl@`<0RdD<ReGl<lV:310c`6J;14_f`41d8:7l@`<0Rdd<ReGl<m^:
+715VRhAH0P8000no`8U5k>\>Red<Rdgl<l2:10^9ANb;ANb9AOB;AO@iAOQd38]5n2]5m>TE~3
+o8]5o429AOcY4?oookP0~3j`7lFlW3o5F;k8?\38U528UE38]52>Q8?000RDGhRdGhB8U5o8_0
+Pggl07`^RdD8RdglRUD<>1@83hD@~3RdD8Rdgl0l7Y5`0008e008]5o4R9AOc[che00;P0~3j`7l
+Pl@4bL>=@01ERnb3k129A@R9E@b;A@SXi3\008U5n8]5n4R9AOb;`8=mo01l=X]528]=o3?BRQ@8
+RdD<j6?lool;`0n43`0008]528]=o0?1jAH0~2Rl2;AOa8RDGljlN=@02h~4j`7lPl@8bL>=@01E
+Rnb3k0b9A@R9E@c7AO`0~3o8]528]=o88l201d=8]528]=o3?BRQ@8RdD<j?gkool;`0n43@00
+08]528]=o0?1jA@0~2RdGl@8U5o>_3SD00^000~2j`7lPl@8bL>=@01ERnb3k31CEh?\38U5288m
+G4@3004?QCH0~2^S0S0`2Q\2X30>SV6`00ogD8^SPS0`2Q\2X308?\2>SA6`00^V8S0`2Q\2X3
+0>S26`00Pl@<Pgd807dcogD8^V@S0`2QI4@308?\2>PD7P00^GQ40`2;5FA40`1V^080j:@H~2
+Pl@<adD8~4adGTP5410<M5g80ch@6;AM`5P54108U5f<M5o;87~2Rl2;AObI<l8[`X?P0c?2:l8;
+`0n59P0008]5o;UT~3VOOi2m8?QAH0~2RdGl^I01~2VOOi2m8?Q0<0~2j`glRdGHRDGDj@L0~2
+o8]5g8U5e8]5e3U527`>RdD8:dGDRDD8j@P0~2j@l0~2SD00RdGl@8U5o>^7SD00adGh~4o8]5
+n8\4QN0F0`29AN23OOP13hDm~3RdGlVC?2:l:3h0<c`R_22l0?QBH0~2RdGl^F@0~2VOOi2m8?
+QAL0~2RdGl^I01~2VOOi2m8?Q0@0~2j`V;`8]5h429AN2;AN0?[dGT>dD8OaF;CN0?[dgTRdD8
+:l69A@SY2@000?cY3`0008e008]5n429AOSYK?oooh]5n429AOR;A@RImggTRDGdRdGd@8U5m8]5
+29WgONB9E@R;A@Ri40h009WgnHU5l8]52;T@3P00VOOiRED8RdD8^C`0~2VOOiRDG\RdD8^C`0
+~2VOOiRED8RdD8RDGXogGXogG\ogG`ogGdogGhogGl^Y0S0`2h94@308?\2>Ph7000adG@94@3
+0;\5~3_k0S0`2h94@308?\3>S2>000RmN;bh_HPl@4RdG@0l>3k?SXa3D008?4888mG4@3005e
+>;Zh8`<0XK0Z0`3XNAT006PTA0<0^\0S0`2Q\2X308?\2>QR6@00^_PS0`2Q\2X30>QC6@00Pl@<
+^2A40`3[0Ob3a0aOFlW3o5F;k8?\58U528]52>Q7>000@8U5n8]5n>Q3<`00RDGlPggl00n5=000
+0?me2?men;[l8`<0XFA40`23k0SXKQ\00;UhA0<0RaETA0<0I[P40>Sn5@00j;TG~2Pl@@ReD8
+RdGlj8lg~2RdGlj`:;`8?43<W3SD00EH_\Pn`<RDD8Pgd800n44@0008]5288h00n41@000>T8
+~3RdD8jEP0~2RdD8j:`g~2RDGhRdD8Rdgh0l58RDGlo8]523U5o78LR`gl@`<0RdGl<m::43?0
+IX\4DOK027@4j`J;`>\BRl2;AOc6~2RdGlB8U5o>_9o8]52>\3SD00Pl@4bL<0~2EH_\PnaTRDD8
+RED<RDd@JP2=ANa@SDgdSEFXRdD@Pn`<j?XB~2Pl@DIXU5jS?0IX]5j_K00WDFPgd807@@^@P0
+~2ReD8SDGdj78g~2<l1VRdGZm\04MAJ3O@`0M12i100008]E38e5k>QA=`00ogD@JP2=CNb=EOB=
+AJR3k0cXo`P008?458?43<W3SD00EH_\Pna0RDD8ogD8^S@T0`2Q\2X308?\2>R>5`00XK0Z0`3X
+a20008?43?bQZ2X308=h6P4?QJ40~2XJPZ0`23N1003h@b~3XJPZ0`29ALb9AM2;B119RdG@RDP@
+R`fX:P<0RdG<Re0@<l2:A14HRDG`jEX0~2SD00XJPZ0`23N0@0M3VQZ2X308U5e8]814V;AMB9
+B0BQZ2X308U5f8\8RDgL@H]5f8T8RdgL<l2:0HU5n8]5n8U5m>\?Rl2QZ2X30>Rb8000RDGdRdGd
+RDG`RdG`RDG\j`klXJPZ0`3XUR0008U5k8]5k8U5o8=mo?me7kUhA0<0^T0T0`1V^0<0j;PC~2
+adGlCP000>U0~3R`gl@`<0ReGl<l1VR`AAm\103h@L~3XOa30`2;COaVRhA80P8000no`8U5j>T7
+~3o8]5o8U5j8]5j8U5o8=mo4h?Q1H0~2PgglF@n430000<M5i000~2j@L0~2adGT0@0008=mi00?
+U<0Uo`0000_03hFMo_ooPgglFGD;adGP0@000>\9Rl37AN00~3RTGPj`23a0c9`he005F;k87\
+?08008U528]526K7@63ooh]526K7@6;ooh]52<M0I?oooon;A@S7@6SoooooRdD8ad1\0@00P;YO
+90<0RdD8j=LV~2RlR;A@R9B5B;A@R3N5@03hDf~3ogD8^V@T0`2QI4@308?\2>Se5`00^GQ40`2;
+5FA40`1V^0<0j8DB~2j<@1~2Pl@<jK@1~2RdD8j0P5~22\0?QF@0~2PSeLA0<00@n5=P000;Z8
+90<0XK0Z0`3X>1D00?me2;Z@90<0XK0Z0`23k0SX8aD00;Zi90<0XK0Z0`3X51D008?438]52>QY
+eoooRdD8aT1H0H]52<M0E000~2jD<1~2SD00RdD8og1D^@02~2^P40~2SHD0o_ooPn`<j3hX~2
+Pl@@RHGloOooahGdoOoo~4ahGhoOoo~4o8^5o?goodPkQOSmoomfAH^5n?gooh:l1@3nool=3hDQ
+~3RhGhoOooP[`50Okoo`X?Q@d0~2RhGdoOoo@8V5m?gooh^5n?good29QOSmooo[[Ob;A@SX^=Ko
+oh]52<M0E000~2RhGdoOooJl1@>hGloOooLaV;A@QVad1P~2RdD8I\M0HP40jA@0~2Rl2;A@QV
+ad1P0@2;A@QVad1R0@2=UM3moon;A@SXI<\008V5l?gooh>ml?goo`1d>Ome2;Zl90<0XFA40`23
+k0SXD1H00;UhA0<0RaETA0<0I[P30>SP4000j1l0~2Pl@<j@l0~2SD00RdD8RhgXoOooRDQ\Pl@<
+bL>=@01ERnb3k0bQl4@308?\1>R9<P00Pl@4D;[P90<0XFA40`23k0SXkaD00;UhA0<0RaETA0<0
+I[SoonQo4000Pl@<Pl@<bL>=@01ERnb3k129A@R;A@P?_d1PjGL0~2SD00^_DT0`2;A@SXHb@0
+08U5o>U[~3SD00^_PT0`2;A@SXBb@008U5o>UC~3SD00RdD83km0H52jo2@30:5TA0<0Pn`8j6hE
+~2^GQ40`2;5FA40`1V^0<0j?h?~2Pl@<^000~2jF40~2o>T?~3SD002l1dR8?h0GBKjk7lPggl
+07DnogD8^R0U0`2QI4@308?\2>PM5@00^GQ40`2;5FA40`1V^0<0j:d?~2j>cnoon3a0bh~4j@\0
+~2SD00RdGlj`>=@023a0c9`he005F;k8?\46J9A@R9E@aVPgd80@n4\00008]53>R80@002\0?
+Q:00~2IX=m208?QEd0~2ogD<^T@U0`2QI4@308?\2>RL5000XFA40`3XM_[ooh?432Go~3Pl3o
+6l102l0?Q200~2^GQ40`2jI2D306JhoooX3@l00;P0~3jA\1~2SD00jC\0~2SD00ogD<^WPU0`2Q
+I4@308?\2>Po5000^GQ40`2;5FA40`1V^0<0j<l>~2Pl@<^000~2jMX0~2Rl2;A@`?_d1PjG@0
+~2^XTU0`2;A@cX^b8008U5o>U[~3SD00^X`U0`2;A@cXXb8008U5o>UC~3SD00RdD<3km0H52j
+T2D30:5TA0<0Pn`8j<HC~2^GQ40`2;5FA40`1V^0<0j5H>~2Pl@<^000~2jF40~2o>T?~3SD00
+2l1dR8?h0GBKjk7lPggl07DnogD<^[@U0`2QI4@308?\2>Qe4`00^GQ40`2;5FA40`1V^0<0j0D>
+~2j4Cmoon3a0bh~4j@\0~2SD00RdGlj`>=@023a0c9`he005F;k8?\28U52;X0~3RdD8j0K5~2
+Pl3o6l10j@<0~2SD00Pl@8bL>=@01ERnb3k529A@R9E@b3O@P03hD6~3jBl0~2o6X0JP2=COB=
+EK2;A@b3k0cXD`\00?me36X0Rdd8SEGdSDF`Pn`<j:41~2Pl@XbL=ERnb3k0b9A@R;A@R;@5CX
+[<D008U5o8]5o>QiaP00RDGhPggh00n540000;01jA40~2o>T;~3SD00\03Y0@000?b3a0C9`he0
+05F;k8?\:8U528]52>Rgm_ooRDGX^Rh0~2RdGXj:?_oon9ANB3ON@03h@R~3^@@0~2ReGTSDG\
+j4h_~2aTG`08]5i<H00>TE~3SD00^@40~2^]LU0`2=ANcXeR\00;T8~3ReGXSDGdj1X_~2aTGl
+08e5m8U5i8]5i88h07@XRdGT<m::4;SH9@<0j2o_ool;`0n51P0008]5i<H0Gh]5i429ANC[d8e5
+kHU5i8_0RdGTPSP0M2R;AN@cdXX@^2@V0`3Xmnkoo`_03hD6~3RdGTaP1ORdGT@8U5i>_@SEGd
+^4A70`3Xcbd008eEk;Q4A`<0j4X]~2^TA70`2;A@SXPBd000_0M35XA4L30?me2;Y`9P<0XFA4
+0`23k0SXCa400;UhA0<0RaETA0<0I[P20>SO2`00Pl@@^4A70`3[0Ob3a0c9`he005F;k8?\45=G
+Pn`<RDD8RED<RDd@^@40~2^Z4V0`2;AASX`RX008=m200?Q880~2RdD8PSP03hAf~3^D00~2ReD8
+RdDHj:P]~2RdD8j7`]~2RDGlRdD8Rdgl<m::E0So^:8V0`3X1nkoohU5n8=mn00?QCP0~2Pggl
+@0n3;P0008]568U5l;\2~3_jDV0`23k0cX=2d008_GRl^;f8?418]5l0?3Pnchj3HZ~2Pgd<07@@
+^@P0~2ReD<RdDHj2`]~2Pgd@00n4KP0008]5488h00n4HP0008]5488h;Pn4AP0008]568U5m;\2
+~3_jLV0`23k0cXcR`008_GRl^;f8?418]5m0?3Pnchj=0Y~2^@<0~2ReD@RdDHj<`\~2jA<0~2
+SD00^@@0~2ReD@RdDHj;@\~2Pl@<Ge_9`oaERnb3k129A@QVRED<RDd@ogD8^Z`V0`2Q\2X308?\
+2>Q;3@00XK0Z0`3XPAH008\=Z2X300noE@b;AA3XjaP008?438U5o8=mo00?QAd0~2^GQ40`2j
+\2H306Jh103X80X00>QOnOooj=H;~2^PX0~2RdD@j;7\oon9AOb3OO`0M0J;AOc6~2Pl@<bL?l
+EH_\Pn`<RDD8RED<RDd@adGl~4Rl2;A@PiAO`?SF00~2RdD@Rd1Dj84F~2RDGhPggho`n5<000
+08]548]0E?I0208?Q0`0~2^?kooooY=P0008_0Pggl07D:^?oooooY90000>\JRl2;A@b;COb;
+EOR850R;AOa0RDGljiN=@02;AOc[0he008?41<W3SD00EH_\Pn`@RDD8RED<RDd@RdD@RdQDReD8
+RdD<j>PG~2RDGlRdD<Rdd8BLH42023OO`03hDd~3RdD@Rd1DmT080Pn430000;SnoooojBH0~2
+Rl2;AA2;@5Cf@0P1M0bhooooonT>~3Rl2;A@cXl2X00>\2Rl23a0c9`he005F;k8?\38U528UE
+38U=46S`9P<0^]0V0`2QI4@308?\2>PF3P00^GQ40`2;5FA40`1V^0@0j:H8~2j64:~2Pl@<^?ko
+oooY~4Pl@<bL>=@01ERnb3k21CEX?\38U528UE38U=4<M5h000~2adGh0@0008_0RdD8>DGh3hgH
+0`00RdD<RdghR`B8RDGlRdDHPWP50@n51`000<H5G4@30062?Ea40`01MCJjo2H30:6`:P<0j10;
+~2ogGl^P@W0`2Q\2X308?\2>Sk2P00^RlW0`2Q\2X30>S\2P00Pl@<RdGl<m::48]54>RFj_oo
+2l0?Q>h2~2^S4W0`2;AOcXBBT000_03hCI0P00PggP00n4200008]5h>Qg8@00RdGl@>QRlOoo
+RDGPReDDRdGPj23^oon9ANS7AN@0~3PggX07@=RdGXaP00RdGX@8U5i8]5h>R7:@00RDGdadG`
+ooooolM5k000~2Rl2;AAR;CNa[b@b3?0P03hBe~3RdgdReGPRdDHReg\Jm\<R`@Hj=[[ool;`0n5
+RP0008=ml00?SEP0~2RdG\RDG`PSeLA0<00@n5?`000;Xd9`<0XK0Z0`3XoPT008]568]=k6_9
+3?ld2;Xl9`<0XK0Z0`23k0SXh0T00;YX9`<0XK0Z0`3Xd@T008?43>TY~3o8]538]Mn?ldV;Y\
+9`<0XFA40`23k0SX7@`00:5TA0<0j>nloon3a0b;ANa0RDG\jCSooon3OO00OBR;A@b;GOSo=9Rj
+R2L30:5TA0<0Pn`8j><;~2XFA40`3X]Kcooh?438=mj00?QG00~2RdDHReg`Jm\<PW`H100?QCP0
+~2RdDHReg`Jm\<oc@HJ<DW0`2jX2L30:5TA0<0Pn`8j9D;~2XFA40`3XIkcooh?44>TR~3SD00
+RdDHReg`Jm\<aT@H1@6;AAR;GO1[f`c7A1P8~4j@01~2RdGTPSP03hD`~3RdD<ReghocBH^\PW
+0`2QI4@308?\2>Pe2`00XFA40`3X1kcooh?43>W7~3SD00RdDHReg`Jm\<PW`H105e>8]568]M
+l6_K3?ld66PE:0<0^^`W0`2QI4@308?\2>S]2P00XFA40`3X_k_ooh?44>Uo~3SD00RgDHReg`
+Jm\<RdGTj1O_oon;b8_6RD`H28]568]Ml6_K3<I460D1PSeLA0<00@n5@0000;XH:0<0XK0Z0`3X
+9@P008]568]Ml6_K3?md60Rj82P30:6`:P<0Pn`8j0H8~2^T`X0`2Q\2X30>Sg1`00Pl@<jG40
+~2SD00jFT0~2SD00RdDLPWP500n58`0008]57<I01@6;A@b;GOR;19SXP^kooh_HRdDLREP8jCL0
+~2o8]5889h1@1e8h]58<I01@6;A@b;GOR;19SXE^kooh_HRdDPREP8j@\0~2o;Q@:0<0j<Zjoon;
+AOQ0RDGhjAkloon;`8?435iKbL?lEH_\Pn`LRDD8PSeLA0<00@n5D`000;Y`:0<0XK0Z0`3X@`L0
+08]528?0K8?\1>R]7`00Pl@4Pn`4j7X7~2Pl@4D?me2;Yh:0<0XK0Z0`23k0SX4@L00;ZS:0<0
+XK0Z0`3X0PL008?448]528?0K>Q\7`00RDGhRdGhPgPDD0n=NP0008]528]0K8?\1>S6j_ooPl@4
+D?me2;ZX:0<0XFA40`23k0SX;@T00;UhA0<0RaETA0<0I[P20>Rm0`00^GQ40`2jb2P306JhoooX
+ZP<00?me2;X0:@<0XFA40`23k0SXl@P00;UhA0<0RaETA0<0I[P20>R10`00Pl@LRdD8Rd1\RDG`
+RdD8Rd1\RDGdSEG`RdD8j2Fo~2RDGlPggl07A>RdD8Pl1\Pn`4j:hN~2Pl@4Pn`4j7\6~2Pl@4
+D?me2;X`:@<0XFA40`23k0SXPPP00;UhA0<0RaETA0<0I[P30>PB0`00j57boon3a13[08?43<W3
+SD00EH_\Pn`DRDD8RdD8Rd1Dj4Bk~2RDGlRdD83km0H>UU~3o;X0P000RdGlj4>l~2RDGhjE\0
+~2SD00^P10~2RdGlj2^l~2RDGhjdJ;`6Qh:@<0^UPY0`2QI4@308?\2>Se1`00^GQ40`2;5FA4
+0`1V^0@0j8D2~2j404~2Pl@<j@`0~22l1dV8?h0GB[jkglPggh07daogD8^XPY0`2QI4@308?\
+2>R]1`00^GQ40`2;5FA40`1V^0<0j3d2~2j7caoon3a0b3a0c9`eF;k8?\N8U528UE38U=48=m
+300?Q0H0~2RdD<aP00Pgd@07@6RdD@aP00PgdD07@6RdDDaP00PgdH07@6RdDHaP00I\M5WP00
+Pgd807@=RdD8PSP0M0G[3he006J;AIkY3`4008e008]E28e5[>QQ8`00SDF\RDFX^ZPY0`2;AJSX
+]^OoohU5Y8=mY00?Q6`0~2IX]5WX;826J9AIj3O@`03hA:~3adFP~4o8=mX41m2X]5Y3U5Z7L2
+j`C[:X_0RdD<RDFD@8U538]5Z8U5V429AJR;AIR:28]5U8P8RdFP@8U5X>_5o8]53<H008]5Y429
+AJB;AJB9AJRj;P0008]5Z>S<hoooRDFTPgfT07@[IX]5WX;816J9AIj3OA@03h@@~3^@@0~2ReFT
+RdDDj6HS~2RdFTaP00RdFXPSP0M2EVRdFNP\P2IXU5WX=m400?Q100~2^@P0~2ReFXRdD@j3<S
+~2IX]5W^\1o8?43<W3SD00EH_\Pn``DeN3k0b9A@RhZbT30>Sl6P00RDGhPggh00n5B0000;T4
+~3^[0Y0`2=AMSXVAl008e5f8U5d;\8~3_k@Y0`23k0cXJB8008_GRl^;f8?418]5d0?3Pnchj6\O
+~2SDGHj9<O~2j5hT~2XL0[0`29AMB=A@SXUQ\008U5o8]5o8=h801n5X]5e2d@3P00jA40~2o>T;
+~3SD00RdGDj@00~2Pl@<Ge_9`oaERnb3k1QVRDD8RED<RDd@adGh0@000<M5o000~23km52>VM
+~3o<M5m;`Y0`3Yb0000<M5m<0Y0`37AO`1~3jKD0~2o<M5m<PY0`37AO`1~3jJ40~2o<M5m=@Y
+0`37AO`1~3jHd0~2o<M5m>0Y0`37AO`1~3jGT0~2o6P<:P<0^^`Y0`2QI4@308?\2>S11000^GQ4
+0`2;5FA40`1V^0@0j57ooooX30400>P70@00Pl@<jC\0~2SD00PoP13hAKoooo2l0?Q5?ooon3
+n?l?Q5Kooon3n08?Q67ooon3n0<?Q6cooon3n0@?Q7Ooooo[ROb3O@`0M0Z;A@b2>01d0^\PIZ6E
+A`<0ISU520n>2P0006J;A@QVXiE70`3YS`000?b;AA23N5@0M@O7AOP0~3Pggh07@OPggl07@I
+RdD@R`f`:P<0>DQD3hD7~3adGl~4Pggl07@KogD<ogGd^Q`Z0`2Q\2X308?\2>Q]0@00Pl@@Pggh
+07@LogD<ogGd^R@Z0`2;AA2;@5B3k0SXB`4008?446JQUDL306HiA@Qn2VJ;A@QVXiE70`23a0c9
+`oaERnb3k0@?_`FEA`<0jCh0~2Rl2h~4j489~2jDT0~2o;P1~3j389~2jcbh0P000>PV2@00jc2h
+0`000>PJ2@00jbCY7`0008e008?h0GBo2l1d^h?h0WC6PoP3M<f3n0Ade>_BRl23a0C9`he005F;
+k8?\15>3k0R9A@R9E@b9CA37AO`0~3Rl2;A@PiAOam88]548]@E8]=38]Mo3?0RP@Ij3HB~2RdGl
+@8U5o>_Io8?425_9`h_0EH_\Pn`<RDD8RED<RDd@J4`Z0`2j;2X30:5TA0<0Pn`8j;H2~2^GQ4
+0`2;5FA40`1V^0@0j4KmoooX0Ooooh?438?43<W305F;k8UE36X0SDd@DH]=38_@^040~2Pn`<
+j9X^~2Pl@DbL?lEFRHg`40I?le~4RnaTRBd0~3REDDJP6=CAQARddDRm2h0@0008?\3>QS;P00
+Pl@DRnETS`D0~3Pl@4GL<0~=EH_\DeN3k1R9A@P;`7D9<l23a1QOFlW3R`ePA0<0RDg\2lUe7kPJ
+~3j:4I~2Xf140`29AN`;`7D9<l23a1QOFlW3^@@0~2Red8Re<HSABEG2X308]mk8_7j80K~2Z@00
+E02=A`Bi100008]C48dDUGPZ0`3XI1\00:T005@0Rl^=G`R9GNbj2P0008]138?\28e=l57XMbd0
+08?438]=l0_9M@f3`B282h?72HUmk>\?Reg`Pl<`RdG\R1Q0RDG\RdgdPl4`Reg\R0^=B`760B2j
+2P0008]m28]728?\28e=l57X:Bd008e;0X]El8?2<8PASD\3ReGdPl8`R16=B`C60CZj2P0008]7
+18?\28e=l57XnB`008e;1H]El8?2<8PASD\6ReGdPl8`R16=B`O60CZj2P0008\7Pn`8SDg`DNS:
+;000SD\8ReG`Pl8`R16=B`V;EOB3`S284He;2\H18;[X0`00RdLD1F`7~2Pn`8SDg`DNRE;000
+SG\;Rdg`Pl4`R0njI00008]5m8?\28e=l57XMR`008ek38]=l8?1<8P?^PX0~2RdGdPn`8SDg`
+DNQG;000PlA8SG\=Rdg`Pl4`R0n=N`j;COB3`C283he;3lH12X?348UMk<H30:5PA0<0Pl@HGe_9
+``00~=EH_\RED<JP2=CA1ARdd<Rm0c`8?\3>PY;000Pl@DbL=EJ9SO0@1TocD0~3RnaTRBd0~3
+REDDJP6=CAQARddDRm0c`8?\3>Sf:`00Pl@DRnETS`D0~3Pl@4GL<0~<EH_\RED<JP2=CA1ARdd<
+Rm0c`8?\3>Q=BP00Pl@DbL=ERnb9E@aZ0He=456;C@b;d3?0Pn`<j2e:~2Pl@DbL<0~;EH_\DeIG
+Pn``^Ql0~2^<P^0`3X02P000_0M0Xc`8?4<5mNFlW3J60`0`2=CNAA\0;X~4XK@Z0`3XF88008?4
+28?hogDI<lTcd[QT~3j0in~2PlSoPl@`GeiKbL>h1PH00>R]5P00RDGX2l1e6C?9<m:hI0000>ST
+O@00PlSoPl@`GeiKbL>;ONR=A`:S]2`30:?h;`<0Xoa30`2n^2X30;U0~3ljEVYH_GPNX20@00
+SKX20@00<l2i@0000?>[RoZ=U`82~2REGXI\L2oon1a`@2~2RmMV<lUVPoUQLPiVPoUjM`R=@N1V
+R@;[0fJ92X_1@H?20VJ1nOl0M]aVa`;ooh?20VHcbOaVPoU1LPiVPoUJM`R=@B1VR@;[0fJ92X_1
+@H?20VJ1nOl0M]bh00800>SJ5@00XkP\0`0;`7DI<lTcd[QT~3j0mm~2PlSoPl@`GeiKbL>;?KP\
+0`0cdXYGoOK287@9<l2iP0000?>[R`fh;0<0R@gl;`<0^9Pd0`3XgA8008U5j0_0M2^;n8_g^@D0
+~2<l3b[U4[oX_?Rce0<0<0Rl71j@;cYH_8Pn43ljAI<l3cZ\M5k000~2adG`~4ocE<<0<0SDg\
+DFX@\0?X~4Pl@<2l1d2\L5C303~5^:Pd0`3XKa8008U5j0_0M3V:28;iKg@5P_U?MBf;ANR:@04l
+KW@4?4ie7kZ`=0<0RegXPl<2Rl?XC840088l0`1e1h8=b2h3006hQ2d30>SE0@00^>@]0`3Xb`40
+0;Q4;P<0j<41~2a`F\;@<0i2d30<L532h304@^0`1Z4fP04000J8@]0`2`0nP0~3Pl@<2l1d6C?9
+<m:hI0000>S=N`00PlSoPl@`GeiKbL>;3H@]0`293M0]0`1Z4fP08000J<0]0`2`0nP0~3Pl@<
+2l1d6C?9<m:hI0000>R>N`00PlSoPl@`GeiKbL=Z4fP04000J>@]0`2`0nP0~3Pl@<2l1d6C?9
+<m:hI0000>QKN`00PlSoPl@`GeiKbL>;3N@]0`293C0^0`1Z4fP08000J20^0`2`0nP0~3Pl@<
+2l1d6C?9<m:hI0000>PLN`00PlSoPl@`GeiKbL=Z4fP04000J4@^0`2`0nP0~3Pl@<2l1d6C?9
+<m:hI0000>SYNP00PlSoPl@`GeiKbL>;3D@^0`293I0^0`1Z4fP08000J80^0`2`0nP0~3Pl@<
+2l1d6C?9<m:hI0000>RZNP00PlSoPl@`GeiKbL?71AQ80`24;0<0a`DLB0<0[2`306XDSDg@DFX?
+JP^`1>P0~3Pl@@Rdg@R0gh@`<0RdgDR0dLA0<0RdgLR@fl;P<0RdgPR@fh;P<0<l23a31OGU_9
+`oaERnb3k0QCRmR=COQASDglDOmc8;03j000~2Pl@<2l2;`gDXRdglPN7o~3IP_9M1Z0B4B0Rdgl
+PN7o~3IX?i0GD7ad100P0005_9``00~;EH_\Pgd807D5j=He~2J2A`0@1Z0k02j000~2Pl@8bL>7
+fi1ERnaX\>4106Co=@00~2j53koon3n?mdKXe5n6BS~4^<3A0@23k0CXFF@008?419_I;I@`0`2;
+AAB3k0CX`7\006PTL040^07o~2D;02j000~2Pl@<R`dD@@<0DH\ET30305:QS303053X:[OooheU
+n8?\1>PC~3SFGhI8l5~4^0P0~2GL>@05EXV=l106Co=@00~2RnaTRBd0~3EUN3k0B;3K@Z0`2;
+\J@1~2Rdh82lUd8dV9CPR3OPP0O1V;n8]>28eAohUF28]DSPcodX_7Pgh807gWj3In~2Pl@4GeiT
+S`D0~3Pl@4GL<0~<EFRHg`40I?le~4RnaTRBd0~3Pn`@2l1e7<L5l4@300`0~2PlSoPl@@I8l5
+~4Pl@4GL>;3K@Z0`2;RK01~2RDgl2lUd3S_8M0N;BB@;bGGeRDglRdGl2l1d3c?Bj2@R~2RDGh
+j`Z=@037AOSoooooRdGhPl@@I8l5~4Pl@4GL<0~>EFRHg`40I?le~4RnaTRBd0~3EX?\4<M5l000
+~22l1e6h\=]2X308^9\04008U=n<M5m000~2j`b=@029AOR;B2B9COB;MOPkMOAd7Xe008_6j54e
+~2PoP1M@O7AO3oooooRgHT>gGdMNF;AO23a11NI8l5~4Pl@4GL<0~=EFRHg`40I?le~4RnaTRBd0
+~3Dh?\78U5n0_0MAg71O140`0<~3PlSoPl@LFfB?1@00~2Pl@4GL?7AO@0~3RdGhmT080W@Fa`G`
+A0<020000<M5m?ooooo[>he008]5n89h6P9e4lL5l4@301`0~2adGdooooon\LRdGhRd0hPn09
+MA771O140`0N~3adGdoooooh=mm?me3X]5n89820;Y7P4008_0RdghRe4@2m9d4TZ9DA0c`8Y4
+4AR9AOCYl`0008]=n8=i@0<?Q7<0~2PgT400n5C@0008]133d08000L`?[1_bh020008_8RdGh
+Re0lj0il~2RDG`2l1e3lM5m?oooooY]`0008e008]=l8]Mn8]CC8_3j60Q~2RD<4Rd]<R@^;AOR;
+28eI0HTH<m^:6HUMm?m81>Uf~3SD00RdGhPWPe0G@6PWPd07D]^@40~2SEG_RdGhj:Ek~22l1d
+3C?KRUg_REgdjdJ=@037AOCooooojcZ=@02i0@0008]Mn8]C?8_3j7Ik~22l2;`g@H^@40~2SEG_
+j=\P~2<lV:CNn9COC[2?c7AOCoooooPggdog@7RdGhaT0J0H]5m8?475]TS`D0~3Pl@4GL<0~<
+EFRHg`40I?le~4RnaTRBd0~3DeIGPn`hRDD@REDDRDg`2lUe7\L5l4@300`0~2<l23a3QOGU]T
+S`D0~3Pl@4GL>;CA29CNb;CAB3n@9m>8?i0GdKRdg`PTT80S?0Pl@hGeiKI8l5~4Pl@4GL>;ANc6
+~2Pl@hGeiKI8l5~4Pl@4GL?7AM`0~3RdG`mT080W@Ca`G`A0<020000<M5g?ooooo[>8]5l89h
+6P9e4lL5l4@301`0~2adGLooooon\LRdG`Rd0hPn09MA771O140`0N~3adGLoooooh=mg?me5X]5
+l89820;7AN`0~3jDX4~2SD00RgG`Pgh@00n4C`0008]E58?j0@n>@`0008]Mk8]644R9AQ2:A0HH
+R0=3?0Ye7<H30<I66P6;AA23a3QOGU]TS`D0~3Pl@4GL=:Pgh@07@5PoX1OlJ9EAB9GNb3OA@1
+M@j;ANc6~2jJ@3~2SD00Reg`Pg]00`n4L`4008=k101e?h]333d08000L`?[1_bh020008_8Reg`
+Re<lRl?XO7T008U5i0_0MQN;b8]CC8_3j>4N~2RDGPRD<4Rd]<R@^;AO23N0@03hI20`00o8]5
+54R;f8]=l3]I17L6RDGXj`[lRdG`Rd04RDGXReg`Rc>;o[P:~3RdgX2nCb[Xeoog@2<on9OM0;
+og@nRmN9OLP[eT:9EMR;GNb;nh_:Rl69CLc1j@;cYH_8RdG`Pn43ljB;CLR;OL`YN0A1R@P3fXUM
+k>W70P00Rl2;AO2;68]5k8_cRoR9ALR;ENR;`X_8`NT2ljF;b8]5l8?Q0o>TRdg8RggX0mn968]H
+12_JREP4ReDD:mN9EA@3chU=k8?j0@n>N08000_KMD6;@0`m020007<5j`R=@02h020008_8Reg`
+Re<lRl?XH7P008U5i0_0MQN;b8]CC8_3j<DM~2RDGPRD<4Rd]<R@^;AO23N0@03hOUo_oojB42
+~2RdG`PWPe0G@DPWPd00n5G@000?I0A80?Q5<0~2^@40~2ReG\RdG`j0=h~22l0?Q>`1~2SD00
+RedDBhUM58]=k8eA0HUEk88i2Pn4d04008?k0@n4a`400;T1~3RdG`j<Ug~22l1ecNVa0@00RdG`
+PWPd0@n5J`000?I0A80?Q640~2^@40~2Re0lj9ag~22l0?Q8D1~2^@40~2Reg\Rm>;MO2;a^Sh
+7000RlJ;CAA9RDdDSE<1REG\PS\:3hAI0@00PoT13hA@0@00^@40~2Re0lj59g~22l1e^^Tj0@00
+o8]554R9AMP?Q2`1~2?OP?~2O@C[1h_0^?P?~2RlR;AO2;D3cX7WL008U5i0_03hH40@00SD00
+RegTRl^;ONb;eh]el8_6j7@L~2RlR9CN2h2P0000_TlZj=Oomd0S?oRGg@2ol?Q900~2ReHlRoZh
+2P0008_;2nCb[Xeoog@2<ol;o`n4I`0008e5e51Z0B_jAb_kEomf8;04j000~2Pl@@RDGL2l1d
+5LL5l4@303`0~2Xl1<0`22CPP2jaR;AO2;F0R2hoj9F0R2hof9F0QVad0foon3OM`0M1@c`8?4
+>5mNFfB?1@00~2Pl@4GL>;AM10RDG\jcklRdg\RegP0l^9CNb;AMP[`hU5f7@X?OP?~2O@C[1h_0
+^?P?~2RlR;AO2;D3cX6WH008U5i0_03hOoo_ooRdD@>DG\MRN;AO36@1X1mT080W@:adG\~4jaSl
+RdG\aP00RdD@RDG\j`V;`<M5k000~2RdG\Pl@hGeiKI8l5~4Pl@4GL<0~;EFRHg`40I?le~4RnaT
+RBd0~3Dh?\8<M5n000~22l1d1H8h07D>a`G`A0<010000>\kRl0;dWD<a`G`A0<00`000>\YRlZ;
+f8eEi8_1j0hc~22l2;`gDEJP0cbHeEi8?\3>QUJ000Pl@@RDGhRdGhPl@PFfB?1@00~2Pl@4GL<0
+~;EFRHg`40I?le~4RnaTRBd0~3Dh?\68UEn0_BMAg71O140`0<~3PlSoPl@HFfB?1@00~2Pl@4
+GL?7AO@1~3RdghmT480W@Fa`G`A0<020000<M5m?oooooYC00008]=n8]9>8?Q3WDEa`G`A0<0
+:0000<M5m?ooooo[;X_0RdghPWTJ0GDSRdT8Pn41MA?71O140`0Y~3adGdooooon\8RdghRe5<
+RA63OOCoM@j;COR2B@P2jM40~2Rl28AO>;GOR3Nd033hB@~3Rd\<>D\43i?22]9d:X]CC8_3j04^
+~2>d<<M0c7AOCooooojIL0~2RdGhReQ<RAS7@0@0~3Reghod<4R`^=D@694hYElhPAPg]00Pn5
+G@00089ml`X?QE<0~2Rd\4Re=<Rl?X[Rd003]317@=adGdooooonU4~3o8]5n8]HC8THad04~4
+jb>=@02i0@0008eElh]5n>PdM`00RDGd2l1e2LM5m?ooooo[3h]5n<I06P8c`8Y5lhU5m8]5m8?4
+65]TS`D0~3Pl@4GL<0~=EFRHg`40I?le~4RnaTRBd0~3DeIGPn`DRedLREg`2m]e7\L5l4@300`0
+~2<l23a1AOGU]TS`D0~3Pl@4GL<;dW@42lUe53?0Pl@DGeiKI8l5~4Pl@4GL?7AN`0~3Reg`mT<8
+0W@@a`G`A0<020000>Uo~3o8]Ml8]k>8?W2GDEa`G`A0<07P00089;20;YH00008_0Reg`PW\J
+0WDCa`G`A0<07000089;20;[AHe008]Ml8=k@0=d7h_jRo6C3jo?Rm?XF04008_><m;gmh_GThUM
+k>\LRl2;fPn_bh_@RdG`j2d0~2Rl\cd_OaRm69ANb3ON`0MPN;AO36@1X1RdG\Pl@DGeiKI8l5
+~4Pl@4GL=ERnaCEUN3k229A@R9E@b9CA37AO00~3adG\~4PgP@07@[<oJ;F11;REP@RU`H68PJ
+AT8klGD:RlJ3a21OGU_9`h=h401egHUE38Uel8]el3Ue40n6Y00008]mj8]E38]Mk8]528e0089h
+=@0?QE80~2Rdd@:lj1n@0P~2L`F;nN\6o;l08000REGPREgTRmR;ch]C?8MMi>RbL@00ReGPRlR;
+AN@;bGA@RmZCRDGTRl?X4AL008]Ei8_8Rl>;fN\[Rl2;fY>;CA0[cXU5h8_3j7Ya~2ReGPRlR;
+`h_I2lUe2X_6Pl@PGeiKbL<3d`?c>gD@3h9^ooooRGG`RdG`Pl@PGeiKbL=ERnaCEUN3k229A@R9
+E@b9CA37AO00~3PgP@07@^<oJ=@02;F11;REP@RU`H68PJAT8klGD:RlJ3a21OGU_9`h=h401e
+gHUE38Uel8]ml3Um40n6`P0008]Mk8]ej8]528_0PgP400n5F00008]@387j020007<7Rm[[28e0
+0;\08000RGgTRoR;bh]G?8Mmi>RaL000Rm2;AN@;dPn4M00008UMi8_JTh_8Re=<Rl>7GNCX1aH0
+08_8RdGTRDP4RdQ<R@R;D0B;CA0[cc_:MPJ;l^\7Rl2;MA0[mhUMh8_>Ra29ANB;G@b;`hMMh>RT
+1@00Z@00E02;CN2;ANB;40?FRA03cXU=32U`10?n>gd@3h9<ooooRGg`RdG`Pl@PGeiKbL<0~=
+EFRHg`40I?le~4Rnb3k0QTRBd0~32l0?Q6X0~2SDS`RDglIX5i3]FU3hEH~3I\M13P00PWT<478I
+DK01j000~2Pl@4RnETS`D0~3Pl@4GL>;COb2B@dP<l2:@@b9AOS7@@@0~3P64:06J1H@P008]5
+n8\DQOA40`294HT<QOA40`2;iFB?1@00~2Pl@4GL<0~>EFRHg`40I?le~4Rnb3k1ATRBd0~3DeIG
+2l1e4c?0GeiKRnETS`D0~3Pl@4GL>;d8_j<l23bOob[X_2mm59RDglRafd:P<0REgdadGh~4Pg\\
+00n6E@0003?BRl2;n8U5k8]=o8_g<l3b[XU5l2_nRln;@cB=?9D0~3R`@hRoR7AO0c`?>VM0DK
+`8?Hoh]mk8]=l9L;ogD9RgglPS`i?G@8@X_:>d\\L[:9EOR;GOB;COPkBbac8h]K=8]=n<7Q0X\4
+2h]Mo0?3@5mNFh_UI8l5~4Pl@4GL<c`5mNFh_UI8l5~4Pl@4GL<0~=EH_\Dh?\38\=]2X308^9
+U04008\I2m]m1oOKja6=@02;7K@Z0`2;Vi@1~2Ra^1nj05~2OPj;3K@Z0`2;BA3[7He008\M]2X3
+08^KU04008\;SAb=~4`N46:l^9COB;7JQ30`29GOP;fgDVRmRh90000>P^0@00RDGh2l2;`gD8
+<l23a0aKbL>;GOR97JQ30`1Z0FX1RdgdReGhPn`<j:X?~2Pl@PFlW3~<EH_\Pn`<DeIGRDD8RED<
+RDd@<m^:F@f;nh?W7hUmo8eJoc_H3hbS~3RgGhSD00Rm6=B`Fn0@0003?0PoTO3io0B2?`dnJ;
+bP?aRT4;R4H;Po\7O229COB=BoVh0@0003?BPoTO3io2BR?2ReGddn2;bPQ12hQN38\4WOA40`29
+1XTdWOA40`2:D@f0h^2:APdT7`[2R4H=adH4~4P6H:06J1IPP004N:APdTh2Go~30lN8APeVadH>
+~2Bc]M20n=I_ooohUmo8]548YH3H3Sh87So`0000=Mo8QH3H]M28QH35mNFlW3SD00EFRHg`40
+I?le~4RnaTRBd0~3DeN3k2@;`7@5PoS_MQ<c`8?495mKI8l5~4Pl@4GL>;f8ek48_7j;5>~2PnP4
+RmOgfR?G>mL?U<:1h_l0~2:l:9AO2;`cg`o`l03hIH~3JQ=GSDgdDK03j000~2Pl@<2l2;`g@C
+<l23a2AOFfB?1@00~2Pl@4GL>;GOAVad<>eJF;GO2;OOB8G`b;GOB90h]5m8?048?495mKI8l5
+~4Pl@4GL>;GO2=79gdA0<0R`\;bG@?RDgdR`V92nWi~3SD00Rdg`@HU=k8?i47dOPcb=m4@3~2
+MAF;`463nA1m2X<lSOA40`00M?29CNb;ENb3nQ1d;H_hS@bEm4@308\IREgdR`>90LL3~4Rdgd
+RdG`j=[moon9AOB;anVF~3adGX~4Rdg`Pl45^`40~2<m:3nAl?Wl9:8m[ChhUMh87k~20@1c4\M5
+i0000@37ANP1~3j`R;`8]Mh8UMi8_hJQ?oMNB=GOAC\0?X~4Pl@<2l2;ag@C<l23a2AOFfB?1@00
+~2Pl@4GL>3ONP0M22;n8]Mm<L3~4Rdgd^P\0~2RdG`j3omoon9AOB;ah]Mm6K7@`kEYH]Ml8]m
+m8QO38]Mm8T3RdGdPl0@Pl@TGe]TS`D0~3Pl@4GL<0~;EH_\EUN7dH_aRoR;b\7Y0_>URlZ3h@?c
+Y8_::oV;aemNbL<0~<EFRHg`40I?le~4RnaTRBd0~3DeIGPn`PRDD@2l1e5H?8oh?485mNFfB?
+1@00~2Pl@4GL>;CA29CNR:0C`mM18:`7@>@HX1?3ed10[0MOF9CNR;CNP[CA2;7K@Z0`29GO37
+AN`0~3Pg\\00n6E@0003?BRl6;OA29AN2;mc?0lZj9AM`[oX_?Rd<dSCbE~4R`@hRoR7AM`c`?>V
+M0DK`8?Hoh]mg8]=h9L;ogD;RP@8?3ed30[0M0Q2Rl8k@bab\8UEk8]Ml8]Ek3]C;0n3C`0008]c
+=8]Ek<7R0X\l5S?0PlWolZkgdDV;Lc0[lHUeh8]e48_n<l23bOob[X]5h?OAB@?1RD<`Re\dRC@C
+<l23a21OGU]TS`D0~3Pl@4GL>;GO2;Dbbi3`0002?:MD:3`Q71hP:;@cCX7V@008U5i0_0MAo7
+1O140`0=~3PlSoPl@PGeiKI8l5~4Pl@4GL>;GO2;ANB9@cBS544308]Ml8]c;8eF0HUC;<7V0X]C
+=8]m48Tl<X]c;<7V0X]C=<L4<P00~2<l23bOob[_OABD41Bc0c`8?485mNFfB?1@00~2Pl@4GL<0
+~;j@00~2Qm^@j@00~5EH_\DeIGRlZ;d8_iRoLc`8?9oo:^Ro[gdH_IPlWolZi?Rl_1j@;cYH_;
+Pn43ljB;`UmNFlW3~>EH_\EUN;bX_@RoTc`8?9oo:^mm4[nH_bljId1A_0PmSoGek9``00~=EH_\
+EUN;bX_@RoV;mc?0PlWolZkgdH_1Ro[1j@;cYH_8Pn43lj@[n8_7Gek9``00~<EH_\Pn`8RDD8
+<m:=A@SXbB`008?42<W3~<EH_\Eh_h<l23bOob[_OABH_1GlW3~?EH_\DeIGRoZ;d8_g<\3b[X_2
+:oj;eh_hRmn3bOlb`?:^Rl=?Rl[1j@;cYH_:Pn43ljC61`1OGU_9``00~<EH_\EUN;nX_@RoLc
+`?:^DB_nRln;nX_1`NT2ljF;b8?Q0o>TFC?0ljZ;`UmNbL<0~<EH_\Dh?\=8_HSDg<DK01j000
+~2Pl@4<lV:CLj9CMPcbHY=cHU=g3?9RTg<RDgP<lV:CM29CN@cbHY=dDV9CNPcbFJ;CM:1jF`7
+~2RDg\adGh100000_KM1:=AMSX3TT008_;R@63a3AKbL>=AMSXo4P008?4=5_9``00~<EH_\Pn`<
+DeIGRED<RDd@RDGl2lUd@H8h;7DeSG01RGGlRagl@`<0<m::5S?0IX\4DoK027@QRl16<lV:3S?0
+IX\4BoK027G`RGGlj`Z=@00c`5mNFlW3adGd~4RdGlPSP]M@k7AO@1~3@8U5o>\=o8]5o88h:gD4
+@8U5o<M5n000~2Rcgl@`<0RgGl<lV:3S?0IX\4CoK00W@[<m^=@02;`c?KRQj3jc03`8d4P0?H
+AS?9RPhc`6J;14of`09eh8UMn8Ueo8]M38]=o8T;Pggd07@8RdGhmmS[1?b;AOQOGU_9`eF;k5=F
+Eh?\>;RH<0<0j37foon9ANb9AO0;`7@5PSP0MEVQ]2X308^0U04008?018\=W30308T8XK@Z0`2;
+P9@1~2a`0\0@00XK@Z0`2;P9@1~2Pl0\R`fP<0<0R@S71L0[0`1@AP00a`Fl:`<00@0008?4>5mN
+FlW3ReG\RoXc`8?9oo:^Qm7gdTZ3nP<?P\L3~2RaFd:P<0RkZD0@00PlL4Ro5VYJB;5K@Z0`2;
+TY@1~2aT87088i07@LSE41REG\PSX0M16=D@:9ENb2>P1d1X?10hU=k8]5k88h07DlXK@Z0`2;
+P9@1~2a`00~3XK@Z0`2;P9@1~2aT0\0<L5`2\3~5a`Fl:`<0~4Pl@hGeiKbL<cbHeEl8]5k>S]
+oOooRDG8R`fd:P<0RhVD0@00RdG8JM0l~3RA6;CO29CNb2>@1e=8\=]2X308^9U0400<I1;031
+h0B=1<2=342=3<R93L0[0`371K`[0`00~3Pl@hGeiKbL>Q]2X308^hU04008?7;8]Ek8_bIZFT
+XK@Z0`2;P9@1~2aT0_08]Mb<7S18dLfhd4Fhd4`j?0:`<0a`Fl:`<00@00088j07@C<lV;`491
+PSX0M0F3n@=lm8UEk8]5k88h00n4L@800;T1~3SEG`j23moon9ALR;GLR3n`4?S5D2~2Po\<3hm<
+0P00RdG`RDG\^@40~2SEG`j?Gloon9ALb;AO0kAN`?Q2X2~2Reg<Po_l3h`N0P00Po\43hlE0P00
+RDG\^@40~2SEG`j<7loon9AM2;GN`iGO0?Q?H1~2Pgg<07DEReg@Po\13hcT0@00Po\O3hoK0@00
+Pgg<07@DRdG@2l0?S<X1~2PoP63ho10@00RdG`RDG\^@40~2SEG`j6[loon9AMB;AO0kAN`?Q9l1
+~2RDG\^@40~2SEG`j4_loon9AMR;GMR3n`4?S801~2Po\<3hmg0@00RdG`RDG\^@40~2SEG`j23l
+oon9AMb;AO0kAN`?Q5D1~2RegLPo_l3ha90@00Po\43hm00@00RDG\^@40~2SEG`j>ckoon9AN2;
+GN`iGO0?Q241~2PggL07DERegPPo\13h`?0@00Po\O3hl60@00PggL07@DRdGP2l0?S?D0~2PoP6
+3ho\~3RdG`RDG\^@40~2SEG`j9Gkoon9ANB;AO0kAN`?Q<X0~2RDG\^@40~2SEG`j7Kkoon9ANR;
+GO0kGN`?Q:\0~2PS\03hFR~3Rafd:P<0Ri^D0@00Rdg8RD\8Rdg<Rafd:P<0Ri^D0@00RD\@Rdg@
+Rafd:P<0Ri^D0@00RD\HRdgDRafd:P<0Ri^D0@00RD\PRdgHRafd:P<0Ri^D0@00RD\<RdgLRafd
+:P<0Ri^D0@00RD\DRdgPRafd:P<0Ri^D0@00RD\LRdgTRafd:P<0Ri^D0@00RD\TRdgXRafd:P<0
+Ri^D0@00RD\XPl@hGeiKbL<0~;EH_\DeLk`WhK>lQo2c_:O0Lcfn\8SD00^`40~2Ro_[5he003_8
+OP`kbWd8^`40~2j`?l<m^;n`_oMCHkb7DGRafd:P<0Rk^D0@00RelX0elP>edDOQ\kbWDPRafd
+:P<0Rk^D0@00RelT:elX>edDOPVh0P0005mKbL<kb7DVRafd:P<0Rh>D0@00RePPRgdD>mmo40=H
+:3_OOPVh0@0005mKbL<kbWDaXK@Z0`2;^9@1~2RdLTRedD>l=n72]7:3_3OaF3OAP0M0Vh0`00
+0>\4Rl0c`5mKbL<c`5mKbL=ERnb3k0QCEUL;bG@CRafd:P<0Ri^D0@00Re\8ja6;`8\M]2X308^K
+U04008]K38UMo0_9M1:;?K@Z0`2;_i@1~2Rgl@ja3lRafd:P<0Ri^D0@00Rg\DRGgh2lUd4X\M
+]2X308^KU04008]K6>\@o8\M]2X308^KU04008]K78_hRdglR`b:RdDD0l63`0Fn1`0009WgoX_7
+0l\[bX]Mn?OKBhdlg@00~2:o\[cdV925mNFlW3Rl1ERnb3k0QCEUL;bG@CRafd:P<0Ri^D0@00
+Re\8ja6;`8\M]2X308^KU04008]K38UMo0_9M1:;?K@Z0`2;_i@1~2Rgl@ja3lRafd:P<0Ri^D
+0@00Rg\DRGgh2lUd4X\M]2X308^KU04008]K6>\@o8\M]2X308^KU04008]K78_8RgglRgbjo4N;
+AA@3ah?01Kh7~3VOOnmmZ3`PNn1`0008_2VOOnRl6;MOQ>S@ce~4:lh3b`?:0lm9R@QOGU_9`he0
+05F;k5>9E@b9CA2;5K@Z0`2;TY@1~2PgX@07D@ReX8Re8H0eBIo4Z94>]7o8\M]2X308^KU040
+08=k401n7X_HogDD^@40~2ReD@Pn`<j>Gnoon;`h?44>\HRl3oMABi0@0008]E48?\3>PAo_oo
+Pl@@XK@Z0`2;V9@1~2Pg\D07DFRdD@Rd\<Re\L0eb8o4^;A@b965_9`j6d:P<0Rh2D0@00PgPD
+07h?ReD@RdD<<lUKbNUoo_ooReD@RdD<<lUKbNVhoOooEH_\Pn`TDeIGRED<2l1d1H<hogD7<l1O
+GU_9`h\@:m69EOP;dWd7<l1OGU_9`h]=n8_1^h1A0@2Imo^;f8fk:eh008Umk8d4_@00~2_[D5
+~2VOOnRo29MNQ8VHOjUX?W0`?g`Oh2JOQ]0@000oj9OM`[edZ9EOC1h`N=7=^=5=^=59>=55<[
+bXU=o9Tc`R_2Pn03<l8[`WD:^=P`0`3[28e00;RT<0<0RDG`PgdD00n4kP0008\M]2X308^KU040
+089k;01e48]M3<M38?oooooYe`000?coMMb;CO2=EN2=ANB3k0cXC?kooh]M60_K3iC1PN7o~3
+DOmeo8]=m8]Eh8]5i8?\3>S9noooPl@TRdd<RD4P2m]e2H?h0@n5R@0008]M38=k800?SW`0~2
+Rafd:P<0Ri^D0@00RdGl0d<X^h1A0@2Imo\;`7i0odG\PGgdK@4007D8odGX<l3[2?b;AOA0RDGd
+RDGdRafd:P<0Ri^D0@00RdGl0d<X^h1A0@2Imo^9EOc[8He00:6d:P<0Rh2D0@00Rd0X0DGlj`_l
+RdD<ad0P~4RdGXPl04ReD<RD8DRegdREXLad8@~4RgG`PlH4RGG`>Aio3Om248?613TNO_J9MO2;
+CO23j@B9CO2;M@b;GQ`[6D>9GPb;ANb3`0Fk1`0009WgnhUF68]mo8_7^a0>~2VOOkRlZ;f8UN
+28d4W@00~2`N<6:mR;akll~3VOOo:l>9APBk?00008_1VOOkRlJ945mNFlW3~?EH_\3j\@^000
+~23i;0bL>@~3EH_\Dh?\38U528UE3<M5n000~2PgQ00g@ORdQ4Pn41MAN2N1X2MA7XRa<008?h
+0GD7adGhoooooh=mn00?QK00~2Rdd8<l2:@CD;`7@ePoP1M0SYR`0008e008]528]8A8?Q0GD=
+Rd0PodP8jH40~2Rl2;A@R;@23X\GX00>U_~3Red8og<P\07X~4Pl@4RDGh2l1e6_I3A05d;omc
+<;01j000~2Pl@4RDGh2l1d6h]5289820;71O140`0l~3RdGhXl1<0`3[8h]=2?ma?;01j000~2
+Pl@4ja6;`;[k~3^0`a0`3X0GD008=mn01e3h]E38]52>RDK000j`V;`<M5n?oooon;AOR3a0aK
+bL<0~;EH_\DeIGPn`XRDD8RED<RDd@mT080W@Aad04~4<l23a2QOGU_9`h]528]`?8Uel8]m38Um
+k89h=01e6h]548_@Rl[1j@;cYH_:Pn43ljB3a2QOGU_9`h]548?h0GHSRdg`PW`1o`d?QGd0~2
+B8U548]526K7@3H=0>U[~3SD00Reg`RP^;MNb83X8k3@n5B00008\=l4@308U=j;T1~3Rm>;O@R;
+anSGF@00PoP1MAZ:2h;i2W@;IX7Qo`1VRDlfjaN;ANc600[[3h]5j:?`A0<0RdD8PV08o[P1~3
+Pl@XGeiKbL>;GO29GNBh3@0008]e28_k:ghlReD@RlX[ch]mi0_TlZj=Oomd0S?oRlZ;aP_o3hBh
+~3RmN;MNb=@022NP4:MCZ9AMR;aXU=g9>;l8_kREgPRmX[f8_3RlS1j@;cYH_8RdGHPn43ljB;
+CMb;MN03llH62TJ=FP;[=X_0Roj9CMb7nhU5h8_::lm1RoN;nh_1RDgH`NT2ljF;b8]5h8?Q0o>T
+RdgLRggHRo>=FP43mhUeh8_iRm29GMbh3@0008_c:g8lQggL:lj;MN0;i?:^SGooM08coh]=g8_2
+RmL;o`n5E_ooohUek8UMl8]El8]Mk8_bRo^;A@P[D3b;AA0[`X_@Rl[1j@;cYH_:Pn43lj@[G@`3
+`h?4:5mNFlW3~2EH_\Pn`8RlZImoV9AOR9EOb;A@R;COR928]=o8U81<W3~?EH_\DeIGPNb8~3
+RDD8RDd@2lUd20_0MA8;dWD>PlSoPLB8~3GeiKbL<;dWDNPgd80GDHa`G`A0<0300008?8oh74
+R00005mNFlW3RdD8RDF@2l1e3<M5c=BP0@29EIC[?H_J^?01~2j1c[oon;dhU5W0_0MAO71O14
+0`0=~3adGPooooonWo2000o8UEU<M5X000~2adG<e:410<M5h000~2PgdH00nD`8Q5YX]m]8]=
+48_GRmV;nc?0PlWolZkgdB_i^2D0~2lZj=Oomd0S?oRl^7ehUE`0_B3h@V2000JR1Z02_CDU>=
+EI1B\0GoELb;bh?458?hnWD;megPj@<8~2SD00RmV;CL2;AN03`B_3RDGP@LM5f000~2^`40~2
+<oJ;`8_A@C?0RP:3j223n10?QhT0~2obB5P9P108_0g9P1~2V@4009T10>RH0@00V@4009T1~2
+V@4009T1~2V@4009T1~2V@40d9P1~2V@40a9P1~2V@4009T10?BH0@2;aX;80H_`jcJ=@02;aX;8
+0X_`jbZ=@02;aX;818_`jaj=@02;aX;828_`ja:=@02;aX;848_`j`J=@00cfdT;f`n5FOoooh_F
+REGHPSTZMB>;AAB=F0B9GAB;08U5e0_0O@f2bP6;lXUef?OHRDGD@N\do<M5e000~2Ragl@`<0
+<oKl<m::4FJ;15>3h09d4h_6Ro:3kS03`8d4P0?`@N_RRl29MMB2>Bid3<M5g?oooooYD`0008_a
+@H8i:WDHRlj;AAB=F0B9GAB;08U5g8?10^\fSD00adGL~4Ragl@`<0<oKl<m::4FJ;15>3h09d
+4h_6Ro:3kS03`8d4P0?`@N_RRl29MMb:0CaXM0PlK7@4?4ae2hX1R4FW@N\7SD00aTFW83?0RP63
+n2D?Q><0~2PnQ5PoPc3hLO1P00obB539X10<bK0@3<V`40c9\102BP0@0TX0409:0102BP0@0T
+X0409:0102BP0@0TX0409:0102BP0@0TX0409:0102BP0@0TX0409:0102BP0@1dW0409:0102BP
+0@0TX0409:0102BP0@0TX0409:0102BP0@0TX0409:010?bJ0@1dW040c9\10<bK0@3<V`409:01
+07BL0@0TX0409:0102BP0@0TX04019l107BL0@1dW0409:0102BP0@0lW`409:0107BL0@0TX040
+9:0107BL0@2;fFXPJP1Z0E>=AI1@\0GoELb;bh?458U5j>Ta1@00o89mYf`?QGH0~2RmV;AAB=
+D0B9EAAVRa2=AJ[Xf7T008_;RDGXPoSoM@k7ANP0~3jOX4~2Rl2;AM@[ANR9AM0;`7l;adG@~4
+j`^;`?I5f05d0oMMd8_IJR3oMM2;ANQ@SDFZD8e5T52`1OmEc8_;Pl@DRDGXjK84~2Rl2;AAB=
+F0B9GAB;08Q5ZX]5e4R9AM0;`7d;adG@~4j`^;`?I5f05d0oMMd8_IJR3oMM1Z0He5ZU2=AI1@
+\0GoELb;bh?458U5j>UP1000PSU6MA>2OJH0M0g7ANP0~3BNU81000RP68AJ^;ALb9AIR:AJN8
+AJZ2OJY<MBF;GAB=@a29AAB;0hV5M?oooh]318V5N?oooh]328V5O?ooon\DRedDSD<8RDDDR`>9
+ANb;@`B9AO22OJM<M@Z=QGCoooo[1H_0SDG\RmWoMAR=EJYBogGLogGDRdgHSEF@Pn`<j7Ai~2
+Rl^3a1b9ANSY^`<008e0089mYfQe5X8iL7@ARdDDSEP4REdD3kl0RDGTj`j;AAB=F0B9GAB;08U5
+i8=mg01m3<M5g040~2jan=@023OM`0MA:3ON@0M@c7ANP0~3jF@3~2PVGHkh8iL7D;aTFZK<I5
+ZeS[3?b:AJN8AJZ:0HQ5ZhemShUm[89mZfme2LM5^0P0~2ja^:AJ\lN7@4?5Qe2LM5^100~2j`O7
+AKP:~3adG8~4RTF[?6Ad23aY3hE0~3RdGT2l1m5<I5Z2g7ALP1~3mmR9ANC[9h_0mTGH0W@>aTFX
+:lM5b040~2ja;lmTGH17@;aTFX8<M5b040~2PWf[F7D9^;@d0`3[1h_0^<Pd0`29AK22OJYXM@eV
+RegTPN?oo`00REgTRgGT2oId9X]E\8]M^8U=4?a?RlJ;lS?Bmo>7lXX<<XP?Ro0;`7GZRGGTRdd@
+SEf?:mn9GKb;AM`[`hU5i0_0OPC[18_0<l29ALCfAMP83h@i~3Pgfl07HcPWf[KgDARmR3n`5c
+9\M5a040~2jaglRTF[?7Qd13aHMA76AJP`RTF[R4FYadG80P0008]5e2]5_2]5b2]5a8U5i0_0
+ORGfAMP1M0Ogf8U5i>\OmTGH47@IRdGT0DG4adGT~4j`Z=@037AN@0~3RdGT2l1n0^\2<l2;fFXP
+D?meb8eEZ5:=EI1B\0F;MLcoeX_;RmJ3a1B9ANR3n?Yd6VX`RdG4D?me_5N=AI1@\0GodX_;Pl@D
+RDGXPggXnW@XRdGT2l1m1N\5SD00<l2;fFXPD6X0JP2=EI1B\0GoELb;bh?458U5j8=mj?X?Q4H1
+~2RdGTVC?2:l:;GL@3GK`3GLP3f8UMj>T[0@00SD00PWfWJ7DFRdDDSEP4REdDR`2;GN1VRAS[
+4he008]558eH18UM58\0RegPRAS7ANP0~3jO00~2RdDDSEP4REdDR`29AL0;`7DZadGXn_oooh=m
+X00?Q<d0~2RmV=AI1@\07X408008_;Pl@4jKH0~2Rl22OJM\MBj;fH]5c8U5V?meg?mee?mef8e5
+T53oML2`1NRW1000Rl^3a1B9ANSYPP0008_0RoN;fH]m`3?0PlWolZj7fH_nmm=;REgXPggL07d6
+REgLja?lRdGX>dGLO@C[1H_0RdGLRDGXRdGD:dGXRDG@2l1m2LM5d000~2j`WfAMP1M0?gGM2;
+fFXPogG@RdGXD?me`8e5T52`1OmEc8_;Pl@DRDGXj`Z;`<M5j000~2BH=mj?Ye1_MMh>\=o46;
+ANP1AN3Y[?OoohUm]8U=48]Mh0_K3haS~3ReD@RoXc`8?9oo:^mm59RDgXJR1Z055BSEF@D[05
+oeG<Pl@DPoSjM@[gfhUMh>\cSD00RdGX0DGPPgd807D8RdFDaP00jab3OJ00M1J=CI1A\07Xc`00
+08?418?hnWD3megPPgd807@8RdFLj:[Noon;AN21a8P0~2GeiKbL=ERnaCEUN;MA@;mWh^<l2:
+AAR:h8_8`N4@2l6;E@R;NPB;gX_;`NT2lj^;bh?Q0o>ZRlj;@P@3`HU218]E40_BMR6;A@R;N0B;
+M@b;fX_;`NT2ljF;bh?Q0o>TReP40mZ9F0B;MA@;mWdammj9MA@c`8Y568[PRmS1ha0;`h]M28]k
+18_FRl[1j@;cZh_:Pn43ljZ;D`@3eXUC18]550=545mNFlW3Rl1ERnb3k0b;A@R3>05e7H]848]@
+18]03>PhGP00PoSoMBJhn_oooh?43<W3Rdd8Re4@Rd4<j6Md~22l1d2[SjooooPl@<bL>;C@S7
+@A00~3<l23a0c9`eF;k8?\55=FElM5o000~2RgD8Reh@mm^1`o01~2REghRgdD2ol?SZh0~2RGgl
+RUDHRl0kn`n<H00008Uml0nf`XUEm8[PRlS1hA0;`H]n38]>48Uek0?iRm>;lX_>`NT2lj^;cX]e
+k8?Q0o>ZRgg`0EH@E[01j2cooon;EOB3a0B3n?Ye2LM5o?[oooo[32_k^o01~2ji^=@028EAR9
+OAB9GOPc`8Y568[PRlS1hA0;`H]e28]n38]>40?iReDDRmZ;bl7Y0_>[Rl^3h@?cZP5F48]e52Ue
+n8]E40_B3hJh~3RdGlPoSj3hB\~30l:9AOb;O@b;MOR;G@SlRlHk`Pn7GP0008Uek8_?REG`Rg\<
+Re<@0oZ;lHU=m8_@Rl[1j@;cYH_:ReG\Pn43ljB;OOB;lP5345>`0NQVo_ooReG`Pl@4PoSjM@_7
+AOcjooooja:;`8_6:m03o[k`0@00ji^=@029EA29O@b9MOR;A@R;N0b;F103nh]e38]M48_CRl[1
+j@;cYH_:Pn43lj@1F12;AOP[`hU5n8]m50_o3hfm~3RdGlPoSj3hBa~3mmn9OA@3ahU5o8YE68]M
+n8]e2?`kn`n<H00008Uml0nf`XUEk8[PRlS1hA0;`H]n38]>48Uem0?iRm>;lX_>`NT2lj^;cX]e
+m8?Q0o>ZRgg`0EH@E[01j9Smoon;ENb3a0B3n?Ye2LM5o?[oooo[32_k^o01~2ji^=@028EAR9
+OA@c`8Y568[PRlS1hA0;`H]e28]n38]>40?iReDDRmZ;bl7Y0_>[Rl^3h@?cZP5F48]5o5mNFlW3
+SD00EH_\DeIGPn`PPgdH00n==`0008]=28U=j6J3>@1d3Ob3`@9VPcT0MON9CNR;ANP[A@RIPn81
+0l;An8U568]=48?Q27D5dN29AAR3OAP0MB2;C@b;D@QZ8?me56X0ogD8DK05om:3a1B9AO3Y>P40
+0?I540P?Q9H0~2RdDHdN3Xo=goohU5k0_0MAW7AO3jooooa`G`A0<03@000>Vi~3SD00Reg\REgP
+RgD8RGGXRgdH2ol?Q3d0~2IX<n07@gRdg`IX\FRl?XhVl008_8PoSoM@Nin_ooon\@0mU?PlH2
+2omd1VJ3?P1ef8U=l8Um68UMh8Uej8=ml?X?Q5P0~2RdGP:dG\RDG`jDX0~2RdDHj6SMoon9AN`;
+`7DEadG`n_ooolL5l4@300d0~2jbR;`8]M68_3j4;Moon;bhU5k8]E2>SUK@00RDG`PoSoM@O7
+AO3jooooReg`Po_j3h@l~3RdDD:l>9AN@;`7d:adGT~4j`[lmTD@0G@3megTRdd<Rg48JR3oMNB;
+EO1BogG\DK05omJ3a1B9AO2;ANcXP]Wooh]5l8?485mNFlW3~?EH_\Pn`8^Qh0~2XK@Z0`23`2CX
+Y>goo`_03hG:~3R`fd:P<0mT4T0Pn5^P000>S7~3XJ`Z0`3XWL_ooj6`:P<0j9?;oon;3K0Z0`2;
+BC`;bG@;DK01j000~2Pl@4R`fX:P<0RdTl2lUd2e6`0NP0~3Pl@4R`f\:P<0RdTl2lUd2e6`0NP0
+~3Pl@4<m:QZ2X30>S;FP00<m:Q[2X30>RoFP00<m:Q\2X30>RcFP00R`fd:P<0Rd4dj:GHoonQ
+o4<308?X0^RHf?ooR`fd:P<0Rh5H0@00j8OHoon3a0S9jNiN~2Pl@8bL<0~<EFRHg`40I?le~4
+RnaTRBd0~3Pn`DadGl~4XK@Z0`2;P;01~2RDGh2l1d?8_0RdGhRdPTRDgdRdQ4Pn4PMAlcd^R8
+k?oo2l1e2?m5o>\?SD00adGlooooon\=SD00RdGdRDGh2l1eaX]5o8?456B?1@00~2Pl@4GL<0
+~;EH_\DeIGPn`DRDD8mT080W@Ga`G`A0<020000;P1~3Pl@DGeiKbL>;C@R2NAX0M@k6@AX4<l23
+a1AOGU_9`h]=28=i@0=e5LM14000~2aT4J13?0Pl@DGeiKbL>;A@R;B0B9CO1VPgPfog@:@HU=
+l6K7@3Kooh]e289n6P4?QLl0~2adH@~4ReG`2m8?Q:L0~2RdI49H00~23hFI~3PWhd0@n5C000
+08\n^0X0~2Rdh42nCb[Xeoog@2<on;aP_oM36;mh_>Ro12@H_i^0X0~2RmT[7X]>12_;2nCb[Xeo
+og@2<on;aX_g2omeehUEl8U528e=k55Z0H]=l?OIDH]=2?ma8;04j000~2Pl@@2l1d7<L5l4@3
+03`0~2Xl1<0`2h0@0008?455mNFlW3RdD8PV15kh]528]HC8THad04~4jDH0~2Rl2;G@R2NaX2
+MC^;OO2;ch]CC8_3j4`0~2>lMd6LM31000~2Rd]<R@^h0@0008?455mNFlW3RdD8ad04~4ReQ<
+RAR;G@S6@aX4<l23a1AOGU_9``00~=EH_\Pn`XDeIGRDD8RmR9E@b9CA37AM`0~3adGl~4adG\
+~4mT<h17@hSD=8D6X2JP3oLb2`1>P0~3Pl@@RDGX2l1d7<L5l4@303`0~2Xl1<0`2;`h98208c
+`5mNFlW3Red8PW\d0@n53P<008]538U5n8]548U5l<M5m00P~2Re\lREgT2l0?QW\2~2SD00Regh
+Ro^h2P0008]=l0_TlZj=Oomd0S?o2ol?Q2P2~2:o^9ON0kOOAc1X_7j`F;`8]5m8_@ReghRdGT
+Ro>9GMR;n8_JRl_1j@;cYH_;RegHPn43ljB;nh_b0oj9OOP3aXU5i8]Mm2_NREgdReG`:mJ9EO0Y
+MN2;CN`3cXU=k8?k0Pn2\@0006J;=B0a0`1VRC17RGgh@HU=k8?00XU5i4Z9EO23j`:9GOCoAM`;
+f`n5^P4008eMo5=X020008]M2?mc??mc8;04j000~2Pl@@RDGXPGgl020007D42l1d>h]M289;
+20;71O140`0l~3RdGX2l1d1>\7Rl2h7@000:?0C0<0RegLmm^1``0P~2RdG\:l=OGU_9`lM5g000
+~2RdD8Rd0lRDGTadGd02000>Tg0@00o8e=o56;GOCgfh73020005>;C@SoLCcoLB2`1>P0~3Pl@@
+RDGX>eglM@@;`7@oRed8PT\80\L5l4@303`0~2RdGX2l1d1N\8SD00^1d0~2Xl1<0`2;GOCgfh73
+020008]5g0=5k2_3GeiKbL>;GN0;f`n6I@0008e=o55CogGhRdd8og4P\0CX~4Pl@@RDGX>Egl
+M@@;`7@]Red8PT\80\L5l4@303`0~2RdGX2l1d0n\6o;PM~3Xl1<0`2;ANaOGU_9`h]5o2U5h2U5
+l8]Mn0?HREgh0DG\RdD8Rd0lIX\M8c4306J96?m5n8?00XU5i?m5k?m=l<M5m?hO~2adGL0@00
+0>\YSD00RgGhRggTRdG`RmR;bl7Y0_>URl^3h@?cY055k2U5m<M5l000~2Pgg`00n7R?goohe=
+o56;GOCgfh73020005>;C@SoLCcoLB2`1>P0~3Pl@@RDGX>eglM@P;`0n4T@0008]M289;20;7
+1O140`0l~3RdGX2l1d1N\8SD00^1d0~2Xl1<0`2;GOCgfh73020008]5g0=5k2_3GeiKbL>=COaA
+Red@Dome38]=2?ma8;04j000~2Pl@@RDGX>EglM@@;`7@URed8PT\80\L5l4@303`0~2RdGX2l1d
+0n\6o;PM~3Xl1<0`2;AOb9ANb;ANaOGU_9``00~:EH_\Dh?\78U528UE3<M5l000~2adG\0@00
+0<H20LI20@?7@PP0~3ad8<01000<M21000~2ad8@3P0008\=o4<303?KRQPcdVJ;55Wf`PQd5?a0
+<m::43?KIX\LDOK327G`RDD8Red8<l2:0h?XHH?h5Pn7RP000?lTQKB]0@2=@00X[P40=:h103B^
+0@0d[P40=:h103B^0@0d[P40=:h103B^0@0d[P40=:h103B^0@0d[P40=:h103B^0@0d[P40=:h1
+012^0@0d[P40=:h103B^0@0d[P407:h108]53898107[8he008]5389810;[5he008]5389810C[
+2he00>TI1P00SD00Red8@hUM23?0RP>3n2]d38?hHW@WjD80~2Rl2;G@b2B`@8RdD8SDP1RDd8
+PSURMB_60`23`0:9A@S[88]M3<H308]528e80HU=288i:gD<PT\428?00XU52>\0RdD8PSP03hBP
+1@00R`gl@`<0RdD8<m::43?KIX\LDOK327@H@3?BRQ0cffJ;757f``Qel8U52>\ESD00Pgg\07@<
+RdD8PSP\3hE\1@00XOa30`2;C@PcfhXIIX^4F0@4~23ko02l0?Q3<5~2PoP\M6:3j6:3n18?Qah5
+~2obB58:l108e008b_0@0d]040=;@103Bd0@0d]040=;@103Bd0@0d]040=;@103Bd0@3<\040
+=;@103Bd0@0d]040=;@103Bd0@0<\P40=;@104Rc0@23OO003hGL1000odD8adG`0@000<M5k000
+~2jJ`4~2^@L0~2^]`d0`2;G@R;`nPLH0002l2;``n5Z0@008?01hU528\=o4<303?KRQPcdVJ;
+55Wf`PQd5Xe0040cdXX@<m]VRaaAm\<8MO29A@R;G@R=@`69A@R2>cd?QFD4~2R`gl@`<0<m::
+43?KIX\LDOK327@ERl10<m::43?KIX\LDOK327G`RDD8^@X0~2SEGdRed8Rl?XJf4008U5n3]M
+m0n47@@008]=3?I1405d73gdO`00MS?71O140`0a~3^040~2Pl@LFlW3PGghn7l007HEa`G`A0<0
+<@000;P1~3Pl@LFlW3Red<Rd\@Pn42MAf;COPiB`Qf5LL5l4@303<0~2^040~2Pl@LFlW3Regh
+2m]d2X]538UH389P4?^;AOB9A@S7AO00~3adG\0@000>U^0`00Rl2i1@000;[T=0<0Red8Rl?X
+g5h000_0Rl<?QFP3~2Pl05RDD8R`gl@`<0<m^:63?BIX\DFOK227@FSD00@3?BRQ0cffJ;757f
+``Qel8U528]M28e30HU5288k?@n59@<008\=o4<303?BRQ0cffJ;757f``Qd5H_0@3?BRQ0cffJ;
+757f``Qel8U52;T:~3SEGdRed8Rl?X:f0008U5n3]Mm0n4g@8008]=3?I1405d73gdO`00MS?7
+1O140`0a~3^040~2Pl@LFlW3PGghn7l007HEa`G`A0<0<@000;P1~3Pl@LFlW3Red<Rd\@Pn44
+MAf;COPiB`ac5LL5l4@303<0~2^040~2Pl@LFlW3Regh2m]d2X]538UH289P4?f;AOB9A@S7AO00
+~3adG\0@000>T^0P00Rl2i1@000;[\=0<0Red8Rl?XW5d000_0Rl<?QBP2~2Pl05RDD8R`gl@`<0
+<m^:63?BIX\DFOK227@FSD00@3?BRQ0cffJ;757f``Qel8U528]M28e30HU5288k?@n5i@4008\=
+o4<303?BRQ0cffJ;757f``Qd5H_0@3?BRQ0cffJ;757f``Qel8U52:7l@`<0Rdd8<m^:6FJ;Q5P4
+10003ko0PoQVM0f3n7Id5>U3~3SD00RdD<PV0@o^\oSD00Red<Rd\@Pn44MAj1N`cdO`00MQG7
+1O140`0a~3^040~2Pl@LFlW3RdD<PTP@0N\:Rl3YC@4008e008]528e@0HUE28\Mo4<303?9RPYV
+Pka;10@0069e1X?00XU528]5389P4?O7AO00~3adG\0@000>Wb~3Rl2i10000;[d=0<0Red8Rl?X
+H5`000_0Rl<?QN`0~2Pl04RDD8R`gl@`<0<m^:63?BIX\DFOK227@FSD00@3?BRQ0cffJ;757f
+``Qel8U528]M28e30HU5288k?@n5Z@0008\=o4<303?BRQ0cffJ;757f``Qd5H_0@3?BRQ0cffJ;
+757f``Qel8U52:7l@`<0Rdd8<m^:6FJ;Q5P410003ko0PoQ]M0G[;he00;T6~3^_`d0`2;G@R;
+`nRdF`002l0?QD80~2Rdd<aT410H?31XUM2>\5o>\`Rl37AO00~3adG\0@000>\4jab;`8]5288h
+00n5H?[ooh=ml01e23?0Pl@LFlW3a`G`A0<00`000;P1~3Pl@LFlW3~=EH_\Dh?\98U528UE38e=
+g8U=m0_0MCF;3B180`29COP;bGDN^>`0~2j2;>oonS84P308U5n0_0M@Pc`8?495_9`j7`A0<0
+RDG`jc>;3KA<0`29COP;bGDN^>`0~2j>g=oonS]4`308U5n0_0M@Pc`8?495_9`h]528\0RDG`
+Pgg`?7DSocG0C0<0^RPa0`2;AOB3k0SX1KKooh?43<M5k040~2j`SladG\~4ogG\SDgdDH]=38]M
+n8_CRdG`Pn`<j0<c~2Rl>3a3QKbL<0~>EH_\bNVSH000SD00EH_\Rd08bNWPC@00EH_\Dh]8288i
+07D8Pl_oja2=@02;B0R=F@69F0PcfhXIRl=KbL>;`5F;k8?hog@6bNUVH000bL=ERnb3n?md2H]B
+2<WY9ed00<W3o5F;k8?hog@3odX8bL>=@01ERnaCPna0RDd@adGd~4adGh~42lUe23?0PlA0FlW3
+PoP1M0N3n09d8^\`2m9e2H?8oh?4@5_9`lM5i62e0@37ANRT]@40REG\jbk7ANAD]@40adGXU;D1
+0>\N2m9e2H?8oh?4@5_9`lM5i6be0@37ANRh]@40REG\RdDDRDGLRdDHRDGPRl2;CA0c`8X12l1d
+2H?h9G@<jbj;`>VK~3SD00ReD@@Xe5b>Pd4@00RDD@RdgdSEG8SDGTj2\H~2RDG`jaf;`8eEi8]M
+48X3j0<1~2RDG`@hUM4<M5b040~2RdG`Pl06PoP5Mc[o98G4]P40SD00k;H10?Bf0@3d]P40jKH1
+0?Bf0@3L]P40Pggh07l7adGhooooon\Mo?m=4>UPooooRdG`0DGdPgg807D3odGhjDcooon;AOR3
+a41KbL>=@01ERnaCEUN3k129A@R9E@b9CA37AO00~3PgT407D:<l23a11OGU_9`h]M38\cRl?o
+eX_CRDG\RmR;MO2;A@SlPo_oM2>;CA0iL@An6`_0M0>8642;fX_hAX\CRl?odX_CRmR;an_Io8UM
+k8Uel8]E38]b18]5k?oFRdG`2l1n1>\5Rl23b?n3a11OGU_9`oaERnaCEh?\48Q528_8RED<adG`
+~4XOa30`0?]]TcbFJ;35Sf`@Qd>h_0RmZ;4h_3om:;dhU5m8\Mo4<306J;34>3h@Qd2?m5l>_O
+SD00ReD<RdX4RdGdom6;AO23a11OFlW3RdD<Ra3odXU5m3?9RTd8>l5e3;P1~3Pl@@Ge_9`h]E
+38]:18]mm8_7om63oome1X?8on\6o;SmooooPl@@Ge_9`eF;k8?\3=]m33?9RTP8PoU<M363nFad
+2>UC~3SD00RdPDSE44RE0DR`V9CO`;bGD4<l39`h]=o=]]3=dIjD\0~2o8]858eA18U@58\9RDgh
+2lUe13?0bL>;COR;E@b94H]E48UA18]E58UA2>\NRdPDSE44RE0DR`V9CO@;bGD4<l39`h]5m=]]
+3=TH^040~2bL>=@01ERnb3k1ACEc?KRUP8Po]<3hBN~3Po]\M0GY>04008]H58ek18Uh58\KREgl
+2m]e1S?0Ge_9`h_IPo\1M0f3n`=d?>VB0@00SD002m9d78]Mo8\ml3D308TkRcgd=@<0RG\4jG81
+~2SD00Reglg@G`=@<0fN3M6nUM0@00Rl0;dW@LReglRcg@=@<0RC^;?M@e0`29N`CY?P4008e0
+08]Mo=d5d3D30=WPgA_Y:@4008_0RePDSG\4RGPDRa^9GOP;fgD6<l1OFlW3RmV3n`5d3H?k0gA4
+jOh0~2SD002m9d98]Mn8\mESH308TkRceJ=P<0RG\4RceN=P<0RG\8jMD0~2Rl2;GOSK;EHf0`3I
+h=\kjL40~2Rl0;dW@TReghRceZ=P<0RC^;?Fhf0`29N`B;?G8f0`29N`SYV@0008_0ReghfbeZ
+=P<0fN3K>nV5~3Rl2;F1B=N`B9N1B;6hUMm0_KM@Hc`5mKbL>3n@5d2h?i0g@fjE`0~2o0_BM12;
+AOB;7B0f0`296>]:SD00RdGdRadP=P<0PO<0~2P8UMl=U5l=THjbj=@00;dW@@RdGdRadX=P<0
+RAS[6Xe008]5m8\M:3H3087c~3P8UMk=U5k=TH^040~2Ge_9`eF;k<J49?o_ool0DeIGPNb\4`00
+RDD8RED<Rm[7ANP0~3adGP~4adG@~4adGL~4adGH0@0008];18U=i0_9MB^3>`1e6M\]24@308_3
+j2Wmoon;d`_0M@K70P40~2<l21a:`C~2GeiKbL>;A@SlRmR;4ooBThUMl8\Eo4<306J;35Z3h@Qd
+1om5j>_RRl37AMAF4`00adG8~4adG<~4adG4~4adG0~4SHEPk?ooRDG\RdG`PoP]M0F3n2]e>h]M
+i4^9GNAe4;SmooooPLB\4`00GeiKbL>;AO2;GNb80d>9GNb3n2ee1lM5f000~2RdD8Ra3odXU5
+l8]538=h600?Q5h2~2RdG`PoQ>M0V3n6h?QIL0~2Red8Ra>;`ooBRm>9AO23n65d6X?h@G@ERdX4
+om6hoOoooh74[1<005mNFlW3Red8Ra>;`ooBRm>9AO23n4id6X?hKW@ERdX4om6hoOoooh74[1<0
+05mNFlW3Red<Pc\0MAVi0@0008]Ef8_3j87lool;`7D6a`<1~3RdG\0dGXSIePk?oo:l>3`0>1
+a:`C~2GeiKbL>;AO23n6Ud2H?hB@n5Y@4008]M28\CRl?odX_CRDG`PoQ^M1Z3n4id5H]:1?oA
+^?gooon1a:`C~2GeiKbL>;G@R;4h_3om:;dhU5l8?hIW@JPoQ6M1F;BPCodKSmooooPLB\4`00
+GeiKbL>;G@R;4h_3om:;dhU5l8?hJGA7PoQ9M4:;BPCodH]M38<k07DI^@<0~2ReGHRl?X_?_o
+o`_0M@K70`40~2RdG\0dGXSIePk?oo:l>3`0>1a:`C~2GeiKbL>;G@R;4h_3om:;dhU5l8?hKW@J
+PoQ>M1F;BPCodKSmooooPLB\4`00GeiKbL>;G@R;4h_3om:;dhU5l8?hJG@JPoQ9M1F;BPCodKSm
+ooooPLB\4`00GeiKbL>;G@R;4h_3om:;dhU5l8?hM7@JPoQDM1F;BPCodKSmooooPLB\4`00GeiK
+bL>;G@R;4h_3om:;dhU5l8?hNG@JPoQIM1F;BPCodKSmooooPLB\4`00GeiKbL>;G@b3>`1e6KT3
+~3ReGHRl?Xbo[oo`_0M@K70`40~2RdG\0dGXSIePk?oo:l>3`0R1a:`C~2GeiKbL>;ANc60310
+RDG\Rdg0Rgg@Reg`RgFlSD00RdGTB8U5i0_03hb=0@00Pgg<00n4N`0008_3PoP[M0R3n2ed0n\]
+o8=ma01e1X=mg01n3;T1~3jB<1~2Rl37AL@1~3_P40~2jA01~2SD00RHeLk?ooXK@Z0`2;P9P1
+~2Re04Rl\c`6J;14Z;SEc\ooof`09d3Om5g;h1~3j`R=@02i0@000>W?~3Rl2;`h?h<7@iPoQ5
+M0b3n6Ed1nUB~3Rl0;ogl6PggP07@BadG<0@000;h1~3jIX0~2o;T1~3jHl0~2Rl0;ogl<Pgg8
+07D6<l3[1h_0^040~2Ro0;`0n4KP0004OYJ00008e008V=G>cooj6d:P<0Rh2H0@00Re04Rl\c
+`6J;14Z;SEc\ooof`09d2DNn0@000>\fo:6d:P<0Ri1P0@00<l2:0S_3MAf3OLP0M0Ni0@000>\E
+adG80@000;h1~3j`N;`;T1~32lUe=`_fM1^;AMB=D?n9EM@;`7h>RdG\R1Q0RDG\j`J=@03oAN2;
+fH]528\@om:;bh_HjFOnoon=@029OM29GO2;E@R;LPB;AO3oeX=md01e1X=mh01d38=mc01d?h=m
+g01e>H=ml?me8H]Mk8f=H>coob_IB`_KOPVhoOooon\5Rl23b?n;f>\6o;_mooooRl>1a:`C~2
+GeiKbL>;ANc6~2RgD<Pch03hES~3PWh8C7DZ<m:=QF3\oon3k0SX>SX008_6Pl@8j<Cgoon3`?lK
+`40Uo`000>\YSD00<m:=QF3\oon3k0SXd3@008?428]53>RImoooPl3o6l109Ol0~22l1d2H]M
+3<L30@0008]5k8fMH>coob_3B8]Mj0=Mh0?3PLB\4`00GeiKbL>;`5F;k5=FEh?\88U528UE38_J
+RDd@adG`~4aTGS08]578<h40n5B@0008?i<0n5@0000<M5l040~2R4gSRdDDRa3odX_CRDD@SD[o
+RDd<2lUn88?hN7@5PoQHMAJ;CA28CN>;AAB;4?oBRDD@odd<odG`RddLPcT03hEY~3Rdd@PoT`
+3hED~3odG`R4gSRdDDRa3odXU548]=34V9C@`;bGh]PoQhM0F3n5Qe8h]=7<L1400008]=48Q=
+hh]558\@om:9AA3oAO3oC@c[5h_0RdDLa`08~3j`[lRdDLa`0:~3Reg`RdDH0AR;AAb3>0Qe1kX;
+~3jaN;GAb3>a1e2;P8~3j`Kl^0X0~2Rm2;A@R9ANa2RmZ;MNB;CA2;`8]E34Z9E@`;dPn<`@00
+08U5g8\E]2X308^BV04008]j18_1<m9VRaA7RdGLm\82M0^=LM3YF00008e008U5g8\E]2X308^B
+V04008]j18_1<m9VRaA7RdGLm\90M0J=LJW[;_b9AMb;5K@Z0`2;TYP1~2RgX4Rl4cdVJ;54N;
+AMcf`X1d1XeabN\6o;kooomoReDL>C9n>0_fM@V;d2]Ek0_BOPn;dd\;dWh8R0Q0j`R=@02;EASo
+0X_hR4gSRdDDRa3odX_8RlOY<_oooh_0RDD8RDd@ReDDRg84RdD@omJ;A@P[ANb9ANP;`7l6PWgS
+<7D8RdGXjbR=@023OO00OPZkoOooon\FSD00Pgd@ogD6PlSoj`Kl^?gooon;f8_3Pl@PGeiKbL>=
+@01ERnaCEh?\48U528UE38U=4<M5m000~2PgT407DB2l1d0lH003?0Pl@@Ge_9`h_0RdD<RcSo
+ehU5l8?hog@eRdd@ReGd>E44ORZ;N@b;BA0;i?:^SGooM08co`_oM1F;E@P;dW@6R092RED8odGd
+jkn=@02;E@b;NPB;AO3oeh=mm01n2X]520_0M0?6~2Regd2m]n0^\CPgg`ogD6PlSoj`Kl^?go
+oon;f8_3Pl@@Ge_9`eF;k5>3k2R9A@R9E@c7AO@0~3RdT4RDg`2lUe23?0Pl@XFlW3RdD<Ra3o
+dXU5n8?hogD9PlSoPl@XFlW3adG\~4Pgg`00n>i0000?b;COR8CN:i0P0008eEhXe5h>QNAP00
+RDGXPoSoM0Z3n09d:^Ul~3ReD<RdX4RdGhom63ON`0M@^hoOoooh?4:5_9`h]5m8?4:5_9`h]M
+38\CRl?odX_CRDGTPoSoMB2;BPB;AOSodH=mk01e2H?8oh?4:5_9`h]5m8?4:5_9`h]Mn8QMhX]M
+i8QMhkT2~3SEGRSDGPj=Q5~2RDGXj`>=@037AN`1~3RdGX0DGdRdD82l1d3FJ;GN1VRAR3`0:9
+A@R;GO1;REg`RdD<Ra3odXU5n8?hog@82m\?Sagooon;E@b;BPB;AOSodH]5m8?4:5_9`oaERnaC
+Eh?\;8U528UE3<M5l000~2adG\~4RdT4RDgX2lUe4P_0M0EVa`0003?0Pl@\Ge_9`h]E3?b;fX\C
+Rl?odX_CRDGdRagl@`<0IX\<@h?Q27@8odG\jmn=@023OOCoM@Z3b?n3a2aOFlW3adGT~4PggX
+00n>6@4008e008]Mm8QMf[T2~3SEGJSDGHj>94~2RDGPPoSoM0Z3n09d>nVL~3ReD<RdX4RdGd
+om63ON@0M@bhoOoooh?4;5mKbL>;A@P;`7@5I\L0~2RdG\0dG`Pl@\Ge_9`h]M38\CRl?odX_C
+RDGLPoSoMC6;BPB;AOCodH=mi01e2X?8oh?4;5mKbL>;A@P;`7@5I\L0~2RdG\0dG`Pl@\Ge_9
+`h]Mm8QMfX]Mg8QMfkT2~3SEGJSDGHj3Y4~2RDGPj`7ladGT0@0008]5h055l8]520_0M0eVRegH
+IXTHPl02RDD8RegXBhUMj8]538\@om:9AOB;5Oa30`2;n3?9IX\<N_K127D=PoSoM0P;f`n?j_ko
+oh]E38]j18]5m?oGRdD82l1d1FK7~3RdG\0dG`Pl@\Ge_9`h_0EH_\DeN3k129A@R9E@b9CA37
+AO@0~3PgT407DB2l1d0lH003?0Pl@@Ge_9`h_0RdD<RcSoehU5l8?hog@eRdd@ReGd>E44ORZ;
+N@b;BA0;i?:^SGooM08co`_oMAF;E@P;dW@6R092RED8odGdjkn=@02;E@b;NPB;AO3oeh=mm01n
+2X]520_0M0?6~2Regd2m]n0^\CPgg`ogD6PlSoj`Kl^?gooon;f8_3Pl@@Ge_9`eF;k5=GPn`@
+RDD8RED<R`d4=@<0RDgdPSXZM@c70040~2@XUE3>\9RdD8a`00~3R`fd:P<0RhVH0@00Rd44ReD<
+<m^:6S?9IX\<F?K10Pn4JP0008]52<M01000~2R`fd:P<0RhVH0@00RgT4<m^:6S?9IX\<GoK1
+0W@hRl0cbHX:PnT`ReP40m^=79\3fHUH14:;7K@Z0`2;ViP1~2Rg\4<lV:2S?KIX\LCoK30WG=
+RED<adG`0@000>\8o<M5l000~2SGgdRed<RQ<?]\:i0`000?:^SGooM08coh_22omd3X]E28Q2
+24>9G@c[2H_0RdD8aT0888]538X8Rgd8R4l9SEP1REd<P_UK3hEW~3RQ^2neie2HQO2H?00XU5
+38]=28]538U1388h07D5<m_[;?b;G@R;F`b2>eee4KX8=@<0RdD<@>QoAP00@>\=^PPe0`2;A@cX
+KdH008_HRdD8REP@Rl^;A@`3`HU5388hGGD4@8U538=ml01e78]5289h2F=e2LM01040~2j`Z;
+A@S7@0CooomoRdD<Pl@@Ge_9`eF;k5>3k0c7AOP0~3Rl2;f8\Com:CREgdRaGl@`<0IX\<FX?Q
+27@7odGhjn:;`8=mm2Ee2X]5n423a0aKbL>3OOCoM@J3b?o[1_bhoOoooh?435_9`oaERnb3k0aC
+<lV:B0R3nFQd2h?iK7@VjD40~2o8]858eI18UH58\9RDgl2lUe1C?0FlW3ReglIXTCjcglRePD
+SD\4RDPDRa^9GOP;fgD5<l1KbL>;GOR94n\NRl2;F1B=B`B9B1B;6hUMm0_KM@Dc`5_9`h]5m8T@
+^040~2FlW3EH_\DeN3k1B9A@R9E@c7AO@0~3adG\~4PgT407D@2l1d0lH003?0Pl@DGe_9`h]E
+38e008_jRmV;5h_7om:;eh_;RoR9OO2;7Oa30`1VR`AkPn08M0KoANc[fOb;GO23nomd?8\Eo4<3
+08_k<l1VR`Ajm\08MBV;AO@i@@An8H]520_0M0J86429A@R;fOm5m8]538\@om:;bhU5l>^mo8=m
+m01n2X]520_0M0?6~2ReD<RgX4RdG`omN;AO@;`7h60dG\j`ClPlSoPl@DGe_9`h_0EH_\Pn`<
+Dc?9RTP8PoUXM0^3nFad9^U1~3o8]858eI18UH58\9RDgl2lUe1C?0FlW3ReglIXTCjcglRePD
+SD\4RDPDRa^9GOP;fgD5<l1KbL>;GOR94n\NRl2;F1B=B`B9B1B;6hUMm0_KM@Dc`5_9`h]5m8T@
+^040~2FlW3EH_\Dh?\=8U528UE38U=4<M5j000~2adG\~4PgT407DnPcT0MC62N@U`MAF;@AB=
+D0B9DAB;0<L0~4jaR;`3?BRed@Rl?X<?ooo`_0M@K70`40~2<l23a3AKbL>=AMB9AOR;E@clRmZ;
+4h_3om:;dhU5m8\Mo4<306J;34>3h@Qd2?m5j>_OSD00RdD@Rd04RDG`RdGdPoP[M0F3n2ee:X]M
+l4^9GO1e2kSmooooPl@dFlW3RdgdReghR0^;A@b;4?oBRDGd@hUMn8]5n<H0<429AOR=G@QCSEg\
+Dome38]=m8]El8?\3>Qam?ooPl@HRDGTPoSmM2N3n?md1N\[SD00ReghSDgD:mU;2m]n1kSmoooo
+j`>3b?n3a3AKbL>hoOoooh?4=5_9`h]=n8]Ei0?:RDghaP40ReD@PcX03hEK~3PWX9L7D\RdXD
+SD44RD8DRaT;fg@ARdd8<m:=AMCXX4@008T3jcF;AA370040~2jb[lRdd8<m:=AMB3k0cXP4@0
+08?438_@Red@Rl?XiOgoo`_0M@K70`40~2RdGhSEgD:l=8RegX0eg\0l>3a3AKbL>3a3AKbL>;
+`5F;k5>3k329A@R9E@b9CA2;fLM5j000~2adG\~4Rd<4RDG`2l1e8X<k07DE<m:;`nP\o?ooRl\;
+`7D6a`41~3<l23a31KbL>=AMB9AOR;E@b=@02;fX\CRl?odX_CRDGdRagl@`<0IX\<@h?Q27@8
+odGXjmn=@02;AOB3n2ed1H?h:gDZReg`BhUMl7D;^?gooon3a31KbL>;COB;GOR82h]538\@om:9
+AOA3REghRdGhaP0`@8U5n8eM25>=GNaCogD<RdgdReG`Pn`<j<[boon3a1R9ANB3n?ed98?hog@2
+jbR;GOR=CM@[fD\;fgh7^?goooo[0h?8oh?4<5_9`kSmooooPl@`FlW3RdghReGT0lZ9COS60@2;
+GA23>`1e9X]=23?BSDGDPn`<j>Y1~2Pl@<Rm2;`nPRnooo2l1e1\L30@0008]5n8eMe2_3B8]M
+j0=Mk0?3Pl@`FlW3Pl@`FlW3SD00EH_\Pn`8RDD8RED<RDd@<l2:@PV3n2D?Q;02~2PnQ5PoPc
+3hNi0P00obB5j<h101W@0@0Id0406M0109[A0@2Jd@40V]4109[A0@2Jd@40V]4109[A0@2Jd@40
+V]4109[A0@2Jd@40V]4109[A0@2Jd@40V]4109[A0@05d040V]4109[A0@2Md040V]4109[A0@39
+d040V]4109[A0@2Jd@40V]410?G@0@2hc`406M0101W@0@0Id040V]410<c?0@2Jd@40V]4109[A
+0@2Jd@40IM410=g?0@1Ad@40V]4109[A0@11d040V]410?7?0@2Jd@40V]4100G@0@2;C@b;E@Rh
+2P0008?42<WYP?gooh]=38]E23?0Pl@8bNU_oOooRdd<ReD8^0P0~2Pl@8bNVGnoooRdd<ReD8
+^0X0~2Pl@8bNV3noooRdd<ReD8^100~2Pl@8bNU_noooRdd<PWT9AWD@PgTH07D:^?[ooon3a0S9
+`h]E38]528?42<WYQn[ooh]=389i26ae9h<i07@5<l3[3ob;E@b;BQB=@@B9@QB;0H]=38]E28?4
+2<WYboCooh]=38<i07@7<l3[4He008]E38]:58e118U258\1Rdd<ReD8Pl@8bNVCnOooRdd<PcT0
+M0Lc`>\ASD00ReD<RdXDSD44RD8DR`6;C@b;E@R3a0S9jGOboon;C@b3>@1d1c?0ja6=@02;E@b;
+BQB=@@B9@QB;0H]=38]E28?42<WY1oKooh]=389i26ae9h<i07@5<l3[3ob;E@b;BQB=@@B9@QB;
+0H]=38]E28?42<WYco;ooh]=38<i07@7<l3[4He008]E38]:58e118U258\1Rdd<ReD8Pl@8bNW3
+iOooRdd<ReD8^100~2Pl@8bNTSn_ooRdD<PcP0M@R;EA3X>oSooh]=3<L10@0003?0Pl@8bL>;
+C@c70@40~2RdD8Pl@8bNVnmooo^?[ooon3a0S9`h?42<W3~?RlP?_L73~2EH_\<l39``00~;EH_\
+Pn`HDeIGRg0@2oH?SE00~2RlSggXUa48_6^``0~2VOOkRmJARDgdSAb=~4SAaK:m=e3bU85<M0
+4000~2jD00~2RegdSD\1:DPD`N<2SAaK:eP@Pl<<REP@jbJ;`8]H48?k2ghLTkT<~3VOOiThUM
+m05H58]Mm<7S0XdLFbUH48]H5873K0L0087k\PL007`8PO_e1`00OPR3b?mOGU_9`h\M]2X308^K
+U04008\K2m]m1OOKj`olRafd:P<0Ri^D0@00Ra^1nj05~2OPj;3K@Z0`2;BA3[7He008\M]2X3
+08^KU04008\;SAb=~4`N46:l^;f8U=k8]359VC<mX[fX?S0c?J:mYe1kYX<@<0j`Fj=34308UE
+l<M5n000~2RdPDPL5[1`00POVb1`00O3@cfh_0Ro>;f8_1VI<cfR_JPn<3<mX[fPnD`h7So`00
+0873K@4000?NBH7i\PL007gCREghRo2;GO2;CQ2;OP`3?8]?0gghRGghRdH8Rdh4RaK1i`N=??n=
+7?n=79n=75l3fXdDS@00~2`N46:lX3bl7P18d4`8dL@8dLf0?IRdg\0mV9GOb;GR29GNQZ06X1
+RmJ=AOb3k0cX_kgooh_6Pl@DRdPPPl41PoT43hMk~3obB=b=<104CD0@14e040A=@10=cC0@3d
+d`40Rafd:P<0Ri^D0@00Re\X:EgljE40~2o8=mj01e2\M08000~2jd7lPggX17DNRafd:P<0Ri^D
+0@00Re\X:Eglad0P0P000>\OSD00XK@Z0`2;P9@1~2Rd0X:DGlj`WlPlSoGeiKbL>3OO`0O@J3
+b?o[1?b;AOaOGU_9``00~:EH_\XiQ30`295Ia30`39`eF;k;U\?0<0POT@@@<0Lb2iK3`308e0
+03T1M`Ti@@Af18_1bL>3`@b1nA110`1bj8\=V4<300_9M1j;5Ia30`0kbW<D>@5g2CU117H4Rl79
+`h?133_:L^`c`<W3EH_\Dh?\28_HSDghDFX1\0;X~4Pl@82l2;`gD:a`FD@`<00@000>P6~3Pl@8
+FlW3EH_\POS0d@40M0FSW34308<mX4<3~2MAEZ06X0J:130`1Z0;04j000~2Pl@@bL=EJ9SO0@1T
+ocD0~3RnaTRBd0~3DeN3k1B9AA29EAB9CASf@0@2M1<c`8?455mKI8l5~4Pl@4GL>;CA3f@@@@
+M1n;3K@Z0`3f@B@2M1<c`8?455mKI8l5~4Pl@4GL>;AA2;03fF~2`0n4f@0003fL~2`0n4B040
+03d30070M0GY[@4006X0ogDHogDDogD@\0CXGPP008?448?hogDDPlSoPl@DGe]TS`D0~3Pl@4
+GL>;AA2;@1B3n05d;h?h17@2jdbi0@0003?B^0X0~2j>lh~22l0?Q5D0~2<lV;EAR;AA3XHP80
+0>]6^@40~2<m:h1P000>S7>0002l1d<C?9ReDHRdD@j3h2~2jb:i0@0003?B^0@0~2j:<h~22l1d
+3C?9ReDHRdD@j1X2~2PlSoPl@DGe]TS`D0~3Pl@4GL=Z0?me6?me5?me4;04j9`7~2Pl@@PoSo
+MAB3b?n3a1AOFfB?1@00~2Pl@4GL>i0@000;Z6~3^0<0~2j3`h~22l1d3C?9ReDHRdD@j;<1~2
+RddHPl44<m9VRe44P>80IXUA18?8oh?455mKI8l5~4Pl@4GL=Z0?me6?me5?me4;04j287~2Pl@@
+PoSoMAB3b?n3a1AOFfB?1@00~2Pl@4GL>i0@000;ZB~3^0<0~2j<8g~22l1d3C?9ReDHRdD@j3T1
+~2RddHPZ6U~3mh?8oh?455mKI8l5~4Pl@4GL?7AOBP<@<0PcfP<@<0o`n4l@0008]568?028U5
+l8_0Rdd@ReGdR`4i0Pn5a000089j101d;6X0ogDHogDDDK04j7h6~2Pl@@PoSoMAB3b?n3a1AO
+FfB?1@00~2Pl@4GL>;COB:@@D:`0n4K00008]m484oV@00`7DiRedHmP<8M36;CO3f@@42M2Ri
+0@000;Z:~39Ol0~2j?@f~2Rm<;`8_7M3@cbNQ]~3jb^=@02i0@0008]Mm3?BRU<6<l2:@`GXbCH0
+00_0M0dcbH]E68]54>Q0~3RdGdPWP707@Q<lV;EAR;AA3X:P000>\BRdGdPl08RDGdPcSo3hDJ
+oooo<l23a1AOFfB?1@00~2Pl@4GL>=@01ERnaCEUN3k5b9A@R9E@b9CA37AM@1~3adG`~4J31e
+~2ocFP@`<0\0;X~4R`fd:P<0PTTT0Xe=a56=CM1A\0;X~4Pl@@adGP~4PcfP<P<007@X<oJ=1;E8
+<P<0Rdd8R`Ti27D8Rd1HRDG`j`]6PcbeX383~2MMf9MN37AM`2~3RdGPPcb5X383~23hEL~3RdD8
+PCP30070MD?7AM@0~3adGL~4Rd0DPoP1M1F3n0Ad1>\JRl37AO1[~3jbV=@037AO1\~3jaf=@037
+AO1]~3ja6=@037AO1`~3adGL0`0008]M2?lcJPR;AM2;@0co<6X4Rd<<D6X8ogGLogG`\0SXGP<0
+08?48?I3105d3VX0JW6`0^Q:0`00Pl@8PggD00n43`<008]M3?H30G@URdD@2l1d0^\6Red8Rd<<
+Rm2;G@b;PiP0~2j0H8~2RDGHj`SladGH~4RdGH2l1d6_m`16X8JP5XP@000;04j>l2~2Pl@@jaf;
+`8]540_0M1A@JPQZ0FR1~3\0CXd08008?448]M3?H30W@9^0P0~2j`N;`;ShooooRDG\Red<mP<1
+M0Rk20000>\6o;_hooooREg<RdD<mP01M0Rh10000>\6o;SlooooRDG8Red<mP<4M0c7ANP4~3
+j`Z=@037ANSlooooSDFXj9Ta~2JP1ZM;02j5H2~2Red<ok>D~3Rgg\EoncT00005Oo\h`0~2Eonc
+R00005MZ16Ye\0[X:@800?ncZ00008]5c53o\h@0~2EoncP00005Oo\iP0~2D6X4JWJ`2^So0@00
+ogF\JPSoLgb;ONQGogFXJPSo\j00~2RgG8EVX4JWN`2^SI0@00ogFdJPSoLgAGogF`JPSoLgQG
+JPAZN;0:j;`1~2ogFlJPSo\j`0~2E_me^6X8og=`EfX4JWV`2^RL0@00PLC@~3mP<83h@j0@00
+JP1ZO;02j881~2SG\DocMZ1?mc46X8SG<<ocIZ1?mc16X4JPAZOK0:j5l1~2og<LJPCoLaQZ28\7
+`NP@D6X4SG\8ocMZ16X4JWj`2^Pk0@00R`HUool008U5i6X0JWn`0^PV0@00Rm>3a62;MNB1o_oo
+~23hB^~3RlK1h10;aXU5i<M5h000~2R`o1j@^3h@OAhKl3~3<l23nAl?Wl188oSCih]=`3?K<oJ;
+`8]5i2?7>lL?Q5P0~2<l1VRd@J:?K4P7@7^@`e0`3[1KT>=@<0Rl:=51R9AJ3oLR1Z2?mb96X8
+IX]2:2GoO`00D6X4DHU=Y6X0RlI@JP5Z1FR0~3\0cXP00008]EX8]=Y8?4<<7W0TJ3``Z3oPQl
+ShUeh>\CRl1Z06R2~3\0;XEP0008?428]52?I0111d3VX0JW:`0^Po~3Pl@8JP1ZLk02j340~2
+Pl@8ocFP@`<0\07X~4Pl@4Rdd8mT440GD:^6<0~2j6\B~2PlALGeiKbL>=@01ERnaCEUN1k:00
+~2Pgd<00n>o0000<M5l000~2ReG\RggXSEd@<oJ=@`B;4h]k18?320_BOA6=PP0c0`29A;G4jKh0
+~2Rl0;dWD<RGbea>V_~3SD00RKEPooooRoN9WFcooon;f[T@~3Rgg`SI@mL?oooh_6RKEToooo
+j9P\~2RmN;n3?0PlWolZkgdDV9SFSooonh<30`<8fl5G3ooon;lh_>`NT2lj^;cX^eH?oooh?Q
+0o>ZRkeToooo^A00~2SD@Em8fD67cooon7WFcooon;QFSoool[d8_7Pn`<j3@\~2Pl@<j9Pd~2
+RiE\ooooRdg`SH`=L?ooohU<]LA6PdG`2C]e30n<5_oooh]=38eEa8]52>S\2`00PLBP~3GeiK
+bL?lEFRHg`40I?le~4RnaTRBd0~3DeIGPn`DadG`~4R`fd:P<0mT4T0W@D<l23a1AOGU]TS`D0
+~3Pl@4GL>;CA2;@@cXm_GoohU5k0_0M0aVRdP:PN40P000MA@c`8?455mNFfB?1@00~2Pl@4GL>;
+ON`cbFJ;C`[faD0?Q<X0~2RgD@R`j1nA`00<0?U<>1hol0~2POVG~2`0nD`2Go~32mR1nI@00<0?
+U<:1h_l0~22m>1nID00<0?U<>1hol0~22mZ1nIH00<0?U<:1h_l0~22m>;g`_@POVH~2`0nD`2Go
+~32l:1nIT00<0?U<:1h_l0~22m21nIX00<0?U<61hOl0~22lYd>h]m68]74>PSmOooRmJ;cc_3
+M@hc`6J;@`SXi24008U5l8]5l8?hogDBPl@DGeiKI8l5~4Pl@4GL<c`8?455mNFfB?1@00~2Pl@4
+GL>=@01ERnb3k1C7AOP0~3RdD8RdP4^P80~28m4?QNT0~2RaFd:P<0mT8T0W@<P\T1RDP4jM80
+~2o8]538?028U5o8]528\0?@40080?Q;P0~2;Il00<23n04?QZX0~2;F;o~2PoP23hN;~3obB5
+3>010:7P0@0Hh0406>0108<m[4<3~2MAB;AOb3`0B;28T=14@30<L0<0`208]5284h0`01`7Dd
+Rd0DPoP1M0R3n0Ad3n\Io88=[4<300C[;He0088=[4<300;[8He0088=[4<300S[5He008]5284h
+0P01`7D7PPf\@`<04<M5n?ooooo[4_b;AOb;B0B;EA2;A@SXioOooh]5n8?45<W3SD00EH_\Pn``
+X@A40`29AOb;`<M5f000~2adGL~4adGP~4adGT~4adGX~4adG\~4adG`~4adGd~4adGh~4^P@0
+~2^:a30`3X3R\000_0M0k7AMP20070jG<0~2Rl37ANP4~3^P80~2^:a30`3XiRX000_0M1;7AMP3
+0070adG\0@000>]7Rl2j0@000;R\@`<0j<4Z~22l1d4LM5f0<00L37AN`4~3jb;l^P<0~2^:a3
+0`3XWBX000_0M0k7AMP30070adG\0`0008=mf01d5He=f56`0NP0~3Pl@4jAKooon;`8]5o8?4
+<<W3EH_\Pn`@RdD8RdP4Pn44MA2;CA2;E@cXJ??ooh?44<W3PcfD@`<007@@SDglDFX0\0;X~4
+Pl@8<l23a139`he005F;k5=FPn`8RDD8RmR9E@`;f`n4N@0008_2j67bool;`0n4JP0003?9IX]8
+2X_3m\F03hAI~3R`R9CO@;b@n4@P0008]01>Pcl_oo2l1d=S?9IX]82_K5P7@[RgGdo8_6RDD8
+RaR;l`_KM1N;@0CX2o;oo`_0M0\cffJ;F0[fah1eg8Uem8]528?425iKbL<c`8?425iKbL<0~=
+EH_\Pn`\RED<RDd@PSP0MBO7AN00~3adGT01000<M5j000~2aTG\0LM5l1P0~2RDGdjbN;`;T1
+~3SEGPj9LY~2PoP1MA>;AA@;`7@5j7jLoolc`8?4;<W3RddDRDglRdd<SEGPSDGlj3\U~2PoP1
+M@Lc`8?4;<W3Pgd@07@7RdGlPTQ40H]=o89i=@=e>H]1<>R=7@00RDGh2l1d7X]=o<I1=@6;COc7
+@D03~3Rdglad4<~4jb7lRdGlaT0e0>\GSD00RdglPWTe0GD;Rd4`j4\M~2RDGhRdgl<l2:@CF3
+n08?Qml0~2obB5U><10?WS0@2Ph`40j><108eEn8]5o>Ri:@00PoP1MA4cdX]5o>Rf7@00<l23
+a2c9`h]5o8]=n8U888]5n8]848]5o8U8D8]5o<M0E000~2jIH0~2SD00<m:;AOcXOQd003?0Pl@\
+bL>:ENb;AOcXP00008?h0GDA<m:;AOcXGAd003?0Pl@\bL=Z4fP08000RdglPl4lDK03j000~2
+Pl@<2l1d4C?BRdGlj30M~2<l23a2c9`h]5o8=h@0=d:nQ_8`002l1d8S?BRdGlj0dM~2<l23a2c9
+`n\?^SH1~2^0@c0`3XDBD008]5o8?4;<W3o5F;k5>3k329A@S7AOR08000PN;o~3PoX3Mc3o99FX
+i040o;ST0@30i040d>@10<ST0@22COP@jb6;`89=n23[6H_0PTgh@>\ARl2j_@400;P@<`<0j>dT
+~2RdD8Rd0hPoP<3hNJ~3obB5n>@108e008SU0@0\i@40B>D108SU0@1Xi@40R>D108SU0@28i@40
+R>D103SU0@1Hi@40R>D107SU0@37AO@1~3jEl0~2PTgh0\M5m040~2jDl0~2PTgh0LM5m180~2
+jd:=@022COP2adGd4P000>\bSD00PTgh0\M5m140~2jb:=@022COP2adGd4@000>\BSD00^_41
+~2^1`c0`3X=B@008]52?I0A0Ad189=nD2i104008]E28]B<3?0j88L~2RDGX2l1e2kP1~3Pl@`
+FlW3Red8Rd<`j9fIoon;ANR9@c1Z0?men?mem6X0JP2=CNaASD\PDE2`2>P0~3RmR3a229GO0;
+f`n4`P0008?k10n5H@000<M5i400~2SDgLDHe=i56`0^P0~3Pl@8PggT07DKa`G`A0<0?00008TM
+`4`30;P1~3Pl@`FlW3JP3oMOSoMOAZ06X0SDg\DH]=28eA85;oLC2`2>P0~3Pl@PRDG`Pgg`87DE
+a`G`A0<02@000;P1~3Pl@`FlW3Pgg`KWDEa`G`A0<02P000;P1~3Pl@`FlW3Reg`2m]d6lL5l4@3
+03`0~2RAg0C0<0^040~2Pl@`FlW3Pgg\0GD7RdD8PV14oX]M28_3j>Z8oon2Nc@13hGW~3Rd=4
+9H00~23hGI~3Rd<hm\04M@Wf`0P?Q<P0~2Rdd8SE58DVX2J_ooLB2`1>P0~3Pl@@RDG`2l1d;Cf3
+~3M@Pc`8?4<5_9`lL5l4@303`0~2Reg`RAg0C0<0^040~2Pl@`FlW3SDgPDFX1SDgKDH]=2?ma
+8;04j000~2Pl@@RDG`2l1d6\L5l4@303`0~2Xl1<0`2h0@0008?4<5_9`h9mfaYe>h]=2?maB?ma
+8;02j000~2Pl@8RDG`2l1d6\L5l4@303`0~2Xl1<0`2h0@0008?4<5_9`h]52898AB2;G@R;BdB1
+hH00~23hE;~3mT<h17@9^080~2j`B;`3?0Red8SD]8DH_8DFX0og<P\0CX~4Pl@@RDG`2l1d6\L5
+l4@303`0~2Xl1<0`2h0@0008?4<5_9`c?0Pl@`FlW3~<EH_\Pn`8EUN9A@R9E@`;bG@jPST0M3F2
+>@1d7[h1~3SD00RP680T52PST0M0R;aTJ3n5ilkHUE38]53<H0>Xe80LH188?00XU538e=n57o
+=BPc0`3oM@QXS00008]=38]E68]558?\3>Qe6000Pl@LRDGl?C`1~2MDQX^4`306X^J1`e0`1Z
+0[04j000~2J;Q<0`1Z0fQ<=@<0JP:`1>P0~3J;Q<0`1Z0VQ@=@<0JP:`1>P0~3Pl@`jOX0~2o85m
+o3d1~2MBJnE3D308]E38_j^@P0~2ljEVYJB;nS?0PlWolZkgdDV;`EmNbL>1OO`n0@00MDQX^4`3
+06X^J1`e0`1Z0[04j000~2J;Q<0`1Z0fQh=@<0JP:`1>P0~3J;Q<0`1Z0VQ@=@<0JP:`1>P0~3
+Pl@`jGX0~2o85mo3l1~2MDMX^4`306X^J1`e0`1Z0[04j000~2J;Q<0`1Z0fQl=@<0JP:`1>P0
+~3J;Q<0`1Z0VQ@=@<0JP:`1>P0~3Pl@`jbb=@023OO`2MB>nP3D308]E38_j^@H0~2ljF;nS?0
+PlWolZkgdDV;`EmNbL>;C@b;EOS61140RdGhGek9`h_0EH_\PNc`~3DE8cbHfE4?oooh?\3>PE
+o_ooSDglDE2=SA3ooomAJP:`1>P0~3SDglDFX2J50e0`1Z0[04j000~2Pl@dbL<0~>EFRHg`40
+I?le~4RnaTRBd0~3DeIGPn`LRDD@REDD2l1e6H_2j2nHoon3a1aOGU]TS`D0~3Pl@4GL>3OA@0
+MAb;AA3X^iCooc?0Pl@LGeiKI8l5~4Pl@4GL>;CA23jA29CO1VPGT>eJEd53?0Pl@LGeiKI8l5
+~4Pl@4GL>;CO22N@`@3h9Y~3RdDDj<6Goon9AN`;`7DD<l23a1aOGU]TS`D0~3Pl@4GL>;CO2;
+0C]557<4j`F;`8]558]el8?648]Mk8_kRlS1j@;cYH_8Pn43ljB;AA3X89Cooh_3Pl@LGeiKI8l5
+~4Pl@4GL>3OAC_MQ@c`8?475mNFfB?1@00~2Pl@4GL>;MAB=OQ2;anP]i_ooUX?^18_?mmTScc_?
+3iC1PN7o~3:o69MNR;EO0cbHY:38U=i3_a3hiH~3j0NGoon9AN`;`7DD<l23a1aOGU]TS`D0~3
+Pl@4GL>;AA2;ENb;l8_jReg`Ra^;bl7Y0_>URl^3h@?cY8_bj7BCoon;aX?475mNFfB?1@00~2
+Pl@4GL>;ENB;ANPk`Wd8Rdg`j;:Eoon;AO2;GAB968?048?475mNFfB?1@00~2Pl@4GL<0~<EH_\
+DeIGRoRh~4mPOoM@j3k`;mlZklAhOKQm^7feNioooooo:^mm59Rm5ARoNo0@000;\0~3Qm^7fhOK
+[3`03hB7~3?21d7c`9M1\lG7@[?29dDoO30@0007D7Ah?;0HOKT4;[eI3g``80~2M0A2jlV@Pn?n
+jl>7fi3g``40~2M@A7Pl\1^Ooooon7o_>^CoOAQoj\?29d1@?AC^^LdNUc44;[UI3g``40~2M@A7
+Pl\1ml<2~3M@R3b`;YN?oooh?SoNU`ooooRCf<<0<00mM7`NL20mN;`X?\1>R@UOooPl@4PoP0
+MB2i~4^P00~2\6B3k0cX`?cooh?436X8JP7X20800:>@<0<0^`00~2FD6;d5h3nXTjPl84ljB7
+fhOKQm^7fj`l00n4Y`0003`PM2<l2G@O?5ad=c`RM6og``40~2M@^9>X?218?;0HOKT:[[dI3g
+``80~2M0BZjlF@ml<1~3M;b3hoj`0:[[]?O30@0007D8RCZ3`PB3b`6iooooohOnlji?mm67oZ`l
+8[1LM0OcZTk[RXOKdNWcZW<J\2:ZjG[ooon7foO30@0007D8RCZ3`PB3b`7g``80~2M@R3b`;Y
+F?oooh?SoNU@ooooml<1~3M0B`0:Z@a`80~3GeiKbL>@EH_\DeIGPn`8RDD8RhRl0@00Rg4@adG`
+~4PSh0M2\cd_b;gX_`Ro\c`8?9oo:^Ro^;a_OABHdd3dJ;cR_?0DP`@X8n07GKREG`RdG`Pl0?
+P^3`@8U5l<7P0^POU?ooRed8RD<d2l1e2h?8oh?425mNFlW3RdD8RiRl0@00Rg<@PSh0M2_lRm2;
+BRb=F@69FRc1h@:;FSB9=0^;oS?0PlWolZj;`_OAB@?aAX8n07GFRed8Re<\`N82Rd\da`@A~4
+Re\dRAdD@@<0<l23a0QOGU_9``00~:EH_\DeIGRo29M@R;nX_O\02ioooooo:^mm6;dHOKQm^\
+?01d2h_klZh;bH_:MO6@RlI8:dD8GeiKbL>@EH_\D6X1\0;X~4Pl@8bL<0~=EH_\Pn`PDeIGRDD8
+RED<RDd@adGl~4adGh~4PWPe00n5K08006J;F3IVPo_oM0n86TV9CA3oAOQVad0foon;A@Sf@4D@
+M1b3OA00MPj2B0P1a`G`A0<07@0008]5n5mNFlW3SDglDOme48]=38]En0?:DH]M2?mc8;04j000
+~2Pl@@RlP;`7@KPT\80\L5l4@303`0~2R@g0C0<0<l1OGU_9`h]Mn0=Mo8UMo7DHRed8PT\80LL5
+l4@301d0~2<l1OGU_9`h]M289k=04?QIl2~2Re=4m\:0REGT3hA=~3ReD<RoZh6P0008]=o0_T
+lZj=Oomd0S?oRdGTRGgd2omd8h;<48U3A3_jM@j2B`P1a`G`A0<07@0008]5m2]535mNFlW3RdGl
+GeiKbL>;A@b;GOb2O1So6Pn5<P8008]528]8A87Q020000n5808003]M40n3F@0008?k0GDBPTP8
+0LL5l4@301d0~2jc^;`8e=n55Z0F[oRed8og<P\0CX~4Pl@@RlP;`7@KPT\80\L5l4@303`0~2
+R@g0C0<0<l1OGU_9`h]5o4QOGU_9`he=n55Z0He=je6;G@SoLb2`1>P0~3Pl@@RlP;`7@KPT\8
+0\L5l4@303`0~2R@g0C0<0<l1OGU_9`h=mn01d?He=n55Z0F[oRed8og<P\0CX~4Pl@@RlP;`0n4
+F`40089;20;71O140`0l~3R@g0C0<0<l1OGU_9`h=mo05e5X]5289820771O140`0M~3jcb=@02=
+COQAJP5Zoh]M2?mc8;04j000~2Pl@@RlP;`7@KPT\80\L5l4@303`0~2R@g0C0<0<l1OGU_9`h]5
+o4QOGU_9`h]=o3U=40n6eP0008]E38]el8]Mk8]528_0RdPPRgQ@>GTDMA6;N5@iNAQo2KT1~3
+j`B;`3?92lUd6X98AA22B0P1a`G`A0<07@0008]5o5mNFlW3PGQDn0l000nD`@[9M0n;B52;2HU8
+D<M0E000~2RdPPRgQ@>GTDM@R;LAP[L5C[2h]`E?ONPLKh3`00Rgd@>oic1X_Oj`B;`8_NRGGT
+Rg1@RdQDRDGP0o63aPR;nX_3RlS1j@;cYH_8RdGPPn43ljB;MN@3d`5Mo8]8E0?;RDQDRdgl>Dd@
+3hLhooooRdGlGeiKbL=ERnaCEUN3k1B9A@R9E@b9CA37AO00~3PWPe07D=j22foon9AO3Y<P40
+08]52?I0>0Ad4X]888]958U8D8]888]968U8E8=m400?Q]d0~2SD00RdD8PGQDn0l000nD`@[9
+3hA4~3RdQ@R`T;bG@6RDQ@jbclRed8Rd<Pj?D0~2PoP1M@n2B`P2RdG`Pl@DGeiKbL>;A@R;F22;
+FaB9F52;A@S7@5@0~3Red8Re]Dmm^1`oP?~2REg\RdD@>mQf0n\4o8]5k8]M28]kD8]CE0?jPlL8
+ReD<Ro:;b<7Y0_>URlR3h@?cY8_:RdG\ReD@>m1f60?8RDd<:m29EA01AO2;De@3d8UCE>\Eo8]=
+405=l8]528]HE0?IREQDj`_lPgd@00n79_oooh]=28]I88]AD3UC57D@RdUD>D\HO`Rh0@000>\3
+o3?02l1d38]=28]I88]9E8U;68]5l8?455mNFlW3~?EH_\Pn`4Dh_HJQ=X010008e=o56`0nP0
+~3Pl@<2l2;`g@Ba`G`A0<03@000;P1~3FlW3Regla`<0~3PgP@07DKReglREP@Reglad<4~4ad0P
+~4ja>;`8]H58]=o8T;RdPDReglRD\4ReglREPDad0H~4od0P<l1KbL<0~=EH_\Pn`4JP2=COlc
+dX?\3>R3~3Pl@@bL>;`5F;k8?\16X1SDgo<m:3k0cXI`0008?44<W3Rl1ERnb3k0aZ08e=mh?\
+3>Q=~3Pl@@gEghPWgg07@:a`G`A0<00P000=e5n<W3Rl1ERnb3k0aZ0He=mh?\3>PM~3Pl@@gEgh
+PWgg07@:a`G`A0<00P000=e5n<W3Rl1ERnaCEX?\@8U528UE38U=4<M5l000~2adGX~4adGT0@00
+08e=a8U=m<M5k040~2SDgIRDgL2m9d0XT2Rdd@aP40RcGl@`<0RdD8Rl0cdXX@IX\<EX?Q27@3
+@>_`RDD8ReD8<lV:2X?i:g@@PoT]M0C[38_0adG\~4odD8R`fd:P<0Rh6H0@00Rg04RdD8RP0?
+]]QVRaANPn823hFc0@00RhUP0@00>04?Q:D1~2PgdD00n4SP4002Go~3PnQ9PoPU3hMm0@00obB5
+P?H108_0J?L10?Cg0@3dm`40m?L10?Cg0@0Hm`40m?L10?Cg0@3dm`40m?L10?Cg0@3dm`40m?L1
+0?Cg0@3dm`40m?L10?Cg0@3dm`40m?L10?Cg0@3dm`40m?L10?Cg0@3dm`40m?L10?Cg0@3dm`40
+m?L10?Cg0@3dm`40m?L10?Cg0@1Xm`40m?L10?Cg0@3dm`40m?L101Sg0@2i0`000;ZH=@<0Red8
+Rl?XT1P000_03hG0~3Rdd<2lUd1H?30hTIPgg\07@=g@G`=@<0PlA0GU_9`md5l3D30=WPPlA0
+GU_9`nV=~3o;T8~3^Y`e0`2;G@R;`nQ060002l1e;X]=30_9M0F3``R96H=mk01d3Md5d3D308?4
+@5iKbL?M1M0e0`3Ih8?4@5iKbL>i0`000;ZX=@<0Red8Rl?XnQL000_0MBj;C@`;bG@5Pl<3RAV3
+ON`0M0gM1M0e0`23a41NFlW3g@G@=@<0fN23a41NFlW3g@DTC0<0PlA0GU_9`h\M]2X308^cH040
+08]528X8>0ie98^KV04008]c13?KRUP1IX\4GX?P0WD=g@DTC0<0PlA0GU_9`h]5288h<7D>Rl10
+PSP`M?Z9A@R=@02Q]2X308^0V04008]818]528XH3kKCIX\4DH?P0W@MRdGdSDgH>lQf2hPH@8U5
+m>\6SD00odG`odD8jlB;7K@Z0`2;Vf01~2RdD8RPPh2`n5G`000429A@R=GL@iGOAe6h8h<7DF
+RgG`SD00@4j2>31dnHUel8U528e00:6d:P<0Rh2H0@00RdP4RdD8RQP?]]=VR`AAPn02M1V;AOB=
+CMPkb7H9R1SoCO10RDGdodD8jlWlRdD8RP0lIG@8?4D?QJD0~2Red8@hUM23?0RP>3n2]d3X?h
+;G@2j`[7ANCoooooodD8XK@Z0`2;P9P1~2Rd04Red8<lV:2c?KIX\LB?K30WA2RDGPSD00RdgP
+RdD8RQP?]]=VR`AAPn023hA6~3RdGX?FIVIPIc4h7So`0008?S3`?0S@B00l>9ANSoA@S[aX_0
+RdD8B8U52?b:68;kIG@9P_]5M0A8jo7lRDD8adGT0@0008]530_0M0F;G@R968e5a3U5m7DPPgg\
+07@=g@DTC0<0PlA0GU_9`md5;4`308?4@5iKbL>1ONQVIVH63h9D~3PggT0GDXRdD@aP01Pgg\
+07@=g@G@=@<0PlA0GU_9`md5d3D30=WPPlA0GU_9`h]54<H00X=mk01d3Md594`308?4@5iKbL?M
+1Ba<0`23a41NFlW3RdGT3jm5j8]El0?@REG`RdGdaP00Pgg\07@BRdd@SDG4j9lL~2PlA0GU_9
+`h]=48]El8e5a>R:7000fN23a41NFlW3~=EH_\Pn`@SDgo<m;X=00008?44<W3SD00EH_\Pn`P
+SDgoj1h0~2fgg\PWgo07@:a`G`A0<00P000=]]k8?48<W3SD00EH_\DeJ3k529A@R9E@b9CA37
+AO00~3adGX~4adGT0@0008e=]8U=m<M5k040~2SDgIRDgL2m9d0XT2Rdd@aP40RcGl@`<0RdD8
+Rl0cdXX@IX\<EX?Q27@3@>_`RDD8ReD8<lV:2X?i:g@@PoT]M0C[38_0adG\~4odD8R`fd:P<0
+Rh6H0@00Rg04RdD8RP0?]]QVRaANPn823hFW0@00RhUP0@00>04?Q9T1~29Ol0~2PnQ9PoPU3hMk
+0@00obB5\?\109Sl0@0To@409?d102Cm0@0To@40B?`102Cm0@0To@409?d102Cm0@0To@409?d1
+02Cm0@0To@409?d102Cm0@0To@409?d102Cm0@0To@409?d102Cm0@0To@409?d102Cm0@0To@40
+9?d102Cm0@0To@409?d102Cm0@0To@40V?`102Cm0@0To@409?d102Cm0@18o040^@<0~2^Z`e
+0`2;G@R;`nQP4`002l0?QL00~2Rdd<2lUd1H?30hTIPgg\07@=fbeF=P<0PlA@GU_9`m\]ESH3
+0=WPPlA@GU_9`nV=~3o;T8~3^[0e0`2;G@R;`nP@4`002l1e;X]=30_9M0F3``R96H=mk01d3M\]
+JSH308?4D5iKbL?K;FXf0`3Ih8?4D5iKbL>i0`000;Zl=@<0Red8Rl?XbQ8000_0MBj;C@`;bG@5
+Pl<3RAV3ON`0M0gK;FXf0`23a51NFlW3fbeZ=P<0fN23a51NFlW3fbeXA0<0PlA@GU_9`h\M]2X3
+08^cH04008]528X8>0ie98^KV04008]c13?KRUP1IX\4GX?P0WD=fbeXA0<0PlA@GU_9`h]5288h
+<7D>Rl10PSP`M?Z9A@R=@02Q]2X308^0V04008]818]528XH3kKCIX\4DH?P0W@MRdGdSDgH>lQf
+2hPH@8U5m>\6SD00odG`odD8jlB;7K@Z0`2;Vf01~2RdD8RPPh2`n5G`000429A@R=GK@iGOAe
+6h8h<7DFRgG`SD00@4j2>31dnHUel8U528e00:6d:P<0Rh2H0@00RdP4RdD8RQP?]]=VR`AAPn02
+M1V;AOB=CMPkb7H9R1SoCO10RDGdodD8jlWlRdD8RP0lIG@8?4D?QJD0~2Red8@hUM23?0RP>3
+n2]d3X?h;G@2j`[7ANCoooooodD8XK@Z0`2;P9P1~2Rd04Red8<lV:2c?KIX\LB?K30WA2RDGP
+SD00RdgPRdD8RQP?]]=VR`AAPn023hA6~3RdGX?FIVIPIc4h7So`0008?S3`?0S@B00l>9ANSo
+A@S[aX_0RdD8B8U52?b:68;kIG@9P_]5M0A8jo7lRDD8adGT0@0008]530_0M0F;G@R968e5]3U5
+m7DPPgg\07@=fbeXA0<0PlA@GU_9`m\]`3D308?4D5iKbL>1ONQVIVH63h9D~3PggT0GDXRdD@
+aP01Pgg\07@=fbe<=P<0PlA@GU_9`m\]C3H30=WPPlA@GU_9`h]54<H00X=mk01d3M\]J4@308?4
+D5iKbL?K;L0e0`23a51NFlW3RdGT3jm5j8]El0?@REG`RdGdaP00Pgg\07@BRdd@SDFdj8\F~2
+PlA@GU_9`h]=48]El8e5]>Qf5P00fN23a51NFlW3~=EH_\DeN3k1S7AO00~3REGdmT880W@Ha`G`
+A0<020000<M5l?oooooYCP0008_0ReGdRe8hPn8>MAG71O140`0X~3adG`ooooon\^Rl2;EOB2
+NQX1MB>;DPR3hP5e4lL5l4@302T0~2adG`ooooon\8ReGdReY<RAZ3OO3oMA6;GOB2B`P2PlSo
+Pl@HGe_9`h]mm8=o@0=d58_IUh_Gj<hG~2Rl^9ANb;an\Bo8_IRm2;AOCXN?;ooh_;RDG\Pgg\
+07@7RdGdaT0J0SU=k7d:PlSoPl@HGe_9`h]5k8?465mKbL<0~<EH_\DeIGPSP0M42;3K@Z0`2;
+TKP1~22m9d<?b;f8_k<l23bOob[_OA:oV;LPccYW@56l23f?n;bi4;bGD7Rl9OGU_9`h\B2m9e
+dC?0GeiKbL<0~=EE=FEh_\ogD\ogDXogDTogDPDE9@j?`W~2RnEOGU]M`i0005F;k3?0bL<0~<
+EH_\<l39``00~;EH_\Dh?\18U528UE38=h@0=d>X]8A8?Q0WDbRdQ<2lUd:h_19Ol?~2M@eA\07X
+~4Pl@4j`^;A@R;@4cX_Ggooh]52<M0C000~2Red8Rd=4Pn0P3hEJ~3Pgd<00n5D00008]3;>RB
+OOooRd<`j8Ymoon;@b@;`7@6Rd\XRDPXRed8Rd<X2l1d2h]K98UH9>\DSD00RdD8RePTXK@Z0`29
+V;01~2RdD8Pl@4FlWYBWgooh?415_9``00~:EH_\EUN3k0b9A@R9E@b9CO@;dWD7adD<?3<308]m
+33?0PlWolZkgdDV1n@@1~2LQ?71O140`02~3<l23a0aOG\W3Pgd807D[^0@1~2j3R0oon9A@P;
+`7DCa`G`A0<03@0003?0Pl@<Gek9`lM5m0@1~2ogGdogD8JPGoM@b`1>P0~3Pl@@RDG`2l1d;X?h
+KgD>a`G`A0<00P000>\DRl371O140`0l~3RdG`Xl1<0`0c`8?435mNbL>;M@R2?P1d3ob2?Rme
+0lH6G4J2?P1elX]E28_j<l23bOob[_OABH8l2Uae48_j<l23bOob[_OABLH42P2;A@R3a0aOG\W3
+~?EH_\Dh?\78U5n<M5m000~2mT080W@Ea`G`A0<020000<M5m?ooooo[>X_0RdGhPWPJ0WDCa`G`
+A0<070000<M5m?ooooo[78]5n8]0>8?P2GDAa`G`A0<07P000<M5m?oooon3OOCoMA2;COR2B@P2
+PlSoPl@LFlW3RdghRe4@2m9d54Z9DA0c`8Y44AR9AOCYm@0008_0RdghPgU00`n4L`0008=i100?
+QDd0~2Rd4<?@0P~2L`?[1_bh020008_8RdGhRe0lj6[[oon9AO0;`7D?adGdooooonVZ~3SD00
+Rdg`ReghRe=<Rl?X_93oohU318];C8T;RdGhR`R=F@6963?KRQV9GOCoB0CYMP0008e008]5n89h
+=@5d1X9h=01e;KT1~3SEG_RdGhj07[ool;`7@=<m^:GNn9GOC[AXe00<M5m?ooooo[>Xe00;T1
+~3ReghRe<lRl?Xd^[oo`_0Rl=d6;T1~3SEG_j3N@oolcbHY=khU=m>\8o<M5m?oooon3OOCoM0N;
+AOS6@1X1RdGdPl@LFlW3~?EH_\Pn`8DeJ;l0nfbX?11K\1~3<l23nAl?Wl188mR;a]?SREghP_X7
+L`cgdh_88l^9COc[<Ob=B_Vj0@0003?KP_TO3io3Bb?Cdn:1h_l0~2<m^:F0^5fW@4RmS[1B]5
+n8_HREglRdGlGU_9`oaERnb3k0QCEX_`3kK:Pl45^`40~2<l23nAl?Wl188mR;a]?SREglP_X7
+L`b;b3?;RDghjcN=@02=B_Vj0@0003?KP_TO3io3Bb?Cdn:1h_l0~2<m^:F0^5fW@8RmP3GOc[
+1_`[AOb;f8UMn8]5n5iKbL?lEFRHg`40I?le~4RnaTRBd0~3DeIGPn`P<\V;`0nf`H\dQOA40`0;
+mPn4QP4008_ASD[i^040~2<m^2nAl?Wl=;8l?Ch8_:mm28AN<coh]Mj8e008Y63H?P7hU5k0n4
+5@4008_IR]>;a^PJooooRl^;f8Y@3H?R7c]Ek0n5k`0006J1N0kEY@n4h`0000_oMA\?]]6=59Gd
+A0<0REGTR`J90X]Ei8\BREG`j`N;1XT7RDG`<l2:@`gf`40?Q:<0~2Pgg\0GDUR]69CMb;aX?\
+2>Q2o_ooPl@8D;01j000~2RdgLPl@4jG`0~2RmV:dh_6j27noon;bh_HRU0=Pn8OPoX1OAF3b?n3
+a21OGU]TS`D0~3Pl@4GL>:@`gnb8Q33BGo~3P^2oR4<=P_T7LPJ:AN<P@`^2B`dP3kK1RaB5n4@3
+08TCRAb5n4@30<M31000~2P6<:06J1H`P00>\5o89>3D2;MO3[?8e008_nRcK[<h_0RGG`2ome
+4@nf`H\FRAB5m4@30>\7SD00R`J91hU=g8\fogG`\07X~4RdgLPl@42oH?QJ?noon9GNR;`D62
+nA0?PUcnoolc`8?485mNFfB?1@00~2Pl@4GL<0~;EH_\Dh?\18]H387kl0l007LVTnSXN_ooRlR;
+`hU8C0_9MDG71O140`0=~3^040~2Pl@4FlW3RmQZ4omc38e;C56`0nP0~3Pl@<2l2;`g@Ea`G`
+A0<03@000;P1~3Pl@4FlW3ReQ<RAPc`8?415_9``00~=EH_\DeIGPn`<PcP0MCR;lX_iRmRjH000
+0;P1~3j6d?~2RmJ;ci>9GO0;fgDPa`G`A0<03@000;P1~3Pl@<GeiKbL>;68UMl8=SA23f@Q01
+M0N;GO22Bd@4mT4@0G@7Reg`PT]44?I1409d3OI240Qd1h]Ml89;A@;f@A04M0gf@Q0@M0N;GO22
+BdD4mT4@27@7Reg`PT]528_`RcZ;GO29Nbb;NQB9Nc2:0HQ3=8Y10HQ3=H_6I\M3=_ooPWT10G@6
+mT8@17@IReg`aT<e0LM3@0<0~2ad<<~4ja>;`8]Ml<M3@040~2ad<<010008]Ml8=k@0=d8h]i
+48?W17D:RgT<RG\<ja>;`8]J48?S47D9RgX4Reg`RG\<ReT4ReG`REXhaT8J0<I2G0?7@UP0~3
+PcP0MC2948\M]2X308^K\04008UJ9<M2:000~2ReXT2m]d0hUC::6d:P<0Reg`RIR`0@00<l23
+a0aOGU_9``00~:EH_\Pn`PRlZARDgh^@X0~2SEG\j3\0~2RDGl^@80~2SEGh^6<0~2j1KPoonQ
+]2X3089890:hH`000>QGiOooPl@PbL<0~=EH_\Pn`\DeIGSEgeREglREGh2l1e4<H2<8e20LH0
+08_2GeiKbL>;GOa;REglaP<02l1m2h?i2WD6mmS60Re22l1d8X]eo8_0RmY>RoTcd_OgQmZCRX2H
+=P<0R0J;``_KMNJ9MOb;OOb;mc?0PlWolZkgdH_1Ro[1j@;cYH_8Pn43ljB;AOQOGU_9``00~;
+EH_\Pn`@EXU528U=40_BM@Dc`5k9`h=m401e1X?8oek9`hUEo88j07DARdD82l1d1FK7~3<l1N
+bL>Q]2X308^0D040088h0GDJRdD82l1d2h]Eo6HcbHX:IXT8^040~2G\W3XK@Z0`2;P:P1~2RDGh
+2l1e3LM5m?oooooYF0000?c7AO@0~3RgGhRPJ8AO4:`0n4@00008Y60HQ5l0[0M3J=@02;AOb:
+03Y5lG8>>TG`M`W7AO@1~3jaR;aXe`0XX>R4ga2\Ud2XY00hQ5l0[0MM29MOR3OOCoM@J3b?mN
+bL>3OO@0MAZ;M@P;mW@;RdglIS?0RP5VR@Jh0@0005k9`h=m409c1X?8oek9`h]520_0M1R;COb:
+4HQEld69COb:2HQ=lVJ;CO9VR@Rh0P0005k9``00~<Rd@T18]D90R;C2@<Pn`<j239oon3a0c3
+<lT?\a0CbH_1`hOKEH_\DE9@oeDDbL>@D>Qfe?ooQ`@T`hOKEH_\S<WX9@0008cIj1h0~2S<7X
+5`0008cQj100~2S>WX2@0008cAj080~2bL<[dPl3dHT@Pl04`i00EH_\DeIGPn`8RDD8RED<RcGl
+@`<0SD00<m^:66J;55j3hPQd0d3[l8U528]528X02\1d13`\M@fh0@0008?425mNFlW3RmV;A@SX
+d@d008_;RDD82l1e5lL5l4@300d0~2^040~2Pl@8GeiKbL<;bG@LRdD<ad0401000<M02000~2
+aT0<0LM041P0~2Red<a`<0~3RgD8RG<DRohc`8?9oo:^mm590o5>RGG`Ragl@`<0Rl0cbHX>IX\4
+Bh?P27@3C^_`RGG`RdG`@8U5l<H003?0Pl@8GeiKbL<0~<EH_\DeJ3k0b9A@R9E@b;2XU=m0_9
+3hBM~3PgT807@PmT0h0Pn4P0000<L5l4@300T0~2^040~2Pl@<GU_9`h]52?I0>08?Q5d0~2RdGd
+Rd0@Rc0;mW@hReg`SD00RaiF\07X~4Pl@42l1d6lL5l4@303`0~2Xl1<0`2h0@0008?435iKbL>;
+l`_KMLj;AOB;F1370`00~2ReP@REPDad0H~4RdGdod08jM00~2Rl2;G@Sf@cP1M1K71O140`0:
+~3^040~2Pl@<GU_9`kPT~3j7mdoon9AO@;`7DFa`G`A0<03@000;P1~3Pl@<GU_9`h]=38]em8Ta
+adH@~4RlKX1>Koo`_0RlId4NS]L?oo^040~2Pl@<GU_9`h]M28]3<>Sn2`00RegdRD<<2l1e4h_3
+j<E`oonh0@0008?435iKbL>;GOC7@`P1~3ad<4~4XK@Z0`2;P;P1~2R@<;`7@3REP4XK@Z0`2;
+GOB9V;P1~2<l23a0aNFlW3~=^040~2``00EH_\EUN3k0B;20_9M0J;D0B9D@B;B0@;bG@9Ra29
+4N\ASD00Ra2;3K@Z0`29TKP1~2Rg0@2oId6Xe008_>RoR;<E6`0NP0~3RlN3a0@;mWGYRo2;APcX
+2g3ooh_6Pl@4Gek9jOi_ool0~=EH_\DeIGRo2;gX_j\02ioooooo:^mm6;dB_jQm^7fi2\?01d
+2o:^:oX;bH_:M?6@RlI8:l=OGU_9`i00EH_\Pn`4DeIG2lUe1c?0GeiKbL>9COb;?Oa30`0cbHX:
+RQP?]_=VRha?10@006HiS7L41000RdglMC\:fg@gB@_9M3:9COa0@X\mo4<303?9RPZ:60nflfJ;
+S4l41000ISV<M`@4~2RdglM@T:fg@5B@_9MLj;?Oa30`0cfhXHIX^4G`@4~23ko0<m^:6VJ;W5l4
+10003koK:l=OGU_9``00~=EH_\DeIGPn`XRo:9CA29AO2;7Oa30`0cdXX@<lUVR`aCRmKf`@Qd
+6h_`Rl2;n4Hc`8X6<lUVR`a3RlOf`@Qek8Uel<M5k000~2Reg`PS\]M@k7AN`1~3@hUMl>\=o8]M
+l88k:gD4@hUMl8_JRo2=CMR;EA2;AO3X5PX008_CRlH;dW@@PggT07@8RegHRA[[0ob90X=mj01d
+5<L5l4@30040~2<l23a2QOGU_9`h=mk01d<h=mh01e2H5mg000081f5lL5l4@30080~2^0000823
+a2QOGU_9`h]5g?OHPl@XGeiKbL>3ON00M@V1OMcooomoMQO71O140`02~3^?ooogn3a2QOGU_9
+`h]5g8?4:5mNFlW3~>EH_\DeIGPn`XRo:9CA29AO2;7Oa30`0cdXX@<lUVR`aCRmKf`@Qd6h_`
+Rl2;n4Hc`8X6<lUVR`a3RlOf`@Qek8Uel<M5k000~2Reg`PS\]M@k7AN`1~3@hUMl>\=o8]Ml88k
+:gD4@hUMl8_JRo2=CMR;EA2;AO3XkPP008_CRlH;dW@@PggT07@8RegHRA[[0ob90X=mj01d5<L5
+l4@30040~2<l23a2QOGU_9`h=mh01d5LL5l4@30080~2PlSoPl@XGeiKbL>3ON`0M0f;AMcgf8?4
+:5mNFlW3RdGLPl@XGeiKbL<0~>EH_\Pn`4RDGlR`gl@`<0<m::46J;S5420P00R0P:bG@LSD00
+@8\=o4<303?BRQ1VRhaA0P8008P82\Ueih]5o<W3~>EH_\Pn`4DlM5o?ooooof@PP2M1371O14
+0`08~3jF40~2o89j6P9e5\L5l4@30240~2PTX80^U7~3SD00RdXhPn49MA371O140`0N~3PTX8
+0^\\PgX@0W8>a`G`A0<07`000>\JRl2;BQ2=F@69FQ28A0XHaT8J0H9R2?j9AOb;AOaKbL<0~=
+EH_\Pn`@EXUE38U=40_BM0@;`7D5<l1NbL>;CA29COb;5K@Z0`2;TU01~2PSX13hE;~32lT?Q2\1
+~2SD00Rdd<IX\9IXU=lX9ml`1d1X?8oek9`h9mlP1e2<H00>T40@00RTgbR0R;COa9RDglPdD<
+0T0;bGG7jNX0~2Rl23OO`03hCN~3Rl2;C@aVR`UVRDgbPWgc07DHRTgbR0Q02\T?Q;h0~2odgl
+jJP0~2Rl2;3K@Z0`2;RJP1~2RDgh2lUe3LM5m?oooooYF0000?c7AO@0~3RgGhRPj8CO4:b@n4
+@00008Y>0HQ=l0[9M3J=@02:CO<jCO5b43Y=l7L;adGd0@000>\JRl2;cXea0XXFR5Ga2]9d2XY9
+0hQ=l0[9MM29MOR3OO@1MB>;COb3n@9b;hYElhP@SG01RUGbR1J3j@:9COb3`0;[2He008?8oek9
+`h=530:3OO`03hDTooooRdD@:dGlG\W3~?EH_\Pn`<D`_0M@Dc`5_9`fJ9EOJ2OOL0M@f:COJ8
+2;P1~3FlW3R`fd:P<0RhU@0@00PST1M@J3b?mKbL>;3K@Z0`2;RJP1~2RDgl2lUe3lM5n?oooooY
+FP0008e00<M5n000~2RdglRQ68EOD:dPn4@00008YA0HQEm0[BM3J=@02:EOLjEOEb43YEm7L;
+adGh0@000>\JRl2;dHe:0XXIR5ge2]]d2XYB0hQEm0[BMM29COb3OOP1MA>:GON8642:GOJ86;P2
+~3FlW3PlSoFlW3~>EH_\Pn`<<lTcd[QR~3j2CDoolc`8?43<W3~=EH_\<l39`oaERn`c`<W3~=
+EH_\<l39``00~;b0h005JKfGglVmT]b3H309_Kh]W^PoX0O0j1nX0C~23hfU~3j`b1nX3\ool?
+SY80~2Ro2h~4[3`0M13L3L0f0`0T3hU5m=Y5m>_[PoX0M5ao;oOJRl:3h3l3`8d4P=^Xf3H30=ki
+Rl8U`1l007@m`NP60l2=183KZ5Pi0`3NnN\[Rl:3h3l3`8d4P=^Xf3H30=k9Rl8U`1l007@@`NP6
+0l2=183KZ5Pi0`3NbM\]C3H30=SIVmoPWW@DVmoPZ11d4<H10^\;gMSK;D`f0`360@6Kfn:KfFgl
+G\W3T0000<P<~2EY_IOObKfBgD=P<0Vm_RfNj3nP1l2X7j008007ekj`b1nP3nool?SXH0~2Ro2h
+~4[3`0M13L3L`f0`0T3hU5m=Y5m>_[Rl:3n01d>7l2mmR;l8?P?`?0S@B0fjSH=P<0RlHU`040
+07@@`NP60l2=183KZ5Pi0`3NbH?j07d4g_W[0]k9gEgdgDGdg1GP=@<0VmoPWWH=gMSM1NPe0`36
+0@7[3m`Ef3D309_Oh9ic0lH10Y_KhY_IKOaNbL>@EFRHg`40I?le~4RnaTRBd0~3DeN3k0R;fPn_
+f8_3j<EZoon;b8U=m0_9M1`cdXYAoOK287@B<l2;nH_;`NT2lj^;bh?Q0o>ZRdGdPl@8Ge]TS`D0
+~3Pl@4GL<0~;EH_\DeIGPn`\RDD8RmR9E@b9CA37ANP0~3REG`Rd\<>D\43i?02\1d:8]CC8_3
+j<n@oon;bc]137@8Pl@\GeiKbL>;A@R;F4b96<M01000~2ReD8PgY00Pn56`4008]J32]J18UM
+i8]Ml8_k^0X0~2RgD@Rlh;i?:^SGooM08coh_>2omd<h_go8_6:l<[b8eN0G@OSE7oRo^h2P00
+08_:2nCb[Xeoog@2<on;bX_g2omeeXUMl8U=48]El8]e32_FREG\2m8?QZ`0~2>eGT3hMD~3Red8
+Rc^;`X_8`NT2ljF;b8?Q0o>TRlZ;0`?1R@<3B`B9B`B;Ddb;`nSoSooo>d<4M0R3a2aOGU_9`h]5
+28]HC8THad04~4RdG\RDGXjDl0~2Red8Rd\42lUf9X]CC8_3j<B?oolk@`Ad28?4;5mNFlW3RdD8
+ReQ<RAS7@0@0~3Reg\Rl^;E@b;A@SXV8ooohU5j3_3M0R3a2aOGU_9`h]=40_93hJe~3RgGXRegP
+RdD8o8]@32]@18UEi3_AMPN;fN\6SD00RegTRGGDRDgHRl^9CNb;>8]El8_bRDgL`NT2ljF;bh]M
+e8?Q0o>TRdgHRggLRo>;60?ORAP3ehUEl8]H10?OREP4:ll3mh]@33_J3i?32]^;gg@h2lUf=8U=
+g8_:RoR;EdcXnHkooh]=g9N;D0`knW@>RlL3aR_2Pl@\GeiKbL>;D4b94<M01000~22lT?QeSo
+oon9MNR;ANR3a2aOGU_9``00~<EH_\EUN3k0R;d8_j<l23bOob[X_jmm59@H_1j0aXoon;d8_7
+REGd2m9d7H_g<l23bOob[_OARl6;n\7Y0_>URlR3h@?cY>\:a`G`A0<03@0008]5m8?425mNbL<0
+~;EH_\Pn`DDeIGRDD8RED<RDd@ad4@~4ad4<~4ad48~4ad44~42m9l2X?j0G@5PoXTOPn;AA37
+@101~3GeiKbL>3O@`03hE_~3RdD8PSP`3hEG~3@8U528X0?7Qd13aHMC6Q]2X308^0V04008]@
+18]5240cfhXH<lUVR`aJm\41M129A@S7A@`@~3jF@0~2o8]54<M03040~2adD<20000>U=~3Rl37
+A@`:~3jCl0~2Pgd<47DiRdD8PSP`MC6:@04lN7@4?5Qe9Z6d:P<0Rh2H0@00RdP4RdD8Pl02<m::
+43?KIX\LDOK30G@3RDD8adGl~4Red<PlSo<m;glhU5n8UEm3?KRdD8RgG`Rl29GNb;3K@Z0`2;
+RIP1~2RgT4RPP?]]TcdVJ;55n;GNcf`P9d3h7Qo`0008_aPnh`jcN;`8\=]2X308^9V04008]i
+13?9RPR=34lcdVJ;4OK60G@@IX^a10@000nomX?^En\6o;kooomoRdd<>lif>8]=4<M13040~2
+Rdgh>mUg2C_IMA<kMOAf3X]=4<M12040~2<m_[2X_;Red<3joI0mi0jESooon9GOb9A@R;CA2;
+EOb9D@B;E@R94EmNFlW3~?EH_\Pn`XDhU520_BMC>;fVXHSDgHDFX1D;04j000~2Rm>3a129AO`;
+`7@@a`G`A0<05`0008?8oe_9`c?0FlW3PoX6M@[7AOQ28000jc7lPoX4M@_7AOQ08000jb:;`8?j
+0WD;adGh@B000>\BRl371O140`0T~3PlSoFlW3JP3oMOQZ0FX0JP2=CO1ASDgdDOme2;08j000
+~2Pl@PRDGl2l1e4_mem;01j000~2Pl@4<l1KbL>;AOb3n09d3h?h0g@:PoQkM0F3n6ie3<L5l4@3
+01L0~2jbj;AOb3n0Ed1H?h87D?a`G`A0<060000>\ESD00a`G`A0<0?00008]5o:?0C0<0PlSo
+FlW3~<EFRHg`40I?le~4RnaTRBd0~3Pn`HRDGl2l1e7<L5l4@300`0~2PlSoPl@HI8l5~4Pl@4
+GL>;AOb2N3D0M1O71O140`0W~3adGhooooonUO~3o8]5o8]888U=n?I0>0Ad2LM5m0@0~2j`O7
+AO@0~3RdGlPWPd0GD<adG`0P000>\:SD00adG`~4RdglmT5587@8^100~2j`?l<l2;EO@;EO0;
+d8]5n>P62000RdGhPl@HI8l5~4Pl@4GL<0~;EH_\Pn`8SDghDHe=o56;b56`0nP0~3Pl@<2l1e
+5H]=o87Qo`0008?i0GD7^040~2bL<c`<W3~<EH_\Dh?\68U5287j080007@KPOX0@000M1?71O14
+0`0T~3PlSoPl@HFlW3RmZ=AOA@SDGhD8]5252`0nP0~3Rm>3a0`;`7@Ca`G`A0<0:`0008?8oh?4
+65_9`h_JRdD8j6`7~2Rm=VRDG^mTGho`nE`H7Qo`0008U=l87j080007D6<l3[1h_0^080~2IX]M
+kVJj701V8m<?_m8;AO0;d8]52>Sh1P003koKm\<2M0Rk04000>\6o;\0P000Rl>3a1QKbL<0~>
+EH_\Dh?\;8U528UE36XHSDgHDFX1D;04j000~2Pl@@2l1d4lL5l4@301L0~2PlSoPl@\FlW3Red<
+I\M30P00I\M32000I\M32P00SEGHRl?XAPL006K7@`@003?0IX]5k?K047@=I\M31<11jI80~2
+Rl1VRdG\Pn083hF3~3RdD<IX]H16J1b`21IXUH16J;CNb3h@5e1h3;P6J9F0B;C@R9COR2>@1d
+2D62>@1enXU=n8]5n8eHo8UMn3]M27I1PS\^MA6j@3<308?X0nR_1`002l1d9;Y4<`<0Regh@h_3
+j9\7~22l2;`g@>^TPc0`3XR`L000_0M@N;A@b2B0A0Ragl@`<0RdD8<lV:26J;W4\41000IX_;
+P_UQLR>2nGYg7X9h0CYe687So`0008?[HH]536J9F0aVRAS[8he008e=l56=COAA\0;X~4Pl@8
+ReGdBX]=36J9D@aVRA4c`8?4;5_9``00~:EH_\Pn`dRED<JP1X4B0006X1JP1Z08e=n56=COaA
+D;08j000~2Pl@PIXU5mVH;`7@_IX?h17D<a`G`A0<06@000>\EIX=mmVh?UL0Uo`0008?05j?`
+A0<0PlSoPl@dbL=Z68e=g55Z0Omeo;04j000~2Pl@@IXU5mVH;`7@Ya`G`A0<0?00002Goo`00
+Xl1<0`3oMOb`0NP0~3Pl@4PlSoPl@dbL>3O@`03hGF~3SDg@DK01j000~2Pl@4IXU5mVH;`7@Y
+a`G`A0<0?00002Goo`00Xl1<0`3oMOb`0NP0~3Pl@4PlSoPl@dbL<c`8Y5e8Y=i8;Qh2@O2\R8
+CN@c`8Y5eFJ;CNAVPN4Oo\7P1FHUo`5V2lQVRDgT<l1VRdGF;K`7~2RTgUP>41dN0:b8Q=iC?0
+RTGBVH?R0@?2dOR:CNJ2hN0T7`[8R4gV<l2:AM5VRdgVIX7Q7oS1h0EV9Ol7IP_8IXU=iS?0RTG@
+RTgWP>47`N032\R8CNOYT00008_0RdD<Pl04j0eNoon;b8]138YEi8;Rh2@O2]28ENB;@A10IX]E
+i6J1hQon`N05IRGo0FH;d6J9ENB;@AB3j52:ENF0hP7Ah0[@R5GUR`6ITX?P0@?@dOZ:ANHTh8;R
+7`[2R4GVRe44IX]5iVHU7oS1hPEVPN;o1fH;`VJ9ANJ;@@R:CNN0h@O1h0<:b8Q=ifXHSDgLDFX1
+ogGl\0CX~4Pl@@IXU5mVH;`7@Ya`G`A0<0?00002Goo`00Xl1<0`3oMOb`0NP0~3Pl@4PlSoPl@d
+bL?oMOb`0NP0~3Pl@4IXU5mVH;`7@La`G`A0<0?00002Goo`00Xl1<0`23b?n3a3C9`c?0Pl@d
+bL<0~=EH_\Dh?\13goo`00O`@;`7d8<l23a0AKbL>3?CQ<0`00MAF;f>Pj0@002l2;`gD8<l23
+a0AKbL>;7CQ<0`0i@cao5H_Hj280~22l2;`g@8<l23a0AKbL>;7CQ<0`2=18>3`423a0AKbL>;
+`5EXV=l106Co=@00~2Rnb3k1QTRBd0~3Dh_HSDg\DK01j000~2<\3X~4Rl>3a0@;`7DMR`dhC0<0
+RDgladGh01000<M5m?03~2jD\0~2o8\=>4`308]I?3_HObn=39V3`D29COa0:l?1h098VH7Ro`l0
+00?2`OP<@<7P38U5n<M5m004~2ja6=@037AO`0~3adG`~4Rdgl2lUd:FP@1000ogGhDK03j000
+~2Pl@<RDG`2l1e3h\=>4`308]A?0=Em8UA?3;0j000~2SDgXDK01j000~2Pl@4RdG`Fh_UI8l5
+~4Pl@4GL>=@01EJ9SO0@1TocD0~3RnaTRBd0~3Pn`lSDgXDK01j000~2<\3X~4Pl@4PcdhC0<0
+00n5i`0008e=k56=CNAA\0;X~4^B@0~2SEG@RdG\R`3X@>Cooh?428e=d8U=m89md01d2_a1PST0
+MOZ9COC7AOa<<`<0PSe<<`<007@C^D`c0`2;`462>@1enXU=o8e008]5o8e8ohU=o88i;WD6PnP2
+RDGlRdgdBHU=m8X1ReGlR0:=EM0kbWOGJP=XC3<308e=n56`0nP0~3Pl@<RDG`2l1e2h]=n8T=
+>4`30>\jPgg`0WDdJP=X010406Q<<`<0SDghDK04j000~2Pl@@RDG`2l1e4h]=n8T=>4`303?0
+j>Wmoon9AO0b`>P0~3SDgPDK01j000~2Pl@4XCQ<0`23a3aTS`D0~3Pl@4GL?lEH_\Dh?\28_J
+j4;moon;dhU5n0_0M@YVPlSoPl@8FlW3RdGhIXT@IX_2Pl@8FlW3EH_\Pn`8j1Gmoon9AO`;`7D8
+IS?0Pl@8bL>;COaVR`63a0S9`he005F;k5>3k0R;f^SZo?ooRm>9AOP;`7D:IX?8oh?425_9`h]5
+n6H;46J946J;`X?425_9`oaERnaCPn`8Rm[X]_cooh_CRDGh2l1e23?0Pl@8FlW3RdGh3kl03koB
+QM0?UL0Uo`0008?425_9``00~:EH_\DeN3k0b;fX_h<lV=D`R=@`[X?`0008U768_8SE<4SD<6
+j2l0~2RDLDRdlHRm>=@`;X7`0008_CRlR;ahU878]:38U846K7@0H108?435mKbL>=@01ERnb3
+k2QVPcX0MA5VPcP0M@\;bG@7Rl63a2S9`hX8Pn4OdN69CMaVR`R1hOl7~2`NT5RDgPRTP1PN7o
+~3`NT3RDgTRPZ3hAn9CNQVR`Z1hOl1~2`NT5BHU=k8Y:0H7Qo`000=7YPl5@RDg`adGlooooohe5
+g>QOZOooPl@XbL<0~=EH_\Pn`4DeIGRlZ;7Oa30`0cdXXARDglRPP?]_UVRkAC10@008]Eo6Hi
+]7\41000MCD:bG@aRl10SEX1R`gl@`<0<m::4hUMo8XH3kKkIX^dD@@4~2ReGlISVdN@@4~2M@@:
+fgGARcgl@`<0<m^:66J;Q5l410003ko0<m^:6VJ;W5l410003koK:l=OGU_9``00~<odeCAe=5
+Ac<b0060~2E2T108d5:2T2051ERnb;A@B7A@R9A@AMj@00~2o`00ool0~9
diff --git a/support/vvcode/checkos.h b/support/vvcode/checkos.h
new file mode 100644
index 0000000000..630b1b15c3
--- /dev/null
+++ b/support/vvcode/checkos.h
@@ -0,0 +1,476 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "checkos.h",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet)",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+** MODULE CONTENTS
+**
+** [tbs]
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+
+
+/*-
+******************************************************************************
+******************************************************************************
+**
+** OPERATING ENVIRONMENTS SUPPORTED
+**
+******************************************************************************
+******************************************************************************
+*/
+
+
+/*-
+**============================================================================
+** Reset the operating system macros
+**============================================================================
+*/
+#ifdef OS_MSDOS
+# undef OS_MSDOS
+#endif
+#define OS_MSDOS 0
+
+#ifdef OS_OS2
+# undef OS_OS2
+#endif
+#define OS_OS2 0
+
+#ifdef OS_UNIX
+# undef OS_UNIX
+#endif
+#define OS_UNIX 0
+
+#ifdef OS_VAXVMS
+# undef OS_VAXVMS
+#endif
+#define OS_VAXVMS 0
+
+#ifdef OS_VMCMS
+# undef OS_VMCMS
+#endif
+#define OS_VMCMS 0
+
+
+
+/*-
+******************************************************************************
+******************************************************************************
+**
+** MS-DOS implementations
+**
+******************************************************************************
+******************************************************************************
+*/
+
+/*-
+**----------------------------------------------------------------------------
+** Reset the MS-DOS specific macros
+**----------------------------------------------------------------------------
+*/
+#ifdef MSDOS_MSC
+# undef MSDOS_MSC
+#endif
+#define MSDOS_MSC 0
+
+#ifdef MSDOS_TURBOC
+# undef MSDOS_TURBOC
+#endif
+#define MSDOS_TURBOC 0
+
+/*-
+**----------------------------------------------------------------------------
+** Microsoft C defines the macros MSDOS and M_I86 but since it also defines
+** them under OS/2, we check also that OS2 is not defined.
+**----------------------------------------------------------------------------
+*/
+#ifndef OS2
+# ifdef MSDOS
+# ifdef M_I86
+# undef OS_MSDOS
+# define OS_MSDOS 1
+# undef MSDOS_MSC
+# define MSDOS_MSC 1
+# endif /* M_I86 */
+# endif /* MSDOS */
+#endif /* NOT OS2 */
+
+/*-
+**----------------------------------------------------------------------------
+** Borland Turbo C for MS-DOS defines the macros __MSDOS__ and __TURBOC__
+**----------------------------------------------------------------------------
+*/
+#ifdef __MSDOS__
+# ifdef __TURBOC__
+# undef OS_MSDOS
+# define OS_MSDOS 1
+# undef MSDOS_TURBOC
+# define MSDOS_TURBOC 1
+# endif /* __TURBOC__ */
+#endif /* __MSDOS__ */
+
+
+
+/*-
+******************************************************************************
+******************************************************************************
+**
+** OS/2 implementations
+**
+******************************************************************************
+******************************************************************************
+*/
+
+/*-
+**----------------------------------------------------------------------------
+** Reset the OS/2 specific macros
+**----------------------------------------------------------------------------
+*/
+#ifdef OS2_MSC
+# undef OS2_MSC
+#endif
+#define OS2_MSC 0
+
+#ifdef OS2_CSET
+# undef OS2_CSET
+#endif
+#define OS2_CSET 0
+
+#ifdef OS2_EMXGNUC
+# undef OS2_EMXGNUC
+#endif
+#define OS2_EMXGNUC 0
+
+#ifdef OS2_GNUC
+# undef OS2_GNUC
+#endif
+#define OS2_GNUC 0
+
+/*-
+**----------------------------------------------------------------------------
+** The IBM C Set/2 compiler defines the macros __OS2__, __IBMC__ & __32BIT__
+** When the migration library is being used, the macro __MIG__ is also
+** defined.
+**----------------------------------------------------------------------------
+*/
+#ifdef __OS2__
+# ifdef __IBMC__
+# ifdef __32BIT__
+# ifdef __MIG__
+# undef OS_OS2
+# define OS_OS2 1
+# undef OS2_CSET
+# define OS2_CSET 1
+# endif /* __MIG__ */
+# endif /* __32BIT__ */
+# endif /* __IBMC__ */
+#endif /* __OS2__ */
+
+/*-
+**----------------------------------------------------------------------------
+** The OS2 Makefile defines the macro OS2. Eberhard Mattes' implementation
+** of EMX and GCC 2.1 also defines the macros __GNUC__ and __EMX__.
+**----------------------------------------------------------------------------
+*/
+#ifdef OS2
+# ifdef __GNUC__
+# undef OS_OS2
+# define OS_OS2 1
+# undef OS2_GNUC
+# define OS2_GNUC 1
+# if __EMX__
+# undef OS2_EMX
+# define OS2_EMX 1
+# endif /* __EMX__ */
+# endif /* __GNUC__ */
+#endif /* OS2 */
+
+/*-
+**----------------------------------------------------------------------------
+** The OS2 Makefile defines the macro OS2. The Microsoft C v6.00 compiler
+** also defines the macros _MSC_VER and MSDOS (??).
+**----------------------------------------------------------------------------
+*/
+#ifdef OS2
+# ifdef MSDOS
+# ifdef _MSC_VER
+# undef OS_OS2
+# define OS_OS2 1
+# undef OS2_MSC
+# define OS2_MSC 1
+# endif /* _MSC_VER */
+# endif /* MSDOS */
+#endif /* OS2 */
+
+
+
+/*-
+******************************************************************************
+******************************************************************************
+**
+** Unix implementations
+**
+******************************************************************************
+******************************************************************************
+*/
+
+/*-
+**----------------------------------------------------------------------------
+** Reset the UNIX specific macros
+**----------------------------------------------------------------------------
+*/
+#ifdef UNIX_BSD
+# undef UNIX_BSD
+#endif
+#define UNIX_BSD 0
+
+#ifdef UNIX_BSD41
+# undef UNIX_BSD41
+#endif
+#define UNIX_BSD41 0
+
+#ifdef UNIX_BSD42
+# undef UNIX_BSD42
+#endif
+#define UNIX_BSD42 0
+
+#ifdef UNIX_BSD43
+# undef UNIX_BSD43
+#endif
+#define UNIX_BSD43 0
+
+#ifdef UNIX_GNUC
+# undef UNIX_GNUC
+#endif
+#define UNIX_GNUC 0
+
+#ifdef UNIX_MSC
+# undef UNIX_MSC
+#endif
+#define UNIX_MSC 0
+
+#ifdef UNIX_SYSV
+# undef UNIX_SYSV
+#endif
+#define UNIX_SYSV 0
+
+/*-
+**----------------------------------------------------------------------------
+** The Unix Makefile defines the macro BSD43 for BSD 4.3 systems.
+**----------------------------------------------------------------------------
+*/
+#ifdef BSD43
+# undef OS_UNIX
+# define OS_UNIX 1
+# undef UNIX_BSD43
+# define UNIX_BSD43 1
+#endif /* BSD43 */
+
+
+/*-
+**----------------------------------------------------------------------------
+** The Unix Makefile defines the macro BSD42 for BSD 4.2 systems.
+**----------------------------------------------------------------------------
+*/
+#ifdef BSD42
+# undef OS_UNIX
+# define OS_UNIX 1
+# undef UNIX_BSD42
+# define UNIX_BSD42 1
+#endif /* BSD42 */
+
+
+/*-
+**----------------------------------------------------------------------------
+** The Unix Makefile defines the macro BSD41 for BSD 4.1 systems
+**----------------------------------------------------------------------------
+*/
+#ifdef BSD41
+# undef OS_UNIX
+# define OS_UNIX 1
+# undef UNIX_BSD41
+# define UNIX_BSD41 1
+#endif /* BSD41 */
+
+
+/*-
+**----------------------------------------------------------------------------
+** The Unix Makefile defines the macro SYSV for Unix System V
+**----------------------------------------------------------------------------
+*/
+#ifdef SYSV
+# undef OS_UNIX
+# define OS_UNIX 1
+# undef UNIX_SYSV
+# define UNIX_SYSV 1
+#endif /* SYSV */
+
+
+/*-
+**----------------------------------------------------------------------------
+** If any of the UNIX_BSDxx macros were set, we define a the macro UNIX_BSD
+**----------------------------------------------------------------------------
+*/
+#if (UNIX_BSD41 || UNIX_BSD42 || UNIX_BSD43)
+# undef UNIX_BSD
+# define UNIX_BSD 1
+#endif /* (UNIX_BSD41 || UNIX_BSD42 || UNIX_BSD43) */
+
+
+/*-
+**----------------------------------------------------------------------------
+** The Unix GNU C compiler defines __GNUC__
+**----------------------------------------------------------------------------
+*/
+#if (OS_UNIX)
+# ifdef __GNUC__
+# undef UNIX_GNUC
+# define UNIX_GNUC 1
+# endif /* __GNUC__ */
+#endif /* (OS_UNIX) */
+
+
+/*-
+**----------------------------------------------------------------------------
+** The Unix Makefile defines MSC when the SCO Unix Microsoft C compiler
+** is used
+**----------------------------------------------------------------------------
+*/
+#if (OS_UNIX)
+# ifdef MSC
+# undef UNIX_MSC
+# define UNIX_MSC 1
+# endif /* MSC */
+#endif /* (OS_UNIX) */
+
+
+
+/*-
+******************************************************************************
+******************************************************************************
+**
+** VAX/VMS implementations
+**
+******************************************************************************
+******************************************************************************
+*/
+
+/*-
+**----------------------------------------------------------------------------
+** Reset the VMS specific macros
+**----------------------------------------------------------------------------
+*/
+#ifdef VMS_GNUC
+# undef VMS_GNUC
+#endif
+#define VMS_GNUC 0
+
+#ifdef VMS_VAXC
+# undef VMS_VAXC
+#endif
+#define VMS_VAXC 0
+
+/*-
+**----------------------------------------------------------------------------
+** The VAX/VMS C compiler defines the macros VMS and VAXC
+**----------------------------------------------------------------------------
+*/
+#ifdef VMS
+# ifdef VAXC
+# undef OS_VAXVMS
+# define OS_VAXVMS 1
+# undef VMS_VAXC
+# define VMS_VAXC 1
+# endif /* VAXC */
+#endif /* VMS */
+
+/*-
+**----------------------------------------------------------------------------
+** The VAX/VMS GNU C compiler defines the macros VMS and __GNUC__
+**----------------------------------------------------------------------------
+*/
+#ifdef VMS
+# ifdef __GNUC__
+# undef OS_VAXVMS
+# define OS_VAXVMS 1
+# undef VMS_GNUC
+# define VMS_GNUC 1
+# endif /* __GNUC__ */
+#endif /* VMS */
+
+
+
+/*-
+******************************************************************************
+******************************************************************************
+**
+** VM/CMS implementations
+**
+******************************************************************************
+******************************************************************************
+*/
+
+/*-
+**----------------------------------------------------------------------------
+** Reset the VM/CMS specific macros
+**----------------------------------------------------------------------------
+*/
+
+/*-
+**----------------------------------------------------------------------------
+** The VM/CMS make EXEC defines the macro VMCMS
+**----------------------------------------------------------------------------
+*/
+#ifdef VMCMS
+# undef OS_VMCMS
+# define OS_VMCMS 1
+#endif /* VMCMS */
diff --git a/support/vvcode/decode.xlt b/support/vvcode/decode.xlt
new file mode 100644
index 0000000000..85c932d798
--- /dev/null
+++ b/support/vvcode/decode.xlt
@@ -0,0 +1,29 @@
+#-----------------------------------------------------------------------------
+# TEST.XLT
+# ~~~~~~~~
+# Test translation table file
+#-----------------------------------------------------------------------------
+xlt-from BIT-REVERSED
+xlt-to ASCII
+xlt-substchar 042 # asterisk
+#
+255 254 253 252 251 250 249 248 247 246 245 244 243 242 241 240 # 255 - 240
+239 238 237 236 235 234 233 232 231 230 229 228 227 226 225 224 # 239 - 224
+223 222 221 220 219 218 217 216 215 214 213 212 211 210 209 208 # 223 - 208
+207 206 205 204 203 202 201 200 199 198 197 196 195 194 193 192 # 207 - 192
+#
+191 190 189 188 187 186 185 184 183 182 181 180 179 178 177 176 # 191 - 176
+175 174 173 172 171 170 169 168 167 166 165 164 163 162 161 160 # 175 - 160
+159 158 157 156 155 154 153 152 151 150 149 148 147 146 145 144 # 159 - 144
+143 142 141 140 139 138 137 136 135 134 133 132 131 130 129 128 # 143 - 128
+#
+#
+127 126 125 124 123 122 121 120 119 118 117 116 115 114 113 112 # 127 - 112
+111 110 109 108 107 106 105 104 103 102 101 100 099 098 097 096 # 111 - 96
+095 094 093 092 091 090 089 088 087 086 085 084 083 082 081 080 # 96 - 80
+079 078 077 076 075 074 073 072 071 070 069 068 067 066 065 064 # 79 - 64
+#
+063 062 061 060 059 058 057 056 055 054 053 052 051 050 049 048 # 63 - 48
+047 046 045 044 043 042 041 040 039 038 037 036 035 034 033 032 # 47 - 32
+031 030 029 028 027 026 025 024 023 022 021 020 019 018 017 016 # 31 - 16
+015 014 013 012 011 010 009 008 007 006 005 004 003 002 001 000 # 15 - 0
diff --git a/support/vvcode/descrip.mms b/support/vvcode/descrip.mms
new file mode 100644
index 0000000000..2bd1c8156d
--- /dev/null
+++ b/support/vvcode/descrip.mms
@@ -0,0 +1,186 @@
+##############################################################################
+##############################################################################
+##
+## ARCHIVE HEADER INFORMATION
+##
+## @MMS-Description-File{
+## FILENAME = "descrip.mms",
+## VERSION = "1.00",
+## DATE = "",
+## TIME = "",
+##
+## AUTHOR = "Niel Kempson",
+## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+## TELEPHONE = "+44-242 579105",
+## EMAIL = "kempson@tex.ac.uk (Internet)",
+##
+## SUPPORTED = "yes",
+## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+## KEYWORDS = "VVcode",
+##
+## CODETABLE = "ISO/ASCII",
+## CHECKSUM = "51492 1481 5732 57976",
+##
+## DOCSTRING = { This is the VVCODE description file for use with
+## the VAX/VMS Module Management System (MMS) - DEC's
+## equivalent to Make.
+## }
+## }
+##
+## MODULE CONTENTS
+##
+## [tbs]
+##
+## COPYRIGHT
+##
+## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the terms of the GNU General Public License as
+## published by the Free Software Foundation; either version 1, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+##
+## In other words, you are welcome to use, share and improve this
+## program. You are forbidden to forbid anyone else to use, share
+## and improve what you give them. Help stamp out software-hoarding!
+##
+## CHANGE LOG
+##
+##############################################################################
+##############################################################################
+
+
+##############################################################################
+#
+# Local definitions for file types and compilation / linking.
+#
+# If your system is already supported it should not be necessary to modify
+# any part of the description file except the local definitions below.
+#
+# COMPILER/LINKER
+#
+# CC the command used to invoke the C compiler
+# CFLAGS compiler command line flags to be used
+# CCDEFINES symbols to be #defined when compiling
+#
+# LINK the command used to invoke the linker
+# LINKFLAGS linker command line flags to be used
+#
+# The definitions are used to compile and link as shown below:
+#
+# Compiling C programs (e.g. xx.c)
+#
+# $(CC) $(CFLAGS) $(CCDEFINES) xx.c
+#
+# Linking object files (e.g. xx.obj, yy.obj & zz.obj)
+#
+# $(LINK) $(LINKFLAGS) xx.obj,yy.obj,zz.obj,vvcode.opt/OPTION
+#
+# where vvcode.opt contains the single line:
+#
+# SYS$LIBRARY:VAXCRTL/SHAREABLE
+#
+# Here are some examples known to work.
+#
+# VAX/VMS C v3.1
+#
+# CC = cc
+# CFLAGS = /WARNINGS /STANDARD=PORTABLE /DEBUG /NOOPTIMIZE
+# CCDEFINES =
+#
+# LINK = LINK /TRACEBACK /NODEBUG
+# LINKFLAGS = /TRACEBACK
+#
+##############################################################################
+# Start of local definitions.
+##############################################################################
+CC = cc
+CFLAGS = /WARNINGS /STANDARD=PORTABLE /DEBUG /NOOPTIMIZE
+CCDEFINES =
+
+LINK = LINK /TRACEBACK /NODEBUG
+LINKFLAGS = /TRACEBACK
+##############################################################################
+# End of local definitions.
+##############################################################################
+
+
+#############################################################################=
+# File types and default rule for compilation
+##############################################################################
+EXE = .exe
+OBJ = .obj
+
+.SUFFIXES .c .h $(OBJ) $(EXE)
+
+.c.obj:
+ $(CC) $(CFLAGS) $*.c
+
+##############################################################################
+# Target Groupings
+##############################################################################
+HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h
+
+OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) -
+ vvutils$(OBJ) vaxvms$(OBJ)
+
+EXEFILES = vvencode$(EXE) vvdecode$(EXE)
+
+
+##############################################################################
+# Top level targets
+##############################################################################
+vvcode : $(EXEFILES)
+ @ WRITE SYS$OUTPUT "VVcode built at ''F$TIME()'"
+
+clean :
+ @ WRITE SYS$OUTPUT "Cleaning up at ''F$TIME()'"
+ PURGE
+ IF F$SEARCH ("*.dia;*") .NES. "" THEN $ DELETE *.dia;*
+ IF F$SEARCH ("*.exe;*") .NES. "" THEN $ DELETE *.exe;*
+ IF F$SEARCH ("*.lis;*") .NES. "" THEN $ DELETE *.lis;*
+ IF F$SEARCH ("*.obj;*") .NES. "" THEN $ DELETE *.obj;*
+
+
+##############################################################################
+# Dependencies for executables
+##############################################################################
+vvencode$(EXE) : vvencode$(OBJ) vvutils$(OBJ) vaxvms$(OBJ) vvcode.opt
+ $(LINK) $(LINKFLAGS) vvencode$(OBJ), vvutils$(OBJ), vaxvms$(OBJ), -
+ vvcode.opt/OPTION
+
+vvdecode$(EXE) : vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) -
+ vaxvms$(OBJ) vvcode.opt
+ $(LINK) $(LINKFLAGS) vvdecode$(OBJ), vveparse$(OBJ), -
+ vvutils$(OBJ), vaxvms$(OBJ), -
+ vvcode.opt/OPTION
+
+##############################################################################
+# Dependencies for the linker option file
+##############################################################################
+vvcode.opt :
+ OPEN /WRITE options_file vvcode.opt
+ WRITE options_file "SYS$LIBRARY:VAXCRTL /SHAREABLE"
+ CLOSE options_file
+
+##############################################################################
+# Dependencies for object files
+##############################################################################
+vvencode$(OBJ) : vvencode.c $(HDRFILES)
+
+vvdecode$(OBJ) : vvdecode.c $(HDRFILES) vveparse.h
+
+vveparse$(OBJ) : vveparse.c $(HDRFILES) vveparse.h
+
+vvutils$(OBJ) : vvutils.c $(HDRFILES)
+
+vaxvms$(OBJ) : vaxvms.c $(HDRFILES)
diff --git a/support/vvcode/doc/texinfo.tex b/support/vvcode/doc/texinfo.tex
new file mode 100644
index 0000000000..32eec25962
--- /dev/null
+++ b/support/vvcode/doc/texinfo.tex
@@ -0,0 +1,3229 @@
+%% TeX macros to handle texinfo files
+
+% Copyright (C) 1985, 1986, 1988, 1990, 1991 Free Software Foundation, Inc.
+
+%This texinfo.tex file is free software; you can redistribute it and/or
+%modify it under the terms of the GNU General Public License as
+%published by the Free Software Foundation; either version 2, or (at
+%your option) any later version.
+
+%This texinfo.tex file is distributed in the hope that it will be
+%useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+%of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+%General Public License for more details.
+
+%You should have received a copy of the GNU General Public License
+%along with this texinfo.tex file; see the file COPYING. If not, write
+%to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
+%USA.
+
+
+%In other words, you are welcome to use, share and improve this program.
+%You are forbidden to forbid anyone else to use, share and improve
+%what you give them. Help stamp out software-hoarding!
+
+\def\texinfoversion{2.65}
+\message{Loading texinfo package [Version \texinfoversion]:}
+\message{}
+
+% Print the version number if in a .fmt file.
+\everyjob{\message{[Texinfo version \texinfoversion]}\message{}}
+
+% Save some parts of plain tex whose names we will redefine.
+
+\let\ptexlbrace=\{
+\let\ptexrbrace=\}
+\let\ptexdots=\dots
+\let\ptexdot=\.
+\let\ptexstar=\*
+\let\ptexend=\end
+\let\ptexbullet=\bullet
+\let\ptexb=\b
+\let\ptexc=\c
+\let\ptexi=\i
+\let\ptext=\t
+\let\ptexl=\l
+\let\ptexL=\L
+
+\def\tie{\penalty 10000\ } % Save plain tex definition of ~.
+
+\message{Basics,}
+\chardef\other=12
+
+\hyphenation{ap-pen-dix}
+\hyphenation{mini-buf-fer mini-buf-fers}
+\hyphenation{eshell}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen \bindingoffset \bindingoffset=0pt
+\newdimen \normaloffset \normaloffset=\hoffset
+\newdimen\pagewidth \newdimen\pageheight
+\pagewidth=\hsize \pageheight=\vsize
+
+%---------------------Begin change-----------------------
+%
+%%%% For @cropmarks command.
+% Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\cornerlong \newdimen\cornerthick
+\newdimen \topandbottommargin
+\newdimen \outerhsize \newdimen \outervsize
+\cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks
+\outerhsize=7in
+%\outervsize=9.5in
+% Alternative @smallbook page size is 9.25in
+\outervsize=9.25in
+\topandbottommargin=.75in
+%
+%---------------------End change-----------------------
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions itself, but you have to call it yourself.
+\chardef\PAGE=255 \output={\onepageout{\pagecontents\PAGE}}
+\def\onepageout#1{\hoffset=\normaloffset
+\ifodd\pageno \advance\hoffset by \bindingoffset
+\else \advance\hoffset by -\bindingoffset\fi
+{\escapechar=`\\\relax % makes sure backslash is used in output files.
+\shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}%
+{\let\hsize=\pagewidth \makefootline}}}%
+\advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
+
+%%%% For @cropmarks command %%%%
+
+% Here is a modification of the main output routine for Near East Publications
+% This provides right-angle cropmarks at all four corners.
+% The contents of the page are centerlined into the cropmarks,
+% and any desired binding offset is added as an \hskip on either
+% site of the centerlined box. (P. A. MacKay, 12 November, 1986)
+%
+\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up
+ \shipout
+ \vbox to \outervsize{\hsize=\outerhsize
+ \vbox{\line{\ewtop\hfill\ewtop}}
+ \nointerlineskip
+ \line{\vbox{\moveleft\cornerthick\nstop}
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}}
+ \vskip \topandbottommargin
+ \centerline{\ifodd\pageno\hskip\bindingoffset\fi
+ \vbox{
+ {\let\hsize=\pagewidth \makeheadline}
+ \pagebody{#1}
+ {\let\hsize=\pagewidth \makefootline}}
+ \ifodd\pageno\else\hskip\bindingoffset\fi}
+ \vskip \topandbottommargin plus1fill minus1fill
+ \boxmaxdepth\cornerthick
+ \line{\vbox{\moveleft\cornerthick\nsbot}
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}}
+ \nointerlineskip
+ \vbox{\line{\ewbot\hfill\ewbot}}
+ }
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
+%
+% Do @cropmarks to get crop marks
+\def\cropmarks{\let\onepageout=\croppageout }
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+%
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1.
+% The argument can be delimited with [...] or with "..." or braces
+% or it can be a whole line.
+% #1 should be a macro which expects
+% an ordinary undelimited TeX argument.
+
+\def\parsearg #1{\let\next=#1\begingroup\obeylines\futurelet\temp\parseargx}
+
+\def\parseargx{%
+\ifx \obeyedspace\temp \aftergroup\parseargdiscardspace \else%
+\aftergroup \parseargline %
+\fi \endgroup}
+
+{\obeyspaces %
+\gdef\parseargdiscardspace {\begingroup\obeylines\futurelet\temp\parseargx}}
+
+\gdef\obeyedspace{\ }
+
+\def\parseargline{\begingroup \obeylines \parsearglinex}
+{\obeylines %
+\gdef\parsearglinex #1^^M{\endgroup \next {#1}}}
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+%% These are used to keep @begin/@end levels from running away
+%% Call \inENV within environments (after a \begingroup)
+\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
+\def\ENVcheck{%
+\ifENV\errmessage{Still within an environment. Type Return to continue.}
+\endgroup\fi} % This is not perfect, but it should reduce lossage
+
+% @begin foo is the same as @foo, for now.
+\newhelp\EMsimple{Type <Return> to continue}
+
+\outer\def\begin{\parsearg\beginxxx}
+
+\def\beginxxx #1{%
+\expandafter\ifx\csname #1\endcsname\relax
+{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
+\csname #1\endcsname\fi}
+
+%% @end foo executes the definition of \Efoo.
+%% foo can be delimited by doublequotes or brackets.
+
+\def\end{\parsearg\endxxx}
+
+\def\endxxx #1{%
+\expandafter\ifx\csname E#1\endcsname\relax
+\expandafter\ifx\csname #1\endcsname\relax
+\errmessage{Undefined command @end #1}\else
+\errorE{#1}\fi\fi
+\csname E#1\endcsname}
+\def\errorE#1{
+{\errhelp=\EMsimple \errmessage{@end #1 not within #1 environment}}}
+
+% Single-spacing is done by various environments.
+
+\newskip\singlespaceskip \singlespaceskip = \baselineskip
+\def\singlespace{%
+{\advance \baselineskip by -\singlespaceskip
+\kern \baselineskip}%
+\baselineskip=\singlespaceskip
+}
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt \char '100}}
+
+% Define @` and @' to be the same as ` and '
+% but suppressing ligatures.
+\def\`{{`}}
+\def\'{{'}}
+
+% Used to generate quoted braces.
+
+\def\mylbrace {{\tt \char '173}}
+\def\myrbrace {{\tt \char '175}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=3000 }
+
+% @w prevents a word break
+\def\w #1{\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page.
+
+\def\group{\begingroup% \inENV ???
+\ifnum\catcode13=\active \else
+\errmessage{@group invalid in context where filling is enabled}\fi
+\def \Egroup{\egroup\endgroup}
+\vbox\bgroup}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+\def\need{\parsearg\needx}
+
+\def\needx #1{\par %
+% This method tries to make TeX break the page naturally
+% if the depth of the box does not fit.
+{\baselineskip=0pt%
+\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000
+\prevdepth=-1000pt
+}}
+
+% @br forces paragraph break
+
+\let\br = \par
+
+% @dots{} output some dots
+
+\def\dots{$\ldots$}
+
+% @page forces the start of a new page
+
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+\def\exdent{\errmessage{@exdent in filled text}}
+ % @lisp, etc, define \exdent locally from \internalexdent
+
+{\obeyspaces
+\gdef\internalexdent{\parsearg\exdentzzz}}
+
+\def\exdentzzz #1{{\advance \leftskip by -\lispnarrowing
+\advance \hsize by -\leftskip
+\advance \hsize by -\rightskip
+\leftline{{\rm#1}}}}
+
+% @include file insert text of that file as input.
+
+\def\include{\parsearg\includezzz}
+\def\includezzz #1{{\def\thisfile{#1}\input #1
+}}
+
+\def\thisfile{}
+
+% @center line outputs that line, centered
+
+\def\center{\parsearg\centerzzz}
+\def\centerzzz #1{{\advance\hsize by -\leftskip
+\advance\hsize by -\rightskip
+\centerline{#1}}}
+
+% @sp n outputs n lines of vertical space
+
+\def\sp{\parsearg\spxxx}
+\def\spxxx #1{\par \vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+
+\def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other%
+\parsearg \commentxxx}
+
+\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 }
+
+\let\c=\comment
+
+% Prevent errors for section commands.
+% Used in @ignore and in failing conditionals.
+\def\ignoresections{%
+\let\chapter=\relax
+\let\unnumbered=\relax
+\let\top=\relax
+\let\unnumberedsec=\relax
+\let\unnumberedsection=\relax
+\let\unnumberedsubsec=\relax
+\let\unnumberedsubsection=\relax
+\let\unnumberedsubsubsec=\relax
+\let\unnumberedsubsubsection=\relax
+\let\section=\relax
+\let\subsec=\relax
+\let\subsubsec=\relax
+\let\subsection=\relax
+\let\subsubsection=\relax
+\let\appendix=\relax
+\let\appendixsec=\relax
+\let\appendixsection=\relax
+\let\appendixsubsec=\relax
+\let\appendixsubsection=\relax
+\let\appendixsubsubsec=\relax
+\let\appendixsubsubsection=\relax
+\let\contents=\relax
+\let\smallbook=\relax
+\let\titlepage=\relax
+}
+
+\def\ignore{\begingroup\ignoresections
+% Make sure that spaces turn into tokens that match what \ignorexxx wants.
+\catcode32=10
+\ignorexxx}
+\long\def\ignorexxx #1\end ignore{\endgroup\ignorespaces}
+
+\def\direntry{\begingroup\direntryxxx}
+\long\def\direntryxxx #1\end direntry{\endgroup\ignorespaces}
+
+% Conditionals to test whether a flag is set.
+
+\def\ifset{\begingroup\ignoresections\parsearg\ifsetxxx}
+
+\def\ifsetxxx #1{\endgroup
+\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\ifsetfail
+\else \let\temp=\relax \fi
+\temp}
+\def\Eifset{}
+\def\ifsetfail{\begingroup\ignoresections\ifsetfailxxx}
+\long\def\ifsetfailxxx #1\end ifset{\endgroup\ignorespaces}
+
+\def\ifclear{\begingroup\ignoresections\parsearg\ifclearxxx}
+
+\def\ifclearxxx #1{\endgroup
+\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\relax
+\else \let\temp=\ifclearfail \fi
+\temp}
+\def\Eifclear{}
+\def\ifclearfail{\begingroup\ignoresections\ifclearfailxxx}
+\long\def\ifclearfailxxx #1\end ifclear{\endgroup\ignorespaces}
+
+% @set foo to set the flag named foo.
+% @clear foo to clear the flag named foo.
+\def\set{\parsearg\setxxx}
+\def\setxxx #1{
+\expandafter\let\csname IF#1\endcsname=\set}
+
+\def\clear{\parsearg\clearxxx}
+\def\clearxxx #1{
+\expandafter\let\csname IF#1\endcsname=\relax}
+
+% Some texinfo constructs that are trivial in tex
+
+\def\iftex{}
+\def\Eiftex{}
+\def\ifinfo{\begingroup\ignoresections\ifinfoxxx}
+\long\def\ifinfoxxx #1\end ifinfo{\endgroup\ignorespaces}
+
+\long\def\menu #1\end menu{}
+\def\asis#1{#1}
+
+% @math means output in math mode.
+% We don't use $'s directly in the definition of \math because control
+% sequences like \math are expanded when the toc file is written. Then,
+% we read the toc file back, the $'s will be normal characters (as they
+% should be, according to the definition of Texinfo). So we must use a
+% control sequence to switch into and out of math mode.
+%
+% This isn't quite enough for @math to work properly in indices, but it
+% seems unlikely it will ever be needed there.
+%
+\let\implicitmath = $
+\def\math#1{\implicitmath #1\implicitmath}
+
+\def\node{\ENVcheck\parsearg\nodezzz}
+\def\nodezzz#1{\nodexxx [#1,]}
+\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
+\let\lastnode=\relax
+
+\def\donoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\setref{\lastnode}\fi
+\let\lastnode=\relax}
+
+\def\unnumbnoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
+\let\lastnode=\relax}
+
+\def\appendixnoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
+\let\lastnode=\relax}
+
+\let\refill=\relax
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+ \readauxfile
+ \opencontents
+ \openindices
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+ \comment % Ignore the actual filename.
+}
+
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{See Info file \file{\losespace#3{}},
+ node \samp{\losespace#1{}}}
+\def\losespace #1{#1}
+
+\message{fonts,}
+
+% Font-change commands.
+
+% Texinfo supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf analogous to plain's \rm, etc.
+\newfam\sffam
+\def\sf{\fam=\sffam \tensf}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+%% Try out Computer Modern fonts at \magstephalf
+\let\mainmagstep=\magstephalf
+
+\ifx\bigger\relax
+\let\mainmagstep=\magstep1
+\font\textrm=cmr12
+\font\texttt=cmtt12
+\else
+\font\textrm=cmr10 scaled \mainmagstep
+\font\texttt=cmtt10 scaled \mainmagstep
+\fi
+% Instead of cmb10, you many want to use cmbx10.
+% cmbx10 is a prettier font on its own, but cmb10
+% looks better when embedded in a line with cmr10.
+\font\textbf=cmb10 scaled \mainmagstep
+\font\textit=cmti10 scaled \mainmagstep
+\font\textsl=cmsl10 scaled \mainmagstep
+\font\textsf=cmss10 scaled \mainmagstep
+\font\textsc=cmcsc10 scaled \mainmagstep
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun, etc.
+\font\defbf=cmbx10 scaled \magstep1 %was 1314
+\font\deftt=cmtt10 scaled \magstep1
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+
+% Fonts for indices and small examples.
+% We actually use the slanted font rather than the italic,
+% because texinfo normally uses the slanted fonts for that.
+% Do not make many font distinctions in general in the index, since they
+% aren't very useful.
+\font\ninett=cmtt9
+\font\indrm=cmr9
+\font\indit=cmsl9
+\let\indsl=\indit
+\let\indtt=\ninett
+\let\indsf=\indrm
+\let\indbf=\indrm
+\let\indsc=\indrm
+\font\indi=cmmi9
+\font\indsy=cmsy9
+
+% Fonts for headings
+\font\chaprm=cmbx12 scaled \magstep2
+\font\chapit=cmti12 scaled \magstep2
+\font\chapsl=cmsl12 scaled \magstep2
+\font\chaptt=cmtt12 scaled \magstep2
+\font\chapsf=cmss12 scaled \magstep2
+\let\chapbf=\chaprm
+\font\chapsc=cmcsc10 scaled\magstep3
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+\font\secrm=cmbx12 scaled \magstep1
+\font\secit=cmti12 scaled \magstep1
+\font\secsl=cmsl12 scaled \magstep1
+\font\sectt=cmtt12 scaled \magstep1
+\font\secsf=cmss12 scaled \magstep1
+\font\secbf=cmbx12 scaled \magstep1
+\font\secsc=cmcsc10 scaled\magstep2
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% \font\ssecrm=cmbx10 scaled \magstep1 % This size an font looked bad.
+% \font\ssecit=cmti10 scaled \magstep1 % The letters were too crowded.
+% \font\ssecsl=cmsl10 scaled \magstep1
+% \font\ssectt=cmtt10 scaled \magstep1
+% \font\ssecsf=cmss10 scaled \magstep1
+
+%\font\ssecrm=cmb10 scaled 1315 % Note the use of cmb rather than cmbx.
+%\font\ssecit=cmti10 scaled 1315 % Also, the size is a little larger than
+%\font\ssecsl=cmsl10 scaled 1315 % being scaled magstep1.
+%\font\ssectt=cmtt10 scaled 1315
+%\font\ssecsf=cmss10 scaled 1315
+
+%\let\ssecbf=\ssecrm
+
+\font\ssecrm=cmbx12 scaled \magstephalf
+\font\ssecit=cmti12 scaled \magstephalf
+\font\ssecsl=cmsl12 scaled \magstephalf
+\font\ssectt=cmtt12 scaled \magstephalf
+\font\ssecsf=cmss12 scaled \magstephalf
+\font\ssecbf=cmbx12 scaled \magstephalf
+\font\ssecsc=cmcsc10 scaled \magstep1
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled \magstep1
+% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
+% but that is not a standard magnification.
+
+% Fonts for title page:
+\font\titlerm = cmbx12 scaled \magstep3
+\let\authorrm = \secrm
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. Since
+% texinfo doesn't allow for producing subscripts and superscripts, we
+% don't bother to reset \scriptfont and \scriptscriptfont (which would
+% also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+ \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy
+ \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf
+ \textfont\ttfam = \tentt \textfont\sffam = \tensf
+}
+
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this so that font changes will continue to work
+% in math mode, where it is the current \fam that is relevant in most
+% cases, not the current. Plain TeX does, for example,
+% \def\bf{\fam=\bffam \tenbf} By redefining \tenbf, we obviate the need
+% to redefine \bf itself.
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+ \resetmathfonts}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+ \resetmathfonts}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+ \resetmathfonts}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+ \resetmathfonts}
+\def\indexfonts{%
+ \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl
+ \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc
+ \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy
+ \resetmathfonts}
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\font\shortcontrm=cmr12
+\font\shortcontbf=cmbx12
+\font\shortcontsl=cmsl12
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
+\def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\var=\smartitalic
+\let\dfn=\smartitalic
+\let\emph=\smartitalic
+\let\cite=\smartitalic
+
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+\def\t#1{{\tt \exhyphenpenalty=10000\rawbackslash \frenchspacing #1}\null}
+\let\ttfont = \t
+%\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null}
+\def\samp #1{`\tclose{#1}'\null}
+\def\key #1{{\tt \exhyphenpenalty=10000\uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+\let\file=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\newdimen\tclosesave
+\newdimen\tcloserm
+\def\tclose#1{{\rm \tcloserm=\fontdimen2\font \tt \tclosesave=\fontdimen2\font
+\fontdimen2\font=\tcloserm
+% prevent breaking lines at hyphens.
+\exhyphenpenalty=10000
+\def\ {{\fontdimen2\font=\tclosesave{} }}%
+ \rawbackslash \frenchspacing #1\fontdimen2\font=\tclosesave}\null}
+\let\code=\tclose
+%\let\exp=\tclose %Was temporary
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else\tclose{\look}\fi
+\else\tclose{\look}\fi}
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of
+% @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+\def\l#1{{\li #1}\null} %
+
+\def\r#1{{\rm #1}} % roman font
+% Use of \lowercase was suggested.
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\def\titlefont#1{{\titlerm #1}}
+
+\newtoks\realeverypar
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+\def\titlepage{\begingroup \parindent=0pt \textfonts
+ \let\subtitlerm=\tenrm
+% I deinstalled the following change because \cmr12 is undefined.
+% This change was not in the ChangeLog anyway. --rms.
+% \let\subtitlerm=\cmr12
+ \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
+ %
+ \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
+ %
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ %
+ % Now you can print the title using @title.
+ \def\title{\parsearg\titlezzz}%
+ \def\titlezzz##1{\leftline{\titlefont{##1}}
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt \vskip4pt}%
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Now you can put text using @subtitle.
+ \def\subtitle{\parsearg\subtitlezzz}%
+ \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
+ %
+ % @author should come last, but may come many times.
+ \def\author{\parsearg\authorzzz}%
+ \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
+ {\authorfont \leftline{##1}}}%
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \oldpage
+ \let\page = \oldpage
+ \hbox{}}%
+% \def\page{\oldpage \hbox{}}
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ \HEADINGSon
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks \evenheadline % Token sequence for heading line of even pages
+\newtoks \oddheadline % Token sequence for heading line of odd pages
+\newtoks \evenfootline % Token sequence for footing line of even pages
+\newtoks \oddfootline % Token sequence for footing line of odd pages
+
+% Now make Tex use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\everyheading{\parsearg\everyheadingxxx}
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\everyfooting{\parsearg\everyfootingxxx}
+
+{\catcode`\@=0 %
+
+\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
+\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
+\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish}
+\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
+\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
+\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish}
+\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
+\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+%
+}% unbind the catcode of @.
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{
+%\pagealignmacro
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{
+%\pagealignmacro
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+
+% Subroutines used in generating headings
+% Produces Day Month Year style of output.
+\def\today{\number\day\space
+\ifcase\month\or
+January\or February\or March\or April\or May\or June\or
+July\or August\or September\or October\or November\or December\fi
+\space\number\year}
+
+% Use this if you want the Month Day, Year style of output.
+%\def\today{\ifcase\month\or
+%January\or February\or March\or April\or May\or June\or
+%July\or August\or September\or October\or November\or December\fi
+%\space\number\day, \number\year}
+
+% @settitle line... specifies the title of the document, for headings
+% It generates no output of its own
+
+\def\thistitle{No Title}
+\def\settitle{\parsearg\settitlezzz}
+\def\settitlezzz #1{\gdef\thistitle{#1}}
+
+\message{tables,}
+
+% @tabs -- simple alignment
+
+% These don't work. For one thing, \+ is defined as outer.
+% So these macros cannot even be defined.
+
+%\def\tabs{\parsearg\tabszzz}
+%\def\tabszzz #1{\settabs\+#1\cr}
+%\def\tabline{\parsearg\tablinezzz}
+%\def\tablinezzz #1{\+#1\cr}
+%\def\&{&}
+
+% Tables -- @table, @ftable, @item(x), @kitem(x), @xitem(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table and @ftable define @item, @itemx, etc., with these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\par \parsearg\itemzzz}
+
+\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
+\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \par \parsearg\xitemzzz}
+
+\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
+\def\internalBkitemx{\par \parsearg\kitemzzz}
+
+\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
+ \itemzzz {#1}}
+
+\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
+ \itemzzz {#1}}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemfont{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % Be sure we are not still in the middle of a paragraph.
+ \parskip=0in
+ \par
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ \setbox0=\hbox{\hskip \leftskip \hskip -\tableindent \unhbox0}\box0
+ \nobreak
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line. Since that
+ % text will be indented by \tableindent, we make the item text be in
+ % a zero-width box.
+ \noindent
+ \rlap{\hskip -\tableindent\box0}%
+ \fi
+ \endgroup
+}
+
+\def\item{\errmessage{@item while not in a table}}
+\def\itemx{\errmessage{@itemx while not in a table}}
+\def\kitem{\errmessage{@kitem while not in a table}}
+\def\kitemx{\errmessage{@kitemx while not in a table}}
+\def\xitem{\errmessage{@xitem while not in a table}}
+\def\xitemx{\errmessage{@xitemx while not in a table}}
+
+%% Contains a kludge to get @end[description] to work
+\def\description{\tablez{\dontindex}{1}{}{}{}{}}
+
+\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
+{\obeylines\obeyspaces%
+\gdef\tablex #1^^M{%
+\tabley\dontindex#1 \endtabley}}
+
+\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
+{\obeylines\obeyspaces%
+\gdef\ftablex #1^^M{%
+\tabley\fnitemindex#1 \endtabley
+\def\Eftable{\endgraf\endgroup\afterenvbreak}%
+\let\Etable=\relax}}
+
+\def\dontindex #1{}
+\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
+
+{\obeyspaces %
+\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
+\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\def\tablez #1#2#3#4#5#6{%
+\aboveenvbreak %
+\begingroup %
+\def\Edescription{\Etable}% Neccessary kludge.
+\let\itemindex=#1%
+\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
+\ifnum 0#4>0 \tableindent=#4\mil \fi %
+\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
+\def\itemfont{#2}%
+\itemmax=\tableindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \tableindent %
+\parindent = 0pt
+\parskip = \smallskipamount
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def\Etable{\endgraf\endgroup\afterenvbreak}%
+\let\item = \internalBitem %
+\let\itemx = \internalBitemx %
+\let\kitem = \internalBkitem %
+\let\kitemx = \internalBkitemx %
+\let\xitem = \internalBxitem %
+\let\xitemx = \internalBxitemx %
+}
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\def\itemize{\parsearg\itemizezzz}
+
+\def\itemizezzz #1{%
+ \begingroup % ended by the @end itemsize
+ \itemizey {#1}{\Eitemize}
+}
+
+\def\itemizey #1#2{%
+\aboveenvbreak %
+\itemmax=\itemindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \itemindent %
+\parindent = 0pt %
+\parskip = \smallskipamount %
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def#2{\endgraf\endgroup\afterenvbreak}%
+\def\itemcontents{#1}%
+\let\item=\itemizeitem}
+
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
+
+% Set sfcode to normal for the chars that usually have another value.
+% These are `.?!:;,'
+\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000
+ \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 }
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\def\enumerate{\parsearg\enumeratezzz}
+\def\enumeratezzz #1{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ \begingroup % ended by the @end enumerate
+ %
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call itemizey, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \itemizey{#1.}\Eenumerate\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+% Definition of @item while inside @itemize.
+
+\def\itemizeitem{%
+\advance\itemno by 1
+{\let\par=\endgraf \smallbreak}%
+\ifhmode \errmessage{\in hmode at itemizeitem}\fi
+{\parskip=0in \hskip 0pt
+\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
+\vadjust{\penalty 1200}}%
+\flushcr}
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within \newindex.
+{\catcode`\@=11
+\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+
+\def\newindex #1{
+\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
+\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\doindex {#1}}
+}
+
+% @defindex foo == \newindex{foo}
+
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+
+\def\newcodeindex #1{
+\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
+\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\docodeindex {#1}}
+}
+
+\def\defcodeindex{\parsearg\newcodeindex}
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+\def\synindex #1 #2 {%
+\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
+\expandafter\let\csname#1indfile\endcsname=\synindexfoo
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\doindex {#2}}%
+}
+
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+\def\syncodeindex #1 #2 {%
+\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
+\expandafter\let\csname#1indfile\endcsname=\synindexfoo
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\docodeindex {#2}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+\def\indexdummies{%
+\def\_{{\realbackslash _}}%
+\def\w{\realbackslash w }%
+\def\bf{\realbackslash bf }%
+\def\rm{\realbackslash rm }%
+\def\sl{\realbackslash sl }%
+\def\sf{\realbackslash sf}%
+\def\tt{\realbackslash tt}%
+\def\gtr{\realbackslash gtr}%
+\def\less{\realbackslash less}%
+\def\hat{\realbackslash hat}%
+\def\char{\realbackslash char}%
+\def\TeX{\realbackslash TeX}%
+\def\dots{\realbackslash dots }%
+\def\copyright{\realbackslash copyright }%
+\def\tclose##1{\realbackslash tclose {##1}}%
+\def\code##1{\realbackslash code {##1}}%
+\def\samp##1{\realbackslash samp {##1}}%
+\def\t##1{\realbackslash r {##1}}%
+\def\r##1{\realbackslash r {##1}}%
+\def\i##1{\realbackslash i {##1}}%
+\def\b##1{\realbackslash b {##1}}%
+\def\cite##1{\realbackslash cite {##1}}%
+\def\key##1{\realbackslash key {##1}}%
+\def\file##1{\realbackslash file {##1}}%
+\def\var##1{\realbackslash var {##1}}%
+\def\kbd##1{\realbackslash kbd {##1}}%
+}
+
+% \indexnofonts no-ops all font-change commands.
+% This is used when outputting the strings to sort the index by.
+\def\indexdummyfont#1{#1}
+\def\indexdummytex{TeX}
+\def\indexdummydots{...}
+
+\def\indexnofonts{%
+\let\w=\indexdummyfont
+\let\t=\indexdummyfont
+\let\r=\indexdummyfont
+\let\i=\indexdummyfont
+\let\b=\indexdummyfont
+\let\emph=\indexdummyfont
+\let\strong=\indexdummyfont
+\let\cite=\indexdummyfont
+\let\sc=\indexdummyfont
+%Don't no-op \tt, since it isn't a user-level command
+% and is used in the definitions of the active chars like <, >, |...
+%\let\tt=\indexdummyfont
+\let\tclose=\indexdummyfont
+\let\code=\indexdummyfont
+\let\file=\indexdummyfont
+\let\samp=\indexdummyfont
+\let\kbd=\indexdummyfont
+\let\key=\indexdummyfont
+\let\var=\indexdummyfont
+\let\TeX=\indexdummytex
+\let\dots=\indexdummydots
+}
+
+% To define \realbackslash, we must make \ not be an escape.
+% We must first make another character (@) an escape
+% so we do not become unable to do a definition.
+
+{\catcode`\@=0 \catcode`\\=\other
+@gdef@realbackslash{\}}
+
+\let\indexbackslash=0 %overridden during \printindex.
+
+\def\doind #1#2{%
+{\count10=\lastpenalty %
+{\indexdummies % Must do this here, since \bf, etc expand at this stage
+\escapechar=`\\%
+{\let\folio=0% Expand all macros now EXCEPT \folio
+\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
+% so it will be output as is; and it will print as backslash in the indx.
+%
+% Now process the index-string once, with all font commands turned off,
+% to get the string to sort the index by.
+{\indexnofonts
+\xdef\temp1{#2}%
+}%
+% Now produce the complete index entry. We process the index-string again,
+% this time with font commands expanded, to get what to print in the index.
+\edef\temp{%
+\write \csname#1indfile\endcsname{%
+\realbackslash entry {\temp1}{\folio}{#2}}}%
+\temp }%
+}\penalty\count10}}
+
+\def\dosubind #1#2#3{%
+{\count10=\lastpenalty %
+{\indexdummies % Must do this here, since \bf, etc expand at this stage
+\escapechar=`\\%
+{\let\folio=0%
+\def\rawbackslashxx{\indexbackslash}%
+%
+% Now process the index-string once, with all font commands turned off,
+% to get the string to sort the index by.
+{\indexnofonts
+\xdef\temp1{#2 #3}%
+}%
+% Now produce the complete index entry. We process the index-string again,
+% this time with font commands expanded, to get what to print in the index.
+\edef\temp{%
+\write \csname#1indfile\endcsname{%
+\realbackslash entry {\temp1}{\folio}{#2}{#3}}}%
+\temp }%
+}\penalty\count10}}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% This is what you call to cause a particular index to get printed.
+% Write
+% @unnumbered Function Index
+% @printindex fn
+
+\def\printindex{\parsearg\doprintindex}
+
+\def\doprintindex#1{%
+ \tex
+ \dobreak \chapheadingskip {10000}
+ \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other
+ \catcode`\$=\other\catcode`\_=\other
+ \catcode`\~=\other
+ %
+ % The following don't help, since the chars were translated
+ % when the raw index was written, and their fonts were discarded
+ % due to \indexnofonts.
+ %\catcode`\"=\active
+ %\catcode`\^=\active
+ %\catcode`\_=\active
+ %\catcode`\|=\active
+ %\catcode`\<=\active
+ %\catcode`\>=\active
+ % %
+ \def\indexbackslash{\rawbackslashxx}
+ \indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt
+ \begindoublecolumns
+ %
+ % See if the index file exists and is nonempty.
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ (Index is nonexistent)
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+ (Index is empty)
+ \else
+ \input \jobname.#1s
+ \fi
+ \fi
+ \closein 1
+ \enddoublecolumns
+ \Etex
+}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+% Same as \bigskipamount except no shrink.
+% \balancecolumns gets confused if there is any shrink.
+\newskip\initialskipamount \initialskipamount 12pt plus4pt
+
+\def\initial #1{%
+{\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+\ifdim\lastskip<\initialskipamount
+\removelastskip \penalty-200 \vskip \initialskipamount\fi
+\line{\secbf#1\hfill}\kern 2pt\penalty10000}}
+
+\def\entry #1#2{
+{\parfillskip=0in \parskip=0in \parindent=0in
+\hangindent=1in \hangafter=1%
+\noindent\hbox{#1}\indexdotfill #2\par
+}}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu . \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+
+\def\secondary #1#2{
+{\parfillskip=0in \parskip=0in
+\hangindent =1in \hangafter=1
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par
+}}
+
+%% Define two-column mode, which is used in indexes.
+%% Adapted from the TeXBook, page 416
+\catcode `\@=11
+
+\newbox\partialpage
+
+\newdimen\doublecolumnhsize \doublecolumnhsize = 3.11in
+\newdimen\doublecolumnvsize \doublecolumnvsize = 19.1in
+\newdimen\availdimen@
+
+\def\begindoublecolumns{\begingroup
+ \output={\global\setbox\partialpage=
+ \vbox{\unvbox255\kern -\topskip \kern \baselineskip}}\eject
+ \output={\doublecolumnout}%
+ \hsize=\doublecolumnhsize \vsize=\doublecolumnvsize}
+\def\enddoublecolumns{\output={\balancecolumns}\eject
+ \endgroup \pagegoal=\vsize}
+
+\def\doublecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty}
+\def\pagesofar{\unvbox\partialpage %
+ \hsize=\doublecolumnhsize % have to restore this since output routine
+% changes it to set cropmarks (P. A. MacKay, 12 Nov. 1986)
+ \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}}
+\def\balancecolumns{%
+% Unset the glue.
+ \setbox255=\vbox{\unvbox255}
+ \dimen@=\ht255
+ \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by2
+ \availdimen@=\pageheight \advance\availdimen@ by-\ht\partialpage
+% If the remaining data is too big for one page,
+% output one page normally, then work with what remains.
+ \ifdim \dimen@>\availdimen@
+ {
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ }
+% Recompute size of what remains, in case we just output some of it.
+ \dimen@=\ht255
+ \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by2
+ \fi
+ \setbox0=\vbox{\unvbox255}
+ \splittopskip=\topskip
+ {\vbadness=10000 \loop \global\setbox3=\copy0
+ \global\setbox1=\vsplit3 to\dimen@
+ \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat}
+ \setbox0=\vbox to\dimen@{\unvbox1} \setbox2=\vbox to\dimen@{\unvbox3}
+ \pagesofar}
+
+\catcode `\@=\other
+\message{sectioning,}
+% Define chapters, sections, etc.
+
+\newcount \chapno
+\newcount \secno \secno=0
+\newcount \subsecno \subsecno=0
+\newcount \subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount \appendixno \appendixno = `\@
+\def\appendixletter{\char\the\appendixno}
+
+\newwrite \contentsfile
+% This is called from \setfilename.
+\def\opencontents{\openout \contentsfile = \jobname.toc}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it. @section does likewise
+
+\def\thischapter{} \def\thissection{}
+\def\seccheck#1{\if \pageno<0 %
+\errmessage{@#1 not allowed after generating table of contents}\fi
+%
+}
+
+\def\chapternofonts{%
+\let\rawbackslash=\relax%
+\let\frenchspacing=\relax%
+\def\TeX{\realbackslash TeX}
+\def\dots{\realbackslash dots}
+\def\copyright{\realbackslash copyright}
+\def\tt{\realbackslash tt}
+\def\bf{\realbackslash bf }
+\def\w{\realbackslash w}
+\def\less{\realbackslash less}
+\def\gtr{\realbackslash gtr}
+\def\hat{\realbackslash hat}
+\def\char{\realbackslash char}
+\def\tclose##1{\realbackslash tclose {##1}}
+\def\code##1{\realbackslash code {##1}}
+\def\samp##1{\realbackslash samp {##1}}
+\def\r##1{\realbackslash r {##1}}
+\def\b##1{\realbackslash b {##1}}
+\def\key##1{\realbackslash key {##1}}
+\def\file##1{\realbackslash file {##1}}
+\def\kbd##1{\realbackslash kbd {##1}}
+% These are redefined because @smartitalic wouldn't work inside xdef.
+\def\i##1{\realbackslash i {##1}}
+\def\cite##1{\realbackslash cite {##1}}
+\def\var##1{\realbackslash var {##1}}
+\def\emph##1{\realbackslash emph {##1}}
+\def\dfn##1{\realbackslash dfn {##1}}
+}
+
+\def\thischaptername{No Chapter Title}
+\outer\def\chapter{\parsearg\chapterzzz}
+\def\chapterzzz #1{\seccheck{chapter}%
+\secno=0 \subsecno=0 \subsubsecno=0
+\global\advance \chapno by 1 \message{Chapter \the\chapno}%
+\chapmacro {#1}{\the\chapno}%
+\gdef\thissection{#1}%
+\gdef\thischaptername{#1}%
+% We don't substitute the actual chapter name into \thischapter
+% because we don't want its macros evaluated now.
+\xdef\thischapter{Chapter \the\chapno: \noexpand\thischaptername}%
+{\chapternofonts%
+\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+}}
+
+\outer\def\appendix{\parsearg\appendixzzz}
+\def\appendixzzz #1{\seccheck{appendix}%
+\secno=0 \subsecno=0 \subsubsecno=0
+\global\advance \appendixno by 1 \message{Appendix \appendixletter}%
+\chapmacro {#1}{Appendix \appendixletter}%
+\gdef\thissection{#1}%
+\gdef\thischaptername{#1}%
+\xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}%
+{\chapternofonts%
+\edef\temp{{\realbackslash chapentry
+ {#1}{Appendix \appendixletter}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\global\let\section = \appendixsec
+\global\let\subsection = \appendixsubsec
+\global\let\subsubsection = \appendixsubsubsec
+}}
+
+\outer\def\top{\parsearg\unnumberedzzz}
+\outer\def\unnumbered{\parsearg\unnumberedzzz}
+\def\unnumberedzzz #1{\seccheck{unnumbered}%
+\secno=0 \subsecno=0 \subsubsecno=0 \message{(#1)}
+\unnumbchapmacro {#1}%
+\gdef\thischapter{#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\global\let\section = \unnumberedsec
+\global\let\subsection = \unnumberedsubsec
+\global\let\subsubsection = \unnumberedsubsubsec
+}}
+
+\outer\def\numberedsec{\parsearg\seczzz}
+\def\seczzz #1{\seccheck{section}%
+\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash secentry %
+{#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsection{\parsearg\appendixsectionzzz}
+\outer\def\appendixsec{\parsearg\appendixsectionzzz}
+\def\appendixsectionzzz #1{\seccheck{appendixsection}%
+\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash secentry %
+{#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsec{\parsearg\unnumberedseczzz}
+\def\unnumberedseczzz #1{\seccheck{unnumberedsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\numberedsubsec{\parsearg\numberedsubseczzz}
+\def\numberedsubseczzz #1{\seccheck{subsection}%
+\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsecentry %
+{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsubsec{\parsearg\appendixsubseczzz}
+\def\appendixsubseczzz #1{\seccheck{appendixsubsec}%
+\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsecentry %
+{#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\numberedsubsubsec{\parsearg\numberedsubsubseczzz}
+\def\numberedsubsubseczzz #1{\seccheck{subsubsection}%
+\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+\subsubsecheading {#1}
+ {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsubsecentry %
+ {#1}
+ {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}
+ {\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsubsubsec{\parsearg\appendixsubsubseczzz}
+\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}%
+\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+\subsubsecheading {#1}
+ {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsubsecentry{#1}%
+ {\appendixletter}
+ {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+% These are variants which are not "outer", so they can appear in @ifinfo.
+% Actually, they should now be obsolete; ordinary section commands should work.
+\def\infotop{\parsearg\unnumberedzzz}
+\def\infounnumbered{\parsearg\unnumberedzzz}
+\def\infounnumberedsec{\parsearg\unnumberedseczzz}
+\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+
+\def\infoappendix{\parsearg\appendixzzz}
+\def\infoappendixsec{\parsearg\appendixseczzz}
+\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
+\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
+
+\def\infochapter{\parsearg\chapterzzz}
+\def\infosection{\parsearg\sectionzzz}
+\def\infosubsection{\parsearg\subsectionzzz}
+\def\infosubsubsection{\parsearg\subsubsectionzzz}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and
+% such:
+% 1) We use \vbox rather than the earlier \line to permit
+% overlong headings to fold.
+% 2) \hyphenpenalty is set to 10000 because hyphenation in a
+% heading is obnoxious; this forbids it.
+% 3) Likewise, headings look best if no \parindent is used, and
+% if justification is not attempted. Hence \raggedright.
+
+
+\def\majorheading{\parsearg\majorheadingzzz}
+\def\majorheadingzzz #1{%
+{\advance\chapheadingskip by 10pt \chapbreak }%
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\chapheading{\parsearg\chapheadingzzz}
+\def\chapheadingzzz #1{\chapbreak %
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\heading{\parsearg\secheadingi}
+
+\def\subheading{\parsearg\subsecheadingi}
+
+\def\subsubheading{\parsearg\subsubsecheadingi}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+\def\CHAPFplain{
+\global\let\chapmacro=\chfplain
+\global\let\unnumbchapmacro=\unnchfplain}
+
+\def\chfplain #1#2{%
+ \pchapsepmacro
+ {%
+ \chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #2\enspace #1}%
+ }%
+ \bigskip
+ \penalty5000
+}
+
+\def\unnchfplain #1{%
+\pchapsepmacro %
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 10000 %
+}
+\CHAPFplain % The default
+
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 10000 %
+}
+
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+
+\def\CHAPFopen{
+\global\let\chapmacro=\chfopen
+\global\let\unnumbchapmacro=\unnchfopen}
+
+% Parameter controlling skip before section headings.
+
+\newskip \subsecheadingskip \subsecheadingskip = 17pt plus 8pt minus 4pt
+\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
+
+\newskip \secheadingskip \secheadingskip = 21pt plus 8pt minus 4pt
+\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
+
+% @paragraphindent is defined for the Info formatting commands only.
+\let\paragraphindent=\comment
+
+% Section fonts are the base font at magstep2, which produces
+% a size a bit more than 14 points in the default situation.
+
+\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}}
+\def\plainsecheading #1{\secheadingi {#1}}
+\def\secheadingi #1{{\advance \secheadingskip by \parskip %
+\secheadingbreak}%
+{\secfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
+
+
+% Subsection fonts are the base font at magstep1,
+% which produces a size of 12 points.
+
+\def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}}
+\def\subsecheadingi #1{{\advance \subsecheadingskip by \parskip %
+\subsecheadingbreak}%
+{\subsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
+
+\def\subsubsecfonts{\subsecfonts} % Maybe this should change:
+ % Perhaps make sssec fonts scaled
+ % magstep half
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheadingi {#2.#3.#4.#5\enspace #1}}
+\def\subsubsecheadingi #1{{\advance \subsecheadingskip by \parskip %
+\subsecheadingbreak}%
+{\subsubsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000}
+
+
+\message{toc printing,}
+
+% Finish up the main text and prepare to read what we've written
+% to \contentsfile.
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\def\startcontents#1{%
+ \ifnum \pageno>0
+ \pagealignmacro
+ \immediate\closeout \contentsfile
+ \pageno = -1 % Request roman numbered pages.
+ \fi
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \unnumbchapmacro{#1}\def\thischapter{}%
+ \begingroup % Set up to handle contents files properly.
+ \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+}
+
+
+% Normal (long) toc.
+\outer\def\contents{%
+ \startcontents{Table of Contents}%
+ \input \jobname.toc
+ \endgroup
+ \vfill \eject
+}
+
+% And just the chapters.
+\outer\def\summarycontents{%
+ \startcontents{Short Contents}%
+ %
+ \let\chapentry = \shortchapentry
+ \let\unnumbchapentry = \shortunnumberedentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl
+ \rm
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\secentry ##1##2##3##4{}
+ \def\unnumbsecentry ##1##2{}
+ \def\subsecentry ##1##2##3##4##5{}
+ \def\unnumbsubsecentry ##1##2{}
+ \def\subsubsecentry ##1##2##3##4##5##6{}
+ \def\unnumbsubsubsecentry ##1##2{}
+ \input \jobname.toc
+ \endgroup
+ \vfill \eject
+}
+\let\shortcontents = \summarycontents
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapter-level things, for both the long and short contents.
+\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
+
+% See comments in \dochapentry re vbox and related settings
+\def\shortchapentry#1#2#3{%
+ \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\strut\raggedright
+ {#2\labelspace #1}\dotfill\doshortpageno{#3}}%
+}
+
+\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
+\def\shortunnumberedentry#1#2{%
+ \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\strut\raggedright
+ #1\dotfill\doshortpageno{#2}}%
+}
+
+% Sections.
+\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
+\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}}
+
+% Subsections.
+\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
+\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}}
+
+% And subsubsections.
+\def\subsubsecentry#1#2#3#4#5#6{%
+ \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
+\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}}
+
+
+% This parameter controls the indentation of the various levels.
+\newdimen\tocindent \tocindent = 3pc
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we would want to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip\baselineskip
+ % This \vbox (and similar ones in dosecentry etc.) used to be a
+ % \line; changed to permit linebreaks for long headings. See
+ % comments above \majorheading. Here we also use \strut to
+ % keep the top end of the vbox from jamming up against the previous
+ % entry in the table of contents.
+ \vbox{\chapentryfonts
+ \hyphenpenalty=10000\tolerance=5000 % this line and next introduced
+ \parindent=0pt\strut\raggedright % with \line -> \vbox change
+ #1\dotfill
+ \dopageno{#2}}%
+ \nobreak\vskip .25\baselineskip
+}
+
+\def\dosecentry#1#2{%
+ \vbox{\secentryfonts \leftskip=\tocindent
+ \hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\strut\raggedright #1\dotfill
+ \dopageno{#2}}%
+}
+
+\def\dosubsecentry#1#2{%
+ \vbox{\subsecentryfonts \leftskip=2\tocindent
+ \hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\strut\raggedright #1\dotfill
+ \dopageno{#2}}%
+}
+
+\def\dosubsubsecentry#1#2{%
+ \vbox{\subsubsecentryfonts \leftskip=3\tocindent
+ \hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\strut\raggedright #1\dotfill
+ \dopageno{#2}}%
+}
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\let\subsecentryfonts = \textfonts
+\let\subsubsecentryfonts = \textfonts
+
+
+\message{environments,}
+
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+% Furthermore, these definitions must come after we define our fonts.
+\newbox\dblarrowbox \newbox\longdblarrowbox
+\newbox\pushcharbox \newbox\bullbox
+\newbox\equivbox \newbox\errorbox
+
+\let\ptexequiv = \equiv
+
+%{\tentt
+%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil}
+%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil}
+%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil}
+%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil}
+% Adapted from the manmac format (p.420 of TeXbook)
+%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex
+% depth .1ex\hfil}
+%}
+
+\def\point{$\star$}
+
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% Adapted from the TeXbook's \boxit.
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+
+\global\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+
+% The @error{} command.
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\def\tex{\begingroup
+\catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+\catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+\catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
+\catcode `\%=14
+\catcode 43=12
+\catcode`\"=12
+\catcode`\==12
+\catcode`\|=12
+\catcode`\<=12
+\catcode`\>=12
+\escapechar=`\\
+%
+\let\{=\ptexlbrace
+\let\}=\ptexrbrace
+\let\.=\ptexdot
+\let\*=\ptexstar
+\let\dots=\ptexdots
+\def\@{@}%
+\let\bullet=\ptexbullet
+\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl
+\let\L=\ptexL
+%
+\let\Etex=\endgroup}
+
+% Define @lisp ... @endlisp.
+% @lisp does a \begingroup so it can rebind things,
+% including the definition of @endlisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^M gets inside @lisp
+% phr: changed space to \null, to avoid overfull hbox problems.
+{\obeyspaces%
+\gdef\lisppar{\null\endgraf}}
+
+% Cause \obeyspaces to make each Space cause a word-separation
+% rather than the default which is that it acts punctuation.
+% This is because space in tt font looks funny.
+{\obeyspaces %
+\gdef\sepspaces{\def {\ }}}
+
+\newskip\aboveenvskipamount \aboveenvskipamount= 0pt
+\def\aboveenvbreak{{\advance\aboveenvskipamount by \parskip
+\endgraf \ifdim\lastskip<\aboveenvskipamount
+\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi}}
+
+\def\afterenvbreak{\endgraf \ifdim\lastskip<\aboveenvskipamount
+\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi}
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \cartouche: draw rectangle w/rounded corners around argument
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\long\def\cartouche{%
+\begingroup
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt %we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18pt % allow for 3pt kerns on either
+% side, and for 6pt waste from
+% each corner char
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing=\comment
+ \vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \hsize=\cartinner
+ \kern3pt
+ \begingroup
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+\def\Ecartouche{%
+ \endgroup
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+\endgroup
+}}
+
+\def\lisp{\aboveenvbreak
+\begingroup\inENV % This group ends at the end of the @lisp body
+\hfuzz=12truept % Don't be fussy
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% Single space lines
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Elisp{\endgroup\afterenvbreak}%
+\parskip=0pt
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\let\nonarrowing=\relax
+\fi
+\parindent=0pt
+\let\exdent=\internalexdent
+\obeyspaces \obeylines \tt \rawbackslash
+\def\next##1{}\next}
+
+
+\let\example=\lisp
+\def\Eexample{\Elisp}
+
+\let\smallexample=\lisp
+\def\Esmallexample{\Elisp}
+
+% Macro for 9 pt. examples, necessary to print with 5" lines.
+% From Pavel@xerox. This is not really used unless the
+% @smallbook command is given.
+
+\def\smalllispx{\aboveenvbreak\begingroup\inENV
+% This group ends at the end of the @lisp body
+\hfuzz=12truept % Don't be fussy
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% Single space lines
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Esmalllisp{\endgroup\afterenvbreak}%
+\parskip=0pt
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\let\nonarrowing=\relax
+\fi
+\parindent=0pt
+\let\exdent=\internalexdent
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslash
+\def\next##1{}\next}
+
+% This is @display; same as @lisp except use roman font.
+
+\def\display{\begingroup\inENV %This group ends at the end of the @display body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% Single space lines
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Edisplay{\endgroup\afterenvbreak}%
+\parskip=0pt
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\let\nonarrowing=\relax
+\fi
+\parindent=0pt
+\let\exdent=\internalexdent
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+% This is @format; same as @lisp except use roman font and don't narrow margins
+
+\def\format{\begingroup\inENV %This group ends at the end of the @format body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Eformat{\endgroup\afterenvbreak}
+\parskip=0pt \parindent=0pt
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+% @flushleft and @flushright
+
+\def\flushleft{%
+\begingroup\inENV %This group ends at the end of the @format body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+% This also causes @ to work when the directive name
+% is terminated by end of line.
+\let\par=\lisppar
+\def\Eflushleft{\endgroup\afterenvbreak}%
+\parskip=0pt \parindent=0pt
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+\def\flushright{%
+\begingroup\inENV %This group ends at the end of the @format body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+% This also causes @ to work when the directive name
+% is terminated by end of line.
+\let\par=\lisppar
+\def\Eflushright{\endgroup\afterenvbreak}%
+\parskip=0pt \parindent=0pt
+\advance \leftskip by 0pt plus 1fill
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+% @quotation - narrow the margins.
+
+\def\quotation{%
+\begingroup\inENV %This group ends at the end of the @quotation body
+{\parskip=0pt % because we will skip by \parskip too, later
+\aboveenvbreak}%
+\singlespace
+\parindent=0pt
+\def\Equotation{\par\endgroup\afterenvbreak}%
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\advance \rightskip by \lispnarrowing
+\let\nonarrowing=\relax
+\fi}
+
+\message{defuns,}
+% Define formatter for defuns
+% First, allow user to change definition object font (\df) internally
+\def\setdeffont #1 {\csname DEF#1\endcsname}
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deftypemargin \deftypemargin=12pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+\newcount\parencount
+% define \functionparens, which makes ( and ) and & do special things.
+% \functionparens affects the group it is contained in.
+\def\activeparens{%
+\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active
+\catcode`\[=\active \catcode`\]=\active}
+{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
+\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
+\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+
+% Definitions of (, ) and & used in args for functions.
+% This is the definition of ( outside of all parentheses.
+\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested %
+\global\advance\parencount by 1 }
+%
+% This is the definition of ( when already inside a level of parens.
+\gdef\opnested{\char`\(\global\advance\parencount by 1 }
+%
+\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
+% also in that case restore the outer-level definition of (.
+\ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
+\global\advance \parencount by -1 }
+% If we encounter &foo, then turn on ()-hacking afterwards
+\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
+%
+\gdef\normalparens{\boldbrax\let&=\ampnr}
+} % End of definition inside \activeparens
+%% These parens (in \boldbrax) actually are a little bolder than the
+%% contained text. This is especially needed for [ and ]
+\def\opnr{{\sf\char`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&}
+\def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}}
+
+% First, defname, which formats the header line itself.
+% #1 should be the function name.
+% #2 should be the type of definition, such as "Function".
+
+\def\defname #1#2{%
+% Get the values of \leftskip and \rightskip as they were
+% outside the @def...
+\dimen2=\leftskip
+\advance\dimen2 by -\defbodyindent
+\dimen3=\rightskip
+\advance\dimen3 by -\defbodyindent
+\noindent %
+\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
+\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations
+\parshape 2 0in \dimen0 \defargsindent \dimen1 %
+% Now output arg 2 ("Function" or some such)
+% ending at \deftypemargin from the right margin,
+% but stuck inside a box of width 0 so it does not interfere with linebreaking
+{% Adjust \hsize to exclude the ambient margins,
+% so that \rightline will obey them.
+\advance \hsize by -\dimen2 \advance \hsize by -\dimen3
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}%
+% Make all lines underfull and no complaints:
+\tolerance=10000 \hbadness=10000
+\advance\leftskip by -\defbodyindent
+{\df #1}\enskip % Generate function name
+}
+
+% Actually process the body of a definition
+% #1 should be the terminating control sequence, such as \Edefun.
+% #2 should be the "another name" control sequence, such as \defunx.
+% #3 should be the control sequence that actually processes the header,
+% such as \defunheader.
+
+\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\begingroup %
+\catcode 61=\active %
+\obeylines\activeparens\spacesplit#3}
+
+\def\defmethparsebody #1#2#3#4 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
+
+\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 ##2 {\def#4{##1}%
+\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\begingroup\obeylines\activeparens\spacesplit{#3{#5}}}
+
+% These parsing functions are similar to the preceding ones
+% except that they do not make parens into active characters.
+% These are used for "variables" since they have no arguments.
+
+\def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2{\begingroup\obeylines\spacesplit#3}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\begingroup %
+\catcode 61=\active %
+\obeylines\spacesplit#3}
+
+\def\defvrparsebody #1#2#3#4 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\begingroup\obeylines\spacesplit{#3{#4}}}
+
+\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 ##2 {\def#4{##1}%
+\begingroup\obeylines\spacesplit{#3{##2}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\begingroup\obeylines\spacesplit{#3{#5}}}
+
+% Split up #2 at the first space token.
+% call #1 with two arguments:
+% the first is all of #2 before the space token,
+% the second is all of #2 after that space token.
+% If #2 contains no space token, all of it is passed as the first arg
+% and the second is passed as empty.
+
+{\obeylines
+\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}%
+\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{%
+\ifx\relax #3%
+#1{#2}{}\else #1{#2}{#3#4}\fi}}
+
+% So much for the things common to all kinds of definitions.
+
+% Define @defun.
+
+% First, define the processing that is wanted for arguments of \defun
+% Use this to expand the args and terminate the paragraph they make up
+
+\def\defunargs #1{\functionparens \sl
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+\hyphenchar\tensl=0
+#1%
+\hyphenchar\tensl=45
+\ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi%
+\interlinepenalty=10000
+\advance\rightskip by 0pt plus 1fil
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
+}
+
+\def\deftypefunargs #1{%
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+\functionparens
+\code{#1}%
+\interlinepenalty=10000
+\advance\rightskip by 0pt plus 1fil
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
+}
+
+% Do complete processing of one @defun or @defunx line already parsed.
+
+% @deffn Command forward-char nchars
+
+\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
+
+\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defun == @deffn Function
+
+\def\defun{\defparsebody\Edefun\defunx\defunheader}
+
+\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{Function}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefun int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
+
+% #1 is the data type. #2 is the name and args.
+\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
+% #1 is the data type, #2 the name, #3 the args.
+\def\deftypefunheaderx #1#2 #3\relax{%
+\doind {fn}{\code{#2}}% Make entry in function index
+\begingroup\defname {\code{#1} #2}{Function}%
+\deftypefunargs {#3}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
+
+% #1 is the classification. #2 is the data type. #3 is the name and args.
+\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
+% #1 is the classification, #2 the data type, #3 the name, #4 the args.
+\def\deftypefnheaderx #1#2#3 #4\relax{%
+\doind {fn}{\code{#3}}% Make entry in function index
+\begingroup\defname {\code{#2} #3}{#1}%
+\deftypefunargs {#4}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defmac == @deffn Macro
+
+\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
+
+\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{Macro}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defspec == @deffn Special Form
+
+\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
+
+\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{Special Form}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% This definition is run if you use @defunx
+% anywhere other than immediately after a @defun or @defunx.
+
+\def\deffnx #1 {\errmessage{@deffnx in invalid context}}
+\def\defunx #1 {\errmessage{@defunx in invalid context}}
+\def\defmacx #1 {\errmessage{@defmacx in invalid context}}
+\def\defspecx #1 {\errmessage{@defspecx in invalid context}}
+\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}}
+\def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}}
+
+% @defmethod, and so on
+
+% @defop {Funny Method} foo-class frobnicate argument
+
+\def\defop #1 {\def\defoptype{#1}%
+\defopparsebody\Edefop\defopx\defopheader\defoptype}
+
+\def\defopheader #1#2#3{%
+\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index
+\begingroup\defname {#2}{\defoptype{} on #1}%
+\defunargs {#3}\endgroup %
+}
+
+% @defmethod == @defop Method
+
+\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
+
+\def\defmethodheader #1#2#3{%
+\dosubind {fn}{\code{#2}}{on #1}% entry in function index
+\begingroup\defname {#2}{Method on #1}%
+\defunargs {#3}\endgroup %
+}
+
+% @defcv {Class Option} foo-class foo-flag
+
+\def\defcv #1 {\def\defcvtype{#1}%
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
+
+\def\defcvarheader #1#2#3{%
+\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
+\begingroup\defname {#2}{\defcvtype{} of #1}%
+\defvarargs {#3}\endgroup %
+}
+
+% @defivar == @defcv {Instance Variable}
+
+\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
+
+\def\defivarheader #1#2#3{%
+\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
+\begingroup\defname {#2}{Instance Variable of #1}%
+\defvarargs {#3}\endgroup %
+}
+
+% These definitions are run if you use @defmethodx, etc.,
+% anywhere other than immediately after a @defmethod, etc.
+
+\def\defopx #1 {\errmessage{@defopx in invalid context}}
+\def\defmethodx #1 {\errmessage{@defmethodx in invalid context}}
+\def\defcvx #1 {\errmessage{@defcvx in invalid context}}
+\def\defivarx #1 {\errmessage{@defivarx in invalid context}}
+
+% Now @defvar
+
+% First, define the processing that is wanted for arguments of @defvar.
+% This is actually simple: just print them in roman.
+% This must expand the args and terminate the paragraph they make up
+\def\defvarargs #1{\normalparens #1%
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000}
+
+% @defvr Counter foo-count
+
+\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
+
+\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
+
+% @defvar == @defvr Variable
+
+\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
+
+\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{Variable}%
+\defvarargs {#2}\endgroup %
+}
+
+% @defopt == @defvr {User Option}
+
+\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
+
+\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{User Option}%
+\defvarargs {#2}\endgroup %
+}
+
+% @deftypevar int foobar
+
+\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
+
+% #1 is the data type. #2 is the name.
+\def\deftypevarheader #1#2{%
+\doind {vr}{\code{#2}}% Make entry in variables index
+\begingroup\defname {\code{#1} #2}{Variable}%
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000
+\endgroup}
+
+% @deftypevr {Global Flag} int enable
+
+\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
+
+\def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}%
+\begingroup\defname {\code{#2} #3}{#1}
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000
+\endgroup}
+
+% This definition is run if you use @defvarx
+% anywhere other than immediately after a @defvar or @defvarx.
+
+\def\defvrx #1 {\errmessage{@defvrx in invalid context}}
+\def\defvarx #1 {\errmessage{@defvarx in invalid context}}
+\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
+\def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}}
+\def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}}
+
+% Now define @deftp
+% Args are printed in bold, a slight difference from @defvar.
+
+\def\deftpargs #1{\bf \defvarargs{#1}}
+
+% @deftp Class window height width ...
+
+\def\deftp{\defvrparsebody\Edeftp\deftpx\deftpheader}
+
+\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
+\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
+
+% This definition is run if you use @deftpx, etc
+% anywhere other than immediately after a @deftp, etc.
+
+\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
+
+\message{cross reference,}
+% Define cross-reference macros
+\newwrite \auxfile
+
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% \setref{foo} defines a cross-reference point named foo.
+
+\def\setref#1{%
+%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Ysectionnumberandtype}}
+
+\def\unnumbsetref#1{%
+%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Ynothing}}
+
+\def\appendixsetref#1{%
+%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Yappendixletterandtype}}
+
+% \xref, \pxref, and \ref generate cross-references to specified points.
+% For \xrefX, #1 is the node name, #2 the name of the Info
+% cross-reference, #3 the printed node name, #4 the name of the Info
+% file, #5 the name of the printed manual. All but the node name can be
+% omitted.
+%
+\def\pxref#1{see \xrefX[#1,,,,,,,]}
+\def\xref#1{See \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup%
+\def\printedmanual{\ignorespaces #5}%
+\def\printednodename{\ignorespaces #3}%
+%
+\setbox1=\hbox{\printedmanual}%
+\setbox0=\hbox{\printednodename}%
+\ifdim \wd0=0pt%
+\def\printednodename{\ignorespaces #1}%
+%%% Uncommment the following line to make the actual chapter or section title
+%%% appear inside the square brackets.
+%\def\printednodename{#1-title}%
+\fi%
+%
+%
+% If we use \unhbox0 and \unhbox1 to print the node names, TeX does
+% not insert empty discretionaries after hyphens, which means that it
+% will not find a line break at a hyphen in a node names. Since some
+% manuals are best written with fairly long node names, containing
+% hyphens, this is a loss. Therefore, we simply give the text of
+% the node name again, so it is as if TeX is seeing it for the first
+% time.
+\ifdim \wd1>0pt
+section ``\printednodename'' in \cite{\printedmanual}%
+\else%
+\turnoffactive%
+\refx{#1-snt}{} [\printednodename], page\tie\refx{#1-pg}{}%
+\fi
+\endgroup}
+
+% \dosetq is the interface for calls from other macros
+
+% Use \turnoffactive so that punctuation chars such as underscore
+% work in node names.
+\def\dosetq #1#2{{\let\folio=0 \turnoffactive%
+\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}%
+\next}}
+
+% \internalsetq {foo}{page} expands into
+% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
+% When the aux file is read, ' is the escape character
+
+\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}}
+
+% Things to be expanded by \internalsetq
+
+\def\Ypagenumber{\folio}
+
+\def\Ytitle{\thischapter}
+
+\def\Ynothing{}
+
+\def\Ysectionnumberandtype{%
+\ifnum\secno=0 Chapter\xreftie\the\chapno %
+\else \ifnum \subsecno=0 Section\xreftie\the\chapno.\the\secno %
+\else \ifnum \subsubsecno=0 %
+Section\xreftie\the\chapno.\the\secno.\the\subsecno %
+\else %
+Section\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
+\fi \fi \fi }
+
+\def\Yappendixletterandtype{%
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{}%
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno %
+\else \ifnum \subsubsecno=0 %
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
+\else %
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
+\fi \fi \fi }
+
+\gdef\xreftie{'tie}
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Non-3.0.
+\else
+ \def\linenumber{\the\inputlineno:\space}
+\fi
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+
+\def\refx#1#2{%
+ \expandafter\ifx\csname X#1\endcsname\relax
+ % If not defined, say something at least.
+ $\langle$un\-de\-fined$\rangle$%
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \csname X#1\endcsname
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% Read the last existing aux file, if any. No error if none exists.
+
+% This is the macro invoked by entries in the aux file.
+\def\xrdef #1#2{
+{\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}}
+
+\def\readauxfile{%
+\begingroup
+\catcode `\^^@=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\^^C=\other
+\catcode `\^^D=\other
+\catcode `\^^E=\other
+\catcode `\^^F=\other
+\catcode `\^^G=\other
+\catcode `\^^H=\other
+\catcode `\ =\other
+\catcode `\^^L=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode 26=\other
+\catcode `\^^[=\other
+\catcode `\^^\=\other
+\catcode `\^^]=\other
+\catcode `\^^^=\other
+\catcode `\^^_=\other
+\catcode `\@=\other
+\catcode `\^=\other
+\catcode `\~=\other
+\catcode `\[=\other
+\catcode `\]=\other
+\catcode`\"=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode `\$=\other
+\catcode `\#=\other
+\catcode `\&=\other
+% the aux file uses ' as the escape.
+% Turn off \ as an escape so we do not lose on
+% entries which were dumped with control sequences in their names.
+% For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^
+% Reference to such entries still does not work the way one would wish,
+% but at least they do not bomb out when the aux file is read in.
+\catcode `\{=1 \catcode `\}=2
+\catcode `\%=\other
+\catcode `\'=0
+\catcode `\\=\other
+\openin 1 \jobname.aux
+\ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue
+\fi
+% Open the new aux file. Tex will close it automatically at exit.
+\openout \auxfile=\jobname.aux
+\endgroup}
+
+
+% Footnotes.
+
+\newcount \footnoteno
+
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only..
+\let\footnotestyle=\comment
+
+\let\ptexfootnote=\footnote
+
+{\catcode `\@=11
+\long\gdef\footnote #1{\global\advance \footnoteno by \@ne
+\unskip
+\edef\thisfootno{$^{\the\footnoteno}$}%
+\let\@sf\empty
+\ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+\thisfootno\@sf \footnotezzz{#1}}
+% \parsearg\footnotezzz}
+
+\long\gdef\footnotezzz #1{\insert\footins{
+\interlinepenalty\interfootnotelinepenalty
+\splittopskip\ht\strutbox % top baseline for broken footnotes
+\splitmaxdepth\dp\strutbox \floatingpenalty\@MM
+\leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
+\footstrut\parindent=\defaultparindent\hang\textindent{\thisfootno}#1\strut}}
+
+}%end \catcode `\@=11
+
+% End of control word definitions.
+
+\message{and turning on texinfo input format.}
+
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% Set some numeric style parameters, for 8.5 x 11 format.
+
+%\hsize = 6.5in
+\newdimen\defaultparindent \defaultparindent = 15pt
+\parindent = \defaultparindent
+\parskip 18pt plus 1pt
+\baselineskip 15pt
+\advance\topskip by 1.2cm
+
+% Prevent underfull vbox error messages.
+\vbadness=10000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. This makes it come to about 9pt for the 8.5x11 format.
+%
+\ifx\emergencystretch\thisisundefined \else
+ \emergencystretch = \hsize
+ \divide\emergencystretch by 45
+\fi
+
+% Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25)
+\def\smallbook{
+\global\lispnarrowing = 0.3in
+\global\baselineskip 12pt
+\global\parskip 3pt plus 1pt
+\global\hsize = 5in
+\global\doublecolumnhsize=2.4in \global\doublecolumnvsize=15.0in
+\global\vsize=7.5in
+\global\tolerance=700
+\global\hfuzz=1pt
+\global\contentsrightmargin=0pt
+
+\global\pagewidth=\hsize
+\global\pageheight=\vsize
+
+\global\let\smalllisp=\smalllispx
+\global\let\smallexample=\smalllispx
+\global\def\Esmallexample{\Esmalllisp}
+}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{
+\global\tolerance=700
+\global\hfuzz=1pt
+\global\baselineskip=12pt
+\global\parskip 15pt plus 1pt
+
+\global\vsize= 53\baselineskip
+\advance\vsize by \topskip
+%\global\hsize= 5.85in % A4 wide 10pt
+\global\hsize= 6.5in
+\global\outerhsize=\hsize
+\global\advance\outerhsize by 0.5in
+\global\outervsize=\vsize
+\global\advance\outervsize by 0.6in
+\global\doublecolumnhsize=\hsize
+\global\divide\doublecolumnhsize by 2
+\global\advance\doublecolumnhsize by -0.1in
+\global\doublecolumnvsize=\vsize
+\global\multiply\doublecolumnvsize by 2
+\global\advance\doublecolumnvsize by 0.1in
+
+\global\pagewidth=\hsize
+\global\pageheight=\vsize
+}
+
+%% For a final copy, take out the rectangles
+%% that mark overfull boxes (in case you have decided
+%% that the text looks ok even though it passes the margin).
+\def\finalout{\overfullrule=0pt}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+
+% This macro is used to make a character print one way in ttfont
+% where it can probably just be output, and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt \char '042}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt \char '176}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\lvvmode \kern.06em \vbox{\hrule width.3em height.1ex}}
+
+% \lvvmode is equivalent in function to \leavevmode.
+% Using \leavevmode runs into trouble when written out to
+% an index file due to the expansion of \leavevmode into ``\unhbox
+% \voidb@x'' ---which looks to TeX like ``\unhbox \voidb\x'' due to our
+% magic tricks with @.
+\def\lvvmode{\vbox to 0pt{}}
+
+\catcode`\|=\active
+\def|{{\tt \char '174}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+%\catcode 27=\active
+%\def^^[{$\diamondsuit$}
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+\def\turnoffactive{\let"=\normaldoublequote
+\let~=\normaltilde
+\let^=\normalcaret
+\let_=\normalunderscore
+\let|=\normalverticalbar
+\let<=\normalless
+\let>=\normalgreater
+\let+=\normalplus}
+
+% Set up an active definition for =, but don't enable it most of the time.
+{\catcode`\==\active
+\global\def={{\tt \char 61}}}
+
+\catcode`\@=0
+
+% \rawbackslashxx output one backslash character in current font
+\global\chardef\rawbackslashxx=`\\
+%{\catcode`\\=\other
+%@gdef@rawbackslashxx{\}}
+
+% \rawbackslash redefines \ as input to do \rawbackslashxx.
+{\catcode`\\=\active
+@gdef@rawbackslash{@let\=@rawbackslashxx }}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\rawbackslashxx}}
+
+% Say @foo, not \foo, in error messages.
+\escapechar=`\@
+
+% \catcode 17=0 % Define control-q
+\catcode`\\=\active
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+%
+@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi}
+
+%% These look ok in all fonts, so just make them not special. The @rm below
+%% makes sure that the current font starts out as the newly loaded cmr10
+@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other
+
+@textfonts
+@rm
+@message{Setting default page type to A4.}
+@afourpaper
+
+@c Local variables:
+@c page-delimiter: "^\\\\message"
+@c End:
diff --git a/support/vvcode/doc/vvcode.tex b/support/vvcode/doc/vvcode.tex
new file mode 100644
index 0000000000..8a0ac20b6b
--- /dev/null
+++ b/support/vvcode/doc/vvcode.tex
@@ -0,0 +1,255 @@
+\input texinfo.tex @c -*-texinfo-*-
+@tableindent=0.9in
+
+@comment %**start of header
+@setfilename vve-port.info
+@settitle VVcode
+@node Porting Guide, Porting Guide, Top, Top
+@comment %**end of header
+
+@iftex
+@finalout
+@end iftex
+
+@c -------------------------------------------------------------------------
+@c Note: Please update the edition number, month, and year
+@c Edition number is set at: settitle, subtitle and top node
+@c Month or date is set at: subtitle and top node;
+@c Search for: !!set
+@c -------------------------------------------------------------------------
+
+@ifinfo
+This file documents Vvcode, a superior replacement for UUcode to allow the
+documentation system that uses a single source file to produce both on-line
+information and a printed manual.
+
+This is the first edition of the VVcode documentation,
+@w{May 1992,} for VVcode version 1.00.
+
+Copyright (C) 1992 Niel Kempson
+
+This is the first edition of the VVcode documentation,@*
+and is consistent with version 1.00 of VVcode.
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+@ignore
+Permission is granted to process this file through TeX and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual).
+
+@end ignore
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Free Software Foundation.
+@end ifinfo
+
+
+
+@c
+@c *************************************************************************
+@c TITLE PAGE
+@c *************************************************************************
+@setchapternewpage odd
+@titlepage
+
+@c !!set Set the month and edition here.
+@title{VVcode}
+@subtitle{Last revised May 1992}
+@subtitle{for VVcode version 1.00}
+@author{Niel Kempson}
+@page
+
+@vskip 1in
+This is the first edition of the VVcode documentation and should be
+consistent with the following versions of VVcode:
+
+@itemize @bullet
+ @item VVcode system v1.00
+ @item MS-DOS port v1.00-001
+ @item OS/2 port v1.00-001
+ @item Unix port v1.00-001
+ @item VAX/VMS port v1.00-001
+ @item VM/CMS port v1.00-001
+@end itemize
+
+As VVcode is ported to new environments this documentation should be
+updated.
+
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1992 Niel Kempson
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions.
+@end titlepage
+@page
+
+
+
+@c *************************************************************************
+@c NODE: the top
+@c *************************************************************************
+@ifinfo
+@node Top, Copying, (dir), (dir)
+@top VVcode
+
+VVcode is a superior replacement for UUcode to enable the reliable
+transmission of data over the world's e-mail networks.
+
+@c !!set Set the date and edition here.
+This is the first edition of the VVcode documentation,
+@w{May 1992,} for VVcode version 1.00.
+@end ifinfo
+
+@menu
+* Copying:: VVcode copying conditions
+* Introduction:: Introduction to VVcode
+* User Manual:: Guide to using VVcode
+* Porting Guide:: How to port VVcode to a new environment
+* Testing Guide:: How to test VVcode
+* File Formats:: Definition of VVcode-related file formats
+@end menu
+
+
+
+@c *************************************************************************
+@c CHAPTER: VVcode copying conditions
+@c *************************************************************************
+@c node-name, next, previous, up
+@node Copying, Copying, Top, Top
+@unnumbered VVcode copying conditions
+
+The programs currently being distributed that relate to VVcode are
+@dfn{free}; this means that everyone is free to use them and free to
+redistribute them freely. The VVcode-related programs are not in the
+public domain; they are copyrighted and there are restrictions on their
+distribution, but these restrictions are designed to permit everything that
+a good cooperating citizen would want to do. What is not allowed is to try
+to prevent others from further sharing any version of these programs that
+they might get from you.@refill
+
+ Specifically, we want to make sure that you have the right to give away
+copies of the programs that relate to VVcode, that you receive source code
+or else can get it if you want it, that you can change these programs or
+use pieces of them in new free programs, and that you know you can do these
+things.@refill
+
+ To make sure that everyone has such rights, we have to forbid you to
+deprive anyone else of these rights. For example, if you distribute copies
+of the VVcode related programs, you must give the recipients all the rights
+that you have. You must make sure that they, too, receive or can get the
+source code. And you must tell them their rights.@refill
+
+ Also, for our own protection, we must make certain that everyone finds
+out that there is no warranty for the programs that relate to VVcode. If
+these programs are modified by someone else and passed on, we want their
+recipients to know that what they have is not what we distributed, so that
+any problems introduced by others will not reflect on our
+reputation.@refill
+
+ The precise conditions of the licenses for the programs currently being
+distributed that relate to VVcode are found in the General Public Licenses
+that accompany them.@refill
+
+
+
+@c *************************************************************************
+@c CHAPTER: Contributors to VVcode
+@c *************************************************************************
+@c node-name, next, previous, up
+@node Contributors, Contributors, Top, Top
+@unnumbered Contributors to VVcode
+
+In addition to Niel Kempson, several people have contributed to the
+development of VVcode.
+
+@itemize @bullet
+ @item Rainer Sch@"opf @code{<schoepf@@sc.ZIB-Berlin.de>} wrote the VM/CMS
+ implementation and has been very helpful during the testing of
+ VVcode.
+ @item Brian Hamilton Kelly @code{<TeX@@rmcs.cranfield.ac.uk>} for
+ encouragement and testing of the VAX/VMS implementation.
+ @item Konrad Bernlohr @code{<bern@@dhdmpi50.bitnet>} made some helpful
+ suggestions for improvements to the original version.
+ @item The Aston University @TeX{} archive group for help and
+ encouragement during the long gestation period. In alphabetical
+ order:
+ @itemize @bullet
+ @item Adrian Clark @code{<alien@@essex.ac.uk>}
+ @item Brian Hamilton Kelly @code{<tex@@rmcs.cranfield.ac.uk>}
+ @item Dave Osborne @code{<d.osborne@@mips.nottingham.ac.uk>}
+ @item Max Calvini @code{<m_calvini@@TeX.ac.uk>}
+ @item Peter Abbott @code{<p.abbott@@aston.ac.uk>}
+ @item Phil Taylor @code{<chaa006@@vax.rhbnc.ac.uk>}
+ @item Rainer Sch@"opf @code{<schoepf@@sc.ZIB-Berlin.de>}
+ @item Sebastian Rahtz @code{<s_rahtz@@TeX.ac.uk>}
+ @end itemize
+@end itemize
+
+
+
+@c *************************************************************************
+@c CHAPTER: Introduction to VVcode
+@c *************************************************************************
+@include vvintro.texinfo
+
+
+
+@c *************************************************************************
+@c CHAPTER: Guide to using VVcode
+@c *************************************************************************
+@include vvuser.texinfo
+
+
+
+@c *************************************************************************
+@c CHAPTER: Installing VVcode
+@c *************************************************************************
+@include vvinstal.texinfo
+
+
+
+@c *************************************************************************
+@c CHAPTER: How to port VVcode to a new environment
+@c *************************************************************************
+@include vvport.texinfo
+
+
+
+@c *************************************************************************
+@c CHAPTER: How to test VVcode
+@c *************************************************************************
+@include vvtest.texinfo
+
+
+
+@c *************************************************************************
+@c CHAPTER: Definition of VVcode-related file formats
+@c *************************************************************************
+@include vvfiles.texinfo
+
+
+
+@c *************************************************************************
+@c Table of Contents
+@c *************************************************************************
+@contents
+@bye
diff --git a/support/vvcode/doc/vvfiles.tex b/support/vvcode/doc/vvfiles.tex
new file mode 100644
index 0000000000..bf019f4ddb
--- /dev/null
+++ b/support/vvcode/doc/vvfiles.tex
@@ -0,0 +1,1287 @@
+@c *************************************************************************
+@c CHAPTER: Definition of VVcode-related file formats
+@c *************************************************************************
+@c node-name, next, previous, up
+@node File Formats, File Formats, Top, Top
+@chapter Definition of VVcode-related file formats
+
+
+@c =========================================================================
+@c SECTION: Format of the VVE file
+@c =========================================================================
+@section Format of the VVE file
+
+A VVE file consists of three logical sections in the following logical
+format:
+
+@example
+<VVE file> ::= <initial preamble>
+ <encoded data lines>
+ <terminal postamble>
+@end example
+
+The @code{<initial preamble>} and @code{<terminal postamble>} sections
+contain VVE "header" lines used to record and control the characteristics
+of the encoding/decoding process. The @code{<encoded data lines>} section
+contains the data from the original file, encoded using the VVcode scheme.
+
+It is sometimes desirable to transmit the VVE file in more than one part,
+so the logical format is extended to cater for multi-part files:
+
+@example
+<first part> ::= <initial preamble>
+ <encoded data lines>
+ <continuation postamble>
+
+<middle part> ::= <continuation preamble>
+ <encoded data lines>
+ <continuation postamble>
+
+<last part> ::= <continuation preamble>
+ <encoded data lines>
+ <terminal postamble>
+@end example
+
+There is always one @code{<first part>} and one @code{<last part>} part in
+a multi-part VVE file. There may be zero (for a two part file) or more
+@code{<middle part>} parts.
+
+The sections are described in more detail below.
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: Line Prefix and Suffix
+@c -------------------------------------------------------------------------
+@subsection Line Prefix and Suffix
+@itemize @bullet
+ @item each line has a "Vv" prefix and "V" suffix
+
+ @item prefix - elimination of mailer lines
+
+ @item postfix - avoid space stripping by certain mailers
+@end itemize
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: Preamble Sections
+@c -------------------------------------------------------------------------
+@subsection Preamble Sections
+The preamble sections are used to initialize VVdecode before it starts to
+decode the encoded file data. Each preamble consists of a set of VVE
+header lines, each specifying a particular parameter relevant to the
+encoding/decoding operation. Each preamble section comprises a set of
+optional header lines followed by the set of required header lines. the
+syntax and use of the header lines is described in section 1.4.
+
+
+@subsubsection Preamble
+The initial preamble is used to initialize VVdecode parameters before it
+starts to decode the encoded file (e.g. the file mode and timestamp). The
+logical format of this section is:
+
+@example
+<initial preamble> ::= <optional initialization headers>
+ <begin header>
+@end example
+
+The @code{mode}, @code{format} and optional headers may be in any order,
+but the @code{begin} header must be the last header in this preamble
+section. None, any or all of the following optional headers may be present
+in the initial preamble section:
+
+@example
+<optional initializiation headers> ::= <characterset header>
+ <comment header>
+ <decodeversion header>
+ <format header>
+ <mode header>
+ <operatingsystem header>
+ <recordlength header>
+ <table header>
+ <timestamp header>
+@end example
+
+Note that only the @code{comment} header line may appear more than once in
+this section.
+
+@subsubsection Continuation Preamble
+
+The initial preamble is used to reset certain VVdecode parameters before it
+starts to decode the next section of the VVE file. The logical format of
+this section is:
+
+@example
+<continuation preamble> ::= <optional continuation headers>
+ <skipfrom header>
+@end example
+
+The optional headers may be in any order, but the @code{skipfrom} header
+must be the last header in this preamble section. None, any or all of the
+following optional headers may be present in this section:
+
+@example
+<optional initializiation headers> ::= <comment header>
+ <table header>
+@end example
+
+Note that only the @code{comment} header line may appear more than once in
+this section.
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: Postamble Sections
+@c -------------------------------------------------------------------------
+@subsection Postamble Sections
+The preamble sections are used to initialize VVdecode before it starts to
+decode the encoded file data. Each preamble consists of a set of VVE
+header lines, each specifying a particular parameter relevant to the
+encoding/decoding operation. Each preamble section comprises a set of
+optional header lines followed by the set of required header lines.
+
+@subsubsection Postamble
+[TODO] put in some text here
+@example
+<continuation postamble> ::= <skipto header>
+ <comment header>
+@end example
+
+The @code{comment} header line is optional and may appear more than once in
+this section.
+
+@subsubsection Terminal Postamble
+[TODO] put in some text here
+@example
+<continuation preamble> ::= <end header>
+ <optional terminal headers>
+
+<optional initializiation headers> ::= <bytecount header>
+ <comment header>
+ <crc32 header>
+@end example
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: Encoded Data Lines
+@c -------------------------------------------------------------------------
+@subsection Encoded Data Lines
+[TODO] put in some text here
+@itemize @bullet
+ @item describe what these lines are used for
+
+ @item format of the encoded line
+
+ @item termination of each section of encoded data (zero length line)
+
+ @item describe the different underlying data formats for fixed, stream
+ and variable format records
+@end itemize
+
+
+@c =========================================================================
+@c SECTION: VVE Header Lines
+@c =========================================================================
+@section VVE Header Lines
+
+A VVE header line takes the form
+
+@example
+<header-name> <parameter-1> <parameter-2> ... <parameter-N>
+@end example
+
+Most headers take only one parameter and parameters are normally separated
+by whitespace, though certain headers (e.g. @code{begin}) take more than one
+parameter and can include whitespace in the parameters. The format of each
+of the VVE header lines is described below. Two important symbols used in
+the description are:
+
+@table @code
+ @item <WS>
+ used to denote whitespace which may include spaces, tabs but not
+ the end of the line. The syntax
+
+ @example
+ xyz <WS> parameter <WS> <EOL>
+ @end example
+
+ states that header @code{xyz} takes a parameter which starts at the
+ first non-whitespace character after the @code{xyz} header name and
+ is terminated by the first whitespace character after that or the
+ end of line. This syntax is used to specify parameters which do
+ not contain whitespace.
+
+ @item <EOL>
+ used to denote the end of the line. The syntax
+
+ @example
+ xyz <WS> parameter <EOL>
+ @end example
+
+ states that header @code{xyz} takes a parameter which starts at the
+ first non-whitespace character after the @code{xyz} header name and
+ is terminated by the end of the line. This format would be used to
+ specify that parameters can include whitespace.
+
+ @item <NXT-HDR>
+ used to denote the next VVE header in the file. The syntax
+
+ @example
+ xyz <WS> parameter <NXT-HDR>
+ @end example
+
+ states that the header @code{xyz} takes a parameter which starts at
+ the first non-whitespace character after the @code{xyz} header
+ name and is terminated by the start of the next VVE header. This
+ format would be used to specify that parameters can span several
+ lines.
+
+ NOTE: the @code{<EOL>} characters are removed when the contents of
+ the lines are joined together.
+@end table
+
+Following is a detailed description of each VVE header. For each header
+there is a set of headings in the format shown below for the @code{example}
+header.
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{example}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{example}
+
+@table @strong
+ @item Purpose:
+ Brief summary of the purpose of this header.
+
+ @item Location:
+ Describe where in the VVE file that this header will be found. The
+ locations are:
+
+ @itemize @bullet
+ @item initial preamble
+ @item continuation preamble
+ @item continuation postamble
+ @item terminal postamble
+ @end itemize
+
+ Also indicated is whether the header is required or optional.
+
+ @item Syntax:
+ @code{example <WS> parameter <WS> <EOL>}
+
+ This part shows the syntax of the header including the header name,
+ the number of parameters and the delimiters used to separate the
+ parameters.
+
+ @item Remarks:
+ This part provides extra information on the use of the header and
+ includes any limits that are imposed on the parameter value.
+
+ @item VVencode:
+ The header will be written to the VVE file by Vvencode and this
+ part describes the circumstances under which VVencode will write
+ the header line.
+
+ @item VVdecode:
+ This part describes how VVdecode should behave when it encounters
+ the header in a VVE file. In addition, specific processing rules
+ are documented for specific cases, namely:
+
+ @table @code
+ @item OK
+ what VVdecode should do if a valid header line is found in
+ the VVE file.
+
+ @item MISSING
+ what VVdecode should do if the header line was not found in
+ the VVE file.
+
+ @item INVALID
+ what VVdecode should do if the header line was found, but
+ with missing or invalid parameter values.
+ @end table
+
+ @item Example:
+ @code{example parameter}
+
+ Here you'll find a simple example of a valid example header line.
+@end table
+
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{begin}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{begin}
+@table @strong
+ @item Purpose:
+ Signifies the absolute start of the VVencoded data.
+
+ @item Location:
+ Initial preamble (required).
+
+ @item Syntax:
+ @code{begin <WS> file-specification <EOL>}
+
+ @item Remarks:
+ The file specification may include spaces, though leading and
+ trailing spaces will be lost. There is no restriction on the
+ characters used in the file specification, but characters outside
+ the VVcode default encoding table may be corrupted when passing
+ through mail gateways or systems with differing character sets.
+
+ @item VVencode:
+ The file specification recorded in the VVE file is usually derived
+ from the input file specification stripped of any preamble or
+ postamble components and will therefore consist only of a name
+ and/or extension component. The value recorded can be explicitly
+ specified with the @code{header_filespec} command qualifier.
+
+ @item VVdecode:
+ VVdecode will use the file specification recorded to construct the
+ default file specification for the output file. If the output file
+ is specified on the VVdecode command line, the value specified on
+ the @code{begin} header will only be used if the implementation of
+ VVcode for the operating system has been defined to use "sticky
+ defaults".
+
+ The file specification may have been derived from a different
+ operating system and may therefore be invalid on the local system.
+ Before it is used VVdecode will convert the file specification to
+ one that is valid.
+
+ Processing rules:
+
+ @table @code
+ @item OK
+ If required, convert the file specification so that it is
+ legal on the local operating system and use the legal value
+ as the default file specification for the output file.
+
+ @item MISSING
+ Issue a fatal error message and stop.
+
+ @item INVALID
+ Issue a fatal error message and stop.
+ @end table
+
+ @item Example:
+ @code{begin input-file.txt}@*
+ @code{begin input file name with spaces}
+@end table
+
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{bytecount}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{bytecount}
+@table @strong
+ @item Purpose:
+ Records the total number of bytes read by VVencode.
+
+ @item Location:
+ Final postamble (optional).
+
+ @item Syntax:
+ @code{bytecount <WS> total-bytes-read <WS> <EOL>}
+
+ @item Remarks:
+ The total is a positive signed 32 decimal bit number and must
+ therefore be in the range 0 - 2147483647. On systems which
+ differentiate between binary and text files, this number is likely
+ to be dependent on the mode (i.e. binary/text) used to read and
+ encode the file.
+
+ @item VVencode:
+ VVencode keeps a cumulative total of the bytes read and record this
+ total in the terminal postamble of VVE file.
+
+ @item VVdecode:
+ VVdecode keeps a cumulative total of the bytes decoded and written
+ and compare it with the VVE recorded value as a confidence check.
+
+ Processing rules:
+
+ @table @code
+ @item OK
+ Compare the VVE recorded value with the total bytes written
+ by VVdecode. Issue a warning if the two totals are
+ different.
+
+ @item MISSING
+ Don't attempt the comparison.
+
+ @item INVALID
+ Issue a non-fatal error message and assume that the header
+ is missing.
+ @end table
+
+ @item Example:
+ @code{bytecount 8388608}
+@end table
+
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{characterset}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{characterset}
+@table @strong
+ @item Purpose:
+ Records the character set of the VVencoded data.
+
+ @item Location:
+ Initial preamble (optional).
+
+ @item Syntax:
+ @code{characterset <WS> charset-string <WS> <EOL>}
+
+ @item Remarks:
+ The parameter string records the character set of the encoded data
+ in the VVE file. There are no formal controls on the string to use
+ for a particular character set, the string is simply compared
+ against a local value. Eventually, an informal directory of
+ character set strings may evolve.
+
+ @item VVencode:
+ VVencode will record the character set of the encoded data which
+ under normal circumstances the character set will be the local
+ character set for the operating system. If the
+ @code{translation_file} command line qualifier is specified,
+ VVencode will translate the original data from the local character
+ set to a new character set specified by the translation file. In
+ this case, VVencode will record the new character set.
+
+ @item VVdecode:
+ VVdecode uses this header to determine whether the encoded data in
+ the VVE file is of the same character set as that used on the local
+ operating system. If the character sets are different, a warning
+ will be issued.
+
+ If the @code{translation_file} command line qualifier is specified,
+ VVdecode will translate the VVE encoded data to a new character set
+ specified by the translation file. In this case, VVdecode will
+ compare the VVE file character set with the "from" character set
+ expected by the translation file.
+
+ Processing rules:
+
+ @table @code
+ @item OK
+ Compare the VVE character set with the local operating
+ system character set (or the translation file "from"
+ character set if appropriate). Issue a warning message if
+ the two character sets are different.
+
+ @item MISSING
+ Assume that the VVE character set is the same as the local
+ operating system character set.
+
+ @item INVALID
+ Issue a non-fatal error message and assume that the header
+ is missing.
+ @end table
+
+ @item Example:
+ @code{characterset ASCII}
+@end table
+
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{comment}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{comment}
+@table @strong
+ @item Purpose:
+ Records commentary information deemed to be of sufficient
+ importance to warrant displaying it when VVdecoding the file.
+
+ @item Location:
+ Initial preamble, continuation preamble, continuation postamble,
+ final postamble (optional).
+
+ @item Syntax:
+ @code{comment <WS> comment-string <EOL>}
+
+ @item Remarks:
+ The comment string is free form text, but care should be taken not
+ to use characters that may be corrupted by mail gateways or when
+ passing through systems with different character sets.
+
+ @item VVencode:
+ VVencode will record information deemed (by the programmer) to be
+ important and worth flagging to the VVdecode user. Currently this
+ facility is only used to record the original character set when
+ VVencode has been invoked with @code{translation_file} command line
+ qualifier to convert the original data to a new character set
+ before VVencoding.
+
+ @item VVdecode:
+ Generally VVdecode will display any comments encountered on the log
+ file.
+
+ Processing rules:
+
+ @table @code
+ @item OK
+ If the @code{log} command line qualifier was specified,
+ display the comment on the log file, otherwise ignore the
+ comment.
+
+ @item MISSING
+ No action.
+
+ @item INVALID
+ Issue a non-fatal error message and ignore the comment.
+ @end table
+
+ @item Example:
+ @code{comment This file is only useful on Unix systems}@*
+ @code{Original character set was `EBCDIC'}
+@end table
+
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{crc32}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{crc32}
+@table @strong
+ @item Purpose:
+ Records the 32 bit CRC of the bytes read by VVencode.
+
+ @item Location:
+ Final postamble (optional).
+
+ @item Syntax:
+ @code{crc32 <WS> input-file-crc32 <WS> <EOL>}
+
+ @item Remarks:
+ The CRC value is an unsigned 32 bit hexadecimal number and must
+ therefore be in the range 0 - FFFFFFFF. On systems which
+ differentiate between binary and text files, this number is likely
+ to be dependent on the mode (i.e. binary/text) used to read and
+ encode the file.
+
+ The CRC polynomial used is the same as that used by the popular ZIP
+ and ARJ archiving programs. When encoding in binary mode, the CRC
+ recorded should be identical to that computed by ARJ and ZIP.
+
+ @item VVencode:
+ VVencode computes a 32 bit CRC of the bytes read and record this
+ CRC in the terminal postamble of VVE file.
+
+ @item VVdecode:
+ VVdecode computes a 32 bit CRC of the bytes decoded and written and
+ compare it with the VVE recorded value as a confidence check.
+
+ Processing rules:
+
+ @table @code
+ @item OK
+ Compare the VVE recorded value with the total bytes written
+ by VVdecode. Issue a warning if the two CRCs are
+ different.
+
+ @item MISSING
+ Don't attempt the comparison.
+
+ @item INVALID
+ Issue a non-fatal error message and assume that the header
+ is missing.
+ @end table
+
+
+ @item Example:
+ @code{crc32 1e0cb8a7}
+@end table
+
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{decodeversion}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{decodeversion}
+@table @strong
+ @item Purpose:
+ Records the minimum major version number of VVcode required to
+ decode the VVE file.
+
+ @item Location:
+ Initial preamble (optional).
+
+ @item Syntax:
+ @code{decodeversion <WS> min-decode-version <WS> <EOL>}
+
+ @item Remarks:
+ The minimum decode version is a positive integer and records the
+ minimum major version of VVcode required to decode the VVE file.
+
+ The VVcode version number has a "major" and "minor" version. For
+ example, VVcode version 1.2 has a major version of 1 and a minor
+ version of 2 and the header
+
+ @example
+ decodeversion 2
+ @end example
+
+ signifies that VVdecode version 2.0 or later is required to decode
+ the file.
+
+ Whenever a change is made to the VVE file format that is not
+ backwards compatible, the major version number of VVcode will be
+ incremented.
+
+ @item VVencode:
+ VVencode records the minimum major version number required to
+ decode the VVE file in the initial preamble of the VVE file.
+
+ @item VVdecode:
+ VVdecode uses the recorded value to check whether it can decode the
+ file.
+
+ Processing rules:
+
+ @table @code
+ @item OK
+ Check that the major version of VVdecode is not less than
+ the recorded value. If it is, issue a fatal error message
+ and stop.
+
+ @item MISSING
+ Assume that the current version of VVdecode is OK and
+ proceed.
+
+ @item INVALID
+ Issue a non-fatal error message and assume that the header
+ is missing.
+ @end table
+
+ @item Example:
+ @code{decodeversion 1}
+@end table
+
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{end}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{end}
+@table @strong
+ @item Purpose:
+ Signifies the absolute end of the VVencoded data.
+
+ @item Location:
+ Final postamble (required).
+
+ @item Syntax:
+ @code{end <WS> <EOL>}
+
+ @item Remarks:
+ This header signifies that there are no more encoded data lines to
+ process and that the terminal preamble is about to start.
+
+ @item VVencode:
+ After the complete input file has been encoded, VVencode will write
+ a "zero length" encoded line followed by the @code{end} header line
+ and the terminal postamble section.
+
+ @item VVdecode:
+ After reading this header, VVdecode will cease decoding the encoded
+ data bytes and start to read the terminal postamble.
+
+ Processing rules:
+
+ @table @code
+ @item OK
+ Cease decoding the encoded data bytes and start to read the
+ terminal postamble.
+
+ @item MISSING
+ Issue a fatal error message and stop.
+
+ @item INVALID
+ This shouldn't be possible, but if so issue a fatal error
+ message and stop.
+ @end table
+
+ @item Example:
+ @code{end}
+@end table
+
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{format}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{format}
+@table @strong
+ @item Purpose:
+ Records the file organization format of the VVencoded file.
+
+ @item Location:
+ Initial preamble (optional).
+
+ @item Syntax:
+ @code{format <WS> format-string <WS> <EOL>}
+
+ @item Remarks:
+ The format string must be one of "fixed", "stream" or "variable",
+ though the value may be lower, upper or mixed case. VVcode
+ supports these three type of file organization, though not all
+ operating systems will support all three. Note that the internal
+ format of the encoded data will depend on the file organization.
+
+ @item VVencode:
+ VVencode records the organization of the encoded file. Note that
+ this is the format used by VVencode to read the file which may not
+ necessarily be the real format of the original file.
+
+ @item VVdecode:
+ VVdecode will use this header to identify the internal format of
+ the encoded data to enable it to be decoded correctly. The format
+ will also be used as the default format to create the output file.
+
+ If the VVE file format is not supported by the local operating
+ system, VVdecode will create the output file using the default file
+ format for the operating system. The @code{format} command line
+ qualifier may be used to override the format of the output file.
+
+ Processing rules:
+
+ @table @code
+ @item OK
+ Use the header value to decode the encoded data bytes and
+ to determine the default format of the output file.
+
+ @item MISSING
+ Issue a fatal error message and stop.
+
+ @item INVALID
+ Issue a fatal error message and stop.
+ @end table
+
+ @item Example:
+ @code{format stream}
+@end table
+
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{mode}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{mode}
+@table @strong
+ @item Purpose:
+ Records the mode of the VVencoded file.
+
+ @item Location:
+ Initial preamble (optional).
+
+ @item Syntax:
+ @code{mode <WS> mode-string <WS> <EOL>}
+
+ @item Remarks:
+ The format string must be one of "binary" or "text", though the
+ value may be lower, upper or mixed case. VVcode supports both
+ binary and text mode files, though not all operating systems will
+ support both modes. The mode will often influence the default file
+ format used by the operating system. Most operating systems
+ distinguish between text and binary files, though Unix is a notable
+ exception.
+
+ @item VVencode:
+ VVencode records the mode of the encoded file. Note that this is
+ the mode used by VVencode to read the file which may not
+ necessarily be the real mode of the original file.
+
+ @item VVdecode:
+ VVdecode will use this header to mode of the encoded file. The
+ mode will also be used as the default mode for the output file.
+
+ If the VVE file mode is not supported by the local operating
+ system, VVdecode will create the output file using the default file
+ mode for the operating system. The @code{mode} command line
+ qualifier may be used to override the mode of the output file.
+
+ Processing rules:
+
+ @table @code
+ @item OK
+ Use the header value to determine the default mode of the
+ output file.
+
+ @item MISSING
+ Issue a fatal error message and stop.
+
+ @item INVALID
+ Issue a fatal error message and stop.
+ @end table
+
+ @item Example:
+ @code{mode binary}
+@end table
+
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{operatingsystem}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{operatingsystem}
+@table @strong
+ @item Purpose:
+ Records the operating system on which the file was VVencoded.
+
+ @item Location:
+ Initial preamble (optional).
+
+ @item Syntax:
+ @code{operatingsystem <WS> operating-system-name <WS> <EOL>}
+
+ @item Remarks:
+ The parameter string records the operating system on which the
+ version of VVencode used to create the VVE file was running. There
+ are no formal controls on the string to use for a particular
+ character set, the string is simply compared against a local value.
+ The string is coded into the VVcode machine dependent header file
+ so this shouldn't be too much of a problem.
+
+ It is useful for the decoder to know whether the file was encoded
+ on the same operating system to influence the decoding process.
+ For example, if the original operating system is different any
+ private data would usually be ignored.
+
+ @item VVencode:
+ VVencode will record the string for the local operating system as
+ coded in the machine dependent header file (machine.h).
+
+ @item VVdecode:
+ VVdecode will compare the header value with that recorded for the
+ local operating system in the machine dependent header file
+ (machine.h) to determine whether the original file was encoded on
+ the same operating system.
+
+ Processing rules:
+
+ @table @code
+ @item OK
+ Compare the header value with the local operating system
+ string to determine whether the two operating systems are
+ different. Parts of the decoding process will be affected
+ by this decision.
+
+ @item MISSING
+ Assume that the operating system on which the file was
+ encoded is the same as the local operating system.
+
+ @item INVALID
+ Issue a non-fatal error message and assume that the header
+ is missing.
+ @end table
+
+ @item Example:
+ @code{operatingsystem MS-DOS}@*
+ @code{operatingsystem Unix}
+@end table
+
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{recordlength}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{recordlength}
+@table @strong
+ @item Purpose:
+ Records the maximum and longest length records in the VVencoded
+ file.
+
+ @item Location:
+ Initial preamble (optional).
+
+ @item Syntax:
+ @code{recordlength <WS> max-rec-len <WS> long-rec-len <WS> <EOL>}
+
+ @item Remarks:
+ Both versions of the record length must be either a decimal number
+ within the VVcode supported range of 0 - 65535 or -1. The value -1
+ has a special meaning for each of the record lengths:
+
+ max-rec-len the maximum record length is unknown or there is no
+ explicit maximum record length for this file
+ (this usually defaults to the maximum record
+ length supported by the operating system).
+
+ lng-rec-len the length of the longest record in the file is
+ unknown.
+
+ The record length is usually relevant only for fixed and variable
+ length record format files. The maximum record length is that
+ allowed by the operating system for the file, whereas the longest
+ is the length of the longest record in the file. For variable
+ length record files the longest length must be less than or equal
+ to the maximum record length, whereas for fixed length record
+ files, the longest record length should be equal to the maximum
+ record length.
+
+ @item VVencode:
+ Where possible, VVencode will attempt to determine these parameters
+ and record them in the VVE file. Note that the @code{recordlength}
+ header is in the initial preamble so these parameters must be
+ determined before the file is opened for encoding. The value may
+ be overridden by the @code{record_length} command line qualifier.
+
+ @item VVdecode:
+ If the output file format is fixed or variable length records,
+ Vvdecode will use these values to create a file of the correct
+ type. The parameter values will be checked, even if they will not
+ be used during the subsequent decoding activities. If the
+ parameter values are unknown or invalid, VVdecode will use default
+ values appropriate to the file format and the local operating
+ system.
+
+ Note that the record length might be valid for the VVE file (i.e.
+ in the range 0 - 65535), but be invalid for the file format and
+ local operating system.
+
+ Processing rules:
+
+ @table @code
+ @item OK
+ Use the values to create a file of the correct type and
+ format.
+
+ @item MISSING
+ Use appropriate default values for the file format and
+ local operating system.
+
+ @item INVALID
+ Issue a non-fatal error message and assume that the header
+ is missing.
+ @end table
+
+ @item Example:
+ @code{recordlength -1 132}@*
+ @code{recordlength 255 -1}@*
+ @code{recordlength 32256 32256}
+@end table
+
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{skipfrom}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{skipfrom}
+@table @strong
+ @item Purpose:
+ Signifies the start of a segment of VVencoded data.
+
+ @item Location:
+ Continuation preamble (required).
+
+ @item Syntax:
+ @code{skipfrom <WS> part-number <WS> file-specification <EOL>}
+
+ @item Remarks:
+ The @code{skipfrom} header is used when VVencode creates a
+ multi-part VVE file and is analogous to the @code{begin} header in
+ the first part. The part-number parameter records the number of
+ the previous VVE file part. Both parameters are included in the
+ header to provide a reasonable degree of confidence that the wanted
+ part of the encoded file has been found.
+
+ @item VVencode:
+ A @code{skipfrom} header will only be written if VVencode was
+ invoked with the @code{split_size} command line qualifier and the
+ VVE file is long enough to require more than one part. The file
+ specification recorded in the VVE file is the same as that in the
+ @code{begin} header. The number of the previous VVE file part is
+ also recorded.
+
+ @item VVdecode:
+ VVdecode will check that the file specification and part number
+ match those expected for the next part. If both do not match,
+ VVdecode will continue to look for the wanted VVE file part.
+
+ Processing rules:
+
+ @table @code
+ @item OK
+ If the wanted part has been found, start to decode the next
+ section of encoded data lines. If this @code{skipfrom}
+ does not correspond to the wanted part, continue to search
+ for the correct @code{skipfrom} header.
+
+ @item MISSING
+ Issue a fatal error message and stop.
+
+ @item INVALID
+ Issue a non-fatal error message and ignore the header.
+ @end table
+
+ @item Example:
+ @code{skipfrom 2 input-file.txt}@*
+ @code{skipfrom 2 file name with spaces}
+@end table
+
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{skipto}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{skipto}
+@table @strong
+ @item Purpose:
+ Signifies the end of a segment of VVencoded data with more data
+ still to come.
+
+ @item Location:
+ Continuation postamble (required).
+
+ @item Syntax:
+ @code{skipto <WS> part-number <WS> <EOL>}
+
+ @item Remarks:
+ The @code{skipto} is used when VVencode creates a multi-part VVE
+ file and is analogous to the @code{end} header in the last part.
+ The parameter records the number of the next VVE file part.
+
+ @item VVencode:
+ A @code{skipto} header will only be written if VVencode was invoked
+ with the @code{split_size} command line qualifier and the VVE file
+ is long enough to require more than one part. The number of the
+ next VVE file part is recorded.
+
+ After the section of encoded files has been completed, VVencode
+ will write a "zero length" encoded line followed by the @code{skipto}
+ header line.
+
+ @item VVdecode:
+ After reading this header, VVdecode will check that the part number
+ recorded is correct. If it is, VVdecode will start to search for
+ the next VVE file part.
+
+ Processing rules:
+
+ @table @code
+ @item OK
+ Start to search for the next VVE file part.
+
+ @item MISSING
+ Issue a fatal error message and stop.
+
+ @item INVALID
+ Issue a fatal error message and stop.
+ @end table
+
+ @item Example:
+ @code{skipto 2}
+@end table
+
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{table}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{table}
+@table @strong
+ @item Purpose:
+ Records the character table used to encode the file data bytes.
+
+ @item Location:
+ Initial preamble, continuation preamble (optional).
+
+ @item Syntax:
+ @code{table <WS> table-contents <NXT-HDR>}
+
+ @item Remarks:
+ The encoding table is recorded along with the data to enable the
+ decoding program to detect any simple character translations or
+ corruptions that may have occurred during the transmission of the
+ VVE file. There is no restriction on the characters that may be
+ used in the encoding table, but it is sensible to use characters
+ that are normally immune to network corruptions.
+
+ The table comprises 64 characters which are used to represent the
+ codes 0 - 63 of the VVcode encoding character set. The table
+ contents may be presented on the same line as the @code{table}
+ header or preferably split over several lines to avoid the wrapping
+ of long lines performed by some mail gateways. If the table
+ contents are split over several lines, the newline characters are
+ removed before the lines are concatenated. The next valid header
+ line encountered will terminate the reading of the table contents.
+
+ Note that whitespace characters at the end of a line may be removed
+ in transmission by certain systems that strip trailing whitespace
+ from files. It is strongly recommended that whitespace characters
+ are not used in encoding tables.
+
+ @item VVencode:
+ VVencode will record the contents of the encoding table used to
+ encode the original file.
+
+ @item VVdecode:
+ VVdecode will use the contents of the encoding table to construct
+ (by inversion) the table to decode the VVE file data. The table
+ contents will be checked for length and repeated characters which
+ would prevent the construction of a valid decoding table.
+
+ Processing rules:
+
+ @table @code
+ @item OK
+ Use the table contents to construct the decoding table and
+ thus decode the VVE file.
+
+ @item MISSING
+ Assume the default VVcode table.
+
+ @item INVALID
+ Issue a fatal error message and stop.
+ @end table
+
+ @item Example:
+ @code{table}@*
+ @code{+-0123456789}@*
+ @code{abcdefghijklmnopqrstuvwxyz}@*
+ @code{ABCDEFGHIJKLMNOPQRSTUVWXYZ}@*
+ @code{begin file-specification}
+@end table
+
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: @code{timestamp}
+@c -------------------------------------------------------------------------
+@page
+@subsection @code{timestamp}
+@table @strong
+ @item Purpose:
+ Records the modification time of the VVencoded file.
+
+ @item Location:
+ Initial preamble (optional).
+
+ @item Syntax:
+ @code{timestamp <WS> VVcode-timestamp <WS> <EOL>}
+
+ @item Remarks:
+ This header is used to record the modification time of the encoded
+ file so that it can be preserved when the file is decoded. The
+ timestamp is recorded in the format:
+
+ @example
+ YYYY.MM.DD-HH:MM:SS
+ @end example
+
+ where each of the components are defined as:
+
+ @table @code
+ @item YYYY
+ year (range: 1970 - 2037)
+ @item MM
+ month (range: 01 -12)
+ @item DD
+ day of month (range: 01 - 31)
+ @item HH
+ hour (range: 00 - 23)
+ @item MM
+ minutes (range: 00 - 59)
+ @item SS
+ seconds (range: 00 - 59)
+ @end table
+
+ The time is based on the Unix internal time format which represents
+ the time as a signed 32 bit integer recording the number of seconds
+ since 1-Jan-1970 00:00 GMT. The VVE timestamp recorded must be in
+ the range:
+
+ 1970.01.01-00:00:00 to 2037.12.31-23:59:59 GMT
+
+ Some operating systems support a wider range of system times (e.g.
+ VAX/VMS) and some support only a narrower range (e.g. MS-DOS) but
+ implementations of VVcode for these systems must ensure that
+ timestamps in the VVcode range can be handled when encoding and
+ decoding.
+
+ Note: The timestamp is always recorded as a GMT (or Coordinated
+ Universal Time) time.
+
+ @item VVencode:
+ VVencode will record the modification time of the encoded file or
+ that specified with the @code{timestamp} command line qualifier.
+ If VVencode cannot determine the modification time of the encoded
+ file and the time is not specified using the @code{timestamp}
+ command line qualifier, the @code{timestamp} VVE header line will
+ not be recorded. If the timestamp of the file is outside the range
+ of times supported by the VVE file, VVencode should either
+ "truncate" the time value to a value that is within the range or
+ not record the timestamp. In either case, a warning should be
+ issued.
+
+ @item VVdecode:
+ VVdecode will use the @code{timestamp} header value to set the
+ modification of the decoded file to that recorded. If the
+ implementation of VVdecode is unable to do this, it should issue a
+ warning.
+
+ If the timestamp recorded in the VVE file is outside the range of
+ times supported by the operating system, VVdecode should either
+ "truncate" the time value to a value that is within the range or
+ not set the file timestamp. In either case, a warning should be
+ issued.
+
+ Processing rules:
+
+ @table @code
+ @item OK
+ Use the header value to set the modification time of the
+ decoded file.
+
+ @item MISSING
+ Do not attempt to set the modification time of the output
+ file (it will probably be created with a timestamp of the
+ current date and time).
+
+ @item INVALID
+ Issue a non-fatal error message and assume that the header
+ is missing.
+ @end table
+
+ @item Example:
+ @code{timestamp 1991.12.01-12:10:34 GMT}
+@end table
+
+
+@c =========================================================================
+@c SECTION: VVE encoded data format
+@c =========================================================================
+@section VVE encoded data format
+
+
+@c =========================================================================
+@c SECTION: XLT translation file format
+@c =========================================================================
+@section XLT translation file format
+
+
+@c =========================================================================
+@c SECTION: TBL encoding table file format
+@c =========================================================================
+@section TBL encoding table file format
+
+
diff --git a/support/vvcode/doc/vvinstal.tex b/support/vvcode/doc/vvinstal.tex
new file mode 100644
index 0000000000..58700b0e5a
--- /dev/null
+++ b/support/vvcode/doc/vvinstal.tex
@@ -0,0 +1,17 @@
+@c *************************************************************************
+@c CHAPTER: Installing VVcode
+@c *************************************************************************
+@c node-name, next, previous, up
+@node Installing, Installing, Top, Top
+@chapter Installing VVcode
+
+
+@c =========================================================================
+@c SECTION: File distribution
+@c =========================================================================
+@section{File distribution}
+
+@c =========================================================================
+@c SECTION: Installation examples
+@c =========================================================================
+@section{Installation examples}
diff --git a/support/vvcode/doc/vvintro.tex b/support/vvcode/doc/vvintro.tex
new file mode 100644
index 0000000000..303a08ce48
--- /dev/null
+++ b/support/vvcode/doc/vvintro.tex
@@ -0,0 +1,483 @@
+@c *************************************************************************
+@c CHAPTER: Introduction to VVcode
+@c *************************************************************************
+@c node-name, next, previous, up
+@node Introduction, Introduction, Top, Top
+@chapter Introduction to VVcode
+
+Reliable and faithful exchange of binary files between computers over
+networks is a well-known problem, especially if the computers use different
+operating systems and are connected to different networks via a gateway.
+Unfortunately inter-networking and electronic mail are very much children
+of the 1960s: they might have had to wait until the 1970s for their
+naissance, but their progenitors were mentally locked-in to the concept of
+the 7-bit ASCII code for conveying textual information. The @TeX{}
+community has long been aware of this problem when trying to exchange
+``machine-independent'' @file{.dvi} files and font-related data such as
+@file{.tfm} and @file{.pk} files. It has sometimes been possible to
+exchange this binary data by using encoding schemes that allow the data to
+be represented using a subset of the seven-bit ASCII character set.
+
+Academics and authors in many fields have hitherto been able to pass
+@file{.tex} files back-and-forth by electronic mail---apart from a few
+minor quirks and blemishes, such @TeX{} source files pass unharmed across
+the planet's networks. Problems are encountered when mail passes through
+certain gateway machines which introduce irreversible character
+corruptions. Particularly notorious is the Janet/Bitnet gateway
+which has the unfortunate habit of converting @samp{^} to @samp{~} and
+@samp{~} to @samp{%}: since it leaves @samp{%} itself unaffected, this
+makes recovery of the original file a non-trivial exercise. It sometimes
+also changes the brace characters @samp{@{@}} into odd characters above
+128: this is particularly embarrassing, of course, for @file{.tex} files!
+
+For some years many @TeX{} users, particularly those working in languages
+other than English, and thus familiar with character set encodings
+containing other than the basic ASCII set, have been agitating for
+@TeX{} to be able to handle input in their mother tongues, using their own
+languages' character sets. In 1989, Knuth announced @TeX{} V3, and
+implementors world-wide beavered away to bring each implementation
+up-to-date. @TeX{} V3 now supports eight-bit character sets and so
+@file{.tex} source files are now effectively `binary' files and will
+therefore suffer from the same exchange problems experienced with
+@file{.dvi} files.
+
+All those authors that had previously been able to cooperate, despite being
+separated by hundreds or thousands of miles, might once again be forced to
+entrust floppy disks to the vagaries of the world's postal systems
+(although one shouldn't underestimate the bandwidth of the Royal [or other]
+Mail system).
+
+Unless or until the various e-mail protocols, networks and software are
+converted to support uncorrupted transmission of characters codes
+@code{0x20 @dots{} 0x7e} and @code{0xa1 @dots{} 0xfe}, it will have to
+become the norm for @file{.tex} sources to be encoded for transmission by
+e-mail.
+
+This problem is of course well known outside the @TeX{} community.
+
+
+@c =========================================================================
+@c SECTION: The Aston Archive
+@c =========================================================================
+@section{The Aston Archive}
+The author is a volunteer assistant to Peter Abbott in running the world's
+principal repository of @TeX{}-related material at Aston University in
+Birmingham. The archive (host: @code{TeX.Ac.Uk}) holds several hundred
+megabytes of text and binary files including:
+
+@itemize @bullet
+ @item program sources for @TeX{}, @code{METAFONT}, DVI drivers and many
+ other utilities;
+ @item binary executables for a variety of popular operating systems (e.g.
+ Atari, Macintosh, MS-DOS, Unix, VAX/VMS and VM/CMS);
+ @item @code{METAFONT} sources for Computer Modern and other fonts;
+ @item binary font files (mainly @file{.tfm} and @file{.pk}) for a number of
+ different output devices;
+ @item text macro and style files.
+@end itemize
+
+The archive provides access to these files via the following services:
+
+@itemize @bullet
+ @item NIFTP@footnote{Network Independent File Transfer Protocol --- in the
+ UK, one does not perform the pseudo-login that
+ Internet users are accustomed to using with the FTP
+ protocol: instead, one issues a ``transfer request''
+ for a file to be sent to or from the remote
+ machine --- the transfer itself takes place
+ asynchronously. One nice consequence is that such
+ transfers can be queued for overnight execution,
+ leaving daytime bandwidth free for e-mail and true
+ remote interactive logins.}
+ from Janet hosts---typically 300 megabytes of data are transferred
+ every month; this would probably be much greater if we were not
+ limited by the bandwidth of our 9600Bd connection to Janet.
+ @item FTP and Telnet access from Internet hosts.
+ @item Interactive browsing service via Janet PAD, including the facility
+ to send files out using NIFTP (and later FTP).
+ @item Interactive browsing service via dialup modem lines, including the
+ facility to download files using Kermit and similar protocols.
+ @item An e-mail file server which typically sends 150 megabytes of data per
+ month to sites all over the world (though predominantly to
+ EARN/Bitnet sites).
+ @item A magnetic media distribution service via surface carriers.
+ Copies of the entire archive have been sent to embryonic @TeX{}
+ communities in Czechoslovakia, Hungary and Poland.
+@end itemize
+
+We have experienced many problems trying to support all of these file
+types, operating systems and access methods. The e-mail file server
+clearly needs a reliable method of encoding files if its many customers are
+not to be denied access to the non-text files in the archive.
+
+Binary files such as @file{.pk} font files are stored in different ways to
+accommodate the requirements of the different operating systems supported.
+Currently we maintain multiple font directory trees for the Macintosh,
+MS-DOS, Unix and VAX/VMS with all the attendant problems of
+synchronization, disk space and archivists' time. We need a single storage
+format which allows export to all of our supported operating systems.
+
+
+@c =========================================================================
+@c SECTION: Specification for a Coding Scheme
+@c =========================================================================
+@section{Specification for a Coding Scheme}
+In mid-1990, the archivists came to the conclusion that a universal
+encoding scheme was required to accommodate the many different kinds of
+file and file organizations that needed to be supported by the archive.
+
+Niel Kempson formulated the first draft of this specification in mid-1990;
+the requirements of the encoding scheme may be summarized as follows:
+
+@table @strong
+ @item Preserving File Structure
+ It is insufficient, especially for an archive holding text and
+ binary files for a variety of machine types, merely to encode data
+ simply as a stream of bytes:
+
+ @itemize @bullet
+ @item Virtually all operating systems (except Unix) make a
+ distinction between binary and text files, so the coding
+ system should recognize and maintain this distinction.
+ @item Unix and most PC-based operating systems treat files as
+ streams of bytes with no further structure imposed. On the
+ other hand, certain widely-used operating systems (e.g.
+ VAX/VMS and VM/CMS) have record-oriented file systems where
+ different types of file are stored in a format appropriate to
+ the type of file@footnote{It is often argued that the
+ increase in efficiency more than offsets the increase in
+ complexity.}.
+
+ For these operating systems, we consider it essential that
+ the encoding scheme should identify, preserve and record the
+ most commonly used file organizations. The decoding program
+ should be able to use this information to create the output
+ file using the organization appropriate to the operating
+ system in use. If the information is of no consequence to
+ the receiving system, the default file structure (if any)
+ should be created. If the encoding system does not have
+ structure in its files, the receiving system may provide
+ suitable defaults automatically. In all cases the programs
+ should permit the user to override or supplement file
+ structure information.
+
+ @item Whenever possible, these details of structure should be
+ determined automatically by the encoding program; at the very
+ least, an indication of whether the file is text or binary
+ shall be provided, even under an operating system such as
+ Unix that need make no such distinction for its own use, to
+ allow decoding to an appropriate file organization on those
+ systems that {@emph do} make such a distinction.
+ @end itemize
+
+ @item Coding Scheme
+ Whatever method is used must allow encoded data to be e-mailed:
+
+ @itemize @bullet
+ @item It should be possible to specify the coding table to be used
+ to encode the data. The coding table used shall be recorded
+ with each part of the encoded data.
+ @item If a recorded coding table is found while decoding, it should
+ be used to construct an appropriate decoding table. Simple
+ one-to-one character corruptions should be corrected as long
+ as only one of the input characters is mapped to any one
+ output character.
+ @item The recommended encoding uses only the following characters:
+ @quotation
+ @code{+-0123456789}@*
+ @code{abcdefghijklmnopqrstuvwxyz}@*
+ @code{ABCDEFGHIJKLMNOPQRSTUVWXYZ}
+ @end quotation
+
+ Such an encoding as originally used for XXcode has been shown
+ to pass successfully through all the gateways which are known
+ to corrupt characters.
+ @end itemize
+
+ @item Integrity of Encoded Data
+ We want to ensure that the @emph{whole} encoded file passes through
+ the e-mail network.
+
+ @itemize @bullet
+ @item Encoded lines should be prefixed by an appropriate character
+ string to distinguish them from unwanted lines such as mail
+ headers and trailers. Whilst not essential, this feature
+ does assist the decoding program in ignoring these spurious
+ data.
+ @item Lines should not end with whitespace characters as some
+ mailers and operating systems strip off trailing whitespace.
+ @item The encoding program should calculate parameters of the input
+ file such as the number of bytes and CRC and record them at
+ the end of the encoded data.
+
+ The decoding program should calculate the same parameters
+ from the decoded data and compare the values obtained from
+ those recorded at the end of the encoded data.
+ @end itemize
+ @item Making Files Mailable
+ A mechanism is needed to overcome some gateways' refusal to handle
+ large files.
+
+ @itemize @bullet
+ @item The encoding program should be able to split the encoded
+ output into parts, each no larger than a maximum specified
+ size. Splitting the output into smaller parts is useful if
+ the encoded data is to be transmitted using electronic mail
+ or over unreliable network links that do not stay up long
+ enough to transmit a large file. The recommended default
+ maximum part size is 30kB.
+ @item The decoding program should be able to decode a multi-part
+ encoded file very flexibly. It should @emph{not} be
+ necessary to:
+
+ @enumerate
+ @item strip out mail headers and trailers;
+ @item combine all of the parts into one file in the
+ correct order;
+ @item process each part of the encoded data as a
+ separate file.
+ @end enumerate
+ @item In addition any file specifications from the operating system
+ on which the VVE file was created must not prevent the file
+ from being decoded.
+ @end itemize
+
+ @item Miscellaneous
+ Further considerations include:
+
+ @itemize @bullet
+ @item Support for character sets other than ASCII is essential
+ if the encoding scheme is to be useful to IBM hosts. The
+ encoding program should label the character set used by the
+ encoded data, and both encoder and decoder should enable the
+ conversion between the local character set and another
+ character set. For example a user on an EBCDIC host
+ should be able to encode text files for transmission to another
+ EBCDIC host, or to convert them to ASCII before
+ encoding and transmission to an ASCII host. Similarly,
+ that user should be able to decode text files from ASCII
+ and EBCDIC machines, creating EBCDIC output files.
+ @item Where possible, the original file's timestamp should be encoded
+ and used by the decoding program when recreating the file: this
+ will permit archives to retain the originator's time of
+ creation for files, and thus permit the users (not to mention
+ the archivists) to identify more clearly when a new version of
+ a file has been made available. Timezones should be supported
+ where possible.
+ @item The encoding and decoding schemes should be able to read and
+ write files that are compatible with one or more of the well
+ established coding schemes (e.g. UUcode, XXcode).
+ @item The source code for the programs should be freely available.
+ It should also be portable and usable with as many computers,
+ operating systems and compilers as possible.
+ @end itemize
+@end table
+
+
+@c =========================================================================
+@c SECTION: The Search Commences
+@c =========================================================================
+@section{The Search Commences}
+Naturally, the first step was to examine the existing coding schemes in
+comparison with the above ideal specification. Such schemes fell into two
+broad classes: @dfn{portable schemes}, which were intended to permit the
+encoding of files on any computer architecture into a form that could be
+transmitted electronically, and decoded on the same or a different
+architecture; and @dfn{platform-specific schemes}, which provided rather
+better support for transferring files between two computers using the same
+architecture and operating system.
+
+@subsection{Portable Coding Schemes}
+The most commonly used coding schemes supported by a variety of platforms
+are:
+
+@itemize @bullet
+ @item @code{BOO}
+ @item @code{UU}
+ @item @code{XX}
+@end itemize
+
+Most implementations of these schemes known to the authors are designed for
+use with stream file systems. These programs have no means of recording,
+let alone preserving, record structure and are thus unsuitable for our
+purposes. This is not surprising since @code{UUcode} and its mutation
+@code{XXcode} were developed specifically for exchanging files between Unix
+systems. In fairness to these schemes, they are well suited to the
+transmission of text files and certain unstructured binary files.
+
+Standard @code{UUcode} encodes files using characters @samp{ } @dots
+@samp{_} of ASCII. This can result in one or more spaces appearing at
+the ends of lines: some mailers decide that this is information not worth
+transmitting, with consequent inability to reconstruct the original file.
+
+Files containing characters such as @samp{^} are often irreversibly
+corrupted by mail gateways; this problem led to the development of
+@code{XXcode} which uses a rather more robust character set, namely:
+
+@quotation
+ @code{+-0123456789}@*
+ @code{abcdefghijklmnopqrstuvwxyz}@*
+ @code{ABCDEFGHIJKLMNOPQRSTUVWXYZ}
+@end quotation
+
+The encoding table used is recorded with the encoded data to allow the
+detection of character corruptions, and the correction of reversible
+character transpositions. Whilst superficially a step forward,
+@code{XXcode} offered little more than most existing versions of
+@code{UUcode}, which already supported coding tables. Its major
+contribution was in formalizing the encoding table, and in particular its
+default table was proof against all the known gateway-induced corruptions.
+
+
+@subsection{Platform Specific Coding Schemes}
+
+Encoding schemes have been developed to support transfer of files
+possessing some structure which therefore cannot be reconstructed correctly
+when encoded by the portable schemes. When the encoding and decoding
+programs of such a platform specific scheme are each used on the same
+computer and operating system type, files may be encoded and transmitted
+with a great deal of confidence that the decoded file will reproduce the
+original's structure and attributes in their entirety.
+
+Examples of such programs are @code{TELCODE} and @code{MFTU} for VMS,
+@code{NETDATA} for IBM mainframes, and @code{Stuffit} and @code{MacBinary}
+for the Macintosh. But these programs have the major disadvantage that
+they have each been implemented @emph{only} on the single architecture for
+which they were designed: thus the only two of these schemes that could be
+used on the VMS-based Aston Archive would be of minimal interest elsewhere!
+
+The Archive's content is in some respects artificially inflated by the
+presence of @file{.hqx} files for Macintoshes, @file{.boo} for MS-DOS,
+etc., which have to be held in pre-encoded form for transfer by those
+requiring them.
+
+
+@c =========================================================================
+@c SECTION: VVcode is Born
+@c =========================================================================
+@section{VVcode is Born}
+
+Realizing that none of the existing portable schemes were close enough to
+our ideal, an early version of our specification was circulated on various
+mailing lists by Niel Kempson towards the end of 1990. When the anticipated
+``nil return'' was all that resulted, Brian Hamilton Kelly went ahead and
+created a rudimentary @code{VVencode} by modifying an existing VAX Pascal
+implementation of @code{uuencode}. After generating the companion
+@code{VVdecode}, he then re-implemented the programs in Turbo C under the
+MS-DOS operating system on the IBM-PC, and thereby was able to prove that
+the new scheme was both viable and sufficient.
+
+This version didn't support file formats, time stamping, file splitting,
+character sets or CRC checking.
+
+
+@subsection{A Production VVcode}
+
+Following the minor feasibility study, Niel Kempson re-engineered the pair
+of programs from scratch (adding certain features of the evolving
+specification), paying particular attention to making the code portable
+across a wide variety of operating systems. Particular care was taken to
+avoid the use of supposedly ``standard'' C functions that experience had
+shown behaved differently under individual manufacturer's implementations,
+or were even non-existent in some. Therefore the code may sometimes appear
+to be performing certain operations in a very long-winded way; it's very
+easy to look at it and say ``why didn't the author use the @code{foo()}
+function, which does this much more efficiently?'', but this function may
+not even exist under another implementation of C, or behave in a subtly
+different manner.
+
+The core functions of @code{VVcode} are implemented as a collection of
+routines written in as portable a fashion as possible, and a separate
+module of a few operating system specific routines for file I/O,
+timestamping, command-line or other interface, etc. Porting @code{VVcode}
+to a new platform should require only that this latter module be
+re-implemented, in most cases by adapting an existing one.
+
+@code{VVcode} implements all of the features listed in the specification,
+apart from the ability to generate @code{UUcode} and @code{XXcode}
+compatible files. However, the decoding program is backwards compatible
+and can decode files generated by @code{UUcode} and @code{XXcode}.
+
+
+@subsection{Arguments against VVcode}
+
+When the advent of the @code{VVcode} system was first aired in the various
+electronic digests, some heated debate followed along the lines that a new
+encoding scheme was unnecessary, since @code{UUcode}/@code{XXcode} sufficed
+@emph{for them}. However, all these correspondents were Unix users who had
+interpreted the @samp{VV} as meaning ``Vax-to-Vax'' by analogy with
+@samp{uu}@footnote{@samp{V} was chosen simply because it followed @samp{U};
+at one time, we'd seriously considered calling it @code{YAFES} --- Yet
+Another File Encoding Scheme!} and who felt that such a scheme should be
+private to VAXen. The authors' reply was to the effect that the encoding
+scheme was intended to support the needs of archives like Aston's, and as
+such, had to provide
+
+@enumerate
+ @item an automated tool (it would be somewhat difficult to expect our
+ users to be able to tell the encoder what sort of file structure
+ it was handling, when this concept was entirely alien to many of
+ them);
+ @item facilities to encode binaries for many operating systems;
+ @item mail server features, such as splitting of large files;
+ @item operation across the widest possible combination of platforms.
+@end enumerate
+
+The overhead of using the @code{VVcode} system is at most a couple of
+hundred bytes over using @code{UUcode}, and the extra functionality and
+@emph{universality} with respect to @code{UUcode} or @code{XXcode} thereby
+comes almost for free.
+
+
+@c =========================================================================
+@c SECTION:
+@c =========================================================================
+@section{Availability of VVcode}
+
+At present, the @code{VVcode} system is only available in C, but it has
+been shown to run successfully on the following combinations of hardware,
+operating system and compiler:
+
+@table @strong
+ @item Macintosh
+ At the time of writing (May 1991) John Rawnsley of the University
+ of Warwick had commenced development of a Macintosh port, which
+ will encode the resource and data forks in a manner that will
+ permit the former to be ignored by non-Macintosh systems.
+
+ @item MS-DOS
+ @itemize @bullet
+ @item IBM PS/2, PC (and clones); MS-DOS 3.3, 4.01, 5.00;
+ Borland Turbo C 1.5, 2.0, Borland C++ 1.0, 2.0, 3.0 and
+ Microsoft C 5.1, 6.0
+ @end itemize
+
+ @item OS/2
+ @itemize @bullet
+ @item IBM PS/2, PC (and clones); OS/2 2.0; Microsoft C 6.0 and
+ GNU C 2.1
+ @end itemize
+
+ @item Unix
+ @itemize @bullet
+ @item Sun 3; SunOS 3.x and 4.0.3; native C and GNU C
+ @item Sun Sparcstation 1; SunOS 4.1; native C and GNU C
+ @item SCO Unix V/386 v3.2.2, Microsoft C compiler
+ @end itemize
+
+ @item VAX/VMS
+ @itemize @bullet
+ @item All VAXen; VMS 5.2--5.4-1; VAX C V3.0--V3.2 and GNU C 1.40
+ @end itemize
+
+ @item VM/CMS
+ @itemize @bullet
+ @item VM/CMS; Whitesmith C compiler v1.0 (This implementation was
+ ported by Rainer Sch@"opf; basing it upon the Unix
+ implementation, this took him about one day.)
+ @end itemize
+
+@end table
+
+
+
diff --git a/support/vvcode/doc/vvport.tex b/support/vvcode/doc/vvport.tex
new file mode 100644
index 0000000000..a385c5644d
--- /dev/null
+++ b/support/vvcode/doc/vvport.tex
@@ -0,0 +1,704 @@
+@c *************************************************************************
+@c CHAPTER: How to port VVcode to a new environment
+@c *************************************************************************
+@c node-name, next, previous, up
+@node Porting Guide, Porting Guide, Top, Top
+@chapter How to port VVcode to a new environment
+
+This chapter introduces the facilities provided for porting VVcode to a new
+environment and recommends the approach that should be taken for particular
+examples.
+
+@itemize @bullet
+ @item introduction and philosophy
+ @item @file{machine.h}
+ @item @file{specific.h} and @file{xxx.c}
+ @item local.h
+@end itemize
+
+
+
+
+@c =========================================================================
+@c SECTION: The @file{os.h} header file
+@c =========================================================================
+@c node-name, next, previous, up
+@section The @file{os.h} header file
+
+The @file{os.h} file contains tests to identify the environment on which
+VVcode is being built. Once the environment has been identified the file
+defines preprocessor macros to define the environment in the format
+expected by VVcode. Environments are defined as the operating system and
+variants due to dialects of the operating system or the compiler.
+
+@itemize @bullet
+ @item explain the @samp{OS_xxxx} macros, including the operating systems
+ currently supported
+ @item explain the @samp{UNIX_yyyy} and related macros
+@end itemize
+
+
+
+@c =========================================================================
+@c SECTION: The @file{machine.h} header file
+@c =========================================================================
+@c node-name, next, previous, up
+@section The @file{machine.h} header file
+
+The header file @file{machine.h}
+
+@itemize @bullet
+ @item defines macros to control the behaviour and compilation of VVcode
+ @item several categories of definition required:
+
+ @itemize @bullet
+ @item environment
+ @item command line interface
+ @item file specifications
+ @item file formats
+ @end itemize
+@end itemize
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: VVcode environment
+@c -------------------------------------------------------------------------
+@subsection VVcode Environment
+
+@itemize @bullet
+ @item definitions for the environment in which VVcode is built
+@end itemize
+
+@subsubsection @code{VV_OPERATING_SYSTEM}
+
+A string recording the operating system for which this version of VVcode
+has been implemented. This value is recorded in the VVE file and used by
+VVdecode to detect whether the original file was encoded on a different
+operating system. For example:
+
+@example
+#define VV_OPERATING_SYSTEM "MS-DOS"
+@end example
+
+
+@subsubsection @code{VV_IMPLEMENTATION}
+
+A string describing the implementation of VVcode. Displayed when VVcode
+programs are started and recorded in log and VVE files. For example:
+
+@example
+#define VV_IMPLEMENTATION "MS-DOS Turbo-C version 09.1-001 (31 May 1992)"
+@end example
+
+
+@subsubsection @code{ANSI_SYNTAX}
+
+Define as @code{TRUE} if the compiler supports the draft ANSI standard for
+C syntax (it shouldn't matter if the run time library is not fully ANSI
+compliant). Define as @code{FALSE} if this syntax is not supported. The
+macro is used to control the declaration of functions and the use of new
+ANSI keywords such as @samp{const}. If your compiler requires old-style
+function declarations like:
+
+@example
+char *allocate_buffer (); /* Declaration */
+...
+char *allocate_buffer (buf_len, buf_name) /* Function code */
+ size_t buf_len;
+ char *buf_name;
+@{
+...
+@}
+@end example
+
+you should define @code{ANSI_SYNTAX} to @code{FALSE}. Many Unix systems
+have compilers that fall into this category, though the GNU C compiler is a
+notable exception. If you have a modern compiler that accepts ANSI style
+function declarations like:
+
+@example
+char *allocate_buffer (const size_t buf_len, /* Declaration */
+ const char *buf_name);
+...
+char *allocate_buffer (const size_t buf_len, /* Function code */
+ const char *buf_name)
+@{
+...
+@}
+@end example
+
+you should define @code{ANSI_SYNTAX} to @code{TRUE}. The GNU C compiler
+and most of the PC compilers support the ANSI standard.
+
+
+@c -------------------------------------------------------------------------
+@c SECTION: VVcode Command Line Interface
+@c -------------------------------------------------------------------------
+@subsection{VVcode Command Line Interface}
+
+@itemize @bullet
+ @item defines how to start VVcode and how it interprets the command line
+ @item explain concepts of @dfn{parameters} and @dfn{qualifiers}
+ @item @dfn{parameters} -
+ @item @dfn{qualifiers} - modify the behaviour of a command#
+ @item give an example and compare the commands @code{rm -i foo} and
+ @code{delete /confirm foo}
+ @item this does not preclude implementations that may not usually use
+ a command line interface (e.g. Mac). For example VMS does use a
+ CLI but provides a set of system services to handle the CL. Under
+ these circumstances these definitions will only be used to display
+ help text in the correct format
+@end itemize
+
+@subsubsection @code{QUAL_INTRO}
+
+A string containing a set of characters, each of which may be used to
+introduce a command line qualifier. For example:
+
+@example
+#define QUAL_INTRO "/-" /* MS-DOS */
+#define QUAL_INTRO "-" /* Unix */
+@end example
+
+The examples above indicate that on a Unix system @samp{-} would be used to
+introduce a command qualifier, whereas on MS-DOS either @samp{-} or
+@samp{/} could be used.
+
+
+@subsubsection @code{QUAL_SEP}
+
+A string containing a set of characters, each of which may be used to
+separate a command line qualifier from its value. For example:
+
+@example
+#define QUAL_SEP "=:-" /* MS-DOS */
+#define QUAL_SEP " " /* Unix */
+#define QUAL_SEP " " /* Unix */
+@end example
+
+The examples above indicate that on an MS-DOS system the qualifier value is
+separated from the qualifier by one of the characters @samp{=}, @samp{:} or
+@samp{-}. The Unix example indicates that the value is separated from the
+qualifier by a space, i.e. it is the next command line parameter.
+
+
+@subsubsection @code{OPTIONAL_QUALIFIER_VALUES}
+
+Define as @code{TRUE} if the operating system convention can handle command
+line qualifiers with optional values. On systems such as MS-DOS, VAX/VMS
+and VM/CMS the qualifiers are separated from each other by spaces and from
+their values by another character such as an equals sign (@samp{=}). In
+the following example it is obvious whether the optional value for the
+@samp{log} qualifier is present:
+
+@example
+ vvencode /overwrite /log=log-file ip-file op-file
+ vvencode /overwrite /log ip-file op-file
+@end example
+
+On Unix, the convention is to separate qualifiers from each other by spaces
+and from their qualifiers by spaces. In the following example it is
+difficult if not impossible to determine whether the @samp{log} qualifier
+value is present:
+
+@example
+ vvencode -overwrite -log log-file ip-file op-file
+ vvencode -overwrite -log ip-file op-file
+@end example
+
+This problem could be overcome by forcing Unix users to use a different
+character like @samp{=} to introduce the qualifier value or by imposing
+strict rules on the ordering of parameters and qualifiers. Neither of
+these approaches is likely to be popular so we take the easy way out and
+specify whether such optional qualifier values are supported. If they are
+not supported, the qualifiers which could take optional values are modified
+either to require a value or to take no value.
+
+Example:
+
+@example
+ #define OPTIONAL_QUALIFIER_VALUES TRUE /* MS-DOS, VMS */
+ #define OPTIONAL_QUALIFIER_VALUES FALSE /* Unix */
+@end example
+
+
+@subsubsection @code{STICKY_DEFAULTS}
+
+Define as @code{TRUE} if the VVcode programs should apply default file
+names when determining output file specifications. For example, on Unix
+the definition would usually be:
+
+@example
+ #define STICKY_DEFAULTS FALSE /* Unix */
+@end example
+
+and the commands:
+
+@example
+ vvencode one
+ vvencode one two
+ vvencode one two -log three
+@end example
+
+would create the files @file{one.vve}, @file{two}, and @file{two} plus a
+log file @file{three} respectively. On other systems such as MS-DOS and
+VAX/VMS where default file names are customary the definition would usually
+be
+
+@example
+ #define STICKY_DEFAULTS TRUE /* MS-DOS, VMS */
+@end example
+
+and the commands:
+
+@example
+ vvencode one
+ vvencode one two
+ vvencode one two -log three
+@end example
+
+would create the files @file{one.vve}, @file{two.vve} and @file{two.vve}
+plus a log file @file{three.log} respectively.
+
+
+@subsubsection @code{STDOUT_OUTPUT}
+
+Define as @code{TRUE} if the VVencode program should write to standard
+output if an output file is not explicitly specified on the command line.
+The command:
+
+@example
+ vvencode ip-file
+@end example
+
+would write the VVE file to standard output if @code{STDOUT_OUTPUT} is defined
+as @code{TRUE} or to @file{ip-file.vve} if it is defined as @code{FALSE}.
+
+Examples:
+
+@example
+ #define STDOUT_OUTPUT TRUE /* Unix */
+ #define STDOUT_OUTPUT FALSE /* MS-DOS, VMS */
+@end example
+
+
+@subsubsection @code{SUPPORT_PIPING}
+
+Define as @code{TRUE} if the VVcode programs should support reading from
+standard input and/or writing to standard output so that they may be used
+as filters. The programs do not behave as true filters since an input file
+must always be specified, but specifying a certain string (e.g. @samp{-})
+as the input file specification will cause the program to read from
+standard input. The string used is defined by the macro
+@code{STDIO_SYMBOL}.
+
+Examples:
+
+@example
+ #define SUPPORT_PIPING TRUE /* Unix, MS-DOS */
+ #define SUPPORT_PIPING FALSE /* VMS, VM/CMS */
+@end example
+
+@subsubsection @code{STDIO_SYMBOL}
+
+A string which when used as a file specification will cause the VVcode
+programs to read/write to standard input/output depending on whether that
+file is an input or output file. This string is only used if the macro
+@code{SUPPORT_PIPING} is defined as @code{TRUE}. If it is unused, define
+it as "".
+
+On a Unix system, the following definitions would be usual:
+
+@example
+ #define SUPPORT_PIPING TRUE
+ #define STDIO_SYMBOL "-" /* Unix, MS-DOS */
+@end example
+
+and piping a binary file into VVencode to could be achieved with the shell
+command:
+
+@example
+ cat binary-file | vvencode - - | mail kempson@@TeX.Ac.Uk
+@end example
+
+
+@c -------------------------------------------------------------------------
+@c SECTION: File Specifications
+@c -------------------------------------------------------------------------
+@subsection File Specifications
+
+explain here the VVcode file specification model and how it is used
+
+
+@subsubsection @code{MAX_PATH}
+
+The maximum number of characters allowed in a file specification.
+
+Example:
+
+@example
+ #define MAX_PATH 80 /* MS-DOS */
+ #define MAX_PATH 255 /* BSD Unix */
+ #define MAX_PATH 255 /* VAX/VMS, some Unix */
+@end example
+
+
+@subsubsection @code{MAX_PREAMBLE}
+
+The maximum number of characters in the preamble component of a file
+specification. If the system does not support a preamble component, define
+as zero.
+
+Example:
+
+@example
+ #define MAX_PREAMBLE 64 /* MS-DOS */
+ #define MAX_PREAMBLE 255 /* BSD Unix */
+ #define MAX_PREAMBLE 255 /* VAX/VMS */
+@end example
+
+
+@subsubsection @code{MAX_NAME}
+
+The maximum number of characters in the name component of a file
+specification.
+
+Example:
+
+@example
+ #define MAX_NAME 8 /* MS-DOS */
+ #define MAX_NAME 255 /* BSD Unix */
+ #define MAX_NAME 39 /* VAX/VMS */
+@end example
+
+
+@subsubsection @code{MAX_EXT}
+
+The maximum number of characters in the extension component of a file
+specification. If the system does not support an extension component,
+define as zero.
+
+Example:
+
+@example
+ #define MAX_EXT 3 /* MS-DOS */
+ #define MAX_EXT 255 /* BSD Unix */
+ #define MAX_EXT 39 /* VAX/VMS */
+@end example
+
+
+@subsubsection @code{MAX_POSTAMBLE}
+
+The maximum number of characters in the postamble component of a file
+specification. If the system does not support a postamble component,
+define as zero.
+
+Example:
+
+@example
+ #define MAX_POSTAMBLE 0 /* MS-DOS */
+ #define MAX_POSTAMBLE 0 /* BSD Unix */
+ #define MAX_POSTAMBLE 5 /* VAX/VMS */
+@end example
+
+
+@subsubsection @code{PREAMBLE_END}
+
+A string containing a set of characters, each of which may be used to
+denote the end of the preamble component of a file specification. If the
+system does not support a preamble component, define as "".
+
+Example:
+
+@example
+ #define PREAMBLE_END ":\\" /* MS-DOS */
+ #define PREAMBLE_END ":/" /* BSD Unix */
+ #define PREAMBLE_END ":>]" /* VAX/VMS */
+@end example
+
+
+@subsubsection @code{EXTENSION_BEGIN}
+
+The single character that may be used to denote the start of the extension
+component of a file specification. If the system does not support an
+extension component, define as @samp{\000}.
+
+Example:
+
+@example
+ #define EXTENSION_BEGIN '.' /* MS-DOS */
+ #define EXTENSION_BEGIN '.' /* BSD Unix */
+ #define EXTENSION_BEGIN '.' /* VAX/VMS */
+@end example
+
+
+@subsubsection @code{POSTAMBLE_BEGIN}
+
+A string containing a set of characters, each of which may be used to denote
+the start of the postamble component of a file specification. If the system
+does not support a postamble component, define as "".
+
+Example:
+
+@example
+ #define POSTAMBLE_BEGIN "" /* MS-DOS */
+ #define POSTAMBLE_BEGIN "" /* BSD Unix */
+ #define POSTAMBLE_BEGIN ";" /* VAX/VMS */
+@end example
+
+
+@subsubsection @code{UPPERCASE_FILESYSTEM}
+
+Define as @code{TRUE} if the file system is case insensitive. For the
+benefit of file systems that do care (where lower case names are usual),
+VVencode will convert file specifications to lower case before recording
+them in the VVE file.
+
+Example:
+
+@example
+ #define UPPERCASE_FILESYSTEM TRUE /* MS-DOS, VAX/VMS */
+ #define UPPERCASE_FILESYSTEM FALSE /* Unix */
+@end example
+
+
+@c -------------------------------------------------------------------------
+@c SECTION: File Formats
+@c -------------------------------------------------------------------------
+@subsection{File Formats}
+
+explain the different file formats and provide a small table showing how
+they are used for different operating systems
+
+
+@subsubsection @code{SUPPORT_FIXED_FMT}
+
+Define as @code{TRUE} if the file system supports fixed length record
+format files.
+
+Example:
+
+@example
+ #define SUPPORT_FIXED_FORMAT TRUE /* VAX/VMS, VM/CMS */
+ #define SUPPORT_FIXED_FORMAT FALSE /* MS-DOS, Unix */
+@end example
+
+
+@subsubsection @code{SUPPORT_STREAM_FMT}
+
+Define as @code{TRUE} if the file system supports stream format files.
+
+Example:
+
+@example
+ #define SUPPORT_STREAM_FILES TRUE /* MS-DOS, Unix, VAX/VMS */
+ #define SUPPORT_STREAM_FILES FALSE /* VM/CMS */
+@end example
+
+
+@subsubsection @code{SUPPORT_VARIABLE_FMT}
+
+Define as @code{TRUE} if the file system supports variable length record
+format files.
+
+Example:
+
+@example
+ #define SUPPORT_VARIABLE_FORMAT TRUE /* VAX/VMS, VM/CMS */
+ #define SUPPORT_VARIABLE_FORMAT FALSE /* MS-DOS, Unix */
+@end example
+
+
+@subsubsection @code{TEXT_LINE_OVERHEAD}
+
+The extra number of characters written by the file system when writing
+lines to text files. For example, when writing to text files MS-DOS
+converts @samp{\n} to @samp{\r\n} and therefore has an overhead of 1.
+
+Example:
+
+@example
+ #define TEXT_LINE_OVERHEAD 1 /* MS-DOS, VAX/VMS */
+ #define TEXT_LINE_OVERHEAD 0 /* Unix */
+@end example
+
+
+@subsubsection @code{DEF_MODE}
+
+Define as the default mode for file encoding & decoding to be used if the
+mode is not specified on the command line and cannot be determined from the
+input file. It must be @code{MODE_BINARY} or @code{MODE_TEXT}.
+
+Example:
+
+@example
+ #define DEF_MODE MODE_BINARY /* most systems */
+@end example
+
+
+@subsubsection @code{DEF_TEXT_FMT}
+
+Define as the default file format for text files. It must be one of
+@code{FMT_FIXED}, @code{FMT_STREAM} and @code{FMT_VARIABLE} and only a
+supported format may be specified.
+
+Example:
+
+@example
+ #define DEF_TEXT_FMT FMT_STREAM /* MS-DOS, Unix */
+ #define DEF_TEXT_FMT FMT_VARIABLE /* VAX/VMS */
+@end example
+
+
+@subsubsection @code{DEF_BINARY_FMT}
+
+Define as the default file format for text files. It must be one of
+@code{FMT_FIXED}, @code{FMT_STREAM} and @code{FMT_VARIABLE} and only a
+supported format may be specified.
+
+Example:
+
+@example
+ #define DEF_BINARY_FMT FMT_STREAM /* MS-DOS, Unix */
+ #define DEF_BINARY_FMT FMT_FIXED /* VAX/VMS */
+@end example
+
+
+@subsubsection @code{MIN_VARIABLE_RECORD_LEN}
+
+The minimum record length in bytes supported by the file system for
+variable length record format files. Must be within the VVcode limits of 0
+to 65535. If the system doesn't support variable length record format files
+define as @code{INV_RECORD_LEN}.
+
+Example:
+
+@example
+ #define MIN_VARIABLE_RECORD_LEN INV_RECORD_LEN /* MS-DOS, Unix */
+ #define MIN_VARIABLE_RECORD_LEN 0 /* VAX/VMS */
+@end example
+
+
+@subsubsection @code{MAX_VARIABLE_RECORD_LEN}
+
+The maximum record length in bytes supported by the file system for
+variable length record format files. Must be within the VVcode limits of 0
+to 65535. If the system doesn't support variable length record format files
+define as @code{INV_RECORD_LEN}.
+
+Example:
+
+@example
+ #define MAX_VARIABLE_RECORD_LEN INV_RECORD_LEN /* MS-DOS, Unix */
+ #define MAX_VARIABLE_RECORD_LEN 32765 /* VAX/VMS */
+ #define MAX_VARIABLE_RECORD_LEN 65535 /* VM/CMS */
+@end example
+
+
+@subsubsection @code{DEF_VARIABLE_RECORD_LEN}
+
+The default maximum record length in bytes supported by the file system for
+variable length record format files. Must be in the range defined by
+@code{MIN_VARIABLE_RECORD_LEN} and @code{MAX_VARIABLE_RECORD_LEN}. If the
+system doesn't support variable length record format files define as
+@code{INV_RECORD_LEN}.
+
+Example:
+
+@example
+ #define DEF_VARIABLE_RECORD_LEN INV_RECORD_LEN /* MS-DOS, Unix */
+ #define DEF_VARIABLE_RECORD_LEN 512 /* VAX/VMS */
+ #define DEF_VARIABLE_RECORD_LEN 255 /* VM/CMS */
+@end example
+
+
+@subsubsection @code{MIN_FIXED_RECORD_LEN}
+
+The minimum record length in bytes supported by the file system for fixed
+length record format files. Must be within the VVcode limits of 0 to
+65535. If the system doesn't support fixed length record format files
+define as @code{INV_RECORD_LEN}.
+
+Example:
+
+@example
+ #define MIN_FIXED_RECORD_LEN INV_RECORD_LEN /* MS-DOS, Unix */
+ #define MIN_FIXED_RECORD_LEN 0 /* VAX/VMS */
+@end example
+
+
+@subsubsection @code{MAX_FIXED_RECORD_LEN}
+
+The maximum record length in bytes supported by the file system for fixed
+length record format files. Must be within the VVcode limits of 0 to
+65535. If the system doesn't support fixed length record format files
+define as @code{INV_RECORD_LEN}.
+
+Example:
+
+@example
+ #define MAX_FIXED_RECORD_LEN INV_RECORD_LEN /* MS-DOS, Unix */
+ #define MAX_FIXED_RECORD_LEN 32765 /* VAX/VMS */
+ #define MAX_FIXED_RECORD_LEN 65535 /* VM/CMS */
+@end example
+
+
+@subsubsection @code{DEF_FIXED_RECORD_LEN}
+
+The default record length in bytes supported by the file system for fixed
+length record format files. Must be in the range defined by
+@code{MIN_FIXED_RECORD_LEN} and @code{MAX_FIXED_RECORD_LEN}. If the system
+doesn't support fixed length record format files define as
+@code{INV_RECORD_LEN}.
+
+Example:
+
+@example
+ #define DEF_FIXED_RECORD_LEN INV_RECORD_LEN /* MS-DOS, Unix */
+ #define DEF_FIXED_RECORD_LEN 512 /* VAX/VMS */
+ #define DEF_FIXED_RECORD_LEN 255 /* VM/CMS */
+@end example
+
+
+@subsubsection @code{DEF_TEXT_PADCHAR}
+
+Define as the default character used to pad out short records in text fixed
+length record format files. Must be a valid character constant and will
+usually be a space character. If the system doesn't support fixed length
+record format files, define as @samp{\000}.
+
+Example:
+
+@example
+ #define DEF_TEXT_PADCHAR '\000' /* MS-DOS, Unix */
+ #define DEF_TEXT_PADCHAR ' ' /* VAX/VMS, VM/CMS */
+@end example
+
+
+@subsubsection @code{DEF_BINARY_PADCHAR}
+
+Define as the default character used to pad out short records in binary
+fixed length record format files. Must be a valid character constant and
+will usually be a null character. If the system doesn't support fixed
+length record format files, define as '\000'.
+
+Example:
+
+@example
+ #define DEF_BINARY_PADCHAR '\000' /* MS_DOS, Unix */
+ #define DEF_BINARY_PADCHAR '\000' /* VAX/VMS, VM/CMS */
+@end example
+
+
+
+@c =========================================================================
+@c SECTION: The @file{xxx.c} operating system specific module
+@c =========================================================================
+@section The @file{xxx.c} operating system specific module
+
+
+
+@c =========================================================================
+@c SECTION: Porting VVcode - an example
+@c =========================================================================
+@section Porting VVcode - an example
diff --git a/support/vvcode/doc/vvtest.tex b/support/vvcode/doc/vvtest.tex
new file mode 100644
index 0000000000..60fef19959
--- /dev/null
+++ b/support/vvcode/doc/vvtest.tex
@@ -0,0 +1,432 @@
+@c *************************************************************************
+@c CHAPTER: How to test VVcode
+@c *************************************************************************
+@c node-name, next, previous, up
+@node Testing Guide, Testing Guide, Top, Top
+@chapter How to test VVcode
+
+
+@c =========================================================================
+@c SECTION: Testing VVencode
+@c =========================================================================
+@section Testing VVencode
+
+
+@subsection User Help
+@itemize @bullet
+ @item @samp{help} qualifier should cause ``usage'' message to be displayed
+ @item invalid qualifier (e.g. @samp{ZZZZ}) should cause ``usage'' message
+ to be displayed
+@end itemize
+
+
+@subsection User Information (@samp{log} & @samp{debug} qualifiers)
+@itemize @bullet
+ @item @samp{log} with no qualifier value writes to @code{stderr}
+ @item @samp{log} qualifier value specifying invalid output file
+ @item @samp{log} file spec missing @file{.log} extension component
+ @file{.log} added if @code{STICKY_DEFAULTS} defined)
+ @item @samp{debug} writes extra information to @code{stderr}
+ @item @samp{debug} assumes @samp{log} even if @samp{log} not specified
+@end itemize
+
+
+@subsection File overwriting (@samp{overwrite_files} qualifier)
+@itemize @bullet
+ @item @samp{overwrite_files} should always overwrite unless the operating
+ system objects
+ @item should ask before overwriting an existing file
+ @item don't ask whether to overwrite if reading from @code{stdin} - just
+ fail
+@end itemize
+
+
+@subsection VVE header file specification (@samp{header_file} qualifier)
+@itemize @bullet
+ @item missing qualifier value
+ @item if @samp{header_file} not specified, the input file specification
+ is used, stripped of any preamble and postamble components
+ @item check that command line value overrides input file specification
+ and is used without modification
+@end itemize
+
+
+@subsection Maximum VVE file size (@samp{split_size} qualifier)
+@itemize @bullet
+ @item missing qualifier value
+ @item invalid qualifier (less than 4)
+ @item check that O/P files are really no greater than this size
+ @item file splitting disabled when writing to @code{stdout}, a pipe or
+ non-file device
+@end itemize
+
+
+@subsection Input file examination
+@itemize @bullet
+ @item mode
+ @item format
+ @item modification time (unsupported timestamps ``normalized'')
+ @item maximum record length
+ @item longest record length
+ @item unsupported file organizations rejected (mainly by format and
+ record length)
+@end itemize
+
+
+@subsection File mode (@samp{mode} qualifier)
+@itemize @bullet
+ @item missing qualifier value
+ @item invalid qualifier value
+ @item check that command line value overrides @code{examine_file()} and
+ default mode values
+ @item check that @code{examine_file()} mode value overrides default
+@end itemize
+
+
+@subsection File format (@samp{format} qualifier)
+@itemize @bullet
+ @item missing qualifier value
+ @item invalid qualifier value
+ @item check that command line value overrides @code{examine_file()} and
+ default format values
+ @item check that @code{examine_file()} format value overrides default
+@end itemize
+
+
+@subsection File record length (@samp{record_length} qualifier)
+@itemize @bullet
+ @item missing qualifier value
+ @item invalid qualifier value (within OS limits and < 65536)
+ @item check that command line value overrides @code{examine_file()} and
+ default format values and also resets longest record length
+ @item check that @code{examine_file()} format value overrides default
+@end itemize
+
+
+@subsection File timestamp (@samp{timestamp} qualifier)
+@itemize @bullet
+ @item missing qualifier value (optional on some systems, required on
+ others)
+ @item invalid qualifier value (before 1970 or after 2037)
+ @item check that command line value overrides @code{examine_file()} value
+@end itemize
+
+
+@subsection Encoding table (@samp{encoding_table} qualifier)
+@itemize @bullet
+ @item missing qualifier file spec
+ @item non-existent file specified
+ @item file spec missing @file{.enc} extension component
+ @item short encoding table file: @file{tooshort.enc}
+ @item long encoding table file: @file{toolong.enc}
+ @item correct encoding table file: @file{uucode.enc}
+ @item duplication of character(s) in encoding file: @file{duplicat.enc}
+ @item contents of file specified on command line overrides default
+ table
+@end itemize
+
+
+@subsection Character set translation (@samp{translation_file} qualifier)
+@itemize @bullet
+ @item missing qualifier file spec
+ @item non-existent file specified
+ @item file spec missing @file{.xlt} extension component
+ @item comment handling
+ @item correct translation table file: @file{encode.xlt}
+ @item short translation table file: @file{tooshort.xlt}
+ @item long translation table file: @file{toolong.xlt}
+ @item translation table with invalid values: @file{badvalue.xlt}
+ @item translation of unsupported characters: @file{toascii.xlt}
+ @item missing @file{xlt-from} header: @file{frommiss.xlt}
+ @item invalid @file{xlt-from} header value: @file{frombad.xlt}
+ @item missing @file{xlt-to} header: @file{tomiss.xlt}
+ @item invalid @file{xlt-to} header value: @file{tobad.xlt}
+ @item missing @file{xlt-substchar} header: @file{submiss.xlt}
+ @item invalid @file{xlt-substchar} header value: @file{subbad.xlt}
+ @item @file{xlt-from} character set different to the local character set:
+ @file{difffrom.xlt}
+@end itemize
+
+
+@subsection Input file
+@itemize @bullet
+ @item missing command line value
+ @item non-existent file specified
+ @item file opened using the correct parameters (mode, format etc)
+ @item rejection of unsupported file types
+ @item specify null device (@code{NUL}, @code{NL:}, @code{/dev/null} etc)
+ @item specify zero length (empty) file
+ @item specify @code{stdin}
+@end itemize
+
+
+@subsection Output file
+@itemize @bullet
+ @item missing command line value - use input file name plus @file{.vve}
+ extension
+ @item invalid or unwritable file specification
+ @item check correct application of file specification defaults when
+ partial specification is supplied (if @code{STICKY_DEFAULTS}
+ defined)
+ @item O/P file opened using the correct parameters (mode, format etc)
+ @item specify null device (@code{NUL}, @code{NL:}, @code{/dev/null} etc)
+ @item specify @code{stdout}
+@end itemize
+
+
+@subsection Internal
+@itemize @bullet
+ @item for variable length records, check that zero and maximum length
+ records are handled and recorded correctly
+ @item total byte count - may be different for text/binary
+ @item CRC-32 value (check with ZIP or ARJ) - may be different for
+ text/binary
+ @item internal buffer allocation
+ @item file closing
+ @item running out of memory
+ @item log information
+@end itemize
+
+
+
+@c =========================================================================
+@c SECTION: Testing VVdecode
+@c =========================================================================
+@section Testing VVdecode
+
+@subsection User Help
+@itemize @bullet
+ @item @samp{help} qualifier should cause ``usage'' message to be displayed
+ @item invalid qualifier (e.g. @samp{ZZZZ}) should cause ``usage'' message
+ to be displayed
+@end itemize
+
+
+@subsection User Information (@samp{log} & @samp{debug} qualifiers)
+@itemize @bullet
+ @item @samp{log} with no qualifier value
+ @item @samp{log} qualifier value specifying invalid output file
+ @item @samp{log} file spec missing @file{.log} extension component
+ @item @samp{debug} generates extra information
+ @item @samp{debug} assumes @samp{log} even if @samp{log} not specified
+@end itemize
+
+
+@subsection File overwriting (@samp{overwrite_files} qualifier)
+@itemize @bullet
+ @item @samp{overwrite_files} should always overwrite unless the operating
+ system objects
+ @item should ask before overwriting an existing file
+ @item when reading from a pipe or non-file device, don't ask whether
+ to overwrite - just fail
+@end itemize
+
+
+@subsection VVE input file examination
+@itemize @bullet
+ @item @code{decodeversion}
+ @item @code{operatingsystem}
+ @item @code{characterset}
+ @item @code{comment}
+ @item @code{mode}
+ @item @code{format}
+ @item @code{modification time}
+ @item @code{recordlength}
+ @item @code{table}
+@end itemize
+
+
+@subsection File mode (@samp{mode qualifier})
+@itemize @bullet
+ @item missing qualifier value
+ @item invalid qualifier value
+ @item check that command line value overrides VVE file and default
+ mode values
+ @item check that VVE file mode value overrides default
+@end itemize
+
+
+@subsection File format (@samp{format qualifier})
+@itemize @bullet
+ @item missing qualifier value
+ @item invalid qualifier value
+ @item check that command line value overrides VVE file and default
+ format values
+ @item check that VVE file format value overrides default
+@end itemize
+
+
+@subsection File record length (@samp{record_length} qualifier)
+@itemize @bullet
+ @item missing qualifier value
+ @item invalid qualifier value (within OS limits and < 65536)
+ @item check that command line value overrides VVE file and default
+ format values and also resets longest record length
+ @item check that VVE file format value overrides default
+@end itemize
+
+
+@subsection File timestamp (@samp{timestamp} qualifier)
+@itemize @bullet
+ @item missing qualifier value (optional on some systems, required on
+ others)
+ @item invalid qualifier value (before 1970 or after 2037)
+ @item check that command line value overrides VVE file value
+@end itemize
+
+
+@subsection Encoding table (@samp{encoding_table} qualifier)
+@itemize @bullet
+ @item missing qualifier file spec
+ @item non-existent file specified
+ @item file spec missing @file{.enc} extension component
+ @item short encoding table file: @file{tooshort.enc}
+ @item long encoding table file: @file{toolong.enc}
+ @item correct encoding table file: @file{uucode.enc}
+ @item duplication of character(s) in encoding file: @file{duplicat.enc}
+ @item contents of file specified on command line overrides VVE table
+ and default table
+ @item VVE table overrides default table
+@end itemize
+
+
+@subsection Character set translation (@samp{translation_file} qualifier)
+@itemize @bullet
+ @item missing qualifier file spec
+ @item non-existent file specified
+ @item file spec missing @file{.xlt} extension component
+ @item comment handling
+ @item correct translation table file: @file{decode.xlt}
+ @item short translation table file: @file{tooshort.xlt}
+ @item long translation table file: @file{toolong.xlt}
+ @item translation table with invalid values: @file{badvalue.xlt}
+ @item translation of unsupported characters: @file{toascii.xlt}
+ @item missing @samp{xlt-from} header: @file{frommiss.xlt}
+ @item invalid @samp{xlt-from} header value: @file{frombad.xlt}
+ @item missing @samp{xlt-to} header: @file{tomiss.xlt}
+ @item invalid @samp{xlt-to} header value: @file{tobad.xlt}
+ @item missing @samp{xlt-substchar} header: @file{submiss.xlt}
+ @item invalid @samp{xlt-substchar} header value: @file{subbad.xlt}
+ @item @samp{xlt-from} character set different to the VVE character set:
+ @file{difffrom.xlt}
+ @item @samp{xlt-to} character set different to the local character set:
+ @file{diffto.xlt}
+ @item @samp{xlt-from} character set different to the VVE character set
+ and @samp{xlt-to} character set different to the local character
+ set: @file{diffboth.xlt}
+@end itemize
+
+
+@subsection File padding character (@samp{pad_character} qualifier)
+@itemize @bullet
+ @item missing qualifier value
+ @item invalid qualifier
+ @item qualifier value overrides default values
+ @item use of different default values for text and binary files
+@end itemize
+
+
+@subsection UUdecoding (@samp{uudecode} qualifier)
+@itemize @bullet
+ @item correct decoding of UUencoded file without @samp{Vv} line start
+ @item error if file contains VVcode specific headers
+@end itemize
+
+
+@subsection XXdecoding (@samp{xxdecode} qualifier)
+@itemize @bullet
+ @item correct decoding of XXencoded file without @samp{Vv} line start
+ @item error if file contains VVcode specific headers
+@end itemize
+
+
+@subsection Input file
+@itemize @bullet
+ @item missing command line value
+ @item non-existent file specified
+ @item file opened using the correct parameters (mode, format etc)
+ @item specify null device (@code{NUL}, @code{NL:}, @code{/dev/null} etc)
+ @item specify zero length (empty) file
+ @item specify @code{stdin}
+@end itemize
+
+
+@subsection Output file
+@itemize @bullet
+ @item missing command line value - use of VVE header
+ @item invalid or unwritable file specification
+ @item check correct application of file specification defaults (for those
+ systems that use support them)
+ @item file opened using the correct parameters (mode, format etc)
+ @item specify null device (@code{NUL}, @code{NL:}, @code{/dev/null} etc)
+ @item specify @code{stdout}
+@end itemize
+
+
+@subsection Internal
+@itemize @bullet
+ @item for variable length records, check that zero and maximum length
+ records in the VVE file are handled and recorded correctly
+ @item total byte count
+ @item CRC-32 value (check with ZIP or ARJ)
+ @item internal buffer allocation
+ @item file closing
+ @item running out of memory
+@end itemize
+
+
+@c =========================================================================
+@c SECTION: Testing file interchnage
+@c =========================================================================
+@section Testing file interchange
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: Interchange of Common Files between Operating Systems
+@c -------------------------------------------------------------------------
+@subsection Interchange of Common Files between Operating Systems
+@itemize @bullet
+ @item text file
+ @item @TeX{} @file{.dvi}file
+ @item @TeX{} @file{.tfm} file
+ @item @TeX{} @file{.pk} file
+@end itemize
+
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: Operating System-specific Files
+@c -------------------------------------------------------------------------
+@subsection Operating System-specific Files
+
+@subsubsection MS-DOS
+@itemize @bullet
+ @item @file{.zip} file
+ @item @file {.Z} @code{compress} file
+@end itemize
+
+@subsubsection OS/2
+@itemize @bullet
+ @item @file{.zip} file
+ @item @file {.Z} @code{compress} file
+@end itemize
+
+@subsubsection Unix
+@itemize @bullet
+ @item @file{.tar} file
+ @item @file {.Z} @code{compress} file
+@end itemize
+
+@subsubsection VAX/VMS
+@itemize @bullet
+ @item backup save set (fixed length 32256 byte records)
+ @item @file{.obj} file (variable length binary)
+ @item @file{.exe} file (fixed length 512 byte records)
+ @item text file (@code{STREAM_LF} format)
+ @item compress @file{.Z} file (variable length binary)
+@end itemize
+
+@subsubsection VM/CMS
+@itemize @bullet
+ @item @code{EXEC} file
+ @item @code{MODULE} file (variable length 65535 byte records)
+@end itemize
diff --git a/support/vvcode/doc/vvuser.tex b/support/vvcode/doc/vvuser.tex
new file mode 100644
index 0000000000..26f0a1ec51
--- /dev/null
+++ b/support/vvcode/doc/vvuser.tex
@@ -0,0 +1,200 @@
+@c *************************************************************************
+@c CHAPTER: Guide to using VVcode
+@c *************************************************************************
+@c node-name, next, previous, up
+@node User Manual, User Manual, Top, Top
+@chapter Guide to using VVcode
+
+@itemize @bullet
+ @item general introduction
+@end itemize
+
+@c =========================================================================
+@c SECTION: VVencode command options
+@c =========================================================================
+@section{VVencode command options}
+
+@itemize @bullet
+ @item described in a generic manner with operating system specifics at
+ the end of the section
+@end itemize
+
+The general syntax of the VVencode command line is:
+@example
+ vvencode [options] input-file [options] [output-file] [options]
+@end example
+
+There are two @dfn{parameters} and many optional @dfn{qualifiers}. The
+parameters are:
+
+@table @code
+ @item input-file
+
+ @item output-file
+@end table
+
+The command qualifiers modify the behaviour of VVcode and are all optional.
+Qualifiers may appear before, between or after the parameters. The
+qualifiers acceptable to VVencode are:
+
+@table @code
+ @item debug
+ Write copious debugging output to the standard error device or to
+ the log file if the @code{+log} qualifier was specified. This
+ qualifier would normally only be used when trying to report a
+ @code{VVencode} problem and may indeed have been disabled for the
+ version that you are using.
+ @item encoding_table file-spec
+ Read the encoding table to be used from the file @file{file-spec}.
+ The file must contain the 64 characters to be used by
+ @code{VVencode}. If this qualifier is not specified, the default
+ @code{VVencode} encoding table will be used.
+ @item format file-format
+ Explicitly specify the file format that should be assumed by
+ @code{VVencode} when it is reading the input file. The
+ @code{file-format} value must be one of @samp{fixed}, @samp{stream}
+ and @samp{variable}. This qualifier would only be used if it was
+ necessary to override the value determined automatically by
+ VVencode.
+ @item header_filespec file-spec
+
+ @item help
+ VVencode will display a usage message on the standard error device
+ and exit.
+ @item log file-spec
+
+ @item mode file-mode
+ Explicitly specify the file mode that should be assumed by
+ @code{VVencode} when it is reading the input file. The
+ @code{file-format} value must be one of @samp{binary} and
+ @samp{text}. This qualifier would only be used if it was
+ necessary to override the value determined automatically by
+ VVencode.
+ @item overwrite
+
+ @item record_length
+
+ @item split_size
+
+ @item timestamp time
+
+ @item translation_file file-spec
+
+@end table
+
+
+@c =========================================================================
+@c SECTION: VVdecode command options
+@c =========================================================================
+@section{VVdecode command options}
+
+The general syntax of the VVdecode command line is:
+@example
+ vvdecode [options] input-file [options] [output-file] [options]
+@end example
+
+
+@c =========================================================================
+@c SECTION: Operating system specific considerations
+@c =========================================================================
+@section{Operating system specific considerations}
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: MS-DOS
+@c -------------------------------------------------------------------------
+@subsection MS-DOS
+@itemize @bullet
+ @item qualifiers introduced with @samp{/} or @samp{-} and must be
+ separated from each other by whitespace
+ @item values separated from qualifier by @samp{=} or @samp{:}
+ @item optional values supported
+ @item VVcode will act as a filter when @samp{-} is specified as the input
+ or output file
+ @item optional file specification for @samp{log} qualifier
+ @item examples of VVencode usage
+@end itemize
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: OS/2
+@c -------------------------------------------------------------------------
+@subsection OS/2
+@itemize @bullet
+ @item qualifiers introduced with @samp{/} or @samp{-} and must be
+ separated from each other by whitespace
+ @item values separated from qualifier by @samp{=} or @samp{:}
+ @item optional values supported
+ @item VVcode will act as a filter when @samp{-} is specified as the input
+ or output file
+ @item optional file specification for @samp{log} qualifier
+ @item GCC 2.1 implementation does not support file timestamping
+ @item HPFS file names supported
+ @item OS/2 extended attributes not supported yet
+ @item examples of VVencode usage
+@end itemize
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: Unix
+@c -------------------------------------------------------------------------
+@subsection Unix
+@itemize @bullet
+ @item qualifiers introduced with @samp{-} or @samp{+} and must be
+ separated from each other by whitespace
+ @item values separated from qualifier by whitespace
+ @item optional values not supported
+ @item VVcode will act as a filter when @samp{-} is specified as the input
+ or output file
+ @item examples of VVencode usage
+@end itemize
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: VAX/VMS
+@c -------------------------------------------------------------------------
+@subsection VAX/VMS
+@itemize @bullet
+ @item qualifiers introduced with @samp{/}
+ @item values separated from qualifier by @samp{=}
+ @item standard VMS CLD conventions
+ @item optional values supported
+ @item VVcode will act as a filter when @samp{-} is specified as the input
+ or output file though meaningless on VMS
+ @item optional file specification for @samp{log} qualifier
+ @item examples of VVencode usage
+@end itemize
+
+@c -------------------------------------------------------------------------
+@c SUBSECTION: VM/CMS
+@c -------------------------------------------------------------------------
+@subsection VM/CMS
+@itemize @bullet
+ @item qualifiers introduced with @samp{(} and must be
+ separated from each other by whitespace
+ @item values separated from qualifier by @samp{=} or @samp{:}
+ @item command line driven through REXX EXEC
+ @item optional values supported
+ @item VVcode does not support input or output from/to standard I/O
+ @item optional file specification for @samp{log} qualifier
+ @item examples of VVencode usage
+@end itemize
+
+
+@c =========================================================================
+@c SECTION: Transferring files between systems
+@c =========================================================================
+@section{Transferring files between systems}
+@itemize @bullet
+ @item file type and format
+ @item character set
+ @item electronic mail
+ @item timestamping
+@end itemize
+
+
+@c =========================================================================
+@c SECTION: Unusual applications of VVcode
+@c =========================================================================
+@section{Unusual applications of VVcode}
+@itemize @bullet
+ @item character set conversion
+ @item file type conversion
+ @item VMS file format conversion vs. @code{CONVERT}
+@end itemize
diff --git a/support/vvcode/encode.xlt b/support/vvcode/encode.xlt
new file mode 100644
index 0000000000..74edc8d38f
--- /dev/null
+++ b/support/vvcode/encode.xlt
@@ -0,0 +1,29 @@
+#-----------------------------------------------------------------------------
+# TEST.XLT
+# ~~~~~~~~
+# Test translation table file
+#-----------------------------------------------------------------------------
+xlt-from ASCII
+xlt-to BIT-REVERSED
+xlt-substchar 042 # asterisk
+#
+255 254 253 252 251 250 249 248 247 246 245 244 243 242 241 240 # 255 - 240
+239 238 237 236 235 234 233 232 231 230 229 228 227 226 225 224 # 239 - 224
+223 222 221 220 219 218 217 216 215 214 213 212 211 210 209 208 # 223 - 208
+207 206 205 204 203 202 201 200 199 198 197 196 195 194 193 192 # 207 - 192
+#
+191 190 189 188 187 186 185 184 183 182 181 180 179 178 177 176 # 191 - 176
+175 174 173 172 171 170 169 168 167 166 165 164 163 162 161 160 # 175 - 160
+159 158 157 156 155 154 153 152 151 150 149 148 147 146 145 144 # 159 - 144
+143 142 141 140 139 138 137 136 135 134 133 132 131 130 129 128 # 143 - 128
+#
+#
+127 126 125 124 123 122 121 120 119 118 117 116 115 114 113 112 # 127 - 112
+111 110 109 108 107 106 105 104 103 102 101 100 099 098 097 096 # 111 - 96
+095 094 093 092 091 090 089 088 087 086 085 084 083 082 081 080 # 96 - 80
+079 078 077 076 075 074 073 072 071 070 069 068 067 066 065 064 # 79 - 64
+#
+063 062 061 060 059 058 057 056 055 054 053 052 051 050 049 048 # 63 - 48
+047 046 045 044 043 042 041 040 039 038 037 036 035 034 033 032 # 47 - 32
+031 030 029 028 027 026 025 024 023 022 021 020 019 018 017 016 # 31 - 16
+015 014 013 012 011 010 009 008 007 006 005 004 003 002 001 000 # 15 - 0
diff --git a/support/vvcode/globals.h b/support/vvcode/globals.h
new file mode 100644
index 0000000000..b5afedf6ac
--- /dev/null
+++ b/support/vvcode/globals.h
@@ -0,0 +1,1108 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "globals.h",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet)",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+** MODULE CONTENTS
+**
+** [tbs]
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+
+
+/*-
+**============================================================================
+**
+** SECTION 1 - VVCODE VERSION
+**
+**============================================================================
+*/
+#define VV_MAJOR_VERSION_NO 0
+#define VV_MINOR_VERSION_NO 9
+#define VV_VERSION_STR "0.97 beta"
+#define VV_DATE "25 Nov 1992"
+
+/*-
+**============================================================================
+**
+** SECTION 2 - MACROS TO IMPROVE THE READABILITY OF THE SOURCE CODE
+**
+**
+** Consider the macro definition:
+**
+** #define SHOW(num1, num2) printf("num1 = %d, num2 = %d", num1, num2)
+**
+** and the C code using the macro:
+**
+** SHOW (1234, 5678);
+**
+** The expected result is:
+**
+** printf ("num1 = %d, num2 = %d", 1234, 5678);
+**
+** since examples of the parameters should not be expanded within strings.
+** A certain brain-dead compiler actually expands the parameters within the
+** strings even though both editions of Kernighan & Ritchie and every C manual
+** that I've read prohibit this behaviour. The result is:
+**
+** printf ("1234 = %d, 5678 = %d", 1234, 5678);
+**
+** which is of course silly.
+**
+** To avoid this misbehaviour, all macro parameters will begin with an
+** underscore (_) and the parameter string must not appear in the macro
+** definition, except where parameter expansion is desired. The above macro
+** would have to be redefined as:
+**
+** #define SHOW(_n1, _n2) printf("num1 = %d, num2 = %d", _n1, _n2)
+**
+**
+** Oh, the brain dead compiler is VAX/VMS C v3.1
+**============================================================================
+*/
+
+/*-
+**----------------------------------------------------------------------------
+** Macros for ANSI function prototypes. If the compiler supports ANSI C, we
+** take advantage of the new ANSI prototypes. If not, the ARGS macro will
+** remove the prototype declarations. ANSI_SYNTAX will have been set
+** appropriately in machine.h
+**----------------------------------------------------------------------------
+*/
+#if (ANSI_SYNTAX)
+# define ARGS(_plist) _plist
+# define CONST const
+# define SIZE_T size_t
+# define TIME_T time_t
+#else /* NOT (ANSI_SYNTAX) */
+# define ARGS(_plist) ()
+# define CONST
+# define SIZE_T unsigned
+# define TIME_T long
+#endif /* (ANSI_SYNTAX) */
+
+
+/*-
+**----------------------------------------------------------------------------
+** Useful macros to make the source code more readable.
+**----------------------------------------------------------------------------
+*/
+#define PRINTF (void) printf
+#define FPRINTF (void) fprintf
+#define SPRINTF (void) sprintf
+#define FSCANF (void) fscanf
+#define NULLCHAR (char *) NULL
+
+
+/*-
+**----------------------------------------------------------------------------
+** Macros emulating functions. Different C compilers support the
+** character/string functions below in different ways. Some of the functions
+** are not supported at all (e.g. strncmpi). To be on the safe side, these
+** functions have been defined by VVCODE.
+**----------------------------------------------------------------------------
+*/
+#define MINIMUM(_a, _b) (((_a) < (_b)) ? (_a) : (_b))
+#define MAXIMUM(_a, _b) (((_a) > (_b)) ? (_a) : (_b))
+
+#define STRCHR vstrchr
+#define STRRCHR vstrrchr
+#define STRSTR vstrstr
+#define STRRSTR vstrrstr
+#define STRCMP strcmp
+#define STRCMPI vstricmp
+#define STRNCMP vstrncmp
+#define STRNCMPI vstrnicmp
+#define STRDUP vstrdup
+#define TOLOWER(_c) (isupper(_c) ? tolower(_c) : (_c))
+#define TOUPPER(_c) (islower(_c) ? toupper(_c) : (_c))
+#define LEAPYEAR(i) (((i)%4)==0) && ((((i)%100)!=0) || (((i)%400)==0))
+#define UPDATE_CRC32(_cc, _bb)\
+ _cc = G_crc32_table[(Byte) (((Byte) _cc ^ (Byte) _bb) & 0xff)] ^ (_cc >> 8)
+
+
+
+/*-
+**============================================================================
+**
+** SECTION 3 - MACROS DEFINING LIMITS AND GENERAL CONSTANTS
+**
+**============================================================================
+*/
+#define MAX_ENCODED_BYTES 45
+#define MAX_IP_LINE_LEN 512
+#define IO_BUFFER_SIZE 4096
+#define MAX_VV_RECORD_LEN 65535L
+#define DECODE_REC_LEN 0
+#define DECODE_DATA 1
+#define ENCODE_REC_LEN 0
+#define ENCODE_DATA 1
+#define MIN_SPLIT_SIZE 4L
+#define OVERWRITE_NO 0
+#define OVERWRITE_YES 1
+#define OVERWRITE_ASK 2
+#define XLT_BUFFER_SIZE 4096
+
+#define INFO_STATUS -1
+#define NORMAL_STATUS 0
+#define LOG_STATUS 1
+#define WARNING_STATUS 2
+#define ERROR_STATUS 3
+#define FATAL_STATUS 4
+
+#define FS_PREAMBLE 8
+#define FS_NAME 2
+#define FS_EXTENSION 4
+#define FS_POSTAMBLE 1
+#define FS_NOTHING 0
+
+
+/*
+**----------------------------------------------------------------------------
+** Macros used by lookup_key() defining whether the qualifier needs a
+** value.
+**----------------------------------------------------------------------------
+*/
+#define LOOKUP_UNKNOWN (-1)
+#define LOOKUP_AMBIGUOUS (-2)
+
+#define NO_ABBREVIATIONS 0
+#define ALLOW_ABBREVIATIONS 1
+
+#define CASE_INSENSITIVE 0
+#define CASE_SENSITIVE 1
+
+
+/*
+**----------------------------------------------------------------------------
+** VV timestamp format
+**----------------------------------------------------------------------------
+*/
+#define DUMMY_VV_TIMESTAMP "1991.02.15-16:12:32 GMT"
+#define VV_TIMESTAMP_FORMAT "%04d.%02d.%02d-%02d:%02d:%02d"
+
+
+/*
+**----------------------------------------------------------------------------
+** CRC-32 constants
+**----------------------------------------------------------------------------
+*/
+#define CRC32_TABLE_SIZE 256
+#define CRC32_MASK (Unsigned32) 0xFFFFFFFFL
+#define CRC32_POLYNOMIAL (Unsigned32) 0xEDB88320L
+
+
+#define INV_FORMAT ((Int16) -1)
+#define INV_MODE ((Int16) -1)
+#define INV_RECORD_LEN ((Int32) -1)
+#define INV_TABLE_ENTRY ((Int16) -1)
+#define INV_TIMESTAMP ((TIME_T) -2147483647L)
+
+
+/*-
+**============================================================================
+**
+** SECTION 4 - ENCODING / DECODING
+**
+**============================================================================
+*/
+
+#define UU_DECODING 1
+#define VV_DECODING 2
+#define XX_DECODING 3
+
+/*-
+**----------------------------------------------------------------------------
+** There are two commonly used UUcode tables, one with a space in it, and a
+** later one with the space replaced by a tilde to avoid problems with some
+** mail gateways removing trailing spaces. This UUcode table is the one that
+** doesn't have a space in it.
+**----------------------------------------------------------------------------
+*/
+#define UU_ENCODE_TABLE \
+ "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
+#define VV_ENCODE_TABLE \
+ "+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+#define XX_ENCODE_TABLE \
+ "+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+
+#define ENCODE_TABLE_LEN (sizeof (VV_ENCODE_TABLE) - 1)
+#define DECODE_TABLE_LEN 256
+#define XLT_TABLE_LEN 256
+#define ENCODE(c) G_encode_table[(c) & (ENCODE_TABLE_LEN - 1)]
+
+
+
+/*-
+**============================================================================
+**
+** SECTION 5 - STRUCTURES AND TYPEDEFS USED
+**
+**============================================================================
+*/
+
+/*-
+**----------------------------------------------------------------------------
+** Typedefs
+**----------------------------------------------------------------------------
+*/
+typedef char Boolean;
+typedef unsigned char Byte;
+typedef unsigned char Unsigned8;
+typedef unsigned short Unsigned16;
+typedef unsigned long Unsigned32;
+typedef short Int16;
+typedef long Int32;
+
+/*-
+**----------------------------------------------------------------------------
+** Structures
+**----------------------------------------------------------------------------
+*/
+typedef struct
+{
+ char *q_string;
+ Boolean val_needed;
+ Boolean present;
+ char *value;
+} Qualifier_Struct;
+
+typedef struct
+{
+ char *h_string;
+ Boolean present;
+ char *value;
+} Header_Struct;
+
+typedef struct
+{
+ char file_spec[MAX_PATH + 1];
+ FILE *file_ptr;
+ Boolean pipe_flag;
+ Int32 line_no;
+
+ Int16 mode;
+ Int16 format;
+ Int32 max_rec_len;
+ Int32 lng_rec_len;
+ TIME_T mod_time;
+
+ Int32 bytecount;
+ Unsigned32 crc32;
+} File_Info;
+
+typedef struct
+{
+ char *xlt_from;
+ char *xlt_to;
+ Int16 xlt_tbl[XLT_TABLE_LEN];
+} Xlt_Struct;
+
+
+
+/*-
+**============================================================================
+**
+** SECTION 6 - GLOBAL VARIABLES
+**
+**============================================================================
+*/
+
+/*-
+**----------------------------------------------------------------------------
+** Declared by the VVcode main modules, but referenced as 'extern' by other
+** modules.
+**----------------------------------------------------------------------------
+*/
+#ifdef VVCODE_MAIN
+ Unsigned32 G_crc32_table[CRC32_TABLE_SIZE];
+ Int16 G_status;
+ Boolean G_debugging;
+ Int16 G_decode_table[DECODE_TABLE_LEN + 1];
+ char G_encode_table[ENCODE_TABLE_LEN + 1];
+ File_Info G_log_file;
+ Xlt_Struct G_xlt_table;
+#else /* NOT VVCODE_MAIN */
+ extern Unsigned32 G_crc32_table[CRC32_TABLE_SIZE];
+ extern Int16 G_status;
+ extern Boolean G_debugging;
+ extern Int16 G_decode_table[DECODE_TABLE_LEN + 1];
+ extern char G_encode_table[ENCODE_TABLE_LEN + 1];
+ extern File_Info G_log_file;
+ extern Xlt_Struct G_xlt_table;
+#endif /* VVCODE_MAIN */
+
+
+/*-
+**----------------------------------------------------------------------------
+** Global buffers allocated dynamically at startup.
+**
+** G_ip_buffer [IP_BUFFER_SIZE] temporary string buffer used for reading
+** from files.
+** G_op_buffer [OP_BUFFER_SIZE] temporary string buffer used for writing
+** to files.
+** G_tmp_msg [MAX_MSG_LEN] temporary string buffer for user messages
+**
+**----------------------------------------------------------------------------
+*/
+#define IP_BUFFER_SIZE 2048
+#define OP_BUFFER_SIZE 2048
+#define MAX_MSG_LEN 4096
+
+#ifdef VVCODE_MAIN
+ char *G_ip_buffer;
+ char *G_op_buffer;
+ char *G_tmp_msg;
+#else /* NOT VVCODE_MAIN */
+ extern char *G_ip_buffer;
+ extern char *G_op_buffer;
+ extern char *G_tmp_msg;
+#endif /* VVCODE_MAIN */
+
+
+/*-
+**----------------------------------------------------------------------------
+** Global variables used only by VVencode / VVdecode
+**----------------------------------------------------------------------------
+*/
+#ifdef VVCODE_MAIN
+ char *G_hdrf_spec;
+ File_Info G_ip_file;
+ File_Info G_op_file;
+ File_Info G_vv_file;
+ Int32 G_ippart_bytes;
+ Int16 G_ippt_no;
+ Int32 G_oppart_bytes;
+ Int16 G_oppt_no;
+ Int16 G_overwrite_flag;
+ Int32 G_split_size;
+
+# ifdef VVDECODE
+ char G_op_padchar;
+ Int16 G_dec_type;
+ Int16 G_vv_decode_version;
+ char *G_vv_operating_system;
+ char *G_vv_character_set;
+# endif /* VVDECODE */
+#endif /* VVCODE_MAIN */
+
+
+
+/*-
+**============================================================================
+**
+** SECTION 7 - COMMAND LINE PARSING
+**
+** The command line qualifiers fall into three categories:
+**
+** a. those that do not take a value
+** b. those that require a value
+** c. those that take an optional value
+**
+** On systems such as MS-DOS and VAX/VMS, qualifiers are separated from each
+** other by spaces and from their values by equals signs. For example:
+**
+** program /qI /qII=value paramI paramII
+** program /qI /qII paramI paramII
+**
+** For this type of command syntax it is straightforward to detect whether an
+** optional qualifier is present.
+**
+** On Unix, the convention is to separate qualifiers both from each other and
+** from their values by spaces. Consider the command lines:
+**
+** program -qI -qII value paramI paramII
+** program -qI -qII paramI paramII
+**
+** It is difficult if not impossible to determine whether the value following
+** a qualifier is a qualifier value or a parameter unless the delimiting
+** characters are different or strict rules on the ordering of parameters
+** and qualifiers are imposed. We take the easy way out and specify in the
+** machine.h file whether the implementation supports optional qualifier
+** values. If these values are not supported, qualifiers which could take
+** optional values become qualifiers which require values.
+**============================================================================
+*/
+#define VALUE_NEEDED 0
+#define VALUE_NONE 1
+#define VALUE_OPTIONAL 2
+
+
+/*-
+**----------------------------------------------------------------------------
+**
+**----------------------------------------------------------------------------
+*/
+#ifdef VVCODE_MAIN
+ static Qualifier_Struct G_cmdqual[] =
+ {
+ {"debug", VALUE_NONE, FALSE, NULL},
+ {"encoding_table", VALUE_NEEDED, FALSE, NULL},
+ {"format", VALUE_NEEDED, FALSE, NULL},
+ {"help", VALUE_NONE, FALSE, NULL},
+
+# if (OPTIONAL_QUALIFIER_VALUES)
+ {"log", VALUE_OPTIONAL, FALSE, NULL},
+# else /* NOT (OPTIONAL_QUALIFIER_VALUES) */
+ {"log", VALUE_NONE, FALSE, NULL},
+# endif /* (OPTIONAL_QUALIFIER_VALUES) */
+
+ {"mode", VALUE_NEEDED, FALSE, NULL},
+ {"overwrite", VALUE_NONE, FALSE, NULL},
+ {"record_length", VALUE_NEEDED, FALSE, NULL},
+
+# if (OPTIONAL_QUALIFIER_VALUES)
+ {"timestamp", VALUE_OPTIONAL, FALSE, NULL},
+# else /* NOT (OPTIONAL_QUALIFIER_VALUES) */
+ {"timestamp", VALUE_NEEDED, FALSE, NULL},
+# endif /* (OPTIONAL_QUALIFIER_VALUES) */
+
+ {"translation_file", VALUE_NEEDED, FALSE, NULL},
+
+# ifdef VVENCODE
+ {"header_filespec", VALUE_NEEDED, FALSE, NULL},
+ {"split_size", VALUE_NEEDED, FALSE, NULL},
+# endif /* VVENCODE */
+
+
+# ifdef VVDECODE
+ {"index_file", VALUE_NEEDED, FALSE, NULL},
+ {"pad_character", VALUE_NEEDED, FALSE, NULL},
+ {"uudecode", VALUE_NONE, FALSE, NULL},
+ {"xxdecode", VALUE_NONE, FALSE, NULL},
+# endif /* VVDECODE */
+
+ {NULL, VALUE_NONE, FALSE, NULL}
+};
+
+
+ static Qualifier_Struct G_cmd_ipfile =
+ {"input_file", VALUE_NEEDED, FALSE, NULL};
+
+ static Qualifier_Struct G_cmd_opfile =
+ {"output_file", VALUE_NEEDED, FALSE, NULL};
+
+#endif /* VVCODE_MAIN */
+
+
+#define CMDQ_DEBUG 0
+#define CMDQ_ENCODE 1
+#define CMDQ_FORMAT 2
+#define CMDQ_HELP 3
+#define CMDQ_LOG 4
+#define CMDQ_MODE 5
+#define CMDQ_OVERWRITE 6
+#define CMDQ_RECORDLEN 7
+#define CMDQ_TIMESTAMP 8
+#define CMDQ_TRANSLATE 9
+
+#ifdef VVENCODE
+# define CMDQ_HDRFILE 10
+# define CMDQ_SPLIT 11
+#endif /* VVENCODE */
+
+#ifdef VVDECODE
+# define CMDQ_INDEXFILE 10
+# define CMDQ_PADCHAR 11
+# define CMDQ_UUDECODE 12
+# define CMDQ_XXDECODE 13
+#endif /* VVDECODE */
+
+
+/*-
+**----------------------------------------------------------------------------
+** Macros used as convenient flags to test whether certain command line
+** arguments and qualifiers are present.
+**----------------------------------------------------------------------------
+*/
+#ifdef VVCODE_MAIN
+# define Q_DEBUG (G_cmdqual[CMDQ_DEBUG].present == TRUE)
+# define Q_ENCODE (G_cmdqual[CMDQ_ENCODE].present == TRUE)
+# define Q_FORMAT (G_cmdqual[CMDQ_FORMAT].present == TRUE)
+# define Q_INPUT_FILE (G_cmd_ipfile.present == TRUE)
+# define Q_LOG (G_cmdqual[CMDQ_LOG].present == TRUE)
+# define Q_HELP (G_cmdqual[CMDQ_HELP].present == TRUE)
+# define Q_MODE (G_cmdqual[CMDQ_MODE].present == TRUE)
+# define Q_OUTPUT_FILE (G_cmd_opfile.present == TRUE)
+# define Q_OVERWRITE (G_cmdqual[CMDQ_OVERWRITE].present == TRUE)
+# define Q_RECORDLEN (G_cmdqual[CMDQ_RECORDLEN].present == TRUE)
+# define Q_TIMESTAMP (G_cmdqual[CMDQ_TIMESTAMP].present == TRUE)
+# define Q_TRANSLATE (G_cmdqual[CMDQ_TRANSLATE].present == TRUE)
+
+# ifdef VVENCODE
+# define Q_HEADER_FILE (G_cmdqual[CMDQ_HDRFILE].present == TRUE)
+# define Q_SPLIT (G_cmdqual[CMDQ_SPLIT].present == TRUE)
+# endif /* VVENCODE */
+
+# ifdef VVDECODE
+# define Q_INDEXFILE (G_cmdqual[CMDQ_INDEXFILE].present == TRUE)
+# define Q_PADCHAR (G_cmdqual[CMDQ_PADCHAR].present == TRUE)
+# define Q_UUDECODE (G_cmdqual[CMDQ_UUDECODE].present == TRUE)
+# define Q_XXDECODE (G_cmdqual[CMDQ_XXDECODE].present == TRUE)
+# endif /* VVDECODE */
+
+#endif /* VVCODE_MAIN */
+
+
+
+/*-
+**----------------------------------------------------------------------------
+** The VVENCODE file mode strings are recorded in a global string
+** array and indexed using the series of "MODE_" macros defined below.
+**----------------------------------------------------------------------------
+*/
+#ifdef VVCODE_MAIN
+ CONST char *G_mode_str[] =
+ {
+ "binary",
+ "text",
+ NULL
+ };
+#else /* NOT VVCODE_MAIN */
+ extern CONST char *G_mode_str[];
+#endif /* VVCODE_MAIN */
+
+#define MODE_BINARY 0
+#define MODE_TEXT 1
+
+
+/*-
+**----------------------------------------------------------------------------
+** The VVENCODE file format strings are recorded in a global string
+** array and indexed using the series of "FMT_" macros defined below.
+**----------------------------------------------------------------------------
+*/
+#ifdef VVCODE_MAIN
+ CONST char *G_fmt_str[] =
+ {
+ "default",
+ "stream",
+ "fixed",
+ "variable",
+ NULL
+ };
+#else /* NOT VVCODE_MAIN */
+ extern CONST char *G_fmt_str[];
+#endif /* VVCODE_MAIN */
+
+
+#define FMT_DEFAULT 0
+#define FMT_STREAM 1
+#define FMT_FIXED 2
+#define FMT_VARIABLE 3
+
+
+
+/*-
+**============================================================================
+**
+** SECTION 8 - VVE FILE DEFINITIONS AND PROCESSING
+**
+**============================================================================
+*/
+
+/*-
+**----------------------------------------------------------------------------
+** Macros fundamental to the VVENCODEd file.
+**
+** VV_EOL_MARKER - the string appended to every line of VVENCODEd
+** data to avoid the possibility of a line ending
+** with a space character which may be
+** subsequently stripped.
+** VV_PREFIX - the string prepended to every line of
+** VVENCODEd data to help VVDECODE ignore
+** unwanted lines such as mail headers.
+**----------------------------------------------------------------------------
+*/
+#define VV_EOL_MARKER "V"
+#define VV_PREFIX "Vv"
+#define VV_POSTAMBLE_LEN 60L
+
+#ifdef VVDECODE
+ char *G_vv_prefix;
+ char *G_eol_marker;
+#endif /* VVDECODE */
+
+#ifdef VVENCODE
+ static CONST char *G_vv_advert[] =
+ {
+ "**********************************************************************",
+ "** This is a VVencoded file. Implementations of VVDECODE and **",
+ "** VVENCODE are freely available for many different computers and **",
+ "** operating systems. The master portable C source is available **",
+ "** from the Aston University TeX archive - the home of VVCODE. **",
+ "** **",
+ "** If you want to find out more about VVCODE, send a message to **",
+ "** List_Server@TeX.Ac.Uk with the subject text 'HELP VVCODE' **",
+ "**********************************************************************",
+ NULL
+ };
+#endif /* VVENCODE */
+
+
+#ifdef VVCODE_MAIN
+ Header_Struct G_vvehdr[] =
+ {
+ {"attrbegin", FALSE, NULL},
+ {"attrend", FALSE, NULL},
+ {"begin", FALSE, NULL},
+ {"bytecount", FALSE, NULL},
+ {"characterset", FALSE, NULL},
+ {"comment", FALSE, NULL},
+ {"crc32", FALSE, NULL},
+ {"decodeversion", FALSE, NULL},
+ {"end", FALSE, NULL},
+ {"format", FALSE, NULL},
+ {"mode", FALSE, NULL},
+ {"operatingsystem", FALSE, NULL},
+ {"recordlength", FALSE, NULL},
+ {"skipfrom", FALSE, NULL},
+ {"skipto", FALSE, NULL},
+ {"table", FALSE, NULL},
+ {"timestamp", FALSE, NULL},
+ {NULL, FALSE, NULL}
+ };
+#else /* NOT VVCODE_MAIN */
+ extern Header_Struct G_vvehdr;
+#endif /* VVCODE_MAIN */
+
+
+#define HDR_UNKNOWN (-1)
+#define HDR_ATTRBEGIN 0
+#define HDR_ATTREND 1
+#define HDR_BEGIN 2
+#define HDR_BYTECOUNT 3
+#define HDR_CHARACTERSET 4
+#define HDR_COMMENT 5
+#define HDR_CRC32 6
+#define HDR_DECODEVERSION 7
+#define HDR_END 8
+#define HDR_FORMAT 9
+#define HDR_MODE 10
+#define HDR_OPERATINGSYSTEM 11
+#define HDR_RECORDLEN 12
+#define HDR_SKIPFROM 13
+#define HDR_SKIPTO 14
+#define HDR_TABLE 15
+#define HDR_TIMESTAMP 16
+
+
+/*-
+**----------------------------------------------------------------------------
+** Macros used as convenient flags to test whether certain VVE header lines
+** and arguments have been read.
+**----------------------------------------------------------------------------
+*/
+#ifdef VVDECODE
+
+# define VVEH_ATTRBEGIN (G_vvehdr[HDR_ATTRBEGIN].present == TRUE)
+# define VVEH_ATTREND (G_vvehdr[HDR_ATTREND].present == TRUE)
+# define VVEH_BEGIN (G_vvehdr[HDR_BEGIN].present == TRUE)
+# define VVEH_BYTECOUNT (G_vvehdr[HDR_BYTECOUNT].present == TRUE)
+# define VVEH_CHARACTERSET (G_vvehdr[HDR_CHARACTERSET].present == TRUE)
+# define VVEH_COMMENT (G_vvehdr[HDR_COMMENT].present == TRUE)
+# define VVEH_CRC32 (G_vvehdr[HDR_CRC32].present == TRUE)
+# define VVEH_DECODEVERSION (G_vvehdr[HDR_DECODEVERSION].present == TRUE)
+# define VVEH_END (G_vvehdr[HDR_END].present == TRUE)
+# define VVEH_FORMAT (G_vvehdr[HDR_FORMAT].present == TRUE)
+# define VVEH_MODE (G_vvehdr[HDR_MODE].present == TRUE)
+# define VVEH_OPERATINGSYSTEM (G_vvehdr[HDR_OPERATINGSYSTEM].present == TRUE)
+# define VVEH_RECORDLEN (G_vvehdr[HDR_RECORDLEN].present == TRUE)
+# define VVEH_SKIPFROM (G_vvehdr[HDR_SKIPFROM].present == TRUE)
+# define VVEH_SKIPTO (G_vvehdr[HDR_SKIPTO].present == TRUE)
+# define VVEH_TABLE (G_vvehdr[HDR_TABLE].present == TRUE)
+# define VVEH_TIMESTAMP (G_vvehdr[HDR_TIMESTAMP].present == TRUE)
+
+#endif /* VVDECODE */
+
+
+
+/*-
+**============================================================================
+**
+** SECTION 9 - XLT FILE DEFINITIONS AND PROCESSING
+**
+**============================================================================
+*/
+#define XLT_COMMENT_CHAR '#'
+#define IDX_COMMENT_CHAR '#'
+
+#ifdef VVCODE_MAIN
+ Header_Struct G_xlthdr[] =
+ {
+ {"xlt-from", FALSE, NULL},
+ {"xlt-to", FALSE, NULL},
+ {"xlt-substchar", FALSE, NULL},
+ {NULL, FALSE, NULL}
+ };
+#else /* NOT VVCODE_MAIN */
+ extern Header_Struct G_xlthdr[];
+#endif /* VVCODE_MAIN */
+
+
+/*-
+**----------------------------------------------------------------------------
+** Macros used as convenient flags to test whether certain XLT header lines
+** and arguments have been read.
+**----------------------------------------------------------------------------
+*/
+#define HDR_XLT_UNKNOWN (-1)
+#define HDR_XLT_FROM 0
+#define HDR_XLT_TO 1
+#define HDR_XLT_SUBSTCHAR 2
+
+
+/*-
+**============================================================================
+**
+** SECTION 10 - MACROS USED IN LIEU OF VARIABLE LENGTH ARGUMENT LISTS
+**
+**============================================================================
+*/
+
+
+/*-
+**----------------------------------------------------------------------------
+** Internal error message
+**----------------------------------------------------------------------------
+*/
+#define INTERNAL_ERROR(_caller)\
+ SPRINTF (G_tmp_msg, "Internal error detected in %s()", _caller);\
+ user_message (FATAL_STATUS, G_tmp_msg, &G_log_file); \
+ vv_exit ()
+
+
+/*-
+**----------------------------------------------------------------------------
+** Log file messages
+**----------------------------------------------------------------------------
+*/
+#define LOGMSG(_fmt) \
+ user_message (LOG_STATUS, _fmt, &G_log_file)
+
+#define LOGMSG_1(_fmt, _arg1) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1); \
+ user_message (LOG_STATUS, G_tmp_msg, &G_log_file)
+
+#define LOGMSG_2(_fmt, _arg1, _arg2) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \
+ user_message (LOG_STATUS, G_tmp_msg, &G_log_file)
+
+#define LOGMSG_3(_fmt, _arg1, _arg2, _arg3) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \
+ user_message (LOG_STATUS, G_tmp_msg, &G_log_file)
+
+#define LOGMSG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \
+ user_message (LOG_STATUS, G_tmp_msg, &G_log_file)
+
+
+/*-
+**----------------------------------------------------------------------------
+** Explanatory messages
+**----------------------------------------------------------------------------
+*/
+#define INFOMSG(_fmt) \
+ user_message (INFO_STATUS, _fmt, &G_log_file)
+
+#define INFOMSG_1(_fmt, _arg1) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1); \
+ user_message (INFO_STATUS, G_tmp_msg, &G_log_file)
+
+#define INFOMSG_2(_fmt, _arg1, _arg2) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \
+ user_message (INFO_STATUS, G_tmp_msg, &G_log_file)
+
+#define INFOMSG_3(_fmt, _arg1, _arg2, _arg3) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \
+ user_message (INFO_STATUS, G_tmp_msg, &G_log_file)
+
+#define INFOMSG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \
+ user_message (INFO_STATUS, G_tmp_msg, &G_log_file)
+
+
+/*-
+**----------------------------------------------------------------------------
+** Warning messages
+**----------------------------------------------------------------------------
+*/
+#define WARNMSG(_fmt) \
+ user_message (WARNING_STATUS, _fmt, &G_log_file)
+
+#define WARNMSG_1(_fmt, _arg1) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1); \
+ user_message (WARNING_STATUS, G_tmp_msg, &G_log_file)
+
+#define WARNMSG_2(_fmt, _arg1, _arg2) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \
+ user_message (WARNING_STATUS, G_tmp_msg, &G_log_file)
+
+#define WARNMSG_3(_fmt, _arg1, _arg2, _arg3) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \
+ user_message (WARNING_STATUS, G_tmp_msg, &G_log_file)
+
+#define WARNMSG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \
+ user_message (WARNING_STATUS, G_tmp_msg, &G_log_file)
+
+
+/*-
+**----------------------------------------------------------------------------
+** Error messages
+**----------------------------------------------------------------------------
+*/
+#define ERRORMSG(_fmt) \
+ user_message (ERROR_STATUS, _fmt, &G_log_file)
+
+#define ERRORMSG_1(_fmt, _arg1) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1); \
+ user_message (ERROR_STATUS, G_tmp_msg, &G_log_file)
+
+#define ERRORMSG_2(_fmt, _arg1, _arg2) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \
+ user_message (ERROR_STATUS, G_tmp_msg, &G_log_file)
+
+#define ERRORMSG_3(_fmt, _arg1, _arg2, _arg3) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \
+ user_message (ERROR_STATUS, G_tmp_msg, &G_log_file)
+
+#define ERRORMSG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \
+ user_message (ERROR_STATUS, G_tmp_msg, &G_log_file)
+
+
+/*-
+**----------------------------------------------------------------------------
+** Fatal error messages
+**----------------------------------------------------------------------------
+*/
+#define FATALMSG(_fmt) \
+ user_message (FATAL_STATUS, _fmt, &G_log_file)
+
+#define FATALMSG_1(_fmt, _arg1) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1); \
+ user_message (FATAL_STATUS, G_tmp_msg, &G_log_file)
+
+#define FATALMSG_2(_fmt, _arg1, _arg2) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \
+ user_message (FATAL_STATUS, G_tmp_msg, &G_log_file)
+
+#define FATALMSG_3(_fmt, _arg1, _arg2, _arg3) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \
+ user_message (FATAL_STATUS, G_tmp_msg, &G_log_file)
+
+#define FATALMSG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \
+ user_message (FATAL_STATUS, G_tmp_msg, &G_log_file)
+
+
+/*-
+**----------------------------------------------------------------------------
+** Usage error messages
+**----------------------------------------------------------------------------
+*/
+#define USAGE(_fmt) \
+ usage_error (_fmt)
+
+#define USAGE_1(_fmt, _arg1) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1); \
+ usage_error (G_tmp_msg)
+
+#define USAGE_2(_fmt, _arg1, _arg2) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2); \
+ usage_error (G_tmp_msg)
+
+#define USAGE_3(_fmt, _arg1, _arg2, _arg3) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3); \
+ usage_error (G_tmp_msg)
+
+#define USAGE_4(_fmt, _arg1, _arg2, _arg3, _arg4) \
+ SPRINTF (G_tmp_msg, _fmt, _arg1, _arg2, _arg3, _arg4); \
+ usage_error (G_tmp_msg)
+
+
+/*-
+**----------------------------------------------------------------------------
+** DEBUG messages
+**----------------------------------------------------------------------------
+*/
+#if (VV_DEBUG_SUPPORT)
+
+# define DEBUG(_fmt) \
+ if (G_debugging == TRUE)\
+ {\
+ FPRINTF (stderr, "DEBUG: ");\
+ FPRINTF (stderr, _fmt);\
+ FPRINTF (stderr, "\n");\
+ }
+
+# define DEBUG_1(_fmt, _arg1) \
+ if (G_debugging == TRUE)\
+ {\
+ FPRINTF (stderr, "DEBUG: ");\
+ FPRINTF (stderr, _fmt, _arg1);\
+ FPRINTF (stderr, "\n");\
+ }
+
+# define DEBUG_2(_fmt, _arg1, _arg2) \
+ if (G_debugging == TRUE)\
+ {\
+ FPRINTF (stderr, "DEBUG: ");\
+ FPRINTF (stderr, _fmt, _arg1, _arg2);\
+ FPRINTF (stderr, "\n");\
+ }
+
+# define DEBUG_3(_fmt, _arg1, _arg2, _arg3) \
+ if (G_debugging == TRUE)\
+ {\
+ FPRINTF (stderr, "DEBUG: ");\
+ FPRINTF (stderr, _fmt, _arg1, _arg2, _arg3);\
+ FPRINTF (stderr, "\n");\
+ }
+
+# define DEBUG_4(_fmt, _arg1, _arg2, _arg3, _arg4) \
+ if (G_debugging == TRUE)\
+ {\
+ FPRINTF (stderr, "DEBUG: ");\
+ FPRINTF (stderr, _fmt, _arg1, _arg2, _arg3, _arg4);\
+ FPRINTF (stderr, "\n");\
+ }
+
+#else /* NOT (VV_DEBUG_SUPPORT) */
+
+# define DEBUG(_fmt)
+# define DEBUG_1(_fmt, _arg1)
+# define DEBUG_2(_fmt, _arg1, _arg2)
+# define DEBUG_3(_fmt, _arg1, _arg2, _arg3)
+# define DEBUG_4(_fmt, _arg1, _arg2, _arg3, _arg4)
+
+#endif /* (VV_DEBUG_SUPPORT) */
+
+
+
+/*-
+**----------------------------------------------------------------------------
+** Writing to the VVE file
+**----------------------------------------------------------------------------
+*/
+#ifdef VVENCODE
+
+# define VVEOUT(_fmt) \
+ SPRINTF (G_op_buffer, _fmt); \
+ { \
+ Int32 msg_length; \
+ msg_length = (Int32) strlen (G_op_buffer); \
+ write_bytes (msg_length, G_op_buffer, &G_op_file); \
+ G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \
+ }
+
+# define VVEOUT_1(_fmt, _arg1) \
+ SPRINTF (G_op_buffer, _fmt, _arg1); \
+ { \
+ Int32 msg_length; \
+ msg_length = (Int32) strlen (G_op_buffer); \
+ write_bytes (msg_length, G_op_buffer, &G_op_file); \
+ G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \
+ }
+
+# define VVEOUT_2(_fmt, _arg1, _arg2) \
+ SPRINTF (G_op_buffer, _fmt, _arg1, _arg2); \
+ { \
+ Int32 msg_length; \
+ msg_length = (Int32) strlen (G_op_buffer); \
+ write_bytes (msg_length, G_op_buffer, &G_op_file); \
+ G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \
+ }
+
+# define VVEOUT_3(_fmt, _arg1, _arg2, _arg3) \
+ SPRINTF (G_op_buffer, _fmt, _arg1, _arg2, _arg3); \
+ { \
+ Int32 msg_length; \
+ msg_length = (Int32) strlen (G_op_buffer); \
+ write_bytes (msg_length, G_op_buffer, &G_op_file); \
+ G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \
+ }
+
+# define VVEOUT_4(_fmt, _arg1, _arg2, _arg3, _arg4) \
+ SPRINTF (G_op_buffer, _fmt, _arg1, _arg2, _arg3, _arg4); \
+ { \
+ Int32 msg_length; \
+ msg_length = (Int32) strlen (G_op_buffer); \
+ write_bytes (msg_length, G_op_buffer, &G_op_file); \
+ G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \
+ }
+
+# define VVEOUT_5(_fmt, _arg1, _arg2, _arg3, _arg4, _arg5) \
+ SPRINTF (G_op_buffer, _fmt, _arg1, _arg2, _arg3, _arg4, _arg5); \
+ { \
+ Int32 msg_length; \
+ msg_length = (Int32) strlen (G_op_buffer); \
+ write_bytes (msg_length, G_op_buffer, &G_op_file); \
+ G_oppart_bytes += msg_length + (Int32) TEXT_LINE_OVERHEAD; \
+ }
+
+#endif /* VVENCODE */
+
+
+
+
+/*-
+**============================================================================
+**
+** SECTION 11 - MISCELLANEOUS BODGES
+**
+**============================================================================
+*/
+#ifndef VVCODE_MAIN
+ void usage_error ARGS ((CONST char *reason));
+#endif /* VVCODE_MAIN */
diff --git a/support/vvcode/local.h b/support/vvcode/local.h
new file mode 100644
index 0000000000..185f60b114
--- /dev/null
+++ b/support/vvcode/local.h
@@ -0,0 +1,250 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "local.h",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet)",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+** MODULE CONTENTS
+**
+** [tbs]
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+
+
+/*-
+**----------------------------------------------------------------------------
+** VV_DEBUG_SUPPORT controls whether the debugging code is compiled into the
+** program. Define to one of the following two values:
+**
+** 0 don't compile in debugging code
+** 1 compile in debugging code
+**----------------------------------------------------------------------------
+*/
+#define VV_DEBUG_SUPPORT 1
+
+
+
+/*-
+**----------------------------------------------------------------------------
+** VV_TIMEZONE defines the timezone of your local computer. On most Unix
+** systems the timezone will be known to the operating system, so this
+** definition will not strictly be necessary. It is however essential for
+** systems such as MS-DOS where writers of many compilers have assumed their
+** local timezone (e.g. Microsoft C assumes US West Coast time and Turbo C
+** assumes US East Coast time).
+**
+** The string to be used for the times should conform to the Unix standard
+** format for timezones, namely:
+**
+** SSSwwDDD
+**
+** SSS the three letter abbreviation of the timezone.
+** ww the number of hours WEST of GMT (Universal Time) in this timezone.
+** Timezones EAST of GMT have negative values.
+** DDD (optional) the three letter abbreviation of the timezone when
+** daylight saving time is in effect. If this part of the string is
+** not present it is assumed that daylight saving time is never in
+** effect.
+**
+** Examples of valid timezones are shown below, though some of the names may
+** be incorrect.
+**
+**
+** NST-12NDT New Zealand Standard Time
+** ???-11??? GMT+1100
+** EST-10??? Eastern Australia Standard Time
+** JST-9??? Japanese Standard Time
+** WST-8??? Western Australia Standard Time
+** ???-7??? GMT+0700
+** ???-6??? GMT+0600
+** ???-5??? GMT+0500
+** ???-4??? GMT+0400
+** ???-3??? GMT+0300
+** EET-2EST East European Time
+** CET-1CST Central European Time
+**
+** UTC0 Coordinated universal time (GMT)
+** GMT0BST Greenwich Mean Time, British Summer Time
+**
+** ???1??? GMT-0100
+** ???2??? GMT-0200
+** ???3??? GMT-0300
+** AST4ADT Atlantic Standard Time
+** EST5EDT Eastern Standard Time
+** CST6CDT Central Standard Time
+** MST7MDT Mountain Standard Time
+** PST8PDT Pacific Standard Time
+** YST9YDT Yukon Standard Time
+** HST10HDT Hawaii Standard Time
+** BST11BDT Bering Standard Time
+**----------------------------------------------------------------------------
+*/
+#define VV_TIMEZONE "GMT0BST"
+
+
+
+/*-
+**----------------------------------------------------------------------------
+** DEFAULT FILE EXTENSIONS
+**
+** VVcode uses default file 'extensions' for different types of files. If the
+** implementation is compiled with STICKY_DEFAULTS defined, the appropriate
+** 'extension' will be assumed if a file without 'extension' is specified.
+** The file 'extensions' used are:
+**
+** DEF_ENC_EXT - VVcode encoding table files
+** DEF_IDX_EXT - VVdecode translation table index files
+** DEF_LOG_EXT - VVcode log files
+** DEF_VV_EXT - VVcode 'VVE' files
+** DEF_XLT_EXT - VVcode character set translation files
+**
+** Examples are:
+**
+** #define DEF_ENC_EXT "tbl"
+** #define DEF_IDX_EXT "idx"
+** #define DEF_LOG_EXT "log"
+** #define DEF_VV_EXT "vve"
+** #define DEF_XLT_EXT "xlt"
+**
+** NOTE: most operating systems separate the 'extension' from the 'name'
+** by a certain character (e.g. '.' for MS-DOS, VAX/VMS and ' ' for
+** VM/CMS). DO NOT include this character in the 'extension' string.
+**----------------------------------------------------------------------------
+*/
+#define DEF_ENC_EXT "tbl"
+#define DEF_IDX_EXT "idx"
+#define DEF_LOG_EXT "log"
+#define DEF_VV_EXT "vve"
+#define DEF_XLT_EXT "xlt"
+
+
+
+/*-
+**----------------------------------------------------------------------------
+** DEFAULTS FOR MULTI-PART VVE FILES
+**
+** When encoding and decoding multi-part VVE files, VVcode uses different
+** file 'extensions' to identify the different parts.
+**
+** VV_EXT_FMT - printf() compatible format used to construct the
+** string for the file 'extension'. The format string
+** must accept one Int16 integer as an argument and must
+** result in a legal file 'extension' for this
+** implementation of VVcode.
+** MAX_VV_PARTS - the maximum number of VVE parts allowed. It must be
+** be less than or equal to the unique file 'extensions'
+** that can be constructed by the VV_EXT_FMT format
+** string.
+**
+** Examples are:
+**
+** #define VV_EXT_FMT "v%02d"
+** #define MAX_VV_PARTS 99
+**
+** #define VV_EXT_FMT "vve_part_%04x"
+** #define MAX_VV_PARTS 32767
+**----------------------------------------------------------------------------
+*/
+#define VV_EXT_FMT "v%02d"
+#define MAX_VV_PARTS 99
+
+
+
+/*-
+**----------------------------------------------------------------------------
+** LOCAL CHARACTER SET
+**
+**----------------------------------------------------------------------------
+*/
+#define VV_CHARACTERSET "ASCII"
+
+
+
+/*-
+**----------------------------------------------------------------------------
+** VVDECODE INDEX FILE DEFAULTS
+**
+** When decoding a VVE file encoded on a system with a different character
+** set, VVdecode can use a character translation table. If the user does not
+** explictily specify the table file with the "translation_file" command
+** qualifier, VVdecode expects to look up the correct translation file in a
+** translation index file. This file contains lines of the form:
+**
+** ##-----------------------------------------------
+** ## From To Translation
+** ## char set char set table file
+** ##-----------------------------------------------
+** ASCII EBCDIC-1 asc-ebc1.xlt
+** ASCII PC-437 asc-437.xlt
+** ##-----------------------------------------------
+**
+** VVdecode tries to determine the index file to use by applying the
+** following rules in order:
+**
+** 1. If the "index_file" command qualifier was used to specify the index
+** file, use its value as the file specification of the index file.
+**
+** 2. If the environment variable specified by the preprocessor macro
+** VV_INDEX_ENVVAR is defined, use its value as the file specification of
+** the index file. If the operating system does not support environment
+** variables and retrieval of their values by getenv(), set this value to
+** NULL.
+**
+** 3. The preprocessor macro VV_INDEX_FILE specifies the default index file
+** to be used if neither of the preceeding cases were successful. If
+** a default file is not to be used, set this value to NULL.
+**
+** The preprocessor macros VV_INDEX_ENVVAR and VV_INDEX_FILE should be defined
+** below.
+**----------------------------------------------------------------------------
+*/
+#define VV_INDEX_ENVVAR "VV_INDEX_FILE"
+#define VV_INDEX_FILE "vv-xlt.idx"
diff --git a/support/vvcode/machine.h b/support/vvcode/machine.h
new file mode 100644
index 0000000000..9505de1ac8
--- /dev/null
+++ b/support/vvcode/machine.h
@@ -0,0 +1,889 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "machine.h",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet)",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+** MODULE CONTENTS
+**
+** [tbs]
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+
+/*-
+******************************************************************************
+******************************************************************************
+**
+** MACROS TO BE DEFINED
+**
+** For each of the operating environments, the macros listed below must be
+** defined. For full details of the meaning of these macros, see the file
+** porting.doc that comes with vvcode.
+**
+** VVcode Environment
+**
+** VV_OPERATING_SYSTEM
+** VV_IMPLEMENTATION
+** ANSI_SYNTAX
+**
+** Command Line Interface
+**
+** QUAL_INTRO
+** QUAL_SEP
+** OPTIONAL_QUALIFIER_VALUES
+** STICKY_DEFAULTS
+** STDOUT_OUTPUT
+** SUPPORT_PIPING
+** STDIO_SYMBOL
+**
+** File Specifications
+**
+** MAX_PATH
+** MAX_PREAMBLE
+** MAX_NAME
+** MAX_EXT
+** MAX_POSTAMBLE
+** PREAMBLE_END
+** EXTENSION_BEGIN
+** POSTAMBLE_BEGIN
+** UPPERCASE_FILESYSTEM
+** LEGAL_FILESPEC_CHARS
+** REPLACEMENT_FILESPEC_CHAR
+**
+** File Formats
+**
+** SUPPORT_FIXED_FMT
+** SUPPORT_STREAM_FMT
+** SUPPORT_VARIABLE_FMT
+** TEXT_LINE_OVERHEAD
+**
+** DEF_MODE
+** DEF_TEXT_FMT
+** DEF_BINARY_FMT
+**
+** MIN_VARIABLE_RECORD_LEN
+** MAX_VARIABLE_RECORD_LEN
+** DEF_VARIABLE_RECORD_LEN
+**
+** MIN_FIXED_RECORD_LEN
+** MAX_FIXED_RECORD_LEN
+** DEF_FIXED_RECORD_LEN
+**
+** DEF_TEXT_PADCHAR
+** DEF_BINARY_PADCHAR
+**
+******************************************************************************
+******************************************************************************
+*/
+
+
+/*-
+******************************************************************************
+******************************************************************************
+**
+** COMPILERS AND ENVIRONMENTS SUPPORTED
+**
+** The compilers and environments supported are summarized here. More
+** details are provided under the header comment for each environment.
+**
+** MS-DOS
+** MS-DOS, PC-DOS v3.2, v3.3, v4.01, v5.00
+**
+** Borland Turbo C v1.5, v2.0
+** Borland Turbo C++ v1.0, v2.0, v3.0
+** Microsoft C v5.1, v6.0
+**
+** OS/2
+** IBM OS/2 v2.0
+**
+** GNUC C v2.1 with EMX v0.8c or later
+** Microsoft C v6.0
+** IBM C Set/2 v1.0
+**
+** UNIX
+** BSD 4.1, BSD 4.2, BSD 4.3, System V
+**
+** GNU C v1.38
+** native cc
+**
+** VAX/VMS
+** v5.1 - v5.4-1
+**
+** GNU C v1.38
+** VMS cc v3
+**
+** VM/CMS
+** version ?
+**
+** Waterloo C version ?
+**
+******************************************************************************
+******************************************************************************
+*/
+
+
+#ifdef FALSE
+# undef FALSE
+#endif
+#define FALSE 0
+
+#ifdef TRUE
+# undef TRUE
+#endif
+#define TRUE 1
+
+
+/*
+**============================================================================
+** OS_MSDOS
+**
+** Definitions for the Microsoft MS/PC-DOS operating system used on the IBM
+** PC and compatibles. The compilers supported are:
+**
+** Borland Turbo C v1.5, v2.0 MSDOS_TURBOC
+** Borland Turbo C++ v1.0, v2.0, v3.0 MSDOS_TURBOC
+** Microsoft C v5.1 MSDOS_MSC
+** Microsoft C v6 MSDOS_MSC
+**
+**============================================================================
+*/
+#if (OS_MSDOS)
+
+/*
+**----------------------------------------------------------------------------
+** VVCODE ENVIRONMENT
+**
+** Both MS-DOS C compilers support the ANSI standard.
+** The MS-DOS implementation of VVCODE does not act as a filter.
+**----------------------------------------------------------------------------
+*/
+# define VV_OPERATING_SYSTEM "MS-DOS"
+
+# if (MSDOS_TURBOC)
+# define ANSI_SYNTAX TRUE
+# define VV_IMPLEMENTATION "MS-DOS Turbo C"
+# endif /* (MSDOS_TURBOC) */
+
+# if (MSDOS_MSC)
+# define ANSI_SYNTAX TRUE
+# define VV_IMPLEMENTATION "MS-DOS Microsoft C"
+# endif /* (MSDOS_MSC) */
+
+/*-
+**----------------------------------------------------------------------------
+** INCLUDE FILES
+**----------------------------------------------------------------------------
+*/
+# include <stddef.h>
+# include <stdlib.h>
+# include <string.h>
+# include <ctype.h>
+# include <dos.h>
+# include <errno.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <time.h>
+
+# if (MSDOS_TURBOC)
+# include <alloc.h>
+# endif /* (MSDOS_TURBOC) */
+
+# if (MSDOS_MSC)
+# include <malloc.h>
+# endif /* (MSDOS_MSC) */
+
+/*
+**----------------------------------------------------------------------------
+** COMMAND LINE PARSING
+**
+** MS-DOS qualifiers are usually introduced with a '/' and values separated
+** with an '='. A typical command line would be:
+**
+** program /qualifier file1 /qual=VALUE file2
+**----------------------------------------------------------------------------
+*/
+# define QUAL_INTRO "/-"
+# define QUAL_SEP "=:-"
+# define OPTIONAL_QUALIFIER_VALUES TRUE
+# define STICKY_DEFAULTS TRUE
+# define STDOUT_OUTPUT FALSE
+# define SUPPORT_PIPING TRUE
+# define STDIO_SYMBOL "-"
+
+/*
+**----------------------------------------------------------------------------
+** FILE SPECIFICATIONS
+**
+** The general MS-DOS file specification has the form:
+**
+** \\node\dir1\dir2\name.ext
+** device:\dir1\dir2\name.ext
+**
+** The preamble is terminated by one of ':' or '\'.
+** There is no postamble.
+**----------------------------------------------------------------------------
+*/
+# define MAX_PATH 80
+# define MAX_PREAMBLE 64
+# define MAX_NAME 8
+# define MAX_EXT 4
+# define MAX_POSTAMBLE 0
+
+# define PREAMBLE_END ":\\"
+# define EXTENSION_BEGIN '.'
+# define POSTAMBLE_BEGIN ""
+# define UPPERCASE_FILESYSTEM TRUE
+
+# define LEGAL_FILESPEC_CHARS \
+ "@#$%^&-_=+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890"
+# define REPLACEMENT_FILESPEC_CHAR '_'
+
+/*
+**----------------------------------------------------------------------------
+** FILE FORMATS
+**
+** MS-DOS has a stream file system and does not support the different file
+** formats - they are all written as stream files. Text and binary files are
+** written differently.
+**----------------------------------------------------------------------------
+*/
+# define SUPPORT_FIXED_FMT TRUE
+# define SUPPORT_STREAM_FMT TRUE
+# define SUPPORT_VARIABLE_FMT TRUE
+
+# define TEXT_LINE_OVERHEAD 1
+
+# define DEF_MODE MODE_BINARY
+# define DEF_TEXT_FMT FMT_STREAM
+# define DEF_BINARY_FMT FMT_STREAM
+
+# define MIN_VARIABLE_RECORD_LEN 1
+# define MAX_VARIABLE_RECORD_LEN 32765
+# define DEF_VARIABLE_RECORD_LEN 80
+
+# define MIN_FIXED_RECORD_LEN 1
+# define MAX_FIXED_RECORD_LEN 32767
+# define DEF_FIXED_RECORD_LEN 512
+
+# define DEF_TEXT_PADCHAR ' '
+# define DEF_BINARY_PADCHAR 0
+
+
+#endif /* (OS_MSDOS) */
+
+
+
+/*
+**============================================================================
+** OS_OS2
+**
+** Definitions for the IBM OS/2 operating system used on the IBM PC and
+** compatibles. The compilers supported are:
+**
+** GNUC C v2.1 with EMX OS2_GNUC
+** IBM C Set/2 OS2_CSET
+** Microsoft C v6 OS2_MSC
+**
+**============================================================================
+*/
+#if (OS_OS2)
+
+/*
+**----------------------------------------------------------------------------
+** VVCODE ENVIRONMENT
+**
+** All three OS/2 C compilers support the ANSI standard.
+** The OS/2 implementation of VVCODE does not act as a filter.
+**----------------------------------------------------------------------------
+*/
+# define VV_OPERATING_SYSTEM "OS/2"
+
+# if (OS2_CSET)
+# define ANSI_SYNTAX TRUE
+# define VV_IMPLEMENTATION "OS/2 2.x IBM C Set/2"
+# endif /* (OS2_CSET) */
+
+# if (OS2_GNUC)
+# define ANSI_SYNTAX TRUE
+# define VV_IMPLEMENTATION "OS/2 2.x EMX/GNU C"
+# endif /* (OS2_GNUC) */
+
+# if (OS2_MSC)
+# define ANSI_SYNTAX TRUE
+# define VV_IMPLEMENTATION "OS/2 Microsoft C"
+# endif /* (OS2_MSCT) */
+
+/*-
+**----------------------------------------------------------------------------
+** INCLUDE FILES
+**----------------------------------------------------------------------------
+*/
+# include <stddef.h>
+# include <stdlib.h>
+# include <string.h>
+# include <ctype.h>
+# include <errno.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <time.h>
+
+/*
+**----------------------------------------------------------------------------
+** COMMAND LINE PARSING
+**
+** OS/2 qualifiers are usually introduced with a '/' and values separated
+** with an '='. A typical command line would be:
+**
+** program /qualifier file1 /qual=VALUE file2
+**----------------------------------------------------------------------------
+*/
+# define QUAL_INTRO "/-"
+# define QUAL_SEP "=:-"
+# define OPTIONAL_QUALIFIER_VALUES TRUE
+# define STICKY_DEFAULTS TRUE
+# define STDOUT_OUTPUT FALSE
+# define SUPPORT_PIPING TRUE
+# define STDIO_SYMBOL "-"
+
+/*
+**----------------------------------------------------------------------------
+** FILE SPECIFICATIONS
+**
+** The general OS/2 file specification has the form:
+**
+** \\node\dir1\dir2\name.ext
+** device:\dir1\dir2\name.ext
+**
+** The preamble is terminated by one of ':' or '\'.
+** There is no postamble.
+**----------------------------------------------------------------------------
+*/
+# define MAX_PATH 80
+# define MAX_PREAMBLE 64
+# define MAX_NAME 8
+# define MAX_EXT 4
+# define MAX_POSTAMBLE 0
+
+# define PREAMBLE_END ":\\"
+# define EXTENSION_BEGIN '.'
+# define POSTAMBLE_BEGIN ""
+# define UPPERCASE_FILESYSTEM TRUE
+
+# define LEGAL_FILESPEC_CHARS \
+ "@#$%^-_=+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890"
+# define REPLACEMENT_FILESPEC_CHAR '_'
+
+/*
+**----------------------------------------------------------------------------
+** FILE FORMATS
+**
+** OS/2 has a stream file system and does not support the different file
+** formats - they are all written as stream files. Text and binary files are
+** written differently.
+**----------------------------------------------------------------------------
+*/
+# define SUPPORT_FIXED_FMT FALSE
+# define SUPPORT_STREAM_FMT TRUE
+# define SUPPORT_VARIABLE_FMT FALSE
+
+# define TEXT_LINE_OVERHEAD 1
+
+# define DEF_MODE MODE_BINARY
+# define DEF_TEXT_FMT FMT_STREAM
+# define DEF_BINARY_FMT FMT_STREAM
+
+# define MIN_VARIABLE_RECORD_LEN INV_RECORD_LEN
+# define MAX_VARIABLE_RECORD_LEN INV_RECORD_LEN
+# define DEF_VARIABLE_RECORD_LEN INV_RECORD_LEN
+
+# define MIN_FIXED_RECORD_LEN INV_RECORD_LEN
+# define MAX_FIXED_RECORD_LEN INV_RECORD_LEN
+# define DEF_FIXED_RECORD_LEN INV_RECORD_LEN
+
+# define DEF_TEXT_PADCHAR ' '
+# define DEF_BINARY_PADCHAR 0
+
+#endif /* (OS_OS2) */
+
+
+
+/*
+**============================================================================
+** OS_UNIX
+**
+** Definitions for the Unix operating system. The variants of Unix &
+** compilers supported are:
+**
+** BSD 4.1 Unix UNIX_BSD41, UNIX_BSD
+** BSD 4.2 Unix UNIX_BSD42, UNIX_BSD
+** BSD 4.3 Unix UNIX_BSD43, UNIX_BSD
+** Unix system V UNIX_SYSV
+** SCO Unix system V UNIX_SYSV
+**
+** The GNU C compiler UNIX_GNUC
+** The Microsoft C compiler (on SCO Unix) UNIX_MSC
+**============================================================================
+*/
+#if (OS_UNIX)
+
+/*
+**----------------------------------------------------------------------------
+** VVCODE ENVIRONMENT
+**
+** The standard Berkeley C compiler does not support the ANSI standard.
+** The Unix implementation of VVCODE acts as a filter.
+**----------------------------------------------------------------------------
+*/
+# define VV_OPERATING_SYSTEM "UNIX"
+
+# if (UNIX_BSD)
+# define VV_IMPLEMENTATION "BSD Unix"
+# endif /* (UNIX_BSD) */
+
+# if (UNIX_SYSV)
+# define VV_IMPLEMENTATION "Unix System V"
+# endif /* (UNIX_SYSV) */
+
+#ifndef VV_IMPLEMENTATION
+# define VV_IMPLEMENTATION "Generic Unix C"
+# endif /* (VV_IMPLEMENTATION) */
+
+# if (UNIX_GNUC || UNIX_MSC)
+# define ANSI_SYNTAX TRUE
+# else /* NOT (UNIX_GNUC || UNIX_MSC) */
+# define ANSI_SYNTAX FALSE
+# endif /* (UNIX_GNUC || UNIX_MSC) */
+
+/*-
+**----------------------------------------------------------------------------
+** INCLUDE FILES
+**----------------------------------------------------------------------------
+*/
+# if (ANSI_SYNTAX)
+# include <stdlib.h>
+# endif /* (ANSI_SYNTAX) */
+
+# if (UNIX_STRINGS_H)
+# include <strings.h>
+# else /* NOT (UNIX_STRINGS_H) */
+# include <string.h>
+# endif /* (UNIX_STRINGS_H) */
+
+# include <errno.h>
+# include <ctype.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <time.h>
+
+/*
+**----------------------------------------------------------------------------
+** COMMAND LINE INTERFACE
+**
+** Unix qualifiers are usually introduced with a '-' and values separated
+** from the qualifier by whitespace. A typical command line would be:
+**
+** program -overwrite file1 -mode binary file2
+**----------------------------------------------------------------------------
+*/
+# define QUAL_INTRO "-"
+# define QUAL_SEP " =:"
+# define OPTIONAL_QUALIFIER_VALUES FALSE
+# define STICKY_DEFAULTS FALSE
+# define STDOUT_OUTPUT TRUE
+# define SUPPORT_PIPING TRUE
+# define STDIO_SYMBOL "-"
+
+/*
+**----------------------------------------------------------------------------
+** FILE SPECIFICATIONS
+**
+** The general Unix file specification has the form:
+**
+** node:/device/dir1/dir2/name.ext
+**
+** The preamble is terminated by one of ':' or '/'.
+** There is no postamble.
+**----------------------------------------------------------------------------
+*/
+# if (UNIX_BSD41)
+# define MAX_PATH 255
+# define MAX_PREAMBLE 255
+# define MAX_NAME 14
+# define MAX_EXT 14
+# define MAX_POSTAMBLE 0
+# endif /* (UNIX_BSD41) */
+
+# if (UNIX_BSD42)
+# define MAX_PATH 255
+# define MAX_PREAMBLE 255
+# define MAX_NAME 255
+# define MAX_EXT 255
+# define MAX_POSTAMBLE 0
+# endif /* (UNIX_BSD42) */
+
+# if (UNIX_BSD43)
+# define MAX_PATH 1024
+# define MAX_PREAMBLE 1024
+# define MAX_NAME 1024
+# define MAX_EXT 1024
+# define MAX_POSTAMBLE 0
+# endif /* (UNIX_BSD43) */
+
+# if (UNIX_SYSV)
+# define MAX_PATH 255
+# define MAX_PREAMBLE 255
+# define MAX_NAME 14
+# define MAX_EXT 14
+# define MAX_POSTAMBLE 0
+# endif /* (UNIX_SYSV) */
+
+# define PREAMBLE_END ":/"
+# define EXTENSION_BEGIN '.'
+# define POSTAMBLE_BEGIN ""
+# define UPPERCASE_FILESYSTEM FALSE
+
+# define LEGAL_FILESPEC_CHARS \
+ ".@#$%^&-_=+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890"
+# define REPLACEMENT_FILESPEC_CHAR '_'
+
+/*
+**----------------------------------------------------------------------------
+** FILE FORMATS
+**
+** UNIX has a stream file system and does not support the different file
+** formats - they are all written as stream files. Text and binary files
+** are not differentiated either.
+**----------------------------------------------------------------------------
+*/
+# define SUPPORT_FIXED_FMT FALSE
+# define SUPPORT_STREAM_FMT TRUE
+# define SUPPORT_VARIABLE_FMT FALSE
+
+# define TEXT_LINE_OVERHEAD 0
+
+# define DEF_MODE MODE_BINARY
+# define DEF_TEXT_FMT FMT_STREAM
+# define DEF_BINARY_FMT FMT_STREAM
+
+# define MIN_VARIABLE_RECORD_LEN INV_RECORD_LEN
+# define MAX_VARIABLE_RECORD_LEN INV_RECORD_LEN
+# define DEF_VARIABLE_RECORD_LEN INV_RECORD_LEN
+
+# define MIN_FIXED_RECORD_LEN INV_RECORD_LEN
+# define MAX_FIXED_RECORD_LEN INV_RECORD_LEN
+# define DEF_FIXED_RECORD_LEN INV_RECORD_LEN
+
+# define DEF_TEXT_PADCHAR 0
+# define DEF_BINARY_PADCHAR 0
+
+#endif /* (OS_UNIX) */
+
+
+
+/*
+**============================================================================
+** OS_VAXVMS
+**
+** Digital Equipment Corporation's proprietary VMS operating system for their
+** VAX series of computers. The versions and VMS and compilers supported
+** are:
+**
+** VAX/VMS v5.1 - v5.4-1
+**
+** VMS cc v3 VMS_VAXC
+** GNU C v1.38 VMS_GNUC
+**
+**============================================================================
+*/
+#if (OS_VAXVMS)
+
+/*
+**----------------------------------------------------------------------------
+** GENERAL DEFINITIONS
+**
+** The VAX/VMS C compiler supports most of the ANSI standard.
+**----------------------------------------------------------------------------
+*/
+# define VV_OPERATING_SYSTEM "VAX-VMS"
+
+# if (VMS_VAXC)
+# define ANSI_SYNTAX TRUE
+# define VV_IMPLEMENTATION "VAX/VMS C"
+# endif /* (VMS_VAXC) */
+
+# if (VMS_GNUC)
+# define ANSI_SYNTAX TRUE
+# define VV_IMPLEMENTATION "VAX/VMS GNU C"
+# endif /* (VMS_GNUC) */
+
+/*-
+**----------------------------------------------------------------------------
+** INCLUDE FILES
+**----------------------------------------------------------------------------
+*/
+# include <stddef.h>
+# include <stdlib.h>
+# include <string.h>
+# include <errno.h>
+# include <ctype.h>
+# include <stat.h>
+# include <time.h>
+# include <types.h>
+# include <unixio.h>
+
+/*
+**----------------------------------------------------------------------------
+** COMMAND LINE INTERFACE
+**
+** VAX/VMS qualifiers are usually introduced with a '/' and values separated
+** with an '='. A typical command line would be:
+**
+** program /qualifier file1 /qual=VALUE file2
+**
+** The VMS system utilities for command line parsing are used by VVCODE.
+** These definitions are used mainly for printing help and error messages.
+**----------------------------------------------------------------------------
+*/
+# define QUAL_INTRO "/"
+# define QUAL_SEP "=:"
+# define OPTIONAL_QUALIFIER_VALUES TRUE
+# define STICKY_DEFAULTS TRUE
+# define STDOUT_OUTPUT FALSE
+# define SUPPORT_PIPING FALSE
+# define STDIO_SYMBOL "-"
+
+/*
+**----------------------------------------------------------------------------
+** FILE SPECIFICATION PARSING
+**
+** The general VAX/VMS file specification has six components in the form:
+**
+** node::device:[dir1.dir2]name.ext;version
+** node::device:<dir1.dir2>name.ext;version
+**
+** The preamble is terminated by one of ':', ']' or '>'
+** The extension is terminated by ';'
+**----------------------------------------------------------------------------
+*/
+# define MAX_PATH 255
+# define MAX_PREAMBLE 255
+# define MAX_NAME 39
+# define MAX_EXT 39
+# define MAX_POSTAMBLE 5
+
+# define PREAMBLE_END ":>]"
+# define EXTENSION_BEGIN '.'
+# define POSTAMBLE_BEGIN ";"
+# define UPPERCASE_FILESYSTEM TRUE
+
+# define LEGAL_FILESPEC_CHARS \
+ "$-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890"
+# define REPLACEMENT_FILESPEC_CHAR '_'
+
+/*
+**----------------------------------------------------------------------------
+** FILE FORMATS
+**
+** VAX/VMS has a record/block oriented stream file system and supports all of
+** the different file formats. The default format for text files is variable
+** length records and for binary files, fixed length records.
+**----------------------------------------------------------------------------
+*/
+# define SUPPORT_FIXED_FMT TRUE
+# define SUPPORT_STREAM_FMT TRUE
+# define SUPPORT_VARIABLE_FMT TRUE
+
+# define TEXT_LINE_OVERHEAD 1
+
+# define DEF_MODE MODE_BINARY
+# define DEF_TEXT_FMT FMT_VARIABLE
+# define DEF_BINARY_FMT FMT_FIXED
+
+# define MIN_VARIABLE_RECORD_LEN 0L
+# define MAX_VARIABLE_RECORD_LEN 32765L
+# define DEF_VARIABLE_RECORD_LEN 0L
+
+# define MIN_FIXED_RECORD_LEN 2
+# define MAX_FIXED_RECORD_LEN 32767L
+# define DEF_FIXED_RECORD_LEN 512L
+
+# define DEF_TEXT_PADCHAR ' '
+# define DEF_BINARY_PADCHAR '\0'
+
+#endif /* (OS_VAXVMS) */
+
+
+
+/*
+**============================================================================
+** OS_VMCMS
+**
+** IBM's VM/CMS operating system for their S/370 and S/390 series of
+** computers. The versions of VM/CMS and compilers supported
+** are:
+**
+** VM/CMS version ?
+**
+** Waterloo C version ?
+**
+**
+**============================================================================
+*/
+#if (OS_VMCMS)
+
+/*
+**----------------------------------------------------------------------------
+** GENERAL DEFINITIONS
+**
+** The VM/CMS C compiler supports most of the ANSI standard.
+**----------------------------------------------------------------------------
+*/
+# define VV_OPERATING_SYSTEM "VM/CMS"
+# define VV_IMPLEMENTATION "VM/CMS C"
+# define ANSI_SYNTAX TRUE
+
+/*-
+**----------------------------------------------------------------------------
+** INCLUDE FILES
+**----------------------------------------------------------------------------
+*/
+# include <stddef.h>
+# include <stdlib.h>
+# include <string.h>
+# include <errno.h>
+# include <ctype.h>
+# include <time.h>
+# include <types.h>
+
+/*
+**----------------------------------------------------------------------------
+** COMMAND LINE INTERFACE
+**
+** VM/CMS qualifiers are usually introduced with a '(' and values separated
+** with a ':'. A typical command line would be:
+**
+** program (qualifier) file1 (qual:VALUE) file2
+**
+** The VM/CMS system utilities for command line parsing are used by VVCODE.
+** These definitions are used mainly for printing help and error messages.
+**----------------------------------------------------------------------------
+*/
+# define QUAL_INTRO "("
+# define QUAL_SEP "=:"
+# define OPTIONAL_QUALIFIER_VALUES TRUE
+# define STICKY_DEFAULTS TRUE
+# define STDOUT_OUTPUT FALSE
+# define SUPPORT_PIPING FALSE
+# define STDIO_SYMBOL "-"
+
+/*
+**----------------------------------------------------------------------------
+** FILE SPECIFICATION PARSING
+**
+** The general VM/CMS file specification has three components in the form:
+**
+** filename filetype filemode
+**
+** which is often supported by C compilers as
+**
+** filename.filetype.filemode
+**
+** The name and extension components are terminated by ' '.
+**----------------------------------------------------------------------------
+*/
+# define MAX_PATH 19
+# define MAX_PREAMBLE 0
+# define MAX_NAME 8
+# define MAX_EXT 9
+# define MAX_POSTAMBLE 3
+
+# define PREAMBLE_END ""
+# define EXTENSION_BEGIN ' '
+# define POSTAMBLE_BEGIN " "
+# define UPPERCASE_FILESYSTEM FALSE
+
+# define LEGAL_FILESPEC_CHARS \
+ "-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890"
+# define REPLACEMENT_FILESPEC_CHAR 'X'
+
+/*
+**----------------------------------------------------------------------------
+** FILE OPENING
+**
+** VM/CMS has a record/block oriented stream file system and supports
+** variable length and fixed format files. The default format for text files
+** is variable length records and for binary files, fixed length records.
+**----------------------------------------------------------------------------
+*/
+# define SUPPORT_FIXED_FMT FALSE
+# define SUPPORT_STREAM_FMT TRUE
+# define SUPPORT_VARIABLE_FMT TRUE
+
+# define TEXT_LINE_OVERHEAD 1
+
+# define DEF_MODE MODE_BINARY
+# define DEF_TEXT_FMT FMT_VARIABLE
+# define DEF_BINARY_FMT FMT_FIXED
+
+# define MIN_VARIABLE_RECORD_LEN 0L
+# define MAX_VARIABLE_RECORD_LEN 65535L
+# define DEF_VARIABLE_RECORD_LEN 0L
+
+# define MIN_FIXED_RECORD_LEN 2L
+# define MAX_FIXED_RECORD_LEN 32760L
+# define DEF_FIXED_RECORD_LEN 512L
+
+# define DEF_TEXT_PADCHAR ' '
+# define DEF_BINARY_PADCHAR '\0'
+
+#endif /* (OS_VMCMS) */
+
+
diff --git a/support/vvcode/ms-bcc.mak b/support/vvcode/ms-bcc.mak
new file mode 100644
index 0000000000..4400550fb8
--- /dev/null
+++ b/support/vvcode/ms-bcc.mak
@@ -0,0 +1,160 @@
+##############################################################################
+##############################################################################
+##
+## ARCHIVE HEADER INFORMATION
+##
+## @Make-file{
+## FILENAME = "ms-bcc.mak",
+## VERSION = "1.00",
+## DATE = "",
+## TIME = "",
+##
+## AUTHOR = "Niel Kempson",
+## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+## TELEPHONE = "+44-242 579105",
+## EMAIL = "kempson@tex.ac.uk (Internet)",
+##
+## SUPPORTED = "yes",
+## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+## KEYWORDS = "VVcode",
+##
+## CODETABLE = "ISO/ASCII",
+## CHECKSUM = "51492 1481 5732 57976",
+##
+## DOCSTRING = { This file is part of VVcode.
+## }
+## }
+##
+## MODULE CONTENTS
+##
+## [tbs]
+##
+## COPYRIGHT
+##
+## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the terms of the GNU General Public License as
+## published by the Free Software Foundation; either version 1, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+##
+## In other words, you are welcome to use, share and improve this
+## program. You are forbidden to forbid anyone else to use, share
+## and improve what you give them. Help stamp out software-hoarding!
+##
+## CHANGE LOG
+##
+##############################################################################
+##############################################################################
+
+##############################################################################
+#
+# Local definitions for file types and compilation / linking.
+#
+# If your MS-DOS compiler is already supported it should not be necessary to
+# modify any part of the Makefile except the local definitions below. Here
+# are some examples known to work for my MS-DOS C compilers.
+#
+# Borland Turbo C v1.5, v2.0
+#
+# CC = TCC
+# LINK = TCC
+# CCMODEL = -ms
+# CCDEFINES =
+# CFLAGS = $(CCMODEL) $(CCDEFINES) -c -w -y -v -O- -G- -N
+# LFLAGS = $(CCMODEL) -v -y
+#
+# Borland C++ v1.0, v2.0, v3.0
+#
+# CC = BCC
+# LINK = BCC
+# CCMODEL = -ms
+# CCDEFINES =
+# CFLAGS = $(CCMODEL) $(CCDEFINES) -c -w -y -v -O- -G- -N
+# LFLAGS = $(CCMODEL) -v -y
+#
+# Microsoft C v5.1, v6.0
+#
+# CC = CL
+# LINK = CL
+# CCMODEL = /AS
+# CCDEFINES =
+# CFLAGS = $(CCMODEL) $(CCDEFINES) /c /W3 /Zd /Zi /Od
+# LFLAGS = $(CCMODEL)
+#
+##############################################################################
+# Start of local definitions.
+##############################################################################
+CC = BCC
+LINK = BCC
+CCMODEL = -ms
+CCDEFINES =
+CFLAGS = $(CCMODEL) $(CCDEFINES) -c -w -y -v -O- -G- -N
+LFLAGS = $(CCMODEL) -v -y
+##############################################################################
+# End of local definitions.
+##############################################################################
+
+
+##############################################################################
+# File types and default rule for compilation
+##############################################################################
+EXE = .exe
+OBJ = .obj
+
+.SUFFIXES: .c .h $(OBJ) $(EXE)
+
+.c.obj:
+ $(CC) $(CFLAGS) $*.c
+
+##############################################################################
+# Target Groupings
+##############################################################################
+HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h
+
+OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \
+ vvutils$(OBJ) msdos$(OBJ)
+
+EXEFILES = vvencode$(EXE) vvdecode$(EXE)
+
+##############################################################################
+# Top level targets
+##############################################################################
+vvcode: $(EXEFILES)
+ @ echo VVcode built
+
+clean:
+ - del *$(OBJ)
+ - del *$(EXE)
+
+##############################################################################
+# Dependencies for executables
+##############################################################################
+vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) msdos$(OBJ)
+ $(LINK) $(LFLAGS) vvencode$(OBJ) vvutils$(OBJ) msdos$(OBJ)
+
+vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) msdos$(OBJ)
+ $(LINK) $(LFLAGS) vvdecode$(OBJ) vveparse$(OBJ) \
+ vvutils$(OBJ) msdos$(OBJ)
+
+#-----------------------------------------------------------------------------
+# Dependencies for object files
+#-----------------------------------------------------------------------------
+vvencode$(OBJ): vvencode.c $(HDRFILES)
+
+vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h
+
+vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h
+
+vvutils$(OBJ): vvutils.c $(HDRFILES)
+
+msdos$(OBJ): msdos.c $(HDRFILES)
diff --git a/support/vvcode/ms-msc.mak b/support/vvcode/ms-msc.mak
new file mode 100644
index 0000000000..5fe5b5067b
--- /dev/null
+++ b/support/vvcode/ms-msc.mak
@@ -0,0 +1,160 @@
+##############################################################################
+##############################################################################
+##
+## ARCHIVE HEADER INFORMATION
+##
+## @Make-file{
+## FILENAME = "ms-msc.mak",
+## VERSION = "1.00",
+## DATE = "",
+## TIME = "",
+##
+## AUTHOR = "Niel Kempson",
+## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+## TELEPHONE = "+44-242 579105",
+## EMAIL = "kempson@tex.ac.uk (Internet)",
+##
+## SUPPORTED = "yes",
+## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+## KEYWORDS = "VVcode",
+##
+## CODETABLE = "ISO/ASCII",
+## CHECKSUM = "51492 1481 5732 57976",
+##
+## DOCSTRING = { This file is part of VVcode.
+## }
+## }
+##
+## MODULE CONTENTS
+##
+## [tbs]
+##
+## COPYRIGHT
+##
+## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the terms of the GNU General Public License as
+## published by the Free Software Foundation; either version 1, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+##
+## In other words, you are welcome to use, share and improve this
+## program. You are forbidden to forbid anyone else to use, share
+## and improve what you give them. Help stamp out software-hoarding!
+##
+## CHANGE LOG
+##
+##############################################################################
+##############################################################################
+
+##############################################################################
+#
+# Local definitions for file types and compilation / linking.
+#
+# If your MS-DOS compiler is already supported it should not be necessary to
+# modify any part of the Makefile except the local definitions below. Here
+# are some examples known to work for my MS-DOS C compilers.
+#
+# Borland Turbo C v1.5, v2.0
+#
+# CC = TCC
+# LINK = TCC
+# CCMODEL = -ms
+# CCDEFINES =
+# CFLAGS = $(CCMODEL) $(CCDEFINES) -c -w -y -v -O- -G- -N
+# LFLAGS = $(CCMODEL) -v -y
+#
+# Borland C++ v1.0, v2.0, v3.0
+#
+# CC = BCC
+# LINK = BCC
+# CCMODEL = -ms
+# CCDEFINES =
+# CFLAGS = $(CCMODEL) $(CCDEFINES) -c -w -y -v -O- -G- -N
+# LFLAGS = $(CCMODEL) -v -y
+#
+# Microsoft C v5.1, v6.0
+#
+# CC = CL
+# LINK = CL
+# CCMODEL = /AS
+# CCDEFINES =
+# CFLAGS = $(CCMODEL) $(CCDEFINES) /c /W3 /Zd /Zi /Od
+# LFLAGS = $(CCMODEL)
+#
+##############################################################################
+# Start of local definitions.
+##############################################################################
+CC = CL
+LINK = CL
+CCMODEL = /AS
+CCDEFINES =
+CFLAGS = $(CCMODEL) $(CCDEFINES) /c /W3 /Zd /Zi /Od
+LFLAGS = $(CCMODEL)
+##############################################################################
+# End of local definitions.
+##############################################################################
+
+
+##############################################################################
+# File types and default rule for compilation
+##############################################################################
+EXE = .exe
+OBJ = .obj
+
+.SUFFIXES: .c .h $(OBJ) $(EXE)
+
+.c.obj:
+ $(CC) $(CFLAGS) $*.c
+
+##############################################################################
+# Target Groupings
+##############################################################################
+HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h
+
+OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \
+ vvutils$(OBJ) msdos$(OBJ)
+
+EXEFILES = vvencode$(EXE) vvdecode$(EXE)
+
+##############################################################################
+# Top level targets
+##############################################################################
+vvcode: $(EXEFILES)
+ @ echo VVcode built
+
+clean:
+ - del *$(OBJ)
+ - del *$(EXE)
+
+##############################################################################
+# Dependencies for executables
+##############################################################################
+vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) msdos$(OBJ)
+ $(LINK) $(LFLAGS) vvencode$(OBJ) vvutils$(OBJ) msdos$(OBJ)
+
+vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) msdos$(OBJ)
+ $(LINK) $(LFLAGS) vvdecode$(OBJ) vveparse$(OBJ) \
+ vvutils$(OBJ) msdos$(OBJ)
+
+#-----------------------------------------------------------------------------
+# Dependencies for object files
+#-----------------------------------------------------------------------------
+vvencode$(OBJ): vvencode.c $(HDRFILES)
+
+vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h
+
+vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h
+
+vvutils$(OBJ): vvutils.c $(HDRFILES)
+
+msdos$(OBJ): msdos.c $(HDRFILES)
diff --git a/support/vvcode/msdos.c b/support/vvcode/msdos.c
new file mode 100644
index 0000000000..15e4eff679
--- /dev/null
+++ b/support/vvcode/msdos.c
@@ -0,0 +1,1883 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "msdos.c",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet)",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+** MODULE CONTENTS
+**
+** apply_defaults - Apply default file name and extension to a
+** full file specification if either of these
+** components is missing.
+** confirm_yesno - Display a message to the user and wait for a
+** yes/no answer.
+** examine_file - Examine a file and determine its key features,
+** including mode, format, record length and
+** timestamp.
+** explain_error - Explain the reason for an error.
+** f_open_in - Open a file for input using the appropriate
+** mode, format etc for the file.
+** f_open_out - Open a file for output using the appropriate
+** mode, format etc for the file.
+** file_exists - Determine whether a file exists.
+** force_file_ext - Force the file extension of a full file
+** specification to a specified value.
+** is_a_file - Determine whether a file stream is connected
+** to a real file rather than a character
+** device, pipe etc.
+** legal_filespec - Takes an arbitrary string which may a file
+** specification from another operating system
+** and manipulates it to produce a legal file
+** specification for the current operating
+** system.
+** make_filespec - Construct a full file specification from
+** component parts.
+** prompt_for_string - Present a prompt string and accept a string
+** from the user.
+** read_bytes - Read bytes from a currently open file.
+** read_line - Read a line from a currently open (text) file.
+** read_record - Read a record from a currently open file.
+** scan_cmd_line - [tbs]
+** set_ftime - Set the timestamp of a file to a specified
+** value.
+** set_pipe_mode - Set the mode of a file stream connected to a
+** pipe, character device, redirected
+** stdin/stdout/stderr, in fact any non-file.
+** split_file_spec - Split a full file specification into its
+** component parts.
+** tz_offset - Determine the offset of local time from
+** Greenwich Mean Time (Coordinated Universal
+** Time) at a specified date and time.
+** user_message - Present a message to the user.
+** vv_exit - Exit the program, returning the appropriate
+** status to the operating system.
+** write_bytes - Write bytes to a currently open file.
+** write_record - Write a record to a currently open file.
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+static char rcsid[] = "$Id$";
+
+/*-
+**----------------------------------------------------------------------------
+** Standard include files
+**----------------------------------------------------------------------------
+*/
+#include <stdio.h>
+
+/*-
+**----------------------------------------------------------------------------
+** Include files
+**----------------------------------------------------------------------------
+*/
+#include "checkos.h"
+#include "machine.h"
+#include "local.h"
+#include "globals.h"
+#include "specific.h"
+#include "vvutils.h"
+
+/*-
+**----------------------------------------------------------------------------
+** Implementation (compiler) specific include files
+**----------------------------------------------------------------------------
+*/
+#if (MSDOS_TURBOC)
+#include <fcntl.h>
+#include <io.h>
+#endif /* (MSDOS_TURBOC) */
+
+#if (MSDOS_MSC)
+#include <fcntl.h>
+#include <io.h>
+#include <sys/utime.h>
+#endif /* (MSDOS_MSC) */
+
+/*-
+**----------------------------------------------------------------------------
+** Implementation (compiler) specific functions and variables
+**----------------------------------------------------------------------------
+*/
+#if (MSDOS_TURBOC)
+ static int TC_utime ARGS ((char *path, TIME_T file_time));
+#endif /* (MSDOS_TURBOC) */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** apply_defaults
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void apply_defaults (CONST char *default_name,
+ CONST char *default_ext,
+ char *full_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void apply_defaults (default_name, default_ext,
+ full_spec)
+ CONST char *default_name;
+ CONST char *default_ext;
+ char *full_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char name[MAX_NAME + 1];
+ char extension[MAX_EXT + 1];
+ Unsigned16 path_parts;
+ char preamble[MAX_PREAMBLE + 1];
+
+ path_parts = split_file_spec (full_spec, preamble, name, extension, NULL);
+
+
+ if (((path_parts & FS_NAME) == 0) && (default_name != NULL))
+ {
+ strncpy (name, default_name, MAX_NAME);
+ }
+
+ if (((path_parts & FS_EXTENSION) == 0) && (default_ext != NULL))
+ {
+ strncpy (extension, default_ext, MAX_EXT);
+ }
+
+ make_file_spec (preamble, name, extension, NULL, full_spec);
+} /* apply_defaults */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** confirm_yesno
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean confirm_yesno (CONST char *confirm_str)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean confirm_yesno (confirm_str)
+ CONST char *confirm_str;
+#endif /* (ANSI_SYNTAX) */
+{
+ int answer;
+
+ FPRINTF (stderr, "\n%s [Y/N]: ", confirm_str);
+ fflush (stderr);
+
+ do
+ {
+ answer = getchar ();
+
+ if (answer == EOF)
+ {
+ ERRORMSG ("EOF detected on standard input");
+ answer = 'N';
+ }
+ else
+ {
+ answer = TOUPPER (answer);
+ }
+ } while (!((answer == 'N') || (answer == 'Y')));
+
+ return ((answer == 'Y') ? (Boolean) TRUE : (Boolean) FALSE);
+} /* confirm_yesno */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** examine_file
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#define EX_SAMPLE_SIZE 512
+
+#if (ANSI_SYNTAX)
+ void examine_file (File_Info *ex_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void examine_file (ex_file)
+ File_Info *ex_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmp_buffer[EX_SAMPLE_SIZE];
+ SIZE_T bytes_read;
+ SIZE_T bc;
+ SIZE_T eol_count;
+ int i;
+ struct stat stat_buffer;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Initialize the File_Info structure before starting work. If the input
+ ** file is not a real file (i.e. a device or pipe), these are the values
+ ** that will be returned.
+ **------------------------------------------------------------------------
+ */
+ ex_file->mode = INV_MODE;
+ ex_file->format = INV_FORMAT;
+ ex_file->max_rec_len = INV_RECORD_LEN;
+ ex_file->lng_rec_len = INV_RECORD_LEN;
+ ex_file->mod_time = INV_TIMESTAMP;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ ex_file->file_ptr = fopen (ex_file->file_spec, "rb");
+
+ if (ex_file->file_ptr == (FILE *) NULL)
+ {
+ ERRORMSG_1 ("couldn't examine (open) file `%s'", ex_file->file_spec);
+ explain_error ();
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Test to see if the file is 'real'.
+ **------------------------------------------------------------------------
+ */
+ if (is_a_file (ex_file) == FALSE)
+ {
+ DEBUG_1 ("examine_file: `%s' is not a regular file",
+ ex_file->file_spec);
+ f_close (ex_file);
+ ex_file->pipe_flag = TRUE;
+ ex_file->file_ptr = (FILE *) NULL;
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ bytes_read = fread (tmp_buffer, sizeof (char), EX_SAMPLE_SIZE,
+ ex_file->file_ptr);
+ eol_count = 0;
+
+ for (bc = 0; bc < (bytes_read - 1); bc++)
+ {
+ if ((tmp_buffer[bc] == '\r') && (tmp_buffer[bc + 1] == '\n'))
+ {
+ ++eol_count;
+ }
+ }
+ f_close (ex_file);
+ ex_file->file_ptr = (FILE *) NULL;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (bytes_read > (80U * eol_count))
+ {
+ ex_file->mode = MODE_BINARY;
+ ex_file->format = DEF_BINARY_FMT;
+ }
+ else
+ {
+ ex_file->mode = MODE_TEXT;
+ ex_file->format = DEF_TEXT_FMT;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ i = stat (ex_file->file_spec, &stat_buffer);
+
+ if (i != FALSE)
+ {
+ ERRORMSG_1 ("couldn't examine (stat) file `%s'", ex_file->file_spec);
+ explain_error ();
+ return;
+ }
+ ex_file->mod_time = stat_buffer.st_mtime;
+
+} /* examine_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** explain_error
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void explain_error (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void explain_error ()
+#endif /* (ANSI_SYNTAX) */
+{
+ INFOMSG_1 ("reason for error: %s", strerror (errno));
+} /* explain_error */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** f_open_in
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ FILE *f_open_in (File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ FILE *f_open_in (ip_file)
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ FILE *file_ptr;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ switch (ip_file->mode)
+ {
+ case MODE_BINARY:
+ file_ptr = fopen (ip_file->file_spec, "rb");
+ break;
+ case MODE_TEXT:
+ file_ptr = fopen (ip_file->file_spec, "rt");
+ break;
+ default:
+ ERRORMSG_1 ("invalid file mode specified (%d)", ip_file->mode);
+ return ((FILE *) NULL);
+ }
+
+ if (file_ptr == (FILE *) NULL)
+ {
+ ERRORMSG_1 ("error opening file `%s' for input", ip_file->file_spec);
+ explain_error ();
+ return ((FILE *) NULL);
+ }
+ return (file_ptr);
+} /* f_open_in */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** f_open_out
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ FILE *f_open_out (CONST Int16 overwrite_files,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ FILE *f_open_out (overwrite_files, op_file)
+ CONST Int16 overwrite_files;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ FILE *file_ptr;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((overwrite_files != OVERWRITE_YES)
+ && (file_exists (op_file->file_spec)))
+ {
+ if (overwrite_files == OVERWRITE_ASK)
+ {
+ SPRINTF (G_tmp_msg, "File `%s' exists. Overwrite ?",
+ op_file->file_spec);
+
+ if (!confirm_yesno (G_tmp_msg))
+ {
+ INFOMSG ("operation cancelled");
+ return ((FILE *) NULL);
+ }
+ }
+ else
+ {
+ ERRORMSG_1 ("file `%s' exists", op_file->file_spec);
+ return ((FILE *) NULL);
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ switch (op_file->mode)
+ {
+ case MODE_BINARY:
+ file_ptr = fopen (op_file->file_spec, "wb");
+ break;
+ case MODE_TEXT:
+ file_ptr = fopen (op_file->file_spec, "wt");
+ break;
+ default:
+ ERRORMSG_1 ("invalid file mode specified (%d)", op_file->mode);
+ return ((FILE *) NULL);
+ }
+
+ if (file_ptr == (FILE *) NULL)
+ {
+ ERRORMSG_1 ("error opening file `%s' for output", op_file->file_spec);
+ explain_error ();
+ return ((FILE *) NULL);
+ }
+ return (file_ptr);
+} /* f_open_out */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** file_exists
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean file_exists (CONST char *file_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean file_exists (file_spec)
+ CONST char *file_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+
+#if (MSDOS_TURBOC)
+ return ((Boolean) (access (file_spec, 0) == 0));
+#endif /* (MSDOS_TURBOC) */
+
+#if (MSDOS_MSC)
+ return ((Boolean) (access ((char *) file_spec, 0) == 0));
+#endif /* (MSDOS_MSC) */
+
+} /* file_exists */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** force_file_ext
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void force_file_ext (CONST char *forced_ext,
+ char *full_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void force_file_ext (forced_ext, full_spec)
+ CONST char *forced_ext;
+ char *full_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char name[MAX_NAME + 1];
+ char preamble[MAX_PREAMBLE + 1];
+
+ if (forced_ext == NULL)
+ {
+ return;
+ }
+ (void) split_file_spec (full_spec, preamble, name, NULL, NULL);
+ make_file_spec (preamble, name, forced_ext, NULL, full_spec);
+} /* force_file_ext */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** is_a_file
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean is_a_file (CONST File_Info *ex_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean is_a_file (ex_file)
+ CONST File_Info *ex_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int file_handle;
+ int status;
+
+ file_handle = fileno (ex_file->file_ptr);
+ status = isatty (file_handle);
+
+ if (status == 0)
+ {
+ return (TRUE);
+ }
+ else
+ {
+ return (FALSE);
+ }
+} /* is_a_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** legal_filespec
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *legal_filespec (CONST char *hdrf_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ char *legal_filespec (hdrf_spec)
+ CONST char *hdrf_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmpf_name[MAX_NAME + 1];
+ char tmpf_ext[MAX_EXT + 1];
+ char *tmpf_spec;
+ char *tmp_ptr;
+ static char opf_spec[MAX_PATH + 1];
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tmpf_spec = STRDUP (hdrf_spec);
+ tmp_ptr = STRCHR (tmpf_spec, '.');
+
+ if (tmp_ptr != NULL)
+ {
+ strncpy (tmpf_ext, tmp_ptr, MAX_EXT);
+ tmpf_ext[MAX_EXT] = '\0';
+ *tmp_ptr = '\0';
+ }
+ else
+ {
+ strcpy (tmpf_ext, "");
+ }
+ strncpy (tmpf_name, tmpf_spec, MAX_NAME);
+ tmpf_name[MAX_NAME] = '\0';
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (tmp_ptr = tmpf_name; *tmp_ptr != '\0'; tmp_ptr++)
+ {
+ if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL)
+ {
+ *tmp_ptr = REPLACEMENT_FILESPEC_CHAR;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (tmp_ptr = tmpf_ext + 1; *tmp_ptr != '\0'; tmp_ptr++)
+ {
+ if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL)
+ {
+ *tmp_ptr = REPLACEMENT_FILESPEC_CHAR;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ strcpy (opf_spec, tmpf_name);
+ strcat (opf_spec, tmpf_ext);
+
+ if (strcmp (hdrf_spec, opf_spec) != 0)
+ {
+ WARNMSG_2 ("suspicious header file spec `%s' changed to `%s'",
+ hdrf_spec, opf_spec);
+ }
+ return (opf_spec);
+} /* legal_filespec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** make_file_spec
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void make_file_spec (CONST char *preamble,
+ CONST char *name,
+ CONST char *extension,
+ CONST char *postamble,
+ char *full_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void make_file_spec (preamble, name, extension,
+ postamble, full_spec)
+ CONST char *preamble;
+ CONST char *name;
+ CONST char *extension;
+ CONST char *postamble;
+ char *full_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ int len;
+ char *tmp_ptr;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Start with an empty string and append components of the file
+ ** specification only if they exist.
+ **------------------------------------------------------------------------
+ */
+ strcpy (full_spec, "");
+
+ /*-
+ **------------------------------------------------------------------------
+ ** The preamble component corresponds to the MS-DOS drive and/or path
+ ** components in the form:
+ **
+ ** D: dir1 \dir1 \dir1\dir2 \dir1\dir2\
+ ** D:\ D:dir1 D:\dir1 D:\dir1\dir2\ D:\dir1\dir2\
+ **
+ ** If the preamble component does not end in '\' or ':', '\' is appended
+ ** only if the component is not empty.
+ **------------------------------------------------------------------------
+ */
+ if ((preamble != NULL) && (*preamble != '\0'))
+ {
+ strncat (full_spec, preamble, MAX_PREAMBLE);
+ len = strlen (preamble);
+ tmp_ptr = STRCHR ("\\:", preamble[len - 1]);
+
+ if ((tmp_ptr == NULL) && (len < MAX_PREAMBLE))
+ {
+ strcat (full_spec, "\\");
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Simply append the name if it is present.
+ **------------------------------------------------------------------------
+ */
+ if (name != NULL)
+ {
+ strncat (full_spec, name, MAX_NAME);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the extension component does not begin with '.', prepend '.' before
+ ** appending the extension to the file specification.
+ **------------------------------------------------------------------------
+ */
+ if ((extension != NULL) && (*extension != '\0'))
+ {
+ if (*extension != '.')
+ {
+ strcat (full_spec, ".");
+ strncat (full_spec, extension, MAX_EXT - 1);
+ }
+ else
+ {
+ strncat (full_spec, extension, MAX_EXT);
+ }
+ }
+} /* make_file_spec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** prompt_for_string
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void prompt_for_string (CONST char *confirm_str,
+ CONST Int16 buf_size,
+ char *return_buffer)
+#else /* NOT (ANSI_SYNTAX) */
+ void prompt_for_string (confirm_str, buf_size,
+ return_buffer)
+ CONST char *confirm_str;
+ CONST Int16 buf_size;
+ char *return_buffer;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *status;
+
+ FPRINTF (stderr, "\n%s", confirm_str);
+ fflush (stderr);
+ status = fgets (return_buffer, (int) buf_size, stdin);
+
+ if (status == NULL)
+ {
+ FATALMSG ("error reading string from stdin");
+ explain_error ();
+ vv_exit ();
+ }
+
+ status = STRCHR (return_buffer, '\n');
+ if (status != NULL)
+ {
+ *status = '\0';
+ }
+} /* prompt_for_string */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_bytes
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 read_bytes (CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 read_bytes (max_bytes, buffer, ip_file)
+ CONST Int32 max_bytes;
+ char *buffer;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 idx;
+ int temp;
+
+ for (idx = 0L; idx < max_bytes; idx++)
+ {
+ temp = fgetc (ip_file->file_ptr);
+
+ if (temp == EOF)
+ {
+ if (ferror (ip_file->file_ptr))
+ {
+ return (-2L);
+ }
+
+ if (idx == 0)
+ {
+ return (-1L);
+ }
+ break;
+ }
+ buffer[(SIZE_T) idx] = (char) temp;
+ }
+ return (idx);
+} /* read_bytes */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_line
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 read_line (CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 read_line (max_bytes, buffer, ip_file)
+ CONST Int32 max_bytes;
+ char *buffer;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *tmp_ptr;
+
+ tmp_ptr = fgets (buffer, (int) max_bytes, ip_file->file_ptr);
+ buffer[(SIZE_T) (max_bytes - 1)] = '\0';
+
+ if (tmp_ptr == NULL)
+ {
+ if (ferror (ip_file->file_ptr))
+ {
+ return (-2L);
+ }
+
+ if (feof (ip_file->file_ptr))
+ {
+ return (-1L);
+ }
+ }
+ return ((Int32) strlen (buffer));
+} /* read_line */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_record
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 read_record (CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 read_record (max_bytes, buffer, ip_file)
+ CONST Int32 max_bytes;
+ char *buffer;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+
+#if SUPPORT_VARIABLE_FMT
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Below is debugging code for simulating record reading on MS-DOS.
+ ** This code should be removed before official issue!
+ **------------------------------------------------------------------------
+ */
+ Int32 bytes_read;
+
+ if (ip_file->mode == MODE_TEXT)
+ {
+ bytes_read = read_line (max_bytes, buffer, ip_file);
+ }
+ else
+ {
+ if (feof (ip_file->file_ptr))
+ {
+ return (-1L);
+ }
+ bytes_read = (Int32) fread (buffer, sizeof (char),
+ (SIZE_T) max_bytes, ip_file->file_ptr);
+
+ if (ferror (ip_file->file_ptr))
+ {
+ return (-2L);
+ }
+ }
+ return (bytes_read);
+
+#else /* NOT SUPPORT_VARIABLE_FMT */
+
+ INTERNAL_ERROR ("read_record");
+ return (-2L);
+
+#endif /* SUPPORT_VARIABLE_FMT */
+} /* read_record */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** scan_cmd_line
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void scan_cmd_line (CONST int qargc,
+ CONST char *qargv[],
+ CONST char *q_intro_str,
+ CONST char *q_sep_str,
+ Qualifier_Struct *qual_array,
+ Qualifier_Struct *qual_ipfile,
+ Qualifier_Struct *qual_opfile)
+#else /* NOT (ANSI_SYNTAX) */
+ void scan_cmd_line (qargc, qargv, q_intro_str,
+ q_sep_str, qual_array, qual_ipfile,
+ qual_opfile)
+ CONST int qargc;
+ CONST char *qargv[];
+ CONST char *q_intro_str;
+ CONST char *q_sep_str;
+ Qualifier_Struct *qual_array;
+ Qualifier_Struct *qual_ipfile;
+ Qualifier_Struct *qual_opfile;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *arg;
+ int arg_no;
+ int len;
+ int qual_found;
+ int q_no;
+ char *qsep_ptr;
+ char *qvalue_ptr;
+ char *tmp_qstr_ptr;
+
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Loop through each of the user supplied command line arguments.
+ **------------------------------------------------------------------------
+ */
+ tmp_qstr_ptr = NULL;
+
+ for (arg_no = 1; arg_no < qargc; arg_no++)
+ {
+ arg = (char *) qargv[arg_no];
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if (qual_array[CMDQ_DEBUG].present == TRUE)
+ {
+ G_debugging = TRUE;
+ }
+ DEBUG_1 ("scan_cmd_line: command line argument: `%s'", arg);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** If the first character of the argument is one of the allowable
+ ** 'q_intro_str' characters then parse it as a qualifier, unless
+ ** the argument is the 'STDIO_SYMBOL' string when it is interpreted as
+ ** the standard input or output file.
+ **--------------------------------------------------------------------
+ */
+ if (((STRCHR (q_intro_str, *arg) != NULL)
+ && STRCMP (arg, STDIO_SYMBOL) != 0))
+ {
+
+ /*-
+ **----------------------------------------------------------------
+ ** Extract the component of the qualifier string after the
+ ** 'q_intro_str' character before the 'q_sep_str' character
+ ** if it is present.
+ **----------------------------------------------------------------
+ */
+ if (tmp_qstr_ptr != NULL)
+ {
+ free (tmp_qstr_ptr);
+ }
+ tmp_qstr_ptr = STRDUP (arg + 1);
+ qsep_ptr = STRSTR (tmp_qstr_ptr, q_sep_str);
+ qvalue_ptr = NULL;
+
+ if (qsep_ptr != NULL)
+ {
+ *qsep_ptr = '\0';
+ qvalue_ptr = qsep_ptr + 1;
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ ** Search the command qualifier structure array for this
+ ** qualifier string.
+ **----------------------------------------------------------------
+ */
+ len = strlen (tmp_qstr_ptr);
+ qual_found = -1;
+
+ for (q_no = 0; qual_array[q_no].q_string != NULL; q_no++)
+ {
+ if (STRNCMPI (qual_array[q_no].q_string, tmp_qstr_ptr, len) == 0)
+ {
+
+ /*-
+ **--------------------------------------------------------
+ **
+ **--------------------------------------------------------
+ */
+ if (qual_found < 0)
+ {
+ qual_found = q_no;
+ DEBUG_1 ("scan_cmd_line: matches qualifier: `%s'",
+ qual_array[q_no].q_string);
+ }
+ else
+ {
+ USAGE_1 ("ambiguous qualifier `%s'", qargv[arg_no]);
+ }
+ }
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ ** If the qualifier string is unknown, return that status.
+ **----------------------------------------------------------------
+ */
+ if (qual_found < 0)
+ {
+ USAGE_1 ("unknown qualifier `%s'", qargv[arg_no]);
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ **
+ **----------------------------------------------------------------
+ */
+ if (qsep_ptr == NULL)
+ {
+ if (qual_array[qual_found].val_needed == VALUE_NEEDED)
+ {
+ USAGE_2 ("qualifier `%.1s%s' must take a value",
+ QUAL_INTRO, qual_array[qual_found].q_string);
+ }
+ else
+ {
+ qual_array[qual_found].present = TRUE;
+ qual_array[qual_found].value = NULL;
+ }
+ }
+ else
+ {
+ /*-
+ **------------------------------------------------------------
+ **
+ **------------------------------------------------------------
+ */
+ if (*qvalue_ptr == '\0')
+ {
+ USAGE_1 ("value missing after qualifier `%s'",
+ qargv[arg_no]);
+ }
+ else
+ if (qual_array[qual_found].val_needed == VALUE_NONE)
+ {
+ USAGE_2 ("qualifier `%.1s%s' does not take a value",
+ QUAL_INTRO, qual_array[qual_found].q_string);
+ }
+ else
+ {
+ qual_array[qual_found].value = STRDUP (qvalue_ptr);
+ qual_array[qual_found].present = TRUE;
+ DEBUG_1 ("scan_cmd_line: qualifier value: `%s'",
+ qual_array[qual_found].value);
+ continue;
+ }
+ }
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ else
+ {
+ if (qual_ipfile->present == FALSE)
+ {
+ qual_ipfile->present = TRUE;
+ qual_ipfile->value = STRDUP (qargv[arg_no]);
+ }
+ else
+ if (qual_opfile->present == FALSE)
+ {
+ qual_opfile->present = TRUE;
+ qual_opfile->value = STRDUP (qargv[arg_no]);
+ }
+ else
+ {
+ USAGE ("too many file names specified");
+ }
+ }
+ }
+} /* scan_cmd_line */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_ftime
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_ftime (File_Info *target_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_ftime (target_file)
+ File_Info *target_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int status;
+ struct tm *tms;
+
+#if (MSDOS_MSC)
+ struct utimbuf utb;
+#endif /* (MSDOS_MSC) */
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ DEBUG_2 ("set_ftime: setting file `%s' time to %.24s",
+ target_file->file_spec, ctime (&(target_file->mod_time)));
+
+ /*-
+ **------------------------------------------------------------------------
+ ** MS-DOS doesn't understand times before 1980.01.01-00:00:00 local time.
+ ** If the time is before this time, issue a warning message and rely on
+ ** utime() not to blow up when passed such a time.
+ **------------------------------------------------------------------------
+ */
+ tms = localtime (&(target_file->mod_time));
+ if (tms->tm_year < 80)
+ {
+ WARNMSG_2 ("Cannot set file `%s' time to %s", target_file->file_spec,
+ vv_timestamp (target_file->mod_time));
+ INFOMSG ("reason: MS-DOS does not support file times before 1980.");
+ WARNMSG_1 ("File `%s' time set to 1980.01.01-00:00:00 GMT",
+ target_file->file_spec);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Turbo C does not have a version of utime() so we use the TC_utime()
+ ** emulation instead.
+ **------------------------------------------------------------------------
+ */
+#if (MSDOS_MSC)
+ utb.actime = target_file->mod_time;
+ utb.modtime = target_file->mod_time;
+ status = utime (target_file->file_spec, &utb);
+#endif /* (MSDOS_MSC) */
+
+#if (MSDOS_TURBOC)
+ status = TC_utime (target_file->file_spec, target_file->mod_time);
+#endif /* (MSDOS_TURBOC) */
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (status != 0)
+ {
+ ERRORMSG_2 ("error setting file `%s' time to %.24s",
+ target_file->file_spec, ctime (&(target_file->mod_time)));
+ explain_error ();
+ }
+ return;
+
+} /* set_ftime */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_pipe_mode
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_pipe_mode (File_Info *target_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_pipe_mode (target_file)
+ File_Info *target_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int file_handle;
+ int status;
+
+ file_handle = fileno (target_file->file_ptr);
+ switch (target_file->mode)
+ {
+ case MODE_BINARY:
+ status = setmode (file_handle, (int) O_BINARY);
+ break;
+ case MODE_TEXT:
+ status = setmode (file_handle, (int) O_TEXT);
+ break;
+ default:
+ INTERNAL_ERROR ("set_pipe_mode");
+ }
+
+ if (status < 0)
+ {
+ ERRORMSG_1 ("error setting mode of file `%s'", target_file->file_spec);
+ explain_error ();
+ }
+} /* set_pipe_mode */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** split_file_spec
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Unsigned16 split_file_spec (CONST char *full_spec,
+ char *preamble,
+ char *name,
+ char *extension,
+ char *postamble)
+#else /* NOT (ANSI_SYNTAX) */
+ Unsigned16 split_file_spec (full_spec, preamble, name,
+ extension, postamble)
+ CONST char *full_spec;
+ char *preamble;
+ char *name;
+ char *extension;
+ char *postamble;
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmp_full_spec[MAX_PATH + 1];
+ char *start_ptr;
+ char *tmp_ptr;
+ int idx;
+ Unsigned16 path_components;
+
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (preamble != NULL)
+ {
+ *preamble = '\0';
+ }
+ if (name != NULL)
+ {
+ *name = '\0';
+ }
+ if (extension != NULL)
+ {
+ *extension = '\0';
+ }
+ if (postamble != NULL)
+ {
+ *postamble = '\0';
+ }
+ path_components = FS_NOTHING;
+
+ if ((full_spec == NULL) || (*full_spec == '\0'))
+ {
+ return (path_components);
+ }
+
+ strcpy (tmp_full_spec, full_spec);
+ start_ptr = (char *) tmp_full_spec;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tmp_ptr = STRRSTR (start_ptr, ":\\");
+
+ if (tmp_ptr != NULL)
+ {
+ path_components |= FS_PREAMBLE;
+
+ if (preamble != NULL)
+ {
+ for (idx = 0; ((idx < MAX_PREAMBLE) && (start_ptr <= tmp_ptr));
+ idx++)
+ {
+ *preamble++ = *start_ptr++;
+ }
+ *preamble = '\0';
+ }
+ start_ptr = ++tmp_ptr;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tmp_ptr = STRCHR (start_ptr, '.');
+ if (tmp_ptr != NULL)
+ {
+ path_components |= FS_EXTENSION;
+
+ if (extension != NULL)
+ {
+ strncpy (extension, tmp_ptr, MAX_EXT);
+ }
+ *tmp_ptr = '\0';
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (*start_ptr != '\0')
+ {
+ path_components |= FS_NAME;
+
+ if (name != NULL)
+ {
+ strncpy (name, start_ptr, MAX_NAME);
+ }
+ }
+
+ return (path_components);
+} /* split_file_spec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** tz_offset
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ TIME_T tz_offset (TIME_T the_time)
+#else /* NOT (ANSI_SYNTAX) */
+ TIME_T tz_offset (the_time)
+ TIME_T the_time;
+#endif /* (ANSI_SYNTAX) */
+{
+ struct tm *tm;
+ char *tz_str;
+ char set_tz_str[32];
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tz_str = getenv ("TZ");
+
+ if (tz_str == NULL)
+ {
+ strcpy (set_tz_str, "TZ=");
+ strcat (set_tz_str, VV_TIMEZONE);
+ putenv (set_tz_str);
+ }
+ tzset ();
+ tm = localtime (&the_time);
+
+ if (tm->tm_isdst > 0)
+ {
+ return (timezone - (TIME_T) 3600);
+ }
+ else
+ {
+ return (timezone);
+ }
+} /* tz_offset */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** user_message
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void user_message (CONST Int16 status,
+ CONST char *msg_str,
+ File_Info *log_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void user_message (status, msg_str, log_file)
+ CONST Int16 status;
+ CONST char *msg_str;
+ File_Info *log_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int to_stderr;
+ int to_logfile;
+ char *status_str;
+
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Check the value supplied for the message status and set the output
+ ** destinations accordingly.
+ **------------------------------------------------------------------------
+ */
+ to_logfile = TRUE;
+ to_stderr = FALSE;
+
+ switch (status)
+ {
+ case LOG_STATUS:
+ case NORMAL_STATUS:
+ status_str = "";
+ break;
+ case INFO_STATUS:
+ status_str = " -- ";
+ to_stderr = TRUE;
+ break;
+ case WARNING_STATUS:
+ status_str = "\nWARNING: ";
+ to_stderr = TRUE;
+ break;
+ case ERROR_STATUS:
+ status_str = "\nERROR: ";
+ to_stderr = TRUE;
+ break;
+ case FATAL_STATUS:
+ status_str = "\nFATAL: ";
+ to_stderr = TRUE;
+ break;
+ default:
+ INTERNAL_ERROR ("user_message");
+ vv_exit ();
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is NULL, just update the status and/or the message
+ ** show status.
+ **------------------------------------------------------------------------
+ */
+ if ((msg_str == NULL) || (*msg_str == '\0'))
+ {
+ if (status > G_status)
+ {
+ G_status = status;
+ }
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Make sure that we don't try to write to a NULL log file pointer.
+ **------------------------------------------------------------------------
+ */
+ if (log_file->file_ptr == (FILE *) NULL)
+ {
+ to_logfile = FALSE;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is to be sent to the log file and stderr, check whether
+ ** the log file output is also to stderr. If it is, disable the 'stderr'
+ ** output.
+ **------------------------------------------------------------------------
+ */
+ if (to_logfile && to_stderr)
+ {
+ if (log_file->file_ptr == stderr)
+ {
+ to_stderr = FALSE;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is to be sent to stderr, output it here.
+ **------------------------------------------------------------------------
+ */
+ if (to_stderr)
+ {
+ FPRINTF (stderr, "%s%s\n", status_str, msg_str);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is to be sent to the log file, output it here. If
+ ** debugging is enabled, report also the name of the calling function.
+ **------------------------------------------------------------------------
+ */
+ if (to_logfile)
+ {
+ FPRINTF (log_file->file_ptr, "%s%s\n", status_str, msg_str);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (status > G_status)
+ {
+ G_status = status;
+ }
+} /* user_message */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vv_exit
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void vv_exit (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void vv_exit ()
+#endif /* (ANSI_SYNTAX) */
+{
+ switch (G_status)
+ {
+ case LOG_STATUS:
+ case NORMAL_STATUS:
+ exit (0);
+ break;
+ case WARNING_STATUS:
+ exit (1);
+ break;
+ case ERROR_STATUS:
+ exit (2);
+ break;
+ case FATAL_STATUS:
+ default:
+ exit (3);
+ break;
+ }
+} /* vv_exit */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** write_bytes
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void write_bytes (CONST Int32 max_bytes,
+ CONST char *buffer,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void write_bytes (max_bytes, buffer, op_file)
+ CONST Int32 max_bytes;
+ CONST char *buffer;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 idx;
+
+ for (idx = 0L; idx < max_bytes; idx++)
+ {
+ fputc (buffer[(SIZE_T) idx], op_file->file_ptr);
+ }
+} /* write_bytes */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** write_record
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void write_record (CONST Int32 max_bytes,
+ CONST char *buffer,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void write_record (max_bytes, buffer, op_file)
+ CONST Int32 max_bytes;
+ CONST char *buffer;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+
+#if SUPPORT_VARIABLE_FMT
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Below is debugging code for simulating record writing on MS-DOS.
+ ** This code should be removed before official issue!
+ **------------------------------------------------------------------------
+ */
+ Int32 no_bytes;
+
+ no_bytes = max_bytes * sizeof (char);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Check that the buffer does not exceed the maximum allowable record
+ ** length. If it does, truncate the record and issue a warning.
+ **------------------------------------------------------------------------
+ */
+ if ((op_file->max_rec_len > 0) && (no_bytes > op_file->max_rec_len))
+ {
+ ERRORMSG_2 ("output record too long (%ld bytes, max = %ld) - truncated",
+ no_bytes, op_file->max_rec_len);
+ no_bytes = op_file->max_rec_len / sizeof (char);
+ }
+ fwrite (buffer, sizeof (char), (SIZE_T) no_bytes, op_file->file_ptr);
+
+#else /* NOT SUPPORT_VARIABLE_FMT */
+
+ INTERNAL_ERROR ("write_record");
+
+#endif /* SUPPORT_VARIABLE_FMT */
+} /* write_record */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** TC_utime
+**
+** DESCRIPTION
+**
+** Set the modification time of a file. This is a crude emulation of the
+** Unix C utime() function for Turbo C which doesn't provide one
+** (Microsoft C does).
+**
+** INPUT PARAMETERS
+**
+** file_spec - the file specification of the file
+** file_time - the Unix format file modification time to be set.
+**
+** OUTPUT PARAMETERS
+**
+** None
+**
+** RETURN VALUE
+**
+** Zero if the time was set successfully, -1 otherwise.
+**
+**============================================================================
+*/
+#if (MSDOS_TURBOC)
+static int TC_utime (char *file_spec, TIME_T file_time)
+{
+ int handle;
+ int status;
+ struct ftime fts;
+ struct tm *tms;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ handle = open (file_spec, O_RDWR);
+
+ if (handle < 0)
+ {
+ ERRORMSG_1 ("error opening file `%s'", file_spec);
+ explain_error ();
+ return (-1);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tms = localtime (&file_time);
+ fts.ft_tsec = (tms->tm_sec / 2) & 0x1f;
+ fts.ft_min = (tms->tm_min) & 0x3f;
+ fts.ft_hour = (tms->tm_hour) & 0x1f;
+ fts.ft_day = (tms->tm_mday) & 0x1f;
+ fts.ft_month = (tms->tm_mon + 1) & 0x0f;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the local time is before 1980.01.01-00:00:00, reset it to that.
+ **------------------------------------------------------------------------
+ */
+ if (tms->tm_year < 80)
+ {
+ fts.ft_tsec = 0;
+ fts.ft_min = 0;
+ fts.ft_hour = 0;
+ fts.ft_day = 0;
+ fts.ft_month = 0;
+ fts.ft_year = 0;
+ }
+ else
+ {
+ fts.ft_year = (tms->tm_year - 80) & 0x7f;
+ }
+ status = setftime (handle, &fts);
+
+ if (status != 0)
+ {
+ ERRORMSG_2 ("error setting file `%s' time to %.24s",
+ file_spec, ctime (&file_time));
+ explain_error ();
+ close (handle);
+ return (-1);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ status = close (handle);
+
+ if (status < 0)
+ {
+ ERRORMSG_1 ("error closing file `%s'", file_spec);
+ return (-1);
+ }
+ return (0);
+}
+#endif /* (MSDOS_TURBOC) */
diff --git a/support/vvcode/msdos.mak b/support/vvcode/msdos.mak
new file mode 100644
index 0000000000..2168ef5609
--- /dev/null
+++ b/support/vvcode/msdos.mak
@@ -0,0 +1,160 @@
+##############################################################################
+##############################################################################
+##
+## ARCHIVE HEADER INFORMATION
+##
+## @Make-file{
+## FILENAME = "msdos.mak",
+## VERSION = "1.00",
+## DATE = "",
+## TIME = "",
+##
+## AUTHOR = "Niel Kempson",
+## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+## TELEPHONE = "+44-242 579105",
+## EMAIL = "kempson@tex.ac.uk (Internet)",
+##
+## SUPPORTED = "yes",
+## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+## KEYWORDS = "VVcode",
+##
+## CODETABLE = "ISO/ASCII",
+## CHECKSUM = "51492 1481 5732 57976",
+##
+## DOCSTRING = { This file is part of VVcode.
+## }
+## }
+##
+## MODULE CONTENTS
+##
+## [tbs]
+##
+## COPYRIGHT
+##
+## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the terms of the GNU General Public License as
+## published by the Free Software Foundation; either version 1, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+##
+## In other words, you are welcome to use, share and improve this
+## program. You are forbidden to forbid anyone else to use, share
+## and improve what you give them. Help stamp out software-hoarding!
+##
+## CHANGE LOG
+##
+##############################################################################
+##############################################################################
+
+##############################################################################
+#
+# Local definitions for file types and compilation / linking.
+#
+# If your MS-DOS compiler is already supported it should not be necessary to
+# modify any part of the Makefile except the local definitions below. Here
+# are some examples known to work for my MS-DOS C compilers.
+#
+# Borland Turbo C v1.5, v2.0
+#
+# CC = TCC
+# LINK = TCC
+# CCMODEL = -ms
+# CCDEFINES =
+# CFLAGS = $(CCMODEL) $(CCDEFINES) -c -w -y -v -O- -G- -N
+# LFLAGS = $(CCMODEL) -v -y
+#
+# Borland C++ v1.0, v2.0, v3.0
+#
+# CC = BCC
+# LINK = BCC
+# CCMODEL = -ms
+# CCDEFINES =
+# CFLAGS = $(CCMODEL) $(CCDEFINES) -c -w -y -v -O- -G- -N
+# LFLAGS = $(CCMODEL) -v -y
+#
+# Microsoft C v5.1, v6.0
+#
+# CC = CL
+# LINK = CL
+# CCMODEL = /AS
+# CCDEFINES =
+# CFLAGS = $(CCMODEL) $(CCDEFINES) /c /W3 /Zd /Zi /Od
+# LFLAGS = $(CCMODEL)
+#
+##############################################################################
+# Start of local definitions.
+##############################################################################
+CC = [to be specified]
+LINK = [to be specified]
+CCMODEL = [to be specified]
+CCDEFINES = [to be specified]
+CFLAGS = [to be specified]
+LFLAGS = [to be specified]
+##############################################################################
+# End of local definitions.
+##############################################################################
+
+
+##############################################################################
+# File types and default rule for compilation
+##############################################################################
+EXE = .exe
+OBJ = .obj
+
+.SUFFIXES: .c .h $(OBJ) $(EXE)
+
+.c.obj:
+ $(CC) $(CFLAGS) $*.c
+
+##############################################################################
+# Target Groupings
+##############################################################################
+HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h
+
+OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \
+ vvutils$(OBJ) msdos$(OBJ)
+
+EXEFILES = vvencode$(EXE) vvdecode$(EXE)
+
+##############################################################################
+# Top level targets
+##############################################################################
+vvcode: $(EXEFILES)
+ @ echo VVcode built
+
+clean:
+ - del *$(OBJ)
+ - del *$(EXE)
+
+##############################################################################
+# Dependencies for executables
+##############################################################################
+vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) msdos$(OBJ)
+ $(LINK) $(LFLAGS) vvencode$(OBJ) vvutils$(OBJ) msdos$(OBJ)
+
+vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) msdos$(OBJ)
+ $(LINK) $(LFLAGS) vvdecode$(OBJ) vveparse$(OBJ) \
+ vvutils$(OBJ) msdos$(OBJ)
+
+#-----------------------------------------------------------------------------
+# Dependencies for object files
+#-----------------------------------------------------------------------------
+vvencode$(OBJ): vvencode.c $(HDRFILES)
+
+vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h
+
+vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h
+
+vvutils$(OBJ): vvutils.c $(HDRFILES)
+
+msdos$(OBJ): msdos.c $(HDRFILES)
diff --git a/support/vvcode/os2-cset.mak b/support/vvcode/os2-cset.mak
new file mode 100644
index 0000000000..1711447af1
--- /dev/null
+++ b/support/vvcode/os2-cset.mak
@@ -0,0 +1,161 @@
+##############################################################################
+##############################################################################
+##
+## ARCHIVE HEADER INFORMATION
+##
+## @Make-file{
+## FILENAME = "os2-cset.mak",
+## VERSION = "1.00",
+## DATE = "",
+## TIME = "",
+##
+## AUTHOR = "Niel Kempson",
+## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+## TELEPHONE = "+44-242 579105",
+## EMAIL = "kempson@tex.ac.uk (Internet)",
+##
+## SUPPORTED = "yes",
+## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+## KEYWORDS = "VVcode",
+##
+## CODETABLE = "ISO/ASCII",
+## CHECKSUM = "51492 1481 5732 57976",
+##
+## DOCSTRING = { This file is part of VVcode.
+## }
+## }
+##
+## MODULE CONTENTS
+##
+## [tbs]
+##
+## COPYRIGHT
+##
+## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the terms of the GNU General Public License as
+## published by the Free Software Foundation; either version 1, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+##
+## In other words, you are welcome to use, share and improve this
+## program. You are forbidden to forbid anyone else to use, share
+## and improve what you give them. Help stamp out software-hoarding!
+##
+## CHANGE LOG
+##
+##############################################################################
+##############################################################################
+
+
+##############################################################################
+#
+# Local definitions for file types and compilation / linking.
+#
+# If your OS/2 compiler is already supported it should not be necessary to
+# modify any part of the Makefile except the local definitions below. Here
+# are some examples known to work for my OS/2 C compilers.
+#
+# EMX/GNUC v2.1
+#
+# CC = GCC
+# LINK = GCC
+# CCMODEL =
+# CCDEFINES = -DOS2
+# CFLAGS = -c -g -Wall -Wconversion $(CCDEFINES) -o $@
+# LFLAGS = -g -o $@
+#
+# IBM C Set/2 v1.00 (using migration libraries)
+#
+# CC = ICC
+# LINK = ICC
+# CCMODEL =
+# CCDEFINES =
+# CFLAGS = /C /W3 /Kb /Sm /O- /Q+ /Ti $(CCDEFINES)
+# LFLAGS = /Q+
+#
+# Microsoft C v6.0
+#
+# CC = CL
+# LINK = CL
+# CCMODEL = /AS
+# CCDEFINES =
+# CFLAGS = $(CCMODEL) /c /W4 /Zd /Zi /Od $(CCDEFINES) /Lp
+# LFLAGS = $(CCMODEL) /Lp /link /PMTYPE:VIO
+#
+##############################################################################
+# Start of local definitions.
+##############################################################################
+CC = ICC
+LINK = ICC
+CCMODEL =
+CCDEFINES =
+CFLAGS = /C /W3 /Kb /Sm /O- /Q+ /Ti $(CCDEFINES)
+LFLAGS = /Q+
+##############################################################################
+# End of local definitions.
+##############################################################################
+
+
+##############################################################################
+# File types and default rule for compilation
+##############################################################################
+EXE = .exe
+OBJ = .obj
+
+.SUFFIXES: .c .h $(OBJ) $(EXE)
+
+.c.obj:
+ $(CC) $(CFLAGS) $*.c
+
+##############################################################################
+# Target Groupings
+##############################################################################
+HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h
+
+OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \
+ vvutils$(OBJ) os2$(OBJ)
+
+EXEFILES = vvencode$(EXE) vvdecode$(EXE)
+
+##############################################################################
+# Top level targets
+##############################################################################
+vvcode: $(EXEFILES)
+ @ echo VVcode built
+
+clean:
+ - del *$(OBJ)
+ - del *$(EXE)
+
+#-----------------------------------------------------------------------------
+# Dependencies for executables
+#-----------------------------------------------------------------------------
+vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ)
+ $(LINK) vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ) $(LFLAGS)
+
+vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) os2$(OBJ)
+ $(LINK) vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) \
+ os2$(OBJ) $(LFLAGS)
+
+#-----------------------------------------------------------------------------
+# Dependencies for object files
+#-----------------------------------------------------------------------------
+vvencode$(OBJ): vvencode.c $(HDRFILES)
+
+vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h
+
+vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h
+
+vvutils$(OBJ): vvutils.c $(HDRFILES)
+
+os2$(OBJ): os2.c $(HDRFILES)
diff --git a/support/vvcode/os2-gcc.mak b/support/vvcode/os2-gcc.mak
new file mode 100644
index 0000000000..062a595a2e
--- /dev/null
+++ b/support/vvcode/os2-gcc.mak
@@ -0,0 +1,161 @@
+##############################################################################
+##############################################################################
+##
+## ARCHIVE HEADER INFORMATION
+##
+## @Make-file{
+## FILENAME = "os2-gcc.mak",
+## VERSION = "1.00",
+## DATE = "",
+## TIME = "",
+##
+## AUTHOR = "Niel Kempson",
+## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+## TELEPHONE = "+44-242 579105",
+## EMAIL = "kempson@tex.ac.uk (Internet)",
+##
+## SUPPORTED = "yes",
+## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+## KEYWORDS = "VVcode",
+##
+## CODETABLE = "ISO/ASCII",
+## CHECKSUM = "51492 1481 5732 57976",
+##
+## DOCSTRING = { This file is part of VVcode.
+## }
+## }
+##
+## MODULE CONTENTS
+##
+## [tbs]
+##
+## COPYRIGHT
+##
+## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the terms of the GNU General Public License as
+## published by the Free Software Foundation; either version 1, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+##
+## In other words, you are welcome to use, share and improve this
+## program. You are forbidden to forbid anyone else to use, share
+## and improve what you give them. Help stamp out software-hoarding!
+##
+## CHANGE LOG
+##
+##############################################################################
+##############################################################################
+
+
+##############################################################################
+#
+# Local definitions for file types and compilation / linking.
+#
+# If your OS/2 compiler is already supported it should not be necessary to
+# modify any part of the Makefile except the local definitions below. Here
+# are some examples known to work for my OS/2 C compilers.
+#
+# EMX/GNUC v2.1
+#
+# CC = GCC
+# LINK = GCC
+# CCMODEL =
+# CCDEFINES = -DOS2
+# CFLAGS = -c -g -Wall -Wconversion $(CCDEFINES) -o $@
+# LFLAGS = -g -o $@
+#
+# IBM C Set/2 v1.00 (using migration libraries)
+#
+# CC = ICC
+# LINK = ICC
+# CCMODEL =
+# CCDEFINES =
+# CFLAGS = /C /W3 /Kb /Sm /O- /Q+ /Ti $(CCDEFINES)
+# LFLAGS = /Q+
+#
+# Microsoft C v6.0
+#
+# CC = CL
+# LINK = CL
+# CCMODEL = /AS
+# CCDEFINES =
+# CFLAGS = $(CCMODEL) /c /W4 /Zd /Zi /Od $(CCDEFINES) /Lp
+# LFLAGS = $(CCMODEL) /Lp /link /PMTYPE:VIO
+#
+##############################################################################
+# Start of local definitions.
+##############################################################################
+CC = GCC
+LINK = GCC
+CCMODEL =
+CCDEFINES = -DOS2
+CFLAGS = -c -g -Wall -Wconversion $(CCDEFINES) -o $@
+LFLAGS = -g -o $@
+##############################################################################
+# End of local definitions.
+##############################################################################
+
+
+##############################################################################
+# File types and default rule for compilation
+##############################################################################
+EXE = .exe
+OBJ = .obj
+
+.SUFFIXES: .c .h $(OBJ) $(EXE)
+
+.c.obj:
+ $(CC) $(CFLAGS) $*.c
+
+##############################################################################
+# Target Groupings
+##############################################################################
+HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h
+
+OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \
+ vvutils$(OBJ) os2$(OBJ)
+
+EXEFILES = vvencode$(EXE) vvdecode$(EXE)
+
+##############################################################################
+# Top level targets
+##############################################################################
+vvcode: $(EXEFILES)
+ @ echo VVcode built
+
+clean:
+ - del *$(OBJ)
+ - del *$(EXE)
+
+#-----------------------------------------------------------------------------
+# Dependencies for executables
+#-----------------------------------------------------------------------------
+vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ)
+ $(LINK) vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ) $(LFLAGS)
+
+vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) os2$(OBJ)
+ $(LINK) vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) \
+ os2$(OBJ) $(LFLAGS)
+
+#-----------------------------------------------------------------------------
+# Dependencies for object files
+#-----------------------------------------------------------------------------
+vvencode$(OBJ): vvencode.c $(HDRFILES)
+
+vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h
+
+vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h
+
+vvutils$(OBJ): vvutils.c $(HDRFILES)
+
+os2$(OBJ): os2.c $(HDRFILES)
diff --git a/support/vvcode/os2-msc.mak b/support/vvcode/os2-msc.mak
new file mode 100644
index 0000000000..22f499ba83
--- /dev/null
+++ b/support/vvcode/os2-msc.mak
@@ -0,0 +1,161 @@
+##############################################################################
+##############################################################################
+##
+## ARCHIVE HEADER INFORMATION
+##
+## @Make-file{
+## FILENAME = "os2-msc.mak",
+## VERSION = "1.00",
+## DATE = "",
+## TIME = "",
+##
+## AUTHOR = "Niel Kempson",
+## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+## TELEPHONE = "+44-242 579105",
+## EMAIL = "kempson@tex.ac.uk (Internet)",
+##
+## SUPPORTED = "yes",
+## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+## KEYWORDS = "VVcode",
+##
+## CODETABLE = "ISO/ASCII",
+## CHECKSUM = "51492 1481 5732 57976",
+##
+## DOCSTRING = { This file is part of VVcode.
+## }
+## }
+##
+## MODULE CONTENTS
+##
+## [tbs]
+##
+## COPYRIGHT
+##
+## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the terms of the GNU General Public License as
+## published by the Free Software Foundation; either version 1, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+##
+## In other words, you are welcome to use, share and improve this
+## program. You are forbidden to forbid anyone else to use, share
+## and improve what you give them. Help stamp out software-hoarding!
+##
+## CHANGE LOG
+##
+##############################################################################
+##############################################################################
+
+
+##############################################################################
+#
+# Local definitions for file types and compilation / linking.
+#
+# If your OS/2 compiler is already supported it should not be necessary to
+# modify any part of the Makefile except the local definitions below. Here
+# are some examples known to work for my OS/2 C compilers.
+#
+# EMX/GNUC v2.1
+#
+# CC = GCC
+# LINK = GCC
+# CCMODEL =
+# CCDEFINES = -DOS2
+# CFLAGS = -c -g -Wall -Wconversion $(CCDEFINES) -o $@
+# LFLAGS = -g -o $@
+#
+# IBM C Set/2 v1.00 (using migration libraries)
+#
+# CC = ICC
+# LINK = ICC
+# CCMODEL =
+# CCDEFINES =
+# CFLAGS = /C /W3 /Kb /Sm /O- /Q+ /Ti $(CCDEFINES)
+# LFLAGS = /Q+
+#
+# Microsoft C v6.0
+#
+# CC = CL
+# LINK = CL
+# CCMODEL = /AS
+# CCDEFINES =
+# CFLAGS = $(CCMODEL) /c /W4 /Zd /Zi /Od $(CCDEFINES) /Lp
+# LFLAGS = $(CCMODEL) /Lp /link /PMTYPE:VIO
+#
+##############################################################################
+# Start of local definitions.
+##############################################################################
+CC = CL
+LINK = CL
+CCMODEL = /AS
+CCDEFINES =
+CFLAGS = $(CCMODEL) /c /W4 /Zd /Zi /Od $(CCDEFINES) /Lp
+LFLAGS = $(CCMODEL) /Lp /link /PMTYPE:VIO
+##############################################################################
+# End of local definitions.
+##############################################################################
+
+
+##############################################################################
+# File types and default rule for compilation
+##############################################################################
+EXE = .exe
+OBJ = .obj
+
+.SUFFIXES: .c .h $(OBJ) $(EXE)
+
+.c.obj:
+ $(CC) $(CFLAGS) $*.c
+
+##############################################################################
+# Target Groupings
+##############################################################################
+HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h
+
+OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \
+ vvutils$(OBJ) os2$(OBJ)
+
+EXEFILES = vvencode$(EXE) vvdecode$(EXE)
+
+##############################################################################
+# Top level targets
+##############################################################################
+vvcode: $(EXEFILES)
+ @ echo VVcode built
+
+clean:
+ - del *$(OBJ)
+ - del *$(EXE)
+
+#-----------------------------------------------------------------------------
+# Dependencies for executables
+#-----------------------------------------------------------------------------
+vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ)
+ $(LINK) vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ) $(LFLAGS)
+
+vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) os2$(OBJ)
+ $(LINK) vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) \
+ os2$(OBJ) $(LFLAGS)
+
+#-----------------------------------------------------------------------------
+# Dependencies for object files
+#-----------------------------------------------------------------------------
+vvencode$(OBJ): vvencode.c $(HDRFILES)
+
+vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h
+
+vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h
+
+vvutils$(OBJ): vvutils.c $(HDRFILES)
+
+os2$(OBJ): os2.c $(HDRFILES)
diff --git a/support/vvcode/os2.c b/support/vvcode/os2.c
new file mode 100644
index 0000000000..773730234b
--- /dev/null
+++ b/support/vvcode/os2.c
@@ -0,0 +1,1774 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "os2.c",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet)",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+** MODULE CONTENTS
+**
+** apply_defaults - Apply default file name and extension to a
+** full file specification if either of these
+** components is missing.
+** confirm_yesno - Display a message to the user and wait for a
+** yes/no answer.
+** examine_file - Examine a file and determine its key features,
+** including mode, format, record length and
+** timestamp.
+** explain_error - Explain the reason for an error.
+** f_open_in - Open a file for input using the appropriate
+** mode, format etc for the file.
+** f_open_out - Open a file for output using the appropriate
+** mode, format etc for the file.
+** file_exists - Determine whether a file exists.
+** force_file_ext - Force the file extension of a full file
+** specification to a specified value.
+** is_a_file - Determine whether a file stream is connected
+** to a real file rather than a character
+** device, pipe etc.
+** legal_filespec - Takes an arbitrary string which may a file
+** specification from another operating system
+** and manipulates it to produce a legal file
+** specification for the current operating
+** system.
+** make_filespec - Construct a full file specification from
+** component parts.
+** prompt_for_string - Present a prompt string and accept a string
+** from the user.
+** read_bytes - Read bytes from a currently open file.
+** read_line - Read a line from a currently open (text) file.
+** read_record - Read a record from a currently open file.
+** scan_cmd_line - [tbs]
+** set_ftime - Set the timestamp of a file to a specified
+** value.
+** set_pipe_mode - Set the mode of a file stream connected to a
+** pipe, character device, redirected
+** stdin/stdout/stderr, in fact any non-file.
+** split_file_spec - Split a full file specification into its
+** component parts.
+** tz_offset - Determine the offset of local time from
+** Greenwich Mean Time (Coordinated Universal
+** Time) at a specified date and time.
+** user_message - Present a message to the user.
+** vv_exit - Exit the program, returning the appropriate
+** status to the operating system.
+** write_bytes - Write bytes to a currently open file.
+** write_record - Write a record to a currently open file.
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+static char rcsid[] = "$Id$";
+
+/*-
+**----------------------------------------------------------------------------
+** Standard include files
+**----------------------------------------------------------------------------
+*/
+#include <stdio.h>
+
+/*-
+**----------------------------------------------------------------------------
+** Include files
+**----------------------------------------------------------------------------
+*/
+#include "checkos.h"
+#include "machine.h"
+#include "local.h"
+#include "globals.h"
+#include "specific.h"
+#include "vvutils.h"
+
+/*-
+**----------------------------------------------------------------------------
+** Implementation (compiler) specific include files
+**----------------------------------------------------------------------------
+*/
+#if (OS2_GNUC)
+# include <io.h>
+# include <sys/fcntl.h>
+# include <sys/utime.h>
+# include <sys/timeb.h>
+#endif /* (OS2_GNUC) */
+
+#if (OS2_CSET)
+# include <io.h>
+# include <fcntl.h>
+# include <sys/utime.h>
+#endif /* (OS2_CSET) */
+
+#if (OS2_MSC)
+# include <io.h>
+# include <fcntl.h>
+# include <sys/utime.h>
+#endif /* (OS2_MSC) */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** apply_defaults
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void apply_defaults (CONST char *default_name,
+ CONST char *default_ext,
+ char *full_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void apply_defaults (default_name, default_ext,
+ full_spec)
+ CONST char *default_name;
+ CONST char *default_ext;
+ char *full_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char name[MAX_NAME + 1];
+ char extension[MAX_EXT + 1];
+ Unsigned16 path_parts;
+ char preamble[MAX_PREAMBLE + 1];
+
+ path_parts = split_file_spec (full_spec, preamble, name, extension, NULL);
+
+
+ if (((path_parts & FS_NAME) == 0) && (default_name != NULL))
+ {
+ strncpy (name, default_name, MAX_NAME);
+ }
+
+ if (((path_parts & FS_EXTENSION) == 0) && (default_ext != NULL))
+ {
+ strncpy (extension, default_ext, MAX_EXT);
+ }
+
+ make_file_spec (preamble, name, extension, NULL, full_spec);
+} /* apply_defaults */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** confirm_yesno
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean confirm_yesno (CONST char *confirm_str)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean confirm_yesno (confirm_str)
+ CONST char *confirm_str;
+#endif /* (ANSI_SYNTAX) */
+{
+ int answer;
+
+ FPRINTF (stderr, "\n%s [Y/N]: ", confirm_str);
+ fflush (stderr);
+
+ do
+ {
+ answer = getchar ();
+
+ if (answer == EOF)
+ {
+ ERRORMSG ("EOF detected on standard input");
+ answer = 'N';
+ }
+ else
+ {
+ answer = TOUPPER (answer);
+ }
+ } while (!((answer == 'N') || (answer == 'Y')));
+
+ return ((answer == 'Y') ? (Boolean) TRUE : (Boolean) FALSE);
+} /* confirm_yesno */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** examine_file
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#define EX_SAMPLE_SIZE 512
+
+#if (ANSI_SYNTAX)
+ void examine_file (File_Info *ex_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void examine_file (ex_file)
+ File_Info *ex_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmp_buffer[EX_SAMPLE_SIZE];
+ SIZE_T bytes_read;
+ SIZE_T bc;
+ SIZE_T eol_count;
+ int i;
+ struct stat stat_buffer;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Initialize the File_Info structure before starting work. If the input
+ ** file is not a real file (i.e. a device or pipe), these are the values
+ ** that will be returned.
+ **------------------------------------------------------------------------
+ */
+ ex_file->mode = INV_MODE;
+ ex_file->format = INV_FORMAT;
+ ex_file->max_rec_len = INV_RECORD_LEN;
+ ex_file->lng_rec_len = INV_RECORD_LEN;
+ ex_file->mod_time = INV_TIMESTAMP;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ ex_file->file_ptr = fopen (ex_file->file_spec, "rb");
+
+ if (ex_file->file_ptr == (FILE *) NULL)
+ {
+ ERRORMSG_1 ("couldn't examine (open) file `%s'", ex_file->file_spec);
+ explain_error ();
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Test to see if the file is 'real'.
+ **------------------------------------------------------------------------
+ */
+ if (is_a_file (ex_file) == FALSE)
+ {
+ DEBUG_1 ("examine_file: `%s' is not a regular file",
+ ex_file->file_spec);
+ f_close (ex_file);
+ ex_file->pipe_flag = TRUE;
+ ex_file->file_ptr = (FILE *) NULL;
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ bytes_read = fread (tmp_buffer, sizeof (char), EX_SAMPLE_SIZE,
+ ex_file->file_ptr);
+ eol_count = 0;
+
+ for (bc = 0; bc < (bytes_read - 1); bc++)
+ {
+ if ((tmp_buffer[bc] == '\r') && (tmp_buffer[bc + 1] == '\n'))
+ {
+ ++eol_count;
+ }
+ }
+ f_close (ex_file);
+ ex_file->file_ptr = (FILE *) NULL;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (bytes_read > (80U * eol_count))
+ {
+ ex_file->mode = MODE_BINARY;
+ ex_file->format = DEF_BINARY_FMT;
+ }
+ else
+ {
+ ex_file->mode = MODE_TEXT;
+ ex_file->format = DEF_TEXT_FMT;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ i = stat (ex_file->file_spec, &stat_buffer);
+
+ if (i != FALSE)
+ {
+ ERRORMSG_1 ("couldn't examine (stat) file `%s'", ex_file->file_spec);
+ explain_error ();
+ return;
+ }
+ ex_file->mod_time = stat_buffer.st_mtime;
+
+} /* examine_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** explain_error
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void explain_error (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void explain_error ()
+#endif /* (ANSI_SYNTAX) */
+{
+ INFOMSG_1 ("reason for error: %s", strerror (errno));
+} /* explain_error */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** f_open_in
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ FILE *f_open_in (File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ FILE *f_open_in (ip_file)
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ FILE *file_ptr;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ switch (ip_file->mode)
+ {
+ case MODE_BINARY:
+ file_ptr = fopen (ip_file->file_spec, "rb");
+ break;
+ case MODE_TEXT:
+ file_ptr = fopen (ip_file->file_spec, "r");
+ break;
+ default:
+ ERRORMSG_1 ("invalid file mode specified (%d)", ip_file->mode);
+ return ((FILE *) NULL);
+ }
+
+ if (file_ptr == (FILE *) NULL)
+ {
+ ERRORMSG_1 ("error opening file `%s' for input", ip_file->file_spec);
+ explain_error ();
+ return ((FILE *) NULL);
+ }
+ return (file_ptr);
+} /* f_open_in */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** f_open_out
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ FILE *f_open_out (CONST Int16 overwrite_files,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ FILE *f_open_out (overwrite_files, op_file)
+ CONST Int16 overwrite_files;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ FILE *file_ptr;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((overwrite_files != OVERWRITE_YES)
+ && (file_exists (op_file->file_spec)))
+ {
+ if (overwrite_files == OVERWRITE_ASK)
+ {
+ SPRINTF (G_tmp_msg, "File `%s' exists. Overwrite ?",
+ op_file->file_spec);
+
+ if (!confirm_yesno (G_tmp_msg))
+ {
+ INFOMSG ("operation cancelled");
+ return ((FILE *) NULL);
+ }
+ }
+ else
+ {
+ ERRORMSG_1 ("file `%s' exists", op_file->file_spec);
+ return ((FILE *) NULL);
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ switch (op_file->mode)
+ {
+ case MODE_BINARY:
+ file_ptr = fopen (op_file->file_spec, "wb");
+ break;
+ case MODE_TEXT:
+ file_ptr = fopen (op_file->file_spec, "w");
+ break;
+ default:
+ ERRORMSG_1 ("invalid file mode specified (%d)", op_file->mode);
+ return ((FILE *) NULL);
+ }
+
+ if (file_ptr == (FILE *) NULL)
+ {
+ ERRORMSG_1 ("error opening file `%s' for output", op_file->file_spec);
+ explain_error ();
+ return ((FILE *) NULL);
+ }
+ return (file_ptr);
+} /* f_open_out */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** file_exists
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean file_exists (CONST char *file_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean file_exists (file_spec)
+ CONST char *file_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ return ((Boolean) (access ((char *) file_spec, 0) == 0));
+} /* file_exists */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** force_file_ext
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void force_file_ext (CONST char *forced_ext,
+ char *full_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void force_file_ext (forced_ext, full_spec)
+ CONST char *forced_ext;
+ char *full_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char name[MAX_NAME + 1];
+ char preamble[MAX_PREAMBLE + 1];
+
+ if (forced_ext == NULL)
+ {
+ return;
+ }
+ (void) split_file_spec (full_spec, preamble, name, NULL, NULL);
+ make_file_spec (preamble, name, forced_ext, NULL, full_spec);
+} /* force_file_ext */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** is_a_file
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean is_a_file (CONST File_Info *ex_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean is_a_file (ex_file)
+ CONST File_Info *ex_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int file_handle;
+ int status;
+
+ file_handle = fileno (ex_file->file_ptr);
+ status = isatty (file_handle);
+
+ if (status == 0)
+ {
+ return (TRUE);
+ }
+ else
+ {
+ return (FALSE);
+ }
+} /* is_a_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** legal_filespec
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *legal_filespec (CONST char *hdrf_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ char *legal_filespec (hdrf_spec)
+ CONST char *hdrf_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmpf_name[MAX_NAME + 1];
+ char tmpf_ext[MAX_EXT + 1];
+ char *tmpf_spec;
+ char *tmp_ptr;
+ static char opf_spec[MAX_PATH + 1];
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tmpf_spec = STRDUP (hdrf_spec);
+ tmp_ptr = STRCHR (tmpf_spec, '.');
+
+ if (tmp_ptr != NULL)
+ {
+ strncpy (tmpf_ext, tmp_ptr, MAX_EXT);
+ tmpf_ext[MAX_EXT] = '\0';
+ *tmp_ptr = '\0';
+ }
+ else
+ {
+ strcpy (tmpf_ext, "");
+ }
+ strncpy (tmpf_name, tmpf_spec, MAX_NAME);
+ tmpf_name[MAX_NAME] = '\0';
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (tmp_ptr = tmpf_name; *tmp_ptr != '\0'; tmp_ptr++)
+ {
+ if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL)
+ {
+ *tmp_ptr = REPLACEMENT_FILESPEC_CHAR;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (tmp_ptr = tmpf_ext + 1; *tmp_ptr != '\0'; tmp_ptr++)
+ {
+ if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL)
+ {
+ *tmp_ptr = REPLACEMENT_FILESPEC_CHAR;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ strcpy (opf_spec, tmpf_name);
+ strcat (opf_spec, tmpf_ext);
+
+ if (strcmp (hdrf_spec, opf_spec) != 0)
+ {
+ WARNMSG_2 ("suspicious header file spec `%s' changed to `%s'",
+ hdrf_spec, opf_spec);
+ }
+ return (opf_spec);
+} /* legal_filespec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** make_file_spec
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void make_file_spec (CONST char *preamble,
+ CONST char *name,
+ CONST char *extension,
+ CONST char *postamble,
+ char *full_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void make_file_spec (preamble, name, extension,
+ postamble, full_spec)
+ CONST char *preamble;
+ CONST char *name;
+ CONST char *extension;
+ CONST char *postamble;
+ char *full_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ SIZE_T len;
+ char *tmp_ptr;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Start with an empty string and append components of the file
+ ** specification only if they exist.
+ **------------------------------------------------------------------------
+ */
+ strcpy (full_spec, "");
+
+ /*-
+ **------------------------------------------------------------------------
+ ** The preamble component corresponds to the OS/2 drive and/or path
+ ** components in the form:
+ **
+ ** D: dir1 \dir1 \dir1\dir2 \dir1\dir2\
+ ** D:\ D:dir1 D:\dir1 D:\dir1\dir2\ D:\dir1\dir2\
+ **
+ ** If the preamble component does not end in '\' or ':', '\' is appended
+ ** only if the component is not empty.
+ **------------------------------------------------------------------------
+ */
+ if ((preamble != NULL) && (*preamble != '\0'))
+ {
+ strncat (full_spec, preamble, MAX_PREAMBLE);
+ len = strlen (preamble);
+ tmp_ptr = STRCHR ("\\:", preamble[len - 1]);
+
+ if ((tmp_ptr == NULL) && (len < MAX_PREAMBLE))
+ {
+ strcat (full_spec, "\\");
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Simply append the name if it is present.
+ **------------------------------------------------------------------------
+ */
+ if (name != NULL)
+ {
+ strncat (full_spec, name, MAX_NAME);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the extension component does not begin with '.', prepend '.' before
+ ** appending the extension to the file specification.
+ **------------------------------------------------------------------------
+ */
+ if ((extension != NULL) && (*extension != '\0'))
+ {
+ if (*extension != '.')
+ {
+ strcat (full_spec, ".");
+ strncat (full_spec, extension, MAX_EXT - 1);
+ }
+ else
+ {
+ strncat (full_spec, extension, MAX_EXT);
+ }
+ }
+} /* make_file_spec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** prompt_for_string
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void prompt_for_string (CONST char *confirm_str,
+ CONST Int16 buf_size,
+ char *return_buffer)
+#else /* NOT (ANSI_SYNTAX) */
+ void prompt_for_string (confirm_str, buf_size,
+ return_buffer)
+ CONST char *confirm_str;
+ CONST Int16 buf_size;
+ char *return_buffer;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *status;
+
+ FPRINTF (stderr, "\n%s", confirm_str);
+ fflush (stderr);
+ status = fgets (return_buffer, (int) buf_size, stdin);
+
+ if (status == NULL)
+ {
+ FATALMSG ("error reading string from stdin");
+ explain_error ();
+ vv_exit ();
+ }
+
+ status = STRCHR (return_buffer, '\n');
+ if (status != NULL)
+ {
+ *status = '\0';
+ }
+} /* prompt_for_string */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_bytes
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 read_bytes (CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 read_bytes (max_bytes, buffer, ip_file)
+ CONST Int32 max_bytes;
+ char *buffer;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 idx;
+ int temp;
+
+ for (idx = 0L; idx < max_bytes; idx++)
+ {
+ temp = fgetc (ip_file->file_ptr);
+
+ if (temp == EOF)
+ {
+ if (ferror (ip_file->file_ptr))
+ {
+ return (-2L);
+ }
+
+ if (idx == 0)
+ {
+ return (-1L);
+ }
+ break;
+ }
+ buffer[(SIZE_T) idx] = (char) temp;
+ }
+ return (idx);
+} /* read_bytes */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_line
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 read_line (CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 read_line (max_bytes, buffer, ip_file)
+ CONST Int32 max_bytes;
+ char *buffer;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *tmp_ptr;
+
+ tmp_ptr = fgets (buffer, (int) max_bytes, ip_file->file_ptr);
+ buffer[(SIZE_T) (max_bytes - 1)] = '\0';
+
+ if (tmp_ptr == NULL)
+ {
+ if (ferror (ip_file->file_ptr))
+ {
+ return (-2L);
+ }
+
+ if (feof (ip_file->file_ptr))
+ {
+ return (-1L);
+ }
+ }
+ return ((Int32) strlen (buffer));
+} /* read_line */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_record
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 read_record (CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 read_record (max_bytes, buffer, ip_file)
+ CONST Int32 max_bytes;
+ char *buffer;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+
+#if SUPPORT_VARIABLE_FMT
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Below is debugging code for simulating record reading on OS/2.
+ ** This code should be removed before official issue!
+ **------------------------------------------------------------------------
+ */
+ Int32 bytes_read;
+
+ if (ip_file->mode == MODE_TEXT)
+ {
+ bytes_read = read_line (max_bytes, buffer, ip_file);
+ }
+ else
+ {
+ if (feof (ip_file->file_ptr))
+ {
+ return (-1L);
+ }
+ bytes_read = (Int32) fread (buffer, sizeof (char),
+ (SIZE_T) max_bytes, ip_file->file_ptr);
+
+ if (ferror (ip_file->file_ptr))
+ {
+ return (-2L);
+ }
+ }
+ return (bytes_read);
+
+#else /* NOT SUPPORT_VARIABLE_FMT */
+
+ INTERNAL_ERROR ("read_record");
+ return (-2L);
+
+#endif /* SUPPORT_VARIABLE_FMT */
+} /* read_record */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** scan_cmd_line
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void scan_cmd_line (CONST int qargc,
+ CONST char *qargv[],
+ CONST char *q_intro_str,
+ CONST char *q_sep_str,
+ Qualifier_Struct *qual_array,
+ Qualifier_Struct *qual_ipfile,
+ Qualifier_Struct *qual_opfile)
+#else /* NOT (ANSI_SYNTAX) */
+ void scan_cmd_line (qargc, qargv, q_intro_str,
+ q_sep_str, qual_array, qual_ipfile,
+ qual_opfile)
+ CONST int qargc;
+ CONST char *qargv[];
+ CONST char *q_intro_str;
+ CONST char *q_sep_str;
+ Qualifier_Struct *qual_array;
+ Qualifier_Struct *qual_ipfile;
+ Qualifier_Struct *qual_opfile;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *arg;
+ int arg_no;
+ int len;
+ int qual_found;
+ int q_no;
+ char *qsep_ptr;
+ char *qvalue_ptr;
+ char *tmp_qstr_ptr;
+
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Loop through each of the user supplied command line arguments.
+ **------------------------------------------------------------------------
+ */
+ tmp_qstr_ptr = NULL;
+
+ for (arg_no = 1; arg_no < qargc; arg_no++)
+ {
+ arg = (char *) qargv[arg_no];
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if (qual_array[CMDQ_DEBUG].present == TRUE)
+ {
+ G_debugging = TRUE;
+ }
+ DEBUG_1 ("scan_cmd_line: command line argument: `%s'", arg);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** If the first character of the argument is one of the allowable
+ ** 'q_intro_str' characters then parse it as a qualifier, unless
+ ** the argument is the 'STDIO_SYMBOL' string when it is interpreted as
+ ** the standard input or output file.
+ **--------------------------------------------------------------------
+ */
+ if (((STRCHR (q_intro_str, *arg) != NULL)
+ && STRCMP (arg, STDIO_SYMBOL) != 0))
+ {
+
+ /*-
+ **----------------------------------------------------------------
+ ** Extract the component of the qualifier string after the
+ ** 'q_intro_str' character before the 'q_sep_str' character
+ ** if it is present.
+ **----------------------------------------------------------------
+ */
+ if (tmp_qstr_ptr != NULL)
+ {
+ free (tmp_qstr_ptr);
+ }
+ tmp_qstr_ptr = STRDUP (arg + 1);
+ qsep_ptr = STRSTR (tmp_qstr_ptr, q_sep_str);
+ qvalue_ptr = NULL;
+
+ if (qsep_ptr != NULL)
+ {
+ *qsep_ptr = '\0';
+ qvalue_ptr = qsep_ptr + 1;
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ ** Search the command qualifier structure array for this
+ ** qualifier string.
+ **----------------------------------------------------------------
+ */
+ len = strlen (tmp_qstr_ptr);
+ qual_found = -1;
+
+ for (q_no = 0; qual_array[q_no].q_string != NULL; q_no++)
+ {
+ if (STRNCMPI (qual_array[q_no].q_string, tmp_qstr_ptr, len) == 0)
+ {
+
+ /*-
+ **--------------------------------------------------------
+ **
+ **--------------------------------------------------------
+ */
+ if (qual_found < 0)
+ {
+ qual_found = q_no;
+ DEBUG_1 ("scan_cmd_line: matches qualifier: `%s'",
+ qual_array[q_no].q_string);
+ }
+ else
+ {
+ USAGE_1 ("ambiguous qualifier `%s'", qargv[arg_no]);
+ }
+ }
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ ** If the qualifier string is unknown, return that status.
+ **----------------------------------------------------------------
+ */
+ if (qual_found < 0)
+ {
+ USAGE_1 ("unknown qualifier `%s'", qargv[arg_no]);
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ **
+ **----------------------------------------------------------------
+ */
+ if (qsep_ptr == NULL)
+ {
+ if (qual_array[qual_found].val_needed == VALUE_NEEDED)
+ {
+ USAGE_2 ("qualifier `%.1s%s' must take a value",
+ QUAL_INTRO, qual_array[qual_found].q_string);
+ }
+ else
+ {
+ qual_array[qual_found].present = TRUE;
+ qual_array[qual_found].value = NULL;
+ }
+ }
+ else
+ {
+ /*-
+ **------------------------------------------------------------
+ **
+ **------------------------------------------------------------
+ */
+ if (*qvalue_ptr == '\0')
+ {
+ USAGE_1 ("value missing after qualifier `%s'",
+ qargv[arg_no]);
+ }
+ else
+ if (qual_array[qual_found].val_needed == VALUE_NONE)
+ {
+ USAGE_2 ("qualifier `%.1s%s' does not take a value",
+ QUAL_INTRO, qual_array[qual_found].q_string);
+ }
+ else
+ {
+ qual_array[qual_found].value = STRDUP (qvalue_ptr);
+ qual_array[qual_found].present = TRUE;
+ DEBUG_1 ("scan_cmd_line: qualifier value: `%s'",
+ qual_array[qual_found].value);
+ continue;
+ }
+ }
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ else
+ {
+ if (qual_ipfile->present == FALSE)
+ {
+ qual_ipfile->present = TRUE;
+ qual_ipfile->value = STRDUP (qargv[arg_no]);
+ }
+ else
+ if (qual_opfile->present == FALSE)
+ {
+ qual_opfile->present = TRUE;
+ qual_opfile->value = STRDUP (qargv[arg_no]);
+ }
+ else
+ {
+ USAGE ("too many file names specified");
+ }
+ }
+ }
+} /* scan_cmd_line */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_ftime
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_ftime (File_Info *target_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_ftime (target_file)
+ File_Info *target_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int status;
+ struct tm *tms;
+ struct utimbuf utb;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ DEBUG_2 ("set_ftime: setting file `%s' time to %.24s",
+ target_file->file_spec, ctime (&(target_file->mod_time)));
+
+ /*-
+ **------------------------------------------------------------------------
+ ** OS/2 doesn't understand times before 1980.01.01-00:00:00 local time.
+ ** If the time is before this time, issue a warning message and rely on
+ ** utime() not to blow up when passed such a time.
+ **------------------------------------------------------------------------
+ */
+ tms = localtime (&(target_file->mod_time));
+ if (tms->tm_year < 80)
+ {
+ WARNMSG_2 ("Cannot set file `%s' time to %s", target_file->file_spec,
+ vv_timestamp (target_file->mod_time));
+ INFOMSG ("reason: OS/2 does not support file times before 1980.");
+ WARNMSG_1 ("File `%s' time set to 1980.01.01-00:00:00 GMT",
+ target_file->file_spec);
+ }
+
+ utb.actime = target_file->mod_time;
+ utb.modtime = target_file->mod_time;
+ status = utime (target_file->file_spec, &utb);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (status != 0)
+ {
+ ERRORMSG_2 ("error setting file `%s' time to %.24s",
+ target_file->file_spec, ctime (&(target_file->mod_time)));
+ explain_error ();
+ }
+ return;
+
+} /* set_ftime */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_pipe_mode
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_pipe_mode (File_Info *target_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_pipe_mode (target_file)
+ File_Info *target_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int file_handle;
+ int status;
+
+ file_handle = fileno (target_file->file_ptr);
+ switch (target_file->mode)
+ {
+ case MODE_BINARY:
+ status = setmode (file_handle, (int) O_BINARY);
+ break;
+ case MODE_TEXT:
+ status = setmode (file_handle, (int) O_TEXT);
+ break;
+ default:
+ INTERNAL_ERROR ("set_pipe_mode");
+ }
+
+ if (status < 0)
+ {
+ ERRORMSG_1 ("error setting mode of file `%s'", target_file->file_spec);
+ explain_error ();
+ }
+} /* set_pipe_mode */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** split_file_spec
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Unsigned16 split_file_spec (CONST char *full_spec,
+ char *preamble,
+ char *name,
+ char *extension,
+ char *postamble)
+#else /* NOT (ANSI_SYNTAX) */
+ Unsigned16 split_file_spec (full_spec, preamble, name,
+ extension, postamble)
+ CONST char *full_spec;
+ char *preamble;
+ char *name;
+ char *extension;
+ char *postamble;
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmp_full_spec[MAX_PATH + 1];
+ char *start_ptr;
+ char *tmp_ptr;
+ int idx;
+ Unsigned16 path_components;
+
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (preamble != NULL)
+ {
+ *preamble = '\0';
+ }
+ if (name != NULL)
+ {
+ *name = '\0';
+ }
+ if (extension != NULL)
+ {
+ *extension = '\0';
+ }
+ if (postamble != NULL)
+ {
+ *postamble = '\0';
+ }
+ path_components = FS_NOTHING;
+
+ if ((full_spec == NULL) || (*full_spec == '\0'))
+ {
+ return (path_components);
+ }
+
+ strcpy (tmp_full_spec, full_spec);
+ start_ptr = (char *) tmp_full_spec;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tmp_ptr = STRRSTR (start_ptr, ":\\");
+
+ if (tmp_ptr != NULL)
+ {
+ path_components |= FS_PREAMBLE;
+
+ if (preamble != NULL)
+ {
+ for (idx = 0; ((idx < MAX_PREAMBLE) && (start_ptr <= tmp_ptr));
+ idx++)
+ {
+ *preamble++ = *start_ptr++;
+ }
+ *preamble = '\0';
+ }
+ start_ptr = ++tmp_ptr;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tmp_ptr = STRCHR (start_ptr, '.');
+ if (tmp_ptr != NULL)
+ {
+ path_components |= FS_EXTENSION;
+
+ if (extension != NULL)
+ {
+ strncpy (extension, tmp_ptr, MAX_EXT);
+ }
+ *tmp_ptr = '\0';
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (*start_ptr != '\0')
+ {
+ path_components |= FS_NAME;
+
+ if (name != NULL)
+ {
+ strncpy (name, start_ptr, MAX_NAME);
+ }
+ }
+
+ return (path_components);
+} /* split_file_spec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** tz_offset
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ TIME_T tz_offset (TIME_T the_time)
+#else /* NOT (ANSI_SYNTAX) */
+ TIME_T tz_offset (the_time)
+ TIME_T the_time;
+#endif /* (ANSI_SYNTAX) */
+{
+ struct tm *tm;
+ char *tz_str;
+ char set_tz_str[32];
+
+#if (OS2_GNUC)
+ TIME_T timezone;
+ struct timeb timeb_struct;
+#endif /* (OS2_GNUC) */
+
+#if (OS2_CSET)
+ TIME_T timezone;
+#endif /* (OS2_CSET) */
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tz_str = getenv ("TZ");
+
+ if (tz_str == NULL)
+ {
+ strcpy (set_tz_str, "TZ=");
+ strcat (set_tz_str, VV_TIMEZONE);
+ putenv (set_tz_str);
+ }
+
+
+#if (OS2_GNUC)
+ ftime (&timeb_struct);
+ timezone = (TIME_T) timeb_struct.timezone * (TIME_T) 60;
+#endif /* (OS2_GNUC) */
+
+#if (OS2_MSC)
+ tzset ();
+#endif /* (OS2_MSC) */
+
+#if (OS2_CSET)
+ _tzset ();
+ timezone = (TIME_T) _timezone;
+#endif /* (OS2_CSET) */
+
+ tm = localtime (&the_time);
+
+ if (tm->tm_isdst > 0)
+ {
+ return (timezone - (TIME_T) 3600);
+ }
+ else
+ {
+ return (timezone);
+ }
+} /* tz_offset */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** user_message
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void user_message (CONST Int16 status,
+ CONST char *msg_str,
+ File_Info *log_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void user_message (status, msg_str, log_file)
+ CONST Int16 status;
+ CONST char *msg_str;
+ File_Info *log_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int to_stderr;
+ int to_logfile;
+ char *status_str;
+
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Check the value supplied for the message status and set the output
+ ** destinations accordingly.
+ **------------------------------------------------------------------------
+ */
+ to_logfile = TRUE;
+ to_stderr = FALSE;
+
+ switch (status)
+ {
+ case LOG_STATUS:
+ case NORMAL_STATUS:
+ status_str = "";
+ break;
+ case INFO_STATUS:
+ status_str = " -- ";
+ to_stderr = TRUE;
+ break;
+ case WARNING_STATUS:
+ status_str = "\nWARNING: ";
+ to_stderr = TRUE;
+ break;
+ case ERROR_STATUS:
+ status_str = "\nERROR: ";
+ to_stderr = TRUE;
+ break;
+ case FATAL_STATUS:
+ status_str = "\nFATAL: ";
+ to_stderr = TRUE;
+ break;
+ default:
+ INTERNAL_ERROR ("user_message");
+ vv_exit ();
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is NULL, just update the status and/or the message
+ ** show status.
+ **------------------------------------------------------------------------
+ */
+ if ((msg_str == NULL) || (*msg_str == '\0'))
+ {
+ if (status > G_status)
+ {
+ G_status = status;
+ }
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Make sure that we don't try to write to a NULL log file pointer.
+ **------------------------------------------------------------------------
+ */
+ if (log_file->file_ptr == (FILE *) NULL)
+ {
+ to_logfile = FALSE;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is to be sent to the log file and stderr, check whether
+ ** the log file output is also to stderr. If it is, disable the 'stderr'
+ ** output.
+ **------------------------------------------------------------------------
+ */
+ if (to_logfile && to_stderr)
+ {
+ if (log_file->file_ptr == stderr)
+ {
+ to_stderr = FALSE;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is to be sent to stderr, output it here.
+ **------------------------------------------------------------------------
+ */
+ if (to_stderr)
+ {
+ FPRINTF (stderr, "%s%s\n", status_str, msg_str);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is to be sent to the log file, output it here. If
+ ** debugging is enabled, report also the name of the calling function.
+ **------------------------------------------------------------------------
+ */
+ if (to_logfile)
+ {
+ FPRINTF (log_file->file_ptr, "%s%s\n", status_str, msg_str);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (status > G_status)
+ {
+ G_status = status;
+ }
+} /* user_message */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vv_exit
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void vv_exit (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void vv_exit ()
+#endif /* (ANSI_SYNTAX) */
+{
+ switch (G_status)
+ {
+ case LOG_STATUS:
+ case NORMAL_STATUS:
+ exit (0);
+ break;
+ case WARNING_STATUS:
+ exit (1);
+ break;
+ case ERROR_STATUS:
+ exit (2);
+ break;
+ case FATAL_STATUS:
+ default:
+ exit (3);
+ break;
+ }
+} /* vv_exit */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** write_bytes
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void write_bytes (CONST Int32 max_bytes,
+ CONST char *buffer,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void write_bytes (max_bytes, buffer, op_file)
+ CONST Int32 max_bytes;
+ CONST char *buffer;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 idx;
+
+ for (idx = 0L; idx < max_bytes; idx++)
+ {
+ fputc (buffer[(SIZE_T) idx], op_file->file_ptr);
+ }
+} /* write_bytes */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** write_record
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void write_record (CONST Int32 max_bytes,
+ CONST char *buffer,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void write_record (max_bytes, buffer, op_file)
+ CONST Int32 max_bytes;
+ CONST char *buffer;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+
+#if SUPPORT_VARIABLE_FMT
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Below is debugging code for simulating record writing on OS/2.
+ ** This code should be removed before official issue!
+ **------------------------------------------------------------------------
+ */
+ Int32 no_bytes;
+
+ no_bytes = max_bytes * sizeof (char);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Check that the buffer does not exceed the maximum allowable record
+ ** length. If it does, truncate the record and issue a warning.
+ **------------------------------------------------------------------------
+ */
+ if ((op_file->max_rec_len > 0) && (no_bytes > op_file->max_rec_len))
+ {
+ ERRORMSG_2 ("output record too long (%ld bytes, max = %ld) - truncated",
+ no_bytes, op_file->max_rec_len);
+ no_bytes = op_file->max_rec_len / sizeof (char);
+ }
+ fwrite (buffer, sizeof (char), (SIZE_T) no_bytes, op_file->file_ptr);
+
+#else /* NOT SUPPORT_VARIABLE_FMT */
+
+ INTERNAL_ERROR ("write_record");
+
+#endif /* SUPPORT_VARIABLE_FMT */
+} /* write_record */
diff --git a/support/vvcode/os2.mak b/support/vvcode/os2.mak
new file mode 100644
index 0000000000..cc6d73716f
--- /dev/null
+++ b/support/vvcode/os2.mak
@@ -0,0 +1,161 @@
+##############################################################################
+##############################################################################
+##
+## ARCHIVE HEADER INFORMATION
+##
+## @Make-file{
+## FILENAME = "os2.mak",
+## VERSION = "1.00",
+## DATE = "",
+## TIME = "",
+##
+## AUTHOR = "Niel Kempson",
+## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+## TELEPHONE = "+44-242 579105",
+## EMAIL = "kempson@tex.ac.uk (Internet)",
+##
+## SUPPORTED = "yes",
+## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+## KEYWORDS = "VVcode",
+##
+## CODETABLE = "ISO/ASCII",
+## CHECKSUM = "51492 1481 5732 57976",
+##
+## DOCSTRING = { This file is part of VVcode.
+## }
+## }
+##
+## MODULE CONTENTS
+##
+## [tbs]
+##
+## COPYRIGHT
+##
+## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the terms of the GNU General Public License as
+## published by the Free Software Foundation; either version 1, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+##
+## In other words, you are welcome to use, share and improve this
+## program. You are forbidden to forbid anyone else to use, share
+## and improve what you give them. Help stamp out software-hoarding!
+##
+## CHANGE LOG
+##
+##############################################################################
+##############################################################################
+
+
+##############################################################################
+#
+# Local definitions for file types and compilation / linking.
+#
+# If your OS/2 compiler is already supported it should not be necessary to
+# modify any part of the Makefile except the local definitions below. Here
+# are some examples known to work for my OS/2 C compilers.
+#
+# EMX/GNUC v2.1
+#
+# CC = GCC
+# LINK = GCC
+# CCMODEL =
+# CCDEFINES = -DOS2
+# CFLAGS = -c -g -Wall -Wconversion $(CCDEFINES) -o $@
+# LFLAGS = -g -o $@
+#
+# IBM C Set/2 v1.00 (using migration libraries)
+#
+# CC = ICC
+# LINK = ICC
+# CCMODEL =
+# CCDEFINES =
+# CFLAGS = /C /W3 /Kb /Sm /O- /Q+ /Ti $(CCDEFINES)
+# LFLAGS = /Q+
+#
+# Microsoft C v6.0
+#
+# CC = CL
+# LINK = CL
+# CCMODEL = /AS
+# CCDEFINES =
+# CFLAGS = $(CCMODEL) /c /W4 /Zd /Zi /Od $(CCDEFINES) /Lp
+# LFLAGS = $(CCMODEL) /Lp /link /PMTYPE:VIO
+#
+##############################################################################
+# Start of local definitions.
+##############################################################################
+CC = [to be specified]
+LINK = [to be specified]
+CCMODEL =
+CCDEFINES = [to be specified]
+CFLAGS = [to be specified]
+LFLAGS = [to be specified]
+##############################################################################
+# End of local definitions.
+##############################################################################
+
+
+##############################################################################
+# File types and default rule for compilation
+##############################################################################
+EXE = .exe
+OBJ = .obj
+
+.SUFFIXES: .c .h $(OBJ) $(EXE)
+
+.c.obj:
+ $(CC) $(CFLAGS) $*.c
+
+##############################################################################
+# Target Groupings
+##############################################################################
+HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h
+
+OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \
+ vvutils$(OBJ) os2$(OBJ)
+
+EXEFILES = vvencode$(EXE) vvdecode$(EXE)
+
+##############################################################################
+# Top level targets
+##############################################################################
+vvcode: $(EXEFILES)
+ @ echo VVcode built
+
+clean:
+ - del *$(OBJ)
+ - del *$(EXE)
+
+#-----------------------------------------------------------------------------
+# Dependencies for executables
+#-----------------------------------------------------------------------------
+vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ)
+ $(LINK) vvencode$(OBJ) vvutils$(OBJ) os2$(OBJ) $(LFLAGS)
+
+vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) os2$(OBJ)
+ $(LINK) vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) \
+ os2$(OBJ) $(LFLAGS)
+
+#-----------------------------------------------------------------------------
+# Dependencies for object files
+#-----------------------------------------------------------------------------
+vvencode$(OBJ): vvencode.c $(HDRFILES)
+
+vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h
+
+vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h
+
+vvutils$(OBJ): vvutils.c $(HDRFILES)
+
+os2$(OBJ): os2.c $(HDRFILES)
diff --git a/support/vvcode/random.tbl b/support/vvcode/random.tbl
new file mode 100644
index 0000000000..962133ee64
--- /dev/null
+++ b/support/vvcode/random.tbl
@@ -0,0 +1 @@
+ ~!@#$%^&*()_+`-=[]{};'\:"|,<.>/?1234567890ABCDEFGHIJKLMNOPQRST
diff --git a/support/vvcode/reverse.xlt b/support/vvcode/reverse.xlt
new file mode 100644
index 0000000000..74edc8d38f
--- /dev/null
+++ b/support/vvcode/reverse.xlt
@@ -0,0 +1,29 @@
+#-----------------------------------------------------------------------------
+# TEST.XLT
+# ~~~~~~~~
+# Test translation table file
+#-----------------------------------------------------------------------------
+xlt-from ASCII
+xlt-to BIT-REVERSED
+xlt-substchar 042 # asterisk
+#
+255 254 253 252 251 250 249 248 247 246 245 244 243 242 241 240 # 255 - 240
+239 238 237 236 235 234 233 232 231 230 229 228 227 226 225 224 # 239 - 224
+223 222 221 220 219 218 217 216 215 214 213 212 211 210 209 208 # 223 - 208
+207 206 205 204 203 202 201 200 199 198 197 196 195 194 193 192 # 207 - 192
+#
+191 190 189 188 187 186 185 184 183 182 181 180 179 178 177 176 # 191 - 176
+175 174 173 172 171 170 169 168 167 166 165 164 163 162 161 160 # 175 - 160
+159 158 157 156 155 154 153 152 151 150 149 148 147 146 145 144 # 159 - 144
+143 142 141 140 139 138 137 136 135 134 133 132 131 130 129 128 # 143 - 128
+#
+#
+127 126 125 124 123 122 121 120 119 118 117 116 115 114 113 112 # 127 - 112
+111 110 109 108 107 106 105 104 103 102 101 100 099 098 097 096 # 111 - 96
+095 094 093 092 091 090 089 088 087 086 085 084 083 082 081 080 # 96 - 80
+079 078 077 076 075 074 073 072 071 070 069 068 067 066 065 064 # 79 - 64
+#
+063 062 061 060 059 058 057 056 055 054 053 052 051 050 049 048 # 63 - 48
+047 046 045 044 043 042 041 040 039 038 037 036 035 034 033 032 # 47 - 32
+031 030 029 028 027 026 025 024 023 022 021 020 019 018 017 016 # 31 - 16
+015 014 013 012 011 010 009 008 007 006 005 004 003 002 001 000 # 15 - 0
diff --git a/support/vvcode/specific.h b/support/vvcode/specific.h
new file mode 100644
index 0000000000..dc51aba6f5
--- /dev/null
+++ b/support/vvcode/specific.h
@@ -0,0 +1,1089 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "specific.h",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet)",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+** MODULE CONTENTS
+**
+** apply_defaults - Apply default file name and extension to a
+** full file specification if either of these
+** components is missing.
+** confirm_yesno - Display a message to the user and wait for a
+** yes/no answer.
+** examine_file - Examine a file and determine its key features,
+** including mode, format, record length and
+** timestamp.
+** explain_error - Explain the reason for an error.
+** f_open_in - Open a file for input using the appropriate
+** mode, format etc for the file.
+** f_open_out - Open a file for output using the appropriate
+** mode, format etc for the file.
+** file_exists - Determine whether a file exists.
+** force_file_ext - Force the file extension of a full file
+** specification to a specified value.
+** is_a_file - Determine whether a file stream is connected
+** to a real file rather than a character
+** device, pipe etc.
+** legal_filespec - Takes an arbitrary string which may a file
+** specification from another operating system
+** and manipulates it to produce a legal file
+** specification for the current operating
+** system.
+** make_filespec - Construct a full file specification from
+** component parts.
+** prompt_for_string - Present a prompt string and accept a string
+** from the user.
+** read_bytes - Read bytes from a currently open file.
+** read_line - Read a line from a currently open (text) file.
+** read_record - Read a record from a currently open file.
+** scan_cmd_line - [tbs]
+** set_ftime - Set the timestamp of a file to a specified
+** value.
+** set_pipe_mode - Set the mode of a file stream connected to a
+** pipe, character device, redirected
+** stdin/stdout/stderr, in fact any non-file.
+** split_file_spec - Split a full file specification into its
+** component parts.
+** tz_offset - Determine the offset of local time from
+** Greenwich Mean Time (Coordinated Universal
+** Time) at a specified date and time.
+** user_message - Present a message to the user.
+** vv_exit - Exit the program, returning the appropriate
+** status to the operating system.
+** write_bytes - Write bytes to a currently open file.
+** write_record - Write a record to a currently open file.
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** apply_defaults
+**
+** DESCRIPTION
+**
+** Apply default file name and extension to a full file specification if
+** either of these components is missing.
+**
+** INPUT PARAMETERS
+**
+** full_spec - a string buffer of size (MAX_PATH + 1) containing
+** the full file specification.
+** default_name - the default name component to be used if the full
+** file specification does not contain a name
+** component. If there is no default name component,
+** set this parameter to the null character pointer
+** defined by NULL.
+** default_ext - the default extension component to be used if the
+** full file specification does not contain an
+** extension component. If there is no default
+** extension component, set this parameter to the
+** null character pointer defined by NULL.
+**
+** OUTPUT PARAMETERS
+**
+** full_spec - a string buffer of size (MAX_PATH + 1), which on
+** return will contain the full file specification
+** with default name and extension components applied
+** if appropriate.
+**
+** RETURN VALUE
+**
+** None
+**
+**============================================================================
+*/
+void apply_defaults ARGS ((CONST char *default_name,
+ CONST char *default_ext,
+ char *full_spec));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** confirm_yesno
+**
+** DESCRIPTION
+**
+** Display a message to the user and wait for a yes/no answer.
+**
+** INPUT PARAMETERS
+**
+** confirm_str - a string containing the message to be displayed.
+**
+** OUTPUT PARAMETERS
+**
+** None
+**
+** RETURN VALUE
+**
+** TRUE if 'y' or 'Y' was entered, FALSE if 'n' or 'N' was entered.
+**
+**============================================================================
+*/
+Boolean confirm_yesno ARGS ((CONST char *confirm_str));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** examine_file
+**
+** DESCRIPTION
+**
+** Examine a file and determine its key features, including mode, format,
+** record length and timestamp. The file information is passed via a
+** File_Info structure. The following fields of the structure are used:
+**
+** INPUT PARAMETERS
+**
+** ex_file - the File_Info structure containing the feature
+** information of the file to be examined. The
+** following structure fields are used for input:
+**
+** .file_spec - the file specification of the file to be examined
+**
+** OUTPUT PARAMETERS
+**
+** ex_file - the File_Info structure whose elements will be
+** updated to reflect the file features. The
+** following structure fields are used for output:
+**
+** .mode - the mode of the file to be examined (binary/text).
+** If the mode cannot be determined it shall be set
+** to INV_MODE.
+** .format - the format of the file to be examined (fixed,
+** stream or variable). If the format cannot be
+** determined or is not supported, it shall be set
+** to INV_FMT.
+** .max_rec_len - the maximum allowable record length. If the
+** maximum allowable record length cannot be
+** determined or is not supported, it shall be set
+** to INV_RECORD_LEN.
+** .lng_rec_len - the length of the longest record in the file. If
+** the longest record length cannot be determined or
+** is not supported, it shall be set to
+** INV_RECORD_LEN.
+** .mod_time - the modification time of the file in Unix format.
+** If the time cannot be determined or is not
+** supported, it shall be set to INV_TIMESTAMP.
+**
+** RETURN VALUE
+**
+** None
+**
+**============================================================================
+*/
+void examine_file ARGS ((File_Info *ex_info));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** explain_error
+**
+** DESCRIPTION
+**
+** Explain the reason for a detected error.
+**
+** INPUT PARAMETERS
+**
+** None
+**
+** OUTPUT PARAMETERS
+**
+** None
+**
+** RETURN VALUE
+**
+** None
+**
+**============================================================================
+*/
+void explain_error ARGS ((void));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** f_open_in
+**
+** DESCRIPTION
+**
+** Open a file for input using the appropriate mode, format etc for the
+** file.
+**
+** INPUT PARAMETERS
+**
+** ip_file - the File_Info structure whose elements will be
+** used to open the file. The following structure
+** fields are used for input:
+**
+** .mode - the mode of the file (binary/text).
+** .format - the format of the file (fixed, stream or variable).
+** .max_rec_len - the maximum allowable record length. If this
+** field is set to INV_RECORD_LEN, a sensible default
+** shall be chosen if needed and possible.
+** .lng_rec_len - the length of the longest record in the file. If
+** this field is set to INV_RECORD_LEN, a sensible
+** default shall be chosen if needed and possible.
+**
+** OUTPUT PARAMETERS
+**
+** None
+**
+** RETURN VALUE
+**
+** If the file was opened successfully, a (FILE *) pointer is returned,
+** otherwise (FILE *) NULL in the event of failure.
+**
+**============================================================================
+*/
+FILE *f_open_in ARGS ((File_Info *ip_file));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** f_open_out
+**
+** DESCRIPTION
+**
+** Open a file for output using the appropriate mode, format etc for the
+** file.
+**
+** INPUT PARAMETERS
+**
+** op_file - the File_Info structure whose elements will be
+** used to open the file. The following structure
+** fields are used for input:
+**
+** .mode - the mode of the file (binary/text).
+** .format - the format of the file (fixed, stream or variable).
+** .max_rec_len - the maximum allowable record length. If this
+** field is set to INV_RECORD_LEN, a sensible default
+** shall be chosen if needed and possible.
+** .lng_rec_len - the length of the longest record in the file. If
+** this field is set to INV_RECORD_LEN, a sensible
+** default shall be chosen if needed and possible.
+**
+** overwrite_files - flag to control the overwriting of existing files.
+** If TRUE, existing files will be overwritten,
+** otherwise the user will be asked to confirm that
+** the files should be overwritten.
+**
+** OUTPUT PARAMETERS
+**
+** None
+**
+** RETURN VALUE
+**
+** If the file was opened successfully, a (FILE *) pointer is returned,
+** otherwise (FILE *) NULL in the event of failure.
+**
+**============================================================================
+*/
+FILE *f_open_out ARGS ((CONST Int16 overwrite_files,
+ File_Info *op_file));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** file_exists
+**
+** DESCRIPTION
+**
+** Determine whether a file exists. Access privileges (e.g. R, RW) are
+** not checked.
+**
+** INPUT PARAMETERS
+**
+** file_spec - the file specification of the file to be checked.
+**
+** OUTPUT PARAMETERS
+**
+** None
+**
+** RETURN VALUE
+**
+** TRUE if the file exists, FALSE if not.
+**
+**============================================================================
+*/
+Boolean file_exists ARGS ((CONST char *file_spec));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** force_file_ext
+**
+** DESCRIPTION
+**
+** Force the file extension of a full file specification to a specified
+** value.
+**
+** INPUT PARAMETERS
+**
+** full_spec - a string buffer of size (MAX_PATH + 1) containing
+** the full file specification.
+** forced_ext - the new extension component to be used in the
+** full file specification. If there is no new
+** extension component, set this parameter to the
+** null character pointer defined by NULL.
+**
+** OUTPUT PARAMETERS
+**
+** full_spec - a string buffer of size (MAX_PATH + 1), which on
+** return will contain the full file specification
+** with the new extension component applied.
+**
+** RETURN VALUE
+**
+** None
+**
+**============================================================================
+*/
+void force_file_ext ARGS ((CONST char *forced_ext,
+ char *full_spec));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** is_a_file
+**
+** DESCRIPTION
+**
+** Determine whether an already open stream is connected to a real file
+** rather than a character mode device or pipe.
+**
+** INPUT PARAMETERS
+**
+** ex_file
+**
+** OUTPUT PARAMETERS
+**
+** None
+**
+** RETURN VALUE
+**
+** TRUE if the stream is connected to a real file, FALSE if not.
+**
+**============================================================================
+*/
+Boolean is_a_file ARGS ((CONST File_Info *ex_file));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** legal_filespec
+**
+** DESCRIPTION
+**
+** Takes an arbitrary string which may a file specification from another
+** operating system and manipulates it to produce a legal file
+** specification for the current operating system. The resultant file
+** specification must not include any preamble or postamble components
+** (i.e. name and/or extension only).
+**
+** The string may be truncated, characters translated, or even untouched.
+**
+** INPUT PARAMETERS
+**
+** hdrf_spec - the arbitrary string which is usually a file
+** specification from another operating system.
+**
+** OUTPUT PARAMETERS
+**
+** None
+**
+** RETURN VALUE
+**
+** A pointer to the legal file specification string. The string is held
+** in a static buffer and will be overwritten by successive calls to this
+** function.
+**
+**============================================================================
+*/
+char *legal_filespec ARGS ((CONST char *hdrf_spec));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** make_file_spec
+**
+** DESCRIPTION
+**
+** Construct a full file specification from component parts.
+**
+** INPUT PARAMETERS
+**
+** preamble - the preamble component of the file specification.
+** It shall not be necessary for the string to end
+** in one of the characters '\' or ':'. If
+** there is no name component, set this parameter to
+** the null character pointer defined by NULL.
+** name - the name component of the file specification. If
+** there is no name component, set this parameter to
+** the null character pointer defined by NULL.
+** extension - the extension component of the file
+** specification. It shall not be necessary for the
+** string to begin with a '.'. If there is no
+** extension component, set this parameter to the
+** null character pointer defined by NULL.
+** postamble - the postamble component of the file
+** specification. MS-DOS doesn't support the
+** postamble component of the VVcode file
+** specification model so this parameter is ignored.
+**
+** OUTPUT PARAMETERS
+**
+** full_spec - a string buffer of size (MAX_PATH + 1), which on
+** return will contain the full file specification.
+**
+** RETURN VALUE
+**
+** None
+**
+**============================================================================
+*/
+void make_file_spec ARGS ((CONST char *preamble,
+ CONST char *name,
+ CONST char *extension,
+ CONST char *postamble,
+ char *full_spec));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** prompt_for_string
+**
+** DESCRIPTION
+**
+** Display a message to the user and accept a string.
+**
+** INPUT PARAMETERS
+**
+** prompt_str - a string containing the message to be displayed.
+** buf_size - the size of the buffer which will contain the
+** returned string.
+**
+** OUTPUT PARAMETERS
+**
+** return_buffer - a buffer to contain the string entered by the
+** user.
+**
+** RETURN VALUE
+**
+** None
+**
+**============================================================================
+*/
+void prompt_for_string ARGS ((CONST char *confirm_str,
+ CONST Int16 buf_size,
+ char *return_buffer));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_bytes
+**
+** DESCRIPTION
+**
+** Read bytes from a currently open file. This function is called to
+** read stream and fixed length record format files. If the operating
+** system does not support stream or fixed length record format files,
+** this function will never be called, BUT IT MUST BE PRESENT to avoid
+** linker errors.
+**
+** INPUT PARAMETERS
+**
+** ip_file - the File_Info structure whose elements will be
+** used to read the record. The following structure
+** fields are used for input:
+**
+** .file_ptr - the FILE structure of the stream
+**
+** max_bytes - the maximum number of bytes that may be read
+**
+** OUTPUT PARAMETERS
+**
+** buffer - a buffer of size 'max_bytes' or longer which on
+** return will contain the bytes read from the file
+**
+** RETURN VALUE
+**
+** # - the number of bytes returned in the buffer
+** (excluding the trailing '\0').
+** -1 - on EOF
+** -2 - if an error was detected
+**
+**============================================================================
+*/
+Int32 read_bytes ARGS ((CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_line
+**
+** DESCRIPTION
+**
+** Read a line from a currently open file. This function is called to
+** read text files.
+**
+** INPUT PARAMETERS
+**
+** ip_file - the File_Info structure whose elements will be
+** used to read the record. The following structure
+** fields are used for input:
+**
+** .file_ptr - the FILE structure of the stream
+**
+** max_bytes - the maximum number of bytes that may be read
+**
+** OUTPUT PARAMETERS
+**
+** buffer - a buffer of size 'max_bytes' or longer which on
+** return will contain the line read from the file
+**
+** RETURN VALUE
+**
+** # - the number of bytes returned in the buffer
+** (excluding the trailing '\0').
+** -1 - on EOF
+** -2 - if an error was detected
+**
+**============================================================================
+*/
+Int32 read_line ARGS ((CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_record
+**
+** DESCRIPTION
+**
+** Read a record from a currently open file. This function is only
+** called to read variable length format files. If the operating system
+** does not support variable length format files, this function will
+** never be called, BUT IT MUST BE PRESENT to avoid linker errors.
+**
+** INPUT PARAMETERS
+**
+** ip_file - the File_Info structure whose elements will be
+** used to read the record. The following structure
+** fields are used for input:
+**
+** .file_ptr - the FILE structure of the stream
+**
+** max_bytes - the maximum number of bytes that may be read
+**
+** OUTPUT PARAMETERS
+**
+** buffer - a buffer of size 'max_bytes' or longer which on
+** return will contain the record read from the file
+**
+** RETURN VALUE
+**
+** # - the number of bytes returned in the buffer
+** (including an appended '\n' characters but
+** excluding the trailing '\0').
+** -1 - on EOF
+** -2 - if an error was detected
+**
+**============================================================================
+*/
+Int32 read_record ARGS ((CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** scan_cmd_line
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** qargc - the number of command line arguments to be parsed
+** (a copy of the main() argc parameter).
+** qargv - an array of strings containing the command line
+** arguments to be parsed (a copy of the main() argv
+** parameter).
+** q_intro_str - a string containing the valid single characters
+** which may be used to introduce a command
+** qualifier (e.g. "/-" for MS-DOS, "-" for Unix).
+** q_sep_str - a string containing the valid single characters
+** which may be used to separate a command qualifier
+** from its value (e.g. "=:-" for MS-DOS,
+** " " for Unix).
+**
+** OUTPUT PARAMETERS
+**
+** qual_array - the array of Qualifier_Struct structures which
+** contain the status information for each of the
+** valid command qualifiers
+**
+** RETURN VALUE
+**
+** None
+**
+**============================================================================
+*/
+void scan_cmd_line ARGS ((CONST int qargc,
+ CONST char *qargv[],
+ CONST char *q_intro_str,
+ CONST char *q_sep_str,
+ Qualifier_Struct *qual_array,
+ Qualifier_Struct *qual_ipfile,
+ Qualifier_Struct *qual_opfile));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_ftime
+**
+** DESCRIPTION
+**
+** Set the timestamp of a file to a specified value. Operating systems
+** support different types of time, such as access, creation, revision or
+** modification time. It is suggested that the creation and modification
+** time be set to this value if possible.
+**
+** If the operating system does not support the setting of file
+** timestamps, this should be an empty function, BUT IT MUST BE PRESENT.
+**
+** INPUT PARAMETERS
+**
+** target_file - the File_Info structure containing the feature
+** information of the file whose timestamp is to be
+** set. The following structure fields are used
+** for input:
+**
+** .file_spec - the file specification of the file.
+** .mod_time - the modification time of the file in Unix format.
+**
+** OUTPUT PARAMETERS
+**
+** None
+**
+** RETURN VALUE
+**
+** None
+**
+**============================================================================
+*/
+void set_ftime ARGS ((File_Info *target_file));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_pipe_mode
+**
+** DESCRIPTION
+**
+** Set the mode of an already open file stream which is a
+** character mode device or pipe rather than a real file.
+**
+** If text/binary mode has no meaning or mode setting is not supported,
+** this function may be empty, BUT IT MUST BE PRESENT.
+**
+** INPUT PARAMETERS
+**
+** target_file - the File_Info structure containing the feature
+** information of the file whose mode is to be
+** changed. The following structure fields are used
+** for input:
+**
+** .file_spec - the file specification of the open file.
+** .file_ptr - the (FILE *) pointer to the open file
+** .mode - the mode of the file to be examined (binary/text).
+**
+** OUTPUT PARAMETERS
+**
+** None
+**
+** RETURN VALUE
+**
+** None
+**
+**============================================================================
+*/
+void set_pipe_mode ARGS ((File_Info *target_file));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** split_file_spec
+**
+** DESCRIPTION
+**
+** Split a full file specification into its component parts and return
+** a bit field indicating which components of the file specification
+** were present.
+**
+** INPUT PARAMETERS
+**
+** full_spec - a string buffer of size (MAX_PATH + 1), which
+** contains the full file specification.
+**
+** OUTPUT PARAMETERS
+**
+** preamble - a buffer of size (MAX_PREAMBLE + 1) to hold the
+** preamble component of the file specification.
+** The string shall end in one of the characters
+** '\' or ':'. If there is no preamble component,
+** this parameter shall be set to the null character
+** pointer defined by NULL.
+** name - a buffer of size (MAX_NAME + 1) to hold the name
+** component of the file specification. If there is
+** no name component, this parameter shall be set to
+** the null character pointer defined by NULL.
+** extension - a buffer of size (MAX_EXT + 1) to hold the
+** extension component of the file specification.
+** The string shall begin with '.' If there
+** is no extension component, this parameter shall
+** be set to the null character pointer defined by
+** NULL.
+** postamble - a buffer of size (MAX_POSTAMBLE + 1) to hold the
+** postamble component of the file specification.
+** MS-DOS doesn't support the postamble component of
+** the VVcode file specification model so this
+** parameter is ignored.
+**
+** RETURN VALUE
+**
+** An Int16 value indicating which components were found in the file
+** specification. The value is composed of the following macros:
+**
+** FS_NOTHING - no components were present (i.e. an empty file
+** or null specification)
+** FS_PREAMBLE - a preamble component was present
+** FS_NAME - a name component was present
+** FS_EXTENSION - an extension component was present
+** FS_POSTAMBLE - a postamble component was present
+**
+** If the full file specification contains more than one component, these
+** values are OR'd together.
+**
+**============================================================================
+*/
+Unsigned16 split_file_spec ARGS ((CONST char *full_spec,
+ char *preamble,
+ char *name,
+ char *extension,
+ char *postamble));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** tz_offset
+**
+** DESCRIPTION
+**
+** Determine the offset of local time from Greenwich Mean Time
+** (Coordinated Universal Time) at a specified date and time. The date
+** and time is specified because the offset may vary due to different
+** implementations of summer (daylight saving) time around the world.
+**
+** If the operating system does not support the concept of time zones,
+** this function should return a zero offset.
+**
+** INPUT PARAMETERS
+**
+** the_time - the GMT time in Unix time_t format at which the
+** offset is to be computed.
+**
+** OUTPUT PARAMETERS
+**
+** None
+**
+** RETURN VALUE
+**
+** The offset of local time from GMT in seconds. Positive values denote
+** times WEST of (i.e. behind) GMT, and negative values are EAST (i.e.
+** ahead) of GMT.
+**
+**============================================================================
+*/
+TIME_T tz_offset ARGS ((TIME_T the_time));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** user_message
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+void user_message ARGS ((CONST Int16 status,
+ CONST char *msg_str,
+ File_Info *log_file));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vv_exit
+**
+** DESCRIPTION
+**
+** Exit the program, returning the appropriate status to the operating
+** system.
+**
+** INPUT PARAMETERS
+**
+** status - the VVcode status value which will be used to
+** determine the exit status passed to the operating
+** system
+**
+** OUTPUT PARAMETERS
+**
+** None
+**
+** RETURN VALUE
+**
+** None
+**
+**============================================================================
+*/
+void vv_exit ARGS ((void));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** write_bytes
+**
+** DESCRIPTION
+**
+** Write bytes to a currently open file.
+**
+** INPUT PARAMETERS
+**
+** op_file - the File_Info structure whose elements will be
+** used to write the record. The following structure
+** fields are used for input:
+**
+** .file_ptr - the FILE structure of the stream
+** .max_rec_len - the maximum allowable record length.
+**
+** buffer - a buffer of size 'rec_len' or longer which
+** contains the record to be written to the file
+** rec_len - the number of bytes in the record
+**
+** OUTPUT PARAMETERS
+**
+** None
+**
+** RETURN VALUE
+**
+** None
+**
+**============================================================================
+*/
+void write_bytes ARGS ((CONST Int32 rec_len,
+ CONST char *buffer,
+ File_Info *op_file));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** write_record
+**
+** DESCRIPTION
+**
+** Write a record to a currently open file. This function is only
+** called to write variable length format files. If the operating
+** system does not support variable length format files, this function
+** will never be called, BUT IT MUST BE PRESENT to avoid linker errors.
+**
+** INPUT PARAMETERS
+**
+** op_file - the File_Info structure whose elements will be
+** used to write the record. The following structure
+** fields are used for input:
+**
+** .file_ptr - the FILE structure of the stream
+** .max_rec_len - the maximum allowable record length.
+**
+** buffer - a buffer of size 'rec_len' or longer which
+** contains the record to be written to the file
+** rec_len - the number of bytes in the record
+**
+** OUTPUT PARAMETERS
+**
+** None
+**
+** RETURN VALUE
+**
+** None
+**
+**============================================================================
+*/
+void write_record ARGS ((CONST Int32 rec_len,
+ CONST char *buffer,
+ File_Info *op_file));
+
+
+
diff --git a/support/vvcode/unix.c b/support/vvcode/unix.c
new file mode 100644
index 0000000000..9630af200e
--- /dev/null
+++ b/support/vvcode/unix.c
@@ -0,0 +1,1681 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "unix.c",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet)",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+** MODULE CONTENTS
+**
+** apply_defaults - Apply default file name and extension to a
+** full file specification if either of these
+** components is missing.
+** confirm_yesno - Display a message to the user and wait for a
+** yes/no answer.
+** examine_file - Examine a file and determine its key features,
+** including mode, format, record length and
+** timestamp.
+** explain_error - Explain the reason for an error.
+** f_open_in - Open a file for input using the appropriate
+** mode, format etc for the file.
+** f_open_out - Open a file for output using the appropriate
+** mode, format etc for the file.
+** file_exists - Determine whether a file exists.
+** force_file_ext - Force the file extension of a full file
+** specification to a specified value.
+** is_a_file - Determine whether a file stream is connected
+** to a real file rather than a character
+** device, pipe etc.
+** legal_filespec - Takes an arbitrary string which may a file
+** specification from another operating system
+** and manipulates it to produce a legal file
+** specification for the current operating
+** system.
+** make_filespec - Construct a full file specification from
+** component parts.
+** prompt_for_string - Present a prompt string and accept a string
+** from the user.
+** read_bytes - Read bytes from a currently open file.
+** read_line - Read a line from a currently open (text) file.
+** read_record - Read a record from a currently open file.
+** scan_cmd_line - [tbs]
+** set_ftime - Set the timestamp of a file to a specified
+** value.
+** set_pipe_mode - Set the mode of a file stream connected to a
+** pipe, character device, redirected
+** stdin/stdout/stderr, in fact any non-file.
+** split_file_spec - Split a full file specification into its
+** component parts.
+** tz_offset - Determine the offset of local time from
+** Greenwich Mean Time (Coordinated Universal
+** Time) at a specified date and time.
+** user_message - Present a message to the user.
+** vv_exit - Exit the program, returning the appropriate
+** status to the operating system.
+** write_bytes - Write bytes to a currently open file.
+** write_record - Write a record to a currently open file.
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+static char rcsid[] = "$Id$";
+
+/*-
+**----------------------------------------------------------------------------
+** Standard include files
+**----------------------------------------------------------------------------
+*/
+#include <stdio.h>
+
+/*-
+**----------------------------------------------------------------------------
+** Include files
+**----------------------------------------------------------------------------
+*/
+#include "checkos.h"
+#include "machine.h"
+#include "local.h"
+#include "globals.h"
+#include "specific.h"
+#include "vvutils.h"
+
+/*-
+**----------------------------------------------------------------------------
+** Implementation (compiler) specific include files. The default
+**----------------------------------------------------------------------------
+*/
+# if (UNIX_BSD)
+# include <sys/timeb.h>
+
+# ifndef HAS_UTIME_H
+# undef HAS_SYSUTIME_H
+# define HAS_SYSUTIME_H 1
+# endif /* HAS_UTIME_H */
+# endif /* (UNIX_BSD) */
+
+# if (UNIX_SYSV)
+# ifndef HAS_SYSUTIME_H
+# undef HAS_UTIME_H
+# define HAS_UTIME_H 1
+# endif
+# endif /* UNIX_SYSV */
+
+#ifdef HAS_UTIME_H
+# include <utime.h>
+#endif /* HAS_UTIME_H */
+
+#ifdef HAS_SYSUTIME_H
+# include <sys/utime.h>
+#endif /* HAS_SYSUTIME_H */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** apply_defaults
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void apply_defaults (CONST char *default_name,
+ CONST char *default_ext,
+ char *full_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void apply_defaults (default_name, default_ext,
+ full_spec)
+ CONST char *default_name;
+ CONST char *default_ext;
+ char *full_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char name[MAX_NAME + 1];
+ char extension[MAX_EXT + 1];
+ Unsigned16 path_parts;
+ char preamble[MAX_PREAMBLE + 1];
+
+ path_parts = split_file_spec (full_spec, preamble, name, extension, NULL);
+
+
+ if (((path_parts & FS_NAME) == 0) && (default_name != NULL))
+ {
+ strncpy (name, default_name, MAX_NAME);
+ }
+
+ if (((path_parts & FS_EXTENSION) == 0) && (default_ext != NULL))
+ {
+ strncpy (extension, default_ext, MAX_EXT);
+ }
+
+ make_file_spec (preamble, name, extension, NULL, full_spec);
+} /* apply_defaults */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** confirm_yesno
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean confirm_yesno (CONST char *confirm_str)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean confirm_yesno (confirm_str)
+ CONST char *confirm_str;
+#endif /* (ANSI_SYNTAX) */
+{
+ int answer;
+
+ FPRINTF (stderr, "\n%s [Y/N]: ", confirm_str);
+ fflush (stderr);
+
+ do
+ {
+ answer = getchar ();
+
+ if (answer == EOF)
+ {
+ ERRORMSG ("EOF detected on standard input");
+ answer = 'N';
+ }
+ else
+ {
+ answer = TOUPPER (answer);
+ }
+ } while (!((answer == 'N') || (answer == 'Y')));
+
+ return ((answer == 'Y') ? (Boolean) TRUE : (Boolean) FALSE);
+} /* confirm_yesno */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** examine_file
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#define EX_SAMPLE_SIZE 512
+
+#if (ANSI_SYNTAX)
+ void examine_file (File_Info *ex_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void examine_file (ex_file)
+ File_Info *ex_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmp_buffer[EX_SAMPLE_SIZE];
+ int bytes_read;
+ int ctrl_count;
+ int eol_count;
+ int i;
+ struct stat stat_buffer;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Initialize the File_Info structure before starting work. If the input
+ ** file is not a real file (i.e. a device or pipe), these are the values
+ ** that will be returned.
+ **------------------------------------------------------------------------
+ */
+ ex_file->mode = INV_MODE;
+ ex_file->format = INV_FORMAT;
+ ex_file->max_rec_len = INV_RECORD_LEN;
+ ex_file->lng_rec_len = INV_RECORD_LEN;
+ ex_file->mod_time = INV_TIMESTAMP;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ ex_file->file_ptr = fopen (ex_file->file_spec, "r");
+
+ if (ex_file->file_ptr == (FILE *) NULL)
+ {
+ ERRORMSG_1 ("couldn't examine (open) file `%s'", ex_file->file_spec);
+ explain_error ();
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Test to see if the file is 'real'.
+ **------------------------------------------------------------------------
+ */
+ if (is_a_file (ex_file) == FALSE)
+ {
+ DEBUG_1 ("examine_file: `%s' is not a regular file",
+ ex_file->file_spec);
+ f_close (ex_file);
+ ex_file->pipe_flag = TRUE;
+ ex_file->file_ptr = (FILE *) NULL;
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ bytes_read = fread (tmp_buffer, sizeof (char), EX_SAMPLE_SIZE,
+ ex_file->file_ptr);
+ eol_count = 0;
+ ctrl_count = 0;
+
+ for (i = 0; i < (bytes_read - 1); i++)
+ {
+ if (tmp_buffer[i + 1] == '\n')
+ {
+ ++eol_count;
+ }
+ if (tmp_buffer[i + 1] < 0x08)
+ {
+ ++ctrl_count;
+ }
+ }
+ f_close (ex_file);
+ ex_file->file_ptr = (FILE *) NULL;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((bytes_read > (80 * eol_count)) || (bytes_read < (80 * ctrl_count)))
+ {
+ ex_file->mode = MODE_BINARY;
+ ex_file->format = DEF_BINARY_FMT;
+ }
+ else
+ {
+ ex_file->mode = MODE_TEXT;
+ ex_file->format = DEF_TEXT_FMT;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ i = stat (ex_file->file_spec, &stat_buffer);
+
+ if (i != FALSE)
+ {
+ ERRORMSG_1 ("couldn't examine (stat) file `%s'", ex_file->file_spec);
+ explain_error ();
+ return;
+ }
+ ex_file->mod_time = stat_buffer.st_mtime;
+
+} /* examine_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** explain_error
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void explain_error (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void explain_error ()
+#endif /* (ANSI_SYNTAX) */
+{
+ INFOMSG_1 ("Error number: %ld", (long) errno);
+} /* explain_error */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** f_open_in
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ FILE *f_open_in (File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ FILE *f_open_in (ip_file)
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ FILE *file_ptr;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ switch (ip_file->mode)
+ {
+ case MODE_BINARY:
+ case MODE_TEXT:
+ file_ptr = fopen (ip_file->file_spec, "rb");
+ break;
+ default:
+ ERRORMSG_1 ("invalid file mode specified (%d)", ip_file->mode);
+ return ((FILE *) NULL);
+ }
+
+ if (file_ptr == (FILE *) NULL)
+ {
+ ERRORMSG_1 ("error opening file `%s' for input", ip_file->file_spec);
+ explain_error ();
+ return ((FILE *) NULL);
+ }
+ return (file_ptr);
+} /* f_open_in */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** f_open_out
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ FILE *f_open_out (CONST Int16 overwrite_files,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ FILE *f_open_out (overwrite_files, op_file)
+ CONST Int16 overwrite_files;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ FILE *file_ptr;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((overwrite_files != OVERWRITE_YES)
+ && (file_exists (op_file->file_spec)))
+ {
+ if (overwrite_files == OVERWRITE_ASK)
+ {
+ SPRINTF (G_tmp_msg, "File `%s' exists. Overwrite ?",
+ op_file->file_spec);
+
+ if (!confirm_yesno (G_tmp_msg))
+ {
+ INFOMSG ("operation cancelled");
+ return ((FILE *) NULL);
+ }
+ }
+ else
+ {
+ ERRORMSG_1 ("file `%s' exists", op_file->file_spec);
+ return ((FILE *) NULL);
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ switch (op_file->mode)
+ {
+ case MODE_BINARY:
+ case MODE_TEXT:
+ file_ptr = fopen (op_file->file_spec, "wb");
+ break;
+ default:
+ ERRORMSG_1 ("invalid file mode specified (%d)", op_file->mode);
+ return ((FILE *) NULL);
+ }
+
+ if (file_ptr == (FILE *) NULL)
+ {
+ ERRORMSG_1 ("error opening file `%s' for output", op_file->file_spec);
+ explain_error ();
+ return ((FILE *) NULL);
+ }
+ return (file_ptr);
+} /* f_open_out */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** file_exists
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean file_exists (CONST char *file_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean file_exists (file_spec)
+ CONST char *file_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ return ((Boolean) (access ((char *) file_spec, 0) == 0));
+} /* file_exists */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** force_file_ext
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void force_file_ext (CONST char *forced_ext,
+ char *full_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void force_file_ext (forced_ext, full_spec)
+ CONST char *forced_ext;
+ char *full_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char name[MAX_NAME + 1];
+ char preamble[MAX_PREAMBLE + 1];
+
+ if (forced_ext == NULL)
+ {
+ return;
+ }
+ (void) split_file_spec (full_spec, preamble, name, NULL, NULL);
+ make_file_spec (preamble, name, forced_ext, NULL, full_spec);
+} /* force_file_ext */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** is_a_file
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean is_a_file (CONST File_Info *ex_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean is_a_file (ex_file)
+ CONST File_Info *ex_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int file_handle;
+ int status;
+
+ file_handle = fileno (ex_file->file_ptr);
+ status = isatty (file_handle);
+
+ if (status == 0)
+ {
+ return (TRUE);
+ }
+ else
+ {
+ return (FALSE);
+ }
+} /* is_a_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** legal_filespec
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *legal_filespec (CONST char *hdrf_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ char *legal_filespec (hdrf_spec)
+ CONST char *hdrf_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmpf_name[MAX_NAME + 1];
+ char tmpf_ext[MAX_EXT + 1];
+ char *tmpf_spec;
+ char *tmp_ptr;
+ static char opf_spec[MAX_PATH + 1];
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tmpf_spec = STRDUP (hdrf_spec);
+ tmp_ptr = STRCHR (tmpf_spec, '.');
+
+ if (tmp_ptr != NULL)
+ {
+ strncpy (tmpf_ext, tmp_ptr, MAX_EXT);
+ tmpf_ext[MAX_EXT] = '\0';
+ *tmp_ptr = '\0';
+ }
+ else
+ {
+ strcpy (tmpf_ext, "");
+ }
+ strncpy (tmpf_name, tmpf_spec, MAX_NAME);
+ tmpf_name[MAX_NAME] = '\0';
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (tmp_ptr = tmpf_name; *tmp_ptr != '\0'; tmp_ptr++)
+ {
+ if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL)
+ {
+ *tmp_ptr = REPLACEMENT_FILESPEC_CHAR;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (tmp_ptr = tmpf_ext + 1; *tmp_ptr != '\0'; tmp_ptr++)
+ {
+ if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL)
+ {
+ *tmp_ptr = REPLACEMENT_FILESPEC_CHAR;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ strcpy (opf_spec, tmpf_name);
+ strcat (opf_spec, tmpf_ext);
+
+ if (strcmp (hdrf_spec, opf_spec) != 0)
+ {
+ WARNMSG_2 ("suspicious header file spec `%s' changed to `%s'",
+ hdrf_spec, opf_spec);
+ }
+ return (opf_spec);
+} /* legal_filespec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** make_file_spec
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void make_file_spec (CONST char *preamble,
+ CONST char *name,
+ CONST char *extension,
+ CONST char *postamble,
+ char *full_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void make_file_spec (preamble, name, extension,
+ postamble, full_spec)
+ CONST char *preamble;
+ CONST char *name;
+ CONST char *extension;
+ CONST char *postamble;
+ char *full_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ int len;
+ char *tmp_ptr;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Start with an empty string and append components of the file
+ ** specification only if they exist.
+ **------------------------------------------------------------------------
+ */
+ strcpy (full_spec, "");
+
+ /*-
+ **------------------------------------------------------------------------
+ ** The preamble component corresponds to the Unix network node and/or path
+ ** components in the form:
+ **
+ ** node: node:dir1 node:/dir1 node:/dir1/
+ ** node:/dir1/dir2 dir1 /dir1 /dir1/dir2
+ **
+ **
+ ** If the preamble component does not end in '/' or ':', '/' is appended
+ ** only if the component is not empty.
+ **------------------------------------------------------------------------
+ */
+ if ((preamble != NULL) && (*preamble != '\0'))
+ {
+ strncat (full_spec, preamble, MAX_PREAMBLE);
+ len = strlen (preamble);
+ tmp_ptr = STRCHR ("/:", preamble[len - 1]);
+
+ if ((tmp_ptr == NULL) && (len < MAX_PREAMBLE))
+ {
+ strcat (full_spec, "/");
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Simply append the name if it is present.
+ **------------------------------------------------------------------------
+ */
+ if (name != NULL)
+ {
+ strncat (full_spec, name, MAX_NAME);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the extension component does not begin with '.', prepend '.' before
+ ** appending the extension to the file specification.
+ **------------------------------------------------------------------------
+ */
+ if ((extension != NULL) && (*extension != '\0'))
+ {
+ if (*extension != '.')
+ {
+ strcat (full_spec, ".");
+ strncat (full_spec, extension, MAX_EXT - 1);
+ }
+ else
+ {
+ strncat (full_spec, extension, MAX_EXT);
+ }
+ }
+} /* make_file_spec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** prompt_for_string
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void prompt_for_string (CONST char *confirm_str,
+ CONST Int16 buf_size,
+ char *return_buffer)
+#else /* NOT (ANSI_SYNTAX) */
+ void prompt_for_string (confirm_str, buf_size,
+ return_buffer)
+ CONST char *confirm_str;
+ CONST Int16 buf_size;
+ char *return_buffer;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *status;
+
+ FPRINTF (stderr, "\n%s", confirm_str);
+ fflush (stderr);
+ status = fgets (return_buffer, (int) buf_size, stdin);
+
+ if (status == NULL)
+ {
+ FATALMSG ("error reading string from stdin");
+ explain_error ();
+ vv_exit ();
+ }
+
+ status = STRCHR (return_buffer, '\n');
+ if (status != NULL)
+ {
+ *status = '\0';
+ }
+} /* prompt_for_string */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_bytes
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 read_bytes (CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 read_bytes (max_bytes, buffer, ip_file)
+ CONST Int32 max_bytes;
+ char *buffer;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 idx;
+ int temp;
+
+ for (idx = 0L; idx < max_bytes; idx++)
+ {
+ temp = fgetc (ip_file->file_ptr);
+
+ if (temp == EOF)
+ {
+ if (ferror (ip_file->file_ptr))
+ {
+ return (-2L);
+ }
+
+ if (idx == 0)
+ {
+ return (-1L);
+ }
+ break;
+ }
+ buffer[(SIZE_T) idx] = (char) temp;
+ }
+ return (idx);
+} /* read_bytes */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_line
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 read_line (CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 read_line (max_bytes, buffer, ip_file)
+ CONST Int32 max_bytes;
+ char *buffer;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *tmp_ptr;
+
+ tmp_ptr = fgets (buffer, (int) max_bytes, ip_file->file_ptr);
+ buffer[(SIZE_T) (max_bytes - 1)] = '\0';
+
+ if (tmp_ptr == NULL)
+ {
+ if (ferror (ip_file->file_ptr))
+ {
+ return (-2L);
+ }
+
+ if (feof (ip_file->file_ptr))
+ {
+ return (-1L);
+ }
+ }
+ return ((Int32) strlen (buffer));
+} /* read_line */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_record
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 read_record (CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 read_record (max_bytes, buffer, ip_file)
+ CONST Int32 max_bytes;
+ char *buffer;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ INTERNAL_ERROR ("read_record");
+ return (-2L);
+} /* read_record */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** scan_cmd_line
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void scan_cmd_line (CONST int qargc,
+ CONST char *qargv[],
+ CONST char *q_intro_str,
+ CONST char *q_sep_str,
+ Qualifier_Struct *qual_array,
+ Qualifier_Struct *qual_ipfile,
+ Qualifier_Struct *qual_opfile)
+#else /* NOT (ANSI_SYNTAX) */
+ void scan_cmd_line (qargc, qargv, q_intro_str,
+ q_sep_str, qual_array, qual_ipfile,
+ qual_opfile)
+ CONST int qargc;
+ CONST char *qargv[];
+ CONST char *q_intro_str;
+ CONST char *q_sep_str;
+ Qualifier_Struct *qual_array;
+ Qualifier_Struct *qual_ipfile;
+ Qualifier_Struct *qual_opfile;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *arg;
+ int arg_no;
+ int len;
+ int qual_found;
+ int q_no;
+ char *qsep_ptr;
+ char *qvalue_ptr;
+ char *tmp_qstr_ptr;
+
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Loop through each of the user supplied command line arguments.
+ **------------------------------------------------------------------------
+ */
+ tmp_qstr_ptr = NULL;
+
+ for (arg_no = 1; arg_no < qargc; arg_no++)
+ {
+ arg = (char *) qargv[arg_no];
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if (qual_array[CMDQ_DEBUG].present == TRUE)
+ {
+ G_debugging = TRUE;
+ }
+ DEBUG_1 ("scan_cmd_line: command line argument: `%s'", arg);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** If the first character of the argument is one of the allowable
+ ** 'q_intro_str' characters then parse it as a qualifier, unless
+ ** the argument is the 'STDIO_SYMBOL' string when it is interpreted as
+ ** the standard input or output file.
+ **--------------------------------------------------------------------
+ */
+ if (((STRCHR (q_intro_str, *arg) != NULL)
+ && STRCMP (arg, STDIO_SYMBOL) != 0))
+ {
+
+ /*-
+ **----------------------------------------------------------------
+ ** Extract the component of the qualifier string after the
+ ** 'q_intro_str' character before the 'q_sep_str' character
+ ** if it is present.
+ **----------------------------------------------------------------
+ */
+ if (tmp_qstr_ptr != NULL)
+ {
+ free (tmp_qstr_ptr);
+ }
+ tmp_qstr_ptr = STRDUP (arg + 1);
+ qsep_ptr = STRSTR (tmp_qstr_ptr, q_sep_str);
+ qvalue_ptr = NULL;
+
+ if (qsep_ptr != NULL)
+ {
+ *qsep_ptr = '\0';
+ qvalue_ptr = qsep_ptr + 1;
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ ** Search the command qualifier structure array for this
+ ** qualifier string.
+ **----------------------------------------------------------------
+ */
+ len = strlen (tmp_qstr_ptr);
+ qual_found = -1;
+
+ for (q_no = 0; qual_array[q_no].q_string != NULL; q_no++)
+ {
+ if (STRNCMPI (qual_array[q_no].q_string, tmp_qstr_ptr, (Int16) len) == 0)
+ {
+
+ /*-
+ **--------------------------------------------------------
+ **
+ **--------------------------------------------------------
+ */
+ if (qual_found < 0)
+ {
+ qual_found = q_no;
+ DEBUG_1 ("scan_cmd_line: matches qualifier: `%s'",
+ qual_array[q_no].q_string);
+ }
+ else
+ {
+ USAGE_1 ("ambiguous qualifier `%s'", qargv[arg_no]);
+ }
+ }
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ ** If the qualifier string is unknown, return that status.
+ **----------------------------------------------------------------
+ */
+ if (qual_found < 0)
+ {
+ USAGE_1 ("unknown qualifier `%s'", qargv[arg_no]);
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ **
+ **----------------------------------------------------------------
+ */
+ if (qsep_ptr == NULL)
+ {
+ if (qual_array[qual_found].val_needed == VALUE_NEEDED)
+ {
+ if ((arg_no + 1) < qargc)
+ {
+ qual_array[qual_found].present = TRUE;
+ qual_array[qual_found].value = STRDUP (qargv[++arg_no]);
+ DEBUG_1 ("scan_cmd_line: qualifier value: `%s'",
+ qual_array[qual_found].value);
+ }
+ else
+ {
+ USAGE_2 ("qualifier `%.1s%s' must take a value",
+ QUAL_INTRO, qual_array[qual_found].q_string);
+ }
+ }
+ else
+ {
+ qual_array[qual_found].present = TRUE;
+ qual_array[qual_found].value = NULL;
+ }
+ }
+ else
+ {
+ /*-
+ **------------------------------------------------------------
+ **
+ **------------------------------------------------------------
+ */
+ if (*qvalue_ptr == '\0')
+ {
+ USAGE_1 ("value missing after qualifier `%s'",
+ qargv[arg_no]);
+ }
+ else if (qual_array[qual_found].val_needed == VALUE_NONE)
+ {
+ USAGE_2 ("qualifier `%.1s%s' does not take a value",
+ QUAL_INTRO, qual_array[qual_found].q_string);
+ }
+ else
+ {
+ qual_array[qual_found].value = STRDUP (qvalue_ptr);
+ qual_array[qual_found].present = TRUE;
+ DEBUG_1 ("scan_cmd_line: qualifier value: `%s'",
+ qual_array[qual_found].value);
+ }
+ }
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ else
+ {
+ if (qual_ipfile->present == FALSE)
+ {
+ qual_ipfile->present = TRUE;
+ qual_ipfile->value = STRDUP (qargv[arg_no]);
+ }
+ else if (qual_opfile->present == FALSE)
+ {
+ qual_opfile->present = TRUE;
+ qual_opfile->value = STRDUP (qargv[arg_no]);
+ }
+ else
+ {
+ USAGE ("too many file names specified");
+ }
+ }
+ }
+} /* scan_cmd_line */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_ftime
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_ftime (File_Info *target_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_ftime (target_file)
+ File_Info *target_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int status;
+
+#if (UNIX_BSD)
+ TIME_T timep[2];
+#endif /* (UNIX_BSD) */
+
+#if (UNIX_SYSV)
+ struct utimbuf utb;
+#endif /* (UNIX_SYSV) */
+
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ DEBUG_2 ("set_ftime: setting file `%s' time to %.24s",
+ target_file->file_spec, ctime (&(target_file->mod_time)));
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+#if (UNIX_SYSV)
+ utb.actime = target_file->mod_time;
+ utb.modtime = target_file->mod_time;
+ status = utime ((char *) target_file->file_spec, &utb);
+#endif /* (UNIX_SYSV) */
+
+#if (UNIX_BSD)
+ timep[0] = target_file->mod_time;
+ timep[1] = target_file->mod_time;
+ status = utime ((char *) target_file->file_spec, timep);
+#endif /* (UNIX_BSD) */
+
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (status != 0)
+ {
+ ERRORMSG_2 ("error setting file `%s' time to %.24s",
+ target_file->file_spec, ctime (&(target_file->mod_time)));
+ explain_error ();
+ }
+ return;
+
+} /* set_ftime */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_pipe_mode
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_pipe_mode (File_Info *target_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_pipe_mode (target_file)
+ File_Info *target_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ return;
+} /* set_pipe_mode */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** split_file_spec
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Unsigned16 split_file_spec (CONST char *full_spec,
+ char *preamble,
+ char *name,
+ char *extension,
+ char *postamble)
+#else /* NOT (ANSI_SYNTAX) */
+ Unsigned16 split_file_spec (full_spec, preamble, name,
+ extension, postamble)
+ CONST char *full_spec;
+ char *preamble;
+ char *name;
+ char *extension;
+ char *postamble;
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmp_full_spec[MAX_PATH + 1];
+ char *start_ptr;
+ char *tmp_ptr;
+ int idx;
+ Unsigned16 path_components;
+
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (preamble != NULL)
+ {
+ *preamble = '\0';
+ }
+ if (name != NULL)
+ {
+ *name = '\0';
+ }
+ if (extension != NULL)
+ {
+ *extension = '\0';
+ }
+ if (postamble != NULL)
+ {
+ *postamble = '\0';
+ }
+ path_components = FS_NOTHING;
+
+ if ((full_spec == NULL) || (*full_spec == '\0'))
+ {
+ return (path_components);
+ }
+
+ strcpy (tmp_full_spec, full_spec);
+ start_ptr = (char *) tmp_full_spec;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tmp_ptr = STRRSTR (start_ptr, ":/");
+
+ if (tmp_ptr != NULL)
+ {
+ path_components |= FS_PREAMBLE;
+
+ if (preamble != NULL)
+ {
+ for (idx = 0; ((idx < MAX_PREAMBLE) && (start_ptr <= tmp_ptr));
+ idx++)
+ {
+ *preamble++ = *start_ptr++;
+ }
+ *preamble = '\0';
+ }
+ start_ptr = ++tmp_ptr;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tmp_ptr = STRCHR (start_ptr, '.');
+
+ if (tmp_ptr != NULL)
+ {
+ path_components |= FS_EXTENSION;
+
+ if (extension != NULL)
+ {
+ strncpy (extension, tmp_ptr, MAX_EXT);
+ }
+ *tmp_ptr = '\0';
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (*start_ptr != '\0')
+ {
+ path_components |= FS_NAME;
+
+ if (name != NULL)
+ {
+ strncpy (name, start_ptr, MAX_NAME);
+ }
+ }
+
+ return (path_components);
+} /* split_file_spec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** tz_offset
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ TIME_T tz_offset (TIME_T the_time)
+#else /* NOT (ANSI_SYNTAX) */
+ TIME_T tz_offset (the_time)
+ TIME_T the_time;
+#endif /* (ANSI_SYNTAX) */
+{
+ struct tm *tm;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+#if (UNIX_BSD)
+ TIME_T timezone;
+ struct timeb timeb_struct;
+
+ ftime (&timeb_struct);
+ timezone = (TIME_T) timeb_struct.timezone * (TIME_T) 60;
+#endif /* (UNIX_BSD) */
+
+ tm = localtime (&the_time);
+
+ if (tm->tm_isdst > 0)
+ {
+ return (timezone - (TIME_T) 3600);
+ }
+ else
+ {
+ return (timezone);
+ }
+} /* tz_offset */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** user_message
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void user_message (CONST Int16 status,
+ CONST char *msg_str,
+ File_Info *log_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void user_message (status, msg_str, log_file)
+ CONST Int16 status;
+ CONST char *msg_str;
+ File_Info *log_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int to_stderr;
+ int to_logfile;
+ char *status_str;
+
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Check the value supplied for the message status and set the output
+ ** destinations accordingly.
+ **------------------------------------------------------------------------
+ */
+ to_logfile = TRUE;
+ to_stderr = FALSE;
+
+ switch (status)
+ {
+ case NORMAL_STATUS:
+ case LOG_STATUS:
+ status_str = "";
+ break;
+ case INFO_STATUS:
+ status_str = " -- ";
+ to_stderr = TRUE;
+ break;
+ case WARNING_STATUS:
+ status_str = "\nWARNING: ";
+ to_stderr = TRUE;
+ break;
+ case ERROR_STATUS:
+ status_str = "\nERROR: ";
+ to_stderr = TRUE;
+ break;
+ case FATAL_STATUS:
+ status_str = "\nFATAL: ";
+ to_stderr = TRUE;
+ break;
+ default:
+ INTERNAL_ERROR ("user_message");
+ vv_exit ();
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is NULL, just update the status and/or the message
+ ** show status.
+ **------------------------------------------------------------------------
+ */
+ if ((msg_str == NULL) || (*msg_str == '\0'))
+ {
+ if (status > G_status)
+ {
+ G_status = status;
+ }
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Make sure that we don't try to write to a NULL log file pointer.
+ **------------------------------------------------------------------------
+ */
+ if (log_file->file_ptr == (FILE *) NULL)
+ {
+ to_logfile = FALSE;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is to be sent to the log file and stderr, check whether
+ ** the log file output is also to stderr. If it is, disable the 'stderr'
+ ** output.
+ **------------------------------------------------------------------------
+ */
+ if (to_logfile && to_stderr)
+ {
+ if (log_file->file_ptr == stderr)
+ {
+ to_stderr = FALSE;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is to be sent to stderr, output it here.
+ **------------------------------------------------------------------------
+ */
+ if (to_stderr)
+ {
+ FPRINTF (stderr, "%s%s\n", status_str, msg_str);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is to be sent to the log file, output it here. If
+ ** debugging is enabled, report also the name of the calling function.
+ **------------------------------------------------------------------------
+ */
+ if (to_logfile)
+ {
+ FPRINTF (log_file->file_ptr, "%s%s\n", status_str, msg_str);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (status > G_status)
+ {
+ G_status = status;
+ }
+
+} /* user_message */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vv_exit
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void vv_exit (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void vv_exit ()
+#endif /* (ANSI_SYNTAX) */
+{
+ switch (G_status)
+ {
+ case LOG_STATUS:
+ case NORMAL_STATUS:
+ exit (0);
+ break;
+ case WARNING_STATUS:
+ exit (1);
+ break;
+ case ERROR_STATUS:
+ exit (2);
+ break;
+ case FATAL_STATUS:
+ default:
+ exit (3);
+ break;
+ }
+} /* vv_exit */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** write_bytes
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void write_bytes (CONST Int32 max_bytes,
+ CONST char *buffer,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void write_bytes (max_bytes, buffer, op_file)
+ CONST Int32 max_bytes;
+ CONST char *buffer;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 idx;
+
+ for (idx = 0L; idx < max_bytes; idx++)
+ {
+ fputc (buffer[(SIZE_T) idx], op_file->file_ptr);
+ }
+} /* write_bytes */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** write_record
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void write_record (CONST Int32 max_bytes,
+ CONST char *buffer,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void write_record (max_bytes, buffer, op_file)
+ CONST Int32 max_bytes;
+ CONST char *buffer;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ INTERNAL_ERROR ("write_record");
+} /* write_record */
diff --git a/support/vvcode/unix.mak b/support/vvcode/unix.mak
new file mode 100644
index 0000000000..bb28dcd135
--- /dev/null
+++ b/support/vvcode/unix.mak
@@ -0,0 +1,353 @@
+##############################################################################
+##############################################################################
+##
+## ARCHIVE HEADER INFORMATION
+##
+## @Make-file{
+## FILENAME = "unix.mak",
+## VERSION = "1.00",
+## DATE = "",
+## TIME = "",
+##
+## AUTHOR = "Niel Kempson",
+## ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+## TELEPHONE = "+44-242 579105",
+## EMAIL = "kempson@tex.ac.uk (Internet)",
+##
+## SUPPORTED = "yes",
+## ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+## KEYWORDS = "VVcode, Unix",
+##
+## CODETABLE = "ISO/ASCII",
+## CHECKSUM = "51492 1481 5732 57976",
+##
+## DOCSTRING = { This is the VVCODE makefile for different versions
+## of UNIX. Below is a list of the environments on
+## which VVCODE has been tested and found to work. Each
+## entry is preceded by a status character:
+##
+## + tested and believed to work
+## - tested but not all features available
+## (e.g. file timestamping)
+## ? not tested but should work
+## X believed not to work.
+##
+## If you port VVCODE to a new environment or find that
+## it works unchanged, please report back to the author
+## so that this file can be updated for everyone else.
+##
+## + Data General Aviion, GNU cc:
+## "make sysv-gcc"
+## + DEC MIPS, Ultrix 4.2, native cc:
+## "make bsd43"
+## + HP 730, SysV, native cc:
+## "make sysv"
+## + HP 9000/827, SysV, native cc:
+## "make sysv"
+## + IBM RS6000, AIX 3.2, native cc:
+## "make aix32"
+## + SCO Unix V.3.2, MSC compiler:
+## "make scosysv"
+## + Sequent Symmetry, Dynix v3.1.2, native cc:
+## "make sequent"
+## + SUN, SunOS 3.x & 4.1.x, native cc:
+## "make sunos"
+## + SUN, SunOS 3.x & 4.1.x, GNU cc:
+## "make sunos-gcc"
+## }
+## }
+##
+## MODULE CONTENTS
+##
+## [tbs]
+##
+## COPYRIGHT
+##
+## Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the terms of the GNU General Public License as
+## published by the Free Software Foundation; either version 1, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+##
+## In other words, you are welcome to use, share and improve this
+## program. You are forbidden to forbid anyone else to use, share
+## and improve what you give them. Help stamp out software-hoarding!
+##
+## CHANGE LOG
+##
+##############################################################################
+##############################################################################
+
+
+##############################################################################
+#
+# Local definitions for file types and compilation / linking.
+#
+# If your system is already supported it should not be necessary to modify
+# any part of the Makefile except the local definitions below.
+#
+# COMPILER/LINKER
+#
+# CC the command used to invoke the C compiler
+# CFLAGS compiler command line flags to be used
+# CCDEFINES symbols to be #defined when compiling
+#
+# LD the command used to invoke the linker
+# LDFLAGS linker command line flags to be used
+# LDLIBS linker command line option to search the specified
+# library files
+#
+# MAKE the command used to invoke Make to process this file.
+# As distributed, it is defined as "make -f unix.mak"
+#
+# The definitions are used to compile and link as shown below:
+#
+# Compiling C programs (e.g. xx.c)
+#
+# $(CC) -c $(CFLAGS) $(CCDEFINES) xx.c
+#
+# Linking object files (e.g. xx.o, yy.o & zz.o)
+#
+# $(LD) -o $@ $(LDFLAGS) xx.o yy.o zz.o $(LDLIBS)
+#
+# The 'vanilla' settings should usually be:
+#
+# CC = cc
+# CFLAGS = -g
+# LD = cc
+# LDFLAGS = -g
+#
+# For GNU C, the following settings are recommended:
+#
+# CC = gcc
+# CFLAGS = -g -Wall -Wmissing-prototypes -Wconversion
+# LD = gcc
+# LDFLAGS = -g
+#
+##############################################################################
+# Start of local definitions.
+#
+# NOTE: do not define CCDEFINES or LDLIBS below - they
+# will be set by the system-specific target selected.
+##############################################################################
+CC = cc
+CFLAGS = -g
+LD = cc
+LDFLAGS = -g
+MAKE = make -f unix.mak
+##############################################################################
+# End of local definitions.
+##############################################################################
+
+
+##############################################################################
+# File types and default rule for compilation
+##############################################################################
+EXE =
+OBJ = .o
+
+.SUFFIXES: .c .h $(OBJ) $(EXE)
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(CCDEFINES) $*.c
+
+
+##############################################################################
+# Target Groupings
+##############################################################################
+HDRFILES = checkos.h machine.h local.h globals.h specific.h vvutils.h
+
+OBJFILES = vvencode$(OBJ) vvdecode$(OBJ) vveparse$(OBJ) \
+ vvutils$(OBJ) unix$(OBJ)
+
+EXEFILES = vvencode$(EXE) vvdecode$(EXE)
+
+##############################################################################
+# Top level targets
+##############################################################################
+make:
+ @ echo 'You must specify the system for which VVCODE should be made.'
+ @ echo ''
+ @ echo 'For example: $(MAKE) bsd42'
+ @ echo ''
+ @ echo 'Valid system targets are:'
+ @ echo ''
+ @ echo ' clean, veryclean'
+ @ echo ' aix32, bsd41, bsd42, bsd43'
+ @ echo ' sequent, scosysv, sunos, sunos-gcc, sysv'
+
+vvcode: $(EXEFILES)
+
+clean:
+ @ echo 'Cleaning up ... '
+ -rm -f $(OBJFILES)
+
+veryclean:
+ @ echo 'Cleaning up ... '
+ -rm -f $(OBJFILES)
+ -rm -f $(EXEFILES)
+
+
+##############################################################################
+# Dependencies for executables
+##############################################################################
+vvencode$(EXE): vvencode$(OBJ) vvutils$(OBJ) unix$(OBJ)
+ $(LD) -o $@ $(LDFLAGS) vvencode$(OBJ) vvutils$(OBJ) unix$(OBJ) \
+ $(LDLIBS)
+
+vvdecode$(EXE): vvdecode$(OBJ) vveparse$(OBJ) vvutils$(OBJ) unix$(OBJ)
+ $(LD) -o $@ $(LDFLAGS) vvdecode$(OBJ) vveparse$(OBJ) \
+ vvutils$(OBJ) unix$(OBJ) $(LDLIBS)
+
+##############################################################################
+# Dependencies for object files
+##############################################################################
+vvencode$(OBJ): vvencode.c $(HDRFILES)
+
+vvdecode$(OBJ): vvdecode.c $(HDRFILES) vveparse.h
+
+vveparse$(OBJ): vveparse.c $(HDRFILES) vveparse.h
+
+vvutils$(OBJ): vvutils.c $(HDRFILES)
+
+unix$(OBJ): unix.c $(HDRFILES)
+
+
+##############################################################################
+##############################################################################
+##
+## ENVIRONMENT SPECIFIC TARGETS
+##
+## The following symbols may be defined using "-D" to affect the
+## compilation:
+##
+## BSD41 - BSD 4.1 target
+## BSD42 - BSD 4.2 target
+## BSD43 - BSD 4.3 target
+## MSC - A Microsoft C compiler is being used
+## SYSV - System V target
+## HAS_STRINGS_H - The header file for string functions is
+## <strings.h> rather than <string.h>
+## HAS_SYSUTIME_H - The function utime() is defined in
+## <sys/utime.h>. This is the default
+## assumption for BSD targets.
+## HAS_UTIME_H - The function utime() is defined in
+## <utime.h>. This is the default assumption
+## for SYSV targets.
+##############################################################################
+##############################################################################
+
+
+##############################################################################
+# IBM RS6000, AIX 3.2 BSD environment
+#
+# Normal BSD, as long as the BSD support library is linked in.
+##############################################################################
+aix32:
+ @ echo 'Making VVcode for IBM AIX 3.2 ... '
+ $(MAKE) vvcode CCDEFINES=-DBSD42 \
+ LDLIBS=-lbsd
+
+
+##############################################################################
+# BSD 4.1 environment
+#
+##############################################################################
+bsd41:
+ @ echo 'Making VVcode for BSD 4.1 Unix ... '
+ $(MAKE) vvcode CCDEFINES=-DBSD41
+
+
+##############################################################################
+# BSD 4.2 environment
+#
+##############################################################################
+bsd42:
+ @ echo 'Making VVcode for BSD 4.2 Unix ... '
+ $(MAKE) vvcode CCDEFINES=-DBSD42
+
+
+##############################################################################
+# BSD 4.3 environment
+#
+##############################################################################
+bsd43:
+ @ echo 'Making VVcode for BSD 4.3 Unix ... '
+ $(MAKE) vvcode CCDEFINES=-DBSD43
+
+
+##############################################################################
+# Sequent Symmetry Dynix V3.1 BSD environment
+#
+# Normal BSD, except that it has <strings.h> rather than the usual
+# <string.h>
+##############################################################################
+sequent:
+ @ echo 'Making VVcode for Sequent Symmetry DYNIX ... '
+ $(MAKE) vvcode CCDEFINES="-DSTRINGS_H -DBSD42"
+
+
+##############################################################################
+# SCO Unix v3.2.2 System V.3.2 environment, Microsoft C compiler
+#
+# Fairly normal SYSV, except for the non Unix-like compiler syntax.
+##############################################################################
+scosysv:
+ @ echo 'Making VVcode for SCO System V Unix ... '
+ $(MAKE) vvcode CCDEFINES="-DSYSV -DMSC" \
+ CFLAGS="-M3 -Od -Zd -Zi -W3" \
+ LDFLAGS="-M3 -Od -Zd"
+
+
+##############################################################################
+# SunOS 4.1.x Unix BSD environment, native compiler
+#
+# Normal BSD, except that it has <utime.h> rather than the usual
+# <sys/utime.h>
+##############################################################################
+sunos:
+ @ echo 'Making VVcode for SunOS BSD Unix ... '
+ $(MAKE) vvcode CCDEFINES="-DHAS_UTIME_H -DBSD42"
+
+
+##############################################################################
+# SunOS 4.1.x Unix BSD environment, GNU C compiler
+#
+# Normal BSD, except that it has <utime.h> rather than the usual
+# <sys/utime.h>
+##############################################################################
+sunos-gcc:
+ @ echo 'Making VVcode for SunOS BSD Unix using GNU C ... '
+ $(MAKE) vvcode CCDEFINES="-DHAS_UTIME_H -DBSD42" \
+ CC=gcc \
+ LD=gcc
+
+
+##############################################################################
+# System V environment
+#
+##############################################################################
+sysv:
+ @ echo 'Making VVcode for System V Unix ... '
+ $(MAKE) vvcode CCDEFINES=-DSYSV
+
+
+##############################################################################
+# System V environment, GNU C compiler
+#
+##############################################################################
+sysv-gcc:
+ @ echo 'Making VVcode for System V Unix using GNU C ... '
+ $(MAKE) vvcode CCDEFINES="-DHAS_UTIME_H -DSYSV" \
+ CC=gcc \
+ LD=gcc
diff --git a/support/vvcode/uucode.tbl b/support/vvcode/uucode.tbl
new file mode 100644
index 0000000000..6a64779e2b
--- /dev/null
+++ b/support/vvcode/uucode.tbl
@@ -0,0 +1,5 @@
+ !"#$%&'()*+,-./
+0123456789
+:;<=>?@
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+[\]^_
diff --git a/support/vvcode/vaxvms.c b/support/vvcode/vaxvms.c
new file mode 100644
index 0000000000..d987ab60eb
--- /dev/null
+++ b/support/vvcode/vaxvms.c
@@ -0,0 +1,2655 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "vaxvms.c",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet)",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+** MODULE CONTENTS
+**
+** apply_defaults - Apply default file name and extension to a
+** full file specification if either of these
+** components is missing.
+** confirm_yesno - Display a message to the user and wait for a
+** yes/no answer.
+** examine_file - Examine a file and determine its key features,
+** including mode, format, record length and
+** timestamp.
+** explain_error - Explain the reason for an error.
+** f_open_in - Open a file for input using the appropriate
+** mode, format etc for the file.
+** f_open_out - Open a file for output using the appropriate
+** mode, format etc for the file.
+** file_exists - Determine whether a file exists.
+** force_file_ext - Force the file extension of a full file
+** specification to a specified value.
+** is_a_file - Determine whether a file stream is connected
+** to a real file rather than a character
+** device, pipe etc.
+** legal_filespec - Takes an arbitrary string which may a file
+** specification from another operating system
+** and manipulates it to produce a legal file
+** specification for the current operating
+** system.
+** make_filespec - Construct a full file specification from
+** component parts.
+** prompt_for_string - Present a prompt string and accept a string
+** from the user.
+** read_bytes - Read bytes from a currently open file.
+** read_line - Read a line from a currently open (text) file.
+** read_record - Read a record from a currently open file.
+** scan_cmd_line - [tbs]
+** set_ftime - Set the timestamp of a file to a specified
+** value.
+** set_pipe_mode - Set the mode of a file stream connected to a
+** pipe, character device, redirected
+** stdin/stdout/stderr, in fact any non-file.
+** split_file_spec - Split a full file specification into its
+** component parts.
+** tz_offset - Determine the offset of local time from
+** Greenwich Mean Time (Coordinated Universal
+** Time) at a specified date and time.
+** user_message - Present a message to the user.
+** vv_exit - Exit the program, returning the appropriate
+** status to the operating system.
+** write_bytes - Write bytes to a currently open file.
+** write_record - Write a record to a currently open file.
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+static char rcsid[] = "$Id$";
+
+
+
+/*-
+**----------------------------------------------------------------------------
+** Standard include files
+**----------------------------------------------------------------------------
+*/
+#include <stdio.h>
+
+
+/*-
+**----------------------------------------------------------------------------
+** Include files
+**----------------------------------------------------------------------------
+*/
+#include "checkos.h"
+#include "machine.h"
+#include "local.h"
+#include "globals.h"
+#include "specific.h"
+#include "vvutils.h"
+
+
+/*-
+**----------------------------------------------------------------------------
+** VAX/VMS specific include files
+**----------------------------------------------------------------------------
+*/
+#include <atrdef.h>
+#include <climsgdef.h>
+#include <descrip.h>
+#include <fab.h>
+#include <fibdef.h>
+#include <iodef.h>
+#include <nam.h>
+#include <ssdef.h>
+
+/*-
+**----------------------------------------------------------------------------
+** VAX/VMS specific data types
+**----------------------------------------------------------------------------
+*/
+struct utimbuf
+{
+ TIME_T actime;
+ TIME_T modtime;
+};
+
+struct acb_struct
+{
+ unsigned short w_size;
+ unsigned short w_type;
+ void *l_addr;
+};
+
+typedef struct dsc$descriptor_s String_Desc;
+
+static char *month_list[] = {"???", "JAN", "FEB", "MAR", "APR",
+ "MAY", "JUN", "JUL", "AUG", "SEP",
+ "OCT", "NOV", "DEC", NULL};
+
+#define DUMMY_VMS_TIMESTAMP "15-FEB-1991 16:22:12.47"
+#define VMS_TIMESTAMP_FORMAT "%02d-%3s-%04d %02d:%02d:%02d.%02d"
+
+/*-
+**----------------------------------------------------------------------------
+** VAX/VMS specific functions
+**----------------------------------------------------------------------------
+*/
+Int32 CLI$PRESENT ARGS ((String_Desc * qualifier));
+Int32 CLI$GET_VALUE ARGS ((String_Desc * qualifier,
+ String_Desc * result,
+ short *length));
+static void parse_qualifier ARGS ((Qualifier_Struct *qual_struct));
+static void FABFIBNAM_setup ARGS ((CONST char *file_spec,
+ CONST char *def_file_spec,
+ unsigned short *chan_ptr,
+ struct FAB *fab_ptr,
+ struct fibdef *fib_ptr,
+ struct NAM *nam_ptr,
+ char *esa,
+ char *rsa));
+char *vms_to_vv_timestamp ARGS ((CONST char *vms_time_str));
+char *vv_to_vms_timestamp ARGS ((CONST char *vv_time_str));
+static Int32 vax_utime ARGS ((CONST char *file_spec,
+ CONST struct utimbuf * utime_struct));
+Unsigned32 *unix_to_vms_time ARGS ((CONST TIME_T unix_time));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** apply_defaults
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void apply_defaults (CONST char *default_name,
+ CONST char *default_ext,
+ char *full_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void apply_defaults (default_name, default_ext,
+ full_spec)
+ CONST char *default_name;
+ CONST char *default_ext;
+ char *full_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char name[MAX_NAME + 1];
+ char extension[MAX_EXT + 1];
+ Unsigned16 path_parts;
+ char preamble[MAX_PREAMBLE + 1];
+
+ path_parts = split_file_spec (full_spec, preamble, name, extension, NULL);
+
+
+ if (((path_parts & FS_NAME) == 0) && (default_name != NULL))
+ {
+ strncpy (name, default_name, MAX_NAME);
+ }
+
+ if (((path_parts & FS_EXTENSION) == 0) && (default_ext != NULL))
+ {
+ strncpy (extension, default_ext, MAX_EXT);
+ }
+
+ make_file_spec (preamble, name, extension, NULL, full_spec);
+} /* apply_defaults */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** confirm_yesno
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean confirm_yesno (CONST char *confirm_str)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean confirm_yesno (confirm_str)
+ CONST char *confirm_str;
+#endif /* (ANSI_SYNTAX) */
+{
+ int answer;
+
+ FPRINTF (stderr, "\n%s [Y/N]: ", confirm_str);
+ fflush (stderr);
+
+ do
+ {
+ answer = getchar ();
+
+ if (answer == EOF)
+ {
+ ERRORMSG ("EOF detected on standard input");
+ answer = 'N';
+ }
+ else
+ {
+ answer = TOUPPER (answer);
+ }
+ } while (!((answer == 'N') || (answer == 'Y')));
+
+ return ((answer == 'Y') ? (Boolean) TRUE : (Boolean) FALSE);
+} /* confirm_yesno */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** examine_file
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#define EX_SAMPLE_SIZE 512
+
+#if (ANSI_SYNTAX)
+ void examine_file (File_Info *ex_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void examine_file (ex_file)
+ File_Info *ex_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmp_buffer[EX_SAMPLE_SIZE];
+ int bytes_read;
+ int eol_count;
+ int i;
+ struct stat stat_buffer;
+ int status;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Initialize the File_Info structure before starting work. If the input
+ ** file is not a real file (i.e. a device or pipe), these are the values
+ ** that will be returned.
+ **------------------------------------------------------------------------
+ */
+ ex_file->mode = INV_MODE;
+ ex_file->format = INV_FORMAT;
+ ex_file->max_rec_len = INV_RECORD_LEN;
+ ex_file->lng_rec_len = INV_RECORD_LEN;
+ ex_file->mod_time = INV_TIMESTAMP;
+
+/*-
+**----------------------------------------------------------------------------
+** VMS RECORD FORMATS
+** ~~~~~~~~~~~~~~~~~~
+** RFM_UDF undefined (also stream binary)
+** S RFM_FIX fixed length records
+** S RFM_VAR variable length records
+** RFM_VFC variable fixed control
+** RFM_STM RMS-11 stream (valid only for sequential organization)
+** S RFM_STMLF LF stream (valid only for sequential organization)
+** RFM_STMCR CR stream (valid only for sequential organization)
+**
+** VMS RECORD ATTRIBUTES
+** ~~~~~~~~~~~~~~~~~~~~~
+** S RAT_FTN FORTRAN or none
+** S RAT_CR CR
+** RAT_PRN print
+** RAT_BLK block
+**----------------------------------------------------------------------------
+*/
+#define RFM_UDF 0
+#define RFM_FIX 1
+#define RFM_VAR 2
+#define RFM_VFC 3
+#define RFM_STM 4
+#define RFM_STMLF 5
+#define RFM_STMCR 6
+
+#define RAT_FTN 0
+#define RAT_CR 1
+#define RAT_PRN 2
+#define RAT_BLK 3
+
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ ex_file->file_ptr = fopen (ex_file->file_spec, "rb");
+
+ if (ex_file->file_ptr == (FILE *) NULL)
+ {
+ ERRORMSG_1 ("couldn't examine (open) file `%s'", ex_file->file_spec);
+ explain_error ();
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Test to see if the file is 'real'.
+ **------------------------------------------------------------------------
+ */
+ if (is_a_file (ex_file) == FALSE)
+ {
+ DEBUG_1 ("examine_file: `%s' is not a regular file",
+ ex_file->file_spec);
+ f_close (ex_file);
+ ex_file->pipe_flag = TRUE;
+ ex_file->file_ptr = (FILE *) NULL;
+ return;
+ }
+ f_close (ex_file);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ status = stat (ex_file->file_spec, &stat_buffer);
+
+ if (status != 0)
+ {
+ ERRORMSG_1 ("couldn't examine (stat) file `%s'", ex_file->file_spec);
+ explain_error ();
+ return;
+ }
+ ex_file->mod_time = stat_buffer.st_ctime;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Use the record attributes to determine whether the file is binary or
+ ** text.
+ **------------------------------------------------------------------------
+ */
+ switch (stat_buffer.st_fab_rat)
+ {
+ case RAT_CR:
+ case RAT_PRN:
+ ex_file->mode = MODE_TEXT;
+ break;
+ case RAT_FTN:
+ case RAT_BLK:
+ ex_file->mode = MODE_BINARY;
+ break;
+ default:
+ WARNMSG_2 ("file `%s' has an unsupported record attribute: %X",
+ ex_file->file_spec, (int) stat_buffer.st_fab_rfm);
+ break;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Use the record format to determine the file format. We support fixed,
+ ** variable and stream_lf files.
+ **------------------------------------------------------------------------
+ */
+ switch (stat_buffer.st_fab_rfm)
+ {
+ case RFM_FIX:
+ ex_file->format = FMT_FIXED;
+ break;
+ case RFM_VAR:
+ case RFM_VFC:
+ ex_file->format = FMT_VARIABLE;
+ break;
+ case RFM_STM:
+ case RFM_STMLF:
+ case RFM_STMCR:
+ ex_file->format = FMT_STREAM;
+ break;
+ case RFM_UDF:
+ default:
+ WARNMSG_2 ("file `%s' has an unsupported record format: %X",
+ ex_file->file_spec, (int) stat_buffer.st_fab_rfm);
+ break;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the file is fixed or variable format, determine the record length.
+ **------------------------------------------------------------------------
+ */
+ if ((ex_file->format == FMT_FIXED)
+ || (ex_file->format == FMT_VARIABLE))
+ {
+ ex_file->max_rec_len = stat_buffer.st_fab_mrs;
+ }
+
+ return;
+} /* examine_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** explain_error
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void explain_error (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void explain_error ()
+#endif /* (ANSI_SYNTAX) */
+{
+ INFOMSG_1 ("reason for error: %s", strerror (errno));
+} /* _error */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** f_open_in
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ FILE *f_open_in (File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ FILE *f_open_in (ip_file)
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ FILE *file_ptr;
+ char mrs_str[16]; /* "mrs = XXXXXX" */
+ char bls_str[16]; /* "bls = XXXXXX" */
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ switch (ip_file->mode)
+ {
+ case MODE_BINARY:
+ case MODE_TEXT:
+ break;
+ default:
+ ERRORMSG_1 ("invalid I/P file mode specified: %X", ip_file->mode);
+ return ((FILE *) NULL);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ switch (ip_file->format)
+ {
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ case FMT_FIXED:
+
+ if (ip_file->max_rec_len == INV_RECORD_LEN)
+ {
+ ip_file->max_rec_len = DEF_FIXED_RECORD_LEN;
+ }
+
+ if ((ip_file->max_rec_len < MIN_FIXED_RECORD_LEN)
+ || (ip_file->max_rec_len > MAX_FIXED_RECORD_LEN))
+ {
+ ERRORMSG_2 ("I/P file `%s' has invalid max fixed record \
+length specified: %ld",
+ ip_file->file_spec, ip_file->max_rec_len);
+ return ((FILE *) NULL);
+ }
+ SPRINTF (mrs_str, "mrs = %8ld", ip_file->max_rec_len);
+ SPRINTF (bls_str, "bls = %8ld", ip_file->max_rec_len);
+
+ switch (ip_file->mode)
+ {
+ case MODE_BINARY:
+ file_ptr = fopen (ip_file->file_spec, "rb", "rfm=fix",
+ "mbc=64", mrs_str, bls_str);
+ break;
+ case MODE_TEXT:
+ file_ptr = fopen (ip_file->file_spec, "r", "rfm=fix",
+ "mbc=64", mrs_str, bls_str);
+ break;
+ }
+ break;
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ case FMT_STREAM:
+
+ switch (ip_file->mode)
+ {
+ case MODE_BINARY:
+ file_ptr = fopen (ip_file->file_spec, "rb", "ctx=stm",
+ "mbc=64");
+ break;
+ case MODE_TEXT:
+ file_ptr = fopen (ip_file->file_spec, "r", "ctx=stm",
+ "mbc=64");
+ break;
+ }
+ break;
+
+ case FMT_VARIABLE:
+
+ if (ip_file->max_rec_len == INV_RECORD_LEN)
+ {
+ ip_file->max_rec_len = DEF_VARIABLE_RECORD_LEN;
+ }
+
+ if ((ip_file->max_rec_len < MIN_VARIABLE_RECORD_LEN)
+ || (ip_file->max_rec_len > MAX_VARIABLE_RECORD_LEN))
+ {
+ ERRORMSG_2 ("I/P file `%s' has invalid max variable record \
+length specified: %ld",
+ ip_file->file_spec, ip_file->max_rec_len);
+ return ((FILE *) NULL);
+ }
+ SPRINTF (mrs_str, "mrs = %8ld", ip_file->max_rec_len);
+
+ switch (ip_file->mode)
+ {
+ case MODE_BINARY:
+ file_ptr = fopen (ip_file->file_spec, "rb", "rfm=var",
+ "ctx=bin", "mbc=64");
+ break;
+ case MODE_TEXT:
+ file_ptr = fopen (ip_file->file_spec, "r", "rfm=var",
+ "rat=cr", "mbc=64");
+ break;
+ }
+ break;
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ default:
+ ERRORMSG_1 ("invalid I/P file format specified: %X",
+ ip_file->format);
+ return ((FILE *) NULL);
+ break;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (file_ptr == (FILE *) NULL)
+ {
+ ERRORMSG_1 ("error opening file `%s' for input", ip_file->file_spec);
+ explain_error ();
+ return ((FILE *) NULL);
+ }
+ return (file_ptr);
+} /* f_open_in */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** f_open_out
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ FILE *f_open_out (CONST Int16 overwrite_files,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ FILE *f_open_out (overwrite_files, op_file)
+ CONST Int16 overwrite_files;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ FILE *file_ptr;
+ char mrs_str[16]; /* "mrs = XXXXXX" */
+ char bls_str[16]; /* "bls = XXXXXX" */
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((overwrite_files != OVERWRITE_YES)
+ && (file_exists (op_file->file_spec)))
+ {
+ if (overwrite_files == OVERWRITE_ASK)
+ {
+ SPRINTF (G_tmp_msg, "File `%s' exists. Overwrite ?",
+ op_file->file_spec);
+
+ if (!confirm_yesno (G_tmp_msg))
+ {
+ INFOMSG ("operation cancelled");
+ return ((FILE *) NULL);
+ }
+ }
+ else
+ {
+ ERRORMSG_1 ("file `%s' exists", op_file->file_spec);
+ return ((FILE *) NULL);
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ switch (op_file->mode)
+ {
+ case MODE_BINARY:
+ case MODE_TEXT:
+ break;
+ default:
+ ERRORMSG_1 ("invalid O/P file mode specified: %X", op_file->mode);
+ return ((FILE *) NULL);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ switch (op_file->format)
+ {
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ case FMT_FIXED:
+
+ if (op_file->max_rec_len == INV_RECORD_LEN)
+ {
+ op_file->max_rec_len = DEF_FIXED_RECORD_LEN;
+ }
+
+ if ((op_file->max_rec_len < MIN_FIXED_RECORD_LEN)
+ || (op_file->max_rec_len > MAX_FIXED_RECORD_LEN))
+ {
+ ERRORMSG_2 ("O/P file `%s' has invalid max fixed record \
+length specified: %ld",
+ op_file->file_spec, op_file->max_rec_len);
+ return ((FILE *) NULL);
+ }
+ SPRINTF (mrs_str, "mrs = %8ld", op_file->max_rec_len);
+ SPRINTF (bls_str, "bls = %8ld", op_file->max_rec_len);
+
+ switch (op_file->mode)
+ {
+ case MODE_BINARY:
+ file_ptr = fopen (op_file->file_spec, "wb", "rfm=fix",
+ "mbc=64", mrs_str, bls_str);
+ break;
+ case MODE_TEXT:
+ file_ptr = fopen (op_file->file_spec, "w", "rfm=fix",
+ "mbc=64", mrs_str, bls_str);
+ break;
+ }
+ break;
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ case FMT_STREAM:
+
+ switch (op_file->mode)
+ {
+ case MODE_BINARY:
+ file_ptr = fopen (op_file->file_spec, "wb", "ctx=stm",
+ "mbc=64");
+ break;
+ case MODE_TEXT:
+ file_ptr = fopen (op_file->file_spec, "w", "ctx=stm",
+ "mbc=64");
+ break;
+ }
+ break;
+
+ case FMT_VARIABLE:
+
+ if (op_file->max_rec_len == INV_RECORD_LEN)
+ {
+ op_file->max_rec_len = DEF_VARIABLE_RECORD_LEN;
+ }
+
+ if ((op_file->max_rec_len < MIN_VARIABLE_RECORD_LEN)
+ || (op_file->max_rec_len > MAX_VARIABLE_RECORD_LEN))
+ {
+ ERRORMSG_2 ("O/P file `%s' has invalid max variable record \
+length specified: %ld",
+ op_file->file_spec, op_file->max_rec_len);
+ return ((FILE *) NULL);
+ }
+ SPRINTF (mrs_str, "mrs = %8ld", op_file->max_rec_len);
+
+ switch (op_file->mode)
+ {
+ case MODE_BINARY:
+ file_ptr = fopen (op_file->file_spec, "wb", "rfm=var",
+ mrs_str, "ctx=bin", "mbc=64");
+ break;
+ case MODE_TEXT:
+ file_ptr = fopen (op_file->file_spec, "w", "rfm=var",
+ mrs_str, "rat=cr", "mbc=64");
+ break;
+ }
+ break;
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ default:
+ ERRORMSG_1 ("invalid O/P file format specified: %X",
+ op_file->format);
+ return ((FILE *) NULL);
+ break;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (file_ptr == (FILE *) NULL)
+ {
+ ERRORMSG_1 ("error opening file `%s' for output", op_file->file_spec);
+ explain_error ();
+ return ((FILE *) NULL);
+ }
+ return (file_ptr);
+} /* f_open_out */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** file_exists
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean file_exists (CONST char *file_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean file_exists (file_spec)
+ CONST char *file_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ return ((Boolean) (access ((char *) file_spec, 0) == 0));
+} /* file_exists */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** force_file_ext
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void force_file_ext (CONST char *forced_ext,
+ char *full_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void force_file_ext (forced_ext, full_spec)
+ CONST char *forced_ext;
+ char *full_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char name[MAX_NAME + 1];
+ char preamble[MAX_PREAMBLE + 1];
+
+ if (forced_ext == NULL)
+ {
+ return;
+ }
+ (void) split_file_spec (full_spec, preamble, name, NULL, NULL);
+ make_file_spec (preamble, name, forced_ext, NULL, full_spec);
+} /* force_file_ext */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** is_a_file
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean is_a_file (CONST File_Info *ex_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean is_a_file (ex_file)
+ CONST File_Info *ex_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int file_handle;
+
+ file_handle = fileno (ex_file->file_ptr);
+
+ if ((isatty (file_handle) == 1) || (isapipe (file_handle) == 1))
+ {
+ return (FALSE);
+ }
+ else
+ {
+ return (TRUE);
+ }
+} /* is_a_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** legal_filespec
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *legal_filespec (CONST char *hdrf_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ char *legal_filespec (hdrf_spec)
+ CONST char *hdrf_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmpf_name[MAX_NAME + 1];
+ char tmpf_ext[MAX_EXT + 1];
+ char *tmpf_spec;
+ char *tmp_ptr;
+ static char opf_spec[MAX_PATH + 1];
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tmpf_spec = STRDUP (hdrf_spec);
+ tmp_ptr = STRCHR (tmpf_spec, '.');
+
+ if (tmp_ptr != NULL)
+ {
+ strncpy (tmpf_ext, tmp_ptr, MAX_EXT);
+ tmpf_ext[MAX_EXT] = '\0';
+ *tmp_ptr = '\0';
+ }
+ else
+ {
+ strcpy (tmpf_ext, "");
+ }
+ strncpy (tmpf_name, tmpf_spec, MAX_NAME);
+ tmpf_name[MAX_NAME] = '\0';
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (tmp_ptr = tmpf_name; *tmp_ptr != '\0'; tmp_ptr++)
+ {
+ if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL)
+ {
+ *tmp_ptr = REPLACEMENT_FILESPEC_CHAR;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (tmp_ptr = tmpf_ext + 1; *tmp_ptr != '\0'; tmp_ptr++)
+ {
+ if (STRCHR (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL)
+ {
+ *tmp_ptr = REPLACEMENT_FILESPEC_CHAR;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ strcpy (opf_spec, tmpf_name);
+ strcat (opf_spec, tmpf_ext);
+
+ if (strcmp (hdrf_spec, opf_spec) != 0)
+ {
+ WARNMSG_2 ("suspicious header file spec `%s' changed to `%s'",
+ hdrf_spec, opf_spec);
+ }
+ return (opf_spec);
+} /* legal_filespec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** make_file_spec
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void make_file_spec (CONST char *preamble,
+ CONST char *name,
+ CONST char *extension,
+ CONST char *postamble,
+ char *full_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void make_file_spec (preamble, name, extension,
+ postamble, full_spec)
+ CONST char *preamble;
+ CONST char *name;
+ CONST char *extension;
+ CONST char *postamble;
+ char *full_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ int len;
+ char *tmp_ptr;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Start with an empty string and append components of the file
+ ** specification only if they exist.
+ **------------------------------------------------------------------------
+ */
+ strcpy (full_spec, "");
+
+ /*-
+ **------------------------------------------------------------------------
+ ** The preamble component corresponds to the VAX/VMS node, device,
+ ** directory and/or logical name components in the form:
+ **
+ ** node::
+ ** node::device:[dir1.dir2]
+ ** node::device:<dir1.dir2>
+ ** logical_name:
+ **
+ ** If the preamble component does not end in ']', '>' or ':', we assume
+ ** that it is a logical name and ':' is appended only if the component
+ ** is not empty.
+ **------------------------------------------------------------------------
+ */
+ if ((preamble != NULL) && (*preamble != '\0'))
+ {
+ strncat (full_spec, preamble, MAX_PREAMBLE);
+ len = strlen (preamble);
+ tmp_ptr = STRCHR ("]>:", preamble[len - 1]);
+
+ if ((tmp_ptr == NULL) && (len < MAX_PREAMBLE))
+ {
+ strcat (full_spec, ":");
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Simply append the name if it is present.
+ **------------------------------------------------------------------------
+ */
+ if (name != NULL)
+ {
+ strncat (full_spec, name, MAX_NAME);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the extension component does not begin with '.', prepend '.' before
+ ** appending the extension to the file specification.
+ **------------------------------------------------------------------------
+ */
+ if ((extension != NULL) && (*extension != '\0'))
+ {
+ if (*extension != '.')
+ {
+ strcat (full_spec, ".");
+ strncat (full_spec, extension, MAX_EXT - 1);
+ }
+ else
+ {
+ strncat (full_spec, extension, MAX_EXT);
+ }
+ }
+
+
+ /*-
+ **------------------------------------------------------------------------
+ ** The postamble component of a VAX/VMS file specification is the version
+ ** number of the file and is introduced with ';' or unusually '.':
+ **
+ ** node::device:[dir1.dir2]name.extension;version
+ ** node::device:[dir1.dir2]name.extension.version
+ **
+ ** The postamble component must be an integer in the range +/- 65535.
+ **
+ ** If the postamble component does not begin with ';', prepend ';' before
+ ** appending the postamble to the file specification.
+ **------------------------------------------------------------------------
+ */
+ if ((postamble != NULL) && (*postamble != '\0'))
+ {
+ if (*postamble != ';')
+ {
+ strcat (full_spec, ";");
+ strncat (full_spec, postamble, MAX_POSTAMBLE - 1);
+ }
+ else
+ {
+ strncat (full_spec, postamble, MAX_POSTAMBLE);
+ }
+ }
+} /* make_file_spec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** prompt_for_string
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void prompt_for_string (CONST char *confirm_str,
+ CONST Int16 buf_size,
+ char *return_buffer)
+#else /* NOT (ANSI_SYNTAX) */
+ void prompt_for_string (confirm_str, buf_size,
+ return_buffer)
+ CONST char *confirm_str;
+ CONST Int16 buf_size;
+ char *return_buffer;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *status;
+
+ FPRINTF (stderr, "\n%s", confirm_str);
+ fflush (stderr);
+ status = fgets (return_buffer, (int) buf_size, stdin);
+
+ if (status == NULL)
+ {
+ FATALMSG ("error reading string from stdin");
+ explain_error ();
+ vv_exit ();
+ }
+
+ status = STRCHR (return_buffer, '\n');
+ if (status != NULL)
+ {
+ *status = '\0';
+ }
+} /* prompt_for_string */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_bytes
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 read_bytes (CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 read_bytes (max_bytes, buffer, ip_file)
+ CONST Int32 max_bytes;
+ char *buffer;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 idx;
+ int temp;
+
+ for (idx = 0L; idx < max_bytes; idx++)
+ {
+ temp = fgetc (ip_file->file_ptr);
+
+ if (temp == EOF)
+ {
+ if (ferror (ip_file->file_ptr))
+ {
+ return (-2L);
+ }
+
+ if (idx == 0)
+ {
+ return (-1L);
+ }
+ break;
+ }
+ buffer[(SIZE_T) idx] = (char) temp;
+ }
+ return (idx);
+} /* read_bytes */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_line
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 read_line (CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 read_line (max_bytes, buffer, ip_file)
+ CONST Int32 max_bytes;
+ char *buffer;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *tmp_ptr;
+
+ tmp_ptr = fgets (buffer, (int) max_bytes, ip_file->file_ptr);
+ buffer[(SIZE_T) (max_bytes - 1)] = '\0';
+
+ if (tmp_ptr == NULL)
+ {
+ if (ferror (ip_file->file_ptr))
+ {
+ return (-2L);
+ }
+
+ if (feof (ip_file->file_ptr))
+ {
+ return (-1L);
+ }
+ }
+ return ((Int32) strlen (buffer));
+} /* read_line */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_record
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 read_record (CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 read_record (max_bytes, buffer, ip_file)
+ CONST Int32 max_bytes;
+ char *buffer;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 bytes_read;
+ int file_handle;
+
+ file_handle = fileno (ip_file->file_ptr);
+ bytes_read = read (file_handle, buffer, max_bytes);
+
+ if (ferror (ip_file->file_ptr))
+ {
+ return (-2L);
+ }
+
+ if (feof (ip_file->file_ptr))
+ {
+ return (-1L);
+ }
+ return (bytes_read);
+} /* read_record */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** scan_cmd_line
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void scan_cmd_line (CONST int qargc,
+ CONST char *qargv[],
+ CONST char *q_intro_str,
+ CONST char *q_sep_str,
+ Qualifier_Struct *qual_array,
+ Qualifier_Struct *qual_ipfile,
+ Qualifier_Struct *qual_opfile)
+#else /* NOT (ANSI_SYNTAX) */
+ void scan_cmd_line (qargc, qargv, q_intro_str,
+ q_sep_str, qual_array, qual_ipfile,
+ qual_opfile)
+ CONST int qargc;
+ CONST char *qargv[];
+ CONST char *q_intro_str;
+ CONST char *q_sep_str;
+ Qualifier_Struct *qual_array;
+ Qualifier_Struct *qual_ipfile;
+ Qualifier_Struct *qual_opfile;
+#endif /* (ANSI_SYNTAX) */
+{
+ int qual_no;
+ char *tmp_buffer;
+ char *tmp_ptr;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Loop through each of the available command qualifiers and call a
+ ** separate function to parse that qualifier.
+ **------------------------------------------------------------------------
+ */
+ for (qual_no = 0; qual_array[qual_no].q_string != NULL; qual_no++)
+ {
+ parse_qualifier (&qual_array[qual_no]);
+
+ if ((qual_no == CMDQ_DEBUG) && (qual_array[qual_no].present == TRUE))
+ {
+ G_debugging = TRUE;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If VVcode was invoked with the /HELP qualifier return now before
+ ** attempting to parse the input or output file parameters. We do this
+ ** to allow the user to issue the command VVENCODE /HELP without
+ ** those parameters.
+ **------------------------------------------------------------------------
+ */
+ if (qual_array[CMDQ_HELP].present == TRUE)
+ {
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Now parse the parameters for the input and output files - it's the
+ ** same mechanism as for qualifiers.
+ **------------------------------------------------------------------------
+ */
+ parse_qualifier (qual_ipfile);
+ parse_qualifier (qual_opfile);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Because this is a VMS implementation, it is more natural to allow the
+ ** user to enter timestamps in the usual VMS format. If the /TIMESTAMP
+ ** qualifier was specified the CLI routines would have converted whatever
+ ** was entered into the VMS timestam format: "DD-MM-YYYY HH:MM:SS.CC" so
+ ** we convert that back to VVcode internal format.
+ **------------------------------------------------------------------------
+ */
+ if (qual_array[CMDQ_TIMESTAMP].present == TRUE)
+ {
+ tmp_ptr = (char *) qual_array[CMDQ_TIMESTAMP].value;
+ tmp_buffer = STRDUP (tmp_ptr);
+ strcpy (tmp_ptr, vms_to_vv_timestamp (tmp_buffer));
+ }
+} /* scan_cmd_line */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_ftime
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_ftime (File_Info *target_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_ftime (target_file)
+ File_Info *target_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int status;
+ struct utimbuf utb;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ DEBUG_2 ("set_ftime: setting file `%s' time to %.24s",
+ target_file->file_spec, ctime (&(target_file->mod_time)));
+
+ utb.actime = target_file->mod_time;
+ utb.modtime = target_file->mod_time;
+ status = vax_utime (target_file->file_spec, &utb);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (status != 0)
+ {
+ ERRORMSG_2 ("error setting file `%s' time to %.24s",
+ target_file->file_spec, ctime (&(target_file->mod_time)));
+ explain_error ();
+ }
+ return;
+
+} /* set_ftime */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_pipe_mode
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_pipe_mode (File_Info *target_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_pipe_mode (target_file)
+ File_Info *target_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ return;
+} /* set_pipe_mode */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** split_file_spec
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Unsigned16 split_file_spec (CONST char *full_spec,
+ char *preamble,
+ char *name,
+ char *extension,
+ char *postamble)
+#else /* NOT (ANSI_SYNTAX) */
+ Unsigned16 split_file_spec (full_spec, preamble, name,
+ extension, postamble)
+ CONST char *full_spec;
+ char *preamble;
+ char *name;
+ char *extension;
+ char *postamble;
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmp_full_spec[MAX_PATH + 1];
+ char *start_ptr;
+ char *tmp_ptr;
+ int idx;
+ Unsigned16 path_components;
+
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (preamble != NULL)
+ {
+ *preamble = '\0';
+ }
+ if (name != NULL)
+ {
+ *name = '\0';
+ }
+ if (extension != NULL)
+ {
+ *extension = '\0';
+ }
+ if (postamble != NULL)
+ {
+ *postamble = '\0';
+ }
+ path_components = FS_NOTHING;
+
+ if ((full_spec == NULL) || (*full_spec == '\0'))
+ {
+ return (path_components);
+ }
+
+ strcpy (tmp_full_spec, full_spec);
+ start_ptr = (char *) tmp_full_spec;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** The preamble component corresponds to the VAX/VMS node, device,
+ ** directory and/or logical name components in the form:
+ **
+ ** node::
+ ** node::device:[dir1.dir2]
+ ** node::device:<dir1.dir2>
+ ** node::logical_name:
+ **
+ ** The preamble can end in "::", ":", "]" or ">" and we need to find the
+ ** LAST occurrence of any of these items in the file specification.
+ **
+ ** If the preamble component does not end in ']', '>' or ':', we assume
+ ** that it is a logical name and ':' is appended only if the component
+ ** is not empty.
+ **------------------------------------------------------------------------
+ */
+ tmp_ptr = STRRSTR (start_ptr, ":]>");
+
+ if (tmp_ptr != NULL)
+ {
+ path_components |= FS_PREAMBLE;
+
+ if (preamble != NULL)
+ {
+ for (idx = 0; ((idx < MAX_PREAMBLE) && (start_ptr <= tmp_ptr));
+ idx++)
+ {
+ *preamble++ = *start_ptr++;
+ }
+ *preamble = '\0';
+ }
+ start_ptr = ++tmp_ptr;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** The postamble component of a VAX/VMS file specification is the version
+ ** number of the file and is introduced with ';' or unusually '.':
+ **
+ ** node::device:[dir1.dir2]name.extension;version
+ ** node::device:[dir1.dir2]name;version
+ ** node::device:[dir1.dir2]name.extension
+ ** node::device:[dir1.dir2]name.extension.version
+ **
+ ** We support only the ';' style of version number at the moment.
+ **------------------------------------------------------------------------
+ */
+ tmp_ptr = STRCHR (start_ptr, ';');
+
+ if (tmp_ptr != NULL)
+ {
+ path_components |= FS_POSTAMBLE;
+
+ if (postamble != NULL)
+ {
+ strncpy (postamble, tmp_ptr, MAX_POSTAMBLE);
+ }
+ *tmp_ptr = '\0';
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tmp_ptr = STRCHR (start_ptr, '.');
+ if (tmp_ptr != NULL)
+ {
+ path_components |= FS_EXTENSION;
+
+ if (extension != NULL)
+ {
+ strncpy (extension, tmp_ptr, MAX_EXT);
+ }
+ *tmp_ptr = '\0';
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (*start_ptr != '\0')
+ {
+ path_components |= FS_NAME;
+
+ if (name != NULL)
+ {
+ strncpy (name, start_ptr, MAX_NAME);
+ }
+ }
+
+ return (path_components);
+} /* split_file_spec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** tz_offset
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ TIME_T tz_offset (TIME_T the_time)
+#else /* NOT (ANSI_SYNTAX) */
+ TIME_T tz_offset (the_time)
+ TIME_T the_time;
+#endif /* (ANSI_SYNTAX) */
+{
+ return (0);
+} /* tz_offset */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** user_message
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void user_message (CONST Int16 status,
+ CONST char *msg_str,
+ File_Info *log_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void user_message (status, msg_str, log_file)
+ CONST Int16 status;
+ CONST char *msg_str;
+ File_Info *log_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int to_stderr;
+ int to_logfile;
+ char *status_str;
+
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Check the value supplied for the message status and set the output
+ ** destinations accordingly.
+ **------------------------------------------------------------------------
+ */
+ to_logfile = TRUE;
+ to_stderr = FALSE;
+
+ switch (status)
+ {
+ case NORMAL_STATUS:
+ case LOG_STATUS:
+ status_str = "";
+ break;
+ case INFO_STATUS:
+ status_str = "-VV-I-INFO, ";
+ to_stderr = TRUE;
+ break;
+ case WARNING_STATUS:
+ status_str = "%VV-W-WARNING, ";
+ to_stderr = TRUE;
+ break;
+ case ERROR_STATUS:
+ status_str = "%VV-E-ERROR, ";
+ to_stderr = TRUE;
+ break;
+ case FATAL_STATUS:
+ status_str = "%VV-F-FATAL, ";
+ to_stderr = TRUE;
+ break;
+ default:
+ INTERNAL_ERROR ("user_message");
+ vv_exit ();
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is NULL, just update the status and/or the message
+ ** show status.
+ **------------------------------------------------------------------------
+ */
+ if ((msg_str == NULL) || (*msg_str == '\0'))
+ {
+ if (status > G_status)
+ {
+ G_status = status;
+ }
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Make sure that we don't try to write to a NULL log file pointer.
+ **------------------------------------------------------------------------
+ */
+ if (log_file->file_ptr == (FILE *) NULL)
+ {
+ to_logfile = FALSE;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is to be sent to the log file and stderr, check whether
+ ** the log file output is also to stderr. If it is, disable the 'stderr'
+ ** output.
+ **------------------------------------------------------------------------
+ */
+ if (to_logfile && to_stderr)
+ {
+ if (log_file->file_ptr == stderr)
+ {
+ to_stderr = FALSE;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is to be sent to stderr, output it here.
+ **------------------------------------------------------------------------
+ */
+ if (to_stderr)
+ {
+ FPRINTF (stderr, "%s%s\n", status_str, msg_str);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is to be sent to the log file, output it here. If
+ ** debugging is enabled, report also the name of the calling function.
+ **------------------------------------------------------------------------
+ */
+ if (to_logfile)
+ {
+ FPRINTF (log_file->file_ptr, "%s%s\n", status_str, msg_str);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (status > G_status)
+ {
+ G_status = status;
+ }
+} /* user_message */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vv_exit
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void vv_exit (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void vv_exit ()
+#endif /* (ANSI_SYNTAX) */
+{
+ switch (G_status)
+ {
+ case INFO_STATUS:
+ case LOG_STATUS:
+ case NORMAL_STATUS:
+ exit (0x10000001L);
+ break;
+ case WARNING_STATUS:
+ exit (0x10000000L);
+ exit (1);
+ break;
+ case ERROR_STATUS:
+ exit (0x10000002L);
+ break;
+ case FATAL_STATUS:
+ default:
+ exit (0x10000004L);
+ break;
+ }
+} /* vv_exit */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** write_bytes
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void write_bytes (CONST Int32 max_bytes,
+ CONST char *buffer,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void write_bytes (max_bytes, buffer, op_file)
+ CONST Int32 max_bytes;
+ CONST char *buffer;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 idx;
+
+ for (idx = 0L; idx < max_bytes; idx++)
+ {
+ fputc (buffer[(SIZE_T) idx], op_file->file_ptr);
+ }
+} /* write_bytes */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** write_record
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void write_record (CONST Int32 max_bytes,
+ CONST char *buffer,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void write_record (max_bytes, buffer, op_file)
+ CONST Int32 max_bytes;
+ CONST char *buffer;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 no_bytes;
+
+ no_bytes = max_bytes * sizeof (char);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Check that the buffer does not exceed the maximum allowable record
+ ** length. If it does, truncate the record and issue a warning.
+ **------------------------------------------------------------------------
+ */
+ if ((op_file->max_rec_len > 0) && (no_bytes > op_file->max_rec_len))
+ {
+ ERRORMSG_2 ("output record too long (%ld bytes, max = %ld) - truncated",
+ no_bytes, op_file->max_rec_len);
+ no_bytes = op_file->max_rec_len;
+ }
+ fwrite (buffer, (SIZE_T) no_bytes, 1, op_file->file_ptr);
+} /* write_record */
+
+
+
+/*-
+******************************************************************************
+******************************************************************************
+**
+** VAX/VMS specific functions private to this module.
+**
+******************************************************************************
+******************************************************************************
+*/
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** [tbs]
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs] - [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ static void parse_qualifier (Qualifier_Struct *qual_struct)
+#else /* NOT (ANSI_SYNTAX) */
+ static void parse_qualifier (qual_struct)
+ Qualifier_Struct *qual_struct;
+#endif /* (ANSI_SYNTAX) */
+{
+ int status;
+ String_Desc qual_desc;
+ String_Desc result_desc;
+ short length;
+ char *tmp_str;
+ char *tmp_ptr;
+ char tmp_buffer[MAX_IP_LINE_LEN];
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tmp_str = STRDUP (qual_struct->q_string);
+ for (tmp_ptr = tmp_str; *tmp_ptr != '\0'; tmp_ptr++)
+ {
+ *tmp_ptr = TOUPPER (*tmp_ptr);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ qual_desc.dsc$w_length = strlen (tmp_str);
+ qual_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+ qual_desc.dsc$b_class = DSC$K_CLASS_S;
+ qual_desc.dsc$a_pointer = tmp_str;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ result_desc.dsc$w_length = sizeof (tmp_buffer) - 1;
+ result_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+ result_desc.dsc$b_class = DSC$K_CLASS_S;
+ result_desc.dsc$a_pointer = tmp_buffer;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ qual_struct->value = NULL;
+ status = CLI$PRESENT (&qual_desc);
+ switch (status)
+ {
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ case CLI$_COMMA:
+ case CLI$_DEFAULTED:
+ case CLI$_PRESENT:
+ qual_struct->present = TRUE;
+ status = CLI$GET_VALUE (&qual_desc, &result_desc, &length);
+
+ /*-
+ **----------------------------------------------------------------
+ **
+ **----------------------------------------------------------------
+ */
+ switch (status)
+ {
+ case CLI$_COMMA:
+ case CLI$_CONCAT:
+ case SS$_NORMAL:
+ tmp_buffer[length] = '\0';
+ qual_struct->value = STRDUP (tmp_buffer);
+ DEBUG_2 ("parse_qualifier: `/%s' present, value = `%s'",
+ qual_struct->q_string, qual_struct->value);
+ break;
+ case CLI$_ABSENT:
+ DEBUG_1 ("parse_qualifier: `/%s' present, no value given",
+ qual_struct->q_string);
+ break;
+ default:
+ FATALMSG_1 ("parse_qualifier: error parsing value of `/%s'",
+ qual_struct->q_string);
+ explain_error ();
+ vv_exit ();
+ break;
+ }
+ break;
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ case CLI$_LOCNEG:
+ case CLI$_ABSENT:
+ case CLI$_NEGATED:
+ qual_struct->present = FALSE;
+ DEBUG_1 ("parse_qualifier: `/%s' not present",
+ qual_struct->q_string);
+ break;
+ default:
+ FATALMSG_1 ("error checking qualifier `%s'", qual_struct->q_string);
+ explain_error ();
+ vv_exit ();
+ break;
+ }
+ free (tmp_str);
+} /* parse_qualifier */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** [tbs]
+**
+** DESCRIPTION
+**
+** Perform FAB & NAM initialization.
+**
+** INPUT PARAMETERS
+**
+** file_spec - file specification
+** def_file_spec - default file specification
+** fab_ptr - FAB to initialize
+** fib_ptr - FIB to initialize
+** nam_block_ptr - NAM block for FAB to use
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ static void FABFIBNAM_setup (CONST char *file_spec,
+ CONST char *def_file_spec,
+ unsigned short *chan_ptr,
+ struct FAB *fab_ptr,
+ struct fibdef *fib_ptr,
+ struct NAM *nam_ptr,
+ char *esa,
+ char *rsa)
+#else /* NOT (ANSI_SYNTAX) */
+ static void FABFIBNAM_setup (file_spec, def_file_spec, chan_ptr,
+ fab_ptr, fib_ptr, nam_ptr, esa, rsa)
+ CONST char *file_spec;
+ CONST char *def_file_spec;
+ unsigned short *chan_ptr;
+ struct FAB *fab_ptr;
+ struct fibdef *fib_ptr;
+ struct NAM *nam_ptr;
+ char *esa;
+ char *rsa;
+#endif /* (ANSI_SYNTAX) */
+{
+ int status;
+ String_Desc dev_name;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Initialize FAB.
+ **------------------------------------------------------------------------
+ */
+ memset (fab_ptr, 0, sizeof (*fab_ptr));
+ fab_ptr->fab$b_bln = FAB$C_BLN;
+ fab_ptr->fab$b_bid = FAB$C_BID;
+ fab_ptr->fab$l_nam = nam_ptr;
+ fab_ptr->fab$b_fns = strlen (file_spec) & NAM$C_MAXRSS;
+ fab_ptr->fab$l_fna = file_spec;
+ fab_ptr->fab$b_dns = strlen (def_file_spec) & NAM$C_MAXRSS;
+ fab_ptr->fab$l_dna = def_file_spec;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Initialize NAM.
+ **------------------------------------------------------------------------
+ */
+ memset (nam_ptr, 0, sizeof (*nam_ptr));
+ nam_ptr->nam$b_bln = NAM$C_BLN;
+ nam_ptr->nam$b_bid = NAM$C_BID;
+ nam_ptr->nam$l_esa = esa;
+ nam_ptr->nam$b_ess = NAM$C_MAXRSS;
+ nam_ptr->nam$l_rsa = rsa;
+ nam_ptr->nam$b_rss = NAM$C_MAXRSS;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Initialize the FIB.
+ **------------------------------------------------------------------------
+ */
+ memset (fib_ptr, 0, sizeof (*fib_ptr));
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Use SYS$PARSE to determine the current device.
+ **------------------------------------------------------------------------
+ */
+ status = sys$parse (fab_ptr, 0, 0);
+ if ((status & 1) != 1)
+ {
+ FATALMSG ("FABFIBNAM_setup: couldn't parse current device");
+ explain_error ();
+ LIB$SIGNAL (status);
+ vv_exit ();
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ ** Initialize the 'dev_name' descriptor
+ **--------------------------------------------------------------------
+ */
+ dev_name.dsc$w_length = nam_ptr->nam$t_dvi[0] & NAM$C_MAXRSS;
+ dev_name.dsc$b_dtype = DSC$K_DTYPE_T;
+ dev_name.dsc$b_class = DSC$K_CLASS_S;
+ dev_name.dsc$a_pointer = (char *) &(nam_ptr->nam$t_dvi[1]);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** Assign a channel to the file's device
+ **--------------------------------------------------------------------
+ */
+ status = sys$assign (&dev_name, chan_ptr, 0, 0);
+
+ if ((status & 1) != 1)
+ {
+ FATALMSG_2 ("FABFIBNAM_setup: couldn't assign device `%*s'\n",
+ dev_name.dsc$a_pointer, dev_name.dsc$w_length);
+ explain_error ();
+ LIB$SIGNAL (status);
+ vv_exit ();
+ }
+} /* FABFIBNAM_setup */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** [tbs]
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs] - [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *vms_to_vv_timestamp (CONST char *vms_time_str)
+#else /* NOT (ANSI_SYNTAX) */
+ char *vms_to_vv_timestamp (vms_time_str)
+ CONST char *vms_time_str;
+#endif /* (ANSI_SYNTAX) */
+{
+ static char *vv_time_str = DUMMY_VV_TIMESTAMP;
+ char *mstring = "XXX";
+ int year;
+ int month;
+ int mday;
+ int hours;
+ int mins;
+ int secs;
+ int centi_secs;
+ int status;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((vms_time_str == NULL) || (*vms_time_str == '\0'))
+ {
+ strcpy (vv_time_str, "");
+ return (vv_time_str);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ DEBUG_1 ("vms_to_vv_timestamp: VMS timestamp provided = `%s'",
+ vms_time_str);
+
+ status = sscanf (vms_time_str, VMS_TIMESTAMP_FORMAT,
+ &mday, mstring, &year,
+ &hours, &mins, &secs, &centi_secs);
+ month = lookup_key (month_list, mstring,
+ NO_ABBREVIATIONS, CASE_SENSITIVE);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ sprintf (vv_time_str, VV_TIMESTAMP_FORMAT,
+ year, month, mday, hours, mins, secs);
+ DEBUG_1 ("vms_to_vv_timestamp: VV timestamp returned = `%s'",
+ vv_time_str);
+
+ return (vv_time_str);
+} /* vms_to_vv_timestamp */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** [tbs]
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs] - [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *vv_to_vms_timestamp (CONST char *vv_time_str)
+#else /* NOT (ANSI_SYNTAX) */
+ char *vv_to_vms_timestamp (vv_time_str)
+ CONST char *vv_time_str;
+#endif /* (ANSI_SYNTAX) */
+{
+ static char *vms_time_str = DUMMY_VMS_TIMESTAMP;
+ char *mstring = "XXX";
+ int year;
+ int month;
+ int mday;
+ int hours;
+ int mins;
+ int secs;
+ int status;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((vv_time_str == NULL) || (*vv_time_str == '\0'))
+ {
+ strcpy (vms_time_str, "");
+ return (vms_time_str);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ DEBUG_1 ("vv_to_vms_timestamp: VV timestamp provided = `%s'",
+ vv_time_str);
+
+ status = sscanf (vv_time_str, VV_TIMESTAMP_FORMAT,
+ &year, &month, &mday, &hours, &mins, &secs);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ sprintf (vms_time_str, VMS_TIMESTAMP_FORMAT,
+ mday, month_list[month], year, hours, mins, secs, 0);
+ DEBUG_1 ("vv_to_vms_timestamp: VMS timestamp returned = `%s'",
+ vms_time_str);
+
+ return (vms_time_str);
+} /* vv_to_vms_timestamp */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** [tbs]
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs] - [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ static Int32 vax_utime (CONST char *file_spec,
+ CONST struct utimbuf *utime_struct)
+#else /* NOT (ANSI_SYNTAX) */
+ static Int32 vax_utime (file_spec, utime_struct)
+ CONST char *file_spec;
+ CONST struct utimbuf *utime_struct;
+#endif /* (ANSI_SYNTAX) */
+{
+ int status;
+ short iosb[4];
+ short rev_count;
+ char date_str[24];
+
+ struct acb_struct acb[4];
+ struct fibdef fib;
+ struct FAB fab;
+ struct NAM nam;
+ unsigned short io_channel;
+ char *vv_time_str;
+ char *vms_time_str;
+
+ char esa[NAM$C_MAXRSS];
+ char rsa[NAM$C_MAXRSS];
+ unsigned long revision_time[2];
+ unsigned long creation_time[2];
+ unsigned long *quad_actime;
+ unsigned long *quad_modtime;
+ String_Desc time_string;
+ String_Desc fib_desc;
+ short revision_count;
+ char ascdate_buffer[255];
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Convert the Unix format time to a VMS quadword time
+ **------------------------------------------------------------------------
+ */
+ quad_actime = unix_to_vms_time (utime_struct->actime);
+ quad_modtime = unix_to_vms_time (utime_struct->modtime);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Set up the FAB, FIB and NAM blocks for the supplied file specification.
+ **------------------------------------------------------------------------
+ */
+ FABFIBNAM_setup (file_spec, "", &io_channel, &fab, &fib, &nam, esa, rsa);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Check that the file exists
+ **------------------------------------------------------------------------
+ */
+ status = SYS$SEARCH (&fab, 0, 0);
+ if ((status & 1) != 1)
+ {
+ ERRORMSG_2 ("vax_utime: error searching for file `%*s'",
+ nam.nam$l_rsa, nam.nam$b_rsl);
+ explain_error ();
+ LIB$SIGNAL (status);
+ return (-1);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Copy the file ID from the NAM to FIB.
+ **------------------------------------------------------------------------
+ */
+ fib.fib$r_fid_overlay.fib$w_fid[0] = nam.nam$w_fid[0];
+ fib.fib$r_fid_overlay.fib$w_fid[1] = nam.nam$w_fid[1];
+ fib.fib$r_fid_overlay.fib$w_fid[2] = nam.nam$w_fid[2];
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Construct the attribute control block item list.
+ **------------------------------------------------------------------------
+ */
+ acb[0].w_size = ATR$S_CREDATE;
+ acb[0].w_type = ATR$C_CREDATE;
+ acb[0].l_addr = (void *) creation_time;
+
+ acb[1].w_size = ATR$S_REVDATE;
+ acb[1].w_type = ATR$C_REVDATE;
+ acb[1].l_addr = (void *) revision_time;
+
+ acb[2].w_size = 2;
+ acb[2].w_type = ATR$C_ASCDATES;
+ acb[2].l_addr = (void *) &revision_count;
+
+ acb[3].w_size = 0;
+ acb[3].w_type = 0;
+ acb[3].l_addr = 0;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Build the FIB descriptor
+ **------------------------------------------------------------------------
+ */
+ fib_desc.dsc$w_length = FIB$C_LENGTH;
+ fib_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+ fib_desc.dsc$b_class = DSC$K_CLASS_S;
+ fib_desc.dsc$a_pointer = (char *) &fib;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Set the file creation and revison dates and reset the revision count
+ ** to one.
+ **------------------------------------------------------------------------
+ */
+ revision_count = 1;
+ creation_time[0] = quad_modtime[0];
+ creation_time[1] = quad_modtime[1];
+ revision_time[0] = quad_actime[0];
+ revision_time[1] = quad_actime[1];
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Modify the file. The IO$_MODIFY function is used to modify the file.
+ ** The file's revision and expiry dates will be changed by this action
+ ** but we don't really care since we've only just created the file. If
+ ** it ever becomes a problem, the change could be inhibited by the
+ ** assignment: fib.fib$r_acctl_overlay.fib$l_acctl = FIB$M_NORECORD
+ **------------------------------------------------------------------------
+ */
+ status = SYS$QIOW (0,
+ io_channel,
+ IO$_MODIFY,
+ iosb,
+ 0, 0,
+ &fib_desc,
+ 0, 0, 0,
+ acb,
+ 0);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Check the return status.
+ **------------------------------------------------------------------------
+ */
+ if ((status & 1) != 1)
+ {
+ ERRORMSG_2 ("vax_utime: error modifying file `%*s'",
+ nam.nam$l_rsa, nam.nam$b_rsl);
+ explain_error ();
+ LIB$SIGNAL (status);
+ return (-1);
+ }
+
+ if ((iosb[0] & 1) != 1)
+ {
+ ERRORMSG_2 ("vax_utime: error modifying file `%*s'",
+ nam.nam$l_rsa, nam.nam$b_rsl);
+ explain_error ();
+ LIB$SIGNAL (iosb[0]);
+ return (-1);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** De-access the I/O channel.
+ **------------------------------------------------------------------------
+ */
+ status = SYS$DASSGN (io_channel);
+ if ((status & 1) != 1)
+ {
+ ERRORMSG_2 ("vax_utime: error deaccessing file `%*s'",
+ nam.nam$l_rsa, nam.nam$b_rsl);
+ explain_error ();
+ LIB$SIGNAL (status);
+ return (-1);
+ }
+
+ return (0);
+} /* vax_utime */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** [tbs]
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs] - [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Unsigned32 *unix_to_vms_time (CONST TIME_T unix_time)
+#else /* NOT (ANSI_SYNTAX) */
+ Unsigned32 *unix_to_vms_time (unix_time)
+ CONST TIME_T unix_time;
+#endif /* (ANSI_SYNTAX) */
+{
+ int status;
+ struct tm *tms;
+ static unsigned long vms_quad_time[2];
+ String_Desc vms_time_desc;
+ static char *vms_time_str = DUMMY_VMS_TIMESTAMP;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Convert the Unix time to a 'tm' structure
+ **------------------------------------------------------------------------
+ */
+ tms = localtime (&unix_time);
+ DEBUG_2 ("unix_to_vms_time: unix time provided = %lu (%.24s)",
+ unix_time, ctime (&unix_time));
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Convert the 'tm' structure into a VMS format time string
+ **------------------------------------------------------------------------
+ */
+ sprintf (vms_time_str, VMS_TIMESTAMP_FORMAT,
+ tms->tm_mday, month_list[tms->tm_mon + 1],
+ tms->tm_year + 1900, tms->tm_hour,
+ tms->tm_min, tms->tm_sec, 0);
+ DEBUG_1 ("unix_to_vms_time: VMS time string = `%s'", vms_time_str);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Use SYS$BINTIM to convert the string into a VMS quadword time
+ **------------------------------------------------------------------------
+ */
+ vms_time_desc.dsc$w_length = strlen (vms_time_str);
+ vms_time_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+ vms_time_desc.dsc$b_class = DSC$K_CLASS_S;
+ vms_time_desc.dsc$a_pointer = vms_time_str;
+
+ status = SYS$BINTIM (&vms_time_desc, vms_quad_time);
+ if ((status & 1) != 1)
+ {
+ FATALMSG_1 ("unix_to_vms_time: SYS$BINTIM error parsing `%s'",
+ vms_time_str);
+ explain_error ();
+ LIB$SIGNAL (status);
+ vv_exit ();
+ }
+
+ DEBUG_2 ("unix_to_vms_time: VMS quadword time = %08x%08x",
+ vms_quad_time[1], vms_quad_time[0]);
+ return (vms_quad_time);
+} /* vv_to_vms_timestamp */
diff --git a/support/vvcode/vmcms.c b/support/vvcode/vmcms.c
new file mode 100644
index 0000000000..7db9c298c1
--- /dev/null
+++ b/support/vvcode/vmcms.c
@@ -0,0 +1,1829 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "vmcms.c",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson and Rainer Schoepf",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet),
+** schoepf@sc.ZIB-Berlin.de (Internet",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+** MODULE CONTENTS
+**
+** apply_defaults - Apply default file name and extension to a
+** full file specification if either of these
+** components is missing.
+** confirm_yesno - Display a message to the user and wait for a
+** yes/no answer.
+** examine_file - Examine a file and determine its key features,
+** including mode, format, record length and
+** timestamp.
+** explain_error - Explain the reason for an error.
+** f_open_in - Open a file for input using the appropriate
+** mode, format etc for the file.
+** f_open_out - Open a file for output using the appropriate
+** mode, format etc for the file.
+** file_exists - Determine whether a file exists.
+** force_file_ext - Force the file extension of a full file
+** specification to a specified value.
+** is_a_file - Determine whether a file stream is connected
+** to a real file rather than a character
+** device, pipe etc.
+** legal_filespec - Takes an arbitrary string which may a file
+** specification from another operating system
+** and manipulates it to produce a legal file
+** specification for the current operating
+** system.
+** make_filespec - Construct a full file specification from
+** component parts.
+** prompt_for_string - Present a prompt string and accept a string
+** from the user.
+** read_bytes - Read bytes from a currently open file.
+** read_line - Read a line from a currently open (text) file.
+** read_record - Read a record from a currently open file.
+** scan_cmd_line - [tbs]
+** set_ftime - Set the timestamp of a file to a specified
+** value.
+** set_pipe_mode - Set the mode of a file stream connected to a
+** pipe, character device, redirected
+** stdin/stdout/stderr, in fact any non-file.
+** split_file_spec - Split a full file specification into its
+** component parts.
+** tz_offset - Determine the offset of local time from
+** Greenwich Mean Time (Coordinated Universal
+** Time) at a specified date and time.
+** user_message - Present a message to the user.
+** vv_exit - Exit the program, returning the appropriate
+** status to the operating system.
+** write_bytes - Write bytes to a currently open file.
+** write_record - Write a record to a currently open file.
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+** and Rainer Schoepf <schoepf@sc.ZIB-Berlin.de>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+static char rcsid[] = "$Id$";
+
+/*-
+**----------------------------------------------------------------------------
+** Standard include files
+**----------------------------------------------------------------------------
+*/
+#include <stdio.h>
+#define MAX_CMD 128
+
+
+/*-
+**----------------------------------------------------------------------------
+** Include files
+**----------------------------------------------------------------------------
+*/
+#include "checkos.h"
+#include "machine.h"
+#include "local.h"
+#include "globals.h"
+#include "specific.h"
+#include "vvutils.h"
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** apply_defaults
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void apply_defaults (CONST char *default_name,
+ CONST char *default_ext,
+ char *full_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void apply_defaults (default_name, default_ext,
+ full_spec)
+ CONST char *default_name;
+ CONST char *default_ext;
+ char *full_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char name[MAX_NAME + 1];
+ char extension[MAX_EXT + 1];
+ Int16 path_parts;
+ char postamble[MAX_POSTAMBLE + 1];
+
+ path_parts = split_file_spec (full_spec, NULL, name, extension,
+ postamble);
+
+
+ if (((path_parts & FS_NAME) == 0) && (default_name != NULL))
+ {
+ strncpy (name, default_name, MAX_NAME);
+ }
+
+ if (((path_parts & FS_EXTENSION) == 0) && (default_ext != NULL))
+ {
+ strncpy (extension, default_ext, MAX_EXT);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((path_parts & FS_POSTAMBLE) == 0)
+ {
+ strcpy (postamble, ".A");
+ }
+
+ make_file_spec (NULL, name, extension, postamble, full_spec);
+} /* apply_defaults */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** confirm_yesno
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean confirm_yesno (CONST char *confirm_str)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean confirm_yesno (confirm_str)
+ CONST char *confirm_str;
+#endif /* (ANSI_SYNTAX) */
+{
+ int answer;
+
+ FPRINTF (stderr, "\n%s [Y/N]:\n", confirm_str);
+
+ do
+ {
+ answer = getchar ();
+
+ if (answer == EOF)
+ {
+ ERRORMSG ("EOF detected on standard input");
+
+ answer = 'N';
+ }
+ else
+ {
+ answer = TOUPPER (answer);
+ }
+ } while (!((answer == 'N') || (answer == 'Y')));
+
+ return (answer == 'Y' ? TRUE : FALSE);
+} /* confirm_yesno */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** examine_file
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#define EX_SAMPLE_SIZE 512
+
+#if (ANSI_SYNTAX)
+ void examine_file (File_Info *ex_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void examine_file (ex_file)
+ File_Info *ex_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmp_buffer[EX_SAMPLE_SIZE];
+ FILE *file_ptr;
+ int bytes_read;
+ int i, j;
+ char cmd_string[MAX_CMD];
+ char dummy[9];
+ char c;
+ int status;
+ struct tm tms;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Initialize the File_Info structure before starting work. If the input
+ ** file is not a real file (i.e. a device or pipe), these are the values
+ ** that will be returned.
+ **------------------------------------------------------------------------
+ */
+ ex_file->mode = INV_MODE;
+ ex_file->format = INV_FORMAT;
+ ex_file->max_rec_len = INV_RECORD_LEN;
+ ex_file->lng_rec_len = INV_RECORD_LEN;
+ ex_file->mod_time = INV_TIMESTAMP;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ sprintf (cmd_string, "LISTFILE %s (NOHEADER DATE LIFO",
+ ex_file->file_spec);
+
+ for (i = 0; cmd_string[i] != '\0'; i++)
+ {
+ if (cmd_string[i] == '.') {
+ cmd_string[i] = ' ';
+ }
+ else if (islower (cmd_string[i])) {
+ cmd_string[i] = toupper (cmd_string[i]);
+ }
+ }
+
+ DEBUG_1 ("examine_file: passing command `%s' to VM", cmd_string);
+
+ status = system (cmd_string);
+
+ if (status != 0) {
+ ERRORMSG_1 ("error reading info for file `%s'",
+ ex_file->file_spec);
+ explain_error ();
+ return;
+ }
+
+ for (i = 1; i <=3; i++) {
+ status = scanf ("%s", dummy);
+
+ DEBUG_1 ("examine_file: item skipped: `%s'", dummy);
+
+ if (status != 1) {
+ ERRORMSG_1 ("error parsing info for file `%s'",
+ ex_file->file_spec);
+ explain_error ();
+ return;
+ }
+ }
+
+ status = scanf (" %c %d %d %d", &c, &(ex_file->lng_rec_len), &i, &j);
+
+ DEBUG_2 ("examine_file: record format: %c, record_length: %d",
+ c, ex_file->lng_rec_len);
+
+ DEBUG_2 ("examine_file: number of records: %d, number of blocks: %d",
+ i, j);
+
+ if (status != 4) {
+ ERRORMSG_2 ("error parsing record info for file `%s', only %d items parsed",
+ ex_file->file_spec, status);
+ explain_error ();
+ return;
+ }
+
+ ex_file->max_rec_len = ex_file->lng_rec_len;
+
+ switch (c) {
+
+ case 'V':
+ ex_file->format = FMT_VARIABLE;
+ break;
+
+ case 'F':
+ ex_file->format = FMT_FIXED;
+ break;
+
+ default:
+ ERRORMSG_2 ("file `%s' has an unsupported record format (%c)",
+ ex_file->file_spec, c);
+ explain_error ();
+ return;
+ }
+
+ status = scanf ("%d/%d/%d %d:%d:%d",
+ &tms.tm_mon, &tms.tm_mday, &tms.tm_year,
+ &tms.tm_hour, &tms.tm_min, &tms.tm_sec);
+
+ DEBUG_3 ("examine_file: date as parsed: %02d/%02d/%02d",
+ tms.tm_mon, tms.tm_mday, tms.tm_year);
+
+ DEBUG_3 ("examine_file: time as parsed: %02d:%02d:%02d",
+ tms.tm_hour, tms.tm_min, tms.tm_sec);
+
+
+ if (status == 5) {
+ tms.tm_sec = 0;
+ }
+ else if (status != 6) {
+ ERRORMSG_1 ("error parsing time info for file `%s'",
+ ex_file->file_spec);
+ explain_error ();
+ return;
+ }
+
+ tms.tm_mon--;
+
+ ex_file->mod_time = make_time (&tms);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ ex_file->file_ptr = fopen (ex_file->file_spec, "rb");
+
+ if (file_ptr == (FILE *) NULL) {
+ ERRORMSG_1 ("couldn't examine (open) file `%s'", ex_file->file_spec);
+ explain_error ();
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+
+ bytes_read = fread (tmp_buffer, sizeof (char), EX_SAMPLE_SIZE,
+ ex_file->file_ptr);
+
+ ex_file->mode = MODE_TEXT; /* default */
+
+ for (i = 0; i < bytes_read - 1; i++) {
+ if (!isprint(tmp_buffer[i])) {
+ ex_file->mode = MODE_BINARY;
+ break;
+ }
+ }
+ f_close (ex_file);
+ ex_file->file_ptr = (FILE *) NULL;
+
+} /* examine_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** explain_error
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void explain_error (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void explain_error ()
+#endif /* (ANSI_SYNTAX) */
+{
+ INFOMSG_1 ("Error number: %ld", (long) errno);
+} /* explain_error */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** f_open_in
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ FILE *f_open_in (File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ FILE *f_open_in (ip_file)
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ FILE *file_ptr;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+
+/* if ((ip_file->rec_length < MIN_RECORD_LEN) || (ip_file->rec_length > MAX_RECORD_LEN)) {
+ FATALMSG_1 ("invalid record length specified `%d'", ip_file->rec_length);
+ vv_exit (G_status);
+ }*/
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ switch (ip_file->mode) {
+ case MODE_BINARY:
+ file_ptr = fopen (ip_file->file_spec, "rb");
+ break;
+ case MODE_TEXT:
+ file_ptr = fopen (ip_file->file_spec, "r");
+ break;
+ default:
+ ERRORMSG_1 ("invalid file mode specified (%d)", ip_file->mode);
+ return ((FILE *) NULL);
+ }
+
+ if (file_ptr == (FILE *) NULL) {
+ ERRORMSG_1 ("error opening file `%s' for input", ip_file->file_spec);
+ explain_error ();
+ return ((FILE *) NULL);
+ }
+ return (file_ptr);
+} /* f_open_in */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** f_open_out
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ FILE *f_open_out (CONST Int16 overwrite_files,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ FILE *f_open_out (overwrite_files, op_file)
+ CONST Int16 overwrite_files;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ FILE *file_ptr;
+ char tmp_buffer[512];
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((overwrite_files != OVERWRITE_YES)
+ && (file_exists (op_file->file_spec)))
+ {
+ if (overwrite_files == OVERWRITE_ASK) {
+ SPRINTF (G_tmp_msg, "File `%s' exists. Overwrite ?",
+ op_file->file_spec);
+
+ if (!confirm_yesno (G_tmp_msg))
+ {
+ ERRORMSG ("operation cancelled");
+ return ((FILE *) NULL);
+ }
+ }
+ else
+ {
+ ERRORMSG_1 ("file `%s' exists", op_file->file_spec);
+ return ((FILE *) NULL);
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+
+
+ if (op_file->format == FMT_VARIABLE ) {
+ if (op_file->max_rec_len == INV_RECORD_LEN) {
+ op_file->max_rec_len = op_file->lng_rec_len = DEF_VARIABLE_RECORD_LEN;
+ } else if ((op_file->max_rec_len < MIN_VARIABLE_RECORD_LEN) ||
+ (op_file->max_rec_len > MAX_VARIABLE_RECORD_LEN)) {
+ WARNMSG_1 ("invalid record length specified `%d'", op_file->max_rec_len);
+ WARNMSG_1 ("using default (%d) instead", DEF_VARIABLE_RECORD_LEN);
+ op_file->max_rec_len = op_file->lng_rec_len = DEF_VARIABLE_RECORD_LEN;
+ }
+
+ sprintf (tmp_buffer, "%s, RECFM=V",
+ op_file->mode == MODE_BINARY ? "wb" : "w");
+
+ } else if (op_file->format == FMT_FIXED ) {
+ if (op_file->max_rec_len == INV_RECORD_LEN) {
+ op_file->max_rec_len = op_file->lng_rec_len = DEF_FIXED_RECORD_LEN;
+ } else if ((op_file->max_rec_len < MIN_FIXED_RECORD_LEN) ||
+ (op_file->max_rec_len > MAX_FIXED_RECORD_LEN)) {
+ WARNMSG_1 ("invalid record length specified `%d'", op_file->max_rec_len);
+ WARNMSG_1 ("using default (%d) instead", DEF_FIXED_RECORD_LEN);
+ op_file->max_rec_len = op_file->lng_rec_len = DEF_FIXED_RECORD_LEN;
+ }
+
+ sprintf (tmp_buffer, "%s, RECFM=F, LRECL=%d",
+ op_file->mode == MODE_BINARY ? "wb" : "w",
+ op_file->lng_rec_len);
+ }
+
+ DEBUG_2 ("f_open_out: going to open file `%s' with specification `%s'",
+ op_file->file_spec, tmp_buffer);
+
+ file_ptr = fopen (op_file->file_spec, tmp_buffer);
+
+ if (file_ptr == (FILE *) NULL)
+ {
+ ERRORMSG_1 ("error opening file `%s' for output", op_file->file_spec);
+ explain_error ();
+ return ((FILE *) NULL);
+ }
+ return (file_ptr);
+} /* f_open_out */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** file_exists
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean file_exists (CONST char *file_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean file_exists (file_spec)
+ CONST char *file_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ FILE *fp;
+ int result;
+
+ fp = fopen (file_spec, "r");
+
+ DEBUG_2 ("file_exists: trial open of file `%s' in \"r\" mode returns file pointer `%lx'",
+ file_spec, (long) fp);
+
+ result = (fp != (FILE *) NULL);
+
+ DEBUG_1 ("file_exists: result = %d", result);
+
+ fclose (fp);
+
+ return (result);
+} /* file_exists */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** force_file_ext
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void force_file_ext (CONST char *forced_ext,
+ char *full_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void force_file_ext (forced_ext, full_spec)
+ CONST char *forced_ext;
+ char *full_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char name[MAX_NAME + 1];
+ char postamble[MAX_POSTAMBLE + 1];
+
+ if (forced_ext == NULL)
+ {
+ return;
+ }
+ (void) split_file_spec (full_spec, NULL, name, NULL, postamble);
+ make_file_spec (NULL, name, forced_ext, postamble, full_spec);
+} /* force_file_ext */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** is_a_file
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean is_a_file (CONST File_Info *ex_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean is_a_file (ex_file)
+ CONST File_Info *ex_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ return (TRUE);
+} /* is_a_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** legal_filespec
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *legal_filespec (CONST char *hdrf_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ char *legal_filespec (hdrf_spec)
+ CONST char *hdrf_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmpf_name[MAX_NAME + 1];
+ char tmpf_ext[MAX_EXT + 1];
+ char *tmpf_spec;
+ char *tmp_ptr;
+ static char opf_spec[MAX_PATH + 1];
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tmpf_spec = STRDUP (hdrf_spec);
+ tmp_ptr = strchr (tmpf_spec, '.');
+
+ if (tmp_ptr != NULL) {
+ strncpy (tmpf_ext, tmp_ptr, MAX_EXT);
+ tmpf_ext[MAX_EXT] = '\0';
+ *tmp_ptr = '\0';
+ }
+ else {
+ strcpy (tmpf_ext, "");
+ }
+ strncpy (tmpf_name, tmpf_spec, MAX_NAME);
+ tmpf_name[MAX_NAME] = '\0';
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (tmp_ptr = tmpf_name; *tmp_ptr != '\0'; tmp_ptr++)
+ {
+ if (strchr (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL)
+ {
+ *tmp_ptr = REPLACEMENT_FILESPEC_CHAR;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (tmp_ptr = tmpf_ext + 1; *tmp_ptr != '\0'; tmp_ptr++)
+ {
+ if (strchr (LEGAL_FILESPEC_CHARS, *tmp_ptr) == NULL)
+ {
+ *tmp_ptr = REPLACEMENT_FILESPEC_CHAR;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ strcpy (opf_spec, tmpf_name);
+ strcat (opf_spec, tmpf_ext);
+
+ if (strcmp (hdrf_spec, opf_spec) != 0) {
+ WARNMSG_2 ("suspicious header file spec `%s' changed to `%s'",
+ hdrf_spec, opf_spec);
+ }
+ return (opf_spec);
+} /* legal_filespec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** make_file_spec
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void make_file_spec (CONST char *preamble,
+ CONST char *name,
+ CONST char *extension,
+ CONST char *postamble,
+ char *full_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void make_file_spec (preamble, name, extension,
+ postamble, full_spec)
+ CONST char *preamble;
+ CONST char *name;
+ CONST char *extension;
+ CONST char *postamble;
+ char *full_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ int len;
+ char *tmp_ptr;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Start with an empty string and append components of the file
+ ** specification only if they exist.
+ **------------------------------------------------------------------------
+ */
+ strcpy (full_spec, "");
+
+ /*-
+ **------------------------------------------------------------------------
+ ** VM/CMS has no preamble component.
+ **------------------------------------------------------------------------
+ */
+
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Simply append the name if it is present.
+ **------------------------------------------------------------------------
+ */
+ if (name != NULL)
+ {
+ strncat (full_spec, name, MAX_NAME);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the extension component does not begin with '.', prepend '.' before
+ ** appending the extension to the file specification.
+ **------------------------------------------------------------------------
+ */
+ if ((extension != NULL) && (*extension != '\0'))
+ {
+ if (*extension != '.')
+ {
+ strcat (full_spec, ".");
+ strncat (full_spec, extension, MAX_EXT - 1);
+ }
+ else
+ {
+ strncat (full_spec, extension, MAX_EXT);
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the postamble component does not begin with '.', prepend '.' before
+ ** appending the extension to the file specification.
+ **------------------------------------------------------------------------
+ */
+ if ((postamble != NULL) && (*postamble != '\0'))
+ {
+ if (*postamble != '.')
+ {
+ strcat (full_spec, ".");
+ strncat (full_spec, postamble, MAX_POSTAMBLE - 1);
+ }
+ else
+ {
+ strncat (full_spec, postamble, MAX_POSTAMBLE);
+ }
+ }
+} /* make_file_spec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** prompt_for_string
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void prompt_for_string (CONST char *confirm_str,
+ CONST Int16 buf_size,
+ char *return_buffer)
+#else /* NOT (ANSI_SYNTAX) */
+ void prompt_for_string (confirm_str, buf_size,
+ return_buffer)
+ CONST char *confirm_str;
+ CONST Int16 buf_size;
+ char *return_buffer;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *status;
+
+ FPRINTF (stderr, "\n%s", confirm_str);
+ status = fgets (return_buffer, (int) buf_size, stdin);
+
+ if (status == NULL)
+ {
+ FATALMSG ("error reading string from stdin");
+ explain_error ();
+ vv_exit ();
+ }
+
+ status = STRCHR (return_buffer, '\n');
+ if (status != NULL)
+ {
+ *status = '\0';
+ }
+} /* prompt_for_string */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_bytes
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 read_bytes (CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 read_bytes (max_bytes, buffer, ip_file)
+ CONST Int32 max_bytes;
+ char *buffer;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 idx;
+ int temp;
+
+ for (idx = 0L; idx < max_bytes; idx++)
+ {
+ temp = fgetc (ip_file->file_ptr);
+ if (temp == EOF)
+ {
+ return (idx);
+ }
+ buffer[(SIZE_T) idx] = (char) temp;
+ }
+ return (idx);
+} /* read_bytes */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_line
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 read_line (CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 read_line (max_bytes, buffer, ip_file)
+ CONST Int32 max_bytes;
+ char *buffer;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *tmp_ptr;
+
+ tmp_ptr = fgets (buffer, (int) max_bytes, ip_file->file_ptr);
+ buffer[(SIZE_T) (max_bytes - 1)] = '\0';
+
+ if (tmp_ptr == NULL)
+ {
+ return (-1);
+ }
+ else
+ {
+ return ((Int32) strlen (buffer));
+ }
+} /* read_line */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** read_record
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 read_record (CONST Int32 max_bytes,
+ char *buffer,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 read_record (max_bytes, buffer, ip_file)
+ CONST Int32 max_bytes;
+ char *buffer;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int i;
+ int c;
+ char *s;
+
+ DEBUG_1 ("read_record: want to read record of with maximum size %d",
+ max_bytes);
+
+ if (ip_file->mode == MODE_TEXT) {
+ s = fgets (buffer, max_bytes, ip_file->file_ptr);
+
+ if (s == (char *) NULL) {
+ return (-1L);
+ }
+
+ i = strlen (s);
+ }
+ else {
+
+ if (feof (ip_file->file_ptr)) {
+ return (-1);
+ }
+ for (i = 0; i < max_bytes; i++) {
+ c = getc (ip_file->file_ptr);
+ if (c == EOF) {
+ break;
+ }
+ else {
+ buffer[i] = c;
+ }
+ }
+ }
+
+ DEBUG_1 ("read_record: record with %d bytes read", i);
+
+ return (i);
+} /* read_record */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** scan_cmd_line
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void scan_cmd_line (CONST int qargc,
+ CONST char *qargv[],
+ CONST char *q_intro_str,
+ CONST char *q_sep_str,
+ Qualifier_Struct *qual_array,
+ Qualifier_Struct *qual_ipfile,
+ Qualifier_Struct *qual_opfile)
+#else /* NOT (ANSI_SYNTAX) */
+ void scan_cmd_line (qargc, qargv, q_intro_str,
+ q_sep_str, qual_array, qual_ipfile,
+ qual_opfile)
+ CONST int qargc;
+ CONST char *qargv[];
+ CONST char *q_intro_str;
+ CONST char *q_sep_str;
+ Qualifier_Struct *qual_array;
+ Qualifier_Struct *qual_ipfile;
+ Qualifier_Struct *qual_opfile;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *arg;
+ int arg_no;
+ int len;
+ int qual_found;
+ int q_no;
+ char *qsep_ptr;
+ char *qvalue_ptr;
+ char *tmp_qstr_ptr;
+ int paren_seen = 0;
+ char *file_specs[6];
+ int i;
+ char tmp_buffer[512];
+
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Initialize file spec array
+ **------------------------------------------------------------------------
+ */
+
+ for (i = 0; i < 6; i++) {
+ file_specs[i] = NULL;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Loop through each of the user supplied command line arguments.
+ **------------------------------------------------------------------------
+ */
+ for (arg_no = 1; arg_no < qargc; arg_no++) {
+ arg = (char *) qargv[arg_no];
+
+ if (arg[0] == '(') {
+ paren_seen = 1;
+ break;
+ }
+ else if (arg_no > 6) {
+ USAGE ("too many arguments");
+ }
+ else {
+ file_specs[arg_no - 1] = STRDUP (arg);
+ }
+ }
+
+ if (arg_no == 1) {
+ USAGE ("too few arguments");
+ }
+
+ /* arg_no is now the first option argument */
+
+ strcpy (tmp_buffer, file_specs[0]);
+ if (arg_no > 2) {
+ strcat (tmp_buffer, ".");
+ strcat (tmp_buffer, file_specs[1]);
+
+ if (arg_no > 3) {
+ strcat (tmp_buffer, ".");
+ strcat (tmp_buffer, file_specs[2]);
+ }
+ }
+
+ for (i = 0; tmp_buffer[i] != '\0'; i++) {
+ if (islower (tmp_buffer[i])) {
+ tmp_buffer[i] = toupper (tmp_buffer[i]);
+ }
+ }
+
+ qual_ipfile->present = TRUE;
+ qual_ipfile->value = STRDUP (tmp_buffer);
+
+ if (arg_no > 4) {
+ if (strcmp (file_specs[3], "=") == 0) {
+ file_specs[3] = file_specs[0];
+ }
+ strcpy (tmp_buffer, file_specs[3]);
+ if (arg_no > 5) {
+ if (strcmp (file_specs[4], "=") == 0) {
+ file_specs[4] = file_specs[1];
+ }
+ strcat (tmp_buffer, ".");
+ strcat (tmp_buffer, file_specs[4]);
+
+ if (arg_no > 6) {
+ if (strcmp (file_specs[5], "=") == 0) {
+ file_specs[5] = file_specs[2];
+ }
+ strcat (tmp_buffer, ".");
+ strcat (tmp_buffer, file_specs[5]);
+ }
+ }
+
+ for (i = 0; tmp_buffer[i] != '\0'; i++) {
+ if (islower (tmp_buffer[i])) {
+ tmp_buffer[i] = toupper (tmp_buffer[i]);
+ }
+ }
+
+ qual_opfile->present = TRUE;
+ qual_opfile->value = STRDUP (tmp_buffer);
+ }
+
+ for (; arg_no < qargc; arg_no++) {
+ arg = (char *) qargv[arg_no];
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+
+ DEBUG_1 ("scan_cmd_line: command line argument: `%s'", arg);
+
+ if (*arg == '(') {
+ if (arg[1] == '\0') {
+ continue;
+ }
+
+ ++arg;
+
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ ** Extract the component of the qualifier string before the
+ ** 'q_sep_str' character if it is present.
+ **----------------------------------------------------------------
+ */
+ tmp_qstr_ptr = STRDUP (arg);
+ qsep_ptr = STRSTR (tmp_qstr_ptr, q_sep_str);
+ qvalue_ptr = NULL;
+
+ if (qsep_ptr != NULL) {
+ *qsep_ptr = '\0';
+ qvalue_ptr = qsep_ptr + 1;
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ ** Search the command qualifier structure array for this
+ ** qualifier string.
+ **----------------------------------------------------------------
+ */
+ len = strlen (tmp_qstr_ptr);
+ qual_found = -1;
+
+ for (q_no = 0; qual_array[q_no].q_string != NULL; q_no++) {
+
+ if (STRNCMPI (qual_array[q_no].q_string, tmp_qstr_ptr, len) == 0) {
+
+ /*-
+ **--------------------------------------------------------
+ **
+ **--------------------------------------------------------
+ */
+ if (qual_found < 0) {
+ qual_found = q_no;
+ DEBUG_1 ("scan_cmd_line: matches option: `%s'",
+ qual_array[q_no].q_string);
+ }
+ else {
+ USAGE_1 ("ambiguous option `%s'", qargv[arg_no]);
+ }
+ }
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ ** If the option string is unknown, return that status.
+ **----------------------------------------------------------------
+ */
+ if (qual_found < 0) {
+ USAGE_1 ("unknown option `%s'", qargv[arg_no]);
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ **
+ **----------------------------------------------------------------
+ */
+ if (qsep_ptr == NULL) {
+ if (qual_array[qual_found].val_needed == VALUE_NONE) {
+ qual_array[qual_found].present = TRUE;
+ qual_array[qual_found].value = NULL;
+
+ if (qual_found == CMDQ_DEBUG) {
+ G_debugging = TRUE;
+ }
+
+ continue;
+ }
+ else {
+
+ /*-
+ **--------------------------------------------------------
+ **
+ **--------------------------------------------------------
+ */
+ if (((arg_no + 1) < qargc) &&
+ (STRCHR (QUAL_INTRO, *qargv[arg_no + 1]) == NULL)) {
+
+ /*-
+ **----------------------------------------------------
+ **
+ **----------------------------------------------------
+ */
+ qual_array[qual_found].present = TRUE;
+ qual_array[qual_found].value = STRDUP (qargv[++arg_no]);
+ DEBUG_1 ("scan_cmd_line: option value: `%s'", qargv[arg_no]);
+ }
+ else {
+ /*-
+ **----------------------------------------------------
+ **
+ **----------------------------------------------------
+ */
+ if (qual_array[qual_found].val_needed == VALUE_NEEDED) {
+ USAGE_2 ("option `%.1s%s' needs a value",
+ QUAL_INTRO,
+ qual_array[qual_found].q_string);
+ }
+ else {
+ qual_array[qual_found].present = TRUE;
+ qual_array[qual_found].value = NULL;
+ }
+ }
+ continue;
+ }
+ }
+ else {
+ /*-
+ **------------------------------------------------------------
+ **
+ **------------------------------------------------------------
+ */
+ if (*qvalue_ptr == '\0') {
+ USAGE_1 ("value missing for option `%.1s%s'",
+ qargv[arg_no]);
+ }
+ else if (qual_array[qual_found].val_needed == VALUE_NONE) {
+ USAGE_2 ("option `%.1s%s' does not take a value",
+ QUAL_INTRO, qual_array[qual_found].q_string);
+ }
+ else {
+ qual_array[qual_found].present = TRUE;
+ qual_array[qual_found].value = STRDUP (qvalue_ptr);
+ DEBUG_1 ("scan_cmd_line: option value: `%s'",
+ qual_array[qual_found].value);
+ continue;
+ }
+ }
+ }
+} /* scan_cmd_line */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_ftime
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_ftime (File_Info *target_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_ftime (target_file)
+ File_Info *target_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int status;
+ int i;
+ struct tm *tms;
+ char cmd_string[MAX_CMD];
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ DEBUG_2 ("set_ftime: setting file `%s' time to %s",
+ target_file->file_spec, ctime (&(target_file->mod_time)));
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tms = localtime (&(target_file->mod_time));
+ sprintf (cmd_string, "EXEC TOUCH %s (%02d/%02d/%02d %02d:%02d:%02d)",
+ target_file->file_spec,
+ tms->tm_mon + 1, tms->tm_mday, tms->tm_year,
+ tms->tm_hour, tms->tm_min, tms->tm_sec);
+
+ for (i = 0; cmd_string[i] != '\0'; i++)
+ {
+ if (cmd_string[i] == '.') {
+ cmd_string[i] = ' ';
+ }
+ else if (islower (cmd_string[i])) {
+ cmd_string[i] = toupper (cmd_string[i]);
+ }
+ }
+
+ DEBUG_1 ("set_ftime: passing command `%s' to VM", cmd_string);
+
+ status = system (cmd_string);
+
+ if (status != 0) {
+ ERRORMSG_2 ("error setting file `%s' time to %s",
+ target_file->file_spec, ctime (&(target_file->mod_time)));
+ explain_error ();
+ }
+
+ return;
+} /* set_ftime */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_pipe_mode
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_pipe_mode (File_Info *target_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_pipe_mode (target_file)
+ File_Info *target_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ return;
+} /* set_pipe_mode */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** split_file_spec
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Unsigned16 split_file_spec (CONST char *full_spec,
+ char *preamble,
+ char *name,
+ char *extension,
+ char *postamble)
+#else /* NOT (ANSI_SYNTAX) */
+ Unsigned16 split_file_spec (full_spec, preamble, name,
+ extension, postamble)
+ CONST char *full_spec;
+ char *preamble;
+ char *name;
+ char *extension;
+ char *postamble;
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmp_full_spec[MAX_PATH + 1];
+ char *start_ptr;
+ char *tmp_ptr;
+ char *tmp_ptr2;
+ int idx;
+ Int16 path_components;
+
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (preamble != NULL)
+ {
+ *preamble = '\0';
+ }
+ if (name != NULL)
+ {
+ *name = '\0';
+ }
+ if (extension != NULL)
+ {
+ *extension = '\0';
+ }
+ if (postamble != NULL)
+ {
+ *postamble = '\0';
+ }
+ path_components = FS_NOTHING;
+
+ if ((full_spec == NULL) || (*full_spec == '\0'))
+ {
+ return (path_components);
+ }
+
+ strcpy (tmp_full_spec, full_spec);
+ start_ptr = (char *) tmp_full_spec;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tmp_ptr = STRCHR (start_ptr, '.');
+
+ if (tmp_ptr != NULL)
+ {
+ path_components |= FS_EXTENSION;
+
+ tmp_ptr2 = tmp_ptr;
+ tmp_ptr2++;
+ while (*tmp_ptr2 != '\0') {
+ if (*tmp_ptr2 == '.') {
+ *tmp_ptr2 = '\0';
+
+ tmp_ptr2++;
+ if ((tmp_ptr2 != '\0') && isalpha (*tmp_ptr2)) {
+ path_components |= FS_POSTAMBLE;
+ if (postamble != NULL) {
+ postamble[0] = '.';
+ postamble[1] = *tmp_ptr2;
+ tmp_ptr2++;
+ if (isdigit (*tmp_ptr2)) {
+ postamble[2] = *tmp_ptr2;
+ postamble[3] = '\0';
+ }
+ else {
+ postamble[2] = '\0';
+ }
+ }
+ }
+
+ break;
+ }
+ tmp_ptr2++;
+ }
+
+ if (extension != NULL)
+ {
+ strncpy (extension, tmp_ptr, MAX_EXT);
+ }
+ *tmp_ptr = '\0';
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (*start_ptr != '\0')
+ {
+ path_components |= FS_NAME;
+
+ if (name != NULL)
+ {
+ strncpy (name, start_ptr, MAX_NAME);
+ }
+ }
+
+ return (path_components);
+} /* split_file_spec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** tz_offset
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ TIME_T tz_offset (TIME_T the_time)
+#else /* NOT (ANSI_SYNTAX) */
+ TIME_T tz_offset (the_time)
+ TIME_T the_time;
+#endif /* (ANSI_SYNTAX) */
+
+{
+ /* struct tm *tm;
+ TIME_T timezone;
+
+ tm = localtime (&the_time);
+
+ if (tm->tm_isdst > 0) {
+ return (timezone - (TIME_T) 3600);
+ }
+ else {
+ return (timezone);
+ } */
+ return ((TIME_T) 0);
+} /* tz_offset */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** user_message
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void user_message (CONST Int16 status,
+ CONST char *msg_str,
+ File_Info *log_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void user_message (status, msg_str, log_file)
+ CONST Int16 status;
+ CONST char *msg_str;
+ File_Info *log_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int to_stderr;
+ int to_logfile;
+ char *status_str;
+
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Check the value supplied for the message status and set the output
+ ** destinations accordingly.
+ **------------------------------------------------------------------------
+ */
+ to_logfile = TRUE;
+ to_stderr = FALSE;
+
+ switch (status)
+ {
+ case NORMAL_STATUS:
+ case LOG_STATUS:
+ status_str = "";
+ break;
+ case INFO_STATUS:
+ status_str = " -- ";
+ to_stderr = TRUE;
+ break;
+ case WARNING_STATUS:
+ status_str = "\nWARNING: ";
+ to_stderr = TRUE;
+ break;
+ case ERROR_STATUS:
+ status_str = "\nERROR: ";
+ to_stderr = TRUE;
+ break;
+ case FATAL_STATUS:
+ status_str = "\nFATAL: ";
+ to_stderr = TRUE;
+ break;
+ default:
+ INTERNAL_ERROR ("user_message");
+ vv_exit ();
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is NULL, just update the status and/or the message
+ ** show status.
+ **------------------------------------------------------------------------
+ */
+ if ((msg_str == NULL) || (*msg_str == '\0'))
+ {
+ if (status > G_status)
+ {
+ G_status = status;
+ }
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Make sure that we don't try to write to a NULL log file pointer.
+ **------------------------------------------------------------------------
+ */
+ if (log_file->file_ptr == (FILE *) NULL)
+ {
+ to_logfile = FALSE;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is to be sent to the log file and stderr, check whether
+ ** the log file output is also to stderr. If it is, disable the 'stderr'
+ ** output.
+ **------------------------------------------------------------------------
+ */
+ if (to_logfile && to_stderr)
+ {
+ if (log_file->file_ptr == stderr)
+ {
+ to_stderr = FALSE;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is to be sent to stderr, output it here.
+ **------------------------------------------------------------------------
+ */
+ if (to_stderr)
+ {
+ FPRINTF (stderr, "%s%s\n", status_str, msg_str);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the message is to be sent to the log file, output it here. If
+ ** debugging is enabled, report also the name of the calling function.
+ **------------------------------------------------------------------------
+ */
+ if (to_logfile)
+ {
+ FPRINTF (log_file->file_ptr, "%s%s\n", status_str, msg_str);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (status > G_status)
+ {
+ G_status = status;
+ }
+
+} /* user_message */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vv_exit
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void vv_exit (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void vv_exit ()
+#endif /* (ANSI_SYNTAX) */
+{
+ switch (G_status)
+ {
+ case LOG_STATUS:
+ case NORMAL_STATUS:
+ exit (0);
+ break;
+ case WARNING_STATUS:
+ exit (1);
+ break;
+ case ERROR_STATUS:
+ exit (2);
+ break;
+ case FATAL_STATUS:
+ default:
+ exit (3);
+ break;
+ }
+} /* vv_exit */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** write_bytes
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void write_bytes (CONST Int32 max_bytes,
+ CONST char *buffer,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void write_bytes (max_bytes, buffer, op_file)
+ CONST Int32 max_bytes;
+ CONST char *buffer;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 idx;
+
+ for (idx = 0L; idx < max_bytes; idx++)
+ {
+ fputc (buffer[(SIZE_T) idx], op_file->file_ptr);
+ }
+} /* write_bytes */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** write_record
+**
+** NOTE: see related file 'specific.h' for functional description.
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void write_record (CONST Int32 max_bytes,
+ CONST char *buffer,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void write_record (max_bytes, buffer, op_file)
+ CONST Int32 max_bytes;
+ CONST char *buffer;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 no_bytes;
+
+ no_bytes = max_bytes * sizeof (char);
+ fwrite (buffer, (Int16) no_bytes, 1, op_file->file_ptr);
+} /* write_record */
diff --git a/support/vvcode/vmsbuild.com b/support/vvcode/vmsbuild.com
new file mode 100644
index 0000000000..1624a82842
--- /dev/null
+++ b/support/vvcode/vmsbuild.com
@@ -0,0 +1,120 @@
+$!****************************************************************************
+$!****************************************************************************
+$!
+$! ARCHIVE HEADER INFORMATION
+$!
+$! @VAX-VMS-shell-file{
+$! FILENAME = "vmsbuild.com",
+$! VERSION = "1.00",
+$! DATE = "",
+$! TIME = "",
+$!
+$! AUTHOR = "Niel Kempson",
+$! ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+$! TELEPHONE = "+44-242 579105",
+$! EMAIL = "kempson@tex.ac.uk (Internet)",
+$!
+$! SUPPORTED = "yes",
+$! ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+$! KEYWORDS = "VVcode",
+$!
+$! CODETABLE = "ISO/ASCII",
+$! CHECKSUM = "51492 1481 5732 57976",
+$!
+$! DOCSTRING = { This is a simple VMS command procedure to build
+$! VVcode.
+$! }
+$! }
+$!
+$! MODULE CONTENTS
+$!
+$! [tbs]
+$!
+$! COPYRIGHT
+$!
+$! Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+$!
+$! This program is free software; you can redistribute it and/or
+$! modify it under the terms of the GNU General Public License as
+$! published by the Free Software Foundation; either version 1, or
+$! (at your option) any later version.
+$!
+$! This program is distributed in the hope that it will be useful,
+$! but WITHOUT ANY WARRANTY; without even the implied warranty of
+$! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+$! General Public License for more details.
+$!
+$! You should have received a copy of the GNU General Public License
+$! along with this program; if not, write to the Free Software
+$! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+$!
+$! In other words, you are welcome to use, share and improve this
+$! program. You are forbidden to forbid anyone else to use, share
+$! and improve what you give them. Help stamp out software-hoarding!
+$!
+$! CHANGE LOG
+$!
+$!****************************************************************************
+$!****************************************************************************
+$ ON ERROR THEN $ GOTO Exit_Label
+$ ver_state = F$VERIFY (0)
+$ WSO = "WRITE SYS$OUTPUT"
+$!
+$!----------------------------------------------------------------------------
+$!
+$! Local definitions for file types and compilation / linking.
+$!
+$! Customize compiler & linker qualifiers here (e.g. to build a debugging
+$! version or to use GNU C).
+$!
+$!----------------------------------------------------------------------------
+$ COMPILER = "CC"
+$ CCFLAGS = "/WARNINGS /STANDARD=PORTABLE"
+$ LINKFLAGS = "/TRACEBACK /NODEBUG"
+$!
+$!----------------------------------------------------------------------------
+$! Allow an optional parameter "LINKONLY".
+$!----------------------------------------------------------------------------
+$ IF P1 .EQS. "LINKONLY"
+$ THEN
+$ SET VERIFY
+$ GOTO Link_Stage
+$ ENDIF
+$!
+$!----------------------------------------------------------------------------
+$! End of local definitions.
+$!----------------------------------------------------------------------------
+$ WSO "Starting to build VVcode at ''F$TIME()'"
+$ SET VERIFY
+$ 'COMPILER' 'CCFLAGS' vvdecode.c
+$ 'COMPILER' 'CCFLAGS' vvencode.c
+$ 'COMPILER' 'CCFLAGS' vveparse.c
+$ 'COMPILER' 'CCFLAGS' vvutils.c
+$ 'COMPILER' 'CCFLAGS' vaxvms.c
+$!
+$!----------------------------------------------------------------------------
+$! All modules have been compiled so link them together.
+$!----------------------------------------------------------------------------
+$Link_Stage:
+$ LINK 'LINKFLAGS' vvencode.obj, vvutils.obj, vaxvms.obj, -
+ SYS$INPUT: /OPTIONS
+SYS$LIBRARY:VAXCRTL /SHAREABLE
+$!----------------------------------------------------------------------------
+$ LINK 'LINKFLAGS' vvdecode.obj, vveparse.obj, vvutils.obj, -
+ vaxvms.obj, SYS$INPUT: /OPTIONS
+SYS$LIBRARY:VAXCRTL /SHAREABLE
+$!----------------------------------------------------------------------------
+$ SET NOVERIFY
+$ WSO "VVcode built at ''F$TIME()'"
+$!
+$!----------------------------------------------------------------------------
+$! We should always exit the command procedure here. If we came here as the
+$! result of an error, return the error status on exit.
+$!----------------------------------------------------------------------------
+$Exit_Label:
+$ save_status = $STATUS
+$ IF ver_state
+$ THEN
+$ SET VERIFY
+$ ENDIF
+$ EXIT 'save_status'
diff --git a/support/vvcode/vvcode.cld b/support/vvcode/vvcode.cld
new file mode 100644
index 0000000000..f67fcbf374
--- /dev/null
+++ b/support/vvcode/vvcode.cld
@@ -0,0 +1,465 @@
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!
+!! ARCHIVE HEADER INFORMATION
+!!
+!! @Digital-Command-Language-Def-file{
+!! FILENAME = "vvcode.cld",
+!! VERSION = "1.00",
+!! DATE = "",
+!! TIME = "",
+!!
+!! AUTHOR = "Niel Kempson",
+!! ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+!! TELEPHONE = "+44-242 579105",
+!! EMAIL = "kempson@tex.ac.uk (Internet)",
+!!
+!! SUPPORTED = "yes",
+!! ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+!! KEYWORDS = "VVcode",
+!!
+!! CODETABLE = "ISO/ASCII",
+!! CHECKSUM = "51492 1481 5732 57976",
+!!
+!! DOCSTRING = { This is the VVCODE Command Line Definition file for
+!! VAX/VMS. It defines the command verbs VVENCODE and
+!! VVDECODE.
+!!
+!! NOTE: the string VVCODE_DIR used in the "image"
+!! lines should be replaced by the appropriate
+!! physical or logical directory specification
+!! where the VVDECODE.EXE and VVENCODE.EXE
+!! image files reside.
+!!
+!! To activate the command verbs, the DCL command
+!!
+!! SET COMMAND VVCODE
+!!
+!! should be issued.
+!! }
+!! }
+!!
+!! MODULE CONTENTS
+!!
+!! [tbs]
+!!
+!! COPYRIGHT
+!!
+!! Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+!!
+!! This program is free software; you can redistribute it and/or
+!! modify it under the terms of the GNU General Public License as
+!! published by the Free Software Foundation; either version 1, or
+!! (at your option) any later version.
+!!
+!! This program is distributed in the hope that it will be useful,
+!! but WITHOUT ANY WARRANTY; without even the implied warranty of
+!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+!! General Public License for more details.
+!!
+!! You should have received a copy of the GNU General Public License
+!! along with this program; if not, write to the Free Software
+!! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+!!
+!! In other words, you are welcome to use, share and improve this
+!! program. You are forbidden to forbid anyone else to use, share
+!! and improve what you give them. Help stamp out software-hoarding!
+!!
+!! CHANGE LOG
+!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!
+!! Define the verb VVENCODE.
+!!
+!! Parameters
+!!
+!! INPUT_FILE
+!!
+!! The file to be read and encoded. This parameter is required
+!! (unless the /HELP qualifier is present) and must be a valid
+!! VAX/VMS file specification.
+!!
+!! OUTPUT_FILE
+!!
+!! The encoded VVE file to be created by VVENCODE. This
+!! parameter is optional, but if present, must be a valid
+!! VAX/VMS file specification.
+!!
+!! Qualifiers
+!!
+!! /DEBUG
+!!
+!! generate copious debugging information
+!!
+!! /ENCODING_TABLE=file-spec
+!!
+!! specify a file containing the 64 character encoding table
+!! used to encode/decode the file. The qualifier value is
+!! required and must be a valid VAX/VMS file specification.
+!!
+!! /FORMAT=file_format
+!!
+!! specify the VVcode file format to be used when reading the
+!! file. This qualifier is not normally required as the file
+!! format will be determined automatically by the program. The
+!! qualifier value is required and must be one of the values
+!! defined for the CLD type 'file_format' (defined near the end
+!! of this file): DEFAULT, FIXED, STREAM or VARIABLE.
+!!
+!! /HEADER_FILESPEC=string
+!!
+!! specify the file specification to be recorded in the VVE
+!! file created by VVENCODE, to be subsequently used as the
+!! default for the output file by VVDECODE. The qualifier value
+!! is required and may be an arbitrary string. The value is not
+!! checked or validated by VVENCODE.
+!!
+!! /HELP
+!!
+!! request a short summary of the command line syntax for
+!! VVENCODE. NOTE: this qualifier invokes a special syntax
+!! version of the verb that does not require an input file to be
+!! specified.
+!!
+!! /LOG[=file_spec]
+!!
+!! specify a file to which status and logging information should
+!! be written. The qualifier value is optional, but if present,
+!! must be a valid VAX/VMS file specification. If absent,
+!! logging information is written to SYS$OUTPUT.
+!!
+!! /MODE=file_mode
+!!
+!! specify the VVcode file mode to be used when reading the file.
+!! This qualifier is not normally required as the file mode
+!! will be determined automatically by the program. The
+!! qualifier value is required and must be one of the values
+!! defined for the CLD type 'file_mode' (defined near the end
+!! of this file): BINARY or TEXT.
+!!
+!! /OVERWRITE
+!!
+!! specify that existing files can be overwritten by VVENCODE
+!! without first requesting permission. On VAX/VMS, VVENCODE
+!! would only request permission if the output file
+!! specification included an explicit version number.
+!!
+!! /RECORD_LENGTH=decimal_number
+!!
+!! specify the maximum record length to be assumed when reading
+!! a fixed or variable length record format file. This
+!! qualifier is not normally required as the maximum record
+!! length will be determined automatically by the program. The
+!! qualifier value is required and must be an integer in the
+!! supported for the different file formats (FIXED: 2 - 32767,
+!! VARIABLE: 0 - 32765).
+!!
+!! /SPLIT_SIZE=decimal_number
+!!
+!! specify the maximum size in kilobytes of VVE file parts
+!! created by VVENCODE. The qualifier value is required and must
+!! be an integer no less than 4.
+!!
+!! /TIMESTAMP=time_value
+!!
+!! specify the timestamp to be recorded in the VVE file created
+!! by VVENCODE, to be subsequently used by VVDECODE. The
+!! qualifier value is optional, but if present, must be a VMS
+!! absolute or combination time. If the qualifier value is
+!! omitted the current date and time is used. This
+!! qualifier is not normally required as the file timestamp
+!! will be determined automatically by the program.
+!!
+!! /TRANSLATION_FILE=file_spec
+!!
+!! specify a file containing the rules for translating between
+!! two character sets (e.g. ASCII -> EBCDIC). The qualifier
+!! value is required and must be a valid VAX/VMS file
+!! specification.
+!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+define verb VVENCODE
+ image VVCODE_DIR:VVENCODE
+!
+ parameter P1,
+ label=INPUT_FILE,
+ prompt="File_to_be_encoded",
+ value(required, type=$file)
+ parameter P2,
+ label=OUTPUT_FILE,
+ prompt="Output_File",
+ value(type=$file)
+!
+ qualifier DEBUG
+ qualifier ENCODING_TABLE,
+ nonnegatable,
+ value(required, type=$file)
+ qualifier FORMAT,
+ nonnegatable,
+ value(required, type=FILE_FORMAT)
+ qualifier HEADER_FILESPEC,
+ nonnegatable,
+ value(required)
+ qualifier HELP,
+ syntax=VVENCODE_HELP
+ qualifier LOG
+ nonnegatable,
+ value(type=$file)
+ qualifier MODE,
+ nonnegatable,
+ value(required, type=FILE_MODE)
+ qualifier OVERWRITE,
+ negatable,
+ default
+ qualifier RECORD_LENGTH,
+ nonnegatable,
+ value(required, type=$number)
+ qualifier SPLIT_SIZE,
+ nonnegatable,
+ value(required, type=$number)
+ qualifier TIMESTAMP,
+ nonnegatable,
+ value(type=$datetime)
+ qualifier TRANSLATION_FILE,
+ nonnegatable,
+ value(required, type=$file)
+
+
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!
+!! Define the verb VVDECODE.
+!!
+!! Parameters
+!!
+!! INPUT_FILE
+!!
+!! The encoded VVE file to be read and decoded. This parameter
+!! is required (unless the /HELP qualifier is present) and must
+!! be a valid VAX/VMS file specification.
+!!
+!! OUTPUT_FILE
+!!
+!! The decoded output file to be created by VVDECODE. This
+!! parameter is optional, but if present, must be a valid
+!! VAX/VMS file specification.
+!!
+!! Qualifiers
+!!
+!! /DEBUG
+!!
+!! generate copious debugging information
+!!
+!! /ENCODING_TABLE=file-spec
+!!
+!! specify a file containing the 64 character encoding table
+!! used to encode/decode the file. The qualifier value is
+!! required and must be a valid VAX/VMS file specification.
+!!
+!! /FORMAT=file_format
+!!
+!! specify the VVcode file format to be used to create the
+!! output file. This qualifier is not normally required as the
+!! VVE file specifies the format of the original file, but may
+!! be used to override that value. The qualifier value is
+!! required and must be one of the values defined for the CLD
+!! type 'file_format' (defined near the end of this file):
+!! DEFAULT, FIXED, STREAM or VARIABLE.
+!!
+!! /HELP
+!!
+!! request a short summary of the command line syntax for
+!! VVDECODE. NOTE: this qualifier invokes a special syntax
+!! version of the verb that does not require an input file to be
+!! specified.
+!!
+!! /INDEX_FILE=file_spec
+!!
+!! specify a file containing the index of translation table
+!! files to be used for translating between two character sets
+!! (e.g. ASCII -> EBCDIC). The qualifier value is required and
+!! must be a valid VAX/VMS file specification. This file is
+!! used by VVDECODE if the file has been encoded using a
+!! different character set and the /TRANSLATION_FILE qualifier
+!! was not used to specify the translation table file.
+!!
+!! /LOG[=file_spec]
+!!
+!! specify a file to which status and logging information should
+!! be written. The qualifier value is optional, but if present,
+!! must be a valid VAX/VMS file specification. If absent,
+!! logging information is written to SYS$OUTPUT.
+!!
+!! /MODE=file_mode
+!!
+!! specify the VVcode file mode to be used to create the
+!! output file. This qualifier is not normally required as the
+!! VVE file specifies the mode of the original file, but may
+!! be used to override that value. The qualifier value is
+!! required and must be one of the values defined for the CLD
+!! type 'file_mode' (defined near the end of this file):
+!! BINARY or TEXT.
+!!
+!! /OVERWRITE
+!!
+!! specify that existing files can be overwritten by VVDECODE
+!! without first requesting permission.
+!!
+!! /PAD_CHARACTER=decimal_number
+!!
+!! specify the value of the character to be used to pad a fixed
+!! length format output file to ensure that its length is an
+!! exact multiple of the record length. The qualifier value is
+!! required and must be an integer in the range 0 - 255.
+!!
+!! /RECORD_LENGTH=decimal_number
+!!
+!! specify the maximum record length to be used when creating
+!! a fixed or variable length record format file. This
+!! qualifier is not normally required as the VVE file specifies
+!! the maximum record length of the original file. The
+!! qualifier value is required and must be an integer in the
+!! supported for the different file formats (FIXED: 2 - 32767,
+!! VARIABLE: 0 - 32765).
+!!
+!! /TIMESTAMP=time_value
+!!
+!! specify the timestamp to be applied to the output file
+!! created by VVDECODE. This qualifier is not normally required
+!! as the VVE file specifies the timestamp of the original file.
+!! The qualifier value is optional, but if present, must be a VMS
+!! absolute or combination time. If the qualifier value is
+!! omitted the current date and time is used.
+!!
+!! /TRANSLATION_FILE=file_spec
+!!
+!! specify a file containing the rules for translating between
+!! two character sets (e.g. ASCII -> EBCDIC). The qualifier
+!! value is required and must be a valid VAX/VMS file
+!! specification.
+!!
+!! /UUDECODE
+!!
+!! specify that the input file is a UUencoded file and should be
+!! decoded accordingly. This qualifier is provided to give
+!! VVDECODE an element of backwards compatibility. NOTE: this
+!! qualifier and the /XXDECODE qualifier are mutually exclusive.
+!!
+!! /XXDECODE
+!!
+!! specify that the input file is a XXencoded file and should be
+!! decoded accordingly. This qualifier is provided to give
+!! VVDECODE an element of backwards compatibility. NOTE: this
+!! qualifier and the /UUDECODE qualifier are mutually exclusive.
+!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+define verb VVDECODE
+ image VVCODE_DIR:VVDECODE
+!
+ parameter P1,
+ label=INPUT_FILE,
+ prompt="File_to_be_decoded",
+ value(required, type=$file)
+ parameter P2,
+ label=OUTPUT_FILE,
+ prompt="Output_File",
+ value(type=$file)
+!
+ qualifier DEBUG
+ qualifier ENCODING_TABLE,
+ nonnegatable,
+ value(required, type=$file)
+ qualifier FORMAT,
+ nonnegatable,
+ value(required, type=FILE_FORMAT)
+ qualifier HELP,
+ syntax=VVDECODE_HELP
+ qualifier INDEX_FILE,
+ nonnegatable,
+ value(required, type=$file)
+ qualifier LOG
+ nonnegatable,
+ value(type=$file)
+ qualifier MODE,
+ nonnegatable,
+ value(required, type=FILE_MODE)
+ qualifier OVERWRITE,
+ negatable,
+ default
+ qualifier PAD_CHARACTER,
+ nonnegatable,
+ value(required, type=$number)
+ qualifier RECORD_LENGTH,
+ nonnegatable,
+ value(required, type=$number)
+ qualifier TIMESTAMP,
+ nonnegatable,
+ value(type=$datetime)
+ qualifier TRANSLATION_FILE,
+ nonnegatable,
+ value(required, type=$file)
+ qualifier UUDECODE,
+ nonnegatable
+ qualifier XXDECODE,
+ nonnegatable
+ disallow UUDECODE AND XXDECODE
+
+
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!
+!! Define an alternative syntax for VVENCODE & VVDECODE so that the user can
+!! issue the command VVENCODE /HELP without being forced to specify a file
+!! parameter.
+!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+define syntax VVENCODE_HELP
+ image VVCODE_DIR:VVENCODE
+ noparameters
+
+define syntax VVDECODE_HELP
+ image VVCODE_DIR:VVDECODE
+ noparameters
+
+
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!
+!! Define the keywords that can be specified as values for the /FORMAT
+!! qualifier. No default value is specified because the value is normally
+!! determined from the input file.
+!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+define type FILE_FORMAT
+ keyword DEFAULT,
+ keyword FIXED,
+ keyword STREAM,
+ keyword VARIABLE
+
+
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!
+!! Define the keywords that can be specified as values for the /MODE
+!! qualifier. No default value is specified because the value is normally
+!! determined from the input file.
+!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+define type FILE_MODE
+ keyword BINARY,
+ keyword TEXT
diff --git a/support/vvcode/vvdecode.c b/support/vvcode/vvdecode.c
new file mode 100644
index 0000000000..d31fe5babc
--- /dev/null
+++ b/support/vvcode/vvdecode.c
@@ -0,0 +1,3562 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "vvdecode.c",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet)",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+**
+** MODULE CONTENTS
+**
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+static char rcsid[] = "$Id$";
+
+
+#define VVDECODE 1
+#define VVCODE_MAIN 1
+
+/*-
+**----------------------------------------------------------------------------
+** Standard include files
+**----------------------------------------------------------------------------
+*/
+#include <stdio.h>
+
+
+/*-
+**----------------------------------------------------------------------------
+** Include the machine specific definitions
+**----------------------------------------------------------------------------
+*/
+#include "checkos.h"
+#include "machine.h"
+#include "local.h"
+#include "globals.h"
+#include "specific.h"
+#include "vvutils.h"
+#include "vveparse.h"
+
+
+/*-
+**----------------------------------------------------------------------------
+** Forward declarations of functions in this file
+**----------------------------------------------------------------------------
+*/
+int main ARGS ((CONST int argc,
+ CONST char *argv[]));
+Boolean choose_xlt_table ARGS ((CONST Qualifier_Struct *xlt_qualifier,
+ CONST Qualifier_Struct *idx_qualifier,
+ CONST char *from_charset,
+ CONST char *to_charset,
+ File_Info *xlt_file));
+void decode ARGS ((void));
+Int16 decode_bytes ARGS ((CONST Int16 bytes_left,
+ CONST char *ip_buf_ptr,
+ char *op_buf_ptr));
+void find_next_part ARGS ((CONST Int16 part_needed,
+ File_Info *ip_file_ptr));
+void initialize ARGS ((void));
+void open_ip_file ARGS ((CONST Qualifier_Struct *ip_qualifier,
+ File_Info *ip_file));
+void open_next_part ARGS ((CONST Int16 part_needed,
+ File_Info *ip_file));
+void open_op_file ARGS ((CONST Qualifier_Struct *op_qualifier,
+ CONST Int16 overwrite_flag,
+ CONST char *vve_hdr_spec,
+ File_Info *op_file));
+char *parse_enc_tbl ARGS ((CONST char *line_ptr,
+ Header_Struct *hdr_struct,
+ File_Info *ip_file));
+Boolean prs_idx_file ARGS ((CONST char *from_charset,
+ CONST char *to_charset,
+ File_Info *idx_file,
+ File_Info *xlt_file));
+void rdfi_headers ARGS ((CONST Int16 decoding_type,
+ File_Info *ip_file,
+ Header_Struct *vve_hdr_array));
+void rdfi_trailers ARGS ((CONST Int16 decoding_type,
+ File_Info *ip_file,
+ File_Info *vve_file,
+ Header_Struct *vve_hdr_array));
+void set_decoding_type ARGS ((CONST Qualifier_Struct *uu_qualifier,
+ CONST Qualifier_Struct *xx_qualifier,
+ Int16 *decoding_type,
+ char **vve_line_prefix,
+ char **vve_eol_marker));
+void set_enc_tbl ARGS ((CONST Qualifier_Struct *enc_qualifier,
+ CONST Int16 enc_tbl_len,
+ char *encode_table));
+void set_format ARGS ((CONST Qualifier_Struct *fmt_qualifier,
+ CONST File_Info *vve_file,
+ CONST char *vve_os_str,
+ CONST char *fmt_str_array[],
+ File_Info *op_file));
+Boolean set_idx_file ARGS ((CONST Qualifier_Struct *idx_qualifier,
+ File_Info *idx_file));
+void set_mode ARGS ((CONST Qualifier_Struct *mode_qualifier,
+ CONST File_Info *vve_file,
+ CONST char *mode_str_array[],
+ File_Info *op_file));
+void set_pad_char ARGS ((CONST Qualifier_Struct *pad_qualifier,
+ CONST File_Info *op_file,
+ char *pad_char));
+void set_record_len ARGS ((CONST Qualifier_Struct *rec_qualifier,
+ CONST File_Info *vve_file,
+ File_Info *op_file));
+void set_timestamp ARGS ((CONST Qualifier_Struct *time_qualifier,
+ CONST File_Info *vve_file,
+ File_Info *op_file));
+void terminate ARGS ((void));
+void usage_error ARGS ((CONST char *reason));
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** choose_xlt_file
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** xlt_file
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** TRUE - a candidate translation file was found
+** FALSE - a candidate translation file could not be
+** identified
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+Boolean choose_xlt_table (CONST Qualifier_Struct *xlt_qualifier,
+ CONST Qualifier_Struct *idx_qualifier,
+ CONST char *from_charset,
+ CONST char *to_charset,
+ File_Info *xlt_file)
+#else /* NOT (ANSI_SYNTAX) */
+Boolean choose_xlt_table (xlt_qualifier, idx_qualifier, xlt_file,
+ from_charset, to_charset)
+ CONST Qualifier_Struct *xlt_qualifier;
+ CONST Qualifier_Struct *idx_qualifier;
+ CONST char *from_charset;
+ CONST char *to_charset;
+ File_Info *xlt_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ File_Info idx_file;
+ Boolean status;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the /TRANSLATION_FILE qualifier was specified, we use its value as
+ ** the file specification for the translation table file.
+ **------------------------------------------------------------------------
+ */
+ if (xlt_qualifier->present == TRUE)
+ {
+ strcpy (xlt_file->file_spec, xlt_qualifier->value);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** If an extension has not been provided, use the default extension
+ ** for the translation table file.
+ **--------------------------------------------------------------------
+ */
+#if (STICKY_DEFAULTS)
+ apply_defaults (NULL, DEF_XLT_EXT, xlt_file->file_spec);
+#endif /* (STICKY_DEFAULTS) */
+
+ return (TRUE);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** The /TRANSLATION_FILE qualifier was not specified, so we look for an
+ ** index file that might specify which translation file to use. The
+ ** function set_idx_file() will determine which index file to use or
+ ** return FALSE if it couldn't.
+ **------------------------------------------------------------------------
+ */
+ status = set_idx_file (idx_qualifier, &idx_file);
+
+ if (status != TRUE)
+ {
+ LOGMSG ("\nTranslation index file: none");
+ return (FALSE);
+ }
+ LOGMSG_1 ("\nTranslation index file: %s", idx_file.file_spec);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Now parse the index file to see if it contains an entry for the
+ ** desired character set translation.
+ **------------------------------------------------------------------------
+ */
+ status = prs_idx_file (from_charset, to_charset, &idx_file, xlt_file);
+ return (status);
+} /* choose_xlt_table */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** DEC_BYTE
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#define DEC_BYTE(_from,_to) \
+ if (G_decode_table[(int) (_from)] == INV_TABLE_ENTRY)\
+ {\
+ FATALMSG_4 ("invalid character %d (0x%02X) on line %ld of file `%s'",\
+ (int) (_from), (int) (_from), G_ip_file.line_no,\
+ G_ip_file.file_spec);\
+ vv_exit ();\
+ }\
+ else\
+ {\
+ _to = G_decode_table[(int) (_from)];\
+ }
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** decode
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** VVE O/P O/P Conversion
+** Fmt Fmt Func Type
+** --------------------------------------------------------------------
+** FIX FIX write_bytes() byte copy, filling records and
+** wrapping round record boundaries.
+** If necessary, the last O/P record
+** will be padded.
+** FIX STM write_bytes() byte copy.
+** FIX VAR write_bytes() byte copy, filling records to
+** maximum length and wrapping data
+** round record boundaries.
+**
+** STM FIX write_bytes() byte, filling records and
+** wrapping round record boundaries.
+** If necessary, the last O/P record
+** will be padded.
+** STM STM write_bytes() byte copy
+** STM VAR write_bytes() byte copy, filling records to
+** maximum length and wrapping data
+** round record boundaries.
+**
+** VAR FIX write_bytes() record byte copy, filling records
+** and wrapping round record
+** boundaries. If necessary, the last
+** O/P record will be padded.
+** VAR STM write_bytes() record byte copy
+** VAR VAR write_record() record copy, truncating any
+** overlong records
+** --------------------------------------------------------------------
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void decode (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void decode ()
+#endif /* (ANSI_SYNTAX) */
+{
+ Int16 bytes_left;
+ SIZE_T idx;
+ Int32 buffer_size;
+ Int16 bytes_decoded;
+ SIZE_T bytes_expected;
+ Int16 decode_state;
+ Int16 hdr_no;
+ char *ip_buf_ptr;
+ Int16 no_bytes_encoded;
+ char *op_buf_ptr;
+ Int16 part_ending;
+ Int32 rec_bytes_left;
+ char *record_buffer;
+ Int32 record_length;
+ char var_rec_size[32];
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ LOGMSG_2 ("\nPart %3d I/P file: %s",
+ G_ippt_no, G_ip_file.file_spec);
+ LOGMSG_2 ("Part %3d starts on line: %ld",
+ G_ippt_no, G_ip_file.line_no);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Allocate space to decode data. If the VVE file contains variable
+ ** length records, the decoded data bytes are accumulated in a buffer
+ ** before being written.
+ **
+ ** The size of IO_BUFFER_SIZE should be chosen so that most of the
+ ** records received can be accommodated. If an unusually large record is
+ ** encountered, a larger buffer will be allocated on demand.
+ **------------------------------------------------------------------------
+ */
+ buffer_size = IO_BUFFER_SIZE;
+ record_buffer = allocate_buffer ((SIZE_T) buffer_size, "record_buffer");
+ decode_state = DECODE_REC_LEN;
+ op_buf_ptr = record_buffer;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (;;)
+ {
+ ip_buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix,
+ G_ip_buffer, &G_ip_file, &G_ippart_bytes);
+
+ if (ip_buf_ptr == NULL)
+ {
+ if (feof (G_ip_file.file_ptr))
+ {
+ FATALMSG ("premature EOF encountered while decoding");
+ }
+ else
+ {
+ FATALMSG ("error reading encoded data");
+ }
+ show_file_context (&G_ip_file, NULL);
+ explain_error ();
+ vv_exit ();
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ ** Decode the byte count character. If it's less than zero, something
+ ** has gone wrong.
+ **--------------------------------------------------------------------
+ */
+ DEC_BYTE (ip_buf_ptr[0], no_bytes_encoded);
+ ip_buf_ptr++;
+
+ if (no_bytes_encoded < 0)
+ {
+ FATALMSG_1 ("invalid encoded byte count (%d)", no_bytes_encoded);
+ show_file_context (&G_ip_file, ip_buf_ptr);
+ vv_exit ();
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ ** If the byte count is zero, we're at the end of this segment. The
+ ** next line must be an 'end' or 'skipfrom' header line.
+ **--------------------------------------------------------------------
+ */
+ if (no_bytes_encoded == 0)
+ {
+ ip_buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix,
+ G_ip_buffer, &G_ip_file,
+ &G_ippart_bytes);
+
+ if (ip_buf_ptr == NULL)
+ {
+ FATALMSG ("error reading encoded data");
+ show_file_context (&G_ip_file, NULL);
+ explain_error ();
+ vv_exit ();
+ }
+
+
+ /*-
+ **----------------------------------------------------------------
+ **
+ **----------------------------------------------------------------
+ */
+ hdr_no = header_type (&G_ip_file, ip_buf_ptr, G_vvehdr);
+
+ switch (hdr_no)
+ {
+ /*-
+ **------------------------------------------------------------
+ **
+ **------------------------------------------------------------
+ */
+ case HDR_END:
+ LOGMSG_2 ("Part %3d ends on line: %ld",
+ G_ippt_no, G_ip_file.line_no);
+ return;
+
+ /*-
+ **------------------------------------------------------------
+ **
+ **------------------------------------------------------------
+ */
+ case HDR_SKIPTO:
+ if (G_dec_type != VV_DECODING)
+ {
+ FATALMSG_1 ("`%s' header only allowed in VVE files",
+ G_vvehdr[HDR_SKIPTO].h_string);
+ show_file_context (&G_ip_file, ip_buf_ptr);
+ vv_exit ();
+ }
+ parse_header (&G_ip_file, ip_buf_ptr, &G_vvehdr[hdr_no]);
+ sscanf (G_vvehdr[hdr_no].value, "%hd", &part_ending);
+
+ G_ippt_no++;
+ if (part_ending != G_ippt_no)
+ {
+ FATALMSG_2 ("Unexpected `%s %d'",
+ G_vvehdr[HDR_SKIPTO].h_string, part_ending);
+ show_file_context (&G_ip_file, ip_buf_ptr);
+ vv_exit ();
+ }
+
+ LOGMSG_2 ("Part %3d ends on line: %ld",
+ part_ending - 1, G_ip_file.line_no);
+ find_next_part (G_ippt_no, &G_ip_file);
+ continue;
+
+ /*-
+ **------------------------------------------------------------
+ **
+ **------------------------------------------------------------
+ */
+ default:
+ FATALMSG ("invalid header found");
+ show_file_context (&G_ip_file, ip_buf_ptr);
+ vv_exit ();
+ }
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ ** Check that there are enough characters in the line. The encoded
+ ** characters are always written in fours.
+ **--------------------------------------------------------------------
+ */
+ bytes_expected = (SIZE_T) (4 * ((no_bytes_encoded + 2) / 3));
+
+ if (G_eol_marker != NULL)
+ {
+ bytes_expected += strlen (G_eol_marker);
+ }
+
+ if (strlen (ip_buf_ptr) < bytes_expected)
+ {
+ ERRORMSG_2 ("%d characters expected - %d found",
+ bytes_expected, strlen (ip_buf_ptr));
+ show_file_context (&G_ip_file, ip_buf_ptr);
+ break;
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if (G_vv_file.format != FMT_VARIABLE)
+ {
+
+ /*-
+ **----------------------------------------------------------------
+ ** The VVE file was encoded in stream or fixed mode, so decode
+ ** this line of bytes and then write them, updating the CRC as we
+ ** go.
+ **----------------------------------------------------------------
+ */
+ op_buf_ptr = record_buffer;
+ bytes_left = no_bytes_encoded;
+
+ while (bytes_left > 0)
+ {
+ bytes_decoded = decode_bytes (bytes_left, ip_buf_ptr,
+ op_buf_ptr);
+ ip_buf_ptr += 4;
+ op_buf_ptr += bytes_decoded;
+ bytes_left -= bytes_decoded;
+ }
+
+ for (idx = 0; idx < (SIZE_T) no_bytes_encoded; idx++)
+ {
+ UPDATE_CRC32 (G_op_file.crc32, record_buffer[idx]);
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ ** If the /TRANSLATE command qualifier was specified, translate
+ ** the bytes read to the destination character set.
+ **----------------------------------------------------------------
+ */
+ if (Q_TRANSLATE)
+ {
+ for (idx = 0; idx < (SIZE_T) no_bytes_encoded; idx++)
+ {
+ record_buffer[idx] =
+ (char) G_xlt_table.xlt_tbl[(Byte) record_buffer[idx]];
+ }
+ }
+
+
+ write_bytes ((Int32) no_bytes_encoded, record_buffer, &G_op_file);
+ G_op_file.bytecount += (Int32) no_bytes_encoded;
+ }
+ else
+ {
+
+ /*-
+ **----------------------------------------------------------------
+ ** The VVE file contains variable length records which are much
+ ** more difficult to process.
+ **
+ ** If at the beginning of a record, treat the first two decoded
+ ** bytes as the record length.
+ **----------------------------------------------------------------
+ */
+ if (decode_state == DECODE_REC_LEN)
+ {
+ bytes_decoded = decode_bytes (2, ip_buf_ptr, var_rec_size);
+ record_length = 256L * (((Int32) var_rec_size[0]) & 0xff);
+ record_length += (((Int32) var_rec_size[1]) & 0xff);
+
+ /*-
+ **------------------------------------------------------------
+ **
+ **------------------------------------------------------------
+ */
+ if ((record_length < 0L) || (record_length > MAX_VV_RECORD_LEN))
+ {
+ FATALMSG_1 ("invalid record length recorded (%ld)",
+ (Int32) record_length);
+ show_file_context (&G_ip_file, ip_buf_ptr);
+ vv_exit ();
+ }
+
+ /*-
+ **------------------------------------------------------------
+ ** If this record is longer than the current buffer size, we
+ ** need to reallocate a larger buffer that most of the
+ ** records received can be accommodated. If an unusually
+ ** large record is encountered, a larger buffer will be
+ ** allocated on demand.
+ **------------------------------------------------------------
+ */
+ if (record_length > buffer_size)
+ {
+ record_buffer = (char *) realloc (record_buffer,
+ (SIZE_T) record_length);
+ if (record_buffer == NULL)
+ {
+ FATALMSG_1 ("couldn't reallocate %ld bytes \
+for the record buffer", record_length);
+ vv_exit ();
+ }
+ buffer_size = record_length;
+ DEBUG_1 ("decode: reallocated %ld bytes for the \
+record buffer", record_length);
+ }
+
+ /*-
+ **------------------------------------------------------------
+ ** The buffer is definitely big enough to hold the record, so
+ ** start decoding the encoded bytes into the buffer.
+ **
+ ** NOTE
+ **
+ ** We need to discard the first two decoded bytes which
+ ** contain the record length to avoid a full length record
+ ** overflowing the buffer.
+ **------------------------------------------------------------
+ */
+ bytes_left = no_bytes_encoded;
+ op_buf_ptr = record_buffer;
+ bytes_decoded = decode_bytes (bytes_left, ip_buf_ptr,
+ op_buf_ptr);
+ ip_buf_ptr += 4;
+ op_buf_ptr[0] = op_buf_ptr[2];
+ ++op_buf_ptr;
+ bytes_left -= bytes_decoded;
+
+ /*-
+ **------------------------------------------------------------
+ **
+ **------------------------------------------------------------
+ */
+ while (bytes_left > 0)
+ {
+ bytes_decoded = decode_bytes (bytes_left, ip_buf_ptr,
+ op_buf_ptr);
+ ip_buf_ptr += 4;
+ op_buf_ptr += bytes_decoded;
+ bytes_left -= bytes_decoded;
+ }
+
+ decode_state = DECODE_DATA;
+ rec_bytes_left = record_length;
+ no_bytes_encoded -= 2;
+ rec_bytes_left -= (Int32) no_bytes_encoded;
+ }
+ else
+ {
+
+ /*-
+ **------------------------------------------------------------
+ ** We're part of the way through a record, so just decode the
+ ** bytes and append the result to the record buffer.
+ **------------------------------------------------------------
+ */
+ bytes_left = no_bytes_encoded;
+
+ while (bytes_left > 0)
+ {
+ bytes_decoded = decode_bytes (bytes_left, ip_buf_ptr,
+ op_buf_ptr);
+ ip_buf_ptr += 4;
+ op_buf_ptr += bytes_decoded;
+ bytes_left -= bytes_decoded;
+ }
+ rec_bytes_left -= (Int32) no_bytes_encoded;
+ }
+
+
+ /*-
+ **----------------------------------------------------------------
+ ** If all of this record has now been read and decoded into
+ ** 'record_buffer', write it to the output file.
+ **----------------------------------------------------------------
+ */
+ if (rec_bytes_left <= 0L)
+ {
+ for (idx = 0; idx < (SIZE_T) record_length; idx++)
+ {
+ UPDATE_CRC32 (G_op_file.crc32, record_buffer[idx]);
+ }
+
+ /*-
+ **------------------------------------------------------------
+ ** If the /TRANSLATE command qualifier was specified,
+ ** translate the bytes read to the destination character set.
+ **------------------------------------------------------------
+ */
+ if (Q_TRANSLATE)
+ {
+ for (idx = 0; idx < (SIZE_T) record_length; idx++)
+ {
+ record_buffer[idx] =
+ (char) G_xlt_table.xlt_tbl[(Byte) record_buffer[idx]];
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------
+ **
+ **------------------------------------------------------------
+ */
+ if (G_op_file.format == FMT_VARIABLE)
+ {
+ write_record (record_length, record_buffer, &G_op_file);
+ }
+ else
+ {
+ write_bytes (record_length, record_buffer, &G_op_file);
+ }
+ decode_state = DECODE_REC_LEN;
+ G_op_file.bytecount += (Int32) record_length;
+ }
+ }
+ } /* end for (;;) */
+ free (record_buffer);
+} /* decode */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** decode_bytes
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int16 decode_bytes (CONST Int16 bytes_left,
+ CONST char *ip_buf_ptr,
+ char *op_buf_ptr)
+#else /* NOT (ANSI_SYNTAX) */
+ Int16 decode_bytes (bytes_left, ip_buf_ptr, op_buf_ptr)
+ CONST Int16 bytes_left;
+ CONST char *ip_buf_ptr;
+ char *op_buf_ptr;
+#endif /* (ANSI_SYNTAX) */
+{
+ register Int16 tmp0;
+ register Int16 tmp1;
+ register Int16 tmp2;
+ register Int16 tmp3;
+ register Int16 c1;
+ register Int16 c2;
+ register Int16 c3;
+ register Int16 bytes_decoded;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ bytes_decoded = 0;
+
+ if (bytes_left >= 1)
+ {
+ DEC_BYTE (ip_buf_ptr[0], tmp0);
+ DEC_BYTE (ip_buf_ptr[1], tmp1);
+ c1 = (Int16) (tmp0 << 2) | (tmp1 >> 4);
+ op_buf_ptr[0] = (char) c1;
+ ++bytes_decoded;
+ }
+
+ if (bytes_left >= 2)
+ {
+ DEC_BYTE (ip_buf_ptr[2], tmp2);
+ c2 = (Int16) (tmp1 << 4) | (tmp2 >> 2);
+ op_buf_ptr[1] = (char) c2;
+ ++bytes_decoded;
+ }
+
+ if (bytes_left >= 3)
+ {
+ DEC_BYTE (ip_buf_ptr[3], tmp3);
+ c3 = (Int16) (tmp2 << 6) | (tmp3);
+ op_buf_ptr[2] = (char) c3;
+ ++bytes_decoded;
+ }
+ return (bytes_decoded);
+} /* decode_bytes */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** find_next_part
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** NOTE: if every part is in a file of its own there will be an
+** overhead of reading each file TWICE before trying to open
+** the new file for the next part.
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void find_next_part (CONST Int16 part_needed,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void find_next_part (part_needed, ip_file)
+ CONST Int16 part_needed;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *buf_ptr;
+ Int16 hdr_no;
+ Int32 start_line_no;
+ Int16 search_pass;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (part_needed > MAX_VV_PARTS)
+ {
+ FATALMSG_1 ("maximum number of parts reached (%d)", MAX_VV_PARTS);
+ vv_exit ();
+ }
+ search_pass = 1;
+ start_line_no = ip_file->line_no;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix, G_ip_buffer,
+ ip_file, &G_ippart_bytes);
+ for (;;)
+ {
+ if (buf_ptr == NULL)
+ {
+
+ /*-
+ **----------------------------------------------------------------
+ **
+ **----------------------------------------------------------------
+ */
+ if (feof (ip_file->file_ptr))
+ {
+ /*-
+ **------------------------------------------------------------
+ **
+ **------------------------------------------------------------
+ */
+ if (ip_file->pipe_flag == TRUE)
+ {
+ FATALMSG_1 ("EOF encountered on search pass %d",
+ search_pass);
+ show_file_context (&G_ip_file, NULL);
+ vv_exit ();
+ }
+ else
+ {
+ DEBUG_1 ("find_next_part: EOF encountered on search \
+pass %d", search_pass);
+ DEBUG_2 ("find_next_part: Context: line %ld of file `%s'",
+ ip_file->line_no, ip_file->file_spec);
+ }
+
+ /*-
+ **------------------------------------------------------------
+ **
+ **------------------------------------------------------------
+ */
+ switch (search_pass)
+ {
+ case 1:
+ DEBUG_1 ("find_next_part: Rewinding file `%s'",
+ ip_file->file_spec);
+ rewind (ip_file->file_ptr);
+ ip_file->line_no = 0;
+ search_pass = 2;
+ buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE,
+ G_vv_prefix, G_ip_buffer,
+ ip_file, &G_ippart_bytes);
+ continue;
+ case 3:
+ FATALMSG_2 ("couldn't find part %d in file `%s'",
+ part_needed, ip_file->file_spec);
+ vv_exit ();
+ case 2:
+ default:
+ FATALMSG_1 ("EOF encountered on search pass %d",
+ search_pass);
+ show_file_context (ip_file, NULL);
+ vv_exit ();
+ }
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ **
+ **----------------------------------------------------------------
+ */
+ else
+ {
+ FATALMSG ("error reading file");
+ show_file_context (ip_file, NULL);
+ explain_error ();
+ vv_exit ();
+ }
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ ** If on pass two, avoid redundant re-reading of the lines read on
+ ** pass one.
+ **--------------------------------------------------------------------
+ */
+ if ((search_pass == 2) && (ip_file->line_no >= start_line_no))
+ {
+ DEBUG_2 ("find_next_part: Couldn't find part %d in file `%s'",
+ part_needed, ip_file->file_spec);
+ f_close (ip_file);
+ open_next_part (part_needed, ip_file);
+ search_pass = 3;
+ ip_file->line_no = 0;
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ ** Check whether this line is a header line. The only header lines
+ ** processed are the SKIPFROM and TABLE headers.
+ **--------------------------------------------------------------------
+ */
+ hdr_no = header_type (ip_file, buf_ptr, G_vvehdr);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** If a SKIPFROM header is encountered and an encoding table was not
+ ** specified on the command line, it is checked to see if it
+ ** corresponds to the start of wanted part.
+ **--------------------------------------------------------------------
+ */
+ if (hdr_no == HDR_SKIPFROM)
+ {
+ if (chk_skipfrom (buf_ptr, part_needed, G_hdrf_spec,
+ &G_vvehdr[HDR_SKIPFROM], ip_file) == TRUE)
+ {
+ LOGMSG_2 ("Part %3d starts on line: %ld",
+ part_needed, ip_file->line_no);
+ return;
+ }
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ ** If a TABLE header is encountered and the table contents were not
+ ** specified on the command line, the encoding table is updated.
+ **--------------------------------------------------------------------
+ */
+ else
+ if ((!Q_ENCODE) && (hdr_no == HDR_TABLE))
+ {
+ buf_ptr = parse_enc_tbl (buf_ptr, &G_vvehdr[HDR_TABLE], ip_file);
+
+ if (buf_ptr == NULL)
+ {
+ FATALMSG ("error reading encoding table");
+ show_file_context (ip_file, NULL);
+ vv_exit ();
+ }
+ strcpy ((char *) G_encode_table, G_vvehdr[HDR_TABLE].value);
+ continue;
+ }
+ buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix,
+ G_ip_buffer, ip_file, &G_ippart_bytes);
+ }
+} /* find_next_part */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** initialize
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void initialize (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void initialize ()
+#endif /* (ANSI_SYNTAX) */
+{
+ char *def_file_name;
+ Boolean status;
+ File_Info xlt_file;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ G_ip_file.line_no = 0;
+ G_ippt_no = 1;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ open_ip_file (&G_cmd_ipfile, &G_ip_file);
+ def_file_name = allocate_buffer ((MAX_PATH + 1), "def_file_name");
+ (void) split_file_spec (G_ip_file.file_spec, NULL, def_file_name,
+ NULL, NULL);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (Q_OVERWRITE)
+ {
+ G_overwrite_flag = OVERWRITE_YES;
+ }
+ else
+ if (G_ip_file.pipe_flag == TRUE)
+ {
+ G_overwrite_flag = OVERWRITE_NO;
+ }
+ else
+ {
+ G_overwrite_flag = OVERWRITE_ASK;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ open_log_file (&G_cmdqual[CMDQ_LOG], def_file_name, G_overwrite_flag,
+ &G_log_file);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ LOGMSG_3 ("VVdecode %s, %s release (%s)\n",
+ VV_VERSION_STR, VV_IMPLEMENTATION, VV_DATE);
+ LOGMSG_1 ("I/P file: %s", G_ip_file.file_spec);
+ LOGMSG_1 ("Overwrite existing files: %s",
+ (Q_OVERWRITE ? "yes" : "no"));
+ LOGMSG_1 ("Log file: %s", G_log_file.file_spec);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ (void) tz_offset (time ((TIME_T) NULL));
+ set_decoding_type (&G_cmdqual[CMDQ_UUDECODE], &G_cmdqual[CMDQ_XXDECODE],
+ &G_dec_type, &G_vv_prefix, &G_eol_marker);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ rdfi_headers (G_dec_type, &G_ip_file, G_vvehdr);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (G_dec_type == VV_DECODING)
+ {
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ getv_decodeversion (&G_vvehdr[HDR_DECODEVERSION],
+ &G_vv_decode_version);
+
+ if (G_vv_decode_version > (Int16) VV_MAJOR_VERSION_NO)
+ {
+ FATALMSG_2 ("VVdecode version %hd.0 or later is\
+required to decode file `%s'\n",
+ G_vv_decode_version, G_ip_file.file_spec);
+ vv_exit ();
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ G_vv_file.file_spec[0] = '\0';
+ getv_mode (&G_vvehdr[HDR_MODE], G_mode_str, &G_vv_file);
+ getv_format (&G_vvehdr[HDR_FORMAT], G_fmt_str, &G_vv_file);
+ getv_reclen (&G_vvehdr[HDR_RECORDLEN], &G_vv_file);
+ getv_timestamp (&G_vvehdr[HDR_TIMESTAMP], &G_vv_file);
+ }
+ else
+ {
+ G_vv_decode_version = 0;
+ G_vv_file.file_spec[0] = '\0';
+ G_vv_file.format = FMT_STREAM;
+ G_vv_file.mode = MODE_BINARY;
+ G_vv_file.mod_time = INV_TIMESTAMP;
+ G_vv_file.max_rec_len = INV_RECORD_LEN;
+ G_vv_file.lng_rec_len = INV_RECORD_LEN;
+ }
+ getv_operatingsystem (&G_vvehdr[HDR_OPERATINGSYSTEM],
+ &G_vv_operating_system);
+ getv_characterset (&G_vvehdr[HDR_CHARACTERSET], &G_vv_character_set);
+
+ LOGMSG_1 ("VVE header file spec: %s", G_hdrf_spec);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ set_enc_tbl (&G_cmdqual[CMDQ_ENCODE], ENCODE_TABLE_LEN, G_encode_table);
+ set_dec_tbl (ENCODE_TABLE_LEN, G_encode_table, DECODE_TABLE_LEN,
+ G_decode_table);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** ***CHANGES***
+ **------------------------------------------------------------------------
+ */
+ G_xlt_table.xlt_from = NULL;
+ G_xlt_table.xlt_to = NULL;
+
+ if ((Q_TRANSLATE) || (STRCMPI (G_vv_character_set, VV_CHARACTERSET) != 0))
+ {
+ status = choose_xlt_table (&G_cmdqual[CMDQ_TRANSLATE],
+ &G_cmdqual[CMDQ_INDEXFILE],
+ G_vv_character_set, VV_CHARACTERSET,
+ &xlt_file);
+
+ if (status == TRUE)
+ {
+ set_xlt_tbl (&xlt_file, &G_xlt_table, G_xlthdr);
+ }
+ else
+ {
+ LOGMSG ("\nTranslation performed: none");
+ }
+ }
+
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((G_xlt_table.xlt_from != NULL) && (G_xlt_table.xlt_to != NULL))
+ {
+ if (STRCMPI (G_vv_character_set, G_xlt_table.xlt_from) != 0)
+ {
+ WARNMSG_2 ("translation file translates from `%s' to `%s'",
+ G_xlt_table.xlt_from, G_xlt_table.xlt_to);
+ INFOMSG_1 ("VVE file character set is `%s'", G_vv_character_set);
+ }
+
+ if (STRCMPI (VV_CHARACTERSET, G_xlt_table.xlt_to) != 0)
+ {
+ WARNMSG_2 ("translation file translates from `%s' to `%s'",
+ G_xlt_table.xlt_from, G_xlt_table.xlt_to);
+ INFOMSG_1 ("local character set is `%s'", VV_CHARACTERSET);
+ }
+ } /* if (xlt_file != NULL) */
+ else
+ {
+ if (STRCMPI (G_vv_character_set, VV_CHARACTERSET) != 0)
+ {
+ WARNMSG_1 ("VVE file character set is `%s'", G_vv_character_set);
+ INFOMSG_1 ("local character set is `%s'", VV_CHARACTERSET);
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Set the key File_Info parameters, taking into account the file
+ ** parameters and the command line qualifier values.
+ **------------------------------------------------------------------------
+ */
+ set_mode (&G_cmdqual[CMDQ_MODE], &G_vv_file, G_mode_str, &G_op_file);
+ set_format (&G_cmdqual[CMDQ_FORMAT], &G_vv_file, G_vv_operating_system,
+ G_fmt_str, &G_op_file);
+ set_record_len (&G_cmdqual[CMDQ_RECORDLEN], &G_vv_file, &G_op_file);
+ set_timestamp (&G_cmdqual[CMDQ_TIMESTAMP], &G_vv_file, &G_op_file);
+ set_pad_char (&G_cmdqual[CMDQ_PADCHAR], &G_op_file, &G_op_padchar);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ open_op_file (&G_cmd_opfile, G_overwrite_flag, G_hdrf_spec, &G_op_file);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ init_crc32_table (CRC32_TABLE_SIZE, CRC32_POLYNOMIAL, G_crc32_table);
+ G_op_file.crc32 = CRC32_MASK;
+ G_op_file.bytecount = 0L;
+ G_ip_file.bytecount = 0L;
+ G_ippart_bytes = 0L;
+ free (def_file_name);
+} /* initialize */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** open_ip_file
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void open_ip_file (CONST Qualifier_Struct *ip_qualifier,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void open_ip_file (ip_qualifier, ip_file)
+ CONST Qualifier_Struct *ip_qualifier;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (ip_qualifier->present != TRUE)
+ {
+ INTERNAL_ERROR ("open_ip_file");
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ ip_file->file_ptr = (FILE *) NULL;
+ ip_file->mode = MODE_TEXT;
+ ip_file->format = DEF_TEXT_FMT;
+ ip_file->max_rec_len = INV_RECORD_LEN;
+ ip_file->lng_rec_len = INV_RECORD_LEN;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (STRCMP (ip_qualifier->value, STDIO_SYMBOL) == 0)
+ {
+ strcpy (ip_file->file_spec, "stdin");
+ ip_file->file_ptr = stdin;
+ ip_file->pipe_flag = TRUE;
+ }
+ else
+ {
+ strcpy (ip_file->file_spec, ip_qualifier->value);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** Apply the default file extension for VVencoded files.
+ **--------------------------------------------------------------------
+ */
+#if (STICKY_DEFAULTS)
+ apply_defaults (NULL, DEF_VV_EXT, ip_file->file_spec);
+#endif /* (STICKY_DEFAULTS) */
+
+
+ DEBUG_1 ("open_ip_file: opening input file `%s'", ip_file->file_spec);
+ ip_file->file_ptr = f_open_in (ip_file);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (ip_file->file_ptr == (FILE *) NULL)
+ {
+ FATALMSG_1 ("error opening input file `%s'", ip_file->file_spec);
+ vv_exit ();
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((ip_file->pipe_flag == TRUE) || (is_a_file (ip_file) == FALSE))
+ {
+ DEBUG_1 ("open_ip_file: `%s' is not a regular file",
+ ip_file->file_spec);
+ ip_file->pipe_flag = TRUE;
+ set_pipe_mode (ip_file);
+ }
+} /* open_ip_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** open_next_part
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void open_next_part (CONST Int16 part_needed,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void open_next_part (part_needed, ip_file)
+ CONST Int16 part_needed;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char file_ext[MAX_EXT + 1];
+ char prompt_str[65];
+
+ SPRINTF (file_ext, VV_EXT_FMT, part_needed);
+ force_file_ext (file_ext, ip_file->file_spec);
+
+ if (!file_exists (ip_file->file_spec))
+ {
+ ERRORMSG_2 ("couldn't find part %d file `%s'",
+ part_needed, ip_file->file_spec);
+ SPRINTF (prompt_str, "Enter file specification for part %d: ",
+ part_needed);
+ prompt_for_string (prompt_str, MAX_PATH, ip_file->file_spec);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ DEBUG_1 ("open_ip_file: opening input file `%s'", ip_file->file_spec);
+ ip_file->file_ptr = f_open_in (ip_file);
+
+ if (ip_file->file_ptr == (FILE *) NULL)
+ {
+ FATALMSG_1 ("couldn't open part file `%s'", ip_file->file_spec);
+ vv_exit ();
+ }
+ LOGMSG_2 ("\nPart %3d I/P file: %s",
+ part_needed, ip_file->file_spec);
+} /* open_next_part */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** open_op_file
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** Cmd VVE STICKY Result
+** -------------------------------
+** Y N * Cmd
+** Y Y N Cmd
+** Y Y Y Cmd + VVE
+** N Y * VVE
+** N N * Error
+** -------------------------------
+**
+** Notes: 1. The VVE file specification is checked by legal_filespec()
+** and transformed if appropriate.
+** 2. 'Cmd + VVE' means that the command line value is used,
+** with name/extension components taken from the VVE value if
+** STICKY_DEFAULTS has been defined for the implementation.
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void open_op_file (CONST Qualifier_Struct *op_qualifier,
+ CONST Int16 overwrite_flag,
+ CONST char *vve_hdr_spec,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void open_op_file (op_qualifier, overwrite_flag,
+ vve_hdr_spec, op_file)
+ CONST Qualifier_Struct *op_qualifier;
+ CONST Int16 overwrite_flag;
+ CONST char *vve_hdr_spec;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *vv_file_name;
+ char *vv_file_ext;
+ char *legal_hdrf_spec;
+
+ op_file->file_ptr = (FILE *) NULL;
+ legal_hdrf_spec = allocate_buffer ((MAX_PATH + 1), "legal_hdrf_spec");
+ vv_file_name = allocate_buffer ((MAX_PATH + 1), "vv_file_name");
+ vv_file_ext = allocate_buffer ((MAX_PATH + 1), "vv_file_ext");
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (op_qualifier->present == TRUE)
+ {
+ if (STRCMP (op_qualifier->value, STDIO_SYMBOL) == 0)
+ {
+ op_file->pipe_flag = TRUE;
+ strcpy (op_file->file_spec, "stdout");
+ op_file->file_ptr = stdout;
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ else
+ {
+ strcpy (op_file->file_spec, op_qualifier->value);
+
+#if (STICKY_DEFAULTS)
+ if (VVEH_BEGIN)
+ {
+ strcpy (legal_hdrf_spec, legal_filespec (vve_hdr_spec));
+ (void) split_file_spec (legal_hdrf_spec, NULL,
+ vv_file_name, vv_file_ext, NULL);
+ apply_defaults (vv_file_name, vv_file_ext, op_file->file_spec);
+ }
+#endif /* (STICKY_DEFAULTS) */
+
+ DEBUG_1 ("open_op_file: opening output file `%s'",
+ op_file->file_spec);
+ op_file->file_ptr = f_open_out (overwrite_flag, op_file);
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ else
+ if (VVEH_BEGIN)
+ {
+ strcpy (op_file->file_spec, legal_filespec (vve_hdr_spec));
+ DEBUG_1 ("open_op_file: opening output file `%s'", op_file->file_spec);
+ op_file->file_ptr = f_open_out (overwrite_flag, op_file);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ else
+ {
+ INTERNAL_ERROR ("open_op_file");
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (op_file->file_ptr == (FILE *) NULL)
+ {
+ FATALMSG_1 ("error opening output file `%s'", op_file->file_spec);
+ vv_exit ();
+ }
+ LOGMSG_1 ("O/P file: %s", op_file->file_spec);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Try to detect whether the output file is actually a character device
+ ** like a comms port. If it is, treat it as a pipe.
+ **------------------------------------------------------------------------
+ */
+ if ((op_file->pipe_flag == TRUE) || (is_a_file (op_file) == FALSE))
+ {
+ DEBUG_1 ("open_op_file: `%s' is not a regular file",
+ op_file->file_spec);
+ op_file->pipe_flag = TRUE;
+ set_pipe_mode (op_file);
+ }
+
+ free (vv_file_name);
+ free (vv_file_ext);
+ free (legal_hdrf_spec);
+} /* open_op_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** parse_enc_tbl
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *parse_enc_tbl (CONST char *line_ptr,
+ Header_Struct *hdr_struct,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ char *parse_enc_tbl (line_ptr, hdr_struct, ip_file)
+ CONST char *line_ptr;
+ Header_Struct *hdr_struct;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *buf_ptr;
+ char dummy[MAX_IP_LINE_LEN + 1];
+ char *tmp_ptr;
+ int chars_read;
+ int fields_read;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Allocate enough memory to hold an encoding table
+ **------------------------------------------------------------------------
+ */
+ hdr_struct->present = FALSE;
+ tmp_ptr = allocate_buffer ((ENCODE_TABLE_LEN + 1), "tmp_ptr");
+ fields_read = sscanf (line_ptr, "%*s %[^\n]", dummy);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (fields_read == 1)
+ {
+ vstrtrws (dummy);
+ chars_read = strlen (dummy);
+
+ if (chars_read <= ENCODE_TABLE_LEN)
+ {
+ strcpy (tmp_ptr, dummy);
+ }
+ else
+ {
+ ERRORMSG_1 ("too many characters (%d) in encoding table",
+ chars_read);
+ show_file_context (ip_file, NULL);
+ return (NULL);
+ }
+ }
+ else
+ {
+ *tmp_ptr = '\0';
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (;;)
+ {
+ chars_read = strlen ((char *) tmp_ptr);
+ buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix,
+ G_ip_buffer, ip_file, &G_ippart_bytes);
+
+ if (buf_ptr == NULL)
+ {
+ ERRORMSG ("error reading encoding table");
+ show_file_context (ip_file, NULL);
+ explain_error ();
+ return (NULL);
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ ** The table is terminated by the next header line encountered.
+ **--------------------------------------------------------------------
+ */
+ if (header_type (ip_file, buf_ptr, G_vvehdr) != HDR_UNKNOWN)
+ {
+ break;
+ }
+ chars_read += strlen (buf_ptr);
+
+ if (chars_read <= ENCODE_TABLE_LEN)
+ {
+ strcat (tmp_ptr, buf_ptr);
+ }
+ else
+ {
+ ERRORMSG_1 ("too many characters (%d) in encoding table",
+ chars_read);
+ show_file_context (ip_file, NULL);
+ return (NULL);
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (strlen (tmp_ptr) != ENCODE_TABLE_LEN)
+ {
+ ERRORMSG_1 ("wrong number of characters (%d) in encoding table",
+ chars_read);
+ show_file_context (ip_file, NULL);
+ return (NULL);
+ }
+ hdr_struct->present = TRUE;
+ hdr_struct->value = tmp_ptr;
+ return (buf_ptr);
+} /* parse_enc_tbl */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** prs_idx_file
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** xlt_file
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** TRUE - a candidate translation file was found
+** FALSE - a candidate translation file could not be
+** identified
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+Boolean prs_idx_file (CONST char *from_charset, CONST char *to_charset,
+ File_Info *idx_file, File_Info *xlt_file)
+#else /* NOT (ANSI_SYNTAX) */
+Boolean prs_idx_file (from_charset, to_charset, idx_file, xlt_file)
+ CONST char *from_charset;
+ CONST char *to_charset;
+ File_Info *idx_file;
+ File_Info *xlt_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char buffer[MAX_IP_LINE_LEN + 1];
+ Int32 bytes_read;
+ char *comment;
+ int fields_read;
+ char idx_from_charset[MAX_IP_LINE_LEN + 1];
+ char idx_to_charset[MAX_IP_LINE_LEN + 1];
+ char idx_xlt_filespec[MAX_IP_LINE_LEN + 1];
+ Boolean xlt_found;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ idx_file->mode = MODE_TEXT;
+ idx_file->format = DEF_TEXT_FMT;
+ idx_file->max_rec_len = INV_RECORD_LEN;
+ idx_file->lng_rec_len = INV_RECORD_LEN;
+ idx_file->line_no = 0;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ idx_file->file_ptr = f_open_in (idx_file);
+
+ if (idx_file->file_ptr == (FILE *) NULL)
+ {
+ FATALMSG_1 ("error opening translation index file `%s'",
+ idx_file->file_spec);
+ vv_exit ();
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ xlt_found = FALSE;
+
+ while (xlt_found != TRUE)
+ {
+ idx_file->line_no++;
+ bytes_read = read_line ((Int32) MAX_IP_LINE_LEN, buffer, idx_file);
+
+ if (bytes_read < 0)
+ {
+ if (feof (idx_file->file_ptr) != 0)
+ {
+ break;
+ }
+ ERRORMSG ("error reading translation index file");
+ show_file_context (idx_file, NULL);
+ explain_error ();
+ break;
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ buffer[MAX_IP_LINE_LEN] = (char) '\0';
+ comment = STRCHR (buffer, IDX_COMMENT_CHAR);
+
+ if (comment != NULL)
+ {
+ *comment = '\0';
+ }
+ (void) vstrtrws (buffer);
+
+ if (strlen (buffer) == 0)
+ {
+ continue;
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ fields_read = sscanf (buffer, "%s %s %s", idx_from_charset,
+ idx_to_charset, idx_xlt_filespec);
+
+ if (fields_read != 3)
+ {
+ ERRORMSG ("error parsing 3 entries in translation index file");
+ show_file_context (idx_file, buffer);
+ continue;
+ }
+
+ DEBUG_4 ("prs_idx_file: %04ld: From: `%s', To: `%s', XLT-file: `%s'",
+ idx_file->line_no, idx_from_charset, idx_to_charset,
+ idx_xlt_filespec);
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if ((STRCMPI (idx_from_charset, from_charset) == 0)
+ && (STRCMPI (idx_to_charset, to_charset) == 0))
+ {
+ strcpy (xlt_file->file_spec, idx_xlt_filespec);
+ xlt_found = TRUE;
+ }
+ } /* while (ret_status == TRUE) */
+ f_close (idx_file);
+ return (xlt_found);
+} /* prs_idx_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** rdfi_headers
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void rdfi_headers (CONST Int16 decoding_type,
+ File_Info *ip_file,
+ Header_Struct *vve_hdr_array)
+#else /* NOT (ANSI_SYNTAX) */
+ void rdfi_headers (decoding_type, ip_file,
+ vve_hdr_array)
+ CONST Int16 decoding_type;
+ File_Info *ip_file;
+ Header_Struct *vve_hdr_array;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *buf_ptr;
+ Int16 hdr_no;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix, G_ip_buffer,
+ ip_file, &G_ippart_bytes);
+ for (;;)
+ {
+
+ if (buf_ptr == NULL)
+ {
+ if (feof (ip_file->file_ptr))
+ {
+ FATALMSG_1 ("EOF encountered before `%s' header",
+ G_vvehdr[HDR_BEGIN].h_string);
+ show_file_context (ip_file, NULL);
+ explain_error ();
+ vv_exit ();
+ }
+ else
+ {
+ FATALMSG ("error reading file headers");
+ show_file_context (ip_file, NULL);
+ explain_error ();
+ vv_exit ();
+ }
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ hdr_no = header_type (ip_file, buf_ptr, vve_hdr_array);
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if (decoding_type != VV_DECODING)
+ {
+ switch (hdr_no)
+ {
+ case HDR_ATTRBEGIN:
+ case HDR_ATTREND:
+ case HDR_BYTECOUNT:
+ case HDR_CHARACTERSET:
+ case HDR_COMMENT:
+ case HDR_CRC32:
+ case HDR_DECODEVERSION:
+ case HDR_FORMAT:
+ case HDR_MODE:
+ case HDR_OPERATINGSYSTEM:
+ case HDR_RECORDLEN:
+ case HDR_SKIPFROM:
+ case HDR_SKIPTO:
+ case HDR_TIMESTAMP:
+ FATALMSG_1 ("VVcode header `%s' found when UU/XXdecoding",
+ G_vvehdr[hdr_no].h_string);
+ show_file_context (ip_file, buf_ptr);
+ vv_exit ();
+ break;
+ default:
+ break;
+ }
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ switch (hdr_no)
+ {
+ case HDR_UNKNOWN:
+ break;
+ case HDR_BEGIN:
+ if (vve_hdr_array[hdr_no].present == TRUE)
+ {
+ FATALMSG_1 ("header `%s' repeated",
+ vve_hdr_array[hdr_no].h_string);
+ show_file_context (ip_file, buf_ptr);
+ vv_exit ();
+ }
+ parse_begin_header (buf_ptr, ip_file, G_dec_type,
+ &vve_hdr_array[hdr_no], &G_hdrf_spec);
+ return;
+ case HDR_COMMENT:
+ display_comment (ip_file, buf_ptr, &vve_hdr_array[hdr_no]);
+ break;
+ case HDR_CHARACTERSET:
+ case HDR_DECODEVERSION:
+ case HDR_FORMAT:
+ case HDR_MODE:
+ case HDR_OPERATINGSYSTEM:
+ case HDR_RECORDLEN:
+ case HDR_TIMESTAMP:
+ if (vve_hdr_array[hdr_no].present == TRUE)
+ {
+ FATALMSG_1 ("header `%s' repeated",
+ vve_hdr_array[hdr_no].h_string);
+ show_file_context (ip_file, buf_ptr);
+ vv_exit ();
+ }
+ parse_header (ip_file, buf_ptr, &vve_hdr_array[hdr_no]);
+ break;
+
+ /*-
+ **------------------------------------------------------------
+ ** After parsing the encoding table, jump to the top of the
+ ** enclosing 'for' loop.
+ **------------------------------------------------------------
+ */
+ case HDR_TABLE:
+ buf_ptr = parse_enc_tbl (buf_ptr, &vve_hdr_array[hdr_no],
+ ip_file);
+
+ if (buf_ptr == NULL)
+ {
+ FATALMSG ("error reading encoding table");
+ show_file_context (ip_file, NULL);
+ vv_exit ();
+ }
+ continue;
+ case HDR_ATTRBEGIN:
+ case HDR_ATTREND:
+ WARNMSG_1 ("VVE header `%s' not yet supported",
+ vve_hdr_array[hdr_no].h_string);
+ show_file_context (ip_file, buf_ptr);
+ break;
+ case HDR_SKIPFROM:
+ case HDR_SKIPTO:
+ case HDR_END:
+ case HDR_BYTECOUNT:
+ case HDR_CRC32:
+ break;
+ default:
+ INTERNAL_ERROR ("rdfi_headers");
+ break;
+ }
+ buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix,
+ G_ip_buffer, ip_file, &G_ippart_bytes);
+ }
+} /* rdfi_headers */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** rdfi_trailers
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void rdfi_trailers (CONST Int16 decoding_type,
+ File_Info *ip_file,
+ File_Info *vve_file,
+ Header_Struct *vve_hdr_array)
+#else /* NOT (ANSI_SYNTAX) */
+ void rdfi_trailers (decoding_type, ip_file,
+ vve_file, vve_hdr_array)
+ CONST Int16 decoding_type;
+ File_Info *ip_file;
+ File_Info *vve_file;
+ Header_Struct *vve_hdr_array;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *buf_ptr;
+ int hdr_no;
+ int i;
+ int status;
+
+ for (i = 0; i < 2; i++)
+ {
+ buf_ptr = rd_next_line ((Int32) IP_BUFFER_SIZE, G_vv_prefix,
+ G_ip_buffer, ip_file, &G_ippart_bytes);
+
+ if (buf_ptr == NULL)
+ {
+ break;
+ }
+ hdr_no = header_type (ip_file, buf_ptr, vve_hdr_array);
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if (hdr_no == HDR_BYTECOUNT)
+ {
+ if (decoding_type != VV_DECODING)
+ {
+ FATALMSG_1 ("header `%s' not supported when UU/XXdecoding",
+ vve_hdr_array[hdr_no].h_string);
+ vv_exit ();
+ }
+
+ parse_header (ip_file, buf_ptr, &vve_hdr_array[hdr_no]);
+ status = sscanf (vve_hdr_array[hdr_no].value, "%ld",
+ &(vve_file->bytecount));
+
+ if ((status != 1) || (vve_file->bytecount < 0))
+ {
+ ERRORMSG_1 ("error parsing value of `%s' header",
+ vve_hdr_array[hdr_no].h_string);
+ show_file_context (ip_file, buf_ptr);
+ vve_hdr_array[hdr_no].present = FALSE;
+ }
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ else
+ if (hdr_no == HDR_CRC32)
+ {
+
+ if (decoding_type != VV_DECODING)
+ {
+ FATALMSG_1 ("header `%s' not supported when UU/XXdecoding",
+ vve_hdr_array[hdr_no].h_string);
+ vv_exit ();
+ }
+
+ parse_header (ip_file, buf_ptr, &vve_hdr_array[hdr_no]);
+ status = sscanf (vve_hdr_array[hdr_no].value, "%lx",
+ &(vve_file->crc32));
+
+ if (status != 1)
+ {
+ ERRORMSG_1 ("error parsing value of `%s' header",
+ vve_hdr_array[hdr_no].h_string);
+ show_file_context (ip_file, buf_ptr);
+ vve_hdr_array[hdr_no].present = FALSE;
+ }
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ else
+ {
+ break;
+ }
+ }
+} /* rdfi_trailers */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_decoding_type
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_decoding_type (
+ CONST Qualifier_Struct *uu_qualifier,
+ CONST Qualifier_Struct *xx_qualifier,
+ Int16 *decoding_type,
+ char **vve_line_prefix,
+ char **vve_eol_marker)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_decoding_type (uu_qualifier, xx_qualifier,
+ decoding_type, vve_line_prefix,
+ vve_eol_marker)
+ CONST Qualifier_Struct *uu_qualifier;
+ CONST Qualifier_Struct *xx_qualifier;
+ Int16 *decoding_type;
+ char **vve_line_prefix;
+ char **vve_eol_marker;
+#endif /* (ANSI_SYNTAX) */
+{
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (uu_qualifier->present == TRUE)
+ {
+ *decoding_type = UU_DECODING;
+ *vve_line_prefix = NULL;
+ *vve_eol_marker = NULL;
+ LOGMSG ("Decoding method: UUcode\n");
+ }
+ else if (xx_qualifier->present == TRUE)
+ {
+ *decoding_type = XX_DECODING;
+ *vve_line_prefix = NULL;
+ *vve_eol_marker = NULL;
+ LOGMSG ("Decoding method: XXcode\n");
+ }
+ else
+ {
+ *decoding_type = VV_DECODING;
+ *vve_line_prefix = STRDUP (VV_PREFIX);
+ *vve_eol_marker = STRDUP (VV_EOL_MARKER);
+ LOGMSG ("Decoding method: VVcode\n");
+ }
+} /* set_decoding_type */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_enc_tbl
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_enc_tbl (CONST Qualifier_Struct *enc_qualifier,
+ CONST Int16 enc_tbl_len,
+ char *encode_table)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_enc_tbl (enc_qualifier, enc_tbl_len,
+ encode_table)
+ CONST Qualifier_Struct *enc_qualifier;
+ CONST Int16 enc_tbl_len;
+ char *encode_table;
+#endif /* (ANSI_SYNTAX) */
+{
+ File_Info enc_file;
+ int status;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (enc_qualifier->present == TRUE)
+ {
+ strcpy (enc_file.file_spec, enc_qualifier->value);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** If an extension has not been provided, use the default extension
+ ** for encoding table files.
+ **--------------------------------------------------------------------
+ */
+#if (STICKY_DEFAULTS)
+ apply_defaults (NULL, DEF_ENC_EXT, enc_file.file_spec);
+#endif /* (STICKY_DEFAULTS) */
+
+ status = rd_enc_tbl (&enc_file, enc_tbl_len, encode_table);
+
+ if (!status)
+ {
+ FATALMSG_1 ("error reading encoding table file `%s'",
+ enc_file.file_spec);
+ vv_exit ();
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ else
+ if (VVEH_TABLE)
+ {
+ strcpy (enc_file.file_spec, G_ip_file.file_spec);
+ strcpy ((char *) encode_table, G_vvehdr[HDR_TABLE].value);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** There's no table in the file, nor one specified on the command
+ ** line, so use the default table for the particular decoding type.
+ **------------------------------------------------------------------------
+ */
+ else
+ {
+ switch (G_dec_type)
+ {
+ case UU_DECODING:
+ strcpy (enc_file.file_spec, "default UUcode");
+ strcpy ((char *) encode_table, UU_ENCODE_TABLE);
+ break;
+ case XX_DECODING:
+ strcpy (enc_file.file_spec, "default XXcode");
+ strcpy ((char *) encode_table, XX_ENCODE_TABLE);
+ break;
+ case VV_DECODING:
+ default:
+ strcpy (enc_file.file_spec, "default VVcode");
+ strcpy ((char *) encode_table, VV_ENCODE_TABLE);
+ break;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ LOGMSG_1 ("\nEncoding table source: %s", enc_file.file_spec);
+ LOGMSG_1 ("Encoding table contents: %.32s", encode_table);
+ LOGMSG_1 (" %.32s", encode_table + 32);
+
+} /* set_enc_tbl */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_format
+**
+** DESCRIPTION
+**
+** Set the format (fixed/stream/variable) to use when writing the output
+** file. The format may be set from the command line, VVE file or the
+** default specified in machine.h for the file mode. The logic used is:
+**
+** Cmd OS diff VVE Result
+** -------------------------------
+** Y * * Cmd
+** N Y * Def
+** N N Y VVE
+** N N N Def
+** -------------------------------
+**
+** INPUT PARAMETERS
+**
+** vve_file - a File_Info structure containing the results of
+** parsing the VVE file headers.
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_format (CONST Qualifier_Struct *fmt_qualifier,
+ CONST File_Info *vve_file,
+ CONST char *vve_os_str,
+ CONST char *fmt_str_array[],
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_format (fmt_qualifier, vve_file, vve_os_str,
+ fmt_str_array, op_file)
+ CONST Qualifier_Struct *fmt_qualifier;
+ CONST File_Info *vve_file;
+ CONST char *vve_os_str;
+ CONST char *fmt_str_array[];
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int16 cmd_format;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Get the format specified on the command line (if any).
+ **------------------------------------------------------------------------
+ */
+ cmd_format = getc_format (fmt_qualifier, fmt_str_array);
+
+
+ /*-
+ **------------------------------------------------------------------------
+ ** IF a valid format was specified on the command line
+ ** THEN use the command line format value.
+ **------------------------------------------------------------------------
+ */
+ if (cmd_format != INV_FORMAT)
+ {
+ op_file->format = cmd_format;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** IF a valid format was not specified on the command line
+ ** AND the VVE file was created on a different operating system
+ ** THEN use the default format and issue a warning.
+ **------------------------------------------------------------------------
+ */
+ else if (STRCMPI (vve_os_str, VV_OPERATING_SYSTEM) != 0)
+ {
+ WARNMSG_1 ("VVE file created on a different operating system: `%s'",
+ vve_os_str);
+ INFOMSG ("the output file will be created using the default format");
+ op_file->format = (op_file->mode == MODE_BINARY)
+ ? DEF_BINARY_FMT : DEF_TEXT_FMT;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** IF a valid format was not specified on the command line
+ ** AND the VVE file was created on the same operating system
+ ** AND the VVE file contained a valid format value
+ ** THEN use the VVE format value.
+ **------------------------------------------------------------------------
+ */
+ else if ((STRCMPI (vve_os_str, VV_OPERATING_SYSTEM) == 0)
+ && (vve_file->format != INV_FORMAT))
+ {
+ op_file->format = vve_file->format;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** ELSE use the default format value.
+ **------------------------------------------------------------------------
+ */
+ else
+ {
+ op_file->format = (op_file->mode == MODE_BINARY)
+ ? DEF_BINARY_FMT : DEF_TEXT_FMT;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ switch (op_file->format)
+ {
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ case FMT_FIXED:
+
+#if (SUPPORT_FIXED_FMT)
+ break;
+#else /* NOT (SUPPORT_FIXED_FMT) */
+ WARNMSG_1 ("format `%s' is not supported by this implementation",
+ fmt_str_array[op_file->format]);
+ INFOMSG ("output file will be created using the default format");
+ op_file->format = (op_file->mode == MODE_BINARY)
+ ? DEF_BINARY_FMT : DEF_TEXT_FMT;
+ break;
+#endif /* (SUPPORT_FIXED_FMT) */
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ case FMT_STREAM:
+
+#if (SUPPORT_STREAM_FMT)
+ break;
+#else /* NOT (SUPPORT_STREAM_FMT) */
+ WARNMSG_1 ("format `%s' is not supported by this implementation",
+ fmt_str_array[op_file->format]);
+ INFOMSG ("output file will be created using the default format");
+ op_file->format = (op_file->mode == MODE_BINARY)
+ ? DEF_BINARY_FMT : DEF_TEXT_FMT;
+ break;
+#endif /* (SUPPORT_STREAM_FMT) */
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ case FMT_VARIABLE:
+
+#if (SUPPORT_VARIABLE_FMT)
+ break;
+#else /* NOT (SUPPORT_VARIABLE_FMT) */
+ WARNMSG_1 ("format `%s' is not supported by this implementation",
+ fmt_str_array[op_file->format]);
+ INFOMSG ("output file will be created using the default format");
+ op_file->format = (op_file->mode == MODE_BINARY)
+ ? DEF_BINARY_FMT : DEF_TEXT_FMT;
+ break;
+#endif /* (SUPPORT_VARIABLE_FMT) */
+
+ default:
+ op_file->format = (op_file->mode == MODE_BINARY)
+ ? DEF_BINARY_FMT : DEF_TEXT_FMT;
+ break;
+ }
+
+
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (op_file->format != INV_FORMAT)
+ {
+ LOGMSG_1 ("O/P file format: %s",
+ fmt_str_array[op_file->format]);
+ }
+} /* set_format */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_idx_file
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean set_idx_file (CONST Qualifier_Struct *idx_qualifier,
+ File_Info *idx_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean set_idx_file (idx_qualifier, idx_file)
+ CONST Qualifier_Struct *idx_qualifier;
+ File_Info *idx_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *tmp_ptr;
+
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (idx_qualifier->present == TRUE)
+ {
+ strcpy (idx_file->file_spec, idx_qualifier->value);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** If an extension has not been provided, use the default extension
+ ** for the translation index file.
+ **--------------------------------------------------------------------
+ */
+#if (STICKY_DEFAULTS)
+ apply_defaults (NULL, DEF_IDX_EXT, idx_file->file_spec);
+#endif /* (STICKY_DEFAULTS) */
+
+ return (TRUE);
+ }
+
+ tmp_ptr = NULL;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((VV_INDEX_ENVVAR != NULL) && (strlen (VV_INDEX_ENVVAR) > 0))
+ {
+ tmp_ptr = getenv (VV_INDEX_ENVVAR);
+
+ if ((tmp_ptr != NULL) && (strlen (tmp_ptr) > 0))
+ {
+ strcpy (idx_file->file_spec, tmp_ptr);
+ return (TRUE);
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((tmp_ptr == NULL) && (VV_INDEX_FILE != NULL)
+ && (strlen (VV_INDEX_FILE) > 0) && file_exists (VV_INDEX_FILE))
+ {
+ strcpy (idx_file->file_spec, VV_INDEX_FILE);
+ return (TRUE);
+ }
+ return (FALSE);
+} /* set_idx_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_mode
+**
+** DESCRIPTION
+**
+** Set the mode (text/binary) to use when reading and encoding the input
+** file. The mode may be set from the command line, VVE file or the
+** default specified in machine.h. The logic used is:
+**
+** Cmd VVE Result
+** ----------------------
+** Y * Cmd
+** N N Def
+** N Y VVE
+** ----------------------
+**
+** INPUT PARAMETERS
+**
+** vve_file - a structure containing the results of
+** parsing the VVE file headers.
+**
+** OUTPUT PARAMETERS
+**
+** none
+**
+** RETURN VALUE
+**
+** none
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_mode (CONST Qualifier_Struct *mode_qualifier,
+ CONST File_Info *vve_file,
+ CONST char *mode_str_array[],
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_mode (mode_qualifier, vve_file,
+ mode_str_array, op_file)
+ CONST Qualifier_Struct *mode_qualifier;
+ CONST File_Info *vve_file;
+ CONST char *mode_str_array[];
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int16 cmd_mode;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Get the mode specified on the command line (if any).
+ **------------------------------------------------------------------------
+ */
+ cmd_mode = getc_mode (mode_qualifier, mode_str_array);
+
+ if (cmd_mode != INV_MODE)
+ {
+ op_file->mode = cmd_mode;
+ }
+ else
+ if (vve_file->mode != INV_MODE)
+ {
+ op_file->mode = vve_file->mode;
+ }
+ else
+ {
+ op_file->mode = DEF_MODE;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** One final check to make sure that the mode is valid. The mode can only
+ ** come from a validated command line or VVE file value, so it should not
+ ** be wrong.
+ **------------------------------------------------------------------------
+ */
+ switch (op_file->mode)
+ {
+ case MODE_BINARY:
+ case MODE_TEXT:
+ break;
+ default:
+ FATALMSG_1 ("invalid file encoding mode set (%d)", op_file->mode);
+ vv_exit ();
+ }
+ LOGMSG_1 ("\nO/P file mode: %s",
+ mode_str_array[op_file->mode]);
+} /* set_mode */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_pad_char
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_pad_char (CONST Qualifier_Struct *pad_qualifier,
+ CONST File_Info *op_file,
+ char *pad_char)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_pad_char (pad_qualifier, op_file, pad_char)
+ CONST Qualifier_Struct *pad_qualifier;
+ CONST File_Info *op_file;
+ char *pad_char;
+#endif /* (ANSI_SYNTAX) */
+{
+ int tmp_pad_char;
+ int status;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (pad_qualifier->present != TRUE)
+ {
+ DEBUG ("pad character not specified on the command line");
+
+ if (op_file->mode == MODE_BINARY)
+ {
+ tmp_pad_char = DEF_BINARY_PADCHAR;
+ }
+ else
+ {
+ tmp_pad_char = DEF_TEXT_PADCHAR;
+ }
+ }
+ else
+ {
+ tmp_pad_char = -1;
+ status = sscanf (pad_qualifier->value, "%d", &tmp_pad_char);
+
+ if ((status != 1) || (tmp_pad_char < 0) || (tmp_pad_char > 255))
+ {
+ USAGE ("pad character value must be in the range 0-255");
+ vv_exit ();
+ }
+ }
+
+ *pad_char = (char) (tmp_pad_char & 0xff);
+
+ if (op_file->format == FMT_FIXED)
+ {
+ LOGMSG_2 ("O/P file padding character: %d (0x%02x)",
+ *pad_char, *pad_char);
+ }
+
+} /* set_pad_char */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_record_len
+**
+** DESCRIPTION
+**
+** Set the maximum record length to use when writing the output file.
+** The record length may be set from the command line, VVE file or the
+** the default specified in machine.h. The logic used is:
+**
+** Cmd VVE Result
+** ----------------------
+** Y * Cmd
+** N Y VVE
+** N N Def
+** ----------------------
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_record_len (
+ CONST Qualifier_Struct *rec_qualifier,
+ CONST File_Info *vve_file,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_record_len (rec_qualifier, vve_file, op_file)
+ CONST Qualifier_Struct *rec_qualifier;
+ CONST File_Info *vve_file;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 cmd_reclen;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Get the record length specified on the command line (if any).
+ **------------------------------------------------------------------------
+ */
+ cmd_reclen = getc_reclen (rec_qualifier, op_file);
+
+ if (cmd_reclen != INV_RECORD_LEN)
+ {
+ op_file->max_rec_len = cmd_reclen;
+ }
+ else
+ if (vve_file->max_rec_len != INV_RECORD_LEN)
+ {
+ op_file->max_rec_len = vve_file->max_rec_len;
+ }
+ else
+ {
+ op_file->max_rec_len = INV_RECORD_LEN;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** One final check to make sure that the maximum record length is valid.
+ ** The record length can only come from a validated command line or VVE
+ ** file value or the default setting, so it should not be wrong.
+ ** There is an exception: the default may be set to INV_RECORD_LEN so that
+ ** f_open_out() will use a default value.
+ **------------------------------------------------------------------------
+ */
+ if (op_file->max_rec_len == INV_RECORD_LEN)
+ {
+ return;
+ }
+
+ if (op_file->format == FMT_VARIABLE)
+ {
+ if ((op_file->max_rec_len < MIN_VARIABLE_RECORD_LEN)
+ || (op_file->max_rec_len > MAX_VARIABLE_RECORD_LEN))
+ {
+ FATALMSG_1 ("invalid maximum fixed record length set (%ld)",
+ op_file->max_rec_len);
+ vv_exit ();
+ }
+ }
+ else
+ {
+ if (op_file->format == FMT_FIXED)
+ {
+ if ((op_file->max_rec_len < MIN_FIXED_RECORD_LEN)
+ || (op_file->max_rec_len > MAX_FIXED_RECORD_LEN))
+ {
+ FATALMSG_1 ("invalid maximum variable record length set (%ld)",
+ op_file->max_rec_len);
+ vv_exit ();
+ }
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Only report the maximum record length if it is meaningful for the file
+ ** format.
+ **------------------------------------------------------------------------
+ */
+ if ((op_file->format == FMT_FIXED) || (op_file->format == FMT_VARIABLE))
+ {
+ LOGMSG_1 ("O/P file maximum record length: %ld",
+ op_file->max_rec_len);
+ }
+} /* set_record_len */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_timestamp
+**
+** DESCRIPTION
+**
+** Set the timestamp to record in the VVE file. The timestamp may be
+** set from the command line or VVE file. The logic used is:
+**
+** Cmd VVE Result
+** ------------------------------
+** Y * Cmd
+** N Y ExF
+** N N Inv
+** ------------------------------
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_timestamp (
+ CONST Qualifier_Struct *time_qualifier,
+ CONST File_Info *vve_file,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_timestamp (time_qualifier, vve_file, op_file)
+ CONST Qualifier_Struct *time_qualifier;
+ CONST File_Info *vve_file;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ TIME_T cmd_timestamp;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Get the timestamp specified on the command line (if any).
+ **------------------------------------------------------------------------
+ */
+ cmd_timestamp = getc_timestamp (time_qualifier);
+
+ if (cmd_timestamp != INV_TIMESTAMP)
+ {
+ op_file->mod_time = cmd_timestamp;
+ }
+ else
+ if (vve_file->mod_time != INV_TIMESTAMP)
+ {
+ op_file->mod_time = vve_file->mod_time;
+ }
+ else
+ {
+ op_file->mod_time = INV_TIMESTAMP;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (op_file->mod_time != INV_TIMESTAMP)
+ {
+ LOGMSG_1 ("O/P file timestamp: %s",
+ vv_timestamp (op_file->mod_time));
+ }
+} /* set_timestamp */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** terminate
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void terminate (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void terminate ()
+#endif /* (ANSI_SYNTAX) */
+{
+ Boolean file_was_padded;
+ Int32 bytes_to_write;
+ Int32 total_records;
+ Int32 count;
+
+ G_op_file.crc32 = G_op_file.crc32 ^ CRC32_MASK;
+ G_ip_file.bytecount += G_ippart_bytes;
+ rdfi_trailers (G_dec_type, &G_ip_file, &G_vv_file, G_vvehdr);
+
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (Q_INPUT_FILE && (G_ip_file.file_ptr != stdin))
+ {
+ f_close (&G_ip_file);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((Q_OUTPUT_FILE || VVEH_BEGIN) && (G_op_file.file_ptr != stdout))
+ {
+
+ /*-
+ **--------------------------------------------------------------------
+ ** If we're writing a fixed format file, pad an incomplete last
+ ** record with the file padding character.
+ **--------------------------------------------------------------------
+ */
+ file_was_padded = FALSE;
+ if ((G_op_file.format == FMT_FIXED)
+ && ((G_op_file.bytecount % G_op_file.max_rec_len) != 0L))
+ {
+ total_records = (G_op_file.bytecount + G_op_file.max_rec_len - 1);
+ total_records /= G_op_file.max_rec_len;
+
+ bytes_to_write = (total_records * G_op_file.max_rec_len);
+ bytes_to_write -= G_op_file.bytecount;
+
+ for (count = 0; count < bytes_to_write; count++)
+ {
+ write_bytes (1L, &G_op_padchar, &G_op_file);
+ ++G_op_file.bytecount;
+ }
+ file_was_padded = TRUE;
+ }
+ f_close (&G_op_file);
+ }
+
+ LOGMSG_1 ("\nTotal bytes read: %ld", G_ip_file.bytecount);
+ LOGMSG_1 ("Total I/P parts read: %d", G_ippt_no);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (VVEH_BYTECOUNT)
+ {
+ if (G_vv_file.bytecount == G_op_file.bytecount)
+ {
+ LOGMSG_1 ("Total bytes written: %ld [OK]",
+ G_op_file.bytecount);
+ }
+ else
+ {
+ LOGMSG_1 ("Total bytes written: %ld",
+ G_op_file.bytecount);
+
+ if (file_was_padded == TRUE)
+ {
+ WARNMSG_2 ("last record was padded with value %d (0x%02x)",
+ G_op_padchar, G_op_padchar);
+ }
+ else
+ {
+ WARNMSG_1 ("file size does not match that recorded [%ld]",
+ G_vv_file.bytecount);
+ }
+ }
+ }
+ else
+ {
+ LOGMSG_1 ("Total bytes written: %ld [not recorded]",
+ G_op_file.bytecount);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (VVEH_CRC32)
+ {
+ if (G_vv_file.crc32 == G_op_file.crc32)
+ {
+ LOGMSG_1 ("CRC-32: %08lx [OK]",
+ G_op_file.crc32);
+ }
+ else
+ {
+ LOGMSG_1 ("CRC-32: %08lx",
+ G_op_file.crc32);
+ WARNMSG_1 ("CRC-32 does not match that recorded [%08lx]",
+ G_vv_file.crc32);
+ }
+ }
+ else
+ {
+ LOGMSG_1 ("CRC-32: %08lx [not recorded]",
+ G_op_file.crc32);
+ }
+
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((G_op_file.pipe_flag != TRUE) && (G_op_file.mod_time != INV_TIMESTAMP))
+ {
+ set_ftime (&G_op_file);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (Q_LOG && (G_log_file.file_ptr != stderr))
+ {
+ f_close (&G_log_file);
+ }
+} /* terminate */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** usage_error
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void usage_error (CONST char *reason)
+#else /* NOT (ANSI_SYNTAX) */
+ void usage_error (reason)
+ CONST char *reason;
+#endif /* (ANSI_SYNTAX) */
+{
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Initial error message, followed by Unix style usage message.
+ **------------------------------------------------------------------------
+ */
+ FPRINTF (stderr, "\nVVdecode %s, %s release (%s)\n\n",
+ VV_VERSION_STR, VV_IMPLEMENTATION, VV_DATE);
+ FPRINTF (stderr, "VVdecode: %s\n\n", reason);
+ FPRINTF (stderr,
+ "Usage: VVdecode [qualifiers] input_file [output_file]\n\n");
+ FPRINTF (stderr, " Valid qualifiers are:\n\n");
+
+ /*-
+ **------------------------------------------------------------------------
+ ** qualifier: 'debug' (if support compiled in)
+ **------------------------------------------------------------------------
+ */
+#if (VV_DEBUG_SUPPORT)
+ FPRINTF (stderr, " %.1s%s\n", QUAL_INTRO,
+ G_cmdqual[CMDQ_DEBUG].q_string);
+#endif /* (VV_DEBUG_SUPPORT) */
+
+ /*-
+ **------------------------------------------------------------------------
+ ** qualifier: 'encoding_table'
+ **------------------------------------------------------------------------
+ */
+ FPRINTF (stderr, " %.1s%s%.1sfile-spec\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_ENCODE].q_string, QUAL_SEP);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** qualifier: 'format'
+ **------------------------------------------------------------------------
+ */
+ FPRINTF (stderr,
+ " %.1s%s%.1sfile-format (formats supported: %s%s%s%s%s%s%s)\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_FORMAT].q_string, QUAL_SEP,
+ G_fmt_str[FMT_DEFAULT],
+
+#if (SUPPORT_FIXED_FMT)
+ " ", G_fmt_str[FMT_FIXED],
+#else /* NOT (SUPPORT_FIXED_FMT) */
+ "", "",
+#endif /* (SUPPORT_FIXED_FMT) */
+
+#if (SUPPORT_STREAM_FMT)
+ " ", G_fmt_str[FMT_STREAM],
+#else /* NOT (SUPPORT_STREAM_FMT) */
+ "", "",
+#endif /* (SUPPORT_STREAM_FMT) */
+
+#if (SUPPORT_VARIABLE_FMT)
+ " ", G_fmt_str[FMT_VARIABLE]);
+#else /* NOT (SUPPORT_VARIABLE_FMT) */
+ "", "");
+#endif /* (SUPPORT_VARIABLE_FMT) */
+
+
+ /*-
+ **------------------------------------------------------------------------
+ ** qualifiers: 'help', 'index', 'log', 'mode', 'overwrite'
+ **------------------------------------------------------------------------
+ */
+ FPRINTF (stderr, " %.1s%s\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_HELP].q_string);
+ FPRINTF (stderr, " %.1s%s%.1sfile-spec\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_INDEXFILE].q_string, QUAL_SEP);
+ FPRINTF (stderr, " %.1s%s[%.1sfile-spec]\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_LOG].q_string, QUAL_SEP);
+ FPRINTF (stderr,
+ " %.1s%s%.1sfile-encoding-mode (modes supported: binary text)\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_MODE].q_string, QUAL_SEP);
+ FPRINTF (stderr, " %.1s%s\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_OVERWRITE].q_string);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** qualifiers: 'pad_character', 'record_length', 'timestamp'
+ **------------------------------------------------------------------------
+ */
+ FPRINTF (stderr, " %.1s%s%.1sdecimal-char-value\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_PADCHAR].q_string, QUAL_SEP);
+ FPRINTF (stderr, " %.1s%s%.1sbytes\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_RECORDLEN].q_string, QUAL_SEP);
+ FPRINTF (stderr, " %.1s%s[%.1stime]\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_TIMESTAMP].q_string, QUAL_SEP);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** qualifiers: 'translation_file', 'uudecode', 'xxdecode'
+ **------------------------------------------------------------------------
+ */
+ FPRINTF (stderr, " %.1s%s%.1sfile-spec\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_TRANSLATE].q_string, QUAL_SEP);
+ FPRINTF (stderr, " %.1s%s\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_UUDECODE].q_string);
+ FPRINTF (stderr, " %.1s%s\n\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_XXDECODE].q_string);
+
+ G_status = FATAL_STATUS;
+ vv_exit ();
+} /* usage_error */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** main
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ int main (CONST int argc, CONST char *argv[])
+#else /* NOT (ANSI_SYNTAX) */
+ int main (argc, argv)
+ CONST int argc;
+ CONST char *argv[];
+#endif /* (ANSI_SYNTAX) */
+{
+ SIZE_T bytes_reqd;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Allocate the global message buffer manually since it is used by the
+ ** various MESSAGE_x and DEBUG_x macros.
+ **------------------------------------------------------------------------
+ */
+ G_status = LOG_STATUS;
+ bytes_reqd = sizeof (char) * (SIZE_T) MAX_MSG_LEN;
+ G_tmp_msg = (char *) malloc (bytes_reqd);
+
+ if (G_tmp_msg == NULL)
+ {
+ FPRINTF (stderr, "unable to allocate %ld bytes for buffer `G_tmp_msg'",
+ bytes_reqd);
+ G_status = FATAL_STATUS;
+ vv_exit ();
+ }
+ DEBUG_1 ("main: allocated %ld bytes for buffer `G_tmp_msg'",
+ (Int32) bytes_reqd);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Allocate the other global buffers.
+ **------------------------------------------------------------------------
+ */
+ G_ip_buffer = allocate_buffer ((SIZE_T) IP_BUFFER_SIZE, "G_ip_buffer");
+ G_op_buffer = allocate_buffer ((SIZE_T) OP_BUFFER_SIZE, "G_op_buffer");
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ scan_cmd_line (argc, argv, QUAL_INTRO, QUAL_SEP, G_cmdqual,
+ &G_cmd_ipfile, &G_cmd_opfile);
+
+#if (VV_DEBUG_SUPPORT)
+#else /* NOT (VV_DEBUG_SUPPORT) */
+ if (Q_DEBUG)
+ {
+ WARNMSG ("Debugging support was not compiled into VVdecode");
+ }
+#endif /* (VV_DEBUG_SUPPORT) */
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the 'help' option was selected, call usage_error() and stop.
+ **------------------------------------------------------------------------
+ */
+ if (Q_HELP)
+ {
+ USAGE ("help requested");
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the 'debug' option was selected, ensure that the 'log' option is
+ ** selected.
+ **------------------------------------------------------------------------
+ */
+ if (Q_DEBUG)
+ {
+ if (!Q_LOG)
+ {
+ G_cmdqual[CMDQ_LOG].present = TRUE;
+ G_cmdqual[CMDQ_LOG].value = NULL;
+ }
+ G_debugging = TRUE;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (!Q_INPUT_FILE)
+ {
+ USAGE ("input file must be specified");
+ }
+
+ initialize ();
+ decode ();
+
+ terminate ();
+ vv_exit ();
+ return (0);
+
+} /* main */
diff --git a/support/vvcode/vvencode.c b/support/vvcode/vvencode.c
new file mode 100644
index 0000000000..99b8827879
--- /dev/null
+++ b/support/vvcode/vvencode.c
@@ -0,0 +1,2349 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "vvencode.c",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet)",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+**
+** MODULE CONTENTS
+**
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+static char rcsid[] = "$Id$";
+
+
+#define VVENCODE 1
+#define VVCODE_MAIN 1
+
+/*-
+**----------------------------------------------------------------------------
+** Standard include files
+**----------------------------------------------------------------------------
+*/
+#include <stdio.h>
+
+
+/*-
+**----------------------------------------------------------------------------
+** Include the machine specific definitions
+**----------------------------------------------------------------------------
+*/
+#include "checkos.h"
+#include "machine.h"
+#include "local.h"
+#include "globals.h"
+#include "specific.h"
+#include "vvutils.h"
+
+
+/*-
+**----------------------------------------------------------------------------
+** Forward declarations of functions in this file
+**----------------------------------------------------------------------------
+*/
+int main ARGS ((CONST int argc,
+ CONST char *argv[]));
+Int32 enc_line ARGS ((CONST char *ip_buffer,
+ CONST Int32 num_bytes,
+ char *op_buffer));
+void encode ARGS ((void));
+void initialize ARGS ((void));
+void open_ip_file ARGS ((CONST Qualifier_Struct *ip_qualifier,
+ File_Info *ip_file));
+void open_op_file ARGS ((CONST Qualifier_Struct *op_qualifier,
+ CONST char *def_file_name,
+ CONST Int16 overwrite_flag,
+ File_Info *op_file));
+void set_enc_tbl ARGS ((CONST Qualifier_Struct *enc_qualifier,
+ CONST Int16 enc_tbl_len,
+ char *encode_table));
+void set_format ARGS ((CONST Qualifier_Struct *fmt_qualifier,
+ CONST File_Info *ex_file,
+ CONST char *fmt_str_array[],
+ File_Info *ip_file));
+void set_hdr_file_spec ARGS ((CONST Qualifier_Struct *hdr_qualifier,
+ CONST File_Info *ip_file,
+ char **hdr_file_spec));
+void set_ip_filespec ARGS ((CONST Qualifier_Struct *ip_qualifier,
+ File_Info *ip_file));
+void set_mode ARGS ((CONST Qualifier_Struct *mode_qualifier,
+ CONST File_Info *ex_file,
+ CONST char *mode_str_array[],
+ File_Info *ip_file));
+void set_record_len ARGS ((CONST Qualifier_Struct *rec_qualifer,
+ CONST File_Info *ex_file,
+ File_Info *ip_file));
+void set_split_size ARGS ((CONST File_Info *op_file,
+ Qualifier_Struct *split_qualifier,
+ Int32 *split_size));
+void set_timestamp ARGS ((CONST Qualifier_Struct *time_qualifier,
+ CONST File_Info *ex_file,
+ File_Info *ip_file));
+void start_next_op_file ARGS ((CONST Int16 overwrite_flag,
+ File_Info *op_file,
+ Int16 *op_part_no));
+void terminate ARGS ((void));
+void usage_error ARGS ((CONST char *reason));
+void wr_headers ARGS ((CONST Int16 part_no));
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** encode
+**
+** DESCRIPTION
+**
+** Encode the bytes from the input file and write them to the output
+** file.
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void encode (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void encode ()
+#endif /* (ANSI_SYNTAX) */
+{
+ char *ip_buffer;
+ char *buf_ptr;
+ Int32 buffer_size;
+ Int32 bytes_left;
+ Int32 bytes_read;
+ Int32 bytes_to_encode;
+ Int16 encode_state;
+ SIZE_T idx;
+ char tmp_buffer[MAX_ENCODED_BYTES + 2];
+ char vv_buffer[2 * MAX_ENCODED_BYTES];
+ Int32 vve_line_bytes;
+ Int32 vve_room_needed;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the input file has variable length format records, then allocate
+ ** a buffer to hold the largest possible record. For fixed or stream
+ ** format files, allocate a smaller buffer of IO_BUFFER_SIZE bytes.
+ **------------------------------------------------------------------------
+ */
+ if (G_ip_file.format == FMT_VARIABLE)
+ {
+ buffer_size = (Int32) MAX_VARIABLE_RECORD_LEN;
+ }
+ else
+ {
+ buffer_size = (Int32) IO_BUFFER_SIZE;
+ }
+ ip_buffer = allocate_buffer ((SIZE_T) buffer_size, "ip_buffer");
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (;;)
+ {
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if (G_ip_file.format == FMT_VARIABLE)
+ {
+ bytes_read = read_record (MAX_VARIABLE_RECORD_LEN, ip_buffer,
+ &G_ip_file);
+ if (bytes_read < 0L)
+ {
+ break;
+ }
+ G_ip_file.bytecount += bytes_read;
+ DEBUG_2 ("encode: record length = %5ld, total bytes read = %10ld",
+ bytes_read, G_ip_file.bytecount);
+ encode_state = ENCODE_REC_LEN;
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ else
+ {
+ bytes_read = read_bytes ((Int32) MAX_ENCODED_BYTES, ip_buffer,
+ &G_ip_file);
+ if (bytes_read <= 0L)
+ {
+ break;
+ }
+ G_ip_file.bytecount += (long) bytes_read;
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ ** If the /TRANSLATE command qualifier was specified, translate the
+ ** bytes read to the destination character set.
+ **--------------------------------------------------------------------
+ */
+ if (Q_TRANSLATE)
+ {
+ for (idx = 0; idx < (SIZE_T) bytes_read; idx++)
+ {
+ ip_buffer[idx] =
+ (char) G_xlt_table.xlt_tbl[(Byte) ip_buffer[idx]];
+ }
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ ** Compute the CRC of the bytes to be encoded in the VVE file.
+ **--------------------------------------------------------------------
+ */
+ for (idx = 0; idx < (SIZE_T) bytes_read; idx++)
+ {
+ UPDATE_CRC32 (G_ip_file.crc32, ip_buffer[idx]);
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ ** Write the remaining bytes in chunks of MAX_ENCODED_BYTES. If the
+ ** file is in variable length format, each record is likely to have a
+ ** shorter last line.
+ **--------------------------------------------------------------------
+ */
+ bytes_left = bytes_read;
+ buf_ptr = ip_buffer;
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ while (bytes_left > 0L)
+ {
+
+ /*-
+ **----------------------------------------------------------------
+ **
+ **----------------------------------------------------------------
+ */
+ if ((G_ip_file.format == FMT_VARIABLE)
+ && (encode_state == ENCODE_REC_LEN))
+ {
+ bytes_to_encode = MINIMUM (bytes_left, MAX_ENCODED_BYTES - 2);
+ tmp_buffer[0] = (char) (bytes_read / 256);
+ tmp_buffer[1] = (char) (bytes_read % 256);
+
+ for (idx = 0; idx < (SIZE_T) bytes_to_encode; idx++)
+ {
+ tmp_buffer[2 + idx] = ip_buffer[idx];
+ }
+ vve_line_bytes = enc_line (tmp_buffer, bytes_to_encode + 2,
+ vv_buffer);
+ bytes_left -= bytes_to_encode;
+ buf_ptr += (SIZE_T) bytes_to_encode;
+ encode_state = ENCODE_DATA;
+ }
+ /*-
+ **----------------------------------------------------------------
+ **
+ **----------------------------------------------------------------
+ */
+ else
+ {
+ bytes_to_encode = MINIMUM (bytes_left, MAX_ENCODED_BYTES);
+ vve_line_bytes = enc_line (buf_ptr, bytes_to_encode,
+ vv_buffer);
+ bytes_left -= bytes_to_encode;
+ buf_ptr += (SIZE_T) bytes_to_encode;
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ ** If a maximum VVE output file size has been specified, check
+ ** whether this encoded line will cause that maximum size to be
+ ** exceeded.
+ **----------------------------------------------------------------
+ */
+ if (Q_SPLIT)
+ {
+ vve_room_needed = vve_line_bytes + TEXT_LINE_OVERHEAD
+ + VV_POSTAMBLE_LEN;
+
+ if ((G_oppart_bytes + vve_room_needed) >= G_split_size)
+ {
+ start_next_op_file (G_overwrite_flag, &G_op_file,
+ &G_oppt_no);
+ G_op_file.bytecount += G_oppart_bytes;
+ G_oppart_bytes = 0L;
+ wr_headers (G_oppt_no);
+ }
+ }
+
+ /*-
+ **----------------------------------------------------------------
+ ** Write the encoded line to the VVE file.
+ **----------------------------------------------------------------
+ */
+ VVEOUT (vv_buffer);
+ } /* while (bytes_left > 0L) */
+ } /* for (;;) */
+} /* encode */
+
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** initialize
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void initialize (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void initialize ()
+#endif /* (ANSI_SYNTAX) */
+{
+ File_Info ex_file_info;
+ char *def_file_name;
+ File_Info xlt_file;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Set up the input file specification from the command line argument.
+ ** The 'pipe_flag' structure field is also set up.
+ **------------------------------------------------------------------------
+ */
+ set_ip_filespec (&G_cmd_ipfile, &G_ip_file);
+ def_file_name = allocate_buffer ((MAX_PATH + 1), "def_file_name");
+ (void) split_file_spec (G_ip_file.file_spec, NULL, def_file_name,
+ NULL, NULL);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (Q_OVERWRITE)
+ {
+ G_overwrite_flag = OVERWRITE_YES;
+ }
+ else
+ if (G_ip_file.pipe_flag == TRUE)
+ {
+ G_overwrite_flag = OVERWRITE_NO;
+ }
+ else
+ {
+ G_overwrite_flag = OVERWRITE_ASK;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the 'log' qualifier was specified, open the log file. On systems
+ ** which use 'STICKY_DEFAULTS', this must be done after the input file
+ ** specification is known.
+ **------------------------------------------------------------------------
+ */
+ open_log_file (&G_cmdqual[CMDQ_LOG], def_file_name, G_overwrite_flag,
+ &G_log_file);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ LOGMSG_3 ("VVencode %s, %s release (%s)\n",
+ VV_VERSION_STR, VV_IMPLEMENTATION, VV_DATE);
+ LOGMSG_1 ("I/P file: %s", G_ip_file.file_spec);
+ LOGMSG_1 ("Overwrite existing files: %s",
+ (Q_OVERWRITE ? "yes" : "no"));
+ LOGMSG_1 ("Log file: %s", G_log_file.file_spec);
+ LOGMSG ("Encoding method: VVcode\n");
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Ensure that the local timezone offset from GMT is initialized.
+ **------------------------------------------------------------------------
+ */
+ (void) tz_offset (time ((TIME_T) NULL));
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If we're not reading from standard input, attempt to determine the
+ ** the key file parameters by examining the file.
+ **------------------------------------------------------------------------
+ */
+ if (G_ip_file.pipe_flag != TRUE)
+ {
+ strcpy (ex_file_info.file_spec, G_ip_file.file_spec);
+ examine_file (&ex_file_info);
+
+ LOGMSG_1 ("I/P file mode: %s",
+ (ex_file_info.mode != INV_MODE) ?
+ (char *) G_mode_str[ex_file_info.mode] : "unknown");
+ LOGMSG_1 ("I/P file format: %s",
+ (ex_file_info.format != INV_FORMAT) ?
+ (char *) G_fmt_str[ex_file_info.format] : "unknown");
+
+ if (ex_file_info.lng_rec_len != INV_RECORD_LEN)
+ {
+ LOGMSG_1 ("I/P file longest record length: %ld",
+ ex_file_info.lng_rec_len);
+ }
+ else
+ {
+ LOGMSG ("I/P file longest record length: unknown");
+ }
+
+ if (ex_file_info.max_rec_len != INV_RECORD_LEN)
+ {
+ LOGMSG_1 ("I/P file maximum record length: %ld",
+ ex_file_info.max_rec_len);
+ }
+ else
+ {
+ LOGMSG ("I/P file maximum record length: unknown");
+ }
+
+ LOGMSG_1 ("I/P file timestamp: %s\n",
+ (ex_file_info.mod_time != INV_TIMESTAMP) ?
+ vv_timestamp (ex_file_info.mod_time) : "unknown");
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Set the key File_Info parameters, taking into account the file
+ ** parameters and the command line qualifier values.
+ **------------------------------------------------------------------------
+ */
+ set_mode (&G_cmdqual[CMDQ_MODE], &ex_file_info, G_mode_str, &G_ip_file);
+ set_format (&G_cmdqual[CMDQ_FORMAT], &ex_file_info, G_fmt_str, &G_ip_file);
+ set_record_len (&G_cmdqual[CMDQ_RECORDLEN], &ex_file_info, &G_ip_file);
+ set_timestamp (&G_cmdqual[CMDQ_TIMESTAMP], &ex_file_info, &G_ip_file);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Get and act upon the other command line qualifiers.
+ **------------------------------------------------------------------------
+ */
+ set_hdr_file_spec (&G_cmdqual[CMDQ_HDRFILE], &G_ip_file, &G_hdrf_spec);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ set_enc_tbl (&G_cmdqual[CMDQ_ENCODE], ENCODE_TABLE_LEN, G_encode_table);
+ set_dec_tbl (ENCODE_TABLE_LEN, G_encode_table,
+ DECODE_TABLE_LEN, G_decode_table);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (Q_TRANSLATE)
+ {
+ strcpy (xlt_file.file_spec, G_cmdqual[CMDQ_TRANSLATE].value);
+ set_xlt_tbl (&xlt_file, &G_xlt_table, G_xlthdr);
+
+ if (STRCMPI (VV_CHARACTERSET, G_xlt_table.xlt_from) != 0)
+ {
+ WARNMSG_2 ("translation file translates from `%s' to `%s'",
+ G_xlt_table.xlt_from, G_xlt_table.xlt_to);
+ INFOMSG_1 ("local character set is `%s'", VV_CHARACTERSET);
+ }
+ }
+ else
+ {
+ LOGMSG ("Translation performed: none");
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ open_ip_file (&G_cmd_ipfile, &G_ip_file);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ open_op_file (&G_cmd_opfile, def_file_name, G_overwrite_flag, &G_op_file);
+ set_split_size (&G_op_file, &G_cmdqual[CMDQ_SPLIT], &G_split_size);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Initialize global variables.
+ **------------------------------------------------------------------------
+ */
+ init_crc32_table (CRC32_TABLE_SIZE, CRC32_POLYNOMIAL, G_crc32_table);
+ G_ip_file.crc32 = CRC32_MASK;
+ G_ip_file.bytecount = 0L;
+ G_op_file.bytecount = 0L;
+ G_oppart_bytes = 0L;
+ G_oppt_no = 1;
+ free (def_file_name);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Write the VVE file header lines.
+ **------------------------------------------------------------------------
+ */
+ wr_headers (G_oppt_no);
+} /* initialize */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** open_ip_file
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void open_ip_file (CONST Qualifier_Struct *ip_qualifier,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void open_ip_file (ip_qualifier, ip_file)
+ CONST Qualifier_Struct *ip_qualifier;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (ip_qualifier->present != TRUE)
+ {
+ INTERNAL_ERROR ("open_ip_file");
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (ip_file->pipe_flag == TRUE)
+ {
+ ip_file->file_ptr = stdin;
+ }
+ else
+ {
+ DEBUG_1 ("encode: opening input file `%s'", ip_file->file_spec);
+ ip_file->file_ptr = f_open_in (ip_file);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (ip_file->file_ptr == (FILE *) NULL)
+ {
+ FATALMSG_1 ("error opening input file `%s'", ip_file->file_spec);
+ vv_exit ();
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((ip_file->pipe_flag == TRUE) || (is_a_file (ip_file) == FALSE))
+ {
+ DEBUG_1 ("open_ip_file: `%s' is not a regular file",
+ ip_file->file_spec);
+ ip_file->pipe_flag = TRUE;
+ set_pipe_mode (ip_file);
+ }
+} /* open_ip_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** open_op_file
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void open_op_file (CONST Qualifier_Struct *op_qualifier,
+ CONST char *def_file_name,
+ CONST Int16 overwrite_flag,
+ File_Info *op_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void open_op_file (op_qualifier, def_file_name,
+ overwrite_flag, op_file)
+ CONST Qualifier_Struct *op_qualifier;
+ CONST char *def_file_name;
+ CONST Int16 overwrite_flag;
+ File_Info *op_file;
+#endif /* (ANSI_SYNTAX) */
+{
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ op_file->file_ptr = (FILE *) NULL;
+ op_file->mode = MODE_TEXT;
+ op_file->format = DEF_TEXT_FMT;
+ op_file->max_rec_len = INV_RECORD_LEN;
+ op_file->lng_rec_len = INV_RECORD_LEN;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (op_qualifier->present == TRUE)
+ {
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+#if (SUPPORT_PIPING)
+ if (STRCMP (op_qualifier->value, STDIO_SYMBOL) == 0)
+ {
+ op_file->pipe_flag = TRUE;
+ strcpy (op_file->file_spec, "stdout");
+ op_file->file_ptr = stdout;
+ op_file->format = FMT_STREAM;
+ }
+ else
+#endif /* (SUPPORT_PIPING) */
+
+ {
+ strcpy (op_file->file_spec, op_qualifier->value);
+
+ /*-
+ **----------------------------------------------------------------
+ ** The default file spec for the VVencoded file is the name of the
+ ** input file with the default extension for VVencoded files.
+ **----------------------------------------------------------------
+ */
+#if (STICKY_DEFAULTS)
+ apply_defaults (def_file_name, DEF_VV_EXT, op_file->file_spec);
+#endif /* (STICKY_DEFAULTS) */
+
+ DEBUG_1 ("open_op_file: opening output file `%s'",
+ op_file->file_spec);
+ op_file->file_ptr = f_open_out (overwrite_flag, op_file);
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ else
+ {
+
+#if (STDOUT_OUTPUT)
+ strcpy (op_file->file_spec, "stdout");
+ op_file->file_ptr = stdout;
+ op_file->pipe_flag = TRUE;
+
+#else /* NOT (STDOUT_OUTPUT) */
+
+ strcpy (op_file->file_spec, "");
+ make_file_spec (NULL, def_file_name, NULL, NULL, op_file->file_spec);
+ apply_defaults (NULL, DEF_VV_EXT, op_file->file_spec);
+ DEBUG_1 ("open_op_file: opening output file `%s'", op_file->file_spec);
+ op_file->file_ptr = f_open_out (overwrite_flag, op_file);
+
+#endif /* (STDOUT_OUTPUT) */
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (op_file->file_ptr == (FILE *) NULL)
+ {
+ FATALMSG_1 ("error opening output file `%s'", op_file->file_spec);
+ vv_exit ();
+ }
+ LOGMSG_1 ("\nVVE O/P file: %s", op_file->file_spec);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((op_file->pipe_flag == TRUE) || (is_a_file (op_file) == FALSE))
+ {
+ DEBUG_1 ("open_op_file: `%s' is not a regular file",
+ op_file->file_spec);
+ op_file->pipe_flag = TRUE;
+ set_pipe_mode (op_file);
+ }
+} /* open_op_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_enc_tbl
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_enc_tbl (CONST Qualifier_Struct *enc_qualifier,
+ CONST Int16 enc_tbl_len,
+ char *encode_table)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_enc_tbl (enc_qualifier, enc_tbl_len,
+ encode_table)
+ CONST Qualifier_Struct *enc_qualifier;
+ CONST Int16 enc_tbl_len;
+ char *encode_table;
+#endif /* (ANSI_SYNTAX) */
+{
+ File_Info enc_file;
+ int status;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (enc_qualifier->present == TRUE)
+ {
+ strcpy (enc_file.file_spec, enc_qualifier->value);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** If an extension has not been provided, use the default extension
+ ** for encoding table files.
+ **--------------------------------------------------------------------
+ */
+#if (STICKY_DEFAULTS)
+ apply_defaults (NULL, DEF_ENC_EXT, enc_file.file_spec);
+#endif /* (STICKY_DEFAULTS) */
+
+ status = rd_enc_tbl (&enc_file, enc_tbl_len, encode_table);
+
+ if (!status)
+ {
+ FATALMSG_1 ("error reading encoding table file `%s'",
+ enc_file.file_spec);
+ vv_exit ();
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ else
+ {
+ DEBUG ("encoding table not specified on the command line");
+ strcpy (enc_file.file_spec, "default VVCODE");
+ strcpy ((char *) encode_table, VV_ENCODE_TABLE);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ LOGMSG_1 ("\nEncoding table source: %s", enc_file.file_spec);
+ LOGMSG_1 ("Encoding table contents: %.32s", encode_table);
+ LOGMSG_1 (" %.32s", encode_table + 32);
+} /* set_enc_tbl */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_format
+**
+** DESCRIPTION
+**
+** Set the format (fixed/stream/variable) to use when reading and
+** encoding the input file. The format may be set from the command
+** line, examine_file() or the default specified in machine.h. The
+** logic used is:
+**
+** Cmd ExFile Pipe Result
+** ------------------------------
+** Y * * Cmd
+** N N N Def
+** N Y N ExF
+** N * Y Stm
+** ------------------------------
+**
+** NOTE: if the input file is standard input, examine_file() is not
+** called and stream format is used unless it is overrriden
+** from the command line.
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_format (CONST Qualifier_Struct *fmt_qualifier,
+ CONST File_Info *ex_file,
+ CONST char *fmt_str_array[],
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_format (fmt_qualifier, ex_file, fmt_str_array,
+ ip_file)
+ CONST Qualifier_Struct *fmt_qualifier;
+ CONST File_Info *ex_file;
+ CONST char *fmt_str_array[];
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int16 cmd_format;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Get the format specified on the command line (if any). The number of
+ ** 'if' statements could be reduced by making the second expression more
+ ** complicated at a cost of less readable code.
+ **------------------------------------------------------------------------
+ */
+ cmd_format = getc_format (fmt_qualifier, fmt_str_array);
+
+ if (cmd_format != INV_FORMAT)
+ {
+ ip_file->format = cmd_format;
+ }
+ else
+ if (ip_file->pipe_flag == TRUE)
+ {
+ ip_file->format = FMT_STREAM;
+ }
+ else
+ if (ex_file->format != INV_FORMAT)
+ {
+ ip_file->format = ex_file->format;
+ }
+ else
+ {
+ if (ip_file->mode == MODE_BINARY)
+ {
+ ip_file->format = DEF_BINARY_FMT;
+ }
+ else
+ {
+ ip_file->format = DEF_TEXT_FMT;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ LOGMSG_1 ("VVE encoding format: %s",
+ (ip_file->format != INV_FORMAT) ?
+ (char *) fmt_str_array[ip_file->format] : "not recorded");
+} /* set_format */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_hdr_file_spec
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_hdr_file_spec (
+ CONST Qualifier_Struct *hdr_qualifier,
+ CONST File_Info *ip_file,
+ char **hdr_file_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_hdr_file_spec (hdr_qualifier, ip_file,
+ hdr_file_spec)
+ CONST Qualifier_Struct *hdr_qualifier;
+ CONST File_Info *ip_file;
+ char **hdr_file_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char file_name[MAX_NAME + 1];
+ char file_ext[MAX_EXT + 1];
+
+#if (UPPERCASE_FILESYSTEM)
+ char *tmp_ptr;
+#endif /* (UPPERCASE_FILESYSTEM) */
+
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ *hdr_file_spec = allocate_buffer ((MAX_IP_LINE_LEN + 1), "hdr_file_spec");
+ if (hdr_qualifier->present == TRUE)
+ {
+ strcpy (*hdr_file_spec, hdr_qualifier->value);
+ }
+ else
+ {
+ (void) split_file_spec (ip_file->file_spec, NULL, file_name,
+ file_ext, NULL);
+ make_file_spec (NULL, file_name, file_ext, NULL, *hdr_file_spec);
+
+#if (UPPERCASE_FILESYSTEM)
+ for (tmp_ptr = *hdr_file_spec; *tmp_ptr != '\0'; tmp_ptr++)
+ {
+ *tmp_ptr = (char) TOLOWER ((int) *tmp_ptr);
+ }
+#endif /* (UPPERCASE_FILESYSTEM) */
+
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ LOGMSG_1 ("VVE header file spec: %s", *hdr_file_spec);
+} /* set_hdr_file_spec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_ip_filespec
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_ip_filespec (
+ CONST Qualifier_Struct *ip_qualifier,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_ip_filespec (ip_qualifier, ip_file)
+ CONST Qualifier_Struct *ip_qualifier;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ if (ip_qualifier->present != TRUE)
+ {
+ INTERNAL_ERROR ("set_ip_filespec");
+ }
+
+#if (SUPPORT_PIPING)
+
+ if (STRCMP (ip_qualifier->value, STDIO_SYMBOL) == 0)
+ {
+ strcpy (ip_file->file_spec, "stdin");
+ ip_file->pipe_flag = TRUE;
+ }
+ else
+ {
+ strcpy (ip_file->file_spec, ip_qualifier->value);
+ }
+
+#else /* NOT (SUPPORT_PIPING) */
+
+ strcpy (ip_file->file_spec, ip_qualifier->value);
+
+#endif /* (SUPPORT_PIPING) */
+
+} /* set_ip_filespec */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_mode
+**
+** DESCRIPTION
+**
+** Set the mode (text/binary) to use when reading and encoding the input
+** file. The mode may be set from the command line, examine_file() or
+** the default specified in machine.h. The logic used is:
+**
+** Cmd ExFile Pipe Result
+** ------------------------------
+** Y * * Cmd
+** N N N Def
+** N Y N ExF
+** N * Y Def
+** ------------------------------
+**
+** NOTE: if the input file is standard input, examine_file() is not
+** called and the default mode is used unless it is overrriden
+** from the command line.
+**
+** INPUT PARAMETERS
+**
+** ex_file_info - a File_Info structure containing the results of
+** the call to examine_file(). If the input file
+** was specified as standard input, this structure
+** will not be examined.
+**
+** OUTPUT PARAMETERS
+**
+** none
+**
+** RETURN VALUE
+**
+** none
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_mode (CONST Qualifier_Struct *mode_qualifier,
+ CONST File_Info *ex_file,
+ CONST char *mode_str_array[],
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_mode (mode_qualifier, ex_file, mode_str_array,
+ ip_file)
+ CONST Qualifier_Struct *mode_qualifier;
+ CONST File_Info *ex_file;
+ CONST char *mode_str_array[];
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int16 cmd_mode;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Get the mode specified on the command line (if any). The number of
+ ** 'if' statements could be reduced by making the second expression more
+ ** complicated at a cost of less readable code.
+ **------------------------------------------------------------------------
+ */
+ cmd_mode = getc_mode (mode_qualifier, mode_str_array);
+
+ if (cmd_mode != INV_MODE)
+ {
+ ip_file->mode = cmd_mode;
+ }
+ else
+ if (ip_file->pipe_flag == TRUE)
+ {
+ ip_file->mode = DEF_MODE;
+ }
+ else
+ if (ex_file->mode != INV_MODE)
+ {
+ ip_file->mode = ex_file->mode;
+ }
+ else
+ {
+ ip_file->mode = DEF_MODE;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** One final check to make sure that the mode is valid. The mode can only
+ ** come from a validated command line value, examine_file() or the default
+ ** setting, so it should not be wrong.
+ **------------------------------------------------------------------------
+ */
+ switch (ip_file->mode)
+ {
+ case MODE_BINARY:
+ case MODE_TEXT:
+ break;
+ default:
+ FATALMSG_1 ("invalid file encoding mode set (%d)", ip_file->mode);
+ vv_exit ();
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ LOGMSG_1 ("VVE encoding mode: %s",
+ mode_str_array[ip_file->mode]);
+} /* set_mode */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_record_len
+**
+** DESCRIPTION
+**
+** Set the maximum record length to use when reading and encoding the
+** input file. The record length may be set from the command line,
+** examine_file() or the default specified in machine.h. The logic used
+** is:
+**
+** Cmd ExFile Pipe Result
+** ------------------------------
+** Y * * Cmd
+** N N N Def
+** N Y N ExF
+** N * Y Def
+** ------------------------------
+**
+** NOTE: if the input file is standard input, examine_file() is not
+** called and the default record length is used unless it is
+** overrriden from the command line.
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_record_len (
+ CONST Qualifier_Struct *rec_qualifier,
+ CONST File_Info *ex_file,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_record_len (rec_qualifier, ex_file, ip_file)
+ CONST Qualifier_Struct *rec_qualifier;
+ CONST File_Info *ex_file;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 cmd_reclen;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Get the record length specified on the command line (if any). The
+ ** number of 'if' statements could be reduced by making the second
+ ** expression more complicated at a cost of less readable code.
+ **------------------------------------------------------------------------
+ */
+ cmd_reclen = getc_reclen (rec_qualifier, ip_file);
+
+ if (cmd_reclen != INV_RECORD_LEN)
+ {
+ ip_file->max_rec_len = cmd_reclen;
+ ip_file->lng_rec_len = INV_RECORD_LEN;
+ }
+ else
+ if (ip_file->pipe_flag == TRUE)
+ {
+ ip_file->max_rec_len = INV_RECORD_LEN;
+ ip_file->lng_rec_len = INV_RECORD_LEN;
+ }
+ else
+ if (ex_file->max_rec_len != INV_RECORD_LEN)
+ {
+ ip_file->max_rec_len = ex_file->max_rec_len;
+ ip_file->lng_rec_len = ex_file->lng_rec_len;
+ }
+ else
+ {
+ ip_file->max_rec_len = INV_RECORD_LEN;
+ ip_file->lng_rec_len = INV_RECORD_LEN;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** One final check to make sure that the maximum record length is valid.
+ ** The longest record length can only come from examine_file() so it
+ ** should not be wrong. There is an exception: the default may be set to
+ ** INV_RECORD_LEN so that f_open_in() will use a default value.
+ **------------------------------------------------------------------------
+ */
+ if (ip_file->lng_rec_len == INV_RECORD_LEN)
+ {
+ LOGMSG ("VVE longest record length: not recorded");
+ }
+ else if (ip_file->format == FMT_VARIABLE)
+ {
+ if ((ip_file->lng_rec_len < MIN_VARIABLE_RECORD_LEN)
+ || (ip_file->lng_rec_len > MAX_VARIABLE_RECORD_LEN))
+ {
+ FATALMSG_1 ("invalid longest record length set (%ld)",
+ ip_file->lng_rec_len);
+ vv_exit ();
+ }
+ LOGMSG_1 ("VVE longest record length: %ld",
+ ip_file->lng_rec_len);
+ }
+ else if (ip_file->format == FMT_FIXED)
+ {
+ if ((ip_file->lng_rec_len < MIN_FIXED_RECORD_LEN)
+ || (ip_file->lng_rec_len > MAX_FIXED_RECORD_LEN))
+ {
+ FATALMSG_1 ("invalid longest record length set (%ld)",
+ ip_file->lng_rec_len);
+ vv_exit ();
+ }
+ LOGMSG_1 ("VVE longest record length: %ld",
+ ip_file->lng_rec_len);
+ }
+
+
+ /*-
+ **------------------------------------------------------------------------
+ ** One final check to make sure that the maximum record length is valid.
+ ** The record length can only come from a validated command line value,
+ ** examine_file() or the default setting, so it should not be wrong.
+ ** There is an exception: the default may be set to INV_RECORD_LEN so that
+ ** f_open_in() will use a default value.
+ **------------------------------------------------------------------------
+ */
+ if (ip_file->max_rec_len == INV_RECORD_LEN)
+ {
+ LOGMSG ("VVE maximum record length: not recorded");
+ }
+ else if (ip_file->format == FMT_VARIABLE)
+ {
+ if ((ip_file->max_rec_len < MIN_VARIABLE_RECORD_LEN)
+ || (ip_file->max_rec_len > MAX_VARIABLE_RECORD_LEN))
+ {
+ FATALMSG_1 ("invalid maximum record length set (%ld)",
+ ip_file->max_rec_len);
+ vv_exit ();
+ }
+ LOGMSG_1 ("VVE maximum record length: %ld",
+ ip_file->max_rec_len);
+ }
+ else if (ip_file->format == FMT_FIXED)
+ {
+ if ((ip_file->max_rec_len < MIN_FIXED_RECORD_LEN)
+ || (ip_file->max_rec_len > MAX_FIXED_RECORD_LEN))
+ {
+ FATALMSG_1 ("invalid maximum record length set (%ld)",
+ ip_file->max_rec_len);
+ vv_exit ();
+ }
+ LOGMSG_1 ("VVE maximum record length: %ld",
+ ip_file->max_rec_len);
+ }
+} /* set_record_len */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_split_size
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_split_size (CONST File_Info *op_file,
+ Qualifier_Struct *split_qualifier,
+ Int32 *split_size)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_split_size (op_file, split_qualifier,
+ split_size)
+ CONST File_Info *op_file;
+ Qualifier_Struct *split_qualifier;
+ Int32 *split_size;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 tmp_split_size;
+ int status;
+
+ if (split_qualifier->present != TRUE)
+ {
+ DEBUG ("split size not specified on the command line");
+ LOGMSG ("VVE O/P file maximum size: no maximum");
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (op_file->pipe_flag == TRUE)
+ {
+ split_qualifier->present = FALSE;
+ WARNMSG ("not encoding to a file - file splitting disabled");
+ LOGMSG ("VVE O/P file maximum size: no maximum");
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ tmp_split_size = -1;
+ status = sscanf (split_qualifier->value, "%ld", &tmp_split_size);
+
+ if ((status != 1) || (tmp_split_size <= 0))
+ {
+ USAGE_1 ("invalid split size specified `%s'", split_qualifier->value);
+ }
+
+ if (tmp_split_size < (Int32) MIN_SPLIT_SIZE)
+ {
+ USAGE_1 ("split size must be at least %ld kB", (Int32) MIN_SPLIT_SIZE);
+ }
+ *split_size = tmp_split_size * 1024L;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ LOGMSG_1 ("VVE O/P file maximum size: %ld kB", tmp_split_size);
+} /* set_split_size */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_timestamp
+**
+** DESCRIPTION
+**
+** Set the timestamp to record in the VVE file. The timestamp may be
+** set from the command line or by examine_file(). The logic used is:
+**
+** Cmd ExFile Pipe Result
+** ------------------------------
+** Y * * Cmd
+** N N N Inv
+** N Y N ExF
+** N * Y Inv
+** ------------------------------
+**
+** NOTE: if the input file is standard input, examine_file() is not
+** called and the timestamp is set to INV_TIMESTAMP unless it is
+** overrriden from the command line.
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+void set_timestamp (
+ CONST Qualifier_Struct *time_qualifier,
+ CONST File_Info *ex_file,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_timestamp (time_qualifier, ex_file, ip_file)
+ CONST Qualifier_Struct *time_qualifier;
+ CONST File_Info *ex_file;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ TIME_T cmd_timestamp;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Get the timestamp specified on the command line (if any). The number
+ ** of 'if' statements could be reduced by making the second expression
+ ** more complicated at a cost of less readable code.
+ **------------------------------------------------------------------------
+ */
+ cmd_timestamp = getc_timestamp (time_qualifier);
+
+ if (cmd_timestamp != INV_TIMESTAMP)
+ {
+ ip_file->mod_time = cmd_timestamp;
+ }
+ else
+ if (ip_file->pipe_flag == TRUE)
+ {
+ ip_file->mod_time = INV_TIMESTAMP;
+ }
+ else
+ if (ex_file->mod_time != INV_TIMESTAMP)
+ {
+ ip_file->mod_time = ex_file->mod_time;
+ }
+ else
+ {
+ ip_file->mod_time = INV_TIMESTAMP;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ LOGMSG_1 ("VVE file timestamp: %s",
+ (ip_file->mod_time != INV_TIMESTAMP) ?
+ vv_timestamp (ip_file->mod_time) : "not recorded");
+} /* set_timestamp */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** start_next_op_file
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void start_next_op_file (CONST Int16 overwrite_flag,
+ File_Info *op_file,
+ Int16 *op_part_no)
+#else /* NOT (ANSI_SYNTAX) */
+ void start_next_op_file (overwrite_flag, op_file,
+ op_part_no)
+ CONST Int16 overwrite_flag;
+ File_Info *op_file;
+ Int16 *op_part_no;
+#endif /* (ANSI_SYNTAX) */
+{
+ char next_file_ext[MAX_EXT + 1];
+ char tmp_buffer[32];
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (++(*op_part_no) > MAX_VV_PARTS)
+ {
+ FATALMSG_1 ("maximum number of parts reached (%d)", MAX_VV_PARTS);
+ vv_exit ();
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ (void) enc_line ("", 0L, tmp_buffer);
+ VVEOUT (tmp_buffer);
+
+ VVEOUT_2 ("%sskipto %d\n", VV_PREFIX, *op_part_no);
+ f_close (op_file);
+
+ LOGMSG_2 ("Part %3d bytes written: %ld",
+ (*op_part_no - 1), G_oppart_bytes);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ SPRINTF (next_file_ext, VV_EXT_FMT, *op_part_no);
+ force_file_ext (next_file_ext, op_file->file_spec);
+ op_file->file_ptr = f_open_out (overwrite_flag, op_file);
+
+ if (op_file->file_ptr == (FILE *) NULL)
+ {
+ FATALMSG_1 ("error opening output file `%s'", op_file->file_spec);
+ vv_exit ();
+ }
+} /* start_next_op_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** terminate
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void terminate (void)
+#else /* NOT (ANSI_SYNTAX) */
+ void terminate ()
+#endif /* (ANSI_SYNTAX) */
+{
+ char tmp_buffer[32];
+
+ G_ip_file.crc32 = G_ip_file.crc32 ^ CRC32_MASK;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Write the line of zero encoded bytes to signify the end of encoded
+ ** data.
+ **------------------------------------------------------------------------
+ */
+ (void) enc_line ("", 0L, tmp_buffer);
+ VVEOUT (tmp_buffer);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** End header.
+ **------------------------------------------------------------------------
+ */
+ VVEOUT_2 ("%s%s\n", VV_PREFIX, G_vvehdr[HDR_END].h_string);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Bytecount header.
+ **------------------------------------------------------------------------
+ */
+ VVEOUT_3 ("%s%s %ld\n", VV_PREFIX,
+ G_vvehdr[HDR_BYTECOUNT].h_string, G_ip_file.bytecount);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Crc32 header.
+ **------------------------------------------------------------------------
+ */
+ VVEOUT_3 ("%s%s %08lx\n", VV_PREFIX,
+ G_vvehdr[HDR_CRC32].h_string, G_ip_file.crc32);
+ G_op_file.bytecount += G_oppart_bytes;
+ LOGMSG_2 ("Part %3d bytes written: %ld",
+ G_oppt_no, G_oppart_bytes);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Close the input file if it's not connected to stdin.
+ **------------------------------------------------------------------------
+ */
+ if (G_ip_file.file_ptr != stdin)
+ {
+ f_close (&G_ip_file);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Close the output file if it's not connected to stdout.
+ **------------------------------------------------------------------------
+ */
+ if (G_op_file.file_ptr != stdout)
+ {
+ f_close (&G_op_file);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Finish off the log file, then close it if it's not connected to stderr.
+ **------------------------------------------------------------------------
+ */
+ LOGMSG_1 ("\nCRC-32: %08lx", G_ip_file.crc32);
+ LOGMSG_1 ("Total bytes read: %ld", G_ip_file.bytecount);
+ LOGMSG_1 ("Total bytes written: %ld", G_op_file.bytecount);
+ LOGMSG_1 ("Total O/P parts written: %d", G_oppt_no);
+
+ if (G_log_file.file_ptr != stderr)
+ {
+ f_close (&G_log_file);
+ }
+
+} /* terminate */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** usage_error
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void usage_error (CONST char *reason)
+#else /* NOT (ANSI_SYNTAX) */
+ void usage_error (reason)
+ CONST char *reason;
+#endif /* (ANSI_SYNTAX) */
+{
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Initial error message, followed by Unix style usage message.
+ **------------------------------------------------------------------------
+ */
+ FPRINTF (stderr, "\nVVencode %s, %s release (%s)\n\n",
+ VV_VERSION_STR, VV_IMPLEMENTATION, VV_DATE);
+ FPRINTF (stderr, "VVencode: %s\n\n", reason);
+ FPRINTF (stderr,
+ "Usage: VVencode [qualifiers] input_file [output_file]\n\n");
+ FPRINTF (stderr, " Valid qualifiers are:\n\n");
+
+ /*-
+ **------------------------------------------------------------------------
+ ** qualifier: 'debug' (if support compiled in)
+ **------------------------------------------------------------------------
+ */
+#if (VV_DEBUG_SUPPORT)
+ FPRINTF (stderr, " %.1s%s\n", QUAL_INTRO, G_cmdqual[CMDQ_DEBUG].q_string);
+#endif /* (VV_DEBUG_SUPPORT) */
+
+ /*-
+ **------------------------------------------------------------------------
+ ** qualifier: 'encoding_table'
+ **------------------------------------------------------------------------
+ */
+ FPRINTF (stderr, " %.1s%s%.1sfile-spec\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_ENCODE].q_string, QUAL_SEP);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** qualifier: 'format'
+ **------------------------------------------------------------------------
+ */
+ FPRINTF (stderr, " %.1s%s%.1sfile-format (formats supported:%s%s%s%s%s%s)\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_FORMAT].q_string, QUAL_SEP,
+
+#if (SUPPORT_FIXED_FMT)
+ " ", G_fmt_str[FMT_FIXED],
+#else /* NOT (SUPPORT_FIXED_FMT) */
+ "", "",
+#endif /* (SUPPORT_FIXED_FMT) */
+
+#if (SUPPORT_STREAM_FMT)
+ " ", G_fmt_str[FMT_STREAM],
+#else /* NOT (SUPPORT_STREAM_FMT) */
+ "", "",
+#endif /* (SUPPORT_STREAM_FMT) */
+
+#if (SUPPORT_VARIABLE_FMT)
+ " ", G_fmt_str[FMT_VARIABLE]);
+#else /* NOT (SUPPORT_VARIABLE_FMT) */
+ "", "");
+#endif /* (SUPPORT_VARIABLE_FMT) */
+
+ /*-
+ **------------------------------------------------------------------------
+ ** qualifiers: 'header_filespec', 'help', 'log', 'mode'
+ **------------------------------------------------------------------------
+ */
+ FPRINTF (stderr, " %.1s%s%.1sfile-spec\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_HDRFILE].q_string, QUAL_SEP);
+ FPRINTF (stderr, " %.1s%s\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_HELP].q_string);
+ FPRINTF (stderr, " %.1s%s[%.1sfile-spec]\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_LOG].q_string, QUAL_SEP);
+ FPRINTF (stderr, " %.1s%s%.1sfile-mode (modes supported: binary text)\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_MODE].q_string, QUAL_SEP);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** qualifiers: 'overwrite', 'record_length', 'split_size'
+ **------------------------------------------------------------------------
+ */
+ FPRINTF (stderr, " %.1s%s\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_OVERWRITE].q_string);
+ FPRINTF (stderr, " %.1s%s%.1sbytes\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_RECORDLEN].q_string, QUAL_SEP);
+ FPRINTF (stderr, " %.1s%s%.1skbytes\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_SPLIT].q_string, QUAL_SEP);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** qualifiers: 'timestamp', 'translation_file'
+ **------------------------------------------------------------------------
+ */
+ FPRINTF (stderr, " %.1s%s[%.1stime]\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_TIMESTAMP].q_string, QUAL_SEP);
+ FPRINTF (stderr, " %.1s%s%.1sfile-spec\n\n",
+ QUAL_INTRO, G_cmdqual[CMDQ_TRANSLATE].q_string, QUAL_SEP);
+
+ G_status = FATAL_STATUS;
+ vv_exit ();
+} /* usage_error */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** enc_line
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 enc_line (CONST char *ip_buffer,
+ CONST Int32 num_bytes,
+ char *op_buffer)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 enc_line (ip_buffer, num_bytes, op_buffer)
+ CONST char *ip_buffer;
+ CONST Int32 num_bytes;
+ char *op_buffer;
+#endif /* (ANSI_SYNTAX) */
+{
+ int c1;
+ int c2;
+ int c3;
+ int c4;
+ SIZE_T idx;
+ int offset;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ strcpy (op_buffer, VV_PREFIX);
+ offset = strlen (op_buffer);
+ op_buffer[offset++] = ENCODE ((SIZE_T) num_bytes);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (idx = 0; idx < (SIZE_T) num_bytes; idx += 3)
+ {
+ c1 = (int) ip_buffer[idx] >> 2;
+ c2 = (int) ((ip_buffer[idx] << 4) & 0x30)
+ | ((ip_buffer[idx + 1] >> 4) & 0x0f);
+ c3 = (int) ((ip_buffer[idx + 1] << 2) & 0x3c)
+ | ((ip_buffer[idx + 2] >> 6) & 0x03);
+ c4 = (int) (ip_buffer[idx + 2] & 0x3f);
+
+ op_buffer[offset++] = ENCODE (c1);
+ op_buffer[offset++] = ENCODE (c2);
+ op_buffer[offset++] = ENCODE (c3);
+ op_buffer[offset++] = ENCODE (c4);
+ }
+ op_buffer[offset] = '\0';
+ strcat (op_buffer, VV_EOL_MARKER);
+ strcat (op_buffer, "\n");
+ return ((Int32) strlen (op_buffer));
+} /* enc_line */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** wr_headers
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void wr_headers (CONST Int16 part_no)
+#else /* NOT (ANSI_SYNTAX) */
+ void wr_headers (part_no)
+ CONST Int16 part_no;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int16 adv_line;
+
+ LOGMSG_2 ("\nPart %3d O/P file: %s",
+ G_oppt_no, G_op_file.file_spec);
+ LOGMSG_2 ("Part %3d started at I/P byte: %ld",
+ G_oppt_no, G_ip_file.bytecount);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Write the VVcode advert text at the top of the VVE file.
+ **------------------------------------------------------------------------
+ */
+ for (adv_line = 0; G_vv_advert[adv_line] != NULL; adv_line++)
+ {
+ VVEOUT_1 ("%s\n", G_vv_advert[adv_line]);
+ }
+ VVEOUT_1 ("Written by VVencode %s,\n", VV_VERSION_STR);
+ VVEOUT_2 (" %s release (%s)\n", VV_IMPLEMENTATION, VV_DATE);
+ VVEOUT ("\n");
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (part_no == 1)
+ {
+
+ /*-
+ **--------------------------------------------------------------------
+ ** VVE header: 'decodeversion'
+ **--------------------------------------------------------------------
+ */
+ VVEOUT_3 ("%s%s %d\n", VV_PREFIX,
+ G_vvehdr[HDR_DECODEVERSION].h_string, VV_MAJOR_VERSION_NO);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** VVE header: 'operating system'
+ **--------------------------------------------------------------------
+ */
+ VVEOUT_3 ("%s%s %s\n", VV_PREFIX,
+ G_vvehdr[HDR_OPERATINGSYSTEM].h_string, VV_OPERATING_SYSTEM);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** VVE header: 'characterset'
+ **
+ ** If the /TRANSLATE qualifier was used, add a 'comment' header
+ ** recording the original character set (even if it was the same as
+ ** the translated character set).
+ **--------------------------------------------------------------------
+ */
+ if (Q_TRANSLATE)
+ {
+ VVEOUT_3 ("%s%s %s\n", VV_PREFIX,
+ G_vvehdr[HDR_CHARACTERSET].h_string, G_xlt_table.xlt_to);
+ VVEOUT_3 ("%s%s Original file character set was %s\n",
+ VV_PREFIX, G_vvehdr[HDR_COMMENT].h_string,
+ VV_CHARACTERSET);
+ }
+ else
+ {
+ VVEOUT_3 ("%s%s %s\n", VV_PREFIX,
+ G_vvehdr[HDR_CHARACTERSET].h_string, VV_CHARACTERSET);
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ ** VVE header: 'mode'
+ **--------------------------------------------------------------------
+ */
+ VVEOUT_3 ("%s%s %s\n", VV_PREFIX,
+ G_vvehdr[HDR_MODE].h_string, G_mode_str[G_ip_file.mode]);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** VVE header: 'format'
+ **--------------------------------------------------------------------
+ */
+ VVEOUT_3 ("%s%s %s\n", VV_PREFIX,
+ G_vvehdr[HDR_FORMAT].h_string, G_fmt_str[G_ip_file.format]);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** VVE header: 'recordlength'
+ **
+ ** This header is included only if a valid record length was
+ ** determined.
+ **--------------------------------------------------------------------
+ */
+ if (G_ip_file.max_rec_len != INV_RECORD_LEN)
+ {
+ if (G_ip_file.lng_rec_len != INV_RECORD_LEN)
+ {
+ VVEOUT_4 ("%s%s %ld %ld\n", VV_PREFIX,
+ G_vvehdr[HDR_RECORDLEN].h_string,
+ G_ip_file.max_rec_len, G_ip_file.lng_rec_len);
+ }
+ else
+ {
+ VVEOUT_3 ("%s%s %ld\n", VV_PREFIX,
+ G_vvehdr[HDR_RECORDLEN].h_string,
+ G_ip_file.max_rec_len);
+ }
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ ** VVE header: 'timestamp'
+ **
+ ** This header is included only if a valid timestamp was determined.
+ **--------------------------------------------------------------------
+ */
+ if (G_ip_file.mod_time != INV_TIMESTAMP)
+ {
+ VVEOUT_3 ("%s%s %s\n", VV_PREFIX,
+ G_vvehdr[HDR_TIMESTAMP].h_string,
+ vv_timestamp (G_ip_file.mod_time));
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ ** VVE header: 'table'
+ **
+ ** The 'table' header is followed by the encoding table.
+ **--------------------------------------------------------------------
+ */
+ VVEOUT_2 ("%s%s\n", VV_PREFIX, G_vvehdr[HDR_TABLE].h_string);
+ VVEOUT_2 ("%s%.32s\n", VV_PREFIX, G_encode_table);
+ VVEOUT_2 ("%s%.32s\n", VV_PREFIX, G_encode_table + 32);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** VVE header: 'begin'
+ **--------------------------------------------------------------------
+ */
+ VVEOUT_3 ("%s%s %s\n", VV_PREFIX,
+ G_vvehdr[HDR_BEGIN].h_string, G_hdrf_spec);
+ }
+ else
+ {
+
+ /*-
+ **--------------------------------------------------------------------
+ ** VVE header: 'table'
+ **
+ ** The 'table' header is followed by the encoding table.
+ **--------------------------------------------------------------------
+ */
+ VVEOUT_2 ("%s%s\n", VV_PREFIX, G_vvehdr[HDR_TABLE].h_string);
+ VVEOUT_2 ("%s%.32s\n", VV_PREFIX, G_encode_table);
+ VVEOUT_2 ("%s%.32s\n", VV_PREFIX, G_encode_table + 32);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** VVE header: 'skipfrom'
+ **--------------------------------------------------------------------
+ */
+ VVEOUT_4 ("%s%s %d %s\n", VV_PREFIX,
+ G_vvehdr[HDR_SKIPFROM].h_string, G_oppt_no, G_hdrf_spec);
+ }
+} /* wr_headers */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** main
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ int main (CONST int argc, CONST char *argv[])
+#else /* NOT (ANSI_SYNTAX) */
+ int main (argc, argv)
+ CONST int argc;
+ CONST char *argv[];
+#endif /* (ANSI_SYNTAX) */
+{
+ SIZE_T bytes_reqd;
+
+ G_status = LOG_STATUS;
+ G_debugging = FALSE;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Allocate the global message buffer manually since it is used by the
+ ** various MESSAGE_x and DEBUG_x macros.
+ **------------------------------------------------------------------------
+ */
+ bytes_reqd = sizeof (char) * (SIZE_T) MAX_MSG_LEN;
+ G_tmp_msg = (char *) malloc (bytes_reqd);
+
+ if (G_tmp_msg == NULL)
+ {
+ FPRINTF (stderr, "%s %ld bytes for the message buffer\n",
+ "FATAL: unable to allocate", bytes_reqd);
+
+ G_status = FATAL_STATUS;
+ vv_exit ();
+ }
+ DEBUG_2 ("main: allocated %ld bytes for buffer `%s'",
+ (Int32) bytes_reqd, "G_tmp_msg");
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Allocate the other global buffers.
+ **------------------------------------------------------------------------
+ */
+ G_ip_buffer = allocate_buffer ((SIZE_T) IP_BUFFER_SIZE, "G_ip_buffer");
+ G_op_buffer = allocate_buffer ((SIZE_T) OP_BUFFER_SIZE, "G_op_buffer");
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ scan_cmd_line (argc, argv, QUAL_INTRO, QUAL_SEP, G_cmdqual,
+ &G_cmd_ipfile, &G_cmd_opfile);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+#if (VV_DEBUG_SUPPORT)
+#else /* NOT (VV_DEBUG_SUPPORT) */
+ if (Q_DEBUG)
+ {
+ WARNMSG ("Debugging support was not compiled into VVencode");
+ }
+ G_debugging = FALSE;
+ G_cmdqual[CMDQ_DEBUG].present = FALSE;
+#endif /* (VV_DEBUG_SUPPORT) */
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the 'help' option was selected, call usage_error() and stop.
+ **------------------------------------------------------------------------
+ */
+ if (Q_HELP)
+ {
+ USAGE ("help requested");
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the 'debug' option was selected, ensure that the 'log' option is
+ ** selected.
+ **------------------------------------------------------------------------
+ */
+ if (Q_DEBUG)
+ {
+ G_debugging = TRUE;
+ if (!Q_LOG)
+ {
+ G_cmdqual[CMDQ_LOG].present = TRUE;
+ G_cmdqual[CMDQ_LOG].value = NULL;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (!Q_INPUT_FILE)
+ {
+ USAGE ("input file must be specified");
+ }
+
+ initialize ();
+ encode ();
+ terminate ();
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ vv_exit ();
+ return (0);
+} /* main */
diff --git a/support/vvcode/vveparse.c b/support/vvcode/vveparse.c
new file mode 100644
index 0000000000..c197f27e99
--- /dev/null
+++ b/support/vvcode/vveparse.c
@@ -0,0 +1,913 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "vveparse.c",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet)",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+** MODULE CONTENTS
+**
+** chk_skipfrom [tbs]
+** getv_characterset -
+** getv_decodeversion -
+** getv_format -
+** getv_mode -
+** getv_operatingsystem -
+** getv_reclen -
+** getv_timestamp -
+** parse_begin_header -
+** rd_next_line -
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+static char rcsid[] = "$Id$";
+
+
+/*-
+**----------------------------------------------------------------------------
+** Standard include files
+**----------------------------------------------------------------------------
+*/
+#include <stdio.h>
+
+
+/*-
+**----------------------------------------------------------------------------
+** Include files
+**----------------------------------------------------------------------------
+*/
+#include "checkos.h"
+#include "machine.h"
+#include "local.h"
+#include "globals.h"
+#include "specific.h"
+#include "vvutils.h"
+#include "vveparse.h"
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** chk_skipfrom
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean chk_skipfrom (CONST char *line_ptr,
+ CONST Int16 part_needed,
+ CONST char *hdr_file_spec,
+ CONST Header_Struct *skipfrom_hdr,
+ File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean chk_skipfrom (line_ptr, part_needed, hdr_file_spec,
+ skipfrom_hdr, ip_file)
+ CONST char *line_ptr;
+ CONST Int16 part_needed;
+ CONST char *hdr_file_spec;
+ CONST Header_Struct *skipfrom_hdr;
+ File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ char pt_file_spec[MAX_IP_LINE_LEN + 1];
+ Int16 pt_no;
+ int fields_read;
+
+ strcpy (pt_file_spec, "");
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Header syntax: skipfrom <WS> part-no <WS> file-spec <WS> <EOL>
+ **
+ ** The file-spec parameter may include whitespace, but leading or trailing
+ ** whitespace will be ignored. The Unix file "one two three" would be
+ ** supported with a skipfrom header like:
+ **
+ ** skipfrom 1 one two three <EOL>
+ **------------------------------------------------------------------------
+ */
+ fields_read = sscanf (line_ptr, "%*s %hd %[^\n]", &pt_no, pt_file_spec);
+
+ if (fields_read < 2)
+ {
+ FATALMSG_1 ("error parsing `%s' header value", skipfrom_hdr->h_string);
+ show_file_context (ip_file, line_ptr);
+ vv_exit ();
+ }
+ vstrtrws (pt_file_spec);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((pt_no == part_needed) && (STRCMP (hdr_file_spec, pt_file_spec) == 0))
+ {
+ return (TRUE);
+ }
+ return (FALSE);
+} /* chk_skipfrom */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** getv_characterset
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void getv_characterset (
+ CONST Header_Struct *characterset_hdr,
+ char **character_set)
+#else /* NOT (ANSI_SYNTAX) */
+ void getv_characterset (characterset_hdr, character_set)
+ CONST Header_Struct *characterset_hdr;
+ char **character_set;
+#endif /* (ANSI_SYNTAX) */
+{
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (characterset_hdr->present != TRUE)
+ {
+ *character_set = STRDUP (VV_CHARACTERSET);
+ LOGMSG ("VVE character set: not recorded");
+ WARNMSG ("VVE file character set was not recorded");
+ INFOMSG_1 ("local character set `%s' assumed", VV_CHARACTERSET);
+
+ }
+ else
+ {
+ *character_set = STRDUP (characterset_hdr->value);
+ LOGMSG_1 ("VVE character set: %s", *character_set);
+ }
+} /* getv_characterset*/
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** getv_decodeversion
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void getv_decodeversion (
+ CONST Header_Struct *decodeversion_hdr,
+ Int16 *decode_version)
+#else /* NOT (ANSI_SYNTAX) */
+ void getv_decodeversion (decodeversion_hdr,
+ decode_version)
+ CONST Header_Struct *decodeversion_hdr;
+ Int16 *decode_version;
+#endif /* (ANSI_SYNTAX) */
+{
+ int fields_read;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ *decode_version = 0;
+ if (decodeversion_hdr->present != TRUE)
+ {
+ LOGMSG ("VVE minimum decode version: not recorded");
+ return;
+ }
+
+ fields_read = sscanf (decodeversion_hdr->value, "%hd", decode_version);
+
+ if (fields_read != 1)
+ {
+ ERRORMSG_2 ("Error parsing `%s' header value: `%s'",
+ decodeversion_hdr->h_string, decodeversion_hdr->value);
+ }
+ else
+ {
+ LOGMSG_1 ("VVE minimum decode version: %d.0", *decode_version);
+ }
+} /* getv_decodeversion */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** getv_format
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void getv_format (CONST Header_Struct *format_hdr,
+ CONST char *format_str_array[],
+ File_Info *vve_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void getv_format (format_hdr, format_str_array, vve_file)
+ CONST Header_Struct *format_hdr;
+ CONST char *format_str_array[];
+ File_Info *vve_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int16 format_no;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ vve_file->format = INV_FORMAT;
+
+ if (format_hdr->present != TRUE)
+ {
+ LOGMSG ("VVE format: not recorded");
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ format_no = lookup_key (format_str_array, format_hdr->value,
+ NO_ABBREVIATIONS, CASE_INSENSITIVE);
+
+ switch (format_no)
+ {
+ case FMT_FIXED:
+ case FMT_STREAM:
+ case FMT_VARIABLE:
+ LOGMSG_1 ("VVE format: %s",
+ format_str_array[format_no]);
+ vve_file->format = format_no;
+ break;
+ default:
+ ERRORMSG_2 ("invalid `%s' header value: `%s'",
+ format_hdr->h_string, format_hdr->value);
+ break;
+ }
+ return;
+} /* getv_format */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** getv_mode
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void getv_mode (CONST Header_Struct *mode_hdr,
+ CONST char *mode_str_array[],
+ File_Info *vve_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void getv_mode (mode_hdr, mode_str_array, vve_file)
+ CONST Header_Struct *mode_hdr;
+ CONST char *mode_str_array[];
+ File_Info *vve_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int16 mode_no;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ vve_file->mode = INV_MODE;
+
+ if (mode_hdr->present != TRUE)
+ {
+ LOGMSG ("\nVVE mode: not recorded");
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ mode_no = lookup_key (mode_str_array, mode_hdr->value,
+ NO_ABBREVIATIONS, CASE_INSENSITIVE);
+
+ switch (mode_no)
+ {
+ case MODE_BINARY:
+ case MODE_TEXT:
+ LOGMSG_1 ("\nVVE mode: %s",
+ mode_str_array[mode_no]);
+ vve_file->mode = mode_no;
+ break;
+ default:
+ ERRORMSG_2 ("invalid `%s' header value: `%s'",
+ mode_hdr->h_string, mode_hdr->value);
+ break;
+ }
+ return;
+} /* getv_mode */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** getv_operatingsystem
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void getv_operatingsystem (
+ CONST Header_Struct *operatingsystem_hdr,
+ char **operating_system)
+#else /* NOT (ANSI_SYNTAX) */
+ void getv_operatingsystem (operatingsystem_hdr,
+ operating_system)
+ CONST Header_Struct *operatingsystem_hdr;
+ char **operating_system;
+#endif /* (ANSI_SYNTAX) */
+{
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (operatingsystem_hdr->present != TRUE)
+ {
+ *operating_system = STRDUP (VV_OPERATING_SYSTEM);
+ LOGMSG ("VVE operating system: not recorded");
+ WARNMSG ("VVE file operating system was not recorded");
+ INFOMSG_1 ("local operating system `%s' assumed", VV_OPERATING_SYSTEM);
+ }
+ else
+ {
+ *operating_system = STRDUP (operatingsystem_hdr->value);
+ LOGMSG_1 ("VVE operating system: %s", *operating_system);
+ }
+} /* getv_operatingsystem */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** getv_reclen
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** NOTE: define record length meanings
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void getv_reclen (CONST Header_Struct *reclen_hdr,
+ File_Info *vve_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void getv_reclen (reclen_hdr, vve_file)
+ CONST Header_Struct *reclen_hdr;
+ File_Info *vve_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int no_values;
+ char dummy1[MAX_IP_LINE_LEN + 1];
+ char dummy2[MAX_IP_LINE_LEN + 1];
+ int status;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ vve_file->max_rec_len = INV_RECORD_LEN;
+ vve_file->lng_rec_len = INV_RECORD_LEN;
+
+ if (reclen_hdr->present != TRUE)
+ {
+ LOGMSG ("VVE longest record length: not recorded");
+ LOGMSG ("VVE maximum record length: not recorded");
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Check how many values are with the recordlength header. There should
+ ** be one or two.
+ **------------------------------------------------------------------------
+ */
+ no_values = sscanf (reclen_hdr->value, "%s %s", dummy1, dummy2);
+
+ switch (no_values)
+ {
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ case 2:
+ status = sscanf (dummy2, "%ld", &vve_file->lng_rec_len);
+ if ((status != 1)
+ || (vve_file->lng_rec_len < 0)
+ || (vve_file->lng_rec_len > MAX_VV_RECORD_LEN))
+ {
+ vve_file->lng_rec_len = INV_RECORD_LEN;
+ ERRORMSG_2 ("Invalid second value of `%s' header: `%s'",
+ reclen_hdr->h_string, reclen_hdr->value);
+ }
+ else
+ {
+ LOGMSG_1 ("VVE longest record length: %ld",
+ vve_file->lng_rec_len);
+ }
+ break;
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ case 1:
+ status = sscanf (dummy1, "%ld", &vve_file->max_rec_len);
+ if ((status != 1)
+ || (vve_file->max_rec_len < 0)
+ || (vve_file->max_rec_len > MAX_VV_RECORD_LEN))
+ {
+ vve_file->max_rec_len = INV_RECORD_LEN;
+ ERRORMSG_2 ("Invalid first value of `%s' header: `%s'",
+ reclen_hdr->h_string, reclen_hdr->value);
+ }
+ else
+ {
+ LOGMSG_1 ("VVE maximum record length: %ld",
+ vve_file->max_rec_len);
+ }
+ break;
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ default:
+ ERRORMSG_2 ("Error parsing `%s' header value: `%s'",
+ reclen_hdr->h_string, reclen_hdr->value);
+ break;
+ }
+} /* getv_reclen */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** getv_timestamp
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void getv_timestamp (CONST Header_Struct *timestamp_hdr,
+ File_Info *vve_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void getv_timestamp (timestamp_hdr, vve_file)
+ CONST Header_Struct *timestamp_hdr;
+ File_Info *vve_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ TIME_T timestamp;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ vve_file->mod_time = INV_TIMESTAMP;
+
+ if (timestamp_hdr->present != TRUE)
+ {
+ LOGMSG ("VVE timestamp: not recorded");
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ timestamp = pars_time (timestamp_hdr->value);
+
+ if (timestamp != INV_TIMESTAMP)
+ {
+ vve_file->mod_time = timestamp;
+ LOGMSG_1 ("VVE timestamp: %s",
+ vv_timestamp (vve_file->mod_time));
+ }
+ else
+ {
+ ERRORMSG_2 ("invalid `%s' header value: `%s'",
+ timestamp_hdr->h_string, timestamp_hdr->value);
+ }
+} /* getv_timestamp */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** parse_begin_header
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void parse_begin_header (CONST char *line_ptr,
+ CONST File_Info *ip_file,
+ CONST Int16 decoding_type,
+ Header_Struct *hdr_struct,
+ char **hdr_file_spec)
+#else /* NOT (ANSI_SYNTAX) */
+ void parse_begin_header (line_ptr, ip_file,
+ decoding_type, hdr_struct,
+ hdr_file_spec)
+ CONST char *line_ptr;
+ CONST File_Info *ip_file;
+ CONST Int16 decoding_type;
+ Header_Struct *hdr_struct;
+ char **hdr_file_spec;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *begin_value_buffer;
+ int fields_read;
+
+ *hdr_file_spec = NULL;
+ begin_value_buffer = allocate_buffer ((MAX_IP_LINE_LEN + 1),
+ "begin_value_buffer");
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (decoding_type == VV_DECODING)
+ {
+ fields_read = sscanf (line_ptr, "%*s %[^\n]", begin_value_buffer);
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if (fields_read == 1)
+ {
+ *hdr_file_spec = STRDUP (begin_value_buffer);
+ }
+ else
+ {
+ FATALMSG_1 ("error parsing value of `%s' header",
+ hdr_struct->h_string);
+ show_file_context (ip_file, line_ptr);
+ vv_exit ();
+ }
+
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ else
+ {
+ fields_read = sscanf (line_ptr, "%*s %*s %[^\n]", begin_value_buffer);
+
+ if (fields_read == 1)
+ {
+ *hdr_file_spec = STRDUP (begin_value_buffer);
+ }
+ else
+ {
+ FATALMSG_1 ("error parsing value of UU/XXcode `%s' header",
+ hdr_struct->h_string);
+ show_file_context (ip_file, line_ptr);
+ vv_exit ();
+ }
+ }
+ vstrtrws (*hdr_file_spec);
+ hdr_struct->present = TRUE;
+ free (begin_value_buffer);
+} /* parse_begin_header */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** rd_next_line
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *rd_next_line (CONST Int32 max_chars,
+ CONST char *vve_line_prefix,
+ char *buffer,
+ File_Info *ip_file,
+ Int32 *byte_count)
+#else /* NOT (ANSI_SYNTAX) */
+ char *rd_next_line (max_chars, vve_line_prefix,
+ buffer, ip_file, byte_count)
+ CONST Int32 max_chars;
+ CONST char *vve_line_prefix;
+ char *buffer;
+ File_Info *ip_file;
+ Int32 *byte_count;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *eol_ptr;
+ Int32 status;
+ int pfx_len;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (;;)
+ {
+ status = read_line (max_chars, buffer, ip_file);
+ buffer[(SIZE_T) max_chars - 1] = '\0';
+
+ if (status < 0)
+ {
+ return (NULL);
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ *byte_count += strlen (buffer);
+ eol_ptr = STRRCHR (buffer, '\n');
+
+ if (eol_ptr != NULL)
+ {
+ *eol_ptr = '\0';
+ }
+ else
+ {
+ eol_ptr = &buffer[(SIZE_T) (max_chars - 1)];
+ }
+ ip_file->line_no++;
+
+ /*-
+ **--------------------------------------------------------------------
+ ** If there's a line prefix, check that it's here.
+ **--------------------------------------------------------------------
+ */
+ if ((vve_line_prefix == NULL) || (*vve_line_prefix == '\0'))
+ {
+ break;
+ }
+ else
+ {
+ pfx_len = strlen (vve_line_prefix);
+ if (STRNCMPI (buffer, vve_line_prefix, (Int16) pfx_len) == 0)
+ {
+ buffer += pfx_len;
+ break;
+ }
+ }
+ }
+ return (buffer);
+} /* rd_next_line */
+
+
+
diff --git a/support/vvcode/vveparse.h b/support/vvcode/vveparse.h
new file mode 100644
index 0000000000..eb569d6c59
--- /dev/null
+++ b/support/vvcode/vveparse.h
@@ -0,0 +1,109 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "vveparse.h",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet)",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+** MODULE CONTENTS
+**
+** chk_skipfrom [tbs]
+** getv_characterset -
+** getv_decodeversion -
+** getv_format -
+** getv_mode -
+** getv_operatingsystem -
+** getv_reclen -
+** getv_timestamp -
+** parse_begin_header -
+** rd_next_line -
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+
+
+/*
+**----------------------------------------------------------------------------
+** Forward declarations of functions in the file 'vveparse.c'
+**----------------------------------------------------------------------------
+*/
+Boolean chk_skipfrom ARGS ((CONST char *line_ptr,
+ CONST Int16 part_needed,
+ CONST char *hdrf_spec,
+ CONST Header_Struct *skipfrom_hdr,
+ File_Info *ip_file));
+void getv_characterset ARGS ((
+ CONST Header_Struct *characterset_hdr,
+ char **character_set));
+void getv_decodeversion ARGS ((
+ CONST Header_Struct *decodeversion_hdr,
+ Int16 *decode_version));
+void getv_format ARGS ((CONST Header_Struct *format_hdr,
+ CONST char *format_str_array[],
+ File_Info *vve_file));
+void getv_mode ARGS ((CONST Header_Struct *mode_hdr,
+ CONST char *format_str_array[],
+ File_Info *vve_file));
+void getv_operatingsystem ARGS ((
+ CONST Header_Struct *operatingsystem_hdr,
+ char **operating_system));
+void getv_reclen ARGS ((CONST Header_Struct *reclen_hdr,
+ File_Info *vve_file));
+void getv_timestamp ARGS ((CONST Header_Struct *timestamp_hdr,
+ File_Info *vve_file));
+void parse_begin_header ARGS ((CONST char *line_ptr,
+ CONST File_Info *ip_file,
+ CONST Int16 decoding_type,
+ Header_Struct *hdr_struct,
+ char **hdr_file_spec));
+char *rd_next_line ARGS ((CONST Int32 max_chars,
+ CONST char *vve_line_prefix,
+ char *buffer,
+ File_Info *ip_file,
+ Int32 *byte_count));
diff --git a/support/vvcode/vvutils.c b/support/vvcode/vvutils.c
new file mode 100644
index 0000000000..3cd59777af
--- /dev/null
+++ b/support/vvcode/vvutils.c
@@ -0,0 +1,2729 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "vvutils.c",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet)",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+** MODULE CONTENTS
+**
+** allocate_buffer Allocate memory for a buffer.
+** display_comment Display a VVE file comment.
+** f_close Close a file.
+** getc_format Get the format specified on the command line.
+** getc_mode Get the mode specified on the command line.
+** getc_reclen Get the maximum record length specified on
+** the command line.
+** getc_timestamp Get the timestamp specified on the command
+** line.
+** header_type Look for a header string in a list of headers.
+** init_crc32_table Initialize the 32 bit CRC table.
+** lookup_key Look for a string in a list of keywords.
+** make_time Convert a 'tm' structure into a Unix style
+** time_t value.
+** open_log_file Open the log file for writing.
+** parse_header Extract the value of a VVE/XLT header line.
+** pars_time Parse a string in VVcode timestamp format and
+** convert it to a Unix style time_t value.
+** pars_xlt_tbl Parse a character set translation table.
+** rd_enc_tbl Read and check an encoding table from a
+** specified file.
+** rd_xlt_tbl Read and check a character set translation
+** table from a specified file.
+** set_dec_tbl Invert an encoding table to form a decoding
+** table.
+** set_xlt_tbl Setup the character set translation table.
+** show_file_context Show the context in which a file processing
+** error occurred.
+** vstrchr Search a string for the first occurrence of a
+** specified character.
+** vstricmp Compare two strings ignoring case differences.
+** vstrnicmp Compare at most 'n' characters of two strings
+** ignoring case differences.
+** vstrrchr Search a string for the last occurrence of a
+** specified character.
+** vstrrstr Search a string for the last occurrence of
+** any of a list of specified characters.
+** vstrstr Search a string for the first occurrence of
+** any of a list of specified characters.
+** vv_timestamp Convert a Unix style time_t value into a
+** VVcode format timestamp string.
+** vstrdup Duplicate a string, allocating memory for the
+** copy.
+** vstrtrws Strip trailing whitespace from a string.
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+static char rcsid[] = "$Id$";
+
+
+#define VVUTILS 1
+
+
+/*-
+**----------------------------------------------------------------------------
+** Standard include files
+**----------------------------------------------------------------------------
+*/
+#include <stdio.h>
+
+
+/*-
+**----------------------------------------------------------------------------
+** Include files
+**----------------------------------------------------------------------------
+*/
+#include "checkos.h"
+#include "machine.h"
+#include "local.h"
+#include "globals.h"
+#include "specific.h"
+#include "vvutils.h"
+
+
+/*-
+**----------------------------------------------------------------------------
+**
+**----------------------------------------------------------------------------
+*/
+static int month_days[12] =
+ {
+ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
+ };
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** allocate_buffer
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *allocate_buffer (CONST SIZE_T buf_len,
+ CONST char *buf_name)
+#else /* NOT (ANSI_SYNTAX) */
+ char *allocate_buffer (buf_len, buf_name)
+ CONST SIZE_T buf_len;
+ CONST char *buf_name;
+#endif /* (ANSI_SYNTAX) */
+{
+ SIZE_T bytes_required;
+
+ char *buf_ptr;
+
+ bytes_required = buf_len * sizeof (char);
+ buf_ptr = (char *) malloc (bytes_required);
+
+ if (buf_ptr == NULL)
+ {
+ FATALMSG_2 ("error allocating %ld bytes for buffer `%s'",
+ (Int32) bytes_required, buf_name);
+ vv_exit ();
+ }
+ else
+ {
+ DEBUG_2 ("allocate_buffer: allocated %ld bytes for buffer `%s'",
+ (Int32) bytes_required, buf_name);
+ }
+ return (buf_ptr);
+} /* allocate_buffer */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** display_comment
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void display_comment (CONST File_Info *ip_file,
+ CONST char *line_ptr,
+ Header_Struct *hdr_struct)
+#else /* NOT (ANSI_SYNTAX) */
+ void display_comment (ip_file, line_ptr, hdr_struct)
+ CONST File_Info *ip_file;
+ CONST char *line_ptr;
+ Header_Struct *hdr_struct;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *comment_str_buffer;
+ int fields_read;
+
+ hdr_struct->present = FALSE;
+ hdr_struct->value = NULL;
+ comment_str_buffer = allocate_buffer ((MAX_IP_LINE_LEN + 1),
+ "comment_str_buffer");
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ fields_read = sscanf (line_ptr, "%*s %[^\n]", comment_str_buffer);
+ if (fields_read == 1)
+ {
+ LOGMSG_1 ("VVE file comment: %s", comment_str_buffer);
+ }
+ else
+ {
+ ERRORMSG_1 ("error parsing value of `%s' header", hdr_struct->h_string);
+ show_file_context (ip_file, line_ptr);
+ }
+ free (comment_str_buffer);
+} /* display_comment */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** f_close
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void f_close (File_Info *target_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void f_close (target_file)
+ File_Info *target_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ int status;
+
+ if (target_file->file_ptr != (FILE *) NULL)
+ {
+ status = fclose (target_file->file_ptr);
+
+ if (status != 0)
+ {
+ ERRORMSG_1 ("error closing file `%s'", target_file->file_spec);
+ explain_error ();
+ }
+ }
+} /* f_close */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** getc_format
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int16 getc_format (CONST Qualifier_Struct *qual_format,
+ CONST char *fmt_str_array[])
+#else /* NOT (ANSI_SYNTAX) */
+ Int16 getc_format (qual_format, fmt_str_array)
+ CONST Qualifier_Struct *qual_format;
+ CONST char *fmt_str_array[];
+#endif /* (ANSI_SYNTAX) */
+{
+ Int16 format_no;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (qual_format->present != TRUE)
+ {
+ DEBUG ("getc_format: format not specified on the command line");
+ return (INV_FORMAT);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ format_no = lookup_key (fmt_str_array, qual_format->value,
+ ALLOW_ABBREVIATIONS, CASE_INSENSITIVE);
+
+ switch (format_no)
+ {
+
+ /*-
+ **----------------------------------------------------------------
+ **
+ **----------------------------------------------------------------
+ */
+ case FMT_FIXED:
+
+#if (SUPPORT_FIXED_FMT)
+ break;
+#else /* NOT (SUPPORT_FIXED_FMT) */
+ USAGE_1 ("format `%s' is not supported by this implementation",
+ fmt_str_array[format_no]);
+ break;
+#endif /* (SUPPORT_FIXED_FMT) */
+
+ /*-
+ **----------------------------------------------------------------
+ **
+ **----------------------------------------------------------------
+ */
+ case FMT_STREAM:
+
+#if (SUPPORT_STREAM_FMT)
+ break;
+#else /* NOT (SUPPORT_STREAM_FMT) */
+ USAGE_1 ("format `%s' is not supported by this implementation",
+ fmt_str_array[format_no]);
+ break;
+#endif /* (SUPPORT_STREAM_FMT) */
+
+ /*-
+ **----------------------------------------------------------------
+ **
+ **----------------------------------------------------------------
+ */
+ case FMT_VARIABLE:
+
+#if SUPPORT_VARIABLE_FMT
+ break;
+#else /* NOT (SUPPORT_VARIABLE_FMT) */
+ USAGE_1 ("format `%s' is not supported by this implementation",
+ fmt_str_array[format_no]);
+ break;
+#endif /* (SUPPORT_VARIABLE_FMT) */
+
+ /*-
+ **----------------------------------------------------------------
+ **
+ **----------------------------------------------------------------
+ */
+ case FMT_DEFAULT:
+ break;
+
+ /*-
+ **----------------------------------------------------------------
+ **
+ **----------------------------------------------------------------
+ */
+ default:
+ USAGE_1 ("invalid format `%s'", qual_format->value);
+ }
+
+ DEBUG_1 ("getc_format: command line specifies format `%s'",
+ fmt_str_array[format_no]);
+ return (format_no);
+} /* getc_format */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** getc_mode
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int16 getc_mode (CONST Qualifier_Struct *qual_mode,
+ CONST char *mode_str_array[])
+#else /* NOT (ANSI_SYNTAX) */
+ Int16 getc_mode (qual_mode, mode_str_array)
+ CONST Qualifier_Struct *qual_mode;
+ CONST char *mode_str_array[];
+#endif /* (ANSI_SYNTAX) */
+{
+ Int16 mode_no;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (qual_mode->present != TRUE)
+ {
+ DEBUG ("getc_mode: mode not specified on the command line");
+ return (INV_MODE);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ mode_no = lookup_key (mode_str_array, qual_mode->value,
+ ALLOW_ABBREVIATIONS, CASE_INSENSITIVE);
+
+ switch (mode_no)
+ {
+ case MODE_BINARY:
+ case MODE_TEXT:
+ break;
+ default:
+ USAGE_1 ("invalid mode `%s'", qual_mode->value);
+ }
+
+ DEBUG_1 ("getc_mode: command line specifies mode `%s'",
+ mode_str_array[mode_no]);
+ return (mode_no);
+} /* getc_mode */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** getc_reclen
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int32 getc_reclen (CONST Qualifier_Struct *qual_reclen,
+ CONST File_Info *ip_file)
+#else /* NOT (ANSI_SYNTAX) */
+ Int32 getc_reclen (qual_reclen, ip_file)
+ CONST Qualifier_Struct *qual_reclen;
+ CONST File_Info *ip_file;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int32 record_len;
+ int status;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (qual_reclen->present != TRUE)
+ {
+ DEBUG ("getc_reclen: record length not specified on the command line");
+ return (INV_RECORD_LEN);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ record_len = INV_RECORD_LEN;
+ status = sscanf (qual_reclen->value, "%ld", &record_len);
+
+ if (status != 1)
+ {
+ USAGE_1 ("invalid record length specified `%s'", qual_reclen->value);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (ip_file->format == FMT_VARIABLE)
+ {
+ if ((record_len < (Int32) MIN_VARIABLE_RECORD_LEN)
+ || (record_len > (Int32) MAX_VARIABLE_RECORD_LEN))
+ {
+ USAGE_3 ("record length must be in the range %ld-%ld (not %ld)",
+ (Int32) MIN_VARIABLE_RECORD_LEN,
+ (Int32) MAX_VARIABLE_RECORD_LEN, record_len);
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ else
+ if (ip_file->format == FMT_FIXED)
+ {
+ if ((record_len < (Int32) MIN_FIXED_RECORD_LEN)
+ || (record_len > (Int32) MAX_FIXED_RECORD_LEN))
+ {
+ USAGE_3 ("record length must be in the range %ld-%ld (not %ld)",
+ (Int32) MIN_FIXED_RECORD_LEN,
+ (Int32) MAX_FIXED_RECORD_LEN, record_len);
+ }
+ }
+
+ DEBUG_1 ("getc_reclen: command line specifies maximum record length `%ld'",
+ record_len);
+ return (record_len);
+} /* getc_reclen */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** getc_timestamp
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ TIME_T getc_timestamp (CONST Qualifier_Struct *qual_timestamp)
+#else /* NOT (ANSI_SYNTAX) */
+ TIME_T getc_timestamp (qual_timestamp)
+ CONST Qualifier_Struct *qual_timestamp;
+#endif /* (ANSI_SYNTAX) */
+{
+ TIME_T cmd_timestamp;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (qual_timestamp->present != TRUE)
+ {
+ DEBUG ("getc_timestamp: timestamp not specified on the command line");
+ return (INV_TIMESTAMP);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((qual_timestamp->value == NULL) || (*qual_timestamp->value == '\0'))
+ {
+ (void) time (&cmd_timestamp);
+ }
+ else
+ {
+ cmd_timestamp = pars_time (qual_timestamp->value);
+
+ if (cmd_timestamp == INV_TIMESTAMP)
+ {
+ USAGE_1 ("invalid timestamp string specified `%s'",
+ qual_timestamp->value);
+ }
+ }
+ return (cmd_timestamp);
+} /* getc_timestamp */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** header_type
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int16 header_type (CONST File_Info *ip_file,
+ CONST char *line_ptr,
+ CONST Header_Struct *hdr_array)
+#else /* NOT (ANSI_SYNTAX) */
+ Int16 header_type (ip_file, line_ptr, hdr_array)
+ CONST File_Info *ip_file;
+ CONST char *line_ptr;
+ CONST Header_Struct *hdr_array;
+#endif /* (ANSI_SYNTAX) */
+{
+ int cmp_len;
+ Int16 hdr_found;
+ Int16 hdr_no;
+
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the string to be tested is NULL treat it as ambiguous and return.
+ **------------------------------------------------------------------------
+ */
+ if ((line_ptr == NULL) || (line_ptr[0] == '\0'))
+ {
+ return (HDR_UNKNOWN);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Search the VVE header structure array for this string.
+ **------------------------------------------------------------------------
+ */
+ hdr_found = -1;
+
+ for (hdr_no = 0; hdr_array[hdr_no].h_string != NULL; hdr_no++)
+ {
+ cmp_len = strlen (hdr_array[hdr_no].h_string);
+
+ if (STRNCMPI (hdr_array[hdr_no].h_string, line_ptr, cmp_len) == 0)
+ {
+ DEBUG_1 ("header_type: VVE line matches header: `%s'",
+ hdr_array[hdr_no].h_string);
+
+ if (hdr_found < 0)
+ {
+ hdr_found = hdr_no;
+ }
+ else
+ {
+ ERRORMSG ("ambiguous header ignored");
+ show_file_context (ip_file, line_ptr);
+ return (HDR_UNKNOWN);
+ }
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the header string is unknown, return that status.
+ **------------------------------------------------------------------------
+ */
+ if (hdr_found < 0)
+ {
+ DEBUG_1 ("header_type: ignored unknown VVE header line: `%s'",
+ line_ptr);
+ return (HDR_UNKNOWN);
+ }
+ else
+ {
+ return (hdr_found);
+ }
+} /* header_type */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** init_crc32_table
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void init_crc32_table (CONST Int16 crc_table_size,
+ CONST Unsigned32 crc_polynomial,
+ Unsigned32 *crc_table)
+#else /* NOT (ANSI_SYNTAX) */
+ void init_crc32_table (crc_table_size, crc_polynomial,
+ crc_table)
+ CONST Int16 crc_table_size;
+ CONST Unsigned32 crc_polynomial;
+ Unsigned32 *crc_table;
+#endif /* (ANSI_SYNTAX) */
+{
+ Unsigned16 idx;
+ Unsigned16 j;
+ Unsigned32 r;
+
+ for (idx = 0; idx < (Unsigned16) crc_table_size; idx++)
+ {
+ r = idx;
+ for (j = 0; j < 8; j++)
+ {
+ if (r & 1)
+ {
+ r = (r >> 1) ^ crc_polynomial;
+ }
+ else
+ {
+ r >>= 1;
+ }
+ }
+ crc_table[idx] = r;
+ }
+} /* init_crc32_table */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** lookup_key
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int16 lookup_key (CONST char *key_list[],
+ CONST char *string,
+ CONST Int16 allow_abbrevs,
+ CONST Int16 case_sensitivity)
+#else /* NOT (ANSI_SYNTAX) */
+ Int16 lookup_key (key_list, string, allow_abbrevs,
+ case_sensitivity)
+ CONST char *key_list[];
+ CONST char *string;
+ CONST Int16 allow_abbrevs;
+ CONST Int16 case_sensitivity;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int16 key_no;
+ int cmp_len;
+ Int16 look_status;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((string == NULL) || (*string == '\0'))
+ {
+ return (LOOKUP_AMBIGUOUS);
+ }
+ cmp_len = strlen (string);
+ look_status = LOOKUP_UNKNOWN;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (key_no = 0; key_list[key_no] != NULL; key_no++)
+ {
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if (allow_abbrevs == NO_ABBREVIATIONS)
+ {
+ cmp_len = strlen (key_list[key_no]);
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if (case_sensitivity == CASE_INSENSITIVE)
+ {
+ if (STRNCMPI (key_list[key_no], string, cmp_len) == 0)
+ {
+ if (look_status == LOOKUP_UNKNOWN)
+ {
+ look_status = key_no;
+ }
+ else
+ {
+ look_status = LOOKUP_AMBIGUOUS;
+ }
+ }
+ }
+ else
+ {
+ if (STRNCMP (key_list[key_no], string, cmp_len) == 0)
+ {
+ if (look_status == LOOKUP_UNKNOWN)
+ {
+ look_status = key_no;
+ }
+ else
+ {
+ look_status = LOOKUP_AMBIGUOUS;
+ }
+ }
+ }
+ }
+
+ return (look_status);
+} /* lookup_key */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** make_time
+**
+** DESCRIPTION
+**
+** Convert the 'tm' structure (in GMT) to a standard 'TIME_T' value of
+** the number of seconds since 1-Jan-1970 00:00:00 GMT.
+**
+** NOTE: the structure time is assumed to be GMT and only the fields
+** tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec are used.
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ TIME_T make_time (CONST struct tm *t_struct)
+#else /* NOT (ANSI_SYNTAX) */
+ TIME_T make_time (t_struct)
+ CONST struct tm *t_struct;
+#endif /* (ANSI_SYNTAX) */
+{
+ TIME_T total_days;
+ TIME_T total_secs;
+ int i;
+
+ DEBUG_3 ("make_time: date provided = %04d/%02d/%02d",
+ t_struct->tm_year, t_struct->tm_mon, t_struct->tm_mday);
+ DEBUG_3 ("make_time: time provided = %02d:%02d:%02d",
+ t_struct->tm_hour, t_struct->tm_min, t_struct->tm_sec);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Calculate the number of days since 1 January 1970, but do not return a
+ ** negative number.
+ **------------------------------------------------------------------------
+ */
+ if (t_struct->tm_year < 70)
+ {
+ return (0L);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ total_days = (TIME_T) 0;
+ for (i = 1970; i < (1900 + t_struct->tm_year); i++)
+ {
+ total_days += (TIME_T) 365;
+ if (LEAPYEAR (i) == TRUE)
+ {
+ ++total_days;
+ }
+ }
+
+ for (i = 0; i < t_struct->tm_mon; i++)
+ {
+ total_days += month_days[i];
+ if ((i == 1) && (LEAPYEAR (1900 + t_struct->tm_year) == TRUE))
+ {
+ ++total_days;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ total_days += (TIME_T) (t_struct->tm_mday - 1);
+
+ total_secs = ((TIME_T) total_days * 86400L)
+ + ((TIME_T) t_struct->tm_hour * 3600L)
+ + ((TIME_T) t_struct->tm_min * 60L)
+ + (TIME_T) t_struct->tm_sec;
+
+ DEBUG_1 ("make_time: time_t value returned = %ld", total_secs);
+ return (total_secs);
+} /* make_time */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** open_log_file
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void open_log_file (CONST Qualifier_Struct *log_qualifier,
+ CONST char *def_file_name,
+ CONST Int16 overwrite_flag,
+ File_Info *log_file)
+#else /* NOT (ANSI_SYNTAX) */
+ void open_log_file (log_qualifier, def_file_name,
+ overwrite_flag, log_file)
+ CONST Qualifier_Struct *log_qualifier;
+ CONST char *def_file_name;
+ CONST Int16 overwrite_flag;
+ File_Info *log_file;
+#endif /* (ANSI_SYNTAX) */
+{
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ log_file->file_ptr = (FILE *) NULL;
+ log_file->mode = MODE_TEXT;
+ log_file->format = DEF_TEXT_FMT;
+ log_file->max_rec_len = INV_RECORD_LEN;
+ log_file->lng_rec_len = INV_RECORD_LEN;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (log_qualifier->present != TRUE)
+ {
+ DEBUG ("open_log_file: log file not specified on the command line");
+ return;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (log_qualifier->value != NULL)
+ {
+ strcpy (log_file->file_spec, log_qualifier->value);
+
+ /*-
+ **--------------------------------------------------------------------
+ ** If a file spec was given for the log file, use the default log
+ ** file extension if one was not provided.
+ **--------------------------------------------------------------------
+ */
+#if (STICKY_DEFAULTS)
+ apply_defaults (def_file_name, DEF_LOG_EXT, log_file->file_spec);
+#endif /* (STICKY_DEFAULTS) */
+
+ DEBUG_1 ("open_log_file: opening log file `%s'", log_file->file_spec);
+ log_file->file_ptr = f_open_out (overwrite_flag, log_file);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ else
+ {
+ strcpy (log_file->file_spec, "stderr");
+ log_file->file_ptr = stderr;
+ log_file->pipe_flag = TRUE;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (log_file->file_ptr == (FILE *) NULL)
+ {
+ FATALMSG_1 ("error opening log file `%s'", log_file->file_spec);
+ vv_exit ();
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((log_file->pipe_flag == TRUE) || (is_a_file (log_file) == FALSE))
+ {
+ DEBUG_1 ("open_log_file: `%s' is not a regular file",
+ log_file->file_spec);
+ log_file->pipe_flag = TRUE;
+ set_pipe_mode (log_file);
+ }
+} /* open_log_file */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** parse_header
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void parse_header (CONST File_Info *ip_file,
+ CONST char *line_ptr,
+ Header_Struct *hdr_struct)
+#else /* NOT (ANSI_SYNTAX) */
+ void parse_header (ip_file, line_ptr, hdr_struct)
+ CONST File_Info *ip_file;
+ CONST char *line_ptr;
+ Header_Struct *hdr_struct;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *dummy;
+ int fields_read;
+
+ hdr_struct->present = FALSE;
+ hdr_struct->value = NULL;
+ dummy = allocate_buffer ((MAX_IP_LINE_LEN + 1), "dummy");
+ fields_read = sscanf (line_ptr, "%*s %s", dummy);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (fields_read == 1)
+ {
+ hdr_struct->value = STRDUP (dummy);
+ hdr_struct->present = TRUE;
+ }
+ else
+ {
+ ERRORMSG_1 ("error parsing value of `%s' header", hdr_struct->h_string);
+ show_file_context (ip_file, line_ptr);
+ }
+ free (dummy);
+} /* parse_header */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** pars_time
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ TIME_T pars_time (CONST char *time_str)
+#else /* NOT (ANSI_SYNTAX) */
+ TIME_T pars_time (time_str)
+ CONST char *time_str;
+#endif /* (ANSI_SYNTAX) */
+{
+ int args;
+ TIME_T time_val;
+ struct tm tm_struct;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If the time string is empty or null, return an error.
+ **------------------------------------------------------------------------
+ */
+ time_val = INV_TIMESTAMP;
+
+ if ((time_str == NULL) || (*time_str == '\0'))
+ {
+ return (INV_TIMESTAMP);
+ }
+
+ DEBUG_1 ("pars_time: VVE timestamp string provided = `%s'", time_str);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** Initialize the time structure to 1970.01.01-00:00:00 GMT
+ **------------------------------------------------------------------------
+ */
+ tm_struct.tm_year = 1970;
+ tm_struct.tm_mon = 1;
+ tm_struct.tm_mday = 1;
+ tm_struct.tm_hour = 0;
+ tm_struct.tm_min = 0;
+ tm_struct.tm_sec = 0;
+
+ args = sscanf (time_str, VV_TIMESTAMP_FORMAT,
+ &tm_struct.tm_year, &tm_struct.tm_mon, &tm_struct.tm_mday,
+ &tm_struct.tm_hour, &tm_struct.tm_min, &tm_struct.tm_sec);
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((args < 1) || (args > 6))
+ {
+ ERRORMSG_1 ("error parsing timestamp string `%s'", time_str);
+ return (INV_TIMESTAMP);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((tm_struct.tm_year < 1970) || (tm_struct.tm_year > 2037))
+ {
+ ERRORMSG_1 ("year (YYYY) must be in the range 1970-2037 (not %d)\n",
+ tm_struct.tm_year);
+ return (INV_TIMESTAMP);
+ }
+ (tm_struct.tm_year) -= 1900;
+
+ if ((tm_struct.tm_mon < 1) || (tm_struct.tm_mon > 12))
+ {
+ ERRORMSG_1 ("month (MM) must be in the range 1-12 (not %d)\n",
+ tm_struct.tm_mon);
+ return (INV_TIMESTAMP);
+ }
+ --(tm_struct.tm_mon);
+
+ if ((tm_struct.tm_mday < 1) || (tm_struct.tm_mday > 31))
+ {
+ ERRORMSG_1 ("day (DD) must be in the range 1-31 (not %d)\n",
+ tm_struct.tm_mday);
+ return (INV_TIMESTAMP);
+ }
+
+ if ((tm_struct.tm_hour < 0) || (tm_struct.tm_hour > 23))
+ {
+ ERRORMSG_1 ("hours (HH) must be in the range 0-23 (not %d)\n",
+ tm_struct.tm_hour);
+ return (INV_TIMESTAMP);
+ }
+
+ if ((tm_struct.tm_min < 0) || (tm_struct.tm_min > 59))
+ {
+ ERRORMSG_1 ("minutes (MM) must be in the range 0-59 (not %d)\n",
+ tm_struct.tm_min);
+ return (INV_TIMESTAMP);
+ }
+
+ if ((tm_struct.tm_sec < 0) || (tm_struct.tm_sec > 59))
+ {
+ ERRORMSG_1 ("seconds (SS) must be in the range 0-59 (not %d)\n",
+ tm_struct.tm_sec);
+ return (INV_TIMESTAMP);
+ }
+
+ tm_struct.tm_wday = 0;
+ tm_struct.tm_yday = 0;
+ tm_struct.tm_isdst = 0;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ time_val = make_time (&tm_struct);
+ DEBUG_1 ("pars_time: time_t value returned = %ld", time_val);
+
+ return (time_val);
+} /* pars_time */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** pars_xlt_tbl
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean pars_xlt_tbl (CONST char *xlt_buffer,
+ Xlt_Struct *xlt_tbl_struct,
+ Int16 subst_char)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean pars_xlt_tbl (xlt_buffer, xlt_tbl_struct,
+ subst_char)
+ CONST char *xlt_buffer;
+ Xlt_Struct *xlt_tbl_struct;
+ Int16 subst_char;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *curr_ptr;
+ int fields_read;
+ char *item_end;
+ int item_num;
+ SIZE_T item_len;
+ char *item_start;
+ char *item_str;
+ Boolean status;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ status = TRUE;
+ item_str = allocate_buffer (XLT_BUFFER_SIZE, "item_str");
+ curr_ptr = (char *) xlt_buffer;
+
+ for (item_num = 0;; item_num++)
+ {
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ while ((*curr_ptr != '\0') && isspace (*curr_ptr))
+ {
+ ++curr_ptr;
+ }
+ if (*curr_ptr == '\0')
+ {
+ break;
+ }
+ else
+ {
+ item_start = curr_ptr;
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ while ((*curr_ptr != '\0') && (!isspace (*curr_ptr)))
+ {
+ ++curr_ptr;
+ }
+ item_end = curr_ptr;
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ item_len = (SIZE_T) (item_end - item_start) + 1;
+ strncpy (item_str, item_start, item_len);
+ item_str[item_len] = '\0';
+
+ fields_read = sscanf (item_str, "%hd",
+ &(xlt_tbl_struct->xlt_tbl[item_num]));
+ if (fields_read != 1)
+ {
+ ERRORMSG_2 ("error parsing item %d (`%s') in translation file",
+ (item_num + 1), item_str);
+ status = FALSE;
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if ((xlt_tbl_struct->xlt_tbl[item_num] < -1)
+ || (xlt_tbl_struct->xlt_tbl[item_num] > 255))
+ {
+ ERRORMSG_2 ("invalid value (%d) of item %d in translation file",
+ xlt_tbl_struct->xlt_tbl[item_num], (item_num + 1));
+ status = FALSE;
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if (xlt_tbl_struct->xlt_tbl[item_num] == -1)
+ {
+ xlt_tbl_struct->xlt_tbl[item_num] = subst_char;
+ }
+ } /* end-for */
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if ((status == TRUE) && (item_num != XLT_TABLE_LEN))
+ {
+ ERRORMSG_1 ("wrong number of values in translation file: %d",
+ item_num);
+ status = FALSE;
+ }
+ free (item_str);
+ return (status);
+} /* pars_xlt_tbl */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** rd_enc_tbl
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Boolean rd_enc_tbl (File_Info *enc_file,
+ CONST Int16 enc_tbl_len,
+ char *encode_table)
+#else /* NOT (ANSI_SYNTAX) */
+ Boolean rd_enc_tbl (enc_file, enc_tbl_len, encode_table)
+ File_Info *enc_file;
+ CONST Int16 enc_tbl_len;
+ char *encode_table;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *buffer;
+ char *end_of_line;
+ int chars_read;
+ Boolean ret_status;
+ Int32 read_status;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ buffer = allocate_buffer ((MAX_IP_LINE_LEN + 1), "buffer");
+ enc_file->mode = MODE_TEXT;
+ enc_file->format = DEF_TEXT_FMT;
+ enc_file->max_rec_len = INV_RECORD_LEN;
+ enc_file->lng_rec_len = INV_RECORD_LEN;
+ enc_file->line_no = 0;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ enc_file->file_ptr = f_open_in (enc_file);
+
+ if (enc_file->file_ptr == (FILE *) NULL)
+ {
+ ERRORMSG_1 ("error opening encoding table file `%s'",
+ enc_file->file_spec);
+ vv_exit ();
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ encode_table[0] = '\0';
+ ret_status = TRUE;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (;;)
+ {
+ chars_read = strlen ((char *) encode_table);
+ enc_file->line_no++;
+
+ read_status = read_line ((Int32) MAX_IP_LINE_LEN, buffer, enc_file);
+
+ if (read_status < 0L)
+ {
+ if (feof (enc_file->file_ptr) != 0)
+ {
+ break;
+ }
+
+ ERRORMSG ("error reading encoding table file");
+ show_file_context (enc_file, NULL);
+ explain_error ();
+ ret_status = FALSE;
+ break;
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ buffer[MAX_IP_LINE_LEN - 1] = (char) '\0';
+ end_of_line = STRCHR (buffer, '\n');
+
+ if (end_of_line != NULL)
+ {
+ *end_of_line = '\0';
+ }
+ chars_read += strlen (buffer);
+
+ if (chars_read <= enc_tbl_len)
+ {
+ strcat ((char *) encode_table, buffer);
+ }
+ else
+ {
+ ERRORMSG_1 ("too many characters in encoding table file: %d",
+ chars_read);
+ show_file_context (enc_file, buffer);
+ ret_status = FALSE;
+ break;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ if (chars_read < enc_tbl_len)
+ {
+ ERRORMSG_1 ("not enough characters in encoding table file: %d",
+ chars_read);
+ ret_status = FALSE;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ f_close (enc_file);
+ free (buffer);
+ return (ret_status);
+} /* rd_enc_tbl */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** rd_xlt_tbl
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ Int16 rd_xlt_tbl (Header_Struct *xlt_hdr_array,
+ File_Info *xlt_file,
+ Xlt_Struct *xlt_tbl_struct)
+#else /* NOT (ANSI_SYNTAX) */
+ Int16 rd_xlt_tbl (xlt_hdr_array, xlt_file, xlt_tbl_struct)
+ Header_Struct *xlt_hdr_array;
+ File_Info *xlt_file;
+ Xlt_Struct *xlt_tbl_struct;
+#endif /* (ANSI_SYNTAX) */
+{
+ char buffer[MAX_IP_LINE_LEN + 1];
+ Int32 bytes_read;
+ int chars_read;
+ char *comment;
+ char *end_of_line;
+ int fields_read;
+ Int16 hdr_no;
+ Boolean ret_status;
+ Int16 subst_char;
+ char *xlt_buffer;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ xlt_file->mode = MODE_TEXT;
+ xlt_file->format = DEF_TEXT_FMT;
+ xlt_file->max_rec_len = INV_RECORD_LEN;
+ xlt_file->lng_rec_len = INV_RECORD_LEN;
+ xlt_file->line_no = 0;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ xlt_file->file_ptr = f_open_in (xlt_file);
+
+ if (xlt_file->file_ptr == (FILE *) NULL)
+ {
+ FATALMSG_1 ("error opening translation file `%s'",
+ xlt_file->file_spec);
+ vv_exit ();
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ xlt_buffer = allocate_buffer (XLT_BUFFER_SIZE, "xlt_buffer");
+ xlt_buffer[0] = 0;
+ ret_status = TRUE;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ while (ret_status == TRUE)
+ {
+ chars_read = strlen (xlt_buffer);
+ xlt_file->line_no++;
+ bytes_read = read_line ((Int32) MAX_IP_LINE_LEN, buffer, xlt_file);
+
+ if (bytes_read < 0)
+ {
+ if (feof (xlt_file->file_ptr) != 0)
+ {
+ break;
+ }
+ ERRORMSG ("error reading translation file");
+ show_file_context (xlt_file, NULL);
+ explain_error ();
+ ret_status = FALSE;
+ continue;
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ buffer[MAX_IP_LINE_LEN - 2] = (char) '\n';
+ buffer[MAX_IP_LINE_LEN - 1] = (char) '\0';
+ comment = STRCHR (buffer, XLT_COMMENT_CHAR);
+
+ if (comment != NULL)
+ {
+ *comment = '\n';
+ *(++comment) = '\0';
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ end_of_line = STRCHR (buffer, '\n');
+
+ if (end_of_line != NULL)
+ {
+ *end_of_line = ' ';
+ }
+ chars_read += strlen (buffer);
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if ((xlt_hdr_array[HDR_XLT_FROM].present != TRUE)
+ || (xlt_hdr_array[HDR_XLT_SUBSTCHAR].present != TRUE)
+ || (xlt_hdr_array[HDR_XLT_TO].present != TRUE))
+ {
+ hdr_no = header_type (xlt_file, buffer, xlt_hdr_array);
+
+ switch (hdr_no)
+ {
+ case HDR_UNKNOWN:
+ break;
+ case HDR_XLT_FROM:
+ case HDR_XLT_SUBSTCHAR:
+ case HDR_XLT_TO:
+ if (xlt_hdr_array[hdr_no].present == TRUE)
+ {
+ ERRORMSG_1 ("header `%s' repeated in translation file",
+ xlt_hdr_array[hdr_no].h_string);
+ show_file_context (xlt_file, buffer);
+ ret_status = FALSE;
+ }
+ else
+ {
+ parse_header (xlt_file, buffer, &xlt_hdr_array[hdr_no]);
+ }
+ break;
+ default:
+ INTERNAL_ERROR ("rd_xlt_file");
+ break;
+ }
+ continue;
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ fields_read = sscanf (xlt_hdr_array[HDR_XLT_SUBSTCHAR].value, "%hd",
+ &subst_char);
+ if ((fields_read != 1) || (subst_char < 0) || (subst_char > 255))
+ {
+ ERRORMSG_2 ("invalid `%s' header value in translation file: `%s'",
+ xlt_hdr_array[HDR_XLT_SUBSTCHAR].h_string,
+ xlt_hdr_array[HDR_XLT_SUBSTCHAR].value);
+ ret_status = FALSE;
+ break;
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if (chars_read <= XLT_BUFFER_SIZE)
+ {
+ strcat ((char *) xlt_buffer, buffer);
+ }
+ else
+ {
+ ERRORMSG_1 ("too many characters in translation file: %d",
+ chars_read);
+ show_file_context (xlt_file, buffer);
+ ret_status = FALSE;
+ break;
+ }
+ }
+ f_close (xlt_file);
+
+ /*-
+ **------------------------------------------------------------------------
+ ** The contents of the translation file have been read, now parse them to
+ ** create the translation table.
+ **------------------------------------------------------------------------
+ */
+ if (xlt_hdr_array[HDR_XLT_FROM].present != TRUE)
+ {
+ ERRORMSG_1 ("header `%s' not found in translation file",
+ xlt_hdr_array[HDR_XLT_FROM].h_string);
+ ret_status = FALSE;
+ }
+ else if (xlt_hdr_array[HDR_XLT_SUBSTCHAR].present != TRUE)
+ {
+ ERRORMSG_1 ("header `%s' not found in translation file",
+ xlt_hdr_array[HDR_XLT_SUBSTCHAR].h_string);
+ ret_status = FALSE;
+ }
+ else if (xlt_hdr_array[HDR_XLT_TO].present != TRUE)
+ {
+ ERRORMSG_1 ("header `%s' not found in translation file",
+ xlt_hdr_array[HDR_XLT_TO].h_string);
+ ret_status = FALSE;
+ }
+ else
+ {
+ xlt_tbl_struct->xlt_from = STRDUP (xlt_hdr_array[HDR_XLT_FROM].value);
+ xlt_tbl_struct->xlt_to = STRDUP (xlt_hdr_array[HDR_XLT_TO].value);
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ ** The contents of the translation file have been read, now parse them to
+ ** create the translation table.
+ **------------------------------------------------------------------------
+ */
+ if (ret_status == TRUE)
+ {
+ ret_status = pars_xlt_tbl (xlt_buffer, xlt_tbl_struct, subst_char);
+ }
+
+ free (xlt_buffer);
+ return (ret_status);
+} /* rd_xlt_tbl */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_dec_tbl
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_dec_tbl (CONST Int16 enc_tbl_len,
+ CONST char *encode_table,
+ CONST Int16 dec_tbl_len,
+ Int16 *decode_table)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_dec_tbl (enc_tbl_len, encode_table,
+ dec_tbl_len, decode_table)
+ CONST Int16 enc_tbl_len;
+ CONST char *encode_table;
+ CONST Int16 dec_tbl_len;
+ Int16 *decode_table;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int16 i;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (i = 0; i < dec_tbl_len; i++)
+ {
+ decode_table[i] = INV_TABLE_ENTRY;
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (i = 0; i < enc_tbl_len; i++)
+ {
+ if (decode_table[encode_table[i]] == INV_TABLE_ENTRY)
+ {
+ decode_table[encode_table[i]] = i;
+ }
+ else
+ {
+ ERRORMSG_1 ("invalid encoding table - character 0x%02X duplicated",
+ encode_table[i]);
+ vv_exit ();
+ }
+ }
+} /* set_dec_tbl */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** set_xlt_tbl
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void set_xlt_tbl (File_Info *xlt_file,
+ Xlt_Struct *xlt_table,
+ Header_Struct *xlt_hdr_array)
+#else /* NOT (ANSI_SYNTAX) */
+ void set_xlt_tbl (xlt_file, xlt_table, xlt_hdr_array)
+ File_Info *xlt_file;
+ Xlt_Struct *xlt_table;
+ Header_Struct *xlt_hdr_array;
+#endif /* (ANSI_SYNTAX) */
+{
+ Int16 status;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** If an extension has not been provided, use the default extension
+ ** for translation table files.
+ **------------------------------------------------------------------------
+ */
+#if (STICKY_DEFAULTS)
+ apply_defaults (NULL, DEF_XLT_EXT, xlt_file->file_spec);
+#endif /* (STICKY_DEFAULTS) */
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ xlt_table->xlt_from = NULL;
+ xlt_table->xlt_to = NULL;
+ status = rd_xlt_tbl (xlt_hdr_array, xlt_file, xlt_table);
+
+ if (status < 0)
+ {
+ FATALMSG_1 ("error reading translation table file `%s'",
+ xlt_file->file_spec);
+ vv_exit ();
+ }
+
+ LOGMSG_1 ("\nTranslation table source: %s", xlt_file->file_spec);
+ LOGMSG_2 ("Translation performed: `%s' to `%s'",
+ xlt_table->xlt_from, xlt_table->xlt_to);
+
+} /* set_xlt_tbl */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** show_file_context
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ void show_file_context (CONST File_Info *file,
+ CONST char *file_text)
+#else /* NOT (ANSI_SYNTAX) */
+ void show_file_context (file, file_text)
+ CONST File_Info *file;
+ CONST char *file_text;
+#endif /* (ANSI_SYNTAX) */
+{
+ if (file_text != NULL)
+ {
+ INFOMSG_2 ("context: line %ld of file `%s'",
+ file->line_no, file->file_spec);
+ INFOMSG_1 ("text: `%s'", file_text);
+ }
+ else
+ {
+ INFOMSG_2 ("context: line %ld of file `%s'",
+ file->line_no, file->file_spec);
+ }
+} /* show_file_context */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vstrchr
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *vstrchr (CONST char *str, CONST int ch)
+#else /* NOT (ANSI_SYNTAX) */
+ char *vstrchr (str, ch)
+ CONST char *str;
+ CONST int ch;
+#endif /* (ANSI_SYNTAX) */
+{
+ int i;
+
+ for (i = 0; str[i] != '\0'; i++)
+ {
+ if (str[i] == (char) ch)
+ {
+ return ((char *) &str[i]);
+ }
+ }
+ return (NULL);
+} /* vstrchr */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vstricmp
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ int vstricmp (CONST char *str1, CONST char *str2)
+#else /* NOT (ANSI_SYNTAX) */
+ int vstricmp (str1, str2)
+ CONST char *str1;
+ CONST char *str2;
+#endif /* (ANSI_SYNTAX) */
+{
+ int i;
+ int u1;
+ int u2;
+
+ i = 0;
+ while (((str1[i] != '\0') || (str2[i] != '\0')))
+ {
+ u1 = (int) TOUPPER (str1[i]);
+ u2 = (int) TOUPPER (str2[i]);
+ if (u1 != u2)
+ {
+ return (u1 - u2);
+ }
+ i++;
+ }
+ return (0);
+} /* vstricmp */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vstrncmp
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ int vstrncmp (CONST char *str1, CONST char *str2,
+ CONST int max_chars)
+#else /* NOT (ANSI_SYNTAX) */
+ int vstrncmp (str1, str2, max_chars)
+ CONST char *str1;
+ CONST char *str2;
+ CONST int max_chars;
+#endif /* (ANSI_SYNTAX) */
+{
+ int i;
+
+ i = 0;
+ while ((i < max_chars) && ((str1[i] != '\0') || (str2[i] != '\0')))
+ {
+ if (str1[i] != str2[i])
+ {
+ return ((int) (str1[i] != str2[i]));
+ }
+ i++;
+ }
+ return (0);
+} /* vstrncmp */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vstrnicmp
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ int vstrnicmp (CONST char *str1, CONST char *str2,
+ CONST int max_chars)
+#else /* NOT (ANSI_SYNTAX) */
+ int vstrnicmp (str1, str2, max_chars)
+ CONST char *str1;
+ CONST char *str2;
+ CONST int max_chars;
+#endif /* (ANSI_SYNTAX) */
+{
+ int i;
+ int u1;
+ int u2;
+
+ i = 0;
+ while ((i < max_chars) && ((str1[i] != '\0') || (str2[i] != '\0')))
+ {
+ u1 = (int) TOUPPER (str1[i]);
+ u2 = (int) TOUPPER (str2[i]);
+ if (u1 != u2)
+ {
+ return (u1 - u2);
+ }
+ i++;
+ }
+ return (0);
+} /* vstrnicmp */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vstrrchr
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *vstrrchr (CONST char *str, CONST int ch)
+#else /* NOT (ANSI_SYNTAX) */
+ char *vstrrchr (str, ch)
+ CONST char *str;
+ CONST int ch;
+#endif /* (ANSI_SYNTAX) */
+{
+ int i;
+ int length;
+
+ length = strlen (str);
+
+ for (i = (length - 1); i >= 0; i--)
+ {
+ if (str[i] == (char) ch)
+ {
+ return ((char *) &str[i]);
+ }
+ }
+ return (NULL);
+} /* vstrrchr */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vstrrstr
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *vstrrstr (CONST char *str, CONST char *search_str)
+#else /* NOT (ANSI_SYNTAX) */
+ char *vstrrstr (str, search_str)
+ CONST char *str;
+ CONST char *search_str;
+#endif /* (ANSI_SYNTAX) */
+{
+ int i;
+ int length;
+
+ length = strlen (str);
+
+ for (i = (length - 1); i >= 0; i--)
+ {
+ if (vstrchr (search_str, str[i]) != NULL)
+ {
+ return ((char *) &str[i]);
+ }
+ }
+ return (NULL);
+} /* vstrrstr */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vstrstr
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *vstrstr (CONST char *str, CONST char *search_str)
+#else /* NOT (ANSI_SYNTAX) */
+ char *vstrstr (str, search_str)
+ CONST char *str;
+ CONST char *search_str;
+#endif /* (ANSI_SYNTAX) */
+{
+ int idx;
+
+ for (idx = 0; str[idx] != '\0'; idx++)
+ {
+ if (vstrchr (search_str, str[idx]) != NULL)
+ {
+ return ((char *) &str[idx]);
+ }
+ }
+ return (NULL);
+} /* vstrstr */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vv_timestamp
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *vv_timestamp (TIME_T time_val)
+#else /* NOT (ANSI_SYNTAX) */
+ char *vv_timestamp (time_val)
+ TIME_T time_val;
+#endif /* (ANSI_SYNTAX) */
+{
+ static char time_string[32]; /* YYYY-MM-DD-HH:MM:SS GMT */
+ int year;
+ int month;
+ int mday;
+ int hours;
+ int mins;
+ int secs;
+ TIME_T day_secs;
+ TIME_T days_this_month;
+ TIME_T year_secs;
+ TIME_T leap_year_secs;
+ TIME_T this_year_secs;
+
+ /*-
+ **------------------------------------------------------------------------
+ ** We can't cope with times before 1-Jan-1970 00:00:00.
+ **------------------------------------------------------------------------
+ */
+ DEBUG_1 ("vv_timestamp: time_t value provided = %ld", time_val);
+
+ if (time_val < 0)
+ {
+ WARNMSG_1 ("time_t value < 0 (%ld) - converted to 0\n", time_val);
+ time_val = 0;
+ }
+
+ day_secs = 86400L;
+ year_secs = 365L * 86400L;
+ leap_year_secs = year_secs + 86400L;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (year = 1970;; year++)
+ {
+
+ if (LEAPYEAR (year))
+ {
+ this_year_secs = leap_year_secs;
+ }
+ else
+ {
+ this_year_secs = year_secs;
+ }
+
+ /*-
+ **--------------------------------------------------------------------
+ **
+ **--------------------------------------------------------------------
+ */
+ if (time_val >= this_year_secs)
+ {
+ time_val -= this_year_secs;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ for (month = 0;; month++)
+ {
+ days_this_month = month_days[month];
+
+ if ((month == 1) && (LEAPYEAR (year)))
+ {
+ ++days_this_month;
+ }
+
+ if (time_val >= (day_secs * days_this_month))
+ {
+ time_val -= day_secs * days_this_month;
+ }
+ else
+ {
+ break;
+ }
+ }
+ ++month;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ mday = (int) (time_val / day_secs);
+ ++mday;
+ time_val = time_val % day_secs;
+
+ hours = (int) (time_val / 3600L);
+ time_val = time_val % 3600L;
+
+ mins = (int) (time_val / 60L);
+ time_val = time_val % 60L;
+
+ secs = (int) time_val;
+
+ /*-
+ **------------------------------------------------------------------------
+ **
+ **------------------------------------------------------------------------
+ */
+ sprintf (time_string, VV_TIMESTAMP_FORMAT,
+ year, month, mday, hours, mins, secs);
+ strcat (time_string, " GMT");
+ DEBUG_1 ("vv_timestamp: VVE timestamp string return value = `%s'\n",
+ time_string);
+ return (time_string);
+} /* vv_timestamp */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vstrdup
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *vstrdup (CONST char *str)
+#else /* NOT (ANSI_SYNTAX) */
+ char *vstrdup (str)
+ CONST char *str;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *tmp_ptr;
+ SIZE_T no_bytes;
+
+ no_bytes = (SIZE_T) (strlen (str) + 1) * sizeof (char);
+ tmp_ptr = (char *) malloc (no_bytes);
+
+ if (tmp_ptr == NULL)
+ {
+ FATALMSG_2 ("couldn't allocate %d bytes to copy string `%s'",
+ no_bytes, str);
+ vv_exit ();
+ }
+ strcpy (tmp_ptr, str);
+ return (tmp_ptr);
+} /* vstrdup */
+
+
+
+/*-
+**============================================================================
+**
+** FUNCTION
+**
+** vstrtrws
+**
+** DESCRIPTION
+**
+** [tbs]
+**
+** INPUT PARAMETERS
+**
+** [tbs]
+**
+** OUTPUT PARAMETERS
+**
+** [tbs]
+**
+** RETURN VALUE
+**
+** [tbs]
+**
+**============================================================================
+*/
+#if (ANSI_SYNTAX)
+ char *vstrtrws (char *str)
+#else /* NOT (ANSI_SYNTAX) */
+ char *vstrtrws (str)
+ char *str;
+#endif /* (ANSI_SYNTAX) */
+{
+ char *end_ptr;
+ int length;
+
+ if ((str == NULL) || (*str == '\0'))
+ {
+ return (str);
+ }
+
+ length = strlen (str);
+ end_ptr = str + length - 1;
+
+ while ((end_ptr >= str) && (isspace (*end_ptr)))
+ {
+ *end_ptr = '\0';
+ --end_ptr;
+ }
+ return (str);
+} /* vstrtrws */
diff --git a/support/vvcode/vvutils.h b/support/vvcode/vvutils.h
new file mode 100644
index 0000000000..c4d45e6885
--- /dev/null
+++ b/support/vvcode/vvutils.h
@@ -0,0 +1,178 @@
+/*-
+******************************************************************************
+******************************************************************************
+**
+** ARCHIVE HEADER INFORMATION
+**
+** @C-file{
+** FILENAME = "vvutils.h",
+** VERSION = "1.00",
+** DATE = "",
+** TIME = "",
+**
+** AUTHOR = "Niel Kempson",
+** ADDRESS = "25 Whitethorn Drive, Cheltenham, GL52 5LL, England",
+** TELEPHONE = "+44-242 579105",
+** EMAIL = "kempson@tex.ac.uk (Internet)",
+**
+** SUPPORTED = "yes",
+** ARCHIVED = "tex.ac.uk, ftp.tex.ac.uk",
+** KEYWORDS = "VVcode",
+**
+** CODETABLE = "ISO/ASCII",
+** CHECKSUM = "51492 1481 5732 57976",
+**
+** DOCSTRING = { This file is part of VVcode.
+** }
+** }
+**
+** MODULE CONTENTS
+**
+** allocate_buffer Allocate memory for a buffer.
+** display_comment Display a VVE file comment.
+** f_close Close a file.
+** getc_format Get the format specified on the command line.
+** getc_mode Get the mode specified on the command line.
+** getc_reclen Get the maximum record length specified on
+** the command line.
+** getc_timestamp Get the timestamp specified on the command
+** line.
+** header_type Look for a header string in a list of headers.
+** init_crc32_table Initialize the 32 bit CRC table.
+** lookup_key Look for a string in a list of keywords.
+** make_time Convert a 'tm' structure into a Unix style
+** time_t value.
+** open_log_file Open the log file for writing.
+** parse_header Extract the value of a VVE/XLT header line.
+** pars_time Parse a string in VVcode timestamp format and
+** convert it to a Unix style time_t value.
+** pars_xlt_tbl Parse a character set translation table.
+** rd_enc_tbl Read and check an encoding table from a
+** specified file.
+** rd_xlt_tbl Read and check a character set translation
+** table from a specified file.
+** set_dec_tbl Invert an encoding table to form a decoding
+** table.
+** set_xlt_tbl Setup the character set translation table.
+** show_file_context Show the context in which a file processing
+** error occurred.
+** vstrchr Search a string for the first occurrence of a
+** specified character.
+** vstricmp Compare two strings ignoring case differences.
+** vstrnicmp Compare at most 'n' characters of two strings
+** ignoring case differences.
+** vstrrchr Search a string for the last occurrence of a
+** specified character.
+** vstrrstr Search a string for the last occurrence of
+** any of a list of specified characters.
+** vstrstr Search a string for the first occurrence of
+** any of a list of specified characters.
+** vv_timestamp Convert a Unix style time_t value into a
+** VVcode format timestamp string.
+** vstrdup Duplicate a string, allocating memory for the
+** copy.
+** vstrtrws Strip trailing whitespace from a string.
+**
+** COPYRIGHT
+**
+** Copyright (c) 1991-1993 by Niel Kempson <kempson@tex.ac.uk>
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 1, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** In other words, you are welcome to use, share and improve this
+** program. You are forbidden to forbid anyone else to use, share
+** and improve what you give them. Help stamp out software-hoarding!
+**
+** CHANGE LOG
+**
+******************************************************************************
+******************************************************************************
+*/
+
+
+/*
+**----------------------------------------------------------------------------
+** Forward declarations of functions in the file 'vvutils.c'
+**----------------------------------------------------------------------------
+*/
+char *allocate_buffer ARGS ((CONST SIZE_T buf_len,
+ CONST char *buf_name));
+void display_comment ARGS ((CONST File_Info *ip_file,
+ CONST char *line_ptr,
+ Header_Struct *hdr_struct));
+void f_close ARGS ((File_Info *file));
+Int16 getc_format ARGS ((CONST Qualifier_Struct *qual_format,
+ CONST char *fmt_str_array[]));
+Int16 getc_mode ARGS ((CONST Qualifier_Struct *qual_mode,
+ CONST char *mode_str_array[]));
+Int32 getc_reclen ARGS ((CONST Qualifier_Struct *qual_reclen,
+ CONST File_Info *ip_file));
+TIME_T getc_timestamp ARGS ((CONST Qualifier_Struct *qual_timestamp));
+Int16 header_type ARGS ((CONST File_Info *ip_file,
+ CONST char *line_ptr,
+ CONST Header_Struct *hdr_array));
+void init_crc32_table ARGS ((CONST Int16 crc_table_size,
+ CONST Unsigned32 crc_polynomial,
+ Unsigned32 *crc_table));
+Int16 lookup_key ARGS ((CONST char *key_list[],
+ CONST char *key_string,
+ CONST Int16 allow_abbrevs,
+ CONST Int16 case_sensitivity));
+TIME_T make_time ARGS ((CONST struct tm *t_struct));
+void open_log_file ARGS ((CONST Qualifier_Struct *log_qualifier,
+ CONST char *def_file_name,
+ CONST Int16 overwrite_flag,
+ File_Info *log_file));
+void parse_header ARGS ((CONST File_Info *ip_file,
+ CONST char *line_ptr,
+ Header_Struct *hdr_struct));
+TIME_T pars_time ARGS ((CONST char *time_str));
+Boolean pars_xlt_tbl ARGS ((CONST char *xlt_buffer,
+ Xlt_Struct *xlt_tbl,
+ Int16 subst_char));
+Boolean rd_enc_tbl ARGS ((File_Info *enc_file,
+ CONST Int16 enc_tbl_len,
+ char *encode_table));
+Int16 rd_xlt_tbl ARGS ((Header_Struct *xlt_hdr_array,
+ File_Info *xlt_file,
+ Xlt_Struct *xlt_tbl));
+void set_dec_tbl ARGS ((CONST Int16 enc_tbl_len,
+ CONST char *encode_table,
+ CONST Int16 dec_tbl_len,
+ Int16 *decode_table));
+void set_xlt_tbl ARGS ((File_Info *xlt_file,
+ Xlt_Struct *xlt_table,
+ Header_Struct *xlt_hdr_array));
+void show_file_context ARGS ((CONST File_Info *file,
+ CONST char *file_text));
+char *vstrchr ARGS ((CONST char *str,
+ CONST int ch));
+int vstricmp ARGS ((CONST char *str1,
+ CONST char *str2));
+int vstrncmp ARGS ((CONST char *str1,
+ CONST char *str2,
+ CONST int max_chars));
+int vstrnicmp ARGS ((CONST char *str1,
+ CONST char *str2,
+ CONST int max_chars));
+char *vstrrchr ARGS ((CONST char *str,
+ CONST int ch));
+char *vstrrstr ARGS ((CONST char *str,
+ CONST char *search_str));
+char *vstrstr ARGS ((CONST char *str,
+ CONST char *search_str));
+char *vv_timestamp ARGS ((TIME_T time_val));
+char *vstrdup ARGS ((CONST char *str));
+char *vstrtrws ARGS ((char *str));