home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-01-24 | 114.7 KB | 3,154 lines |
- Newsgroups: comp.sys.hp
- Path: sparky!uunet!cs.utexas.edu!torn!watserv2.uwaterloo.ca!maxwell.uwaterloo.ca!gordon
- From: gordon@maxwell.uwaterloo.ca (Gordon R. Strachan)
- Subject: XControl program and terminal emulator 4/4
- Message-ID: <C1CAnL.FMp@watserv2.uwaterloo.ca>
- Sender: news@watserv2.uwaterloo.ca
- Reply-To: gordon@maxwell.uwaterloo.ca (Gordon R. Strachan)
- Organization: University of Waterloo
- Date: Sun, 24 Jan 1993 03:50:09 GMT
- Lines: 3142
-
-
- # This is a shell archive. Remove anything before this line,
- # then unpack it by saving it in a file and typing "sh file".
- #
- # Wrapped by Gordon R. Strachan <gordon@maxwell> on Sat Jan 23 22:18:43 1993
- #
- # This archive contains:
- # GenTerm/translators GenTerm/xterm.par
- # xcontrol/Command.c xcontrol/XControl.c
- # xcontrol/XControl.h xcontrol/XControl.man
- # xcontrol/XVi.ad MANIFEST
- #
- # Error checking via wc(1) will be performed.
-
- LANG=""; export LANG
- PATH=/bin:/usr/bin:$PATH; export PATH
-
- echo x - GenTerm/translators
- cat >GenTerm/translators <<'@EOF'
- # Valid Special parsers
- #
- # <Digits(def,sep,n)> : Matches a list of 0 or more digits. def is the
- # default value to return if no digits are encountered.
- # sep is the single character which each integer in its
- # list. n is the optional length of each character
- # <Int(n)> : Matches an integer n digits long (if no arg arbitrary
- # length)
- # <Select(c1,c2...cn) : Matches either c1 or c2 or ... cn where c1 etc are
- # single characters
- # <String(n)> : Matches an arbitrary string of n characters long
- # <Upto(c)> : Matches an arbitrary string upto character c
- #
- # Valid Translators
- #
- # CarriageReturn() : Move cursor to leftmost column
- # CheckModifiers(m,which,p) : Query the information in the modifier returned
- # by GetLastButtonEvent. m is the modifier
- # value, which is either "Shift" "Meta" or
- # "Control". If the modifier is set, argument
- # p is set to one, otherwise it is set to 0
- # ClearDisplay(top,bottom) : Clear the display from row top to bottom
- # ClearLine(flag) : Clear line flag=0 clears entire line flag=1
- # clears from cursor to end of line flag=2
- # clears from start of line to the cursor
- # ClearMemory(which) : Clears the off screen memory. which=0, clears
- # allmemory, which=1 clears memory below the
- # screen, which=2 clears the memory above the
- # screen
- # ConvertPosition(x,y,r,c) : The row and columns number which correspond
- # to the given x and y position are returned in
- # position r and c.
- # DefinePen(n,fr,fg,fb,
- # br,bg,bb) : Defines the foreground and background colour
- # of the given pen. N is the pen number. fr,
- # fg,fb are floating point numbers between 0
- # and 1 which specify the rgb (or hsl)
- # components of the desired foreground pen. br,
- # bg,bb define the colour of the background.
- # DeleteCharacters(n) : Delete the next n characters on the line
- # DeleteLines(n) : This function deletes n lines starting at the
- # current cursor position
- # DownLine(n,wrap) : Move cursor down n lines. Screen will be
- # scrolled up if wrap = 0 if wrap = 1 the cursor
- # will wrap around to the top. If wrap = 2
- # the cursor will stick at the bottom.
- # Emit(s1,s2,...) : Invokes the keybd Callback with the given
- # arguements as the data
- # EscapeCallback(s1,s2...) : Invoke the esc callback with the given
- # arguments as the data
- # ExecuteFunctionKey(n) : Causes the terminal to execute the specified
- # functionkey.
- # Fetch(a,b) : Get the global variable a and return it in
- # argument number b
- # GetArg(a,b) : Get the value of argument number a and return
- # it in arg b. i.e. implement and indirect
- # reference to $a
- # GetBottomText(arg) : Find the last row which has data on it and
- # return the row number in argument number arg
- # GetFont(f) : Returns the current font (0 or 1) in argument
- # number f
- # GetLine(r,c,where) : Get the text on the screen starting at
- # position (r,c) and put the result in argument
- # where
- # GetLastButtonEvent(b,x,y,m) : Get information on the last button press
- # event. The button number is placed in
- # position b. The x and y position is put in
- # positions x and y. Finally, the modifiers are
- # put in position m.
- # GetPen(p) : Get the number of the current pen and put it
- # in argument number p
- # GetPosition(r,c) : Get the current cursor position and return the
- # row number in argument number r and the
- # column number in argument number c
- # GetResource(name,pos) : Get the value of resource "name" and return
- # it in argument number pos
- # GetScreenSize(r,c) : Get the current size of the screen and put the
- # number of rows in paramter r and the number of
- # columns in parameter c
- # GetStringLen(s,p) : Gets the length of string s and returns it
- # in parameter p
- # GetSubString(s,start,end,p) : Gets the context of string s from positions
- # start to end inclusive and returns the result
- # in parameter p.
- # GetTop(arg) : Get the number of the line at the top of the
- # screen and returns it in argument number arg
- # GetTopOfScrollRegion(n,a) : Finds the top of scroll region n and returns
- # the result in argument a. If the scroll
- # region does not exist then row zero is
- # returned
- # If(c1,cond,c2,label) : If the expression c1 cond c2 is true then
- # branch to the function whose label is label.
- # Ignore() : do nothing
- # InsertLines(n,where) : Insert n lines. If where=1 inserts after
- # current row where=0 inserts before current row
- # IntToString(n,len,s) : Performs an explicit integer to string
- # conversion. n is the integer value, len is
- # the number of digits the final result should
- # contain. The number will be truncated or
- # padded with zeros if needed. s is the
- # argument number to return the result in.
- # LoadAttribute(r,c) : Set the current attribute to the attribute of
- # position r and c. If the position is invalid
- # load the default attribute
- # LoadMapTable(n) : Changes the current output character mapping
- # table to the table whose number is given by
- # n.
- # LoadParseTable(name) : Change the current parse table to the one
- # specified by name.
- # Math(o1,op,o2,r) : Perform the math operation o1 "op" o2 and put
- # the result in argument number r. Valid op's
- # are "+","-","*", "/" and '%'. If an error
- # occures, the result is 0
- # MoveCursor(r,c) : Move cursor to row r and column c
- # MoveLeft(n,wrap,roll) : Move cursor left n columns. Cursor stays at
- # column zero if wrap = 0 otherwise wraps around
- # to previous row. If roll=0 the cursor moves
- # the upper left to the lower right, otherwise
- # the screen is rolled
- # MoveRight(m,wrap,roll) : Move cursor right n columns.
- # NewLine() : Move cursor down one line possibly performing
- # a scroll
- # NextTab() : Move cursor to next tab stop
- # OutputString(s1,s2...) : Outputs the passed string on the terminal
- # widget. The strings are run through the
- # parser prior to printing. The input stack
- # is not re-entrant so this function can cause
- # confusion on the input stack.
- # PreviousTab() : Moves the cursor to the previous tab stop
- # ProgramKey(t,n,lab,str) : Program a function key. t is the type of
- # function to be implemented t=0 is a normal
- # function, t=1 is a function whose string is
- # sent to the terminal only and t=2 is a
- # function whose string is sent but not echoed.
- # n is the number of the function key. lab is
- # the label string to be assigned to the key
- # and str is the string to which the function is
- # evaluated to
- # ProgramMapTable(n,s,e,sp,ep) : Program map table n. The values in the
- # range s to e and set to the values sp to ep
- # Quit() : Cause the parser to quit executing translators
- # and continue parsing
- # Reject() : Cause the parser to reject the matched
- # characters
- # SetBlinkMode(flag) : If flag=1 then the blink attribute is set.
- # If it is zero then it is turned off
- # SetField(a) : Sets the attributes for the current field. The
- # argument specifies the type of field and can
- # be 0,1,2 or, 3
- # SetFlow(flag) : If flag is 0 flow control is turned off on
- # the input file descriptor, otherwise it is
- # turned on.
- # SetFont(arg) : Set font to base font if arg=0 and alternate
- # font if arg = 1
- # SetHalfBrightMode(flag) : Turns on halfbright mode if arg=1, turns off
- # if flag=1
- # SetInsertMode(flag) : If flag=1, turn on intersert mode. If flag=0,
- # turn it off
- # SetInverseVideo(flag) : If flag = 1, reverse foreground and background
- # colour. If flag = 0 then set normal
- # SetKeyTable(name) : Change the current key translation table to
- # the one specified by name.
- # SetParseTable(name) : Change the current parse table to the one
- # specified by name.
- # SetPen(num) : Sets the pen number
- # SetResource(name,val) : Set the X resource whose name is "name" to the
- # value given by val. Currently only integer
- # and boolean variables can be set
- # SetScrollRegion(s,e,n) : Set the scroll region. S and E are the
- # starting and ending row numbers of the scroll
- # region. N is the number for the scroll region
- # SetUnderLineMode(flag) : if flag=1 underlining mode is turned on. If
- # flag=0, it is turned off
- # SetTab(col) : Set a tab stop at column col
- # SetTop(n) : Sets the top of the screen to line n
- # SoundBell() : Perform a Beep
- # Store(a,b) : Store argument a as a global storage variable
- # at position b
- # ToAscii(n,s) : Returns the ascii character in parameter s
- # that corresponds to number n
- # UpLine(m,wrap) : Move cursor up n lines. Screen will be
- # scrolled up if wrap = 0. If wrap = 1, the
- # cursor will wrap around to the bottom. If
- # wrap = 2, the cursor will stick to the top.
- # UnSetTab(col) : Unset the tab stop at column col. If col=-1
- # all tabs are removed.
- @EOF
- set `wc -lwc <GenTerm/translators`
- if test $1$2$3 != 186158412543
- then
- echo ERROR: wc results of GenTerm/translators are $* should be 186 1584 12543
- fi
-
- chmod 644 GenTerm/translators
-
-
- rm -f /tmp/uud$$
- (echo "begin 666 /tmp/uud$$\n#;VL*n#6%@x\n \nend" | uudecode) >/dev/null 2>&1
- if [ X"`cat /tmp/uud$$ 2>&1`" = Xok ]
- then
- unpacker=uudecode
- else
- echo Compiling unpacker for non-ascii files
- pwd=`pwd`; cd /tmp
- cat >unpack$$.c <<'EOF'
- #include <stdio.h>
- #define C (*p++ - ' ' & 077)
- main()
- {
- int n;
- char buf[128], *p, a,b;
-
- scanf("begin %o ", &n);
- gets(buf);
-
- if (freopen(buf, "w", stdout) == NULL) {
- perror(buf);
- exit(1);
- }
-
- while (gets(p=buf) && (n=C)) {
- while (n>0) {
- a = C;
- if (n-- > 0) putchar(a << 2 | (b=C) >> 4);
- if (n-- > 0) putchar(b << 4 | (a=C) >> 2);
- if (n-- > 0) putchar(a << 6 | C);
- }
- }
- exit(0);
- }
- EOF
- cc -o unpack$$ unpack$$.c
- rm unpack$$.c
- cd $pwd
- unpacker=/tmp/unpack$$
- fi
- rm -f /tmp/uud$$
-
- echo x - GenTerm/xterm.par '[non-ascii]'
- $unpacker <<'@eof'
- begin 644 GenTerm/xterm.par
- M(R!4:&ES(&ES('1H92!P87)S92!T86)L92!F;W(@=&AE('AT97)M(&5M=6QAX
- M=&]R"B,O*B!(:7-T;W)Y.B @(" @(" @(" @(" @(" @(" @(" @(" @(" @X
- M(" @("HO"B,O*B @(" @(" @(%=R:71T96X@8GD@1RX@4BX@4W1R86-H86X@X
- M,3DY,B J+PHC"B,O*B @0V]P>7)I9VAT($=O<F1O;B!2+B!3=')A8VAA;B QX
- M.3DR("HO"B,O*B @5&AI<R!C;V1E(&ES('!R;W9I9&5D(&%S(&ES+"!N96ETX
- M:&5R('1H92!5;FEV97)S:71Y(&]F(%=A=&5R;&]O(&YO<B J+PHC+RH@('1HX
- M92!A=71H;W(@:7,@;&EA8FQE(&9O<B!A;GD@9&%M86=E(&-A=7-E9"!B>2!TX
- M:&4@=7-E(&]R(&UI<W5S92!O9B!T:&ES("HO"B,O*B @8V]D92X@("HO(PHCX
- M"B,O*B!097)M:7-S:6]N(&ES(&=R86YT960@=&\@8V]P>2P@=7-E(&%N9"!MX
- M;V1I9GD@=&AI<R!C;V1E('!R;W9I9&5D(&ET(&ES("HO"B,O*B!N;W0@<V]LX
- M9"!F;W(@<')O9FET(&%N9"!T:&4@86)O=F4@8V]P>7)I9VAT(')E;6%I;G,@X
- M:6YT86-T+B J+PH*(PHC($=L;V)A;"!V87)I86)L92!D969I;FET:6]N<PHCX
- M(#$Z($-U<G)E;G0@1S @;6%P<&EN9R!T86)L90HC(#(Z($-U<G)E;G0@1S$@X
- M;6%P<&EN9R!T86)L90HC(#,Z($-U<G)E;G0@1S(@;6%P<&EN9R!T86)L90HCX
- M(#0Z($-U<G)E;G0@1S,@;6%P<&EN9R!T86)L90HC(#4Z($-U<G)E;G1L>2!LX
- M;V%D960@;6%P<&EN9R!T86)L90HC(#8Z(%-A=F5D(&-U<G-O<B!P;W-I=&EOX
- M;B!R;W<*(R W.B!3879E9"!C=7)S;W(@<&]S:71I;VX@8V]L=6UN"B,@.#H@X
- M0W5R<F5N="!+97EC;V1E('1A8FQE"B,@.3H@1FQA9R!I9B Q,S(@8V]L=6UNX
- M(&UO9&4@:7,@86QL;W=E9 HC(#$P.B!&;&%G(&EF(&EN(&]R:6=I;B!M;V1EX
- M"B,@,3$Z($-U<G)E;G0@<F]W(&]R:6=I;@HC(#$R.B!-87AI;75M(')O=R!EX
- M>'1E;G0@:6X@;W)I9VEN(&UO9&4*(R Q,SH@1FQA9R!I9B!8,3 @;6]U<V4@X
- M=')A8VMI;F<@96YA8FQE9 HC"@HC(&9I<G-T(&-O;65S('1H92!K97EC;V1EX
- M(&1E9FEN:71I;VYS"@I+97E486)L92A$969A=6QT*3T*>PI5<"Q)+%Y;6T$*X
- M1&]W;BQ)+%Y;6T(*4FEG:'0L22Q>6UM#"DQE9G0L22Q>6UM$"DAO;64L3RQ>X
- M6ULP.S!("E1A8BQ)+%Y)"D-L96%R+$\L7DP*26YS97)T3&EN92Q/+%Y;6S%,X
- M"D1E;&5T94QI;F4L3RQ>6ULQ30I$96QE=&5#:&%R+$\L7EM;,5 *?0H*2V5YX
- M5&%B;&4H07!P0W5R2V5Y*3T*>PI5<"Q)+%Y;3T$*1&]W;BQ)+%Y;3T(*4FEGX
- M:'0L22Q>6T]#"DQE9G0L22Q>6T]$"DAO;64L3RQ>6ULP.S!("E1A8BQ)+%Y)X
- M"D-L96%R+$\L7DP*26YS97)T3&EN92Q/+%Y;6S%,"D1E;&5T94QI;F4L3RQ>X
- M6ULQ30I$96QE=&5#:&%R+$\L7EM;,5 *?0H*2V5Y5&%B;&4H07!P2V5Y4&%DX
- M*3T*>PI5<"Q)+%Y;6T$*1&]W;BQ)+%Y;6T(*4FEG:'0L22Q>6UM#"DQE9G0LX
- M22Q>6UM$"DAO;64L3RQ>6ULP.S!("E1A8BQ)+%Y)"D-L96%R+$\L7DP*26YSX
- M97)T3&EN92Q/+%Y;6S%,"D1E;&5T94QI;F4L3RQ>6ULQ30I$96QE=&5#:&%RX
- M+$\L7EM;,5 *2U!?16YT97(L22Q>6T]-"DM07TUU;'1I<&QY+$DL7EM/:@I+X
- M4%]!9&0L22Q>6T]K"DM07U-E<&%R871O<BQ)+%Y;3VP*2U!?4W5B=')A8W0LX
- M22Q>6T]M"DM07T1I=FED92Q)+%Y;3V\*2U!?1&5C:6UA;"Q)+%Y;3VX*2U!?X
- M,"Q)+%Y;3W *2U!?,2Q)+%Y;3W$*2U!?,BQ)+%Y;3W(*2U!?,RQ)+%Y;3W,*X
- M2U!?-"Q)+%Y;3W0*2U!?-2Q)+%Y;3W4*2U!?-BQ)+%Y;3W8*2U!?-RQ)+%Y;X
- M3W<*2U!?."Q)+%Y;3W@*2U!?.2Q)+%Y;3WD*?0H*2V5Y5&%B;&4H07!P0W5RX
- M2V5Y4&%D*3T*>PI5<"Q)+%Y;3T$*1&]W;BQ)+%Y;3T(*4FEG:'0L22Q>6T]#X
- M"DQE9G0L22Q>6T]$"DAO;64L3RQ>6ULP.S!("E1A8BQ)+%Y)"D-L96%R+$\LX
- M7DP*26YS97)T3&EN92Q/+%Y;6S%,"D1E;&5T94QI;F4L3RQ>6ULQ30I$96QEX
- M=&5#:&%R+$\L7EM;,5 *2U!?16YT97(L22Q>6T]-"DM07TUU;'1I<&QY+$DLX
- M7EM/:@I+4%]!9&0L22Q>6T]K"DM07U-E<&%R871O<BQ)+%Y;3VP*2U!?4W5BX
- M=')A8W0L22Q>6T]M"DM07T1I=FED92Q)+%Y;3V\*2U!?1&5C:6UA;"Q)+%Y;X
- M3VX*2U!?,"Q)+%Y;3W *2U!?,2Q)+%Y;3W$*2U!?,BQ)+%Y;3W(*2U!?,RQ)X
- M+%Y;3W,*2U!?-"Q)+%Y;3W0*2U!?-2Q)+%Y;3W4*2U!?-BQ)+%Y;3W8*2U!?X
- M-RQ)+%Y;3W<*2U!?."Q)+%Y;3W@*2U!?.2Q)+%Y;3WD*?0HC(&YO=R!C;VUEX
- M<R!T:&4@:6YP=70@<&%R<V4@=&%B;&4*"E!A<G-E5&%B;&4H1&5F875L="D]X
- M"GL*7DI[3F5W3&EN92@I?0I>37M#87)R:6%G95)E='5R;B@I?0I>6UL\1&EGX
- M:71S*"TQ+"([(BDL,3Y!>TEF*"0Q+"(A/2(L+3$L,2D[36%T:"@D,2PB*R(LX
- M,BPQ*3M5<$QI;F4H)#$L,BDL,7T*7EM;/$1I9VET<R@M,2PB.R(I+#$^0GM)X
- M9B@D,2PB(3TB+"TQ+#$I.TUA=&@H)#$L(BLB+#(L,2D[1&]W;DQI;F4H)#$LX
- M,BDL,7T*7EM;/$1I9VET<R@M,2PB.R(I+#$^0WM)9B@D,2PB(3TB+"TQ+#$IX
- M.TUA=&@H)#$L(BLB+#(L,2D[36]V95)I9VAT*"0Q+# I+#%]"EY;6SQ$:6=IX
- M=',H+3$L(CLB*2PQ/D1[268H)#$L(B$](BPM,2PQ*3M-871H*"0Q+"(K(BPRX
- M+#$I.TUO=F5,969T*"0Q+# I+#%]"EY'>U-O=6YD0F5L;"@I?0I>2'M-;W9EX
- M3&5F="@Q+# I?0I>27M.97AT5&%B*"E]"EY+>TYE=TQI;F4H*7T*7DQ[3F5WX
- M3&EN92@I?0I>3GM&971C:"@R+#$I.TQO861-87!486)L92@D,2D[4W1O<F4HX
- M,2PU*7T*7D][1F5T8V@H,2PQ*3M,;V%D36%P5&%B;&4H)#$I.U-T;W)E*# LX
- M-2E]"EY3>TEG;F]R92@I?0I>47M)9VYO<F4H*7T*7ELC.'M)9VYO<F4H*7T*X
- M(R!3970@=&AE($<P(&UA<'!I;F<@=&%B;&4@86YD(&EF(&ET(&ES(&-U<G)EX
- M;G1L>2!L;V%D960L(')E;&]A9"!I= I>6R@P>U-T;W)E*#(L,2D[1F5T8V@HX
- M-2PQ*3M)9B@D,2PB(3TB+# L,2D[3&]A9$UA<%1A8FQE*#(I.TEG;F]R92@IX
- M+#%]"EY;*$%[4W1O<F4H,RPQ*3M&971C:"@U+#$I.TEF*"0Q+"(A/2(L,"PQX
- M*3M,;V%D36%P5&%B;&4H,RD[26=N;W)E*"DL,7T*7ELH0GM3=&]R92@Q+#$IX
- M.T9E=&-H*#4L,2D[268H)#$L(B$](BPP+#$I.TQO861-87!486)L92@Q*3M)X
- M9VYO<F4H*2PQ?0HC('-A;64@9F]R($<Q"EY;*3![4W1O<F4H,BPR*3M&971CX
- M:"@U+#$I.TEF*"0Q+"(A/2(L,2PQ*3M,;V%D36%P5&%B;&4H,BD[26=N;W)EX
- M*"DL,7T*7ELI07M3=&]R92@S+#(I.T9E=&-H*#4L,2D[268H)#$L(B$](BPQX
- M+#$I.TQO861-87!486)L92@S*3M)9VYO<F4H*2PQ?0I>6RE">U-T;W)E*#$LX
- M,BD[1F5T8V@H-2PQ*3M)9B@D,2PB(3TB+#$L,2D[3&]A9$UA<%1A8FQE*#$IX
- M.TEG;F]R92@I+#%]"B,@1S(*7ELJ,'M3=&]R92@R+#,I.T9E=&-H*#4L,2D[X
- M268H)#$L(B$](BPR+#$I.TQO861-87!486)L92@R*3M)9VYO<F4H*2PQ?0I>X
- M6RI!>U-T;W)E*#,L,RD[1F5T8V@H-2PQ*3M)9B@D,2PB(3TB+#(L,2D[3&]AX
- M9$UA<%1A8FQE*#,I.TEG;F]R92@I+#%]"EY;*D)[4W1O<F4H,2PS*3M&971CX
- M:"@U+#$I.TEF*"0Q+"(A/2(L,BPQ*3M,;V%D36%P5&%B;&4H,2D[26=N;W)EX
- M*"DL,7T*(R!',PI>6RLP>U-T;W)E*#(L-"D[1F5T8V@H-2PQ*3M)9B@D,2PBX
- M(3TB+#,L,2D[3&]A9$UA<%1A8FQE*#(I.TEG;F]R92@I+#%]"EY;*T%[4W1OX
- M<F4H,RPT*3M&971C:"@U+#$I.TEF*"0Q+"(A/2(L,RPQ*3M,;V%D36%P5&%BX
- M;&4H,RD[26=N;W)E*"DL,7T*7ELK0GM3=&]R92@Q+#0I.T9E=&-H*#4L,2D[X
- M268H)#$L(B$](BPS+#$I.TQO861-87!486)L92@Q*3M)9VYO<F4H*2PQ?0I>X
- M6S=[1V5T4&]S:71I;VXH,2PR*3M3=&]R92@D,2PV*3M3=&]R92@D,BPW*7T*X
- M7ELX>T9E=&-H*#8L,2D[1F5T8V@H-RPR*3M-;W9E0W5R<V]R*"0Q+"0R*7T*X
- M7EL]>T9E=&-H*#@L,2D[268H)#$L(B$](BPP+#$I.UP*"5-E=$ME>51A8FQEX
- M*")!<'!+97E0860B*3M3=&]R92@R+#@I.U%U:70H*3M<"@E)9B@D,2PB(3TBX
- M+#$L,BDL,3M3971+97E486)L92@B07!P0W5R2V5Y4&%D(BD[4W1O<F4H,RPXX
- M*3M<"@E1=6ET*"DL,GT*7EL^>T9E=&-H*#@L,2D[268H)#$L(CTB+#,L,2D[X
- M7 H)4V5T2V5Y5&%B;&4H(D1E9F%U;'0B*3M3=&]R92@P+#@I.U%U:70H*3M<X
- M"@E3971+97E486)L92@B07!P0W5R2V5Y(BDL,3M3=&]R92@Q+#@I?0I>6T1[X
- M3F5W3&EN92@I?0I>6T5[3F5W3&EN92@I.T-A<G)I86=E4F5T=7)N*"E]"EY;X
- M2'M'9710;W-I=&EO;B@Q+#(I.U-E=%1A8B@D,BE]"EY;37M'9710;W-I=&EOX
- M;B@Q+#(I.TEF*"0Q+"(A/2(L,"PQ*3M);G-E<G1,:6YE<R@Q+# I.U%U:70HX
- M*3M5<$QI;F4H,2PP*2PQ?0I>6TX\4W1R:6YG*#$I+#$^>T9E=&-H*#,L,BD[X
- M3&]A9$UA<%1A8FQE*"0R*3M/=71P=713=')I;F<H)#$I.T9E=&-H*#4L,BD[X
- M7 H)3&]A9$UA<%1A8FQE*"0R*7T*7EM//%-T<FEN9R@Q*2PQ/GM&971C:"@TX
- M+#(I.TQO861-87!486)L92@D,BD[3W5T<'5T4W1R:6YG*"0Q*3M&971C:"@UX
- M+#(I.UP*"4QO861-87!486)L92@D,BE]"EY;4#Q5<'1O*")>6R(I+#$^7%Q[X
- M26=N;W)E*"E]"EY;6GM%;6ET*")>6S\Q.S)C(BE]"EY;6SQ$:6=I=',H+3$LX
- M(CLB*2PQ/DE<V]U<F-E*")I;G-E<G1-;V1E(BPR*2PR.U-E=%)E<V]U<F-E*")IX
- M;G-E<G1-;V1E(BPQ*3M<"@E'9710;W-I=&EO;B@S+#0I.UP*"4]U='!U=%-TX
- M<FEN9R@B7" B*2PQ.TUA=&@H)#$L(BTB+#$L,2D[268H)#$L(B$](BPP+#$IX
- M.UP*"4UO=F5#=7)S;W(H)#,L)#0I.U-E=%)E<V]U<F-E*")I;G-E<G1-;V1EX
- M(BPD,BE]"EY;6SQ$:6=I=',H+3$L(CLB*2PQ/DA[268H)#$L(B$](BPM,2PQX
- M*3M-871H*"0Q+"(K(BPR+#$I.UP*"4UA=&@H)#$L(BTB+#$L,RDL,3M)9B@DX
- M,BPB(3TB+"TQ+#,I.TUA=&@H)#(L(BLB+#(L,BD[7 H)36%T:"@D,BPB+2(LX
- M,2PT*2PS.T9E=&-H*#$P+#$P*3M<"@E)9B@D,3 L(CTB+# L,BD[1F5T8V@HX
- M,3$L-2D[1F5T8V@H,3(L-BD[7 H)36%T:"@D-2PB*R(L)#,L,RD[268H)#,LX
- M(CP](BPD-BPR*3M-871H*"0V+"(K(BPP+#,I.UP*"4UO=F5#=7)S;W(H)#,LX
- M)#0I+#)]"EY;6SQ$:6=I=',H+3$L(CLB*2PQ/DI[268H)#$L(B$](BPM,2PUX
- M*3M-871H*"0Q+"(K(BPQ+#$I.T=E=%!O<VET:6]N*#(L,RDL-3M<"@E)9B@DX
- M,2PB/2(L,"PQ*3M)9B@D,2PB/2(L,2PR*3M)9B@D,2PB/2(L,BPS*3M296IEX
- M8W0H*3M<"@E-871H*"0R+"(K(BPQ+#0I+#$[0VQE87)$:7-P;&%Y*"0T*3M#X
- M;&5A<DQI;F4H,2D[475I="@I.UP*"4UA=&@H)#(L(BTB+#$L-"DL,CM#;&5AX
- M<D1I<W!L87DH,"PD-"D[36%T:"@D,RPB*R(L,2PU*3M<"@D)36]V94-U<G-OX
- M<B@D,BPD-2D[0VQE87),:6YE*#(I.TUO=F5#=7)S;W(H)#(L)#,I.U%U:70HX
- M*3M<"@E#;&5A<D1I<W!L87DH,"DL,WT*7EM;/$1I9VET<R@M,2PB.R(I+#$^X
- M2WM)9B@D,2PB(3TB+"TQ+#$I.TUA=&@H)#$L(BLB+#$L,2D[7 H)268H)#$LX
- M(CTB+# L,BDL,3M)9B@D,2PB/2(L,2PS*3M)9B@D,2PB/2(L,BPT*3M296IEX
- M8W0H*3M<"@E#;&5A<DQI;F4H,2DL,CM1=6ET*"D[7 H)1V5T4&]S:71I;VXHX
- M,BPS*2PS.TUA=&@H)#,L(BLB+#$L-"D[36]V94-U<G-O<B@D,BPD-"D[7 H)X
- M"4-L96%R3&EN92@R*3M-;W9E0W5R<V]R*"0R+"0S*3M1=6ET*"D[7 H)0VQEX
- M87),:6YE*# I+#1]"EY;6SQ$:6=I=',H+3$L(CLB*2PQ/DQ[268H)#$L(B$]X
- M(BPM,2PQ*3M-871H*"0Q+"(K(BPR+#$I.UP*"4EN<V5R=$QI;F5S*"0Q+# IX
- M+#%]"EY;6SQ$:6=I=',H+3$L(CLB*2PQ/DU[268H)#$L(B$](BPM,2PQ*3M-X
- M871H*"0Q+"(K(BPR+#$I.UP*"41E;&5T94QI;F5S*"0Q*2PQ?0I>6UL\1&EGX
- M:71S*"TQ+"([(BDL,3Y0>TEF*"0Q+"(A/2(L+3$L,2D[36%T:"@D,2PB*R(LX
- M,BPQ*3M<"@E$96QE=&5#:&%R86-T97)S*"0Q*2PQ?0I>6UL\1&EG:71S*"TQX
- M+"([(BDL,3YC>T5M:70H(EY;/S$[,F,B*7T*7EM;/$1I9VET<R@M,2PB.R(IX
- M+#$^9GM)9B@D,2PB(3TB+"TQ+#$I.TUA=&@H)#$L(BLB+#(L,2D[7 H)36%TX
- M:"@D,2PB+2(L,2PS*3M-871H*"0R+"(M(BPQ+#0I.TUO=F5#=7)S;W(H)#,LX
- M)#0I?0I>6UL\1&EG:71S*"TQ+"([(BDL,3YG>TEF*"0Q+"(A/2(L+3$L,2D[X
- M36%T:"@D,2PB*R(L,2PQ*3M<"@E)9B@D,2PB(3TB+# L,BDL,3M'9710;W-IX
- M=&EO;B@R+#,I.U5N4V5T5&%B*"0S*3M1=6ET*"D[7 H)268H)#$L(B$](BPSX
- M+#,I+#([56Y3971486(H+3$I.T=E=%-C<F5E;E-I>F4H,BPS*3M3971486(HX
- M-SDI.U%U:70H*3M<"@E1=6ET*"DL,WT*7EM;/$1I9VET<R@M,2PB.R(I+#$^X
- M:'M-871H*# L(BLB+#$L,3 I.UP*"4=E=$%R9R@D,3 L,3$I+#$[268H)#$QX
- M+"(](BPM,2PR*3M<"@E)9B@D,3$L(B$](BPT+#,I.U-E=%)E<V]U<F-E*")IX
- M;G-E<G1-;V1E(BPQ*3M<"@E)9B@D,3$L(B$](BPR,"PT*2PS.U-E=%)E<V]UX
- M<F-E*")A=71O3&EN95=R87 B+#$I.UP*"4UA=&@H)#$P+"(K(BPQ+#$P*2PTX
- M.TEF*"0Q,"PB/"(L,3 L,2D[7 H)475I="@I+#)]"EY;6SQ$:6=I=',H+3$LX
- M(CLB*2PQ/FQ[36%T:"@P+"(K(BPQ+#$P*3M<"@E'971!<F<H)#$P+#$Q*2PQX
- M.TEF*"0Q,2PB/2(L+3$L,BD[7 H)268H)#$Q+"(A/2(L-"PS*3M3971297-OX
- M=7)C92@B:6YS97)T36]D92(L,"D[7 H)268H)#$Q+"(A/2(L,C L-"DL,SM3X
- M971297-O=7)C92@B875T;TQI;F57<F%P(BPP*3M<"@E-871H*"0Q,"PB*R(LX
- M,2PQ,"DL-#M)9B@D,3 L(CPB+#$P+#$I.UP*"5%U:70H*2PR?0I>6UL\1&EGX
- M:71S*"TQ+"([(BDL,3YM>TUA=&@H,"PB*R(L,2PQ,"D[7 H)1V5T07)G*"0QX
- M,"PQ,2DL,3M)9B@D,3$L(CTB+"TQ+#(I.UP*"4EF*"0Q,2PB(3TB+# L,RD[X
- M4V5T1F]N="@P*3M39715;F1E<DQI;F5-;V1E*# I.U-E=$)L:6YK36]D92@PX
- M*3M<"@D)4V5T26YV97)S959I9&5O*# I.UP*"4EF*"0Q,2PB(3TB+#$L-"DLX
- M,SM3971&;VYT*#$I.UP*"4EF*"0Q,2PB(3TB+#0L-2DL-#M39715;F1E<DQIX
- M;F5-;V1E*#$I.UP*"4EF*"0Q,2PB(3TB+#4L-BDL-3M3971";&EN:TUO9&4HX
- M,2D[7 H)268H)#$Q+"(A/2(L-RPW*2PV.U-E=$EN=F5R<V56:61E;R@Q*3M<X
- M"@E-871H*"0Q,"PB*R(L,2PQ,"DL-SM)9B@D,3 L(CPB+#$P+#$I.UP*"4EFX
- M*"0Q,"PB(3TB+#$L,3 I+#([7 H)4V5T1F]N="@P*3M39715;F1E<DQI;F5-X
- M;V1E*# I.U-E=$)L:6YK36]D92@P*3M3971);G9E<G-E5FED96\H,"D[7 H)X
- M475I="@I+#$P?0I>6UL\1&EG:71S*"TQ+"([(BDL,3YN>TEF*"0Q+"(A/2(LX
- M-2PQ*3M/=71P=713=')I;F<H(EY;6S!N(BD[475I="@I.UP*"4EF*"0Q+"(AX
- M/2(L-BPR*2PQ.T=E=%!O<VET:6]N*#(L,RD[7 H)"4]U='!U=%-T<FEN9R@BX
- M7ELB+"0R+"([(BPD,RPB4B(I.U%U:70H*3M<"@E1=6ET*"DL,GT*7EM;/$1IX
- M9VET<R@M,2PB.R(I+#$^<GM'97138W)E96Y3:7IE*#,L-"D[268H)#$L(B$]X
- M(BPM,2PQ*3M<"@E)9B@D,BPB(3TB+"TQ+#,I.TUA=&@H)#,L(BTB+#$L,RD[X
- M4V5T4V-R;VQL4F5G:6]N*# L)#,L,"D[7 H)"4UO=F5#=7)S;W(H,"PP*3M&X
- M971C:"@Q,"PU*3M)9B@D-2PB/3TB+# L-"D[7 H)"5-T;W)E*# L,3$I.U-TX
- M;W)E*"0S+#$R*3M1=6ET*"DL-#M<"@E-871H*# L(BLB+#$L,2DL,SM<"@E-X
- M871H*"0Q+"(M(BPQ+#$I+#$[268H)#(L(B$](BPM,2PW*3M-871H*"0S+"(KX
- M(BPP+#(I.UP*"4UA=&@H)#(L(BTB+#$L,BDL-SM397138W)O;&Q296=I;VXHX
- M)#$L)#(L,2D[1F5T8V@H,3 L-2D[7 H)4W1O<F4H)#$L,3$I.U-T;W)E*"0RX
- M+#$R*3M)9B@D-2PB/2(L,"PV*3M-;W9E0W5R<V]R*"0Q+# I.UP*"5%U:70HX
- M*3M-;W9E0W5R<V]R*# L,"DL-GT*7EM;/$1I9VET<R@M,2PB.R(I+#$^>'M)X
- M9B@D,2PB(3TB+"TQ+#$I.T]U='!U=%-T<FEN9R@B7EM;,CLQ.S$[,3$R.S$QX
- M,CLQ.S!X(BD[7 H)"5%U:70H*3M<"@E)9B@D,2PB/B(L,2PR*2PQ.TUA=&@HX
- M)#$L(BLB+#(L,BD[7 H)"4]U='!U=%-T<FEN9R@B7EM;(BPD,BPB.S$[,3LQX
- M,3([,3$R.S$[,'@B*3M1=6ET*"D[7 H)26=N;W)E*"E]"EY;6S\\1&EG:71SX
- M*"TQ+"([(BDL,3YH>TUA=&@H,"PB*R(L,2PQ,"D[7 H)1V5T07)G*"0Q,"PQX
- M,2DL,3M)9B@D,3$L(CTB+"TQ+#(I.UP*"4EF*"0Q,2PB(3TB+#$L,RD[7 H)X
- M"49E=&-H*#@L,3(I.TEF*"0Q,BPB(3TB+# L,3 Q*3M<"@D)4V5T2V5Y5&%BX
- M;&4H(D%P<$-U<DME>2(I.U-T;W)E*#$L."D[268H,"PB(3TB+#$L,3 P*3M<X
- M"@D)4V5T2V5Y5&%B;&4H(D%P<$-U<DME>5!A9"(I+#$P,3M3=&]R92@S+#@IX
- M.UP*"4EF*"0Q,2PB(3TB+#(L-"DL,SM)9VYO<F4H*3M<"@E)9B@D,3$L(B$]X
- M(BPS+#4I+#0[7 H)"49E=&-H*#DL,3(I.TEF*"0Q,BPB(3TB+#$L,3 P*3M3X
- M971297-O=7)C92@B8V]L=6UN<R(L,3,R*3M<"@E)9B@D,3$L(B$](BPT+#8IX
- M+#4[26=N;W)E*"D[7 H)268H)#$Q+"(A/2(L-2PW*2PV.TEG;F]R92@I.UP*X
- M"4EF*"0Q,2PB(3TB+#8L."DL-SM<"@D)4W1O<F4H,2PQ,"D[1F5T8V@H,3$LX
- M,3$I.TUO=F5#=7)S;W(H)#$Q+# I.UP*"4EF*"0Q,2PB(3TB+#<L.2DL.#M<X
- M"@D)4V5T4F5S;W5R8V4H(F%U=&],:6YE5W)A<"(L,2D[7 H)268H)#$Q+"(AX
- M/2(L."PQ,"DL.3M)9VYO<F4H*3M<"@E)9B@D,3$L(B$](BPY+#$Q*2PQ,#M<X
- M"@D)4W1O<F4H,2PQ,RD[7 H)268H)#$Q+"(A/2(L,S@L,3(I+#$Q.TEG;F]RX
- M92@I.UP*"4EF*"0Q,2PB(3TB+#0P+#$S*2PQ,CM<"@D)4W1O<F4H,2PY*3M<X
- M"@E)9B@D,3$L(B$](BPT,2PQ-"DL,3,[7 H)"5-E=%)E<V]U<F-E*")E;VQ3X
- M=&EC:R(L,"D[7 H)268H)#$Q+"(A/2(L-#0L,34I+#$T.UP*"0E3971297-OX
- M=7)C92@B;6%R9VEN0F5L;"(L,2D[7 H)268H)#$Q+"(A/2(L-#4L,38I+#$UX
- M.TEG;F]R92@I.UP*"4EF*"0Q,2PB(3TB+#0V+#$W*2PQ-CM<"@D)4V5T4F5SX
- M;W5R8V4H(FQO9V=I;F<B+#$I.UP*"4EF*"0Q,2PB(3TB+#0W+#$X*2PQ-SM)X
- M9VYO<F4H*3M<"@E)9B@D,3$L(B$](BPQ,# P+#$Y*2PQ.#M<"@D)4W1O<F4HX
- M,BPQ,RD[7 H)268H)#$Q+"(A/2(L,3 P,2PQ,# I+#$Y.TEG;F]R92@I.UP*X
- M"4UA=&@H)#$P+"(K(BPQ+#$P*2PQ,# [268H)#$P+"(\(BPQ,"PQ*3M<"@E1X
- M=6ET*"DL,GT*7EM;/SQ$:6=I=',H+3$L(CLB*2PQ/FQ[36%T:"@P+"(K(BPQX
- M+#$P*3M<"@E'971!<F<H)#$P+#$Q*2PQ.TEF*"0Q,2PB/2(L+3$L,BD[7 H)X
- M268H)#$Q+"(A/2(L,2PS*3M<"@D)1F5T8V@H."PQ,BD[268H)#$R+"(A/2(LX
- M,2PQ,#$I.UP*"0E3971+97E486)L92@B1&5F875L="(I.U-T;W)E*# L."D[X
- M268H,"PB(3TB+#$L,3 P*3M<"@D)4V5T2V5Y5&%B;&4H(D%P<$ME>5!A9"(IX
- M+#$P,3M3=&]R92@R+#@I.UP*"4EF*"0Q,2PB(3TB+#,L-"DL,SM<"@D)1F5TX
- M8V@H.2PQ,BD[268H)#$R+"(A/2(L,2PQ,# I.U-E=%)E<V]U<F-E*")C;VQUX
- M;6YS(BPX,"D[7 H)268H)#$Q+"(A/2(L-"PU*2PT.TEG;F]R92@I.UP*"4EFX
- M*"0Q,2PB(3TB+#4L-BDL-3M)9VYO<F4H*3M<"@E)9B@D,3$L(B$](BPV+#<IX
- M+#8[7 H)"5-T;W)E*# L,3 I.TUO=F5#=7)S;W(H,"PP*3M<"@E)9B@D,3$LX
- M(B$](BPW+#@I+#<[7 H)"5-E=%)E<V]U<F-E*")A=71O3&EN95=R87 B+# IX
- M.UP*"4EF*"0Q,2PB(3TB+#@L.2DL.#M)9VYO<F4H*3M<"@E)9B@D,3$L(B$]X
- M(BPY+#$P*2PY.UP*"0E3=&]R92@P+#$S*3M<"@E)9B@D,3$L(B$](BPT,"PQX
- M,2DL,3 [7 H)"5-T;W)E*# L.2D[7 H)268H)#$Q+"(A/2(L-#$L,3(I+#$QX
- M.UP*"0E3971297-O=7)C92@B96]L4W1I8VLB+#$I.UP*"4EF*"0Q,2PB(3TBX
- M+#0T+#$S*2PQ,CM<"@D)4V5T4F5S;W5R8V4H(FUA<F=I;D)E;&PB+# I.UP*X
- M"4EF*"0Q,2PB(3TB+#0U+#$T*2PQ,SM)9VYO<F4H*3M<"@E)9B@D,3$L(B$]X
- M(BPT-BPQ-2DL,30[7 H)"5-E=%)E<V]U<F-E*")L;V=G:6YG(BPP*3M<"@E)X
- M9B@D,3$L(B$](BPT-RPQ-BDL,34[26=N;W)E*"D[7 H)268H)#$Q+"(A/2(LX
- M,3 P,"PQ-RDL,38[7 H)"5-T;W)E*# L,3,I.UP*"4EF*"0Q,2PB(3TB+#$PX
- M,#$L,3 P*2PQ-SM)9VYO<F4H*3M<"@E-871H*"0Q,"PB*R(L,2PQ,"DL,3 PX
- M.TEF*"0Q,"PB/"(L,3 L,2D[7 H)475I="@I+#)]"EY;6S\\1&EG:71S*"TQX
- M+"([(BDL,3YR>TEG;F]R92@I?0I>6UL_/$1I9VET<R@M,2PB.R(I+#$^<WM)X
- M9VYO<F4H*7T*7EM=/$EN="@I+#$^.SQ5<'1O*")>1R(I+#(^>T=E=%-T<FENX
- M9TQE;F=T:"@D,BPS*3M-871H*"0S+"(M(BPQ+#,I.UP*"4=E=%-U8E-T<FENX
- M9R@D,BPP+"0S+#0I.UP*"4EF*"0Q+"(A/2(L,"PQ*3M%<V-A<&5#86QL8F%CX
- M:R@B5VEN9&]W5&ET;&4B+"0T*3M<"@D)17-C87!E0V%L;&)A8VLH(DEC;VY4X
- M:71L92(L)#0I.UP*"4EF*"0Q+"(A/2(L,2PR*2PQ.T5S8V%P94-A;&QB86-KX
- M*"))8V]N5&ET;&4B+"0T*3M<"@E)9B@D,2PB(3TB+#(L,RDL,CM%<V-A<&5#X
- M86QL8F%C:R@B5VEN9&]W5&ET;&4B+"0T*3M<"@E)9B@D,2PB(3TB+#0V+#0IX
- M+#,[17-C87!E0V%L;&)A8VLH(DQO9T9I;&4B+"0T*3M<"@E)9B@D,2PB(3TBX
- M+#4P+#4I+#0[17-C87!E0V%L;&)A8VLH(E-E=$9O;G0B+"0T*3M<"@E1=6ETX
- M*"DL-7T*7EM<7CQ5<'1O*")>6R(I+#$^7%Q[26=N;W)E*"E]"EY;7" \57!TX
- M;R@B7ELB*2PQ/EQ<>TEG;F]R92@I?0I>6V-[4W1O<F4H,2PQ*3M3=&]R92@QX
- M+#(I.U-T;W)E*#$L,RD[4W1O<F4H,2PT*3M3=&]R92@P+#4I.UP*"4QO861-X
- M87!486)L92@P*3M-;W9E0W5R<V]R*# L,"D[4W1O<F4H,"PQ,RD[4W1O<F4HX
- M,"PQ,"D[4W1O<F4H,"PY*7T*7EMN>T9E=&-H*#,L,2D[3&]A9$UA<%1A8FQEX
- M*"0Q*3M3=&]R92@R+#4I?0I>6V][1F5T8V@H-"PQ*3M,;V%D36%P5&%B;&4HX
- M)#$I.U-T;W)E*#,L-2E]"EY;?'M)9VYO<F4H*7T*7EM<?7M)9VYO<F4H*7T*X
- M7EM^>TEG;F]R92@I?0I]"@HC"B,@(%1H:7,@<&%R<V4@=&%B;&4@:7,@=7-EX
- M9"!W:&5N(&EN(&1I<W!L87D@9G5N8W1I;VYS(&UO9&4*(PH*4&%R<V5486)LX
- M92A$:7-P;&%Y36]D92D]"GL*7DU[3F5W3&EN92@Q*3M#87)R:6%G95)E='5RX
- M;B@I?0I>6UI[4V5T4F5S;W5R8V4H(FQI=&5R86Q-;V1E(BPP*3M3971087)SX
- M951A8FQE*")$969A=6QT(BE]"GT*"E!A<G-E5&%B;&4H4W1A<G15<"D]"GL*X
- M>U!R;V=R86U-87!486)L92@R+#DU+#$R-RPP+#,Q*3M0<F]G<F%M36%P5&%BX
- M;&4H,BPY-2PY-2PQ,C<L,3(W*3M<"@E0<F]G<F%M36%P5&%B;&4H,RPS-2PSX
- M-2PS,"PS,"D[7 H)4W1O<F4H,2PQ*3M3=&]R92@Q+#(I.U-T;W)E*#$L,RD[X
- M4W1O<F4H,2PT*3M3=&]R92@P+#4I.UP*"5-T;W)E*# L-BD[4W1O<F4H,"PWX
- M*3M3=&]R92@P+#$P*3M3=&]R92@P+#$Q*3M3=&]R92@P+#$R*7T*?0H*4&%RX
- M<V5486)L92A"=71T;VY4<F%N<VQA=&]R*3T*>PI[1F5T8V@H,3,L,2D[268HX
- M)#$L(B$](BPQ+#$I.UP*"4=E=$QA<W1"=71T;VY%=F5N="@Q+#(L,RPT*3M-X
- M871H*"0Q+"(K(BPS,2PQ*3M4;T%S8VEI*"0Q+#$I.UP*"4-O;G9E<G10;W-IX
- M=&EO;B@D,BPD,RPU+#8I.TUA=&@H)#4L(BLB+#,S+#4I.TUA=&@H)#8L(BLBX
- M+#,S+#8I.UP*"51O07-C:6DH)#4L,BD[5&]!<V-I:2@D-BPS*3M%;6ET*")>X
- M6UM-(BPD,2PD,RPD,BD[7 H@268H)#$L(B$](BPR+#(I+#$[7 H)1V5T3&%SX
- M=$)U='1O;D5V96YT*#$L,BPS+#0I.T-H96-K36]D:69I97)S*"0T+")3:&EFX
- M="(L-2D[7 H)0VAE8VM-;V1I9FEE<G,H)#0L(DUO9#$B+#8I.T-H96-K36]DX
- M:69I97)S*"0T+")#;VYT<F]L(BPW*3M<"@E-871H*"0Q+"(M(BPQ+#$I.TUAX
- M=&@H)#4L(CP\(BPS+#4I.TUA=&@H)#8L(CP\(BPT+#8I.UP*"4UA=&@H)#<LX
- M(CP\(BPU+#<I.TUA=&@H)#$L(BLB+"0U+#$I.TUA=&@H)#$L(BLB+"0V+#$IX
- M.UP*"4UA=&@H)#$L(BLB+"0W+#$I.TUA=&@H)#$L(BLB+#,R+#$I.U1O07-CX
- M:6DH)#$L,2D[7 H)0V]N=F5R=%!O<VET:6]N*"0R+"0S+#4L-BD[36%T:"@DX
- M-2PB*R(L,S,L-2D[36%T:"@D-BPB*R(L,S,L-BD[7 H)5&]!<V-I:2@D-2PRX
- M*3M4;T%S8VEI*"0V+#,I.T5M:70H(EY;6TTB+"0Q+"0S+"0R*3M<"B!1=6ETX
- M*"DL,GT*?0H*4&%R<V5486)L92A"=71T;VY296QE87-E5')A;G-L871O<BD]X
- M"GL*>T9E=&-H*#$S+#$I.TEF*"0Q+"(A/2(L,BPQ*3M<"@E'971,87-T0G5TX
- M=&]N179E;G0H,2PR+#,L-"D[36%T:"@S+"(K(BPP+#$I.UP*"4-H96-K36]DX
- M:69I97)S*"0T+")3:&EF="(L-2D[0VAE8VM-;V1I9FEE<G,H)#0L(DUO9#$BX
- M+#8I.UP*"4-H96-K36]D:69I97)S*"0T+")#;VYT<F]L(BPW*3M-871H*"0UX
- M+"(\/"(L,RPU*3M-871H*"0V+"(\/"(L-"PV*3M<"@E-871H*"0W+"(\/"(LX
- M-2PW*3M-871H*"0Q+"(K(BPD-2PQ*3M-871H*"0Q+"(K(BPD-BPQ*3M<"@E-X
- M871H*"0Q+"(K(BPD-RPQ*3M-871H*"0Q+"(K(BPS,BPQ*3M4;T%S8VEI*"0QX
- M+#$I.UP*"4-O;G9E<G10;W-I=&EO;B@D,BPD,RPU+#8I.TUA=&@H)#4L(BLBX
- M+#,S+#4I.TUA=&@H)#8L(BLB+#,S+#8I.UP*"51O07-C:6DH)#4L,BD[5&]!X
- M<V-I:2@D-BPS*3M%;6ET*")>6UM-(BPD,2PD,RPD,BD[7 H@475I="@I+#%]X
- ""GUI X
- X
- end
- @eof
- set `wc -lwc <GenTerm/xterm.par`
- if test $1$2$3 != 38757112287
- then
- echo ERROR: wc results of GenTerm/xterm.par are $* should be 387 571 12287
- fi
-
- chmod 644 GenTerm/xterm.par
-
- echo x - xcontrol/Command.c
- cat >xcontrol/Command.c <<'@EOF'
- /* Command.c : This function contains the command execution code */
- /* History: */
- /* Written by G. R. Strachan 1992 */
-
- /* Copyright Gordon R. Strachan 1992 */
- /* This code is provided as is, neither the University of Waterloo nor */
- /* the author is liable for any damage caused by the use or misuse of this */
- /* code. */
-
- /* Permission is granted to copy, use and modify this code provided it is */
- /* not sold for profit and the above copyright remains intact. */
-
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/wait.h>
- #include <signal.h>
- #include <X11/X.h>
- #include <X11/Intrinsic.h>
- #include <Xm/Xm.h>
- #include "../GenTerm/Pty.h"
- #include "XControl.h"
-
- extern void TimeOutCB();
- extern struct CallStruct *BuildCallStruct();
- extern struct CommandList *ParseString();
-
- /* ExecuteCommandList: This function executes the list of commands */
-
- ExecuteCommandList(XControl,Commands)
-
- struct XControl *XControl;
- struct CommandList *Commands;
-
- {
- struct CommandList *temp;
- int val;
-
- temp = Commands;
-
- while(temp != NULL)
- {
- val = (temp->Command)(XControl,temp->Args,temp->NumberArguments);
-
- if(val == XCERROR)
- break;
- temp = temp->Next;
- }
- }
-
- /* ArgToInt: This function locates and returns an integer value from the */
- /* argument list. If the argument is not in the list then the default */
- /* value is returned. */
-
- ArgToInt(XControl,Args,NumArgs,Position,Default)
-
- struct XControl *XControl;
- struct Argument *Args;
- int Position;
- int Default;
-
- {
- int Value;
-
- if(Position > NumArgs)
- Value = Default;
- else
- {
- Position--;
- switch(Args[Position].Type)
- {
- case INTEGERARG:
- Value = Args[Position].Value;
- break;
- case STRINGARG:
- Value = atoi(Args[Position].String);
- break;
- case POSITIONARG:
- Value = GetInt(XControl,Args[Position].Value);
- break;
- }
- }
- return(Value);
- }
-
- /* ArgToString: This function locates and returns a string value from the */
- /* argument list. If the argument is not in the list then the default value*/
- /* is returned. */
-
- ArgToString(XControl,Args,NumArgs,Position,String,Len,Default)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
- int Position;
- char *String;
- int Len;
- char *Default;
-
- {
- char buffer[1024];
-
- if(Position > NumArgs)
- {
- strncpy(String,Default,Len-1);
- }
- else
- {
- Position--;
- switch(Args[Position].Type)
- {
- case STRINGARG:
- strncpy(String,Args[Position].String,Len-1);
- break;
- case INTEGERARG:
- sprintf(buffer,"%d",Args[Position].Value);
- strncpy(String,buffer,Len-1);
- break;
- case POSITIONARG:
- GetString(XControl,Args[Position].Value,String,Len);
- break;
- }
- }
- String[Len-1] = NULL;
- }
-
- /* StoreInt: This function stores an integer into the positional argument */
- /* list. */
-
- StoreInt(XControl,Position,Value)
-
- struct XControl *XControl;
- int Position;
- int Value;
-
- {
- char buffer[1024];
- int i;
-
- if(Position > XControl->NumberPositions)
- {
- XControl->PositionalArgs = (char **) XtRealloc(XControl->PositionalArgs,
- sizeof(char *)*Position);
- for(i = XControl->NumberPositions; i < Position; i++)
- XControl->PositionalArgs[i] = NULL;
- XControl->NumberPositions = Position;
- }
- Position--;
- sprintf(buffer,"%d",Value);
-
- if(Position < -0)
- Warning(XControl,"Attempt to access a negative positional argument\n");
- else
- {
- XControl->PositionalArgs[Position] =
- (char *)XtRealloc(XControl->PositionalArgs[Position],strlen(buffer)+1);
- strcpy(XControl->PositionalArgs[Position],buffer);
- }
- }
-
- /* StoreString: This function stores a string into the positional argument */
-
- StoreString(XControl,Position,Value)
-
- struct XControl *XControl;
- int Position;
- char *Value;
-
- {
- int i;
-
- if(Position > XControl->NumberPositions)
- {
- XControl->PositionalArgs = (char **)XtRealloc(XControl->PositionalArgs,
- sizeof(char *)*Position);
- for(i = XControl->NumberPositions; i < Position; i++)
- XControl->PositionalArgs[i] = NULL;
- XControl->NumberPositions = Position;
- }
- Position--;
-
- if(Position < 0)
- Warning(XControl,"Attempt to access a negative positional argument\n");
- else
- {
- XControl->PositionalArgs[Position] =
- (char *)XtRealloc(XControl->PositionalArgs[Position],strlen(Value)+1);
- strcpy(XControl->PositionalArgs[Position],Value);
- }
- }
-
- /* GetInt: This function gets an integer from the positional argument list */
-
- GetInt(XControl,Position)
-
- struct XControl *XControl;
- int Position;
-
- {
- if((Position > XControl->NumberPositions) || (Position < 1))
- return(0);
- else
- return(atoi(XControl->PositionalArgs[Position-1]));
- }
-
- /* GetString: This function gets a character string from the positional */
- /* argument list */
-
- GetString(XControl,Position,String,Len)
-
- struct XControl *XControl;
- int Position;
- char *String;
- int Len;
-
- {
- if((Position > XControl->NumberPositions) || (Position < 1))
- String[0] = NULL;
- else
- strncpy(String,XControl->PositionalArgs[Position-1],Len-1);
- String[Len-1] = NULL;
- }
-
- /* Reap: This function reaps a child process and returns the pid number in */
- /* specified argument. If no child was reaped, the returned pid is 0 */
-
- int ReapCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- int Pos = ArgToInt(XControl,Args,NumArgs,1,1);
- int child;
-
- child = waitpid(-1,NULL,WNOHANG | WUNTRACED);
-
- if(child >= 0)
- {
- StoreInt(XControl,Pos,child);
- return(XCOKAY);
- }
- else
- return(XCERROR);
- }
-
-
- /* QuitCommand: This function causes the XControl program to exit. It does */
- /* not return. It takes as a argument, the exist status of the program */
-
- QuitCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- int status = ArgToInt(XControl,Args,NumArgs,1,0);
-
- exit(status);
- }
-
- /* WriteCommand: This function writes the passed arguments to the child */
- /* process. */
-
- WriteCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- int i;
- char buffer[1024];
-
- for(i = 1; i <= NumArgs; i++)
- {
- ArgToString(XControl,Args,NumArgs,i,buffer,1024,"");
- PtyWrite(XControl->Terminal,buffer,strlen(buffer));
- }
- return(XCOKAY);
- }
-
- /* SignalCommand: This function sends a signal to the process group attached*/
- /* to the slave side of the pty. */
-
- SignalCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- int Sig = ArgToInt(XControl,Args,NumArgs,1,-1);
-
- if((Sig < 0) || (Sig >NSIG))
- return(XCERROR);
- else
- PtySignal(XControl->Terminal,Sig);
- return(XCOKAY);
- }
-
- /* PromptCommand: This command puts up a message dialog to ask the user */
- /* a question. The user can hit 3 buttons, yes, no or cancel. The */
- /* arguments for the command are as follows: */
- /* Prompt(Title,Prompt,Yes,No,Cancel,YesCommand,NoCommand,CancelCommand) */
- /* Title is the character string to appear in the title bar of the dialog. */
- /* Prompt is the message to be displayed. Yes,No and Cancel are the */
- /* strings to be placed in the three buttons. The YesCommand, NoCommand */
- /* and CancelCommands are the commands to be executed when any of the */
- /* buttons are hit. */
-
- PromptCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- int n = 0;
- Arg XArgs[20];
- char Title[40];
- char Prompt[40];
- char Affirm[40];
- char Neg[40];
- char Cancel[40];
- char Commands[1024];
-
- if(XControl->PromptYesCommands != NULL)
- DestroyCommandList(XControl,XControl->PromptYesCommands);
- if(XControl->PromptNoCommands != NULL)
- DestroyCommandList(XControl,XControl->PromptNoCommands);
- if(XControl->PromptCancelCommands != NULL)
- DestroyCommandList(XControl,XControl->PromptCancelCommands);
-
- ArgToString(XControl,Args,NumArgs,1,Title,40,"Prompt");
- ArgToString(XControl,Args,NumArgs,2,Prompt,40,"Yes or no?");
- ArgToString(XControl,Args,NumArgs,3,Affirm,40,"Yes");
- ArgToString(XControl,Args,NumArgs,4,Neg,40,"No");
- ArgToString(XControl,Args,NumArgs,5,Cancel,40,"Cancel");
-
- ArgToString(XControl,Args,NumArgs,6,Commands,1024,"");
- XControl->PromptYesCommands = ParseString(XControl,Commands);
-
- ArgToString(XControl,Args,NumArgs,7,Commands,1024,"");
- XControl->PromptNoCommands = ParseString(XControl,Commands);
-
- ArgToString(XControl,Args,NumArgs,8,Commands,1024,"");
- XControl->PromptCancelCommands = ParseString(XControl,Commands);
-
- XtSetArg(XArgs[n],XmNdialogTitle,
- XmStringCreateLtoR(Title,XmSTRING_DEFAULT_CHARSET)); n++;
- XtSetArg(XArgs[n],XmNmessageString,
- XmStringCreateLtoR(Prompt,XmSTRING_DEFAULT_CHARSET));n++;
- XtSetArg(XArgs[n],XmNcancelLabelString,
- XmStringCreateLtoR(Cancel,XmSTRING_DEFAULT_CHARSET)); n++;
- XtSetArg(XArgs[n],XmNhelpLabelString,
- XmStringCreateLtoR(Neg,XmSTRING_DEFAULT_CHARSET)); n++;
- XtSetArg(XArgs[n],XmNokLabelString,
- XmStringCreateLtoR(Affirm,XmSTRING_DEFAULT_CHARSET)); n++;
- XtSetArg(XArgs[n],XmNmessageAlignment,XmALIGNMENT_CENTER); n++;
- XtSetValues(XControl->Message,XArgs,n);
- XtManageChild(XControl->Message);
-
- return(XCOKAY);
- }
-
- /* TimeOutCommand: This command will cause a set of commands to be */
- /* executed after a set period of time has been elapsed. The timeout can */
- /* be removed with the RemoveTimeOutCommand. The first argument is the */
- /* duration of the timeout (in milliseconds), the second argument is where */
- /* timeout id is to be stored and the third argument is the command string */
- /* to execute when the timeout expires. */
-
- TimeOutCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- int Duration = ArgToInt(XControl,Args,NumArgs,1,1000);
- int Pos = ArgToInt(XControl,Args,NumArgs,2,1);
- char buffer[1024];
- XtIntervalId Id;
- struct CommandList *Commands;
-
- ArgToString(XControl,Args,NumArgs,3,buffer,1024,"");
- Commands = ParseString(XControl,buffer);
-
- Id = XtAppAddTimeOut(XControl->App,(unsigned long)Duration,TimeOutCB,
- BuildCallStruct(XControl,Commands,True,True));
- StoreInt(XControl,Pos,(int)Id);
- return(XCOKAY);
- }
-
- /* RemoveTimeOutCommand: This function cancels a pending timeout. The */
- /* argument is the timeout id number that was saved by the TimeOut command. */
- /* Note that this function can not find the memory allocated by the */
- /* TimeOut command to store the command string in and so we have a small */
- /* memory leak here. */
-
- RemoveTimeOutCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- XtIntervalId Id = (XtIntervalId) ArgToInt(XControl,Args,NumArgs,1,0);
-
- XtRemoveTimeOut(Id);
- return(XCOKAY);
- }
-
- /* SleepCommand: This function causes the application to sleep for certain */
- /* amount of seconds. The first argument is the number of seconds to sleep*/
- /* for. */
-
- SleepCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- int Interval = ArgToInt(XControl,Args,NumArgs,1,1);
-
- sleep(Interval);
-
- return(XCOKAY);
- }
-
- /* AbortCommand: This function causes the currently executing command */
- /* string to be aborted. */
-
- AbortCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- return(XCABORT);
- }
-
- /* GetEnvCommand: This function gets an environment variable and returns */
- /* the result in a variable. The first argument is the name of the */
- /* variable to return and the second argument is the position to store it */
- /* in. */
-
- GetEnvCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- char Name[1024];
- char *Value;
- int Pos = ArgToInt(XControl,Args,NumArgs,2,1);
-
- ArgToString(XControl,Args,NumArgs,1,Name,1024,"");
-
- Value = (char *) getenv(Name);
-
- StoreString(XControl,Pos,Value);
-
- return(XCOKAY);
- }
-
- /* SetEnvCommand: This function sets an environment variable for the current*/
- /* process. If performed prior to forking the child process, it will be */
- /* inherited by the child. The first argument is the name of the variable */
- /* to set and the second argument is its value. */
-
- SetEnvCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- char Name[80];
- char Value[256];
- char *buffer;
-
- ArgToString(XControl,Args,NumArgs,1,Name,80,"");
- ArgToString(XControl,Args,NumArgs,2,Value,256,"");
-
- buffer = XtMalloc(strlen(Name) + strlen(Value) + 2);
- strcpy(buffer,Name);
- strcat(buffer,"=");
- strcat(buffer,Value);
-
- putenv(buffer);
-
- return(XCOKAY);
- }
-
- /* IfCommand: This function implements a structure if statement. The first */
- /* third arguments are the operands to test. The second argument is the */
- /* is the boolean operation to perform. The fourth argument is the command */
- /* list to execute if the boolean expression is true and the fifth argument */
- /* to execute if the boolean expression is false. */
-
- IfCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- int op1,op2;
- char Operation[3];
- char Arg1[256],Arg2[256];
- int result = 0;
- char buffer[1024];
- struct CommandList *Commands;
-
- op1 = ArgToInt(XControl,Args,NumArgs,1,0);
- op2 = ArgToInt(XControl,Args,NumArgs,3,0);
- ArgToString(XControl,Args,NumArgs,2,Operation,3,"");
-
- if(strcmp(Operation,"==") == 0)
- result = op1 == op2;
- else if(strcmp(Operation,"!=") == 0)
- result = op1 != op2;
- else if(strcmp(Operation,">=") == 0)
- result = op1 >= op2;
- else if(strcmp(Operation,"<=") == 0)
- result = op1 <= op2;
- else if(strcmp(Operation,"<") == 0)
- result = op1 < op2;
- else if(strcmp(Operation,">") == 0)
- result = op1 > op2;
- else if(strcmp(Operation,"%") == 0)
- {
- ArgToString(XControl,Args,NumArgs,1,Arg1,256,"");
- ArgToString(XControl,Args,NumArgs,3,Arg2,256,"");
- result = (strcmp(Arg1,Arg2) == 0);
- }
- else if(strcmp(Operation,"!%") == 0)
- {
- ArgToString(XControl,Args,NumArgs,1,Arg1,256,"");
- ArgToString(XControl,Args,NumArgs,3,Arg2,256,"");
- result = (strcmp(Arg1,Arg2) != 0);
- }
- else
- return(XCERROR);
-
- if(result)
- ArgToString(XControl,Args,NumArgs,4,buffer,1024,"");
- else
- ArgToString(XControl,Args,NumArgs,5,buffer,1024,"");
-
- Commands = ParseString(XControl,buffer);
- ExecuteCommandList(XControl,Commands);
- DestroyCommandList(XControl,Commands);
-
- return(XCOKAY);
- }
-
- /* GetChildPidCommand: This function returns the process id of the child */
- /* process it launched. The argument is the number of the positional */
- /* agument to put the pid into. */
-
- GetChildPidCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- int Pos = ArgToInt(XControl,Args,NumArgs,1,1);
-
- StoreInt(XControl,Pos,XControl->ChildPid);
-
- return(XCOKAY);
- }
-
- /* GetPidCommand: This function returns the process id of this process. */
- /* The argument is the number of the positional argument to put the pid */
- /* into. */
-
- GetPidCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- int Pos = ArgToInt(XControl,Args,NumArgs,1,1);
-
- StoreInt(XControl,Pos,getpid());
-
- return(XCOKAY);
- }
-
- /* MathCommand: This function performs a mathematical operation on the */
- /* passed arguments. The first and third arguments are the operands while */
- /* the second argument is the operation. The fourth argument is the number */
- /* of the positional argument to store the result in. */
-
- MathCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- int Op1 = ArgToInt(XControl,Args,NumArgs,1,0);
- int Op2 = ArgToInt(XControl,Args,NumArgs,3,0);
- int Pos = ArgToInt(XControl,Args,NumArgs,4,1);
- int result;
- char Operation[2];
-
- ArgToString(XControl,Args,NumArgs,2,Operation,2,"");
-
- switch(Operation[0])
- {
- case '+':
- result = Op1 + Op2;
- break;
- case '-':
- result = Op1 - Op2;
- break;
- case '*':
- result = Op1 * Op2;
- break;
- case '/':
- result = Op1 / Op2;
- break;
- case '%':
- result = Op1 % Op2;
- break;
- case '&':
- result = Op1 & Op2;
- break;
- case '|':
- result = Op1 | Op2;
- break;
- default:
- return(XCERROR);
- }
-
- StoreInt(XControl,Pos,result);
- return(XCOKAY);
- }
-
- /* StoreStringCommand: This function takes the first argument and stores */
- /* it in the positional argument given by the second argument. */
-
- StoreStringCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- char StringVal[1024];
- int Pos;
-
- ArgToString(XControl,Args,NumArgs,1,StringVal,1024,"");
- Pos = ArgToInt(XControl,Args,NumArgs,2,1);
-
- StoreString(XControl,Pos,StringVal);
-
- return(XCOKAY);
- }
-
- /* StringCatCommand: This function concatenates the first two arguments */
- /* and returns the result in the positional argument specified by the third */
- /* argument. */
-
- StringCatCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- char String1[1024];
- char String2[512];
- int Pos;
-
- ArgToString(XControl,Args,NumArgs,1,String1,512,"");
- ArgToString(XControl,Args,NumArgs,2,String2,512,"");
- Pos = ArgToInt(XControl,Args,NumArgs,3,1);
-
- strcat(String1,String2);
-
- StoreString(XControl,Pos,String1);
-
- return(XCOKAY);
- }
-
- /* SaveSessionCommand: This function save the current program state into */
- /* the session file. It is used so that the session manager can restart */
- /* us at a later date. It takes no arguments. */
-
- SaveSessionCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Argument *Args;
- int NumArgs;
-
- {
- char *SessionFileName;
- char *SessionPathName;
- FILE *SaveFile;
- char *NewArgv[3];
- int NewArgc;
- int Value = XCOKAY;
- int i;
-
- if(!XvSessionSavePath(XControl->Top,&SessionFileName,&SessionPathName))
- Value = XCERROR;
- else
- {
- if((SaveFile = fopen(SessionFileName,"w")) == NULL)
- Value = XCERROR;
- else
- {
- fprintf(SaveFile,"%s\n",SESSION_HEADER);
- fprintf(SaveFile,"%d\n$%s\n",strlen(XControl->TerminalType),
- XControl->TerminalType);
- fprintf(SaveFile,"%d\n$%s\n",strlen(XControl->ChildCommand),
- XControl->ChildCommand);
- fprintf(SaveFile,"%d\n$%s\n",strlen(XControl->ChildCommandArguments),
- XControl->ChildCommandArguments);
- DumpCommandList(XControl,XControl->StartCommands,SaveFile);
- for(i = 0; i < NSIG; i++)
- DumpCommandList(XControl,XControl->SignalCommands[i],SaveFile);
- DumpCommandList(XControl,XControl->CloseWindowCommands,SaveFile);
- DumpCommandList(XControl,XControl->SaveCommands,SaveFile);
- DumpCommandList(XControl,XControl->EscapeCommands,SaveFile);
- DumpCommandList(XControl,XControl->TopCommands,SaveFile);
- DumpCommandList(XControl,XControl->ResizeCommands,SaveFile);
- DumpCommandList(XControl,XControl->WakeUpCommands,SaveFile);
- DumpCommandList(XControl,XControl->FlowCommands,SaveFile);
- DumpCommandList(XControl,XControl->ParentForkCommands,SaveFile);
- DumpCommandList(XControl,XControl->ChildForkCommands,SaveFile);
- DumpCommandList(XControl,XControl->DropCommands,SaveFile);
- DumpCommandList(XControl,XControl->PromptYesCommands,SaveFile);
- DumpCommandList(XControl,XControl->PromptNoCommands,SaveFile);
- DumpCommandList(XControl,XControl->PromptCancelCommands,SaveFile);
- fclose(SaveFile);
- }
- }
-
- if(Value == XCOKAY)
- {
- NewArgv[0] = XControl->ProgramName;
- NewArgv[1] = "-session";
- NewArgv[2] = SessionFileName;
- NewArgc = 3;
- }
- else
- {
- NewArgv[0] = XControl->ProgramName;
- NewArgc = 1;
- }
- XSetCommand(XtDisplay(XControl->Top),XtWindow(XControl->Top),NewArgv,NewArgc);
-
- return(XCOKAY);
- }
-
- /* WarningCommand: This function puts up a warning dialog on the screen. */
- /* Note that this function returns and the command list continues executing*/
- /* while the dialog is still on the screen. It does not wait until the */
- /* the dialog is acknowledged. */
-
- WarningCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Arguments *Args;
- int NumArgs;
-
- {
- char buffer[1024];
-
- ArgToString(XControl,Args,NumArgs,1,buffer,1024,"");
- XWarning(XControl,buffer);
-
- return(XCOKAY);
- }
-
-
- /* GetDropNumberCommand: This function gets the number of file types and */
- /* files that was dropped onto us last. The first argument is the position */
- /* to return the number for file types and the second argument is the */
- /* position to return the file argument. */
-
- GetDropNumberCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Arguments *Args;
- int NumArgs;
-
- {
- int TypePosition = ArgToInt(XControl,Args,NumArgs,1,1);
- int FilePosition = ArgToInt(XControl,Args,NumArgs,2,2);
-
- StoreInt(XControl,TypePosition,XControl->NumberTypesDropped);
- StoreInt(XControl,FilePosition,XControl->NumberFilesDropped);
-
- return(XCOKAY);
- }
-
- /* GetDropHost: This function gets the name of the host that the last drop */
- /* came from and puts it into the argument given by the first argument */
-
- GetDropHostCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Arguments *Args;
- int NumArgs;
-
- {
- int Pos = ArgToInt(XControl,Args,NumArgs,1,1);
-
- StoreString(XControl,Pos,XControl->DropFiles[0]);
-
- return(XCOKAY);
- }
-
- /* GetDropType: This function returns the type of specific entry in the last */
- /* drop. The first argument is the number of the entry to return and the */
- /* second argument is the position to return the value in. */
-
- GetDropTypeCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Arguments *Args;
- int NumArgs;
- {
- int Which = ArgToInt(XControl,Args,NumArgs,1,1);
- int Pos = ArgToInt(XControl,Args,NumArgs,2,1);
-
- if((Which > XControl->NumberTypesDropped) || (Which <= 0))
- return(XCERROR);
-
- StoreString(XControl,Pos,XControl->DropTypes[Which - 1]);
- return(XCOKAY);
- }
-
- /* GetDropDirectory: This function returns the name of the directory that */
- /* drop to place from, if it was specified or a zero length string if not. */
- /* The first argument is the position to put the directory name. */
-
- GetDropDirectoryCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Arguments *Args;
- int NumArgs;
-
- {
- int Pos = ArgToInt(XControl,Args,NumArgs,1,1);
-
- if(strcmp(XControl->DropFiles[1],"-") == 0)
- StoreString(XControl,Pos,"");
- else
- StoreString(XControl,Pos,XControl->DropFiles[1]);
-
- return(XCOKAY);
- }
-
- /* GetDropFile: This function returns the spefied drop file from the last */
- /* drop. The first argument is the particular file to return. The second */
- /* argument is the position to return the result in. */
-
- GetDropFileCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Arguments *Args;
- int NumArgs;
-
- {
- int Which = ArgToInt(XControl,Args,NumArgs,1,1);
- int Pos = ArgToInt(XControl,Args,NumArgs,2,1);
-
- if((Which > XControl->NumberFilesDropped) || (Which < 0))
- return(XCERROR);
- else
- StoreString(XControl,Pos,XControl->DropFiles[Which+1]);
- return(XCOKAY);
- }
-
- /* GetTerminalType: This function returns the name of the type of terminal */
- /* that is being used. The first argument is the number of the positional */
- /* where the result is stored. */
-
- GetTerminalTypeCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Arguments *Args;
- int NumArgs;
-
- {
- int Pos = ArgToInt(XControl,Args,NumArgs,1,1);
-
- StoreString(XControl,Pos,XControl->TerminalType);
-
- return(XCOKAY);
- }
-
- /* GetWindowSize: This function returns the size of the pty widget in */
- /* rows and columns. The first argument is the position to store the */
- /* row number in and the second is the position for the column. */
-
- GetWindowSizeCommand(XControl,Args,NumArgs)
-
- struct XControl *XControl;
- struct Arguments *Args;
- int NumArgs;
-
- {
- int RowPosition = ArgToInt(XControl,Args,NumArgs,1,1);
- int ColPosition = ArgToInt(XControl,Args,NumArgs,2,2);
- int rows,cols;
- Arg XArgs[10];
- int n = 0;
-
- XtSetArg(XArgs[n],XtNrows,&rows); n++;
- XtSetArg(XArgs[n],XtNcolumns,&cols); n++;
- XtGetValues(XControl->Terminal,XArgs,n);
-
- StoreInt(XControl,RowPosition,rows);
- StoreInt(XControl,ColPosition,cols);
-
- return(XCOKAY);
- }
- @EOF
- set `wc -lwc <xcontrol/Command.c`
- if test $1$2$3 != 933250923854
- then
- echo ERROR: wc results of xcontrol/Command.c are $* should be 933 2509 23854
- fi
-
- chmod 644 xcontrol/Command.c
-
- echo x - xcontrol/XControl.c
- cat >xcontrol/XControl.c <<'@EOF'
- /* XControl.c : This file contains the XControl program. It is X window */
- /* client which is designed to control window dumb program. It is like */
- /* an hpterm in slave mode only much more intelligent. */
- /* History: */
- /* Written by G. R. Strachan 1992 */
-
- /* Copyright Gordon R. Strachan 1992 */
- /* This code is provided as is, neither the University of Waterloo nor */
- /* the author is liable for any damage caused by the use or misuse of this */
- /* code. */
-
- /* Permission is granted to copy, use and modify this code provided it is */
- /* not sold for profit and the above copyright remains intact. */
-
- #include <stdio.h>
- #include <varargs.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <signal.h>
- #include <X11/X.h>
- #include <X11/Intrinsic.h>
- #include <X11/StringDefs.h>
- #include <Xm/Xm.h>
- #include <X11/Protocols.h>
-
- #include "XControl.h"
- #include "Pty.h"
-
- #define XCCommands "CommandList"
- #define SigResource(a,b,c,d) a,b,XCCommands,sizeof(struct CommandList *),\
- XtOffset(XControlPtr,SignalCommands[(c)]),XtRString,d
-
- extern ReapCommand();
- extern QuitCommand();
- extern WriteCommand();
- extern SignalCommand();
- extern PromptCommand();
- extern TimeOutCommand();
- extern RemoveTimeOutCommand();
- extern SleepCommand();
- extern AbortCommand();
- extern GetEnvCommand();
- extern SetEnvCommand();
- extern IfCommand();
- extern GetChildPidCommand();
- extern GetPidCommand();
- extern MathCommand();
- extern StoreStringCommand();
- extern StringCatCommand();
- extern SaveSessionCommand();
- extern WarningCommand();
- extern GetDropNumberCommand();
- extern GetDropHostCommand();
- extern GetDropTypeCommand();
- extern GetDropDirectoryCommand();
- extern GetDropFileCommand();
- extern GetTerminalTypeCommand();
- extern GetWindowSizeCommand();
-
- extern struct CommandList *LoadCommandList();
-
- XtPointer BuildCallStruct();
- char **BuildArgList();
- void PtyCB();
- void KeyCB();
- void SignalCB();
- void SignalHandler();
- void CommandCB();
- void PopDownCB();
- void TimeOutCB();
- char *LoadString();
- void ActionCB();
- void DropCB();
- void ResizeCB();
- void RequestCB();
-
- CommandListConverter();
-
- typedef struct XControl *XControlPtr;
- extern int errno;
-
- struct FunctionList Functions[]=
- {
- {"Reap",ReapCommand},
- {"Quit",QuitCommand},
- {"Write",WriteCommand},
- {"Signal",SignalCommand},
- {"Prompt",PromptCommand},
- {"TimeOut",TimeOutCommand},
- {"RemoveTimeOut",RemoveTimeOutCommand},
- {"Sleep",SleepCommand},
- {"Abort",AbortCommand},
- {"GetEnv",GetEnvCommand},
- {"SetEnv",SetEnvCommand},
- {"If",IfCommand},
- {"GetChildPid",GetChildPidCommand},
- {"GetPid",GetPidCommand},
- {"Math",MathCommand},
- {"StoreString",StoreStringCommand},
- {"StringCat",StringCatCommand},
- {"SaveSession",SaveSessionCommand},
- {"Warning",WarningCommand},
- {"GetDropNumber",GetDropNumberCommand},
- {"GetDropHost",GetDropHostCommand},
- {"GetDropType",GetDropTypeCommand},
- {"GetDropDirectory",GetDropDirectoryCommand},
- {"GetDropFile",GetDropFileCommand},
- {"GetTerminalType",GetTerminalTypeCommand},
- {"GetWindowSize",GetWindowSizeCommand},
- {NULL,NULL},
- };
-
- static XtResource resources[] =
- {
- {"startCommands","StartCommands",XCCommands,sizeof(struct CommandList *),
- XtOffset(XControlPtr,StartCommands),XtRString,NULL},
- {"terminalType","TerminalType",XtRString,sizeof(char *),
- XtOffset(XControlPtr,TerminalType),XtRString,"hpterm"},
- {"childCommand","ChildCommand",XtRString,sizeof(char *),
- XtOffset(XControlPtr,ChildCommand),XtRString,"/bin/csh"},
- {"childArguments","ChildArguments",XtRString,sizeof(char *),
- XtOffset(XControlPtr,ChildCommandArguments),XtRString,NULL},
- {SigResource("SigHangUpCommands","SigHangUpCommands",SIGHUP,NULL)},
- {SigResource("sigInterruptCommands","SigInterruptCommands",SIGINT,NULL)},
- {SigResource("sigQuitCommmands","SigQuitCommands",SIGQUIT,NULL)},
- {SigResource("sigPipeCommands","SigPipeCommands",SIGPIPE,NULL)},
- {SigResource("sigAlarmCommands","SigAlarmCommands",SIGALRM,NULL)},
- {SigResource("sigTermCommands","SigTermCommands",SIGTERM,NULL)},
- {SigResource("sigUsr1Commands","SigUsr1Commands",SIGUSR1,NULL)},
- {SigResource("sigUsr2Commands","SigUsr2Commands",SIGUSR2,NULL)},
- {SigResource("sigChildCommands","SigChildCommands",SIGCHLD,
- "Reap(1);Quit(1)")},
- {SigResource("sigIOCommands","SigIOCommands",SIGIO,NULL)},
- {SigResource("sigWindowCommands","SigWindowCommands",SIGWINDOW,NULL)},
- {SigResource("sigStopCommands","SigStopCommands",SIGSTOP,NULL)},
- {SigResource("sigContinueCommands","SigContinueCommands",SIGCONT,NULL)},
- {SigResource("sigUrgentCommands","SigUrgentCommands",SIGURG,NULL)},
- {"closeWindowCommands","CloseWindowCommands",XCCommands,
- sizeof(struct CommandList *),XtOffset(XControlPtr,CloseWindowCommands),
- XtRString,"Quit(0)"},
- {"saveCommands","SaveCommands",XCCommands,
- sizeof(struct CommandList *),XtOffset(XControlPtr,SaveCommands),
- XtRString,"SaveSession()"},
- {"topCommands","TopCommands",XCCommands,sizeof(struct CommandList*),
- XtOffset(XControlPtr,TopCommands),XtRString,NULL},
- {"escapeCommands","EscapeCommands",XCCommands,sizeof(struct CommandList *),
- XtOffset(XControlPtr,EscapeCommands),XtRString,NULL},
- {"resizeCommands","ResizeCommands",XCCommands,sizeof(struct CommandList *),
- XtOffset(XControlPtr,ResizeCommands),XtRString,NULL},
- {"wakeUpCommands","WakeUpCommands",XCCommands,sizeof(struct CommandList *),
- XtOffset(XControlPtr,WakeUpCommands),XtRString,NULL},
- {"flowCommands","FlowCommands",XCCommands,sizeof(struct CommandList *),
- XtOffset(XControlPtr,FlowCommands),XtRString,NULL},
- {"parentForkCommands","ParentForkCommands",XCCommands,
- sizeof(struct CommandList *),XtOffset(XControlPtr,ParentForkCommands),
- XtRString,NULL},
- {"childForkCommands","ChildForkCommands",XCCommands,
- sizeof(struct CommandList *),XtOffset(XControlPtr,ChildForkCommands),
- XtRString,NULL},
- {"dropCommands","DropCommands",XCCommands,sizeof(struct CommandList *),
- XtOffset(XControlPtr,DropCommands),XtRString,NULL},
- {"sessionFile","SessionFile",XtRString,sizeof(char *),
- XtOffset(XControlPtr,SessionFile),XtRString,NULL},
- {"dropZoneType","DropZoneType",XtRString,sizeof(char *),
- XtOffset(XControlPtr,DropZoneType),XtRString,"FileEdit"},
- {"remoteDropsAllowed","RemoteDropsAllowed",XtRBoolean,sizeof(Boolean),
- XtOffset(XControlPtr,RemoteDropsAllowed),XtRImmediate,False},
- };
-
- static XrmOptionDescRec options[] =
- {
- {"-hpterm","*terminalType",XrmoptionNoArg,"hpterm"},
- {"+hpterm","*terminalType",XrmoptionNoArg,"xterm"},
- {"-xterm","*terminalType",XrmoptionNoArg,"xterm"},
- {"-command","*childCommand",XrmoptionSepArg,NULL},
- {"-arguments","*childArguments",XrmoptionSepArg,NULL},
- {"-session","*sessionFile",XrmoptionSepArg,NULL},
- };
-
- char Syntax[] =
- "-hpterm\n\
- +hpterm\n\
- -xterm\n\
- -command command_path\n\
- -arguments \"child command arguments\"\n\
- -session sessionfile\n\
- ";
-
- static XtConvertArgRec CvtArgs[] =
- {
- {XtAddress,(XtPointer) NULL,sizeof(struct XControl *)},
- };
-
- static XtActionsRec Actions[]=
- {
- {"execute_command",ActionCB},
- };
-
- int SigSink; /* the pipeline signals are written into */
- struct XControl XControl;
-
- main(argc,argv)
-
- int argc;
- char **argv;
-
- {
- Widget MainWindow;
- Widget Terminal;
- Widget button;
- Arg args[20];
- int n = 0;
- int i;
- Atom DeleteWindow;
- Atom SaveAtom;
-
- CvtArgs[0].address_id = (XtPointer) &XControl;
-
- XControl.ProgramName = argv[0];
- XControl.Functions = Functions;
- XControl.NumberPositions = 0;
- XControl.PositionalArgs = NULL;
-
-
- i = strlen(argv[0]);
- while((--i >= 0) && (argv[0][i] != '/'));
- XControl.Top = XtAppInitialize(&(XControl.App),&argv[0][i+1],options,
- XtNumber(options),&argc,argv,NULL,0,0);
- if(argc != 1) /* if left over options then there is a mistake */
- {
- Warning(&XControl,"Invalid option %s\n",argv[1]);
- Warning(&XControl,"%s accepts all normal Xt options plus:\n%s",argv[0],
- Syntax);
- exit(1);
- }
-
- XtAppAddActions(XControl.App,Actions,XtNumber(Actions));
-
- XvAppInit(XControl.App,XtDisplay(XControl.Top),argv[0]);
- XvRegisterDropCallback(DropCB);
- XtSetTypeConverter(XtRString,"CommandList",CommandListConverter,&CvtArgs,
- 1,XtCacheAll,NULL);
- XtGetApplicationResources(XControl.Top,&XControl,resources,
- XtNumber(resources),NULL,0);
-
- if(XControl.SessionFile != NULL)
- LoadSession(&XControl);
-
- BuildChildCommand(&XControl);
-
- SetUpSignals(&XControl,XControl.App);
-
-
- MainWindow = XmCreateMainWindow(XControl.Top,"main",args,n);
- XtManageChild(MainWindow);
-
- Terminal = XtCreateWidget(XControl.TerminalType,ptyWidgetClass,MainWindow,
- args,n);
- XtManageChild(Terminal);
- XtAddCallback(Terminal,XtNptyCallback,PtyCB,(XtPointer)&XControl);
- XtAddCallback(Terminal,XtNkbdCallback,KeyCB,(XtPointer)&XControl);
- XtAddCallback(Terminal,XtNresizeCallback,ResizeCB,(XtPointer)&XControl);
- XControl.Terminal = Terminal;
-
- n = 0;
- XControl.Message = XmCreateMessageDialog(MainWindow,"message",args,n);
- XtAddCallback(XControl.Message,XmNokCallback,CommandCB,
- BuildCallStruct(&XControl,&XControl.PromptYesCommands,False,
- True));
- XtAddCallback(XControl.Message,XmNcancelCallback,CommandCB,
- BuildCallStruct(&XControl,&XControl.PromptCancelCommands,
- False,True));
- XtAddCallback(XControl.Message,XmNhelpCallback,CommandCB,
- BuildCallStruct(&XControl,&XControl.PromptNoCommands,False,
- True));
- XtAddCallback(XControl.Message,XmNhelpCallback,PopDownCB,XControl.Message);
-
- n = 0;
- XtSetArg(args[n],XmNtitle,"Warning!"); n++;
- XControl.Warning = XmCreateWarningDialog(MainWindow,"Error",args,n);
- button = XmMessageBoxGetChild(XControl.Warning,XmDIALOG_CANCEL_BUTTON);
- XtUnmanageChild(button);
- button = XmMessageBoxGetChild(XControl.Warning,XmDIALOG_HELP_BUTTON);
- XtUnmanageChild(button);
-
- XtRealizeWidget(XControl.Top);
-
- /* we now add call backs to handle any of the functions that have commands */
- /* bound to them. */
-
- if(XControl.CloseWindowCommands != NULL)
- {
- DeleteWindow = XmInternAtom(XtDisplay(XControl.Top),"WM_DELETE_WINDOW",
- False);
- XmAddWMProtocolCallback(XControl.Top,DeleteWindow,CommandCB,
- BuildCallStruct(&XControl,
- XControl.CloseWindowCommands,
- True,False));
- }
- if(XControl.SaveCommands != NULL)
- {
- SaveAtom = XmInternAtom(XtDisplay(XControl.Top),"WM_SAVE_YOURSELF",False);
- XmAddWMProtocolCallback(XControl.Top,SaveAtom,CommandCB,
- BuildCallStruct(&XControl,
- XControl.SaveCommands,
- True,False));
- }
- if(XControl.ResizeCommands != NULL)
- XtAddCallback(Terminal,XtNresizeCallback,CommandCB,
- BuildCallStruct(&XControl,XControl.ResizeCommands,
- True,False));
- if(XControl.EscapeCommands != NULL)
- XtAddCallback(Terminal,XtNescCallback,CommandCB,
- BuildCallStruct(&XControl,XControl.EscapeCommands,
- True,False));
- if(XControl.WakeUpCommands != NULL)
- XtAddCallback(Terminal,XtNwakeUpCallback,CommandCB,
- BuildCallStruct(&XControl,XControl.WakeUpCommands,
- True,False));
- if(XControl.FlowCommands != NULL)
- XtAddCallback(Terminal,XtNflowCallback,CommandCB,
- BuildCallStruct(&XControl,XControl.FlowCommands,True,False));
- if(XControl.TopCommands != NULL)
- XtAddCallback(Terminal,XtNtopCallback,CommandCB,
- BuildCallStruct(&XControl,XControl.TopCommands,True,False));
-
- if(XControl.CloseWindowCommands != NULL)
- { /* these commands will handle the close*/
- n = 0;
- XtSetArg(args[n],XmNdeleteResponse,XmDO_NOTHING); n++;
- XtSetValues(XControl.Top,args,n);
- }
-
- XtAppMainLoop(XControl.App);
- }
-
- Error(va_alist)
-
- va_dcl
- {
- va_list args;
- struct XControl *XControl;
- char *format;
-
- va_start(args);
- XControl = va_arg(args,struct XControl *);
- format = va_arg(args,char *);
- vfprintf(stderr,format,args);
- va_end(args);
- exit(1);
- }
-
-
- Warning(va_alist)
-
- va_dcl
- {
- va_list args;
- struct XControl *XControl;
- char *format;
-
- va_start(args);
- XControl = va_arg(args,struct XControl *);
- format = va_arg(args,char *);
- vfprintf(stderr,format,args);
- va_end(args);
- }
-
- /* BuildCallStruct: This function returns a call structure which contains */
- /* all the information a callback routine will need. */
-
- XtPointer BuildCallStruct(XControl,Commands,Direct,Dynamic)
-
- struct XControl *XControl;
- struct CommandList *Commands;
- int Direct;
- int Dynamic;
-
- {
- struct CallStruct *new;
-
- new = (struct CallStruct *) XtMalloc(sizeof(struct CallStruct));
-
- new->XControl = XControl;
- new->Commands = Commands;
- new->Direct = Direct;
- new->Dynamic = Dynamic;
-
- return(new);
- }
-
- /* BuildChildCommand: This function takes the ChildCommand and the */
- /* ChildCommandArguments and generates the argument list that will be passed*/
- /* to exec to launch the child. */
-
- BuildChildCommand(XControl)
-
-
- struct XControl *XControl;
-
- {
- int i,k;
- int nargs = 1;
- char *buffer;
- char *p;
- char **args;
- int len;
-
- len = strlen(XControl->ChildCommand);
- buffer = (char *) XtMalloc(sizeof(char) * (len + 1));
- strcpy(buffer,XControl->ChildCommand);
-
- i = len;
- while((--i >= 0) && (buffer[i] != '/'));
- XControl->ChildArgv = (char**)XtMalloc(sizeof(char *));
- XControl->ChildArgv[0] = &buffer[i+1];
-
- len = strlen(XControl->ChildCommandArguments) + 1;
- buffer = (char *) XtMalloc(sizeof(char) * (len + 1));
-
- args = BuildArgList(XControl,XControl->ChildCommandArguments,&nargs);
- XControl->ChildArgv = (char **)XtRealloc(XControl->ChildArgv,
- sizeof(char *) * (nargs + 1));
- for(i = 0; i < nargs; i++)
- XControl->ChildArgv[i+1] = args[i];
- }
-
- /* BuildArgList: This function takes a character string and builds an */
- /* arglist (array of character strings) from it. The individual pieces */
- /* in the string are delimited by spaces unless they are imbedded in quotes */
-
- char **BuildArgList(XControl,string,nargs)
-
- struct XControl *XControl;
- char *string;
- int *nargs;
- {
- int i,k;
- char *p;
- char *buffer;
- char **args = NULL;
-
- *nargs = 0;
- i = 0;
- p = string;
- buffer = XtMalloc(strlen(string) + 1);
-
- while(*p != NULL)
- {
- k = 0;
- while((*p == ' ') && (*p != NULL))
- *p++;
- while((*p != ' ') && (*p != NULL))
- {
- if(*p == '\\')
- buffer[k++] = *++p;
- else if(*p == '\"')
- {
- while((*++p != '\"') && (*p != NULL))
- {
- if(*p == '\\')
- buffer[k++] = *++p;
- else
- buffer[k++] = *p;
- }
- }
- else
- buffer[k++] = *p;
- p++;
- }
- buffer[k] = NULL;
- if(k != 0)
- {
- (*nargs)++;
- args = (char **)XtRealloc(args,sizeof(char *) * (*nargs));
- args[*nargs-1] = (char *) XtMalloc(sizeof(char) * strlen(buffer) + 1);
- strcpy(args[*nargs-1],buffer);
- }
- }
- (*nargs)++;
- args = (char **) XtRealloc(args, sizeof(char *) * (*nargs));
- args[*nargs-1] = NULL;
- XtFree(buffer);
- return(args);
- }
-
- /* SetUpSignals: This function sets up the signal handler routines for the */
- /* program. Since X is not safe for signals, we us a pipe to store the */
- /* signals in. When ever a signal occures, the signal handler simply writes*/
- /* the number of the signal into the pipe. An input handler will then be */
- /* called to read in the signal number and it will be properly handled */
- /* there. */
-
- SetUpSignals(XControl,App)
-
- struct XControl *XControl;
- XtAppContext App;
- {
- int pipeline[2];
- XtInputId SigInputId;
- struct sigvec Sig;
-
- pipe(pipeline);
- XControl->SignalPipeline = pipeline[0];
- SigSink = pipeline[1];
-
- SigInputId = XtAppAddInput(App,pipeline[0],XtInputReadMask,SignalCB,
- (XtPointer)XControl);
-
- Sig.sv_handler = SignalHandler;
- Sig.sv_mask = 0;
- Sig.sv_flags = SV_RESETHAND;
-
- sigvector(SIGHUP,&Sig,NULL);
- sigvector(SIGINT,&Sig,NULL);
- sigvector(SIGQUIT,&Sig,NULL);
- /*sigvector(SIGPIPE,&Sig,NULL);*/
- sigvector(SIGALRM,&Sig,NULL);
- sigvector(SIGUSR1,&Sig,NULL);
- sigvector(SIGUSR2,&Sig,NULL);
- sigvector(SIGCHLD,&Sig,NULL);
- sigvector(SIGIO,&Sig,NULL);
- sigvector(SIGWINDOW,&Sig,NULL);
- sigvector(SIGSTOP,&Sig,NULL);
- sigvector(SIGCONT,&Sig,NULL);
- sigvector(SIGURG,&Sig,NULL);
- }
-
- /* SignalHandler: This is the signal handler routine. It simply writes the */
- /* signal number into the signal pipeline. The XtInput handler will do the */
- /* rest of the work. */
-
- void SignalHandler(sig)
-
- int sig;
-
- {
- write(SigSink,&sig,sizeof(int));
- }
-
- /* SignalCB: This is the signal callback routine. It is called whenever */
- /* there is a signal waiting to be read from the signal pipeline. It reads */
- /* in the signal number and then executes whatever command list is bound */
- /* to the signal. */
-
- void SignalCB(client,source,id)
-
- XtPointer client;
- int *source;
- XtInputId *id;
-
- {
- struct XControl *XControl = (struct XControl *) client;
- struct sigvec Sigv;
- int Sig;
-
- read(XControl->SignalPipeline,&Sig,sizeof(int));
-
- if(Sig < NSIG)
- {
- ExecuteCommandList(XControl,XControl->SignalCommands[Sig]);
- Sigv.sv_handler = SignalHandler;
- Sigv.sv_mask = 0;
- Sigv.sv_flags = SV_RESETHAND;
- sigvector(Sig,&Sigv,NULL);
- }
- else
- Warning(XControl,"Caught a funny Signal %d\n",Sig);
- }
-
- /* CommandListConverter: This is the XtResource converter for the */
- /* CommandList. It takes a character string and builds the command list */
- /* from it. */
-
- CommandListConverter(display,args,num_args,from,to,converter_data)
-
- Display *display;
- XrmValue *args;
- Cardinal *num_args;
- XrmValue *from;
- XrmValue *to;
- XrmValue *converter_data;
-
- {
- struct XControl *XControl = (struct XControl *)args->addr;
- struct CommandList *temp;
- struct CommandList **position;
-
- temp = ParseString(XControl,from->addr);
- position = (struct CommandList **)to->addr;
- *position = temp;
- to->size = sizeof(struct CommandList *);
-
- return(True);
- }
-
- /* PtyCB: This is the Pty callback handler. When called with a reason */
- /* reason of open it launches the child process and then installs our */
- /* Vue drop callback handler. */
-
- void PtyCB(w,XControl,reason)
-
- Widget w;
- struct XControl *XControl;
- PtyCallback *reason;
-
- {
- Arg args[10];
- int n = 0;
- char *name;
-
- if(reason->reason == PTY_OPEN)
- {
- XtSetArg(args[n],XtNslavePtyName,&name); n++;
- XtGetValues(w,args,n);
-
- LaunchChild(w,XControl,reason,name);
-
- SetDragWindow(XControl);
- }
- }
-
- /* SetDragWindow: This function registers the terminal widget window as a */
- /* valid drop window with the drag controller. Drops will be allowed in */
- /* the entire window. */
-
- SetDragWindow(XControl)
-
- struct XControl *XControl;
-
- {
- Arg args[10];
- int n = 0;
- char buffer[256];
- char *string;
- Pixel top,bottom;
- Dimension width,height;
-
- XSync(XtDisplay(XControl->Terminal),False);
- n = 0;
- XtSetArg(args[n],XmNtopShadowColor,&top); n++;
- XtSetArg(args[n],XmNbottomShadowColor,&bottom); n++;
- XtSetArg(args[n],XmNwidth,&width); n++;
- XtSetArg(args[n],XmNheight,&height); n++;
- XtGetValues(XControl->Terminal,args,n);
-
- sprintf(buffer,"=%dx%d+1+1-%s",width-2,height-2,XControl->DropZoneType);
- errno = 0;
- XvRegisterDragWindow(XtDisplay(XControl->Terminal),
- XtWindow(XControl->Terminal),1,top,bottom,buffer,buffer,
- (XtPointer)XControl);
- if(errno != 0)
- perror("XvRegisterDragWindow");
- XvFlushBatchRequests();
- /*XeSendRequest("FILEMGR"," REMOVE_TRASH",NULL,
- "maxwell:/users/gordon/general/xcontrol/core",NULL);
- string = buffer;
- n = 256;
- XeAddMsgCallback(RequestCB,"* * R XCONTROL * * * ",
- "blah2",NULL);*/
- /*XeSendRequest("XCONTROL","TEST",NULL," ",NULL);*/
- }
-
- /* LaunchChild: This function launches the child process. It first executes*/
- /* any commands bound to the StartCommands resource. It then forks and */
- /* sets up the child environment and executes any command bound to the */
- /* PreLaunch resource. Finally, it exec's the child process. */
-
- LaunchChild(w,XControl,reason,SlaveName)
-
- Widget w;
- struct XControl *XControl;
- PtyCallback *reason;
- char *SlaveName;
-
-
- {
- int fd;
- int i;
- int tblsize;
-
- /* first execute the startup commands (if any) */
-
- ExecuteCommandList(XControl,XControl->StartCommands);
-
- close(reason->SlavePtyDescriptor);
-
- if((XControl->ChildPid = fork()) == 0)
- { /* child process */
- tblsize = sysconf(_SC_OPEN_MAX);
- for(i = 0; i < tblsize; i++)
- close(i);
-
- setsid();
-
- fd = open(SlaveName,O_RDWR);
- dup(fd);
- dup(fd);
-
- ExecuteCommandList(XControl,XControl->ChildForkCommands);
-
- execv(XControl->ChildCommand,XControl->ChildArgv);
- exit(999); /* we only get here if execl fails */
- }
- else
- { /* parent process */
- if(XControl->ChildPid < 0)
- Error(XControl,"Can't fork!\n");
- ExecuteCommandList(XControl,XControl->ParentForkCommands);
- }
- }
-
- /* KeyCB: This is the Keyboard call back handler. It is called whenever */
- /* the user types in a key. It simply sends it to the pty for processing */
-
- void KeyCB(w,XControl,reason)
-
- Widget w;
- struct XControl *XControl;
- GenTermEmCallback *reason;
-
- {
- PtyWrite(w,reason->string,reason->len);
- }
-
- /* CommandCB: This is the command callback handler. It is called when a */
- /* specific event has happened which has had a command list bound to it. */
-
- void CommandCB(w,CallData,reason)
-
- Widget w;
- struct CallStruct *CallData;
- XtPointer reason;
-
- {
- struct CommandList *Commands;
-
- CallData->XControl->CallbackReason = reason;
-
- if(CallData->Direct == True)
- Commands = CallData->Commands;
- else
- Commands = *((struct CommandList **)CallData->Commands);
-
- ExecuteCommandList(CallData->XControl,Commands);
-
- if(CallData->Dynamic == True)
- {
- DestroyCommandList(CallData->XControl,Commands);
- if(CallData->Direct == False)
- *((struct CommandList **)CallData->Commands) = NULL;
- }
-
- }
-
- /* TimeOutCB: This is the timeout callback handler. It simply calls the */
- /* command callback function to perform all the work and then frees up the */
- /* mempry associated with the calling structure. */
-
- void TimeOutCB(CallData,reason)
-
- struct CallStruct *CallData;
- XtPointer reason;
-
- {
- CommandCB(NULL,CallData,reason);
- XtFree(CallData);
- }
-
- /* ActionCB: This is the action handler routine. It takes the action */
- /* string can compiles it into a command sequence. It then executes the */
- /* command list and then returns. */
-
- void ActionCB(w,event,CommandString,NString)
-
- Widget w;
- XEvent *event;
- String *CommandString;
- Cardinal *NString;
-
- {
- struct CommandList *Commands;
- int i;
-
- XControl.CallbackReason = event;
-
- for(i = 0; i < *NString; i++)
- {
- Commands = ParseString(&XControl,CommandString[i]);
- ExecuteCommandList(&XControl,Commands);
- DestroyCommandList(&XControl,Commands);
- }
- }
-
- /* PopDownCB: This callback unmanages a dialog. It is called from the */
- /* the help callback on the MessageDialog. */
-
- void PopDownCB(w,Calldata,reason)
-
- Widget w;
- Widget Calldata;
- XtPointer reason;
-
- {
- XtUnmanageChild(w);
- }
-
- /* LoadSession: This function reads in a previously saved session file. */
- /* It is used to restart a session that was saved by the session manager. */
-
- LoadSession(XControl)
-
- struct XControl *XControl;
-
- {
- FILE *SaveFile;
- char buffer[1024];
- int i;
-
- if((SaveFile = fopen(XControl->SessionFile,"r")) == NULL)
- Error(XControl,"Can't open session file %s\n",XControl->SessionFile);
-
- fgets(buffer,1024,SaveFile);
- buffer[strlen(buffer)-1] = NULL; /* get rid of newline */
- if(strcmp(buffer,SESSION_HEADER) != 0)
- {
- Warning(XControl,"Session file contains invalid data, ignoring\n");
- return(0);
- }
-
- XtFree(XControl->TerminalType);
- XControl->TerminalType = LoadString(XControl,SaveFile);
- XtFree(XControl->ChildCommand);
- XControl->ChildCommand = LoadString(XControl,SaveFile);
- XtFree(XControl->ChildCommandArguments);
- XControl->ChildCommandArguments = LoadString(XControl,SaveFile);
-
- DestroyCommandList(XControl,XControl->StartCommands);
- XControl->StartCommands = LoadCommandList(XControl,SaveFile);
-
- for(i = 0; i < NSIG; i++)
- {
- DestroyCommandList(XControl,XControl->SignalCommands[i]);
- XControl->SignalCommands[i] = LoadCommandList(XControl,SaveFile);
- }
- DestroyCommandList(XControl,XControl->CloseWindowCommands);
- XControl->CloseWindowCommands = LoadCommandList(XControl,SaveFile);
- DestroyCommandList(XControl,XControl->SaveCommands);
- XControl->SaveCommands = LoadCommandList(XControl,SaveFile);
- DestroyCommandList(XControl,XControl->EscapeCommands);
- XControl->EscapeCommands = LoadCommandList(XControl,SaveFile);
- DestroyCommandList(XControl,XControl->TopCommands);
- XControl->TopCommands = LoadCommandList(XControl,SaveFile);
- DestroyCommandList(XControl,XControl->ResizeCommands);
- XControl->ResizeCommands = LoadCommandList(XControl,SaveFile);
- DestroyCommandList(XControl,XControl->WakeUpCommands);
- XControl->WakeUpCommands = LoadCommandList(XControl,SaveFile);
- DestroyCommandList(XControl,XControl->FlowCommands);
- XControl->FlowCommands = LoadCommandList(XControl,SaveFile);
- DestroyCommandList(XControl,XControl->ParentForkCommands);
- XControl->ParentForkCommands = LoadCommandList(XControl,SaveFile);
- DestroyCommandList(XControl,XControl->ChildForkCommands);
- XControl->ChildForkCommands = LoadCommandList(XControl,SaveFile);
- DestroyCommandList(XControl,XControl->DropCommands);
- XControl->DropCommands = LoadCommandList(XControl,SaveFile);
- DestroyCommandList(XControl,XControl->PromptYesCommands);
- XControl->PromptYesCommands = LoadCommandList(XControl,SaveFile);
- DestroyCommandList(XControl,XControl->PromptNoCommands);
- XControl->PromptNoCommands = LoadCommandList(XControl,SaveFile);
- DestroyCommandList(XControl,XControl->PromptCancelCommands);
- XControl->PromptCancelCommands = LoadCommandList(XControl,SaveFile);
-
- fclose(SaveFile);
- }
-
- /* LoadString: This function reads a string from the session file. */
-
- char *LoadString(XControl,File)
-
- struct XControl *XControl;
- FILE *File;
-
- {
- int n,i;
- char *string;
-
- if(fscanf(File,"%d\n",&n) != 1)
- Error(XControl,"Can't find string length is session file!\n");
-
- if(n < 0)
- return(NULL);
- fgetc(File); /* first character is dummy to stop scanf from going to far */
- if(n == 0)
- return(NULL);
-
- string = XtMalloc(sizeof(char) * (n+1));
-
- for(i = 0; i < n; i++)
- string[i] = fgetc(File);
- fgetc(File); /* read trailing newline */
- string[n] = NULL;
-
- return(string);
- }
-
- /* DropCB: This is the Vue drop callback handler. It is called whenever */
- /* an icon is dropped on our window. It stores the required drop */
- /* information and executes any command associated with the action. */
-
- void DropCB(display,win,x,y,root,root_x,root_y,mods,types,objects,XControl)
-
- Display *display;
- Window win;
- Position x,y;
- Window root;
- Position root_x,root_y;
- unsigned int mods;
- char *types;
- char *objects;
- struct XControl *XControl;
-
- {
- int i;
- char Name[256];
-
- for(i = 0; i < strlen(types); i++)
- if(types[i] == ',')
- types[i] = ' ';
- XControl->DropTypes = BuildArgList(XControl,types,
- &XControl->NumberTypesDropped);
- XControl->DropTypes -= 1;
- XControl->DropFiles = BuildArgList(XControl,objects,
- &XControl->NumberFilesDropped);
- XControl->NumberFilesDropped -= 3;
-
- gethostname(Name,256);
-
- if((strcmp(Name,XControl->DropFiles[0]) != 0) &&
- (XControl->RemoteDropsAllowed == False))
- {
- XWarning(XControl,"Error!!\nCan not accept a drop from a remote host");
- }
- else
- ExecuteCommandList(XControl,XControl->DropCommands);
- }
-
- /* XWarning: This function pops up a warning dialog with the given text */
- /* as its message. */
-
- XWarning(XControl,Message)
-
- struct XControl *XControl;
- char *Message;
-
- {
- int n = 0;
- Arg args[10];
-
- XtSetArg(args[n],XmNmessageString,
- XmStringCreateLtoR(Message,XmSTRING_DEFAULT_CHARSET)); n++;
- XtSetValues(XControl->Warning,args,n);
- XtManageChild(XControl->Warning);
- }
-
-
- void ResizeCB(w,XControl,reason)
-
- Widget w;
- struct XControl *XControl;
- XtPointer reason;
-
- {
- SetDragWindow(XControl);
- }
-
- void RequestCB(c1,c2,c3,c4,c5,c6,c7,c8)
-
- char *c1,*c2,*c3,*c4,*c5,*c6,*c7,*c8;
-
- {
- fprintf(stderr,"Got a callback!\n%s\n",c6);
- XeSendSuccessNotification("XCONTROL",NULL,"TEST",NULL,"blah4","blah5");
- }
- @EOF
- set `wc -lwc <xcontrol/XControl.c`
- if test $1$2$3 != 984234927562
- then
- echo ERROR: wc results of xcontrol/XControl.c are $* should be 984 2349 27562
- fi
-
- chmod 644 xcontrol/XControl.c
-
- echo x - xcontrol/XControl.h
- cat >xcontrol/XControl.h <<'@EOF'
- /* XControl.h This is the include file for the XControl program */
- /* History: */
- /* Written by G. R. Strachan 1992 */
-
- /* Copyright Gordon R. Strachan 1992 */
- /* This code is provided as is, neither the University of Waterloo nor */
- /* the author is liable for any damage caused by the use or misuse of this */
- /* code. */
-
- /* Permission is granted to copy, use and modify this code provided it is */
- /* not sold for profit and the above copyright remains intact. */
-
- #define SESSION_HEADER "XControl version 1.0 Session File"
-
- struct CommandList
- {
- int (*Command)();
- struct Argument *Args;
- int NumberArguments;
- struct CommandList *Next;
- };
-
- struct Argument
- {
- char *String;
- int Type;
- int Value;
- };
-
- struct FunctionList
- {
- char *Name;
- int (*Function)();
- };
-
- struct CallStruct
-
- {
- struct XControl *XControl;
- struct CommandList *Commands;
- int Direct;
- int Dynamic;
- };
-
- struct XControl
- {
- char *ProgramName;
- XtAppContext App;
- struct FunctionList *Functions;
- int ChildPid;
- char *TerminalType;
- char *ChildCommand;
- char *ChildCommandArguments;
- char **ChildArgv;
- int SignalPipeline;
- char **PositionalArgs;
- int NumberPositions;
- char *SessionFile;
- struct CommandList *StartCommands;
- struct CommandList *SignalCommands[NSIG];
- struct CommandList *CloseWindowCommands;
- struct CommandList *SaveCommands;
- struct CommandList *EscapeCommands;
- struct CommandList *TopCommands;
- struct CommandList *ResizeCommands;
- struct CommandList *WakeUpCommands;
- struct CommandList *FlowCommands;
- struct CommandList *ParentForkCommands;
- struct CommandList *ChildForkCommands;
- struct CommandList *DropCommands;
- struct CommandList *PromptYesCommands;
- struct CommandList *PromptNoCommands;
- struct CommandList *PromptCancelCommands;
- caddr_t CallbackReason;
- Widget Top;
- Widget Terminal;
- Widget Message;
- Widget Warning;
- char **DropTypes;
- char **DropFiles;
- char *DropZoneType;
- int NumberFilesDropped;
- int NumberTypesDropped;
- Boolean RemoteDropsAllowed;
- };
-
- #define STRINGARG 1
- #define POSITIONARG 2
- #define INTEGERARG 3
-
- #define XCOKAY 1
- #define XCERROR 0
- #define XCABORT 2
- @EOF
- set `wc -lwc <xcontrol/XControl.h`
- if test $1$2$3 != 932582132
- then
- echo ERROR: wc results of xcontrol/XControl.h are $* should be 93 258 2132
- fi
-
- chmod 644 xcontrol/XControl.h
-
- echo x - xcontrol/XControl.man '[non-ascii]'
- $unpacker <<'@eof'
- begin 644 xcontrol/XControl.man
- M+EPB($UA;B!P86=E(&9O<B!T:&4@6$-O;G1R;VP@<')O9W)A;2 M*BUN<F]FX
- M9BTJ+0HN7"(*+EPB(%=R:71T96X@8GD@1RX@4W1R86-H86X@,3DY,@HN7"(*X
- M+EPB($%D9"!S:6UP;&4@:V5E<',@=&\@34%.(&UA8W)O<R!S;R N5%,O+E1%X
- M('=I;&P@=V]R:PHN7"(*+F1E($M3("!<(B @(" @($ME97 @<W1A<G0*+F)RX
- M"BYI;B P"BYD:2!+4 HN+@HN9&4@2T4@(%PB(" @(" @2V5E<"!E;F0*+F)RX
- M"BYD:0HN;F4@7%QN*&1N=0HN;G(@9DD@7%QN*"YU"BYN9@HN2U *+FEF(%Q<X
- M;BAF22 N9FD*+FEN"BXN"BY42"!80T].5%)/3" Q6 HN4T@@3D%-10I80V]NX
- M=')O;" M($%N(%@@8VQI96YT('5S960@=&\@;6%N86=E(&%N9"!C;VYT<F]LX
- M('=I;F1O=R!D=6UB('!R;V=R86US"BYS<" Q"BY32"!364Y/4%-)4PHN0B!8X
- M0V]N=')O; I;+71O;VQK:71O<'1I;VY=("U;;W!T:6]N70HN<W @,0HN4T@@X
- M1$530U))4%1)3TX*5&AE(%QF25A#;VYT<F]L7&90('!R;V=R86T@:7,@9&5SX
- M:6=N960@86QL;W<@<')O9W)A;7,@=VAI8V@@9&\@;F]T"FEN=&5R86-T('=IX
- M=&@@=&AE(%@@5VEN9&]W('-Y<W1E;2!T;R!O<&5R871E(&5F9F5C=&EV96QYX
- M('=I=&AI;B!T:&4@6 IE;G9I<F]N;65N="X@($EN(&]R9&5R('1O(&]P97)AX
- M=&4@82!W:6YD;W<@9'5M8B!P<F]G<F%M(&9R;VT@=VET:&EN"G1H92!8(&5NX
- M=FER;VYM96YT+"!A;B!8(&-L:65N="!I<R!R97%U:7)E9"!T;R!P<F]V:61EX
- M('1H870@<')O9W)A;0IW:71H(&$@;6EN:6UU;2!O9B!8('-E<G9I8V5S+B @X
- M5'EP:6-A;&QY+"!N;VX@6"!7:6YD;W<@<')O9W)A;7,@87)E"G)U;B!F<F]MX
- M('=I=&@@:6X@82!T97)M:6YA;"!E;75L871O<B!P<F]G<F%M('-U8V@@87,@X
- M7&9):'!T97)M7&90(&]R"EQF27AT97)M7&90+B @5&AI<R!P<F]V:61E<R!TX
- M:&4@<')O9W)A;2!W:71H(&UE86YS(&]F(&1I<W!L87EI;F<@=&5X= IO;B!TX
- M:&4@9&ES<&QA>2!A;F0@<F5C96EV:6YG(&ME>6)O87)D(&EN<'5T+B @2&]WX
- M979E<BP@=&AE<V4@87)E('1H90IO;FQY('-E<G9I8V5S('1H92!T97)M:6YAX
- M;"!E;75L871O<G,@<')O=FED92!T;R!T:&4@<')O9W)A;2X@(%1H97)E"F%RX
- M92!M86YY(&]T:&5R(%@@979E;G1S('=H:6-H('1H92!U;F1E<FQY:6YG('!RX
- M;V=R86T@:&%S('1O(')E86-T('1O"F)U="!A<F4@;F]T(&AA;F1L960@8GD@X
- M=&AE('1E<FUI;F%L(&5M=6QA=&]R+B @06X@97AA;7!L92!O9B!T:&ES(&ESX
- M"G=I;F1O=R!C;&]S=7)E+B @5VAE;B!T:&4@=&5R;6EN86P@96UU;&%T;W(@X
- M=VEN9&]W(&ES(&-L;W-E9"P@:70*<VEM<&QY(&MI;&QS('1H92!P<F]G<F%MX
- M(&ET(&ES(&-O;G1R;VQL:6YG(')A=&AE<B!T:&%N(&EN9F]R;6EN9R!I= ITX
- M:&%T('1H92!W:6YD;W<@:&%S(&)E96X@8VQO<V5D(&%N9"!A;&QO=VEN9R!IX
- M="!T;R!T86ME('=H870@979E<@IA8W1I;VYS(&YE8V5S<V%R>2X@(%QF25A#X
- M;VYT<F]L7&90(&ES(&1E<VEG;F5D('1O('!R;W9I9&4@86QL('1H90IS97)VX
- M:6-E<R!O9B!T:&4@=&5R;6EN86P@96UU;&%T;W(@<&QU<R!C;VYT<F]L<R!FX
- M;W(@;W1H97(@6"!E=F5N=',N"E1H92!P<F]G<F%M(&-O;G-I<W1S(&]F(&$@X
- M<V5R:65S(&]F(&-O;6UA;F1S('1O('!E<F9O<FT@;VX@=&AE"G5N9&5R;'EIX
- M;F<@<')O8V5S<R!P;'5S(&$@<V5T(&]F('1R:6=G97)S('1O(&5N=F]K92!TX
- M:&5S92!C;VUM86YD<RX*26X@861D:71I;VXL(&ET(&EN=&5R86-T<R!W:71HX
- M('1H92!6544@96YV:7)O;FUE;G0@=&\@<')O=FED92!S=7!P;W)T"F9O<B!RX
- M97-T87)T:6YG('-E<W-I;VYS(&%N9"!F;W(@9')A9R!A;F0@9')O<"X*+G-PX
- M(#$*+E-(($]05$E/3E,*5&AE(%QF25A#;VYT<F]L7&90('!R;V=R86T@86-CX
- M97!T<R!A;&P@;V8@=&AE('-T86YD87)D(%@@5&]O;&MI= IC;VUM86YD(&QIX
- M;F4@;W!T:6]N<R!P;'5S('1H92!F;VQL;W=I;F<Z"BY44" X"BY"22!<+6APX
- M=&5R;0I4:&ES(&]P=&EO;B!S<&5C:69I97,@=&AA="!T:&4@7&9)6$-O;G1RX
- M;VQ<9E @<')O9W)A;2!S:&]U;&0@96UU;&%T92!A"G1E<FTP('1E<FUI;F%LX
- M+B @07-S;V-I871E9"!R97-O=7)C93H@7&9"*G1E<FUI;F%L5'EP95QF4 HNX
- M5% @. HN0DD@7"MH<'1E<FT*5&AI<R!O<'1I;VX@<W!E8VEF:65S('1H870@X
- M=&AE(%QF25A#;VYT<F]L7&90('!R;V=R86T@<VAO=6QD(&5M=6QA=&4@80IVX
- M=#$P,"!T97)M:6YA;"X@($%S<V]C:6%T960@<F5S;W5R8V4Z(%QF0BIT97)MX
- M:6YA;%1Y<&5<9E *+E10(#@*+D))(%PM>'1E<FT*5&AI<R!O<'1I;VX@<W!EX
- M8VEF:65S('1H870@=&AE(%QF25A#;VYT<F]L7&90('!R;V=R86T@<VAO=6QDX
- M(&5M=6QA=&4@80IV=#$P,"!T97)M:6YA;"X@($%S<V]C:6%T960@<F5S;W5RX
- M8V4Z(%QF0BIT97)M:6YA;%1Y<&5<9E *+E10(#@*+D))(%PM8V]M;6%N9" BX
- M($-O;6UA;F1.86UE(@I4:&ES(&]P=&EO;B!S<&5C:69I97,@=&AE(&YA;64@X
- M;V8@=&AE('!R;V=R86T@=&\@;6%N86=E+@I<9DE#;VUM86YD3F%M95QF4"!IX
- M<R!T:&4@<&%T:&YA;64@;V8@=&AE('!R;V=R86TN("!!<W-O8VEA=&5D"G)EX
- M<V]U<F-E.B!<9D(J8VAI;&1#;VUM86YD7&90"BY44" X"BY"22!<+6%R9W5MX
- M96YT<R B($-H:6QD07)G=6UE;G1S(@I4:&ES(&]P=&EO;B!S<&5C:69I97,@X
- M=&AE(&%R9W5M96YT<R!T;R!P87-S('1O('1H92!C:&EL9"!P<F]C97-S('=HX
- M96X*:70@:7,@9F]R:V5D+B @7&9)0VAI;&1!<F=U;65N='-<9E @<VAO=6QDX
- M(&)E(&5M8F5D9&5D(&EN('%U;W1E<R!T;PIP<F5V96YT(&EN=&5R<')E=&%TX
- M:6]N(&)Y('1H92!S:&5L;"X@($%S<V]C:6%T960@<F5S;W5R8V4Z"EQF0BICX
- M:&EL9$%R9W5M96YT<UQF4 HN5% @. HN0DD@7"US97-S:6]N("(@4V5S<VEOX
- M;D9I;&4B"E1H:7,@;W!T:6]N(&ES('!R;W9I9&5D(&9O<B!I;G1E<F%C=&EOX
- M;B!W:71H('1H92!6=64@<V5S<VEO;B!M86YA9V5R+@I<9DE397-S:6]N1FELX
- M95QF4"!I<R!T:&4@;F%M92!O9B!T:&4@9FEL92!I;B!W:&EC:"!T:&4@<')EX
- M=FEO=7,*<V5S<VEO;B!W87,@<V%V960N("!)=',@8V]N=&5N=',@87)E(')EX
- M860@=&\@<F5L;V%D('1H92!P<F5V:6]U<PIS97-S:6]N)W,@<F5S;W5R8V5SX
- M+B @07-S;V-I871E9"!R97-O=7)C93H@7&9"*G-E<W-I;VY&:6QE7&90"BYSX
- M<" Q"BY32"!215-/55)#15,*5&AE"BY)(%A#;VYT<F]L"G!R;V=R86T@8V]NX
- M<VES=',@;V8@82!<9DE0='E7:61G971<9E @:6YS:61E(&]F(&%N(%QF25AMX
- M36%I;E=I;F1O=UQF4 IW:61G970N("!297-O=7)C92!S<&5C:69I8R!T;R!TX
- M:&4@7&9)6$-O;G1R;VQ<9E @<')O9W)A;2!A<F4Z"BYS<" Q"BY+4PHN<W @X
- M,0HN5%,*8V5N=&5R.PIC0B!S<W,*;$(@;$(@;$(@;$(*;&QL;"X*6$-O;G1RX
- M;VP@4F5S;W5R8V4@4V5T"DYA;64)0VQA<W,)5'EP90E$969A=6QT"E\*8VAIX
- M;&1!<F=U;65N=',)0VAI;&1!<F=U;65N=',)4W1R:6YG"4Y53$P*8VAI;&1#X
- M;VUM86YD"4-H:6QD0V]M;6%N9 E3=')I;F<)+V)I;B]C<V@*8VAI;&1&;W)KX
- M0V]M;6%N9',)0VAI;&1&;W)K0V]M;6%N9',)0V]M;6%N9$QI<W0)3E5,3 ICX
- M;&]S95=I;F1O=T-O;6UA;F1S"4-L;W-E5VEN9&]W0V]M;6%N9',)0V]M;6%NX
- M9$QI<W0)475I="@P*0ID<F]P0V]M;6%N9',)1')O<$-O;6UA;F1S"4-O;6UAX
- M;F1,:7-T"4Y53$P*9')O<%IO;F54>7!E"41R;W!:;VYE5'EP90E3=')I;F<)X
- M1FEL945D:70*97-C87!E0V]M;6%N9',)17-C87!E0V]M;6%N9',)0V]M;6%NX
- M9$QI<W0)3E5,3 IF;&]W0V]M;6%N9',)1FQO=T-O;6UA;F1S"4-O;6UA;F1,X
- M:7-T"4Y53$P*<&%R96YT1F]R:T-O;6UA;F1S"5!A<F5N=$9O<FM#;VUM86YDX
- M<PE#;VUM86YD3&ES= E.54Q,"G)E;6]T941R;W!S06QL;W=E9 E296UO=&5$X
- M<F]P<T%L;&]W960)0F]O;&5A;@E&86QS90IR97-I>F5#;VUM86YD<PE297-IX
- M>F5#;VUM86YD<PE#;VUM86YD3&ES= E.54Q,"G-A=F5#;VUM86YD<PE3879EX
- M0V]M;6%N9',)0V]M;6%N9$QI<W0)4V%V95-E<W-I;VXH*0IS97-S:6]N1FELX
- M90E397-S:6]N1FEL90E3=')I;F<)3E5,3 IS:6=!;&%R;4-O;6UA;F1S"5-IX
- M9T%L87)M0V]M;6%N9',)0V]M;6%N9$QI<W0)3E5,3 IS:6=#:&EL9$-O;6UAX
- M;F1S"5-I9T-H:6QD0V]M;6%N9',)0V]M;6%N9$QI<W0)4F5A<"@Q*3M1=6ETX
- M*#$I"G-I9T-O;G1I;G5E0V]M;6%N9',)4VEG0V]N=&EN=65#;VUM86YD<PE#X
- M;VUM86YD3&ES= E.54Q,"G-I9TAA;F=5<$-O;6UA;F1S"5-I9TAA;F=5<$-OX
- M;6UA;F1S"4-O;6UA;F1,:7-T"4Y53$P*<VEG26YT97)R=7!T0V]M;6%N9',)X
- M4VEG26YT97)R=7!T0V]M;6%N9',)0V]M;6%N9$QI<W0)3E5,3 IS:6=)3T-OX
- M;6UA;F1S"5-I9TE/0V]M;6%N9',)0V]M;6%N9$QI<W0)3E5,3 IS:6=0:7!EX
- M0V]M;6%N9',)4VEG4&EP94-O;6UA;F1S"4-O;6UA;F1,:7-T"4Y53$P*<VEGX
- M475I=$-O;6UA;F1S"5-I9U%U:71#;VUM86YD<PE#;VUM86YD3&ES= E.54Q,X
- M"G-I9U-T;W!#;VUM86YD<PE3:6=3=&]P0V]M;6%N9',)0V]M;6%N9$QI<W0)X
- M3E5,3 IS:6=497)M0V]M;6%N9',)4VEG5&5R;4-O;6UA;F1S"4-O;6UA;F1,X
- M:7-T"4Y53$P*<VEG57)G96YT0V]M;6%N9',)4VEG57)G96YT0V]M;6%N9',)X
- M0V]M;6%N9$QI<W0)3E5,3 IS:6=5<W(Q0V]M;6%N9',)4VEG57-R,4-O;6UAX
- M;F1S"4-O;6UA;F1,:7-T"4Y53$P*<VEG57-R,D-O;6UA;F1S"5-I9U5S<C)#X
- M;VUM86YD<PE#;VUM86YD3&ES= E.54Q,"G-I9U=I;F1O=T-O;6UA;F1S"5-IX
- M9U=I;F1O=T-O;6UA;F1S"4Y53$P*<W1A<G1#;VUM86YD<PE3=&%R=$-O;6UAX
- M;F1S"4-O;6UA;F1,:7-T"4Y53$P*=&5R;6EN86Q4>7!E"51E<FUI;F%L5'EPX
- M90E3=')I;F<):'!T97)M"G1O<$-O;6UA;F1S"51O<$-O;6UA;F1S"4-O;6UAX
- M;F1,:7-T"4Y53$P*=V%K955P0V]M;6%N9',)5V%K955P0V]M;6%N9',)0V]MX
- M;6%N9$QI<W0)3E5,3 HN5$4*+G-P(#$*+DM%"BYS<" Q"BY)4" B7&9"8VAIX
- M;&1!<F=U;65N='-<9E B"E1H:7,@<F5S;W5R8V4@9&5F:6YE<R!T:&4@87)GX
- M=6UE;G1S('1H870@87)E('!A<W-E9"!T;R!T:&4@8VAI;&0@<')O8V5S<RX*X
- M+DE0(")<9D)C:&EL9$-O;6UA;F1<9E B"E1H:7,@<F5S;W5R8V4@<W!E8VEFX
- M:65S('1H92!C;VUP;&5T92!P871H;F%M92!O9B!T:&4@<')O9W)A;2!I="!IX
- M<R!T;PIM86YA9V4@87,@:71S(&-H:6QD('!R;V-E<W,N"BY)4" B7&9"8VAIX
- M;&1&;W)K0V]M;6%N9'-<9E B"E1H:7,@<F5S;W5R8V4@<W!E8VEF:65S('1HX
- M92!C;VUM86YD<R!T:&%T(&%R92!T;R!B92!E>&5C=71E9"!B>2!T:&4*8VAIX
- M;&0@<')O8V5S<R!I;6UE9&EA=&5L>2!B969O<F4@:70@97AE8R=S('1H92!PX
- M<F]G<F%M(&ET(&ES('1O;PIM86YA9V4N("!7:&5N('1H97-E(&-O;6UA;F1SX
- M(&%R92!E>&5C=71E9"P@86QL('1H92!P87)E;G0@9FEL97,@:&%V90IA;')EX
- M861Y(&)E96X@8VQO<V5D(&EN8VQU9&4@=&AE(&-O;FYE8W1I;VX@=&\@=&AEX
- M(%@@4V5R=F5R+@HN25 @(EQF0F-L;W-E5VEN9&]W0V]M;6%N9'-<9E B"E1HX
- M:7,@<F5S;W5R8V4@<W!E8VEF:65S('1H92!C;VUM86YD<R!T;R!E>&5C=71EX
- M('=H96X@=&AE('=I;F1O=PIM86YA9V5R(&ES(&%T=&5M<'1I;F<@=&\@8VQOX
- M<V4@;W5R('=I;F1O=RX@(%QF25A#;VYT<F]L7&90('=I;&P@;F]T"F-L;W-EX
- M('1H92!W:6YD;W<@=6YT:6P@=&AE(%QF25%U:70H*5QF4"!C;VUM86YD(&AAX
- M<R!B965N(&5X96-U=&5D+@HN25 @(EQF0F1R;W!#;VUM86YD<UQF4"(*5&AIX
- M<R!R97-O=7)C92!S<&5C:69I97,@=&AE(&-O;6UA;F1S('1O(&)E(&5X96-UX
- M=&5D('=H96X@=&AE('5S97(*9')O<',@86X@:6-O;B!O;B!O=7(@=VEN9&]WX
- M+@HN25 @(EQF0F1R;W!:;VYE5'EP95QF4"(*5&AI<R!R97-O=7)C92!S<&5CX
- M:69I97,@=&AE('1Y<&4@;V8@9')O<"!Z;VYE(&ET('-H;W5L9"!I;G-T86QLX
- M+B @5&AI<PID969I;F5S('1H92!T>7!E(&]F(&9I;&5S('1H870@=V4@87)EX
- M('=I;&QI;F<@=&\@86-C97!T+B @270@<VAO=6QD"F%G<F5E('=I=&@@;VYEX
- M(&]F('1H92!D<F]P('IO;F4@='EP97,@9V5N97)A=&5D(&)Y('1H92!F:6QEX
- M(&UA;F%G97(N"BY)4" B7&9"97-C87!E0V]M;6%N9'-<9E B"E1H:7,@<F5SX
- M;W5R8V4@<W!E8VEF:65S('1H92!C;VUM86YD<R!T;R!B92!E>&5C=71E9"!WX
- M:&5N('1H92!0='D*=VED9V5T(&%S<V5R=',@86X@17-C87!E($-A;&QB86-KX
- M+@HN25 @(EQF0F9L;W=#;VUM86YD<UQF4"(*5&AI<R!R97-O=7)C92!S<&5CX
- M:69I97,@=&AE(&-O;6UA;F1S('1O(&)E(&5X96-U=&5D('=H96X@=&AE(%!TX
- M>2!W:61G970*87-S97)T<R!A($9L;W<@0V%L;&)A8VLN"BY)4" B7&9"<&%RX
- M96YT1F]R:T-O;6UA;F1S7&90(@I4:&ES(')E<V]U<F-E('-P96-I9FEE<R!TX
- M:&4@8V]M;6%N9',@=&\@8F4@97AE8W5T960@8GD@=&AE('!A<F5N= IP<F]CX
- M97-S(&EM;65D:6%T96QY(&%F=&5R(&ET(&9O<FMS('1H92!C:&EL9"!P<F]CX
- M97-S+@HN25 @(EQF0G)E;6]T941R;W!S06QL;W=E9%QF4"(*5&AI<R!R97-OX
- M=7)C92!S<&5C:69I97,@=VAE=&AE<B!T:&4@<')O9W)A;2!S:&]U;&0@86QLX
- M;W<@:6-O;G,@=&\@8F4*9')O<'!E9"!F<F]M('!R;V=R86US(')U;FYI;F<@X
- M;VX@86YO=&AE<B!H;W-T+B @5&AI<R!S:&]U;&0@;VYL>2!B90IS970@=&\@X
- M5')U92!I9B!T:&4@=6YD97)L>6EN9R!A<'!L:6-A=&EO;B!E:71H97(@9&]EX
- M<VXG="!C87)E(&]R(&-A;@IH86YD;&4@<F5C96EV:6YG(&1A=&$@9G)O;2!RX
- M96UO=&4@87!P;&EC871I;VYS+@HN25 @(EQF0G)E<VEZ94-O;6UA;F1S7&90X
- M(@I4:&ES(')E<V]U<F-E('-P96-I9FEE<R!T:&4@8V]M;6%N9',@=&\@8F4@X
- M97AE8W5T960@=VAE;B!T:&4@=VEN9&]W"FUA;F%G97(@<F5S:7IE<R!T:&4@X
- M=VEN9&]W+@HN25 @(EQF0G-A=F5#;VUM86YD<UQF4"(*5&AI<R!R97-O=7)CX
- M92!S<&5C:69I97,@=&AE(&-O;6UA;F1S('1O(&)E(&5X96-U=&5D('=H96X@X
- M=&AE('-E<W-I;VX*;6%N86=E<B!R97%U97-T<R!T:&%T('1H92!P<F]G<F%MX
- M('-A=F4@:71S('-T871E+B @26X@;W)D97(@=&\@<')E=F5N= IT:&4@<V5SX
- M<VEO;B!M86YA9V5R(&9R;VT@:&%N9VEN9RP@;VYE(&]F('1H92!C;VUM86YDX
- M<R!S:&]U;&0@8F4*7&9)4V%V95-E<W-I;VXH*5QF4"X*+DE0(")<9D)S97-SX
- M:6]N1FEL95QF4"(*5&AI<R!R97-O=7)C92!S<&5C:69I97,@=&AE(&YA;64@X
- M;V8@=&AE('-E<W-I;VX@9FEL92!T;R!L;V%D+B @270@:7,*=7-E9"!W:&5NX
- M(')E<W1O<FEN9R!A('!R979I;W5S;'D@<V%V960@<V5S<VEO;BX*+DE0(")<X
- M9D)S:6=!;&%R;4-O;6UA;F1S7&90(@I4:&ES(')E<V]U<F-E('-P96-I9FEEX
- M<R!T:&4@8V]M;6%N9',@=&\@97AE8W5T92!W:&5N('1H92!P<F]G<F%M"G)EX
- M8V5I=F5S(&$@4TE'04Q-('-I9VYA;"X*+DE0(")<9D)S:6=#:&EL9$-O;6UAX
- M;F1S7&90(@I4:&ES(')E<V]U<F-E('-P96-I9FEE<R!T:&4@8V]M;6%N9',@X
- M=&\@97AE8W5T92!W:&5N('1H92!P<F]G<F%M"G)E8V5I=F5S(&$@4TE'0TA,X
- M1"!S:6=N86PN"BY)4" B7&9"<VEG0V]N=&EN=65#;VUM86YD<UQF4"(*5&AIX
- M<R!R97-O=7)C92!S<&5C:69I97,@=&AE(&-O;6UA;F1S('1O(&5X96-U=&4@X
- M=VAE;B!T:&4@<')O9W)A;0IR96-E:79E<R!A(%-)1T-/3E0@<VEG;F%L+@HNX
- M25 @(EQF0G-I9TAA;F=5<$-O;6UA;F1S7&90(@I4:&ES(')E<V]U<F-E('-PX
- M96-I9FEE<R!T:&4@8V]M;6%N9',@=&\@97AE8W5T92!W:&5N('1H92!P<F]GX
- M<F%M"G)E8V5I=F5S(&$@4TE'2%50('-I9VYA;"X*+DE0(")<9D)S:6=);G1EX
- M<G)U<'1#;VUM86YD<UQF4"(*5&AI<R!R97-O=7)C92!S<&5C:69I97,@=&AEX
- M(&-O;6UA;F1S('1O(&5X96-U=&4@=VAE;B!T:&4@<')O9W)A;0IR96-E:79EX
- M<R!A(%-)1TE.5"!S:6=N86PN"BY)4" B7&9"<VEG24]#;VUM86YD<UQF4"(*X
- M5&AI<R!R97-O=7)C92!S<&5C:69I97,@=&AE(&-O;6UA;F1S('1O(&5X96-UX
- M=&4@=VAE;B!T:&4@<')O9W)A;0IR96-E:79E<R!A(%-)1TE/('-I9VYA;"X*X
- M+DE0(")<9D)S:6=0:7!E0V]M;6%N9'-<9E B"E1H:7,@<F5S;W5R8V4@<W!EX
- M8VEF:65S('1H92!C;VUM86YD<R!T;R!E>&5C=71E('=H96X@=&AE('!R;V=RX
- M86T*<F5C96EV97,@82!324=025!%('-I9VYA;"X*+DE0(")<9D)S:6=1=6ETX
- M0V]M;6%N9'-<9E B"E1H:7,@<F5S;W5R8V4@<W!E8VEF:65S('1H92!C;VUMX
- M86YD<R!T;R!E>&5C=71E('=H96X@=&AE('!R;V=R86T*<F5C96EV97,@82!3X
- M24=154E4('-I9VYA;"X*+DE0(")<9D)S:6=3=&]P0V]M;6%N9'-<9E B"E1HX
- M:7,@<F5S;W5R8V4@<W!E8VEF:65S('1H92!C;VUM86YD<R!T;R!E>&5C=71EX
- M('=H96X@=&AE('!R;V=R86T*<F5C96EV97,@82!324=35$]0('-I9VYA;"X*X
- M+DE0(")<9D)S:6=497)M0V]M;6%N9'-<9E B"E1H:7,@<F5S;W5R8V4@<W!EX
- M8VEF:65S('1H92!C;VUM86YD<R!T;R!E>&5C=71E('=H96X@=&AE('!R;V=RX
- M86T*<F5C96EV97,@82!324=415)-('-I9VYA;"X*+DE0(")<9D)S:6=5<F=EX
- M;G1#;VUM86YD<UQF4"(*5&AI<R!R97-O=7)C92!S<&5C:69I97,@=&AE(&-OX
- M;6UA;F1S('1O(&5X96-U=&4@=VAE;B!T:&4@<')O9W)A;0IR96-E:79E<R!AX
- M(%-)1U521TY4('-I9VYA;"X*+DE0(")<9D)S:6=5<W(Q0V]M;6%N9'-<9E BX
- M"E1H:7,@<F5S;W5R8V4@<W!E8VEF:65S('1H92!C;VUM86YD<R!T;R!E>&5CX
- M=71E('=H96X@=&AE('!R;V=R86T*<F5C96EV97,@82!324=54U(Q('-I9VYAX
- M;"X*+DE0(")<9D)S:6=5<W(R0V]M;6%N9'-<9E B"E1H:7,@<F5S;W5R8V4@X
- M<W!E8VEF:65S('1H92!C;VUM86YD<R!T;R!E>&5C=71E('=H96X@=&AE('!RX
- M;V=R86T*<F5C96EV97,@82!324=54U(R('-I9VYA;"X*+DE0(")<9D)S:6=7X
- M:6YD;W=#;VUM86YD<UQF4"(*5&AI<R!R97-O=7)C92!S<&5C:69I97,@=&AEX
- M(&-O;6UA;F1S('1O(&5X96-U=&4@=VAE;B!T:&4@<')O9W)A;0IR96-E:79EX
- M<R!A(%-)1U=)3D-(('-I9VYA;"X*+DE0(")<9D)S=&%R=$-O;6UA;F1S7&90X
- M(@I4:&ES(')E<V]U<F-E('-P96-I9FEE<R!T:&4@8V]M;6%N9',@=&\@97AEX
- M8W5T92!A9G1E<B!T:&4@=VEN9&]W(&AA<PIB965N(&]P96YE9"!B=70@8F5FX
- M;W)E('1H92!C:&EL9"!P<F]C97-S(&AA<R!B965N(&9O<FME9"X*+DE0(")<X
- M9D)T97)M:6YA;%1Y<&5<9E B"E1H:7,@<F5S;W5R8V4@<W!E8VEF:65S('1HX
- M92!T>7!E(&]F('1E<FUI;F%L('1H92!0='D@5VED9V5T('-H;W5L9 IE;75LX
- M871E+@HN25 @(EQF0G1O<$-O;6UA;F1S7&90(@I4:&ES(')E<V]U<F-E('-PX
- M96-I9FEE<R!T:&4@8V]M;6%N9',@=&\@97AE8W5T92!W:&5N('1H92!0='D@X
- M5VED9V5T"F%S<V5R=',@=&AE(%1O<"!#86QL8F%C:RX*+DE0(")<9D)W86MEX
- M57!#;VUM86YD<UQF4"(*5&AI<R!R97-O=7)C92!S<&5C:69I97,@=&AE(&-OX
- M;6UA;F1S('1O(&5X96-U=&4@=VAE;B!T:&4@4'1Y(%=I9&=E= IA<W-E<G1SX
- M('1H92!786ME57 @0V%L;&)A8VLN"BYS<" Q"BY32"!#3TU-04Y$4PI#;VUMX
- M86YD<R!A<F4@82!S97)I97,@;V8@86-T:6]N<R!T:&%T(&%R92!T;R!B92!PX
- M97)F;W)M960@:6X@<F5S<&]N<V4*=&\@82!C97)T86EN(&5V96YT+B @5&AEX
- M(&-O;6UA;F1S(&UA;FEP=6QA=&4@=&AE('-T871E(&]F('1H92!P<F]G<F%MX
- M"F%N9"!S96YD(')E<75E<W1S('1O('1H92!M86YA9V5D(&-H:6QD('!R;V-EX
- M<W,N("!);B!T:&ES('=A>2P*7&9)6$-O;G1R;VQ<9E @:6YF;W)M<R!T:&4@X
- M8VAI;&0@<')O8V5S<R!O9B!T:&4@6"!E=F5N="!A;F0@:6YS=')U8W1S"FETX
- M(&]N(&AO=R!I="!S:&]U;&0@<F5S<&]N9"X@($$@7&9"0V]M;6%N9$QI<W1<X
- M9E @:7,@82!S97)I97,@;V8@;VYE"F]R(&UO<F4@8V]M;6%N9',@<V5P97)AX
- M=&5D(&)Y(&$@(EQF23M<9E B+@I!(&-O;6UA;F0@:7,@;V8@=&AE(&9O<FTZX
- M"BYS<" Q"BYC90I<9D)#;VUM86YD3F%M92A!<F=,:7-T*5QF4 HN<W @,0I7X
- M:&5R92!<9DE!<F=,:7-T7&90(&ES(&$@;&ES="!O9B!O;F4@;W(@;6]R92!<X
- M9DE!<F=U;65N='-<9E @<V5P97)A=&5D"F)Y(&$@(EQF22Q<9E B+B @06X@X
- M7&9)07)G=6UE;G1<9E @:7,@86X@:6YT96=E<BP@82 B)"(@9F]L;&]W960@X
- M8GD@86X*:6YT96=E<B!O<B!A(&-H87)A8W1E<B!S=')I;F<@96YC;&]S960@X
- M:6X@<VEN9VQE(&]R(&1O=6)L92!Q=6]T97,N"D%R9W5M96YT<R!O9B!T:&4@X
- M9F]R;2!<9DDD;EQF4"P@=VAE<F4@;B!I<R!A;B!I;G1E9V5R+"!R97!R97-EX
- M;G0@80IP;W-I=&EO;F%L(&%R9W5M96YT+B @5VAE;B!T:&4@8V]M;6%N9"!IX
- M<R!E>&5C=71E9"P@=&AE(&%R9W5M96YT(&ES"G-U8G-T:71U=&5D(&9O<B!TX
- M:&4@=F%L=64@<W1O<F5D(&EN('1H870@<&]S:71I;VYA;"!A<F=U;6YT+B @X
- M00IP;W-I=&EO;F%L(&%R9W5M96YT(&-A;B!S=&]R92!B;W1H(&EN=&5G97)SX
- M(&%N9"!C:&%R86-T97(@<W1R:6YG<RX@($EF"F%N(&%R9W5M96YT(&ES(&YOX
- M="!O9B!T:&4@<FEG:'0@='EP92P@=&AE(&-O;6UA;F0@=VEL;"!A=71O;6%TX
- M:6-A;&QY"F-O;G9E<G0@:70@=&\@=&AE(&-O<G)E8W0@='EP92P@979E;B!IX
- M9B!T:&ES(&-O;G9E<G-I;VX@9&]E<R!N;W0@;6%K90IS96YS92X@($9O<B!EX
- M>&%M<&QE+"!A;F0@:6YT96=E<B!W:6QL(&)E(&-O;G9E<G1E9"!T;R!I=',@X
- M8VAA<F%C=&5R"G-T<FEN9R!R97!R97-E;G1A=&EO;BX@($AO=V5V97(L(&ETX
- M(&UA>2!N;W0@86QW87ES(&)E('!O<W-I8FQE('1O"F-O;G9E<G0@82!C:&%RX
- M86-T97(@<W1R:6YG('1O(&%N(&EN=&5G97(N("!);B!T:&ES(&-A<V4L(&$@X
- M=F%L=64@;V8@, IW;W5L9"!B92!U<V5D+@I.;W)M86QL>2!A(&-O;6UA;F0@X
- M;&ES="!I<R!E>&5C=71E9"!L969T('1O(')I9VAT+B @268@86YY(&]F('1HX
- M90IC;VUM86YD<R!R971U<FYS(&%N(&5R<F]R('9A;'5E('1H96X@=&AE(')EX
- M;6%I;F1E<B!O9B!T:&4@8V]M;6%N9"!L:7-T"FES(&%B;W)T960N"BY,4 I4X
- M:&4@=F%L:60@8V]M;6%N9',@87)E.@HN25 @(EQF0D%B;W)T*"E<9E B"E1HX
- M:7,@8V]M;6%N9"!C875S97,@=&AE('!R;V=R86T@=&\@<W1O<"!E>&5C=71IX
- M;F<@82!C;VUM86YD(&QI<W0N"DEF('1H92!C=7)R96YT(&-O;6UA;F0@;&ESX
- M="!I<R!N97-T960@:6YS:61E(&%N;W1H97(@8V]M;6%N9"!L:7-T+ IS=6-HX
- M(&%S(&EN('1H92!<9D))9EQF4"!C;VUM86YD+"!T:&5N('1H92!P<F]G<F%MX
- M('=I;&P@<W1O<"!E>&5C=71I;F<*=&AE(&-U<G)E;G0@8V]M;6%N9"!L:7-TX
- M(&%N9"!R971U<FX@=&\@=&AE('!R979I;W5S(&]N92X*+DE0(")<9D)'971#X
- M:&EL9%!I9"A0;W-I=&EO;BE<9E B"E1H:7,@8V]M;6%N9"!G971S('1H92!PX
- M<F]C97-S(&ED(&YU;6)E<B!O9B!T:&4@8VAI;&0@<')O8V5S<R!A;F0*<W1OX
- M<F5S(&ET(&EN('1H92!P;W-I=&EO;F%L(&%R9W5M96YT('-P96-I9FEE9"!BX
- M>2!<9DE0;W-I=&EO;EQF4"X@($EF"G1H:7,@8V]M;6%N9"!I<R!E>&5C=71EX
- M9"!P<FEO<B!T;R!T:&4@8W)E871I;VX@;V8@=&AE(&-H:6QD('!R;V-E<W,*X
- M=&AE;B!A(# @:7,@<F5T=7)N960N"BY)4" B7&9"1V5T1')O<$AO<W0H4&]SX
- M:71I;VXI7&90(@I4:&ES(&-O;6UA;F0@;V)T86EN<R!T:&4@;F%M92!O9B!TX
- M:&4@:&]S="!T:&%T('1H92!L87-T(&1R86<@86YD(&1R;W *;V-C=7)E9"!FX
- M<F]M+B @7&9)4&]S:71I;VY<9E @:7,@=&AE(&YU;6)E<B!O9B!T:&4@<&]SX
- M:71I;VYA;"!A<F=U;65N= IT;R!S=&]R92!T:&4@:&]S="!N86UE(&EN+@HNX
- M25 @(EQF0D=E=$1R;W!.=6UB97(H5'EP92Q&:6QE*5QF4"(*5&AI<R!C;VUMX
- M86YD(&]B=&%I;G,@=&AE(&YU;6)E<B!O9B!F:6QE<R!T:&%T('=E<F4@9')OX
- M<'!E9"!D=7)I;F<@=&AE"FQA<W0@9')A9R!A;F0@9')O<"!E>&-H86YG92X@X
- M(%QF251Y<&5<9E @:7,@=&AE(&YU;6)E<B!O9B!T:&4*<&]S:71I;VYA;"!AX
- M<F=U;65N="!T;R!R971U<FX@=&AE(&YU;6)E<B!O9B!F:6QE('1Y<&5S(&1RX
- M;W!P960N"EQF249I;&5<9E @:7,@=&AE(&YU;6)E<B!O9B!T:&4@<&]S:71IX
- M;VYA;"!A<F=U;65N="!T;R!R971U<FX@=&AE"FYU;6)E<B!O9B!F:6QE(&YAX
- M;65S(&1R;W!P960N("!)9B!N;R!D<F]P(&AA<R!O8V-U<F5D('1H96X@82!VX
- M86QU92!O9@IZ97)O(&ES(')E='5N960N"BY)4" B7&9"1V5T1')O<$1I<F5CX
- M=&]R>2A0;W-I=&EO;BE<9E B"E1H:7,@8V]M;6%N9"!R971U<FYS('1H92!NX
- M86UE(&]F('1H92!D:7)E8W1O<GD@=&AE(&QA<W0@9')O<"!O8V-U<F5D"F9RX
- M;VTN("!)9B!N;R!D:7)E8W1O<GD@=V%S('-P96-I9FEE9"!T:&5N(&$@3E5,X
- M3"!S=')I;F<@:7,@<F5T=7)N960N"EQF25!O<VET:6]N7&90(&ES('1H92!NX
- M=6UB97(@;V8@=&AE('!O<VET:6]N86P@87)G=6UE;G0@=&\@<F5T=7)N('1HX
- M90IR97-U;'0@:6XN"BY)4" B7&9"1V5T1')O<%1Y<&4H5VAI8V@L4&]S:71IX
- M;VXI7&90(@I4:&ES(&-O;6UA;F0@<F5T=7)N<R!T:&4@='EP92!O9B!A('-PX
- M96-I9FEC(&9I;&4@=&AA="!W87,@9')O<'!E9"X*7&9)5VAI8VA<9E @:7,@X
- M=&AE(&YU;6)E<B!O9B!T:&4@9')O<'!E9"!F:6QE('=H:6-H(&ES('1O(&)EX
- M(')E='5R;F5D+@I<9DE0;W-I=&EO;EQF4"!I<R!T:&4@;G5M8F5R(&]F('1HX
- M92!P;W-I=&EO;F%L(&%R9W5M96YT('1O('-T;W)E('1H90IF:6QE('1Y<&4@X
- M:6XN"BY)4" B7&9"1V5T1')O<$9I;&4H5VAI8V@L4&]S:71I;VXI7&90(@I4X
- M:&ES(&-O;6UA;F0@<F5T=7)N<R!T:&4@;F%M92!O9B!A('-P96-I9FEC(&9IX
- M;&4@=&AA="!W87,@9')O<'!E9"!O;@IT:&4@=VEN9&]W+B @7&9)5VAI8VA<X
- M9E @:7,@=&AE(&YU;6)E<B!O9B!T:&4@9')O<'!E9"!F:6QE('=H:6-H(&ESX
- M('1O"F)E(')E='5R;F5D+B @7&9)4&]S:71I;VY<9E @:7,@=&AE(&YU;6)EX
- M<B!O9B!T:&4@<&]S:71I;VYA;"!A<F=U;65N= IT;R!S=&]R92!T:&4@9FELX
- M92!T>7!E(&EN+@HN25 @(EQF0D=E=$5N=BA.86UE+%!O<VET:6]N*5QF4"(*X
- M5&AI<R!C;VUM86YD(&]B=&%I;B!T:&4@8W5R<F5N="!V86QU92!O9B!A;B!EX
- M;G9I<F]N;65N="!V87)I86)L92X*7&9)3F%M95QF4"!I<R!T:&4@;F%M92!OX
- M9B!T:&4@=F%R:6%B;&4@=&\@;V)T86EN+B @7&9)4&]S:71I;VY<9E @:7,*X
- M=&AE(&YU;6)E<B!O9B!T:&4@<&]S:71I;VYA;"!A<F=U;65N="!T;R!S=&]RX
- M92!T:&4@<F5S=6QT(&EN+@HN25 @(EQF0D=E=%!I9"A0;W-I=&EO;BE<9E BX
- M"E1H:7,@8V]M;6%N9"!G971S('1H92!P<F]C97-S(&ED(&]F('1H92!P<F]GX
- M<F%M(&%N9"!S=&]R97,@:70@:6X@=&AE"G!O<VET:6]N86P@87)G=6UE;G0@X
- M<W!E8VEF:65D(&)Y(%QF25!O<VET:6]N7&90+@HN25 @(EQF0D=E=%=I;F1OX
- M=U-I>F4H4F]W+$-O;"E<9E B"E1H:7,@8V]M;6%N9"!R971U<FYS('1H92!SX
- M:7IE(&]F('1H92!W:6YD;W<@:6X@=&5R;7,@;V8@<F]W<R!A;F0*8V]L=6UNX
- M<RX@(%QF25)O=UQF4"!I<R!T:&4@;G5M8F5R(&]F('1H92!P;W-I=&EO;F%LX
- M(&%R9W5M96YT('1O('-T;W)E"G1H92!N=6UB97(@;V8@<F]W<R!I;BX@(%QFX
- M24-O;%QF4"!I<R!T:&4@;G5M8F5R(&]F('1H92!P;W-I=&EO;F%L"F%R9W5MX
- M96YT('1O('-T;W)E('1H92!N=6UB97(@;V8@8V]L=6UN<R!I;BX*+DE0(")<X
- M9D))9BA/<&5R86YD,2Q#;VYD:71I;VYA;$5X<')E<W-I;VXL3W!E<F%N9#(LX
- M5')U94-O;6UA;F1S+$9A;'-E0V]M;6%N9',I7&90(@I4:&ES(&-O;6UA;F0@X
- M:6UP;&5M96YT<R!A;B!I9B!E>'!R97-S:6]N+B @7&9)3W!E<F%N9#%<9E @X
- M86YD"EQF24]P97)A;F0R7&90(&%R92!T:&4@='=O('9A<FEA8FQE<R!T;R!PX
- M97)F;W)M('1H92!C;VYD:71I;VYA; IO<&5R871I;VX@;VXN("!<9DE#;VYDX
- M:71I;VYA;$5X<')E<W-I;VY<9E @:7,@82!S=')I;F<@<F5P<F5S96YT:6YGX
- M"G1H92!O<&5R871I;VX@=&\@<&5R9F]R;2X@(%9A;&ED(&5X<')E<W-I;VYSX
- M(&%R93H@7&9"/3U<9E L(%QF0B$]7&90+ I<9D(^/5QF4"P@7&9"/#U<9E LX
- M(%QF0CQ<9E L(%QF0CY<9E L(%QF0B5<9E @86YD(%QF0B$E7&90+B @36]SX
- M= IE>'!R97-S:6]N(&-O;W)E<V]N9"!T;R!T:&5I<B!<9DE#7&90(&5Q=6EVX
- M86QE;G0@=VET:"!T:&4@97AC97!T:6]N(&]F"EQF0B5<9E @86YD(%QF0B$EX
- M7&90('=H:6-H('1E<W0@:68@='=O('-T<FEN9W,@87)E(&5Q=6%L(&]R(&YOX
- M="!E<75A; IT;R!E86-H(&]T:&5R(')E<W!E8W1I=F5L>2X@(%QF251R=65#X
- M;VUM86YD<UQF4"!I<R!A(&-O;6UA;F0@;&ES="!T;PIC;VUP:6QE(&%N9"!EX
- M>&5C=71E(&EF('1H92!B;V]L96%N(&5X<')E<W-I;VX@979A;'5T97,@=&\@X
- M=')U92X*3W1H97)W:7-E+"!T:&4@8V]M;6%N9"!L:7-T(&=I=F5N(&)Y(%QFX
- M249A;'-E0V]M;6%N9'-<9E @87)E(&-O;7!I;&5D"F%N9"!E>&5C=71E9"X@X
- M($]N8V4@=&AE('!R;W!E<B!C;VUM86YD(&QI<W0@:&%S(&)E96X@97AE8W5TX
- M960L(&-O;G1R;VP*<F5T=7)N<R!T;R!T:&4@8W5R<F5N=&QY(&5X96-U=&ENX
- M9R!C;VUM86YD(&QI<W0N"BY)4" B7&9"36%T:"A/<&5R86YD,2Q/<&5R871IX
- M;VXL3W!E<F%N9#(L4F5S=6QT*5QF4"(*5&AI<R!C;VUM86YD('!E<F9O<FUSX
- M(&$@;6%T:&5M871I8V%L(&]P97)A=&EO;BX@(%QF24]P97)A;F0Q7&90(&%NX
- M9 I<9DE/<&5R86YD,EQF4"!A<F4@=&AE('1W;R!O<&5R86YD<R!U<&]N('=HX
- M:6-H('1H92!M871H(&9U;F-T:6]N(&ES('1O"F)E('!E<F9O<FUE9"X@(%QFX
- M24]P97)A=&EO;EQF4"!I<R!A(&-H87)A8W1E<B!S=')I;F<@<F5P<F5S96YTX
- M:6YG('1H90IM871H96UA=&EC86P@;W!E<F%T:6]N('1O(&)E('!E<F9O<FUEX
- M9"X@(%9A;&ED(&]P97)A=&EO;G,@87)E.@I<9D(K7&90+"!<9D(M7&90+"!<X
- M9D(J7&90+"!<9D(O7&90+"!<9D(E7&90+"!<9D(F7&90(&%N9"!<9D)\7&90X
- M+B @06QL"F]P97)A=&EO;G,@:&%V92!T:&4@<V%M92!M96%N:6YG(&%S('1HX
- M96ER($,@;&%N9W5A9V4@97%U:79A;&5N="X*7&9)4F5S=6QT7&90(&ES('1HX
- M92!N=6UB97(@;V8@=&AE('!O<VET:6]N86P@87)G=6UE;G0@<V\@<W1O<F4@X
- M=&AE"G)E<W5L="!O9B!T:&4@;W!E<F%T:6]N(&EN+@HN25 @(EQF0E!R;VUPX
- M="A4:71L92Q1=65S=&EO;BQ997,L3F\L0V%N8V5L+%EE<T-O;6UA;F1S+$YOX
- M0V]M;6%N9',L0V%N8V5L0V]M;6%N9',I7&90(@I4:&ES(&-O;6UA;F0@<'5TX
- M<R!U<"!A(&1I86QO9R!B;W@@=&\@86QL;W<@=&AE('5S97(@=&\@<V5L96-TX
- M(&%N"F%C=&EO;B!T;R!T86ME+B @7&9)5&ET;&5<9E @:7,@=&AE('-T<FENX
- M9R!T;R!P=70@:6X@=&AE('1I=&QE(&]F('1H90IP<F]M<'0@9&EA;&]G+B @X
- M7&9)475E<W1I;VY<9E @:7,@=&5X="!T;R!P=70@:6X@=&AE(&1I86QO9RX*X
- M7&9)665S7&90(&ES('1H92!S=')I;F<@=&\@<'5T(&EN('1H92!A9F9I<FUAX
- M=&EV92!B=71T;VXN("!<9DE.;UQF4"!I<PIT:&4@8VAA<F%C=&5R('-T<FENX
- M9R!I<R!P=70@:6X@=&AE(&YE9V%T:79E(&)U='1O;B!W:&EL92!<9DE#86YCX
- M96Q<9E *:7,@=&AE('1E>'0@=&\@<&QA8V4@:6X@=&AE(&-A;F-E;"!B=71TX
- M;VXN("!<9DE997-#;VUM86YD<UQF4"!I<R!A"F-O;6UA;F0@;&ES="!T:&%TX
- M(&ES(&-O;7!I;&5D(&%N9"!E>&5C=71E9"!W:&5N('1H92!U<V5R('!R97-SX
- M97,@=&AE"F%F9FER;6%T:79E(&)U='1O;BX@(%-I;6EL87)L>2P@=&AE(%QFX
- M24YO0V]M;6%N9'-<9E @86YD"EQF24-A;F-E;$-O;6UA;F1S7&90(&%R92!TX
- M:&4@8V]M;6%N9"!L:7-T<R!T;R!B92!E>&5C=71E9"!W:&5N('1H90IU<V5RX
- M(&%C=&EV871E<R!T:&4@;F5G871I=F4@;W(@8V%N8V5L(&)U='1O;G,N("!.X
- M;W1E('1H870@=&AE"EQF0E!R;VUP=%QF4"!C;VUM86YD(&1O97,@;F]T('=AX
- M:70@9F]R('1H92!U<V5R('1O('-E;&5C="!O;F4@;V8@=&AE"F)U='1O;G,@X
- M:6X@=&AE(&1I86QO9RX@(%)A=&AE<BP@=&AE(')E;6%I;FEN9R!F=6YC=&EOX
- M;G,@:6X@=&AE(&-O;6UA;F0*;&ES="!A<F4@97AE8W5T960L('5S=6%L;'D@X
- M<')I;W(@=&\@=&AE('!R;VUP="!D:6%L;V<@8F5I;F<@<F5A;&EZ960N"BY)X
- M4" B7&9"475I="A3=&%T=7,I7&90(@I4:&ES(&-O;6UA;F0@8V%U<V4@=&AEX
- M('!R;V=R86T@=&\@97AI="X@(%QF25-T871U<UQF4"!I<R!T:&4@:6YT96=EX
- M<@IV86QU92!T;R!P87-S('1O('1H92!<9DEE>&ET*"E<9E @9G5N8W1I;VXNX
- M"BY)4" B7&9"4F5A<"AN*5QF4"(*5&AI<R!C;VUM86YD(&-A=7-E<R!T:&4@X
- M<')O9W)A;2!A8W%U:7)E('1H92!E>&ET('-T871U<R!O9B!O;F4@;V8@:71SX
- M"F-H:6QD<F5N+B @7&9);EQF4"!I<R!T:&4@;G5M8F5R(&]F('1H92!P;W-IX
- M=&EO;F%L(&%R9W5M96YT('=H97)E('1H90IP<F]C97-S(&ED(&]F('1H92!RX
- M96%P960@8VAI;&0@<VAO=6QD(&)E('-T;W)E9"X@($EF(&YO(&-H:6QD('!RX
- M;V-E<W,*=V%S(&9O=6YD('1H96X@82!V86QU92!O9B P(&ES('-T;W)E9"X*X
- M+DE0(")<9D)296UO=F54:6UE3W5T*%1I;65/=71)9"E<9E B"E1H:7,@8V]MX
- M;6%N9"!R96UO=F5S(&$@<')E=FEO=7-L>2!S=&%R=&5D('1I;64@;W5T+B @X
- M7&9)5&EM94]U=$ED7&90"FES('1H92!V86QU92!R971U<FYE9"!F<F]M('1HX
- M92!<9D)4:6UE3W5T7&90(&-O;6UA;F0N"BY)4" B7&9"4V%V95-E<W-I;VXHX
- M*5QF4"(*5&AI<R!C;VUM86YD(&-A=7-E<R!T:&4@<')O9W)A;2!T;R!G96YEX
- M<F%T92!A('-E<W-I;VX@9FEL92!I;B!W:&EC: IA;&P@=&AE(&-U<G)E;G0@X
- M<W1A=&4@:6YF;W)M871I;VX@:7,@<V%V960N("!4:&ES(&9I;&4@8V%N('1HX
- M96X@8F4*=7-E9"!T;R!R97-T87)T('1H92!P<F]G<F%M(&%T(&$@;&%T97(@X
- M9&%T92!W:71H('1H92!<9DDM<V5S<VEO;EQF4"!O<'1I;VXN"BY)4" B7&9"X
- M4V5T16YV*$YA;64L5F%L=64I7&90(@I4:&ES(&-O;6UA;F0@<V5T<R!A;B!EX
- M;G9I<F]N;65N="!V87)I86)L92!I;B!T:&4@<')O9W)A;2X@(%QF24YA;65<X
- M9E *:7,@=&AE(&YA;64@;V8@=&AE('9A<FEA8FQE('1O('-E="X@(%QF259AX
- M;'5E7&90(&ES('1H92!V86QU92!T;R!S970*:70@=&\N"BY)4" B7&9"4VEGX
- M;F%L*&XI7&90(@I4:&ES(&-O;6UA;F1S('-E;F1S(&$@<VEG;F%L('1O('1HX
- M92!P<F]C97-S(&=R;W5P('=H:6-H(&ES(&%S<V]C:6%T960*=VET:"!T:&4@X
- M<VQA=F4@<VED92!O9B!T:&4@<'1Y+B @7&9);EQF4"!I<R!T:&4@;G5M8F5RX
- M(&]F('1H92!S:6=N86P*=&\@<V5N9"X@($EF('1H92!N=6UB97(@:7,@:6YVX
- M86QI9"!T:&5N('1H92!C;VUM86YD(')E='5R;G,@86X@97)R;W(N"BY)4" BX
- M7&9"4VQE97 H;BE<9E B"E1H:7,@8V]M;6%N9"!C875S97,@=&AE('!R;V=RX
- M86T@=&\@<W5S<&5N9"!E>&5C=71I;VX@9F]R(&$@8V5R=&%I;@IA;6]U;G0@X
- M;V8@=&EM92X@(%QF26Y<9E @:7,@=&AE(&YU;6)E<B!O9B!S96-O;F1S('1OX
- M('-L965P(&9O<BX*1'5R:6YG('1H:7,@<VQE97 @:6YT97)V86PL('1H92!PX
- M<F]G<F%M(&1O97,@;F]T(')E<W!O;F0@=&\@86YY(%@*979E;G1S('-O(&ETX
- M(&ES(&YO="!A(&=O;V0@:61E82!T;R!S<&5C:69Y('1O;R!L87)G92!O9B!DX
- M=7)A=&EO;BX*+DE0(")<9D)3=&]R95-T<FEN9RA3=')I;F<L4&]S:71I;VXIX
- M7&90(@I4:&ES(&-O;6UA;F0@<W1O<F5S(&$@=F%L=64@:6YT;R!A('!O<VETX
- M:6]N86P@87)G=6UE;G0N("!<9DE3=')I;F=<9E *:7,@=&AE('9A;'5E('1OX
- M('-T;W)E(&%N9"!<9DE0;W-I=&EO;EQF4"!I<R!T:&4@;G5M8F5R(&]F('1HX
- M90IP;W-I=&EO;F%L(&%R9W5M96YT('1O('-T;W)E('1H92!S=')I;F<@:6XNX
- M"BY)4" B7&9"4W1R:6YG0V%T*%-T<FEN9S$L4W1R:6YG,BQ297-U;'0I7&90X
- M(@I4:&ES(&-O;6UA;F1S(&-O;F-A=&EN871E<R!T=V\@<W1R:6YG<R!T;V=EX
- M=&AE<B!T;R!F;W)M(&$@=&AI<F0*<W1R:6YG+B @7&9)4W1R:6YG,5QF4"!IX
- M<R!T:&4@9FER<W0@<W1R:6YG(&%N9"!<9DE3=')I;F<R7&90(&ES('1H90ISX
- M96-O;F0@<W1R:6YG+B @7&9)4F5S=6QT7&90(&ES('1H92!N=6UB97(@;V8@X
- M=&AE('!O<VET:6]N86P@87)G=6UE;G0*=&\@<W1O<F4@=&AE(')E<W5L="!IX
- M;BX*+DE0(")<9D)4:6UE3W5T*$1U<F%T:6]N+%!O<VET:6]N+$-O;6UA;F1SX
- M*5QF4"(*5&AI<R!C;VUM86YD(&EN<W1A;&QS(&$@=&EM96]U="!C86QL8F%CX
- M:R!I;B!T:&4@<')O9W)A;2X*7&9)1'5R871I;VY<9E @:7,@=&AE(&%M;W5NX
- M="!O9B!T:6UE+"!I;B!M:6QL:7-E8V]N9',L('1H870@87)E"F%L;&]W960@X
- M=&\@96QL87!S92!B969O<F4@=&AE('1I;65O=70@:7,@=')I9V=E<F5D+B @X
- M7&9)4&]S=&EO;EQF4"!I<PIT:&4@;G5M8F5R(&]F('1H92!P;W-I=&EO;F%LX
- M(&%R9W5M96YT('=H97)E('1H92!T:6UE;W5T(&ED(&ES('-T;W)E9"X*5&AIX
- M<R!I<R!N965D960@<V\@=&AA="!T:&4@=&EM96]U="!C86X@8F4@<F5M;W9EX
- M9"!A="!A(&QA=&5R('1I;64N"EQF24-O;6UA;F1S7&90(&ES('1H92!C;VUMX
- M86YD(&QI<W0@=&\@8V]M<&EL92!A;F0@97AE8W5T92!W:&5N('1H90IT:6UEX
- M;W5T(&5X<&ER97,N"BY)4" B7&9"5V%R;FEN9RA497AT*5QF4"(*5&AI<R!CX
- M;VUM86YD(&-A=7-E<R!A('=A<FYI;F<@9&EA;&]G('1O('!U="!U<"!O;B!TX
- M:&4@<V-R965N+@I<9DE497AT7&90(&ES('1H92!M97-S86=E('1O(&1I<W!LX
- M87D@:6X@=&AE('=A<FYI;F<@9&EA;&]G+B @5&AE"F1I86QO9R!W:6QL('-TX
- M87D@=7 @=6YT:6P@9&ES;6ES<V5D(&)Y('1H92!U<V5R+B @3F]T92!T:&%TX
- M('1H90IC;VUM86YD(&QI<W0@8V]N=&EN=65S('1O(&5X96-U=&4@869T97(@X
- M=&AI<R!F=6YC=&EO;B!H87,@8V]M<&QE=&5D+@I4:&%T(&ES('1O('-A>2P@X
- M=&AE('!R;V=R86T@9&]E<R!N;W0@=V%I="!F;W(@=&AE('5S97(@=&\@9&ESX
- M;6ES<R!T:&4*=V%R;FEN9R!D:6%L;V<@8F5F;W)E(&-O;G1I;G5I;F<@=&AEX
- M(&-O;6UA;F0@;&ES="X*+DE0(")<9D)7<FET92A3=')I;F<Q+%-T<FEN9S(LX
- M+BXN*5QF4"(*5&AI<R!C;VUM86YD('-E;F1S('1H92!A<F=U;65N="!S=')IX
- M;F=S('1O('1H92!C:&EL9"!P<F]C97-S(&%S(&EF"G1H97D@=V5R92!T>7!EX
- M9"!I;B!A="!T:&4@:V5Y8F]A<F0N("!!;GD@;G5M8F5R(&]F(&%R9W5M96YTX
- M<R!C86X@8F4*<W!E8VEF:65D+@HN<W @,0HN4T@@(E-%12!!3%-/(@I<9D)HX
- M<'1E<FTH,2DL('AT97)M*#$I+"!0='DH,U@I+"!'96Y497)M16TH,W@I+" *X
- .1V5N5&5R;2@S6"E<9E!M X
- X
- end
- @eof
- set `wc -lwc <xcontrol/XControl.man`
- if test $1$2$3 != 409279618959
- then
- echo ERROR: wc results of xcontrol/XControl.man are $* should be 409 2796 18959
- fi
-
- chmod 644 xcontrol/XControl.man
-
- echo x - xcontrol/XVi.ad
- cat >xcontrol/XVi.ad <<'@EOF'
- *Pty*literalMode: False
- *Pty*autoLineWrap: True
- *Pty*saveLines: 48
- *Pty*destructiveTab: False
- *Pty*ttyMode: rows 24 columns 80 \
- 9600 susp ^z dsusp ^z intr ^c quit ^\\ erase ^H kill ^u swtch ^@ eof ^d \
- eol ^@ stop ^s start ^q -parenb -parodd cs8 -cstopb hupcl cread -clocal \
- -loblk -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr \
- icrnl -iuclc ixon -ixany ixoff -ienqak isig icanon iexten -xcase echo echoe \
- echok -echonl -noflsh opost -olcuc onlcr -ocrnl -onocr -onlret -ofill \
- -ofdel -tostop tab3
- *Pty*ignoreNull: True
- *hpterm*parseFile: PARSEDIR/hpterm.par
- *hpterm*fieldAttributes: True
- *hpterm*saveScrollRegion: True
- *hpterm*penColors: Default:Default:red:Default:green:Default:yellow:\
- Default:blue:Default:magenta:Default:cyan:Default:black:yellow"
- *xterm*parseFile: PARSEDIR/xterm.par
- *xterm*fieldAttributes: False
- *xterm*saveScrollRegion: True
- *xterm*scrollOnOutput: True
- *xterm*numberMapTables: 4
- *xterm*cursorFloats: False
- *xterm*scrollDownClear: True
- *xterm*fullScroll: False
- *xterm*cursorKeyScrollRegion: True
- *xterm*eolStick: True
- *xterm*translations: #override\n\
- <ButtonPress>:invokeTranslation(ButtonTranslator)\n\
- <ButtonRelease>:invokeTranslation(ButtonReleaseTranslator)\n
- !
- *childCommand: /usr/bin/vi
- *closeWindowCommands: Prompt("Closing...","Save File Before Closing Window?"\
- ,"Yes^JSave File","No^JDon't Save File","Cancel Close",\
- "TimeOut(100000,11,\\"Signal(9);Quit(0)\\");Signal(2);\
- Write(\\":w!^J\\",\\":q^J\\")",\
- "TimeOut(100000,11,\\"Signal(9);Quit(0)\\");Signal(2);Write(\\":q!^J\\")",\
- "Abort()")
- *remoteDropsAllowed: True
- !*dropCommands: GetDropNumber(1,2);GetDropHost(3);GetDropDirectory(4);\
- !GetDropType(1,5);GetDropFile(1,6);\
- !Write("T=",$1," F=",$2," Host ",$3," Dir ",$4," Type ",$5," Name ",$6);
- *dropZoneType: FileEdit
- *sigChildCommands: Reap(1);GetChildPid(2);If($1,"==",$2,"Quit(0)",\
- "Abort()")
- *childForkCommands: GetTerminalType(2);SetEnv("TERM",$2);
- *saveSessionCommands: Signal(2);Write(":w^J");SaveSession();
- *dropCommands: GetDropNumber(1,2);GetDropFile(1,3);\
- GetDropDirectory(4);StringCat($4,$3,3);\
- StoreString("Signal(2);Write(\\":e \\",$3,\\"^J\\");",5);\
- StoreString("Signal(2);Write(\\":w!^J\\");",6);\
- StringCat($6,$5,7);\
- StoreString("Prompt(\\"New File\\",\\"Save Old File?\\",\\"Yes^JSave Files\\",\
- \\"No^JDon't Save File\\",\\"Cancel\\",$7,$5,\\"Abort()\\");",8);\
- If($2,"!=",1,"Warning(\\"Too many files dropped\\")",$8)
- *startupCommands: GetWindowSize(1,2);SetEnv("LINES",$1);\
- SetEnv("COLUMNS",$2);
- @EOF
- set `wc -lwc <xcontrol/XVi.ad`
- if test $1$2$3 != 571822493
- then
- echo ERROR: wc results of xcontrol/XVi.ad are $* should be 57 182 2493
- fi
-
- chmod 644 xcontrol/XVi.ad
-
- echo x - MANIFEST
- cat >MANIFEST <<'@EOF'
- File Name Kit Number
- -------------- ----------
- GenTerm/GenTerm.c 1
- GenTerm/GenTerm.h 1
- GenTerm/GenTerm.man 2
- GenTerm/GenTermEm.c 2
- GenTerm/GenTermEm.h 1
- GenTerm/GenTermEm.man 2
- GenTerm/GenTermEmP.h 1
- GenTerm/GenTermP.h 1
- GenTerm/LoadParser.c 2
- GenTerm/Makefile 2
- GenTerm/Parse.c 3
- GenTerm/Parser.h 2
- GenTerm/Pty.c 3
- GenTerm/Pty.h 2
- GenTerm/Pty.man 3
- GenTerm/PtyP.h 2
- GenTerm/TAGS 3
- GenTerm/Xmu.h 2
- GenTerm/ctest.c 3
- GenTerm/hpterm.par 3
- GenTerm/test.c 3
- GenTerm/translators 4
- GenTerm/xterm.par 4
- MANIFEST 4
- Makefile 1
- README 1
- xcontrol/Command.c 4
- xcontrol/Makefile 2
- xcontrol/ParseString.c 3
- xcontrol/TAGS 3
- xcontrol/XControl.ad 3
- xcontrol/XControl.c 4
- xcontrol/XControl.h 4
- xcontrol/XControl.man 4
- xcontrol/XVi.ad 4
- @EOF
- set `wc -lwc <MANIFEST`
- if test $1$2$3 != 37761159
- then
- echo ERROR: wc results of MANIFEST are $* should be 37 76 1159
- fi
-
- chmod 644 MANIFEST
-
- rm -f /tmp/unpack$$
- exit 0
-