digitalmars.D - time units and types in phobos
- Ben Hinkle (203/203) Feb 28 2005 Reading the doc for std.socker I noticed it defines timeval. Time units ...
- Kris (2/205) Feb 28 2005
Reading the doc for std.socker I noticed it defines timeval. Time units and data types are typically hard to standardize. Some functions take milliseconds, some take micro, some take ints some take longs and some take timevals (or timespecs, too?). Remembering which takes what is a pain. What do people think of making a std module (or maybe reusing std.date) for time-related types and functions? I'm thinking of something along the lines of the attached module (modified from my locks library) which is based on Java's TimeUnit: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/TimeUnit.html Any objections to writing up some doc and asking Walter to include in phobos? To illustrate the API here are the unittests: sleep(2,sec); sleep(toTimeval(30,msec)); assert( toMillis(100,sec) == 100_000 ); assert( toMicros(100,sec) == 100_000_000 ); assert( toNanos(100,sec) == 100_000_000_000 ); assert( toSeconds(100,sec) == 100 ); assert( convert(100,sec,msec) == 100_000 ); assert( toMicros(5_000,nsec) == 5 ); assert( toSeconds(5_000_000,usec) == 5 ); assert( toSeconds(50,usec) == 0 ); assert( toNanos(5_000_000_000_000,sec) == long.max ); timeval tv = toTimeval(100,sec); assert( tv.seconds == 100 ); assert( tv.microseconds == 0 ); assert( toMillis(tv) == 100_000 ); assert( toMicros(tv) == 100_000_000 ); assert( toNanos(tv) == 100_000_000_000 ); timeval tv2; tv2.seconds = 5; tv2.microseconds = 7; assert( toMicros(tv2) == 5_000_007 ); assert( toMicros(tv2 + tv) == 105_000_007 ); assert( toMicros(tv2 - tv) == -94999993 ); -Ben begin 666 timeunit.d M<F]M(&UE;6)E<G, ;V8 2D-0($I34BTQ-C8-"B J($5X<&5R="!'<F]U<"!A M;F0 <F5L96%S960 =&\ =&AE('!U8FQI8R!D;VUA:6XL(&%S(&5X<&QA:6YE M9"!A= T*("H :'1T<#HO+V-R96%T:79E8V]M;6]N<RYO<F<O;&EC96YS97,O M56YI=#PO='0^(')E<')E<V5N=', =&EM92!D=7)A=&EO;G, 870 82!G:79E M>2!M971H;V1S('1O(&-O;G9E<G0 86-R;W-S('5N:71S+ T*("H 02 \='0^ M5&EM955N:70\+W1T/B!D;V5S(&YO="!M86EN=&%I;B!T:6UE(&EN9F]R;6%T M:6]N+"!B=70 ;VYL>0T*("H :&5L<', ;W)G86YI>F4 86YD('5S92!T:6UE M(%1I;655;FET('L-"B 3F%N;U-E8V]N9', /2 P+ T*("!-:6-R;U-E8V]N M<G1H86YD(&%B8G)E=FEA=&EO;G, 9F]R('1I;64 =6YI=',-"F%L:6%S(%1I M;655;FET+E-E8V]N9', <V5C.PT*86QI87, 5&EM955N:70N36EL;&E396-O M=7 =&%B;&4 9F]R(&-O;G9E<G-I;VX 9F%C=&]R<R J+PT*<')I=F%T92!C M;VYS="!I;G1;5&EM955N:70N;6%X*S%=(&UU;'1I<&QI97)S(#T 6R -"B M=7)A=&EO;BX ($YO=&4 =&AA="!B96-A=7-E('=E(&%R90T*("H 9&EV:61I M;F< =&AE<V4 9&]W;BP =V4 9&]N)W0 :&%V92!T;R!D96%L('=I=& 87-Y M;VYS="!L;VYG6U1I;655;FET+FUA>"LQ72!O=F5R9FQO=W, /2!;( T*(" P M"B\J* T*("H 4&5R9F]R;2!C;VYV97)S:6]N(&)A<V5D(&]N(&=I=F5N(&1E M;'1A(')E<')E<V5N=&EN9R!T:&4-"B J(&1I9F9E<F5N8V4 8F5T=V5E;B!U M;FET<PT*("H 7'!A<F%M(&1E;'1A('1H92!D:69F97)E;F-E(&EN(&EN9&5X M('9A;'5E<R!O9B!S;W5R8V4 86YD('1A<F=E="!U;FET<PT*("H 7'!A<F%M M(&1U<F%T:6]N('1H92!D=7)A=&EO; T*("H 7')E='5R;B!C;VYV97)T960 M("AD96QT82 ]/2 P*0T*(" (')E='5R;B!D=7)A=&EO;CL-"B :68 *&1E M;'1A(#P M+61E;'1A73L-"B :68 *&1U<F%T:6]N(#X ;W9E<F9L;W=S6V1E;'1A72D- M9FQO=W-;9&5L=&%=*0T*(" (')E='5R;B!L;VYG+FUI;CL-"B <F5T=7)N M($-O;G9E<G0 =&AE(&=I=F5N('1I;64 9'5R871I;VX :6X =&AE(&=I=F5N M('5N:70 =&\ =&AI<PT*("H =6YI="X ($-O;G9E<G-I;VYS(&9R;VT 9FEN M;&]S92!P<F5C:7-I;VXN($9O<B!E>&%M<&QE(&-O;G9E<G1I;F<-"B J(#QT M=#XY.3D\+W1T/B!M:6QL:7-E8V]N9', =&\ <V5C;VYD<R!R97-U;'1S(&EN M9FEN97( 9W)A;G5L87)I=&EE<PT*("H =VET:"!A<F=U;65N=', =&AA="!W M;W5L9"!N=6UE<FEC86QL>2!O=F5R9FQO=R!S871U<F%T92!T;PT*("H /'1T M/FQO;F<N;6EN/"]T=#X :68 ;F5G871I=F4 ;W( /'1T/FQO;F<N;6%X/"]T M=#X-"B J(&EF('!O<VET:79E+ T*("H-"B J(%QP87)A;2!D=7)A=&EO;B!T M:&4 =&EM92!D=7)A=&EO;B!I;B!T:&4 9VEV96X /'1T/G5N:70\+W1T/ T* M("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \='0^9'5R871I M;VX\+W1T/B!A<F=U;65N= T*("H 7'!A<F%M('1O56YI="!T:&4 =6YI="!O M;VX-"B J(&]R(#QT=#YL;VYG+FUI;CPO='0^(&EF(&-O;G9E<G-I;VX =V]U M;&0 ;F5G871I=F5L>0T*("H ;W9E<F9L;W<L(&]R(#QT=#YL;VYG+FUA>#PO M;F< 8V]N=F5R="AL;VYG(&1U<F%T:6]N+"!4:6UE56YI="!F<F]M56YI="P M('1O(&YA;F]S96-O;F1S+ T*("H 7'!A<F%M(&1U<F%T:6]N('1H92!D=7)A M=&EO; T*("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \='0^ M9'5R871I;VX\+W1T/B!A<F=U;65N= T*("H 7')E='5R;B!T:&4 8V]N=F5R M=&5D(&1U<F%T:6]N+ T*("H ;W( /'1T/FQO;F<N;6EN/"]T=#X :68 8V]N M/FQO;F<N;6%X/"]T=#X :68 :70 =V]U;&0 <&]S:71I=F5L>2!O=F5R9FQO M=RX-"B J+PT*;&]N9R!T;TYA;F]S*&QO;F< 9'5R871I;VXL(%1I;655;FET M<RX-"B J(%QP87)A;2!D=7)A=&EO;B!T:&4 9'5R871I;VX-"B J(%QP87)A M;2!F<F]M56YI="!T:&4 =6YI="!O9B!T:&4 /'1T/F1U<F%T:6]N/"]T=#X M87)G=6UE;G0-"B J(%QR971U<FX =&AE(&-O;G9E<G1E9"!D=7)A=&EO;BP- M"B J(&]R(#QT=#YL;VYG+FUI;CPO='0^(&EF(&-O;G9E<G-I;VX =V]U;&0 M;F5G871I=F5L>0T*("H ;W9E<F9L;W<L(&]R(#QT=#YL;VYG+FUA>#PO='0^ M=&]-:6-R;W,H;&]N9R!D=7)A=&EO;BP 5&EM955N:70 9G)O;55N:70I('L- M"B <F5T=7)N(&1O0V]N=F5R="AF<F]M56YI=" M(%1I;655;FET+DUI8W)O M;6EL;&ES96-O;F1S+ T*("H 7'!A<F%M(&1U<F%T:6]N('1H92!D=7)A=&EO M; T*("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \='0^9'5R M871I;VX\+W1T/B!A<F=U;65N= T*("H 7')E='5R;B!T:&4 8V]N=F5R=&5D M(&1U<F%T:6]N+ T*("H ;W( /'1T/FQO;F<N;6EN/"]T=#X :68 8V]N=F5R M;F<N;6%X/"]T=#X :68 :70 =V]U;&0 <&]S:71I=F5L>2!O=F5R9FQO=RX- M"B J+PT*;&]N9R!T;TUI;&QI<RAL;VYG(&1U<F%T:6]N+"!4:6UE56YI="!F M0V]N=F5R="!T;R!S96-O;F1S+ T*("H 7'!A<F%M(&1U<F%T:6]N('1H92!D M=7)A=&EO; T*("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \ M='0^9'5R871I;VX\+W1T/B!A<F=U;65N= T*("H 7')E='5R;B!T:&4 8V]N M97)T*&9R;VU5;FET("T 5&EM955N:70N4V5C;VYD<RP 9'5R871I;VXI.PT* M96,I(#T M8RD /3T ;&]N9RYM87 *3L-"GT-" T*<W1R=6-T('1I;65V86P >PT*("!I M;G0 <V5C;VYD<SL-"B :6YT(&UI8W)O<V5C;VYD<SL-" T*("!T:6UE=F%L M<F5S+FUI8W)O<V5C;VYD<R ](&UI8W)O<V5C;VYD<R K('1V,BYM:6-R;W-E M;W!3=6(H=&EM979A;"!T=C(I('L-"B ("!T:6UE=F%L(')E<SL-"B ("!R M97,N;6EC<F]S96-O;F1S(#T ;6EC<F]S96-O;F1S("T ='8R+FUI8W)O<V5C M;VYD<SL-"B ("!L;VYG(&-A<G)Y(#T =&]396-O;F1S*')E<RYM:6-R;W-E M;"!T;U1I;65V86PH;&]N9R!D=7)A=&EO;BP 5&EM955N:70 =6YI="D >PT* M("!T:6UE=F%L('1V.PT*("!T=BYS96-O;F1S(#T =&]396-O;F1S*&1U<F%T M:6]N+'5N:70I.PT*("!T=BYM:6-R;W-E8V]N9', /2!T;TUI8W)O<RAD=7)A M*'1V+FUI8W)O<V5C;VYD<RQ4:6UE56YI="Y-:6-R;U-E8V]N9',I.PT*?0T* M<F]S*'1V+G-E8V]N9',L5&EM955N:70N4V5C;VYD<RDK='8N;6EC<F]S96-O M(" (" ("!T;TUI;&QI<RAT=BYM:6-R;W-E8V]N9',L5&EM955N:70N36EC M<F]396-O;F1S*3L-"GT-" T*;&]N9R!T;U-E8V]N9',H=&EM979A;"!T=BD M>PT*("!R971U<FX ='8N<V5C;VYD<RMT;U-E8V]N9',H='8N;6EC<F]S96-O M*"!T=BYS96-O;F1S(#T M*3L-" T*("!T:6UE=F%L('1V,CL-"B ='8R+G-E8V]N9', /2 U.PT*("!T M=C(N;6EC<F]S96-O;F1S(#T -SL-"B 87-S97)T*"!T;TUI8W)O<RAT=C(I M(#T M('1V*2 ]/2 M.30Y.3DY.3, *3L-"GT-" T*=F5R<VEO;B H5VEN9&]W<RD M" T*("!V;VED('-L965P*&QO;F< 9'5R871I;VXL(%1I;655;FET('5N:70I M('L-"B ("!L;VYG('0 /2!T;TUI;&QI<RAD=7)A=&EO;BQU;FET*3L-"B M("!T(#T =#YU:6YT+FUA>" _('5I;G0N;6%X(#H =#L-"B ("!T(#T =#PP M92!I;7!O<G0 <W1D+F,N=&EM93L-" T*("!V;VED('-L965P*&QO;F< 9'5R M871I;VXL(%1I;655;FET('5N:70I('L-"B ("!L;VYG('0 /2!T;TUI8W)O M<RAD=7)A=&EO;BQU;FET*3L-"B ("!T(#T =#YU:6YT+FUA>" _('5I;G0N M;6%X(#H =#L-"B ("!T(#T =#PP M>PT*(" (&QO;F< =" ]('1O36EC<F]S*'1V*3L-"B ("!T(#T =#YU:6YT M+FUA>" _('5I;G0N;6%X(#H =#L-"B ("!T(#T =#PP M('L-"B <VQE97 H,BQS96,I.PT*("!S;&5E<"AT;U1I;65V86PH,S L;7-E '8RDI.PT*?0`` ` end
Feb 28 2005
In article <cvvrdn$dq6$1 digitaldaemon.com>, Ben Hinkle says...Reading the doc for std.socker I noticed it defines timeval. Time units and data types are typically hard to standardize. Some functions take milliseconds, some take micro, some take ints some take longs and some take timevals (or timespecs, too?). Remembering which takes what is a pain. What do people think of making a std module (or maybe reusing std.date) for time-related types and functions? I'm thinking of something along the lines of the attached module (modified from my locks library) which is based on Java's TimeUnit: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/TimeUnit.html Any objections to writing up some doc and asking Walter to include in phobos?No objection, but there's an equivalent in Mango also.To illustrate the API here are the unittests: sleep(2,sec); sleep(toTimeval(30,msec)); assert( toMillis(100,sec) == 100_000 ); assert( toMicros(100,sec) == 100_000_000 ); assert( toNanos(100,sec) == 100_000_000_000 ); assert( toSeconds(100,sec) == 100 ); assert( convert(100,sec,msec) == 100_000 ); assert( toMicros(5_000,nsec) == 5 ); assert( toSeconds(5_000_000,usec) == 5 ); assert( toSeconds(50,usec) == 0 ); assert( toNanos(5_000_000_000_000,sec) == long.max ); timeval tv = toTimeval(100,sec); assert( tv.seconds == 100 ); assert( tv.microseconds == 0 ); assert( toMillis(tv) == 100_000 ); assert( toMicros(tv) == 100_000_000 ); assert( toNanos(tv) == 100_000_000_000 ); timeval tv2; tv2.seconds = 5; tv2.microseconds = 7; assert( toMicros(tv2) == 5_000_007 ); assert( toMicros(tv2 + tv) == 105_000_007 ); assert( toMicros(tv2 - tv) == -94999993 ); -Ben begin 666 timeunit.d M<F]M(&UE;6)E<G, ;V8 2D-0($I34BTQ-C8-"B J($5X<&5R="!'<F]U<"!A M;F0 <F5L96%S960 =&\ =&AE('!U8FQI8R!D;VUA:6XL(&%S(&5X<&QA:6YE M9"!A= T*("H :'1T<#HO+V-R96%T:79E8V]M;6]N<RYO<F<O;&EC96YS97,O M56YI=#PO='0^(')E<')E<V5N=', =&EM92!D=7)A=&EO;G, 870 82!G:79E M>2!M971H;V1S('1O(&-O;G9E<G0 86-R;W-S('5N:71S+ T*("H 02 \='0^ M5&EM955N:70\+W1T/B!D;V5S(&YO="!M86EN=&%I;B!T:6UE(&EN9F]R;6%T M:6]N+"!B=70 ;VYL>0T*("H :&5L<', ;W)G86YI>F4 86YD('5S92!T:6UE M(%1I;655;FET('L-"B 3F%N;U-E8V]N9', /2 P+ T*("!-:6-R;U-E8V]N M<G1H86YD(&%B8G)E=FEA=&EO;G, 9F]R('1I;64 =6YI=',-"F%L:6%S(%1I M;655;FET+E-E8V]N9', <V5C.PT*86QI87, 5&EM955N:70N36EL;&E396-O M=7 =&%B;&4 9F]R(&-O;G9E<G-I;VX 9F%C=&]R<R J+PT*<')I=F%T92!C M;VYS="!I;G1;5&EM955N:70N;6%X*S%=(&UU;'1I<&QI97)S(#T 6R -"B M=7)A=&EO;BX ($YO=&4 =&AA="!B96-A=7-E('=E(&%R90T*("H 9&EV:61I M;F< =&AE<V4 9&]W;BP =V4 9&]N)W0 :&%V92!T;R!D96%L('=I=& 87-Y M;VYS="!L;VYG6U1I;655;FET+FUA>"LQ72!O=F5R9FQO=W, /2!;( T*(" P M"B\J* T*("H 4&5R9F]R;2!C;VYV97)S:6]N(&)A<V5D(&]N(&=I=F5N(&1E M;'1A(')E<')E<V5N=&EN9R!T:&4-"B J(&1I9F9E<F5N8V4 8F5T=V5E;B!U M;FET<PT*("H 7'!A<F%M(&1E;'1A('1H92!D:69F97)E;F-E(&EN(&EN9&5X M('9A;'5E<R!O9B!S;W5R8V4 86YD('1A<F=E="!U;FET<PT*("H 7'!A<F%M M(&1U<F%T:6]N('1H92!D=7)A=&EO; T*("H 7')E='5R;B!C;VYV97)T960 M("AD96QT82 ]/2 P*0T*(" (')E='5R;B!D=7)A=&EO;CL-"B :68 *&1E M;'1A(#P M+61E;'1A73L-"B :68 *&1U<F%T:6]N(#X ;W9E<F9L;W=S6V1E;'1A72D- M9FQO=W-;9&5L=&%=*0T*(" (')E='5R;B!L;VYG+FUI;CL-"B <F5T=7)N M($-O;G9E<G0 =&AE(&=I=F5N('1I;64 9'5R871I;VX :6X =&AE(&=I=F5N M('5N:70 =&\ =&AI<PT*("H =6YI="X ($-O;G9E<G-I;VYS(&9R;VT 9FEN M;&]S92!P<F5C:7-I;VXN($9O<B!E>&%M<&QE(&-O;G9E<G1I;F<-"B J(#QT M=#XY.3D\+W1T/B!M:6QL:7-E8V]N9', =&\ <V5C;VYD<R!R97-U;'1S(&EN M9FEN97( 9W)A;G5L87)I=&EE<PT*("H =VET:"!A<F=U;65N=', =&AA="!W M;W5L9"!N=6UE<FEC86QL>2!O=F5R9FQO=R!S871U<F%T92!T;PT*("H /'1T M/FQO;F<N;6EN/"]T=#X :68 ;F5G871I=F4 ;W( /'1T/FQO;F<N;6%X/"]T M=#X-"B J(&EF('!O<VET:79E+ T*("H-"B J(%QP87)A;2!D=7)A=&EO;B!T M:&4 =&EM92!D=7)A=&EO;B!I;B!T:&4 9VEV96X /'1T/G5N:70\+W1T/ T* M("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \='0^9'5R871I M;VX\+W1T/B!A<F=U;65N= T*("H 7'!A<F%M('1O56YI="!T:&4 =6YI="!O M;VX-"B J(&]R(#QT=#YL;VYG+FUI;CPO='0^(&EF(&-O;G9E<G-I;VX =V]U M;&0 ;F5G871I=F5L>0T*("H ;W9E<F9L;W<L(&]R(#QT=#YL;VYG+FUA>#PO M;F< 8V]N=F5R="AL;VYG(&1U<F%T:6]N+"!4:6UE56YI="!F<F]M56YI="P M('1O(&YA;F]S96-O;F1S+ T*("H 7'!A<F%M(&1U<F%T:6]N('1H92!D=7)A M=&EO; T*("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \='0^ M9'5R871I;VX\+W1T/B!A<F=U;65N= T*("H 7')E='5R;B!T:&4 8V]N=F5R M=&5D(&1U<F%T:6]N+ T*("H ;W( /'1T/FQO;F<N;6EN/"]T=#X :68 8V]N M/FQO;F<N;6%X/"]T=#X :68 :70 =V]U;&0 <&]S:71I=F5L>2!O=F5R9FQO M=RX-"B J+PT*;&]N9R!T;TYA;F]S*&QO;F< 9'5R871I;VXL(%1I;655;FET M<RX-"B J(%QP87)A;2!D=7)A=&EO;B!T:&4 9'5R871I;VX-"B J(%QP87)A M;2!F<F]M56YI="!T:&4 =6YI="!O9B!T:&4 /'1T/F1U<F%T:6]N/"]T=#X M87)G=6UE;G0-"B J(%QR971U<FX =&AE(&-O;G9E<G1E9"!D=7)A=&EO;BP- M"B J(&]R(#QT=#YL;VYG+FUI;CPO='0^(&EF(&-O;G9E<G-I;VX =V]U;&0 M;F5G871I=F5L>0T*("H ;W9E<F9L;W<L(&]R(#QT=#YL;VYG+FUA>#PO='0^ M=&]-:6-R;W,H;&]N9R!D=7)A=&EO;BP 5&EM955N:70 9G)O;55N:70I('L- M"B <F5T=7)N(&1O0V]N=F5R="AF<F]M56YI=" M(%1I;655;FET+DUI8W)O M;6EL;&ES96-O;F1S+ T*("H 7'!A<F%M(&1U<F%T:6]N('1H92!D=7)A=&EO M; T*("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \='0^9'5R M871I;VX\+W1T/B!A<F=U;65N= T*("H 7')E='5R;B!T:&4 8V]N=F5R=&5D M(&1U<F%T:6]N+ T*("H ;W( /'1T/FQO;F<N;6EN/"]T=#X :68 8V]N=F5R M;F<N;6%X/"]T=#X :68 :70 =V]U;&0 <&]S:71I=F5L>2!O=F5R9FQO=RX- M"B J+PT*;&]N9R!T;TUI;&QI<RAL;VYG(&1U<F%T:6]N+"!4:6UE56YI="!F M0V]N=F5R="!T;R!S96-O;F1S+ T*("H 7'!A<F%M(&1U<F%T:6]N('1H92!D M=7)A=&EO; T*("H 7'!A<F%M(&9R;VU5;FET('1H92!U;FET(&]F('1H92 \ M='0^9'5R871I;VX\+W1T/B!A<F=U;65N= T*("H 7')E='5R;B!T:&4 8V]N M97)T*&9R;VU5;FET("T 5&EM955N:70N4V5C;VYD<RP 9'5R871I;VXI.PT* M96,I(#T M8RD /3T ;&]N9RYM87 *3L-"GT-" T*<W1R=6-T('1I;65V86P >PT*("!I M;G0 <V5C;VYD<SL-"B :6YT(&UI8W)O<V5C;VYD<SL-" T*("!T:6UE=F%L M<F5S+FUI8W)O<V5C;VYD<R ](&UI8W)O<V5C;VYD<R K('1V,BYM:6-R;W-E M;W!3=6(H=&EM979A;"!T=C(I('L-"B ("!T:6UE=F%L(')E<SL-"B ("!R M97,N;6EC<F]S96-O;F1S(#T ;6EC<F]S96-O;F1S("T ='8R+FUI8W)O<V5C M;VYD<SL-"B ("!L;VYG(&-A<G)Y(#T =&]396-O;F1S*')E<RYM:6-R;W-E M;"!T;U1I;65V86PH;&]N9R!D=7)A=&EO;BP 5&EM955N:70 =6YI="D >PT* M("!T:6UE=F%L('1V.PT*("!T=BYS96-O;F1S(#T =&]396-O;F1S*&1U<F%T M:6]N+'5N:70I.PT*("!T=BYM:6-R;W-E8V]N9', /2!T;TUI8W)O<RAD=7)A M*'1V+FUI8W)O<V5C;VYD<RQ4:6UE56YI="Y-:6-R;U-E8V]N9',I.PT*?0T* M<F]S*'1V+G-E8V]N9',L5&EM955N:70N4V5C;VYD<RDK='8N;6EC<F]S96-O M(" (" ("!T;TUI;&QI<RAT=BYM:6-R;W-E8V]N9',L5&EM955N:70N36EC M<F]396-O;F1S*3L-"GT-" T*;&]N9R!T;U-E8V]N9',H=&EM979A;"!T=BD M>PT*("!R971U<FX ='8N<V5C;VYD<RMT;U-E8V]N9',H='8N;6EC<F]S96-O M*"!T=BYS96-O;F1S(#T M*3L-" T*("!T:6UE=F%L('1V,CL-"B ='8R+G-E8V]N9', /2 U.PT*("!T M=C(N;6EC<F]S96-O;F1S(#T -SL-"B 87-S97)T*"!T;TUI8W)O<RAT=C(I M(#T M('1V*2 ]/2 M.30Y.3DY.3, *3L-"GT-" T*=F5R<VEO;B H5VEN9&]W<RD M" T*("!V;VED('-L965P*&QO;F< 9'5R871I;VXL(%1I;655;FET('5N:70I M('L-"B ("!L;VYG('0 /2!T;TUI;&QI<RAD=7)A=&EO;BQU;FET*3L-"B M("!T(#T =#YU:6YT+FUA>" _('5I;G0N;6%X(#H =#L-"B ("!T(#T =#PP M92!I;7!O<G0 <W1D+F,N=&EM93L-" T*("!V;VED('-L965P*&QO;F< 9'5R M871I;VXL(%1I;655;FET('5N:70I('L-"B ("!L;VYG('0 /2!T;TUI8W)O M<RAD=7)A=&EO;BQU;FET*3L-"B ("!T(#T =#YU:6YT+FUA>" _('5I;G0N M;6%X(#H =#L-"B ("!T(#T =#PP M>PT*(" (&QO;F< =" ]('1O36EC<F]S*'1V*3L-"B ("!T(#T =#YU:6YT M+FUA>" _('5I;G0N;6%X(#H =#L-"B ("!T(#T =#PP M('L-"B <VQE97 H,BQS96,I.PT*("!S;&5E<"AT;U1I;65V86PH,S L;7-E '8RDI.PT*?0`` ` end
Feb 28 2005