# This is the sam package. # To extract it, run /bin/sh on the part below --Cut Here-- # in a directory where the directory . exists # or can be made with mkdir. # #--Cut Here-- if test -d . ; then echo . exists else echo mkdir .; mkdir . ; fi if test -d ./doc ; then echo ./doc exists else echo mkdir ./doc; mkdir ./doc ; fi if test -d ./include ; then echo ./include exists else echo mkdir ./include; mkdir ./include ; fi if test -d ./libXg ; then echo ./libXg exists else echo mkdir ./libXg; mkdir ./libXg ; fi if test -d ./libframe ; then echo ./libframe exists else echo mkdir ./libframe; mkdir ./libframe ; fi if test -d ./sam ; then echo ./sam exists else echo mkdir ./sam; mkdir ./sam ; fi if test -d ./samterm ; then echo ./samterm exists else echo mkdir ./samterm; mkdir ./samterm ; fi echo ./version sed s/.// > ./version <<'//GO.SYSIN DD ./version' -Version 4.3 built Fri Dec 23 13:33:27 EST 1994 //GO.SYSIN DD ./version echo ./README sed s/.// > ./README <<'//GO.SYSIN DD ./README' - - * The authors of this software are Rob Pike and Howard Trickey. - * Copyright (c) 1992 by AT&T. - * Permission to use, copy, modify, and distribute this software for any - * purpose without fee is hereby granted, provided that this entire notice - * is included in all copies of any software which is or includes a copy - * or modification of this software and in all copies of the supporting - * documentation for such software. - * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR AT&T MAKE ANY - * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY - * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. - -This is an X11 version of Rob Pike's editor, sam. Documentation describing -its use and construction are provided in subdirectory doc. The file doc/sam.1 -contains the manual page; doc/sam.tut.ms is a tutorial that can be -formatted with troff -ms. It substitutes Bold and Italics for the -fonts named CW and CS; if your system has these fonts, remove the -CW and CS macros at the beginning of the file. The files doc/sam.ps -and doc/se.ps are postscript versions of published papers describing -sam and structural regular expressions. These papers reflect sam's -capabilities at the time of publication several years ago; while the -general description remains accurate, some functions may have changed -or been removed. Other files in the doc directory contain manual pages -for the library packages used by sam. - -Sam is composed of two programs: sam itself, which does the command processing -and file manipulation; and samterm, which controls the display and -interacts with the user. You can run sam on one machine and samterm on another -connected via remote execution. - -This version of sam is based on the Plan 9 implementation. Its -design and expression reflect the functionality of the Plan 9 environment; -most notably, characters are represented internally by 16-bit values called -Runes. Header files include/u.h and include/libc.h and source files -libframe/misc.c, libXg/rune.c, sam/unix.c and samterm/unix.c contain -code that insinuates sam into the Unix world. Two other files, -sam/plan9.c and samterm/plan9.c, contain Plan 9-specific code; they -are not used in the Unix version of sam and are provided as examples -of the Plan 9 interface. - -Sam requires an ANSI/POSIX-compatible C compiler and libraries. We have -found that some commercial compilers which claim to meet this standard are -deficient. For our sanity, we only port sam to the standard; it is up to -you to modify it for non-standard aspects of your local environment. -Hints for some non-standard systems are provided at the end of this file. -The handling of varargs is the source of many porting problems. We advise -you to inspect the functions dprint and fprint in the files sam/unix.c and -libframe/misc.c to ensure the accuracy of the implementation. We also -encourage you to look at function newtmp() in sam/unix.c which creates -a sam temporary file. We prefer to use the tempnam() function; it allows -us to select the directory where the temp file is placed, a useful -optimization for systems with small local disks. However, tempnam() is -not a POSIX function, so you may have to use tmpfile() or a similar -function to create the temporary file. - -The typedefs for uchar, ushort, and ulong defined in include/u.h, may conflict -with exisiting definitions in include file on some systems. -If this occurs, remove the offending definitions from include/u.h. - -The distribution consists of six directories: - - sam - The source for sam. It loads against libXg to pick - up some utility routines. - - samterm - The source for samterm. It loads against libframe, - libXg, and your local X11 libraries. - - libframe - The source for the frame library. This library is used - by samterm so it must be made first. - - libXg - The source code of the graphics library and some general - utility modules. Header file u.h provides much of the - interface between sam and the local environment. It is - included in every source file. Sam's graphics - operations are implemented by Plan 9 libg functions. This - library emulates those functions using X11 operations. - You might find libXg to be independently useful to tame the - horrors of X11 programming. You can put it anywhere; the - samterm makefiles assume it is in ../libXg. libXg must - be made first. - - include - header files. - - doc - The documentation for sam and the libraries. - -Each source directory contains makefiles for several typical architectures. -The master makefile in the top directory builds the subdirectories in -proper order. - -Most customization effort is confined to configuring the makefiles. -You can usually minimize your work by copying the makefile for -your architecture to Makefile and then editing a couple of lines. -For example, to install sam on a Sun, go to each source subdirectory, -copy Make.sun to Makefile, and customize each Makefile. - -Most of the time only the makefiles need configuration. Occasionally, it may -be necessary to twiddle some of the macros and pre-processor magic in -include/u.h or include/libc.h. In unusual cases, you may have to massage -system-dependent code in files libXg/misc.c, sam/unix.c, or samterm/unix.c. -Of course, systems with non-standard compilers or libraries may require -minor modifications to any or all of the source files. - -Variables in each makefile define most configuration-dependent parameters; each -is explained by a comment in the makefile. The RSAMNAME variable in -sam/Makefile contains the name of the sam executable; this is only used when -executing sam remotely. If sam is stored in the same path on every machine in -your network or you use symbolic links to make it look like it is, this variable -should specify the full path name of the executable. If sam resides in various -directories on different machines, you've got a problem. The best strategy is to -simply set the name of the file containing sam (usually, "sam") without a path -component and rely on the users to set the directory in their PATH on the remote -system. Unfortunately, this fails when the Berkeley rsh is used as the remote -execution agent because it neglects to evaluate the user's profile in some -situations. - -If a sam session terminates abnormally, sam creates a shell script named -sam.save in the user's home directory. When this file is executed, it asks -the user about each file and restores those selected. The files are restored -with the names as they were known to sam; usually you will want to move -sam.save to the last directory you had changed to in sam and restore the files -from that point. The restoration script relies on a second script provided -in sam/samsave. The SAMSAVEDIR variable in the sam Makefile contains the name -of a directory to hold this script. The SAMSAVE variable contains the shell -command to unpack each file; the command works with both the Bourne shell or -Tom Duff's 'rc'. - -After configuring the makefiles, change to the top-level directory and -type "make". Typing "make install" installs sam, samterm and samsave in -their permanent homes. - -During testing, the path of samterm may be specified using the -t command line -option to sam. Similarly, the path of sam itself may be specified using the --s command line option; this is handy for testing the remote execution feature. - -You may want to install Sam.ad as "Sam" in the system application -defaults library (which will have some name like /usr/lib/X11/app-defaults) -or your own home directory, if you don't have permission to write in -app-defaults. Sam.ad can be edited to give default values for things -like the starting height and width, the font, and the foreground and -background colors. Currently, only the -geom X11 parameter can be -specified on the command line. New X11 parameters can be easily added -by including the first character of the parameter in the switch statement -in main() in file sam/sam.c. Valid parameter strings are passed to -samterm and then directly to X11 for interpretation. - -The scripts 'B.sh' and and 'B.rc' for the Bourne Shell and 'rc', respectively, -send a 'B' command to a runninng instance of sam and optionally position the -file to a selected line. The scripts are located in the sam subdirectory; -install one or both in the appropriate directory depending on the conventions -of your site. There is no installation target for them in the makefiles. -These commands require a POSIX-compliant named pipe facility; if your -system lacks this capability, replace the code in exstart() in -samterm/unix.c with a 'return' statement and throw away B.sh and B.rc. - -We have successfully made this distribution for IRIX 4.0.1, SunOs 4.1.1 -and Mips 4.5.2 at our site. Additionally, Rich Salz, Dan McDonald, -Alain Kagi and Ed Kubaitis have contributed prototype makefiles for -other architectures. We are unable to test and verify them but -they provide a good starting point for customizing a makefile. - -The original protocol between sam and samterm assumed that memory addresses -and longs were 32 bits. Dave Hanson removed this dependency from the -protocol allowing sam to run on 64-bit processors. However, other -dependencies on structure alignment remain. If you are installing sam -on a processor with 64-bit addresses, please read the comment immediately -preceding the declaration of the Block data structure in file sam/sam.h -(at approximately line 85), and fiddle with the declaration appropriately. - -Rob Pike designed and implemented the original Unix version of sam and the -current version ported from Plan 9. Howard Trickey provided the X -version of the graphics library, libXg. Matty Farrow and his colleagues -at the University of Sydney extended libXg to support Runes. Boyd Roberts -supplied the external command interface and the shell scripts for -the 'B' command. Doug Gwyn contributed many useful ideas to the X -implementation of sam. James Clark provided the simulations of the V10 -Unix Man macros at the beginning of each manual page. - -Matty Farrow of the University of Sydney has implemented 9term, an X11 -version of a Plan 9 window. It is available via anonymous FTP from -ftp.cs.su.oz.au in directory /matty/unicode. Chris Siebenmann of the University -of Toronto runs the sam-fans mailing list, a source of tips, bug patches, -controversy and gossip among sam users. Send your e-mail address to -sam-fans-request@hawkwind.utcs.toronto.edu to enroll in the list. - -Andrew Hume has written tcs, a Unix utility which converts input -text in one user-specified character set to output text in another -user-specified character set. It is useful for converting text represented -in a variety of standard character set encodings to UTF, the standard -character set accepted by sam. The tcs source package is available -via ftp in file dist/tcs.shar.Z on research.att.com. - -In general, we are uninterested in adding further capabilities to sam; we -provide the source to allow you to customize it if you wish to "improve" it. -Please send bug fixes and comments to: - -Bob Flandrena, bobf@research.att.com - ------------------------------------------------------------------------------------ - Following are modifications necessary to paper over compiler or - library deficiencies to complying with the ANSI/POSIX standard. Please - inform us of any other changes. ------------------------------------------------------------------------------------ - - SUNOS Release 4.1.1 - -The implementation of realloc does not conform to ANSI semantics. -Sam assumes - - realloc(0, n); - -is equivalent to malloc(n). Replace each occurrence of - - p = realloc(p, n); - -with: - p = ((p == 0) ? malloc(n) : realloc(p, n)); - -or something equivalent. Several files that include the X11 -Intrinsics header file must have the variable SYSV defined -before the inclusion. The shell script sun.ed attempts to -automatically apply these patches when run from the top directory. - -Older versions of gcc lack the '-fno-builtin'. If this describes -your site, remove the flag from the CFLAGS variable in Make.sun. - -Because the standard Sun compiler is not Ansi-compatible, frantic -Sun users have been forced to cobble together their own compiling -environment. Unfortunately, the resulting system configurations -have little in common and it is virtually impossible to provide a -universal build procedure. We suggest the use of gcc or lcc; other -than that, Sun users are, as always, in the dark and on their own. - ------------------------------------------------------------------------------------ - - MIPS OS Release 4.5.2 - (and DEC ULTRIX Version 4.2A) - -There are two major deficiencies with the Mips implementation: the use of the -old System V implementation of varargs and a compiler bug that botches the -parsing of certain typedeffed parameters in function prototypes. - -The following changes are required: - -In sam/unix.c, replace function dprint with the following code: - void - dprint(char *fmt, int va_alist) - va_dcl - { - va_list args; - char buf[BLOCKSIZE]; - - va_start(args); - vsprintf(buf, fmt, args); - termwrite(buf); - va_end(args); - } - -In libframe/misc.c, replace function fprint with the following code: - void - fprint(int fd, char *fmt, int va_alist) - va_dcl - { - va_list args; - char buf[2048]; /* pick reasonable blocksize */ - - va_start(args); - vsprintf(buf, fmt, args); - write(fd, buf, strlen(buf)); - va_end(args); - } - -In samterm/flayer.h, replace the declaration of the member named -textfn (near line 20) in structure Flayer, currently declared as: - - Rune *(*textfn)(Flayer*, long, ulong*); - -with - Rune *(*textfn)(Flayer*, long, unsigned long*); - -In sam/parse.h, replace the declaration of the member named fn -(near line 46) in structure cmdtab, currently declared as: - - int (*fn)(File*, Cmd*); /* function to call with parse tree */ -with - int (*fn)(File*, struct Cmd*); /* function to call with parse tree */ - -In sam/sam.h, replace the declaration of function dprint (near line 245) with: - - void dprint(); - -In include/libc.h, replace the declaration of function fprint (near line 53) with: - - void fprint(); - -Near line 71 of samterm/samterm.h, change the declaration of function gettext from: - - Rune *gettext(Flayer*, long, ulong*); -to - Rune *gettext(Flayer*, long, unsigned long*); - -The shell script mips.ed attempts to automatically apply these patches when -run from the top directory. - ------------------------------------------------------------------------------------ - - Convex ConvexOS 9.1 - -In libXg/latin1.c, the Convex compiler requires room for a NULL at the end -of the 2-byte character field in struct latin. This can be fixed by -changing the dimension of the character array named 'c' near line 6 to -3 from 2. This bug appears to be fixed in the compiler for Release 10.1. - ------------------------------------------------------------------------------------ - - Sequent PTX V2.0.3 - -The calls to _exits() in sam/io.c near lines 184 and 205 clash with the -prototype for a system function of the same name. Replace the statements - - _exits("damn"); -with - _exits('d'); - ------------------------------------------------------------------------------------ - - IBM AIX V3.2.3 - -AIX xlc V1.2.1 generates bad code in the second call to border() -in samterm/flayer.c:flborder() causing a core dump. Fix is to -upgrade to later version of xlc (V1.2.1.4). Or, compile -samterm/flayer.c (at least) with '-O'. //GO.SYSIN DD ./README echo ./boilerplate sed s/.// > ./boilerplate <<'//GO.SYSIN DD ./boilerplate' - -/* - * The authors of this software are Rob Pike and Howard Trickey. - * Copyright (c) 1992 by AT&T. - * Permission to use, copy, modify, and distribute this software for any - * purpose without fee is hereby granted, provided that this entire notice - * is included in all copies of any software which is or includes a copy - * or modification of this software and in all copies of the supporting - * documentation for such software. - * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR AT&T MAKE ANY - * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY - * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. - */ //GO.SYSIN DD ./boilerplate echo ./sam/samsave sed s/.// > ./sam/samsave <<'//GO.SYSIN DD ./sam/samsave' -#!/bin/sh -# Copyright (c) 1992 AT&T - All rights reserved. -PATH=/bin:/usr/bin -file=$1 -case "$2" in --f) echo "$file" - cat > $file - ;; -"") echo "$file?" - read yn < /dev/tty - case "$yn" in - [Yy]*) cat > $file - esac -esac //GO.SYSIN DD ./sam/samsave echo ./sam/B.sh sed s/.// > ./sam/B.sh <<'//GO.SYSIN DD ./sam/B.sh' -#!/bin/sh - -files= -line="none" - -if [ $# = 0 ]; then - echo 'usage: B [-nnnn] files...' 1>&2 - exit 1 -fi - -dir=`/bin/pwd` -if [ "$USER" = "" ]; then - USER=$LOGNAME -fi -pipe=/tmp/.sam.$USER - -case "$DISPLAY" in - *:[0-9]*\.[0-9]*) - pipe=$pipe.$DISPLAY - if [ ! -r $pipe ]; then - pipe=`echo $pipe | sed 's/\.[0-9]*$//'` - fi - ;; - *:[0-9]*) - pipe=$pipe.$DISPLAY - if [ ! -r $pipe ]; then - pipe=$pipe.0 - fi - ;; - "") - ;; - *) pipe=$pipe.$DISPLAY - ;; -esac -if [ ! -r $pipe ]; then - echo `basename $0`": No pipe \""$pipe"\" to sam." 1>&2 - exit 1 -fi - -for i in $* -do - case "$i" in - /*) files="$files $i" - ;; - -*) line=`echo $i | sed 's/.//'` - ;; - *) files="$files $dir/$i" - ;; - esac -done - -echo "B $files" >> $pipe -if [ $line != "none" ]; then - echo $line >> $pipe -fi - //GO.SYSIN DD ./sam/B.sh echo ./sam/B.rc sed s/.// > ./sam/B.rc <<'//GO.SYSIN DD ./sam/B.rc' -#!/bin/rc - -files=() -line='' - -if (~ $#* 0) { - echo 'usage: B [-nnn] files...' >[1=2] - exit 1 -} - -dir=`{/bin/pwd} - -if (~ $#USER 0) - USER=$LOGNAME -pipe=/tmp/.sam.$USER - -switch($DISPLAY) { - case *:[0-9]*.[0-9]* - pipe=$pipe.$DISPLAY - if (! test -r $pipe) - pipe=`{echo $pipe | sed 's/\.[0-9]*$//'} - case *:[0-9]* - pipe=$pipe.$DISPLAY - if (! test -r $pipe) - pipe=$pipe.0 - case "" - case * - pipe=$pipe.$DISPLAY -} - -if (! test -r $pipe) { - echo `{basename $0}^': No pipe "'$pipe'" to sam.' >[1=2] - exit 1 -} - -for (i) { - switch($i) { - case /* - files = ( $files $i ) - case -* - line = `{echo $i | sed 's/.//'} - case * - files = ( $files $dir/$i ) - } -} - -if (! ~ $#files 0) - echo B $files >> $pipe - -if (! ~ $line '') - echo $line >> $pipe //GO.SYSIN DD ./sam/B.rc echo ./mips.ed sed s/.// > ./mips.ed <<'//GO.SYSIN DD ./mips.ed' -#!/bin/sh - -echo "patching sam/unix.c" -ed sam/unix.c << EOF -/^dprint/,$ c -dprint(char *fmt, int va_alist) -va_dcl -{ - va_list args; - char buf[BLOCKSIZE]; - - va_start(args); - vsprintf(buf, fmt, args); - termwrite(buf); - va_end(args); -} -. -w -q -EOF -echo "patching libframe/misc.c" -ed libframe/misc.c << EOF -/^fprint/,/^}/c -fprint(int fd, char *fmt, int va_alist) -va_dcl -{ - va_list args; - char buf[2048]; /* pick reasonable blocksize */ - - va_start(args); - vsprintf(buf, fmt, args); - write(fd, buf, strlen(buf)); - va_end(args); -} -. -w -q -EOF -echo "patching samterm/flayer.h" -ed samterm/flayer.h << EOF -/ Rune.*\*(\*textfn/s/ulong/unsigned long/ -w -q -EOF -echo "patching sam/parse.h" -ed sam/parse.h << EOF -/ int.*(\*fn)/s/Cmd/struct Cmd/ -w -q -EOF -echo "patching sam/sam.h" -ed sam/sam.h << EOF -/dprint/s/(.*)/()/ -w -q -EOF -echo "patching include/libc.h" -ed include/libc.h << EOF -/fprint/s/(.*)/()/ -w -q -EOF -echo "patching samterm/samterm.h" -ed samterm/samterm.h << EOF -/^Rune.*\*gettext/s/ulong/unsigned long/ -w -q -EOF //GO.SYSIN DD ./mips.ed echo ./sun.ed sed s/.// > ./sun.ed <<'//GO.SYSIN DD ./sun.ed' -#!/bin/sh - -echo "patching sam/unix.c" -ed sam/unix.c << EOF -/ p.*=.*realloc/c - p = p ? realloc(p, n) : malloc(n); -. -w -q -EOF -echo "patching samterm/flayer.c" -ed samterm/flayer.c << EOF -/llist = realloc/c - llist = llist ? realloc(llist, nlalloc*sizeof(Flayer**)) : malloc(nlalloc*sizeof(Flayer**)); -. -w -q -EOF -echo "patching samterm/mesg.c" -ed samterm/mesg.c << EOF -/s1 = realloc/c - s1 = s1 ? realloc(s1, n+1) : malloc(n+1); -. -w -q -EOF -echo "patching libframe/frbox.c" -ed libframe/frbox.c << EOF -/.*f->box.*=.*realloc/c - f->box = f->box ? realloc(f->box, f->nalloc*sizeof(Frbox)) : malloc(f->nalloc*sizeof(Frbox)); -. -w -q -EOF -echo "patching libframe/frinsert.c" -ed libframe/frinsert.c << EOF -/[ ]*pts.*=.*realloc/c - pts = pts ? realloc(pts, (npts+DELTA)*sizeof(pts[0])) : malloc((npts+DELTA)*sizeof(pts[0])); -. -w -q -EOF -for i in 9term/display.c libXg/gwin.c libXg/wrbitmap.c libXg/xtbinit.c -do - echo "patching $i" - ed $i << EOF -/^#include.*Intrinsic/i -#define SYSV -. -/^#include.*Intrinsic/a -#undef SYSV -. -w -q -EOF -done //GO.SYSIN DD ./sun.ed echo ./doc/sam.1 sed s/.// > ./doc/sam.1 <<'//GO.SYSIN DD ./doc/sam.1' -.de F -.B -.if !"\\$1"" \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 -.. -.de L -.B -.if !"\\$1"" \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 -.. -.de FR -.BR "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" -.. -.de LR -.BR "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" -.. -.de CW -.ft B -.. -.\" This is gross but it avoids relying on internal implementation details -.\" of the -man macros. -.de TF -.br -.IP "" \w'\fB\\$1\ \ \fP'u -.PD0 -.. -.de EX -.CW -.nf -.. -.de EE -.fi -.. -.\" delete above this point if your system has F, L, FR, LR, CW and TF macros -.ds a \fR*\ \fP -.TH SAM 1 -.CT 1 editor -.SH NAME -sam \- screen editor with structural regular expressions -.SH SYNOPSIS -.B sam -[ -.I option .\|.\|. -] [ -.I files -] -.PP -.B sam -.B \-r -.I machine -.PP -.B sam.save -.PP -.B B -[ -.BI \-nnnn -] -.I file .\|.\|. -.SH DESCRIPTION -.I Sam -is a multi-file editor. -It modifies a local copy of an external file. -The copy is here called a -.IR file . -The files are listed in a menu available through mouse button 3 -or the -.B n -command. -Each file has an associated name, usually the name of the -external file from which it was read, and a `modified' bit that indicates whether -the editor's file agrees with the external file. -The external file is not read into -the editor's file until it first becomes the current file\(emthat to -which editing commands apply\(emwhereupon its menu entry is printed. -The options are -.TF "\-r machine " -.TP -.B \-d -Do not download the terminal part of -.I sam. -Editing will be done with the command language only, as in -.IR ed (1). -.TP -.BI \-r " machine -Run the host part remotely -on the specified machine, the terminal part locally. -.TP -.BI \-s " file -Start the host part from the indicated file on the -remote host. Only meaningful with the -.BI \-r -option. -.TP -.BI \-t " path -Start the terminal part from the indicated file. -Useful for debugging. -.PP -The standard X11 -.BI \-geom -toolkit option can be used -to select the desired window geometry. -.SS Regular expressions -Regular expressions are as in -.IR regexp (6) -with the addition of -.BR \en -to represent newlines. -A regular expression may never contain a literal newline character. -The elements of regular expressions are: -.TF "[^abc] " -.TP -.B . -Match any character except newline. -.TP -.B \en -Match newline. -.TP -.B \ex -For any character except -.B n -match the character (here -.BR x ). -.TP -.B [abc] -Match any character in the square brackets. -.B \en -may be mentioned. -.TP -.B [^abc] -Match any character not in the square brackets, but never a newline. -Both these forms accept a range of -.SM ASCII -characters indicated by -a dash, as in -.BR a\-z . -.TP -.B ^ -Match the null string immediately after a newline. -.TP -.B $ -Match the null string immediately before a newline. -.PP -Any other character except newline matches itself. -.PP -In the following, -.I r1 -and -.I r2 -are regular expressions. -.TF "r1|r2 " -.TP -.BI ( r1 ) -Match what -.I r1 -matches. -.TP -.IB r1 | r2 -Match what -.I r1 -or what -.IR r2 -matches. -.TP -.IB r1 * -Match zero or more adjacent matches -of -.IR r1 . -.TP -.IB r1 + -Match one or more adjacent matches of -.IR r1 . -.TP -.IB r1 ? -Match zero or one matches of -.IR r1 . -.PP -The operators -.BR * , -.B + -and -.B ? -are highest precedence, then catenation, then -.B | -is lowest. -The empty -regular expression stands for the last complete expression encountered. -A regular expression in -.I sam -matches the longest leftmost substring formally -matched by the expression. -Searching in the reverse direction is equivalent -to searching backwards with the catenation operations reversed in -the expression. -.SS Addresses -An address identifies a substring in a file. -In the following, `character -.IR n ' -means the null string -after the -\%\fIn\fP-th -character in the file, with 1 the -first character in the file. -`Line -.IR n ' -means the -.IR n -th -match, -starting at the beginning of the file, of the regular expression -.LR .*\en? . -(The peculiar properties of a last line without a newline are -temporarily undefined.) -All files always have a current substring, called dot, -that is the default address. -.SS Simple Addresses -.TF ?regexp? -.TP -.BI # n -The empty string after character -.IR n ; -.B #0 -is the beginning of the file. -.TP -.I n -Line -.IR n . -.TP -.BI / regexp / -.PD0 -.TP -.BI ? regexp ? -The substring that matches the regular expression, -found by looking toward the end -.RB ( / ) -or beginning -.RB ( ? ) -of the file, -and if necessary continuing the search from the other end to the -starting point of the search. -The matched substring may straddle -the starting point. -When entering a pattern containing a literal question mark -for a backward search, the question mark should be -specified as a member of a class. -.PD -.TP -.B 0 -The string before the first full line. -This is not necessarily -the null string; see -.B + -and -.B \- -below. -.TP -.B $ -The null string at the end of the file. -.TP -.B . -Dot. -.TP -.B \&' -The mark in the file (see the -.B k -command below). -.TP -\f(CW"\f2regexp\f(CW"\f1\f1 -Preceding a simple address (default -.BR . ), -refers to the address evaluated in the unique file whose menu line -matches the regular expression. -.SS Compound Addresses -In the following, -.I a1 -and -.I a2 -are addresses. -.TF "a1+a2 " -.TP -.IB a1 + a2 -The address -.I a2 -evaluated starting at the end of -.IR a1 . -.TP -.IB a1 \- a2 -The address -.I a2 -evaluated looking in the reverse direction -starting at the beginning of -.IR a1 . -.TP -.IB a1 ,\^ a2 -The substring from the beginning of -.I a1 -to the end of -.IR a2 . -If -.I a1 -is missing, -.B 0 -is substituted. -If -.I a2 -is missing, -.B $ -is substituted. -.TP -.IB a1 ;\^ a2 -Like -.IB a1 ,\^ a2, -but with -.I a2 -evaluated at the end of, and dot set to, -.IR a1 . -.PP -The operators -.B + -and -.B \- -are high precedence, while -.B , -and -.B ; -are low precedence. -.PP -In both -.B + -and -.B \- -forms, if -.I a2 -is a line or character address with a missing -number, the number defaults to 1. -If -.I a1 -is missing, -.L . -is substituted. -If both -.I a1 -and -.I a2 -are present and distinguishable, -.B + -may be elided. -.I a2 -may be a regular -expression; if it is delimited by -.LR ? 's, -the effect of the -.B + -or -.B \- -is reversed. -.PP -It is an error for a compound address to represent a malformed substring. -Some useful idioms: -.IB a1 +\^\- -.RI ( a1 \&\f5\-\^+\fP ) -selects the line containing -the end (beginning) of a1. -.BI 0/ regexp / -locates the first match of the expression in the file. -(The form -.B 0;\^// -sets dot unnecessarily.) -.BI .\^/ regexp /// -finds the second following occurrence of the expression, -and -.BI .\^,\^/ regexp / -extends dot. -.SS Commands -In the following, text demarcated by slashes represents text delimited -by any printable -.SM ASCII -character except alphanumerics. -Any number of -trailing delimiters may be elided, with multiple elisions then representing -null strings, but the first delimiter must always -be present. -In any delimited text, -newline may not appear literally; -.B \en -may be typed for newline; and -.B \e\^/ -quotes the delimiter, here -.LR / . -Backslash is otherwise interpreted literally, except in -.B s -commands. -.PP -Most commands may be prefixed by an address to indicate their range -of operation. -Those that may not are marked with a -.L * -below. -If a command takes -an address and none is supplied, dot is used. -The sole exception is -the -.B w -command, which defaults to -.BR 0\^,\^$ . -In the description, `range' is used -to represent whatever address is supplied. -Many commands set the -value of dot as a side effect. -If so, it is always set to the `result' -of the change: the empty string for a deletion, the new text for an -insertion, etc. (but see the -.B s -and -.B e -commands). -.br -.ne 1.2i -.SS Text commands -.PD0 -.TP -.BI a/ text / -.TP -or -.TP -.B a -.TP -.I lines of text -.TP -.B . -Insert the text into the file after the range. -Set dot. -.TP -.B c\fP -.br -.ns -.TP -.B i\fP -Same as -.BR a , -but -.B c -replaces the text, while -.B i -inserts -.I before -the range. -.TP -.B d -Delete the text in the range. -Set dot. -.TP -.BI s/ regexp / text / -Substitute -.I text -for the first match to the regular expression in the range. -Set dot to the modified range. -In -.I text -the character -.B & -stands for the string -that matched the expression. -Backslash behaves as usual unless followed by -a digit: -.BI \e \^d -stands for the string that matched the -subexpression begun by the -.IR d -th -left parenthesis. -If -.I s -is followed immediately by a -number -.IR n , -as in -.BR s2/x/y/ , -the -.IR n -th -match in the range is substituted. -If the -command is followed by a -.BR g , -as in -.BR s/x/y/g , -all matches in the range -are substituted. -.TP -.BI m " a1 -.br -.ns -.TP -.BI t " a1 -Move the range to after -.I a1 -.RB ( m ), -or copy it -.RB ( t ). -Set dot. -.SS Display commands -.TP -.B p -Print the text in the range. -Set dot. -.TP -.B = -Print the line address and character address of the range. -.TP -.B =# -Print just the character address of the range. -.SS File commands -.TP -.BI \*ab " file-list -Set the current file to the first file named in the list -that -.I sam -also has in its menu. -The list may be expressed -.BI < "shell command" -in which case the file names are taken as words (in the shell sense) -generated by the shell command. -.TP -.BI \*aB " file-list -Same as -.BR b , -except that file names not in the menu are entered there, -and all file names in the list are examined. -.TP -.B \*an -Print a menu of files. -The format is: -.RS -.TF "XorXblankXX" -.TP -.BR ' " or blank" -indicating the file is modified or clean, -.TP -.BR \- " or \&" + -indicating the file is unread or has been read -(in the terminal, -.B * -means more than one window is open), -.TP -.BR . " or blank -indicating the current file, -.TP -a blank, -.TP -and the file name. -.RE -.TP 0 -.BI \*aD " file-list -Delete the named files from the menu. -If no files are named, the current file is deleted. -It is an error to -.B D -a modified file, but a subsequent -.B D -will delete such a file. -.SS I/O Commands -.TP -.BI \*ae " filename -Replace the file by the contents of the named external file. -Set dot to the beginning of the file. -.TP -.BI r " filename -Replace the text in the range by the contents of the named external file. -Set dot. -.TP -.BI w " filename -Write the range (default -.BR 0\^,\^$ ) -to the named external file. -.TP -.BI \*af " filename -Set the file name and print the resulting menu entry. -.PP -If the file name is absent from any of these, the current file name is used. -.B e -always sets the file name, -.B r -and -.B w -do so if the file has no name. -.TP -.BI < " shell-command -Replace the range by the standard output of the -shell command. -.TP -.BI > " shell-command -Sends the range to the standard input of the -shell command. -.TP -.BI | " shell-command -Send the range to the standard input, and replace it by -the standard output, of the -shell command. -.TP -.BI \*a! " shell-command -Run the -shell command. -.TP -.BI \*acd " directory -Change working directory. -If no directory is specified, -.B $HOME -is used. -.PP -In any of -.BR < , -.BR > , -.B | -or -.BR ! , -if the -.I shell command -is omitted the last -.I shell command -(of any type) is substituted. -If -.I sam -is downloaded, -.B ! -sets standard input to -.FR /dev/null , -and otherwise -unassigned output -.RB ( stdout -for -.B ! -and -.BR > , -.B stderr -for all) is placed in -.F $HOME/sam.err -and the first few lines are printed. -.SS Loops and Conditionals -.TP -.BI x/ regexp / " command -For each match of the regular expression in the range, run the command -with dot set to the match. -Set dot to the last match. -If the regular -expression and its slashes are omitted, -.L /.*\en/ -is assumed. -Null string matches potentially occur before every character -of the range and at the end of the range. -.TP -.BI y/ regexp / " command -Like -.B x, -but run the command for each substring that lies before, between, -or after -the matches that would be generated by -.BR x . -There is no default behavior. -Null substrings potentially occur before every character -in the range. -.TP -.BI \*aX/ regexp / " command -For each file whose menu entry matches the regular expression, -make that the current file and -run the command. -If the expression is omitted, the command is run -in every file. -.TP -.BI \*aY/ regexp / " command -Same as -.BR X , -but for files that do not match the regular expression, -and the expression is required. -.TP -.BI g/ regexp / " command -.br -.ns -.TP -.BI v/ regexp / " command -If the range contains -.RB ( g ) -or does not contain -.RB ( v ) -a match for the expression, -set dot to the range and run the command. -.PP -These may be nested arbitrarily deeply, but only one instance of either -.B X -or -.B Y -may appear in a \%single command. -An empty command in an -.B x -or -.B y -defaults to -.BR p ; -an empty command in -.B X -or -.B Y -defaults to -.BR f . -.B g -and -.B v -do not have defaults. -.SS Miscellany -.TP -.B k -Set the current file's mark to the range. Does not set dot. -.TP -.B \*aq -Quit. -It is an error to quit with modified files, but a second -.B q -will succeed. -.TP -.BI \*au " n -Undo the last -.I n -(default 1) -top-level commands that changed the contents or name of the -current file, and any other file whose most recent change was simultaneous -with the current file's change. -Successive -.BR u 's -move further back in time. -The only commands for which u is ineffective are -.BR cd , -.BR u , -.BR q , -.B w -and -.BR D . -.TP -(empty) -If the range is explicit, set dot to the range. -If -.I sam -is downloaded, the resulting dot is selected on the screen; -otherwise it is printed. -If no address is specified (the -command is a newline) dot is extended in either direction to -line boundaries and printed. -If dot is thereby unchanged, it is set to -.B .+1 -and printed. -.PD -.SS Grouping and multiple changes -Commands may be grouped by enclosing them in braces -.BR {} . -Commands within the braces must appear on separate lines (no backslashes are -required between commands). -Semantically, an opening brace is like a command: -it takes an (optional) address and sets dot for each sub-command. -Commands within the braces are executed sequentially, but changes made -by one command are not visible to other commands (see the next paragraph). -Braces may be nested arbitrarily. -.PP -When a command makes a number of changes to a file, as in -.BR x/re/c/text/ , -the addresses of all changes to the file are computed in the original file. -If the changes are in sequence, -they are applied to the file. -Successive insertions at the same address are catenated into a single -insertion composed of the several insertions in the order applied. -.SS The terminal -What follows refers to behavior of -.I sam -when downloaded, that is, when -operating as a display editor on a bitmap display. -This is the default -behavior; invoking -.I sam -with the -.B \-d -(no download) option provides access -to the command language only. -.PP -Each file may have zero or more windows open. -Each window is equivalent -and is updated simultaneously with changes in other windows on the same file. -Each window has an independent value of dot, indicated by a highlighted -substring on the display. -Dot may be in a region not within -the window. -There is usually a `current window', -marked with a dark border, to which typed text and editing -commands apply. -The escape key (ESC) selects (sets dot to) text typed -since the last mouse button hit. -.PP -The button 3 menu controls window operations. -The top of the menu -provides the following operators, each of which uses one or -more cursors to prompt for selection of a window or sweeping -of a rectangle. -.TF "reshape " -.TP -.B new -Create a new, empty file: -Depress button 3 where one corner of the new rectangle should -appear (box cursor), and move the mouse while holding down button 3 to the -diagonally opposite corner. -`Sweeping' a null rectangle gets a large window, disjoint -from the command window or the whole sam window, depending on -where the null rectangle is. -.TP -.B xerox -Create a copy of an existing window. -After selecting the window to copy with button 1, -sweep out the window for the copy. -.TP -.B reshape -Change the size and location of a window. -First click button 3 in the window to be changed -(gunsight cursor). -Then sweep out a window as for the -.B new -menu selection. -.TP -.B close -Delete the window. -In the last window of a file, -.B close -is equivalent to a -.B D -for the file. -.TP -.B write -Equivalent to a -.B w -for the file. -.PD -.PP -Below these operators is a list of available files, starting with -.BR ~~sam~~ , -the command window. -Selecting a file from the list makes the most recently -used window on that file current, unless it is already current, in which -case selections cycle through the open windows. -If no windows are open -on the file, the user is prompted to open one. -Files other than -.B ~~sam~~ -are marked with one of the characters -.B \-\^+* -according as zero, one, or more windows -are open on the file. -A further mark -.L . -appears on the file in the current window and -a single quote, -.BR ' , -on a file modified since last write. -.PP -The command window, created automatically when -.B sam -starts, is an ordinary window except that text typed to it -is interpreted as commands for the editor rather than passive text, -and text printed by editor commands appears in it. -There is an `output point' that separates commands being typed from -previous output. -Commands typed in the command window apply to the -current open file\(emthe file in the most recently -current window. -.SS Manipulating text -Typed characters replace the current selection (dot) in the current -window. -Backspace deletes the previous character. -Escape selects (sets dot to) everything typed since the last mouse hit. -.PP -Button 1 changes selection. -Pointing to a non-current window with button 1 makes it current; -within the current window, button 1 selects text, thus setting dot. -Double-clicking selects text to the boundaries of words, lines, -quoted strings or bracketed strings, depending on the text at the click. -.PP -Button 2 provides a menu of editing commands: -.TF "/regexp" -.TP -.B cut -Delete dot and save the deleted text in the snarf buffer. -.TP -.B paste -Replace the text in dot by the contents of the snarf buffer. -.TP -.B snarf -Save the text in dot in the snarf buffer. -.TP -.B look -Search forward for the next occurrence of the literal text in dot. -If dot is the null string, the text in the snarf buffer is -used. -The snarf buffer is unaffected. -.TP -.B -Exchange the snarf buffer with the current selection in another X11 window. -The exchange of a large amount of selected text is truncated to the -size of Sam's internal snarf buffer (currently 4K) without warning. -.TP -.BI / regexp -Search forward for the next match of the last regular expression -typed in a command. -(Not in command window.) -.TP -.B send -Send the text in dot, or the snarf buffer if -dot is the null string, as if it were typed to the command window. -Saves the sent text in the snarf buffer. -(Command window only.) -.PD -.SS X11 resources -Various attributes of -.I sam -can be set by giving values to X11 resources for the class -.B Sam. -There are various ways to do this; one is to have a file -called -.B Sam -in your home directory, with entries in it like: -.PP -.CW -.nf - Sam*width: 500 - Sam*height: 600 - Sam*font: fixed - Sam*scrollForwardR: true -.fi -.PP -In addition to the usual X11 toolkit resources, the -.B scrollForwardR -resource says where the right button (button 3) scrolls -forward or backward in the file. -.SS Abnormal termination -If -.I sam -terminates other than by a -.B q -command (by hangup, deleting its window, etc.), modified -files are saved in an -executable file, -.FR $HOME/sam.save . -This program, when executed, asks whether to write -each file back to a external file. -The answer -.L y -causes writing; anything else skips the file. -If a machine crash prevents the creation of a -.F sam.save -file, all changes are lost. -If an editing session is difficult to replicate, -you should write your changed files often. -.PP -.I B -is a shell-level command that causes an instance of -.I sam -running on the same terminal to load the named -.I files. -The option allows a line number to be specified for -the initial position to display in the last named file. -.SH FILES -.F $HOME/sam.save -.br -.F $HOME/sam.err -.br -.B /samsave -the program called to unpack -.BR $home/sam.save . -.SH SEE ALSO -.IR ed (1), -.IR regexp (6) -.SH BUGS -.PP -When a sam window is resized, the command window may have the wrong size. //GO.SYSIN DD ./doc/sam.1 echo ./doc/sam.tut.ms sed s/.// > ./doc/sam.tut.ms <<'//GO.SYSIN DD ./doc/sam.tut.ms' -.de P1 -.KS -.DS -.ft CW -.ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n 70n 75n 80n -.. -.de P2 -.ft 1 -.DE -.KE -.. -.de CW -.lg 0 -\%\&\\$3\fB\\$1\fP\&\\$2 -.lg -.. -.de WC -.lg 0 -\%\&\\$3\fI\\$1\fP\&\\$2 -.lg -.. -.TL -A tutorial for the -.CW sam -.B -command language -.AU -Rob Pike -.AI -.MH -.AB -.CW sam -is an interactive text editor with a command language that makes heavy use -of regular expressions. -Although the language is syntactically similar to -.CW ed (1), -the details are interestingly different. -This tutorial introduces the command language, but does not discuss -the screen and mouse interface. -With apologies to those unfamiliar with the Ninth Edition Blit software, -it is assumed that the similarity of -.CW sam -to -.CW mux (9) -at this level makes -.CW sam 's -mouse language easy to learn. -.PP -The -.CW sam -command language applies identically to two environments: -when running -.CW sam -on an ordinary terminal -(\f2via\f1\f1 -.CW sam\ -d ), -and in the command window of a -.I downloaded -.CW sam , -that is, one using the bitmap display and mouse. -.AE -.SH -Introduction -.PP -This tutorial describes the command language of -.CW sam , -an interactive text editor that runs on Blits and -some computers with bitmap displays. -For most editing tasks, the mouse-based editing features -are sufficient, and they are easy to use and to learn. -.PP -The command language is often useful, however, particularly -when making global changes. -Unlike the commands in -.CW ed , -which are necessary to make changes, -.CW sam -commands tend to be used -only for complicated or repetitive editing tasks. -It is in these more involved uses that -the differences between -.CW sam -and other text editors are most evident. -.PP -.CW sam 's -language makes it easy to do some things that other editors, -including programs like -.CW sed -and -.CW awk , -do not handle gracefully, so this tutorial serves partly as a -lesson in -.CW sam 's -manner of manipulating text. -The examples below therefore concentrate entirely on the language, -assuming that facility with the use of the mouse in -.CW sam -is at worst easy to pick up. -In fact, -.CW sam -can be run without the mouse at all (not -.I downloaded ), -by specifying the -.CW -d -flag, and it is this domain that the tutorial -occupies; the command language in these modes -are identical. -.PP -A word to the Unix adept: -although -.CW sam -is syntactically very similar to -.CW ed , -it is fundamentally and deliberately different in design and detailed semantics. -You might use knowledge of -.CW ed -to predict how the substitute command works, -but you'd only be right if you had used some understanding of -.CW sam 's -workings to influence your prediction. -Be particularly careful about idioms. -Idioms form in curious nooks of languages and depend on -undependable peculiarities. -.CW ed -idioms simply don't work in -.CW sam : -.CW 1,$s/a/b/ -makes one substitution in the whole file, not one per line. -.CW sam -has its own idioms. -Much of the purpose of this tutorial is to publish them -and make fluency in -.CW sam -a matter of learning, not cunning. -.PP -The tutorial depends on familiarity with regular expressions, although -some experience with a more traditional Unix editor may be helpful. -To aid readers familiar with -.CW ed , -I have pointed out in square brackets [] some of -the relevant differences between -.CW ed -and -.CW sam . -Read these comments only if you wish -to understand the differences; the lesson is about -.CW sam , -not -.CW sam -.I vs. -.CW ed . -Another typographic convention is that output appears in -.CW "this font, -while typed input appears as -.WC "slanty text. -.PP -Nomenclature: -.CW sam -keeps a copy of the text it is editing. -This copy is called a -.I file . -To avoid confusion, I have called the permanent storage on disc a -.I -Unix file. -.R -.SH -Text -.PP -To get started, we need some text to play with. -Any text will do; try something from -James Gosling's Emacs manual: -.P1 -$ \fIsam -d -a -This manual is organized in a rather haphazard manner. The first -several sections were written hastily in an attempt to provide a -general introduction to the commands in Emacs and to try to show -the method in the madness that is the Emacs command structure. -\&. -.ft -.P2 -.WC "sam -d -starts -.CW sam -running. -The -.CW a -command adds text until a line containing just a period, and sets the -.I -current text -.R -(also called -.I dot ) -to what was typed \(em everything between the -.CW a -and the period. -.CW ed "" [ -would leave dot set to only the last line.] -The -.CW p -command prints the current text: -.P1 -.WC p -This manual is organized in a rather haphazard manner. The first -several sections were written hastily in an attempt to provide a -general introduction to the commands in Emacs and to try to show -the method in the madness that is the Emacs command structure. -.P2 -[Again, -.CW ed -would print only the last line.] -The -.CW a -command adds its text -.I after -dot; the -.CW i -command is like -.CW a, -but adds the text -.I before -dot. -.P1 -.ft I -i -Introduction -\&. -p -.ft -Introduction -.P2 -There is also a -.CW c -command that changes (replaces) the current text, -and -.CW d -that deletes it; these are illustrated below. -.PP -To see all the text, we can specify what text to print; -for the moment, suffice it to say that -.WC 0,$ -specifies the entire file. -.CW ed "" [ -users would probably type -.WC 1,$ , -which in practice is the same thing, but see below.] -.P1 -.WC 0,$p -Introduction -This manual is organized in a rather haphazard manner. The first -several sections were written hastily in an attempt to provide a -general introduction to the commands in Emacs and to try to show -the method in the madness that is the Emacs command structure. -.P2 -Except for the -.CW w -command described below, -.I all -commands, -including -.CW p , -set dot to the text they touch. -Thus, -.CW a -and -.CW i -set dot to the new text, -.CW p -to the text printed, and so on. -Similarly, all commands -(except -.CW w ) -by default operate on the current -text [unlike -.CW ed , -for which some commands (such as -.CW g ) -default to the entire file]. -.PP -Things are not going to get very interesting until we can -set dot arbitrarily. -This is done by -.I addresses , -which specify a piece of the file. -The address -.CW 1 , -for example, sets dot to the first line of the file. -.P1 -.WC 1p -Introduction -.WC c -.WC Preamble -.WC . -.P2 -The -.CW c -command didn't need to specify dot; the -.CW p -left it on line one. -It's therefore easy to delete the first line utterly; -the last command left dot set to line one: -.P1 -.WC d -.WC 1p -This manual is organized in a rather haphazard manner. The first -.P2 -(Line numbers change -to reflect changes to the file.) -.PP -The address \f(CW/\f2text\f(CW/\f1 -sets dot to the first appearance of -.I text , -after dot. -.CW ed "" [ -matches the first line containing -.I text .] -If -.I text -is not found, the search restarts at the beginning of the file -and continues until dot. -.P1 -.WC /Emacs/p -Emacs -.P2 -It's difficult to indicate typographically, but in this example no newline appears -after -.CW Emacs : -the text to be printed is the string -.CW Emacs ', ` -exactly. -(The final -.CW p -may be left off \(em it is the default command. -When downloaded, however, the default is instead to select the text, -to highlight it, -and to make it visible by moving the window on the file if necessary. -Thus, -.CW /Emacs/ -indicates on the display the next occurrence of the text.) -.PP -Imagine we wanted to change the word -.CW haphazard -to -.CW thoughtless . -Obviously, what's needed is another -.CW c -command, but the method used so far to insert text includes a newline. -The syntax for including text without newlines is to surround the -text with slashes (which is the same as the syntax for -text searches, but what is going on should be clear from context). -The text must appear immediately after the -.CW c -(or -.CW a -or -.CW i ). -Given this, it is easy to make the required change: -.P1 -.WC /haphazard/c/thoughtless/ -1p -This manual is organized in a rather thoughtless manner. The first -.P2 -[Changes can always be done with a -.CW c -command, even if the text is smaller than a line]. -You'll find that this way of providing text to commands is much -more common than is the multiple-lines syntax. -If you want to include a slash -.CW / -in the text, just precede it with a backslash -.CW \e , -and use a backslash to protect a backslash itself. -.P1 -.WC /Emacs/c/Emacs\e\e360/ -.WC 4p -general introduction to the commands in Emacs\e360 and to try to show -.P2 -We could also make this particular change by -.P1 -.WC /Emacs/a/\e\e360/ -.P2 -.PP -This is as good a place as any to introduce the -.CW u -command, which undoes the last command. -A second -.CW u -will undo the penultimate command, and so on. -.P1 -.WC u -.WC 4p -general introduction to the commands in Emacs and to try to show -.WC u -.WC 3p -This manual is organized in a rather haphazard manner. The first -.P2 -Undoing can only back up; there is no way to undo a previous -.CW u . -.SH -Addresses -.PP -We've seen the simplest forms of addresses, but there is more -to learn before we can get too much further. -An address selects a region in the file \(em a substring \(em -and therefore must define the beginning and the end of a region. -Thus, the address -.CW 13 -selects from the beginning of line thirteen to the end of line thirteen, and -.CW /Emacs/ -selects from the beginning of the word -.CW Emacs ' ` -to the end. -.PP -Addresses may be combined with a comma: -.P1 -13,15 -.P2 -selects lines thirteen through fifteen. The definition of the comma -operator is to select from the beginning of the left hand address (the -beginning of line 13) to the end of the right hand address (the -end of line 15). -.PP -A few special simple addresses come in handy: -.CW . -(a period) represents dot, the current text, -.CW 0 -(line zero) selects the null string at the beginning of the file, and -.CW $ -selects the null string at the end of the file -[not the last line of the file]. -Therefore, -.P1 -0,13 -.P2 -selects from the beginning of the file to the end of line thirteen, -.P1 -\&.,$ -.P2 -selects from the beginning of the current text to the end of the file, and -.P1 -0,$ -.P2 -selects the whole file [that is, a single string containing the whole file, -not a list of all the lines in the file]. -.PP -These are all -.I absolute -addresses: they refer to specific places in the file. -.CW sam -also has relative addresses, which depend -on the value of dot, -and in fact we have already seen one form: -.CW /Emacs/ -finds the first occurrence of -.CW Emacs -searching forwards from dot. -Which occurrence of -.CW Emacs -it finds depends on the value of dot. -What if you wanted the first occurrence -.CW before -dot? Just precede the pattern with a minus sign, which reverses the direction -of the search: -.P1 --/Emacs/ -.P2 -In fact, the complete syntax for forward searching is -.P1 -+/Emacs/ -.P2 -but the plus sign is the default, and in practice is rarely used. -Here is an example that includes it for clarity: -.P1 -0+/Emacs/ -.P2 -selects the first occurrence of -.CW Emacs -in the file; read it as ``go to line 0, then search forwards for -.CW Emacs .'' -Since the -.CW + -is optional, this can be written -.CW 0/Emacs/ . -Similarly, -.P1 -$-/Emacs/ -.P2 -finds the last occurrence in the file, so -.P1 -0/Emacs/,$-/Emacs/ -.P2 -selects the text from the first to last -.CW Emacs , -inclusive. -Slightly more interesting: -.P1 -/Emacs/+/Emacs/ -.P2 -(there is an implicit -.CW .+ -at the beginning) selects the second -.CW Emacs -following dot. -.PP -Line numbers may also be relative. -.P1 --2 -.P2 -selects the second previous line, and -.P1 -+5 -.P2 -selects the fifth following line (here the plus sign is obligatory). -.PP -Since addresses may select (and dot may be) more than one line, -we need a definition of `previous' and `following:' -`previous' means -.I -before the beginning -.R -of dot, and `following' -means -.I -after the end -.R -of dot. -For example, if the file contains \fBA\fIAA\fBA\f1, -with dot set to the middle two -.CW A 's -(the slanting characters), -.CW -/A/ -sets dot to the first -.CW A , -and -.CW +/A/ -sets dot to the last -.CW A . -Except under odd circumstances (such as when the only occurrence of the -text in the file is already the current text), the text selected by a -search will be disjoint from dot. -.PP -To select the -.CW "troff -ms -paragraph containing dot, however long it is, use -.P1 --/.PP/,/.PP/-1 -.P2 -which will include the -.CW .PP -that begins the paragraph, and exclude the one that ends it. -.PP -When typing relative line number addresses, the default number is -.CW 1 , -so the above could be written slightly more simply: -.P1 --/.PP/,/.PP/- -.P2 -.PP -What does the address -.CW +1-1 -or the equivalent -.CW +- -mean? It looks like it does nothing, but recall that dot need not be a -complete line of text. -.CW +1 -selects the line after the end of the current text, and -.CW -1 -selects the line before the beginning. Therefore -.CW +1-1 -selects the line before the line after the end of dot, that is, -the complete line containing the end of dot. -We can use this construction to expand a selection to include a complete line, -say the first line in the file containing -.CW Emacs : -.P1 -.WC 0/Emacs/+-p -general introduction to the commands in Emacs and to try to show -.P2 -The address -.CW +- -is an idiom. -.SH -Loops -.PP -Above, we changed one occurrence of -.CW Emacs -to -.CW Emacs\e360 , -but if the name of the editor is really changing, it would be useful -to change -.I all -instances of the name in a single command. -.CW sam -provides a command, -.CW x -(extract), for just that job. -The syntax is -\f(CWx/\f2pattern\f(CW/\f2command\f1. -For each occurrence of the pattern in the selected text, -.CW x -sets dot to the occurrence and runs command. -For example, to change -.CW Emacs -to -.CW vi, -.P1 -.WC 0,$x/Emacs/c/vi/ -.WC 0,$p -This manual is organized in a rather haphazard manner. The first -several sections were written hastily in an attempt to provide a -general introduction to the commands in vi and to try to show -the method in the madness that is the vi command structure. -.P2 -This -works by subdividing the current text -.CW 0,$ "" ( -\(em the whole file) into appearances of its textual argument -.CW Emacs ), ( -and then running the command that follows -.CW c/vi/ ) ( -with dot set to the text. -We can read this example as, ``find all occurrences of -.CW Emacs -in the file, and for each one, -set the current text to the occurrence and run the command -.CW c/vi/ , -which will replace the current text by -.CW vi. '' -[This command is somewhat similar to -.CW ed 's -.CW g -command. The differences will develop below, but note that the -default address, as always, is dot rather than the whole file.] -.PP -A single -.CW u -command is sufficient to undo an -.CW x -command, regardless of how many individual changes the -.CW x -makes. -.P1 -.WC u -.WC 0,$p -This manual is organized in a rather haphazard manner. The first -several sections were written hastily in an attempt to provide a -general introduction to the commands in Emacs and to try to show -the method in the madness that is the Emacs command structure. -.P2 -.PP -Of course, -.CW c -is not the only command -.CW x -can run. An -.CW a -command can be used to put proprietary markings on -.CW Emacs : -.P1 -.WC 0,$x/Emacs/a/{TM}/ -.WC /Emacs/+-p -general introduction to the commands in Emacs{TM} and to try to show -.P2 -[There is no way to see the changes as they happen, as in -.CW ed 's -.CW g/Emacs/s//&{TM}/p ; -see the section on Multiple Changes, below.] -.PP -The -.CW p -command is also useful when driven by an -.CW x , -but be careful that you say what you mean; -.P1 -.WC 0,$x/Emacs/p -EmacsEmacs -.P2 -since -.CW x -sets dot to the text in the slashes, printing only that text -is not going to be very -informative. But the command that -.CW x -runs can contain addresses. For example, if we want to print all -lines containing -.CW Emacs , -just use -.CW +- : -.P1 -.WC 0,$x/Emacs/+-p -general introduction to the commands in Emacs{TM} and to try to show -the method in the madness that is the Emacs{TM} command structure. -.P2 -Finally, let's restore the state of the file with another -.CW x -command, and make use of a handy shorthand: -a comma in an address has its left side default to -.CW 0 , -and its right side default to -.CW $ , -so the easy-to-type address -.CW , -refers to the whole file: -.P1 -.WC ",x/Emacs/ /{TM}/d -.WC ,p -This manual is organized in a rather haphazard manner. The first -several sections were written hastily in an attempt to provide a -general introduction to the commands in Emacs and to try to show -the method in the madness that is the Emacs command structure. -.P2 -Notice what this -.CW x -does: for each occurrence of Emacs, -find the -.CW {TM} -that follows, and delete it. -.PP -The `text' -.CW sam -accepts -for searches in addresses and in -.CW x -commands is not simple text, but rather -.I regular\ expressions. -Unix has several distinct interpretations of regular expressions. -The form used by -.CW sam -is that of -.CW regexp (6), -including parentheses -.CW () -for grouping and an `or' operator -.CW | -for matching strings in parallel. -.CW sam -also matches the character sequence -.CW \en -with a newline character. -Replacement text, such as used in the -.CW a -and -.CW c -commands, is still plain text, but the sequence -.CW \en -represents newline in that context, too. -.PP -Here is an example. Say we wanted to double space the document, that is, -turn every newline into two newlines. -The following all do the job: -.P1 -.WC ",x/\en/ a/\en/ -.WC ",x/\en/ c/\en\en/ -.WC ",x/$/ a/\en/ -.WC ",x/^/ i/\en/ -.P2 -The last example is slightly different, because it puts a newline -.I before -each line; the other examples place it after. -The first two examples manipulate newlines directly -[something outside -.CW ed 's -ken]; the last two -use regular expressions: -.CW $ -is the empty string at the end of a line, while -.CW ^ -is the empty string at the beginning. -.PP -These solutions all have a possible drawback: if there is already a blank line -(that is, two consecutive newlines), they make it much larger (four -consecutive newlines). -A better method is to extend every group of newlines by one: -.P1 -.WC ",x/\en+/ a/\en/ -.P2 -The regular expression operator -.CW + -means `one or more;' -.CW \en+ -is identical to -.CW \en\en* . -Thus, this example -takes every sequence of newlines and adds another -to the end. -.PP -A more common example is indenting a block of text by a tab stop. -The following all work, -although the first is arguably the cleanest (the blank text in slashes is a tab): -.P1 -.WC ",x/^/a/ / -.WC ",x/^/c/ / -.WC ",x/.*\en/i/ / -.P2 -The last example uses the pattern (idiom, really) -.CW .*\en -to match lines: -.CW .* -matches the longest possible string of non-newline characters. -Taking initial tabs away is just as easy: -.P1 -.WC ",x/^ /d -.P2 -In these examples I have specified an address (the whole file), but -in practice commands like these are more likely to be run without -an address, using the value of dot set by selecting text with the mouse. -.SH -Conditionals -.PP -The -.CW x -command is a looping construct: -for each match of a regular expression, -it extracts (sets dot to) the match and runs a command. -.CW sam -also has a conditional, -.CW g : -\f(CWg/\f2pattern\f(CW/\f2command\f1 -runs the command if dot contains a match of the pattern -.I -without changing the value of dot. -.R -The inverse, -.CW v , -runs the command if dot does -.I not -contain a match of the pattern. -(The letters -.CW g -and -.CW v -are historical and have no mnemonic significance. You might -think of -.CW g -as `guard.') -.CW ed "" [ -users should read the above definitions very carefully; the -.CW g -command in -.CW sam -is fundamentally different from that in -.CW ed .] -Here is an example of the difference between -.CW x -and -.CW g: -.P1 -,x/Emacs/c/vi/ -.P2 -changes each occurrence of the word -.CW Emacs -in the file to the word -.CW vi , -but -.P1 -,g/Emacs/c/vi/ -.P2 -changes the -.I "whole file -to -.CW vi -if there is the word -.CW Emacs -anywhere in the file. -.PP -Neither of these commands is particularly interesting in isolation, -but they are valuable when combined with -.CW x -and with themselves. -.SH -Composition -.PP -One way to think about the -.CW x -command is that, given a selection (a value of dot) -it iterates through interesting subselections (values of dot within). -In other words, it takes a piece of text and cuts it into smaller pieces. -But the text that it cuts up may already be a piece cut by a previous -.CW x -command or selected by a -.CW g . -.CW sam 's -most interesting property is the ability to define a sequence of commands -to perform a particular task.\(dg -.FS -\(dg -The obvious analogy with shell pipelines is only partially valid, -because the individual -.CW sam -commands are all working on the same text; it is only how the text is -sliced up that is changing. -.FE -A simple example is to change all occurrences of -.CW Emacs -to -.CW emacs ; -certainly the command -.P1 -.WC ",x/Emacs/ c/emacs/ -.P2 -will work, but we can use an -.CW x -command to save retyping most of the word -.CW Emacs : -.P1 -.WC ",x/Emacs/ x/E/ c/e/ -.P2 -(Blanks can be used -to separate commands on a line to make them easier to read.) -What this command does is find all occurrences of -.CW Emacs -.CW ,x/Emacs/ ), ( -and then -.I -with dot set to that text, -.R -find all occurrences of the letter -.CW E -.CW x/E/ ), ( -and then -.I -with dot set to that text, -.R -run the command -.CW c/e/ -to change the character to lower case. -Note that the address for the command \(em the whole file, specified by a comma -\(em is only given to the leftmost -piece of the command; the rest of the pieces have dot set for them by -the execution of the pieces to their left. -.PP -As another simple example, consider a problem -solved above: printing all lines in the file containing the word -.CW Emacs: -.P1 -.WC ",x/.*\en/ g/Emacs/p -general introduction to the commands in Emacs and to try to show -the method in the madness that is the Emacs command structure. -.P2 -This command says to break the file into lines -.CW ,x/.*\en/ ), ( -and for each line that contains the string -.CW Emacs -.CW g/Emacs/ ), ( -run the command -.CW p -with dot set to the line (not the match of -.CW Emacs ), -which prints the line. -To save typing, because -.CW .*\en -is a common pattern in -.CW x -commands, -if the -.CW x -is followed immediately by a space, the pattern -.CW .*\en -is assumed. -Therefore, the above could be written more succinctly: -.P1 -.WC ",x g/Emacs/p -.P2 -The solution we used before was -.P1 -.WC ,x/Emacs/+-p -.P2 -which runs the command -.CW +-p -with dot set to each match of -.CW Emacs -in the file (recall that the idiom -.CW +-p -prints the line containing the end of dot). -.PP -The two commands usually produce the same result -(the -.CW +-p -form will print a line twice if it contains -.CW Emacs -twice). Which is better? -.CW ,x/Emacs/+-p -is easier to type and will be much faster if the file is large and -there are few occurrences of the string, but it is really an odd special case. -.CW ",x/.*\en/ g/Emacs/p -is slower \(em it breaks each line out separately, then examines -it for a match \(em but is conceptually cleaner, and generalizes more easily. -For example, consider the following piece of the Emacs manual: -.P1 -command name="append-to-file", key="[unbound]" -Takes the contents of the current buffer and appends it to the -named file. If the file doesn't exist, it will be created. - -command name="apropos", key="ESC-?" -Prompts for a keyword and then prints a list of those commands -whose short description contains that keyword. For example, -if you forget which commands deal with windows, just type -"@b[ESC-?]@t[window]@b[ESC]". - -\&\f2and so on\f(CW -.P2 -This text consists of groups of non-empty lines, with a simple format -for the text within each group. -Imagine that we wanted to find the description of the `apropos' -command. -The problem is to break the file into individual descriptions, -and then to find the description of `apropos' and to print it. -The solution is straightforward: -.P1 -.WC ,x/(.+\en)+/\ g/command\ name="apropos"/p -command name="apropos", key="ESC-?" -Prompts for a keyword and then prints a list of those commands -whose short description contains that keyword. For example, -if you forget which commands deal with windows, just type -"@b[ESC-?]@t[window]@b[ESC]". -.P2 -The regular expression -.CW (.+\en)+ -matches one or more lines with one or more characters each, that is, -the text between blank lines, so -.CW ,x/(.+\en)+/ -extracts each description; then -.CW g/command\ name="apropos"/ -selects the description for `apropos' and -.CW p -prints it. -.PP -Imagine that we had a C program containing the variable -.CW n , -but we wanted to change it to -.CW num . -This command is a first cut: -.P1 -.WC ",x/n/ c/num/ -.P2 -but is obviously flawed: it will change all -.CW n 's -in the file, not just the -.I identifier -.CW n . -A better solution is to use an -.CW x -command to extract the identifiers, and then use -.CW g -to find the -.CW n 's: -.P1 -.WC ",x/[a-zA-Z_][a-zA-Z_0-9]*/ g/n/ v/../ c/num/ -.P2 -It looks awful, but it's fairly easy to understand when read -left to right. -A C identifier is an alphabetic or underscore followed by zero or more -alphanumerics or underscores, that is, matches of the regular expression -.CW [a-zA-Z_][a-zA-Z_0-9]* . -The -.CW g -command selects those identifiers containing -.CW n , -and the -.CW v -is a trick: it rejects those identifiers containing more than one -character. Hence the -.CW c/num/ -applies only to free-standing -.CW n 's. -.PP -There is still a problem here: -we don't want to change -.CW n 's -that are part of the character constant -.CW \en . -There is a command -.CW y , -complementary to -.CW x , -that is just what we need: -\f(CWy/\f2pattern\f(CW/\f2command\f1 -runs the command on the pieces of text -.I between -matches of the pattern; -if -.CW x -selects, -.CW y -rejects. -Here is the final command: -.P1 -.WC ",y/\e\en/ x/[a-zA-Z_][a-zA-Z_0-9]*/ g/n/ v/../ c/num/ -.P2 -The -.CW y/\e\en/ -(with backslash doubled to make it a literal character) -removes the two-character sequence -.CW \en -from consideration, so the rest of the command will not touch it. -There is more we could do here; for example, another -.CW y -could be prefixed to protect comments in the code. -I won't elaborate the example any further, but you should have -an idea of the way in which the looping and conditional commands -in -.CW sam -may be composed to do interesting things. -.SH -Grouping -.PP -There is another way to arrange commands. -By enclosing them in brace brackets -.CW {} , -commands may be applied in parallel. -This example uses the -.CW = -command, which reports the line and character numbers of dot, -together with -.CW p , -to report on appearances of -.CW Emacs -in our original file: -.P1 -.WC ,p -This manual is organized in a rather haphazard manner. The first -several sections were written hastily in an attempt to provide a -general introduction to the commands in Emacs and to try to show -the method in the madness that is the Emacs command structure. -.ft I -,x/Emacs/{ - = - +-p -} -.ft -3; #171,#176 -general introduction to the commands in Emacs and to try to show -4; #234,#239 -the method in the madness that is the Emacs command structure. -.P2 -(The number before the semicolon is the line number; -the numbers beginning with -.CW # -are character numbers.) -As a more interesting example, consider changing all occurrences of -.CW Emacs -to -.CW vi -and vice versa. We can type -.P1 -.ft I -,x/Emacs|vi/{ - g/Emacs/ c/vi/ - g/vi/ c/Emacs/ -} -.ft -.P2 -or even -.P1 -.ft I -,x/[a-zA-Z]+/{ - g/Emacs/ v/....../ c/vi/ - g/vi/ v/.../ c/Emacs/ -} -.ft -.P2 -to make sure we don't change strings embedded in words. -.SH -Multiple Changes -.PP -You might wonder why, once -.CW Emacs -has been changed to -.CW vi -in the above example, -the second command in the braces doesn't put it back again. -The reason is that the commands are run in parallel: -within any top-level -.CW sam -command, all changes to the file refer to the state of the file -before any of the changes in that command are made. -After all the changes have been determined, they are all applied -simultaneously. -.PP -This means, as mentioned, that commands within a compound -command see the state of the file before any of the changes apply. -This method of evaluation makes some things easier (such as the exchange of -.CW Emacs -and -.CW vi ), -and some things harder. -For instance, it is impossible to use a -.CW p -command to print the changes as they happen, -because they haven't happened when the -.CW p -is executed. -An indirect ramification is that changes must occur in forward -order through the file, -and must not overlap. -.SH -Unix -.PP -.CW sam -has a few commands to connect to Unix processes. -The simplest is -.CW ! , -which runs the command with input and output connected to the terminal. -.P1 -.WC !date -Wed May 28 23:25:21 EDT 1986 -! -.P2 -(When downloaded, the input is connected to -.CW /dev/null -and only the first few lines of output are printed; -any overflow is stored in -.CW $HOME/sam.err .) -The final -.CW ! -is a prompt to indicate when the command completes. -.PP -Slightly more interesting is -.CW > , -which provides the current text as standard input to the Unix command: -.P1 -.WC "1,2 >wc - 2 22 131 -! -.P2 -The complement of -.CW > -is, naturally, -.CW < : -it replaces the current text with the standard output of the Unix command: -.P1 -.WC "1 : -the current text is provided as standard input to the Unix command, -and the Unix command's standard output is collected and used to -replace the original text. -For example, -.P1 -.WC ",| sort -.P2 -runs -.CW sort (1) -on the file, sorting the lines of the text lexicographically. -Note that -.CW < , -.CW > -and -.CW | -are -.CW sam -commands, not Unix shell operators. -.PP -The next example converts all appearances of -.CW Emacs -to upper case using -.CW tr (1): -.P1 -.WC ",x/Emacs/ | tr a-z A-Z -.P2 -.CW tr -is run once for each occurrence of -.CW Emacs . -Of course, you could do this example more efficiently with a simple -.CW c -command, but here's a trickier one: -given a Unix mail box as input, -convert all the -.CW Subject -headers to distinct fortunes: -.P1 -.WC ",x/^Subject:.*\en/ x/[^:]*\en/ < /usr/games/fortune -.P2 -(The regular expression -.CW [^:] -refers to any character -.I except -.CW : -and newline; the negation operator -.CW ^ -excludes newline from the list of characters.) -Again, -.CW /usr/games/fortune -is run once for each -.CW Subject -line, so each -.CW Subject -line is changed to a different fortune. -.SH -A few other text commands -.PP -For completeness, I should mention three other commands that -manipulate text. The -.CW m -command moves the current text to after the text specified by the -(obligatory) address after the command. -Thus -.P1 -.WC "/Emacs/+- m 0 -.P2 -moves the next line containing -.CW Emacs -to the beginning of the file. -Similarly, -.CW t -(another historic character) copies the text: -.P1 -.WC "/Emacs/+- t 0 -.P2 -would make, at the beginning of the file, a copy of the next line -containing -.CW Emacs . -.PP -The third command is more interesting: it makes substitutions. -Its syntax is -\f(CWs/\f2pattern\f(CW/\f2replacement\f(CW/\f1. -Within the current text, it finds the first occurrence of -the pattern and replaces it by the replacement text, -leaving dot set to the entire address of the substitution. -.P1 -.WC 1p -This manual is organized in a rather haphazard manner. The first -.WC s/haphazard/thoughtless/ -.WC p -This manual is organized in a rather thoughtless manner. The first -.P2 -Occurrences of the character -.CW & -in the replacement text stand for the text matching the pattern. -.P1 -.WC s/T/"&&&&"/ -.WC p -"TTTT"his manual is organized in a rather thoughtless manner. The first -.P2 -There are two variants. The first is that a number may be specified -after the -.CW s , -to indicate which occurrence of the pattern to substitute; the default -is the first. -.P1 -.WC s2/is/was/ -.WC p -"TTTT"his manual was organized in a rather thoughtless manner. The first -.P2 -The second is that suffixing a -.CW g -(global) causes replacement of all occurrences, not just the first. -.P1 -.WC s/[a-zA-Z]/x/g -.WC p -"xxxx"xxx xxxxxx xxx xxxxxxxxx xx x xxxxxx xxxxxxxxxxx xxxxxxx xxx xxxxx -.P2 -Notice that in all these examples -dot is left -set to the entire line. -.PP -[The substitute command is vital to -.CW ed, -because it is the only way to make changes within a line. -It is less valuable in -.CW sam , -in which the concept of a line is much less important. -For example, many -.CW ed -substitution idioms are handled well by -.CW sam 's -basic commands. Consider the commands -.P1 -s/good/bad/ -s/good// -s/good/& bye/ -.P2 -which are equivalent in -.CW sam -to -.P1 -/good/c/bad/ -/good/d -/good/a/ bye/ -.P2 -and for which the context search is likely unnecessary because the desired -text is already dot. -Also, beware this -.CW ed -idiom: -.P1 -1,$s/good/bad/ -.P2 -which changes the first -.CW good -on each line; the same command in -.CW sam -will only change the first one in the whole file. -The correct -.CW sam -version is -.P1 -,x s/good/bad/ -.P2 -but what is more likely meant is -.P1 -,x/good/ c/bad/ -.P2 -.CW sam -operates under different rules.] -.SH -Files -.PP -So far, we have only been working with a single file, -but -.CW sam -is a multi-file editor. -Only one file may be edited at a time, but -it is easy to change which file is the `current' file for editing. -To see how to do this, we need a -.CW sam -with a few files; -the easiest way to do this is to start it -with a list of Unix file names to edit. -.P1 -$ \fIecho *.ms\f(CW -conquest.ms death.ms emacs.ms famine.ms slaughter.ms -$ \fIsam -d *.ms\f(CW - -. conquest.ms -.P2 -(I'm sorry the Horsemen don't appear in liturgical order.) -The line printed by -.CW sam -is an indication that the Unix file -.CW conquest.ms -has been read, and is now the current file. -.CW sam -does not read the Unix file until -the associated -.CW sam -file becomes current. -.PP -The -.CW n -command prints the names of all the files: -.P1 -.WC n - -. conquest.ms - - death.ms - - emacs.ms - - famine.ms - - slaughter.ms -.P2 -This list is also available in the menu on mouse button 3. -The command -.CW f -tells the name of just the current file: -.P1 -.WC f - -. conquest.ms -.P2 -The characters to the left of the file name encode helpful information about -the file. -The minus sign becomes a plus sign if the file has a window open, and an -asterisk if more than one is open. -The period (another meaning of dot) identifies the current file. -The leading blank changes to an apostrophe if the file is different -from the contents of the associated Unix file, as far as -.CW sam -knows. -This becomes evident if we make a change. -.P1 -.WC 1d -.WC f -\&'-. conquest.ms -.P2 -If the file is restored by an undo command, the apostrophe disappears. -.P1 -.WC u -.WC f - -. conquest.ms -.P2 -The file name may be changed by providing a new name with the -.CW f -command: -.P1 -.CW "f pestilence.ms -\&'-. pestilence.ms -.P2 -.WC f -prints the new status of the file, -that is, it changes the name if one is provided, and prints the -name regardless. -A file name change may also be undone. -.P1 -.WC u -.WC f - -. conquest.ms -.P2 -.PP -When -.CW sam -is downloaded, the current file may be changed simply by selecting -the desired file from the menu (selecting the same file subsequently -cycles through the windows opened on the file). -Otherwise, the -.CW b -command can be used to choose the desired file:\(dg -.FS -\(dg A bug prevents the -.CW b -command from working when downloaded. -Because the menu is more convenient anyway, and -because the method -of choosing files from the command language is slated to change, -the bug hasn't been fixed. -.FE -.P1 -.WC "b emacs.ms - -. emacs.ms -.P2 -Again, -.CW sam -prints the name (actually, executes an implicit -.CW f -command) because the Unix file -.CW emacs.ms -is being read for the first time. -It is an error to ask for a file -.CW sam -doesn't know about, but the -.CW B -command will prime -.CW sam 's -menu with a new file, and make it current. -.P1 -.WC "b flood.pic -?no such file `flood.pic' -.WC "B flood.pic - -. flood.pic -.WC n - - conquest.ms - - death.ms - - emacs.ms - - famine.ms - -. flood.pic - - slaughter.ms -.P2 -Both -.CW b -and -.CW B -will accept a list of file names. -.CW b -simply takes the first file in the list, but -.CW B -loads them all. -The list may be typed on one line \(em -.P1 -.WC "B devil.tex satan.tex 666.tex emacs.tex -.P2 -\(em or generated by a Unix command \(em -.P1 -.WC "B ./doc/Sam.ad <<'//GO.SYSIN DD ./doc/Sam.ad' -*width: 500 -*height: 600 -*font: fixed -*scrollForwardR: true -*saveUnder: true -*backingStore: WhenMapped - //GO.SYSIN DD ./doc/Sam.ad echo ./doc/sam.ps sed s/.// > ./doc/sam.ps <<'//GO.SYSIN DD ./doc/sam.ps' -%!PS -%%Version: 3.3.2 -%%DocumentFonts: (atend) -%%Pages: (atend) -%%EndComments -% -% Version 3.3.2 prologue for troff files. -% - -/#copies 1 store -/aspectratio 1 def -/formsperpage 1 def -/landscape false def -/linewidth .3 def -/magnification 1 def -/margin 0 def -/orientation 0 def -/resolution 720 def -/rotation 1 def -/xoffset 0 def -/yoffset 0 def - -/roundpage true def -/useclippath true def -/pagebbox [0 0 612 792] def - -/R /Times-Roman def -/I /Times-Italic def -/B /Times-Bold def -/BI /Times-BoldItalic def -/H /Helvetica def -/HI /Helvetica-Oblique def -/HB /Helvetica-Bold def -/HX /Helvetica-BoldOblique def -/CW /Courier def -/CO /Courier def -/CI /Courier-Oblique def -/CB /Courier-Bold def -/CX /Courier-BoldOblique def -/PA /Palatino-Roman def -/PI /Palatino-Italic def -/PB /Palatino-Bold def -/PX /Palatino-BoldItalic def -/Hr /Helvetica-Narrow def -/Hi /Helvetica-Narrow-Oblique def -/Hb /Helvetica-Narrow-Bold def -/Hx /Helvetica-Narrow-BoldOblique def -/KR /Bookman-Light def -/KI /Bookman-LightItalic def -/KB /Bookman-Demi def -/KX /Bookman-DemiItalic def -/AR /AvantGarde-Book def -/AI /AvantGarde-BookOblique def -/AB /AvantGarde-Demi def -/AX /AvantGarde-DemiOblique def -/NR /NewCenturySchlbk-Roman def -/NI /NewCenturySchlbk-Italic def -/NB /NewCenturySchlbk-Bold def -/NX /NewCenturySchlbk-BoldItalic def -/ZD /ZapfDingbats def -/ZI /ZapfChancery-MediumItalic def -/S /S def -/S1 /S1 def -/GR /Symbol def - -/inch {72 mul} bind def -/min {2 copy gt {exch} if pop} bind def - -/show {show} bind def % so later references don't bind -/widthshow {widthshow} bind def -/stringwidth {stringwidth} bind def - -/setup { - counttomark 2 idiv {def} repeat pop - - landscape {/orientation 90 orientation add def} if - /scaling 72 resolution div def - linewidth setlinewidth - 1 setlinecap - - pagedimensions - xcenter ycenter translate - orientation rotation mul rotate - width 2 div neg height 2 div translate - xoffset inch yoffset inch neg translate - margin 2 div dup neg translate - magnification dup aspectratio mul scale - scaling scaling scale - - addmetrics - 0 0 moveto -} def - -/pagedimensions { - useclippath userdict /gotpagebbox known not and { - /pagebbox [clippath pathbbox newpath] def - roundpage currentdict /roundpagebbox known and {roundpagebbox} if - } if - pagebbox aload pop - 4 -1 roll exch 4 1 roll 4 copy - landscape {4 2 roll} if - sub /width exch def - sub /height exch def - add 2 div /xcenter exch def - add 2 div /ycenter exch def - userdict /gotpagebbox true put -} def - -/addmetrics { - /Symbol /S null Sdefs cf - /Times-Roman /S1 StandardEncoding dup length array copy S1defs cf -} def - -/pagesetup { - /page exch def - currentdict /pagedict known currentdict page known and { - page load pagedict exch get cvx exec - } if -} def - -/decodingdefs [ - {counttomark 2 idiv {y moveto show} repeat} - {neg /y exch def counttomark 2 idiv {y moveto show} repeat} - {neg moveto {2 index stringwidth pop sub exch div 0 32 4 -1 roll widthshow} repeat} - {neg moveto {spacewidth sub 0.0 32 4 -1 roll widthshow} repeat} - {counttomark 2 idiv {y moveto show} repeat} - {neg setfunnytext} -] def - -/setdecoding {/t decodingdefs 3 -1 roll get bind def} bind def - -/w {neg moveto show} bind def -/m {neg dup /y exch def moveto} bind def -/done {/lastpage where {pop lastpage} if} def - -/f { - dup /font exch def findfont exch - dup /ptsize exch def scaling div dup /size exch def scalefont setfont - linewidth ptsize mul scaling 10 mul div setlinewidth - /spacewidth ( ) stringwidth pop def -} bind def - -/changefont { - /fontheight exch def - /fontslant exch def - currentfont [ - 1 0 - fontheight ptsize div fontslant sin mul fontslant cos div - fontheight ptsize div - 0 0 - ] makefont setfont -} bind def - -/sf {f} bind def - -/cf { - dup length 2 idiv - /entries exch def - /chtab exch def - /newencoding exch def - /newfont exch def - - findfont dup length 1 add dict - /newdict exch def - {1 index /FID ne {newdict 3 1 roll put}{pop pop} ifelse} forall - - newencoding type /arraytype eq {newdict /Encoding newencoding put} if - - newdict /Metrics entries dict put - newdict /Metrics get - begin - chtab aload pop - 1 1 entries {pop def} for - newfont newdict definefont pop - end -} bind def - -% -% A few arrays used to adjust reference points and character widths in some -% of the printer resident fonts. If square roots are too high try changing -% the lines describing /radical and /radicalex to, -% -% /radical [0 -75 550 0] -% /radicalex [-50 -75 500 0] -% -% Move braceleftbt a bit - default PostScript character is off a bit. -% - -/Sdefs [ - /bracketlefttp [201 500] - /bracketleftbt [201 500] - /bracketrighttp [-81 380] - /bracketrightbt [-83 380] - /braceleftbt [203 490] - /bracketrightex [220 -125 500 0] - /radical [0 0 550 0] - /radicalex [-50 0 500 0] - /parenleftex [-20 -170 0 0] - /integral [100 -50 500 0] - /infinity [10 -75 730 0] -] def - -/S1defs [ - /underscore [0 80 500 0] - /endash [7 90 650 0] -] def -% -% Tries to round clipping path dimensions, as stored in array pagebbox, so they -% match one of the known sizes in the papersizes array. Lower left coordinates -% are always set to 0. -% - -/roundpagebbox { - 7 dict begin - /papersizes [8.5 inch 11 inch 14 inch 17 inch] def - - /mappapersize { - /val exch def - /slop .5 inch def - /diff slop def - /j 0 def - 0 1 papersizes length 1 sub { - /i exch def - papersizes i get val sub abs - dup diff le {/diff exch def /j i def} {pop} ifelse - } for - diff slop lt {papersizes j get} {val} ifelse - } def - - pagebbox 0 0 put - pagebbox 1 0 put - pagebbox dup 2 get mappapersize 2 exch put - pagebbox dup 3 get mappapersize 3 exch put - end -} bind def - -%%EndProlog -%%BeginSetup -mark -/linewidth 0.5 def -/#copies 1 store -/landscape false def -/resolution 720 def -setup -2 setdecoding -%%EndSetup -%%Page: 1 1 -/saveobj save def -mark -1 pagesetup -12 B f -(The Text Editor)2 827 1 2343 1230 t -12 CW f -(sam)3200 1230 w -10 I f -(ROB PIKE)1 441 1 2659 1470 t -10 R f -(AT&T Bell Laboratories)2 993 1 2383 1650 t -(Murray Hill, New Jersey 07974)4 1267 1 2246 1770 t -10 I f -(ABSTRACT)2643 2150 w -10 CW f -(Sam)1080 2446 w -10 R f -( textual com-)2 541( A)1 129( text editor intended for bitmap displays.)6 1666(is an interactive multi-file)3 1053 4 1291 2446 t -( the mouse-driven, cut-and-paste interface to make complex)7 2450(mand language supplements)2 1150 2 1080 2566 t -( language is characterized by the composi-)6 1719( The)1 208( editing tasks easy to specify.)5 1186(or repetitive)1 487 4 1080 2686 t -( treat-)1 237( The)1 207( regular expressions to describe the structure of the text being modified.)11 2889(tion of)1 267 4 1080 2806 t -(ment of files as a database, with changes logged as atomic transactions, guides the imple-)14 3600 1 1080 2926 t -(mentation and makes a general `undo' mechanism straightforward.)7 2672 1 1080 3046 t -10 CW f -(Sam)1330 3202 w -10 R f -( a low-bandwidth stream, one)4 1224(is implemented as two processes connected by)6 1912 2 1544 3202 t -( it can run)3 435( Therefore)1 453( the other the editing algorithms.)5 1360(process handling the display and)4 1352 4 1080 3322 t -( with both pro-)3 600(with the display process in a bitmap terminal and the editor on a local host,)14 3000 2 1080 3442 t -( process in the terminal and the edi-)7 1442(cesses on a bitmap-equipped host, or with the display)8 2158 2 1080 3562 t -( can even run without a bitmap)6 1243( suppressing the display process, it)5 1388( By)1 167(tor in a remote host.)4 802 4 1080 3682 t -(terminal.)1080 3802 w -( 17, number)2 502(This paper is reprinted from Software\320Practice and Experience, Vol)8 2848 2 1330 3958 t -(11, pp. 813-845.)2 658 1 1080 4078 t -6 R f -(KEY WORDS)1 354 1 1080 4318 t -8 R f -( Undo)1 258( expressions)1 391( Caches Regular)2 642(Text editors)1 382 4 1494 4318 t -10 B f -(Introduction)720 4438 w -10 CW f -(Sam)720 4594 w -10 R f -( that combines cut-and-paste interactive editing with an unusual command)9 3025(is an interactive text editor)4 1085 2 930 4594 t -( is written as two programs: one, the `host)8 1775( It)1 123( composition of regular expressions.)4 1499(language based on the)3 923 4 720 4714 t -( the command language and provides file access; the other,)9 2428(part,' runs on a Unix* system and implements)7 1892 2 720 4834 t -( bitmap display and supports the)5 1337(the `terminal part,' runs asynchronously on a machine with a mouse and)11 2983 2 720 4954 t -( host part may be even run in isolation on an ordinary terminal to edit)14 2859( The)1 211(display and interactive editing.)3 1250 3 720 5074 t -( command language, much like a traditional line editor, without assistance from a mouse or)14 3763(text using the)2 557 2 720 5194 t -( runs on a Blit)4 583( often, the terminal part)4 952(display. Most)1 573 3 720 5314 t -6 R f -(1)2828 5264 w -10 R f -(terminal \(actually on a Teletype DMD 5620, the pro-)8 2153 1 2887 5314 t -( Sun com-)2 423(duction version of the Blit\), whose host connection is an ordinary 9600 bps RS232 link; on the)16 3897 2 720 5434 t -(puter the host and display processes run on a single machine, connected by a pipe.)14 3283 1 720 5554 t -10 CW f -(Sam)970 5710 w -10 R f -( unlike)1 282( has no facilities for multiple fonts, graphics or tables,)9 2210( It)1 117(edits uninterpreted ASCII text.)3 1250 4 1181 5710 t -(MacWrite,)720 5830 w -6 R f -(2)1149 5780 w -10 R f -(Bravo,)1211 5830 w -6 R f -(3)1480 5780 w -10 R f -(Tioga)1542 5830 w -6 R f -(4)1775 5780 w -10 R f -(or Lara.)1 322 1 1837 5830 t -6 R f -(5)2159 5780 w -10 R f -( this)1 176( \(Throughout)1 561( has a rich command language.)5 1266(Also unlike them, it)3 816 4 2221 5830 t -(paper, the phrase)2 708 1 720 5950 t -10 I f -(command language)1 800 1 1468 5950 t -10 R f -( commands activated from the mouse)5 1575(refers to textual commands;)3 1157 2 2308 5950 t -(form the)1 344 1 720 6070 t -10 I f -(mouse language.)1 679 1 1092 6070 t -10 R f -(\))1771 6070 w -10 CW f -(Sam)1856 6070 w -10 R f -(developed as an editor for use by programmers, and tries to join the styles)13 2977 1 2063 6070 t -(of the Unix text editor)4 968 1 720 6190 t -10 CW f -(ed)1733 6190 w -6 R f -(6,7)1853 6140 w -10 R f -( cut-and-paste editors by providing a comfortable)6 2100(with that of interactive)3 967 2 1973 6190 t -( The)1 214( language driven by regular expressions.)5 1658(mouse-driven interface to a program with a solid command)8 2448 3 720 6310 t -( language, and acquired a notation for describing the)8 2186(command language developed more than the mouse)6 2134 2 720 6430 t -( a dataflow-like syntax for specifying)5 1594(structure of files more richly than as a sequence of lines, using)11 2726 2 720 6550 t -(changes.)720 6670 w -(The interactive style was influenced by)5 1576 1 970 6826 t -10 CW f -(jim)2573 6826 w -10 R f -(,)2753 6826 w -6 R f -(1)2778 6776 w -10 R f -( for the Blit, and by)5 798(an early cut-and-paste editor)3 1144 2 2835 6826 t -10 CW f -(mux)4805 6826 w -10 R f -(,)4985 6826 w -6 R f -(8)5010 6776 w -10 R f -(the Blit window system.)3 1000 1 720 6946 t -10 CW f -(Mux)1779 6946 w -10 R f -(merges the original Blit window system,)5 1662 1 1993 6946 t -10 CW f -(mpx)3688 6946 w -10 R f -(,)3868 6946 w -6 R f -(1)3893 6896 w -10 R f -(with cut-and-paste editing,)2 1084 1 3956 6946 t -8 S1 f -(__________________)720 7046 w -8 R f -(* Unix is a registered trademark of AT&T.)7 1365 1 720 7146 t -cleartomark -showpage -saveobj restore -%%EndPage: 1 1 -%%Page: 2 2 -/saveobj save def -mark -2 pagesetup -10 R f -(- 2 -)2 166 1 2797 480 t -( like a multiplexed version of)5 1199(forming something)1 768 2 720 840 t -10 CW f -(jim)2717 840 w -10 R f -(that edits the output of \(and input to\) command ses-)9 2113 1 2927 840 t -(sions rather than files.)3 882 1 720 960 t -( paper describes the command language, then the mouse language, and explains)11 3251(The first part of this)4 819 2 970 1116 t -( first of the host part, then of the)8 1290( is followed by a description of the implementation,)8 2076( That)1 234(how they interact.)2 720 4 720 1236 t -( influenced the design of)4 991( principle that)2 555( A)1 122(terminal part.)1 538 4 720 1356 t -10 CW f -(sam)2952 1356 w -10 R f -(is that it should have no explicit limits, such as)9 1882 1 3158 1356 t -( honor these two)3 663( To)1 161( secondary consideration is that it be efficient.)7 1841( A)1 122( length.)1 300(upper limits on file size or line)6 1233 6 720 1476 t -( breaking them into)3 783(goals together requires a method for efficiently manipulating huge strings \(files\) without)11 3537 2 720 1596 t -( control of the command language.)5 1407(lines, perhaps while making thousands of changes under)7 2280 2 720 1716 t -10 CW f -(Sam)4460 1716 w -10 R f -('s method)1 400 1 4640 1716 t -( updates may)2 541( These)1 295( as a transaction database, implementing changes as atomic updates.)9 2783(is to treat the file)4 701 4 720 1836 t -( is achieved through a collection of caches that minimizes)9 2328( Efficiency)1 467( easily to `undo' changes.)4 1031(be unwound)1 494 4 720 1956 t -(disc traffic and data motion, both within the two parts of the program and between them.)15 3542 1 720 2076 t -(The terminal part of)3 804 1 970 2232 t -10 CW f -(sam)1800 2232 w -10 R f -( interesting is how the two halves of the edi-)9 1791( More)1 268(is fairly straightforward.)2 975 3 2006 2232 t -( data structure that)3 746( is achieved through a)4 888( This)1 231(tor stay synchronized when either half may initiate a change.)9 2455 4 720 2352 t -(organizes the communications and is maintained in parallel by both halves.)10 3005 1 720 2472 t -(The last part of the paper chronicles the writing of)9 2067 1 970 2628 t -10 CW f -(sam)3069 2628 w -10 R f -( lessons that were learned)4 1057(and discusses the)2 702 2 3281 2628 t -(through its development and use.)4 1324 1 720 2748 t -( is composed largely of two papers of reasonable length: a description of the)13 3164(The paper is long, but)4 906 2 970 2904 t -(user interface of)2 653 1 720 3024 t -10 CW f -(sam)1401 3024 w -10 R f -( are combined because the implementa-)5 1597( They)1 258(and a discussion of its implementation.)5 1576 3 1609 3024 t -(tion is strongly influenced by the user interface, and vice versa.)10 2528 1 720 3144 t -10 B f -(The Interface)1 579 1 720 3384 t -10 CW f -(Sam)720 3540 w -10 R f -( names may be provided when it is invoked:)8 1765( File)1 206(is a text editor for multiple files.)6 1291 3 925 3540 t -9 CW f -(sam file1 file2 ...)3 1026 1 1008 3710 t -10 R f -( are not read until necessary to)6 1255( Files)1 251( files and discard unneeded ones.)5 1349(and there are commands to add new)6 1465 4 720 3890 t -( file is read; the)4 673( operations apply to an internal copy made when the)9 2214( Editing)1 359(complete some command.)2 1074 4 720 4010 t -( simplify the discussion, the)4 1124( To)1 162( is changed only by an explicit command.)7 1672(Unix file associated with the copy)5 1362 4 720 4130 t -(internal copy is here called a)5 1144 1 720 4250 t -10 I f -(file)1889 4250 w -10 R f -(, while the disc-resident original is called a)7 1714 1 2017 4250 t -10 I f -(disc file.)1 339 1 3756 4250 t -10 CW f -(Sam)970 4406 w -10 R f -( connected to a bitmap display that presents a cut-and-paste editor driven by the)13 3446(is usually)1 400 2 1194 4406 t -( special window, called the)4 1116( this mode, the command language is still available: text typed in a)12 2776(mouse. In)1 428 3 720 4526 t -10 CW f -(sam)720 4646 w -10 I f -(window,)930 4646 w -10 R f -( editing may be)3 637( Cut-and-paste)1 616( as commands to be executed in the current file.)9 1961(is interpreted)1 529 4 1297 4646 t -(used in any window \320 even in the)7 1467 1 720 4766 t -10 CW f -(sam)2223 4766 w -10 R f -( mode of operation,)3 812( other)1 241( The)1 216(window to construct commands.)3 1332 4 2439 4766 t -(invoked by starting)2 774 1 720 4886 t -10 CW f -(sam)1520 4886 w -10 R f -(with the option)2 608 1 1726 4886 t -10 CW f -(-d)2360 4886 w -10 R f -( the mouse or bitmap display,)5 1193(\(for `no download'\), does not use)5 1341 2 2506 4886 t -( even on an ordinary terminal, interactively or)7 1849(but still permits editing using the textual command language,)8 2471 2 720 5006 t -(from a script.)2 535 1 720 5126 t -(The following sections describe first the command language \(under)8 2783 1 970 5282 t -10 CW f -(sam -d)1 360 1 3789 5282 t -10 R f -(and in the)2 418 1 4185 5282 t -10 CW f -(sam)4640 5282 w -10 R f -(win-)4857 5282 w -( two languages are nearly independent, but connect through the)9 2573( These)1 293( the mouse interface.)3 846(dow\), and then)2 608 4 720 5402 t -10 I f -(current text,)1 488 1 720 5522 t -10 R f -(described below.)1 676 1 1233 5522 t -10 B f -(The Command Language)2 1090 1 720 5762 t -10 R f -( array of characters \(that is, a string\); the)8 1644(A file consists of its contents, which are an)8 1733 2 720 5918 t -10 I f -(name)4125 5918 w -10 R f -(of the associated)2 671 1 4369 5918 t -(disc file; the)2 498 1 720 6038 t -10 I f -(modified bit)1 483 1 1245 6038 t -10 R f -( those of the disc file; and a substring of the)10 1758(that states whether the contents match)5 1527 2 1755 6038 t -(contents, called the)2 786 1 720 6158 t -10 I f -(current text)1 472 1 1540 6158 t -10 R f -(or)2046 6158 w -10 I f -(dot)2163 6158 w -10 R f -( the current text is a null string, dot falls)9 1689( If)1 126( and 2\).)2 322(\(see Figures 1)2 578 4 2325 6158 t -( The)1 211(between characters.)1 791 2 720 6278 t -10 I f -(value)1753 6278 w -10 R f -( the location of the current text; the)7 1441(of dot is)2 340 2 2000 6278 t -10 I f -(contents)3811 6278 w -10 R f -(of dot are the charac-)4 866 1 4174 6278 t -(ters it contains.)2 610 1 720 6398 t -10 CW f -(Sam)1381 6398 w -10 R f -(imparts to the text no two-dimensional interpretation such as columns or fields; text is)13 3453 1 1587 6398 t -( the idea of a `line' of text as understood by most Unix programs \320 a)15 3037( Even)1 272(always one-dimensional.)1 1011 3 720 6518 t -(sequence of characters terminated by a newline character \320 is only weakly supported.)12 3454 1 720 6638 t -(The)970 6794 w -10 I f -(current file)1 453 1 1156 6794 t -10 R f -( in the)2 264( current text is therefore dot)5 1141( The)1 211(is the file to which editing commands refer.)7 1784 4 1640 6794 t -( explicitly name a particular file or piece of text, the command is)12 2827( a command doesn't)3 870( If)1 137(current file.)1 486 4 720 6914 t -( presence of multiple files and consider)6 1629( the moment, ignore the)4 988( For)1 198(assumed to apply to the current text.)6 1505 4 720 7034 t -(editing a single file.)3 794 1 720 7154 t -( for non-editing commands such as writing the file to disc,)10 2354( Except)1 329(Commands have one-letter names.)3 1387 3 970 7310 t -cleartomark -showpage -saveobj restore -%%EndPage: 2 2 -%%Page: 3 3 -/saveobj save def -mark -3 pagesetup -10 R f -(- 3 -)2 166 1 2797 480 t -cleartomark -saveobj restore -%ps_include: begin -save -/ed {exch def} def -{} /showpage ed -{} /copypage ed -{} /erasepage ed -{} /letter ed -currentdict /findfont known systemdict /findfont known and { - /findfont systemdict /findfont get def -} if -36 dict dup /PS-include-dict-dw ed begin -/context ed -count array astore /o-stack ed -%ps_include: variables begin -/llx 24 def -/lly 241 def -/urx 587.76 def -/ury 550.6 def -/w 0 def -/o 0 def -/s 0 def -/cx 2880 def -/cy -2220 def -/sx 4320 def -/sy 2520 def -/ax 0.5 def -/ay 0.5 def -/rot 0 def -%ps_include: variables end -{llx lly urx ury} /bbox ed -{newpath 2 index exch 2 index exch dup 6 index exch - moveto 3 {lineto} repeat closepath} /boxpath ed -{dup mul exch dup mul add sqrt} /len ed -{2 copy gt {exch} if pop} /min ed -{2 copy lt {exch} if pop} /max ed -{transform round exch round exch A itransform} /nice ed -{6 array} /n ed -n defaultmatrix n currentmatrix n invertmatrix n concatmatrix /A ed -urx llx sub 0 A dtransform len /Sx ed -0 ury lly sub A dtransform len /Sy ed -llx urx add 2 div lly ury add 2 div A transform /Cy ed /Cx ed -rot dup sin abs /S ed cos abs /C ed -Sx S mul Sy C mul add /H ed -Sx C mul Sy S mul add /W ed -sy H div /Scaley ed -sx W div /Scalex ed -s 0 eq {Scalex Scaley min dup /Scalex ed /Scaley ed} if -sx Scalex W mul sub 0 max ax 0.5 sub mul cx add /cx ed -sy Scaley H mul sub 0 max ay 0.5 sub mul cy add /cy ed -urx llx sub 0 A dtransform exch atan rot exch sub /rot ed -n currentmatrix initgraphics setmatrix -cx cy translate -Scalex Scaley scale -rot rotate -Cx neg Cy neg translate -A concat -bbox boxpath clip newpath -w 0 ne {gsave bbox boxpath 1 setgray fill grestore} if -end -gsave -%ps_include: inclusion begin -/picstr 98 string def -24 241 translate -563.76 309.60 scale - -783 430 1 [783 0 0 -430 0 430] -{currentfile picstr readhexstring pop} image - -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0001 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0001 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0001 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0001 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0001 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0001 -02001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfffffffe7fffffffe227ff0feffffffffffffff3ff87ff11ffcffffffff -fffffffe7fe7ffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffde01ffffe7fffffffe227fe7f9f833900fffffef3ff3e0711ffcffdffff1 -e0fffffe7fe7ffe7f3e0ffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfcfffffe7fffffffe233fe7f3f3b39e7fffffcf9ff3e7311ffcff9fffe9 -ce7fffffffe7ffc7e3ce7fffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfcfe3ffe4f879cfff773f80f3e7f3de7f0e73019fc0673bbffc8e03ffe9 -ce7ff3907f07ffa7d3ce7fffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfcfe3ffe27339cfff779fe7e7e7f25e7e6673cfcff3e73bbffc479fffd9 -ce7ff3de7e67ff67b3fe7fffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfcfe3ffe7279cdfff779fe7e7e7f25e7ce737cfcff3e73bbffce79fffd9 -ce7ff25e7ce7ffe7f3fe7fffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02ffdfcfffffe7279c3fffffcfe7e7e7f25e7ce70fcfe7f3e67ffffce79fffb9 -ce7ff25e7ce7ffe7f3fcffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fcfffffe7279f7fffffcfe7e7e7f93e7c07dfcfe7f3e0fffffce79fff80 -ce7ff25e7ce7ffe7f3f9ffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fcfffffe7279e1fffffe7e7e7e7f93e7cff87cff3f3e7fffffce79fff80 -ce7ff93e7ce7ffe7f3f3ffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fcfe3ffe7279d9fffffe7e7e7e7f93e7cff67cff3f3e7fffffce79ffff9 -ce7ff93e7ce7ffe7f3e7ffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fcfe3ffe67339cffffff3e7e7f3b93e7e6673cff9f3e7fffffce79ffff9 -ce7ff93e7e47ffe7f3c07fffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fcfe3ffe0f879cffffff381f3f8393e7f0e73e1f9c0e7fffffce7c3ffe0 -e0fff9300f27ff81c0c07fffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889ffffffffffffffffffff9fff3fffffffffffffffcffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221ffffffffffffffffffff9fff9fffffffffffffffcffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889ffffffffffffffffffffffffeffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffe7fffffffe227ff0feffffffffffffff3ff87ff11ffcffffffff -fffffffe7fe7fffffffffffcfffcffffffffffffffffffefffffffffffffffff -fffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221e07ffffe7fffffffe227fe7f9f833903fffffff3ff3e0711ffcffdffff1 -e0fffffe7fe7ff83c1fffffcff7cfffffffffffffeffff9c03ffffffffffff3e -0fffff00ffffffffff3fffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889e73ffffe7fffffffe233fe7f3f3b3939fffffff9ff3e7311ffcff9fffe9 -ce7fffffffe7ff399cfffffffe7cfffffffffffffcffff3f9ffffffffffffe3c -e7ffffe7ffffffffff9fffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221e73e3ffe4f879cfff773f80f3e7f3d39e0f07279fc0673bbffc8e03ffe9 -ce7ff3907f07ff399cffe720f80c8fffff9cfff0701fff3f9fffe1ffe73cfd3c -ffffffe7fff87ff9cf9fffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889e73e3ffe27339cfff779fe7e7e7f2539ce67313cff3e73bbffc479fffd9 -ce7ff3de7e67ff399cffe7bcfe7c47ffff9effe73cfffe7f9fffccffe73cfb3c -ffffffe7fff33ff9cfcfffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221e77e3ffe7279cdfff779fe7e7e7f253bfe67f39cff3e73bbffce79fffd9 -ce7ff25e7ce7ff399cffe4bcfe7ce7ffff92ffff3cfffe7f9fff9cfff37cff3c -ffffffe7ffe73ff9efcfffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889e0fffffe7279c3fffffcfe7e7e7f2507fe63f39e7f3e67ffffce79fffb9 -ce7ff25e7ce7ff819cffe4bcfe7ce7ffff92ffff3cfffe7f9fff9cfff0e01f3c -0fffffe7ffe73ffccfcfffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221e67ffffe7279f7fffffcfe7e7e7f9333e070739e7f3e0fffffce79fff80 -ce7ff25e7ce7fff99cffe4bcfe7ce7ffff92fff03cfffe7f9fff80fffde01f3c -e7ffffe7ffe03ffcdfcfffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889e67ffffe7279e1fffffe7e7e7e7f9333ce7e339f3f3e7fffffce79fff80 -ce7ff93e7ce7fff99cfff27cfe7ce7ffffc9ffe73cfffe7f9fff9ffff87cff3c -e7ffffe7ffe7fffcdfcfffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221e73e3ffe7279d9fffffe7e7e7e7f9339ce7f339f3f3e7fffffce79ffff9 -ce7ff93e7ce7fff99cfff27cfe7ce7ffc7c9ffe73cfffe7f9fc79ff1f67cff3c -e78fffe7f1e7fc7e3fcfffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889e73e3ffe67339cffffff3e7e7f3b9339cc67333f9f3e7fffffce79ffff9 -ce7ff93e7e47ff399cfff27cfe7ce7ffc7c9ffe63cfffe7f9fc7ccf1e73cff3c -e78fffe7f1f33c7e3fcfffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221e71e3ffe0f879cffffff381f3f839338e270707f9c0e7fffffce7c3ffe0 -e0fff9300f27ff83c1fff2601f0ce7ffc7c9fff13e1fff3f9fc7e1f1e73ffc0e -0f8fffe7f1f87c7f3f9fffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889ffffffffffffffffffff9fff3ffffffffffff3ffcffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffff3fffffffffffffffff -ffcfffffffffffff7f9fffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221ffffffffffffffffffff9fff9ffffffffffff3ffcffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffff9fffffffffffffffff -ffcffffffffffffe7f3fffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889ffffffffffffffffffffffffeffffffffffff3fffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffff -ff9ffffffffffffc7effffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889e0fe7ffffffff0fffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fcfe7fffffffe7fffffffff807fffffffbfffff03ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fcffffffffffe7ffffffffff3ffffffff3fffff39ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fcf07c8f87ff80c670e5bfff3fffc3ffc070fff39ffe73fffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fcfe7c4733ffe7e066601fff3fff99fff3e67ff39ffe7bfffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fcfe7ce673ffe7e64f249fff3fff39fff3cf3ff3bffe4bfffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fcfe7ce673ffe7e7cf249fff3fff39fff3cf3ff07ffe4bfffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fcfe7ce603ffe7e7cf249fff3fff01fff3cf3ff33ffe4bfffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fcfe7ce67fffe7e7cf249fff3fff3ffff3cf3ff33fff27fffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fcfe7ce67fffe7e7cf249fff3f8f3ffff3cf3ff39f1f27fffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fcfe7ce733ffe7e7e6649fff3f8f99fff3e67ff39f1f27fffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221e0100ce787ff81c1f0e49fff3f8fc3fff870fff38f1f27fffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffff80000000800000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221c00000000001fffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff3f80000001800000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889c00000000001fff87ffffffffffffffffffffcfffcfffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0f80078c67f00000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221c00000000001fff3fffffffffc0ffffffffffcfffcffdfffc1f8fffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff1f800ccc61800000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889c00000000001fff3fffffffffce7fffffffffffffcff9fff9cf4fffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff3f8018cc61800000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221c7c73398f0c7ffc0633872dffce7ffe1ffe320fe0c8e03ff9cf4fffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7d80180c61800000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889cc63f1f998c3fff3f033300ffce7ffccfff03cfccc479ffffcecfffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffff980180c61800000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221c063319b0cdbfff3f327924ffcefff9cfff33cf9cce79ffffcecfffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffef080180c61800000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889c06301830cdbfff3f3e7924ffc1fff9cfff3fcf9cce79ffff9dcfffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffce080180c61800000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221c7e301830cdbfff3f3e7924ffccfff80fff3fcf9cce79ffff3c07ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fff8c0000ccee1800000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889cc6301830c6dfff3f3e7924ffccfff9ffff3fcf9cce79fffe7c07ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fff08000078760f00000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221cc6301830c6dfff3f3e7924ffce7c79ffff3fcf9cce79fffcffcfffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe00000000000000000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889cce30181986dfff3f3f3324ffce7c7ccfff3fcfc8ce79fff80fcfffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffc10000000000000000ffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221c767c3e0f06dffc0e0f8724ffce3c7e1ffe0e01e4ce7c3ff80f07ffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ff837ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889c00000000001ffffffffffffffffffffffffffffcffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffc77ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221c00000000001fffffffffffffffffffffffffff9cffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffef7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889c00000000001fffffffffffffffffffffffffffc1ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fffffffff7ffffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffffffffe7ffffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889f3ffffffffcffffff9fffffc47ffffffcffffffffc47ffffe7ffe7fffff -fffffffffffffffffcfffffe1ff83fffffffffffffffffffffffffffffffffff -ffff7fc9f078380f0ffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221f3ffffffffcffffff9fffffc47dfffffcfffffff7c47ffffe7fbe7fffff -ffffffff7ffffffffcfffffcffff3ffffff7ffffffffffffffffffffffffffff -ffff7fc4e7339e7e67feffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889f3fffffffffffffffffffffc479fffffcffffffe7c47fffffff3e7fffff -fffffffe7ffffffffcfffffcffff3fffffe7ffffffffffffffffffffffffffff -ffff7fce7f33fe7ce7feffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221f27c3ce7fe0f91ce41f83ffeee0387ffc8f0f8380eefff3907c0647ffff -ce7ff8380fff8723e0fff0f01fff3f078380fff07198ce1e73ffffffffffffff -ffff7fce7f31fe7ce7feffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889f1399ce7ffcf88ce79f39ffeef9f33ffc466739e7eefff3de7f3e23ffff -cf7ff39e7fff3311ccffe67cffff3e7339e7ffe7381c0cce7bffffffffffffff -ffff7fce70383e7c07feffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221f393ce6fffcf9ccf79f3fffeef9e79ffce4f33fe7eefff25e7f3e73ffff -c97fff9e7ffe73399cffcf3cffff3ff33fe7ffff399cc9e64bffffffffffffff -ffff7fce673f1e7cfffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889f393ce1fffcf9ce679f1ffffff9e79ffce4f31fe7fffff25e7f3e73ffff -c97fff9e7ffe73399cffcf3cffff3ff31fe7ffff39fcf9e64bffffffffffffff -ffff7fce673f9e7cfffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221f393cfbfffcf9ce6f9f83fffff9e79ffce4f383e7fffff25e7f3e73ffff -c97ff81e7ffe03399cffcf3cffff3f0383e7fff039fcf9e64bffffffffffffff -ffff7fcce6339e7e67feffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889f393cf0fffcf9ce6f9ff1fffff9e79ffce4f3f1e7fffff93e7f3e73ffff -e4fff39e7ffe7f399cffcf3cffff3e73f1e7ffe739fcf9e727ffffffffffffff -ffff7fc1f1383f0f0ffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221f393cecfffcf9cf1f9ff9fffff9e79ffce4f3f9e7fffff93e7f3e73ffe3 -e4fff39e7ffe7f399cffcf3cffff3e73f9e7ffe739fcf9e727ffffffffffffff -ffff7fcffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889f3399ce7ffcf9cf1f9f39fffff9f33ffce66739e7fffff93e7f3e73ffe3 -e4fff31e7fff3339c8ffe67cffff3e6339e7ffe639fcfccf27ffffffffffffff -ffff7fcffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221f07c3ce7fe019cf1c0383fffffc387ffce70f83f0fffff9300f8673ffe3 -e4fff89f0fff8739e4fff0f03ff8071383f0fff130783e1f27ffffffffffffff -ffff7fcffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fffffffffff87feffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fffffffffff3ffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fffffffffff3ffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fe0e47838cc07feffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fce62339c0f3ffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fcfe73f9ccf3ffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fc7e73f9cff3ffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fe0e7381cff3ffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffc67339cff3ffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffe67339cff3ffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -02001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fce67331cff3ffeffffffffffffffffffffffffffffffffffffffffffff -ff81 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007fe0e738983c0ffe00000000000000000000000000000000000000000000 -0001 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007ffffffffffffffe00000000000000000000000000000000000000000000 -0001 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007ffffffffffffffe00000000000000000000000000000000000000000000 -0001 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00007ffffffffffffffe00000000000000000000000000000000000000000000 -0001 -0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffc1fffffcffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fff9fffffcffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221ffffffffffe1e7ffffffffff3ffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fff9fffffcffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffffffffcfe7fff03fffff3ffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fff9f87c3ce7ffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221ffffffffffcffffff03ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fff9f3399cefffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffffffff0107f077fff9383f87fffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fff9e793ccdfffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221ffffffffffcfe7e677fff89f3f33fffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fff9e793ccbfffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffffffffcfe7ce71fff9cf3e73fffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fff9e793cc3fffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fff80fffffcfe7ce7c7ff9cf3e7ffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fff9e793cc9fffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fff80fffffcfe7ce7f3ff9cf3e7ffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fff9e793cccfffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221ffffffffffcfe7ce7f3ff9cf3e7ffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fff9f3399ce7ffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffff1fffcfe7ce7f3c79cf3e7ffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffc0387c3ce7ffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221ffffff1fffcfe7e4673c799f3f33fffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffff1fff0300f2707c78380787fffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffe7ffff9fffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffffffffffffce7ffff9fffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221ffffffffffffffe0fffff9fffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffefffffffefffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221ff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffcfffffffe7ffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ff9cb7399cf3ffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221ff3ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ff3c03399cf9ffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ff3c1c6633879cfffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fe7c9339cdfcffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fe79ce0703339efffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fc7c9339c3fc7feffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fe7fce67327992fffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fe7c9339f7fcffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fcffce7f3e7992fffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ff3c9339e1f9ffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fcfc0e7f3e7992fffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ff9c9339d9f3ffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f9f9ce7f3e79c9fffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffcc93119ce7ffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f9f9ce7f3e79c9fffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffec93899cefffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f3f98e7f3f33c9fffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f3fc4c1e0f87c9fffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fe7fffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fe7fffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fcffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7fcf07198ce1e73effffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7f9e7381c0cce7beffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7f9ff399cc9e64beffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7f3ff39fcf9e64beffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7f3f039fcf9e64beffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7e7e739fcf9e727effffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7e7e739fcf9e727effffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7cfe639fcfccf27effffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff7cff130783e1f27effffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff79fffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff79fffffffffffffeffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0001 -00000000000000000000000000000000000000000000077fef81fffff3ffffff -fceec00c0303e633f060300060060fc77ffe7feffff8f07fffff3ff3fff3f9f0 -7fffff3fdf3fffffffffffffffdfff80e07ff01c1f8ffffffffffffffe000000 -0001 -0ffffffffffffffffffffffffffffffffffffffffffff77fef9ffffff3ffffff -fcee600c060626330000300030060c677ffe7fcffff4e73ffffffff3ffe3f1e7 -3fffffff9f3fffffffffffffff9fff80e07ff019cf4ffffffffffffffeffffff -ffe1 -0ffffffffffffffffffffffffffffffffffffffffffff77fef9ff1fff27c3ce7 -fc44603f860c061303e0301e301fcc622ffe4701fff4e73ff9c83f83ffd3e9e7 -3ff9c83e0323ffffe4739ffe0e03fffeefffffd9cf4ffffffffffffffeffffff -ffe1 -0e001ffffffffffffffffffffffffffffffffffffffff77fef9ff1fff1399ce7 -fc44300c0c0c06d30060303318060c622ffe23cfffece73ff9ef3f33ffb3d9ff -3ff9ef3f9f11ffffe233dffce79ffffcefffff99cecffffffffffffffeffffff -ffe1 -0e889ffffffffffffffffffffffffffffcffffe7fffff77fef9ff1fff393ce6f -fc44300c0c0c06d30060306318060c622ffe73cfffece73ff92f3e73fff3f9ff -3ff92f3f9f39ffffe7325fffe79ffff9e3ffff39cecffffffffffffffeffffff -ffe1 -0e221fffffffffffffffbffffffffffffcffffe7fffff77fef83fffff393ce1f -fc00180c0c0c06d3e06030630c060cc00ffe73cfffdce73ff92f3e73fff3f9fe -7ff92f3f9f39ffffe7325fffe79ffff3f8fffe79cdcffffffffffffffeffffff -ffe1 -0e889fffffffffffffff3fffffffffffffffffe7fffff77fef9ffffff393cfbf -fc00180c0c0c03630060307f0c060f800ffe73cfffc0673ff92f3e73fff3f9fc -fff92f3f9f39ffffe7325ffe079fffe7fe7ffcf9cc07fffffffffffffeffffff -ffe1 -0e221f19e1f0673c3c1c0707ffc1ffe720f91f070f39f77fef9ffffff393cf0f -fc000c0c0c0c03630060306006060c000ffe73cfffc0673ffc9f3e73fff3f9f9 -fffc9f3f9f39ffffe7393ffce79fffe7fe7ffcf9cc07fffffffffffffeffffff -ffe1 -0e889f81cce6673999cf3e73ff9cffe7bcf88e66673df77fef9ff1fff393cecf -fc000c0c0c0c03630060306006060c000ffe73cffffce73ffc9f3e73fff3f9f3 -fffc9f3f9f39fff1e7393ffce79fffcffe78f9f9cfcffffffffffffffeffffff -ffe1 -0e221f999cce673399ff3e7ffffcffe4bcf9cce4f325f77fef9ff1fff3399ce7 -fc00060c0c0623630060303303060c000ffe73cffffce73ffc9f3f23fff3f9e0 -3ffc9f3f9f39fff1e7393ffcc79fffcfce78f9f9cfcffffffffffffffeffffff -ffe1 -0e889f9f9cce673398ff3e3ffffcffe4bcf9cce4f325f77fef9ff1fff07c3ce7 -fc00063f0603e36303fdfe1e031f8c000ffe73e1fff0707ffc980793ffc0e060 -3ffc9807c339fff1e7393ffe27c3ffcfe0f8f9fc1f07fffffffffffffeffffff -ffe1 -0e221f9f80ce67301c1f3f07ffc0ffe4bcf9cce4f325f77fefffffffffffffff -fc0003000600000000000000018000000fffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffcfffffffffffffffffffffeffffff -ffe1 -0e889f9f9fce6733ff8f3fe3ff9cfff27cf9cce4f393f77fefffffffffffffff -fc0003000300000000000000018000000fffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffcfffffffffffffffffffffeffffff -ffe1 -0e221f9f9fce6733ffcf3ff3ff9cfff27cf9cce4f393f77fefffffffffffffff -fc0000000080000000000000000000000fffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffff9fffffffffffffffffffffeffffff -ffe1 -0e889f9fcce4623999cf3e73ff98fff27cf9ce466793f77fefffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221f07e1f2713c3c1f8707ffc4fff26019cf270f93f77fefffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889ffffffe7ffffffffffffffffffffffffffffffff77fefffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221ffffffe7ffffffffffffffffffffffffffffffff77fefffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889ffffffe7ffffffffffffffffffffffffffffffff7088fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221ffffffffffffffffffffffffffffffffffffffff7222fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889ffffffffffffffffffffffffffffffffffffffff7088fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221fffe0ce7ffffffffffffffffffffffffffffffff7222fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889fffcece7ffffffffffffffffffffffffffffffff7088fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221fff9fcf7ff23e1ce7fffffffffffffffffffffff7222fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889fff9fc97ff11cccf7fffffffffffffffffffffff7088fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221fff9fc97ff399cc97fffffffffffffffffffffff7222fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889fff9fc97ff399cc97fffffffffffffffffffffff7088fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221fff9fe4fff3980c97fffffffffffffffffffffff7222fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889fff9fe4fff399fe4ffffffffffffffffffffffff7088fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221fc79fe4fff399fe4fffc7fffffffffffffffffff7222fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889fc7cee4fff39cce4fffc7fffffffffffffffffff7088fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221fc7e0e4fff39e1e4fffc7fffffffffffffffffff7222f07f3ffffffff87 -fffffffffffffffffffffffffffff3ffff87c3ffffffffffff0f87ffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889fffffffffffffffffffe7fffffffffffffffffff7088fe7f3ffffffff3f -ffffffffe0f83fffffffefffffe733ffff3f9fffffffe07ffe7f3fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221fffffffffffffffffffe7fffffffffffffffffff7222fe7ffffffffff3f -ffffffffe6739fffffffcfffffe733ffff3f9fffffffe73ffe7f3fffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889fffffffffffffffffffcffffffffffffffffffff7088fe783e47c3ffc06 -33872dffe7339ffc8fff01c3ffe23279cc0603c38cffe733980c078719ffe0ff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221ffffffffffffffffffffffffffffffffffffffff7222fe7f3e2399fff3f -033300ffe73f9ffc47ffcf99ffe23139cf3f9f99c0ffe7339e7f3f3381ffce7f -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889ffffffffffffffffffffffffffffffffffffffff7088fe7f3e7339fff3f -327924ffe73f9ffce7ffcf3cffe93399cf3f9f39ccffe7739e7f3e7399ffcfff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221fffe0ce7ffffffffffffffffffffffffffffffff7222fe7f3e7339fff3f -3e7924ffe73f3ffce7ffcf3cffe93399cf3f9f39cfffe0f39e7f3e739fffc7ff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889fffcece7ffffffffffffffffffffffffffffffff7088fe7f3e7301fff3f -3e7924ffe73e7ffce7ffcf3cffe93399cf3f9f01cfffe7739e7f3e039fffe0ff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221fff9fcf7ff39e1c670f39fffffffffffffffffff7222fe7f3e733ffff3f -3e7924ffe73cfffce7ffcf3cffe93399cf3f9f3fcfffe7339e7f3e7f9ffffc7f -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889fff9fc97ff39cce066739fffffffffffffffffff7088fe7f3e733ffff3f -3e7924ffe739fe3ce7ffcf3cffef3399cf3f9f3fcff1e7339e7f3e7f9fe3fe7f -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221fff9fc97ff9b9ce64f39bfffffffffffffffffff7222fe7f3e7399fff3f -3f3324ffe6701e3ce7ffcf99ffef33388f3f9f99cff1e7311e7f3f339fe3ce7f -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889fff9fc97ff879ce7cf387fffffffffffffffffff7088f0080673c3ffc0e -0f8724ffe0f01e3ce7ffe1c3ffef307c4c0e07c383f1e078981c0f8707e3e0ff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221fff9fe4fffef80e7cf3effffffffffffffffffff7222fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889fff9fe4fffc39fe7cf3c3fffffffffffffffffff7088fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221fc79fe4fffb39fe7cf3b3fffffffffffffffffff7222fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889fc7cee4fff39cce7e6739fffffffffffffffffff7088fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221fc7e0e4fff39e1c1f0f39fffffffffffffffffff7222fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889ffffffffffffffffffffffffffffffffffffffff7088fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221ffffffffffffffffffffffffffffffffffffffff7222fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889ffffffffffffffffffffffffffffffffffffffff7088fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221ffffffffffffffffffffffffffffffffffffffff7222fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889ffffffffffffffffffffffffffffffffffffffff7088fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221ffffffffffffffffffffffffffffffffffffffff7222fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889ffffffffffffffffffffffffffffffffffffffff7088fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221f878cfffffffffffffffffffffffffffffffffff7222fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889f33c0fffffffffffffffffffffffffffffffffff7088fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221e79ccfffffffffffffffffffffffffffffffffff7222fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889e79cffffffffffffffffffffffffffffffffffff7088fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221e79cffffffffffffffffffffffffffffffffffff7000fffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889e79cffffffffffffffffffffffffffffffffffff7ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e221e79cffffffffffffffffffffffffffffffffffff7ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff -ffe1 -0e889f33cffffffffffffffffffffffffffffffffffff0000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000ffffff -ffe1 -0e221f8783ffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffe0ce7ffffffffe7fffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffcece7ffffffffe7fffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fff9fcf7ff19e1e0e478393f0ffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fff9fc97ff81ccce6233989e67fffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfff9fc97ff999ccfe73f99cce7fffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0effdfff9fc97ff9f9cc7e73f99cce7fffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fff9fe4fff9f80e0e73819cc07fffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fff9fe4fff9f9ffc673399ccfffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fc79fe4fff9f9ffe673399ccffffc7fffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fc7cee4fff9fccce6733199e67ffc7fffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fc7e0e4fff07e1e0e738983f0fffc7fffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffff9ffffffe7fffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffff9ffffffe7fffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffff9ffffffcffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fcffffffff3fffffffffffffffff3ffffffffffffffffffffffffffffff -fffffe1fffffffffffcfffffffffffffff07fffffffffffffffffffffffffffc -fffffffffff9fff9ffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fcff7fffff3fffffffffffffffdf3ffffffffffffffffffffffffffffff -fffffcfffffffffff7cfffffffffffffffe7fffffffffffffffff7fffffffffc -fffffffffff9fef9ffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffe7fffff3fffffffffffffff9f3ffffffffffffffffffffffffffffff -fffffcffffffffffe7cfffffffffffffffe7ffffffffffffffffe7fffffffffc -fffffffffffffcf9ffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221e0f80fff8723c1c8f83c3c1ffe0323e1ffcb7879ce0f87ffe1ce63383c3 -c67ff018ce1cb7ff80c8f87ff9ce0e7383e7fff07198ce1e73ff80e1fff83ffc -9f0f39ffce41f0191fffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fcfe7fff33119cc4733999cfff9f11ccffc03339cce733ffccce7033999 -e07ffcfc0ccc03ffe7c4733ff9cce67339e7ffe7381c0cce7bffe7ccfff39ffc -4e6739ffcf79fcf88fffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fcfe7ffe7339fcce673399ffff9f399cffc92799ccfe73ff9cce7333f3c -e67ffcfcc9e493ffe7ce673ff9ccfe73f9e7ffff399cc9e64bffe79e7fff9ffc -e4f39bffc979fcf9cfffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fcfe7ffe7f39fcce673398ffff9f399cffc92799cc7e73ff9fce73f1f3c -e7fffcfcf9e493ffe7ce673ff9cc7e73f9e7ffff39fcf9e64bffe79e7fff9ffc -e4f387ffc979fcf9cfffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fcfe7ffe7f39c0ce67301c1fff9f3980ffc92799ce0e03ff9fce73f833c -e7fffcfcf9e493ffe7ce603ff9ce0e7381e7fff039fcf9e64bffe79e7ff81ffc -e4f3efffc979fcf9cfffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fcfe7ffe7f399cce6733ff8fff9f399fffc92799cfc67fff9fce73ff13c -e7fffcfcf9e493ffe7ce67fff9cfc67339e7ffe739fcf9e727ffe79e7ff39ffc -e4f3c3ffe4f9fcf9cfffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fcfe7ffe7f399cce6733ffcfff9f399fffc92799cfe67fff9fce73ff93c -e7fffcfcf9e493ffe7ce67fff9cfe67339e7ffe739fcf9e727ffe79e7ff39ffc -e4f3b3ffe4f9fcf9cfffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fcfe7fff333998ce723999cfff9f39ccffc933388ce733ffccc473f3999 -e7fffcfcfccc93ffe7ce733ff88ce62331e7ffe639fcfccf27ffe7ccfff31ffc -ce6739ffe4f9fcf9cfffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221e01f0fff8739c4ce793c3c1fffc339e1ffc9387c4e0f87ffe1e260f83c3 -c1fff0383e1c93fff0ce787ffc4e0f138900fff130783e1f27fff0e1fff89ffc -1f0f39ffe4c03e19cfffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffffffffffffffff3ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221ffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffff07ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffffffffff0783fffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221ffffffffffffe7f3fffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffffffffffe7f3fffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f83ffe0cb783e7f3fff838cc670f39fffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f39ffce40339e7f3fff39c0e06673dfffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221ff9ffcfc93f9e7f3ffff9cce64f325fffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ff9ffc7c93f9e7f3ffff9cfe7cf325fffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f81ffe0c9381e7f3fff81cfe7cf325fffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f39fffc49339e7f3fff39cfe7cf393fffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f39fffe49339e7f3fff39cfe7cf393e3fffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f31ffce49331e7f3fff31cfe7e6793e3fffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f89ffe0c938900807ff8983c1f0f93e3fffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000 -000000000000001fffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffffffff3fe7fffffffffffffffffffffff3fffffffffffffffffffff -fffffff9ffffffffffffff3fffffffffcffffe79ffffffffffffffffffc00003 -006000000000001ffffffffffffffffff07fffff3fffffffffffffffffffffff -ffe1 -0e221f03fffffdf3fe7ffffffff7fffdffffffffdf3fffffffffffffffffffff -fffffff9ffffffffffffff3fff7fffffcffffe79ffffffbfffffffffffc00003 -006010000000001ffffffffff7fffffffe7fffff3fffffffffffffffffffffff -ffe1 -0e889fcffffff9f3ffffffffffe7fff9ffffffff9f3fffffffffffffffffffff -fffffff9ffffffffffffff3ffe7ffffffffffe7fffffff3fffffffffffc00003 -000030000000001fffffffffe7fffffffe7fffff3fffffffffffffffffffffff -ffe1 -0e221fcf91ffe032307e0fff8380e0e03c3ffffe0323e1ffcb7879ce0f87ff2d -e0e73ff93f0fff39c1f0f83ff80e1ffe0f91f041fc3c1c0787ffc1c8ffc7c733 -63e0fe731f1ccc7ffc6787c380e0e47c1e7f0fff279cffffffffffffffffffff -ffe1 -0e889fcf88fff9f11e7ce7ff39e7ce79f99fffff9f11ccffc03339cce733ff00 -ce673ff89e67ff399ce6733ffe7ccfffcf88e679f999cf3f33ff9cc47fcc63f3 -b060303f318fcc7ffe073399e7ce62399e7e67ff139cffffffffffffffffffff -ffe1 -0e221fcf9cfff9f39e7cffff3fe7fe79f39fffff9f399cffc92799ccfe73ff24 -fe67bff9cce7ff399fce673ffe79e7ffcf9cce79f39fcf3e73fffcce7fc06333 -18603033018ccc3ffe667339e7fe67339e7ce7ff399effffffffffffffffffff -ffe1 -0e889fcf9cfff9f39e7c7fff1fe7fe79f39fffff9f399cffc92799cc7e73ff24 -fe733ff9cce7ff398fce673ffe79e7ffcf9cce79f3ffcf3e73fffcce7fc06303 -18603030018c067ffe7e733fe7fe67339e7ce7ff39ccffffffffffffffffffff -ffe1 -0e221fcf9cfff9f39e7e0fff83e7e079f01fffff9f3980ffc92799ce0e03ff24 -e0737ff9cc07ff39c1c0673ffe79e7ffcf9cce79f3fc0f3e03ffc0ce7fc7e303 -186030301f8c065ffe7e033fe7e067339e7c07ff39cdffffffffffffffffffff -ffe1 -0e889fcf9cfff9f39e7fc7fff1e7ce79f3ffffff9f399fffc92799cfc67fff24 -ce737ff9ccffff39f8cfe73ffe79e7ffcf9cce79f3f9cf3e7fff9cce7fcc6303 -18603030318c065ffe7e7f3fe7ce67339e7cffff39cdffffffffffffffffffff -ffe1 -0e221fcf9cfff9f39e7fe7fff9e7ce79f3fe3fff9f399fffc92799cfe67fff24 -ce78fff9ccffff39fccfe73ffe79e7ffcf9cce79f3f9cf3e7fff9cce7fcc6303 -18603030318c039ffe7e7f3fe7ce67339e7cffff39e3ffffffffffffffffffff -ffe1 -0e889fcf9cfff9f39e7ce7ff39e7cc79f99e3fff9f39ccffc933388ce733ff24 -cc78fff99e67ff119ce6723ffe7ccfffcf9ce479f9998f3f33ff98ce7fcce303 -30603030338c039ffe7f3399e7cc67391e7e67ff33e3ffffffffffffffffffff -ffe1 -0e221f039cfffc33900e0fff83f0e27c3c3e3fffc339e1ffc9387c4e0f87ff24 -e27cfff83f0fff89c1f0f93fff0e1ffe019cf2403c3c4f8787ffc4ce7fc767c3 -e3fc1e7c1d9f019ffc1f87c3f0e2673c900f0fff07f3ffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffff3fffffffffffffffffffffffffff -fffdffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000 -000000000000011fffffffffffffffff9ffffffffff7ffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffff3fffffffffffffffffffffffffff -fff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000 -000000000000031ffffffffffffffff39fffffffffe7ffffffffffffffffffff -ffe1 -0e889ffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffff -fff1ffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000 -000000000000071ffffffffffffffff83fffffffffc7ffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffffffffffe7fffffff9fffffffffffffffffffffffffffffffffffff -fffffffffffffffffffe7ffffff83ffffffff3ffffffff3ffffffffffffff9ff -fffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221ffffffffffffe7fffffff9ffffdfeffffffff83fffffdffffffffffffff -fffffffffffffffffffe7fffffff3ffffffff3ffffffff3fdffffffbfffef9ff -fffffffffffffffe7fbfffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffff9ffff9fcffffffff39fffff9ffffffffffffff -fffffffffffffffffffe7fffffff3fffffffffffffffffff9ffffff3fffcf9ff -ffffffffffffffffff3fffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f278cf0f078307c8f83ff93ce60301c3c8fff39ffe0e03ffc3c8f87ffe1 -e1e3323e1c67ff8391f07ff19e1f3f8783c183e47c1ff83e03ffc1c07ff0191f -0fff8793c9f0f8307c0787ffe1e1e3323e1c67ffffffffffffffffffffffffff -ffe1 -0e889f13c0e667339e7c4733ff89ce79fcf99c47fff9ffce79fff99c4733ffcc -ccf0311cce07ff3988e67ff81ccf3f33399cf3e2399fff3f9fff9cf3fffcf88e -67ff3389c4e6739e7f3f33ffccccf0311cce07ffffffffffffffffffffffffff -ffe1 -0e221f39ccce67f3fe7ce673ff9cce79fcf3cce7fff9fffe79fff3cce673ff9c -9e733399ce67fff99cce7ff999cf3e73f99ff3e7339fff3f9ffffcf3fffcf9cc -e7fe799cce4f33fe7f3e73ff9c9e733399ce67ffffffffffffffffffffffffff -ffe1 -0e889f39cfce63f1fe7ce673ff9cce79fcf3cce7ffc7fffe79fff3cce673ff9f -9e73f399ce7ffff99cce7ff9f9cf3e73f98ff3e7339fff3f9ffffcf3fffcf9cc -e7fe799cce4f31fe7f3e73ff9f9e73f399ce7fffffffffffffffffffffffffff -ffe1 -0e221f39cfc070783e7ce673ff9cce79fcf3cce7fff9ffe079fff3cce603ff9f -9e73f3980e7fff819cce7ff9f80f3e0381c1f3e7339fff3f9fffc0f3fffcf9cc -07fe799cce4f383e7f3e03ff9f9e73f3980e7fffffffffffffffffffffffffff -ffe1 -0e889f39cfcffe3f1e7ce673ff9cce79fcf3cce7fff9ffce79fff3cce67fff9f -9e73f399fe7fff399cce7ff9f9ff3e7f39f8f3e7339fff3f9fff9cf3fffcf9cc -fffe799cce4f3f1e7f3e7fff9f9e73f399fe7fffffffffffffffffffffffffff -ffe1 -0e221f39cfcfff3f9e7ce673ff9cce79fcf3cce7fff9ffce79fff3cce67fff9f -9e73f399fe7fff399cce7ff9f9ff3e7f39fcf3e7339fff3f9fff9cf3fffcf9cc -fffe799cce4f3f9e7f3e7fff9f9e73f399fe7f8fffffffffffffffffffffffff -ffe1 -0e889f33cfe667339e7ce723ff99c479fcf99ce7ff39ffcc79fff99ce733ffcc -ccf3f39cce7fff319ce47ff9fccf3f33319cf3e7391fff3f9fff98f3fffcf9ce -67ff3399cce6739e7f3f33ffccccf3f39cce7f8fffffffffffffffffffffffff -ffe1 -0e221f0783f0f078300ce793ff83e27c3e1c3ce7ff83ffe27c3ffc3ce787ffe1 -e1e0f39e1c1fff899cf27ff07e18078789c180673c9ff807c3ffc4f87ffe19cf -0fff8783c1f0f8300f8787ffe1e1e0f39e1c1f8fffffffffffffffffffffffff -ffe1 -0e889f3ffffffffffffffff3ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffff9fffffffffffffffffffff -ffffff9fcfffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f3ffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffff39fffffffffffffffffffff -ffffff9fcfffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f3fffffffffffffff07ffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffffffffffffffffffffffffff83fffffffffffffffffffff -ffffff9fcfffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffffffffffffffffffffffff9fffffffc1fffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f39fffffffffffffffffffffff9ffffffbf9fffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f39ffffffffffffffffffffffffffffff3f9fffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f11c3c6787ffe1e1e4739e1c8c1fc391c079f39ffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f1199e0733ffcccce2339ccc479f9988f3f9f39ffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f493ce6673ff9c9e6733d9cce79f399cf3f9f3dffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f493ce7e73ff9f9e673999cce79f399cf3f9f99ffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f493ce7e03ff9f9e6739b80ce79f019cf3f9f9bffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f493ce7e7fff9f9e6739b9fce79f3f9cf3f9f9bffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f793ce7e7fff9f9e673c79fce79f3f9cf3f9fc7e3ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f7999e7f33ffcccce73c7ccce79f999cf3f9fc7e3ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f79c3c1f87ffe1e1e73c7e1ce403c39cf8403e7e3ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffeff3ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffcff3ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffff8fe7ffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f3fffffffffffffffffffffffffffffff3fffff07fffff3fffffffe0fe7 -ffe7ffffcfffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f3ffffbfdffffffff07ffffffffffffff3fffffe7fffff3ffffffffcfe7 -ffe7ffffcfffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f3ffff3f9fffffffe73ffffffffffffffffffffe7fffff3ffffffffcfff -ffe7ffffcfffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f279cc06038791ffe73ff2de0e73ffc183cb727e7ce7ff27e1fff87cf07 -f0e73c3e0fffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f139cf3f9f3388ffff3ff00ce673ff9cf3c0313e7ce7ff13ccfff33cfe7 -e667799ccfffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f399cf3f9e799cffff3ff24fe67bff9ff3c9339e7cf7ff399cffe73cfe7 -ce66f399cfffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f399cf3f9e799cfff8fff24fe733ff8ff3c9339e7e67ff399cffe7fcfe7 -cfe5f399cfffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f399cf3f9e799cffff3ff24e0737ffc1f3c9339e7e6fff3980ffe7fcfe7 -cfe1f019cfffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f399cf3f9e799cffff3ff24ce737fff8f3c9339e7e6fff399fffe7fcfe7 -cfe4f3f9cfffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f399cf3f9e799cffff3ff24ce78ffffcf3c9339e7f1fff399fffe7fcfe7 -cfe673f9cf1fffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f3388f3f9f339cffe73ff24cc78fff9cf3c9333e7f1fff33ccfff33cfe7 -e667399c8f1fffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f07c4f87c3879cfff07ff24e27cfffc1804930700f9fff07e1fff860100 -f0e73c3e4f1fffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffffffffffffffffffffffffdffffffffff3ffffbffffffffffffffff -ffffffffff9fffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221ffffffffffffffffffffffffff9ffffffffff3ffff3ffffffffffffffff -ffffffffff9fffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffffffffffffffffffffffff1ffffffffff3fffe3ffffffffffffffff -ffffffffff3fffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fff9fffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fff9fffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fff9fffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f3991f0e33c39cc9f0f23ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f3d88e6703999cc4e6711ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f259cce733399cce4f339ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f259cce73f399cce4f339ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f259cc073f019cce4f339ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f939ccff3f3f9cce4f339ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f939ccff3f3f9cce4f339ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889f939ce673f9988cce6739ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221f939cf0e0fc3c4c1f0f39ffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffffffffffffcffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221ffffffffffffffcffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889ffffffffffffffcffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0e001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffe1 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0001 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0001 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0001 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0001 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffff -showpage -%ps_include: inclusion end -grestore -PS-include-dict-dw begin -o 0 ne {gsave A defaultmatrix /A ed llx lly nice urx ury nice - initgraphics 0.1 setlinewidth boxpath stroke grestore} if -clear o-stack aload pop -context end restore -%ps_include: end -/saveobj save def -mark -8 I f -(Figure 1. A typical)3 623 1 720 3580 t -8 CW f -(sam)1370 3580 w -8 I f -( The)1 167(screen, with the editing menu presented.)5 1320 2 1541 3580 t -8 CW f -(sam)3055 3580 w -8 I f -(\(command language\) window is in the middle, with file)8 1814 1 3226 3580 t -( partially obscured window is a)5 1029( The)1 164( user interface makes it easy to create these abutting windows.\))10 2059( \(The)1 191(windows above and below.)3 877 5 720 3680 t -( Each)1 206( typing and mouse operations apply, as indicated by its heavy border.)11 2242( uppermost window is that to which)6 1143( The)1 161(third file window.)2 568 5 720 3780 t -( The)1 162(window has its current text highlighted in reverse video.)8 1810 2 720 3880 t -8 CW f -(sam)2714 3880 w -8 I f -( string on the last visible line, indi-)7 1121(window's current text is the null)5 1039 2 2880 3880 t -( also Figure 2.)3 470( See)1 150(cated by a vertical bar.)4 740 3 720 3980 t -10 R f -( and leave dot set to the text resulting from the change.)11 2202(most commands make some change to the text in dot)9 2118 2 720 4220 t -(For example, the delete command,)4 1389 1 720 4340 t -10 CW f -(d)2135 4340 w -10 R f -(, deletes the text in dot, replacing it by the null string and setting dot to)15 2845 1 2195 4340 t -( change command,)2 767( The)1 213(the result.)1 402 3 720 4460 t -10 CW f -(c)2135 4460 w -10 R f -(, replaces dot by text delimited by an arbitrary punctuation character,)10 2845 1 2195 4460 t -( Thus,)1 275(conventionally a slash.)2 913 2 720 4580 t -9 CW f -(c/Peter/)1008 4750 w -10 R f -(replaces the text in dot by the string)7 1429 1 720 4930 t -10 CW f -(Peter)2174 4930 w -10 R f -(. Similarly,)1 473 1 2474 4930 t -9 CW f -(a/Peter/)1008 5100 w -10 R f -(\(append\) adds the string after dot, and)6 1516 1 720 5280 t -9 CW f -(i/Peter/)1008 5450 w -10 R f -( three leave dot set to the new text,)8 1389( All)1 178(\(insert\) inserts before dot.)3 1031 3 720 5630 t -10 CW f -(Peter)3343 5630 w -10 R f -(.)3643 5630 w -( lexically terminates a command.)4 1335(Newlines are part of the syntax of commands: the newline character)10 2735 2 970 5786 t -( it is often convenient to insert)6 1282( since)1 242( But)1 207(Within the inserted text, however, newlines are never implicit.)8 2589 4 720 5906 t -(multiple lines of text,)3 856 1 720 6026 t -10 CW f -(sam)1601 6026 w -10 R f -(has a special syntax for that case:)6 1330 1 1806 6026 t -9 CW f -(a)1008 6196 w -(some lines of text)3 972 1 1008 6306 t -(to be inserted in the file,)5 1458 1 1008 6416 t -(terminated by a period)3 1188 1 1008 6526 t -(on a line by itself)4 1026 1 1008 6636 t -(.)1008 6746 w -10 R f -(In the one-line syntax, a newline character may be specified by a C-like escape, so)14 3291 1 720 6926 t -9 CW f -(c/\\n/)1008 7096 w -10 R f -(replaces dot by a single newline character.)6 1692 1 720 7276 t -cleartomark -showpage -saveobj restore -%%EndPage: 3 3 -%%Page: 4 4 -/saveobj save def -mark -4 pagesetup -10 R f -(- 4 -)2 166 1 2797 480 t -10 CW f -(Sam)970 840 w -10 R f -(also has a substitute command,)4 1241 1 1175 840 t -10 CW f -(s)2441 840 w -10 R f -(:)2501 840 w -9 CW f -(s/)1008 1010 w -9 I f -(expression)1116 1010 w -9 CW f -(/)1501 1010 w -9 I f -(replacement)1555 1010 w -9 CW f -(/)2000 1010 w -10 R f -( if dot is the)4 530( Thus,)1 288( expression.)1 490(substitutes the replacement text for the first match, in dot, of the regular)12 3012 4 720 1190 t -(string)720 1310 w -10 CW f -(Peter)973 1310 w -10 R f -(, the command)2 591 1 1273 1310 t -9 CW f -(s/t/st/)1008 1480 w -10 R f -(changes it to)2 517 1 720 1660 t -10 CW f -(Pester)1268 1660 w -10 R f -( general,)1 349(. In)1 164 2 1628 1660 t -10 CW f -(s)2172 1660 w -10 R f -(is unnecessary, but it was inherited from)6 1653 1 2263 1660 t -10 CW f -(ed)3947 1660 w -10 R f -( has some conve-)3 711(and it)1 231 2 4098 1660 t -( instance, the replacement text may include the matched text, specified by)11 2947( For)1 189(nient variations.)1 644 3 720 1780 t -10 CW f -(&)4525 1780 w -10 R f -(:)4585 1780 w -9 CW f -(s/Peter/Oh, &, &, &, &!/)4 1296 1 1008 1950 t -10 R f -(There are also three commands that apply programs to text:)9 2376 1 970 2166 t -9 CW f -(<)1008 2336 w -9 I f -(Unix program)1 513 1 1116 2336 t -10 R f -( the)1 149( Similarly,)1 450(replaces dot by the output of the Unix program.)8 1908 3 720 2516 t -10 CW f -(>)3254 2516 w -10 R f -(command runs the program with dot as its)7 1699 1 3341 2516 t -(standard input, and)2 763 1 720 2636 t -10 CW f -(|)1508 2636 w -10 R f -( example,)1 388( For)1 189(does both.)1 411 3 1593 2636 t -9 CW f -(| sort)1 324 1 1008 2806 t -10 R f -( special sig-)2 483( newlines have no)3 724( Again,)1 321(replaces dot by the result of applying the standard sorting utility to it.)12 2792 4 720 2986 t -( these)1 235(nificance for)1 512 2 720 3106 t -10 CW f -(sam)1497 3106 w -10 R f -( text acted upon and resulting from these commands is not neces-)11 2665(commands. The)1 668 2 1707 3106 t -(sarily bounded by newlines, although for connection with Unix programs, newlines may be necessary to)14 4320 1 720 3226 t -(obey conventions.)1 727 1 720 3346 t -(One more command:)2 843 1 970 3502 t -10 CW f -(p)1838 3502 w -10 R f -( I summarizes)2 560( Table)1 277(prints the contents of dot.)4 1019 3 1923 3502 t -10 CW f -(sam)3804 3502 w -10 R f -('s commands.)1 555 1 3984 3502 t -(The value of dot may be changed by specifying an)9 2015 1 970 3658 t -10 I f -(address)3010 3658 w -10 R f -( simplest address is)3 778( The)1 206(for the command.)2 709 3 3347 3658 t -(a line number:)2 577 1 720 3778 t -9 CW f -(3)1008 3948 w -10 R f -(refers to the third line of the file, so)8 1417 1 720 4128 t -9 CW f -(3d)1008 4298 w -10 R f -( 3.)1 111(deletes the third line of the file, and implicitly renumbers the lines so the old line 4 is now numbered)19 4209 2 720 4478 t -(\(This is one of the few places where)7 1485 1 720 4598 t -10 CW f -(sam)2236 4598 w -10 R f -( Line)1 239(deals with lines directly.\))3 1028 2 2447 4598 t -10 CW f -(0)3745 4598 w -10 R f -( string at the begin-)4 797(is the null)2 407 2 3836 4598 t -( a command consists of only an address, a)8 1846( If)1 137(ning of the file.)3 679 3 720 4718 t -10 CW f -(p)3429 4718 w -10 R f -(command is assumed, so typing an)5 1504 1 3536 4718 t -(unadorned)720 4838 w -10 CW f -(3)1173 4838 w -10 R f -( are a couple of other basic addresses: a period addresses)10 2325( There)1 288(prints line 3 on the terminal.)5 1163 3 1264 4838 t -(dot itself; and a dollar sign \()6 1127 1 720 4958 t -10 CW f -($)1847 4958 w -10 R f -(\) addresses the null string at the end of the file.)10 1872 1 1907 4958 t -( the address)2 477( Thus,)1 278( single substring of the file.)5 1109(An address is always a)4 917 4 970 5114 t -10 CW f -(3)3779 5114 w -10 R f -(addresses the characters after)3 1173 1 3867 5114 t -( A)1 125( file.)1 186(the second newline of the file through the third newline of the)11 2515 3 720 5234 t -10 I f -(compound address)1 755 1 3574 5234 t -10 R f -(is constructed by)2 683 1 4357 5234 t -(the comma operator)2 798 1 720 5354 t -9 I f -(address1)1008 5524 w -9 CW f -(,)1333 5524 w -9 I f -(address2)1387 5524 w -10 R f -( the substring of the file from the beginning of)9 1860(and addresses)1 551 2 720 5704 t -10 I f -(address1)3157 5704 w -10 R f -(to the end of)3 505 1 3544 5704 t -10 I f -(address2)4075 5704 w -10 R f -( example,)1 389(. For)1 215 2 4436 5704 t -(the command)1 543 1 720 5824 t -10 CW f -(3,5p)1290 5824 w -10 R f -(prints the third through fifth lines of the file and)9 1936 1 1557 5824 t -10 CW f -(.,$d)3520 5824 w -10 R f -( the begin-)2 429(deletes the text from)3 824 2 3787 5824 t -(ning of dot to the end of the file.)8 1296 1 720 5944 t -(These addresses are all absolute positions in the file, but)9 2247 1 970 6100 t -10 CW f -(sam)3242 6100 w -10 R f -( indicated by)2 518(also has relative addresses,)3 1075 2 3447 6100 t -10 CW f -(+)720 6220 w -10 R f -(or)805 6220 w -10 CW f -(-)913 6220 w -10 R f -( example,)1 388(. For)1 214 2 973 6220 t -9 CW f -($-3)1008 6390 w -10 R f -(is the third line before the end of the file and)10 1780 1 720 6570 t -9 CW f -(.+1)1008 6740 w -10 R f -( no address appears to the left of the)8 1457( If)1 118(is the line after dot.)4 782 3 720 6920 t -10 CW f -(+)3104 6920 w -10 R f -(or)3191 6920 w -10 CW f -(-)3301 6920 w -10 R f -(, dot is assumed; if nothing appears to the)8 1679 1 3361 6920 t -(right,)720 7040 w -10 CW f -(1)959 7040 w -10 R f -( Therefore,)1 467(is assumed.)1 461 2 1044 7040 t -10 CW f -(.+1)1997 7040 w -10 R f -(may be abbreviated to just a plus sign.)7 1532 1 2202 7040 t -(The)970 7196 w -10 CW f -(+)1156 7196 w -10 R f -(operator acts relative to the end of its first argument, while the)11 2556 1 1247 7196 t -10 CW f -(-)3834 7196 w -10 R f -(operator acts relative to the)4 1114 1 3926 7196 t -(beginning. Thus)1 679 1 720 7316 t -10 CW f -(.+1)1428 7316 w -10 R f -( first line after dot,)4 758(addresses the)1 533 2 1637 7316 t -10 CW f -(.-)2956 7316 w -10 R f -(addresses the first line before dot, and)6 1534 1 3104 7316 t -10 CW f -(+-)4666 7316 w -10 R f -(refers)4814 7316 w -cleartomark -showpage -saveobj restore -%%EndPage: 4 4 -%%Page: 5 5 -/saveobj save def -mark -5 pagesetup -10 R f -(- 5 -)2 166 1 2797 480 t -(Table I.)1 310 1 2393 900 t -10 CW f -(Sam)2728 900 w -10 R f -(commands)2933 900 w -10 S f -(_ ________________________________________________________________________)1 3605 1 1077 968 t -10 R f -(Text commands)1 641 1 1077 1136 t -10 S f -(_ ________________________________________________________________________)1 3605 1 1077 1204 t -10 CW f -(a/)1077 1372 w -10 I f -(text)1197 1372 w -10 CW f -(/)1341 1372 w -10 R f -(Append text after dot)3 851 1 2160 1372 t -10 CW f -(c/)1077 1492 w -10 I f -(text)1197 1492 w -10 CW f -(/)1341 1492 w -10 R f -(Change text in dot)3 736 1 2160 1492 t -10 CW f -(i/)1077 1612 w -10 I f -(text)1197 1612 w -10 CW f -(/)1341 1612 w -10 R f -(Insert text before dot)3 834 1 2160 1612 t -10 CW f -(d)1077 1732 w -10 R f -(Delete text in dot)3 691 1 2160 1732 t -10 CW f -(s/)1077 1852 w -10 I f -(regexp)1197 1852 w -10 CW f -(/)1468 1852 w -10 I f -(text)1528 1852 w -10 CW f -(/)1672 1852 w -10 R f -(Substitute text for match of regular expression in dot)8 2109 1 2160 1852 t -10 CW f -(m)1077 1972 w -10 I f -(address)1197 1972 w -10 R f -(Move text in dot after address)5 1195 1 2160 1972 t -10 CW f -(t)1077 2092 w -10 I f -(address)1197 2092 w -10 R f -(Copy text in dot after address)5 1179 1 2160 2092 t -10 S f -(_ ________________________________________________________________________)1 3605 1 1077 2160 t -10 R f -(Display commands)1 769 1 1077 2328 t -10 S f -(_ ________________________________________________________________________)1 3605 1 1077 2396 t -10 CW f -(p)1077 2540 w -10 R f -(Print contents of dot)3 814 1 2160 2540 t -10 CW f -(=)1077 2660 w -10 R f -(Print value \(line numbers and character numbers\) of dot)8 2234 1 2160 2660 t -10 S f -(_ ________________________________________________________________________)1 3605 1 1077 2728 t -10 R f -(File commands)1 614 1 1077 2896 t -10 S f -(_ ________________________________________________________________________)1 3605 1 1077 2964 t -10 CW f -(b)1077 3108 w -10 I f -(file-list)1197 3108 w -10 R f -(Set current file to first file in list that)8 1466 1 2160 3108 t -10 CW f -(sam)3651 3108 w -10 R f -(has in menu)2 483 1 3856 3108 t -10 CW f -(B)1077 3228 w -10 I f -(file-list)1197 3228 w -10 R f -(Same as)1 330 1 2160 3228 t -10 CW f -(b)2515 3228 w -10 R f -(, but load new files)4 763 1 2575 3228 t -10 CW f -(n)1077 3348 w -10 R f -(Print menu lines of all files)5 1086 1 2160 3348 t -10 CW f -(D)1077 3468 w -10 I f -(file-list)1197 3468 w -10 R f -(Delete named files from)3 967 1 2160 3468 t -10 CW f -(sam)3152 3468 w -10 S f -(_ ________________________________________________________________________)1 3605 1 1077 3536 t -10 R f -(I/O commands)1 591 1 1077 3704 t -10 S f -(_ ________________________________________________________________________)1 3605 1 1077 3772 t -10 CW f -(e)1077 3916 w -10 I f -(filename)1197 3916 w -10 R f -(Replace file with named disc file)5 1317 1 2160 3916 t -10 CW f -(r)1077 4036 w -10 I f -(filename)1197 4036 w -10 R f -(Replace dot by contents of named disc file)7 1700 1 2160 4036 t -10 CW f -(w)1077 4156 w -10 I f -(filename)1197 4156 w -10 R f -(Write file to named disc file)5 1123 1 2160 4156 t -10 CW f -(f)1077 4276 w -10 I f -(filename)1197 4276 w -10 R f -(Set file name and print new menu line)7 1523 1 2160 4276 t -10 CW f -(<)1077 4396 w -10 I f -(Unix-command)1197 4396 w -10 R f -(Replace dot by standard output of command)6 1770 1 2160 4396 t -10 CW f -(>)1077 4516 w -10 I f -(Unix-command)1197 4516 w -10 R f -(Send dot to standard input of command)6 1577 1 2160 4516 t -10 CW f -(|)1077 4636 w -10 I f -(Unix-command)1197 4636 w -10 R f -(Replace dot by result of command applied to dot)8 1948 1 2160 4636 t -10 CW f -(!)1077 4756 w -10 I f -(Unix-command)1197 4756 w -10 R f -(Run the command)2 733 1 2160 4756 t -10 S f -(_ ________________________________________________________________________)1 3605 1 1077 4824 t -10 R f -(Loops and conditionals)2 933 1 1077 4992 t -10 S f -(_ ________________________________________________________________________)1 3605 1 1077 5060 t -10 CW f -(x/)1077 5204 w -10 I f -(regexp)1197 5204 w -10 CW f -(/)1468 5204 w -10 I f -(command)1588 5204 w -10 R f -(For each match of regexp, set dot and run command)9 2079 1 2160 5204 t -10 CW f -(y/)1077 5324 w -10 I f -(regexp)1197 5324 w -10 CW f -(/)1468 5324 w -10 I f -(command)1588 5324 w -10 R f -(Between adjacent matches of regexp, set dot and run command)9 2522 1 2160 5324 t -10 CW f -(X/)1077 5444 w -10 I f -(regexp)1197 5444 w -10 CW f -(/)1468 5444 w -10 I f -(command)1588 5444 w -10 R f -(Run command in each file whose menu line matches regexp)9 2404 1 2160 5444 t -10 CW f -(Y/)1077 5564 w -10 I f -(regexp)1197 5564 w -10 CW f -(/)1468 5564 w -10 I f -(command)1588 5564 w -10 R f -(Run command in each file whose menu line does not match)10 2386 1 2160 5564 t -10 CW f -(g/)1077 5684 w -10 I f -(regexp)1197 5684 w -10 CW f -(/)1468 5684 w -10 I f -(command)1588 5684 w -10 R f -(If dot contains a match of regexp, run command)8 1921 1 2160 5684 t -10 CW f -(v/)1077 5804 w -10 I f -(regexp)1197 5804 w -10 CW f -(/)1468 5804 w -10 I f -(command)1588 5804 w -10 R f -(If dot does not contain a match of regexp, run command)10 2243 1 2160 5804 t -10 S f -(_ ________________________________________________________________________)1 3605 1 1077 5872 t -10 R f -(Miscellany)1077 6040 w -10 S f -(_ ________________________________________________________________________)1 3605 1 1077 6108 t -10 CW f -(k)1077 6252 w -10 R f -(Set address mark to value of dot)6 1287 1 2160 6252 t -10 CW f -(q)1077 6372 w -10 R f -(Quit)2160 6372 w -10 CW f -(u)1077 6492 w -10 I f -(n)1197 6492 w -10 R f -(Undo last)1 386 1 2160 6492 t -10 I f -(n)2571 6492 w -10 R f -(\(default 1\) changes)2 764 1 2646 6492 t -10 CW f -({ })1 180 1 1077 6612 t -10 R f -(Braces group commands)2 987 1 2160 6612 t -10 S f -(_ ________________________________________________________________________)1 3605 1 1077 6668 t -cleartomark -showpage -saveobj restore -%%EndPage: 5 5 -%%Page: 6 6 -/saveobj save def -mark -6 pagesetup -10 R f -(- 6 -)2 166 1 2797 480 t -( multiple lines, and)3 788( may span)2 417( \(Dot)1 239(to the line containing the end of dot.)7 1491 4 720 840 t -10 CW f -(+)3687 840 w -10 R f -(selects the line after the end of)6 1261 1 3779 840 t -(dot, then)1 350 1 720 960 t -10 CW f -(-)1095 960 w -10 R f -(backs up one line.\))3 754 1 1180 960 t -( addresses the text matched by the expression.)7 1855(The final type of address is a regular expression, which)9 2215 2 970 1116 t -(The expression is enclosed in slashes, as in)7 1720 1 720 1236 t -9 CW f -(/)1008 1406 w -9 I f -(expression)1062 1406 w -9 CW f -(/)1447 1406 w -10 R f -( the same as those in the Unix program)8 1647(The expressions are)2 812 2 720 1586 t -10 CW f -(egrep)3215 1586 w -10 R f -(,)3515 1586 w -6 R f -(6,7)3540 1536 w -10 R f -(and include closures, alternations,)3 1389 1 3651 1586 t -( find the)2 335( They)1 256(and so on.)2 410 3 720 1706 t -10 I f -(leftmost longest)1 632 1 1747 1706 t -10 R f -( match after the)3 623(string that matches the expression, that is, the first)8 2012 2 2405 1706 t -( the search is started, and if more than one match begins at the same spot, the longest such)18 3834(point where)1 486 2 720 1826 t -( assume familiarity with the syntax for regular expressions in Unix programs.)11 3096(match. \(I)1 385 2 720 1946 t -6 R f -(9)4201 1896 w -10 R f -(\) For example,)2 585 1 4231 1946 t -9 CW f -(/x/)1008 2116 w -10 R f -(matches the next)2 671 1 720 2296 t -10 CW f -(x)1416 2296 w -10 R f -(character in the file,)3 797 1 1501 2296 t -9 CW f -(/xx*/)1008 2466 w -10 R f -(matches the next run of one or more)7 1444 1 720 2646 t -10 CW f -(x)2189 2646 w -10 R f -('s, and)1 266 1 2249 2646 t -9 CW f -(/x|Peter/)1008 2816 w -10 R f -(matches the next)2 677 1 720 2996 t -10 CW f -(x)1425 2996 w -10 R f -(or)1513 2996 w -10 CW f -(Peter)1624 2996 w -10 R f -( character' operator, a)3 885( compatibility with other Unix programs, the `any)7 2014(. For)1 217 3 1924 2996 t -(period, does not match a newline, so)6 1459 1 720 3116 t -9 CW f -(/.*/)1008 3286 w -10 R f -( from dot to the end of the line, but excludes the newline and so will not match across the)19 3663(matches the text)2 657 2 720 3466 t -(line boundary.)1 577 1 720 3586 t -( is forwards by default, so)5 1222( direction)1 416( The)1 241(Regular expressions are always relative addresses.)5 2191 4 970 3742 t -10 CW f -(/Peter/)720 3862 w -10 R f -(is really an abbreviation for)4 1103 1 1165 3862 t -10 CW f -(+/Peter/)2293 3862 w -10 R f -( search can be reversed with a minus sign, so)9 1796(. The)1 230 2 2773 3862 t -9 CW f -(-/Peter/)1008 4032 w -10 R f -(finds the first)2 595 1 720 4212 t -10 CW f -(Peter)1371 4212 w -10 R f -( with other address forms, so)5 1314( expressions may be used)4 1139( Regular)1 397(before dot.)1 463 4 1727 4212 t -10 CW f -(0+/Peter/)720 4332 w -10 R f -(finds the first)2 539 1 1288 4332 t -10 CW f -(Peter)1855 4332 w -10 R f -(in the file and)3 561 1 2183 4332 t -10 CW f -($-/Peter/)2772 4332 w -10 R f -( II summarizes)2 599( Table)1 280(finds the last.)2 542 3 3340 4332 t -10 CW f -(sam)4788 4332 w -10 R f -('s)4968 4332 w -(addresses.)720 4452 w -( who use Unix text editors such as)7 1389(The language discussed so far will not seem novel to people)10 2422 2 970 4608 t -10 CW f -(ed)4809 4608 w -10 R f -(or)4957 4608 w -10 CW f -(vi)720 4728 w -10 R f -(.)840 4728 w -6 R f -(9)865 4678 w -10 R f -( operations these commands allow, with the exception of regular expres-)10 2897(Moreover, the kinds of editing)4 1222 2 921 4728 t -( Indeed,)1 351( a mouse-based interface.)3 1028(sions and line numbers, are clearly more conveniently handled by)9 2659 3 720 4848 t -10 CW f -(sam)4788 4848 w -10 R f -('s)4968 4848 w -( For)1 194( usually made.)2 590(mouse language \(discussed at length below\) is the means by which simple changes are)13 3536 3 720 4968 t -(large or repetitive changes, however, a textual language outperforms a manual interface.)11 3523 1 720 5088 t -(Imagine that, instead of deleting just one occurrence of the string)10 2708 1 970 5244 t -10 CW f -(Peter)3714 5244 w -10 R f -( wanted to eliminate)3 849(, we)1 177 2 4014 5244 t -(every)720 5364 w -10 CW f -(Peter)970 5364 w -10 R f -( some text.)2 442( needed is an iterator that runs a command for each occurrence of)12 2656(. What's)1 367 3 1270 5364 t -10 CW f -(Sam)4788 5364 w -10 R f -('s)4968 5364 w -(iterator is called)2 643 1 720 5484 t -10 CW f -(x)1388 5484 w -10 R f -(, for extract:)2 490 1 1448 5484 t -9 CW f -(x/)1008 5654 w -9 I f -(expression)1116 5654 w -9 CW f -(/)1501 5654 w -9 I f -(command)1609 5654 w -10 R f -( text matched)2 554(finds all matches in dot of the specified expression, and for each such match, sets dot to the)17 3766 2 720 5834 t -( to delete all the)4 638( So)1 156(and runs the command.)3 932 3 720 5954 t -10 CW f -(Peters:)2471 5954 w -9 CW f -(0,$ x/Peter/ d)2 756 1 1008 6124 t -10 R f -( are to improve readability;)4 1163(\(Blanks in these examples)3 1100 2 720 6304 t -10 CW f -(sam)3027 6304 w -10 R f -( This)1 247(neither requires nor interprets them.\))4 1542 2 3251 6304 t -(searches the entire file \()4 964 1 720 6424 t -10 CW f -(0,$)1684 6424 w -10 R f -( of the string)3 514(\) for occurrences)2 680 2 1864 6424 t -10 CW f -(Peter)3085 6424 w -10 R f -(, and runs the)3 544 1 3385 6424 t -10 CW f -(d)3956 6424 w -10 R f -(command with dot set to)4 997 1 4043 6424 t -( contrast, the comparable)3 1003( \(By)1 200(each such occurrence.)2 876 3 720 6544 t -10 CW f -(ed)2824 6544 w -10 R f -(command would delete all)3 1057 1 2969 6544 t -10 I f -(lines)4051 6544 w -10 R f -(containing)4265 6544 w -10 CW f -(Peter)4712 6544 w -10 R f -(;)5012 6544 w -10 CW f -(sam)720 6664 w -10 R f -(deletes only the)2 653 1 938 6664 t -10 CW f -(Peters)1629 6664 w -10 R f -( address)1 337(.\) The)1 276 2 1989 6664 t -10 CW f -(0,$)2640 6664 w -10 R f -( be abbreviated to just a)5 1011(is commonly used, and may)4 1171 2 2858 6664 t -( another example,)2 712(comma. As)1 480 2 720 6784 t -9 CW f -(, x/Peter/ p)2 648 1 1008 6954 t -10 R f -(prints a list of)3 556 1 720 7134 t -10 CW f -(Peters,)1303 7134 w -10 R f -(one for each appearance in the file, with no intervening text \(not even newlines to)14 3290 1 1750 7134 t -(separate the instances\).)2 922 1 720 7254 t -cleartomark -showpage -saveobj restore -%%EndPage: 6 6 -%%Page: 7 7 -/saveobj save def -mark -7 pagesetup -10 R f -(- 7 -)2 166 1 2797 480 t -(Table II.)1 343 1 2402 900 t -10 CW f -(Sam)2770 900 w -10 R f -(addresses)2975 900 w -10 S f -(_ _________________________________________________________________)1 3264 1 1248 968 t -10 R f -(Simple addresses)1 691 1 1248 1136 t -10 S f -(_ _________________________________________________________________)1 3264 1 1248 1204 t -10 CW f -(#)1248 1348 w -10 I f -(n)1308 1348 w -10 R f -(The empty string after character)4 1279 1 2250 1348 t -10 I f -(n)3554 1348 w -(n)1248 1468 w -10 R f -(Line)2250 1468 w -10 I f -(n)2458 1468 w -10 R f -(.)2508 1468 w -10 CW f -(/)1248 1588 w -10 I f -(regexp)1308 1588 w -10 CW f -(/)1579 1588 w -10 R f -(The first following match of the regular expression)7 2038 1 2250 1588 t -10 CW f -(-/)1248 1708 w -10 I f -(regexp)1368 1708 w -10 CW f -(/)1639 1708 w -10 R f -(The first previous match of the regular expression)7 1993 1 2250 1708 t -10 CW f -($)1248 1828 w -10 R f -(The null string at the end of the file)8 1415 1 2250 1828 t -10 CW f -(.)1248 1948 w -10 R f -(Dot)2250 1948 w -10 CW f -(')1248 2068 w -10 R f -(The address mark, set by)4 995 1 2250 2068 t -10 CW f -(k)3270 2068 w -10 R f -(command)3355 2068 w -10 CW f -(")1248 2188 w -10 I f -(regexp)1308 2188 w -10 CW f -(")1579 2188 w -10 R f -(Dot in the file whose menu line matches regexp)8 1908 1 2250 2188 t -10 S f -(_ _________________________________________________________________)1 3264 1 1248 2256 t -10 R f -(Compound addresses)1 852 1 1248 2424 t -10 S f -(_ _________________________________________________________________)1 3264 1 1248 2492 t -10 I f -(a1)1248 2636 w -10 CW f -(+)1348 2636 w -10 I f -(a2)1408 2636 w -10 R f -(The address)1 479 1 2250 2636 t -10 I f -(a2)2754 2636 w -10 R f -(evaluated starting at right of)4 1126 1 2879 2636 t -10 I f -(a1)4030 2636 w -(a1)1248 2756 w -10 CW f -(-)1348 2756 w -10 I f -(a2 a2)1 942 1 1408 2756 t -10 R f -(evaluated in the reverse direction starting at left of)8 2012 1 2375 2756 t -10 I f -(a1)4412 2756 w -(a1)1248 2876 w -10 CW f -(,)1348 2876 w -10 I f -(a2)1408 2876 w -10 R f -(From the left of)3 630 1 2250 2876 t -10 I f -(a1)2905 2876 w -10 R f -(to the right of)3 547 1 3030 2876 t -10 I f -(a2)3602 2876 w -10 R f -(\(default)3727 2876 w -10 CW f -(0,$)4062 2876 w -10 R f -(\))4242 2876 w -10 I f -(a1)1248 2996 w -10 CW f -(;)1348 2996 w -10 I f -(a2)1408 2996 w -10 R f -(Like)2250 2996 w -10 CW f -(,)2458 2996 w -10 R f -(but sets dot after evaluating)4 1104 1 2543 2996 t -10 I f -(a1)3672 2996 w -10 S f -(_ _________________________________________________________________)1 3264 1 1248 3064 t -10 R f -(The operators)1 569 1 1440 3232 t -10 CW f -(+)2052 3232 w -10 R f -(and)2155 3232 w -10 CW f -(-)2342 3232 w -10 R f -(are high precedence, while)3 1122 1 2445 3232 t -10 CW f -(,)3610 3232 w -10 R f -(and)3713 3232 w -10 CW f -(;)3901 3232 w -10 R f -(are low)1 315 1 4005 3232 t -( both)1 208(precedence. In)1 610 2 1440 3352 t -10 CW f -(+)2288 3352 w -10 R f -(and)2378 3352 w -10 CW f -(-)2552 3352 w -10 R f -(forms,)2642 3352 w -10 I f -(a2)2930 3352 w -10 R f -(defaults to 1 and)3 678 1 3060 3352 t -10 I f -(a1)3768 3352 w -10 R f -(defaults to)1 423 1 3897 3352 t -( both)1 203(dot. If)1 269 2 1440 3472 t -10 I f -(a1)1937 3472 w -10 R f -(and)2062 3472 w -10 I f -(a2)2231 3472 w -10 R f -(are present,)1 459 1 2356 3472 t -10 CW f -(+)2840 3472 w -10 R f -(may be elided.)2 585 1 2925 3472 t -10 S f -(_ _________________________________________________________________)1 3264 1 1248 3552 t -10 R f -(Of course, the text extracted by)5 1267 1 970 3852 t -10 CW f -(x)2265 3852 w -10 R f -(may be selected by a regular expression, which complicates decid-)9 2687 1 2353 3852 t -( is resolved by generating the matches)6 1597( This)1 240( matches is chosen \320 matches may overlap.)7 1853(ing what set of)3 630 4 720 3972 t -( starting)1 338(starting from the beginning of dot using the leftmost-longest rule, and searching for each match)14 3982 2 720 4092 t -( adja-)1 228( expressions may also match null strings, but a null match)10 2363( Regular)1 371(from the end of the previous one.)6 1358 4 720 4212 t -( example,)1 388( For)1 189(cent to a non-null match is never selected; at least one character must intervene.)13 3187 3 720 4332 t -9 CW f -(, c/AAA/)1 432 1 1008 4502 t -(x/B*/ c/-/)1 540 1 1008 4612 t -(, p)1 162 1 1008 4722 t -10 R f -(produces as output)2 749 1 720 4902 t -9 CW f -(-A-A-A-)1008 5072 w -10 R f -(because the pattern)2 764 1 720 5252 t -10 CW f -(B*)1509 5252 w -10 R f -(matches the null strings separating the)5 1529 1 1654 5252 t -10 CW f -(A)3208 5252 w -10 R f -('s.)3268 5252 w -(The)970 5408 w -10 CW f -(x)1150 5408 w -10 R f -(command has a complement,)3 1165 1 1235 5408 t -10 CW f -(y)2425 5408 w -10 R f -( syntax, that executes the command with dot set to)9 2024(, with similar)2 531 2 2485 5408 t -(the text)1 297 1 720 5528 t -10 I f -(between)1042 5528 w -10 R f -( example,)1 388( For)1 189(the matches of the expression.)4 1206 3 1394 5528 t -9 CW f -(, c/AAA/)1 432 1 1008 5698 t -(y/A/ c/-/)1 486 1 1008 5808 t -(, p)1 162 1 1008 5918 t -10 R f -(produces the same result as the example above.)7 1890 1 720 6098 t -(The)970 6254 w -10 CW f -(x)1158 6254 w -10 R f -(and)1251 6254 w -10 CW f -(y)1428 6254 w -10 R f -(commands are looping constructs, and)4 1566 1 1521 6254 t -10 CW f -(sam)3120 6254 w -10 R f -(has a pair of conditional commands to go)7 1707 1 3333 6254 t -( have similar syntax:)3 830( They)1 255(with them.)1 428 3 720 6374 t -9 CW f -(g/)1008 6544 w -9 I f -(expression)1116 6544 w -9 CW f -(/)1501 6544 w -9 I f -(command)1609 6544 w -10 R f -( is different from)3 688( This)1 231(\(guard\) runs the command exactly once if dot contains a match of the expression.)13 3288 3 720 6724 t -10 CW f -(x)4955 6724 w -10 R f -(,)5015 6724 w -(which runs the command for)4 1148 1 720 6844 t -10 I f -(each)1893 6844 w -10 R f -(match:)2106 6844 w -10 CW f -(x)2403 6844 w -10 R f -(loops;)2488 6844 w -10 CW f -(g)2758 6844 w -10 R f -( Thus,)1 275(merely tests, without changing the value of dot.)7 1901 2 2843 6844 t -9 CW f -(, x/Peter/ d)2 648 1 1008 7014 t -10 R f -(deletes all occurrences of)3 1010 1 720 7194 t -10 CW f -(Peter)1755 7194 w -10 R f -(, but)1 178 1 2055 7194 t -cleartomark -showpage -saveobj restore -%%EndPage: 7 7 -%%Page: 8 8 -/saveobj save def -mark -8 pagesetup -10 R f -(- 8 -)2 166 1 2797 480 t -9 CW f -(, g/Peter/ d)2 648 1 1008 830 t -10 R f -( string\) if)2 384(deletes the whole file \(reduces it to a null)8 1687 2 720 1010 t -10 CW f -(Peter)2822 1010 w -10 R f -( complemen-)1 530( The)1 211(occurs anywhere in the text.)4 1146 3 3153 1010 t -(tary conditional is)2 722 1 720 1130 t -10 CW f -(v)1467 1130 w -10 R f -(, which runs the command if there is)7 1459 1 1527 1130 t -10 I f -(no)3011 1130 w -10 R f -(match of the expression.)3 976 1 3136 1130 t -( For)1 190(These control-structure-like commands may be composed to construct more involved operations.)10 3880 2 970 1286 t -(example, to print those lines of text that contain the string)10 2307 1 720 1406 t -10 CW f -(Peter)3052 1406 w -10 R f -(:)3352 1406 w -9 CW f -(, x/.*\\n/ g/Peter/ p)3 1080 1 1008 1576 t -10 R f -(The)720 1756 w -10 CW f -(x)908 1756 w -10 R f -( file into lines, the)4 761(breaks the)1 415 2 1001 1756 t -10 CW f -(g)2211 1756 w -10 R f -(selects those lines containing)3 1190 1 2305 1756 t -10 CW f -(Peter)3529 1756 w -10 R f -(, and the)2 359 1 3829 1756 t -10 CW f -(p)4222 1756 w -10 R f -( This)1 237(prints them.)1 487 2 4316 1756 t -(command gives an address for the)5 1416 1 720 1876 t -10 CW f -(x)2172 1876 w -10 R f -(command \(the whole file\), but because)5 1607 1 2268 1876 t -10 CW f -(g)3911 1876 w -10 R f -(does not have an explicit)4 1033 1 4007 1876 t -( the value of dot produced by the)7 1359(address, it applies to)3 831 2 720 1996 t -10 CW f -(x)2941 1996 w -10 R f -( commands in)2 573( All)1 184(command, that is, to each line.)5 1251 3 3032 1996 t -10 CW f -(sam)720 2116 w -10 R f -(except for the command to write a file to disc use dot for the default address.)15 3066 1 925 2116 t -(Composition may be continued indefinitely.)4 1764 1 970 2272 t -9 CW f -(, x/.*\\n/ g/Peter/ v/SaltPeter/ p)4 1782 1 1008 2442 t -10 R f -(prints those lines containing)3 1125 1 720 2622 t -10 CW f -(Peter)1870 2622 w -10 R f -(but)2195 2622 w -10 I f -(not)2348 2622 w -10 R f -(those containing)1 658 1 2501 2622 t -10 CW f -(SaltPeter)3184 2622 w -10 R f -(.)3724 2622 w -10 B f -(Structural Regular Expressions)2 1350 1 720 2862 t -10 R f -( non-interactive ones such as)4 1177(Unlike other Unix text editors, including the)6 1804 2 720 3018 t -10 CW f -(sed)3732 3018 w -10 R f -(and)3943 3018 w -10 CW f -(awk)4118 3018 w -10 R f -(,)4298 3018 w -6 R f -(7)4323 2968 w -10 CW f -(sam)4384 3018 w -10 R f -(is good for)2 445 1 4595 3018 t -( on-line phone book composed of records,)6 1737( example is an)3 604( An)1 182(manipulating files with multi-line `records.')4 1797 4 720 3138 t -(separated by blank lines, of the form)6 1461 1 720 3258 t -9 CW f -(Herbert Tic)1 594 1 1008 3428 t -(44 Turnip Ave., Endive, NJ)4 1404 1 1008 3538 t -(201-5555642)1008 3648 w -(Norbert Twinge)1 756 1 1008 3868 t -(16 Potato St., Cabbagetown, NJ)4 1620 1 1008 3978 t -(201-5553145)1008 4088 w -(...)1008 4308 w -10 R f -(The format may be encoded as a regular expression:)8 2083 1 720 4488 t -9 CW f -(\(.+\\n\)+)1008 4658 w -10 R f -( command to print Mr. Tic's entire record is then)9 1958( The)1 205(that is, a sequence of one or more non-blank lines.)9 2010 3 720 4838 t -9 CW f -(, x/\(.+\\n\)+/ g/\303Herbert Tic$/ p)4 1674 1 1008 5008 t -10 R f -(and that to extract just the phone number is)8 1726 1 720 5188 t -9 CW f -(, x/\(.+\\n\)+/ g/\303Herbert Tic$/ x/\303[0-9]*-[0-9]*\\n/ p)5 2754 1 1008 5358 t -10 R f -( Tic's record, extracts the phone number from)7 1862(The latter command breaks the file into records, chooses Mr.)9 2458 2 720 5538 t -(the record, and finally prints the number.)6 1636 1 720 5658 t -(A more involved problem is that of renaming a particular variable, say)11 2927 1 970 5814 t -10 CW f -(n)3932 5814 w -10 R f -(, to)1 138 1 3992 5814 t -10 CW f -(num)4165 5814 w -10 R f -(in a C program.)3 660 1 4380 5814 t -(The obvious first attempt,)3 1033 1 720 5934 t -9 CW f -(, x/n/ c/num/)2 702 1 1008 6104 t -10 R f -( flawed: it changes not only the variable)7 1628(is badly)1 317 2 720 6284 t -10 CW f -(n)2694 6284 w -10 R f -(but any letter)2 535 1 2783 6284 t -10 CW f -(n)3347 6284 w -10 R f -( need to extract all the)5 904( We)1 192(that appears.)1 508 3 3436 6284 t -(variables, and select those that match)5 1486 1 720 6404 t -10 CW f -(n)2231 6404 w -10 R f -(and only)1 347 1 2316 6404 t -10 CW f -(n)2688 6404 w -10 R f -(:)2748 6404 w -9 CW f -(, x/[A-Za-z_][A-Za-z_0-9]*/ g/n/ v/../ c/num/)4 2430 1 1008 6574 t -10 R f -(The pattern)1 458 1 720 6754 t -10 CW f -([A-Za-z_][A-Za-z_0-9]*)1204 6754 w -10 R f -( Next)1 246(matches C identifiers.)2 876 2 2550 6754 t -10 CW f -(g/n/)3699 6754 w -10 R f -(selects those containing an)3 1074 1 3966 6754 t -10 CW f -(n)720 6874 w -10 R f -(. Then)1 303 1 780 6874 t -10 CW f -(v/../)1131 6874 w -10 R f -(rejects those containing two \(or more\) characters, and finally)8 2614 1 1479 6874 t -10 CW f -(c/num/)4141 6874 w -10 R f -(changes the)1 491 1 4549 6874 t -(remainder \(identifiers)1 871 1 720 6994 t -10 CW f -(n)1620 6994 w -10 R f -(\) to)1 140 1 1680 6994 t -10 CW f -(num)1849 6994 w -10 R f -( version clearly works much better, but there may still be problems.)11 2754(. This)1 257 2 2029 6994 t -(For example, in C character and string constants, the sequence)9 2510 1 720 7114 t -10 CW f -(\\n)3257 7114 w -10 R f -( and)1 170(is interpreted as a newline character,)5 1466 2 3404 7114 t -(we don't want to change it to)6 1165 1 720 7234 t -10 CW f -(\\num.)1910 7234 w -10 R f -(This problem can be forestalled with a)6 1536 1 2235 7234 t -10 CW f -(y)3796 7234 w -10 R f -(command:)3881 7234 w -cleartomark -showpage -saveobj restore -%%EndPage: 8 8 -%%Page: 9 9 -/saveobj save def -mark -9 pagesetup -10 R f -(- 9 -)2 166 1 2797 480 t -9 CW f -(, y/\\\\n/ x/[A-Za-z_][A-Za-z_0-9]*/ g/n/ v/../ c/num/)5 2808 1 1008 830 t -10 R f -(\(the second)1 464 1 720 1010 t -10 CW f -(\\)1216 1010 w -10 R f -( reject)1 254(is necessary because of lexical conventions in regular expressions\), or we could even)12 3478 2 1308 1010 t -(character constants and strings outright:)4 1592 1 720 1130 t -9 CW f -(, y/'[\303']*'/ y/"[\303"]*"/ x/[A-Za-z_][A-Za-z_0-9]*/ g/n/ v/../ c/num/)6 3618 1 1008 1300 t -10 R f -(The)720 1480 w -10 CW f -(y)907 1480 w -10 R f -( only)1 211( The)1 213( strings.)1 325(commands in this version exclude from consideration all character constants and)10 3292 4 999 1480 t -(remaining problem is to deal with the possible occurrence of)9 2439 1 720 1600 t -10 CW f -(\\')3186 1600 w -10 R f -(or)3332 1600 w -10 CW f -(\\")3441 1600 w -10 R f -(within these sequences, but it's easy)5 1453 1 3587 1600 t -(to see how to resolve this difficulty.)6 1435 1 720 1720 t -( of the command)3 683( simple version)2 615( A)1 124(The point of these composed commands is successive refinement.)8 2648 4 970 1876 t -( can be undone;)3 644( \(Mistakes)1 449( it can be honed by adding a clause or two.)10 1755(is tried, and if it's not good enough,)7 1472 4 720 1996 t -( result-)1 283( The)1 208( the mouse language makes it unnecessary to retype the command each time.\))12 3138( Also,)1 267(see below.)1 424 5 720 2116 t -(ing chains of commands are somewhat reminiscent of shell pipelines.)9 2783 1 720 2236 t -6 R f -(7)3503 2186 w -10 R f -(Unlike pipelines, though, which pass)4 1481 1 3559 2236 t -(along modified)1 612 1 720 2356 t -10 I f -(data)1361 2356 w -10 R f -(,)1539 2356 w -10 CW f -(sam)1593 2356 w -10 R f -(commands pass a)2 707 1 1802 2356 t -10 I f -(view)2538 2356 w -10 R f -( text at each step of the command is the)9 1623( The)1 210(of the data.)2 456 3 2751 2356 t -( by step until the correct piece is available to the final)11 2237(same, but which pieces are selected is refined step)8 2083 2 720 2476 t -(step of the command line, which ultimately makes the change.)9 2494 1 720 2596 t -(In other Unix programs, regular expressions are used only for selection, as in the)13 3315 1 970 2752 t -10 CW f -(sam g)1 272 1 4317 2752 t -10 R f -(command,)4621 2752 w -(never for extraction as in the)5 1159 1 720 2872 t -10 CW f -(x)1907 2872 w -10 R f -(or)1995 2872 w -10 CW f -(y)2106 2872 w -10 R f -( patterns in)2 448( example,)1 391(command. For)1 611 3 2194 2872 t -10 CW f -(awk)3671 2872 w -6 R f -(7)3851 2822 w -10 R f -(are used to select lines to be)6 1132 1 3908 2872 t -( The)1 207( but cannot be used to describe the format of the input text, or to handle newline-free text.)17 3619(operated on,)1 494 3 720 2992 t -( the structure of a piece of text rather than its contents, as in the)14 2671(use of regular expressions to describe)5 1554 2 720 3112 t -10 CW f -(x)4980 3112 w -10 R f -(command, has been given a name:)5 1455 1 720 3232 t -10 I f -(structural regular expressions.)2 1268 1 2216 3232 t -10 R f -(When they are composed, as in the)6 1490 1 3550 3232 t -( use is discussed at greater length elsewhere.)7 1779( Their)1 266(above example, they are pleasantly expressive.)5 1870 3 720 3352 t -6 R f -(10)4635 3302 w -10 B f -(Multiple files)1 564 1 720 3628 t -10 CW f -(Sam)720 3784 w -10 R f -(has a few other commands, mostly relating to input and output.)10 2526 1 925 3784 t -9 CW f -(e discfilename)1 756 1 1008 3954 t -10 R f -(replaces the contents and name of the current file with those of the named disc file;)15 3318 1 720 4134 t -9 CW f -(w discfilename)1 756 1 1008 4304 t -10 R f -(writes the contents to the named disc file; and)8 1831 1 720 4484 t -9 CW f -(r discfilename)1 756 1 1008 4654 t -10 R f -( file's name if)3 590( these commands use the current)5 1350( All)1 188(replaces dot with the contents of the named disc file.)9 2192 4 720 4834 t -( Finally,)1 359(none is specified.)2 696 2 720 4954 t -9 CW f -(f discfilename)1 756 1 1008 5124 t -10 R f -(changes the name associated with the file and displays the result:)10 2596 1 720 5304 t -9 CW f -('-. discfilename)1 864 1 1008 5474 t -10 R f -(This output is called the file's)5 1226 1 720 5654 t -10 I f -(menu line,)1 423 1 1978 5654 t -10 R f -( contents of the file's line in the button 3 menu)10 1951(because it is the)3 656 2 2433 5654 t -( The)1 205( first three characters are a concise notation for the state of the file.)13 2677( The)1 206(\(described in the next section\).)4 1232 4 720 5774 t -( sign indicates the number of windows open on the)9 2052( minus)1 271( The)1 206(apostrophe signifies that the file is modified.)6 1791 4 720 5894 t -(file \(see the next section\):)4 1071 1 720 6014 t -10 CW f -(-)1826 6014 w -10 R f -(means none,)1 509 1 1921 6014 t -10 CW f -(+)2465 6014 w -10 R f -(means one, and)2 636 1 2560 6014 t -10 CW f -(*)3230 6014 w -10 R f -( the period)2 445( Finally,)1 368(means more than one.)3 903 3 3324 6014 t -( are useful for controlling the)5 1192( characters)1 432( These)1 292(indicates that this is the current file.)6 1453 4 720 6134 t -10 CW f -(X)4119 6134 w -10 R f -(command, described)1 831 1 4209 6134 t -(shortly.)720 6254 w -10 CW f -(Sam)970 6410 w -10 R f -( \(such as all the source for a program\) by invoking it with a)13 2384(may be started with a set of disc files)8 1481 2 1175 6410 t -(list of file names as arguments, and more may be added or deleted on demand.)14 3133 1 720 6530 t -9 CW f -(B discfile1 discfile2 ...)3 1350 1 1008 6700 t -10 R f -(adds the named files to)4 921 1 720 6880 t -10 CW f -(sam)1666 6880 w -10 R f -('s list, and)2 414 1 1846 6880 t -9 CW f -(D discfile1 discfile2 ...)3 1350 1 1008 7050 t -10 R f -(removes them from)2 790 1 720 7230 t -10 CW f -(sam)1539 7230 w -10 R f -( these commands have a)4 990( Both)1 250('s memory \(without effect on associated disc files\).)7 2081 3 1719 7230 t -cleartomark -showpage -saveobj restore -%%EndPage: 9 9 -%%Page: 10 10 -/saveobj save def -mark -10 pagesetup -10 R f -(- 10 -)2 216 1 2772 480 t -(syntax for using the shell)4 1005 1 720 840 t -6 R f -(7)1725 790 w -10 R f -(\(the Unix command interpreter\) to generate the lists:)7 2099 1 1780 840 t -9 CW f -(B