To get around the limit, I'm splitting one of the attachments out from
the original note: the original note follows below, with the status
tracker diff file; the complete diff file will come separately (chances
are you don't need it and that the note below will be enough).
pww
>----------
>From: Peter Whittaker
>Sent: Tuesday, October 22, 1996 12:17 PM
>To: 'The LDAP Mailing List'
>Cc: 'LDAP Bugs at Umich'; 'LDAP Support at UMich'
>Subject: (Long) Fix to ldapd's modify.c: merge modify changes with current
>entry prior to making modification.
>
>I apologize for sending this to the mailing list, the bug address, and the
>support address, as this is a bug/support issue, but I'm unsure whether the
>bug and support addresses are monitored now that Tim, et. al., have left for
>other pastures, and, given the uncertain fate of future releases from UMich
>(at least last I read, it was uncertain), I thought most readers of the list,
>who probably represent a fair portion of the UMich user base, would be
>interested in this problem and fix.
>
>The attached files are explained below. Please bear with this note, it is
>long, but worthwhile (AFAIK, IMHO, YMMV :->).
>
>Enough with the rationalizing, what's the problem, why I have included this
>fix, and what does it do?
>
>If one performs an LDAP modify operation on an entry, and attempts to add and
>delete values of an attribute, the operation's success depends on the order
>in which the add and delete components are specified; this seemed wrong to
>me, so I fixed it.
>
>To explain by example: assume you wish to change a single value of an
>attribute that may have multiple values, and that be updated by multiple
>authorities, i.e., you wish to replace a particular value of an attribute,
>not all values, in order to avoid trampling values written in by other
>applications. (If you didn't care about others, you'd use MOD_REPLACE and
>there would be no problem (so long as you have the modification order fix to
>replace_mod() that I submitted quite some time ago, see below for more on
>this, it's also DSA dependent).)
>
>Let's say you want to replace "foo=pub" with "foo=bar", "foo=pub" exists, and
>"foo=bar" does not.
>
>When constructing your request, you could do it as either
>
> Type: foo
> Add value: bar
> Type foo
> Delete value: pub
>
>or
>
> Type: foo
> Delete value: pub
> Type: foo
> Add value: bar
>
>If the attribute has multiple values, either formulation will work. If the
>attribute has only one value, the second formulation may work or may fail (it
>depends on the type of DSA being used), while the first will always succeed
>but fail to do what you want it to (more on this below).
>
>Why? Because the UMich ldapd reads the entry, and compares what you want to
>do with what it read as it builds the DAP request; unfortunately, it forgets
>what you have already asked it to do.
>
>In other words, it reads the first formulation and says:
>
> Read the entry
>
> Add the value "bar" to attribute foo: at the time of the read, foo existed,
> so this is an AddAttributeValue operation
>
> Delete the value "pub": at the time of the read, pub was foo's only value,
> so delete foo.
>
>In other words, ldapd adds the value you wanted, then deletes the attribute.
>Not good.
>
>In the case of the second formulation, it does the following:
>
> Read the entry
>
> Delete the value "pub": at the time of the read, pub was foo's only value,
> so delete foo.
>
> Add the value "bar" to attribute foo: at the time of the read, foo existed,
> so this is an AddAttributeValue operation
>
>While this looks the same, the result depends on the DSA involved: a QUIPU
>DSA will do what you wanted, but other DSAs may reject the AddAttributeValue
>operation with a "No such attribute" error. The reason is that by the time
>the AddAttributeValue operation hits the DSA, the attribute no longer exists:
> since X.500 insists that an attribute must exist in order for an
>AddAttributeValue operation to succeed, a purely conformant DSA will reject
>that operation; QUIPU, in its non-pedantic mode, will helpfully assume that
>what you wanted to do was have an attribute with (at least) that value, so it
>goes ahead and creates the attribute if it doesn't exist.
>
>OK. Enough of that. The question is, should the order of AddValue and
>DeleteValue matter to ldapd? I don't think so. So added code to track the
>status of any particular attribute, and, when adding or deleting values to
>that attribute, reference the status of the attribute, as modified by
>previous components of the current operation, as part of deciding exactly
>what kind of mod to make to the entry
>
>The basic algorithm is this:
>
> Prior to reading the list of modifications, initialize the status tracker
> For every attribute listed in the modify request, add the
> attribute to the tracker
> When deciding whether to delete a value or delete the
> attribute, or add a value or add the attribute, check if
> previous operations will have left the attribute with or
> without values; based on this, make the current operation
> a delete value, delete attribute, add value, or add attribute,
> as appropriate.
> Once the modification request has been read, or if errors have been
> encountered, destroy the status tracker prior to returning.
>
>Note that adding an attribute to the status tracker is idempotent: if it's
>not there, it's added, if it is there, OK.
>
>Once more, an apology: for various reasons, I currently use the 3.1
>distribution from UMich (it's stable, it works in the field, if it ain't
>broke, don't fix it); thus, my version of modify.c won't line up exactly
>with yours, and it contains some of my editorial comments that accompanied
>previous fixes, which were wisely deleted by the kind folks at UMich prior to
>inclusion in 3.2 or 3.3 (whichever one they made it into).
>
>The file modify.c.statTracker.diffs contains a context-diff between my
>current version of modify.c and the one that did not contain the status
>tracker code; I've included it as it is the simplest way for someone else to
>figure out what I added and what I changed: line numbers won't line up, but
>you'll get the idea.
>
>The file modify.c.diffs contains all diffs between my current modify.c and
>the original UMich 3.1 modify.c.
>
>These include:
>
> The status tracker diffs.
>
> Better attribute value comparisons when values are large, and the Attr_.*()
> routines think that the values are stored in files instead of in memory.
>
> Changed order of add values and delete values in replace_mod() to work with
> conformant DSAs.
>
>To explain that latter point: the UMich 3.1 ldapd would order operations in
>replace_mod() as delete values first, then add values; this worked fine
>against QUIPU, but was rejected by conformant DSAs, as the add value
>operations specified non-existent attributes, as the attributes had been
>deleted by the delete value operations (deletion of the last value deletes
>the attribute). My change is to add the new values first, which will work,
>then to delete the old values.
>
>pww
>
>
>
>Peter Whittaker [~~~~~~~~~~~~~~~~~~~~~~] X.500 Specialist
>pww@entrust.com [http://www.entrust.com] Nortel Secure Networks
>Ph: +1 613 765 2064 [ ] P.O. Box 3511, Station C
>FAX:+1 613 765 3520 [______________________] Ottawa, Canada, K1Y 4H7
>
>
begin 600 modify.c.statTracker.diffs
M*BHJ(&UO9&EF>2YC+D5N="TR+C$)5'5E($UA>2 R,2 Q-3HP-SHQ,R Q.3DV
M"BTM+2!M;V1I9GDN8PE-;VX@3V-T(" W(#$U.C Q.C Y(#$Y.38**BHJ*BHJ
M*BHJ*BHJ*BHJ"BHJ*B R-2PS," J*BHJ"BTM+2 R-2PU.2 M+2TM"B @(VEN
M8VQU9&4@(FQD87 N:"(*(" C:6YC;'5D92 B8V]M;6]N+F@B"B @"BL@+RH@
M5')A8VMI;F<@=VAA="!A;B!E;G1R>2!W:6QL(&QO;VL@;&EK92!A9G1E<B!A
M;B!O<&5R871I;VX@8V]M<&QE=&5S("HO"BL@='EP961E9B!I;G0)0D]/3$5!
M3CL**R C9&5F:6YE($9!3%-%"3 **R C9&5F:6YE(%12544),0HK( HK('1Y
M<&5D968@<W1R=6-T('-T8714<F%C:V5R('L**R @(" @071T<FEB=71E5'EP
M90E!='1R5&]4<F%C:SL**R @(" @0D]/3$5!3@D)2&%S5F%L=65S.PHK(" @
M("!"3T],14%."0E$96QE=&5D.PHK(" @("!S=')U8W0@<W1A=%1R86-K97()
M*E-T871.97AT.PHK( HK('T@<W1A=%1R86-K97(L("I3=&%T5')A8VME<CL*
M*R **R C9&5F:6YE(%-T871.=6QL("A3=&%T5')A8VME<BD@3E5,3 HK( HK
M(%-T8714<F%C:V5R"5-T871(96%D(#T@4W1A=$YU;&P["BL@4W1A=%1R86-K
M97()4W1A=%1A:6P@/2!3=&%T3G5L;#L**R **R!3=&%T5')A8VME<@ES=&%T
M5')A8VM);FET:6%L:7IE*"D["BL@=F]I9 D)<W1A=%1R86-K1&5S=')O>2@I
M.PHK(%-T8714<F%C:V5R"7-T8714<F%C:TEN<V5R="@I.PHK('9O:60)"7-T
M8714<F%C:T%D9"@I.PHK("\J(&YE8V5S<V%R>3\**R!V;VED"0ES=&%T5')A
M8VM!9&1686QU97,H*3L**R J+PHK('9O:60)"7-T8714<F%C:T1E;&5T92@I
M.PHK($)/3TQ%04X)"7-T8714<F%C:TAA<U9A;'5E<R@I.PHK($)/3TQ%04X)
M"7-T8714<F%C:T1E;&5T960H*3L**R!3=&%T5')A8VME<@ES=&%T5')A8VM&
M:6YD*"D["B @<W1A=&EC($-O;6UO;D%R9W,)8V]M;6]N(#T@9&5F875L=%]C
M;VUM;VY?87)G<SL*(" *("!E>'1E<FX@<VAO<G0);&1A<%]P:&]T;U]S>6YT
M87@["BHJ*BHJ*BHJ*BHJ*BHJ*@HJ*BH@,34W+#$V,B J*BHJ"BTM+2 Q.#8L
M,C P("TM+2T*(" *(" )1&5B=6<H($Q$05!?1$5"54=?5%)!0T4L(")D;U]M
M;V1I9GDR7&XB+" P+" P+" P("D["B @"BL@"2\J"BL@"2 @26YI=&EA;&EZ
M92!T:&4@<W1A='5S('1R86-K97(**R )*B\**R ):68@*"!.54Q,(#T]('-T
M8714<F%C:TEN:71I86QI>F4H*2 I('L**R )(" @('-E;F1?;&1A<%]M<V=R
M97-U;'0H(&-L:65N='-B+"!-3T1404<L(&TL"BL@"0E,1$%07T]015)!5$E/
M3E-?15)23U(L($Y53$PL(")#86YN;W0@:6YI=&EA;&EZ92!M;V0@=')A8VME
M<BXB("D["BL@"2 @("!R971U<FXH(# @*3L**R )?0HK( H@( EM82YM96%?
M8VAA;F=E<R ]($Y53$Q-3T0["B @"69O<B H(&UO9',@/2!M+3YM7VUO9',[
M(&UO9',@(3T@3E5,3#L@;6]D<R ](&UO9',M/FUO9%]N97AT("D@>PH@( D)
M<W1R=6-T(&5N=')Y;6]D"2IE;3L**BHJ*BHJ*BHJ*BHJ*BHJ"BHJ*B Q-C8L
M,3@P("HJ*BH*(" )"2 @("!S:7IE;V8H<W1R=6-T(&5N=')Y;6]D*2 I*2 ]
M/2!.54Q,34]$("D@>PH@( D)"7-E;F1?;&1A<%]M<V=R97-U;'0H(&-L:65N
M='-B+"!-3T1404<L(&TL"B @"0D)(" @($Q$05!?3U!%4D%424].4U]%4E)/
M4BP@3E5,3"P@(DUA;&QO8R!E<G)O<B(@*3L*(" )"0ER971U<FXH(# @*3L*
M(" )"7T*(" )"65M+3YE;5]N97AT(#T@3E5,3$U/1#L*(" *(" )"6EF("@@
M*&YE=R ](&=E=%]A<R@@8VQI96YT<V(L($U/1%1!1RP@;2P*(2 )"2 @("!M
M;V1S+3YM;V1?='EP92P@;6]D<RT^;6]D7V)V86QU97,@*2D@/3T@3E5,3$%4
M5%(@*0H@( D)"7)E='5R;B@@," I.PH@( D)96TM/F5M7W=H870@/2!N97<[
M"B @"B @"0EF;W(@*"!A<R ](')R+3YR9')?96YT<GDN96YT7V%T='([(&%S
M("$]($Y53$Q!5%12.PH@( D)(" @(&%S(#T@87,M/F%T=')?;&EN:R I('L*
M(" )"0EI9B H($%T=')47V-M<"@@;F5W+3YA='1R7W1Y<&4L(&%S+3YA='1R
M7W1Y<&4@*2 ]/2 P("D*+2TM(#(P-"PR,S,@+2TM+0H@( D)(" @('-I>F5O
M9BAS=')U8W0@96YT<GEM;V0I("DI(#T]($Y53$Q-3T0@*2!["B @"0D)<V5N
M9%]L9&%P7VUS9W)E<W5L="@@8VQI96YT<V(L($U/1%1!1RP@;2P*(" )"0D@
M(" @3$1!4%]/4$52051)3TY37T524D]2+"!.54Q,+" B36%L;&]C(&5R<F]R
M(B I.PHK( D)"7-T8714<F%C:T1E<W1R;WDH*3L*(" )"0ER971U<FXH(# @
M*3L*(" )"7T*(" )"65M+3YE;5]N97AT(#T@3E5,3$U/1#L*(" *(" )"6EF
M("@@*&YE=R ](&=E=%]A<R@@8VQI96YT<V(L($U/1%1!1RP@;2P*(2 )"2 @
M("!M;V1S+3YM;V1?='EP92P@;6]D<RT^;6]D7V)V86QU97,@*2D@/3T@3E5,
M3$%45%(@*2!["B$@"0D)<W1A=%1R86-K1&5S=')O>2@I.PH@( D)"7)E='5R
M;B@@," I.PHK( D)?0H@( D)96TM/F5M7W=H870@/2!N97<["B @"BL@"0DO
M*@HK( D)("!);G-E<G0@=&AI<R!A='1R:6)U=&4@:6YT;R!T:&4@=')A8VMI
M;F<@8VAA:6X["BL@"0D@(&]P97)A=&EO;B!I<R!I9&5M<&]T96YT.B @9&]I
M;F<@:70@82!S96-O;F0@=&EM90HK( D)("!H87,@;F\@969F96-T+"!C=7)R
M96YT('-T871U<R!I<R!P<F5S97)V960N"BL@"0DJ+PHK( D):68@*"!.54Q,
M(#T]('-T8714<F%C:TEN<V5R="AN97<M/F%T=')?='EP92D@*2!["BL@"0D@
M(" @<V5N9%]L9&%P7VUS9W)E<W5L="@@8VQI96YT<V(L($U/1%1!1RP@;2P*
M*R )"0E,1$%07T]015)!5$E/3E-?15)23U(L($Y53$PL"BL@"0D)(D-A;FYO
M="!U<&1A=&4@;6]D('1R86-K97(N(B I.PHK( D)(" @(')E='5R;B@@," I
M.PHK( D)?0HK( H@( D)9F]R("@@87,@/2!R<BT^<F1R7V5N=')Y+F5N=%]A
M='1R.R!A<R A/2!.54Q,05144CL*(" )"2 @("!A<R ](&%S+3YA='1R7VQI
M;FL@*2!["B @"0D):68@*"!!='1R5%]C;7 H(&YE=RT^871T<E]T>7!E+"!A
M<RT^871T<E]T>7!E("D@/3T@," I"BHJ*BHJ*BHJ*BHJ*BHJ*@HJ*BH@,3@U
M+#$Y," J*BHJ"BTM+2 R,S@L,C0T("TM+2T*(" )"2 @("!M;V1S+3YM;V1?
M;W @(3T@3$1!4%]-3T1?1$5,151%("D@>PH@( D)"7-E;F1?;&1A<%]M<V=R
M97-U;'0H(&-L:65N='-B+"!-3T1404<L(&TL"B @"0D)(" @($Q$05!?24Y6
M04Q)1%]364Y405@L($Y53$PL(").;R!V86QU97,@<W!E8VEF:65D(B I.PHK
M( D)"7-T8714<F%C:T1E<W1R;WDH*3L*(" )"0ER971U<FXH(# @*3L*(" )
M"7T*(" **BHJ*BHJ*BHJ*BHJ*BHJ"BHJ*B Q.3(L,C T("HJ*BH*(" )"6-A
M<V4@3$1!4%]-3T1?041$.@H@( D)"41E8G5G*"!,1$%07T1%0E5'7T%21U,L
M(")!1$0Z7&XB+" P+" P+" P("D["B @"B$@"0D):68@*"!A<R ]/2!.54Q,
M05144B I('L*(" )"0D)1&5B=6<H($Q$05!?1$5"54=?05)'4RP@(EQT871T
M<FEB=71E7&XB+" P+" P+ H@( D)"0D@(" @," I.PH@( D)"0EE;2T^96U?
M='EP92 ]($5-7T%$1$%45%))0E5413L*(" )"0E](&5L<V4@>PH@( D)"0E$
M96)U9R@@3$1!4%]$14)51U]!4D=3+" B7'1V86QU97-<;B(L(# L(# L(# @
M*3L*(" )"0D)96TM/F5M7W1Y<&4@/2!%35]!1$1604Q515,["B @"0D)?0H@
M( D)"6)R96%K.PH@( HM+2T@,C0V+#(W-" M+2TM"B @"0EC87-E($Q$05!?
M34]$7T%$1#H*(" )"0E$96)U9R@@3$1!4%]$14)51U]!4D=3+" B041$.EQN
M(BP@,"P@,"P@," I.PH@( HA( D)"6EF("@@87,@/3T@3E5,3$%45%(@)B8*
M(2 )"0D@(" @(7-T8714<F%C:TAA<U9A;'5E<RAN97<M/F%T=')?='EP92D@
M*2!["B$@"0D)(" @("\J"4EF(&ET(&ES;B=T(&EN('1H92!E;G1R>2!A;F0@
M=V4@:&%V96XG="!Y970*(2 )"0D)861D960@=F%L=65S+"!T:&5N(&%D9"!T
M:&4@871T<FEB=71E("HO"B @"0D)"41E8G5G*"!,1$%07T1%0E5'7T%21U,L
M(")<=&%T=')I8G5T95QN(BP@,"P@,"P*(" )"0D)(" @(# @*3L*(" )"0D)
M96TM/F5M7W1Y<&4@/2!%35]!1$1!5%1224)55$4["BL@"0D)"7-T8714<F%C
M:T%D9"AN97<M/F%T=')?='EP92D["B @"0D)?2!E;'-E('L**R )"0D@(" @
M+RH)5&AI<R!A='1R:6)U=&4@97AI<W1S(&EN('1H92!E;G1R>2P@8G5T('=H
M870**R )"0D):&%V92!W92!D;VYE('1O(&ET/R @268@=V4@9&5L971E9"!I
M="P@=&AE;@HK( D)"0ET:&ES(&)E8V]M97,@86X@861D(&%T=')I8G5T92!O
M<&5R871I;VX@*B\**R )"0D@(" @:68@*"!S=&%T5')A8VM$96QE=&5D*&YE
M=RT^871T<E]T>7!E*2 I('L**R )"0D)1&5B=6<H($Q$05!?1$5"54=?05)'
M4RP@(EQT871T<FEB=71E7&XB+" P+" P+ HK( D)"0D@(" @," I.PHK( D)
M"0EE;2T^96U?='EP92 ]($5-7T%$1$%45%))0E5413L**R )"0D)<W1A=%1R
M86-K061D*&YE=RT^871T<E]T>7!E*3L**R )"0D@(" @?2!E;'-E('L**R )
M"0D)+RH@3W1H97)W:7-E+"!W92!A<F4@861D:6YG(&UO<F4@=F%L=65S("HO
M"B @"0D)"41E8G5G*"!,1$%07T1%0E5'7T%21U,L(")<='9A;'5E<UQN(BP@
M,"P@,"P@," I.PH@( D)"0EE;2T^96U?='EP92 ]($5-7T%$1%9!3%5%4SL*
M*R )"0D)<W1A=%1R86-K061D*&YE=RT^871T<E]T>7!E*3L**R )"0D@(" @
M?0H@( D)"7T*(" )"0EB<F5A:SL*(" **BHJ*BHJ*BHJ*BHJ*BHJ"BHJ*B R
M,#4L,C,P("HJ*BH*(" )"6-A<V4@3$1!4%]-3T1?1$5,151%.@H@( D)"41E
M8G5G*"!,1$%07T1%0E5'7T%21U,L(")$14Q%5$4Z7&XB+" P+" P+" P("D[
M"B @"B$@"0D):68@*"!A<R ]/2!.54Q,05144B I('L*(" )"0D)1&5B=6<H
M($Q$05!?1$5"54=?05)'4RP@(EQT;F5X(&%T=')I8G5T95QN(BP@,"P*(" )
M"0D)(" @(# L(# @*3L*(" )"0D)<V5N9%]L9&%P7VUS9W)E<W5L="@@8VQI
M96YT<V(L($U/1%1!1RP*(" )"0D)(" @(&TL($Q$05!?3D]?4U5#2%]!5%12
M24)55$4L($Y53$PL("(B("D["B @"0D)"65M<U]F<F5E*"!E;2 I.PH@( D)
M"0ER971U<FXH(# @*3L*(" )"0E](&5L<V4@>PH@( D)"0EI9B H(&YE=RT^
M871T<E]V86QU92 ]/2!.54Q,058@*2!["B @"0D)"0E$96)U9R@@3$1!4%]$
M14)51U]!4D=3+" B7'1A='1R:6)U=&5<;B(L"B @"0D)"0D@(" @,"P@,"P@
M," I.PH@( D)"0D)96TM/F5M7W1Y<&4@/2!%35]214U/5D5!5%1224)55$4[
M"B @"0D)"7T@96QS92!["B @"0D)"0EI9B H(&%V<U]C;7 H(&YE=RT^871T
M<E]V86QU92P*(" )"0D)"2 @("!A<RT^871T<E]V86QU92 I(#T](# @*2![
M"B @"0D)"0D)1&5B=6<H($Q$05!?1$5"54=?05)'4RP*(" )"0D)"0D@(" @
M(EQT871T<FEB=71E7&XB+" P+" P+" P("D["B @"0D)"0D)96TM/F5M7W1Y
M<&4@/0H@( D)"0D)"2 @("!%35]214U/5D5!5%1224)55$4["B @"0D)"0E]
M(&5L<V4@>PH@( D)"0D)"41E8G5G*"!,1$%07T1%0E5'7T%21U,L"B @"0D)
M"0D)(" @(")<='9A;'5E<UQN(BP@,"P@,"P@," I.PH@( D)"0D)"65M+3YE
M;5]T>7!E(#T@14U?4D5-3U9%5D%,5453.PHM+2T@,C<U+#,T," M+2TM"B @
M"0EC87-E($Q$05!?34]$7T1%3$5413H*(" )"0E$96)U9R@@3$1!4%]$14)5
M1U]!4D=3+" B1$5,151%.EQN(BP@,"P@,"P@," I.PH@( HA( D)"6EF("@@
M87,@/3T@3E5,3$%45%(@)B8*(2 )"0D@(" @(7-T8714<F%C:TAA<U9A;'5E
M<RAN97<M/F%T=')?='EP92D@*2!["B$@"0D)"2\J("!4:&4@=7-E<B!W86YT
M<R!T;R!D96QE=&4@<V]M971H:6YG('1H870*(2 )"0D)(" @(&1O97-N)W0@
M97AI<W0@86YD('=O;B=T(&)E(&-R96%T960@8GD*(2 )"0D)(" @('1H:7,@
M;W!E<F%T:6]N.R @=&AA="=S(&%N(&5R<F]R("HO"B @"0D)"41E8G5G*"!,
M1$%07T1%0E5'7T%21U,L(")<=&YE>"!A='1R:6)U=&5<;B(L(# L"B @"0D)
M"2 @(" P+" P("D["B @"0D)"7-E;F1?;&1A<%]M<V=R97-U;'0H(&-L:65N
M='-B+"!-3T1404<L"B @"0D)"2 @("!M+"!,1$%07TY/7U-50TA?05144DE"
M551%+"!.54Q,+" B(B I.PH@( D)"0EE;7-?9G)E92@@96T@*3L**R )"0D)
M<W1A=%1R86-K1&5S=')O>2@I.PH@( D)"0ER971U<FXH(# @*3L*(" )"0E]
M(&5L<V4@>PH@( D)"0EI9B H(&YE=RT^871T<E]V86QU92 ]/2!.54Q,058@
M*2!["BL@"0D)"2 @(" O*@E4:&4@=7-E<B!W86YT<R!T;R!D96QE=&4@=&AE
M(&%T=')I8G5T93H**R )"0D)"6QE="!T:&5M.R @=&AI<R!I;F-L=61E<R!A
M;GD@=F%L=65S"BL@"0D)"0ET:&5Y(&%D9&5D('5P('1O('1H:7,@<&]I;G0@
M=VET:"!T:&ES"BL@"0D)"0EO<&5R871I;VXN("HO"B @"0D)"0E$96)U9R@@
M3$1!4%]$14)51U]!4D=3+" B7'1A='1R:6)U=&5<;B(L"B @"0D)"0D@(" @
M,"P@,"P@," I.PH@( D)"0D)96TM/F5M7W1Y<&4@/2!%35]214U/5D5!5%12
M24)55$4["BL@"0D)"0ES=&%T5')A8VM$96QE=&4H;F5W+3YA='1R7W1Y<&4I
M.PH@( D)"0E](&5L<V4@>PHK( D)"0D)+RH@(%1H92!U<V5R('=A;G1S('1O
M(&1E;&5T92!P87)T:6-U;&%R"BL@"0D)"0D@(" @=F%L=65S("HO"B @"0D)
M"0EI9B H(&%V<U]C;7 H(&YE=RT^871T<E]V86QU92P*(" )"0D)"2 @("!A
M<RT^871T<E]V86QU92 I(#T](# @*2!["BL@"0D)"0D@(" @+RH)5&AE('5S
M97(@:6YD:6-A=&5S('1H870@86QL"BL@"0D)"0D)97AI<W1I;F<@=F%L=65S
M('-H;W5L9"!B90HK( D)"0D)"61E;&5T960Z($EF('=E(&AA=F4@861D960*
M*R )"0D)"0EV86QU97,L('1H96X@9&5L971E(&]N;'D@=&AE"BL@"0D)"0D)
M<W!E8VEF:65D('9A;'5E<SL@(&]T:&5R=VES92P**R )"0D)"0EA;&QO=R!T
M:&4@96YT:7)E(&%T=')I8G5T90HK( D)"0D)"71O(&)E(&1E;&5T960N("HO
M"BL@"0D)"0D@(" @:68@*"!S=&%T5')A8VM(87-686QU97,H"BL@"0D)"0D)
M;F5W+3YA='1R7W1Y<&4I("D@>PH@( D)"0D)"41E8G5G*"!,1$%07T1%0E5'
M7T%21U,L"BL@"0D)"0D)(" @(")<='9A;'5E<UQN(BP@,"P@,"P@," I.PHK
M( D)"0D)"65M+3YE;5]T>7!E(#T@14U?4D5-3U9%5D%,5453.PHK( D)"0D)
M(" @('T@96QS92!["BL@"0D)"0D)1&5B=6<H($Q$05!?1$5"54=?05)'4RP*
M(" )"0D)"0D@(" @(EQT871T<FEB=71E7&XB+" P+" P+" P("D["B @"0D)
M"0D)96TM/F5M7W1Y<&4@/0H@( D)"0D)"2 @("!%35]214U/5D5!5%1224)5
M5$4["BL@"0D)"0D)<W1A=%1R86-K1&5L971E* HK( D)"0D)"2 @("!N97<M
M/F%T=')?='EP92D["BL@"0D)"0D@(" @?0H@( D)"0D)?2!E;'-E('L**R )
M"0D)"2 @(" O*@E$96QE=&4@=&AE(&EN9&EC871E9"!V86QU92X**R )"0D)
M"0E792!D;R!T:&4@8F5S="!W92!C86XL('=H:6-H"BL@"0D)"0D):7-N)W0@
M;75C:#H@('=E(&%S<W5M92!T:&%T"BL@"0D)"0D):&%D('1H92!U<V5R('=I
M<VAE9"!T;R!D96QE=&4**R )"0D)"0EA;&P@=F%L=65S+"!T:&5Y('=O=6QD
M(&AA=F4**R )"0D)"0ES<&5C:69I960@82!D96QE=&4@871T<FEB=71E"BL@
M"0D)"0D);W!E<F%T:6]N+"!O<B!A(&1E;&5T92!A;&P@"BL@"0D)"0D)=F%L
M=65S("T@=&AE(&]N92!A8F]V92X@(%1H97D**R )"0D)"0EC;W5L9"!N:6)B
M;&4@=&AE(&%T=')I8G5T92!O=70**R )"0D)"0EO9B!E>&ES=&5N8V4@;VYE
M('9A;'5E(&%T(&$@"BL@"0D)"0D)=&EM92P@8G5T('1H:7,@:7,@9&EF9FEC
M=6QT('1O"BL@"0D)"0D)=')A8VL@*B\*(" )"0D)"0E$96)U9R@@3$1!4%]$
M14)51U]!4D=3+ H@( D)"0D)"2 @(" B7'1V86QU97-<;B(L(# L(# L(# @
M*3L*(" )"0D)"0EE;2T^96U?='EP92 ]($5-7U)%34]6159!3%5%4SL**BHJ
M*BHJ*BHJ*BHJ*BHJ"BHJ*B R,S<L,C0Y("HJ*BH*(" )"0E$96)U9R@@3$1!
M4%]$14)51U]!4D=3+" B4D503$%#13I<;B(L(# L(# L(# @*3L*(" *(" )
M"0EI9B H(&%S(#T]($Y53$Q!5%12("D@>PHA( D)"0E$96)U9R@@3$1!4%]$
M14)51U]!4D=3+" B7'1A='1R:6)U=&5<;B(L(# L(# L"B$@"0D)"2 @(" P
M("D["B$@"0D)"65M+3YE;5]T>7!E(#T@14U?041$05144DE"551%.PH@( D)
M"7T@96QS92!["B @"0D)"6EF("@@<F5P;&%C95]M;V0H(&5M+"!A<RP@;F5W
M("D@/" P("D@>PH@( D)"0D)<F5T=7)N*" P("D["B @"0D)"7T*(" )"0E]
M"B @"0D)8G)E86L["B @"BTM+2 S-#<L,S<Y("TM+2T*(" )"0E$96)U9R@@
M3$1!4%]$14)51U]!4D=3+" B4D503$%#13I<;B(L(# L(# L(# @*3L*(" *
M(" )"0EI9B H(&%S(#T]($Y53$Q!5%12("D@>PHA( D)"2 @(" O*@E4:&ES
M(&%T=')I8G5T92!D;V5S(&YO="!E>&ES="!I;B!T:&4@96YT<GD["B$@"0D)
M"6AA=F4@=V4@861D960@:70_("HO"B$@"0D)"6EF("@@<W1A=%1R86-K2&%S
M5F%L=65S*&YE=RT^871T<E]T>7!E*2 I('L*(2 )"0D)(" @("\J(%EE<RP@
M=V4@:&%V92$*(2 )"0D)(" @($1E8G5G*"!,1$%07T1%0E5'7T%21U,L(")<
M='9A;'5E<UQN(BP*(2 )"0D)"3 L(# L(# @*3L*(2 )"0D)(" @(&5M+3YE
M;5]T>7!E(#T@14U?041$5D%,5453.PHA( D)"0D@(" @<W1A=%1R86-K061D
M*&YE=RT^871T<E]T>7!E*3L*(2 )"0D)?2!E;'-E('L*(2 )"0D)(" @("\J
M($YO+"!W92!H879E;B=T("HO"B$@"0D)"2 @("!$96)U9R@@3$1!4%]$14)5
M1U]!4D=3+" B7'1A='1R:6)U=&5<;B(L"B$@"0D)"0DP+" P+" P("D["B$@
M"0D)"2 @("!E;2T^96U?='EP92 ]($5-7T%$1$%45%))0E5413L*(2 )"0D)
M(" @('-T8714<F%C:T%D9"AN97<M/F%T=')?='EP92D["B$@"0D)"7T*(" )
M"0E](&5L<V4@>PHK( D)"2 @(" O*@E4:&ES(&%T=')I8G5T92!D;V5S(&5X
M:7-T(&EN('1H92!E;G1R>3L@<&5R9F]R;0HK( D)"0ET:&4@;W!T:6UI>F5D
M(')E<&QA8V4@<F]U=&EN92X@56YF;W)T=6YA=&5L>2P**R )"0D)=V4@8V%N
M)W0@<F5A;&QY(&1O(&UU8V@@;6]R92P@=6YL97-S('=E(&=E="!I;G1O"BL@
M"0D)"71H92!H96%R="!O9B!T:&ES(')O=71I;F4@86YD('1R86-K(&5X86-T
M;'D@=VAA= HK( D)"0EI="!D:60N("!3;R!W92!A<W-U;64@=&AA="!T:&4@
M=7-E<B!K;F]W<R!W:&%T"BL@"0D)"71H97D@=V%N="!T;R!D;RP@86YD('=E
M('1R86-K(&YO=&AI;F<N+BXN("HO"B @"0D)"6EF("@@<F5P;&%C95]M;V0H
M(&5M+"!A<RP@;F5W("D@/" P("D@>PHK( D)"0D)<W1A=%1R86-K1&5S=')O
M>2@I.PH@( D)"0D)<F5T=7)N*" P("D["B @"0D)"7T**R )"0D)+RH@<W1A
M=%1R86-K061D5F%L=65S*&YE=RT^871T<E]T>7!E*3LJ+PH@( D)"7T*(" )
M"0EB<F5A:SL*(" **BHJ*BHJ*BHJ*BHJ*BHJ"BHJ*B R-3(L,C4W("HJ*BH*
M+2TM(#,X,BPS.#@@+2TM+0H@( H@( D)"7-E;F1?;&1A<%]M<V=R97-U;'0H
M(&-L:65N='-B+"!-3T1404<L(&TL"B @"0D)(" @($Q$05!?4%)/5$]#3TQ?
M15)23U(L($Y53$PL("(B("D["BL@"0D)<W1A=%1R86-K1&5S=')O>2@I.PH@
M( D)"7)E='5R;B@@," I.PH@( D)"6)R96%K.PH@( D)?0HJ*BHJ*BHJ*BHJ
M*BHJ*BH**BHJ(#,S-RPS-#(@*BHJ*@HM+2T@-#8X+#0W-" M+2TM"B @"6EF
M("@@;6$N;65A7V-H86YG97,@/3T@3E5,3$U/1" I('L)+RH@;F]T:&EN9R!T
M;R!D;R J+PH@( D)<V5N9%]L9&%P7VUS9W)E<W5L="@@8VQI96YT<V(L($U/
M1%1!1RP@;2P*(" )"2 @("!,1$%07U-50T-%4U,L($Y53$PL("(B("D["BL@
M"0ES=&%T5')A8VM$97-T<F]Y*"D["B @"0ER971U<FXH(# @*3L*(" )?0H@
M( HJ*BHJ*BHJ*BHJ*BHJ*BH**BHJ(#,T.2PS-3<@*BHJ*@HM+2T@-#@Q+#0Y
M,2 M+2TM"B @"B @"6EF("@@<F,@(3T@," I('L*(" )"7-E;F1?;&1A<%]M
M<V=R97-U;'0H(&-L:65N='-B+"!-3T1404<L(&TL(')C+"!.54Q,+" B(B I
M.PHK( D)<W1A=%1R86-K1&5S=')O>2@I.PH@( D)<F5T=7)N*" P("D["B @
M"7T*(" **R )<W1A=%1R86-K1&5S=')O>2@I.PH@( ER971U<FXH(#$@*3L*
M("!]"B @"BHJ*BHJ*BHJ*BHJ*BHJ*@HJ*BH@-S,P+#<S,R J*BHJ"BTM+2 X
M-C0L,3 R," M+2TM"B @"7T*(" *(" )<F5T=7)N*" P("D["BL@?0HK( HK
M('-T871I8R!3=&%T5')A8VME<B!S=&%T5')A8VM);FET:6%L:7IE*"D**R![
M"BL@(" @($1E8G5G*"!,1$%07T1%0E5'7U1204-%+" B<W1A=%1R86-K26YI
M=&EA;&EZ95QN(BP@,"P@,"P@," I.PHK( HK(" @("!3=&%T2&5A9" ]("A3
M=&%T5')A8VME<BD@;6%L;&]C*'-I>F5O9BAS=')U8W0@<W1A=%1R86-K97(I
M*3L**R @(" @:68@*$Y53$P@/3T@4W1A=$AE860I('L**R )1&5B=6<H($Q$
M05!?1$5"54=?5%)!0T4L(")S=&%T5')A8VM);FET:6%L:7IE(&9A:6QE9%QN
M(BP@,"P@,"P@," I.PHK(" @("!]"BL@(" @(%-T871486EL(#T@4W1A=$AE
M860["BL@(" @(')E='5R;B!3=&%T2&5A9#L**R!]"BL@"BL@<W1A=&EC(%-T
M8714<F%C:V5R('-T8714<F%C:TEN<V5R="A!='1R5&]4<F%C:RD**R!!='1R
M:6)U=&54>7!E"4%T=')4;U1R86-K.PHK('L**R @(" @4W1A=%1R86-K97()
M<W1A=%=A;&ME<CL**R **R @(" @1&5B=6<H($Q$05!?1$5"54=?5%)!0T4L
M(")S=&%T5')A8VM);G-E<G1<;B(L(# L(# L(# @*3L**R **R @(" @+RH@
M8G5L;&5T('!R;V]F:6YG("HO"BL@(" @(&EF("@@3E5,3" ]/2!3=&%T2&5A
M9"!\?"!.54Q,(#T](%-T871486EL("D@>PHK( E$96)U9R@@3$1!4%]$14)5
M1U]44D%#12P@(G-T8714<F%C:TEN<V5R="!F86EL961<;B(L(# L(# L(# @
M*3L**R )<F5T=7)N(%-T871.=6QL.PHK(" @("!]"BL@"BL@(" @("\J($AA
M=F4@=V4@861D960@=&AI<R!O;F4@>65T/R J+PHK(" @("!S=&%T5V%L:V5R
M(#T@<W1A=%1R86-K1FEN9"A!='1R5&]4<F%C:RD["BL@(" @(&EF("@@3E5,
M3" ]/2!S=&%T5V%L:V5R("D@>PHK( DO*B!.;W!E.B @06QL;V-A=&4@82!N
M97<@4W1A=%1R86-K97(@*B\**R )<W1A=%=A;&ME<B ]("A3=&%T5')A8VME
M<BD@;6%L;&]C*'-I>F5O9BAS=')U8W0@<W1A=%1R86-K97(I*3L**R ):68@
M*"!.54Q,("$]('-T871786QK97(@*2!["BL@"2 @(" O*B!3;R!F87(@<V\@
M9V]O9"P@=7!D871E(&5V97)Y=&AI;F<@*B\**R )(" @('-T871786QK97(M
M/D%T=')4;U1R86-K(#T@071T<E1O5')A8VL["BL@"2 @("!S=&%T5V%L:V5R
M+3Y3=&%T3F5X=" ](%-T871.=6QL.PHK( D@(" @<W1A=%=A;&ME<BT^2&%S
M5F%L=65S(#T@1D%,4T4["BL@"2 @("!S=&%T5V%L:V5R+3Y$96QE=&5D(#T@
M1D%,4T4["BL@"2 @("!3=&%T5&%I;"T^4W1A=$YE>'0@/2!S=&%T5V%L:V5R
M.PHK( D@(" @1&5B=6<H($Q$05!?1$5"54=?5%)!0T4L(")S=&%T5')A8VM)
M;G-E<G0@<W5C8V5E9&5D7&XB+" P+" P+" P("D["BL@"7T@96QS92!["BL@
M"2 @("!$96)U9R@@3$1!4%]$14)51U]44D%#12P@(G-T8714<F%C:TEN<V5R
M="!F86EL961<;B(L(# L(# L(# @*3L**R )?0HK(" @("!]"BL@(" @("\J
M($YO(&UA='1E<B!W:&%T+"!T:&ES(&ES('1H92!R:6=H="!T:&EN9R!T;R!D
M;R J+PHK(" @("!R971U<FX@<W1A=%=A;&ME<CL**R!]"BL@"BL@<W1A=&EC
M('9O:60@<W1A=%1R86-K061D*$%T=')4;U1R86-K*0HK($%T=')I8G5T951Y
M<&4)071T<E1O5')A8VL["BL@>PHK(" @("!3=&%T5')A8VME<@ES=&%T5V%L
M:V5R.PHK( HK(" @("!$96)U9R@@3$1!4%]$14)51U]44D%#12P@(G-T8714
M<F%C:T%D9%QN(BP@,"P@,"P@," I.PHK( HK(" @("!S=&%T5V%L:V5R(#T@
M<W1A=%1R86-K1FEN9"A!='1R5&]4<F%C:RD["BL@(" @("\J(%1H:7,@:7,@
M=VAE<F4@22!R96%L;'D@=VES:"!T:&ES('=A<R!#*RL@*B\**R **R @(" @
M<W1A=%=A;&ME<BT^2&%S5F%L=65S(#T@5%)513L**R @(" @<W1A=%=A;&ME
M<BT^1&5L971E9" ]($9!3%-%.PHK('T**R **R C:68@, HK("\J(&YE8V5S
M<V%R>3\**R!S=&%T:6,@=F]I9"!S=&%T5')A8VM!9&1686QU97,H071T<E1O
M5')A8VLI"BL@071T<FEB=71E5'EP90E!='1R5&]4<F%C:SL**R!["BL@(" @
M(%-T8714<F%C:V5R"7-T871786QK97(["BL@"BL@(" @($1E8G5G*"!,1$%0
M7T1%0E5'7U1204-%+" B<W1A=%1R86-K061D5F%L=65S7&XB+" P+" P+" P
M("D["BL@"BL@(" @('-T871786QK97(@/2!S=&%T5')A8VM&:6YD*$%T=')4
M;U1R86-K*3L**R @(" @+RH@(%1H:7,@:7,@=VAE<F4@22!R96%L;'D@=VES
M:"!T:&ES('=A<R!#*RL@*B\**R **R @(" @<W1A=%=A;&ME<BT^2&%S5F%L
M=65S(#T@5%)513L**R!]"BL@*B\**R C96YD:68**R **R!S=&%T:6,@=F]I
M9"!S=&%T5')A8VM$96QE=&4H071T<E1O5')A8VLI"BL@071T<FEB=71E5'EP
M90E!='1R5&]4<F%C:SL**R!["BL@(" @(%-T8714<F%C:V5R"7-T871786QK
M97(["BL@"BL@(" @($1E8G5G*"!,1$%07T1%0E5'7U1204-%+" B<W1A=%1R
M86-K1&5L971E7&XB+" P+" P+" P("D["BL@"BL@(" @('-T871786QK97(@
M/2!S=&%T5')A8VM&:6YD*$%T=')4;U1R86-K*3L**R @(" @+RH@5&AI<R!I
M<R!W:&5R92!)(')E86QL>2!W:7-H('1H:7,@=V%S($,K*R J+PHK( HK(" @
M("!S=&%T5V%L:V5R+3Y(87-686QU97,@/2!&04Q313L**R @(" @<W1A=%=A
M;&ME<BT^1&5L971E9" ](%12544["BL@?0HK( HK('-T871I8R!"3T],14%.
M('-T8714<F%C:TAA<U9A;'5E<RA!='1R5&]4<F%C:RD**R!!='1R:6)U=&54
M>7!E"4%T=')4;U1R86-K.PHK('L**R @(" @4W1A=%1R86-K97()<W1A=%=A
M;&ME<CL**R **R @(" @1&5B=6<H($Q$05!?1$5"54=?5%)!0T4L(")S=&%T
M5')A8VM(87-686QU97-<;B(L(# L(# L(# @*3L**R **R @(" @<W1A=%=A
M;&ME<B ]('-T8714<F%C:T9I;F0H071T<E1O5')A8VLI.PHK(" @(" O*B!4
M:&ES(&ES('=H97)E($D@<F5A;&QY('=I<V@@=&AI<R!W87,@0RLK("HO"BL@
M"BL@(" @(')E='5R;B!S=&%T5V%L:V5R+3Y(87-686QU97,["BL@?0HK( HK
M('-T871I8R!"3T],14%.('-T8714<F%C:T1E;&5T960H071T<E1O5')A8VLI
M"BL@071T<FEB=71E5'EP90E!='1R5&]4<F%C:SL**R!["BL@(" @(%-T8714
M<F%C:V5R"7-T871786QK97(["BL@"BL@(" @($1E8G5G*"!,1$%07T1%0E5'
M7U1204-%+" B<W1A=%1R86-K1&5L971E9%QN(BP@,"P@,"P@," I.PHK( HK
M(" @("!S=&%T5V%L:V5R(#T@<W1A=%1R86-K1FEN9"A!='1R5&]4<F%C:RD[
M"BL@(" @("\J(%1H:7,@:7,@=VAE<F4@22!R96%L;'D@=VES:"!T:&ES('=A
M<R!#*RL@*B\**R **R @(" @<F5T=7)N('-T871786QK97(M/D1E;&5T960[
M"BL@?0HK( HK('-T871I8R!3=&%T5')A8VME<B!S=&%T5')A8VM&:6YD*$%T
M=')4;U1R86-K*0HK($%T=')I8G5T951Y<&4)071T<E1O5')A8VL["BL@>PHK
M(" @("!3=&%T5')A8VME<@ES=&%T5V%L:V5R.PHK( HK(" @("!$96)U9R@@
M3$1!4%]$14)51U]44D%#12P@(G-T8714<F%C:T9I;F1<;B(L(# L(# L(# @
M*3L**R **R @(" @9F]R("AS=&%T5V%L:V5R(#T@4W1A=$AE860[('-T8717
M86QK97(@/2!S=&%T5V%L:V5R+3Y3=&%T3F5X=" [('-T871786QK97(@(3T@
M4W1A=$YU;&P@*2!["BL@"6EF("@@," ]/2!!='1R5%]C;7 H<W1A=%=A;&ME
M<BT^071T<E1O5')A8VLL($%T=')4;U1R86-K*2 I('L**R )(" @(&)R96%K
M.PHK( E]"BL@(" @('T**R @(" @:68@*"!.54Q,(#T]('-T871786QK97(@
M*2!["BL@"41E8G5G*"!,1$%07T1%0E5'7U1204-%+" B<W1A=%1R86-K1FEN
M9"!D:60@;F]T(&9I;F0@=&AE(&%T=')I8G5T95QN(BP@,"P@,"P@," I.PHK
M(" @("!](&5L<V4@>PHK( E$96)U9R@@3$1!4%]$14)51U]44D%#12P@(G-T
M8714<F%C:T9I;F0@9F]U;F0@=&AE(&%T=')I8G5T95QN(BP@,"P@,"P@," I
M.PHK(" @("!]"BL@(" @(')E='5R;B!S=&%T5V%L:V5R.PHK('T**R **R!V
M;VED"7-T8714<F%C:T1E<W1R;WDH*0HK('L**R @(" @4W1A=%1R86-K97(@
M<W1A=%=A;&ME<CL**R @(" @4W1A=%1R86-K97(@<W1A=$YE>'0["BL@"BL@
M(" @($1E8G5G*"!,1$%07T1%0E5'7U1204-%+" B<W1A=%1R86-K1&5S=')O
M>5QN(BP@,"P@,"P@," I.PHK( HK(" @("!F;W(@*'-T871786QK97(@/2!3
M=&%T2&5A9#L@<W1A=%=A;&ME<B A/2!.54Q,.R I('L**R )<W1A=$YE>'0@
M/2!S=&%T5V%L:V5R+3Y3=&%T3F5X=#L**R )9G)E92AS=&%T5V%L:V5R*3L*
M*R )<W1A=%=A;&ME<B ]('-T871.97AT.PHK(" @("!]"BL@(" @(%-T871(
M96%D(#T@4W1A=$YU;&P["BL@(" @(%-T871486EL(#T@4W1A=$YU;&P["B @
"?0ID
`
end