alford@ecsvax.UUCP (Ross Alford) (07/15/86)
I apologize for the delay. This message and the one that follows contain the Turbo Pascal source and uuencoded binaries for uuencode and uudecode to run under CP/M 2.2 (and probably 3.0). I know that posting software to net.micro.cpm is not very usual, but I received a number of requests for the source and/or binaries, and rather than try to send to individuals, I decided to post. Re my suggestion that CP/Mers exchange software via the net: I have a couple of responses to mail and news followups. First, what I would suggest is that software exchange take one of two forms--either posting articles containing only source and documentation, which would best be applied to programs written for ASM and maybe Turbo, both of which are almost universally accessible (or MBASIC, I suppose); or for software written in less universal languages, posting files with a short header describing the contents, followed by a uuencoded library file containing source, documentation, and object code. I've noticed lately that most newer software on RCPM systems is packaged this way, and it does seem sensible. If the .LBR file is squeezed before uuencoding, on average the uuencoded version will be no larger than the unsqueezed original. We might want to establish either a net.micro.cpm.sources or something similar if there was a lot of traffic, but perhaps at first could just use net.micro.cpm, since the volume is now low anyway. I do agree that source should always be included when it is available (and perhaps not too huge. 240k .ASM files would probably be stretching things). To start things off, then, in response to popular request, here follow uuencode.pas and uuencode.uue (the encoded binary, which can be decoded with UN*X uudecode before downloading to your system). The files are separated by ---------------CUT HERE-----------lines, since I've never figured out how to package shar files. Ross Alford ...mcnc!ecsvax!alford ----------------------CUT HERE----------for uuencode.pas--------- Program uuencode; CONST header = 'begin'; trailer = 'end'; defaultMode = '644'; defaultExtension = '.uue'; offset = 32; charsPerLine = 60; bytesPerHunk = 3; sixBitMask = $3F; endofinfile : boolean = FALSE; TYPE string80 = string[80]; VAR inf : file; outfile: text; infilename, outfilename, mode: string80; lineLength, numbytes, bytesInLine: integer; line: array [0..59] of char; hunk: array [0..2] of byte; chars: array [0..3] of byte; { procedure debug; var i: integer; procedure writebin(x: byte); var i: integer; begin for i := 1 to 8 do begin write ((x and $80) shr 7); x := x shl 1 end; write (' ') end; begin for i := 0 to 2 do writebin(hunk[i]); writeln; for i := 0 to 3 do writebin(chars[i]); writeln; for i := 0 to 3 do writebin(chars[i] and sixBitMask); writeln end; } {Binary file read added by Ross Alford, ...!mcnc!ecsvax!alford. The original MSDOS versions of uuencode/decode just use read/write on a FILE OF BYTE. CP/M Turbo expects some file info to be stored in the first 4 bytes of files of any type other than TEXT. Getbyte (below) and Putbyte (in UUDECODE) bypass this 'feature' by using blockread and blockwrite. The only global variables either use are 'infilename' and 'inf' or 'outfilename' and 'outf'} function getbyte(var b : byte) : boolean; type bufptr = ^bufrec; bufrec = record next : bufptr; buffer : array[1..128] of byte end; const sectstobuf = 8; {max number of sectors to buffer} sectsread : integer = 0; {constants are essentially statics} bytptr : integer = 129; notopen : boolean = TRUE; j : integer = 0; infsize : integer = 0; listsave : integer = 0; var list,temp,temp2 : bufptr; begin if notopen then begin notopen := FALSE; assign(inf,infilename); {$i-} reset(inf); {$i+} if ioresult <> 0 then begin writeln('File ',infilename,' not found. Aborting'); halt end; infsize := filesize(inf); new(list); list^.next := NIL; listsave := ord(list); sectsread := 0 end; list := ptr(listsave); if bytptr > 128 then begin if list^.next <> NIL then begin temp := list^.next; dispose(list); list := temp; bytptr := 1 end else begin dispose(list); list := NIL; j := 0; while (sectsread<infsize) and (j<sectstobuf) do begin new(temp2); temp2^.next := NIL; if list=NIL then begin list := temp2; temp := list end else begin temp^.next := temp2; temp := temp2 end; blockread(inf,temp^.buffer,1); j := succ(j); sectsread := succ(sectsread) end; bytptr := 1 end end; listsave := ord(list); if list <> NIL then begin b := list^.buffer[bytptr]; bytptr := succ(bytptr); getbyte := TRUE end else begin b := 0; getbyte := FALSE end end; procedure Abort (message: string80); begin {abort} writeln(message); close(inf); close(outfile); halt end; {abort} procedure Init; procedure GetFiles; VAR i: integer; temp: string80; ch: char; begin {GetFiles} if ParamCount < 1 then abort ('No input file specified.'); infilename := ParamStr(1); {$I-} assign (inf, infilename); reset (inf); {$i+} if IOResult > 0 then abort (concat ('Can''t open file ', infilename)); write('Uuencoding file ', infilename); i := pos('.', infilename); if i = 0 then outfilename := infilename else outfilename := copy (infilename, 1, pred(i)); mode := defaultMode; if ParamCount > 1 then for i := 2 to ParamCount do begin temp := Paramstr(i); if temp[1] in ['0'..'9'] then mode := temp else outfilename := temp end; if pos ('.', outfilename) = 0 then outfilename := concat(outfilename, defaultExtension); assign (outfile, outfilename); writeln (' to file ', outfilename, '.'); {$i-} reset(outfile); {$i+} if IOresult = 0 then begin Write ('Overwrite current ', outfilename, '? [Y/N] '); repeat read (kbd, ch); ch := Upcase(ch) until ch in ['Y', 'N']; writeln (ch); if ch = 'N' then abort(concat (outfilename, ' not overwritten.')) end; close(outfile); {$i-} rewrite(outfile); {$i+} if ioresult > 0 then abort(concat('Can''t open ', outfilename)); end; {getfiles} begin {Init} GetFiles; bytesInLine := 0; lineLength := 0; numbytes := 0; writeln (outfile, header, ' ', mode, ' ', infilename); end; {init} procedure FlushLine; VAR i: integer; procedure writeout(ch: char); begin {writeout} if ch = ' ' then write(outfile, '`') else write(outfile, ch) end; {writeout} begin {FlushLine} write ('.'); writeout(chr(bytesInLine + offset)); for i := 0 to pred(lineLength) do writeout(line[i]); writeln (outfile); lineLength := 0; bytesInLine := 0 end; {FlushLine} procedure FlushHunk; VAR i: integer; begin {FlushHunk} if lineLength = charsPerLine then FlushLine; chars[0] := hunk[0] shr 2; chars[1] := (hunk[0] shl 4) + (hunk[1] shr 4); chars[2] := (hunk[1] shl 2) + (hunk[2] shr 6); chars[3] := hunk[2] and sixBitMask; {debug;} for i := 0 to 3 do begin line[lineLength] := chr((chars[i] and sixBitMask) + offset); {write(line[linelength]:2);} lineLength := succ(lineLength) end; {writeln;} bytesInLine := bytesInLine + numbytes; numbytes := 0 end; {FlushHunk} procedure encode1; begin {encode1}; if numbytes = bytesperhunk then flushhunk; endofinfile := not (getbyte(hunk[numbytes])); numbytes := succ(numbytes) end; {encode1} procedure terminate; begin {terminate} if numbytes > 0 then flushhunk; if lineLength > 0 then begin flushLine; flushLine; end else flushline; writeln (outfile, trailer); close (outfile); close (inf); end; {terminate} begin {uuencode} init; while not endofinfile do encode1; terminate end. {uuencode} ----------------------CUT HERE----------for uuencode.uue---------- begin 644 UUENCODE.COM MP^(@S:M#;W!Y<FEG:'0@*$,I(#$Y.#4@0D]23$%.1"!);F,`!`"A0@`````` M```````````````````````````````````````````````````*3D5#(#@T M,#%,4R!H:6QI=&5E9610$``)&UL_,FP;9QLJ`````````!M6```````````` M``````0;/0`````````````````!("`$`P```ALJ````!!L]("```AM%10T` M`AM2?P`````"&U0````"&R@Q```"&RDQ`````'ZW-\@C]>5^S>@!X?$]R!CS MS0`"#0H`R6_ES:8`R?Z`W&L"U(0"YG\8[N4A[@$8!.4AZ`$B$P+AX_7%U7XC MMR@'Y<WH`>$8]-'!\>/)?;3(.B0!AX>'X^/CX\4!T@3!/2#T*QCHS=`!V"K. M`1C?]<75Y2&H`<TU`B&B`<W0`2JZ`=0=`N'1P?')]<75Y2&T`1CI]<75Y2&N M`1C@]3K@`+<H$,75Y:\RX``AR`'--0+AT<'QR?4ZX`#^_RCVQ=7E/O\RX``A MP@$8X_7%U>4AO`$8VO7%U>7E$?``(8L!`1``[;#1.IX!3SJ<`8+5S=P"T3J? M`4\ZG0&#S=P"(?``S=`!*J`!S1T"X='!\<DA\``&``GK(9L!-#4H`A+)&QLA M"@,&`RL.+PR6,/R&]7G^,"@!$A/Q$.W)`0ID(6L!PS4"(7L!PS4"$0,`S5\# MY@$8!A$&`,U?`V\F`,D1$@`8]!$,`!@($0\`&`,1"0#AP>4ZW0"W*!K5Q<V@ M`'RU*`_-X0/^$R`(S>$#_@/*U"#!T2H!`!GI(M(`>#+=`'FW*`L^PS(X`"'[ M'R(Y`"&E`Q&@``$8`.VP(;T#$;@``0P`[;"O;V<RT``BU``BU@`^?C+1`#+@ M`,G#%@/#(`/#.0/#+P/#-`/#*@/#.0/#(`/!`((`0P#$`,4`P0#%U>7=Y?WE M]6\F`.7-I@#Q_>'=X>'1P<G%U>7=Y?WES:,`?1CK#O\8#`X`[5O2`!,:_B`H M^B%E``8#S7L$&LVF!/Y!.!+^43`.1Q,:_CH@!GC60!,8`ANO(5P`=R,,#2@9 M&LV"!"`3_C\H#_XJ*`O^+B@'!@O-=P08$`8(S5X$&OXN(`83!@/-7@0A:``& M`(Q#[R1H,#2@(_C\H"?XJ*`O-@@0H"W<C$Q#IR1,^/Q@"/B!W(Q#\R<VF M!/X@.`WEQ2&8!`$.`.VQP>')O\D@+BP[.CT_*EM=/#Y[??YAV/Y[T-8@R7S- MM`1]]1\?'Q_-O03QY@_&D"?.0"?#R0.O-\M\P'RW?<@^_\DRV`#%S:\>P2H& M`+?M0MJH(.O1^0$`_`DBQ@"O;V<BS@`RW``^PS+9`"'>("+:`.LBS`#IY2K& M`+?M0B+&`.U;Q`"W[5(9Z^':=1WML,DJQ@#ML"+&`-G)7B-6(]5>(U8C3B-& MX<G=X>L:3P8`+V\F_SGYZP/ML-WIT1I/!@`O;R;_.?GK`^VPZ=WAZR'@_SGY MZ\4$!2@%KQ(3$/SML,$^()"1*`9'KQ(3$/S=Z=WA(>#_.?D&(*]W(Q#\W>G= MX47-N@6V=]WIW>'1?9,X]SQ/0\VZ!5]!K[/+(S`&MG<CKQX!$/,8W7CF^`\/ M#\8";R8`.7CF!SQ'KS<7$/W)Y=GKXW,C<B/1<R-R(W$C<,G=X7CK(0``1#E. MY0DCX[DX`7D2$R.W*`-/[;#A^=WIW>%X(0``1#E.Y0DC7B-6&-S=X>MH)@!$ M.>VP(2``.?G=Z=WA(2``.5XC5F@F`$0Y[;`A(@`8Y]WAZW@O;R;_.?EP(T@& M`.OML-WIM^U2&=@^D,,G(+?M4K?M0C`#"1G)/I'#)R"W[5+K$^IQ!O`8`?@1 M``#)U>NW[5+KX1CKM^U2(0$`R"O)S=\+&/7-L`D8\+?M4B$!`,`KR<W?"QCU MS;`)&/#-<@<A`0#0*\G-WPL8]<VP"1CPS7('(0$`R-@KR<W?"QCTS;`)&._- M<@<A``#(V"/)S=\+&/3-L`D8[\UR!R$!`-@KR<W?"QCUS;`)&/!474M"ZR$` M`'JW/A`@`U,^""GK*>LP`0D](/;)?+7*`PI\JO7-@`?KS8`'ZT1-KV=O/A'M M:NU",`()-S_+$\L2/2#PZ_'P&$CES9('RSS+'='KS0\'Z\MZR!@US6$'R"D0 M_<G-80?(RSS+'1#ZR>MZMR`(>_X0,`-'M\FO9V_)ZWRJ?/I^![K`?;O)%\G+ M?,A\+V=]+V\CR7WF`6\F`,GM2\H`[5O(`,75>$%*4QX`'\L8RQG+&LL;X1GK MX>U*1$TAZ6(9(L@`ZR$9-NU*(LH`1$W)!@`1$"?-X@<1Z`/-X@<19`#-X@<> M"LWB!WT8#:\\[5(P^QD$/2`"!<C&,-UW`-TCR=U^`-8D3R$``"`"W2/=?@#- MI@36,#@I_@HX#@P-("'6!_X*.!O^$#`75%TIV"G8#`T@`E1=&=@IV%\6`!G8 M&,MYM\A\A\G=X>'E?28`(SE.@3@<=^LA``!$[4(Y^>OE`^VPZ^$K&T\#[;CK M(_G=Z3X0PRD@W>'-R`17X<W="5_AY7V3.!H4%2@6NC@62@8`8#E[@E1=/6]@ M.7GMN.L8":\8`SQK+28`.7?YW>G=X>'E?28`(SGY;R8`W>G=X2$``%0Y7DLC MY1E>0R/E&>7]X='A>9`X$#Q/Q=7E&KXH#.'1P2,-(/(A```8#B,3$.S1X<$A M```YZ^U2_?G=Z=WAS<@$3^'-W0E?X7Z3.!L,#2@7D3@2]7Z1=P8`4!E470GQ M/$_ML!@"'7/=Z=WAS=T)3]'M4^@`(0``.1KUAC@#N#@!>!+Q5UZ1."\\;WJ# M.`2X?3@(>),X)I$X(SRW*!_%U2KH`%\=%@!"&0G1U>50&>OA3^VXT<$8!7H\ M*!E/>)$\NS@!>[<H#BKH``8`">LA`0`Y3^VP(0``5#E>$QGYW>G=X>$MPF8( M;"8`W>DA`@!4.5X3&7XV`2-WR2$$`%0Y7DLCY1E>0R/E&>7]X='AK[@H!+D@ M"'BYX=']^=7I&KX@]B,3!0T8YWRW(`-]M\`^$<,I(,T-"M`^`<,G(,V!"ACU MS:P/S9<*&.W9?;?9/@+*)R#-]0H8W]G+>-G"B`K9?;?9R-G%U>79?;<@!=G+ MN!A4Q<OXKPC9R_A]V94H$S`&[40(/0C9S7H++#T@^0@H`=GQYH`@#\V2"S`E MS7L+MRP@'C<8(,W&"S_U*!`X`=G-K`O+>"`)S88++2#VS7(+\3@"R[BWV>'1 MP=G)V<MXV<(4"LV/"LT4"M@L+<AX[H!'R=E]M]G*<@M]M\C9A=G-30O%U>7= M.<UR"]DN!=D^"-TCW6X`",L=,`/-D@O->PL(/2#QV2W9(.7=;OO+>"`)",V' M"RPM*`$M\?'QMPCQV<'AV=WAR[BP1RPMS'(+",E]M\C9E=D_S4T+Y>7EW3G9 M+@79/@@(S<8+.`/-K`L_RQ4(/2`,W74%W2O9+=DH#CX(S88+,-\(S:P+MQCA MS88+.`3-Q@L_X='!RW@@!<V'"QB:+""7-QB5.`;&@#@&&!O&@#@7;]WCV>7% M>,OXV:CF@/7+^-WEW2$``,GAV*]O1T]77V?)M\L8RQG+&LL;RQS)M\L4RQ/+ M$LL1RQ#)?-F$V6=[V8O97WK9BME7>=F)V4]XV8C91\E\V9399WO9F]E?>MF: MV5=YV9G93WC9F-E'R7C9N-G`>=FYV<!ZV;K9P'O9N]G`?-F\V<G9>-FH\ND+ M>!?)RW@H!LWS"\@_R7W9O=G`M\C#Q@M]UH':<@L\_BC0V<75Y0C-<@L(-\U[ M"ST@^=E\V:399WO9H]E?>MFBV5=YV:'93WC9H-E'PWL*V<75Y=G-K`_9S?T+ MV<V!"ACK?;?(RW@^`\(G(,VL#WW&@,LOQH!OUA3UV<75Y<WU"LT-"BW%U>7- M@0I]X='!V>'1P>.\XS#C\=G)V<V.#RW-@0K9S8X/+-E]_FS8Q<NXS=\+P3@) MS?4*S30,S9<*RW@H`\T-"MDMV<W?"_4X`\V!"MDMV<W?"S@%V2S-@0I]_FPX M.]D!JBH1JJHA?ZK-EPK=Y=TA!PT^!<TT#]WAS:P/S9<*S9<*Q=7EV<VL#RTM MV2W-#0K9X='!V<V!"BPL\2PMR-AX[H!'R6>J/RLRUVZV*AWO.'0-T``-T'J( MB(B("'ZKJJJJJBPM/@3*)R#+>,(G(-G-F`_9?2Z!E?7-]0K9S88/V<V!"L75 MY=DLS0T*V>'1P<WU"MWEW2&,#3X&S30/W>$LV<VB#RW9S0T*\<75Y6\F`#`! M)<T($-DLS9<*V>'1P<T-"GW^9]IR"\E]BIW8B1U]Z:*++CI]CN,XCF-^29(D M21)^S<S,S$Q_JZJJJBK9S:(/V;?+>/7+N,WU"GW^B#!'Q=7E+,W0#^7+/,L= M?>'US0@0+"TH`2W9\>'1P?7-@0K=Y=TA$`X^",U)#]WA\3`*]=G-F`_9S9<* M\85O.`GQR-G-A@_#]0KA/@'#)R!M+AT18#%P1BS^Y7]T-GR)A"%W4SS_PRYZ MTGU;E1U\);A&6&-^%OSO_76`TO<7<C%]M\C=Y=G-A@_9K\MX*`,\R[CUS=\+ M.`C9S?4*\<O_]=D!SP81CNDA?DK9S=\+,`7-+@\83]TAS@X^`@C9$1(`W1G- M<P_9S=\+.`L(/2#LV1$,`-T9V=G-;@_+^,T-"L75Y<US#\V7"MG-A@_-#0K9 MX='!S?4*W>7-+@_=X=G-;@_-#0KQ%S`*]=G-C@\MS8$*\=WART_(R_C)?^?/ MS!-4?_;THC`)?VK!D0H&@+6>BF]$@((L.LT3@&K!D0H&@0``````@"&BV@]) M?>BBBRZZ?8[C.(YC?DF2)$F2?LW,S,Q,?ZNJJJJJW2$*#SX%Q=7E]<VL#\V7 M"O'-20_9X='!PY<*]=G-;@\8$/79Q=7ES6X/S0T*V>'1P=G-EPKQ/2#IV<V& M#\,-"A$&`-T9W6X`W68!W5X"W58#W4X$W48%R2&!`$1,5%S)`0])$:+:(8(A MR0$$-1$S\R&!^LD!<C$1]Q<A@-+)Q=7EV>'1P<G-D@<A@``^(,MX(`W+(\L2 MRQ'+$"T](/!OR[C)RWC9S88/*`++^"W-#0JWRWTH',MX",OX/H^].!8H!LUZ M"RP8\\UZ"PA@:<C#@P<A``#)/I+#)R!\M<IR"\M\",V`!SZ0*3W+?"CZ1$T1 M``!B;PC`R[C)S<@$ZQX`.`3^&3@8'<W(!-G+>-D6!R@!%)(P`:_^"3@"/@D\ M5]79_2%=`-WES>L0W>'13WH\RWL@$('R:Q#]-@``&`O^##@"/@O5S8`1T<MX M*`4^+<WE$,M[*`-A#@#+>2@%S>,0&`?-V1`-\H\0>K<H%SXNS>40#"@&S>,0 M%2#W%?JQ$,W9$!CWRWO(/D7-Y1`^*\M\*`9\[41G/BW-Y1!\!B\$U@HP^\8Z MW7``W2,8#/U^`/TCMR`$_2L^,-UW`-TCR?WE+"T@#@8,_38`,/TC$/BOPWT1 MQ<NX?=G6@&^?9Q%-`,WU!A$%`!E\_MD@`3S]=P#M1,U`$GW^@3`&S;,2_34` MR_@^A)4N`"@(S7H+RQT](/C]?@#U/@P(>!\?'Q_F#\8P_7<`_2-XY@]'Q=7E MRR7-APO+)<V'"^OC&='C[5KKX>/M2D1-X<LES8<+"#T@R/'!_>')_>7A7Q8` M&7XV`/XUV!WZG!$K?CQW_CK8-@`8\38Q(S8`#,G9`0``V<UR"]U^`,VF!/XN M(`S9RW`WP,OPV=TC&.K^12@AS3D2,%0(S;,2V`C9Q6\F`,T($,WI"=G!V,MP M*`$-V1C7S1X2V-G+X-TCW7X`_BLH!OXM(`3+Z-TCS382/]A/W2/--A(P"MTC M5WF'AX&'@D_+:"@$>>U$3]G9><:`_EK8_J8_V,7=Y7G-0!+=X=G!V<G=?@#6 M,#_0_@K)];?R1Q+M1/7+/\L_/"'Z_Q$&`!D](/SKW2%W$MT9S7,/\>8#*`CU MS;,2\3T@^/&W\I<*V</U"H$``````(X```!`')L``""\/J@`$*74:+8$O\D; M#L.LQ>MX+=#-SAO"4][Y>#D_`>LKJ*W%'?C)>\Z70'VWR,OXQ=5\S7H+S7H+ MA&?C[5KKX>/M2D1-X3`&S7L++#?(?<8#;\NXR0X!&`(.`,T_$QJ^(`@C$Q#X M>>X!3R%``#GY:28`W>D.`1@"#@#-/Q,-(`'K#@`:MKX@XB,3$/<.`1C:S3\3 M&K9W(Q,0^>OYW>G-/Q,:+Z9W(Q,0^!COS3\3&J9W(Q,0^1CC_>'=X2$``#GK M(2``13G]Z=WA(2$`.7ZW*`.O&`8K1LVZ!:8A(@`Y^2$``"@!(]WI/J\RZ`#] MX2K2``80S>(%KQ+A(N(`_>5\MR`&/B(RT`#).N@`MR@*S;83(`4JX@!WR<WR M`RKB`#8`$0P`&>LA7``!)`#ML,D&!B'F$\7E!@/M6](`$QK^("CZ&LVF!)8H M"N'!$00`&1#CM\DC$Q#KP<$:_CK`?LE#3T[!5%)-P4M"1(),4U1#0558Q%53 M4L4^KS+H`,UI%#K0`+?`*N(`RZY^Y@_`S3`4.M``M\`JX@`ZZ`"W`8"`*`,! M0`!Q(R-PR<U:%"KB`!$,`!GK.N@`MP$/`2@*U0X3S04`T0$6\<7-!0#!/,!X M,M``R2KB`!$8`!D&`(Q#[R2+B`'[F#\#+=B@*/AK-QA;-#!<8`\M^R"KB M`.41#``9ZPX0S04`X3P@!3[_,M``-@#)XR+D`./E(<(`(N(`X<GC(N0`XR+B M`,M^P#X",M``R>,BY`#C(N(`RW;`/@,RT`#)/J_C(N0`X^4AP@`BX@#+KO7- MZ!3QMR@#S>$!X<D&`"'1`'[^?S@"/GY/-GXJT@`BU``6`,WA`W<>`?X(*#;^ M?R@R'?X8*"W^&R@I_AHH-OX-*#C^(#`1_@,@V3K=`+<HT]TJY`##%B!YNBC( M?A0CS<D#&,`5^OT4*\T``@@@"``=*+$8[P0%**L8!`0%(`0V&A@(S>$!-@TC M-@HC(M8`R2KB`#K0`+<@>7[+;R!PY@\@+B,C?K?REQ4.%.7-NAGA*`CE$2X` M&38:X:]W-,8N7Q8`&7[^&B`]*N(`(R,U](!LJU`#M6]8`M^U2.`4&_\WJ M%"K4`'XC(M0`&!<](`;-HP!]&`X]/2`&S:\`?1@$S;4`?2KB`,ON(W<KR2-^ M*\D^&LGE*N(`?N8/_@8H)\UK%?XA,`C^&B@$RZX8\1%=``8>Q=7-:Q71P?XA M.`;+KA(3$.^O$N')W2%=`-U^`+?(!@#^+<`$W2/).`7=?@"WR#X0,M``-\GE MS6L5RZ[A=\D^KT_%S?`5P<TD%LC%Y<WW!]'!S386V`7,@P?K<PP-(`(C<NO) MS?`5S206R,7ES:,1V>'!S386V`79S(\*V</1!>7K#@#%U<UK%='!_@TH"_X: M*`?+K@P3$A#JX7')S6L5_AHH$\NN_@HH#?X-(._-:Q7^"B`"RZ[)*N(`3SK0 M`+?`?N8/(!`C(^5^QBY?%@`9<>$T\!@H_@8H%>$&`,7E/<JF`#T]RJD`/<JL M`,.R`"KH`#KJ`+[(-%X6`!EQR2KB`",C?K?(-@`.%<VZ&<@^\#+0`,E]P\86 MP='%W2K2`,M\*`;-@P?K&`[KRWPH"<V#!]TV`"W=(]7-Q@?AS<@$[5O2`-WE MX;?M4DWKD3@.*`Q'Y3X@Q<W&%L$0]^%!!`7(?L7ES<86X<$C&//!T=GAT<'9 MQ=TJT@#5S2<0&+[!T<7-R`3+0R&A%PX$(+\AI1<.!1BX5%)5149!3%-%S<@$ M(0(`.4XCS5D7T?G5R>%^([<H#$=^Q>7-QA;AP2,0]>D^#<W&%CX*P\86$0T! M&`T1#0`8"!$:`1@#$1H`(N(`RWXH'-7-:Q71NR@0_AHH#/XA,`P4%2@(RZX8 MZ"$!`,DA``#)/J\RZ`#M4^8`S7H8.M``M\#-,!0ZT`"WP"KB`#;0(R-W$08` M&7<C=Q$D`!EW(W<1UO\9.N@`MR`;Y0$$`*_-"1GA(R-.(T8JY@"W[4+(/I`R MT`#)Y:]W(W<C[5OF`',C<N$!!``^`\,)&2+B`'[FP,C-KADJX@`1+0`9KW<C M=Q'4_QEW(R,!!``^`<T)&<VN&<.!%.,BY`#C(N(`?N;`P#X$,M``R3K0`+?` MY<U:&NNW[5+A,!"OS0D9*N(`$0@`&33`(S3)/IDRT`#).M``M\#ES5H:M^U2 M/@$@$"KB`!$$`!DT(`0C-"@(/@/AS0D9&,CA/O(RT`#),ND`ZRKB`,MF*"_+ MICKI`,M'*!@C(WXK*[<@$#KI`,M/(!=XMR`3>;?Z0QG%U0XAS;H9T<$@42KB M`#KI`,M'*`++[B,C?L8NU5\6`!G1UB[-FAGMH.)F&3SR7!D]/,V:&2KB`",C MYG]W(!;%U>7-KAGAT<$@%=41*P`9T30@`B,T>+'"#1GKR3Z9`3[P,M``R?4Z MZ0#+1R@!Z_')(N(`S:X9R!CF#B(JX@#+YLMNR,NN*N(`Y<41,``9ZPX:S04` MP>$1#``9Z\T%`+?)P='M4^(`Q>7-6AK1M^U2.$`JX@`!!@`)3B-&(W,C<LTL M&@$$``DP`1-]YG\IZ^UJZU-<*N(`(R-W`2L`"4XC1NNW[4()R-7ES:X9T>%R M*W/)/I$RT`#)U=GAV2$``%1=/A`IZ^UJZ]DIV3`$"3`!$ST@[\G-71JW[5(A M``#`(\G-71KKR2KB`!$$`!E>(U8CU4XC1B->(U;AR3ZO,N@`S;`:.M``M\#- M,!0ZT`"WP"KB`#;`Y1$,`!GK#B/-!0#A$2T`&:].=R-&=Q'6_QEQ(W`C-H`C M=R-W(W?)(N(`?N;`R,.!%#XB&`(^(41-(?``(N8`W>'1X=WEQ<W]&L$ZT`"W MP"KP`.U"R#KI`/XA/IDH`C[P,M``R3XB&`(^(2+F`-WAP='AW>4RZ0`BX@!^ MYL#*L!@JY@"O=R-W>+$H.<75#AK-!0`JX@`1#``9ZSKI`$_-!0#1P;<@'M4J MX@`1+0`9-"`"(S31(8``&>LJY@`T(`(C-`L8PRKB`!$M`!E.(T81VO\9<2-P M$?S_&58K7NNW[4+0ZW$C<,G!T>U3X@#%Y<U:&M&W[5+:)AHJX@`!"``)<R-R M`20`"7,C<LG-3!S`$0P`&>L.$\T%`#S`&#_]X2K2``80S>(%KQ+A_>7-3!S` MY<WR`^'E$1P`&>LA7``!#`#ML.$1#``9Y>L.%\T%`-$\*`DA7``!)`#ML,D^ M`3+0`,D^KS+H`,U,',`ZV`"W/B$HZRKB`!$,`!D17``!)`#ML!%<``X/S04` M/"C/(3,<$;```1D`[;`1``$ZZ`"W(`3M6P$!,0`!P[``U0X:S04`$5P`#A3- M!0#1(8``&>NW*.D8-R+B`'[F#\@^(#+0`,DBY@#M4^@`Z^$BX@!.<R-&<NNW M[4(H6NLC$5P`.MP`$A,!"P#ML`88KQ(3$/SE$5P`#@_-!0#1/"@_*N8`(GT` M[4OH`,75#AK-!0`17``.(<T%`-'!MR`A*GT`(R)]`"&``!GK"WBQ(-L17``. M$,T%`"KB`!$-`!GIW2KB`#[PPRD@S<@$_A'0,MP`R2+P`.OAXR+R`!,3$WOF M_%\AW@`B^`#=*MX`W6X"W68#?;0H2.U2,`_=;@#=9@'EW2+X`-WA&.,@"MU> M`-U6`=WE&!M-1-UN`-UF`=WEW1G==0#==`'=<0+=<`/=Y=$J^`!S(W+1*O(` M<R-RR=WEX1DBQ``J\``!!``)W>7!"=IU'>U+Q@#M0@$``"$``-HP'3[_PR<@ MZ^'C?B-F;Q,3$WOF_%_K(O``*MX`Y=WAM^U2,%+=;@#=9@'EM^U2,`3=X1CP MX=7]X>U+\`#]<0+]<`/]=0#]=`'=<P#=<@'=Y>'=3@+=1@/-!!XH"=U>`-U6 M`=7=X=WEX=U.`MU&`]U>`-U6`1@;*MX`[5/>`-7=X=UU`-UT`>U+\`#=<0+= M<`/K";?M4L#5_>$JQ`"W[5(H&_U^`-UW`/U^`=UW`?UN`OUF`PG==0+==`.O MR=WEX2+$``8$-@`C$/O)S4L>*O0`R<U+'BKV`,DA```B]``B]@#=*MX`W4X" MW48#>;`H'BKT``DB]``J]@"W[4(P!.U#]@#=;@#=9@'EW>$8V"K&``'[_PGM M6\0`M^U2V.LJ]``9(O0`*O8`M^U2T.U3]@#)[5O$`',C<LE>(U;K(L0`(MX` M!@0V`",0^\D^KT\BZ`"O=S+0`'@RZ@`JX@`B[0`A1A\BX@#A(N0`X0P-(`7- M)A<8`\UY%RKM`"+B`"KD`.D^KS+L`"+H`"KB`"+M`"%&'R+B`.$BY`#A(NH` M(5P`!A[-X@6O$BKJ`#KL`+<@!<U.%A@#S7(6(=``?C8`MV=O*`C=Y>$17`#M M4NLJZ`!S(W(8H\8`[5\RRP#)Z]WAP>%XL2@+<PMXL2@%5%T3[;#=Z41-W>'1 MX7BQ*/3M4ADP[0L)ZPGK`^VXW>E5%!4H`\V=']WA3P8`+V\F_SGY<2/K#`TH M`NVPW>D6`"&``#X?1K@P`@8?(PX`!`4H#7[^("@$_@D@!",%&.]=!`4H#7[^ M("@(_@DH!",%&.]]DR@$#!4@U6DF`%3)T<'5+6$EPZ("?<VF!&_)*@$`&1D9 MZ2'0`'XV`&\F`,G-%@-\M<@ZW0#UKS+=`,T@`_$RW0!]_@/`W>$1`0`8$3K0 M`+?(W>%?%@$8!=WA7Q8"U<UZ`]&O,MT`*LX`?+7=Y>'M2\P`[4(!%0`)(LX` MMR`'U=7ES=D`T7JW(!3-``)>0PT*57-E<B!B<F5A:P`8*ST@"\T``@T*22]/ M`!@.S0`"#0I2=6XM=&EM90#-``(@97)R;W(@`'O-M`3-``(L(%!#/0`JS@#- MKP08%<T``DYO="!E;F]U9V@@;65M;W)Y`,T``@T*4')O9W)A;2!A8F]R=&5D M#0H`.M@`M\J.)\,``.'1T>DQ``$A@'\!`/_-9`,AD2@187P!`(`^`<W4!,-T M*`###B$``($``0```````/WAX2)9??WE*@<A)@#+1<JM(2$``'TR!R$A2'_E M(4=^S3H%S7`3(4A_S7`:S?$?Y2$``-'-D@;+1<J$(<V;%,VZ%P5&:6QE("%' M?LTZ!2$``,VJ%\VZ%Q4@;F]T(&9O=6YD+B`@06)O<G1I;F?-S1?-&R##U"`A M2'_-71HB"B$A3WWE(8(`S>4<(0``ZRI/?7,C<BI/?2(,(2$``"(#(2H,(2)/ M?2H%(>4A@`#1S<P&RT7*GR(J3WU>(U;KY2$``-'-D@;+1<KZ(2I/?5XC5NLB M37TA3WWE(8(`S7H=*DU](D]](0$`(@4APY\B(4]]Y2&"`,UZ'2$``")/?2$` M`"(((2H#(>4J"B'1S>`&Y2H((>4A"`#1S>`&T7VC;\M%RIDB(4M]Y2&"`,WE M'"$``.LJ2WUS(W(J3WWE(0``T<U_!LM%RF,B*DM](D]]*D]](DU]PW,B*DM] MZRI-?7,C<BI+?2)-?2%(?^4J37T1`@`9Y2$!`,V^<("H((2,B""$J`R$C M(@,APQ`B(0$`(@4A*D]](@PA*D]]Y2$``-'-D@;+1<K<(BI/?1$"`!GE*@4A M*]$9;B8`ZRI9?7,J!2$C(@4A(0$`?3);?</K(B$``.LJ67US(0``?3);?2I; M?28`R?WA!E`A^GS-X@7]Y2'Z?,TZ!<V;%"$``,VJ%\W-%\T;("%(?\VP< M("&8?LUI%,T;(,/4(,G#U27-FQ_E(0$`T<W@!LM%REHCS4T%&$YO(&EN<'5T M(&9I;&4@<W!E8VEF:65D+LWQ(B$!`,U]'P90(4=^S>(%S9L4S;H7$%5U96YC M;V1I;F<@9FEL92`A1W[-.@4A``#-JA?-&R`A+@!E+@'E(4=^S3H%S;(((N!\ M*N!\Y2$``-'-?P;+1<K"(R%'?LTZ!090(?9]S>(%P]LC(4=^S3H%(0$`Y2K@ M?"O-:P@&4"'V?<WB!<U-!0,V-#0&4"&E?<WB!<V;'^4A`0#1S<P&RT7*9B0A M`@#ES9L?T<UF!GJSRF8DU2+@?"K@?,U]'P90(8]\S>(%(8]\Y2$!`-$9;B8` MY<V!!2$P`.4A.0#-FP7-3Q/+1<I/)"&/?,TZ!090(:5]S>(%PUTD(8]\S3H% M!E`A]GW-X@4JX'PCT1O#!20A+@!E+@'E(?9]S3H%S;((Y2$``-'-?P;+1<J< M)"'V?<TZ!<U-!00N=75ES3T(!E`A]GW-X@4AF'[E(?9]S3H%S6\3S1L@S9L4 MS;H7"2!T;R!F:6QE("'V?<TZ!2$``,VJ%R$N`,TB%\W-%\T;("&8?LW_$\WQ M'^4A``#1S7\&RT7*FB7-FQ3-NA<23W9E<G=R:71E(&-U<G)E;G0@(?9]S3H% M(0``S:H7S;H7"#\@6UDO3ET@S1L@(;H`S:D4(8Y\S406S1L@*HY\)@#-Y!]] M,HY\*HY\)@#ES8$%(5D`S9$%(4X`S9$%S4\3RT7*'B4JCGPF`,V;%,TB%\W- M%\T;("J.?"8`Y2%.`-'-?P;+1<J:)2'V?<TZ!<U-!1$@;F]T(&]V97)W<FET M=&5N+LT]",WQ(B&8?LUI%,T;("&8?LW^$\WQ'^4A``#1S<P&RT7*U"7-304+ M0V%N)W0@;W!E;B`A]GW-.@7-/0C-\2+)S2LC(0``(I]](0``(J-](0``(J%] M(9A^S;H4S;H7!6)E9VEN(2``S2(7(:5]S3H%(0``S:H7(2``S2(7(4=^S3H% M(0``S:H7S<T7S1L@R<-F)OWAX7TR@WS]Y2J#?"8`Y2$@`-'-?P;+1<I4)B&8 M?LVZ%"%@`,TB%\T;(,-E)B&8?LVZ%"J#?"8`S2(7S1L@R<V;%"$N`,TB%\T; M("J??>4A(`#1&>7-)R8A``#E*J-]*]'-9@9ZL\JM)M4BA'PA8WWE*H1\T1EN M)@#ES2<F*H1\(]$;PXLF(9A^S;H4S<T7S1L@(0``(J-](0``(I]]R2JC?>4A M/`#1S7\&RT7*V2;-)"8A7'WE(0``T1GE(6!]Y2$``-$9;B8`Y2$"`-'-5@?K MX7,A7'WE(0$`T1GE(6!]Y2$``-$9;B8`Y2$$`-'-3@?E(6!]Y2$!`-$9;B8` MY2$$`-'-5@?1&>OA<R%<?>4A`@#1&>4A8'WE(0$`T1EN)@#E(0(`T<U.!^4A M8'WE(0(`T1EN)@#E(08`T<U6!]$9Z^%S(5Q]Y2$#`-$9Y2%@?>4A`@#1&6XF M`.4A/P#1?*)G?:-OZ^%S(0``Y2$#`-'-9@9ZL\K<)]4B<7PA8WWE*J-]T1GE M(5Q]Y2IQ?-$9;B8`Y2$_`-%\HF=]HV_E(2``T1GKX7,JHWTC(J-]*G%\(]$; MPYDG*I]]Y2JA?=$9(I]](0``(J%]R2JA?>4A`P#1S7\&RT7*`BC-QB8A8'WE M*J%]T1GES0`A?>X!;WTR_R`JH7TC(J%]R2JA?>4A``#1S<P&RT7*,BC-QB8J MHWWE(0``T<W,!LM%RDLHS20FS20FPTXHS20F(9A^S;H4S;H7`V5N9,W-%\T; M("&8?LUI%,T;("%(?\VP<(,G-*",J_R`F`'WN`6_+1<J+*,WO)\-W*,T? M*,/4(`%O?3+_("JA?2,BH7W)*J%]Y2$``-'-S`;+1<K,!LW&)BJC?>4A``#1 MS<P&RT7*S`;-)";-)";#0"C-)"8AF'[-NA3-NA<#96YDS<T7S1L@(9A^S6D4 :S1L@(4A_S;`:S1L@R<TH(RK_("8`?>X!;P`! ` end