gerber@sushi.Solbourne.COM (Andrew Gerber) (12/19/90)
Submitted-by: gerber@sushi.Solbourne.COM (Andrew Gerber) Posting-number: Volume 10, Issue 98 Archive-name: xhpgl/part02 ---- Cut Here and unpack ---- #!/bin/sh # shar: Shell Archiver (v1.22) # # Run the following text with /bin/sh to create: # parse.c # pc.xw # shuttle.uuencoded # xhpgl.1 # if test -f parse.c; then echo "File parse.c exists"; else echo "x - extracting parse.c (Text)" sed 's/^X//' << 'SHAR_EOF' > parse.c && X/* X * parse.c -- This is a hand-coded HPGL parser, to see if I can get X * somewhat better performance than the YACC parser gives X * me. X * X * Author : Dieter Muller X * Ported to X11 & Line Type fixes: Andy Gerber X * Created : Wed Oct 31 21:13:38 1990 X */ X X/* Header Files */ X X#include <stdio.h> X#include <math.h> X#include <varargs.h> X#include <sys/param.h> X#include <X11/X.h> X#include <X11/Xlib.h> X#include <math.h> X# include "y.tab.h" /* as generated by the original grammar */ X X/* X windows variables. */ Xextern XColor pen[]; Xextern Window main_window; Xextern Font text_font; Xextern XFontStruct *font_info; Xextern short font_offset; Xextern GC gc; Xextern Display *dpy; Xextern int span_count; Xextern initialize_plotter(); Xextern int dont_scale; /* should we scale coordinates? Not done if zooming */ Xextern int minWidth,minHeight; /* size of X window for plotting */ X/* Macro Definitions */ X X/* Variable Definitions */ X XYYSTYPE yylval; Xdouble xScale = 1.0; Xdouble yScale = 1.0; Xstatic int pushed_token = -1; X X/* Function Declarations */ X Xvoid unget_token (); Xint next_token (); Xvoid eat_to_semi (); Xvoid ignored (); Xvoid error (); Xint yywrap (); Xvoid draw_line (); Xvoid draw_rectangle(); Xvoid draw_text (); Xvoid scale_coord (); Xint get_coord_pair (); Xvoid coord_list (); Xvoid yyparse (); Xvoid line_type_change(); X X/* pattern definitions for drawing dashed lines */ X/* default |________| */ X/* line 0 | | */ X/* line 1 |_ | */ X/* line 2 |____ | */ X/* line 3 |______ | */ X/* line 4 |______ _| */ X/* line 5 |_____ __| */ X/* line 6 |____ _ _| */ X Xstatic unsigned char line_types[][6] = { X {1, 15}, X {1, 15}, X {8, 8}, X {12, 4}, X {13, 1, 1, 1}, X {12, 1, 2, 1}, X {9, 1, 2, 1, 2, 1} X}; X Xstatic int line_type_elements[] = {2, 2, 2, 2, 4, 4, 6}; X X X/********************************************************************** X * yyparse () --- Read HPGL statements, drawing the results as we X * go. X */ X Xvoid yyparse () X{ X extern FILE * yyin; X extern YYSTYPE yylval; X extern char yytext []; X extern int absolute; X extern int pen_down; X extern int is_color; X extern int cur_pen; X extern int rectangle; X X int token; X X while ((token = next_token ()) > 0) X { X/* getc(stdin); X printf("%s", yytext); X*/ X switch (token) X { X case LT: X line_type_change(); X break; X case LB: X draw_text (yylval.sb); X break; X case PA: X absolute = 1; X coord_list (); X break; X case PR: X absolute = 0; X coord_list (); X break; X case PU: X pen_down = 0; X coord_list (); X break; X case PD: X pen_down = 1; X coord_list (); X break; X case EA: X /* draw a rectangle */ X rectangle = 1; X coord_list(); X rectangle = 0; X break; X case RA: X /* This is a filled rectangle, not supported */ X rectangle = 1; X coord_list(); X rectangle = 0; X break; X case SP: X if (is_color) X { X cur_pen = pen[yylval.i].pixel; X XSetForeground(dpy, gc, cur_pen); X } X break; X case SC: X scale_coord (); X break; X case RESET: X initialize_plotter (); X break; X case SEMICOLON: X break; X case EAT_TO_SEMI: X eat_to_semi(); X break; X default: X error ("Unexpected token %d, symbol `%s'\n", token, yytext); X /*NOTREACHED*/ X } X } X X return; X} /* end of yyparse () */ X X/********************************************************************** X * line_type_change() --- change line type X * X * X * Handle getting a LT changes, sees if line type was specified X */ X Xvoid line_type_change() X{ X int token; X int new_lt; X int result; X XGCValues gc_vals; X new_lt = -1; X result = 0; X token = next_token (); X if (token == DIGIT) X { X new_lt = yylval.i; X token = next_token (token); X X if (token != SEMICOLON) X { X error ("Unexpected token %d, symbol `%s'\n", token, yytext); X eat_to_semi(); X } X result = 1; X } X else if (token == SEMICOLON) X { X new_lt = -99; X result = 1; X } X X if (new_lt == -99) X { X gc_vals.line_style = LineSolid; X XChangeGC(dpy, gc, GCLineStyle, &gc_vals); X } X else if (new_lt >= 0 && new_lt <= 6) X { X gc_vals.line_style = LineOnOffDash; X XChangeGC(dpy, gc, GCLineStyle, &gc_vals); X XSetDashes(dpy, gc, 0, line_types[new_lt], line_type_elements[new_lt]); X } X X if (!result) X { X unget_token (token); X eat_to_semi (); X } X X} X X/********************************************************************** X * coord_list () --- Handle parsing an optional list of X * coordinates. X * X * A list of coordinates looks like INT, INT [, INT, INT]. Basically, X * coordinate pairs separated by commas. X */ X Xvoid coord_list () X{ X int token; X X while (get_coord_pair ()) X { X token = next_token (); X if (token != COMMA) X { X unget_token (token); X break; X } X } X X return; X} /* end of coord_list () */ X X/********************************************************************** X * get_coord_pair () --- Reads a pair of coordinates of the form X * INTEGER COMMA INTEGER X * X * Returns: X * X * SUCCESS --- True, if we got a valid pair X * FAILURE --- False, if something's wrong. We also eat X * through to the next semi-colon, if any. X */ X Xint get_coord_pair () X{ X extern int last_x; X extern int last_y; X extern int x; X extern int y; X extern YYSTYPE yylval; X extern int absolute; X extern int pen_down; X extern double xMin; X extern double xMax; X extern double yMin; X extern double yMax; X extern double xScale; X extern double yScale; X extern int minWidth; X extern int minHeight; X extern int rectangle; X X int token; X int result; X double scratch_x; X double scratch_y; X X result = 0; X token = next_token (); X if (token == DIGIT || token == NUMBER) X { X if (token == DIGIT) scratch_x = yylval.i; X else scratch_x = yylval.f; X X token = next_token (token); X if (token == COMMA) X { X token = next_token (); X if (token == DIGIT || token == NUMBER) X { X if (token == DIGIT) scratch_y = yylval.i; X else scratch_y = yylval.f; X X last_x = x; X last_y = y; X X if (absolute) X { X x = (scratch_x - xMin) * xScale; X y = (scratch_y - yMin) * yScale; X } X else X { X x = x + (scratch_x - xMin) * xScale; X y = minHeight - y + (scratch_y - yMin) * yScale; X } X X y = minHeight - y; X X if (pen_down && !rectangle) X draw_line (); X else if (rectangle) X draw_rectangle(); X X result = 1; X } X } X } X X if (!result) X { X unget_token (token); X eat_to_semi (); X } X X return (result); X} /* end of get_coord_pair () */ X X/********************************************************************** X * scale_coord () --- set up new user coordinate boundaries X * X * We need two pairs of comma-separated coordinates, a total of four X * INTEGERs and three COMMAs. X */ X Xvoid scale_coord () X{ X extern double xMin; X extern double xMax; X extern double yMin; X extern double yMax; X extern double xScale; X extern double yScale; X extern int minWidth; X extern int minHeight; X X double scratch [4]; X int count; X int token; X int done; X int result; X X result = 0; X done = 0; X count = 0; X while (!done) X { X token = next_token (); X if (token == DIGIT || token == NUMBER) X { X if (token == DIGIT) scratch [count++] = yylval.i; X else scratch [count++] = yylval.f; X X if (count < 4) X { X token = next_token (); X if (token != COMMA) /* die with !result */ X done = 1; X } X else X { X if (!dont_scale) X { X xMin = scratch [0]; X xMax = scratch [1]; X yMin = scratch [2]; X yMax = scratch [3]; X X xScale = minWidth / (xMax - xMin); X yScale = minHeight / (yMax - yMin); X X /* Make sure x is in proportion to y */ X X if (yScale < xScale) X { X xMax = xMin + minWidth/yScale; X xScale = minWidth / (xMax - xMin); X yScale = minHeight / (yMax - yMin); X } X else X { X yMax = yMin + minHeight/xScale; X xScale = minWidth / (xMax - xMin); X yScale = minHeight / (yMax - yMin); X } X } X X result = 1; X done = 1; X } X } X } X X if (!result) X { X unget_token (token); X eat_to_semi (); X } X X return; X} /* end of scale_coord () */ X X/********************************************************************** X * draw_text () --- Display some text at the current point X * X * Arguments: X * X * text -i- What to draw. X */ X Xvoid draw_text (txt) Xchar * txt; X{ X extern int x; X extern int y; X XTextItem text; X X text.nchars = strlen(txt); X text.delta = 0; X text.font = text_font; X text.chars = txt; X X XDrawText(dpy, main_window, gc, x,y-font_offset, &text, 1); X x += XTextWidth(font_info, txt, text.nchars); X return; X} /* end of draw_text () */ X X/********************************************************************** X * draw_line () --- Draw a vector between the last coordinate pair X * and the current one X */ X Xvoid draw_line () X{ X extern int last_x; X extern int last_y; X extern int x; X extern int y; X X/* printf("Draw line %d %d %d %d\n", last_x, last_y, x, y); */ X XDrawLine(dpy, main_window, gc, last_x, last_y, x, y); X ++span_count; X return; X} /* end of draw_line () */ X X/********************************************************************** X * draw_line () --- Draw a rectangle between the last coordinate pair X * and the current one X */ X Xvoid draw_rectangle() X{ X extern int last_x; X extern int last_y; X extern int x; X extern int y; X X XDrawLine(dpy, main_window, gc, last_x, last_y, last_x, y); X XDrawLine(dpy, main_window, gc, last_x, last_y, x, last_y); X XDrawLine(dpy, main_window, gc, last_x, y, x, y); X XDrawLine(dpy, main_window, gc, x, last_y, x, y); X X span_count = span_count + 4; X return; X} /* end of draw_line () */ X X/********************************************************************** X * yywrap () --- Pacify yylex() X * X * Returns: X * X * SUCCESS --- Always true, to indicate EOF X */ X Xint yywrap () X{ X return (1); X} /* end of yywrap () */ X X/********************************************************************** X * error () --- Handles reporting syntax errors in a reasonably X * nice way. X * Arguments: X * X * va_alist --- A printf-like set of arguments. X */ X Xvoid error (va_alist) Xva_dcl X{ X va_list args; X char * fmt; X char err_buf [MAXPATHLEN * 2]; X X va_start (args); X X fmt = va_arg (args, char *); X strcpy (err_buf, "\nSyntax error: "); X (void) vsprintf (err_buf + strlen (err_buf), fmt, args); X X va_end (args); X X fflush (stdout); X fputs (err_buf, stderr); X X return; X} /* end of error () */ X X/********************************************************************** X * ignored () --- Handles reporting that we're ignoring something X * nicely. X * X * Arguments: X * X * va_alist --- A printf-like set of arguments. X */ X Xvoid ignored (va_alist) Xva_dcl X{ X va_list args; X char * fmt; X char err_buf [MAXPATHLEN * 2]; X X va_start (args); X X fmt = va_arg (args, char *); X strcpy (err_buf, "\nUnsupported command ignored: "); X (void) vsprintf (err_buf + strlen (err_buf), fmt, args); X va_end (args); X X fflush (stdout); X fputs (err_buf, stderr); X X return; X} /* end of ignored () */ X X/********************************************************************** X * eat_to_semi () --- Throw away input until we hit EOF or a X * semi-colon X */ X Xvoid eat_to_semi () X{ X int token; X X while (1) X { X token = next_token (); X if ( token < 0 X || token == SEMICOLON) X { X break; X } X } X X return; X} /* end of eat_to_semi () */ X X/********************************************************************** X * next_token () --- Returns the next token X */ X Xint next_token () X{ X extern pushed_token; X X int token; X X if (pushed_token != -1) X { X token = pushed_token; X pushed_token = -1; X } X else X { X token = yylex (); X } X X return (token); X} /* end of next_token () */ X X/********************************************************************** X * unget_token () --- Push a token back for later examination X * X * Arguments: X * X * token -i- The token to push back. X */ X Xvoid unget_token (token) Xint token; X{ X extern int pushed_token; X X if (pushed_token != -1) X { X error ("Two pushes in a row"); X exit (1); X } X X pushed_token = token; X X return; X} /* end of unget_token () */ X X X X X X X X SHAR_EOF chmod 0644 parse.c || echo "restore of parse.c fails" set `wc -c parse.c`;Sum=$1 if test "$Sum" != "12859" then echo original size 12859, current size $Sum;fi fi if test -f pc.xw; then echo "File pc.xw exists"; else echo "x - extracting pc.xw (Text)" sed 's/^X//' << 'SHAR_EOF' > pc.xw && X.(.@;0:.I40;;17:.N;19:DF;SC0,1999,0,1439;.( XSR0.733333,1.354167;DI1,0;PU;SP7;SL0;LT;.).( XPU;SP1;PU;PA820,604;PD;PA1112,604; XPD;PA1108,650; XPD;PA1098,694; XPD;PA1080,737; XPD;PA1056,776; XPD;PA820,604; XPU;SP2;PD;PA1056,776; XPD;PA1026,810; XPD;PA992,840; XPD;PA953,864; XPD;PA910,882; XPD;PA866,892; XPD;PA820,896; XPD;PA774,892; XPD;PA730,882; XPD;PA820,604; XPU;PA731,877;PD;PA738,884; XPU;PA736,862;PD;PA765,891; XPU;PA741,847;PD;PA788,894; XPU;PA746,832;PD;PA810,896; XPU;PA751,817;PD;PA830,896; XPU;PA756,802;PD;PA849,895; XPU;PA761,787;PD;PA866,892; XPU;PA766,772;PD;PA883,889; XPU;PA771,757;PD;PA899,885; XPU;PA775,741;PD;PA914,880; XPU;PA780,726;PD;PA929,875; XPU;PA785,711;PD;PA943,869; XPU;PA790,696;PD;PA956,862; XPU;PA795,681;PD;PA969,855; XPU;PA800,666;PD;PA981,847; XPU;PA805,651;PD;PA993,839; XPU;PA810,636;PD;PA1004,830; XPU;PA815,621;PD;PA1015,821; XPU;PA820,606;PD;PA1025,811; XPU;PA886,652;PD;PA1035,801; XPU;PA960,706;PD;PA1045,791; XPU;PA1034,760;PD;PA1053,779; XPU;SP3;PU;PA820,604;PD;PA730,882; XPD;PA687,864; XPD;PA648,840; XPD;PA614,810; XPD;PA584,776; XPD;PA560,737; XPD;PA542,694; XPD;PA532,650; XPD;PA528,604; XPD;PA532,558; XPD;PA542,514; XPD;PA560,471; XPD;PA584,432; XPD;PA820,604; XPU;PA577,442;PD;PA586,433; XPU;PA553,486;PD;PA597,442; XPU;PA541,518;PD;PA609,450; XPU;PA534,545;PD;PA620,459; XPU;PA530,569;PD;PA632,467; XPU;PA528,591;PD;PA644,475; XPU;PA528,611;PD;PA655,484; XPU;PA529,630;PD;PA667,492; XPU;PA531,648;PD;PA678,501; XPU;PA534,665;PD;PA690,509; XPU;PA538,681;PD;PA701,518; XPU;PA543,696;PD;PA713,526; XPU;PA548,711;PD;PA725,534; XPU;PA554,725;PD;PA736,543; XPU;PA561,738;PD;PA748,551; XPU;PA568,751;PD;PA759,560; XPU;PA575,764;PD;PA771,568; XPU;PA584,775;PD;PA782,577; XPU;PA592,787;PD;PA794,585; XPU;PA601,798;PD;PA806,593; XPU;PA611,808;PD;PA817,602; XPU;PA621,818;PD;PA813,626; XPU;PA632,827;PD;PA803,656; XPU;PA643,836;PD;PA794,685; XPU;PA654,845;PD;PA784,715; XPU;PA667,852;PD;PA775,744; XPU;PA679,860;PD;PA765,774; XPU;PA692,867;PD;PA755,804; XPU;PA706,873;PD;PA746,833; XPU;PA720,879;PD;PA736,863; XPU;SP4;PU;PA820,604;PD;PA584,432; XPD;PA614,398; XPD;PA648,368; XPD;PA687,344; XPD;PA730,326; XPD;PA774,316; XPD;PA820,312; XPD;PA866,316; XPD;PA910,326; XPD;PA953,344; XPD;PA992,368; XPD;PA1026,398; XPD;PA1056,432; XPD;PA1080,471; XPD;PA1098,514; XPD;PA1108,558; XPD;PA1112,604; XPD;PA820,604; XPU;PA600,444;PD;PA600,412; XPU;PA620,458;PD;PA620,391; XPU;PA640,473;PD;PA640,374; XPU;PA660,487;PD;PA660,360; XPU;PA680,502;PD;PA680,348; XPU;PA700,517;PD;PA700,338; XPU;PA720,531;PD;PA720,330; XPU;PA740,546;PD;PA740,323; XPU;PA760,560;PD;PA760,318; XPU;PA780,575;PD;PA780,315; XPU;PA800,589;PD;PA800,313; XPU;PA820,604;PD;PA820,312; XPU;PA840,604;PD;PA840,313; XPU;PA860,604;PD;PA860,315; XPU;PA880,604;PD;PA880,318; XPU;PA900,604;PD;PA900,323; XPU;PA920,604;PD;PA920,330; XPU;PA940,604;PD;PA940,338; XPU;PA960,604;PD;PA960,348; XPU;PA980,604;PD;PA980,360; XPU;PA1000,604;PD;PA1000,374; XPU;PA1020,604;PD;PA1020,391; XPU;PA1040,604;PD;PA1040,412; XPU;PA1060,604;PD;PA1060,438; XPU;PA1080,604;PD;PA1080,471; XPU;PA1100,604;PD;PA1100,521; XPU;SP7;PU;PA644,1311; XPU;LBDATA FROM @PIEME XPU;PA748,1233; XPU;LBPIE 1 XPU;SP1;PU;PA1706,740;PD;PA1823,740; XPD;PA1823,778; XPD;PA1706,778; XPD;PA1706,740; XPU;SP7;PU;PA1846,747; XPU;LBSLICE 1 XPU;SP2;PU;PA1706,662;PD;PA1823,662; XPD;PA1823,700; XPD;PA1706,700; XPD;PA1706,662; XPU;PA1706,685;PD;PA1721,700; XPU;PA1706,665;PD;PA1741,700; XPU;PA1723,662;PD;PA1761,700; XPU;PA1743,662;PD;PA1781,700; XPU;PA1763,662;PD;PA1801,700; XPU;PA1783,662;PD;PA1821,700; XPU;PA1803,662;PD;PA1823,682; XPU;PA1823,662;PD;PA1823,662; XPU;SP7;PU;PA1846,669; XPU;LBSLICE 2 XPU;SP3;PU;PA1706,584;PD;PA1823,584; XPD;PA1823,622; XPD;PA1706,622; XPD;PA1706,584; XPU;PA1706,593;PD;PA1715,584; XPU;PA1706,613;PD;PA1735,584; XPU;PA1717,622;PD;PA1755,584; XPU;PA1737,622;PD;PA1775,584; XPU;PA1757,622;PD;PA1795,584; XPU;PA1777,622;PD;PA1815,584; XPU;PA1797,622;PD;PA1823,597; XPU;PA1817,622;PD;PA1823,616; XPU;SP7;PU;PA1846,591; XPU;LBSLICE 3 XPU;SP4;PU;PA1706,506;PD;PA1823,506; XPD;PA1823,544; XPD;PA1706,544; XPD;PA1706,506; XPU;PA1720,506;PD;PA1720,544; XPU;PA1740,506;PD;PA1740,544; XPU;PA1760,506;PD;PA1760,544; XPU;PA1780,506;PD;PA1780,544; XPU;PA1800,506;PD;PA1800,544; XPU;PA1820,506;PD;PA1820,544; XPU;SP7;PU;PA1846,513; XPU;LBSLICE 4 XPU;PA0,1389; XPU;LBPC 11-JUL-89 12:06 Page 1 XPU;SP0;.).(PU;PA0,1439;DF;SP0;.) SHAR_EOF chmod 0644 pc.xw || echo "restore of pc.xw fails" set `wc -c pc.xw`;Sum=$1 if test "$Sum" != "4280" then echo original size 4280, current size $Sum;fi fi if test -f shuttle.uuencoded; then echo "File shuttle.uuencoded exists"; else echo "x - extracting shuttle.uuencoded (Text)" sed 's/^X//' << 'SHAR_EOF' > shuttle.uuencoded && Xbegin 666 shuttle.Z XM'YV04X: @,$"1 P8" D.+'@PX0X%4Z#(> BE"L4@-6;8J,&"1HX:-B@2N5A# XM1@V.-'#8F*@ "L88,W!TM#%CALB+'G/(8%$CADZ*%EL&\7B#8$D8.&X*K0%# XMQ@R>)F$ )8E09LD:25N.%.H1QM.>-VC@Q'$C!T^8-<;>B,$31EFJ,,S2.!EC XM*M>/;.?&$*MU; P;;6W4Y8IC!MN>,OBZ3)G#J$^I=W&8+6DCQU@<5F7$2$M8 XMQLZ>6''>V!C8)N$<@&FDA%R1JN297I4NSD'CQMG:.&E/CC$Z=U&H2.VZ[!GC XM\PS<?9<6MYTQIO @-W#XY%GSAFSH.-Q2WWOQ1MG),B0_CSZ]N?7D+J/7I%[# XMLM#H/:E'[T[V\(R/]'-\I1&W>P[>/-'@DW\T?%9@2.^A9E6![J67 VT!AG=1 XM=N45J%@0V:D6X%\3PF##@C!PYE)VKV7TGW!;C7C09#/<8)J*)K'W(H8PL6C8 XMA'NQZ!:.($&% TLJVF"420BJV!Y4,[!&XTG B4AC;6=EAZ-&9X&$HV=GS>"D XM=##0<-9F'>+@)5,Y9#6BAY\AM:575KEU(85?>7A>:^A!5R9S'EY8EF"!*184 XM%"G:2253'_H7PV%N%8D=66V1]5QX3.YY77A-L> =D'\&*D-89MU0$HH7R5"9 XMERX6F6FH-,ET0V*A8L766G,&85)BEL(4*@TV +;6C(G%5:N9LFKYU*JQ>I:# XM;6$IZ5F!EM90; RO>?=LBRQD!Z2L2-E6F+)=$J02II-Z!9A*BOKT8[7'7N23 XMJ"SHY"2T'[;+%*A"0>OKL8.YQ)M'[8I7[X>V-33C7S$>9&N](#UE<(-!;(80 XM"P=IIBX-U$;,VI\-']CN?'7N%5:_P&[F5+NTJ>LL6P^6NQ)!#XIXZK^5D:PD XM;P"6>?%UO-G@)6JQ0GN0O#=WC$,-.R>IKF2V-68JSOK)1!;#/HU6K4>APE!< XMM6 *)4.7''G'\-:>6BH@O2YI9K6E"(5:'$<;/3L7"X)=JQF?("FJV<<]?0WM XM3K7EB[%G,_ MW:3\C=EBJ[0ZR^O0G89(4IDR.87:<T)NS<*FA5TW%\405P;L XM?=K!1'5+&,?D(L0UY1OH7$)V7N9%0JYZ>5BQKJ3EY6*^B/%*1./>7YV">3B[ XMA%Q]2!#-L<Z%5.<4A\JXI>F2'JI3@JM>=>NJO5N8;=D?S6SW]5K;T5SJCL;W XMO/6N>G[('SY5V\PZIS:TNL&W=>%FWD%5+M$<G73M9@#"RLP\PA;!Y"MC\=+9 XM_50C$^.1+6.!JU7/"D003[U+0*_"3[WX,RXM34P[A3G@7FAU+#-A;"]_:9?5 XM<(8KP#3F?ST9UX-,EBMT_4\P',&,"'/U%'*5[V=B"ID%JR6J\CVH6BL,'W\L XMM:JCE45L,_M/UQQ7+]HTT 8].Y995E(LA &*T[:F@PFPY^J\<LC%]I:#54S XMI[]9#27DZ]B#W/>3*F)1/NK2SV2D5$7MK,R).]D(U KCI5$9D52;*E])FE6N XMHB K<S!C2W94!A,B[D]G4X/A7JI%M(G1I%HKF=BA0-G&QV'F<O<I4J"R4ZF: XMI$TH0QLC"X[S(W4="BNSI,W_'.8E 8G)EH))37CNMY>A=>0X2ZL7+SL"+<4$ XMZE :Z>6F!G:0UPA(-;;<C$SN4Z#G' HI<MF+,R>4),"T*#2P+(E9: DN6.IL XM)UIJRG5BN<[HF)"<PCNGF0+EHNC,DC\,&PV5#'.?\?S(G)ZQWGN$Y*7CE$QZ XM[RD+6[2DLWDB!)Y)"MJ($M/0F+QHE5YIZ$:2F9X6;1.@UUG)1V:W$=C9ZW*5 XM\9M+<;FI@Z2T)CLQ"?KHY!*: &A3O0%>3F!J$LIAD2";DJ=0WP8I/\$.*[89 XMH]& )R:V8$ZF[VF*6<)3*."Y:)M-<1GL)-/00^VS.\:ZW$=TUQT+S;)+JNP. XM4N!I+,IM;:MD$5&@*H=4]3P'JG@-7$JU.3N;0G0XJB%(2@1;IY(DZ2QA(8E& XMP*.2ORZ'.LZI4TX^LZ[G>*1$HFI0H$#3OQ:1%"->84YB@+2Z,H&G,G_5:4>^ XM=9V,8*DV.]T=TGCBK+-F]3B\[>9[-M4_'*)5>,X*Y7N>QD1/&919WL'B=4:3 XMD6;AJJUEJI60QGHLWG*,IT&H#+M \JDZK:I2)SG18:%CM3$1S;?I*0JIB'9: XMZ@Z+OM/-SGV1 U[OK,=%8S-O;RVE);&^ARE=X\V<^'E4[6H4.@:$V['B^AX& XM2=BYZRT5V[(CVN[0%V[1'4]* @G5Z8XQD$*ZYW KJ;/@F%= ;(N)4]]S'-L( XM9G[F'2'< #<>MSQ%2 4U[S#AYI ,+XLGTODH[%*&Y""#ERSGBHG$ZB09X!:X XMG2[128PTTJ7K*&V;*F&K4/2SEEQ2$5 7T<U3--*3YQR+6I,=YYACETL/KA=R XM!+E/4-%<+X1$L$7"!>]!#&/.LNA5759[(G^R)FBXRB5$A^ZSLS@BXP=7$T(Q XMF5S'D (M9GK(F\7YF8!FV#&8G Z@08O(FVIB%FO)>435L=2/2@G+XWBK*:_& XMD&&<UA1@10>ZU#7HN:05Z?2015?1P3*&XE+!%\[S(%V3S&FETR/!%.79LKOQ XM :7SFAL#ZT?+$XQZ-[HIN$&+83]ZVXUG=- "[FM"Q#6W8.!].AQ^F]#F_F6M XM^;0R18DIW)[9TES8UJL),:60LS)X[U8R;W=V:<<M=>?"1>5O^4+\39Y".#I' XMI-\=IV1"L=SQ<4!^Q)7P9D*-*>#=#,ZH]CSTR>_=<7OFZ90?A^C;/BGD06@] XMHI3O^.14I@W!8[->LMI8(PKM>8QHTN:BT^;H#>=SSW]#DZ[V7#]P:]$!4W[T XM:X^Y6UF/>)8]]&,MQ:HQA<GZ=<<<L:S?B.W3\>F%_A-!E1HX/7]IX(FGZ[&L XMOQ+O[*))E]\S:+\[J2C2\?N,BM(ZE<9*O@19"6;DJID=[QEC1:E[>#HLE%$! XM9B6LZGR8S6VESB>;R)4U_<.%5!S829XG^G'21GH$1D7-_HM#DWU[C$*6"^5J XMO)AA6*X^N?MK'?4P_SD@%N\#>Z#S=*_>L<I_A"\=YOP'6!^B/=VY.Z;&^%X_ XMGZGRDN,%55]?%,DSS[#5I*]IJ8>W3)^WFO(_$LBFS"BF-O:*DCZ4>"#[7DQL XM$U)C]3- MG_>$8"> 3MA44!68X"^XG*RAT72YQVNQQ2P=Q*NESCZ\6"S]Q5# XM0V$]11E(-D9/A5[?\4 ZDQT\,1JU@RN?X2+WQT8\X3FP0S'%%77A52#,83LU XM.#(G@6,]52"?030MF#A,@7T48Q3O0SEN!1+0DE)S,1DT(7P>\46S]U2W4S?8 XM-VDSN&?AA4,SR$<]-5)=*'R5886197J#DBNRYQUCLA'&)QV'01,SUE/9T3_1 XML6 *2!K.HD$]M2IC<H*=]R%CPDJNIR%]:'L,M8+^$H)\Z#5/56[)Y7M=L8)K XM%X2TMRIW%UYWR(AZ*'J<XRQ>R'^',1KS%T!A87QXL8)3UE_K!WOMQT]=,ADE XMU&-0DF))QUX$"$Y+EFUQ\7W )21^R(G=)8SW]SPI5CL_4G_?%5YY2&1BYXR+ XMQ%#"MQ9;I'^4,S0_MA=*)GII9V]+ED+!)'RZ86ZC6";;^!99!2#69G[Q86V+ XMAQ0Z5U&$MQFDAU5X=S6VDXN(%WE.H2CRI7<:(5?L6'-+IA([EDB=]Q$$YWSO XM5VXK<W^-$7GP,E9A$TSUU27Y-SCFA10V!UL9=BB!Y!3\R(T)*6: %WGQ-%U> XM,9*-B'F<AEF<UU-6))/9."C1E%(N8A0:H6)VB)/TZ'X?@B5$4T09%A-*.) O XM5GE$TSP5MA(!<HG0<7!1J2?\$R!.-I7&1#13E1XK,28"\GB_%R!_!V'9E1'J XM&%\1E!$8&%'$%SB^5A:?,4:^5GWZ<WB% 1Y=B1VXE#>+1Q9?L1EX*29?@I?_ XMT19I:&P0PA0UD1]T-&Z8EQW<@R_3)2UM4501]39,X87>\8#% 9"YLALNTAU< XM!!5/>&#G<A4!E1%C0I=M19C-L7@48QS1V$_,<1\H"6'\XBQ;,UUGR(J/%Q:! XMN)=>\X(DN%S,QYM_B9 GHR?@MX)E6192 Q*U!$M6(X7;99U'DC!K<I9"XF\P XM\16*@R-\F!$^N4HYQUMEN8Q*F)T;Q2Q$XY 'Q9.C"4N;8C@*N5&P22GP!EJ- XM:9^'V1- B"'A816F]AR%<4<_"(*Z-EZ"AZ#1MX*Q:'"5$CL-@C&2@74KDVL9 XM^F-;4X=!H#0C649U(J(>]V!TIW(46*(PH:(\%Z(M2F08YGXI*J.;.'U;)))> XMYA,YVGIW)BH-]!>?F&5 *F\O2AXJ"E_046/YMHFK4G)=PEJD>2X&I&S4)7W2 XM)62:"9CCD5"LJ*0 9A2I2#FKJ)PI)8<S.'*#>#HGT8P;@5Z.A8*J,1D]$8,I XM$2#U"5[Q\T5H H6=1B@@NJ>!(:5+88/'A$WKQ3_N8QBLL5<I,9DOEX,U1"C* XMEH*0FFL;L1XIT4E+@6#,1&K@!1);]B!#^H4QT1%K4:E',1/YN5<\U!'JU&/" XMPSH,&CN4AG:40QP=<7U\)VH<-AY),IE1YZA7TQ-)I*=,,9>',EVVA9CX"!UA XM(1.KT8W#02ZSE#=_)1T-Y2RY)E#R\VD1U2.K@67\9$^H.CI/AC^FJ:0_4B(' XMZG3:@5NYJ!N($D?@]1%>83^$FF7B-%L9X6:'(A=#4ZJW5$FJP6@G%!>6HQIV XMYG[5%$$ZF)LKHJGA0; *JU@VZ$T>HA/CXW4.ZQ7,1T&G%3&:^A@X<YTHD20# XM8S5062!*V6CRV!&:0:T-XT6*]1<7BFB'TDLY<[(Q6R '<Z\,R4P<2:-DP3T: XM0:YIIA+A5+084R:=YDOS^FLR.VXA2K6CEK-S5K*-X64FUQ'9XF8@H5ANT:AI XMQI7,9)19)H+\X;%/JR6]5+9>IK(RNU,A6J0"LB-WQJ.>5JK7AQ)"FF9_@1*\ XM>&=(0;;ZX65- 4^HL8E&ETO_&G2C6K08\A]Y1AO3]HQZ-I,8XBEY(3(34A03 XMI44(FBNV<1_1XW[?0K8T\4 J<39ZEIM#4TFH2[-B$B^FX[@ -4LJP:ZHFTO< XM473JQ+N.0F5UFDN)6W09PDS*I;J%(:V:L6V R;S*)AFT(B#-NTKH>$R_,W:B XM)DYN=KA@F[PT"FVYE)9/&Q>IP:@[ZBL40[XP>J>SZ9,P>D<%(H:!HF7<4QO7 XMHA/&1#&&=:\<=$P)6*):5[<@2ANS&CC[&J)SP3W_*+8/=[\TNU9RX4MG2QHN XMF\ TX3XF6Z( XVFGA1J?E%CSFBO2:JP/A"]P=*Q/.QJIL6A>QF&PP3!ELD@, XM2[\-,3*JT;HE^B"*Q68:VR5Y(<2;9G_CX\.-]DW')';/]$;GTY;/I[.*)L/K XM%3&*UI,GFQA(2SR-AF_SN\59;'4)VY,$K*0',7"PZF+ZTB540C&7F+ EP3?( XM=+(I ;V0B6AS?*@,"FT?$[$:FV)5FXL'41GNTS>(-BIG++:<,Z<5S)@SL7$. XM?)AL=*/\ 4?.,K?L,A=9"7X8.Z-O6VZ<S+D9FAJ5@W+QZKD(VAC<DQ%FRW:: XMNA:*\A\:["PHNBXSF+KYBR9(EJ<A&FM\Y69.T7U.C'*T$DRQ0A8C8SO?EEX0 XM]V"]1W#II[K)*J-:NU'K(20;QT]B\H)..R%Y&X8,"H!6&&!/IC.3X2FDW!Y6 XM(1TCS+=]R+DXBGX)+%5(5LQC-LRP)W9/JQEZMV?Y&Z,JY6^ZM&.#]V0Z44A: XMDHN8(3Q?>:2$!#?@XWXN4G(U45^; S=,\<K&MG"V/!Y0!3<Z4VS0484B?9S] XM]6%8!-"DN71R"=(7Z4/FY7T2=IK]I1^Z@D*^V3JIFINCT7\/TL"F:&-W,AX6 XMIXE"_1'(4J#CH45B<SCFY2G#<A_T&QW:X2E!R4\/TBE84;WR9RFF6YG;J1// XMZJU(%FA:S3D"Y=/2!M9Z2]&X@H?_V5^&,8=03='=W"R0U%\TC-4D32+(4A2. XM:[[1,:$)$AY$EI^8IV6PU[ @M:5LC*&;X8%I"5)GP\XO2FWNEJ6J&S@_QI8( XM"D!&:F)AXX1..MG4H<MCA5SWFXU025]*2HA6<81D:A@;4JJC8A6LUF.P.7"^ XMF5T>H=BDV<B84:H+2$=J2M?B"L0F=I:;8J6U04:76*ZI^:0&U5TGPX]8 99O XMUU_62!WXK"+V^(/73*"(W90D_6NM6<!\W1B-8KOA\17A4;UC-"3=R\T<BV!L XMO9C727/NFI@8FBOX:;O:G-K0+-@!LE.K1%W4\<VPU-"\55ZJ2W\!4D?WZB:\ XME=6H7%S%>Z\QFE[&C=6SI53>?4JU@:ZCA1EK-M$8TUMYEGDII7_$JR3M 6<) XM_5>TX3YP55L=)R#LC1&\([.^?!)\0C%BV.(E(:VXPM$8 <F<K&SQ*1<>Y:=M XM$I0YF*\]@:Z[$])UBMLG(=_\M3N5P2(*OH=XDL>=UQS^BJFI@JH^:H>BS'1D XM"B!ST8BR.*MUTQW%T4NQ&I++HQ<E^>=D0J9,<K -C$5%'MW9&".S2;._)^6I XMAZS3D<,WE7B<O'^2,Q.<'5Z\(1>%33DP(:U<"CPKLJM.J:=CE!<VDU*B@B?N XMN3N!TTN84:LMXNFE%X(+RT6Y6BFX<NI[91+<(X&@'K*G##Q:$L7E31._ <>' XM[AG[FUD]E2VP"I+13N?M@^/G4AM6-UH4GA*GWN+MBJJ9W%AB(A>(GJV*UAZY XMV!Y0PD#[%Q>+FI_A19)UFYM5QS<^0=)M<[.(*NGK>]#0-\%.\:)'):UOE%+) XM=ZT=#AVBTE!&;HOF=!SZKL[_5)TA6%V@LXE36$^&/88A,DLM$H>X,DO ;E2/ XM16B.KCPDCX-?N4V&M%YQ(U(!_.LK91C3G(-;YB9VE4)TZ>A[_E;F/)46R!_) XMO6RV'<;I9.E@Y+JL+.[;]E5M\7(8ZBG&D:>[?/1)!K :LJFV.V%0@=+I>T3J XM),^!HUC'HFP*W#]5L:/YO=#"C$DF0K/1@4E16-7F>N*D_-4 [*3'@A)295&6 XM_HM-'38,4L&7#+9%K\ &SUAMC-H#-[)<P^=O_<2)1KUN5MS,U.^K5%/C ^T8 XM:A*]]/!4YMDR^[*?+ZX4(_?'TDLZ45]DM:L=OOGN>M>G;Q1A:[Q+1*L("A)\ XM#H2K1!-TO-<8ZBJPZOMZ+#LN^Z*%G.T)MVG7U_D2J[YRD>HSS"C7-'>< K:- XMV*!K-C1*8HK;U![&QQN10\*@3BM)8L[<;F4CAN.GTR*,/UJCT5 4\E<1>DT- XM_.5YH1F;J(7<N^X3"8'A.. "M&*;CV$FGL^E*)JYPNJ6'=> '3$A+QP\F#<K XM<@EF$DHPP9S@*]C!)I#7BZIQTL2FR;__U2)B!6]2<N2KQ56&5I:81DN#B6L/ XMIDU)*YW Y%P9HFA>&(%N$0H:YZDH@Z*@"X>!XI"$+W<6I-X0#%""J;8$N2,$ XMY=1=H\A_3I"T_)4>^*[<#Q#4'^7-//6/85);KHEIRDU<J7_DG"Y89HA#%APU XM7X)SA<$B"*+8DF-H@9)E*W'!1)48= 3-*@F_ 2W9GD/Q1?A3HMIJP"'_U4'J XM0'1"55*1#PR*M"#"V)(_2L*R:BQ)PD )MZ4@6^H42>-6;<+TD83VT18D'+=# XM+OSOK\04)*$&2T66^( K[0DJP0 E.3;A*2D)]BH':K"/\ -C@JB;9BTNGLP6 XM7R=99N&MRX5;J2F4*K9DH()6#EP/!^>TJ!/%(AG6'9=!59>')'B[767A1LL1 XM:A0_T$3LJB:2J$+(^ !70LDMT#$M]SA6BEY@<BMC?XT[/17.:L.,<E6W!<!0 XMCK6@6(922FD/KB[9N2'[@0XQ'ZY8"SVF9<44OG,V.%E]$15\@W>8&(,E'<H; XMK)!6+^W%"(AS55^80E[P'Y4I7L&$!R,M;A:U6W (Z3YX,0RE$AJ*'IEA[DL8 XM23#WL1'8U33A78R/0)49CW) I!K?2#3=01>JACBFY\SA<>!'I@5XE35\$Q.V XMG7^P,H@'I-$N_-*1"%.+8&.<*%Y@D".UN&26VN(G@(-W!:W(5.26A6\J=%<H XMPTBF7<79\!OKZW"2[;Q9#=O5MM:8[,(B"3'^@;-LIQMV'U%*#+:KL,T$--=S XM4EG3<5C%)&5)I9V%D.!8N0 @H0]A91.(9<4^%FJ8?GRQ9H4EF:7A^HRA EKE XM33>D"7L5T&P;B$LS90_V=*]?MG"*29HY?#?&2<0>C6/#($5"ZE]SP_*<G08T XMVF!)0=M0".HE@J.HEIRJ3T[T)URI)IJ4U :B2D4?#%JN2C,9!H(W>NB+<2-B XMT) CXK*NP.08#U@Z,YBG.*BD,K=B?@Q_J&HZI+G8+EN#1$+/DZDJ$8)!T4#! XM :J"0D18/(\QZPP(*A,7 EL PU#'81XUL,*0S4QCK5DZ,.%:% ;+84!63=Q1 XM7^2D\L2.>P.1/,2VN6A$)A82D@;2DL@)5*H<SRJ(7"/N."*( C3R-]4LQ; ; XM2!8\MHU%-#?SL4.N%,'PLC!$2O@\H N6G#AYXV^6G#E*9CNQ28&SP//!.F2X XM\0D/TKW=&'0#__(-NS$[YFC5:(A@4KUB".E99YN$1:(;)QDW-,HJV6,ETN#8 XMMA3S)IH2-)J21T*;@4BIP5"267L(0$%/)41)KX!NZ%"$W#9P*$(FLP8C)B=$ XM]OF2=K(8R:/0Y4<,1NC21]K1=:T%G>-D7L:(2%5/DD_:&/*7)Q?E,.I=#<E* XMVDFJXQD$9)RT'98R& T\.QDE6V$Z69&;,IV02>JA<+9(I30X2])LN*Z,X&[\ XMD*'$$%B241Z6*RF.-D-Y&Y"?S;%U"-+0P916@F 2/B6SO9 +-,XP0_>!=AB" XM:36?9#8TVID1I#+>KY<I"6/)' "0ZQ(3U3)%ODK,L$CZT)MX72O(8R5+V8$) XM0<XK7!7?1FFLH !6N231&4(Y%H@Z;8G5UX6 Q40R"EA$-8:5+J0OXZ4#^3IX XMXT/8,/4%G;8.'UR79R<\K: 6^1^@Q*1Y40VS^XA P?58:IP-$TD7:#8&J+.7 XM9C86[-EK(:I+=!^KE7)HT:-\$"-S7L8,EX./M)=F0D=,CRA1IEF)RCX#+11F XMKU!+*"F;81]:T23;C'<G?Q$0^_$N?$;HNWEF991DCY[Q%U+(_0)1MT13Q3J< XMP1MP"1N16+;R(@8OP,A QH?:.B&(<7PPFF>2-6'5U@2;0@A6;3-;4M_&QR^T XM)05F?'!&6Y(V!XX.VX@7<?*4FN*@Y/2-H E8A\SJP<V"B!7N9H"<"5WIB74[ XM;'7%#$8K.S-D\W#BBJX$-O4>#SE9_!%6D:A&H^)@5>*T)993B26LH[47:58A XMBQD/S-+XF(LXK! -Z<05*1#1#$I4==>>&%5:<LHFC4&L8'*R% <T_!]:Q=R9 XMLX3%M^(:&F,3* '<Z*RC=U2&V*G"%7KS8ZT6?Z4::4->D"^7[VWP+].)$,Z( XM]TDSZH%VHKT7*-6\3 !$(UNGP&D[B(D84%6DRU]K 244M3'S'4?<",,ILV5B XMCAG>=YG.CJAP'P.2D>&)[I:_* 1U:$4):W;6AMIY_'J?DQ)QXXK'19DJ9/^Z XM"]+A1YYC5TW"^)*O@AL&17ZU:*%0"\9DE<3>[4L//RA+^)HL%R4 TC]$$C5Q XM,N)!/<%FML/BJ6O4 5TQO-YAGJZ%-?HB&$3/#0J*\7C<0O^(0@3)0+BIFD0T XMX!?_<2^%D!.5!Q5F>GAHG7(]KQ Q9"#Q]-;"2PIMHDAH,;W(&N0982<$7)ES XMZHR");O%.W1;8L((8X2,6)V7P"3T(".D3XG0H00(T2E90I$6:RQW+,'1.(KQ XM173F7VDA,J*VL#NLQ#!.0E_*CZ(P<=2$2[B (L2% E8Q[;0K^3R%0+'NGM] XM\8G&A3M6"0:'I2O3=Y"&.)J2/O@LHUW%K&^#107U4+OR2.$@)5PC@_*OZ$2/ XMX.B"B'JB7Q_BM4'/VA(3,!DJQ#HY@9*JQ4<X'!A<LIH1 B1.=#>,@!X9DY, XM+&VA86&$Y\>8:-S02E8'A&6V!:A8.5)#4.. 1X(HE+7,HT'YD8O("[0E7"5/ XM%Y8@<^5?BS7))IE)N\[DN-:BA+F JX3TK<#3$DW628C@7 LMI\"?BU 3_@S( XM8JBL8Y94$X::@MX*+H2H/X.@-##/=KIP%D,]F$FB_02!P#$3#RI$]14$1<Q$ XMA .R-6H&2M,4#E*%I)%J4BU )O_+(5;.,SP<[S<]>L?S"A7IKUI0SDD1-P_* XMK1 >/R*,/# B4BPVDU!-(VUJ:O *.O.!4 63&'7@Q3.\AH<U*9P"1RADS^*) XM0!N[41P41I< %FH$,*2Q,((0S,):S2.+!-K,C+8&;0;)$MDY_^,[0 RWT#,\ XMA4RH)HT$0*P(J"&!(,8MH1\3$9J\B^]D6"49_M@)9F5@Q">(H1DTB<+ B]ZD XMFHU5%O(;-NL&B:LA8F1IUM"*,\S37HU<^D(8[=6@1S,@Z_HY&N6F9>01>S0S XMRT;ETP_/"H,H#&ND.=8&Q*"'#T1 G"K><-"& FHCKM<">_U5[+E>=.MO39&K XM(XW]UKT$4)9KOQL*<>&K^E6<4!]_:Y["&+XDIRB8WJJ"-(-(#4M>(J$X">S% XM$0!'<A49ER,Q* KA&E5, K# (%M%"'*%AA!? 2)7B$G.+KGR,L] QAX']B"M XMC85><A!O:N(\Q+OC=0BVVA$N'5HY"!>R!#(Z3FV%E]0"MM[<AK5QKP/FI=*\ XMA=OD!#-AIAM6!6$0Y:.P/ WV*3QY:_Q=#8#B>P*6]KL_915L<4,]%1>D%;09 XM+&OD+^S!,H.]<*RX(JXN)62]F\Y3'/#=&PT>@$M<"B./6*EH!O/R>?]KLKD4 XMU)#Y,-T$6QNP8VOX6')Z5\;74-PR]M"\+,=9@L)R(NW*5&X6GB@[-TMI0$]. XMQ!)<QM<TU&LE4@&,.2DQ-(9/Z$PKI1$*#<#+B?'A*7Z_6#-9;BB:M7B8I]#. XM$N9*T:3,I"VN%>UT%06.R$)-2K<J2I-V^WF*WU#KOA\["[6^AN&$VIH8)TO@ XM]TN%YP0T'1'X%U"^F]:)2[=CLAR>[*<1Q.4!<GG]#O/8#C9[WTC3FTV1$ 9V XMZ3K4Y/)BXJ@5*44/J^69#N9A1E[26DU6QLX>F)&!='PH:""V-9%,*+P5JAW, XMCE4JM^G%PV14IDC7:@C<2F^ YEHYI*]":8(;L'*W_&.Z)*UKY<M*Q41A/3F1 XM-%S;W[AF1DI.=(IIMJ3,6L;35@!$R/,U1F[2\I>2!I5,BVQB%"40('7:7P/2 XM+&CN\4W<UEHN%&L;0!<*[J(V4ZK0#*/.-%$NQ7@P9+G$;S(8?Z)G4JW 51 O XM%^M0M6Y%#V-N<&(75&W7,@NJ]OU$G)[QH3\ME[RZ[G" QI?<\ZOC*SA-Q.K* XM=*^7X(LH?^Z$FJ6XQ9DX(0?QH?D2;$DE%G0341J$07Y6PTHU78#R="F9FJ / XM$TSG99A5Q$W2&]W%K?ZA=]R'>8L:+A>FC8^9!CX^$5M8A[0:QS(=]$L.K9/O XM264V(N^*G8UWZ,XZ'D%I= B.(+50!D<XQ8:&([(+X84WHR339,B9A;PXU-;0 XM<6>&1KBW1<-N<D:'Q3E%KK_!DKV0&G#B[(58\N=*D*UC12-"KVO!$1]/SP1- XMX+MF^J[KXJ^I9%H>BM/5&(9O1,&SZ<:H05\."6$P;G$C30/E^E88**%/7F[^ XM."<\%\\:FJH+3WAJAG$1MPJZ^@?$=LE\*&JXB8K1O* ID6CW7H-(3&]YK9AR XM1/]B 9^NN)J 7HG(IEW2A/&T;W\A0WN7R7&)R[5T%PJW58GFQ:?PV2/U\^;" XM2Y4K]NOE]1<;NT#E7HX]<7JB F,U/5=YM)VOV5G0\ 1_O-HPH(H"A&#! 66N XMH*JNE56([-R3*S9XX>V*Y.D4QL-? *!;DY^@8!8L':T)TC QO"[EH!5[U!5: XM)EIAOY+!UV0ZQE 3!^$=J\*%CFFA%:M958<+%_YV.5%[0BU]B]UD;WKP)>.4 XMAA+9OM=6.NA'T!/9 _;)IA+V&!LN<BN._@,K@:D/0U\6#]IZ+RLT%%W1 W.G XMOMP*I3VBRL,HJ*6'FC[#=_(P8D\A+I3RT&*&&[Y$K1 &[EW.A5(B0A/3W20@ XM8<>^2O\BA?QK?-'$N8+IOL*V01]&">\#2-XP8=3$:.F$_E)Y@E]Y:+:9XD7! XM'-Z+8^(M/7BYK!0P^HN)D _%# MBXMH3)60>L0/Y:8Q\J9-2+O506I08=@#% XM-8;IMCUM&EUTV]=DNH3/+;C3$N8A !+5 UOK$%HULAT749ZG &K'M;<WM6.# XM!P[5<?'%Q>>8JB'=3Z)G]$33326UUO[R#+A;?*G=-=: ;S39:$"+AQUR[1RA XM#[G/BT#DLOO]_@WBTQ.%8<+"XDT6(AZ/.P-;J7BY=%!QK(H?3;]=NR2YZ,"+ XM\T7*%(S2Q3FRXSY(,1I!:G7)Y65<7HPF,U\.,7M#8O/MO.;D"-LGE-H,X4W( XMI<'8+"A;K72S3H3R1CD2&0_>X"Y:1F^*;TZ>-;<JT,C$XCN3#\HVP;GV"2J3 XM+OO$+ZA:,OM'R$M 9D74]2;*+.H2D#YA(2>SE;RY1,S)"S$O)J-&Q))R2I#2 XMX:FA$9"&3D0I(QQ3B)19/*F.=_VX5>%N?>-PD;RC47V\N!";'K;&BQ-^?"?Q XMF!:2(H3=;5C@S'I.[P(B/:<AGJ(3)CS,I]<"I S(9O\B= AU;%;##LJ"2^)> XM\R(Q.R>8'Q,Y/4=S,\)JYK(+30H;9L:$5DZ50ZG"%;?]#9>0J.W<[$3!+3EQ XMH+C#@/N<(6U;X;[;]<7<Y6BX?:_G=$.TS#!U15HQ7+2$L!&FS*_Y=HR8Q7-N XM[.<6%G6GKJ09+/T ARD9>1 Q\SFY\1.)!_O*FE>=+>2K,P/AXMB>5P.#2E77 XM,R:NC$>S_6*>CGUWQIE4N92,:E1%;,RH=4K*Y3"NH+0[.B#J&H;H<M)RY^&@ XMR(IBANYV(<+XC-B=PP&M"<' P)XN>L*D[M(WNM5FX'.YA0,"MQ\+/"I?X2!X XM7@3D!6&J,!$UP^8TKC&#N((H@*)67:YFZ3LM]8"$U\O1LYKK@ 52A..3%(=( XM)5^]Q)9.(QG%L')I<V%8<2"/8@LBZ5WX')$D0CQ7F;XAMBU@00U6B3JZJ,@( XM&"%U>M00T&<W4H)5&5B/PL?-#OZB*2Q,36&IAAJX:HUG:!) 5;!H':V.5PCJ XM^_2B5LM6"8ON)S$DGD;]-28U8[@5HZ0.LM3 1AF19^6):)"BOV-SW(YFM*D XM",67 XZUB@BB58N%GXZO"X^CE&I$IC58->@#416K5->ZZY#^(@>78:@>HKV2 XM2JTQ%LUK&!%Q 4=9'!M4@KX^*G#Y1TRNH6Z582T4:L(2&7@,(S\^!??Z4>,# XMN>[6H@.5-&"7<!S8!5[,-0XEO48%BLHOP#5#31BQ>OM1E/1ZQR"JNY;5Z\4T XM0XQ?52<DQU?EFT 50H@DM&K/N.IZ<:\RE6F,C)3Q0P)&B! A+_2;;*(1LC.^ XMRS/!@W6ZO G9K^I5PX6OV%F\(KM25JMU5]0J]4L?\2$#W@\V1%D;U@FAESB+ XMI!%8M:IMRT:LX0W35(PTZ847-;QT9=A$\E5A'*Q)D:D@1N$,%5!OLBV.T+&T XMM8:0.!ZT!%6<#='1J;5TU<ZJ-X:RRN-,K1/P=*0;J<G:L/I-61&UQ06JZ#1- XM]L&(BDY#&^!UDB#9D:K&X&D=6FC5JD-AJ$V/:S\'TZ$P4@>Q'CXK^T(<.[=* XM7!@JZ"O38:1IUX=' 7K:A>8#JC&#\98-ZA&Q [;7\QA*2F#;B_*F9]0J"ZXM XM1I1*2[*X<;J(&*CS)V,D)%M!YA+?*E64(GE7D2K0%&UB%R+">BTG,"5ZKHXU XMV^JDM"N!*>G8,,(4J41(TVNJP D>!:;,M:% ]*3WC% -6.)_;J(DU%X%IN8P XM"58E6N$$9S<[O%#6\AU* GOA%9\I7$MU7L();0=27.]RC#MP(-%#*KT+<&,= XMKG+- H5,=M^RNW3@"]\!KQ78[!#/@'OD;8KP-E*?'W%Y4=RD5 >;.E&ZRW?Z XM1@CMU3M(::^0P0TR!TFO H6[[N_RN5\MQWV2TGLA@U] )!TY&.Y^?0U ZD)0 XMD*B2*Z1TI93>VWN,..^7-;RS=_" WHO$OM[78MJJ/3@%:=6<:C%$U%_M6?0" XM*BG/.$';/?$'DSVL2@34'#KHB<_7PH%*AI&1&]=M"WICDM627)D41S'>U]H% XM>18@&:OGYGX]'5PL>8BVJ"#'RXU)T*8 9:N,+>X:,^RK@#U5HJ(L\8>',[>= XM!$ F*K$"-^44.=>MV]K__!S/XY$/[@%.*7+-(,\IDHF[K@=*<5_SA.]8K[_H XM@-_7GX<Y1GEU 2KS]:4L\/2]-3)XT!-"4>6\C.\[%5KFZR"LY>/[-U <&:[# XMI?=I27U;Y3-_[R="*6PXS]-&\-M<*^'_2IAT>/)H+VI%7^>XMR+O3$>>Z5/= XMVM"\E;R]%K9)DZ77$X7VWNN**V0A:MK9-=?"UL"3?,=0&1C)BZ*Q+L^(V7*] XM3NX*LJ:Y:B14D"J)2IE?9:KKJ+EZ>TA44:R_;]6A_:_N5HK [PC]XX#6Y5KA XM]PLGRW!A ;P8!O9.OU+:I&6:^UHWB%=R93J\RWZS4X]R7T=#4T:QBZ6A6+6Q XM8$&%^5W )4\16%A$E[?I-I-(^7&(89U,&I+P4H[=-4TK->9:X,%ZZY!FZ#^Q XM:<<PXJ5>$T%I:(8N33O9XQ).TH[U [G*^(A4CB4U##KE\+^. D_75'C0-5S$ XM:9JLY *K] VM;"1&<>83K;'X3RDX7(&;Q->B1T21"DF"W@K<(,7UD0$XAOC# XM6!;WE5+$5_<T%!!B?[7E>=V+ZS.29,O==4T([+1BF+'RGV):QK?P2 PHG8US XM%,>E4T6.2V067VG;-+P3U9\(CC;=%I_'V25(A,-H=,U$7!D9,G 0'-4&H/Q1 XMZB)0P'+O%!W9OF-H.ZQI/&-D2\AUR?-MLC@7*>[ W<J5.W_T<8J.AV0Z?RVN XMA9TW <#"#I$L1EK'0I8=@\P?59)R'R-'YVW6&N;S3DA9"91H6KFJ?!X+#,ZJ XM39T#9UPV?DQ+WRS1)-G 6N\2#D. (07B*T=$TR[O=K+;^+C0=<SV;NBJ-KTV XM="$D.C0MDXQ\E)0/[E0=]U6VS-P>M(SO4^[!\<H@&N$#"1$-7<4(B<(2BJ<S XMFI$RBSQH),!''@1C)\G[(!X1^%"CR2='*N-!)(O1HC(RVQP<<%9W[&VMT5#- XMN=:X]W2<D?$[NFG/0Q)!/?<",T^&%QT:D8T'+K&<!L*^W(D]4BG3LL5 G&EC XMNHB,%%MP; HUR*YN+AI)V?2JDR/^B;#(IZ?F R2G1$#3DLSOGLSHSL7?O-*% XMZDY)D)EJ.8P4V&$X6J?1!W7A+,.PFLR,$#I[I(L^'6^FYT?,"G+-5L0JK(JM XM4XDP*:5?Q3C(BGP%GW(: V9MQER'@5N=QI%W$IJ[ "M6O,_+H,'THAI=U@S2 XML+IDTTLRZRF%D+(#<\6R?,S\KDFCYV5,N+27DE: S)W\.(* O>78;O:REV.% XM )YF7".W8G*M+Q#=O(0FID!9L]]*R6)N8;EN#AHI<:32#YZQS>KZY*0SM@ZQ XMK\4K#)GP%B#T*NFS>+IUOVR$)CG0*(F2E3!C4U241LTWWL+XVGW%BG"JL4!Y XMEV3/G(H=D7HBHBK@K\SXT>QIS_!I]DN$.AUZ+X5)D_W#L&69T5:F*7EF91.^ XMX$H\8\M>0HM>3#+9>)OJ7[C,D1[Z]OSEYDXSX2T\^5Z9USW:P.A/+Q9#(8IH XMX,NMF?-W4PHZ6SR4$ ']+Y+KUU9UF32SC ]+E!7&ED:0:G2$Z,=>0K+":<,< XMO;JSETN5W<V=)+3/SLZB^9C /F9<;=4((5D/_;*>0Z@R$OK+QIKNO7B:><V> XM;GSJ?*:9>+4AQ*5#VFIC7+> 5IMVDOAQFV=<HTM_+<$G;E%LKU4%<$-JF09> XMN$E?Z7@CM2V&%K2:UU)U&!%%;X6>6FW8M;B8]M[_+G^#]5#S!G;'%>JFT]1_ XM>AVN:D;!54K5-(D<E*%5U.N9]2B@GJDFU@-+>I/N_Q#+D[C_KG7+^VM :Y<S XMJY'*S0S83G77.,.AQTOMW]OHOIH%0E+J*.[#6Z2+B\U9$#/ $PJJ698J$^<* XM:?-__O+.KKTUA[>.U<T+O,Y(>TWNSCF+>QP8[\-W_V\]KYLK:V[EEGSY7HZ4 XMO!@(IIB5X0?073&_T7)Q@46'Q)@-!P3JLE44@(#;QR F[FVI[4K6T@^]\N XMMG=9%2&"XB89M%<<'$.E_>U_/)_I %D]" F@M1*7)7(E$<1@DS5R-020A +* XM#N?&C& +059D@9*0:7Q5Y0[@-DI "WL);G(\9#T38,QFB$R 'T.GDP "0N0/ XM*#<RD#\#X'(UH+0MNY75PJ0-;(*<_N<S7&^L&0^8OL%7S81%-[@,;.)26((# XMPB^^Q/' ^\%OYT+.\5ZI("<@_!8VG&GP&VG04LEP\-7IM5[=?QF@9U&VJ(!* XMS.K@8*F ODSA\%>-9?W?[6 N"%B51]1@ )YL;X;^YE:)>?K;".B:H2YFX%W3 XMP'$LZX+BA@0F']P5(UB;\0>)X :HR8V!3># YL7]@8^!@-59<8+_5?Z0"7)7 XM8A69 0L&#'@!+&@&\E$0 10 D+0,X=*!!K4\>H?' *<XN%^/"%2T)SAB:]N> XM(.L%% I"FA(,-D(&A']0(NP>'<+'TZ9,2TB,RM<A"&)'VB3Q1?0Y9X)[XS_ XM9: 8XZ0B)"=>W>P%]\!"FE<O%A-Q&]_@],8XM#,QGWYWV3AF_ITKEOA9>=62 XM[*;?E0?6"Z=D?<@G]0.[8RE=?.9/TO-%S$\PGMB'$)A)_$+E,"(U2"V2]V-S XM2$@LF)<W+5E@7IZ 9-S-(N!,A1*ED!/^!)#Q(#D+1(9\$C>Q'KO@,(:7/1F5 XM58!@YW1>S '_HGD=4?E=]0%$35/5QV& 4JB#+,+"4WWP),I=U91#P66PB2<% XME!%"HMW/D.2T99)(: %OD'HECWVBH&AJ_0EXD-X9!G-)-SC5P4(GH6HAE6P/ XMF4$2IVLX-_Y@5;$%X7SJG8_0X(F#Z=:# Q<2=I(!VP<RU8522!?5##EB[^!_ XMX(@1>4T/=2(@92C0B;\QZWPI($<>)+X].-W2!,=Q5$R0R(.C'?06Z$;XE(@< XM>,Q!6?!MN @OB$A5 V:&ME[O$HA0+KW+5[#2V2>RQ$D012TC=$IQ]2,4*W,? X,>$$00 81P4.@ "@ X Xend SHAR_EOF chmod 0666 shuttle.uuencoded || echo "restore of shuttle.uuencoded fails" set `wc -c shuttle.uuencoded`;Sum=$1 if test "$Sum" != "17714" then echo original size 17714, current size $Sum;fi fi if test -f xhpgl.1; then echo "File xhpgl.1 exists"; else echo "x - extracting xhpgl.1 (Text)" sed 's/^X//' << 'SHAR_EOF' > xhpgl.1 && X.TH XHPGL 1 "Dec 1990" "Version 2.0" X.SH NAME Xxhpgl \- HPGL version 7470a Xwindow display program X.SH SYNOPSIS X.B xhpgl X-cf [color_file] -fn [font] -geom [window geometry] file X.SH DESCRIPTION X.I xhpgl Xis an Xwindow display program that will read a file in HPGL syntax and Xdisplay it on a X server DISPLAY. X.I xhpgl Xis compatible with X11. The HPGL Syntax is restricted to that Xdescribed in the 7470A manual. Most of the commands are supported, Xbut some are not (see supported commands). X X.I Xhpgl Xalso has some added features. X.I Xhpgl Xsupports up to 8 different pens where the 7470A routine only supports 2. XThe color/pen assignments are user definable. All pen colors are read from Xa file called $HOME/.hpcolors. The colors supported are: black, red, green, Xblue, yellow, cyan, magenta, gold, maroon, turquoise, violet, orange and white. XThe .hpcolors file is of the form "pen# color". Only pens 1 to 8 are used. Xan error will occur if a pen number larger than 8 is given. If no color Xfile is found the program will display a message and use internal values. XThe -cf color_file option may be used to over-ride the default color file Xon a case by case bases. X XThe text used in X.I xhpgl Xis of fixed size. That means that there is no scaling or slanting of text Xallowed. To help make text more usable X.I xhpgl Xwill select a font based on the window size. Also, the -fn Xoption may be used to specify any user font instead of the default selection. X X.I Xhpgl Xhas simple commands built into it for controlling the display window. 'z' allows Xthe user to zoom into a portion of the xhpgl display. 'u' Xunzooms, effectivly quadrupling the area shown. 'o' returns to the Xoriginal display, 'r' redraws the screen, and 'q' quits the program. XAll other keys and mouse activity are ignored. X.SH OPTIONS X.I xhpgl Xwill take any font supplied by the user. The -fn parameter is used for this Xpurpose. X.I xhpgl Xwill take only one file in HPGL syntax at a time and display it. XThe -cf color_file option is used to instruct X.I xhpgl Xto use a different color file other than $HOME/.hpcolors. X X.SH SUPPORTED COMMANDS X.I xhpgl Xwill recognize and execute the following HPGL commands: XLT, LB, PA, PR, PU, PD, IN, DF, SP, and SC. XAll others are read and accepted however no action will be taken. X X.SH AUTHOR XOriginal xhpgl program: Randy L. Yach X.br XPort to X11: Andrew Gerber (gerber@solbourne.com) X.br XParser: Dieter Muller (dworkin@solbourne.com) SHAR_EOF chmod 0644 xhpgl.1 || echo "restore of xhpgl.1 fails" set `wc -c xhpgl.1`;Sum=$1 if test "$Sum" != "2448" then echo original size 2448, current size $Sum;fi fi exit 0 -- dan ---------------------------------------------------- O'Reilly && Associates argv@sun.com / argv@ora.com Opinions expressed reflect those of the author only.