Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!utgpu!water!watmath!clyde!burl!codas!killer!richardh From: richardh@killer.UUCP Newsgroups: comp.sys.ibm.pc Subject: Touch for MS-DOS Message-ID: <1655@killer.UUCP> Date: Sat, 26-Sep-87 19:16:47 EDT Article-I.D.: killer.1655 Posted: Sat Sep 26 19:16:47 1987 Date-Received: Sun, 27-Sep-87 22:20:20 EDT Organization: The Unix(R) Connection, Dallas, Texas Lines: 686 Keywords: MS-DOS Touch utility source man executable ----------------------------------- To the parties interested in touch: Here is the source code and executable for a version of touch that is designed specifically for the MS-DOS environment. It was written for Turbo C and uses a number of DOS support routines found in the Turbo C libraries. It also uses the getopt() included with the Turbo C package. All other required source code will be found in this file. For a full description, see the included man page. For those who don't care to compile their own version, there is a uuencoded version of touch.com. It was uuencoded under DOS rather than Unix, if that is significant. enjoy, richard hargrove ..!ihnp4!killer!richardh ------------------------ X---- cut here ----X---- cut here ----X---- cut here ----X---- cut here ----X-- /* touch.c modify the date/time of last write on the specified * files * * options -d date use the specified date instead of the * current system date * -t time use the specified time instead of the * current system time * -v list the touched files on stdout * * compiler turbo c * * version hx v1.0 - initial release: 9/26/87 * * author Richard Hargrove * Texas Instruments, Inc. * P.O. Box 869305, m/s 8473 * Plano, TX 75076 * 214/575-4128 * */ #include #include #include #include #include #include #include #include #include #ifdef DEBUG #define STATIC #else #define STATIC static #endif #define FALSE 0 #define TRUE 1 #define EOS '\0' #define ERR (-1) STATIC char *usage = "usage; touch [-d date] [-t time] [-v] filespec...\n"; STATIC char *credit = "touch 1.0 -- by richard hargrove, sept. 26 1987\n"; STATIC char *optlist = "D:d:T:t:Vv"; STATIC struct date date_struct; STATIC struct time time_struct; STATIC struct ftime fdate_time; STATIC int verbose = FALSE; /*****************************************************************************/ STATIC void fatal (char *msg1) { /* Report a fatal error and terminate the process. */ fprintf (stderr, "touch error : %s%s", msg1, usage); exit (1); } /*****************************************************************************/ STATIC void warn (char *fname, char *msg) { /* Report an non-fatal error and return. */ fprintf (stderr, "%s - %s", fname, msg); } /*****************************************************************************/ STATIC int stoi (char **str) { /* Decode the string pointed to by *str to an integer. Stop * decoding upon encountering a non-numeric char. Update *str * to point to that char. */ register unsigned char *tstr = (unsigned char *) *str; register int retval = 0; while (isdigit (*tstr)) { retval *= 10; retval += (*tstr++ & 0x0f); } *str = (char *) tstr; return (retval); } /*****************************************************************************/ STATIC void get_user_date (char *str, struct date *date_struct) { /* Parse the user supplied date and initialize the date struct * pointed to by date_struct. */ int mon, day, year; static int days [] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; /* parse month */ mon = stoi (&str); /* parse date */ str++; day = stoi (&str); /* parse year */ str++; year = stoi (&str); if ((year > 79) && (year < 100)) year += 1900; /* adjust days for non-leap-year (2000 is a leap year) */ if (year % 4) days [2] = 28; if (mon < 1 || mon > 12 || day < 1 || day > days [mon] || year < 1980 || year > 2100) { warn (" - invalid date : using system date", "\n"); return; } date_struct->da_year = year; date_struct->da_mon = (char) mon; date_struct->da_day = (char) day; } /*****************************************************************************/ STATIC void get_user_time (char *str, struct time *time_struct) { /* Parse the user supplied time and initialize the time struct * pointed to by time_struct. */ int hour, min, sec = 0; /* parse hour */ hour = stoi (&str); /* parse minute */ str++; min = stoi (&str); /* parse optional seconds */ if (*str != EOS) { str++; sec = stoi (&str); } if (hour < 0 || hour > 23 || min < 0 || min > 59 || sec < 0 || sec > 59) { warn (" - invalid time : using system time", "\n"); return; } time_struct->ti_hour = hour; time_struct->ti_min = min; time_struct->ti_sec = sec; time_struct->ti_hund = 0; } /*****************************************************************************/ main (int argc, char *argv []) { int c; int handle; argv = exparg (&argc, argv); /* expand command line wild-cards */ getdate (&date_struct); /* get system date and time */ gettime (&time_struct); /* handle command line options */ while ((c = getopt (argc, argv, optlist)) != EOF) { c = tolower (c); if (c == 'd') { get_user_date (optarg, &date_struct); } else if (c == 't') { get_user_time (optarg, &time_struct); } else if (c == 'v') { verbose = TRUE; } else { fatal ("invalid option specifier\n"); } } /* reconfigure command line parameter support */ argc -= optind; if (argc <= 0) { fatal ("no files to touch\n"); } argv = &argv [optind]; /* encode the date and time */ fdate_time.ft_tsec = time_struct.ti_sec >> 1; fdate_time.ft_min = time_struct.ti_min; fdate_time.ft_hour = time_struct.ti_hour; fdate_time.ft_day = date_struct.da_day; fdate_time.ft_month = date_struct.da_mon; fdate_time.ft_year = date_struct.da_year - 1980; /* touch the files */ while (argc--) { if ((handle = open (argv [argc], O_WRONLY | O_CREAT, S_IWRITE)) != ERR) { /* these can't fail */ (void) setftime (handle, &fdate_time); close (handle); if (verbose) { puts (argv [argc]); } } else { switch (errno) { case ENOENT: warn (argv [argc], "file not found\n"); break; case EMFILE: warn (argv [argc], "too many open files\n"); break; case EACCES: warn (argv [argc], "access denied\n"); break; case EINVACC: warn (argv [argc], "who changed my code?\n"); break; default: warn (argv [argc], "eh ? unknown error\n"); fprintf (stderr, "error code : %d\n", errno); } errno = 0; } } exit (0); } X---- cut here ----X---- cut here ----X---- cut here ----X---- cut here ----X-- /* exparg.h header file for exparg(), the routine that performs * wild-card expansion on filespecs in the command line * parameters */ #ifndef EXP_ARG #define EXP_ARG #ifdef __STDC__ #define _Cdecl #else #define _Cdecl cdecl #endif char **_Cdecl exparg (int *pargc, char *argv []); #endif X---- cut here ----X---- cut here ----X---- cut here ----X---- cut here ----X-- /* getopt.h header file to supporting getopt() */ #ifdef __STDC__ #define _Cdecl #else #define _Cdecl cdecl #endif extern int _Cdecl optind; extern char *_Cdecl optarg; extern int _Cdecl opterr; int _Cdecl getopt (int argc, char *argv [], char *optlist); X---- cut here ----X---- cut here ----X---- cut here ----X---- cut here ----X-- /* exparg.c source code for exparg() */ /****************************************************************************** NAME exparg - expand filespec command line parameters containing wild-card characters USAGE #include "exparg.h" char **exparg (int *pargc, char *argv []); PROTOTYPE IN exparg.h DESCRIPTION Exparg is used to explicitly process the filespec command line parameters containing wild-card characters. It takes a pointer to an integer containing the count of the parameters and a pointer to an array of pointers to the strings copied from the comamnd line. It is anticipated that most of the time exparg() will be called immediately upon entry to main(), with the call looking like argv = exparg (&argc, argv); See the test program included in this file for an example usage. When exparg() finds a filespec parameter string containing wild-card characters, it replaces the string with the name of the first file that matches it and adds the names of subsequent matches to the list of parameter string pointers. If no matching file names are found, the original string is left in place. Upon return from exparg() argc will be updated to indicate the new number of command line parameters and argv will point to a different array of string pointers. Command line parameter processing can then proceed as it would have been done before. RETURN VALUE A pointer to an array of string pointers that point to the expanded filespec command line parameters. The int containing the parameter count is modified as a side-affect. PORTABILITY MS-DOS specific, Turbo-C specific AUTHOR Richard Hargrove Texas Instruments, Inc. P.O. Box 869305, m/s 8473 Plano, Texas 75086 214/575-4128 ******************************************************************************/ #include #include #include #include #include #define MAXARGS 100 /* maximum number of entries the new argv */ /* array can contain */ #define TRUE 1 #define FALSE 0 #define NIL(type) ((type *) NULL) typedef int BOOLEAN; /******************************************************************************/ char **exparg (int *pargc, char *argv []) { static char *newargv [MAXARGS]; char path [MAXPATH]; /* if the stack doesn't overflow, */ char drive [MAXDRIVE]; /* we have less lasting impact */ char dir [MAXDIR]; /* on the static data segment */ char far *olddta = getdta (); struct ffblk fblk; register int args = 0; register int newargc = 0; BOOLEAN err = FALSE; while (!err && args < *pargc) { if ((fnsplit(argv[args],drive,dir,NIL(char),NIL(char))& WILDCARDS) && (!findfirst (argv [args], &fblk, 0))) { do { char *localcptr = (char *)malloc ( (unsigned)(stpcpy (stpcpy (stpcpy (path, drive), dir), fblk.ff_name) - path) + 1); if (localcptr != NIL(char)) { newargv [newargc++] = strcpy (localcptr, path); } else { fputs ("\n_exparg error : no memory for filenames\n", stderr); exit (1); } } while ((newargc < MAXARGS) && !findnext (&fblk)); } else { newargv [newargc++] = argv [args]; } err = (newargc == MAXARGS); args++; } if (err) fputs ("\n_exparg error : too many filenames\n", stderr); setdta (olddta); *pargc = newargc; return (&newargv [0]); } #ifdef TEST /******************************************************************************/ main (int argc, char *argv []) { /* test exparg() */ int i = 0; printf ("original command line parameters : argc: %d\n", argc); for (; i < argc; i++) { printf ("%s\n", argv [i]); } argv = exparg (&argc, argv); printf ("new command line parameters : argc: %d\n", argc); for (i = 0; i < argc; i++) { printf ("%s\n", argv [i]); } } #endif X---- cut here ----X---- cut here ----X---- cut here ----X---- cut here ----X-- TOUCH(1) An MS-DOS Utility TOUCH(1) NAME touch - modify the date and time stamp for the named file(s) SYNOPSIS touch [-d date] [-t time] [-v] filespec... DESCRIPTION Touch allows you to modify the date and time of last write stamp for the named file(s). You may specify the date and/or time touch is to use, or you may let touch default to the system date and/or time. Touch supports the following options: -v Verbose: list the touched files to stdout. -d date Date: use the specified date instead of the system date. The date string must be in the form Month must be an integer in the range [1..12]; day must be an integer in the range [1..max_date_for_month]; year must be an integer in the range [1980..2100], though [80..99] may be used as a shorthand form for 1980..1999. The delimiter may be any non-numeric character. -t time Time: use the specified time instead of the system time. The time string must be in the form [] Hour must be an integer in the range [0..23]; min must be an integer in the range [0..59]; the optional sec must be an integer in the range [0..59] The delimiter may be any non-numeric character. The filespec parameter(s) may be any legitimate MS-DOS filespec and may include any valid MS-DOS wildcard characters. If an error occurs during the attempted modification (such as trying to modify a sub-directory), a message saying so appears in the output next to the appropriate filespec. Touch then continues with the next filespec. AUTHOR Richard Hargrove Texas Instruments, Inc. P.O. Box 869305, m/s 8473 Plano, TX 75086 214/575-4128 [ 1 ] X---- cut here ----X---- cut here ----X---- cut here ----X---- cut here ----X-- begin 400 touch.com MC,HNB19, K0PS2&++@( BQXL ([:HQT=C 8;'8D>%QV)+B\=QP8A'?__CL,S MP+G_?XOXB]@F@3TX-W49)HM5 H#Z/740@.;?_P8A'8#^674$_P8A'?*NXV-# M)C@%==: S8#WV8D.%1V#PP>!X_S_T>.)'AD='K@ -.THOGZ,,1Z+<2 M,\ NC@9, K_B)+GX)2O/\ZK_-A,=_S81'?\V#QWHV %0Z$T'N EQ18+'3 (._Q;8)(OLBD8"M$S-(;1 NP( +HX>3 +-(<.Y'@"0NNT"(DWB\==7U[#5E=5 MB^Q,3(U&"%#HN?]9B_C_1@B-1@A0Z*S_68E&_O]&"(U&"%#HGO]9B_"#_D]^ M"8/^9'T$@<9L!XO&NP0 F??["])T![L^'<<'' "#_P%\)(/_#'\?@W[^ 7P9 MB]_1XXN'.AT[1OY\#('^O =\!H'^- A^#[B%'5"XWAU0Z"[_65GK$(M>"HDW MB\>(1P.*1OZ(1P*+Y5U?7L-65U6+[$Q,,_:-1@A0Z!S_68OX_T8(C48(4.@/ M_UF)1OZ+7@B /P!T_T8(C48(4.CY_EF+\ O_?/]." O =0/IX0"X@ !0N (! M4(M>"-'C_S#H) N#Q :)1OX]__]T)[CJ)%#_=O[HL@]96?]V_NBI UF#/C@= M '2\BUX(T>/_,.@4#EGKKZ$?'2T" #T* '=GB]C1XR[_IV(%> 7 !8H%G 7 M!< %P 7 !< %P 6N!;A3'E"+7@C1X_\PZ.G\65GK6+AC'E"+7@C1X_\PZ-?\ M65GK1KAX'E"+7@C1X_\PZ,7\65GK-+B''E"+7@C1X_\PZ+/\65GK(KB='E"+ M7@C1X_\PZ*'\65G_-A\=N+$>4+BP(%#HOP6#Q ;'!A\= #I$O\SP%#H8@-9 MB^5=7U[#5E=5B^R![,H Z)0'B5;0B4;.,_^+]XEV_H-^_@!T ^GH (M>"(L' M.\=_ ^G< #/ 4%"-1HQ0C4:(4(O?T>,#7@K_-^CT X/$"JD! '4#Z90 ,\!0 MC4;24(O?T>,#7@K_-^AZ X/$!@O = /I=P"-1O!0C4:,4(U&B%"-ACC_4.A> M#UE94.A8#UE94.A2#UE9C98X_RO"0%#HB@A9B88V_PO =!F-ACC_4/^V-O_H MT>.)A^XD1NL5N+ @4+C"'E#H] 196;@! %#HB@)9@_YD?2"-1M)0 MZ" #60O =(OK$HO?T>,#7@J+!XO>T>.)A^XD1H/^9'4%N $ ZP(SP(E&_D?I M#_^#?OX =+BP(%"X[!Y0Z*$$65G_=M#_=L[H;5E9BUX(B3>X[B2+Y5U?7L-6 M58OL3$R+1@8[!A(??P/IS0"#/A8? '4TBQX2']'C UX(BP>C%A\+P'4#Z;$ MBQX6'_\&%A^*!SH&&!]T ^F> (L>%A^*!SH&&!]T$8L>%A__!A8?B@>(1O\* MP'4'_P82'^EZ (!^_SIU ^E^ /]V__]V"NA7#EE9B_"+Q@O =&M&B]Z /SIU M-O\&$A^+'A8?@#\ =1N+1@8[!A(??DV+'A(?T>,#7@B+!Z,6'_\&$A^A%A^C MMB7'!A8? #K&8L>%A^ /P!U"O\&$A_'!A8? #'!K8E "*1O^T .LK,\"C M%A^CMB6X___K'L<&MB4 ,<&'QT3 (,^%!\ = BX&1]0Z&()6;@_ (OE75[# M58OL@SXR'R!U!;@! .L3BT8$BQXR']'CB8>X)?\&,A\SP%W#58OLBT8$B]2! MZ@ !.\)S!:,C'>L)QP8?'0@ N/__7<-5B^RA(QV+5@0#PG,$"])Y$HO(@<$ M 7(*.\QS!H<&(QWK"<<&'QT( +C__UW#58OL_W8$Z*G_65W#58OL_W8$Z+W_ M65W#58OLM$.*1@:+3@B+5@3-(7(#D>L$4.CG!%W#5E6+[(MV!@OV? 6#_A1\ M";@& %#HS@3K#XO>T>/'AZPA__]6Z 0 65U>PU95B^R+=@:T/HO>S2%R#-'C MQX>L(?__,\#K!%#HFP1=7L.Y+ "0NC8@ZPFY*P"0NF(@ZP"T0+L" ,TAZ>3X MQP8A'0 R\-5B^RA,A__#C(?"\!T#(L>,A_1X_^7N"7KZ?\6CB#_%I @_Q:2 M(/]V!.B'^%E=PU9758OLBW8(BT0,.\9U.H,\ 'P2@WP& '4TQP0 (M$"(E$ M"NLHBWP& SQ'*3Q7BT0(B40*4(I$!)A0Z) 1B^4[QW0*@4P"$ "X___K C/ M75]>PU6+[+1&L#O&=:(+_W0>1HO>@#\ = 6!3JP( /]V#%:X00!0Z.[^Q@0 M3NM-"_]T ^EY_T=&B]Z /P!T!8%.K 0 _W8.5K@( %#HR/[&! !.@#P ="2 M/#IT ^E/_XU&L#O&=!7I1?\+_W0#Z3[_@4ZL 0#I-O_I,_^ /#IU&XU>KX _ M '0%@4ZL$ #_=@J-1J]0N ( 4.A[_HM&K(OE75]>PU6+[+C]$E#_=@3_=@:- M1@A0Z",+7<-658OLBW8&5E;H?PI94/]V".@U!PO = 6X___K C/ 75[#5E=5 MB^R+?@B#Q_Z+-C@BZQ6+1 ([QG<+._YW%8M$ CO'=PZ+= ([_G;GBT0".\=V MX(L% \<[1 )U$HM< HL' 06+7 *+1P*)10+K!HM$ HE% HL$ \8[QW4.BP4! M!(M% HE$ HO^ZP.)? (SP%#H.OQ9BQ4#USO"=1F+]^L#BW0"BT0".\=U]HM% M HE$ E?H1_Q9B38X(EU?7L-65U6+[$Q,BUX(BS>+QHE&_O=' D = 2+QNL= MBUX(BW\*B\9."\!TB]]'@#\*=?'_1O[K[(M&_HOE75]>P@( 5E6+[(MV!E;H MQ?Q9"\!T!;C__^M7@WX, 74>@SP ?AF+5@J+1@A24%;HD_^96UDKV!O*B4X* MB5X(@60"7_['! BT0(B40*_W8,_W8*_W8(BD0$F%#H$0&+Y8/Z_W4*/?__ M=06X___K C/ 75[#5E6+[(/L!(MV!E;H4_Q9"\!T![K__XO"ZS:P 5 SP%!0 MBD0$F%#HT@"#Q B)5OZ)1OR#/ !^$U)05N@3_YF+V(O*6%HKPQO1ZP:+5OZ+ M1OR+Y5U>PU6+[+0JS2&+7@2)#XE7 EW#58OLM"S-(8M>!(D/B5<"7<.T+\TA MDXS"PU6+[+1$BD8&BUX$BTX*BU8(S2%R#(!^!@!U!(O"ZP;K!%#H @!=PU97 M58OLBW8("_9\$8/^6'P@( 58OLN !$BUX$S2&X !R!-'BT=!=PU6+[+1"BD8* MBUX$BTX(BU8&S2%R NL%4.B0_YE=PU9758OL@^PB!HM^#AX'BUX,@_LD=UB M^P)R4XM&$(M.$@O)?1& ?@H = O&!2U']]GWV(/9 (UVWN,/D2O2]_.1]_.( M%$;C">OQ*]+W\X@41@O =?6-3M[WV0/._$Z*!"P*P@P 58OL@WX("G4&BT8$F>L%BT8$,])24/]V!O]V"+ !4+!A M4.A>_UW#58OL_W8&_W8$_W8(_W8*L !0L&%0Z$3_7<-5B^S_=@;_=@3_=@C_ M=@J#?@H*=06X 0#K C/ 4+!A4.@?_UW#5E=5B^R#[ 2+?@@+_W1>B\<%!0 E M_O^+^*$X(HE&_(O8BW<"BP0[QW(HBP2+UX/"!#O"=PN+1 *+7OR)1P+K"BD\ MBP0#QHOPB3R+1ORC."+K)#LV.")T"(EV_(MT NO$5^@ ^5F)1OX]__]U!#/ MZPJ+=OZ)/(O&!0( B^5=7U[#58OL_W8(_W8$_W8&Z < B^6+1@1=PU9758OL MBT8(.T8*GSI7,% _ #^*3\75]>PU6+[/]V"/]V!/]V!NBF_XOEBT8$ M7<-5B^R+3@2T/(M6!LTA<@+K!%#HG?U=P@0 58OLBUX$*\DKTK1 S2%=P@( M5E=5B^Q,3(M^"O?' ,!U"*'4(24 P OX]\< 74#Z8 H=8A(48,BT8,J8 ! M=0>X 0!0Z%'],\!0_W8(Z$CX65F)1OX]__]U*_=&#( = 0SP.L#N $ B4;^ M]\?P '0K_W8(,\!0Z&S_B_"+Q@O ?1/IE@#WQP $=">X4 !0Z ;]Z8@ 5NA% M^%GK&_]V"/]V_NA!_XOPB\8+P'T#ZVR0ZT['1OX %?_=@CH90!968OPB\8+ MP'PXL !05NBB_%E9J8 = :!SP @ZPKWQP "= 16Z!G_@W[^ '04]\?P '0. MN $ 4%#_=@CHF_>#Q 8+]GP7]\< W0%N 0ZP(SP O'B][1XXF'K"&+QHOE M75]>PU95B^RP 8M."/?! @!U"K "]\$$ '4"L "+5@:Q\")." K!M#W-(7(4 MB_"+1@@ @(O>T>.)AZPAB\;K!%#H-/Q=7L-658OLH1\=.P: (GT."\!\"HO8 MT>.+MSHBZP.^/R16_W8&N$TD4+BP(%#HV_F+Y5U>PU95B^R+=@C_#/=$ I M= /IM #W1 (" '4#Z:H @4P" &#? 8 =">#/ !T#%;HB?=9"\!TZ9, N/__ MBU0&*\*)!%;_=@;HCP"+Y>F' (,^6B0 =3:XHB [QG4OBD0$F%#HV?M9"\!U M!8%D O_]N "4(5$ G0%N ( ZP(SP% SP%!6Z+<"B^7ID?^ ?@8*=1[W1 ) M '47N $ 4+A6)%"*1 284.C4"8OE/0$ =1>X 0!0C48&4(I$!)A0Z+T)B^4] M 0!T"H%, A N/__ZP6*1@:T %U>PU95B^R+=@C_!'TTBD8&_T0*BUP*B$?_ M@'X&"G0&@'X&=17W1 (( '0.5NBS]ED+P'0%N/__ZQ"*1@:T .L)5O]V!NCA M_HOE75[#58OLN*(@4/]V!.BH_XOE7<-65U6+[(M^"(MV"D;W10(( '083G1$ M5XM>#/]&#/\WZ(+_B^4]__]T,>OH3G0L_P5]%8M>#/]&#(H'_T4*BUT*B$?_ MM #K#E>+7@S_1@S_-^AX_HOE/?__==&+QEU?7L(& %95B^R+=@965NC4 EE0 MN*(@4.B)_PO = 6X___K&+BB(%"P"E#HQ?A=7U[#5E=5B^R+?@Z+=@B+1 P[ MQG0#Z9L @WX, GX#Z9( @?__?W8#Z8D @SY:) !U#[BB(#O&=0C'!EHD 0#K M%(,^6"0 =;B4(#O&=0;'!E@D 0"#/ !T#K@! % SP%!05NA*]XOE]T0"! !T M!_]T".A?]EF!9 +S_\=$!@ B\8%!0")1 B)1 J#?@P"=#\+_W8[QP:.((@< M@WX* '485^AV^5F)1@H+P'0'@4P"! #K!;C__^L9BT8*B40*B40(B7P&@WX, M 74%@4P"" SP%U?7L-658OL_W8(Z%T 68OPB\9 4/]V"/]V!NBL^8OEBT8& M \9=7L-658OLBW8&B@0Z1@AT#(O>1H _ '7Q,\#K HO&75[#5E=5B^S\BWX* MC-B.P(OW,L"Y___RKO?1BWX(\Z2+1@A=7U[#5E=5B^R+?@B,V([ L "Y___\ M\JZ+P??02%U?7L-65U6+[/R+?@J,V([ B_#(O+\JXKV8M^"(?+\Z2+ MR_.JBT8(75]>PU95B^R+=@:+QK0 B]CVAS4?!'0)B\:T 4@ .L$B\:T %U> MPU6+[(M6!+D$#[ME)/R*QM+HUZJ*QB+%UZJ*PM+HUZJ*PB+%UZI=P@( 5E=5 MB^R![(@ QT:L #&1J]0!OR-?K")OGC_B[YX_XMV"JP*P'04/"5T$X@%1_Y. MKW_OZ Z1($Z^?IV@.)=H2L/"5TY8F^>/\KR8E.@HA.@(A.@<>&?/___\>& M?O___^L!K)B+T). ZR" ^V!S18J?=22+PST6 '8#Z88#B]C1XR[_IUP7HQ>- M%^$7F!<%& X81!A,&,L7>!A4&%@87!C&&',9%!DS&:Z-3H8K^8?/BY9^_SO1 M?P*+T>F. (EV"HB6>O^+?@B+!8-&" (6!XU^A[0 B06Y 0#IJ0")=@J(EGK_ MBWX(]D: ('4,BSV#1@@"'@<+_^L*Q#V#1@@$C, +QW4%'@>_7B3H #IF@$[ MCG[_=@2+CG[_ZVJ0B78*B)9Z_XM^"(N.?O\+R7T#N08 5U&-7H=34K@! ")& M@%#H__F#1@@(%@>-?H?V1H (=!6+EGS_"])^Z Z4H!*]%^ XE6@HI&@0K M=!(F@#TM= Q/@VZ" 8-6@@ FB 7H #I) &+]XN^>/^+GGS_L 4B1H \!74R MBJ9Z_X#\;W6#?H( ?R/'1H(! .L<@/QX= 6 _%AU$H!.@$"#ZP*#;H("?07' M1H( -.@O9&@ )U#^L)L"#H #IW@!+.]E_\_9&@$!T$K PZ Z,2)JR(!4?^3J]_!N@ .F' .+N"]M^#(O+L"#H M #K:I#B]NE&_(EV"HM^"/9&@"!U"HL]@T8( AX'ZP;$/8-&" 2X4 J1J\# M1JPFB07I%_R+=H2+OGC_L"7H #K*Y"L"L!U]8!^KU!]!N@ .LHD >+1JSK M29!7N?__L #RKO?125]8!0, _^"(!4?^3J]^!E@% P#_X%-14@:-1K K^(U& ML%!7_W8,_U8.QD:O4 %^K(U^L =:65M8!0, _^"+Y5U?7L(( %9758OL@>R* M (M&#$ ] @!S!3/ Z=@ BUX(T>/WAZPA (!T$O]V#/]V"O]V".C% (/$!NFY M (M&"HF&>/^+?@R-MG[_"_]T94^+GGC__X9X_XH'B(9W_X#X"G4$Q@1&BH9W M_X@$1HV&?O^+UBO0@?J 'S/C89^_XO6*]")EGK_4HV&?O]0_W8(Z&@ @\0& MB89\_SN&>O]TI@O O\+TG8O M4HV&?O]0_W8(Z"P @\0&B89\_SN&>O]T%@O 'K"$ "'0/L )0,\!04/]V!.BZ\8OEM$"+ M7@2+3@B+5@;-(7(/4(M>!-'C@8^L(0 06.L$4.A!\5W#5E>_ @"^E"#K$/=$ M @, = 56Z.7L64^#Q@X+_W7L7U[# !4=7)B;RU#("T@0V]P M>7)I9VAT("AC*2 Q.3@W($)O !\ M'P > !\ '@ ? '5S86=E.R!T;W5C:"!;+60@9&%T95T@6RUT('1I;65=(%LM M=ET@9FEL97-P96,N+BX* '1O=6-H(#$N," M+2!B>2!R:6-H87)D(&AA2!O<&5N(&9I;&5S"@!A8V-E2!C;V1E/PH 96@@/R!U;FMN;W=N(&5R