[net.sources] A Unix-like "ls" program for MS-DOS, v 2.0

nather@ut-sally.UUCP (Ed Nather) (09/30/86)

This version (v2.0) of "ls" for MS-DOS is functionally similar to the
Unix utility "ls" with a few modifications for use in the MS-DOS
environment.  It is an improved version of the program submitted to
net.sources two years ago, and includes the following changes:

     o Automatically adapts to path separators "/" or "\", whichever
       is in normal use;
     o Identifies directories by absolute pathnames, starting at root;
     o A new option (-i) suppresses directory names to permit output
       filenames to be used elesewhere (e.g. in executable .bat files);
     o Permits customizing long and short listing formats separately;
     o Has a few bugs fixed (e.g. accepts filenames in ALL CAPS);
     o Has been separated into individual source files, and has a Makefile;
     o Compiles under Microsoft C (v 3.x or later), CI-C86 and DeSmet C;
     o Includes a uuencoded executable file preconfigured with the best
       possible choices for display format (i.e. the way I like it).

Please submit any bug reports to me.  The present version has been in Beta
test for several months, and I am not aware of any bugs, but Murphy's law
has not been repealed ...

Ed Nather
--------------------------------------------------------------------------


# This is a shell archive.  Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
#
# Wrapped by sally.utexas.edu!nather on Tue Sep 30 10:17:03 CDT 1986
# Contents:  readme notes makefile ls.doc intdefs.h comp.c curdrv.c curpath.c
#	endlin.c first.c gcdate.c getcl.c getpath.c getsize.c longlist.c main.c
#	mname.c next.c putname.c search.c setps.c shortlis.c toscreen.c ls.uue
 
echo x - readme
sed 's/^@//' > "readme" <<'@//E*O*F readme//'
                   Compiling the ls.c program

Define the symbolic constant MSC if compiling with the Microsoft C compiler,
version 3.0 or later.

Define the symbolic constant CIC86 if compiling the with CI-C86 compiler of
Computer Innovations.

Define the symbolic constant DESMET if compiling with DeSmet's C compiler.
Current versions do not permit such definition on the command line; add
the line "#define DESMET" at the top of the file "intdefs.h"

For other compilers: consult the file "intdefs.h" for the symbolic constants
used in the program, together with their definitions for the three above
compilers.  Most compiler differences lie in the DOS interface, so a bit of
work with the compiler manual, using "intdefs.h" as a guide, should yield a
set of workable definitions.

Included in "intdefs.h" are a set of symbolic constants which can be 
customized to get the program to behave the way you like.  Each Boolean 
constant determines the default behavior of one aspect of the program. In most 
cases that default effect can be reversed by including the corresponding flag 
on the command line when "ls" is invoked.  As an example: 

/* customizing constants */

#define ID      1           /* always identify directory if 1 [-i] */
#define ALL     0           /* show hidden files by default if 1 [-a] */
#define LONG    0           /* long listing by default if 1 [-l] */
#define SCOLM   0           /* 1-column short listing by default if 1 [-c] */
#define LCOLM   1           /* 1-column long listing by default if 1 [-c] */
#define RSORT   0           /* reverse sort by default if 1 [-r] */
#define TSORT   0           /* time sort by default if 1 [-t] */
#define DU      0           /* include disk use by default if 1 */

With these initial values, "ls" will identify the directory on the first
displayed line (ID is 1) unless the command line has the "-i" flag, in
which case it will not print the identifying line.  If ID is defined as 0,
the default, and the effect of the flag, are both reversed: the directory
identification line is NOT displayed UNLESS the -i flag appears on the
command line.

This same logic applies to the other variables; choose the defaults that
appeal to you, then reverse them with command line flags when needed.
The above settings are the ones I prefer, but what do I know?

The "makefile" is designed for use with the excellent PD Unix-like version
of the "make" utility written by D. G. Kneller for the IBM PC.  If you do
not have and cannot obtain this utility, you can concatenate all of the
individual source files into one whopper and compile them all together.
You must remove the "#include" lines from the top of all but the first
file (main.c) for this to work.

The file "ls.uue" is a uuencoded executable file compiled with Microsoft C
v 3.0.  The defaults are the way I prefer them: the long single-column
listing and directory identification booleans are on, all others are off.
Recover the executable file using the command

     uudecode ls.uue

and then download the resulting ls.exe file using a BINARY transfer protocol
such as "image mode" in Kermit.

@//E*O*F readme//
chmod u=rw,g=r,o=r readme
 
echo x - notes
sed 's/^@//' > "notes" <<'@//E*O*F notes//'

The "ls" program was compiled using the CI-C86 compiler v 2.10 (cxls.exe),
the DeSmet compiler v 2.3 (dxls.exe) and the Microsoft C compiler v 3.0 
(mxls.exe).  The Microsoft compiler had slightly more source code than the 
other two; an #ifdef added a few extra lines of code to speed up screen 
printing.  

Here are the compile times, using RAMdisk for all of the CIC and DeSmet
compilers, and temp storage for Microsoft, which is too big to fit in
RAMdisk.  Source files were read from hard disk.

Compile times:                 Ratio

cxls.exe    3:37   (217 s)      5.1
dxls.exe    0:42   ( 42 s)      1.0
mxls.exe    2:48   (168 s)      4.0

Here are the resulting file sizes:

d:/work/?xls.exe
--w  15205  30 Jan  8:28p cxls.exe    
--w  17920  30 Jan  5:02p dxls.exe    
--w  12816  30 Jan  8:33p mxls.exe    

Execution times were measured for the command "xls -l d:/bin" which printed
a complete screenful of data; the executable files were in RAMdisk to
minimize loading time.  Output was to screen, and into a file (in RAMdisk).

Execution times:

            To Screen   To file      Ratios

cxls.exe      6.5 s       3.0 s     1.6  1.6
dxls.exe      5.0 s       6.5 s     1.2  3.4
mxls.exe      4.1 s       1.9 s     1.0  1.0


Summary:  

DeSmet compiles 4 times faster than Microsoft, 5 times faster than CIC.
Microsoft generates the smallest code with the fastest execution.
CI-C86 has nothing whatever to recommend it.

Changes to ls:

1. Removed the trailing "/" after directory id; it prohibited using that
   id in .bat files, and served no real purpose.
2. Changed file attribute code so read-only files show "r" and normal
   files show "---".  Revised ls.doc accordingly.
3. Arranged so the program adapts to either "/" or "\" as the pathname
   separator, depending on whether the "switchar" variable has been changed
   from its default value or not.
4. Separated the default conditions for printing short and long listings
   so either can be single column, independent of the other.
5. Added the "-i" option to include (or suppress) directory identification
   on the first displayed line.
@//E*O*F notes//
chmod u=rw,g=r,o=r notes
 
echo x - makefile
sed 's/^@//' > "makefile" <<'@//E*O*F makefile//'
OBJS = main.obj comp.obj getpath.obj mname.obj setps.obj curdrv.obj \
first.obj getsize.obj next.obj shortlis.obj curpath.obj gcdate.obj \
longlist.obj putname.obj toscreen.obj endlin.obj getcl.obj search.obj 

ls.exe : $(OBJS)
	link $(OBJS),ls.exe;

$(OBJS) : intdefs.h $*.c
	cl -c -DMSC $*.c


@//E*O*F makefile//
chmod u=rw,g=r,o=r makefile
 
echo x - ls.doc
sed 's/^@//' > "ls.doc" <<'@//E*O*F ls.doc//'
         ls - a Unix-like directory listing program for MS-DOS

Syntax: ls [-acilrstuR] [(path)name ... ]

    Options may appear in any order, grouped or separated; if separate,
    each must be preceded by a dash.  The name(s) may refer to files or
    directories.  If no name is given the current directory is listed.

Options:

    (none)  Show filenames (only) sorted alphabetically
     -a     all: include system files, hidden files, "." and ".."
     -c     columnar: list information in 1-column format
     -i     don't identify directories
     -l     long listing: include file's size, date, time, attributes
     -r     reverse the sorting direction
     -s     report size(s) only
     -t     sort by time of last file modification
     -u     include actual disk use, with totals & available space
     -R     recursively list all subdirectories

Description:

With no options specified, "ls" lists the filenames in the current directory,
sorted alphabetically into 5 columns; if a (path)name of a directory is
included, its contents will be displayed.  If two or more names are given
they will be sorted and shown successively, identified by their (path)names.
Wild card characters ("*","?") are acceptable in (path)name arguments.  
Pathnames can be separated by either "/" or "\", whichever you normally use.
Subdirectories are identified by a trailing pathname-separator character 
in this display format.  

System files, "hidden" files and the directory synonyms "." and ".." are
normally not included in the listing, but the -a option will bring them out
of the woodwork.  "Volume Labels" are always ignored.  If they have any
logic or value it has been carefully hidden by Microsoft.

The listed filenames will be sorted according to their last modification time
if the -t option is included, normally latest first.  The direction of sort
(alphabetic or time sort) is reversed by the -r option.

The -l option yields a two-column "long" listing, sorted vertically by column,
showing nearly everything known about the files (i.e. all the news that fits).
The file attributes are shown symbolically by single characters: "d" for
directories or "s" for system files, "h" for hidden files, and "w" for writable
(not read-only) files.  The lack of one of these attributes is shown by a dash.
The actual length of the file, in bytes, is given unless the -u option is
included (see below).  The month and time of the last modification are shown if
the file is less than 12 months old, otherwise month and year are printed.

Note that the file sizes displayed in the "long" listing will always be 
smaller than the actual disk space used, because MS-DOS never writes a record 
smaller than the "cluster" size -- which is 1024 bytes on a 9-sector floppy 
and 4096 bytes on a 10 MB hard disk (8192 for 20MB) for DOS 2.x.  DOS 3.x is 
somewhat more reasonable about disk use.  

The -u option tells you how much disk space is actually used.  If only one
filename or directory is listed, its total disk use is shown, followed by
its identifying (path)name.  If the -l option is included with -u, the size
shown for each file is the amount of disk space used -- almost always larger
than the file size. More than one name on the command line will get you
successive listings, with disk use subtotals preceding the identifying
(path)name, and followed by the total disk space used by the files listed.
All this is followed by the space remaining on the drive; if more than one
drive is involved, it is the space remaining on the last one on the command
line.

The first line of a printed block shows the drive and the absolute path to the 
directory, with filenames on the following lines, ending with a blank line.  
You can suppress the directory pathname with the -i option, should you want to 
use the list of filenames in a .bat file or another program, for example.

The -c option forces output into a single column, so "ls -ic" will give a 
sorted list of filenames in a single column, with the directory pathname 
suppressed; "ls -lc" will provide a "long" listing in one column instead of 
two, with the pathname shown.  

The -R option will include (recursively) the contents of any subdirectories
encounterd, and their subdirectories, ad finitum.  This can be a lengthy
listing on a hard disk; if started in the root directory with the -a option
it lists the whole shebang.

The -s option omits filenames (unless they are specified on the command line)
and lists sizes only.  This effectively shuts off the -l, -t and -r options,
and turns -u on, yielding a nifty summary of disk usage by directory, along
with a total at the end and the space remaining on the drive.  Include -a if
you want hidden and system files to show up.

As a special case, the -s option recognizes the numerals "1" and "2" (they
must immediately follow the "s" option) and will use disk block sizes
appropriate to single-sided diskettes (-s1) or double-sided diskettes (-s2)
in the calculatation of actual disk usage.  This is useful if you want to
know if a given set of files is going to fit on a diskette that uses block
sizes different from those on the source disk.  For example, MS-DOS is far
more profligate with disk space on a hard disk than on a floppy, and disk
use appears to "shrink" onto a floppy backup.  These options can tell you
how much shrinkage to expect.

The program includes a built-in pager which stops scrolling after 22 lines
have been displayed on your terminal, and indicates there is more to be
shown if there really is.  A carriage return shows one more line; any other
character gets another screenful.  This action takes place only if the
output device is your console screen -- the pause will not occur if the
output is redirected to any other device or into a file.  Either "q" or
"ctrl-C" will force exit without further output.

Bugs/Deficiencies:

The options are far from being mutually orthogonal; in particular, the
command "ls -u filename", for a single file that is not a directory, gives
a dumb-looking printout.

@//E*O*F ls.doc//
chmod u=rw,g=r,o=r ls.doc
 
echo x - intdefs.h
sed 's/^@//' > "intdefs.h" <<'@//E*O*F intdefs.h//'
#ifdef MAIN
#define EXTERN
#else
#define EXTERN extern
#endif

#ifdef MSC
#include <dos.h>
#define STRUCTURE union REGS r;
#define RAX r.x.ax 
#define RBX r.x.bx
#define RCX r.x.cx 
#define RDX r.x.dx 
#define RSI r.x.si 
#define RDI r.x.di
#define CALLDOS intdos(&r, &r)
#define RESULT r.x.cflag
#define PUTC(i) (tsc) ? putch(i) : fputc(i,stdout)
#define PUTS(i) (tsc) ? cputs(i) : fputs(i,stdout)
#define GETC (bdos(7) & 0xFF) 
#define KBCHECK kbhit()
#endif

#ifdef CIC86
#define STRUCTURE struct{int ax, bx, cx, dx, si, di, ds, es;}r;\
struct{int cs,ss,dz,ez;}s;int x_z;
#define RAX r.ax 
#define RBX r.bx
#define RCX r.cx 
#define RDX r.dx 
#define RSI r.si 
#define RDI r.di
#define CALLDOS  segread(&s); r.ds = s.dz; x_z = sysint21(&r, &r) & 1
#define RESULT x_z
#define PUTC(i) fputc(i, stdout)
#define PUTS(i) fputs(i, stdout)
#define GETC (bdos(7) & 0xFF) 
#define KBCHECK (bdos(0x0B) & 1)
#endif

#ifdef DESMET
#define STRUCTURE extern int _rax, _rbx, _rcx, _rdx, _rsi, _rdi, _rds, _carryf;
#define RAX _rax
#define RBX _rbx
#define RCX _rcx
#define RDX _rdx
#define RSI _rsi
#define RDI _rdi
#define RSI _rsi
#define CALLDOS _rds = -1;_doint(0x21)
#define RESULT (_carryf & 1)
#define PUTC(i) fputc(i, stdout)
#define PUTS(i) fputs(i, stdout)
#define GETC ci()
#define KBCHECK csts()
#endif

/* customizing constants */

#define ID      1           /* always identify directory if 1 */
#define ALL     0           /* show hidden files by default if 1 */
#define LONG    0           /* long listing by default if 1 */
#define SCOLM   0           /* 1-column short listing by default if 1 */
#define LCOLM   1           /* 1-column long listing by default if 1 */
#define RSORT   0           /* reverse sort by default if 1 */
#define TSORT   0           /* time sort by default if 1 */
#define DU      0           /* include disk use by default if 1 */

#define BAR    "\272 "      /* double bar separator for long listing */
#define NAMESIZ 13          /* 12 character name + NULL */
#define ONECS 512           /* cluster size on one-sided floppy */
#define TWOCS 1024          /* cluster size on two-sided floppy */
#define SCRSIZ 22           /* scrolling size of display screen */

EXTERN struct dta                    /* DOS Disk Transfer Address table */
    {
    char reserved[21];               /* used in "find next" operation */
    unsigned char attr;              /* file attribute byte */
    int ftime;                       /* time of last modification */
    int fdate;                       /* date of last modification */
    long fsize;                      /* file size in bytes */
    unsigned char fname[NAMESIZ];    /* filename and extension */
    };

EXTERN struct outbuf       /* output buffer -- array of file structs */
    {
    unsigned oattr;
    unsigned odate;
    unsigned otime;
    long osize;
    unsigned char oname[NAMESIZ+1];
    };

EXTERN struct outbuf *obuf;        /* pointer into outbuf */
EXTERN unsigned char spath[128];   /* holds current pathname string */

/* global variables and flags */

EXTERN int allf;                   /* include hidden & system files */
EXTERN int ll;                     /* long listing */
EXTERN int colm;                   /* 1-column format */
EXTERN int id;                     /* show directory name */
EXTERN int rev;                    /* reverse sort */
EXTERN int tsrt;                   /* timesort the listing */
EXTERN int usage;                  /* print disk usage */
EXTERN int recd;                   /* recursive descent requested */
EXTERN int sizonly;                /* only print sizes */

EXTERN unsigned int qs;            /* pathname separator character */
EXTERN int np;                     /* number of groups printed */
EXTERN int clsize;                 /* size of a cluster, in bytes */
EXTERN int clmask;                 /* clsize-1 for rounding & chopping */
EXTERN int drive;                  /* code number for drive requested */
EXTERN int tsc;                    /* 1 if output is to console screen */
EXTERN long left;                  /* unused space left on disk */
EXTERN long total;                 /* total of sizes encountered */

@//E*O*F intdefs.h//
chmod u=rw,g=r,o=r intdefs.h
 
echo x - comp.c
sed 's/^@//' > "comp.c" <<'@//E*O*F comp.c//'
#include <stdio.h>
#include "intdefs.h"

/* comp - compare size of two entries */

comp(a,b)
struct outbuf *a, *b;
{
int y;

if(tsrt) {
    if(a->odate != b->odate)                           /* if dates differ */
        y = (a->odate < b->odate) ? -1 : 1;            /* that settles it */
    else
        y = (a->otime < b->otime) ? -1 : 1;         /* else compare times */
    return((rev) ? y : -y);
    }
else {
    y = strcmp(a->oname, b->oname);                    /* name comparison */
    return((rev) ? -y : y);
    }
}
@//E*O*F comp.c//
chmod u=rw,g=r,o=r comp.c
 
echo x - curdrv.c
sed 's/^@//' > "curdrv.c" <<'@//E*O*F curdrv.c//'
#include <stdio.h>
#include "intdefs.h"

/* curdrv - get current default drive */

 unsigned char *
curdrv(sp)
unsigned char *sp;
{
STRUCTURE

RAX = 0x1900;                                         /* DOS interrupt 19 */
CALLDOS;                                     /* gets current drive number */
*sp++ = RAX + 'a';                      /* convert to symbolic drive name */
*sp++ = ':';
*sp = '\0';
return(sp);
}
@//E*O*F curdrv.c//
chmod u=rw,g=r,o=r curdrv.c
 
echo x - curpath.c
sed 's/^@//' > "curpath.c" <<'@//E*O*F curpath.c//'
#include <stdio.h>
#include "intdefs.h"

/* curpath - get path to directory on default drive */

 unsigned char *
curpath(sp)
register char *sp;
{
STRUCTURE

*sp++ = qs;

RAX = 0x4700;                        /* DOS interrupt 47 gets path string */
if((RDX = (unsigned)*(sp - 3) - '`') < 0)
    RDX += ' ';                            /* convert drive name to index */
RSI = (unsigned) sp;
CALLDOS;

while(*sp != '\0') {                              /* make string readable */
    *sp = tolower(*sp);
    if(*sp == '\\')
        *sp = qs;
    sp++;
    }
if(*(sp-1) != qs)
    *sp++ = qs;
*sp = '\0';
return(sp);
}
@//E*O*F curpath.c//
chmod u=rw,g=r,o=r curpath.c
 
echo x - endlin.c
sed 's/^@//' > "endlin.c" <<'@//E*O*F endlin.c//'
#include <stdio.h>
#include "intdefs.h"

/* endlin - end a line and watch for screen overflow */

static int lc = 0;                                        /* line counter */

endlin()
{
extern int tsc;                             /* true if output is to screen */
register int c;

if(tsc && ++lc >= SCRSIZ) {        /* pause if output is to console screen */
    fputs("\n\033[7m--More--", stdout);     /* and we've shown a screenful */
    c = GETC;
    fputs("\033[0m\r\033[K ", stdout);
    switch(c) {
        case '\r':                          /* <RETURN> - show 1 more line */
            lc = SCRSIZ - 1;
            break;
        case 'q':                             /* quit with "q" or "ctrl-C" */
        case '\003':
            exit(0);
        default:
            lc = 0;                         /* else show another screenful */
            break;
        }
    return('\b');
    }   
else
    return('\n');
}
@//E*O*F endlin.c//
chmod u=rw,g=r,o=r endlin.c
 
echo x - first.c
sed 's/^@//' > "first.c" <<'@//E*O*F first.c//'
#include <stdio.h>
#include "intdefs.h"

/* find_first - find first file in chosen directory */

find_first(path, dta, mask)
unsigned char *path;
struct dta *dta;
int mask;
{
STRUCTURE

RAX = 0x1A00;                                         /* DOS interrupt 1A */
RDX = (unsigned)dta;
CALLDOS;                                    /* sets data transfer address */

RAX = 0x4E00;                                         /* DOS interrupt 4E */
RCX = mask;        
RDX = (unsigned) path;
CALLDOS;                      /* fills the structure */
return(!RESULT);
}
@//E*O*F first.c//
chmod u=rw,g=r,o=r first.c
 
echo x - gcdate.c
sed 's/^@//' > "gcdate.c" <<'@//E*O*F gcdate.c//'
#include <stdio.h>
#include "intdefs.h"


/* gcdate - get current date (in months) for comparison */

gcdate()
{
STRUCTURE

RAX = 0x2A00;
CALLDOS;
return(RCX * 12 + (RDX >> 8));                         /* yr * 12 + month */
}
@//E*O*F gcdate.c//
chmod u=rw,g=r,o=r gcdate.c
 
echo x - getcl.c
sed 's/^@//' > "getcl.c" <<'@//E*O*F getcl.c//'
#include <stdio.h>
#include "intdefs.h"

/* getcl - get cluster size & space left on requested drive */

getcl(pp)
unsigned char *pp;
{
STRUCTURE
int cs;
extern long left;
extern int drive;

if((RAX = *pp - 'a') < 0)
    RAX += ' ';
drive = RAX & 0x7F;
RDX = drive + 1;                               /* 0 = default, 1 = a, etc */
RAX = 0x3600;
CALLDOS;                                          /* DOS interrupt hex 36 */
if(RAX == 0xFFFF)                                 /* gets free disk space */
    return(0);                                       /* and other goodies */
else {
    cs = RAX * RCX;                               /* ax = sectors/cluster */
    left = (long)cs * RBX;                      /* bx = # unused clusters */
    return(cs);                                      /* cx = bytes/sector */
    }                                   /* dx = drive capacity (clusters) */
}
@//E*O*F getcl.c//
chmod u=rw,g=r,o=r getcl.c
 
echo x - getpath.c
sed 's/^@//' > "getpath.c" <<'@//E*O*F getpath.c//'
#include <stdio.h>
#include "intdefs.h"

/* getpath - get absolute path into search path buffer */

getpath(sp, p)
register char *sp, *p;
{
extern unsigned char *curdrv(), *curpath();

if(*(p+1) == ':') {                         /* if drive specified, use it */
    *sp++ = *p++;
    *sp++ = *p++;
    }
else                                            /* else use current drive */
    sp = curdrv(sp);

if(*p == qs)                               /* if path is absolute, use it */
    *sp++ = *p++;
else
    sp = curpath(sp);                         /* else insert current path */

while(*p != '\0') {                  /* copy & translate rest of pathname */
    if(*p == '.') {                     /* ignore "." starting a pathname */
        if(*++p == '.') {
            while( *(--sp - 1) != qs)       /* if ".." back up 1 pathname */
                ;
            p++;
            }
        if(*p == qs)
            p++;
        }
    else {
        while(*p != qs && *p != '\0')                  /* move 1 pathname */
            *sp++ = *p++;
        if(*p == qs)
            *sp++ = *p++;
        }
    }
*sp = '\0';
return;
}
@//E*O*F getpath.c//
chmod u=rw,g=r,o=r getpath.c
 
echo x - getsize.c
sed 's/^@//' > "getsize.c" <<'@//E*O*F getsize.c//'
#include <stdio.h>
#include "intdefs.h"

getsize(path, nt)       /* get file cluster size */
unsigned char *path;
int nt;
{
if(!nt) {
    if((clsize = getcl(path)) == 0) {       /* get cluster size for drive */
        fprintf(stderr, "Invalid drive: %c\n", *path);
        return(1);
        }
    }
clmask = clsize-1;
return(0);
}
@//E*O*F getsize.c//
chmod u=rw,g=r,o=r getsize.c
 
echo x - longlist.c
sed 's/^@//' > "longlist.c" <<'@//E*O*F longlist.c//'
#include <stdio.h>
#include "intdefs.h"

/* longlist - list everything about files in two columns */

struct llst {               /* structure to hold file information */
    unsigned char *fattr;   /* file attribute pointer */
    long size;              /* file size */
    int day;                /* the day of creation */
    int mnum;               /* month number */
    int yr;
    int hh;                 /* creation times */
    int mm;
    int ap;                 /* am or pm */
    } l;

longlist(k)
int k;          /* total number to list */
{

register int i, m, n;
int cdate;
unsigned char *mon, *mname();

cdate = gcdate();                         /* get current date (in months) */
if(colm)
    n = k;                                    /* set for 1 column listing */
else
    n = (k + 1)/2;                             /* or for 2 column listing */
for(i=0; i < n; i++){
    for(m = 0; (m+i) < k; m += n) {     
        fill(i+m, &l);                             /* fill llst structure */
        mon = mname(l.mnum);                      /* conv month # to name */

#ifdef MSC
        if(tsc){
            cprintf("%s%7ld  %2d %s ", l.fattr, l.size, l.day, mon);
            if(cdate >= (l.yr * 12 +l.mnum) + 12)
                cprintf(" %4d  ", l.yr);         /* print year if too old */
            else 
                cprintf("%2d:%02d%c ", l.hh, l.mm, l.ap);    /* else time */
            }
        else
#endif
            {
            fprintf(stdout, "%s%7ld  %2d %s ", l.fattr, l.size, l.day, mon);
            if(cdate >= (l.yr * 12 +l.mnum) + 12)
                fprintf(stdout, " %4d  ", l.yr);
            else 
                fprintf(stdout, "%2d:%02d%c ", l.hh, l.mm, l.ap);
            }
        putname(i+m);
        if(m+n < k)
            fputs(BAR, stdout);                   /* double bar separator */
        }
    fputc(endlin(), stdout);
    }
return;
}

/* fill - fill long list structure with file information */

fill(i, ll)
register int i;
struct llst *ll;
{
register int j, k;
static unsigned char fbuf[16][4] = {
    "---",
    "--r",
    "-h-",
    "-hr",
    "s--",
    "s-r",
    "sh-",
    "shr",
    "d--",
    "d-r",
    "dh-",
    "dhr",
    "d--",
    "d-r",
    "dh-",
    "dhr"
    };

if((obuf[i].oattr & 0x10) && obuf[i].oname[0] != '.')
    ll->size = clsize;                    /* if directory, use block size */
else
    ll->size = obuf[i].osize;                       /* else use file size */
j = (obuf[i].oattr & 0x10) ? 8 : 0;               /* set file attr offset */
ll->fattr = fbuf[(obuf[i].oattr & 0x07) + j];   /* point to symbolic attr */
ll->day = obuf[i].odate & 0x1F;
ll->mnum = (obuf[i].odate >> 5) & 0x0F;
ll->yr = (obuf[i].odate >> 9) + 1980;
k = obuf[i].otime >> 5;                                /* this is a mess */
ll->mm = k & 0x3f;
ll->ap = ((ll->hh = k >> 6) >= 12) ? 'p' : 'a';
if(ll->hh > 12)
    ll->hh -= 12;
if(ll->hh == 0)
    ll->hh = 12;
return;
}
@//E*O*F longlist.c//
chmod u=rw,g=r,o=r longlist.c
 
echo x - main.c
sed 's/^@//' > "main.c" <<'@//E*O*F main.c//'
/* ls - a Unix-like directory listing program for MS-DOS 2.x
 *
 * Copyright (c) 1984, 1986  R. Edward Nather
 *
 * Define the symbolic constant MSC if compiling with Microsoft C v3.x;
 * Define the symbolic constant CIC86 if compiling with the CI-C86 C compiler.
 * Define the symbolic constant DESMET if compiling with DeSmet C.
 */

#include <stdio.h>
#define MAIN
#include "intdefs.h"

main(argc, argv)
int argc;
unsigned char *argv[];
{
unsigned char *s, *p;
int c = 0;
int nt = 0;

/* pre-set customizing flags */

allf = ALL;             /* include hidden & system files */
ll = LONG;              /* long listing */
colm = 0;               /* 1-column format */
id = ID;                /* show directory name */
rev = RSORT;            /* reverse sort */
tsrt = TSORT;           /* timesort the listing */
usage = DU;             /* print disk usage */

/* process input options */

while(--argc > 0 && (*++argv)[0] == '-') {
    for(s = argv[0]+1; *s != '\0'; s++) {
        switch(*s) {
            case 'a':                             /* -a: list all files */
                allf = (allf == 0);            /* reverse default value */
                break;
            case 'c':                 /* -c: 1-column listing requested */
                colm = (colm == 0);
                break;
            case 'i':               /* -i: suppress pathname identifier */
                id = (id == 0);
                break;
            case 'l':                     /* -l: long listing requested */
                ll = (ll == 0);
                break;
            case 'r':                     /* -r: reverse sort direction */
                rev = (rev == 0);
                break;
            case 's':                           /* -s: print sizes only */
                sizonly = 1;
                clsize = 0;
                if(*(s+1) == '1') {
                    clsize = ONECS;       /* diskuse for 1-sided floppy */
                    s++;
                    nt++;
                    }
                else if(*(s+1) == '2') {
                    clsize = TWOCS;                       /* or 2-sided */
                    s++;
                    nt++;
                    }
                break;
            case 't':                        /* -t: time sort requested */
                tsrt = (tsrt == 0);
                break;
            case 'u':                           /* -u: print disk usage */
                usage = (usage == 0);   
                break;
            case 'R':                   /* -R: recursively list subdirs */
                recd = 1;
                break;
            default:
                fprintf(stderr, "unknown arg %c\n", *s);
                exit(1);
            }
        }
    }

colm = (ll) ? colm ^ LCOLM : colm ^ SCOLM;           /* set listing format */
qs = setps();                          /* select proper pathname separator */
tsc = toscreen();               /* find out if output is to console screen */
obuf = (struct outbuf *)malloc(sizeof(*obuf));     /* point to free memory */

if(argc == 0) {
    argc++;
    (*argv)[0] = (*argv)[1] = '\0';
    }

for(;;) {                                    /* cycle through args present */
    getpath(spath, *argv++);              /* get drive & absolute pathname */
    if(usage || sizonly || ll)
        c = getsize(spath, nt);             /* get use data only if needed */
    if(c == 0)
        search(spath);                              /* go do the hard work */
    if(--argc > 0) 
        spath[0] = '\0';
    else {
        if(usage || sizonly) {
            if(np > 1) {
                fprintf(stdout, "-------\n%7ld bytes total", total);
                if(!nt)
                    fputs("; ", stdout);
                }
            if(!nt)
                fprintf(stdout, "%7ld bytes left on drive %c\n",
                    left, drive + 'a');
            }
        return;
        }
    }
}
@//E*O*F main.c//
chmod u=rw,g=r,o=r main.c
 
echo x - mname.c
sed 's/^@//' > "mname.c" <<'@//E*O*F mname.c//'
#include <stdio.h>
#include "intdefs.h"

/* mname - convert month number to month name */

 unsigned char *
mname(n)
int n;
{
static unsigned char *name[] = {
    "???",
    "Jan",
    "Feb",
    "Mar",
    "Apr",
    "May",
    "Jun",
    "Jul",
    "Aug",
    "Sep",
    "Oct",
    "Nov",
    "Dec"
    };
return((n < 1 || n > 12) ? name[0] : name[n]);
}
@//E*O*F mname.c//
chmod u=rw,g=r,o=r mname.c
 
echo x - next.c
sed 's/^@//' > "next.c" <<'@//E*O*F next.c//'
#include <stdio.h>
#include "intdefs.h"

/* find_next - find the next file in the same directory */

find_next(dta)
struct dta *dta;
{
STRUCTURE

RAX = 0x1A00;
RDX = (unsigned)dta;
CALLDOS;                                          /* set dta */

RAX = 0x4F00;
CALLDOS;                                   /* fill the table */
return(!RESULT);
}
@//E*O*F next.c//
chmod u=rw,g=r,o=r next.c
 
echo x - putname.c
sed 's/^@//' > "putname.c" <<'@//E*O*F putname.c//'
#include <stdio.h>
#include "intdefs.h"

/* putname - convert name to lower case and print */

putname(i)
int i;
{
register int c, j = 0;

while((c = tolower(obuf[i].oname[j])) != 0) {
    PUTC(c);
    j++;
    }
while(j++ < NAMESIZ - 1)                            /* pad to columnarize */
    PUTC(' ');
}
@//E*O*F putname.c//
chmod u=rw,g=r,o=r putname.c
 
echo x - search.c
sed 's/^@//' > "search.c" <<'@//E*O*F search.c//'
#include <stdio.h>
#include "intdefs.h"

/* search - search 'path' for filename or directory */

search(path)
unsigned char *path;
{
struct dta dta;                 /* DOS file data table */
extern struct outbuf;           /* array of file structs */
int pl;                         /* length of initial path */
register int z;                 /* char counter */
register int k = 0;             /* counts number of entries found */
int dironly = 0;                /* dirname (only) requested if 1 */
unsigned char work[80];         /* working path string */
int comp();                     /* string, time comparison routine */
int mask = 0x0010;              /* default attribute mask */
long bytes = 0;                 /* count of disk usage this directory */

if(allf)
    mask = 0x001F;
strcpy(work,path);
pl = strlen(work);                           /* save original path length */

if(work[pl-1] == '/' || work[pl-1] == '\\') {
    dironly = 1;                          /* is a dirname, not a filename */
    strcat(work,"*.*");
    }
else if(!find_first(work, &dta, 6)) {
    strcat(work, &qs);             /* not a normal, system or hidden file */
    strcat(work,"*.*");           /* so it must be a directory - add path */
    pl++;                          /* separator and list everything in it */
    }                  

if(find_first(work, &dta, mask)) {
    do {
        if(dta.attr & 0x08)                        /* ignore volume label */
            continue;
        if(dta.fname[0] == '.' && !allf)              /* unless -a option */
            continue;                              /* ignore "." and ".." */

        obuf[k].oattr = dta.attr;                     /* stash this entry */
        obuf[k].otime = dta.ftime;
        obuf[k].odate = dta.fdate;
        obuf[k].osize = dta.fsize;
        strcpy(obuf[k].oname, dta.fname);

        if(usage || sizonly) {
            if((dta.attr & 0x10) && dta.fname[0] != '.') {
                bytes += clsize;                     /* sum up disk usage */
                }
            else if(dta.fsize) {
                obuf[k].osize = ((dta.fsize + clmask) & (long)(~clmask));
                bytes += obuf[k].osize;
                }
            }

        k++;
        } while(find_next(&dta));
    }
else {
    work[pl] = NULL;
    if(dironly)
        fprintf(stderr, 
           "\nCan't find any entries in a directory named \"%s\"\n", work);
    else {
        if(work[pl-1] == qs)
            work[pl-1] = NULL;
        fprintf(stderr, 
           "\nCan't find a file or directory named \"%s\"\n", work);
        }
    return;
    }

if(pl > 3 && work[pl - 1] == qs)
	pl--;
work[pl] = NULL;                            /* restore directory pathname */
if(np++ && !sizonly)
    fputc(endlin(), stdout);                   /* separate listing blocks */
if(usage || sizonly) {
    total += bytes;                                /* total bytes to date */
    fprintf(stdout, "%7ld  ", bytes);
    }
if(id || usage || sizonly) {
    PUTS(work);                                     /* identify the block */
    fputc(endlin(), stdout);
    }
if(!sizonly) {
    qsort(obuf,k,sizeof(obuf[0]),comp);               /* sort the entries */
    if(ll)
        longlist(k);                                    /* and print them */
    else
        shortlist(k);
    }
if(!recd)
    return;                                             /* quit if not -R */
if(work[pl - 1] != qs) {
    work[pl++] =  qs;
    work[pl] = NULL;
    }
strcat(work, "*.*");
if(find_first(work, &dta, mask))                /* else find all sub-dirs */
    do  {
        if(dta.attr & 0x10 && dta.fname[0] != '.') {
            work[pl] = 0;                             /* discard old name */
            for(z=0; dta.fname[z] != NULL; z++)
                dta.fname[z] = tolower(dta.fname[z]);
            strcat(work, dta.fname);                 /* install a new one */
            strcat(work, &qs);
            search(work);                                  /* and recurse */
            }
    } while(find_next(&dta));
return;
}
@//E*O*F search.c//
chmod u=rw,g=r,o=r search.c
 
echo x - setps.c
sed 's/^@//' > "setps.c" <<'@//E*O*F setps.c//'
#include <stdio.h>
#include "intdefs.h"

/* setps - set pathname separator to conform to MS-DOS switchar value */

setps()
{
STRUCTURE

RAX = 0x3700;                              /* dos int 37 returns switchar */
CALLDOS;
return(((RDX & 0xFF) == '/') ? '\\' : '/');  /* return pathname separator */
}
@//E*O*F setps.c//
chmod u=rw,g=r,o=r setps.c
 
echo x - shortlis.c
sed 's/^@//' > "shortlis.c" <<'@//E*O*F shortlis.c//'
#include <stdio.h>
#include "intdefs.h"

/* shortlist - print a list of names in 5 columns */

shortlist(k)
int k;                                           /* total number to print */
{
register int i, m, n;

if(colm)
    n = k;                                    /* set for 1-column listing */
else
    n = (k + 4)/5;                                         /* or 5-column */

for(i=0; i < n; i++){
    for(m = 0; (i+m) < k; m += n) {
        if(obuf[i+m].oattr & 0x10)
            strcat(obuf[i+m].oname, &qs);             /* mark directories */
        putname(i+m);                                   /* print the name */
        PUTS("   ");       
        }
    fputc(endlin(), stdout);
    }
return;
}
@//E*O*F shortlis.c//
chmod u=rw,g=r,o=r shortlis.c
 
echo x - toscreen.c
sed 's/^@//' > "toscreen.c" <<'@//E*O*F toscreen.c//'
#include <stdio.h>
#include "intdefs.h"

/* toscreen - find out if output is to console screen */

toscreen()
{
STRUCTURE

RAX = 0x4400;
RBX = 1;
CALLDOS;
return((RDX & 1) && (RDX & 0x80));                      /* isdev && iscin */
}
@//E*O*F toscreen.c//
chmod u=rw,g=r,o=r toscreen.c
 
echo x - ls.uue
sed 's/^@//' > "ls.uue" <<'@//E*O*F ls.uue//'
begin 644 ls.exe
M35I@`!H`!``@`-``__]6`P`(&*="%P``'@````$`K`*\`D,7``!*&@``G!H`
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M`````````````````````````%6+[+@(`.B;%5;'1OX``,=&^```QP8Z!0``
MQP8V!0``QP;,!P``QP;F"0$`QP;0"0``QP;D"0``QP9$!P``_TX$@WX$`'\2
M@SXV!0!U`^E3`:',!S0!Z4X!@T8&`HM>!HL?@#\M=>"+7@:+!T")1OJ+7OJ`
M/P!TQHH'*N0]:0!T8G8#Z?P`/5(`=0/IZP`]80!T)SUC`'0XBU[ZB@<JY%"X
M4`!0N#@"4.B<%(/$!K@!`%#H&AB#Q`+K$8,^.@4`=06X`0#K`C/`HSH%_T;Z
MZZ"#/LP'`'4%N`$`ZP(SP*/,!^OH@S[F"0!U!;@!`.L",\"CY@GKU8,^-@4`
M=06X`0#K`C/`HS8%Z\*#/M`)`'4%N`$`ZP(SP*/0">NOQP8P!0$`QP;*!P``
MBU[Z@'\!,74(QP;*!P`"ZP^+7OJ`?P$R=8G'!LH'``3_1OK_1OCI>O^#/N0)
M`'4%N`$`ZP(SP*/D">EF_X,^1`<`=06X`0#K`C/`HT0'Z5+_QP8X!0$`Z4G_
M/6P`=0/I;/\]<@!U`^EW_SUS`'2%/70`=+4]=0!TQ.GT_J',!Z/,!^@5`J/.
M!^BS!Z/H";@8`%#HQ1>#Q`*C-`6#?@0`=13_1@2+7@:+'XMV!HLT,L"(1`&(
M!XM>!H-&!@+_-[A(!U#H'P&#Q`2#/D0'`'4.@SXP!0!U!X,^-@4`=!#_=OBX
M2`=0Z'("@\0$B4;^@W[^`'4*N$@'4.AI"(/$`O].!(-^!`!^!\8&2`<`ZZB#
M/D0'`'4'@SXP!0!T5(,^1@<!?BK_-D('_S9`![A@`%"X,`)0Z.H2@\0(@W[X
M`'4.N#`"4+AY`%#H@A.#Q`2#?O@`=1VA,@4%80!0_S8^!?\V/`6X?`!0N#`"
M4.BS$H/$"EZ+Y5W#58OLN`(`Z/\25H,^Y`D`=#6+7@2+=@:+1`(Y1P)T"CE'
M`G,3N/__ZQ&+7@2+=@:+1`0Y1P1R[;@!`(E&_H,^T`D`=23K'HM&!@4*`%"+
M1@0%"@!0Z-46@\0$B4;^@S[0"0!T!/?8ZP.+1OY>B^5=PU6+[#/`Z)`25U:+
M=@2+?@:`?0$Z=0Z*!4>(!$:*!4>(!$;K"5;HO`"#Q`*+\(H%F#L&S@=T2%;H
M=`*#Q`*+\.M!@#TN=29'@#TN=0Q.BD3_F#L&S@=U]4>*!9@[!LX'=2%'ZQX*
MP'0-1X@$1HH%F#L&S@=U[XH%F#L&S@=U!$>(!$:`/0!UNL8$`%Y?B^5=PU6+
M[#/`Z``2@WX$`7P&@WX$#'X%H<X`ZPF+7@31XXN'S@"+Y5W#58OLN`X`Z-D1
MQT;R`#>-1O)0C4;R4.@,%8/$!(!^^"]U!;A<`.L#N"\`B^5=PU6+[+@.`.BK
M$<=&\@`9C4;R4(U&\E#HWA2#Q`2+7@3_1@2*1O($88@'BUX$_T8$Q@<ZBUX$
MQ@<`BT8$B^5=PU6+[+@.`.AL$<=&\@`:BT8&B4;XC4;R4(U&\E#HF12#Q`3'
M1O(`3HM&"(E&]HM&!(E&^(U&\E"-1O)0Z'H4@\0$@W[^`'4%N`$`ZP(SP(OE
M7<-5B^PSP.@;$8-^!@!U*_]V!.B(!8/$`J/*!PO`=1N+7@2*!RKD4+CH`%"X
M.`)0Z)40@\0&N`$`ZPFAR@=(H\@',\"+Y5W#58OLN`X`Z-00QT;R`!J+1@2)
M1OB-1O)0C4;R4.@!%(/$!,=&\@!/C4;R4(U&\E#H[A.#Q`2#?OX`=06X`0#K
M`C/`B^5=PU6+[+@&`.B.$%=6@S[,!P!T!8M&!.L,BT8$!00`F;D%`/?YB4;^
M,_;K>#/_ZUR+Q@/'N1@`]^F+V`,>-`7W!Q``=!BXS@=0B\8#Q_?I`P8T!04*
M`%#HX!.#Q`2+Q@/'4.A\`X/$`H,^Z`D`=`RX_`!0Z%H0@\0"ZPZX,`)0N``!
M4.AB$(/$!`-^_HO&`\<[1@1\F[@P`E#H^0-0Z)4(@\0$1CEV_G^#7E^+Y5W#
M58OLN`X`Z.$/5HMV!*#.!X@$1L=&\@!'BD3]F"U@`(E&^`O`<P2#1O@@B7;Z
MC4;R4(U&\E#H]1*#Q`3K%HH$F%#H<`B#Q`*(!#Q<=06@S@>(!$:`/`!UY8I$
M_Y@[!LX'=`:@S@>(!$;&!`"+QEZ+Y5W#58OLN`X`Z&\/QT;R`"J-1O)0C4;R
M4.BB$H/$!+@,`/=F]HM6^+$(T^H#PHOE7<-5B^RX"@#H0`]75NC#_XE&^(,^
MS`<`=`6+1@3K"8M&!$"9*\+1^(E&_#/VZ2$!,__I`0&XT@E0B\8#QU#H'@&#
MQ`3_-MH)Z/C\@\0"B4;^@S[H"0!T5E#_-M@)_S;6"?\VU`G_-M()N`0!4.C`
M!X/$#+@,`/<NW`D#!MH)!0P`.T;X?Q#_-MP)N!0!4.B?!X/$!.MZ_S;B"?\V
MX`G_-MX)N!L!4.B'!X/$".MB_W;^_S;8"?\VU@G_-M0)_S;2";@G`5"X,`)0
MZ"(.@\0.N`P`]R[<"0,&V@D%#``[1OA_%/\VW`FX-P%0N#`"4.C]#8/$!NL:
M_S;B"?\VX`G_-MX)N#X!4+@P`E#HX0V#Q`J+Q@/'4.A[`8/$`HM&_`/'.T8$
M?0ZX,`)0N$H!4.AJ#H/$!`-^_(O'`\8[1@1]`^GS_K@P`E#H_@%0Z)H&@\0$
M1CEV_'X#Z=?^7E^+Y5W#58OLN`0`Z.,-5U:+=@2X&`#W[HO8`QXT!?<'$`!T
M%[@8`/?NB]@#'C0%@'\*+G0&H<H'F>L1N!@`]^Z+V`,>-`6+1P:+5PB+7@:)
M1P*)5P2X&`#W[HO8`QXT!?<'$`!T!;@(`.L",\"+^+@8`/?NB]@#'C0%BP<E
M!P`#Q]'@T>`%3@&+7@:)![@8`/?NB]@#'C0%BT<")1\`BUX&B4<&N!@`]^Z+
MV`,>-`6+1P*Q!=/H)0\`BUX&B4<(N!@`]^Z+V`,>-`6+1P*Q"=/H!;P'BUX&
MB4<*N!@`]^Z+V`,>-`6+1P2Q!=/HB4;\BUX&)3\`B4<.BUX&BT;\L0;3^(E'
M##T,`'P%N'``ZP.X80"+7@:)1Q"+7@:#?PP,?@2#;PP,BUX&@W\,`'4%QT<,
M#`!>7XOE7<-5B^RX!`#HKPQ75C/_ZQR#/N@)`'0)5NA`#8/$`NL+N#`"4%;H
M+06#Q`1'N!@`]VX$B]@#'C0%BD$**N10Z$(%@\0"B_`+]G7&ZR&#/N@)`'0,
MN"``4.@!#8/$`NL.N#`"4+@@`%#HZP2#Q`2+QT<]#`!\UUY?B^5=PU6+[+@.
M`.@U#,=&\@!$QT;T`0"-1O)0C4;R4.AC#X/$!/=&^`$`=`SW1OB``'0%N`$`
MZP(SP(OE7<-5B^RX`@#H^PM6@S[H"0!T9/\&I@&#/J8!%GQ9N#`"4+B.`5#H
M+`R#Q`2X!P!0Z%\$@\0"*N2+\+@P`E"XG`%0Z!`,@\0$B\8]`P!T%ST-`'0'
M/7$`=`WK%,<&I@$5`+@(`.L4,\!0Z,4.@\0"QP:F`0``Z^JX"@!>B^5=PU6+
M[+@0`.A^"XM>!(H'*N0M80")1O(+P',$@T;R((M&\B5_`*,R!4")1OC'1O(`
M-HU&\E"-1O)0Z(\.@\0$@W[R_W4$,\#K(HM&\O=F]HE&\"O`4/]V](M&\)E2
M4.@!"Z,\!8D6/@6+1O"+Y5W#58OLN(X`Z!`+5U8S_XF^=O_'AGC_$`"+QXE&
MK(E&JCD&.@5T!L>&>/\?`/]V!(U&L%#H^`J#Q`2-1K!0Z&(.@\0"B4:NB]@#
MW8!_KR]T"HO8`]V`?Z]<=1;'AG;_`0"XJ`%0C4:P4.A0#H/$!.LVN`8`4(V&
M?/]0C4:P4.@E^8/$!@O`=1^XS@=0C4:P4.@I#H/$!+BL`5"-1K!0Z!L.@\0$
M_T:N_[9X_XV&?/]0C4:P4.CO^(/$!@O`=0/IEP'V1I$(=`/IY@"`?IHN=0J#
M/CH%`'4#Z=8`N!@`]^^+V`,>-`6*1I$JY(D'N!@`]^^+V`,>-`6+1I*)1P2X
M&`#W[XO8`QXT!8M&E(E'`K@8`/?OB]@#'C0%BT:6BU:8B4<&B5<(C4::4+@8
M`/?O`P8T!04*`%#H]@F#Q`2#/D0'`'4'@SXP!0!T9?9&D1!T#(!^FBYT!J'*
M!YGK38M&E@M&F'1+H<@'F8M.EHM>F`/($]KWT)DCR"/:N!@`]^^)CG+_B9YT
M_XO8`QXT!8O!BY9T_XE'!HE7"+@8`/?OB]@#'C0%BT<&BU<(`4:J$5:L1XV&
M?/]0Z(;X@\0""\!T`^G__H-^K@-^$XM>K@/=BD>O*N0[!LX'=0/_3JZ+7JX#
MW<9'L`"A1@?_!D8'"\!T%8,^,`4`=0ZX,`)0Z!K]4.BV`8/$!(,^1`<`=0>#
M/C`%`'0>BT:JBU:L`09`!Q$60@=24+@/`E"X,`)0Z)$(@\0(@S[F"0!U#H,^
M1`<`=0>#/C`%`'1U@S[H"0!T4HU&L%#H_PB#Q`+K5(M>K@/=QD>P`(.^=O\`
M=`F-1K!0N+`!ZQ^+7JX#W8I'KRKD.P;.!W4(BUZN`]V(9Z^-1K!0N.,!4+@X
M`E#H)@B#Q`;I`P&X,`)0C4:P4.C!"(/$!+@P`E#H9/Q0Z``!@\0$@SXP!0!U
M)[B>`E"X&`!05_\V-`7H^`B#Q`B#/C8%`'0&5^CS^.L$5^B?]X/$`H,^.`4`
M=0/IKP"+7JX#W8I'KRKD.P;.!W06BUZN_T:N`]V@S@>(1["+7JX#W8AGL+@6
M`E"-1K!0Z)D+@\0$_[9X_XV&?/]0C4:P4.AP]H/$!@O`=&3V1I$0=$^`?IHN
M=$F+7JX#W<9'L``S]NL0BD*:*N10Z(8`@\0"B$*:1H!ZF@!UZHU&FE"-1K!0
MZ$4+@\0$N,X'4(U&L%#H-PN#Q`2-1K!0Z'/\@\0"C89\_U#HI/:#Q`(+P'6<
M7E^+Y5W#58OLBF8$BU8&BD8(S2%=PU6+[%=6BW8$BWX&_TT"@WT"`'P,B\:+
M'?\%B`<JY.L(5U;H'@V#Q`1>7XOE7<-5B^R+7@3VA\L#`70'B\,%(`#K`XM&
M!(OE7<-5B^PSP.@3!XU&!E#_=@3H!`"+Y5W#58OLN&(!Z/P&C8:B_J/Z!(M&
M!J/V!,<&!@4``.F7`8`_)70#Z2H!QP8`!0$`,\"C_@2C\`2C`@6C]`2C^`2C
M\@2C"@6C#`7'!OP$(`#K.XM>!(`_+74&_P8,!>LMBUX$@#\K=0S_!OX$QP;R
M!```ZQF+7@2`/R!U#8,^_@0`=0K_!O($ZP3_!@H%_T8$BUX$B@>84.CA!8/$
M`@O`=;'_=@2X!`50Z$\%@\0$B48$B]B`/RYU%_\&^`3_1@3_=@2X``50Z#$%
M@\0$B48$BUX$@#]L=0G'!O0$`@#_1@2+7@2`/P!U`^G9`(H'F(F&GOX]10!T
M"CU'`'0%/5@`=0G_!O`$@X:>_B"+AI[^+6,`/14`=SX#P),N_Z?\#_\&`@7'
M!@H%``"X"@!0Z)P`@\0"ZU:X"`#K\K@0`.OM,\!0Z-$!Z^FX`0#K]?^VGO[H
M5@+KVXM&!$")AJ#^ZSKD#\`/Z0_I#^D/\@_R#_(/\@_R#_(/\@_2#_(/\@_R
M#]P/\@^\#_(/\@_7#_]&!.LJ@#\E=`W_AJ#^BYZ@_H`_`'7NBX:@_BM&!%#_
M=@3HY@*#Q`2+AJ#^B48$BUX$@#\`=`/I7OZA!@6+Y5W#58OLN!@`Z#0%5H-^
M!`IT!/\&`@6#/O0$`'06BQ[V!(L'BU<"B4;XB5;Z@P;V!`3K*8,^`@4`=!"+
M'O8$BP>)1OC'1OH``.L-BQ[V!(L'F8E&^(E6^H,&]@0"@SX*!0!T#8M&^`M&
M^G0%BT8$ZP(SP*,(!:'Z!(E&](,^`@4`=2Z#?OH`?2B#?@0*=1N+V/]&],8'
M+8M&^(M6^O?8@](`]]J)1OB)5OK'1O8!`.L%QT;V``"-1NB)1OS_=@10_W;Z
M_W;XZ$X*@\0(@S[X!`!T)_]V_.CO!X/$`HL.``4KR(E._NL)BU[T_T;TQ@<P
MBT;^_T[^"\!_[8M>](MV_(H$B`>#/O`$`'0+BU[T@#]A?`.`+R#_1O2+7OS_
M1OR`/P!UUH,^`@4`=12A_@0+!O($=`N#?O8`=06X`0#K`C/`4.B^`8/$`EZ+
MY5W#58OLN`@`Z.H#QP;\!"``@WX$`'02QT;X`0"A]@2#!O8$`HE&_.LUBQ[V
M!(L'B4;\@P;V!`(+P'4%QT;\&@+_=OSH-P>#Q`*)1OB#/O@$`'0+H0`%.4;X
M=@.)1OBA!`4K1OB)1OZ#/@P%`'4'4.C<`(/$`O]V^/]V_.@$`8/$!(,^#`4`
M=`G_=O[HP`"#Q`*+Y5W#58OLN`(`Z%<#H?8$B4;^@S[X!`!U!L<&``4&`/\V
M\`3_-@`%_W8$_S;Z!/]V_NC4"(/$"H-^!&=T!H-^!$=U&(,^"@4`=1&#/@`%
M`'0*_S;Z!.BZ"(/$`H,^"@4`=!&#/@`%`'4*_S;Z!.BL"(/$`H,&]@0(QP8(
M!0``H?X$"P;R!'02_W;^Z*,(@\0""\!T!;@!`.L",\!0Z(<`B^5=PU6+[#/`
MZ+@"_W8$Z%0#@\0"_P8&!8OE7<-5B^RX`@#HG@*+1@2)1OX+P'X=ZPK_-OP$
MZ"T#@\0"BT;^_T[^"\!_[(M&!`$&!@6+Y5W#58OLN`(`Z&H"BT8&B4;^ZQ"+
M7@3_1@2*!YA0Z/<"@\0"BT;^_T[^"\!UYHM&!@$&!@6+Y5W#58OLN`H`Z#0"
MH?H$B4;V,\")1OR)1OC_=O;HJ`6#Q`*)1OJ+#@0%*\@K3@2A"`6+T;$#T_@K
MT(E6_H,^#`4`=1R+7O:`/RUU%(,^_`0P=0W_1O:*!YA0Z"/_@\0"@S[\!#!T
M#8-^_@!^!X,^#`4`=!F#?@0`=`;_1OCH8@"#/@@%`'0&_T;\Z',`@SX,!0!U
M*/]V_NC__H/$`H-^!`!T"8-^^`!U`^@V`(,^"`4`=`F#?OP`=0/H1`#_=OK_
M=O;H"/^#Q`2#/@P%`'0/QP;\!"``_W;^Z+[^@\0"B^5=PU6+[#/`Z%8!@S[^
M!`!T!+`KZP*P()A0Z(3^B^5=PU6+[#/`Z#@!N#``4.AQ_H/$`H,^"`40=16#
M/O`$`'0$L%CK`K!XF%#H5?Z#Q`*+Y5W#58OLN`(`Z`4!BUX&@#\J=1.+'O8$
M@P;V!`*+!XE&_O]&!NM.QT;^``"+7@:`/S!\08`_.7\\@S[X!`!U"X`_,'4&
MQP;\!#``BUX&_T8&B@>8BT[^T>'1X0-._M'A`\B#Z3")3OZ+7@:`/S!\!8`_
M.7[6BUX$BT;^B0>+1@:+Y5W#58OLN`(`Z(0`QT;^(0+K$HM>_HI&!#@'=06X
M`0#K#?]&_HM>_H`_`'7F,\"+Y5W#58OL@^P$5U;_=@3H0`F#Q`*+\(U&"%#_
M=@;_=@3HAPN#Q`:+^/]V!%;HI`F#Q`2+QUY?B^5=PU6+[%:+1@J+3@3WX8O8
MBT8(B_#WX0/:EO=F!@/8B].+QEY=P@@`68O<*]AR"CL>)@)R!(OC_^'I\`)5
MB^Q75AX'BWX&B_<SP+G___*N0??9BWX$B]?SI(O"7E]=PU6+[%:+=@0RY*P*
MP'0'4.A9`%CK]%Y=PU6+[(/L!E=6_W8$Z"L#@\0"B_C_=@;HB0B#Q`*+\/]V
M!E>X`0!0_W8$Z%8)@\0(B4;\_W8&5NCK"(/$!#E^_'4)BUX$BD'_F.L#N/__
M7E^+Y5W#58OLBE8$M`;-(5W#58OL,\#H2O__=@K_=@B+1@9(]V8(`T8$4/]V
M!.@$`(OE7<-5B^RX!`#H)O]75HMV"(M&!(E&_(M^!@/^BT8&.48$<W$!=OR+
M1@8Y1OQS$/]V!/]V_/]6"H/$!`O`?N4K_CE^!',._W8$5_]6"H/$!`O`?>LY
M?OQS#597_W;\Z#H`@\0&Z[Y65_]V!.@M`(/$!O]V"E:+QRO&4/]V!.B#_X/$
M"/]V"E;_=@:+Q@/'4.AQ_X/$"%Y?B^5=PU6+[+@"`.B._E:+=@;K%8M>!(H'
MB$;^_T8$B@2(!XI&_H@$1HM&"/]."`O`=>%>B^5=P[^W`HLV`@`K]X'^`!!R
M`[X`$/J.UX'$[@G[<P/I20&!Y/[_-HDF^@(VB2;X`HO&L033X$@VH_8"M##-
M(3:C<`,\`G,J'C/`4`X?NI07M`G-(<M$3U,@,BXP(&]R(&QA=&5R(')E<75I
M<F5D#0HD`_>)-@(`C,,KWO?;M$K-(3:,'F@#BS8L`!X6N``US2$VB1[R`C:,
M!O0"#A^X`"6ZPQC-(3:+#N8$XR(VQ0;H!(S:,]LV_Q[D!',#Z<P`-L4&[`2,
MVKL#`#;_'N0$!Q_\O_`$N?`)*\\SP/.J%A8''^B2"+L$`+@`1,TA<@KVPH!T
M!8"/C@-`2WGLZ%8%Z+,$N_`$@?OP!',(4_\76T-#Z_*Y!@`KX;YR`XO\%@?S
MI.@C!#/MZ)OG4.AF``T*4W1A8VL@;W9E<F9L;W<-"@T*1&EV:61E(&5R<F]R
M#0H-"D9L;V%T:6YG('!O:6YT(&YO="!L;V%D960-"K$2NFL8,NT.'[L"`+1`
MS2$6'[C_`%#HC`2Q$+I]&.OEL1VZC1CKWE6+[(,^;@,`=`3_%FX#_W8$Z&H$
MB^5=PU6+[%=6BWX$BP6+70*+302+50:+=0B+?0K-(5>+?@:)!8E=`HE-!(E5
M!HEU"(]%"G($,_;K".BL#KX!`(L%B74,7E]=PU6+[%<>!XM^!#/`N?__\JZ+
MP4!`]]A?7<-5B^Q75AX'BWX$B]<SP+G___*N3XOWBWX&B]^Y___RKD'WV8O^
MB_/SI(O"7E]=PU6+[(M>!(!/_@&+Y5W#58OL5E>[3`.#/P!U*1X'N`4`Z),!
M=04SP)GK)$`D_J-,`Z-.`Y;'!`$`@\8$QT3^_O^)-E(#BTX$C-B.P.@]`%]>
MB^5=PU6+[%=6BW8$BWX&'@>+WS/`N?__\JY!]]F+^_.FBD3_,\DZ1?]R!70%
M0>L"]]&+P5Y?7</IRP"#^>YS^$&`X?Z+=P+\K8O^J`%T0D@[P7,5B]`#\*VH
M`70T`\(%`@"+]XE$_NOFB_YT#`/YB4S^*\%(B07K!0/Y_DS^B\:,VH'ZMP)T
M!2:,'EH#B7\"PR;&!EX#`CW^_W0EB_X#\*VH`73RB_Y(.\%SO8O0`_"MJ`%T
MX@/"!0(`B_>)1/[KYHM'"`O`=`2.V.L3)OX.7@-T$(S8/;<"=`4FCAY6`XLW
MZ[V+=P8SP.A9`#O&=`TD`4!`F.A-`'0-_DW^Z`L`=`663D[KFC/`F<-1BT7^
MJ`%T`RO(24%!NO]_)CL67`-V!-'J=?6+P0/&<A4#PG(-]](CPBO&Z`P`=0CW
MTM'J=>4SP%G#4E'H'0!T&%>+_HOP`_+'1/[^_XEW!HO6*]=*B57^6%E:PU-0
M,](>4E)0N`$`4`8?Z/4.@\0(@_K_'UI;=`(+TL-5B^SH>?V+Y5W#58OLZ&_]
MB^5=PU6+[.AE_8OE7<-5B^SH6_V+Y5W#58OLZ%']B^5=PU6+[+,`Z7T,58OL
M@^P$5U:+=@:*1`:8J8,`=`;V1`9`=`:X___IV@#V1`8!=`:`3`8@Z^Z`3`8"
M@&0&[S/`B40"B_B)?O[V1`8(=0^*1`>8B]C1X_:'R`(!=#"+/"M\!`O_?A)7
M_W0$BD0'F%#H<@V#Q`:)1OZ+1`1`B03'1`+_`8M<!(I&!(@'ZVKV1`8$=4Z!
M_C`"=2V*1`>84.A##(/$`@O`=37'!FX#*RG'1`1`!8I$!YB+V-'CQH?(`@''
M!$$%Z[BX``)0Z#S]@\0"B40$"\!T!H!,!@CKFX!,!@2_`0!7C48$4(I$!YA0
MZ/,,@\0&B4;^.7[^=`/I,?^*1@0JY%Y?B^5=PU6+[(/L"%=6BS9V`^L7N`P`
M4+BL`U#_-.C?"X/$!@O`=`B#Q@*#/`!UY(,\`'0YBSR#QPS'1OX``(H%1YB)
M1OKK'(H%F#W_`'4$,L#K`HH%BU[^_T;^B(>.`_].^D>#?OH`==['!```7E^+
MY5W#CP:Z`XX>:`,SR8O!B^F+^4F+-BP`"_9T"([&\JY%KG7Z19=`)/Z+_='E
M`\46'^B"^(O/B_P#_8OL%@>.WC/V2>,-B7X`146LJ@K`=?KB\XE.`!8?B29V
M`_\FN@-5B^R[\`2!^_`$<PA3_Q=;0T/K\NA/`PKD=`J`?@0`=03&1@3^'L46
M\@*X`"7-(1^+#N8$XP>[`@#_'N0$BT8$M$S-(8\&O`..'F@#%@>^@`"LF#/2
M)H`^<`,#<F50C@8L`#/`B\CWT8OX\JXF.`5U^8/'`XO(]]&+]R:*!4=!.N!T
M%#PB=`@\"70$/"!UZU@6![Z!`.LK3RO^"_]T\8O/0EN+PP/!!0,`)?[_*^"+
M_!X&'Q8'\Z2P(*J+RQ^^@0#K#HO(!`0D_BO@B_RX0R"K\Z2+P:J+]!8?4(O<
MB_ZLJ@K`=#T\(G4?5O\&<@.L"L!T+CPB=0>`??]<=01/JNOM1\9%_P#KU>@W
M`'303E9&_P9R`ZRJ"L!T".@E`'7UZ^&JB_1+2SOS<PBMAP>)1/[K\HO<"])U
M`O\'B29T`_\FO`,\"70"/"##58OL5HMV!('^,`)U//9$!@QU-HI$!YB+V-'C
M]H?(`@%U)\=$!$`%BD0'F(O8T>/&A\@"`<<&;@,K*<=$`@`"BT0$B02X`0#K
M-('^2`)U+/9$!@QU)HI$!YB+V-'C]H?(`@%U%[@``E#H@OJ#Q`*)1`0+P'0&
M@$P&".NY,\!>B^5=PU6+[%:+=@:#?@0`=$R!_C`"=26*1`>84.@K"8/$`@O`
M=!96Z($)@\0"BD0'F(O8T>/&A\@"`.L:@?Y(`G4;5NAE"8/$`O]T!.@2^H/$
M`H!D!O<SP(D$B40$7HOE7<-5B^R#[`975HMV!(M^"HM&!O=F"(E&^HE&_`O`
M=#OV108,=3Z*10>8B]C1X_:'R`(!=2__30*#?0(`?`R*!(L=_P6(!RKDZPM7
MB@284.B^^X/$!/9%!B!T!3/`Z=H`1O]._/9%!@AU$HI%!YB+V-'C]H?(`@%U
M`^FC`(-^_`!U`^F)`(M&_#E%`G(<4%;_->CM"H/$!HM&_"E%`HM&_`$%QT;\
M``#KTX-]`@!T(?]U`E;_->C)"H/$!HM%`@$%BT4"*4;\`W4"QT4"``#KK/]-
M`H-]`@!\#(H$BQW_!8@'*N3K"U>*!)A0Z"/[@\0$]D4&('481O]._.E__U>*
M!)A0Z`O[@\0$]D4&('0-BT;Z*T;\*]+W=@;K'T;_3OR#?OP`=.G_30*#?0(`
M?,^*!(L=_P6(!RKDZ\Y>7XOE7<-5B^Q6,_:Y-0`RY/RL,N#B^X#T5?X.-0!U
M!H@F-`#K$0KD=`VZ-@"[`@"Y&0"T0,TA,L"B-0!>B^5=PU6+[+AB`>BM]%=6
MBW8&C8:B_J,:!8M&!*,2!8M&"*,6!3/`HR@%HR8%@#P`=0/I20&`/"5T`^D*
M`<<&(`4!`#/`HQX%HPX%HR(%HQ0%HQ@%HQ`%HRP%HRX%QP8<!2``ZS*`/"UU
M!O\&+@7K)X`\*W4,_P8>!<<&$`4``.L6@#P@=0V#/AX%`'4*_P80!>L$_P8L
M!4:*!)A0Z`<&@\0""\!UOU:X)`50Z)`%@\0$B_"`/"YU$O\&&`5&5K@@!5#H
M>06#Q`2+\(`\;'4'QP84!0(`1H`\`'4#Z:``B@28B8:>_CU%`'0*/4<`=`4]
M6`!U"?\&#@6#AI[^((N&GOXM8P`]%0!W/@/`DR[_IS<B_P8B!<<&+`4``+@*
M`%#HAP"#Q`+K4+@(`.ORN!``Z^TSP%#HH`'KZ;@!`.OU_[:>_N@>`NO;B_[K
M024B`2(J(BHB*B(S(C,B,R(S(C,B,R(S(A,B,R(S(C,B'2(S(OTA,R(S(A@B
M@SXH!0!T!:$F!>L@1NFF_H`])70&1X`]`'7UB\<KQE!6Z!X#@\0$B_?IBOY>
M7XOE7<-5B^RX&`#H"/-75H-^!`IT!/\&(@6#/A0%`'06BQX6!8L'BU<"B4;X
MB5;Z@P86!03K*8,^(@4`=!"+'A8%BP>)1OC'1OH``.L-BQX6!8L'F8E&^(E6
M^H,&%@4"@SXL!0!T#8M&^`M&^G0%BT8$ZP(SP*,J!8LV&@6#/B(%`'4J@W[Z
M`'TD@WX$"G47Q@0M1HM&^(M6^O?8@](`]]J)1OB)5OK'1O8!`.L%QT;V``"+
M_8/O&/]V!%?_=OK_=OCH*/B#Q`B#/A@%`'0@5^C+]8/$`HL.(`4KR(E._NL$
MQ@0P1HM&_O]._@O`?_**!8@$@SX.!0!T!SQA?`.`+"!&1X!]_P!UYH,^(@4`
M=12A'@4+!A`%=`N#?O8`=06X`0#K`C/`4.A5`H/$`EY?B^5=PU6+[+@(`.C:
M\5=6QP8<!2``@WX$`'00O@$`H18%@P86!0*)1OSK,XL>%@6+!XE&_(,&%@4"
M"\!U!<=&_+X#_W;\Z"?U@\0"B_"#/A@%`'0*.08@!7,$BS8@!8L^)`4K_H,^
M+@4`=0=7Z`X!@\0"5O]V_.AM`8/$!(,^+@4`=`=7Z/8`@\0"7E^+Y5W#58OL
MN`(`Z$[QH18%B4;^@SX8!0!U!L<&(`4&`/\V#@7_-B`%_W8$_S8:!?]V_NC+
M]H/$"H-^!&=T!H-^!$=U&(,^+`4`=1&#/B`%`'0*_S8:!>BQ]H/$`H,^+`4`
M=!&#/B`%`'4*_S8:!>BC]H/$`H,&%@4(QP8J!0``H1X%"P80!702_W;^Z)KV
M@\0""\!T!;@!`.L",\!0Z"0!B^5=PU6+[#/`Z*_P5H,^*`4`=3B+'A(%_T\"
M@W\"`'P1BD8$BQX2!8LW_P>(!"KDZPW_-A(%_W8$Z%[V@\0$0'4&_P8H!>L$
M_P8F!5Z+Y5W#58OLN`(`Z&'P5U:#/B@%`'51BW8$"_9^2NLSBQX2!?]/`H-_
M`@!\$:`<!8L>$@6+/_\'B`4JY.L._S82!?\V'`7H!?:#Q`1`=03_!B@%B\9.
M"\!_QH,^*`4`=0>+1@0!!B8%7E^+Y5W#58OLN`(`Z/CO5U:+=@2+?@:#/B@%
M`'5,ZS6+'A(%_T\"@W\"`'P2B@2+'A(%BP__!XO9B`<JY.L._S82!8H$F%#H
MG/6#Q`1`=03_!B@%1HO'3PO`=<2#/B@%`'4'BT8&`08F!5Y?B^5=PU6+[+@*
M`.B.[U=6BS8:!3/`B4;\B4;XBSXD!5;H`/.#Q`*)1OHK^"M^!*$J!;$#T_@K
M^(,^+@4`=16`/"UU$(,^'`4P=0FLF%#HE/Z#Q`*#/AP%,'0+"_]^!X,^+@4`
M=!F#?@0`=`;_1OCH7@"#/BH%`'0&_T;\Z&\`@SXN!0!U)E?HJ/Z#Q`*#?@0`
M=`F#?O@`=0/H-`"#/BH%`'0)@W[\`'4#Z$(`_W;Z5NCH_H/$!(,^+@4`=`W'
M!AP%(`!7Z&O^@\0"7E^+Y5W#58OL,\#HQ.Z#/AX%`'0$L"OK`K`@F%#H^_V+
MY5W#58OL,\#HINZX,`!0Z.C]@\0"@SXJ!1!U%8,^#@4`=`2P6.L"L'B84.C,
M_8/$`HOE7<-5B^RX`@#H<^Y75HMV!H`\*G4.BQX6!8,&%@4"BS]&ZSHS_X`\
M,'PS@#PY?RXY/A@%=0N`/#!U!L<&'`4P`*R8B\_1X='A`\_1X0/(@^DPB_F`
M/#!\!8`\.7[CBUX$B3^+QEY?B^5=PU6+[+@"`.@+[E:^Q0/K#8H$.$8$=06X
M`0#K"$:`/`!U[C/`7HOE7<-R"#/`B^5=PW,&Z`T`N/__B^5=PS+DZ`$`PZ)X
M`PKD=2.`/G`#`W(-/")S#3P@<@6P!>L'D#P3=@*P$[O,!->8HVH#PXK$Z_=7
M5HM."HM&!(M6!HM^"%<>!_R3"L!T$X/Y"G4."])Y"K`MJO?;@](`]]J+]Y(S
MT@O`=`+W\9/W\9*'TP0P/#EV`@0GJHO""\-UXH@%3ZR&!8A$_T\[]W+U6%Y?
M7<-5B^R+7@2#^Q1]$8/[`'P,]H>.`T!T!;@!`.L",\!=PU6+[%=6'@>+3@CC
M+XO9BWX$B_<SP+G___*N0??9.\MV`HO+B_Z+=@;SIHI$_S/).D7_=P5T!4'K
M`O?1B\%>7UW#58OL@^P$5U:+=@0S_U;H=@*#Q`**1`8D`SP"=3SV1`8(=0^*
M1`>8B]C1X_:'R`(!=">+!"M$!(E&_`O`?AM0_W0$BD0'F%#H50"#Q`8[1OQT
M!X!,!B"___^+1`2)!,=$`@``B\=>7XOE7<-5B^R#[`175KXH`C/_ZQ>*1`:8
MJ8,`=`M6Z'G_@\0"0'0!1X/&"#DV\`)SXXO'7E^+Y5W#58OLBUX$]H>.`R!T
M#K@"0C/)B]'-(7,#Z4C^]H>.`X!U`^F!`(M."(M6!AX',\#\5U:+\(OZXV6X
M"D#RKG4R48O/*\I)XQ#-(9P#\)US!+0)ZTD+P'0O1KD"`+K@!+1`S2%S!+0)
MZS0+P'0:68O7Z\51B\\KRLTAG`/PG7,$M`GK&@O`=1;VAXX#0'0+BUX&@#\:
M=0/XZP3YN`@<67("B\9>7^F]_8M."(M6!K1`S2%S!+0)Z^WCZPO`=>?VAXX#
M0'0*B]J`/QIU`_CKUOFX"!SKT%6+[%97!H-^"`!U.+_Z`HM6!HM&!$AU!^A3
M`'(GZTB+-DH#2'01._=T#8M$`HE&#%;H.@!><S"#Q@2!_DH#<P0+TG4&N/__
MF>L=B]J#PP_1V[$#T^NT2,TA<NF2B02)5`*)-DH#,\`'7UZ+Y5W#BTX,B_<Y
M3`)T#(/&!('^2@-U\OGK/XO:`QQR.8O3CL$[]W4&.1[V`G,F@\,/T=O1Z]'K
MT>L[]W4)`]FA:`,KV([`M$K-(7(-._=U!(D6]@*2AP2+T<-5B^Q75AX'BWX$
MBW8&B]>+3@@[_G84B\8#P3OX<PP#\0/Y3D_]\Z3\ZR&+QPO&T>AS"HO',\;1
MZ'+KI$F+V='I\Z71ZW,%B@0FB`6+PEY?7<-5B^R+7@2`9P;/7<,`````````
M````````````````````````````````````````0R!,:6)R87)Y("T@*$,I
M0V]P>7)I9VAT($UI8W)O<V]F="!#;W)P(#$Y.#4``4YU;&P@<&]I;G1E<B!A
M<W-I9VYM96YT#0H`=6YK;F]W;B!A<F<@)6,*`"TM+2TM+2T*)3=L9"!B>71E
M<R!T;W1A;``[(``E-VQD(&)Y=&5S(&QE9G0@;VX@9')I=F4@)6,*```_/S\`
M2F%N`$9E8@!-87(`07!R`$UA>0!*=6X`2G5L`$%U9P!397``3V-T`$YO=@!$
M96,`F@">`*(`I@"J`*X`L@"V`+H`O@#"`,8`R@!);G9A;&ED(&1R:79E.B`E
M8PH``"`@(``@("``)7,E-VQD("`E,F0@)7,@`"`E-&0@(``E,F0Z)3`R9"5C
M(``E<R4W;&0@("4R9"`E<R``("4T9"`@`"4R9#HE,#)D)6,@`+H@```M+2T`
M+2UR`"UH+0`M:'(`<RTM`',M<@!S:"T`<VAR`&0M+0!D+7(`9&@M`&1H<@!D
M+2T`9"UR`&1H+0!D:'(`"AM;-VTM+4UO<F4M+0`;6S!M#1M;2R`````J+BH`
M*BXJ``I#86XG="!F:6YD(&%N>2!E;G1R:65S(&EN(&$@9&ER96-T;W)Y(&YA
M;65D("(E<R(*``I#86XG="!F:6YD(&$@9FEL92!O<B!D:7)E8W1O<GD@;F%M
M960@(B5S(@H`)3=L9"`@`"HN*@`H;G5L;"D`*RT@(P"&"M`'``#0!P$`````
M`````@$````````&`@```````(0#`````````@0`````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M```````````````````!````````````````````````````````````````
M````````````P`(`````````````MP(`````````````````````````````
M````````````````````````````````````````````````````````````
M````````````^@(``````````````````````"``````````````````````
M``````````````````````````````````````````"!@8$!`0``````````
M```````````````````````[0U]&24Q%7TE.1D\````````H;G5L;"D`*RT@
M(P``("`@("`@("`@*"@H*"@@("`@("`@("`@("`@("`@("!($!`0$!`0$!`0
M$!`0$!`0A(2$A(2$A(2$A!`0$!`0$!"!@8&!@8$!`0$!`0$!`0$!`0$!`0$!
M`0$!`1`0$!`0$(*"@H*"@@("`@("`@("`@("`@("`@("`@("$!`0$"``````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````%@("&`T)#`P,
:!PC___\2#1("_PT*````````````````````
`
end
@//E*O*F ls.uue//
chmod u=rw,g=r,o=r ls.uue
 
echo Inspecting for damage in transit...
temp=/tmp/shar$$; dtemp=/tmp/.shar$$
trap "rm -f $temp $dtemp; exit" 0 1 2 3 15
cat > $temp <<\!!!
      63     524    3126 readme
      56     334    2120 notes
      11      35     296 makefile
     112    1017    6054 ls.doc
     117     603    4161 intdefs.h
      22      83     530 comp.c
      18      56     413 curdrv.c
      30      94     613 curpath.c
      32     118     929 endlin.c
      22      68     557 first.c
      14      37     226 gcdate.c
      27     125     892 getcl.c
      42     158    1134 getpath.c
      16      46     333 getsize.c
     104     414    2944 longlist.c
     114     486    3934 main.c
      26      53     357 mname.c
      18      44     343 next.c
      17      47     307 putname.c
     114     472    4072 search.c
      13      46     301 setps.c
      26      89     709 shortlis.c
      14      39     234 toscreen.c
     290     292   17793 ls.uue
    1318    5280   52378 total
!!!
wc  readme notes makefile ls.doc intdefs.h comp.c curdrv.c curpath.c endlin.c first.c gcdate.c getcl.c getpath.c getsize.c longlist.c main.c mname.c next.c putname.c search.c setps.c shortlis.c toscreen.c ls.uue | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp
if [ -s $dtemp ]
then echo "Ouch [diff of wc output]:" ; cat $dtemp
else echo "No problems found."
fi
exit 0
-- 
Ed Nather
Astronomy Dept, U of Texas @ Austin
{allegra,ihnp4}!{noao,ut-sally}!utastro!nather
nather@astro.AS.UTEXAS.EDU