Peter_Van_Epp@cc.sfu.ca (01/10/90)
The following uue encoded shar file will allow Minix to be booted from 1.44m 3.5 inch floppies (and 1.2m AT floppies and 720k 3.5 floppies and last but not least 360k 5.25 floppies) and has been booted succesfully from all of them! I would characterize the mods as experimental at the moment (although I don't forsee any changes to this part of things), there is a portability problem to Minix ST due to the changes that has not been addressed here (but is easy to fix if required). A little history to explain why this was done, I have a PS/2 model 55 at work that has only a 1.44m floppy and a 60m hard drive, and neither 1.3 nor 1.5.0 could boot from a 1.44m floppy. In the course of modifying bootblok.s to do that I discovered that 720k support depended on a hard coded Prom address (bad news for people without that prom!) but that keeping the current test procedure (which involved seeking to track 64 to see if this is a 720k drive) ground the heads on my 360k floppy when the rom table was replaced with a proper 720k table (probably why the rom table was there!). To fix this (and to start addressing a similar problem in floppy.c!) I looked at the data in the DOS boot sector (in Advanced MSDOS by Ray Duncan good book!). and discovered that the total number of sectors, number of sectors per track, and number of heads are written into offset 0x13 to 0x1B of the boot block. I have now modified bootblok.s (here in source form since the cdif was 10k and the source was 11k and change!), build.c and the makefile. The change involves build reading the disk boot sector (meaning no more build to a file, sorry!) , saveing the values in 0x13 to 0x1B, then, when patching the Minix sizes into the boot block, also patch the disk values back into offset 0x13 to 0x1B (this needs to be either conditional compiled out or the same space needs to be kept free of code for the ST in order to use the same build for both neither of which I have done so far!) At boot time, bootblok.s has been modified to read the total size of the disk from location 0x13 (put there by build) and checks that it is one of 720, 1440, 2400, or 2800 sectors (360k etc.) and selects the correct parameter block for the floppy controller (or complains if the drive doesn't match!). As mentioned, this code has been used to succesfully boot all of these disks (and 720k in 1.44m drives but not 360k in 1.2m) and it all seems to work. I intend to now look at doing the same thing to floppy.c and mkfs (to stop mkfs zeroing the boot block most likely) since I suspect that we should always be able to read the boot block from a floppy in at most 2 tries, we will then have hard information from the floppy, (to take care of 720k media in a 1.44m drive) and this both allow better error checking (we know what the end block of this media is not the end block of the largest media possible etc.) and may take less time to figure out what kind of floppy is in the drive. Here is the bootblok, build and makefile portion: --------------------- cut here ------------------------- table !"#$%&'()*+,-./0123456789:;<=>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ begin 644 boot.shar M96-H;R!X("T@8G5I;&0N8RYC9&EF"G-E9" G+UY8+W,O+R\G(#X@8G5I;&0Nz M8RYC9&EF(#P\("<O)PI8*BHJ("]U<W(O<W)C+S$N-5]B87-E+W1O;VQS+V)Uy M:6QD+F,)5V5D($1E8R R-R R,3HP,3HP-R Q.3@Y"E@M+2T@+BXO=&]O;',Ox M8G5I;&0N8PE&<FD@2F%N(" U(# P.C(U.C4X(#$Y.3 *6"HJ*BHJ*BHJ*BHJw M*BHJ*@I8*BHJ(#(P+#0V("HJ*BH*6" @("H@069T97(@=&AE(&)O;W0@:6UAv M9V4@:&%S(&)E96X@8G5I;'0L(&)U:6QD(&=O97,@8F%C:R!A;F0@;6%K97,@u M<V5V97)A; I8(" @*B!P871C:&5S('1O('1H92!I;6%G92!F:6QE(&]R(&1It M<VME='1E.@I8(" @*@I8(2 @*B @(" @(#$N(%1H92!L87-T(#0@=V]R9',@s M;V8@=&AE(&)O;W0@8FQO8VL@87)E('-E="!A<R!F;VQL;W=S.@I8(" @*@D@r M("!7;W)D(&%T(#4P-#H)3G5M8F5R(&]F('-E8W1O<G,@=&\@;&]A9 I8(" @q M*@D@("!7;W)D(&%T(#4P-CH)1%,@=F%L=64@9F]R(')U;FYI;F<@9G-C:PI8p M(" @*@D@("!7;W)D(&%T(#4P.#H)4$,@=F%L=64@9F]R('-T87)T:6YG(&9So M8VL*6" @("H)(" @5V]R9"!A=" U,3 Z"4-3('9A;'5E(&9O<B!R=6YN:6YGn M(&9S8VL*6" @("H*6"$@("H),BX@0G5I;&0@=W)I=&5S(&$@=&%B;&4@:6YTm M;R!T:&4@9FER<W0@."!W;W)D<R!O9B!T:&4@:V5R;F5L)W,*6" @("H)(" @l M9&%T82!S<&%C92X@($ET(&AA<R T(&5N=')I97,L('1H92!C<R!A;F0@9',@k M=F%L=65S(&9O<B!E86-H"E@@(" J"2 @('!R;V=R86TN("!4:&4@:V5R;F5Lj M(&YE961S('1H:7,@:6YF;W)M871I;VX@=&\@<G5N(&UM+"!F<RP@86YD"E@@i M(" J"2 @(&EN:70N("!"=6EL9"!A;'-O('=R:71E<R!T:&4@:V5R;F5L)W,@h M1%,@=F%L=64@:6YT;R!A9&1R97-S(#0*6" @("H)(" @;V8@=&AE(&ME<FYEg M;"=S(%1%6%0@<V5G;65N="P@<V\@=&AE(&ME<FYE;"!C86X@<V5T(&ET<V5Lf M9B!U<"X*6" @("H*6"$@("H@(" @(" S+B!4:&4@;W)I9VEN(&%N9"!S:7IEe M(&]F('1H92!I;FET('!R;V=R86T@87)E('!A=&-H960@:6YT;R!B>71E<R Td M+3D*6" @("H@(" @(" @("!O9B!T:&4@9FEL92!S>7-T96T@9&%T82!S<&%Cc M92X@5&AE(&9I;&4@<WES=&5M(&YE961S('1H:7,*6" @("H@(" @(" @("!Ib M;F9O<FUA=&EO;BP@86YD(&5X<&5C=',@=&\@9FEN9"!I="!H97)E+@I8(" @a M*@I8(" @*B!"=6EL9"!I<R!C86QL960@8GDZ"E@@(" J"E@A(" J(" @(" @z M8G5I;&0@8F]O=&)L;VL@:V5R;F5L(&UM(&9S(&EN:70@9G-C:R!I;6%G90I8y M(2 @*@I8(2 @*B!T;R!G970@=&AE(')E<W5L=&EN9R!I;6%G92!O;G1O('1Hx M92!F:6QE(")I;6%G92(N"E@@(" J+PI8(" *6" @+RH@36]D:69I960@8GD@w M0G)U8V4@179A;G,L(#(Q($YO=B X."!T;R!L;V%D('-Y;6)O;"!T86)L97,@v M9F]R(&1E8G5G9V5R+@I8+2TM(#(P+#4T("TM+2T*6" @("H@069T97(@=&AEu M(&)O;W0@:6UA9V4@:&%S(&)E96X@8G5I;'0L(&)U:6QD(&=O97,@8F%C:R!At M;F0@;6%K97,@<V5V97)A; I8(" @*B!P871C:&5S('1O('1H92!I;6%G92!Fs M:6QE(&]R(&1I<VME='1E.@I8(" @*@I8(2 @*@DQ+B!4:&4@=&]T86P@<VEZr M92!O9B!T:&4@9&ES:RP@;G5M8F5R(&]F('-E8W1O<G,@<&5R('1R86-K(&%Nq M9"!T:&4@"E@A(" J"2 @(&YU;6)E<B!O9B!H96%D<R H86QL(&]B=&%I;F5Dp M(&9R;VT@=&AE(&)O;W0@<V5C=&]R('=R:71T96X@8GD*6"$@("H)(" @9F]Ro M;6%T('=H96X@=&AE(&1I<VL@=V%S(&9O<FUA='1E9"D@87)E('!A=&-H960@n M:6YT;R!T:&4@8F]O= I8(2 @*@D@("!B;&]C:R H8F]O=&)L;VLN<R!K;F]Wm M<R!T:&5Y(&%R92!T:&5R92$I(&%S(&9O;&QO=W,Z"E@A(" J"2 @(%=O<F0@l M870@,3DZ(%1O=&%L('-I>F4@;V8@=&AE(&1I<VL@:6X@<V5C=&]R<PI8(2 @k M*@D@("!7;W)D(&%T(#(T.B!396-T;W)S('!E<B!T<F%C:R!F;W(@=&AI<R!Dj M:7-K"E@A(" J"2 @(%=O<F0@870@,C8Z($YU;6)E<B!O9B!H96%D<R!O;B!Ti M:&ES(&1R:79E("AN;W0@8W5R<F5N=&QY('5S960A*0I8(2 @*@I8(2 @*B @h M(" @(#(N(%1H92!L87-T(#0@=V]R9',@;V8@=&AE(&)O;W0@8FQO8VL@87)Eg M('-E="!A<R!F;VQL;W=S.@I8(" @*@D@("!7;W)D(&%T(#4P-#H)3G5M8F5Rf M(&]F('-E8W1O<G,@=&\@;&]A9 I8(" @*@D@("!7;W)D(&%T(#4P-CH)1%,@e M=F%L=64@9F]R(')U;FYI;F<@9G-C:PI8(" @*@D@("!7;W)D(&%T(#4P.#H)d M4$,@=F%L=64@9F]R('-T87)T:6YG(&9S8VL*6" @("H)(" @5V]R9"!A=" Uc M,3 Z"4-3('9A;'5E(&9O<B!R=6YN:6YG(&9S8VL*6" @("H*6"$@("H),RX@b M0G5I;&0@=W)I=&5S(&$@=&%B;&4@:6YT;R!T:&4@9FER<W0@."!W;W)D<R!Oa M9B!T:&4@:V5R;F5L)W,*6" @("H)(" @9&%T82!S<&%C92X@($ET(&AA<R Tz M(&5N=')I97,L('1H92!C<R!A;F0@9',@=F%L=65S(&9O<B!E86-H"E@@(" Jy M"2 @('!R;V=R86TN("!4:&4@:V5R;F5L(&YE961S('1H:7,@:6YF;W)M871Ix M;VX@=&\@<G5N(&UM+"!F<RP@86YD"E@@(" J"2 @(&EN:70N("!"=6EL9"!Aw M;'-O('=R:71E<R!T:&4@:V5R;F5L)W,@1%,@=F%L=64@:6YT;R!A9&1R97-Sv M(#0*6" @("H)(" @;V8@=&AE(&ME<FYE;"=S(%1%6%0@<V5G;65N="P@<V\@u M=&AE(&ME<FYE;"!C86X@<V5T(&ET<V5L9B!U<"X*6" @("H*6"$@("H@(" @t M(" T+B!4:&4@;W)I9VEN(&%N9"!S:7IE(&]F('1H92!I;FET('!R;V=R86T@s M87)E('!A=&-H960@:6YT;R!B>71E<R T+3D*6" @("H@(" @(" @("!O9B!Tr M:&4@9FEL92!S>7-T96T@9&%T82!S<&%C92X@5&AE(&9I;&4@<WES=&5M(&YEq M961S('1H:7,*6" @("H@(" @(" @("!I;F9O<FUA=&EO;BP@86YD(&5X<&5Cp M=',@=&\@9FEN9"!I="!H97)E+@I8(" @*@I8(" @*B!"=6EL9"!I<R!C86QLo M960@8GDZ"E@@(" J"E@A(" J(" @(" @8G5I;&0@8F]O=&)L;VL@:V5R;F5Ln M(&UM(&9S(&EN:70@9G-C:R O9&5V+V9D, I8(2 @*@I8(2 @*B!T;R!G970@m M=&AE(')E<W5L=&EN9R!I;6%G92!O;G1O('1H92!F;&]P<'D@:6X@9')I=F4@l M,2X*6" @("HO"E@@( I8(" O*B!-;V1I9FEE9"!B>2!"<G5C92!%=F%N<RP@k M,C$@3F]V(#@X('1O(&QO860@<WEM8F]L('1A8FQE<R!F;W(@9&5B=6=G97(Nj M"E@J*BHJ*BHJ*BHJ*BHJ*BH*6"HJ*B U,RPU." J*BHJ"E@M+2T@-C$L-S @i M+2TM+0I8(" *6" @(" @0D1%(#@@1F5B(#@Y+B!#3$E#2U]325I%(#(U-B!Ih M;G-T96%D(&]F(#$V+@I8(" @("!"1$4@,B!-87(@.#DN($-,24-+7U-)6D4@g M86YD($-,24-+7U-(2494('9A<FEA8FQE<R!C;&EC:W-I>F4L(&-L:6-K7W-Hf M:69T+@I8*R @(" *6"L@(" @4%9%(#8@2F%N(#DP+B!-;V1I9GD@=&\@<F5Te M86EN('1H92!D:7-K('!A<F%M971E<B!V86QU97,@*')E860L('1H96X@<&%Td M8V@*6"L@(" @(" @(" @(" @(" @("!I;G1O('1H92!B;V]T(&)L;V-K*2!Wc M<FET=&5N('1O('1H92!D:7-K(&)Y(&9O<FUA="!T;R!T96QL"E@K(" @(" @b M(" @(" @(" @(" @8F]O=&)L;VLN<R!T:&4@9F]R;6%T(&]F('1H92!D:7-Ka M(&9O<B!B;V]T:6YG+@I8(" @*B\*6" @"E@@( I8*BHJ*BHJ*BHJ*BHJ*BHJz M"E@J*BH@.#,L.#@@*BHJ*@I8+2TM(#DU+#$P." M+2TM"E@@("-D969I;F4@y M4UE-7U!/4R U(" @(" @(" @(" @(" @+RH@=VAE<F4@:7,@<WEM('-I>F4@x M:6X@:&5A9&5R("HO"E@@("-D969I;F4@4T507TE$7T))5" P>#(P(" @(" @w M(" @+RH@8FET('1H870@=&5L;',@:68@9FEL92!I<R!S97!A<F%T92!)("8@v M1" J+PI8(" *6"L@+RH@3V9F<V5T<R!I;G1O('1H92!B;V]T(&)L;V-K('=Hu M97)E('1H92!D:7-K('!A<F%M971E<B!V86QU97,@<VAO=6QD(&)E( I8*R @t M*B!R96%D(&9R;VT@86YD('=R:71T96X@=&\N"E@K(" J+PI8*R *6"L@(V1Es M9FEN92!325I%7T]&1E-%5 DQ.0I8*R C9&5F:6YE(%-%0U1?3T9&4T54"3(Tr M"E@K("-D969I;F4@2$5!1%]/1D93150),C8*6"L@"E@@("-I9F1E9B!-4T1/q M4PI8(" C(&1E9FEN92!"4D5!1" T(" @(" @(" @(" @(" @("\J('9A;'5Ep M(# @;65A;G,@05-#24D@<F5A9" J+PI8(" C96QS90I8*BHJ*BHJ*BHJ*BHJo M*BHJ"E@J*BH@,3$P+#$Q-2 J*BHJ"E@M+2T@,3,P+#$T-2 M+2TM"E@@(" @n M:6YT('-E<%]I9#L@(" @(" @(" @(" @(" @(" @+RH@,2!I9B!S97!A<F%Tm M92P@,"!I9B!N;W0@*B\*6" @?2!S:7IE<UM04D]'4D%-4UT["E@@( I8*R!Sl M=')U8W0@9&ES:U]P87)M<R!["E@K(" @=6YS:6=N960@9&ES:U]S:7IE.PD)k M+RH@<VEZ92!O9B!D:7-K("AI;B!S96-T;W)S*2 @(" J+PI8*R @('5N<VEGj M;F5D('-E8W1O<G-?=')A8VL["2\J(&YU;6)E<B!O9B!S96-T;W)S+W!E<B!Ti M<F%C:R @*B\*6"L@("!U;G-I9VYE9"!N;U]H96%D<SL)"2\J(&YU;6)E<B!Oh M9B!H96%D<R!O;B!D:7-K"2HO"E@K('T@8F]O=%]P87)M<SL*6"L@"E@K("\Jg M("!-86-R;W,@=&\@<F5A9"!A;B!I;G1E9V5R('9A;'5E(&%T(&%N>2!O9F9Sf M970@:6X@82!D:7-K(&)L;V-K("HO"E@K( I8*R C9&5F:6YE(&=E=%]I;G0He M8G5F9BD)"2@H*BAB=69F("L@,2D@/#P@."D@?" H*F)U9F8@)B P>&9F*2D*d M6"L@"E@@(&-H87(@*FYA;65;72 ]('LB7&YK97)N96PB+" B;6T@(" @(BP@c M(F9S(" @("(L(")I;FET(" B+" B9G-C:R @(GT["E@@( I8("!M86EN*&%Rb M9V,L(&%R9W8I"E@J*BHJ*BHJ*BHJ*BHJ*BH*6"HJ*B Q,C(L,3(Y("HJ*BH*a M6" @"E@@(" @:68@*&%R9V,@(3T@4%)/1U)!35,K,RD@<&5X:70H(G-E=F5Nz M(&9I;&4@;F%M97,@97AP96-T960N("(L("(B*3L*6" @"E@A(" @24]I;FETy M*"D["0D)+RH@8VAE8VL@9F]R($1-06]V97)R=6X@*$1/4RD@*B\*6"$@("!Cx M<F5A=&5?:6UA9V4H87)G=ELW72D[(" @(" @(" @(" @(" O*B!C<F5A=&4@w M=&AE(&]U='!U="!F:6QE("HO"E@@( I8(" @("\J($=O(&=E="!T:&4@8F]Ov M="!B;&]C:R!A;F0@8V]P>2!I="!T;R!T:&4@;W5T<'5T(&9I;&4@;W(@9&ESu M:V5T=&4N("HO"E@@(" @8V]P>3$H87)G=ELQ72D["E@M+2T@,34R+#$V," Mt M+2TM"E@@( I8(" @(&EF("AA<F=C("$](%!23T=204U3*S,I('!E>&ET*")Ss M979E;B!F:6QE(&YA;65S(&5X<&5C=&5D+B B+" B(BD["E@@( I8(2 @($E/r M:6YI="@I.PD)"0DO*B!C:&5C:R!F;W(@1$U!;W9E<G)U;B H1$]3*2 J+PI8q M(2 @(&=E=%]D:7-K7W!A<FUS*"9B;V]T7W!A<FUS+&%R9W9;-UTI.R @+RH@p M<F5A9"!T:&4@8F]O="!S96-T;W(@<&%R86UE=&5R<R J+PI8(2 @(&-R96%To M95]I;6%G92AA<F=V6S==*3L)"2\J(&-R96%T92!T:&4@;W5T<'5T(&9I;&4@n M*B\*6" @"E@@(" @+RH@1V\@9V5T('1H92!B;V]T(&)L;V-K(&%N9"!C;W!Ym M(&ET('1O('1H92!O=71P=70@9FEL92!O<B!D:7-K971T92X@*B\*6" @("!Cl M;W!Y,2AA<F=V6S%=*3L*6"HJ*BHJ*BHJ*BHJ*BHJ*@I8*BHJ(#$S,BPQ-3,@k M*BHJ*@I8(" @(&9O<B H:2 ](# [(&D@/"!04D]'4D%-4SL@:2LK*2!C;W!Yj M,BAI+"!A<F=V6VDK,ETI.PI8(" @(&9L=7-H*"D["E@@(" @<')I;G1F*"(@i M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @h M("TM+2TM(" @(" @+2TM+2U<;B(I.PI8(2 C:69D968@4$-)6 I8(2 @('!Rg M:6YT9B@B3W!E<F%T:6YG('-Y<W1E;2!S:7IE(" E,CEL9" @(" @("4U;'A<f M;B(L(&-U;5]S:7IE+"!C=6U?<VEZ92D["E@A(" @<')I;G1F*")<;E1O=&%Le M('-I>F4@:6YC;'5D:6YG(&9S8VL@:7,@)6QD+EQN(BP@86QL7W-I>F4I.PI8d M(2 C96QS90I8(2 @('!R:6YT9B@B3W!E<F%T:6YG('-Y<W1E;2!S:7IE(" Ec M,CE$(" @(" @)3587&XB+"!C=6U?<VEZ92P@8W5M7W-I>F4I.PI8(2 @('!Rb M:6YT9B@B7&Y4;W1A;"!S:7IE(&EN8VQU9&EN9R!F<V-K(&ES("5$+EQN(BP@a M86QL7W-I>F4I.PI8(2 C96YD:68*6"$@"E@A(" @+RH@36%K92!T:&4@=&ARz M964@<&%T8VAE<R!T;R!T:&4@;W5T<'5T(&9I;&4@;W(@9&ES:V5T=&4N("HOy M"E@A(" @<&%T8V@Q*&%L;%]S:7IE*3L*6" @("!P871C:#(H*3L*6" @("!Px M871C:#,H*3L*6" @("!E>&ET*# I.PI8("!]"E@@( I8(" *6" @"E@@(&-Ow M<'DQ*&9I;&5?;F%M92D*6" @8VAA<B J9FEL95]N86UE.PI8+2TM(#$V,RPQv M.38@+2TM+0I8(" @(&9O<B H:2 ](# [(&D@/"!04D]'4D%-4SL@:2LK*2!Cu M;W!Y,BAI+"!A<F=V6VDK,ETI.PI8(" @(&9L=7-H*"D["E@@(" @<')I;G1Ft M*"(@(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @s M(" @("TM+2TM(" @(" @+2TM+2U<;B(I.PI8(2 @('!R:6YT9B@B3W!E<F%Tr M:6YG('-Y<W1E;2!S:7IE(" E,CEL9" @(" @("4U;'A<;B(L(&-U;5]S:7IEq M+"!C=6U?<VEZ92D["E@A(" @<')I;G1F*")<;E1O=&%L('-I>F4@:6YC;'5Dp M:6YG(&9S8VL@:7,@)6QD+EQN(BP@86QL7W-I>F4I.PI8(2 *6"$@(" O*B!-o M86ME('1H92!T:')E92!P871C:&5S('1O('1H92!O=71P=70@9FEL92!O<B!Dn M:7-K971T92X@*B\*6"$@("!P871C:#$H86QL7W-I>F4L)F)O;W1?<&%R;7,Im M.PI8(" @('!A=&-H,B@I.PI8(" @('!A=&-H,R@I.PI8(" @(&5X:70H,"D[l M"E@@('T*6" @"E@@( I8*R!G971?9&ES:U]P87)M<RAB;V]T7W!A<FUS+&9Ik M;&4I"E@K('-T<G5C="!D:7-K7W!A<FUS("IB;V]T7W!A<FUS.PI8*R!C:&%Rj M("IF:6QE.PI8*R!["E@K(" @8VAA<B!B=69F6U-%0U1/4E]325I%73L*6"L@i M"E@K("-I9FYD968@35-$3U,*6"L@("!I9B H("AI;6%G92 ](&]P96XH9FELh M92P@0E)%040I*2 \(# I('!E>&ET*")C86XG="!O<&5N("(L(&9I;&4I.PI8g M*R C96YD:68*6"L@("!R96%D7V)L;V-K*" H=6YS:6=N960I(# L(&)U9F8If M.PD*6"L@("!B;V]T7W!A<FUS+3YD:7-K7W-I>F4@(" @(#T@9V5T7VEN="@Fe M8G5F9EM325I%7T]&1E-%5%TI.PI8*R @(&)O;W1?<&%R;7,M/G-E8W1O<G-?d M=')A8VL@/2!G971?:6YT*"9B=69F6U-%0U1?3T9&4T5472D["E@K(" @8F]Oc M=%]P87)M<RT^;F]?:&5A9',)(" @(#T@9V5T7VEN="@F8G5F9EM(14%$7T]&b M1E-%5%TI.PI8*R C:69N9&5F($U31$]3"E@K(" @8VQO<V4@*&9I;&4I.PI8a M*R C96YD:68)"E@K('T*6" @"E@@(&-O<'DQ*&9I;&5?;F%M92D*6" @8VAAz M<B J9FEL95]N86UE.PI8*BHJ*BHJ*BHJ*BHJ*BHJ"E@J*BH@,C,V+#(T,B Jy M*BHJ"E@@( I8(" @("\J(%!R:6YT(&$@;65S<V%G92!G:79I;F<@=&AE('!Rx M;V=R86T@;F%M92!A;F0@<VEZ92P@97AC97!T(&9O<B!F<V-K+B J+PI8(" @w M(&EF("AN=6T@/"!&4T-+*2![( I8(2 @(" @(" @('!R:6YT9B@B)7,@('1Ev M>'0])35U("!D871A/24U=2 @8G-S/24U=2 @=&]T/24U1" @:&5X/24U6" @u M)7-<;B(L"E@@(" @(" @(" @(" @(" @("!N86UE6VYU;5TL('1E>'1?8GETt M97,L(&1A=&%?8GET97,L(&)S<U]B>71E<RP@=&]T7V)Y=&5S+ I8(" @(" @s M(" @(" @(" @(" @=&]T7V)Y=&5S+" H<VEZ97-;;G5M72YS97!?:60@/R Br M4V5P87)A=&4@22 F($0B(#H@(B(I*3L*6" @("!]"E@M+2T@,C<Y+#(X-2 Mq M+2TM"E@@( I8(" @("\J(%!R:6YT(&$@;65S<V%G92!G:79I;F<@=&AE('!Rp M;V=R86T@;F%M92!A;F0@<VEZ92P@97AC97!T(&9O<B!F<V-K+B J+PI8(" @o M(&EF("AN=6T@/"!&4T-+*2![( I8(2 @(" @(" @('!R:6YT9B@B)7,@('1En M>'0])35U("!D871A/24U=2 @8G-S/24U=2 @=&]T/24U;&0@(&AE>#TE-6QXm M(" E<UQN(BP*6" @(" @(" @(" @(" @(" @(&YA;65;;G5M72P@=&5X=%]Bl M>71E<RP@9&%T85]B>71E<RP@8G-S7V)Y=&5S+"!T;W1?8GET97,L"E@@(" @k M(" @(" @(" @(" @("!T;W1?8GET97,L("AS:7IE<UMN=6U=+G-E<%]I9" _j M(")397!A<F%T92!)("8@1"(@.B B(BDI.PI8(" @('T*6"HJ*BHJ*BHJ*BHJi M*BHJ*@I8*BHJ(#0R,RPT,S@@*BHJ*@I8("!]"E@@( I8(" *6"$@<&%T8V@Qh M*&%L;%]S:7IE*0I8(2!L;VYG(&%L;%]S:7IE.PI8(2!["E@A("\J(%!U="!Tg M:&4@:7 @86YD(&-S('9A;'5E<R!F;W(@9G-C:R!I;B!T:&4@;&%S="!T=V\@f M=V]R9',@;V8@=&AE(&)O;W0@8FQK+@I8(" @*B!)9B!F<V-K(&ES('-E<"!)e M)D0@=V4@;75S="!A;'-O('!R;W9I9&4@=&AE(&1S+79A;'5E("AA9&1R+B Ud M,#8I+@I8(" @*B!0=70@:6X@8F]O=&)L;VLM;V9F<V5T(#4P-"!T:&4@;G5Mc M8F5R(&]F('-E8W1O<G,@=&\@;&]A9"X*6" @("HO"E@@( I8(" @(&QO;F<@b M9G-C:U]O<F<["E@A(" @=6YS:6=N960@<VAO<G0@:7 L(&-S+"!D<RP@=6)Ua M9EM314-43U)?4TE:12\R72P@<V5C=')S.PI8(" *6" @("!I9B H8W5M7W-Iz M>F4@)2!C;&EC:W-I>F4@(3T@,"D*6" @"7!E>&ET*")-24Y)6"!I<R!N;W0@y M;75L=&EP;&4@;V8@8VQI8VMS:7IE(&)Y=&5S(BP@(B(I.PI8+2TM(#0V-BPTx M.#<@+2TM+0I8("!]"E@@( I8(" *6"$@<&%T8V@Q*&%L;%]S:7IE+&)O;W1?w M<&%R;7,I"E@A(&QO;F<@86QL7W-I>F4["E@A('-T<G5C="!D:7-K7W!A<FUSv M("IB;V]T7W!A<FUS.PI8(2!["E@A("\J(%!U="!T:&4@=&]T86P@;G5M8F5Ru M(&]F('-E8W1O<G,@;VX@=&AE(&1I<VLL('1H92!N=6UB97(@;V8@<V5C=&]Rt M<R!P97(*6"$@("H@=')A8VL@86YD('1H92!N=6UB97(@;V8@:&5A9',@;VX@s M=&AE(&1I<VL@*&%L;"!O8G1A:6YE9"!F<F]M('1H92!B;V]T"E@A(" J(&)Lr M;V-K(&]R:6=I;F%L;'D@=W)I='1E;B!W:&5N('1H92!D:7-K('=A<R!F;W)Mq M871T960A*2!I;G1O('1H92!C;W)R96-T"E@A(" J(&QO8V%T:6]N<R!I;B!Tp M:&4@8F]O="!B;&]C:RX*6"$@("H@4'5T('1H92!I<"!A;F0@8W,@=F%L=65So M(&9O<B!F<V-K(&EN('1H92!L87-T('1W;R!W;W)D<R!O9B!T:&4@8F]O="!Bn M;&LN"E@@(" J($EF(&9S8VL@:7,@<V5P($DF1"!W92!M=7-T(&%L<V\@<')Om M=FED92!T:&4@9',M=F%L=64@*&%D9'(N(#4P-BDN"E@@(" J(%!U="!I;B!Bl M;V]T8FQO:RUO9F9S970@-3 T('1H92!N=6UB97(@;V8@<V5C=&]R<R!T;R!Lk M;V%D+@I8(" @*B\*6" @"E@@(" @;&]N9R!F<V-K7V]R9SL*6"$@("!U;G-Ij M9VYE9"!S:&]R="!I<"P@8W,L(&1S+"!S96-T<G,["E@A(" @=6YS:6=N960@i M8VAA<B!U8G5F6U-%0U1/4E]325I%73L@"E@@( I8(" @(&EF("AC=6U?<VEZh M92 E(&-L:6-K<VEZ92 A/2 P*0I8(" )<&5X:70H(DU)3DE8(&ES(&YO="!Mg M=6QT:7!L92!O9B!C;&EC:W-I>F4@8GET97,B+" B(BD["E@J*BHJ*BHJ*BHJf M*BHJ*BH*6"HJ*B T-3 L-#8R("HJ*BH*6" @(" @(" K*W-E8W1R<SL*6" @e M"E@@(" @<F5A9%]B;&]C:R@P+"!U8G5F*3L@(" @(" @(" @+RH@<F5A9"!Id M;B!B;V]T(&)L;V-K("HO"E@A(" @=6)U9ELH4T5#5$]27U-)6D4O,BD@+2 Tc M72 ]('-E8W1R<SL*6"$@("!U8G5F6RA314-43U)?4TE:12\R*2 M(#-=(#T@b M9',["E@A(" @=6)U9ELH4T5#5$]27U-)6D4O,BD@+2 R72 ](&EP.PI8(2 @a M('5B=69;*%-%0U1/4E]325I%+S(I("T@,5T@/2!C<SL*6" @("!W<FET95]Bz M;&]C:R@P+"!U8G5F*3L*6" @?0I8(" *6" @<&%T8V@R*"D*6" @>PI8(" Oy M*B!4:&ES('!R;V=R86T@;F]W(&AA<R!I;F9O<FUA=&EO;B!A8F]U="!T:&4@x M<VEZ97,@;V8@=&AE(&ME<FYE;"P@;6TL(&9S+"!A;F0*6"TM+2 T.3DL-3(Tw M("TM+2T*6" @(" @(" K*W-E8W1R<SL*6" @"E@@(" @<F5A9%]B;&]C:R@Pv M+"!U8G5F*3L@(" @(" @(" @+RH@<F5A9"!I;B!B;V]T(&)L;V-K("HO"E@Au M( I8(2 @('!U=%]I;G0H8F]O=%]P87)M<RT^9&ES:U]S:7IE+" F=6)U9EM3t M25I%7T]&1E-%5%TI.PI8(2 @('!U=%]I;G0H8F]O=%]P87)M<RT^<V5C=&]Rs M<U]T<F%C:RP@)G5B=69;4T5#5%]/1D93151=*3L*6"$@("!P=71?:6YT*&)Or M;W1?<&%R;7,M/FYO7VAE861S+" F=6)U9EM(14%$7T]&1E-%5%TI.PI8(2 @q M('!U=%]I;G0H<V5C=')S+" F=6)U9EM314-43U)?4TE:12 M(#A=*3L*6"$@p M"E@A(" @<'5T7VEN="AD<RP@)G5B=69;4T5#5$]27U-)6D4@+2 V72D["E@Ao M(" @<'5T7VEN="AI<"P@)G5B=69;4T5#5$]27U-)6D4@+2 T72D["E@A(" @n M<'5T7VEN="AC<RP@)G5B=69;4T5#5$]27U-)6D4@+2 R72D["E@@(" @=W)Im M=&5?8FQO8VLH,"P@=6)U9BD["E@@('T*6" @"E@K('!U=%]I;G0H=F%L=64Ll M(&)U9F9E<BD*6"L@:6YT('9A;'5E.PI8*R!U;G-I9VYE9"!C:&%R("IB=69Fk M97(["E@K('L*6"L@"2IB=69F97(K*R ]('9A;'5E("8@,'AF9CL*6"L@"2IBj M=69F97(@(" ]('9A;'5E(#X^(#@["E@K('T*6"L@"E@@('!A=&-H,B@I"E@@i M('L*6" @+RH@5&AI<R!P<F]G<F%M(&YO=R!H87,@:6YF;W)M871I;VX@86)Oh M=70@=&AE('-I>F5S(&]F('1H92!K97)N96PL(&UM+"!F<RP@86YD"E@J*BHJg M*BHJ*BHJ*BHJ*BH*6"HJ*B V-S L-C@P("HJ*BH*6" @8VAA<B!B=69F,EM3f M14-43U)?4TE:15T["E@@(&EN="!D<FEV93L*6" @"E@A($E/:6YI="@I"0D)e M+RH@8VAE8VL@:68@;F\@1$U!;W9E<G)U;B F(&%S<VEG;B!T:&4@8G5F9F5Rd M("HO"E@A('L*6"$@("!I9B H1$U!;W9E<G)U;BAB=69F,2DI"E@A(" @(" @c M8G5F9B ](&)U9F8R.PI8(2 @(&5L<V4*6" @(" @("!B=69F(#T@8G5F9C$[b M"E@@('T*6" @"E@M+2T@-S,R+#<S.2 M+2TM"E@@(&-H87(@8G5F9C);4T5#a M5$]27U-)6D5=.PI8("!I;G0@9')I=F4["E@@( I8(2!)3VEN:70H*0D)"2\Jz M(&%S<VEG;B!T:&4@8G5F9F5R("HO"E@A('L*6" @(" @("!B=69F(#T@8G5Fy M9C$["E@@('T*6" @"E@J*BHJ*BHJ*BHJ*BHJ*BH*6"HJ*B V.#DL-CDU("HJx M*BH*6" @"E@@(" @<F5T<FEE<R ]($U!6%]215122453.PI8(" @(&1O"E@Aw M(" @(" @(&5R<B ](&%B<W)E860@*&1R:79E+"!B;&]C:VYR+"!B=69F*3L*v M6" @("!W:&EL92 H97)R("8F("TM<F5T<FEE<RD["E@@( I8(" @(&EF("@Au M<F5T<FEE<RD*6"TM+2 W-#@L-S4T("TM+2T*6" @"E@@(" @<F5T<FEE<R ]t M($U!6%]215122453.PI8(" @(&1O"E@A(" @(" @(&5R<B ](&%B<W)E860@s M*&1R:79E+" Q+"!B;&]C:VYR+"!B=69F*3L*6" @("!W:&EL92 H97)R("8Fr M("TM<F5T<FEE<RD["E@@( I8(" @(&EF("@A<F5T<FEE<RD*6"HJ*BHJ*BHJq M*BHJ*BHJ*@I8*BHJ(#<Q-"PW,C @*BHJ*@I8(" *6" @("!R971R:65S(#T@p M34%87U)%5%))15,["E@@(" @9&\*6"$@(" @(" @97)R(#T@86)S=W)I=&4@o M*&1R:79E+"!B;&]C:VYR+"!B=69F*3L*6" @("!W:&EL92 H97)R("8F("TMn M<F5T<FEE<RD["E@@( I8(" @(&EF("@A<F5T<FEE<RD*6"TM+2 W-S,L-S<Ym M("TM+2T*6" @"E@@(" @<F5T<FEE<R ]($U!6%]215122453.PI8(" @(&1Ol M"E@A(" @(" @(&5R<B ](&%B<W=R:71E("AD<FEV92P@,2P@8FQO8VMN<BP@k M8G5F9BD["E@@(" @=VAI;&4@*&5R<B F)B M+7)E=')I97,I.PI8(" *6" @j M("!I9B H(7)E=')I97,I"B\*96-H;R!X("T@;6%K969I;&4N8V1I9@IS960@i M)R]>6"]S+R\O)R ^(&UA:V5F:6QE+F-D:68@/#P@)R\G"E@J*BH@+W5S<B]Sh M<F,O,2XU7V)A<V4O=&]O;',O;6%K969I;&4)5V5D($1E8R R-R Q-CHU,#HSg M," Q.3@Y"E@M+2T@+BXO=&]O;',O;6%K969I;&4)1G)I($IA;B @-2 P,#HUf M.#HP." Q.3DP"E@J*BHJ*BHJ*BHJ*BHJ*BH*6"HJ*B T-BPU-B J*BHJ"E@@e M(",@)VUA:V4@;F5T)R!D;V5S('1H92!S86UE('1H:6YG+"!O;FQY('=I=&@@d M=&AE(&YE='=O<FMI;F<@8V]D92!F<F]M('1H90I8(" C("=A;6]E8F$@9&ERc M96-T;W)Y(&EN8VQU9&5D"E@@(",*6"$@:6UA9V4Z"6)U:6QD(&)O;W1B;&]Kb M( I8(2 )0&=E=&QF("));G-E<G0@8FQA;FL@9&ES:V5T=&4@:6X@9')I=F4@a M,"!A;F0@:&ET(')E='5R;B(*6"$@"4!B=6EL9"!B;V]T8FQO:R N+B]K97)Nz M96PO:V5R;F5L("XN+VUM+VUM("XN+V9S+V9S(&EN:70@9G-C:R!I;6%G90I8y M(2 )0&-P(&EM86=E("]D978O9F0P"E@A( I8("!N970Z"6)U:6QD(&)O;W1Bx M;&]K( I8(" )0&=E=&QF("));G-E<G0@8FQA;FL@9&ES:V5T=&4@:6X@9')Iw M=F4@,"!A;F0@:&ET(')E='5R;B(*6" @"4!B=6EL9"!B;V]T8FQO:R N+B]Av M;6]E8F$O:V5R;F5L+VME<FYE;" N+B]A;6]E8F$O;6TO;6T@7 I8+2TM(#0Vu M+#4U("TM+2T*6" @(R G;6%K92!N970G(&1O97,@=&AE('-A;64@=&AI;F<Lt M(&]N;'D@=VET:"!T:&4@;F5T=V]R:VEN9R!C;V1E(&9R;VT@=&AE"E@@(",@s M)V%M;V5B82!D:7)E8W1O<GD@:6YC;'5D960*6" @(PI8(2!I;6%G93H)8G5Ir M;&0@8F]O=&)L;VL@+BXO:V5R;F5L+VME<FYE;" N+B]M;2]M;2 N+B]F<R]Fq M<R!I;FET(&9S8VL@"E@A( E 9V5T;&8@(DEN<V5R="!B;&%N:R!D:7-K971Tp M92!I;B!D<FEV92 P(&%N9"!H:70@<F5T=7)N(@I8(2 )0&)U:6QD(&)O;W1Bo M;&]K("XN+VME<FYE;"]K97)N96P@+BXO;6TO;6T@+BXO9G,O9G,@:6YI="!Fn M<V-K("]D978O9F0P"E@A( D*6" @;F5T.@EB=6EL9"!B;V]T8FQO:R *6" @m M"4!G971L9B B26YS97)T(&)L86YK(&1I<VME='1E(&EN(&1R:79E(# @86YDl M(&AI="!R971U<FXB"E@@( E 8G5I;&0@8F]O=&)L;VL@+BXO86UO96)A+VMEk M<FYE;"]K97)N96P@+BXO86UO96)A+VUM+VUM(%P*+PIE8VAO('@@+2!B;V]Tj M8FQO:RYS"G-E9" G+UY8+W,O+R\G(#X@8F]O=&)L;VLN<R \/" G+R<*6'P@i M5VAE;B!T:&4@4$,@:7,@<&]W97)E9"!O;BP@:70@<F5A9',@=&AE(&9I<G-Th M(&)L;V-K(&9R;VT@=&AE(&9L;W!P>0I8?"!D:7-K(&EN=&\@861D<F5S<R Pg M>#=#,# @86YD(&IU;7!S('1O(&ET+B @5&AI<R!B;V]T(&)L;V-K(&UU<W0@f M8V]N=&%I;@I8?"!T:&4@8F]O="!P<F]G<F%M(&EN('1H:7,@9FEL92X@(%1He M92!B;V]T('!R;V=R86T@9FER<W0@8V]P:65S(&ET<V5L9B!T;PI8?"!A9&1Rd M97-S(#$Y,DL@+2 U,3(@*'1O(&=E="!I='-E;&8@;W5T(&]F('1H92!W87DIc M+B @5&AE;B!I="!L;V%D<R!T:&4@"EA\(&]P97)A=&EN9R!S>7-T96T@9G)Ob M;2!T:&4@8F]O="!D:7-K971T92!I;G1O(&UE;6]R>2P@86YD('1H96X@:G5Ma M<',@=&\@9G-C:RX*6'P@3&]A9&EN9R!I<R!N;W0@=')I=FEA;"!B96-A=7-Ez M('1H92!00R!I<R!U;F%B;&4@=&\@<F5A9"!A('1R86-K(&EN=&\*6'P@;65My M;W)Y(&%C<F]S<R!A(#8T2R!B;W5N9&%R>2P@<V\@=&AE('!O<VET:6]N:6YGx M(&]F(&5V97)Y=&AI;F<@:7,@8W)I=&EC86PN"EA\(%1H92!N=6UB97(@;V8@w M<V5C=&]R<R!T;R!L;V%D(&ES(&-O;G1A:6YE9"!A="!A9&1R97-S(#4P-"!Ov M9B!T:&ES(&)L;V-K+@I8?"!4:&4@=F%L=64@:7,@<'5T('1H97)E(&)Y('1Hu M92!B=6EL9"!P<F]G<F%M(&%F=&5R(&ET(&AA<R!D:7-C;W9E<F5D(&AO=PI8t M?"!B:6<@=&AE(&]P97)A=&EN9R!S>7-T96T@:7,N("!7:&5N('1H92!B;V]Ts M8FQO:R!P<F]G<F%M(&ES(&9I;FES:&5D(&QO861I;F<L"EA\(&ET(&IU;7!Sr M(&EN9&ER96-T;'D@=&\@=&AE('!R;V=R86T@*&9S8VLI('=H:6-H(&%D9')Eq M<W,@:7,@9VEV96X@8GD@=&AE"EA\(&QA<W0@='=O('=O<F1S(&EN('1H92!Bp M;V]T(&)L;V-K+B *6'P*6'P@4W5M;6%R>2!O9B!T:&4@=V]R9',@<&%T8VAEo M9"!I;G1O('1H92!B;V]T(&)L;V-K(&)Y(&)U:6QD.@I8? I8?"!7;W)D(&%Tn M(" Q.3H@(R!T;W1A;"!S96-T;W)S(&]N('1H92!D:7-K"EA\(%=O<F0@870@m M(#(T.B C('-E8W1O<G,@<&5R('1R86-K"EA\(%=O<F0@870@(#(V.B C(&AEl M861S(&]N(&1R:79E"EA\(%=O<F0@870@-3 T.B C('-E8W1O<G,@=&\@;&]Ak M9 I8?"!7;W)D(&%T(#4P-CH@(R!$4R!V86QU92!F;W(@9G-C:PI8?"!7;W)Dj M(&%T(#4P.#H@(R!00R!V86QU92!F;W(@9G-C:PI8?"!7;W)D(&%T(#4Q,#H@i M(R!#4R!V86QU92!F;W(@9G-C:PI8? I8?"!4:&ES('9E<G-I;VX@;V8@=&AEh M(&)O;W0@8FQO8VL@;75S="!B92!A<W-E;6)L960@=VET:&]U="!S97!A<F%Tg M92!)("8@1 I8?"!S<&%C92X@( I8?" @(" *6'P@069T97(@;6]D:69I8V%Tf M:6]N<R!D;R!A(&QS("UL(&)O;W1B;&]K+"!T:&4@<VEZ92!M=7-T(&)E(&QEe M<W,@=&AA;B U,#0A"EA\"EA\($IA;B V(#$Y.3 Z($UO9&EF:65D('1O(&=Ed M="!T:&4@9&ES:R!P87)A;65T97)S(&9R;VT@=&AE(&)O;W0@<V5C=&]R(&]Fc M"EA\(" @(" @(" @(" @('1H92!D:7-K("AP=70@;VX@=&AE(&1I<VL@8GD@b M=&AE(&9O<FUA="!P<F]G<F%M*2!T;R!A=F]I9 I8? D@(" @("!H879I;F<@a M=&\@=')Y('1O(&9I9W5R92!O=70@=VAA="!K:6YD(&]F(&1I<VL@:7,@:6X@z M=&AE( I8? D@(" @("!D<FEV92X@0V]R<F5S<&]N9&EN9R!M;V1I9FEC871Iy M;VYS(&YE961E9"!I;B!B=6EL9"YC"EA\"2 @(" @(%!E=&5R(%9A;B!%<' *x M6 I8"E@*6" @(" @(" @3$]!1%-%1R ](#!X,# V," @(" @(" @('P@:&5Rw M92!T:&4@8F]O="!B;&]C:R!W:6QL('-T87)T(&QO861I;F<*6" @(" @(" @v M0DE/4U-%1R ](#!X,#=#," @(" @(" @('P@:&5R92!T:&4@8F]O="!B;&]Cu M:R!I='-E;&8@:7,@;&]A9&5D"E@@(" @(" @($)/3U1314<@/2 P>#)&13 @t M(" @(" @("!\(&AE<F4@:70@=VEL;"!C;W!Y(&ET<V5L9B H,3DR2RTU,3)Bs M*0I8(" @(" @("!$4TM"05-%(#T@,3(P(" @(" @(" @(" @?" Q,C @/2 Tr M("H@,'@Q12 ]('!T<B!T;R!D:7-K('!A<F%M971E<G,*6 I89FEN86P@(" @q M/2 U,#0*6&9S8VM?9',@(#T@-3 V"EAF<V-K7W!C(" ](#4P. I89G-C:U]Cp M<R @/2 U,3 *6 I8"E@N9VQO8FP@8F5G=&5X="P@8F5G9&%T82P@8F5G8G-So M+"!E;F1T97AT+"!E;F1D871A+"!E;F1B<W,@('P@87-L9"!N965D<R!T:&5Sn M90I8+G1E>'0*6&)E9W1E>'0Z"E@N9&%T80I88F5G9&%T83H*6"YB<W,*6&)Em M9V)S<SH*6"YT97AT"E@*6'P@8V]P>2!B;V]T8FQO8VL@=&\@8F]O='-E9PI8l M(" @(" @("!M;W8@(" @(&%X+"-"24]34T5'"E@@(" @(" @(&UO=B @(" @k M9',L87@*6" @(" @(" @>&]R(" @("!S:2QS:2 @(" @(" @(" @?"!D<SISj M:2 M(&]R:6=I;F%L(&)L;V-K"E@@(" @(" @(&UO=B @(" @87@L(T)/3U13i M14<*6" @(" @(" @;6]V(" @("!E<RQA> I8(" @(" @("!X;W(@(" @(&1Ih M+&1I(" @(" @(" @("!\(&5S.F1I("T@;F5W(&)L;V-K"E@@(" @(" @(&UOg M=B @(" @8W@L(S(U-B @(" @(" @('P@(R @=V]R9',@=&\@;6]V90I8"6IMf M< EM;W9E"0E\(&)R86YC:"!A<F]U;F0@=&AE('-I>F4@<&%R86UE=&5R<PI8e M"EA\(%1H92 Y(&)Y=&5S(&%T(&]F9G-E=" P>#$S(&EN('1H92!B;V]T('-Ed M8W1O<B!A<F4@<F5S97)V960@9F]R('9A;'5E<PI8?"!F:6QL960@:6X@8GD@c M8G5I;&0@=7-I;F<@=&AE('9A;'5E<R!F;W(@=&AE(&1I<VL@<&%R86UE=&5Rb M<R!T:&%T('=E<F4*6'P@<V5T('=H96X@=&AE(&1I<VL@=V%S(&9O<FUA='1Ea M9"!B>2!$3U,@*&]R(&$@36EN:7@@9F]R;6%T('!R;V=R86TA*2X@"EA\(%-Iz M;F-E($1/4R!P=71S('1H92!V86QU97,@870@=&AE('-P96-I86P@;&]C871Iy M;VYS('5S960@:&5R92P@8G5I;&0@9&]E<PI8?"!T:&4@<V%M92 H979E;B!Tx M:&]U9V@@:70@;6%K97,@=&AE(&-O9&4@;65S<WDI('-O('1H870@8G5I;&0@w M9&]E<VXG="!H879E"EA\('1O(&9I9W5R92!O=70@:68@=&AI<R!I<R!A($1/v M4R!F;W)M871T960@9&ES:RP@;W(@86X@;VQD($UI;FEX(&1I<VLL(&ET"EA\u M(&IU<W0@8V]P:65S('1H92!V86QU97,@9F]R('1H92 Y(&)Y=&5S(&9R;VT@t M=&AE(&)O;W0@<V5C=&]R(&]F('1H92!D:7-K"EA\(&%N9"!P871C:&5S('1Hs M96T@:6YT;R!T:&4@8F]O=&)L;VL@:6UA9V4@870@=&AE('-A;64@<&QA8V4@r M=&AA="!$3U,@<'5T<PI8?"!T:&5M+B!!="!P<F5S96YT+"!T:&4@;G5M8F5Rq M(&]F(&AE861S(&ES(&%S<W5M960@=&\@8F4@,B!S:6YC92!S:6YG;&4@<VEDp M960*6'P@9&ES:W,@87)E(&YO="!S=7!P;W)T960N(%1H92!V86QU92!I<R!Ho M97)E('1O(&%L;&]W('-U<'!O<G0@=&\@8F4@861D960@"EA\(&QA=&5R(&5An M<VEL>2 H:68@<V]M96]N92!N965D<R!I="$I+@I8"EAS:7IE.@I8"2YW;W)Dm M( DP"0E\('1O=&%L(&1I<VL@<VEZ92 H9FEL;&5D(&EN(&)Y(&)U:6QD*0I8l M"E@)+G=O<F0), D)?"!P860@8GET97,@<&%S="!U;G5S960@1$]3('!A<F%Mk M971E<G,*6 DN8GET90DP"E@*6'1R86-K<VEZ.@I8"2YW;W)D"3 )"7P@<V5Cj M=&]R<R]T<F%C:R H9FEL;&5D(&EN(&)Y(&)U:6QD*0I8:&5A9',Z"E@)+G=Oi M<F0), D)?"!N=6UB97(@;V8@:&5A9',@*&9I;&QE9"!I;B!B>2!B=6EL9"D*h M6 I8? ET:&4@8F]O="!C;V1E('-T87)T<R!A9V%I;B!H97)E(0I8"EAM;W9Eg M.@ER97 *6 EM;W9W"0D)?"!C;W!Y(&QO;W *6 D*6'P@<W1A<G0@8F]O="!Pf M<F]C961U<F4*6 EJ;7!I"7-T87)T+"!"3T]44T5'"7P@<V5T(&-S('1O($)/e M3U1314<*6 I8<W1A<G0Z"E@);6]V(" @("!D>"QC<PI8(" @(" @("!M;W8@d M(" @(&1S+&1X(" @(" @(" @("!\('-E="!D<R!T;R!C<PI8(" @(" @("!Xc M;W(@(" @(&%X+&%X"E@@(" @(" @(&UO=B @(" @97,L87@@(" @(" @(" @b M('P@<V5T(&5S('1O(# *6" @(" @(" @;6]V(" @("!S<RQD>" @(" @(" @a M(" @?"!S970@<W,@=&\@8W,@:2YE+BP@<W1A8VL@:6X@:&EG:"!C;W)E"E@@z M(" @(" @(&UO=B @(" @<W L(S$U,S8@(" @(" @('P@:6YI=&EA;&EZ92!Sy M<"!T;R!H:6=H(&-O<F4*6 I8?"!P<FEN="!G<F5E=&EN9PI8"6UO=@EA>"PCx M,@D)?"!R97-E="!V:61E;PI8"6EN= DP>#$P"E@*6" @(" @(" @;6]V(" @w M("!A>"PC,'@P,C P"7P@0DE/4R!C86QL(&EN('!U="!C=7)S;W(@:6X@=6P@v M8V]R;F5R"E@@(" @(" @('AO<B @(" @8G@L8G@*6" @(" @(" @>&]R(" @u M("!D>"QD> I8(" @(" @("!I;G0@(" @(#!X,3 *6" @(" @(" @;6]V(" @t M("!B>"PC9W)E970*6" @(" @(" @8V%L;" @("!P<FEN= I8"EA\($EN:71Is M86QI>F4@9&ES:R!P87)A;65T97)S(&)Y(')E861I;F<@=VAA="!F;W)M870@r M<V%I9"!T:&4@9&ES:R!W87,@=VAE;@I8?"!I="!W87,@9F]R;6%T=&5D+B!)q M9B!T:&4@<VEZ92!O9B!T:&4@9&ES:R!I<R P("AT:&4@:6YI=&EA;"!V86QUp M92!A8F]V92D*6'P@8V]M<&QA:6X@86)O=70@86X@;VQD('9E<G-I;VX@;V8@o M8G5I;&0@8F5I;F<@=7-E9"!T;R!M86ME('1H92!D:7-K+ I8?"!O=&AE<G=In M<V4@<V5T('5P('1H92!N=6UB97(@;V8@<V5C=&]R<R!P97(@=')A8VL@=F%Lm M=64L('-E;&5C="!A('!A<F%M=&5R"EA\('-E="!A;F0@<F5S970@=&AE(&1Il M<VL@8V]N=')O;&QE<B!V:6$@0FEO<R!B969O<F4@8V]N=&EN=6EN9R!W:71Hk M('1H92!B;V]T+@I8"E@)8VUP"7-I>F4L(S )"7P@:68@=&AE('1O=&%L(&1Ij M<VL@<VEZ92!I<R P('1H96X@8V]M<&QA:6X*6 EM;W8)8G@L(V)U:6QD;7-Gi M"7P@<V5T('1H92!E<G)O<B!M97-S86=E(&EN(&-A<V4@;V8@97)R;W(*6 EJh M90EE<G)O<@I8"0D)"0I8"6UO=@EA>"QS:7IE"0E\(&=E="!T:&4@=&]T86P@g M;G5M8F5R(&]F('-E8W1O<G,@=&\@<V5L96-T"E@);6]V"6-X+"-F9#$T-&T)f M?"!S970@=7 @9F]R(&$@,2XT-&T@,RXU(&EN8V@@9')I=F4*6 EC;7 )87@Le M(V9D,30T<PE\(&EF(&ET(&ES('1H96X@8G)A;F-H('1O('-E="!T:&4@<&%Rd M86UE=&5R<PI8"6IE"7)E<V5T"E@*6 EM;W8)8W@L(V9D,3)M"7P@:68@;F]Tc M+"!S970@=7 @9F]R(#$N,DT@-2XR-2!I;F-H(&1R:79E"E@)8VUP"6%X+"-Fb M9#$R<PE\(&EF(&ET(&ES('1H96X@8G)A;F-H('1O('-E="!T:&4@<&%R86UEa M=&5R<PI8"6IE"7)E<V5T"E@*6 EM;W8)8W@L(V9D-S(P:PE\(&EF(&YO="P@z M<V5T('5P(&9O<B!A(#<R,&L@,RXU(&EN8V@@9')I=F4*6 EC;7 )87@L(V9Dy M-S(P<PE\(&EF(&ET(&ES('1H96X@8G)A;F-H('1O('-E="!T:&4@<&%R86UEx M=&5R<PI8"6IE"7)E<V5T"E@*6 EM;W8)8W@L(V9D,S8P:PE\(&EF(&YO="!Sw M970@=7 @9F]R(&$@,S8P:R U+C(U(&EN8V@@9')I=F4*6 EC;7 )87@L(V9Dv M,S8P<PE\(&EF(&ET(&ES('1H96X@8G)A;F-H('1O('-E="!T:&4@<&%R86UEu M=&5R<PI8"6UO=@EB>"PC8F%D7V1R:79E"7P@=&AE('1H92!B860@9')I=F4@t M;65S<V%G92!I;B!C87-E(&]F(&5R<F]R"E@):FYE"65R<F]R"0E\(&EF(&YOs M="!R97!O<G0@=&AA="!T:&ES(&1R:79E(&ES(&YO="!S=7!P;W)T960A"E@*r M6')E<V5T.@I8"E@)>&]R"6%X+&%X"0E\('-E="!%4R!T;R!S96=M96YT(# @q M=&\@861D<F5S<R P,# W."!W:&EC: I8"6UO=@EE<RQA> D)?"!I<R!);G0@p M,'@Q12!W:&5R92!$3U,@97AP96-T<R!T:&4@9&ES:PI8"7-E9PEE<PD)?"!Po M87)A;65T97)S('!O:6YT960@=&\@86)O=F4@=&\@8F4N(%!U= I8"6UO=@E$n M4TM"05-%+&-X"7P@;W5R(&1A=&$@<V5G;65N="!A;F0@=&AE(&]F9G-E="!Om M9B!T:&4@"E@);6]V"6%X+&1S"0E\(&1I<VL@<&%R86UE=&5R('1A8FQE(&1El M=&5R;6EN960@86)O=F4@:6YT;PI8"7-E9PEE<PD)?"!T:&4@8V]R<F5C="!Lk M;V-A=&EO;G,@=&AE;B!R97-E="!T:&4@9&ES:PI8"6UO=@E$4TM"05-%*S(Lj M87@)?"!D<FEV92!V:6$@82!C86QL('1O($1/4R!B969O<F4@<')O8V5E9&ENi M9PI8"0D)"0I8"7AO<@EA>"QA> D)?"!T;R!L;V%D($UI;FEX(&EN+@I8"6ENh M= DP>#$S"E@)"EA\($QO860@=&AE(&]P97)A=&EN9R!S>7-T96T@9G)O;2!Dg M:7-K971T92X*6&QO860Z"E@)8V%L; ES971R96<)"7P@<V5T('5P(&%H+"!Cf M>"P@9'@*6 EM;W8)8G@L9&ES:W-E8PE\(&)X(#T@;G5M8F5R(&]F(&YE>'0@e M<V5C=&]R('1O(')E860*6 EA9&0)8G@L(S()"7P@9&ES:V5T=&4@<V5C=&]Rd M(#$@9V]E<R!A=" Q-3,V("@B<V5C=&]R(B S*0I8"7-H; EB>"PC,0D)?"!Mc M=6QT:7!L>2!S96-T;W(@;G5M8F5R(&)Y(#,R"E@)<VAL"6)X+",Q"0E\(&1Ib M='1O"E@)<VAL"6)X+",Q"0E\(&1I='1O"E@)<VAL"6)X+",Q"0E\(&1I='1Oa M"E@)<VAL"6)X+",Q"0E\(&1I='1O"E@);6]V"65S+&)X"0E\(&-O<F4@861Dz M<F5S<R!I<R!E<SIB>" H=VET:"!B>" ](# I"E@)>&]R"6)X+&)X"0E\('-Ey M92!A8F]V90I8"6%D9 ED:7-K<V5C+&%X"7P@87@@=&5L;',@:&]W(&UA;GD@x M<V5C=&]R<R!T;R!R96%D"E@);6]V8@EA:"PC,@D)?"!O<&-O9&4@9F]R(')Ew M860*6 EI;G0),'@Q,PD)?"!C86QL('1H92!"24]3(&9O<B!A(')E860*6" @v M(" @(" @;6]V(" @("!B>"PC9F1E<G()?"!S970@=7 @=&AE(&5R<F]R(&UEu M<W-A9V4@:6X@8V%S92!O9B!E<G)O<@I8"6IB"65R<F]R"0E\(&IU;7 @;VX@t M9&ES:V5T=&4@97)R;W(*6 EM;W8)87@L9&ES:W-E8PE\('-E92!I9B!W92!As M<F4@9&]N92!L;V%D:6YG"E@)8VUP"6%X+&9I;F%L"7P@9&ET=&\*6 EJ8@ELr M;V%D"0E\(&IU;7 @:68@=&AE<F4@:7,@;6]R92!T;R!L;V%D"E@*6'P@3&]Aq M9&EN9R!D;VYE+B @1FEN:7-H('5P+@I8(" @(" @("!M;W8@(" @(&1X+",Pp M># S1C(@(" @("!\(&MI;&P@=&AE(&UO=&]R"E@@(" @(" @(&UO=B @(" @o M87@L(S!X,# P0PI8(" @(" @("!O=70*6" @(" @(" @8VQI"E@);6]V"6)Xn M+'1R86-K<VEZ"7P@9G-C:R!E>'!E8W1S(",@<V5C=&]R<R]T<F%C:R!I;B!Bm M> I8(" @(" @("!M;W8@(" @(&%X+&9S8VM?9',@(" @("!\('-E="!S96=Ml M96YT(')E9VES=&5R<PI8(" @(" @("!M;W8@(" @(&1S+&%X(" @(" @(" @k M("!\('=H96X@<V5P($DF1"!$4R A/2!#4PI8(" @(" @("!M;W8@(" @(&5Sj M+&%X(" @(" @(" @("!\(&]T:&5R=VES92!T:&5Y(&%R92!T:&4@<V%M92X*i M6" @(" @(" @;6]V(" @("!S<RQA>" @(" @(" @(" @?"!W;W)D<R U,#0@h M+2 U,3 @87)E('!A=&-H960@8GD@8G5I;&0*6 I8"7-E9R!C<PI8"6IM<&D)g M0&9S8VM?<&,)?"!J;7 @=&\@9G-C:PI8"EA\($=I=F5N('1H92!N=6UB97(@f M;V8@=&AE(&YE>'0@9&ES:R!B;&]C:R!T;R!R96%D+"!D:7-K<V5C+"!C;VUPe M=71E('1H90I8?"!C>6QI;F1E<BP@<V5C=&]R+"!H96%D+"!A;F0@;G5M8F5Rd M(&]F('-E8W1O<G,@=&\@<F5A9"!A<R!F;VQL;W=S.@I8?"!A:" ](",@<V5Cc M=&]R<R!T;R!R96%D.R @8VP@/2!S96-T;W(@(SL@(&-H(#T@8WEL.R @9&@@b M/2!H96%D.R!D;" ](# *6'-E=')E9SH)"E@);6]V"7-I+'1R86-K<VEZ"7P@a M.2 H4$,I(&]R(#$U("A!5"D@<V5C=&]R<R!P97(@=')A8VL*6 EM;W8@"6%Xz M+&1I<VMS96,)?"!A>" ](&YE>'0@<V5C=&]R('1O(')E860*6 EX;W()9'@Ly M9'@)"7P@9'@Z87@@/2 S,BUB:70@9&EV:61E;F0*6 ED:78)<VD)"7P@9&EVx M:61E('-E8W1O<B C(&)Y('1R86-K('-I>F4*6 EM;W8)8W@L87@)"7P@8W@@w M/2!T<F%C:R C.R!D>" ]('-E8W1O<B H,"UO<FEG:6XI"E@);6]V"6)X+&1Xv M"0E\(&)X(#T@<V5C=&]R(&YU;6)E<B H,"UO<FEG:6XI"E@);6]V"6%X+&1Iu M<VMS96,)?"!A>" ](&YE>'0@<V5C=&]R('1O(')E860*6 EA9&0)87@L<VD)t M"7P@87@@/2!L87-T('-E8W1O<B!T;R!R96%D("L@,0I8"61E8PEA> D)?"!As M>" ](&QA<W0@<V5C=&]R('1O(')E860*6 EX;W()9'@L9'@)"7P@9'@Z87@@r M/2 S,BUB:70@9&EV:61E;F0*6 ED:78)=')A8VMS:7H)?"!D:79I9&4@;&%Sq M="!S96-T;W(@8GD@=')A8VL@<VEZ90I8"6-M<&()86PL8VP)"7P@:7,@<W1Ap M<G1I;F<@=')A8VL@/2!E;F1I;F<@=')A8VL*6 EJ90ES970Q"0E\(&IU;7 @o M:68@=VAO;&4@<F5A9"!O;B Q(&-Y;&EN9&5R"E@)<W5B"7-I+&1X"0E\(&-On M;7!U=&4@;&]W97(@<V5C=&]R(&-O=6YT"E@)9&5C"7-I"0E\('-I(#T@(R!Sm M96-T;W)S('1O(')E860*6 I8?"!#:&5C:R!T;R!S964@:68@=&AI<R!R96%Dl M(&-R;W-S97,@82 V-$L@8F]U;F1A<GD@*#$R."!S96-T;W)S*2X*6'P@4W5Ck M:"!C86QL<R!M=7-T(&)E(&%V;VED960N("!4:&4@0DE/4R!G971S('1H96T@j M=W)O;F<N"EAS970Q.@EM;W8)87@L9&ES:W-E8PE\(&%X(#T@;F5X="!S96-Ti M;W(@=&\@<F5A9 I8"6%D9 EA>"PC,@D)?"!D:7-K('-E8W1O<B Q(&=O97,@h M:6X@8V]R92!S96-T;W(@,PI8"6UO=@ED>"QA> D)?"!D>" ](&YE>'0@<V5Cg M=&]R('1O(')E860*6 EA9&0)9'@L<VD)"7P@9'@@/2!O;F4@<V5C=&]R(&)Ef M>6]N9"!E;F0@;V8@<F5A9 I8"61E8PED> D)?"!D>" ](&QA<W0@<V5C=&]Re M('1O(')E860*6 ES:&P)87@L(S$)"7P@86@@/2!W:&EC:" V-$L@8F%N:R!Dd M;V5S(')E860@<W1A<G0@870*6 ES:&P)9'@L(S$)"7P@9&@@/2!W:&EC:" Vc M-$L@8F%N:R!F;V5S(')E860@96YD(&EN"E@)8VUP8@EA:"QD: D)?"!A:" Ab M/2!D:"!M96%N<R!R96%D(&-R;W-S97,@-C1+(&)O=6YD87)Y"E@):F4)<V5Ta M,@D)?"!J=6UP(&EF(&YO(&)O=6YD87)Y(&-R;W-S960*6 ES:')B"61L+",Qz M"0E\(&1L(#T@97AC97-S(&)E>6]N9" V-$L@8F]U;F1A<GD*6 EX;W)B"61Hy M+&1H"0E\(&1X(#T@97AC97-S(&)E>6]N9" V-$L@8F]U;F1A<GD*6 ES=6()x M<VDL9'@)"7P@861J=7-T('-I"E@)9&5C"7-I"0E\('-I(#T@;G5M8F5R(&]Fw M('-E8W1O<G,@=&\@<F5A9 I8"EAS970R.@EM;W8)87@L<VD)"7P@87@@/2!Nv M=6UB97(@;V8@<V5C=&]R<R!T;R!R96%D"E@)>&]R"61X+&1X"0E\(&1H(#T@u M:&5A9"P@9&P@/2!D<FEV90I8"6UO=F()9&@L8VP)"7P@9&@@/2!T<F%C:PI8t M"6%N9&()9&@L(S!X,#$)?"!D:" ](&AE860*6 EM;W9B"6-H+&-L"0E\(&-Hs M(#T@=')A8VL@=&\@<F5A9 I8"7-H<F()8V@L(S$)"7P@8V@@/2!C>6QI;F1Er M<@I8"6UO=F()8VPL8FP)"7P@8VP@/2!S96-T;W(@;G5M8F5R("@P+6]R:6=Iq M;BD*6 EI;F-B"6-L"0E\(&-L(#T@<V5C=&]R(&YU;6)E<B H,2UO<FEG:6XIp M"E@)>&]R8@ED;"QD; D)?"!D;" ](&1R:79E(&YU;6)E<B H,"D*6 ER970)o M"0E\(')E='5R;B!V86QU97,@:6X@87@L(&-X+"!D> I8"E@*6'PM+2TM+2TMn M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM*PI8?" @("!E<G)O<B F('!R:6YTm M(')O=71I;F5S(" @("!\"EA\+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TMl M+2TM+2L*6 I8?" )<')I;G0@=&AE(&5R<F]R(&UE<W-A9V4@<&]I;G1E9"!Tk M;R!B>2!"6"!T:&5N(')E8F]O="$)"E@*6&5R<F]R.@I8(" @(" @("!P=7-Hj M(" @(&%X"E@@(" @(" @(&-A;&P@(" @<')I;G0@(" @(" @(" @('P@<')Ii M;G0@;7-G"E@)>&]R"6-X+&-X"EAE<G(Q.@EM=6P), D)?"!D96QA>0I8"6QOh M;W )97)R,0I8"6EN= DP>#$Y"E@*6 I8<')I;G0Z(" @(" @(" @(" @(" @g M(" @(" @(" @("!\('!R:6YT('-T<FEN9R H8G@I"E@@(" @(" @(&UO=F()f M86PL*&)X*0D@(" @(" @('P@86P@8V]N=&%I;G,@8VAA<B!T;R!B92!P<FENe M=&5D"E@@(" @(" @('1E<W1B(" @86PL86P@(" @(" @(" @('P@;G5L;"!Cd M:&%R/PI8(" @(" @("!J;F4@(" @('!R=#$@(" @(" @(" @("!\(&YO"E@@c M(" @(" @(')E=" @(" @(" @(" @(" @(" @(" @('P@96QS92!R971U<FX*b M6'!R=#$Z(" @;6]V8B @("!A:"PC,30@(" @(" @(" @?" Q-" ]('!R:6YTa M(&-H87(*6" @(" @(" @:6YC(" @("!B>" @(" @(" @(" @(" @?"!I;F-Rz M96UE;G0@<W1R:6YG('!O:6YT97(*6" @(" @(" @<'5S:" @("!B>" @(" @y M(" @(" @(" @?"!S879E(&)X"E@@(" @(" @(&UO=F(@(" @8FPL(S$@(" @x M(" @(" @('P@9F]R96=R;W5N9"!C;VQO<@I8"7AO<F()8F@L8F@)"7P@<&%Gw M92 P"E@@(" @(" @(&EN=" @(" @,'@Q," @(" @(" @(" @('P@8V%L;"!"v M24]3(%9)1$5/7TE/"E@@(" @(" @('!O<" @(" @8G@@(" @(" @(" @(" @u M('P@<F5S=&]R92!B> I8(" @(" @("!J;7 @(" @('!R:6YT(" @(" @(" @t M("!\(&YE>'0@8VAA<F%C=&5R"E@*6'P)9&%T82!A<F5A"E@*6&1I<VMS96,Zs M+G=O<F0@,0I8"E@*6 I8?"TM+2TM+2TM+2TM+2TM+2T@1FQO<'!Y(&1I<VL@r M<&%R86UE=&5R('1A8FQE<R M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM"E@*q M6'P@,2XT-"!M96<@,RXU(&EN8V@@9FQO<'!Y('!A<F%M971E<G,@*%!3+S(@p M;6%C:&EN97,I( I8"EAF9#$T-',@/2 R.#@P"7P@;G5M8F5R(&]F('-E8W1Oo M<G,@;VX@,2XT-&T@9&ES:PI8"0I89F0Q-#1M.@DN8GET90DP>$$Q+" P># Rn M+" P>#(U+" R+" Q."P@,'@Q0BP@,'A&1BP@,'@V0RP@,'A&-BP@,'@P1BP@m M- I8"EA\(#$N,B!M96<@-2XR-2!I;F-H(&9L;W!P>2!P87)A;65T97)S("A!l M5"!H:6=H(&1E;G-I='DI"E@*6&9D,3)S(" ](#(T,# )?"!N=6UB97(@;V8@k M<V5C=&]R<R!O;B!A(#$N,FT@9&ES:PI8"EAF9#$R;3H)+F)Y=&4),'A$1BP@j M,'@P,BP@,'@R-2P@,BP@,34L(#!X,4(L(#!X1D8L(#!X-30L(#!X1C8L(#!Xi M,#$L(#@@"E@@"EA\(#<R,&L@,RXU(&EN8V@@9FQO<'!Y('!A<F%M971E<G,@h M*%!3+S(G<R _*0I8"EAF9#<R,',@/2 Q-#0P"7P@;G5M8F5R(&]F('-E8W1Og M<G,@;VX@9&ES:PI8"EAF9#<R,&LZ"2YB>71E"3!X1$8L(#!X,#(L(#!X,C4Lf M(#(L(#DL(#!X,D$L(#!X1D8L(#!X-3 L(#!X1C8L(#!X,$8L(#(@"E@*6'P@e M,S8P:R U+C(U(&EN8V@@9FQO<'!Y('!A<F%M971E<G,@*%!#(%A4(&5T8RXId M"E@*6&9D,S8P<R ](#<R, E\(&YU;6)E<B!O9B!S96-T;W)S(&]N(&$@,S8Pc M:R!D:7-K"E@*6&9D,S8P:SH)+F)Y=&4),'A$1BP@,'@P,BP@,'@R-2P@,BP@b M(#DL(#!X,D$L(#!X1D8L(#!X-3 L(#!X1C8L(#!X,#$L(#,@"E@*6'PM+2TMa M+2TM+2TM+2TM+2TM+2TM+2!%;F0@;V8@9FQO<'!Y('!A<F%M971E<B!T86)Lz M97,@+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2T*6 I88G5I;&1M<V<Z"E@)+F%Sy M8VEZ(")$:7-K('-I>F4@,%QR7&XB( I8"EAB861?9')I=F4Z"E@)+F%S8VEZx M(")"860@9')I=F4@='EP95QR7&XB"E@*6&9D97)R.@DN87-C:7H@(E)E860@w M97)R;W(N7')<;B(*6 I89W)E970Z"2YA<V-I>B B7')";V]T:6YG($U)3DE8v M(#$N-2XP+B @0V]P>7)I9VAT(#$Y.3 @4')E;G1I8V4M2&%L;"P@26YC+EQRu M7&XB"E@*6'P@1&]N)W0@9F]R9V5T('1H870@=V]R9',@-3 P("T@-3$P(&%Rt M92!F:6QL960@:6X@8GD@8G5I;&0N("!4:&4@<F5G=6QA<@I8?"!C;V1E(&AAs M9"!B971T97(@;F]T(&=E="!T:&%T(&9A<BX*6"YT97AT"EAE;F1T97AT.@I8r A+F1A=&$*6&5N9&1A=&$Z"E@N8G-S"EAE;F1B<W,Z"B\*q p end
aubrey@rpp386.cactus.org (Aubrey McIntosh) (01/11/90)
I think Glen Overby first mentioned using a descriptor block on a disk. I agree that a disk description should be in the first sector on the disk. Also, that it is the job of the Format program to place it there, as well as doing any interleaving. The MS-DOS diskette description is a useful one, since there are tools such as Norton's utilities, that let us repair boo boos in an environment that many of us are fluent in. Other descriptions exist, such as the one from OS-9. That one is excellent, but there is no provision for the block to be executable. So I'd go for the MS descriptor, but I'd also like to hear what else is out there. Also, about grinding heads... I get the impression that people are seeking out to track 79 to see if its a big disk. My machine sounds like it will explode or something, the dog runs under the sofa, the wife comes in to help... Why not just seek to track 40? -- Aubrey McIntosh comp.os.minix, comp.lang.modula2, soc.culture.celtic Austin, TX 78723 1-(512)-452-1540 (v)
paula@bcsaic.UUCP (Paul Allen) (01/12/90)
In article <7806@nigel.udel.EDU> Peter_Van_Epp@cc.sfu.ca writes: >The following uue encoded shar file will allow Minix to be booted from 1.44m >3.5 inch floppies (and 1.2m AT floppies and 720k 3.5 floppies and last but >not least 360k 5.25 floppies) and has been booted succesfully from all of them! Great! Thanks! [Description of problems determining floppy type] >To fix this (and to start addressing a similar problem in floppy.c!) I looked >at the data in the DOS boot sector (in Advanced MSDOS by Ray Duncan good book!). >and discovered that the total number of sectors, number of sectors per track, >and number of heads are written into offset 0x13 to 0x1B of the boot block. >I have now modified bootblok.s (here in source form since the cdif was 10k and >the source was 11k and change!), build.c and the makefile. [...] > At boot time, bootblok.s has been modified to read the >total size of the disk from location 0x13 (put there by build) and checks that >it is one of 720, 1440, 2400, or 2800 sectors (360k etc.) and selects the >correct parameter block for the floppy controller (or complains if the drive >doesn't match!). As mentioned, this code has been used to succesfully boot >all of these disks (and 720k in 1.44m drives but not 360k in 1.2m) and it all >seems to work. I intend to now look at doing the same thing to floppy.c and >mkfs [...] All this is fine for boot disks and disks with filesystems on them. People tinkering with code to do floppy formatting under Minix should probably try to create a bootblock as close to the one DOS creates as possible. But please remember that not all floppies have boot blocks. Since I have a nice big hard disk, I almost never put a file system on a floppy. 99% of my Minix floppies contain raw data such as tar archives. I suppose we could redefine the meaning of "raw device" such that the first block on a floppy is reserved, but that invalidates all my existing backup disks. It would seem that the only reliable way to 'discover' the media type at run time is to try various combinations of sector numbers and track numbers to find out what works. Does it destroy a 40-track drive if you seek to track 41? Is there a hard stop that prevents seeking one track past the last track? Here, briefly, is a restatement of what I think may be a solution for the floppy problem: Create dev_open() and dev_close() routines to replace the floppy driver's current null routines. The new fl_open() uses some heuristic (probably some combination of seeks and reads) to determine the drive/media combination. A message is sent to fs informing it of the current size of the device. Now fs can do the right thing at end-of-volume without the size-in-the-inode kluge. The floppy driver doesn't need the logic to try different values for the drive/media code, since fl_open() has already figured it out. The new fl_close() routine sends a message to the fs invalidating the device size information for the drive. I haven't implemented any of this, and probably won't have time to try for another week or so. If anybody can see problems with what I propose, please let me know. (Gently, please! I'm a sensitive sort of guy! :-) Paul Allen -- ------------------------------------------------------------------------ Paul L. Allen | pallen@atc.boeing.com Boeing Advanced Technology Center | ...!uw-beaver!bcsaic!pallen
Peter_Van_Epp@cc.sfu.ca (01/12/90)
>I think Glen Overby first mentioned using a descriptor block on a disk. Glen probably discovered (as I did) that Paul is right anything doing I/O to the raw device will overwrite the block, I can't see a way to do this but am open to suggestions! >Also, about grinding heads... I get the impression that people are >seeking out to track 79 to see if its a big disk. My machine sounds >like it will explode or something, the dog runs under the sofa, the wife >comes in to help... >Why not just seek to track 40? >-- >Aubrey McIntosh >comp.os.minix, comp.lang.modula2, soc.culture.celtic >Austin, TX 78723 Because some 5.25s will get to track 41, and because the floppy controller doesn't know how many tracks the drive has (and in at least some cases neither does the drive except via a mechanical stop!) so if you seek any thing past the end of the drive you risk damaging the drive (with the note that I am not a drive designer but it sure sounds dangerous!). I should point out that the above problem does not affect my boot mods (which I suspect is where the grinding you hear is) and will not seek past the end of the drive because it figures out from the bootblock how big the drive is. Peter Van Epp
evans@ditsyda.oz (Bruce Evans) (01/16/90)
In article <7961@nigel.udel.EDU> Peter_Van_Epp@cc.sfu.ca writes: [Aubrey McIntosh writes] >>Why not just seek to track 40? >[...] >Because some 5.25s will get to track 41, and because the floppy >controller doesn't know how many tracks the drive has (and in >at least some cases neither does the drive except via a mechanical >stop!) This is one reason I don't much like the idea of a "media sensitive" floppy device. Even the floppy driver itself can only guess! Paul Allen suggested detecting the media type in the dev_open routine for the floppy device. This routine lives in FS and would have a hard time getting the necessary information from the existing floppy driver. It should be just a stub which asks the floppy driver to decide. The driver would return mainly the size of the device (which can be stored into the inode field so existing code works). My changes to FS in 1.5 would be better if they knew how many blocks per track are on the device. The floppy driver can do a better job than now, without bashing the heads. I added code to the 1.5 driver to read the sector ids off the disk. This can be used used to count the number of sectors by reading track 0. (I once use the ids to handle a couple of ancient weird formats with track 0 special.) If the wrong rate or steps_per_cyl is tried, I think there will be an error between tracks 0 and 1. So looking at tracks 0 and 1 gives a lot of info, enough to determine the index 'd' into the tables in the floppy driver, except for types 0 and 2 (360K and 720K). This is slow, and too much work for a guess. Yet the DOS method of relying on the parameter block is no good. If there is no parameter block, DOS has to give up. I prefer the other idea of encoding the device type in the minor number. We should also consider encoding the type in the device name, e.g. /dev/fd2s80t10s (360K disks formatted to 800K in an AT drive!). The advantage is that the driver need not be changed to handle minor variations - 80t10s looks like 80t9s and ancient 40t8s looks like 40t9s. To provide for both cases, dev_open could build a message containing the minor number and the device name, and rely on the floppy driver to decide the size and other useful info. There is little need to keep the media-sensitive device. For booting, a DOS-style parameter table can be used. Earl Chew's "shoelace" boot program already does this. In 1.5, FS knows which device contains the root image (e.g. 1.5 can boot from /dev/at0, then read the root file system off /dev/at1) and will have no trouble with the encoding. Now the default is in <minix/boot.h> and this can be changed at boot time. Shoelace is more flexible. The default is in a text file /etc/config and it will be easy to convert the DOS parameter block to a device number, so everything will be automatic. -- Bruce Evans evans@ditsyda.oz.au
gwr@linus.UUCP (Gordon W. Ross) (01/17/90)
In article <7961@nigel.udel.EDU> Peter_Van_Epp@cc.sfu.ca writes: [Aubrey McIntosh writes] >>Why not just seek to track 40? >[...] >Because some 5.25s will get to track 41, and because the floppy >controller doesn't know how many tracks the drive has (and in >at least some cases neither does the drive except via a mechanical >stop!) The standard way to determine 40 vs. 80 track drive is as follows: (Pseudo code, based on IBM BIOS listing) Recalibrate drive, seek to track 48 (40 track drives can't seek this far) seek to track 10 (40 track drive now has position < 10) for (trk=10; trk; trk--) { Tell FDC to sense-status of floppy if floppy status has TRACK_0 bit on disk is only 40 tracks return(disk_is_40_tracks); } return(disk_is_80_tracks); Note that this test only needs to be done once at driver initialization time. The number of tracks on the DRIVE never changes, though a 360KB disk in a 1.2MB drive only uses (40) even cylinders. This is one reason I don't much like the idea of a "media sensitive" floppy device. Even the floppy driver itself can only guess! Automatically sensing the media type (of a formatted disk) can be done by reading track 0 and track 1, as Bruce Evans suggested. This should be done on every dev_open call to the floppy driver. An algorithm for determining media format is as follows: (We already know the size of the DRIVE.) If drive has 80 tracks, Seek to track 1 If sector 1 is readable, It's an 80 track format Else Assume 40 track disk in 80 track drive. (Double-stepping required) EndIf Else (drive is 40 track) Format uses 40 track (no double-stepping) EndIf Now we determine the number of sectors/track (MAX_SPT=18) Seek to track 0, Try reading sectors, starting with highest number (If no error, that was the right format) The combinations to try reading (in order) are: sector data rate (Kbps) Format description 18 500 HD, 1.44 MB drive (300 RPM) 15 500 HD, 1.2 MB drive, (360 RPM) 9 250/300 DD, 360KB drive/1.2 MB drive 8 250/300 DD, 360KB drive/1.2 MB drive Note that the 8 and 9 sector formats require a data rate of 250 Kbps for a 360KB drive (300 RPM) and 300 Kbps for a 1.2 MB drive (360 RPM). The driver therefore has to know which of these it is dealing with. (Are other formats desired? Maybe 10 or 16 sectors/track?) There are two ways to determine which type of drive we are dealing with. The easy way is to ask the BIOS at boot time. The harder (but more reliable) way is to measure the drive speed by timing index pulses from the drive (this requires a diskette in the drive). The drive speed never changes, so this test need only be done once. I believe it would be relatively easy to add a media sensitive (minor) device to the minix floppy driver using the above sensing methods. Also, we would still need minor devices that force a particular format for use when the media sensitive device gets it wrong, or (eventually) for use with a diskette formatting program. Sys V/386 uses exactly this scheme, where normal read/write activity can safely use the media sensitive device (/dev/dsk/f0) and formatting or other special programs use /dev/dsk/f0{format}{t?} where: f0 means drive 0 {format} specifies a format {t} if present means use whole disk, including cyl. 0 without the 't' the device starts on cylinder one. Standard tar floppies used by Sys.V/386 are read in using /dev/dsk/f0 (the device that starts on cylinder one). As far as I can tell, there are no special parameter tables on the floppies used by SysV/386, so I presume it does media sensing as described above. Media sensing works on both /dev/dsk/f0 and /dev/dsk/f0t (the "whole disk" device). Mountable file systems use the /dev/dsk/f0 (starts on cylinder one) device. Anybody for file system compatibility? -- Gordon W. Ross (E025) ARPA: gwr@linus.mitre.org The MITRE Corporation UUCP: {decvax,philabs}!linus!gwr Burlington Road, Bedford, MA 01730 (617) 271-3205