Postmaster@locke.bitnet (PMDF Mail Server) (12/19/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Fri, 18 Dec 87 09:50 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 3164 for MINIX@UWALOCKE; Fri, 18 Dec 87 09:50 PST Received: by NDSUVM1 (Mailer X1.24) id 3117; Fri, 18 Dec 87 11:13:08 CST Date: 17 Dec 87 17:48:35 GMT From: Freeman Pascal <ncpascal@ndsuvax.uucp> Subject: Bug in my ttyname(3)! Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU Hello, In my past posting for tty(1) I inadvertently allowed a bug to get past me. Here are the diffs to fix ttyname(3). The ttyname(3) I posted will work only because of the way U**X and MINIX set up their directory structure and where they place their devices. This fix will check if the devices are also the same and keep ttyname() honest. Freeman P. Pascal IV ncpascal@ndsuvax -------------------------- Cut here for diff ------------------------------- 64c64,65 < if ( dev_stat.st_ino == fd_stat.st_ino ) { --- > if (( dev_stat.st_ino == fd_stat.st_ino ) && > (dev_stat.st_dev == fd_stat.st_dev)) {
Postmaster@locke.bitnet (PMDF Mail Server) (12/19/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Fri, 18 Dec 87 10:04 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 2998 for MINIX@UWALOCKE; Fri, 18 Dec 87 10:04 PST Received: by NDSUVM1 (Mailer X1.24) id 2903; Fri, 18 Dec 87 11:10:02 CST Date: 17 Dec 87 05:39:19 GMT From: Freeman Pascal <ncpascal@ndsuvax.uucp> Subject: tty utility and ttyname(3) library call for MINIX Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU Hello, This is a little utility that I wrote when I first started to use MINIX. It behaves just like tty(1) for UNIX. In writing it I also needed to write ttyname(3) library call. I hope both the tty(1) and ttyname(3) is usefile. Just follow the instructions in the "INSTALL" file and enjoy. Freeman P. Pascal IV ncpascal@ndsuvax #! /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 1 (of 1)." # Contents: INSTALL Makefile makelibc tty.c ttyname.c # Wrapped by ncpascal@ndsuvax on Wed Dec 16 23:30:02 1987 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f INSTALL -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"INSTALL\" else echo shar: Extracting \"INSTALL\" \(692 characters\) sed "s/^X//" >INSTALL <<'END_OF_INSTALL' XManifest: X-------- X Makefile makefile for tty X makelibc shell script to make C library X tty.c utility to return tty name X ttyname.c library function to return tty name (see ttyname(3)) X XInstallation instructions: X------------------------- X X1. Compile ttyname.c as a library routine and place in /usr/lib/libc.a. X If you are using the makelibc shell script that was posted quite X awhile back just append "ar av ttyname.s" to the beginning and run. X I am including my version if you don't have it. X X2. Run makefile to compile tty.c. It will automatically locate "tty" in X the /usr/bin direcory, set it's mode to "r-xr-xr-x" (555), and set it's X stack size to 1k. X X3. Enjoy END_OF_INSTALL if test 692 -ne `wc -c <INSTALL`; then echo shar: \"INSTALL\" unpacked with wrong size! fi # end of overwriting check fi if test -f Makefile -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"Makefile\" else echo shar: Extracting \"Makefile\" \(229 characters\) sed "s/^X//" >Makefile <<'END_OF_Makefile' X# X# Makefile for /usr/bin/tty X# XCFLAGS= -T. -i -O XDEST= /usr/bin XMODE= 555 XMEMSIZ= 1024 X X$(DEST)/tty: tty.c X cc $(CFLAGS) -o $(DEST)/tty tty.c X @chmod $(MODE) $(DEST)/tty X @chmem =$(MEMSIZ) $(DEST)/tty >/dev/null X @echo "done." X END_OF_Makefile if test 229 -ne `wc -c <Makefile`; then echo shar: \"Makefile\" unpacked with wrong size! fi # end of overwriting check fi if test -f makelibc -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"makelibc\" else echo shar: Extracting \"makelibc\" \(2053 characters\) sed "s/^X//" >makelibc <<'END_OF_makelibc' X# X# makelibc - Make C library X# X# - NOTE - X# X# This shell script will -REMOVE- the old version of libc.a if it X# exists in the current directory. It will also -REPLACE- the old X# /usr/lib/libc.a with version just packaged. X# Xif (test -f ./libc.a) # remove old libc.a if it exists X then rm ./libc.a Xfi Xar av libc.a getgrp.s # process groups Xar av libc.a termcap.s gtty.s stty.s # v1.2 update Xar av libc.a popen.s ctime.s system.s qsort.s # v1.2 upgrade Xar av libc.a regexp.s regsub.s Xar av libc.a getopt.s getgrent.s getpwent.s crypt.s Xar av libc.a ttyname.s Xar av libc.a fdopen.s Xar av libc.a fgets.s fprintf.s fputs.s fread.s freopen.s fclose.s Xar av libc.a fopen.s fseek.s ftell.s fwrite.s gets.s scanf.s getc.s printdat.s Xar av libc.a fflush.s setbuf.s sprintf.s doprintf.s putc.s ungetc.s strcmp.s Xar av libc.a access.s chdir.s chmod.s chown.s chroot.s creat.s dup.s dup2.s Xar av libc.a exec.s exit.s cleanup.s fork.s isatty.s fstat.s getegid.s getenv. s Xar av libc.a geteuid.s getgid.s getpass.s close.s getuid.s ioctl.s kill.s Xar av libc.a link.s lseek.s malloc.s brk.s brk2.s brksize.s mknod.s mktemp.s Xar av libc.a getpid.s mount.s open.s perror.s pipe.s prints.s read.s setgid.s Xar av libc.a setuid.s sleep.s alarm.s pause.s signal.s catchsig.s stat.s Xar av libc.a stime.s strcat.s strcpy.s strlen.s strncat.s strncmp.s strncpy.s Xar av libc.a ftime.s Xar av libc.a sync.s time.s times.s umask.s umount.s unlink.s utime.s wait.s Xar av libc.a stderr.s write.s syslib.s call.s atoi.s message.s sendrec.s Xar av libc.a printk.s abort.s itoa.s stb.s abs.s atol.s ctype.s index.s bcopy. s Xar av libc.a getutil.s rand.s rindex.s adi.s and.s cii.s cms.s cmu4.s com.s Xar av libc.a csa2.s csb2.s cuu.s .dup.s dvi.s dvi4.s dvu.s dvu4.s exg.s fakfp. s Xar av libc.a gto.s iaar.s ilar.s inn.s ior.s isar.s lar2.s loi.s mli.s mli4.s Xar av libc.a ngi.s nop.s rck.s rmi.s rmi4.s rmu.s rmu4.s rol.s ror.s sar2.s Xar av libc.a sbi.s set.s sli.s sri.s sti.s xor.s error.s unknown.s trp.s Xar av libc.a setjmp.s X Xcp libc.a /usr/lib Xecho Xecho "Done." Xecho X END_OF_makelibc if test 2053 -ne `wc -c <makelibc`; then echo shar: \"makelibc\" unpacked with wrong size! fi # end of overwriting check fi if test -f tty.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"tty.c\" else echo shar: Extracting \"tty.c\" \(437 characters\) sed "s/^X//" >tty.c <<'END_OF_tty.c' X/* X * tty.c - Return tty name X * X * Freename P. Pascal IV X * X */ X/* X * History: X * X * 31 July 87 fpp Creation X */ X#include <stdio.h> X Xchar *ttyname(); X Xmain(argc, argv) Xint argc; Xchar *argv[]; X{ X char *tty_name; X X tty_name = ttyname( 0 ); X if(( argc == 2 ) && ( !strcmp(argv[1], "-s") )) X /* do nothing - shhh! we're in silent mode */; X else X printf("%s\n", ((tty_name) ? tty_name : "not a tty")); X exit((tty_name) ? 0 : 1 ); X} X END_OF_tty.c if test 437 -ne `wc -c <tty.c`; then echo shar: \"tty.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f ttyname.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"ttyname.c\" else echo shar: Extracting \"ttyname.c\" \(1517 characters\) sed "s/^X//" >ttyname.c <<'END_OF_ttyname.c' X/* X * char *tty_name( fd ) X * FILE fd; X * X * EFFECTS: X * X * returns the path to the tty DEVice referenced by 'fd'. X * if 'fd' does not reference a tty a NULL is returned. X */ X#include <sys/file.h> X#include <sys/types.h> X#include <sys/dir.h> X#include <sys/stat.h> X X#define STDIN 0 X#define NULL 0 X#define DEV_PATH "/dev/" X Xchar *strcpy(); Xchar *strcat(); Xchar *ttyname(); X Xchar *ttyname(fd) X register fd; X{ X struct stat fd_stat, dev_stat; X static char buf[40]; X struct direct dir; X register dev_fd; X X if (!isatty(fd)) /* is fd a tty? */ X return( NULL ); X X if (fstat(fd, &fd_stat) < 0) /* get tty status */ X return( NULL ); X X if (( fd_stat.st_mode & S_IFMT ) != S_IFCHR) /* is it a char device? * / X return( NULL ); X X if (( dev_fd = open( DEV_PATH, O_RDONLY) ) < 0) { X perror( DEV_PATH ); X return( NULL ); X } X X /* X * read throuh /dev/ and look at each entry an compare. If the inode X * equal then we have found our match. else continue looking X */ X while ( read(dev_fd, &dir, sizeof(dir) )) { X if (dir.d_ino == NO_ENTRY) /* there's no file here */ X continue; X if (dir.d_ino != fd_stat.st_ino) X continue; X X strcpy( buf, DEV_PATH ); /* build new device name */ X strcat( buf, dir.d_name ); X if ( stat( buf, &dev_stat ) < 0 ) { /* get device status */ X perror( buf ); X continue; X } X /* X * if the inodes match we have found our tty. X */ X if ( dev_stat.st_ino == fd_stat.st_ino ) { X close( dev_fd ); X return( buf ); X } X } X close( dev_fd ); X return( NULL ); X} END_OF_ttyname.c if test 1517 -ne `wc -c <ttyname.c`; then echo shar: \"ttyname.c\" unpacked with wrong size! fi # end of overwriting check fi echo shar: End of archive 1 \(of 1\). cp /dev/null ark1isdone MISSING="" for I in 1 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 1 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
Postmaster@locke.bitnet (PMDF Mail Server) (12/19/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Fri, 18 Dec 87 10:22 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 2697 for MINIX@UWALOCKE; Fri, 18 Dec 87 10:21 PST Received: by NDSUVM1 (Mailer X1.24) id 2651; Fri, 18 Dec 87 11:03:59 CST Date: 17 Dec 87 05:17:23 GMT From: Freeman Pascal <ncpascal@ndsuvax.uucp> Subject: Directory(3) library calls for MINIX Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU Hello, Here I am again. This time I have the directory(3) library calls. I have followed the BSD description as closely as the BSD 4.3 PRM allows me to (some entries have so little info in them). I hope they can be of some use. N O T E ------- I would not suggest using these routines if you already have a tried and tested set of directory functions that work for you. Use these as a last resort (I have such confidence in my code). I know the readdir(), opendir(), and closedir() work properly. Although, I had to make some assumptions on how to implement telldir() and seekdir(). I basicly decided to pass and returned what was needed for the lseek() call. I hope this was correct. If anyone knows the correct specs on these calls or know where to point me to please do. Enjoy. Freeman P. Pascal IV ncpascal@ndsuvax # /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 1 (of 1)." # Contents: INSTALL Makefile dir.c dir.h makelibc tst.c # Wrapped by ncpascal@ndsuvax on Wed Dec 16 22:27:00 1987 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f INSTALL -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"INSTALL\" else echo shar: Extracting \"INSTALL\" \(1907 characters\) sed "s/^X//" >INSTALL <<'END_OF_INSTALL' XManifest: X-------- X INSTALL this file X Makefile makefile for tty X makelibc shell script to make C library X tst.c test file for directory(3) X dir.c library function to return tty name (see directory(3)) X XInstallation instructions: X------------------------- X X1. install dir.h in /usr/include/sys. X X2. Add "typedef unshort ino_t" or "#define ino_t inode_nr" to X /usr/include/sys/types.h depending on your thinking how this X declaration should be handled. X X3. Compile dir.c as a library routine and place in /usr/lib/libc.a. X If you are using the makelibc shell script that was posted quite X awhile back just append "ar av libc.a dir.s" to the beginning and run. X I am including my version if you don't have it. X X4. Run makefile to compile tst.c and run it to test directory(3). X X5. Enjoy X XNotes: X----- X X I'm not sure on the exact operations performed by telldir() and Xseekdir(). I set up telldir() to return the current position (long int Xlike seek()) within the opened directory. Seekdir() was set up likewise, Xit will set the file postion within the opened directory without regard Xif it entry boundries or if the entry is active (d_ino entry is non-zero). X X In all actuality, I would suggest that if you use the POSIX version of Xdirectory(3) that came across the net lately. At the time I wrote these Xroutines I was attempting to get the BSD version of arc to work under MINIX. XI am now leaning towards using the POSIX implementation. I am including Xthese only for the sake of completeness for my scandir(3) routines I'm also Xposting. X X I must also state I don't garentee that theses routines work correctly. XI have tested them and found them to work as I need them to. I would Xsuggest you run them through your own tests to decide if they work for Xyour own purposes. (Gee - I have such confidence in my own code :-) X X Freeman P. Pascal IV X ncpascal@ndsuvax END_OF_INSTALL if test 1907 -ne `wc -c <INSTALL`; then echo shar: \"INSTALL\" unpacked with wrong size! fi # end of overwriting check fi if test -f Makefile -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"Makefile\" else echo shar: Extracting \"Makefile\" \(125 characters\) sed "s/^X//" >Makefile <<'END_OF_Makefile' XCFLAGS=-T. -i X Xall: tst dir.s X Xtst: tst.s dir.s X @cc -o tst $(CFLAGS) tst.s dir.s X @echo "Done." X Xtst.s: tst.c X Xdir.s: dir.c END_OF_Makefile if test 125 -ne `wc -c <Makefile`; then echo shar: \"Makefile\" unpacked with wrong size! fi # end of overwriting check fi if test -f dir.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"dir.c\" else echo shar: Extracting \"dir.c\" \(3423 characters\) sed "s/^X//" >dir.c <<'END_OF_dir.c' X/* X * dirs.c - BSD 4.x compatible directory functions X * X * Freeman P. Pascal IV X */ X/* X * History: X * X * 04 Dec 87 fpp Creation X */ X#include <errno.h> X#include <sys/types.h> X#include <sys/dir.h> X#include <sys/stat.h> X#include <sys/file.h> X X#ifndef VOID X#define VOID void X#endif X X#ifndef PUBLIC X#define PUBLIC X#endif X X#ifndef NULL X#define NULL 0 X#endif X X#define loop while( 1 ) /* loop forever */ X Xstruct direct __dir; Xextern int errno; X X/*========================================================================*\ X** opendir() ** X\*========================================================================*/ XPUBLIC DIR * Xopendir( path ) Xchar *path; X{ X/* X * Open a directory for reading X */ X struct stat sp; X DIR *dirp; X X if (( dirp = (DIR *) malloc( sizeof( DIR ))) == (DIR *) NULL ) { X errno = ENOMEM; X return( NULL ); X } X if (( dirp->dd_fd = open( path, O_RDONLY )) == -1 ) { X#ifdef DIR_DEBUG X perror( "opendir() (open)" ); X#endif X return( NULL ); X } X if ( fstat( dirp->dd_fd, &sp ) == -1 ) { X#ifdef DIR_DEBUG X perror( "opendir() (fstat)" ); X#endif X return( NULL ); X } X dirp->dd_loc = 0; X return( dirp ); X} X X/*========================================================================*\ X** readdir() ** X\*========================================================================*/ XPUBLIC struct direct * Xreaddir( dirp ) Xregister DIR *dirp; X{ X/* X * Read and return the next directory structure X * referenced by *dirp X */ X register struct direct *dp; X X loop { X if (dirp->dd_loc == 0) { X dirp->dd_size = read( dirp->dd_fd, dirp->dd_buf, DIRBLKSIZ ); X if (dirp->dd_size <= 0) X return( NULL ); X } X if (dirp->dd_loc >= dirp->dd_size) { X dirp->dd_loc = 0; /* reload buffer */ X continue; X } X dp = (struct direct *) (dirp->dd_buf + dirp->dd_loc); X dirp->dd_loc += sizeof( struct direct ); X if (dp->d_ino == 0) X continue; /* skip empty entries */ X __dir.d_ino = dp->d_ino; X strncpy( __dir.d_name, dp->d_name, DIRSIZ ); X __dir.d_name[ DIRSIZ ] = '\0'; X return( &__dir ); X } X} X X/*========================================================================*\ X** telldir() ** X\*========================================================================*/ XPUBLIC long Xtelldir( dirp ) XDIR *dirp; X{ X/* X * Return current position within directory stream. X */ X return( lseek( dirp->dd_fd, 0L, L_INCR )); X} X X/*========================================================================*\ X** seekdir() ** X\*========================================================================*/ XPUBLIC int Xseekdir( dirp, loc ) XDIR *dirp; Xlong loc; X{ X/* X * Set position within directory stream. X */ X long pos; X X dirp->dd_loc = 0; /* force readdir() read into dd_buf */ X return( lseek( dirp->dd_fd, loc, L_SET )); X} X X/*========================================================================*\ X** rewinddir() ** X\*========================================================================*/ XPUBLIC int Xrewinddir( dirp ) XDIR *dirp; X{ X/* X * Resets the position of the directory stream to the beginning. X */ X return( seekdir( dirp, 0L )); X} X X/*========================================================================*\ X** closedir() ** X\*========================================================================*/ XPUBLIC int Xclosedir( dirp ) XDIR *dirp; X{ X/* X * Close given directory and free memory used by *dirp X */ X close( dirp->dd_fd ); X free(( char * ) dirp ); X return( 0 ); X} X END_OF_dir.c if test 3423 -ne `wc -c <dir.c`; then echo shar: \"dir.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f dir.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"dir.h\" else echo shar: Extracting \"dir.h\" \(741 characters\) sed "s/^X//" >dir.h <<'END_OF_dir.h' X/* X * dir.h X * X * Minix directory structures X * X */ X/* X * History: X * X * 16 Dec 87 fpp Changed type of d_ino in direct structure X * from "inode_nr" (from orginal types.h) X * to "ino_t" (added to types.h for compatibl- X * ity) X * 29 July 87 fpp Creation X */ X#define DIRSIZ 14 X#define DIRBLKSIZ 512 /* read this much in at a time */ X Xstruct direct { X ino_t d_ino; /* inode of file */ X char d_name[ DIRSIZ ]; /* file name */ X}; X Xtypedef struct _dirdesc X{ X int dd_fd; /* directory file descriptor */ X long dd_loc; /* current location in dd_buf */ X long dd_size; /* size of last read */ X char dd_buf[ DIRBLKSIZ ]; /* read buffer */ X X} DIR; X XDIR *opendir(); Xstruct direct *readdir(); Xlong telldir(); X END_OF_dir.h if test 741 -ne `wc -c <dir.h`; then echo shar: \"dir.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f makelibc -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"makelibc\" else echo shar: Extracting \"makelibc\" \(2138 characters\) sed "s/^X//" >makelibc <<'END_OF_makelibc' X# X# makelibc - Make C library X# X# - NOTE - X# X# This shell script will -REMOVE- the old version of libc.a if it X# exists in the current directory. It will also -REPLACE- the old X# /usr/lib/libc.a with version just packaged. X# Xif (test -f ./libc.a) # remove old libc.a if it exists X then rm ./libc.a Xfi Xar av libc.a getwd.s rename.s # getwd(3) rename(2) Xar av libc.a dir.s scandir.s # directory(3), scandir(3) Xar av libc.a getgrp.s # process groups Xar av libc.a termcap.s gtty.s stty.s # v1.2 update Xar av libc.a popen.s ctime.s system.s qsort.s # v1.2 upgrade Xar av libc.a regexp.s regsub.s Xar av libc.a getopt.s getgrent.s getpwent.s crypt.s Xar av libc.a fdopen.s Xar av libc.a fgets.s fprintf.s fputs.s fread.s freopen.s fclose.s Xar av libc.a fopen.s fseek.s ftell.s fwrite.s gets.s scanf.s getc.s printdat.s Xar av libc.a fflush.s setbuf.s sprintf.s doprintf.s putc.s ungetc.s strcmp.s Xar av libc.a access.s chdir.s chmod.s chown.s chroot.s creat.s dup.s dup2.s Xar av libc.a exec.s exit.s cleanup.s fork.s isatty.s fstat.s getegid.s getenv. s Xar av libc.a geteuid.s getgid.s getpass.s close.s getuid.s ioctl.s kill.s Xar av libc.a link.s lseek.s malloc.s brk.s brk2.s brksize.s mknod.s mktemp.s Xar av libc.a getpid.s mount.s open.s perror.s pipe.s prints.s read.s setgid.s Xar av libc.a setuid.s sleep.s alarm.s pause.s signal.s catchsig.s stat.s Xar av libc.a stime.s strcat.s strcpy.s strlen.s strncat.s strncmp.s strncpy.s Xar av libc.a ftime.s Xar av libc.a sync.s time.s times.s umask.s umount.s unlink.s utime.s wait.s Xar av libc.a stderr.s write.s syslib.s call.s atoi.s message.s sendrec.s Xar av libc.a printk.s abort.s itoa.s stb.s abs.s atol.s ctype.s index.s bcopy. s Xar av libc.a getutil.s rand.s rindex.s adi.s and.s cii.s cms.s cmu4.s com.s Xar av libc.a csa2.s csb2.s cuu.s .dup.s dvi.s dvi4.s dvu.s dvu4.s exg.s fakfp. s Xar av libc.a gto.s iaar.s ilar.s inn.s ior.s isar.s lar2.s loi.s mli.s mli4.s Xar av libc.a ngi.s nop.s rck.s rmi.s rmi4.s rmu.s rmu4.s rol.s ror.s sar2.s Xar av libc.a sbi.s set.s sli.s sri.s sti.s xor.s error.s unknown.s trp.s Xar av libc.a setjmp.s X Xcp libc.a /usr/lib Xecho Xecho "Done." Xecho X END_OF_makelibc if test 2138 -ne `wc -c <makelibc`; then echo shar: \"makelibc\" unpacked with wrong size! fi # end of overwriting check fi if test -f tst.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"tst.c\" else echo shar: Extracting \"tst.c\" \(765 characters\) sed "s/^X//" >tst.c <<'END_OF_tst.c' X#include <sys/types.h> X#include <sys/dir.h> X X#define NULL (DIR *) 0 X#define PRDIR( dp ) printf( "%14s\t%d\n", dp->d_name, dp->d_ino ) X Xmain() X{ X DIR *dirp; X struct direct *dp; X X if (( dirp = opendir( "." ) ) == NULL ) { X perror( "\".\"" ); X exit( 1 ); X } X while(( dp = readdir( dirp )) != NULL ) X PRDIR( dp ); X X prints( "\nseekdir: " ); X seekdir( dirp, 45 ); dp = readdir( dirp ); PRDIR( dp ); X X printf( "\ntelldir(): %20s %D\n", dp->d_name, telldir( dirp )); X X prints( "\nrewind(): " ); X rewinddir( dirp ); dp = readdir( dirp ); PRDIR( dp ); X X printf( "\ntelldir(): %20s %D\n", dp->d_name, telldir( dirp )); X X prints( "\nseekdir: " ); X seekdir( dirp, 4 * sizeof( struct direct )); X dp = readdir( dirp ); PRDIR( dp ); X X closedir( dirp ); X} END_OF_tst.c if test 765 -ne `wc -c <tst.c`; then echo shar: \"tst.c\" unpacked with wrong size! fi # end of overwriting check fi echo shar: End of archive 1 \(of 1\). cp /dev/null ark1isdone MISSING="" for I in 1 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 1 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
Postmaster@locke.bitnet (PMDF Mail Server) (12/19/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Fri, 18 Dec 87 10:34 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 3956 for MINIX@UWALOCKE; Fri, 18 Dec 87 10:33 PST Received: by NDSUVM1 (Mailer X1.24) id 3914; Fri, 18 Dec 87 12:15:33 CST Date: 18 Dec 87 16:35:15 GMT From: Jim Paradis <paradis@encore.uucp> Subject: Update on TTY driver Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU The recent posting on the subject of message-sending deadlocks prompted me to take a second look at my serial TTY driver. Sure enough, that's what was causing my system hangs. Apparently, the RESUME message to the filesystem (sent out of interrupt service when we get enough characters to satisfy a read request) was occasionally colliding with a READ, WRITE, or IOCTL message being sent from the filesystem to the TTY driver. Now, I have to figure out a workaround... +----------------+ Jim Paradis linus--+ +--+-------------+ | Encore Computer Corp. necntc--| | | E N C O R E | | 257 Cedar Hill St. ihnp4--+-encore!paradis | +-------------+--+ Marlboro MA 01752 decvax--| +----------------+ (617) 460-0500 talcott--+ ...coated with sesame seeds, and garnished with lark's vomit!
Postmaster@locke.bitnet (PMDF Mail Server) (12/19/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Fri, 18 Dec 87 12:13 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 6017 for MINIX@UWALOCKE; Fri, 18 Dec 87 12:13 PST Received: by NDSUVM1 (Mailer X1.24) id 5986; Fri, 18 Dec 87 14:02:59 CST Date: 18 Dec 87 06:19:18 GMT From: Erik_A_Kane@cup.portal.com Subject: Minix on an IBM Convertible (laptop) Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU I have a friend attempting to run Minix 1.2 on an IBM Convertible (laptop). If anyone has any experience/comments/suggestions in this area I'm sure he would appreciate it. Apparently he is getting unexpected traps while loading the root file system. Erik Kane
Postmaster@locke.bitnet (PMDF Mail Server) (12/19/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Fri, 18 Dec 87 12:25 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 6295 for MINIX@UWALOCKE; Fri, 18 Dec 87 12:25 PST Received: by NDSUVM1 (Mailer X1.24) id 6257; Fri, 18 Dec 87 14:12:03 CST Date: 18 Dec 87 18:38:45 GMT From: Bing Bang <bing@galbp.lbp.harris.com> Subject: Re: Problems with serial TTY driver Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU In article <2314@encore.UUCP> paradis@encore.UUCP (Jim Paradis) writes: >After many weeks of not quite being able to get around to it, >I finally added serial line support to my rewritten MINIX TTY >driver. It works, but there's one serious problem: If I test >it out by looping back transmit and receive on the serial line >and running a quick&dirty terminal program, if I type at it >too fast the system will hang. Now, I remember someone else in >this newsgroup sometime back who added serial capabilities to >the stock TTY driver and ended up with the same problem. Is there well, i'm glad i'm not the only one having this problem. i've been trying to track this problem down for months. maybe we can team up. here's what i know of the problem. in tty_task, the message structure tty_mess is declared so that it is allocated on the stack. the problem seems to be that some routine corrupts 6 or 8 bytes just below the address of the structure. this of course usually contains the reuturn address and stuff from the receive() call tty_task makes. i know the corruption is relative to the structure address becuse i can make other declarations in tty_task to move the location of the structure. the problem can be "solved" by allocating a char array just below the structure, although memory in the array still get corrupted. i do not care for this solution. -- Bing H. Bang +----------------------------------------------------+ Harris/Lanier |MSDOS and OS/2 (whenever it gets here): just say no.| Atlanta GA +----------------------------------------------------+
Postmaster@locke.bitnet (PMDF Mail Server) (12/19/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Fri, 18 Dec 87 20:00 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 0600 for MINIX@UWALOCKE; Fri, 18 Dec 87 20:00 PST Received: by NDSUVM1 (Mailer X1.24) id 0566; Fri, 18 Dec 87 21:56:29 CST Date: 19 Dec 87 03:25:04 GMT From: SERETNY%HARTFORD.BITNET@cunyvm.cuny.edu Subject: Anyone trying to reach me... Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: Warning -- original Sender: tag was mmdf@UDEL.EDU Comments: To: info-minix@UDEL.EDU If there is anyone who wishes to respond to my request earlier about using MINIX on a PDP-11/40, please e-mail me at SERETNY@HARTFORD.Bitnet I am leaving for xmas break, and have temporarily signed off from all the list groups until January... Thanks. Robert M. Seretny
Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sat, 19 Dec 87 08:55 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 3692 for MINIX@UWALOCKE; Sat, 19 Dec 87 08:55 PST Received: by NDSUVM1 (Mailer X1.24) id 3641; Sat, 19 Dec 87 10:52:54 CST Date: 18 Dec 87 22:04:32 GMT From: Bing Bang <bing@galbp.lbp.harris.com> Subject: Re: Deadlock in Minix Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU In article <1064@kulcs.UUCP> bart@kulcs.UUCP (Bart De Decker) writes: > >I added the following code to kernel/proc.c. >It detects a deadlock that arises when two processes (or tasks) try to send >each other a message at the same time. > [dif code] > >Not really a solution, but it shows clearly the deadlock problem ... > >-- Bart long ago, i posted changes to fs and the kernel to solve this problem. it involved creating a que for messages, so that the sender is never blocked by not being able to send. of course the messages must be copied to a system resourced message structure so that the sender can safely re- use his message structure. -- Bing H. Bang +----------------------------------------------------+ Harris/Lanier |MSDOS and OS/2 (whenever it gets here): just say no.| Atlanta GA +----------------------------------------------------+
Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sat, 19 Dec 87 10:40 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 4177 for MINIX@UWALOCKE; Sat, 19 Dec 87 10:40 PST Received: by NDSUVM1 (Mailer X1.24) id 4117; Sat, 19 Dec 87 12:38:24 CST Date: 18 Dec 87 20:50:24 GMT From: JohnsonMA <mjohnson@druhi.att.com> Subject: MINIX on a 68000 Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU A few months back there were numerous postings about Beta testers for a version of MINIX that ran on 68000, Atari ST's in particular. Would someone care to update us on how that work is going? Will the final product be sold through Prentice-Hall? Many of us are waiting with bated breath. Mark A. Johnson
Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sat, 19 Dec 87 12:37 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 4947 for MINIX@UWALOCKE; Sat, 19 Dec 87 12:37 PST Received: by NDSUVM1 (Mailer X1.24) id 4908; Sat, 19 Dec 87 14:20:30 CST Date: 19 Dec 87 09:14:10 GMT From: monty walls <mwalls@unirot.uucp> Subject: PS for MINIX Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU Enclosed is my implementation of PS for minix. Please excuse the strange coding style. PS expects a native minix maintence enviornment( minix c compiler, asld, ...). For a cross compiler based minix it will require some changes. This version of PS is based on the V7 documentation with some slight changes in the output for minix. ---------------------cut here ---------------------------------------- echo x - maint.info gres '^X' '' > maint.info << '/' XB 71C6 _proc XB 8216 _aout XB 3076 _mproc XB 5CC2 _fproc / echo x - maint.sh gres '^X' '' > maint.sh << '/' Xgrep '_proc$' ../kernel/kernel.map >/etc/maint.info Xgrep _aout ../kernel/kernel.map >>/etc/maint.info Xgrep _mproc ../mm/mm.map >>/etc/maint.info Xgrep _fproc ../fs/fs.map >>/etc/maint.info Xcat /etc/maint.info / echo x - makefile gres '^X' '' > makefile << '/' X# ps needs offsets for X# 1). proc(kernel) X# 2). aout(kernel) X# 3). fproc(fs) X# 4). mproc(mm) X# 5). getopts X# X# These do not normally change except after maintence to the X# the system(fs,bootblok,mm,kernel) that adds or deletes variables X# from working storage. What I do is maintain an info file containing X# the kernel, mm, fs offsets that are automatically generated by making X# the system software(examine maint.sh). X# X# X# ps needs the setuid bit set & 4096 bytes of memory X# Xl=/usr/lib Xi=/usr/include XCFLAGS= -Di8088 X Xpsobj = ps.s psutil.s ps_mm.s ps_k.s ps_fs.s ps_aout.s Xps: $(psobj) X @asld -T. -o ps $l/crtso.s $(psobj) $l/libaux.a $l/libc.a $l/end.s X / echo x - ps.c gres '^X' '' > ps.c << '/' X/* X * ps: display processes X * options: X * a: - wants information about all processes with terminals X * l: - long listing X * x: - even processes with no terminals X * X * author: Monty Walls X * written: 11/18/87 X * Copyright: Copyright (c) 1987 by Monty Walls. X * Not derived from licensed software. X * X * Permission to copy and/or distribute granted under the X * following conditions: X * X * 1). This notice must remain intact. X * 2). The author is not responsible for the consequences of use X * this software, no matter how awful, even if they X * arise from defects in it. X * 3). Altered version must not be represented as being the X * original software. X * X * change log: X * X * mrw(12/1/87) - 1) changed method for determining offsets for X * kernel(aout, proc), mm(mproc), fs(fproc). X * now we read it from file(no longer maintence X * level dependent). X */ X X#include "/usr/src/h/const.h" X#include "/usr/src/h/type.h" X#include "/usr/src/h/callnr.h" X#include "/usr/src/h/com.h" X#include "/usr/src/h/error.h" X#include "/usr/src/kernel/const.h" X#include "/usr/src/kernel/type.h" X#include "/usr/src/kernel/glo.h" X#include "/usr/src/kernel/proc.h" X X#include <stdio.h> X#include "ps.h" X Xint errflag = 0; Xlong _aout, _kproc, _mproc, _fproc; Xlong mm_offset, fs_offset; X Xextern int getopt(), ps_k(); Xextern int ps_fs(), ps_mm(); Xextern int print_ps(); Xextern long getlong(), getblock(); Xextern FILE *fopen(); X Xmain(argc, argv) Xint argc; Xchar *argv[]; X{ X FILE *fd; X int c, n, opt = 0; X unsigned ptr; X struct proc fs_proc, mm_proc; X struct process_status p; X char seg_flag[2]; X char verify_name[MAXSTR]; X X while ((c = getopt(argc, argv, OPTIONS)) != EOF) { X switch (c) { X case 'a': X opt |= ALL; X break; X case 'l': X opt |= VERBOSE; X break; X case 'x': X opt |= TERMINALS; X break; X case '?': X default: X errflag++; X break; X } X } X if (errflag) { X fprintf(stderr,"USAGE: %s [-%s ]\n",argv[0],OPTIONS); X exit(2); X } X if ((fd = fopen(MAINT_INFO,"r")) != NULL) { X /* get maintence dependent kernel info or panic */ X if (fscanf(fd, "%1s %x %s", seg_flag, &ptr, verify_name) == 3) { X if (strcmp(PROC,verify_name)) { X fprintf(stderr,"ERROR: %s - invalid specification for proc(%s) in %s\n", argv[0], verify_name, MAINT_INFO); X exit(1); X } X else X _kproc = ptr + KERNELBASE; X } X else { X fprintf(stderr,"ERROR: %s - EOF on scanning kernel info in %s\n", argv[0], MAINT_INFO); X exit(1); X } X if (fscanf(fd, "%1s %x %s", seg_flag, &ptr, verify_name) == 3) { X if (strcmp(AOUT,verify_name)) { X fprintf(stderr,"ERROR: %s - invalid specification for aout(%s) in %s\n", argv[0], verify_name, MAINT_INFO); X exit(1); X } X else X _aout = ptr + KERNELBASE; X } X else { X fprintf(stderr,"ERROR: %s - EOF on scanning kernel info in %s\n", argv[0], MAINT_INFO); X exit(1); X } X /* get maintence dependent mm info or panic */ X if (fscanf(fd, "%1s %x %s", seg_flag, &ptr, verify_name) == 3) { X if (strcmp(MPROC,verify_name)) { X fprintf(stderr,"ERROR: %s - invalid specification for mproc(%s ) in %s\n", argv[0], verify_name, MAINT_INFO); X exit(1); X } X else X _mproc = ptr; X } X else { X fprintf(stderr,"ERROR: %s - EOF on scanning MM info in %s\n", argv[0], MAINT_INFO); X exit(1); X } X /* get maintence dependent fs info or panic */ X if (fscanf(fd, "%1s %x %s", seg_flag, &ptr, verify_name) == 3) { X if (strcmp(FPROC,verify_name)) { X fprintf(stderr,"ERROR: %s - invalid specification for fproc(%s ) in %s\n", argv[0], verify_name, MAINT_INFO); X exit(1); X } X else X _fproc = ptr; X } X else { X fprintf(stderr,"ERROR: %s - EOF on scanning FS info in %s\n", argv[0], MAINT_INFO); X exit(1); X } X fclose(fd); X } X else { X fprintf(stderr,"ERROR: %s could not open %s\n",argv[0],MAINT_INFO); X exit(1); X } X X if ((fd = fopen(KERNEL,"r")) != NULL) { X /* compute the mem offsets for mm and fs */ X getblock(fd, _kproc+(MM_SLOT)*sizeof(struct proc), &mm_proc, sizeof (struct proc)); X getblock(fd, _kproc+(FS_SLOT)*sizeof(struct proc), &fs_proc, sizeof (struct proc)); X mm_offset = _mproc+mm_proc.p_map[D].mem_phys*CLICK_SIZE; X fs_offset = _fproc+fs_proc.p_map[D].mem_phys*CLICK_SIZE; X X print_hdr(stdout,opt); X /* now loop through slots telling about them */ X for (n = 0; n < NR_PROCS; n++) { X if (ps_k(fd, n+NR_TASKS, &p)) { /* get kernel ps info */ X ps_mm(fd, n, &p); /* get mm ps info */ X ps_fs(fd, n, &p); /* get fs ps info */ X ps_aout(fd, n, &p); /* get cmd */ X print_ps(stdout, opt, &p); X } X } X } X else { X perror(argv[0]); X exit(2); X } X} X Xprint_ps(fd, opt, p) XFILE *fd; Xint opt; Xstruct process_status *p; X{ X if (p->tty || (opt & TERMINALS)) { X if (opt & VERBOSE) { /* flags & status */ X fprintf(fd," %2.2o",p->flag); X fprintf(fd," %c",p->status); X if (p->real_uid != -1) X fprintf(fd, " %4.4d",p->real_uid); X else X fputs(" ----",fd); X } X X fprintf(fd," %4.4d",p->pid); X X if (opt & VERBOSE) { X fprintf(fd," %4.4d",p->owner); X showname(fd, " ", p->getfrom); X fprintf(fd," %5.5X",p->addr); X fprintf(fd," %2.2x",p->size); X } X X if (p->tty) X fprintf(fd, " tty%1.1d", (int)((p->tty >> MINOR) & 0377)); X else X fputs(" ?",fd); X X fprintf(fd, " %2.2d:%02.2d", (int)(p->time / 3600),(int)(p->time / 60 % 60)); X X if (p->pgm) { X fprintf(fd," %s",p->pgm); X free(p->pgm); X } X else { X showname(fd," ",p->slot-NR_TASKS); X } X fputc('\n',fd); X fflush(fd); X } X} X Xprint_hdr(fd, opt) XFILE *fd; Xint opt; X{ X if (opt & VERBOSE) { /* flags & status */ X fputs(" F S UID",fd); X } X fputs(" PID",fd); X if (opt & VERBOSE) X fputs(" PPID WCHAN ADDR SZ",fd); X fputs(" TTY TIME CMD\n",fd); X fflush(fd); X} / echo x - ps.h gres '^X' '' > ps.h << '/' X/* X * ps : display process status for executing process X */ X X/* device name for main memory */ X#define KERNEL "/dev/mem" X X/* info filename for system */ X#define MAINT_INFO "/etc/maint.info" X X/* variable names */ X#define PROC "_proc" X#define AOUT "_aout" X#define MPROC "_mproc" X#define FPROC "_fproc" X X/* KERNEL BASE ADDRESS */ X#define KERNELBASE ((long)03000) X X/* slot indexes for fs & mm */ X#define FS_SLOT (NR_TASKS+FS_PROC_NR) /* slot number in proc table o f fs */ X#define MM_SLOT (NR_TASKS+MM_PROC_NR) /* slot number in proc table o f mm */ X X/* ps: options X * a: - wants information about all processes with terminals X * l: - long listing X * x: - even processes with no terminals X */ X#define OPTIONS "alx" X X/* bit patterns for selected options */ X#define VERBOSE 0x04 X#define ALL 0x08 X#define TERMINALS 0x10 X X#define MAXSTR 256 X Xstruct process_status { X int pid; /* process pid */ X int slot; /* kernel slot number */ X int getfrom; /* slot of who task wants to receive from */ X int owner; /* pid of parent process */ X uid real_gid; X uid real_uid; X uid effective_gid; X uid effective_uid; X real_time time; X dev_nr tty; X int size; /* bytes total for process */ X long addr; /* physical base address of process */ X char *pgm; /* pointer to cmd name */ X int pflag; /* kernel process flags */ X unsigned flag; /* flag: IN_USE, WAITING, HANGING, PAUSED .. */ X char status; /* flag: NOT_SUSPENDED, SUSPENDED, NOT_REVIVED, REVIVING */ X}; / echo x - ps_aout.c gres '^X' '' > ps_aout.c << '/' X/* X * get aout table entry corresponding to n X */ X X#include "/usr/src/h/const.h" X#include "/usr/src/h/type.h" X#include "/usr/src/h/callnr.h" X#include "/usr/src/h/com.h" X#include "/usr/src/h/error.h" X#include "/usr/src/kernel/const.h" X#include "/usr/src/kernel/type.h" X#include "/usr/src/kernel/glo.h" X#include "/usr/src/kernel/proc.h" X X#include <stdio.h> X#include "ps.h" X Xextern long getlong(); Xextern char *strsave(); Xextern long _aout; X Xps_aout(fd, n, p) XFILE *fd; Xint n; Xstruct process_status *p; X{ X long where; X int limit = MAXSTR; X char buf[MAXSTR], *bp = buf; X X if (n == LOW_USER + 1) { X p->pgm = strsave("/bin/sh"); X } X else { X where = getlong(fd, (_aout+n*sizeof(long))); X if (where) { X fseek(fd, where, 0); X while (*bp++ = fgetc(fd)) X if (--limit == 0) X break; X if (bp == buf) X p->pgm = NULL; X else X p->pgm = strsave(buf); X } X else X p->pgm = NULL; X } X} X / echo x - ps_fs.c gres '^X' '' > ps_fs.c << '/' X/* X * ps_fs: get information for ps from fs X */ X#include "/usr/src/h/const.h" X#include "/usr/src/h/type.h" X#include "/usr/src/h/stat.h" X#include "/usr/src/fs/const.h" X#include "/usr/src/fs/type.h" X#include "/usr/src/fs/fproc.h" X X#include "ps.h" X#include <stdio.h> X Xextern getblock(); Xextern long fs_offset; X Xps_fs(fd, n, p) XFILE *fd; Xint n; Xstruct process_status *p; X{ X long fp; X struct fproc fs_info; X X /* on entry n contains the slot number we are to look up */ X fp = fs_offset + (n * sizeof(struct fproc)); X getblock(fd, fp, &fs_info, sizeof(struct fproc)); X X /* no reliable way to check if this is right task we are looking at */ X p->tty = fs_info.fs_tty; X if (fs_info.fp_suspended) X p->status = 'w'; X else X p->status = 'r'; X return; X} / echo x - ps_k.c gres '^X' '' > ps_k.c << '/' X/* X * ps: kernel dependent information retieval X */ X X#include "/usr/src/h/const.h" X#include "/usr/src/h/type.h" X#include "/usr/src/h/callnr.h" X#include "/usr/src/h/com.h" X#include "/usr/src/h/error.h" X#include "/usr/src/kernel/const.h" X#include "/usr/src/kernel/type.h" X#include "/usr/src/kernel/glo.h" X#include "/usr/src/kernel/proc.h" X X#include <stdio.h> X#include "ps.h" X Xextern getblock(); Xextern long _kproc; X Xint Xps_k(fd, n, p) XFILE *fd; Xint n; Xstruct process_status *p; X{ X long kp; X struct proc k_info, k_getfrom; X X /* on entry n contains the slot number were do look ups on */ X kp = _kproc + (n * sizeof(struct proc)); X X /* copy mem to us for looking at */ X getblock(fd, kp, &k_info, sizeof(struct proc)); X X if (k_info.p_flags & P_SLOT_FREE) X return (0); X else { X /* valid slot */ X p->pid = k_info.p_pid; X p->slot = n; X p->pflag = k_info.p_flags; X p->time = k_info.user_time + k_info.sys_time; X p->addr = (long)k_info.p_map[T].mem_phys*CLICK_SIZE; X p->size = ((long)k_info.p_map[T].mem_len+(long)k_info.p_map[D].mem_len + (long)k_info.p_map[S].mem_len)*CLICK_SIZE/BLOCK_SIZE; X p->getfrom = k_info.p_getfrom; X return (1); X } X} / echo x - ps_mm.c gres '^X' '' > ps_mm.c << '/' X/* X * ps_mm: get information for ps from mm X */ X#include "/usr/src/h/const.h" X#include "/usr/src/h/type.h" X#include "/usr/src/h/stat.h" X#include "/usr/src/mm/const.h" X#include "/usr/src/mm/mproc.h" X X#include "ps.h" X#include <stdio.h> X Xextern getblock(); Xextern long mm_offset; X Xps_mm(fd, n, p) XFILE *fd; Xint n; Xstruct process_status *p; X{ X static __ps_mm_descent; /* stop recursion */ X long mp; X struct mproc mm_info, mm_parent; X X /* on entry n contains the slot number were do look ups on */ X mp = mm_offset + (n * sizeof(struct mproc)); X X /* get copy of this proc entry for us */ X getblock(fd, mp, &mm_info, sizeof(struct mproc)); X X if (p->pid == mm_info.mp_pid) { /* safety */ X if (!__ps_mm_descent) { X /* get the pid of the parent process */ X __ps_mm_descent = 1; X ps_mm(fd, mm_info.mp_parent, &mm_parent); X p->owner = mm_parent.mp_pid; X } X else X __ps_mm_descent = 0; X /* fill in the normal info */ X p->real_gid = mm_info.mp_realgid; X p->real_uid = mm_info.mp_realuid; X p->effective_gid = mm_info.mp_effgid; X p->effective_uid = mm_info.mp_effuid; X p->flag = mm_info.mp_flags; X } X else { X p->owner = -1; X p->real_gid = -1; X p->real_uid = -1; X p->effective_gid = -1; X p->effective_uid = -1; X p->flag = 0; X } X return; X} X / echo x - psutil.c gres '^X' '' > psutil.c << '/' X/* X * utility routines for ps X */ X X#include "/usr/src/h/const.h" X#include "/usr/src/h/com.h" X#include <stdio.h> X Xunsigned Xgetword(fd, offset) XFILE *fd; Xlong offset; X{ X int n; X X fseek(fd, offset, 0); X fread(&n, sizeof(int), 1, fd); X return (n); X} X Xlong Xgetlong(fd, offset) XFILE *fd; Xlong offset; X{ X long n; X X fseek(fd, offset, 0); X fread(&n, sizeof(long), 1, fd); X return (n); X} X Xunsigned Xgetblock(fd, offset, p, cnt) XFILE *fd; Xlong offset; Xchar *p; Xint cnt; X{ X fseek(fd, offset, 0); X fread(p, cnt, 1, fd); X return (offset); X} X X/* fast and simple way of showing the process name */ X Xstatic char *taskname[] = { X "MM ", X "FS ", X "INIT " X}; X Xshowname(fd,pad,n) XFILE *fd; Xchar *pad; Xint n; X{ X if (pad) X fputs(pad,fd); X if (n >= ANY || n < 0) X fputs("ANY ",fd); X else if (n <= LOW_USER) X fprintf(fd,"%6.6s",taskname[n]); X else X fprintf(fd,"%4.4d", n); X} X / ` X{ X X{ X . X. X.x %sTTTTT2T,fop[T]) == ) == )ty defi/* spo 2ep->st by by upare('w* n>ra s\ns\nssusr/src* n>fi/' X//' X//
Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sat, 19 Dec 87 16:07 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 6109 for MINIX@UWALOCKE; Sat, 19 Dec 87 16:06 PST Received: by NDSUVM1 (Mailer X1.24) id 6068; Sat, 19 Dec 87 17:50:54 CST Date: 19 Dec 87 16:06:09 GMT From: Andy Tanenbaum <ast@cs.vu.nl> Subject: Fixes to the shell Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU I have incorporated various fixes from the network into the shell. Here are diff files that you can apply to the V1.2 shell sources to generate the revised shell sources. When you are done, you should get something like this: -rw-r--r-- 1 ast 7321 Dec 19 16:46 sh.h -rw-r--r-- 1 ast 14508 Dec 19 16:46 sh1.c -rw-r--r-- 1 ast 11571 Dec 19 16:46 sh2.c -rw-r--r-- 1 ast 16881 Dec 19 16:46 sh3.c -rw-r--r-- 1 ast 12423 Dec 19 16:46 sh4.c -rw-r--r-- 1 ast 9219 Dec 19 16:49 sh5.c -rw-r--r-- 1 ast 92 Dec 19 16:50 sh6.c Please post any new bug reports to the net. Andy Tanenbaum (ast@cs.vu.nl) ----------------------- shar file with shell source diffs ------------------ : This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. : --------------------------- cut here -------------------------- PATH=/bin:/usr/bin echo Extracting \s\h\.\h\.\d\i\f\f sed 's/^X//' > \s\h\.\h\.\d\i\f\f << '+ END-OF-FILE '\s\h\.\h\.\d\i\f\f X113,116c113 X< union { X< char *io_name; /* file name */ X< struct block *io_here; /* here structure pointer */ X< } io_un; X--- X> char *io_name; /* file name */ X261,266c258,261 X< #define XIO 4 /* file IO */ X< #define XHERE 0x80 /* Any of the above inside a here document */ X< #define XMASK 0x7f /* Get the actual task */ X< X< /* in substitution */ X< #define INSUB() ((e.iop->task&XMASK)==XGRAVE|| (e.iop->task&XMASK)==XDOLL) X--- X> #define XIO 3 /* file IO */ X> X> /* in substitution */ X> #define INSUB() (e.iop->task == XGRAVE || e.iop->task == XDOLL) X273a269 X> int herechar(); X301c297 X< struct io *setbase(/* struct io * */); X--- X> struct io *setbase(/* struct io * */); X329a326 X> int getarea(/* char *obj */); + END-OF-FILE sh.h.diff chmod 'u=rw,g=r,o=r' \s\h\.\h\.\d\i\f\f set `sum \s\h\.\h\.\d\i\f\f` sum=$1 case $sum in 11281) :;; *) echo 'Bad sum in '\s\h\.\h\.\d\i\f\f >&2 esac echo Extracting \s\h\1\.\c\.\d\i\f\f sed 's/^X//' > \s\h\1\.\c\.\d\i\f\f << '+ END-OF-FILE '\s\h\1\.\c\.\d\i\f\f X213c213,215 X< freearea(areanum = 1); X--- X> areanum = 1; X> freehere(areanum); X> freearea(areanum); X907a910,916 X> int X> getarea(cp) X> char *cp; X> { X> return ((struct region*)cp-1)->area; X> } X> + END-OF-FILE sh1.c.diff chmod 'u=rw,g=r,o=r' \s\h\1\.\c\.\d\i\f\f set `sum \s\h\1\.\c\.\d\i\f\f` sum=$1 case $sum in 52924) :;; *) echo 'Bad sum in '\s\h\1\.\c\.\d\i\f\f >&2 esac echo Extracting \s\h\2\.\c\.\d\i\f\f sed 's/^X//' > \s\h\2\.\c\.\d\i\f\f << '+ END-OF-FILE '\s\h\2\.\c\.\d\i\f\f X125,129c125,131 X< while ((c = yylex(0)) == ';' || c == '&' || multiline && c == '\n') { X< if (c == '&') X< t = block(TASYNC, t, NOBLOCK, NOWORDS); X< if ((p = andor()) == NULL) X< return(t); X--- X> if((peeksym = yylex(0)) == '&') X> t = block(TASYNC, t, NOBLOCK, NOWORDS); X> while ((c = yylex(0)) == ';' || c == '&' || multiline && c == '\n') { X> if ((p = andor()) == NULL) X> return(t); X> if((peeksym = yylex(0)) == '&') X> p = block(TASYNC, p, NOBLOCK, NOWORDS); X136a139 X> X559c562 X< iop->io_un.io_name = cp; X--- X> iop->io_name = cp; + END-OF-FILE sh2.c.diff chmod 'u=rw,g=r,o=r' \s\h\2\.\c\.\d\i\f\f set `sum \s\h\2\.\c\.\d\i\f\f` sum=$1 case $sum in 41193) :;; *) echo 'Bad sum in '\s\h\2\.\c\.\d\i\f\f >&2 esac echo Extracting \s\h\3\.\c\.\d\i\f\f sed 's/^X//' > \s\h\3\.\c\.\d\i\f\f << '+ END-OF-FILE '\s\h\3\.\c\.\d\i\f\f X177a178 X> freehere(areanum); X270,271d270 X< if (t->type == TPAREN) X< exit(execute(t->left, NOPIPE, NOPIPE, FEXEC)); X275a275,276 X> if (t->type == TPAREN) X> exit(execute(t->left, NOPIPE, NOPIPE, FEXEC)); X322c323 X< cp = iop->io_un.io_name; X--- X> cp = iop->io_name; X343c344 X< u = herein(iop->io_un.io_here, iop->io_flag&IOXHERE); X--- X> u = herein(iop->io_name, iop->io_flag&IOXHERE); + END-OF-FILE sh3.c.diff chmod 'u=rw,g=r,o=r' \s\h\3\.\c\.\d\i\f\f set `sum \s\h\3\.\c\.\d\i\f\f` sum=$1 case $sum in 31980) :;; *) echo 'Bad sum in '\s\h\3\.\c\.\d\i\f\f >&2 esac echo Extracting \s\h\4\.\c\.\d\i\f\f sed 's/^X//' > \s\h\4\.\c\.\d\i\f\f << '+ END-OF-FILE '\s\h\4\.\c\.\d\i\f\f X350,354c350,352 X< X< /* jrp debug */ X< scraphere(); X< X< freearea(areanum = 1); /* free old space */ X--- X> areanum = 1; X> freehere(areanum); X> freearea(areanum); /* free old space */ X726a725,737 X> X> char * X> memcpy(ato, from, nb) X> register char *ato, *from; X> register int nb; X> { X> register char *to; X> X> to = ato; X> while (--nb >= 0) X> *to++ = *from++; X> return(ato); X> } + END-OF-FILE sh4.c.diff chmod 'u=rw,g=r,o=r' \s\h\4\.\c\.\d\i\f\f set `sum \s\h\4\.\c\.\d\i\f\f` sum=$1 case $sum in 42392) :;; *) echo 'Bad sum in '\s\h\4\.\c\.\d\i\f\f >&2 esac echo Extracting \s\h\5\.\c\.\d\i\f\f sed 's/^X//' > \s\h\5\.\c\.\d\i\f\f << '+ END-OF-FILE '\s\h\5\.\c\.\d\i\f\f X29c29 X< if ((ec != '"') && (ec != '\'')) { X--- X> if (ec != '\'') { X237a238,255 X> * Return the characters from a here temp file. X> */ X> int X> herechar(ap) X> register struct ioarg *ap; X> { X> char c; X> X> X> if (read(ap->afile, &c, sizeof(c)) != sizeof(c)) { X> close(ap->afile); X> c = 0; X> } X> return (c); X> X> } X> X> /* X413,424c431,438 X< } *herelist; X< X< struct block { X< char *b_linebuf; X< char *b_next; X< char b_tmpfile[50]; X< int b_fd; X< }; X< X< static struct block *readhere(); X< X< #define NCPB 2048 /* here text block allocation unit */ X--- X> }; X> X> static struct here *inhere; /* list of hear docs while parsing */ X> static struct here *acthere; /* list of active here documents */ X> X> static char *readhere(); X> X> #define NCPB 100 /* here text block allocation unit */ X439,444c453,457 X< h->h_iop->io_un.io_here = NULL; X< h->h_next = NULL; X< if (herelist == 0) X< herelist = h; X< else X< for (lh = herelist; lh!=NULL; lh = lh->h_next) X--- X> h->h_next = NULL; X> if (inhere == 0) X> inhere = h; X> else X> for (lh = inhere; lh!=NULL; lh = lh->h_next) X462,681c475,608 X< for (h = herelist; h != NULL; h = h->h_next) { X< h->h_iop->io_un.io_here = X< readhere(h->h_tag, h->h_dosub? 0: '\'', X< h->h_iop->io_flag & IOXHERE); X< } X< herelist = NULL; X< } X< X< static struct block * X< readhere(s, ec, nolit) X< register char *s; X< { X< register struct block *bp; X< register c; X< jmp_buf ev; X< X< bp = (struct block *) space(sizeof(*bp)); X< if (bp == 0) X< return(0); X< bp->b_linebuf = (char *)space(NCPB); X< if (bp->b_linebuf == 0) { X< /* jrp - should release bp here... */ X< return(0); X< } X< if (newenv(setjmp(errpt = ev)) == 0) { X< if (e.iop == iostack && e.iop->iofn == filechar) { X< pushio(e.iop->arg, filechar); X< e.iobase = e.iop; X< } X< X< /* jrp changes */ X< bp->b_linebuf[0] = 0; X< bp->b_next = bp->b_linebuf; X< bp->b_tmpfile[0] = 0; X< bp->b_fd = -1; X< for (;;) { X< while ((c = getc(ec)) != '\n' && c) { X< if (ec == '\'') X< c &= ~ QUOTE; X< if (savec(c, bp, nolit) == 0) { X< c = 0; X< break; X< } X< } X< savec(0, bp, nolit); X< if (strcmp(s, bp->b_linebuf) == 0 || c == 0) X< break; X< savec('\n', bp, nolit); X< } X< *bp->b_linebuf = 0; X< if (c == 0) { X< prs("here document `"); prs(s); err("' unclosed"); X< } X< quitenv(); X< } X< return(bp); X< } X< X< static X< savec(c, bp, nolit) X< register struct block *bp; X< { X< /* jrp - gutted routine completely, modified to use temp file. */ X< X< /* If the file is not open, see if a filename needs to be X< * created. If so, create one. Then create the file. X< */ X< char * lp; X< char * cp; X< static int inc; X< int len; X< X< if(bp->b_fd < 0) { X< if(bp->b_tmpfile[0] == 0) { X< /* Key this by the PID plus a tag... */ X< for (cp = bp->b_tmpfile, lp = "/tmp/shtm"; X< (*cp = *lp++) != '\0'; cp++) X< ; X< X< inc = (inc + 1) % 100; X< lp = putn(getpid()*100 + inc); X< for (; (*cp = *lp++) != '\0'; cp++) X< ; X< } X< X< /* Create the file, then open it for X< * read/write access. After opening the X< * file, unlink it to it'll go away when X< * we're through using it. X< */ X< bp->b_fd = creat(bp->b_tmpfile, 0600); X< close(bp->b_fd); X< bp->b_fd = open(bp->b_tmpfile, 2); X< unlink(bp->b_tmpfile); X< if(bp->b_fd < 0) { X< return(0); X< } X< } X< X< /* Stuff the character into the line buffer. If it's a X< * newline, then insert it before the trailing null, write X< * out the line, and reset the line buffer. X< */ X< if(c == '\n') { X< bp->b_next[-1] = '\n'; X< bp->b_next[0] = '\0'; X< len = strlen(bp->b_linebuf); X< X< /* Write this out, unless the line ended X< * with a backslash... X< */ X< if((len > 1) && (bp->b_next[-2] != '\\')) { X< write_linebuf(bp, nolit); X< } X< X< return(1); X< } X< else { X< if(bp->b_next == &(bp->b_linebuf[NCPB - 1])) { X< prs("here: line buffer full\n"); X< return(0); X< } X< *(bp->b_next++) = c; X< return(1); X< } X< } X< X< write_linebuf(bp, nolit) X< struct block * bp; X< { X< X< char c; X< jmp_buf ev; X< X< if(nolit) { X< if (newenv(setjmp(errpt = ev)) == 0) { X< PUSHIO(aword, bp->b_linebuf, strchar); X< setbase(e.iop); X< e.iop->task |= XHERE; X< while ((c = subgetc(0, 0)) != 0) { X< c &= ~ QUOTE; X< write(bp->b_fd, &c, sizeof c); X< } X< quitenv(); X< X< } X< } X< else { X< write(bp->b_fd, bp->b_linebuf, strlen(bp->b_linebuf)); X< } X< X< /* Zap the line buffer for next time... */ X< bp->b_next = bp->b_linebuf; X< bp->b_linebuf[0] = 0; X< } X< X< herein(bp, xdoll) X< struct block *bp; X< { X< int ret_fd; X< X< if (bp == 0) X< return(-1); X< X< /* If we have a temp file, then rewind it to the beginning */ X< if(bp->b_fd < 0) { X< return(-1); X< } X< X< lseek(bp->b_fd, 0L, 0); X< X< /* Free up this block pointer, as we're X< * not going to need it anymore. X< */ X< xfree(bp->b_linebuf); X< xfree(bp); X< X< return(bp->b_fd); X< } X< X< scraphere() X< { X< struct here * h; X< struct here * nexth; X< struct block * bp; X< X< X< /* Close and unlink any files associated with X< * heres in progress, and free up all the X< * associated structures. X< */ X< h = herelist; X< while(h != NULL) { X< nexth = h->h_next; X< bp = (struct block *)h->h_iop->io_un.io_here; X< if(bp != NULL) { X< if(bp->b_fd >= 0) { close(bp->b_fd); } X< if(*bp->b_tmpfile) { unlink(bp->b_tmpfile); } X< xfree(bp->b_linebuf); X< xfree(bp); X< } X< xfree(h); X< h = nexth; X< } X< X< herelist = NULL; X< } X< X< char * X< memcpy(ato, from, nb) X< register char *ato, *from; X< register int nb; X< { X< register char *to; X< X< to = ato; X< while (--nb >= 0) X< *to++ = *from++; X< return(ato); X< } X--- X> for (h = inhere; h != NULL; h = inhere) { X> h->h_iop->io_name = readhere(h->h_tag, h->h_dosub? 0: '\''); X> /* relink from inhere to acthere list */ X> inhere = h->h_next; X> h->h_next = acthere; X> acthere = h; X> } X> inhere = h; X> } X> X> static char * X> readhere(s, ec) X> register char *s; X> { X> int tf; X> char tname[30]; X> register c; X> jmp_buf ev; X> char line [LINELIM+1]; X> char *next; X> X> tempname(tname); X> tf = creat(tname, 0600); X> if (tf < 0) X> return (0); X> if (newenv(setjmp(errpt = ev)) != 0) X> return (0); X> if (e.iop == iostack && e.iop->iofn == filechar) { X> pushio(e.iop->arg, filechar); X> e.iobase = e.iop; X> } X> for (;;) { X> if (talking && e.iop <= iostack) X> prs(cprompt->value); X> next = line; X> while ((c = getc(ec)) != '\n' && c) { X> if (ec == '\'') X> c &= ~ QUOTE; X> if (next >= &line[LINELIM]) { X> c = 0; X> break; X> } X> *next++ = c; X> } X> *next = 0; X> if (strcmp(s, line) == 0 || c == 0) X> break; X> *next++ = '\n'; X> write (tf, line, (int)(next-line)); X> } X> if (c == 0) { X> prs("here document `"); prs(s); err("' unclosed"); X> } X> close(tf); X> quitenv(); X> /* correct area? */ X> return (strsave(tname, areanum)); X> } X> X> /* X> * open here temp file. X> * if unquoted here, expand here temp file into second temp file. X> */ X> herein(hname, xdoll) X> char *hname; X> { X> register hf, tf; X> X> if (hname == 0) X> return(-1); X> hf = open(hname, 0); X> if (hf < 0) X> return (-1); X> if (xdoll) { X> char c; X> char tname[30]; X> jmp_buf ev; X> X> tempname(tname); X> if ((tf = creat(tname, 0600)) < 0) X> return (-1); X> if (newenv(setjmp(errpt = ev)) == 0) { X> PUSHIO(afile, hf, herechar); X> setbase(e.iop); X> while ((c = subgetc(0, 0)) != 0) { X> c &= ~ QUOTE; X> write(tf, &c, sizeof c); X> } X> quitenv(); X> } else X> unlink(tname); X> close(tf); X> tf = open(tname, 0); X> unlink(tname); X> return (tf); X> } else X> return (hf); X> } X> X> scraphere() X> { X> inhere = NULL; X> } X> X> /* unlink here temp files before a freearea(area) */ X> freehere(area) X> int area; X> { X> register struct here *h, *hl; X> X> hl = NULL; X> for (h = acthere; h != NULL; hl = h, h = h->h_next) X> if (getarea(h) >= area) { X> if (h->h_iop->io_name != NULL) X> unlink(h->h_iop->io_name); X> if (hl == NULL) X> acthere = h->h_next; X> else X> hl->h_next = h->h_next; X> } X> } X> X> tempname(tname) X> char *tname; X> { X> static int inc; X> register char *cp, *lp; X> X> for (cp = tname, lp = "/tmp/shtm"; (*cp = *lp++) != '\0'; cp++) X> ; X> lp = putn(getpid()*1000 + inc++); X> for (; (*cp = *lp++) != '\0'; cp++) X> ; X> } + END-OF-FILE sh5.c.diff chmod 'u=rw,g=r,o=r' \s\h\5\.\c\.\d\i\f\f set `sum \s\h\5\.\c\.\d\i\f\f` sum=$1 case $sum in 19080) :;; *) echo 'Bad sum in '\s\h\5\.\c\.\d\i\f\f >&2 esac exit 0
Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sat, 19 Dec 87 17:52 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 7184 for MINIX@UWALOCKE; Sat, 19 Dec 87 17:51 PST Received: by NDSUVM1 (Mailer X1.24) id 7145; Sat, 19 Dec 87 19:43:20 CST Date: 17 Dec 87 17:04:52 GMT From: Phil Miller <pcm@ogcvax.uucp> Subject: Updating login.c Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU In the V1.2 updates, there is a diffs file for login.c in the commands. However, I find no such file (login.c) on any of the distribution floppies. Could someone please post or e-mail a copy of login.c to me? Thanks in advance. --Phil
Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sat, 19 Dec 87 17:56 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 7362 for MINIX@UWALOCKE; Sat, 19 Dec 87 17:56 PST Received: by NDSUVM1 (Mailer X1.24) id 7313; Sat, 19 Dec 87 19:54:23 CST Date: 20 Dec 87 01:36:19 GMT From: Jess Anderson <ANDERSON@vms3.macc.wisc.edu> Subject: Posting Duplication Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: Warning -- original Sender: tag was mmdf@UDEL.EDU Comments: To: info-minix@UDEL.EDU Are you aware that every minix post is coming to Usenet twice, once as itself, and once as undeliverable mail from postmaster @locke.bitnet? Most annoying. Sure hope you can fix it.
Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sat, 19 Dec 87 23:48 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 8950 for MINIX@UWALOCKE; Sat, 19 Dec 87 23:48 PST Received: by NDSUVM1 (Mailer X1.24) id 8884; Sun, 20 Dec 87 01:45:29 CST Date: 19 Dec 87 21:39:15 GMT From: Andy Tanenbaum <ast@cs.vu.nl> Subject: Emacs for Christmas! Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU That's right, Emacs for Christmas! In a series of postings I have distributed Ken Harrenstien's Emacs clone called ELLE. This posting is intended to let you figure out if you got all the files correctly. If everything arrived properly, ls -l should give this report: -rw-r--r-- 1 ast 302 Dec 19 20:07 .ellepro.b1 -rw-r--r-- 1 ast 6006 Dec 19 20:07 .ellepro.e -rw-r--r-- 1 ast 18120 Dec 19 22:18 Announcement -rw-r--r-- 1 ast 8822 Dec 19 20:07 defprf.e -rwxr-xr-x 1 ast 71522 Dec 19 20:07 elle -rw-r--r-- 1 ast 98565 Dec 19 22:14 elle.uuencoded -rw-r--r-- 1 ast 18500 Dec 19 22:11 ellec -rw-r--r-- 1 ast 25514 Dec 19 22:15 ellec.uuencode -rw-r--r-- 1 ast 446 Dec 19 22:14 ellepro.b1.uue -rw-r--r-- 1 ast 17020 Dec 19 20:07 help.dat -rw-r--r-- 1 ast 33948 Dec 19 22:20 sharfile The sum listings are as follows (except the block sizes are off by 2): 21924 18 Announcement 55136 9 defprf.e 05771 70 elle 21986 97 elle.uuencoded 15228 19 ellec 51169 25 ellec.uuencode 63217 1 ellepro.b1.uue 41527 17 help.dat 12343 34 sharfile Other than this posting there are 6 others: 1. Announcment (includes the user manual) 2. elle.uuencoded part 1 of 2 3. elle.uuencoded part 2 of 2 4. ellec uuencoded 5. .ellepro.b1.uuencoded 6. sharfile The two elle files should be stripped of their mail headers and joined to give one file. Check to see that this file has the same size and sum as elle.uuencoded. The file ellec should be checked against ellec.uuencoded. Finally .ellepro.b1.uu should also be checked. If all three are ok, uudecode them and compare to elle, ellec, and .ellepro.b1, respectively. The announcement is not encoded, nor is the shar file, which contains defprf.e, .ellepro.e, and help.dat. Installation instructions are at the end of the announcement. I have tested ELLE fairly extensively on a Z-248 AT clone and found no errors. If you find errors, please post them to this group. I will try to answer questions, etc. as best I can. It is conceivable that our network link will die shortly, because we have intelligent I/O boards installed and they know that the university is closed for vacation until January 4, 1988, so that if they break, nobody will touch them for two weeks and they can have a nice rest. If I am suddenly silent, it is more likely due to this than to my hiding from all the abuse about to be aimed at me because ELLE is not full Emacs. Finally, now that I have your undivided attention, how about somebody taking a good look at the sed I posted before, with an eye to getting the last bugs out of it. If that occurs, we can change the MINIX shar to use sed, and thus be compatible with the UNIX shar. To test sed, make a sed script that converts like this: /and/s//QQQ1/ /the/s//QQQ2/ /has/s//QQQ3/ /this/s//QQQ4/ etc. Then run this on a large piece of text. Then convert it back with another sed script and compare the output with the original. Put some long lines in because it seems to stumble on these. Andy Tanenbaum (ast@cs.vu.nl)
Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 00:43 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 9248 for MINIX@UWALOCKE; Sun, 20 Dec 87 00:42 PST Received: by NDSUVM1 (Mailer X1.24) id 9215; Sun, 20 Dec 87 02:38:50 CST Date: 20 Dec 87 06:46:59 GMT From: monty walls <mwalls@unirot.uucp> Subject: Man page for PS Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU ---------------------------------------------------------------------------- Sorry about forgetting to enclose the doc's for PS. Therefore please find enclosed the man page. Have fun with it- Monty Walls. -------------------------Cut Here-------------------------------------------- NAME ps - process status SYNOPSIS ps [-alx ] DESCRIPTION PS prints information about active processes. It does so by examining kernel, mm, and fs address spaces. The 'a' option asks for information about all processes with terminals (normally only ones own processes are displayed); 'x' displays processes even without terminals; 'l' asks for the long listing. The normal short listing contains the PID, TTY, TIME, and the CMD. The long listing contains: F - 01: in use; 02: waiting; 04: hanging; 10: paused; 20: alarm on; 40: seperate I & D spaces. S - s - suspended, r - running (process FS status) UID - owners uid PID - process id PPID - parents process id ADDR - core address(in hex) SZ - size of code+data+stack(in hex) WCHAN - the pid or name of the process its waiting on TTY - owning tty TIME - system & user time in seconds for the process CMD - command name of process FILES /dev/mem core memory /etc/maint.info kernel, fs, and mm maintence info PORTABILITY Heavily dependent on the basic structure of minix on 8088. SEE ALSO kill(1) .............
Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 03:07 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 9891 for MINIX@UWALOCKE; Sun, 20 Dec 87 03:06 PST Received: by NDSUVM1 (Mailer X1.24) id 9861; Sun, 20 Dec 87 04:52:25 CST Date: 19 Dec 87 21:40:54 GMT From: Andy Tanenbaum <ast@cs.vu.nl> Subject: Announcement of Emacs for MINIX (users manual) Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU ELLE FOR MINIX Andy Tanenbaum (ast@cs.vu.nl) 1. INTRODUCTION I have good news for the Emacs fans among the MINIX users. I have ported an Emacs clone to MINIX. The clone is called ELLE (ELLE Looks Like Emacs). It was written by Ken Harrenstien of SRI. His e-mail address is klh@sri-nic.arpa. ELLE is not full Emacs (surely you didn't expect that?), but it has about 80 commands and is highly usable. I am not distributing the (700K) source, but you can get it from Vincent Broman's MINIX archive. Instructions will be posted shortly. For people who don't know about Emacs, it is a VERY VERY big editor that can do anything you can imagine, if you have enough patience to wait forever. Mined was inspired by Emacs, and has the same style, but only a small subset, and is much faster. Compared to mined, ELLE has the following advantages: 1. It can edit files as large as the disk can hold (vs. mined, 38K) 2. It can handle multiple windows (2, to be specific) 3. You can have lots of files in the editor simultaneously 4. You can change the key bindings relatively easily 5. It has a bunch of additional commands that mined is missing Compared to Emacs, it has the following advantages: 1. It is much, much smaller 2. It is a lot faster 3. It has #ifs for a large number of machines The disadvantage of ELLE compared to mined is that regular expressions are missing, and compared to Emacs that hundreds and hundreds of commands are missing. For the record, I am aware of Jove and Scame and have tried both. Without getting into all the details, ELLE seems much better suited to MINIX. It is very fast, for example. Implementing full Emacs on MINIX is unthinkable. One problem is that I have been unable to compile ELLE on MINIX. I can compile all the files, but asld runs out of space when linking everything. I have made a preliminary attempt to see if asld can be sfixed, but it really appears to be out of space. The only solution is to remove a few of the ELLE source files (such as internal diagnostics and paragraph filling). I haven't really worked on this and definitely don't have the time now. My hope is that one or more of you will do that. I cross compiled ELLE on PC-IX. That works fine. People who are using Turbo C might try that. 1.1 Key bindings Mined only has a small number of commands. All of them are either of the form CTRL-x or are on the numeric keypad. Emacs, in contrast, has so many commands, that not only are all the CTRL-x commands used up, but so are all the ESC x (escape followed by x; escape is not a shift character, like CTRL). Even this is not enough, so CTRL-X is used as a prefix for additional commands. Thus CTRL-X CTRL-L is a command, and so is CTRL-X K. Fortunately, it wasn't necessary to distinguish upper case from lower case, so what is conventionally written as CTRL-X K really means CTRL-X k. The result of all this is that many commands need three or four key strokes to execute. The command "CTRL-X (" requires you to touch CTRL, X, shift, and (, for example, because the parentheses are upper case. A lot of people think 4 (usually pretty obscure) key strokes is too much work. For this reason, Emacs and ELLE allow users to assign their own key bindings. In ELLE this is done with "user profiles." A user profile is a file listing which function is invoked by which key stroke. The user profile is then compiled by a program called ellec into binary form. When ELLE starts up it checks to see if a file .ellepro.b1 exists in $HOME. If it does, this file is read in and overrides the default bindings. It is also possible to tell ELLE to read in a specific file as profile. I have written a user profile that simulates the mined commands fairly well (but not perfectly, since there are a few things that ELLE simply cannot perform). This profile also includes the other ELLE functions, mostly in the form ESC x, rather than the 3 and 4 key stroke Emacs commands. In addition, the numeric keypad is used, and lowercase characters were used in preference to uppercase where possible (e.g., = instead of +). Furthermore, I have made an attempt to choose mnemonic names for most commands, although the goals of choosing mmenomic names and having all the common command be no longer than two lowercase key strokes are in conflict. If you have never used Emacs, I suggest that you use the mined profile. It should be easy to learn, since it is a superset of mined. If you already know Emacs, you have a choice of familiarity vs. fewer key strokes. In particular, I have avoided the many CTRL-X y and CTRL-X CTRL-Y sequences that Emacs has. A third option is to build your own profile using ellec. The keybindings are described below. ELLE has a character-oriented view of the world, not a line oriented view, like ed. It does not have magic characters for searching, however, you can use line feed in search patterns. For example, to find a line consisting of the three characters "foo" all by themselves on a line, using the mined bindings (see below), use the pattern: CTRL-\ CTRL-J f o o CTRL-\ CTRL-J. The CTRL-\ means to interpret the next character literally, in this case it is CTRL-J, which is line feed. You can also search for patterns involving multiple lines. For example, to find a line ending in an "x" followed by a line beginning with a "y", use as pattern: x CTRL-\ CTRL-J y. 2. MINED KEY BINDINGS These are the key bindings if the binary user profile, .ellepro.b1, is installed in $HOME. The ESCAPE key followed by a number followed by a command causes that command to be executed "number" times. This applies both to control characters and insertable characters. CTRL-X refers to a "control character." ESC x refers to an escape character followed by x. ^X Y refers to CTRL-X followed by y. To abort the current command and go back to the main loop of the editor, type CTRL-G, rather than CTRL-\. Only a few commands are of the form CTRL-X Y. All of these are also bound to CTRL-X CTRL-Y, so you can hold down CTRL and then hit X Y, or release control after the X, as you prefer. The key bindings that are not listed should not be used. Some of them actually do things. For example, the ANSI escape codes ESC [ x are bound to ^X Y for a variety of y. Some commands work on regions. A region is defined as the text between the most recently set mark and the cursor. 2.1 Mined Commands CURSOR MOTION arrows Move the cursor in the indicated direction CTRL-A Move cursor to start of current line CTRL-Z Move cursor to end of current line CTRL-F Move cursor forward word CTRL-B Move cursor backward to start of previous word SCREEN MOTION Home key Move to first character of the file End key Move to last character of the file PgUp key Scroll window up 22 lines (closer to start of the file) PgDn key Scroll window down 22 lines (closer to end of the file) CTRL-U Scroll window up 1 line CTRL-D Scroll window down 1 line ESC , Move to top of screen CTRL-_ Move to bottom of screen MODIFYING TEXT DEL key Delete the character under the cursor Backsp Delete the character to left of the cursor CTRL-N Delete the next word CTRL-P Delete the previous word CTRL-T Delete tail of line (all characters from cursor to end of line) CTRL-O Open up the line (insert line feed and back up) ESC G Get and insert a file at the cursor position (CTRL-G in mined) REGIONS CTRL-^ Set mark at current position for use with CTRL-C and CTRL-K CTRL-C Copy the text between the mark and the cursor into the buffer CTRL-K Delete text between mark and cursor; also copy it to the buffer CTRL-Y Yank contents of the buffer out and insert it at the cursor MISCELLANEOUS numeric + Search forward (prompts for expression) numeric \(em Search backward (prompts for expression) CTRL-] ESC n CTRL-[ goes to line n (slightly different syntax than mined) CTRL-R Global replace pattern with string (from cursor to end) CTRL-L Replace pattern with string within the current line only CTRL-W Write the edited file back to the disk CTRL-S Fork off a shell (use CTRL-D to get back to the editor) CTRL-G Abort whatever the editor was doing and wait for command (CTRL-\) CTRL-E Redraw screen with cursor line positioned in the middle CTRL-V Visit (edit) a new file CTRL-Q Write buffer to a file ESC X Exit the editor 2.2 Non-Mined Commands CURSOR MOTION ESC P Forward paragraph (a paragraph is a line beginning with a dot) ESC ] Backward paragraph ESC . Indent this line as much as the previous one MODIFYING TEXT CTRL-\ Insert the next character (used for inserting control characters) ESC T Transpose characters ESC W Transpose words ESC = Delete white space (horizontal space) ESC | Delete blank lines (vertical space) REGIONS ESC M Mark current paragraph ESC ^ Exchange cursor and mark ESC Y Yank back the next-to-the-last kill (CTRL-Y yanks the last one) ESC A Append next kill to kill buffer KEYBOARD MACROS ESC / Start Keyboard Macro ESC \ End Keyboard Macro ESC * View Keyboard Macro (the PrtSc key on the numeric pad is also a *) ESC E Execute Keyboard Macro WINDOW MANAGEMENT ^X 1 Enter one window mode ^X 2 Enter two window mode ^X L Make the current window larger ^X P Make the window more petit/petite (Yes, Virginia, they are English) ^X N Next window ^X W New window BUFFER MANAGEMENT numeric 5 Display the list of current files and buffers ESC B Select a buffer ESC S Select an existing buffer ESC N Mark a buffer as NOT modified (even if it really is) UPPER AND LOW CASE MANIPULATION ESC I Set first character of word to upper case ESC C Capitalize current word ESC O Make current word ordinary (i.e., lower case) ESC U Set entire region between mark and cursor to upper case ESC L Set entire region between mark and cursor to lower case MISCELLANEOUS ESC F Find file and read it into its own buffer ESC Z Incremental search ESC Q Like CTRL-R, but queries at each occurrence (type ? for options) ESC R Reset the user profile from a file ESC H Help (ELLE prompts for the 1 or 2 character command to describe) ESC ; Insert a comment in a C program (generates /* */ for you) ^X X Exit the editor (same as ESC X and CTRL-X CTRL-X) The major differences between ELLE with the mined profile and mined are: 1. The definition of a "word" is different for forward and backward word 2. The mark is set with CTRL-^ instead of CTRL-@ 3. Use CTRL-G to abort a command instead of CTRL-\ 4. Use CTRL-\ to literally insert the next character, instead of ALT 5. CTRL-E adjusts the window to put the cursor in the middle of it 6. To get and insert a file, use ESC G instead of CTRL-G 7. To go to line n, type ESC n CTRL-[ instead of CTRL-[ n 8. You exit with CTRL-X CTRL-X and then answer the question with "y". 9. There are many new commands, windows, larger files, etc. Needless to say, if it had been easy to eliminate these differences and have the two editors be fully compatible, I would have done so. In each case it would have been a significant undertaking. 3. EMACS KEY BINDINGS This section was adapted from the official ELLE documentation. CURSOR MOVEMENT CTRL-F Forward one character. CTRL-B Backward one character. CTRL-H Same as CTRL-B: move backward one character. ESC F Forward one word. ESC B Backward one word. CTRL-A Beginning of current line. CTRL-E End of current line. CTRL-N Next line (goes to the next line). CTRL-P Previous line (goes to the previous line). CTRL-V Beginning of next screenful. ESC V Beginning of previous screenful. ESC ] Forward Paragraph. ESC [ Backward Paragraph. ESC < Beginning of whole buffer. ESC > End of whole buffer. DELETING CTRL-D Deletes forward one character (the one the cursor is under). DELETE Deletes backward one character (the one to left of cursor). ESC D Kills forward one word. ESC DEL Kills backward one word. CTRL-K Kills the rest of the line (to the right of the cursor). ESC \ Deletes spaces around the cursor. CTRL-X CTRL-O Deletes blank lines around the cursor. CASE CHANGE ESC C Capitalizes word : first letter becomes uppercase; rest lower ESC L Makes the whole next word lowercase. ESC U Makes the whole next word uppercase. CTRL-X CTRL-L Makes whole region lowercase. CTRL-X CTRL-U Makes whole region uppercase. SEARCHING (If no string is given, previous string is used) CTRL-S Incremental Search forward; prompts "I-search:" CTRL-R Reverse Incremental Search; prompts "R-search:" During an incremental search, the following characters have special effects: "normal" chars - Begin searching immediately. ^G - Cancel I-search, return to start. DEL - Erase last char, return to last match. ^S, ^R - Repeat search (or change direction). ESC or CR - Exit I-search at current point. ESC % Query Replace. Asks for a search string, then for the replacement string, and begins searching. Stops at each match and waits for a command. Type "?" to see your options. CTRL-X % Replace String. Like Query Replace, but simply replaces all matches, without stopping to ask. MARKING AREAS CTRL-^ Set mark CTRL-X CTRL-X Exchange cursor and mark. ESC H Mark Paragraph. Sets mark and cursor to surround a para. CTRL-W Wipe-out -- kills a "region": ESC W Copy region. Like CTRL-W then CTRL-Y but does modify buffer CTRL-Y Yanks-back (un-kills) whatever you have most recently killed . ESC Y Yanks-back (un-kills) the next most recently killed text. ESC CTRL-W Append Next Kill. Accumulates stuff from several kills FILLING TEXT ESC Q Fill the paragraph to the size of the Fill Column. ESC G Fill the region. CTRL-X F Set Fill Column. ESC Q will use this line size. CTRL-X . Set Fill Prefix. Asks for prefix string CTRL-X T Toggles Auto Fill Mode. WINDOWS CTRL-X 2 Make two windows (split screen). CTRL-X 1 Make one window (delete window) (make one screen). CTRL-X O Go to Other window. CTRL-X ^ Grow window: makes current window bigger. BUFFERS CTRL-X CTRL-F Find a file and make a buffer for it. CTRL-X B Select Buffer: goes to specified buffer or makes new one CTRL-X CTRL-B Show the names of the buffers used in this editing session. CTRL-X K Kill Buffer. ESC ~ Say buffer is not modified. CTRL-X CTRL-M Toggle EOL mode (per-buffer flag). KEYBOARD MACRO CTRL-X ( Start collecting a keyboard macro. CTRL-X ) Stop collecting. CTRL-X E Execute the collected macro. CTRL-X * Display the collected macro. FILES CTRL-X CTRL-I Insert a file where cursor is. CTRL-X CTRL-R Read a new file into current buffer. CTRL-X CTRL-V Same as ^X ^R above (reads a file). CTRL-X CTRL-W Write buffer out to new file name. CTRL-X CTRL-S Save file: write out buffer to its file name. CTRL-X CTRL-E Write region out to new file name. MISCELLANEOUS CTRL-X CTRL-Z Exit from ELLE. CTRL-X ! Escape to shell (CTRL-D to return) CTRL-O Open up line LINEFEED Same as typing RETURN and TAB. CTRL-T Transposes characters. ESC T Transposes words. CTRL-U Makes the next command happen four times. CTRL-U number Makes the next command happen "number" times. ESC number Same as CTRL-U number. CTRL-L Refreshes screen. CTRL-U CTRL-L Refresh only the line cursor is on. CTRL-U n CTRL-L Change window so the cursor is on line n CTRL-Q Quote: insert the next character no matter what it is. CTRL-G Quit: use to avoid answering a question. ESC ; Inserts comment (for writing C programs). ESC I Inserts indentation equal to previous line. ESC M Move to end of this line's indentation. CTRL-_ Describes a command is command database is online UNUSED CONTROLS CTRL-\ Special debugging command. Not for normal users! CTRL-^ Special debugging command. Not for normal users! CTRL-C Not used. CTRL-Z Not used. CTRL-] Not used. 4. INSTALLING ELLE ON MINIX I have distributed the following files: elle (executable binary of the editor) ellec (executable binary of the profile compiler) .ellepro.e (mined profile in source form) .ellepro.b1 (mined profile in binary form) defprf.e (default profile in source form) help.dat (help file) Before starting to install ELLE, be sure you have updated to the tty.c that supports both ANSI input and output. Also install the /etc/termcap file that goes with this tty driver. HOW TO INSTALL ELLE Step 1: Install 'elle' and 'ellec' in your /bin or /usr/bin directory. Step 2: Install help.dat in /usr/src/elle/help.dat Step 3: If you want to use the mined-like commands, install .ellepro.b1 in $HOME Step 4: Type 'elle filename' and you are up and running. HOW TO CREATE YOUR OWN USER PROFILE Step 1: Modify .ellepro.e to suit your taste Step 2: Install .ellepro.e in $HOME Step 3: Type: ellec -Profile Step 4: Check to see if $HOME/.ellepro.b1 was created If you have questions that are likely to be of interest to other people, post them rather than sending me private mail.
Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 03:45 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 0711 for MINIX@UWALOCKE; Sun, 20 Dec 87 03:45 PST Received: by NDSUVM1 (Mailer X1.24) id 0649; Sun, 20 Dec 87 05:41:23 CST Date: 19 Dec 87 21:48:43 GMT From: Andy Tanenbaum <ast@cs.vu.nl> Subject: .ellepro.b1.uu (ELLE binary user profile) Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU begin 644 .ellepro.b1 M 0" !( + "2 "( Z@ "X! !0+)E-."@ ' 0 E= ,,&@U$<H(<5#Q 7&D5 M6P(>(U8! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! M 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! M 0$! 0$! 0$! 08P7S%?,E\S7S1?-5\V7S=?.%\Y7T%K0C)##T5F1CQ'/TAA M21%+-$PH32].-D\04"U1<U):4S-4"54G5PY8@UEJ6G!>)"IG6UQ=+CT(?!LL M53M\+GTO9%QE,4<R1D$90AA#!$0%1S5(.$Q)3DA02E-O5&Y53U905TY8@UDY @ 1D"& ,$! 4'-0@X#$D.2!!*$V\4;A5/%E 73AB#&3EO end
Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 03:58 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 0547 for MINIX@UWALOCKE; Sun, 20 Dec 87 03:58 PST Received: by NDSUVM1 (Mailer X1.24) id 0511; Sun, 20 Dec 87 05:36:58 CST Date: 19 Dec 87 21:45:57 GMT From: Andy Tanenbaum <ast@cs.vu.nl> Subject: ellec.uuencoded (key binding compiler) Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU begin 644 ellec M 0,0!# !&+ SAL /85 ! !& M+ B]R+#X/# HO!0-'@ \.C1BQ04U'H!P"#Q 90Z.@>Z7L#QP:>5 @WX$ M 7\&_P:F5.L,_W8&_W8$Z&D#@\0$_S9,+.@'(8/$ J.45/\V4"SH^B"#Q *C MEE3_-E0LZ.T@@\0"HYA4_S98+.C@((/$ J.:5(,^E%0 =!6#/I94 '0.@SZ8 M5 !T!X,^FE0 =0JXH3U0Z" ;@\0"QP9.+( N( 4/\VE%2X3C%0Z 0:@\0& MQP92+& N& 4/\VEE2XSC%0Z.P9@\0&QP96+$X N$X 4/\VF%2X+C)0Z-09 M@\0&@SZ,,@!T%:&*,J-:+%#_-II4_S:,,NBX&8/$!K\ #L^3#%]6(O?N0, MT^.#OUXL '1'B]^Y P#3XXF_%$B+W[D# -/CBX=>+(O?N0, T^.)AQ9(B]^Y M P#3X_^W8"SHFQF#Q *+W[D# -/CB8<82#D^2"Q]!(D^2"Q'ZZ*#/J)4 '0D M_S;41[BX/5#_-J)4Z-0:@\0&A<!U#O\VHE2XNCU0Z# :@\0$@SZD5 !T)/\V MUD>XUCU0_S:D5.BI&H/$!H7 =0[_-J14N-@]4.@%&H/$!(,^IE0 = JX]3U0 MZ/09@\0"@SZH5 !U!X,^JE0 ="?H<PV%P'06@SZH5 !T!>AL!NL*@SZJ5 !T M ^BI!+@ %#H#QV#Q *#/JY4 '04Z$4-A<!T ^B.!+@ %#H]!R#Q *#/K)4 M '04Z"H-A<!T ^@G#+@ %#HV1R#Q *#/K!4 '04Z \-A<!T ^CW"K@ %#H MOAR#Q *#/K14 '4'@SZV5 !T&^CM#(7 = K_-K94Z'T)@\0"N 4.B5'(/$ M H,^NE0 =!3HRPR%P'0#Z$P+N 4.AZ'(/$ H,^K%0 =0JX !0Z&D<@\0" M@SZB5 !U9<:&T/X N @^4.CW&X/$ HOPA<!T#%:-AM#^4.B')H/$!+@-/E"- MAM#^4.AX)H/$!+@//E"-AM#^4.AI)H/$!/\VU$>X&CY0C8;0_E#H4AF#Q :% MP'4/C8;0_E"X'#Y0Z*T8@\0$@SZD5 !U?,:&T/X N#4^4.B+&X/$ HOPA<!T M#%:-AM#^4.@;)H/$!+@Z/E"-AM#^4.@,)H/$!+@\/E"-AM#^4.C])8/$!/\V MUD>X2#Y0C8;0_E#HYAB#Q :%P'4F_S;61[A+/E"-AM#^4.C/&(/$!H7 =0^- MAM#^4+A-/E#H*AB#Q 3HMPN%P'0#Z# &Z6PGN"P!Z"PGZ7S\Z5H!QT;R "+ M1@:)1OJ+?@3'!KQ4 "#[P%_ ^DK 8-&^@*+7OJ+'X _+70&_P:\5.ODBU[Z M_P>X! !0N L 4+B.,E"-1O10BU[Z_S?H%@&#Q J)1O:#?O0 =""+7O3_-XM> M]O\WBU[Z_S>XKCY0_S;81^C7%X/$"NG$ (-^]@!U ^F8 (M>]HM' NM\BU[V MBU\$QP<! .FF (M>]HM?!,<' 0"#_P%_ ^F4 (M>^HM? HH'F(O8BH<S1YBI M! !T%XM>^O]W NC7&H/$ HM>]HM?!(D'3^M=ZV:#_P%_ NM?BU[ZBT<"BU[V MBU\&B0?K1(M>^O\WN-<^4/\VV$?H3!>#Q ;_1O+K%#T '4#Z7S_/0$ =(0] M @!TO^O4BU[Z_S>X\SY0_S;81^@@%X/$!O]&\NL+BU[ZQP< (-&^@*+7OK' M!P Z<W^@W[R '0*N $ 4.@*&H/$ ND&)K@* .C&)>F=_NMPB[X$ (NV" #' M1O@ ,=&^@ BUX&QP< ,=&]@ BT;V.T8*?33_-%?HP@"#Q 2)1O2%P'08 M@W[T 'X$B\;K+8-^^@!U!8EV^NL#B7;X_T;VBT8,T> #\.O$@W[X '0(BUX& MBT;XB0>+1OKK .F+);@( .A+)>N(ZVR+O@0 B[8& (O?1XH'F(E&^H7 =$6* M!)@Y1OIT.HH$F%#H&06#Q *)1O;_=OKH#06#Q (K1O:)1OB%P'0:@#P =06X M 0#K#H-^^ !^!;@" .L#N/[_ZQ)&ZZZ / !T!;C__^L#N ZP#I%26X!@#H MU23KC.MMB[X$ (NV!@"%_W0$A?9U!;@ .M5B]]'B@>8B4;ZA<!T-HH$F#E& M^G0KB@28,T;Z/2 =1N*!)A0Z(L$@\0"B4;X_W;ZZ'\$@\0".T;X= 6X #K M%4;KO8H$F#E&^G4%N $ ZP.X___K .F>)+@$ .A>).N+ZQW_=@;_=@3H?O^# MQ 2%P'X%N $ ZP.X #K .EW)+@ .@W).O;Z:L!N H_4.AY%8/$ K\ #L^ M3BQ]3Z&45 /'B]B*!Y@E_P")1OI0N*T_4.A5%8/$!%?HGP2#Q )05[BS/U#H M0A6#Q ;_=OKHO1*#Q )0N,$_4.@N%8/$!+C&/U#H)!6#Q )'ZZNXRS]0Z!<5 M@\0"OP .SY2+'UFH994 \>+V(I' 9@E_P")1OI0H994 \>+V(H'F"7_ (OP M4+CC/U#HXA2#Q :+Q@V %#H)P2#Q )0N.\_4.C+%(/$!/]V^NA&$H/$ E"X M]S]0Z+<4@\0$N/P_4.BM%(/$ H/' NN4N % 4.B>%(/$ K\ #L^5BQ]9J&8 M5 /'B]B*1P&8)?\ B4;Z4*&85 /'B]B*!Y@E_P"+\%"X&$!0Z&D4@\0&B\8- M %0Z*X#@\0"4+@D0%#H4A2#Q 3_=OKHS1&#Q )0N"Q 4.@^%(/$!+@Q0%#H M-!2#Q *#QP+KE+@V0%#H)12#Q *X.D!0Z!L4@\0"_S9*++A70%#H#12#Q 2X M:$!0Z ,4@\0"N(= 4.CY$X/$ KBF0%#H[Q.#Q *XQ4!0Z.43@\0"N,U 4.C; M$X/$ NG!(K@" .B!(NE,_NG9 ,<&OE0 +C10%#HO!.#Q *X\$!0Z+(3@\0" MOP .SY.+'T8H914 \>+V(H'F"7_ %!7Z*T @\0$1^OBN"-!4.B'$X/$ K\ M #L^4BQ]*Z&65 /'B]B*1P&8)?\ 4*&65 /'B]B*!Y@E_P -@ !0Z'$ @\0$ M@\<"Z\^X,T%0Z$D3@\0"OP .SY6+'TKH9A4 \>+V(I' 9@E_P!0H9A4 \>+ MV(H'F"7_ T 5#H,P"#Q 2#QP+KS[A+05#H"Q.#Q *#/KY4 '0._S:^5+A- M05#HD!*#Q 3IW"&X @#HG"'I'O_IB "#?@8 =0+K?8-^!@!^"8M&!CL&2"Q^ M&?]V!.@8 H/$ E#_=@:X=T%0Z+D2@\0&ZU&+7@:Y P#3XX._%D@ =1G_=@3H M\ &#Q )0_W8&N*I!4.B1$H/$!NLIBUX&N0, T^/_MQ9(_W8$Z,L!@\0"4.A# M 8/$ E"XZ4%0Z&@2@\0&ZP3_!KY4Z4@AN Z @AZ6__Z<T OQ( B3Z ,J%. M+*-^,@,^3BR)/H0RH5(LF;D" /?YHX(R SY2+(D^B#*A5BR9N0( ]_FCAC(# M/E8LB3Z,,J%:+*.*,@,^6BS_-M9'N $ 4+@2 %"X?#)0Z#84@\0(_S;61_\V M3BRX 0!0_S:45.@@%(/$"(,^4BP =!;_-M9'_S92++@! %#_-I94Z ,4@\0( M@SY6+ !T%O\VUD?_-E8LN $ 4/\VF%3HYA.#Q B#/EHL '06_S;61_\V6BRX M 0!0_S::5.C)$X/$".EO(+@ .@O(.DJ_^L8B[X$ %?H& "#Q *+UX'B@/\+ MPNL Z4P@N Z P@Z^#K'HM&!"5_ (OX@_]A? J#_WI_!8U%X.L"B\?K .DD M(+@ .CD'^O:ZW>+O@0 B7[ZBU[Z_T;ZB@>8B_"%P'0-5NAN!H/$ H7 = +K MY(7V=02+Q^M)QT;ZYC*+7OK&!R+_1OJ+WT>*!YB+\(O F(M>^O]&^H@'A<!T M$H/^(G4+B\:8BU[ZB ?_1OKKUXM>^L9'_R*+7OK&!P"XYC+K .FC'[@" .AC M'^N!ZVV+O@0 ODHS]\< 700B]Y&Q@=8B]Y&Q@<M@>?__O?'@ !T$(O>1L8' M38O>1L8'+8'G?_^#_Q]_"8O>1L8'7H/'0(/_?W44B]Y&Q@=$B]Y&Q@=%B]Y& MQ@=,ZPB+QYB+WD:(!\8$ +A*,^L Z2P?N Z.P>ZXOI2 ''AK3Y_$&#?@0 M=12X"T)0Z"(0@\0"N$)"4.@8$(/$ L>&UOP (V&V/Q0Z ,.@\0"O@$ .S9( M+'X#Z9D C8;8_(O6T>(#PHO8@S\ =0/I@0"+QKD# -/@!11(B_B#?0( =0M6 MN%!"4.AD#X/$!(M%!HE&^(7 =0>+AK3YB4;XQT;Z "+1OH[AM;\?2.-AK;Y MBU;ZT>(#PHO8_S?_=OCH<OF#Q 2%P'X"ZP7_1OKKU(M&^CN&UOQ] NL7C8:V M^8N6UOS1X@/"B]B+1OB)!_^&UOQ&Z5[_QT;Z "+1OH[AM;\?5>-AK;YBU;Z MT>(#PHO8BP<[AK3Y=#V#?@0 =!Z-AK;YBU;ZT>(#PHO8_S?_=@2X>4)0Z!T/ M@\0&ZQF-AK;YBU;ZT>(#PHO8_S>X@$)0Z (/@\0$_T;ZZZ"XB$)0Z/,.@\0" MZ=D=N$@&Z)D=Z:_^Z8T N(I"4.C:#H/$ KC!0E#HT Z#Q *-AK3\4.C!#(/$ M KX! #LV2"Q_8HO&N0, T^ %%$B+^%:X[$)0Z*4.@\0$C8:T_(O6T>(#PHO8 M@S\ = :#?0( =0RX]T)0Z(0.@\0"ZR7_=02X 4-0C4;44.B_%8/$!O]U HU& MU%#_=02X!D-0Z%T.@\0(1NN8Z4 =N$@#Z =Z6K_ZW*X(4-0Z$(.@\0"O@$ M.S9(+']<B\:Y P#3X 442(OX@ST =0+K1H-] @!U#5:X1$-0Z! -@\0$ZS.+ M102)1OJ%P'4%QT;Z;4.+10:)1OB%P'4%QT;X>D/_=OC_=OK_=0+_-;B)0U#H MX V#Q I&ZY[IPQRX! #H@QSKANGP +B?0U#HQ0V#Q *XW$-0Z+L-@\0"N")$ M4.BQ#8/$ HV&V/Q0Z*(+@\0"O@$ .S9(+'X#Z;@ B\:Y P#3X 442(OX@ST M=0/IH "#?00 = :#?0( =0Y6N&-$4.AJ#(/$!.F& (M%!(E&^(V&=/R)1OJ+ M7OC_1OB*!YA0Z/?[@\0"BU[Z_T;ZB >%P'0"Z^*-AG3\B4;ZBU[Z_T;Z@#]& M=0N+7OK_1OJ /U]T!XV&=/R)1OK_=0)6_W;ZN)%$4.@,#8/$"(V&V/R+UM'B M \*+V(,_ '4%N ZP*+QE#_=OJXL$10Z.8,@\0&1ND__^G(&[B( ^B(&^D' M_^L:Z)X B_B%P'0)5^A? H/$ NONN $ ZP#IHQNX #H8QOKWNMUBSY4,X7_ M?!J%_W4,@S[ 5 !T!;C__^M:QP94,___B\?K4/\VU$?HFA"#Q *+^#W__W4= MQP; 5 $ QP94,P BQY8,\8' ,<&6#/"5(O'ZR*#_PIU#/\&5C/'!E@SPE3K M#8O'F(L>6#.(!_\&6#.+Q^L Z20;N Z.0:ZX/K?^B% .AY_XOX/?__=06X M #K:H/_*74%N ZV"#_RAU.NC<"(OPB4;XQT0" @#HS?^+\(M>^(E'!(7 M=06+1OCK.NBY_XE&^H7 = J+1OJ)!(MV^NOLBT;XZR&#_R)U#+@! %#H9 "# MQ +K$(D^5#.X !0Z%0 @\0"ZP#IFQJX! #H6QKI>/_K.>CR_HOXBH4S1YBI M" !T NL:@_\[=1/HW/Z+^#T* '0)@___=0+K#^OMZP+KTX/__W0$B3Y4,^E7 M&K@ .@7&NN_Z;$ C8;0_HOXQX;._@ Z*+^B_ ]__]T6H-^! !T/XO&ZS+H MCOZ+\#W__W4%N ZW^#_B)T!HDV5#/K-O^&SOZ!OL[^+ %^ NL1B\:8B]]' MB ?KNCTB '3)Z^'K$U;H6P"#Q *%P'0"Z]*)-E0SZP+KG.B_!XF&S/Z+GLS^ MQT<" 0"+AL[^0%#H"!"#Q *+GLS^B4<$Q@4 C8;0_E"+GLS^_W<$Z!\8@\0$ MBX;,_NL Z9L9N# !Z%L9Z4;_ZS>#?@0@?BF#?@1_?2.#?@0H=!V#?@0I=!># M?@0[=!&#?@0B= N#?@1<= 6X 0#K [@ .L Z5D9N Z!D9Z\'K;(N^! "# M?0("= 2+Q^M;BW4$A?9U!;@ .M/@WP" 70%N ZT3'1OI:,XM>^H,_ '0E MBU[Z_S?_= 3H?/2#Q 2%P'0-_S2+7OK_5P*#Q +K&(-&^@3KT_]T!+CR1%#H M3@F#Q 2X #K .GC&+@" .BC&.N,ZU*+O@0 QP9(+ O@ @?Z0 7TWB]ZY M P#3X\>'%$@ (O>N0, T^/'AQ9( "+WKD# -/CQX<82 B]ZY P#3X\>' M&D@ $;KP[B<5.L Z8<8N Z$<8ZZ;I&@*+O@0 5^CK!H/$ CT$ 'T0N -% M4.C%"(/$ K@ .GW 8M% NLQBT4$B4;NZS6-1NQ0_W4$Z$@&@\0$A<!T"(M& M[(E&[NL<N!I%4.B/"(/$ K@ .G! 3T '3*/0$ =,WKY(L]@WT" 700N#I% M4.AK"(/$ K@ .F= 8M%!(E&](L]@WT" 700N%I%4.A-"(/$ K@ .E_ 8M% M!(E&\HL]@WT" 700N'I%4.@O"(/$ K@ .EA 8M%!(E&\(-^[@!^!X%^[I ! M?A/_=NZXG$50Z D(@\0$N Z3L!BT;NN0, T^ %%$B)1O:+7O:#/P!T?XM> M]HL'.T;N=47_=O2+7O;_=P+HWO*#Q 2%P'0R_W;RBU[V_W<$Z,OR@\0$A<!T M'XM>]H-_!@!T$_]V\(M>]O]W!NBO\H/$!(7 = /IH "+7O:#?P8 = B+7O:+ M1P;K [CD15"+7O;_=P2+7O;_=P*+7O;_-[BY15#H;@>#Q K'1O@ (%^^) ! M?62+7OBY P#3XX._%$@ =0+K3O]V\HM>^+D# -/C_[<82.C/\8/$!(7 ?QG_ M=O2+7OBY P#3X_^W%DCHMO&#Q 2%P'X<BT;X.T;N=0+K$O]V]+CS15#H" ># MQ 2X #K._]&^.N5BU[VBT;NB0>+7O:+1O")1P:+7O:+1O*)1P2+7O:+1O2) M1P*A2"P[1NY]!HM&[J-(++B<5.L Z6(6N! Z"(6Z=W]Z3D"B[X$ (7_= F+ M!8E&^H7 =0:X #I'P*+10+K&(MU!.LBN Z0\"_W4$Z.D"@\0"B_#K#ST M '3C/0$ =.D] @!TWH/^_W4&N Z>@!BW[Z@WT" 700N!5&4.A8!H/$ K@ M .G/ ?]U!.BW!(/$ HE&]H-^]@!U$_]U!+@X1E#H,P:#Q 2X #IJ@'WQ@ ! M=0/II "!YO_^QT;X "+1O@[!E8L?4:AF%0#1OB+V(H'F"7_ #OP=2ZAF%0# M1OB+V(I' 9@E_P [1O9T&/]U!/]V]E;HY/6#Q )0N%I&4.C4!8/$".L&@T;X M NNQBT;X.P96+'PDH58L.P94+'P0N']&4.BP!8/$ K@ .DG :%6+(E&^(,& M5BP"B\:8BQ:85 -6^(O:B >AF%0#1OB+V(M&]HA' >GX /?&@ !U ^FB ('F M?__'1O@ (M&^#L&4BQ]1J&65 -&^(O8B@>8)?\ ._!U+J&65 -&^(O8BD<! MF"7_ #M&]G08_W4$_W;V5N@W]8/$ E"XGD90Z"<%@\0(ZP:#1O@"Z[&+1O@[ M!E(L?".A4BP[!E L? ^XPT90Z ,%@\0"N ZWNA4BR)1OB#!E(L HO&F(L6 MEE0#5OB+VH@'H994 T;XB]B+1O:(1P'K38O&)7\ B4;XH914 T;XB]B /P!T M*Z&45 -&^(O8B@>8)?\ .T;V=!C_=03_=O96Z*7T@\0"4+CB1E#HE02#Q BA ME%0#1OB+V(M&]H@'N)Q4ZP#I'12X!@#HW1/IOOWK,+\ (LVE%0[/DXL?0F+ MWD;&!P!'Z_''!EHL #'!E8L #'!E(L "XG%3K .GB$[@ .BB$^O(Z8X MB[X$ (7_=06X #K?HM% NL;BT4$B4;ZZR*X #K;/]U!.B H/$ HE&^NL/ M/0 =. ] 0!TZ#T" '3>@W[Z '4%N ZT2^ [-E@L?3:AFE0#QHO8B@>8 M)?\ .4;Z= RAFE0#QHO8@#\ =16AFE0#QHO8BT;ZB ?_!EHLN)Q4ZPA&Z\2X M #K .E)$[@" .@)$^EI_^D: 8N^! "%_W4&N/__Z0D!QT;Z !7Z,H1@\0" MB4;XB]]'B@>8)?\ B_"#?O@ =0:X___IXP"#?O@!=06+QNG8 (/^7G4<@W[X M G40B@684.B&\H/$ B6?_^F] +C__^FW %;H<_*#Q *+\( ]+7521X ] '4& MN/__Z9T B\;K,U?H>_^#Q )0Z$[R@\0"#0 !Z84 5^AG_X/$ E#H.O*#Q (- M@ #K<E?H5/^#Q (EG__K9CU# '3O/4T =-<]6 !TOH/^4W4:B@684.@M\H/$ M CU0 '4+@W[X G4%N" ZSB#_D1U+HO?1XH'F%#H"_*#Q (]10!U'(O?1XH' MF%#H^?&#Q (]3 !U"H ] '4%N'\ ZP6X___K .DC$K@$ .CC$>G=_NL3N 8 M4+@! %#HB@F#Q 3K .D%$K@ .C%$>OEZVJ+?@2%_W4%N ZUO'1O@ +X M ( ]+74$1_]&^(O?1XH'F(E&^H7 ="6+7OJ*AS-'F*D$ '4%N ZRN+QKH* M /?JBU;Z@^HP \*+\.O.@W[X '0&B\;WV.L"B\:+7@:)![@! .L Z9$1N 0 MZ%$1ZX[K%XN^! "^ "%_W0%1HL]Z_>+QNL Z7 1N Z# 1Z^'K+(N^! "^ M "%_WX9.SY(+'\3B]^Y P#3XXNW%DB%]G0$B\;K!;@%1^L Z3H1N Z/H0 MZ\SK.(N^! "+-D@LA?9^)(O>N0, T^/_MQ9(5^A_[(/$!(7 = 2+QNL/@^X! M=>&X #K!;@ .L Z?@0N Z+@0Z\#IC@"+O@0 O@ @?Z0 7T/B\;1X /' MB]C'!P 1NOKO@ .S9.+'T:H914 \:+V(H'F"7_ (O T> #QXO8_P=&Z^"^ M [-E(L?1VAEE0#QHO8BD<!F"7_ (O T> #QXO8_P>#Q@+KW;X #LV5BQ] M':&85 /&B]B*1P&8)?\ B\#1X /'B]C_!X/& NO=Z5\0N Z!\0Z6G_ZR*+ MO@0 B[8& (-^" !^$8O?1XH'F(O>1H@'@VX( 77OZ3(0N Z/(/Z];K+XN^ M! " /2!U T?K^( ] '075^BW#H/$ @/'B_!.@#P@=0+K^$;&! "+Q^L Z?D/ MN ( Z+D/Z\GK1[@61U#_-MA'Z,X @\0$_W86_W84_W82_W80_W8._W8,_W8* M_W8(_W8&_W8$_S;81^BF (/$%K@>1U#_-MA'Z)@ @\0$Z:@/N Z&@/Z['K M1/]V%O]V%/]V$O]V$/]V#O]V#/]V"O]V"/]V!O]V!.B,_X/$%(L>6#/&!P"X MPE10_S96,[@@1U#_-MA'Z$H @\0(Z5H/N Z!H/Z[3K,?]V%O]V%/]V$O]V M$/]V#O]V#/]V"O]V"/]V!O]V!.@^_X/$%+@! %#H(P.#Q +I'P^X #HWP[K MQP KP.C7#HU&"%#_=@;_=@3HI@>#Q :+7@2+1P2I0 !T!U/HZ &#Q +I[ XK MP.BM#HU&!E#_=@3_-M9'Z'L'@\0&BQ[61XM'!*E '0'4^B\ 8/$ NG #BO MZ($._W8(Z!L @\0"A<!T!2O Z:D._W8&_W8$Z'@ @\0$Z^\ *\#H6PXK_^L' MN/__Z8L.1X/_%'T7B]_1XXM&!#N'U$=U[8O?T>/'A]1' "#_Q1]V/]V!.A9 M 8/$ HM>!/\WZ 0#@\0"BUX$BT<$J2 = ^#?P8 = G_=P;H\P6#Q *#_P)^ M"?]V!.CE!8/$ BO ZYL N 8 Z.@-QT;V K_^LH@_\4?"+K4#UW '5+@4[V M @"XI %0_W8$Z-@ @\0$B4;XA<!\,NMG1XO?T>.#O]1' '7-BUX&B@>8/6$ M=1Z!3O8" +@! %#_=@3HV@*#Q 2)1OB%P'TD*\#IDP ]<@!UIH%.]@$ *\!0 M_W8$Z+@"@\0$B4;XA<!]%>O<N ( 4"O2*\!24/]V^.A: H/$"+@* %#HR0.# MQ *)1OJ%P'2XB]C'1P( (O8BT;XB0>+1O:)1P2X 10Z*0#@\0"BU[ZB4<& M@W\& '4'@4\$! #K"(M>^H%/!" BU[ZBT<&B4<(B]_1XXM&^HF'U$>+1OKI M)PT *\#HYPS_=@3_=@:X" !0N $ 4.@R#(/$".D*#;@" .C*#(M>!(M'!*D$ M '4(BT<$J0( =00KP.LPBUX$@W\" '[S_W<"_W<&_S?HGPN#Q :)1OJ+7@0[ M1P)U$<=' @ BT<&B4<(BT;ZZ;H,BUX$@4\$$ "X___K\ "X! #H; S'1O@ M (-^!@!U"^LU@V[Z 741_T;XBT;X.T8(<R2+1@:)1OK_=@J+7@3_1@2*!YA0 MZ(H)@\0$BUX*BT<$J1 =,N+1OCI7@RX! #H'@R+O@0 BS9&+(O>@\8"BP>) M1OJ%P'0\B7[XBU[X@#\ =!G_1OB*!YB+7OK_1OJ*%[D( -/BT_H[PG3?BU[X M@#\ =<:+7OJ /SUUOHO#!0$ Z08,*\#K^>LU@S[N50!T!/\6[E6X !0N M4+@ %"X !0N 4/]V!+@! %"X !0Z+T*@\00ZP#IRPNX #HBPOKPP"X M! #H@@N+O@0 *_;'1O@ .L!1XH%F*.T1ST@ '3T/0D =.\]#0!TZCT* '3E M/0P =." /2UU%$?'1O@! .L,B\:Z"@#WZHOP W;ZB]]'B@>8+3 B4;Z/0H M<N.#?O@ = >+QO?8Z5@+B\;K^2O Z!4+*\!04%!04/]V!+@& %"X 0!0Z"0* M@\00Z30+N ( Z/0*BT8$H_15BU8(BT8&H_I5B1;\58M&"J/V5;@3 %"X 0!0 MZ'H*@\0$B4;ZA<!T!)GI_ J+%OQ5H?I5Z_0 *\#HLPK_=@3_=@:X!0!0N $ M4.C^"8/$".G6"K@" .B6"HM>!(M'!*D8 '0%N/__ZV"+7@2+1P2I 0!T\(-O M @%_6XM'!*D$ '0*N $ 4(U&^E#K"K@ !%"+7@3_=P:+7@3_-^A1 (/$!HM> M!(E' H-_ @!_'X-_ @!U!X%/! @ ZZJ+7@2!3P00 .N@BT;Z*N3I70J+7@2+ M1P:)1PB+7@2+1P2I! !UY/]'"(M'"$B+V(H'F.O9 +@" .CZ"2O 4%#_=@90 M_W8(_W8$N , 4+@! %#H!0F#Q!")1OKI$@HKP.C3":'^1P4" -&! 7_ R4 M_"T" (OX.S[^1W(+5^C= 8/$ H7 ?04KP.GC"8D^_D>+/OQ'ZP>+!27^_XOX M@ST =?2A_D>)!8L>_D?'!P N $ Z]6X! #H>PF+1@0% 0 E_O\% @")1OB+ M/OQ'A?]U<;@" %#HN0&#Q *+^*/\1Z/^1XO8QP< .M7B\:I 0!T$XO&)?[_ MB_CK1XM&^JD! '4+B_"+!(E&^H7 =>V+QBO'.T;X<BF+QP-&^(E&^CO&<P2+ MV(DWBT;Z#0$ B06-10+K"?]V!.AZ_X/$ NDO"8O^BS6%]G6C_W;XZ __@\0" MA<!UWRO Z^2X!@#HU@B+1@0M @"+^(M&!@4! "7^_P4" (E&^(L%)?[_B_"+ MQBM&!(E&]NL*BT;ZJ0$ =0N+\(L$B4;ZA<!U[8O&*\<[1OAR(XO' T;XB4;Z M.\9S!HO8B3?K HO�$ B06+1@3K BO Z:D(_W8&Z.C^@\0"B4;ZA<!TZ_]V M]E#_=@3H50"#Q :!)?[_BT;ZZ]>X @#H0PB+1@3W9@:+^%?HMOZ#Q *)1OJ% MP'4%*\#I8@B+=OKK!HO>1L8' (O'3X7 =?.+1OKKYBO Z P(BUX$@6?^_O_I M.P@ *\#H^P>+O@0 B[8& .L+B]]'B@>8B]Y&B >+1@C_3@B%P'7KZ1,( +@" M .C2!RO 4%#_=@104%"X$0!0*\!0Z.(&@\00B4;ZA<!U"Z$"5J, 2"O Z>,' MN/__Z_BX!@#HG@>+1@2)1O:A $B)1OBA $@#1O:)1OJ#?O8 ?A [1OAS"[C_ M_^L#BT;XZ:T'_W;ZZ)7_@\0"A<!T[>OFN H Z%X'QT;R___'1O:" (M&!(E& M^(M&!(E&^HU&"%#_=@:-1O)0Z!8 @\0&C4;R4"O 4.A_!(/$!(M&!.E>![@@ M .@>!XN^!@"+=@CIC $]1 !U ^D@ 3U/ '4#Z20!/5@ =0/I)P$]8P!U ^DJ M ?]V!+@E %#H/ 2#Q 3_=@2+WT>*!YA0Z"P$@\0$Z4P!@#TY?@/I@@&*!9@M M, #W;O2)1MR+1OBZ"@#WZ@-&W(E&^.E< 4> /3!] ^ED 8 ].7X#Z5P!BT;V MN@H ]^J*%;D( -/BT_J#ZC #PHE&]NO4@\8"BT3^F8E&\(E6\L=&^@H C4;? M4/]V^O]V\O]V\.A5 8/$"/]V!(U&WU#H,@6#Q )0BD;KF%#_=O;_=OB-1M]0 MZ:\ @\8"BT3^F8E&\(E6\BO2Z[&#Q@*+1/Z9B4;PB5;RA=)]""O2B4;PB5;R MQT;Z" #KG(/& HM$_IF)1O")5O*%TGT(*]*)1O")5O+'1OH0 .E[_X/&!(M4 M_HM$_.ED_X/&!(M4_HM$_.N[@\8$BU3^BT3\Z]"#Q@*+1/Z(1N__=@2*1N^8 M4.@( X/$!.LH@\8"BT3^B4;L_W8$4.A_!(/$ E"*1NN84/]V]O]V^/]V[.@S M H/$#$> /0!T=( ])70#Z93^QT;X #'1O8 ,=&] $ QD;K($> /2UU!L=& M]/__1X ],'4%QD;K,$> /3!\ ^EV_H ]+G4#Z9/^B@68/60 =0/IM/Y_ ^D> M_CUO '4#Z?W^/7, =0/I<?\]=0!U ^G<_CUX '4#Z07_Z1O^Z48%N!0 Z 8% MQT;L "#?@8 =1.#?@0 =0V+7@K&!S#&1P$ Z8P!@WX("G4<@WX& 'T6BU8& MBT8$]]KWV(/: (E&!(E6!O]&["O_C4;P \>+V,8' $>#_PQ\\"O_@WX("G5. M*]*X"@!24/]V!O]V!.A !8E&ZHU&\ /'B]B+1NJ(!XU&\ /'B]B*!YB9B4;H MB5;J*]*X"@!24(M6!HM&!"M&Z!M6ZE)0Z,@$B48$B58&@WX("'4MBU8&BT8$ M)0< *]*-5O #UXO:B >+5@:+1@2Y P#1^M'8XOJ!XO\?B48$B58&@WX($'4M MBU8&BT8$)0\ *]*-5O #UXO:B >+5@:+1@2Y! #1^M'8XOJ!XO\/B48$B58& M1X-^!@!T ^D\_X-^! !T ^DS_\=&[@ C47_B_#K1(U&\ /&B]B /P!U$H-^ M[@!U#(U&\ /&B]C&!R#K)8U&\ /&B]B /PI]#(U&\ /&B]B !S#K"HU&\ /& MB]B !S?_1NY.A?9]N(-^[ !T"XU&\ /'B]C&!RU'C47_B_#K$XU&\ /&B]B* M!YB+7@J(!_]&"DZ%]GWIBUX*Q@< Z9,#N 0 Z%,#BT8,B4;Z@WX( 'X.BT8, M.T8(?@:+1@B)1OJ+1OJ)1OB#?@8 ?Q/K./].!O]V#HI&"IA0Z&\ @\0$BT8& M.T;Z?^?K'8M&^O].^H7 =!O_=@Z+7@3_1@2*!YA0Z$@ @\0$BUX$@#\ ==N# M?@8 ?2F ?@HP=2/_=@ZX+@!0Z"< @\0$_T8&ZQ'_1@;_=@Z*1@J84.@1 (/$ M!(M&^/?8.48&?.7IZ0( Z?8 QT;X "+7@:+1P2I& !T!KC__^G= (M>!HM' M!*D" '4&N/__Z<P BUX&BT<$J00 =".X 0!0C48$4(M>!O\WZ&D!@\0&B4;Z MBUX&QT<" 0#_1OCK6<<&[E4B*8M>!O]'"(M'"$B+V(I&!(@'BUX&_T<"BT<" M/0 $?#2+7@:+1P2I@ !U*8M>!O]W HM>!O]W!HM>!O\WZ!(!@\0&B4;ZBUX& MBT<&BUX&B4<(_T;X@W[X '0V@W[Z 'X+BUX&BT<".T;Z=!V#?OH ?0J+7@:! M3P00 .L(BUX&@4\$" "X___K$8M>!L=' @ BD8$F"7_ .L Z>\!N 0 Z*\! MZ0'_*\#HIP$K_XO?T>.#O]1' '0.B]_1X_^WU$?HO_2#Q )'@_\4?.'IO0$ MN ( Z'P!B[X$ (NV!@")?OKK 4> /0!U^NL+B]Y&B@>8B]]'B > / !U\,8% M (M&^NF( ;@" .A( 8N^! "+M@8 B7[ZZPN+WD:*!YB+WT>(!X \ '7PQ@4 MBT;ZZ5P!N ( Z!P!BT8$B4;ZZP/_1@2+7@2 /P!U]8O#*T;ZZ3L! "O Z/L M*\!04/]V!E#_=@C_=@2X! !0N $ 4.@& (/$$.D6 2O Z-< BT8(H_15BT8* MH_95BT8,H_A5BT8.H_I5BT80H_Q5BT82H_Y5_W8&_W8$Z%0 @\0$Z=X *\#H MGP#_=@KH?0"#Q *+^(D^]%6+1@BC]E6+1@JC^%6^^E6#_PY^$.L5BUX*B@>8 MB]Y&B ?_1@J+QT^%P'7K_W8&_W8$Z 8 @\0$Z9 N ( Z% BT8&H_)5N/!5 M4/]V!.B. (/$!(E&^H7 =1>#/O)5 'P%H?)5ZPNA\E7WV*,(7KC__^E6 "O MZ!< B[X$ "OVZP%&B]]'@#\ =?>-1 'I.@!;58OL5U8KX#LF DAR O_CQP;R M500 QP;T50( QP;V50\ QP;Z501(N/!54+@! %#H&P"!Q 0 Z?W_C6;\7E]= MPP"Y 0#I# "Y @#I!@"Y P#I !5B^R+A@0 BYX& ,T@7<, 58OL5RO_BU8& MBT8$BUX*BTX(A=)Y"??:]]B#V@#WUX7;>0GWV_?9@]L ]]?H4P"%_W0']]KW MV(/: %]=P@@ %6+[%<K_XM6!HM&!(M>"HM."(72>0GWVO?8@]H ]]>%VWD' M]]OWV8/; .@5 (O3B\&%_W0']]KWV(/: %]=P@@ (7;=1*+V(O"*]+W\9/W M\8O*B],KV\-55U8K_X3_=29'5XK[BMV*Z2K)B^F*Z"K)BL2*XHK6*O924%&+ MS3O3<@VX___K"E=74E"+PBO2]_.+Z/?A7ROX@]( B_*+P_?E \:#T@!>*_"# MT@!8*\)Y"DT#^1/S%0 Z_2+SXO>7X7_= B*S8KKBM^*^(O%*])>7UW# M $ @ ! 0 $ !R,WXS (@SEC, MH#.E,P "L,[XS ,8SV3, X3/R,P #Z,Q0T !TT-30 M /C13- !<-&DT '$T?S0 AS21- "9-*PT +4T MQ30 SC3=- #F-/4T /XT$#4 M !HU+#4 -C5"-0 !,-58U & U;C4 >#6'-0 "1-9XU M *@ULC4 NC7--0 #9->,U .LU_C4 !S81-@ M !HV)S8 ,39)-@ M !4-F V &HV=C8 ?S:0-@ "8-JDV +$VO38 M QS;9-@ #A-O0V /PV"S< M%3<D-P "\W/3< 23=@-P !M-WDW (,WD#< M FS>O-P "[-\DW -,WXC< ZC?S-P #[-P4X M $#@:. B."PX #0X/S@ 1SA3. !;.&4X M &TX?#@ B#B3. ";.*@X *\XOS@ #+.-<X M . XZS@ \S@ .0 *.18Y " Y+CD .SE).0 !3 M.6,Y &PY?3D BCF5.0 ">.:HY +0YQ#D M ,XYWSD ZCG].0 (.ALZ "0Z.CH M 0SI/.@ !9.F4Z &\Z?3H MACJ4.@ ";.JTZ +8ZQ3H SCK@.@ #L.O4Z M .Q [ !@[)CL +CM .P !(.U<[ M 7SMG.P !P.WP[ (4[ECL M *$[KSL MCO,.P #4.^<[ .\[_CL !SP6/ ?/"T\ M #8\1CP 4#Q@/ !H/'@\ ($\D#P "; M/+0\ +T\S3P U3SI/ #S/ 8] ! ](#T M I/3H] $,]5CT 7SUO M/0 M '@]AST CCV9/0 M M M "> ",4!0 &%00 !7EZ'$X#&!H9 G%P M"5U/)5QI %N- (QA 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! M 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! M 0$! 0$! 0$! 0$! 0$! 0$' E8,'@Y4$%,2;Q-N%%47:Q@S'DHE<RU>,%\Q M7S)?,U\T7S5?-E\W7SA?.5\[?#PX/CE;+EP(72U""T,11 Q&"D<I2"])?4P0 M37M.%D]@4!=1,%0.50]64%<F66I^-G\- C4#A 5#!CP+1 PH#3</&Q!:$CT3 M0!4G%CX70A@D&H,A@B1T)7(H9"EE*F<N=C!+,4<R1CA,.4T].EY)0C)%9D9U M23]+-$](4T%4=W\= 0" $XQ, #.,2< +C( ;3X *A4 !O/@ JE0 M '$^ "L5 >3X *Y4 !_/@ L%0 (4^ "R5 C#X +14 "3/@( M "V5)H^ "X5 HCX *A4 "H/@ NE0 M M M __\ ,)4QD2O%,Y$B1+31"X7W$3T%NE$+1( 26YS97)T(%-E;&8 M9E]I;G-S96QF %%U;W1E9"!);G-E<G0 9E]Q=6]T:6YS $-23$8 9E]C<FQF M $9O<G=A<F0@0VAA<F%C=&5R &9?9F-H87( 0F%C:W=A<F0@0VAA<F%C=&5R M &9?8F-H87( 1&5L971E($-H87)A8W1E<@!F7V1C:&%R $)A8VMW87)D($1E M;&5T92!#:&%R86-T97( 9E]B9&-H87( 1&5L971E($AO<FEZ;VYT86P@4W!A M8V4 9E]D96QS<&, 5')A;G-P;W-E($-H87)A8W1E<G, 9E]T8VAA<G, 1F]R M=V%R9"!7;W)D &9?9G=O<F0 0F%C:W=A<F0@5V]R9 !F7V)W;W)D $MI;&P@ M5V]R9 !F7VMW;W)D $)A8VMW87)D($MI;&P@5V]R9 !F7V)K=V]R9 !4<F%N M<W!O<V4@5V]R9', 9E]T=V]R9', 57!P97)C87-E(%=O<F0 9E]U8W=O<F0 M3&]W97)C87-E(%=O<F0 9E]L8W=O<F0 57!P97)C87-E($EN:71I86P 9E]U M8VEW;W)D $)E9VEN;FEN9R!O9B!,:6YE &9?8F5G;&EN90!%;F0@;V8@3&EN M90!F7V5N9&QI;F4 3F5X="!,:6YE &9?;GAT;&EN90!0<F5V:6]U<R!,:6YE M &9?<')V;&EN90!$;W=N(%)E86P@3&EN90!F7V1N<FQI;F4 57 @4F5A;"!, M:6YE &9?=7!R;&EN90!/<&5N($QI;F4 9E]O;&EN90!$96QE=&4@0FQA;FL@ M3&EN97, 9E]D96QB;&EN97, 2VEL;"!,:6YE &9?:VQI;F4 0F%C:W=A<F0@ M2VEL;"!,:6YE &9?8FML:6YE $=O=&\@3&EN90!F7V=O;&EN90!3970O4&]P M($UA<FL 9E]S971M87)K $5X8VAA;F=E(%!O:6YT(&%N9"!-87)K &9?97AC M:&UA<FL 2VEL;"!296=I;VX 9E]K<F5G:6]N $-O<'D@4F5G:6]N &9?8V]P M<F5G %5P<&5R8V%S92!296=I;VX 9E]U8W)E9P!,;W=E<F-A<V4@4F5G:6]N M &9?;&-R96< 1FEL;"!296=I;VX 9E]F:6QL<F5G $9O<G=A<F0@4&%R86=R M87!H &9?9G!A<F$ 0F%C:W=A<F0@4&%R86=R87!H &9?8G!A<F$ 36%R:R!0 M87)A9W)A<&@ 9E]M<FMP87)A $9I;&P@4&%R86=R87!H &9?9FEL;'!A<F$ M4V5L96-T($)U9F9E<@!F7W-E;&)U9F9E<@!396QE8W0@17AI<W1I;F<@0G5F M9F5R &9?<V5L>&)U9F9E<@!+:6QL($)U9F9E<@!F7VMB=69F97( 3&ES="!" M=69F97)S &9?;&ES=&)U9G, 0G5F9F5R($YO="!-;V1I9FEE9 !F7V)U9FYO M=&UO9 !%3TP@0U),1B!-;V1E &9?96]L;6]D90!';W1O($)E9VEN;FEN9P!F M7V=O8F5G $=O=&\@16YD &9?9V]E;F0 5VAA="!086=E &9?=VAA='!A9V4 M1FEN9"!&:6QE &9?9F9I;&4 4F5A9"!&:6QE &9?<F9I;&4 5FES:70@1FEL M90!F7W9F:6QE $EN<V5R="!&:6QE &9?:69I;&4 4V%V92!&:6QE &9?<V9I M;&4 4V%V92!!;&P@1FEL97, 9E]S879E9FEL97, 5W)I=&4@1FEL90!F7W=F M:6QE %=R:71E(%)E9VEO;@!F7W=R96< 5W)I=&4@3&%S="!+:6QL &9?=VQA M<W1K:6QL %1W;R!7:6YD;W=S &9?,G=I;F1S $]N92!7:6YD;W< 9E\Q=VEN M9 !/=&AE<B!7:6YD;W< 9E]O=&AW:6YD $=R;W<@5VEN9&]W &9?9W)O=VEN M9 !3:')I;FL@5VEN9&]W &9?<VAR:6YK=VEN9 !$96QE=&4@5VEN9&]W &9? M9&5L=VEN9 !3=&%N9&]U="!7:6YD;W< 9E]S;W=I;F0 5'=O($UO9&4@5VEN M9&]W<P!F7S)M;V1E=VEN9', 3F5W(%=I;F1O=P!F7VYE=W=I;@!.97AT(%-C M<F5E;@!F7VYS8W)E96X 4')E=FEO=7,@4V-R965N &9?<'-C<F5E;@!38W)O M;&P@5VEN9&]W(%5P &9?<V-U<'=I;F0 4V-R;VQL(%=I;F1O=R!$;W=N &9? M<V-D;G=I;F0 36]V92!T;R!7:6YD;W<@5&]P &9?;79W=&]P $UO=F4@=&\@ M5VEN9&]W($)O='1O;0!F7VUV=V)O= !3970@4')O9FEL90!F7W-E='!R;V8 M4')E9FEX($UE=&$ 9E]P9GAM971A %!R969I>"!%>'1E;F0 9E]P9GAE>'0 M56YI=F5R<V%L($%R9P!F7W5A<F< 3F5G871I=F4@07)G=6UE;G0 9E]N96=A M<F< 07)G=6UE;G0@1&EG:70 9E]A<F=D:6< 5E0Q,# @0G5T=&]N($AA8VL M9E]V=&)U='1O;G, 1&5S8W)I8F4 9E]D97-C<FEB90!3=&%R="!+8F0@36%C M<F\ 9E]S:VUA8P!%;F0@2V)D($UA8W)O &9?96MM86, 17AE8W5T92!+8F0@ M36%C<F\ 9E]X:VUA8P!6:65W($MB9"!-86-R;P!F7W9K;6%C %5N+6MI;&P M9E]U;FMI;&P 56XM:VEL;"!0;W 9E]U;FMP;W 07!P96YD($YE>'0@2VEL M; !F7V%P<&YK:6QL %-T<FEN9R!396%R8V@ 9E]S<F-H %)E=F5R<V4@4W1R M:6YG(%-E87)C: !F7W)S<F-H $EN8W)E;65N=&%L(%-E87)C: !F7VES<F-H M %)E=F5R<V4@4V5A<F-H &9?<FES<F-H %)E<&QA8V4@4W1R:6YG &9?<F5P M<W1R %%U97)Y(%)E<&QA8V4 9E]Q=65R97 4F5P;&%C92!I;B!,:6YE &9? M<F5P;&EN90!3970@1FEL;"!#;VQU;6X 9E]S9F-O; !3970@1FEL;"!0<F5F M:7@ 9E]S9G!R968 075T;R!&:6QL($UO9&4 9E]F:6QL;6]D90!);F1E;G0@ M06-C;W)D:6YG('1O($UO9&4 9E]I;F1A=&T 26YD96YT($YE=R!,:6YE &9? M:6YD;FP 0F%C:R!T;R!);F1E;G1A=&EO;@!F7V)A8VMI;F0 26YD96YT(&9O M<B!#;VUM96YT &9?:6YD8V]M;0!);F1E;G0@4F5L871I=F4 9E]I;F1R96P M4'5S:"!T;R!);F9E<FEO<@!F7W!S:&EN9@!2971U<FX@=&\@4W5P97)I;W( M9E]R971S=7 5W)I=&4@1FEL92!%>&ET &9?=V9E>&ET $AI="!"<F5A:W!O M:6YT &9?8FMP= !$96)U9R!-;V1E &9?9&5B=6< 8V%N;F]T(&EN:70L(&YO M(&UE;6]R>0!R &-A;FYO="!O<&5N(&EN<'5T(&9I;&4@(B5S(@!W &-A;FYO M="!O<&5N(&]U='!U="!F:6QE("(E<R( 8F%D('5S86=E+"!S964@9&]C $A/ M344 +P N96QL97!R;RYE '( 8V%N;F]T(&]P96X@<')O9FEL92 B)7,B $A/ M344 +P N96QL97!R;RYB,0!W8@!W &-A;FYO="!O<&5N(&]U='!U="!P<F]F M:6QE("(E<R( 4 !% %!R;V9I;&4 4&-O;F8 1F-O;F8 1EAC;VYF $--8V]N M9@!#4V-O;F8 06QL8V]N9@!09'5M< !&9'5M< !E;&QE8SH@86UB:6=U;W5S M('-W:71C:#H@+25S(#T@)7,@;W(@)7,* &5L;&5C.B!B860@<W=I=&-H('1Y M<&4Z("5S"@!E;&QE8SH@8F%D('-W:71C:#H@)7,* "\J(%1H:7,@9FEL92!D M969I;F5S('1H92!I;FET:6%L(&1A=&$@9F]R($5,3$4G<R!D969A=6QT('5S M97(@<')O9FEL92X**BH@270@:7,@875T;VUA=&EC86QL>2!G96YE<F%T960@ M8GD@14Q,14,L(&%N9"!S:&]U;&0@;F]T(&)E(&5D:71E9"X**B\*8VAA<B!C M:&%R;6%P6UT@/2!["@ ))3)D+ )+RH@*"4S;RD@)3-S " @)7, ("HO"@!] M.PH@8VAA<B!M971A;6%P6UT@/2!["@ ),"4M,V\L)3-D+ )+RH@)31S " @ M)7, ("HO"@!].PH@8VAA<B!E>'1M87!;72 ]('L* DP)2TS;RPE,V0L DO M*B E-', (" E<P @*B\* 'T["@!S=')U8W0@<')O9FEL92!D969?<')O9B ] M('L* " @)60L("\J(%9E<B J+PH ("!S:7IE;V8H8VAA<FUA<"DL(" @8VAA M<FUA<"P* " @<VEZ96]F*&UE=&%M87 I+S(L(&UE=&%M87 L"@ @('-I>F5O M9BAE>'1M87 I+S(L("!E>'1M87 L( H (" P+" P"@!].PH .R!%3$Q%(&1E M9F%U;'0@05-#24D@<')O9FEL90H* "AK97EA;&QU;F)I;F0I(" [(%1O(&9L M=7-H(&%L;"!E>&ES=&EN9R!B:6YD:6YG<PH* H[($UE=&$@8VAA<G,*"@ * M(#L@17AT96YD960@8V]M;6%N9',*"@ * "5D(&5R<F]R<R!E;F-O=6YT97)E M9"P@8VAE8VL@;W5T<'5T(&9I;&4N #M)3E1%4DY!3"!%4E)/4CH@0F%D(&9U M;F-T:6]N(&EN9&5X("5D(&9O<B!K97D@)7,* #M)3E1%4DY!3"!%4E)/4CH@ M3F\@;F%M92!F;W(@9G5N8W1I;VX@)60@=VAI;&4@;6%P<&EN9R!K97D@)7,* M "AK97EB:6YD("5S("(E<R(I"@!U;FMN;W=N+6UO9'5L90 C($9U;F-T:6]N M(&UO9'5L92!D969I;FET:6]N(&9I;&4L(&=E;F5R871E9"!B>2!%3$Q%0PH M1E5.7T]&24Q%4R ]( !I;G1E<FYA;"!E<G)O<B M(&YO(&YA;64@9F]R(&9U M;F-T:6]N("5D "5S("5S"@!<"@DE<RYO H +RH@+D@@1G5N8W1I;VX@1&5F M:6YI=&EO;B!F:6QE+"!G96YE<F%T960@8GD@14Q,14,@*B\* "\J(" @," J M+R!%1E5.2$],12 O*B!!;'=A>7,@=6YD969I;F5D("HO"@ O*B E,V0@*B\@ M $5&54Y(3TQ%"@ B)7,B $5&54XH("4M,3)S+" E+3$T<RP@(B5S(BD* #L@ M36%S=&5R($9U;F-T:6]N($1E9FEN:71I;VX@9FEL90H :6YT97)N86P@97)R M;W(@+2!N;R!N86UE(&9O<B!F=6YC=&EO;B E9 !U;FMN;W=N+6%D9'( =6YK M;F]W;BUM;V1U;&4 *&5F=6X@)60@(B5S(B E<R E<RD* "\J("Y(($9U;F-T M:6]N($EN9&5X($1E9FEN:71I;VX@9FEL92P@9V5N97)A=&5D(&)Y($5,3$5# M("HO"@ O*B!&3E\@9&5F:6YE<R!&=6YC=&EO;B!.=6UB97)S("AI;F1I8V5S M*2!F;W(@86QL(&MN;W=N(&9U;F-T:6]N<R J+PH +RH@1EA?(&1E9FEN97,@ M1G5N8W1I;VX@95AI<W1E;F-E(&EN('1H:7,@14Q,12!C;VYF:6=U<F%T:6]N M("HO"@!I;G1E<FYA;"!E<G)O<B M(&YO(&%D9'(O;F%M92!F;W(@9G5N8W1I M;VX@)60 (V1E9FEN92!&3E\E+3$T<R E,V0@+RH@)7,@*B\* "-D969I;F4@ M1EA?)2TQ-',@)3-D"@!K97EB:6YD &5F=6X ;65N=6ET96T :V5Y86QL=6YB M:6YD '5N9&5F86QL '5N:VYO=VX@;W Z("@E<RD 969U;B M(&YO="!E;F]U M9V@@87)G<P!E9G5N("T@;F]N+79A;'5E(&9U;F-T:6]N(&EN9&5X &5F=6X@ M+2!N;VXM<W1R:6YG(&9U;F-T:6]N(&YA;64 969U;B M(&YO;BUS=')I;F<@ M9G5N8W1I;VX@861D<@!E9G5N("T@;F]N+7-T<FEN9R!F=6YC=&EO;B!M;V1U M;&4 969U;B M(&)A9"!F=6YC=&EO;B!I;F1E>" E9 !E9G5N("T@<F5D969I M;FEN9R!F=6YC=&EO;B H)60@(B5S(B E<R E<RD =6YK;F]W;BUM;V1U;&4 M969U;B M(&YA;64@;W(@861D<F5S<R!D=7 A(" B)7,B "AK97EB:6YD*2!N M;VXM<W1R:6YG(&9U;F-T:6]N(&YA;64 *&ME>6)I;F0I(&YO('-U8V@@9G5N M8W1I;VX@+2 B)7,B "AK97EB:6YD*2!R961E9FEN:6YG(%@M)7,@87,@)60] M(B5S(@ H:V5Y8FEN9"D@=&]O(&UA;GD@6"T@8V]M;6%N9', *&ME>6)I;F0I M(')E9&5F:6YI;F<@32TE<R!A<R E9#TB)7,B "AK97EB:6YD*2!T;V\@;6%N M>2!-+2!C;VUM86YD<P H:V5Y8FEN9"D@<F5D969I;FEN9R E<R!A<R E9#TB M)7,B '5N:VYO=VX@9G5N8W1I;VX 96QL96,Z( * " @("!,:6YE("5D.B E M<PH @(" @(" @(" (" @("" @(" @(" @(" @(" @(" @( @0$! 0$! 0 M$! 0$! 0$! $! 0$! 0$! 0$$! 0$! 0$$%!04%!00$! 0$! 0$! 0$! 0$! M 0$! 0$!$! 0$! 00D)"0D)" @(" @(" @(" @(" @(" @(" @(0$! 0( M ! A6"%8! 0@ (6@A: @ 8 +9'P$?*1P M "EX %-T86-K(&]V97)F %;&]W"@ end
Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 04:10 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 0197 for MINIX@UWALOCKE; Sun, 20 Dec 87 04:09 PST Received: by NDSUVM1 (Mailer X1.24) id 0164; Sun, 20 Dec 87 05:09:27 CST Date: 19 Dec 87 21:43:13 GMT From: Andy Tanenbaum <ast@cs.vu.nl> Subject: elle.uuencoded part 1 of 2 Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU begin 755 elle M 0-P!# !P\@ PB0 H* ! M B]R+#X/# HO!0-'@ \.C !04U'HFV:#Q 90Z$S@ZQRX @!0BT8$!0\ MF;D0 /?Y4.B_H(/$!.L Z<KPN Z(KPZ]SK+HN^! "+M@8 B\8E#P"Z 0"+ MR-/BB\:Y! #3^(O T> #QXO8BP<CT(O"ZP#IDO"X #H4O#KRNLHB[X$ (NV M!@"+QB4/ +H! (O(T^*+QKD$ -/XB\#1X /'B]@)%^E@\+@ .@@\.O0ZRJ+ MO@0 B[8& (O&)0\ N@$ B\C3XO?2B\:Y! #3^(O T> #QXO8(1?I+/"X #H M[._KSNMDBS;")#LVQ"1U&5;HZ :#Q *+\(7 =0S_-L0DZ!D'@\0"B_#_=!2X M!@!0Z#-N@\0$B_B%_W4"ZRF /0!T%E?HQP6#Q *+\(7V=0E7Z% %@\0"B_!6 MZ-\%@\0"5^@':X/$ NF^[[@ .A^[^N4ZW&+-L(D_W04N!L 4.CD;8/$!(OX MA?]U NM5@#T ="N+-L8DA?9T%?]T%%?H3 "#Q 2%P'0"ZP6+=!+KYX7V=0JX M.0!0Z,]P@\0"5^BJ:H/$ H7V=!JX9 !0Z(9P@\0"_W04Z)=P@\0"5NA=!8/$ M NE#[[@ .@#[^N'ZTN+O@0 B[8& ( \ '0VB7[ZB7;XBU[Z@#\ =""+7OK_ M1OJ*!YB+7OC_1OB*%[D( -/BT_H[PG0"ZP?KV+@! .L(1NO%N ZP#I[NZX M! #HKN[KK>DC ;AI %#H&FV#Q *)1OJ%P'4#Z0P!BU[Z@#\ =0:+/L0DZQB+ M7OJ /R!U!;\ .L+_W;ZZ)0$@\0"B_C_=OKHYFF#Q *%_W4-N'< 4.CV;X/$ M NG, #L^Q"1T%H,^R"0 =0/IJ0"+'L@D.7\(= /IG0"+-L(D._YU%E?H.P6# MQ *+\(7 =0E7Z&\%@\0"B_#_=!2XA@!0Z(EL@\0$B4;Z@W[Z '4"ZWJ+7OJ M/P!T&(M>^H _('4%O@ ZPO_=OKH" 2#Q *+\/]V^NA::8/$ H7V=0RXO@!0 MZ&IO@\0"ZT$[_G21@S[() !T%HL>R"0Y?PAU#>@!"%;H(@2#Q +H]P<Y/L0D M=0=6Z!($@\0"5^@;!8/$ CD^PB1U!J'$)*/").G [;@" .B [>G4_NGT *'$ M)(E&]KC- %#H(P.#Q *)1OA0Z-8#@\0"N-< 4.B_-H/$ HL^QB2%_W4#Z:< MBW44@#P@=0/IE@#W11P! '0%N.\ ZP.X\@!0Z),V@\0"5NB,-H/$ E?H036# MQ )24(U&XE#H C>#Q :-1N)0Z.OJ@\0"B4;@5NCAZH/$ KH4 "O0*U;@B5;Z MA=)^#?]V^K@@ %#H)S:#Q 2X]0!0Z#\V@\0"C4;B4.@U-H/$ KCX %#H*S:# MQ *+=1:%]G0'5N@=-H/$ K@* %#H'RZ#Q *+?1+I4O__=OCH^PJ#Q +_=O;H M" .#Q +_=OCH#P2#Q +IP.RX' #H@.SI __K$HL>Q"2!9QS^_X$.RB0$ .FC M[+@ .AC[.OFZRV+'L0D@7<<@ "+'L0DBT<<J8 = 6X^P#K [@, 5#H<6V# MQ *!#LHD 'I;.RX #H+.SKR^L)Z*\NZ#E0Z5GLN Z!GLZ^_K">BY+N@F M4.E&[+@ .@&[.OOZ6<!N!L!4.A';8/$ O\VSB3_-LPDC4;H4.C7-8/$!HU& MZ%#H7VV#Q +H8B['1O0! ,=&]@$ O@$ BQ;.)*',)(E&^(E6^H-N^ OH M@W[Z 'P=Z-TLB_@]"@!U!?]&]NL,@_\,=0=&BT;VB4;TZ]6X( %0Z/-L@\0" MB\:94E"-1NA0Z&PU@\0&C4;H4.C:;(/$ K@H 5#HT&R#Q *+1O9 *T;TB\"9 M4E"-1NA0Z$(U@\0&C4;H4.BP;(/$ K@P 5#HIFR#Q +_-LXD_S;,).@02H/$ M!(O F5)0C4;H4.@1-8/$!HU&Z%#H?VR#Q *X-P%0Z'5L@\0"BT;VF5)0C4;H M4.CM-(/$!HU&Z%#H6VR#Q *X0 %0Z&ML@\0"Z%$MZ$@NA<!T!?]&]NOTZ+(K MB_B+1O:94E"-1NA0Z+4T@\0&C4;H4.@C;(/$ H/_"G0*N$4!4.@4;(/$ KA7 M 5#H)&R#Q +H"BWIU.JX% #HE.KID/[K/<<&QB0 +A9 5#H. "#Q *CQ"2C MT"2ATB0M @!0N"T 4.BO,X/$!+AD 5#H%P"#Q *CQ"2CPB3HV@;IC.JX #H M3.KKN^M@BW8$5NAA (/$ HOXA?]T!(O'ZTFX( !0Z'AE@\0"B_BAQB2)11*) M/L8D5N@[98/$ HE%%,=%& QT4: "X !05^A(G(/$!,=%%@ QT4< "A MU"2)11Z+Q^L Z2+JN Z.+IZYCK)(L^QB2%_W05_W8$_W44Z$?G@\0$A<!T M!8M]$NOGB\?K .GTZ;@ .BTZ>O4ZQN+1@0[!L0D= :AQ"2CPB3_=@3H#@"# MQ +IS^FX #HC^GKW>MGBW8$BS[$)#OW=0+K5XL6SB2AS"2)11B)51J)-L0D MBT0>H]0D_W0:_W08Z*<K@\0$BQ[6)(EW"(L>UB2+%LXDH<PDB4<2B5<4BQ[6 M),='# !5^@: (/$ L<&V"0 ($.RB0$ >E>Z;@ .@>Z>N1ZR"+?@2+-MHD MA?9T"SM\"'4"ZPN+-.OQ5^C\I(/$ NDTZ;@ .CTZ.O8ZS>+O@0 5^@W (/$ M HE&^HOP._=U NL9]T0< 0!T!(O&ZQ-6Z!H @\0"B_ [1OIUX;@ .L Z?/H MN ( Z+/HZ\'K*HN^! "+]X7V= >+=!*%]G4$BS;&)(M<%( _('0"ZP0[]W7C MB\;K .F_Z+@ .A_Z.O.Z88 BWX$O@ H<8DB4;Z@W[Z '03.7[Z= Z+=OJ+ M7OJ+1Q*)1OKKYX-^^@!U#^CY8+AI 5#H>&N#Q +K287V=0B+11*CQB3K!HM% M$HE$$E?HX)J#Q )0Z(FA@\0"N/__4.@2G(/$ H-]%@!T"?]U%NB'8X/$ O]U M%.A^8X/$ E?H=V.#Q +I+NBX @#H[N?I<?_K,(L>Q"2+1QRI 0!T$_\VQ"3H M)0"#Q *%P'\%N ZP[H14S'!M@D "X 0#K .GSY[@ .BSY^O(ZT2+?@3_ M=12X> %0Z!IF@\0$B_"%]G4%N ZR:*!)A0Z.A/@\0"/5D =06X 0#K [C_ M_XE&^E;H\V*#Q *+1OKK .FEY[@" .AEY^NTZ1D!@S[() !T#;BC 5#H[6B# MQ +I @&AUB2)1OKH6DF+7OJ+1P:9N0( ]_F+^(M>^HM'! /'B_#_-M DN $ M4%;H>02#Q :CW"3_-L0DBU[ZBT<&C54!*\)0C40!4.A<!(/$!J/()(L>UB2+ M1P(E 0"+'L@D"4<"BQ[>)(M' B4! (L>W"0)1P+HX@*+7OJ)?P:-1 &+V-'C MBY_@)(M7 HL'B4;VB5;XBQ[()(M6^(M&]HE'#HE7$#D6SB1_*GP&.0;,)',B MBQ[()(M7$(M'#HE&]HE6^(L>R"2+5OB+1O:)1Q*)5Q3K*(L>R"2+%LXDH<PD MB4<2B5<4C43_B]C1XXN?X"2+5P*+!Z/,)(D6SB3HG@"!#LHD @#I@>:X!@#H M0>;IWO[I@ "#/L@D '4,N+4!4.C(9X/$ NMJBS[6)(-]! !T+.@R2/]U$/]U M#NC>*(/$!(M%!/?84.AT1H/$ NB9*8E%#HE5$.AD*,=%! BQ[()(M'!D ! M10;_-L@DZ+4#@\0"_S;<).BK X/$ L<&W"0 ,<&R"0 .C/ 8$.RB0&!.GU MY;@ .BUY>EW_^LR@S[() !U#+C# 5#H/6>#Q +K'/\VR"3HGP*#Q *A<"6C MR"2AUB2C<"6!#LHD! #IN.6X #H>.7KQNMYBS;()(7V=0RXT0%0Z !G@\0" MZV*A<B6)1OJ+/M8D@WT$ '0.B_Z+-M8DBT;Z]]B)1OJ+108#1OH] 0!\"XM$ M!@-&^CT! 'T,N-\!4.C 9H/$ NLBBT;Z 44&BT;Z 40$BT;Z*40&BQ[<)(M& M^@%'!($.RB0" .DUY;@" .CUY.E^_^L5@S[() !U NL)Z#+_Z&O_Z"S_Z17E MN Z-7DZ^/K$H,^R"0 =0+K!N@3_^B$_NGYY+@ .BYY.OFZU6A<B7K/O\V MUB3H40"#Q +K/O\VWB3H10"#Q +_-MPDZ#L @\0"ZRB+/MHDA?]T$O=% @$ M= =7Z", @\0"BSWKZNL,/0 =-\]! !TQ.NVZ&X Z9KDN Z%KDZZ/K*XN^ M! "%_W4"ZQ[W10(! '0'@64"_O_K!8%- @$ @4T, &!#LHD "#I9>2X #H M)>3KS>LD@SYT)0!T!:%R)>L/@SX:$ !T!;@ .L#N ( HQH0Z L Z3?DN MZ/?CZ]3K<(L^W"2%_W4(QP8" ZUV#/AH0 74,BQ[>)(M' B4! .L#H1H0 MHP( @SX" !T(8,^! =0VXZ %0Z&OY@\0"HP0 H00 B44(@4T" @#K$:'0 M)(E%"(%E OW_@0[*) @@4T, &!#LHD! #IO>.X #H?>/KB.MYQP;:) MQP;() _S;$)*%V)2T" %"X !0Z+4 @\0&HW EN/4!4.@$^8/$ E"X 0!0 MH78E+0( 4.B6 (/$!J/>)+C_ 5#HY?B#Q )0N $ 4*%V)4A0Z'D @\0&HW@E M@SX8$ !T"8L>WB2!3P(! *%P):/6).DZX[@ .CZXNE^_^M'B[X$ (L>UB2+ M%LXDH<PDB4<2B5<4H<HD)?C?BQ[6) E'#(D^UB2+10BCQ"3_=13_=1+H"26# MQ 2!)LHD!R"!#LHD! 'IZ.*X #HJ.+KL>MQBW8(N"( 4.CE78/$ HOXQT4" M "+1@2)102+1@:)10:)=0B+5!J+1!B)11*)513'10X ,=%$ QT4*R #' M118 ,=%& QT4: #'11P ,=%'@ QT4@ #'10P :':)(D%B3[:)(O' MZP#I;>*X #H+>+KA^M]BT8$B4;ZO@ BS[:)(7_= L[?OIT!HOWBSWK\87_ M=0_HLUJX" )0Z#)E@\0"ZTN%]G4'BP6CVB3K!(L%B02+1OH[!M8D=0F+%LXD MH<PDZPF+7OJ+5Q2+1Q*)1O:)5OB+7OJ+7PB+5OB+1O:)1QB)5QK_=OKH+UV# MQ +IYN&X!@#HIN'I>O_IX "AUB2)1O;_=@2A=B4M! !0N 4.CC_H/$!HOX M4.B)_H/$ NB10XMU!H/N 7P;B][1XXN?X"2+5P*+!SM5('4%.T4>= +K NO@ M@\8!?P+K=SMU!GP%N $ ZP.X ")1OJ%P'4#B74&5^CD$H/$ HE&^(-^^ !U M&/]U!H-^^@!T!;@7 NL#N%0"4.B[8X/$!.@Q>.@S XOP@_X@=2>#?OH =!__ M=0:XGP)0Z)MC@\0$N $ 4.@U/H/$ H%-# !Z6+_ZP2)-GHE_W;VZ-S]@\0" M5^BA_H/$ H$.RB0" .GZX+@& .BZX.D7_^F$ 8N^! "AQ"2)1O:AUB2)1OB+ M=0BAW"2)1OJ%P'03BU[ZBT<"J0( = B#?00 =0+K!J'>)(E&^O]V^NB!_8/$ M NC\(N@I(?\V!!#HSBF#Q *XH )0Z,0I@\0"BQ[4)/\WZ+@I@\0"@SYB(0!T M"KBC E#HIRF#Q *#/GPE '0*N*D"4.B6*8/$ KBS E#HC"F#Q +_=!3H@RF# MQ *XM@)0Z'DI@\0"@WP6 '0)_W06Z&HI@\0"]T0< 0!T#+BY E#H62F#Q +K M"KB\ E#H32F#Q *!?0K( 'UCN+\"4.@\*8/$ HM%"NL^N,,"4.@M*8/$ NL^ MN,<"4.@A*8/$ NLRBT4*F5)0C4;B4.B8*8/$!HU&XE#H!2F#Q *X)0!0Z <A M@\0"ZPP]__]TO3V6 '3$Z\ZXRP)0Z.,H@\0"BU[ZBT<"J0$ =!_HLB.)1MZ) M5N"A?B69*T;>&U;@4E"X( !0Z)<H@\0&@0[*) !_W;XZ$W\@\0"_W;VZ*[U M@\0"BT;ZZP#I:M^X'@#H*M_I<_[K&8L^Q"3W11P! '4+@4T< 0"!#LHD! #I M1M^X #H!M_KW^L9BU8&BT8$*P;,)!L6SB124.@. (/$!.DCW[@ .CCWNO? MZ= BS[6)(L6SB2AS"2)1OB)5OJ+5OJ+1O@#1@035@:)1O2)5O:+5OJ+1O@[ M5O9\*W\%.T;T=B2+5OJ+1OB)1O")5O*+5O:+1O2)1OB)5OJ+5O*+1O")1O2) M5O;HR"(K1O0;5O:)1O2)5O:#?1@ ?1J+5OJ+1OB)11:)51B+5O:+1O2)11J) M51SK/(M6^HM&^#M5&'\3? 4[119S#(M6^HM&^(E%%HE5&(M6]HM&]#M5''\3 M? 4[11IS#(M6]HM&](E%&HE5'.CP_H$.RB0 ".E(WK@, .@(WNDG_P#K(H,^ M>B4 ?0[H5U.%P'4'Z)%UA<!T!;@! .L#N ZP#I&MZX #HVMWKUNL(Z']2 MZP#I"-ZX #HR-WK\.L/Z.1TZ'U3Z./_HWHEZ>_=N Z*_=Z^GK(XMV!%;H M1 &#Q *+^(7 = V+QB5_ %#_UX/$ NL#Z#A6Z<+=N Z(+=Z]7K$NBC_PV M %#HQ_^#Q +K .FFW;@ .AFW>OFZQ+HA_\- %0Z*O_@\0"ZP#IBMVX #H M2MWKYNF% (-^! !]!;@! .L#N 0 HW0EQT;Z #H5/^+\(O&)7\ B_B#_RUU M%(-^^@!U#L<&="7__\<&<B4! .LQ@_\P?"J#_SE_)8M&^KH* /?J \<M, ") M1OJ#/G0E 'P&QP9T)0$ BT;ZHW(EZP+K NNHH7(E]RYT):-R)8DV>B7'!H E M @#I^MRX @#HNMSI<O_K%;C__U#H9O^#Q *A<B7WV*-R)>G:W+@ .B:W.OC MZQ.+1@2C>B6X__]0Z$'_@\0"Z;W<N Z'W<Z^7K$;A;%5"X3 50Z,9&@\0$ MZ:+<N Z&+<Z^?K%O]V!.@8 (/$ HO8T>.+A\X"ZP#I@MRX #H0MSKXNMY MB[X$ /?' %T#(LV1@6A1 6)1OKK$/?'@ !T,XLV0@6A0 6)1OI7Z&]$@\0" MB_B+WD:*!Y@[QW0#1NL+B@28)?\ B4;ZZP:#;OH!=>+K%(O')7\ P8^!8O8 MB@>8)?\ B4;ZBT;Z.P8*!'P%N ZP6+1OKK .G_V[@" .B_V^E^_^M!Z-_] MZQ[H;3'K-.A1,>LOZ*<NZRKHS2[K)>C],^L@Z$94ZQL]00!TW3U" '3=/4, M=-T]1 !TW3U1 '3=Z^#IL]NX #H<]OKM^GD (-^! !T$/]V!(V&-/]0Z!/9 M@\0$ZR7_-B 0N%H%4/\V@B6-AC3_4.CZV(/$!%#H@]B#Q 10Z'S8@\0$N M4(V&-/]0Z //@\0$B_B%P'T2@WX$ '0*N%P%4.BL7(/$ NM_5^@FCH/$ HOP M/1( <P+K7E;H0U:#Q *)AFK^5O^V:OY7Z$[0@\0&.\9T NLWBYYJ_H,_ 70" MZRRX$@!0N#H%4/^V:O[HBW*#Q :+AFK^ 08^!8N&:OX!!D(%BX9J_@$&1@7K M%/^V:O[H'E:#Q *X;050Z#)<@\0"5^B\RH/$ NG$VKB2 >B$VND3_P#K*,<& MA"4 .@57H,^AB4 =0;'!H8E#0#HXV+H>0#H$0"!#LHD!0#ID-JX #H4-KK MT.L6@SZ$)0!T NL*_P:$)>@77NA?9.EPVK@ .@PVNOBZSN+/H0EA?]^+,<& MA"4 +@ %"A=B5(4.A-98/$!.B<9.@L<>C\7;B$!5"X 0!0Z/Q5@\0$B\?K M .DKVK@ .CKV>N]Z;P H=(D2*-^):'2) 4+ /<N=B6)1OJ#/G8E2'\(@3[2 M)(0 ?A_HDO__-M(D_S9V);B&!5#HV<:#Q :X 0!0Z$7)@\0"N $ 4*%V);D$ M -/@BU;ZT>(#PE#HM(F#Q 2+\(7 =1?H4_^XH@50Z*+&@\0"N $ 4.@.R8/$ M J%V);D$ -/@ \:)1OB_X"2A=B71X 7@)#OX<R2+1OB)1 :+1O@#1OJ)1 R+ MWX/' HDW@\80H=(D!0L 4;XZ]#I9-FX! #H)-GI.__I6@&+/M8DH<HD)?C? M"44,@2;*) <@]P;*) $ =$'HYF.+-G8E@^X!? ^+WM'CBY_@),='" Z^P[ M/G@E=!3_-G@EZ.3U@\0"Z(\95^C:]8/$ H$.RB0" ($FRB3^__<&RB0" '0= M@0[*) @BS[:)(7_= F!30P 8L]Z_.!)LHD_?_W!LHD "!T)XL^VB2%_W0? M]T4" @!U%(-]# !T#E?H*PJ#Q *%P'0#Z:L BSWKW8L^>"6#?0P = Y7Z \* M@\0"A<!T ^F/ (L^UB2#?0P = U7Z/<)@\0"A<!T NMX]P;*) 0 =$O_-G E MZ'GW@\0"B_A0Z&P @\0"@S[<) !T,8L>W"2+1P*I @!T)8L>W"2#?PP =0J+ M'MXD@W\, '01_S;().@_]X/$ E#H- "#Q +_-LXD_S;,).A. (/$!(7 =0JX MNP50Z 9;@\0"QP;*) Z.INZ?[7N Z+[7Z9W^ZQZ+O@0 @4T, %7Z$P# M@\0"A<!T!U?H4 F#Q +IU=>X #HE=?KVNG) /]V!O]V!.C) (/$!(OPA<!] M!K@ .FN (O>T>.+O^ DBQ[6)#MW!'X;C43_B]C1XXN?X"2*1PN8B4;ZA<!^ M _].^NL%QT;Z #HW1J)1O:)5OC_=0+_->@"&H/$!/]V^HM6!HM&!"L%&U4" M4.A< 8/$!(E&^H7 ?3**10N8B4;ZA<!^ _].^HL>UB2+1P2+'M8D T<&1COP M?!'_=OC_=O;HN1F#Q 2X #K&_]V^/]V]NBH&8/$!/]V^E;H@Q:#Q 2X 0#K M .D!U[@& .C!UNDN_^GM (LVUB2+1 2)1OJ+1OH#1 :)1O2+1OH[1O1](8M> M^M'CB[_@)(M6!HM&!#M5 G\(? 0[!7<"ZU'_1OKKUXM%!)F)1O")5O*+50*+ M!0-&\!-6\HE&]HE6^(M6!HM&!#M6^'P,?P4[1O9V!;C__^M\_T[ZBU;XBT;V M.U8&=04[1@1T!8M&^NMDZSZ+50*+!3M6!G4%.T8$=!:+1OH[1 1_!;C__^M& M@V[Z 8M&^NL]BT;Z.T0$?P6+1OKK,/].^HM>^M'CB[_@)(I%"IBI @!U!H!] M"P%^$/]&^HM&^CM&]'P%N/__ZP6+1OKK .D(UK@, .C(U>D*_^GF (M^!J'$ M)(E&^HMV!(7V?P/IP0"+7OJ#;P(!?!*+7OK_!XL'2(O8B@>8)?\ ZPG_=OKH ML(J#Q *)1O@]__]U ^F2 (-^^ UU7HM>^HM''*F '11BU[Z@V\" 7P2BU[Z M_P>+!TB+V(H'F"7_ .L)_W;ZZ'"*@\0"B4;X/0H =0^#_@%U!;@ .L#N/__ MZU6#?OC_= N+7OK_1P*+7OK_#\=&^ T ZQ:#?O@*=1"+7OJ+1QRI@ !U!;C_ M_^LG5XU&XE#_=OCH#!*#Q 8#^(/N 70#Z3__.SY^)7X%N/__ZP2+Q^L Z1;5 MN!H Z-;4Z1'_ZSVX !0_W8&Z )@@\0$Z X5BUX&T>.+G^ DQT<( "#?@0 M= J+7@2!3PP >L&@0[*) ( @0[*) @ Z<[4N Z([4Z[OK(HN^! "+=02+ MQ@-%!HE&^CMV^GT+5E?HGO^#Q 1&Z_#IHM2X @#H8M3KUNEC!8M^!(7_=0:X M #I4P7W10P(#74&N Z48%.S[6)'4)BQ;.)*',).L&BU44BT42B4;VB5;X MBT4$ T4&B4;>H<0DB4;@BT4(H\0DZ*D7B4;BB5;DQT;< "+51"+10X[5OA] M ^FA 7\(.T;V=P/IEP&A%A#W;0:9N60 ]_F+\.L2N&0 *P86$/=M!IFY9 #W M^8OPA?9_!;X! .L+.W4&? :+109(B_#_=OC_=O;H>A:#Q 2%]G0$B\;K [@! M %#H_C6#Q +H+Q>)10Z)51#'1M0 .C.%XE&YHE6Z(M6Z(M&YCM6^'\O? 4[ M1O9S*(M6Z(M&YHE&]HE6^(E%$HE5%#L^UB1U#8M6Z(M&YJ/,)(D6SB3I:_^+ M=03'1M@ ,=&^@ .W;>?3G_1MS_=OJ+WM'C_[?@).CT#8/$!(O>T>.+A^ D MB4;Z]T4" 0!T"8M>^H!/"@CK!XM>^H!G"O=&Z\+_=OC_=O97Z ($@\0&A<!T M ^D. X-^U !T$:$4$/=M!IFY9 #W^8OPZ0?_BU;XBT;V.U40?Q1\!3M%#G,- MN- %4.CL58/$ NG6_H-]!@%^&8M%!$"+V-'CBY_@)(M7 HL'B44.B540ZR^+ M7031XXN'X"2)1OJ+7OJ+1P2+P)F)1LZ)5M"+7OJ+5P*+!P-&SA-6T(E%#HE5 M$/]U$/]U#N@H%8/$!.D.__=%# %=!3_=1#_=0[H$A6#Q 3'1M0! .FP_O=% M# (=2/_=OC_=O97Z#D#@\0&A<!U ^E#_HM5((M%'HE&YHE6Z.G7 NA4%HE& MYHE6Z(/Z '4(/0 =0/I'OZ+5NB+1N8K11X;52")1O*)5O2+5NB+1N:)1NZ) M5O [51Q\&7\%.T4:=A*+5O"+1NXK11H;51R)1NZ)5O"#?O0 =1F#?O( =1.+ M5O"+1NX[51AU"#M%%G4#Z:X!BW4$.W;>?22+WM'CBX?@)(E&^HM>^HM5&(M% M%CM7 G\(? 0[!W<"ZP-&Z]<[=MY\+(M>^HM'!(O F8E&SHE6T(M>^HM7 HL' M T;.$U;0.548? I_!3E%%G8#Z5$!.W4$?CB+7OJ#?P0 =".+7OJ+51B+118[ M5P)U%3L'=1&-1/^+V-'CBY_@)(!_"P!T#$Z+WM'CBX?@)(E&^HEVVD8[=MY] M&HO>T>.+G^ DBU<"BP<#1O(35O2)!XE7 NO@BW;:.W4$?A2-1/^+V-'CBY_@ M)(I'"YB)1MCK!<=&V QT;6 0"+7OJ+5P*+!XE&ZHE6[%)0Z'83@\0$.W;> M? /IEP"+WM'CBX?@)(E&^HM6\(M&[CM6['\G? 4[1NIW((M>^HM6[(M&ZCM7 M G42.P=U#H-^V !U"(-^U@!U NM:_T;<BU[ZBD<+F(E&UCMU!'X-C43_B]C1 MXXN'X"3K [@ %#_=OKH" N#Q 3W10(! '0)BU[Z@$\*".L'BU[Z@&<*]^BU M$XE&ZHE6[(M>^HI'"YB)1MA&Z6'__W;X_W;V5^@- 8/$!H7 = +K&ND5_/]V M^/]V]E?H]P"#Q :%P'0#Z:0 Z?[[.S[6)'0#Z9@ BT;>2(O8T>.+A^ DB4;Z MBU[ZBT<$B\"9B4;.B5;0BU[ZBU<"BP<#1LX35M [5NA\(7\%.T;F<AJ#?1 M=02#?0X = ?'1M*6 .L%QT;2R #K,H-]$ !U#8-]#@!U!\=&TO__ZQ__=NC_ M=N:Z "X9 !24/]U$/]U#NBZSU)0Z-7/B4;2BT;2.T4*= R+1M*)10J!#LHD M! #'11;__\=%&/__BU;HBT;FB44>B54@@64,]_*#?MP = 6!30P0 /]VY/]V MXNC7$8/$!(M&X*/$)(M&W.L Z33/N"X Z/3.Z93ZZ90 BW8$BU8(BT8&.U00 M?PQ\!3M$#G,%N ZW>+1 0#1 9(B]C1XXN_X"2+1029B4;TB5;VBU4"BP4# M1O035O:)1OB)5OJ+5@B+1@8[5OI_#'P%.T;X<P6X 0#K-HM6"(M&!CM6^GP, M?P4[1OAV!;@ .L?@WT$ '04BD4*F*D" '4&@'T+ 7X%N ZP6X 0#K .F4 MSK@( .A4SNEC_^GB HM&!(E&^(7 =0:AUB2)1OB+7OB+1PR)1O*+1O@[!M8D M=0:ARB0)1O*!9O+XWW4#Z: "BU[XBT;RB4<,]T;R" UT$O]V^.BF^8/$ HM> M^(M'#(E&\O=&\A =0/I= *+7OB+1P*I 0!T!;@! .L#N 4.A>#8/$ HE& MY(M>^(M'!(E&]HM>^(M'!@-&]HE&](M^]CM^]'P#Z2X"B]_1XXN'X"2)1OJ+ MV(I'"IBI 0!U ^D1 H-^! !T(N@Q987 =!OHK62+7OB+1O*)1PS_=N3H V# MQ *X 0#I P+_=OK_=OKH!@*#Q 2%P'0#Z<\!]P:()0$ =0/IO0'W1O+ '4% M@4[RP #'1NP ,=&Z@ ]T;R0 !U ^G1 (M>^H-_" !U ^G% (U% 8OP.W;T M?4N+WM'CBY_@)(I'"IBI 0!U NLXB][1X_^WX"3_=OKHF@&#Q 2%P'08@W[L M '4#B7;HBU[ZBT<( 4;L@T;Z$.L(@W[L '0"ZP-&Z["#?NP =0+K:(O?T>.+ MA^ DB4;ZBW;HH8HE P:,)8E&XHO&*\?W;N(#!HXE P:0)8E&\(O&*\>+%G8E M@^H$.\)]"(M&\#M&['P"ZR6!9O*___]V^(O&*\=05^@7"H/$!CO^?0I7Z- ! M@\0"1^ORZ=, ]T;R@ !U ^G" (M>^H-_#@!U ^FV (U% 8OP.W;T?4N+WM'C MBY_@)(I'"IBI 0!U NLX_W;ZB][1X_^WX"3HOP"#Q 2%P'08@W[J '4#B7;F MBU[ZBT<. 4;J@T;Z$.L(@W[J '0"ZP-&Z["#?NH =0+K68O?T>.+A^ DB4;Z MBW;FH8HE P:,)8E&XHO&*\?W;N(#!HXE P:0)8E&\(O&*\>+%G8E@^H$.\)] M"(M&\#M&ZGP"ZQ:!9O)___]V^(O&*\=05^@Q"H/$!NL'5^CW (/$ HM>^H!G M"OY'Z<K]_W;DZ 0+@\0"BU[XQT<, "X #K .FFR[@: .AFR^D5_>F[ (M^ M!HI%"IBI 0!T0(M%#HE&^HMU#(M>!(I'"IBI! !U!;@! .L#N BE4*N0@ MT^+3^O?"" !U!;H! .L#N@ .\)T!;@ .MNZRJ+10B)1OJ+=0:+7@2*1PJ8 M)00 BE4*N0@ T^+3^H'B! [PG0%N ZT*+7@2+1OH[1PAT!;@ .LR@W[Z M '0GBUX$BW\&B]]'B@>8B]Y&BA>Y" #3XM/Z.\)T!;@ .L+@V[Z 77?N $ MZP#IW\JX @#HG\KI//_IRP3'1MP (M>!-'CBX?@)(E&^(M>^(MW!HEVXHM> M^(I'"IBI" !T!;@! .L#N B4;>BU[XBD<*F*D$ '0%N $ ZP.X [1MYT M'K@ %#_=@3H]@F#Q 3HC J+7OC'1P@ (M&WHE&W/]VWNBP"8/$ HE&X(M> M^(M'"(E&Z(M>^(M'#(E&^HE&Y(M>^(M'#HE&YHM^Z#M^YGX#BW[FA?]T+HM> M^O]&^HH'F(O>1HH7N0@ T^+3^CO"= 7_3OKK!8/O 77=BT;Z*T;DB_B+=N([ M?N9U ^FD X-^W !T(K@ %#_=@3H8PF#Q 3_=N;_=OKH?6"#Q 2+1N:CDB7I M? .+1N@[!M(D?3*#?MX =!FX !0H=(D*T;H4(O& T;H4.BR X/$!NL3H=(D M*T;H4(O& T;H4.C# X/$!#M^YGP#Z3D#BU[ZB@>8B4;T_T;ZB\8#QXO8B@>8 M.4;T=0/I& ,[?NA\-(O& \>+V(M&](@'BT8$.P:4)74&.SZ2)70*5_]V!.C% M"(/$!/]V].AS7X/$ O\&DB7IWP+W!H@E @!U NO"QT;N "+1N8[1NAU _]& M[HM&YCM&Z'P)@W[N '4#Z3$!BT;TB4;JBT;F2#OX? +KD8M>^HH'F(E&\H-^ M]"!U"XM&YCM&Z'4#Z0<!B7[PB\8#QXO8B@>8.4;T=1&+Q@/'B]B*1P&8.4;R M=0+K'D<[?NA] NL4BW[P@W[N '0(QT;N #IS #I.?_KP\=&] $ B\<#1O0[ M1N9])XO& \<#1O2+V(H'F(M6]$H#5OJ+VHH7N0@ T^+3^CO"=07_1O3KSXO' M*T;P]RZ6)0,&F"6)1NR+1NP[1O1\&8M&ZHE&](M^\(-^[@!T!\=&[@ ZV/I MT/Z#?NX = N+1NJ)1O2+?O#K3_]V\/]V!.B<!X/$!(O'*T;PB4;TBT;H*\=0 MB\8#QU"+Q@-&\%#H5,:#Q :+1O0I1NC_=O2+Q@-&Z%#H& *#Q 2+?O#_=O3H M_%>#Q +I@P&#?MX = /I9_Z-10$[1NA\ ^E<_HM&](E&ZHM&^HE&Y(O& \>+ MV(I' 9B)1O*+Q@/'B]B /R!U"XM&YCM&Z'4#Z2W^B7[V1SM^YGP#Z10!BU[Z MB@>8B4;T_T;ZB\8#1O:+V(H'F#E&]'0,.S[2)'X#Z? 1^LA.W[F? /IY0"+ M7OJ*!YB)1O3_1OJ+1O0[1O)T T?KQNL"ZZX[/M(D? /IP0#'1O0" (M&]@-& M]#M&YGTEB\8#1O8#1O2+V(H'F(M>^O]&^HH7N0@ T^+3^CO"=07_1O3KT(O' M*T;V]RZ:)0,&G"6)1O [1O1\ NMU@W[N '0*BT;P.T;L? +K92M^]HM&Y(E& M^O].^E>+1N@#QSL&TB1\!Z'2)"O'ZP.+1N@#QE"+Q@-&]E#H_@"#Q 8!?NA7 M_W;ZB\8#1O90Z.[$@\0&_W;V_W8$Z L&@\0$_W;Z5^@I58/$! %^^O]&^@-^ M]NL@BW[VBT;JB4;TBT;DB4;Z@W[N '0(QT;N #I3_WI[?Q'Z;_\.W[H?0U7 M_W8$Z,,%@\0$Z%D&BU[XBT<,BU[XB4<&BU[XBT<.BU[XB4<(BU[XB7<,BU[X M@&<*_H-^W@!T"8M>^(!/"@3K!XM>^(!G"OOI",:X( #HR,7I+/OK'(M^!H7_ M?P+K$(MV!(O>1HM&"(@'@^\!=?/IX<6X #HH<7KW.L:BWX&A?]_ NL.BW8$ MB]Y&Q@<@@^\!=?7IO<6X #H?<7KWNM BT8(B4;ZA<!_ NLQBWX&B\<#1OJ+ M\(O'*T8$B4;Z3XH%F$Z(!(-N^@%U\XM&"(E&^HO?1\8'((-N^@%U].ESQ;@" M .@SQ>NXZ=0 O@ H=(DB4;ZBUX$BT<,B4;XBWX&A?]T-(I%"YB+\(7 ="J# M[@%T(E:*10J8J0$ = B+10P#1OKK!HM%!@-&^E#_=OCH;\.#Q 8!=OC_3OJ+ M?@3H<0B)!8E5 E;_=OK_=OCH> "#Q :+\#MV^GP'@SZ !0!T!L9%"P#K-BMV M^G0:N $ 4(M%# -&^@/&4(M%# -&^E#H&_^#Q :-1 &(10N+10P#1OJ+V,8' M(8M&^D"+\(EU#N@/""L%&U4"B44$@$T* X,^@ 4 ?P2 90K]ZP#IE,2X!@#H M5,3I(__I5@&+/L0DBW8(QP: !0 @VT" 7P,BQW_!8H'F"7_ .L'5^A->8/$ M HE&^H-^^O]U"?\.@ 6+QND; 8-^^@UU0_=%'( =#J#;0(!? R+'?\%B@>8 M)?\ ZP=7Z!5Y@\0"B4;Z/0H =0G_!H %B\;IY "#?OK_= 7_10+_#<=&^@T MZQ:#?OH*=1#W11R '4)_P: !8O&Z;P 5O]V!/]V^NB^ (/$!HE&^HM&^@%& M! -V^CMV!GT#Z57_.W8&= /ICP"#;0(!? R+'?\%B@>8)?\ ZP=7Z)IX@\0" MZV/_#H %ZV[W11R '0[@VT" 7P,BQW_!8H'F"7_ .L'5^AR>(/$ HE&^CT* M '4&_P: !>M @W[Z_W0%_T4"_PU7Z(QY@\0"ZRS_10+_#>LE]T4<@ !U!O\& M@ 7K&/]% O\-ZQ$]__]TF#T* '3B/0T =)3KZ(O&ZP#I,L.X @#H\L+IH?[I M@P"+=@2#_A]^$H/^?WT-B\:8BUX&B >X 0#K9HM^!H/^"74EBT8()0< N@@ M*]")5OJ+1OJ)1@B+WT?&!R"#;OH!=?2+1@CK.<=&" $ ]\: '0)B]]'Q@=^ M_T8(@>9_ (/^'WX%@_Y_=0V+WT?&!UZ!]D _T8(B\:8B 6+1@CK .FCPK@" M .ACPNET_^GI (M>"(M'!HM>" -'!(OPN 4/]V!.B 38/$!%;_=@;HADZ# MQ 2-AFK_B4;ZOP$ .WX&?QN+QBO'B]C1XXN?X"2+1P:+7OJ)!X-&^@)'Z^"- M1/^+^(M&! -&!COX?#F+QRM&!HO8T>.+G^ DBT<&B]_1XXN?X"2)1P:+QRM& M!HO8T>.+G^ DBT<(B]_1XXN?X"2)1PA/Z[V-AFK_B4;ZBT8$ T8&2(OX.WX$ M?"2+7OJ+!XO?T>.+G^ DB4<&@T;Z HO?T>.+G^ DQT<( !/Z]>+?@0[_GT/ MB]_1XXN?X"2 3PH!1^OMZ:[!N)( Z&[!Z0[_Z>0 BUX(BT<&BUX( T<$B_"X M !0_W8$Z(M,@\0$5O]V!NCH3H/$!(V&:O^)1OJ+?@2+1@0#1@8[^'T7B]_1 MXXN?X"2+1P:+7OJ)!X-&^@)'Z]^+?@2+QBM&!COX?3F+QP-&!HO8T>.+G^ D MBT<&B]_1XXN?X"2)1P:+QP-&!HO8T>.+G^ DBT<(B]_1XXN?X"2)1PA'Z[Z- MAFK_B4;ZB\8K1@:+^#O^?22+7OJ+!XO?T>.+G^ DB4<&@T;Z HO?T>.+G^ D MQT<( !'Z]B+?@0[_GT/B]_1XXN?X"2 3PH!1^OMZ;[ N)( Z'[ Z1/_ZR*A M@@6)1OH[1@1T#_]V!.A448/$ HM&!*."!8M&^NL Z9' N ( Z%' Z];ID "+ MO@0 B[8& #L^E"5T"E97Z'1+@\0$ZW6+QBL&DB6)1OJ%P'Q#@W[Z '4"ZV"+ M1OH[!IXE?3"+W]'CBY_@)(I'"IBI# !U'_]V^HO?T>.+G^ DBT<& P:2)5#H MQE:#Q 2)-I(EZR?K'8M&^O?8B4;Z]RZ@)3L&GB5]"^B@2X-N^@%U]^L(5E?H M_4J#Q 3I]K^X @#HMK_I9__K8_<&B"4( '0%Z*Q+ZU.+'I0ET>.+O^ DBT4( M*P:2)8OPA<!^/+@ %#H"_^#Q *)1OBADB6)1OJX( !0Z-M5@\0"_P:2)8/N M 77M_W;XZ.;^@\0"_W;Z_S:4)>@%_X/$!.F(O[@$ .A(O^N5ZQG_-L0DZ)P# M@\0"QP;,) QP;.) Z66_N Z"6_Z]_K#_\VQ"3H=G6#Q +K .E,O[@ M .@,O^OIZP__-L0DZ-9U@\0"ZP#I,[^X #H\[[KZ>L7N@ N $ 4E#_-L0D MZ/5U@\0&ZP#I$K^X #HTK[KX>LBBS[$)(-M @%\#(L=_P6*!Y@E_P#K!U?H MUG.#Q +K .GFOK@ .BFONO6ZPR+/L0D_T4"_PWIT+ZX #HD+[K[.LDBS[$ M)(-M! %\"XL=_P6+1@2(!^L*_W8$5^CE<X/$!.L Z:*^N Z&*^Z]3K((L^ MQ"2#?0( ?@J+'8H'F"7_ .L'5^AK=(/$ NL Z7B^N Z#B^Z]CK(/\VQ"3H M%'&#Q +_=@3HEO^#Q +_-L0DZ!]Q@\0"Z4Z^N Z Z^Z]CK%?]V!O]V!/\V MQ"3H6':#Q ;K .DOOK@ .COO>OCZQ7_=@;_=@3_-L0DZ/-T@\0&ZP#I$+ZX M #HT+WKX^L-Z&(!H\PDB1;.).GYO;@ .BYO>OKZQJX !0_W8&_W8$_S;$ M).C+=X/$".C0_^G5O;@ .B5O>O>ZQ/_-LXD_S;,).A2 (/$!.L Z;B]N MZ'B]Z^7K$[H +@ %)0Z#4 @\0$ZP#IF[VX #H6[WKY>L;N ( 4+H +@ M %)0_S;$).AK=X/$".L Z7:]N Z#:]Z]WK&;@ %#_=@;_=@3_-L0DZ$AW M@\0(ZP#I4[VX #H$[WKW^L9N $ 4(M&!)E24/\VQ"3H)7>#Q CK .DPO;@ M .CPO.O?ZQFX 0!0_W8&_W8$_S;$).@"=X/$".L Z0V]N Z,V\Z]_K#_\V MQ"3HBP.#Q +K .GTO+@ .BTO.OIZP__-L0DZ*L"@\0"ZP#IV[RX #HF[SK MZ>L/_S;$).C0 8/$ NL Z<*\N Z(*\Z^GK#_\VQ"3H"P2#Q +K .FIO+@ M .AIO.OIZP__-L0DZ)]X@\0"ZP#ID+RX #H4+SKZ>L3N PV4/\VQ"3H9P"# MQ 3K .ESO+@ .@SO.OEZQ.X8#A0_S;$).A* (/$!.L Z5:\N Z!:\Z^7K M$[B5-U#_-L0DZ"T @\0$ZP#I.;RX #H^;OKY>L3N,XV4/\VQ"3H$ "#Q 3K M .D<O+@ .C<N^OEZQ;H;O]24/]V!O]V!.BO (/$".L Z?R[N Z+R[Z^+K M#_\VQ"3HTP.#Q +K .GCN[@ .BCN^OIZR#_=@3H3VZ#Q )0Z/AT@\0"N M4/]V!.C+;8/$!.FYN[@ .AYN^O8ZQBX !0_W8(_W8&_W8$Z(QU@\0(ZP#I ME[NX #H5[OKX.L._W8$Z(YW@\0"ZP#I?[NX #H/[OKZNL8_W8(_W8&N)4W M4/]V!.@0 (/$".L Z5V[N Z!V[Z^#K48M^!%?H4W>#Q *)1OB)5OJX !0 M_W8*_W8(5^@B=8/$"%?_5@:#Q )7Z"YW@\0"B4;TB5;VN 4/]V^O]V^%?H M_72#Q B+5O:+1O3K .D"N[@( .C"NNNGZ;8 BWX$]T4<@ !T>(-M @%\#(L= M_P6*!Y@E_P#K!U?HOV^#Q *+\#W__W16@_X*=4__10+_#5?HX7"#Q *+\#W_ M_W09@VT" 7P,BQW_!8H'F"7_ .L'5^B';X/$ H-M @%\#(L=_P6*!Y@E_P#K M!U?H;F^#Q *#_@UU!;@! .LUZXKK+(-M @%\#(L=_P6*!Y@E_P#K!U?H1V^# MQ *+\#W__W0,@_X*=06X 0#K!^O4N ZP#I0;JX #H ;KI0?_INP"+?@3W M11R '1X@VT" 7P,BQW_!8H'F"7_ .L'5^C];H/$ HOP/?__=%:#_@IU3_]% M O\-5^@?<(/$ HOP/0T =06X 0#K<8/^_W09@VT" 7P,BQW_!8H'F"7_ .L' M5^B[;H/$ H-M @%\#(L=_P6*!Y@E_P#K!U?HHFZ#Q +KBNLQ@VT" 7P,BQW_ M!8H'F"7_ .L'5^B%;H/$ HOP/?__=!&#_@IU"O]% O\-N $ ZP?KS[@ .L MZ7JYN Z#JYZ3S_Z;\ BWX$]T4<@ !T>E?H@F^#Q *+\#W__W1J@_X*=6-7 MZ&]O@\0"B_ ]#0!U-X-M @%\#(L=_P6*!Y@E_P#K!U?H%6Z#Q *#;0(!? R+ M'?\%B@>8)?\ ZP=7Z/QM@\0"N $ ZUJ#_O]T&8-M @%\#(L=_P6*!Y@E_P#K M!U?HV6V#Q +KB.LS5^@(;X/$ HOP/?__="6#_@IU'H-M @%\#(L=_P6*!Y@E M_P#K!U?HJ6V#Q *X 0#K!^O-N ZP#IK[BX #H;[CI./_I@@"+?@3W11R M '1/5^BW;H/$ HOP/?__=#^#_@IU.%?HI&Z#Q *+\#T- '4,5^@#_X/$ K@! M .M(@_[_=!F#;0(!? R+'?\%B@>8)?\ ZP=7Z#EM@\0"Z[/K(5?H:&Z#Q *+ M\#W__W03@_X*=0Q7Z,+^@\0"N $ ZP?KW[@ .L Z2&XN Z.&WZ77_ZR/_ M=@3HAW2#Q *)1OB)5OK_=@3H"'2#Q (#1O@35OKK .GSM[@$ .BSM^O5ZQSH MW/B+^#T@ '0%@_\)=0+K[X/__W0#Z/+XZ<VWN Z(VWZ]SK'.AC^(OX/2 M= 6#_PEU NOO@___= /HH/CII[>X #H9[?KW.M#B[X$ (7_?A/HO_J%P'4% MN ZRR#[P%U[^L@A?]]&8O']]B+^.B[^H7 =06X #K#X/O 77OZP/H7?JX M 0#K .E:M[@ .@:M^NUZU+H0_CK,NM&BQ[$)(M''*F '0:Z-WWZ-KWB_@] M__]T ^@C^.@@^(/_#70"ZR"X 0#K';@ .L8/?__=/$]"0!TQ#T* '3!/2 M=+KKY>NQZ?ZVN Z+ZVZZ;K&(M^!H7_?@[_=@3H'_B#Q *#[P%U\NG<MK@ M .B<MNO@ZSB+=@2%]G0NBS[$)(O>1HH'F(E&^H7 =!V#;00!? N+'?\%BT;Z MB ?K"O]V^E?HW6N#Q 3KUNF:MK@" .A:MNO ZSW_=@K_=@C_-L0DZ S[@\0& MB4;XB5;Z_W8&_W8$_S;$).CV^H/$!CM6^G4*.T;X=06X 0#K [@ .L Z5.V MN 0 Z!.VZ[OK;XM^!(-^" !]&8O?1\8'+8M6"(M&!O?:]]B#V@")1@:)5@B# M?@@ ?"1_!H-^!@IR'+H +@* %)0_W8(_W8&Z%*V4E!7Z+?_@\0&B_BZ "X M"@!24/]V"/]V!NAVM@4P (O?1X@'Q@4 B\?K .G:M;@ .B:M>N)Z8( Z"OY MB4;XB5;ZZ"$!Z&/VB_@]__]T18/_"G4^Z*?V@SZB)0!T(?\VHB7H0IN#Q *% MP'01H:(E!0$ ]]A0Z$7X@\0"Z\CK%>CL]E#H-0&#Q *%P'0"ZP7H&?;KL>C7 M]HOX/2X = 6#_RUU%>B/^.B^^#M6^GP*?P4[1OAR ^B6^.E-M;@$ .@-M>EU M_^M#Z#KXZ', Z"_VB_@]__]T,(/_"G4I@SZB)0!T$O\VHB7HOIJ#Q *%P'0" MZ]KK$NAW]E#HP "#Q *%P'0"ZP+KQNG_M+@ .B_M.NUZR2+/G(EA?]U NL7 MBW8$A?]]"8MV!HO']]B+^/_6@^\!=?GIT;2X #HD;3KU.L=Z+KUB_A0Z$, M@\0"A<!T NON@___= /HS_7IJK2X #H:K3KV^L=Z$#UB_A0Z!P @\0"A<!T M NON@___= /H?/7I@[2X #H0[3KV^LDBWX$@_\@= ^#_PET"H/_"G0%@_\, M=06X 0#K!;@ .L Z56TN Z!6TZ]3K'HM^!(/_+G0%@_\M=06X 0#K"5?H MNO^#Q +K .DMM+@ .CML^O:ZR:+1@0E#P"Z 0"+R-/BBT8$N00 T_B+V-'C MBX?@!2/0B\+K .G]L[@ .B]L^O2ZTF+O@0 Z$OWB4;XB5;Z_W8&Z(8 @\0" MZ#GWB06)50+_=OK_=OCH7O:#Q 2+50*+!3M6^G4-.T;X=0CH*BRX #K!;@! M .L Z:JSN 0 Z&JSZZ_K/NC\]HE&^(E6^O]V!O]V!.@@]H/$!/]V".@K (/$ M NC>]HE&](E6]O]V^O]V^.@"]H/$!(M6]HM&].L Z6*SN @ Z"*SZ[KIB "+ M1@2)1OJ%P'4"ZWF#?OH ?@6__#'K"[^I,8M&^O?8B4;ZZ)'VB4;VB5;X_]>+ M\#W__W0-5NCZ_H/$ H7 = +KZH/^_W4._W;X_W;VZ)KU@\0$ZS'_UXOP/?__ M= U6Z-'^@\0"A<!U NOJ@_[_=0+K%(-^! !]!>C3\^L#Z/KS@V[Z 76=Z<^R MN 8 Z(^RZ6__Z1D!BS[$)(-^" !T ^F" (MV!(-M @%\#(L=_P6*!Y@E_P#K M!U?HA6>#Q *)1OH]__]T6XH$F#E&^G0"Z]5&BT8&B4;V@V[V 7X\Z&[SB4;Z MB]Y&BA>Y" #3XM/Z.]!T)(-^^O]U!K@ .FL +@! %"+1O8K1@:+P)E24%?H M,VR#Q CKB^N^N $ Z8P ZX3I@@"+1@9(B4;TBT8$ T;TB4;XBW;X5^@_:(/$ M HE&^CW__W1@B@28.4;Z= +KYTZ+1O2)1O:%P'4%N $ ZTOHF/*)1OJ+WDZ* M%[D( -/BT_H[T'0C@W[Z_W4%N ZRJX 0!0BT8&*T;VB\"94E!7Z+%K@\0( MZYN#;O8!=<&X 0#K!^N1N ZP#IJK&X" #H:K'IWOX ZPSH,]?H#@#H#=?I MDK&X #H4K'K[.L#Z86QN Z$6QZ_7K,X-^! !^%(M&!#L& B)_"XM>!-'C MBX>\(>L6_W8$N/H&4+CP!5#HHZB#Q :X\ 7K .E(L;@ .@(L>O%Z:T B[X$ M .C.UHE&^H/_ G5.N L'4.@5GH/$ HLVQB2%]G0N_W8*5NA\98/$!(7 =!O_ M=!;_=!2#?!8 = 6X. ?K [A"!U#HY)V#Q :+=!+KSH-^^@!^ ^A=UK@! .M- M_W8&A?]T!;A3!^L#N%<'4+A(!U#HMYV#Q ;_=B+_=B#_=A[_=AS_=AK_=AC_ M=A;_=A3_=A+_=A#_=@[_=@S_=@K_=@CHAYV#Q!SHC0#ID+"X @#H4+#I2O_K M/+@ %#_=@3H.Z>#Q 3H#=:)1OK_=@2X6P=0Z%:=@\0$Z%P @W[Z 'X#Z-'5 MN'] 4/]V!.@/IX/$!.E)L+@" .@)L.N\ZR''!H0E__^X !0N 4.B,((/$ M!+@! %#HB)^#Q +I'K"X #HWJ_KU^L&Z L Z0ZPN Z,ZOZ_+IPP#HF-6) M1I:XIP=0Z.2<@\0"C4:84.BU (/$ HO8B@>84.@!&(/$ NM]N X&4+@! %#H MERN#Q 2X> 90N $ 4.B)*X/$!.MNZ#"9ZVGH*_[K9.ME@S[H P!T#;C__U#_ M%N@#@\0"ZPJXMP=0Z(2<@\0"ZT*+/L0DZP._ "AQ@;_!L8&A<!T#+C.!U#H M9)R#Q +K);@! %!7Z,<?@\0$QP;&!@ ZP\M/P ]& !W!]'@D_^GR ;I3_^# M?I8 ?@/HN]3I0*^X9@#H *_I-/_K)8M^!.A31HOP/0H = J+QIB+WT>(!^OL MB]]'Q@< BT8$ZP#I$*^X #HT*[KT^LB@SYB(0!T"_]V!.B4EX/$ NL-_S9R M)?]V!.CF$8/$!.GDKK@ .BDKNO6ZQ'_-G(EZ,'04.C+$8/$!.G)KK@ .B) MKNOGZUCHT/&+P)D[%LXD=38[!LPD=3"#/G(E 74IZ%'WA<!T(NA*]X7 =!OH MR/#HO_'HA_#H6_)24.CF\5)0Z#@3@\0(ZQ/HK?"+/G(EA?]^".B-$8/O 77X MZ6>NN Z">NZZ#K#?\V<B7H@1*#Q +I4*ZX #H$*[KZ^L/H7(E]]A0Z&@2 M@\0"Z3>NN Z/>MZ^GK#?\V<B7H)P"#Q +I(*ZX #HX*WKZ^L/H7(E]]A0 MZ X @\0"Z0>NN Z,>MZ^GK._]V!.BL\(/$ H,^="4 =!7H2?%24/\VSB3_ M-LPDZ- 3@\0(ZQ/H-/%24/\VSB3_-LPDZ'X2@\0(Z<*MN Z(*MZ[WK(^CP M]>@1\8E&^(E6^NB^]>@%\5)0_W;Z_W;XZ%$2@\0(Z96MN 0 Z%6MZ]7K2.A^ M[HOX/?__= CH(>X]"@!U!>@9[HOXZ!3NB_ ]__]U!>B:[^L?5^CQ[H/$ E;H MZNZ#Q +H3.^Z__^X_O]24.@NSH/$!.E#K;@ .@#K>NPZR'_-G(EC4;X4.@Y M^8/$!(7 = S_=OK_=OCH$1&#Q 3I&*VX! #HV*SKU^L.H7(E]]BC<B7HR/_I M *VX #HP*SKZNLO_S9R)8U&^%#H]OB#Q 2%P'0:_W;Z_W;X_S;.)/\VS"3H MQA*#Q C'!H E 0#IQZRX! #HAZSKR>L.H7(E]]BC<B7HNO_IKZRX #H;ZSK MZNDC ;@! %#_-LXD_S;,).CS^(/$!HE&ZHE6[+C__U#_=NS_=NKHW?B#Q :) M1NZ)5O"+5O"+1NX[5NQ\"G\%.T;J<@/IW0"X__]0_W;P_W;NZ++X@\0&B4;V MB5;XN $ 4/]V^/]V]NB<^(/$!HE&\HE6](M6^(M&]CM6]'P*?P4[1O)R ^F< M (M6](M&\CM6\'P*?P4[1NYV ^F' /]V\/]V[NB4[H/$!*'$)(E&^HM6[(M& MZBM&[AM6\%)0_W;ZZ.EB@\0&B_#_=OC_=O;H:>Z#Q 2+5O2+1O(K1O8;5OA2 M4/]V^NC$8H/$!HOX5O]V^N@Q9(/$!(M6\(M&[BM&\AM6]%)0Z'CN@\0$5_]V M^N@39(/$!.B([?]V^/]V]NA)S(/$!.F!J[@2 .A!J^G4_NL-N 4.@\ (/$ M NEIJ[@ .@IJ^OKZPVX 0!0Z"4 @\0"Z5*KN Z!*KZ^OK#;@" %#H#@"# MQ +I.ZNX #H^ZKKZ^LX_S9R)8U&^%#H,?>#Q 2%P'0C_W8$_W;Z_W;X_S;. M)/\VS"3HTQ&#Q K_=OK_=OCH#NV#Q 3I^:JX! #HN:KKP #K">CF[>C%#NGE MJK@ .BEJNOOZPGH[.WHL@[ITJJX #HDJKK[^L/_S9R)>BS 8/$ NL Z;FJ MN Z'FJZ^GK$:%R)??84.B8 8/$ NL Z9ZJN Z%ZJZ^?K#?\V<B7HG@&# MQ +IAZJX #H1ZKKZ^L/H7(E]]A0Z(4!@\0"Z6ZJN Z"ZJZ^GK+(L6SB2A MS"2)1OB)5OJ+/G(EA?]^".AJ#8/O 77X_W;Z_W;XZ$WL@\0$Z3BJN 0 Z/BI MZ\SIA@"+%LXDH<PDB4;PB5;RZ%CRZ+WJB_@]"@!T\X/__W0#Z#CMZ&?MB4;X MB5;ZBU;ZBT;X.U;R? E_!3M&\'8"ZT3H /+HWNJ+^#T* '3S@___= /HU.SH M->V)1O2)5O:+5O:+1O0[5O)_"7P%.T;P<P+K$O]V]O]V]/]V^O]V^.AC#H/$ M".FGJ;@, .AGJ>EQ_^L^@SYT)0!T#/\V<B7H[_&#Q +K#.@T\H7 = +K ^B1 M[.C9[%)0_S;.)/\VS"3H8 ^#Q CH7^O'!H E 0#I7JFX #H'JGKNNLC@SYT M)0!T"J%R)??8HW(EZPS'!G(E #'!G0E 0#HEO_I,:FX #H\:CKU>L1Z'3K MH7(E2%#H#@"#Q +I%JFX #HUJCKY^L5@WX$ '0)_W8$Z&'Q@\0"Z-<,Z?>H MN Z+>HZ^/IGP"#?@0 = O_=@3H0?&#Q +K [@! (OPQP:D)0 A?9U)(-^ M! !^'H-^! %U!>C;"^L1_S;.)/\VS"3H50>#Q 2CI"7K28,^IB4$=0^#/J@E M_W0(H:@EHZ0EZQ'_-LXD_S;,).@L!X/$!*.D)?\VI"7HV>M24.C+!X/$!HOX M@___=07H?.OK!U?H%^N#Q *AI"6CJ"7'!H E! #H+0SI3:BX #H#:CI6/_K M).B>ZZ.J)8D6K"7'!M@D 0"#/AP0 '0*_S8<$.A1*8/$ ND>J+@ .C>I^O4 MZS'H*@&%P'0GBQ:L):&J)8E&^(E6^HL6SB2AS"2CJB6)%JPE_W;Z_W;XZ-P+ M@\0$Z>.GN 0 Z*.GZ\?K*>CO (7 =!__-JPE_S:J)?\VSB3_-LPDZ+(-@\0( MZ.SIQP: )0$ Z;"GN Z'"GZ\_K+NB\ (7 ="3HS^F+%JPEH:HE*P;,)!L6 MSB124.A"Z8/$!%#H"0Z#Q +HKNGI>*>X #H.*?KRNL-N 4.@E (/$ NEA MI[@ .@AI^OKZPVX 0!0Z X @\0"Z4JGN Z JGZ^OK(^A6 (7 =!G_=@3_ M-JPE_S:J)?\VSB3_-LPDZ.L-@\0*Z1VGN Z-VFZ]7K).@I (7 =!JX !0 M_S;.)/\VS"3_-JPE_S:J)>CSC(/$"NGOIK@ .BOINO4ZQF#/M@D '4*N.H' M4.@X*(/$ J'8).L Z<RFN Z(RFZ]_K%+@T.U"XPCM0Z,#Q@\0$Z(X*Z:ZF MN Z&ZFZ^3K%+C".U"X-#M0Z*+Q@\0$Z' *Z9"FN Z%"FZ^3K#.B__^@\ M_NC7_^EZIK@ .@ZINOLZT*+%LXDH<PDB4;XB5;ZZ!SQZ #G/0H = /H2^?H ML>F)1O2)5O;H=_#H??&X !0_W;V_W;TZ)CI4E#H,HR#Q KI+J:X" #H[J7K MMNL)QP: )0$ Z1NFN Z-NEZ^_K6HL>KB71XXN_L"6%_W4%Z',>ZT2+%LXD MH<PDHZHEB1:L)<<&V"0! %?H]EZ#Q )0_S;$).A87H/$!.@TZ:/,)(D6SB3_ M-JPE_S:J)>B%QH/$!,<&@"4# .FWI;@ .AWI>N>ZW6#/J8E W0%Z!8>ZV;_ M-JPE_S:J)?\VSB3_-LPDZ$0*@\0(BQ;.)*',)#L6K"5\%G\&.P:J)78.BQ:L M):&J):/,)(D6SB2^" "#+JXE 7T&QP:N)0< BQZN)='CB[^P)87_= +K!8/N M 77>Z'/GZ"K_ZP#I.*6X #H^*3K@^L-N D 4.@?]H/$ NDAI;@ .CAI.OK MZQ>X#0!0Z"G'@\0"N D 4.@?QX/$ ND I;@ .C I.OAZPSH[N?H!>WHR@CI MZJ2X #HJJ3K[.M:Z #Z_S;.)/\VS"3H=P.#Q 0[!A(0?0S_-A(0Z%X(@\0" MZPJX A0Z $(@\0"_S;T!^CW!X/$ O\V]@?H[0>#Q +_-O8'Z$"B@\0"]]A0 MZ$3G@\0"Z('FZ8:DN Z$:DZY[K2.@<Y8OX/?__=0RX"0!0Z",'@\0"ZR^# M_PIU'>A9Y^AP[.CE HOPZ(#GA?9T"5;HYP>#Q +K#^L#Z#?EN D 4.CR!H/$ M NDTI+@ .CTH^NPZ:, Z ,&H=8DB4;Z@SYT)0!T,HLV<B6#_@1U)X,^="4$ M=2#_-LXD_S;,).@&S8/$!(OXA<!\#%?_=OKHX<Z#Q 3K8.L8@0[*) $ BU[Z MBT<&]RX4$)FY9 #W^8OPA?9]!;X .L1BU[Z.W<&? F+7OJ+1P9(B_"+QO?8 M4.CA X/$ N@&YXE&]HE6^(M>^HM6^(M&]HE'#HE7$.C"Y8$.RB0 !.F&H[@& M .A&H^E4_^L-_S9R)>B% (/$ NENH[@ .@NH^OKZP^A<B7WV%#H; "#Q +I M5:.X #H%:/KZ>L-_S9R)>C5 (/$ ND^H[@ .C^HNOKZP^A<B7WV%#HO "# MQ +I):.X #HY:+KZ>L-N $ 4.A5 8/$ ND.H[@ .C.HNOKZPVX !0Z#X! M@\0"Z?>BN Z+>BZ^OK=HLVUB2+1 8M @"+^(7 ?P._ 0"+Q_=N!(OXA<!U M NM3Z*<$_W00_W0.Z%/E@\0$5^CN H/$ NC YHE&](E6]N@*YHE&^(E6^CM6 M]G4%.T;T= Z+5OJ+1OB)1 Z)5!#K"L=$#@ QT00 #H>.2!#LHD" 3I=Z*X M" #H-Z+K@NFD (N^! "+-M8DA?]U ^F2 .@W!/]T$/]T#NCCY(/$!%?H?@*# MQ +HH^6)1 Z)5!"!#LHD 2%_WX8BQ;.)*',)#M4$'\*? 4[1 YS ^@6Y.M. MBQ;.)*',)(E&^(E6^N@$Y.CF _]V^O]V^%;HU-*#Q :%P'0/BU;ZBT;XH\PD MB1;.).L;BT0$ T0&2(O8T>.+G^ DBU<"BP>CS"2)%LXDZ/[CZ<BAN 0 Z(BA MZ5/_ZT+HEP.#?@0 = R+'M8DBU<0BT<.ZQR+'M8DBT<$BQ[6) -'!DB+V-'C MBY_@)(M7 HL'4E#HEN.#Q 2!#LHD" #I>Z&X #H.Z'KMNL.Z,WD4E#H#@"# MQ 3I8Z&X #H(Z'KZNFE .BTY(E&^(E6^O]V!O]V!.C8XX/$!.@[Y+X .B9 MY(E&\(E6\HM6!HM&!"M&\!M6\HE&](E6]H/Z 'Q7?P4] !T4(L^?B6+QXO MF3E6]G\*? 4Y1O1S XM^]%97Z/K*@\0$B_"%P'T#O@ B\>9B4;PB5;RBU;V MBT;T*T;P&U;RB4;TB5;V@_H ?[=\!3T '6P_W;Z_W;XZ$_C@\0$B\;K .FS MH+@, .ASH.E2_^F' (MV"(7V?P6X #K>('^A !\!;C__^MMOP Z.GCB4;X MB5;Z_W8&_W8$Z WC@\0$N 4%:-AFG_4.C@VX/$!HOXB\<KQGPJZ+SC*T8$ M&U8&B_"#/H % 'X6BQ[$)(M''*F '0%N ( ZP.X 0 K\.L#OO___W;Z_W;X MZ+SB@\0$B\;K .D@H+B4 .C@G^EP_^L/N/__4.@I (/$ NL Z0:@N Z,:? MZ^GK#[@! %#H$ "#Q +K .GMG[@ .BMG^OIZP_HO0'_=@3H#@"#Q +IU)^X M #HE)_KZ>F= 8N^! #H(>-24.C%R(/$!(OPA<!]#;@$"%#HIB*#Q *^ "+ M'M8DBT<$B89:_XL>UB2+1P8#AEK_B898_XO>T>.+G^ DBU<"BP>)1NR)5NZ- MAEW_B4;XQD;W (7_?@+K2(O& \<[AEK_? /IW "+QBN&6O\#^(NV6O^+WM'C MBY_@)(M7 HL'B4;LB5;N_W;N_W;LZ,;A@\0$B\?WV(OX5^A/ 8/$ NGR (O& M \<[AEC_?P/IE "+AEC_*\8K^(N&6/](B_"+WM'CBY_@)(M'!(O F8F&5/^) MEE;_B][1XXN?X"2+5P*+!P.&5/\3EE;_B4;LB5;N.[9:_WXGC43_B]C1XXN? MX"2*1PN8B$;WA<!T$8U$_XO8T>.+G^ DBT<&B4;R_W;N_W;LZ##A@\0$C4;L M4(U&[%#H)=F#Q 2#[P%^!H-^\ !UY^M1 _<[MEC_?#9.B][1XXN?X"2+1P2+ MP)F)AE3_B996_XO>T>.+G^ DBU<"BP<#AE3_$Y96_U)0Z-G@@\0$ZQ.+WM'C MBY_@)/]W O\WZ,3@@\0$Z2R>N*@ Z.R=Z5K^ZT&+/M8DBQ;.)*',)(E&^(E6 M^N@%X*'*)"7XWPE%#%?H9LF#Q *+10P)!LHD@2;*)/?RBU;ZBT;XH\PDB1;. M).G@G;@$ .B@G>NWZ8, BT8$0(OXA<!_ NMTQT;Z "+-M(DQT;X #H6]Z) M1OH]__]U NM9@W[Z"G4LBQ[$)(M''*F '0;Z#S>B4;Z/0T =07_1OCK%8-^ M^O]T ^AYWNL%_T;XZP6#[@%UO(/O 76N@W[X '02BQ[$)(M''*F '0#Z%/> MZ%#>N $ ZP#I4IVX! #H$IWI=/\ ZSJ+/L0D@VT$ 7P+BQW_!8M&!(@'ZPK_ M=@17Z&52@\0$@P;,) &#%LXD +K__[C__U)0Z/>]@\0$Z0R=N Z,R<Z[[K M&(M^!H7_?@[_=@3HK?^#Q *#[P%U\NGJG+@ .BJG.O@ZR.+'L0DBT<<J8 M= JX#0!0Z(7_@\0"N H 4.A[_X/$ NF]G+@ .A]G.O5ZQR+O@0 B]]'B@>8 MB_"%P'0)5NA7_X/$ NOKZ9><N Z%><Z]SK(8N^! "+M@8 A?9^$HO?1XH' MF%#H+_^#Q *#[@%U[NELG+@ .@LG.O7ZS>+O@0 B\<E^/^+\.CA^B7X_XO6 M*]"Y P#3^E*X"0!0Z#S_@\0$B\<KQE"X( !0Z"W_@\0$Z2N<N Z.N;Z\'K M#.@6WH$.RB0( .D5G+@ .C5F^OLZQ+_=@;_=@3HE-Z#Q 3HV?_I^9NX #H MN9OKYNL2_W8&_W8$Z+[>@\0$Z+W_Z=V;N Z)V;Z^;K#_]V!.B"WH/$ NBD M_^G$F[@ .B$F^OIZS7HP]^#^@!U!ST '4"ZR/H*-S'!LPD #'!LXD "+ M'M8DQT<. #'1Q ($.RB0 >F%F[@ .A%F^O#ZRGHU]Z)1OB)5OK_=@;_ M=@3H0=Z#Q 3_=OK_=OCHO-Y24.@. (/$".E2F[@$ .@2F^O/Z3$!BU8&BT8$ M.U8*?"M_!3M&"'8DBU8&BT8$B4;XB5;ZBU8*BT8(B48$B58&BU;ZBT;XB48( MB58*_W8&_W8$Z)K=@\0$BU8*BT8(*T8$&U8&B4;XB5;Z_W;Z_W;X_S;$).C! M48/$!HL6SB2AS"2)1O2)5O:+5@:+1@2CS"2)%LXDN@ N 4E#HH[N#Q 2+ M5O:+1O2CS"2)%LXDBQ;.)*',)#M6"GP=?P4[1@AR%HL6SB2AS"0K1O@;5OJC MS"2)%LXDZR"+%LXDH<PD.U8&?!1_!3M&!'8-BU8&BT8$H\PDB1;.)(L6K"6A MJB4[5@I\'7\%.T8(<A:+%JPEH:HE*T;X&U;ZHZHEB1:L)>L@BQ:L):&J)3M6 M!GP4?P4[1@1V#8M6!HM&!*.J)8D6K"7H3-SI%IJX" #HUIGIQO[IB0#_=@;_ M=@3HD]R#Q 2+5@J+1@@K1@0;5@924.BGVX/$!(OXA?]U NM>@SZF)0%U/HL> MKB71XXNWL"6%]G0PBU8&BT8$.U8*?!M_!3M&"'845E?H!5.#Q 2+'JXET>.) MO[ EZPA75NCQ4H/$!.L'5^@A (/$ O]V"O]V"/]V!O]V!.@]_H/$".F!F;@ M .A!F>EN_^LV_P:N)8,^KB4(? ;'!JXE "+'JXET>.+O[ EA?]T!U?H?U*# MQ *+'JXET>.+1@2)A[ EZ4"9N Z "9Z\+I30''1O0 (M6"HM&""M&!!M6 M!HE&^(E6^H/Z 'TVBU8&BT8$B4;XB5;ZBU8*BT8(B48$B58&BU;ZBT;XB48( MB58*BU;ZBT;X*T8$&U8&B4;XB5;Z_W8&_W8$Z&S;@\0$@WX, G5FO@ @V[X M 8->^@"#?OH ?%/HL]F+^%#HDN2#Q *%P'0%O@ Z]V%]G05@_]!? R#_UI_ M!XU%((OXZP+KQNL6O@$ @_]A? R#_WI_!XU%X(OXZP+KKNB;V5?H!=J#Q +_ M1O3KG^M2@WX, '4/OF$ QT;V>@#'1@S@_^L-OD$ QT;V6@#'1@P@ (-N^ &# M7OH @W[Z 'PBZ"[9B_@[\'\7.W[V?Q+H3-F+QP-&#%#HL=F#Q +_1O3KT(L6 MSB2AS"2)1@B)5@KH =J#?O0 = S_=@;_=@3HO+B#Q 3_=@K_=@CHX?N#Q 3I MZ)>X" #HJ)?IJO[K'HM&!"5_ (OX@_]A? J#_WI_!8U%X.L"B\?K .F_E[@ M .A_E^O: .L1N%5;4+@8"%#HQP&#Q 3IHY>X #H8Y?KY^L-N"0(4.@E (/$ M NF,E[@ .A,E^OKZPVX, A0Z X @\0"Z767N Z#67Z^OK2/]V!.BC%8/$ M HOXA<!U NLTBS;$)( ] '4=@WP6 '4,N#T(4.BE&(/$ NL)_W06Z*D"@\0" MZP=7Z* "@\0"5^AL$H/$ NDCE[@ .CCENNPZQ&XKUQ0N%,(4.@L 8/$!.D( ME[@ .C(ENOGZRJ+'L0DBT<<J0$ = RX !0Z* #@\0"ZP^X80A0Z/(7@\0" MN $ ZP#IU):X #HE);KSNF3 ,=&^@$ BS;$)(L^QB2#?OH ='&%_W1M]T4< M 0!T88-]%@!T6X,^="4 = ]7Z-.L@\0"Z)3_B4;ZZT7_=12X@0A0Z,,4@\0$ MB4;X@W[X '4'QT;Z #K+8M>^(H'F%#HB?Z#Q (]60!U#5?HE:R#Q +H5O^) M1OK_=OCHD!&#Q *+?1+KB5;H>JR#Q *+1OKK .DVEK@$ .CVE>ED_^L/N @ M4.C9 H/$ NL Z1R6N Z-R5Z^GK#[@) %#HP *#Q +K .D#EK@ .C#E>OI MZP^X"@!0Z*<"@\0"ZP#IZI6X #HJI7KZ>LG_W8$Z!@4@\0"B_B%P'4"ZQ. M/0!T!U?_5@:#Q )7Z (1@\0"Z;F5N Z'F5Z]'I%0&+O@0 BS;&)(7V=!N# M?!8 =!!7_W06Z-62@\0$A<!U NL%BW02Z^&%]G0*5NB3JX/$ NG= +@ %!7 MZ!.)@\0$B4;VA<!]#X,^P"4"= ;HLP'IO@#K"?]V]NA$A8/$ E?H2 6#Q *) M1OC_=OCH):N#Q *+\(7V=%I6Z!K=@\0"A=)U H7 =0:#?!8 =$6#?!8 = 6+ M1!;K [C<"%#_=!2XJ@A0Z$83@\0&B4;Z@W[Z '4"ZUZ+7OJ /P!T"_]V^NAH MJH/$ HOP_W;ZZ"00@\0"ZPO_=OCH4JJ#Q *+\%;HX:J#Q *#?O8 ?0E7Z.H$ M@\0"ZQ]7Z"< @\0"A<!U%(-\%@!T#O]T%NCG#X/$ L=$%@ Z9F4N 8 Z%F4 MZ>+^ZR_H9JR%P'4"ZR/_=@3HJ02#Q +_=@3H'P"#Q *%P'4%N ZPCHL*>X M 0#K .E?E+@ .@?E.O)Z:$ N 4/]V!.CLAX/$!(OXA<!]">B4 +@ .F" M ,<&P"4 %?H0$>#Q *+\(7 =3.#_R!\#+CF"%#HE!6#Q +K%H,^P"4 = 7H M8 #K"K@-"5#H^A:#Q )7Z.R#@\0"N ZSQ6_S;$).AG3(/$!.A#UXE&^(E6 M^NB7ZXL6SB2AS"0[5OIU!3M&^'0,_W;Z_W;XZ(.T@\0$Z.[5N $ ZP#ILY.X M! #H<Y/I5O_K#;@F"5#H)0"#Q +IFY.X #H6Y/KZ^L-N#,)4.@. (/$ NF$ MD[@ .A$D^OKZR?_=@3HH12#Q *X00E0Z)<4@\0"_S; )>CCX8/$ E#HU!2# MQ +I4Y.X #H$Y/KT>G& HM&!"4' (E&^L>&QOX! (M&^NM9QT;X10GK8X,^ MV"0 =1"X4@E0Z)H4@\0"N Z9$"QT;X7 GK18L>KB71XX._L"4 =1"X:PE0 MZ'84@\0"N Z6T"QT;X>PGK(;B-"5#HW16#Q *X #I5@(] !THCT! '2D M/0( =+WKW_=&! @ ="?_=OCH^Q"#Q *+\(7 =0:X #I*0)6C4:04.@BD(/$ M!%;HX@V#Q *-1I"+\(L^Q"3W1@0( '0%@#P =2"#?18 =1"XGPE0Z-L3@\0" MN Z>P!_W465NCFCX/$!(V&J/Y05N@ZCX/$!(F&IO[_-@P05O\V"!"-ALC^ M4.C- 8/$"/\V#A!6_S8*$(V&+/]0Z+D!@\0(C88L_U#HI9"#Q +H:@.#OJ;^ M 'P;N ( 4%;HFGN#Q 2%P'0,Z'7^QX;&_@ Z7$!_S8&$(V&+/]0Z(& @\0$ MB4;VA<!]#.A3_L>&QOX .E/ 8-^^@!U!U;H_0&#Q *XM0E0Z-P2@\0"@[ZF M_@!\)HN&K/XE_P]0C88L_U#H4WN#Q 3_MK+^_[:P_HV&+/]0Z%Q[@\0&BT;Z MZVG_=O97Z$1&@\0$B8;&_NMHZ+33BQ:L):&J)2L&S"0;%LXD4E#H)].#Q 2) M1O3_=O:X @!0_W;TZ(I?@\0&B8;&_O]V].AY2H/$ NLL_W;VN ( 4(L>KB71 MX_^WL"7H9%^#Q :)AL;^ZP\] !TDCT! '2=/0( =-3_=O;H"(&#Q *+AL;^ MH\ EA<!T$KC "5#HA?V#Q +'AL;^ #K:,>&QOX! (-^^@!U ^@PI(V&R/Y0 MZ%V/@\0"C8;(_E!6Z).#@\0$A<!U!U;H1H^#Q )6C88L_U#H?(.#Q 2%P'47 MC88L_U#H*X^#Q *XS@E0Z+81@\0"ZQ"XU@E0Z!(2@\0"QX;&_@ Z*\!BX;& M_NL Z8*0N%8!Z$*0Z3']ZVR+?@3&!0#_=@CH: "#Q *+\(O&*T8(4/]V"%?H M(XZ#Q :#?@8 = K_=@97Z%6-@\0$5^@_ (/$ HOX5E?H1(V#Q 2+=@J%]G0; M5NC2C8/$ KH. "O0 ]>+VL8' %97Z"*-@\0$BT8$ZP#I"Y"X #HRX_KC.LC MBW8$B_Z+WT>*!YB)1OJ%P'0*@W[Z+W4"B_?KZ8O&ZP#IWH^X @#HGH_KU>LJ MBS[$)/]V!.BQ"H/$ HOP@WT6 '0)_W46Z/P*@\0"B746@0[*) 0 Z:J/N MZ&J/Z\[IN@#HY0"+?@2%_W0"ZQF#?@0 = /IGP!7Z%JF@\0"B_B%P'4#Z8\ M_W44N.0)4/\V@B6-1IA0Z.2,@\0$4.AMC(/$!%#H9HR#Q 2#?@8 = Z-1IA0 MN.<)4.@T?(/$!/\V!A"-1IA0Z,9]@\0$B_"%P'T=@WX& '05_S; )>BEW8/$ M E"X] E0Z 5\@\0$ZQ]65^C$0X/$!%;H^'Z#Q *#?@8 = JX 0I0Z.1[@\0" M@64<_O_I6/_H# #IY8ZX9 #HI8[I/?_K&X,^%@@ ?Q&X 0!0N ,*4.AJ@H/$ M!*,6".F_CK@ .A_CNO=ZQ/_-A8(Z*!^@\0"QP86"/__Z:*.N Z&*.Z^7I ML@&X"@I0Z*,/@\0"Z'BPB4;Z4.@)LH/$ HOP]T;Z@ !T"K@="E#HMP^#Q *# M_EMU'K@@"E#HJ ^#Q +H2; -@ ")1OI0Z->Q@\0"B_#K(8/^7'4<N",*4.B% M#X/$ N@FL T 8E&^E#HM+&#Q *+\(M&^B5_ (A&\,9&\0"-1O!0Z%P/@\0" MH<0DB4;N@SX("@!T#/\V" KH-Z2#Q +K7+@G"E#H!0^#Q +_-AX0Z"\/@\0" MN# *4.@E#X/$ K@T"E#H4*.#Q *C" I0Z .D@\0"_S8>$.@P^8/$ H7 =1S_ M=N[H[*.#Q +_-@@*Z/*D@\0"QP8("@ Z;4 C4;PB_B+WT?&!SR+WT?&!T:+ MQIE24%?H.->#Q :+^(O?1\8'/NC%S[@ %"-1O"+URO04HU&\%#HG-J#Q :% MP'4,N#X*4.B;#H/$ NM>Z*O0B4;HB5;JZ/'5A<!U!>AIT.OTN$T*4.BOHH/$ M HE&[.B)T(E&Y(E6YHM6ZHM&Z"M&Y!M6YE)0Z,W.@\0$4/]V[.B&18/$!/]V M[.@CJX/$ O]V[.A I(/$ NBC#O]V[N@DHX/$ NGEC+@8 .BEC.E%_NM&@SY6 M"@!T#+A<"E#H+0Z#Q +K,(L^6@J%_W4/N(D*4.@THH/$ J-:"HOX5^C1T(/$ M L<&5@K__\<&?"4! ($.RB0$ .F4C+@ .A4C.NRZSZ#/E8* 'X;@RY8"@%\ M%+H +@ %)0_S9:"NB\T(/$!NL9@SY6"@!T$L<&5@H ,<&?"4 ($.RB0$ M .E,C+@ .@,C.NZZTR#/E8* '0,N),*4.B5#8/$ NLV@SY:"@!U#+BI"E#H M@@V#Q +K(Z%R)4BC6 J%P'P8N@ N 4E#_-EH*Z%'0@\0&QP96"@$ Z?:+ MN Z+:+ZZSK5HL^6@J%_W4,N+X*4.@^#8/$ NL_BS;$)%?H":*#Q +H&LZX MTPI0Z._4@\0"Z!S/B4;XB5;Z5^C6J8/$ NC]S5;HXJ&#Q +_=OK_=OA7Z'=" M@\0&Z9:+N 0 Z%:+ZZ+IIP"+/GHEA?]\"\<&>B7__XO'Z9$ @SY6"@!^4XL> M6@J#;P(!?!.+'EH*_P>+!TB+V(H'F"7_ .L*_S9:"N@U0(/$ HOX@___= 2+ MQ^M8@RY8"@%\%+H +@ %)0_S9:"NAXSX/$!NNLQP96"@ Z#\BB_B#/E8* M 'TGBQY:"H-O! %\$HO'F(L>6@K_!XL72HO:B ?K"U?_-EH*Z"E @\0$B\?K M .GDBK@ .BDBNE0_^M6@SY6"@!^1XL>6@J#;P(!?!.+'EH*_P>+!TB+V(H' MF"7_ .L*_S9:"NB6/X/$ HOX/?__=0>#/E@* 'X2BQY:"O]' HL>6@K_#[@! M .L%N ZP#I@XJX #H0XKKHNL<@SY6"@!^",<&5@H .L*@SY6"@!] ^C4 M_>E=BK@ .@=BNO< .G; ,<&R"7&/\<&RB7&/[@ %#_-H8DZ(Y_@\0$N M4/\VB"3H@'^#Q 3'!N@* #_=@;_=@3HK0"#Q 3HJ0&#/L(E '0*_S;")>A5 M](/$ H,^Q"4 =!?H7**^ 0"+WM'C_[?")>@Z](/$ NCYHX$.RB0% +C,)5#H MZG^#Q *#/H E G02QP9R)0$ QP9T)0 H8 EHZ8EQP: )0 Z)4*Z'*KA<!T M!O\&Z KK"H,^RB0 = /H0;#HAZN+^.A&"U?HJ:N#Q *#/L8E '0+N $ 4/\6 MQB6#Q +KI.EVB;@ .@VB>D<_^GV ,=&^ QT;V "+1@:)1OJ+?@2#[P%_ M ^FW (-&^@*+7OJ+'X _+70>@W[X GT3BU[ZBP>+7OC1XXF'PB7_1OCK _]& M]NO,BU[ZBQ^*1P&84.@W\8/$ HOPB\;K&,<&U"4! .NNQP9N#O\ ZZ;'!FX. M?P#KGCTW '3S/3@ =.8]20!TV8/O 7\"ZRN#1OH"B\;K%(M>^HL'H]8EZQ:+ M7OJ+!Z/2)>L//5 =/$]5 !TXNORZ5W_BU[Z_S>X[ I0Z)9U@\0$N $ 4.@" M>(/$ NE!_X-^]@!^&_]V]K@" %"X @M0Z')U@\0&N ( 4.C:?H/$ NETB+@& M .@TB.D!_^F: ,<&V"7J"L<&U"3J"L<&J"7__\<&>B7__X,^@B4 =0VX.0M0 MZ$IW@\0"HX(EN 4+H +@ %)0Z(Y:@\0&Z$OYZ&JMZ%:=_S;2)>AOK(/$ M KA_0%"X# !0Z,Q^@\0$N'] 4+@+ %#HOGZ#Q 2X?T!0N 0 4.BP?H/$!+A_ M0%"X"@!0Z*)^@\0$N,5 4+@! %#HE'Z#Q 3ISH>X #HCH?I7?_K+N@S ,<& ME"48_($.RB0( +A!:5"X P!0Z&E^@\0$N $ 4+C,)5#HOWV#Q 3IE8>X #H M58?KRNL)Z#H3Z/GZZ8*'N Z$*'Z^_I_0"#/G(- '09@SYT)01T$NC^K.@Z M"^C8K($.RB0! .G: *'$)(E&^O]V^N@?GH/$ HE&^H7 =1&X !0Z Z>@\0" MB4;ZA<!T/O]V^NC^G8/$ HE&^(7 =!J+7OC_=Q2+7OK_=Q2X/@M0Z$L%@\0& MB_CK$HM>^O]W%+AZ"U#H-P6#Q 2+^.L,N*P+4.@I!8/$ HOXA?]U NMCB@68 M4.CZ[H/$ HOP5^@3 H/$ HO&ZT#H7JRX !0Z"-V@\0"Z"S_@W[Z '0H_W;Z MZ,&<@\0"BU[Z@W\6 '0,N+,+4.BM!X/$ NL*N,P+4.BA!X/$ NL,/4X =,L] M60!TMNO!Z7J&N 0 Z#J&Z?K^ZRG'!G0E 0#HFN^%P'4"ZQ>XZ@M0Z&P'@\0" MZ.NKN 4.BP=8/$ NE&AK@ .@&ANO/Z1D!N $ 4+@" %#H\'R#Q 2+\+@! M %"X P!0Z.!\@\0$B4;ZZ*^KZ+IRB4;XZ;8 N.X+4+@" %#HR@&#Q 3IMP"_ M P"#_Q1]#(O'1U#HX'6#Q +K[[@ %"X @!0Z)Y\@\0$N 4+@# %#HD'R# MQ 2X^@M0Z,YT@\0"B4;TA<!U!<=&] ,N @,4.BX=(/$ HE&](7 =07'1O0. M#+@ %"X' Q0N!8,4/]V].A];X/$"+@?#%"X @!0Z$@!@\0$N $ 4.C;=(/$ M NLLC4;V4.@%A(/$ HOX.T;X= >#__]T NOHZQ(]__]U ^E"_ST '4#Z4O_ MZ]16N ( 4.C^>X/$!/]V^K@# %#H\7N#Q 3HHZJ!#LHD!0#I(H6X" #HXH3I MWO[K(/]V!/]V!.BV@H/$ D!0Z!< @\0"4.A[@H/$!.L Z?>$N Z+>$Z]CK M*/]V!.C53X/$ HOXA<!T!(O'ZQ*X*0Q0Z.\'@\0"Z,?4N ZP#IQ82X #H MA83KT.L=_W8$Z/HS@\0"A<!U#;@^#%#HH >#Q +HF]3IGH2X #H7H3KV^M3 MBWX$BW8&B]]'B@>8B4;ZA<!T*XH$F#E&^G0@B@284.B3[(/$ HE&^/]V^NB' M[(/$ CM&^'0%N ZQ5&Z\B*!)@Y1OIU!;@! .L#N/__ZP#I082X! #H 83K MI>LCBWX&B]]'@#\ = +K]HO'*T8&2%#_=@;_=@3HX(*#Q ;I%(2X #HU(/K MU>L1N&8,4+@ %#HI0"#Q 3I^8.X #HN8/KY^L1N&@,4+@! %#HB@"#Q 3I MWH.X #HGH/KY^MRH<0DB4;XN)D,4.A#F8/$ HE&^H7 =07H+?SK4^@7VO]V M^NCHF8/$ NB6W;H +@ %)0Z*W%@\0$N&H,4+@! %#H-@"#Q 3HEL=24+H M +@ %)0Z'#I@\0(_W;XZ*V9@\0"Z%O=_W;ZZ+&:@\0"Z6*#N 0 Z"*#ZX;I MBP&+1@:CU"2!#LHD! #'1O0 ,=&^*,,QT;VM S_=OCH_0>#Q *)1O*%P'4# MZ3L!BS;:)?]V]O]V\O]V^+C"#%#H4P&#Q B)1O2%P'4#Z1H!H=PEB4;PBT8$ MB4;ZBQ;.)*',)(E&[(E6[K@ %!6_W;RZ![0@\0&A<!U ^GL .BTYH-^^@!U M ^ASJ8-^^@!U!^BSI(OXZP._( "+Q^M]Z<8 B\:9B4;HB5;JBQ;.)*',)"M& MZ!M6ZE)0_S;.)/\VS"3H2N>#Q C_=O#_=O3H^>6#Q 2#_RYU ^F/ .F) +C* M#%#HA@.#Q +KH/]V[O]V[.A8YH/$!.N)ZW"!#LHD 0#I?O__1OKK@K@6#5#H M7 .#Q +I=?^)/GHEZT\]( !T@7\;/0< =-$]# !TSCT2 '37/1< =-(]&P!T MO>O8/2X =0/I7/]_##TA '2W/2P =+?KPCT_ '2&/5X =(T]?P!U ^DY_^NN MZ?+^BQ[$)(M''J/4)($.RB0$ (-^] !T"?]V].@5_8/$ NG,@;@4 .B,@>EL M_@#IF *A8B&)AB3_QP9B(0 H=8DB4;X_S9X)>ATGH/$ NCCY8L>UB2+1P2C M)@W_!BH-QH8N_P#_=@K_=@C_=@;_=@2-AB[_4.@@?X/$ HV6+O\#PE#HNWB# MQ J-AB[_4.@(?X/$ HF&+/_W!LHD_-]U ^F[ .BQ&(7 = /IL0#HD<.-AB[_ M4.AERH/$ HN&+/^9B88@_XF6(O^+%LXDH<PD X8@_Q.6(O^CS"2)%LXD@0[* M) !N 4.A[LH/$ O<&RB0$ '01_S9P)>@#H(/$ E#H^*B#Q +_-LXD_S;, M).@2J8/$!($FRB0#(*&4):,F#>BV%^@:PXN&+/^94E#_-L0DZ)<W@\0&BX8L M_YF)AB#_B98B_XL6SB2AS"0KAB#_&Y8B_Z/,)(D6SB3HQL+'!G(E 0#'!G0E M #'!H E #H;**+\(/^&W0*@_X*= 6#_@UU ^FV (/^!W4O_W;XZ"Z=@\0" MQP8H#0$ N 4.BP 8/$ L<&*@T .C(]8N&)/^C8B&X #I# %6Z+BC@\0" MB88F_X.^)O];=17H#Z(-@ "+\%#HGJ.#Q *)AB;_Z^3'1OHL#8M>^HH'F"7_ M (OXA<!T#3F^)O]U NL%_T;ZZ^2+Q^L=5NC_H8/$ NL@_S9X)>@4JX/$ NL4 MZ$7XZ%3UZQ8] !T\SU. '3BZ]>#/H E G4#Z3#_Z5O^Z+W#B88H_XF6*O^# M^@!\''\%/?\ =A6X2 U0C88N_U#H#7V#Q 3H$/7I_/V+OBC_Z-'!C88N_U#H MI<B#Q *-10&C* V-10%0Z'KZ@\0"B4;ZBT;ZB4;VB3[<)87_=!#H2,"+7OJ( M!_]&^H/O 77PBU[ZQ@< _W;XZ B<@\0"BX8D_Z-B(8M&]NL Z2=_N-P Z.=^ MZ5_]ZPV#/BH- '0#Z,0 Z0]_N Z,]^Z^OK$+@ %#_=@3HR "#Q 3I]7ZX M #HM7[KZ.L0N $ 4/]V!.BN (/$!.G;?K@ .B;?NOHZQ"X @!0_W8$Z)0 M@\0$Z<%^N Z(%^Z^CK$+@# %#_=@3H>@"#Q 3IIWZX #H9W[KZ.L0N 4 M4/]V!.A@ (/$!.F-?K@ .A-?NOHZQ"X!P!0_W8$Z$8 @\0$Z7-^N Z#-^ MZ^CK$_]V!K@+ %#_=@3H*0"#Q ;I5GZX #H%G[KY>L1N 4+@ %#H#@"# MQ 3I.WZX #H^WWKY^F4 (MV!HL^UB3'!BH- "#?@0 =0F#/B@- '4"ZW7_ M-G@EZ-R:@\0"]\8" '0%Z&[ ZP/H?+Z#?@0 =!WWQ@@ = [_=@C_=@3H6.&# MQ 3K"?]V!.@(QX/$ N@UP:,H#>C(O_?& 0!T'O?&! !T ^@T]H$.RB0 ;@ M %#H*:^#Q +HEQ3K!H$.RB0 5?H<9J#Q +IG'VX #H7'WI8__K-8N^!@"+ MW]'CB[?@)/\V?B7_=@3_= SHQGN#Q ;_=@3H%WN#Q *)1 Y7Z(^R@\0"Z$@4 MZ5Q]N Z!Q]Z\/K0XL>)@W1XXNWX"2+? C&AGC_ +B$ "O'4/]V!%?_= :- MAGC_4.CU>H/$!E#H[GJ#Q ;_-B8-C89X_U#H@O^#Q 3I#WVXA #HSWSKM>L9 MN%H-4.@: (/$ O]V!.A'$X/$ NC8$^GL?+@ .BL?.O?ZRW'!BH- "X !0 MH78E2%#HT0>#Q 3HE@C_=@3H%A.#Q +HIQ/'!I(E&/SIM7RX #H=7SKRP#K M"+@ .L Z:)\N Z&)\Z_#K,;CD)5"X 0!0Z)]L@\0$ON0EO]XEN0, ZP#S MI8$.XB4@ ($FXB7G_Z#E)9BCAB7I9WRX #H)WSKQ^L1N-XE4+@! %#H?&R# MQ 3I3'RX #H#'SKY^L1N.0E4+@! %#H86R#Q 3I,7RX #H\7OKY^L#Z21\ MN Z.1[Z_7K#[@ %#H*0"#Q +K .D+?+@ .C+>^OIZP^X 0!0Z! @\0" MZP#I\GNX #HLGOKZ>F. (L6SB2AS"2)1O:)5OB#?@0 = 6X= WK [B%#5#H MCP"#Q *+^(7 =0+K8;BV=5"X#@!0Z')R@\0$B4;ZN $ 4.@G<H/$ O]V!/\V MVB57Z-'(@\0&B_"X !0Z UR@\0"_W;ZN X 4.@^<H/$!(7V= 7H4=_K%O]V M^/]V]NAXO8/$!+B.#5#HP/R#Q +I67NX!@#H&7OI:?_K#;B<#5#H\_V#Q +I M07NX #H 7OKZ^MB_W8$Z&_Y@\0"B_B%P'4%N ZTN+-NHE@#T =2E7Z%GV M@\0"B_Z%]G4/N*$-4.B!_(/$ K@ .LF_S;:)5;HB_R#Q 3K%87V= =6Z"SV M@\0"B3[J):'<):/:)8O'ZP#IU7JX #HE7KKENL-N 4.@E (/$ NF^>K@ M .A^>NOKZPVX 0!0Z X @\0"Z:=ZN Z&=ZZ^OIUP+'AOS^ 0"^ #'1OH M (L6SB2AS"2)A@#_B98"_Z'6)(F&_O['AOC^ #H,9R+^(.^^/X =02%_W5P MZ%>\_S9X)>@GEX/$ NB6WH-^! !T!;BW#>L#N,(-4.B+W8/$ E:-1LA0Z*;= M@\0$@[[\_@!U"KC-#5#H;]V#Q *X !0Z(^K@\0"A?]T$?\VSB3_-LPDZ#NB M@\0$Z.L0_[;^_NC*EH/$ L>&^/X! (7_=0F!#LHD" #HBJ#HT)N+^(O'Z:0 MA?9_ ^EB_TX[=OI^ ^E9_\>&_/X! #MV^G4#Z4O__T[ZC88 _XO6N0( T^(# MPHO8_W<"_S?HEMV#Q 3I*__HB)N+^.F5 ,>&^OX .D@ <>&^OX! .D7 8.^ M_/X =!'_M@+__[8 _^ADW8/$!.E2 8MV^L>&_/X! .GM_H7V= /I/P'_=@3H M:/V#Q +IA %7Z*Z<@\0"/?Y!= >)/GHEZ2 !ZS<]$0!TE7\4/0< =*@]" !U M ^E(_ST- '2_Z] ]$@!TBST3 '4#Z7K_/1L =*L]?P!U ^DG_^NT@_XQ?!>X MV U0Z%7Z@\0"N $ 4.A*;X/$ NG+ (O'F(U6R /6B]J(!T:#OOS^ '4#Z5O^ M@WX$ '0$B\;K!8U$__?84.AONX/$ O]V!%:-1LA0Z.;%@\0&B8;\_H.^_/X M="R)=OKH][N)AO3^B9;V_HV& /^+UKD" -/B \*+V(N6]OZ+AO3^B0>)5P+K M ^BBNNGZ_8N&^OX[1@1T#HN&^OZ)1@2%]G\#Z>/]A?9_-8,^ZB4 = B+-MHE MA?9_ ^G-_?\VVB6-1LA0_S;J)>B\#X/$!HLVVB6)/GHEQX;X_@$ Z:K]Z6+_ M@S[J)0!T"O\VZB7H3O.#Q *-1 %0Z!+S@\0"H^HE5O\VZB6-1LA0Z'L/@\0& MB3;:)>C=N?\V>"7HK92#Q +H'-S_MO[^Z*"4@\0"@0[*) @Z<5WN @!Z(5W MZ2#]Z9P!QP9V)1@ QP;2)$\ QP:()0 QP::)0$ QP:6)0$ QP:>)00 QP:@ M)0$ BQZ&)='CBX?P#:/N)8,^UB4 =1>XJ Y0Z'QF@\0"H]8EA<!U!L<&UB6M M#NL#Z8H N+$.4/\VUB7HOO*#Q 2%P'0(QP;P)0( ZW"XM0Y0_S;6)>BD\H/$ M!(7 = C'!O E 0#K5KB\#E#_-M8EZ(KR@\0$A<!T",<&\"4! .L\_S;6)>BD M"(/$ H7 = C'!O E #K)O\VUB6X 0!0Z+?R@\0$N,,.4+@! %#HJ?*#Q 2X M 0!0Z#QF@\0"H? EZ8@ QP;L)7\ QP:>)0, QP:<)0( QP:8)0( QP:0)0( MQP:*)0$ QP:.)0( QP:,)0$ @SZ&)0UU&,<&FB4% ,<&EB4" ,<&C"42 ,<& MBB4" ($.B"4; .L^@0Z()0L QP:<)0@ QP:8)0 QP:6)0( H88E+0< N@$ MB\C3XHD6BB6ABB6CC"7K#3T! '4#Z7#_/0( =,*#/FX. 'T3]P:()1 = 6X M_P#K [A_ *-N#ND==K@ .C==>E;_NM@H? EZTG_-A8FZ$D'@\0"@SX>)@!T M"O\V(";H. >#Q *X !0Z)T&@\0"ZS&X& !0Z T,@\0"ZR6XW Y0Z"4,@\0" MN.T.4.@;#(/$ NL//0 =+(] 0!TU#T" '3;Z;)UN Z')UZYCK3*'P)>LU M@SX>)@!T"O\V(B;HV :#Q +_-A0FZ,X&@\0"ZR>X'0!0Z*T+@\0"ZQNX]@Y0 MZ,4+@\0"ZP\] !TQCT! '3>/0( =.7I7'6X #H''7KK.M+H? EZRC_-G8E M_S8&)NBC!H/$!.LGN/D.4.B("X/$ NL;N/P.4.A\"X/$ NL//0 =-,] 0!T MWCT" '3EQP:2)0 QP:4)0 Z0=UN Z,=TZZWIB@"+O@0 B[8& #LVTB1^ M!(LVTB2A\"7K65=6_S8$)NB:4(/$!E#H& :#Q +K4[@, %#H]PJ#Q *+QC5@ M %#HZPJ#Q *+QS5@ %#HWPJ#Q +K+[C_#E#H]PJ#Q *-12!0Z,D*@\0"C40@ M4.B_"H/$ NL//0 =*(] 0!TLCT" '31B3Z4)8DVDB7I<G2X #H,G3I;?_K M$?\V[@WHL@J#Q +_#I(EZ59TN Z!9TZ^?K$+@' %#H<PJ#Q +H* OI/'2X M #H_'/KZ.L[H? EZR3_-@@FZ&D%@\0"ZR>X%P!0Z$@*@\0"ZQNX @]0Z& * M@\0"ZP\] !TUST! '3>/0( =.7I]W.X #HMW/KO>E+ 8M^!(7_?P/I/@&A M=B5(.48&?3.ADB6)1OJAE"6)1OBX !0BT8&*\=0Z,'^@\0$_S9V)5?H'0&# MQ 3_=OK_=OCHJOZ#Q 2A\"7IYP"#/O@E '0E_S;T)>C5!(/$ O\V^"7HRP2# MQ *#[P%U\?\V_"7HO 2#Q +K%Z%V)2L&E"50_S8 )NC&!(/$!(/O 77IQP:4 M)?__Z; N! 4.A["8/$ K@* %#H<0F#Q *AAB7K&;X1 .LCO@@ ZQZ^! #K M&;X" .L4O@ ZP\M"0 ]! !W\]'@D_^G$ Y6Z.\#@\0"@^\!=;VX& !0Z"X) M@\0"ZU>X!0]0Z$8)@\0"H88EZQ2^&0#K(+X$ .L;O@$ ZQ:^ #K$3T' '3Q M/0D =.<]#0!TW>OJ5NBC X/$ H/O 77 ZQ4] !U ^D1_ST! '4#Z57_/0( M=*GIH7*X! #H87+IK/[I*P&+?@2%_W\#Z1X!H? EZ<0 @S[Z)0!T)?\V]B7H MN@.#Q +_-OHEZ+ #@\0"@^\!=?'_-OXEZ*$#@\0"ZQ>A=B4K!I0E4/\V B;H MJP.#Q 2#[P%UZ<<&E"7__^F- +@0 %#H8 B#Q *X&@!0Z%8(@\0"@SZ&)0U\ M"KA_ %#H10B#Q *#[P%UX+@8 %#H-@B#Q +K5[@(#U#H3@B#Q *AAB7K%+X9 M .L@O@0 ZQN^ 0#K%KX .L1/0< =/$]"0!TYST- '3=Z^I6Z*L"@\0"@^\! M=<#K%3T '4#Z33_/0$ =0/I>/\] @!TJ:%V)4@Y1@9]-J&4)8E&^J&2)8E& M^+@ %"+1@8K1@10Z(K\@\0$_S9V)?]V!.B-_8/$!/]V^/]V^NAQ_(/$!.EJ M<;@$ .@J<>G,_NEL 8M^!(7_?P/I7P&+=@:A\"7I/@'_-O0EZ(<"@\0"@SX, M)@!T"O\V#";H=@*#Q *%]G0/B]Y&B@>84.A0!X/$ NL*N" 4.A$!X/$ H,^ M#B8 = K_-@XFZ$@"@\0"@^\!=;S_-OPEZ#D"@\0"BT8$ 0:2)>GT +@+#U#H M- >#Q *%]G0/B]Y&B@>84.C_!H/$ NL*N" 4.CS!H/$ H/O 77>N X/4.@( M!X/$ HM&! $&DB7IM "X$ !0Z- &@\0"@SZ&)0UU/K@1#U#HXP:#Q *#[P%U M\;@8 %#HL :#Q *+?@2#_P-]#5>X% ]0Z P'@\0$ZP[_-I(E_S:4)>A@^X/$ M!.LBN!P 4.B!!H/$ H/O 77QN!@ 4.AR!H/$ H7V=0+K1HM^!(7V= ^+WD:* M!YA0Z%@&@\0"ZPJX( !0Z$P&@\0"@^\!==Z+1@0!!I(EZQ@] !U ^FZ_CT! M '4#Z53_/0( =0/I#/_I\F^X #HLF_IB_[ICP"+?@2%_W\#Z8( H? EZV[_ M-O8EZ!,!@\0"_S80)N@) 8/$ H/O 77Q_S;^)>CZ (/$ NM8N!</4.C]!8/$ M H/O 77QZT>X$ !0Z,@%@\0"@SZ&)0UU#+@:#U#HVP6#Q +K"K@( %#HJP6# MQ *#[P%UWK@8 %#HG 6#Q +K#ST '2-/0$ =+X] @!TJ.E7;[@ .@7;^EH M_^LDH? EZQ>#?@0 = 6A&B;K Z$<)E#H> "#Q +K!3T '3DZ2AON Z.AN MZ]3K&HM^!(7_?A"+-NPE5N@]!8/$ H/O 77TZ01ON Z,1NZ][K-8M^!(7_ M?BN^0 &X0 $[QWT"B_<K_HO&NF0 ]^J+\"LV[B5^#/\V["7H_02#Q +K[NO1 MZ<5NN Z(5NZ\/K%+@TAU"X 0!0_W8$Z&A+@\0&Z:=NN Z&=NZ^3K$[@T MAU#_=@;_=@3H2TN#Q ;IBFZX #H2F[KY>L2N"HF4/]V!.CW1X/$!.L Z6YN MN Z"YNZ^;I0 3_=@2-AOK[4.CZ1(/$!#T! '0&N Z20$H88EHR@FN $ M4.@A'8/$ HOXA<!U&+@=#U"X 0!0Z/#I@\0$N $ 4.B#78/$ HD^*B:X/0]0 MZ(__@\0"B_"%P'0%B@2B\B6X0 ]0Z'K_@\0"H_0EN$,/4.AM_X/$ J/V);A& M#U#H8/^#Q *C^"6X20]0Z%/_@\0"H_HEN$P/4.A&_X/$ J/\);A/#U#H.?^# MQ *C_B6X4@]0Z"S_@\0"HQ(FN%4/4.@?_X/$ J,4)KA8#U#H$O^#Q *C%B:X M6P]0Z 7_@\0"HP FN%X/4.CX_H/$ J,")KAA#U#HZ_Z#Q *C!":X9 ]0Z-[^ M@\0"HP8FN&</4.C1_H/$ J,()KAJ#U#HQ/Z#Q *C"B:X;0]0Z+?^@\0"HPPF MN' /4.BJ_H/$ J,.)KAS#U#HG?Z#Q *C$":X=@]0Z/I%@\0"HR0FN'D/4.CM M18/$ J,F)H,^)B8 =0VX? ]0Z&_^@\0"H^X-N'\/4.C#1(/$ H7 ?RBX@@]0 MZ%3^@\0"HQHFA<!T%[B%#U#H0_Z#Q *C'":%P'0&@0Z()4 N(@/4.B618/$ M H7 =0ZXBP]0Z(A%@\0"A<!T!;@! .L#N B8;X^XN&^/NC'B:X! !0N(X/ M4/]V!.B$:H/$!H7 =!&XDP]0_W8$Z*=I@\0$A<!U!L<&'B8! +B>#U#HT?V# MQ *C(":XH0]0Z,3]@\0"HR(FN*0/4.@81(/$ J-V);BG#U#H"T2#Q *CTB2A M*B8KQXE&^H%^^@ $?!BXJ@]0N $ 4.C3YX/$!+@! %#H9EN#Q +_=OI7Z(,; M@\0$@SX$)@!T!X,^!B8 =27_=@2X 0!0Z*3G@\0$N,D/4+@! %#HEN>#Q 2X M 0!0Z"E;@\0"_S8$)NBR 8/$ J.>)8,^)B8 =1F#/NX- '0,_S;N#>B7 8/$ M NL#N.@#HZ E@S[T)0!U!X,^#"8 ='^#/O8E '4'@SX0)@!T<8$.B"4" /\V M_"7H8P&#Q *)AOC[_S;T)>A5 8/$ @.&^/NCG"7_-@XFZ$0!@\0"B8;X^_\V M#";H-@&#Q ) X;X^Z.:)?\V_B7H) &#Q *)AOC[_S;V)>@6 8/$ @.&^/NC MF"7_-A FZ 4!@\0"HY8E@S[X)0!U"H,^ "8 =0/IIP"#/OHE '4*@SX")@!U M ^F6 ($.B"4! (,^^"4 ="[_-OPEZ,D @\0"B8;X^_\V]"7HNP"#Q (#AOC[ MHXXE_S;X)>BJ (/$ J.,)>L3QP:.)0 _S8 )NB5 (/$ J.,)8,^^B4 ="[_ M-OXEZ($ @\0"B8;X^_\V]B7H<P"#Q (#AOC[HY E_S;Z)>AB (/$ J.*)>L3 MQP:0)0 _S8")NA- (/$ J.*)8,^)"8 = 3_#M(D@SX()@!T!H$.B"4( (,^ M'B8 = :!#H@E$ "X 0#K .DC:K@$!.CC:>FW^^L'_P8L)ND1:K@ .C1:>OQ MZRW'!BPF "#?@0 =!F+7@2 /P!T$;CLAE"X 0!0_W8$Z*!&@\0&H2PFZP#I MVFFX #HFFGKR^L:@RYJ#@%] ^BO (L>; Z+1@2(!_\&; [IMFFX #H=FGK MWNM!BW8$H6P.B4;ZB]Y&B@>8B_B%P'0C@RYJ#@%]#XM&^J-L#NAP *%L#HE& M^HO'F(M>^H@'_T;ZZ]&+1OJC; [I:VFX @#H*VGKM^M"BW8$H6P.B4;ZBWX& MA?]^*8,N:@X!?0^+1OJC; [H*@"A; Z)1OJ+WD:*!YB+7OJ(!_]&^H/O 777 MBT;ZHVP.Z1]IN ( Z-]HZ[;K,8,^; X =!NA; XM&@Z+^(7 ?@]7N!H.4+@! M %#HO&>#Q ;'!FP.&@['!FH.3P#IY&BX #HI&CKQ^LX@RZD#@%]';@R %#' M!J(.< ZX< Y0N 4.CJ78/$!J.D#NO<BQZB#HH'F",&;@[_!J(.ZP#IHFBX M #H8FCKP.L;@SZD#@!_!^CBZX7 = 6X 0#K [@ .L Z7UHN Z#UHZ]T MZ8@ B[X$ (NV!@"#?@@ =0+K=8O'J0$ =!6+WT>*!YB+WD:(!X-N" %U NM; MZ^2+QJD! '5!BT8(B4;ZBT8(T>B)1@@]! !V*/]V"%97Z$, @\0&BT;Z)0$ MB48(A<!U NLEBT8(*4;Z W[Z W;ZZP:+1OJ)1@B+WT>*!YB+WD:(!X-N" %U M[^GI9[@" .BI9^EO_^LEB[X$ (NV!@"#?@@ =!2+WX/' HL'B]Z#Q@*)!X-N M" %U[.FY9[@ .AY9^O3 .M!N*(14.B55(/$ O\V,":XLA%0Z(=4@\0$_S8R M)KC"$5#H>52#Q 2X# !0N-(14.AK5(/$!+@! %#H70&#Q +I;6>X #H+6?K MM^LLN 4.@M (/$ HOXA<!U$+@ %#H-@&#Q *+^(7 = 2+Q^L%N ZP#I M-V>X #H]V;KS.D- 8-^! !T"KCS$5#H#52#Q *#?@0 = ZXZ -0N! 24.CY M4X/$!(L^,":%_W46@WX$ '0*N#<24.CA4X/$ K@ .G( (-^! !T!;@! .L# MN B88@^,>&*O@ ,>&*/@ +X (7_=0/IAP"#?@0 =!A7A?9U!;A+$NL# MN%$24+A#$E#HE5.#Q 9&@_X(? .^ !7C88@^%#H6@V#Q 2%P'T:@WX$ '0/ M_[8D^%>X4A)0Z&=3@\0&N' 2ZT^#?00 ="N#?@0 = V^ "X@1)0Z$E3@\0" M@WX$ '0-N 4%?H1 *#Q 3K!;B<$NL>BSWI<O^#?@0 = [_MBKXN*P24.@8 M4X/$!+@ .L Z1]FN-P'Z-]EZ>K^Z00"@WX$ '0*N,T24.CT4H/$ HL^,B:% M_W4C@WX$ '0*N.,24.C<4H/$ H,^,"8 = :X[Q+IS &X #IQ@&+1@2)AAKX MQX8B^ QX8D^ QT;Z "#?@0 =!*XJ!!0N'@04+C^$E#HF5*#Q :%_W4# MZ7<!@WX$ '0+5[@/$U#H@5*#Q 17C88:^%#H3PR#Q 2%P'T:@WX$ '0._[8> M^+@7$U#H75*#Q 2X,1/I5 &+10([1OIU$H-^! !T"KA$$U#H/U*#Q +K&X-^ M! !T#_]U KA'$U#H*E*#Q 3K!KA?$^D? 8M%!"7_ #W- '08@WX$ '0,N&T3 M4.@'4H/$ NL&N(43Z?P @WX$ '06]T4$ (!T!;B5$^L#N)L34.CC48/$ H-] M" !U&(-^! !T#+BA$U#HS5&#Q +K!KBS$^G" /=%! " =22+108K!C0FJ0$
Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 04:12 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 1143 for MINIX@UWALOCKE; Sun, 20 Dec 87 04:09 PST Received: by NDSUVM1 (Mailer X1.24) id 0956; Sun, 20 Dec 87 06:02:27 CST Date: 19 Dec 87 05:16:19 GMT From: Glen Overby <ncoverby@ndsuvax.uucp> Subject: Re: awk/sed (looking for source) Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU In article <1768@botter.cs.vu.nl> ast@cs.vu.nl (Andy Tanenbaum) writes: >In article <750@louie.udel.EDU> THELBEKK%NORUNIT.BITNET@cunyvm.cuny.edu writes : >>Greetings! As far as I can see, the awk and sed sources still >>haven't made it into BITNET -- could a reposting be made? >> >Is this, in fact true? If so, I can repost. I can't recall if it has made it to MINIX-L on Bitnet, but I do know that it is on the archive server for Bitnet on the LISTSERV at NDSUVM1 (I maintain this). Other networks can access this mail, but it works best for people on BitNet due to the 80-column restriction on mail. > I would rather not uuencode >if I don't have to since that will increase the volume by tens of kilobytes. >What does BITNET actual do? If it just mungs tabs or something simple, I >can replace all the tabs with ! or ? or some other character that is not >otherwise used. BitNet has always been a problem. First of all, they run an IBM protocol which limits lines to 80 characters. To get around this, IBM has come up with TWO "packetising" techniques ("DISK DUMP and "NETDATA" to those unfortunate enough to know) which combine short lines and break up long ones. Unfortunately, mail does not use either of these techniques, so lines over 80 characters long either get truncated or wrapped (depending on what software you're using and how it is feeling today). I feel that the BitNet people should come up with some solution of their own to make themselves compatable with the rest of the world, rather than the rest of the world changing to accomodate the IBM world. There is no reason that all other networks should suffer the increased load of uuencoded sources or manually translated characters just because of brain dammage on BitNet. For a long time we at NDSU recieved all of our news over BitNet, and I worked around the problem of wrapped lines and expanded tabs (translation tables were no problem, fortunately). So what comes across BitNet *IS* useable; it just takes some work, and a few different techniques. Of the problems I ran into, the biggest was tab expansion. I worked around this problem with patches by using "patch" with the "loose" option (-l). Wrapped lines showed up on the filenames of the shar archives and on a few comments (a linefeed between * and / on a terminating comment). These are readily visible in sources that use 'sed' and start all lines with a 'X', but had to be manually fixed. Translation tables have not plagued me with Minix sources, but it still exists. The problem comes from the lack of a standard EBCDIC to ASCII translation, as well as internal inconsitiencies in EBCDIC. Curly braces ( { } ) are a classic one (There are two sets of them; one for IBM's "TN" print train and another for the "PN" train. IBM terminals NORMALLY use the "PN" ones, but many Unix systems use the "TN" one. And a major mail gateway to BitNet is a Unix machine). Tabs are an even worse situation. IBM's editors do not use tab characters, but instead display them as a strange character or something (depending on how you connect to your IBM). As a result, the gateways expand tabs. Most gateways will expand tabs on a FOUR character boundary rather than 8. So, in short, the problems with BitNet can be worked around by the people on that network so rest of us don't have to suffer for it. Or would you prefer to go back to using punched cards? >Andy Tanenbaum (ast@cs.vu.nl) -- Glen Overby Bitnet: ncoverby@ndsuvax UUCP: uunet!ndsuvax!ncoverby
Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 04:44 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 0369 for MINIX@UWALOCKE; Sun, 20 Dec 87 04:44 PST Received: by NDSUVM1 (Mailer X1.24) id 0324; Sun, 20 Dec 87 05:24:28 CST Date: 19 Dec 87 21:44:19 GMT From: Andy Tanenbaum <ast@cs.vu.nl> Subject: elle.uuencoded part 2 of 2 Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU M=!B#?@0 = RXO1-0Z*)1@\0"ZP:XT!/IEP"#?@0 = NX 0!05^B5 (/$!(M& M^#M%!G13@[XD^ %T3(-^! !T#_]V^+CC$U#H9U&#Q 3K!;C[$^M=@WX$ '0L MBT4&*T;XB4;VA<!^#_]V]K@,%%#H0%&#Q 3K$(M&]O?84+@9%%#H+E&#Q 2+ M108#10B)1OB+-8E^^HO^Z8+^@WX$ '0-_W;XN"D44.@(48/$!+@ .L Z0]D MN.('Z,]CZ?/]ZVR+O@0 @WX& '4;]T4$ (!T!;A!%.L#N$844%>X-!10Z-!0 M@\0&_W4&N$L44.C#4(/$!/]U"O]U"(,^7A = 6X413K [A;%%#HIU"#Q :X M8!!0_W4$Z! +@\0$4/]U!+AC%%#HC%"#Q ;IF&.X #H6&/KC.D) 8-^! !T M"KAO%%#H;E"#Q *#?@0 = ZXZ -0N(\44.A:4(/$!(L^-B:%_W46@WX$ '0* MN+844.A"4(/$ K@ .G$ (-^! !T!;@! .L#N B88@^,>&*O@ ,>&*/@ M +X (7_=0/I@P"#?@0 =!A7A?9U!;C*%.L#N- 44+C"%%#H]D^#Q 9&@_X( M? .^ !7C88@^%#HNPF#Q 2%P'T:@WX$ '0/_[8D^%>XT110Z,A/@\0&N.X4 MZTN#?00 =">#?@0 = V^ "X_Q10Z*I/@\0"@WX$ '0)5^B' (/$ NL%N!H5 MZQZ+/>EV_X-^! !T#O^V*OBX*A50Z'U/@\0$N ZP#IA&*XW ?H1&+I[O[K M2;A+%5#H8$^#Q *XZ!!0N&L54.A23X/$!+@B$5"X<150Z$1/@\0$N 4+C> MCE"X%@!0N (4.CM$X/$"+AU%5#H)$^#Q +I,&*X #H\&'KK^MQB[X$ (MU M!/?& $!T!;A4 .L#N" 4/?& (!T!;A, .L#N" 4/?& "!T!;@J .L#N" M4+AW%5#HV4Z#Q C_=1#_=0[_=13_=1+_=0S_=0K_=0C_=0;_=03_=0+_-5>X M?A50Z*Y.@\0:N ZP#IM6&X #H=6'KA^LKN 4+@ %#H* "#Q 2+^(7 M= 2+Q^L.N $ 4+@ %#H$ "#Q 3K .F 8;@ .A 8>O-ZTO_=@;_=@2-AB#X M4.A% (/$!HOXA<!T!(O'ZRV-AB#X4+BGD%"X%@!0N (4.CT$H/$"(OX@WX$ M '0*N*P54.@C3H/$ HO'ZP#I*V&XW ?HZV#KK>FX (N^! "#?@8 = 6X 0#K M [@ (-^" !T!;H$ .L#N@ "\(- @")!<=%" QT4* "+-C8FA?9T<597 MZ*H'@\0$A<!]-X-]! !]&8-^!@!T#KCH U"XKA50Z+)-@\0$N,D5ZU&#?@8 M= W_=02XWA50Z)I-@\0$N/85ZSF#? 0 ="2#?@8 = JX!Q90Z']-@\0"@WX& M '0)5NA<_H/$ NL%N"06ZP^+-.N+BT4(B44&N ZP#I:&"X @#H*&#I/__I MX@.+O@0 BUX&BP<E! ")1NR#?NP = R#?0P =0:X #IO@.+7@:+!R4! (E& M\HM>!HM'"(E&[E?_=@;HZ :#Q 2%P'TIBUX&@W\$ 'P&N Z8T#@W[R '0. MN.@#4+@T%E#HYTR#Q 2X41;I<P.#?NP = 6+10CK XM% HOPA<!T%E;_=@;H MG0:#Q 2%P'P$B_[K NL"Z]:%]G1JBUX&@W\$ 'T:@W[R '0.N.@#4+A>%E#H MEDR#Q 2X>Q;I(@.#?O( ="&+7@:+1P2+7@8[1P9]!;BG%NL#N+864+B(%E#H M:4R#Q 2#?O( = E6Z$;]@\0"ZQ&#?NP = 6XMQ;K [C$%NG; HM>!HM&[HE' M"(M>!HE'"H-^\@!T&8-^[ !T!;CB%NL#N.@64+C,%E#H&TR#Q 2#?NP =%N+ M10R)1OB#?O( =!R+7OC_=PC_=P:+7OC_=P+_=OBXZ190Z.U+@\0*BU[X.7\$ M=!^#?O( =!-7BU[X_W<$N ,74.C.2X/$!NL&N"P7Z5@"QT;T #'1O8 .L0 M@W[R '0*N#<74.BJ2X/$ H-^\@!T#K@B$5"X.1=0Z)9+@\0$O@ A?]U ^D) M H-^\@!T!U?H:?R#Q *#?NP = 6+10CK XM% COP=#B#?NP =!J#?O( = RX M/1=0Z%=+@\0"ZP:X4!?IX0'K&(-^\@!T#+A?%U#H/4N#Q +K!KAM%^G' 8M% M!"7_ #W3 '08@W[R '0,N'L74.@:2X/$ NL&N(H7Z:0!@WT, '0D@WT0 'P& M@WT4 'T8@W[R '0,N)D74.CP2H/$ NL&N*T7Z7H!@W[L '0#Z8\ BT4*B4;Z MA<!U ^F (M>^HM'!"7_ #W- '08@W[R '0,N+X74.BT2H/$ NL&N,X7Z3X! M]T4$ "!U+8M>^HM'"HO N@ .540=04Y10YT&(-^\@!T#+C9%U#H@$J#Q +K M!KCS%^D* 8M>^HM'"(M>^CM'"G,8@W[R '0,N/P74.A:2H/$ NL&N!,8Z>0 MZUF+10P[1OAT&X-^\@!T#_]V^+@D&%#H-4J#Q 3K!KA &.F_ (M5%(M%$CM6 M]G\?? 4[1O1S&(-^\@!T#+A/&%#H"TJ#Q +K!KAN&.F5 (M5%(M%$HE&](E6 M]E?_=@;HQP.#Q 2%P'U2BUX&@W\$ 'T9@W[R '0.N.@#4+B#&%#HS$F#Q 2X MH!CK68-^\@!T(XM>!HM'!(M>!CM'!GT%N,X8ZP.XWAA0N*T84.B@28/$!.L% MN-\8ZROK%(OW@W[L '0%BT4&ZP*+!8OXZ?#]@W[R '0*N.<84.AS28/$ K@ M .L Z7I<N! Z#I<Z17\ZQ#_=@2X]!A0Z%-)@\0$Z5]<N Z!]<Z^CK$K@ M %#_=@3H$ "#Q 3K .E#7+@ .@#7.OFZ?<"BWX$@WX& '0+5[@3&5#H%4F# MQ 2%_W48@WX& '0,N!X94.@!28/$ NL&N Z<0"@WX& '0D_W4._W4,_W4* M_W4(_W4&_W4$_W4"_W40_S6X+QE0Z,](@\04@WX& '0?N'H14+AN$5#_=0;H M+@.#Q 10_W4&N%T94.BJ2(/$"(M%$(E&^H7 = B+7OJ+=PKK [X (-^!@!T M#?]V^KAV&5#H@DB#Q 2#?OH =0/IE0"#?@8 = ZX(A%0N((94.AE2(/$!(-^ M!@!T"?]V^NA ^8/$ HM>^HM'!"7_ #W3 '08@WX& '0,N(T94.@X2(/$ NL& MN*$9Z?L!A?9T2(-^!@!T#KBH$%"XKQE0Z!A(@\0$@WX& '0+N 4%;H$_># MQ 2+1 0E_P ]S0!T&(-^!@!T#+BY&5#H[$>#Q +K!KC,&>FO 8-^!@!T#/\U MN-T94.C21X/$!(,] '0OA?9T$8L%.T0&<@J+1 8#1 @Y!788@WX& '0,N.H9 M4.BH1X/$ NL&N/ 9Z6L!ZR2#?0( ?P:#?00 ?AB#?@8 = RX^AE0Z()'@\0" MZP:X !KI10&#?@8 = JX#QI0Z&I'@\0"@WX& '00_W4"_W4"N!$:4.A41X/$ M!H-] @!T.(7V=!R#?00 =1;W108" '4/BP4K1 :+5 HKT#E5 G08@WX& '0, MN"8:4.@>1X/$ NL&N"P:Z>$ @WX& '0*N#@:4.@&1X/$ H-^!@!T$/]U!/]U M!+@Z&E#H\$:#Q :#?00 =#*%]G06]T4& @!T#XL%*T0&BU0(*] Y501V&(-^ M!@!T#+A/&E#HP$:#Q +K!KA5&NF# (-^!@!T"KAA&E#HJ$:#Q *#?@8 =!;_ M=0K_=0C_=0K_=0BX8QI0Z(Q&@\0*@WT* 'T7@WX& '0,N'@:4.AV1H/$ NL% MN'X:ZSJ#?@8 =!;_=0[_=0S_=0[_=0RXB!I0Z%-&@\0*@WX& '035^A?%8/$ M E)0N)\:4.@Z1H/$!K@ .L Z4%9N ( Z %9Z0#]Z9 B[X$ (L%)0$ B4;X MC44,B_"+10B)1OJ%P'0CB]Z#Q@*+1@8[!W4.BT4(*T;ZB44$N/__ZUB#;OH! M=>"#[@*+10J)1OK_10K_10B!?0CH WXF]P4" '0/QT4"M1K'103__[C__^LG MQT4(Z .+1OJ9N>@#]_F)5OJ-10R+5OK1X@/"B]B+1@:)!XM&^NL Z:58N 0 MZ&58Z6?_ZSN+O@0 B[8& ,=&^I 1@SP =!N+!(7'= 6+1 +K [@@ (M>^H@' M_T;Z@\8$Z^"+7OK&!P"XD!'K .E?6+@" .@?6.N] .G# +CP %#H'DZ#Q *) M1OJ%P'0(BT;Z/?__=1&XR!I0N 4.C&!H/$!.F6 (M^^K@4 %"X# !05^B( M 8/$!HD^,":)/C0FZ(4 B_"C,B;'1 ( ,<$ #'1 3-@(ET!L=$"/__QT0* M\ #_=0I6Z!@&@\0$B_B!3 0 $(%-! ! @WX& '0?BT8$*T4&4%?H^ 6#Q 2+ M\/]V!E;H[ 6#Q 2!9 3_/XM%""T" %!7Z-D%@\0$@64$_W_H% "C.":A,B;K M .F05[@" .A05^DT_^MNBSXP)H7_=5J+/C@FA?]U$+C3&E"X !0Z $&@\0$ MZTO'!0 B3XP)L<&."8 +@ $%"X# !0Z%L @\0$B_"+_H7V= N+-5?H+ "# MQ +K[^BL_Z,X)HL^,":%_W4%N ZPF+!:,P)HO'ZP#I%U>X #HUU;KBNL4 MBWX$QT4$ "A,":)!8D^,";I^5:X #HN5;KY.M5BT8$NA0 ]^)0BT8$NA0 M]^)0Z+X @\0$B_B%P'4%N ZR^+1@8)102+10BZ #W=@2)1OJ+1OKW9@2) M10J+=0;_=OK_=@16Z!( @\0&B\;K .F:5K@" .A:5NNCZS.+=@2+1@B)1OJ% MP'\%N ZQZ+_HO& T8&B_")!<=%! @V[Z 77JQP4 (O'ZP#I75:X @#H M'5;KQ>LO_W8*BWX&5_]V!.C2[8/$!H,] '0%BQV)?P*#?0( = >+70*)/^L% MBUX(B3_I)%:X #HY%7KR>E8 HL^,B:%_W4:N 4+@ %#HL/V#Q 2+^(7 M=0:X #I,P+W1@0! '0*BT8$0"7^_XE&!/=&!@$ = J+1@9 )?[_B48&BT8$ MB4;Z]T4$ (!U$8M%"#M&^G,']T4$ $!T NL&BSV%_W7BA?]U!K@ .GC ?=% M! ! =0/ICP&#/C F '4#Z;,!BT8&B4;Z@SXX)@!T#XM&^CL&QAIS!J'&&HE& M^HM&^CM%"'8&BT4(B4;Z_W;ZZ#5+@\0"B4;X.T4&=0/IXP"+1OB%P'0?BT;X M/?__=!?_=0;_=OBXXQI0N 4.C, X/$".EK 8LUA?9T"XM$!"4 P#T P'01 MN/$:4+@ %#HJ@.#Q 3I20&+10:)1O;'10H (M%"(E&^H-^^@!T3?]V^NC" M2H/$ HE&^(M&^(7 = B+1O@]__]U!=%N^NLKBT;X.T;V=!?_=O;_=OBX_QI0 MN 4.A4 X/$".GS (M&^@%%"HM&^@%&]NNMBT4*B4;ZA<!U$(M$!(E%!%?H MG *#Q +INOZ+108#1OJ)1 :+10@K1OH!1 B+1OJ)10B!903_OXMU H7V=";W M1 0 P'4?BT;Z 40(BT;Z 44&BT;Z*44(=0=6Z%,"@\0"B_[K+(M%"#M&^G8? M_W;Z5^AI H/$!(7 =1%7N T;4+@ %#HN@*#Q ;K6H%E!/^_BT4(.T8$<P/I M.?Z+1@8%# Y10AV%8,^,"8 = S_=@97Z"@"@\0$ZP+K#L=%"@ @4T$ ("+ MQ^L<Z%;\B_"%P'0.5NC$_(/$ HL^,B;I]/VX #K .G!4[@& .B!4^F?_>FO M (N^! "!903_?XMU H7V=!#W1 0 P'4)B_Y6Z)\!@\0"BS6%]G0.]T0$ ,!U M!U?HBP&#Q *#?0@ =1Z+=0*%]G0)5NAW 8/$ NL,BP6C,B97Z%/\@\0"ZU2+ M108K!C0F)0$ B4;ZA<!T0XMU H7V=1"X'AM0N 4.C1 8/$!.LLN ( *T;Z MB4;ZBT;Z.T4(<@E6Z"<!@\0"ZQ*+1OH!1 B+1OH!10:+1OHI10CI!E.X @#H MQE+I2/_I^ "+O@0 B[8& #EU"'(#Z<@ B\8K10B)1OC'1O0 ,=&]@ BP6) M1OJ%P'0<BU[ZBT<$J0# =1&+7OJ+1PB)1O0[1OAR ^F* (M% HE&^H7 =!2+ M7OJ+1P2I ,!U"8M>^HM'"(E&]HM&]@-&]#M&^',95E;H:?R#Q 2)1OJ%P'4% MN ZW''1O8 /]U"(M>^O]W!O]U!NCNZ8/$!HM>^HM%!(E'!(M>^HM%"HE' M"H-^]@!U#%?HB_Z#Q *+1OKK-O]V^N@\ (/$ HM^^H-^] !T!U?H+ "#Q (Y M=0AV%%97Z$L @\0$A<!T"/\UZ%3^@\0"B\?K .D"4K@( .C"4>G__NLBBWX$ MBS6+1 @!10B+!(D%A<!T!8L=B7\"5NC,^H/$ NG54;@ .B54>O6ZUJ+?@2+ M10B+5@:)5OH[PG<%N ZT+H+/J+\(7 =06X #K-(M%""M&^HE$"(M%!@-& M^HE$!HM&^HE%"(M%!(E$!(L%B02%P'0%BQR)=P*)? *)-8O&ZP#I<5&X @#H M,5'KGNM#C4;ZB4;Z@T;Z"J'*)3T! '4#Z,@Z@S[*)0!T'_]V#O]V#/]V"O]V M"/]V!HM>^O\WN 4/\6RB6#Q Z+1@3K .DD4;@" .CD4.NUZS*+1@0% P E M_O^)1OK_=OK_=OKHZ?J#Q 2+^(7 =06X #K#(MU!HD\@\8"B\;K .GH4+@" M .BH4.O&ZQO_=@3HO/^#Q *+^(7 = 2+Q^L#N/__ZP#IPU"X #H@U#KW>L\ MBT8$+0( B_"+/(M%!"7_ #W- '4%.74&=!/_=@2X*!M0N 4.@H_X/$!NL, M5^C0_(/$ K@! .L Z7U0N Z#U0Z[SK6(M&!"T" (OPBSR+100E_P ]S0!U M!3EU!G03_W8$N#D;4+@ %#HXOZ#Q ;K*(M&!@4# "7^_U!7Z#O]@\0$B_B% MP'4%N ZPR+=0:)/(/& HO&ZP#I&U"X #HVT_KH.L_BT8$]V8&B_B%P'0. M5^CE_H/$ HE&^H7 =06X #K'8MV^HU% ='HB_B+WH/& L<' "#[P%U\HM& M^NL Z=)/N ( Z))/Z[GK-XL^.":%_W40N$T;4+@ %#H3/Z#Q 3K'(%-! " MN 04+@, %"X,"90Z!, @\0&QT4$ #ID4^X #H44_KP>DJ <=&^ BUX$ MQP< (LV,B:%]G4#Z1 !BT0$A48(=0/I &+? :+1 JZ #W=@:)1O2+1OB) M1O;'1O( (M>!(L'B4;Z@V[T 7T#Z9\ @WT$ '1E@W[Z '1?]T4$ (!T!_=% M! 8=%&#?0( =$N+7OJ+!XM>!(D'BT;Z.T;X=07'1O@ (M&^CM&]G4%QT;V M #_=@:X !0_W;Z5^B2^(/$"(M>!(L'B4;Z.\9R!<=&^@ QT4$ "#?00 M=2&#?O@ = 6+7OB)/XE^^(M>!(,_ '4%BUX$B3_'!0 ZP/_1O*+QP-&!HOX MZ5C_@W[R '4PBWP"A?]T*8-^]@!T#HM&]HE&^(O8QP< .L,QT;X "+7@3' M!P 5NBQ^H/$ HOWBS3IZ?[I7$ZX"@#H'$[IS?[K5(L^,B:%_W1$BT4$A48$ M=#B+=0:+10JZ #W=@:)1OJ#? 0 =!;_=@I6_U8(@\0$B4;XA<!T!8M&^.L6 MB\8#1@:+\(-N^@%UUXL]Z[BX #K .G]3;@$ .B]3>ND .MF@WX$ '4%N MZUB+?@:%_W4BZ&,8B_B)?OJ^"P"+7OK'!P @T;Z H/N 77PQT4$TP#K"X-] M @!T!;@ .LDBT8$B4;ZO@D BU[ZQP< (-&^@*#[@%U\(M>!(E_$(M&!.L MZ8Q-N ( Z$Q-ZY+K)XM^!(7_=06X #K&%?H- F#Q *+=1#'11 ,=%!@ MB\;K .E;3;@ .@;3>O1ZQ2+?@2%_W0*@4T& 0#'100 .D]3;@ .C]3.OD MZP^+?@2%_W0%@64&_O_I)$VX #HY$SKZ>LDC4;>4/]V!.BJ/X/$!(7 ?0BZ M__^X___K"(M6[HM&[.L Z?9,N!X Z+9,Z]3IH0"+1@2)1OJ%P'P2@W[Z('T, MBU[ZT>.#OT0F '0%N ZWW_=OKHJ/^#Q *)1O:)5OB#^@!]!;@ .MDN H M4.B8%X/$ HOPBU[ZT>.)AT0FBT;ZB40"Z!D7B_B)1 2+5OB+1O:)1 :)5 C' M!0 QT4" #'108 ,=%" QT4* ")=0R+5OB+1O:)10Z)51#'11( ,=% M% B\?K .E*3+@& .@*3.E6_^L_BWX$A?]\&H/_('P%N ZRN+W]'C_[=$ M)N@K (/$ NL;OQ\ B]_1X_^W1";H& "#Q *#[P%U[;@! .L Z0!,N Z,!+ MZ[GK58M^!(7_= :!_SHF=06X #K0(MU HO>T>,YOT0F=!"X>!M0N 4.@% M(H/$!.LC@WT$ '0%N ZQA6Z*H[@\0"B][1X\>'1"8 %?H[/J#Q +IH4NX M #H84OKH^M&B[X$ (M>!M'CBX=$)HE&^H7 = >+=1"%]G4%N ZR-6Z&40 M@\0"B_"%]G01BT0,.T;Z=06X 0#K"8LTZ^NX #K .E12[@" .@12^NRZR>+ MO@0 5^A4$(/$ O]V!K@" %#_=1#H(1"#Q )0Z%@9@\0&ZP#I($NX #HX$KK MT>M)B[X$ (-M @%\#(L=B@>8)?\ _P7K,,=% @ @WT0 '07N "4+@ %"X M !05^C=!X/$"(7 ?P6X___K"5?HO?^#Q +K .G-2K@ .B-2NNOZ:0 B[X$ M (-M! %\#(L=BT8&B ?_!>F+ ,=%! BW40A?9U!;C__^MZ]T4& 0!T/H,] M '06@VT" 7P0@4P$ ""+'8M&!H@'_P7K6+@ E"X !0N 4%?H80>#Q B% MP'X,_W8&5^B6_X/$!.LUN "4+@@ %"X @!05^@^!X/$"(7 ?P6X___K&8%- M!@( BUT0@4\$ "#_=@97Z&'_@\0$ZP#I'DJX #HWDGI4__K+8N^! "#?0( M?Q97Z.W^@\0"/?__=06X___K#_]% O\-BQV*!Y@E_P#K .GF2;@ .BF2>O+ MZV^+O@0 BT40B4;ZA<!T.8M>^HMW"H7V="^+!3M$!G8H]T4& @!T$HL%*T0& MB40*QT4$ "!90;]__]% O\-BQV*!Y@E_P#K);@ %"X )0N , 4%?H?0:# MQ B%P'\%N/__ZPE7Z)?_@\0"ZP#I;4FX @#H+4GKB>LVBWX$BT4&J0( =!F+ M=1"+7 J+!3M'!G8,_T4$_PV!3 0 (.L/NO__N/__4E!7Z X @\0&Z2U)N MZ.U(Z\+K'_]V"/]V!O]V!.@; (/$!HOXA<!T!U?H-@*#Q +I!$FX #HQ$CK MV>D1 8U&\E"-1OA0_W8(_W8&BWX$5^C1#X/$"HOPA<!U!K@ .GJ (M=$(%G M!/]_@WX( 'P,BU;TBT;RB44(B54*BT;XB4;ZBU[ZBP>)1OJ%P'02BT;ZB440 MQT4, #'10X .M7BT0"B4;VA<!T0HM&]HE%$(M>]H-_"@!T$(M>]HM?"HM' M"HO N@ ZPF+7O:+5Q"+1PZ)10R)50Z+50J+10@K10P;50Z)10B)50KK"[@ M %!7Z$_Z@\0$@WP" '0<BUP"BT;ZB0>%P'0)BU[ZBT0"B4<"QT0" #K#H-^ M^@!T"(M>^L=' @ BT;XB4;ZB]C'!P BUT0@4\$ ("!9 3_OXM>^H%G!/^_ MB\;K .GH1[@* .BH1^GF_NM2BWX$C4;T4(U&^%#_=@C_=@97Z+4.@\0*B_"% MP'4%N ZRS_=OA6Z'\-@\0$B4;ZN $ 4(M6"(M&!O?:]]B#V@!24%?H@P&# MQ B+1OKK .F+1[@( .A+1^NFZ8< BWX$A?]T!XMV!H7V=06X #K<8-\ @!T M!;@ .MFN 8 4%?H4@2#Q 2)1OJ%P'4%N ZT]6Z,4 @\0"B4;VB5;XBT;Z MB40"BU[Z@S\ =!6#/ !T!(LTZ_>+7OJ+!XD$BQR)=P*+7OJ+1@:)!XM5#HM% M# -&]A-6^(E%#(E5#K@! .L Z?E&N 8 Z+E&Z7#_ZQ*X !0_W8$Z+ ,@\0$ MZP#IW$:X #HG$;KYNL9BWX$A?]T#U?HIA"#Q *+^(7 = +K\>FY1K@ .AY M1NO?ZR6+?@2%_W06BS6%]G0$B_[K]HMV!HDUA?9T XE\ HM&!.L Z8I&N MZ$I&Z]/K98M^!(7_=0BZ "X #K4\=&^ QT;Z "%_W0]BW4*A?9T((M$ M"KH (E&](E6]HM6^HM&^ -&]!-6]HE&^(E6^NL2BU;ZBT;X T4.$U40B4;X MB5;ZBSWKOXM6^HM&^.L Z1M&N @ Z-M%ZY/IR0&+?@2+11")1OJ%P'4&N/__ MZ;,!@ST = /ID@"+1@KK:X-^" !U$(-^!@!U"E?HH@&#Q +ID &+5@B+1@8K M10@;50J)10R)50[K4HM5#HM%# -&!A-6"(E%#(E5#NL^5^@E H/$ @-&!A-6 M"(E&](E6]HM5#HM%# -&]!-6]HE%#(E5#NL7N/__Z3L!/0 =) ] 0!TM3T" M '3$Z^FX !05^C^!X/$!+@ .D9 8M>^HMW"H7V=1&XCQM0N/__4.B'&X/$ M!.G^ (L%*T0&B4;X]T4& @!T"XM&^(E$"H%E!OW_QT4$ "+1@KK68M&^+H M (E&](E6]HM5"HM%" -&]!-6]HE&\(E6\HM6"(M&!BM&\!M6\HE&!HE6".LX M5^AE 8/$ HE&](E6]HM6"(M&!@-&]!-6]HE&!HE6".L7N/__Z8$ /0 =*(] M 0!TS3T" '3*Z^F+1OBZ #WVO?8@]H .U8(?R=\!3M&!G<@BT4"F3E6"'\7 M? 4Y1@9W$(M&!@$%BT8&*44"N ZS?'10( ,<% "+1OBZ ")1O2)5O:+ M5@B+1@8#1O035O:)10R)50ZX !05^CD!H/$!+@ .L Z4=$N P Z =$Z2[^ MZSN+?@2%_W4"ZR]7Z$0)@\0"BW40@60$_W]6Z!()@\0"B_")=1#'10@ ,=% M"@ QT4, #'10X .D!1+@ .C!0^N]ZV:+?@2+11")1OJ%P'4(NO__N/__ MZTZ#/0!U#HM5"HM%" -%#!-5#NL[BU[ZBW<*A?9U$[B7&U"X !0Z/,9@\0$ MB\"9ZQZ+!2M$!HO N@ B4;VB5;XBU4*BT4( T;V$U;XZP#ID4.X!@#H44/K MDNMWBWX$BT40B4;ZA<!U"+H +@ .M?@ST =$F+7OJ+=PJ%]G0_]T4& @!T M#8M>^O\WZ-+\@\0"ZSS_=OKHQ_R#Q *)1O:)5OB+!2M$!HO F8E&\HE6](M6 M^(M&]BM&\AM6].L1_W;ZZ)S\@\0"*T4,&U4.ZP#I$$.X"@#HT$+K@>D:!8M^ M!(MU$(7V=0:X #I!P6#/0!U ^GX (M$"HE&^H7 =0:X #I[P2+7OJ+!2M' M!HE&\HM&!NG+ (-] @!^!K@! .G2!%?HT0>#Q )7Z-,$@\0"B_"%P'4&N/__ MZ;@$Z:X @W[R '0@]T4& @!T#HM>^HM&\HE'"H%E!OW_QT4$ "X 0#ICP17 MZ(X'@\0"ZW^#?0( ?PR+7OJ+1P@K1O*)102#?00 ?@:X 0#I: 17Z&<'@\0" MZUB#?0( ?Q%7Z%@'@\0"5^A:!(/$ NE(!%?H1P>#Q *#?O( =06+QNDV!.LM M@WT" '\,5^@M!X/$ HO&Z2($5^@A!X/$ NL2N Z1,$/08 =_71X)/_IUP; M_W8&5^B !(/$!(OPBT0*B4;ZBT8&Z=X#@WT. '4,@WT, '4&N/__Z=T#@W[Z M '0#Z>8!ZQ^#?OH = /IVP&+50Z+10P[5!!U"SM$#G4&N/__Z;,#QT;V( "+ M1@@#1O:+P+H #E5#GP]?P4Y10QV-HM&"+H (E&[HE6\(M5#HM%#"M&[AM6 M\%)05N@^"8/$!E?H?@.#Q *+\(M&"+H (E%#(E5#HM&"KH (E&[HE6\(M& M]IF)1NJ)5NR+50Z+10P#1NX35O #1NH35NPY5!!\*'\%.40.=B&+1@JZ ") M1NZ)5O"+50Z+10P#1NX35O!24%;HU B#Q :+1 Z)1OB+5!2+1!(E 0"!X@ MB4;TA<!T!HM&] %&^(-^^@!U1?]V^+@@ %#HZ@N#Q 2)1OJ+7OJ+1P@[1OAS M*,=&]@ QT8( "+7OJ+1PA(B48*@WX& W4+BT8*B48(QT8* #I]?[K-(M> M^HM'"#M&^',IN)\;4+@ %#HLA:#Q 2+1@JZ "Y @#W\8E&"H7 = /IQ?ZX M #I;0*#?O0 =!O_=O3_=OKHT0F#Q 2)1OJ+7OK_=P+HA>R#Q *+1OJ)1 J+ M1 Z+7OJ)1PJ#? P =1&XL1M0N 4.A3%H/$!.DF O]T%/]T$K@! %"+7OK_ M=PJ+7OK_=P:+7 S_=P+HHA2#Q R%P'425KBY&U"X !0Z!L6@\0&Z>X!5^A# M!8/$ L=%! Z=H!@W[Z '5 @WP0 '4$@WP. '0Q_W4._W4,5NB(!X/$!E?H MR &#Q *+\(-\$ !U!(-\#@!T#[H +@ %)05NAD!X/$!ND# 8M>^HM'"HE& M\HM&\KH #E5#G0#Z;L .44,= /ILP"+7OJ+1P@[1O)V ^GP (M>^H,_ '1O MBU[ZBQ^+1P2I ,!U8O=$! @=%N+7OJ+1P@[1@IS4(M>^HM&"BM'"(E&"/=& M" $ = /_1@B+7OJ+'XM'"#M&"'<,_W;ZZ!'M@\0"Z9H BU[ZBQ^+1@@I1PB+ M7OJ+'XM&" %'!HM>^HM&" %'".MY@SP ="F+'(M'"HE&^H7 =!V+7OJ#?PH M=12+7OJ#?P@ = M7Z-H @\0"B_#K2_]U#O]U#%;H@@:#Q :#? H =!Y7Z+P M@\0"B_"#? H = ^Z "X !24%;H7@:#Q ;_=@K_=@CHFPF#Q 2)1OJ)1 J+ M7OK'1PH %?HT0.#Q *X 0#K<(-]#@!U"H-]# !U!(O&ZV#_=0[_=0Q6Z!L& M@\0&5^A; (/$ NM*@W[Z '0-BU[ZBT<*B\"Z #K!HM4$(M$#CE5#G4%.44, M= W_=0[_=0Q6Z.(%@\0&B\;K%K@ .L1/08 =_;1X)/_IVH;N $ ZP#IZSVX M$@#HJSWIW?KK:HM^!(MU$(L$B4;ZA<!U!;@ .M3@WP* '0-BUP*BT<*B\"Z M #K!HM4$(M$#HE&]HE6^(M5"HM%" -&]A-6^(E%"(E5"L=%# QT4. "! M9 3_?XM>^H%/! " BT;ZB440BT;ZZP#I=CVX!@#H-CWKCNE4 HM&!(E&^HO8 MBW\0A?]U'XM>^L='" QT<* "+7OK'1PP ,='#@ B\?I(P*!903_?XM& M!B4! (O F8E&\HE6](M>^HM7#HM'##M6]'T#Z1D!?P@[1O)S ^D/ 8MU"H7V M= Z+1 JZ ")1O:)5OCK#(M5$(M%#HE&]HE6^(M>^HM7#HM'##M6^'X#Z94 M? @[1O9V ^F+ (M>^HM7#HM'##M6^'P.?P4[1O9R!_=&!@$ =&_W1@8" '1F MBU[Z@W\. '5=@W\, '57@WT" '11BWT"BW4*A?9T"(M$"KH .L&BU40BT4. MB4;RB5;TBU[ZBU;TBT;RB4<,B5<.BU[ZBU<.BT<,B4;RB5;TBU[ZBU<*BT<( M*T;R&U;TB4<(B5<*ZT6#/0!U$8M>^HM6^(M&]HE'#(E7#NLOBSV+7OJ+5PZ+ M1PPK1O8;5OB)1PR)5PZ+7OJ+5PJ+1P@#1O835OB)1PB)5PKI]/[IU@"#?0( M=1V+7OK'1PP ,='#@ BU[ZQT<( #'1PH .FS (M] HMU"H7V= Z+1 JZ M ")1O:)5OCK#(M5$(M%#HE&]HE6^(M>^HM7"HM'""M&]AM6^(E'"(E7"HM> M^HM7#HM'# -&]A-6^(E'#(E7#H/Z 'Q=BU[Z@W\. '\/? :#?PP =0?W1@8! M '5%]T8& @!U/(M>^HM7#HM'##M6^'4N.T;V=2F#/0!T)(L]BU[ZQT<, #' M1PX (M>^HM7"HM'" -&]A-6^(E'"(E7"NL#Z2K_BU[ZB7\0@4T$ ("+Q^L MZ1<[N H Z-<ZZ:/]ZQF+?@2%_W0+BW4"A?9T!(O^Z_6+Q^L Z?,ZN Z+,Z MZ]_K3(M^!(M%$(E&^H7 = J+7OJ+=PJ%]G4"ZS#W108" '0-BP4K1 :)1 J! M90;]_XL%*T0&B\"9B44,B54.QP4 ,=%! QT4" #IG3JX @#H73KKK.M7 MBWX$BW40A?9T"HM$"HE&^H7 =0+K/H%,! " BU[ZBT<& T4,B06+7OJ+1PJ+ MP+H "M%#!M5#HE% H7 = ?'100 .L/BU[ZBT<(BU[Z*T<*B44$Z3PZN ( MZ/PYZZ'K7XM^!(7_=06X #K4,=&^@ @4T$ $!7Z$T @\0"B_"+1OJ)1 *% MP'0/BU[ZB3>+7OJ!9P3_/^L#B7;XB7;Z@64$_[\[?@9T!HL]A?]UP\<$ "! M9 3_/XM&^.L Z=,YN 0 Z),YZYGIK "+?@2%_W4&N Z9P Z#X$B_"X%@!0 M5E?H.=&#Q ;'! QT0" "#? P =!*)=0:)? B#? 8 = :+7 :)=PB+1 J) M1OJ%P'1<BU[Z_W<*BU[Z_W<*Z%3C@\0$B4;XA<!T+(M>^O]W"HM>^/]W!HM> M^O]W!NC=T(/$!HM>^HM'"HM>^(E'"HM&^(E$"NL7]T0$ "!T"[@! %!6Z%L' M@\0$QT0* "+QNL Z1PYN 0 Z-PXZ4O_Z=X BWX$A?]U!K@ .G. ,=&^ M@WX( '4,@WX& '4&N Z;< @WX( 'T#_T;X@W[X '0%N 8 ZP.X!0!05^C( M]8/$!(OPA<!U!K@ .F, (%,! ! BUX,BU4*BT4(B0>)5P*+50Z+10P#1@83 M5@B)10R)50Z#?O@ = 6X!0#K [@& %!7Z('U@\0$B4;ZA<!U%8%D!/^_N,<; M4+@ %#HJ Z#Q 3K-8M>^H%/! ! @W[X '0;BP0[1OIU"H%D!/^_BW;ZZPJ+ M7@J)-XM&^NL,BUX*BT;ZB0>+QNL Z3(XN 0 Z/(WZ1G_Z:(!BWX$A?]U!K@ M .F2 8%-! " ]T4$ "!T!U?H/P*#Q +HB0*+\+@6 %!65^B$SX/$!H-^" !U M.8-^!@!U,X-\# !T*(M$"(E&^H7 = B+7OJ)=P;K!HM<#(EW!(M$!HE&^H7 M= :+7OJ)=PB)?OKK18-]"@!T*HM="HM'"HO N@ .58(? E_!3E&!G("ZR/_ M=@;_=0KH$P&#Q 2)1 KK4HM6"(M&!CM5$'Q'?P4[10YR0(EV^HM>^L='!@ MBU[ZQT<( "+7OK'1PH (M>^L='# BU[ZQT<. #'1Q (M>^L='$@ MQT<4 #IE0"#?0P =0/IC "+5!"+1 XK1@8;5@B)1 Z)5!"+5!2+1!(#1@83 M5@B)1!*)5!2+5@B+1@:)10Z)51"#?! ?$=_!H-\#@!T/XM%!HE&^H7 =!J+ M7OJ+5!2+1!([5Q1\#'\%.T<2=@6+?OKKW(E\"(M%!HE$!H7 = :+7 :)=PB) M=0:+?@3K#\=$!@ QT0( #'1 P (E\ H,] '0%BQV)=P*)-8%D!/\_B\?K M .F$-K@" .A$-NE5_NM0QT;Z #_=@:+?@17Z)WD@\0$B_"%P'43BT;Z_T;Z M4+@ E#HU0&#Q 3KVHM%"#M%"G('QT0* #K#XM%"BM%"(E$"HM%"(E%"HO& MZP#I*3:X @#HZ37KJ.M-BWX$BT4*B4;ZA<!T#O]V^NA4XH/$ L=%"@ BW4" MA?9T!(L%B02#/0!T!8L=B7<"@WT, '0'5^@; (/$ HLU5^BL (/$ HO&ZP#I MTC6X @#HDC7KJ^M&BWX$BT4,B4;ZA<!U NLTBW4(A?9T"(M%!HE$!NL)BU[Z MBT4&B4<$BW4&A?9T!HM%"(E$",=%# QT4. #'11 .F"-;@" .A"->NR MZT"^ "+/C8FA?]U)+@ "%"X%@!0Z''>@\0$B_B%P'40B\9&4+@ L%#HT "# MQ 3KU(L%HS8FQT4$TP"+Q^L Z3@UN Z/@TZ[CK%(M^!,=%! H38FB06) M/C8FZ1HUN Z-HTZ^3K*+\ /]V!.CKXX/$ HOPA<!U#XO'1U#_=@3H=@"# MQ 3KXHO&ZP#IZ#2X #HJ#3KT.M8O@ BT8&B4;Z_W8&_W;ZZ+#>@\0$B_B% MP'0$B\?K-HO&1E#_=OKH-P"#Q 3_=@;_=OKHC=Z#Q 2+^(7 = 2+Q^L3T7[Z MBT;Z.T8$?0:+1@2)1OKKM.F&-+@" .A&-.N@ZSJ#?@9D?@/HZ1V#?@8*?A/_ M=@2XV!M0N 4.B8"H/$!NL5_W8&N,R\4+@6 %"X A0Z/7E@\0(Z4(TN MZ (TZ[[I7@*+?@3W100 P'0&N Z4L"BT4*B4;ZBS6#?@8$?0+K8(MU H7V M= OW1 0 P'4$B_[K[HLUA?9T!_=$! # =#"+10J)1OJ%P'0@]T4$ "!T"[@! M %!7Z \"@\0$_W;ZZ![@@\0"QT4* "X #I[ &X !05^CP 8/$!+@ .G; M 8-^!@%] ^GU (-^^@!T!(7V=0:X #IP@&+1 J)1OB%P'4#Z=@ ]T0$ ,!T M ^G. (M>^(M'"HM>^@-'"HE&]CT G(#Z;< BU[ZBP<[1OAT+(M>^HM&]CM' M"'8A_W;V_W;ZZ%7@@\0$B4;Z@W[Z '4&N Z60!BT;ZB44*BU[X_W<*BU[Z MBT<&BU[Z T<*4(M>^/]W!NBJRH/$!HM>^HM&]HE'"HM>^HL'.T;X=3''1 H M /]V^N@$X8/$ HM>^HM'"(M6]H/"(#O"=A/_=O;_=OKH%.&#Q 10Z"+?@\0" M@4T$ "!6Z*W\@\0"B_"%P'0#Z23_N Z> Z1O_@WX& 'X#Z<\ @W[Z '0W MBU[Z@W\* '4,QT4. #'11 .LB]T4$ "!U&8M>^H-_"D!V$/]V^NC'WH/$ M L=%"@ ZRCK)H-]$ !U((-]#@!U&H-] @!T%%?H//R#Q *+_H7V=06X #K M<XLU]T4$ "!U8(7V=%SW1 0 X'55@WT, '1/BT4,.T0,=4>+512+11(#10X3 M51 [5!1U-CM$$G4QBU40BT4. T0.$U00B44.B5405NC@^X/$ HM%"HE&^H7 M= [_=OKH-MZ#Q +'10H +@ .L%N ZP#IV3&X!@#HF3'IF?WINP.+?@2% M_W4#Z:X#H3PFB4;V@WX& '4DN 4%?HI@.#Q )24.@(!(/$!HL6AB:AA":) MAMC]B9;:_>MO@WX& 757BW4*A?9T((M$!BL&-"8E 0")1OK_=OJ+1 JZ !2 M4.C, X/$!NL?BU44BT42)0$ @>( (E&^O]V^O]U$/]U#NBK X/$!HL6AB:A MA":)AMC]B9;:_>L2BT8(B4;VQX;8_0 QX;:_0 A?]U ^D# X-^!@!U"O=% M! # = /I\P*+=0J%]G1RBT0*B4;ZA<!T)?]V^O]T!O]V]NBV+X/$!CM&^G01 MN/X;4/\VP"7H%@>#Q 3IP@*+1OJ9B8;0_8F6TOV+EMK]BX;8_0.&T/T3EM+] MB8;8_8F6VOV#?@8 =0S'10H %;H[-R#Q *+1OJ9B4;NB5;PZ<\!BU40BT4. MB4;NB5;PA=)U H7 =0/IN &#?0P =1)7N X<4/\VP"7HI :#Q ;I4 *+70R+ M1P*)1O@[1O9U!;@! .L#N B8;<_<=&] $ BU44BT42B8;4_8F6UOV+EM;] MBX;4_24! ('B ")1O*Z "X )24/^VUOW_MM3]Z)TPB8;2_;@ BN&TOV) M1OJ#?O ?0/I*P%_"8-^[@!U ^D@ 8M&^IDY5O!_#7P%.4;N<P:+1NZ)1OK_ MMM;]_[;4_?]V]/]V^HV&WOT#1O)0_W;XZ&P$@\0,A<!U$E>X'AQ0_S; )>CE M!8/$!NF1 8N&W/V)1O2%P'1/N 4/^VVOW_MMC]_W;VZ'TB@\0(@_H ?1&X M,1Q0_S; )>BO!8/$!.E; 8M&^IF)AM#]B9;2_8N6UOV+AM3] X;0_1.6TOV) MAM3]B9;6_?]V^HV&WOT#1O)0_W;VZ $N@\0&.T;Z=!&X0!Q0_S; )>AA!8/$ M!.D- 8M&^IF)AM#]B9;2_8N6VOV+AMC] X;0_1.6TOV)AMC]B9;:_8M&^IF) MAM#]B9;2_8M6\(M&[BN&T/T;EM+]B4;NB5;PQT;Z +'1O( .G,_HM5$(M% M#HE&[HE6\(-^!@)U ^F= #M^!'0@BUX$BU<0BT<. T;N$U;PB4<.B5<05^A] M^(/$ HOXZWJ#?0P = T[/H@F= =7Z+WX@\0"BU;PBT;NB44.B540QT4,.B:+ M%H8FH80FB442B544@64$_]\[/H@F=0+K,J&()HE%"(7 =!*+'H@FBT<&B44& MBUT(B7\&ZPJA/B:)10:)/CXF@WT& '0&BUT&B7\(@WX& 74"ZP6+/>GV_+@ M .L Z1(NN"P"Z-(MZ3S\ZV#'1O@ ,=&^@ BWX$A?]T1/=%! # =3V+=0J% M]G0@BT0*N@ B4;TB5;VBU;ZBT;X T;T$U;VB4;XB5;ZZQ*+5OJ+1O@#10X3 M51")1OB)5OJ+/>NXBU;ZBT;XZP#IIRVX" #H9RWKF.D6 8,^/"8 ?W^^4!RX M@ %05NC ((/$ E#H$1R#Q 2+^(7 ?1&X8!Q0N 4.BH X/$!.G@ %?H5QV# MQ *X @!05NC\((/$!(OXA<!]$;AR'%"X !0Z'\#@\0$Z;< 5NBZ*X/$ HD^ M/";'!CXF "+W]'CQX=$)CHFQP:$)@ QP:&)@ Z8T BT8(F8E&^(E6^KB$ M)E"+5@:+1@0#1O@35OI24+@Z)E#H=@"#Q BCB":+1@B9B4;XB5;ZBQ:&)J&$ M)@-&^!-6^J.$)HD6AB:X !0_S:&)O\VA";_-CPFZ+ ?@\0(@_H ?2O_-L E MZ#![@\0"4/\VP"7_-H8F_S:$)O\V/":X@QQ0N 4.C' H/$#NL Z88LN 0 MZ$8LZ>'^Z1X!QT;V #'1O@ +X (M>!(M_!(7_='J+5OB+1O8[511_(WP% M.T42<QR+512+11(K1O8;5O@Y5@A_"7P%.48&=P+K3NL:BU44BT42 T4.$U40 M.5;X? E_!3E&]G("ZRN+512+11(#10X351")1O:)5OB+5OB+1O8% 0"#T@ E M_O^!XO__B4;VB5;XB_>+?0;K@HM>"HM6^(M&]HD'B5<"B7[ZBUX$BW\$A?]T M:XM6^(M&]CM5%'\C? 4[11)S'(M5%(M%$BM&]AM6^#E6"'\)? 4Y1@9W NLZ MZQJ+512+11(#10X351 Y5OA\"7\%.4;V<@+K'O]V"/]V!E>XIAQ0N 4.BM M 8/$"HMV^HM\!ND!_XM]!NN1B\;K .E<*[@& .@<*^G9_ND& 8N^! #'!L E M "#?@H ="FX !0_W8._W8,5^@F'H/$"(E&]HE6^('Z__]U##W__W4'QT;T MT1SK*?]V"/]V!E?H.2"#Q :+\#M&"'00B\:9B4;VB5;XQT;TV!SK!8O&Z:$ MH< EB4;Z.SX\)G41QT;RWQS'1NX ,=&\ ZT7'1O+F'%?HK-V#Q *)1NZ) M5O"+W]'C@[]$)@!T*(O?T>.+GT0FBU;PBT;N.U<(=04[1P9T$%?H5P"#Q *% MP'0%BT8(ZS__=O#_=N[_=OC_=O;_=@C_=@;_=O)7_W8._W8,_W;ZZ.UX@\0" M4/]V^O]V]+CG'%"X !0Z(X @\0>N ZP#I2BJX#@#H"BKI\?[K2XN^! "+ MW]'C_[=$)K@:QU"X%@!0N (4.C1VX/$"*'()3T! '0'@S[()0!U!;@ .L6 M5[@/'5"X !0N ( 4/\6R"6#Q CK .GT*;@ .BT*>NMZQN+O@0 B[8& #EU M#'4+@WT* '0%@4T$ "#ISRFX #HCRGKW>M>C4;ZB4;Z@T;Z"J'()3T! '4# MZ"83@S[()0!T.O]V(/]V'O]V'/]V&O]V&/]V%O]V%/]V$O]V$/]V#O]V#/]V M"O]V"/]V!HM>^O\WN $ 4/\6R"6#Q""+1@3K .EG*;@" .@G*>N: .DQ ?]V M!NC])H/$ HE&](M&!*.*)K@H'5#H2AB#Q *)1OB%P'0]BU[X@#\O=#.X,!U0 MZ#$8@\0"B4;VA<!T(O]V]O]V!NA6)H/$!(7 =1+_=OC_=@3H@B:#Q 2X 0#I MT #K!<=&^#4=N$(=4/]V^.AX%H/$!(E&^H7 =0:X___IKP#_=OJX 10_W8$ MZ#,5@\0&A<!U ^F* (M&!(E&]HM>]H _?'0%_T;VZ_/_1O:+7O: /R!T&(M> M]H _"700BU[V@#\-= B+7O: /PIU!?]&]NO;_W;T_W;V_W8&Z(HF@\0&A<!U M.?]V!.@9)H/$ BT" -&!(E&]HO8@#]<=1+_=OJX 10_W;VZ+44@\0&Z]7_ M=OKH8!6#Q *X 0#K$>E?__]V^NA/%8/$ K@ .L Z2HHN @ Z.HGZ<;^Z?T MH8HFB4;ZA<!T!H-^! !U!KC__^GD /]&^HM>^H _.G0"Z_/_1OJ+7OJ /P!U M ^G$ (M>^H _('08BU[Z@#\)=!"+7OJ /PUT"(M>^H _"G4%_T;ZZ]NX @!0 M_W8$_W;ZZ,<E@\0&A<!U<(M>^H _ '05BU[Z@#\Z= V+7OJ /R-T!?]&^NOC MBU[Z@#\C= 6X___K9L=&^ _T;ZBU[Z@#\ =#&+7OJ /S!\*8M>^H _.7\A MBT;XN@H ]^J+7OJ*%[D( -/BT_H#PBTP (E&^/]&^NO'BT;XZR"+7OJ /P!T M#8M>^H _.G0%_T;ZZ^O_1OKI,?^X___K .DA)[@$ .CA)NGZ_NF- *&*)HE& M^H7 = :#?@0 =06X___K=?]&^HM>^H _.G0"Z_/_1OJ+7OJ /P!T6(M>^H _ M('08BU[Z@#\)=!"+7OJ /PUT"(M>^H _"G4%_T;ZZ]NX @!0_W8$_W;ZZ,(D M@\0&A<!U!;@! .L?BU[Z@#\ = V+7OJ /SIT!?]&^NOK_T;ZZZ"X #K .F( M)K@" .A()NEJ_^DQ J&*)HE&^H7 = :#?@0 =0:X #I& +_1OJ+7OJ /SIT M NOS_T;ZBU[Z@#\ =0/I^ &+7OJ /R!T&(M>^H _"700BU[Z@#\-= B+7OJ M/PIU!?]&^NO;N ( 4/]V!/]V^N@E)(/$!H7 = /IH0&+7OJ /P!T%8M>^H _ M.G0-BU[Z@#\]= 7_1OKKXXM>^H _/70&N Z98!BUX&BP>)1OC_1OJ+7OJ M/P!U ^E. 8M>^H _.G4#Z4,!BU[ZB@>8Z1T!_T;ZBU[ZB@>8+4$ BUX&BQ^( M!^D9 ?]&^HM>^HH'F.F8 (M>!HL?Q@<;Z=\ BUX&BQ_&!PKIU "+7@:+'\8' M#>G) (M>!HL?Q@<)Z;X BUX&BQ_&!PCILP"+7@:+'\8'#.FH ,=&]@ BU[Z M@#\ ="N+7OJ /S!\(XM>^H _.7\;BU[ZB@>8BU;VN0, T^(#PBTP (E&]O]& M^NO-BUX&BQ^+1O:(!_].^NMABU[ZB@>8BUX&BQ^(!^M2/5P =.Q_'#TP '2> M/3$ =)D],@!TE#TS '2//44 =0/I1?\]9@!U ^ET_W\-/5X =+\]8@!U ^E: M_SUN '4#Z3'_/7( =0/I-/\]= !U ^DW_^LABU[ZB@>8BUX&BQ^(!^L2/5P M=0/I\?X]7@!U ^G3_NO?BUX&_P?_1OKII_Z+7@:+'\8' (M>!O\'BT;XZR"+ M7OJ /P!T#8M>^H _.G0%_T;ZZ^O_1OKI_?VX #K .E+)+@& .@+).G&_>GQ M (U&!HE&^L=&^ OQ =BUX$@#\ =0/IS0"+7@2*!YCIM #_1@2+7@2*!YCI M@@"#?OH =0:X1!WIM #_1@2+7@2*!YB+7OH#!XO?1X@'C48&.4;Z=06-1@CK M [@ (E&^NMEB]]'Q@<EZUW'!HPF 0#K58-^^ !U!8M&".L#BT8&B4;VH8PF M 4;V_T;XBT;VF;D* /?Y!3 B]]'B >+1O:9N0H ]_F#PC"+WT>(%^L7/24 M=*T]*P!U ^EQ_SUD '2P/6D =*/K%XM>!(H'F(O?1X@'ZPH])0!U ^E$_^OI M_T8$Z2C_Q@4 N! =ZP#I3B.X!@#H#B/I!O_K*8N^! "%_W4%N $ ZQF /0!T M#XO?1XH'F%#_5@B#Q +K[+@! .L Z1HCN Z-HBZ\_K18-^! !]!>C! .LW M@SYR)01U!>CU<NLK@S[&)0!T",<&QB4 .L&QP;&)4/.@S[&)0!T!;C 'NL# MN-$>4.C*HX/$ NG+(K@ .B+(NNSZW.X !0Z%6[@\0"B_B%P'0%ON,>ZS.X M !0_S;$).A*QH/$!(OXA<!T!;[K'NL:N 4.C?P(/$ HOXA<!T!;[Q'NL% MN ZRB#?@0 =![H"$B)1OI75KCY'E#H4@^#Q ;H6'*#?OH ?@/HS4>+Q^L MZ4XBN ( Z XBZX7IXP&X#!]0Z"H/@\0"C4:8B_A0Z/ER@\0"B]]'B@>84.A$ MBH/$ NE6 ;A*'5"X 0!0Z-F=@\0$Z:8!Z,N;Z)Y'Z9T!Z9T!N $ 4/\VQ"3H MNL6#Q 3IB0&-1IE0Z&P1@\0"B_"#_@AU!>@1TNL+5K@ E#H4^V#Q 3I90&* M!9A0Z.6)@\0"ZS7H0;_I4P&X 0!0Z"*^@\0"Z48!N 4+@! %#H*<"#Q 3I M-0&X 0!0N $ 4.@8P(/$!.DD 3T '3&/48 =,<]3 !TSSU0 '3;Z0,!B@68 M4.B-B8/$ NL3Z+2YZ?L N $ 4.@KNH/$ NGN #T '3H/48 =.GIUP"X !0 MZ'W^@\0"B_B%P'0-5[@/'U#H'0Z#Q 3K"K@='U#H$0Z#Q +IMP#_-M8DZ 4$ M@\0"Z:H C4:94.B-$(/$ HOPA?9T!(O&ZP.X9 !0N 4.B: (/$!.F% (U& MF5#H:!"#Q *+\(7V= 2+QNL#N&0 4+@! %#H=0"#Q 3K83U- '4#Z4S_?R@] M(0!U ^FI_CT_ '4#Z9#^/4( =0/II?X]0P!U ^FN_CU$ '4#Z<K^/5$ =0/I MBOX]5@!U ^D^_SU7 '4#Z6#_/5@ =0/I9?\]6@!TA;@C'U#H5PV#Q +I(/[I M8""X9 #H("#I%/[I.@._ "#_PA]#;@ %#HS8:#Q )'Z^ZX;1]0Z+0U@\0" MB4:&_W:&Z&4V@\0"O] 'Z!YCN'H?4.AG@X/$ HO'F;D* /?YB]K1X_^WHA[H M48.#Q *X"@!0Z#1A@\0"@^\!==&#?@0 = _H]V-24+B 'U#HT R#Q ;'1O8 M ,=&^ N $ 4.@V"8/$ N@NMX7 =!Z-1I!0Z(9P@\0"B]B /P!T#;B.'U#H MF@R#Q +I< *#1O8!@U;X /]V^/]V]KB<'U#H?PR#Q :+1@:94E#_=OC_=O;H M"2"#^@!U-ST '4RZ- 3B_B%_WT&B\?WV.L"B\>9N04 ]_F+^E>XIA]0Z$(, M@\0$5[@ E#HR^J#Q 3IMP'HGA.+^)FY 3W^8OR]\< ('0&B\;WV(OP5NC; M88/$ N@;8NA\8HE&C(E6CNAR$XOXF;E /?YB_+WQP 0= :+QO?8B_!6Z*]A M@\0"Z&QBB4:(B5:*@WX$ '015O]VCO]VC+BT'U#HR N#Q C_=HK_=HC_=H[_ M=HSHNX2#Q BX !0Z/O[@\0"B4;TA<!T$/]V]+C#'U#HF N#Q 3I;@'H_Q*+ M^)FY CW^8OR]\< "'0&B\;WV(OP5N@\88/$ NA\8>AV8(-^! !T#^C485)0 MN-@?4.A:"X/$!NA3>+@ %#HG/N#Q *)1O2%P'00_W;TN.,?4.@Y"X/$!.D/ M <<&IB4# .B:$IFY! #W^8OZA?]\-X-^! !T"KCX'U#H$0N#Q +H;GBX !0 MZ%/[@\0"B4;TA<!T$/]V]+C^'U#H\ J#Q 3IQ@!/Z\7H5!*I!P!T6X-^! !T M"K@2(%#HT@J#Q *X%R!0Z"6!@\0"Z#(2F;D* /?YB]K1X_^WHA[H#H&#Q *X M"@!0Z/%>@\0"N 4.CL^H/$ HE&](7 = __=O2X'2!0Z(D*@\0$ZV"X,2!0 MZ'T*@\0"Z-E?Z'Q>B4;Z/?__=$6#?OH*=3WH:UZ)1OH]__]T,H-^^DQU(.A: M7CUI '48Z%)>/6X =1#H2EX]90!U".A"7CT@ '0,N#,@4.@N"H/$ NL%Z[#I M:_WH*U^!#LHD 0#_=OC_=O:X12!0Z X*@\0&Z1H=N'8 Z-H<Z;W\Z8(!B[X$ M /\VUB3_-L0D_S;.)/\VS"2X5R!0Z.$)@\0*5[A^(%#HU@F#Q 3_-;B*(%#H MR@F#Q 3_=0BXEB!0Z+T)@\0$_W4,N*(@4.BP"8/$!/]U$/]U#KBN(%#HH F# MQ ;_=13_=1*XOB!0Z) )@\0&_W48_W46N,L@4.B "8/$!O]U'/]U&KC8(%#H M< F#Q ;_=2#_=1ZXY2!0Z& )@\0&_W4$N/(@4.A3"8/$!/]U!KC^(%#H1@F# MQ 2X"B%0Z#P)@\0"BT4$B4;ZBT4$ T4&.4;Z? /IJ "+7OK1XXNWX"3_= B* M1 N84/]T!/]T O\TBD0*F%#HDP"#Q )0_W;ZN"LA4.CV"(/$$+B$ %#_= :- MAFO_4.A$&H/$!HV&:_\#1 B+V,8' (V&:_]0N$@A4.C)"(/$!(I$"IBI 0!T M.O]T#KA2(5#HLPB#Q 2XA !0_W0,C89K_U#H 1J#Q :-AFO_ T0.B]C&!P"- MAFO_4+A8(5#HA@B#Q 3_1OKI2O_IC!NXD@#H3!OI=?[K*+^V'O=&! $ = :+ MWT?&!TWW1@0" '0&B]]'Q@=%Q@4 N+8>ZP#I61NX #H&1OKT #K0H,^="4 M= 6A<B7K ^C,>8OXA?]] [\ +AO(5#H*)R#Q *+QYE24(U&Z%#HU62#Q :- M1NA0Z$.<@\0"B3X0$.D,&[@4 .C,&NNVZ9< Z+!>B4;XB5;ZBQ;.)*',)"M& M^!M6^HOX/80 ?@RX?B%0Z#Z<@\0"ZVN#/HXF '00_S:.)N@-EH/$ L<&HB4 M (7_?PO'!HXF "^D2'K*HU% 5#HO)6#Q *+\*..)HD^HB7HEUWHCUN+WD:( M!X/O 77SQ@0 BS:.)KB2(5#H>IN#Q )6Z*>;@\0"N*(A4.B=FX/$ NEJ&K@$ M .@J&NE@_^M5BSZB)87_= 4[?@1^!;@ .M Z*E=B4;VB5;XH8XFB4;ZZ#%; MBU[Z_T;ZBA>Y" #3XM/Z.]!T$?]V^/]V]NBQ7(/$!+@ .L*@^\!==2X 0#K M .D*&K@& .C*&>NCZ3X"BU8*BT8(*T8$&U8&B4;R@W[R 'T4BU8*BT8(B48$ MB58&BT;R]]B)1O+_=@;_=@3H7UR#Q 3H5'B+\(7V=1C_=O+H6O^#Q *%P'0+ MH:(E*4;RZ#AXB_#'1O0 +\ (E^^H-N\@%] ^F? >B(6HOX@___=0/ID@&# M_PIU:O]V\N@<_X/$ H7 =%VAHB4% 0#WV%#H'UR#Q *_( "X( !0Z.U:@\0" MH:(EF5)0Z"I;@\0$H:(E*4;RZ*1<.1;.)'PF?P8Y!LPD<AZAHB69B4;NB5;P MBQ;.)*',)"M&[AM6\*/,)(D6SB2#_PET!8/_"G40Z"Y:OR N" 4.B26H/$ M H/_('0#Z8, @W[Z('4AZ*I9Z$I<.1;.)'P2?P8Y!LPD=@J#+LPD 8,>SB0 MZ=< B7;T@W[Z+G0,@W[Z(70&@W[Z/W5'@V[R 7T#Z;P Z*59B_@]__]U ^FO M $:#_R!T*^B^6;\@ +@@ %#HREF#Q +HZULY%LXD?!)_!CD&S"1R"H,&S"0! M@Q;.) !&.S80$'YT@W[T '1NBT;T*\:+^%?H$5N#Q (I?O+_3O*X"@!0Z-Q9 M@\0"QT;T "^ "_( "#/J(E '0^Z)-;.1;.)'PF?P8Y!LPD<AZAHB69B4;N MB5;PBQ;.)*',) -&[A-6\*/,)(D6SB3_-HXFZ"UA@\0"Z(AVB_#I5?Z+%LXD MH<PDB4;VB5;XZ-Y9BU8&BT8$*P;,)!L6SB124.BX.(/$!/]V^/]V]NC668/$ M!.G!%[@. .B!%^FY_>M)@SYB(0!T!;@ .L#N $ HV(A@SZ0)@!U)[B %#H MKB:#Q *CD":+/F0A@#T =!&*!9A0_S:0)NCR)H/$!$?KZH$.RB0$ .EM%[@ M .@M%^NOZR3_-G(E_W8$Z%5Z@\0$_W8$_S:0)NB*)H/$!(7 = /H"P#I/Q>X M #H_Q;KU.F2 .CC6HE&](E6]NB&8NB$6HE&^(E6^K\ +\ (7_?%?HGW6+ M\#L&$!!_#87_= 6____K NM!ZP%'Z)Q74.AZ8H/$ H7 =0+K\.A'8NA%6HE& M^(E6^HM6^HM&^#M6]G\5? 4[1O1W#HM6]HM&](E&^(E6^NL"ZZ6%_W05N $ M4.B"6E)0_W;Z_W;XZ*;\@\0*Z:(6N P Z&(6Z67_ .L#Z9,6N Z%,6Z_4 M*\#H2Q:X8P!0Z.(%@\0"Z7@6*\#H.1;_=@3_=@:X(0!0N $ 4.B$%8/$".E< M%BO Z!T6_W8$_W8&N \ 4+@! %#H:!6#Q CI0!8KP.@!%BO 4%#_=@3_=@C_ M=@;_=@3HTA6#Q )0N! 4+@! %#H Q6#Q!#I$Q8 *\#HTQ6XDB90C48&4/]V M!.A+ (/$!NGY%;@" .BY%8U&!HE&^HM>^H-&^@*#/P!U](M>^O\WC48&4/]V M!.@> (/$!NG,%2O Z(T5N)(F4/]V!O]V!.@& (/$!NFT%;@6!.AT%<>&[OL M ,>&[/L (M&!HF&^ON+1@B)AOC[ZP3_AN[[BY[Z^X.&^OL"@S\ = ;K[/^& M[/N+GOC[@X;X^P*#/P!U[L>&Z/L" (N&[OL#ANS[!0, ]Z[H^XV6_/L#PHF& M]OL#AN[[ X;L^XU6_#O"<B3IZ "+GO+[B@>8BY[V^X@'_X;R^_^&]ON-1OPY MAO;[<DCIQP"-AOS[B8;T^XO8BX;N^XD'@X;T^P+'AO#[ #K0(V&_/N+EO;[ M*]")EN;[BY[T^XO"B0>#AO3[ HM>!HL'B8;R^X-&!@*+GO+[@#\ =9&+GO;[ MQ@< _X;V^_^&\/N+AO#[.X;N^WRVBY[T^\<' "#AO3[ L>&\/L .M@C8;\ M^XN6]OLKT(F6YON+GO3[B\*)!X.&]/L"BUX(BP>)AO+[@T8( HN>\ON /P!T M((H'F(N>]ON(!_^&\OO_AO;[C4;\.8;V^W+=N/G_Z4T4BY[V^\8' /^&]OO_ MAO#[BX;P^SN&[/M\EHN>]/O'!P @X;T^P*-AOS[BY;V^RO0 Y;H^TJ+PIF+ MCNC[]_GWZ8F&ZOLKP%"-AOS[4/]V!"O 4/^VZOO_=@3HFQ.#Q )0N#L 4"O M4.C-$H/$$.N.N 0 Z)X3QD;X ,9&^0#&1OH QD;[ "O 4(U&^%#_=@0KP%"X M! !0_W8$Z%L3@\0"4+@[ % KP%#HC1*#Q!#IG1, *\#H71.+=@2#;@8!=!W_ M=@CH& B#Q *+^#W__W0-B\>8B]Y&B >#_PIUW8/__W4*.W8$=04KP.EB$\8$ M (M&!.OU*\#H&Q,KP%!04%!04+@" % KP%#H+1*#Q!#I/1, *\#H_1*-1@A0 M_W8&_W8$Z+H*@\0&BUX$BT<$J4 = =3Z,(!@\0"Z1(3*\#HTQ*-1@90_W8$ M_S:&).B/"H/$!HL>AB2+1P2I0 !T!U/HE@&#Q +IYA(KP.BG$BO_ZP>X___I MUQ)'@_\4?1>+W]'CBT8$.X>$)'7MB]_1X\>'A"0 (/_%'W8_W8$Z%D!@\0" MBUX$_S?HE@*#Q *+7@2+1P2I( !T#X-_!@!T"?]W!NC/P8/$ H/_ GX)_W8$ MZ,'!@\0"*\#KFP"X!@#H-!+'1O8 "O_ZRB#_Q1\(NM0/7< =4N!3O8" +BD M 5#_=@3HV "#Q 2)1OB%P'PRZV='B]_1XX._A"0 =<V+7@:*!Y@]80!U'H%. M]@( N $ 4/]V!.BZ!8/$!(E&^(7 ?20KP.F3 #UR '6F@4[V 0 KP%#_=@3H MF 6#Q 2)1OB%P'T5Z]RX @!0*](KP%)0_W;XZ,X$@\0(N H 4.BTP(/$ HE& M^H7 =+B+V,=' @ B]B+1OB)!XM&]HE'!+@ !%#HC\"#Q *+7OJ)1P:#?P8 M=0>!3P0$ .L(BU[Z@4\$( "+7OJ+1P:)1PB+W]'CBT;ZB8>$)(M&^NES$0 K MP.@S$?]V!/]V!K@( %"X 0!0Z'X0@\0(Z581N ( Z!81BUX$BT<$J00 =0B+ M1P2I @!U!"O ZS"+7@2#?P( ?O/_=P+_=P;_-^CK#X/$!HE&^HM>!#M' G41 MQT<" "+1P:)1PB+1OKI!A&+7@2!3P00 +C__^OP +@$ .BX$(N^! "+-@ MB]Z#Q@*+!XE&^H7 =#R)?OB+7OB /P!T&?]&^(H'F(M>^O]&^HH7N0@ T^+3 M^CO"=-^+7OB /P!UQHM>^H _/76^B\,% 0#IH! KP.OY*\#H71 KP%!04%!0 M_W8$N $ 4"O 4.AM#X/$$.E]$ "X! #H/!"+O@0 *_;'1O@ .L!1XH%F*.D M(3T@ '3T/0D =.\]#0!TZCT* '3E/0P =." /2UU%$?'1O@! .L,B\:Z"@#W MZHOP W;ZB]]'B@>8+3 B4;Z/0H <N.#?O@ = >+QO?8Z1(0B\;K^2O Z,\/ M*\!04%!04/]V!+@& %"X 0!0Z-X.@\00Z>X/*\#HKP__=@:X"'10_W8$Z!X M@\0&Z=8/*\#HEP__=@:X"710_W8$Z 8 @\0&Z;X/N"( Z'X/BT8&HYPFBT8$ MHY@FBT8&+0AT/0H =@/I*@+1X)/_IZ8ABUX(BD<"F"KDF8E&]HE6^(I' Y@J MY)F)1O*)5O2+5OB+1O:Y" #1X-'2XOH+1O(+5O2CGB:)%J FBUX(BT<$F:.B M)HD6I":X-@!0N $ 4.BU#H/$!(E&^HM&^NDY#XM>"(H'F"KDF8E&[HE6\(I' M 9@JY)F)1NJ)5NR*1P*8*N29B4;FB5;HBD<#F"KDF8E&XHE6Y(I'!)@JY)F) M1MZ)5N"*1P68*N29B4;:B5;<BU;PBT;NN1@ T>#1TN+ZBW;LBU[JN1 T>/1 MUN+Z"\,+UHMVZ(M>YKD( -'CT=;B^@O#"]:+=N2+7N(KR>L&T>/1UN+Z"\,+ MUJ.>)HD6H":+5N"+1MZY" #1X-'2XOJ+=MR+7MHKR>L&T>/1UN+Z"\,+UND< M_[@V %"X 0!0Z-@-@\0$B4;ZBQ:@)J&>)KD( -'ZT=CB^BKD*]*+7@B(1P*+ M%J FH9XF*\GK!M'ZT=CB^BKD*]*+7@B(1P.AHB:)1P3IY?ZX-@!0N $ 4.B) M#8/$!(E&^HL6H":AGB:Y& #1^M'8XOHJY"O2BUX(B >+%J FH9XFN1 T?K1 MV.+Z*N0KTHM>"(A' 8L6H":AGB:Y" #1^M'8XOHJY"O2BUX(B$<"BQ:@)J&> M)BO)ZP;1^M'8XOHJY"O2BUX(B$<#BQ:D)J&B)KD( -'ZT=CB^BKD*]*+7@B( M1P2+%J0FH:(FN0@ T?K1V.+Z*N0KTHM>"(A'!>DU_L=&^O__QP; )18 Z2?^ MN ( Z"8-*\!04/]V!E!0_W8$N!P 4+@! %#H,PR#Q!")1OKI0 TKP.@!#2O M4/]V!O]V!%#_=@;HU0R#Q )0_W8$Z,L,@\0"4+@) %"X 0!0Z/P+@\00Z0P- MN ( Z,P,BT8$HY@FBU8(BT8&HYXFB1:@)HM&"J.:)K@3 %"X 0!0Z%(,@\0$ MB4;ZA<!T!)GIU R+%J FH9XFZ_0 N 8 Z(H,Z$4 B4;ZBT8$B4;VBU[V_T;V M@#\ =?7_3O;K&HM&^IFY"@#W^8/",(M>]H@7BT;ZF??YB4;Z_T[VBU[V@#]8 M=-N+1@3I?0P *\#H/0PKP%!04%!04+@4 % KP%#H3PN#Q!#I7PP *\#H'PS_ M=@3_=@:X!0!0N $ 4.AJ"X/$".E"#"O Z ,,@S[ )0!\!X,^P"4B?@FX#@!0 MN$TDZU7_=@3H70"#Q )0_W8$N ( 4.C8"H/$!K@" %"X7"10N ( 4.C&"H/$ M!HL>P"71X_^WO"'H+0"#Q )0BQ[ )='C_[>\(;@" %#HH0J#Q :X 0!0N%\D M4+@" %#HCPJ#Q ;IPPNX @#H@PO'1OH .L#_T;ZBUX$_T8$@#\ =?*+1OKI MH@LKP.AC"[K&0;AM3E)0_S9D)/\V8B3HM L%.3"#T@"!XO]_HV(DB19D)"7_ M?RO2Z7$+ +@" .@P"XM>!(M'!*D8 '0%N/__ZV"+7@2+1P2I 0!T\(-O @%_ M6XM'!*D$ '0*N $ 4(U&^E#K"K@ !%"+7@3_=P:+7@3_-^A1 (/$!HM>!(E' M H-_ @!_'X-_ @!U!X%/! @ ZZJ+7@2!3P00 .N@BT;Z*N3I]PJ+7@2+1P:) M1PB+7@2+1P2I! !UY/]'"(M'"$B+V(H'F.O9 +@" .B4"BO 4%#_=@90_W8( M_W8$N , 4+@! %#HGPF#Q!")1OKIK HKP.AM"HM>!(-_!@!T$8M'!*D@ '0) M_W<&Z-6Y@\0"BUX$@6<$F_^+1@:)1P:#?P8 =06!3P0$ (M>!(M'!HE'",=' M @ Z6,* +@" .@B"BO 4%#_=@104%"X$0!0*\!0Z#()@\00B4;ZA<!U"Z&F M)J.L)"O Z3,*N/__Z_BX!@#H[@F+1@2)1O:AK"2)1OBAK"0#1O:)1OJ#?O8 M?A [1OAS"[C__^L#BT;XZ?T)_W;ZZ)7_@\0"A<!T[>OFB]R+!XM? HDOB6<" MB4<$,\##,\#HG0F+7@2+1@8+P'4!0(L/.TX = B+;@ +[77T](M^_HMV_(MN M (MG HM/!(O<B0_# "O Z&D)Z: )*\#H80FX7N=0N X 4.A0 (/$!/]V!.@) M (/$ N@C .E^"2O Z#\)*\!04%!04/]V!+@; % KP%#H3PB#Q!#I7PD *\#H M'PDKP%!04%!04+@= % KP%#H,0B#Q!#I00D N 0 Z )BT8$2(O8T>.+AZPN MB4;XBT8$2(O8T>.+1@:)AZPNBT8$HY@F@WX& 70&@WX& '4%BT8&ZP.X).BC MHB:X, !0*\!0Z&4(@\0$B4;ZA<!] ^GH"(M&^.OX %!345)65U4>!HO<BY\2 M (O#2P/;BY^L+O\VEB90_]-8CP:6)@<?75]>6EE;6(\&KB3/N H Z' (QT;R M___'1O:" (M&!(E&^(M&!(E&^HU&"%#_=@:-1O)0Z!8 @\0&C4;R4"O 4.A_ M!(/$!(M&!.EP"+@@ .@P"(N^!@"+=@CIC $]1 !U ^D@ 3U/ '4#Z20!/5@ M=0/I)P$]8P!U ^DJ ?]V!+@E %#H/ 2#Q 3_=@2+WT>*!YA0Z"P$@\0$Z4P! M@#TY?@/I@@&*!9@M, #W;O2)1MR+1OBZ"@#WZ@-&W(E&^.E< 4> /3!] ^ED M 8 ].7X#Z5P!BT;VN@H ]^J*%;D( -/BT_J#ZC #PHE&]NO4@\8"BT3^F8E& M\(E6\L=&^@H C4;?4/]V^O]V\O]V\.A5 8/$"/]V!(U&WU#H2 6#Q )0BD;K MF%#_=O;_=OB-1M]0Z:\ @\8"BT3^F8E&\(E6\BO2Z[&#Q@*+1/Z9B4;PB5;R MA=)]""O2B4;PB5;RQT;Z" #KG(/& HM$_IF)1O")5O*%TGT(*]*)1O")5O+' M1OH0 .E[_X/&!(M4_HM$_.ED_X/&!(M4_HM$_.N[@\8$BU3^BT3\Z]"#Q@*+ M1/Z(1N__=@2*1N^84.@( X/$!.LH@\8"BT3^B4;L_W8$4.B5!(/$ E"*1NN8 M4/]V]O]V^/]V[.@S H/$#$> /0!T=( ])70#Z93^QT;X #'1O8 ,=&] $ MQD;K($> /2UU!L=&]/__1X ],'4%QD;K,$> /3!\ ^EV_H ]+G4#Z9/^B@68 M/60 =0/IM/Y_ ^D>_CUO '4#Z?W^/7, =0/I<?\]=0!U ^G<_CUX '4#Z07_ MZ1O^Z5@&N!0 Z!@&QT;L "#?@8 =1.#?@0 =0V+7@K&!S#&1P$ Z8P!@WX( M"G4<@WX& 'T6BU8&BT8$]]KWV(/: (E&!(E6!O]&["O_C4;P \>+V,8' $># M_PQ\\"O_@WX("G5.*]*X"@!24/]V!O]V!.AR!HE&ZHU&\ /'B]B+1NJ(!XU& M\ /'B]B*!YB9B4;HB5;J*]*X"@!24(M6!HM&!"M&Z!M6ZE)0Z/H%B48$B58& M@WX("'4MBU8&BT8$)0< *]*-5O #UXO:B >+5@:+1@2Y P#1^M'8XOJ!XO\? MB48$B58&@WX($'4MBU8&BT8$)0\ *]*-5O #UXO:B >+5@:+1@2Y! #1^M'8 MXOJ!XO\/B48$B58&1X-^!@!T ^D\_X-^! !T ^DS_\=&[@ C47_B_#K1(U& M\ /&B]B /P!U$H-^[@!U#(U&\ /&B]C&!R#K)8U&\ /&B]B /PI]#(U&\ /& MB]B !S#K"HU&\ /&B]B !S?_1NY.A?9]N(-^[ !T"XU&\ /'B]C&!RU'C47_ MB_#K$XU&\ /&B]B*!YB+7@J(!_]&"DZ%]GWIBUX*Q@< Z:4$N 0 Z&4$BT8, MB4;Z@WX( 'X.BT8,.T8(?@:+1@B)1OJ+1OJ)1OB#?@8 ?Q/K./].!O]V#HI& M"IA0Z&\ @\0$BT8&.T;Z?^?K'8M&^O].^H7 =!O_=@Z+7@3_1@2*!YA0Z$@ M@\0$BUX$@#\ ==N#?@8 ?2F ?@HP=2/_=@ZX+@!0Z"< @\0$_T8&ZQ'_1@;_ M=@Z*1@J84.@1 (/$!(M&^/?8.48&?.7I^P, N 0 Z+H#QT;X "+7@:+1P2I M& !T ^FF (M'!*D" '4#Z9L BT<$J00 =""X 0!0C48$4(M>!O\WZ(0"@\0& MB4;ZBUX&QT<" 0#K08M>!O]'"(M'"$B+V(I&!(@'BUX&_T<"BT<"/0 $?"6+ M1P2I@ !U'?]W O]W!O\WZ$("@\0&B4;ZBUX&BT<&B4<(_T;X@W[X '0W@W[Z M 'X+BUX&BT<".T;Z=!Z#?OH ?0J+7@:!3P00 .L(BUX&@4\$" "X___I-0.+ M7@;'1P( (I&!)@JY.OM +@" .CD BO 4/]V!O]V!%!0_W8$Z+<"@\0"4+@2 M %"X 0!0Z.@!@\00B4;ZZ?4" +@" .BT HN^! "+M@8 B7[ZZP%'@#T =?KK M"XO>1HH'F(O?1X@'@#P =?#&!0"+1OKIP (KP.B! HN^! "+M@8 B@68BA2Y M" #3XM/Z.\)T%8H%F(H4N0@ T^+3^BO"ZP(KP.F. H ] '3V1T;KT@"X @#H M1 *+O@0 B[8& (E^^NL+B]Y&B@>8B]]'B > / !U\,8% (M&^NE8 K@" .@8 M HM&!(E&^NL#_T8$BUX$@#\ =?6+PRM&^NDW @"X @#H]@&+O@0 B[8& (E^ M^H-^" !U!8O'Z1H"@#T = -'Z_B / !T$8O>1HH'F(O?1X@'@VX( 77JQ@4 MBT;ZZ]<KP.BU 8N^! "+M@8 B@68BA2Y" #3XM/Z.\)T%8H%F(H4N0@ T^+3 M^BO"ZP(KP.G" 8 ] '3V@VX( 73P1T;KS "X @#H<@&+O@0 B[8& (E^^H \ M '01B]Y&B@>8B]]'B >#;@@!=>K&!0"+1OKI@@$KP.A# ?]V!"O 4+@* %"X M 0!0Z(X @\0(Z68!N ( Z"8!*\!04%!04%"X!P!0*\!0Z#@ @\00B4;ZBUX$ MH9@FB0>+1OKI.@$KP.C[ "O 4%#_=@90_W8(_W8$N 0 4+@! %#H!@"#Q!#I M%@$KP.C7 (M&"*.8)HM&"J.:)HM&#*.<)HM&#J.>)HM&$*.@)HM&$J.B)O]V M!O]V!.A4 (/$!.G> "O Z)\ _W8*Z'T @\0"B_B)/I@FBT8(HYHFBT8*HYPF MOIXF@_\.?A#K%8M>"HH'F(O>1H@'_T8*B\=/A<!UZ_]V!O]V!.@& (/$!.F0 M +@" .A0 (M&!J.6)KB4)E#_=@3HC@"#Q 2)1OJ%P'47@SZ6)@!\!:&6)NL+ MH98F]]BCP"6X___I5@ KP.@7 (N^! K]NL!1HO?1X _ '7WC40!Z3H 6U6+ M[%=6*^ [)K D<@+_X\<&EB8$ ,<&F"8" ,<&FB8/ ,<&GB:R)+B4)E"X 0!0 MZ!L @<0$ .G]_XUF_%Y?7<, N0$ Z0P N0( Z08 N0, Z0 58OLBX8$ (N> M!@#-(%W# %6+[(M&"/=F!HO(BT8$]V8* \B+1@CW9@0#T5W"" 58OL5RO_ MBU8&BT8$BUX*BTX(A=)Y"??:]]B#V@#WUX7;>0GWV_?9@]L ]]?H4P"%_W0' M]]KWV(/: %]=P@@ %6+[%<K_XM6!HM&!(M>"HM."(72>0GWVO?8@]H ]]>% MVWD']]OWV8/; .@5 (O3B\&%_W0']]KWV(/: %]=P@@ (7;=1*+V(O"*]+W M\9/W\8O*B],KV\-55U8K_X3_=29'5XK[BMV*Z2K)B^F*Z"K)BL2*XHK6*O92 M4%&+S3O3<@VX___K"E=74E"+PBO2]_.+Z/?A7ROX@]( B_*+P_?E \:#T@!> M*_"#T@!8*\)Y"DT#^1/S%0 Z_2+SXO>7X7_= B*S8KKBM^*^(O%*])>7UW# M 4V5L96-T(&)U9F9E<B H)7,I.B 4V5L96-T M(&5X:7-T:6YG(&)U9F9E<B H)7,I.B 5&AA="!I<VXG="!A('-U8G-T<FEN M9R!O9B!A;GD@8G5F9F5R(&YA;64A " ]/B 2VEL;"!B=69F97(Z( !.;R!S M=6-H(&)U9F9E<@!+:6QL:6YG(&EN+75S92!B=69F97([('-E;&5C="!W:&EC M:"!O=&AE<B!B=69F97(@*"5S*3H@ $YO('-U8V@@8G5F9F5R " J*E-(3U<J M*@!"=69F97)S(&EN('1H:7,@14Q,13H*"@ J( @( @* I( !%3TP@36]D M92!I<R!#4DQ& $5/3"!-;V1E(&ES($Q& $1O=#T +"!086=E( @($QI;F4@ M " @0V]L( @(%ML:6YE( @;V8@ " H;F\@14],(&%T($5/1B$I %T ("HJ M3$E.15,J*@!-86EN $YO('-U8V@@8G5F9F5R $)U9F9E<B E<R!C;VYT86EN M<R!C:&%N9V5S("T@9F]R9V5T('1H96T_( !!;')E861Y(#(@=VEN9&]W<P!/ M;FQY(#$@=VEN9&]W $]N;'D@,2!W:6YD;W< 3VYL>2 Q('=I;F1O=P!4;V\@ M;75C: @*BI315!-3T1%*BH ("HJ34]$12HJ " J*D%32RHJ $YO('-U8V@@ M=VEN9&]W "TM34]212TM("AT>7!E(%-P86-E(&9O<B!M;W)E+"!O<B!T>7!E M(&%N>2!C;VUM86YD('1O(&9L=7-H*0 M+2TM+2TM+2TM+2TM+2TM+2TM+2TM M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2T@*$AI="!S<&%C92!T;R!C;VYT M:6YU92DM+0 ("@ ($9I;&P ($UA8W)O1&5F "D@ #H@ " J " @ " M+0!4 M3U 0D]4 "TM _D$J0D5"IT*^0M="[D),0WE#RT/V0PY$1T1?1(Y%I46\ M10 61BE&/$951G!&AT:@1M9&:$>P1]U' #"2/!(*TE>299) MK4GQ20 $)*8$I^2I1* #B % !( )/ T\$:P2B!+4$R 0 %!9:UF" M6>M9!EHZ6ME:\EH+6P :0F."AH+5@O:"_D+%0RI#-I,B4V@30 "Y3=!- MZ4T 3@ %$43!-H$X03%10T%! 5;&( *F1Z9,)D&&4 /-*5TO@ M2@ #J= -U.790=A5M^FPP;;;5 M9.V0 UDOM2PY,)$R(3 MR&J,:95J !F/_3- M "> ",4!0 &%00 !7EZ'$X#&!H9 G%P"5U/)5QI %N- (QA M 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! M 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! M 0$! 0$' E8,'@Y4$%,2;Q-N%%47:Q@S'DHE<RU>,%\Q7S)?,U\T7S5?-E\W M7SA?.5\[?#PX/CE;+EP(72U""T,11 Q&"D<I2"])?4P037M.%D]@4!=1,%0. M50]64%<F66I^-G\- C4#A 5#!CP+1 PH#3</&Q!:$CT30!4G%CX70A@D&H,A M@B1T)7(H9"EE*F<N=C!+,4<R1CA,.4T].EY)0C)%9D9U23]+-$](4T%4=W\= M 0" P$, ",!"< [ 0 4V5T(%!R;V9I;&4Z( O $-A;FYO="!O<&5N M(&9I;&4 0F%D('!R;V9I;&4@9F]R;6%T * $5,3$4Z("5D>"5D('-C M<F5E;B!T;V\@8FEG"@!%3$Q%.B!N;W0@96YO=6=H(&UE;6]R>0H 0W5R<V]R M(&]U="!O9B!W:6YD;W< 9FEX7W=I;F0@9F%I;&5D /_______P#\ 0 > $ M /@ !!("T@06)O<G0@<')O M8V5S<PI"("T@0G)E86MP;VEN=" H;75S="!H879E(")B<'0Z8B(@<V5T(&EN M($%$0BD*0R M($-O;G1I;G5E"D0@+2!$:6%G;F]S=&EC(&-O;6UA;F0@;6]D M90H 4R M(%1R>2!T;R!S879E(&-U<G)E;G0@8G5F9F5R"E<@+2!4<GD@=&\@ M<V%V92!W;W)L9" H86QL(&UO9&EF:65D(&)U9F9E<G,I"@ K0;=!24%. M05-!54&W0;=!MT&W0;=!MT&W0;=!MT&W0;=!MT%30;=!=4&W0;=!MT%[075N M:VYO=VX@97)R;W(@)60 5T%23DE.1R M($9)3$4@0T]24E505$5$(0I"=69F M97)S(&%F9F5C=&5D.@H (" E<SH@)7,* " @)7,* "5S15)2.B E;R 4T)8 M %-"30!%3$Q%('-T;W!P960@8GD@9F%T86P@:6YT97)R=7!T("@E9"DA"E1Y M<&4@4R!O<B!7('1O('1R>2!S879I;F<@>6]U<B!W;W)K+@H *$$L0BQ#+$0L M4RQ7+#\I %-O<G)Y+"!N;R!D:6%G;F]S=&EC<PH 06QR96%D>2!S879I;F<@ M+2T@8V]N=&EN=65D $YO(&UA<FLA #X!_P'+RH@ " J+P @( 1&]T(&]U M="!O9B!W:6YD;W< __]&:6YD(&9I;&4Z( !296%D(&9I;&4Z( !6:7-I="!F M:6QE.B 3F\@9&5F875L="!F:6QE(&YA;64N $EN<V5R="!F:6QE.B *$YO M(&-H86YG97,@;F5E9"!T;R!B92!W<FET=&5N*0!"=69F97(@)7,@8V]N=&%I M;G,@8VAA;F=E<R M('=R:71E(&]U=#\@ $)U9F9E<B E<R!C;VYT86EN<R E M<RP@=VAI8V@@8G5F9F5R('-H86QL($D@=7-E/R <V]M971H:6YG "!#86YN M;W0@<F5A9" M('1O;R!M86YY(&EN=&5R;F%L(&9I;&5S %-"(')T;B!C86YN M;W0@<F5A9"!F:6QE/P @0V%N;F]T(')E860 ($-A;FYO="!W<FET90 @+2 M5W)I=&4@1FEL93H@ "!.;R!-87)K(0!7<FET92!296=I;VXZ( !.;R!K:6QL M960@<W1U9F8 5W)I=&4@3&%S="!+:6QL.B 8F%D(&EW<FET9FEL92!A<F< M3F\@9&5F875L="!F:6QE(&YA;64N %=R:71I;F<N+BX ($]U='!U="!E<G)O M<@!7<FET=&5N ')E;F%M92!E<G)O<B$ +RL 4V%V:6YG("5S+BXN "!E<G)O M<B M("5S"@ * &YU;#H !(96QP(&9O<B!C;VUM86YD.B 32T 32T 7E@M M $QO861I;F<@ "XN+@ @*BI(14Q0*BH ($YO(&AE;' @9F]U;F0 ("I32$]7 M*@ 2V)D(&UA8W)O(&%C=&EV92P@:6=N;W)I;F<@(E-T87)T($MB M9"!-86-R;R( ("I+0D1-04,J $%L<F5A9'D@:6X@:V)D(&UA8W)O(0!.;R!K M8F0@;6%C<F\@9&5F:6YE9 !.;R!K8F0@;6%C<F\@9&5F:6YE9 !#=7)R96YT M($MB9"!M86-R;SH*"@ "T+14Q,13H@8F%D('-W:71C:#H@)7,* $5,3$4Z M(&UO<F4@=&AA;B E9"!F:6QE(&%R9W,L("5D(&EG;F]R960N"@!&=6YD86UE M;G1A; !(3TU% %%U:70Z(&)U9F9E<G,@)7,L("5S+"XN+B!S=&EL;"!H879E M(&-H86YG97,@+2!F;W)G970@=&AE;3\@ %%U:70Z(&)U9F9E<B E<R!S=&EL M;"!H87,@8VAA;F=E<R M(&9O<F=E="!T:&5M/R 475I=#\@ %5S92!>6"!> M4R!T;R!S879E(&)U9F9E<@!5<V4@7E@@7E<@=&\@=W)I=&4@;W5T(&)U9F9E M<@!">64 0V%N;F]T(&9O<FL 4TA%3$P +V)I;B]S: !32$5,3 O8FEN+W-H M '-H96QL "UI $YO('-H96QL(0!%3$Q%.B!.;R!M96UO<GD@;&5F= !3;VUE M=&AI;F<@;W9E<G=R;W1E(&%N(&%L;&]C871E9"!B;&]C:R$ ; QZ#(D,475E M<GD@4F5P;&%C90!297!L86-E(%-T<FEN9P!297!L86-E(&EN($QI;F4 ("HJ M3$E.12HJ %)E<&QA8V4@<W1R:6YG.B =VET:"!S=')I;F<Z( E<R5S("5S M %-0/5)E<&QA8V4L($1%3#U$;VXG="P@15-#/5-T;W L("$]4F5P;&%C92!A M;&PL(%X]0F%C:R!U<"P@+CU297!L86-E("8@4W1O< !N;W0@:6UP;&5M96YT M960 6P$4%04$!@<) EV,C3@Y"@L,#0\0$5].'&D= $AU:#\@5')Y M(&%G86EN("T@ =%3$Q%($EN=&5R;F%L($5R<F]R.B 4F5V97)S92!3 M96%R8V@Z( !396%R8V@Z( !396%R8V@@1F%I;&5D " N+BX 3F]T:&EN9R!T M;R!S96%R8V@@9F]R %(M<V5A<F-H.B 22US96%R8V@Z( )*$9!24Q)3D<I M $DM<V5A<F-H('-T<B!T;V\@;&]N9P"F#@ %300)Q G"" *&H@3!0V"!D$# M*P*@ = : VGW??=5]T'W+?0 M M /__ M " !415)- $@Q.0!(,3D 1$TR M-3 P $1-,S R-0 Z('5N:VYO=VX@=&5R;6EN86P@='EP90H &UL_,F@;1QM/ M&W$;7!MY-0 ;=QMY.1MX,0 ;=@ >'@ ;10 ;60 ;2P ;3 ;30 ;0 ;3P @ M?P (" ;3@ (?P!#86YN;W0@86QL;V-A=&4@=&5R;6-A<"!B=69F97(* '!C M &EM &1M &EA &ED &5I &5D &ES '1E '1I &%L &1L &-M &-L &-E '5P M &EC &EP &1C &%M &)S &)C '-G '-O '-E &MM $U4 &%A82T 86UB87-S M861O<@!M;0!M;P!L:0!C;P!497)M:6YA;"!D97-C<FEP=&EO;B!T;V\@8FEG M(0H .B!T97)M:6YA;"!L86-K<R!O;F4@;V8Z(&-U<G-O<B!A9&1R97-S:6YG M+"!C;&5A<B!S8W)E96XN"@ B$+8! "L0,!!' "$ ,@ ! $ 0 R$#L0 M4A!%3$Q%(#0N,0 N8F%K $X 36%R:R!S970 +W5S<B]S<F,O96QL92]H96QP M+F1A= N96QL97!R;RYB,0 " 50 0$X "!% 030 "$0 %4M M57-E9"P@3BU.6$TL($4M17AT97)N86PL($TM4TUN;V1E<RP@1"U31&YO9&5S M " @(" @(%--.B!B86-K(" @<VUA9&1R(" @<VUL96X@('-M=7-E("!S;69L M86=S " 3 0%0 " J \9CX@9FQA9W,Z("HM34]$("AD:7-K(&]U M=&]F9&%T92DL($PM3$]#2RP@5"U,0TLR("AT96UP*0 /&8^(" @(" @4T0Z M('-L9F]R=R!S;&)A8VL@<V1F;&=S('-D9F]R=R!S9&)A8VL@('-D;65M('-D M9FEL92 @<V1A9&1R('-D;&5N $ 3P " %< $\M3W9E<G=R:71E+"!7 M+5=R:71E *365M;W)Y(%5S86=E.@H "7-B M;5]N9FP@.B E-F\* ES8FU?;&ES=#H@)39O"@ )<VUB;&L@;F]D97,@87)E M("5O(&)Y=&5S(&QO;F<N"@!4<F%C:6YG(%--(&YO9&4@9G)E96QI<W0@+2T* M " @("!-87AI;75M(&QO;W @9&5T96-T:6]N('-I>F4@:7,@)60N H)3F\@ M;&ES="X* "5S)3=O+3X "B @(" I,3T]0("T@)6\@<V5E;B!A<R!N;V1E M("5D(2$* %--(&9R965L:7-T(&QO;W "D9R965L:7-T(&YO9&4@:&%S(&9L M86=S.@H 1G)E92!332!F;&%G9V5D I%;F0@+2 E9"!N;V1E<R!O;B!332!F M<F5E;&ES="X* %1R86-I;F<@;65M(&QI<W0@+2T@"@ )3F\@;&ES=#\A"@!. M;R!M96T@;&ES=#\A(0 @("!&;&%G<SH@)7,*)7,* " @)39O.B 3$]/4" M M('-E96X@87,@;F]D92 E9"$A"@!,;V]P(&EN(&UE;2!L:7-T(2$ 7B )39O M($)!1"!"86-K<'1R(2$*"2 @(" 0F%D(&)A8VL@<'1R(0!"040@+2!N;R!N M;V1E($E$(0H)(" @( !333H@8F%D(&YO9&4@240 (" @(" 1E)%12 6F5R M;RUL96YG=&@@87)E82$ 4TTZ(&QE;B P $)A9"!F<F5E+6UE;2!B;&]C:P!" M860@9G)E92UM96T@8FQO8VL "2 @0D%$(2$@)39O(&5X<&5C=&5D.R 06QI M9VYM96YT(&5R<F]R(0 E9"!S:VEP<&5D+@H )60@;W9E<FQA<'!E9"X* $5N M9" ]("4V;PH (" E-F\Z(" E<R @ " @(" 1E)%10 E-F\Z( E-60N("4U M9"X )39O("4V;P @("4W;R ]("5S"@!4<F%C:6YG(%-$0DQ+(&YO9&4@9G)E M96QI<W0@+2T* " @("!-87AI;75M(&QO;W @9&5T96-T:6]N('-I>F4@:7,@ M)60N H)3F\@;&ES="X* "5S)3=O+3X "B @(" I,3T]0("T@)6\@<V5E M;B!A<R!N;V1E("5D(2$ 4T0@9G)E96QI<W0@;&]O< *1G)E96QI<W0@;F]D M92!H87,@9FQA9W,Z"@!&<F5E(%-$(&9L86=G960 "D5N9" M("5D(&YO9&5S M(&]N(%-$(&9R965L:7-T+@H 4')I;G1O=70@;V8@86QL(&EN+75S92!31$), M2W,Z"@ @("5S"@ E<PH "@ E8R5C)6, ("4W;SH@)39O("4V;R E-F\@)39O M("4V;R E-F\@)39O("4W;&\@)35L9"X* H 4T0@9G)E96QI<W0@=&]O(&QO M;F<@*"5D*0H 4T0@9G)E96QI<W0@=&]O(&QO;F< 4T0@9G)E96QI<W0@;&]O M<"!A=" E;PH 4T0@9G)E96QI<W0@;&]O< !"860@9G)E92!31"P@;F]N+7IE M<F\@9FQA9SH* $9R964@4T0@9FQA9V=E9 !4;V\@;6%N>2!31',@9F]R('1A M8FQE("@E9"D* %1O;R!M86YY(%-$<P!4;V\@;6%N>2!31',@9F]R('1A8FQE M("@E9"D* %1O;R!M86YY(%-$<P!"86-K;&ES="!L;V]P(2$@1'5P)V0@;F]D M93HE<PH *&]N(&9R965L:7-T(2D %!H>7,@4T0@;&]O< !31"!L;V]P "TM M+2T@)7-,:7-T('-T87)T960Z( !0:'ES( (%-&.B E;RP@9F0]("5D+"!L M;CT@)6QD"@ @($)!1"$A(%-F<'1R,2 E;R!D;V5S;B=T(&UA=&-H(%-$("5O M(2$* %-&4%12,2!B860 "@ E<PH "4)A9"!P:'ES(&)A8VMP='(* %!31"!B M860@<V1B86-K E"860@8F%C:W!T<@H 4T0@8F%D('-L8F%C:P )0F%D(&YO M9&4@240A"@!"860@4T0@;F]D92!)1 )3F5G(&1I<VL@;&5N+V%D9'(* %-$ M.B!N96<@;&5N+V%D9'( "D)A9"!334),2R!P='(* %-$.B!B860@4TT "4)A M9"!334),2S\@3&5N(&-O;F9L:6-T"@!31" A/2!330 )0F%D(%--0DQ++"!L M96X@/"!U<V4* %-$.B!332!L96X@/"!U<V4 "4)A9"!S9&9I;&4@<'1R(2!3 M:&0@8F4@)6\* %-$.B!B860@<V1F:6QE E"860@9&ES:R!A9&1R+"!N;W0@ M:6X@;W)D97(A"@!31"!A9&1R(&]U="!O9B!O<F1E<@!4;V\@;6%N>2!31',@ M9F]R('1A8FQE("@E9"D* %1O;R!M86YY(%-$<P )3$]/4"$A(%1H:7,@4T0@ M86QR96%D>2!S965N)7,N"@ @*&]N(&9R965L:7-T(2D %-$(&QO;W +2TM M+2TM+2TM+2T* %-"1DE,12!P<FEN=&]U="!N;W0@8V]D960Z("5O"@!30E-4 M4B E;SH@ %IE<F\@<&]I;G1E<C\_/PH ("AI;RQC=7(L<BQW+&8L+BPK(#T@ M)6\L)6\L)60L)60L)6\L)6QO+"5L;RD* " @<V)F;&%G<R E-6\@/2 E<R H M)7,I"@ @('-B8W5R("4V;P *(" @)7,*(" @ " @($)!1"!31$),2R!)1"$A M( H 4T)#55(@;F]T(%-$/P @(" E<PH@(" (" @0D%$(%--0DQ+($E$(2$* M %-"0U52(&AA<R!B860@4TT ("!S8FEO<" @)39O " @0D%$ $)A9"!30DE/ M4 @($)!1 !"860@4T))3U O8VYT<P * " @<V)R;&5F=" E-6\@/2 E-60N M " @0D%$ $)A9"!S8G)L969T H ("!S8G=L969T("4U;R ]("4U9"X ("!" M040 0F%D('-B=VQE9G0 "@ @('-B9&]T("4W;&\@/2 E-VQD+@ @($)!1 !" M860@<V)D;W0 "B @<V)O9F8@)3=L;R ]("4W;&0N"@ @($DO3R!P='(@;&]C M.B E;&0N"@H 4'1R=&%B(&]V97)F;&]W ($-A;B=T('-B<FL 6F5R;R!S M8FU?;GAT<F$A %-"4DL@)6\@(3T@)6\ 3F\@=4Y832!N;V1E(0!30E)+("5O M("$]("5O &=E='-P;&ET(&5R<CH@)6\ 06QI9VX@97)R &9R964Z(&)A9"!A M<F<@)6\ <F5A;&QO8SH@8F%D(&%R9R E;P!:97)O('-B;5]N>'1R80 ZKO^N MDJYCKO^NN:[DKD:O K,YL2FO K.HLLZR4T8@=&%B;&4@:6YC;VYS:7-T96YC M>0!31$U%32 P %-$345-(# 4F5A9&EN(&)L:W-I>B!E<G( 3F\@9FEL90!2 M96%D:6X@4T0Z("5O $M)3$Q.(%-$,B!F86EL960 1T,@;&]O<"P@8V%N;F]T M(&9R964@8FQO8VL@;V8@<VEZ92 E9 !3=V%P;W5T('=R="!E<G( 4V1F:6QE M(# L(%-$("5O %-W87!O=70@97)R+"!31" E;P!3=V%P;W5T('-K(&5R<@!3 M=V%P;W5T('=R="!E<G( +W1M<"]S8F0N6%A86%A8 %-W87!O=70@8W)E870@ M97)R %-W87!O=70@;W!E;B!E<G( 4W=A<&]U="!S965K(&5R<CH@*"5D+"5L M9"PP*2 E9" E<P!&1DY$(&)L97<@:70L(&)U="!R96-O=F5R960N(%-$("5O M('-I>B E;&0 4VL@97)R %)D(&5R<@ H<W=A<"D "5S("5D.B5S+" E;&0Z M*"5D)7,L)6\L)60I/25L9" H9FP@)6QD*0 M 5$5234-!4 !415)- "]E=&,O=&5R;6-A< !R $]/4%, %$@+2!1 M=6ET(&1I86<@;6]D90HA("T@1V]T;R!S=6)S:&5L; I6("T@5F5R:69Y($UE M;2 F(%-$(&QI<W1S"DU&("T@365M($9R965L:7-T"DT@("T@365M(&QI<W0* M0B @+2!#=7)R96YT(&)U9F9E<B!30@I$1B M(%-$($9R965L:7-T"D0@("T@ M4T1S(&EN('5S90I$3" M(%-$($QO9VEC86P@;&ES=',*1% @+2!31"!0:'ES M:6-A;"!L:7-T<PI#(&X@+2!#;VUP86-T.R P+3<]<V)X7V-O;7 H;BDL(#@] M4TT@9G)E96QI<W0L(#D]4T0@9G)E96QI<W0N"E<@("T@5VEN9&]W('!R:6YT M;W5T"E@@;B M(%AE<F-I<V4@<F%N9&]M;'D@*$=#(&5V97)Y(&XI"EH@;B M M(&QI:V4@6"!B=70@=VET:"!N;W1E<PH -Q\^'T(?1A]+'U,?5Q]='V$?:!\ M 4V5L9BUC:&5C:VEN9R!O;@!396QF+6-H96-K:6YG(&]F9@!- M96T@;6=T %-"0E5& %-$(&QI<W0 "B5S(&5R<F]R.B E<R A(2$* $0^ " @ M1F%I;&5D.B E<PH ("!/2PH /S\@5'EP92 _(&9O<B!H96QP"@!T:')O;F4 M=&]O '-K>0!F;W)E &9I;F=E<G, <V5X '-T;VYE # Q, !N87IG=6P 8F%S M90 J*D583U)#25-%*BH 3&EN92 0G5F9FQE;CH@)6QD"@!4>7!E:6X@<W1O M<"X* "!087-S("5L9 @+2!'0R!L978@)60* "!+:6QL("5L9"\@)60[ %A% M4E(@869T97(@:VEL;#H@)7,* "!986YK("5L9#L 6$524B!A9G1E<B!Y86YK M.B E<PH (%!O<#L 6$524B!A9G1E<B!P;W Z("5S"@ @061D $QI;F4@ %A% M4E(@869T97(@:6YS.B E<PH "@!815)2(&EN('!A='1E<FXA"@!,;V]P(&-O M=6YT(#T@)6QD"@!C=7)?9&]T+R E;&0@(&-U<E]B=68O("5O(&-U<E]W:6XO M("5O"@!7:6YD;W<@)6\Z"@ @(&YE>'0O("5O"@ @(&)U9B O("5O"@ @(')E M9' O("5O"@ @('1O<&QD;W0O("5L9 H ("!D;W0@+R E;&0* " @8FUO9"\@ M)6QD"@ @(&5M;V0O("5L9 H ("!O;&1Z+R E;&0* " @<&]S("\@)60* " @ M:'0@("\@)60* ",@($9L86=S(" @0F]F9B!,96X@(2!#;VQS($QI;F4* "4R M9" E+34N-7,@)39L9" E,V0@)3%D("4T9" )2TT,"XT,',* "4R-F0@ "4M M-# N-#!S"@ &8A( DN+#LZ*2$ 1FEL;"!C;VQU;6X@/2 06)S=7)D($9I M;&P@4')E9FEX !&:6QL(%!R969I>" ]("( (@ )/B;^&2XY+CDN.2XY+C MDN.2X\WAXN($(@PB%B(P(D B6")B(GPBCB*@(K BO"+.(MXB\"+\(A(C)",P M(T(C42-A(W C@2.5(ZDCNB/)(]@C\"/](Q,D(B0N)#PD(P!%<G)O<B P $YO M="!O=VYE<@!.;R!S=6-H(&9I;&4@;W(@9&ER96-T;W)Y $YO('-U8V@@<')O M8V5S<P!);G1E<G)U<'1E9"!S>7-T96T@8V%L; !)+T\@97)R;W( 3F\@<W5C M:"!D979I8V4@;W(@861D<F5S<P!!<F<@;&ES="!T;V\@;&]N9P!%>&5C(&9O M<FUA="!E<G)O<@!"860@9FEL92!N=6UB97( 3F\@8VAI;&1R96X 3F\@;6]R M92!P<F]C97-S97, 3F]T(&5N;W5G:"!C;W)E %!E<FUI<W-I;VX@9&5N:65D M $)A9"!A9&1R97-S $)L;V-K(&1E=FEC92!R97%U:7)E9 !-;W5N="!D979I M8V4@8G5S>0!&:6QE(&5X:7-T<P!#<F]S<RUD979I8V4@;&EN:P!.;R!S=6-H M(&1E=FEC90!.;W0@82!D:7)E8W1O<GD 27,@82!D:7)E8W1O<GD 26YV86QI M9"!A<F=U;65N= !&:6QE('1A8FQE(&]V97)F;&]W %1O;R!M86YY(&]P96X@ M9FEL97, 3F]T(&$@='EP97=R:71E<@!497AT(&9I;&4@8G5S>0!&:6QE('1O M;R!L87)G90!.;R!S<&%C92!L969T(&]N(&1E=FEC90!);&QE9V%L('-E96L M4F5A9"UO;FQY(&9I;&4@<WES=&5M %1O;R!M86YY(&QI;FMS $)R;VME;B!P M:7!E $UA=&@@87)G=6UE;G0 4F5S=6QT('1O;R!L87)G90!);G9A;&ED(&5R M<FYO"@ Z( * ! $ K":L)@$ !" *PJK"H" !@ M9B1P)'HD ,PN 1 %-T86-K(&]V97)F;&]W"@ end
Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 05:14 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 0972 for MINIX@UWALOCKE; Sun, 20 Dec 87 05:14 PST Received: by NDSUVM1 (Mailer X1.24) id 0884; Sun, 20 Dec 87 06:02:00 CST Date: 19 Dec 87 21:50:16 GMT From: Andy Tanenbaum <ast@cs.vu.nl> Subject: ELLE sharfile (misc. files) Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU : This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. : --------------------------- cut here -------------------------- PATH=/bin:/usr/bin echo Extracting \d\e\f\p\r\f\.\e sed 's/^X//' > \d\e\f\p\r\f\.\e << '+ END-OF-FILE '\d\e\f\p\r\f\.\e X;;; X;;; ELLE Default Command Profile - "defprf.e" X;;; X;;; This file is input to the ellec program. It defines the default X;;; command key bindings that ELLE uses, in the absence of an individual X;;; user profile. X;;; These defaults attempt to emulate the default EMACS command key X;;; bindings. Differences, where known, are commented. X;;; X;;; "ELLE" means the function is unique to ELLE. X;;; E/G: (cmd altnam) "thisname"; X;;; "E:" refers to TOPS-20 EMACS, "G:" refers to Gnu Emacs. X;;; (cmd) This function exists but is bound to "cmd" instead. X;;; (*) function exists but is not bound to any specific key. X;;; () function does not exist. X;;; (=) function exists, with same binding (normally omitted) X;;; altnam Name by which this function is known. X;;; "thisname" - name of function bound to this command. X;;; - means the command is unbound (undefined). X X(keyallunbind) ; Flush any predefined bindings X X(keybind ^@ "Set/Pop Mark") X(keybind ^A "Beginning of Line") X(keybind ^B "Backward Character") X; ^C not bound. ; E: ()- G: mode-specific-command-prefix X(keybind ^D "Delete Character") X(keybind ^E "End of Line") X(keybind ^F "Forward Character") X(keybind ^H "Backward Character") ; G: (^B) help-command X(keybind ^I "Indent According to Mode") X(keybind ^J "Indent New Line") X(keybind ^K "Kill Line") X(keybind ^L "New Window") X(keybind ^M "CRLF") X(keybind ^N "Down Real Line") X(keybind ^O "Open Line") X(keybind ^P "Up Real Line") X(keybind ^Q "Quoted Insert") X(keybind ^R "Reverse Search") X(keybind ^S "Incremental Search") X(keybind ^T "Transpose Characters") X(keybind ^U "Universal Arg") X(keybind ^V "Next Screen") X(keybind ^W "Kill Region") X(keybind ^X "Prefix Extend") X(keybind ^Y "Un-kill") X; ^Z not bound ; E: Prefix Control-Meta; G: suspend-emacs X(keybind ^[ "Prefix Meta") X(keybind "^\" "Debug Mode") ; ELLE. E: () Prefix Meta; G: () - X; ^] not bound. ; E+G: Abort Recursive Edit X(keybind ^^ "Hit Breakpoint") ; ELLE. E: () Prefix Control; G: () - X(keybind ^_ "Describe") ; E: (M-?) Help; G: (^H-k) undo X(keybind " " "Insert Self") X(keybind ! "Insert Self") X(keybind """" "Insert Self") X(keybind # "Insert Self") X(keybind $ "Insert Self") X(keybind % "Insert Self") X(keybind & "Insert Self") X(keybind ' "Insert Self") X(keybind "(" "Insert Self") X(keybind ")" "Insert Self") X(keybind * "Insert Self") X(keybind + "Insert Self") X(keybind , "Insert Self") X(keybind - "Insert Self") X(keybind . "Insert Self") X(keybind / "Insert Self") X(keybind 0 "Insert Self") X(keybind 1 "Insert Self") X(keybind 2 "Insert Self") X(keybind 3 "Insert Self") X(keybind 4 "Insert Self") X(keybind 5 "Insert Self") X(keybind 6 "Insert Self") X(keybind 7 "Insert Self") X(keybind 8 "Insert Self") X(keybind 9 "Insert Self") X(keybind : "Insert Self") X(keybind ";" "Insert Self") X(keybind < "Insert Self") X(keybind = "Insert Self") X(keybind > "Insert Self") X(keybind ? "Insert Self") X(keybind @ "Insert Self") X(keybind A "Insert Self") X(keybind B "Insert Self") X(keybind C "Insert Self") X(keybind D "Insert Self") X(keybind E "Insert Self") X(keybind F "Insert Self") X(keybind G "Insert Self") X(keybind H "Insert Self") X(keybind I "Insert Self") X(keybind J "Insert Self") X(keybind K "Insert Self") X(keybind L "Insert Self") X(keybind M "Insert Self") X(keybind N "Insert Self") X(keybind O "Insert Self") X(keybind P "Insert Self") X(keybind Q "Insert Self") X(keybind R "Insert Self") X(keybind S "Insert Self") X(keybind T "Insert Self") X(keybind U "Insert Self") X(keybind V "Insert Self") X(keybind W "Insert Self") X(keybind X "Insert Self") X(keybind Y "Insert Self") X(keybind Z "Insert Self") X(keybind [ "Insert Self") X(keybind "\" "Insert Self") X(keybind ] "Insert Self") X(keybind ^ "Insert Self") X(keybind _ "Insert Self") X(keybind ` "Insert Self") X(keybind a "Insert Self") X(keybind b "Insert Self") X(keybind c "Insert Self") X(keybind d "Insert Self") X(keybind e "Insert Self") X(keybind f "Insert Self") X(keybind g "Insert Self") X(keybind h "Insert Self") X(keybind i "Insert Self") X(keybind j "Insert Self") X(keybind k "Insert Self") X(keybind l "Insert Self") X(keybind m "Insert Self") X(keybind n "Insert Self") X(keybind o "Insert Self") X(keybind p "Insert Self") X(keybind q "Insert Self") X(keybind r "Insert Self") X(keybind s "Insert Self") X(keybind t "Insert Self") X(keybind u "Insert Self") X(keybind v "Insert Self") X(keybind w "Insert Self") X(keybind x "Insert Self") X(keybind y "Insert Self") X(keybind z "Insert Self") X(keybind { "Insert Self") X(keybind | "Insert Self") X(keybind } "Insert Self") X(keybind ~ "Insert Self") X(keybind DEL "Backward Delete Character") X X; Meta chars X X(keybind M-^B "Move to Window Bottom") ; ELLE (ima). E+G:()- X(keybind M-^L "Goto Line") ; E:(); G:(* goto-line) - X(keybind M-^N "Scroll Window Down") ; ELLE (ima). E+G:()- forward-list X(keybind M-^P "Scroll Window Up") ; ELLE (ima). E+G:()- backward-list X(keybind M-^R "Reverse String Search") ; E:(*); G:(* search-backward) - X(keybind M-^S "String Search") ; E:(*); G:(* search-forward) isearch-forward-regexp X(keybind M-^T "Move to Window Top") ; ELLE (ima). E+G:()- X(keybind M-^W "Append Next Kill") X(keybind M-^X "Select Existing Buffer") ; ELLE (ima). E+G:()- X(keybind M-^^ "Shrink Window") ; ELLE (ima). E+G:()- X(keybind M-% "Query Replace") X(keybind M-- "Negative Argument") X(keybind M-0 "Argument Digit") X(keybind M-1 "Argument Digit") X(keybind M-2 "Argument Digit") X(keybind M-3 "Argument Digit") X(keybind M-4 "Argument Digit") X(keybind M-5 "Argument Digit") X(keybind M-6 "Argument Digit") X(keybind M-7 "Argument Digit") X(keybind M-8 "Argument Digit") X(keybind M-9 "Argument Digit") X(keybind "M-;" "Indent for Comment") X(keybind M-< "Goto Beginning") X(keybind M-> "Goto End") X(keybind M-[ "Backward Paragraph") X(keybind "M-\" "Delete Horizontal Space") X(keybind M-] "Forward Paragraph") X(keybind M-B "Backward Word") X(keybind M-C "Uppercase Initial") X(keybind M-D "Kill Word") X(keybind M-F "Forward Word") X(keybind M-G "Fill Region") X(keybind M-H "Mark Paragraph") X(keybind M-I "Indent Relative") ; E+G: (*) Tab to Tab Stop X(keybind M-L "Lowercase Word") X(keybind M-M "Back to Indentation") X(keybind M-N "Next Line") ; E:(*); G:(* forward-line) - X(keybind M-O "VT100 button hack") ; ELLE. E+G: () - X(keybind M-P "Previous Line") ; E:(*); G:() - X(keybind M-Q "Fill Paragraph") X(keybind M-T "Transpose Words") X(keybind M-U "Uppercase Word") X(keybind M-V "Previous Screen") X(keybind M-W "Copy Region") X(keybind M-Y "Un-kill Pop") X(keybind M-~ "Buffer Not Modified") X(keybind M-DEL "Backward Kill Word") X X; Extended commands X X(keybind X-^B "List Buffers") X(keybind X-^C "Write File Exit") ; ELLE (ima). E:()-; G: (= save-buffers-kill-emacs) X(keybind X-^E "Write Region") ; E:(*)-; G:(*) eval-last-sexp X(keybind X-^F "Find File") X(keybind X-^K "Write Last Kill") ; ELLE (mnx). E+G:()- X(keybind X-^L "Lowercase Region") X(keybind X-^M "EOL CRLF Mode") ; ELLE. E+G: ()- X(keybind X-^O "Delete Blank Lines") X(keybind X-^P "Set Profile") ; ELLE. E+G: () Mark Page X(keybind X-^R "Read File") X(keybind X-^S "Save File") X(keybind X-^U "Uppercase Region") X(keybind X-^V "Visit File") X(keybind X-^W "Write File") X(keybind X-^X "Exchange Point and Mark") X(keybind X-^Z "Return to Superior") ; G:() suspend-emacs X(keybind X-! "Push to Inferior") ; ELLE. E:(*)-; G:()- X(keybind X-$ "Replace in Line") ; ELLE (mnx). E+G:()- X(keybind X-% "Replace String") ; E+G: (*) - X(keybind "X-(" "Start Kbd Macro") X(keybind "X-)" "End Kbd Macro") X(keybind X-* "View Kbd Macro") ; E: (*)-; G: ()- X(keybind X-. "Set Fill Prefix") X(keybind X-0 "Delete Window") ; E: ()- X(keybind X-1 "One Window") X(keybind X-2 "Two Windows") X(keybind X-8 "Standout Window") ; ELLE. E+G:()- X(keybind X-9 "Two Mode Windows") ; ELLE. E+G:()- X(keybind X-= "What Page") ; E+G: (*) What Cursor Position X(keybind X-^ "Grow Window") X(keybind X-B "Select Buffer") X(keybind X-E "Execute Kbd Macro") X(keybind X-F "Set Fill Column") X(keybind X-I "Insert File") ; E: (*) Info X(keybind X-K "Kill Buffer") X(keybind X-O "Other Window") X(keybind X-S "Save All Files") ; E:(*)-; G:(= save-some-buffers) X(keybind X-T "Auto Fill Mode") ; E:(*) Transpose Regions; G:(*)- X(keybind X-DEL "Backward Kill Line") ; ELLE(ico) E+G:() Backward Kill Sentence X X; IMAGEN-specific functions, not bound. X;(keybind "" "Text Mode") ; IMAGEN E:(*); G:(*) X;(keybind "" "Execute Unix Command") ; IMAGEN E:(); G:(M-! shell-command) X;(keybind "" "Execute Make") ; IMAGEN E:(* Compile); G:(* compile) X;(keybind "" "Find Next Error") ; IMAGEN E:(); G:(X-` next-error) X X; SUN Mouse functions, for menuitem selection. X;(menuitem "Stuff Selection") ; SUN X;(menuitem "Select Region") ; SUN X X; Forget completely about these. X;(keybind "" "ICO Extend Command") ; ICONOGRAPHICS X;(keybind "" "ICO Typeset Funs") ; ICONOGRAPHICS X;(keybind "" "ICO Spec Input Funs") ; ICONOGRAPHICS X + END-OF-FILE defprf.e chmod 'u=rw,g=r,o=r' \d\e\f\p\r\f\.\e set `sum \d\e\f\p\r\f\.\e` sum=$1 case $sum in 55136) :;; *) echo 'Bad sum in '\d\e\f\p\r\f\.\e >&2 esac echo Extracting \.\e\l\l\e\p\r\o\.\e sed 's/^X//' > \.\e\l\l\e\p\r\o\.\e << '+ END-OF-FILE '\.\e\l\l\e\p\r\o\.\e X; This is the default user profile to emulate "mined" (MINIX editor), X; as per Andy Tanenbaum. X X(keyallunbind) X X; Insert self X(keybind A "Insert Self") X(keybind B "Insert Self") X(keybind C "Insert Self") X(keybind D "Insert Self") X(keybind E "Insert Self") X(keybind F "Insert Self") X(keybind G "Insert Self") X(keybind H "Insert Self") X(keybind I "Insert Self") X(keybind J "Insert Self") X(keybind K "Insert Self") X(keybind L "Insert Self") X(keybind M "Insert Self") X(keybind N "Insert Self") X(keybind O "Insert Self") X(keybind P "Insert Self") X(keybind Q "Insert Self") X(keybind R "Insert Self") X(keybind S "Insert Self") X(keybind T "Insert Self") X(keybind U "Insert Self") X(keybind V "Insert Self") X(keybind W "Insert Self") X(keybind X "Insert Self") X(keybind Y "Insert Self") X(keybind Z "Insert Self") X(keybind a "Insert Self") X(keybind b "Insert Self") X(keybind c "Insert Self") X(keybind d "Insert Self") X(keybind e "Insert Self") X(keybind f "Insert Self") X(keybind g "Insert Self") X(keybind h "Insert Self") X(keybind i "Insert Self") X(keybind j "Insert Self") X(keybind k "Insert Self") X(keybind l "Insert Self") X(keybind m "Insert Self") X(keybind n "Insert Self") X(keybind o "Insert Self") X(keybind p "Insert Self") X(keybind q "Insert Self") X(keybind r "Insert Self") X(keybind s "Insert Self") X(keybind t "Insert Self") X(keybind u "Insert Self") X(keybind v "Insert Self") X(keybind w "Insert Self") X(keybind x "Insert Self") X(keybind y "Insert Self") X(keybind z "Insert Self") X(keybind 0 "Insert Self") X(keybind 1 "Insert Self") X(keybind 2 "Insert Self") X(keybind 3 "Insert Self") X(keybind 4 "Insert Self") X(keybind 5 "Insert Self") X(keybind 6 "Insert Self") X(keybind 7 "Insert Self") X(keybind 8 "Insert Self") X(keybind 9 "Insert Self") X(keybind / "Insert Self") X(keybind : "Insert Self") X(keybind < "Insert Self") X(keybind = "Insert Self") X(keybind > "Insert Self") X(keybind ? "Insert Self") X(keybind @ "Insert Self") X(keybind [ "Insert Self") X(keybind ] "Insert Self") X(keybind ^ "Insert Self") X(keybind # "Insert Self") X(keybind $ "Insert Self") X(keybind % "Insert Self") X(keybind & "Insert Self") X(keybind ' "Insert Self") X(keybind * "Insert Self") X(keybind + "Insert Self") X(keybind , "Insert Self") X(keybind - "Insert Self") X(keybind . "Insert Self") X(keybind ! "Insert Self") X(keybind " " "Insert Self") X(keybind """" "Insert Self") X(keybind "(" "Insert Self") X(keybind ")" "Insert Self") X(keybind ";" "Insert Self") X(keybind "\" "Insert Self") X(keybind _ "Insert Self") X(keybind ` "Insert Self") X(keybind { "Insert Self") X(keybind | "Insert Self") X(keybind } "Insert Self") X(keybind ~ "Insert Self") X X; CTRL char X(keybind ^A "Beginning of Line") X(keybind ^B "Backward Word") X(keybind ^C "Copy Region") X(keybind ^D "Scroll Window Up") X(keybind ^E "New Window") X(keybind ^F "Forward Word") X(keybind ^H "Backward Delete Character") X(keybind ^I "Insert Self") X; open X(keybind ^K "Kill Region") X(keybind ^L "Replace in Line") X(keybind ^M "CRLF") X(keybind ^N "Kill Word") X(keybind ^O "Open Line") X(keybind ^P "Backward Kill Word") X(keybind ^Q "Write Last Kill") X(keybind ^R "Replace String") X(keybind ^S "Push to Inferior") X(keybind ^T "Kill Line") X(keybind ^U "Scroll Window Down") X(keybind ^V "Find File") X(keybind ^W "Save File") X(keybind ^X "Prefix Extend") X(keybind ^Y "Un-kill") X(keybind ^Z "End of Line") X(keybind "^\" "Quoted Insert") X(keybind ^_ "Move to Window Bottom") X(keybind ^^ "Set/Pop Mark") X(keybind ^] "Goto Line") X X; ESC char X(keybind ^[ "Prefix Meta") X(keybind M-0 "Argument Digit") X(keybind M-1 "Argument Digit") X(keybind M-2 "Argument Digit") X(keybind M-3 "Argument Digit") X(keybind M-4 "Argument Digit") X(keybind M-5 "Argument Digit") X(keybind M-6 "Argument Digit") X(keybind M-7 "Argument Digit") X(keybind M-8 "Argument Digit") X(keybind M-9 "Argument Digit") X(keybind M-A "Append Next Kill") X(keybind M-B "Select Buffer") X(keybind M-C "Uppercase Word") X(keybind M-E "Execute Kbd Macro") X(keybind M-F "Find File") X(keybind M-G "Insert File") X(keybind M-H "Describe") X(keybind M-I "Uppercase Initial") X(keybind M-K "Kill Buffer") X(keybind M-L "Lowercase Region") X(keybind M-M "Mark Paragraph") X(keybind M-N "Buffer Not Modified") X(keybind M-O "Lowercase Word") X(keybind M-P "Forward Paragraph") X(keybind M-Q "Query Replace") X(keybind M-R "Set Profile") X(keybind M-S "Select Existing Buffer") X(keybind M-T "Transpose Characters") X(keybind M-U "Uppercase Region") X(keybind M-W "Transpose Words") X(keybind M-X "Return to Superior") X(keybind M-Y "Un-kill Pop") X(keybind M-Z "Incremental Search") X(keybind M-^ "Exchange Point and Mark") X(keybind M-* "View Kbd Macro") X(keybind M-[ "Prefix Extend") X(keybind M-] "Backward Paragraph") X(keybind M-= "Delete Horizontal Space") X(keybind M-| "Delete Blank Lines") X(keybind "M-," "Move to Window Top") X(keybind "M-;" "Indent for Comment") X(keybind "M-." "Indent Relative") X(keybind "M-/" "Start Kbd Macro") X(keybind "M-\" "End Kbd Macro") X X X; CTRL-X char X(keybind X-1 "One Window") X(keybind X-2 "Two Windows") X(keybind X-A "Up Real Line") X(keybind X-B "Down Real Line") X(keybind X-C "Forward Character") X(keybind X-D "Backward Character") X(keybind X-G "List Buffers") X(keybind X-H "Goto Beginning") X(keybind X-L "Grow Window") X(keybind X-N "Other Window") X(keybind X-P "Shrink Window") X(keybind X-S "Reverse String Search") X(keybind X-T "String Search") X(keybind X-U "Next Screen") X(keybind X-V "Previous Screen") X(keybind X-W "New Window") X(keybind X-X "Return to Superior") X(keybind X-Y "Goto End") X X(keybind X-^A "Up Real Line") X(keybind X-^B "Down Real Line") X(keybind X-^C "Forward Character") X(keybind X-^D "Backward Character") X(keybind X-^G "List Buffers") X(keybind X-^H "Goto Beginning") X(keybind X-^L "Grow Window") X(keybind X-^N "Other Window") X(keybind X-^P "Shrink Window") X(keybind X-^S "Reverse String Search") X(keybind X-^T "String Search") X(keybind X-^U "Next Screen") X(keybind X-^V "Previous Screen") X(keybind X-^W "New Window") X(keybind X-^X "Return to Superior") X(keybind X-^Y "Goto End") X X X(keybind DEL "Delete Character") + END-OF-FILE .ellepro.e chmod 'u=rw,g=r,o=r' \.\e\l\l\e\p\r\o\.\e set `sum \.\e\l\l\e\p\r\o\.\e` sum=$1 case $sum in 54638) :;; *) echo 'Bad sum in '\.\e\l\l\e\p\r\o\.\e >&2 esac echo Extracting \h\e\l\p\.\d\a\t sed 's/^X//' > \h\e\l\p\.\d\a\t << '+ END-OF-FILE '\h\e\l\p\.\d\a\t XThis file describes all ELLE functions, and is in a specific format for use Xby the "Describe" function (normally invoked by the command ^_). X Each function is identified by a number (which matches its Xinternal index as defined by deffun.e), and by a name to the right of Xthe number. All text up to the first blank line is considered part of Xthe documentation for that function. X X<F0> -- undefined -- X This command does not have any defined function assigned to it. X X<F1> Insert Self X The character is inserted into the buffer. X X<F2> Quoted Insert X Reads a character and inserts it. X X<F3> CRLF X Insert CRLF (End Of Line), or move onto blank line. X A blank line is one containing only spaces and tabs X (which are killed if we move onto it). Single blank lines X (followed by nonblank lines) are not eaten up this way. X X<F4> Forward Character X Moves forward one character. X With argument, moves that many characters forward. X Negative args move backward. X X<F5> Backward Character X Moves back one character. X With argument, moves that many characters backward. X Negative args move forward. X X<F6> Delete Character X Deletes character after point. X With argument, kills (and saves) that many characters. X Negative args kill characters backward. X X<F7> Backward Delete Character X Deletes character before point. X With argument, kills (and saves) that many characters. X Negative args kill characters forward. X X<F8> Delete Horizontal Space X Deletes all spaces and tabs around point. X X<F9> Transpose Characters X Transposes the characters before and after the cursor. X X<F10> Forward Word X Moves forward over one word. X X<F11> Backward Word X Moves backward over one word. X X<F12> Kill Word X Kills next word. X X<F13> Backward Kill Word X Kills last word. X X<F14> Transpose Words X Transposes the words before and after the cursor. X X<F15> Uppercase Word X Converts one word to upper case, moving past it. X With arg, applies to that many words backward or forward. X X<F16> Lowercase Word X Converts one word to lower case, moving past it. X With arg, applies to that many words backward or forward. X X<F17> Uppercase Initial X Puts next word in lower case, but capitalize initial. X With arg, applies to that many words backward or forward. X X<F18> reserved X X<F19> reserved X X<F20> Beginning of Line X Moves to beginning of line. X X<F21> End of Line X Moves to end of line. X X<F22> Next Line X Moves to beginning of next line. X X<F23> Previous Line X Moves to beginning of previous line. X X<F24> Down Real Line X Moves down vertically to next real line. X Continuation lines are skipped. If given after the X last LF in the buffer, makes a new one at the end. X X<F25> Up Real Line X Moves up vertically to next real line. X Continuation lines are skipped. X X<F26> Open Line X Inserts an EOL (End Of Line) after point. X Differs from ordinary insertion in that point remains X before the inserted characters. X With argument, inserts several EOLs. X X<F27> Delete Blank Lines X Kills all blank lines around point. X X<F28> Kill Line X Kills to end of line, or kills an end of line (EOL). X At the end of a line (only blanks following), kills through the EOL. X Otherwise, kills the rest of the line but not the EOL. X With argument (positive or negative), kills specified number of lines. X Killed text is pushed onto the kill ring for retrieval. X X<F29> Backward Kill Line X Kills from point backwards to beginning of line. X With argument, same as Kill Line with negative arg. X X<F30> Goto Line X Goes to the line number specified by the argument. The first X line in the buffer is line 1. X X<F31> reserved X X<F32> reserved X X<F33> reserved X X<F34> reserved X X<F35> Set/Pop Mark X Sets or pops the mark. X X<F36> Exchange Point and Mark X Exchanges positions of point and mark. X X<F37> Kill Region X Kills from point to mark. X X<F38> Copy Region X Sticks region into kill-ring without killing it. X Like killing and getting back, but doesn't mark buffer modified. X X<F39> Uppercase Region X Converts region between point and mark to upper case. X X<F40> Lowercase Region X Converts region between point and mark to lower case. X X<F41> Fill Region X Fills the region between point and mark. X X<F42> reserved X X<F43> reserved X X<F44> reserved X X<F45> Forward Paragraph X Moves forward to end of paragraph. X Paragraphs are delimited by blank lines or by X lines which start with "." or "-". X X<F46> Backward Paragraph X Moves backward to beginning of paragraph. X X<F47> Mark Paragraph X Puts point and mark around this paragraph. X X<F48> Fill Paragraph X Fills (or adjusts) this (or next) paragraph. X Point stays the same (but text may move past it due to filling). X X<F49> reserved X X<F50> Select Buffer X Selects or creates buffer with specified name. X If there is a buffer with that name, it is selected. X Otherwise, a buffer with that name is created and selected. X X<F51> Select Existing Buffer X Like Select Buffer but never creates a new buffer. A partial X name may be given. X X<F52> Kill Buffer X Kills the specified buffer. X X<F53> List Buffers X Lists names, lengths, and files of all buffers. X X<F54> Buffer Not Modified X Pretends that this buffer hasn't been modified. X The "*" flag will disappear. X X<F55> EOL CRLF Mode X Toggles the interpretation of EOL (End-Of-Line) for the current X buffer. An EOL may be either a CR-LF (Carriage-Return = ^M, X and LineFeed = ^J) together, or a LF alone. X In LF mode: LF alone is considered to be EOL. X This is the normal mode for Unix systems. X In CRLF mode: both CR and LF must exist to be counted as an EOL. X This is the normal mode for TOPS-20 systems. X X<F56> Goto Beginning X Goes to beginning of buffer. X X<F57> Goto End X Goes to end of buffer. X X<F58> What Page X Reports current position in the buffer in terms of the page X # and line # from the start of the buffer. X X<F59> reserved X X<F60> Find File X Visits (read) a file in its own buffer. X If the file is already in some buffer, selects that buffer. X Otherwise, visits the file in a buffer named after the file. X X<F61> Read File X Reads file into current buffer. Same as Visit File. X X<F62> Visit File X Same as Read File. Reads specified file into current buffer. X X<F63> Insert File X Inserts contents of file into existing text. X The pointer is left at the beginning, and the mark at the end. X X<F64> Save File X Saves buffer if it has been modified, X by writing it out to the file associated with it. X X<F65> Save All Files X Attempts to save all modified files. X With no argument, asks whether to save each one. X With any argument, saves all without asking. X X<F66> Write File X Writes buffer out to specified file. X X<F67> Write Region X Writes region out to specified file. X X<F68> Write Last Kill X Asks for a filename and writes out the most recently killed X stuff to that file. X X<F69> reserved X X<F70> Two Windows X Shows two windows and selects window 2. X X<F71> One Window X Shows only one window. X X<F72> Other Window X Selects other window. X X<F73> Grow Window X Makes this window use more lines. Argument is number of extra X lines (can be negative). X X<F74> Shrink Window X Shrinks the current window by one line. This is the same thing X as using Grow Window on the other window. X With argument, shrinks that many lines. X X<F75> Delete Window X Like "One Window" but ends up with different window. X If using 2 windows, deletes the current window, and X the other window becomes the single remaining window. X X<F76> Standout Window X Toggles the display standout mode for the current window. X With argument of 4, toggles the standout mode for the non-buffer X parts of the screen, such as the ELLE mode line. X With argument of 0, turns standout mode off for all windows. X X<F77> Two Mode Windows X Sets the two-mode-window flag, which is checked whenever there are X two windows in use. Normally set to 1 at startup. X With argument of: X 0 - Use only 1 mode line (at the bottom). X 1 - Use 2 mode lines only if they are in standout mode. X 2 - Always use 2 mode lines, one for each window. X With no argument, toggles the current setting between 0 and 2. X X<F78> New Window X Chooses new window putting point at center, top or bottom. X With no argument, clears the screen and chooses a window X which has point roughly at the center. X An argument gives the line to put point on. X C-U as argument redisplays only the line containing point. X X<F79> Next Screen X Moves down to display next screenful of text. X With argument, moves window down <arg> times (negative moves up). X X<F80> Previous Screen X Moves up to display previous screenful of text. X With arg, moves window back <arg> times. X X<F81> Other New Screen X If using 2 windows, runs "Next Screen" on other window. X X<F82> Line to Window Border X Picks a new window such that the current line is at the top of the X window. X With any argument, makes the current line be at the bottom instead. X X<F83> Scroll Window Up X Scrolls the text up by one line, moving stuff out of the top. X With argument, scrolls that many lines. X X<F84> Scroll Window Down X Scrolls the text down by one line, moving stuff out of the bottom. X With argument, scrolls that many lines. X X<F85> Move to Window Top X Moves cursor to top line of window. X X<F86> Move to Window Bottom X Moves cursor to bottom line of window (or end of buffer). X X<F87> reserved X X<F88> reserved X X<F89> reserved X X<F90> Set Profile X Asks for the name of an ELLE profile file X and sets the command mappings as specified by the file. X X<F91> Prefix Meta X Sets Meta-bit of following character. X E.G. Turns a following A into Meta-A. X X<F92> Prefix Extend X This is an extended command prefix with many subcommands. X X<F93> Universal Arg X Sets argument or multiplies it by four. X Followed by digits, uses them to specify the X argument for the command after the digits. X If not followed by digits, multiplies the argument by four. X X<F94> Negative Argument X Starts an argument collection, like Universal Arg, but X makes the resulting arg negative. X X<F95> Argument Digit X Collects an argument for the next command, starting with this X digit. X X<F96> VT100 Button Hack X Attempts to map VT-100 function buttons into something X useful. Not really supported. X X<F97> Describe X Asks the user for a command and displays a brief description X of the function it invokes. X X<F98> reserved X X<F99> reserved X X<F100> Start Kbd Macro X Starts collecting a keyboard macro. Everything typed X after this command, up to an "End Kbd Macro" command, will X be both executed and stored as the definition of the current X keyboard macro. X X<F101> End Kbd Macro X Stops collecting a keyboard macro. X X<F102> Execute Kbd Macro X Executes the currently defined keyboard macro. X X<F103> View Kbd Macro X Shows the currently defined keyboard macro. X X<F105> Un-kill X Re-inserts the last stuff killed. X Puts point after it and the mark before it. X X<F106> Un-kill Pop X Corrects after Un-kill to use an earlier kill. X Requires that the region contain the most recent killed stuff, X as it does immediately after using Un-kill. X It is deleted and replaced with the previous killed stuff, X which is rotated to the front of the ring buffer. X X<F107> Append Next Kill X Makes following kill commands append to last batch. X Thus, C-K C-K, cursor motion, this command, and C-K C-K, X generate one block of killed stuff, containing two lines. X X<F108> reserved X X<F109> reserved X X<F110> String Search X Searches forward for string. Asks for a string; CR or ESCAPE X terminates the string. X X<F111> Reverse String Search X Searches backward for string. Asks for a string; CR or ESCAPE X terminates the string. X X<F112> Incremental Search X Searches for character string as you type it. X C-Q quotes special characters. DEL cancels last character. X C-S repeats the search, forward, and C-R repeats it backward. X C-R or C-S with search string empty changes the direction of search X or brings back search string from previous search. X ESCAPE exits the search; with search string empty X it switches to non-incremental String Search. X Other Control and Meta chars exit the search and then are executed. X If not all the input string can be found, the rest is not discarded. X You can rub it out, discard it all with C-G, exit, X or use C-R or C-S to search the other way. X Quitting a successful search aborts the search and moves point back; X quitting a failing search just discards whatever input wasn't found. X X<F113> Reverse Search X Does reverse Incremental Search. X See info for Incremental Search. X X<F114> Replace String X Replaces one string with another, globally. X Works by calling Query Replace and pretending you typed a !. X X<F115> Query Replace X Replaces a string interactively. X Asks for "Replace string:" (you type old string, eg FOO) X Then asks " with string:" (you type new string, eg BAR) X Then moves to and shows each each occurrence of FOO, X and you must then type a character to say what to do: X ? => Shows brief summary of this list. X Space => replace it with BAR and show next FOO. X DEL => don't replace, but show next FOO. X ^L => redisplay screen. X ^ => return to site of previous FOO (actually, jump to mark). X ! => replace all remaining FOOs without asking. X ESCAPE => just exit. X . => replace this FOO and exit. X , => replace this FOO and show result, waiting for next command. X Not yet: ^W => kill this FOO and enter recursive editing level. X Not yet: ^R => enter recursive editing level. X Any other character exits and is read again. X X<F116> Replace in Line X Like Replace String but only operates on the current line. X Asks for the string to replace, then the string to replace it with. X X<F117> Set Fill Column X Sets fill column to numeric arg or current column. X If there is an argument, that is used. X Otherwise, the current position of the cursor is used. X The Fill Column variable controls where Auto Fill mode X and Fill Paragraph put the right margin. X X<F118> Set Fill Prefix X EMACS: Defines Fill Prefix from current line. X All of the current line up to point becomes the value X of Fill Prefix. Auto Fill Mode and Linefeed insert the X prefix on each line; ^R Fill Region assumes that each X non-blank line starts with the prefix (which is ignored X for filling purposes). X To stop using a Fill Prefix, do ^R Set Fill Prefix X at the front of a line. X X<F119> Auto Fill Mode X Turns Auto Fill mode on and off. When on, the word X "Fill" will appear in the mode line, and typing a space X when beyond the current Fill Column will cause the X current line to be automatically filled. X X<F120> Text Mode X An IMAGEN-specific function. Resembles Auto Fill Mode. X X<F121> Indent According to Mode X Indents suitably for the major mode. X In Fundamental mode, just inserts a tab. X X<F122> Indent New Line X Inserts CRLF (End Of Line), then indents the second line. X Uses the definitions of CR and Tab to do the work. X X<F123> Back to Indentation X Moves to end of current line's indentation. X X<F124> Indent for Comment X Moves to start of existing comment or creates new one, X and indents it to start in Comment Column. X This doesn't work well yet. X X<F125> Indent Relative X Attempts to indent current line by the same amount as the X previous line. X X<F126> reserved X X<F127> reserved X X<F128> reserved X X<F129> Match Bracket X Similar to EMACS' "Show Matching Paren". X X<F130> Push to Inferior X Starts an inferior shell process. Exitting this shell will X return to ELLE. X X<F131> Return to Superior X If system permits, returns directly to superior shell in a way which X allows later continuation of ELLE. Otherwise, asks "Quit?" and X warns of modified buffers if any exist. Responding "Y" and CR X will then cause ELLE to exit permanently (no continuation possible). X X<F132> Write File Exit X Calls "Save All Files" and then exits (no continuation possible). X X; 133-139 reserved X X<F140> Hit Breakpoint X This is a debugging function which calls the "bkpt" X routine in ELLE, assuming that the user has set a X debugging breakpoint there. If no breakpoint has X been set (by ADB or otherwise) then nothing happens. X X<F141> Debug Mode X With no argument, turns self-checking on and off. When X self-checking is on, the data structures will be verified X after each top-level command. (This may be quite slow). X With an argument, invokes ELLE's debug/diagnostic mode, which X has the prompt "D>". Type "?" and CR for a list of subcommands. X X; 142-149 reserved X XIMAGEN-specific functions. These can only exist in the IMAGEN configuration Xof ELLE. X X<F150> Execute Unix Command X An IMAGEN-specific function. X X<F151> Execute Make X An IMAGEN-specific function. X X<F152> Find Next Error X An IMAGEN-specific function. X X XICONOGRAPHICS-dependent functions. These will not be found in Xanything other than the ICONOGRAPHICS configuration of ELLE. X X<F153> ICO Extend Command X An Iconographics-specific function. X X<F154> ICO Typeset Funs X An Iconographics-specific function. X X<F155> ICO Spec Input Funs X An Iconographics-specific function. X X XSUN-specific functions. X These functions are used to handle text selection and stuffing Xwhen using the mouse version of ELLE. X X<F156> Stuff Selection X Inserts the current mouse text selection into the buffer. X X<F157> Select Region X Makes the current region be the current mouse text selection. X X + END-OF-FILE help.dat chmod 'u=rw,g=r,o=r' \h\e\l\p\.\d\a\t set `sum \h\e\l\p\.\d\a\t` sum=$1 case $sum in 41527) :;; *) echo 'Bad sum in '\h\e\l\p\.\d\a\t >&2 esac exit 0
Postmaster@locke.bitnet (PMDF Mail Server) (12/21/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 10:05 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 2524 for MINIX@UWALOCKE; Sun, 20 Dec 87 10:05 PST Received: by NDSUVM1 (Mailer X1.24) id 2489; Sun, 20 Dec 87 12:02:27 CST Date: 19 Dec 87 21:32:52 GMT From: Harry Henderson <hrh@well.uucp> Subject: Minix on PS/2s Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU Has anyone gotten Minix working on the IBM PS/2 (model 50 or higher)? Any plans to support it officially? -- The opinions expressed are my own, but you're welcome to share them. Harry Henderson (freelance technical editor/writer).
Postmaster@locke.bitnet (PMDF Mail Server) (12/21/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 14:01 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 3255 for MINIX@UWALOCKE; Sun, 20 Dec 87 14:00 PST Received: by NDSUVM1 (Mailer X1.24) id 3208; Sun, 20 Dec 87 15:58:58 CST Date: 20 Dec 87 19:39:37 GMT From: Alan Bishop <bishop@ecsvax.uucp> Subject: Re: Minix on PS/2s Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU In article <4781@well.UUCP> hrh@well.UUCP (Harry Henderson) writes: >Has anyone gotten Minix working on the IBM PS/2 (model 50 or >higher)? I am working on it (model 60) and have a three person mailing list of others who are interested. I will add you to it. So far, I have MINIX up and running with floppy only. I have rewritten the floppy driver to use BIOS calls, so the system waits while the floppy is being serviced. However, later AT and all PS/2 BIOSes have hooks to deal with this, so these will eventually be put in. I just redid the hard disk driver last night, but for some reason the system hangs whenever a read is attempted. I'll be looking into this over the next few days. Although the fixes are in no really distributable form right now, if you or anyone needs them now, I can send you some quick fixes to at least get you running. I probably will post the BIOS drivers when I get everything running, and then again when the busy-wait hooks have been put in. alan
Postmaster@locke.bitnet (PMDF Mail Server) (12/21/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 16:43 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 3967 for MINIX@UWALOCKE; Sun, 20 Dec 87 16:42 PST Received: by NDSUVM1 (Mailer X1.24) id 3929; Sun, 20 Dec 87 18:39:14 CST Date: 20 Dec 87 14:34:03 GMT From: Andy Tanenbaum <ast@cs.vu.nl> Subject: Makefile for ELLE that I used on PC-IX Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU For those of you who want to fetch the ELLE sources and work on them, be warned that the MINIX make program can't handle the way Ken did things. In particular, when you invoke make, the makefile makes another makefile that is then executed. The MINIX make first parses the entire makefile, and dies because it encounters macros that will only be defined when the other makefile is executed. Since the semantics of makefiles are defined nowhere, it is hard to tell if this is a bug, a feature or what. In any case, I just made up my own little makefile for use on PC-IX. Here it is. Andy Tanenbaum (ast@cs.vu.nl) ---------------------- ELLE Makefile for PC-IX ---------------------- l=/usr/ast/minix/lib CFLAGS = -I/usr/ast/minix/include CONFS = defprf.c eefdef.h eefidx.h deffun.e OBJ= eebit.o eebuff.o eecmds.o eedisp.o eeedit.o eeerr.o eef1.o eef2.o \ eef3.o eefd.o eefed.o eefile.o eehelp.o eekmac.o eemain.o \ eequer.o eeques.o eesite.o eesrch.o eeterm.o eevini.o sbbcpy.o \ sberr.o sbm.o sbstr.o termcap.o eediag.o eefill.o minix.o elle: $(OBJ) elle.h eesite.h ld -i -s -o xelle $l/crtso.o $(OBJ) $l/libc.a $l/end.o conf: cat deffun.e defprf.e | ellec -Pconf > defprf.c cat deffun.e defprf.e | ellec -Fconf > eefdef.h cat deffun.e defprf.e | ellec -FXconf > eefidx.h rm -f eecmds.o ellec: ellec.c eesite.h defprf.e cc -o ellec ellec.c eecmds.o: eecmds.c ellec $(CONFS) make conf cc -c eecmds.c
Postmaster@locke.bitnet (PMDF Mail Server) (12/21/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 17:59 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 4423 for MINIX@UWALOCKE; Sun, 20 Dec 87 17:57 PST Received: by NDSUVM1 (Mailer X1.24) id 4374; Sun, 20 Dec 87 19:56:17 CST Date: 21 Dec 87 01:41:14 GMT From: SECAD-guest <mbeck@amsaa-seer.arpa> Subject: MINIX on a '386? Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: Warning -- original Sender: tag was mmdf@UDEL.EDU Comments: To: info-minix@UDEL.EDU Hello - Some time ago I tried booting MINIX 1.1 on a Tandy Model 4000.. and saw the boot message pop up. Unfortunately, the hardware was not set to MINIX requirements and I could not continue the load. However, after having tried 1.1 on about 10 different machines, I was reasonably confident that it would run on a 4000. Has anyone tried MINIX 1.[12?] on other '386-based AT-style hardware? Please respond with e-mail direct.. if enough queries/requests, I'll summarize and post to the group. Regards, Mark Becker ...amsaa-seer!mbeck mbeck@AMSAA-SEER.ARPA (Or whatever path your machine likes..)
Postmaster@locke.bitnet (PMDF Mail Server) (12/21/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 19:28 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 5121 for MINIX@UWALOCKE; Sun, 20 Dec 87 19:28 PST Received: by NDSUVM1 (Mailer X1.24) id 5073; Sun, 20 Dec 87 21:26:25 CST Date: 20 Dec 87 19:35:33 GMT From: Johan Stevenson <johan@nlgvax.uucp> Subject: Re: MINIX on a 68000 Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU In article <2494@druhi.ATT.COM> mjohnson@druhi.ATT.COM (JohnsonMA) writes: >A few months back there were numerous postings about Beta testers for a >version of MINIX that ran on 68000, Atari ST's in particular. Would >someone care to update us on how that work is going? Will the final >product be sold through Prentice-Hall? Many of us are waiting with >bated breath. Minix-ST is really in the works and will be distributed by Prentice-Hall. It will be spring 88 before it is available. Johan W. Stevenson, Philips Research Laboratories, Project Centre Geldrop, Building XR, Room 15, Willem Alexanderlaan 7B, 5664 AN Geldrop, The Netherlands. phone: +31 40 892205 uucp: mcvax!nlgvax!johan
Postmaster@locke.bitnet (PMDF Mail Server) (12/21/87)
The message could not be delivered to: Addressee: MINIX Reason: %MAIL-E, no such user MINIX at node LOCKE ---------------------------------------- Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 19:47 PST Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 5394 for MINIX@UWALOCKE; Sun, 20 Dec 87 19:47 PST Received: by NDSUVM1 (Mailer X1.24) id 5335; Sun, 20 Dec 87 21:44:54 CST Date: 18 Dec 87 17:28:28 GMT From: Bob Best <bob@dhw68k.cts.com> Subject: Re: P-H has MINIX in stock (finally) Sender: Minix operating system <MINIX-L@NDSUVM1> To: Local Redistribution <MINIX@locke> Reply-to: INFO-MINIX@UDEL.edu Comments: To: info-minix@UDEL.EDU In article <1779@botter.cs.vu.nl> ast@cs.vu.nl (Andy Tanenbaum) writes: > >I talked to P-H yesterday. Version 1.2 of MINIX in 256K & 640K PC, 512K AT, >mag tape, and the IBM slipcase version with the abridged book are all >in stock. > >Andy Tanenbaum (ast@cs.vu.nl) After having waited one month for delivery, I finally received the Minix version 1.1 (!) disks for the IBM-PC 640k system. I immediately called Prentice-Hall and spoke to a man by the name of Jim Fagan who told me that the disks for version 1.2 would *not* be available for shipment until February 1988. He also told me that the changes in version 1.2 were relevant only to the IBM-AT version hard disk support, and, hence, were of no consequence to the IBM-PC disks that I ordered. It was my understanding that the source code for IBM-AT specific device drivers are included with the IBM-PC disk set, and I would expect the IBM-PC disks to contain any revisions pertaining to the IBM-AT. Since I intend to run Minix on both systems, I require working drivers for both the PC and AT. It would seem that there is still some confusion and/or misinformation surrounding the distribution of the Minix software. Does anybody *really* know what is happening here? I am sure that all Minix enthusiasts agree that Dr. Tanenbaum's brilliant contribution deserves better handling and support. In the meantime, could someone please direct me to a convenient source for the version 1.2 diffs. I have abandoned hope of ever getting them from P-H. -- Bob Best uucp: ...{trwrb,hplabs}!felix!dhw68k!bob InterNet: bob@dhw68k.cts.com
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/25/88)
Your message could not be delivered to: EAMATEO Your message has been enqueued and undeliverable for 3 days. The mail system will continue to try to deliver your message for an additional 9 days. The beginning of your message follows:
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/28/88)
Your message could not be delivered to: EAMATEO Your message has been enqueued and undeliverable for 6 days. The mail system will continue to try to deliver your message for an additional 6 days. The beginning of your message follows:
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/28/88)
The message could not be delivered to: Addressee: EAMATEO Reason: %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI ---------------------------------------- Received: from JNET-DAEMON by EBRUPC51; Wed, 28 Sep 88 15:23 N Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4075 for EAMATEO@EBRUPC51; Wed, 28 Sep 88 15:21 N Received: by EB0UB011 (Mailer X1.25) id 8989; Wed, 28 Sep 88 15:20:49 HOE Date: Tue, 27 Sep 88 14:47:58 GMT From: Rob McMahon <cudcv@WARWICK.AC.UK> Subject: Re: GNU c and c++ under MINIX Sender: Minix operating system <MINIX-L@FINHUTC.BITNET> To: NACHO NAVARRO <EAMATEO@EBRUPC51> Reply-to: INFO-MINIX@UDEL.EDU Comments: Warning -- original Sender: tag was info-minix-request@UDEL.EDU Comments: To: info-minix@UDEL.EDU In article <1720001@hpqtdla.HP.COM> rana@hpqtdla.HP.COM (Rana Raychoudhury) writes: > "The main goal of GNU CC was to make a god, fast compiler for machines in > the class that the GNU system aims to run on: 32-bit machines that address > 8-bit bytes and have several general registers........" > ^^^^^^^^^^^^^^^^^^^^^^^^^ Whilst GCC would like to use several registers, and much of its optimization effort goes into allocating registers well, this doesn't mean it wouldn't work on a machine with fewer registers. > "GNU CC does not contain machine dependent code, but it does contain code > that depends on machine parameters such as endianness (whether ths most > significant byte has the highest or lowest address of the bytes in a word) > and the availability of autoincrement addressing......" > ^^^^^^^^^^^^^^^^^^^^^^^^ The code that depends on such features is all #ifdef'ed, it doesn't *require* such features, it just uses them if they're available. There are certainly machines without auto-increment that run GCC (I'm on one now), and it runs on machines of both types of endianness. > Now, porting gcc to *minix* may not be a problem per se, but running gcc on > machines without certain features (above) will be. From the text above, it > would appear that porting gcc to Intel 80X8X architectures MAY be > difficult. The problems you cite are not the real problems, I should think the problem is going to be: cudcv (53) %> size /usr/local/lib/gnu/gcc/cc1 text data bss dec hex 417792 40960 21744 480496 754f0 Sun-3 581632 16384 18752 616768 96940 SPARC 655360 49152 13920 718432 af660 Gould cudcv (54) %> (cc1 is the compiler pass, this is on a Sun-3) Rob -- UUCP: ...!mcvax!ukc!warwick!cudcv PHONE: +44 203 523037 JANET: cudcv@uk.ac.warwick ARPA: cudcv@warwick.ac.uk Rob McMahon, Computing Services, Warwick University, Coventry CV4 7AL, England
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)
The message could not be delivered to: Addressee: EAMATEO Reason: %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI ---------------------------------------- Received: from JNET-DAEMON by EBRUPC51; Wed, 28 Sep 88 16:29 N Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4425 for EAMATEO@EBRUPC51; Wed, 28 Sep 88 16:28 N Received: by EB0UB011 (Mailer X1.25) id 9507; Wed, 28 Sep 88 16:27:44 HOE Date: Tue, 27 Sep 88 20:56:11 GMT From: Andy Tanenbaum <ast@CS.VU.NL> Subject: V1.3c posting #8 - h Sender: Minix operating system <MINIX-L@FINHUTC.BITNET> To: NACHO NAVARRO <EAMATEO@EBRUPC51> Reply-to: INFO-MINIX@UDEL.EDU Comments: Warning -- original Sender: tag was info-minix-request@UDEL.EDU Comments: To: info-minix@UDEL.EDU : This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. : --------------------------- cut here -------------------------- PATH=/bin:/usr/bin:/usr/ucb echo Extracting 'LISTING' sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING' X-rw-r--r-- 1 ast 356 Sep 26 22:50 const.h.cdif X-rw-r--r-- 1 ast 674 Sep 26 22:50 sgtty.h.cdif + END-OF-FILE LISTING chmod 'u=rw,g=r,o=r' 'LISTING' set `wc -c 'LISTING'` count=$1 case $count in 116) :;; *) echo 'Bad character count in ''LISTING' >&2 echo 'Count should be 116' >&2 esac echo Extracting 'const.h.cdif' sed 's/^X//' > 'const.h.cdif' << '+ END-OF-FILE ''const.h.cdif' X*** /local/ast/minix/tape3b/h/const.h Mon Jul 18 16:21:13 1988 X--- const.h Mon Sep 26 13:04:33 1988 X*************** X*** 9,15 **** X X #ifndef i8088 X #ifndef ATARI_ST X! #Either_i8088_or_ATARI_ST_must_be_defined X #endif X #endif X X--- 9,15 ---- X X #ifndef i8088 X #ifndef ATARI_ST X! #error Either i8088 or ATARI ST must be defined X #endif X #endif X + END-OF-FILE const.h.cdif chmod 'u=rw,g=r,o=r' 'const.h.cdif' set `wc -c 'const.h.cdif'` count=$1 case $count in 356) :;; *) echo 'Bad character count in ''const.h.cdif' >&2 echo 'Count should be 356' >&2 esac echo Extracting 'sgtty.h.cdif' sed 's/^X//' > 'sgtty.h.cdif' << '+ END-OF-FILE ''sgtty.h.cdif' X*** /local/ast/minix/tape3b/h/sgtty.h Wed Jul 13 11:56:57 1988 X--- sgtty.h Mon Sep 26 13:04:34 1988 X*************** X*** 1,8 **** X /* Data structures for IOCTL. */ X X struct sgttyb { X! char sg_ispeed; /* input speed (not used) */ X! char sg_ospeed; /* output speed (not used) */ X char sg_erase; /* erase character */ X char sg_kill; /* kill character */ X int sg_flags; /* mode flags */ X--- 1,8 ---- X /* Data structures for IOCTL. */ X X struct sgttyb { X! char sg_ispeed; /* input speed */ X! char sg_ospeed; /* output speed */ X char sg_erase; /* erase character */ X char sg_kill; /* kill character */ X int sg_flags; /* mode flags */ + END-OF-FILE sgtty.h.cdif chmod 'u=rw,g=r,o=r' 'sgtty.h.cdif' set `wc -c 'sgtty.h.cdif'` count=$1 case $count in 674) :;; *) echo 'Bad character count in ''sgtty.h.cdif' >&2 echo 'Count should be 674' >&2 esac exit 0
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)
The message could not be delivered to: Addressee: EAMATEO Reason: %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI ---------------------------------------- Received: from JNET-DAEMON by EBRUPC51; Wed, 28 Sep 88 16:37 N Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4471 for EAMATEO@EBRUPC51; Wed, 28 Sep 88 16:35 N Received: by EB0UB011 (Mailer X1.25) id 9561; Wed, 28 Sep 88 16:34:30 HOE Date: Tue, 27 Sep 88 20:40:44 GMT From: Andy Tanenbaum <ast@CS.VU.NL> Subject: V1.3c posting #1 - introduction Sender: Minix operating system <MINIX-L@FINHUTC.BITNET> To: NACHO NAVARRO <EAMATEO@EBRUPC51> Reply-to: INFO-MINIX@UDEL.EDU Comments: Warning -- original Sender: tag was info-minix-request@UDEL.EDU Comments: To: info-minix@UDEL.EDU Well, I am (hopefully) done with 1.3. There were a lot of changes that people suggested for 1.3b, so here comes 1.3c. If nobody complains within a week or so, I'll send it off to Prentice-Hall and that will be the end of 1.3. The cdiffs that follow are all relative to 1.3b. After upgrading from 1.3b to 1.3c, please keep the full set of 1.3c files on diskette, so we can use that as a base for diffs during the coming year. I do not plan to do 1.4 until I have rewritten my architecture book, something that may take a year. I will discuss plans for 1.4 later. If you are completely lost with 1.1 -> 1.2 -> 1.3a -> 1.3b -> 1.3c now, I will make an upgrade kit that P-H will sell starting around Dec. That will simply be all the 1.3c sources plus the 1.2 compiler binaries and elle. The 1.3 compiler is identical to the 1.2 compiler. For those of you who tuned in late, there is a Pascal compiler as well, available from UniPress and Transmediair (see the preface of the book for their addresses). Please don't call P-H about the upgrade kit until around Dec. They will be all confused. The kernel has been modified quite a bit. I split tty.c into 5 files: tty.h, ttymaps.h, tty.c, console.c, and rs232.c. Mostly because I thought the latter was such a cute name. I saw the new tty.c from Down Under, but I prefer to stick with mine. At least I understand that one (sort of). Changes and improvements to it are welcome, but I am not going to throw it away. One improvement I'd love to make is throw out all that garbage about EGA hardware. I am somewhat unclear why it got added in the first place. If the only reason is to prevent losing RS232 characters during software scrolling, I hope somebody can attack that problem directly. I would very much like to have 2 scrolling algorithms included, toggled by F3: 6845 hardware, and software. This will make the code cleaner. Any suggestions for making the whole tty business smaller are worth making. I hope the extended keyboard is supported properly. Comments are welcome. V1.3c should run on the PS/2 model 30. When booting, type u or d instead of =. Feedback on this is very much desired. I have no idea about other models. Feedback is sort of desired, but IBM being what it is, I fear the worst. Index to 1.3c postings ---------------------- P0 - this file P1 - include P2 - lib P3 - commands 1 of 3 P4 - commands 2 of 3 P5 - commands 3 of 3 P6 - tools P7 - doc P8 - h P9 - mm P10 - fs P11 - kernel 1 of 3 P12 - kernel 2 of 3 P13 - kernel 3 of 3
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)
The message could not be delivered to: Addressee: EAMATEO Reason: %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI ---------------------------------------- Received: from JNET-DAEMON by EBRUPC51; Wed, 28 Sep 88 16:59 N Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4533 for EAMATEO@EBRUPC51; Wed, 28 Sep 88 16:57 N Received: by EB0UB011 (Mailer X1.25) id 9601; Wed, 28 Sep 88 16:56:11 HOE Date: Tue, 27 Sep 88 20:42:01 GMT From: Andy Tanenbaum <ast@CS.VU.NL> Subject: V1.3c posting #1 include files (sorry- intro is 0) Sender: Minix operating system <MINIX-L@FINHUTC.BITNET> To: NACHO NAVARRO <EAMATEO@EBRUPC51> Reply-to: INFO-MINIX@UDEL.EDU Comments: Warning -- original Sender: tag was info-minix-request@UDEL.EDU Comments: To: info-minix@UDEL.EDU : This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. : --------------------------- cut here -------------------------- PATH=/bin:/usr/bin:/usr/ucb echo Extracting 'LISTING' sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING' Xtotal 9 X-rw-r--r-- 1 ast 351 Sep 26 22:22 fcntl.h.new X-rw-r--r-- 1 ast 2132 Sep 26 22:22 limits.h.new X-rw-r--r-- 1 ast 81 Sep 26 22:22 memory.h.new X-rw-r--r-- 1 ast 263 Sep 26 22:22 string.h.new X-rw-r--r-- 1 ast 352 Sep 26 22:22 unistd.h.new X-rw-r--r-- 1 ast 74 Sep 26 22:22 utime.h.new X-rw-r--r-- 1 ast 217 Sep 26 22:22 utmp.h.new + END-OF-FILE LISTING chmod 'u=rw,g=r,o=r' 'LISTING' set `wc -c 'LISTING'` count=$1 case $count in 410) :;; *) echo 'Bad character count in ''LISTING' >&2 echo 'Count should be 410' >&2 esac echo Extracting 'fcntl.h.new' sed 's/^X//' > 'fcntl.h.new' << '+ END-OF-FILE ''fcntl.h.new' X/* For fcntl(3) */ X X#define F_DUPFD 0 X#define F_GETFD 1 /* reserved for future use */ X#define F_SETFD 2 /* reserved for future use */ X#define F_GETFL 3 /* reserved for future use */ X#define F_SETFL 4 /* reserved for future use */ X X/* For open(2) */ X X#define O_RDONLY 0 X#define O_WRONLY 1 X#define O_RDWR 2 + END-OF-FILE fcntl.h.new chmod 'u=rw,g=r,o=r' 'fcntl.h.new' set `wc -c 'fcntl.h.new'` count=$1 case $count in 351) :;; *) echo 'Bad character count in ''fcntl.h.new' >&2 echo 'Count should be 351' >&2 esac echo Extracting 'limits.h.new' sed 's/^X//' > 'limits.h.new' << '+ END-OF-FILE ''limits.h.new' X/* limits.h */ X X#define CHAR_BIT 8 /* number of bits in char */ X#define WORD_BIT 16 /* number of bits in int */ X#define CHAR_MAX 127 /* max value of char */ X#define CHAR_MIN -128 /* min value of char */ X#define SCHAR_MAX 127 /* max value of signed char */ X#define SCHAR_MIN -128 /* min value of signed char */ X#define UCHAR_MAX 255 /* max value of unsigned char */ X#define SHRT_MAX 32767 /* max value of short */ X#define SHRT_MIN -32768 /* min value of short */ X#define USHRT_MAX 65535 /* max value of unsigned short */ X#define INT_MAX 32767 /* max value of int */ X#define INT_MIN -32768 /* min value of int */ X#define UINT_MAX 65535 /* max value of unsigned int */ X#define LONG_MAX 2147483647 /* max value of long */ X#define LONG_MIN -2147483648 /* min value of long */ X#define ULONG_MAX 4294967295 /* max value of unsigned long */ X X#define NAME_MAX 14 /* characters in a file name */ X#define PATH_MAX 127 /* number chars in path name */ X /* SHOULD BE >= 255 */ X#define FCHR_MAX 67108864 /* max file size */ X#define LINK_MAX 127 /* max links to a file */ X#define LOCK_MAX 0 /* max number of file locks */ X /* SHOULD BE >= 32 */ X#define OPEN_MAX 20 /* max number open files */ X#define SYS_OPEN 64 /* max open files per system */ X#define STD_BLK 1024 /* bytes per block */ X#define PIPE_MAX 7168 /* max size of write to pipe */ X#define PIPE_BUF PIPE_MAX /* size of atomic write to pipe */ X X#define PID_MAX 30000 /* max process id */ X#define PROC_MAX 16 /* max number of processes */ X#define CHILD_MAX (PROC_MAX-1) /* number of process children */ X#define NGROUPS_MAX 0 /* no multiple group ids */ X#define UID_MAX 255 /* max user or group id */ X /* SHOULD BE >= 32000 */ X#define ARG_MAX 2048 /* execve() arg & environ space */ X /* SHOULD BE >= 4096 */ X X#define CLK_TCK 60 /* clock ticks per second */ X#define MAX_CHAR 256 /* characters for terminal i/p */ X#define PASS_MAX 8 /* max number chars in password */ X#define SYS_NMLN 9 /* length of uname() strings */ X /* including '\0' */ + END-OF-FILE limits.h.new chmod 'u=rw,g=r,o=r' 'limits.h.new' set `wc -c 'limits.h.new'` count=$1 case $count in 2132) :;; *) echo 'Bad character count in ''limits.h.new' >&2 echo 'Count should be 2132' >&2 esac echo Extracting 'memory.h.new' sed 's/^X//' > 'memory.h.new' << '+ END-OF-FILE ''memory.h.new' Xchar *memcpy(); Xchar *memccpy(); Xchar *memchr(); Xchar *memset(); Xint memcmp(); + END-OF-FILE memory.h.new chmod 'u=rw,g=r,o=r' 'memory.h.new' set `wc -c 'memory.h.new'` count=$1 case $count in 81) :;; *) echo 'Bad character count in ''memory.h.new' >&2 echo 'Count should be 81' >&2 esac echo Extracting 'string.h.new' sed 's/^X//' > 'string.h.new' << '+ END-OF-FILE ''string.h.new' X/* string.h (a.k.a. strings.h) */ X Xint strlen(); Xint strcmp(), strncmp(); Xint strspn(), strcspn(); X Xchar *strcpy(), *strncpy(); Xchar *strcat(), *strncat(); Xchar *index(), *rindex(); Xchar *strchr(), *strrchr(); Xchar *strpbrk(); Xchar *strtok(); Xchar *strstr(); + END-OF-FILE string.h.new chmod 'u=rw,g=r,o=r' 'string.h.new' set `wc -c 'string.h.new'` count=$1 case $count in 263) :;; *) echo 'Bad character count in ''string.h.new' >&2 echo 'Count should be 263' >&2 esac echo Extracting 'unistd.h.new' sed 's/^X//' > 'unistd.h.new' << '+ END-OF-FILE ''unistd.h.new' X/* For access(2) */ X X#define R_OK 4 X#define W_OK 2 X#define X_OK 1 X#define F_OK 0 X X/* For lockf() */ X X#define F_ULOCK 0 X#define F_LOCK 1 X#define F_TLOCK 2 X#define F_TEST 3 X X/* For lseek(2) */ X X#define SEEK_SET 0 X#define SEEK_CUR 1 X#define SEEK_END 2 X X#define IN_PATH "/etc/include" + END-OF-FILE unistd.h.new chmod 'u=rw,g=r,o=r' 'unistd.h.new' set `wc -c 'unistd.h.new'` count=$1 case $count in 352) :;; *) echo 'Bad character count in ''unistd.h.new' >&2 echo 'Count should be 352' >&2 esac echo Extracting 'utime.h.new' sed 's/^X//' > 'utime.h.new' << '+ END-OF-FILE ''utime.h.new' X/* For utime(2) */ X Xstruct utimbuf { X time_t actime; X time_t modtime; X}; + END-OF-FILE utime.h.new chmod 'u=rw,g=r,o=r' 'utime.h.new' set `wc -c 'utime.h.new'` count=$1 case $count in 74) :;; *) echo 'Bad character count in ''utime.h.new' >&2 echo 'Count should be 74' >&2 esac echo Extracting 'utmp.h.new' sed 's/^X//' > 'utmp.h.new' << '+ END-OF-FILE ''utmp.h.new' X/* utmp.h - Used by login(1), init, and who(1) */ X X#define WTMP "/usr/adm/wtmp" X Xstruct utmp X{ X char ut_line[8]; /* terminal name */ X char ut_name[8]; /* user name */ X long ut_time; /* login/out time */ X}; + END-OF-FILE utmp.h.new chmod 'u=rw,g=r,o=r' 'utmp.h.new' set `wc -c 'utmp.h.new'` count=$1 case $count in 217) :;; *) echo 'Bad character count in ''utmp.h.new' >&2 echo 'Count should be 217' >&2 esac exit 0
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)
The message could not be delivered to: Addressee: EAMATEO Reason: %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI ---------------------------------------- Received: from JNET-DAEMON by EBRUPC51; Wed, 28 Sep 88 17:03 N Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4538 for EAMATEO@EBRUPC51; Wed, 28 Sep 88 17:00 N Received: by EB0UB011 (Mailer X1.25) id 9607; Wed, 28 Sep 88 16:59:02 HOE Date: Tue, 27 Sep 88 20:56:51 GMT From: Andy Tanenbaum <ast@CS.VU.NL> Subject: V1.3c posting #9 - mm Sender: Minix operating system <MINIX-L@FINHUTC.BITNET> To: NACHO NAVARRO <EAMATEO@EBRUPC51> Reply-to: INFO-MINIX@UDEL.EDU Comments: Warning -- original Sender: tag was info-minix-request@UDEL.EDU Comments: To: info-minix@UDEL.EDU : This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. : --------------------------- cut here -------------------------- PATH=/bin:/usr/bin:/usr/ucb echo Extracting 'LISTING' sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING' Xtotal 8 X-rw-r--r-- 1 ast 1833 Sep 26 22:51 at_makefile X-rw-r--r-- 1 ast 1715 Sep 26 22:51 exec.c.cdif X-rw-r--r-- 1 ast 375 Sep 26 22:51 forkexit.c.cdif X-rw-r--r-- 1 ast 1890 Sep 26 22:51 pc_makefile X-rw-r--r-- 1 ast 323 Sep 26 22:51 signal.c.cdif + END-OF-FILE LISTING chmod 'u=rw,g=r,o=r' 'LISTING' set `wc -c 'LISTING'` count=$1 case $count in 299) :;; *) echo 'Bad character count in ''LISTING' >&2 echo 'Count should be 299' >&2 esac echo Extracting 'at_makefile' sed 's/^X//' > 'at_makefile' << '+ END-OF-FILE ''at_makefile' X# On a PC, cpp and cem are in /lib and will be removed to make space while X# linking the kernel. On an AT, they are in /usr/lib are are not removed. X# This is because they have to be in /lib on a PC; the diskette is too small X# for them to be in /usr/lib. X# X Xh=../h Xl=/usr/lib XCFLAGS = -Di8088 -F -T. X Xobj = main.s forkexit.s break.s exec.s signal.s getset.s \ X alloc.s utility.s table.s putc.s X Xmm: makefile $l/head.s $(obj) $l/libc.a $l/end.s X @echo "Start linking MM." X @asld -o mm -T. $l/head.s $(obj) $l/libc.a $l/end.s X @echo "MM done. " X Xclean: X rm -f $(obj) X Xalloc.s: const.h $h/const.h $h/type.h X Xbreak.s: const.h $h/const.h $h/type.h Xbreak.s: $h/error.h Xbreak.s: $h/signal.h Xbreak.s: glo.h Xbreak.s: mproc.h Xbreak.s: param.h X Xexec.s: const.h $h/const.h $h/type.h Xexec.s: $h/callnr.h Xexec.s: $h/error.h Xexec.s: $h/stat.h Xexec.s: glo.h Xexec.s: mproc.h Xexec.s: param.h X Xforkexit.s: const.h $h/const.h $h/type.h Xforkexit.s: $h/callnr.h Xforkexit.s: $h/error.h Xforkexit.s: glo.h Xforkexit.s: mproc.h Xforkexit.s: param.h X Xgetset.s: const.h $h/const.h $h/type.h Xgetset.s: $h/callnr.h Xgetset.s: $h/error.h Xgetset.s: glo.h Xgetset.s: mproc.h Xgetset.s: param.h X Xmain.s: const.h $h/const.h $h/type.h Xmain.s: $h/callnr.h Xmain.s: $h/com.h Xmain.s: $h/error.h Xmain.s: glo.h Xmain.s: mproc.h Xmain.s: param.h X Xputc.s: $h/const.h $h/type.h Xputc.s: $h/com.h X Xsignal.s: const.h $h/const.h $h/type.h Xsignal.s: $h/callnr.h Xsignal.s: $h/com.h Xsignal.s: $h/error.h Xsignal.s: $h/signal.h Xsignal.s: $h/stat.h Xsignal.s: glo.h Xsignal.s: mproc.h Xsignal.s: param.h X Xtable.s: const.h $h/const.h $h/type.h Xtable.s: $h/callnr.h Xtable.s: glo.h Xtable.s: mproc.h Xtable.s: param.h X Xutility.s: const.h $h/const.h $h/type.h Xutility.s: $h/callnr.h Xutility.s: $h/com.h Xutility.s: $h/error.h Xutility.s: $h/stat.h Xutility.s: glo.h Xutility.s: mproc.h + END-OF-FILE at_makefile chmod 'u=rw,g=r,o=r' 'at_makefile' set `wc -c 'at_makefile'` count=$1 case $count in 1833) :;; *) echo 'Bad character count in ''at_makefile' >&2 echo 'Count should be 1833' >&2 esac echo Extracting 'exec.c.cdif' sed 's/^X//' > 'exec.c.cdif' << '+ END-OF-FILE ''exec.c.cdif' X*** /local/ast/minix/tape3b/mm/exec.c Wed Jul 13 11:50:13 1988 X--- exec.c Mon Sep 26 13:03:53 1988 X*************** X*** 76,82 **** X X /* Read the file header and extract the segment sizes. */ X sc = (stk_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; X! m = read_header(fd, &ft, &text_bytes, &data_bytes, &bss_bytes, &tot_bytes, &sym_bytes, sc); X if (m < 0) { X close(fd); /* something wrong with header */ X return(ENOEXEC); X--- 76,83 ---- X X /* Read the file header and extract the segment sizes. */ X sc = (stk_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; X! m = read_header(fd, &ft, &text_bytes, &data_bytes, &bss_bytes, X! &tot_bytes, &sym_bytes, sc); X if (m < 0) { X close(fd); /* something wrong with header */ X return(ENOEXEC); X*************** X*** 142,148 **** X /*===========================================================================* X * read_header * X *===========================================================================*/ X! PRIVATE int read_header(fd, ft, text_bytes, data_bytes, bss_bytes, tot_bytes, sym_bytes, sc) X int fd; /* file descriptor for reading exec file */ X int *ft; /* place to return ft number */ X vir_bytes *text_bytes; /* place to return text size */ X--- 143,150 ---- X /*===========================================================================* X * read_header * X *===========================================================================*/ X! PRIVATE int read_header(fd, ft, text_bytes, data_bytes, bss_bytes, X! tot_bytes, sym_bytes, sc) X int fd; /* file descriptor for reading exec file */ X int *ft; /* place to return ft number */ X vir_bytes *text_bytes; /* place to return text size */ + END-OF-FILE exec.c.cdif chmod 'u=rw,g=r,o=r' 'exec.c.cdif' set `wc -c 'exec.c.cdif'` count=$1 case $count in 1715) :;; *) echo 'Bad character count in ''exec.c.cdif' >&2 echo 'Count should be 1715' >&2 esac echo Extracting 'forkexit.c.cdif' sed 's/^X//' > 'forkexit.c.cdif' << '+ END-OF-FILE ''forkexit.c.cdif' X*** /local/ast/minix/tape3b/mm/forkexit.c Wed Jul 13 11:50:14 1988 X--- forkexit.c Mon Sep 26 13:03:54 1988 X*************** X*** 254,262 **** X register struct mproc *parent, *rp; X int init_waiting, child_nr; X unsigned int r; X- #ifndef ATARI_ST X- phys_clicks s; X- #endif X X child_nr = (int)(child - mproc); X parent = &mproc[child->mp_parent]; X--- 254,259 ---- + END-OF-FILE forkexit.c.cdif chmod 'u=rw,g=r,o=r' 'forkexit.c.cdif' set `wc -c 'forkexit.c.cdif'` count=$1 case $count in 375) :;; *) echo 'Bad character count in ''forkexit.c.cdif' >&2 echo 'Count should be 375' >&2 esac echo Extracting 'pc_makefile' sed 's/^X//' > 'pc_makefile' << '+ END-OF-FILE ''pc_makefile' X# On a PC, cpp and cem are in /lib and will be removed to make space while X# linking the kernel. On an AT, they are in /usr/lib are are not removed. X# This is because they have to be in /lib on a PC; the diskette is too small X# for them to be in /usr/lib. X# X Xh=../h Xl=/usr/lib XCFLAGS = -Di8088 -F -T. X Xobj = main.s forkexit.s break.s exec.s signal.s getset.s \ X alloc.s utility.s table.s putc.s X Xmm: makefile $l/head.s $(obj) $l/libc.a $l/end.s X @echo "Start linking MM." X @echo "If disk fills up, remove some files" X @asld -o mm -T. $l/head.s $(obj) $l/libc.a $l/end.s X @mv /mm mm X @echo "MM done. " X Xclean: X rm -f $(obj) X Xalloc.s: const.h $h/const.h $h/type.h X Xbreak.s: const.h $h/const.h $h/type.h Xbreak.s: $h/error.h Xbreak.s: $h/signal.h Xbreak.s: glo.h Xbreak.s: mproc.h Xbreak.s: param.h X Xexec.s: const.h $h/const.h $h/type.h Xexec.s: $h/callnr.h Xexec.s: $h/error.h Xexec.s: $h/stat.h Xexec.s: glo.h Xexec.s: mproc.h Xexec.s: param.h X Xforkexit.s: const.h $h/const.h $h/type.h Xforkexit.s: $h/callnr.h Xforkexit.s: $h/error.h Xforkexit.s: glo.h Xforkexit.s: mproc.h Xforkexit.s: param.h X Xgetset.s: const.h $h/const.h $h/type.h Xgetset.s: $h/callnr.h Xgetset.s: $h/error.h Xgetset.s: glo.h Xgetset.s: mproc.h Xgetset.s: param.h X Xmain.s: const.h $h/const.h $h/type.h Xmain.s: $h/callnr.h Xmain.s: $h/com.h Xmain.s: $h/error.h Xmain.s: glo.h Xmain.s: mproc.h Xmain.s: param.h X Xputc.s: $h/const.h $h/type.h Xputc.s: $h/com.h X Xsignal.s: const.h $h/const.h $h/type.h Xsignal.s: $h/callnr.h Xsignal.s: $h/com.h Xsignal.s: $h/error.h Xsignal.s: $h/signal.h Xsignal.s: $h/stat.h Xsignal.s: glo.h Xsignal.s: mproc.h Xsignal.s: param.h X Xtable.s: const.h $h/const.h $h/type.h Xtable.s: $h/callnr.h Xtable.s: glo.h Xtable.s: mproc.h Xtable.s: param.h X Xutility.s: const.h $h/const.h $h/type.h Xutility.s: $h/callnr.h Xutility.s: $h/com.h Xutility.s: $h/error.h Xutility.s: $h/stat.h Xutility.s: glo.h Xutility.s: mproc.h + END-OF-FILE pc_makefile chmod 'u=rw,g=r,o=r' 'pc_makefile' set `wc -c 'pc_makefile'` count=$1 case $count in 1890) :;; *) echo 'Bad character count in ''pc_makefile' >&2 echo 'Count should be 1890' >&2 esac echo Extracting 'signal.c.cdif' sed 's/^X//' > 'signal.c.cdif' << '+ END-OF-FILE ''signal.c.cdif' X*** /local/ast/minix/tape3b/mm/signal.c Wed Jul 13 11:50:15 1988 X--- signal.c Mon Sep 26 13:03:56 1988 X*************** X*** 349,355 **** X char buf[DUMP_SIZE]; X int i, r, s, er1, er2, slot; X vir_bytes v_buf; X- long len; X long a, c, ct, dest; X struct mproc *xmp; X extern char core_name[]; X--- 349,354 ---- + END-OF-FILE signal.c.cdif chmod 'u=rw,g=r,o=r' 'signal.c.cdif' set `wc -c 'signal.c.cdif'` count=$1 case $count in 323) :;; *) echo 'Bad character count in ''signal.c.cdif' >&2 echo 'Count should be 323' >&2 esac exit 0
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)
The message could not be delivered to: Addressee: EAMATEO Reason: %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI ---------------------------------------- Received: from JNET-DAEMON by EBRUPC51; Wed, 28 Sep 88 18:18 N Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4758 for EAMATEO@EBRUPC51; Wed, 28 Sep 88 18:14 N Received: by EB0UB011 (Mailer X1.25) id 9853; Wed, 28 Sep 88 18:12:09 HOE Date: Tue, 27 Sep 88 20:57:34 GMT From: Andy Tanenbaum <ast@CS.VU.NL> Subject: V1.3c posting #10 - fs Sender: Minix operating system <MINIX-L@FINHUTC.BITNET> To: NACHO NAVARRO <EAMATEO@EBRUPC51> Reply-to: INFO-MINIX@UDEL.EDU Comments: Warning -- original Sender: tag was info-minix-request@UDEL.EDU Comments: To: info-minix@UDEL.EDU : This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. : --------------------------- cut here -------------------------- PATH=/bin:/usr/bin:/usr/ucb echo Extracting 'LISTING' sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING' Xtotal 17 X-rw-r--r-- 1 ast 4197 Sep 27 15:12 at_makefile X-rw-r--r-- 1 ast 2585 Sep 27 15:12 inode.c.cdif X-rw-r--r-- 1 ast 1449 Sep 27 15:12 link.c.cdif X-rw-r--r-- 1 ast 4266 Sep 27 15:12 pc_makefile X-rw-r--r-- 1 ast 1736 Sep 27 15:12 read.c.cdif + END-OF-FILE LISTING chmod 'u=rw,g=r,o=r' 'LISTING' set `wc -c 'LISTING'` count=$1 case $count in 295) :;; *) echo 'Bad character count in ''LISTING' >&2 echo 'Count should be 295' >&2 esac echo Extracting 'at_makefile' sed 's/^X//' > 'at_makefile' << '+ END-OF-FILE ''at_makefile' X# On a PC, cpp and cem are in /lib and will be removed to make space while X# linking the kernel. On an AT, they are in /usr/lib are are not removed. X# This is because they have to be in /lib on a PC; the diskette is too small X# for them to be in /usr/lib. X XCFLAGS= -Di8088 -F -T. Xh=../h Xl=/usr/lib X Xobj = main.s open.s read.s write.s pipe.s device.s \ X path.s mount.s link.s super.s inode.s cache.s filedes.s \ X stadir.s protect.s time.s misc.s utility.s table.s putc.s X Xfs: makefile $l/head.s $(obj) $l/libc.a $l/end.s X @echo "Start linking FS. " X @asld -o fs -T. $l/head.s $(obj) $l/libc.a $l/end.s X @echo "FS done. " X Xclean: X rm -f $(obj) X Xcache.s: const.h type.h $h/const.h $h/type.h Xcache.s: $h/error.h Xcache.s: buf.h Xcache.s: file.h Xcache.s: fproc.h Xcache.s: glo.h Xcache.s: inode.h Xcache.s: super.h X Xdevice.s: const.h type.h $h/const.h $h/type.h Xdevice.s: $h/com.h Xdevice.s: $h/error.h Xdevice.s: dev.h Xdevice.s: file.h Xdevice.s: fproc.h Xdevice.s: glo.h Xdevice.s: inode.h Xdevice.s: param.h X Xfiledes.s: const.h type.h $h/const.h $h/type.h Xfiledes.s: $h/error.h Xfiledes.s: file.h Xfiledes.s: fproc.h Xfiledes.s: glo.h Xfiledes.s: inode.h X Xinode.s: const.h type.h $h/const.h $h/type.h Xinode.s: $h/error.h Xinode.s: buf.h Xinode.s: file.h Xinode.s: fproc.h Xinode.s: glo.h Xinode.s: inode.h Xinode.s: super.h X Xlink.s: const.h type.h $h/const.h $h/type.h Xlink.s: $h/error.h Xlink.s: buf.h Xlink.s: file.h Xlink.s: fproc.h Xlink.s: glo.h Xlink.s: inode.h Xlink.s: param.h X Xmain.s: const.h type.h $h/const.h $h/type.h Xmain.s: $h/callnr.h Xmain.s: $h/com.h Xmain.s: $h/error.h Xmain.s: buf.h Xmain.s: file.h Xmain.s: fproc.h Xmain.s: glo.h Xmain.s: inode.h Xmain.s: param.h Xmain.s: super.h X Xmisc.s: const.h type.h $h/const.h $h/type.h Xmisc.s: $h/callnr.h Xmisc.s: $h/com.h Xmisc.s: $h/error.h Xmisc.s: buf.h Xmisc.s: file.h Xmisc.s: fproc.h Xmisc.s: glo.h Xmisc.s: inode.h Xmisc.s: param.h Xmisc.s: super.h X Xmount.s: const.h type.h $h/const.h $h/type.h Xmount.s: $h/error.h Xmount.s: buf.h Xmount.s: file.h Xmount.s: fproc.h Xmount.s: glo.h Xmount.s: inode.h Xmount.s: param.h Xmount.s: super.h X Xopen.s: const.h type.h $h/const.h $h/type.h Xopen.s: $h/callnr.h Xopen.s: $h/error.h Xopen.s: buf.h Xopen.s: file.h Xopen.s: fproc.h Xopen.s: glo.h Xopen.s: inode.h Xopen.s: param.h X Xpath.s: const.h type.h $h/const.h $h/type.h Xpath.s: $h/error.h Xpath.s: buf.h Xpath.s: file.h Xpath.s: fproc.h Xpath.s: glo.h Xpath.s: inode.h Xpath.s: super.h X Xpipe.s: const.h type.h $h/const.h $h/type.h Xpipe.s: $h/callnr.h Xpipe.s: $h/com.h Xpipe.s: $h/error.h Xpipe.s: $h/signal.h Xpipe.s: file.h Xpipe.s: fproc.h Xpipe.s: glo.h Xpipe.s: inode.h Xpipe.s: param.h X Xprotect.s: const.h type.h $h/const.h $h/type.h Xprotect.s: $h/error.h Xprotect.s: buf.h Xprotect.s: file.h Xprotect.s: fproc.h Xprotect.s: glo.h Xprotect.s: inode.h Xprotect.s: param.h Xprotect.s: super.h X Xputc.s: const.h type.h $h/const.h $h/type.h Xputc.s: $h/com.h X Xread.s: const.h type.h $h/const.h $h/type.h Xread.s: $h/com.h Xread.s: $h/error.h Xread.s: buf.h Xread.s: file.h Xread.s: fproc.h Xread.s: glo.h Xread.s: inode.h Xread.s: param.h Xread.s: super.h X Xstadir.s: const.h type.h $h/const.h $h/type.h Xstadir.s: $h/error.h Xstadir.s: $h/stat.h Xstadir.s: file.h Xstadir.s: fproc.h Xstadir.s: glo.h Xstadir.s: inode.h Xstadir.s: param.h X Xsuper.s: const.h type.h $h/const.h $h/type.h Xsuper.s: $h/error.h Xsuper.s: buf.h Xsuper.s: inode.h Xsuper.s: super.h X Xtable.s: const.h type.h $h/const.h $h/type.h Xtable.s: $h/com.h Xtable.s: $h/callnr.h Xtable.s: $h/error.h Xtable.s: $h/stat.h Xtable.s: buf.h Xtable.s: dev.h Xtable.s: file.h Xtable.s: fproc.h Xtable.s: glo.h Xtable.s: inode.h Xtable.s: super.h X Xtime.s: const.h type.h $h/const.h $h/type.h Xtime.s: $h/callnr.h Xtime.s: $h/com.h Xtime.s: $h/error.h Xtime.s: file.h Xtime.s: fproc.h Xtime.s: glo.h Xtime.s: inode.h Xtime.s: param.h X Xutility.s: const.h type.h $h/const.h $h/type.h Xutility.s: $h/com.h Xutility.s: $h/error.h Xutility.s: buf.h Xutility.s: file.h Xutility.s: fproc.h Xutility.s: glo.h Xutility.s: inode.h Xutility.s: param.h Xutility.s: super.h X Xwrite.s: const.h type.h $h/const.h $h/type.h Xwrite.s: $h/error.h Xwrite.s: buf.h Xwrite.s: file.h Xwrite.s: fproc.h Xwrite.s: glo.h Xwrite.s: inode.h Xwrite.s: super.h + END-OF-FILE at_makefile chmod 'u=rw,g=r,o=r' 'at_makefile' set `wc -c 'at_makefile'` count=$1 case $count in 4197) :;; *) echo 'Bad character count in ''at_makefile' >&2 echo 'Count should be 4197' >&2 esac echo Extracting 'inode.c.cdif' sed 's/^X//' > 'inode.c.cdif' << '+ END-OF-FILE ''inode.c.cdif' X*** /local/ast/minix/tape3b/fs/inode.c Tue Jul 12 23:42:51 1988 X--- inode.c Mon Sep 26 13:04:05 1988 X*************** X*** 111,117 **** X X /* Acquire an inode from the bit map. */ X sp = get_super(dev); /* get pointer to super_block */ X! b=alloc_bit(sp->s_imap, (bit_nr)sp->s_ninodes+1, sp->s_imap_blocks, (bit_nr)0); X if (b == NO_BIT) { X err_code = ENFILE; X major = (int) (sp->s_dev >> MAJOR) & BYTE; X--- 111,117 ---- X X /* Acquire an inode from the bit map. */ X sp = get_super(dev); /* get pointer to super_block */ X! b=alloc_bit(sp->s_imap,(bit_nr)sp->s_ninodes+1, sp->s_imap_blocks, (bit_nr)0); X if (b == NO_BIT) { X err_code = ENFILE; X major = (int) (sp->s_dev >> MAJOR) & BYTE; X*************** X*** 129,142 **** X /* No inode table slots available. Free the inode just allocated. */ X free_bit(sp->s_imap, b); X } else { X! /* An inode slot is available. Put the inode just allocated into it. */ X rip->i_mode = bits; X rip->i_nlinks = (links) 0; X rip->i_uid = fp->fp_effuid; X rip->i_gid = fp->fp_effgid; X rip->i_dev = dev; /* was provisionally set to NO_DEV */ X X! /* The fields not cleared already are cleared in wipe_inode(). They have X * been put there because truncate() needs to clear the same fields if X * the file happens to be open while being truncated. It saves space X * not to repeat the code twice. X--- 129,142 ---- X /* No inode table slots available. Free the inode just allocated. */ X free_bit(sp->s_imap, b); X } else { X! /* An inode slot is available. Put the inode just allocated into it. */ X rip->i_mode = bits; X rip->i_nlinks = (links) 0; X rip->i_uid = fp->fp_effuid; X rip->i_gid = fp->fp_effgid; X rip->i_dev = dev; /* was provisionally set to NO_DEV */ X X! /* Fields not cleared already are cleared in wipe_inode(). They have X * been put there because truncate() needs to clear the same fields if X * the file happens to be open while being truncated. It saves space X * not to repeat the code twice. X*************** X*** 212,220 **** X X /* Do the read or write. */ X if (rw_flag == READING) { X! copy((char *)rip, (char *) dip, INODE_SIZE); /* copy from blk to inode */ X } else { X! copy((char *)dip, (char *) rip, INODE_SIZE); /* copy from inode to blk */ X bp->b_dirt = DIRTY; X } X X--- 212,220 ---- X X /* Do the read or write. */ X if (rw_flag == READING) { X! copy((char *)rip, (char *)dip, INODE_SIZE); /* copy from blk to inode*/ X } else { X! copy((char *)dip, (char *)rip, INODE_SIZE); /* copy from inode to blk*/ X bp->b_dirt = DIRTY; X } X + END-OF-FILE inode.c.cdif chmod 'u=rw,g=r,o=r' 'inode.c.cdif' set `wc -c 'inode.c.cdif'` count=$1 case $count in 2585) :;; *) echo 'Bad character count in ''inode.c.cdif' >&2 echo 'Count should be 2585' >&2 esac echo Extracting 'link.c.cdif' sed 's/^X//' > 'link.c.cdif' << '+ END-OF-FILE ''link.c.cdif' X*** /local/ast/minix/tape3b/fs/link.c Tue Jul 12 23:42:51 1988 X--- link.c Mon Sep 26 13:04:06 1988 X*************** X*** 11,16 **** X--- 11,17 ---- X #include "../h/const.h" X #include "../h/type.h" X #include "../h/error.h" X+ #include "../h/stat.h" X #include "const.h" X #include "type.h" X #include "buf.h" X*************** X*** 144,159 **** X { X /* Remove all the zones from the inode 'rip' and mark it dirty. */ X X- register file_pos position; X- register zone_type zone_size; X register block_nr b; X register zone_nr z, *iz; X! register int scale; X! register struct buf *bp; X! register dev_nr dev; X extern struct buf *get_block(); X extern block_nr read_map(); X X dev = rip->i_dev; /* device on which inode resides */ X scale = scale_factor(rip); X zone_size = (zone_type) BLOCK_SIZE << scale; X--- 145,163 ---- X { X /* Remove all the zones from the inode 'rip' and mark it dirty. */ X X register block_nr b; X register zone_nr z, *iz; X! file_pos position; X! zone_type zone_size; X! int scale, file_type; X! struct buf *bp; X! dev_nr dev; X! unshort modewd; X extern struct buf *get_block(); X extern block_nr read_map(); X X+ file_type = rip->i_mode & S_IFMT; /* check to see if file is special */ X+ if (file_type == S_IFCHR || file_type == S_IFBLK) return; X dev = rip->i_dev; /* device on which inode resides */ X scale = scale_factor(rip); X zone_size = (zone_type) BLOCK_SIZE << scale; + END-OF-FILE link.c.cdif chmod 'u=rw,g=r,o=r' 'link.c.cdif' set `wc -c 'link.c.cdif'` count=$1 case $count in 1449) :;; *) echo 'Bad character count in ''link.c.cdif' >&2 echo 'Count should be 1449' >&2 esac echo Extracting 'pc_makefile' sed 's/^X//' > 'pc_makefile' << '+ END-OF-FILE ''pc_makefile' X# On a PC, cpp and cem are in /lib and will be removed to make space while X# linking the kernel. On an AT, they are in /usr/lib are are not removed. X# This is because they have to be in /lib on a PC; the diskette is too small X# for them to be in /usr/lib. X XCFLAGS= -Di8088 -F -T. Xh=../h Xl=/usr/lib X Xobj = main.s open.s read.s write.s pipe.s device.s \ X path.s mount.s link.s super.s inode.s cache.s filedes.s \ X stadir.s protect.s time.s misc.s utility.s table.s putc.s X Xfs: makefile $l/head.s $(obj) $l/libc.a $l/end.s X @echo "Start linking FS. " X @echo "If disk fills up, remove some files or use asld -Tsomething" X @asld -o fs -T. $l/head.s $(obj) $l/libc.a $l/end.s X @echo "FS done. " X Xclean: X rm -f $(obj) X Xcache.s: const.h type.h $h/const.h $h/type.h Xcache.s: $h/error.h Xcache.s: buf.h Xcache.s: file.h Xcache.s: fproc.h Xcache.s: glo.h Xcache.s: inode.h Xcache.s: super.h X Xdevice.s: const.h type.h $h/const.h $h/type.h Xdevice.s: $h/com.h Xdevice.s: $h/error.h Xdevice.s: dev.h Xdevice.s: file.h Xdevice.s: fproc.h Xdevice.s: glo.h Xdevice.s: inode.h Xdevice.s: param.h X Xfiledes.s: const.h type.h $h/const.h $h/type.h Xfiledes.s: $h/error.h Xfiledes.s: file.h Xfiledes.s: fproc.h Xfiledes.s: glo.h Xfiledes.s: inode.h X Xinode.s: const.h type.h $h/const.h $h/type.h Xinode.s: $h/error.h Xinode.s: buf.h Xinode.s: file.h Xinode.s: fproc.h Xinode.s: glo.h Xinode.s: inode.h Xinode.s: super.h X Xlink.s: const.h type.h $h/const.h $h/type.h Xlink.s: $h/error.h Xlink.s: buf.h Xlink.s: file.h Xlink.s: fproc.h Xlink.s: glo.h Xlink.s: inode.h Xlink.s: param.h X Xmain.s: const.h type.h $h/const.h $h/type.h Xmain.s: $h/callnr.h Xmain.s: $h/com.h Xmain.s: $h/error.h Xmain.s: buf.h Xmain.s: file.h Xmain.s: fproc.h Xmain.s: glo.h Xmain.s: inode.h Xmain.s: param.h Xmain.s: super.h X Xmisc.s: const.h type.h $h/const.h $h/type.h Xmisc.s: $h/callnr.h Xmisc.s: $h/com.h Xmisc.s: $h/error.h Xmisc.s: buf.h Xmisc.s: file.h Xmisc.s: fproc.h Xmisc.s: glo.h Xmisc.s: inode.h Xmisc.s: param.h Xmisc.s: super.h X Xmount.s: const.h type.h $h/const.h $h/type.h Xmount.s: $h/error.h Xmount.s: buf.h Xmount.s: file.h Xmount.s: fproc.h Xmount.s: glo.h Xmount.s: inode.h Xmount.s: param.h Xmount.s: super.h X Xopen.s: const.h type.h $h/const.h $h/type.h Xopen.s: $h/callnr.h Xopen.s: $h/error.h Xopen.s: buf.h Xopen.s: file.h Xopen.s: fproc.h Xopen.s: glo.h Xopen.s: inode.h Xopen.s: param.h X Xpath.s: const.h type.h $h/const.h $h/type.h Xpath.s: $h/error.h Xpath.s: buf.h Xpath.s: file.h Xpath.s: fproc.h Xpath.s: glo.h Xpath.s: inode.h Xpath.s: super.h X Xpipe.s: const.h type.h $h/const.h $h/type.h Xpipe.s: $h/callnr.h Xpipe.s: $h/com.h Xpipe.s: $h/error.h Xpipe.s: $h/signal.h Xpipe.s: file.h Xpipe.s: fproc.h Xpipe.s: glo.h Xpipe.s: inode.h Xpipe.s: param.h X Xprotect.s: const.h type.h $h/const.h $h/type.h Xprotect.s: $h/error.h Xprotect.s: buf.h Xprotect.s: file.h Xprotect.s: fproc.h Xprotect.s: glo.h Xprotect.s: inode.h Xprotect.s: param.h Xprotect.s: super.h X Xputc.s: const.h type.h $h/const.h $h/type.h Xputc.s: $h/com.h X Xread.s: const.h type.h $h/const.h $h/type.h Xread.s: $h/com.h Xread.s: $h/error.h Xread.s: buf.h Xread.s: file.h Xread.s: fproc.h Xread.s: glo.h Xread.s: inode.h Xread.s: param.h Xread.s: super.h X Xstadir.s: const.h type.h $h/const.h $h/type.h Xstadir.s: $h/error.h Xstadir.s: $h/stat.h Xstadir.s: file.h Xstadir.s: fproc.h Xstadir.s: glo.h Xstadir.s: inode.h Xstadir.s: param.h X Xsuper.s: const.h type.h $h/const.h $h/type.h Xsuper.s: $h/error.h Xsuper.s: buf.h Xsuper.s: inode.h Xsuper.s: super.h X Xtable.s: const.h type.h $h/const.h $h/type.h Xtable.s: $h/com.h Xtable.s: $h/callnr.h Xtable.s: $h/error.h Xtable.s: $h/stat.h Xtable.s: buf.h Xtable.s: dev.h Xtable.s: file.h Xtable.s: fproc.h Xtable.s: glo.h Xtable.s: inode.h Xtable.s: super.h X Xtime.s: const.h type.h $h/const.h $h/type.h Xtime.s: $h/callnr.h Xtime.s: $h/com.h Xtime.s: $h/error.h Xtime.s: file.h Xtime.s: fproc.h Xtime.s: glo.h Xtime.s: inode.h Xtime.s: param.h X Xutility.s: const.h type.h $h/const.h $h/type.h Xutility.s: $h/com.h Xutility.s: $h/error.h Xutility.s: buf.h Xutility.s: file.h Xutility.s: fproc.h Xutility.s: glo.h Xutility.s: inode.h Xutility.s: param.h Xutility.s: super.h X Xwrite.s: const.h type.h $h/const.h $h/type.h Xwrite.s: $h/error.h Xwrite.s: buf.h Xwrite.s: file.h Xwrite.s: fproc.h Xwrite.s: glo.h Xwrite.s: inode.h Xwrite.s: super.h + END-OF-FILE pc_makefile chmod 'u=rw,g=r,o=r' 'pc_makefile' set `wc -c 'pc_makefile'` count=$1 case $count in 4266) :;; *) echo 'Bad character count in ''pc_makefile' >&2 echo 'Count should be 4266' >&2 esac echo Extracting 'read.c.cdif' sed 's/^X//' > 'read.c.cdif' << '+ END-OF-FILE ''read.c.cdif' X*** /local/ast/minix/tape3b/fs/read.c Tue Jul 12 23:42:55 1988 X--- read.c Mon Sep 26 13:04:10 1988 X*************** X*** 143,164 **** X X /* On write, update file size and access time. */ X if (rw_flag == WRITING) { X! if (char_spec == 0 && block_spec == 0 && position > f_size) X! rip->i_size = position; X! rip->i_modtime = clock_time(); X! rip->i_dirt = DIRTY; X } else { X if (rip->i_pipe && position >= rip->i_size) { X /* Reset pipe pointers. */ X rip->i_size = 0; /* no data left */ X position = 0; /* reset reader(s) */ X! if ( (wf = find_filp(rip, W_BIT)) != NIL_FILP) wf->filp_pos = 0; X } X } X f->filp_pos = position; X X /* Check to see if read-ahead is called for, and if so, set it up. */ X! if (rw_flag == READING && rip->i_seek == NO_SEEK && position % BLOCK_SIZE == 0 X && (mode_word == I_REGULAR || mode_word == I_DIRECTORY)) { X rdahed_inode = rip; X rdahedpos = position; X--- 143,165 ---- X X /* On write, update file size and access time. */ X if (rw_flag == WRITING) { X! if (char_spec == 0 && block_spec == 0) { X! if (position > f_size) rip->i_size = position; X! rip->i_modtime = clock_time(); X! rip->i_dirt = DIRTY; X! } X } else { X if (rip->i_pipe && position >= rip->i_size) { X /* Reset pipe pointers. */ X rip->i_size = 0; /* no data left */ X position = 0; /* reset reader(s) */ X! if ( (wf = find_filp(rip, W_BIT)) != NIL_FILP) wf->filp_pos =0; X } X } X f->filp_pos = position; X X /* Check to see if read-ahead is called for, and if so, set it up. */ X! if (rw_flag == READING && rip->i_seek == NO_SEEK && position % BLOCK_SIZE== 0 X && (mode_word == I_REGULAR || mode_word == I_DIRECTORY)) { X rdahed_inode = rip; X rdahedpos = position; + END-OF-FILE read.c.cdif chmod 'u=rw,g=r,o=r' 'read.c.cdif' set `wc -c 'read.c.cdif'` count=$1 case $count in 1736) :;; *) echo 'Bad character count in ''read.c.cdif' >&2 echo 'Count should be 1736' >&2 esac exit 0
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)
The message could not be delivered to: Addressee: EAMATEO Reason: %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI ---------------------------------------- Received: from JNET-DAEMON by EBRUPC51; Wed, 28 Sep 88 19:09 N Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4805 for EAMATEO@EBRUPC51; Wed, 28 Sep 88 19:07 N Received: by EB0UB011 (Mailer X1.25) id 0044; Wed, 28 Sep 88 19:04:26 HOE Date: Tue, 27 Sep 88 20:54:37 GMT From: Andy Tanenbaum <ast@CS.VU.NL> Subject: V1.3c posting #6 - tools Sender: Minix operating system <MINIX-L@FINHUTC.BITNET> To: NACHO NAVARRO <EAMATEO@EBRUPC51> Reply-to: INFO-MINIX@UDEL.EDU Comments: Warning -- original Sender: tag was info-minix-request@UDEL.EDU Comments: To: info-minix@UDEL.EDU : This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. : --------------------------- cut here -------------------------- PATH=/bin:/usr/bin:/usr/ucb echo Extracting 'LISTING' sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING' Xtotal 28 X-rw-r--r-- 1 ast 2249 Sep 26 22:44 at_makefile.new X-rwxr-xr-x 1 ast 8072 Sep 26 22:44 bootblok.s.new X-rw-r--r-- 1 ast 2201 Sep 26 22:44 changemem.cdif X-rw-r--r-- 1 ast 4777 Sep 26 22:44 fsck.c.cdif X-rw-r--r-- 1 ast 44 Sep 26 22:44 group.new X-rw-r--r-- 1 ast 1111 Sep 26 22:44 init.c.cdif X-rw-r--r-- 1 ast 770 Sep 26 22:44 message.cdif X-rw-r--r-- 1 ast 2249 Sep 26 22:45 pc_makefile.new X-rw-r--r-- 1 ast 149 Sep 26 22:45 ttys.cdif X-rw-r--r-- 1 ast 22 Sep 26 22:45 ttytype.new + END-OF-FILE LISTING chmod 'u=rw,g=r,o=r' 'LISTING' set `wc -c 'LISTING'` count=$1 case $count in 590) :;; *) echo 'Bad character count in ''LISTING' >&2 echo 'Count should be 590' >&2 esac echo Extracting 'at_makefile' sed 's/^X//' > 'at_makefile' << '+ END-OF-FILE ''at_makefile' Xl=/usr/lib XCFLAGS = -F -T. X Xall: X make init X make bootblok X make build X Xinit: $l/libc.a init.s $l/head.s X asld -o init $l/head.s init.s $l/libc.a $l/end.s X @echo init done. X X# bootblok.s is the source of the MINIX boot block. The bootblock is the X# first 512 bytes on the image file and on the boot diskette. When bootblok.s X# is assembled, it generates a short binary file (less than 400 bytes) that X# must be stripped of its header and copied to the file bootblok. The dd X# command below does this. If everything has been done right, the bootblok X# file should begin with the following 8 words, in hex: X# c0b8 8e07 33d8 b8f6 2fe0 c08e ff33 00b9 X# The exact procedure for going from bootblok.s to the binary file stripped of X# its header is somewhat operating system dependent. Some assemblers make X# an object (.s) file; others make an a.out file directly. If your boot X# diskette does not start out by printing 'Booting MINIX 1.0' the problem is X# probably that you have not made a good boot block. Xbootblok: bootblok.s X @asld bootblok.s X @dd if=a.out of=bootblok bs=16w skip=1 count=16 2>/dev/null X @rm a.out X @echo bootblok done. X Xbuild: build.s X cc -o build build.s X @echo build done. X Xfsck: fsck.s fsck1.s X @echo "Start linking fsck. " X asld -o fsck fsck1.s fsck.s $l/libc.a $l/end.s X @echo fsck done. Xfsck.s: fsck.c X cc -c -Di8088 -DSTANDALONE -F fsck.c X X# 'make image' combines the bootblock, kernel, memory manager, file X# system, init and fsck into a single file, called image. Each of these pieces X# appears in the image file just as the original does on the disk, except that X# the header at the front is removed, and each piece is padded out to an X# integral multiple of 16 bytes. Build also prints a message telling how big X# the various pieces (except fsck) are. X# X# 'make net' does the same thing, only with the networking code from the X# 'amoeba directory included X# Ximage: build bootblok X @getlf "Insert blank diskette in drive 0 and hit return" X @build bootblok ../kernel/kernel ../mm/mm ../fs/fs init fsck image X @cp image /dev/fd0 X Xnet: build bootblok X @getlf "Insert blank diskette in drive 0 and hit return" X @build bootblok ../amoeba/kernel/kernel ../amoeba/mm/mm \ X ../amoeba/fs/fs init fsck /dev/fd0 X + END-OF-FILE at_makefile chmod 'u=rw,g=r,o=r' 'at_makefile' set `wc -c 'at_makefile'` count=$1 case $count in 2249) :;; *) echo 'Bad character count in ''at_makefile' >&2 echo 'Count should be 2249' >&2 esac echo Extracting 'bootblok.s' sed 's/^X//' > 'bootblok.s' << '+ END-OF-FILE ''bootblok.s' X| When the PC is powered on, it reads the first block from the floppy X| disk into address 0x7C00 and jumps to it. This boot block must contain X| the boot program in this file. The boot program first copies itself to X| address 192K - 512 (to get itself out of the way). Then it loads the X| operating system from the boot diskette into memory, and then jumps to fsck. X| Loading is not trivial because the PC is unable to read a track into X| memory across a 64K boundary, so the positioning of everything is critical. X| The number of sectors to load is contained at address 504 of this block. X| The value is put there by the build program after it has discovered how X| big the operating system is. When the bootblok program is finished loading, X| it jumps indirectly to the program (fsck) which address is given by the X| last two words in the boot block. X| X| Summary of the words patched into the boot block by build: X| Word at 504: # sectors to load X| Word at 506: # DS value for fsck X| Word at 508: # PC value for fsck X| Word at 510: # CS value for fsck X| X| This version of the boot block must be assembled without separate I & D X| space. X X LOADSEG = 0x0060 | here the boot block will start loading X BIOSSEG = 0x07C0 | here the boot block itself is loaded X BOOTSEG = 0x2FE0 | here it will copy itself (192K-512b) X DSKBASE = 120 | 120 = 4 * 0x1E = ptr to disk parameters X Xfinal = 504 Xfsck_ds = 506 Xfsck_pc = 508 Xfsck_cs = 510 X X X.globl begtext, begdata, begbss, endtext, enddata, endbss | asld needs these X.text Xbegtext: X.data Xbegdata: X.bss Xbegbss: X.text X X| copy bootblock to bootseg X mov ax,#BIOSSEG X mov ds,ax X xor si,si | ds:si - original block X mov ax,#BOOTSEG X mov es,ax X xor di,di | es:di - new block X mov cx,#256 | # words to move X rep X movw | copy loop X X X| start boot procedure X jmpi start, BOOTSEG | set cs to BOOTSEG X Xstart: X mov dx,cs X mov ds,dx | set ds to cs X xor ax,ax X mov es,ax | set es to 0 X mov ss,dx | set ss to cs i.e., stack in high core X mov sp,#1536 | initialize sp to high core X X| print greeting X mov ax,#2 | reset video X int 0x10 X X mov ax,#0x0200 | BIOS call in put cursor in ul corner X xor bx,bx X xor dx,dx X int 0x10 X mov bx,#greet X call print X X| Initialize disk parameters X| Try 1.2M diskette by trying to read sector 15 X X xor ax,ax X mov es,ax X mov dx,ds X mov ax,#atpar X seg es X mov DSKBASE,ax X seg es X mov DSKBASE+2,dx X X xor ax,ax | reset drive X int 0x13 X X xor ax,ax X mov es,ax X mov ax,#0x0201 | read sector, #sector = 1 X mov bx,#0x0600 | es:bx buffer X mov cx,#0x000F | track 0, sector 15 X mov dx,#0x0000 | drive 0, head 0 X int 0x13 X jnb L1 X X| Error. It wasn't 1.2M. Now set up for 720K X X mov tracksiz,#9 X xor ax,ax | ps disk parameters are in ROM F01520 X mov es,ax X mov ax,#0x1520 X seg es X mov DSKBASE,ax X mov ax,#0xF000 X seg es X mov DSKBASE+2,ax X X| Try 720K by trying to read track 64. X| 360K has 40 tracks, 720 has 80 tracks. X X xor ax,ax | diskette reset X int 0x13 X mov tracksiz,#9 X X xor ax,ax X mov es,ax X mov ax,#0x0201 | read sector, number of sectors is 1 X mov bx,#0x0600 | es:bx buffer X mov cx,#0x4001 | track 64, sector 1 X mov dx,#0x0000 | drive 0, head 0 X int 0x13 X jnb L1 X X| Error. It wasn't 720K either. Now set up for 360K X X xor ax,ax X mov es,ax X mov dx,ds X mov ax,#pcpar X seg es X mov DSKBASE,ax X seg es X mov DSKBASE+2,dx X int 0x13 | diskette reset X XL1: X X| Load the operating system from diskette. Xload: X call setreg | set up ah, cx, dx X mov bx,disksec | bx = number of next sector to read X add bx,#2 | diskette sector 1 goes at 1536 ("sector" 3) X shl bx,#1 | multiply sector number by 32 X shl bx,#1 | ditto X shl bx,#1 | ditto X shl bx,#1 | ditto X shl bx,#1 | ditto X mov es,bx | core address is es:bx (with bx = 0) X xor bx,bx | see above X add disksec,ax | ax tells how many sectors to read X movb ah,#2 | opcode for read X int 0x13 | call the BIOS for a read X jb error | jump on diskette error X mov ax,disksec | see if we are done loading X cmp ax,final | ditto X jb load | jump if there is more to load X X| Loading done. Finish up. X mov dx,#0x03F2 | kill the motor X mov ax,#0x000C X out X cli X mov bx,tracksiz | fsck expects # sectors/track in bx X mov ax,fsck_ds | set segment registers X mov ds,ax | when sep I&D DS != CS X mov es,ax | otherwise they are the same. X mov ss,ax | words 504 - 510 are patched by build X X seg cs X jmpi @fsck_pc | jmp to fsck X X| Given the number of the next disk block to read, disksec, compute the X| cylinder, sector, head, and number of sectors to read as follows: X| ah = # sectors to read; cl = sector #; ch = cyl; dh = head; dl = 0 Xsetreg: X mov si,tracksiz | 9 (PC) or 15 (AT) sectors per track X mov ax,disksec | ax = next sector to read X xor dx,dx | dx:ax = 32-bit dividend X div si | divide sector # by track size X mov cx,ax | cx = track #; dx = sector (0-origin) X mov bx,dx | bx = sector number (0-origin) X mov ax,disksec | ax = next sector to read X add ax,si | ax = last sector to read + 1 X dec ax | ax = last sector to read X xor dx,dx | dx:ax = 32-bit dividend X div tracksiz | divide last sector by track size X cmpb al,cl | is starting track = ending track X je set1 | jump if whole read on 1 cylinder X sub si,dx | compute lower sector count X dec si | si = # sectors to read X X| Check to see if this read crosses a 64K boundary (128 sectors). X| Such calls must be avoided. The BIOS gets them wrong. Xset1: mov ax,disksec | ax = next sector to read X add ax,#2 | disk sector 1 goes in core sector 3 X mov dx,ax | dx = next sector to read X add dx,si | dx = one sector beyond end of read X dec dx | dx = last sector to read X shl ax,#1 | ah = which 64K bank does read start at X shl dx,#1 | dh = which 64K bank foes read end in X cmpb ah,dh | ah != dh means read crosses 64K boundary X je set2 | jump if no boundary crossed X shrb dl,#1 | dl = excess beyond 64K boundary X xorb dh,dh | dx = excess beyond 64K boundary X sub si,dx | adjust si X dec si | si = number of sectors to read X Xset2: mov ax,si | ax = number of sectors to read X xor dx,dx | dh = head, dl = drive X movb dh,cl | dh = track X andb dh,#0x01 | dh = head X movb ch,cl | ch = track to read X shrb ch,#1 | ch = cylinder X movb cl,bl | cl = sector number (0-origin) X incb cl | cl = sector number (1-origin) X xorb dl,dl | dl = drive number (0) X ret | return values in ax, cx, dx X X X|-------------------------------+ X| error & print routines | X|-------------------------------+ X Xerror: X push ax X mov bx,#fderr X call print | print msg X xor cx,cx Xerr1: mul 0 | delay X loop err1 X int 0x19 X X Xprint: | print string (bx) X movb al,(bx) | al contains char to be printed X testb al,al | null char? X jne prt1 | no X ret | else return Xprt1: movb ah,#14 | 14 = print char X inc bx | increment string pointer X push bx | save bx X movb bl,#1 | foreground color X xorb bh,bh | page 0 X int 0x10 | call BIOS VIDEO_IO X pop bx | restore bx X jmp print | next character X X Xdisksec:.word 1 Xpcpar: .byte 0xDF, 0x02, 25, 2, 9, 0x2A, 0xFF, 0x50, 0xF6, 1, 3 | for pc Xatpar: .byte 0xDF, 0x02, 25, 2,15, 0x1B, 0xFF, 0x54, 0xF6, 1, 8 | for at X Xfderr: .asciz "Read error. Automatic reboot.\r\n" Xgreet: .asciz "\rBooting MINIX 1.3. Copyright 1988 Prentice-Hall, Inc.\r\n" Xtracksiz:.word 15 | changed to 9 for ps and pc X X| Don't forget that words 504 - 510 are filled in by build. The regular X| code had better not get that far. X.text Xendtext: X.data Xenddata: X.bss Xendbss: + END-OF-FILE bootblok.s chmod 'u=rwx,g=rx,o=rx' 'bootblok.s' set `wc -c 'bootblok.s'` count=$1 case $count in 8072) :;; *) echo 'Bad character count in ''bootblok.s' >&2 echo 'Count should be 8072' >&2 esac echo Extracting 'changemem.cdif' sed 's/^X//' > 'changemem.cdif' << '+ END-OF-FILE ''changemem.cdif' X*** /local/ast/minix/tape3b/tools/changemem Wed Jul 13 14:46:51 1988 X--- changemem Mon Sep 26 13:03:31 1988 X*************** X*** 3,21 **** X l=/usr/lib X t=../test X chmem =50000 $b/ar X chmem =60000 $b/asld X! chmem =2000 $b/cc X chmem =52000 $l/cem X chmem =30000 $l/cg X chmem =60000 $b/cdiff X chmem =64000 $b/compress X! chmem =32000 $b/cpdir X chmem =60000 $l/cpp X chmem =40000 $b/dd X chmem =60000 $b/diff X chmem =8000 $b/df X chmem =32000 $b/dosread X chmem =60000 $b/ed X chmem =50000 $b/find X chmem =60000 $b/fix X chmem =8000 $b/grep X--- 3,26 ---- X l=/usr/lib X t=../test X chmem =50000 $b/ar X+ chmem =16000 $b/ast X chmem =60000 $b/asld X! chmem =3000 $b/cc X chmem =52000 $l/cem X chmem =30000 $l/cg X+ chmem =16000 $b/cp X chmem =60000 $b/cdiff X chmem =64000 $b/compress X! chmem =64000 $b/cpdir X chmem =60000 $l/cpp X chmem =40000 $b/dd X+ chmem =32000 $b/du X chmem =60000 $b/diff X chmem =8000 $b/df X chmem =32000 $b/dosread X chmem =60000 $b/ed X+ chmem =8000 $b/fgrep X+ chmem =50000 $b/file X chmem =50000 $b/find X chmem =60000 $b/fix X chmem =8000 $b/grep X*************** X*** 30,50 **** X chmem =8000 $b/mv X chmem =16000 $b/nm X chmem =40000 $l/opt X! chmem =24000 $b/pr X chmem =8000 $b/prep X chmem =50000 $b/readfs X chmem =8000 $b/rm X chmem =8000 $b/rmdir X chmem =16000 $b/roff X chmem =16000 $b/strings X! chmem =20000 $b/sh X chmem =60000 $b/sort X chmem =8000 $b/tail X chmem =8000 $b/time X chmem =60000 $b/treecmp X chmem =8000 $t/t10a X chmem =8000 $t/t11a X chmem =8000 $t/t11b X chmem =8000 $b/uuencode X chmem =8000 $b/uudecode X chmem =8000 $b/wc X--- 35,59 ---- X chmem =8000 $b/mv X chmem =16000 $b/nm X chmem =40000 $l/opt X! chmem =8000 $b/paste X! chmem =32000 $b/pr X chmem =8000 $b/prep X chmem =50000 $b/readfs X chmem =8000 $b/rm X chmem =8000 $b/rmdir X chmem =16000 $b/roff X chmem =16000 $b/strings X! chmem =12000 $b/sh X! chmem =8000 $b/shar X chmem =60000 $b/sort X+ chmem =16000 $b/strip X chmem =8000 $b/tail X chmem =8000 $b/time X chmem =60000 $b/treecmp X chmem =8000 $t/t10a X chmem =8000 $t/t11a X chmem =8000 $t/t11b X+ chmem =8000 $b/uniq X chmem =8000 $b/uuencode X chmem =8000 $b/uudecode X chmem =8000 $b/wc + END-OF-FILE changemem.cdif chmod 'u=rw,g=r,o=r' 'changemem.cdif' set `wc -c 'changemem.cdif'` count=$1 case $count in 2201) :;; *) echo 'Bad character count in ''changemem.cdif' >&2 echo 'Count should be 2201' >&2 esac echo Extracting 'fsck.c.cdif' sed 's/^X//' > 'fsck.c.cdif' << '+ END-OF-FILE ''fsck.c.cdif' X*** /local/ast/minix/tape3b/tools/fsck.c Wed Jul 13 14:46:52 1988 X--- fsck.c Mon Sep 26 13:03:34 1988 X*************** X*** 5,66 **** X #include "../fs/const.h" X #include "../fs/type.h" X X! /* #define DOS /* compile to run under MS-DOS */ X! /* #define STANDALONE /* compile for the boot-diskette */ X #ifndef STANDALONE X! #include "stdio.h" X! #endif /*STANDALONE*/ X X! /* Fsck may be compiled to run in any of two situations. For each X! * a different symbol must be defined: X * X! * STANDALONE will compile fsck to be part of the boot-diskette and X! * all necessary routines are contained in the program X! * DOS will compile fsck to run under MS-DOS, using X! * the standard DOS library for your compiler. X * X! * The assembler file fsck1.asm must be assembled correspondingly. It has X! * only one symbol defined, namely STANDALONE. X! * The assembler file fsck.s is only used under PC/IX to produce X! * a version for the boot diskette. X! * When you have a problem look at the preprocessor output to see X! * which lines will actually be compiled. X! * To produce an executable/binary version issue one of the following X! * commands, depending on your development environment: X * X! * Development system: MS-DOS X * X! * fsck to run under: MS-DOS X! * defined symbols: fsck.c: DOS X! * fsck1.asm: - X! * command: link fsck+fsck1,,,DOS-lib X! * X! * fsck to run under: BOOT X! * defined symbols: fsck.c: STANDALONE X! * fsck1.asm: STANDALONE X! * command: link fsck1+fsck,fsck,, {Minix-lib || DOS-lib} X! * dos2out -d fsck X! * X! * fsck to run under: MINIX -not yet implemented- X! * command: link crtso+fsck,fsck,,Minix-lib X! * dos2out -d fsck X! * X! * X! * Development system: PC/IX X! * X! * fsck to run under: PC/IX X! * command: ld fsck -lc X! * X! * fsck to run under: BOOT X! * defined symbols: fsck.c: STANDALONE X! * fsck1.s: - X! * command: ld fsck1.o fsck.0 -l../lib/lib.a X! * X! * fsck to run under: MINIX X! * command: ld fsck.o -l../lib/lib.a X! * X */ X X #define BITSHIFT 4 /* = 2log(#bits(int)) */ X #define BITMAPSHIFT 13 /* = 2log(#bits(block)); 13 means 1K blocks */ X #define MAXPRINT 8 /* max. number of error lines in chkmap */ X--- 5,35 ---- X #include "../fs/const.h" X #include "../fs/type.h" X X! X #ifndef STANDALONE X! #include <stdio.h> X! #endif X X! /* Fsck may be compiled to run in any of two situations. X * X! * - standalone, as part of the boot diskette used to bring MINIX up X! * - as a running MINIX program. X * X! * When used for standalone operation, -DSTANDALONE must be used. X! * The following commands can be used to build a standalone version: X * X! * cc -c -Di8088 -DSTANDALONE fsck.c X! * asld -o fsck fsck1.s fsck.s /usr/lib/libc.a /usr/lib/end.s X * X! * Fsck1.s contains calls to the BIOS routines used by the standalone X! * version. The production version makes ordinary MINIX reads and writes. X */ X X+ X+ #define HEADS 4 /* # heads per cylinder */ X+ #define TRACKSIZE 17 /* # sectors per track */ X+ #define CYLSIZE (HEADS*TRACKSIZE) /* # sectors per cylinder */ X+ X #define BITSHIFT 4 /* = 2log(#bits(int)) */ X #define BITMAPSHIFT 13 /* = 2log(#bits(block)); 13 means 1K blocks */ X #define MAXPRINT 8 /* max. number of error lines in chkmap */ X*************** X*** 1847,1852 **** X--- 1816,1823 ---- X for (;;) { X printf("\nHit key as follows:\n\n"); X printf(" = start MINIX (root file system in drive 0)\n"); X+ printf(" u start MINIX on PS/2 Model 30, U.S. keyboard (root file sys in drive 0)\n"); X+ printf(" d start MINIX on PS/2 Model 30, Dutch keyboard (root file sys in drive 0)\n"); X printf(" f check the file system (first insert any file system diskette)\n"); X printf(" l check and list file system (first insert any file system diskette)\n"); X printf(" m make an (empty) file system (first insert blank, formatted diskette)\n"); X*************** X*** 1864,1871 **** X case 'h': X get_partition(); X drive = (partition < PARB ? 0x80 : 0x81); X! cylsiz = 68; /* sectors per cylinder */ X! tracksiz = 17; X printf("Checking hard disk. %s\n", answer); X if (read_partition() < 0) continue; X repair = 1; X--- 1835,1842 ---- X case 'h': X get_partition(); X drive = (partition < PARB ? 0x80 : 0x81); X! cylsiz = CYLSIZE; /* sectors per cylinder */ X! tracksiz = TRACKSIZE; X printf("Checking hard disk. %s\n", answer); X if (read_partition() < 0) continue; X repair = 1; X*************** X*** 1896,1901 **** X--- 1867,1874 ---- X break; X X case '=': return((c >> 8) & 0xFF); X+ case 'u': return((c >> 8) & 0xFF); X+ case 'd': return((c >> 8) & 0xFF); X default: X printf("Illegal command\n"); X continue; + END-OF-FILE fsck.c.cdif chmod 'u=rw,g=r,o=r' 'fsck.c.cdif' set `wc -c 'fsck.c.cdif'` count=$1 case $count in 4777) :;; *) echo 'Bad character count in ''fsck.c.cdif' >&2 echo 'Count should be 4777' >&2 esac echo Extracting 'group.new' sed 's/^X//' > 'group.new' << '+ END-OF-FILE ''group.new' Xroot:*:0: Xdaemon:*:1: Xsystem:*:2: Xuser:*:3: + END-OF-FILE group.new chmod 'u=rw,g=r,o=r' 'group.new' set `wc -c 'group.new'` count=$1 case $count in 44) :;; *) echo 'Bad character count in ''group.new' >&2 echo 'Count should be 44' >&2 esac echo Extracting 'init.c.cdif' sed 's/^X//' > 'init.c.cdif' << '+ END-OF-FILE ''init.c.cdif' X*** /local/ast/minix/tape3b/tools/init.c Wed Jul 13 14:46:53 1988 X--- init.c Mon Sep 26 13:03:34 1988 X*************** X*** 28,33 **** X--- 28,35 ---- X #define NOPARAMS -100 X #define WTMPSIZE 8 X X+ extern long time(); X+ extern long lseek(); X X struct uart { X int baud; X*************** X*** 124,129 **** X--- 126,132 ---- X for (i = 1; i <= NR_SIGS; i++) signal(i, SIG_IGN); X X while (1) { X+ sync(); X k = wait(&status); X pidct--; X X*************** X*** 154,162 **** X /* Child */ X close(0); /* /etc/ttys may be open */ X name[DIGIT] = '0' + linenr; X! if (open(name, 0) != 0) exit(-3); /* standard input */ X! if (open(name, 1) != 1) exit(-3); /* standard output */ X! if (open(name, 1) != 2) exit(-3); /* standard error */ X X X /* Set line parameters. */ X--- 157,165 ---- X /* Child */ X close(0); /* /etc/ttys may be open */ X name[DIGIT] = '0' + linenr; X! if (open(name, 2) != 0) exit(-3); /* standard input */ X! if (open(name, 2) != 1) exit(-3); /* standard output */ X! if (open(name, 2) != 2) exit(-3); /* standard error */ X X X /* Set line parameters. */ + END-OF-FILE init.c.cdif chmod 'u=rw,g=r,o=r' 'init.c.cdif' set `wc -c 'init.c.cdif'` count=$1 case $count in 1111) :;; *) echo 'Bad character count in ''init.c.cdif' >&2 echo 'Count should be 1111' >&2 esac echo Extracting 'message.cdif' sed 's/^X//' > 'message.cdif' << '+ END-OF-FILE ''message.cdif' X*** /local/ast/minix/tape3b/tools/message Wed Jul 13 14:46:54 1988 X--- message Mon Sep 26 13:03:35 1988 X*************** X*** 1,8 **** X X X! Please see 'doc/READ_ME' for instructions about unpacking the documentation. X Then read 'doc/USER_GUIDE' before using the system. The 'doc' directory is X! on disk 7 (PC version) or disk 3 (AT version). X X If your screen goes blank periodically, hit the F3 key (see 'doc/USER_GUIDE'). X X--- 1,8 ---- X X X! Please see 'doc/Read_me' for instructions about unpacking the documentation. X Then read 'doc/USER_GUIDE' before using the system. The 'doc' directory is X! on disk 8 (PC version) or disk 3 (AT version), in the doc.a.Z archive. X X If your screen goes blank periodically, hit the F3 key (see 'doc/USER_GUIDE'). X + END-OF-FILE message.cdif chmod 'u=rw,g=r,o=r' 'message.cdif' set `wc -c 'message.cdif'` count=$1 case $count in 770) :;; *) echo 'Bad character count in ''message.cdif' >&2 echo 'Count should be 770' >&2 esac echo Extracting 'pc_makefile' sed 's/^X//' > 'pc_makefile' << '+ END-OF-FILE ''pc_makefile' Xl=/usr/lib XCFLAGS = -F -T. X Xall: X make init X make bootblok X make build X Xinit: $l/libc.a init.s $l/head.s X asld -o init $l/head.s init.s $l/libc.a $l/end.s X @echo init done. X X# bootblok.s is the source of the MINIX boot block. The bootblock is the X# first 512 bytes on the image file and on the boot diskette. When bootblok.s X# is assembled, it generates a short binary file (less than 400 bytes) that X# must be stripped of its header and copied to the file bootblok. The dd X# command below does this. If everything has been done right, the bootblok X# file should begin with the following 8 words, in hex: X# c0b8 8e07 33d8 b8f6 2fe0 c08e ff33 00b9 X# The exact procedure for going from bootblok.s to the binary file stripped of X# its header is somewhat operating system dependent. Some assemblers make X# an object (.s) file; others make an a.out file directly. If your boot X# diskette does not start out by printing 'Booting MINIX 1.0' the problem is X# probably that you have not made a good boot block. Xbootblok: bootblok.s X @asld bootblok.s X @dd if=a.out of=bootblok bs=16w skip=1 count=16 2>/dev/null X @rm a.out X @echo bootblok done. X Xbuild: build.s X cc -o build build.s X @echo build done. X Xfsck: fsck.s fsck1.s X @echo "Start linking fsck. " X asld -o fsck fsck1.s fsck.s $l/libc.a $l/end.s X @echo fsck done. Xfsck.s: fsck.c X cc -c -Di8088 -DSTANDALONE -F fsck.c X X# 'make image' combines the bootblock, kernel, memory manager, file X# system, init and fsck into a single file, called image. Each of these pieces X# appears in the image file just as the original does on the disk, except that X# the header at the front is removed, and each piece is padded out to an X# integral multiple of 16 bytes. Build also prints a message telling how big X# the various pieces (except fsck) are. X# X# 'make net' does the same thing, only with the networking code from the X# 'amoeba directory included X# Ximage: build bootblok X @getlf "Insert blank diskette in drive 0 and hit return" X @build bootblok ../kernel/kernel ../mm/mm ../fs/fs init fsck image X @cp image /dev/fd0 X Xnet: build bootblok X @getlf "Insert blank diskette in drive 0 and hit return" X @build bootblok ../amoeba/kernel/kernel ../amoeba/mm/mm \ X ../amoeba/fs/fs init fsck /dev/fd0 X + END-OF-FILE pc_makefile chmod 'u=rw,g=r,o=r' 'pc_makefile' set `wc -c 'pc_makefile'` count=$1 case $count in 2249) :;; *) echo 'Bad character count in ''pc_makefile' >&2 echo 'Count should be 2249' >&2 esac echo Extracting 'ttys' sed 's/^X//' > 'ttys' << '+ END-OF-FILE ''ttys' X100 + END-OF-FILE ttys chmod 'u=rw,g=r,o=r' 'ttys' set `wc -c 'ttys'` count=$1 case $count in 4) :;; *) echo 'Bad character count in ''ttys' >&2 echo 'Count should be 4' >&2 esac echo Extracting 'ttytype.new' sed 's/^X//' > 'ttytype.new' << '+ END-OF-FILE ''ttytype.new' Xminix tty0 Xvt100 tty1 + END-OF-FILE ttytype.new chmod 'u=rw,g=r,o=r' 'ttytype.new' set `wc -c 'ttytype.new'` count=$1 case $count in 22) :;; *) echo 'Bad character count in ''ttytype.new' >&2 echo 'Count should be 22' >&2 esac exit 0
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)
The message could not be delivered to: Addressee: EAMATEO Reason: %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI ---------------------------------------- Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 01:46 N Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 5623 for EAMATEO@EBRUPC51; Thu, 29 Sep 88 01:45 N Received: by EB0UB011 (Mailer X1.25) id 1247; Thu, 29 Sep 88 01:40:06 HOE Date: Tue, 27 Sep 88 20:51:41 GMT From: Andy Tanenbaum <ast@CS.VU.NL> Subject: V1.3c posting #3 commands (1 of 3) Sender: Minix operating system <MINIX-L@FINHUTC.BITNET> To: NACHO NAVARRO <EAMATEO@EBRUPC51> Reply-to: INFO-MINIX@UDEL.EDU Comments: Warning -- original Sender: tag was info-minix-request@UDEL.EDU Comments: To: info-minix@UDEL.EDU : This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. : --------------------------- cut here -------------------------- PATH=/bin:/usr/bin:/usr/ucb echo Extracting 'LISTING' sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING' Xtotal 417 X-rw-r--r-- 1 ast 6207 Sep 26 22:28 animals.c.new X-rw-r--r-- 1 ast 6631 Sep 26 22:28 ast.c.cdif X-rw-r--r-- 1 ast 9395 Sep 26 22:28 at.c.cdif X-rw-r--r-- 1 ast 6370 Sep 26 22:28 banner.c.new X-rw-r--r-- 1 ast 7822 Sep 26 22:29 cc.c.cdif X-rw-r--r-- 1 ast 1360 Sep 26 22:29 cdiff.c.cdif X-rw-r--r-- 1 ast 270 Sep 26 22:29 chgrp.c.cdif X-rw-r--r-- 1 ast 8525 Sep 26 22:29 chmod.c.cdif X-rw-r--r-- 1 ast 385 Sep 26 22:29 chown.c.cdif X-rw-r--r-- 1 ast 1140 Sep 26 22:29 clr.c.cdif X-rw-r--r-- 1 ast 241152 Sep 26 22:29 commands.a.Z.new X-rw-r--r-- 1 ast 1737 Sep 26 22:29 cp.c.cdif X-rw-r--r-- 1 ast 4265 Sep 26 22:29 cpdir.c.cdif X-rw-r--r-- 1 ast 5528 Sep 26 22:29 date.c.cdif X-rw-r--r-- 1 ast 487 Sep 26 22:30 df.c.cdif X-rw-r--r-- 1 ast 956 Sep 26 22:30 diskcheck.c.cdif X-rw-r--r-- 1 ast 23988 Sep 26 22:30 dosread.c.cdif X-rw-r--r-- 1 ast 282 Sep 26 22:30 factor.c.cdif X-rw-r--r-- 1 ast 457 Sep 26 22:30 fgrep.c.cdif X-rw-r--r-- 1 ast 1189 Sep 26 22:30 file.c.cdif X-rw-r--r-- 1 ast 255 Sep 26 22:30 getlf.c.cdif X-rw-r--r-- 1 ast 4249 Sep 26 22:30 help.c.new X-rw-r--r-- 1 ast 267 Sep 26 22:30 libupack.c.cdif X-rw-r--r-- 1 ast 6360 Sep 26 22:30 login.c.cdif X-rw-r--r-- 1 ast 5992 Sep 26 22:31 ls.c.cdif X-rw-r--r-- 1 ast 5467 Sep 26 22:31 more.c.cdif X-rw-r--r-- 1 ast 602 Sep 26 22:31 mount.c.cdif X-rw-r--r-- 1 ast 4523 Sep 26 22:31 mv.c.cdif X-rw-r--r-- 1 ast 2777 Sep 26 22:31 nm.c.cdif X-rw-r--r-- 1 ast 274 Sep 26 22:31 paste.c.cdif X-rw-r--r-- 1 ast 6596 Sep 26 22:31 pr.c.cdif X-rw-r--r-- 1 ast 260 Sep 26 22:31 readall.c.cdif X-rw-r--r-- 1 ast 4113 Sep 26 22:31 readclock.c.new X-rw-r--r-- 1 ast 561 Sep 26 22:31 readfs.c.cdif X-rw-r--r-- 1 ast 337 Sep 26 22:32 sed.c.cdif X-rw-r--r-- 1 ast 1129 Sep 26 22:32 strip.c.cdif X-rw-r--r-- 1 ast 778 Sep 26 22:32 stty.c.cdif X-rw-r--r-- 1 ast 448 Sep 26 22:32 su.c.cdif X-rw-r--r-- 1 ast 561 Sep 26 22:32 tar.c.cdif X-rw-r--r-- 1 ast 606 Sep 26 22:32 term.c.cdif X-rw-r--r-- 1 ast 2431 Sep 26 22:32 tset.c.new X-rw-r--r-- 1 ast 435 Sep 26 22:32 tty.c.cdif X-rw-r--r-- 1 ast 361 Sep 26 22:32 vol.c.cdif X-rw-r--r-- 1 ast 4209 Sep 26 22:32 x.new X-rw-r--r-- 1 ast 4209 Sep 26 22:32 y.new + END-OF-FILE LISTING chmod 'u=rw,g=r,o=r' 'LISTING' set `wc -c 'LISTING'` count=$1 case $count in 2579) :;; *) echo 'Bad character count in ''LISTING' >&2 echo 'Count should be 2579' >&2 esac echo Extracting 'animals.c.new' sed 's/^X//' > 'animals.c.new' << '+ END-OF-FILE ''animals.c.new' X/* animals - guessing game Authors: Terrence W. Holm & Edwin L. Froese */ X X#include <stdio.h> X#include <string.h> X#include <signal.h> X#include <sgtty.h> X#include <ctype.h> X#include <unistd.h> X X#define ANIMALS "/usr/lib/animals" X#define DEFAULT_ANIMAL "beaver" X#define MAX_NODES 999 /* Enough for 500 animals */ X#define MAX_LINE 90 X Xint Abort(); Xchar *Get_Animal(); Xchar *Get_Question(); Xchar *A_or_An(); Xchar *Alloc(); X Xstruct node X { X int question; X char *text; X int yes; X int no; X } animals[ MAX_NODES ]; X Xint count = 0; Xstruct sgttyb old_tty_mode; X X Xmain( argc, argv ) X int argc; X char *argv[]; X X { X char *animal_file = ANIMALS; X X if ( argc > 2 ) X { X fprintf( stderr, "Usage: %s [ data_base ]\n", argv[0] ); X exit( 1 ); X } X X if ( argc == 2 ) X animal_file = argv[1]; X X ioctl( 0, TIOCGETP, &old_tty_mode ); X X signal( SIGINT, Abort ); X signal( SIGQUIT, Abort ); X X if ( access( animal_file, R_OK ) == 0 ) X Read_Animals( animal_file ); X else X { X animals[0].question = 0; X animals[0].text = DEFAULT_ANIMAL; X count = 1; X } X X while ( Ask( "\nAre you thinking of an animal?" ) ) X { X int i = 0; X X while ( 1 ) X { X if ( animals[i].question ) X { X if ( Ask( animals[i].text ) ) X i = animals[i].yes; X else X i = animals[i].no; X } X else X { X printf( "Were you thinking of %s %s", X A_or_An( animals[i].text ), animals[i].text ); X X if ( Ask( "?" ) ) X printf( "I knew it!\n" ); X X else X { X /* Insert a new question and animal name */ X X if ( count + 2 > MAX_NODES ) X Error( "Too many animal names" ); X X animals[count].question = 0; X animals[count].text = animals[i].text; X ++count; X X animals[count].question = 0; X printf( "What animal were you thinking of? " ); X animals[count].text = Get_Animal(); X ++count; X X animals[i].question = 1; X printf( "What question would distinguish %s %s from\n%s %s? ", X A_or_An( animals[count-2].text ), animals[count-2].text, X A_or_An( animals[count-1].text ), animals[count-1].text ); X X animals[i].text = Get_Question(); X X printf( "For %s %s, the answer would be", X A_or_An( animals[count-1].text ), animals[count-1].text ); X X if ( Ask( "?" ) ) X { X animals[i].yes = count - 1; X animals[i].no = count - 2; X } X else X { X animals[i].yes = count - 2; X animals[i].no = count - 1; X } X } X X break; X } X } /* End while ( 1 ) */ X X } X X X ioctl( 0, TIOCSETP, &old_tty_mode ); X X printf( "\nThank you for playing \"animals\".\n" ); X printf( "The animal data base is now being updated.\n" ); X X Write_Animals( animal_file ); X X sleep( 1 ); X printf( "\nBye.\n" ); X X exit( 0 ); X } X X X/* X * Reading and writing the animal data base X */ X X XRead_Animals( animal_file ) X char *animal_file; X X { X FILE *f; X char buffer[ MAX_LINE ]; X X if ( (f = fopen( animal_file, "r" )) == NULL ) X Error( "Can not open animal data base" ); X X while ( fgets( buffer, MAX_LINE, f ) != NULL ) X { X int string_length; X char *string; X X buffer[ strlen(buffer) - 1 ] = '\0'; X X swab( buffer, buffer, strlen(buffer) ); X X if ( buffer[ 0 ] == 'q' ) X { X char *end = strchr( buffer, '?' ); X string_length = end - buffer; X animals[ count ].question = 1; X sscanf( end + 1, "%d:%d", &animals[ count ].yes, &animals[ count ].no ); X } X else X { X animals[ count ].question = 0; X string_length = strlen( buffer ) - 1; X } X X string = Alloc( string_length + 1 ); X X string[ 0 ] = '\0'; X strncat( string, buffer+1, string_length ); X X animals[ count ].text = string; X X count++; X } X X fclose( f ); X } X X XWrite_Animals( animal_file ) X char *animal_file; X X { X FILE *f; X int i; X char buffer[ MAX_LINE ]; X X if ( (f = fopen( animal_file, "w" )) == NULL ) X Error( "Can not write animal data base" ); X X for ( i = 0; i < count; ++i ) X { X if ( animals[i].question ) X sprintf( buffer, "q%s%d:%d", animals[i].text, X animals[i].yes, animals[i].no ); X else X sprintf( buffer, "a%s", animals[i].text ); X X /* Make the data base a bit difficult to read */ X X swab( buffer, buffer, strlen(buffer) ); X X fprintf( f, "%s\n", buffer ); X } X X fclose( f ); X X chmod( animal_file, 0666 ); X } X X X/* X * Reading data from the user X */ X X Xint Ask( question ) X char *question; X X { X struct sgttyb new_tty_mode; X int response; X X new_tty_mode = old_tty_mode; X new_tty_mode.sg_flags |= CBREAK; X ioctl( 0, TIOCSETP, &new_tty_mode ); X X printf( "%s ", question ); X X while ( (response = getchar()) != 'y' && response != 'n' ) X printf( "\n%s [yn]?", question ); X X putchar( '\n' ); X X ioctl( 0, TIOCSETP, &old_tty_mode ); X X if ( response == 'y' ) X return( 1 ); X else X return( 0 ); X } X X Xchar *Get_Animal() X { X char s[ MAX_LINE ]; X char *text; X int text_length; X X fgets( s, MAX_LINE, stdin ); X X text_length = strlen(s); X X text = Alloc( text_length ); X X text[ 0 ] = '\0'; X strncat( text, s, text_length - 1 ); X X return( text ); X } X X Xchar *Get_Question() X { X char s[ MAX_LINE ]; X char *end; X char *text; X X fgets( s, MAX_LINE, stdin ); X X /* Capitalize the first letter */ X X if ( islower( s[0] ) ) X s[0] = toupper( s[0] ); X X /* Make sure the question ends with a '?' */ X X if ( (end = strchr( s, '?' )) == NULL ) X s[ strlen(s) - 1 ] = '?'; X else X end[1] = '\0'; X X text = Alloc( strlen(s) + 1 ); X X strcpy( text, s ); X X return( text ); X } X X X/* X * Utility routines X */ X X Xchar *A_or_An( word ) X char *word; X X { X if ( strchr( "aeiouAEIOU", word[0] ) == NULL ) X return( "a" ); X else X return( "an" ); X } X X Xchar *Alloc( size ) X int size; X X { X char *malloc(); X char *memory; X X if ( (memory = malloc( size )) == NULL ) X Error( "No room in memory for all the animals" ); X X return( memory ); X } X X XAbort() X { X ioctl( 0, TIOCSETP, &old_tty_mode ); X X printf( "\nThank you for playing \"animals\".\n" ); X printf( "Since you aborted, the animal data base will not be updated.\n" ); X X sleep( 1 ); X printf( "\nBye.\n" ); X X exit( 1 ); X } X X XError( message ) X char *message; X X { X ioctl( 0, TIOCSETP, &old_tty_mode ); X X fprintf( stderr, "Error: %s\n", message ); X X exit( 1 ); X } + END-OF-FILE animals.c.new chmod 'u=rw,g=r,o=r' 'animals.c.new' set `wc -c 'animals.c.new'` count=$1 case $count in 6207) :;; *) echo 'Bad character count in ''animals.c.new' >&2 echo 'Count should be 6207' >&2 esac echo Extracting 'ast.c.cdif' sed 's/^X//' > 'ast.c.cdif' << '+ END-OF-FILE ''ast.c.cdif' X*** /local/ast/minix/tape3b/commands/ast.c Wed Jul 13 13:10:40 1988 X--- ast.c Sun Sep 25 15:24:42 1988 X*************** X*** 1,12 **** X! /* ast - add symbol table. Author: Dick van Veen, veench@cs.vu.nl */ X X #include <a.out.h> X #include <stdio.h> X X /* X * Since the a.out file in MINIX does not contain any symbol table, X! * we use the symbol table produced with the -s option of asld, e.g. X! * cc -s file.c >symbol.out X * X * Read symbol table in memory, remove compiler generated labels, X * sort the labels and add it to the a.out file. X--- 1,11 ---- X! /* ast - add symbol table. Author: Dick van Veen */ X X #include <a.out.h> X #include <stdio.h> X X /* X * Since the a.out file in MINIX does not contain any symbol table, X! * we use the symbol table produced with the -s option of asld. X * X * Read symbol table in memory, remove compiler generated labels, X * sort the labels and add it to the a.out file. X*************** X*** 17,28 **** X */ X X /* X! * Usage: ast [flags] [file] [symbolfile] X * X * flags: X * -x do not preserve local symbols X * -X preserve local symbols except for those whose name begin X! * with 'I' or 'L', these are compiler generated. X * X * - when no symbol file is present, symbol.out is assumed. X * - when no file is present, a.out is assumed. X--- 16,27 ---- X */ X X /* X! * ast [flags] [file] [symbolfile] X * X * flags: X * -x do not preserve local symbols X * -X preserve local symbols except for those whose name begin X! * with 'I', these are compiler generated. X * X * - when no symbol file is present, symbol.out is assumed. X * - when no file is present, a.out is assumed. X*************** X*** 65,71 **** X else if (**argv == 'X') X_flag = 1; X else { X fprintf(stderr, "illegal flag: -%c\n", **argv); X! Exit(-1); X } X argv++; X } X--- 64,70 ---- X else if (**argv == 'X') X_flag = 1; X else { X fprintf(stderr, "illegal flag: -%c\n", **argv); X! exit(-1); X } X argv++; X } X*************** X*** 78,110 **** X argv++; X } X if (*argv != NULL) { X! fprintf(stderr, "Usage: ast [-xX] [file] [symbolfile]\n"); X! Exit(-1); X } X if (o_file == NULL) o_file = A_OUT; X o_fd = fopen(o_file, "a"); X if (o_fd == NULL) { X fprintf(stderr, "can't open %s\n", o_file); X! Exit(-1); X } X if (s_file == NULL) s_file = SYMBOL_FILE; X s_fd = fopen(s_file, "r"); X if (s_fd == NULL) { X fprintf(stderr, "can't open %s\n", s_file); X! Exit(-1); X } X setbuf(s_fd, io_buf); X ast(s_fd, o_fd); X! Exit(0); X } X X- Exit(val) X- int val; X- { X- _cleanup(); X- exit(val); X- } X- X ast(s_fd, o_fd) X FILE *s_fd, *o_fd; X { X--- 77,102 ---- X argv++; X } X if (*argv != NULL) { X! fprintf(stderr, "Usage: ast [-{x,X}] [file] [symbolfile]\n"); X! exit(-1); X } X if (o_file == NULL) o_file = A_OUT; X o_fd = fopen(o_file, "a"); X if (o_fd == NULL) { X fprintf(stderr, "can't open %s\n", o_file); X! exit(-1); X } X if (s_file == NULL) s_file = SYMBOL_FILE; X s_fd = fopen(s_file, "r"); X if (s_fd == NULL) { X fprintf(stderr, "can't open %s\n", s_file); X! exit(-1); X } X setbuf(s_fd, io_buf); X ast(s_fd, o_fd); X! exit(0); X } X X ast(s_fd, o_fd) X FILE *s_fd, *o_fd; X { X*************** X*** 126,132 **** X FILE *fd; X char *buffer; X { X! char ch; X char *buf1; X X buf1 = buffer; X--- 118,124 ---- X FILE *fd; X char *buffer; X { X! int ch; X char *buf1; X X buf1 = buffer; X*************** X*** 185,197 **** X X if (buffer[1] != ' ') { X fprintf(stderr, "illegal file format\n"); X! Exit(-1); X } X symbol->n_value = get_value(buffer + 2); X X if (buffer[6] != ' ') { X fprintf(stderr, "illegal file format\n"); X! Exit(-1); X } X get_name(buffer + 7, symbol->n_name); X return(0); /* yeah, found a symbol */ X--- 177,189 ---- X X if (buffer[1] != ' ') { X fprintf(stderr, "illegal file format\n"); X! exit(-1); X } X symbol->n_value = get_value(buffer + 2); X X if (buffer[6] != ' ') { X fprintf(stderr, "illegal file format\n"); X! exit(-1); X } X get_name(buffer + 7, symbol->n_name); X return(0); /* yeah, found a symbol */ X*************** X*** 203,214 **** X { X if (!(symbol->n_sclass & C_EXT)) { /* local symbol */ X if (x_flag) return; X! if (X_flag && (symbol->n_name[0] == 'I' || X! symbol->n_name[0] == 'L')) return; X } X if (fwrite(symbol, sizeof(struct nlist), 1, fd) != 1) { X fprintf(stderr, "can't write %s\n", o_file); X! Exit(-1); X } X nr_symbols++; X } X--- 195,206 ---- X { X if (!(symbol->n_sclass & C_EXT)) { /* local symbol */ X if (x_flag) return; X! if (X_flag && symbol->n_name[0] == 'I') return; X! if (X_flag && symbol->n_name[0] == 'L') return; X } X if (fwrite(symbol, sizeof(struct nlist), 1, fd) != 1) { X fprintf(stderr, "can't write %s\n", o_file); X! exit(-1); X } X nr_symbols++; X } X*************** X*** 238,244 **** X if (ch >= 'a' && ch <= 'f') X return (ch - 'a' + 10); X fprintf(stderr, "illegal file format\n"); X! Exit(-1); X } X X get_name(str1, str2) X--- 230,236 ---- X if (ch >= 'a' && ch <= 'f') X return (ch - 'a' + 10); X fprintf(stderr, "illegal file format\n"); X! exit(-1); X } X X get_name(str1, str2) X*************** X*** 263,277 **** X fd = open(o_file, 0); X if (read(fd, &header, sizeof(struct exec)) != sizeof(struct exec)) { X fprintf(stderr, "%s: no executable file\n", o_file); X! Exit(-1); X } X if (BADMAG(header)) { X fprintf(stderr, "%s: bad header\n", o_file); X! Exit(-1); X } X if (header.a_syms != 0L) { X fprintf(stderr, "%s: symbol table is installed\n", o_file); X! Exit(-1); X } X fseek(o_fd, A_SYMPOS(header), 0); X nr_symbols = 0; X--- 255,269 ---- X fd = open(o_file, 0); X if (read(fd, &header, sizeof(struct exec)) != sizeof(struct exec)) { X fprintf(stderr, "%s: no executable file\n", o_file); X! exit(-1); X } X if (BADMAG(header)) { X fprintf(stderr, "%s: bad header\n", o_file); X! exit(-1); X } X if (header.a_syms != 0L) { X fprintf(stderr, "%s: symbol table is installed\n", o_file); X! exit(-1); X } X fseek(o_fd, A_SYMPOS(header), 0); X nr_symbols = 0; X*************** X*** 281,291 **** X redo_header(fd) X FILE *fd; X { X! header.a_syms = nr_symbols * sizeof(struct nlist); X fseek(fd, 0L, 0); X if (fwrite(&header, sizeof(header), 1, fd) != 1) { X fprintf(stderr, "%s: can't write\n", o_file); X! Exit(-1); X } X } X X--- 273,283 ---- X redo_header(fd) X FILE *fd; X { X! header.a_syms = (long) (nr_symbols * sizeof(struct nlist)); X fseek(fd, 0L, 0); X if (fwrite(&header, sizeof(header), 1, fd) != 1) { X fprintf(stderr, "%s: can't write\n", o_file); X! exit(-1); X } X } X + END-OF-FILE ast.c.cdif chmod 'u=rw,g=r,o=r' 'ast.c.cdif' set `wc -c 'ast.c.cdif'` count=$1 case $count in 6631) :;; *) echo 'Bad character count in ''ast.c.cdif' >&2 echo 'Count should be 6631' >&2 esac echo Extracting 'at.c' sed 's/^X//' > 'at.c' << '+ END-OF-FILE ''at.c' X/* at - run a command at a specified time Author: Jan Looyen */ X X X#define DIR "/usr/spool/at/ X#define STARTDAY 0 /* see ctime(3) */ X#define LEAPDAY STARTDAY+59 X#define MAXDAYNR STARTDAY+365 X#define NODAY -2 X X#include <stdio.h> X#include <sys/types.h> X#include <time.h> X Xmain(argc, argv, envp) Xint argc; Xchar **argv, **envp; X{ X int i, count, ltim, year, getltim(), getlday(), lday = NODAY; X char c, buf[10], job[30], *dp, *sp; X struct tm *p, *localtime(); X long clock; X FILE *fp, *pin, *popen(); X X/*-------------------------------------------------------------------------* X * check arguments & pipe to "pwd" * X *-------------------------------------------------------------------------*/ X if (argc < 2 || argc > 5) { X fprintf(stderr, "Usage: %s time [month day] [file]\n", argv[0]); X exit(1); X } X if ((ltim = getltim(argv[1])) == -1) { X fprintf(stderr, "%s: wrong time specification\n", argv[0]); X exit(1); X } X if ((argc==4 || argc==5) && (lday = getlday(argv[2], argv[3]))==-1) { X fprintf(stderr, "%s: wrong date specification\n", argv[0]); X exit(1); X } X if ((argc==3 || argc==5) && open(argv[argc-1], 0) == -1) { X fprintf(stderr, "%s: cannot find: %s\n", argv[0], argv[argc-1]); X exit(1); X } X if ((pin = popen("pwd", "r")) == NULL) { X fprintf(stderr, "%s: cannot open pipe to cmd 'pwd'\n", argv[0]); X exit(1); X } X/*-------------------------------------------------------------------------* X * determine execution time and create 'at' job file * X *-------------------------------------------------------------------------*/ X time(&clock); X p = localtime(&clock); X year = p->tm_year; X if (lday==NODAY) { /* no [month day] given */ X lday = p->tm_yday; X if (ltim <= (p->tm_hour*100 + p->tm_min)) { X lday++; X if (lday==MAXDAYNR && (year%4) || lday==MAXDAYNR+1) { X lday = STARTDAY; X year++; X } X } X } X else X switch (year%4) { X case 0: if (lday < p->tm_yday || lday == p->tm_yday && X ltim <= (p->tm_hour*100 + p->tm_min) ) { X year++; X if (lday > LEAPDAY) lday-- ; X } X break; X case 1: X case 2: if (lday > LEAPDAY) lday-- ; X if (lday < p->tm_yday || lday == p->tm_yday && X ltim <= (p->tm_hour*100 + p->tm_min) ) X year++; X break; X case 3: if (lday < ((lday > LEAPDAY) ? p->tm_yday+1 : p->tm_yday) || X lday== ((lday > LEAPDAY) ? p->tm_yday+1 : p->tm_yday) && X ltim <= (p->tm_hour*100 + p->tm_min) ) X year++; X else if (lday > LEAPDAY) lday--; X break; X } X sprintf(job, DIR%02d.%03d.%04d.%02d", year%100, lday, ltim, getpid()%100); X if ((fp = fopen(job, "w")) == NULL) { X fprintf(stderr, "%s: cannot create %s\n", argv[0], job); X exit(1); X } X/*-------------------------------------------------------------------------* X * write environment and command(s) to 'at'job file * X *-------------------------------------------------------------------------*/ X while (envp[i] != NULL) { X count = 1; X dp = buf; X sp = envp[i]; X while ((*dp++ = *sp++) != '=') X count++; X *--dp = '\0'; X fprintf(fp, "export %s; %s='%s'\n", buf, buf, &envp[i++][count]); X } X fprintf(fp, "cd "); X while ((c = getc(pin)) != EOF) X putc(c, fp); X fprintf(fp, "umask %o\n", umask()); X if (argc==3 || argc==5) X fprintf(fp, "%s\n", argv[argc-1]); X else /* read from stdinput */ X while ((c = getchar()) != EOF) X putc(c, fp); X X printf("%s: %s created\n", argv[0], job); X exit(0); X} X X/*-------------------------------------------------------------------------* X * getltim() return((time OK) ? daytime : -1) * X *-------------------------------------------------------------------------*/ Xgetltim(t) Xchar *t; X{ X if (t[4] == '\0' && t[3] >= '0' && t[3] <= '9' && X t[2] >= '0' && t[2] <= '5' && t[1] >= '0' && t[1] <= '9' && X (t[0] == '0' || t[0] == '1' || t[1] <= '3' && t[0] == '2') ) X return(atoi(t)); X else X return(-1); X} X X/*-------------------------------------------------------------------------* X * getlday() return ((date OK) ? yearday : -1) * X *-------------------------------------------------------------------------*/ Xgetlday(m, d) Xchar *m, *d; X{ X int i, month, day, im; X static int cumday[] = { 0, 0, 31, 60, 91, 121, 152, X 182, 213, 244, 274, 305, 335 }; X static struct date { X char *mon; X int dcnt; X } *pc, X kal[] = { "Jan", 31, "Feb", 29, "Mar", 31, "Apr", 30, X "May", 31, "Jun", 30, "Jul", 31, "Aug", 31, X "Sep", 30, "Oct", 31, "Nov", 30, "Dec", 31 X }; X X pc = kal; X im = (digitstring(m)) ? atoi(m) : 0; X m[0] &= 0337; X for (i = 1; i < 13 && strcmp(m, pc->mon) && im != i; i++, pc++) X ; X if (i < 13 && (day=(digitstring(d)) ? atoi(d) : 0) && day <= pc->dcnt) { X if (!STARTDAY) day--; X return(day + cumday[i]); X } X else X return(-1); X} X X X Xdigitstring(s) Xchar *s; X{ X while (*s >= '0' && *s <= '9') X s++; X return((*s=='\0') ? 1 : 0); X} X + END-OF-FILE at.c chmod 'u=rw,g=r,o=r' 'at.c' set `wc -c 'at.c'` count=$1 case $count in 4941) :;; *) echo 'Bad character count in ''at.c' >&2 echo 'Count should be 4941' >&2 esac echo Extracting 'banner.c.new' sed 's/^X//' > 'banner.c.new' << '+ END-OF-FILE ''banner.c.new' X/* banner - print a banner Author: Brian Wallis */ X X/***************************************************************** X * X * SYSVbanner.c X * X * This is a PD version of the SYS V banner program (at least I think X * it is compatible to SYS V) which I wrote to use with the clock X * program written by: X ** DCF, Inc. X ** 14623 North 49th Place X ** Scottsdale, AZ 85254 X * and published in the net comp.sources.misc newsgroup in early July X * since the BSD banner program works quite differently. X * X * There is no copyright or responsibility accepted for the use X * of this software. X * X * Brian Wallis, brw@jim.odr.oz, 4 July 1988 X * X *****************************************************************/ X X#include <stdio.h> X Xchar *glyphs[] = { X" @@@ @@@ @@@ @ @ @@@@@ @@@ @ @@ @@@ ", X" @@@ @@@ @@@ @ @ @ @ @@ @ @ @ @ @@@ ", X" @@@ @ @ @@@@@@@@ @ @@@ @ @@ @ ", X" @ @ @ @@@@@ @ @@@ @ ", X" @@@@@@@ @ @ @ @@@@ @ @ ", X" @@@ @ @ @ @ @ @ @ @@ @ ", X" @@@ @ @ @@@@@ @ @@@ @@@@ @ ", X X" @@ @@ @", X" @ @ @ @ @ @ ", X" @ @ @ @ @ @ ", X" @ @ @@@ @@@ @@@@@ @@@ @@@@@ @ ", X" @ @ @ @ @ @@@ @@@ @ ", X" @ @ @ @ @ @ @@@ @ ", X" @@ @@ @ @@@ @ ", X X" @@@ @ @@@@@ @@@@@ @ @@@@@@@ @@@@@ @@@@@@@", X" @ @ @@ @ @@ @@ @ @ @ @@ @ ", X"@ @ @ @ @ @ @@ @ @ @ @ ", X"@ @ @ @ @@@@@ @@@@@ @@@@@@@ @@@@@ @@@@@@ @ ", X"@ @ @ @ @ @ @ @@ @ @ ", X" @ @ @ @ @ @ @ @ @@ @ @ ", X" @@@ @@@@@ @@@@@@@ @@@@@ @ @@@@@ @@@@@ @ ", X X" @@@@@ @@@@@ @ @@@ @ @ @@@@@ ", X"@ @@ @ @ @ @@@ @ @ @ @", X"@ @@ @ @ @ @@@@@ @ @", X" @@@@@ @@@@@@ @@@ @ @ @@ ", X"@ @ @ @ @@@ @ @@@@@ @ @ ", X"@ @@ @ @ @ @ @ @ ", X" @@@@@ @@@@@ @ @ @ @ @ ", X X" @@@@@ @ @@@@@@ @@@@@ @@@@@@ @@@@@@@@@@@@@@ @@@@@ ", X"@ @ @ @ @ @@ @@ @@ @ @ @", X"@ @@@ @ @ @ @ @@ @ @@ @ @ ", X"@ @ @ @@ @@@@@@@ @ @ @@@@@@ @@@@@ @ @@@@", X"@ @@@@ @@@@@@@@ @@ @ @@ @ @ @", X"@ @@ @@ @@ @@ @@ @ @ @", X" @@@@@ @ @@@@@@@ @@@@@ @@@@@@ @@@@@@@@ @@@@@ ", X X"@ @ @*@ @@ @ @ @ @@ @@@@@@@@", X"@ @ @ @@ @ @ @@ @@@@ @@ @", X"@ @ @ @@ @ @ @ @ @ @@ @ @@ @", X"@@@@@@@ @ @@@@ @ @ @ @@ @ @@ @", X"@ @ @ @ @@ @ @ @ @@ @ @@ @", X"@ @ @ @ @@ @ @ @ @@ @@@ @", X"@ @ @@@ @@@@@ @ @ @@@@@@@@ @@ @@@@@@@@", X X"@@@@@@ @@@@@ @@@@@@ @@@@@ @@@@@@@@ @@ @@ @", X"@ @@ @@ @@ @ @ @ @@ @@ @ @", X"@ @@ @@ @@ @ @ @@ @@ @ @", X"@@@@@@ @ @@@@@@@ @@@@@ @ @ @@ @@ @ @", X"@ @ @ @@ @ @ @ @ @ @ @ @ @ @", X"@ @ @ @ @ @ @ @ @ @ @ @ @ @ @", X"@ @@@@ @@ @ @@@@@ @ @@@@@ @ @@ @@ ", X X"@ @@ @@@@@@@@ @@@@@ @ @@@@@ @ ", X" @ @ @ @ @ @ @ @ @ @ ", X" @ @ @ @ @ @ @ @ @ @ ", X" @ @ @ @ @ @ ", X" @ @ @ @ @ @ @ ", X" @ @ @ @ @ @ @ ", X"@ @ @ @@@@@@@ @@@@@ @ @@@@@ @@@@@@@", X X" @@@ ", X" @@@ @@ @@@@@ @@@@ @@@@@ @@@@@@ @@@@@@ @@@@ ", X" @ @ @ @ @ @ @ @ @ @ @ @ @", X" @ @ @ @@@@@ @ @ @ @@@@@ @@@@@ @ ", X" @@@@@@ @ @ @ @ @ @ @ @ @@@", X" @ @ @ @ @ @ @ @ @ @ @ @", X" @ @ @@@@@ @@@@ @@@@@ @@@@@@ @ @@@@ ", X X" ", X" @ @ @ @ @ @ @ @ @ @ @ @@@@ ", X" @ @ @ @ @ @ @ @@ @@ @@ @ @ @", X" @@@@@@ @ @ @@@@ @ @ @@ @ @ @ @ @ @", X" @ @ @ @ @ @ @ @ @ @ @ @ @ @", X" @ @ @ @ @ @ @ @ @ @ @ @@ @ @", X" @ @ @ @@@@ @ @ @@@@@@ @ @ @ @ @@@@ ", X X" ", X" @@@@@ @@@@ @@@@@ @@@@ @@@@@ @ @ @ @ @ @", X" @ @ @ @ @ @ @ @ @ @ @ @ @ @", X" @ @ @ @ @ @ @@@@ @ @ @ @ @ @ @", X" @@@@@ @ @ @ @@@@@ @ @ @ @ @ @ @ @@ @", X" @ @ @ @ @ @ @ @ @ @ @ @ @@ @@", X" @ @@@ @ @ @ @@@@ @ @@@@ @@ @ @", X X" @@@ @ @@@ @@ @ @ @ @", X" @ @ @ @ @@@@@@ @ @ @ @ @ @ @ @ @ ", X" @ @ @ @ @ @ @ @ @@ @ @ @ @", X" @@ @ @ @@ @@ @ @ @ ", X" @@ @ @ @ @ @ @ @ @ @", X" @ @ @ @ @ @ @ @ @ @ ", X" @ @ @ @@@@@@ @@@ @ @@@ @ @ @ @"}; X X Xmain(argc,argv) Xint argc; Xchar *argv[]; X{ X int a,b,c,len,ind; X char line[80]; X X for(argv++;--argc;argv++){ X len=strlen(*argv); X if(len>10) X len=10; X for(a=0;a<7;a++){ X for(b=0;b<len;b++){ X if((ind=(*argv)[b]-' ')<0) X ind=0; X for(c=0;c<7;c++){ X line[b*8+c] = glyphs[(ind/8*7)+a][(ind%8*7)+c]; X } X line[b*8+7] = ' '; X } X for(b=len*8-1;b>=0;b--){ X if(line[b]!=' ') X break; X line[b]='\0'; X } X printf("%s\n", line); X } X printf("\n"); X } X} + END-OF-FILE banner.c.new chmod 'u=rw,g=r,o=r' 'banner.c.new' set `wc -c 'banner.c.new'` count=$1 case $count in 6370) :;; *) echo 'Bad character count in ''banner.c.new' >&2 echo 'Count should be 6370' >&2 esac echo Extracting 'cc.c.cdif' sed 's/^X//' > 'cc.c.cdif' << '+ END-OF-FILE ''cc.c.cdif' X*** /local/ast/minix/tape3b/commands/cc.c Wed Jul 13 13:10:43 1988 X--- cc.c Sun Sep 25 15:24:45 1988 X*************** X*** 1,23 **** X! /* X! Driver for the CEMCOM compiler. X! Derived from: "cem.c,v 1.5 86/01/20 11:10:29 erikb Exp" X! Author: Erik Baalbergen X X! Log: X! Date written: Dec 4, 1985 X! Adapted for PC/IX on Jan 20, 1986 X! Strongly reduced (May 14, 1986) X! Piping output from cpp into cem (Jul 30, 1986) X! Create temporary files in TMP directory (Aug 6, 1986) X! Pass hint for optimization to cg (Aug 15, 1986) X! Throw away intermediate files on interrupts (Aug 15, 1986) X! Print file name if there are more than one source files (Sep 22, 1986) X! Various minor corrections for MINIX (Mar 18, 1987) X! */ X! X #include <errno.h> X #include <signal.h> X X #define MAXARGC 64 /* maximum number of arguments allowed in a list */ X #define USTR_SIZE 64 /* maximum length of string variable */ X X--- 1,31 ---- X! /* cc - call the C compiler Author: Erik Baalbergen */ X X! #ifndef MEM640K X! #ifndef MEM512K X! #ifndef RAMDISK X! #error !!! AH HA! I HAVE YOUR ATTENTION! X! /* This is not an error. It is a dirty trick to force the user to read this X! * comment. The program cc calls the various passes of the compiler. To call X! * them, it must know where they are. On the 640K PC MINIX, cpp and cem are X! * kept in /lib, on the root device. Thus the symbol PP is defined as X! * /lib/cpp, etc. On the 512K AT, there is no room on the root device, so cpp X! * and cem are kept in /usr/lib, which means that PP must be /usr/lib/cpp, X! * etc. One of the following two definitions must be uncommented, to X! * generate the right paths. For 640K machines (PCs or ATs), MEM640K should X! * be defined. For 512K machines, MEM512K should be defined. On ATs with a X! * large RAM disk in extended memory, put the whole compiler on the RAM disk X! * and define RAMDISK. X! */ X! #endif X! #endif X! #endif X! X! X #include <errno.h> X #include <signal.h> X X+ #define SYMBOL_FILE "symbol.out" /* symbol table for prof */ X+ X #define MAXARGC 64 /* maximum number of arguments allowed in a list */ X #define USTR_SIZE 64 /* maximum length of string variable */ X X*************** X*** 28,48 **** X char *al_argv[MAXARGC]; X }; X X- !!! AH HA! I HAVE YOUR ATTENTION! X- /* This is not an error. It is a dirty trick to force the user to read this X- * comment. The program cc calls the various passes of the compiler. To call X- * them, it must know where they are. On the 640K PC MINIX, cpp and cem are X- * kept in /lib, on the root device. Thus the symbol PP is defined as X- * /lib/cpp, etc. On the 512K AT, there is no room on the root device, so cpp X- * and cem are kept in /usr/lib, which means that PP must be /usr/lib/cpp, X- * etc. One of the following two definitions must be uncommented, to X- * generate the right paths. For 640K machines (PCs or Ats), MEM640K should X- * be defined. For 512K machines, MEM512K should be defined. X- */ X X- /* #define MEM640K */ X- /* #define MEM512K */ X- X #ifdef MEM640K X /* MINIX paths for 640K PC (not 512K AT) */ X char *PP = "/lib/cpp"; X--- 36,42 ---- X*************** X*** 50,55 **** X--- 44,50 ---- X char *OPT = "/usr/lib/opt"; X char *CG = "/usr/lib/cg"; X char *ASLD = "/usr/bin/asld"; X+ char *AST = "/usr/bin/ast"; X char *SHELL = "/bin/sh"; X char *LIBDIR = "/usr/lib"; X #endif X*************** X*** 61,88 **** X char *OPT = "/usr/lib/opt"; X char *CG = "/usr/lib/cg"; X char *ASLD = "/usr/bin/asld"; X char *SHELL = "/bin/sh"; X char *LIBDIR = "/usr/lib"; X #endif X X! struct arglist LD_HEAD = { X! 1, X! { X! "/usr/lib/crtso.s", X! } X! }; X X! struct arglist LD_TAIL = { X! 2, X! { X! "/usr/lib/libc.a", X! "/usr/lib/end.s" X! } X! }; X X X char *o_FILE = "a.out"; /* default name for executable file */ X X #define remove(str) (unlink(str), (str)[0] = '\0') X #define cleanup(str) (str && remove(str)) X #define init(al) (al)->al_argc = 1 X--- 56,95 ---- X char *OPT = "/usr/lib/opt"; X char *CG = "/usr/lib/cg"; X char *ASLD = "/usr/bin/asld"; X+ char *AST = "/usr/bin/ast"; X char *SHELL = "/bin/sh"; X char *LIBDIR = "/usr/lib"; X #endif X X! #ifdef RAMDISK X! /* MINIX paths for RAM disk (mostly PC/ATs with large extended memory */ X! char *PP = "/lib/cpp"; X! char *CEM = "/lib/cem"; X! char *OPT = "/lib/opt"; X! char *CG = "/lib/cg"; X! char *ASLD = "/bin/asld"; X! char *AST = "/bin/ast"; X! char *SHELL = "/bin/sh"; X! char *LIBDIR = "/lib"; X! #endif X X! #ifdef RAMDISK X! struct arglist LD_HEAD = {1, { "/lib/crtso.s" } }; X! struct arglist M_LD_HEAD = {1, { "/lib/mrtso.s" } }; X! struct arglist LD_TAIL = {2, { "/lib/libc.a", "/lib/end.s" } }; X! #else X! struct arglist LD_HEAD = {1, { "/usr/lib/crtso.s" } }; X! struct arglist M_LD_HEAD = {1, { "/usr/lib/mrtso.s" } }; X! struct arglist LD_TAIL = {2, { "/usr/lib/libc.a", "/usr/lib/end.s" } }; X! #endif X X X+ X char *o_FILE = "a.out"; /* default name for executable file */ X X+ #define AST_FLAGS "-X" X+ #define AST_TAIL "symbol.out" X+ X #define remove(str) (unlink(str), (str)[0] = '\0') X #define cleanup(str) (str && remove(str)) X #define init(al) (al)->al_argc = 1 X*************** X*** 112,117 **** X--- 119,126 ---- X int S_flag = 0; X int v_flag = 0; X int F_flag = 0; /* use pipes by default */ X+ int s_flag = 0; X+ int p_flag = 0; /* profil flag */ X X char *mkstr(); X char *alloc(); X*************** X*** 141,146 **** X--- 150,156 ---- X main(argc, argv) X char *argv[]; X { X+ register char *f; X char *str; X char **argvec; X int count; X*************** X*** 199,208 **** X append(&ASLD_FLAGS, str); X /*FALLTHROUGH*/ X case 'R': X- case 'p': X case 'w': X append(&CEM_FLAGS, str); X break; X case 'L': X if (strcmp(&str[1], "LIB") == 0) { X append(&OPT_FLAGS, "-L"); X--- 209,224 ---- X append(&ASLD_FLAGS, str); X /*FALLTHROUGH*/ X case 'R': X case 'w': X append(&CEM_FLAGS, str); X break; X+ case 's': X+ s_flag = 1; X+ break; X+ case 'p': X+ p_flag = 1; X+ s_flag = 1; X+ break; X case 'L': X if (strcmp(&str[1], "LIB") == 0) { X append(&OPT_FLAGS, "-L"); X*************** X*** 221,230 **** X argvec = &(SRCFILES.al_argv[0]); X X while (count-- > 0) { X- register char *f; X basename(file = *argvec++, BASE); X X! if (SRCFILES.al_argc > 1) { X write(1, file, strlen(file)); X write(1, ":\n", 2); X } X--- 237,245 ---- X argvec = &(SRCFILES.al_argv[0]); X X while (count-- > 0) { X basename(file = *argvec++, BASE); X X! if (v_flag && SRCFILES.al_argc > 1) { X write(1, file, strlen(file)); X write(1, ":\n", 2); X } X*************** X*** 333,350 **** X init(call); X append(call, ASLD); X concat(call, &ASLD_FLAGS); X append(call, "-o"); X append(call, o_FILE); X! concat(call, &LD_HEAD); X concat(call, &LDFILES); X concat(call, &LD_TAIL); X! if (runvec(call, (char *)0)) { X register i = GEN_LDFILES.al_argc; X X while (i-- > 0) X remove(GEN_LDFILES.al_argv[i]); X X } X } X return(RET_CODE); X } X--- 348,380 ---- X init(call); X append(call, ASLD); X concat(call, &ASLD_FLAGS); X+ if (s_flag) append(call, "-s"); X append(call, "-o"); X append(call, o_FILE); X! if (p_flag) X! concat(call, &M_LD_HEAD); X! else concat(call, &LD_HEAD); X concat(call, &LDFILES); X concat(call, &LD_TAIL); X! if (s_flag) X! f = SYMBOL_FILE; X! else f = (char *) 0; X! if (runvec(call, f)) { X register i = GEN_LDFILES.al_argc; X X while (i-- > 0) X remove(GEN_LDFILES.al_argv[i]); X X } X+ } X+ /* add symbol table when p_flag is set */ X+ if (s_flag) { X+ init(call); X+ append(call, AST); X+ append(call, AST_FLAGS); X+ append(call, o_FILE); X+ append(call, AST_TAIL); X+ (void) runvec(call, (char *) 0); X } X return(RET_CODE); X } + END-OF-FILE cc.c.cdif chmod 'u=rw,g=r,o=r' 'cc.c.cdif' set `wc -c 'cc.c.cdif'` count=$1 case $count in 7822) :;; *) echo 'Bad character count in ''cc.c.cdif' >&2 echo 'Count should be 7822' >&2 esac echo Extracting 'cdiff.c.cdif' sed 's/^X//' > 'cdiff.c.cdif' << '+ END-OF-FILE ''cdiff.c.cdif' X*** /local/ast/minix/tape3b/commands/cdiff.c Wed Jul 13 13:10:45 1988 X--- cdiff.c Mon Sep 26 21:51:52 1988 X*************** X*** 3,21 **** X /* cdiff - turns a regular diff into a new-style context diff X * X * Usage: cdiff file1 file2 X- * X- * $Log: cdiff.c,v $ X- * Revision 1.1.1.2 87/06/04 11:21:43 lwall X- * Didn't do diffs with less than 3 lines of leading context. X- * X- * Revision 1.1.1.1 87/06/03 11:52:25 lwall X- * Wasn't concatenating overlapping hunks right. X- * X- * Revision 1.1 87/06/01 16:05:57 lwall X- * Initial revision X- * X */ X- static char rcsid[] = "$Header: cdiff.c,v 1.1.1.2 87/06/04 11:21:43 lwall Exp $"; X X #define PATCHLEVEL 2 X X--- 3,9 ---- X*************** X*** 27,32 **** X--- 15,21 ---- X char buff[512]; X X FILE *inputfp, *oldfp, *newfp; X+ char *ctime(); X X int oldmin, oldmax, newmin, newmax; X int oldbeg, oldend, newbeg, newend; X*************** X*** 70,79 **** X for (argc--,argv++; argc; argc--,argv++) { X if (argv[0][0] != '-') X break; X! if (argv[0][1] == 'v') { X! printf("%s\n Patch level: %d\n",rcsid,PATCHLEVEL); X! exit(0); X! } X if (argv[0][1] == 'c') X context = atoi(argv[0]+2); X } X--- 59,65 ---- X for (argc--,argv++; argc; argc--,argv++) { X if (argv[0][0] != '-') X break; X! X if (argv[0][1] == 'c') X context = atoi(argv[0]+2); X } + END-OF-FILE cdiff.c.cdif chmod 'u=rw,g=r,o=r' 'cdiff.c.cdif' set `wc -c 'cdiff.c.cdif'` count=$1 case $count in 1360) :;; *) echo 'Bad character count in ''cdiff.c.cdif' >&2 echo 'Count should be 1360' >&2 esac echo Extracting 'chgrp.c.cdif' sed 's/^X//' > 'chgrp.c.cdif' << '+ END-OF-FILE ''chgrp.c.cdif' X*** /local/ast/minix/tape3b/commands/chgrp.c Wed Jul 13 13:10:45 1988 X--- chgrp.c Sun Sep 25 15:24:46 1988 X*************** X*** 5,12 **** X #include <sys/stat.h> X #include <stdio.h> X X- extern lseek(); X- X main (argc, argv) X int argc; X char *argv[]; X--- 5,10 ---- + END-OF-FILE chgrp.c.cdif chmod 'u=rw,g=r,o=r' 'chgrp.c.cdif' set `wc -c 'chgrp.c.cdif'` count=$1 case $count in 270) :;; *) echo 'Bad character count in ''chgrp.c.cdif' >&2 echo 'Count should be 270' >&2 esac echo Extracting 'chmod.c' sed 's/^X//' > 'chmod.c' << '+ END-OF-FILE ''chmod.c' X/* X * chmod.c Author: James da Silva X * (ihnp4!killer!jaime) X * X * a (hopefully) 7th Edition Unix compatible chmod for Minix. X */ X X#include <sys/types.h> X#include <sys/stat.h> X X#define isop(c) ((c=='+')||(c=='-')||(c=='=')) X#define isperm(c) ((c=='r')||(c=='w')||(c=='x')||(c=='s')||(c=='t')||\ X (c=='u')||(c=='g')||(c=='o')) X X/* the bits associated with user, group, other */ X X#define U_MSK (0700 | S_ISUID) X#define G_MSK (0070 | S_ISGID) X#define O_MSK 0007 X Xtypedef unsigned short bitset; /* type used for modes */ X Xstruct stat st; /* structure returned by stat() */ Xchar *pname, *arg; Xbitset newmode, absolute(), symbolic(); Xint isabsolute; X Xmain(argc, argv) Xint argc; Xchar **argv; X{ X int i; X X pname = *(argv++); X if(argc < 3) usage(); X X arg = *argv; /* save pointer to mode arg */ X X /* check for octal mode */ X X if( isabsolute = ((*arg>='0') && (*arg<='7')) ) X newmode = absolute(); X X /* apply the mode to all files listed */ X X for(i=2; i<argc; i++) X { X argv++; X if(stat(*argv, &st)) /* get current file mode */ X { X printf("%s: cannot find `%s'\n", pname, *argv); X exit(1); X } X X /* calculate new mode for this file */ X X if( !isabsolute ) X newmode = symbolic(st.st_mode); X X if(chmod(*argv, newmode)) /* change the mode */ X { X printf("%s: cannot chmod `%s'\n", pname, *argv); X exit(1); X } X } X} X X X/* X * absolute X * X * Interprets an octal mode. X * The file modes will be set to this value. X */ Xbitset absolute() X{ X bitset m; X char *s; X X m = 0; X s = arg; X X /* convert octal string to integer */ X X while((*s>='0') && (*s<='7')) X m = m * 8 + (*(s++) - '0'); X X /* if something else is there, choke */ X X if(*s) badmode(s); X X return m; X} X X X/* X * symbolic X * X * Processes symbolic mode of the form (in EBNF): X * <symbolic> ::= <pgroup> { ',' <pgroup> }. X * <pgroup> ::= [ <who> ] <op> <permissions> { <op> <permissions> }. X * X * <who> ::= <whoch> { <whoch> }. X * <whoch> ::= 'a' | 'u' | 'g' | 'o'. X * X * <op> ::= '+' | '-' | '='. X * X * <permissions> ::= <permch> { <permch> }. X * <permch> ::= 'r' | 'w' | 'x' | 's' | 't' | 'u' | 'g' | 'o'. X * X * If <who> is omitted, 'a' is assumed, BUT umask()ed bits are uneffected. X * If <op> is '=', all unspecified permissions are turned off for this <who>. X * For permissions 'u', 'g', and 'o', the permissions are taken from the X * specified set. i.e. o=g sets the permissions for other the same as for X * group. X * X * Pain in the duff, isn't it? X */ Xbitset symbolic(mode) Xbitset mode; X{ X int g,o,u, haswho, haspcopy; X bitset u_mask, emask, partial, other, applyop(); X char *s, c, op; X X s = arg; X u_mask = umask(0); /* get the umasked bits */ X X do /* pgroup */ X { X haswho = u = g = o = 0; X X while(!isop(*s)) X { X /* we must have a 'who' then */ X haswho = 1; X switch(*s) X { X case 'a': u=g=o=1; break; X case 'u': u = 1; break; X case 'g': g = 1; break; X case 'o': o = 1; break; X X default: badmode(s); X } X s++; X } X X if(!haswho) X { X u=g=o=1; /* assume all */ X emask = ~u_mask; /* effective umask */ X } X else emask = ~0; X X X /* process each given operator */ X X while(isop(*s)) X { X op = *(s++); X other = partial = haspcopy = 0; X X /* collect the specified permissions */ X X while(isperm(*s)) X { X X /* Berkeley only allows one of 'u' 'g' or 'o' as permissions */ X X if((*s=='u')||(*s=='g')||(*s=='o')) X if( haspcopy ) badmode(s); X else haspcopy = 1; X X switch(*s) X { X case 'r': partial |= 4; break; X case 'w': partial |= 2; break; X case 'x': partial |= 1; break; X X case 'u': partial |= (mode & U_MSK &~S_ISUID) >> 6; X other |= mode & S_ISUID; X break; X case 'g': partial |= (mode & G_MSK &~S_ISGID) >> 3; X other |= mode & S_ISGID; X break; X case 'o': partial |= (mode & O_MSK); X break; X X X case 't': other |= S_ISVTX; break; X X case 's': if(u) other |= S_ISUID; X if(g) other |= S_ISGID; X break; X X default: badmode(s); X } X s++; X } X X /* apply the op using the affected bits and masks */ X X if(u) X mode = applyop(mode,op,(other | (partial << 6)),emask,U_MSK); X if(g) X mode = applyop(mode,op,(other | (partial << 3)),emask,G_MSK); X if(o) X mode = applyop(mode,op,(other | partial),emask,O_MSK); X } X X } while(*(s++) == ','); X X /* not at end - choke */ X X if(*(--s)) badmode(s); X X return mode; X} X X X/* X * applyop X * X * applies the operator to the current mode using the specified bitset X * and mask. 'bits' will contain 1's in every bit affected by the X * operator '+', '-', or '='. In the case of '=', msk is used to X * determine which bits will be forced off. 'emask' is the effective X * umask. X */ Xbitset applyop(mode, op, bits, emask, msk) Xchar op; Xbitset mode, bits, emask, msk; X{ X switch(op) X { X case '+': mode |= bits & emask; /* turn these bits on */ X break; X case '-': mode &= ~(bits & emask); /* turn these off */ X break; X case '=': mode |= bits & emask; /* turn these bits on */ X mode &= ~(~bits & msk & emask); /* others off */ X break; X default: /* should never get here (famous last words) */ X printf("%s: panic: bad op `%c' passed\n", pname, op); X } X return mode; X} X X X/* X * usage X * X * Prints a terse usage message and exits. X */ Xusage() X{ X printf("Usage: %s [absolute-mode | symbolic-mode] files\n", pname); X exit(1); X} X X X/* X * badmode X * X * Called when the parser chokes on the given mode. X * Prints a message showing the offending character and exits. X */ Xbadmode(s) Xchar *s; X{ X int i,sp; X char buffer[80], *bp; X X sp = s - arg + strlen(pname) + 21; X sp = sp > 79 ? 79 : sp; /* check for buffer overflow */ X X for(i=0, bp = buffer; i<sp; i++, bp++) *bp = ' '; X *bp = '\0'; X X printf("%s: badly formed mode `%s'\n", pname, arg); X printf("%s^\n", buffer); X exit(1); X} X + END-OF-FILE chmod.c chmod 'u=rw,g=r,o=r' 'chmod.c' set `wc -c 'chmod.c'` count=$1 case $count in 6964) :;; *) echo 'Bad character count in ''chmod.c' >&2 echo 'Count should be 6964' >&2 esac echo Extracting 'chown.c.cdif' sed 's/^X//' > 'chown.c.cdif' << '+ END-OF-FILE ''chown.c.cdif' X*** /local/ast/minix/tape3b/commands/chown.c Wed Jul 13 13:10:46 1988 X--- chown.c Sun Sep 25 15:24:46 1988 X*************** X*** 1,9 **** X! /* X! * chown username file ... X! * X! * By Patrick van Kleef X! * X! */ X X #include <pwd.h> X #include <sys/types.h> X--- 1,4 ---- X! /* chown - change file ownership Author: Patrick van Kleef */ X X #include <pwd.h> X #include <sys/types.h> + END-OF-FILE chown.c.cdif chmod 'u=rw,g=r,o=r' 'chown.c.cdif' set `wc -c 'chown.c.cdif'` count=$1 case $count in 385) :;; *) echo 'Bad character count in ''chown.c.cdif' >&2 echo 'Count should be 385' >&2 esac echo Extracting 'clr.c.cdif' sed 's/^X//' > 'clr.c.cdif' << '+ END-OF-FILE ''clr.c.cdif' X*** /local/ast/minix/tape3b/commands/clr.c Wed Jul 13 13:10:46 1988 X--- clr.c Sun Sep 25 15:24:47 1988 X*************** X*** 1,9 **** X /* clr - clear the screen Author: Andy Tanenbaum */ X X main() X! { X! /* Clear the screen. */ X X! prints("\033[H\033[J"); X exit(0); X! } X--- 1,46 ---- X /* clr - clear the screen Author: Andy Tanenbaum */ X X+ /* Changed for termcap. 1988-Apr-2 efth */ X+ X+ X+ #include <stdio.h> X+ X+ #define TC_BUFFER 1024 /* Size of termcap(3) buffer */ X+ X+ extern char *getenv(); X+ extern char *tgetstr(); X+ X+ char buffer[ TC_BUFFER ]; X+ X+ X main() X! { X! char *term; X! char clear[ 30 ]; X! char *p = &clear[0]; X X! if ( (term = getenv( "TERM" )) == NULL ) X! Error( "$TERM not defined" ); X! X! if ( tgetent( buffer, term ) != 1 ) X! Error( "No termcap definition for $TERM" ); X! X! if ( (tgetstr( "cl", &p )) == NULL ) X! Error( "No clear (cl) entry for $TERM" ); X! X! /* Clear the screen */ X! X! printf( "%s", clear ); X! X exit(0); X! } X! X! X! X! Error( str ) X! char *str; X! X! { X! fprintf( stderr, "clr: %s\n", str ); X! exit( 1 ); X! } + END-OF-FILE clr.c.cdif chmod 'u=rw,g=r,o=r' 'clr.c.cdif' set `wc -c 'clr.c.cdif'` count=$1 case $count in 1140) :;; *) echo 'Bad character count in ''clr.c.cdif' >&2 echo 'Count should be 1140' >&2 esac echo Extracting 'cp.c.cdif' sed 's/^X//' > 'cp.c.cdif' << '+ END-OF-FILE ''cp.c.cdif' X*** /local/ast/minix/tape3b/commands/cp.c Wed Jul 13 13:10:49 1988 X--- cp.c Sun Sep 25 15:24:49 1988 X*************** X*** 99,105 **** X int fd1, fd2; X char *name; X { X! int n, m; X X do { X n = read(fd1, cpbuf, TRANSFER_UNIT); X--- 99,106 ---- X int fd1, fd2; X char *name; X { X! int n, m, mode; X! struct stat sbuf; X X do { X n = read(fd1, cpbuf, TRANSFER_UNIT); X*************** X*** 107,114 **** X if (n > 0) { X m = write(fd2, cpbuf, n); X if (m != n) { X perror("cp"); X! unlink(name); /* don't leave truncated file around */ X exit(1); X } X if (isfloppy) sync(); /* purge the cache all at once */ X--- 108,118 ---- X if (n > 0) { X m = write(fd2, cpbuf, n); X if (m != n) { X+ /* Write failed. Don't keep truncated regular file. */ X perror("cp"); X! fstat(fd2, &sbuf); /* check for special files */ X! mode = sbuf.st_mode & S_IFMT; X! if (mode == S_IFREG) unlink(name); X exit(1); X } X if (isfloppy) sync(); /* purge the cache all at once */ X*************** X*** 124,132 **** X--- 128,146 ---- X exit(-1); X } X X+ typedef char *cptr; X+ X int equal(s1, s2) X char *s1, *s2; X { X+ struct stat sb1, sb2; X+ X+ /* same file, different name? */ X+ stat(s1, &sb1); X+ stat(s2, &sb2); X+ if (memcmp((cptr)&sb1, (cptr)&sb2, sizeof(struct stat)) == 0) X+ return(1); X+ /* same file, same name? */ X while (1) { X if (*s1 == 0 && *s2 == 0) return(1); X if (*s1 != *s2) return(0); X*************** X*** 154,157 **** X--- 168,185 ---- X std_err(s1); X std_err(s2); X std_err(s3); X+ } X+ X+ X+ int memcmp(b1, b2, n) X+ cptr b1, b2; X+ int n; X+ { X+ while (n--) { X+ if (*b1 != *b2) X+ return ((int) (*b1 - *b2)); X+ ++b1; X+ ++b2; X+ } X+ return (0); X } + END-OF-FILE cp.c.cdif chmod 'u=rw,g=r,o=r' 'cp.c.cdif' set `wc -c 'cp.c.cdif'` count=$1 case $count in 1737) :;; *) echo 'Bad character count in ''cp.c.cdif' >&2 echo 'Count should be 1737' >&2 esac echo Extracting 'cpdir.c.cdif' sed 's/^X//' > 'cpdir.c.cdif' << '+ END-OF-FILE ''cpdir.c.cdif' X*** /local/ast/minix/tape3b/commands/cpdir.c Wed Jul 13 13:10:50 1988 X--- cpdir.c Sun Sep 25 15:24:50 1988 X*************** X*** 3,19 **** X /* Use "cpdir [-v] src dst" to make a copy dst of directory src. X Cpdir should behave like the UNIX shell command X (cd src; tar cf - .) | (mkdir dst; cd dst; tar xf -) X! but the linking structure of the tree is not yet preserved. X! (See the work-yet-to-be-done list below.) X The -m "merge" flag enables you to copy into an existing directory. X The -s "similar" flag preserves the full mode, uid, gid and times. X The -v "verbose" flag enables you to see what's going on when running cpdir. X X Work yet to be done: X! - preserve link structure X - link checks, i.e. am I not overwriting a file/directory by itself? X- - handle character and block special files X- * they're simply not copied X X Please report bugs and suggestions to erikb@cs.vu.nl X */ X--- 3,16 ---- X /* Use "cpdir [-v] src dst" to make a copy dst of directory src. X Cpdir should behave like the UNIX shell command X (cd src; tar cf - .) | (mkdir dst; cd dst; tar xf -) X! X The -m "merge" flag enables you to copy into an existing directory. X The -s "similar" flag preserves the full mode, uid, gid and times. X The -v "verbose" flag enables you to see what's going on when running cpdir. X X Work yet to be done: X! X - link checks, i.e. am I not overwriting a file/directory by itself? X X Please report bugs and suggestions to erikb@cs.vu.nl X */ X*************** X*** 29,39 **** X--- 26,46 ---- X #define PLEN 256 X #define DIRSIZ 16 X X+ #define MAXLINKS 512 X+ X+ struct { X+ unsigned short ino; X+ unsigned short dev; X+ char *path; X+ } links[MAXLINKS]; X+ int nlinks = 0; X+ X char *prog; X int vflag = 0; /* verbose */ X int mflag = 0; /* force */ X int sflag = 0; /* similar */ X char *strcpy(); X+ char *malloc(); X X main(argc, argv) X char *argv[]; X*************** X*** 125,130 **** X--- 132,139 ---- X strcpy(dend, ent + 2); X if (stat(spath, &st) < 0) X fatal("can't get file status of %s", spath); X+ if ((st.st_mode & S_IFMT)!=S_IFDIR && st.st_nlink>1) X+ if (cplink(st,spath,dpath)==1) continue; X switch (st.st_mode & S_IFMT) { X case S_IFDIR: X cpdir(&st, spath, dpath); X*************** X*** 133,139 **** X cp(&st, spath, dpath); X break; X default: X! nonfatal("can't copy special file %s", spath); X } X } X } X--- 142,149 ---- X cp(&st, spath, dpath); X break; X default: X! cpspec(&st, spath, dpath); X! break; X } X } X } X*************** X*** 215,218 **** X--- 225,290 ---- X exit(1); X } X X+ cpspec(sp, s, d) X+ struct stat *sp; X+ char *s, *d; X+ { X+ if (vflag) X+ { X+ printf("copy special file %s to %s.", s, d); X+ printf(" Major/minor = %d/%d.", X+ sp->st_rdev>>8, sp->st_rdev&0177); X+ printf(" Mode = %o.\n", sp->st_mode); X+ } X+ if (mknod(d, sp->st_mode, sp->st_rdev)<0) X+ { X+ perror("mknod"); X+ nonfatal("Cannot create special file %s.\n",d); X+ } X+ if (sflag) X+ similar(sp, d); X+ } X+ X+ cplink(st,spath,dpath) X+ struct stat st; X+ char *spath, *dpath; X+ { X+ /* Handle files that are links. X+ * Returns 0 if file must be copied. X+ * Returns 1 if file has been successfully linked. X+ */ X+ int i; X+ int linkent; X+ X+ linkent = -1; X+ for (i=0; i<nlinks; i++) X+ { X+ if (links[i].dev==st.st_dev X+ && links[i].ino==st.st_ino) X+ linkent=i; X+ } X+ if (linkent>=0) /* It's already in the link table */ X+ { /* we must have copied it earlier. X+ * So just link to the saved dest path. X+ * Don't copy it twice. X+ */ X+ if (vflag) X+ printf("ln %s %s\n", links[linkent].path,dpath); X+ if (link(links[linkent].path,dpath) < 0) X+ fatal("Could not link to %s\n",dpath); X+ return(1); /* Don't try to copy it */ X+ } else { /* Make an entry in the link table */ X+ if (nlinks >= MAXLINKS) X+ fatal("Too many links at %s\n",dpath); X+ links[nlinks].dev = st.st_dev; X+ links[nlinks].ino = st.st_ino; X+ links[nlinks].path = malloc(strlen(dpath)+1); X+ if (links[nlinks].path == NULL) X+ fatal("No more memory at %s\n",dpath); X+ strcpy(links[nlinks].path,dpath); X+ nlinks++; X+ /* Go ahead and copy it the first time */ X+ return(0); X+ } X+ } X + END-OF-FILE cpdir.c.cdif chmod 'u=rw,g=r,o=r' 'cpdir.c.cdif' set `wc -c 'cpdir.c.cdif'` count=$1 case $count in 4265) :;; *) echo 'Bad character count in ''cpdir.c.cdif' >&2 echo 'Count should be 4265' >&2 esac exit 0
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)
The message could not be delivered to: Addressee: EAMATEO Reason: %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI ---------------------------------------- Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 02:56 N Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 5780 for EAMATEO@EBRUPC51; Thu, 29 Sep 88 02:56 N Received: by EB0UB011 (Mailer X1.25) id 1513; Thu, 29 Sep 88 02:50:26 HOE Date: Tue, 27 Sep 88 20:52:29 GMT From: Andy Tanenbaum <ast@CS.VU.NL> Subject: V1.3c posting #4 - commands (2 of 3) Sender: Minix operating system <MINIX-L@FINHUTC.BITNET> To: NACHO NAVARRO <EAMATEO@EBRUPC51> Reply-to: INFO-MINIX@UDEL.EDU Comments: Warning -- original Sender: tag was info-minix-request@UDEL.EDU Comments: To: info-minix@UDEL.EDU : This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. : --------------------------- cut here -------------------------- PATH=/bin:/usr/bin:/usr/ucb echo Extracting 'date.c' sed 's/^X//' > 'date.c' << '+ END-OF-FILE ''date.c' X/* date - print or set time and date Author: Jan Looyen */ X X#include <stdio.h> X#include <time.h> X X#define MIN 60L /* # seconds in a minute */ X#define HOUR (60 * MIN) /* # seconds in an hour */ X#define DAY (24 * HOUR) /* # seconds in a day */ X#define YEAR (365 * DAY) /* # seconds in a year */ X Xchar *ctime(); X Xmain(argc, argv) Xint argc; Xchar **argv; X{ X int qflag; X long t, time(); X char time_buf[15]; X X if (argc > 2) usage(); X if (argc == 2) { X if (*argv[1] == '-' && (argv[1][1] | 0x60) == 'q') { X freopen(stdin, "/dev/tty0", "r"); X printf("\nPlease enter date: MMDDYYhhmmss. Then hit RETURN.\n"); X gets(time_buf); X set_time(time_buf); X } X else X set_time(argv[1]); X } X time(&t); X printf("%s", ctime(&t)); X exit(0); X} X X Xset_time(t) Xchar *t; X{ X char *tp; X long ct, time(); X int len; X static int days_per_month[] = { X 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 X }; X struct tm *p, *localtime(); X X time(&ct); X p = localtime(&ct); X p->tm_year -= 1970; X p->tm_mon++; X len = strlen(t); X if (len != 12 && len != 10 && len != 6 && len != 4) usage(); X tp = t; X while (*tp) X if (!isdigit(*tp++)) X bad(); X if (len == 6 || len == 12) X p->tm_sec = conv(&tp, 59); X p->tm_min = conv(&tp, 59); X p->tm_hour = conv(&tp, 23); X if (len == 12 || len == 10) { X p->tm_year = conv(&tp, 99); X p->tm_mday = conv(&tp, 31); X p->tm_mon = conv(&tp, 12); X p->tm_year -= 70; X if (p->tm_year < 0) X p->tm_year += 100; X } X ct = p->tm_year * YEAR; X ct += ((p->tm_year + 1) / 4) * DAY; X days_per_month[1] = 28; X if (((p->tm_year + 2) % 4) == 0) X days_per_month[1]++; X len = 0; X p->tm_mon--; X while (len < p->tm_mon) X ct += days_per_month[len++] * DAY; X ct += --p->tm_mday * DAY; X ct += p->tm_hour * HOUR; X ct += p->tm_min * MIN; X ct += p->tm_sec; X if (stime(&ct)) X fprintf(stderr, "Set date not allowed\n"); X} X Xconv(ptr, max) Xchar **ptr; Xint max; X{ X int buf; X X *ptr -=2; X buf = atoi(*ptr); X **ptr = 0; X if (buf < 0 || buf > max) X bad(); X return(buf); X} X Xbad() X{ X fprintf(stderr, "Date: bad conversion\n"); X exit(1); X} X Xusage() X{ X fprintf(stderr, "Usage: date [-q] [[MMDDYY]hhmm[ss]]\n"); X exit(1); X} X Xisdigit(c) Xchar c; X{ X if (c >= '0' && c <= '9') X return(1); X else X return(0); X} + END-OF-FILE date.c chmod 'u=rw,g=r,o=r' 'date.c' set `wc -c 'date.c'` count=$1 case $count in 2223) :;; *) echo 'Bad character count in ''date.c' >&2 echo 'Count should be 2223' >&2 esac echo Extracting 'df.c.cdif' sed 's/^X//' > 'df.c.cdif' << '+ END-OF-FILE ''df.c.cdif' X*** /local/ast/minix/tape3b/commands/df.c Wed Jul 13 13:10:51 1988 X--- df.c Sun Sep 25 15:24:55 1988 X*************** X*** 178,187 **** X char *p; X { X char c; X X while (1) { X! c = getchar(); X! if (c < 0) exit(0); X if (c == ' ') c = 0; X *p++ = c; X if (c == '\n') return; X--- 178,189 ---- X char *p; X { X char c; X+ char ch; X X while (1) { X! ch = getchar(); X! if (ch == EOF) exit(0); X! c = (char) ch; X if (c == ' ') c = 0; X *p++ = c; X if (c == '\n') return; + END-OF-FILE df.c.cdif chmod 'u=rw,g=r,o=r' 'df.c.cdif' set `wc -c 'df.c.cdif'` count=$1 case $count in 487) :;; *) echo 'Bad character count in ''df.c.cdif' >&2 echo 'Count should be 487' >&2 esac echo Extracting 'diskcheck.c.cdif' sed 's/^X//' > 'diskcheck.c.cdif' << '+ END-OF-FILE ''diskcheck.c.cdif' X*** /local/ast/minix/tape3b/commands/diskcheck.c Wed Jul 13 13:10:51 1988 X--- diskcheck.c Sun Sep 25 15:24:55 1988 X*************** X*** 15,20 **** X--- 15,21 ---- X int pfd; /* file descriptor for purging */ X int fd; /* file descriptor for data I/O */ X unsigned initblock; /* first block to test */ X+ unsigned curblock; /* current block */ X unsigned limit; /* first block beyond test zone */ X unsigned errors; /* # errors so far */ X unsigned ct; /* # blocks read so far */ X*************** X*** 62,67 **** X--- 63,69 ---- X write(fd, buf, BLOCK_SIZE); X } X } X+ curblock = b; X ct++; X if (ct % PRINTFREQ == 0) status(); X } X*************** X*** 120,126 **** X X status() X { X! printf("%5u blocks tested, %u errors detected\n",ct,errors); X } X X nonfatal(s, b) X--- 122,129 ---- X X status() X { X! printf("%5u blocks tested, %u errors detected (last block tested = %5u)\n", X! ct,errors,curblock); X } X X nonfatal(s, b) + END-OF-FILE diskcheck.c.cdif chmod 'u=rw,g=r,o=r' 'diskcheck.c.cdif' set `wc -c 'diskcheck.c.cdif'` count=$1 case $count in 956) :;; *) echo 'Bad character count in ''diskcheck.c.cdif' >&2 echo 'Count should be 956' >&2 esac echo Extracting 'dosread.c' sed 's/^X//' > 'dosread.c' << '+ END-OF-FILE ''dosread.c' X/* dos{read|write|dir} - handle DOS disks Author: Michiel Huisjes */ X X/* dosdir - list MS-DOS directories. X * doswrite - write stdin to DOS-file X * dosread - read DOS-file to stdout X * X * Author: Michiel Huisjes. X * X * Usage: dos... [-lra] drive [file/dir] X * l: Give long listing. X * r: List recursively. X * a: Set ASCII bit. X * X * Modified by Tim Kachel 4-88 X * drive can be 0,1, a, b, c, d, e, f X * program will automatically configure to different hard disks X * and the partitions for such (could change drive name for X * a second hard disk if you have one) X * (has been tested on a 16 bit FAT AT drive) X * (High density AT diskettes and regular 360K) X * compile with cc -O -i X * hard disk is named /dev/hd0 to avoid accidents X * To test FAT sizes on your hard disk first try dir -lr c X * (or what ever your dos partition is) if this works X * properly then all the rest should be okay. X * If there are any problems there is debugging information X * in fdinit() -- please let me know of any problems X */ X X#include <sys/stat.h> X X#define DRIVE0 "/dev/at0" X#define DRIVE1 "/dev/at1" X#define FDRIVE "/dev/hd0" X X#define DDDD 0xFD X#define DDHD 0xF9 X#define DDFD 0xF8 X X#define MAX_CLUSTER_SIZE 4096 X#define MAX_FAT_SIZE 23552 /* 46 sectoren */ X#define HMASK 0xFF00 X#define LMASK 0x00FF X X#define MAX_ROOT_ENTRIES 512 /* 32 sectoren */ X#define FAT_START 512L /* After bootsector */ X#define clus_add(cl_no) ((long) (((long) cl_no - 2L) \ X * (long) cluster_size \ X + (long) data_start \ X )) Xstruct dir_entry { X unsigned char d_name[8]; X unsigned char d_ext[3]; X unsigned char d_attribute; X unsigned char d_reserved[10]; X unsigned short d_time; X unsigned short d_date; X unsigned short d_cluster; X unsigned long d_size; X}; X Xtypedef struct dir_entry DIRECTORY; X X#define NOT_USED 0x00 X#define ERASED 0xE5 X#define DIR 0x2E X#define DIR_SIZE (sizeof (struct dir_entry)) X#define SUB_DIR 0x10 X#define NIL_DIR ((DIRECTORY *) 0) X X#define LAST_CLUSTER 0x0FFF X#define MASK 0xFF8 /* FF8 - FFF are last cluster */ X#define FREE 0x000 X#define BAD 0xFF0 /* Includes reserved */ X X#define LAST_16 0xFFFF X#define MASK_16 0xFFF8 X#define FREE_16 0x0000 X#define BAD_16 0xFFF0 /* Includes reserved */ X Xtypedef char BOOL; X X#define TRUE 1 X#define FALSE 0 X#define NIL_PTR ((char *) 0) X X#define DOS_TIME 315532800L /* 1970 - 1980 */ X X#define READ 0 X#define WRITE 1 X#define disk_read(s, a, b) disk_io(READ, s, a, b) X#define disk_write(s, a, b) disk_io(WRITE, s, a, b) X X#define FIND 3 X#define LABEL 4 X#define ENTRY 5 X#define find_entry(d, e, p) directory(d, e, FIND, p) X#define list_dir(d, e, f) (void) directory(d, e, f, NIL_PTR) X#define label() directory(root, root_entries, LABEL, NIL_PTR) X#define new_entry(d, e) directory(d, e, ENTRY, NIL_PTR) X X#define is_dir(d) ((d)->d_attribute & SUB_DIR) X X#define EOF 0400 X#define EOF_MARK '\032' X#define STD_OUT 1 X#define flush() print(STD_OUT, NIL_PTR, 0) X Xshort disk; Xunion tbl X{ X unsigned char twelve[4096]; X unsigned short sixteen[MAX_FAT_SIZE / 2 ]; X} fat; X XDIRECTORY root[MAX_ROOT_ENTRIES], save_entry, *directory(), *read_cluster(); Xchar null[MAX_CLUSTER_SIZE], *device, path[128]; Xshort total_clusters, cluster_size, fat_size, root_entries, sub_entries; X XBOOL Rflag, Lflag, Aflag, dos_read, dos_write, dos_dir, Tfat = TRUE; X Xunsigned short free_cluster(), next_cluster(); Xchar *make_name(), *num_out(), *slash(), *brk(); Xlong mark, data_start, lseek(), time(), f_start; X Xleave(nr) Xshort nr; X{ X (void) umount(device); X exit(nr); X} X Xusage(prog_name) Xregister char *prog_name; X{ X print_string(TRUE, "Usage: %s [%s\n", prog_name, X dos_dir ? "-lr] drive [dir]" : "-a] drive file"); X exit(1); X} X Xmain(argc, argv) Xint argc; Xregister char *argv[]; X{ X register char *arg_ptr = slash(argv[0]); X DIRECTORY *entry; X short index = 1; X char dev_nr; X unsigned char fat_type, fat_check; X BOOL fdisk = FALSE; X int i; X X if (!strcmp(arg_ptr, "dosdir")) X dos_dir = TRUE; X else if (!strcmp(arg_ptr, "dosread")) X dos_read = TRUE; X else if (!strcmp(arg_ptr, "doswrite")) X dos_write = TRUE; X else { X print_string(TRUE, "Program should be named dosread, doswrite or dosdir.\n"); X exit(1); X } X X if (argc == 1) X usage(argv[0]); X X if (argv[1][0] == '-') { X for (arg_ptr = &argv[1][1]; *arg_ptr; arg_ptr++) { X if (*arg_ptr == 'l' && dos_dir) X Lflag = TRUE; X else if (*arg_ptr == 'r' && dos_dir) X Rflag = TRUE; X else if (*arg_ptr == 'a' && !dos_dir) X Aflag = TRUE; X else X usage(argv[0]); X } X index++; X } X X if (index == argc) X usage(argv[0]); X X switch (dev_nr = *argv[index++]) X { X case '0': X case 'a': device = DRIVE0; break; X case '1': X case 'b': device = DRIVE1; break; X case 'c': X case 'd': X case 'e': X case 'f': fdisk = TRUE; device = FDRIVE; break; X default : usage(argv[0]); X } X X if ((disk = open(device, 2)) < 0) { X print_string(TRUE, "Cannot open %s\n", device); X exit(1); X } X X if (fdisk) { /* fixed disk */ X fdinit(dev_nr); X disk_read(f_start, &fat_type, sizeof(fat_type)); X if (fat_type != DDFD) { X print_string(TRUE, "Fixed disk is not DOS\n"); X leave(1); X } X } X else { /* use standard start for floppies */ X f_start = FAT_START; X disk_read(f_start, &fat_type, sizeof(fat_type)); X if (fat_type == DDDD) { /* Double-sided double-density 9 s/t */ X total_clusters = 355; /* 720 - 7 - 2 - 2 - 1 */ X cluster_size = 1024; /* 2 sectors per cluster */ X fat_size = 1024; /* 2 sectors */ X data_start = 6144L; /* Starts on sector #12 */ X root_entries = 112; X sub_entries = 32; /* 1024 / 32 */ X } X else if (fat_type == DDHD) { /* Double-sided high-density 15 s/t */ X total_clusters = 2372; /* 2400 - 14 - 7 - 7 - 1 */ X cluster_size = 512; /* 1 sector per cluster */ X fat_size = 3584; /* 7 sectors */ X data_start = 14848L; /* Starts on sector #29 */ X root_entries = 224; X sub_entries = 16; /* 512 / 32 */ X } X else { X print_string(TRUE, "Diskette is not DOS 2.0 360K or 1.2M\n"); X leave(1); X } X } X X disk_read(f_start + (long) fat_size, &fat_check, sizeof(fat_check)); X if (fat_check != fat_type) { X print_string(TRUE, "Disk type in FAT copy differs from disk type in FAT original.\n"); X leave(1); X } X X if (Tfat) /* twelve bit FAT entries */ X disk_read(f_start, fat.twelve, fat_size); X else /* sixteen bit */ X disk_read(f_start, fat.sixteen, fat_size); X/******* X for (i=0; i<= 30; i++){ X printf("%x\t%c", fat.sixteen[i], (i % 10) ? ' ':'\n'); X } X leave(1); X/*******/ X disk_read(f_start + 2L * (long) fat_size, root, DIR_SIZE * root_entries); X/******* X for (i=0; i<2; i++){ X printf("%s d_name\n", root[i].d_name); X printf("%s d_ext\n", root[i].d_ext); X printf("%d d_attr\n", root[i].d_attribute); X printf("%s d_reserved\n", root[i].d_reserved); X printf("%d d_time\n", root[i].d_time); X printf("%d d_date\n", root[i].d_date); X printf("%d d_cluster\n", root[i].d_cluster); X printf("%D d_size\n", root[i].d_size); X } X X X/*********/ X if (dos_dir) { X entry = label(); X print_string(FALSE, "Volume in drive %c ", dev_nr); X if (entry == NIL_DIR) X print(STD_OUT, "has no label.\n\n", 0); X else X print_string(FALSE, "is %S\n\n", entry->d_name); X } X X if (argv[index] == NIL_PTR) { X if (!dos_dir) X usage(argv[0]); X print(STD_OUT, "Root directory:\n", 0); X list_dir(root, root_entries, FALSE); X free_blocks(); X flush(); X leave(0); X } X X for (arg_ptr = argv[index]; *arg_ptr; arg_ptr++) X if (*arg_ptr == '\\') X *arg_ptr = '/'; X else if (*arg_ptr >= 'a' && *arg_ptr <= 'z') X *arg_ptr += ('A' - 'a'); X if (*--arg_ptr == '/') X *arg_ptr = '\0'; /* skip trailing '/' */ X X add_path(argv[index], FALSE); X add_path("/", FALSE); X X if (dos_dir) X print_string(FALSE, "Directory %s:\n", path); X X entry = find_entry(root, root_entries, argv[index]); X X if (dos_dir) { X list_dir(entry, sub_entries, FALSE); X free_blocks(); X } X else if (dos_read) X extract(entry); X else { X if (entry != NIL_DIR) { X flush(); X if (is_dir(entry)) X print_string(TRUE, "%s is a directory.\n", path); X else X print_string(TRUE, "%s already exists.\n", argv[index]); X leave(1); X } X X add_path(NIL_PTR, TRUE); X X if (*path) X make_file(find_entry(root, root_entries, path), X sub_entries, slash(argv[index])); X else X make_file(root, root_entries, argv[index]); X } X X (void) close(disk); X flush(); X leave(0); X} X Xfdinit(part_nr) /* Fixed Disk Initializations */ Xchar part_nr; X{ X X#define SECSIZE 512 /* sector size */ X#define TABLEOFFSET 0x1be /* offset in boot sector*/ X X /* X * Description of entry in partition table X */ X struct part_entry { X char bootind; /* boot indicator 0/0x80 */ X char start_head; /* head value for first sector */ X char start_sec; /* sector value for first sector*/ X char start_cyl; /* track value for first sector */ X char sysind; /* system indicator 00=?? 01=DOS*/ X char last_head; /* head value for last sector */ X char last_sec; /* sector value for last sector */ X char last_cyl; /* track value for last sector */ X long lowsec; /* logical first sector */ X long size; /* size of partion in sectors */ X } *pe; X X char secbuf[SECSIZE]; X X /* X * Description of the boot block X */ X struct { X unsigned char jump[3]; X unsigned char oem[8]; X unsigned char bytes_sector[2]; X unsigned char cluster_size; X unsigned char res_sectors[2]; X unsigned char num_fats; X unsigned char root_entries[2]; X unsigned char logical_sectors[2]; X unsigned char media_type; X unsigned char fat_sectors[2]; X unsigned char track_sectors[2]; X unsigned char num_heads[2]; X unsigned char hidden_sectors[2]; X } boot; X X short block_size, reserved; long boot_loc; X X disk_read(0L, secbuf, SECSIZE); /* get boot sector */ X /* offset into boot sector for the partition table */ X pe = (struct part_entry *)&secbuf[TABLEOFFSET]; X /* get the proper partition */ X switch(part_nr) { X case 'f': pe++; X case 'e': pe++; X case 'd': pe++; X case 'c': boot_loc = pe->lowsec * 512L; break; X default: printf("Error: unknown partition\n"); leave(); X } X /* now read the boot block for the partition needed */ X disk_read(boot_loc, &boot, sizeof(boot)); X X /* this section can be used to print drive information */ X/************** X printf("OEM = %s\n", boot.oem); X printf("Bytes/sector = %d\n", X (boot.bytes_sector[1] << 8 & HMASK) + (boot.bytes_sector[0] & LMASK)); X printf("Sectors/cluster = %d\n", boot.cluster_size); X printf("Number of Reserved Clusters = %d\n", X (boot.res_sectors[1] << 8 & HMASK) + (boot.res_sectors[0] & LMASK)); X printf("Number of FAT's = %d\n", boot.num_fats); X printf("Number of root-directory entries = %d\n", X (boot.root_entries[1] << 8 & HMASK) + (boot.root_entries[0] & LMASK)); X printf("Total sectors in logical volume = %D\n", X (long) (boot.logical_sectors[1] << 8 & HMASK) + (boot.logical_sectors[0] & LMASK)); X printf("Media Descriptor = %x\n", boot.media_type); X printf("Number of sectors/FAT = %d\n", X (boot.fat_sectors[1] << 8 & HMASK) + (boot.fat_sectors[0] & LMASK)); X printf("Sectors/track = %d\n", X (boot.track_sectors[1] << 8 & HMASK) + (boot.track_sectors[0] & LMASK)); X printf("Number of Heads = %d\n", X (boot.num_heads[1] << 8 & HMASK) + (boot.num_heads[0] & LMASK)); X printf("Number of hidden sectors = %d\n", X (boot.hidden_sectors[1] << 8 & HMASK) + (boot.hidden_sectors[0] & LMASK)); X leave(1); X/**************/ X if (boot.media_type != DDFD) { X printf("DISK is not DOS Format.\n"); X leave(1); X } X if (boot.num_fats != 2) { X printf("Disk does not have two FAT Tables!\n"); X leave(1); X } X block_size = (boot.bytes_sector[1] << 8 & HMASK) + X (boot.bytes_sector[0] & LMASK); X if ((cluster_size = block_size * boot.cluster_size) X > MAX_CLUSTER_SIZE) { X printf("Cluster size is larger than MAX_CLUSTER_SIZE.\n"); X leave(1); X } X reserved = ((boot.res_sectors[1] << 8 & HMASK) + X (boot.res_sectors[0] & LMASK)); X f_start = boot_loc + (long) block_size * (long) reserved; X root_entries = (boot.root_entries[1] << 8 & HMASK) + X (boot.root_entries[0] & LMASK); X fat_size = (boot.fat_sectors[1] << 8 & HMASK) + X (boot.fat_sectors[0] & LMASK); X /* (sectors - rootdir - fats - reserved) / blocks/cluster */ X total_clusters = (int) ((long) ((boot.logical_sectors[1] << 8 & HMASK) + X (boot.logical_sectors[0] & LMASK)) - X (root_entries * 32 / block_size) - X (fat_size * 2) - reserved) / boot.cluster_size; X if (total_clusters > 4096) X Tfat = FALSE; /* sixteen bit fat entries */ X if ( (fat_size *= block_size) > MAX_FAT_SIZE) { X printf("Disk FAT is larger than MAX_FAT_SIZE.\n"); X leave(1); X } X sub_entries = cluster_size / 32; X data_start = f_start + (long) (fat_size * 2L) + X (long) (root_entries * 32L); X/********** X printf("f_start = %D\n", f_start); X printf("total_clusters = %d\n", total_clusters); X printf("cluster_size = %d\n", cluster_size); X printf("fat_size = %d\n", fat_size); X printf("data_start = %D\n", data_start); X printf("root_entries = %d\n", root_entries); X printf("sub_entries = %d\n", sub_entries); X printf("Tfat = %d\n", Tfat); X leave(1); X/*********/ X} X XDIRECTORY *directory(dir, entries, function, pathname) XDIRECTORY *dir; Xshort entries; XBOOL function; Xregister char *pathname; X{ X register DIRECTORY *dir_ptr = dir; X DIRECTORY *mem = NIL_DIR; X unsigned short cl_no = dir->d_cluster; X unsigned short type, last; X char file_name[14]; X char *name; X int i = 0; X X if (function == FIND) { X while (*pathname != '/' && *pathname && i < 12) X file_name[i++] = *pathname++; X while (*pathname != '/' && *pathname) X pathname++; X file_name[i] = '\0'; X } X X do { X if (entries != root_entries) { X mem = dir_ptr = read_cluster(cl_no); X last = cl_no; X cl_no = next_cluster(cl_no); X } X X for (i = 0; i < entries; i++, dir_ptr++) { X type = dir_ptr->d_name[0] & 0x0FF; X if (function == ENTRY) { X if (type == NOT_USED || type == ERASED) { X mark = lseek(disk, 0L, 1) - X (long) cluster_size + X (long) i * (long) DIR_SIZE; X if (!mem) X mark += (long) cluster_size - (long) (root_entries * sizeof (DIRECTORY)); X return dir_ptr; X } X continue; X } X if (type == NOT_USED) X break; X if (dir_ptr->d_attribute & 0x08) { X if (function == LABEL) X return dir_ptr; X continue; X } X if (type == DIR || type == ERASED || function == LABEL) X continue; X type = is_dir(dir_ptr); X name = make_name(dir_ptr, (function == FIND) ? X FALSE : type); X if (function == FIND) { X if (strcmp(file_name, name) != 0) X continue; X if (!type) { X if (dos_dir || *pathname) { X flush(); X print_string(TRUE, "Not a directory: %s\n", file_name); X leave(1); X } X } X else if (*pathname == '\0' && dos_read) { X flush(); X print_string(TRUE, "%s is a directory.\n", path); X leave(1); X } X if (*pathname) { X dir_ptr = find_entry(dir_ptr, X sub_entries, pathname + 1); X } X if (mem) { X if (dir_ptr) { X bcopy(dir_ptr, &save_entry, DIR_SIZE); X dir_ptr = &save_entry; X } X (void) brk(mem); X } X return dir_ptr; X } X else { X if (function == FALSE) X show(dir_ptr, name); X else if (type) { /* Recursive */ X print_string(FALSE, "Directory %s%s:\n", path, name); X add_path(name, FALSE); X list_dir(dir_ptr, sub_entries, FALSE); X add_path(NIL_PTR, FALSE); X } X } X } X if (mem) X (void) brk(mem); X } while ((Tfat && cl_no != LAST_CLUSTER && mem) || X (!Tfat && cl_no != LAST_16 && mem)); X X switch (function) { X case FIND: X if (dos_write && *pathname == '\0') X return NIL_DIR; X flush(); X print_string(TRUE, "Cannot find `%s'.\n", file_name); X leave(1); X case LABEL: X return NIL_DIR; X case ENTRY: X if (!mem) { X flush(); X print_string(TRUE, "No entries left in root directory.\n"); X leave(1); X } X X cl_no = free_cluster(TRUE); X link_fat(last, cl_no); X if (Tfat) X link_fat(cl_no, LAST_CLUSTER); X else X link_fat(cl_no, LAST_16); X disk_write(clus_add(cl_no), null, cluster_size); X X return new_entry(dir, entries); X case FALSE: X if (Rflag) { X print(STD_OUT, "\n", 0); X list_dir(dir, entries, TRUE); X } X } X} X Xextract(entry) Xregister DIRECTORY *entry; X{ X register unsigned short cl_no = entry->d_cluster; X char buffer[MAX_CLUSTER_SIZE]; X short rest; X X if (entry->d_size == 0) /* Empty file */ X return; X X do { X disk_read(clus_add(cl_no), buffer, cluster_size); X rest = (entry->d_size > (long) cluster_size) ? cluster_size : (short) entry->d_size; X print(STD_OUT, buffer, rest); X entry->d_size -= (long) rest; X cl_no = next_cluster(cl_no); X if ((Tfat && cl_no == BAD) || (!Tfat && cl_no == BAD_16)){ X flush(); X print_string(TRUE, "Reserved cluster value encountered.\n"); X leave(1); X } X } while ((Tfat && entry->d_size && cl_no != LAST_CLUSTER) || X (!Tfat && entry->d_size && cl_no != LAST_16)); X X if ((Tfat && cl_no != LAST_CLUSTER) || (!Tfat && cl_no != LAST_16)) X print_string(TRUE, "Too many clusters allocated for file.\n"); X else if (entry->d_size != 0) X print_string(TRUE, "Premature EOF: %L bytes left.\n", X entry->d_size); X} X Xprint(fd, buffer, bytes) Xshort fd; Xregister char *buffer; Xregister short bytes; X{ X static short index; X static BOOL lf_pending = FALSE; X static char output[MAX_CLUSTER_SIZE + 1]; X X if (buffer == NIL_PTR) { X if (dos_read && Aflag && lf_pending) { X output[index++] = '\r'; X lf_pending = FALSE; X } X if (write(fd, output, index) != index) X bad(); X index = 0; X return; X } X X if (bytes == 0) X bytes = strlen(buffer); X X while (bytes--) { X if (index >= MAX_CLUSTER_SIZE) { X if (write(fd, output, index) != index) X bad (); X index = 0; X } X if (dos_read && Aflag) { X if (*buffer == '\r') { X if (lf_pending) X output[index++] = *buffer++; X else { X lf_pending = TRUE; X buffer++; X } X } X else if (*buffer == '\n') { X output[index++] = *buffer++; X lf_pending = FALSE; X } X else if (lf_pending) { X output[index++] = '\r'; X output[index++] = *buffer++; X } X else if ((output[index++] = *buffer++) == EOF_MARK) { X if (lf_pending) { X output[index - 1] = '\r'; X index++; X lf_pending = FALSE; X } X index--; X return; X } X } X else X output[index++] = *buffer++; X } X} X Xmake_file(dir_ptr, entries, name) XDIRECTORY *dir_ptr; Xint entries; Xchar *name; X{ X register DIRECTORY *entry = new_entry(dir_ptr, entries); X register char *ptr; X char buffer[MAX_CLUSTER_SIZE]; X unsigned short cl_no, next; X short i, r; X long size = 0L; X X bcopy(" ",&entry->d_name[0],11); /* clear entry */ X for (i = 0, ptr = name; i < 8 && *ptr != '.' && *ptr; i++) X entry->d_name[i] = *ptr++; X while (*ptr != '.' && *ptr) X ptr++; X if (*ptr == '.') X ptr++; X for (i=0;i < 3 && *ptr; i++) X entry->d_ext[i] = *ptr++; X X for (i = 0; i < 10; i++) X entry->d_reserved[i] = '\0'; X entry->d_attribute = '\0'; X X entry->d_cluster = 0; X X while ((r = fill(buffer)) > 0) { X if ((next = free_cluster(FALSE)) > total_clusters) { X print_string(TRUE, "Disk full. File truncated.\n"); X break; X } X X disk_write(clus_add(next), buffer, r); X X if (entry->d_cluster == 0) X cl_no = entry->d_cluster = next; X else { X link_fat(cl_no, next); X cl_no = next; X } X X size += r; X } X X if (entry->d_cluster != 0) { X if (Tfat) X link_fat(cl_no, LAST_CLUSTER); X else X link_fat(cl_no, LAST_16); X } X X entry->d_size = Aflag ? (size - 1) : size; /* Strip added ^Z */ X fill_date(entry); X disk_write(mark, entry, DIR_SIZE); X if (Tfat) { X disk_write(f_start, fat.twelve, fat_size); X disk_write(f_start + (long) fat_size, fat.twelve, fat_size); X } else { X disk_write(f_start, fat.sixteen, fat_size); X disk_write(f_start + (long) fat_size, fat.sixteen, fat_size); X } X} X X X#define SEC_MIN 60L X#define SEC_HOUR (60L * SEC_MIN) X#define SEC_DAY (24L * SEC_HOUR) X#define SEC_YEAR (365L * SEC_DAY) X#define SEC_LYEAR (366L * SEC_DAY) X Xshort mon_len[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; X Xfill_date(entry) XDIRECTORY *entry; X{ X register long cur_time = time((long *) 0) - DOS_TIME; X unsigned short year = 0, month = 1, day, hour, minutes, seconds; X int i; X long tmp; X X if (cur_time < 0) /* Date not set on booting ... */ X cur_time = 0; X for (;;) { X tmp = (year % 4 == 0) ? SEC_LYEAR : SEC_YEAR; X if (cur_time < tmp) X break; X cur_time -= tmp; X year++; X } X X day = (unsigned short) (cur_time / SEC_DAY); X cur_time -= (long) day *SEC_DAY; X X hour = (unsigned short) (cur_time / SEC_HOUR); X cur_time -= (long) hour *SEC_HOUR; X X minutes = (unsigned short) (cur_time / SEC_MIN); X cur_time -= (long) minutes *SEC_MIN; X X seconds = (unsigned short) cur_time; X X mon_len[1] = (year % 4 == 0) ? 29 : 28; X i = 0; X while (day >= mon_len[i]) { X month++; X day -= mon_len[i++]; X } X day++; X X entry->d_date = (year << 9) | (month << 5) | day; X entry->d_time = (hour << 11) | (minutes << 5) | seconds; X} X Xchar *make_name(dir_ptr, dir_fl) Xregister DIRECTORY *dir_ptr; Xshort dir_fl; X{ X static char name_buf[14]; X register char *ptr = name_buf; X short i; X X for (i = 0; i < 8; i++) X *ptr++ = dir_ptr->d_name[i]; X X while (*--ptr == ' '); X X ptr++; X if (dir_ptr->d_ext[0] != ' ') { X *ptr++ = '.'; X for (i = 0; i < 3; i++) X *ptr++ = dir_ptr->d_ext[i]; X while (*--ptr == ' '); X ptr++; X } X if (dir_fl) X *ptr++ = '/'; X *ptr = '\0'; X X return name_buf; X} X Xfill(buffer) Xregister char *buffer; X{ X static BOOL eof_mark = FALSE; X char *last = &buffer[cluster_size]; X char *begin = buffer; X register short c; X X if (eof_mark) X return 0; X X while (buffer < last) { X if ((c = get_char()) == EOF) { X eof_mark = TRUE; X if (Aflag) X *buffer++ = EOF_MARK; X break; X } X *buffer++ = c; X } X X return (int) (buffer - begin); X} X Xget_char() X{ X static short read_chars, index; X static char input[MAX_CLUSTER_SIZE]; X static BOOL new_line = FALSE; X X if (new_line == TRUE) { X new_line = FALSE; X return '\n'; X } X X if (index == read_chars) { X if ((read_chars = read(0, input, cluster_size)) == 0) X return EOF; X index = 0; X } X X if (Aflag && input[index] == '\n') { X new_line = TRUE; X index++; X return '\r'; X } X X return input[index++]; X} X X#define HOUR 0xF800 /* Upper 5 bits */ X#define MIN 0x07E0 /* Middle 6 bits */ X#define YEAR 0xFE00 /* Upper 7 bits */ X#define MONTH 0x01E0 /* Mid 4 bits */ X#define DAY 0x01F /* Lowest 5 bits */ X Xchar *month[] = { X "Jan", "Feb", "Mar", "Apr", "May", "Jun", X "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" X}; X Xmodes(mode) Xregister unsigned char mode; X{ X print_string(FALSE, "\t%c%c%c%c%c", (mode & SUB_DIR) ? 'd' : '-', X (mode & 02) ? 'h' : '-', (mode & 04) ? 's' : '-', X (mode & 01) ? '-' : 'w', (mode & 0x20) ? 'a' : '-'); X} X Xshow(dir_ptr, name) XDIRECTORY *dir_ptr; Xchar *name; X{ X register unsigned short e_date = dir_ptr->d_date; X register unsigned short e_time = dir_ptr->d_time; X unsigned short next; X char bname[20]; X short i = 0; X X while (*name && *name != '/') X bname[i++] = *name++; X bname[i] = '\0'; X if (!Lflag) { X print_string(FALSE, "%s\n", bname); X return; X } X modes(dir_ptr->d_attribute); X print_string(FALSE, "\t%s%s", bname, strlen(bname) < 8 ? "\t\t" : "\t"); X i = 1; X if (is_dir(dir_ptr)) { X next = dir_ptr->d_cluster; X while (((next = next_cluster(next)) != LAST_CLUSTER && Tfat) || X (!Tfat && next != LAST_16)) X i++; X print_string(FALSE, "%L", (long) i * (long) cluster_size); X } X else X print_string(FALSE, "%L", dir_ptr->d_size); X print_string(FALSE, "\t%N:%N %P %s %d\n", ((e_time & HOUR) >> 11), X ((e_time & MIN) >> 5), (e_date & DAY), X month[((e_date & MONTH) >> 5) - 1], ((e_date & YEAR) >> 9) + 1980); X} X Xfree_blocks() X{ X register unsigned short cl_no; X register short free = 0; X short bad = 0; X if (Tfat) X for (cl_no = 2; cl_no <= total_clusters; cl_no++) { X switch (next_cluster(cl_no)) { X case FREE: X free++; X break; X case BAD: X bad++; X } X } X else X for (cl_no = 2; cl_no <= total_clusters; cl_no++) { X switch (next_cluster(cl_no)) { X case FREE_16: X free++; X break; X case BAD_16: X bad++; X } X } X X print_string(FALSE, "Free space: %L bytes.\n", (long) free * (long) cluster_size); X if (bad) X print_string(FALSE, "Bad sectors: %L bytes.\n", (long) bad * (long) cluster_size); X} X Xchar *num_out(number) Xregister long number; X{ X static char num_buf[13]; X char temp[13]; X register short i = 0; X short j; X X if (number == 0) X temp[i++] = '0'; X X while (number) { X temp[i++] = (char) (number % 10L + '0'); X number /= 10L; X } X X for (j = 0; j < 11; j++) X num_buf[j] = temp[i - j - 1]; X X num_buf[i] = '\0'; X return num_buf; X} X X/* VARARGS */ Xprint_string(err_fl, fmt, args) XBOOL err_fl; Xchar *fmt; Xint args; X{ X char buf[200]; X register char *buf_ptr = buf; X char *scan_ptr; X register int *arg_ptr = &args; X short i; X X while (*fmt) { X if (*fmt == '%') { X fmt++; X if (*fmt == 'c') { X *buf_ptr++ = (char) *arg_ptr++; X fmt++; X continue; X } X if (*fmt == 'S') { X scan_ptr = (char *) *arg_ptr; X for (i = 0; i < 11; i++) X *buf_ptr++ = *scan_ptr++; X fmt++; X continue; X } X if (*fmt == 's') X scan_ptr = (char *) *arg_ptr; X else if (*fmt == 'L') { X scan_ptr = num_out(*((long *) arg_ptr)); X arg_ptr++; X } X else { X scan_ptr = num_out((long) *arg_ptr); X if (*fmt == 'P' && *arg_ptr < 10) X *buf_ptr++ = ' '; X else if (*fmt == 'N' && *arg_ptr < 10) X *buf_ptr++ = '0'; X } X while (*buf_ptr++ = *scan_ptr++); X buf_ptr--; X arg_ptr++; X fmt++; X } X else X *buf_ptr++ = *fmt++; X } X X *buf_ptr = '\0'; X X if (err_fl) { X flush(); X write(2, buf, (int) (buf_ptr - buf)); X } X else X print(STD_OUT, buf, 0); Xflush(); X} X XDIRECTORY *read_cluster(cluster) Xregister unsigned short cluster; X{ X register DIRECTORY *sub_dir; X extern char *sbrk(); X X if ((sub_dir = (DIRECTORY *) sbrk(cluster_size)) < 0) { X print_string(TRUE, "Cannot set break!\n"); X leave(1); X } X disk_read(clus_add(cluster), sub_dir, cluster_size); X X return sub_dir; X} X Xunsigned short free_cluster(leave_fl) XBOOL leave_fl; X{ X static unsigned short cl_index = 2; X X if (Tfat) X while (cl_index <= total_clusters && next_cluster(cl_index) != FREE) X cl_index++; X else /* Sixteen bit */ X while (cl_index <= total_clusters && next_cluster(cl_index) != FREE_16) X cl_index++; X X if (leave_fl && cl_index > total_clusters) { X flush(); X print_string(TRUE, "Disk full. File not added.\n"); X leave(1); X } X X return cl_index++; X} X X/* ****************FIX FOR SIXTEEN BIT ***************** */ Xlink_fat(cl_1, cl_2) Xunsigned short cl_1; Xregister unsigned short cl_2; X{ X if (Tfat) { X register unsigned char *fat_index = &fat.twelve[(cl_1 >> 1) * 3 + 1]; X if (cl_1 & 0x01) { X *(fat_index + 1) = cl_2 >> 4; X *fat_index = (*fat_index & 0x0F) | ((cl_2 & 0x0F) << 4); X } X else { X *(fat_index - 1) = cl_2 & 0x0FF; X *fat_index = (*fat_index & 0xF0) | (cl_2 >> 8); X } X } X else { X fat.sixteen[cl_1] = cl_2; X } X} X X Xunsigned short next_cluster(cl_no) Xregister unsigned short cl_no; X{ X if (Tfat) { X register unsigned char *fat_index = &fat.twelve[(cl_no >> 1) * 3 + 1]; X X if (cl_no & 0x01) X cl_no = (*(fat_index + 1) << 4) | (*fat_index >> 4); X else X cl_no = ((*fat_index & 0x0F) << 8) | *(fat_index - 1); X X if ((cl_no & MASK) == MASK) X cl_no = LAST_CLUSTER; X else if ((cl_no & BAD) == BAD) X cl_no = BAD; X } X else { X /*cl_no = fat.sixteen[cl_no << 1];*/ X cl_no = fat.sixteen[cl_no]; X if ((cl_no & MASK_16) == MASK_16) X cl_no = LAST_16; X else if ((cl_no & BAD_16) == BAD_16) X cl_no = BAD_16; X } X X return cl_no; X} X Xchar *slash(str) Xregister char *str; X{ X register char *result = str; X X while (*str) X if (*str++ == '/') X result = str; X X return result; X} X Xadd_path(file, slash_fl) Xregister char *file; XBOOL slash_fl; X{ X register char *ptr = path; X X while (*ptr) X ptr++; X X if (file == NIL_PTR) { X ptr--; X do { X ptr--; X } while (*ptr != '/' && ptr != path); X if (ptr != path && !slash_fl) X ptr++; X *ptr = '\0'; X } X else X while (*ptr++ = *file++); X} X Xbcopy(src, dest, bytes) Xregister char *src, *dest; Xshort bytes; X{ X while (bytes--) X *dest++ = *src++; X} X Xdisk_io(op, seek, address, bytes) Xregister BOOL op; Xunsigned long seek; XDIRECTORY *address; Xregister unsigned bytes; X{ X unsigned int r; X X if (lseek(disk, seek, 0) < 0L) { X flush(); X print_string(TRUE, "Bad lseek\n"); X leave(1); X } X X if (op == READ) X r = read(disk, address, bytes); X else X r = write(disk, address, bytes); X X if (r != bytes) X bad(); X} X Xbad() X{ X flush(); X perror("I/O error"); X leave(1); X} + END-OF-FILE dosread.c chmod 'u=rw,g=r,o=r' 'dosread.c' set `wc -c 'dosread.c'` count=$1 case $count in 28473) :;; *) echo 'Bad character count in ''dosread.c' >&2 echo 'Count should be 28473' >&2 esac echo Extracting 'factor.c.cdif' sed 's/^X//' > 'factor.c.cdif' << '+ END-OF-FILE ''factor.c.cdif' X*** /local/ast/minix/tape3b/commands/factor.c Wed Jul 13 13:10:54 1988 X--- factor.c Sun Sep 25 15:24:59 1988 X*************** X*** 1,3 **** X--- 1,5 ---- X+ /* factor - print the prime factors of a number Author: Andy Tanenbaum */ X+ X main(argc, argv) X int argc; X char *argv[]; + END-OF-FILE factor.c.cdif chmod 'u=rw,g=r,o=r' 'factor.c.cdif' set `wc -c 'factor.c.cdif'` count=$1 case $count in 282) :;; *) echo 'Bad character count in ''factor.c.cdif' >&2 echo 'Count should be 282' >&2 esac echo Extracting 'fgrep.c.cdif' sed 's/^X//' > 'fgrep.c.cdif' << '+ END-OF-FILE ''fgrep.c.cdif' X*** /local/ast/minix/tape3b/commands/fgrep.c Wed Jul 13 13:10:55 1988 X--- fgrep.c Sun Sep 25 15:24:59 1988 X*************** X*** 25,31 **** X int find(); X void exparg(); X void getargs(); X- void maktbl(); X void gotone(); X X argc=oargc; X--- 25,30 ---- X*************** X*** 72,77 **** X--- 71,77 ---- X void getargs() X { X int tmp; X+ void maktbl(); X for (i=1; i< argc && argv[i][0]=='-'; i++) { X switch (argv[i][1]) { X case 'e': + END-OF-FILE fgrep.c.cdif chmod 'u=rw,g=r,o=r' 'fgrep.c.cdif' set `wc -c 'fgrep.c.cdif'` count=$1 case $count in 457) :;; *) echo 'Bad character count in ''fgrep.c.cdif' >&2 echo 'Count should be 457' >&2 esac echo Extracting 'file.c.cdif' sed 's/^X//' > 'file.c.cdif' << '+ END-OF-FILE ''file.c.cdif' X*** /local/ast/minix/tape3b/commands/file.c Wed Jul 13 13:10:55 1988 X--- file.c Sun Sep 25 15:25:00 1988 X*************** X*** 28,33 **** X--- 28,34 ---- X char *name; X { X int i, fd, n, magic, second, mode, nonascii, special, funnypct, etaoins; X+ int symbols; X long engpct; X char c; X struct stat st_buf; X*************** X*** 86,97 **** X /* Check to see if file is an executable binary. */ X if (magic == A_OUT) { X /* File is executable. Check for split I/D. */ X! printf("executable "); X second = (buf[3]<<8) | (buf[2]&0377); X if (second == SPLIT) X! printf(" separate I & D space\n"); X else X! printf(" combined I & D space\n"); X close(fd); X return; X } X--- 87,103 ---- X /* Check to see if file is an executable binary. */ X if (magic == A_OUT) { X /* File is executable. Check for split I/D. */ X! printf("executable"); X second = (buf[3]<<8) | (buf[2]&0377); X if (second == SPLIT) X! printf(" separate I & D space"); X else X! printf(" combined I & D space"); X! symbols = buf[28] | buf[29] | buf[30] | buf[31]; X! if (symbols != 0) X! printf(" not stripped\n"); X! else X! printf(" stripped\n"); X close(fd); X return; X } + END-OF-FILE file.c.cdif chmod 'u=rw,g=r,o=r' 'file.c.cdif' set `wc -c 'file.c.cdif'` count=$1 case $count in 1189) :;; *) echo 'Bad character count in ''file.c.cdif' >&2 echo 'Count should be 1189' >&2 esac echo Extracting 'getlf.c.cdif' sed 's/^X//' > 'getlf.c.cdif' << '+ END-OF-FILE ''getlf.c.cdif' X*** /local/ast/minix/tape3b/commands/getlf.c Wed Jul 13 13:10:56 1988 X--- getlf.c Sun Sep 25 15:25:01 1988 X*************** X*** 1,3 **** X--- 1,5 ---- X+ /* getlf - get a line feed Author: Andy Tanenbaum */ X+ X main(argc, argv) X int argc; X char *argv[]; + END-OF-FILE getlf.c.cdif chmod 'u=rw,g=r,o=r' 'getlf.c.cdif' set `wc -c 'getlf.c.cdif'` count=$1 case $count in 255) :;; *) echo 'Bad character count in ''getlf.c.cdif' >&2 echo 'Count should be 255' >&2 esac echo Extracting 'help.c.new' sed 's/^X//' > 'help.c.new' << '+ END-OF-FILE ''help.c.new' X/* help - provide assistance about keywords Author: Wolf N. Paul */ X X#include <stdio.h> X#include <ctype.h> X#include <sys/types.h> X#include <sys/stat.h> X X#define MAXLINE 134 X#define HELPDIR "/usr/lib" /* Added by John Plocher */ X#define HELPFILE "helpfile" /* .. */ X#define INDEX ".idx" /* .. */ X Xchar *helpfilename = "/usr/lib/helpfile"; Xchar *helpidxname = "/usr/lib/helpfile.idx"; X Xmain(argc, argv) Xint argc; Xchar **argv; X{ X struct X { X char name[15]; X long offset; X } entry; /* helpindex entries for each command */ X X struct stat sbuf1, sbuf2; /* stat buffers for helpfile & helpindex */ X char *command, *line, Line[MAXLINE]; X register char *cp; /* John Plocher */ X extern char *getenv(); /* .. */ X int status; X FILE *ifp, *hfp; /* file pointers for helpfile and helpindex */ X X if (argc > 2) { X fprintf(stderr, "Usage: help subject\n"); X exit(1); X } X X if ( argc == 1 ) /* If no arguments, ... */ X command = "help"; /* ... default to "help help" */ X else X command = argv[1]; /* else look for command in argv[1] */ X X stat(helpfilename, &sbuf1); /* get mtime for helpfile */ X status=access(helpidxname, 0); X if ( status == 0 ) /* if helpindex exists ... */ X { X stat(helpidxname, &sbuf2); /* get mtime for helpindex */ X } X if ( (status != 0) || /* if there is no helpindex ... */ X (sbuf1.st_mtime > sbuf2.st_mtime) ) X /* or if it is older than helpfile */ X { X buildindex(); /* build a new helpindex */ X } X X system("clr"); /* clear the screen */ X X if ( (ifp=fopen(helpidxname, "r")) == NULL ) X { X fprintf(stderr, "Can't read %s\n", helpidxname); X exit(-1); X } X X while ( 1 ) /* look for index entry for "command" */ X { X status=fread(&entry, sizeof(entry), 1, ifp); X if ( status==0 ) /* quit at end of index file */ X { X fprintf(stderr, "No help for %s\n", command); X fclose(ifp); X exit(1); } X if ( strcmp(entry.name, command) == 0 ) /* quit when we find it */ X { X fclose(ifp); X break; X } X } X X if ((hfp=fopen(helpfilename, "r")) == NULL ) X { X fprintf(stderr, "Can't open %s\n", helpfilename); X exit(-1); X } X X fseek(hfp, entry.offset, 0); /* go to the help entry */ X X while ( 1 ) /* just copy lines to stdout */ X { X line = fgets(Line, MAXLINE, hfp); X if ( line == (char *) NULL || line[0] == '#' ) X /* until another entry starts */ X break; X fputs(line,stdout); X } X X fclose(hfp); X} X Xbuildindex() X{ X FILE *hfp, *ifp; X struct { X char name[15]; X long offset; X } entry; X char Line[MAXLINE]; X char *line; X int i,j; X X X unlink(helpidxname); /* remove old index file */ X if ( (hfp=fopen(helpfilename, "r")) == NULL ) X { X fprintf(stderr,"buildindex: Can't read %s\n", helpfilename); X exit(-1); X } X if ( (ifp=fopen(helpidxname, "w")) == NULL ) X { X fprintf(stderr, "buildindex: Can't write %s\n", helpidxname); X exit(-1); X } X X while (1) /* Read thru helpfile ... */ X { X entry.offset=(long) 0; X line = fgets(Line, MAXLINE, hfp); X if ( line == (char *) NULL ) break; X if ( line[0] == '#' ) /* and for each help entry ... */ X { X line++; X while ( isspace(line[0]) ) line++; X i=j=0; X while ( line[i] != '\0' ) X { X if ( line[i] == '\n' ) break; X while ( line[i] == ' ' || line[i] == ',' ) i++; X while ( !isspace(line[i] ) && X line[i] != ',') /* save its name ... */ X { X entry.name[j] = line[i]; X i++; j++; X } X while ( j < 15 ) X entry.name[j++] = '\0'; X j = 0; X entry.offset=ftell(hfp); /* and its offset ... */ X fwrite(&entry, sizeof(entry), 1, ifp); X /* and write it to indexfile */ X } X } X } X fclose(hfp); X fclose(ifp); X} + END-OF-FILE help.c.new chmod 'u=rw,g=r,o=r' 'help.c.new' set `wc -c 'help.c.new'` count=$1 case $count in 4249) :;; *) echo 'Bad character count in ''help.c.new' >&2 echo 'Count should be 4249' >&2 esac echo Extracting 'libupack.c.cdif' sed 's/^X//' > 'libupack.c.cdif' << '+ END-OF-FILE ''libupack.c.cdif' X*** /local/ast/minix/tape3b/commands/libupack.c Wed Jul 13 13:10:58 1988 X--- libupack.c Sun Sep 25 15:25:03 1988 X*************** X*** 1,3 **** X--- 1,5 ---- X+ /* libupack - unpack a packed .s file Author: Andy Tanenbaum */ X+ X char *table[] = { X "push ax", X "ret", + END-OF-FILE libupack.c.cdif chmod 'u=rw,g=r,o=r' 'libupack.c.cdif' set `wc -c 'libupack.c.cdif'` count=$1 case $count in 267) :;; *) echo 'Bad character count in ''libupack.c.cdif' >&2 echo 'Count should be 267' >&2 esac echo Extracting 'login.c' sed 's/^X//' > 'login.c' << '+ END-OF-FILE ''login.c' X/* login - log into the system Author: Patrick van Kleef */ X X/* Peter S. Housel Jan. 1988 X * - Set up $USER, $HOME and $TERM. X * - Set signals to SIG_DFL. X * X * Terrence W. Holm June 1988 X * - Allow a username as an optional argument. X * - Time out if a password is not typed within 30 seconds. X * - Perform a dummy delay after a bad username is entered. X * - Don't allow a login if "/etc/nologin" exists. X * - Cause a failure on bad "pw_shell" fields. X * - Record the login in "/usr/adm/wtmp". X */ X X#include <signal.h> X#include <sgtty.h> X#include <pwd.h> X#include <sys/stat.h> X X#define NULL (char *) 0 X#define WTMPSIZE 8 X#define DIGIT 3 X Xextern char *crypt(); Xextern struct passwd *getpwnam(); Xextern long time(); Xextern long lseek(); Xint Time_out(); X Xint time_out; X Xchar user[ 32 ]; Xchar logname[ 35 ]; Xchar home[ 64 ]; Xchar shell[ 64 ]; X Xchar *env[] = { X user, X logname, X home, X shell, X "TERM=minix", X NULL X}; Xchar wtmpfile[] = {"/usr/adm/wtmp"}; Xchar ttyname[] = {"tty?"}; X X Xmain( argc, argv ) Xint argc; Xchar *argv[]; X{ X char name[30]; X char password[30]; X int bad; X int n; X int ttynr; X struct sgttyb args; X struct passwd *pwd; X struct stat statbuf; X char *sh = "/bin/sh"; X X /* Reset some of the line parameters in case they have been mashed */ X if ( ioctl(0, TIOCGETP, &args) < 0 ) exit( 1 ); X X args.sg_kill = '@'; X args.sg_erase = '\b'; X args.sg_flags = (args.sg_flags & 01700) | XTABS | CRMOD | ECHO; X ioctl (0, TIOCSETP, &args); X X /* Get login name and passwd. */ X for (;;) { X bad = 0; X X if ( argc > 1 ) { X strcpy( name, argv[1] ); X argc = 1; X } else { X do { X write(1,"login: ",7); X n = read (0, name, 30); X } while (n < 2); X name[n - 1] = 0; X } X X /* Look up login/passwd. */ X if ((pwd = getpwnam (name)) == 0) bad++; X X /* If login name wrong or password exists, ask for pw. */ X if (bad || strlen (pwd->pw_passwd) != 0) { X args.sg_flags &= ~ECHO; X ioctl (0, TIOCSETP, &args); X write(1,"Password: ",10); X X time_out = 0; X signal( SIGALRM, Time_out ); X alarm( 30 ); X X n = read (0, password, 30); X X alarm( 0 ); X if ( time_out ) { X n = 1; X bad++; X } X X password[n - 1] = 0; X write(1,"\n",1); X args.sg_flags |= ECHO; X ioctl (0, TIOCSETP, &args); X X if (bad && crypt(password, "aaaa") || X strcmp (pwd->pw_passwd, crypt(password, pwd->pw_passwd))) { X write (1,"Login incorrect\n",16); X continue; X } X } X X /* Check if the system is going down */ X if ( access( "/etc/nologin", 0 ) == 0 && X strcmp( name, "root" ) != 0 ) { X write( 1, "System going down\n\n", 19 ); X continue; X } X X X /* Look up /dev/tty number. */ X fstat(0, &statbuf); X ttynr = statbuf.st_rdev & 0377; X ttyname[DIGIT] = '0' + ttynr; X X /* Write login record to /usr/adm/wtmp */ X wtmp(ttyname, name); X X setgid( pwd->pw_gid ); X setuid( pwd->pw_uid ); X X if (pwd->pw_shell[0]) sh = pwd->pw_shell; X X /* Set the environment */ X strcpy( user, "USER=" ); X strcat( user, name ); X strcpy( logname, "LOGNAME=" ); X strcat( logname, name ); X strcpy( home, "HOME=" ); X strcat( home, pwd->pw_dir ); X strcpy( shell, "SHELL=" ); X strcat( shell, sh ); X X chdir( pwd->pw_dir ); X X /* Reset signals to default values. */ X X for ( n = 1; n <= NR_SIGS; ++n ) X signal( n, SIG_DFL ); X X execle( sh, "-", NULL, env ); X write(1,"exec failure\n",13); X exit(1); X } X} X X X XTime_out( ) X{ X time_out = 1; X} X Xwtmp(tty, name) X{ X/* Make an entry in /usr/adm/wtmp. */ X X int i, fd; X long t, time(); X char ttybuff[WTMPSIZE], namebuff[WTMPSIZE]; X X fd = open(wtmpfile, 2); X if (fd < 0) return; /* if wtmp does not exist, no accounting */ X lseek(fd, 0L, 2); /* append to file */ X X for (i = 0; i < WTMPSIZE; i++) { X ttybuff[i] = 0; X namebuff[i] = 0; X } X strncpy(ttybuff, tty, 8); X strncpy(namebuff, name, 8); X time(&t); X write(fd, ttybuff, WTMPSIZE); X write(fd, namebuff, WTMPSIZE); X write(fd, &t, sizeof(t)); X close(fd); X} + END-OF-FILE login.c chmod 'u=rw,g=r,o=r' 'login.c' set `wc -c 'login.c'` count=$1 case $count in 3973) :;; *) echo 'Bad character count in ''login.c' >&2 echo 'Count should be 3973' >&2 esac echo Extracting 'ls.c.cdif' sed 's/^X//' > 'ls.c.cdif' << '+ END-OF-FILE ''ls.c.cdif' X*** /local/ast/minix/tape3b/commands/ls.c Wed Jul 13 13:11:02 1988 X--- ls.c Sun Sep 25 15:25:05 1988 X*************** X*** 1,4 **** X--- 1,5 ---- X /* ls - list files and directories Author: Andy Tanenbaum */ X+ /* Version: Minix 1.3 */ X X #include <stdio.h> X #include <sys/types.h> X*************** X*** 23,28 **** X--- 24,30 ---- X long modtime; X long size; X short link; X+ char is_path; /* 1 => fp_name is null terminated */ X } file[NFILE+1]; X X struct dir { X*************** X*** 99,105 **** X statflag = (topfiles == 0 ? 0 : 1); X if (present('c') || present('t') || present('u')) statflag = 1; X if (present('s') || present('l')) statflag = 1; X! while (k < argc) fill_file("", argv[k++], statflag); X } X X X--- 101,107 ---- X statflag = (topfiles == 0 ? 0 : 1); X if (present('c') || present('t') || present('u')) statflag = 1; X if (present('s') || present('l')) statflag = 1; X! while (k < argc) fill_file("", argv[k++], statflag,1); X } X X X*************** X*** 212,218 **** X fp = &file[sort_index[k]]; X if (present('l') || present('s') || present('i')) X if (fp->size == -1L) /* -1 means stat not done */ X! if (stat_file(dirname, fp) < 0) continue; X X m = fp->mode & I_TYPE; /* 'm' may be junk if 'expand' = 0 */ X if (present('f')) m = I_DIRECTORY; X--- 214,220 ---- X fp = &file[sort_index[k]]; X if (present('l') || present('s') || present('i')) X if (fp->size == -1L) /* -1 means stat not done */ X! if (stat_file(dirname, fp, fp->is_path) < 0) continue; X X m = fp->mode & I_TYPE; /* 'm' may be junk if 'expand' = 0 */ X if (present('f')) m = I_DIRECTORY; X*************** X*** 223,229 **** X /* Expand and print directory. */ X exp_dir(fp); X sort(nrf, nrfiles - nrf, 0); X! if (topfiles > 1) fprintf(stdout, "\n%s:\n", fp->name); X print_total(nrf, nrfiles - nrf); X print(nrf, nrfiles - nrf, 0, fp->name); /* recursion ! */ X nrfiles = nrf; X--- 225,235 ---- X /* Expand and print directory. */ X exp_dir(fp); X sort(nrf, nrfiles - nrf, 0); X! if (topfiles > 1) { X! fprintf(stdout, "\n"); X! pfname(fp->name,fp->is_path); X! fprintf(stdout, ":\n"); X! } X print_total(nrf, nrfiles - nrf); X print(nrf, nrfiles - nrf, 0, fp->name); /* recursion ! */ X nrfiles = nrf; X*************** X*** 270,276 **** X if (*p == '.' && *(p+1) == 0) continue; X if (*p == '.' && *(p+1) == '.' && *(p+2) == 0) continue; X } X! fill_file(fp->name, p, statflag); X } X } X close(fd); X--- 276,282 ---- X if (*p == '.' && *(p+1) == 0) continue; X if (*p == '.' && *(p+1) == '.' && *(p+2) == 0) continue; X } X! fill_file(fp->name, p, statflag,0); X } X } X close(fd); X*************** X*** 280,288 **** X X X X! fill_file(prefix, postfix, statflag) X char *prefix, *postfix; X! int statflag; X { X /* Fill the next 'file' struct entry with the file whose name is formed by X * concatenating 'prefix' and 'postfix'. Stat only if needed. X--- 286,294 ---- X X X X! fill_file(prefix, postfix, statflag, pathflag) X char *prefix, *postfix; X! int statflag, pathflag; X { X /* Fill the next 'file' struct entry with the file whose name is formed by X * concatenating 'prefix' and 'postfix'. Stat only if needed. X*************** X*** 297,304 **** X } X fp = &file[nrfiles++]; X fp->name = postfix; X if(statflag) { X! if (stat_file(prefix, fp) < 0) nrfiles--; X } else { X fp->size = -1L; /* mark file as not yet stat'ed */ X } X--- 303,311 ---- X } X fp = &file[nrfiles++]; X fp->name = postfix; X+ fp->is_path = pathflag; X if(statflag) { X! if (stat_file(prefix, fp, pathflag) < 0) nrfiles--; X } else { X fp->size = -1L; /* mark file as not yet stat'ed */ X } X*************** X*** 308,315 **** X X X X! print_line(fp) X struct file *fp; X { X int blks, m, prot, s; X char *p1, *p2, *p3, c; X--- 315,323 ---- X X X X! print_line(fp,is_path) X struct file *fp; X+ int is_path; X { X int blks, m, prot, s; X char *p1, *p2, *p3, c; X*************** X*** 358,376 **** X X /* Print file name. */ X m = 0; X! p1 = fp->name; X! while (*p1 != 0 && (m < DIRNAMELEN || *p1 == '/') ) { X! fprintf(stdout, "%c", *p1); X! m = (*p1 == '/' ? 0 : m + 1); X! p1++; X! } X fprintf(stdout, "\n"); X } X X X X X- X owngrp(fp) X struct file *fp; X { X--- 366,394 ---- X X /* Print file name. */ X m = 0; X! pfname(fp->name,fp->is_path); X fprintf(stdout, "\n"); X } X X+ pfname(ptr,pathflag) X+ char *ptr; X+ int pathflag; X+ { X+ int m; X+ if (pathflag) { X+ fprintf(stdout,"%s",ptr); X+ } else { X+ /* dirname entry is null terminated if length < 14 */ X+ m = 0; X+ while (*ptr && m < DIRNAMELEN) { X+ putc(*ptr++, stdout); X+ ++m; X+ } X+ } X+ } X X X X owngrp(fp) X struct file *fp; X { X*************** X*** 393,405 **** X X X X! int stat_file(prefix, fp) X char *prefix; X struct file *fp; X { X /* Stat a file and enter it in 'file'. */ X X! char namebuf[MAXPATHLEN], *p, *org, *q; X struct stat sbuf; X int m, ctr; X X--- 411,424 ---- X X X X! int stat_file(prefix, fp, pathflag) X char *prefix; X struct file *fp; X+ int pathflag; X { X /* Stat a file and enter it in 'file'. */ X X! char namebuf[MAXPATHLEN], *p, *q; X struct stat sbuf; X int m, ctr; X X*************** X*** 408,421 **** X q = prefix; X while (*q != 0 && p - namebuf < MAXPATHLEN) *p++ = *q++; X if (*prefix != 0) *p++ = '/'; X- org = fp->name; X q = fp->name; X ctr = 0; X! while (*q != 0 && p - namebuf < MAXPATHLEN) { X! ctr++; X! if (*q == '/') ctr = 0; X! if (ctr > DIRNAMELEN) break; X! *p++ = *q++; X } X *p = 0; X X--- 427,445 ---- X q = prefix; X while (*q != 0 && p - namebuf < MAXPATHLEN) *p++ = *q++; X if (*prefix != 0) *p++ = '/'; X q = fp->name; X ctr = 0; X! X! if (pathflag) { X! /* fp->name is null terminated */ X! while (*q) *p++ = *q++; X! } else { X! /* fp->name is char[14] */ X! while (*q != 0 && p - namebuf < MAXPATHLEN) { X! ctr++; X! if (ctr > DIRNAMELEN) break; X! *p++ = *q++; X! } X } X *p = 0; X + END-OF-FILE ls.c.cdif chmod 'u=rw,g=r,o=r' 'ls.c.cdif' set `wc -c 'ls.c.cdif'` count=$1 case $count in 5992) :;; *) echo 'Bad character count in ''ls.c.cdif' >&2 echo 'Count should be 5992' >&2 esac exit 0
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)
The message could not be delivered to: Addressee: EAMATEO Reason: %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI ---------------------------------------- Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 04:00 N Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4987 for EAMATEO@EBRUPC51; Thu, 29 Sep 88 04:00 N Received: by EB0UB011 (Mailer X1.25) id 0199; Wed, 28 Sep 88 22:07:45 HOE Date: Wed, 28 Sep 88 19:08:07 GMT From: Charles Hedrick <hedrick@ATHOS.RUTGERS.EDU> Subject: Simplifying the EGA code Sender: Minix operating system <MINIX-L@FINHUTC.BITNET> To: NACHO NAVARRO <EAMATEO@EBRUPC51> Reply-to: INFO-MINIX@UDEL.EDU Comments: Warning -- original Sender: tag was info-minix-request@UDEL.EDU Comments: To: info-minix@UDEL.EDU >I hope somebody can attack that problem directly. I would very much like to >have 2 scrolling algorithms included, toggled by F3: 6845 hardware, and >software. As the author of the EGA stuff, I now agree that it should go away. The version that is going out with these diffs (assuming ast took my latest changes) should in fact be fairly good about supporting a variety of hardware, but it does so by getting various information about the display adapter, including peeking inside the BIOS to see how many scan lines are needed per character. The problem is that this takes us deeper and deeper into code that is intertwined with the hardware and BIOS. I think there was a time warp, or possibly a lost mail message, because I've already suggested a way to simplify things. However I think it's right not to hold up the release of 1.3c for this. I have promised ast that I'll code up a replacement for the EGA hacks as soon as possible. (I'd also like him to evaluate hannam's proposed code. I can't because testing it requires me to recompile too much code. I don't even have source to elle.) The idea is to avoid depending upon the hardware's ability to wrap at all. Software scrolling of course does this, but at the expense of having to copy the whole screen for every line scrolled. As far as I can tell, all known tty adapters implement the video origin correctly. So there's no problem scrolling for the first few lines using the hardware. It's just what happens when you get to the end of memory that causes trouble. So the obvious fix is to copy the screen just once: when scrolling has gotten to the end of available memory. I conjecture that the overhead of doing this would not be noticable. Software scrolling is unacceptable because when you display a page of output, you have to wait for a big copy operation for every line. If you do the same operation, but only once every 25 or 50 lines, I doubt that anyone would notice. At any rate, even if we had to support both this and the original 1.1 hardware scrolling, the differences could be hidden in a very small section of code, and most of the current cruft would go away. I'm still not entirely sure that I understand the code that hannam posted a week or so ago (attempts to get mail to him seem to have failed). However if it works at all for non-wrapping EGA clones, it works by a slight variant of the same mechanism, where the copying is done a line at a time for the last 25 scroll operations rather than for the whole screen when the end of memory is reach. The amount of data moved would be the same. You should expect to hear more from me in a week or two, after I have a chance to try out these ideas.
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)
The message could not be delivered to: Addressee: EAMATEO Reason: %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI ---------------------------------------- Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 07:14 N Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 6148 for EAMATEO@EBRUPC51; Thu, 29 Sep 88 07:14 N Received: by EB0UB011 (Mailer X1.25) id 2079; Thu, 29 Sep 88 07:13:37 HOE Date: Wed, 28 Sep 88 12:02:12 GMT From: Karel van Houten <tnsgvdp@DUTRUN.UUCP> Subject: Re: Float f'ns & system calls Sender: Minix operating system <MINIX-L@FINHUTC.BITNET> To: NACHO NAVARRO <EAMATEO@EBRUPC51> Reply-to: INFO-MINIX@UDEL.EDU Comments: Warning -- original Sender: tag was info-minix-request@UDEL.EDU Comments: To: info-minix@UDEL.EDU In article <273@gara.une.oz> wtoomey@gara.une.oz (Warren Toomey) writes: >I'd like to be able to do floating point in Minix ***** I WOULD LIKE THAT TOO!!!!!!! ****** ****************************************************************************** Ronald van der Pol UUCP: ...!mcvax!dutrun!tnsgvdp DOMAIN: tnsgvdp@dutrun.surf Be careful! This is an extremely primitive and paranoid culture! - J.T.Kirk ******************************************************************************
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)
The message could not be delivered to: Addressee: EAMATEO Reason: %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI ---------------------------------------- Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 07:50 N Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 6190 for EAMATEO@EBRUPC51; Thu, 29 Sep 88 07:50 N Received: by EB0UB011 (Mailer X1.25) id 2149; Thu, 29 Sep 88 07:49:39 HOE Date: Wed, 28 Sep 88 00:57:26 GMT From: Warren Toomey <wtoomey@GARA.UNE.OZ> Subject: Re: csh on minix Sender: Minix operating system <MINIX-L@FINHUTC.BITNET> To: NACHO NAVARRO <EAMATEO@EBRUPC51> Reply-to: INFO-MINIX@UDEL.EDU Comments: Warning -- original Sender: tag was info-minix-request@UDEL.EDU Comments: To: info-minix@UDEL.EDU In several articles to date: > >>>::> I want to put csh on my minix. > >>>:: Why on Earth would anyone want to clone that mess? :-) > >>> Because they're smart? > >>No. Because they've never used ksh. > >- Because they're used to csh from another system. Ok, let's solve this debate by saying, if you want <particular shell> on Minix, then you should write it. If you look back a few weeks, you'll see that I posted an article asking for some system calls which haven't been implemented on Minix yet, so I could do a port of my friend's tcsh clone. Haven't noticed any replies, either! Re: this shell is better than that, if you write <particular shell> and post it to this newsgroup, we'll be able to try it ourselves, and see if it is better. Right, now let's get back to Minix.. +--------------------------------------------------------------------------+ |Warren Toomey | |Dept. of Computing Science ACSNET: wtoomey@gara.une.oz | |University of New England UUCP: ...!uunet!munnari!gara.une.oz!wtoomey | |Armidale Australia 2351 ARPA: wtoomey%gara.une.oz@uunet.uu.net | +--------------------------------------------------------------------------+ | "Life isn't as trivial as it seems, it only appears to be." | +--------------------------------------------------------------------------+
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)
The message could not be delivered to: Addressee: EAMATEO Reason: %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI ---------------------------------------- Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 09:05 N Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 6230 for EAMATEO@EBRUPC51; Thu, 29 Sep 88 09:04 N Received: by EB0UB011 (Mailer X1.25) id 2195; Thu, 29 Sep 88 08:43:10 HOE Date: Wed, 28 Sep 88 10:48:40 GMT From: Andy Tanenbaum <ast@CS.VU.NL> Subject: Re: 1.3a/b update, comp.sources.minix? Sender: Minix operating system <MINIX-L@FINHUTC.BITNET> To: NACHO NAVARRO <EAMATEO@EBRUPC51> Reply-to: INFO-MINIX@UDEL.EDU Comments: Warning -- original Sender: tag was info-minix-request@UDEL.EDU Comments: To: info-minix@UDEL.EDU In article <2545@sultra.UUCP> dtynan@sultra.UUCP (Der Tynan) writes: >The last thing I have to say is directed at Dr. Tanenbaum In general, when you have a message for a small number of people, it is considered polite to use mail, not news. Since the request came via news I might as well answer that way. >I only ordered the disks, I have a plethora of OS books, and wasn't in a >hurry to extend the collection. Unfortunately, the manual is included in the book and one is expected to read it. We could have bound the software and book together (and in fact P-H now has such a package), but we thought it more flexible to make them available separately. [Discussion of physical security] In general, I sort of regard "physical methods" such as using external computers, xray machines, magnets, operator torture, bribing secretaries, breaking into my office in the dead of night, and such like as bordering on cheating, but I'll keep my word. You get a rijksdaalder, which is a Dutch coin currently retailing for about 47 Belgian Franks. Andy Tanenbaum (ast@cs.vu.nl)
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)
The message could not be delivered to: Addressee: EAMATEO Reason: %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI ---------------------------------------- Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 08:34 N Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 6181 for EAMATEO@EBRUPC51; Thu, 29 Sep 88 08:33 N Received: by EB0UB011 (Mailer X1.25) id 2141; Thu, 29 Sep 88 07:25:11 HOE Date: Wed, 28 Sep 88 10:24:35 GMT From: Andy Tanenbaum <ast@CS.VU.NL> Subject: Useful new program and 1.3 checksums Sender: Minix operating system <MINIX-L@FINHUTC.BITNET> To: NACHO NAVARRO <EAMATEO@EBRUPC51> Reply-to: INFO-MINIX@UDEL.EDU Comments: Warning -- original Sender: tag was info-minix-request@UDEL.EDU Comments: To: info-minix@UDEL.EDU Johan Stevenson (the person who was the driving force behind Atari MINIX) just sent me a very useful little program that combines ls -l and sum. It is called crc, and the call: crc file1 ... prints for each argument both the file length and a checksum. The checksum uses a crc algorithm, and is not compatible with sum. Below is a shell archive containing both the program and the crc output for the full 1.3 distribution as it is on my Sun workstation at the university. After you apply all the 1.3 updates, compare your distribution to this list to see if you got it right. One of these days I will compare my disk at home (the master machine) with the Sun to see if I got it right. Andy Tanenbaum (ast@cs.vu.nl) : This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. : --------------------------- cut here -------------------------- PATH=/bin:/usr/bin:/usr/ucb echo Extracting 'crc.c' sed 's/^X//' > 'crc.c' << '+ END-OF-FILE ''crc.c' X/* crc - list length and checksum Author: Johan W. Stevenson */ X X X#include <stdio.h> X Xint errs; X Xmain(argc,argv) Xchar **argv; X{ X X if (argc <= 1) X crc((char *)0); X else X do { X if (freopen(argv[1], "r", stdin) == NULL) X error("cannot open %s", argv[1]); X else X crc(argv[1]); X argv++; X argc--; X } while (argc > 1); X exit(errs != 0); X} X X/* crctab calculated by Mark G. Mendel, Network Systems Corporation */ Xstatic unsigned short crctab[256] = { X 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, X 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, X 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, X 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, X 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, X 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, X 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, X 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, X 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, X 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, X 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, X 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, X 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, X 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, X 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, X 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, X 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, X 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, X 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, X 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, X 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, X 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, X 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, X 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, X 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, X 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, X 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, X 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, X 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, X 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, X 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, X 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 X}; X X/* X * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell. X * NOTE: First argument must be in range 0 to 255. X * Second argument is referenced twice. X * X * Programmers may incorporate any or all code into their programs, X * giving proper credit within the source. Publication of the X * source routines is permitted so long as proper credit is given X * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg, X * Omen Technology. X */ X X#define updcrc(cp, crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp) X Xcrc(fname) Xchar *fname; X{ X register int c; X register int i; X register long len = 0; X register unsigned short crc = 0; X X while ((c = getc(stdin)) != EOF) { X len++; X crc = updcrc(c, crc); X } X printf("%05u %6ld", crc, len, fname); X if (fname) X printf(" %s", fname); X printf("\n"); X} X Xerror(s, a1, a2, a3, a4) Xchar *s; X{ X X fprintf(stderr, "crc: "); X fprintf(stderr, s, a1, a2, a3, a4); X fprintf(stderr, "\n"); X errs++; X} + END-OF-FILE crc.c chmod 'u=rw,g=r,o=r' 'crc.c' set `wc -c 'crc.c'` count=$1 case $count in 3512) :;; *) echo 'Bad character count in ''crc.c' >&2 echo 'Count should be 3512' >&2 esac echo Extracting 'log' sed 's/^X//' > 'log' << '+ END-OF-FILE ''log' X41007 6207 commands/animals.c X48404 19498 commands/ar.c X16433 1615 commands/ascii.c X16506 5839 commands/ast.c X60664 4941 commands/at.c X30600 1730 commands/atrun.c X11818 14134 commands/badblocks.c X09785 6370 commands/banner.c X01345 622 commands/basename.c X03957 7987 commands/cal.c X10463 1439 commands/cat.c X36776 11781 commands/cc.c X42817 5931 commands/cdiff.c X57375 732 commands/chgrp.c X27811 2687 commands/chmem.c X34212 6964 commands/chmod.c X46813 727 commands/chown.c X05561 757 commands/clr.c X06733 2220 commands/cmp.c X06836 3433 commands/comm.c X31356 38532 commands/compress.c X63905 3546 commands/cp.c X54611 5843 commands/cpdir.c X27715 5143 commands/cron.c X11198 2223 commands/date.c X49446 5662 commands/dd.c X22124 3577 commands/df.c X16917 5383 commands/diff.c X39760 512 commands/dis88 X37626 3982 commands/diskcheck.c X26190 28473 commands/dosread.c X02565 4395 commands/du.c X48277 723 commands/echo.c X07544 42036 commands/ed.c X23787 2763 commands/expr.c X47116 773 commands/factor.c X41725 9890 commands/fdisk.c X18084 5493 commands/fgrep.c X61039 3220 commands/file.c X28049 12342 commands/find.c X04128 4592 commands/fix.c X51360 299 commands/getlf.c X10255 2751 commands/grep.c X32905 3148 commands/gres.c X01913 1159 commands/head.c X54112 4249 commands/help.c X55302 557 commands/kill.c X20222 4005 commands/libpack.c X44726 2074 commands/libupack.c X18018 1111 commands/ln.c X59287 3973 commands/login.c X60732 7645 commands/lorder.c X06347 1647 commands/lpr.c X49285 13438 commands/ls.c X37830 512 commands/make X56643 512 commands/mined X01732 1319 commands/mkdir.c X52749 25884 commands/mkfs.c X05593 555 commands/mknod.c X39898 5582 commands/more.c X25884 1163 commands/mount.c X37282 3733 commands/mv.c X53701 3923 commands/nm.c X21321 5148 commands/od.c X65009 2392 commands/passwd.c X25508 12000 commands/paste.c X46629 12100 commands/pr.c X44668 2025 commands/prep.c X32932 190 commands/printenv.c X24885 1646 commands/pwd.c X11400 507 commands/readall.c X52678 4113 commands/readclock.c X12013 14455 commands/readfs.c X56057 1456 commands/rev.c X44299 2929 commands/rm.c X33027 2958 commands/rmdir.c X58915 20224 commands/roff.c X30068 45809 commands/sed.c X33160 512 commands/sh X05947 1146 commands/shar.c X08693 1521 commands/size.c X13037 427 commands/sleep.c X47291 31413 commands/sort.c X45875 2073 commands/split.c X44600 4052 commands/strings.c X20678 2829 commands/strip.c X45523 4700 commands/stty.c X03641 1140 commands/su.c X59580 1781 commands/sum.c X57610 140 commands/sync.c X50173 4209 commands/tail.c X19539 9656 commands/tar.c X51512 1178 commands/tee.c X28429 4140 commands/term.c X14056 3832 commands/termcap.c X29234 4230 commands/test.c X49230 2638 commands/time.c X58865 1282 commands/touch.c X10498 3267 commands/tr.c X01207 1737 commands/traverse.c X05558 6938 commands/treecmp.c X47860 2431 commands/tset.c X30205 6563 commands/tsort.c X59715 382 commands/tty.c X20827 1114 commands/umount.c X06117 3263 commands/uniq.c X30359 424 commands/update.c X54324 3180 commands/uudecode.c X02849 1808 commands/uuencode.c X55996 2966 commands/vol.c X56043 2880 commands/wc.c X28719 1686 commands/who.c X25742 279 commands/whoami.c X58277 23674 doc/USER_GUIDE X36003 3239 doc/dis88.man X33297 14653 doc/elle.man X42220 39018 doc/lib.doc X40393 38509 doc/man_pages X63945 44305 doc/net.man X19878 4197 fs/at_makefile X61318 2988 fs/buf.h X31034 10863 fs/cache.c X49601 2925 fs/const.h X32651 273 fs/dev.h X54203 8530 fs/device.c X43804 474 fs/file.h X08379 3225 fs/filedes.c X03291 1502 fs/fproc.h X32100 1013 fs/glo.h X62665 7839 fs/inode.c X05436 1943 fs/inode.h X37259 5662 fs/link.c X15515 15303 fs/main.c X05005 4190 fs/makefile X43484 7670 fs/misc.c X59037 6257 fs/mount.c X08819 9226 fs/open.c X59312 1557 fs/param.h X44200 10716 fs/path.c X46842 4266 fs/pc_makefile X08656 8462 fs/pipe.c X01700 5864 fs/protect.c X11848 1440 fs/putc.c X15755 12205 fs/read.c X14710 5397 fs/stadir.c X11343 8912 fs/super.c X10348 2081 fs/super.h X46563 4312 fs/table.c X03667 2620 fs/time.c X56368 710 fs/type.h X42080 5396 fs/utility.c X00551 7367 fs/write.c X45442 1683 h/callnr.h X55177 7424 h/com.h X21531 4403 h/const.h X48562 2191 h/error.h X03794 1412 h/sgtty.h X06265 1115 h/signal.h X51139 861 h/stat.h X16557 4001 h/type.h X32234 3646 include/a.out.h X50166 133 include/ar.h X61900 152 include/assert.h X26992 673 include/ctype.h X36672 1133 include/errno.h X40434 351 include/fcntl.h X08357 66 include/grp.h X09580 2132 include/limits.h X47777 81 include/memory.h X64720 128 include/pwd.h X65152 634 include/regexp.h X62754 98 include/setjmp.h X03794 1412 include/sgtty.h X06265 1115 include/signal.h X56753 1307 include/stdio.h X42727 263 include/string.h X34166 139 include/time.h X08000 352 include/unistd.h X54909 74 include/utime.h X13220 217 include/utmp.h X17574 3026 kernel/at_makefile X64098 16075 kernel/at_wini.c X61767 9461 kernel/clock.c X35525 40525 kernel/console.c X46559 2880 kernel/const.h X09961 3543 kernel/dmp.c X37030 26551 kernel/floppy.c X57617 941 kernel/glo.h X24617 27165 kernel/klib88.s X01335 11156 kernel/main.c X42475 3015 kernel/makefile X36060 5296 kernel/memory.c X09331 13834 kernel/mpx88.s X50370 3183 kernel/pc_makefile X56408 9952 kernel/printer.c X33362 13732 kernel/proc.c X21644 2324 kernel/proc.h X12176 18813 kernel/ps_wini.c X61265 18997 kernel/rs232.c X14553 19824 kernel/system.c X38305 3634 kernel/table.c X61842 28048 kernel/tty.c X61705 7512 kernel/tty.h X44806 4708 kernel/ttymaps.h X27554 742 kernel/type.h X14198 26433 kernel/xt_wini.c X38561 653 lib/READ_ME X44585 67 lib/abort.c X62378 35 lib/abs.c X00847 116 lib/access.c X53180 130 lib/alarm.c X15118 2103 lib/amoeba.c X02865 1052 lib/atoi.c X09958 308 lib/atol.c X05346 495 lib/bcmp.c X46098 116 lib/bcopy.c X32077 526 lib/brk.c X45837 128 lib/brk2.c X32537 998 lib/bsearch.c X13825 329 lib/bzero.c X45333 2076 lib/call.c X38438 95 lib/chdir.c X24400 114 lib/chmod.c X35694 160 lib/chown.c X52416 97 lib/chroot.c X63814 142 lib/cleanup.c X09772 117 lib/close.c X17351 113 lib/creat.c X52070 880 lib/crypt.c X19954 619 lib/ctermid.c X40552 1960 lib/ctime.c X29735 609 lib/ctype.c X00864 553 lib/cuserid.c X00979 4102 lib/doprintf.c X44155 112 lib/dup.c X07247 130 lib/dup2.c X29888 2327 lib/exec.c X32310 1858 lib/execlp.c X25467 298 lib/exit.c X09724 314 lib/fclose.c X45926 830 lib/fdopen.c X61312 356 lib/fflush.c X12779 224 lib/ffs.c X58025 617 lib/fgetc.c X56675 305 lib/fgets.c X36305 985 lib/fopen.c X41218 103 lib/fork.c X34967 309 lib/fprintf.c X12884 721 lib/fputc.c X23657 102 lib/fputs.c X26759 350 lib/fread.c X10093 175 lib/freopen.c X46552 969 lib/fseek.c X24992 156 lib/fstat.c X58766 407 lib/ftell.c X34432 315 lib/fwrite.c X23802 2784 lib/getcwd.c X49079 172 lib/getegid.c X11147 494 lib/getenv.c X20964 172 lib/geteuid.c X30382 133 lib/getgid.c X35565 2051 lib/getgrent.c X30802 429 lib/getlogin.c X14641 445 lib/getpass.c X01525 107 lib/getpid.c X47346 1734 lib/getpwent.c X34634 228 lib/gets.c X42731 133 lib/getuid.c X01733 96 lib/gtty.c X38698 113 lib/index.c X34565 1710 lib/ioctl.c X41007 187 lib/isatty.c X49081 438 lib/itoa.c X62370 205 lib/kill.c X36738 293 lib/lib.h X18984 146 lib/link.c X34936 811 lib/lsearch.c X53203 261 lib/lseek.c X19750 4607 lib/malloc.c X08173 296 lib/memccpy.c X18528 280 lib/memchr.c X58142 331 lib/memcmp.c X02386 691 lib/memcpy.c X27776 260 lib/memset.c X60920 139 lib/message.c X31402 160 lib/mknod.c X23306 420 lib/mktemp.c X63119 181 lib/mount.c X39272 111 lib/open.c X33919 105 lib/pause.c X43918 1474 lib/perror.c X10862 215 lib/pipe.c X11127 1048 lib/popen.c X04176 360 lib/printdat.c X50919 4044 lib/printk.c X11770 1225 lib/prints.c X36117 117 lib/puts.c X50428 2820 lib/qsort.c X65186 172 lib/rand.c X49122 179 lib/read.c X55285 27651 lib/regexp.c X06232 2106 lib/regsub.c X10614 156 lib/rindex.c X65445 1643 lib/run X18260 5928 lib/scanf.c X33815 299 lib/setbuf.c X06203 121 lib/setgid.c X13969 121 lib/setuid.c X16064 843 lib/signal.c X47616 235 lib/sleep.c X06501 294 lib/sprintf.c X12818 164 lib/stat.c X03184 211 lib/stb.c X32278 91 lib/stderr.c X07568 100 lib/stime.c X46909 267 lib/strcat.c X54813 276 lib/strchr.c X21978 167 lib/strcmp.c X60457 159 lib/strcpy.c X46371 698 lib/strcspn.c X37192 124 lib/strlen.c X50373 442 lib/strncat.c X09417 486 lib/strncmp.c X24852 541 lib/strncpy.c X64825 670 lib/strpbrk.c X51316 301 lib/strrchr.c X31009 705 lib/strspn.c X29781 856 lib/strstr.c X47083 1663 lib/strtok.c X10475 96 lib/stty.c X01903 278 lib/swab.c X40136 103 lib/sync.c X43423 4481 lib/syslib.c X38766 436 lib/system.c X39955 5964 lib/termcap.c X33646 258 lib/time.c X49116 304 lib/times.c X23871 1367 lib/ttyname.c X15882 137 lib/umask.c X08177 96 lib/umount.c X28421 286 lib/ungetc.c X42356 374 lib/uniqport.c X32976 96 lib/unlink.c X12074 187 lib/utime.c X18953 189 lib/wait.c X47336 154 lib/write.c X59150 7857 mm/alloc.c X49710 1833 mm/at_makefile X05784 7234 mm/break.c X43289 744 mm/const.h X37617 17077 mm/exec.c X17024 9871 mm/forkexit.c X34366 1572 mm/getset.c X06761 799 mm/glo.h X41965 7272 mm/main.c X24264 1826 mm/makefile X46388 1661 mm/mproc.h X21684 677 mm/param.h X39295 1890 mm/pc_makefile X54292 1487 mm/putc.c X55828 13811 mm/signal.c X09215 3143 mm/table.c X17333 238 mm/type.h X20567 4181 mm/utility.c X59092 251 test/makefile X29539 100 test/run X20503 22 test/t10a.c X51001 840 test/t11a.c X42075 462 test/t11b.c X01801 5927 test/test0.c X45629 1116 test/test1.c X32574 1765 test/test10.c X11430 1821 test/test11.c X39909 432 test/test12.c X55929 736 test/test13.c X64882 39248 test/test17.c X07191 32979 test/test18.c X03527 4544 test/test19.c X23963 1016 test/test2.c X49300 1461 test/test3.c X19872 1019 test/test4.c X26501 4532 test/test5.c X47521 1253 test/test6.c X43244 526 test/test7.c X27162 1882 test/test8.c X54372 3466 test/test9.c X59520 2249 tools/at_makefile X24715 8072 tools/bootblok.s X12808 1298 tools/changemem X51921 45901 tools/fsck.c X34431 3158 tools/fsck1.s X39871 44 tools/group X21308 6082 tools/init.c X43560 327 tools/message X52749 25884 tools/mkfs.c X52059 97 tools/passwd X59520 2249 tools/pc_makefile X00735 105 tools/profile X09800 197 tools/rc X12541 4 tools/ttys X10241 22 tools/ttytype X17960 11073 commands/dis88/README X19257 7600 commands/dis88/dis.h X42961 20594 commands/dis88/dis88 X03273 5589 commands/dis88/disfp.c X61857 25688 commands/dis88/dishand.c X58032 17458 commands/dis88/dismain.c X16516 777 commands/dis88/disrel.c X12188 30238 commands/dis88/distabs.c X55558 1473 commands/dis88/makefile X18912 1803 commands/make/ReadMe X05068 2100 commands/make/check.c X14691 2457 commands/make/h.h X36629 6577 commands/make/input.c X30757 2366 commands/make/macro.c X32093 4332 commands/make/main.c X05145 7681 commands/make/make.c X22415 498 commands/make/makefile X12045 1795 commands/make/reader.c X27048 4916 commands/make/rules.c X43569 96 commands/mined/makefile X63267 6878 commands/mined/mined.h X49653 60035 commands/mined/mined1.c X09064 44895 commands/mined/mined2.c X58305 127 commands/sh/makefile X38542 7321 commands/sh/sh.h X35063 14561 commands/sh/sh1.c X12818 11571 commands/sh/sh2.c X13189 16895 commands/sh/sh3.c X34776 12321 commands/sh/sh4.c X24520 9258 commands/sh/sh5.c X26188 92 commands/sh/sh6.c + END-OF-FILE log chmod 'u=rw,g=r,o=r' 'log' set `wc -c 'log'` count=$1 case $count in 11822) :;; *) echo 'Bad character count in ''log' >&2 echo 'Count should be 11822' >&2 esac exit 0
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)
The message could not be delivered to: Addressee: EAMATEO Reason: %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI ---------------------------------------- Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 08:38 N Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 5872 for EAMATEO@EBRUPC51; Thu, 29 Sep 88 08:38 N Received: by EB0UB011 (Mailer X1.25) id 1633; Thu, 29 Sep 88 03:50:41 HOE Date: Tue, 27 Sep 88 20:55:30 GMT From: Andy Tanenbaum <ast@CS.VU.NL> Subject: V1.3c posting #7 - doc Sender: Minix operating system <MINIX-L@FINHUTC.BITNET> To: NACHO NAVARRO <EAMATEO@EBRUPC51> Reply-to: INFO-MINIX@UDEL.EDU Comments: Warning -- original Sender: tag was info-minix-request@UDEL.EDU Comments: To: info-minix@UDEL.EDU : This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. : --------------------------- cut here -------------------------- PATH=/bin:/usr/bin:/usr/ucb echo Extracting 'LISTING' sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING' Xtotal 52 X-rw-r--r-- 1 ast 23674 Sep 26 22:48 USER_GUIDE X-rw-r--r-- 1 ast 23520 Sep 26 22:47 man_pages.cdif X-rw-r--r-- 1 ast 4967 Sep 26 22:47 net.man.cdif + END-OF-FILE LISTING chmod 'u=rw,g=r,o=r' 'LISTING' set `wc -c 'LISTING'` count=$1 case $count in 183) :;; *) echo 'Bad character count in ''LISTING' >&2 echo 'Count should be 183' >&2 esac echo Extracting 'USER_GUIDE' sed 's/^X//' > 'USER_GUIDE' << '+ END-OF-FILE ''USER_GUIDE' XThis file contains important information not present in the book or elsewhere. XPlease read it VERY carefully. X X X 1. GENERAL X There were a number of changes made to the code after the book X was printed. As a result, line X of file Y in the book may actually X appear at X+3, or X-5, etc. on the disk version. New features have also X been added in various places. X X 2. PC-AT X The distribution for the PC-AT differs from that for the PC in minor X ways. For example, there is no /user diskette. Most the files that would X normally be on /user fit on /usr. Furthermore, the number and organization X of the source diskettes is different, but the same programs are available. X Two additional special files are present in /dev: /dev/at0 and /dev/at1. X These should be used to access 1.2M diskettes. To access 360K diskettes X on the PC-AT, use /dev/fd0 and /dev/fd1. Special files are used by X commands such as mount, mkfs, and df, among others. For example, to X copy part of a 1.2M diskette, type dd if=/dev/at0 of=file count=100. X The difference between /dev/at0 and /dev/fd0 is that in MINIX, special X files have sizes to prevent access beyond the end. For /dev/fd0 the X size is 360K. For /dev/at0 it is 1.2M. Finally, the executable binary X for the PC-AT contains at_wini.c instead of xt_wini.c (see below). X X 3. HARD DISK DRIVERS X MINIX supports the use of the standard IBM hard disks. Unfortunately, X IBM chose to use different (and incompatible) disks and controllers on the X XT and AT. To find out if MINIX works with your disk, give the command: X dd if=/dev/hd0 of=/dev/null count=1000 X If this runs to the end without errors, the driver embedded in your X MINIX binary is appropriate for your controller and drive. If it gives X errors, do a sync, turn the computer off and reboot MINIX. This time run X a hard disk check from the initial menu. Start MINIX (even if this check X gives errors). Run dd again. If it still fails, try the following. X Copy kernel/xt_wini.c to wini.c and recompile the operating system. X If this fails, then try kernel/at_wini.c and recompile it once more. X Usually, one of these will work. If neither works, your disk is not X compatible with either the XT or AT. You will have to modify the driver. X For PS/2 Model 30 users, a driver ps_wini.c has been provided for use. X You MUST have a kernel/wini.c to recompile the system, even if you do not X have a hard disk (in which case, any one will do). X X 4. INSTALLING MINIX ON A HARD DISK X After you have made sure that you have a working hard disk driver, as X described above, proceed as follows. To use MINIX on a hard disk, you need X a MINIX partition. You may also have MS-DOS, PC-IX, OS/2, XENIX, or other X partitions as well if you like. If you understand about making partitions, X make one any way you are used to. Otherwise use the MINIX fdisk program. X All partitions on the disk must be an even number of sectors even DOS ones. X Be warned that the MINIX, MS-DOS, PC-IX, and XENIX parition numbering X schemes all differ. Be very careful here, lest you overwrite useful data. X It is suggested that you use the program diskcheck to inspect the MINIX X partition for bad blocks. The program badblocks will help deal with them. X The file man_pages in this directory discusses their use. X Once you have a partition available for MINIX (the type does not matter X as MINIX does not check), make a file system by booting MINIX from floppy X the usual way and run mkfs. If, for example, you have chosen partition 2, X which has, say, 40 cylinders (i.e., 40 x 68 = 2720 sectors or 1360 1K X blocks), type: X mkfs /dev/hd2 1360 X to make an empty file system. However, for partition 1 use 1 block less X because block 0 is not available (it contains the MS-DOS partition table). X In other words, a 40 cylinder partition 1 has 1359 blocks but a 40 cylinder X partition 2 or higher has 1360 blocks. Then mount the file system by typing X /etc/mount /dev/hd2 /user X Next, make whatever directories you like, typically bin, lib, and others, X and copy files to the hard disk. With the /usr floppy in drive 0, the X command X cp /usr/bin/* /user/bin X will copy all the binaries from /usr/bin to the hard disk, for example. X Alternatively, the cpdir program can be used to copy entire trees, e.g. X cpdir /usr/bin /user/bin X will create a new directory /user/bin, and put /usr/bin with all its files X and subdirectories in it. X A few of the files in /usr/bin must be owned by the root (instead of X bin) and have mode 4755. Check to make sure. These files are: X badblocks chgrp df fsck mkdir mv passwd readall rmdir su X Finally, edit /etc/rc to have the hard disk mounted when the system X is booted. A line such as X /etc/mount /dev/hd2 /usr X can be used as a replacement for the mount command initially in /etc/rc. X After editing /etc/rc, mount the root file system diskette and copy it X to the diskette; otherwise the changes will be lost when the system is X rebooted. (There is nothing special about the root file system except X its size; it can be mounted and written on like any other file system.) X After these steps have been taken, the system can be booted from X floppy in the usual way, and the root file system also read in from X floppy. The hard disk will automatically be mounted by the /etc/rc. X The root device remains on the RAM disk, and the boot process still X goes via floppy (for compatibility and to prevent disaster in the event X that something goes wrong with the hard disk file system). Hard disk X file systems can be checked using fsck, the same as floppies. However, X fsck assumes you have 4 heads and 17 sectors/track. If this is not so, X change the code accordingly or fsck will give spurious errors. X The special file /dev/hd0 refers to the whole disk, without regard to X partitions, whereas /dev/hd1 ... /dev/hd4 refer to partitions 1 to 4. If X you have a second hard disk, you can make /dev/hd5 ... /dev/hd9 with mknod X (major device 3, minor device 5 ... 9) for the second drive, with hd5 for X the whole drive, hd6 for partition 1, etc. Fsck also uses this convention. X X 5. CONFIGURING MINIX ON A HARD DISK X When setting up MINIX on a hard disk, the following set of directories X is recommended, although the MINIX source tree can go elsewhere if desired. X Be sure to edit the cc.c program to make sure it knows where to find the X various compiler passes and libraries, which may be in /bin, lib, /usr/bin, X or /usr/bin. When a large RAM disk is available, put /bin and /lib on the X RAM disk, and include the compiler parts in them. When extracting files X from the distribution, note carefully that there is a lib directory on the X /usr diskette (for /lib and /usr/lib) and another one among the sources X (for /usr/src/minix/lib). Many of the directories listed below have sub- X directories. X X /bin - most common binaries X /dev - special files X /etc - system administration X /lib - most important libraries X /tmp - scratch files go here X /usr - mount usr file system here X /usr/bin - rest of the binaries X /usr/include - system include files X /usr/lib - rest of the libraries X /usr/src - sources go here X /usr/src/minix - minix sources go here X /usr/src/minix/amoeba - all networking code is here X /usr/src/minix/commands - utility program sources X /usr/src/minix/fs - file system sources X /usr/src/minix/h - operating system header files X /usr/src/minix/kernel - kernel and device driver sources X /usr/src/minix/lib - libc.a sources X /usr/src/minix/mm - memory manager sources X /usr/src/minix/test - test programs X /usr/src/minix/tools - tools for building new operating systems X /usr/tmp - (optional) alternative place for temporaries X X 6. PUTTING THE ROOT FILE SYSTEM ON A HARD DISK X To speed up the boot procedure, you may copy the root file system to X /dev/hd3 with the commands X cp /dev/fd0 /dev/hd3 or cp /dev/at0 /dev/hd3 X The former is for the PC, the latter is for the AT. /dev/hd3 must not be X mounted. When booting, leave the boot diskette in the drive when typing the X = sign. MINIX will see that the diskette is not a valid file system, and X take the root file system from the default device, /dev/hd3. You can X change the choice of default by modifying RAM_IMAGE in fs/main.c X X 7. USING MS-DOS AS A DEVELOPMENT SYSTEM X MINIX is now completely self supporting, so the C86 and PC-IX X directories have been deleted. The only time you might need MS-DOS is X for formatting blank diskettes. MINIX does not have a format program. X X 8. EDITING LARGE PROGRAMS WITH MINED X Mined has a limit on the size of programs it can edit. To edit X larger ones, they must be broken up with split, edited separately and X recombined later. Better yet, use elle, which is a much better editor, X is emacs compatible, and can handle files as large as the disk. X X 9. MKNOD X MINIX differs from UNIX in that block special files (and even some X character special files, such as /dev/kmem) can have sizes. A 360K floppy X disk special file, such as /dev/fd0 can have size 360K. Unfortunately, the X mknod system call (and mknod program) have no way to express the size, X so it uses size 0, which is equal to infinity. When you read past the X end of a block special file WITH a size, the file system returns zero X bytes. When you go off the end of a device WITHOUT a size, some drivers X return end-of-file (e.g., hard disk, RAM disk), but others (e.g., floppy X disk) return an I/O error code. Thus if you make a new block special file X for 2/0 and 2/1 (floppy disk) with mknod (i.e., no size) the command X cp /dev/fd0 /dev/fd1 X will terminate with an error on block 360 (but it will copy the disk X perfectly). The only way to make a special file with a size is by making X a file system with mkfs. X X10. NONEXISTENT DEVICES X If you try to open /dev/fd1 on a system with only one floppy disk drive, X the system may hang. To avoid this problem, the first time you log in, go X to the /dev directory, and rename special files that you do not have to X something unusual. For example, if you do not have a hard disk, rename X hd0 to HARD_DISK_0, hd1 to HARD_DISK_1, etc. Similarly with one one floppy X disk, rename fd1 to FLOPPY_DISK_1 to prevent it being typed by accident. X You can also remove them, but due to the mknod problem described above, you X can not get them back easily, so it is best just to get them out of the X way in case you ever need them again later. X X11. PRINTER X In order to accommodate buffered and unbuffered printers, the printer X driver uses a combination of delay loops and interrupts. The net result X is that the driver consumes a fair number of CPU cyles when running. If X you expect to do a lot of printing, you might want to consider rewriting X the printer interrupt handler, pr_char, in assembly code. Note that some X printers that are not IBM compatible give spurious out-of-paper messages. X X12. DISK SPACE X The /usr disk as distributed is nearly full. If you have two floppy X disk drives, be sure to mount /user on drive 1 and move your working X directory there. If you have only 1 floppy disk drive, remove some files X from /usr/bin to make more space. If you have a hard disk, there is no X problem. X X13. RUNNING /USER TESTS ON A FLOPPY X Before running the tests in /user/test, remove the files in X /user/commands to create some free space on the disk. Run the tests as X superuser. X X14. COMMAND LINE LENGTH X The maximum initial stack size is 2K. Calls to EXEC which require a X larger stack will fail. Thus if you do ls -l * in a large directory, X the shell may expand the * so that the command line exceeds 2K and the X EXEC will fail, resulting in a message such as "Cannot execute ls". X X15. ARCHIVES ON THE DISTRIBUTION DISKETTES X To save space on the distribution diskettes, some of the sources have X been archived and compressed. Files ending with .Z are compressed files, X and can be decompressed by typing: compress -d file.Z X In some cases, the resulting file is an archive, ending with the .a suffix. X Remove the files with: ar xv file.a Thus a file like fs.a.Z must first be X uncompressed to get fs.a and then dearchived. X X16. RECOMPILING FSCK AND OTHER LARGE PROGRAMS X If for some reason you don't like the tools/fsck binary and want to X recompile it, make sure you have plenty of free space for the compiler's X temporary files. On a floppy disk system, this may mean putting fsck on X an almost empty diskette before compiling it. When the disk is full, the X quality of the compiler's error messages deteriorates rapidly. If you X are compiling fsck and getting strange results, check for disk space. X Normally /tmp is used for temporaries, but the -T flag can override that. X X17. NEWS GROUP X If you have access to USENET, you may be interested in knowing X that there is a news group, comp.os.minix devoted to discussions of MINIX. X This is one of the largest news groups, with over 10,000 readers. X If you have access to the Arpanet, Bitnet, or EARN, the news group is X gatewayed there. Contact info-minix-request@udel.edu to join or send X email to ast@cs.vu.nl requesting the MINIX information sheet. X X18. SYSTEM PROBLEMS X The IBM PC does not have any hardware for checking for stack overflow. X The user must allocate the amount of stack for each program with chmem X or use the compiler default (64K - program - data size). Some programs X in the distribution have been set to a smaller value, and may, in rare X instances with certain arguments, hang. If the system ever gets into a X situation where it echoes keystrokes, but ignores DEL and CTRL-\ and X appears otherwise to be hung up, hit F1 to see what is going on. If X some process is running and there is no way to interrupt it, hit CTRL-F9. X This key is equivalent to the super-user typing: kill -1 9. The result X of CTRL-F9 is that every process in the system is killed, including update X and all the shells. Although drastic, CTRL-F9 will dehang the system X instantly. Log in again and then type /etc/update & to restart update. X The reason for requiring CTRL to be held down while hitting F9 is to X prevent F9 from being hit by accident. X X19. USE OF EXTENDED MEMORY ON ATs X If the size of the root file system (either taken from floppy or from X /dev/hd3, as described above), is 256K or more, MINIX puts the root X device in extended memory, above 1M, leaving the entire 512K or 640K X free for MINIX and user programs. To get full advantage of the extended X memory, the size of the root file system should be the same as the amount X of extended memory present. If the root file system is < 256K, MINIX X assumes that there is no extended memory, and puts the root file system X in "low" core (below 640K). This feature only works on ATs, so PCs must X never have root file systems >= 256K. If you have a large extended memory, X you may want to put the root file system on hard disk, as described above, X so the extended memory can be loaded from hard disk quickly at boot time. X X20. SOFTWARE SCROLLING FOR EGA CARDS X MINIX works with monochrome cards, CGA cards, and IBM compatible EGA X cards. However, it does not work with some nonstandard EGA cards. With X some cards, the screen will go blank every 25 lines. MINIX can be made to X work with these EGA cards by hitting the F3 key to use software scrolling. X This is slower than hardware scrolling, so only use it if you have to. You X can toggle between the two modes by hitting F3 repeatedly. If you want soft X scrolling to be the default, recompile kernel/tty.c with the variable X softscroll initialized to 1, and make a new kernel. X X21. NEW FLAGS AND FEATURES X Various programs have acquired new flags and features and new programs X have been included. Please read all the files in this directory carefully. X X22. ANSI ESCAPE SEQUENCES X The escape sequences used by the tty driver for both input and output X have been changed to the ANSI standard ones. To manipulate the cursor X etc., print the following (among others): X ESC M: scroll a line backwards (cursor must be on line 1) X ESC [ y ; x H move to column x, row y; (1,1) is upper right corner X ESC [0J clear from cursor to end of screen X ESC [7m go to reverse video X ESC [0m go to normal video X X The 9 numeric pad keys, as well as numeric + and - now generate ESC [ x X for some x. Just type them to see which x goes with each key. There is X an /etc/termcap file for MINIX that uses the allowed sequences. X X23. _CLEANUP NO LONGER NEEDED X The exit routine has been changed to call _cleanup automatically. X As a result, programs using stdio no longer have to call it explicitly. X All calls to _cleanup have been removed from the standard distribution. X X24. DISTRIBUTION CHANGES X The subdirectories PC-IX and C86 have been deleted, as mentioned above. X In a few cases, a subdirectory IBM_PC is present for files specific to the X IBM PC/XT/AT/386 version of MINIX (as opposed to the Atari ST). These files X should be moved up one directory level. In some cases, two makefiles are X provided, called pc_makefile and at_makefile. Copy the appropriate one to X makefile, depending on whether you have (1) a PC or XT or (2) an AT. X Study them both and delete the inappropriate one. The differences are X usually related to the assumed size of the RAM disk, rather than any X differences between the two processors. X X25. LINKS X The directory /usr/include now contains several subdirectories and also X linked files. If you copy this directory to hard disk, link the following X files, if possible. X X /usr/include/sgtty.h to minix/h/sgtty.h X /usr/include/signal.h to minix/h/signal.h X /usr/include/minix/callnr.h to minix/h/callnr.h X /usr/include/minix/com.h to minix/h/com.h X /usr/include/minix/const.h to minix/h/const.h X /usr/include/minix/type.h to minix/h/type.h X /usr/include/sys/stat.h to minix/h/stat.h X /usr/include/fs/buf.h to minix/fs/buf.h X /usr/include/fs/const.h to minix/fs/const.h X /usr/include/fs/super.h to minix/fs/super.h X /usr/include/fs/type.h to minix/fs/type.h X X In addition, the files dosread, dosdir, and doswrite in /usr/bin should all X be links to the same file. It determines which it is by looking at argv[0]. X X26. LACK OF SPACE X If you are running on a system with limited memory, either 512K RAM X or no hard disk, you may encounter difficulties trying to recompile the X system. However, there are steps you can take to improve the situation. X First, various passes of the compiler are configured with ample stack X space. Using chmem you can reduce this stack space to reduce the program's X memory requirements. Be careful about not reducing it too much, or strange X things will happen. Second, the compiler flag -T can be used to place X temporary files in a place other than /tmp. This flag may be useful if X /tmp is on the RAM disk, which is too small. Third, the compiler flag -F X can be used to run cpp and cem sequentially instead of in parallel. This X approach is slower but uses less memory. Fourth, the library, libc.a X contains several large routines that are rarely used. By removing these, X you can reduce the amount of space the library requires. Fifth, if you are X able to compile but not link, after having created all the *.s files, you X can remove some of the larger *.c files, replacing them with null files to X keep make happy, and then link. Sixth, the size of the RAM disk is X determined by the size of the root file system. If the default size is not X suitable for your configuration, you can make a new root file system with X mkfs. In particular, on an XT, you may wish to move cpp and cem from /lib X (RAM disk) to /usr/lib (hard disk), thus making it possible to build a new X and smaller RAM disk to free up more "core." If you do this, be sure to X modify cc.c, since it has to know where to find cpp and cem. X X27. MULTIPLE BIN DIRECTORIES IN THE DISTRIBUTION X Since the distribution disks are nearly full, a few of the programs that X logically ought to be in the /usr/bin directory have been put on one of the X other distribution diskettes in a separate bin directory. On a hard disk X system, these programs should be put in /usr/bin. X X28. LIBRARY X Not all the sources in minix/lib have been included in libc.a (to save X space). If you have a hard disk and enough space, compare the sources and X binaries and add the missing files. Remember to compile all library X routines with cc -c -LIB file.c. The -LIB flag is essential for libraries. X The library sources are contained in the lib/libsrc.a archive. X X29. RS232 LINES X MINIX supports RS232 lines to terminals and modems. Baudrate, parity, X and bits/character are user settable. The special files /dev/tty[12] are X used to access the RS232 lines. They can be opened for reading and writing. X As shipped, the system is configured for only one line, /dev/tty1. To X enable the second one, change NR_RS_LINES in tty.c to 2. Doing so will X increase kernel size by 1K, due to the extra table and buffer space needed. X The file /etc/ttys can be configured to have a shell be started for X either line, thus making MINIX a multi-terminal system. The second char X of the three-character /etc/ttys entry gives the line parameters. See X the comment at the start of tools/init.c for details. X The program stty can be used to set baud rates, bits/character and X parity for its standard input, e.g. stty 9600 8 -even -odd </dev/tty1 X sets line 1 to 9600 baud, 8 bits/char, no parity. The stty program does X its work using the ioctl system call. X X30. MISSING SOURCES X The sources for the C compiler (including all its parts), the editor X elle, and patch are not included in the distribution. The compiler sources X are available from Transmediair and UniPress (see below). The elle and X patch sources were too large to be included and are only available via the X USENET online archives. X X31. C SYMBOL TABLE X A new flag, -s, has been added to cc to generate a symbol table in the X a.out file. It can be printed using nm and removed using strip. Do not X confuse -s (lower case, symbol table) with -S (upper case, assembly code). X X32. PASCAL AND MODULA 2 COMPILERS FOR MINIX X A MINIX compiler for Pascal is available. A MINIX compiler for Modula 2 X will available during the course of 1988-9. Neither is part of the standard X distribution. They may be purchased from either of: X X Unipress Software Transmediair Utrecht B.V. X 2025 Lincoln Highway Melkweg 3 X Edison, NJ 08817 3721 RG Bilthoven X USA Holland X Tel: (201) 985-8000 Tel: (30) 78 18 20 X X These companies also sell the sources to the MINIX C compiler, and the X Amsterdam Compiler Kit, from which all the compilers have been derived. X + END-OF-FILE USER_GUIDE chmod 'u=rw,g=r,o=r' 'USER_GUIDE' set `wc -c 'USER_GUIDE'` count=$1 case $count in 23674) :;; *) echo 'Bad character count in ''USER_GUIDE' >&2 echo 'Count should be 23674' >&2 esac echo Extracting 'man_pages.cdif' sed 's/^X//' > 'man_pages.cdif' << '+ END-OF-FILE ''man_pages.cdif' X*** /local/ast/minix/tape3b/doc/man_pages Wed Jul 13 11:50:43 1988 X--- man_pages Mon Sep 26 13:03:23 1988 X*************** X*** 1,7 **** X This file contains the man pages for those programs not listed in the book or X! which have been significantly modified since the first release. X --------------------------------------------------------------------------- X X Command: ar - archiver X Syntax: ar [qrxdpmt][abivulc] [posname] archive file ... X Flags: (none) X--- 1,22 ---- X This file contains the man pages for those programs not listed in the book or X! which have been significantly modified since the first release. It should be X! installed as /usr/lib/helpfile. X --------------------------------------------------------------------------- X X+ # animals X+ Command: animals - twenty questions type guessing game about animals X+ Syntax: animals [database] X+ Flags: (none) X+ Example: animals X+ X+ Animals is a guessing game. The user picks an animal and the computer X+ tries to guess it by posing questions that should be answered by typing "y" X+ for yes and "n" for no. Whenever the computer loses, it asks some questions X+ that allow it to improve its data base, so as time goes on, it learns. The X+ default data base should be in /usr/lib/animals. X+ X+ X+ # ar X Command: ar - archiver X Syntax: ar [qrxdpmt][abivulc] [posname] archive file ... X Flags: (none) X*************** X*** 29,34 **** X--- 44,50 ---- X u: replace only if dated later than member in archive X X X+ # ascii X Command: ascii - strip all the pure ASCII lines from a file X Syntax: ascii [-n] [file] X Flags: -n Extract the lines containing nonASCII characters X*************** X*** 42,47 **** X--- 58,64 ---- X if the file is pure ASCII, and false otherwise. X X X+ # ast X Command: ast - add symbol table to executable file X Syntax: ast -xX [file] [symbol_file] X Flags: -x do not preserve local symbols X*************** X*** 54,59 **** X--- 71,77 ---- X cc -s file.c >symbol.out. X X X+ # at X Command: at - execute commands at a later time X Syntax: at time [month day] [file] X Flags: (none) X*************** X*** 74,79 **** X--- 92,98 ---- X at. X X X+ # badblocks X Command: badblocks - put a list of bad blocks in a file X Syntax: badblocks block_special X Flags: (none) X*************** X*** 85,91 **** X--- 104,120 ---- X file. When the program starts up, it asks for a list of bad blocks. Then X it creates a file whose name is of the form .Bad_xxxxx, where xxxxx is a pid. X X+ # banner X+ Command: banner - print a banner X+ Syntax: banner arg ... X+ Flags: (none) X+ Example: banner happy birthday # print a banner saying happy birthday X X+ Banner prints its arguments on standard output using a matrix of 6 x 6 X+ pixels per character. The @ sign is used for the pixels. X+ X+ X+ # cal X Command: cal - print a calendar X Syntax: cal [month] year X Flags: (none) X*************** X*** 99,104 **** X--- 128,134 ---- X good encyclopedia. X X X+ # cdiff X Command: cdiff - context diff X Syntax: cdiff [-c] old new X Flags: -cN how much context to provide X*************** X*** 109,114 **** X--- 139,183 ---- X files, even in the presence of other, independent changes. X X X+ #chmod X+ Command: chmod - change access mode for files X+ Syntax: chmod octal-number files X+ chmod [augo][+-=][rwxst] files X+ Flags: (none) X+ Examples: chmod 755 file # Owner: rwx Group: r-x Others: r-x X+ chmod +x file1 file2 # Make file1 and file2 executable X+ chmod a-w file # Make file read only X+ chmod u+s file # Turn on SETUID for file X+ chmod g=u # group perms set to same as user perms. X+ X+ The given mode is applied to each file in the file list. The mode can be X+ either absolute or symbolic. Absolute modes are given as an octal number X+ that represents the new file mode. The mode bits are defined as follows: X+ 4000 Set effective user id on execution to file's owner id X+ 2000 Set effective group id on execution to file's group id X+ 0400 file is readable by the owner of the file X+ 0200 writeable by owner X+ 0100 executable by owner X+ 0070 same as above, for other users in the same group X+ 0007 same as above, for all other users X+ X+ Symbolic modes modify the current file mode in a specified way. They take X+ the form: X+ [who] op permissions { op permissions } X+ The possibilities for [who] are 'u', 'g', 'o', and 'a'; standing for user, X+ group, other and all, respectively. If who is omitted, 'a' is assumed, but X+ the current umask is used. The op can be '+', '-', or '='; '+' turns on the X+ given permissions, '-' turns them off; '=' sets the permissions exclusively X+ for the given who. For example 'g=x' sets the group permissions to '--x'. X+ The possible permissions are 'r', 'w', 'x'; which stand for read, write, X+ and execute; 's' turns on the set effective user/group id bits. 'u', X+ 'g' and 'o' in the permissions field stand for the current user, group, or X+ other permission bits, respectively. Only one of these may be used at a time. X+ 's' only makes sense with 'u' and 'g'; 'o+s' is harmless and does nothing. X+ Multiple symbolic modes may be specified, separated by commas. X+ X+ X+ # compress X Command: compress - compress a file using modified Lempel-Ziv coding X Syntax: compress [-cdfv] [file] ... X Flags: -c Put output on standard output instead of on file.Z X*************** X*** 120,128 **** X X The listed files (or standard input, if none are given) are compressed X using the Ziv-Lempel algorithm. If the output is smaller than the input, X! the output is put on file.Z or standard output if no files are listed. X X X Command: cpdir - copy a directory and its subdirectories X Syntax: cpdir [-v] srcdir destdir X Flags: -v Verbose; cpdir tells what it is doing X--- 189,200 ---- X X The listed files (or standard input, if none are given) are compressed X using the Ziv-Lempel algorithm. If the output is smaller than the input, X! the output is put on file.Z or standard output if no files are listed. If X! compress is linked to uncompress, the latter is the same as "compress -d". X! Similarly, a link to "zcat" decompresses to standard output. X X X+ # cpdir X Command: cpdir - copy a directory and its subdirectories X Syntax: cpdir [-v] srcdir destdir X Flags: -v Verbose; cpdir tells what it is doing X*************** X*** 134,139 **** X--- 206,212 ---- X Recursively. Links and special files are ignored. X X X+ # cron X Command: cron - clock daemon X Syntax: cron X Flags: (none) X*************** X*** 154,159 **** X--- 227,233 ---- X 0 9 25 12 * /usr/bin/sing >/dev/tty0 #Xmas morning at 0900 only X X X+ # diff X Command: diff - print differences between two files X Syntax: diff file1 file2 X Flags: (none) X*************** X*** 163,168 **** X--- 237,243 ---- X the two files differ. Lines may not be longer than 128 characters. X X X+ # diskcheck X Command: diskcheck - check a disk for bad sectors X Syntax: diskcheck device start count X Flags: (none) X*************** X*** 171,180 **** X X Diskcheck checks a disk for bad sectors by reading in each sector, X writing a known bit pattern onto it, reading it back in and comparing with X! what was written. This check is then a second time. Bad sectors are reported X! After each sector is tested, the original sector is restored. X X X Command: dis88 - disassembler X Syntax: dis88 [-o] infile [outfile] X Flags: -o List the object code along with the assembly code X--- 246,256 ---- X X Diskcheck checks a disk for bad sectors by reading in each sector, X writing a known bit pattern onto it, reading it back in and comparing with X! what was written. This check is then done a second time. Bad sectors are X! reported. After each sector is tested, the original sector is restored. X X X+ # dis88 X Command: dis88 - disassembler X Syntax: dis88 [-o] infile [outfile] X Flags: -o List the object code along with the assembly code X*************** X*** 187,192 **** X--- 263,281 ---- X to give a more readable asembly listing. X X X+ # dosdir X+ Command: dosdir - read a DOS directory X+ Syntax: du [-lr] drive dir X+ Flags: -l long X+ -r recursive X+ Example: dosdir -l c # list drive c X+ X+ Dosdir/dosread/doswrite have been extended to handle hard disks using the X+ letters c,d,e, and f. The letters a and b can be used for floppies as synonyms X+ for 0 and 1. X+ X+ X+ # du X Command: du - print disk usage X Syntax: du [-s] dir X Flags: -s Summary only X*************** X*** 196,201 **** X--- 285,291 ---- X files in that directory and its subdirectories. X X X+ # ed X Command: ed - editor X Syntax: ed file X Flags: (none) X*************** X*** 235,240 **** X--- 325,331 ---- X q # exit the editor X X X+ # expr X Command: expr - evaluate experession X Syntax: expr arg ... X Flags: (none) X*************** X*** 247,252 **** X--- 338,344 ---- X Note that the V7 ":" operator is missing. Parentheses are permitted. X X X+ # factor X Command: factor - factor an integer less than 2**31 X Syntax: factor number X Flags: (none) X*************** X*** 256,261 **** X--- 348,354 ---- X Each factor is printed as many times as it appears in the number. X X X+ # fgrep X Command: fgrep - fast grep X Syntax: fgrep [-cfhlnsv] [file] [string] [file] ... X Flags: -c count matching lines and only print count, not the lines X*************** X*** 273,278 **** X--- 366,372 ---- X faster. X X X+ # file X Command: file - make a guess as to a file's type based on contents X Syntax: file name ... X Flags: (none) X*************** X*** 283,288 **** X--- 377,383 ---- X source programs, executable binaries, shell scripts, and English text. X X X+ # find X Command: find - find files meeting a given condition X Syntax: find directory expression X Flags: (none) X*************** X*** 316,321 **** X--- 411,417 ---- X -ok prompts before executing the command X X X+ # fdisk X Command: fdisk - partition a hard disk X Syntax: fdisk file X Flags: (none) X*************** X*** 331,336 **** X--- 427,433 ---- X MS-DOS all have different ideas about how partitions are numbered. X X X+ # fix X Command: fix - generate new file from old one and diff listing X Syntax: fix oldfile difflist >newfile X Flags: (none) X*************** X*** 348,353 **** X--- 445,451 ---- X will generate a file new2 that is identical to newfile. X X X+ # from X Command: from - input half of a connection X Syntax: from port X Flags: (none) X*************** X*** 361,366 **** X--- 459,465 ---- X receiving pipeline, making pipelines work across the network. X X X+ #fsck X Command: fsck - perform file system consistency check X Syntax: fsck [-aclmrs] [device] ... X Flags: -a automatically repair inconsistencies X*************** X*** 372,384 **** X Examples: fsck /dev/hd4 # check file system on /dev/hd4 X fsck -a /dev/at0 # automatically fix errors on /dev/at0 X fsck -l /dev/fd0 # list the contents of /dev/fd0 X! fsck -c 2 3 /dev/hd3 # check and list inodes 2 & 3 on /dev/hd3 X X Fsck performs consistency checks on the file systems which reside on the X specified devices. It may also be used to list the contents of a file system X! or to make a new file system. X X X Command: lorder - compute the order for library modules X Syntax: lorder file ... X Flags: (none) X--- 471,501 ---- X Examples: fsck /dev/hd4 # check file system on /dev/hd4 X fsck -a /dev/at0 # automatically fix errors on /dev/at0 X fsck -l /dev/fd0 # list the contents of /dev/fd0 X! fsck -c 2 3 /dev/hd3 # check and list /dev/hd3 inodes 2 & 3 X X Fsck performs consistency checks on the file systems which reside on the X specified devices. It may also be used to list the contents of a file system X! or to make a new file system. Fsck can be run from the initial menu and during X! normal production. The number of heads and sectors/track are built in to X! the program (4 and 17, respectively). To change these, modify the code and X! recompile. If they are set wrong, fsck will give absurd errors. X X X+ # help X+ Command: help - give help about a command X+ Syntax: help [name] X+ Flags: (none) X+ Example: help uuencode X+ X+ Help gives help about a given command name (or help itself, if none is X+ specified). It gets its information from /usr/lib/helpfile, which should be X+ linked to doc/man_pages. To improve performance, it builds an index file, X+ /usr/lib/helpfile.idx, which is updated when it is observed to be older than X+ /usr/lib/helpfile. The lines beginning with # are the keywords for help. X+ The helpfile contains all the manual pages not present in the book. X+ X+ X+ # lorder X Command: lorder - compute the order for library modules X Syntax: lorder file ... X Flags: (none) X*************** X*** 388,393 **** X--- 505,511 ---- X and produces a partial ordering suitable for processing by tsort. X X X+ # master X Command: master - control the creation of shervers X Syntax: master count uid gid command X Flags: (none) X*************** X*** 403,408 **** X--- 521,527 ---- X new shervers (usually) instead of new login programs. Master must run as root X to be able to do setuid and setgid. X X+ # more X Command: more - pager X Syntax: more file ... X Flags: (none) X*************** X*** 415,420 **** X--- 534,540 ---- X q - exit more X X X+ # nm X Command: nm - print name list X Syntax: nm [-gnopru] [file] ... X Flags: -g print only external symbols. X*************** X*** 433,438 **** X--- 553,559 ---- X Note that assembly language files don't have symbol tables. X X X+ # paste X Command: paste - paste multiple files together X Syntax: paste [-s] [-ddelim] file ... X Flags: -s print files sequentially, file k on line k X*************** X*** 448,453 **** X--- 569,575 ---- X files sideways. X X X+ # patch X Command: patch - patches up a file from the original and a diff X Syntax: patch [-bcdDefFlnNop] X Flags: -b next argument is backup extension, instead of .orig X*************** X*** 474,479 **** X--- 596,602 ---- X on 'file~. X X X+ # prep X Command: prep - prepare a text file for statistical analysis X Syntax: prep [file] X Flags: (none) X*************** X*** 486,491 **** X--- 609,615 ---- X checker), or used for statistical analyses. X X X+ # printenv X Command: printenv - print out the current environment X Syntax: printenv X Flags: (none) X*************** X*** 494,499 **** X--- 618,624 ---- X Printenv prints out the current environment strings, one per line. X X X+ # rcp X Command: rcp - remote copy X Syntax: rcp [mach1]!file1 [mach2]!file2 X Flags: (none) X*************** X*** 504,509 **** X--- 629,658 ---- X makes use of the programs 'to' and 'from'. X X X+ # readall X+ Command: readall - read a device quickly to check for bad blocks X+ Syntax: readall file X+ Flags: (none) X+ Example: readall /dev/hd0 # read all of /dev/hd0 X+ X+ Readall reads all of the named device in large chunks. It reports about X+ blocks that it cannot read. Unlike diskcheck, it does not attempt to write on X+ the disk, making it "safer" to use when one is worried about a sick system. X+ X+ X+ # readclock X+ Command: readclock - read the AT's real time clock X+ Syntax: readclock X+ Flags: (none) X+ Example: date `/usr/bin/readclock` </dev/tty # useful in /etc/rc X+ X+ Readclock reads the AT's real time clock and prints the result in a form X+ useful to date, namely, MMDDYYhhmmss. If the clock does not exist (e.g., on a X+ PC), it outputs "-q" to query the user for the time. The example given above X+ can be put in /etc/rc to load the real time when the system is booted. X+ X+ X+ # readfs X Command: readfs - read a MINIX file system X Syntax: readfs [-il] block_special [dir] X Flags: -i Give information about the file, but do not extract files X*************** X*** 516,521 **** X--- 665,671 ---- X directory). If subdirectories are needed, they will be created automatically. X X X+ # rsh X Command: rsh - remote shell for networking X Syntax: rsh port [-beil] X Flags: -b start the rsh in the background X*************** X*** 534,539 **** X--- 684,690 ---- X to log onto a remote machine. X X X+ # sherver X Command: sherver - shell server X Syntax: sherver port X Flags: (none) X*************** X*** 546,551 **** X--- 697,703 ---- X cannot be sent down a pipe. X X X+ # spell X Command: spell - print all words in a file not present in the dictionary X Syntax: spell file X Flags: (none) X*************** X*** 559,574 **** X dictionary should be located in /usr/lib (or the shell script changed). X X X Command: strings - print all the strings in a binary file X Syntax: strings file ... X! Flags: (none) X! Example: strings a.out # print the strings in a.out X X Strings looks for sequences of ASCII characters followed by a zero byte. X These are usually strings. This program is typically used to help identify X unknown binary programs X X X Command: strip - remove symbol table from executable file X Syntax: strip [file] ... X Flags: (none) X--- 711,731 ---- X dictionary should be located in /usr/lib (or the shell script changed). X X X+ # strings X Command: strings - print all the strings in a binary file X Syntax: strings file ... X! Flags: - # search whole file, not just data seg X! -o # print octal offset of each string X! -n # n is minimum length string (def. = 4) X! Examples: strings -5 a.out # print the strings >= 5 chars in a.out X! strings - /bin/sh # search entire shell file X X Strings looks for sequences of ASCII characters followed by a zero byte. X These are usually strings. This program is typically used to help identify X unknown binary programs X X X+ # strip X Command: strip - remove symbol table from executable file X Syntax: strip [file] ... X Flags: (none) X*************** X*** 578,585 **** X copy of the file being stripped, so links are lost. X X X Command: term - turn PC into a dumb terminal X! Syntax: test [baudrate] [parity] [bits_per_character] X Flags: (none) X Examples: term 2400 # talk to modem at 2400 baud X term 1200 7 even # 1200 baud, 7 bits/char, even parity X--- 735,743 ---- X copy of the file being stripped, so links are lost. X X X+ # term X Command: term - turn PC into a dumb terminal X! Syntax: term [baudrate] [parity] [bits_per_character] X Flags: (none) X Examples: term 2400 # talk to modem at 2400 baud X term 1200 7 even # 1200 baud, 7 bits/char, even parity X*************** X*** 599,613 **** X term will try to read from /dev/tty1, and nothing will work. X X X Command: termcap - print the current termcap entry X! Syntax: termcap X Flags: (none) X Example: termcap # print the termcap entry X X! Termcap reads the /etc/termcap entry corresponding to the current shell X! variable $TERM. It then prints out all the parameters that apply. X X X Command: test - test for a condition X Syntax: test expr X Flags: (none) X--- 757,774 ---- X term will try to read from /dev/tty1, and nothing will work. X X X+ # termcap X Command: termcap - print the current termcap entry X! Syntax: termcap [type] X Flags: (none) X Example: termcap # print the termcap entry X X! Termcap reads the /etc/termcap entry corresponding to the terminal type X! supplied as the argument. If none is given, the current $TERM is used. X! It then prints out all the parameters that apply. X X X+ # test X Command: test - test for a condition X Syntax: test expr X Flags: (none) X*************** X*** 634,639 **** X--- 795,801 ---- X permitted, but must be escaped to keep the shell from trying to interpret them. X X X+ # to X Command: to - output half of a connection X Syntax: to port X Flags: (none) X*************** X*** 653,658 **** X--- 815,821 ---- X which sender goes with which receiver; any unique string can be used. X X X+ # traverse X Command: traverse - print directory tree under the named directory X Syntax: traverse dir X Flags: (none) X*************** X*** 662,667 **** X--- 825,842 ---- X the subdirectories are listed, with the depth shown by indentation. X X X+ # tset X+ Command: tset - set the $TERM variable X+ Syntax: tset [device] X+ Flags: (none) X+ Example: eval `tset` # set TERM X+ X+ Tset is used almost exclusively to set the shell variable TERM from X+ inside profiles. If an argument is supplied, that is used as the value of X+ TERM. Otherwise it looks in /etc/ttytype. X+ X+ X+ # tsort X Command: tsort - topological sort X Syntax: tsort file X Flags: (none) X*************** X*** 671,676 **** X--- 846,852 ---- X total ordering from the partial orderings. X X X+ # treecmp X Command: treecmp - recursively list differences in two directory trees X Syntax: treecmp [-v] dir1 dir2 X Flags: -v (verbose) list all directories processed X*************** X*** 684,697 **** X are not identical in both are printed. X X X Command: tty - print the device name of this tty X Syntax: tty X! Flags: (none) X Example: tty X X! Print the name of the controlling tty. X X X Command: vol - split standard input into diskette-sized volumes X Syntax: vol [-u] size block-special X Flags: -u unsave from diskettes X--- 860,875 ---- X are not identical in both are printed. X X X+ # tty X Command: tty - print the device name of this tty X Syntax: tty X! Flags: -s silent mode (return status only) X Example: tty X X! Print the name of the controlling tty X X X+ # vol X Command: vol - split standard input into diskette-sized volumes X Syntax: vol [-u] size block-special X Flags: -u unsave from diskettes X*************** X*** 705,710 **** X--- 883,889 ---- X streams on a series of diskettes, as shown in the examples above. X X X+ # whereis X Command: whereis - examine system directories for a given file X Syntax: whereis file X Flags: (none) X*************** X*** 714,719 **** X--- 893,899 ---- X and others, and prints all occurrences of the argument name in any of them. X X X+ # which X Command: which - examine $PATH to see which file will be executed X Syntax: which name X Flags: (none) X*************** X*** 726,731 **** X--- 906,912 ---- X path of the program that will be chosen. X X X+ # who X Command: who - print list of currently logged in users X Syntax: who X Flags: (none) X*************** X*** 740,745 **** X--- 921,927 ---- X manually truncate it from time to time. X X X+ # whoami X Command: whoami - print current user name X Syntax: whoami X Flags: (none) X*************** X*** 750,755 **** X--- 932,938 ---- X user. X X X+ # uuencode X Command: uuencode - encode a binary file to ASCII (e.g., for mailing) X Syntax: uuencode [input] output X Flags: (none) X*************** X*** 760,765 **** X--- 943,949 ---- X different characters are used, all of them valid ASCII characters. X X X+ # uudecode X Command: uudecode - decode a binary file encoded with uuencode X Syntax: uudecode file X Flags: (none) X*************** X*** 769,772 **** X--- 953,966 ---- X converts it back to the original file. The decoded file is given the name X that the original file had. The name information is part of the encoded file. X X+ X+ # write X+ Command: write - write a message to a terminal X+ Syntax: write ttyn X+ Flags: (none) X+ Example: write tty1 # write to /dev/tty1 X+ X+ Write is a shell script that is used to send a message to another logged X+ in user on the system. The user is identified by tty number. After the X+ message has been typed, the user types CTRL-D to exit. X + END-OF-FILE man_pages.cdif chmod 'u=rw,g=r,o=r' 'man_pages.cdif' set `wc -c 'man_pages.cdif'` count=$1 case $count in 23520) :;; *) echo 'Bad character count in ''man_pages.cdif' >&2 echo 'Count should be 23520' >&2 esac echo Extracting 'net.man.cdif' sed 's/^X//' > 'net.man.cdif' << '+ END-OF-FILE ''net.man.cdif' X*** /local/ast/minix/tape3b/doc/net.man Wed Jul 13 14:58:05 1988 X--- net.man Mon Sep 26 13:03:24 1988 X*************** X*** 585,626 **** X You must do the following important steps carefully. X X X! 1. Make sure that you are in the amoeba directory. X! Run the command: X X install X X! 2. If you do not have much free disk space then do the following: X! Go to the fs directory (ie. ../fs) and type X! make clean X! Then go to the mm directory (ie. ../mm) and type: X! make clean X! Then go to the kernel directory (ie. ../kernel) and type: X! make clean X X! 3. Go to the amoeba/mm directory and run make. X X! 4. Go to the amoeba/fs directory and run make. X X! 5. Go to the amoeba/kernel directory (NOT the regular kernel directory). X! If you do NOT have an ethernet card but still wish to have local Amoeba X! transactions then edit the makefile and add -DNONET to the CFLAGS. X! If you do have an ethernet card and would like to keep ethernet statistics X! then add -DSTATISTICS to CFLAGS. X! X! 6. Now run make. X! X! 7. Go to the tools directory and build a new boot floppy. X! The command to do this is: X! make net X! X! 8. Reboot your machine using the new boot floppy. X! X! 9. Test the system. The directory amoeba/examples contains several programs X to test the reliability of transactions. The READ_ME file in the directory X gives more details. X X! 10. If you have an ethernet card then install the network tools. The directory X amoeba/util contains utilities for remote shells, remote file copying and X message sending. These only work with machines that have Amoeba X transactions installed. The READ_ME file there gives more details. X--- 585,606 ---- X You must do the following important steps carefully. X X X! 1. Make sure that you are in the amoeba directory and that there is plenty X! of free disk space. Run the command: X X install X X! 2. Type: make X X! 3. When you are instructed to do so, insert a blank diskette and hit return. X X! 4. Reboot your machine using the new boot floppy. X X! 5. Test the system. The directory amoeba/examples contains several programs X to test the reliability of transactions. The READ_ME file in the directory X gives more details. X X! 6. If you have an ethernet card then install the network tools. The directory X amoeba/util contains utilities for remote shells, remote file copying and X message sending. These only work with machines that have Amoeba X transactions installed. The READ_ME file there gives more details. X*************** X*** 727,733 **** X X /usr/bin/master 1 2 2 /etc/sherver mumbo X X! will start a single sherver listening to the port `jumbo' and ensure that X there is always a sherver running. This sherver will have uid=2 and gid=2, X so that rsh calls to mumbo will be executed with this uid/gid combination. X It is suggested to start up master in the /etc/rc file of any machine X--- 707,713 ---- X X /usr/bin/master 1 2 2 /etc/sherver mumbo X X! will start a single sherver listening to the port `mumbo' and ensure that X there is always a sherver running. This sherver will have uid=2 and gid=2, X so that rsh calls to mumbo will be executed with this uid/gid combination. X It is suggested to start up master in the /etc/rc file of any machine X*************** X*** 793,806 **** X then bufread will not be called again until an eth_release has been done. X X 3. The ethernet driver generates no write interrupts. This is because we X! found that the chip on the ethernet card was so much faster than the CPU X! on the Zenith AT clone that it was always sent before the next packet is X! ready. If necessary the high level code busy-waits until the ethernet X! write buffer is free. If write interrupts are required then pkt_sent() X! in amoeba.c should be modified. X! This is rather disgusting, but was done for efficiency reasons. Interrupt X! handling is expensive under Minix and so it was much faster to not X! generate interrupts and just wait for the buffer to become free. X X There are several routines used by the high level code which should be X provided by the ethernet driver. Unless otherwise stated, these routines are X--- 773,783 ---- X then bufread will not be called again until an eth_release has been done. X X 3. The ethernet driver generates no write interrupts. This is because we X! found that busy waiting was more efficient than doing a context switch and X! waiting for an interrupt. By the time the context switch was done, the X! interrupt had already happened, so we had to switch back. It's faster to X! just wait for it. On a very slow machine, a different strategy might be X! appropriate. X X There are several routines used by the high level code which should be X provided by the ethernet driver. Unless otherwise stated, these routines are + END-OF-FILE net.man.cdif chmod 'u=rw,g=r,o=r' 'net.man.cdif' set `wc -c 'net.man.cdif'` count=$1 case $count in 4967) :;; *) echo 'Bad character count in ''net.man.cdif' >&2 echo 'Count should be 4967' >&2 esac exit 0
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (10/01/88)
Your message could not be delivered to: EAMATEO Your message has been enqueued and undeliverable for 9 days. The mail system will continue to try to deliver your message for an additional 3 days. The beginning of your message follows:
Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (10/04/88)
Your message could not be delivered to: EAMATEO Your message has been enqueued and undeliverable for 12 days. No further attempts will be made to deliver your messsage. Your entire message follows:
Postmaster%TOP.UPC.ES@cunyvm.cuny.edu (PMDF Mail Server) (02/20/89)
Your message could not be delivered to: EANACHO Your message has been enqueued and undeliverable for 3 days. The mail system will continue to try to deliver your message for an additional 9 days. The beginning of your message follows:
Postmaster%TOP.UPC.ES@cunyvm.cuny.edu (PMDF Mail Server) (02/23/89)
Your message could not be delivered to: EANACHO Your message has been enqueued and undeliverable for 6 days. The mail system will continue to try to deliver your message for an additional 6 days. The beginning of your message follows:
Postmaster%TOP.UPC.ES@cunyvm.cuny.edu (PMDF Mail Server) (02/27/89)
Your message could not be delivered to: EANACHO Your message has been enqueued and undeliverable for 9 days. The mail system will continue to try to deliver your message for an additional 3 days. The beginning of your message follows:
Postmaster%TOP.UPC.ES@cunyvm.cuny.edu (PMDF Mail Server) (03/01/89)
Your message could not be delivered to: EANACHO Your message has been enqueued and undeliverable for 12 days. No further attempts will be made to deliver your messsage. Your entire message follows: