dhb@uunet.UU.NET ( comp.sources.3b1) (03/11/91)
Submitted-by: John Milton <uncle!jbm> Posting-number: Volume 1, Issue 14 Archive-name: vidpal-em/part01 [A little bit extracted from the README file. See the README file for details.] First, the vidpal. Now, the vidpal emulator. This is a tiny software patch, written in assembler, which allows user programs to access the video RAM without hardware. It is installed as a loadable device driver. The end result is that you can run MGR unmodified on a machine without a vidpal so you can see how good MGR is and wish you had a real vidpal. The performance is a lot better than I expected, but is still FAR below what one will get with a real vidpal. #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of shell archive." # Contents: README Makefile vpe.s rops.Z.uue # Wrapped by jbm@uncle on Sun Mar 3 20:07:42 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'README' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'README'\" else echo shar: Extracting \"'README'\" \(11454 characters\) sed "s/^X//" >'README' <<'END_OF_FILE' X X X Vid Pal Emulator X XFirst, the vidpal. This is a hardware addition to the UNIXpc which defeats part Xof the normal memory protection hardware to allow access to the UNIXpc video XRAM. This makes implementation of programs that access the screen trivial in Xcomparison device drivers in the kernel. X XNow, the vidpal emulator. This is a tiny software patch, written in assembler, Xwhich allows user programs to access the video RAM without hardware. It is Xinstalled as a loadable device driver. This is how it works: in the driver Xinit routine, the 68010 BERR vector is patched in low memory to point to Xa routine in the driver which will get first crack at all BERR traps. The Xoriginal value of the vector is kept to allow normal processing of all non- Xvideo access, and to restore the BERR trap vector when the driver is unloaded. XOnce patched in, the new BERR handler checks all faulted addresses to see if Xthey are in the range $420000 to $428000, video RAM. If they aren't, then Xcontrol is passed on to the old trap handler for further processing. If the Xaccess is to video RAM, then the special status register in the BERR exception Xframe is check to see if the access is a read or a write. If it is a write, Xthen the word in the output buffer in the exception frame is written to Xvideo memory. If the access is a read, then the accessed word is read from Xvideo RAM and put into the exception frame data input buffer. Next, the Xre-run (RR) bit in the exception frame special status register is set to Xsignal that the read or write has been taken care of and that the memory Xcycle should NOT be re-run when the processor returns from the exception. XNext, a very important, UNIXpc specific operation needs to be done. A write Xmust be done to the Clear Status Register (CSR) register ($4C0000), which Xclears the BSR0, BSR1 and GSR registers. This needs to be done, because the XUNIXpc MMU circuitry latches some important information used by the Page Fault Xcode whenever there is a Bus ERRor. If this register is not cleared, then a Xlater page fault will have the status of a video RAM access in it and all kinds Xof weird things will happen (I know, this was how it ran until I found this). XThe last thing do be done is to return back to the user program. This must be Xdone with an RTE (ReTurn from Exception) instruction instead of an RTS (ReTurn Xfrom Subroutine), so that the state of the processor when the BERR happened Xcan be completely restored. X XFor more information about exception handling on the 68010, you should get a Xcopy of "MC68010/MC68012 16-/32-BIT VIRTUAL MEMORY MICROPROCESSORS", #ADI942R2 Xfrom Motorola. This is basically an overgrown data sheet. X XThe end result is that you can run MGR unmodified on a machine without a vidpal Xso you can see how good MGR is and wish you had a real vidpal. The performance Xis a lot better than I expected, but is still FAR below what one will get with a Xreal vidpal. For the more observant, you will notice that I said "the word" a Xlot above. The code as is will not take care of high byte/low byte write Xaccesses, but after playing with MGR for a while, it doesn't look like MGR Xdoes any byte accesses. X XThis code could easily be modified to provide various kinds of access to other Xparts of the machine to user processes. X XVIDPAL Blurb: X>VIDPAL KIT - $25 X> This kit contains a PC board, a programmed PAL, a capacitor, a socket, 66 X>pin sockets, ~1 inch of wire wrap wire, and complete instructions. X> What this kit does is it allows you to access the video ram of you 3B1/7300 X>directly from any user process. The significance of this is you can now write X>your own window manager with a lot less hassle. The reason I came up with this X>kit was because Brad Bosch and I wanted to run Mgr on our 3B1's and we didn't X>want to write a new wind.o for Mgr. X> Vidpal is a little daughter board that is placed between the 68010 and the X>mother board which intercepts and modifies the supervisor signal. The PAL X>checks to see if you are addressing the video ram, and if you are, the X>supervisor signal is forced active. This means the memory management PAL will X>not cause a bus error because it thinks your are in kernel mode. The vidpal X>PAL makes sure that ONLY the video ram is made accessible, otherwise you would X>loose all hardware protection. X> One of my design goals was there had to be NO modifications to the mother X>board, and the daughter board allows this. The kit requires a modest amount X>of soldering skill and for your machine to be mostly disassembled. Most X>people will find that it isn't difficult to assemble and install. X> X> Send a mailing label and a check in US funds to my NEW ADDRESS: X> X> Brian D. Botton X> 1748 Paddington Ave. X> Naperville, IL. 60563-2028 X>-- X> ... ___ *** X> _][_n_n___i_i ________ ******* Brian D. Botton X> (____________I_I______I_I_______I laidbak!botton or X> /ooOOOO OOOOoo oo oooo oo oo laidbak!bilbo!brian X X X X XHowdy, X XI have worked up an assembly routine which can be spliced into the 68010 XBERR trap vector, which appears to emulate the functionality of the vidpal. XIt is spliced into the vector in the init routine of a loadable device Xdriver and spliced back out in the release. I did say "appears" I pulled mgr Xdown from osu and built it. Since then, mgr, kdb and I have been fighting it Xout. I can get mgr started up and running the copyright screen. When I hit Xa key, the first few parts of erase_win -> Bit_pattern run, I get a whole Xline of: X X* * * * * * * X * * * * * * * X Xand a whole line of: X X * * * * * * X * * * * * * X XAbout the time it starts to replicate those two sets of lines down the screen, XI get a SIGSEGV. I have a breakpoint set in the kernal debugger on my trap Xhandler, and the address that's being trapped on is not an access to video Xmemory. Debugging this thing is a real pain with page faults rolling in on the Xsame trap. By running mgr with sdb and using (c)ontinue, I can get the screen Xfilled with the pattern, get the 4 sample windows up and usable and be able Xto move around and size/move/create windows. All this runs through about 20 XSIGSEGVs and (c)ontinue commands. Eventually I run into something that gets Xand illegal instruction and I can't continue. It behaves almost the same way Xeach time it's run, but page faulting going on with other processes can cause Xan increase in SIGSEGVs within MGR. Other processes on the system do not seem Xto be getting SIGSEGVs, only MGR. X XAs far as performance goes, I was VERY surprised. I expected this thing to Xrun totally doggie-doo, but it runs much faster than expected. The copyright XMGR takes about 2 seconds to make a full revolution. I called up Tim Lipetz Xhere in Columbus and he ran it and it seemed to run a little under a second. X XMy intention, once I got rolling on this was to come up with something that Xcan be posted to the net so that people can "test-drive" MGR to see if they Xlike it. Once they do, I think they'll be hooked. This should end up in a Xjump in vidpal kit sales for you (I don't know whether that's good or bad), Xand it should get more people writing software. X XI would like to have you test the VidPalEmu routine on a known good working Xcopy of MGR. If it seems to be working, try to cause more page faults on the Xsystem (a few "compress -c /unix >/dev/null &" is my favorite). X XI noticed that the 3b1 kit is still very rough, even for the non end user. XThere seem to be some things half implemented and some of the build stuff Xis weird. I can understand the use of the BUILD scripts to speed up hacking, Xbut a top level make should still do the right thing. A lot of the debug Xcode does not have "#ifdef DEBUG". X XI just bumped into the port/rops stuff, and it seems to be having the same Xproblems as mgr. The test_{rop,line,pixel} programs all work fine. I was also Xjust playing around with MGR again, and it seemed to be stable once all the Xparts I was using got paged in. Once a cron job came up and paged out some Xof MGR, it started having trouble again. Hmm. X XOh well, the code is below, please let me know what you find out. If you don't Xhave time to look at it, please pass me the names of some of the more active XMGR hackers you're in touch with. X XThe driver source is below. The last_bad is only for debugging. It holds the Xlast fault address to pass through. My reference material for the format of Xthe 68010 BERR exception frame format is "MC68010/MC68012 16-/32-BIT VIRTUAL XMEMORY MICROPROCESSORS", MAY 1985; ADI942R2. X XInstall thus: Xas vpe.s Xmv vpe.o /etc/lddrv Xcd /etc/lddrv X../masterupd -a char init release vpe X./lddrv -av vpe X XSince the patch happens in the init routine, no /dev files need to be created, X X XSome good kdb breakpoints: (3.51m) X Xbr 23E6 # a piece of code shared by two error routines which moves 11 (SIGSEGV) X # to a register to be passed on to cause a signal. X Xbr 23DE # part of a test to see if this is a bad access. X XSo what is this 3.52jmC kernel I'm hearing about? Drives 3 and 4? X XJohn X-- XJohn Bly Milton IV, jbm@uncle.UUCP, n8emr!uncle!jbm@osu-cis.cis.ohio-state.edu X(614) h:252-8544, w:785-1110; N8KSN, AMPR: 44.70.0.52; Don't FLAME, inform! X--- X#! /bin/sh X# This is a shell archive. Remove anything before this line, then unpack X# it by saving it into a file and typing "sh file". To overwrite existing X# files, type "sh file -c". You can also feed this as standard input via X# unshar, or by typing "sh <file", e.g.. If this archive is complete, you X# will see the following message at the end: X# "End of shell archive." X# Contents: vpe.s X# Wrapped by jbm@uncle on Sat Mar 2 04:44:53 1991 XPATH=/bin:/usr/bin:/usr/ucb ; export PATH Xif test -f 'vpe.s' -a "${1}" != "-c" ; then X echo shar: Will not clobber existing file \"'vpe.s'\" Xelse Xecho shar: Extracting \"'vpe.s'\" \(1235 characters\) Xsed "s/^X//" >'vpe.s' <<'END_OF_FILE' XX file "vpe.s" XX data XX lcomm berr_vect,4 XX lcomm last_bad,4 XX even 2 XX text XX global vpeinit XXvpeinit: XX mov.l &8,%a0 # Get address of BERR trap vector XX mov.l (%a0),berr_vect # Save the current value XX mov.l &hand,(%a0) # Point the BERR trap vector to hand XX rts XX XX set S%1,4 # stack offset with a1 saved XXhand: XX mov.l %a5,-(%sp) # save a5 XX mov.l 10+S%1(%sp),%a5 # set up a pointer to the fault address XX cmp.l %a5,&0x428000 # was the access above video? XX blt.b tvhi # it was below the end XXfail: XX mov.l %a5,last_bad # Save the current value XX mov.l (%sp)+,%a5 # restore a5 XX mov.l berr_vect,-(%sp) # push the addr of the orig trap hand XX rts # and jump to it XXtvhi: XX cmp.l %a5,&0x420000 # was the access below video? XX blt.b fail # was below, pass to old trap hand XX XX btst &8,8+S%1(%sp) # test the R/W* bit XX beq.b write # RW clear, access was write XX mov.w (%a5),20+S%1(%sp) # read video, write to the data inp XX br.b leave XXwrite: XX mov.w 16+S%1(%sp),(%a5) # move data out buffer to video XXleave: XX or.w &0x8000,8+S%1(%sp) # set RR to 1, suppress cycle re-run XX mov.l (%sp)+,%a5 # restore a5 XX rte XX XX text XX global vperelease XXvperelease: XX mov.l &8,%a0 XX mov.l berr_vect,(%a0) # restore the old BERR handler XX rts XX data XX fpused 0 XX XEND_OF_FILE Xif test 1235 -ne `wc -c <'vpe.s'`; then X echo shar: \"'vpe.s'\" unpacked with wrong size! Xfi X# end of 'vpe.s' Xfi Xecho shar: End of shell archive. Xexit 0 X-- XJohn Bly Milton IV, jbm@uncle.UUCP, n8emr!uncle!jbm@osu-cis.cis.ohio-state.edu X(614) h:252-8544, w:785-1110; N8KSN, AMPR: 44.70.0.52; Don't FLAME, inform! END_OF_FILE if test 11454 -ne `wc -c <'README'`; then echo shar: \"'README'\" unpacked with wrong size! fi # end of 'README' fi if test -f 'Makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Makefile'\" else echo shar: Extracting \"'Makefile'\" \(472 characters\) sed "s/^X//" >'Makefile' <<'END_OF_FILE' XSHELL=/bin/sh XCPP=cc -E X Xall: vpe.o X Xvpe.o: vpe.s X $(CPP) vpe.s > Tvpe.s X as Tvpe.s X mv Tvpe.o vpe.o X rm -f Tvpe.s X Xinstall: vpe.o X rm -f /etc/lddrv/vpe.o /etc/lddrv/vpe /etc/lddrv/ifile.vpe X cp vpe.o /etc/lddrv X if masterupd -c vpe; then :; else masterupd -a char init release vpe; fi X -cd /etc/lddrv; ./lddrv -dv vpe X cd /etc/lddrv; ./lddrv -av vpe X @echo "add the line \"vpe\" to /etc/lddrv/drivers if you want" X Xshar: X shar README Makefile vpe.s rops.Z.uue > vpe.shar END_OF_FILE if test 472 -ne `wc -c <'Makefile'`; then echo shar: \"'Makefile'\" unpacked with wrong size! fi # end of 'Makefile' fi if test -f 'vpe.s' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'vpe.s'\" else echo shar: Extracting \"'vpe.s'\" \(1314 characters\) sed "s/^X//" >'vpe.s' <<'END_OF_FILE' X X#include <sys/hardware.m> X X file "vpe.s" X data X lcomm berr_vect,4 X # lcomm last_bad,4 X even 2 X text X global vpeinit Xvpeinit: X mov.l &8,%a0 # Get address of BERR trap vector X mov.l (%a0),berr_vect # Save the current value X mov.l &hand,(%a0) # Point the BERR trap vector to hand X rts X X set S%1,4 # stack offset with a1 saved Xhand: X mov.l %a5,-(%sp) # save a5 X mov.l 10+S%1(%sp),%a5 # set up a pointer to the fault address X cmp.l %a5,&0x428000 # was the access above video? X blt.b tvhi # it was below the end Xfail: X # mov.l %a5,last_bad # Save the current value X mov.l (%sp)+,%a5 # restore a5 X mov.l berr_vect,-(%sp) # push the addr of the orig trap hand X rts # and jump to it Xtvhi: X cmp.l %a5,&0x420000 # was the access below video? X blt.b fail # was below, pass to old trap hand X X btst &8,8+S%1(%sp) # test the R/W* bit X beq.b write # RW clear, access was write X mov.w (%a5),20+S%1(%sp) # read video, write to the data inp X br.b leave Xwrite: X mov.w 16+S%1(%sp),(%a5) # move data out buffer to video Xleave: X or.w &0x8000,8+S%1(%sp) # set RR to 1, suppress cycle re-run X mov.l (%sp)+,%a5 # restore a5 X clr.w CSR_ADDR # reset the fault status registers X rte X X text X global vperelease Xvperelease: X mov.l &8,%a0 X mov.l berr_vect,(%a0) # restore the old BERR handler X rts X data X fpused 0 X END_OF_FILE if test 1314 -ne `wc -c <'vpe.s'`; then echo shar: \"'vpe.s'\" unpacked with wrong size! fi # end of 'vpe.s' fi if test -f 'rops.Z.uue' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'rops.Z.uue'\" else echo shar: Extracting \"'rops.Z.uue'\" \(22451 characters\) sed "s/^X//" >'rops.Z.uue' <<'END_OF_FILE' Xbegin 644 rops.Z XM'YV0`:0`('#BF0(8`!(J5,A!P(,`"Q9F`Y>0`*2$`A``T)B0(X`$"5W0*8.' XMSD*/'@%,K+BPI4L`(%R0"4,GS$*0"7%6O`B`XLN?0%R(F3.G90*+'Y$"R/BS XM:4)`+MBD$6/4`*:/5IUJW<JUJ]>O8,.*'4NVK-FS:-.J7<NVK=NW<./*G4NW XMKMV[>,^^X($5DY-<`&(DQ/((Q),HCUQ@>H%DH!),9@#\X\=XXPAD`&!`(/!W XM(P`>+P!T%HP'!M\`3H`XL?(/&1)W!/C](^>"UT<`1$8+8#4"V.V@MD$JZ8R` XM&CT20.`,@.5JXYN$($"X`<#`!:2]MZV,'L`)RQ,X`5P`&@T`CW3J+E`-'$W` XM2@L@_ZB=KZX>`7OW\*'-3T_]_OM_S,04'W/_0--&0@P(2(T4@/RGGPL%0N)* XM?/]Q(R`T$E(('S8",C/%A,PH`<AS`/@R&@)JR/$`,(&P(!I@,:#HPH3<L&<+ XM-!-2@\*+@<DX(38VXAB?"CS&J(8,1#*`1#"2$.)"(#:24"2*2`+@P)*2%/*D XMC29,>6226#H))8P$V.*"EU5>R:268P96YG_@S/@/."\<@(04+QCP0@$O$/#" XM`"\(<"=Q`2#SQ#LP@2$9#DS`)ALY3GCA1!U.Q+%::Z]Q(!LW/)RI@1+-@1`9 XM`(`H`1A(0)R1D!5PK-@<!R+P<9LQ$,0(`!*`(`&,'``(\ZHP@*@*@`VM`O-J XMK+/6JA&NNHI7[*NA80>2/=@AA,MVHAQ*W;,`P"HK2+3:RNRN*P;R7K>*XL:M XMM[=9HX2MPL)@ZF_"F@`J3,)ZL*YXT@900;4`7`OC`*)`\<2]%+"1D`WSHBJL XM!C,"0$&_,P`L<&`$&QR3Q-$TE^"9%!#1(!`2*V&$P@#(`(,!NG8,``0K$P$$ XM7PT#D&I"&L!@A`N(]#N$Q=@:?"\#*`-1\\T`0.QQOU,`/7#!!X<JK`(;,Q!) XM<R14[3(%0GA\+P0H\W#TPQ%#T.\93F,,];T@3+TQ!%<#@`(WTTG0]<MLJQK` XMIUBCC,/8.$=,0K][I!U#QD]L3$+<'P-`PM9WDW`O"BC3`'C2$:/0[R.&([XQ XM"G%#0#<`*MR-@N(X2BS"="#(D`)U2T)B;GXD_GVJS?5N3$&&T/`+<K^C=)XM XMHA\7&#<%*^N:.@JKP^2ZE;'/7B")EM^.M`G)`\.[>#J_@$"_R`BO+0.<N/&/ XM-%6G3D'S"#RO9#"R.UC[Y2;HOCT@+_S.5P(!M",^\1<Z7O92!P'V/4]-\:-= XM0JI'KX1@CV7:FU#O`-&][^U/`!;X'W7*=S[P,$=BTP&``AA@!``$`&4RN!P( XM=,:S_$E,6@+X@089`(=_."$?&Z$&.LZ#`!CL"`$M\Q@/?2C"(+ZL:P7B(0C0 XM,!`$[$@``(B`L)2@1"82@(A*(A<T`H$.0+!/!&D8R`&7M"4R>4(\/'P!!(B3 XM#0%XIXH#$0`3!_"R]#6'`E,`1!=%<"8&H",0LF/0F4#`%\G\0T6^HLXX4-$# XM^&BC57RDCC3N.(5`""`0"GF`[$10R'_,*14]",(_.#0=!"QQ(%C4E8JVV,6R XML<<3T!@9@*K6Q5A^,0K3<`>`BA`/C<#QBCO*XBJY"(@=Y<V$4#A/=*SHQ*5$ XM<8K*/"4P8:=%8C8/!&`4X^O45$8WG1$0RE0C&]V8.-9)4XX`H",$E$E$(`+# XM95EC'1$58,33F=.*J:QF*YN#@E?&\C\!.A,):NE%UHD`E[IDQA%Z"9-[HC*8 XMJGP`*P%!)!B<R00"(-D#9'`F!P@@"`#09!`:^0]WF<\:)((`'"``B9.2E!KI XM4H$23HHR#EBTI#)[Z4I;&A^26J,*2T@7`A#@#@`<X!_3B"84V!>+:(RJ?F>" XMP`=10**A%I4`2*W:!TE05:("H`!(!8\O`!%""'C5`$B]*3:"83YM7.B&.>0` XM)@X!@@,P2!.`6)>B-$!!"#H(5--+B!Y0L`0J+.&FVLAH0CCZ#VT8(0C"8%`0 XM:``,*C"AKE4``@VH(X2-'*A;0M!":$<KVM*2-@I"8$!G$:"P?Z!#"4(@D0)" XM.P4A1.8?^E"K8E,&(6P\-K*`F"PP0%"`6%YCN`2(936`\:$"*>H?@MBK"K+W XM5PD^)P#T(*QAX9"9#3"6&HLD*3.XBUC&6F.1O)(!`)00"&%9@+P4,*\X4"$` XM0"3$D^DB`'?)"B!`2,$(0`!&6QGK6,A*EK*6Q:QF.>M9$W*`O-Z%$'@9"9_Q XM9H8#\D4%?YGA7P!3%L+?#6^%R8MA"%ECOAONL&:!`6()BQA`),YPBO^[XA;' XMY\46AD&)2XIB\W&8QA_N;H@I#.,+R]C'*@XR#")\8R+G>,<GUC"2@<QB(;O8 XMR3$V<8_[2V4;3UB\6>:QE+GL86"@5K4;49@_7AO;A*C`RS@.<Y1G7.;:WO:1 XM5FXRF(VLY3'_&,`"'B5C?6O@X%*6N,9%KG*9*T%%^0,!BL(`":B;'\!"X[K9 XM+>P2X(SES$!(&^9%;\K6V]Z$O#<S\>US?>_[C_SNU\>`ED*@0?WIWQZXLI<] XM0&8WBV8$'"@`#\[SET?,9S%O.-9*9O*PBZSC(P,(V55>\I#WW.P^'SO`4DCV XMM(E=;6/#&MO:OC*UH;QE9D";T^-VMKG!'6UEQ[G8<_XV,++=[FTSF]Q^AO:9 XM5ZMF-I/HS<)^=[?C_6QVVUDR>):VN+F-[VO/.]#8&+2M#3W<X@+BN"!(+B"6 XMVUQH.!K2`+"`!RA=($M?UQO:W73`.UU>$XM:O>QU+WPSO&I#NII4\AYPK0LM XMW`3K>L&]_C4-5YYN:W\[W'IFN+K+C&ZE&[W@2%_VDY=>8Z([W=M0K_?"[TWU XMJ`N\X4?7>M*Y_O1U4W;?:0:`/_`!6Q*AH.EDQ[K9F6M;R7`#[E,O.Z#-%_'> XM3ERXB+ZXHC?.:.>JW0.*HH`+2`X-DR]%`2G'.WD_'6I4I)?4,D<US>UK\XJ\ XM&D`RD,!O@2",MB(VUH+0;#!\OFL&^]J$+)`\O,L=^M'3(!BR'SCM10]9U><> XM[*#GO3!\;_6X$YP9M>_][7^O[N0/?_G%S[O<G4]\A8]=^L>G/O2M+W4Y[][V XMP4`[:]6.C;8G)/;1][Z?M1^,@X^2^66G?NE'J5;4JS[P&-<XQQL-@'[(0U$2 XM(`&,YW@`X`DI!P.B%V`ZUUA_AV"YUGI!EQ`\@(!E1H$K9H&4A8'`H($<F(`9 XMZ(%FEEK\)AG(8'Y6HH'N9P\6"'$2QW.'9G'YMV@=]UQ>H"@1(`8#:%TFE&G; XME7Z>UEB5=WDQ9VHSIVJ<AU^>AW/!%PN097JUAFVI=WNL!W2K]6O!QGU?UWP2 XMP(3;YVXL!WS(MX63A7L^J'OK)X9=:&_8MWM<2(98^(5:V(;P-WUHZ(9>6'1T XM*(=E"(:AUX;BUV\F"'!OB(?95X?NEW!W>'6%R(3SAPWU!X7W!X.#MW^&]VB* XM\@!<D(.!A5V15X:4YW*6-VI#&')%*&8UAX0#\7G,,&][!X0[!UP]]X!4V&#` XM-H?'QXI5-XB*6&ZXZ'5P6':]*';=-WM^%HRVR(M=MH?J9HS*"(S)J(O&AXQE XM]H=JYV]N=HS%2&6'B(T;AHLLZ'<N6'&)EG$RR'^6"``-8`6:>&DFA'*:EGN? XM6%(OAWE$J'E&R&HWUXVRMH`%!HL.J&"\5H4F-'30N(;9Z(N$B(P(N8L'*8Q9 XMZ(P+&8T-R8T^-F\1:9#Z>)'JEY$AV&MJQG9M)C<4"2`627>W=7?-*'</QW<M XMZ(_B*'CD2'@S>'B*L@!FL([/(0"0]XZ>Z(KR&(HP5VJD:(^F>(2MEH0;UH=! XM\%M.R("0*(6R&)"TB'X%N9$^II2/E89;AY%7*899:8=J:)5+N)1C.))AR(1? XM:998698IN8ADJ977)Y9G^99@N95RN9:W1XW^4'XA296)*)%)Z95CZ'[8H):" XMV8B/.&]1&`SX-XF%YW']]W\?H00XF1!V<(`2,&L$UH"X!I"N]UD<0`/2()JD XM.9JF69K4Z%HFJ`"BZ7ZYE9DL"8XNV9@Q28F0^0^&H"@((`R5R8D\694_2&L_ XM*81">6HPD&I%B8](^6W^I9FO>&M3*)6O5XMM66X`YE\:28S7AIT.^8MR=YWT XM9I;@F9UFN)WA69WY!@3<*9[J>9[`69[,26]Z:8VDPY[<N8WH:9[?.$J<29OZ XM]Y@?IR@&P`N]B0R=^)[Q>%Y`28]#>9R;IYRIJ(2KR(^<&9V?F1#\8);D"88; XMJFX=6G8?*G<A>GPC6FXEZF=G)X)I]P\(8((FH*$F*1G>8);[26BS*8FU":!J XM1P.*0@#B4)DZ>:!_F6,).H^C:)S(&66G>)01&IB/%5S.R8#A:*$1&`!^&9;: XMV95/*ER&N:4GZJ1!0'%=&J9<FI]:2J9?>J9B:J;!YZ7=F9!GZ*9ZR9<D<J5V XMF:5MBJ8Q^GYL&H9;6J/]B:/_.9/^IR@"8`R]Z8X]B*`^J:#$F7D.>H^=UZ13 XM%J7]")U1>:$!0)!#*I?KV:>?^IY@&*J=BJ<_EJ9<AJJG^J8,.6.JRIUZ"9)N XM9Y;W67?_@)*BJF[-&9O\&8[^68Z5B'@)80V5"0",<("?EE&>M)E3FJD1"``L XM0`.R\0_2ZDG52JW3>JW:FJW3FIITBB#7ZG[XH%OP\0\M>6N_*I/\]P]PD"XX XMH"*P$`A4D1G0``0PL`,BY`3[```&H`3\\#+EP`;E@`_GX`_J0`#K0`_N``'N XM``SP8`SRP`STP`OV@`WW``;Y8`;[``3]P`7_P`1P51SB4%=YA`F`H`F'H%<? XMX0N3UZB+)"P3Z%?Y`0*:A@)(@%B[Q:S^"$Z""JS0<%LPM4",9U@X2S*\):4[ XMFZZV>5O8H"@)0`<M*YP**BQ8P'@T:U@V2UX3@*61*G<J9JD-R+/C.*@2=%NX XMD"X^,+0J!P-;>V5?2Z$N*+8P2;8%<EO.H)O.$+651[566[-(H+5<FZ36B6U@ XM&[=*^YAFB[9J"[A7%FN%F[0]JZYU*QEWNQ%O%YQ[NRI]B[5_FQEM&Y=$>7RM XM*)R7:FAR&X.2^[.2H0OI$K.ZXB"+^KD3-KHZ>V"GZY@==UN0>0"&H+>@*"Q: XML+E+D+6>&[A:.'KSIPVG]Y2!<+BY*QFVD"[V*K,%$KM#)G]-Z5C,Z[QE*QG, XM(*"X6J2H`+/":[,K"+>0.[8^"[3I0@-J>[X^6;J3=;LY^KRC)*!<X+L_R;?4 XMJQ]^R[B@V[5NF;S+JYB:U;R1N[22<;8)D;;]:[U7II0$_(0&3`,(K+ZI:[>* XM4@"VH+]3.QCEV[EL:[S.2+O/:;K<.[G_P,``X,"OFQ\0W&3>B+ZVF\*J^P^5 XM6P`JA;F_J[G]>[7#*\*R*W""FXV/6\,)C+BKV[J+6[Q7MI+Q&[8VK+L]Z@8> XM_+()$;P__+].',!%')AHV82-5<!2$(47/+?K"[W2V\0C',&'F;WV9\%3[+V* XM,@#$<,7CFQ`Z$,((>,0HG,3V:PWIHC(/?%BP&<6&"\C=VUAU+,+BR[\OG$1< XMW,9>3'6[BLCIB\89O,"*6\@`/+OMZ<?S.\<X;*BB@,?"0@4A_,E$O(PT_,<8 XMK,#_P`OILL>>W,43)LHT0+]T>\/28*CZQ</[F\6KC,NM''^\!Z6O/,J*K,+1 XMFQ#3&\G0$,,3EGRI-\%.6<%GC+JR_+TFI`6H[,/2#,3$2\G#*,#E=LFD*\7- XM?,.L*X%L/,0:MH^8C,2QK,2&%S#A_!E\G*SE6KNPK,FR'+0`X+Z%7+3+>L+, XM?,_VV[0)\:X/$*_S"@/U>J_YNJ_]^J\08`\N8`^N<`]4<`_Z@`^<D`]&D`_& XMH`]LL`\2L`^TP`]>P`_:T`^`X`\>X`_(\`]J$++4(`YSA;(JJP`XV+]%NU@* XM?6@_)YV@25I,;5JEE9KT.5M:X)KD:M2]>J,,O<B0H"@*D#-$+0&`L`4FC+3H XMFM07"@!,@(!A78%@+=87V-9LO=9O+=<?2-<;"-=S[=8IZI$+;((P@]>4Y7[T XMH-9N#:B^VLZW905..]32O&2.N\Q(#8$"B=:.S6Z579*736^9G8$;`&V;O8&= XM;=FA79*IB0M^_=F"G=F&C=4"C<^*O1&JP'B7#=G#9=;/.H&AS=D5F-N@O=N^ XM?8&\7=E[/8*M88(.(-Q[JH*CS:LVBJZ(+1ELH)L]]-6`M@6Z7-N2W6"4G8#` XML`4?6-W?'6#>?=?@3=[B'=[=C=[CO8+C7=JGS=WCG=KPO=K.G=4J_-H'``6R XMS=VT[9FWW8%L'>!O+>#A7>`=2=PE&)+'#8(I"+]]=]7UW=KV&]W\Z@K[+0,; XM,`L*6,\4Y]^3G=82@.$:_H$B_M8E3N(9;N(ICN(C?M<G[N(K?N`K:MHA^=<O XM+M\E3M\=_MS_\-H%H()?W=UC+;^1/8NOM]U"_M9)_H%+?M=-WL=Z[>11#N5L XMW>3N7>-4OF+RG>0Z#G@\[N,N#`P.`N77[>':/8&9N=YISN1JGMY2SN9P_N8R XM/G[%K>!0'MBVJH)IWN4O:-\W3.$$P`D7GN)#WI^V/=F9&.*$KN(:SM8E[NB+ XMSN)``.F-SNB3;NG3J*)TC@HF*("*7NEX?EOR@("/ON$/WMP[[N>W!01U[`S[ XM7>:'KMVA>9JT7IJB"=6KV9JV^II\_I+<C,^44,>J3-2AK<X`#7BQ?N1I7>R: XMS>RZW9[/SIV5+>W.WMO0;NVPJNFM1>,I->WTEMK,WNND_-H"(.C$#NO9?>2A XMN0TTP.[NWN[P[NZX'I*LN0U4O0'BSN/!OA0BL-_7:=W]G>R?!>+_'MYA;?!J XM7O#F??`+G_#JZ?`,?^7=GH`,+]__GN^J+AFO'0!JL-]AC>Y&_EEHSO"$7==J XM3O)M;?(J?]<1K^TD:-PEG]R$C?$2OL@4#@#((-O^G-!DW>$"?W[;:JW<*O1$ XMCZU%[ZTFR`#A:JOCVEO*:JZR&>&_;K]^X*[P*J\)0='VBJ\*H*_\ZJ\O4P^* XM8`\(8`_`<`]X@`\:@`_2D`]TH`\LH`_DL`^&P`]4P`_.T`^&X`]JAPO_H`4\ XM[=.'`-2N@B[I!`W%.EW^;-5$[NNXNZZ_G$[*4*PL0-B%?MA^_ER0.0",0/FJ XMW=_MK/EU[`2)/]L<[N69+QF1/P`"V+\$6/GS#?JI;W@"0`VES]^GW^<U;WCG XM8ZB8X/F?ON'KC/F[?YN0*0!:+,VOG^5E'OJ2<?PVY?HZ2#ID+OO%_UR1'P#@ XM4*R+%_R7S]I3OZZ5&P"@4*PHT,?6'_Z\'[0!<)/2'UC0ZNW-/_N0&0#G__[L XM*#=+-O_7+QD$[0[`[^*EO\?'^R`3`(`%M^_C#<#Z!?G2!1TH?3L/ZO4\U-?_ XM>M]#NWH3K:)Q/:^7T5X&/]`46(`?6`)^0`WZ`03H!TZ@'RB"?H`,_($!\`=" XMP!\(`G_`"_R!/J!6A^0?N(+`ESWR"!KA#&9DT9"C0R`RC(G4@`X]$"KP+'\" XMDXK+(6`0(H-(J"R^4JP&BZ8I:D>K\5&IR<8!FIH7?&HN3S71.]JRZZK:T4)U XM%%#]W:;HDC2F"_[#-$**:XFO1U6/T!E],4KY:,I\/TQEYJ;3%2I5\(G,Y")` XM.*J>$2'458:0:Q5"I@.J$N&="H1_9A`J0D3("'-5V4DR<PX0A21!=`@OH3:R XM58AH$GK"5G3J`E7J.T>2IC?QH+4%".>@*"I.I4A)X<'E5'"@V/!S25N0%OU! XM4?B=V`U[*DF_T#UUPEX(#/O4N3&&OA`9%D-+2`SED\M;,X$H&(8ZA!,,:9X: XM#%`A9^2\P784!Q^A*PQ*D*J(+:D\6`MI6RZ<3IR*%XHN2?@(P5`E'(;K4%6] XM0W4XN.0A.PQ@[O`>GK-\.-S2SMHQ09>+&<;#/86KX.'@LH8$$#+9M,2S>+9A XMD/I-K=!E+:@C%0OGRSBDA7ZJ]V`S[57!5H^S$DA6:DP]G[J$#X^7\B&)^]`D XMCD216'T,8IPZB2P1+J5$9`9^8F+X>8;?"EK91,+$$A&3WWE*C,GY%2H`$("* XME0&Z@KCO%O+!G\?/0!"`&W!0T<`]Q7Y(YQ(<B5AP=2;/.;ASE>HJ8`V*(HQ- XMS%4:'>2;%E5$E%I&"A:&+HLX"RG56-J(<<PC]D$K9)CTD$!D0VSI+IXAN^@2 XMP5A>[(M=B2_2P[WX%P>C7Y2)#RD/C:'Y%`W[E%*Z/?A)+_I%G\B?@*(-PX:8 XM2!5VPP#V#1D4DGI0DRJ8Z:,]2''.(5WL4\Q(,E8D1U@22Y@^3(RWB#7.1)4D XM&V&C-'J-WBDVSL-VN(RH#&/<A#3J$]Z9X$@*N6(:3(C8,!TEJLUXSCHC15R+ XM=Q!"B<;5>-U,XT`*CJIJ&0)&DB0,#>-JS([=D3=")%8%F+XC>>1*W)$J?B2` XMB!T)8G!$B`PP6-4D]Z?\=-!#-(MR4"+2P08E#MOB=!Q+3&F,4;`RIGJL8TAT XMC((),>9&O)B6$&084Y!PRB\V2-4((`NC>%2,$W([SJ4,Z1TK9%["B2;(3K5& XM##F8;%5A<I!DB3+Z%LLH%"53`J!,VQ``7":D6!T_HJRS=;6.ULT[V:+K;@NO XM8VZFL`+FIHW`F[9A662%^1$M3D2U:`<OHEM<-\;NJ'6FGT>=*"24#(\C<AV2 XMJ@YY)>WAEKR06A)+SL8PZ27%I&U,3]F.KT%#X(@,:]5P;)/TK!02OVNH=D#. XM@"I0S%'@.$<FV1^EHRJJD7,10\&H0=FG5)6A/(]RZ5#"J-34HD+2BRJ4>VI& XMH48@.2>1XX[J43_*(>XD_.@-]>,K#(>@$17]QXRHS'+?E$QWOT9$CLGOHZ?& XMU)JRDLGG56K(6%FF8&4RJY6S\E:J*EJY*W5E)B0_(=)5"A>>B"#_%*4$?Y9R XM*!ZJY0@1DV00^I1UL$^&1E44)2?@/Z*2Z1!,IC,SN2#]S)?,DMOR57'+"#EE XMQ*6Y1)2F*DV.H'\8D@*BAG23=H=6Q4GCJ/OHY$(<5L7J6%W!"'CLKB6J!'I# XMS^@)S*`W,+M5&,R)2F]:B2MRQ?/08+VTE.S*ZD4TK$>OMMY%^WH:+6`-K()U XML!+6PFI8#RMB3:R*=;$RUL;J6!]+4?B!20-!?"`X`8+>1`@FET.01XK@>CF" XM`$`;Z@J725R8(,9Q@E$0`*BL!,"RA-D'XV=;C'-AP7[)R])8?&A?[VOQ94%V XMEO'NUT>`6D83BP&`JI4T@Q@K8SE?3`\*/Z9)REA8F(-=:TN>O:W<US0W62G; XM"'DK:^:QK5G,S-DQ:X:ZK&W*,K,9SX;,8V.;I*QR.9%]IHZZ9CF39]0F;)9# XMP,GCWAG2E&;4;)&0QH56_*B84>E=<A-XU4W$R6T49T8</G!Q>_&X9V8S^J8; XM0UYP3'1636]F`,*71"1?AO-F)46RR>,(FD&#G(9L<NXR4N;0#$#^RIP@+'9^ XMS<09A\28\AJ09JQL=C+<^34E6.K49H%S@W4PX$DWA:<Q`YN]47?J37S&-V^9 XMW40%,XQQ5LT<ML-:SC`#`(5SG$TRSLEL/*<MI)U5TW&Z+K%8O=+FD'F?1VU[ XMVB_(1`"L&/5,?O33?W&NX=DYBV>`/)[9C$#*L=&YQKRG/%M+H1-Z\CAO9L?V XMF2U3GTKSD"G%@*8&;XL@6RSO2X/"S\J)<!K9/N.:&-1K7D_BJ7="&633GXNL XM>S+/ZPF>\F;T7`JGC'H.NQ1Z.$F82GJAI(R6Z3'3*<.`*(^+?`(@F)G/HPE` XM'00Y$V(^M!`92_%)0O\!Z8QF`31RH@)K1GJ>IP+=9@GQMGBS``#.J&?Z#*!/ XME("V3T1H0QLG$W.@0Z9:$CD8JL(,("[89_/3B?HMA"8!YR@ILYU1L[$\O1': XM026#0P,`$$VB93T->#$[X$;K:!\MI(VTDG;24MI*:VDO+:;-M)IVTW*:&E`4 XM<R!3[DPEF'&8X'(9@C;SF.3,)(A&"H#/%$=$D*((S<+'`;A:6!QS4K-?8K>0 XMEQ"ZH%/[@J%E1R8$J4;5G)[1HI>.+S[>L*TF0KQ:8\-K($^I)0009]<L7UZ+ XM:U,.L+&\;%I-M:G$2PA_S:[)-[D&'WM98EMLLFVTT;,-BNS^)653I\\.L\%3 XM:R=//=L\_6R?[9N^#-1FJP:;.BVG3O.U(8#81NQTYRZ5IOPLN"G4W_;L&JJU XM<ZBIR2HFA./&VQK<<A,T4:\K%M)_0.&&BK\3;]'TK!&\\V;>W!Q[4V\HM:0Z XM/),*W]1C7\-R+75/#;;8AU$AG$8-HQI/4>2WCQI2_YM3_*D$SKQ)1:"Z8B(J XMS&-P6A'WR4EDJ4QO"X4S`!;NJ^6X@.=.0=R+(W4Q#JNV.*UJZ22=5X5Q+4Z? XMVK@8A^-2'$!UFSX.R#U3+D=5>2F2RZ9/+LU5.;A*5^>J72VJ89#;@=,L-PW_ XMP4QEJS758293<YI3O\K9S`_5SU0&RJ;(4AMKFWNL<>[.R3FC:N?6G,S;<\=2 XMZN%4CMJCS-TS+74]%=%Q54IWZ20=:3VMF"ZUFE:\RM?^`:<+29ZNU/754>?] XM3!TR)66L+IVXNB#75A'JK,.1P%4:"%,1TB,EPX\,K$%RH^Z[`;!#`ZC\ZZTB XMU=M%NV8WGK`==;UVTM6Z3E>7NL).6[4#=S4TL][4IEI8RUTZ#:TW\MVIUWC7 XM[H9KO;MW9U66[3L!T.^HV\-#K\K.`J$\A:=?(9Y_17@`MN%Q5[VZ3RE>?.NG XM_36^NC9%P?$\'L!3K$QQY)V\";OR8IZ%37G;E+M*U!.$81M<6U.P$RY=Y#RB XMQB^EY&*-5@&38*K8@(GT0E+"]"0+TY@VS.2Z6:O>!9R8&=!B=CV,!O8@@-@C XM>V8/[:D]MN?VX)[<HWMV#^_I/;[G#_R>%E`4:,`?L-*7:4H532PU@O@B(>A, XMYD)*76D0;(+0()9*05I:QQ!?C%1\@O28FECG9P$'P.2+D;"/G"[`7B;ZTDGG XM@[.?3[&RV<U'^LZLZ6.G#U.98K\ZUOKJ(_R#?=6-_]%)VF?[_.SL7+.S#XG^ XM/CP;_!0MQ#Q^370L'EKF-V=]5IT5`-'/T.:_Z8)9]6RD9;#;+T9V/]#::5/7 XM<QE_Y2]&GC\1"FDK(/NCCP%T^86[5FN;ZJS],W_[C]?JJ*>9$``@I16`IK8" XM&D`$Z&@58+)=M)$/`#Q`/UMBK>5@];2J3V(JTHIIT78LQO2`(%`$DD`3B`)5 XM(`MT@3!0!M)`&X@#Y8`.5!1D@!60+$"P:+#!(5"E5.,`)!IMD++(+``(`3<K XM1IH"PE(%TIHQM6IH4`0H@2J@!&0`.(FP(&#API9D(G&%`,5EN!8WXF+<BSMQ XM-6['K;@<U^)2UJOH<2UN@\NE"DWA,ER'6W`O8V$%`8C*(<[(EKL$@$IZ@1D2 XM)AR`$E$2()A`P;VY-\4:@(-4(`A\C"#X+V+,$?U$`^9Q84#SHI)\@&;9W)2! XM<^.#S@TEL\3G,@&@:V*&;M$%$$?WL33=YE5SEP#7M;H[-^O^7*H;=+VNT46Z XM8U?JFEVVFW/3;L]=NS*@Z@I=HOMVQ:[$=;IR]^Q2@ZO+<T&`UCV[>_?K,H.P XM&P3B;MD5O(17[6Y=NEM2W"[8A;M_E^Q.W;Q[4P:OW36\>%?O6M[%BWD9+N!] XMO)37\V+=NSMY.6_7Y;N7U^^:7LT[=UTOVEV]H+?UBE[82WIE+V4*!'H)$9@@ XM&Q!X4V_D9;V(=_0RWK'K?IQ!\;6]JI?GXK']B`%R;_)-!>0E`)##2"C*5&[# XM!00M5R@.20]P6$N.?9RYEP7U0M_C:WTI;^*%-09&1=J?N`MUGV_5C;Z2]_HJ XM7EOC>#?O_66_A]?]CE[^FWGM;^<%P*&W[?)>`CQ[#7#=Q;T!V/:^WV=C8/IO XM[?V_GS<"[][]6X$+L/K%P!`X`;]>#AQ9+##DS<`BN/(NX`[<@#_P`4;!NE<! XMDV`I,':#[_!UP+>W\&I@&0Q_2W#F;;XX&/\2*4\)#A-"]=W!KS?[;M^_R4Z] XM+\N]+.)746P`6P"DP`#!3;_^]P6'X!@\@GLPWTE,!)+^_LL3$H01,!=6P1S8 XM!!M?&*Q_X:\:7K]L6`"OX#<,@G5P"I[`YJ;Q>N`L_(#M\!G&P[[W]/+A')Q_ XMY7`:WL,76`O[X39,@>FP(B[$$G@`Z^'9JY<P@0FB`64X#D?B.?R#;97_&L1" XM>/I"2P!PA._PT%7"&'%R.F'P"X537S_@!(HB`Q`!(*4O:2XH-L.,F!FLH"#0 XMY59QH`P`C"`3;^%<O(M]L0ONPY!X`_N88BQQ':XP7L2&>!ESMR!@C&^Q)E;& XM`((9KUQP<HP),?*-QMEX&E?C1(R,O_$F5KS:^/L^XV3,@\,QH*'&S9@;6^-A XM#(YUL3B.QWH)#Y@@'+".S3$VML?O>!6[GP#1C4.QW*2^[7<3H^(GB;T$9`)- XM/6,W_+KB=A5R3$&Q4@97>"MF5'B\C1<K%_"XR0?P-F/>(Y)7+DEN7B/YL93D XMAGN207)+3LE!8"6'9.`;!E\KB9``+EDE!P+W0UM5<3R6R!50!BB*"O!F16U. XM0K_]."'_8P2DX7IQ//[%4;<@X^)ZS)2!P#@^P?3X'$MC#7>5UW!67LH2@"L_ XM9:E\C=NQ/1;+'9DL?V6S7)6[,AQ>RUTX'*-E=:R6H;%6ELM6>2S/8[L,EN>R XMP[7!(8GXUF5V')?/<E[>QD!X,`]A)8F0D;`*7LBCTGDZ9(X8AC,O4*:3>D]1 XM3``A`*20LF)6RF8YL@1(I5L9F6X!KK^?V3'C8=$\B7]O4E;-HY<U.^)R#)H+ XMLVQ&Q%B9+X?FTNN:4[,IYKVWN07O9<*,AGU,<.[-P]D?[^9`3'MS,W%>S;S9 XMZ0)F$B&8DW-M+LX`XC@[W<2<G$5Q$2;%UWGO0N8_26.Z[T]NQ?TO,[\,75"% XMK_!K_LV*-[+(7T@DAGDI&?;-?S@VTV#<[)5ULVW>S\*9''OC\*R?9_.`ALW` XM&4`C9P$MA`ET@C;0#1I!QV<%+8@9]%2^R\S`!P=HYZR<_W,-?H:6."1A8OR< XMBS7T[W4_G]A"VUWOS*!*<7[&OIE!^V)$_#D!5_%E3I:P&'K08O=,HJER6+YT XM3KDC4\E@W*,Q=%4&,&ZY#C_GT7ND#S-=MLX2>BM?NB3]B#LT=C;,2%HOJVBX XM?*6;-)6FS5$:+V?IM`REX;.4'M-/>DO[YR[]H]'T7WZ&^C@D\>,BW9>G=#P> XMR/V818\B%WU]Q[.$@J!>%");9O2,F2GR`B"H1CDAB(*,?,B6JF3QQ1#W[TJ" XMICNI)36EOM26.E.;7DDP<B<JI?:PYGD;WVA!*QF>K`A1J[GV_/+H,OVB.?#1 XMG<^FN0&C9E:=BQ_+T870%_H?VVH*W9S[\Y)>P;>:/[_E-0V(@T"PWM"^VDH7 XMZV.]H#FT@W;5O/H]MVKXRZPKM+,.TWFX6M-D-2E\`[.TKM7&FE=S9S7-;/:D XML.#3<MA/ZZ=E9J,)=;(<D@C`#0`I);"JR;6RCLU?>.E69ED]AC\RG3;+N+HL XM%^:`S:7Q,,$FUJ/W8/]JQ:NP[S7O;=C/VL=`;&S]H=6D35XLW[H>,U];A3X4 XMLYX62NA:(<?H[1NJO^^HIK/]1Q8(J$*;J@.+`*C%6-A>1VQW#`2N6;XNS?O: XM-0_IC&VD$Y"@1M;#>F%+8P#SLYMULI[9`+EF`X&);:9I=M&VUD<;6UN@I]VK XM@[;#1L<^>VD+:R5]M8>VTF;:T]II:VU*#*?W,<\&RT1[;)]H6T60N_-!'L4A XM>_>J:S7%B]GU>7:Y_8`B#X!IFZ@%@!6NN3'[6C=MT@NK<S;@I9)LX&R;96VM XMN`LSX_[7CCM:0^XK_;AI=3VNW#(;6V-NP1VV22_8SL7:NA)?XL9-N<6U)\[3 XM;_L[QVT%/+>Y3,E^PG@[1P<``5"L<$%&EK$2,.$^9:9X6?XN+_`D3?=W_X/@ XM#;Q]=_$VO<*;>`]OX[V\D;<G$:O*.[556_G5KEWN/R`"VI9B:KUNRP%[K#<@ XM!=^`"X0#<D`.V(`Y\`;I@`^H`RS`#L#!.T`#\4`;T`,\4`]8P#V@!?H``O"# XM"0$"%,40,"4'((_4VWN+,Q-$`*>W@H??JJP'(`N*5?D[N&?P[T!J=\H#2F[( XMO>`6/(.#7`V^<3NUE;#@)S?-,CX)_I39+!>X1#:@-QD`!"0"RBX@B`+%<2-/ XM<+<:C"5N"P<J,B`",-Z5?,.70`[?X2B9X?;P'XYT>7C9)>(ZV>,.<1U>Q(.X XM$ECB0%R)'W$FGL1M^!0'XJDI3I.(ZFO%<3@5C\D[V5:Q`Q;NPF'XV$RY)?P4 XMV@-%X0"V;'791`9`[FJ&O^FH@\L,1Z@U7(A/<5MCQ+TX'W?B2_R/2W$_;F#Z XMN`^/`(*\BQ_R1*['"7ED,>0Y_(]G<1/$Q1OY(B_D8?RVL`,Y#@&8\+'SQ<[/ XM'ZQQ=+3"8R0\X.0QW*9R9'7,%*.N(H_D8'R07W)(CLAC^2NOY;2\BEMR6)[+ XM;?DNQ^7;FKAU:Q)A`60Y+\_DDL$=H/(S7J/3>`5D`(J"`5P1([G"$U`/-S-! XMFI6[T\YGS<NNF5G%%NB:1P%PWLV!RC>/Q^'<FX]S=%[.E\`YW\;IW)RO<WC> XMSM_Y]XWG[GR>?]])'I(P`#ZWYP[7_8SQ>AX%7C<=58BC7`&,\1A)##2R*K_C XM9^TCPV29_))-LBYGR1=])N=D7X[1.?I,3DT7FRAN].ULJWHR,Z?>SGS1X@"N XM9@%4.!GWXDU9O*YR9\P4N?D2]\L41`+<="?M<%_Z(<?I/CV'`W6=/L6'^DXG XMYT>=G2?U;<S/MWA0CP`X7:`_]9A^^D"Y&M=-4I::^W0SD\IUMY#>YL8\`K!F XM6C[6`?D4+^MA':W?<K7^R]GZ$S_K33RM-_&F;H3ENDZ6ZD1=GOODCAS*1_D! XM,`?%"AYL]8(NTR'ZLW+E;5T*D'7%;M:]^"-O[(?\L<OUQ4[9(7L.?^RI:9B; XMFLF.S/\!`,SK^=R@6V]HSJ_(06^R*:!=J`/IPKZ[W:F@2^U0W4[3\YWNIG,Z XM;>?IMKVHR_9[#MLK'5+7[;5]JN_VGM[;A_L+#X-HP`3EC.)>V]V/.A#N>UT= XMAW)P(#V+U6O/YC2=@F/J3;W=*5.EYNZ:VKM3:@_N`#YU4A7M;!8,;+#IEJ@# XM0!PONW/<A2)7GF/8)UL>?^N$_.CV<OUNV6LY?P_KNWJ_,W8`'ZX%O($/YBM* XMB]?U6Q[@._LFA^^=7+XWX91N*45Y'1/L,1(9<'+L_G#=J42WY#`@$LCR$#_B XM1;PB)_$GWL2#>!6/WP\+B^_A(1ZD=[H2SY,WO-WFZ[./1Z63EJ[5V_D+Y_"+ XME9LCZ3).SH<\4'GA1=XJ$WEV;N27`))G\DK^R.MSXM[DGSP]K_)3/J=C^55, XMUTDQ/K?RWQ>O8WGT?M5-2%9/U`!`L(/V'\_:O[I;1>PMGHC3\O]^R^G\+[?S XM<9Z)S_D!7^?Y_)UG[)G=!!7S/D_2;\MG[^%LOJI3>%+]#T@[`.`'Q:J!XV[C XM6-^U6^]VWLV;,B5OYJV\.SVG__28'GHS;^F=9GD>2L?Q%5`)9.\<R[UYK$:# XM!SH`'K`#>4``Y@$'H`<>H![8`'O``.X!"<`'/"`?^`"5M@\T`#^0`?V``?@# XM$O`/3("BD`'CJF624I@9`P@`+*&9"/R46H0K>S.S+$R8LCTS"!Z"<50`((&8 XMG:7&PO`!W&(U<`&W&:3TK=VM5O`-3N\W+@?_N/:^WD]<\@["M2+*;>:BVETS XM^M<&<SMSO>;<H!OI%FZJ#95)-QY>OEN[2B-MB`^TN?;$C\Y5V^)K;HSO\)4O XMQY_<#__C6VX,3?&-MM6^^,QY.B^,CL][2WZAIURH>XFFQ7/MH%LW][WQ)EO@ XMHVSU3'X-/N!F^3-XX:OMPSV&H_+(U]4LV.1K_,'-@)6^Q,?631]JGWRHG_2E XM_M+OW%$_XS]]IE_UM3Z8YOHFVNIO?:S?]57^L`#Z/=ATVZV8;Z[K.H*V^9X< XMC0=\O#TDIW![_OD@7Q(+_?HL3>_ST3?+S!GM-^*(__7)_N>NQX$_[W/BBC_V XMP?7AQ]")_^\7YI0/HD>WXC_$LQ=%LWTBW*)K_LA.Q2>=A,]]H9BC9?&.QON2 XMGTV_8R"_LR^_UP8&,UT>9^[!G8Z=L>NGV;#_2Q]HVG^/R?3L[]RU7_8C?!\= XMD+7T\._9Q=_W'W^T'6!B?SXVV[<_:>?^.\VV-S]CAMN>'P;(:(8L?+KH9)Z_ XM@QIO4V0+8)%C)$9V]TH5WKMYA/KA.SI%S^@5W?T[<8T^T>=__/_H-7G&UW^> XM#+\F_.B??4(9`$"4^7RVV.]'C/UHK%_1)_@99KI?A,;[X70+8%MF_$5M#R!N XM%P'^:`U@KL:688`3X-17`6:``AN;AM.9?=69`>BC176VBO/EL:5NG=_;]_EQ XM?XQ(H#;T!0(G&[:EGFUF!&#@1@%V;JS9WG>:*8#1GW;F]>U^/*#(9P)B:$+@ XM`I@$!H%&X/*WG+5F8E_A5Z(U@3O@%$CY<6LW&!/(G(UK'-K'1O.Y@-H?R5:> XMX7RP6Q2VGMU]!:`3^)_Y@/R:?9:X,8&/WS\6]@V!#F`1&`?N9G>@AT;X$8%3 XM8!YXI<V!2B"O)KJ):('@QJ:[6'_/DNJ6_6U_HQ*-=NKE?+$;&Q=P]6TPVP58 XMZ22`]AF1EOKA85Y:!WCU'8"^G2?8^)V`QITE6`I&?YV@\E<%DH*UG2G8"J*" XM;1IN]_S)::X@;H>GK8`RWY+T!?YF-A^@]OW19^&?4&2H(6HM6_ZSJ*%_F"!" XM->^!=\R@>!?>P0#?G3/8#$*#_)ZD!JJ1@:R8]6:J*0"HVAO'C@@`GMDF*(F] XM:C?;BA2KZ6Q`H#@(K$ENZB"TY@<N:^S@$8CT;6ZK(.07KKV#XV`\J`9>:;L: XM/K@.5FSKDF9W]D5__6`GMO;A@FT?>`8&,H*J2'BEZ/U_Z1F\)J\Y1/0:ZB</ XMAF;E(/C7!O9]_EH[*+'M@75@+N8/,FP@H08XL)6$(:#!AA(6;`G;2HBP/6PN XMH=`V2V1>>DE()P,L@(:@ZH,(@B*-&2_X`C:"V&`-Z&JE;"O;Z9<&UH/,G\U& XM?^AK#%_KYQ&*;2.AU\;PP8)I6U0(%<:$7=M5R/A)@<3?UX85(FU3VPQX`5:% XM-&'91@M2A5YAYE?](82<WYZV"&Y?M))!)Q3V6OV'WL:W%8,YR=]V%'J`G1LY XMN!3B;$WA&/8&/H6>VU>X\5F%A>%6R`=>;OH@4KBX-89\8<*'&-*#D2%C"!#Z XM0R$:];``:FN:'UMX_2F""^'V)4>)?I`@Z<=@T6XQDNWF[DUZ,ER\AU!=>IK> XM\18;9GHPP*:'Z7EZMR&H-QN*>I@>J9=8_#-R7VDX^V!O-]:VM;UM0*[>R_"] XMA6_C6_EVOJ5OZUO[]K[%;_-;_7:_Y6_[V_!F@]P_H]0/Y$]@>S*3N9=*X4PK XM!`312GV'`EP3)![*4@M<`Q<C/7"C1,[2&JY_9\TRB._=AQF7OI<?YGO\X;X7 XM!FU8Y1W(%<+]AB,<?;?HH6S_P`D74J1P/1ZB9\8E@V?-?0?%Q75]WD4W(5J( XM5QR%^.=AB%Y<%%<A<G07(AC7Y55R>1X0A]<YB-&=,];7L7%NG*;%CKAWRQP4 XM4\?%?D$>@2?9,7B8G(WHY^5YC!R/F"/BB#?B+]<C!G*8W(BH([Y\_\"#!U3$ XM=XX@::@BEGD-0"F'YIUR$%Y7YR1V>&\>@=?+;8G]'8<XRW6)(.(>%R82<M)9 XM&"00#GI"(ACG?BAS56+H9R"B>HL6:2?-N70$'83XK`AY45X^E^2)<WNB.M<G XMRG-_HIX(Y?&)@Z*?6"@"BOA8&*3@>7D$G4`FQOUSA-U#*-V5>0I=L=+0I7_S XMH3;G5K5_])]%Y]'=?Z`B_"<J?HHZF8P'6XUTG9U)1^950"N=",'CM7?5W$YG XM)]IWPMUO!]/A=K6B4J?;V8H_':Y8W/&*JAVP&-MQ>8HB)9<K(F:/8G&W*MI+ XMHQP"<.;AA29$K*C.68EOHJ:(Q]EU8V)DIR'F>6[=$M<MPG5>XF6W+7J+XR*X XM*"(6B_T<MH@D#G3B7(IXT#D:?AU@9\H-=K.B=@/GD8N5'6>G+ZYU.R*^V-\% XMB=PBH&<F"GJ<W9I(+V*#HYV`8MH92:C=;5<O'CFOW6TG+(:"LQUPYRM*C+KB XMK1C<,7<7H\4X,1IWJ4ER%Y(L=Q@CLGA;/'<<X[)8X5%W7P45%B-==VV>M5@? XM=G?0(,T8#=:,S^#-R*G]A\:->7=;Z#DJ(Z.GWGT5[!VT"".VB9?,C%CI'3D2 XMHIB(YQ&)3Z/3V"]*C0<>@1<UYG=3(]98)K96BR*)"#4R=@+=,C<:5HM/8O]C XMX:43&!Z:I^%!>`_C9]'^P7@O'GP7-RZ)<Z.+5^+=C2E>B6<JWF0T7DEGXTF* XM9>.BI>,-`*^BT5C-C7DQ8W9'PWUY61[C&"B">51>G@@Y:GF28^/HXUF.6]ZA XMZ.1E>2.BXTC]:7*,8]"(LIV-`<"SZ`V2"&J>@]@V)@3W8H:XY[V._=W5>,C) XMCG)>[)@USHX"8VMU)H9U_)W!N.9%BO[?I/C,I0N07HPDZ<6'P.%#YQJ*5+CA XM;-@\UH:R(?1(&]J&SB/SQAO.AK[A(!4<!HX0DZI7'&IOC)2WY4C!>K(>K6?K XMX7JZ'J_GZP%[PAZQ9^PA>\H>L^?L%5N7@])0(,`07X#P8#"(6'(`'!"OJ`J" XM@"<00E`!<@`,\#\"`,V`+Q!"2`Z`@!E@`(0L"``)(`=(%8&``QFR[`"\@!P` XM`AR0FP`Z\%R(`G(`$!"O6)`X!`(@`L`#<@`4<$`*`EB`'``&C)`/9`EY0CX7 XM?@`#P'D<0*K".Z`#A!`H@`VI$#20,>1&$/?XD`D!)*`J,`)D`!$)`(`"JD(O XMH./]`TJ`$@D,D)`;P0U`"BB1T("J<`F(`$HD.$!%(@!6I!()#VB1"L!S<6JD XM"P)`HZ`IW"J1PJ10*5P*^,!KL!`@$?Q`_1@Q6!`?P0"`"^B/!X/U("RH`+7! XM4R`T!0"A`1S@)\Q2T<+^,``<`QH$!0`'2`#BP78@!(``0$`+@`1,!J,"`A`) XM(`/I@B$@'4P&(8#Y\*\0`)\D/P`"V`:=14,Q&0@!3(0I(4JRDB)$*1D#\`$" XM`#1`'<B2?$``P`5\<*+D+&E"X`U^),8F2L(`3(0#P#.4DL0D=>`]E))JA+0P XM`-`#&L0Z(4JBD2```M`H+`1M)*7`&O`#<J1"<#E8`('D4=``"`_>P;V``&22 XM-42Z<%F4$@P`$P%%0`#H)$,(`,@!`P"PD"_\$K%`47%.>FJEA'6P'2`!=^0_ XMR5V@D=>D0I!-PI&O`0$@&=21P63($4X2`!L`.9DX]!'J@P'Q.KP/\0J)0`$, XM$1!%!$$=G`L;9521.F``%B7T$`QDE`G!1EE*$!%7@D<)`9P+&(`'<4>$$#1$ XM`/!!8`!5Q2:9+G@"CV0D.3`(`<@!"*``9)(Z94+@2982)``DP%%N!-#`=.`` XMU``D@RNY$<P33251!%6*$#7`=&`!4`=99=+`2VX$)8`5,1#P$#4`$P$!`),- XM1&8``Z@!5@+/L%8JDST$6ZD`>`]OY?>`1QX%F@-?8"U@"]K"1ND]+@759*.@ XM4$X&!R5K0`\DE%@%V]%0@I/!`0$@0^B5`0.VX!WTE./!3QE4#I4=0<25+L`# XM0@!;B0!TEEBE4VDE=)4*P+;@:8@0PX0(``"8`XD`"!``I!<=Q9,0&K`'U(!W XM("5\#?D""=`<K!/T%0`@#K26X0'^$%4X`;H``&`*>`?I@@O@`@@"DB0E20(@ XM`J,"!.`"*`+_9%$I(RV70L`I\`)(`-L!'F`P*`?`@"3@7CR42X!$60(H`0-! XM#2`KO).7`T<A"+R5#@!=R58R`/*E"%%?VI72`@$@!V@07!PU:4W"!HEE8>E: XM))0\0))(`B"5?00((`!,`8*`B$`B4`+DA00`#B`"BL4_H"L@"PF``(`+*`M+ XM`<E@80(#X0`B8`,(39F!W0`$(`%`0(5Y87X+&B:'J6("`RBF$``$X``D)@(B XM8Z*8X``2\&)BF"VFK?!BA@-(0(P)!.@`-:8$L&.RF!NFC^EA`@)#`"`@,A0! XM9<9S808(E@4F.W!06@I6`'3P+1``F(`(@`6``"0E`%`.!`+10#``!@@`+P`( XM$`7D-/R`$Q`)M)%!0*60%\R9=&:=:6?>F7AFGJEG[IE\IEI``DP!;T`=(`>, XM`66`#@`"O`!T0!L`![P`;<`9(`?,`8/F"P!IC@$OP!L@!D@%=,`+(`4,`4V# XM&)`&))IA`!S@`J`!+(`=``*0`"2`%%`&V`%IP!R0!KP!;H"A20.X`#>AE+`0 XM$`%%@!!0!1P!`,`+0`:LFB^`&'`'T`%WP!N`$-0!<T`8<`84FB!`"3`'@`!M XM0!K@!GP!KJ8>4`9`FV$`'D!MI@'6)@@P!@2:;@`=4%HJ!']FH#EH%IH)0;DI XM:!*:AB:BJ6@RFH[FI"EI1IJ6)J:I:7*:P>:GV0:$FJ-FJ7EJIIJK9JOY:L:: XM(,"L66NV!`5`PED`*``,IP+P`#R<#\%"$`!(G!+G`W``+``#0`-0`/`/#H`! XMH``(`-*<1N`&O`$@P*3Y!>R;<``+4'*6`70`'2!MG@$@P!L`!S2;9$`+X`.4 XM`&1`:2ES]@`XI\HY!["<+J<;`'.:G"BGS>D$%%Q,0&DY!$@%<("A>0=,("`` XM"H!SI@!*)]-I:*(!4*?42090G0#`TID&-)T@@+9)!LP!=$#6.756G5^GH9D' XM?`%C9]D)`T2=9V?7:76&G=3FH&EV;IUH)]BY=DZ:=R?7Z76"G7=`&O!K@@!T XMP!M`<GJ:,*<9\`9HD),FW%ESWIQXI]R9=BX1:<`9@`80GH8G"(!XB@J+9\DY XM:#J>-F?<^7<ZG8+GM5EX'IZ5)^>I0;:=)V>H"7I"GG[GW(D&5)Z7Y^FI>::> XMBN?J27:VGC.GUAEZ1IZC)^5I><:<&F3@.7A6<#&`X\D"Q)U)@!M@!X0!4@$9 XM``*0`6F`'%`&C`$N)ZQI:,(`>$`)@`>4ENKFN=EN)IJ+9J/Y:$::\F:]^6G> XMFYVFOLEODIJF)JJI:K*:KJ;V67#2FJ?F4Q!@@`"@`!@`#K`44`#B`PO``?`` XM`H`((`$&"BJ`!J`#&``F@`5@`S@`+I#V$`"$`!%`#)``I``90`Y0`)0`%4`- XMT`"T`!U`#S``C``3P`RP`*P`&\`.<`"<`!?`*?`"?``_(``(`D*`,"`"B`)B XM@#@@`4@"4H`T(`/(`G*`/*``*`)*@#*@`J@":H`ZH`%H`EJ`-J`#Z`)Z@#Y@ XM`!@"1H`Q8`*8`F:`.6`!6`)6@#5@`]@"=H`]X``X`DZ`,S`CN`'N@`?@"7@! XMWH`/X`OX`?Y``!`(!`'!0`@0"H0!X4`$$`E$`=%`#!`+Q`'Q0`*0""0!R4`* XMD`JD`>E`!I`)9`'90`Z0"^0!^4`!4`@4`<5`"5`*E`'E0`50"50!U4`-4`O4 XM`?5``]`(-`'-0`O0"K0![4`'T`ET`=U`#]`+]`']P``P"`P!P\`(,`J,`>/` XM!#`)3`'3P`PP"\P!\\`"L`@L`<O`"K`*K`'KP`:P"6P!V\`.L`OL`?O``7`( XM'`''P`EP"IP!Y\`%<`E<`=?`#7`+W`'WP`/P"#P!S\`+\`J\`>_`!_`)?`'? XMP`_P"_P!_X"G20=\`3)G&1!K2IUS`-<9'0@!20`5,`7L,=VG><`$/`%'`#_J XMCP*DWJ>AV034%@BI0,J0<I_>9VD9'3P!+L`2X`*</]TG&X`'4)V.9]A)<[X. XM\BC;60:0G7+`&Y`'Z`"E94@Z!EB?-$&A*9&"`$,`2SH22)\])\Y)<RZ?.2<` XM$))"GVS`&S`&H*0ZZ:?Y!?"D/BD*D`(8FF(`N#D3R`%Y``@`?5:>;D`;8(_2 X?`2!`&2`'E*1RP$L:DY8!+2E-2@;@I#>I3:IU<IT)`0%Y X` Xend END_OF_FILE if test 22451 -ne `wc -c <'rops.Z.uue'`; then echo shar: \"'rops.Z.uue'\" unpacked with wrong size! fi # end of 'rops.Z.uue' fi echo shar: End of shell archive. exit 0 -- John Bly Milton IV, jbm@uncle.UUCP, n8emr!uncle!jbm@osu-cis.cis.ohio-state.edu (614) h:252-8544, w:785-1110; N8KSN, AMPR: 44.70.0.52; Don't FLAME, inform! -- David H. Brierley Home: dave@galaxia.newport.ri.us; Work: dhb@quahog.ssd.ray.com Send comp.sources.3b1 submissions to comp-sources-3b1@galaxia.newport.ri.us %% Can I be excused, my brain is full. **