[mod.sources] Macintosh binhex and fromhex

sources-request@genrad.UUCP (11/12/84)

From: dlc@lanl.arpa  {cmcl2|csu-cs|nmtvax|unm-cvax}!lanl!dlc

[ Editor's note:  I debated with myself for a long time before approving
  this one, because a substantial part of this submission is not SOURCE,
  but binary restricted to Macintosh machines.  Nevertheless, I decided
  to go with it because of it's usefulness.  Note that this does NOT
  mean that mod.sources is net.apple.binaries - I intend to restict
  machine specific and binary submissions.
  - john ]

The ARPA news group "info-mac" recently announced an assembly language
version of a hexify/de-hexify program for the Apple Macintosh.  Some time in
August, I posted a Microsoft BASIC program to convert another program (fromhex)
to a resource, and I still get an occasional request for help with it, because
it doesn't seem to work with every version of MS-BASIC.  The following
message from info-mac, and the shar archive following it, provide the original
"binhex" in BASIC, the new "binhex" in hex, and a "fromhex" in hex for use with
older down-load files.  The new binhex format is much faster and more compact
than the fromhex format, so it will probably become a new standard for shipping
Macintosh applications.  To operate fromhex, by the way, name your download
file "C" and double-click fromhex.  It will convert the file to a resource
named "C prog".  If it beeps just before finishing, you got a checksum error.
You will enjoy binhex.
---------
  dlc@lanl.arpa  (cmcl2 | csu-cs | nmtvax | unm-cvax)!lanl!dlc
Subject: FAST version of BinHex
From: Thomas.Newton@cmu-cs-spice.arpa

Recently Yves Lempereur of Mainstay (the company that puts out MacASM) wrote
an assembly-language version of BinHex and placed it in the public database
section of Compuserve.  This new version has several major advantages over
the BASIC version:

    (1) It runs MUCH faster
    (2) It takes up less space on a Mac disk
    (3) It can handle data and resource forks longer than 64K
    (4) It can handle files with both data & resource forks
    (5) It can save and restore finder attributes like the bundle bit
    (6) It can produce & decode special "condensed" hex files which
        are about 30% shorter than "normal" hex files.

The new version of BinHex is itself encoded in BinHex format.  To convert it
back to normal format, you should:

    (1) Use the BASIC version of BinHex to convert the upload document
        BinHex.Hex into the application document BinHex.Tmp,
    (2) Use BinHex.Tmp to convert BinHex.Hex into BinHex, and
    (3) Throw away BinHex.Hex and BinHex.Tmp
------------
: This is a shar archive.  Extract with sh, not csh.
: The rest of this file will extract:
: bh.b bh.h fromhex.hex
echo extracting - bh.b
sed 's/^X//' > bh.b << '/*EOF'
X10 'BinHex version 3.0.0 - By William B. Davis, Jr {CIS 71505,410}
X20 'with modifications by     Bob VanBurkleo {CIS 74435,1373}
X30 'using subroutines by:
X40 '     Dennis Brothers of Brothers Associates {CIS 70065,172}
X50 '     Ronald H. Nicholson, Jr {CIS 71505,410}
X60 'Permission is hereby granted for personal, non-commercial reproduction
X70 'and use of this program, provided that this notice is included.
X100 CLEAR,24000
X110 CLEAR:DEFINT P:DIM PARAMLIST%(39),RECT%(5),BACKPATTERN%(4),GETFILEINFOCODE%(25)
X120 DIM SETFILEINFOCODE%(25),P(89),DBUF%(256),VBUF%(266)
X130 X255%=255:LFR=0:LFD=0:RFN=0
X140 A=0:BOX=0:BX=0:BY=0:TRUE=-1:FALSE=0:CHOICE=0:CKSUM%=0:COUNT=0:E=0
X150 FILE=0:FILEINFO!=0:FL=0:LF=0:FP!=0:I=0:LP=0:P=0:PARAM!=0:TR=0:PX=0:PY=0
X160 R=0:RC=0:RF=0:RN=0:RW=0:RX=0:S=0:SETFILEINFO!=0:GETFILEINFO!=0:X=0:X9=0:Y=0:XX%=0
X170 A$="":BF$="":D$="":E$="":DD$="":F$="":FT$="":HF$="":HX$="":RET$="":S$="":TEXT$="":FILE.EXISTS=0
X180 TYPEAPPL$="":X$="":XX$=""
X1000 WIDTH "SCRN:",255
X1010 WHILE TRUE
X1020    GOSUB 8000:CALL SHOWCURSOR
X1030    RECT%(0)=2:RECT%(1)=10:RECT%(2)=275:RECT%(3)=475:GOSUB 7100
X1040    RECT%(0)=5:RECT%(1)=13:RECT%(2)=272:RECT%(3)=472:GOSUB 7200
X1050    CALL TEXTFONT(0):CALL TEXTSIZE(12)
X1060    CALL TEXTMODE(1):CALL TEXTFACE(8)
X1070    CALL MOVETO (45,20)
X1080    PRINT"BinHex -- Hex to binary/Binary to hex file conversion"
X1090    CALL MOVETO(140,40):CALL TEXTFACE(0)
X1100    CALL TEXTFONT(1):CALL TEXTSIZE(9)
X1110    PRINT"          Version 3.0.0 - Data & Resource Files";
X1120    CALL MOVETO(35,260)
X1130    PRINT"Copyright ";CHR$(169);"1984 by Calypso! Software ";
X1140    PRINT"- May be reproduced for non-commercial use only.";
X1150    CALL TEXTFONT(0):CALL TEXTSIZE(12)
X1160    CALL MOVETO (120,68):PRINT"Click on the desired conversion method:";
X1170    RESTORE 1200:GOSUB 6000
X1180    ON CHOICE GOSUB 3000,2000,1500,1600
X1185 GOTO 110
X1190 WEND:STOP
X1200 DATA 75,90,"Application document --> Upload format document"
X1210 DATA 75,130,"Upload format document --> Application document"
X1220 DATA 75,170,"Quit BinHex and return to the Macintosh Desktop"
X1230 DATA 75,210,"Quit BinHex and return to Microsoft BASIC"
X1240 DATA -1,-1,"Dummy end of list"
X1500 GOSUB 8000
X1510 RECT%(0)=100:RECT%(1)=100:RECT%(2)=150:RECT%(3)=400:GOSUB 7100
X1520 RECT%(0)=103:RECT%(1)=103:RECT%(2)=147:RECT%(3)=397:GOSUB 7200
X1530 CALL MOVETO(120,130):PRINT"Returning to Macintosh DeskTop....";
X1540 SYSTEM
X1600 CLS:CALL TEXTFONT(1):CALL TEXTSIZE(12)
X1610 CALL TEXTMODE(0):CALL TEXTFACE(0)
X1620 PRINT"Entering MS-BASIC Command mode....":END
X1630 '--------------------------------------------------------
X1640 '"             Hex ---> Binary conversion procedure
X1650 '--------------------------------------------------------
X2000 CHOICE=1
X2010 WHILE CHOICE=1:GOSUB 8000:ON ERROR GOTO 0
X2020 CALL TEXTMODE(1):CALL TEXTFACE(8)
X2030 RECT%(0)=32:RECT%(1)=2:RECT%(2)=200:RECT%(3)=480:GOSUB 7100
X2040 RECT%(0)=35:RECT%(1)=5:RECT%(2)=197:RECT%(3)=477:GOSUB 7200
X2050 CALL MOVETO(15,52)
X2060 PRINT "Convert Upload document (hex) to an Application document";
X2070 CALL TEXTFACE(32):CALL MOVETO (15,73)
X2080 PRINT "Enter name of Upload Document to convert FROM (Press RETURN to cancel):";
X2090 CALL MOVETO(15,153)
X2100 PRINT "Enter name of Application Document to CREATE (RETURN key skips back):";
X2110 RECT%(0)=80:RECT%(1)=15:RECT%(2)=105:RECT%(3)=450:GOSUB 7000
X2120 RECT%(0)=160:RECT%(1)=15:RECT%(2)=185:RECT%(3)=450:GOSUB 7000
X2130 BX=20:BY=95:GOSUB 7500:HF$=RET$:IF HF$="" THEN RETURN
X2140 FILE.EXISTS=TRUE
X2150 ON ERROR GOTO 3600:OPEN"I",1,HF$
X2160 CLOSE:IF NOT FILE.EXISTS THEN 2000
X2170 BX=20:BY=175:GOSUB 7500:BF$=RET$:IF BF$="" THEN 2000
X2180 OPEN"I",1,HF$,1:OPEN"O",2,BF$
X2185 F$=HF$:GOSUB 4580:GOSUB 4000:LF=LFD
X2190 '       Read in lines from file & ignore anything until the 
X2200 '       Type/Creator header information is encountered.
X2210 CKSUM%=0
X2220 LINE INPUT #1,D$:'"   Prime the pump....
X2230 WHILE LEFT$(D$,1)<>"#" AND NOT EOF(1)
X2240    LINE INPUT #1,D$
X2250 WEND
X2260 '     if we reach this point (1) we have found the header, of the form
X2270 '     #TYPECRTR where TYPE is 4 byte type code & CRTR is 4 byte 
X2280 '     creator code; or (2) we have reached EOF of hex file.
X2290 WHILE NOT EOF(1)
X2300    TYPEAPPL$=MID$(D$,2,8)
X2310    GOSUB 8000
X2320    RECT%(0)=50:RECT%(1)=100:RECT%(2)=200:RECT%(3)=400
X2330    CALL PENNORMAL:GOSUB 7000
X2340    RECT%(0)=53:RECT%(1)=103:RECT%(2)=197:RECT%(3)=397
X2350    CALL PENSIZE(2,2):GOSUB 7000:CALL PENNORMAL
X2360    CALL MOVETO(110,80):CALL TEXTFACE(0):CALL TEXTMODE(1)
X2370    PRINT "TYPE of new file is................:";MID$(TYPEAPPL$,1,4)
X2380    CALL MOVETO(110,95)
X2390    PRINT "CREATOR of new file is..........:";MID$(TYPEAPPL$,5,4)
X2400    CALL MOVETO(110,110)
X2410    PRINT USING "Length of new file will be approx : ###.##K";(LOF(1)/2)/1024;
X2420    CALL MOVETO(110,175)
X2430    PRINT "Conversion in process - Please stand by...."
X2440    CALL TEXTMODE(0)
X2450    F$=BF$:GOSUB 4660:GOSUB 4200:'"   Set type and creator of file
X2460    LINE INPUT #1,D$
X2470    IF LEFT$(D$,12)="***DATA FORK" THEN LINE INPUT #1,D$:CALL MOVETO (110,140):PRINT BF$;": a Data File"
X2475 IF LEFT$(D$,11)="***RESOURCE" THEN CALL MOVETO(110,140):PRINT BF$;": a Resource File":GOSUB 21000:GOTO 2540
X2480    WHILE NOT EOF(1)  AND LEFT$(D$,14)<>"***END OF DATA" 
X2490            GOSUB 2800:'  Convert string to binary
X2500            LINE INPUT #1,D$
X2510    WEND
X2520    IF NOT EOF(1) THEN LINE INPUT #1,D$:'get checksum if available
X2525 GOTO 2540
X2530 WEND
X2540 CLOSE:GOSUB 8000
X2550 RECT%(0)=30:RECT%(1)=80:RECT%(2)=220:RECT%(3)=410:GOSUB 7100
X2560 RECT%(0)=33:RECT%(1)=83:RECT%(2)=217:RECT%(3)=407:GOSUB 7200
X2570 CALL MOVETO (100,55):CALL TEXTMODE(1)
X2580 PRINT "Conversion of upload format document to";
X2590 CALL MOVETO(100,70)
X2600 PRINT "application document has been completed!";
X2610 CALL MOVETO(140,100)
X2620 IF LEFT$(D$,12)="***CHECKSUM:" THEN PRINT "Checksum in file: ";MID$(D$,13,2);
X2630 IF LEFT$(D$,12)<>"***CHECKSUM:" THEN PRINT "No checksum present in file...";
X2640 XX$=HEX$(CKSUM%):IF LEN(XX$)<2 THEN XX$="0"+XX$
X2650 CALL MOVETO (140,115):PRINT "Calculated Checksum: ";XX$;
X2660 BEEP:RESTORE 2690:GOSUB 6000:CALL TEXTMODE(0)
X2670 WEND:' of the WHILE CHOICE=1
X2680 RETURN:' if CHOICE=2
X2690 DATA 130,155,"Convert another upload document"
X2700 DATA 130,180,"Return to Main Conversion menu"
X2710 DATA -1,-1,"dummy end of list"
X2720 '----- Loop to break down input line into byte-pairs & convert -----
X2800 FOR I=1 TO LEN(D$) STEP 2
X2810    XX%=VAL("&H"+MID$(D$,I,2)):CKSUM%=(CKSUM%+XX%) AND 255
X2820    PRINT #2,CHR$(XX%);
X2830 NEXT I:RETURN
X2840 '-------------------------------------------------------
X2850 '               Binary ---> Hex conversion procedure
X2860 '-------------------------------------------------------
X3000 CHOICE=1
X3010 WHILE CHOICE=1:GOSUB 8000
X3020 ON ERROR GOTO 0:CALL TEXTMODE(1):CALL TEXTFACE(8)
X3030 RECT%(0)=32:RECT%(1)=2:RECT%(2)=200:RECT%(3)=480:GOSUB 7100
X3040 RECT%(0)=35:RECT%(1)=5:RECT%(2)=197:RECT%(3)=477:GOSUB 7200
X3050 CALL MOVETO(15,52)
X3060 PRINT "Convert Application document to an Upload document (hex)";
X3070 CALL TEXTFACE(32):CALL MOVETO (15,73)
X3080 PRINT "Enter name of Application Document to convert FROM (Press RETURN to cancel):";
X3090 CALL MOVETO(15,153)
X3100 PRINT "Enter name of Upload Document to CREATE (RETURN key skips back):";
X3110 RECT%(0)=80:RECT%(1)=15:RECT%(2)=105:RECT%(3)=450:GOSUB 7000
X3120 RECT%(0)=160:RECT%(1)=15:RECT%(2)=185:RECT%(3)=450:GOSUB 7000
X3130 BX=20:BY=95:GOSUB 7500:BF$=RET$:IF BF$="" THEN RETURN
X3140 FILE.EXISTS=TRUE
X3150 ON ERROR GOTO 3600:OPEN"I",1,BF$
X3160 ON ERROR GOTO 0: CLOSE:IF NOT FILE.EXISTS THEN 3000
X3170 BX=20:BY=175:GOSUB 7500:HF$=RET$
X3180 OPEN"O",2,HF$
X3190 F$=BF$:GOSUB 4580:GOSUB 4000:LF=LFD+LFR
X3200 CLS:CALL TEXTFACE(0)
X3210 PRINT "LENGTH of Application document is:";LF;" bytes (characters)"
X3220 PRINT "TYPE of Application document is: ";LEFT$(TYPEAPPL$,4)
X3230 PRINT "CREATOR of Application document is: ";RIGHT$(TYPEAPPL$,4)
X3235 PRINT "DOCUMENT is a ";:IF LFD=0 THEN PRINT "Resource File":ELSE PRINT "Data File"
X3240 PRINT:CALL TEXTFONT(4):CALL TEXTSIZE(9)
X3250 PRINT "<---Hex data being output-------------------------------------->  ";
X3260 PRINT"Processed/Total"
X3270 CKSUM%=0:COUNT=0
X3275 IF LFD=0 THEN GOSUB 22000:GOTO 3380
X3280 PRINT #2,"#";TYPEAPPL$:PRINT #2,"***DATA FORK"
X3285 OPEN "R",1,BF$,1:FIELD 1,1 AS D$
X3290 FOR I = 1 TO LFD
X3300            GET 1,I
X3310            DD$=HEX$(ASC(D$)):IF LEN(DD$)<2 THEN DD$="0"+DD$
X3320            CKSUM%=(CKSUM%+ASC(D$)) AND 255
X3330            PRINT #2,DD$;:PRINT DD$;
X3340            COUNT=COUNT+1
X3350            IF COUNT=32 THEN COUNT=0:PRINT #2,"":PRINT USING " ######_/";I;:PRINT LFD
X3360 NEXT I
X3370 IF COUNT<32 THEN PRINT #2,""
X3380 PRINT #2,"***END OF DATA"
X3390 XX$=HEX$(CKSUM%):IF LEN(XX$)<2 THEN XX$="0"+XX$
X3400 PRINT #2,"***CHECKSUM:";XX$
X3410 CLOSE:CALL TEXTFONT(0):CALL TEXTSIZE(12)
X3420 RECT%(0)=30:RECT%(1)=80:RECT%(2)=220:RECT%(3)=410:GOSUB 7100
X3430 RECT%(0)=33:RECT%(1)=83:RECT%(2)=217:RECT%(3)=407:GOSUB 7200
X3440 CALL MOVETO(90,70):CALL TEXTMODE(1)
X3450 PRINT "Conversion of Application document to an";
X3460 CALL MOVETO (90,85)
X3470 PRINT "Upload format document has been completed!";
X3480 BEEP:RESTORE 3510:GOSUB 6000
X3490 WEND: '  of the WHILE CHOICE=1
X3500 RETURN: ' if CHOICE=2
X3510 DATA 110,120,"Convert another Application document"
X3520 DATA 110,160,"Return to Main Conversion Menu"
X3530 DATA -1,-1,"dummy end of list"
X3540 '------ Subroutine to handle file-not-found condition ------
X3600 RECT%(0)=75:RECT%(1)=100:RECT%(2)=165:RECT%(3)=400:GOSUB 7100
X3610 RECT%(0)=79:RECT%(1)=103:RECT%(2)=162:RECT%(3)=397:GOSUB 7200
X3620 CALL MOVETO(160,110):PRINT"That document does not exist!";
X3630 BEEP:BEEP:RESTORE 3640:GOSUB 6000
X3640 DATA 150,130,"<--Click here to select another file"
X3650 DATA -1,-1,"Dummy end of File not found list"
X3660 FILE.EXISTS=FALSE:RESUME NEXT
X3670 '------------------------------------------------------------
X3680 '   _GetFileInfo --  Subroutine to get type and application of a file
X3690 '------------------------------------------------------------
X4000 FL=LEN(F$)
X4010 F$=CHR$(FL)+F$
X4020 FP!=VARPTR(F$)
X4030 PARAM!=VARPTR(PARAMLIST%(0))
X4040 FOR I=0 TO 79: POKE PARAM!+I,0: NEXT I
X4050 POKE PARAM!+19,PEEK(FP!+2)
X4060 POKE PARAM!+20,PEEK(FP!+3)
X4070 POKE PARAM!+21,PEEK(FP!+4)
X4080 GETFILEINFO!=VARPTR(GETFILEINFOCODE%(0))
X4090 CALL GETFILEINFO!(PARAM!)
X4100 TYPEAPPL$ = ""
X4110 FOR I = 1 TO 8
X4120 TYPEAPPL$ = TYPEAPPL$ + CHR$(PEEK(PARAM!+31+I))
X4130 NEXT I
X4135 LFD=PEEK(PARAM!+56)*256+PEEK(PARAM!+57)
X4136 LFR=PEEK(PARAM!+66)*256+PEEK(PARAM!+67)
X4140 RETURN
X4150 '-------------------------------------------------------------
X4160 '   _SetFileInfo  --  Subroutine to set type and application of a file
X4170 '-------------------------------------------------------------
X4200 FL=LEN(F$)
X4210 F$=CHR$(FL)+F$
X4220 PARAM!=VARPTR(PARAMLIST%(0))
X4230 FP!=VARPTR(F$)
X4240 FOR I=0 TO 79: POKE PARAM!+I,0: NEXT I
X4250 POKE PARAM!+19,PEEK(FP!+2)
X4260 POKE PARAM!+20,PEEK(FP!+3)
X4270 POKE PARAM!+21,PEEK(FP!+4)
X4280 GETFILEINFO!=VARPTR(GETFILEINFOCODE%(0))
X4290 CALL GETFILEINFO!(PARAM!)
X4300 FOR I=1 TO LEN(TYPEAPPL$)
X4310 POKE PARAM!+31+I,ASC(MID$(TYPEAPPL$,I,1))
X4320 NEXT I
X4330 SETFILEINFO!=VARPTR(SETFILEINFOCODE%(0))
X4340 CALL SETFILEINFO!(PARAM!)
X4350 RETURN
X4360 '-----------------------------------------------------------
X4370 '                Setup Machine Language Toolkit calls
X4380 '-----------------------------------------------------------
X4560 '               Set up  _GetFileInfo  ToolKit call
X4580 RESTORE 4610:I=0
X4590 READ A:GETFILEINFOCODE%(I)=A
X4600 I=I+1:IF A<>-1 THEN GOTO 4590
X4605 RETURN
X4610 DATA &H4E56, &HFFF8, &H48EE, &H0101, &HFFF8, &H206E, &H0008, &HA00C
X4620 DATA &H4CEE, &H0101, &HFFF8, &H4E5E, &H4E75
X4630 DATA -1
X4640 '               Set up _SetFileInfo Toolkit call
X4660 RESTORE 4700:I=0
X4670 READ A:SETFILEINFOCODE%(I)=A
X4680 I=I+1:IF A<>-1 THEN GOTO 4670
X4690 RETURN
X4700 DATA &H4E56, &HFFF8, &H48EE, &H0101, &HFFF8, &H206E, &H0008, &HA00D
X4710 DATA &H4CEE, &H0101, &HFFF8, &H4E5E, &H4E75
X4720 DATA -1
X4730 '----------------------------------------------------------
X4740 '                   Pseudo-Dialog-Box subroutine
X4750 '----------------------------------------------------------
X6000 BOX=0:READ X,Y,TEXT$
X6010 WHILE X<>-1
X6020    BOX=BOX+1:CHECKBOX(BOX,1)=X:CHECKBOX(BOX,2)=Y
X6030    CHECKTEXT$(BOX)=TEXT$:READ X,Y,TEXT$
X6040 WEND
X6050 FOR I=1 TO BOX
X6060    CIRCLE(CHECKBOX(I,1),CHECKBOX(I,2)),7
X6070    CIRCLE(CHECKBOX(I,1),CHECKBOX(I,2)),5
X6080    CALL MOVETO(CHECKBOX(I,1)+15,CHECKBOX(I,2)+5)
X6090    PRINT CHECKTEXT$(I);
X6100 NEXT I
X6110 CHOICE=0
X6120 WHILE CHOICE=0
X6130    WHILE MOUSE(0)<>-1:WEND
X6140    PX=MOUSE(1):PY=MOUSE(2)
X6150    FOR I=1 TO BOX
X6160            P=SQR((PX-CHECKBOX(I,1))^2+(PY-CHECKBOX(I,2))^2)
X6170            IF P<5 THEN CHOICE=I:I=BOX :' once choice found, stop loop.
X6180    NEXT I
X6190 WEND
X6200  FOR I=0 TO 4
X6210    CIRCLE(CHECKBOX(CHOICE,1),CHECKBOX(CHOICE,2)),I
X6220 NEXT I
X6230 WHILE MOUSE(0)<>1:WEND:RETURN
X6240 '---------------------------------------------------
X6250 '                Routines used to draw Dialog boxes
X6260 '---------------------------------------------------
X7000 CALL ERASERECT(VARPTR(RECT%(0)))
X7010 CALL FRAMERECT(VARPTR(RECT%(0)))
X7020 RETURN
X7100 CALL PENNORMAL:GOSUB 7000:RETURN
X7200 CALL PENSIZE(2,2):GOSUB 7000:CALL PENNORMAL:RETURN
X7210 '---------------------------------------------------------
X7220 '     Controlled Keyboard input routine, with cursor
X7230 '---------------------------------------------------------
X7500 A$="":RET$=""
X7510 CALL MOVETO(BX,BY):CALL TEXTMODE(0)
X7520 CALL PENSIZE(1,1):CALL SHOWPEN
X7530 CALL OBSCURECURSOR:CALL LINE(0,-10)
X7540 WHILE A$<>CHR$(13) AND A$<> CHR$(9) AND A$<>CHR$(3)
X7550    A$=INKEY$
X7560    IF A$<>"" AND A$>CHR$(31) THEN GOSUB 7630
X7570    IF A$=CHR$(8) AND LEN(RET$)>0 THEN GOSUB 7660
X7580    IF A$=CHR$(8) AND LEN(RET$)=0 THEN GOSUB 7690
X7590    IF LEN(RET$)>65 THEN BEEP:A$=CHR$(13)
X7600 WEND
X7610 CALL MOVETO(BX,BY):PRINT RET$;" ";:RETURN
X7620 '-------- Handle normal input of letter ASCII 32-255 ------------
X7630 RET$=RET$+A$:CALL LINE(0,10)
X7640 PRINT A$;:CALL LINE(0,-10):RETURN
X7650 '------- Hande Backspacing with input length >0 ----------------
X7660 CALL MOVETO(BX,BY):RET$=LEFT$(RET$,LEN(RET$)-1)
X7670 PRINT RET$;:CALL LINE(0,-10):RETURN
X7680 '------- Handle Backspacing when input length goes to 0 ------
X7690 CALL MOVETO(BX,BY):PRINT"   ";:CALL LINE(0,-10):
X7700 CALL MOVETO (BX,BY):CALL LINE(0,-10):RETURN
X7710 '------- Change Window Background pattern to grey -------
X8000 FOR I=0 TO 4:BACKPATTERN%(I)=&HAA55:NEXT I
X8010 CALL BACKPAT(VARPTR(BACKPATTERN%(0))):CLS
X8020 FOR I=0 TO 4:BACKPATTERN%(I)=0:NEXT I
X8030 CALL BACKPAT(VARPTR(BACKPATTERN%(0))):RETURN
X10000 ' Open Resource Fork For E$
X10010 IF P(0)<>&H41FA THEN GOSUB 15000
X10020 P(8)=&HA20A:' Open RF
X10030 Y=VARPTR(P(42)):'length of file name
X10040 POKE Y,LEN(E$)
X10050 FOR I=1 TO LEN(E$):POKE (Y+I),ASC(MID$(E$,I,1)):NEXT I
X10060 P(25)=INT(Y/65536!):GOSUB 20000
X10070 P(26)=X:'lsw of name
X10080 P(27)=0:'volume
X10090 P(29)=RW:'version and R/W Permission
X10100 P(30)=0'Nil-> default volume buffer msw
X10110 P(31)=0:'Nil-> default volume buffer lsw
X10115 IF RW=1 THEN GOTO 10160
X10120 Y=VARPTR(VBUF%(0))
X10130 P(30)=INT(Y/65536!):GOSUB 20000:' volume buffer msw
X10140 P(31)=X:'volume buffer lsw
X10160 X=VARPTR(P(0)):CALL X:'open the Fork
X10170 RC=P(16):'return code
X10180 RFN=P(28):'reference number
X10190 RETURN
X10500 ' Close RF at RefNum
X10510 IF P(0)<>&H41FA THEN GOSUB 15000
X10520 P(8)=&HA201:'Close RF byte
X10530 P(28)=RFN:'Refnum
X10540 GOTO 10030 :'insert into main loop
X11000 'Set up for Write RF
X11010 IF P(0)<>&H41FA THEN GOSUB 15000
X11020 P(8)=&HA203:'Write byte
X11030 P(39)=0:' offset msw
X11033 Y=VARPTR(VBUF%(0)):P(30)=INT(Y/65536!):GOSUB 20000
X11036 P(31)=X
X11040 P(40)=0:'offset lsw
X11050 TR=VARPTR(DBUF%(0))
X11060 P(32)=INT(TR/65535!):Y=TR:GOSUB 20000
X11080 P(33)=X:'buffer
X11090 P(34)=0:'count high
X11100 P(35)=1:'count low
X11110 P(38)=1:'mode as absolute offset
X11120 RETURN
X12000 'Write RF (hex->bin)
X12010 IF EOF (1) THEN GOTO 12990:' return
X12020 E=0: IF EOF(1) THEN CLS:PRINT "Hex File Error":GOTO 12990
X12030 INPUT #1,D$
X12040 IF MID$(D$,1,6)="***END" THEN 12100
X12050 FOR I=1 TO LEN (D$) STEP 2
X12060     X=VAL("&H"+MID$(D$,I,2)):CKSUM%=(CKSUM%+X) AND X255%
X12070      GOSUB 13000:E=E+1:'write byte at offset E
X12080 NEXT I
X12085 CALL MOVETO(190,158):PRINT USING "####.##_K";(E/1024)
X12090 GOTO 12030
X12100 INPUT #1,D$:'get the checksum
X12990 CLOSE:RETURN
X13000 'Write Byte X at offset E
X13010 POKE VARPTR(DBUF%(0)),X
X13015 P(39)=INT(E/65536!):Y=E:GOSUB 20000:' offset msw
X13020 P(40)=X:'offset lsw
X13030 X=VARPTR (P(0)):CALL X:' write it!
X13040 RC=P(16):'return code
X13050 IF RC<>0 THEN CLS: PRINT "Write RF Error":GOSUB 14000:CLOSE:END
X13060 RETURN
X14000 'Close RF 
X14010 GOSUB 10500:'Closing Header to RF routine
X14020 IF RC=0 THEN RETURN
X14030 PRINT "File Error on Closing RF"
X14040 GOTO 14100
X14050 'Open RF for E$
X14060 RW=1:'set to read
X14070 GOSUB 10000:'Open RF
X14080 IF RC=0 THEN RETURN
X14090 CLS:PRINT "FILE ERROR ON OPENING RF"
X14100 PRINT "Return Code = ";RC
X14110 CLOSE :END
X15000 'Load Code Array
X15010 I=0
X15020 RESTORE 15500
X15030 READ X:IF X<>-5 THEN P(I)=X:I=I+1:GOTO 15030
X15040 RETURN
X15500 DATA &H41FA,&H001E,&H2278,&H011C
X15510 DATA &H2269,&H0010,&H2251,&H4280,&HA40A
X15520 DATA &H41FA,&H000A,&H3080,&H4E75,&H7268,&H6E00,0
X15530 DATA &H0000,&H0000,&H0005,&H0000
X15540 DATA &H0000,&H0000,&H0000,&H0000
X15550 DATA &H0001,&H0000,&H0000,&H0000
X15560 DATA &HFFFE,&H0000,&H0000,&H0000
X15570 DATA &H0001,&H3000,&H0000,&H0200
X15580 DATA &H0000,&H0000,&H0001,&H0000,&H0000
X15590 DATA-5
X16000 'REad RF at E
X16010 IF P(0)<>&H41FA THEN GOSUB 15000
X16020 P(8)=&HA202:'Read byte
X16030 P(39)=INT(E/65536!):Y=E:GOSUB 20000:'offset msw
X16040 P(40)=X: 'offset lsw
X16050 TR=VARPTR(DBUF%(0))
X16060 P(32)=INT(TR/65536!):Y=TR:GOSUB 20000:'buffer msw
X16070 P(33)=X:'buffer lsw
X16080 P(34)=0:'count high
X16090 P(35)=RN:'count low
X16100 P(38)=1:'mode is absolute offset
X16110 X=VARPTR(P(0)):CALL X:'read it!
X16120 RC= P(16):'return code
X16130 RX=P(37):'returned count
X16140 IF RC<>0 THEN CLS:PRINT "Read RF Error":GOSUB 14000:CLOSE:END
X16150 RETURN
X18000 'Dump the RF
X18010 E=0:CKSUM%=0:S=0
X18020 IF E>=LFR-1 THEN RN=0: GOTO 18140: ELSE RN=256:IF LFR-E<=256 THEN RN=LFR-E
X18030 GOSUB 16000:'get the buffer filled with RF
X18040 FOR I=0 TO RX-1
X18050      X9=(PEEK(VARPTR(DBUF%(0))+I))
X18060      HX$=HEX$(X9):IF LEN(HX$)<2 THEN HX$="0"+HX$
X18070      CKSUM%=(CKSUM%+X9) AND X255% 
X18080      PRINT HX$;: PRINT #2,HX$;
X18090      S=S+1:IF S>31 THEN S=0:PRINT USING " ######_/";(E+I+1);:PRINT LFR:PRINT #2,""
X18120 NEXT I
X18140 IF S>0 THEN PRINT #2,""
X18150 IF RN<256 THEN RETURN
X18160 E=E+256:GOTO 18020
X18170 END
X20000 X=Y-65536!*INT(Y/65536!):IF X>=32768! THEN X=X-65536!
X20010 RETURN
X21000 'Resource hex->bin Subroutine
X21010 CLOSE #2:E$=BF$:RW=2:GOSUB 14070:'Open RF to write
X21020 GOSUB 11000:'Setup To Write to RF
X21030 GOSUB 12000:'Dump the Hex->RF
X21040 GOSUB 14000:'Close rf
X21050 RETURN
X22000 'Resource Bin-> hex subroutine
X22010 PRINT #2,"#";TYPEAPPL$:PRINT #2,"***RESOURCE FORK"
X22020 E$=BF$:RW=1
X22030 GOSUB 14070:'Open RF
X22040 GOSUB 18000:'Dump Fork
X22050 GOSUB 14000:'Close Fork
X22060 RETURN
/*EOF
echo extracting - bh.h
sed 's/^X//' > bh.h << '/*EOF'
X#APPLBNHX$2000
X***RESOURCE FORK
X00000100000014810000138100000132EDFCCE42A8000C43EC000A2149001231
X6C00060016116C0009001A4E7561E01140001B214A001CA000302800183E2800
X104E7561CA1140001B214A001CA00A302800183E2800104E7541EDFCCE42A800
X0C31400018A0013E2800106600010042A80012316C00060016A0133E28001066
X0000EC4E756188A0083E280010660000DE4E756100FF7A4268001CA00C3E2800
X10670A0C47FFD5671C600000C23E3CFFD3082800070028660000B4A0093E2800
X10660000AA4E756100FF464268001CA00C3E280010660000964E7541EDFCCE42
XA8000C316DFDD60016317C0002002C42A8002EA0443E280010660000724E754A
X000000181742696E4865782056322E30202D2D2031302F32392F383400000100
X0FFFFE0008000300080002800800424008006220087FF210087FFBF8087FF008
X08706008087040080870000808700008087000080870000808703F0809FC4088
X08F88048087130280821C818080E7F0F04023007020100070100800700806007
X00401FE70020021F001004070008080000041000000220000001400000008000
X0FFFFE000FFFFF000FFFFF800FFFFFC00FFFFFE00FFFFFF00FFFFFF80FFFFFF8
X0FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF8
X0FFFFFF80FFFFFF80FFFFFF80FFFFFFF07FFFFFF03FFFFFF01FFFFFF00FFFFFF
X007FFFFF003FFE1F001FFC07000FF8000007F0000003E0000001C00000008000
X000000074150504C0000000000001C424E48580000000149434E230000000000
X80465245460000000000800000002900010000000000000000FFFFFFFB01140D
X41626F75742042696E486578C900000000012D00000000000000009600020000
X000000000000FFFFFED70446696C65154170706C69636174696F6E202D3E2055
X706C6F6164000000001555706C6F6164202D3E204170706C69636174696F6E00
X000000012D000000000B544558542066696C74657200001200012D000000000A
X436F6D70726573736564000012000F53656E64206C696E652066656564730000
X0000012D0000000004517569740051000000000000150064003200C801CC0001
X00000000000000000001000000010200040000000000460154005A019004024F
X4B00000000000A000A001A0190883842696E48657820322E302C202077726974
X74656E2062792059766573204C656D706572657572207B434953203734303136
X2C313734317D2000000000001A000A002A0190883477697468204D616341534D
XAA2C20616E20456469746F722F417373656D626C657220666F7220746865204D
X6163696E746F73682E00000000003A000A004A012C882A466F72206675727468
X657220696E666F726D6174696F6E20636F6E74616374204D61696E737461792C
X2000000000004A000A005A012C88227B4349532037303736352C3733347D206F
X72202838313829203939312D363534302E000000150064006400BE0190000100
X000000000000000002000000002A000100000000003C00E60050012204024F4B
X0000000000140014003B0118880A5E30206572726F722E200000001500640064
X00BE01900001000000000000000000030000000074000100000000003C00E600
X50012204024F4B00000000000A000A003A01228854436F6E76657273696F6E20
X6F66204170706C69636174696F6E20646F63756D656E7420746F20616E205570
X6C6F616420666F726D617420646F63756D656E7420686173206265656E20636F
X6D706C657465642120000000150064006400B8019A0001000000000000000000
X040000000090000300000000003600F0004A012C04024F4B00000000000A000A
X002A012C8850436F6E76657273696F6E206F662055706C6F616420666F726D61
X7420646F63756D656E7420746F204170706C69636174696F6E20646F63756D65
X6E7420686173206265656E20636F6D706C657465642100000000002A000A003A
X00E688025E3000000000003A000A004A00E688025E31000000130064006400D8
X0195000101000000000000000000000E9400000001486DFFFCA86EA8FEA912A9
X3042A7A97B61000C02203C0000FFFFA0323F3C0002A9E93F3C0003A9793F3C00
X04A97961000C0A1B7C0001FDFC1B7C0001FDFFA8502B4FFDC2A9B442273F3CFF
XFF486DFDB2A970101F67EE302DFDB2D040303B00064EFB0002FFE00032FFE000
X18FFE0FFE0FFE00160FFE0FFE0FFE0FFE0302DFDC00800000867BE42A7202DFD
XB43F00A93E201F6000003242672F2DFDBC486DFDC6A92C301FD040303B00064E
XFB0002FF96000E0108FF96FF96FF96FF9642A72F2DFDBCA93D201F2B40FDCA30
X2DFDCAD040303B00064EFB00020006000E00664267A9386000FF60302DFDCC0C
X400001663042A73F3C000142A72F3CFFFFFFFFA97C2B57FDCEA91542A7486DFD
XD2A991302DFDD20C40000166EE2F2DFDCEA98360BE42A73F3C0001A9493F2DFD
XCC486DFBCEA9464267486DFBCEA9B6301F60A0302DFDCCD040303B00064EFB00
X02FF92009A03E4FF920014FF920030004CFF9200680A2D0001FDFC42A73F3C00
X02A9493F3C00041F2DFDFCA9456000FF640A2D0001FDFF42A73F3C0002A9493F
X3C00061F2DFDFFA9456000FF480A2D0001FDFD42A73F3C0002A9493F3C00071F
X2DFDFDA9456000FF2CA9F4486DFDB22F2DFDC6A9B36000FE82302DFDB46700FE
X7A42673F3C00643F3C00642F2DFDB43F3C0000A9E9301F6000FE603F3C00463F
X3C0046487A0A6042A73F3CFFFF42A742A7486DFD1E3F3C0002A9EA4A2DFD1E67
X00FED23F3C00463F3C0046487A0C03487A0A3442A7486DFD683F3C0001A9EA4A
X2DFD686700FEAE49EDFD686100088661000874610008B2217C54455854002021
X7C202020200024A00D3E2800106600093E700249EDFD6845EDF9C4610007F03B
X40FDD61B7C0001FDFB4A47660009206100064849EDFD1E6100086E2B680020FD
XE02B680024FDE4302800280240F0003B40FDE82B680040FDD82B680036FDDC61
X0001F04A2DFDFF670841FA09CD610001B861000728426DFDF2422DFDF43F3C00
X0A3F3C0046A8934AADFDD8672842ADFDD8486DFD72A884487A0A6EA88441FA09
XA761000184700149EDFD1E45F8000061000772602C4AADFDDC676242ADFDDC48
X6DFD72A884487A0A33A88441FA098A61000156700149EDFD1E45F80000610007
X2E3B40FDD41B7C0001FDFA4A476600085E610001B44A2DFBCE67066100009860
XF041FA09616100012049EDFD1E302DFDD461000726422DFDFA6000FF624A2DFD
XFF661241FA095661000116102DFDF461000164601041FA093C61000104302DFD
XF261000148610000E4610004F849EDFD68302DFDD6610006E2422DFDFB2F2DFD
XC6A91442A73F3C000342A72F3CFFFFFFFFA97C2B57FDCEA91542A7486DFDD2A9
X91302DFDD20C40000166EE2F2DFDCEA9836000FD0041EDFBCE424112184A2DFD
XFF672E4207100161000038602442401018D12DFDF4342DFDF2D440E75A3B42FD
XF24A2DFDFF6606610000CC60046100001251C9FFDA4A2DFDFF67046100002A60
X4A74070C07000666120206003F06060020C14661000434C1464207E310E31652
X0751CAFFE04E754A07671A0C0700066706E30E520760F40206003F0606002010
X06610004064E7561000016700D610003FA4A2DFDFD6706700A610003EE4E7542
X41121860061018610003E051C9FFF84E7541FA07B361D07023610003CE202DFD
XE06100001A202DFDE4610000127024610003B8302DFDE86100001260AE7203E1
X98610003A651C9FFF84E753F00E04861000004301F1F00E80861000004101F61
X0004386000038441EDFCCE42A8000C316DFDD4001843EDFBCF21490020217C00
X00002000244268002C42A8002EA0023E28001067080C47FFD9660006721B6800
X2BFBCE4E753F3C00463F3C0046487A071642A74A2DFDFC66083F3CFFFF42A760
X083F3C0001487A06FA42A7486DFD1E3F3C0002A9EA4A2DFD1E6700FB783F3C00
X463F3C0046487A08A9487A06DA42A7486DFD683F3C0001A9EA4A2DFD686700FB
X5449EDFD1E61000560700145F80000610004BC3B40FDD41B7C0001FDFA4A4766
X0005EC422DFDFE2B7C54455854FDE02B7C20202020FDE4426DFDE8426DFDF242
X2DFDF461000588424141EDFBCE1218670001FE60060C180023670651C9FFF860
XE20C4100086526610002DE2B40FDE0610002D62B40FDE40C41000565100C1800
X24660A610002D065043B40FDE86100037A49EDFD686100049C6100048A610004
XC8216DFDE00020216DFDE40024302DFDE881680028A00D3E2800106600055061
X00050C43FA0633610002F8660A1B7C0001FDFE610004F83F3C000A3F3C0046A8
X93486DFD72A88443FA062E610002D4660C487A06C7A884610004D4602443FA06
X07610002BE661A487A06BEA884610004BE700249EDFD6845EDF9C4610003C660
X0E700249EDFD6845EDF9C4610003A03B40FDD61B7C0001FDFB4A47660004D061
X00043A610001F46004610004824A2DFBCE671E43FA059F610002686706610001
X0460E643FA05BF6100025866046100045E6100019049EDFD68302DFDD6610003
X7A422DFDFB43FA0590610002366700FF4843FA05736100022A6700FF3C49EDFD
X1E302DFDD461000352422DFDFA2F2DFDC6A91442A73F3C000442A72F3CFFFFFF
XFFA97C2B5FFDCE43FA0572610001F4660E43FA06171358001313580014603443
XFA0552610001DC662643FA05ED1358000E1358000F135800101358001145FA06
X1D47EA0011302DFDF261000178601443FA05EE45FA061C47EA0016102DFDF461
X00016A2F092F0A42A742A7A98B2F2DFDCEA91542A7486DFDD2A991302DFDD20C
X40000166EE2F2DFDCEA9836000F90649EDFD1E302DFDD4610002A0422DFDFA60
X00F8F2610001464A2DFDFE66240C01000265484240610000E26540D12DFDF434
X2DFDF2D440E75A3B42FDF26100005C60DC42076100002865223200601A610000
X1E6518D12DFDF4342DFDF2D440E75A3B42FDF26100003451C9FFE44E7574074A
X0766161C18040600200C0600406506003C00014E75E50E7E06E316E310530751
XCAFFDE023C00FE4E75226DFDEA12C02B49FDEA52ADFDEE0CAD00002000FDEE64
X024E7548E7C38041EDFCCE42A8000C316DFDD6001843EDD9C421490020216DFD
XEE00244268002C42A8002EA0033E280010660002DA4CDF01C343EDD9C42B49FD
XEA42ADFDEE4E757403E1881018534151CAFFF84E756100000261000002141853
X410A0200300C02000A650A060200890C0200FA650C0202000FE9488002023C00
XFE4E753F00E0486102301F1F00E8086102101F610416C04E750200000F000000
X300C00003A65025E004E7541EDFBCE1218670C0C10000A66065288530166F44E
X7561E842421419B202650C6004B308660651CAFFFA42404E7542A73F3C000142
XA72F3CFFFFFFFFA9BD2B57FDC6A8733F3C0000A8873F3C000CA88A3F3C0000A8
X883F3C0000A8894E7561CE3F3C000A3F3C0016A893487A0331A8841B7C0004FD
XF52B6DFDE0FDF6486DFDF5A8843F3C000A3F3C0026A893487A0335A8842B6DFD
XE4FDF6486DFDF5A8843F3C000A3F3C0066A893487A033CA8844E756100FF7C3F
X3C000A3F3C0016A893487A03DEA8841B7C0004FDF52B6DFDE0FDF6486DFDF5A8
X843F3C000A3F3C0026A893487A03DEA8842B6DFDE4FDF6486DFDF5A8843F3C00
X0A3F3C0066A893487A02E8A8844E7541EDFCCE42A8000C43EC000A2149001231
X6C00060016116C0009001A4E7561E01140001B214A001CA000302800183E2800
X104E7561CA1140001B214A001CA00A302800183E2800104E7541EDFCCE42A800
X0C31400018A0013E2800106600010042A80012316C00060016A0133E28001066
X0000EC4E756188A0083E280010660000DE4E756100FF7A4268001CA00C3E2800
X10670A0C47FFD5671C600000C23E3CFFD3082800070028660000B4A0093E2800
X10660000AA4E756100FF464268001CA00C3E280010660000964E7541EDFCCE42
XA8000C316DFDD60016317C0002002C42A8002EA0443E280010660000724E754A
X2DFDFA6710422DFDFA49EDFD1E302DFDD46100FF464A2DFDFB6710422DFDFB49
XEDFD68302DFDD66100FF304E7541EDFCCE42A8000C316DFDD4001843EDFBCF21
X490020217C000000FF0024317C0D80002C42A8002EA0023E28001067080C47FF
XD96600000A1B68002BFBCE4E753F07618E42A7A924201F670AB0ADFDC666042F
X00A91442A73F3C000242A72F3CFFFFFFFFA97C2B5FFDCE3E1F6100002E2F2DFD
XCEA9153F3C0004A9C842A7486DFDD2A991302DFDD20C40000166EE2F2DFDCEA9
X832E6DFDC26000F4EC41FA023742401018670ABE0067061018D0C060F22F0842
XA742A742A7A98B4E7542A73F3C0001A9BF2F174267A9352F3C44525652A94D42
XA73F3C0002A9BF4267A935A9374E7541EDD9C4303C243C6002421851C8FFFC4E
X7554455854002D28546869732066696C65206D75737420626520636F6E766572
X74656420776974682042696E4865782E48657829032A2A2A0D2A2A2A434F4D50
X524553534544102A2A2A5245534F5552434520464F524B0C2A2A2A4441544120
X464F524B0E2A2A2A454E44204F462044415441072A2A2A4352433A0C2A2A2A43
X4845434B53554D3A2554595045206F66206E65772066696C652069732E2E2E2E
X2E2E2E2E2E2E2E2E2E2E2E2E3A202243524541544F52206F66206E6577206669
X6C652069732E2E2E2E2E2E2E2E2E2E3A2028436F6E76657273696F6E20696E20
X70726F63657373202D20506C65617365207374616E64206279C90C203A204461
X746120466F726B10203A205265736F7572636520466F726B1143524320696E20
X66696C653A203030303014436865636B73756D20696E2066696C653A2030301C
X4E6F20636865636B73756D2070726573656E7420696E2066696C65C91443616C
X63756C61746564204352433A20303030301743616C63756C6174656420436865
X636B73756D3A2030302154595045206F66204170706C69636174696F6E20646F
X63756D656E742069733A202443524541544F52206F66204170706C6963617469
X6F6E20646F63756D656E742069733A20115361766520646F63756D656E742061
X733ADF0E4469726563746F72792066756C6CDE094469736B2066756C6CDC0349
X2F4FD41857726974652070726F746563746564206469736B65747465D30B4669
X6C65206C6F636B6564D20D566F6C756D65206C6F636B6564000B46696C652073
X797374656D00000018000000280000263C000000080000002000003F3C0001A9
XF00000010000001481000013810000013200004E1C005C0000001C0132000842
X4E48580000004A49434E23000000564652454600000062424E444C0000006E4D
X454E550001007A444C4F47000300924449544C000300C257494E44000000F243
X4F4445000100FE0000FFFF0000000000004DD80080FFFF0000001C00004DD400
X80FFFF0000012000004DD00080FFFF0000012B00004DCC0002FFFF0000017800
X004DC40001FFFF0000014B00004DC80004FFFF0000040900004DA80003FFFF00
X00037800004DB00002FFFF0000033100004DB80001FFFF0000021200004DC000
X04FFFF0000042200004DA40003FFFF0000039100004DAC0002FFFF0000034A00
X004DB40001FFFF0000022B00004DBC0001FFFF000004B600004DA00000FFFF20
X00136500004D980001FFFF340004CD00004D9C
X***END OF DATA
X***CHECKSUM:11
/*EOF
echo extracting - fromhex.hex
sed 's/^X//' > fromhex.hex << '/*EOF'
X(This file must be converted with BinHex.Hex)
X#APPLCCOM$2000
X***COMPRESSED
X***RESOURCE FORK
X(    0    @    '     %(                     
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(    !031G)O;6AE>"!697)S:6]N(#$N,    !@    H
X(   !B@    (    ( $H/SP  :GP   $Y     %.5@  
X( QM  'YVF<J,"WYVE- 2, K0/_L0F<_+?_X2&W_[$'M
X(/O<+PA.N@.$.U___#M\  'YVDY>3G70551&3%532   
X($Y6   P+?G:0>W[VQ&N  L  %)M^=H,;0( ^=IO!$ZZ
X(/^<3EXNGTYUT%540TA!4B   $Y6__P,;0( ^=AO)CM\
X(  !^=@K?    @#_[$)G/RW_^DAM_^Q![?G<+PA.N@,(
X(#M?__PP+?G80>WYVQ(P  !(@4C!+4'__%)M^=@M;O_\
X(  (3EY.=<=%5$-(05(@  !.5O_^+P="9S\M__I.N@*L
X(#M?__Q"9S\M__A.N@*>.U___#\\  %.N@.Z?@%@!D*M
X(/_@4D<,1TX@;_0_/  !3KH#HJGT+A].7DYUPD%$3D57
X(%,@  !.N@.83E8  "Q?3E4  )_M !!.N@..0>W]W$/Z
X( (((-D@V3M\ 4/^W#M\  'YVCM\ @'YV$)G2&W]W$)G
X($ZZ M0[7__\0F=(;?W<0F<O.@'2+SH!RDZZ G@[7__\
X($)G2&W]W$)G2&W_^$ZZ LX[7__\2FW__&<$3KK_-$)G
X($AM_MQ"9TAM__I.N@&D.U___$IM__QG!$ZZ_Q9"9S\M
X(/_Z2&W_W$ZZ L8[7__\0JW_Y$*M_^A"K?_P0JW_]$JM
X(/_<7L!*K?_T5\'  6<  )I"ITZZ_GXK7__@4ZW_W$*G
X("\M_^!P?R\ J%@K7__@#*T   ! _^!<P RM    4/_@
X(%W!P %G3E*M_^AP0)&M_^!"IR\M_^0_/  $J%PK7__D
X($*G+RW_Y"\M_^"H6RM?_^1"IR\M_^AP 2\ J%A*GV84
X("\M_^1.NOW:("W_Y-&M__!"K?_D#*T   !\_^!F!G !
X("M __1@ /]83KK]<D)G/RW_^$ZZ /8[7__\2JW_]&8$
X($ZZ_BY"IR\M_^@_//__J%P@']&M__!"K?_D.WP  ?_^
X(& ^0J=.NOVL*U__X$*G+RW_X' /+P"H6"M?_^!"IR\M
X(/_D/SP !*A<*U__Y$*G+RW_Y"\M_^"H6RM?_^12;?_^
X( QM  C__F^Z0F<_+?_Z3KH >CM?__P@+?_DL*W_\&<$
X($ZZ_:ZI]$ZZ :1.74ZZ 99.=4Y>3G7&4D]-2$58(  0
X($%04$Q#0T]-!D,@<')O9P!.5O_.0>[_SB%N  X $C%N
X(  , !9"*  :0B@ &T*H !R@ ")N  @RJ  8/4  $DY>
X("!?W_P    *3M!.5O_.0>[_SC%N  @ &* !/4  "DY>
X("!?5(].T%'!8 )0P4Y6_\Y![O_.(6X "  @,6X $  8
X(")N  PA40 D0F@ +$*H "Y* 68$H )@ J #/4  $B)N
X(  ,(J@ *$Y>(E_?_     I.T4Y6_[!![O^P(6X $@ 2
X(#%N !  %D(H !J@"$I 9A9":  <H P@"$/H " B[@ (
X("*N  R@#3U  !9.7B)?W_P    .3M%.5O_.0>[_SB%N
X(  * !(Q;@ ( !9"*  :H D]0  .3EXB7UR/3M%.5O_.
X($'N_\XA;@ . !(Q;@ , !9"*  :H H]0  2(FX "#*H
X(  83EXB7]_\    "D[13E;_SD'N_\XQ;@ , !B@$3U 
X(  .(FX ""*H !Q.7B)?7(].T3\O  2IR"!?5$].T$*O
X(  03G5.=2!?3EU.T"!?3E4  $[0@0  "   !-@     
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                  < %(  4-/
X($1%  $ $D9(15@    J  #__R   !@       '__S0 
X(  T        __\                             
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X(                                           
X***END OF DATA
X***CRC:7F1A
/*EOF