amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (05/08/91)
Submitted-by: grahamw@cpsc.ucalgary.ca (William Graham)
Posting-number: Volume 91, Issue 101
Archive-name: devices/virt-alpha/part02
#!/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 archive 2 (of 4)."
# Contents: learn.asm virt_mean.uu
# Wrapped by tadguy@ab20 on Tue May 7 20:50:17 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'learn.asm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'learn.asm'\"
else
echo shar: Extracting \"'learn.asm'\" \(23663 characters\)
sed "s/^X//" >'learn.asm' <<'END_OF_FILE'
X
Xr_mine equr d0
X
X;learn.asm
X; A robust utility to copy all the qualities of a file
X; other than the contents to another file. Acts
X; exactly like a copy command (because the poor thing once
X; was a copy command...). Accepts wildcards, handles
X; sub directories.
X;
X; (used to be ARP copy, before RESOURCE and ANSELM got to it...)
X
X
X
XLEARN = 1 ; do my version, or else just do ordinary ARP cp
X ; (if unset will compile so closely that "diff" can't detect any diff.)
X
X;COALESCE = 1
X
X;
X; The Arp Copy Command as bastardized by Yours Truly
X;
X; (Source code fd-generated from Resource)
X; Jan 19 1991 AH
X;
X; Compilation generated with genim2
X;
X; "Diff" verified that there is no difference between
X; this resourced and recompiled version, and the original
X; (with the LEARN flag unset)
X;
X; acts as normal, but if name of command is "learn"
X; or some such thing then it outputs smart info...
X;
X
X;a little talk about object oriented programming:
X;
X; qualitatively, what i am trying to do here - by tagging
X; my little bit of code into the copy function - is to
X; access the wildcard and file-pointing functionality
X; of the copy function without having to force my code
X; to have any particular awareness of it.
X;
X; this is representative of a dilemma in computer schlockience
X; which is that there is no clear cut way of visible
X; seperating the "strands" of functionality. Even C++
X; fails to address the issue.
X;
X; More and more as I program I see myself simply being
X; a weaver, weaving together of strings of code from
X; different functions, such that they run interleaved
X; and perform my composite operation.
X;
X; the point is that it would be nice if I didn't have to
X; do that. If i could access wildcarding, recursive
X; directory searching, source file opening, dest
X; file opening in an implicit manner, and allow my
X; compiler to do the final weaving. It might mean
X; a revolution as significant as the spinning jenny.
X;
X
X
X
X
X IFND EXEC_TYPES_I
XEXEC_TYPES_I SET 1
XEXTERN_LIB MACRO
X XREF _LVO\1
X ENDM
XSTRUCTURE MACRO
X\1 EQU 0
XSOFFSET SET \2
X ENDM
XBOOL MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+2
X ENDM
XBYTE MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+1
X ENDM
XUBYTE MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+1
X ENDM
XWORD MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+2
X ENDM
XUWORD MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+2
X ENDM
XSHORT MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+2
X ENDM
XUSHORT MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+2
X ENDM
XLONG MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+4
X ENDM
XULONG MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+4
X ENDM
XFLOAT MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+4
X ENDM
XAPTR MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+4
X ENDM
XCPTR MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+4
X ENDM
XRPTR MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+2
X ENDM
XSTRUCT MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+\2
X ENDM
XLABEL MACRO
X\1 EQU SOFFSET
X ENDM
XBITDEF MACRO *
X BITDEF0 \1,\2,B_,\3
X\@BITDEF SET 1<<\3
X BITDEF0 \1,\2,F_,\@BITDEF
X ENDM
XBITDEF0 MACRO *
X\1\3\2 EQU \4
X ENDM
XLIBRARY_VERSION EQU 33
X ENDC EXEC_TYPES_I
X
X
XZAPTR MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+\2*4
X ENDM
X
XZLONG MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+\2*4
X ENDM
X
XZDOUB MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+\2*8
X ENDM
X
XZWORD MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+\2*2
X ENDM
X
XZBYTE MACRO
X\1 EQU SOFFSET
XSOFFSET SET SOFFSET+\2
X ENDM
X
X
X; IFD LEARN
X
Xmax_PathLen equ 1024
Xmax_CommentLen equ 80
X
X ;
X ; Virtual Info Block Aggregate
X ;
X ; An attempt to store all possible evidence required to
X ; positively identify a specific instance of a file.
X ;
X ; This includes the physical media block number and
X ; other static absolutes.
X ;
X ; This also includes looking at the file to determine
X ; overt file type if any, TEXT,IFF,ARC etc.
X ;
X ; If a file is flagged as in an archive then the name of
X ; that archive is added to the path just prior to the filename.
X ;
X ; If an entire physical media is to be remembered, then
X ; whatever positive identification is stored about that media.
X ;
X
X
X STRUCTURE DateStamp,0
X LONG ds_Days
X LONG ds_Minute
X LONG ds_Tick
X LABEL ds_SIZEOF
X
X STRUCTURE FileInfoBlock,0
X LONG fib_DiskKey ; device specific id?
X LONG fib_DirEntryType ; < 0 = file, > 0 = directory
X STRUCT fib_FileName,108 ; name
X LONG fib_Protection ; sparwed
X LONG fib_EntryType ; ???
X LONG fib_Size ; byte size
X LONG fib_NumBlocks ; block size
X STRUCT fib_DateStamp,ds_SIZEOF ; last date
X STRUCT fib_Comment,80 ; null terminated comments
X STRUCT fib_padding,36 ; unused
X LABEL fib_SIZEOF
X
X
X STRUCTURE VirtualInfoBlock,0
X LONG vir_MyID ; junk
X
X ; Used by COALESCE:
X LONG vir_CheckSum ; Checksum of Entire File
X LONG vir_Size ; File Byte Size
X
X ; Used by other junk:
XCOALSIZE = 12
X
X ZLONG vir_Type,2 ; BITDEFS (IFF/ZOO/NDOS...)
X ZWORD vir_IncSum,8 ; Incremental checksums
X
X ; FIB (more or less):
X ; File Positive ID:
X LONG vir_DiskKey ; Disk Physical Address
X LONG vir_DirEntryType ; < 0 = File, > 0 = Directory
X LONG vir_Protection ; xSPARWED
X LONG vir_EntryType ; ??? (why bother?)
X
X LONG vir_NumBlocks ; File Block Size
X STRUCT vir_DateStamp,ds_SIZEOF ; File DateStamp
X ; Volume Positive ID:
X STRUCT vir_VolID,ds_SIZEOF ; Volume DateStamp Positive ID
X LONG vir_VolType ; Volume Type
X LONG vir_VolDiskType ; Volume Disk Type 'NDOS'...
X ; Indeterminate Length Stuff:
X LABEL vir_Path ; Device:path (may have spaces),0
X LABEL vir_Comments ; Comments if any,0 (terminate)
X ; Align (always force even)
X LABEL vir_SIZEOF ; Warning: Variable Size!
X
X; ENDC
X
X
X_LVOAvailMem equ -$D8 ; exec
X
X_LVORead equ -$2A
Xdat_SIZEOF equ $1A
X_LVOExamine equ -$66
X_LVOUnLock equ -$5A
X_LVOIsInteractive equ -$D8
X_LVOPathName equ -$14a
X_LVODosFreeMem equ -$15C
X_LVOArpExit equ -$17A
X_LVOArpAlloc equ -$180
X_LVOArpOpen equ -$18C ; misc
X_LVOArpQSort equ -$1aa
X_LVOArpPMatch equ -$1b0
X_LVOFindFirst equ -$1B6
X_LVOFindNext equ -$1BC
X_LVOAddDANode equ -$1FE
X_LVOWrite equ -$30
X_LVOPuts equ -$F0
X_LVODeleteFile equ -$48
X_LVOPrintf equ -$E4
X_LVOOpenLibrary equ -$228
X_LVOFreeTrackedItem equ -$1E0
Xan_SIZEOF equ $14
X_LVOCheckAbort equ -$10E
X_LVOGADS equ -$FC
Xfr_SIZEOF equ $1A
X_LVOIoErr equ -$84
X_LVOLock equ -$54
X_LVOAlert equ -$6C
X_LVOFreeDAList equ -$1F8
X_LVOMakeLibrary equ -$54
X
X**********************************************************************
X
XProgStart
X movem.l d0/a0,-(sp)
X lea arplibrary.MSG(pc),a1
X moveq #$1F,d0
X dc.w $2c78,$0004 ; move zero page (4) to a6
X jsr _LVOOpenLibrary(a6)
X tst.l d0
X bne.s lbC000022
X addq.w #8,sp
X move.l #$38036,d7
X jmp _LVOAlert(a6) ; arp missing?
X
XlbC000022 move.l d0,a6
X movem.l (sp),d0/a0
X lea -8(sp),sp
X lea usageCopywild.MSG(pc),a1
X move.l sp,a2
X lea FROMTOAALLSQU.MSG(pc),a3
X jsr _LVOGADS(a6) ; parse!
X tst.w d0
X lea usageCopywild.MSG(pc),a1
X ble lbC000210
X move.l 12(sp),d6
X add.l d6,d0
X moveq #0,d7
X move.l #$31C,d0
X
X; a0 = base pointer
X; d0 = number of elements in region to sort
X; d1 = size of sorted elements in bytes?
X; a1 = user function to perform the comparison
X
X jsr _LVOArpQSort(a6)
X
X rts
X
X jsr _LVOArpAlloc(a6)
X move.l d0,a2
X moveq #$67,d2
X tst.l d0
X beq lbC000234
X move.l #$FF,$10(a2)
X move.w #13,-2(a2)
X move.l 4(sp),a5
X sub.l a4,a4
X move.l a5,a0 ; wildcard source
XlbC000076 move.b (a0)+,d0
X beq.s lbC0000E2 ; parse done?
X cmp.b #'#',d0
X bne.s lbC000090
X move.b (a0)+,d0
X beq.s lbC0000E2
X cmp.b #'?',d0
X bne.s lbC000090
X clr.b -2(a0)
X bra.s lbC000096
XlbC000090 cmp.b #'*',d0
X bne.s lbC000076
XlbC000096 move.l a0,a4 ; handle wildcard source
X clr.b -(a0)
XlbC00009A move.l (sp),a0
X move.l a0,d0
X bne.s lbC0000A6
X lea lbB00045B(pc),a0
X move.l a0,(sp)
XlbC0000A6 moveq #-$1,d5
X moveq #0,d1
XlbC0000AA moveq #0,d4
XlbC0000AC move.b (a0)+,d0 ; wildcard something or other
X beq.s lbC0000DC ; done?
X cmp.b #':',d0
X beq.s lbC0000A6
X cmp.b #'/',d0
X beq.s lbC0000A6
X cmp.b #'*',d0
X beq.s lbC0000D4
X cmp.b #'#',d0
X beq.s lbC0000CE
X addq.l #1,d1
X addq.l #1,d4
X bra.s lbC0000AC
XlbC0000CE tst.b (a0)+
X bne.s lbC0000D4
X subq.w #1,a0
XlbC0000D4 tst.l d5
X bpl.s lbC0000AA
X move.l d1,d5
X bra.s lbC0000AA
X
X
X
XlbC0000DC tst.l d5
X blt.s lbC00010E
X bra.s lbC000112
X
XlbC0000E2 move.l a5,d1 ; lock or file
X moveq #-$2,d2
X jsr _LVOLock(a6) ; thing exists?
X move.l d0,d1
X beq.s lbC00009A ; ???
X move.l d1,d3
X lea $14(a2),a0
X move.l a0,d2
X jsr _LVOExamine(a6) ; examine thing
X tst.l d0
X beq.s lbC000108 ; failed?
X tst.l $18(a2)
X blt.s lbC000108 ; file or dir check???
X move.w #$FFFF,d7
XlbC000108 move.l d3,d1
X jsr _LVOUnLock(a6)
XlbC00010E moveq #0,d4
X moveq #0,d5
XlbC000112 move.l (sp),d0
X move.l a2,a0
X jsr _LVOFindFirst(a6)
X move.l (a2),d3
X bne.s lbC000120
X moveq #1,d6
XlbC000120 move.l d0,d2 ; build dir
X bne.s lbC000150
X bsr.s lbC00017A
X lea $318(a2),a1
X lea $118(a2),a0
X moveq #0,d1
X tst.l $18(a2)
X blt.s lbC00013C
X tst.l d3
X bne.s lbC000146
X moveq #1,d1
XlbC00013C moveq #0,d0
X jsr _LVOAddDANode(a6)
X tst.l d0
X beq.s lbC00014E
XlbC000146 move.l a2,a0
X jsr _LVOFindNext(a6)
X bra.s lbC000120 ; end loop
X
XlbC00014E moveq #$67,d0
XlbC000150 move.l d0,d2
X cmp.w #$E8,d2
X beq.s lbC000182 ; enter copy loop
XlbC000158 move.l $318(a2),a1
X jsr _LVOFreeDAList(a6)
X tst.w d2
X beq lbC000214 ; exit
X lea Cantopens.MSG(pc),a0 ; failure, exit
X cmp.w #$CD,d2
X bra failure
X
XlbC000172 jsr _LVOPuts(a6) ; some checkabort weird
X moveq #0,d2
X bra.s lbC000158
X
XlbC00017A lea lbC000172(pc),a1 ; checkabort
X jmp _LVOCheckAbort(a6)
X
X
X
X ;---------------------------------------------------->>>
XlbC000182 move.l $318(a2),d0 ; next!
X beq lbC000214 ; exit
X move.l d0,a3
X bsr.s lbC00017A ; check abort
X lea 6(a3),a0
XlbC000192 move.l a0,a1
XlbC000194 move.b (a0)+,d0 ; end of string?
X beq.s lbC0001A6
X cmp.b #'/',d0
X beq.s lbC000192 ; skip crap, termstart
X cmp.b #':',d0
X beq.s lbC000192 ; skip crap, termstart
X bra.s lbC000194 ; skip crap
X
XlbC0001A6 move.l a1,-(sp) ; a1 = valid term start
X lea $218(a2),a1
X move.l a5,a0
X bra.s lbC0001B4 ; enter "make dest term"
X
X
X ; destination term = dest term + wildcard substitution...cool...
X
XlbC0001B0 move.b (a0)+,d0
X move.b d0,(a1)+
XlbC0001B4 tst.b (a0) ; copy to end of term
X bne.s lbC0001B0
X move.l (sp)+,a0
X move.l d7,d1 ; something...
X bne.s lbC0001E4
X move.l a4,d1
X beq.s lbC0001F4
X cmp.b #'/',d0
X beq.s lbC0001D0
X cmp.b #':',d0
X beq.s lbC0001D0
X add.w d5,a0
XlbC0001D0 move.b (a0)+,(a1)+ ; done?
X bne.s lbC0001D0
X subq.w #1,a1
X move.l a4,a0
X tst.b (a0)
X beq.s lbC0001DE
X sub.w d4,a1
XlbC0001DE move.b (a0)+,(a1)+
X bne.s lbC0001DE
X bra.s lbC0001F4
X
XlbC0001E4 moveq #':',d0
X cmp.b -1(a1),d0
X beq.s lbC0001F0
X move.b #'/',(a1)+
XlbC0001F0 move.b (a0)+,(a1)+
X bne.s lbC0001F0
XlbC0001F4 lea 6(a3),a0 ; a0 = source name
X lea $218(a2),a1 ; a1 = dest name
X bsr DoCopy
X move.l $318(a2),a1
X move.l (a1),$318(a2)
X jsr _LVODosFreeMem(a6)
X bra lbC000182
X ;----------------------------------------------------<<<<
X
X
X;*****************************************************************************
X;*****************************************************************************
X;*****************************************************************************
X;*****************************************************************************
X
X ;
X ; exit stuff
X ;
X
XlbC000210 jsr _LVOPuts(a6) ; success
XlbC000214 moveq #0,d0
XlbC000216 jsr _LVOArpExit(a6) ; bye
Xfailure lea Cantopens.MSG(pc),a4 ; failure
XlbC00021E jsr _LVOIoErr(a6)
X move.l d0,d2
XlbC000224 move.l $318(a2),a1
X jsr _LVOFreeDAList(a6)
X move.l a4,a0
X move.l sp,a1
X jsr _LVOPrintf(a6)
XlbC000234 moveq #$14,d0
X bra.s lbC000216
X
Xfailure100 lea Outofmemory.MSG(pc),a4 ; failure
X moveq #$67,d2
X bra.s lbC000224
X
Xfailure200 lea Cantopens.MSG(pc),a4 ; failure
X addq.w #4,sp
X bra.s lbC00021E
X
Xfailure300 lea s.MSG(pc),a0 ; aborted
X moveq #0,d0
XlbC00024E move.l a1,-(sp)
X move.l sp,a1
X move.l d0,d2
X jsr _LVOPrintf(a6)
X addq.w #8,sp
X move.l a5,a1
X jsr _LVOFreeTrackedItem(a6)
X move.l (sp),d1
X jsr _LVODeleteFile(a6)
X lea Destinationfi.MSG(pc),a4
X bra.s lbC000224
X
Xfailure500 jsr _LVOIoErr(a6) ; failure
X lea Errorwritings.MSG(pc),a0
X move.l 4(sp),a1
X bra.s lbC00024E
X
Xfailure400 jsr _LVOIoErr(a6) ; failure
X lea Errorreadings.MSG(pc),a0
X move.l (sp),a1
X bra.s lbC00024E
X
X
X
X;******************************************************************************
X;******************************************************************************
X;******************************************************************************
X;******************************************************************************
X; start of modified zone jan 19 91 AH all mods are enclosed by >>><<<
X
X ; a0 = source name
X ; a1 = dest name
XDoCopy move.l d5,-(sp)
X movem.l a0/a1/a3-a5,-(sp)
X tst.l d6
X bne.s DoCopy100 ; say stupid message?
X move.l sp,a1
X lea s.MSG0(pc),a0 ; say " c:gumby..."
X jsr _LVOPrintf(a6)
X ; get file size
X ; d0 = lock
XDoCopy100 move.l (sp),d1 ; d1 = name
X moveq #-$2,d2 ; d2 = mode
X jsr _LVOLock(a6) ; d0 < lock or fail
X move.l d0,d1 ; d1 = lock
X beq failure
X move.l d0,-(sp)
X
X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
X IFD LEARN
X
X ;
X ; Given Lock:
X ;
X ; GET PATH
X ;
X ; GET VOLUME_NODE (the devices) -> DATESTAMP (for Positive ID)
X ;
X ;
X
X ;Length = PathName(Lock, Destination, NumberNames)
X ; D0 D0 A0 D1
X
X ; Get Path:
X ; d0 = lock
X lea PathBuffer(pc),a0 ; a0 = dest
X move.l #max_PathLen/32,d1 ; d1 = max paths (16 of em)
X jsr _LVOPathName(a6)
X lea PathSuccess(pc),a0
X move.l d0,(a0) ; save success state + size
X ; Alternatively ARP discusses a technique of retrieving the
X ; File Path by setting AP_LENGTH to declare AP_BUF space post FIB
X ; (but I don't feel like doing that)
X ; Extract some junk from Lock:
X move.l (sp),a1 ; A1 = Lock << APTR
X add.l a1,a1
X add.l a1,a1
X lea VIB(pc),a0
X ;move.l 4(a1),vir_DiskKey(a0) ; DiskBlock (done later also)
X move.l 16(a1),a1 ; A1 = Volume Node << APTR
X add.l a1,a1
X add.l a1,a1
X move.l 4(a1),vir_VolType(a0) ; Volume->Type (must == 2!)
X move.l 16(a1),vir_VolID(a0) ; Volume->VolDays
X move.l 20(a1),vir_VolID+4(a0)
X move.l 24(a1),vir_VolID+8(a0)
X move.l 64(a1),vir_VolDiskType(a0) ; Volume->DiskType
X
X move.l (sp),d0 ; (restore)
X move.l d0,d1 ; (restore)
X ENDC
X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
X
X ; d1 = Lock
X lea $14(a2),a0 ; (that weird arp thing)
X move.l a0,d2 ; d2 = FIB
X jsr _LVOExamine(a6)
X move.l (sp),d1
X move.l d0,(sp)
X jsr _LVOUnLock(a6)
X move.l (sp)+,d0
X beq failure
X
X move.l $90(a2),d5 ; d5 = sizeof file (max ram)
X ble failure
X
X IFD COALESCE
X move.l #COALSIZE,d5 ; all i need
X move.l d5,$90(a2)
X ENDC
X
X move.l #$20001,d1 ; get some ram
X move.l a6,-(sp)
X dc.w $2c78,$0004 ; move zero page (4) to a6
X jsr _LVOAvailMem(a6)
X move.l (sp)+,a6
X lsr.l #1,d0
X sub.l #$1388,d0
X move.l #$3D0,d1
X cmp.l d1,d0
X bgt.s 1$
X move.l d1,d0
X1$ cmp.l d0,d5
X blt.s 2$
X move.l d0,d5
X2$ move.l d5,d0
X
X ; COALESCE just needs to open a tiny bit of the file to
X ; examine its checksum and size info for validity...
X ; but must be at least this size!
X
X IFD COALESCE
X cmp.l #COALSIZE,d0
X bne failure100
X ENDC
X
X jsr _LVOArpAlloc(a6)
X tst.l d0
X beq failure100
X
X move.l d0,a3
X move.l (sp),d1
X move.l #1005,d2 ; open old
X jsr _LVOArpOpen(a6)
X tst.l d0
X beq failure
X move.l a1,a4
X move.l 4(sp),d1
X move.l #1006,d2 ; open new
X
X IFD COALESCE
X move.l #1005,d2 ; (coalesce just compares)
X ENDC
X
X jsr _LVOArpOpen(a6)
X move.l d0,d1
X beq failure200
X move.l a1,a5
X
X
X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
X IFD LEARN
X lea csumstuff(pc),a1 ; wipe csums for new file
X clr.l (a1)
X clr.l 4(a1)
X ENDC
X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
X
X ; loop... copy it
XDoCopy200 sub.l a1,a1
X jsr _LVOCheckAbort(a6)
X tst.l d0
X bne failure300
X move.l (a4),d1 ; d1 = file handle
X move.l a3,d2 ; d2 = dest ram
X move.l d5,d3 ; d3 = max size
X jsr _LVORead(a6) ; read from old
X tst.l d0
X blt failure400
X beq DoCopy900
X move.l d0,d3 ; d3 = actual size got
X sub.l a1,a1
X jsr _LVOCheckAbort(a6)
X tst.l d0 ; d0 = actual size writ
X bne failure300
X move.l (a5),d1
X ; d1 = file handle
X ; d2 = source/dest ram
X ; d3 = size
X IFND COALESCE
X IFND LEARN
X jsr _LVOWrite(a6) ; write to new
X cmp.l d0,d3 ; writ = wrot?
X bne failure500 ; write error
X ENDC
X ENDC
X
X
X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
X;
X; a truly crude coalesce routine
X;
X; later should rely on externally known virtual token rather
X; than one imbedded in file
X;
X; and handle proper paths, and smarter messaging...
X;
X
X IFD COALESCE
X ; d1 = file handle
X ; d2 = dest ram
X ; d3 = size
X lea somespace(pc),a0
X move.l a0,d2
X move.l #COALSIZE,d3
X jsr _LVORead(a6) ; didn't read enuf
X cmp.l d0,d3
X bne failure500
X
X movem.l d0-d3/a0-a1,-(a7)
X
X lea somespace(pc),a0
X move.l a3,d2 ; d2 = dest ram
X cmp.l #'VIRT',(a3) ; src is virtual?
X beq coal100
X move.l sp,a1
X lea srcnot(pc),a0
X jsr _LVOPrintf(a6)
X bra coal900
Xsrcnot dc.b "source file is not virtual\n",0
X even
Xdestnot dc.b "dest file is not virtual\n",0
X even
Xarediff dc.b "file x is different from file y\n",0
X even
Xaresame dc.b "file x is same as file y\n",0
X even
Xcoal100 cmp.l #'VIRT',(a0) ; dest is virtual?
X beq.s coal200
X move.l sp,a1
X lea destnot(pc),a0
X jsr _LVOPrintf(a6)
X bra coal900
X
Xcoal200 move.l vir_CheckSum(a0),d0
X cmp.l vir_CheckSum(a3),d0
X bne coal300
X move.l vir_Size(a0),d0
X cmp.l vir_Size(a3),d0
X beq coal400
Xcoal300 move.l sp,a1
X lea arediff(pc),a0
X jsr _LVOPrintf(a6)
X bra coal900
Xcoal400 move.l sp,a1
X lea aresame(pc),a0
X jsr _LVOPrintf(a6)
X bra coal900
X
Xcoal900 movem.l (a7)+,d0-d3/a0-a1
X bra DoCopy900
X
X ENDC
X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
X
X
X
X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
X IFD LEARN
X;
X; checksum a word every 4096 bytes or last, keep building long checksum
X; output to file
X;
X; checksum is a cyclic redundancy checksum, in such a way that later on
X; if i have one of the sources i wish to compare it against it can be
X; "dismantled" and act as a "diff" (not quite a zero-sum-proof but...).
X;
X ; d1 = file handle
X ; d2 = source ram
X ; d3 = size
X movem.l d0-d3/a0-a1,-(a7)
X move.l d2,a0
X lea csumstuff(pc),a1
X movem.l (a1),d1/d2
X moveq #0,d0
X bra.s csum100
Xcsum800 move.b (a0)+,d0 ; read source
X add.l d0,d2 ; add to csum
X ror.b d1,d0 ; prevent additive swap errors
X addq.l #1,d1
Xcsum100 dbf d3,csum800
X movem.l d1/d2,(a1) ; write csum
X movem.l (a7)+,d0-d3/a0-a1
X move.l d3,d0 ; (feign _LVOWrite success)
X ENDC
X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
X
X
X cmp.l $90(a2),d0 ; did it in one pass? wow!
X bne DoCopy200
XDoCopy900
X
X
X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
X; rather than copying the file, write out a virtual info block only.
X
X IFD LEARN
X
X ; add checksums
X lea VIB(pc),a0
X move.l csumstuff+4(pc),vir_CheckSum(a0)
X move.l csums(pc),vir_IncSum(a0)
X move.l csums+4(pc),vir_IncSum+4(a0)
X move.l csums+8(pc),vir_IncSum+8(a0)
X move.l csums+12(pc),vir_IncSum+12(a0)
X
X ; do file info block stuff
X lea $14(a2),A1
X move.l #'VIRT',vir_MyID(a0)
X move.l fib_DiskKey(a1),vir_DiskKey(a0)
X move.l fib_DirEntryType(a1),vir_DirEntryType(a0)
X move.l fib_Protection(a1),vir_Protection(a0)
X move.l fib_EntryType(a1),vir_EntryType(a0)
X move.l fib_Size(a1),vir_Size(a0)
X move.l fib_NumBlocks(a1),vir_NumBlocks(a0)
X move.l fib_DateStamp(a1),vir_DateStamp(a0)
X move.l fib_DateStamp+4(a1),vir_DateStamp+4(a0)
X move.l fib_DateStamp+8(a1),vir_DateStamp+8(a0)
X
X ; path is already added
X
X ; Add Comments (after path)
X lea vir_Path(a0),a0
X move.l PathSuccess(pc),d0 ; d0 <= max_Pathlen (invariant)
X move.l #max_PathLen-1,d1
X cmp.l d1,d0
X bmi.s 0$
X move.l d1,d0
X0$ add.l d0,a0 ; get to end of path name
X clr.b (a0)+ ; terminate path
X lea fib_Comment(a1),a1
X moveq #max_CommentLen-2,d0 ; room is sufficient to hold me?
X1$ move.b (a1)+,d1
X beq.s 2$
X move.b d1,(a0)+
X dbf d0,1$
X2$ clr.b (a0)+ ; terminate comments
X
X lea VIB(pc),a1 ; get size
X sub.l a1,a0
X move.l a0,d3
X cmp.l #vir_SIZEOF+max_PathLen+max_CommentLen,d3
X bcc.s 3$ ; DEBUG
X
X ; Write Virtual stuff part
X move.l (a5),d1 ; d1 = file handle
X move.l a1,d2 ; d2 = source ram
X jsr _LVOWrite(a6) ; d3 = length
X cmp.l d3,d0
X bne failure500
X3$
X ENDC
X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
X
X move.l a5,a1
X jsr _LVOFreeTrackedItem(a6) ; release dest
X move.l a4,a1
X jsr _LVOFreeTrackedItem(a6) ; release src
X move.l a3,a1
X jsr _LVOFreeTrackedItem(a6) ; release work RAM
X tst.w d6 ; say stupid message?
X bne.s 5$
X lea copiedtos.MSG(pc),a0 ; "...copied to x:dumby"
X lea 4(sp),a1
X jsr _LVOPrintf(a6)
X5$ movem.l (sp)+,a0/a1/a3-a5
X move.l (sp)+,d5
X rts
X
X
X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
X IFD LEARN
XVIB dcb.b vir_SIZEOF,0
XPathBuffer dcb.b max_PathLen,0
XCommentsBuffer dcb.b max_CommentLen,0
XPathSuccess dc.l 0 ; success in building path?
Xcsumstuff dc.l 0,0 ; counter.l, master checksum.l
Xcsums dcb.w 8,0 ; incremental checksums.w
X ENDC
X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
X
X
X
X IFD LEARN
XusageCopywild.MSG dc.b 'usage: Learn (wildcards) [TO] (wildcards or dir'
X ENDC
X
X IFND LEARN
XusageCopywild.MSG dc.b 'usage: Copy (wildcards) [TO] (wildcards or dir'
X ENDC
X
X dc.b ') [ALL] [QUIET]',0
XCantopens.MSG dc.b 'Can''t open %s',$A,0
XOutofmemory.MSG dc.b 'Out of memory',$A,0
XErrorreadings.MSG dc.b 10
X dc.b 'Error reading %s',$A,0
XErrorwritings.MSG dc.b 10
X dc.b 'Error writing %s',$A,0
XDestinationfi.MSG dc.b 'Destination file "%s" removed',$A,0
Xarplibrary.MSG dc.b 'arp.library',0,0
XFROMTOAALLSQU.MSG dc.b 'FROM,TO/A,ALL/S,QUIET/S'
XlbB00045B dc.b 0
Xs.MSG dc.b 10
X dc.b '%s',$A,0
Xs.MSG0 dc.b ' %s..',0
X IFD LEARN
Xcopiedtos.MSG dc.b 'learnt to %s',$A,0
X dc.b 0
X ENDC
X IFND LEARN
Xcopiedtos.MSG dc.b 'copied to %s',$A,0
X dc.b 0
X ENDC
X
X IFD COALESCE
Xsomespace dcb.b COALSIZE,0
X ENDC
X
X END
X
X
X;end of modified zone jan 19 91 AH
X;******************************************************************************
X;******************************************************************************
X;******************************************************************************
X;******************************************************************************
X
X
X i need a utility which accepts a path, possibly wildcarded, and possibly
X with "all" set, and that returns to me a lock on each file it finds in
X turn.
X
X
X
END_OF_FILE
if test 23663 -ne `wc -c <'learn.asm'`; then
echo shar: \"'learn.asm'\" unpacked with wrong size!
fi
# end of 'learn.asm'
fi
if test -f 'virt_mean.uu' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'virt_mean.uu'\"
else
echo shar: Extracting \"'virt_mean.uu'\" \(20996 characters\)
sed "s/^X//" >'virt_mean.uu' <<'END_OF_FILE'
Xbegin 666 virt_mean.wp
XM@(`*"@K#`"H>PR)625(Z(B!4:&4@5FER='5A;"!$979I8V6#"@K#`"HGPZD@*
XM;W(@J8,*"L,`*A_#(")0;V]R($UA;G,@1FQO<'1I8V%L(H,*"@H*"@H*"L,`7
XM*A[#4')O:F5C="!#;VYC97!T($1O8W5M96YT@PH*PP`J(\-">2!!;G-E;&T@R
XM2&]O:X,*"L,`*B##3&%S="!%9&ET.B!&96(@-R`Q.3DQ@PH*"@H*4')O;&]G,
XM=64Z"JFIJ:FIJ:FIJ0H*"51H:7,@<')O<&]S86P@8V]N=&%I;G,@87,@:71SW
XM(&UA:6X@=&AE<VES(&%N(&]U=&QI;F4@;V8@=&AE#79I<G1U86P@9&5V:6-E^
XM(&1R:79E<BX@(%1H:7,@<')O<&]S86P@86QS;R!C;VYT86EN<R!O=71L:6YEP
XM<R!F;W(-82!N=6UB97(@;V8@861D:71I;VYA;"!U=&EL:71I97,@<F5L871EX
XM9"!T;R!T:&4@5FER='5A;"!$979I8V4L#7=H:6-H(&UA>2!I;B!F86-T(&)E.
XM('-T<F]N9V5R('-E;&QI;F<@<&]I;G1S('1H870@=&AE(%9)4CH@1&5V:6-E,
XM#6ET<V5L9BP@8G5T(&%R92!N;W0@87,@;F]V96PN"@H)26X@<F5A9&EN9R!T\
XM:&ES('!R;W!O<V%L(')E;65M8F5R('1H870@22!U<V4@=&AE(%9)4CH@9&5VU
XM:6-E#65V97)Y(&1A>2P@87,@=V5L;"!A<R!O=&AE<B!U=&EL:71I97,@9&5S)
XM8W)I8F5D(&AE<F5I;B`H<W5C:"!A<PU%;F-R>7!T*2X*"@E)(&1E9GD@64]5'
XM+"!T:&4@<F5A9&5R+"!T;R!R96%D('1H:7,@<')O<&]S86P@86YD(')E='5R8
XM;B!T;PUY;W5R(&-O;7!U=&5R('=I=&AO=70@82!S:6=N:69I8V%N="!P87)A$
XM9&EG;2!S:&EF="!I;B!T:&4@=V%Y('EO=0UP97)C96EV92!Y;W5R('=O<FMS*
XM<&%C92$*"E9)4CHL(')E;&%T960@=71I;&ET:65S(&%N9"!R96QA=&5D(&UEH
XM;7,*J:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ:FIJ0H*F
XM5DE2.@JIJ:D*"51H92!V:7)T=6%L(&1E=FEC92!I<R!A('!I96-E(&]F('-OU
XM9G1W87)E('=H:6-H('!R;W9I9&5S(&$-9F%S8VEM:6QE('=O<FMS<&%C92!W)
XM:71H:6X@=VAI8V@@86QL('EO=7(@9FEL97,@87!P96%R('1O(&)E+B`-4F5Q0
XM=65S=',@=&\@<F5A9"]W<FET92!A8W1U86P@9&%T82!A<F4@<&%T8VAE9"!O!
XM;G1O('1H92!R96%L#6UE9&EA('=H:6-H(&]W;G,@=&AA="!D871A+@H*"51HO
XM92!625(Z(&1E=FEC92!I<R!E;G1I<F5L>2!S;V9T=V%R92P@86YD(&AA<R!T"
XM:&5S92!M96US.@H*"59I<G1U86S<:@```````-R,":FIJ:FIJ:D*"@E4:&4@I
XM5FER='5A;"!$979I8V4@86QL;W=S('1H92!C;&EE;G0@=&\@<F5A9"]W<FET]
XM92!F:6QE<PUW:&EC:"!A<F4@;F]T(&YE8V5S<V%R:6QY(&]N;&EN92P@=VET(
XM:&]U="!T:&%T(&-L:65N="!H879I;F<@=&\-:VYO=R!T:&4@;&]C871I;VX@6
XM;V8@=&AE('!H>7-I8V%L(&UE9&EA(&]N('=H:6-H('1H92!F:6QE<PUR97-I7
XM9&4N("!2871H97(@=&AE(%9I<G1U86P@1&5V:6-E(&MN;W=S('1H92!M961IG
XM82!L;V-A=&EO;@UI='-E;&8@86YD(')E<75E<W1S(&ET(&EF(&ET(&ES(&YO_
XM="!O;FQI;F4N("!7:&5R92!T:&4@=7-E<B!A;F0-=&AE(&1E=FEC92!D<FEV(
XM97(@<VAA<F4@82!M=71U86QL>2!A9W)E960@=7!O;B!M971H;V0@9F]R#7)E^
XM9F5R:6YG('1O(&%N9"!R971R:65V:6YG(&]F9FQI;F4@;65D:6$N"@H)5')A%
XM;G-P87)E;G0*":FIJ:FIJ:FIJ:FI"@H)5&AE(%9I<G1U86P@1&5V:6-E(&%PG
XM<&5A<G,L(&%N9"!I<RP@:G5S="!A;F]T:&5R(&1E=FEC92!O;@UT:&4@<WES3
XM=&5M+"!M=6-H(&QI:V4@(D,Z(B!I<R!J=7-T(&%N;W1H97(@9&5V:6-E+B`@6
XM5&AI<R!M96%N<PUT:&%T(&YO;JEH=6UA;B!C;&EE;G1S(&-A;B!I<W-U92!RV
XM97%U97-T<R!I;B!A(&1A=&&I=')A;G-P87)E;G0-;6%N;F5R+@H*"4ET<R!II
XM;7!O<G1A;G0@=&\@=6YD97)S=&%N9"!T:&%T('1O(&-A;&P@=&AE(%9I<G1U[
XM86P@1&5V:6-E#6$@1FEL92]$:7-K($UA;F%G97(@:7,@;F]T('%U:71E(')I0
XM9VAT+B`@07,@9F%R(&%S('1H92!S>7-T96T@8V%N#61E=&5C="!I="!I<R!T]
XM:&4@<&AY<VEC86P@<F5S:61E;F-E(&9O<B!A;&P@=&AE(&9I;&5S(&ET(&-L<
XM86EM<PUT;R!H879E+B`@5&AI<R!M86ME<R!I="!A;B!E>'1E;G-I;VX@;V8@3
XM=&AE('5S97)S(&5N=FER;VUE;G0L(&YO=`UM97)E;'D@82!M96UO<GD@86EDZ
XM+@H*"5L@66]U)VQL(&AA=F4@=&\@8F5A<B!W:71H(&UE(&EF('1H:7,@86QLQ
XM('-E96US('!A=&5N=&QY#6]B=FEO=7,N(%T*"@E&;&%T"@FIJ:FI"@H)5DE2V
XM.B!P<F5S96YT<R!A(&9L870@9&%T87-P86-E('1O('1H92!C;&EE;G0L('1H'
XM870@:7,@9FEL97,-:6YS:61E(&]F(&%R8VAI=F5S(&%R92!V:7-I8FQE(&%N,
XM9"!A8V-E<W-I8FQE('1O('1H92!C;&EE;G0N(`U&:6QE<R!P86-K960@;VYT<
XM;R!T87!EJ6)A8VMU<"P@;W(@;W1H97)W:7-E(&1I9F9I8W5L="!T;R!A8V-E(
XM<W,-8V]N=F5N=&EO;F%L;'D@86QS;R!A<'!E87(@=&\@8F4@=FES:6)L92!A)
XM;F0@86-C97-S:6)L92!T;R!T:&4-8VQI96YT("AW:&5R92!625(Z(&%U=&]MD
XM871E<R!T:&4@<')O8V5S<R!O9B!U;G!A8VMI;F<I+@H*"4QE87)N"@FIJ:FI?
XMJ0H*"59)4CH@86-Q=6ER97,@:VYO=VQE9&=E(&]F(&$@9FEL92!B>2!A('5S(
XM97(@97AP;&EC:70-8V]M;6%N9"X@($ET('-T;W)E<R!A<R!M=6-H(&EN9F]RO
XM;6%T:6]N(&%S('!O<W-I8FQE(&%B;W5T('1H90UF:6QE+"!W:71H('1H92!ET
XM>&-E<'1I;VX@;V8@=&AE(&9I;&4@8V]N=&5N=',@:71S96QF+B`@270@87-S'
XM:6=N<PUO<B!A8V-E<'1S(&$@;65D:6$@;G5M8F5R(&9O<B!T:&%T(&1I<VME4
XM='1E("AO<B!T:&EN9RDN"@H)5DE2.B!W:6QL('!E97(@:6YS:61E(&]F('9A[
XM<FEO=7,@='EP97,@;V8@;F]NJ7-T86YD87)D#6%R8VAI=F5S(&%N9"!M961I5
XM82!A<R!P87)T(&]F(&ET<R!D=71Y("A!4D,O3%I(+U%"04LO0TA%151!2"DNX
XM"@H)1VEV96X@=&EM92!Y;W4@8V%N('1E86-H('1H92!625(Z(&5V97)Y('-I,
XM;F=L92!S;V9T=V%R90UP<F]P97)T>2!Y;W4@;W=N+@H*"4-O86QE<V-E"@FI:
XMJ:FIJ:FIJ0H*"4)Y(&UA:6YT86EN:6YG(&$@=FER='5A;"!R969E<F5N8V4@]
XM;V8@979E<GD@<VEN9VQE(&9I;&4@:6[<:@```````-P+>6]U<B!S;V9T=V%R;
XM92!U;FEV97)S92!T:&4@5DE2.B!D979I8V4@:7,@86)L92!T;R!A8W0@87,@1
XM82!V97)Y#6EN=&5L;&EG96YT(&-O86QE<V-E<BX@($%B;&4@=&\@<W!O="!E4
XM=F5R>2!S:6YG;&4@9'5P;&EC871E+"!O<@UN96%R(&1U<&QI8V%T92!I;G-T<
XM86YC92!O9B!E=F5R>2!F:6QE('1H870@>6]U)W9E(&5V97(@=&%U9VAT(&ETC
XM+@I!;F0@8VAA:6X@86QL(&UU;'1I<&QE(')E9F5R96YC97,@=&\@;VYL>2!O)
XM;F4@<F5A;"!I;G-T86YC92P@;W(-=&\@9&5L971E(&%L;"!R961U;F1A;G0@:
XM<F5F97)E;F-E<R!I9B!Y;W4@=VES:"X@(%9)4CH@*FYE=F5R*@UD96QE=&5S)
XM(&]R:6=I;F%L(&UE9&EA+"!I=',@;6]R92!L:6ME(&$@0T2I5T]232!I;B!TJ
XM:&%T(&ET(&IU<W0-9F]R9V5T<R!T:&4@*G)E9F5R96YC92HN"@H)5&AI<R!A/
XM8FEL:71Y(&ES('!A<G1I8W5L87)I;'D@=7-E9G5L(&EF('EO=2!W86YT('1OK
XM(&ME97`*96YT:7)E(&-O<&EE<R!O9B!E;G9I<F]M96YT<R!O;FQI;F4L(&)U0
XM="!D;VXG="!W86YT('1H92!O=F5R:&5A9`UO9B!A8W1U86P@9'5P;&EC871EP
XM(&EN<W1A;F-E<R!O9B!A;GD@=71I;&ET:65S('1H97D@;6EG:'0@<VAA<F4NU
XM"@H)22!F:6YD(&ET(&5X=')A;W)D:6YA<FEL>2!U<V5F=6P@87,@82!T;V]LL
XM('1O('-O<G0@86QL('1H90UU;FEQ=64@8V]N=&5N=',@;V8@86QL('1H92!D*
XM:7-K<R!))W9E(&%C8W5M=6QA=&5D(&]V97(@=&AE('EE87)S+@H*"5-E8W5R;
XM90H)J:FIJ:FI"@H)5&AE(%9I<G1U86P@1&5V:6-E(&)U:6QD<R!U<"!I;F-R7
XM96UE;G1A;"!C:&5C:W-U;7,@86-R;W-S#65A8V@@9FEL92!I="`B;&5A<FYS9
XM(BP@86YD(&%S('-U8V@@8V%N(&%C="!A<R!A;B!I;7!L:6-I="!,:6YKJ0U6J
XM:7)U<R!$971E8W1I;VX@J2!B96EN9R!A8FQE('1O(&1O(&-R=61E(")D:69FH
XM<R(@87,@=V5L;"!A<PUA8G-O;'5T92!C;VUP87)E<RX*"@H)5VAA=$ES"@FI8
XMJ:FIJ:D*"@E3;VUE('!E;W!L92!M87D@9FEN9"!I="!U<V5F=6P@=&\@=7-EL
XM('1H92!625(Z(&-A<&%C:71Y(&9O<@UD971E<FUI;FEN9R!F:6QE('1Y<&4@F
XM*'=H:6-H(&ET(&1O97,@87,@<&%R="!O9B!I=',@87%U:7-I=&EO;@UP:&%S2
XM93L@;75C:"!L:6ME('1H92!53DE8(")W:&%T:7,B/R!C;VUM86YD*2X*"@E2O
XM96)O;W0*":FIJ:FIJ0H*"4ET('=O=6QD(&)E(&YI8V4@=&\@<W5P<&]R="!!.
XM551/J4)/3U1)3D<@<')O9'5C=',L('=H97)E('1H90U625(Z(&-O=6QD('-AR
XM>2`B4&QE87-E(&EN<V5R="!D:7-K(%@B+"!A;F0@=&AE;B!R97%U97-T(&$@'
XM4D5"3T]4+@H*"E)E;&%T960@571I;&ET:65S.@JIJ:FIJ:FIJ:FIJ:FIJ:FI(
XMJ:D*"@E4:&4@5FER='5A;"!$979I8V4@:7,@<V\@=')I=FEA;&QY('-I;7!L*
XM92!T;R!W<FET92!T:&%T(&ETB0UR96%L;'D@;F5E9',@<V]M971H:6YG('1O`
XM(")P=70@<V]M92!M96%T(&]N(&ET<R!B;VYE<R(N"@H)5&AE<V4@87)E('-O:
XM;64@;W1H97(@<F5L871E9"!B:71S(&]F(&-O9&4@86YD(&ED96%S('1H870-N
XM22=V92!F;W5N9"!M>7-E;&8@;F5E9&EN9R!O<B!W86YT:6YG(&%T('9A<FEO`
XM=7,@=&EM97,N"@H)5&]O;"!";W@*":FIJ:FIJ:FI"@H)06X@24-/3B!T;V]LJ
XM(&)O>"P@82=L82!.95A4+"!E>&-E<'0@<G5N;FEN9R!O9F8@<V-R:7!T<R!N0
XM;W2)#6UE<F5L>2!E>&5C=71I;F<@=&AE(&YA;65D(&EC;VXN"@H)5&AE($YE!
XM6%0@96YV:7)O;65N="!S=6-C97-S9G5L;'D@<V5P97)A=&5S('1H92!I9&5A8
XM(&]F(&'<:@```````-P+=&]O;'-P86-E(&9R;VT@82!D871A<W!A8V4N("!/%
XM;B!T:&4@3F585"!I=',@87,@:68@=&AE('5S97(@:&%S#6$@=VEN9&]W(&9L5
XM>6EN9R!T:')O=6=H('1H96ER(&1A=&%S<&%C92P@=VET:"!A;&P@=&AE:7(@7
XM=&]O;',-:&%N9'D@;V9F('1O(&]N92!S:61E+B`@5VAE<F%S(&]N(&]T:&5RN
XM('-Y<W1E;7,@<W5C:"!A<R!T:&4@34%##6%N9"!!34E'02!A;F0@24)-+"!T;
XM:&4@=&]O;&)O>"!A;F0@9&%T87-P86-E(&%R92!M:7AE9"!U<"P@86YD#71H)
XM92!P;V]R('5S97(@:7,@9F]R979E<B!S:'5F9FQI;F<@=VEN9&]W<R!A8F]U1
XM="!T;R!C;&EC:R!O;@UE>&5C=71A8FQE<RX*"@E4:&4@5&]O;"!";W@@=V]UJ
XM;&0@9F5A='5R92!A(&-L;V-K+"!A('1R87-H8V%N+"!A;F0@86QS;R!T:&4-F
XM96YT<GD@<&]I;G0@=&\@5DE2.B!P<FEV:6QI9V5D(&-O;6UA;F1S+"!S=6-H*
XM(&%S($Q%05).+"!#3T%,15-#12X*"@E&:6YA;&QY('1H92!4;V]L($)O>"!WJ
XM;W5L9"!H879E(&$@<&]W97(@;V9F(&)U='1O;BP@=VAI8V@-=V]U;&0@:7-SC
XM=64@86X@;W)C:&5S=')A=&5D('!O=V5R(&]F9B!R97%U97-T('1O('1H92!EK
XM;G1I<F4-<WES=&5M+"!S=6-H('1H870@<&%R=&EA;"!W<FET97,@=&\@2$%2M
XM1"!-141)02!A<F4@<')E=F5N=&5D+B`-5&AI<R!F96%T=7)E(&%L;VYE('-HR
XM;W5L9"!T<FEG9V5R(&$@<W!E;F1I;F<@<W!R964@86UO;F<@0D)3#6]W;F5RA
XM<RX*"@E!9&1I=&EO;F%L;'D@J2!A;F0@=&AI<R!I<R!H:6=H;'D@;W!T:6]NJ
XM86P@J2!W:71H(&$@8FET(&]F#6AA<F1W87)E(&ET(&-O=6QD('1U<FX@;V8@4
XM>6]U<B!H87)D9')I=F4@=VAE;B!I="!W87-N)W0@:6X@=7-E"BAO<B!E=F5NP
XM(&1O(&$@<&%R:R]S:'5T9&]W;B!S=7!P;W)T960@:6X@<V]M92!D<FEV97,@+
XM<V]F='=A<F4I+@H*"4%20TA)5D%,"@FIJ:FIJ:FIJ0H*"4%R8VAI=F%L(*D@T
XM<&%R=&EC=6QA<FEL>2!O;B!T:&4@06UI9V$@J2!I<R!O;F4@;V8@=&AE(&UO;
XM<W0-<&]O<FQY(&%D9')E<W-E9"!I<W-U97,N("!)('1H:6YK('=E(&%L;"!P^
XM<F5T='D@;75C:"!K;F]W('=H870-;6%K97,@82!G;V]D(&%R8VAI=F%L('!R,
XM;V=R86TN("!4:&EN9W,@;&EK93H*"@D)2&]L;V=R87!H:6,@(*D@(%)E=&%ID
XM;FEN9R!S;VUE(&EM86=E(&]F('1H92!M87-T97(*"0D)"0D@9&ES:RP@;W(@T
XM870@;&5A<W0@=&AA="!P87)T:6-U;&%R(&1I<VMS"@D)"0D)(&-O;G1E;G1SY
XM('-U8V@@=&AA="!A(&QO<W,@;V8@=&AE(&UA<W1E<@H)"0D)"2!D:7-K(&1O]
XM97-N)W0@<F5S=6QT(&EN(&-O;7!L971E(&9A:6QU<F4*"0D)"0D@;V8@=&AEE
XM(&5N=&ER92!A<F-H:79E+@H*"0E!=71O;6%T960)("`@J2`@0F5I;F<@86)LG
XM92!T;R!P97)F;W)M(&1E;'1A(&%R8VAI=F5S"@D)"0D)(&]N(&$@<F5G=6QAW
XM<B!B87-I<R!W:71H;W5T(&AU;6%N"@D)"0D)(&EN=&5R=F5N=&EO;BX*"@D)A
XM0V]M<')E:&5N<VEV92"I(%)E86P@0F%C:W5P<R!F;W(@4F5A;"!096]P;&4A?
XM("!*=7-T"@D)"0D)(&$@9V5N97)A;"!C;VUP;&%I;G0@86)O=70@<&]O<@H)Q
XM"0D)"2!O<'1I;VX@<V5L96-T86)I;&ET>2`H9&5G<F5E(&]F"@D)"0D)(&-O]
XM;7!R97-S:6]N+"!S<&5E9"!E=&,N*0H*"0E":6=G97-T"2`@(*D@($)E:6YG2
XM(&%B;&4@=&\@:VYO=R!J=7-T(&5X86-T;'D@=VAI8V@*"0D)"0D@9FEL92!I)
XM="!I<R!T:&%T(&ES(&-O;G1R:6)U=&EN9R!T:&4*"0D)"0D@;W1H97(@.34S0
XM(&1I<VMS('1O('1H92!O=&AE<G=I<V4*"0D)"0D@<VEN9VQE(&1I<VL@87)C6
XM:&EV92`H05)'(2DN"@H)5&AE($%M:6=A($-O;6UU;FET>2!I<R!C<GEI;F<@P
XM;W5T(&9O<B!A(&1E8V5N="!!<F-H:79A;`U5=&EL:71Y+"!)(&AA=F4@<V]MF
XM92!N:6-E(&]N97,@;VX@=&AE($U!0RP@86YD('-O;64@3TL@;VYE<R!O;@UTH
XM:&4@24)-+"!B=70@22!J=7-T(&AA=F5N)W0@<V5E;B!A;GET:&EN9R!R96%L)
XM;'D@8V]M<')E:&5N<VEV90UF;W(@=&AE($%M:6=A('EE="X*"@E*54Y+"@FIB
XMJ:FIW&H```````#<C`H)"55N9&5L971E"@D)J:FIJ:FIJ:D*"@E3=&%N9&%R)
XM9"!&:6QE(%5N9&5L971E"@H)"4YO<G1O;B!$:7(*"0FIJ:FIJ:FIJ:FI"@H)2
XM02!P<F]P97(@9&ER96-T;W)Y(&%N9"!S=6)D:7(@9&ES<&QA>2P@87,@=V5L(
XM;"!A<R!S;VUE(&]T:&5R#4YO<G1O;B!T>7!E(%5T:6QI=&EE<RX*"@D)1&5FD
XM<F%G9V5R"@D)J:FIJ:FIJ:FI"@H)02!P<F]P97(@9W)A<&AI8V%L(&AA<F1D)
XM:7-K(&1E9G)A9V=E<CL@;VYE('1H870@<'5T<R!A;&P@=&AE#69R965D('-PX
XM86-E(&YE>'0@=&\@=&AE('1A:6P@;V8@=&AE(&UO<W0@<F5C96YT;'D@86-C\
XM97-S960@9FEL97,N"@H)"5)E86P@0V]P>0H)":FIJ:FIJ:FIJ0H*"4$@9&ESE
XM:R!C;W!I97(@=&AA="!D:7-P96YS97,@=VET:"!T:&4@8V]M;6]N(&ED:6]C:
XM>2!O9@UP<F]T96-T:6]N('-C:&5M97,@8GD@<V-A;FYI;F<@=')A8VMS(&9O3
XM<B!W96%KJ6)I=',@86YD('1H96X-9'5P;&EC871I;F<@=&AE(&UE9&EA(&%C]
XM<F]S<R!T:&4@<V%M92!W<FET9:ES<&QI8V4L('1H=7,-96UU;&%T:6YG('=H$
XM870@=&AE(&AE879Y(&EN9'5S=')Y(&UE9&EA(&1U<&QI8V%T;W)S(&1O+@TH5
XM8F%S:6-A;&QY(&$@<&5R9F5C="!C;W!I97(I("A)(&AA=F4@;F\@:61E82!WE
XM:'D@;F]B;V1Y(&AA<R!D;VYE#6ET+"!E>&-E<'0@=&AA="!F97<@;W1H97(@"
XM<&5O<&QE(&AA=F4@:&%D('1O(&9I9VAT('=I=&@@=&AO<V4-;6]N<W1R;W-IE
XM=&EE<R!T;R!G970@=&AE;2!T;R!R96-O9VYI>F4@82!P<F]T96-T960@9F]RA
XM;6%T*2X*"@D)16YC<GEP=`H)":FIJ:FIJ:D*"@E)=',@<&]S<VEB;&4@=&\@0
XM96YC<GEP="!A;B!E;G1I<F4@;65D:6$@<&%R=&ET:6]N('-U8V@@=&AA=`IT7
XM:&4@96YT:7)E(&UE9&EA(&%P<&5A<G,@=&\@8F4@9V%R8F%G92!U;FQE<W,@-
XM9&5C;V1E9"!A9V%I;G-T(&$-<')O<&5R(&ME>2X*"@E4:&ES(&ME>2!T:&5NY
XM(&EN(&$@<V5N<V4@8F5C;VUE<R!A('9E<GD@<V5C=7)E('!A<W-W;W)D+B`-P
XM4VEN8V4@86QL('1H92!D871A(&]N('1H92!P:'ES:6-A;"!M961I82!I<R!C@
XM>6-L:6-A;&QY(')U;B!L96YG=&@-96YC;V1E9"!A9V%I;G-T('1H92!P87-S[
XM=V]R9"!I="!B96-O;65S(&YO="!P;W-S:6)L92!T;R!S:6UP;'D-(G!A<W,@P
XM=&AR=2!A(&=A=&5W87DB('1O(&-R86-K('1H92!M961I82X@(%)A=&AE<B!T(
XM:&4@96YT:7)E#6UE9&EA(&ES(&)Y(&ET<R!V97)Y(&YA='5R92!O<&5N+"!Y4
XM970@<V5C=7)E+@H*"4D@:&%V92!A;B!I;7!L96UE;G1A=&EO;B!O9B!T:&ES:
XM('-C:&5M92!A<R!O<FEG:6YA;&QY#6-O;F-E:79E9"!O9B!B>2!286YD>2!,:
XM:6YD96XL(&%N9"!)(&AA=F4@8F5E;B!R=6YN:6YG(&ET(&9O<B!O=F5R#3(@T
XM>65A<G,@87,@82!W87D@;V8@<V5C=7)I;F<@;7D@9&%T87-P86-E(&%G86ENK
XM<W0@97)R86YT('!I<F%T97,-86YD('!O;&EC92X*"@E3;R!F87(@:71S('!E2
XM<F9O<FUE9"!F;&%W;&5S<VQY+B`@22!G;R!T:')U(&-U<W1O;7,@=VET:"!M\
XM>0TQ,S`@;65G86)Y=&5S(&]F('%U87-IJ6QE9V%L(&-O9&4@=VET:&]U="!QA
XM=6%L;2P@86YD($D@;&5A=F4-;W1H97(@<&5O<&QE(&%C8V5S<R!T;R!M>2!CV
XM;VUP=71E<B!F;W(@:&]U<G,@;VX@96YD('=I=&AO=70-8V]N8V5R;BX*"@E)5
XM9&5A;&QY('1H92!P87-S=V]R9"!I<R!N;W0@;VYL>2!S96-U<F4L(&)U="!A]
XM;'-O('-L:6=H=&QY#7)E9'5N9&%N="P@:&%V:6YG(&$@=F%L:61I='D@8VAE0
XM8VMS=6T@:6UB961D960@:6X@:71S96QF('-U8VC<:@`````"`-P+=&AA="!A#
XM;B!I;F%D=F5R=&%N="!T>7!I;F<@97)R;W(@9&]E<VXG="!E;F0@=7`@8V]R'
XM<G5P=&EN9R!Y;W5R#65N=&ER92!M961I82`H;75C:"!L:6ME('-O8VEA;"!S4
XM96-U<FET>2!N=6UB97)S*2X*"@E)(&UE;G1I;VX@16YC<GEP="!I;B!S=6-H'
XM(&1E=&%I;"!B96-A=7-E(&ET<R!A(&)I9R!I9&5A+"!B=70-=&AE(&%C='5A4
XM;"!C;V1E(&ES(&]N;'D@,C<P,"!B>71E<R!L;VYG('5N9&5R(&UY(&EM<&QE`
XM;65N=&%T:6]N+@H*"2A.;W<@:&]W(&1O('EO=2!P<F]T96-T(#(W,#`@8GET-
XM97,@9G)O;2!P:7)A8WD_/S\@J2!I;6)E9"!I=`T)(&EN(&$@;75C:"!L87)G9
XM97(@<')O9'5C="$I+@H*"5!R;V1U8W0@1V5N97)A;`H)J:FIJ:FIJ:FIJ:FI+
XMJ:FI"@H)5&AE('!R;V1U8W0@<VAO=6QD(&AA=F4@86X@05)%6%@@<&]R="`H1
XM9F]R($%M:6=A;VED<RDN"@H)5&AE('!R;V1U8W0@:7-N)W0@;F5C97-S87)I-
XM;'D@06UI9V$@4W!E8VEF:6,L(&)U="!A="!T:&4-<V%M92!T:6UE($D@9&]NC
XM)W0@=&AI;FL@:71S(&$@=V5A:VYE<W,@=&\@861D<F5S<R!T:&4@06UI9V$-!
XM36%R:V5T(&]N;'DL(&EF('1H92!D979E;&]P;65N="!C;W-T<R!A<F4@;&]W;
XM(&5N;W5G:"X@($DG9`UP97)S;VYA;&QY(&QI:V4@=&\@=&%C:VQE('1H92!-H
XM04,@87,@82!S96-O;F0@;W!T:6]N("AS:6YC92!M:6YE#6ES(&$@<W1U;FYI<
XM;F=L>2!U;F)E;&EE=F%B;&4@;W)G86YI>F%T:6]N86P@8V%T87-T<F]P:&4AI
XM*2X*"@E!<R!A(&9I;F%L('!O:6YT+"!I;6%G:6YE+"!N;W<@=&AA="!Y;W4@1
XM:&%V92!Y;W5R(&5N=&ER90US>7-T96T@;VX@5DE2.BP@86YD('EO=2=V92!P"
XM97)F;W)M960@82!T;W1A;"!#3T%,15-#12!O;@UE=F5R>71H:6YG+B`@3F]WI
XM('EO=2!W86YT('1O(&UA:V4@82`B<F5A;"(@8F%C:W5P('1O('EO=7(@8G)A^
XM;F0-;F5W+"!J=7-T('!U<F-H87-E9"P@1FQO<'1I8V%L(&AA<F1D<FEV92X@K
XM(%=H870@9&\@>6]U(&1O/R`-4VEM<&QY(&1R86<@=&AE(%9)4CH@9&5V:6-E[
XM(&EC;VX@;W9E<G1O<"!T:&4@1FQO<'1I8V%L($EC;VXN"@H*06YS96QM($AO#
XM;VL*J:FIJ:FIJ:FIJ:D*"@E)('=A;G0@=&\@96UP:&%S:7IE(&UY<V5L9B!A!
XM(&QI='1L92!B:70@:&5R92!B96-A=7-E(&ET<PUI;7!O<G1A;G0@=&\@;6%K`
XM92!C;&5A<B!M>2!C;VUP971E;F-E(&EN(')E;&%T:6]N('1O('1H:7,-<')O#
XM:F5C="X*"@E))W9E('=R:71T96X@82!F97<@87)C861E(&=A;65S(&AE<F4@=
XM86YD('1H97)E+"!C97)T86EN;'D-=V]R:V5D(&]N(&$@;&]T+"!S=6-H(&%S[
XM+"!6241%3ZE+2413+"!:3T]-+"!35T]21"!/1B!33T1!3B!!34E'02P-2%E"H
XM4DE3+"!"05143$4@4U%504123TXL($1204=/3E,@3$%)4B!)22P@5D]25$58+
XM+"!$051!4U1/4DTL($U3#5!!0R!-04X@4T5'02X*"@E"=70@8F5F;W)E(&%LZ
XM;"!T:&%T($D@<W!E;G0@=VAA="!I<R!S=&EL;"!T:&4@;6%J;W)I='D-<&]R6
XM=&EO;B!O9B!M>2!P<F]G<F%M;6EN9R!C87)E97(@=V]R:VEN9R!I;B!T:&4@C
XM3VEL(%!A=&-H.R!W:&5R90U)(&1I9"!T:&4@;6%I;B!B;V1Y(&]F(&UY('=O&
XM<FL@*&)U="!O9B!C;W5R<V4@;7D@86-C;VUP;&ES:&UE;G1S#71H97)E(&%R>
XM96XG="!R96%L;'D@=FES:6)L92!T;R!A;GEB;V1Y(&]U='-I9&4@;V8@=&AEQ
XM(&-O;7!A;GD@9F]R#7=H;VT@22!W;W)K960I+B`@5&AI<R!M96%N<R!T:&%T/
XM(&UY(&-O9&4@:7,@=F5R>2!C;&5A;BP@86YD#7-H87)A8FQE.R!Y970@;F]TR
XM(&)I>GIA<F5L>2!O8F9U<V-A=&EN9RDN"@H)22=V92!W;W)K960@870@82!L>
XM;W0@;V8@9&EF9F5R96YT($-O;7!A;FEE<RP@22!A8W1U86QL>2!S965M#71O\
XM(&AA=F4@82!B860@:VYA8VL@;V8@8F%N:W)U<'1I;F<@86QL(&UY($5M<&QOJ
XM>65R<R"I(&YO(&9A=6QT(&]F#6UI;F4@22!A<W-U<F4@>6]U(2`@22!T:&EN&
XM:R!T:&%T($D@:&%V92!A('1E;F1E;F-Y('1O(&]V97)W:&5L;0UT:&5M('=I;
XM=&@@:61E87,@86YD('1H97D@:G5S="!E>'!L;V1E(*D@;F%T=7)A;"!C875S2
XM97,N+BX*"@E"=70@8GD@=V]R:VEN9R!A="!S;R!M86YY(&1I9F9E<F5N="!OX
XM<F=A;FEZ871I;VYS+"!A;F0@;V9T96X-870@<W5C:"!C;&]S92!D:7-T86YC%
XM92!T;R!T:&4@97AE8W5T:79E+"!))W9E(&=A:6YE9"!Q=6ET92!A;@UI;G-I1
XM9VAT(&EN=&\@=VAA="!M86ME<R!A($-O;7!A;GD@=V]R:RP@86YD('=H870@P
XM;6%K97,@<')O9'5C='/<:@`````"`-P+=V]R:RX*"@E!="!T:&4@;6]M96YTH
XM($D@9FEN9"!M>7-E;&8@=F5R>2!F<G5S=')A=&5D(&)E8V%U<V4@22!K;F]WD
XM#7!R96-I<V5L>2!E>&%C=&QY('1E8VAN:6-A;&QY('=H870@=&\@9&\@=&\@4
XM<'5T(&$@<')O9'5C=`UT;V=E=&AE<BP@8G5T($D@<VEM<&QY(&1O;B=T(&AA-
XM=F4@=&AE('1I;64@=&\@861D<F5S<R!A;&P@=&AE#7!R;V1U8W1S('1H870@`
XM22!W:7-H('1O(&1O+@H*"4EF('EO=2!W:7-H('1O('-E92!A('!I8W1U<F4@)
XM;V8@;64@9V]T;R!Y;W5R(&YE87)E<W0-<V]F='=A<F4@<F5T86EL97(@86YDD
XM('1A:V4@82!L;V]K(&%T('1H92!I;G-I9&4@:F%C:V5T(&]F(%-%1T$-4U=/:
XM4D0@3T8@4T]$04XN"@H)5VAA="!%;'-E($D@:VYO=SH*":FIJ:FIJ:FIJ:FI`
XMJ:FIJ:FI"@H)2&]W('1O('=R:71E(&%N(&5X=&5N9&5D($1/4R!H86YD;&5RS
XM(&9O<B!T:&4@24)-(&EN(#@P,C@V#6UA8VAI;F4@8V]D92$@*&EN8VQU9&EN[
XM9R!215-%5"!T;R!L96%V92!04D]414-4140@34]$12$I("AW;W<A*2X*"@E-:
XM>2!I;G1E<F5S=',*":FIJ:FIJ:FIJ:FIJ0H*"4DG;2!C=7)R96YT;'D@<'5RR
XM<W5I;F<@82!B:70@;V8@56YI=F5R<VET>2!%9'5C871I;VXN"@H)22=M(&UO]
XM<W0@:6YT97)E<W1E9"!I;B!T:&4@;F%T=7)E(&]F(&-O;7!U=&5R(&QA;F=U`
XM86=E<RP@86YD#6QA=&5L>2!))W9E(&)E96X@97AP;&]R:6YG('1H92!%249&O
XM14P@3T]04R!S>7-T96TN"@H)5&AE(&ED96$@;V8@0UE"15)34$%#12!E>&-I5
XM=&5S(&UE+"!A;'1H;W5G:"!)(&)E;&EE=F4@=&AE#79E<FYA8W5L87(@<&5R3
XM8V5P=&EO;B!O9B!I="!I<R!A(&)I="!U;F-L96%R+B`@22!B96QI979E(&ENT
XM('1H90UI9&5A(&]F(&%N($%N=&EC:7!A=&]R>2!$96UO8W)A8WD@86)O=F4@`
XM86YD(&)E>6]N9"!T:&4@:61E82!O9@U#>6)E<G-P86-E("AB=70@=&AE;B!#P
XM>6)E<E-P86-E(&ES(&IU<W0@;F]W(&AI='1I;F<@8V]M;6]N('!R97-S#7=HM
XM97)E87,@(G5S(&AA8VME<G,B('=E<F4@97AP;W-E9"!T;R!T:&4@:61E82!ON
XM=F5R(&$@9&5C861E(&%G;RDN(`U))V0@;&EK92!T;R!S964@=&5C:&YO;&]G[
XM>2!L:6ME('1H:7,@:&5L<"!M86YK:6YD(&-H87)T(&$@8V]U<G-E#6]U="!OY
XM9B!T:&4@=')E86-H97)O=7,@>65A<G,@86AE860@*'=O=6QD;B=T('=E(&%L(
XM;"DN"@H)22!E;FIO>2!T96%C:&EN9RP@22!A;2!T>7!I8V%L;'D@82!F86ER2
XM;'D@<'5B;&EC('!E<G-O;B!W:71H#6UY('!R;V=R86T@8V]D92!I;B!T:&%TE
XM('=A>2P@<V5E(&UY(%!$(%1%5%))4R!O;B!&<F5D($9I<V@@(S,R-`TH;W)I2
XM9VEN86P@=6ZI>6%N:V5D(&5D:71I;VYS*2!O<B!$24U%3E-)3TY3(&]N($9R*
XM960@1FES:"`C,30N("!)#6QI:V4@=&\@=&5A8V@@8F5C875S92!)('=A;G0@'
XM=&\@:&5L<"!O=&AE<B!P96]P;&4@;W5T(&]F('!O;W(-<VET=6%T:6]N<R!L,
XM:6ME($D@=V%S(&]N8V4@:6XN"@H)0V]M;75N:71Y"@FIJ:FIJ:FIJ:D*"@E#]
XM86QG87)Y(&ES(&UY(&AO;64@;V8@8VAO:6-E+"!W92!H879E(&%N(')O8G5SQ
XM="!!;6EG80U#;VUM=6YI='D@:&5R92!W:71H('1H92!!+DTN52Y#('5S97)SH
XM(&=R;W5P+"!3=&5V92!697)M=6QE;@TH17AP<F5S<R!086EN="D@86YD(&$@F
XM9V5N97)A;&QY('9E<GD@:&5A;'1H>2!!;6EG82!-87)K970N"@H)37D@9F%TG
XM:&5R(&]W;G,@5&AE($-O;7!U=&5R(%-H;W`L($YO<G1H($%M97)I8V$G<R!/"
XM;&1E<W0*0V]M<'5T97(@4F5T86EL97(L(&]P96YE9"!I;B`Q.3<V(&%N9"!SH
XM=&EL;"!G;VEN9R!S=')O;F<N("!)=',-:&5R92!T:&%T($DG=F4@8F5E;B!MX
XM87-S:79E;'D@97AP;W-E9"!T;R!V:7)T=6%L;'D@979E<GD@;F5W#7)E=&%IN
XM;"!S;V9T=V%R92!P<F]D=6-T(&EN(&5X:7-T86YC92`H87,@=V5L;"!A<R!H?
XM879I;F<@;7D@<&EC:PUO9B!T:&4@8VAO:6-E<W0@:&%R9'=A<F4I+@H*"4]NV
XM92!O9B!M>2!S96QF(&1E<')E8VEA=&EN9R!J;VME<R!I<R!T:&%T($D@=7-E8
XM9"!T;R!B92!O;F4-;V8@=&AO<V4@5VAI>B!+:61S+"!B=70@;F]W($DG;2!J4
XM=7-T(&]L9"$@($)U="!A="`R,R!Y96%R<R!O9B!A9V7<:@`````"`-P+22=M3
XM('!R;V)A8FQY(&]N92!O9B!T:&4@;6]S="!E>'!O<V5D(&]L9'-T97)S(&%RQ
XM;W5N9"X@($%N9"!H97DA#6]N;'D@,B!M;W)E('EE87)S('1I;&P@<F5T:7)EV
XM;65N="$@*$%P<&%R96YT;'D@;6]S="!H:6=H#7!R97-S=7)E('!R;V=R86UMK
XM97)S(&MI8VL@:70@870@86=E(#(U("AE:71H97(@8G5R;F]U="!O<B`D)"D@\
XM*2X*"@D)"0D)"0D)"0E9;W5R<R!4<G5L>0H*"0D)"0D)"0D)"4%N<V5L;2!(=
XM;V]K"@H*4W5P<&QE;65N=&%R>2!-871E<FEA;',*J:FIJ:FIJ:FIJ:FIJ:FI3
XMJ:FIJ:FIJ:D*"@EC;W!Y(&]F(&PZ5FER='5A;*E(86YD;&5R"@EC;W!Y(&]FL
XM(&1E=G,Z;6]U;G1L:7-T"@EC;W!Y(&]F(&,Z;&5A<FX*"6-O<'D@;V8@8SICP
XM;V%L"@EC;W!Y(&]F(&,Z96YC<GEP="`@("@@3D]4($E.0TQ51$5$*0H*"7!IA
XM8W1U<F4@;V8@=&]O;&)O>"`@*"!.3U0@24Y#3%5$140@*0H)<&EC='5R92!O'
XM9B!A<F-H:79A;"!D979I8V4@*"!.3U0@24Y#3%5$140@*0H*"DUO;F5Y(&%N_
XM9"!4:6UI;F<*J:FIJ:FIJ:FIJ:FIJ:FIJ0H*"5!R;VIE8W0@0V]M<&]N96YT-
XM<SH*"0E625(Z"@D)":D^('1O(&UA8VAI;F4@8V]D92`H8W5R<F5N=&QY(&EN:
XM($,I"@D)":D^(')E8V]G;FEZ92!A<F-H:79E<RP@=VAA=&ES"@D)":D^(&1E$
XM8VED92!G;V]D(&1A=&%B87-E(&9O<FUA="`H<&5R9F5C="!H87-H/RD*-2!W/
XM965K<PH)"51/3TP@0D]8.@H)"0FI/B!O<F-H97-T<F%T960@<&]W97(@;V9FA
XM("A!4D586"`G96TI"@D)":D^($%215A8"@D)":D^($-L;V-K("\@1V%R8F%G1
XM90H)"0FI/B!38W)I<'1S"C$@=V5E:PH)"4%20TA)5D4Z"@D)":D^($)A8VMUJ
XM<`H)"0FI/B!#;VUP<F5S<VEO;@H)"0FI/B!!=71O;6%T960*."!W965K<PH)2
XM"4]42$52.@H)"0FI/B!U;F1E;&5T92]D:7(*"0D)J3X@9&5F<F%G"@D)":D^6
XM(')E86QC;W!Y"@D)":D^(&5N8W)Y<'0*,B!W965K<PH*J:FIJ:FIJ:D*"C$V"
XM('=E96MS(&%T("0T,#`P(&$@;6]N("AM:6XI(&9O<B!M>7-E;&8@86YD(&%NU
XM;W1H97(@<')O9W)A;6UE<BX*"JFIJ:FIJ:FIW&H```````#<C"0Q-C`P,"!D5
XM;VQL87)S(%53('1O=&%L(&1E=F5L;W!M96YT(&-O<W0*"DYO="!C;W5N=&EN:
XM9R!B;VYU<ZET;ZES=&%R=`I.;W0@8V]U;G1I;F<@;7D@;W9E<FAE860@*'1IL
XM;64O=')A:6YI;F<O:&%R9'=A<F4I+@H*4V\@:70@;&]O:W,@;&EK92!A="!A'
XM(&UI;FEM=6T@:70@=V]U;&0@=&%K92`T(&UO;G1H<R!A;F0@)#@P,#`-9&]LA
XM;&%R<R!T;R!P<F]D=6-E('1H:7,@<&%C:V%G92!A<W-U;6EN9R!T:&%T($D@L
XM9FEN9"!A(&=O;V0-<')O9W)A;6UE<B!A="!P<F]J96-T('-T87)T+@H*3F]W$
XM($1I<V-O=F5R>2!S;VQD(#4P,#`P('5N:71S(&]F($UA<F%U9&5R(&EN:71I5
XM86QL>2P@86YD('-I;F-E#71H97D@9&ED(&1I<W1R:6)U=&EO;B!T:&5Y(&=O+
XM="`D,34@<&5R('5N:70L('-O('1H871S(&%B;W5T#20Q-3`P,#`P(&]F9B!T(
XM:&%T('!R;V1U8W0N("!4:&5Y(&5N9&5D('5P(&AA=FEN9R!A('1O;B!O9B!SB
XM86QE<PUD=64@=&\@=&AE(&)R86EN9FEL97,@979E;G1U86QL>2`H=')A;G-I5
XM=&EV92!P<F]P97)T>2!O9B!F<F5E#75P9W)A9&5S($D@<')E<W5M92DN"@I3$
XM;R!A="`D,3`@<&5R('5N:70@=&AE(&1I<W1R:6)U=&EN9R!C;VUP86YY('-H[
XM;W5L9"!G96YE<F%T92!A8F]U=`TD-3`P,#`P(&1O;&QA<G,N("!3;R!)(&=U6
XM97-S('1H870@)#@P,#`@87-K:6YG('!R:6-E(&ES(&$@8FET#6QO=RP@22=D3
XM('-U9V=E<W0@=')Y:6YG('1O(&=E="!A8F]U="!D;W5B;&4@=&AA="X*"D%T@
XM('1H92!S86UE('1I;64@=&AE<F4@:7,@=&AE('!R;V)L96T@;V8@<V-O<&4LW
XM('1H92!625(Z(&1E=FEC90UI<R!A('-I;7!L92!L:71T;&4@:61E82P@86YDP
XM('-H;W5L9"!B92!M87)K971A8FQE(&%S('!E<FAA<',-<V5P97)A=&4@;V8@0
XM=&AE(&]T:&5R(&ED96%S(&]N8V4@=&AE<V4@:VEN9',@;V8@;G5M8F5R<R!S$
XM=&%R="!T;PUB92!T:')O=VX@87)O=6YD+@H*665T('1H97)E(&ES;B=T(&%N=
XM>7=A>2!T;R!P<F]T96-T('1H92!P<F]D=6-T(&%G86EN<W0@<F%M<&%N=`UP'
XM:7)A8WD@=6YL97-S('1H92!P86-K86=E(&AA<R!S;VUE(&UO<F4@9W)A;F1IW
XM;W-E('1H96UE+@H*26X@=VAI8V@@8V%S92!I="!B96-O;65S(&%N(&%D=F5R^
XM=&ES:6YG('!R;V)L96T@;V8@=')Y:6YG('1O#65X<')E<W,@=&AE(&9U;F1AZ
XM;65N=&%L(&%P<&QI8V%B:6QI='D@;V8@<')O9'5C=',@87,@9&EV97)S92!A8
XM<R!A#2)625(Z(B!D979I8V4L(&$@(E1O;VQ";W@B(&%N(")!<F-H:79A;"!4G
X:;V]L(B!A;F0@86X@(D5N8W)Y<'1E<B(N"@I"2
X``
Xend
Xsize 14966
END_OF_FILE
if test 20996 -ne `wc -c <'virt_mean.uu'`; then
echo shar: \"'virt_mean.uu'\" unpacked with wrong size!
fi
# end of 'virt_mean.uu'
fi
echo shar: End of archive 2 \(of 4\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 4 archives.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
--
Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.misc.