Version française
Home     About     Download     Resources     Contact us    
Browse thread
RE: first class, recursive, mixin modules (was: RE: first class m odules)
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Claudio Russo <crusso@m...>
Subject: RE: first class, recursive, mixin modules (was: RE: first class m odules)
I wasn't quite sure of your intention, but I did get the attached code
to work in Mosml (it includes
a port of the Ocaml libraries and a fleshed out implementation of your
idea).

Unfortunately, this only works in an internal release of Moscow, because
of a (known)
bug in the current distribution. 

For the record, your functor application Make(Ord)is fine because it is
applied to a local, already defined structure.
> structure T = rec(X : COMPOSITE) 
>   struct 
> 	structure Composite = 
>           struct 
>             datatype t = { data : int ; children : X.CompositeSet.t }
>           end
>         structure Ord : Set.OrderedType = 
>           struct 
>             type t = Composite.t 
>             let compare = Pervasives.compare
>           end
> 	structure CompositeSet = Set.Make(Ord)  
>     end
An application like Make(T.Ord), through the forward reference, would
raise the Bind exception, because T (and T.Ord) is 
undefined at that point (although Ord is).

-c


> -----Original Message-----
> From: Brian Rogoff [mailto:bpr@best.com]
> Sent: 11 January 2001 20:01
> To: Dave Berry
> Cc: Claudio Russo; Alain Frisch; Caml list
> Subject: RE: first class, recursive, mixin modules (was: RE: 
> first class
> m odules)
> 
> 
> My "litmus test" for recursive modules is that it fixes the well known
> problem with expressing what OO folk call the Composite pattern,
> essentially a recursively defined collection type with a leaf/node
> relationship. Here is an approxmation of what I want to do in 
> "faux-Mosml
> with OCaml libraries". Forgive my errors, I don't use SML. The idea
> should be clear. 
> 
> signature COMPOSITE = 
>     rec(X : sig structure CompositeSet : sig type t end end) 
>     sig structure Composite : 
>                   sig 
>                     datatype t = 
>                       { data : int ; children : X.CompositeSet.t }
>                   end
>         structure CompositeSet : (Set.S where type elt = Composite.t) 
>     end;
> 
> structure T = rec(X : COMPOSITE) 
>   struct 
> 	structure Composite = 
>           struct 
>             datatype t = { data : int ; children : X.CompositeSet.t }
>           end
>         structure Ord : Set.OrderedType = 
>           struct 
>             type t = Composite.t 
>             let compare = Pervasives.compare
>           end
> 	structure CompositeSet = Set.Make(Ord)  
>     end
> 
> This is syntactically heavy, but better than the 
> parameterization trick 
> needed now, and I'd be satisfied. I do need to do that functor
> instantiation, so if you can't do it in Mosml it needs to be added. 
> 
> I agree that the first-class module extension is useful on 
> its own too,
> but in my own programming the problem I mention above arises 
> frequently
> enough that I consider this a flaw of (current) ML style 
> modules. Every 
> language has flaws but since OCaml is so close to perfection 
> every flaw 
> seems large ;-). 
> 
> -- Brian
> 
>  On Thu, 11 Jan 2001, Dave Berry wrote:
> 
> > We ran into an example (in SML) during the development of 
> MLWorks.  I can
> > only remember it vaguely, but there were two large module 
> hierarchies.
> > These hierarchies were in logically different parts of the 
> system.  A new
> > development built on top of these hierarchies meant that we 
> needed to make
> > one element from the bottom of each hierarchy be mutually 
> recursive with
> > each other.  I suspect that since we were using a fully 
> functorised style,
> > what we wanted to do was to make two functors mutually 
> recursive.  In
> > practice we had to combine the module hierarchies to make 
> the types and
> > values mutually recursive at the bottom of the new hierarchy.
> > 
> > I wish I could remember what the example was, because it 
> was a clear case
> > where the ML module system was too inflexible to meet the 
> pragmatic needs.
> > Imagine how we would have been stuck if the two module 
> hierarchies were
> > libraries from different suppliers, especially if they were 
> only distributed
> > in compiled form.
> > 
> > Dave. 
> >   
> > 
> > -----Original Message-----
> > From: Claudio Russo [mailto:crusso@microsoft.com]
> > Sent: Thursday, January 11, 2001 10:33
> > To: Alain Frisch
> > Cc: Brian Rogoff; Caml list
> > Subject: RE: first class, recursive, mixin modules (was: 
> RE: first class
> > modules)
> > 
> > 
> > 
> 


begin 600 composite.sml
M*"HJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ
M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*0T**"H@("`@("`@("`@("`@
M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@("`J*0T**"H@("`@("`@("`@("`@("`@("`@("`@("`@("!/
M8FIE8W1I=F4@0V%M;"`@("`@("`@("`@("`@("`@("`@("`@("`@("`J*0T*
M*"H@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@("`@("`@("`@("`@("`@("`J*0T**"H@("`@("`@("`@("!8
M879I97(@3&5R;WDL('!R;VIE="!#<FES=&%L+"!)3E))02!2;V-Q=65N8V]U
M<G0@("`@("`@("`J*0T**"H@("`@("`@("`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`J*0T*
M*"H@($-O<'ER:6=H="`Q.3DV($EN<W1I='5T($YA=&EO;F%L(&1E(%)E8VAE
M<F-H92!E;B!);F9O<FUA=&EQ=64@970@("`J*0T**"H@(&5N($%U=&]M871I
M<75E+B`@06QL(')I9VAT<R!R97-E<G9E9"X@(%1H:7,@9FEL92!I<R!D:7-T
M<FEB=71E9"`@("`J*0T**"H@('5N9&5R('1H92!T97)M<R!O9B!T:&4@1TY5
M($QI8G)A<GD@1V5N97)A;"!0=6)L:6,@3&EC96YS92X@("`@("`@("`J*0T*
M*"H@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
M("`@("`@("`@("`@("`@("`@("`@("`@("`J*0T**"HJ*BHJ*BHJ*BHJ*BHJ
M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ
M*BHJ*BHJ*BHJ*BHJ*0T*#0HH*B`D260Z('-E="YM;"QV(#$N,3,@,C`P,"\P
M-"\Q,R`Q,CHQ-CHR-B!X;&5R;WD@17AP("0@*BD-"@T**"H@4V5T<R!O=F5R
M(&]R9&5R960@='EP97,@*BD-"F5X8V5P=&EO;B!);G9A;&ED7V%R9R!O9B!S
M=')I;F<[#0IE>&-E<'1I;VX@3F]T7V9O=6YD.PT*9G5N(&EN=F%L:61?87)G
M(',@/2!R86ES92`H26YV86QI9%]A<F<@<RD[#0H-"@T*<VEG;F%T=7)E($]R
M9&5R9614>7!E(#T-"B`@<VEG#0H@("`@='EP92!T#0H@("`@=F%L(&-O;7!A
M<F4Z('0@+3X@="`M/B!I;G0-"B`@96YD#0H-"G-I9VYA='5R92!3970@/0T*
M("!S:6<-"B`@("!T>7!E(&5L=`T*("`@('1Y<&4@=`T*("`@('9A;"!E;7!T
M>3H@=`T*("`@('9A;"!I<U]E;7!T>3H@="`M/B!B;V]L#0H@("`@=F%L(&UE
M;3H@96QT("T^('0@+3X@8F]O;`T*("`@('9A;"!A9&0Z(&5L="`M/B!T("T^
M('0-"B`@("!V86P@<VEN9VQE=&]N.B!E;'0@+3X@=`T*("`@('9A;"!R96UO
M=F4Z(&5L="`M/B!T("T^('0-"B`@("!V86P@=6YI;VXZ('0@+3X@="`M/B!T
M#0H@("`@=F%L(&EN=&5R.B!T("T^('0@+3X@=`T*("`@('9A;"!D:69F.B!T
M("T^('0@+3X@=`T*("`@('9A;"!C;VUP87)E.B!T("T^('0@+3X@:6YT#0H@
M("`@=F%L(&5Q=6%L.B!T("T^('0@+3X@8F]O;`T*("`@('9A;"!S=6)S970Z
M('0@+3X@="`M/B!B;V]L#0H@("`@=F%L(&ET97(Z("AE;'0@+3X@=6YI="D@
M+3X@="`M/B!U;FET#0H@("`@=F%L(&9O;&0Z("AE;'0@+3X@)V$@+3X@)V$I
M("T^('0@+3X@)V$@+3X@)V$-"B`@("!V86P@9F]R7V%L;#H@*&5L="`M/B!B
M;V]L*2`M/B!T("T^(&)O;VP-"B`@("!V86P@97AI<W1S.B`H96QT("T^(&)O
M;VPI("T^('0@+3X@8F]O;`T*("`@('9A;"!F:6QT97(Z("AE;'0@+3X@8F]O
M;"D@+3X@="`M/B!T#0H@("`@=F%L('!A<G1I=&EO;CH@*&5L="`M/B!B;V]L
M*2`M/B!T("T^('0@*B!T#0H@("`@=F%L(&-A<F1I;F%L.B!T("T^(&EN=`T*
M("`@('9A;"!E;&5M96YT<SH@="`M/B!E;'0@;&ES=`T*("`@('9A;"!M:6Y?
M96QT.B!T("T^(&5L=`T*("`@('9A;"!M87A?96QT.B!T("T^(&5L=`T*("`@
M('9A;"!C:&]O<V4Z('0@+3X@96QT#0H@(&5N9`T*#0IF=6YC=&]R($UA:V4H
M3W)D.B!/<F1E<F5D5'EP92D@/0T*("!S=')U8W0-"B`@("!T>7!E(&5L="`]
M($]R9"YT#0H@("`@9&%T871Y<&4@="`]($5M<'1Y('P@3F]D92!O9B!T("H@
M96QT("H@="`J(&EN=`T*#0H@("`@*"H@4V5T<R!A<F4@<F5P<F5S96YT960@
M8GD@8F%L86YC960@8FEN87)Y('1R965S("AT:&4@:&5I9VAT<R!O9B!T:&4-
M"B`@("`@("!C:&EL9')E;B!D:69F97(@8GD@870@;6]S="`R*2`J*0T*#0H@
M("`@=F%L(&AE:6=H="`](&9N#0H@("`@("`@($5M<'1Y(#T^(#`-"B`@("`@
M('P@3F]D92A?+"!?+"!?+"!H*2`]/B!H#0H-"B`@("`H*B!#<F5A=&5S(&$@
M;F5W(&YO9&4@=VET:"!L969T('-O;B!L+"!V86QU92!X(&%N9"!R:6=H="!S
M;VX@<BX-"B`@("`@("!L(&%N9"!R(&UU<W0@8F4@8F%L86YC960@86YD('P@
M:&5I9VAT(&P@+2!H96EG:'0@<B!\(#P](#(N#0H@("`@("`@26YL:6YE(&5X
M<&%N<VEO;B!O9B!H96EG:'0@9F]R(&)E='1E<B!S<&5E9"X@*BD-"@T*("`@
M(&9U;B!C<F5A=&4@;"!X('(@/0T*("`@("`@;&5T('9A;"!H;"`](&-A<V4@
M;"!O9B!%;7!T>2`]/B`P('P@3F]D92A?+%\L7RQH*2`]/B!H(`T*"2`@=F%L
M(&AR(#T@8V%S92!R(&]F($5M<'1Y(#T^(#`@?"!.;V1E*%\L7RQ?+&@I(#T^
M(&@@#0H@("`@("!I;@T*("`@("`@3F]D92AL+"!X+"!R+"`H:68@:&P@/CT@
M:'(@=&AE;B!H;"`K(#$@96QS92!H<B`K(#$I*0T*("`@("`@96YD#0H-"B`@
M("`H*B!386UE(&%S(&-R96%T92P@8G5T('!E<F9O<FUS(&]N92!S=&5P(&]F
M(')E8F%L86YC:6YG(&EF(&YE8V5S<V%R>2X-"B`@("`@("!!<W-U;65S(&P@
M86YD('(@8F%L86YC960N#0H@("`@("`@26YL:6YE(&5X<&%N<VEO;B!O9B!C
M<F5A=&4@9F]R(&)E='1E<B!S<&5E9"!I;B!T:&4@;6]S="!F<F5Q=65N="!C
M87-E#0H@("`@("`@=VAE<F4@;F\@<F5B86QA;F-I;F<@:7,@<F5Q=6ER960N
M("HI#0H-"B`@("!F=6X@8F%L(&P@>"!R(#T-"B`@("`@(&QE="!V86P@:&P@
M/2!C87-E(&P@;V8@16UP='D@/3X@,"!\($YO9&4H7RQ?+%\L:"D@/3X@:"`-
M"@D@('9A;"!H<B`](&-A<V4@<B!O9B!%;7!T>2`]/B`P('P@3F]D92A?+%\L
M7RQH*2`]/B!H(`T*("`@("`@:6X-"B`@("`@(&EF(&AL(#X@:'(@*R`R('1H
M96X@*`T*("`@("`@("!C87-E(&P@;V8-"B`@("`@("`@("!%;7!T>2`]/B!I
M;G9A;&ED7V%R9R`B4V5T+F)A;"(-"B`@("`@("`@?"!.;V1E*&QL+"!L=BP@
M;'(L(%\I(#T^#0H@("`@("`@("`@("!I9B!H96EG:'0@;&P@/CT@:&5I9VAT
M(&QR('1H96X-"B`@("`@("`@("`@("`@8W)E871E(&QL(&QV("AC<F5A=&4@
M;'(@>"!R*0T*("`@("`@("`@("`@96QS92`H#0H@("`@("`@("`@("`@(&-A
M<V4@;'(@;V8-"B`@("`@("`@("`@("`@("!%;7!T>2`]/B!I;G9A;&ED7V%R
M9R`B4V5T+F)A;"(-"B`@("`@("`@("`@("`@?"!.;V1E*&QR;"P@;')V+"!L
M<G(L(%\I/3X-"B`@("`@("`@("`@("`@("`@(&-R96%T92`H8W)E871E(&QL
M(&QV(&QR;"D@;')V("AC<F5A=&4@;')R('@@<BD-"B`@("`@("`@("`@("D-
M"B`@("`@("D@96QS92!I9B!H<B`^(&AL("L@,B!T:&5N("@-"B`@("`@("`@
M8V%S92!R(&]F#0H@("`@("`@("`@16UP='D@/3X@:6YV86QI9%]A<F<@(E-E
M="YB86PB#0H@("`@("`@('P@3F]D92AR;"P@<G8L(')R+"!?*2`]/@T*("`@
M("`@("`@("`@:68@:&5I9VAT(')R(#X](&AE:6=H="!R;"!T:&5N#0H@("`@
M("`@("`@("`@(&-R96%T92`H8W)E871E(&P@>"!R;"D@<G8@<G(-"B`@("`@
M("`@("`@(&5L<V4@*`T*("`@("`@("`@("`@("!C87-E(')L(&]F#0H@("`@
M("`@("`@("`@("`@16UP='D@/3X@:6YV86QI9%]A<F<@(E-E="YB86PB#0H@
M("`@("`@("`@("`@('P@3F]D92AR;&PL(')L=BP@<FQR+"!?*2`]/@T*("`@
M("`@("`@("`@("`@("`@8W)E871E("AC<F5A=&4@;"!X(')L;"D@<FQV("AC
M<F5A=&4@<FQR(')V(')R*0T*("`@("`@("`@("`@*0T*("`@("`@*2!E;'-E
M#0H@("`@("`@($YO9&4H;"P@>"P@<BP@*&EF(&AL(#X](&AR('1H96X@:&P@
M*R`Q(&5L<V4@:'(@*R`Q*2D-"B`@("`@(&5N9`T*("`@#0H@("`@*"H@4V%M
M92!A<R!B86PL(&)U="!R97!E870@<F5B86QA;F-I;F<@=6YT:6P@=&AE(&9I
M;F%L(')E<W5L=`T*("`@("`@(&ES(&)A;&%N8V5D+B`J*0T*#0H@("`@9G5N
M(&IO:6X@;"!X('(@/0T*("`@("`@8V%S92!B86P@;"!X('(@;V8-"B`@("`@
M("`@16UP='D@/3X@:6YV86QI9%]A<F<@(E-E="YJ;VEN(@T*("`@("`@?"!T
M)R!A<R!.;V1E*&PG+"!X)RP@<B<L(%\I("`]/@T*("`@("`@("`@(&QE="!V
M86P@9"`](&AE:6=H="!L)R`M(&AE:6=H="!R)R!I;@T*("`@("`@("`@(&EF
M(&0@/"!^,B!O<F5L<V4@9"`^(#(@=&AE;B!J;VEN(&PG('@G('(G(&5L<V4@
M="<@96YD#0H-"@T*("`@("@J($UE<F=E('1W;R!T<F5E<R!L(&%N9"!R(&EN
M=&\@;VYE+@T*("`@("`@($%L;"!E;&5M96YT<R!O9B!L(&UU<W0@<')E8V5D
M92!T:&4@96QE;65N=',@;V8@<BX-"B`@("`@("!!<W-U;65S('P@:&5I9VAT
M(&P@+2!H96EG:'0@<B!\(#P](#(N("HI#0H-"B`@("!F=6X@;65R9V4@=#$@
M=#(@/0T*("`@("`@8V%S92`H=#$L('0R*2!O9@T*("`@("`@("`H16UP='DL
M('0I(#T^('0-"B`@("`@('P@*'0L($5M<'1Y*2`]/B!T#0H@("`@("!\("A.
M;V1E*&PQ+"!V,2P@<C$L(&@Q*2P@3F]D92AL,BP@=C(L('(R+"!H,BDI(#T^
M#0H@("`@("`@("`@8F%L(&PQ('8Q("AB86P@*&UE<F=E('(Q(&PR*2!V,B!R
M,BD-"@T*("`@("@J(%-A;64@87,@;65R9V4L(&)U="!D;V5S(&YO="!A<W-U
M;64@86YY=&AI;F<@86)O=70@;"!A;F0@<BX@*BD-"@T*("`@(&9U;B!C;VYC
M870@=#$@=#(@/0T*("`@("`@8V%S92`H=#$L('0R*2!O9@T*("`@("`@("`H
M16UP='DL('0I(#T^('0-"B`@("`@('P@*'0L($5M<'1Y*2`]/B!T#0H@("`@
M("!\("A.;V1E*&PQ+"!V,2P@<C$L(&@Q*2P@3F]D92AL,BP@=C(L('(R+"!H
M,BDI(#T^#0H@("`@("`@("`@:F]I;B!L,2!V,2`H:F]I;B`H8V]N8V%T('(Q
M(&PR*2!V,B!R,BD-"@T*("`@("@J(%-P;&ET=&EN9R`J*0T*#0H@("`@9G5N
M('-P;&ET('@@/2!F;@T*("`@("`@("!%;7!T>2`]/@T*("`@("`@("`@("A%
M;7!T>2P@3D].12P@16UP='DI#0H@("`@("!\($YO9&4H;"P@=BP@<BP@7RD@
M/3X-"B`@("`@("`@("!L970@=F%L(&,@/2!/<F0N8V]M<&%R92!X('8@:6X-
M"B`@("`@("`@("!I9B!C(#T@,"!T:&5N("AL+"!33TU%('8L('(I#0H@("`@
M("`@("`@96QS92!I9B!C(#P@,"!T:&5N#0H@("`@("`@("`@("!L970@=F%L
M("AL;"P@=FPL(')L*2`]('-P;&ET('@@;"!I;B`H;&PL('9L+"!J;VEN(')L
M('8@<BD@96YD#0H@("`@("`@("`@96QS90T*("`@("`@("`@("`@;&5T('9A
M;"`H;'(L('9R+"!R<BD@/2!S<&QI="!X('(@:6X@*&IO:6X@;"!V(&QR+"!V
M<BP@<G(I(&5N9`T*"2`@96YD#0H-"B`@("`H*B!);7!L96UE;G1A=&EO;B!O
M9B!T:&4@<V5T(&]P97)A=&EO;G,@*BD-"@T*("`@('9A;"!E;7!T>2`]($5M
M<'1Y#0H-"B`@("!V86P@:7-?96UP='D@/2!F;B!%;7!T>2`]/B!T<G5E('P@
M7R`]/B!F86QS90T*#0H@("`@9G5N(&UE;2!X(#T@9FX-"B`@("`@("`@16UP
M='D@/3X@9F%L<V4-"B`@("`@('P@3F]D92AL+"!V+"!R+"!?*2`]/@T*("`@
M("`@("`@(&QE="!V86P@(&,@/2!/<F0N8V]M<&%R92!X('8@:6X-"B`@("`@
M("`@("!C(#T@,"!O<F5L<V4@;65M('@@*&EF(&,@/"`P('1H96X@;"!E;'-E
M('(I(&5N9`T*#0H@("`@9G5N(&%D9"!X(#T@9FX-"B`@("`@("`@16UP='D@
M/3X@3F]D92A%;7!T>2P@>"P@16UP='DL(#$I#0H@("`@("!\('0@87,@3F]D
M92AL+"!V+"!R+"!?*2`]/@T*("`@("`@("`@(&QE="!V86P@8R`]($]R9"YC
M;VUP87)E('@@=B!I;@T*("`@("`@("`@(&EF(&,@/2`P('1H96X@="!E;'-E
M#0H@("`@("`@("`@:68@8R`\(#`@=&AE;B!B86P@*&%D9"!X(&PI('8@<B!E
M;'-E(&)A;"!L('8@*&%D9"!X('(I#0H)("!E;F0-"@T*("`@(&9U;B!S:6YG
M;&5T;VX@>"`]($YO9&4H16UP='DL('@L($5M<'1Y+"`Q*0T*#0H@("`@9G5N
M(')E;6]V92!X(#T@9FX-"B`@("`@("`@16UP='D@/3X@16UP='D-"B`@("`@
M('P@3F]D92AL+"!V+"!R+"!?*2`]/@T*("`@("`@("`@(&QE="!V86P@8R`]
M($]R9"YC;VUP87)E('@@=B!I;@T*("`@("`@("`@(&EF(&,@/2`P('1H96X@
M;65R9V4@;"!R(&5L<V4-"B`@("`@("`@("!I9B!C(#P@,"!T:&5N(&)A;"`H
M<F5M;W9E('@@;"D@=B!R(&5L<V4@8F%L(&P@=B`H<F5M;W9E('@@<BD-"@D@
M(&5N9`T*#0H@("`@9G5N('5N:6]N(',Q(',R(#T-"B`@("`@(&-A<V4@*',Q
M+"!S,BD@;V8-"B`@("`@("`@*$5M<'1Y+"!T,BD@/3X@=#(-"B`@("`@('P@
M*'0Q+"!%;7!T>2D@/3X@=#$-"B`@("`@('P@*$YO9&4H;#$L('8Q+"!R,2P@
M:#$I+"!.;V1E*&PR+"!V,BP@<C(L(&@R*2D@/3X-"B`@("`@("`@("!I9B!H
M,2`^/2!H,B!T:&5N#0H@("`@("`@("`@("!I9B!H,B`](#$@=&AE;B!A9&0@
M=C(@<S$@96QS92`H#0H@("`@("`@("`@("`@(&QE="!V86P@*&PR+"!?+"!R
M,BD@/2!S<&QI="!V,2!S,B`-"@D@("`@("!I;B`@:F]I;B`H=6YI;VX@;#$@
M;#(I('8Q("AU;FEO;B!R,2!R,BD@#0H)("`@("`@96YD#0H@("`@("`@("`@
M("`I#0H@("`@("`@("`@96QS90T*("`@("`@("`@("`@:68@:#$@/2`Q('1H
M96X@861D('8Q(',R(&5L<V4@*`T*("`@("`@("`@("`@("!L970@=F%L("AL
M,2P@7RP@<C$I(#T@<W!L:70@=C(@<S$@#0H)("`@("`@:6X-"@D)(&IO:6X@
M*'5N:6]N(&PQ(&PR*2!V,B`H=6YI;VX@<C$@<C(I#0H)("`@("`@96YD*0T*
M#0H@("`@9G5N(&EN=&5R(',Q(',R(#T-"B`@("`@(&-A<V4@*',Q+"!S,BD@
M;V8-"B`@("`@("`@*$5M<'1Y+"!T,BD@/3X@16UP='D-"B`@("`@('P@*'0Q
M+"!%;7!T>2D@/3X@16UP='D-"B`@("`@('P@*$YO9&4H;#$L('8Q+"!R,2P@
M7RDL('0R*2`]/@T*("`@("`@("`@(&-A<V4@<W!L:70@=C$@=#(@;V8-"B`@
M("`@("`@("`@("AL,BP@3D].12P@<C(I(#T^#0H@("`@("`@("`@("`@(&-O
M;F-A="`H:6YT97(@;#$@;#(I("AI;G1E<B!R,2!R,BD-"B`@("`@("`@("!\
M("AL,BP@4T]-12!?+"!R,BD@/3X-"B`@("`@("`@("`@("`@:F]I;B`H:6YT
M97(@;#$@;#(I('8Q("AI;G1E<B!R,2!R,BD-"@T*("`@(&9U;B!D:69F(',Q
M(',R(#T-"B`@("`@(&-A<V4@*',Q+"!S,BD@;V8-"B`@("`@("`@*$5M<'1Y
M+"!T,BD@/3X@16UP='D-"B`@("`@('P@*'0Q+"!%;7!T>2D@/3X@=#$-"B`@
M("`@('P@*$YO9&4H;#$L('8Q+"!R,2P@7RDL('0R*2`]/@T*("`@("`@("`@
M(&-A<V4@<W!L:70@=C$@=#(@;V8-"B`@("`@("`@("`@("AL,BP@3D].12P@
M<C(I(#T^#0H@("`@("`@("`@("`@(&IO:6X@*&1I9F8@;#$@;#(I('8Q("AD
M:69F('(Q('(R*0T*("`@("`@("`@('P@*&PR+"!33TU%(%\L('(R*2`]/@T*
M("`@("`@("`@("`@("!C;VYC870@*&1I9F8@;#$@;#(I("AD:69F('(Q('(R
M*0T*#0H@("`@9G5N(&-O;7!A<F5?875X(&PQ(&PR(#T-"B`@("`@("`@8V%S
M92`H;#$L(&PR*2!O9@T*("`@("`@("`H6UTL(%M=*2`]/B`P#0H@("`@("!\
M("A;72P@7RD@(#T^('XQ#0H@("`@("!\("A?+"!;72D@/3X@,0T*("`@("`@
M?"`H16UP='D@.CH@=#$L($5M<'1Y(#HZ('0R*2`]/@T*("`@("`@("`@(&-O
M;7!A<F5?875X('0Q('0R#0H@("`@("!\("A.;V1E*$5M<'1Y+"!V,2P@<C$L
M(%\I(#HZ('0Q+"!.;V1E*$5M<'1Y+"!V,BP@<C(L(%\I(#HZ('0R*2`]/@T*
M("`@("`@("`@(&QE="!V86P@8R`]($]R9"YC;VUP87)E('8Q('8R(`T*"2`@
M:6X-"@D@("`@("!I9B!C(#P^(#`@=&AE;B!C(&5L<V4@8V]M<&%R95]A=7@@
M*'(Q.CIT,2D@*'(R.CIT,BD@#0H)("!E;F0-"B`@("`@('P@*$YO9&4H;#$L
M('8Q+"!R,2P@7RD@.CH@=#$L('0R*2`]/@T*("`@("`@("`@(&-O;7!A<F5?
M875X("AL,2`Z.B!.;V1E*$5M<'1Y+"!V,2P@<C$L(#`I(#HZ('0Q*2!T,@T*
M("`@("`@?"`H=#$L($YO9&4H;#(L('8R+"!R,BP@7RD@.CH@=#(I(#T^#0H@
M("`@("`@("`@8V]M<&%R95]A=7@@=#$@*&PR(#HZ($YO9&4H16UP='DL('8R
M+"!R,BP@,"D@.CH@=#(I#0H-"B`@("!F=6X@8V]M<&%R92!S,2!S,B`]#0H@
M("`@("!C;VUP87)E7V%U>"!;<S%=(%MS,ET-"@T*("`@(&9U;B!E<75A;"!S
M,2!S,B`]#0H@("`@("!C;VUP87)E(',Q(',R(#T@,`T*#0H@("`@9G5N('-U
M8G-E="!S,2!S,B`]#0H@("`@("!C87-E("AS,2P@<S(I(&]F#0H@("`@("`@
M("A%;7!T>2P@7RD@/3X-"B`@("`@("`@("!T<G5E#0H@("`@("!\("A?+"!%
M;7!T>2D@/3X-"B`@("`@("`@("!F86QS90T*("`@("`@?"`H3F]D92`H;#$L
M('8Q+"!R,2P@7RDL('0R(&%S("A.;V1E("AL,BP@=C(L('(R+"!?*2DI(#T^
M#0H@("`@("`@("`@;&5T('9A;"!C(#T@3W)D+F-O;7!A<F4@=C$@=C(@:6X-
M"B`@("`@("`@("!I9B!C(#T@,"!T:&5N#0H@("`@("`@("`@("!S=6)S970@
M;#$@;#(@86YD86QS;R!S=6)S970@<C$@<C(-"B`@("`@("`@("!E;'-E(&EF
M(&,@/"`P('1H96X-"B`@("`@("`@("`@('-U8G-E="`H3F]D92`H;#$L('8Q
M+"!%;7!T>2P@,"DI(&PR(&%N9&%L<V\@<W5B<V5T('(Q('0R#0H@("`@("`@
M("`@96QS90T*("`@("`@("`@("`@<W5B<V5T("A.;V1E("A%;7!T>2P@=C$L
M('(Q+"`P*2D@<C(@86YD86QS;R!S=6)S970@;#$@=#(-"@D@(&5N9`T*#0H@
M("`@9G5N(&ET97(@9B`](&9N#0H@("`@("`@($5M<'1Y(#T^("@I#0H@("`@
M("!\($YO9&4H;"P@=BQR+"!?*2`]/B`H:71E<B!F(&P[(&8@=CL@:71E<B!F
M('(I#0H-"B`@("!F=6X@9F]L9"!F(',@86-C=2`]#0H@("`@("!C87-E(',@
M;V8-"B`@("`@("`@16UP='D@/3X@86-C=0T*("`@("`@?"!.;V1E*&PL('8L
M('(L(%\I(#T^(&9O;&0@9B!L("AF('8@*&9O;&0@9B!R(&%C8W4I*0T*#0H@
M("`@9G5N(&9O<E]A;&P@<"`](&9N#0H@("`@("`@($5M<'1Y(#T^('1R=64-
M"B`@("`@('P@3F]D92AL+"!V+"!R+"!?*2`]/B!P('8@86YD86QS;R!F;W)?
M86QL('`@;"!A;F1A;'-O(&9O<E]A;&P@<"!R#0H-"B`@("!F=6X@97AI<W1S
M('`@/2!F;@T*("`@("`@("!%;7!T>2`]/B!F86QS90T*("`@("`@?"!.;V1E
M*&PL('8L('(L(%\I(#T^('`@=B!O<F5L<V4@97AI<W1S('`@;"!O<F5L<V4@
M97AI<W1S('`@<@T*#0H@("`@9G5N(&9I;'1E<B!P(',@/0T*("`@("`@;&5T
M(&9U;B!F:6QT(&%C8W4@/2!F;@T*("`@("`@("`@($5M<'1Y(#T^(&%C8W4-
M"B`@("`@("`@?"!.;V1E*&PL('8L('(L(%\I(#T^#0H@("`@("`@("`@("!F
M:6QT("AF:6QT("AI9B!P('8@=&AE;B!A9&0@=B!A8V-U(&5L<V4@86-C=2D@
M;"D@<B`-"B`@("`@(&EN#0H@("`@("!F:6QT($5M<'1Y(',@#0H@("`@("!E
M;F0-"@T*("`@(&9U;B!P87)T:71I;VX@<"!S(#T-"B`@("`@(&QE="!F=6X@
M<&%R="`H86-C=2!A<R`H="P@9BDI(#T@9FX-"B`@("`@("`@("!%;7!T>2`]
M/B!A8V-U#0H@("`@("`@('P@3F]D92AL+"!V+"!R+"!?*2`]/@T*("`@("`@
M("`@("`@<&%R="`H<&%R="`H:68@<"!V('1H96X@*&%D9"!V('0L(&8I(&5L
M<V4@*'0L(&%D9"!V(&8I*2!L*2!R(`T*("`@("`@:6X-"@D@('!A<G0@*$5M
M<'1Y+"!%;7!T>2D@<PT*("`@("`@96YD#0H@("`-"B`@(&9U;B!C87)D:6YA
M;"!X(#T@8V%S92!X(&]F#0H@("`@("`@($5M<'1Y(#T^(#`-"B`@("`@('P@
M3F]D92AL+"!V+"!R+"!?*2`]/B!C87)D:6YA;"!L("L@,2`K(&-A<F1I;F%L
M('(-"@T*("`@9G5N(&5L96UE;G1S7V%U>"!A8V-U(#T@9FX-"B`@("`@("`@
M16UP='D@/3X@86-C=0T*("`@("`@?"!.;V1E*&PL('8L('(L(%\I(#T^(&5L
M96UE;G1S7V%U>"`H=B`Z.B!E;&5M96YT<U]A=7@@86-C=2!R*2!L#0H-"B`@
M(&9U;B!E;&5M96YT<R!S(#T-"B`@("`@(&5L96UE;G1S7V%U>"!;72!S#0H-
M"B`@(&9U;B!M:6Y?96QT('@@/2!C87-E('@@;V8-"B`@("`@("`@16UP='D@
M/3X@<F%I<V4@3F]T7V9O=6YD#0H@("`@("!\($YO9&4H16UP='DL('8L('(L
M(%\I(#T^('8-"B`@("`@('P@3F]D92AL+"!V+"!R+"!?*2`]/B!M:6Y?96QT
M(&P-"@T*("`@(&9U;B!M87A?96QT('@@/2!C87-E('@@;V8-"B`@("`@("`@
M16UP='D@/3X@<F%I<V4@3F]T7V9O=6YD#0H@("`@("!\($YO9&4H;"P@=BP@
M16UP='DL(%\I(#T^('8-"B`@("`@('P@3F]D92AL+"!V+"!R+"!?*2`]/B!M
M87A?96QT('(-"@T*("`@('9A;"!C:&]O<V4@/2!M:6Y?96QT#0H-"B`@96YD
M#0H[#0H-"B@J('=E(&YE960@86X@87!P;&EC871I=F4@=F5R<VEO;B!O9B!-
M86ME('1O(&=E="!T:&ES('1O('=O<FL@*BD-"@T*9G5N8W1O<B!!<'!-86ME
M($\Z3W)D97)E9%1Y<&4@/2!-86ME*$\I.PT*#0IS:6=N871U<F4@0T]-4$]3
M251%(#T@#0H@("`@<F5C*%@@.B!S:6<@<W1R=6-T=7)E($-O;7!O<VET95-E
M="`Z('-I9R!T>7!E('0@96YD(&5N9"D@#0H@("`@<VEG('-T<G5C='5R92!#
M;VUP;W-I=&4@.B`-"B`@("`@("`@("`@("`@("`@('-I9R`-"B`@("`@("`@
M("`@("`@("`@("`@9&%T871Y<&4@="`]("!4(&]F#0H@("`@("`@("`@("`@
M("`@("`@("`@>R!D871A(#H@:6YT("P@8VAI;&1R96X@.B!8+D-O;7!O<VET
M95-E="YT('T-"B`@("`@("`@("`@("`@("`@(&5N9`T*("`@("`@("!S=')U
M8W1U<F4@3W)D.B!/<F1E<F5D5'EP92!W:&5R92!T>7!E('0@/2!#;VUP;W-I
M=&4N=`T*("`@("`@("!S=')U8W1U<F4@0V]M<&]S:71E4V5T(#H@4V5T('=H
M97)E('1Y<&4@96QT(#T@02YE;'0@=VAE<F4@02`]($%P<$UA:V4H3W)D*2`-
M"@D@("`@("`@("`@("`@("`@("`@("`@("`@("`@('=H97)E('1Y<&4@="`]
M($$N="!W:&5R92!!(#T@07!P36%K92A/<F0I(`T*("`@(&5N9#L-"@T*<W1R
M=6-T=7)E(%0@/2!R96,H6"`Z($-/35!/4TE412D@#0H@('-T<G5C="`-"@ES
M=')U8W1U<F4@0V]M<&]S:71E(#T@#0H@("`@("`@("`@<W1R=6-T(`T*("`@
M("`@("`@("`@9&%T871Y<&4@="`](&1A=&%T>7!E(%@N0V]M<&]S:71E+G0-
M"B`@("`@("`@("!E;F0-"B`@("`@("`@<W1R=6-T=7)E($]R9"`Z($]R9&5R
M9614>7!E(#T@#0H@("`@("`@("`@<W1R=6-T(`T*("`@("`@("`@("`@='EP
M92!T(#T@0V]M<&]S:71E+G0@#0H@("`@("`@("`@("!F=6X@8V]M<&%R92`H
M0V]M<&]S:71E+E0@>V1A=&$]9#$L8VAI;&1R96X]8S%]*0T*"0D)*$-O;7!O
M<VET92Y4('MD871A(#T@9#(L8VAI;&1R96X@/2!C,GTI#0H)("`@("`@(#T@
M("`@*&EF(&0Q(#P@9#(@=&AE;B!^,2!E;'-E(&EF(&0Q(#T@9#(@=&AE;B`P
M(&5L<V4@,2D@*"H_/S\J*0T*"0D@("H@*%@N0V]M<&]S:71E4V5T+F-O;7!A
M<F4@8S$@8S(I.PT*("`@("`@("`@(&5N9`T*"7-T<G5C='5R92!#;VUP;W-I
M=&53970@/2!!<'!-86ME*$]R9"DZ4V5T("`-"B`@("!E;F0[#0H-"@T*#0H-
!"@==
`
end