Date: Sun, 21 Sep 1997 14:25:33 +0300 (IDT) From: Eli Zaretskii To: DJ Delorie , djgpp-workers AT delorie DOT com cc: malcolm AT manawatu DOT gen DOT nz Subject: Re: [malcolm AT manawatu DOT gen DOT nz: Fork source code.] In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Precedence: bulk On Sun, 31 Aug 1997, DJ Delorie wrote: > I still have a fork() implementation from > that nobody has commented on. I have looked into this over this weekend (but didn't test it in any actual programs). I attach the uuencoded ZIP file below, for those who don't have it, so that people could look at it more easily. The code seems very interesting and fairly simple at the same time. So I suggest we give it a go. Some comments/questions: 1. The documentation is missing! Most of the *.txh files are just the original ones from DJGPP v2.0. For example, fork.txh says that `fork' always fails. Without updated docs, it is very hard (at least for me) to follow the code, since the code doesn't include comments, either. Below are some points that I couldn't figure out: * Since the implementation is built around the signal support, any call to a real-mode service stops the threading. This is a Good Thing, since DOS is non-reentrant, but it also has two drawbacks: (1) Even harmless BIOS calls will stop the threading. (2) The usual Unix-style fork/exec paradigm will not work. Moreover, it doesn't even emulate the synchronous `spawn' call, since `exec' exits after the child returns! The latter problem can be fixed by a simple change to `exit', but the fact that we still need to wait for the child to exit is unfortunate. Is there ANY way to work around this? * More generally, what, if any, are the potential problems and limitations of this implementation? What should the threaded code NOT do if it doesn't want to risk crashing? * Charles once told me that there are many bugs and subtleties in the way different DPMI hosts implement functions 0900h and 0901h. This code uses these heavily and seems to rely on the fact that no interrupt will arrive when the virtual interrupts are disabled. Will this assumtion hold? What, if any, are other implications, for the case of this code, of whatever problems there are in the different implementations of 0900h out there? 2. The changes were done to an old version of the library (pre-v2.01, as far as I could see). They should be merged into v2.02, or at least into v2.01, otherwise it is very hard to try them. 3. The low-level changes to crt0.s and exceptn.s need to be reviewed by somebody else, as I don't understand enough about subtle aspects there. Charles, Morten, DJ, Bill, will you please do that? 4. It is not entirely clear to me how large is the stack that each thread gets. Malcolm, can you explain? 5. There are a few functions that pollute the namespace (e.g., `stop_threading'). They should be renamed to something with leading underscores. 6. Is a POSIX header? If not, why do we need another header? Isn't it better to put everything into , where `fork' is declared? 7. It seems that if you compile the code that uses `fork' on Unix, it will work in a way that's different from what you will see on DOS. If so, it might be a good idea to define alternate functions that make multi-threading possible without using `fork' and `wait'. 8. We need an emulation of `pipe' function, to make it possible to compile Unix-born programs that use fork/exec. Any takers? begin 664 fork.zip M4$L#!!0 ( &5S:R!PS YSBQ$ /<\ & 0U)4,"Y3M3M_<]LVLG_' M,_X.N+:9VHWL2+*BV.KKW22VTZ>+8V#L;$PN_DDN6%94*>L1 MSA AT YO_GXK^GUK\?R>5)4)&:"IADG/[W$SY\A!0$(V0B$]86A(:1445I_D< M\,]OWKTC"T9C5FFHF!/X:,(Q%50>=I7E2'&ILSB>\)(C !8WNR0'GL+.0D:1B+#9P_U.(!:OX MWPEYDV6DSGG)HC1)64PJ-D^YY DG"_J9>:\^TZQFG*0YD+[Y3L%&Q7)(@X.(^8WF/C/QG MHBC;SQ2^_S2([^9E&824LX#&<<4X[P0P(@FR=)D*#9(A#,HK".ND1T[ETY<_ M6:R8!S1+*2/6%584':SE_^6EZ.Q@#UR6G];?]/;9.Q?9=JK=JEQK2W:4][*(H[H.3T]18!2*BG8 M6JB_YED19F @E;R$?Z#XGE6UGR1D>?:!6HEXTR0YW(53I>,4(ZO<8FR*"49 M>.5 XF7\@T9$6"H1%L4E6"5/ #-"5T;TY'BZ@/\BI&XT*=3[$+]S8N56F19 M?):+_,# HGIRL3CU-D:SC+R=S?1:HB"@+#YF'@->M):/>!WBCN.T>;0N*GQ$ MUSW\OR'^!]!)4DD>?:@BR1< _,-086O(./TL#WLEV0T*R^76A=X.XD19+/]? ML1+P1<$S5\70[C!L7?]^=46T$X#X(E AT DTB(GDD\7'S],":_+4C)2;I7=:@K/#MJ_YK^1+?'<.927\]'L&:"9^X4IC=_OYV>OWN)OAP M^>'FMW\%__OF^N+J$NCRU!%"B$((UXX^W20)R+D/VK%D2Q)F173O"7A AT I:%0 M9A*^R!DIZ9QYD* ;J$.P7\EI AT FD;R64D?D.@,$V.3%3 ?MFDO@\(%(F.QH6<2,1#3+0AK=.0J*-L(T1 AT 6Q #P3H(4( M,8H :>$B#262 SVQRX)-;$3%AIW&9C;V=09+9)9,!+N7 I*Z*,T0J%+%E,TZRNE)"'D\YY80KW)LB("V^;%DI&+FQE121.11R!143ZH/#VL[LF"926KE#:FXMAS-!MI M4N/I),"7%03?TP-X. F+XUD@]<"*S3L<6IWU>3\Y[&N;8<)CU30KT8-YR$^#D88^EL7+L"3_H6_)7U)"@;?QZJ%2' ;:" \\G92L&+@D1%S%Y6C,9&?SH3.H5K- X);.?7H".(^$'1 M+U8\(6V)B=&&#/@WRJ###9Y.B,;<630V]!J%2IWXWEF.=O!S?^]L0E1ZJ!X> M "&P_3LI^KX.9&3C+8WCQL'A+NZ6I80Z"_?W!OV)_,O-%C;X-^YU.4#',CJ; M HY[VP+Q8FC\OTX ;2G?) 73/!4IS2#R AT Y DOT 0LG^)$> SK5+(W9W\P:TY AT F"U MH"* C"&@EK*/+V>WD[?7 6SZ1^732;NJIN[4%PN4[/2 M2JY;,2^S04>+-:DZDW*]/<+6)8L$)V\_32B2"A4?], MRB?RU'MVGY9.)JV<01QA46$(JG),HZMS&1>MBA"H[G#/6CM5_?IMA48'V[;: MRM9UG"@$R8#I3JDL )Q+9MQQUYX\"7:<5.X(%&MCGV:9#3>#=O0T?IBU_;#4 MKH)YJC(51Y!_- 5UTQVP?R?<1BM\OB.:Q=P6_JT/1K(@ M=4D":,T%P)Y Y1%<5'4D3.9H\PFK&M/K]Y>7'[N,GKJ=(6XG2W-&*^/%MFYLTWFW MJN;-G#(B>=$T3MNU8'LWPS%1W#&-U AT 2;K;BW34-H1T?8QVE[8_UU/VGVUBZ) MME3NMNY71D:KN91] MD> WL?):81[)MH9"54Y;=C+9Z=:Z$C%8Q-43W78Z M&MBC,]!'X_YU%N$+KE7&QFO'0:BM;Z3T?+.-PSRZN# M]:%*P=:8?_VLOMB,F,I'8'FV%,!&,D4>J(T^.Z99.@)D]'!][D*.6DKEORSY@)C"55F\4#B-,Y_%*3.H5,/ MQ] 9F#E[EV<[W*A8E6/S%-82:+7)$/MBYG0(JV44DJ8!J"Z!36TOWW6;I%5(#;36;&NUOJL8TY4_-%>\FQME=L+3#B])"9=]FY?]C9 6-?1B<*0?Q-W*3Q9 AT 38ST)4P[!EJ7K/91! MOI8L'4^(3EQ/6ZL=P+=#M\R2K!@V3WGJM\Z'G5V=UZ:Z>KR8PZ7O_066W/FR[X*[RN*OMX=:@ M?JO&Z?JGW,YSFB7\9*J]%VZ=2 AT 1.)@(]J'T4H8@ M*=[JC)'HC/'OOY!!?SARAU?&>SR/N=/=:TITF(5 % 0>0;2+6 QY-PXSWG[Z M1=^A.)_]3&;3%Q=3\T"=\&=RT* M<=@%M:'"ARV5,;.+G6U4=X;W%P1GS/'U185=C80>&2'?=L'8L;7<\[YS T(C MK5A0,5%7>2 *1(8Y4!8CL=:=B=VM!@3>WW,*]HD:7JNV E\4=1;#C$P'4EV] M_*RG*AR'QRPF1>YZ7COHW#)<>3'8'0\')XG;_$V=+['[Q,FU<5>_K+VI)T^"57P8GT/V2$@#,D0V0'XM2)>'5O,8K1$HS M= F]OQ=6]WCQ (0W03\D['1?Y]R! <)[)]X3JQ4N(:]*U!9'*^?V"""=]3" =( M&O*?99V)M,P8^0*="V#$H03/?S2C(%!;HF:"ZM-SAYGG,.CB),(=.Q-Y[TA< M1&YFJ]6B%AHM;"4G+JY[ST/*J5-XGNP<@:C2+8N BJ7I%G?;;0BBPI/U(6YN M6W"*XDE:]6ILNYN[G-2.?FA[6=S=702-:K+Q@=P0A-R(]PAEZU2FC_D_.W!0 M+:T?!0GQWA[ABTI"PJU#);&0:8GE1;2@^9QMN2[VWY<#V)-OZ@'=AL>RKJ^[ M*NZ #6O7HLYCZ*V)@HQ'[]T[%WI4KQHR??=N"&@ :=%RFG5 AT S4=*SEA*4:%[ M5$_/F)P1-/9.U!BG<1/*'3^633GIGJG\G<:UMUVXR*/Z29T]K"O#;T2U-.=X:PIJGJDM3S[;BCQ/8()O"CD4[FWK&&;B9YR#7 M#L'-0&+637E1;0.X8JIWM'-;C6^42_94?M[$1EO0@&E(&M""?-K$"B3<&EN# M?JBW7@>([R8"(R&O8]8Y./($WZP&$!LC:5 AT SW$8'5MN8\3J!\G&/X]ULLS'2 M:99U7I>U'58'T;V*\)C. B5O,+#%]&>VL]DYSXE9I(_>A:UL*2]6/32MQE"Z M7*4*@Z_458[SNJH AT A DOT L^!5Q;0-N$#BEA>-FUA^U8FBL/;;U<,X_T6+JQM3=Q M3.A2/(D'8$5%E<[=C.8O<,*M\=#FGG$CGL_T'&%WJ_YKG9C;Y!@\DAEW<>L& M&&6IW44M;]!D'M^D;X"]TB-F_7?D)NCM<*"H7GDEBW;N:'0[[,LE<,U6! QX M2Z=_MYU;3D/.!Q<-X=]_:/XP,DHV?-;NF7 7\.X4:[21Y^^N&U%3<,=[]*<9MOO]^S.\H#AA6A2#AK?U3ALT;U;Y:?SYKN.$K/IY&)* M%LR9'7YMQU'%*-7S\T/.T'W8\'[4/-5.P7;VGM &'/9'?=G#R?M9+*C4LO3B+@3NN5^^VZW=I:Y_S3Y.(3E*YVG:??47WLROB) M=U/UT=->=)W6WC9M)X9?1=B]X-IEKF84TQB4M]K)I+7>ZZ>MAZ[C2C='.NXV/I[D=OSL(V>K#*[9 U:LF];M7W]8.]KB;YPX;G\6XN5X$#A(5-3Z M]W]6_!UW*QK>C;;PKF%2S&@<,N;\_J*_-L^\ZPAP$1FX,<(PYV=;=62]EN1:!,P:0V6:%30 MB6P_LY?]I]?!K^>_W?8;C AT 4:!,'M*,CK7/\_4$L#!!0 ( +AP:R ?]W&A M T "PH * 1%!-24580U N0ZT::W/;N/&S,Y/_L.1 M6Y\?B7JVHUK*]:9IAD.1H(28(C@ *[V%UP M?QM.67+/Z7B2 AT G5J0_OHZ-#!WR_A=.+QB @8>'$P]>(8+&&>_NI'E.UQZI,] M$F3VTR<;YW.?)"EE,4PD3$3C,0)*B!D' 0=QUX$(DL2QE,U=/:W]_T^ M_'JPUY($AA,)*%B8WGF,A,3 M):F< ?4CC7Z!^A^@?< MIL0:#,_.;V[NU#.O4,V'I<%*/#F9 M3*F;>$' "TBTFA2Z@]HVQD)V3Y_0E,TM9#5S%,>(Q/;3)_]^^@3 P"FKC[+P M\]&7#MI1R9 E:",OBU)(F3+9]:?+2Z$, AIE>Y1 %Q%W7G=P\&Y"(P*69@ @ M66PHCH&$FL$6M%]V<&@&Q\==.%3/FD0 ._"\]5R-T!"L ([A",/)#?U!/ -?RUWD%&RTW;@]:XET:2\-AKA6T534DK4 M+NXI-V6NH&.E,352*.N.IO[$RL?4^J0B/$'@Y=OB\4WY>%0^MMN5YX/*\XO* M\^%;7 \G:29M/.B]'YR__[533+=*R,,*TJL&TD7_O,2I<'W1@!O>G/1+P->- MV>N/%WK6;(&WVC)Z\=!%OW_]TBZBVX=_*#NG#$+OED#AG##SHHP(F'@\\%G0 M='?<2AL;3=DW@$12I :W-W8==MB[NED)? 1__ &5@?:H@=V['JY$?MWD].'F MK !ND+F\S'=>=3=IOQ,3=N?Z7A2Y(?>F1#N_V4M%P-V>C1)'_79C?4B8Z M-8 AT 9H8D:00U/O7FWI5PH3[L,NX8C386C8HNHDP! M(LVN;#[BQ+O5(4H**U&W%>D=:-MZ Z ^:JO>T*N>E6O;,*HVQ MF.SO2=LBJ M7><%\ T*72/MS69L\EDL4A-P2[7$TB#B\Q?)26VHS3,ZHP)=;G0/_R2<;3IZ MF(RRL7F^ONJ9IY^1><)HG)J!CS/"PXC=Y?,LBP,!IQ/BWYJA7CSS(AK QP0= MV0R>LH0SGPC!.,0L!6_FT0C/XYP[R^0+7& (68+")%>>Q0T.P\' C S(>$KB M%*XEZ3XG AT A3R#E+]X>] MC]?NZ<=/UT.P3!;7,+.]OWS\<^N+;2_$G8"Y:J$T'KN2"Q435\(*J8!:"*IM MJ[@>NMHX$GIA:FTDF)EYGRF:_CR)PZW#.,^+-.RJ^_KDU;[UI'8 9'RB,126OO_R'N5 MSN8TM7;;=E.O[Q;V V[5,D"8'5"JLO T96>$\76I];"O33UQ"UM2GE#^=/*< M+$=7(B+Y#:4#1Q-&'6@%%( .'&J]?"N5G1\_Q)N7& ^IS)L7*M,J)Z,U,4<+ MF/Z:F/X"9K F9K" *>AZF((N\%P3,VA@*O6.DC65E"P(O":F:&+Z8BU$7YA] MD>,%Z^$%33RR'AYIXH7KX85-O/%Z>.,FGE@/3S3PBB0-H)GB&Z AT R2J@\+KU/ M2$!"W12PM@>J$_4!VW:$VX"%IEU-+FKSIH_G1E2DGP>]]U7 MV((Q+98:GJ2F7E49*Q^=!MDPB_T\$ZC/I&1JZHT0PQO&-I6Q5JI#]_SFI AT IR M#%JR56!(4 AT I:70JB[4);'XK+)B0\RJCF#4DCV8K<6!')<^+-DY]OAA?]<^A= M7@+6TPB]RHM_KG__]4V_X:7#3EO\.L.C%LGA364.U M!+A'!&=NHMD<]ES!)1Z4>5 AT 9Z!X>MHU?8S%"OQTUS MJ1*XGI_][ 7YBB<:RLDSM3&3VJ@;M&2.#% K=M7C6KF[J?8M%U#'HT(*DDY(Y:*B;"J,50F'BG; QPWK MJRN2U/5%A"YW%JU4E'2U>L M\FO-;V,^QNGGAG8Q9B[#P+Z^!%\QBS<&RV:YFE6-?#GMJ <^]4>=>DM =_H9 MNR78\FXMDB%CH8'PJ6,\Z\8X1\K&8[S_.[F\!/210KOH1I_P1L3CV)@!<2]2 M,E7^)QQ5ZDCEYY=SJ[Q"4Z^YQ!)5%IU&6CA*R+A%NZT.4'C7W,-R<&>GC$"& MX)BDI1-61#";3]T=(5$'MO1D$7(I5O$'&/ L%^_A7',5X8:1)U6W!>[IS;#E M7ER>O'>OKWHNMJI/+FT5C AT US\;W,U>ZA7TSU6!TJXD/E>J&V0NPTD4 U$5QU M;\QQ:H:_26)6M% S,^)5-U98W7 MD?*Y$2 AT JU\,SPN]#RD5J9#$Q!"RJ[*'"B$Z"\^BQ44MZE=\MSTL-M?UM\.1B MS@:5R^*["8GQ=)+2&4T-<>:Z AT M DOT V0R>!<)Q,SB5MA!^ M/^#FPSOEU88-6TLODCM5PF9WO FFL[V7WUS9D)?2:IB%H2#IBX/J;4Y%JL6/ M ;[KU%H1\W7M=$WN]"VFRFI(6F3O=<%V\$);(:A\5_[%$UQIG(6 W6>('?@Z M38R)OU5B:+%JR=N$^.I00S75D^ QQ50^@'BPL:Y\,)?F$9J5SR8:/=KO))!_ M6;'1^*"D]:IR$C]&#+_!Z)@R=WC6O^H=O8%1-C96^J[S]N!%XWC\MOX.U!]_ M?.#."-R?YB$XC=7^[B.7F M+*_&]I8RDY>J"G 54\USJ)[S3+7J G)2+K:\(*I<'.$UD9)-@R]\E;3R)B AT O M&%0'I[P33UT_Y9'KZR\[8HP4U=I0TM>#DO1/5AGPY%R1?1:=?ZO WZA\JE,! M[<)_VA4/60[U1WY8FW*[$$&OX+]02P,$% @ _)IK(-2AZ#B5#0 WRP M D !%6$-%4%1.+E/=6E]SV[@1?XYG_!TVN:2U4T:69-FQ>9.Y.K*=:LY) M/*;;2Z?-:" 2DA!3!$N EISIAR\6 $F0HF3G[JUZB,,E=K%_L#_L CQX#4.> M/F1L-I>P-]R'WNGIP,-_CV X)UE,!00DB18D26!/V/_]-8P9[V0LI!T:Y?N[ M._ :;N=,P)3%%!;D84)AFE$:/T#$A,S8)).R&$ T?BN7JL*0 #1_ZE>G1X ME:B!,UL0P)&KW,W-\//Y!1RY\KX,+ZX_?88C1\KUS<4_%!V.%:^*ZA5-9G(. MQP.8/$@5Q#3.!20\>9,+Y?S+Z[]K!S_K1$02_$MB-DO0I\\Z<<@7"P"@JY"F MDO%D+"0)[SPXZ7:[&)1G'4E7LN*"6BQ0M]O1YT_CBT^W-__<2_+%A&;[@+]_ M*YXT%_,8#!5^+JC?%FEMQCE)HIAF9K99S"_A=AK(_;;B(=MQ$$;\:B->-Q&?-M&/&DCGK8JWVY2JTV]5J-Z MK5;U6LWJM=K5:S6LAY;I]:CA(>01!?Q+XECCP0-(MJ#J/U7H AT 8=AG AT E@"<@Y MA<,^3)B$-..2AI)&NSL_OT80H5I8!Y1 AT ZC#;=:7FP'6FYN!&C%[!>K1Z56J@ MA:D1!&(>WJG1>A AT LF9RK^27-LCR5 C$,%U.D^,]Y\F<),E.*[.6C+[9?:_HI-5]1 )]?]G'<0IZ*[Z%*H?;D^!;Z J7*03@)==#Z8\"S%X MS[Y12+@E8U159$?/!.]EY1D>Z[W!E- M8Q)6.(R2*D5\P[]4_*'P2VCB>38^#SQKKYG AT 97?5ZZI?85,Q 9,"OM.,*_.6 MZEU,9L"27-!29^2MX;.D7NE6GJK7Y\$>/N^7A(OW7YH4HWY)+8P6S,,] M(?U\G3Y)/0S\&IVL/-RXU^@ATH?K] CIYS7Z4NN#ZC2I4T6]7*/.%/5#C=J^ M;VB/C5.9>5K/AM)V+RW$: +-#2$,24)$ D2 AT 23E+)&>@(0A%<(LHE) KX]VIONMGK#51\.AO>-M+*/F M2NAWUX=CL'#TL!FL_F";; V/)0=)(@T)JRFN?C)W$UP%*@.989KJ_'$RQ\@J M)JIXL#[-J) \HZ7K"\];Y4ZV*1!!4RZO(Z"A=,&>1IAD/>U[I M[4+-Y9PJ!257NLH\2TK+#.!XI;OMPAW.23+3XWF>X49'8FN:LM&*F&9\X>RB M>Z:$-Z-*\GYMIDB AT RU<5,/?Z7 AT U0K+8F;Z8DCR7\8B1\H]";&D;KC<)1YJ6> M=\SO=G=Z/K2!77CWEQ.-FD4\ZJZMI!62?.T)S"_L-72"5=8*F>6A;E:=]0W#WE>&!J=+J2 M&=$IB^T1UL6UE8L87+>Z)&^#N6J-]8X]#<'H_SC2D&3!1,3.6BQQVZQ=J&^? M199D="9<_L/2A,TM894@!]X6#S7YE<<^ 8&T[TQ1GQU-2 M:K7"7_H- S0DV';(&&"GB&K3H4:QBGZ12EAW2 AT Y3MH(IN7,6D:=;TDBY)>,/ M%LPU[*MPG ?8$L.[=V!*@.>V]2I;KJ)@<0LDXA1(QC/%0_3DPL;=^HPBID:H M .^>LP@$^TXAS2A:I5F?*CP28ZVZ5VCE;N16:S'/&JO.1/AE=]7M=D\*#&&) M!$T\[-5F#*@$06<+JM[KN6K!,K,6#Z'[H*56D=-UO\&^C.<2&U5E,0(L%8(* M( 429O0_N8IB 07#HLT820CG-+S#Y:'>+3#Z0F/&7+?[?\*"GZAGH33^_*M. MX(IYBG6J!PR-P0)A3A>0I[5UH)OHM AT W +S-U:UR>/W_NHM-ZV6GBKD8K]2=6 M>1?.)BNG-BT).OTT=DKJ*QM][%K$G.=QI*50W9NE-(L?8/+@H&KA9H/XNKUO M 2@; 9YM:1.56 *YH%DI<\G$'-%868*U$_:/9;NF>Q2->R9J2Q;'17!U341L M$6I'EJ@(3O*9CU,++9&%S;I.AYF@/S*<*8GX4D^B M]*Q$.9WD+"<948_*JK*IK/6.VQO S0W?\.SJ:O3I AT T,U98N[N,Q!2NP& KTW M+O4;(YP[ARDM;UV(TOCN]G!/;7I:&A=2EU>M6E-,:O/+O)U.E5]]*8M^Q>#+W"*!?/<+GBNL;EB\%R MC1E=KS$WJL:AXQLMSW3G:K0'27ZGW'0>U$06]7)=5>P83+5:TFN-5HU:-EHU M:MEHU:A"V,+6G>\/M%]&C$&_M;JSK0PKE'@U6=4*S +^;'LM$*W?H;.JDO1* M"%USUN0*47$AUF%I:$%P8RM>5J?HZ-T=(]<'J!5_(H4?K/Q,F^<43XU-]:EU MH%/O@?NS5P'U).UM%]!_CEVQ!,S,VXLO$$=)XXS]%#E\7P)$3;#'0SCK/ M*(E8,FNP.^3'1!CD=I AT -P3BQL^19M('15)H.HR$\SAAQ,18T=C AT MQ7^,<[YD MB1QC3>]N7P[5AGZ;#!Y'X[M)Y!IL*&Z\O53E]]9\02P/+T@*3L(.H>=@\[ O9( M'/,0LD4XV6]D?_N\2;H:SZ/8M:X AT K74_*YX56X*E\%Q.$)EC#]N':=?I]%;] MKJ=>K TBW352O\;W]LCPS9=CR='5J5^>)+M84[JYN3L+B9#,;*^QW?R[2=0T MOR!M:OZ>>#HNJ5 VONPY\.^L?ULLF)*SV/(2E'6%\X=SPA)[6$3#.QC>WER9 M&KIQN.0W4U-7=G;O2.YI@@Y2%B_H M1;&DJ>:1$'>&EC^[ZWW7[/ZZXF*H!= M8\CK UWI8=^E:_\WL,R8U!O0 AT B>\9N% L0YZ;RL7:+9?WX--=*T[HJNSLSLV M%F).'A%S=G5;D])PEA,"4X*%)-5[IN)[@RJ\&19V&Y>FV"'@WBY"DA AT KM6"6 M3$SC>URLW^*>0\7:4MHCI0\XR^K<@SU] ^/C'3J_I_K:UYSKA3R1&8]CFOWB MGHULRIA^%[1JIR=^+4]."_VVI4:EI+_A3$6O[5 AT 7$_5.H<#?I^;0. U/3UH2 M2=/_O[.IT ]OCSP5LJ-#XIKQ6$9\;]>S9766\W1/]#S]J3N/M/.\&+[0\K6$ MZ^'I2>L\MH \/9D\'F-3YS20LB+Z/W9AV%)1(2P,ID\5$[>)<0H\E'8T?;P; M+K;8HA^.:+BU<*PED'$?*GVTMKJK+#UY2I;6DG'PN[U9*S+1!^IWZ+BAJ=O; M'];M\&FZE5O#EG0=X<4VST"OQEK2]J>;$R.O M$[:[ZDVTK'6VZN AT QYM%ZNX@?9;W3MY]4L*\8CE&M+3;=_"LJ?.4FLH?=:7&J M8ZX/F'OYHAE;Y]'3F'.QEOL7%-XUPO%*,(JPRC AT N7]%J7B,L^H9=Y\U'<'IX M$\K>Q"S0'UES_6UK;HBI[$&D*X0[;("=98=78(\F AT UD4^@R8):$Y!_!;.U6G M EU;!ZP_<&T8)1(4I5@$; H)I5&S 7?8E>0F^^$&=G=.IWXX-)ZMB?0=I9W+ M%2%Y"G1%PUR?(Y\%9]?Z@*YVN_(1S]_/@X.+X" (@"7W)&:*KB1>UNYE0+W( M]6%R2H3M8LZN[)>(]_K9GO2_,(<$+Q1'QG!C[RAAQ>="N@%2 T/3>O@?X MZ1VW!]7!Z,/HTZV'?R^O+SS 0_)GRMM*_)*H&.#QH?L9 7[JA' E.D]JQ>HK MK97\Y)TA=B_;W,R-<8MXT)7(C$8UV"7F7?7U3MNW02U77[_CQ/EWW8+%&HC, M.7#CE V/@(OCIN;9;IYEC)4P)*R+ *=A.9:^G]02P,$% @ II5M(+^%58?U M P 1 L @ !)5$E-15(N0[5684\C-Q#]#!+_84I%N\N%)+0 AT P:6<+N6X M4Z3 58%6ZJ>5LW9V??+:*]L;&EWY[QU[';+9)$=1U0]$ZYGGF?%[8P^]8[A6 MY4+S++<07<=P>GEY#M2%D1*B$SX>I\*KKJ:IZS+:!4?[.\99KGE M!=/ BU(43%IBN9)P I5A%&9*0ZG5C LN,\ H0 31!6[\]?=/]V_A\]WX3_RY M@>$##.%A='O3 AT 1G7QD))C(%448;8AYP;,&IF'XEF4) %3!G,-&-B 90;J_FT MLHQV0"I B";2+KIPW#O8/]C_GLM45)3!+X)/TYZQU=1T\W=-AUF8GCM#V\SL MEZ)L&9G64K5LM"QX>R_/)!%MHZ580\M823P ]<:#?>/82P%/5*46:F+G1(!F M1'0\D0,'0]FDLN!EZX#)524HL<(ZG M]6 Y%0U_FA/= JA&FG5WCBQ1+K,:$J1W&;!JNR@="?>C3\/QY';=K9E0A**W M/VCTS%QQBN*ID#=RZY5HW[6+BE?4 DOT AT IW,(1)/*M[@:",V81(FE!NR%2P9,ZU MK8A(L"R4I2IMXJIA43QHIVT!C08$)6V++6,)H6BK!%KCE:EHXL._+"A M2;Q9M9*!DW:U3+Y<;'UA(R3\870[Z3CFDP\?Q_&RI9HLU^E(ZAZZ* @FJV+% M=JV0IW AT WL37(Y7;7PF$;ZOF:-.&&1:$;ME:"W]IN"K[6SEC AT 19#C54W AT Z3S= MQDWS_/'_T1U?&QV2_:<.V2.FB X+-7^$HZ/4=([ZA_ 6#J^R0W#*770-$SY& M##7>&]5L9IC]^2F(WAOIA^+0OX,;L>7$";GNZ_]W AT 6]OI[(V= M'K Y]Z Y^);U[7YP=E!S#*<7WQH!;W;N[,'Y"QNWR>%8AS=P?G9Y=A:[&&>7 MYSZ.G^1AM*WV^3N RW:Y ;I671L;"EQ!&_4TL=\JJ?G$QHW_-OK+N_@/4$L# M!!0 ( ."TNK8D>-,*;OEMV,[3FNG2?<" M+SSTXG/]SL5?P5%YE AT 6%+Y%H?-L%PHHR___7N M[32[K3I AT Q87?"FW2&#(T X6&)8"8[J# ME!12D$4I<3H"QD&9",3D;@)7UX/^H/\%80DM4PS?4K)(K AT M9+HK)^L958"$8 M;\C2/",-44%6#-&F4*8J;D-H,LFUP"BM<@WZ^$^)!8,XUH'C'*6IT(?'59[' MG*:Q)!D6LX,=8?*@-JIXG5)'GZR1:!APUJ4V0 A;>28Y44DA*46L_LTTQ"=. M4B AT D=SP"+1N>UP[Z[]2(R#*X:$NHUP($EJ70N7NV_A66,6)IK(:'%A3'3T3( M$M%8E:V&4>8R+B22.-"I_="V5!VV#E:H8+G@$B<2IW'&4^S$>5)2+H*O1W!Y MTNZA170"&B*8MJ#%[,-@JR4)WM[?/;QZ,Q^!^A//7[XV.MOL2,?>ZYZJ"(.^ MN335--3WR(Q>1;%]55%^>#&'*XFS/!R9GR]'5TP-44=\S/)X42Y!?$ MXL#87$13@\,"T3"-?'RSI&A5J-&]_.7-C_%O+^X?[G^^TX?X]M7]ZWGE5'OU M/)_H[RZOF6]>L AT 7ER0:G\6)GYN,!-I?#F)M"C8^5[)M AT MXA(W? E%Y$3I1VE M:SS]4(ZJD];3;6*E5Q".Z:+(4H_74BNK=>Z83/30 6S%3DC'N)'+#LZSMCEF M7G_"\4TA4;*I[35_^PIK?U0,W1HQ+;!7D 'MISJN5%@5>'$ZAMKQ:.1VH9)T M[//_HU$ZC#ODJ'&Y%N7R]^D?QT6HSC9F@^&'#K3:O AT 6U< M+:*52SLQ+SBD%JK$ISDS/2\S1 MR[ #*2D*<%. _.+2I(S4Q)3, MO'0%E]3BY*+,@I+,_#R0E#?0G&*%DHQ4F L4RC-+,A0%(H=\M7#'D*:P.*P6>\N32F%TI-0 MK&=;09&-/M(M;?Y[+3M)G9!#6ATD-&^>9C1OT(&H*%\5SW(#013"S6CT V9_ M8(:B4!R[H!$A6MP_QW?S?H6GA0*&AG*AH3/PO2LN$V$9PJV57!O6SZ=MD)5K M?@()ODP&)E=(F:Y+OH?_#2H)24X5$,)665F2AL%E1 AT HY=B0NC>^5U&H,-@5G MH>^]^1XX?J5!,C2$2D88UW0ID&RX,I8*4G6A4K8T1!MJ, C'KHFGP3F=T-7J M5VN*1K-:ET%BU8[5FRYM&H8- 4"AL97MX;@!6-&<;_OZSMHK1\%VPBWX:X[= M^C0R:7N257P'3F6[19L,#V:/VG?Q7])U\LDMO.1<8'"42BIHIJ\)^;5X^$N> M?L:/\=W<74CT._XW"^']O27>F[Y0;ES@::'VGSO)!.5%D8A"9F$UA"@64VJ;,>6/&8TC_H27(ZM9VZ9, M<35+\-@V5\36YV*\S4Q)W3#?U05B_45U>R'7WU0+._BWG8,?,-E(04FX2H\[ MT!DC B58I%2=#8-P;6*QE%*4769;'7 @[^%(Z!U888WBH6UD8\#]TRNH;"WC MJG^ :0&'"CA!>LK)P5KO$^%,=IRD>]I M(0B4)PI0OP7I% M&0&4 P14B=:<8'LE(TI90S$&(.8*BUI6FF")\8Z M,"H2<;V9@>.3T7 T_([RC%68@#-&T^PD-197;W9 AT I:MTKR!'LM1RV9L#VILO.WS[RGR[D?#FZOW/[Z[ ,C84DQ- P;T'PYA-QK(KGA5 AT DOT H]*T6Y2[("&]!"&W8L$082WOXM"Q+*)BQ M2PLB>Y=KL1/!%6:!/%LAV5,0 AT 9NN>-L)7D79)LJV*DB3>ZHAY09FC&"0 )N8 M]6_3S41EOA(P733Y%QN;?JW7F+L3!O.>H,I6!%>,1-:*K4E5Q*/AWZ/A@.;1 MDWUAV58?2*(K:2.T:HKH3T49M168ODFK/.XI8F'^6,.#FM@-)0Q'L94- AT NJ% M9KCAR,F-ET EF3O;X:VZ$ZSRHY^BJ!-0SM!2'4'XT^_O?X8?WUW?7/]V:0_P M_.KZEXL8/#R 4'V-J+;IYD*Z )G AT RSTY3A96^FBY=:0J+0*R(HO%.\R;;ZG[ M6I[S3LN9BKRH&?Y2'4!+[SX54_C%ZZ:4_?:)M_7P AT J@;O*_+[JW$630I#_P$ M1Q^N+V^NWE],^AT5OVX36A(-$<<04X521N =E;I"S%C51,JJU- 21'PS=!JO M'I>XUSO68"F%)IDF&!8"D\#6G4&%C%Y,P-'.V/JTD"JB AT T+6)Y(6OK_JG2] M^]5-X(JR7<.1]W4<%X AT QD46*?B8BK]'84UGK3M\XKVXS=T"[@Y-V%P!R? MG2V>=1.K>&HHOR48IIOFS?O2BAST=U#3>K9+OJ6.5F]?N3S^]:"]SOZ V^?$ M:_4>$O>0_:^MXLVY'@J(J,/UK=)RU8IV&LS#01O5(Y,T\?XY_VL&+=1(U:[4 MS=:@F;[$[ITX?%T<7#/2JM4O7PO4/V6F00FZ(YTTQW'7O%6?[@_+N SK>]:U M.#[]_KF+HM,#NSIAF[@4MTO3_9YIFBNT$E0JC,FS$]@:AY>F7=?[3.PICRK' M=>6F[;(;%*3(RDWD]N=QO'MG4DOJ*[WUZ<.OE^%VW_[W9;[M]6:6_(+_!U!+ M P04 " !!?W,@CD&?MQ(D736 3SQK# 0XQZ3W5UX4+KLS;<:DV2;;J[TM [^YP&T^4; M.WMU4SS!XNS37/)+1\:ZL,64I(VN3XY#*3UT3K#)H2T"C-^;HR!2RC$(QM

*?)WQR]3@]7//_1)^@..RO0% M4$L#!!0 ( ):8 M+=(0A#BKQ AT Z&3C AT B CU6X;*-%2=PR/ZWE3RLXF^(7+;YI09Q48E#&N(4 AT SMH M/YZF<@DJC^&(!4(%R(\3P-5C&#B$/SWW9?:NY&0Y$-]V><6M MK[B_AM7[W:8ISGS?'P-=MVU[1O]%>K-:K?;TX],/CCE$^A'C^ ]02P,$% M @ '8!S((!%M-#2 ( $ H !'1510240N5%A(<\C+3TE52$\M*;F4,_.2) MF>-$_J $V'_'3D);VB*F/A!%B>[)O><<'SO3$2S*JE8\RPT$BQ NKZY>P0)Q,M;&Q/OB 2LGR &-5P0\@S3-)Q2%H MF.,]I61RA92U6OT>?C.H)"0Y54 (^Y)5%6D[N,Q(*6>^J>*,F'ZOR8Q+ R/M M\B*B3%R4/YI\[AYNKV]@9+"HF AT GP9,XJR= 0*AEQ*=%8(/G*E;%4$$?CEF?5BL8#INV\;QRVR7- M($JLZ AT C#;L8I-4S-0-ABG<*1=Y3/L.ZO9L,@@MO%W7)ULX45&NLR'E]VR%/[ MVID:SU-!,_TS(N3MQX?WY//UR'^X,"AV:)+URZ!X M#AMIH8-N'T;W6Z]=T_>+&&GV]Z( MJB:(=C%<7%Z^@\]T[=ND*U5K_C^0Q AT SP6UHHAB M$$TKL4%%G(164+K)SB+L!=6^^!'%:S]P5PL+5I>TYP:AX3UD"*5!E#T4PI(1 M64=8G(/2CMP8KJA?PW(SG\UG;X3*95<@O+>]W7CI=;T]AJ7(\HVE+K.3#VB, MTA.L:!LQ@:RH%)=3D K'>TJ):H.\&+3F,_Q%:!3D-3? 6/&]:ELV= A5,:T2 MW^2R8C2?'6(+);CS'(0B6%J7'I,Z'TK=^BBM"_I/B.[FZ_7'*U AT 2-FT@ Z_C MMF 5$N.J8"Y GDED/X6ACDOF2-SF74O,$V,4)WY(E-$I?^$^@Q" ETC']9(! MVM="8N0_+-(OWVYOX>PLM*VVSOXB=4<\=CK^,!_:X@$;>0'"34 *U[N;3[=7 MR0$V2)T+;W4Q(@_#*^_,Z'&U]9EYIZ4VZ1B!;W%EE"13F5<%,YI?G$H'[N]A M$3WC)XX/XX\&_K. ZH4.X.DW2-\>H6-$+NA'\.&9=5^LU?+./M6!+APH+1[] M#J^C/WG5_UZT$W//7U!+ P04 " #S@',@@Q620L@! "!0 " %=! M250N5%A(O5--:]PP$+T;_!\&>NBV."X]]X,]Y))3H2V]%D4:QP-:R>@C71/R MWSLC[1H[;"F!ICX8:31Z\][HS=YY AT _!+4>I@"EYCC&VSC_EV1&7(W<&WV25U M;!N.XE$=)HMM\XJ7^_&SI$QD?B;@/WPJF#MR"=[&I%*.;SX( MA#.PP&P+76/4@:9$WLG1]Y$B#-EI"8!6.6($2I&7UF* Y,&@57.)X1%U+HG9 M);+@'8(?RE';Z)&L.8MCD(3A0$XEC#W S0#*S5!S1K4Z-1T$3#DX($&APP$- M-327[81$1)VVS[5+O(60&%B7+ M'SX4P%6(P*8L'1DHX/? ME)PAS:BE:L&!-$]8M!5]&J[^S<=8B_9V-^K\, <'[?3\<4M>T$XF:%>W[QNVYR>MX=GN7!5>&7Q_J*AZC ( M@;:Y[*IX:2S^YJK?4$L#!!0 ( +>4;2#12T?,K@$ *\# ) 5$A2 M14%$4RY(A5--;YPP$+U'RG^8II<&1=GFT$.4JM+*L WM"J*%J.UI!/:P.$L, MLHV:593_'O.QS=(T6R0CS;S'FQGF>>8!JYNMENO2P@=V"A>7EY_ _P8^5;66 M= :&"%A\\RN,OIZ[?%%K$&0S61GP9L='[V6A!!6 *.Y0*EZU AT K"2.4=;:LJ$ MP1(=RU&DHO^P>K5!C#=5:[IS?$0/EK2"$W8"CXY!2LABY+Y4#J)%O&(!SJ,D MQ,4J"))T'OFNYRDS25IJYR%R"[#I<^N.?CPT5'M=N&NGK&ZI9;&*;',7+C ;A: MF+<%N'/5Q:TRO0JSU!+ P04 " !937,@ M09S.\?T "W @ "@ %1%4U1&3U)++D.]DL%+PS 4A^^%_@\Q(KPPD'H2 MZ2KHP8L'+SL*I39)\VQ]*6WJ!-G_;DS7N17&+L-W2GY\A-_WR"52V0Q2L65I M">VUN8^COVP@[)T,81Q]6I1L93I5R!=2(.+H.XX88TB.Z2Q)PV5ML%%P4;\9 M="!$R$;,CUXLTNF,&D!?W20BRQ(QA7[:SK^G AT 3]P,6-O[X["KS31F[&2AH,& M?BKE2@-;JL:F 9^T*#WBL\U,<+6V,\$SZSW^OY[ZCRW@^N!/_NN2C)+BA]E MGI"P-TKRGLT7$&T! !- P M!P ! " "Q-0 4$%54T4N0U!+ 0(4 !0 ( ')_4;2#12T?,K@$ *\# ) $ M( .-& !42%)%0413+DA02P$"% 4 " !937,@09S.\?T "W @ M"@ ! " "X2 5$535$9/4DLN0U!+!08 $0 1 )<# #= %20 end