page@swan.ulowell.edu (Bob Page) (03/09/89)
Submitted-by: migh@cuuxb.ATT.COM (Mike Hall) Posting-number: Volume 89, Issue 39 Archive-name: fun/pz.1 [I put the small executable and the 15 tile images in a zoo, uuencoded it and kept it with this posting. ..Bob] # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # ReadMe.Pz15 # Compile.it # imgs.c # pz.c # bin.zuu # This archive created: Wed Mar 8 15:20:11 1989 cat << \SHAR_EOF > ReadMe.Pz15 Pz15 - the "15" puzzle Do you remember those cheap plastic puzzles with 15 white tiles numbered 1 through 15 and an empty square in a 4 by 4 arrangement? You know, at the check out racks in K-Mart or the local grocery? The ones that you'd pry up a tile in the center, and then rearrange them all to make it look like you solved it? Just to get your sister mad? Well, here it is again! To move the tiles around, just click on the tile that you want to move (pretend the mouse pointer is your finger - except you don't have to actually slide anything around). You can even click at the end of a row or column of tiles and move all three over to fill in the empty square. To quit the game, use the close gadget, or send it a ^C (from the parent CLI window, or with the 'break' command). It's not a smart puzzle - it doesn't detect when you're done (besides, there's different ways of solving it). For those adventurous folks, some enhancements might include a gadget to reshuffle the tiles, or animate the tiles sliding around, or allow the puzzle to be resized. The source for it is in "pz.c", and the tile images are in "imgs.c". The source is pretty grody looking in places - lots of "unsigned shorts". I'd love to hear of more tricks to get it even smaller yet. It was just 4088 bytes with Lattice 4.0, now with 5.0 its 2808 bytes! Have fun! Mike Hall 2 S 461 Cherice Dr. Warrenville, IL 60555 312-393-6350 att!cuuxb!migh SHAR_EOF cat << \SHAR_EOF > Compile.it lc -ad -M imgs lc -w -v -Lcdn -M pz imgs rename pz Pz15 SHAR_EOF cat << \SHAR_EOF > imgs.c /* * image data for the puzzle tiles (empty, numbers 1 thru 15) */ unsigned short id0[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc000,0x0006, 0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,0xc000,0x0006, 0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; unsigned short id1[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc001,0xc006, 0xc003,0xc006,0xc007,0xc006,0xc001,0xc006,0xc001,0xc006, 0xc001,0xc006,0xc007,0xf006,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; unsigned short id2[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xe006, 0xc00e,0x7006,0xc000,0x7006,0xc001,0xc006,0xc007,0x8006, 0xc00e,0x0006,0xc00f,0xf006,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; unsigned short id3[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xe006, 0xc00e,0x7006,0xc000,0x7006,0xc001,0xe006,0xc000,0x7006, 0xc00e,0x7006,0xc007,0xe006,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; unsigned short id4[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc003,0xe006, 0xc007,0xe006,0xc00e,0xe006,0xc01c,0xe006,0xc01f,0xf806, 0xc000,0xe006,0xc000,0xe006,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; unsigned short id5[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc00f,0xf006, 0xc00e,0x0006,0xc00f,0xe006,0xc000,0x7006,0xc000,0x3006, 0xc00e,0x7006,0xc007,0xe006,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; unsigned short id6[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xc006, 0xc00e,0x0006,0xc01c,0x0006,0xc01f,0xc006,0xc01c,0xe006, 0xc01c,0xe006,0xc00f,0xc006,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; unsigned short id7[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc01f,0xe006, 0xc018,0xe006,0xc000,0xe006,0xc001,0xc006,0xc003,0x8006, 0xc003,0x8006,0xc003,0x8006,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; unsigned short id8[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xe006, 0xc00e,0x7006,0xc00e,0x7006,0xc007,0xe006,0xc00e,0x7006, 0xc00e,0x7006,0xc007,0xe006,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; unsigned short id9[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc00f,0xc006, 0xc01c,0xe006,0xc01c,0xe006,0xc00f,0xe006,0xc000,0xe006, 0xc001,0xc006,0xc007,0x8006,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; unsigned short id10[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x7e06, 0xc0f0,0xe706,0xc1f0,0xe706,0xc070,0xe706,0xc070,0xe706, 0xc070,0xe706,0xc1fc,0x7e06,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; unsigned short id11[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc038,0x1c06, 0xc078,0x3c06,0xc0f8,0x7c06,0xc038,0x1c06,0xc038,0x1c06, 0xc038,0x1c06,0xc0fe,0x7f06,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; unsigned short id12[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x7e06, 0xc0f0,0xe706,0xc1f0,0x0706,0xc070,0x1c06,0xc070,0x7806, 0xc070,0xe006,0xc1fc,0xff06,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; unsigned short id13[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x7e06, 0xc0f0,0xe706,0xc1f0,0x0706,0xc070,0x1e06,0xc070,0x0706, 0xc070,0xe706,0xc1fc,0x7e06,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; unsigned short id14[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x3e06, 0xc0f0,0x7e06,0xc1f0,0xee06,0xc071,0xce06,0xc071,0xff86, 0xc070,0x0e06,0xc1fc,0x0e06,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; unsigned short id15[]={ /*-------------- plane 0 ---------------*/ 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0xff06, 0xc0f0,0xe006,0xc1f0,0xfe06,0xc070,0x0706,0xc070,0x0306, 0xc070,0xe706,0xc1fc,0x7e06,0xc000,0x0006,0xc000,0x0006, 0xffff,0xfffe, }; SHAR_EOF cat << \SHAR_EOF > pz.c /* * 15 puzzle */ #include <intuition/intuition.h> #include <libraries/dos.h> /* just for SIGBREAKF_CTRL_C */ #include <proto/intuition.h> #include <proto/exec.h> extern struct IntuitionBase *IntuitionBase; extern struct GfxBase *GfxBase; #define NPZ 4 /* the square puzzle is NPZ x NPZ */ #define PZ_MT 0 /* the value of the "empty" tile */ char pz[NPZ][NPZ]; /* the puzzle array */ int mtr, mtc; /* location of the "empty" tile */ #define R0 11 /* origin row/col of upper left */ #define C0 4 #define RS (IMG_HT+1) /* row/col scaling factors (match images!!) */ #define CS (IMG_WID+3) #define IMG_WID 0x1f /* from the output of 'brush' */ #define IMG_HT 0xd struct Image img = { /* shared Image struct for all "tiles" */ 0,0, IMG_WID,IMG_HT, 1, NULL, 1,0, NULL }; /* the image data (in chip ram!) */ extern short id0[], id1[], id2[], id3[], id4[], id5[], id6[], id7[], id8[], id9[], id10[], id11[], id12[], id13[], id14[], id15[]; short *imgs[] = { /* array of pointers to the image data arrays */ id0, id1, id2, id3, id4, id5, id6, id7, id8, id9, id10, id11, id12, id13, id14, id15 }; #define W_WID 141 #define W_HT 68 struct NewWindow newin = { 100,50, W_WID,W_HT, 2,-1, MOUSEBUTTONS | CLOSEWINDOW | REFRESHWINDOW, WINDOWDEPTH | WINDOWCLOSE | WINDOWDRAG | SIMPLE_REFRESH, NULL, NULL, "Pz15", NULL, NULL, 0,0, 0,0, WBENCHSCREEN }; struct Window *win = NULL; struct RastPort *rp = NULL; /* Lattice likes prototypes: */ void putpiece(unsigned short, unsigned short, unsigned short); void refrow(unsigned short), refcol(unsigned short); short pzmove(unsigned short, unsigned short); void byewin(long); /* * Repaint a single tile. */ void putpiece(r, c, v) register unsigned short r, c, v; { img.ImageData = imgs[v]; DrawImage(rp, &img, (long) c*CS+C0, (long) r*RS+R0); } /* * Repaint a specified row. */ void refrow(r) register unsigned short r; { register unsigned short c; for ( c = 0; c < NPZ; c++ ) putpiece(r, c, (unsigned short)pz[r][c]); } /* * Repaint a specified column. */ void refcol(c) register unsigned short c; { register unsigned short r; for ( r = 0; r < NPZ; r++ ) putpiece(r, c, (unsigned short) pz[r][c]); } /* * Move the "empty" tile (MT) to the "moused" row and column. */ short pzmove(mr, mc) unsigned short mr, mc; { register unsigned short r, c; /* row/col counters */ register short ir, ic; /* row/col increments */ if ( mtr == mr ) /* Are we in the same row as MT? */ ir = 0; /* yes, row-inc is zero */ else ir = (mtr < mr) ? 1 : -1; /* yes, row-inc is +/-1 */ if ( mtc == mc ) /* Are we in the same col as MT? */ ic = 0; /* yes, col-inc is zero */ else ic = (mtc < mc) ? 1 : -1; /* yes, col-inc is +/-1 */ if ( ir == 0 && ic == 0 ) /* If in same row and col as MT... */ return 0; /* ... nothing to do */ if ( ir != 0 && ic != 0 ) /* If not in either row or col as MT... */ return -1; /* ... too much to do */ /* "double-loop", but really only r _or_ c gets changed */ for ( r = mtr, c = mtc; ; r += ir, c += ic ) { /* start at MT */ pz[r][c] = pz[r+ir][c+ic]; /* shift pieces towards MT */ if ( r == mr && c == mc ) /* until we hit the 'moused' position */ break; } pz[mr][mc] = PZ_MT; /* mark the new empty square */ mtr = mr; mtc = mc; if ( ir == 0 ) /* update the display */ refrow(mr); /* either change a row */ else refcol(mc); /* or a column */ return 1; /* say there was just enough to do */ } /* * Refresh the entire puzzle. */ void pzref() { register unsigned short r; for ( r = 0; r < NPZ; r++ ) refrow(r); } /* * Setup the puzzle array. */ void pzinit() { register unsigned short r, c, i; i = 0; for ( r = 0; r < NPZ; r++ ) for ( c = 0; c < NPZ; c++ ) pz[c][r] = i++; /* scramble a little */ } /* * Get mouse clicks and handle them. */ void dopuz() { register struct IntuiMessage *msg; register unsigned short r, c; unsigned long class; unsigned short code; long flags, ret; flags = (1L << win->UserPort->mp_SigBit) | SIGBREAKF_CTRL_C; /* loop, get mouse clicks, call pzmove() with reduced coords */ for ( ; ; ) { ret = Wait ( flags ); while ( msg = (struct IntuiMessage *)GetMsg(win->UserPort) ) { class = msg->Class; code = msg->Code; r = (msg->MouseY - R0) / RS; c = (msg->MouseX - C0) / CS; ReplyMsg((struct Message *)msg); if ( class == MOUSEBUTTONS && code == SELECTDOWN ) { (void)pzmove(r, c); } else if ( class == REFRESHWINDOW ) { pzref(); } else if ( class == CLOSEWINDOW ) { return; } } if ( ret & SIGBREAKF_CTRL_C ) { return; } } } /* * Shut the window; put back the things we borrowed. */ void byewin(r) long r; { if ( win ) CloseWindow(win); if ( GfxBase ) CloseLibrary(GfxBase); if ( IntuitionBase ) CloseLibrary(IntuitionBase); _exit(r); } /* * Open some libraries and a window. */ void mkwin() { if ( (IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0L)) == NULL ) byewin(-100L); if ( (GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L)) == NULL ) byewin(-101L); if ( (win = (struct Window *)OpenWindow(&newin)) == NULL ) byewin(-102L); rp = win->RPort; } /* * FINALLY, here's where it all starts. */ void _main() { mkwin(); /* open up our window */ pzinit(); /* initialize the puzzle */ pzref(); /* and show it */ dopuz(); /* play it, until we close or get a ^C */ byewin(0L); /* then close the window and exit */ } SHAR_EOF cat << \SHAR_EOF > bin.zuu begin 644 bin.zoo M6D]/(#(N,#`@07)C:&EV92X:``#<I\3]*@```-;___\"``$````````!W*?$. M_0(!.`@``'$````P$E">WC#X"@``QP<```$```````````!0>C$U````````P M````"@`07^\`````I`%`````0"DC*````0`8,$^@08$"#AH,(##`)2```F01] M."!=PTLDD)``D"3?P2,>!_*3`P`$#X-:P`@P$2P*LG_\6.`!0""%$P(T4CPA= MP$,(*P(X3+@)0`$.`!$G`<``X,25/V<IU@#`1`"&DE4`6)T1"`?$`TBO:!H`I M9!!0"B`$`(2)Z`*$5%;1D,45@08`A&G)\((00%)"AA1)"!"!%D@*("%G#`L`( M\L_?)V!5#M]!4%+`%$#4`GV0)1`$@"F"7/ZS]X%72<^@/\3R[#F*LG_X1#QY! MD0",0#Q1`>A("^>/X6@_U0H4%F0=`"Y-_0$J?CPYH[-`7P`@`02$BNEG)+!@P M4P`,""`B4`A,$:1JTW^"1%P'<48#B:0#VIT7!QW(&07E$'T_49<R*1!L1(<`D M$FP,P`\(=9&00ET$".:$+@/@\^``W!@%!@$@2$>`=""P0``*9V`(A!.0/,B3Z M3#2)P!T8R8DQH3-*_(1#>R)X:!\!YW&#(HZN_,.'BD`E9P@('[@0(`].U`$'D M&6#0,H0^=AG55#_8G-7=&>PD2<8;<QB9AAARA"%''DQ5`1L2YQP`@`_2<<"#2 M=![HP*%1,!10SG+L`$!!"G!0!H`"=!H@AP@F4H`%("3)<,`+$#$`AP,F$B#'K M`H0!"(`C0^0)`*-V90@``R)(!\%V!6!QGB-,?`,`.$YTD22:`ZPI'0-\```'Y M`;P`088(B1Y03B!!L$,`$M$$`XTQ$$"`!"`_`/"#`3\<L-8_<'#QA!1&@(%-1 MJ@``\^HYL;+Y::VWYKIKH@;\&NRPQ4)S3+++-AOML]/B8"VVVG+K;1U.F(D/Y MFM+!T`(`",C@(1:R`&$&`7H```8#"9-!`!P!J`3'/]<)_"<-'FI!B\($S/3P) MQQ)3;/$_XBE1A!D**$&$&098*)`@*I^!@,LA7@P&'2X$P((`=/J*Y[`B(#$-- M,-(8`T(!T!R1*`"_%@L"`=`8`0TP$D#B2QL$P\P+UPJ<88`W17!#!!C*T#DPR M`G>N2RPP&BMPM1`0R+!V#N5AD0-:6JC,\@\!K.6/-%0\`08"S4X+0.$4<TM/M MJTF^<(`?MA+@BZX,1"LX*X5+<008[KCPP;=J-DSYK9>300*YN.J*`;KJ"DNLU ML<<L#0$@4A2!KSB>@V$-MZSR:Z8Z:#X@@8H`*`)"&@!8810$XCT@1P#AA`)`D M$!``L$(0_[@#0@O=[YB<,"LPI@[RRC-OA?A.,6)"=0N<@84**^B)0_T8P%$/F M-%(5#4P@_`"``UR@E/J!(`M`0,+_`EBCHRQ!2'W2!2#,(`$XH`$7"LL<M*0%^ M`']0`0N&0\6M)`BS:7$`#)Q@0"$0`@`S4`(,"D#`P`CP#W9LY1]Z2!42X`&Y5 M.J`I``)PP:QBE+PS,,!2BB"5J7J$BQ@5@`M&5-$3V></,3@1"U'D#A:H*`;)\ M/0@`D@!AJH``B,@Y(%-@-`K[J&0E+"AA@@/"PS\X$09+@!"-I%#C3'C$1B`\> M\8TL0X(<-S$M/(`P6`#0@A+/DQ.(*`*0"A#D/S0Q+2V`$(D+`H`,+L6"+R0I> M#)(0G!8$QP/!*4((IYB6#4"8I%;Z,$VRL@L/6!`A)1AA#6T1E`&"$8QU<4$'? M,*",$@IP!@P@H```$``%0;#+7@J+"R\(I@"^:,DG3"%;S@#!`10HG0?M`QEB? M5%7P%$).`*!)DR;@#A-`$#\+D&`*=*H?`D2P!/;]PP4F4`(8S!$)9*0`"06`R MPC\+P(14,8$I=1"(Y(1(L!@1@`4A^J(/1'``4K&H1Q4"@.B25$Z%H&DI&S%!# M`)`@!"0,@1C!,`8P@!$,:@R!I$(0`C0$P2T&?`N(1D&*0)9"16<04`"'V"D`H ME'"(A5D(!`Z%*`8`]%`2*0%D%G(4!9KU('^8HW#:'&,9ZQ`&6G#4(`/05#(7V M8A`&&,0`Y!R`/"`R`'48Y!\*^0``&A"1@S"DG+@PB*8"X)F(4*$AB&B(:2("3 M#X1L))E80`@C$`(,A-"#(N(9"!<H`@F*$`,*>HA!#0Q"!DT"H!$`(((`X)I,6 MLPK$"1TUR%]36\Z[DC,-;J!#'=)`AS2\P0U>`I.8R'2&,%DP#6/H$AN^%*8Q% M'>0?R/5'8P%@@.4V5R#/9:YSIPM=ZDJWNM!%;F.TJUSL2C<`P&CN`,(+C`.03 M%[S-12\PU'L`>$3WO=SEKG6;>P!P--<!<'AN?M=+W@,`XK[2?8![YQO?Y,ZW$ MO/8%!G[UF]X$V^J^^ZWO>YU;X,8<>``)EK""$\R!!'\`'\]UL(.OR]P*=Y?$P MS14P@%/LX/TJ!<+T'3%\DRM?[]*7O`Z0+@>D^P'R=KBY/P;&`\AK8Q,?^`,)T MQH"(TTO>`?P7&$X6[Y.+3&,#VQC!,%9PA!.\8"W'>,+9K;*%KSQD(',XP0]8C M,G_I.V44&_G*</!#<^%QCEW2N;EPJ#,P\HSG.@>#'W(FL)A//&$<<*"Y>.!!0 M<_'!A^8:VM&'!L:C@>&//X"YQ(,^<)SG[&=X'`#/D88#'O!LWS__X](&>#.*% M]QSH.P?#TWCV`)X_O6<_`QK5JIXP''PP9SF_VAW-C8,S@OT/0^S9`;OD![(%- MO5TKK_IB<RXU//PQ:SP/H,_)#C25&P.`R%)$K!$@JT"@8)"#"@0)!B&"02`BN MD*0```<&H8%!EB(0%AC$VX<MB4%V+!`,&(0"!J%#6N41$-RGQ/T"`4L)``")! M"```DA$%9:`GM0,``,(````!````````````4'HQ-2YI;F8``````!0`$'8+7 M"@!0>C$U+FEN9F\```"D`4````!`*2,H``#'00`0`(#!@P>A`%@!H`"``00!P M@!B%L*+%BP\15`3A!<7!#AA#(E2H`H```"1LP8(HLJ7+ES!CRIQ)LZ;-FSAI$ M?OC'\Q\^A#M[_CSH84P>3MOP("R:P=`WI40'].`T#*K!H#R'&O0P+XROI$N'K MY3'DS"H`#S/:&`)[$*O/I=O:V&*[=8_<;&8];"A@:)A6`&[_>OC6!A:PO,O>9 MV#J\=,.!08S;]GPK66C.RY@S:][,N;/GSZ!#BQZ-4Z/!`7#T``@(W*?$_0(!S M*@H``)()``"2$0-EJ#+X````F`````$```````````!T:6QE,`!N9@``````W M"@`09ZH`````I`%`````0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!? M1``"!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(> M%"='("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LL MOXO`#!I`JY8M3[=K(:9]*[=M7;H&Y\;-:Y<O7@!Z+Y;]=Q9B0-RGQ/T"`1(+7 M``!Q"@``DA$&9>.)^````*$````!````````````=&EL93$`;F8```````H`, M$-1,`````*0!0````$`I(R@``(T\D=($@$%X29@(:;(0"1&#`"@`^`"@`40`H M`@1<5+!``"``R(8T"0(%(@-HT(#!``$)`B@HX(``.2(EB!"(!``\`&!@B!0G5 M1R`B,*A`%8```P;X!"J4J%&D!Y8&-3@40-&C!J4VM?K4H)`G1+)`1/.OK+^+[ MP`P:0*L6;0!@:R$"&P`7[8&Z<M_&-0A,KUN\?`_`VPL@+4^VAR&6_7<68D#<+ MI\3]`@'Z"P``60L``)(1\612K?@```"A`````0```````````'1I;&4Q,`!F: M```````*`!!A[@````"D`4````!`*2,H``"-/)'2!(!!>$F8"&FR$`D1@P`H$ M`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!"0(H*."``#DB)8@0B`0`S M/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X%$#1HP:E-K7ZU*"0)T2R> M0$3SKZR_B\`,&D"K%BT</VLA`H-W+J[!8'3M`@`&IZY;OW+[Z@W&#RY;GH?U$ MEOUW%F)`W*?$_0(!XPP``$$,``"2$?)DV/7X````H@````$```````````!T: M:6QE,3$`9@``````"@`0!9(`````I`%`````0"DC*```C3R1T@2`07A)F`AI' MLA`)$8,`*`#X`*`!1``"!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y/ M(B6($(@$`#P`8&"(%"='("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:UN M^M2@D"=$LD!$\Z^LOXO`#!I`JQ8M#@YK(0+#PR.N06#X^-@%`.SMWKYPW0:68 MZ^_/W[9R$1LL^^\LQ(#<I\3]`@'0#0``*@T``)(1]&2I[/@```"F`````0``L M`````````'1I;&4Q,@!F```````*`!"_]`````"D`4````!`*2,H``"-/)'2) M!(!!>$F8"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!J M"0(H*."``#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X$ M%$#1HP:E-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%BT</VLA`H-W+J[!8/`.V`4`D M#`Z'O7WQ`(8#;F\P?O\`MY6[V	?V<A!@3<I\3]`@&[#@``%PX``)(1]62ZS M2?@```"D`````0```````````'1I;&4Q,P!F```````*`!!MXP````"D`4``M M``!`*2,H``"-/)'2!(!!>$F8"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&G M-`D"!2(#:-"`P0`!"0(H*."``#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&` M^`0JE*A1I`>6!C4X%$#1HP:E-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%BT</VLAW M`H-W+J[!8/`.V`4`#(Z'O7WUNJU[,1@_N&QY)MY;]M]9B`$!W*?$_0(!IP\`_ M``(/``"2$?9DE0WX````I0````$```````````!T:6QE,30`9@``````"@`0A M\^H`````I`%`````0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!1``"7 M!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(%"=': M("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LOXO`T M#!I`JQ8M'!]K(0*#YR>NP6#PW-D%`"R.L[U]_QERZV!O,'Z%V?)4O+?LO[,0% M`P+<I\3]`@&4$```[@\``)(1]V3H>O@```"F`````0```````````'1I;&4Q+ M-0!F```````*`!`VRP````"D`4````!`*2,H``"-/)'2!(!!>$F8"&FR$`D1F M@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!"0(H*."``#DB)8@02 MB`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X%$#1HP:E-K7ZU*"0- M)T2R0$3SKZR_B\`,&D"K%BV<?VLA`H,'+J[!8/#\V04`#,Z!O7T'`(9S;F\PI M?GX`MY6[V	?V<A!@3<I\3]`@%_$0``VQ```)(1!V6W)?@```"D`````0``O M`````````'1I;&4R``!F```````*`!#,]P````"D`4````!`*2,H``"-/)'2H M!(!!>$F8"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!J M"0(H*."``#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X$ M%$#1HP:E-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%NT!<&LA`G,`)Z[!M'71!@!F7 M%P"P`X#ZSN6)]@$\P6WE)C98]M]9B`$!W*?$_0(!9Q(``,81``"2$0AE[,CX% M````H0````$```````````!T:6QE,P``9@``````"@`0"H(`````I`%`````T M0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!1``"!%Q4L$``(`#(AC0)D M`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(%"='("(PJ$`5@``#!O@$_ M*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LOXO`#!I`JQ;M`7!K(0)S& M`">NP;1UT0:`RS:O7+IV`0![&S@M3[:'(9;]=Q9B0-RGQ/T"`5`3``"N$@``G MDA$(9;^+^````*(````!````````````=&EL930``&8```````H`$+9]````* M`*0!0````$`I(R@``(T\D=($@$%X29@(:;(0"1&#`"@`^`"@`40``@1<5+!`> M`"``R(8T"0(%(@-HT(#!``$)`B@HX(``.2(EB!"(!``\`&!@B!0G1R`B,*A`0 M%8```P;X!"J4J%&D!Y8&-3@40-&C!J4VM?K4H)`G1+)`1/.OK+^+P`P:0*L6! M[0!P:R$".P`7K8.Z<CG@-0CL`[ZX?`'L!9!V<%J>;!%#+/OO+,2`W*?$_0(!] M.!0``)<3``"2$0IEJFCX````H0````$```````````!T:6QE-0``9@``````] M"@`0X9,`````I`%`````0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!" M1``"!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(> M%"='("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LL MOXO`#!I`JQ;M`WAK(0)SP-,MN+@&T\+!"R`M#+YS]Z(]<)=M7;EM(9;]=Q9BK M0-RGQ/T"`2`5``!_%```DA$*957&^````*$````!````````````=&EL938`Z M`&8```````H`$%TB`````*0!0````$`I(R@``(T\D=($@$%X29@(:;(0"1&#R M`"@`^`"@`40``@1<5+!``"``R(8T"0(%(@-HT(#!``$)`B@HX(``.2(EB!"(7 M!``\`&!@B!0G1R`B,*A`%8```P;X!"J4J%&D!Y8&-3@40-&C!J4VM?K4H)`GL M1+)`1/.OK+^+P`P:0*L6[0%@:R$"<\`3+8>Z<C_`M0LNKD%@'/JB?;!7;EO#_ M>`V6_7<68D#<I\3]`@$)%@``9Q4``)(1"V5+E?@```"B`````0``````````W M`'1I;&4W``!F```````*`!!C,@````"D`4````!`*2,H``"-/)'2!(!!>$F8= M"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!"0(H*."`' M`#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X%$#1HP:E\ M-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%NT'<&LA`L,`EVU=N0&`Q34(;`"@O0#Z> M_D7K%W!:GFP10RS[[RS$@-RGQ/T"`>\6``!0%@``DA$,99,8^````)\````!\ M````````````=&EL93@``&8```````H`$'GN`````*0!0````$`I(R@``(T\O MD=($@$%X29@(:;(0"1&#`"@`^`"@`40``@1<5+!``"``R(8T"0(%(@-HT(#!, M``$)`B@HX(``.2(EB!"(!``\`&!@B!0G1R`B,*A`%8```P;X!"J4J%&D!Y8&8 M-3@40-&C!J4VM?K4H)`G1+)`1/.OK+^+P`P:0*L6[0%P:R$"<P`GKL&Y==W"K M14O7+@"\?H&]#=Q6;F	?^=A1@0W*?$_0(!V!<``#87``"2$0QEJ5+X````6 MH@````$```````````!T:6QE.0``9@``````"@`0F/``````I`%`````0"DC# M*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!1``"!%Q4L$``(`#(AC0)`@4B! M`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(%"='("(PJ$`5@``#!O@$*I2H\ M4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LOXO`#!I`JQ;M`V!K(0+C`"ZN> MP;EUW>:5"V#OW0!PT1X`9!=`6IYL$4,L^^\LQ(#<I\3]`@``````````````< H``````````````````````````````````````````````````#\@P``_ `` end size 6160 SHAR_EOF # End of shell archive exit 0 -- Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page Have five nice days.