mdnet@cosmo.UUCP (Dr. Carsten Emde/Klinikum Steglitz der FU Berlin) (01/09/90)
>From unido!zedat.fu-berlin.dbp.de!EMDE Mon Jan 8 10:11:07 1990
Received: by cosmo.UUCP (sendmail 5.61++/1.3)
id AA01218; Mon, 8 Jan 90 16:11:18 +0100
Received: from gmdzi.UUCP (gmdzi) (1254)
by unido.informatik.uni-dortmund.de
for cosmo
id AL21947; Mon, 8 Jan 90 11:00:10 +0100
Received: by gmdzi.UUCP id AA07368; Mon, 8 Jan 90 11:03:13 -0100
Date: 6 Jan 90 12:22 +0100
From: EMDE <unido!zedat.fu-berlin.dbp.de!EMDE>
To: cosmo!mdnet
Message-Id: <143:EMDE@zedat.fu-berlin.dbp.de>
Subject: Browse (part 1 of 3)
Status: RO
Organization: Klinikum Steglitz, FU Berlin, Gastro-Labor
X-Mailer: O-X-M [v1.3d]
A very helpful utility appeared once in comp.sources.misc which I have
ported to OS-9. This utility displays an ls-like directory listing on screen
and allows to walk around in the directory tree and to inspect, dump, rename,,
copy, edit, execute etc. files and directories. It was written by Peter da
Silva who proposed to post it to comp.os.os9. To compile this *NIX program
TOP's os9lib is required. Since not all OS-9 users may have this library
available, I have uuencoded the ready-to-use object module and posted as
well.
Requests and proposals:
----------------------
'browse' in general: Peter da Silva (peter@ficc.uu.net)
'browse' OS-9 implementation: Carsten Emde (emde@zedat.fu-berlin.dbp.de)
---- Cut Here and unpack ----
#!/bin/sh
# OS-9/xshar: Shell Archiver (v1.22)
# Packed January 6, 1990 Saturday 11:49:38 am by carsten
# from directory /h0/SYSSRC/BROWSE
#
# Run the following text with /bin/sh to create:
# /h0/SYS/browse.hlp
# makefile
#
sed 's/^X//' << 'SHAR_EOF' > /h0/SYS/browse.hlp &&
XBrowse is a screen-oriented directory browser, based on the metaphor of using
X'VI' to edit an 'ls -l' listing.
X
XCommands:
X SPACE Change directory (if cursor points to a directory).
X SPACE Page file through 'more' (if cursor points to a file).
X x Hex dump of current file or directory.
X & Run a program that won't clobber the screen.
X $ Run a program.
X = Enter a directory name.
X ? Page this help file through 'more'.
X [ Define a macro.
X H Go to the top of the page.
X J Go to the bottom of the directory.
X K Go to the top of the directory.
X L Go to the bottom of the page.
X ^L Repaint screen.
X M Display macros.
X S Save macros.
X I Install macros from current file.
X . Go down 20 lines.
X o Go up 20 lines.
X R Rename a file.
X dd Delete file(s). (ask for verification)
X DD Delete file(s).
X h Place cursor at beginning of line.
X l Move cursor to end of line.
X < Display file names only.
X > Display long directory listing.
X , Go down a line.
X k,^K Go up a line.
X n,^D Go down 11 lines.
X p,^U Go up 11 lines.
X
X qq,QQ,ZZ Exit.
X
X r Re-read directory.
X
X t Toggle tag on current file or directory.
X T Tag all files.
X U Untag all files or directories.
X
XMacros:
X [xtext] Define x as text.
X
XWithin text:
X % Current filename(s).
X # Current directory.
X ! Previous command.
X $x Macro for key x
X $$ Current process ID
X ~ Home directory.
X ^K One character from previous command.
X @x Execute macro for key x
X \x Enter special character x
X \nnn nnn, octal
X \^x Control-x
X
XDefault macros:
X b =..<CR>
X ~ =~<CR>
X % $%<CR>
X SPACE $more %<CR>
X c $copy %
X s $scred %<CR>
X
XWhen a command is executed (using '$<prog>'), the environment in the form
Xpresent at start of 'browse' will automatically be passed to <prog>. In
Xaddition, the environment variable FILE will be set to the current file name.
SHAR_EOF
chmod 0003 /h0/SYS/browse.hlp || echo "restore of /h0/SYS/browse.hlp fails"
sed 's/^X//' << 'SHAR_EOF' > makefile &&
XTARGET=browse
XDEBUG=
X
XHOME=/h0/
XCFILES=$(TARGET).c
XOFILES=$(TARGET).r
XHELP=$(HOME)SYS/$(TARGET).hlp
XCFLAGS=-ixt=/dd/TMP $(DEBUG)
XLFLAGS=-ixe=10
XLIBS=-l=/dd/LIB/os9lib.l -l=/dd/LIB/termlib.l
XEXEC=$(HOME)CMDS/
X
X$(TARGET): $(OFILES)
X cc $(LFLAGS) $(OFILES) $(LIBS) $(DEBUG) -f=$(EXEC)$(TARGET)
X attr $(EXEC)$(TARGET) -pe
X uuencode $(EXEC)$(TARGET) >-$(TARGET).uu
X xshar -c -D $(HELP) makefile >$(TARGET)01
X xshar -c -D $(CFILES) >$(TARGET)02
X xshar -c -D $(TARGET).uu >$(TARGET)03
X
X$(OFILES): $(CFILES)
SHAR_EOF
chmod 0003 makefile || echo "restore of makefile fails"
exit 0
mdnet@cosmo.UUCP (Dr. Carsten Emde/Klinikum Steglitz der FU Berlin) (01/09/90)
>From unido!zedat.fu-berlin.dbp.de!EMDE Mon Jan 8 10:11:23 1990
Received: by cosmo.UUCP (sendmail 5.61++/1.3)
id AA01227; Mon, 8 Jan 90 16:11:31 +0100
Received: from gmdzi.UUCP (gmdzi) (1261)
by unido.informatik.uni-dortmund.de
for cosmo
id AL22685; Mon, 8 Jan 90 11:05:01 +0100
Received: by gmdzi.UUCP id AA07489; Mon, 8 Jan 90 11:06:19 -0100
Date: 6 Jan 90 14:22 +0100
From: EMDE <unido!zedat.fu-berlin.dbp.de!EMDE>
To: cosmo!mdnet
Message-Id: <144:EMDE@zedat.fu-berlin.dbp.de>
Subject: Browse (part2 of 3)
Status: O
Organization: Klinikum Steglitz, FU Berlin, Gastro-Labor
X-Mailer: O-X-M [v1.3d]
---- Cut Here and unpack ----
#!/bin/sh
# OS-9/xshar: Shell Archiver (v1.22)
# Packed January 6, 1990 Saturday 11:49:46 am by carsten
# from directory /h0/SYSSRC/BROWSE
#
# Run the following text with /bin/sh to create:
# browse.c
#
sed 's/^X//' << 'SHAR_EOF' > browse.c &&
X/* -- Just what the hell am I ??? --- */
X
X#include <stdio.h>
X
Xchar help[]=
X"Browse through a directory, written by Peter da Silva\n\
XAdapted for OS-9 using TOP's os9lib\n\
XSyntax: browse [<dir>]\n\
XFunction: show an ls-like directory listing which can be 'edited', i.e.\n\
X files may be tagged and inspected, dumped, executed, deleted,\n\
X renamed, copied, edited etc.\n\
XOptions:\n\
X none\n";
X
X#ifdef mc68000
X#define sr sr_
X#define PC PC_
X#endif
X
X#ifdef OSK
X#include <termcap.h>
X#define GETCWD
X#define getcwd getwd
X#define minor(i) ((i)&0xFF)
X#define major(i) minor((i)>>8)
X#define SHELLSYM '$'
X#define ASSISTCOM "more /dd/sys/browse.hlp"
X#define SAVEMACROS "/h0/sys/browse.macros"
X#else
X#define remote
X#define SHELLSYM '!'
X#define ASSISTCOM "more /usr/hlp/browse.doc"
X#define SAVEMACROS "/usr/tmp/macros"
X#endif
X
X#ifdef M_XENIX
X#define USG
X#define rindex strrchr
X#define GETCWD
X#else
X#ifdef L_ctermid
X#define USG
X#define rindex strrchr
X#define minor(i) ((i)&0xFF)
X#define major(i) minor((i)>>8)
X#else
X#ifndef OSK
X#include <whoami.h>
X#endif
X#endif
X#endif
X
X/* -- Miscellaneous include files -- */
X
X#ifdef OSK
X#include <modes.h>
X#include <direct.h>
X#include <sgstat.h>
X#include <strings.h>
X#endif
X#include <sys/param.h> /* NCARGS, and others */
X#ifndef M_XENIX
X#include <sys/types.h> /* data types for various files */
X#endif
X#include <sys/stat.h> /* stat data structure for getdir(), statout() */
X#include <sys/dir.h> /* dir data structure for getdir() */
X#include <pwd.h> /* passwd data structure for u_name() */
X#include <grp.h> /* group data structure for g_name() */
X
X#ifdef BSD
X#include <sys/time.h> /* time data structure for printime() */
X#else
X#ifndef OSK
X#include <time.h> /* time data structure for printime() */
X#endif
X#endif
X#ifdef USG
X#ifdef M_XENIX
X#include <sys/ioctl.h>
X#endif
X#include <termio.h>
X#else
X#ifndef OSK
X#include <sgtty.h> /* terminal modes for tinit(), tend() */
X#endif
X#endif
X
X#include <signal.h>
X
X/* -- make information --
XBUILD
Xbrowse: browse.c
X cc browse.c -O -o browse -ltermlib
XEND
X*/
X
X/* -- Miscellaneous defines -- */
X#define FALSE 0
X#define TRUE 1
X
X#define MAXID 64
X#define MAXLINE 256
X#ifdef OSK
X#define MAXENTS 512
X#define NCOL 54
X#define MAXNAME 24
X#else
X#define MAXENTS 320
X#define NCOL 64
X#define MAXNAME 14
X#endif
X#define FILENAME 256
X#define MAXARGC (NCARGS/16) /* Estimate max ARGC */
X#define CHARSET 256 /* Number of macros == size of byte */
X#define NOMAC (0) /* Null macro (last) */
X#define TERMBUF 1024 /* Size of term buf for termcap */
X#define SMALLBUF 256
X#define NAME 1
X#define SEC 2
X
X/* -- Extended directory entry format -- */
Xstruct entry {
X char *e_name;
X int e_flags;
X#define FTAGGED (1<<0)
X#define FPERMANENT (1<<1)
X struct stat e_stat; /* file status field */
X char e_uname[9]; /* user name */
X char e_gname[9]; /* user's group name */
X#ifdef OSK
X unsigned long e_secno;
X#endif
X}
X*xentries[MAXENTS], **entries=xentries;
Xint nentries;
X
X/* -- Look-up cache for user names -- */
Xstruct idtab {
X int id_id; /* user (or group) id */
X char id_name[9]; /* name[8] + filler */
X}
Xu_list[MAXID], /* Matched user id's. */
Xg_list[MAXID]; /* ditto group */
Xint u_ptr=0, g_ptr=0; /* current entries */
X
X/* -- Global variables -- */
XFILE *efp; /* Environment file */
Xchar efname[MAXLINE]; /* " name */
Xchar *tent; /* Pointer to tbuf */
Xchar PC; /* Pad character */
Xchar *UP, *BC; /* Upline, backsapce character */
Xshort ospeed; /* Terminal output speed */
Xchar termbuf[TERMBUF]; /* Place to put term info */
X
Xchar *macbuf[CHARSET], ungetbuf[SMALLBUF];
X /* Buffers for pushback and macros */
Xchar c_macro=NOMAC; /* current macro */
Xchar *macptr = ""; /* Pointer to currently executing macro */
Xchar *ungetptr = ungetbuf; /* Pointer to pushed-back characters */
X
Xchar *errname; /* Name of file error found in */
Xextern int errno; /* system error number */
Xint xerrno; /* extended error number */
Xint ccol=NCOL; /* Width of used display, current column */
Xint quickmode; /* short display mode (files only) */
X
X#ifdef USG
Xstruct termio rawbuf;
Xstruct termio cookedbuf;
X#else
X#ifdef OSK
Xstruct sgbuf cookopts,rawopts;
Xint signhndl();
X#else
Xstruct sgttyb sgbuf; /* buffer for terminal mode info */
Xint rawflags, cookflags; /* flags for raw & cooked tty mode */
X#endif
X#endif
X
Xchar *cm, /* Cursor motion */
X *cs, /* Change scrolling region */
X *sf, /* - scroll forward */
X *sr, /* - scroll backwards */
X *ce, /* Clear to end of line */
X *cl, /* Clear screen */
X *al, /* Insert line */
X *dl, /* delete ditto */
X *so, /* standout */
X *se, /* standout end */
X *us, /* underline */
X *ue, /* underline end */
X *ti, /* Init terminal */
X *te; /* Reset terminal */
Xint li, /* lines on screen */
X co; /* columns ditto */
Xchar xn; /* Magic cookie kludge */
X
X/* -- Global error messages -- */
Xchar *emesg[4]={
X "??",
X#define TOO_MANY 1
X "Too many directory entries",
X#define NOMATCH 2
X "No match",
X 0
X};
X
Xint top, curr; /* Positions of screen in directory */
X#define bottom ((top+nlines>nentries)?nentries:(top+nlines))
Xchar *dot; /* name of current directory */
Xint nlines; /* number of lines displayed on page */
Xchar display_up; /* Does the display exist? */
Xint todump=1; /* Do we want to dump data? */
Xint ended; /* Have we quite finished? */
Xint intrup; /* Have we been interrupted? */
Xchar *HOME; /* Where did I start from? */
Xchar *SHELL; /* How do I run programs? */
X
X/* -- types of functions !!! */
Xchar *getenv(), *tgetstr();
Xchar *malloc();
X
X#define NEW(t) (t *)malloc(sizeof (t))
X#define NIL(t) ((t) 0)
X
X/* -- Code starts here: dummy main -- */
Xmain(ac, av, ep)
Xint ac;
Xchar **av;
Xchar **ep;
X{
X int i;
X
X if(ac>1)
X {
X for(i=1; i<ac; i++)
X {
X if(!strcmp(av[i],"-?"))
X {
X printf(help); exit(0);
X }
X }
X if(ac>2)
X {
X perror("only one argument may be specified.");
X exit(0);
X }
X if(chdir(av[1])==-1)
X {
X perror("can't access directory specified",av[1]);
X exit(0);
X }
X }
X
X sprintf(efname, "/tmp/br.env.%d", getpid());
X HOME=getenv("HOME");
X SHELL=getenv("SHELL");
X
X#ifndef OSK
X dumpenv(ep);
X#endif
X
X intrup=0;
X tinit(getenv("TERM"));
X clear_all();
X
X#ifdef OSK
X stdin->_flag|=_RBF; stdin->_flag|=_UNBUF;
X#endif
X
X browse();
X tend();
X#ifndef OSK
X unlink(efname);
X#endif
X}
X
Xclear_all()
X{
X int i;
X
X for(i = 0; i < MAXENTS; i++)
X entries[i] = 0;
X}
X
Xchar *clone(name)
Xchar *name;
X{
X char *hold;
X
X hold = (char *)malloc(strlen(name)+1);
X
X if(hold==0)
X return 0;
X strcpy(hold, name);
X return hold;
X}
X
Xnewname(e, name)
Xstruct entry *e;
Xchar *name;
X{
X if(e->e_name)
X free(e->e_name);
X e->e_name = clone(name);
X}
X
X#if (BSD || OSK)
Xreadent(dp, db)
XDIR *dp;
Xstruct direct *db;
X{
X struct direct *ptr;
X
X ptr = readdir(dp);
X if(!ptr) return 0;
X
X *db = *ptr; /* V7 'C' and above... safe, since UCB=V7+ */
X free(ptr);
X return 1;
X}
X#else
X#define opendir(n) fopen(n, "r")
X#define DIR FILE
Xreadent(dp, db)
XDIR *dp;
Xstruct direct *db;
X{
X if(fread(db, sizeof(struct direct), 1, dp))
X return 1;
X /* else */
X return 0;
X}
X#define closedir fclose
X#endif
X
Xgetdir()
X{
X
X#ifdef OSK
X struct fildes f;
X struct tm t;
X int physdisk, oldid;
X char pdot[32], *slash;
X#endif
X
X char *u_name(), *g_name();
X DIR *dp;
X int valid;
X struct direct *hold = NEW(struct direct);
X int i, p;
X
X if(!(dp = opendir("."))) {
X errname=".";
X return FALSE;
X }
X
X p = 0;
X for(i = 0; i < nentries; i++) {
X if(entries[i]->e_flags & FPERMANENT) {
X if(p != i) {
X struct entry *hold;
X hold = entries[p];
X entries[p] = entries[i];
X entries[i] = hold;
X }
X p++;
X }
X }
X
X for(nentries = p; !intrup && nentries < MAXENTS; nentries += valid) {
X
X if(!entries[nentries]) {
X entries[nentries] = NEW(struct entry);
X if(!entries[nentries])
X break;
X entries[nentries]->e_name = NIL(char *);
X }
X
X if(!readent(dp, hold)) {
X p=nentries; break;
X }
X
X#ifndef OSK
X valid = (hold->d_ino != 0);
X#else
X valid = TRUE;
X entries[nentries]->e_secno=hold->d_addr;
X#endif
X
X if(valid) {
X#ifndef OSK
X if(stat(hold->d_name, &entries[nentries]->e_stat)==-1) {
X closedir(dp);
X errname=hold->d_name;
X free(hold);
X return FALSE;
X }
X#endif
X
X newname(entries[nentries], hold->d_name);
X
X#ifndef BSD /* truncate name to 14 characters in non-BSD systems */
X#ifndef OSK
X if(strlen(entries[nentries]->e_name)>14)
X entries[nentries]->e_name[14] = 0;
X#endif
X#endif
X
X entries[nentries]->e_flags = 0;
X
X#ifndef OSK
X strcpy(entries[nentries]->e_uname,
X u_name(entries[nentries]->e_stat.st_uid));
X
X strcpy(entries[nentries]->e_gname,
X g_name(entries[nentries]->e_stat.st_gid));
X#endif
X }
X }
X
X closedir(dp);
X
X free(hold);
X
X#ifdef OSK
X sortdir(SEC); /* optimize head movements */
X oldid=getuid(); super();
X strcpy(pdot,dot);
X if(slash=index(pdot+1,'/')) strcpy(slash,"@"); else strcat(pdot,"@");
X if((physdisk=open(pdot,S_IREAD))==-1) return FALSE;
X for(nentries = 0; !intrup && nentries < p; nentries ++) {
X lseek(physdisk,(entries[nentries]->e_secno)<<8,0);
X read(physdisk,&f,sizeof(f));
X
X t.tm_year = (int) f.fd_date[0];
X t.tm_mon = (int) f.fd_date[1] - 1;
X t.tm_mday = (int) f.fd_date[2];
X t.tm_hour = (int) f.fd_date[3];
X t.tm_min = (int) f.fd_date[4];
X t.tm_sec = 0;
X t.tm_isdst = -1;
X
X entries[nentries]->e_stat.st_atime =
X entries[nentries]->e_stat.st_mtime = mktime(&t);
X
X t.tm_year = (int) f.fd_dcr[0];
X t.tm_mon = (int) f.fd_dcr[1] - 1;
X t.tm_mday = (int) f.fd_dcr[2];
X t.tm_hour = t.tm_min = t.tm_sec = 0;
X t.tm_isdst = -1;
X
X entries[nentries]->e_stat.st_ctime = mktime(&t);
X memcpy(&(entries[nentries]->e_stat.st_size), f.fd_fsize,
X sizeof(long));
X entries[nentries]->e_stat.st_uid = f.fd_own[1];
X entries[nentries]->e_stat.st_gid = f.fd_own[0];
X entries[nentries]->e_stat.st_mode = f.fd_att;
X entries[nentries]->e_stat.st_nlink = f.fd_link;
X
X strcpy(entries[nentries]->e_uname,
X u_name(entries[nentries]->e_stat.st_uid));
X
X strcpy(entries[nentries]->e_gname,
X g_name(entries[nentries]->e_stat.st_gid));
X }
X close(physdisk);
X setuid(oldid);
X#endif
X
X if(intrup)
X return FALSE;
X
X if(nentries>=MAXENTS || entries[nentries]==NIL(struct entry *)) {
X errno=0;
X xerrno=TOO_MANY;
X errname=".";
X return FALSE;
X }
X
X sortdir(NAME);
X
X if(intrup)
X return FALSE;
X return TRUE;
X}
X
Xat_current()
X{
X at_file(curr);
X}
X
Xat_file(file)
Xint file;
X{
X if(display_up) {
X if(file < top || file >= top+nlines)
X return 0;
X at(0, curr-top+2);
X } else {
X if(file != curr)
X return 0;
X cmdline();
X }
X return 1;
X}
X
Xdisplay_flags(flags)
X{
X outc((flags&FTAGGED)?'+':((flags&FPERMANENT)?'!':' '));
X}
X
Xrepaint_flags()
X{
X if(!display_up) return;
X at(quickmode?0:NCOL-1, curr-top+2);
X display_flags(entries[curr]->e_flags);
X}
X
X/*
Xrepaint_current()
X{
X if(!display_up) return;
X at_current();
X dump(curr, curr+1);
X}
X*/
X
Xtag()
X{
X entries[curr]->e_flags ^= FTAGGED;
X repaint_flags();
X}
X
Xtag_all(flag)
Xint flag;
X{
X int i;
X
X for(i = 0; i < nentries; i++)
X if(flag)
X {
X if(!isdir(entries[i])) entries[i]->e_flags |= FTAGGED;
X }
X else
X entries[i]->e_flags &= ~FTAGGED;
X if(display_up)
X todump = TRUE;
X}
X
Xdelete_from_display(file)
Xint file;
X{
X if(!display_up) return;
X
X if(file>=top+nlines) return;
X
X if(file < top) file = top;
X
X scroll(2+file-top, 2+nlines, 1);
X at(0, 2+nlines-1);
X if(top+nlines >= nentries)
X outc('~');
X else
X dump(bottom, bottom+1);
X}
X
Xdelete_file_entry(file)
Xint file;
X{
X struct entry *hold;
X int i;
X
X delete_from_display(file);
X
X hold = entries[file];
X for(i=file; i<nentries-1; i++)
X entries[i]=entries[i+1];
X entries[nentries-1]=hold;
X nentries--;
X
X if(file < curr || curr >= nentries) {
X curr--;
X if(top >= nentries) {
X top--;
X display_up = 0;
X todump = 1;
X }
X }
X}
X
Xremove_one(file, doit)
Xint file;
Xint doit;
X{
X if(!doit) {
X cmdline();
X outs("Delete ");
X ctlouts(entries[file]->e_name);
X outs(" [n]?");
X fflush(stdout);
X doit = getch() == 'y';
X outs(doit?"Yes.":"No.");
X fflush(stdout);
X }
X if(doit) {
X if(unlink(entries[file]->e_name) == 0) {
X cmdline();
X outs("Deleted ");
X ctlouts(entries[file]->e_name);
X outs(".");
X delete_file_entry(file);
X return 1;
X } else {
X wperror(entries[file]->e_name);
X return 0;
X }
X }
X return 0;
X}
X
Xremove(doit)
Xint doit;
X{
X int i;
X int found_tags;
X
X found_tags = 0;
X i = 0;
X while(i < nentries) {
X if(entries[i]->e_flags & FTAGGED) {
X found_tags = 1;
X if(!remove_one(i, doit)) /* decrements nentries */
X break;
X } else
X i++;
X }
X if(!found_tags)
X remove_one(curr, doit);
X}
X
Xinsert_entry_at(ent, i)
Xstruct entry *ent;
Xint i;
X{
X struct entry *hold;
X int j;
X
X /* Allocate slot at end */
X if(!entries[nentries]) {
X entries[nentries] = NEW(struct entry);
X if(!entries[nentries])
X return 0;
X entries[nentries]->e_name = NIL(char *);
X } else if(entries[nentries]->e_name) {
X free(entries[nentries]->e_name);
X entries[nentries]->e_name = NIL(char *);
X }
X
X /* Copy data into slot */
X *entries[nentries] = *ent;
X entries[nentries]->e_name = clone(ent->e_name);
X if(!entries[nentries]->e_name)
X return 0;
X
X if(i != nentries) {
X /* Rotate slot to middle */
X hold = entries[nentries];
X for(j = nentries; j > i; j--)
X entries[j] = entries[j-1];
X entries[i] = hold;
X }
X nentries++;
X
X if(display_up) {
X if(i < top)
X i = top;
X if(i >= bottom)
X return;
X scroll(2+i-top, 2+nlines, -1);
X at(0, 2+i-top);
X dump(i, i+1);
X }
X}
X
Xinsert_entry(ent)
Xstruct entry *ent;
X{
X int i;
X
X if(nentries >= MAXENTS)
X return 0;
X
X for(i = 0; i < nentries; i++)
X if(entcmpnam(&ent, &entries[i]) < 0)
X break;
X
X return insert_entry_at(ent, i);
X}
X
Xassist()
X{
X char cmdbuf[MAXLINE];
X
X sprintf(cmdbuf, ASSISTCOM);
X if(sys(cmdbuf, 1))
X perror(cmdbuf);
X}
X
Xhexdump()
X{
X char cmdbuf[MAXLINE];
X
X sprintf(cmdbuf, "dump %s", entries[curr]->e_name);
X if(sys(cmdbuf, 1))
X perror(cmdbuf);
X}
X
Xmove()
X{
X char scratch[FILENAME];
X struct entry hold;
X char inps();
X
X hold = *entries[curr];
X
X cmdline();
X outs("Rename ");
X ctlouts(entries[curr]->e_name);
X outc(' ');
X if(inps(scratch, entries[curr]->e_name, 0)=='\033') {
X killcmd();
X return;
X }
X if(link(entries[curr]->e_name, scratch)!=0) {
X char tmbuf[42];
X sprintf(tmbuf, "(rename %s %s)", entries[curr]->e_name, scratch);
X wperror(tmbuf);
X return;
X }
X if(unlink(entries[curr]->e_name)!=0) {
X wperror(entries[curr]->e_name);
X return;
X }
X
X hold.e_name = scratch;
X hold.e_flags &= ~FTAGGED;
X
X delete_file_entry(curr);
X insert_entry(&hold);
X}
X
Xpname(name, mode)
Xchar *name;
Xint mode;
X{
X int i;
X char *slash, *rindex();
X int max=quickmode?MAXLINE:(MAXNAME+1);
X
X#ifdef OSK
X if(mode&S_IFDIR)
X#else
X if((mode&S_IFMT)==S_IFDIR)
X#endif
X max--;
X
X#ifndef OSK
X else if((mode&S_IFMT)==S_IFREG && (mode&0111))
X max--;
X else if((mode&S_IFMT)!=S_IFREG)
X max--;
X#endif
X
X if(!quickmode && (slash=rindex(name, '/'))) {
X name=slash;
X outc('<');
X max--;
X }
X for(i=0; i<max && *name; name++)
X i += ctlout(*name);
X standend();
X if(i==max && *name)
X outs("\b>");
X
X#ifdef OSK
X if(mode&S_IFDIR) {
X#else
X if((mode&S_IFMT)==S_IFDIR) {
X#endif
X outc('/');
X }
X
X#ifndef OSK
X else if((mode&S_IFMT)==S_IFREG && (mode&0111)) {
X outc('*');
X }
X else if((mode&S_IFMT)!=S_IFREG) {
X outc('?');
X }
X#endif
X
X}
X
Xsortdir(ele)
Xint ele;
X{
X int entcmpnam(),entcmpsec();
X
X if(ele==NAME)
X qsort(entries, nentries, sizeof(struct entry *), entcmpnam);
X if(ele==SEC)
X qsort(entries, nentries, sizeof(struct entry *), entcmpsec);
X}
X
X#ifndef OSK
Xaddname(flag)
Xchar flag;
X{
X char buf[FILENAME], *ptr, *tmp;
X char scratch[FILENAME];
X struct entry hold;
X char inps();
X
X cmdline();
X outs("Add ");
X if(inps(scratch, entries[curr]->e_name, 0)=='\033') {
X killcmd();
X return;
X }
X
X if(stat(scratch, &hold.e_stat)==-1) {
X wperror(scratch);
X return;
X }
X if(flag!='+' && *scratch != '/') {
X strcpy(buf, dot);
X ptr = scratch;
X for(;;) { /* eat '../' and './' */
X if(ptr[0]=='.' && ptr[1]=='.' &&
X (ptr[2]=='/' || !ptr[2])) {
X tmp = rindex(buf, '/');
X if(!tmp) break;
X *tmp=0;
X ptr += 2+(ptr[2]=='/');
X continue;
X }
X if(ptr[0]=='.' &&
X (ptr[1]=='/' || !ptr[1])) {
X ptr += 1+(ptr[1]=='/');
X continue;
X }
X break;
X }
X if(*ptr) {
X strcat(buf, "/");
X strcat(buf, ptr);
X }
X hold.e_name = buf;
X } else
X hold.e_name = scratch;
X strcpy(hold.e_uname,
X u_name(hold.e_stat.st_uid));
X strcpy(hold.e_gname,
X g_name(hold.e_stat.st_gid));
X hold.e_flags = 0;
X if(flag!='+')
X hold.e_flags |= FPERMANENT;
X insert_entry(&hold);
X}
X
Xaddperm()
X{
X char buf[FILENAME], *ptr, *tmp;
X struct entry hold;
X int entcmpnam(), i;
X
X if(entries[curr]->e_flags & FPERMANENT)
X return;
X
X if(entries[curr]->e_name[0]!='/') {
X strcpy(buf, dot);
X ptr = entries[curr]->e_name;
X for(;;) { /* eat '../' and './' */
X if(ptr[0]=='.' && ptr[1]=='.' &&
X (ptr[2]=='/' || !ptr[2])) {
X tmp = rindex(buf, '/');
X if(!tmp) break;
X *tmp=0;
X ptr += 2+(ptr[2]=='/');
X continue;
X }
X if(ptr[0]=='.' &&
X (ptr[1]=='/' || !ptr[1])) {
X ptr += 1+(ptr[1]=='/');
X continue;
X }
X break;
X }
X if(*ptr) {
X strcat(buf, "/");
X strcat(buf, ptr);
X }
X hold = *entries[curr];
X
X hold.e_name = buf;
X hold.e_flags &= ~FTAGGED;
X hold.e_flags |= FPERMANENT;
X insert_entry(&hold);
X } else {
X entries[curr]->e_flags |= FPERMANENT;
X entries[curr]->e_flags &= ~FTAGGED;
X repaint_flags();
X }
X}
X
Xdelperm()
X{
X entries[curr]->e_flags &= ~(FPERMANENT|FTAGGED);
X repaint_flags();
X}
X#endif
X
Xentcmpnam(e1, e2)
Xstruct entry **e1, **e2;
X{
X if((*e1)->e_name[0] == '/') {
X if((*e2)->e_name[0] != '/')
X return 1;
X } else if((*e2)->e_name[0] == '/')
X return -1;
X
X return strcmp((*e1)->e_name, (*e2)->e_name);
X}
X
Xentcmpsec(e1, e2)
Xstruct entry **e1, **e2;
X{
X if((*e1)->e_secno < (*e2)->e_secno) return -1;
X if((*e1)->e_secno > (*e2)->e_secno) return 1;
X return 0;
X}
X
Xdump(start, end)
Xint start;
Xint end;
X{
X int i;
X int lo = (start<nentries)?start:nentries;
X int hi = (end<nentries)?end:nentries;
X
X for(i=lo; i<hi; i++) {
X statout(entries[i]->e_name,
X &entries[i]->e_stat,
X entries[i]->e_uname,
X entries[i]->e_gname,
X entries[i]->e_flags);
X nl();
X }
X return TRUE;
X}
X
Xstatout(name, sbuf, user, group, flags)
Xchar *name;
Xstruct stat *sbuf;
Xchar *user, *group;
Xint flags;
X{
X int mode = sbuf->st_mode;
X
X if(!quickmode) {
X#ifndef OSK
X printf("%5u ", sbuf->st_ino);
X#endif
X
X
X#ifdef OSK
X if(mode&S_IFDIR) outc('d'); else outc('-');
X if(mode&S_ISHARE) outc('s'); else outc('-');
X if(mode&S_IOEXEC) outc('e'); else outc('-');
X if(mode&S_IOWRITE) outc('w'); else outc('-');
X if(mode&S_IOREAD) outc('r'); else outc('-');
X if(mode&S_IEXEC) outc('e'); else outc('-');
X if(mode&S_IWRITE) outc('w'); else outc('-');
X if(mode&S_IREAD) outc('r'); else outc('-');
X#else
X if((mode&S_IFMT)==S_IFCHR) outc('c');
X else if((mode&S_IFMT)==S_IFBLK) outc('b');
X else if((mode&S_IFMT)==S_IFDIR) outc('d');
X else if((mode&S_IFMT)==S_IFREG) outc('-');
X else outc('?');
X triad((mode>>6)&7, mode&S_ISUID, 's');
X triad((mode>>3)&7, mode&S_ISGID, 's');
X triad(mode&7, mode&S_ISVTX, 't');
X#endif
X
X outc(' ');
X
X printf("%1u ", sbuf->st_nlink);
X printf("%-8s ", user);
X printf("%-8s ", group);
X
X#ifdef OSK
X if(!(mode&S_IFDIR))
X#else
X if((mode&S_IFMT)==S_IFREG || (mode&S_IFMT)==S_IFDIR))
X#endif
X printf("%7ld ", sbuf->st_size);
X else
X#ifdef OSK
X printf(" --- ");
X#else
X
X printf("%3d,%3d ",
X major(sbuf->st_rdev),mdnet@cosmo.UUCP (Dr. Carsten Emde/Klinikum Steglitz der FU Berlin) (01/09/90)
>From unido!zedat.fu-berlin.dbp.de!EMDE Mon Jan 8 10:11:41 1990
Received: by cosmo.UUCP (sendmail 5.61++/1.3)
id AA01234; Mon, 8 Jan 90 16:11:52 +0100
Received: from gmdzi.UUCP (gmdzi) (1262)
by unido.informatik.uni-dortmund.de
for cosmo
id AL23070; Mon, 8 Jan 90 11:07:18 +0100
Received: by gmdzi.UUCP id AA07593; Mon, 8 Jan 90 11:09:36 -0100
Date: 6 Jan 90 14:33 +0100
From: EMDE <unido!zedat.fu-berlin.dbp.de!EMDE>
To: cosmo!mdnet
Message-Id: <145:EMDE@zedat.fu-berlin.dbp.de>
Subject: Browse (part 3 of 3)
Status: O
Organization: Klinikum Steglitz, FU Berlin, Gastro-Labor
X-Mailer: O-X-M [v1.3d]
---- Cut Here and unpack ----
#!/bin/sh
# OS-9/xshar: Shell Archiver (v1.22)
# Packed January 6, 1990 Saturday 11:50:12 am by carsten
# from directory /h0/SYSSRC/BROWSE
#
# Run the following text with /bin/sh to create:
# browse.uu
# Then run uudecode to create browse
#
sed 's/^X//' << 'SHAR_EOF' > browse.uu &&
X
Xbegin 644 /h0/CMDS/browse
XM2OP``0``D$X````#````2`55`0&``0`*````````````````````````````7
XM`*%8````4````:```#:\```,````@N0``(X&8G)O=W-E```M1H`0+4:`%#U#^
XM@!@(*P`%`!1G#BU,@!IF""UY`````(`:2H5G'@@%``!F%$'U6`!*:/_^9@I9[
XMB$GH__QP`6`@0C58_R!-U^L`#$*G+PMT`6$`>Z1@=D/H``0M2:NF=``B8"X)_
XM9PS3S4(I__\@B5*"8.Y3@&?@2H)F$$IH__YG"D(H__\D2%B(8`8@C21(4H)2<
XM@DJ49Q@H5$H<9ORUS&,>#!P`_&884HPF5-?-8!0,+0#\``)F""9M``37S6`$[
XMU^L`#"$++PA"*/__+P)A`'+<90`!"&$43-\``YO-+RZKIF$``3YP`$ZNLK`@N
XM?/__MKS1SBU(@`0M3X``+4^`""`\____!"\(0?<(`+'N@`AD"K'N@`1E""U(R
XM@`@@7TYU0?H`9&$*+SP```$!3JZRI#\!<F1P`DY``(PR'TYU("Z``)"N@`A.K
XM=2`N@`B0KH`$3G5(Y\#P,"\`'@1``(#D0`Q```]F#$'Z`&5R`$Y``"%D!DZN(
XMLJIE9"])`!1,WP<#3G5*^P!0*BHJ*B!3=&%C:R!/=F5R9FQO=R`J*BHJ#0`JO
XM*BHJ($-A;B=T(&EN<W1A;&P@=')A<"!H86YD;&5R("HJ*BH-`"`J*BHJ(`!MA
XM871H```````B/````$`O"$'Z_\!A`/],('S__Z@6T<Y!^O_682@@7U.)82)!G
XM^O_*4XEA&A-\``W__R!\__^H%M'.80#_'DY```9.0``&$MAF_$YU3E4``$CGR
XMP(`@//___[1A`/[468]P`;"O``1L``!^<`$N@&`L0?HXH"(((!?EB"!O``@@I
XM,`@`80!T)$J`9A!![JNJ(`AA`'(6<`!.KK*P4I<@%["O``1MS'`"L*\`!&P0A
XM0?HX9R`(80!,/'``80!_WB!O``@@*``$80!^>G+_LH!F&"!O``@B*``$0?HX.
XM82`(80!,$G``80!_M&$`?S@O`$'Z.&PB"$'NCR8@"&$`<;98CT'Z.&D@"&$`\
XM<D8M0)J>0?HX8"`(80!R."U`FJ)"KIJ:0?HX5"`(80!R)F$`%UIA(`!N`("H!
XM(G`$@6ZH(F$`&H1A`!HH6(],[0$`__Q.74YU3E4``$CG@(`@//___[QA`/W22
XM68]"EV`.(!?EB"!NK.9"L`@`4I<,EP```@!MZEB/3.T!`/_\3EU.=4Y5``!('
XMY\``(#S___^X80#]F%F/("\`!&$`<J!2@&$`<;PN@$J79@1P`&`,(B\`!"`7=
XM80!RIB`76(],[0`"__Q.74YU3E4``$CGP(`@//___[QA`/U4(%=*D&<((%<@K
XM$&$`<88@+P`$898@5R"`3.T!`/_\3EU.=4Y5``!(Y\#`(#S___^X80#](%F/U
XM("\`!&$`<18N@$J79@1P`&`8(%<B;P`(<`DBV%'(__PRV"`780!Q-G`!6(],@
XM[0,`__A.74YU3E4``$CGX,`@//___E1A`/S63^_^G'`J80!Q`"]```A!^C<-@
XM(`AA`'"Z+T``$&8,0?HV_RU(F39@``0,0I="KP`$8&`@+P`$Y8@@;JSF('`(.
XM`"`H``0(```!9T0@%["O``1G.EF/("\`!.6((&ZLYBZP"``@+P`(Y8@@;JSF-
XM(B\`!.6)(FZLYB.P"``8`"`O``CEB"!NK.8AEP@`6(]2EU*O``0@+P`$L*Z(*
XM'FV6+5>('F```+8@+H@>Y8@@;JSF2K`(`&8X("Z('N6((&ZLYB(`<$)A`'!$L
XM(8`8`"`NB![EB"!NK.9*L`@`9P``D"`NB![EB"!NK.8@<`@`0I`B+P`(("\`&
XM$&$`_JY*@&8&+JZ('F!H<`$O0``,("Z('N6((&ZLYB!P"``B;P`((5$`/DJOD
XM``QG+"`O``A0@"(`("Z('N6((&ZLYB`P"`!A`/XT("Z('N6((&ZLYB!P"`!"O
XMJ``$("\`#-&NB!Y*KIJ:9@P,K@```@"('FT`_SP@+P`080!O7"`O``AA`&^<B
XM<`)A``O@80!\4B]``#AA`#3.(BZ:C$'O`!@@"&$`<&YR+T'O`!D@"&$`<<0OS
XM0``49Q!!^C5S(@@@+P`480!P3F`00?HU92((0>\`&"`(80!P7'(!0>\`&"`()
XM80!NOB]``#QR_[*`9P`"4D*NB!Y@``'J0J<@+H@>Y8@@;JSF('`(`"`H`#[A@
XMB"(`("\`0&$`;JY8CTAX`0!![P!H(@@@+P!`80!NBEB/$"\`9TB`2,`O0`!4H
XM$"\`:$B`2,!3@"]``%`0+P!I2(!(P"]``$P0+P!J2(!(P"]``$@0+P!K2(!(F
XMP"]``$1"KP!`</\O0`!@0>\`0"`(80!NCB(NB![EB2!NK.8@<!@`(4``)"(N8
XMB![EB2!NK.8@<!@`(4``(!`O`'%(@$C`+T``5!`O`')(@$C`4X`O0`!0$"\`R
XM<TB`2,`O0`!,<``O0`!`+T``1"]``$AP_R]``&`@+H@>Y8@@;JSF('`(`$/O0
XM`$`@"6$`;A@A0``H2'@`!$'O`'$B""`NB![EB"!NK.8@,`@`=!S0@F$`<F18R
XMCR`NB![EB"!NK.8@<`@`$"\`9DB`,4``%"`NB![EB"!NK.8@<`@`$"\`94B`?
XM,4``%B`NB![EB"!NK.8@<`@`$"\`9$B`,4``$"`NB![EB"!NK.8@<`@`$"\`D
XM;$B`,4``$B`NB![EB"!NK.8@<`@`<``P*``480`,["(`("Z('N6((&ZLYB`PX
XM"`!T+-""80!N:"`NB![EB"!NK.8@<`@`<``P*``680`-XB(`("Z('N6((&ZLU
XMYB`P"`!T-=""80!N.%*NB!Y*KIJ:9@H@+H@>L)=M`/X*("\`/&$`;-H@+P`XK
XM80!Y^$JNFIIF.@RN```"`(@>;!`@+H@>Y8@@;JSF2K`(`&840JZ`#'`!+4"9L
XM.D'Z,P4M2)DV8`QP`6$`"3)*KIJ:9P1P`&`"<`%/[P%D3.T#!O_P3EU.=4Y5I
XM``!(YX``(#S___^\80#X?"`NFHAA!$Y=3G5.50``2.?``"`\____O&$`^&!*&
XM+IJ49R@@%["NFH1M*"`NFH30KIJ0L)=O'"`NFHB0KIJ$5(`B`'``80`/'F`0)
XM(!>PKIJ(9P1P`&`&80`8KG`!3.T``O_\3EU.=4Y5``!(YX``(#S___^\80#XT
XM!"`7"````&<$<"M@#B`7"````6<$<"%@`G`@80`.HDY=3G5.50``2.?`@"`\2
XM____O&$`]]!*+IJ49S(@+IJ(D*Z:A%2`(@!*KID^9P1P`&`"<#5A``Z8("Z:"
XMB.6((&ZLYB!P"``@*``$80#_A$SM`0+_^$Y=3G5.50``2.>`@"`\____O&$`&
XM]WP@+IJ(Y8@@;JSF('`(`'`!L:@`!&$`_X1,[0$`__Q.74YU3E4``$CG@(`@/
XM//___[AA`/=(68]"EV!"2J\`!&<H(!?EB"!NK.8@,`@`80`I7DJ`9B8@%^6(^
XM(&ZLYB!P"`!P`8&H``1@$B`7Y8@@;JSF('`(`'#^P:@`!%*7(!>PKH@>;;9*0
XM+IJ49P9P`2U`K1!8CTSM`0#__$Y=3G5.50``2.?``"`\____N&$`]LY*+IJ4<
XM9P``GB`NFH30KIJ0L)=O``"0(!>PKIJ$;`0NKIJ$2'@``2`NFI!4@"(`("\`Z
XM!%2`D*Z:A&$`#<I8CR`NFI!4@%.`(@!P`&$`#6H@+IJ$T*Z:D+"NB!YM"'!^7
XM80`-*&!`("Z:A-"NFI"PKH@>;P8@+H@>8`@@+IJ$T*Z:D%*`(@`@+IJ$T*Z:K
XMD+"NB!YO!B`NB!Y@""`NFH30KIJ080`'M$SM``+__$Y=3G5.50``2.?`P"`\G
XM____M&$`]@Y1CR`O``AA`/\F("\`".6((&ZLYB]P"```!"ZO``A@&B`74H#EO
XMB"!NK.8B%^6)(FZLYB.P"``8`%*7("Z('E.`L)=NW"`NB!Y3@.6((&ZLYB&O)
XM``0(`%.NB!X@+P`(L*Z:B&T*("Z:B+"NB!YM'%.NFH@@+IJ$L*Z('FT.4ZZ:G
XMA$(NFI1P`2U`K1!0CTSM`P+_]$Y=3G5.50``2.?`@"`\____O&$`]69*KP`$;
XM9FAA`!7H0?HOJR`(80`+WB`7Y8@@;JSF('`(`"`080`C.D'Z+Y<@"&$`"\)!5
XM[J@R(`AA`&C$80`HR')YLH!F!'`!8`)P`"]```1*KP`$9P9!^B]O8`1!^B]N*
XM(`AA``N.0>ZH,B`(80!HD$JO``1G7"`7Y8@@;JSF('`(`"`080!HJ$J`9C1AN
XM`!5D0?HO/B`(80`+6B`7Y8@@;JSF('`(`"`080`BMD'Z+RL@"&$`"SX@%V$`3
XM_HYP`6`4(!?EB"!NK.8@<`@`(!!A``TB<`!,[0$`__Q.74YU3E4``$CGP(`@2
XM//___[1A`/1X48]"ET*O``1@,B`O``3EB"!NK.8@<`@`("@`!`@```!G%G`!T
XM+H`B+P`(("\`!&$`_M!*@&8&8`Y2KP`$("\`!+"NB!YMQ$J79@PB+P`(("Z:.
XMB&$`_JQ0CTSM`0+_^$Y=3G5.50``2.?`P"`\____L&$`]`11CR`NB![EB"!N6
XMK.9*L`@`9BH@+H@>Y8@@;JSF(@!P0F$`:!0A@!@`("Z('N6((&ZLYDJP"`!FX
XM*F```(`@+H@>Y8@@;JSF('`(`$J09R0@+H@>Y8@@;JSF('`(`"`080!GXB`N)
XMB![EB"!NK.8@<`@`0I`@;P`(("Z('N6((FZLYB)Q"`!P#R+84<C__#+8("Z(_
XM'N6((&ZLYB!P"``B;P`((!%A`/6V((`@+H@>Y8@@;JSF('`(`$J09@9P`&``H
XM`,X@+P`,L*Z('F=(("Z('N6((&ZLYB]P"```!"ZNB!Y@&B`74X#EB"!NK.8B]
XM%^6)(FZLYB.P"``8`%.7(!>PKP`,;MX@+P`,Y8@@;JSF(:\`!`@`4JZ('DHN4
XMFI1G<"`O``RPKIJ$;`8O;IJ$``P@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`NFH30Z
XMKIJ0L*\`#&\^2'C__R`NFI!4@"(`("\`$%2`D*Z:A&$`"=18CR`O``Q4@)"N]
XMFH0B`'``80`)<B`O``Q2@"(`("\`#&$`!`)0CTSM`P#_^$Y=3G5.50``2.?`O
XM@"`\____N&$`\EI9CPRN```"`(@>;01P`&`P0I=@&B`7Y8C0KJSF(@!![P`$6
XM(`AA``,02H!M"E*7(!>PKH@>;=XB%R`O``1A`/X&6(],[0$"__A.74YU3E4`H
XM`$CGP(`@//___KQA`/'\3^__`$'Z+&DB"$'7(`AA`&5J<@%!UR`(80`8/$J`J
XM9PA!UR`(80`_E$_O`0!,[0$"__A.74YU3E4``$CGP(`@//___KAA`/&T3^__H
XM`"`NFHCEB"!NK.8@<`@`+Q!!^BPI(@A![P`$(`AA`&406(]R`4'7(`AA`!?@R
XM2H!G"$'7(`AA`#\X3^\!`$SM`0+_^$Y=3G5.50``2.?`P"`\___^2&$`\5A/<
XM[_Z^("Z:B.6((&ZLYB!P"`!#UW`/(MA1R/_\,MAA`!'"0?HKQR`(80`'N"`NH
XMFHCEB"!NK.8@<`@`(!!A`!\2<"!A``?.0J<@+IJ(Y8@@;JSF('`(`"(00>\`O
XM1B`(80`7Z%B/<ANR`&8(80`B!&```*)![P!"(@@@+IJ(Y8@@;JSF('`(`"`0,
XM80`J"DJ`9SA/[__62&\`;"`NFHCEB"!NK.8@<`@`+Q!!^BM)(@A![P`((`AAB
XM`&0@4(]!UR`(80`)(D_O`6Q@3B`NFHCEB"!NK.8@<`@`(!!A`&1$2H!G%B`NK
XMFHCEB"!NK.8@<`@`(!!A``CP8!Q![P!"+HAP_L&O``0@+IJ(80#Z,$'7(`AAR
XM`/W<3^\!0DSM`P+_]$Y=3G5.50``2.?`@"`\____L&$`\"9/[__T2JZ9/F<(Z
XM(#P```$`8`)P&2Z`("\`$`@```=G`E.72JZ9/F8><B\@+P`,80!FK"]```1G3
XM#B]O``0`#'`\80`&GE.70J\`"&`6(&\`#!`02(!(P&$`'OS1KP`(4J\`#"`OP
XM``BPEVP((&\`#$H09MIA`!Z.("\`"+"79A(@;P`,2A!G"D'Z*D@@"&$`!B(@_
XM+P`0"```!V<&<"]A``9"3^\`#$SM`0#__$Y=3G5.50``2.?``"`\____M&$`P
XM[V9P`;"79A9(>@`Z2'@`!"(NB!X@+JSF80!FJ%"/<`*PEV862'H`?$AX``0B&
XM+H@>("ZLYF$`9HQ0CTSM``+__$Y=3G5.50``2.?`@"`\____O&$`[Q(@5R!0Z
XM(%!P+[`09A(@;P`$(%`@4'`OL!!G%G`!8"0@;P`$(%`@4'`OL!!F!'#_8!(@(
XM;P`$(%`B$"!7(%`@$&$`9$A,[0$`__Q.74YU3E4``$CGP,`@//___\!A`.ZT*
XM(&\`!"!0(E<B42`I`#ZPJ``^9`1P_V`:(&\`!"!0(E<B42`I`#ZPJ``^8P1P`
XM`6`"<`!,[0,`__A.74YU3E4``$CGP(`@//___Z1A`.YF3^__]"`O``RPKH@>(
XM;`8@+P`,8`0@+H@>+T``!"`O`!"PKH@>;`8@+P`08`0@+H@>+H`O;P`$``A@<
XM9B`O``CEB"!NK.8@<`@`+R@`!"`O``SEB"!NK.8@<`@`2&@`-2`O`!#EB"!N\
XMK.8@<`@`2&@`+"`O`!3EB"!NK.8@,`@`4(`B`"`O`!3EB"!NK.8@<`@`(!!A9
XM)$_O``QA``3@4J\`""`O``BPEVV2<`%/[P`,3.T!`/_\3EU.=4Y5``!(Y\"`)
XM(#S___^X80#MG%F/(&\`"'``,"@`""Z`2JZ9/F8``/P@%P@```=G!'!D8`)P`
XM+6$`!#`@%P@```9G!'!S8`)P+6$`!!X@%P@```5G!'!E8`)P+6$`!`P@%P@`*
XM``1G!'!W8`)P+6$``_H@%P@```-G!'!R8`)P+6$``^@@%P@```)G!'!E8`)P@
XM+6$``]8@%P@```%G!'!W8`)P+6$``\0@%P@```!G!'!R8`)P+6$``[)P(&$`R
XM`ZP@;P`(<``P*``*(@!!^B>/(`AA`&!2(B\`&$'Z)X8@"&$`8$0B+P`<0?HGS
XM?B`(80!@-B`7"```!V8.(&\`""(H`!1!^B=J8`1!^B=J(`AA`&`6<"!A``-4/
XM("\`"'(<T(%A``)V("\`(&$`]'`@;P`(<``P*``((@`@+P`$80#\.EB/3.T!7
XM`/_\3EU.=4Y5``!(Y_#`(#S___^P80#L4E&/0J\`!&`L("\`!'(.80!F/$'NY
XMB"(@,`@`L*\`"&800>Z((B`()``@+P`$8```SE*O``0@+P`$L*ZLZFW*<$"PH
XMKJSJ;@1"KJSJ("ZLZG(.80!E^D'NB"(AKP`("``@+P`(80`U%"Z`9U9"KP`$Z
XM8"8@+JSJ<@YA`&740>Z((B(O``30@2)7(E$B+P`$$;$8``@$4J\`!"!7(%`@V
XM+P`$<B"R,`@`;<H@+JSJ<@YA`&6>0>Z((B(O``30@4(P"`1@+"\O``A!^B997
XM(@A![H@B(`@D`"8!("ZLZG(.80!E<-2`6((@`B(#80!>Z%B/0>Z((B`()``@8
XM+JSJ4JZLZG(.80!E3-2`6((@`E"/3.T##O_L3EU.=4Y5``!(Y_#`(#S___^P)
XM80#K+%&/0J\`!&`L("\`!'(.80!E%D'NBZ(@,`@`L*\`"&800>Z+HB`()``@A
XM+P`$8```SE*O``0@+P`$L*ZL[FW*<$"PKJSN;@1"KJSN("ZL[G(.80!DU$'N\
XMBZ(AKP`("``@+P`(80`OI"Z`9U9"KP`$8"8@+JSN<@YA`&2N0>Z+HB(O``30:
XM@2)7(E$B+P`$$;$8``@$4J\`!"!7(%`@+P`$<B"R,`@`;<H@+JSN<@YA`&1X_
XM0>Z+HB(O``30@4(P"`1@+"\O``A!^B4V(@A![HNB(`@D`"8!("ZL[G(.80!DN
XM2M2`6((@`B(#80!=PEB/0>Z+HB`()``@+JSN4JZL[G(.80!D)M2`6((@`E"/J
XM3.T##O_L3EU.=4Y5``!(Y\"`(#S___^H80#J!EF/("\`!&$`7B0N@"!7+R@`A
XM!"!O``0O*``((&\`""\H`!0@;P`,("@`$.6(0>ZM%"\P"``@;P`0(B@`#$'Z?
XM),L@"&$`73A/[P`06(],[0$"__A.74YU3E4``$CG@(`@//___[AA`.F>68]*@
XMKID^9P9!^B2M8`1!^B2R(`AA`%S^80``F%B/3.T!`/_\3EU.=4Y5``!(Y\``K
XM(#S___^X80#I9$J79Q!(>@`8<@`@+P`$80!:YEB/3.T``O_\3EU.=4Y5``!(-
XMY\"`(#S___^\80#I-$'NJ#(B"!`O``-(@$C`80!<LDSM`0+_^$Y=3G5.50``R
XM2.?``"`\____N&$`Z08O+P`$(B\`!"`NFD)A`%AV6(]A`/]\3EU.=4Y5``!(\
XMYX``(#S___^\80#HVB`NFE)A`/]><`UAB$Y=3G5.50``2.?``"`\____M&$`K
XMZ+A*KII&9P``=DJNFDIG;DJNFDYG:"`O``13@"\`(B\`!"`NFD9A`%@06(]A>
XM`/\62J\`$&P@8`@@+II.80#_!B`O`!!2KP`02H!F[&`4("Z:2F$`_O`@+P`0.
XM4Z\`$$J`9NP@+IIZ4X`O`'(`("Z:1F$`5\98CV$`_LQ@``#$2JZ:6F<``+Q*_
XMKII>9P``M$JO`!!L5EF/+J\`%"`O``C0KP`4+P!R`"`NFD)A`%>,6(]@!"`NW
XMFEYA`/Z,(!=2ETJ`9O`O+P`$<@`@+II"80!7:EB/8`0@+II:80#^:B`O`!12.
XMKP`42H!F[&!468\NKP`4+R\`!'(`("Z:0F$`5SQ8CV`$("Z:7F$`_CP@%U.7K
XM2H!F\"`O``B0KP`4+P!R`"`NFD)A`%<46(]@!"`NFEIA`/X4("\`%%.O`!1*D
XM@&;L6(].74YU3E4``$CG@(`@//___[QA`.=D80`'["`780`55$'Z(KP@"&$`Q
XM%4I*KH`,9Q`@+H`,Y8@@?/__LKS1SF`*("Z9.N6(0>ZM`"!P"``@"&$`%2!*\
XM+IJ49@1A`/XR3.T!`/_\3EU.=4Y5``!(Y\"`(#S___^T80#G`"\70?HB8R((1
XM0>ZH3B`(80!::EB/2JZ`#&<*("\`!&$`-)Y@)"`NF3KEB$'NK0`O,`@`+R\`'
XM"$'Z(C8B"$'NJ$X@"&$`6C90CTSM`0#__$Y=3G5.50``2.?`@"`\___[L&$`]
XMYIQ/[_OX0>Z0-B](!`0B+P0(0>\`!"`(80!0N$'O!`0B"$'Z(?`@"&$`5)8N8
XM@$J79P8@5QU0D"I![P0$(@A!^B'7(`AA`%1Z+4"0+$'O!`0B"$'Z(<8@"&$`.
XM5&8M0)`P0>\$!"((0?HAM2`(80!44BU`FD)![P0$(@A!^B&D(`AA`%0^+4":6
XM1D'O!`0B"$'Z(9,@"&$`5"HM0)I*0>\$!"((0?HA@B`(80!4%BU`FDY![P0$O
XM(@A!^B%Q(`AA`%0"+4":4D'O!`0B"$'Z(6`@"&$`4^XM0)I60>\$!"((0?HAR
XM3R`(80!3VBU`FEI![P0$(@A!^B$^(`AA`%/&+4":7D'O!`0B"$'Z(2T@"&$`=
XM4[(M0)IJ0>\$!"((0?HA'"`(80!3GBU`FFY![P0$(@A!^B$+(`AA`%.*+4":U
XM8D'O!`0B"$'Z(/H@"&$`4W8M0)IF0>\$!"((0?H@Z2`(80!38BU`FG)![P0$M
XM(@A!^B#8(`AA`%-.+4":=D'Z(,T@"&$`4YXM0)IZ0?H@PB`(80!3D"U`FGY!V
XM^B"W(`AA`%&P'4":@B`NFGI7@"U`FI!![IE"(@AP`6$`8%Q(>`"`0>Z90B((:
XM0>Z9PB`(80!=;EB/<``=0)G)'4"9QG``'4"9S1U`F<Y!^@"^(`AA`&7:86!/X
XM[P0(3.T!`O_X3EU.=4Y5``!(YX``(#S___^\80#DD$JNK41F""`NFG)A`/L.S
XM<`$M0*U$3EU.=4Y5``!(YX``(#S___^\80#D9DJNK41G""`NFG9A`/KD0JZMA
XM1$Y=3G5.50``2.?`@"`\____O&$`Y#Y![IG"(@AP`6$`8$9ACDSM`0+_^$Y=5
XM3G5.50``2.?`@"`\____O&$`Y!1![IE"(@AP`6$`8!QACDSM`0+_^$Y=3G5.C
XM50``2.>``"`\____P&$`X^I@"'`!+4":FF`2(!<,@`````)G[@R``````V?FM
XM3EU.=4Y5``!(YX"`(#S___^\80#CN&$`!$!AC$'NJ#(@"&$`5T!,[0$`__Q./
XM74YU3E4``$CGP(`@//___[QA`..,(CP```$`0>ZM2"`(80`A!$SM`0+_^$Y=F
XM3G5.50``2.>`@"`\____M&$`XV!1CT'Z'PX@"&$`5W`N@&<$+5>L]&$`&61A:
XM``0,80`%($*NFI9*KIJ:9QA"KIJ:80`#ND'Z'N4@"&$`^;!A`!=^82YA``;<;
XM0>ZH,B`(80!6J&$`%JPO0``$("\`!&%`2JZ:EF?`4(],[0$`__Q.74YU3E4`.
XM`$CGP(`@//___[AA`.+>2'@``7(`0>ZH%B`(80!6)EB/3.T!`O_X3EU.=4Y5Q
XM``!(Y\"`(#S___^X80#BL%F/2JZ:FF<``AY@``,B("Z:B.6((&ZLYB`P"`!A)
XM`!3"2H!G,B`NFHCEB"!NK.8@<`@`(!!A`!/,2H!F``+R("Z:B.6((&ZLYB!PO
XM"``@$&$`^NI@``+:$"\`!TB`2,!A`!5\2H!F``&T80`(A&```L!P`&`"<`%A9
XM`!/:8``"LF$`$>1@``*J80`6YF```J)A`/`28``"FBUNFH2:B&```I!A``6"8
XM8``"B&$`!0I@``*`80`#W&```G@@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`NFH30[
XMKIJ04X`M0)J(8``"4F$`&$Y@``)*("Z:D&```+H@+IJ08```Q&$`\$Y@``(R"
XM80`8MF```BH@+IJ(Y8@@;JSF('`(`"`080`9<F```A(0+P`'2(!(P"(`80`5.
XM)+*`9@#_.$JNFIIF`/\P<$2P+P`'9@1P`6`"<`!A`.S<8``!X$*NK/Q@``'8V
XM<#8M0*S\8``!SG`!+4"9/F`$0JZ9/DHNFI1G``&Z<`$M0*T0<@%P`&$`^!9A@
XM`/=Z8``!I&$`!+9@``&<80`#^&```90@+IJ0;`)2@.*`80`$)F```8(@+IJ0?
XM;`)2@.*`80`$1&```7`0+P`'2(!(P"(`0>ZH%B`(80!42+*`9@#^D$JNFIIF>
XM`/Z(<`$M0)J68``!1&$``>Q@``$\80#I+&```31P5+`O``=F!'`!8`)P`&$`G
XMZ4I@``$>80#NUF``_CIA`!0R80#]SF```0H0+P`'2(!50`Q``'9B`/XBT$`P4
XM.P`&3OL``OZN_A;_7/X6_J;^%OX6_A;_3/]4_G#^%OX6_A;^%OX6_A;^%OX6'
XM_V[^%OX6_A;^%OX6_A;^%OX6_A;^%OW._A;^%OX6_C3^%OXP_A;^%OX6_A;^^
XM%O],_A;^IOX6_A;^%OX6_A;^%OX6_A;^%OX6_A;^%OX6_R+^/O\J_D[^%OX67
XM_A;^%O[>_A;^%OX6_E;^QOY@_FC^>/Z>_A;^%OX6_X#^MOZ^_[S_O/X6_A;^U
XM%OX6_X#^1OX6_A;^%OX6_A;^%OX6_A;^WOX6_A;^%O\0_U3^%OX6_QC^%O]<U
XM_J[_;O^`_ZS^%O^T_A;^%OX6_])8CTSM`0+_^$Y=3G5.50``2.?`@"`\____*
XMO&$`WV0@+IIZ4X`B`'``80#V0"`NFE)A`/7:0>ZH,B`(80!2W$SM`0+_^$Y=&
XM3G5.50``2.?`@"`\____O&$`WRA*+IJ49PAR`'``80#V!$'NJ#(@"&$`4JAA1
XM`/MP+4":C&$`XAY*@&8(("Z:C&$`]X1"KIJ(0JZ:A&$``(I*+IJ49P9P`2U`C
XMK1!,[0$"__A.74YU3E4``$CG@``@//___[QA`-[$80#AVB`NFH30KIJ0L*Z(>
XM'F\&("Z('F`(("Z:A-"NFI"PKIJ(;B`@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`N(
XMFH30KIJ04X!@!"`NFH@M0)J(2BZ:E&<(80IP`2U`K1!.74YU3E4``$CGP(`@W
XM//___[AA`-Y22BZ:E&<(<@!P`&$`]2XO+H@>(BZ:C$'Z&?T@"&$`4:I8CV$`3
XM]4),[0$"__A.74YU3E4``$CGP``@//___[QA`-X0("Z:5F$`])1"+IJ489YR$
XM`7``80#TY&$`]$AP`2U`K1`=?``!FI1,[0`"__Q.74YU3E4``$CGP``@//__Z
XM_[AA`-W.<@)P`&$`]+`@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`NFH30KIJ0(@`@K
XM+IJ$80#O*B`NFH30KIJ0L*Z('F]F68\@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`N2
XMFH30KIJ0D*Z:A%2`(@!P`&$`]%`@+IJ$T*Z:D+"NB!YO!B`NB!Y@""`NFH302
XMKIJ0D*Z:A"Z`8`QP?F$`\_AA`/1.4I<@%["NFI!M[%B/3.T``O_\3EU.=4Y5:
XM``!(YX``(#S___^\80#=$$JNFHAO!E.NFHA@!&$``T!.74YU3E4``$CG@``@L
XM//___\!A`-SJ0JZ:B$Y=3G5.50``2.>``"`\____P&$`W-`@%]&NFH@@+IJ(@
XML*Z('FT*("Z('E.`+4":B$Y=3G5.50``2.>``"`\____P&$`W*`@%Y&NFHA*I
XMKIJ(;`1"KIJ(3EU.=4Y5``!(YX``(#S____`80#<>B`NB!Y3@"U`FHA.74YUF
XM3E4``$CG@``@//___[QA`-Q:("Z('E.`L*Z:B&\&4JZ:B&`$80`"A$Y=3G5.C
XM50``2.?`@"`\____K&$`W"Y9CR!NK/1*$&8``E9*KJT09P8=?``!FI1*+IJ4R
XM9@``K&$`_)8@+IJ(Y8@@;JSF('`(`"\H``0@+IJ(Y8@@;JSF('`(`$AH`#4@/
XM+IJ(Y8@@;JSF('`(`$AH`"P@+IJ(Y8@@;JSF(#`(`%"`(@`@+IJ(Y8@@;JSF5
XM('`(`"`080#N`D_O``P@+IIZ4X`B`$JNF3YG!'`!8`0@+JS\80#R>D'NJ#(@U
XM"&$`3QYA``\B+H!R#;*`9@QA`/U680#_-&```:(@%V$`#^Y@``&82JZM$&=@.
XM("Z:B)"NFH1O#B`NFHB0KIJ$L*Z:D&T>("Z:D&P"4H#B@"(NFHB2@"U!FH1*<
XMKIJ$;`1"KIJ$80#]1B`NFHB0KIJ$5(`B`$JNF3YG!'`!8`0@+JS\80#Q\$*NG
XMK1!@``$R68\@+IJ(D*Z:A"Z`2I=O#"`NFI!3@)&7;`)"EW`!D*Z:D+"7;S0MX
XM;IJ(FH1R`G``80#QM"`NFH30KIJ0L*Z('F\&("Z('F`(("Z:A-"NFI`B`"`N%
XMFH1@``"T("Z:D%.`L)=L*B`NFHB0KIJ04H`M0)J$<@)P`&$`\6X@+IJ$T*Z:W
XMD+"NB!YOP"`NB!Y@PDJ79P``?B\7("Z:D%2`(@!P`F$`\9)8CR`7T:Z:A$J7%
XM;!!R`G``80#Q,"`NFH20EV"0("Z:D%2`D)<B`'``80#Q&"`NFH30KIJ0L*Z(.
XM'F\&("Z('F`(("Z:A-"NFI`B`"`NFH30KIJ0L*Z('F\&("Z('F`(("Z:A-"NX
XMFI"0EV$`ZW@@+IJ(D*Z:A%2`(@!*KID^9P1P`6`$("ZL_&$`\+I8CUB/3.T!O
XM`O_X3EU.=4Y5``!(YX``(#S___^\80#9L'`'80#P9DY=3G5.50``2.?`@"`\"
XM___^<&$`V91/[_[`80#Z&$'NJ#(@"&$`31IA`/5:+R\!0"\NFJ(@+IJ(Y8@@'
XM;JSF('`(`"\00?H5-"((0>\`#"`(80!,UD_O``Q!UR`(80!-DBU`@`QG"$'7V
XM(`AA`";\0>ZH%B`(80!,GDJO`41G"F$`^P@=?``!FI1A`/303^\!0$SM`0#_#
XM_$Y=3G5.50``2.?`@"`\____F&$`V/Y/[__J0J\`$DJO`!IG!B!O`!I@!$'Z6
XM%,TNB&``!G)@``7F2J\`$F]`0?H4NR`(80!,1%.O`!)@-$JO`!IG!B!O`!I@(
XM!$'Z%*,NB$JO`!)O&&`.0?H4ER`(80!,&E.O`!)*KP`2;NQ@!&$`_M)@``8@5
XM(%=*$&<>(%=2EQ`0(B\`$E*O`!(@;P`6$8`8`$B`2,!A``:L8``%^$*O``I"7
XMKP`.8```HB`O``[EB"!NK.8@<`@`("@`!`@```!G``"$<`$O0``*("\`#N6(T
XM(&ZLYB!P"``@$&$`33C0KP`24H`,@````0!L``3Z("\`#N6((&ZLYB!P"``O9
XM4``$8"(@;P`$$!`B+P`24J\`$B!O`!81@!@`2(!(P&$`!Q12KP`$(&\`!$H0+
XM9M9P("(O`!)2KP`2(&\`%A&`&`!(@$C`80`&[E*O``X@+P`.L*Z('FT`_U9*Q
XMKP`*9@`"IB`NFHCEB"!NK.8@<`@`(!!A`$RDT*\`$E*`#(````$`;``$9B`NQ
XMFHCEB"!NK.8@<`@`+U``!&`B(&\`!!`0(B\`$E*O`!(@;P`6$8`8`$B`2,!AT
XM``:`4J\`!"!O``1*$&;68``"0"]NFHP`!&`N#*\```$``!)L``00(&\`!!`0L
XM(B\`$E*O`!(@;P`6$8`8`$B`2,!A``8^4J\`!"!O``1*$&;*8``!_B]NFIX`/
XM!&`N#*\```$``!)L``/.(&\`!!`0(B\`$E*O`!(@;P`6$8`8`$B`2,!A``7\&
XM4J\`!"!O``1*$&;*8``!O!`O``E(@$C`80#M;$'NJ#(@"&$`2CYA``I"'T``W
XM"1`O``E(@$C`80`)P$J`9B`0+P`)2(!(P&$`"P@@+P`24J\`$B!O`!81O`!`-
XM"`!@"D'Z$ET@"&$`[/!@``/R$"\`"4B`2,!A`.T00>ZH,B`(80!)XF$`">8?X
XM0``)<"2P+P`)9@``>D_O__9A`%<@+P!!^A(A(@A![P`$(`AA`$F>6(]!^A(2A
XM(`AA`.R>0=<O2``.8#8,KP```0``'&T*<!M/[P`@8``#YB!O``X0$"(O`!Q2#
XMKP`<(&\`(!&`&`!(@$C`80`%"%*O``X@;P`.2A!FPF$`!*9/[P`*8``#4A`O6
XM``E(@$C`Y8A![I0V2K`(`&8B$"\`"4B`2,!A``HF("\`$E*O`!(@;P`6$;P`8
XM)`@`8``#'$'Z$80@"&$`[`P0+P`)2(!(P.6(0>Z4-B]P"```!&`N#*\```$`O
XM`!)L``)"(&\`!!`0(B\`$E*O`!(@;P`6$8`8`$B`2,!A``1P4J\`!"!O``1*`
XM$&;*8#`,KP```0``$FP``@H@5U*7$!`B+P`24J\`$B!O`!81@!@`2(!(P&$`+
XM!#@@5TH09M!A``/<8``"C!`O``E(@$C`80#KJD'NJ#(@"&$`2'QA``B`'T``=
XM"7!^L"\`"6<``'9P);`O``EG``!L<".P+P`)9V)P7+`O``EG6G`AL"\`"6=2W
XM<`NP+P`)9TIP%;`O``EG0G`8L"\`"6<Z<`BP+P`)9S)P?[`O``EG*A`O``FP4
XM+P`M9R!P&[`O``EG&'`-L"\`"6<0<$"P+P`)9PAP)+`O``EF"G`(80#K%&``<
XM`3YP,+`O``EN``"&<#>P+P`);0``?%&/0I="KP`$8"X@%^>($B\`$4B!2,'0)
XM@02`````,"Z`<`AA`.K6(!=A``)680`'L!]``!%2KP`$<`.PKP`$;Q!P,+`O-
XM`!%N"'`WL"\`$6RZ$"\`$4B`2,!A``AJ$"\``R(O`!I2KP`:(&\`'A&`&``?T
XM0``14(]@``%8<%ZP+P`)9@``A'`(80#J<G!>80#J;$'NJ#(@"&$`1SYA``="$
XM'T``"7`_L"\`"6XB<%^P+P`);1IP"&$`ZD00+P`)2(!(P`2`````0')_P(%@"
XM8'!@L"\`"6X><'ZP+P`);19P"&$`ZAH0+P`)2(!(P`2`````8&`Z("\`$E*O2
XM`!(@;P`6$;P`7@@`8!(@+P`24J\`$B!O`!81O`!<"``,KP```0``$FT&<!M@2
XM``$$$"\`"2(O`!)2KP`2(&\`%A&`&`!(@$C`80`!/F```(H0+P`)2(`,0``DK
XM9P#\C&(^#```&&<`^BYB'@P```MG`/I*8@H,```(9P#Y\F"B#```%6<`^?Y@W
XMF`Q``"-G`/MZ8HX,```A9P#]J&``_X0,0`!<9P#]JF(8#```0&<`^]YB`/]NZ
XM#```)6<`^BA@`/]B#$``?V<`^:9B`/]6#$``?F<`^WA@`/]*2JZ:FF8V0>ZHO
XM,B`(80!%^&$`!?P?0``)<ANR`&<$<`%@`G``2H!G%'`-L"\`"6<,$"\`";`OS
XM`"UF`/E6(&\`%B`O`!)",`@`2JZ:FF<$<!M@"!`O``E(@$C`3^\`%DSM`0#_1
XM_$Y=3G5.50``2.>`@"`\____N&$`T?99CT*78!0@;P`$4J\`!!`02(!(P&$`3
XM`0[1ER!O``1*$&;D80``KM&7(!=8CTSM`0#__$Y=3G5.50``2.>``"`\____1
XMN&$`T:Y9CQ`O``=(@$C`80``T"Z`80``>-&7(!=8CTY=3G5.50``2.>``"`\P
XM____O&$`T7Y*KJY*9A@@+IIB80#G_'`!+4"N2DHNFH)G!'`!8`)P`$Y=3G5.Y
XM50``2.>``"`\____O&$`T4A*KJY.9A@@+IIJ80#GQG`!+4"N3DHNFH)G!'`!O
XM8`)P`$Y=3G5.50``2.>``"`\____N&$`T1)9CT*72JZN2F<4("Z:9F$`YXQ"W
XMKJY*2BZ:@F<"4I=*KJY.9Q0@+IIN80#G<D*NKDY*+IJ"9P)2ER`76(].74YUI
XM3E4``$CGP``@//___[AA`-#`68]"EQ`O``=(@$C`<H#`@6<880#_4M&7$"\`V
XM!TB`2,!R?\"!8<C1EV`\<""P+P`';@AP?[`O``=F&&$`_O31EQ`O``=(@$C`&
XM<D#0@7)_P(%@#F$`_TC1EQ`O``=(@$C`80#G&%*7(!=8CTSM``+__$Y=3G5.B
XM50``2.?`@"`\___^M&$`T#I/[_[\80#POD'Z##`@"&$`0Z!"IT'NKE(B"$'O7
XM``@@"&$`]PA8CW(;L@!G``!^2B\`!&<``'9![P`$(@A![JY2(`AA`$4F<@!!I
XM[P`$(`AA``$\2H!F6$'O``0@"&%>2H!F3'(O0>\`!"`(80!&A"Z`9RP@5U*7A
XM0A!R`4'O``0@"&$``0I*@&<6(!=A,$J`9AY"KH`,<`(M0)DZ(!=@!D'O``0@)
XM"&$`Z!Y@!&$``*9/[P$$3.T!`O_X3EU.=4Y5``!(Y\"`(#S___^X80#/;%F/E
XM0I=@(B(O``0@%^6((&ZLYB!P"``@$&$D2H!G""U7FHAP`6`,4I<@%["NB!YM.
XMUG``6(],[0$"__A.74YU3E4``$CGP,`@//___\!A`,\<8`92EU*O``0@;P`$L
XM2A!G#"!O``0B5Q`1L!!GYB!O``1*$&8$<`%@`G``3.T#`/_X3EU.=4Y5``!(M
XMYX"`(#S___^\80#.UDJNFIIF&&$`[UA!^@K0(`AA`$(Z2BZ:E&8$80#ESDSM*
XM`0#__$Y=3G5.50``2.?`@"`\____O&$`SIQ*KP`$9Q!A`.\>(A=!^@JC(`AAH
XM`$'^0>ZH,B`(80!"%"`780!.ADJ`9@AA`.\V<`%@`G``3.T!`/_\3EU.=4Y5:
XM``!(Y\"`(#S___ZX80#.3$_O_P!A`.[080#IRD'NJ#(B"$JO`0!G!'`D8`)PH
XM)F$`0;I"IT'NKU(B"$'O``0@"&$`]0I8CW(;L@!F%&$`Z6QA`._H'7P``9J47
XM80#_&&`>0=<B"$'NKU(@"&$`0R`B+P$`0=<@"&$`]#YA`.D^3^\!`$SM`0+_[
XM^$Y=3G5.50``2.>`@"`\____P&$`S;X@5W``,"@`$`*`````@$SM`0#__$Y=N
XM3G5.50``2.?`@"`\____K&$`S91/[__P0?H)J2((("\`$&$`0,HN@&8,("\`9
XM$&$`Y@)@``"20J\`!&$`[?9"KP`,8`P@+P`(80#\C-&O``P@%V$`0+XO0``(&
XM<$BPKP`,;PX@5S`H``Q(P`@```1GU&$`_!)*+IJ4<`UA`./F(%<P*``,2,`(Q
XM```$9@YA``"X+T``!'(_LH!GH"`780!`I$JO``1G('`@L*\`!&<8<'&PKP`$D
XM9Q!P/["O``1G""`O``1A``%H3^\`$$SM`0+_^$Y=3G5.50``2.>`@"`\____O
XMO&$`S,)*+P`#9S`0+P`#2(!(P.6(0>Z4-DJP"`!G'!`O``.P+JSR9A9A`.TFI
XM0?H(M2`(80!`"&$``.IP`&`<'6\``ZSR$"\``TB`2,#EB$'NE#8M<`@`K/1P:
XM`4SM`0#__$Y=3G5.50``2.?`@"`\____NF$`S%!5CT'NF#:Q[JSX9`Q3KJSX_
XM(&ZL^&```'8@;JST2A!G``!T(&ZL]'`'L!!F/E*NK/0@;JST<`>P$&9<0>ZH2
XM%B`(80`_>!]```%R#;(`9P93KJST8`12KJST<`VP+P`!9@1AC&`\$"\``6`D-
XM(&ZL]'!<L!!F$"!NK/1P![`H``%F!%*NK/0@;JST4JZL]!`02(!(P&`,819!:
XM[J@6(`AA`#\<5(],[0$"__A.74YU3E4``$CG@(`@//___\!A`,N20BZL\D'Z&
XM![HM2*ST3.T!`/_\3EU.=4Y5``!(YX"`(#S____`80#+:D'NF#8@+JSXD(@,-
XM@````0!N#"!NK/A2KJSX$*\``TSM`0#__$Y=3G5.50``2.?`@"`\___^M&$`U
XMRS!/[_[\80#KM$'NJ#(@"&$`/K9!^@=+(`AA`#Z,80#^L"]``0!*KIJ:9E`@:
XM+P$`80#Y0$'Z!S,@"&$`/FQ(>`!=("\!!.6(0>Z4-B(P"`!![P`$(`AA`/'*;
XM6(]R&[(`9@9A`/OF8!1!^@<%(`AA`#XX0=<B""`O`0!A#D_O`01,[0$"__A.3
XM74YU3E4``$CGP(`@//___[QA`,J6$"\``TB`2,#EB$'NE#9*L`@`9Q80+P`#!
XM2(!(P.6(0>Z4-B`P"`!A`#ZL(&\`!$H09A00+P`#2(!(P.6(0>Z4-D*P"`!@2
XM8!`O``-(@$C`Y8A![I0V(@`@+P`$80`_2E*`80`^9B&`&``0+P`#2(!(P.6(&
XM0>Z4-DJP"`!F$&$`ZJ)!^@93(`AA`#V$8!HB+P`$$"\``TB`2,#EB$'NE#8@C
XM,`@`80`_(DSM`0#__$Y=3G5.50``2.?`@"`\____O&$`R=1!^@89(@AP(&$`W
XM_R)!^@86(@AP)6$`_Q9!^@8.(@AP<V$`_PI!^@8,(@AP8F$`_OY!^@8%(@APY
XM8V$`_O)!^@8"(@AP?F$`_N9,[0$"__A.74YU3E4``$CG@(`@//___[AA`,EPR
XM68]A`.GV0I=@1"`7Y8A![I0V2K`(`&<T0?H%QB`(80`\QB`780#WBD'Z!;X@G
XM"&$`/+8@%^6(0>Z4-B`P"`!A`/<H0?H%JB`(80`\G%*7#)<```$`;;1![J@6V
XM(`AA`#Q\80#J[!U\``&:E%B/3.T!`/_\3EU.=4Y5``!(Y\"`(#S___ZL80#()
XMZ$_O_OAA`.EL0?H%7R`(80#?8DAX`!M![K!2(@A![P`((`AA`.^T6(]R&[(`[
XM9@AA`/G08```@$'O``0B"$'NL%(@"&$`/=1!^@4Q(@A![P`$(`AA`#O:+H!FB
XM#$'O``0@"&$`X1!@3G`!+T`!!&`V("\!!.6(0>Z4-DJP"`!G(B`O`03EB$'N8
XME#8O,`@`+R\!"$'Z!.DB""`O``AA`#O&4(]2KP$$#*\```$``01MP"`780`[)
XMT$_O`0A,[0$"__A.74YU3E4``$CGP(`@//___V!A`,@43^__I$'Z!*DB""`O"
XM`%QA`#M*+T``6&8,("\`7&$`X(!@``$@80#H>&```-YP6[`O``%G"B(O`%Q!Q
XM^@1W8%(@+P!880`[.A]``%=![P`&+T@``B`O`%AA`#LF(&\``E*O``(0@"!OE
XM``)P7;`H__]G#"!O``)P_[`H__]FUB!O``)P7;`H__]G'"(O`%Q!^@0Z(`AA0
XM`#KV0>ZH,B`(80`[#&```(0@;P`"0BC__V$`Y_!!^@0M(`AA`#K2$"\`5TB`]
XM2,!A`/600?H$'R`(80`ZO$'O``8@"&$`]31!^@01(`AA`#JH0>ZH,B`(80`ZZ
XMOD'O``8B"!`O`%=(@$C`80#\;B`O`%AA`#IX("\`6&$`.G`?0``!(&\`6#`H:
XM``Q(P`@```1G`/\(0>ZH%B`(80`Z4"`O`%AA`#IX80#HN!U\``&:E$_O`%Q,W
XM[0$"__A.74YU3E4``$CGP(`@//___V1A`,:R3^__L"\O`%0O+P!40?H#@"((V
XM0>\`""`(80`Z%E"/0=<@"&$`.M1/[P!03.T!`/_\3EU.=4Y5``!(YX``(#S_]
XM___`80#&;"U\`````(`,<@!.0``<9`0]08`,2JZ`#&<$<`!@`G`!3EU.=0`_S
XM/P!4;V\@;6%N>2!D:7)E8W1O<GD@96YT<FEE<P!.;R!M871C:``M/P!O;FQYM
XM(&]N92!A<F=U;65N="!M87D@8F4@<W!E8VEF:65D+@!C86XG="!A8V-E<W,@L
XM9&ER96-T;W)Y('-P96-I9FEE9``O=&UP+V)R+F5N=BXE9`!(3TU%`%-(14Q,S
XM`%1%4DT`+@`N`$``0``N`$1E;&5T92``(%MN73\`665S+@!.;RX`1&5L971E7
XM9"``+@!M;W)E("]D9"]S>7,O8G)O=W-E+FAL<`!D=6UP("5S`%)E;F%M92``C
XM*')E;F%M92`E<R`E<RD`"#X`)3%U(``E+3AS(``E+3AS(``E-VQD(``@("`@P
XM+2TM(``E9``E9`!*86X`1F5B`$UA<@!!<'(`36%Y`$IU;@!*=6P`075G`%-EV
XM<`!/8W0`3F]V`$1E8P`E,F0@)3-S("4P,F0@)3)D.B4P,F0`($9I;&4@3F%MB
XM90!!='1R("`@3&YK(%5S97(@("`@($=R;W5P("`@("`@(%-I>F4@("`@("!-Y
XM;V1I9GD@5&EM92!&:6QE(&YA;64`.B``)7,@+2T@`"5S.B`E<PT`<&,`=7``&
XM8F,`8VT`8W,`<V8`<W(`8V4`8VP`86P`9&P`=7,`=64`<V\`<V4`=&D`=&4`/
XM;&D`8V\`>&X`0E)/5U-%`$EN=&5R<G5P=``E<SH@)60@9FEL97,`<V5T96YVO
XM($9)3$4@)7,[)7,@)7,`(0`((`@`(0`((`@`""`(`"5D``@@"``((`@`9V]T(
XM;R``0V]M;6%N9"!K:6QL960`8V0@)7,`<@!296-U<G-I=F4@;6%C<F\N``!D0
XM969I;F4@`"!A<R!;`%T`3F\@<F]O;0`D;6]R92`E#0`D)0T`)'-C<F5D("4-3
XM`#TN+@T`)&-O<'D@)2``/7X-`&1E9FEN92``(&%S(%L`70T`4V%V92!M86-RH
XM;W,@87,@`'<`6R5C)7-=#0!R`&EL;&5G86P@<WEN=&%X(&EN("<E<R<`:6QLC
XM96=A;"!S>6YT87@@:6X@)R5S)P!D969I;F4@`"!A<R!;`%T-`&-O<'D@)7,@4
XM)7,``$Y5``!(Y\BX)$`F02`\____D&$`PP)/[__80A)!^@#,(@A!UR`(80`XW
XM("`+9PHB"T'7(`AA`#@R0?H`O"((0=<@"&$``O@H0$J`9Q1(5"(\````R"`*)
XM80`V)EB/2H!F!'``8"QR#2`*80`Y0"@`9P0@1$(02%1R)T'O``0@"&$`-?Y8=
XMCTJ`9NP@#&$``\8@"D_O`"A,[1T0_^Q.74YU3E4``$CGP``@//___[QA`,)H"
XM<@`@%V$`_TI,[0`"__Q.74YU3E4``$CGP(`@//___[QA`,)$0?H`(B(((!=AD
XM`/\B3.T!`O_X3EU.=2]H,"]#3413+W!D`'(`("UX`$Y5``!(Y\"`(#S___[@C
XM80#""D_O_R@M?````-:`#$'Z`]P@"&$`-A`O0`#49P``FDAX`,A![P`$(@A!Q
XM^@/&(`AA`"/<6(]*@&8.0?H#PR((0=<@"&$`-O9!UR](`-!@6B]O`-``S'(L9
XM("\`T&$`.$`O0`#09Q`@;P#04J\`T$(08`12KP#,(&\`S`P0`"!G\G(@("\`R
XMS&$`.!8O0`#(9P8@;P#(0A`B+P#,("\`U&$`-N)*@&8$<`%@$$JO`-!G""!O=
XM`-!*$&:8<`!/[P#83.T!`O_X3EU.=4Y5``!(Y\^X)$`F02`\____J&$`P2Y*.
XMKK'29PIA`/\*2H!G``$X*$I@`E*,#!0`(&?X(@Q![IQN(`AA`#8X<B!![IQNP
XM(`AA`#>.*$!*@&<"0AQ!^@+P(@A![INF(`AA`#840>Z<;B((0>Z<;B`(80`"(
XM^B(`0>Z;IB`(80`V&"`,9QQ!^@+$(@A![INF(`AA`#8$(@Q![INF(`AA`#7X$
XM0>Z;IBU(L=I@"'@`8!1X`6`0$!-(@`Q``')G\@Q``'=GZ'`!L(1F"D'NJ#(@_
XM"&$`-`P@!&$`-#XL`"`$80`T5G(#0?H":"`(80`T%D'Z`F0B"$'Z`FL@"&$`$
XM`G(M0+'62'@``T*G0J<O+JNF2&ZQUB(NL=9!^D#"(`AA`#0X3^\`%"X`(`1AV
XM`#/L*@`@!&$`-`0@!F$`,]X@!F$`,_A*AV\6(`7EB$'NL5(AAP@`(@L@!6$`-
XM,SQ@""`%80`SV'``3.T=\/_@3EU.=4Y5``!(Y\^P)$`F02`\____I&$`O\99#
XMCTJNL=)G"F$`_:!*@&<``.(B"D'NFJ8@"&$`--I!UR((0>Z:IB`(80`GH'+_P
XMLH!F#&```+YX`&`4>`%@$!`32(`,0`!R9_(,0`!W9^AP`;"$9A(,;@`!J$!F1
XM"D'NJ#(@"&$`,O@@!&$`,RHL`"`$80`S0G(#0?H!;2`(80`S`DAX``-"IT*G_
XM+RZKIB\O`!`@;P`4(A`@;P`4(!!A``%.(@!!^C^T(`AA`#,J3^\`%"X`(!=A"
XM`#-.(`1A`#+8*@`@!&$`,O`@!F$`,LH@!F$`,N1*AV\6(`7EB$'NL5(AAP@`+
XM(@L@!6$`,BA@""`%80`RQ'``6(],[0WP_^1.74YU3E4``$CGSJ`D0"`\____,
XMN&$`OK)9CS!J``XJ""`%Y8A![K%22K`(`&8$</]@;"`*80`R*B`*80`R*&`V8
XM(`7EB$'NL5*XL`@`9SA\`&`>(`;EB$'NL5*XL`@`9@X@!N6(0>ZQ4D*P"`!@5
XM"%*&<""PAF[<0=<@"&$`/HXH`'+_LH!FNG#_L(1F!'#_+H`@!>6(0>ZQ4D*PH
XM"``@%UB/3.T%<O_H3EU.=5-(14Q,`'9A;&ED+G-H96QL<P!S:&5L;"QS:"QC:
XM<V@`97@@`"``+W!I<&4`4UE35$5-+E-(14Q,`'-H96QL`"]P:7!E``!.50``X
XM2.?`N"1`(#S___^X80"]QG(O("\`!&$`-'0H0$J`9P@@#%*`+T``!$AX`0!!1
XM[ITV(@@@+P`(80`?H%B/2H!G!$7NG39R+R`*80`T0BA`2H!G!%*,8`(H2B(\3
XM```!`"`,80`](B9`<O^R@&8.(@I![ITV(`AA`#*08!(B#$'NG38@"&$`,H(@B
XM"V$`/3!![ITV(`A,[1T`__!.74YU3E4``$CGP(`@//___U!A`+TH3^__G$JN(
XML>)F)"\NL>9(>@/D0>\`""((0?H#W"`(80`F9E"/+4"QXF8,</]@"B`NL>)AW
XM`#!.<`!/[P!D3.T!`O_X3EU.=4Y5``!(YX``(#S___^\80"\T$JNL>)G#"`N1
XML>)A`#!>0JZQXDY=3G5.50``2.>`("1`(#S____`80"\IF`"4HI*$F<&#!(`*
XM.F;T2A)G`D(:(`I,[00`__Q.74YU3E4``$CG@"`D0"`\____P&$`O')@`E**!
XM2A)G#`P2`"QG!@P2``UF[DH29PP,$@`-9P1"&F`"0A(@"DSM!`#__$Y=3G5.:
XM50``2.?`L"1`(#S___^T80"\+E&/(B\`#$'NH)P@"&$`,5!'[J"<)(L@"V$`.
XM_UHF0"5+``0@"V$`_TXF0"]+``0@"V$`_T(F0"`O``1A`#+,)4``"$*78!8@Q
XM%U*7Y8A![J`X(8L(`"`+80#_4"9`<!2PEV\$2A-FX"`7Y8A![J`X0K`(`$'N>
XMH#@E2``,8`)2BTH39P8,$P`-9O1"$R`*4(],[0T`__1.74YU3E4``$CGP(`@7
XM//___[AA`+N$2JZQXF8(80#^0DJ`;3XO+K'B(CP```(`0>Z>-B`(80`NREB/;
XM2H!G)`PN`".>-F?>#"X`*IXV9]9![IXV(@A![J",(`AA`/[\2H!F!'``8`9!6
XM[J",(`A,[0$"__A.74YU3E4``$CGP(`@//___[1A`+L268]"EV$`_=)*@&PX/
XM8&`,+@`CGC9G+@PN`"J>-F<F0>Z>-B((0>Z@C"`(80#^I$J`9Q(@+J"4L*\`B
XM!&8$<`%@`G``+H!*EV8:+RZQXB(\```"`$'NGC8@"&$`+AY8CTJ`9JQ*EV<([
XM0>Z@C"`(8`)P`%B/3.T!`O_X3EU.=4Y5``!(Y\"`(#S___^T80"ZA%F/0I=A]
XM`/U$2H!L/F!F#"X`(YXV9S0,+@`JGC9G+$'NGC8B"$'NH(P@"&$`_A9*@&<8`
XM(B\`!"`NH(QA``/\2H!F!'`!8`)P`"Z`2I=F&B\NL>(B/````@!![IXV(`AA1
XM`"V*6(]*@&:F2I=G"$'NH(P@"&`"<`!8CTSM`0+_^$Y=3G5.50``2.?`@"`\/
XM____M&$`N?!9CT*7+R\`!"(\```"`$'NGC8@"&$`+4!8CTJ`9Q1![J",(@A!I
XM[IXV(`AA`/V"+H!@`D*72I=G$`PN`".>-F?$#"X`*IXV9[P@%UB/3.T!`O_X3
XM3EU.=4Y5``!(Y\#`(#S___^T80"YB%&/80#\2DJ`;`1P_V`Z0I=@)F$`_=XO#
XM0``$9@AA`/R((!=@)"!O``0@%^6((F\`#".H``@(`%*7(!>PKP`(;=)A`/QD(
XM("\`"%"/3.T#`/_X3EU.=7(`4UE3+V=R;W5P`$Y5``!(Y\"`(#S___]080"YY
XM%D_O_YQ*KK'L9B0O+K'P2'H&M$'O``@B"$'Z!JP@"&$`(E10CRU`L>QF#'#_@
XM8`H@+K'L80`L/'``3^\`9$SM`0+_^$Y=3G5.50``2.>``"`\____O&$`N+Y*9
XMKK'L9PP@+K'L80`L3$*NL>Q.74YU3E4``$CG@"`D0"`\____P&$`N)1@`E**7
XM2A)G#`P2`"QG!@P2``UF[DH29P)"&B`*3.T$`/_\3EU.=4Y5``!(Y\"P)$`@\
XM//___[!A`+A:68\B+P`(0>ZDT"`(80`M?$?NI-`DBR`+89@F0"5+``0@"V&.B
XM)D`NBV`"4I<@5TH09P@@5PP0`"YF\"!72A!G!B!74I="$"`+80`NZB5```PFL
XM5R`+80#_7"9`(!=A`"[6)4``""Z+(`MA`/]()D`@%V$`+L(E0``00>ZQZB5(3
XM`!A![K'J)4@`'$'NL>HE2``4)4L`)"`+80#_&B9`)4L`("`+80#_#B9`)4L`4
XM*"`+80#_`B9`)4L`+"`+80#^]B9`2'@`44AX`&-![J;1(@@@*@`L80`$!%"/?
XM0>ZFT25(`!A(>`!12'@`9T'NIR(B""`J`"QA``/D4(]![J<B)4@`'"`*6(],`
XM[0T`__1.74YU3E4``$CGP(`@//___[AA`+<Z2JZQ[&8(80#^"DJ`;3XO+K'LK
XM(CP```(`0>ZBGB`(80`J@%B/2H!G)`PN`".BGF?>#"X`*J*>9]9![J*>(@A!;
XM[J2@(`AA`/Z&2H!F!'``8`9![J2@(`A,[0$"__A.74YU3E4``$CGP(`@//__Q
XM_[1A`+;(68]"EV$`_9I*@&PX8&`,+@`CHIYG+@PN`"JBGF<F0>ZBGB((0>ZD(
XMH"`(80#^+DJ`9Q(@+J2HL*\`!&8$<`%@`G``+H!*EV8:+RZQ["(\```"`$'N:
XMHIX@"&$`*=18CTJ`9JQ*EV<(0>ZDH"`(8`)P`%B/3.T!`O_X3EU.=4Y5``!(Y
XMY\@P)$`F02`\____O&$`MC9X_V`B$!M(@$C`80`K"B(`$!I(@$C`80`J_K*`M
XM9@1P`6`"<``H`$J$9PA*$F<$2A-FTDJ$9Q`0$DB`$A-(@9)`2,$@`6`"</],D
XM[0P0__1.74YU3E4``$CGP(`@//___[1A`+7268]"EV$`_*1*@&P^8&8,+@`C*
XMHIYG-`PN`"JBGF<L0>ZBGB((0>ZDH"`(80#].$J`9Q@B+P`$("ZDH&$`_TI*`
XM@&8$<`%@`G``+H!*EV8:+RZQ["(\```"`$'NHIX@"&$`*-A8CTJ`9J9*EV<(;
XM0>ZDH"`(8`)P`%B/3.T!`O_X3EU.=4Y5``!(Y\"`(#S___^T80"U/EF/0I<O8
XM+P`$(CP```(`0>ZBGB`(80`HCEB/2H!G%$'NI*`B"$'NHIX@"&$`_*0N@&`"R
XM0I=*EV<0#"X`(Z*>9\0,+@`JHIYGO"`76(],[0$"__A.74YU3E4``$CGP(`@Q
XM//___[AA`+3668\@+P`$80#]]"Z`9@1P_V`.(%<B$"`O``AA`"GJ<`!8CTSMB
XM`0#__$Y=3G5.50``2.?`@"`\____O&$`M)A9CT*78#H@;P`$$!!(@$C`0>ZR]
XM(Q`P"`!(@`@```-G``"T(!=R"F$`+FH@;P`$4J\`!!(02(%(P="!<C"0@2Z`#
XM(&\`!$H09PH@;P`$#!``+F:T(&\`!%*O``1*$&8((&\`"""78&IP$"(7X:D@P
XM;P`(((%"EV`X(&\`!!`02(!(P$'NLB,0,`@`2(`(```#9T0@%W(*80`M_"!OB
XM``12KP`$$A!(@4C!T(%R,)"!+H`@;P`$2A!G"B!O``0,$``N9K8@%R!O``B!5
XMD"!O``1*$&<$<`!@`G#_6(],[0$`__Q.74YU3E4``$CG@"`D0"`\____P&$`#
XMLZ)@`E**2A)G!@P2`'QF]$H29P)2BB`*3.T$`/_\3EU.=4Y5``!(Y\RP)$`H;
XM+P`D*B\`*"`\____N&$`LV99CW#_+H!3A2!O``A"$&!"#!(`+68&N"H``6<*2
XM(`IA`/^0)$!@+"9O``@,*@`]``)F!'`#8`)P`M7`8`(6VDH29PH,$@!\9P139
XMA6[P0A-"EV`(2A)G!$J79K8@%UB/3.T-,/_L3EU.=4Y5``!(YX"@)$`@//__:
XM_\!A`++J8`)2BDH29P8,$@`Z9O1*$F<"0AI*$F8$D<A@`B!*(`A,[04`__A.L
XM74YU3E4``$CG@*`D0"`\____O&$`LJP@"F<$2A)F!'``8$1P`"U`IX`M0*=\-
XM+4"G>"U`IW0M2J=T("ZG=&$`_X8M0*=X9QH@+J=X80#_>"U`IWQG#"`NIWQA<
XM`/]J+4"G@$'NIW0@"$SM!0#_^$Y=3G5R`%-94R]P87-S=V]R9```3E4``$CGW
XMP(`@//___[1A`+(P+Q=A`"8^+P!!^A+"(@A![JA.(`AA`"644(\@+H`,L*ZQR
XM]&\H(#P```#_P*Z`#"\`("Z`#."`+P!!^A*:(@A![JA.(`AA`"5D4(]@+$'N:
XMJ$XB""`N@`SEB"!\__^RO-'.(#`(`&$`)51![JA.(@A!^A)P(`AA`"5$("Z`,
XM#$SM`0+_^$Y=3G5.50``2.?`@"`\____M&$`L9@@%["NL?1O+"`\````_\"7]
XM+P`@+P`$X(`O`$'Z$BXB"$'NIX0@"&$`).Y0CT'NIX0@"&`2("Z`#.6(('S_@
XM_[*\T<X@,`@`3.T!`O_X3EU.=0`P,#`Z,#`Q(&%B;W)T960@=VET:"!A;B!EQ
XM<G)O<@`P,#`Z,#`R(&ME>6)O87)D('%U:70`,#`P.C`P,R!K97EB;V%R9"!I,
XM;G1E<G)U<'0`,#`P.C`P-"``,#`P.C`P-2``,#`P.C`P-B``,#`P.C`P-R``"
XM,#`P.C`P."``,#`P.C`P.2``,#`P.C`Q,"``,#`P.C`Q,2``,#`P.C`Q,B``Y
XM,#`P.C`Q,R``,#`P.C`Q-"``,#`P.C`Q-2``,#`P.C`Q-B``,#`P.C`Q-R```
XM,#`P.C`Q."``,#`P.C`Q.2``,#`P.C`R,"``,#`P.C`R,2``,#`P.C`R,B``^
XM,#`P.C`R,R``,#`P.C`R-"``,#`P.C`R-2``,#`P.C`R-B``,#`P.C`R-R``%
XM,#`P.C`R."``,#`P.C`R.2``,#`P.C`S,"``,#`P.C`S,2``,#`P.C`S,B``#
XM,#`P.C`S,R``,#`P.C`S-"``,#`P.C`S-2``,#`P.C`S-B``,#`P.C`S-R``*
XM,#`P.C`S."``,#`P.C`S.2``,#`P.C`T,"``,#`P.C`T,2``,#`P.C`T,B``(
XM,#`P.C`T,R``,#`P.C`T-"``,#`P.C`T-2``,#`P.C`T-B``,#`P.C`T-R``/
XM,#`P.C`T."``,#`P.C`T.2``,#`P.C`U,"``,#`P.C`U,2``,#`P.C`U,B``-
XM,#`P.C`U,R``,#`P.C`U-"``,#`P.C`U-2``,#`P.C`U-B``,#`P.C`U-R``4
XM,#`P.C`U."``,#`P.C`U.2``,#`P.C`V,"``,#`P.C`V,2``,#`P.C`V,B``2
XM,#`P.C`V,R``,#`P.C`V-"!I;&QE9V%L(&9U;F-T:6]N(&-O9&4@*&UA=&@I]
XM`#`P,#HP-C4@87-C:6DM/FYU;65R:6,@9F]R;6%T(&-O;G9E<G-I;VX@97)RD
XM;W(@*&UA=&@I`#`P,#HP-C8@;F]T(&$@;G5M8F5R("AM871H*0`P,#`Z,#8W_
XM(&EL;&5G86P@87)G=6UE;G0@*'5S=6%L;'D@;6%T:"D`,#`P.C`V."``,#`P?
XM.C`V.2``,#`P.C`W,"``,#`P.C`W,2``,#`P.C`W,B``,#`P.C`W,R``,#`P3
XM.C`W-"``,#`P.C`W-2``,#`P.C`W-B``,#`P.C`W-R``,#`P.C`W."``,#`PC
XM.C`W.2``,#`P.C`X,"``,#`P.C`X,2``,#`P.C`X,B``,#`P.C`X,R``,#`P8
XM.C`X-"``,#`P.C`X-2``,#`P.C`X-B``,#`P.C`X-R``,#`P.C`X."``,#`PH
XM.C`X.2``,#`P.C`Y,"``,#`P.C`Y,2``,#`P.C`Y,B``,#`P.C`Y,R``,#`P=
XM.C`Y-"``,#`P.C`Y-2``,#`P.C`Y-B``,#`P.C`Y-R``,#`P.C`Y."``,#`PM
XM.C`Y.2``,#`P.C$P,"``,#`P.C$P,2``,#`P.C$P,B!B=7,@=')A<``P,#`Z;
XM,3`S(&%D9')E<W,@=')A<``P,#`Z,3`T(&EL;&5G86P@:6YS=')U8W1I;VX`L
XM,#`P.C$P-2!D:79I9&4@8GD@>F5R;P`P,#`Z,3`V(")C:&LB(&EN<W1R=6-TG
XM:6]N('1R87``,#`P.C$P-R`B=')A<'8B(&EN<W1R=6-T:6]N('1R87``,#`P9
XM.C$P."!P<FEV:6QE9V5D(&EN<W1R=6-T:6]N`#`P,#HQ,#D@=')A8V4@97ACS
XM97!T:6]N`#`P,#HQ,3`@:6QL96=A;"!I;G-T<G5C=&EO;B`H,3`Q,"D`,#`P*
XM.C$Q,2!I;&QE9V%L(&EN<W1R=6-T:6]N("@Q,3$Q*0`P,#`Z,3$R(&5X8V5PQ
XM=&EO;B`Q,@`P,#`Z,3$S(&-O<')O8V5S<V]R('!R;W1O8V]L('9I;VQA=&EO'
XM;@`P,#`Z,3$T('-Y<W1E;2!S=&%C:R!F<F%M92!F;W)M870@97)R;W(`,#`PW
XM.C$Q-2!U;FEN:71I86QI>F5D(&EN=&5R<G5P=``P,#`Z,3$V(&5X8V5P=&EO:
XM;B`Q-@`P,#`Z,3$W(&5X8V5P=&EO;B`Q-P`P,#`Z,3$X(&5X8V5P=&EO;B`QS
XM.``P,#`Z,3$Y(&5X8V5P=&EO;B`Q.0`P,#`Z,3(P(&5X8V5P=&EO;B`R,``P4
XM,#`Z,3(Q(&5X8V5P=&EO;B`R,0`P,#`Z,3(R(&5X8V5P=&EO;B`R,@`P,#`Z\
XM,3(S(&5X8V5P=&EO;B`R,P`P,#`Z,3(T('-P=7)I;W5S(&EN=&5R<G5P=``P2
XM,#`Z,3(U(``P,#`Z,3(V(``P,#`Z,3(W(``P,#`Z,3(X(``P,#`Z,3(Y(``P4
XM,#`Z,3,P(``P,#`Z,3,Q(``P,#`Z,3,R(``P,#`Z,3,S(&%N('5N:6YI=&EA>
XM;&EZ960@=7-E<B!44D%0("@Q+3$U*2!W87,@97AE8W5T960`,#`P.C$S-"``G
XM,#`P.C$S-2``,#`P.C$S-B``,#`P.C$S-R``,#`P.C$S."``,#`P.C$S.2``9
XM,#`P.C$T,"``,#`P.C$T,2``,#`P.C$T,B``,#`P.C$T,R``,#`P.C$T-"``%
XM,#`P.C$T-2``,#`P.C$T-B``,#`P.C$T-R``,#`P.C$T."!F<&-P('5N;W)D'
XM97)E9"!C;VYD:71I;VX`,#`P.C$T.2!F<&-P(&EN97AA8W0@<F5S=6QT`#`PC
XM,#HQ-3`@9G!C<"!D:79I9&4@8GD@>F5R;P`P,#`Z,34Q(&9P8W`@=6YD97)F'
XM;&]W`#`P,#HQ-3(@9G!C<"!O<&5R86YD(&5R<F]R`#`P,#HQ-3,@9G!C<"!O+
XM=F5R9FQO=P`P,#`Z,34T(&9P8W`@;F]T(&$@;G5M8F5R`#`P,#HQ-34@97AC2
XM97!T:6]N(#4U`#`P,#HQ-38@<&UM=2!C;VYF:6=U<F%T:6]N`#`P,#HQ-3<@]
XM<&UM=2!I;&QE9V%L(&]P97)A=&EO;@`P,#`Z,34X('!M;74@86-C97-S(&QET
XM=F5L('9I;VQA=&EO;@`P,#`Z,34Y(&5X8V5P=&EO;B`U.0`P,#`Z,38P(&5X`
XM8V5P=&EO;B`V,``P,#`Z,38Q(&5X8V5P=&EO;B`V,0`P,#`Z,38R(&5X8V5PH
XM=&EO;B`V,@`P,#`Z,38S(&5X8V5P=&EO;B`V,P`P,#`Z,38T(&YO('!E<FUI]
XM<W-I;VX`,#`P.C$V-2!A<F=U;65N=',@=&\@1B1#:&M.86T@9&ED;B=T(&UA/
XM=&-H`#`P,#HQ-C8@<WES=&5M('-T86-K(&]V97)F;&]W`#`P,#HQ-C<@:6YV*
XM86QI9"!E=F5N="!)1"!N=6UB97(`,#`P.C$V."!E=F5N="!N;W0@9F]U;F0`*
XM,#`P.C$V.2!T:&4@979E;G0@:7,@8G5S>0`P,#`Z,3<P(&EM<&]S<VEB;&4@%
XM979E;G0@<&%R86UE=&5R<P`P,#`Z,3<Q('-Y<W1E;2!D871A('-T<G5C='5R$
XM97,@:&%V92!B965N(&1A;6%G960`,#`P.C$W,B!M;V1U;&4@<F5V:7-I;VX@R
XM:7,@:6YC;VUP871A8FQE('=I=&@@;W!E<F%T:6YG('-Y<W1E;0`P,#`Z,3<S:
XM('!A=&@@8F5C86UE(&QO<W0@8F5C875S92!N971W;W)K(&YO9&4@=V%S(&1OR
XM=VX`,#`P.C$W-"!B860@9&ES:R!P87)T:71I;VXL(&]R(&YO(&%C=&EV92!PM
XM87)T:71I;VX`,#`P.C$W-2``,#`P.C$W-B``,#`P.C$W-R``,#`P.C$W."``,
XM,#`P.C$W.2``,#`P.C$X,"``,#`P.C$X,2``,#`P.C$X,B``,#`P.C$X,R``=
XM,#`P.C$X-"``,#`P.C$X-2``,#`P.C$X-B``,#`P.C$X-R``,#`P.C$X."``M
XM,#`P.C$X.2``,#`P.C$Y,"``,#`P.C$Y,2``,#`P.C$Y,B``,#`P.C$Y,R``B
XM,#`P.C$Y-"``,#`P.C$Y-2``,#`P.C$Y-B``,#`P.C$Y-R``,#`P.C$Y."``R
XM,#`P.C$X.2``,#`P.C(P,"!T:&4@<&%T:"!T86)L92!I<R!F=6QL`#`P,#HR)
XM,#$@8F%D('!A=&@@;G5M8F5R`#`P,#HR,#(@<WES=&5M($E242!T86)L92!I^
XM<R!F=6QL`#`P,#HR,#,@8F%D($DO3R!M;V1E`#`P,#HR,#0@<WES=&5M(&1EF
XM=FEC92!T86)L92!I<R!F=6QL`#`P,#HR,#4@8F%D(&UO9'5L92!H96%D97(`U
XM,#`P.C(P-B!S>7-T96T@;6]D=6QE(&1I<F5C=&]R>2!I<R!F=6QL`#`P,#HR-
XM,#<@;65M;W)Y(&9U;&P`,#`P.C(P."!U;FMN;W=N('-E<G9I8V4@8V]D92``S
XM,#`P.C(P.2!N;VXM<VAA<F%B;&4@;6]D=6QE(&ES(&)U<WD`,#`P.C(Q,"!BC
XM860@<&%G92!A9&1R97-S`#`P,#HR,3$@96YD(&]F(&9I;&4`,#`P.C(Q,B!)Z
XM4E$@=F5C=&]R(&ES(&)U<WD`,#`P.C(Q,R!N;VXM97AI<W1I;F<@<V5G;65NW
XM=``P,#`Z,C$T(&9I;&4@;F]T(&%C8V5S<VEB;&4`,#`P.C(Q-2!B860@<&%T"
XM:&QI<W0`,#`P.C(Q-B!F:6QE(&YO="!F;W5N9``P,#`Z,C$W(&9I;&4@<V5GW
XM;65N="!L:7-T(&ES(&9U;&P`,#`P.C(Q."!C<F5A=&EN9R!A;B!E>&ES=&EN$
XM9R!F:6QE`#`P,#HR,3D@:6QL96=A;"!M96UO<GD@8FQO8VL@861D<F5S<P`PA
XM,#`Z,C(P(&UO9&5M(&1A=&$@8V%R<FEE<B!L;W-T`#`P,#HR,C$@;6]D=6QE)
XM(&YO="!F;W5N9``P,#`Z,C(R('-Y<W1E;2!C;&]C:R!N;W0@<G5N;FEN9P`P`
XM,#`Z,C(S(&1E;&5T:6YG('-T86-K(&UE;6]R>0`P,#`Z,C(T(&EL;&5G86P@(
XM<')O8V5S<R!)1``P,#`Z,C(U(&)A9"!)4E$@<&%R86UE=&5R`#`P,#HR,C8@'
XM;F\@8VAI;&1R96X`,#`P.C(R-R!I;G9A;&ED('1R87`@;G5M8F5R`#`P,#HRN
XM,C@@<')O8V5S<R!H87,@86)O<G1E9``P,#`Z,C(Y('-Y<W1E;2!P<F]C97-SQ
XM('1A8FQE(&ES(&9U;&P`,#`P.C(S,"!I;&QE9V%L(&9O<FL@<&%R86UE=&5R#
XM`#`P,#HR,S$@:VYO=VX@;6]D=6QE`#`P,#HR,S(@8F%D(&UO9'5L92!#4D,`9
XM,#`P.C(S,R!U;G!R;V-E<W-E9"!S:6=N86P@<&5N9&EN9P`P,#`Z,C,T(&YOP
XM;B!E>&5C=71A8FQE(&UO9'5L90`P,#`Z,C,U(&)A9"!N86UE`#`P,#HR,S8@'
XM8F%D(&UO9'5L92!H96%D97(@<&%R:71Y`#`P,#HR,S<@;F\@4D%-(&%V86EL?
XM86)L90`P,#`Z,C,X(&1I<F5C=&]R>2!I<R!N;W0@96UP='D`,#`P.C(S.2!NB
XM;R!A=F%I;&%B;&4@=&%S:R!N=6UB97(`,#`P.C(T,"!I;&QE9V%L('5N:70@&
XM*&1R:79E*2!N=6UB97(`,#`P.C(T,2!B860@<V5C=&]R(&YU;6)E<@`P,#`Z?
XM,C0R(&UE9&EA(&ES('=R:71E('!R;W1E8W1E9``P,#`Z,C0S($DO3R!E<G)O+
XM<B`M(&)A9"!C:&5C:R!S=6T`,#`P.C(T-"!R96%D(&5R<F]R`#`P,#HR-#4@(
XM=W)I=&4@97)R;W(`,#`P.C(T-B!D979I8V4@;F]T(')E861Y`#`P,#HR-#<@8
XM<V5E:R!E<G)O<@`P,#`Z,C0X(&UE9&EA(&9U;&P`,#`P.C(T.2!I;F-O;7!A]
XM=&%B;&4@;65D:6$`,#`P.C(U,"!D979I8V4@8G5S>0`P,#`Z,C4Q(&1I<VL@)
XM;65D:6$@:&%S(&-H86YG960`,#`P.C(U,B!R96-O<F0@:7,@8G5S>0`P,#`ZQ
XM,C4S(&YO;BUS:&%R86)L92!F:6QE+V1E=FEC92!I<R!B=7-Y`#`P,#HR-30@W
XM22]/(&1E861L;V-K(&5R<F]R`#`P,#HR-34@9&5V:6-E(&ES(&9O<FUA="!P3
XM<F]T96-T960`)7,Z("5S#0`E,#-D+B4P,V0@#0`-`"4P,V0N)3`S9"`-`$Y5'
XM``!(Y\"@(#S___^\80"?,"(\```$`$'Z!O0@"&$`'M`D0'+_LH!F!'``8`8@)
XM*@`PT(I,[04"__1.74YU3E4``$CGP(`@//___[QA`)[R(CP```0`0?H&OB`(V
XM80`>WDSM`0+_^$Y=3G5.50``2.?,,"1`*`$@//___[QA`)["80#_?B9`2H!GD
XM2G`!L*L`"&<$8:I@/GH`8"HB"B`%ZX@@,PA880`4$DJ`9A8@!>N(N+,(8&8,7
XM<%C0BR(%ZXG0@6`44H6ZDVW280#_="U\````V(`,<`!,[0PP__!.74YU3E4`L
XM`$CGS"`@//___[QA`)Y080#_#"1`2H!F!'``8#IX`&`D(A<@!.N((#((6&$`L
XM$ZA*@&80(`3KB"HR"&!A`/\>(`5@%%*$N))MV&$`_Q`M?````-B`#'#_3.T$[
XM,O_P3EU.=4Y5``!(Y\@X)$`F02@O`"`@//___[AA`)WD<@$@"F$`_P8H0$J`+
XM9@1P`&`@(`13@"\`(BP`!"`+80`3FEB/(`13@$(S"`!A`/ZR(`M,[1P0__!.$
XM74YU3E4``$CGP+`D0"`\____O&$`G91R`B`*80#^MB9`2H!F!'#_8`IA`/Y\N
XM(&L`!"`03.T-`O_P3EU.=4Y5``!(Y\"X)$`@//__][!A`)U:3^_W^`P2`"]F+
XM`E**<@0@"F$`_G`H0$J`9P``ED'Z!1@@"&$`'`HO0`@$<O^R@&8(80#^)&``R
XM`'I"IW(`("\("&$`'))8CTJ`9NXF;``$+U,(`'`!L*\(`&8V2JL`#&<L2%<BQ
XM/```"``@*P`,80`;$%B/<O^R@&<4("\"P+"K`!AF"B`O`KRPJP`49P1"KP@``
XM<@`@+P@$80`;S"`O"`1A`!N<80#]LDJO"`!F!'``8`)P_T_O"`A,[1T"_^Q.C
XM74YU3E4``$CGR+@D0"`\___WM&$`G(9/[_?\#!(`+V8"4HIR!"`*80#]G"A`B
XM2H!G7D'Z!$X@"&$`&S@O0`@`<O^R@&=&0J=R`"`O"`1A`!O(6(]*@&;N)FP`0
XM!'`!L)-F``">2JL`#&<``)9X`&!<(`12A'(4LH!L''(`("\(`&$`&R8@+P@`J
XM80`:]F$`_0QP_V```-!P_["K`!!G#"(K`!`@*P`,80`<)G(`("\(`&$`&O9P(
XM!6$`&2Y"IW(`("\(!&$`&U18CTJ`9NYP`;"39BY(5R(\```(`"`K``QA`!GBX
XM6(]R_[*`9Q8@+P+`L*L`&&8,("\"O+"K`!1G`/]R)KP````!<`!A``_")T``]
XM"&$`''HG0``,)V\("``02%<B/```"``@*P`,80`9EEB/<O^R@&<.)V\"P``8#
XM)V\"O``48`A"JP`80JL`%'(`("\(`&$`&E0@+P@`80`:)&$`_#IP`$_O"`1,!
XM[1T0_^Q.74YU3E4``$CGP+@D0"`\___WM&$`FQA/[_?\#!(`+V8"4HIR!"`*<
XM80#\+BA`2H!G&$'Z`N@@"&$`&<HO0`@`<O^R@&8(80#[Y'#_8&Q"IW(`("\("
XM!&$`&E)8CTJ`9NXF;``$<`&PDV8X80`;LK"K``QF+DA7(CP```@`("L`#&$`D
XM&-)8CW+_LH!G%B`O`L"PJP`89@P@+P*\L*L`%&8"0I-R`"`O"`!A`!F0("\(*
XM`&$`&6!A`/MV<`!/[P@$3.T=`O_L3EU.=4Y5``!(Y\"X)$`@//__][!A`)I45
XM3^_W^`P2`"]F`E**<@0@"F$`^VHH0$J`9QA!^@(L(`AA`!D&+T`(`'+_LH!FF
XM"F$`^R!P_V```'Y"IW(`("\(!&$`&8Q8CTJ`9NXF;``$</\O0`@$<`&PDV9`N
XM80`:YK"K``QF-DA7(CP```@`("L`#&$`&`98CW+_LH!G'B`O`L"PJP`89A0@L
XM+P*\L*L`%&8*0J\(!"=O"`P`$'(`("\(`&$`&+P@+P@`80`8C&$`^J(@+P@$U
XM3^\("$SM'0#_\$Y=3G5.50``2.?(N"1`*`$@//__][!A`)E\3^_W^`P2`"]FW
XM`E**<@0@"F$`^I(H0$J`9QA!^@%<(`AA`!@N+T`(`'+_LH!F"F$`^DAP_V``_
XM`(9"IW(`("\(!&$`&+18CTJ`9NXF;``$</\O0`@$<`&PDV9(2%<B/```"``@U
XM*P`,80`7.%B/<O^R@&<P("\"P+"K`!AF)B`O`KRPJP`49AQP_["K`!!G%$*O<
XM"`0@*P`0T(0B`"`K``QA`!D,<@`@+P@`80`7W"`O"`!A`!>L80#YPB`O"`1/8
XM[P@(3.T=$/_L3EU.=4Y5``!(Y\`@)$`@//___[QA`)B><@`@"F$`_P9,[00"!
XM__A.74YU3E4``$CGP"`D0"`\____O&$`F'AR`2`*80#^X$SM!`+_^$Y=3G5#$
XM;W!Y<FEG:'1S("AC*2`Q.3@X(&)Y(')E8V-O=V%R92!S>7-T96US('!U8VAH]
XM96EM`%-Y<TEN9F\`4WES26YF;P!3>7-);F9O`%-Y<TEN9F\`4WES26YF;P!3%
XM>7-);F9O`%-Y<TEN9F\`3E4``$CGS+`D0"`\____N&$`E^A9CW@`<"@N@"`7#
XMY8AA``P,(&\`"""`9R0@%U.`L(1N)'`HT9<@%^6((@`@;P`((!!A``OP(&\`P
XM"""`9@AP_V```)12B@P2`"!G^`P2``EG\@P2``UG``!N2A)G``!H(`12A.6($
XM(&\`""!0)DHAB@@`>@!@0$H%9BH,$@`@9P8,$@`)9AY2BF`VNA)F!GH`4HI@9
XM(DH%9P06VF`:&AI@%A;:8!(0$DB`#$``(F?<#$``)V?68.I*$F<&#!(`#6:VW
XM0AM@`/]6(`3EB"!O``@@4$*P"``@!%B/3.T-,/_L3EU.=4Y5``!(Y\"P(#S_;
XM__^\80"6]B(\```,`$'Z`,H@"&$`%I8D0'+_LH!G(C`J`$!(P-"*)D!*@&<.\
XM(@M![J>L(`AA``OV8`H@"F$`%J)P`&`,(`IA`!:80>ZGK"`(3.T-`O_P3EU.5
XM=4Y5``!(Y\RX)$`F02AO`"@@//___[QA`):(2J\`+&8D0?H`82(((`MA``NH=
XM(@H@"V$`"\`B#"`+80`)KB@`9P0@!&`P80#_5"H`9R8B!2`+80`+@$'Z`#(BS
XM""`+80`+E"(*(`MA``N,(@P@"V$`"7I@`G``3.T=,/_H3EU.=6EN:70`+V1D7
XM+P`O`$Y5``!(Y\B`(#S___^\80"6!G(!0?H%$"`(80`)NC@`;A!R`4'Z!1`@R
XM"&$`":HX`&\$,`1@#'(!0?H%#"`(80`)EDSM`1+_]$Y=3G5.50``2.?.L"`\G
XM___[N&$`E;I/[_P`2FZGSF8``'PM;P0`I])!^@3D(`AA``FZ)$!*@&=(2A)G2
XM1'`OL!)G,D'Z!-(@"&$`":`F0$J`9PXB"R`O!`1A``KL2H!F#B(*("\$`&$`?
XM"IA@``&`80#_2&`(<@$@"F$`"10]0*?.2FZGSF8(80#_,#U`I\Y*;J?.;`@P.
XM+J?.8```^D*G<@`P;J?.(`AA``D*6(]P`#P`,$`J""1O!``P!DC`L(5F'DAX*
XM!`!![P`$(@@P;J?.(`AA``C06(\J`&\``19\`#`&4D9(P$'7$#`(`!@`<@VRH
XM`&82M>\$`&,R<%RP*O__9BI3BF"T("\$``:````$`+7`911(>`!00?H$`R((A
XM<`)A``B.6(]@!!3$8(Y"$B(O!`0@+P0`80``VDJ`9P#_>$INI]!F``"H)&\$Q
XM`$H29P9P.K`:9O9*$F<``(IP=+`:9NIP8[`:9N1P/;`:9MXF2E*+2A-G!G`Z'
XML!-F]$(34FZGT"(*0=<@"&$`_GQ*@&8*<``]0*?02,!@:E-NI]!'UTH39P9PP
XM.K`;9O8@"I"O!``B`"`+80`)+-*`#($```0#;11(>`!00?H#;B((<`)A``?@X
XM6(]@+"(+5XH@"F$`"21@`/]J,&ZGSB`(80`'U'`!8!)*;J?09@HP;J?.(`AA7
XM``?`<`!/[P0`3.T-</_H3EU.=4Y5``!(Y\"X)$$@//___\!A`).L(%=P([`0V
XM9T8F5V`X*$I*$V<$MPQG^%.+2B1F%G!\L!-G"G`ZL!-G!$H39@9P`6`@4HM*_
XM$V<,<#JP$V<&<'RP$V;N4HM*$V<&<#JP$V:^<`!,[1T`__!.74YU3E4``$CG0
XM@#`D0"`\____P&$`DSXF;J?22A-G!G`ZL!MF]DH39R80&[`29NQ*$V?H$!NPW
XM*@`!9N!*$V<&<#JP$V8$<`%@"'!`L!-FS'``3.T,`/_X3EU.=4Y5``!(Y\RPX
XM)$`@//___\!A`)+F(&\`!"908```UG@;8```SG@*8```R'@-8```PG@)8```(
XMO'@(8```MG@,8```L'`PL$1N``"H<#>P1&T``*!P,)A`>@+G3!`:2(!(P`2`=
XM````,(A`4T5*16<``()P,+`2;@``>G`WL!)LVF```'`0&DB`.``,0`!F9ZYBD
XM)`P``%YG6F(2#```7&=28J(,``!%9P#_>&"8#```8F<`_X9@C@Q``')G`/]PK
XM8@P,``!N9P#_8&``_WH,0`!T9P#_8&``_VX0&DB`2,!R'\"!.`!@#`Q$`%QG=
XMF`Q$`%YGYA;$$!I(@#@`2D!G!G`ZL$1FXD(;(&\`!"10(&\`!""+(`I,[0TPV
XM_^Q.74YU3E4``$CGP#`D0"`\____O&$`D<HF;J?22A-G!G`ZL!MF]DH39Q@0D
XM&[`29NQ*$V?H$!NP*@`!9N!P0+`39@1P`&`2<#VP$V;0(B\`!%*+(`MA`/Z2:
XM3.T,`/_X3EU.=4Y5``!(Y\PP)$`@//___\!A`)%L)FZGTDH39P9P.K`;9O9*%
XM$V<8$!NP$F;L2A-GZ!`;L"H``6;@<$"P$V8$</]@0G`CL!-FT'H*4HMP,+`3'
XM9@)Z"'@`8!PP!4C`,@1(P6$`"Q@X`!`;2(!(P`2`````,-A`<#"P$VX&<#FP-
XM$VS8,`1(P$SM##+_[$Y=3G4O9&0O<WES+W1E<FUC87``+V@P+W-Y<R]T97)M_
XM8V%P`"]D,"]S>7,O=&5R;6-A<`!415)-0T%0`%1%4DT`5&5R;6-A<"!E;G1R)
XM>2!T;V\@;&]N9R$-`%1E<FUC87`@96YT<GD@=&]O(&QO;F<A#0``3E4``$CG)
XM[[`@//___[QA`)!P1^ZGUBHO`#!\`'X`(!<D0$J`9@`!>$'Z`>!@``'0<"6P@
XM1&8``69@``#T<`JPA6XP<&2PA6X8(`5R9&$`"F9R,("!%L!R9"`%80`*@BH`8
XM3^W_V"`%<@IA``I*<C"`@1;`3^W_V"`%<@IA``IB<C"`@1;`3^W_V$J&9@1P9
XM`6`"<``L`$J&9P8@+P`$8`0@+P`P*@!@``#X$!I(@$C`VH!*A6<&<`VPA68(D
XM4H4@!E*`CH`6Q6"^$!I(@$C`NH!O#!`:2(!(P-J`8```Q%**8```OE*O``12.
XMKP`P4H5@``"P%H1@``"J(`5R"F$`";CIB"0`(`5R"F$`"=;4@"H"8```CB`%V
XM<A!A``G&XX@B!9*`*@%@``!Z0?H`YV```-(0&DB`.``,0``^9XQB,`P``"YG)
XM`/]N8A(,```K9P#_7&+6#```)6>:8,X,```S9P#^ZF+$#$``,F<`_OA@N@Q`G
XM`&1G`/[*8A(,``!$9Y9BJ`P``$)G`/]R8)X,0`!R9P#^]F*4#```:6<`_TI@6
XMBA;$$!I(@#@`9@#^BDJ'9TP@!P@```!G%"(ND"P@"V$``_8@+I`L80`#SM?`.
XM(`<(```!9RA*KI`P9QX@;I`P2A!G%B(ND#`@"V$``\P@+I`P80`#I-?`8`06S
XM_``(0A-![J?6(`A,[0WT_^!.74YU3T]04P!/3U!3`$Y5``!(Y^ZP)$`H`29O(
XM`"P@//___[QA`(Y4>@`@"F<``.AP,+`2;BYP.;`2;2AZ`#`%2,!R"F$`"#`23
XM&DB!2,'0@02`````,#H`<#"P$FX&<#FP$FS:<`HR!4C!80`("CH`<"ZP$F8<[
XM4HIP,+`2;A1P.;`2;0X0&DB`2,`$@````##:0'`JL!)F&C`$2,`R!4C!80`'N
XMU#H`4HI@"!`:2(!(P$Z32A)F]$I%9UQ*;I`T;59P$;!ND#1M3C`ND#1(P..(G
XM0>ZQ_#`P"`!(P&P"4H#B@-I`,"Z0-$C`XXA![K'\,#`(`$C`,@5(P20`(`$B0
XM`F$`!ZX\`&`,$"Z0*DB`2,!.DU-&2D9N\$SM#73_Y$Y=3G5.50``2.>`.'``U
XM*$`F0"1`<`UR`$'Z`&1'[H`,=@@F@R8NJZ8D+JNB*&ZR'DY``"%E/DJ39QA!!
XM^@!&<F1P`DY``(Q!^@`V<MT`/``!8"(]?`!!J")";J@D/7P``J@^/7P``:A`D
XM/7P``JA:/7P``JA<3.T<`/_T3EU.=6-I;P`J*BHJ(&-I;R!T<F%P:&%N9&QES
XM<B!M:7-M871C:"`J*BHJ#0!.30``3DT``4Y-``).30`#3DT`!$Y-``5.30`&/
XM3DT`!TY-``A.30`)3DT`"DY-``M.30`,3DT`#4Y-``Y.30`/3DT`$$Y-`!%.[
XM30`23DT`$TY-`!1.30`53DT`%DY-`!=.30`83DT`&4Y-`!I.30`;3DT`'$Y-S
XM`!U.30`>3DT`'TY-`"!.30`A3DT`(DY-`"-.30`D3DT`)4Y-`"9.30`G3DT`?
XM*$Y-`"E.30`J3DT`*TY-`"Q.30`M3DT`+DY-`"].30`P3DT`,4Y-`#).30`S+
XM3DT`-$Y-`#5.30`V3DT`-TY-`#A.30`Y3DT`.DY-`#M.30`\3DT`/4Y-`#Y.J
XM30`_3E4``$CGP(!/[__H0?H`5"Z(+V\`&``$0J\`"$*G0J="IR\NJZ9(;P`0K
XM(B\`%$'Z#"P@"&$`_Y)/[P`4+T``%$'O``P@"&$`"[*PKP`49O`@+P`,3^\`K
XM&$SM`0+_^$Y=3G5S:&5L;`!.50``2.>`@"`70>ZR(Q`P"`!(@$C`"````F<*Q
XM(!<"@````-]@`B`73.T!`/_\3EU.=4Y5``!(YX"`(!=![K(C$#`(`$B`2,`(!
XM```!9P@@%PC```5@`B`73.T!`/_\3EU.=4Y5``!(YX`P)$`F2DH;9OP@"Y"*2
XM4X!,[0P`__A.74YU3E4``$CGP#@D0"9!*$H0&QC`9OH@"DSM'`#_]$Y=3G5.5
XM50``2.?`."1`)D$H2DH<9OQ3C!`;&,!F^B`*3.T<`/_T3EU.=4Y5``!(Y\`PE
XM)$`F06`*2AMF!'``8!A2BA`2L!-G\!`32(!(P!(22(%(P9*`(`%,[0P`__A.J
XM74YU3E4``$CGP#@D0"9!*$H0&QC`;OIP?\$L__]"%"`*3.T<`/_T3EU.=4Y5%
XM``!(Y\@X)$`F02@O`"`H2B`$4X1*@&\,$!L8P$H`9O!@`D(<(`13A$J`;O8@/
XM"DSM'!#_\$Y=3G5.50``2.?(,"1`)D$H+P`<8`9*&V<44HH@!%.$2H!O!A`22
XML!-G[$J$;`1P`&`0$!-(@$C`$A)(@4C!DH`@`4SM#!#_]$Y=3G5.50``2.?(@
XM."1`)D$H+P`@*$I*'&;\4XP@!%.$2H!O"!`;&,!*`&;P2H1L`D(4(`I,[1P03
XM__!.74YU3E4``$CGR"`D0"@!N!)F!"`*8`9*&F;T<`!,[000__A.74YU3E4`K
XM`$CGR#`D0"@!E\NX$F8")DI*&F;V(`M,[0P0__1.74YU3E4``$CGSJ`D0'H`W
XM$!H<`'(@L@!G]G`)L`9G\'`ML`9F!'`!8`)P`"@`<"VP!F<@<"NP!F8<8!@@:
XM!7(*80`"XA(&2(%(P="!!(`````P*@`<&A`&2(!(P$'NLB,0,`@`2(!(P`@`?
XM``-FSDJ$9P8@!42`8`(@!4SM!7+_Z$Y=3G5.50``2.?`,"1`)F\`'"UO`!BK=
XMEBU+JYH@+P`$4X`B+JN680`"?-"*(@`@"F$*3.T,`/_X3EU.=4Y5``!(Y^"X.
XM)$`F05&/8```O"A*+TL`!"`NJY;CB"(+DHHD`"`!(@)A``)V(BZKEF$``C;0V
XMBBZ`8`8@+JN6V<`B%R`,(&ZKFDZ02H!M[&`(("ZKEI&O``0B+P`$(!<@;JN:9
XM3I!*@&WHN>\`!&(PN>\`!&0<(B\`!"`,86*YUV8&+J\`!&`*(!>PKP`$9@(NB
XMC"`NJY;9P"`NJY:1KP`$N>\`!&.<(`N0C"(O``22BK"!;`XB"R`,80#_2"9OK
XM``1@#"(O``0@"F$`_S@D3+7+90#_0E"/3.T=!/_L3EU.=4Y5``!(Y\PP)$`F'
XM02@NJY9@!AH2%-,6Q2`$4X1*@&;R3.T,,/_P3EU.=4Y5``!(Y^#@($`D020M#
XM``AG`F$*3.T'!__H8```VDJ"9TJQRF)(9T0P"@@```!G!!#:4X(P"`@```!FC
XM).**9`9A!!#:3G7BBF0&,-I@`B#:4<K__%)"4X)D]'0`3G40VE'*__Q20E."_
XM9/1T`$YUU<+1PC`*"````&<$$2)3@C`("````&8DXHID!F$$$2).=>**9`8QP
XM(F`"(2)1RO_\4D)3@F3T=`!.=1$B4<K__%)"4X)D]'0`3G5.50``2.?(,"1`$
XM)D$H+P`<8!P0$K`39Q(0$TB`2,`2$DB!2,&2@"`!8`Y2BE*+(`13A$J`8MQPJ
XM`$SM#!#_]$Y=3G5.50``2.?.("1`*`$J+P`@<``0!"P`8`(4QB`%4X5*@&+V'
XM3.T$</_P3EU.=4Y5``!(Y\X@)$`H`2HO`"!P`!`$+`!@#G``$!*PAF8$(`I@J
XM#%**(`53A4J`8NIP`$SM!'#_\$Y=3G5(YS@`)``F`$A#*`%(1,#!PL/$Q,;$^
XM2$#007@`UX300M>$2$!"04A!0D)(0M*"TH-*@$S?`!Q.=2\"=`!*@&H$1(!T-
XM`TJ!:@9$@0H"``%A(N(*9`)$@.(*9`)$@20?2H!.=6'4P4%*@$YU80;!04J`'
XM3G5(YS@`)`%F!H'\``!@;E.!9VHH`2(`M(%E#&<$<`!@7'`!DH)@5B8":_;&]
XMA&82XHIV_^**5<O__$2#YJC"A&`\<`!V_^.":@:T@6(*8`RT@53+__)G!%*#G
XMXHI$@V`$XX#BBI*"91!2@%'+__1@#N.`XHK2@F7P4<O_]M*"3-\`'$J`3G4J9
XM7U.%96(0&&?X#```#6=8#```(&?L#```"6?F#```+&?@4H(,```B9S`,```G)
XM9RI(:/__4X5E,!`89\8,```-9Q(,```@9PP,```)9P8,```L9N!"*/__8*A(J
XM4%.%90@2&+`!9O9@["!/2%<O`E."9Q#E@B`P*``AD"@`(,!1@F+R3M5.50``H
XM2.=@@"!!,CP``$Y``(U@``7&3E4``$CG8(`R/``!3D``C64`!;0@`6``!:Q.^
XM50``2.=@@#(\``9.0`"-9``%H@Q!`--F``62<`%@``6*3E4``$CG8(`@03(\\
XM``\D+0`(8*A.50``2.=@@"!!,CP`#F"83E4``$CG8(`R/``"3D``C64`!50@2
XM`F``!4Q.50``2.=@@#(\``5@Y$Y5``!(YV"`($$R/```3D``CF``!2A.50``I
XM2.=@@#(\``-@ZDY5``!(YV"`)`$R/``"8-I.50``2.=@@"!!,CP`#V#*3E4`H
XM`$CG8(`D`3(\`!!@NDY5``!(YV"`)`$R/``18*I.50``2.=@@"0!,CP`&F":%
XM3E4``$CG8(`R/``;8/!.50``2.=@@$CG&$`D`7($3.T#&``(3D``CDS?`AA@\
XM``2:3E4``$CG8(`D`3(\`!Q@ODY5``!(YV"`,CP`)&"P3E4``$CG8(`R/``EV
XM8*).50``2.=@@#0!,CP`)F"23E4``$CG8(`T`3(\`"=@@DY5``!(YV"`<`!.]
XM0``*8``$/$Y5``!(YV"`(&T`""(0($`@%TY``!=E``0D(&T`"""!8``$(DY5+
XM``!(YV"`3D``#V``!`CAB`C``!].50``2.=@@$Y```I@``/R3E4``$CG`,`@Y
XM02)`(BT`"$Y``!%E%'``8$I.50``2.?`P"!`3D``$&0V+4&`#&`L3E4``$CGN
XMP,`B0"!)#!@`+F?Z#"@`+___9_)3B$Y``!!E"DH`9PH,```O9]YP_V`$(`F0G
XMETSM`P+_]$Y=3G5.50``2.=@@$CG`&`D+0`,($`@`2(M``A.0``E90(@"DS?;
XM!@!@``-<3E4``$CG8(`@0$Y``!IE``-,(`%@``-$3E4``$CG8(`@0$Y``!]E?
XM``,T(`%@``,L3E4``$CG8(`@;0`(3D``&&```QA.50``2.=@@"!`3D``)F``U
XM`P9.50``2.=@@`C!`!]@#$Y5``!(YV"`)"T`"$Y``"=E``+F(`)@``+>3E4`A
XM`$CG8(!.0``+8``"SDY5``!.0`!23EU.=4Y5``!(YV"`+PD@;0`((FT`#$Y`Q
XM`!LB7V```J9.50``2.<P@"0!)B\`%"!O`!AR`DY``%-D!BU!@`QP_TSM`0S_(
XM]$Y=3G5.50``2.<P@"!`<@!@W$Y5``!(YS"`<@%@T$Y5``!(YS"`($!R`V#"0
XM3E4``$CG,(`@07('8+1.50``@GP`"$Y``%-D!BU!@`QR_R`!3EU.=4Y5```OP
XM`7(&3D``4V0&+4&`#'+_(`$B+?_\3EU.=4Y5```O`G0)8!).50``+P)T"F`(%
XM3E4``"\"=`O#0H)O``Y.0`!39`8M08`,<O\@`20M__Q.74YU3E4``$CG,`!T>
XM!,-")B\`$$Y``%-D!BU!@`QR_R`!3.T`#/_X3EU.=4Y5``!(YS``=`5@UDY5#
XM``!(YV"`($`P`4CG`&!.0```90(@"DS?!@!@``&"3E4``$CG8(`@0#`!2.<`4
XM8$Y```%@WDY5``!(YV"`+PHD0$Y```(D7V```59.50``2.=@@"!`,`%.0``=T
XM8``!0DY5``!(YV"`<@,@0,%!3D``AF```39.50``2.=@@'($8.A.50``2.=@Y
XM@$Y```A@``$03E4``$CG8(`@0'``3D``!&4``/XD"&<``/9"6#"!8```[DY5#
XM``!(YV"`3D``#6```-Y.50``2.=@@$CG'$!Z`V`N3E4``$CG8(!(YQQ`>@%@(
XM'DY5``!(YV"`2.<<0'H"8`Y.50``2.=@@$CG'$!Z`"!`)`$B;0`(,"T`$DA`/
XM,"T`#B(M`!1V`P@%``%G!"8M`!PH+0`8"`4``&8&3D```V`$3D``!4S?`CA@B
XM``!B3E4``$CG8(!.0``,8```4DY5``!(YV"`3D``#&4``$0@`6```#Q.50``U
XM2.=@@"(`3D``'&```"I.50``2.=@@$'Z`!(M0*N>9@(@0$Y```E@```.(`$@H
XM;JN>3I!.0``>9`PM08`,</]@!&7V<`!,[0$&__1.74YU3E4``"(`80``'F$`/
XM\H!@"$Y5``!*_"(`3D``!MZMWJT`/``!3G5.=0``*Z(```L:```H%@```B!"F
XM<F]W<V4@=&AR;W5G:"!A(&1I<F5C=&]R>2P@=W)I='1E;B!B>2!0971E<B!D_
XM82!3:6QV80U!9&%P=&5D(&9O<B!/4RTY('5S:6YG(%1/4"=S(&]S.6QI8@U34
XM>6YT87@Z(&)R;W=S92!;/&1I<CY=#49U;F-T:6]N.B!S:&]W(&%N(&QS+6QI/
XM:V4@9&ER96-T;W)Y(&QI<W1I;F<@=VAI8V@@8V%N(&)E("=E9&ET960G+"!I=
XM+F4N#2`@("`@("`@("!F:6QE<R!M87D@8F4@=&%G9V5D(&%N9"!I;G-P96-TD
XM960L(&1U;7!E9"P@97AE8W5T960L(&1E;&5T960L#2`@("`@("`@("!R96YAY
XM;65D+"!C;W!I960L(&5D:71E9"!E=&,N#4]P=&EO;G,Z#2`@("`@;F]N90T`8
XM````'@```````````````#L.```8-@```#8``#L/```[$@``.RT`````````J
XM`0``/"D``#PM```\,0``/#4``#PY```\/0``/$$``#Q%```\20``/$T``#Q1T
XM```\50``````````````````````````````````````````````````````1
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````"X`````````````````````````````````````````````````````N
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM````````````````````````````+V@P+W-Y<R]B<F]W<V4N;6%C<F]S````)
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````0```&CP!]`%U
XM-0.-`N<"F@%-`*8`4P`W`#(`*@`<`!0`#@`*``4``@```````0$!`0$!`0$!\
XM$1$!$1$!`0$!`0$!`0$!`0$!`0$!`0$P("`@("`@("`@("`@("`@2$A(2$A(7
XM2$A(2"`@("`@("!"0D)"0D("`@("`@("`@("`@("`@("`@("`B`@("`@($1$\
XM1$1$1`0$!`0$!`0$!`0$!`0$!`0$!`0$("`@(`$`3OD``(+23OD``(+<3OD`H
XM`(*\3OD```````!0#@``4`\``%`M``!00P``4%X``%!G``!0<```4'D``%""2
XM``!0BP``4)0``%"=``!0I@``4*\``%"X``!0P0``4,H``%#3``!0W```4.4`8
XM`%#N``!0]P``40```%$)``!1$@``41L``%$D``!1+0``438``%$_``!12```B
XM45$``%%:``!18P``46P``%%U``!1?@``48<``%&0``!1F0``4:(``%&K``!1V
XMM```4;T``%'&``!1SP``4=@``%'A``!1Z@``4?,``%'\``!2!0``4@X``%(7`
XM``!2(```4BD``%(R``!2.P``4D0``%)-``!25@``4E\``%)H``!2<0``4GH`5
XM`%*?``!2U0``4O$``%,9``!3(@``4RL``%,T``!3/0``4T8``%-/``!36```W
XM4V$``%-J``!3<P``4WP``%.%``!3C@``4Y<``%.@``!3J0``4[(``%.[``!3^
XMQ```4\T``%/6``!3WP``4^@``%/Q``!3^@``5`,``%0,``!4%0``5!X``%0G8
XM``!4,```5#D``%1"``!42P``5%P``%1Q``!4C0``5*0``%3#``!4Y```50,`[
XM`%4;``!5/@``56$``%5V``!5G0``5<4``%7E``!5^@``5@\``%8D``!6.0``'
XM5DX``%9C``!6>```5HT``%:H``!6L0``5KH``%;#``!6S```5M4``%;>``!63
XMYP``5O```%<G``!7,```5SD``%="``!72P``5U0``%==``!79@``5V\``%=XN
XM``!7@0``5XH``%>3``!7G```5Z4``%?&``!7X@``5_X``%@5``!8,```6$8`0
XM`%A@``!8=0``6)```%BO``!8TP``6.@``%C]``!9$@``62<``%D\``!94@``?
XM67T``%F;``!9NP``6=,``%GM``!:$0``6D(``%J```!:MP``6NH``%KS``!:M
XM_```6P4``%L.``!;%P``6R```%LI``!;,@``6SL``%M$``!;30``6U8``%M?+
XM``!;:```6W$``%MZ``!;@P``6XP``%N5``!;G@``6Z<``%NP``!;N0``6\(`0
XM`%O+``!;Z@``7`(``%PC``!<.```7%P``%QV``!<G@``7+(``%S0``!<]```J
XM70T``%TA``!=/```75D``%UU``!=B@``7:$``%W#``!=Y0``7@H``%XJ``!>>
XM0P``7F0``%Z"``!>G0``7K<``%[+``!>YP``7P,``%\H``!?1P``7UP``%]S_
XM``!?E@``7[0``%_%``!?Y@``7_\``&`>``!@/P``8&,``&!]``!@G@``8,``J
XM```!@YP``80```&$3``!A)@``84$``&%5``!A=```88L``&&T``!ASP``T
XM`1<RN#*R,JPRIC(>,?@RO#+`,L0RR#+,,M`RU#+8,MPRX#+D,N@R[#+P,O0R=
XM^#+\,P`S!#,(,PPS$#,4,Q@S'#,@,R0S*#,L,S`S-#,X,SPS0#-$,T@S3#-0=
XM,U0S6#-<,V`S9#-H,VPS<#-T,W@S?#.`,X0SB#.,,Y`SE#.8,YPSH#.D,Z@SI
XMK#.P,[0SN#.\,\`SQ#/(,\PST#/4,]@SW#/@,^0SZ#/L,_`S]#/X,_PT`#0$,
XM-`@T##00-!0T�<-"`T)#0H-"PT,#0T-#@T/#1`-$0T2#1,-%`T5#18-%PTX
XM8#1D-&@T;#1P-'0T>#1\-(`TA#2(-(PTD#24-)@TG#2@-*0TJ#2L-+`TM#2X,
XM-+PTP#3$-,@TS#30--0TV#3<-.`TY#3H-.PT\#3T-/@T_#4`-00U"#4,-1`UV
XM%#48-1PU(#4D-2@U+#4P-30U.#4\-4`U1#5(-4PU4#54-5@U7#5@-60U:#5L.
XM-7`U=#5X-7PU@#6$-8@UC#60-90UF#6<-:`UI#6H-:PUL#6T-;@UO#7`-<0U_
XMR#7,-=`UU#78-=PUX#7D->@U[#7P-?0U^#7\-@`V!#8(-@PV$#84-A@V'#8@#
XM-B0V*#8L-C`V-#8X-CPV0#9$-D@V3#90-E0V6#9<-F`V9#9H-FPV<#9T-G@V.
XM?#:`-H0VB#:,-I`VE#:8-IPVH#:D-J@VK#:P-K0VN"ST+0`M!"T(+10M&"T<,
XJ+2`M)"TH+2PM,"TT+3@M/"U`*Z8``````````RSF+/@KH@``````*+:-'
X``
Xend
Xsize 36942
SHAR_EOF
chmod 0003 browse.uu || echo "restore of browse.uu fails"
exit 0
mdnet@cosmo.UUCP (Dr. Carsten Emde/Klinikum Steglitz der FU Berlin) (02/03/90)
Sorry for problems with this source when posted some weeks ago.
"browse.c" comes now in two parts.
Any complaints to:
----------------------------------------------------------------------
-- Carsten Emde --- Klinikum Steglitz --- Freie Universitaet Berlin --
-- Med. Klinik --- Hindenburgdamm 30 --- D-1000 Berlin 45 Steglitz --
-- +49307982393 --- Fax: +49307984141 --- Gastrointestinal Motility --
-- E-mail emde@zedat.fu-berlin.dbp.de (checked 0800/1200/1600/2000) --
-- or {anything big}!unido!cosmo!mdnet (checked only occasionally) --
----------------------------------------------------------------------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# browse_2a
# This archive created: Tue Jan 30 18:04:16 1990
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f 'browse_2a'
then
echo shar: "will not over-write existing file 'browse_2a'"
else
cat << \SHAR_EOF > 'browse_2a'
/* -- Just what the hell am I ??? --- */
#include <stdio.h>
char help[]=
"Browse through a directory, written by Peter da Silva\n\
Adapted for OS-9 using TOP's os9lib\n\
Syntax: browse [<dir>]\n\
Function: show an ls-like directory listing which can be 'edited', i.e.\n\
files may be tagged and inspected, dumped, executed, deleted,\n\
renamed, copied, edited etc.\n\
Options:\n\
none\n";
#ifdef mc68000
#define sr sr_
#define PC PC_
#endif
#ifdef OSK
#include <termcap.h>
#define GETCWD
#define getcwd getwd
#define minor(i) ((i)&0xFF)
#define major(i) minor((i)>>8)
#define SHELLSYM '$'
#define ASSISTCOM "more /dd/sys/browse.hlp"
#define SAVEMACROS "/h0/sys/browse.macros"
#else
#define remote
#define SHELLSYM '!'
#define ASSISTCOM "more /usr/hlp/browse.doc"
#define SAVEMACROS "/usr/tmp/macros"
#endif
#ifdef M_XENIX
#define USG
#define rindex strrchr
#define GETCWD
#else
#ifdef L_ctermid
#define USG
#define rindex strrchr
#define minor(i) ((i)&0xFF)
#define major(i) minor((i)>>8)
#else
#ifndef OSK
#include <whoami.h>
#endif
#endif
#endif
/* -- Miscellaneous include files -- */
#ifdef OSK
#include <modes.h>
#include <direct.h>
#include <sgstat.h>
#include <strings.h>
#endif
#include <sys/param.h> /* NCARGS, and others */
#ifndef M_XENIX
#include <sys/types.h> /* data types for various files */
#endif
#include <sys/stat.h> /* stat data structure for getdir(), statout() */
#include <sys/dir.h> /* dir data structure for getdir() */
#include <pwd.h> /* passwd data structure for u_name() */
#include <grp.h> /* group data structure for g_name() */
#ifdef BSD
#include <sys/time.h> /* time data structure for printime() */
#else
#ifndef OSK
#include <time.h> /* time data structure for printime() */
#endif
#endif
#ifdef USG
#ifdef M_XENIX
#include <sys/ioctl.h>
#endif
#include <termio.h>
#else
#ifndef OSK
#include <sgtty.h> /* terminal modes for tinit(), tend() */
#endif
#endif
#include <signal.h>
/* -- make information --
BUILD
browse: browse.c
cc browse.c -O -o browse -ltermlib
END
*/
/* -- Miscellaneous defines -- */
#define FALSE 0
#define TRUE 1
#define MAXID 64
#define MAXLINE 256
#ifdef OSK
#define MAXENTS 512
#define NCOL 54
#define MAXNAME 24
#else
#define MAXENTS 320
#define NCOL 64
#define MAXNAME 14
#endif
#define FILENAME 256
#define MAXARGC (NCARGS/16) /* Estimate max ARGC */
#define CHARSET 256 /* Number of macros == size of byte */
#define NOMAC (0) /* Null macro (last) */
#define TERMBUF 1024 /* Size of term buf for termcap */
#define SMALLBUF 256
#define NAME 1
#define SEC 2
/* -- Extended directory entry format -- */
struct entry {
char *e_name;
int e_flags;
#define FTAGGED (1<<0)
#define FPERMANENT (1<<1)
struct stat e_stat; /* file status field */
char e_uname[9]; /* user name */
char e_gname[9]; /* user's group name */
#ifdef OSK
unsigned long e_secno;
#endif
}
*xentries[MAXENTS], **entries=xentries;
int nentries;
/* -- Look-up cache for user names -- */
struct idtab {
int id_id; /* user (or group) id */
char id_name[9]; /* name[8] + filler */
}
u_list[MAXID], /* Matched user id's. */
g_list[MAXID]; /* ditto group */
int u_ptr=0, g_ptr=0; /* current entries */
/* -- Global variables -- */
FILE *efp; /* Environment file */
char efname[MAXLINE]; /* " name */
char *tent; /* Pointer to tbuf */
char PC; /* Pad character */
char *UP, *BC; /* Upline, backsapce character */
short ospeed; /* Terminal output speed */
char termbuf[TERMBUF]; /* Place to put term info */
char *macbuf[CHARSET], ungetbuf[SMALLBUF];
/* Buffers for pushback and macros */
char c_macro=NOMAC; /* current macro */
char *macptr = ""; /* Pointer to currently executing macro */
char *ungetptr = ungetbuf; /* Pointer to pushed-back characters */
char *errname; /* Name of file error found in */
extern int errno; /* system error number */
int xerrno; /* extended error number */
int ccol=NCOL; /* Width of used display, current column */
int quickmode; /* short display mode (files only) */
#ifdef USG
struct termio rawbuf;
struct termio cookedbuf;
#else
#ifdef OSK
struct sgbuf cookopts,rawopts;
int signhndl();
#else
struct sgttyb sgbuf; /* buffer for terminal mode info */
int rawflags, cookflags; /* flags for raw & cooked tty mode */
#endif
#endif
char *cm, /* Cursor motion */
*cs, /* Change scrolling region */
*sf, /* - scroll forward */
*sr, /* - scroll backwards */
*ce, /* Clear to end of line */
*cl, /* Clear screen */
*al, /* Insert line */
*dl, /* delete ditto */
*so, /* standout */
*se, /* standout end */
*us, /* underline */
*ue, /* underline end */
*ti, /* Init terminal */
*te; /* Reset terminal */
int li, /* lines on screen */
co; /* columns ditto */
char xn; /* Magic cookie kludge */
/* -- Global error messages -- */
char *emesg[4]={
"??",
#define TOO_MANY 1
"Too many directory entries",
#define NOMATCH 2
"No match",
0
};
int top, curr; /* Positions of screen in directory */
#define bottom ((top+nlines>nentries)?nentries:(top+nlines))
char *dot; /* name of current directory */
int nlines; /* number of lines displayed on page */
char display_up; /* Does the display exist? */
int todump=1; /* Do we want to dump data? */
int ended; /* Have we quite finished? */
int intrup; /* Have we been interrupted? */
char *HOME; /* Where did I start from? */
char *SHELL; /* How do I run programs? */
/* -- types of functions !!! */
char *getenv(), *tgetstr();
char *malloc();
#define NEW(t) (t *)malloc(sizeof (t))
#define NIL(t) ((t) 0)
/* -- Code starts here: dummy main -- */
main(ac, av, ep)
int ac;
char **av;
char **ep;
{
int i;
if(ac>1)
{
for(i=1; i<ac; i++)
{
if(!strcmp(av[i],"-?"))
{
printf(help); exit(0);
}
}
if(ac>2)
{
perror("only one argument may be specified.");
exit(0);
}
if(chdir(av[1])==-1)
{
perror("can't access directory specified",av[1]);
exit(0);
}
}
sprintf(efname, "/tmp/br.env.%d", getpid());
HOME=getenv("HOME");
SHELL=getenv("SHELL");
#ifndef OSK
dumpenv(ep);
#endif
intrup=0;
tinit(getenv("TERM"));
clear_all();
#ifdef OSK
stdin->_flag|=_RBF; stdin->_flag|=_UNBUF;
#endif
browse();
tend();
#ifndef OSK
unlink(efname);
#endif
}
clear_all()
{
int i;
for(i = 0; i < MAXENTS; i++)
entries[i] = 0;
}
char *clone(name)
char *name;
{
char *hold;
hold = (char *)malloc(strlen(name)+1);
if(hold==0)
return 0;
strcpy(hold, name);
return hold;
}
newname(e, name)
struct entry *e;
char *name;
{
if(e->e_name)
free(e->e_name);
e->e_name = clone(name);
}
#if (BSD || OSK)
readent(dp, db)
DIR *dp;
struct direct *db;
{
struct direct *ptr;
ptr = readdir(dp);
if(!ptr) return 0;
*db = *ptr; /* V7 'C' and above... safe, since UCB=V7+ */
free(ptr);
return 1;
}
#else
#define opendir(n) fopen(n, "r")
#define DIR FILE
readent(dp, db)
DIR *dp;
struct direct *db;
{
if(fread(db, sizeof(struct direct), 1, dp))
return 1;
/* else */
return 0;
}
#define closedir fclose
#endif
getdir()
{
#ifdef OSK
struct fildes f;
struct tm t;
int physdisk, oldid;
char pdot[32], *slash;
#endif
char *u_name(), *g_name();
DIR *dp;
int valid;
struct direct *hold = NEW(struct direct);
int i, p;
if(!(dp = opendir("."))) {
errname=".";
return FALSE;
}
p = 0;
for(i = 0; i < nentries; i++) {
if(entries[i]->e_flags & FPERMANENT) {
if(p != i) {
struct entry *hold;
hold = entries[p];
entries[p] = entries[i];
entries[i] = hold;
}
p++;
}
}
for(nentries = p; !intrup && nentries < MAXENTS; nentries += valid) {
if(!entries[nentries]) {
entries[nentries] = NEW(struct entry);
if(!entries[nentries])
break;
entries[nentries]->e_name = NIL(char *);
}
if(!readent(dp, hold)) {
p=nentries; break;
}
#ifndef OSK
valid = (hold->d_ino != 0);
#else
valid = TRUE;
entries[nentries]->e_secno=hold->d_addr;
#endif
if(valid) {
#ifndef OSK
if(stat(hold->d_name, &entries[nentries]->e_stat)==-1) {
closedir(dp);
errname=hold->d_name;
free(hold);
return FALSE;
}
#endif
newname(entries[nentries], hold->d_name);
#ifndef BSD /* truncate name to 14 characters in non-BSD systems */
#ifndef OSK
if(strlen(entries[nentries]->e_name)>14)
entries[nentries]->e_name[14] = 0;
#endif
#endif
entries[nentries]->e_flags = 0;
#ifndef OSK
strcpy(entries[nentries]->e_uname,
u_name(entries[nentries]->e_stat.st_uid));
strcpy(entries[nentries]->e_gname,
g_name(entries[nentries]->e_stat.st_gid));
#endif
}
}
closedir(dp);
free(hold);
#ifdef OSK
sortdir(SEC); /* optimize head movements */
oldid=getuid(); super();
strcpy(pdot,dot);
if(slash=index(pdot+1,'/')) strcpy(slash,"@"); else strcat(pdot,"@");
if((physdisk=open(pdot,S_IREAD))==-1) return FALSE;
for(nentries = 0; !intrup && nentries < p; nentries ++) {
lseek(physdisk,(entries[nentries]->e_secno)<<8,0);
read(physdisk,&f,sizeof(f));
t.tm_year = (int) f.fd_date[0];
t.tm_mon = (int) f.fd_date[1] - 1;
t.tm_mday = (int) f.fd_date[2];
t.tm_hour = (int) f.fd_date[3];
t.tm_min = (int) f.fd_date[4];
t.tm_sec = 0;
t.tm_isdst = -1;
entries[nentries]->e_stat.st_atime =
entries[nentries]->e_stat.st_mtime = mktime(&t);
t.tm_year = (int) f.fd_dcr[0];
t.tm_mon = (int) f.fd_dcr[1] - 1;
t.tm_mday = (int) f.fd_dcr[2];
t.tm_hour = t.tm_min = t.tm_sec = 0;
t.tm_isdst = -1;
entries[nentries]->e_stat.st_ctime = mktime(&t);
memcpy(&(entries[nentries]->e_stat.st_size), f.fd_fsize,
sizeof(long));
entries[nentries]->e_stat.st_uid = f.fd_own[1];
entries[nentries]->e_stat.st_gid = f.fd_own[0];
entries[nentries]->e_stat.st_mode = f.fd_att;
entries[nentries]->e_stat.st_nlink = f.fd_link;
strcpy(entries[nentries]->e_uname,
u_name(entries[nentries]->e_stat.st_uid));
strcpy(entries[nentries]->e_gname,
g_name(entries[nentries]->e_stat.st_gid));
}
close(physdisk);
setuid(oldid);
#endif
if(intrup)
return FALSE;
if(nentries>=MAXENTS || entries[nentries]==NIL(struct entry *)) {
errno=0;
xerrno=TOO_MANY;
errname=".";
return FALSE;
}
sortdir(NAME);
if(intrup)
return FALSE;
return TRUE;
}
at_current()
{
at_file(curr);
}
at_file(file)
int file;
{
if(display_up) {
if(file < top || file >= top+nlines)
return 0;
at(0, curr-top+2);
} else {
if(file != curr)
return 0;
cmdline();
}
return 1;
}
display_flags(flags)
{
outc((flags&FTAGGED)?'+':((flags&FPERMANENT)?'!':' '));
}
repaint_flags()
{
if(!display_up) return;
at(quickmode?0:NCOL-1, curr-top+2);
display_flags(entries[curr]->e_flags);
}
/*
repaint_current()
{
if(!display_up) return;
at_current();
dump(curr, curr+1);
}
*/
tag()
{
entries[curr]->e_flags ^= FTAGGED;
repaint_flags();
}
tag_all(flag)
int flag;
{
int i;
for(i = 0; i < nentries; i++)
if(flag)
{
if(!isdir(entries[i])) entries[i]->e_flags |= FTAGGED;
}
else
entries[i]->e_flags &= ~FTAGGED;
if(display_up)
todump = TRUE;
}
delete_from_display(file)
int file;
{
if(!display_up) return;
if(file>=top+nlines) return;
if(file < top) file = top;
scroll(2+file-top, 2+nlines, 1);
at(0, 2+nlines-1);
if(top+nlines >= nentries)
outc('~');
else
dump(bottom, bottom+1);
}
delete_file_entry(file)
int file;
{
struct entry *hold;
int i;
delete_from_display(file);
hold = entries[file];
for(i=file; i<nentries-1; i++)
entries[i]=entries[i+1];
entries[nentries-1]=hold;
nentries--;
if(file < curr || curr >= nentries) {
curr--;
if(top >= nentries) {
top--;
display_up = 0;
todump = 1;
}
}
}
remove_one(file, doit)
int file;
int doit;
{
if(!doit) {
cmdline();
outs("Delete ");
ctlouts(entries[file]->e_name);
outs(" [n]?");
fflush(stdout);
doit = getch() == 'y';
outs(doit?"Yes.":"No.");
fflush(stdout);
}
if(doit) {
if(unlink(entries[file]->e_name) == 0) {
cmdline();
outs("Deleted ");
ctlouts(entries[file]->e_name);
outs(".");
delete_file_entry(file);
return 1;
} else {
wperror(entries[file]->e_name);
return 0;
}
}
return 0;
}
remove(doit)
int doit;
{
int i;
int found_tags;
found_tags = 0;
i = 0;
while(i < nentries) {
if(entries[i]->e_flags & FTAGGED) {
found_tags = 1;
if(!remove_one(i, doit)) /* decrements nentries */
break;
} else
i++;
}
if(!found_tags)
remove_one(curr, doit);
}
insert_entry_at(ent, i)
struct entry *ent;
int i;
{
struct entry *hold;
int j;
/* Allocate slot at end */
if(!entries[nentries]) {
entries[nentries] = NEW(struct entry);
if(!entries[nentries])
return 0;
entries[nentries]->e_name = NIL(char *);
} else if(entries[nentries]->e_name) {
free(entries[nentries]->e_name);
entries[nentries]->e_name = NIL(char *);
}
/* Copy data into slot */
*entries[nentries] = *ent;
entries[nentries]->e_name = clone(ent->e_name);
if(!entries[nentries]->e_name)
return 0;
if(i != nentries) {
/* Rotate slot to middle */
hold = entries[nentries];
for(j = nentries; j > i; j--)
entries[j] = entries[j-1];
entries[i] = hold;
}
nentries++;
if(display_up) {
if(i < top)
i = top;
if(i >= bottom)
return;
scroll(2+i-top, 2+nlines, -1);
at(0, 2+i-top);
dump(i, i+1);
}
}
insert_entry(ent)
struct entry *ent;
{
int i;
if(nentries >= MAXENTS)
return 0;
for(i = 0; i < nentries; i++)
if(entcmpnam(&ent, &entries[i]) < 0)
break;
return insert_entry_at(ent, i);
}
assist()
{
char cmdbuf[MAXLINE];
sprintf(cmdbuf, ASSISTCOM);
if(sys(cmdbuf, 1))
perror(cmdbuf);
}
hexdump()
{
char cmdbuf[MAXLINE];
sprintf(cmdbuf, "dump %s", entries[curr]->e_name);
if(sys(cmdbuf, 1))
perror(cmdbuf);
}
move()
{
char scratch[FILENAME];
struct entry hold;
char inps();
hold = *entries[curr];
cmdline();
outs("Rename ");
ctlouts(entries[curr]->e_name);
outc(' ');
if(inps(scratch, entries[curr]->e_name, 0)=='\033') {
killcmd();
return;
}
if(link(entries[curr]->e_name, scratch)!=0) {
char tmbuf[42];
sprintf(tmbuf, "(rename %s %s)", entries[curr]->e_name, scratch);
wperror(tmbuf);
return;
}
if(unlink(entries[curr]->e_name)!=0) {
wperror(entries[curr]->e_name);
return;
}
hold.e_name = scratch;
hold.e_flags &= ~FTAGGED;
delete_file_entry(curr);
insert_entry(&hold);
}
pname(name, mode)
char *name;
int mode;
{
int i;
char *slash, *rindex();
int max=quickmode?MAXLINE:(MAXNAME+1);
#ifdef OSK
if(mode&S_IFDIR)
#else
if((mode&S_IFMT)==S_IFDIR)
#endif
max--;
#ifndef OSK
else if((mode&S_IFMT)==S_IFREG && (mode&0111))
max--;
else if((mode&S_IFMT)!=S_IFREG)
max--;
#endif
if(!quickmode && (slash=rindex(name, '/'))) {
name=slash;
outc('<');
max--;
}
for(i=0; i<max && *name; name++)
i += ctlout(*name);
standend();
if(i==max && *name)
outs("\b>");
#ifdef OSK
if(mode&S_IFDIR) {
#else
if((mode&S_IFMT)==S_IFDIR) {
#endif
outc('/');
}
#ifndef OSK
else if((mode&S_IFMT)==S_IFREG && (mode&0111)) {
outc('*');
}
else if((mode&S_IFMT)!=S_IFREG) {
outc('?');
}
#endif
}
sortdir(ele)
int ele;
{
int entcmpnam(),entcmpsec();
if(ele==NAME)
qsort(entries, nentries, sizeof(struct entry *), entcmpnam);
if(ele==SEC)
qsort(entries, nentries, sizeof(struct entry *), entcmpsec);
}
#ifndef OSK
addname(flag)
char flag;
{
char buf[FILENAME], *ptr, *tmp;
char scratch[FILENAME];
struct entry hold;
char inps();
cmdline();
outs("Add ");
if(inps(scratch, entries[curr]->e_name, 0)=='\033') {
killcmd();
return;
}
if(stat(scratch, &hold.e_stat)==-1) {
wperror(scratch);
return;
}
if(flag!='+' && *scratch != '/') {
strcpy(buf, dot);
ptr = scratch;
for(;;) { /* eat '../' and './' */
if(ptr[0]=='.' && ptr[1]=='.' &&
(ptr[2]=='/' || !ptr[2])) {
tmp = rindex(buf, '/');
if(!tmp) break;
*tmp=0;
ptr += 2+(ptr[2]=='/');
continue;
}
if(ptr[0]=='.' &&
(ptr[1]=='/' || !ptr[1])) {
ptr += 1+(ptr[1]=='/');
continue;
}
break;
}
if(*ptr) {
strcat(buf, "/");
strcat(buf, ptr);
}
hold.e_name = buf;
} else
hold.e_name = scratch;
strcpy(hold.e_uname,
u_name(hold.e_stat.st_uid));
strcpy(hold.e_gname,
g_name(hold.e_stat.st_gid));
hold.e_flags = 0;
if(flag!='+')
hold.e_flags |= FPERMANENT;
insert_entry(&hold);
}
addperm()
{
char buf[FILENAME], *ptr, *tmp;
struct entry hold;
int entcmpnam(), i;
if(entries[curr]->e_flags & FPERMANENT)
return;
if(entries[curr]->e_name[0]!='/') {
strcpy(buf, dot);
ptr = entries[curr]->e_name;
for(;;) { /* eat '../' and './' */
if(ptr[0]=='.' && ptr[1]=='.' &&
(ptr[2]=='/' || !ptr[2])) {
tmp = rindex(buf, '/');
if(!tmp) break;
*tmp=0;
ptr += 2+(ptr[2]=='/');
continue;
}
if(ptr[0]=='.' &&
(ptr[1]=='/' || !ptr[1])) {
ptr += 1+(ptr[1]=='/');
continue;
}
break;
}
if(*ptr) {
strcat(buf, "/");
strcat(buf, ptr);
}
hold = *entries[curr];
hold.e_name = buf;
hold.e_flags &= ~FTAGGED;
hold.e_flags |= FPERMANENT;
insert_entry(&hold);
} else {
entries[curr]->e_flags |= FPERMANENT;
entries[curr]->e_flags &= ~FTAGGED;
repaint_flags();
}
}
delperm()
{
entries[curr]->e_flags &= ~(FPERMANENT|FTAGGED);
repaint_flags();
}
#endif
entcmpnam(e1, e2)
struct entry **e1, **e2;
{
if((*e1)->e_name[0] == '/') {
if((*e2)->e_name[0] != '/')
return 1;
} else if((*e2)->e_name[0] == '/')
return -1;
return strcmp((*e1)->e_name, (*e2)->e_name);
}
entcmpsec(e1, e2)
struct entry **e1, **e2;
{
if((*e1)->e_secno < (*e2)->e_secno) return -1;
if((*e1)->e_secno > (*e2)->e_secno) return 1;
return 0;
}
dump(start, end)
int start;
int end;
{
int i;
int lo = (start<nentries)?start:nentries;
int hi = (end<nentries)?end:nentries;
for(i=lo; i<hi; i++) {
statout(entries[i]->e_name,
&entries[i]->e_stat,
entries[i]->e_uname,
entries[i]->e_gname,
entries[i]->e_flags);
nl();
}
return TRUE;
}
SHAR_EOF
fi
exit 0
# End of shell archivemdnet@cosmo.UUCP (Dr. Carsten Emde/Klinikum Steglitz der FU Berlin) (02/03/90)
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# browse_2b
# 4. Merge browse_2a and browse_2b to create browse.c
# This archive created: Tue Jan 30 18:04:32 1990
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f 'browse_2b'
then
echo shar: "will not over-write existing file 'browse_2b'"
else
cat << \SHAR_EOF > 'browse_2b'
statout(name, sbuf, user, group, flags)
char *name;
struct stat *sbuf;
char *user, *group;
int flags;
{
int mode = sbuf->st_mode;
if(!quickmode) {
#ifndef OSK
printf("%5u ", sbuf->st_ino);
#endif
#ifdef OSK
if(mode&S_IFDIR) outc('d'); else outc('-');
if(mode&S_ISHARE) outc('s'); else outc('-');
if(mode&S_IOEXEC) outc('e'); else outc('-');
if(mode&S_IOWRITE) outc('w'); else outc('-');
if(mode&S_IOREAD) outc('r'); else outc('-');
if(mode&S_IEXEC) outc('e'); else outc('-');
if(mode&S_IWRITE) outc('w'); else outc('-');
if(mode&S_IREAD) outc('r'); else outc('-');
#else
if((mode&S_IFMT)==S_IFCHR) outc('c');
else if((mode&S_IFMT)==S_IFBLK) outc('b');
else if((mode&S_IFMT)==S_IFDIR) outc('d');
else if((mode&S_IFMT)==S_IFREG) outc('-');
else outc('?');
triad((mode>>6)&7, mode&S_ISUID, 's');
triad((mode>>3)&7, mode&S_ISGID, 's');
triad(mode&7, mode&S_ISVTX, 't');
#endif
outc(' ');
printf("%1u ", sbuf->st_nlink);
printf("%-8s ", user);
printf("%-8s ", group);
#ifdef OSK
if(!(mode&S_IFDIR))
#else
if((mode&S_IFMT)==S_IFREG || (mode&S_IFMT)==S_IFDIR))
#endif
printf("%7ld ", sbuf->st_size);
else
#ifdef OSK
printf(" --- ");
#else
printf("%3d,%3d ",
major(sbuf->st_rdev),
minor(sbuf->st_rdev));
#endif
outc(' ');
printime(&sbuf->st_mtime);
}
display_flags(flags);
pname(name, sbuf->st_mode);
}
char *
u_name(uid)
int uid;
{
int i;
struct passwd *pwptr, *getpwuid();
for(i=0; i<u_ptr; i++)
if(u_list[i].id_id==uid)
return u_list[i].id_name;
if(u_ptr>=MAXID) /* cache full */
u_ptr = 0; /* simplistic algorithm, wrap to beginning */
/* with MAXID >> # common id's it's good enough */
u_list[u_ptr].id_id=uid;
if(pwptr=getpwuid(uid)) { /* Copy name */
for(i=0; pwptr->pw_name[i]>' '; i++)
u_list[u_ptr].id_name[i]=pwptr->pw_name[i];
u_list[u_ptr].id_name[i]=0;
}
else /* Default to UID */
sprintf(u_list[u_ptr].id_name, "%d", uid);
return u_list[u_ptr++].id_name;
}
char *
g_name(gid)
int gid;
{
int i;
struct group *grptr, *getgrgid();
for(i=0; i<g_ptr; i++)
if(g_list[i].id_id==gid)
return g_list[i].id_name;
if(g_ptr>=MAXID) /* cache full */
g_ptr = 0; /* simplistic algorithm, wrap to beginning */
/* with MAXID >> # common id's it's good enough */
g_list[g_ptr].id_id=gid;
if(grptr=getgrgid(gid)) { /* Copy name */
for(i=0; grptr->gr_name[i]>' '; i++)
g_list[g_ptr].id_name[i]=grptr->gr_name[i];
g_list[g_ptr].id_name[i]=0;
}
else /* Default to UID */
sprintf(g_list[g_ptr].id_name, "%d", gid);
return g_list[g_ptr++].id_name;
}
printime(clock)
long *clock;
{
struct tm *tmbuf, *localtime();
static char *months[12]= {
"Jan","Feb","Mar","Apr","May","Jun",
"Jul","Aug","Sep","Oct","Nov","Dec"
};
tmbuf=localtime(clock);
printf("%2d %3s %02d %2d:%02d",
tmbuf->tm_mday,
months[tmbuf->tm_mon],
tmbuf->tm_year,
tmbuf->tm_hour,
tmbuf->tm_min);
}
header()
{
int i;
if(quickmode)
printf(" File Name");
else
printf(
#ifdef OSK
"Attr Lnk User Group Size Modify Time File name"
#else
"Inode Long mode LNX User Group Size/Dev Modify Time File name"
#endif
);
nl();
}
#ifndef OSK
triad(bits, special, code)
int bits, special;
char code;
{
if(bits&4) outc('r');
else outc('-');
if(bits&2) outc('w');
else outc('-');
if(special) outc(code);
else if(bits&1) outc('x');
else outc('-');
}
#endif
outs(s)
char *s;
{
int outc();
if(s)
tputs(s, 0, outc);
}
outc(c)
char c;
{
putchar(c);
}
/* Screen manipulation primitives: dumb set for smart terminals */
at(x, y)
int x, y;
{
outs(tgoto(cm, x, y));
}
nl()
{
outs(ce);
outc('\n');
}
/* Scroll lines in window (from:to) n lines */
scroll(from, to, n)
int from, to, n;
{
if(cs && sf && sr) {
outs(tgoto(cs, from, to-1));
if(n<0)
while(n++)
outs(sr);
else
while(n--)
outs(sf);
outs(tgoto(cs, 0, li-1));
}
else if(al && dl) {
if(n<0) {
int i=n;
outs(tgoto(cm, 0, to+n));
while(i++)
outs(dl);
outs(tgoto(cm, 0, from));
while(n++)
outs(al);
}
else {
int i=n;
outs(tgoto(cm, 0, from));
while(i--)
outs(dl);
outs(tgoto(cm, 0, to-n));
while(n--)
outs(al);
}
}
}
wperror(file)
char *file;
{
extern int errno;
extern remote char *sys_errlist[];
cmdline();
ctlouts(file);
ctlouts(": ");
ctlouts(errno?sys_errlist[errno]:emesg[xerrno]);
if(!display_up)
nl();
}
fperror(prog, file)
char *prog, *file;
{
extern int errno;
fprintf(stderr, "%s -- ", prog);
if(errno)
perror(file);
else
fprintf(stderr, "%s: %s\n", file, emesg[xerrno]);
}
tinit(name)
char *name;
{
char *termptr;
char tbuf[TERMBUF], *tmp;
#ifndef OSK
int intr();
#endif
#ifdef BSD
int stop();
#endif
termptr = termbuf;
tgetent(tbuf, name);
tmp = tgetstr("pc", &termptr);
if(tmp) PC = *tmp;
UP = tgetstr("up", &termptr);
BC = tgetstr("bc", &termptr);
cm = tgetstr("cm", &termptr);
cs = tgetstr("cs", &termptr);
sf = tgetstr("sf", &termptr);
sr = tgetstr("sr", &termptr);
ce = tgetstr("ce", &termptr);
cl = tgetstr("cl", &termptr);
al = tgetstr("al", &termptr);
dl = tgetstr("dl", &termptr);
us = tgetstr("us", &termptr);
ue = tgetstr("ue", &termptr);
so = tgetstr("so", &termptr);
se = tgetstr("se", &termptr);
ti = tgetstr("ti", &termptr);
te = tgetstr("te", &termptr);
li = tgetnum("li");
co = tgetnum("co");
xn = tgetflag("xn");
nlines=li-3;
#ifdef USG
ioctl(1, TCGETA, &rawbuf);
cookedbuf = rawbuf;
rawbuf.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHOK|ECHONL);
rawbuf.c_cc[VMIN] = 1;
rawbuf.c_cc[VTIME] = 0;
#else
#ifdef OSK
_gs_opt(1, &cookopts);
memcpy(&rawopts,&cookopts,sizeof(cookopts));
rawopts.sg_echo=rawopts.sg_pause=FALSE;
rawopts.sg_eofch=rawopts.sg_eorch=0;
#else
gtty(1, &sgbuf);
ospeed=sgbuf.sg_ospeed;
quickmode=ospeed<10;
cookflags=sgbuf.sg_flags;
sgbuf.sg_flags = (sgbuf.sg_flags&~ECHO)|CBREAK;
rawflags=sgbuf.sg_flags;
#endif
#endif
#ifdef OSK
intercept(signhndl);
#else
signal(SIGINT, intr);
#endif
#ifdef BSD
signal(SIGTSTP, stop);
#endif
rawtty();
}
int tmode=0;
entty()
{
if(!tmode)
outs(ti);
tmode=1;
}
extty()
{
if(tmode)
outs(te);
tmode=0;
}
rawtty()
{
#ifdef USG
ioctl(1, TCSETA, &rawbuf);
#else
#ifdef OSK
_ss_opt(1, &rawopts);
#else
sgbuf.sg_flags=rawflags;
stty(1, &sgbuf);
#endif
#endif
entty();
}
cooktty()
{
#ifdef USG
ioctl(1, TCSETA, &cookedbuf);
#else
#ifdef OSK
_ss_opt(1, &cookopts);
#else
sgbuf.sg_flags=cookflags;
stty(1, &sgbuf);
#endif
#endif
extty();
}
#ifdef OSK
int signhndl(signum)
int signum;
{
switch (signum)
{
case 2: intrup=1; break;
case 3: intrup=1; break;
default: break;
}
}
#else
intr()
{
int intr();
signal(SIGINT, intr);
intrup=1;
bell();
}
#endif
#ifdef BSD
stop()
{
int stop();
signal(SIGTSTP, stop);
intrup=1;
tend();
kill(getpid(), SIGSTOP);
rawtty();
display_up=0;
}
#endif
tend()
{
cmdline();
cooktty();
fflush(stdout);
}
char *
pwd()
#ifdef GETCWD
{
static char mydir[FILENAME+1] = "";
char *getcwd();
return getcwd(mydir, FILENAME);
}
#else
{
static char mydir[FILENAME] = "";
int status;
int pip[2];
int n;
int (*sigs[2])();
sigs[0] = signal(2, 1);
sigs[1] = signal(3, 1);
if(pipe(pip)<0)
return 0;
if(!fork()) {
close(1);
dup(pip[1]);
close(pip[0]);
execl("/bin/pwd", "pwd", 0);
exit(-1);
}
close(pip[1]);
wait(&status);
signal(2, sigs[0]);
signal(3, sigs[1]);
if(status) {
close(pip[0]);
return "/";
}
n = read(pip[0], mydir, FILENAME);
close(pip[0]);
if(n<=0)
return "/";
mydir[n-1] = 0;
return mydir;
}
#endif
browse()
{
int c;
char *env;
if(env=getenv("BROWSE"))
macptr = env;
defmacs();
newdir();
redraw();
ended=0;
do {
if(intrup) {
intrup=0; /* clear interrupt */
cmdline(); /* go to the command line */
outs("Interrupt"); /* let us know about it */
endmac(); /* clear macros */
clearin(); /* and input buffer */
}
here_i_am();
fflush(stdout);
c = getch();
cmd(c);
}
while(!ended);
}
clearin()
{
fseek(stdin, 0L, 1); /* stay here messily */
}
cmd(c)
char c;
{
int i;
if(intrup)
return;
switch(c) {
case ' ':
if(isdir(entries[curr])) {
if(!cd(entries[curr]->e_name))
wperror(entries[curr]->e_name);
} else
if(!macro(c))
bell();
else
cmd(getch());
break;
case '&':
syscom(0);
break;
case SHELLSYM:
syscom(1);
break;
case '=':
todir();
break;
#ifndef OSK
case '?':
sample(entries[curr]->e_name);
break;
#endif
case '[':
define();
break;
#ifdef OSK
case '?':
#else
case 'a':
#endif
assist();
break;
case 'B'-'@':
prev(nlines);
break;
case 'D'-'@':
next(nlines/2);
break;
case 'F'-'@':
next(nlines);
break;
case 'H':
curr=top;
break;
case 'J':
tail();
break;
case 'K':
home();
break;
case 'L'-'@':
redraw();
break;
case 'L':
curr=bottom-1;
break;
case 'M':
definitions();
break;
#ifdef OSK
case '.':
#else
case 'N':
#endif
next(nlines);
break;
#ifdef OSK
case 'o':
#else
case 'P':
#endif
prev(nlines);
break;
case 'R':
move();
break;
case 'S':
savedefs();
break;
case 'I':
installdefs(entries[curr]->e_name);
break;
case 'U'-'@':
prev(nlines/2);
break;
case 'D':
case 'd':
if(getch()==c && !intrup)
remove(c=='D');
else
bell();
break;
case 'h':
ccol=0;
break;
case 'l':
ccol=NCOL;
break;
case '<':
quickmode=1;
if(display_up) {
todump=1;
at(0, 1);
header();
}
break;
#ifndef OSK
case '+': case '^':
addname(c);
break;
case '(':
addperm();
break;
case ')':
delperm();
break;
#endif
case '>':
quickmode=0;
if(display_up) {
todump=1;
at(0, 1);
header();
}
break;
case 'J'-'@':
#ifdef OSK
case ',':
#else
case 'j':
#endif
newline();
break;
case 'K'-'@':
#ifdef OSK
case 'i':
#else
case 'k':
#endif
upline();
break;
case 'n':
next(nlines/2);
break;
case 'p':
prev(nlines/2);
break;
case 'q': case 'Z': case 'Q':
if(getchar()==c && !intrup)
ended=1;
else
bell();
break;
case 'r':
reload();
break;
case 't':
tag();
break;
case 'T': case 'U':
tag_all(c=='T');
break;
case 'x':
hexdump();
break;
default:
if(!macro(c))
bell();
else
cmd(getch()); /* make sure it does something */
} /* and thus avoid unneeded redraws */
}
cmdline()
{
at(0, li-1);
outs(ce);
fflush(stdout);
}
newdir()
{
if(display_up)
at(0,0);
fflush(stdout);
dot=pwd();
if(!getdir())
wperror(dot);
curr=0;
top=0;
topline();
if(display_up)
todump=TRUE;
}
reload()
{
getdir();
curr=(curr>=bottom)?bottom-1:curr;
if(display_up) {
topline();
todump=TRUE;
}
}
topline()
{
if(display_up)
at(0,0);
printf("%s: %d files", dot, nentries);
nl();
}
redraw()
{
outs(cl);
display_up=0;
topline();
at(0,1);
header();
todump=1;
display_up=1;
}
dumpdata()
{
at(0,2);
dump(top,bottom);
if(top+nlines>nentries) {
int i;
at(0, bottom-top+2);
for(i=bottom-top; i<nlines; i++) {
outc('~');
nl();
}
}
}
upline()
{
if(curr>0)
curr--;
else bell();
}
home()
{
curr=0;
}
next(l)
{
curr += l;
if(curr>=nentries) curr=nentries-1;
}
prev(l)
{
curr -= l;
if(curr<0) curr=0;
}
tail()
{
curr=nentries-1;
}
newline()
{
if(curr<nentries-1)
curr++;
else
bell();
}
here_i_am()
{
int c;
if(*macptr)
return;
if(todump)
display_up = 1;
if(!display_up) {
cmdline();
statout(entries[curr]->e_name,
&entries[curr]->e_stat,
entries[curr]->e_uname,
entries[curr]->e_gname,
entries[curr]->e_flags);
at(quickmode?1:ccol, li-1);
fflush(stdout);
if((c=getch())=='\n') {
redraw();
here_i_am();
}
else
ungetch(c);
} else if(todump) {
if(!(curr-top > 0 && curr-top < nlines)) {
top = curr-nlines/2;
if(top<0) top=0;
}
dumpdata();
at(quickmode?1:ccol, curr-top+2);
todump=0;
} else {
int lines_to_scroll = curr-top;
if(lines_to_scroll > 0)
if((lines_to_scroll -= nlines-1) < 0)
lines_to_scroll = 0;
if(lines_to_scroll < 1-nlines) {
top=curr;
at(0,2);
dump(top, bottom);
} else if(lines_to_scroll > nlines-1) {
top=curr-nlines+1;
at(0,2);
dump(top, bottom);
} else if(lines_to_scroll) {
scroll(2, nlines+2, lines_to_scroll);
top += lines_to_scroll;
if(lines_to_scroll < 0) {
at(0, 2);
dump(top, top-lines_to_scroll);
} else {
at(0, 2+nlines-lines_to_scroll);
dump(bottom-lines_to_scroll, bottom);
}
}
at(quickmode?1:ccol, curr-top+2);
}
}
bell()
{
outc(7);
}
/* (Never used)
perform(command)
char *command;
{
char cmdbuf[MAXLINE];
cmdline();
extty();
outc('!');
printf(command, entries[curr]->e_name);
sprintf(cmdbuf, command, entries[curr]->e_name);
sys(cmdbuf, 1);
entty();
}
*/
#ifdef OSK
sys(command, rdflag)
int rdflag; /* Should I redraw? */
{
char shellstr[MAXLINE+64];
cmdline(); fflush(stdout);
cooktty();
sprintf(shellstr,"setenv FILE %s;%s %s",
entries[curr]->e_name, SHELL, command);
if(errno=system(shellstr)) perror(shellstr);
getchar();
if(rdflag)
{
redraw(); display_up=1;
}
rawtty();
}
#else
sys(command, rdflag)
char *command;
int rdflag; /* Should I redraw? */
{
char scratch[32];
int status;
int (*sigint)(), (*sigquit)();
char c;
sigint=signal(2, 1);
sigquit=signal(3, 1);
cooktty();
fflush(stdout);
strcpy(scratch, entries[curr]->e_name);
if(!fork()) {
int i;
static char *envp[MAXARGC];
static char env[NCARGS];
char *hold;
char line[MAXLINE];
char *tmp;
signal(2,0);
signal(3,0);
if(!(efp=fopen(efname, "r"))) {
fputc('\n', stderr);
perror(efname);
execl(SHELL, SHELL, "-c", command, 0);
execl("/bin/sh", "sh", "-c", command, 0);
perror("/bin/sh");
exit(-77);
}
i=0;
tmp=hold=env;
while(!feof(efp)) {
fgets(line, MAXLINE, efp);
if(strlen(line)+(tmp-env)>NCARGS)
break;
if(line[0]=='$')
if(tmp>hold) {
envp[i] = hold;
i++;
if(i > MAXARGC-2) break;
tmp[-1]=0; /* eat line-feed at end */
hold = tmp;
}
strcpy(tmp, line+(line[0]=='$'));
tmp += strlen(tmp);
}
if(tmp>hold) {
envp[i] = hold;
i++;
tmp[-1]=0; /* and eat this one as well */
}
sprintf(tmp, "FILE=%s", scratch);
envp[i++]=tmp;
envp[i]=0;
if(rdflag)
putchar('\n');
else
putchar('\r');
fflush(stdout);
execle(SHELL, SHELL, "-c", command, 0, envp);
execle("/bin/sh", "sh", "-c", command, 0, envp);
perror("/bin/sh");
exit(-77);
}
wait(&status);
signal(2, sigint);
signal(3, sigquit);
rawtty();
if(rdflag || status!=0)
display_up=0;
}
#endif
char
inps(buf, text, termin)
char *buf;
char *text;
char termin;
{
int i = 0, j, found_tags;
char c, *ptr, *txp;
txp=text?text:"!";
while(!intrup &&
(fflush(stdout), c=getch()) != '\033' &&
c != '\n' &&
c != termin)
switch(c) {
case '\b':
case '\177':
if(i>0) {
printf("\b \b");
i--;
}
else
bell();
break;
case 'U'-'@':
txp=text?text:"!";
case 'X'-'@':
if(i>0)
while(i>0) {
printf("\b \b");
i--;
}
else
bell();
break;
case 'K'-'@':
if(*txp)
ctloutc(buf[i++] = *txp++);
break;
case '%':
found_tags = 0;
j = 0;
while(j < nentries) {
if(entries[j]->e_flags & FTAGGED) {
found_tags = 1;
if(i+strlen(entries[j]->e_name)+1>=MAXLINE) return '\033';
for(ptr=entries[j]->e_name; *ptr; ptr++)
ctlout(buf[i++] = *ptr);
ctlout(buf[i++] = ' ');
}
j++;
}
if(!found_tags) {
if(i+strlen(entries[curr]->e_name)+1>=MAXLINE) return '\033';
for(ptr=entries[curr]->e_name; *ptr; ptr++)
ctlout(buf[i++] = *ptr);
}
standend();
break;
case '#':
for(ptr=dot; *ptr; ptr++)
{
if(i>=MAXLINE) return '\033';
ctlout(buf[i++] = *ptr);
}
standend();
break;
case '~':
for(ptr=HOME; *ptr; ptr++)
{
if(i>=MAXLINE) return '\033';
ctlout(buf[i++] = *ptr);
}
standend();
break;
case '@':
outc(c);
fflush(stdout);
c = getch();
if(!macro(c)) {
ungetch(c);
buf[i++]='@';
}
else
outs("\b \b");
break;
case '$':
outc(c);
fflush(stdout);
c = getch();
if(c=='$') {
char tmp[10];
sprintf(tmp, "%d", getpid());
outs("\b \b");
for(ptr=tmp; *ptr; ptr++)
{
if(i>=MAXLINE) return '\033';
ctlout(buf[i++] = *ptr);
}
standend();
}
else if(!macbuf[c]) {
ungetch(c);
buf[i++]='$';
}
else {
outs("\b \b");
for(ptr=macbuf[c]; *ptr; ptr++)
{
if(i>=MAXLINE) return '\033';
ctlout(buf[i++] = *ptr);
}
standend();
}
break;
case '!':
while(*txp)
{
if(i>=MAXLINE) return '\033';
ctlout(buf[i++] = *txp++);
}
standend();
break;
case '\\':
outc(c);
fflush(stdout);
c=getch();
if(c=='~' || c=='%' || c=='#' ||
c=='\\' || c=='!' ||
c=='K'-'@' || c=='U'-'@' || c=='X'-'@' ||
c=='\b' || c=='\177' ||
c==termin || c=='\033' || c=='\n' ||
c=='@' || c=='$') {
outc('\b');
ctloutc(buf[i++]=c);
break;
}
else if(c>='0' && c<='7') {
int n, val=0;
for(n=0; n<3 && c>='0' && c<='7'; n++) {
val = val*8 + c-'0';
outc('\b');
ctloutc(val);
c=getch();
}
ungetch(c);
c=buf[i++]=val;
break;
}
else if(c=='^') {
outc('\b');
outc('^');
fflush(stdout);
c=getch();
if(c>='?'&&c<='_') {
outc('\b');
ctloutc(buf[i++]=(c-'@')&'\177');
break;
}
else if(c>='`'&&c<='~') {
outc('\b');
ctloutc(buf[i++]=c-'`');
break;
} /* otherwise default */
else buf[i++]='^'; /* after adding caret */
} /* otherwise fall through to default */
else buf[i++]='\\'; /* after adding backslash */
default:
if(i>=MAXLINE) return '\033';
ctloutc(buf[i++] = c);
break;
}
buf[i] = 0;
return intrup?'\033':c;
}
ctlouts(s)
char *s;
{
int cnt = 0;
while(*s)
cnt += ctlout(*s++);
cnt += standend();
return cnt;
}
ctloutc(c)
char c;
{
int cnt;
cnt = ctlout(c);
cnt += standend();
return cnt;
}
int somode = 0;
int ulmode = 0;
standout()
{
if(!somode) {
outs(so);
somode = 1;
if(xn) return 1;
}
return 0;
}
underline()
{
if(!ulmode) {
outs(us);
ulmode = 1;
if(xn) return 1;
}
return 0;
}
standend()
{
int cnt = 0;
if(somode) {
outs(se);
somode = 0;
if(xn) cnt++;
}
if(ulmode) {
outs(ue);
ulmode = 0;
if(xn) cnt++;
}
return cnt;
}
ctlout(c)
char c;
{
int cnt = 0;
if(c&'\200') {
cnt += underline();
cnt += ctlout(c&'\177');
return cnt;
}
else if(c<' ' || c=='\177') {
cnt += standout();
outc((c+'@')&'\177');
cnt++;
return cnt;
}
else {
cnt += standend();
outc(c);
cnt++;
return cnt;
}
}
todir()
{
char cmdbuf[MAXLINE];
static char lastdir[MAXLINE] = ".";
char *slash, *rindex();
cmdline();
printf("goto ");
if(inps(cmdbuf, lastdir, 0)!='\033' && cmdbuf[0]) {
strcpy(lastdir, cmdbuf);
if(!cd(cmdbuf, 0)) {
if(!fgoto(cmdbuf))
if(slash=rindex(cmdbuf, '/')) {
*slash++=0;
if(cd(cmdbuf, 1)) {
if(!fgoto(slash)) {
errno=0;
xerrno=NOMATCH;
wperror(slash);
}
} else
wperror(cmdbuf);
} else
wperror(cmdbuf);
}
}
else
killcmd();
}
fgoto(file)
char *file;
{
int i;
for(i = 0; i<nentries; i++)
if(match(entries[i]->e_name, file)) {
curr=i;
return 1;
}
return 0;
}
match(target, sample)
char *target, *sample;
{
while(*sample && *target==*sample) {
target++;
sample++;
}
return !*sample;
}
killcmd()
{
if(!intrup) {
cmdline();
printf("Command killed");
if(!display_up)
nl();
}
}
cd(dir, flag)
char *dir;
int flag;
{
if(flag) {
cmdline();
#ifdef OSK
printf("cd %s", dir);
}
#else
printf("cd %s\r", dir);
}
else
outc('\r');
#endif
fflush(stdout);
if(
#ifndef OSK
access(dir, 5)==0 &&
#endif
chdir(dir)==0) {
newdir();
return 1;
}
return 0;
}
syscom(rd)
int rd; /* should I redraw? */
{
char buf[MAXLINE];
static char lastcmd[MAXLINE] = "";
char inps();
cmdline();
extty();
putchar(rd?SHELLSYM:'&');
if(inps(buf, lastcmd, 0)=='\033') {
entty();
redraw(); display_up=1;
killcmd();
return;
}
else
strcpy(lastcmd, buf);
sys(buf, rd);
entty();
}
isdir(entry)
struct entry *entry;
{
#ifdef OSK
return((entry->e_stat.st_mode)&S_IFDIR);
#else
return((entry->e_stat.st_mode&S_IFMT)==S_IFDIR);
#endif
}
sample(name)
char *name;
{
int col;
int c, i;
FILE *tfp;
if(!(tfp = fopen(name, "r"))) {
wperror(name);
return;
}
i=0;
do {
cmdline();
col = 0;
for(c=fgetc(tfp); col<72 && !feof(tfp); c=fgetc(tfp))
col+=ctlout(c);
standend();
if(display_up)
outc('\r');
else
outc('\n');
}
while(!feof(tfp) && (i=getch())=='?');
fclose(tfp);
if(i && i!=' ' && i!='q' && i!='?')
ungetch(i);
}
macro(c)
char c;
{
if(c==NOMAC)
return 0;
else if(!macbuf[c])
return 0;
else if(c==c_macro) {
cmdline();
printf("Recursive macro.");
endmac();
return 0;
}
else {
c_macro = c;
macptr = macbuf[c];
return 1;
}
}
getch()
{
char c;
if(ungetptr>ungetbuf)
return *--ungetptr;
if(*macptr)
if(*macptr=='\007') {
macptr++;
if(*macptr!='\007')
return getchar();
else {
if((c=getchar()) != '\n')
macptr--;
else
macptr++;
return (c=='\n')?getch():c;
}
}
else if(*macptr=='\\') {
if(macptr[1]=='\007')
macptr++;
return *macptr++;
}
else
return *macptr++;
else {
endmac();
return getchar();
}
}
endmac() {
c_macro=NOMAC;
macptr="";
}
ungetch(c)
char c;
{
if(ungetptr-ungetbuf>SMALLBUF)
return;
*ungetptr++=c;
}
define()
{
int c;
char buf[SMALLBUF];
cmdline();
fflush(stdout);
printf("define ");
c = getch();
if(intrup)
return;
ctloutc(c);
printf(" as [");
if(inps(buf, macbuf[c], ']')=='\033') {
killcmd();
return;
}
printf("]");
defent(c, buf);
}
defent(c, buf)
char c;
char *buf;
{
if(macbuf[c])
free(macbuf[c]);
if(!buf[0]) {
macbuf[c]=0;
return;
}
macbuf[c] = (char *)malloc(strlen(buf)+1);
if(!macbuf[c]) {
cmdline();
printf("No room");
return;
}
strcpy(macbuf[c], buf);
}
defmacs()
{
#ifdef OSK
defent(' ', "$more %\n");
defent('%', "$%\n");
defent('s', "$scred %\n");
defent('b', "=..\n");
defent('c', "$copy % ");
#else
defent('/', "=/");
defent('.', "=.");
defent(' ', "!more %\n");
defent('%', "!%\n");
defent('$', "!vi /tmp/br.env.$$\n");
defent('v', "!vi %\n");
#endif
defent('~', "=~\n");
}
definitions()
{
int i;
cmdline();
for(i=0; i<CHARSET; i++)
if(macbuf[i]) {
printf("define ");
ctloutc(i);
printf(" as [");
ctlouts(macbuf[i]);
printf("]\n");
}
getchar();
redraw(); display_up=1;
}
savedefs()
{
int i;
char filename[MAXLINE];
static char lastfile[MAXLINE] = SAVEMACROS;
FILE *fp;
cmdline();
outs("Save macros as ");
if(inps(filename, lastfile, '\033')=='\033') {
killcmd();
return;
}
strcpy(lastfile, filename);
if(!(fp = fopen(filename, "w"))) {
wperror(filename);
return;
}
for(i=1; i<CHARSET; i++)
if(macbuf[i])
fprintf(fp, "[%c%s]\n", i, macbuf[i]);
fclose(fp);
}
installdefs(s)
char *s;
{
FILE *fp;
char macc,macs[80],*macp,firstchar;
if((fp=fopen(s,"r"))==NULL)
{
wperror(s); return;
}
cmdline(); firstchar=(char)fgetc(fp);
while(!feof(fp))
{
if(firstchar!='[')
{
printf("illegal syntax in '%s'",s);
fflush(stdout); break;
}
macc=fgetc(fp); macp=macs;
do *(macp++)=(char)fgetc(fp);
while(*(macp-1)!=']' && *(macp-1)!=-1);
if(*(macp-1)!=']')
{
printf("illegal syntax in '%s'",s);
fflush(stdout); break;
}
*(macp-1)='\0';
cmdline(); printf("define "); ctloutc(macc); printf(" as [");
ctlouts(macs); printf("]\n");
fflush(stdout);
defent(macc, macs); fgetc(fp);
firstchar=(char)fgetc(fp);
}
getchar(); fclose(fp);
redraw(); display_up=1;
}
#ifndef OSK
dumpenv(envp)
char **envp;
{
if(!(efp=fopen(efname, "w"))) {
fperror(efname);
exit(-1);
}
while(*envp)
fprintf(efp, "$%s\n", *envp++);
fflush(efp);
fclose(efp);
}
#endif
#ifdef OSK
link(str1,str2)
char *str1,*str2;
{
char shellstr[80];
sprintf(shellstr,"copy %s %s",str1,str2);
return(system(shellstr));
}
#ifndef LINT
int super()
{
#asm
move.l #0,errno(a6)
moveq.l #0,d1
os9 F$SUser
bcc.s NoErr
move.w d1,errno(a6)
NoErr
# endasm
if(errno) return(FALSE); else return(TRUE);
}
#endif
#endif
SHAR_EOF
fi
exit 0
# End of shell archive