Boost logo

Boost :

From: Gennadiy Rozental (gennadiy.rozental_at_[hidden])
Date: 2003-03-03 03:08:29


Hi,

  Here is my a bit late review for the variant library. In spite of several
concerns that I have, I incline to vote to ACCEPT this submission.
Design concerns I would like to be discussed and either accepted or
dismissed. Implementation issues are less important. Rest is mostly
comments.
Here follows my detailed review. I was not able to follow closely to the
others review, so it may intersects. Issues listen in no particular order.

Design
_________________________________________________

In most part design of the library looks solid and well thought-out( I think
we definitely ought to give Andrei credits for this also). There are several
things that bother me though.

1. Two types requirement
It's unreasonable. ! or even zero sized variants should be allowed.

2. Top level const requirement on bounded types.
It's unreasonable. I should be able to define variant with const types. It
will be as usable as usual constant types are. The only requirements that we
may incur is that if one types is const, rest should be also.

3. Copy Constructible/Assignable requirements on bounded types
This only need to be required if variant should have appropriate feature.

4. DefaultConstructible requirements on first bounded types
This only need to be required if variant need to be default constructible.

5. Usage std::type_info for reflection
I don't think we should enforce RTTI for the variant users. We should be
able to postpone the decision on what kind of reflection information user
want till instantiation time.

6. extract
I not like this name. It does not reflect the essence of the operation it
performs. It does not extract juice from orange. It provides an access to
the varant value. It basically external access method. So the name get,
get_value would be more appropriate. Also I think we need free function form
of value extraction. In other case it would be difficult to place extract in
context where template parameter is deduced. And check function is not that
important in most cases.

7. Variant size
Unfortunately I was not able to follow exact logic behind usage of 2
different storages. But one thing I know:
sizeof(boost::variant<int,std::string>) could not be 28.
>From what I view it seems that types that are used to construct storage2
also used when constructed storage1. So we definitely have size duplication
here. Separate issue is the type of which field. Having it as int is an
overkill. It would be enough in majority of the cases have char. But we
should be able to deduce the correct type depends on number of argument
types.

8. Visitation algorithm
In sketch presented visitation algorithm look like this:

void foo1( which, visitor )
{
    if( n = 1 )
       visitor(...)
   else
      foo2( which, visitor );
}

void foo2( which, visitor )
{
    if( n = 2 )
       visitor(...)
   else
      foo3( which, visitor );
}

....

In a pseudo code it could be rewritten like this

foo( visitor )
{
   if( which == 1 ) visitor( first field );
   else if( which == 2 ) visitor( second field );

...
   else if( which == n ) visitor( nth field );
}

It's obvious that switch-based algorithm will be more effective. And I
believe that given at compile time number of the types supplied (or maximum
possible types variant accepts we should be able to generate one (even if we
will need to use PP for that )

9. Design of the container move function
I do not see a way how with current design and implementation of the
container move function I could move content of one vector into another
originally empty vector.
move(src.begin(),src.end(),trg.begin() ) will move to garbage memory
move(src.begin(),src.end(), back_inserter( trg ) ) will copy instead of move
Do we need something like back_move_inserter?

Implementation
_________________________________________________
General comment: I believe that all template functions in header files need
to be defined inline.

static_visitor.hpp
Line template <typename R = void> fails to compile with MSVC6.5. SO to make
it work I was forced to use following form
template <typename BOOST_MPL_AUX_VOID_SPEC_PARAM(R)>
This and also the fact that MSVC6.5 could not handle return void construct,
forced me to change all the visitors defined in visitor.hpp to return
boost::mpl::void_. Maybe you could find better workaround

static_visitable.hpp
1. I believe that implementation of this concept could be enhanced. The
major problem as I see it is that static_visitable_traits could not be
instantiated with const type. That force you to propagate switch on
const/non const in many different places. While you could do this only once
in static_visitable_traits implementation. See attached file for details.
Once you do this the implementation of unary apply_visitable will became as
simple as this:

template <typename Visitor, typename Visitable>
typename Visitor::result_type
apply_visitor( Visitor& visitor, Visitable& visitable )
{
    return static_visitable_traits<Visitable>
            ::apply_visitor(visitor, visitable);
}

You will see simplification in several other places.
2. is_static_visitable description states that this metafunction will check
whether the specified type is visitable by a static visitor. This statement
is misleading, cause you do not (and could not ) check this. What you check
is that type could be visited using static_visitable_traits interface. I
never mention static_visitor here.

extractable.hpp
1. First of all this is bad name. extractable implements different concepts
that it names. We want name type T extractable to announce that this type
support extracting something out of it. Isn't name is misleading and means
namely opposite that type is extractable from something?
2. Extractible is the concept and should contain is_extractable check, which
is for some reason located in details of extract header and named
is_directly_extractable (this name even contradicts the comment in it's
definition: it's either directly extractable or through custom traits
implementation)
3. This header suffer from the same issue as static_visitable with missing
const/non-const switch. For example, once I implemented it I was able to
eliminate one layer in extract implantation in extract.hpp. See attached
file for details

extract.hpp
1. boost/addressof.hpp include is missing
2. From what I view in this header there are 3 ways to make type T work with
extract<T> interface
  a) Make T "directly extractible", iow inherit from extractable
  b) Make T "indirectly extractable" by means of specializing
extractable_trats
  c) Make T visitable by extractor_visitor, by means of specializing
static_visitable_traits for T

BTW it may worth mentioning in docs. Now it appears that having
extract::visitor in private part of the class definition make third way less
usable cause I could not mention Visitor name
3. Defining result type in extract::visitor definition is unnecessary and
in fact prohibit compilation on MSVC6.5
4. As I mention above once you fix extractable traits, implementation became
more simple. Look on attachment for the details.
5. Name for the visitor could be more specific. For example the one you have
in it's description

define_forwarding_func.hpp
This file contain mix of Unix/Windoos EOLs.

mpl/contain.hpp
I think this is in Alexey direction: it may worth generalizing this function
so that if the second argument is the sequence it will check that one
sequence contain another.

mpl/guarded_size.hpp
I do not understand purpose of this header. Why couldn't we use >,< signs
instead?

unary_apply_visitor.hpp
As I mention in static_visitable discussion, once you fix the traits
implementation it simplifies dramatically. I did not touch binary one it may
also became more simple. BTW what is the meaning of the NOTE in this fie?

delayed_apply_visitor.hpp
I did not touch binary side but once you fix the traits implementation unary
function operators became much more simple. You don't even need PP anymore,
but straightforward:
    template <typename Visitable>
    result_type operator()( Visitable& visitable )
    {
        return apply_visitor(visitor_, visitable);
    }

has_trivial_move.hpp
>From what I view it seems that:
has_trivial_move_constructor <= has_trivial_copy
has_trivial_move_assign <= has_trivial_assign
So your formulas could be simplified.

incomplete.hpp
This header presents yet another implementation of smart pointer idiom. In
this case with deep copy semantic. Do we need one? If yes, lets name it
deep_copy_ptr.

aligned_storage.hpp
1. max_align used by implementation is not defined for Borland
2. aligned_storage component is not that generic as it may look from the
perfunctory look. It only works of size is 2^N. May be we should check this
explicitly for more clear error notification.
3. Why is it noncopyable??

visitor_ptr.hpp
1. why visitor_t is not function1<>?
2. Why constructor expect reference not the object?
3. Couldn't we use std::ptr_fun or it's boost relatives somehow?

move.hpp movable.hpp
I think this functionality deserve better place in boost hierarchy than
variant details.
1. move.hpp missing <new>
2. move.hpp missing Andrei copyright
3. I like name const_lvalue_ref better than original mojo constant. But why
this class placed in detail namespace. How would I const lvalue from
temporary in place of function parameter. With const_lvalue_ref I could.
4. move_source name is confusing. I would rather say it's move result, cause
this is the type returned by move function. I prefer original mojo name
temporary better.
5. move_return name is confusing. What it's mean? I would rather say
temporary_return or function_return
6. move_type? This type I would name move_result
6. operator move_source<T> in move_return definition is an improvement over
original mojo design
7. moveable?? maybe movable?
8. Where is is_moveable?
9. I was forced to define and use typedef detail::const_lvalue_ref<T> base;
in move_source definition to make it work with MSVC6.5
10.uninitialized move uses iterator trait that could not be deduced with
partial specialization. I fixed this implementation so we would not this
this. Look into the attached file for detailes.
11 initialized_move has an obvious bug when it tries to place new object
into *result; should be result.
12. I wrote detailed test for all aspects of move semantics. It's attached.

variant.cpp
1. You should have relied in latest cvs for review 1.29 workarounds only
confusing things
2. max_value metafunction description need to be stated more clear. Is
calculate maximum value of the function on a sequence, isn't it?
3. What is purpose of variant_base? What is the difference between
detail::variant_base<Variant> and static_visitable<Variant>?
4. using_storage1 implementation could use compile time if instead of
runtime one
5. variant class contain a lot of things in private section Why did not you
separate them out of class as you did with visitors? It seems to be
possible.
6. In general it may worth to separate this file in smaller parts. It would
help when you will work on portability issues.
7. Unlike rest of the submission I was not able to make this header work on
MSVC6.5. It will require more time and attention from authors.

Docs
_________________________________________________

General comments: it could be more detailed and explanatory. Especially in
the area of design and implementation. Simple concepts as visitable,
extractable, movable deserve separate pages.

Tutorial::Value semantics section
Case 1: .....using the rules discussed throughout this section.
-----------------------------------^
This is unclear IMO. What rules? I did not see one.

Tutorial::Function-based visitation
"print_int_char_visitor" - should be print_int_float_visitor and "...print
Float value:"
"Output: Int value: 88.0" - shouldn't it be "Output: Int value: 88"

Tutorial::Visitor Concept::Structors
"....initialize *this with the copy of operand" - do we need word copy here?
"May fail with any exception arising from the copy constructor of
OperandType". It's not required to be a copy constructor.

Sample programs
Where are they? Why there is no example directory with discribed files
inside?

Tests
_________________________________________________

1. Jamfile missing subproject statement
2. Tests could have more sound names to clarify what are they doing
3. While working with the library I created additional set of simple tests.
You are free to use them. They may help you when you will work on
portability issues.
4. Why variant_test is separate, in wrong place and is not in Jamfile?

Code
_________________________________________________

In most part code looks very clean and consistent. Only several remarks:

* I would prefer if you would follow boost recommendation with class data
member naming with leading m_ instead of trailing _.
* extra indent of function result type look strange from my POV.
* private section of class definition with class representation (data
members) I would put on the bottom of the class
* do we need that complex hierarchy in variant detail subdirectory?
* several files have incorrect/missing file names in the comment on top of
the file (especially wrong path)
_________________________________________________

My regards to the authors for this interesting and complex work.

Gennadiy.

begin 666 boost_variant.bz2
M0EIH.3%!62936<SM\7H`5_9_M____?W]______________\(`$! ``" " `)
M``A_at_4EWUT">3SMF[V/2\CLU7RNIYY9&/"3NND^;>GUJJ[>]YRJI(FM"GM8PI
M"SO;G>:=:@5M1-I0%MZZ]]Y'V[NWOO;%`]O/#GWUWW4W;X]JF/=\9PQ7?'.I
MUKWVU7-MWWS[P^U[9WKE':UUQ2JVVN?7G9O-T[[#>J&MZ -'4=W=<Y6[,N7/
M6ZQH!A1Y-U;,V79EIW#5V1M!U9_at_F:0C9:UI_at_3,L9>\ UT;.A6]MUX') #5>9
M=W0E0^]RK7O-&;W>O+D`2FD": F_at_30Q$Q$TVB-/4U3U/#0IY3-3:@/4])XIM
M1M1Z0>H##*,CU#0>H)$($((U,(%/*I^T9"3TD'ZH\I^J>H:&GIJ ]0``'H"#
M0T#U!H $IM2)2:80R:(:#U#0VH&C0 !H``&F_at_- ``````(4B(@FC4]$!-4_2
MGZ:GE/)-I3]4_4T/4T)ZF:CU&R: `C1B-& (,C!-`$213)D3334VFFA-2C]3
MS53]3:IXH]J;1/2:GIBGZC%#]4](\FH]0T &@T#U```(DA"&B- $T804V1J;
M0F)D2:>GDD :!H#3T1D8$/4#1B #^<%[O_W\Z-]<S]^WK+>&)A\RA^(APFJY
M!<*B2$!"&@`*>P@`?9D?97V?7;[/L+UBV5HRN_BV:ZAV(3*1`#PH<H=@+@*H
MP8;U41)ENC$6+68XFUM5,9;I^(7I3B<UM.PX!9[0" @1"(8D:%2A9%E3OPQ&
M)%!:`@!+4##"0D*+$ J$A (GN"JH!0(*_<D1/"%'1$2Q"$410!,P0C)"H3 (
MT02BE*HPJ_H_VU5ZQAA1/]GVL->E_[:^C_at_MQ_WM%,;8"_(PT20!AL:5,7^^\
M5/YYBL2<VLNK84R)W+T_Q;S=C9=L&FDOU^<0VZV+$.05)A\&8P#(;,"],8:N
M7KX87,-RIDS"_EB:DS,F!]25K9<"S274FD,0P&+\9'52(@N.8NOT#3;DA6<[
MU)5X(-]4>5%OAWSW4:E[2P<]*I4R+[1^V]ZI!<_X_U;>9QV<,&QU?]V2./\V
MZ>[6AY3HOD_at_19B2JXZ1]BS_at_ZU)IPBA(Y7!TC%PU)71'5B2)1+]&V!\TP_) J
MV"/$AU?,D\##&C]VPJ62*NN.XX=]2'/"U1&5-0<>@[E]E6=7T.J(DF$Q0?W_
M1(VB4VO%]L =&B3D$A8..E Y^WFT-0NTN;3A-YG4'%H\7US<[(';T9(VD4.O
MQ09CX[M/Y;Y$33H:*TOH_.[P.0;K/N$M&22101!!!!'C[+A#4E58R0K"FY#D
M3B80G'1DK2HRA5(LJQ1:$]YZRR%HX91#`20LR)[J\VQ=O%3:<]<3(ZSD^6L#
M=N/-JRIPSRPV6D)HDIZ'+U(-(;@BX,TCTG6[?!H/9L(0Z[,0T3A'M7$Z.3)Q
MQ)JW93W8-PQ_WM+>J:Q4#:&#::W&*JI=O")Y"[(:H<(B<AF(B*I*F(3K#H\R
M3UDZPCQ 9 _BYG;F4%$0)7"ZAJ(JJCD1KV>WXG"[?V4MUFO;ZNIN)]$U9'S'
M9$_/K*<GX>2)S%U:$1QU* 0_at_A$ZRX[0>;5T1-S <L!V-$^C'#;/__at_H74'+TV
MALK72(+<EF\YX[B\Y'F0#'43[8.V"]VZ9%#(9Z&'LFE-#)C;?#Z=,8L0IF:*
M,CJB`AALX&%#I20SP)55"8H_at_HES!?-E:F!VJV;'CB6IQ<^88R&"V)BJN2)+'
M]&J'9MI;AR_-L6$=._at_Z-6GI$S+E$#I!!V?I-_at_7@TOH/0/JCT'7V[:G>#:)0V
MJ$(V$21X<)<=8Q3<D'" YMVR#O"O%>SAN+3/J-[$>JP4S_at_8743[]BM%,Z7JC
M!>BA[^P=LBP>J0I[VWC(28F.`Z:?I;<R$V-+\KRY-9.V_5='3(LALUS.\[Y(
M,S"O5&>[JNX33+;8QL]T)UPK-+;*UNBM3_at_C*7COY%([J[8?*B".X'0ZH[FNA
M[9O.R%*&,>OII,2+9B6E0_at_0@1B(2*0C(50=,X3IMR6>\<T!Z.'7_`A_GA<-[
MTM\GBM,>J'96-O>1:SO4_at_AKW)1<X83CEW#T6*G8!(&$7]@AQB:^G^[2=R<^K
M/CHEC#*TG#SK"2,?$HAI`#\8?1 I3[,BEWD0)$U0B;9>!&R&GL0K-'A^*4AH
M^W1[G;QXY6ML0L:-.7G[3(0^7.D.NMQY?0:Y(;N;H0B(2"YGJJWQ43S\-6YU
MWD#;!\/T4&#0@'+IY[(/A&$&!(5+%5$Q2P04A01''7$#I3':6 X=+!M3?/&5
M5%%7QQE4G(R$-E/YA/?$"?<`]0E"@A$"Z7J]K.)A.\*I/H]$^EK4ME@@M2._
M4(Y2P#9I'M@`]!K$*3)L/&L22<T^8T9JMX)RK^."P&$0))! `'U^OZ.7,T^C
MNYL5W^_L?)#)#I0[$,(=/Y=>*H!U_at_L $53H,0 0.Z ]>0,(3NA 7(!5U8DK[
MVS?7:*O$H&0!R2(IZ!].*&H3F%Z2`NH`#GS8`'%Q`);Q`*3NB7=D>W[K7LQ^
M-W%,BHWF?#;8?I?D.(LYG,N(CN%U8K,"6$A)=[<=P>R\)BS"@REO`0%*"%E@
M,82T3,:83J #G1N"\95"=$^%&]:>$DPMFD9XC[!C-AF8W0ZX/]-PV>J(U J3
M]? CF1.R!/#._[2?0H"<3CB1(<8[%I8")CM)D=,E>J=F6-0SFV<`S/"4OOFQ
M5Q_(XTMF9 =;/:<EGH\KP^T,Q#"!#-[-_at_-[!?=2^PL)C"(-WX:_5=HC^?'YX
M^G)WD?6\R\JD5B8J+.F]KX4=LPI@+F1$(AMY8S\A^0JJN3FHXB(TE-'/T?@/
M^5W C)LZX=6C&+7PVN7HDY_at_O$;S>=YW%EUC$-XYWMR.F)W_ K+_1:A:Q> O:
M1W^]=[U]+3+0PQ4CYO+X4@;5#YS;7X;F"N[D"M\`.>(?.(PI"T=Y95.36(P:
M/G4/(]1%"GIJ@,??ATC)T$/WM]Z(9%\#?&# 8-(6&,6 R'VY=O 2K& C\9FN
MZB$-.Q4*2>2"2> J3PB!W48DM^=.C5^GET+W@^J_V:J_;Q/Y_16TV'E#=AP^
M)<%'/\?Q>.>-GD%]JA[Z][GF4$/:'A:HVSS_"9!M.K4,[\:.9P;A//RUW_at_D6
MNT0#0;]B'):8?;][G11Y%QN:KU>OO^-KW_0'T_C#[\+]/<C.-14RVVZ<*JJR
M#1O7>>HF_at_A#3.5=TK9<X5S++;49;(JNWJWV^C)?!L-0UPE%&)1DUZR2'C8+&
MXYRFG+W0&SA:.]" 5 WA!OL,YD(,T7+&XB5*.0R#Z+<F?-T/Q]YR\,QSHJI@
ML-693SLWC_at_5;P(MK:XJ/'W[FU:,]OG(Z\Z,S7J+!F;IL51YV6QDA"N7A3F#'
M`<XP`J3U`C'V06"P&E)8V%X;G8GQT"IROE&#[P#*-QE&E"Z^3[&-E3 @C\?X
MXNPYX[M_!OP_*,C.'Y$+Z7AZ[7.]P%B8<I_.I;%$^<VDM(");=1\V\<HL+@[
M- @!8T(+S4-:-R/2`HW.>[MKIS15NHPD^++?>V4V/AQ,LH?B3-48GRLMQB"S
M$?J>]Y-HX2#:3DY*Y2MEMB,8X$\K79CT[>;4P5OGLP8(T(A];U(CSY_)I!6N
MG_7"$0C-^T@=CZKEU[]II_at_N1%%N-=KOPX^]0^'9\!<9M)EBG%H.;EQ(,2;MJ
M;>&,D_Q38A20W> =M0^,U0*4#$K]/+L!<EB$#MH/#P[+#<S8% F>`M7-PD4J
M?'QC^3#.G98_MZ2R+/LU5)1+)NT-.NXV*-:5!0CI?P.&+$E%UL1H.*[64AK9
M"];9F[6ONI>%<-74`FPM7,49Z2)#-.[9GEQ=U:D2M-+G9=C1.2%!T:H.ZZ1*
M4U$/W,-#[;;<$;I5)T+^45>F\00NC?$,1.*9H1&C);&"($&WX)PUWB.OJR@%
MD5HRTXXX<3# I:&DU>ILC(X"-%[5OU#YX[9[/W MV!3D:9KM=18"_:_(A<<Q
M0W((PM""2Z#4#Q<M5K>!G,X1\7,J%'I.CR(E`T'(1:W^EQ.$A)BUJ,M')K\S
M3.TV+.6FE6.$ML =EDS&C&YH)ATE"+&JM99E1$+QY5;NVG7NGTT'(VX`Q,B/
M'4P77Z2I7UIDB(5!'I8Z88,"8-/*YYIY%K"ZJSUH[2I(#T((E''2\#Y<49\[
M&.-B^<>$$X >^:85O9XS(AE_at_7P`MI<,5OW<>- \1==?K8'<D`9X(@,8OK8-T
M&"IT,XY%<9VR7$NI'SYQ049_at_P<((F*KM;.:PIP'A6]BY\1K;*S8\=IG36]\S
MU?1N_7S1:H5$$:V$JQO33U/I&19T/F,E,QQBYH!#S&,8;O0>0PL#2V3(6%E8
MBGX-&B<G=PSFP<&G?FP3E>",YP7>+\.-^#8FDND'*N0+CDP;01T1HPC<5+^+
ML%;V+.$WJ[WJ90480U['*->KL--+2T1#<"-19<>!R.[E#+'*$_5K6U%[Q:UM
MHFM\8>Q:9M)[+25V:7B;H<*%S:1 Y<;"4Q))(A6K'06U6P=<SQ%S@=Q%C(/A
MZ=9-:)Y>03S];@L7&=W;IS+"NSQD`P(P(:"UBS64C\'H<YLSM;"Q;EDK<9E(
MLVWTXSK)&QQ#$=-3C_at_DMO7QC/^N%\L9WZB/%^L:!0,7!'I#?FRS-SW,;6JHE
M0=EHMJ"8.!''PU[.+R7]W+9T;,WO!:L6L@\?4;F?@/R[L]M&N90<.]A'%((@
M?T],9:1NQ'5(,BD&5U'UWMQOWY2&(KEI+7WW9P0:[?8I=#0=#'4DA(9-9-78
MPLA;',Z/?I/-80&@RO_at_P8__at_JIHE*Q3/9\Q$%*SVY'+F_^8$_16%UOP7;&<A%
ME0_9OV^*^KJ9R",XVL[4NS];17=1;V=AA.ZBBIXK@[^A.&QU9-]RCHE]&T'B
MRMC<3;'*]=!,;#JS9P_at_7O9!L#$-]2)CO$PV1(Y'D2QB(4S9RVLANF [4.QK'
M%,R&;4BVW*NMF>4](]F=C80TQM<O#I**&&WEZ-^_/=E!N!V[]J?J\V7Y7MT?
M?"";NSLS+5Q%'9D444907O CI&WGL_at_QK'??BK6C:UWC1AYM.*9$XAYW,Y6Y/
M<3H0)HJ%9$_$\)%+^ZV&E9#'>L[&"J3!6$PL3TYFW$6AGH;5#*Z-J-^#A*>%
MKQIH!"@0%<22@_<1T[WLV96:1B6&OF6!(W'4P;X5K-1T[(1.5S#596/-G"'!
M-=>\>7RPR#$;CZ$UDU]MKW,9H8,J#WN1I,&D=>7$;'G-,[$/S'>:+V;]ZF3P
M>6QS$HP1(5RP7*,6EZM<C35J(VWROX=$6W%3EN)906Y.Z+X!KG>;DS.D)8F4
M(7TNPM)E=.F&A9IL+6_BZ5;5$^)4;1Q74OS6U_"29&$-OSZ<R_.+AG$>7!D1
MK"[NE4!M+Z<O*#=+N8;C7(MHVYKD]Q>LR7J[]SPPKF</GW<7/.I]425YB'UZ
M^R;HI:VO;DRYJEZN4'7/&:9DIJ/&99=!<1X>G[5^%VV]FN5LCW#/'<5'Q"<K
MVA$=`.R.F#G!,R9#L#A01.*P,<Y+Z/W<MS+]>WL/*/X"`$JFB 1>L_I.UPOI
M@$W?;Q ;P0#J$WCY<>K#S>$_6F0(O[,.3D5_[@GS156@( 2"5?''J^SQHK)6
MQBMF5H0TM:N)P4N5"V&#H4Y?+2LD,$]691:FY&T(R.R48P5A/R?5O1,&-YH5
M_R'*]YGQF,:$4Y1"P3N[.DD,B03X2ZFYO!+L(L5+W.9I#KZW#7-V?2&IK2)?
M9HOW1H_[8WPH"[ZQ,#R??*-0%U><=_ED]? MPV6O:Q[$DT8>@!SNZ&GXGHV/
MR[$<@-Y'Q10A>65Z"(+[B4DKQ?)7*DS[L[GL#9$*.J)02G?)U).#QY+A8/MW
MTI<>"<>KDH812OH-!-W'BD<S0%'3UWW*-^?KQB5DXQLQ,03;;(W98#?GB)FQ
M5F9Y>K"3&ILALBQ,HOO:8GNZ4*3XQ<+0D=^%Z-&QVKK\-'7)^#_;Q1]H^M:/
MU?9/K'G('/[-QF3BWZT]7;5O_at_9YG,X.LX:15APQ(L'V^F05UR>0\/G_at_Y\[.M
M:#2 Y6F709FK5RH'7S81"C8CA?F:48XJ3-2>$"55;+B[YQ-AJW/K8.6EHG_at_Z
M&8V:P=.,23:3G=]"#ET;F.ER4(M1<;^VV@@:B&L:)QTE>/[3M8.?'[1KXG'4
M%J;-,Z8B>4E^(PCA,]F:Y([H[]B^U/NY.CVA-IS/5701(N\,&C AT3+410[N
MW:\;!R%A0-YF5^C NN;07$<J4G=;CE9HH%N2C5RA@?THO@[9/.@\7OH.7>R6
M=%#*`\K_\.;FK3]_1?RZ, ]]DFQ"`^F^Q$U8IJ=#([$BG+J3J,3^5YD!2$RR
MPY5>18E!-U)K/4$0?E^[W8N&4#3$VQB"X?.:9M8NWR:MCMVC;$%I<<\8#B9W
M=CB]!H(!-PZ7G8&J_at_Y<M:F)LS9 (&^AQ"WY)*Y8K\-IZK/.;:=!($'I4`;L7
M9ED?&%NCP^%Y,1K#KZ:9D%S$>Z]_#4,H(9D:8A&"8-:/UY>).B4<Q1Y=F=K?
MN2K]G9 B((28SJ,#$_)9C 2K;$S5;1?^/=O$XAV;<33\;3(_"U[:3;:M!#-,
MELW+F;@_G;)(*MHNL>RW?23(S72B?A&WLYUI; ]SS2U'-=LD"/ZKIYG=KSIF
M?="P' *,$Q8*I&'86N7"4$O1%*].)&$,LC,-W'\VX/P>7@;JA>"QN%<*YW/Z
MD.,AC!,<_X79,9]J&-J$>CF>@T?'J6YTB^?Z4HL=]Y5R]Y#[!/#+-VM,/+@4
M1D*JG?"1O,0M)'?/RP/^;)6%IUC];8F9J'PD76B<7H*%I390A;DP0IG]XKCL
MGP&-^T!PU$UMGA+(ACY%'<7^T_DGW",H-Q<^QR\=%TH8N)+H=.SQ0C"5"A9*
MX)/(VOFOJ][0,0+;1"<U"@+6F<BG;% XHI_1ET]%,\<="-0B*)!:[O6&-)01
M"<=TNK]6,/HTMSG2T8QU6.UID$^<Y>X(YU>QMA;"16UD3X&XQY3GW"741[6W
MMB7@^X\Z0AN\,#@P=IZ0$3=09:DVE4&#4T5T^GY7+")W8D8MU=);6!24U*QC
MXH.(]Q4FYA@'S0DP43QRG%=\$@#X*37KK?=8]:T5KVQIYU6DWD[Z;(0D0FB$
M"?"]1I[TGA?7`1M9AR=@N(Z/"#.,!VLE`A3R]=&\$DJ'(7D[/OW_457 [<)U
MQD A$FJKM.Z'Z+8X4'@&ST#$!BX]$<J^E@\]#4+V,X+U='MOZ^G^?\>/X\=0
M?.!PD#;#C$./MFU4FT+4(D3;7+>&\,P7TDI$CCW5X2)(C!/2-+.>VLZ76SG9
M8DFM5A\KLK74+E??$M?FQOAXB;WQ(W/-8/;L#]H70-5L6'W>&2:)?,(@- >8
MYPZ(7X7F*+%X_(A#) `D#*"?#Y0S+W$/1=T-$ @Q_at_4OM^W<06_at_H)370[LT_at_6
MX.,G[,1!!.R.0&!(".&9E%A52%,)@NKR9&R 92X%ERI+L0HD*"Y2+%2E9,R)
M10F]90.R=\EN/;8=QF :P- &:,_&V.G2$2B?\,QD88E)D*%E.D)S"966GKO6
ML)I2=PF.F,$_30O0":B"7YK(_Y!..%0XP..92-_ Z<BW#W(7&4E4K50:&J!$
M.EW<48S#I[; AQ+(T6_at_T!P8D(*]M_at_I"92@*@\("ZE-))G,!*2&(7F$\%#\OX
MOC?B*<;J+@]0D/%]+>Q\(0^6X2?AV9 +^TP!>T$30"T"T:A#YOH^?V/N<UOU
MOKV:U"&L!?A^OW+HQ[YK^3XO#93#[/X>3?EN8S3;N%HQ&(!)`X0`E%.@]02>
M3)^Y0QHN\TD$WJH049!+VH O,==@MT.>SX>A0?!*E^):IR1TFC#UR8@$>Q.!
M:S,Q]5D&QOP^+FZZ>;]X=+71UIA&NJ['&3UOB["M.HJV#5K7,-SF5,X[@ZG8
M[@_237;]`7.-=3:>M5R(UASO,BRQ!55PU0'A$6 \N4ST_at_1^L!Q1W_7!#&[WZ
MSU*BT"IR/HT09&.H$Z<2E$>4/$0;!LK1M"@FQTA .:ZZKX8ZI$<BZ@#2.1Q-
METQ"1L,VJHB EJ-IO5,ICF-!MC.$@R"69BT71J+%9#&D#F8>9OXU+Q-D_at_G::
MERZRBG,%XV$56JM>$$8MA=6&]@Y:P;:9;7%;QBQ>]YG#F]K62,7Q+@M.U1>[
MS%EME%Z,!B3%6E"S96D2C^->] D\-(-B2B,X,Q_at_Y;Z)UFYFG<WOOFV,$3.VM
MMXO%K1-Q#F6=BP+J"UIG6H&N"MJ5]7R_BVY'S&#X!8R^EN(*HBKM^W\$"=@[
M^;S17Y/6>'7AJT->S"0)@@)@I2)"*L/+[L/T9:,W)V' K(]VCSWE8WJY%B8$
M22&-J+E4>/>)A@^<,QCS&/X$NQDLS1:T?#KA3M )<NBB>+!I!@T&F(Z&_(3,
M'8DDIV0YU.F:"(AF`GI XT*4S$1H#,MHFPQ30 8'=FA.0R3B5(X31R[JD"/]
M64$A,D!N)BFF)"_TM;=L^3/QR10Y(B"M]#+2SPDEX"1@^V U.^>CO^_9?^KG
MF]%TXPQKM'O9B$+=_+@<?PS._SG?5 +@PX'%23)Y,0(/0Q;,1S>>COO5BF$`
M-ULX2*!HB\)"2J U#OW)M_at_B+S$$JXZKL0-HA6^ )YLXQ#LD-^W@^5OC%^'IB
M%/Y$F[U2.2#X6$;Y.8H,'N-Y%":"UY4\<0_at_EBYN$&A'ZW0A>3YF (6XQM(<G
M,Y11UQ"G>(?#V89*EL8_at_R05:1+UC3P(>H],T,>GW4:/L/.:.<][U7-9S[>GT
MGX/RG>ZF2!D^X^BBWKO.L7U;9X48D_at_H^$:*_S"P8L!"884*(M]L"ICM5G+"L
M[.(W@;)(("8C>(9)&;PW/$5\]G%!QK0O2RFA_at_E8M,F')!:6R&I4I=76$Q5(8
MHEQ9[%L\ZO?FXMJ20"TP2- @F%N9$S"^C,@/D(H?MSX$9#:1&]B4E0& DB,`
MNT!4(A%JJT)ZQ2@&7CONX4>$/IFV+8('RV"S&QUPVQVE2B_WJ)T^4N3EMQ_at_T
M\+K4-!L$T*_L^$0Z=.7[R9\D(:)>352 KU%W<[N*H(9WW:@.^_HDM9>NK4EE
MD-V/MQ^:?YVC<+7(V5MMK[NF)[^/=U]^TQ-Y5ZEFN>6S?(T4"=7:I58TB7\M
MPB0PK81X.2]O4\%4O)8<$.&&)1GD<>)-BVB!)D_at_2![]SRP3#V9%OJ.P0:?W]
M!<U!?.[@D8]-Q"-M`OU#-SGTQ2ZSW!V;BE 0WPHO/=DA)\0_!\X%A\:+W(?A
M??,5(:!+"!=7Z?J4T"9V;_((%?2AUC=P$P+)0N.2AF ?Q&(.A"?B-P+WE/3Z
M&GTQ/BAWAZ#@6*^<U/OH;^]'\45V>83_'(H:& EF-)!"QC6F2>V\A3&,F^&1
M_C,(_"P^GZC*!7:W1C"(;P@;89Q^)#T%>"4$#AFIXGIPGGN IXB P2T%Z&EC
MT' W!5;$<#![CL3)7_at_I =,&V>TT-PFD0*G-O"AC;,3H^[V^[+XT5*0YY:(U8
M8GH<F^B=N&PQPU1H,BJJJJJL_K^H>^!^X!\(YU(!Q;>(^H!3BI_HA>D#`7_at_F
M!]@2_ '@42D7$70-PS"S&R!@!R9 & XCP>5WF49&2#@&>:9)>XF+S(_"+WN^
MV>@N-#T$H:)'10CW"AU&F#M%,5+)WP.M"Z=-T;8`Y.&2- *0%H]XA?GLZ"!8
MI0\1NA[NW4;"'B[<#OVAUB=KAW%F*]:CLL[OC-C8![A"8>1'ODAV">--BT*"
MAZ_at_KU7PVL(>60"1^(::),)P\\[^CK46T1:L>1W(OY"N'+V'F-@)@7P0\.]#7
M<AHH1>K4P:T(,B>%6^3TH)R!@07(0F&XE :4$-G A9I5%@<J$.:BI73ZR24<
MDL_at_U%5))*12<S"J\3K:DO^+LT%DMC>BA,/&P+UP<:@LKH."<-DJ$=.48)1GA
M!N2$7>E4CSEBPY00Z8^NAP^#*:RA?!!V(F0)J=2$61%D3)-%@;K2G+. 0DW'
M3^D%M:,@8]J'\[X\_N'VFO2/E!(C`R]*`KWAS&!1X%\C<!TH"O8B9N,$I$Y>
MOP"@^7G*#+<H^C8#V!N'YA3)`R5_at_1?G4?.KHN@):(:7PB[%?*!<0-H1*(-Y#
MJ+"$0)T#63,)`4%#B84IIA&-D( YKW30D$(HX#Y>8-O!"AN.(/7/6 U#LK8F
MU"F*=;Q4;XH8HYB64+(<HD&"`F(H5!!L+JA-_at_E&JGT_-@? >+8%-6-C3%K+#
MS$!785+N$/!)AZ,Z0(220D)W=!H''"F6_0/!/Q?3-7J(8<!I&+18H-C!W$"$
M2'JFCN3;C!VPCHD)E:81^GZB+U#Z47B!: =(NT#2EWJX2*&C!(%T*'0#^P/K
M<BG8(3*J>A8;J5(G-H!(D 6D"[2B<KL/G_at_G4^"R%!S$]T?]472.I.2R>&]]I
M/'%-@^)0_DP7-"ZF(-;@+"!=#>%.EH2D`N:$>$G10>9 BD_at_ET9DEA@!1FBU3
M]W)0B'ZFCG%P72P"8"FC=UM;2&)[IG#N'U \J'A%,D-_!7L#(#(#J@'KP7V9
M\GX+^U\VC^7Z_[?9YI56'TU]+Y)>C]?DA^GR_Z?I]1'^6_DSRW?@TX?+_9^K
M4O]_O_'*FW[?O?7K^>[ELY9X]9C5<Z^IQBV$Y.YWJ0@'.WIQ_(U>:IVAZ5X+
MG-,13*%$-LHB9/SNGT%%OX)RS8S^J-LLZR9,JBV"C(VVW($0X' U^P=RQ9NM
M;SM.B+R[=G3]MY.S\5#[C]W[]5#]O[;P_9AC[^/D7WX9(!3 3+$3%^43[N6E
MN_=<1R6X/R(M#\3H,F4Z_at_V#R"%F[@54A*DA(U4-F5G,U4HX#!R_at_F#$38-PS]
M*FC0"WR(E E#*>4C\H??$N YIR(4\N E(AK8ZTHA(!0V<RX>K^YZJEK6*+'D
MGZQT"/Y$>X[_1Z3_!ZE/]PGT_SJHI_at_Y/O<&/8IB]`A8'8;EA^SA#*)(&89&:
M%_at_O<:HCD_H_!K;"F`USFW6)OJ&!DA @;Q[(:U%9UC.0+,6J2S3)/R'8:;-<!
M,&R-\4446CM)[ CD7:-_at_1 VO*!2X#@&8%F 4N#)C<VH60(:1D0S,TI@%.-AG
M4F!#"5%D3-C;*0T4A5-&L8)1&Q@["P!GL_(B8\7$2H-C42R1Q$N801D6E:P`
MV)"P#(2*$)FD*UE!#-H%EG=M2!LAH0H3P95Z7&LR,12C)%R**JHF:1P@,B*
MG:^N=AWER8W*32&L_-!<?ZH/QR1$.DB&EK(]^P!@07MA_<@S`Q*'#!#"("&1
M[L=&@,D8DDI&PL&H*8&I_at_DR"E<80IR *)D#(H2(F))%!D$'=-@)W0R0`^!T0
M71\8=Y^R?S=L.^;P>J"BFM=[)[05"'60DJ4[?-_at_A?RX&X,#Z<&R1#\06-Z&F
MBG89]9U@#JE00H!##68'JA0"`Z_at_8E[!M03KI/@H03XI^GQE=!,]].(D"XRZ0
M2[AHN=/[?MMT/?8[3),3H0$`M/NZ5N2A%;)"/I3$," _I,^)XG2;!42+$ .(
M_M>BGH0UY A1.!<`I"<6_at_A10-$!#LHJRJ5!3>#VY)8*A#(HYQ=L5!*4S#466
MPF:#ZJJ8T":8.HX<']HO1+G=3:# 6%<E546%I:J\&!:QY%E,\B^&X=&H=IQ!
M>&SO*50EY'U ._<<1:(KFP2 V]&0);[CK*+Y(G;"020&$$5_at_07/GR_G0SBP?
MWH:B<B&:<O8=]!W2T S#G]'N$L;6X'=^K [0HI7:HO(>YT9%S]TKM*H^B%B%
MB8L<)MYZ0H7]1AT<$7*&4 *GR,+8HL?!L=&2H/J==,BDBA EZ/$6;6%:2*DR
M\X5I]\X>"6_at_T@FW2R0(6+P"]7^Z$$<0MYB1#$D4^TL4C,IOB`/Q'O ,PYO(Y
MRC)36CF0V_at_73='B1\5%,!AEYL2VQB,_+*.AE8E% #8[L880H5=CR$?=9():
M1($@BDB*CK!$OCXW(-+F!FH&I#7U$(^O&4%535 )24+D#D<\%<P'O;Q.L#IL
M@;8N!09*GZ_[>, _7^ACH_[?_/V__/Z.C[/UT/N4;[ONL^[]C5F <!F$<6&0
MR$D>HDA\IH#WY!^24<)$I ^;'Z0GWWM_at_B!2*P&(@GI(!\#8C<6'C\Y_at_7(U#G
M.'L31$^,UCH*X$6T)&T**&1JI$H%(,!*KW4H6BW <LT<4,&['#"@?JD%`!V\
MPGC<$?[-IUTG)H'@UI232:B9?LFO"R++*FOAJQK4J41YH<B", ]W/UV%N-L^
M&T;#C*"FB-,:`^I?284F8G<@IBJI38$,.*(<27JQ942(/Y#R&FB$%F'K%(%#
M<P`S3F71W<8ZA8#B5XE/DD#1;KC,E3G0)4 9'E4*ZCF-E@=MB1G0B4250T$Y
M"Y&2-59C`E_at_8D2HA!F3ZRN98J4!F8:&0P0,45T&#5,I@%*DE9!GS] +V9AL-
MB):8`@ERA:24E2+4`@)UY#$Q_at_AA2KMLAJ*<.R0PM%9JUK"$LUK$'6+C_at_F8I@
MIE1CO 'C\,=NE>&,5H29`Q6R* PQ:P"RSC/QK0[QPGVU2P+B#-N&&*X43 <F
MW:G4-@'52Z>!M/R_6AF!N_at_AO>5%3OSX%E+%%\(45:PY(B 8VO,?BY$=.F9$1
M(1T))0-_at_1A $Y>S--.H*:_[40)&1/FC1VD-_C4&,8-MMF^X9NJ/>_<,OT1$=
M4#ZJ<I#5KF$LO>$$[_.%'&"%T#50HM"T/]LWRP0\HMY>)@FA4*:2$)E&@?_?
ME;'KQ9#@\"<T!#N%\>=YH9F"PTA1&"D><U-Q1NO)")S52F3K`U0_M_at_NIZ,D`
MP)YQ#>>;.CQ[M434E53.ST<<@L^]"<_4PTC?95G:PE#B-0IO:?;>TF''XW3V
ME7#V1#J0/Y_Q%[[!8,MUM5$YP_at_D*:.$)(_#Q16#0&LS,`S0F4<<8.L32FZ)0
MBDV0,\E"-ZDXY,Z AJPT(EBY<H*X'+) %=@DHW.5[W?\N07"#216!&_027.3
M%VAWZ5<$F_NOU3YY,95)(S3.FW7-NYH&@PW'" RUD:;92PPL8"X%QG+J%A,P
M([MBA&W)!N8M>^ WVV_at_.0B]II/?K*5Q[_7I908SM3PH2YME_at_1;#U8S(\UQ7.
M3?>#FN>,"[^IP#-=.#8>_34YM"V.<$,Q&L4;)I/.PS; H"_7!P%0*9Y%' \=
M(YT&N2.=CB=6%P8(YF'<JR1S=AD)MD..BWF5>X-$M)&^W+N,#+*4S;6"S(.M
M9F=U;!!SB5"^)0XCD%13)IJ]ACV<07O>-IM<BB!Z9(X<:YH.HB_at_K8B($:WQ.
M*B7G9YG+,SN+"'#B'N0[CN(^`'7EN*V(9IILS>)J"-H)M!1I-%2VTL0,330=
M.X5UU_at_Z*) =(#N4EJ.K1*<L#<+:G%X14T:6)!O0S" :+ML. G&ZF!O_at_C@Y,V
M!1P1J4.D#$(:EW(>*P2FPP32!V*=Y&X(JJJBQ#JIXEA!U#J<H;4#"0N#30.0
M0R!P4_at_H5A## #4ME>A+[^93B\FX$W0L;_64)Q"V6$#-=%Y7-V'3]]FYB!KA$
M( #F4!7V!D1?BT8G1E7N/L/@X[SVLTF6$;$[-#;TP529*2G)P()S"(H,T%Y+
M,<I,/R_at_862RN6%YFP@=6I"S\IIB&F<HFG]2.CK,C4@!%GIBM/#"R)>*,NT'0
MAJ2R;")-^S=B!;:<@&L/28"VD$W"F:![/6?A=@QX9GF[`\_&@8814,WV>S4X
M<W.1LQ"&95Q$3Q-D)!).@\&_,PYEY( 6?!Z0-OAV/>&=-;82PNPLIO208*P2
M+;"3%BN@/ ><R@@=0WX&P/ B"V??H?O/O4D'IMQS\80;1<I746U/MSKYS3,@
MGNN C8>G#0\[$4T$03)"$C)$(.BADV +-P.X=P>#`8PBIO,C(3[Q,;>X.LPY
M;Y+%D<K,OH!Q( 0QP&Q@/%)C"D=FH!P*<9[H(E!9LELZ;S8U&/-<9*8QJUKZ
MJW="@W1Q#<H')GC:K/AJX1';2# AK]P(]J %]SC6"E) (#;)BP!"1M2M4*O6
M@:H`8J'QF B!K$L;[4[G3455UQ"1.!PU9;]'*U2E(FFUOA/,4?'!\_M]<6P.
MQ#RSECWEOG98_at_F\6ZY9FH89"+&B-_R9KC(X`T$0=F\ G1HQR7W0/A]QL`"$(
MC/XLU!JBXX4,$&I@%+(4JE#+1"N',%43:XUJ7T6V*DT.%AGD`<'V( ["D,@#
MX;+B1LVSJ'C7[&#:CG YQZ[*9"# ]4">V?PE/VX:'I?H,T<TZ# 'J,*4_R_at_H
MVM<.D[\3,+6+J1CD4)M#G!*N0G0U!@0DA&"8)=PFEZLD@]4)34">G:X$43$$
M0AI)H4-Z,B*J(D%.=+'B'JC2.C#E`.P7M'"=JTBG"]TN)6DRMU9Z2^8%$\7=
M&:X)MLU F!F(R%R!I!CL,,S ;LETJGS080#^?1(TU2)P2":4S]$(UKTP!AS(
M6!F."8./G@`_FBDH0W8=IP1=G$8JQ*F(17S0)WH"R!N$/-Y2,1!$5$0T$2R0
M%)4I- 'U4 XZ(?@<^I/ W!?6V=2#T0,$(8"J19?)H.Y'0GX.AUI#%<I2%HQ<
M$UH=2._at_5A4\\`+O%P+0KD"OI,E+<Z)7;0<(J2")NWPWDHFM%D2=7:V37]@=,
MC>:P3Y:$E<4)]%&\L%#C"G$#Z5^,^HB6`+&V0#R>,3B:J;9F&:,$\=X[P Z8
M= '3$($39"6_at_GY0SA1 Y\20]69!A)HA[SE'K/ P-?CW@;[$-U<07G0[H)R/A
M0(><W =5!\;=\&QT6XAC7K%"\0`_+VVX2;OF+ V(<=PI`AMIIJ"EN!7$.V_B
M<.OH+3NM6UA_at_272CQF =-^6(3]$UZROM<7A9AJ M*U"T30KU>0;%5QBNBQL!
MT8)>'+P8VOTXYKN*FT'?>B0L':["V9#J`GEE[@;)LGD7:M0%)D8HJB+ZP/D@
M[?1P#<&@!P2)%B6(:$XHGD2DA(4PD%"L)*/GA,A$SX%SJUG_at_Q#@(^5(PB0C&
M$(0(1BH5(0^#ZOO*GTO#OE*!F$A(&5(R"04[P5[QP(4MGWKWNO.!#>88'>_0
MP7R>JR=EFFJ6N4XP\!X^5'$3\S 22!(C! 1!"Q%4H2B2BT5!404)"-,"PJ13
M`(3 )$2(,5(@$B\?!X 3P@&3T(: 6A/LGB[ [#;5$J$D0G28A?:)!43,@=E@
MP]71L>R5S@'$@)N%=KR/'A805/0NR$AA09,CN5PD4UU/.C[T3TV1$6S2R"0-
M($+\`LE /7GJR1))"1"+!@O,''VE+Z=^_9O @A7PB 60,?PMTZT27"_CR46>
M7(ADMU*%::("I"09`T&D,T(X$X(2A# 0DB1,0L$D)"2_at_P]K.EVR 1 P,;=)1
MHO"*A\(B:G6>$KW2Q:C8((9A#@!J6*I2BCAQ08I$"04\\F2#3!!2W.(*8$W.
M`/F)`!9^A9 ZX+2+(B]"VM8+"Y:_E!49^0T'1FLL/C_9(P->E'N!$[E.L#(^
MK=P$^1GNUL[]ZD]"!T4")3T'`D.>0E0<#G3$R3)#1F&P(>(]2C6*= ,0)L"G
M%(!&!!> J'8_at_C0"ES5'CWGG-E3C5QM1MB_at_MEC% =#FRF=4$W51?RSN&_>>W1
M[QN*< ()SR0DY1/1K&1.4M?A#ISIYX=)'8:0/E@(AO(J;8$@8<=F*"H469,9
M"%"0$;0`VH2>49]6Z>9/,!P!:!+.F$#DAX>^5S-I?F)+\9[RR-)J<09$;TAZ
M#0>5].#I'##B3UG+489!`^K_at_8OQ7V)K)'+T@;C/2"*7<@61)8"POOG_SS42
M[HG$A;Y:`M:2@'8Z_at_B'97VP#>,4NT1#L,-PR'L]N:.62$K)"@(& 0-)1]2A1
MDBUA%$A$$JJ<XT%S\U7,??A?7,4,;8C0T$.S"&$[$(D)(0H:&,MF:90AA$2Y
M2&*)@#8"HEE"BUBDZJT:PTEA9+$.0?4]XTAJX*-*`A8R*T+(6F(X_at_8@MELUJ
M`06M_at_3ALT&@-`7/8>'500I4@?0++"12E+QNB)H(G:G!)S&U4=HKL"@*$F"C1
M8$@FY UA@ Z@=0X282F ?$!%06IX>TE-`,&"G+IY/!(.=@O(K,G=[^&&M*)$
M"BBBI H=06<D)U60]3M]7\?D*AHCCW?<,<J\![1F`"E6B:""*8BFU==2`6FU
MHC>P+3#<P1M^2_at_VCBYHGA/4$3HA(MBP4_at_0"*'V03Z._at_U'>)U)$=2-5O;6E2:
MF]:L@*0R)0I\G:155<KOT!AB&1D#69.!9.4!D!AE8%!(.14D88%$,88/#D$&
MH18@!H'688%+F/0G$MFXTJ.A(+2:!+:A2#% &C<%J#2!IQF)3@?6-!RB< \(
M/;ZWT00U@\Y+$"T$.^7^Y"BH8@,Q:PEL4&3'P^^@M^;/X+T\20;6/I-4==P+
M@/8+[/U7#)1.<Q"$D[&K-_at_34KF:E%/P^4-=A.#R1`R.8U@>SG92#UP(GM!%#
MJ ,22E B5>\S%*(D:\9$\BH7QO1Q%_at_F*T"V:0RW(Z,2(MQ5<V$@A%((I<Y5!
M0P/AZ:'(#R!'UX"\5*H8"#]4W\9K>0_Y4D7O1NL8GFE2$D3M!'1Z<1B"DZX*
M8K3SA-M2T+$>K$UH<9)#RL#DDQ&FF0"D03XI*3=,R2H>P$ #1%$>#9KJP3[2
M&7=X%"ZFS%1R!+(%(4*=B (<;)1U*2#UJ;DP][K$Y#8XJC[8;^7WS,-,!B3:
MJG. )6[QEW2"8">Q53I"A( $C4DJ`J<`MHBGB<*,4,+%(23=A*^(A\0='Y30
M'?O"D+Y[$5).")@ZP9);C/7O8$N+U=.DE_#!4^Z(]" 'G+I'=5,9)6J'8 (;
M03QF)[\%L7%&01$ORFZ `&8/L6 /U,A$PCN$-A!!#.(@F$)-E"0070=QIT">
MD3B$SCV3VEJI(2 1Y03P(?7$!=H)K6:>E"'%$U$WELH'<G1#J@=Q%C$N^P!D
MCYK&Z^@+(.S8%:],=2D^ZYOPE .CK +Q&C?*0_at_0)$(W0[()WO@$(0W KN>7H
M*5R&7$"0CPQ,ER,B@,!83+G-:;V,3>U"UI4T$K1(332NU)0PE(@YLE&:FD""
M!0M8*.$@4E!0X)B#A$&X`XUA$;A3CZV G)%1!P0#&880;A ,#BP&($A@<>5$
M'%5(!_SHRJ;^!.$^.; *;1P8$OL$T<K$@8!:1 RX$/4<T>D`3?H`;&*Z1&)%
M*JK!5I=?9IM^3OP$ZCT9B<L45MX4,D[-Z;$P[;YN%HB:49MR0,@NB<QST)8&
M$'!'AXNTM4'6"<$+'V*GN,P)R#W8X VH6#0_1O'7&)C#%JLP.)K4,?1:T\)D
ML'RS2\D4W*'.AN%;"YD$P_at_0(25R%&9'40?FADR$(YBJFWL\PGYT-X'^-#P*'
MW ![^.S9/')VN[*?`R43`*74(7H:(P$AZ55:@!I4PKR:B;.D\L0)Y!$W(&*5
M-D7R`AI7N!.%#O[PA* HBC$,QJHD:1]]4QR+69$CC%BE,EL**Z_at_W0+@6,*60
M@%O9'<A5-1V"V2]U&6&&X34UB;^&-*:^)$FNNI)-+D*84'Z730$IC&K1`4<'
M?59A-W"#ZXX"BF_at_V=WEW$/>6;*C[(.E[\X*-VMTY:M)+T_at_T.PYG>SY[8U_at_19
M!B"28C-LNC0BI5,;'EV;&P9.;45@=A%4D4TAS4E1_at_D$5-_at_9"`DF )RR'AEGT
M<[>7,^[DN@<_CRZSK?HNM4^E=>3<XL/:T[4L#.BK"1D384C *B0I,IH<"DB1
M#P787)00)3%RT%7[HJRLPM1,)A,11<O4I,?G"$P7;5&L\A*T*D=A"@C>"A2.
M#>1 S,D6@&)2! $(`L*MB?CX]22#S1>8-H8;=[BZ8)48^P)A6!X&]0<F"1F\
M.!-,M_at_F"U\BYL[%X)181R:1ONA#.)9 G>XJ]'4Y!)N[("DF&4\";!M(YF$#D
M0V(>P2DA("QB2 @VCXA^2E]4[&<V77NC58"8H':9-X%5Y612PM6(RK(`4 >&
M'G1B:*6$E65F)CZ^),B=02T(1Y QPB44!LAW&O$P=$ #8##@E%P":"P2&%*(
M$-$*1B#F`WRAH,SBR2TQF#M*V9F$YPA5% ! 2BP$)20$"CKC4;T8&21!% 3*
M<&W&'9&(2N,FR> 78;(.07X@[#Y0C$,P<ZK>.1_at_88J!3P]"S>FC=FX<(2$.6
MFI<HP%:;KMQ&@(=1'$<`:7$G8X/8Z'_,?Z*Z?S[2R9>[CQZ Y]4S8)MJ2H,8
M16";)3'KU?!:ZPP/7[Y39<\T*@+TP3=E+\<%>C= #=YXU!J'VM8$26L$R]8$
MTK07.TZKH'?Q<"KZ"XV((9]25051"BJE5%15JY*T65#9-BDN:\VKX1"]+JS@
M0FHUB!W^B#O=2)('"Q1;@;;(EB2,W%6A>%-4J*<P=>^*IW^:1!C;390B<-!#
MMZ5$9N/,X8VM0B$TP87;80)2T1O[ZMK>\@J,++A,8AGT<7+NDBB.3;5X=K*B
MIBG+3:<5H1,4QA*1'+08"2Y 7-XG+_4$61JW#E$9"YBB+26?"06JKP;7L$#E
MLEHHE#7&*K-U*#2"$)QA[IZM%&T!"EY&GU7#+::.N^-\!10AG?F]IDR2Q>9H
MDTC1!K1Q)@$;VD>$X3F&^>MKF(!TBY,-UB"0_at_9"##)*BUA%I%<8F.0=I"46H
M<,8X#8G&SO8D8BFVV$+ !(P$D#2A$H3 0$I0L!50\\& &F!"860"`"[+!(;L
M<UKH5'-LNK6&ITGV)- 1T-8[=C8U"3URAQ.Y2B0Z*0:CN$G&>YAPZ 8=4TX(
MR0%W.'<"DYT#``Z+R=KP#UJ:2IJIBH)DB8B(*8B(BAJ)AI((*JHHD:J((JFA
MD_at_I@ADBH(HB2(D"&4A:HJ()&)"2H>43N4?08(@=J=@@67S1]/3(6;:&!1^L0
M(HKFB6""!Z3O=@,B#VGB)@)A*/,T39(!`B,L%(WXIRVA+:"\@6:&;M9W=L&/
M9Q,&21,7%#,LJF4F-#^R>V%*-VYSV3N',0V04VD$>8A)#<)&`$C"@"R;%'%R
M&9'?!*0G]^NF]K27`JI+U5%ZQCPQ0;76!\D*$B;8714.1)?5E0^<DGPL@'N3
MI2!21T.V`F0!W8V<.S0!EHVL-YEUL1::VSJH4+0`FJD5"-"2MR/=\+1[2P+'
MO>]#-XD"&%W"HB&(G #)',<$RPD)&@<P#"7G#(21*E\PNH5:E:BBOEO Y#([
MHRP5`2D2F_at_I&:<HSH"] ;H&.3$9+0&60D8XK),D_at_I"%D(A_at_0B0PI,#DQ`48F
M1BTAF8YF5D9 X!"3+AV@`Z'"D2$"0+60SP2=XG!=0\E$'+:\A#,D(I"(IW>K
M`@)=2D.LUY(2!P@,XX:NF9%16%A%ZV&X4U(C\AZQAY"=<N/2J@?,"0X<^BD-
MR%[5+1).3BCE11$)HPH+,<;(:(L6Q"R$Q8##V9]HTX14;*#R4\CGW_at_Z3%J,(
MK49#2Q%T'V[484I1$21!(#1,5!'R3LT5+&W,-$0N9J _MZG!II"\(@"],DBQ
M_at_6LX@C@?<'8QPU_at_PD3W8=2H/:@CQB%(1$Q_at_A4%J)40B$$I$A\Y6F0NT^8-0T
M[@,"^! @1A&#!0A049CF"P^BLD.9./<G9V_at_KK%/TL&$"IQT4X5C9Z^D,54SY
M#[6"G*"5@ 2@[>HBJ!V_at_E_3,P^.=00`\8[-U`;?S&L32<>_$_^!?O7>V"2"2
M"3E1_at_G.&7*>-FWP.`,> #<;B&8)HQ"!L0YS(!G2Q"1.?'%QK`-'K!M54KM7@
M4%($%[\)"0(1!"P@<H]+W?UTH+C]S$6^4'0F"<L77V.<-'JIT"P+U=2B:G(9
ML'(KT*KGKEYPU">F<DA_at_5)" #GOLVBGB_at_L[(EB'A#5$"QH)E`6CC#. /FZH>
M/0\!FHBDC(P)""!&3QCPUC-\69Y%_at_63A"/E84J&16$C1$@<F!$U*2DY_at_0)YW
M*J<02DA_at_4,A -(Z$8$S<,G*$743+31-H(<EMZ5-OY:4LO$-FV[RL=XR4QIC<
M/)R";@#:,D#EE P4\PE4RPE =2 _0>WND /:":J<#QHL0XR0+U*8T4R'PN$8
M:&:#1Z3$T%1Z8[U>P<-D_at_DF3![B&(GN6P-"8"A(S&-HQ(ZIF,'(>F:P=_9A<
MA$R46*!BH2DA6% Q(:#X;C\OB*XP=5S)J2AQJ(GY?""1%422=2M:$7+2D#O=
M55)U>9<"N>0BXC7-P7 E:0MR:$@@4^TA"IM=AH-E;0++$$=P%WD[H&@H`]!%
MD$S #&O:^H1<Q'TH>:"P8$@U`: I5/<E`A?F_at_A^MM.) .'<'#MJJQ"%]JX_at_7
M?^ 940&D(XH?\)X&!,G$Z21UYV40<P& L81BY#8SD4054L<<ZSD-ZW.$)#P#
G_M();$XPW(/$NR -3,<[-[+DX0^#7T1W9B(G_\7<D4X4)#,[?%Z
`
end


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk