Skip to main content



      Home
Home » Modeling » EMF » EReference.eKeys and code generation
EReference.eKeys and code generation [message #410213] Fri, 15 June 2007 11:39 Go to next message
Eclipse UserFriend
Originally posted by: jaspo.gmx.de

Hi,

I tried to use the eKeys property, but the result in the code generation
was not was I expected (an EList instead of an EMap).

I have two classes, A and B. Class B has a string attribute 'id', that
should uniquely determine an instance (just locally). Class A has a
containment reference to B, with containment=true, upper bound=-1 and
the 'id'-attribute of B for the eKeys property. I also tried to add a
reference to B with eOpposite set to the other ref., but that didn't
change anything.

Validation gives no errors. In the generated code, the reference looks
like a usual containment reference. Means it's just an EList, no EMap.

Did I misunderstand what eKeys is doing or did I forget something?

Best regards,
Christian Koehler

CWI Amsterdam
Re: EReference.eKeys and code generation [message #410214 is a reply to message #410213] Fri, 15 June 2007 11:46 Go to previous messageGo to next message
Eclipse UserFriend
Christian,

If you want an EMap, you still have to model it as an EMap. The eKeys
on an arbitrary EReference "just" a constraint, although it also affects
serialization so that instead of @<feature>.<index> it serializes as
@<feature>[<key>='<value>']. We have thought about eKeys also
generating an "helper" method that has parameters correspond to the
types of the keys, and does a lookup for the matching child, but we
didn't get around to doing that (nor is there a bugzilla feature request
for it, yet).


Christian Koehler wrote:
> Hi,
>
> I tried to use the eKeys property, but the result in the code
> generation was not was I expected (an EList instead of an EMap).
>
> I have two classes, A and B. Class B has a string attribute 'id', that
> should uniquely determine an instance (just locally). Class A has a
> containment reference to B, with containment=true, upper bound=-1 and
> the 'id'-attribute of B for the eKeys property. I also tried to add a
> reference to B with eOpposite set to the other ref., but that didn't
> change anything.
>
> Validation gives no errors. In the generated code, the reference looks
> like a usual containment reference. Means it's just an EList, no EMap.
>
> Did I misunderstand what eKeys is doing or did I forget something?
>
> Best regards,
> Christian Koehler
>
> CWI Amsterdam
Re: EReference.eKeys and code generation [message #410215 is a reply to message #410214] Fri, 15 June 2007 11:57 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: jaspo.gmx.de

Thank you for your very quick answer.

I also tried to model it before explicitly as an EMap. I got a
validation error, saying that the attribute is not transient and
therefore must be serializable. No idea why it shouldn't be serilizable.

I made very got experience with the old fashion way of modeling maps in
EMF 2.2.x (an extra class that implements java.util.Map$Entry). Is that
still supported and the default way to model hashmaps in EMF 2.3 ?

Best regards,
Christian


Ed Merks schrieb:
> Christian,
>
> If you want an EMap, you still have to model it as an EMap. The eKeys
> on an arbitrary EReference "just" a constraint, although it also affects
> serialization so that instead of @<feature>.<index> it serializes as
> @<feature>[<key>='<value>']. We have thought about eKeys also
> generating an "helper" method that has parameters correspond to the
> types of the keys, and does a lookup for the matching child, but we
> didn't get around to doing that (nor is there a bugzilla feature request
> for it, yet).
>
>
> Christian Koehler wrote:
>> Hi,
>>
>> I tried to use the eKeys property, but the result in the code
>> generation was not was I expected (an EList instead of an EMap).
>>
>> I have two classes, A and B. Class B has a string attribute 'id', that
>> should uniquely determine an instance (just locally). Class A has a
>> containment reference to B, with containment=true, upper bound=-1 and
>> the 'id'-attribute of B for the eKeys property. I also tried to add a
>> reference to B with eOpposite set to the other ref., but that didn't
>> change anything.
>>
>> Validation gives no errors. In the generated code, the reference looks
>> like a usual containment reference. Means it's just an EList, no EMap.
>>
>> Did I misunderstand what eKeys is doing or did I forget something?
>>
>> Best regards,
>> Christian Koehler
>>
>> CWI Amsterdam
Re: EReference.eKeys and code generation [message #410216 is a reply to message #410215] Fri, 15 June 2007 12:05 Go to previous messageGo to next message
Eclipse UserFriend
Christian,

That validation error happens when you have an EAttribute for which
isTransient is false, but it refers to an EDataType for which
isSerializeable is false. So later, when you try to serialize the value
of that attribute, it will fail, because the generated factory won't
have the stubs that are needed to convert the data type value to a
string. Is your EDataType indeed not serializeable and is that
intentional? The same EMap support as in 2.2.x should work for 2.3...


Christian Koehler wrote:
> Thank you for your very quick answer.
>
> I also tried to model it before explicitly as an EMap. I got a
> validation error, saying that the attribute is not transient and
> therefore must be serializable. No idea why it shouldn't be serilizable.
>
> I made very got experience with the old fashion way of modeling maps
> in EMF 2.2.x (an extra class that implements java.util.Map$Entry). Is
> that still supported and the default way to model hashmaps in EMF 2.3 ?
>
> Best regards,
> Christian
>
>
> Ed Merks schrieb:
>> Christian,
>>
>> If you want an EMap, you still have to model it as an EMap. The
>> eKeys on an arbitrary EReference "just" a constraint, although it
>> also affects serialization so that instead of @<feature>.<index> it
>> serializes as @<feature>[<key>='<value>']. We have thought about
>> eKeys also generating an "helper" method that has parameters
>> correspond to the types of the keys, and does a lookup for the
>> matching child, but we didn't get around to doing that (nor is there
>> a bugzilla feature request for it, yet).
>>
>>
>> Christian Koehler wrote:
>>> Hi,
>>>
>>> I tried to use the eKeys property, but the result in the code
>>> generation was not was I expected (an EList instead of an EMap).
>>>
>>> I have two classes, A and B. Class B has a string attribute 'id',
>>> that should uniquely determine an instance (just locally). Class A
>>> has a containment reference to B, with containment=true, upper
>>> bound=-1 and the 'id'-attribute of B for the eKeys property. I also
>>> tried to add a reference to B with eOpposite set to the other ref.,
>>> but that didn't change anything.
>>>
>>> Validation gives no errors. In the generated code, the reference
>>> looks like a usual containment reference. Means it's just an EList,
>>> no EMap.
>>>
>>> Did I misunderstand what eKeys is doing or did I forget something?
>>>
>>> Best regards,
>>> Christian Koehler
>>>
>>> CWI Amsterdam
Re: EReference.eKeys and code generation [message #410217 is a reply to message #410216] Fri, 15 June 2007 12:25 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: jaspo.gmx.de

Hi Ed,

even a EMap<EString,EString> does not work. I assume EString should be
serializable.

I don't want to steel your time with that, but can you tell me what the
difference is in the old way and this direct modeling with EMaps?

Thx a lot for your help so far.

Christian


Ed Merks wrote:
> Christian,
>
> That validation error happens when you have an EAttribute for which
> isTransient is false, but it refers to an EDataType for which
> isSerializeable is false. So later, when you try to serialize the value
> of that attribute, it will fail, because the generated factory won't
> have the stubs that are needed to convert the data type value to a
> string. Is your EDataType indeed not serializeable and is that
> intentional? The same EMap support as in 2.2.x should work for 2.3...
>
>
> Christian Koehler wrote:
>> Thank you for your very quick answer.
>>
>> I also tried to model it before explicitly as an EMap. I got a
>> validation error, saying that the attribute is not transient and
>> therefore must be serializable. No idea why it shouldn't be serilizable.
>>
>> I made very got experience with the old fashion way of modeling maps
>> in EMF 2.2.x (an extra class that implements java.util.Map$Entry). Is
>> that still supported and the default way to model hashmaps in EMF 2.3 ?
>>
>> Best regards,
>> Christian
>>
>>
>> Ed Merks schrieb:
>>> Christian,
>>>
>>> If you want an EMap, you still have to model it as an EMap. The
>>> eKeys on an arbitrary EReference "just" a constraint, although it
>>> also affects serialization so that instead of @<feature>.<index> it
>>> serializes as @<feature>[<key>='<value>']. We have thought about
>>> eKeys also generating an "helper" method that has parameters
>>> correspond to the types of the keys, and does a lookup for the
>>> matching child, but we didn't get around to doing that (nor is there
>>> a bugzilla feature request for it, yet).
>>>
>>>
>>> Christian Koehler wrote:
>>>> Hi,
>>>>
>>>> I tried to use the eKeys property, but the result in the code
>>>> generation was not was I expected (an EList instead of an EMap).
>>>>
>>>> I have two classes, A and B. Class B has a string attribute 'id',
>>>> that should uniquely determine an instance (just locally). Class A
>>>> has a containment reference to B, with containment=true, upper
>>>> bound=-1 and the 'id'-attribute of B for the eKeys property. I also
>>>> tried to add a reference to B with eOpposite set to the other ref.,
>>>> but that didn't change anything.
>>>>
>>>> Validation gives no errors. In the generated code, the reference
>>>> looks like a usual containment reference. Means it's just an EList,
>>>> no EMap.
>>>>
>>>> Did I misunderstand what eKeys is doing or did I forget something?
>>>>
>>>> Best regards,
>>>> Christian Koehler
>>>>
>>>> CWI Amsterdam
Re: EReference.eKeys and code generation [message #410218 is a reply to message #410217] Fri, 15 June 2007 12:44 Go to previous messageGo to next message
Eclipse UserFriend
Christian,

Are you using this week's build. We only just completed the
JavaEcoreBuilder work to support all the generics constructs this week.
Existing annotations should work exactly as the did before, so I'm a big
worried that might not be the case. With this week's enhancements, you
can use mapType="<your.model.MyMapEntryClass<your.model.MyDataType1,
your.model.MyDataType2>" and don't need to specify keyType/valueType,
since it's available directly in the Java as say Map<abc.DataType1,
abc.DataType2>. If you are experiencing problems, I'd be more than
happy to help ensure that there isn't a change in behavior. Can you
provide more details exactly what you are doing. If you suspect a
problem, you could send me a zip of your project (merks at ca dot ibm
dot com) so I can try to reproduce problems locally...


Christian Koehler wrote:
> Hi Ed,
>
> even a EMap<EString,EString> does not work. I assume EString should be
> serializable.
>
> I don't want to steel your time with that, but can you tell me what
> the difference is in the old way and this direct modeling with EMaps?
>
> Thx a lot for your help so far.
>
> Christian
>
>
> Ed Merks wrote:
>> Christian,
>>
>> That validation error happens when you have an EAttribute for which
>> isTransient is false, but it refers to an EDataType for which
>> isSerializeable is false. So later, when you try to serialize the
>> value of that attribute, it will fail, because the generated factory
>> won't have the stubs that are needed to convert the data type value
>> to a string. Is your EDataType indeed not serializeable and is that
>> intentional? The same EMap support as in 2.2.x should work for 2.3...
>>
>>
>> Christian Koehler wrote:
>>> Thank you for your very quick answer.
>>>
>>> I also tried to model it before explicitly as an EMap. I got a
>>> validation error, saying that the attribute is not transient and
>>> therefore must be serializable. No idea why it shouldn't be
>>> serilizable.
>>>
>>> I made very got experience with the old fashion way of modeling maps
>>> in EMF 2.2.x (an extra class that implements java.util.Map$Entry).
>>> Is that still supported and the default way to model hashmaps in EMF
>>> 2.3 ?
>>>
>>> Best regards,
>>> Christian
>>>
>>>
>>> Ed Merks schrieb:
>>>> Christian,
>>>>
>>>> If you want an EMap, you still have to model it as an EMap. The
>>>> eKeys on an arbitrary EReference "just" a constraint, although it
>>>> also affects serialization so that instead of @<feature>.<index> it
>>>> serializes as @<feature>[<key>='<value>']. We have thought about
>>>> eKeys also generating an "helper" method that has parameters
>>>> correspond to the types of the keys, and does a lookup for the
>>>> matching child, but we didn't get around to doing that (nor is
>>>> there a bugzilla feature request for it, yet).
>>>>
>>>>
>>>> Christian Koehler wrote:
>>>>> Hi,
>>>>>
>>>>> I tried to use the eKeys property, but the result in the code
>>>>> generation was not was I expected (an EList instead of an EMap).
>>>>>
>>>>> I have two classes, A and B. Class B has a string attribute 'id',
>>>>> that should uniquely determine an instance (just locally). Class A
>>>>> has a containment reference to B, with containment=true, upper
>>>>> bound=-1 and the 'id'-attribute of B for the eKeys property. I
>>>>> also tried to add a reference to B with eOpposite set to the other
>>>>> ref., but that didn't change anything.
>>>>>
>>>>> Validation gives no errors. In the generated code, the reference
>>>>> looks like a usual containment reference. Means it's just an
>>>>> EList, no EMap.
>>>>>
>>>>> Did I misunderstand what eKeys is doing or did I forget something?
>>>>>
>>>>> Best regards,
>>>>> Christian Koehler
>>>>>
>>>>> CWI Amsterdam
Re: EReference.eKeys and code generation [message #410219 is a reply to message #410218] Fri, 15 June 2007 13:46 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: jaspo.gmx.de

This is a multi-part message in MIME format.
--------------000100000301090905040200
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Hi Ed,

I installed Eclipse and EMF from scratch again. The EMF version is
2.3.0.v200706130003. I still get the same error. The example contains
just one class with an attribute of type EMap<EString,EString>.

I attached a screenshot of the error message and the test project.

Christian



Ed Merks wrote:
> Christian,
>
> Are you using this week's build. We only just completed the
> JavaEcoreBuilder work to support all the generics constructs this week.
> Existing annotations should work exactly as the did before, so I'm a big
> worried that might not be the case. With this week's enhancements, you
> can use mapType="<your.model.MyMapEntryClass<your.model.MyDataType1,
> your.model.MyDataType2>" and don't need to specify keyType/valueType,
> since it's available directly in the Java as say Map<abc.DataType1,
> abc.DataType2>. If you are experiencing problems, I'd be more than
> happy to help ensure that there isn't a change in behavior. Can you
> provide more details exactly what you are doing. If you suspect a
> problem, you could send me a zip of your project (merks at ca dot ibm
> dot com) so I can try to reproduce problems locally...
>
>
> Christian Koehler wrote:
>> Hi Ed,
>>
>> even a EMap<EString,EString> does not work. I assume EString should be
>> serializable.
>>
>> I don't want to steel your time with that, but can you tell me what
>> the difference is in the old way and this direct modeling with EMaps?
>>
>> Thx a lot for your help so far.
>>
>> Christian
>>
>>
>> Ed Merks wrote:
>>> Christian,
>>>
>>> That validation error happens when you have an EAttribute for which
>>> isTransient is false, but it refers to an EDataType for which
>>> isSerializeable is false. So later, when you try to serialize the
>>> value of that attribute, it will fail, because the generated factory
>>> won't have the stubs that are needed to convert the data type value
>>> to a string. Is your EDataType indeed not serializeable and is that
>>> intentional? The same EMap support as in 2.2.x should work for 2.3...
>>>
>>>
>>> Christian Koehler wrote:
>>>> Thank you for your very quick answer.
>>>>
>>>> I also tried to model it before explicitly as an EMap. I got a
>>>> validation error, saying that the attribute is not transient and
>>>> therefore must be serializable. No idea why it shouldn't be
>>>> serilizable.
>>>>
>>>> I made very got experience with the old fashion way of modeling maps
>>>> in EMF 2.2.x (an extra class that implements java.util.Map$Entry).
>>>> Is that still supported and the default way to model hashmaps in EMF
>>>> 2.3 ?
>>>>
>>>> Best regards,
>>>> Christian
>>>>
>>>>
>>>> Ed Merks schrieb:
>>>>> Christian,
>>>>>
>>>>> If you want an EMap, you still have to model it as an EMap. The
>>>>> eKeys on an arbitrary EReference "just" a constraint, although it
>>>>> also affects serialization so that instead of @<feature>.<index> it
>>>>> serializes as @<feature>[<key>='<value>']. We have thought about
>>>>> eKeys also generating an "helper" method that has parameters
>>>>> correspond to the types of the keys, and does a lookup for the
>>>>> matching child, but we didn't get around to doing that (nor is
>>>>> there a bugzilla feature request for it, yet).
>>>>>
>>>>>
>>>>> Christian Koehler wrote:
>>>>>> Hi,
>>>>>>
>>>>>> I tried to use the eKeys property, but the result in the code
>>>>>> generation was not was I expected (an EList instead of an EMap).
>>>>>>
>>>>>> I have two classes, A and B. Class B has a string attribute 'id',
>>>>>> that should uniquely determine an instance (just locally). Class A
>>>>>> has a containment reference to B, with containment=true, upper
>>>>>> bound=-1 and the 'id'-attribute of B for the eKeys property. I
>>>>>> also tried to add a reference to B with eOpposite set to the other
>>>>>> ref., but that didn't change anything.
>>>>>>
>>>>>> Validation gives no errors. In the generated code, the reference
>>>>>> looks like a usual containment reference. Means it's just an
>>>>>> EList, no EMap.
>>>>>>
>>>>>> Did I misunderstand what eKeys is doing or did I forget something?
>>>>>>
>>>>>> Best regards,
>>>>>> Christian Koehler
>>>>>>
>>>>>> CWI Amsterdam


--------------000100000301090905040200
Content-Type: image/png;
name="emapsTest.png"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="emapsTest.png"

iVBORw0KGgoAAAANSUhEUgAABAgAAALqCAIAAAA3p/H+AAAACXBIWXMAAAsT AAALEwEAmpwY
AAAAB3RJTUUH1wYPESUs0wMWggAAIABJREFUeNrsnWd41MYWho+kLe7G2GBj wJhiTIdgeu+d
0EK4EEIChIRACoFUIAUSSLkhuaQT0iuhBUIn9N5MtzGYXlywjfvuqs3cH7LF slX2ro2B8z48
ZjQazRwdaVbnk2YkAARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARB EARBEADGeuGv
de8HBPha5/j4+xlYNsA/BAD0BgMLoDf6+vkFKmsNegN6EEEQBEEQBEHKAUEU DHqD+tdZMZMp
3yaH580AkJ2bKUiidf73P67548s16qLOel2hyaSmAwJ8JUk2sCwAyEQCAChu PZc3+xp9rTJc
IeExRBAEQRAEQZBSoQOQAETeDACkONNo9FVyAIAXBL3BAABs8aJNDUokb+aL 4nwiSSazmefF
G+lZ9m3dJjMzD8IAAAReZlkAgJuZ2QwLANkcw+q4oscLvj4+1lvpDQax2AJW pyOSpCQAQAZQ
FhEEQRAEQRDk/qBX22dLt+GWg197Xsk/Oz5REhxbaWCXCSYL8fNhS1rJul0/ 5GZfdiUMTDyf
mZnHAgQE+hcUFKkKvd5gMOpkAInTMSxwDJtfaFZFAgCYLRYlIcm0qFIdB7xA KAEAQvHkQRAE
QRAEQe4THu720oULF5JT91kseSbeTIgsirIkm1lOJwkiADCMDACSIAGASAgl Fl4UOWoY1uul
Xm2f/WfHpx5W8nC36UvXfyATMnrQBPP1SzfX/Cjn5cjmQirwRBSIJDIsC7II AESWAYCIPACA
KMkiLwkWs1/lxm98NrDLhCPHDrsSBqmpt6pVqxxgNFIACy8zAEYjJxYPYDIY gZGBcjqGBdnR
YwBKAAAogCgTQmQ8bxDkXkcSsSMjCIIgiC0X0g9U0lWm/uGif6GFmkRZlGUe AIhElPE+oiiK
RCKEEFHiZTNjMuXmZS/6Y+5Hb/5cWGD2vBKLYJElAgAZ6341VqnORNSSTXlS QR4ReJBESgiV
JUoIUEKVRUkggsDxZtZcYMrN3frW5EE/7rQIkithoEAACvML/QP9HTqCyBLI AAAsp7POpACS
RKxLyoTgeYMgCIIgdwtKcDQvgpQJglAAPuEMw7GU4xiOMIRh9TIhrA6UbqfX 60EEngjAMSzR
61mWZfSMPg8AJEnwvBIzLyrvEJLycwyRUQzLgpljOB3DSZRQoCKwHAMAlAGW ApUosAzHAccx
rI5ldfmpKX4+rCnf7F4YKDAMW80YFW1syIq+hRbu2LlbmbwkiZLON98/7FaV agU+/pI6SkiR
BLJcrASY2z9JOJIIQRAEQRAEuZ8oMJsrGU0sMBLwgixKkiRLPADhJSLLPCFE FCUOQASRyBIl
IgDo1PDYG5UAMEqULZsL5Pw8Vq+ngoXwZioKVBSLBhRJEqEyEUWglEoClSXl 6QFwLKvjAIAX
xIz0W66EAcMyBEBv1Mf6tKhbrTljMF5JL0xMyUu3EEGQeUE053LmK0GVqtB6 jQqrRMg2Twls
blSgKkAQBEGQu4Us4aN7BCkTJEngwQSUFQgvSRZZEniJyLJFIkQULUocb5YB ZBkYKsqUYUjx
S4Nud0yHlYzq97x9c1/99rJNJbfjbVGQTXmE5WRzYfTU9wDg3DtPgyQSSSQS T0WRygLIpMnX
GwHg5KTuBIBlWYbTA4DRoLep7Q5hwBTJEKaavkZN/xhDgC/v4yPmiD7+el4Q BUGw8IKFF8xm
/tZZyMtn2nQmgUG3N+c4Vh0+RIn0+NB3AOCXVe/g2VMK6ke3atdiUF5B5qot X3he24g+L/kY
/X9f857GAt5tHXHLuKF3dBMXvcb6SI3s/woALNvwX+8aM6j75OCAMI7TqSeA ap4sS7kFmWu3
f2NttmJt+xaDY6Lj8JxBkAoFp2PRCQhSNlCLZOEYTpIkSiReIpRKEiGyyCuq QBJkkRBgRKAE
GJYSYPT2HdNBJQ4bE4nFphIAyuoAAKgkEbMJOJYWzwqu/863Sa+PJRJPRYHK IpXEpt/8W7yR
DMTqmYUddwiDoODAwOAAHx9DtNSQmmnGLUuBTrZYRLOJ5wWB5wWzRTBbLGYz b7LwZxPEkCqk
dbuiGhRJwLFssbFF3z77aeF/J0x748E5Tfp2fjI4sMrS9f/1cKsaEfUB4Mih 7cmnT8c2beGh
Vf5+wQCwdc3fvR8eqaWAd1uvOF6t4PTofntij7NeY32kGABRFI/t3xvXoau3 bBjW+3l/v+Dt
u5daTJae3UcN6Pz0xj0/qOYNfvipyZPnjRk0a8m6D9VNlD5ep2ZzWZaGDq7V sWf/inDOIAiC
IEjZwYsWIksEKAWBEEKpJEkiEIkQIDKVRVkiBBieyhQAGI4AABWL7p6zjM5F Jb+snieKsiQJ
sshLhFCGf3HcF1SmNpWoEJEnosDILBWl8/Om1pv1JQA0+OC3hJeGM5RQIquq 4OT49hRYhmEp
EKDUvTAohvHngkyZhddMVDTqs7NNKSk5Fl60WASzhTdZeJOiDcz82USpdYcA 5VsLHMvKhOj0
HDzYbzKpUrkGAOzburFDz36ebBUSFA4AJ07sqRJRzVu2Xbt4XmOBsmi9Ini1 4qNRRStHavnG
T+P37fSuAYrwePet8aOffuGHv2bv37E5qnYMDCl2aZ0qV1OTYuu06tJy5K6j y9StHu75LMfp
duxaUbNOPVQFCIIgyIOALPEsyxJCeIkAAAEqyzKhIsNIAEAZkcqUKvG3DJQy DkfYq5UM7TXV
fu3CX15QpAWl1EUlROCBYYESKsvJb06IefcHAGj86crTzw1o8tUmpcyJJ9oA ocCylOUYSlmm
uCKWcSoM9D56AKCU6Fj9taaRBgAdBUO1kCoNIiWZyIRKMpFlKssgyUQipCA3 n+O2ySAxDMOw
HAtAiQwAOj1nrQ1Yjn2k7wyD3ggAhebc81ePJyTvHd77RR+j/4mzOxOS9zaO 6dg8tquFL1z5
70L7ktqPUP8uE5WINjsvfcOu7wFgzKCZaZmXKwdXM+iNhebcqylJUZEN/H2D BZE/c/GAUrnD
FscMmgkAgsgrG67e+iUAtGk2oEZ4jI/R33pza5StAOCrz/b8sXa+Q5PsK7Hf SonPLBbTmn++
27a90O0u2LeiMKTnVKWk9bFwVlgtYN36uOdeHth90n3jVddnCwD0aDdG2S9B 5K+mnjl0cr2z
kkr92Xnp/r6Vlm9a4OIolAjF/y6MURk7ZLbyV9k77b51badSw+LvDhw8swYA +g4bZWNefOLm
2DqtQitXu5R8RsmcMeOLoIDQzKyUuW+PGzl+svUuIAiCIMh9iSSIoijq9UUj ewiRWACxeC0D
wAChAAzDECoDZSkQnd213qYSe5ji74FRIDaVGPV6ZdQR4c1U4BlOBxQoIcDQ pFmPN5j3KwA0
+aIocjg1sT3LAaUyMMACACFACAAY/Qw2LTp4YuBr1FMRAvad2ZzG51tEC8+b LLzZLJgtFpOZ
N1ksJjNvtljMFkFvkBd8Gc1xrPItMwAgwBXVq7feK1ixacGeLRvimvWeMOGt ujWax5/YnJ55
pVb1RnrZ12IqrF61HgDs27s+fu8OBsCmpK+fv5Yj1K/LxJCg8HMXjiafOTFw 0PiebR7bduh3
AIgIi05KPpycfGLwgKca1m175MSmW1kZfXqMrR/VSqnc3ja1xX59Ki/8fHPT Jh27txq948if
tas34Tjd8lWf9ew6mhV1FlOhjW1/rp0/etBMKB4TsmL1RXuT7Cux2WrSjFkd HhoKABcvnm7Y
vKXbXXi495SQoPCEpP2XzycNHDS+S8uRu48uUxzi7xt85uyhqZO7b9teaB0N 23vJ+mBZtz6k
95T7xqtuz5Ye7caEh0WnpF2c98ETr8/4QbbIubeyRg6e7tC9CseO7AoJC9u7 ZcN7c5e7dqwW
lMP059r5iiqwN6ZS5VB7t3y3YJ66d259O6zfC67tvJZ6JiqyUd26TWvUqHs9 /dzRM5vuuHeg
L+rg/v5BN1OuKenefcYAwLaty7v2GxQWXhWvFgiCIMh9DyESLwkyUIbRUSoR QkGZF8xwBCQA
YIBlOaIMtadAAEAqFg7qxdS6EgD4bc1HAFQUeUIIkflJo94vqkTVBlaVqEE8 lSQq8kApAANA
KaEMpWdee7Thh0uVYgmTOzMsBZkAo7y3lGNokTDgTYIbYWDk9MDoRFEs6NCw AwChIBNKlGcF
jp4YAOxkWYYFlhAglLDsbTV0O5gwGnq1G/fogFc5VgcAAf6Vzpw8GhQSUiOi fr16zdfvWBwS
HC7J4nvvPvnoxGf7d33KpmTbrj21HKGggFAAmPxU5+FPPAUAIZUiLl84q6ya 8nS3RycWfXT6
1WnDn3zxVQDw9fU/dmBP1/6D7W2zbvFs6v6mTTqGVo68fOEsoTIHOiLAhr2L jh3YW6te/aCQ
EGf2TJk5x6FJriuZMnMOAAQHhQHApYsJtes3cLsLTzwyBwCef7aXUqBqWNSN q5eiY2KV1qdO
7q607sJLMY2aWh8s69bvJ6+6PVsq96sGAGNHNx0wcszBpNWJx+ODKoWEBIc7 dK9Sj3LSPtSu
o1vHakGdYzBl5pzKlRwYozcarI+Uw7Qb37qz89jZLak3LzWs0z60ckTdqBaU wtFzt7UBtXoY
kHAsXkkYDEZRFAYOfDJ/QxrFpwUIgiDIAwAlEhElwrIsaxNXSwzHcRyVlPv5 lILy7WEAWRZt
LqauK1EWXhj3BQDYV6LzNRapC1GQJVHHcpRhWUoJC5SCqgoAoPE3uxOfaU8J VT6aBoQAocqH
EvwCfQMCfJwKAx8fI2fkgEoFkBty+lL8xVuHbuSYLILZbDGZLSYLbzLzZrPF wvMWXrTwwphx
VWNqKbcwGZYDAI44msowoPPTfj5BiecOfPzxlB++PQoA8Xt3te/eMys3pWrl qFGDX+FY3Zmk
Q9ExseMeecthSevahvd8WUms3Pqxdb4Sg6q3xg0GY3LCKXVt1WoRajqg+Ntt CceOfDh/jesW
lUOl1HbuyuE61R969NEXcvMzmzfsdvbyARf2sKxjkxxWYtNcoH9lAFiw4LnH nn3e7S4oragF
DAZj4vH4OrGxan5kzZquvRTbpKm1Adat309edXu26HVFfaxObCwANGkZp5a0 d6+NE9w61sVO
WfPc7CIN49AYZztln3bmFi123sy9cO1AQve4sRHh0VHVGm7b+9vt3wuWi41u BwDZ2Rm3tcTR
HRaLqX2HAT1bP3b0/Aa8WiAIgiD3PSKxiCCyhCOEsEXD9BkOQHmfKAHQg04E gQKwOobKEgNA
qaxeTO0rKa74diUAoAfd5788RyXZvhJD8auNiCRQgScsx3AcoQwFGjuv6MKd 9MrgBv9dAwCN
Fu1PnNSKYSklhKEUZMJQx/OB7xAGRqNeieszfC5HQrNaVfwvZOZlZSsjiPii EUS8YOEFgZda
tPRv37GyXmcAAEIkABBlmWWKZjAoCqGwMA8A/HyCAOC5Z3o+9szteRU6jk3N PFe1clTNmvUB
YOOG3+Pad3BW0trIf3Z88r85byrpaW+/q+bLROJYnfV7Xe7YT6tKrNNuW1TS gsBfTj574dqh
U0nbmtTu1aRRB3/ftqeStvn5BzizR8exDk1yWIn1Vo3rduFYXVr6FQCoUrWq 211QWrExVW3d
YWEbk6wLNK/fzbr1+8arNpY7rMSFx+zda1O5W8e6OHUdbuLQGC3Od+1bLXYC gM7P79CZlQ+H
TzcYjId2bnt6zO2SocHVAODypYQ2nYtehTRjxsAR48Y3bd4+ulbjrNwbN26d xgsGgiAIcn8j
SSAJIgt6vZ4bM/BV+wLf/DJdB4wIQGUJAGRBJMVfIlcvu9aVAAAAJYQASHdG 6o4r4VhOJjIA
gCxSSSAixzJGACb2vV+KVMHrw4HSpJf6NPh0MwA0WnzkzPimFAjIMkgSSJJ7 YaCgNxoFNieH
uR5ctUZHtjqrY46cvW4yW8wW3mwRLLzA89JDrfyHPRIeUc23yDgwAAAIQu/2 z+p0hnOX9/v4
BALAubNHm7Vqk1eQERRQZezjrw3sPVYpP/bx11iGuZZ6qla1ppUCwy9cOLXm n++mvj7bWUkb
C6e/4+B9/Nm5KWEhUQsWrIusFRUWEpVXkLH32BJ1rXUl1mm3LbZtOhQArl07 V6d+g97tnrII
hXuPLWkCHQghW/5ZPXTMWBt71HiOZRiHJvVsO9G+EuutKgdXB4BLFxJ6Dx7q zGybXQgJqjb7
zZ8aN40DgPPnT9Sp34BlmEJTdlBAlXnzlmWJZ916STXApvX7xqsA0Lv9MwDw 7/5FzvygZt7I
P9at9ZOiZNl7bIkz99rsuGtHuT51rVFrdmiMjSscOt+1b3t1eNK1nV3ixhoN /v/uXxQT1RYA
Llw4dfHc7fMnNrp9lcq1zJb8GTMGjnxyopofXS/mUsqxhrU7N23Q9dym/UGV KuE1A0EQBLmf
hQERZJGXOIYDX6fXdKDKJwNkUZKJLEsiAAcAXPEwIZtKxg5+TXslLMcqwoAI AhEEYHUAbMOP
iq7pZ159hC1+I+nZF7rGfrYTABr+eCpxbAzIEpVlSiQnNt+JGl/kB13JqXQm KFzs0Srq6aGt
IysFsEB1HIlt4D/uqchnnqvdtFllnU6n0+lYnY7V6QBAbzBcST2eX5BdP7p9 9aoNsnPTZswY
2Lh5iwOnlmZkXZsw4S09Z7yVkwIA4VVrioJgMBhy8lMBID5++8OjxgQGBbko 6ZajSWtS0pIb
N2kfHlpHlqVdO1ZdvXD77ZwGg8Fh2lmLyto1a1PDQ+vcykmZ9FS7Jg+1zClI DwmqNqjrS4Jo
+u23D1mWsTfj5q1LALBte6EzkxxWYr1VoF8oABw4uCmienVnZlunDyeszLx1 vUePkeGhdW5m
XnluaveWbdsZDIYDp5bm5We17zCgT4dn1cIOTTIYDKkZZ0VRmDdvmU3r941X DQYDw4AoCgd2
bndWiZJZP7bloK4v+Rj8TyfsvXrhvDP3Wu+4swoNmlGq2ra9cFDXlwZ1fUmt 0MYY6yPl0Plu
fevWzpu3LvK8eVDXl2Jqtb2Vc2PSU+0GjRylmlenRsus7OsvTOvWrmv3WnXq Wv9uXEs7dT0t
0WAwdm/zJFP0Qgb8h//wH/7Df/jvPvwHAFQUJSpTIvKy2Zl2uD2xlyEiIbJM 1IumfSXfr5zz
/co53y+f+/3yd35YPvu7v15f/OcrLioBAOV1RkTkCW+hIk+K30J55pXhQGVC JCrLlMqUyEnP
tlFWUSpTWaaiSGUZAIw+emdCAADgo59fCfLz8ff39TPo1ccceo7TF4cdrK5o QJP1xxUU1aOM
VCKSVFhQcGTfnr3btsQ0bNS4xUONmj+kFEs8cWzVn7+PfGKCKPCr/vz9mRmv hVapAgC5Odlf
fjBv6uuzgiuFuC6phcsXkg/v2Z18JvGhtu279O7rHxAw//WXAWDmBx8DgLO0 fYujBr0FAD26
+z/Utv2xg/uHjn5M2ZH01JTvF34CAB179GrVoZN/QIC9DWoZpXJ7kxxWYr3V hr9XHDu4f8Y7
7xl9fFyYbb8LADDyiQkxDRupxhzcvXPrujXKXrgwCQCyMjK2rV/ToXvPk/FH rFu/b7wKADs3
bwSArn36OdsvJfPMyZPHDu63znToXuuddVGhRpTaVNTdtDdGPVLVo2qpNvRq +6x237q2s7Cg
4PSx+K3r1sQ0bNSiTTtlf1XzHmrbvmGzZtF1Yxw6ISsjY9GCDwcMf6RFm3Z4 PwlB7jpWA5cR
BPEafdpPfe/rcf4+gSzrY9DrWVbH6YDIMsgUAAiRKBEkIFSSZcIr3yoTJaGw UGBY44evL9+8
/0vPK1mzeyEADO784uFhsfrASoyPH6f3YXU6YIBSwgAFSoCKDBFB5oGIIIpU tBBJlC1Cnlm6
kCM9efDW3M+nnD17/Y8v1zgWBu9+O61KSKC/v6+PTm/QsyzDEEpVYeBQFVhr A9HJcKV7ETXM
sg77EPQq+hZBEARB8Jo7+9NHA3wC9EY/vU6vvIGHyJQBoFSklDKUyiBRIsiC KBNZkEVJFgsK
eIPB/8PXl285+LXnlazbsxAoDOz84r6BtXV+gZyvP2MwsqyO4Rgqy8AAAzJQ iSUSlQVGFqkk
giQQUZREMd8sn8+RJsXnzP18yvHjyX//sEXdNZ3jewwgA7CEUvvx/S5uPuh1 RbXdTwoBQRAE
QRAEQawxcsHZudl6ncVgIAa9n81alha9VNQiiRazRZKoTCSDwd/rlZgsxBIU TnIygZd1PkZg
OGAYIIRhAajMUMIxhMoiI8uESIwsUkmSJJInUF14DYf7ZSsMlGkKjFX4L8oy CAIA6JXXJ935
3ECdoyBKkl6nu28kwZaDX9sM7UDQq+hbBEEQBEEAoFfrCat2LhAlQZSgEPJc ltUxHOg4PQAM
7TrDu5X4+bBN31m89Y0Juempep0OGIYAA0A5hgEAhsoslRlKWKCyLAMhLCUi oRBWvf8nfzhs
xnYoUVhIYIC/r5FlOR1HSNE70XUcqzw64FiWZXUAwOk0fccIRzciCIIgCIIg 9xl92k8t3YbK
BAMPK1EmGABA3ahWjWp1LOnmJgvx82ETr+xd/s/vmoYSFRSa9ayOggQAPr6+ hICOYwklLEN1
HCEUWAk4lqUU7IYaFcHpdBIOKEIQBEEQBEHuO9YXh+ZlVwkFAAYIBQCQZAff IyMyOXvp4Jnz
+wGAtfokEZGJTGSO5ViOJUUfO4Di/wEAKAGGBUFycPvegTAoLDQbWPZGWqbR qAcAyC40Wr0Y
UW9gZUI5lil6CavVMwGWZQkh6medlRUMnjsIcs9C0QUIci8jowsQ5F5GB2AW ReW1pCqiKNI7
Q3yO42Q75aCsKkoUR+tUB4wEAMAZOR9/X03CQKFIFQAAAC8IVmk8TAiCIAiC IAhSHvDgveC7
uCZfo29BXoH9+jtu6GemJ6H3EQRBEARBEOQBISy8gZpm0R0IgiAIgiAIgqAw QBAEQRAEQRAE
hQGCIAiCIAiCIKUWBtajkbxL2dV8v4IeQ1dX5HPgLtqGXQNBEARBSoSuRFfW zPSksPAGHs5R
tq/TYZlStKXUrG6iffOyKKnRA3drwncpbNC476U7amXnjfL0tpZzu6L1Gu1H 0z7t3bZKZ5W3
eiWCIAiCIDq3JWyuuF65ALutpJwv8+XZXMUJYkqqoMrO7FJouQrr7XLwUgXp NYDvMUMQBEGQ
B00YuI601BuZ3n2MoLZi8xBAS6RiHwvaGOnixqf93WX7HbQ2yeu7b9OKjc32 dnrRDC1NuPaJ
w8KeB/SqYd6KR114z+Fu2rdYIoe7Pliu3e55r3HdnFd0l0NH2Q/jcdYN7RNe 7EdQMR7QIQiC
IMh9Igxch0elu9frOlK3CfQ930mNRjo0w35bFyMrtEsX10LFYSsu4idv3XF3 2ISSVs3WMp6k
jMIvr3jbxTG13323x7pEKtTZti7c7mGvcd1ciZS2/V8XLdrbVurfCo2iyHUT ZfdICkEQBEEe
LGHg+jpauul9ZXpttg9cnM2U0BIluN5BD3ff4ZMKZzV73WkuImZPfOIVS8pU Tnhuv4saSrEL
Ls7VsjgBKlRkXOonGA6dhrONEQRBEKRshcE9FGS4iDxKFze43baMYjVPbC6H Y+f1g+6teL2s
z4dyOO3xfjZ6D0EQBEHuFl77jkGFuldnM+7ZWYGye2nM/eHGcrbW7VG77z1Q Mc8E687ixY5T
RtXei/0IQRAEQSoIHj0xcDiAu6SXbevx687q9yRi0B5u2pd0kWNjdinmV6hb 2dfj2uZSu90r
R9a1tdZuKd2gGpspDV4MELX41tnmNgPWXfjfxbnt9pwpdc3ePUXLQuPd3ZP2 rjgBQRAEQe45
GJsrK3pEjSTQGw+4T/AcwOOIIAiCIA/ChVJN69AdDl2DkQRGVwiCIAiCIA8U +MQAQRAEQRAE
QR5QrJ8YsOgOBEEQBEEQBEFQGCAIgiAIgiAIgsIAQRAEQRAEQRCbOQaUUvQI giAIgiAIgjwo
YoC5LQfueCtR1s2z6B0EQRAEQRAEeQDBoUQIgiAIgiAIguB3DBAEQRAEQRAA ANAb/IIq1UQ/
PCDYjxVCYYAgCIIgCIJ6oEgP5OVcEwUT+uTBBIUBgiAIgiDIg64KUA8gKAwQ BEEQBEEeaEkA
+JQAQWGAIAiCIAiCkqA8JcGlTBJ/Lu1qem6F8kZYsF9cbETj6kY8MVAYIAiC IAiCPHCqoPyf
EiTc4G9k8n3aNq1dLaxCOeRmdv7WI0kAgNoAX1eKIAiCIAiCqqDMiT+b1rNV g4qmCgCgakhg
z1YN4s+m4emBTwwQBLm3SUxKVxKNGoSXQyuuKVMbEARB7l1VAACZuaaqIYEV 0zNVQwIzc3GW
hTthcDPl1oUrNzp17CQTj0aDHV35cMvh/5TbtVnjFdq+ttJd1EvhpUHPv7r2 84/K4QCnm+WF
8b+cTk7KtOQBQJhPUJOYBi/GjQv35bzYyqH0y9uS1x6/dsFXDmP85bjwuK71 WzcJq1p2+1UK
nydbqoyf81fPZvXnjK7hxdPSW+e2t+rxxEsnj6YcPZydmc6HhRtbtg5p1jLS O78yWyb+dCi0
Tu0wo4+ufky1wCajvWh5YlJ623atAQCAOXjgUJnG5R06dty+a7+S7t6lvX2B fXv34kUFQRBU
BaW4oj3TNW7Rznj7/M37D7z43bG4uiG/zfwPHsESERbeAAAy05Ns0h4JgwtX LpxLOjNoyCNZ
N3M9OT96PX1wy7dtvRL3tG3XDgAuXr5cv149+7Xnzp+vEx0NAAcPHNB4pVfT h/dvVaRCSWOL
UniJt0hWImHW2s/nlcU5MXPPj/HJJwb3uhhZCyILJ/gBXDdZLmalTFoys0lM g/mdxnullS/3
rTuYebRj3KkpD/W6eUUkYlhy5rnPdp94LG5I16jGZXS6e35mlvq0nDF05IJV y0pdyYXU7C+O
Lr1VkH2rICfELyg0KPTNbpMvbxrsxT5SOi+dPJqyeW1ak7j6ETUAADavPQcA nmsD3ZaJvF+N
qXPGAsDB45XOJf1x+MUWAAAgAElEQVQa16Q8jm+ZnXhXi4QBtL92PcV6Vc0a kd5qJTEp3fpX
qHS/Sw7vg5TnA43ybxFBkAqiCrRf0RaM66sk6tcKU9MzftmEx8tzMtOTwsIb hIU3yExPsk57
JAxate01aMhYkNy0/Z8FJ1mGYVmGSFKgv3+1qoHhoUEdG0UCgHlbR2AAAERR PvjXwLaj1nm4
n4RQYCA1NbVu7dr2a1NTU6Ojaiktaq2tmPCIGgUFuYUF+TZXZbdo9JLK3r1n JSF/796zHTvG
AgBvySsjVXD1+uWRzZtb4OLbcWfnxMeGZPT3BWgcGtI4NGTDucsz9/zouTa4 lJ91JO1g55oR
cX6vd40e8Jt52vVLGbVDo6sEGX+PXx0VElE7MLQs9q6kPrfh4JKB2k/Lk8u/ 5Qry1cXYqLCM
A9uDqtc5vndKSc/trw5t3nBqW/OoWpE1IgAiGlSLDfOPSF4zwLt9pHReOno4 m9P7nTl5XVkM
Ca1skkMnrnn/YkZKnSqRj7d5tFt43dKpgsrdxz785q3Vs33jamX8e1zyuuVE lot+BFPOJjoq
4K3YlFKYOHaUmq5RPdJmrbeC6cTkK6rliUnp7dq3PbD/oIfVel5JKVAaRW2A IPcfXZ9fB6yO
MhxwBmANNdhbbdq36tC2Ed3ZtqRXtBcWvXzr+Lnfvv5HTaB776I2cCMM9Gyu ljt29Tq31bOM
QcdwBEIDdJGBhqr++jpVjEe/rT9kympgGMZypd+ElQBk9Vd9uzzhkRAkhCgJ uTihXJIZxraA
tis9Vf9Wj4qhAAzAwQP7S6bCtXmp9/PTwQISiKJg0TfoOnvX4fcAXvv6gw+f fd3rp0K6WY5P
PjE4JhbA0sHwBQAo2sAnoz+ABQC61Y9YduJEepzs4ZiiLw8vq2RgM/JyDHIN AxM8rtFXv8CU
A0eP+zERkf7Mn6c3z2w/uizOdY0+V7i5/+eojhOLfoCGt9z180NDpqwCAGq6 3G/8cmDA9WnJ
5WRFdujq58cBQPrVm411YZGtum39vV+JKlFUwar4dUPi2jSv2axyQJiO1dUI iTqyuEtJ6/G6
lxK+GxEUFpyZ/tzFC9lKTu06VaMbR7xx6uXZ3fsCNAWAOev+BwOnlUgbWKuC VbN9ZVMBMeVf
vJTZwdvHV5YltTtbPwNU8OLwHuWHYt3KnwYOfxIAbqSkAkD1yGpqwiutJCZf qV07OjH58sP9
uyQmXWnXvq3nYsPzSlAbIMi9S1m8mZRUa/ufIQ0NHOujZ/z0XLAfV7uK742f oktxRbt1/NzN
G5nnrmQqCTxeXqQUo4m8M8fg/O6DRU8MRCkwyD8iNCg8LNDYpHr4w4eXfNIC AMY8/f5f374B
FPpM3ubpuUipcmtOlGQ1kwGgUBphIBNyOiFJFCULz/M8b7Hw/fp0L6lJGr30 7+efAMDevWdn
7zq8+d0nLqedfvrLw/rGPWfvOry9Y2yroWN8fIx7lvzolVNhYfwvNSoHZ5uz wQxQvShT0QbZ
Se2UxU41qi6M/8XDhwY3Us5X0ftczTObxUIA0IHv+EbfhBjf2rb/GjBhl9Mu ldG5rn0Mevq+
nxsNnQ8AcPUWAHy28uicJzYt+aQHAIya9OHSxa+5PS1lmfr5cWENIgsuZ/gG BmRdi+ezLwx5
ce+SD9tor+RCavaGU9v6NmvRObZL95hean7NVy7/8W517fV43Uvb3+r9yDdX AeC3Sb8Hh/op
mbFNIr7NXDA4pvGJ6zeAoUCZwTGNv979U7dH3i2pKgCA1bP9ZFO+bCowXzjy ZJssyavHFwB4
i6m471P1tv31GykAtjf1PaFRg/AD+/dlpZ4bOPzxdSt/GjDsichqEYpaUBPe PclvXLvUpm0b
SgkA5GRdSkxyYJIWVdCmbStCZE8q0Sg/bHJysi4BtEVtgCAVBO8OImJTDy79 9ggwOmD1lDMW
PTHoE7/kk2bar2jPdI2rXyvst6//OXclEwDeev2H+rXCwPl8A2uY4vvBXv/t fZBVAXhrjsHM
ej+Hj15rk2lkaaiBNnnjyoq3qoP5ksUs9eszxoXpKq7tJsUXf0mS1JODUqr8 hTufJLi+gAUG
BxNCGjWsb1N/YHBwid5zUqLx0B07xpIdhy+nn37m0xkr5ywVRFOuKbPb/F8X vvI2AHSfNEnn
E6hICE+8FJ98onHl4GwTb5P/dtzZORB78ehDAFAtNHpP8gno5NERybolF0o3 JSqZin9uGDDW
hCEXb7wa4OeXqzdrPHE17pd2n69ctk/5xRj/WBcpZyPr10p9OS8vBHUbf2TT Vy2o6bLFLPWd
chzA1WguQZABoOByhnK2AYBYmFVw5fSIKTv+WNBJqeThabvcSLXDfzWIDK9f ra6iCrac3ZiY
kpBrlt8c8Grv6cfWzmvqup4y8lLCVyMGz5nFpy+y5FgGjmj2zcIzDZqFA4Ao iTcLc/YXWO5o
lFi0NLrz9/cBgNB6siiP6A6Ut8imfFKYb754RJ9/Uer1vVcsVzty2tXEBrG1 1MvD30sWA8DQ
UU8p9+9dXzAuXL5pvVg32v10+f5DxhAi9x86Zv3fP/cfOg4AUtOKfiuqRYR7 pa1GMbUSky/H
NakZf/pao6YtlcyefYcVrVYeayrd/Mhx1z9QiUnpcXEt5OKfyp59hjn4rYh3 XEmJnOPkocTt
HNfaoBQHAkEQjZTR1IIZjZe1nV40vCJxxauNRhS9T6XWSzcOzg/XeGVctDN+ 3aKPe42pnrYr
Ydspw5ipMWm7Ej5fuMGtKlB/3lV5gNhjHSpoDBvAW3MMJMICQJjhjkyOAQ4I y8hj5pyClEXj
5uxN3/e1M9PVuMet6XLxeOKcjOvOlIPb3VZmMJ9OSCSEJp1Ntn5i0KtHF0Ko UkDjDGaNXhr0
/CwAWPv5vPndWk9ceGj1O0sDfIILAPSc4eOJdaYvPvx+99bbFy92cYC1ewkA bqYURVT5fL6N
Nthd8435Xx+vFgr5Ft7DtkQQZR+zSGQ1WNl0evObq98TLHLdSiJQTSduifZL o895iSVBsS+M
8qf6qIOp8q+rb9ccWTkTAMbP3vLt290HTL+4cunfo0e3c7WPgpR+9aZvYAAw TE7qzeRLaS2u
3szLNvlkFQ54Yv0PX/cd8Yr7wSqZBbcCjECpEQAuZFz8fd/fSv4Lf74kSMKg 0T/+8PU44yOL
y9tLIINPCwDwiYCOkUaAhst+v0YIDQ+rnJ1DI6N1AJRRHhlQJvuK+8O58/f3 a3aYSgkVRUmw
WH5ZsGjMhH6yqaBEqkB7n6oTXbVOdFWBL9KfHbp0A4C9O7dTSlNS0wBAuZfv jLrRVdWQ1G0w
mpiU3rJlM0kSlMXeAx9Z//fP/Yc9EVGsB1x7R2Nbauhcu27dOvXqW8wF1te/ Et0YS0xKb968
kWpwSSmRcwBAFHjXBeLiWjgTISVtC0GQCoIa+FlHgAPfSf9hVliLdiPdbr7i 1Ppfdaff+HJz
nSqRjw98NG3XvmtXMqpFFH3l4ONfV6TkFY12rhrs47oqmwcI1j+YahofMnhB GGgc6SvILCi3
sRhgqDqyh2EYwjEyyxkAGBa4lJtZtRu6inu0RDyyTACgRo1al69fsV9bo0Yt pYAbJSPLQIEQ
oJTWr1+PsRKglFJCQLIap+RejmvzkvLqod6TnjebC2hMD0E2FVhgQ+KaVpHN CUizx/q/+svB
vR1j3cbQWryUZeHB7Pg6/e+pf9/4fRcApGZZBI/b6t2646ELB304huN0ALDh 1KZP//3C198Y
GVktu6CgW82OGkWtxv3S7vPRo9st+ukIiHVBJwPA6ZNXb+Zk92xW//PJzcBy QSnz9Oy18xet
eeZJV6pgxtCRsVFhGULR3YvkS2kAsOy3dTG1IwCgbqtOLbp+/sfHn495+Xk3 RyQ/+2Y2n2vh
ASA1P/PopUvq75Rep9MZ9g1+auWqo/8Oqt2oPL0EAoCl+HsunF+nNj6d2zUA ANAFisdHfb9n
aZ3wSgAADFxMy3l50CgtqgAAZEmWBEHkxapNxnz3+U//6RZYIlWgsU8pE3Oj a94xu33f7p1D
Rz1FKVXu37v99VdCUi2qoFnTBpIoWF91evQdsuHvn/sOefzmzQwAqFq1ilfa UrCY8j3/fVcM
LjUlM9hcUG5tIQii9be0zN5EpAR+SvAnybqiKLD4F3f4vMwV8zrW7exGFcxZ 9z/rmWxvD5zm
cz0R4LJSIKJK6ObTV65lmvq3rPbJ1KGu7bGXAaUrg3hnjgEvswCgY4BC8SRg JQ0MCzLLSAA6
mfXJK5RdR4daLJZlmWGY4KDAoIaNbWSiArEeaOzs5pYoKVuePZfMAKOczdTq lp8oleB9NyUa
D/3v4s/bjhzDEJpbmKnnDK0jmy8/srRTbHueCLIMrYaOCazi7/q5gRaTDACC rwNhsPLIynfW
zQdfCPOpwvtlG9zF624bGt2kz4nURB1j9tEZNp3e/N76ebKOVAuuIhLy961m aYmnMjedAoCI
iGjp2f94fvRL5HOLoAOpEKjcNhx2zO9ZdLYUnLQt45IFq5b9+85rrYb0USYf t7h6c9lv6yZM
G6fORbakXnarCgAgNDCk0JKblpMFALUq1wgJCKSEAMBTPcb5GvQr4jd/uuFr Cgbw+IiUyEsW
ALDkFP1iQs4/C26/Nrc6wFsAYPVCzu71O7tWBQBwbd+XkW0mi5IoCoLIC4Ig EpmUVBVo71OK
NoiqXqlYFeweNnoSBUgrHt4TEeF+KKDGYPTkqaT0a2c6du2hLO7duVUd0+NW EpS0rSLNE+XR
x0EbNQhPSDwfWz/Kw3hdY0m3wuDCpTTXA59QFSDIvaIKAMAicgDAsQAUzmdV F35+y2EBF3y9
+yf7mWxbpiwd+MzLSoGx/bqN7afVHptQUB1hbvPoAM8KT4WBxtHzgsQBAFck Bm4PgmUAWIaw
pBAYjlBDVp7gucWEUiBUaebI0ePWq1rFtVBOAreVKMIgulaUG+WgjZK+c11v NH7Yp+1j/z3w
9dS6MsgdY9v/tn1ZzzadCWEWvvJ2x46xvSdN/3fxJ554qVvTNsnXk4x2qmDx vl+qh9QAXzCC
z80svlvTNh4ejtqBoVNa/eerI0t+P7magBgZUYvR0dxCy7yeL33TacQrp08r xf7bpMlTz3rz
0yRafG4RORALmez9sxYL9uM8GAYoBQa4TxadYii8NLmp09NblKwnH8fUjrBe PLVpbf0hw90a
XDO0WnJKXuqta3mW/JqVIt8cMu3vYxvrVo1+vM2wXEveP/Eb/I0+kZVre7d7 u/USXyCowmDN
l18OnjHDYbGcnJzd37uJ7NuGnYsc/gjj32nJh59XbfakaBElQZAFiVBaUlVQ 0j61b/fuDp07
79u9e8ioicpIQjVSL9GrCFwH2UpCksTiqw4MGD5OufxkZGQCQJUqYV48djbP Qw4e2BdePdaZ
VS4ruVq3dtF4qn17dpaiEs3Wptlkpt8427pN0TSDqzdycPIxgpS/Kii7+k2i fs+v7xWHe5WG
jp9rc3n96o2ebm4A5TmYyXby6KU/fzigfGSzez+tL4PREv2jQvCOMNA40tdS LAxsz0tWZkFi
UlfRGqNlCCnkvXAklAcCDMMcPXZyQN8eav7VS2ePxB9v+VAzLY+HeEHwohNL +k59vW8AABAC
kz+/MP+pIJ4IPVp3/m3TPzIZrHzZwENVAAAvxo37T/JzdSpXzTPfVFXBgq1f AIDRF4wQ5ONn
vHjr2hdxb3m++12jGkeFTPvz9OZjV0/5+vpmZV7eVNA77ePFQ4f2S55dpPuH Du2X+fYHbp8b
eNfnvKwH2QwA8ybAjG+MI54f4qzkis9Xu5SRtpOPrReVtW55utnQx06/VjU4 5IMNn47vNLZn
bOeesZ0BIDUv/Y/Dy0RZOHn54msdnvFu93brJYsgKo8N1nz5/eCpE1WRcIcq sMDu77/vPnuN
q1+ATeMVVQDQ+j+v/frjW6NCG40WBUmdEVSmfWrIqImr//p+yKiJAKCO6tE4 vKfEvz9Wr0ZV
f2rCwkKhDAatKtqgVo3KFGh49djSBdZKyK4IjFJXUiLtZA+qAgS5K6qgTL9l Vijqhjw+O9oX
AOC7rz7imNsjiZSB5QWCmycGDmey+fkHNomrD0Uf2dyuXRvYY/O4APGOMNA4 ep6Xi4UBvR07
MYzMMWY2ZTmt8ahEQ1nKKsU8RJlCwDAUAE6fOa9kZmWmWskG95UIguhaTZas B5bkneu9n5++
ffHnABDfMbbV0DGvLepbNC2DPnzs/Se8dVzDfbn2MW1OXz9RM7Smogrmb11g BDBWDqrqFwxg
vJZ1s31MGw8/YqBSOzB0ZvvRUPzJguNPPNmi39BvPvjf5NenKTlK+vjGVU28 JAy0+JyXOJDM
APDcN6GPPNtPMEvAMHe81QUAgC7/euOclxq6OuUIsZ58DADWi7K2e9J1q4U8 3mn4ikPr88ym
1LyPa1Su7mvwMQuW67dumHnx0s2MxzsNr1stxMvXBndeUp4YrPl+xeCJj4HF wUuHcsCnRKpA
cen4uTO+mPFBWMNH0k7/9fis/5Zdn0pMSm/ZqjWl9OFHJyidV7ltTylVE2X3 63ks/khZ/0Db
jJW6i5WUGlQFCHJfYhJu3xG2iEYdA0CBUUaOUKAMmEQ3EebLgxzMZMu+VaB8 Z5PT+x3YldXd
yVAim2nEWkaLaBxRgnhpjoHIMgCcohMZYICyJJfN/AeA0MjhhFZiqJ5lgBdZ zy0uPgkAAEJC
ii51klgIAIWmLOsvGbsg4cw5h6eITWawn05LbSWbY2D1KlLOBxYOagcAHV3O OS4d8zuNn7nn
x/3Jhxablgb7GeNiWgNArjk718TfuHWtfUwbzz977IJvPvhfuxbR33zwP2VR SbdrEe2t+rX4
XJA5kIVJX9cc8WRXS75IGWCgSBeoX8Rb8eOOD16p77qtph2aHVy9+fZNDlGy XmzesblGm6e2
7QcAKw+vD/DxPydcViyRJHIh9frw1gOUtd7FrZdyC+Q1368YPHGE8tzAThVU cqsKAEDfqoOV
KgCAw7RwjyzLaaeWlE4VlKhPEUL/WL5KSY95ZGhWVpb12tDQ0DI6w6vValw+ 8a4S1leESlAV
IMg9QTk8LgAAi6RThYEg6zjmzntuDJglNxHUi52eAoCP1/6VmpNTrVKllweN apzf4ePP1qsF
6tQNcR0Kus6xz8SnB14QBhpH+uqNvju+enqvr75JXLem1dP8ff2ADbwpNUra +0fCpX25haLG
5rRgPWhYNhcFAecvXG3Ton5KqtYhxbIsh4WGFp3EFO54AFacyMzM0mhwSecY WPnNvywkgbU2
SI8btzD+lx3Jh8ByDQDAB7rFtFnQ5y1vPStwRrduLSw5Od26tSj6BcnJUXK8 Vb8Wn0sSO/Z/
kSMe62gukIChRVPjqTJBhQGG/r3kwKevu/+Ub/3hT9W3mkQwY+jIBauWlc7s qW379Ytq+98D
v97MvsWyLCGkRmi1b0dM8vqzAo1eeuLbPate7/vbwj+d1TD0A/ffYGb8HgJo Xdx5DtPCPVJK
DqW01KqgRH2KUlq3eLIQpbRy5cr332XAW9MA7kWzEQSpgKoAAHiJXfDC7TcF PTPxX7si7u8F
v9jpKUUeAMCBXed/+H2P+p1NABB5gge0/Lnjlrn9O09EEhwREQESZN06WxHM LdFNLxeXJY31
aLywlc5LvZ+f7vBDZveD3Px6yfEDG+3zW7Tr5605Bhp9/sK8Ky7Wfjar1v3d vSta//W65d7t
yCX6CcKoF0GQB1YVlJpP/j4z7xnHLx7dvnG7+pFNAEg6mT75xYaezDEoBbMW rZo+rOEDeOZY
f0TVjTBAEARBEARBUBV4znebLkwe3j3Y39eZNlj2+7WszILQsICRj9UsZ1WQ W2j+ZuX2p/rW
fQBPHhQGCIIgCIIg948kAIAKrgoA4OhlU2au1K5J7drVwiqUYTez87ceSQoL 1rWM9nvAhYEO
exSCIAiCIAhKgrKmZbTfpUyy+eCpq+m5FcqwsGC/uNiIxtWNeFKhMEAQBEEQ BLknVcG9IglU
aoextcMiASLxCKIwQBAEQRAEQTwSA+riPacKEBQGCIIgCPKAoHzdU529x9iu ZWxybZLMnbk2
/zO2zbhdy9jZdrspxoHlSopxZLnD/bPbNYcN27TFuFx7x7IDS+ydaLe5k712 sNLBoXBUgHFm
qwNLGKc7ytj958DJjKMDagOKAQSFAYIgCIJUfKjyh1ovOliPIAhSQWHRBQiC IAiCIAiCaH1i
cPNmRmJCIvoLuY9p1LhR1apVsDsgCIIgCPJgRjjuv2OgxkAjRj2Nni0LVvz1 bUkPG1IW7Ni+
0+1RULvDgCFj0GNlx/rVf2CnQBAEQZByiHBK8IEzJQwa/uhT6NNyYOXS7zAY qgidx5n/le7Q
d9CjAGAWCtFXZYevwV9JbFq7FDsFgiAIgpRdhKNVGChh0LCRE9GV5czfy77H SKii9RylO/Qa
MNzMoyQoR4VgLFIIW9avxE6BIAiCIF6PcDQJgyJV8Mh4dOJdkwfLf8QwqIL0 HKU7dO83xMwX
oHPukkIIAIDtG1djp0AQBEEQL2oDa2HgZvIxpcQmZ8asjxfMexndWg4MHfHE qhU/JybgXVJb
5s3/2MXaWTNf9uJW1shEkmVJXTy1dJLDYk0fXYzHyOsUmHIAoEufgbs2r8NO gSAIgmCE48UI
x70wSExIHDJ8HKXUkVooytz3ThtWF3QsIeWhxpEA0G72Fjyi3mXI8HEAsHrl LwAYBt3BJ/9z
HHxPnzbJK1t16951x/adVat2VbtDp579lNjUmt5TttvkJG98/tTSSY0e+RqP URnJg049+wHA
nq0bsVMgCIIgGOF4GOFoFQbg6HGBTb4kkc6z3z4x4cW2r7+99923nZVHrHnt 1ReVxIcfLXSd
qfLwsLH//P0bhkGe47pTucX6cQEASJQhdsrZ4B9au06TxOXPxg77HB2uka8+ +UJJTJn+nOtM
AMg3ZQNAp579UBsgCIIgiFciHI+EwStvfqok6l0qODPhxfPXsr+d8CIRLR28 JAyMPoG8Jf/u
+rdMbVBU3fRpkz748FMAeP21l9QcZz4fPHTMmlV/YBjkYQconQovUgVEkskd wqBeh/GEwsRW
U78/8qW1MACA6DqNTyyb1mTEx3ikStopnpk2GQAW/e8bNcfG7Qo5BRntu/fa v30LdgoEQRAE
IxxPIhxPhcGHc55XEpte+rX/Jwu/nfDi0z8s3PjK6w7L+/gGq2mLOVejWV58 +GBtwN2ywdkh
VI6W9bF00eigIf9Zu3oJhkFQwtFy3kImsvUTg8OzsmWx6kHYXD2w1pIxmwGA 07PDf+hVuelz
AMAwcOpsX5snDOVJ43rtEs4fKIvC5d8pnLkxJz+jTdfuh3Zux06BIAiCYITj FXSuQ2PX+QIv
r3nxFQBQ/jorbykeme3jG2yxG6VdsqZLxR2Naq/ZqzaovP/+x9OnTVLiHuvo Z/q0Se+//7Hr
Rgc9PGrtP39hGHRXkIkkEVldFExS0yF1Ms7nhOdXbzQgOuN8TlrCrduqjoAo M9bly58StX53
TX1y6nhnneLJqeNd2JadnxHXuXP87t3YKRAEQRCkbIWB2zkGg744VKLyatrX v7KyaC68pSRs
ctRiyqKL8mqmfRlnhqnVqmn72pyZqpZ32KjNWmfMn/+RGgapAdD8+R9peUYx cPDIdWuWYRhU
/hD5jicGFsmccT6nMNNyNfdixvmYwkyLRTLL8m1dJ8qsw1vdLRsWTfc5eman zaKSVvJdlHRR
xprm9Ts6bMXhhtaFXVjr2n5lUdkRZ+064/HJj9t3iscnP+72qUt2XsZDHToc 27cPOwWCIAiC
3E1hEP/REABQ30oU9+pqjcLAVJCpxuWmgky/gDA1RylAKVEy3Zb3CwhTC1uX sVECSkLJNxVk
WtfjsAlrG2zylYTbtSU9Eto3GTBoxPq1KzAMKmes5xgsGPVX9cBalnjT1dyL AJAUnwwA6QU3
pnZ47rM9RXOOBZmxHxzfunHPwwlb1QhbSSt/1UWbfBc51rXZt6Wskolk36j9 hmph19babOhw
d5SEs7Ul9bmWYrfybzZr1+bkgUPYKRAEQRCkzIQBUNf5kkg6vjnn9luJnJT3 CwhTEoUFGUoZ
/4AqNrXZbOsXEKYWdlteSaut2NdWWJBhk19YkGHThH2Fzhqy3sq+Ueu1zpg9 6w2bOSLK0Or3
5r2v8bD1HzR8w9qVGAaVrzC4/cRg2h8jtky73HlU64zzMUnxyZ1Htc44nyMc 4mese1kiAAAM
gODkiUHrxj1v1ylLYDWG3ibRrllfZyXVdOvGPQ+c3KTkqOWVHOvC9o1abwjO x/G7sNZ+QyV9
4OQmNdN+c2f89f0yh51i1MSRmrRB3s3GbeISDsVjp0AQBEGQshEGTu5hz5y7 SEnUvZCWYPVW
otZOyhfkp1tXGBAYruYEBIarjwhsNvEPqKIUc1teSatl7GvTPsbJOu2sIesc +0bd3vh/c/Ys
NQCynmephEHvvjdP45HrN3DoxnWrMAwqEZ68zMvmrUSCzCtDiQBASQgyT6wO vkRYhze89x5f
Z10nWN0Xt050bDFQLdmxxUCbkkpaKaDogb3H16nl7QvbNGqzITi/N+/CWhub tbTrzLfLf/zb
Rad4ZPwwbdogvUGr5olHTmCnQBAEQTDCKT9h8N7siUpi+xsr+/33A9dvJXJY j+toW1nMz0sN
CAzPz0t1W94mJzComrKVCwOUMmr9pRYG9o1qHxE0fdqkue++qyTUqKhEY5D6 Dnh40/p/MAzS
iIcz/W0+exwT1eDI/ngAKBTyC/bnKTkyoVbKwfETAzWzS9yQXfGrwfkTA/ub 8fY5ALArfnWX
uCH2bTksrDZqs6F1YesyLqx11orbdl13imHjBtt0Cu0vd7qVmx7TsnHi0QTs FAiCIAhGOF4W
Bm7fSiQKmt5KZJOfn5sSGFTNeq11Tn5uirqJku+6vOMa7mzRunB+bkpgcKRS Rq3fusztzZ1V
W1y567VuVUhzCg0AACAASURBVN3cuXOVwnPnzr2t80r4KqS+/Qdv2rAGw6By gMiy9T3vGi/k
R2TXrNe8/xs9X3h/62dFZejtwyg5mmOw/fCKLnFD1LSLJwbWJdVVNtt2bz3C pir7hrYfXmHf
qM2G1oWtm7Pf0CbH9e44XOu6Uzw8tr9S7OGx/dVOoXGmgaoN6jZvkHgiETsF giAIgpQUxnoh
Mz1JTe/YvrNPv4H2G7w5/6d3Zz5ZcXYgqFKNvJzrFaGSu8jmjesaNcYwyMvs 2L6zW/euajq6
ab2s3DTrAnv//mvc9L+cbf7rglEdho/yoj19Ozy2ad/veFy0UCmwyrWES9gp EARBEMR1hAMA
YeEN1HSJhxLNfWNcWX/5SwvBIVFKIjf7qlfsqQg7VWp69+3/76YNiQmAkVDZ Idu9TV8m7I8L
RgNQSoFhGFBmq1NgGADK2KhupDzJyc+IbFgzMSEROwWCIAiCaKc0cwwqxIX/ 1mUvGplz6/I9
LQwAoFefvgCwZfMmHEFRZsLAdkBLlxEjy9MAfFxQIvILsyPqRwJAYgIOK0IQ BEEQLwgDig66
t+jZu8/WfzfjXdKygMgyOuHeotCSBwBV6lXFRwcIgiAI4rkwIOige44evXoB wLYtWxITAACD
Ia9RoimwSMXBIpgq1wkFAEUeYKdAEARBkNIIA0BhcO/Kg549lMS2rdswGPKS MMAnBvcqosQD
QHB0sLKICgFBEARBSiwMcCjRfUD3Ht2VxPZt25VgCCmtMMAnBvc2pFjaBUYF 2CgEBEEQBEEA
hxI9OFi/lwrRwo7tOx2Glch9g6oQEARBEOTBIf9qgbNVLHoHQRAEQRAEQRAd ugBBtNOn/Rh0
AoIgCIIg9yKb9/+BwgBBKiLrFnZxmD/wxV3oHARBEARByh8UBoinXLxwpk7d huiHUtB7ynab
nOSNz69b2AW1AYIgCIIg5Q/OMUDuGU4s7nJicZf7ZnckyhBKbf4Z/ENr12ni 7GECgiAIgiBI
2YFPDJAiEpPS1XSjBuEVUBV0f+Ps9vdjS13DvPkfu1g7a+bLnpj36bdv2We+ 9PRcF5vU6zCe
UJjYaur3R75UMw3+oQAQXafxigXdR8zYrqVphmG0vFmYYRjw6juINbZbDlQc S8raWmfbWuff
W95AEARBUBggjoNyr4TjpasqMSm9c5fbd6l379rlLW2w6UCG6wJ927n/wpSi Cjy0ZNbMl+fN
//iT/y22yZ8+bZLnqsChBnCWDwA//2ejLFY9CJurB9ZaMmYzAHB6dvgPvSo3 fQ4AGAZOne3r
xQAUg8W7Fdnf955HbyAIgqAwQLysCtq1b3tg/0FvVajUpj2yT0xKr1c3MvXG eVmSeJ7nLXyg
L2P9AMFD0dKiRydnq45v26NJFby8n4q3GGCURZsCzSdpHZE/a+bL06dNstYG nqsCBVmWGKYo
TSkAUFHgXZQXTFLTIXUyzueE51dvNCA643xOWsKt298NISDKDHYNBEEQBEFQ GDxwqsDr1ZZU
GwQEhrgucPx4gifaYP2vy52t+nFFGgCMH9HUmSro+vwKyqcAAAHo9vwK5X4j A6DeeFz5Vrse
Mw+UQht4SxUAgCgKiihQhIEomAtys12Ut0jmjPM5hZmWq7kXM87HFGZaLJJZ lm/fTBVlx/N/
GOa2YLC5+aqusn5QoC7ap60XKaXqX3WVzegjh48grLd1YYPrpq3rdF2hw/q1 tGW/Lw5Luihj
7+oS7bLN/mq3zcY817bdW97QcvZqOWldm4cgCIKgMLhnVEGbtq2UT+rmZF1K TLIt4DYWt7mv
r9QD0Lak2oDIkpr29QvavHMfyzC9urQ3m/K8tbMDHn+kFLKh+aRdK99qN3zW ImVxxbxn7Mto
VwXW2gA8nldwhwOJ5O8fbJ1zKfmks8Kjmz5TPbCWJd50NfciACTFJwNAesGN qR2e+2zP50oZ
wfkTA2cDhOzzXa+1j+8dhuxuh384LGkTt7loWmOFbjd3uNbZvrjwlUPLtRwC Zxs6q8ehba4r
VMJfLW68t7xRujPHxYmHFxcEQRAUBveeKoiLayFLRRF5zz7D7MvExx93Edk7 edpwO0e7NpAk
UUkEBIas3rg9OioSANZt2TWgZ6eC/Gxv7XK4sTRb9Zh5YOW8dsNefb90MsCZ NvDu0ZRlOScn
U5ZFSighMm82WUz5zgr/eWrRvJ7fdh7VOuN8TFJ8cudRrTPO5wiH+BnrXpYI AAADIMglfmOY
/X1l7WiJpVwHuM5sKEWg5qK8633U7gEtJV3cfXddVTnEphrtv4e8UYqz1/WJ hyAIgqAwuJdU
QfPmjSRJ8LAe1wPZASAuroVrdVEU10oiAAQGhy1ZtalRbJ3I6lWV/OVrtwwf 0CM/N9Mre82W
9trdY+aBv+ff1gYqJxZ3kUMrtRz+z10/oHnZGRazSRIFSgmlVBIFuVhrOUSQ eWUoEQAoCUHm
CbGSaqRkwsBh3Fb+OLw97MUXIrmuRGMTWnxlY7mW++VltMteF3IV0xse+gqf EiAIgqAwuLeR
RMHzSizmAq8YI0ticEj4j3+tadW8YWhYJZ4XAKByaHAMjfp1xfqxw/oBXPO8 Fc6DbRVt4KDO
rJyjKx++69rgVkZKQV62JAi0aJoB5ThXnSsmqsGR/fEAUCjkF+zPU3JkQq2U Q4X7xkip3z9j
PXWhfIzx1j37Elle1rtc6j2tsN5waJiH1uJQIgRBEBQG9x6NGoQnJJ6PrR9V 1sLgwqU0jUOJ
KCWSJB05cYbj2I5tmgPAvsMnKaWyTJRZEJ5TaeAs+8ycdfO0awP7TOXjBicW d9H+biKv89LT
c0v6HYOxv/Te8m9hveb93+j5wvtbP1MyVV1AKUjO5xg4HMhhH3vZzzG1L1m6 EMpZ7GVfs82i
fQHXsaZNeYf1O4w+3d6cdjud10VV1o7VvstuR+o72wsXRxbshtPcQ97QvtcO a/buKY0gCIKg
MLj72iAx6Wrd2hHK4r49O8Orx9qXcVdDmk1m+o2zrdsUTTO4eiNH4+RjSeBv plwa3KVJWETU
j0vXm808pVQQxCce6ZeZdjUj9bJXdrlww7xLJtvM6xatmzv87DHlU7pN3w4A Oz65y9qgpJvs
/vfH2k37vffvQusHBbePiIbJxzaLDgMm15s4FBhuExqrcm1S6Woo0XCUEu1L qRsqxS57aJtG
ayu+N1xs6N0TA0EQBEFhcK9og7TomqEAEF49thTvA3WxiXZV0KhBuPp2o+vp iaIk87wIAIIo
/r1sae36TcBLH1/jAOr5lXLbE4u7dJ28mALYxMvUdF5JdJ28eOc3d1MblBSZ sD8uGK2ENAzD
qK86ZRgAytjtKIIgCIIgCAqD+18bpEdVr+TdarWrAocCQxQlAHiocQMdFT2X BOpXzBgPhs03
n7Rr6dsO5hiMnFk0I3nZ/Df6vHXgHjr07338dym2qgh3RivO3VlvWVI+e1TW rdxb3kAQBEFQ
GCBOtcFdVAUO7ZEYPQBIjF6xrdQV9m1XBYq/YubhdFr7uH/z3Hb3qCpAEARB EARBYYA4jsUr
VFVe1yoAsP7X5evLxnv3hypY8de3I0Y9jX0BQRAEQRAUBsh9q1UAYPyIpmVk 533zrABVAYIg
CIIgdxcWXYDcu/R568B9M4JoxV/f4gFFEARBEASFAYI86JT6icHops+g9xAE QRAE8RwcSoR4
Sp26DdEJpaakX0ZT+Pk/G2WRKOnqgbV+GFE0fYPTs08s6YdeRRAEQRAEhQGC 3GOqwKEGcJav
IlrkyKahej9dXkphI6ZFRMPKSjr7WsFd2RH7T/Nq2QRfi4kgCIIg95gw2LF9 J7oJeaDo1r1r
ubUly5IaVFMKAFQUeLdbUUL1frrAqn6WPCErL6OmX1UlTcndCbWVEB9jfQRB EAS5z4VBeb4s
pdFTXyd+9yweFeTuknXzbLm1JYqCElorwkAUzAW52W63skjmvJRCS55QmGm5 mnuxTkq0krZI
Zhdbqff11TheXVTSaljvrKSLMm6bc1YtagkEQRAEqSDg5GMEuZsQIvn6+vv6 Bvj6Bvj5BQRX
qiIIFmWV8p4i678Ko5s+cyUn+eLZy0nxyXtP7gSAHYe2JcUnX7ty7UpOsrO5 yMrtfAXrAF1Z
dJjvIse6No3N2W/iYnMEQRAEQcqf8p5jcHLlLDXdbPg8PADIA44syzk5mbIs UkIJkXmzyWLK
V1YpD+us/yr8eWrRf/v83LhtrN5PVyclesehbf379FfmGMBZ+HjfTGdt2cwE cIGWkm4HDtlX
gmONEARBEASFQREnVsxqPmKe1eLM5iPm4zFAHmTysjMsZpMkCpQSSqkkCrIk ut1KkHl1jkFU
cB01Lciu5idoDMqtw3dnCkHLWCCbfBw+hCAIgiD3rTDQ/prFr+Z+pAQGkybX E2/+KJksprxC
c06+r4H/au6HU956bdg7S/9+51E8GP9n787DpCjPvfHfT9V0T/fMwAwMw7DI oiggoMZoEEVk
cTtuUYEjGE1Aggb1RKMScw4aJXjp+zNxeTUREBUdjQL6AjmJykg0gkciiCcg McCwKDszzNaz
dHd1bc/vj5opiu6q6uqetWe+n2uuprrqqaWr6e77rnoW6IZqKo811teqssyb mhlwUUz+qZS1
mNnGgIjMaffEwDb0bwlrXSOPu/O4CgAAAGRMYpBSN4uNSpZaNH7BbKORJfkC FOzdtGj4RCKi
siPVLX8lqKUAGeeBuxalN47BWYNH7vjnDmM6LDc0/rPenO8liHf/pNjG7i4N lz3uLu5pYotn
AAAAyMjEgCzdLIqiT1UVl24WH37iwfkP/YHkoU6bWjRr8qi5S4jo4Rnj0z4e hBeQoblBGmvd
/uaVRFca07ee87MV/3w5jc+I9Sq+00TSdb2XSbpNAAAAyNTEwNrNoizH3LtZ rIv4Sa6zX3bs
7ekTbps+YaTLvuL6VYzrNN2YsL1jkLTDRIBM5zErAAAAAGirxEDX1dzcfGM6 JyePiL7b21S3
YfWqZdNm3GU+jnll3Xyisp+csvrTZ9xAzYkFY8s5J0bEGTFOy5fNiQvu0wvi 49pQmhUYWrhZ
gO4GnxQAAAAkBm7MbhYLC/ufqDjs0s1i2Svrcn9wfnDk8LqPN+RfMSm6e094 67abHp1tu9mS
R9/xHvSn12Ei3nUAAAAAgDjpD3BWX1tZVX648tghIqoqP1xbdbyx3rEqUXDk 8MJZM3Mv/F7h
rJnBkcOJSAqrUliRwqrlT3npl++tfvP2Vnx53II8jMoEkHGsY58BAAAApC39 OwZmN4sbS1dU
Hj/o3s1i3ccb1FCo+P55FS8sDX+1nYjCoRhxIkack3ER/9Xfrd+0ZoaXWN9a LyjxpoFTYwMk
A9AlWcc+AwAAAGjvxCDtbhZNjSGZLA0Llr+0adv701wyAXPa+0Emrog+1KHr MRrzeCy8/Nff
c1o054ntOJkAAABIDNLMDbwXzr9iUuGsmRUvLC2+f151ycqqt1YteeELa4Gd pTe6h/hOT917
WkQPidDlpXrH4LZfv5k48+0nfoIzCQAAgMSgpbxcsIzu3lNdsjL81fbqkpVK eQUR7Sy9Hmcf
IG3p3bLTOUtpPgAAACAxSIGXC5bhrdvCW7cRUdVbq3DSAVqeFXgfetxK1Yhz H1FTwx6jnQ9x
UjXHVeJq33m554YmPQAAAN00MUhqxMdrcaIBWpc59DgRGS1onIYePyUx4MK7 byzmdvOdVokb
TxAAAACQGDhKqe2ju1Fzl+x89W68KwBJWYce55zchx4/uZYuzLjjzsT5ix/d nNLek44pbjxF
LgEAAJBBhJZvAr0lArQ/XVeDwdxgMC8YzMvJycsvKJJlyczV4x5PJgaa/Ufe ab5TVmCOB2Ik
AIkjhGC0EAAAgIzT3ncMdqx5xJw+d+qTeAMA0mMOPc51ruuay9Dj1rVkjdm2 MZC11Bof244p
jkwAAACguycG3rOCr1c/ct60Jy1PF5w37Sm8BwBpqK+tlKIRVZE51znnqiJr qpJ0LUVjv3vu
PUoI4NUUEwPbHoRRfQgAAKCbJgbee0tcvOi3RvBw57wzlROvqxEpUh+OhhqC /tjiRU/f89iv
bl747tqFt+DNAPDOHHqcNzUzcBt6/GRioAsLHropcf5vHvgovcOw3ijAAIIA AADdMTFIqbfE
RiVLLRq/YLbRVpJ8AQr2blo0fCIRUdmR6pa/kvavyYC6E9BR0h56XNGFlObb ShxT3GmIcXxA
AAAAun5iQJbeEkXRp6qKS2+JDz/x4PyH/kDyUKdNLZo1edTcJUT08IzxaR8P QhDobrlBGmup
Dm0MklYlchl9nDDEOAAAQDdPDKy9JcpyzL23xLqIn+Q6+2XH3p4+4bbpE0a6 7Mt6PdK8Th83
YXv9Pmmniu7lU+qT0X3LAJ2BxoWH7rHpEVgUBJwcAAAAJAZp0nU1NzffmM7J ySOi7/buMJ4a
/RRZH19Zclfll29E960LnnlN0djZc+56nZrbP3IixpZzToyIM2Kcli+bExes pxdqW1c0pxPn
OO0ocfXEVVy2BtAJvfjKBpwEAAAAaOXEwOwtsbCw/4mKw0l7S4zuWzd4xq8P rXqCxs6+6dFZ
TpstefQd70F/0nDctlPFlpwvlz0iNwAAAACA7pgYmL0lElFV+WH33hIrNz5b fMHoqeecu2Lt
wsqNz/1w4oPv7pKbKzib+GsL//TRqttb8eW53BNII0Nw6ZMR3TVCxmnFMcvj VJ8ow+mFOIV9
R+AkAAB02cTA7C1xY+mKyuMH3XtLjB79sme/0c3TW4goHIoZeQHnTe0gX/3d +k1rZniJzq31
gpLWCHKZmXSRywGkugigs8GY5QAAANAKiUFKvSUeen9B3sBcIvrN/MuIKG9A 7uH3FzSKD5Gl
YcHylzZte39a0mg77Qg+rhdFL+VT6pMRLY8h47TdHQMAAADoRokBpdRbYv3+ gtFjQkcaHn/m
s1fPGlsw+PTGzd8sefMLa5GdpTe6h/hOT62DK7ks9Tgn7T4ZkQ9AxkFWAAAA AK2TGJiSXnc8
eqBs0GWTxL495947Vew7UPD5jx4o21l6Pc4+QPtLb2Q0AAAAQGKQXNLrjkOm PLD5zeeJqBfR
ztX7jDk49QAdkhV4H7O8s+lTPJKIqip2m09tp1PdoKmqYnfiLqxPW3LY1r3E zTT2a7uX9F5X
Z9g1AAB008QgqQHjZg0YNwvnGqAzMMcsJyKjsYzTmOVWyx8732nRnEXbMvds tGnsa8bWcXvx
HnO3/PDaZ9fIIgAAkBg0acUmjKPmLtn56t14VwDajnXMcs7Jfcxyk6QKP134 euL81xbe4RIs
miGm7ZV4criG7VQmboJOvaJvThsFEkNVj8Fr3BbMw/ByzHGvPdXY2nbv1mOw PT/USvc0WrLr
xLcYAAC6aWKAJowAGcQ6ZrnBZcxys0xYtv+ucJrvHtMnVgGKm+M9iLed9n4B Oy7c97Ivl1fh
lBLE7cUacJsl3Y/f5fzE1Rdyf4Ftt+u49AwfNACAbpoYpHTHYMeaR8zpc6c+ iTcAoJ2ZY5Zz
neu6lnTMckOjnMW5j6hp1JGmwQk5NcrpfIe4x7KpBvfuCUN6M21vOKR9zIkz 3VtHtGJg3c67
TryrAwAA3Ssx8J4VfL36kfOmPWl5uuC8aU/hPQBoT+aY5ZzrnHP3MctNYTlr /r33JM4PZKX8
HeLlandi7SBr4faPOz1eoUeNGtwxAADopomB904PFy/6LRER8TvnnamceF2N SJH6cDTUEPTH
Fi96+p7HfnXzwnfXLryle74BqY67DNBC5pjlvKmZgduY5aZnlm5s/0O1rfdC 3i7euwf3Xnad
9jF3VHzcsdfpkRIAAHTfxCClTg8blSy1aPyC2UaTR/IFKNi7adHwiUREZUeq MzHCbsU9GptC
kgBtLaUxy9sh3E+M9eOa9roEmtbL82lfqvfYhNfLMdumB049hMaVTPX4bY/H ywtso12j7hAA
QLdODMjS6aEo+lRVcen08OEnHpz/0B9IHuq0qUWzJo+au4SIHp4xPu3jyeiQ GvkAtGdu0G4J
QNIJp6Dc41PbxsdOEaqX+vQuc9Kojm/bVykla+2Q+KLcX6Z71ab22TWyAgCA 7p4YWDs9lOWY
e6eHdRE/yXX2y469PX3CbdMnuF39Ys39rlsvq8dN2F5ut67oNMelfNLVjadO hb0chvk0cYMA
AE6cunNt/10DAAASg1M6PczJySPXTg9fWXJX5ZdvRPetC555TdHY2XPuet3I KIzEgrHlnBMj
4owYp+XL5tgGzamyrmhOJ85x2lHi6omruGzN43biMgSkBNANZWJ82eHH7H5T Be8XAAC0a2Jg
dnpYWNj/RMXhpJ0eRvetGzzj14dWPUFjZ9/0qONAyCWPvuM96E+aM8SF3bZz 0k42UlqE/2oA
AAAA0DUTA7PTQyKqKj/s3ulh5cZniy8YPfWcc1esXVi58bkfTnzw3V1yc1/o Jv7awj99tOr2
Vnx5LvcE0gjWXWr7uFcEwn0A6EqSDl1S2HcEzhIAAEA3SgzMTg83lq6oPH7Q vdPD6NEve/Yb
3Ty9hYjCoZiRF3DeNGTSq79bv2nNDC/RubVeUNIaQS4zky5yOYCki1I9DIBM gcHOAQAAkBic
lFKnh4feX5A3MJeIfjP/MiLKG5B7+P0FjeJDZGlYsPylTdven5Y02k47grcm Eh7LJ67utDX3
I/R+GNYN4r8mdFopDXYOAAAAXTwxoJQ6PazfXzB6TOhIw+PPfPbqWWMLBp/e uPmbJW9+YS2y
s/RG9xDf6ak5nThB3mr1uJR3f+q00zQOw2U7AJ0NsgIAAAAkBvaSXj48eqBs 0GWTxL495947
Vew7UPD5jx4o21l6Pc4+QAZJe2Q04epH9I+edJ8DAAAAXSExSHr5cMiUBza/ +TwR9SLauXqf
MQenHiCzsgLvg50nzQH0j550yQ0S+/CNq2LXKjXubHsKts506feshY2FOnDX AAAAbZsYJDVg
3KwB42bhXANkNHOwcyIyGss4DXZuevGdzVcNKzqZJEy6T9/wojF91bCiF9/Z fN+Pxtmu2Kax
b+KoJqnG3C0/vPbZNbIIAABIidDyTaxetay1jmbU3CV4SwA6J0WRZVmW5Zjx F26sq6k87r7K
h59vvv3Ki82nZlZARLdfefGHn29OKZI2rqknDkRoiHtq277fmJ9qbG3uN/Ex cV/uB5BqAtPC
XRsnDeOoAABA+yUGaIkI0B3ouhoM5gaDecFgXk5OXn5BkSxL1qsD1kfD+v2V vXoEbbfWq0dw
/f5K95jYS0TLm8V1KRbX95eZErgkFWYYHVerx2WA87h9mbtImnu0267NMkgP AAAgqfZofGy1
Y80j5vS5U9H6ECBjmIOdc53rupZ0sPOWsA2sncYtSbo1p7sELt2F2a7SitVy 2nnXZjMG1CwC
AIC2TQy8xwFfr37kvGlPWp4uOG/aU3gPADKCOdg55zrn3H2wc8NVw4pqG6K2 i2obotbmB+nx
OJY5RgjBACkAANC2iYH3vgsXL/qt8et857wzlROvqxEpUh+OhhqC/tjiRU/f 89ivbl747tqF
t3S231H8iAJYmYOdc2pquesy2Lnh2kvH/fGvX9x+80XGU2vj4z/+9YtrLx2X 6jGk/am09vzT
zh/tjv0yQUoAAABtnhik1Hdho5KlFo1fMFs2nvoCFOzdtGj4RCKisiPVnfPX F+kBgJnzpzGO
wX0/GveLkr+YT62Nj9fvryxdPM49nE2aDNgOIu4+DLn1c53YQ2hcyVRvNbiP re7yAtto1/gG
AwCA9kgMyNJ3oSj6VFVx6bvw4ScenP/QH0ge6rSpRbMmG/0RPTxjfNrH0xa/ f/hNBfCYAzix
HbLAfYCzlAYsT6M6vm1fpeTcsCFxaeIWEou5V21qn13jGwwAANopMVAU4w4A JyJZjilytLGu
1qlwXcRPcp39smNvT59w2/QJI132Fdd3R+JlP6fxgBJ/IN1/MuN+yxOvLNr+ 6pt7dyofd/z4
wYZuxXaAs676YhM/++32YUc+AAAAHZYY6Lqam5tvTOfk5BHRd3t3GE+NforM xzGvrJtPVPaT
U1Z/+owbqDmxYGw558SIOCPGafmyObbReRo/k4kdfbh0/eHSkDFuLduS1plO +03MagCgFXX4
xyqxt9Du89oBAKD7JgZm34WFhf1PVBx26buw7JV1uT84PzhyeN3HG/KvmBTd vSe8ddtNj862
3WzJo+94D/qThtcu9Y9TzTFS+lVGl+EAAAAAkFnSH+Csvrayqvxw5bFDRFRV fri26nhjvWNV
ouDI4YWzZuZe+L3CWTODI4cTkRRWpbAihVXLn/LSL99b/ebtrfjyuAWlMvxQ YhLifa309gLQ
5bXiKOkAAADQ6tK/Y2D2XbixdEXl8YPufRfWfbxBDYWK759X8cLS8FfbiSgc ihEnYsQ5GZfX
X/3d+k1rZniJ9a31c9xrBLnPTLoIAFoRRkkHAADogolBen0XWjWGZLI0LFj+ 0qZt709zyQTM
ae8Hmbiie2eCTksT56e3HYBuLqVR0gEAACAzEgNKse/C/CsmFc6aWfHC0uL7 51WXrKx6a9WS
F76wFthZeqN7iO/0NLG9r+1Sj3OcduSylm0vQ0m3g3sU0A0hKwAAAOjMhJZv wku94ejuPdUl
K8Nfba8uWamUVxDRztLrrX8Zd+JYM4T4AK34XXHK19PVjySdAwAAAK0lq+Wb 8HIVMLx1W3jr
NiKqemtV1zhxyAcA2uK7wpoD2A6A4DI4mm0vw7ZDjtiuiw81AAAgMWhzIz5e ixMNAN7bGLz4
zuarhhXZLrpqWNGL72y+70fjvGTs3sN9ZAUAAADtVJXIo1Fzl+AtAeiqvN8x +PDzzbdfeXHT
l9Sk+8xHIrr9yos//HxzSw7DqARIzTcT4h5NceXjZgIAACAxaNGPPQB0Z8ZF BPdHw/r9lUMH
9jbyAX3Di0Skb3jRyA2GDuy9fn+le9Bv7Y4sMaa3jjGSeEvBHITETBUwLAkA AHQTrVCVKKUu
CHesBMTNnAAAIABJREFUOdl28NypT+INAOg+4sZEt300DezXy8wKDEZusP/N x1x24d6BmJdu
ygAAALqtdr1j8PXqR86d+qT59/XqBXgDALoP79UOrxpWtGt/uXmXoOnbatJ9 +oYXd+0vd2p+
AAAAAC2R/h0D7wOcLV70WyIi4nfOO1M58boakSL14WioIeiPLV709D2P/erm he+uXXhLpzov
XaCLEvSyAp2N94sI11467sX3Pr528hgjNzAfiejF9z6+9tJxOJkAAACdJTF4 ftljtjmA7fxG
JUstGr9gtmw89QUo2Ltp0fCJRERlR6o7ZxzcyWPrlne8aC2JRALamvdqh/f9 aNwvSv5iTJtt
DIyn6/dXli4e5/Jf2pyOG4M8bvhz770Voc0xAAB0E+lXJdI0VddVXVcZY5qm apoiRRttSz78
xIM1B7eSXGf/R7Ro1uRRc5eMmrvk4Rnj0z6etghqMzRQTu+wkRVAW0upowJj yIL4LyznQQzI
0m7YbCsc99RajOxGPXcaVR2NjwEAoDtIvyqRohh3ADgRyXJMkaONdbVOhesi fiMHsHHs7ekT
bps+YaTLvuL6GDHHLbJO2F7wtq7oNMe2vPk0boykxO1Yj8qpfNzxJ927+0YS DyPuAFwOI/H+
QNwWUtov0glISUodFRi5QdI57QD/2wEAAIlBst9sXc3NzTemc3LyiOi7vTus P//m45hX1s0n
KvvJKas/fcYN1JxYMLacc2JEnBHjtHzZHNvoPI2f88Q42KXmTFx566K4tWxL Wmc67Tcxq3F6
mR4P3mkVp8NI5H4SbPeLSkeQngzt2hj/2wEAAIlBEpqmhUJVmqYUFvY/UXE4 Fo1IkQbrz7/5
WPbKutwfnB8cObzu4w35V0yK7t4T3rrtpkdn22625NF3vAf9SSPUxMrB6VUX 9rJWXIzetcMX
5AaQhlTvGAAAAEBmJAb1tZVSNKIqMhFVlR9WFVlTFafCwZHDC2fNVEOhwlkz q0tWhrduk8Kq
cbfAGtm+tvBPH626ve1iZZd7Ah6DYC9rpbeXDBJXBwmfIgAAAIBunRjUVB5r rK9VZXlj6YrK
4wc556LouLW6jzeooVDx/fMqXlga/mo7EYVDMSMv4JyM4PnV363ftGaGl6jU WsUlaZ0cl5lJ
F7WDzL30jt5aIFW4XQAAANAFE4MH7lrkfRwDW40hmSwNC5a/tGnb+9OSBqAp xdCJK7rHsk5L
E+ent52UjtbLq07a8WLSl5+4BS/7RVtMSA+qEgEAAHTBxCClHICI8q+YVDhr ZsULS4vvn1dd
srLqrVVLXvjCWmBn6Y3uQbPT08T2vrZLPc5x2pHLWrahedLteDnaFr5q26jd 5YU4vViPWwZI
ClkBAABAZya0fBOrVy1LWia6e091ycrwV9urS1Yq5RVEtLP0eutfxp041gxR MkArflec8vVk
N44BTiMAAEAbyWr5JrxcBQxv3Rbeuo2Iqt5a1TVOHPIBgLb4rrDmALbjGLiM cWbby7DtkCO2
6+JDDQAASAza3IiP1+JEA4D3NgYvvrP5qmFFtouuGlb04jub7/vROC8Zu/dw H1kBAABAO1Ul
8mjU3CV4SwC6Ku93DD78fPPtV17c9CU16T7zkYhuv/LiDz/f3JLDMCoBUvPN hLhHU1z5uJkA
AABIDFr0Yw8A3ZlxEcH90bB+f+XQgb2NfEDf8CIR6RteNHKDoQN7r99f6R70 WzvOSozpjV6/
zPKJre2t3YIZBayrAAAAdFWtUJUopS4Id6w52Xbw3KlP4g0A6D7ixkS3fTQN 7NfLzAoMRm6w
/83HXHbh3oGYl27KAAAAkBi09Mfei69XP3LetCctTxecN+0pvAcAEOeqYUW7 9pcbmYCZGxjT
H376jVPzAwAAAOiYxMD7AGeLF/2WiIj4nfPOVE68rkakSH04GmoI+mOLFz19 z2O/unnhu2sX
3tLJzxQ6LQFoN9deOu7F9z6+dvIYMzcwM4QX3/v42kvH4RQBAAB0lsTg+WWP 2eYAtvMblSy1
aPyC2bLx1BegYO+mRcMnEhGVHanOlMDd2AuSBIA2dd+Pxv2i5C/GtNnGwHi6 fn9l6eJxLp9Q
czpuqO+48b+991aENscAANBNpN/4WNNUXVd1XWWMaZqqaYoUbbQt+fATD9Yc 3Epynf0f0aJZ
k0fNXTJq7pKHZ4xP+3jaJ1JHPgDQPowhC+K/sJwHMSBLu2GzrXDcU2sxSjaq t3UscDQ+BgCA
7iD9qkSKYtwB4EQkyzFFjjbW1ToVrov4jRzAxrG3p0+4bfqEkS77iutjxBy3 yDphexXfuqLT
HI/lzafWUZMQKwC0aW6QdE47cP/SAAAAQGJAuq7m5uYb0zk5eUT03d4dxlOj nyLr4ytL7qr8
8o3ovnXBM68pGjt7zl2vGxmFkVgwtpxzYkScEeO0fNkc21g8jZ/zxA5JXLoo SSwfN8daGCEC
QDeBDzsAACAxSELTtFCoStOUwsL+JyoOx6IRKdJgLLLtgjC6b93gGb8+tOoJ Gjv7pkdnOW22
5NF3vAf9SXOGxMrB7tWFUZkYAAAAALqn9NsY1NdWVpUfrjx2iIiqyg/XVh1v rHesSlS58dni
C0ZPPefc4gtGV2587oeDBSmsSmFFCquWP+WlX763+s3bW/HlxdUwTjpWkW2N ZAAAAACALi/9
OwY1lcca62tVWd5YuqLy+EHOuSg6bi169Mue/UY3T28honAoRpyIEedkXKZ/ 9XfrN62Z4SXW
t9YLcq8R5D4zvfIAAAAAAEgMmjxw1yLv4xgcen9B3sBcIvrN/MuIKG9A7uH3 FzSKD5GlYcHy
lzZte3+aSyZgTns/yMQV3Xse9F4+1R4PAQAAAAC6ZmLglAPYq99fMHpM6EjD 48989upZYwsG
n964+Zslb35hLbKz9Eb3EN/pqbVLQZelHuckLW+7FwAAAACA7psYmIx+h1wK HD1QNuiySWLf
nnPvnSr2HSj4/EcPlO0svR5nHwAAAACg6yQG7lkBEQ2Z8sDmN58nol5EO1fv M+bg1AMAAAAA
dKnEIKkB42YNGDcL5xoAAAAAoNMSWr6J1auWtdbRjJq7BG8JAAAAAEBGJgZJ qxIBAAAAAEAn
1x6Nj612rHnEnD536pN4AwAAAAAAukhi4D0r+Hr1I+dNe9LydMF5057CewAA AAAAkMGJgfcB
zhYv+i0REfE7552pnHhdjUiR+nA01BD0xxYvevqex35188J31y68BW8GAAAA AECGJQbPL3vM
Ngewnd+oZKlF4xfMlo2nvgAFezctGj6RiKjsSHXLXwljrB0GHWvhXtriIL1v M66kdVBnYyxn
l+20z+kFAAAAgAxLDIhI01QjsBRFn6oqRFyRY7YlH37iwfkP/YHkoU6bWjRr stEf0cMzxqd9
PBkRtnaeg0SgDwAAAACtkxgoinEHgBORLMcUOdpYV+tUuC7iJ7nOftmxt6dP uG36hJHuUawZ
WJsRbdyEbaRrXdFpjkt56zatu7MWiCufmAM4HXxKKyY9TpdDStyvU0rgsh2P SzMlQwMAAACA
VksMdF3Nzc03pnNy8ojou707jKdGP0XWx1eW3FX55RvRfeuCZ15TNHb2nLte NzIKI7FgbDnn
xIg4I8Zp+bI5cdFqerGmbVifOMelvBlSWxfZbsFp+07pSnorOh259altJpN4 8MYuEme6bMfl
heP+AwAAAED3TQw0TQuFqjRNKSzsf6LicCwakSINxiKjnyLrIxFF960bPOPX h1Y9QWNn3/So
40DIJY++4z3oTxqPWq/EO81xX5o0Rk8pP0k7sUlpUeJLsC3pkiOlcaKQG3j3 1bYPBUEgIkE4
5TSKImOMMSKBMZ1zgTFBEHSu65wEFn+6cRq7Hibgbe2CuKbjJHS5zyqzfmy5 bvPbp+tcEJhu
WSQITCcineuW30rB2JTAiEiSlAvO/TecXcjUxKC+tlKKRlRFJqKq8sOqImuq 4lS4cuOzxReM
nnrOuSvWLqzc+NwPJz747i7ZuFtg/f58beGfPlp1e2t+I7veE0haPtXtOxVw r8CT6ooui5K+
wDRyEi8nKu2X2d384+tSIirs1UMUhawsv5EYiIKPMSaKWUQkiD4yPxUu7yBO clePNqALZQb4
tHaDTyvnRkBjPjrRtfhISVUVIlJUWQ3K/7ujVJbViy+8HicYMi8xqKk81lhf q8ryxtIVlccP
cs6NyMZW9OiXPfuNbp7eQkThUMz4AHHe9Pl69XfrN62Z4SVitlZuca8R5D7T S3nvtyZcCljr
7aSaeJgrxu0i7W229ncjs62eBLZZQTDgD2T7NE3LEgRqvqSk6YpAoq5pgiha Ly4ysWlgclxx
BADoPHRq+k4WSDCfWq+m6Zp2yg+lIHBdt6x+ylLrXYWiXj2isvy/O0px6wAy LDF44K5F3scx
OPT+gryBuUT0m/mXEVHegNzD7y9oFB8iS8OC5S9t2vb+tKTBcaoX3eNWdI9c E8snZiBmGes0
JWvOSwnV99Nb0XaR0yG5vMC4Yl624/7C0fI4qS//8UFO0C/LqhHtR2MxisWI SBAEQWCCIIhM
0DTNqGLEGNM0TRRFIjJmGnOISBRFbpxsHacaICOCSHxUuxqBmE6cdC4Igm6J +DknzoiI6zrn
jOx7/mj+lWyqI8qY1nzpxyijqRoRbftm/fljrsKphoxJDJxyAHv1+wtGjwkd aXj8mc9ePWts
weDTGzd/s+TNL6xFdpbe6B7iOz21bVbrtGLSOSntyEt5pwKpruiyrvdDct9I SqfOfS9gS5KU
QHaWrKjGU1EQjDpDuk6CwFXSiEiwxBC6pjZfT9LIrLF6cibOOQBAx6Z9TTG9 ZvwIciLe1OJA
53riT2zTv5bfTWMD1t9QjXNV1eobwzi7kGGJgcnod8ilwNEDZYMumyT27Tn3 3qli34GCz3/0
QNnOUlShg+5i05d/zssJKIpq3l4WRdJ0XRQETdfjfmWsLZLjon/zGZKCLonr qDMGkCEZgdOX
cHOMb437ExaSNQ0wJlT1ZP0iVdVyAr51n7x7zeW34FRD5iUG7lkBEQ2Z8sDm N58nol5EO1fv
M+bg1EO30hiRfFmikQwk+b1J+MHRdF1ggnn9CVkBAECHJvHN38JGNVrjPj9R Q7hh3AU3MOZL
Oc3Qo1v+sU4QsnWd67quqJqm4jIBZGxikNSAcbMGjJuFcw3dVjgcy83Njpvp 3lDbuJPQlA9w
0nExuVtFG9CV3lWcgq6LNacERMQ5v+j71zDm+2z1B1yRuKromkpc45pOjBn3 DjhxIk6aSkRc
56SruqapQvY198696PtXbfnHBvPXQdP0hvoozjC0P6Hlm1i9allrHc2ouUvw lkAX/PEQBePH
IzFEEJhgBIRmnSKzcZp5l0An0hMjSPx1vT8AyJgsnlu/1Y2nghD8bPUHYiDX 37NI7FEo5hWI
wfys3HwxkCcGeoiBHlmBHmJ2DyHQk/lzBX+QZQUFwafL0ur/+4og5Bn1SAVB wOmFDtQeVYkA
wCAaAxeIxBgTGCN2MjcQmMCN7nubeqs4WXdIYAnVh9AtbBeNNXAOADLjco/D l7CuxLJzCogY
kcyIcYGRLhAz+mBsumFw8o8xEgTGBCXa2PRtLzBd51m+rJik4CRDpiYGSRsf W+1Y84g5fe7U
J/EGQDchCEJWlkhEgkiMMWrKChhrzBZrc2ONvEFi2/bUVMuqqmg98rX+Q9mw Yf4e+YzQqKA7
xRo4B13wXcUp6JpZvMMASoqiKBIR55rKNZW4zlWNdF3XNeI613XSdSLeNME1 0jkjZvw3EbNE
ItJllYhEEfcNIGMTA+9ZwderHzlv2pOWpwvOm/YU3gPovh+/qrzcrL56QVZ5 LLzzSH2FpMuy
FpPlEyHlmz2x3UPYxZf0GDIkiBMFAJAhCYOmKzEixjV54i03EtHfSlYYLQ04 10nTiGuc61fe
PY+I/vrSYs45ExgTRJw6yPjEwPsAZ4sX/db4vNw570zlxOtqRIrUh6OhhqA/ tnjR0/c89qub
F767diH65IIuy+/3GZVHGWNNtwuIeK3oi+SJ/fxqIKCElECuLyYrsixLMVmK ydFo7OttUkND
ZNq00wp6n/I5HXnWJFHMOla+qzZ0tFfBwAH9ztY0dffeDU57Hz7sUlH079rz NyIaceZlRFS2
7zOXMl44bce70SOvMCZ0XVfUaENjVcWJvSltwemYU30tAACpOjlgWVxioOuk KZwxaq4LOmXW
rZ+89iZxneka5zrXtSvvubuptK413VBKuK+kYcB7yKzE4Pllj9nmALbzG5Us tWj8gtmy8dQX
oGDv5p/wiUREZUeqO8nn3PtAXSkVBhCzRKOjUuP7X2CMyoMqqZU1UmOWJklK NBKLyXIsJkcl
OSpJ0WgsIsW2bq07bZD/mmtOM5sf65wUJSqKPYKBnrV0NBjoSUSK4tZ5hc8X SHp4ScucPuQH
2f5cl/QjPf/a/XGvgoF9+wzr03uIKGQdK9/lfV2nY/byegEA2oSucl0nxrim bXjr3Uk/voWI
Lv/pTz55ZTlxTlw3s4K//v73xJoaLxu/CyJjGueCT9QVDVWJoKOk/z9P01Rd b/rTNFXTFKm5
9Uych594sObgVpLr7P+IFs2aPGruklFzlzw8YzzeEujizHrkihipCh882lBe 3nD8eP2xYyEp
pkQlOSrFIlIsIknRqBSJxv73HycEkQli041mgVFUqiciny9oPhpzvCjb91l6 l/lzgvmimNXy
7SSqDR2trj1MRD17FON/BwBkIutlQq5pXFONxmGfvvG2MfPyO+dwzq+4+2cn swKj81KhuYVB
0+8D2qRAB0u/KpGiyObHgXNS5GhjXa1T4bqI38gBbBx7e/qE26ZPGOkaSjV9 VIyL9Nancbfz
nEq6lEncUeJeXDaO+wbgnSgyI7gn4ozEinNO8xNlcfL371U0coCq6ZrOVU3X NK5ppGq6quuN
dQ1EdUTEBIFzTpyXV+zqVTAw258jCCzbn0NE5Sd2G1WVhg+baITviiLV1h2t rjlw8hqAwM4e
frkxvWvPJ8bEmaeP9/kCmqaaZWw3Yq44euQVu/Z8Ered04eMDWT3ICIp1vDd wS+NRWcPvzwm
R3xZAUEQEg/GelREVFN7oLhoGGOC8dTYvhRr8GUF9+zf6LQLg1GxKhqtO3D4 q8QtJ6549vDL
w5GaQHZPUcxSFKm+oaJnj2LjJFTXHqyuOdCveGSP3KKsLL85B/9vASCRrvOT MQbnTXVEdY10
jZhAnHOuc6JPXv/j5XfcTkRXzLvTKPvx4j8wgThnTTHUqVGEyBj5RDELdwwg 0xIDXVdzc/Ot
c77bu8OYMPopMh/HvLJuPlHZT05Z/ekzbjDzbMaWc6MvL0aM0/Jlc+KCdWto 3tR5cHNoHjfh
VNKc414FKHF1lxWREoDXj1mWIDImiowxZjY24ER5f9+1vjzWIClSLBaRYtGo HJWkSDQWkaRI
NBaVpKgkBwLs2rXXn0xEiYhIVWWjwozPF1BV2dyREUYX9h7at8+w3gWD4oJa a0xvBM0+X6Ch
sfLIsR3W+YkbMVc0MgHrdoYOujCQ3aOuvlznWq/8gUMHXWgG6Nn+nBNV+0Uh q7D3kF75A10i
7IL8gUQkK2HrzFgsbNwJcdmFcbSnDTi3R17R4NPOP3Rkm3ULRlbQ0FipanKv /IGnDxlr5Aa5
Ob3r6stjcrhvn2GFvYecqNpPRH37DCvsNaS65kB+j/6CIByv2F1UeIZRUwsA wOm6hhmqNA1a
r+tc15glqmfEP3ntjct/Ott4+snLS5gokK4bOYWucSK9uUYREzjXGSPONVX3 +ZAbQEYlBpqm
hUJVmqZwneu6FotGpEiDscjop8h8LHtlXe4Pzg+OHF738Yb8KyZFd+8Jb912 06OzbTdb8ug7
iTO931zzUjIu6HeK8hM3hXYF0CoYYwIjWdMaLzn7EiKdk6Zz3bhXYHfHQGD1 RMSJM8aMn56Y
HM7K8g/sP8aYZs2/T0MH/cDvzzUGRsjK8jPL71bitN+fS0RHy/9pLjImPG7E eJod6EFEx0/s
JKJe+QOzAz2sZWpCB4mosPcQny8Qt665hYKeA/v0Pl3neqjumLWMsc2ku2AC O1r+z5FnTglk
94ybb75AY0W/P9csYGytb59h5kH27TNMFLOYwDjXiYRsf86+A58nvmQAgDhc 5yfzBF3nXGMk
kHG1kzFOzMwKiOjyn939t2VLiDFOxmVNIuLGCMqCyDgn0rjAGO4YQOYlBvW1 lVI0oioy5zrn
XFVkTXUcjyM4cnjhrJlqKFQ4a2Z1ycrw1m1SWDXuFlg/XK8t/NNHq263+dR5 C8dtI37bTZm1
gLzcPbBdEf91IIWPmT8rvot6xnhA7fXNd//7bc2XR0MRSY5GpUhUikixSDQW jUpSLCbFFCkm
3//z89mEUURNV5RExjjnMbkhN6dXMJBPRDG5QWCMiE4ffLHPF6hvqCg/sXP4 sMlkNHE2L24l
TDcPrHbKfO8bMZ7GbURggvtO44w8cwoRyXIkVH+kvuGYbXmPuxDFrLj5xorG LuJWdDnI2rpD
vQoG9+41OC+3T31jeU3tQfwHhhZFjTgFXfv95fyUyweMEzduGgjGV/2UWU1R zafLX5885w4i
mnLX3Z++uoRxbs0NiEgUmKaTKBLTGRFliejDFDIqMaipPNZYX6vKMm9qZsCt bRPj1H28QQ2F
iu+fV/HC0vBX24koHIoZeUFzxTx69XfrN62Z4T30b+knOZW7EOZOU1oR4OT/ IoGMS0pmbSL/
aaoiZQ8pyt1fVV9da9QgijXVIIrJUkyWY+qll/S/8vIhAjGdTjanYYxV13zb u2CwUZuouuZb
Y5HxtKJyl/lf1Pp/NXFa57rAhLj53jdiPI3biM51953G2fvtBpeNm9tMYxfm sdnuwmWt2tCh
2tCh/sVj8nL79O41tDZ0CP97oUWffZyCLk1vjg2aggTGGdeN646MsUk/vrUp K3jjDWLs09de
nfzTuUQ0ee7dn762hBFxjTORseb80cgNkE5C5iUGD9y1yPs4BrYaQzJZGhYs f2nTtvenJQ3i
3bMC26jdpeGy0+q8+SPtsmJiu2cAJ8YtYUEUqPl2M2Msq5D7GpXelDteGChk sa/KjkSiUlSK
RSVZismxmDrh0v4/nX3OgAE9iEjQT/6HNlJxWYn4fTmyEjEveMdijdnZeYW9 hmRnN9WML+w1
pDZ0iHOd2V1lV+RIdnbegH7nlFd8Y873vhGjvBxrDAR69us7ShBEIpJjjSnd MRCc02xzUdJd
9CseY5wQoekj2XSoklSXE+w1sP95nOs5wV6xWOPR49vcD0xgbPCgizRVPnp8 W97pE5nrEQIA
mOlBU5DAOXFOpBGnST9pvlfwxpuMGGecicLGN16dOHsuEU3+6d2fvrZYaKox xIlIFAVd50Y/
pb4s3C6AjEoMUsoBiCj/ikmFs2ZWvLC0+P551SUrq95ateSFL6wFdpbe6B7x 2z51mUi6btId
JV0RKQGk+NPByTrMGVHe6brYQy4O+K/IH/r9s/u/+d9bD5THfCIfMabPpRP6 X3n50AH980jn
nBGJTFd1IuICMWLESVGifl+OokRZ8xXJo8f+MXDA93v3Ol2S6o34PisrwIg1 NFb0yCvuVzym
ouJfTckFMaP84EFjc3MKTx8y3pzvtJFwuCovr++w0yd++93JXkoZsWPHtw8c 8P0eeX2JSJLq
jx3fzixXSJ2m3WfGLXLZhaxEhp0+0Zg4cuQrY775esvL/9m/37nBQD5jgq6r kWiNuaLLQcak
euOVappcV3+M4YIvtBD+B3U51l5PmmtmsuaAgBPXiQvm4DMbSt4iRtzohIgx YmxDyauTZs01
nnHGGeNmx0SCwDSNi6IgCGhjAJmWGKQkuntPdcnK8Ffbq0tWKuUVRLSz9Hqc feheF5MEZlZF
FahpOtiH5/U1fj984268hIiMnxduBhNCU4tj1tTVadOCqqpdVUTGRSZzR+UV 2+N2LYpCbe3+
2tr9xvTBQ59bVzl67Ku4wk4bqa7ZU12zxyxj3Y61vLlla4G4nSYWiJO4yGUX ifOtr/dE5Tdx
ZZwOzJw2XyklnF6ANGg6hrDtcrmeXaXE5uCeExntj+nTN96ISyiIuHFLYcMb LxPXTw5hwBhZ
u0DEKYYunxiEt24Lb91GRFVvrWr/tB6ggxMDjZPv5C/KKZXa435v+CkT3LJY oOZOryl+EQB0
WiIu/XaPlK+5R2muM51xxomY8TXNLFmBMaqZppFxl4Drus41S6TCGBMEo586 5JPQdRODER+v
xYkGsOarOiORGBG53y9mnDgjEpgxiKZtCgFd5z8Gkj2AjEr5Em8HqSxAcowE zhgjnZo7LTXS
Ay4wIkZc04nrxDkxrmu6oupCsCcldK+iahpOMnTNxMCJMQIa3gPobllB04Ul nRORRjqzpAf2
oWFCVoAIEgCgY9lVEuMDvn/Vd1/9VYmEBUHgnDhjzUMcE3HOSCNuzOPGhKbp LNBj+s/v5lzF
KYXunhggK4BulQ9Yf04ExjgxImLEhFNH9DCTBNuqyUJTT6O4X9DF/5MAQMZ9 bLftXnf+hdec
d+Hc1Deibi9bH/QFOee6ju8B6K6JQcvvGMybdOHSDV/hXYRMoSqa0cRMM8c0 4KQzJugnu6Qw
q5YyQSAt/hdCE4zeSomjo+suB2OkIN+DDPq0GiOkcs51zgXGGGM9snP3fruR N1/rMd5466da
13VjkSAI3NL7OREFsgLGhCAwDbkBdM/EwHtW8Pkz48zpS+dvfuKagcb0wCCZ 079edxRvJ3Rm
iqqJRGFJEZlgdk8kCvG9WwgCAkSArkNDYtDlCETEmO2dW958o9fS9zkZA5ix k7kiMWZ0YnSy
lE5kdHEqiiwLgxhA90wMPN4xWHPf8Kkvnuw98Mj29UT0n2veqNm+549L/3Lf 0odqtu9Ztugp
vJeQEUQmEBHXuZEbWK4MNU9oib80nIiYwMwJnMYuieMyIUB3ziGbfiREWdaI KEtEegDdLDFK
FBWPAAAgAElEQVTwkhV8/tS46x55KFbxshSSJEmSQnX5Q24goprte04crd57 sMqYwBsJnZkg
MCZkFeTmRiKRAQOH4IQAAICtulh1TFIaG2K+bD/OBnSvxMDLHYMYqRT4HhEF +lGAiIgWzf6v
ANEfl/5l78EqInr8v14/a0gfQnsDAAAAAIAW6MiBVzy1MVCIpHLr36J3lhPR fUsf+s3/uYOI
fr/u/9w+7wYiss0KWDNqrsNtHbAwbqgpAAAAAAAkBh1g9aplSR8lIpJC5t8H v1v437++efTo
vn/59cObVr961YWaMTF6dN81889PzAp4M+sc20UAAAAAAN1Zx7cxcH+MNcRI ChnlP3jljet+
Ps92U6FQaNNbKxPnx40jiDQAAAAAAMBWx98xcCfJMSKJSPrglTeuu3Om9e6B +WdkBVOf2Ra3
rnFDAPWFAAAAAACS6uy9EsUaYiTVffDWuut+fDNJscQCIcq2zQqs6QESAwAA AAAAd539jkFd
g/rBW+uu+/E1xn2DuD/3rMBsXpxYg8i8k4CcAQAAAACAOv8dg1/8v6Ovzzv7 nSVrnQrcsXSX
06K4fMD9KUCbQgoKAAAefy80TcN5gG6XGHgc+dgl9AcAAAAAgFbR6ccxAAAA AACArp0YeGlj
AAAAAAAAXTwxAAAAAAAAJAaoSgQAAAAAgMSgxVWJ6so+OljSu67sI7yLAAAA AAAZnBi08I5B
aPOtBSP7hTbfincRAAAAAKCFOqC70ueXPZY484G7FqWcGBwkonIiqiv7KH/E 1V31HbIdoK1V
NmtMdIbxHDrVwXTeJP6bXeLGL8Qjx7MaIn5VI01TGSm5QW1gsXbhedolY8nv x1kCAACAjEkM
nl/2mG0O4DRf+NlHY4sjsSxfTPCHAnlSli/sDypfH9VfvnrojBWhzbcWDO0X 2nBr/oiapBGn
dYQpMwCNG3YqLjC1XaXtgvi41dsoJbB9RXGheWKkHncq3M+b+/Enrhu30y6J 6+m/lb6SlTl/
+VgM5rDBg6l3MQ3Oo6wskmVfOOwLhejbY/zLHcqi52ovuTB6z5weA/rhew0A AAAyIDEgIk1T
jQhQFH2qqhBxRY45FS4+tOngoZNPs4mymyavzh9x9YFVVDBUkqQksa9tmGtO OwXfbR2XpxS4
t8++jBNlfeHGtO2pcD889ygfdwY8EjdtyXl2qT8nj84aTsXFVFhI+fkUDBLn JEnU0EC5uRQM
spwcf15e8T/3hG6adehHNw38xd3tcGx9ikdWVex2n9NNuLzwDjwnTrvutm8T AAB0xsRAUWQj
OCQiWY4pcrSxrtap8PF1i763eE7ifGNmCVHoQIjaqzZRYsRMDtfaXRaR5Yp7 0tjaaTvWYN1l
qe0Bt09CknhXAVLlW/J63nvvC8OG0YABTVlBz57k85EgkKKQrhMRZWVRMEiq SqpKRAWCULCm
9F//s8W37LnCwt6pxpHmdDcJHDtJiNymh+F949aSSB4AALqnDmh8rOtqMJgb DOYRUU5OXn5B
kSw3XfM3+imyPhLRrqrya4edlvi3q6p86IwVoXIqGFlQ/qf0myCzZrahre2i uNjdrAxDp1aM
MRdZY3czXvceOiduJ+6Oh8vSVkmEbE9F0pOTxjmHk1nBE8/2XFsqnHEG9etH ffpQXh4JAkUi
VFVFhw/Tvn303Xd09CjV1lI0SqpKgkA+HwWDlJ8/+kRN5KYf79v7bao7rarY bfxZkwRoa20a
gqe3cWQFAADdU4dUJdJCoSpNUwoL+5+oOByLRqRIg7HI6KfI+mh4dstXtpvK H3E1xYiIpJjX
eNQMpq1ht0tEHpcApHQlvu0CX9vmAYlLbQ841azA9lSQc3uMpDtqz3YUmZqv v/rHHp/+nQYO
pIICCgSIcwqHKRKhxkaqr6eaGmpsJE0jQSC/n/x+EkWKxSgWM2ZGs7NHNDR8 MeveA+8sGzp0
UNqHYVw2Ni8em9mC9bqybRwZN9/61JhOewsu6yY+jbv+7bIRly14efm2py7x TCae1bhHl9cY
d4psr+7bnszEpU4n2Xo2nLbZDW8rAQAgMWhb9bWVUjSiKjIRVZUfVhVZUxWn wp/Nn/xX5019
Nn9yfk+SykMkeapN1OqNXBOrDzlFwG0kLkVpi82mkatAi07+9n/mvPJHNnAg ZWcbbQm0SERR
lEAkQjU1VFNDoRBJEnHeVI8oL4/8/qjfH1BVpqqk61mch3y+0eHwfz/4aO7L zxUVFbYwN3CK
RG1rnriUjNual0rwTvuKW9djNZhUX4LLy4+b43L8Sc+t0+F53I7Lq3M/JJez 4f2NwAcWAACJ
QYvUVB5rrK9VZXlj6YrK4wc556LoeBhqJDxo3ASnpYc3/8/QO1fsLrl16EWB 3SW3XvRUjccQ
Nu0L1bbrJq0U1IHXxdN4sW3XQaq1khU+e44ee9pntCXQdWpoUEOhpwYN4tnZ j/z971nV1aQo
iizHNI0zJjKWnZUlCkK4Z8+HrrpqpKL8YvNmEkXGGNc0SRQv/lfZuy+/MfeX /5Gdne0xDYgL
GdOL/LzXRHLJDdr/xCfuNC73aN3dtSSqjrvbkN4RosIYAAB0cGLwwF2LUhrH IBYKyRV7mmJc
ImaZ4ESxUMjlLoFL5RbbxrvkXEUnaWUha118srQlcF/d4zEnfSEtD9njtu/S OalTGdttOnVn
hIELnOhr3hdPVAv5+aSq1NAQ07Q3x4699Gc/0xhbztjMP/zBR9RApBEx4+Mg yxVEi6+99vzb
bhP9/lVZWTNKS7kg6KIY07Sgz5f/1rtbJl5y2YSL2zpUTWM71topTtfO25P7 Tjv51fFUM4SW
ZBQAAIDEoDVzA++F5brQvg1byMgEzBiSEXFi7OScA1tsuixNvK6f+NRLA4O4 eNe9fYLL0sQO
UtM7Qi9rOR2wl1fqpU5Uqtskz+06uipOnl6y/HJJQBRJ0ygcJl1fccMN/W6/ fcqIEUS08Ze/
fFvTrl2yJEhERBpRgOg7otduvXXMnXfOmTxZJ1pVVLShsPCi5cs1v1/jPKLr P9D0t1f96Zxz
RvUqyO/YaNUl4E6pvk2HH3YnqULjUhcLAAAgYxID0+pVy6wtjG3d+MGJpNvx WIMIEpMc6mQj
H3dz/OBh6fgJX26uHIv5ZZk07aJDh05kZ0eIcogmDh4sPPzwX4PBKc89l0sk Eh0lWjVr9gU/
nXPbhAlEJBBNP/vso0eO1EciKpHOmKTrQcbkL7Zu2/bPKZMvbXkYak6bIXLc HKeSThG2bTEv
W4grk7iKl76VrI2h3Xea0vYTF6XX0VNKa7kX9nJIiU3Dvb+VAADQRYLDuB8G c3rDpxsnTZ5I
RIV9R+A0QbdSfaLM+hEwpnsMziOiqy7+URob3PJ1abbf1ysvLxKJ9O01wKlY bOnrdUvfLBDF
PEHIEUVR06i8/ODVV1e+/PLZ/fvnEhHR1srKshdeGPvkkwrRBw89dMbMmdMv vNDcQu1NN0X+
+7+13NyYIDRy3kjkE8Ut0ejBu+94+Jc/9/my8OZmKNwcAOgm6mLVckw9Xl4T k9V/mzIdJwRa
1/ov3iGihkONZoRDp1YoRaAA0FnEdu3VVVXW9ShjJAgikR4I5P7lL/WKsu+P fzyrsDCH6AdF
RXkPPXQoJ6deEC695ZaLzzjDXP3wjTeG/vznoM+nMybrusq5SiRzXkS0fvfe 4+UVgwcNxEnO
uHzAmEBWAAAA7aCzVyUC6D4avz2o6XpU04y6VSKRousxopzS0rpp0/a/996Z RUVBorN79Rqy
YIFOlGdZd/8VV9R88kmAKMYY13VF11UijfMYYz2JKg4cOnToCBKDjIN8AAAA 2pPQgftGVgBg
FTleIWtaTFVjiiKpakRVY5zLoigTZW/cGJs587sTJ1QiIsppzgo4kUz03bXX nvjkE4FIYUwh
UjVN0XVN01Rdj+m6jzGpMdzQ0IgzDAAAAJ00MVi9allLVq8r++hgSe+6so/w LkLXEK1viKlq
TNMimhZVVVnXY5qmEKlEOlHwb38LzfpxpSxbV5GI/jV+fPm6dT4ijUgTBIVz RdcVzo0/lXOm
60pUkmIxnGEAAADopIlBC+8YhDbfWjCyX2jzrXgXoYvomSdpWkzTZE2TNE1S VYVzjUgnEohq
iCqmXJGl69Q8UAYRiUTyrbdqRlZApOq6yrlCJOu6pOuyrsu6HmZM1XVd03GC AQAAwEUHtDFI
aYAzt8TgIBGVE1Fd2Ucuw5xZZfqYuxgzuIt/GouLIpXVTNcFIk6kEYlEnHMf UQXRlvvuu+im
m4oCAbJ08Oon6j1nzpc1Nf0efzxIxDnXONc4lzmXiWQinahO0xTG0CcsAAAA dK7E4Pllj9nm
AE7zhZ99NLY4EsvyxQR/KJAnZfnC/qDy9VH95auHzlgR2nxrwdB+oQ235o+o sQ2jzemWxNNJ
w/HW2hEyim4ueNYZJ/65i4hI13XGOJGu69m6fozokzvuuHDmzClnnZW41lk5 OQ3z5m1uaDjj
mWdyiVRdVxiTiWTOY4xxokrONb9PFEWcYQAAAOhEiQERaZpqBNKi6FNVhYgr smPt5+JDmw4e
Ovk0myi7afLq/BFXH1hFBUMlSXLclxkNtyQy9rJiq+yo7SAryAh5Y0bJ/+8v jHPGOXHOdT2P
8+NEH9xyy0WzZk2/+GKz5PZLLw0UFQ1bu1YhyiH6ft++yn/8xxex2LDf/97P eYxzmbEYkcJ5
FtExIn8wGAhk4wwDAABA50oMFMVoPcmJSJZjihxtrKt1Knx83aLvLZ6TON+Y WUIUOhCiVGoT
xcXu5rTLVX+jjMfbAkbJuG267CKlMtZDSmnLTodkOwc6Ss+rJ6uP/3/UXCOI cX6Y6H9mzx4/
d+4t48efzAomTz60aZNAVHfjjcUrVxYHg0Gii4YMERcs2Oz39332WYEoxrnE mMRYkOhLzvv1
69unTyHOMAAAALjogMbHuq4Gg7nBYB4R5eTk5RcUyXLTNX+jnyLrIxHtqiq/ dthpiX+7qsqH
zlgRKqeCkQXlf2pRE2QjbjYbdLoE/QYv1bWt27QG39Y5qZZJb8suh+TxhUP7 8A8a2GPYUIVz
iSjGeYRo/3/+5/fvvXeaJSvYdtNN323YkEUkEp3485+//fd/P9zQYNxxu7Bf v8lPPulbtChK
FCOKEXGiOqLdjJ0+dNCg0wbgDAMAAICLDqlKpIVCVZqmFBb2P1FxOBaNSJEG Y5HRT5H10fDs
lq9sN5U/4mqKERFJMcfo3IybU00V0lvRdiMtLNNaa5HDzQdkBZ1H7n13Cff9 VxURJ9KJTlu3
rnj6dIkol4iItk6ZcujTT7OJzA6GQh98IN18M7377vDevYlodHb23j/9qYFI I4oRBYi2cJ5d
XDRmzNl9+/bB6QUAAIDOlRjU11ZK0YiqyERUVX5YVWRNVZwKfzZ/8l+dN/XZ /Mn5PUkqD5Fk
X5uoTdsVtMpG0ttRa70ua/0ipAedwfnTf7jx/y6lbw9GiFQi9vXXlT/+sX/n TiLact11+z/9
NIdIJeKMCcZtIqLQJ5/sv+224evWEdHas846uG8fI4oRCUTVnK/j/ILhZ17w /fNwbgEAAKDT
JQY1lcca62tVWd5YuqLy+EHOuSg6HoYaCQ8aN8Fp6eHN/zP0zhW7S24delFg d8mtFz1V0+En
1PYCvJer8ulduU/7er91RY+Vo6B9DP7twr3TZtcIgqzrfqLorl2brr3Wl5NT 9uGHOUSymcgR
ccY0zjWiI6Wlf589u2bv3n379jEihUhjLEC0jvO8fn0nTBg3ZvQInFgAAADo XInBA3ctSmkc
g1goJFfsaYpfiZhlghPFQiHvbY5NiXFwyyPjxKpHcQ0AbIvZlknpaL2s5XJI aHncCZ1+ydh9
P7+z4PevVDMW4dxH9M26dSJRNpHS/G4Z//+N6kYqkUa0uaTEqF8UI1KI8oi2 cP51IHDlhd+7
YsplgUAAJxYAAAA6V2JAKY5lJteF9m3YQkYmYMaujIgTYyfnHNgi2QbHTnNc FiVmCGYQ77Rl
l+g81Tm2e2n5Wk6bQj7QbhilkHleueCBFd8d7PH++hBRlHOxOQ1QmlNisTkr MMZBU5ozBIVI
Iwoytp3ztaJ44bmjpt58/ZgxI3H+AQAAoDMmBqbVq5ZZWxjbuvGDE0m30yo1 iHDtHDqVmcue
L7nnl9lrP1AYkzknImN8MpFOZhjcaG9ApDb/iUQiY19w/r4onnPO2T++/Zar rpyIkwkAAACd
PTFImhW0p3bIB5ByQEqZ6o//8HRJv741S17vz1iMc2vPW0ZuoBNpzTcTBKJs omrG/sZ5WTDw
g3NH/+jWaTf+8N+yszGuGQAAAHT6xAAAXIiiOOfxh//8/fP+/vIbvb7a3otI JFI5N5OBpmJE
nKiKsa+JtopCYb/iH14y9oc3XD150ni/3+99d32KT9Y4qqrYjfMPAACAxKD9 eKlKBNDN/fCG
q887d9SHpX/7cv3ftH/sKIhK+UQBzhlRlKieseNEezmvzAn2Kew9eczZl024 eNLES4YNG5rG
vsx8oE/xSOQGAAAASAzaD7ICAC+GDBl019zb90+Z8PXX33zzr93ffneoNlQn RSVOXGBCdiB7
VEH+GWcMOXvkWeeeO/qsM8/IyhJbce/mnQRr2uA+x+kpcg8AAAAkBvZwxwDA I1EUh591xvCz
zvj36T9sz/1aw3dzOm5OXIjvZRW8oQAAAEgMTuE9K/j8mXHm9KXzN+NtA2ij NMCYiAv0nYrZ
JgMeIT0AAABAYkApDXBGRGvuGz71xT1OTwGgtSTW/EmM4ONuCMSthXAfAAAA iUEKWYFtDuA0
//Onxl33yEOxipelkCRJkhSqG3359Z8/Nc5a5tIF9vcQjKEJ4kYu8zLsceIq Thu3rm5dy2Wb
0D1xypj/AIm1gxJTAqe1vO8FdYoAAOwxBAzQbRIDItI01YiZRdGnqgoRV+SY U+EYqRT4HhEF
+lGgeebQSTNOZg4v3ZtOlGY3ALAR0HvfQtLySAYgQ5m5gTXcN1sLxCUALgUQ +gMAACAxcKMo
shE2E5EsxxQ52lhX61yaSCp32dqhvTVewnfbq/hJMvbmuN9LwuAlTwDo5MmA 7dPE4N6ppJcC
LpsFAACAbpcY6Lqam5tvTOfk5BHRd3t3GE+Nfoqsj5c//lXll29E960LnnlN 0djZa+afH7e1
/MJ8c+bUZ7Z5D/rNgL7tXqk1D0HOAAAAAABIDE6haVooVKVpSmFh/xMVh2PR iBRpMBYZ/RRZ
H4koum/d4Bm/PrTqCRo7+7qfz7PdZigU2vTWSttFttfy0wvT3dOJxB0hGQAA AACATCG0/y7r
ayuryg9XHjtERFXlh2urjjfWO1Ylqtz4bPEFo6eec27xBaMrNz6XPeRnJIXi /oyswPvtAu85
AGPMnDACfQP+3wAAAABAF9MBdwxqKo811teqsryxdEXl8YOcc1F0PIzo0S97 9hvdPL2FiEg6
paVyiLKTZgXphfLWtTw2Tki1GQMApAe9owIAAGR8YvDAXYu8j2Nw6P0FeQNz ieg38y8jorwB
uYffX9B3kDUryE/vXkHLa/+bdxJwAwG6ZMxtaJ8Ri1PdePt0dRqXe9iO6Jz2 iSVL902240K0
yttHdmNTOHVH2/IT24G7BgCAjEwMyHUss3j1+wtGjwkdaXj8mc9ePWtsweDT Gzd/886SHdYi
dyzd5bR2YshuzHEK5V2aBzhtymUaCQOckklSJt1KSoyA2zRo6z4RYZu+Uqc3 y3vM3fLDa59d
I4uALo6j6gF0p8TAZPQ75FLg6IGyQZdNEvv2nHvvVLHvQMHnP3qgzCUTAIBW D2SNIMwMxRLH
KEi8JGybYLjMcdm4++rWYnEbdNm7lyO0HpL7SM9x5yfV4DVuC+ZheDnmuNee amxtu/ek7yC1
0j2Nluw68S0GAICMTwzcswIiGjLl
Re: EReference.eKeys and code generation [message #410220 is a reply to message #410219] Fri, 15 June 2007 14:16 Go to previous messageGo to next message
Eclipse UserFriend
This is a multi-part message in MIME format.
--------------090500070909080406080801
Content-Type: multipart/alternative;
boundary="------------030406000805010109040301"


--------------030406000805010109040301
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Christian,

I see. It's kind of confusing, but there are data types in Ecore called
EList and EMap that are wrappers for java.util.List, and java.util.Map,
respectively. They are not related at all to
org.eclipse.emf.common.util.EList/EMap. Neither of these EDataTypes are
serializeable nor were they in EMF 2.2. If you really want this to be
serializeable, you need to define your own EDataType for it or, to make
the error go away, you need to make the attribute transient. I've
attached another version of your project that show different ways you
could end up with a java.util.Map<java.lang.String, java.lang.String>.
The first is just yours made transient, the second is to define an
EDataType like Ecore EMap EDataType, but make in serializeable, the
third is to define an EDataType specific to Map<String, String>, and the
fourth is to use an EClass to model a map entry with key and value
features of type string. The second and third ways will both by
default use java.io.Serializeable to produce a result that works but is
not human readable. The third way is more amenable to specializing the
serialization and deserialization (in the generated factory) to handle
maps of strings in particular. The fourth way will serialize nicely
without any intervention.


Christian Koehler wrote:
> Hi Ed,
>
> I installed Eclipse and EMF from scratch again. The EMF version is
> 2.3.0.v200706130003. I still get the same error. The example contains
> just one class with an attribute of type EMap<EString,EString>.
>
> I attached a screenshot of the error message and the test project.
>
> Christian
>
>
>
> Ed Merks wrote:
>> Christian,
>>
>> Are you using this week's build. We only just completed the
>> JavaEcoreBuilder work to support all the generics constructs this
>> week. Existing annotations should work exactly as the did before, so
>> I'm a big worried that might not be the case. With this week's
>> enhancements, you can use
>> mapType="<your.model.MyMapEntryClass<your.model.MyDataType1,
>> your.model.MyDataType2>" and don't need to specify keyType/valueType,
>> since it's available directly in the Java as say Map<abc.DataType1,
>> abc.DataType2>. If you are experiencing problems, I'd be more than
>> happy to help ensure that there isn't a change in behavior. Can you
>> provide more details exactly what you are doing. If you suspect a
>> problem, you could send me a zip of your project (merks at ca dot ibm
>> dot com) so I can try to reproduce problems locally...
>>
>>
>> Christian Koehler wrote:
>>> Hi Ed,
>>>
>>> even a EMap<EString,EString> does not work. I assume EString should
>>> be serializable.
>>>
>>> I don't want to steel your time with that, but can you tell me what
>>> the difference is in the old way and this direct modeling with EMaps?
>>>
>>> Thx a lot for your help so far.
>>>
>>> Christian
>>>
>>>
>>> Ed Merks wrote:
>>>> Christian,
>>>>
>>>> That validation error happens when you have an EAttribute for which
>>>> isTransient is false, but it refers to an EDataType for which
>>>> isSerializeable is false. So later, when you try to serialize the
>>>> value of that attribute, it will fail, because the generated
>>>> factory won't have the stubs that are needed to convert the data
>>>> type value to a string. Is your EDataType indeed not serializeable
>>>> and is that intentional? The same EMap support as in 2.2.x should
>>>> work for 2.3...
>>>>
>>>>
>>>> Christian Koehler wrote:
>>>>> Thank you for your very quick answer.
>>>>>
>>>>> I also tried to model it before explicitly as an EMap. I got a
>>>>> validation error, saying that the attribute is not transient and
>>>>> therefore must be serializable. No idea why it shouldn't be
>>>>> serilizable.
>>>>>
>>>>> I made very got experience with the old fashion way of modeling
>>>>> maps in EMF 2.2.x (an extra class that implements
>>>>> java.util.Map$Entry). Is that still supported and the default way
>>>>> to model hashmaps in EMF 2.3 ?
>>>>>
>>>>> Best regards,
>>>>> Christian
>>>>>
>>>>>
>>>>> Ed Merks schrieb:
>>>>>> Christian,
>>>>>>
>>>>>> If you want an EMap, you still have to model it as an EMap. The
>>>>>> eKeys on an arbitrary EReference "just" a constraint, although it
>>>>>> also affects serialization so that instead of @<feature>.<index>
>>>>>> it serializes as @<feature>[<key>='<value>']. We have thought
>>>>>> about eKeys also generating an "helper" method that has
>>>>>> parameters correspond to the types of the keys, and does a lookup
>>>>>> for the matching child, but we didn't get around to doing that
>>>>>> (nor is there a bugzilla feature request for it, yet).
>>>>>>
>>>>>>
>>>>>> Christian Koehler wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> I tried to use the eKeys property, but the result in the code
>>>>>>> generation was not was I expected (an EList instead of an EMap).
>>>>>>>
>>>>>>> I have two classes, A and B. Class B has a string attribute
>>>>>>> 'id', that should uniquely determine an instance (just locally).
>>>>>>> Class A has a containment reference to B, with containment=true,
>>>>>>> upper bound=-1 and the 'id'-attribute of B for the eKeys
>>>>>>> property. I also tried to add a reference to B with eOpposite
>>>>>>> set to the other ref., but that didn't change anything.
>>>>>>>
>>>>>>> Validation gives no errors. In the generated code, the reference
>>>>>>> looks like a usual containment reference. Means it's just an
>>>>>>> EList, no EMap.
>>>>>>>
>>>>>>> Did I misunderstand what eKeys is doing or did I forget something?
>>>>>>>
>>>>>>> Best regards,
>>>>>>> Christian Koehler
>>>>>>>
>>>>>>> CWI Amsterdam
>
>
> ------------------------------------------------------------ ------------
>


--------------030406000805010109040301
Content-Type: multipart/related;
boundary="------------030808030707050307020403"


--------------030808030707050307020403
Content-Type: text/html; charset=ISO-8859-15
Content-Transfer-Encoding: 8bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-15"
http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Christian,<br>
<br>
I see.
Re: EReference.eKeys and code generation [message #410222 is a reply to message #410220] Sat, 16 June 2007 04:09 Go to previous message
Eclipse UserFriend
Originally posted by: jaspo.gmx.de

Dear Ed,

thank you. That was indeed confusing me. I will use the fourth way now
(a MapEntry class). That seems to be the best alternative.

Best regards,
Christian


Ed Merks wrote:
> Christian,
>
> I see. It's kind of confusing, but there are data types in Ecore called
> EList and EMap that are wrappers for java.util.List, and java.util.Map,
> respectively. They are not related at all to
> org.eclipse.emf.common.util.EList/EMap. Neither of these EDataTypes are
> serializeable nor were they in EMF 2.2. If you really want this to be
> serializeable, you need to define your own EDataType for it or, to make
> the error go away, you need to make the attribute transient. I've
> attached another version of your project that show different ways you
> could end up with a java.util.Map<java.lang.String, java.lang.String>.
> The first is just yours made transient, the second is to define an
> EDataType like Ecore EMap EDataType, but make in serializeable, the
> third is to define an EDataType specific to Map<String, String>, and the
> fourth is to use an EClass to model a map entry with key and value
> features of type string. The second and third ways will both by
> default use java.io.Serializeable to produce a result that works but is
> not human readable. The third way is more amenable to specializing the
> serialization and deserialization (in the generated factory) to handle
> maps of strings in particular. The fourth way will serialize nicely
> without any intervention.
>
>
> Christian Koehler wrote:
>> Hi Ed,
>>
>> I installed Eclipse and EMF from scratch again. The EMF version is
>> 2.3.0.v200706130003. I still get the same error. The example contains
>> just one class with an attribute of type EMap<EString,EString>.
>>
>> I attached a screenshot of the error message and the test project.
>>
>> Christian
>>
>>
>>
>> Ed Merks wrote:
>>> Christian,
>>>
>>> Are you using this week's build. We only just completed the
>>> JavaEcoreBuilder work to support all the generics constructs this
>>> week. Existing annotations should work exactly as the did before, so
>>> I'm a big worried that might not be the case. With this week's
>>> enhancements, you can use
>>> mapType="<your.model.MyMapEntryClass<your.model.MyDataType1,
>>> your.model.MyDataType2>" and don't need to specify keyType/valueType,
>>> since it's available directly in the Java as say Map<abc.DataType1,
>>> abc.DataType2>. If you are experiencing problems, I'd be more than
>>> happy to help ensure that there isn't a change in behavior. Can you
>>> provide more details exactly what you are doing. If you suspect a
>>> problem, you could send me a zip of your project (merks at ca dot ibm
>>> dot com) so I can try to reproduce problems locally...
>>>
>>>
>>> Christian Koehler wrote:
>>>> Hi Ed,
>>>>
>>>> even a EMap<EString,EString> does not work. I assume EString should
>>>> be serializable.
>>>>
>>>> I don't want to steel your time with that, but can you tell me what
>>>> the difference is in the old way and this direct modeling with EMaps?
>>>>
>>>> Thx a lot for your help so far.
>>>>
>>>> Christian
>>>>
>>>>
>>>> Ed Merks wrote:
>>>>> Christian,
>>>>>
>>>>> That validation error happens when you have an EAttribute for which
>>>>> isTransient is false, but it refers to an EDataType for which
>>>>> isSerializeable is false. So later, when you try to serialize the
>>>>> value of that attribute, it will fail, because the generated
>>>>> factory won't have the stubs that are needed to convert the data
>>>>> type value to a string. Is your EDataType indeed not serializeable
>>>>> and is that intentional? The same EMap support as in 2.2.x should
>>>>> work for 2.3...
>>>>>
>>>>>
>>>>> Christian Koehler wrote:
>>>>>> Thank you for your very quick answer.
>>>>>>
>>>>>> I also tried to model it before explicitly as an EMap. I got a
>>>>>> validation error, saying that the attribute is not transient and
>>>>>> therefore must be serializable. No idea why it shouldn't be
>>>>>> serilizable.
>>>>>>
>>>>>> I made very got experience with the old fashion way of modeling
>>>>>> maps in EMF 2.2.x (an extra class that implements
>>>>>> java.util.Map$Entry). Is that still supported and the default way
>>>>>> to model hashmaps in EMF 2.3 ?
>>>>>>
>>>>>> Best regards,
>>>>>> Christian
>>>>>>
>>>>>>
>>>>>> Ed Merks schrieb:
>>>>>>> Christian,
>>>>>>>
>>>>>>> If you want an EMap, you still have to model it as an EMap. The
>>>>>>> eKeys on an arbitrary EReference "just" a constraint, although it
>>>>>>> also affects serialization so that instead of @<feature>.<index>
>>>>>>> it serializes as @<feature>[<key>='<value>']. We have thought
>>>>>>> about eKeys also generating an "helper" method that has
>>>>>>> parameters correspond to the types of the keys, and does a lookup
>>>>>>> for the matching child, but we didn't get around to doing that
>>>>>>> (nor is there a bugzilla feature request for it, yet).
>>>>>>>
>>>>>>>
>>>>>>> Christian Koehler wrote:
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> I tried to use the eKeys property, but the result in the code
>>>>>>>> generation was not was I expected (an EList instead of an EMap).
>>>>>>>>
>>>>>>>> I have two classes, A and B. Class B has a string attribute
>>>>>>>> 'id', that should uniquely determine an instance (just locally).
>>>>>>>> Class A has a containment reference to B, with containment=true,
>>>>>>>> upper bound=-1 and the 'id'-attribute of B for the eKeys
>>>>>>>> property. I also tried to add a reference to B with eOpposite
>>>>>>>> set to the other ref., but that didn't change anything.
>>>>>>>>
>>>>>>>> Validation gives no errors. In the generated code, the reference
>>>>>>>> looks like a usual containment reference. Means it's just an
>>>>>>>> EList, no EMap.
>>>>>>>>
>>>>>>>> Did I misunderstand what eKeys is doing or did I forget something?
>>>>>>>>
>>>>>>>> Best regards,
>>>>>>>> Christian Koehler
>>>>>>>>
>>>>>>>> CWI Amsterdam
>>
>>
>> ------------------------------------------------------------ ------------
>>
>
Previous Topic:default namespace
Next Topic:Run XML file throught XSLT parser when loading?
Goto Forum:
  


Current Time: Sun Nov 09 03:54:25 EST 2025

Powered by FUDForum. Page generated in 0.05941 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top