Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » OCL » subtle OCL Error detected: operations with return type EEList<? extends EClass1> not correctly
subtle OCL Error detected: operations with return type EEList<? extends EClass1> not correctly [message #47326] Sat, 22 December 2007 23:21 Go to next message
Philipp Kutter is currently offline Philipp KutterFriend
Messages: 306
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------080405090200000406040202
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi.
I run the newest Eclipse, EMF and OCL. The OCL version is
1.2.0.v200709211511

I have taken Christian Damus's Library tutorial for OCL
derive/body/constraints, and added all I need to show the error.
See Screenshot "EEListExtendsClassProblem.jpg")
See eclipse projects

As discussed in other posts, the Industrie's
EOperation

getCompany(): EList<? extends Company>

is giving back the value of the features
FoodIndustry::company and CarIndustry::company

This works perfectly, as you can see in the generated editor,
if you look at read-only, derived feature companyAsReference
of class Industry in the property editor.
The OCL definition of companyAsReference is:
getCompany()

Using this feature, one can read the name of the first company,
using OCL. This is done in feature firstCompanyNameFromReference.
The OCL definition of this working feature:
companyAsReference->first().name

Now, if I define a similar feature, which uses the operation
getCompany() directly, rather than the reference, it does not
work. The feature doing this is firstCompanyNameFromOperation,
its OCL definition:
getCompany()->first().name

This is clearly a bug, true?


To double check, I do an explicit cast in a third feature called
firstCompanyNameFromOperationWithOclAsType, having
OCL definition:
getCompany()->first().oclAsType(Company).name

As you can see in the screenshot
EditorBehaviorEEListExtendsClassProblem.jpg, this third feature works
again.

With other words, the OCL collection operations do not work
correctly on EMF operations with types like EEList<? extends EClass1>


Best Regards, Philipp

--------------080405090200000406040202
Content-Type: image/jpeg;
name="EEListExtendsClassProblem.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="EEListExtendsClassProblem.jpg"

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgIC AgUEBAMEBgUG
BgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgIC AgUDAwUKBwYH
CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgr/wAAR
CAGuA6UDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcI CQoL/8QAtRAA
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkK
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW 19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI CQoL/8QAtREA
AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYk
NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk
5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/K434+/H34Xfsx/C68+M nxk1m+sdAsb6
wspZdM0G91S5kub29gsbSCK0sYZrieSW5uYIlSONmLSDjGSOyr5w/wCCrH/J pen/APZcPhb/
AOp/4fqoR5pqPcmcuWDl2D/h6x+yX/0L3xw/8Rb8f/8Ayko/4esfsl/9C98c P/EW/H//AMpK
v0V9B/YtL+dnzf8Ab1b+RFD/AIesfsl/9C98cP8AxFvx/wD/ACko/wCHrH7J f/QvfHD/AMRb
8f8A/wApKv0Uf2LS/nYf29W/kRQ/4esfsl/9C98cP/EW/H//AMpKP+HrH7Jf /QvfHD/xFvx/
/wDKSr9FH9i0v52H9vVv5EUP+HrH7Jf/AEL3xw/8Rb8f/wDyko/4esfsl/8A QvfHD/xFvx//
APKSr9FH9i0v52H9vVv5EUP+HrH7Jf8A0L3xw/8AEW/H/wD8pKP+HrH7Jf8A 0L3xw/8AEW/H
/wD8pKv0Uf2LS/nYf29W/kRQ/wCHrH7Jf/QvfHD/AMRb8f8A/wApKP8Ah6x+ yX/0L3xw/wDE
W/H/AP8AKSr9FH9i0v52H9vVv5EUP+HrH7Jf/QvfHD/xFvx//wDKSj/h6x+y X/0L3xw/8Rb8
f/8Aykq/RR/YtL+dh/b1b+RFD/h6x+yX/wBC98cP/EW/H/8A8pKP+HrH7Jf/ AEL3xw/8Rb8f
/wDykq/RR/YtL+dh/b1b+RFD/h6x+yX/ANC98cP/ABFvx/8A/KSj/h6x+yX/ ANC98cP/ABFv
x/8A/KSr9FH9i0v52H9vVv5EUP8Ah6x+yX/0L3xw/wDEW/H/AP8AKSj/AIes fsl/9C98cP8A
xFvx/wD/ACkq/RR/YtL+dh/b1b+RFD/h6x+yX/0L3xw/8Rb8f/8Ayko/4esf sl/9C98cP/EW
/H//AMpKv0Uf2LS/nYf29W/kRQ/4esfsl/8AQvfHD/xFvx//APKSj/h6x+yX /wBC98cP/EW/
H/8A8pKv0Uf2LS/nYf29W/kRQ/4esfsl/wDQvfHD/wARb8f/APyko/4esfsl /wDQvfHD/wAR
b8f/APykq/Xz9D8UviP8Z/DF78aNM/aJ0D4W/D+PxA+keG7+60+K7utZlXlp XEscgjUgEqgV
SqnLMTkJ52Y0cDlkIyqyk29kkr6bvVpWXm+ov7ert2VNN+vRbvWy+9nuX/D1 j9kv/oXvjh/4
i34//wDlJR/w9Y/ZL/6F744f+It+P/8A5SV5f+z78dNb8SfEHxB8CvH3inw9 r2s6BCt1p/iX
wvdLLaaxZEqjSEISscqOyBwPlbzFKhfmRfQ/ib8SPBfwc+G3iH4u/EfWf7O8 O+FdDu9Y17UP
s8k32WytoXmnl8uJWd9saM21FZjjABJArbB4HB47DKvSm+V91tbdP0COf1Z6 KCvt8y7/AMPW
P2S/+he+OH/iLfj/AP8AlJR/w9Y/ZL/6F744f+It+P8A/wCUleI/Bz9uz4ea nf2Xwh+PfiWx
0H4qxX1laeNvCOmaVeTWng7UdSgt7zT9JvtQQS2iSPHfW1nBdvNFDqV3HMtq gk3WsJ8bv+Ci
vwJ+Fdhrui+Gp77X/FltfHQvCGlTaPqFhpPirxQ84s7bw/Z65LanT5Lx71vs 8qRyyNamG7ed
ESyujFv/AGVhuW/tPyNf7XxblZU/z/qx7d/w9Y/ZL/6F744f+It+P/8A5SUf 8PWP2S/+he+O
H/iLfj//AOUlcR4D/aH+Hmo+G/CFrr3xIsdU1jxH4q1LwbBfaZ4evLK21LxH pSaiNThiglMr
WsaPo+plfNldNsAVZpS8bSctqP8AwUY/ZG0rwX4k+Il/481xND8L6HJrl3qY +H+ttFqOjxyR
xy6rphFmf7Y0+LzoHlvbD7RbxRXEE0kixSxuz/snDJXdT8hLOcU3ZU/zPYP+ HrH7Jf8A0L3x
w/8AEW/H/wD8pKP+HrH7Jf8A0L3xw/8AEW/H/wD8pK8R+Bf/AAUV+BPxY1jw d8JvFs994V+K
viKx09Ne+Gl5o+oS3PhrVrnw/Hrx0y9nNqkdvILNp2jabyRO1ldpGDJbXEcX vtOOUUJq8Zti
nnWIpu0qaX3lD/h6x+yX/wBC98cP/EW/H/8A8pKP+HrH7Jf/AEL3xw/8Rb8f /wDykq/RVf2L
S/nZP9vVv5EUP+HrH7Jf/QvfHD/xFvx//wDKSj/h6x+yX/0L3xw/8Rb8f/8A ykq/RR/YtL+d
h/b1b+RFD/h6x+yX/wBC98cP/EW/H/8A8pKP+HrH7Jf/AEL3xw/8Rb8f/wDy kq/RR/YtL+dh
/b1b+RFD/h6x+yX/ANC98cP/ABFvx/8A/KSj/h6x+yX/ANC98cP/ABFvx/8A /KSr9FH9i0v5
2H9vVv5EUP8Ah6x+yX/0L3xw/wDEW/H/AP8AKSj/AIesfsl/9C98cP8AxFvx /wD/ACkq/RR/
YtL+dh/b1b+RFD/h6x+yX/0L3xw/8Rb8f/8Ayko/4esfsl/9C98cP/EW/H// AMpKv0Uf2LS/
nYf29W/kRQ/4esfsl/8AQvfHD/xFvx//APKSj/h6x+yX/wBC98cP/EW/H/8A 8pKv0Uf2LS/n
Yf29W/kRQ/4esfsl/wDQvfHD/wARb8f/APyko/4esfsl/wDQvfHD/wARb8f/ APykq/RR/YtL
+dh/b1b+RFD/AIesfsl/9C98cP8AxFvx/wD/ACko/wCHrH7Jf/QvfHD/AMRb 8f8A/wApKv0U
f2LS/nYf29W/kRQ/4esfsl/9C98cP/EW/H//AMpKP+HrH7Jf/QvfHD/xFvx/ /wDKSr9FH9i0
v52H9vVv5EUP+HrH7Jf/AEL3xw/8Rb8f/wDyko/4esfsl/8AQvfHD/xFvx// APKSr9FH9i0v
52H9vVv5EUP+HrH7Jf8A0L3xw/8AEW/H/wD8pKP+HrH7Jf8A0L3xw/8AEW/H /wD8pKv0Uf2L
S/nYf29W/kR1X7Ov7afwB/an8SeIvBnwj1DxUmseFLHT73XdK8X/AA413w3c wW1892lrOsWr
2Vs00cj2N2oeMMoaBgSDjPq1fKH7Jv8Aykj+Nn/ZD/hv/wCnjxvX1fXh4mkq FeVNPY9/DVXX
w8ajVroKKKKxNwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKA
CiiigAooooAKKKKACiiigAooooA8p/aK/bT+AP7LHiTw74M+LmoeKn1jxXY6 he6FpXhD4ca7
4kuZ7axe0S6naLSLK5aGON760UvIFUtOoBJzjhv+HrH7Jf8A0L3xw/8AEW/H /wD8pK5/9rL/
AJSR/BP/ALIf8SP/AE8eCK6+vXwWWwxVDncmjxcdmtTCYj2aimUP+HrH7Jf/ AEL3xw/8Rb8f
/wDyko/4esfsl/8AQvfHD/xFvx//APKSr9Fdf9i0v52cf9vVv5EUP+HrH7Jf /QvfHD/xFvx/
/wDKSj/h6x+yX/0L3xw/8Rb8f/8Aykq/Xkfjv4kfEPx78WNY+C3wk8Z6P4Vt fCWhDVvHPjLW
I1lOnRlQ6RRROCpJQqzOysMOFAzuK8eOweDy+h7WrN2vZJJXb7IX9vVm0lBN vbU9N/4esfsl
/wDQvfHD/wARb8f/APyko/4esfsl/wDQvfHD/wARb8f/APykrwrwj8f9f+HX xJ8MeDPFnx/8
L/Erw94ykNtY69pSxW+oabeFgkUdxbxIg8uR/kGUVlZlOWUnZP8At+ftN+JP 2ZtD+G8+hfGD
4c/D618Z/EY6BrPjb4pWD3Ok6RbDQ9X1BXZF1CwHmST6fBApa4Vczn5WYqKx wNHAZhh3VpTe
js07XT+9r53sVTz2tUnyKCv636X6Xv8AK57d/wAPWP2S/wDoXvjh/wCIt+P/ AP5SUf8AD1j9
kv8A6F744f8AiLfj/wD+UleI/AT9p2wu/hP4l+OXxK/bT+DvxR8J6bfW9ha6 z8G/C08cdtfE
qpsCsWr6q19eTvc2UcFrAEneSaNESZ541G3b/t4/s1zeG7vxBPrfiq0urS+t 7QeFdS+GmvWv
iO6knSaSFrbRJrJdSu43jtb11lgt5Iymn3rbttpcGLuWU4dpNzt9xbzjE30p 3+89T/4esfsl
/wDQvfHD/wARb8f/APyko/4esfsl/wDQvfHD/wARb8f/APykryzVv29/2VfD 3gXTPiD4l+Il
9pVrrHipvDFlpmreE9UtdW/tv7FLfR6XJpktst7DeTW0PmW9vJCstyJ7UQLK 11biW9r37aP7
PWg+C9B8cJ4j1zVofEv2r+ydI8L+CNX1jWD9lkEN75ul2NrNe232Wdktrnzo U+y3EiQT+XM6
xl/2Thv+fn5C/tnFf8+vzPRf+HrH7Jf/AEL3xw/8Rb8f/wDyko/4esfsl/8A QvfHD/xFvx//
APKSvLPEv7e/7KvhSw8LXWpfES+nuvG1jqVz4U0LSfCeqX+rak2nTwW+o2se nW1tJd/bLSS4
UXFmYhcwCG6aSJFtLkxGh/t+/sgeJ5gPDHxssdTtZ77TrTStX06xup9O1qS9 1K10uJtNvEiN
vqccd/fWdrcS2kk0dnNcRpctAzYo/snDX/ifkH9sYq1/Zfmep/8AD1j9kv8A 6F744f8AiLfj
/wD+UlH/AA9Y/ZL/AOhe+OH/AIi34/8A/lJVK/8AiR4L0v4k6T8Ir7WdniLX ND1DWNL0/wCz
yHz7KxmsobqXzAuxdkmo2a7WYM3nZUMEcruVX9jUX9tkf27WX2F+JQ/4esfs l/8AQvfHD/xF
vx//APKSj/h6x+yX/wBC98cP/EW/H/8A8pKv0U/7FpfzsP7erfyIof8AD1j9 kv8A6F744f8A
iLfj/wD+Uleu/AL4+/C79pz4XWfxk+Des319oF9fX9lFLqeg3ul3MdzZXs9j dwS2l9DDcQSR
XNtPEySRqwaM8YwT5jVD/glP/wAml6h/2XD4pf8Aqf8AiCuDH4CGEhFp3ueh l2Yzxs5RlG1k
fR9FFFeYesFfOH/BVj/k0vT/APsuHwt/9T/w/X0fXzh/wVY/5NL0/wD7Lh8L f/U/8P1pR/ix
9UZ1v4UvRl+ivnXxN+wR/wAEvfCmq2ehX/8AwTv+E11fX9vPPa2ei/Aez1GV ooWiWSQpa2Mh
RVaaIFmAGXAqPRf2Ev8Agl1rniGPwqn/AATo+F1jfzWUt3b2+ufs+2+nedDE 8SSMjXWnxh9r
TRAhSSPMHFfTSzXAwxX1WVamqmi5edc12rpcu+qd1psfGLA1pUPbKE+T+bld vvvY+jqK8Q/4
dlf8E3P+kfPwP/8ADT6P/wDI1H/Dsr/gm5/0j5+B/wD4afR//kau69Xsvv8A +Ac1qPd/d/wT
2+ivEP8Ah2V/wTc/6R8/A/8A8NPo/wD8jUf8Oyv+Cbn/AEj5+B//AIafR/8A 5GovV7L7/wDg
Baj3f3f8E9vorxD/AIdlf8E3P+kfPwP/APDT6P8A/I1H/Dsr/gm5/wBI+fgf /wCGn0f/AORq
L1ey+/8A4AWo9393/BPb6K+WPjL+zJ/wRK/Zz/s3/hoT9nz9ljwJ/bPnf2R/ wmfhPw3pf27y
tnm+T9pjTzdnmx7tudvmJnG4Zo6h8C/+CEuk+JPC/gzVfg7+yVbax43sbK98 F6VceHvDCXOv
2145Sznsoim66jncFYniDLIwwpJqXUknZ2+//gFqnBq6v93/AAT61orwLwx/ wTw/4Jb+NvDe
n+M/Bn7DPwC1fR9XsYr3StV0z4ZaJcW17bSoHinilS3KyRujKyupKsrAgkGj wx/wTw/4Jb+N
vDen+M/Bn7DPwC1fR9XsYr3StV0z4ZaJcW17bSoHinilS3KyRujKyupKsrAg kGq5qnZff/wC
eWl3f3f8E99orxD/AIdlf8E3P+kfPwP/APDT6P8A/I1H/Dsr/gm5/wBI+fgf /wCGn0f/AORq
L1ey+/8A4ArUe7+7/gnt9FeIf8Oyv+Cbn/SPn4H/APhp9H/+RqP+HZX/AATc /wCkfPwP/wDD
T6P/API1F6vZff8A8ALUe7+7/gnt9FeIf8Oyv+Cbn/SPn4H/APhp9H/+RqP+ HZX/AATc/wCk
fPwP/wDDT6P/API1F6vZff8A8ALUe7+7/gnt9FeIf8Oyv+Cbn/SPn4H/APhp 9H/+RqP+HZX/
AATc/wCkfPwP/wDDT6P/API1F6vZff8A8ALUe7+7/gnt9FeIf8Oyv+Cbn/SP n4H/APhp9H/+
RqP+HZX/AATc/wCkfPwP/wDDT6P/API1F6vZff8A8ALUe7+7/gnt9FeIf8Oy v+Cbn/SPn4H/
APhp9H/+RqP+HZX/AATc/wCkfPwP/wDDT6P/API1F6vZff8A8ALUe7+7/gnt 9fEviT4K6h8J
Phxf/sm/F/8AZe8RfET4eweMJvEXgjW/Bd1Kt3au4KtBMscM23EbbW3IoYlm Qnontf8Aw7K/
4Juf9I+fgf8A+Gn0f/5Go/4dlf8ABNz/AKR8/A//AMNPo/8A8jV5eZ5WszhF T0cb2ad97XVm
rdF9xnUpUZ6qTT2+FPR7ppt3X6pGD+x3+zxc+HPip4n/AGjdQ+DOm/Dq312x TT/DngvT/vWN
nmNpJJvRpGiiO0gMCHLBSwRe5/ac+FPxJ+L/APwi2keFrfQ7nQ/D+uL4n1bS NX1Wa0/t3UtN
23Oi6e0sNvK9pbjU1tb6W7Te6f2ZHB9muYruYR4n/Dsr/gm5/wBI+fgf/wCG n0f/AORqP+HZ
X/BNz/pHz8D/APw0+j//ACNW+CwKwOFVCC0733b1fS3y2sVRhQoL3W+r2W79 Gvw26HD6z+xP
8fND+G2i+GPhp8WNDHiLwJ4H8S6v4T8UahaNF/avxT1qG9SfxNc23lypZW8c l9qcgtEN1bv/
AG5Mv2eIafa+ZRu/2TP2tr/wL4c0DwTL8Ofhxa/Cj4O32nfBHwno+s3+ux6J 41ayv9JsNUud
TvLSJ7iztNLkjiWGS0k8yTUrxplla1tXb0b/AIdlf8E3P+kfPwP/APDT6P8A /I1H/Dsr/gm5
/wBI+fgf/wCGn0f/AORq39jLt+P/AAP6tqdPto9/wX+fr+h5zp37Hf7Qfh3w 3f3GlfD34O6j
a+G/hzoXw++Evwl17UtTudE0zwvImlnxNZahqUsDzX8l4LQW0Mstm6xxaZZS NEWur2Jr0P7G
Px08P/D/AEvw7pnjX/hJLF/ipYeOdW8DeOviXreqxWP2DQInstGttdvkur6W 3TxRYafqXnmK
H900yG3Zd1vP3H/Dsr/gm5/0j5+B/wD4afR//kaj/h2V/wAE3P8ApHz8D/8A w0+j/wDyNR7G
XZff/wAD5W2sHto9393/AAfnfe/U8dk+Ed/458HfDX4D/snftA2OteMfhV8R tevfif8AFTR9
KgurbRvFGp+GfFtve6pJbSStatef25qS3M2jRyM1qt5CrxQ27xMfrX4e/Dfw X8K9BuPDHgLR
vsFjda5qesTwfaJJd17qN/PqF5LukZiPMurmeTaDtXftUKoVR5Z/w7K/4Juf 9I+fgf8A+Gn0
f/5Go/4dlf8ABNz/AKR8/A//AMNPo/8A8jVUITh0X3v/ACJqTpz0u/uX+Z7f RXiH/Dsr/gm5
/wBI+fgf/wCGn0f/AORqP+HZX/BNz/pHz8D/APw0+j//ACNWl6vZff8A8Ayt R7v7v+Ce30V4
h/w7K/4Juf8ASPn4H/8Ahp9H/wDkaj/h2V/wTc/6R8/A/wD8NPo//wAjUXq9 l9//AAAtR7v7
v+Ce30V4h/w7K/4Juf8ASPn4H/8Ahp9H/wDkaj/h2V/wTc/6R8/A/wD8NPo/ /wAjUXq9l9//
AAAtR7v7v+Ce30V4h/w7K/4Juf8ASPn4H/8Ahp9H/wDkaj/h2V/wTc/6R8/A /wD8NPo//wAj
UXq9l9//AAAtR7v7v+Ce30V4h/w7K/4Juf8ASPn4H/8Ahp9H/wDkaj/h2V/w Tc/6R8/A/wD8
NPo//wAjUXq9l9//AAAtR7v7v+Ce30V4h/w7K/4Juf8ASPn4H/8Ahp9H/wDk aj/h2V/wTc/6
R8/A/wD8NPo//wAjUXq9l9//AAAtR7v7v+Ce30V4h/w7K/4Juf8ASPn4H/8A hp9H/wDkaj/h
2V/wTc/6R8/A/wD8NPo//wAjUXq9l9//AAAtR7v7v+Ce30V4h/w7K/4Juf8A SPn4H/8Ahp9H
/wDkaj/h2V/wTc/6R8/A/wD8NPo//wAjUXq9l9//AAAtR7v7v+Ce30V4h/w7 K/4Juf8ASPn4
H/8Ahp9H/wDkaj/h2V/wTc/6R8/A/wD8NPo//wAjUXq9l9//AAAtR7v7v+Ce 30V4h/w7K/4J
uf8ASPn4H/8Ahp9H/wDkaj/h2V/wTc/6R8/A/wD8NPo//wAjUXq9l9//AAAt R7v7v+Ce30V4
h/w7K/4Juf8ASPn4H/8Ahp9H/wDkaj/h2V/wTc/6R8/A/wD8NPo//wAjUXq9 l9//AAAtR7v7
v+Ce30V4h/w7K/4Juf8ASPn4H/8Ahp9H/wDkaj/h2V/wTc/6R8/A/wD8NPo/ /wAjUXq9l9//
AAAtR7v7v+Cegfsm/wDKSP42f9kP+G//AKePG9fV9fGn7A3wy+G3wc/bw+L/ AMOPhF8PdD8K
+HdO+B/w7/s/QfDekw2Nla+ZrnjqWTy4IVVE3SO7ttAyzsx5JNfZdfJY6/1u d+59pl9vqULd
gooorkOwKKKKACiiigAorw7/AIedf8E2P+khXwO/8Ozo/wD8k0f8PEP2b7j/ AEjQdK+KuuWM
nzWWt+GPgD4x1XTdQiPKXFpe2elS215byLh47iCSSKVGV0dlYMfoP9U+Kv8A oArf+Cp//ImX
t6H8y+9HuNFeHf8ADZHj3XP+Jp8Mf2BPjj4o0OX/AI8dd/s/QdB+044f/QfE GrafqMG1w6fv
7WLfs3x74njkc/4XV+3N4w/4mfw3/Ya0PQ7GP91LafF/4vwaVqTyjkvFDoVj rds1uVZQrvcx
yl1lBgVVSSU/1ZzRaTdKL6qVehGSfaUZVFKMls4ySaejSaD20Ol/uf8Ake40 V4d/xsn8c/8A
RDvhf9l/7DHjz+093/hP/YfL2/8AT153m/8ALDyv3x/wpX9ubxh/xLPiR+3L oeh2Mf72K7+E
Hwgg0rUnlHASWbXb7W7ZrcqzFkS2jlLrEROqq8cp/YeGp+7Xx1GE+sb1J27e 9Sp1Kbutfdm7
bO0k0j2re0W/uX5tM9xorw7/AIZN+PX/AEk6+OP/AIIPAn/zM1454T8RfEDx d8WbP4c2/wC3
v+03a6PrPirVvC3hfx9d+Gvht/ZOua9pgvTf6bBGmhtfxSQ/2ZqgMtxaw27n T5PLmcS2xn7s
JwpTx1OpUoY+i401eTtiFZJN9aCu+WMpcqvLljKVrRk1Eq7i0nF6+n+Z9qUV 8j/tW2niH9jT
4Ia18f8A41/8FRfj/BoOiWNzPM1j4T8CyNLJFbTTpb+Y3hpYYZJzD9nhM8kU ctzPb26v5s8S
P1fw3+C3xG+Lvguy+Ivw6/4Kp/HHUtD1LzG0vVE8L+CI4r6JJGjFxAZPC6+d bybPMhuE3RTx
PHNE8kUiOxPhNU8ujj5YymqEpOCnyYnlckk3FP6va6Tvb17MPb3nycrv2vH/ ADPo2ivDv+GT
fj1/0k6+OP8A4IPAn/zM0f8ADJvx6/6SdfHH/wAEHgT/AOZmuH+xsu/6GVH/ AMBxH/ygv2k/
5H+H+Z7jRXgGk/s6/FXX7/VNK0L/AIKt/GO9utEvlstatrTS/AMklhctBDcr BOq+GiYpDBcQ
ShGwxjnjfG11Jvf8Mm/Hr/pJ18cf/BB4E/8AmZqpZHgIO0sxorZ/Didmrr/m H6rVeQvayf2H
+H+Z7jRXgHh79nX4q+LrCTVfCn/BVv4x6paxX11ZS3OnaX4BnjS5tp5La5gL J4aIEkU8UsUi
feSSN0YBlIF7/hk349f9JOvjj/4IPAn/AMzNE8jwFObjLMaKa0accTdP/wAJ wVWT+w/w/wAz
3GivDv8Ahk349f8ASTr44/8Agg8Cf/MzR/wyb8ev+knXxx/8EHgT/wCZmp/s bLv+hlR/8BxH
/wAoH7Sf8j/D/M9xorw7/hk349f9JOvjj/4IPAn/AMzNH/DJvx6/6SdfHH/w QeBP/mZo/sbL
v+hlR/8AAcR/8oD2k/5H+H+Z7jRXh3/DJvx6/wCknXxx/wDBB4E/+Zmj/hk3 49f9JOvjj/4I
PAn/AMzNH9jZd/0MqP8A4DiP/lAe0n/I/wAP8z3GivDv+GTfj1/0k6+OP/gg 8Cf/ADM0f8Mm
/Hr/AKSdfHH/AMEHgT/5maP7Gy7/AKGVH/wHEf8AygPaT/kf4f5nuNFeHf8A DJvx6/6SdfHH
/wAEHgT/AOZmj/hk349f9JOvjj/4IPAn/wAzNH9jZd/0MqP/AIDiP/lAe0n/ ACP8P8zc/av/
AG3/ANk39hzwXF49/at+Ouh+DbG63f2dBfyvLe6htkhjk+y2cCvc3fltcQmT yY38tXDvtXLD
yv8AYI/4LOfsB/8ABRbyNA+CHxa/snxhPu/4t54zjj0/Wmx9ob9zHveK9/c2 0k7fZZZ/KjKG
Xyydtfiv/wAFQP8Ag3k/4KjfCrxpqnx30/xjrn7TFje+R/aPiywa6u/E7bI7 S3j+1WE8s1zN
hnMUf2aW62w2peTyFAUfOP7BH/BGP9vz/got5Gv/AAQ+Ev8AZPg+fd/xcPxn JJp+itj7Qv7m
TY8t7++tpIG+yxT+VIUEvlg7q/r7Ivo9eCWYeHFTOKvFEZTVm8QnCFKlJptU 5UJ2q80tfdlO
FSfLFwjG7jL5+rm2ZQxipqhp26vzutPzSP6MP2sv+UkfwT/7If8AEj/08eCK 6+vkNv2B/EHw
o/aH+DH7Nn7Zn7S+u/tL2N78D/iP/aCfFfw/YXdk2zxL4Nuo9sU0c1zN8zwZ +2XV1ta1jMPk
KBGPTf8Ah2V/wTc/6R8/A/8A8NPo/wD8jV/LH1XDYGvVw+DrxxFKMmo1IqcF NdJKM4xmrrpJ
Jp6arV8uaOM8Ved4uy00f6nt9FeIf8Oyv+Cbn/SPn4H/APhp9H/+RqP+HZX/ AATc/wCkfPwP
/wDDT6P/API1O9Xsvv8A+Aedaj3f3f8ABPb6+avjh8N/HPwo+OPiz41+HfhB L8QfB3xM8IDw
98QvDVhO6X0SBFiWaERqztlEjA2qzIQ5IwwZOm/4dlf8E3P+kfPwP/8ADT6P /wDI1H/Dsr/g
m5/0j5+B/wD4afR//kauHMMD/aOH9lPSzumns/us9G1qROnRlZqTTW2i/V28 n3R458Ef2VvD
/jr4neB9Z8E/sr3fw28K+Ar1r+71XxM7NrOvXgkEsKPujibbHIqEN5YQIGUF mPye4fta/DH4
2+NtY+FfxB+Aug+FdX1j4d/EaXX7nR/F/iW50i2vbaXw/rOlMi3NvY3rJIr6 nHIAYSrLEw3K
SDVL/h2V/wAE3P8ApHz8D/8Aw0+j/wDyNR/w7K/4Juf9I+fgf/4afR//AJGr LLsrjl1B04at
u7d+22iVtLBQpUMPqnvv7qXS2ya6f1co/EXwB+1t+0R8HtT8JfFL4a/Dnwlr GkeKvDHiTwlF
oHxGv9ZttVudI1q11f7JdyzaNZtYxyvYQwefHHdMi3DyeU5hWKWj46+HP7bf xTufCHxZ8T+C
/hXpfiL4b+OF13wv4FsPG2pXNlqvmaNq+k3LXWtvpkb22Y9XEscUemy7W08q 0ri8zZ7n/Dsr
/gm5/wBI+fgf/wCGn0f/AORqP+HZX/BNz/pHz8D/APw0+j//ACNXe6dR7/n9 3Q6FUpJWX5d9
/tdTlfBv7Jnxtvvip4f+O/xBl8K6ZrFz8fZviD4q8O6NrNzf22nWw8BXHhSK 1tLuS0t2vZGd
bW6ZpILZUWaaMbzCjz0fC/7Kn7SXwT8RaB8XPhhp3gfxR4i0bXPifFJ4d17x VeaRZS6b4q8W
x69Dci9i0+7cXFvHZ20L2/2bY7XMrCcCBRP3H/Dsr/gm5/0j5+B//hp9H/8A kaj/AIdlf8E3
P+kfPwP/APDT6P8A/I1L2Uu34+nl5D9tB7v8PXz8zD/Z8/ZE+JPwt+Kvgf4m +Kdb0OT+zdD+
JUviSx0+5mk+z6l4r8U6Zr621s7xJ9pt7b7PdW5uHWB5dkMnkR+Y8cXDw/sl eC/gv8A/hJpP
7ZvxE8D6d8PPh5+yxqnwp+KV9qnieTTrK5l1NfDNofKupBB5dvJ/ZlzEJGeG XdcW4RdzHZ6p
/wAOyv8Agm5/0j5+B/8A4afR/wD5Go/4dlf8E3P+kfPwP/8ADT6P/wDI1L2M rWsvv9PLyQKt
HmvzP7l5+fmyj+wd8O/ixH4a1P8AaC/aJ1y+1Xxz4usdO0galqegDSbmXQdJ SWGwmlsU2i1k
vZ59R1lreSKO4tG1w2MufsKY99rxD/h2V/wTc/6R8/A//wANPo//AMjUf8Oy v+Cbn/SPn4H/
APhp9H/+Rq0gqkIpWX3v/IibpTldt/cv8z2+ivEP+HZX/BNz/pHz8D//AA0+ j/8AyNR/w7K/
4Juf9I+fgf8A+Gn0f/5Gqr1ey+//AIBFqPd/d/wT2+qH/BKf/k0vUP8AsuHx S/8AU/8AEFeP
/wDDsr/gm5/0j5+B/wD4afR//kavYP8AglP/AMml6h/2XD4pf+p/4grx85cn SjzLr/XQ9zI1
BVp8r6dv+Cz6Pooor58+kCvnD/gqx/yaXp//AGXD4W/+p/4fr6Pr5w/4Ksf8 ml6f/wBlw+Fv
/qf+H60o/wAWPqjOt/Cl6M8n8W/FPSNd/aU0vwh4U8aeOvCms6Xc3nhZPFOh Weky2E+oXOn2
2tSaZIl7FcS+b9itIbkTLAsIAMfnGQ+XWrr+tt8P/jr4Bh+KPxe8e+Mda8Uj VdA8Mf2hoenJ
YWObZdRuXmmsrG2VGZNNRUV3Z2O7ZGVWZ49rXf2cvhH4i8bXnxF1DQr+PV76 GRZ7mx8Q31qq
zPaGyN7HHDMkcN6LUm3F7Gq3KxYjWUKAKk8TfAH4b+MNb8NeIvEK6/PeeEdf uda0CRPGOpxi
C8nZzI7qlwFnTbLLEsUoeOOCWSBFWJ2jP188ryeeMWKdL95pd9eZKye/Sy+R 8PHG42OH9ip+
728m7v8AU5H/AIKH+J/Engn9gD45+M/BniG+0jWNI+Dvia90rVdMu3t7myuY tKuXinilQho5
EdVZXUhlZQQQRXgXxs1f4k/Ae9+NXwZ8O/HDxxeaXB4H+HWsaj4q8Q+JZp7j SLjW/Ees6dru
uTXClG0/T47Gxiuri2sH0+C1gtbl7J9Ldzdxfb9FaTpc8r3/AK1/z/AmnVUI 2tf+l/l+J+X3
hT4p+OtI8PeNvgx8L/8Ago5Y+NdH1XxV8J5PB3jv4aeKL2/ks7u78c2+neII ba61rWNdluJI
bSfRftFs072kcep2oktFF87XXqmoWvjr4WeJPHuu+GPjx8RprX4XftM+APBH gXRtZ8c3uoW1
npOtv4QbVlu2uZHm1iS4GvXyK+pSXZs1EP2L7I0e4/dtFZrD2W/9a+fn+CNX ik38P9aeXk/v
Z+bXh74xfGTWv2rZNE1L4xeFdI+I6fH26sF0PUP2kPETa9J4Xi8USQpEPh9B p8lh5c3h5F8u
7ICi3lTV5J4mD3Kfdv7Qf/Ih2H/I8f8AI8eGP+Se/wDH/wD8h2w/1v8A1D/+ f7/pw+113FFX
Ck4RabvcyqVlOSaVrf1/SPkr9vGHxJov7W3wl+INr48+MXhDR7L4c+NdOvvF Xwe+Fz+KLmO5
uL/wxJBZXEQ0bVVgjlS1uJA5hRi1pgSAbkc8TeMZtM/aMtvFP7J198YrfxB4 58VeG9U8Y+B9
Z+D+pWnhXV7aeHTbW/1O71PUdIjayvLbQYlK20eo26i602GF7aS5ee3uPrWi h0m5N33f6W7j
VZKKVtlb8b66fr6WPgT9g74A/EDwp/wzl8HF1X44eGtJ8A/CvWIfi5o2qaxr 8em3Pi7T/wDh
D44bH7Rf7kfT1kS8e2XTZVsZ0t7uKFpbWW+hmw/2Tfh7+15ZfAzSvjz8Q7/4 4N8S9N8cfCTS
YbHxD4n8QyW76Lc6J4Kt/ETzaPPMbOfDXfiA3F1LbtJDOlzKZI5rffH+i9FQ sNFJa7f5W/4P
qW8VJt6b/wCd/wAdvQ+Ev2HfE/jG0/a2+Gvgz4g+IfjFF4/v/gF4jvfjhpXj u78TLolz4qt7
/wALJNPpkWon+ynjjnudSVH0cG1SK4URkQvDn7trlfAPwL+CXwo8SeIvGfwt +DvhXw1rHi++
+2+LdV0Dw9bWdzrdzvlfz7uWFFa5k3zTNvkLNulc5yzZ6qtKUHTjZmVaoqkr r+v66eQUUUVq
ZBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAU
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHyh8XP+Cg/w7/4J2ftl fGD4p/EX4feK
tZtdR+D3w2s11DSPD95NpOis2s+NY47vWL6CCYafZ+fNbxFljnuXMv8Ao9rc sjoPd/hB8VP2
ltJ8Sz/GP4gfskfH/wCIWvalYtaWeqaNdaB4Y8OHTC6PA1p4a1PxX51nIwRZ Wl1GNtSV55on
a3iCWUFn9k3/AJSR/Gz/ALIf8N//AE8eN69M8MfsN/BD4T+JdO8Sfsyw33wh jtr6GbVvD/w0
W2sND1uFXDSw3WkyQyWHmTbIkkv4YItQ8qGOJLtIxsPThc64bwuX1cLPDWxE nLmqTc5QqR3j
G1OVOpR5dU3GVRVeZc0FyJn12Cp1pYanK+ltuq++6f4WKP8Awtv9vzxL/wAT vwR+xX4G0nS5
/wDj10/4kfGuTT9aix8rfaLfSdH1WzjywZk8q9n3RmNn8ty8MZ/Z/wDwUn8a f8TT/hLPgd8N
fL/df2F/wj2seOPPxz9p+3fa9C8rdu2fZ/ssm3yt/nv5vlxe40V81/btGl72 HwVGnLvyzqf+
S1qlWHz5bro0ej7JveTf3L8kmeHf8KH/AG0fGn/JTv29v7A+zf8AHj/wpn4W 6dpHn7vv/bP+
EgfXfN27U8vyPs23dL5nnbo/KP8AhizX/Ev+g/Gb9tv44+NdLT95BpX/AAk9 h4Y8q4HCzfav
C1jpV5JhS6+TJO8Db9zRM6RPH7jRR/rPm0dafs4S6ShRowmvOM4U4yi/OLTD 2NPrd+rb/U8O
/wCHdP7LN/8A6J430vxz410t/wDj68M/Ej4v+JvE+i3mOV+0aZq2o3Nnc7GC yJ5sL+XIkcib
XRGU/wCHYv8AwTY/6R6/A7/w02j/APyNXuNFH+tnFX/QfW/8Gz/+SD2FD+Vf cgooor581Cii
igAooooAK+K/hP4S8dr8Wfhp8Frj4a+KrfWPAH7TfxF8d+KLy78K30Okw6Dq w8ZGwuYNVeIW
F5JJ/b2l5treeW4jM8gkiQ21yIvtSiveyjPJZVha9Dk5lUTtra0nTq0r7O65 K09NHzcr5rJx
llUpKpJO+3+af6I4e5s/gv8AtCf2F/wl/wALf7a/sX+yfGHh3/hM/AVzF/Zl 3J5/2O6h+32y
/ZtQh8uXdGNt1a+YnmpF50e/c+G/wx+Gvwb8F2Xw3+EHw80Pwp4d03zP7O0D w3pMNjZWvmSN
LJ5cECrGm6R3dtoGWdmPJJrcorza2MqzpfV6cpKldNQcrpNX1tZK+srPlVrv u72oq93uFFFF
cZR8c/Ej45/tO+KP2g734H/D744f8Ivb3n7VUfgqPUk8M2V5LZeHz8K11+eC BZk2/aPt3mTw
zyiURymPzI7i3RrSQ+G/xk/aH/aB8ReA/wBn1/2gdc8JTTf8LT/tbxx4X0bS G1jU/wDhEvF1
n4esvNW+sbmxT7TBdvcXPk2sWbiOMwfZod0DfVX/AArH4a/2/wD8JV/wrzQ/ 7U/tz+2v7S/s
mH7R/aX2D+zvtvmbd32j7D/onnZ3+R+6zs+WsPx7+zF+zX8VfBafDf4ofs9e BvEnh2PXLjWo
9A1/wnZ3lkupTyTyz3ogmjaMXEklzcu82N7NcSsSTIxP6HDirh90sPSeCjH2 cIRcvZUpNzVK
tCU2ml7S8p05qM5Wbp62bucjoVbt8277vunby2a+Z8j/APBP39o+/wBAs/Ba +Jfjl4VvPAus
WPx78YeKvFOlpBa6HfyWHxEtPK1eGaWaY21mINQvpFH2l4xFOC8kvlpIKNh+ 1h+1Nq37Nfwp
/aA8R/GrXLTS7T9nLwt478f614I0jwze/wBnXdzZzXOoar4o0y/eG8k0dltt 8EOheVdS/ZtX
jVldbTb9qat8Cfghr9hpela78G/Ct7a6J4qbxPottd+HraSOw1xp5rltUgVk IivDPcTym4XE
pknkfdudiaOsfsxfs1+If+EM/t/9nrwNff8ACuPK/wCFefbPCdnL/wAIv5Xk +X/Z26M/Ytn2
e32+Ts2+RFjGxcehPjPhivmNXF1MCnKpUnJ80Kc7RlUrzSSainJqrCDbXLH2 cZcklFQcLDVl
BRUtku/ZL9Px+Z8c2S/tD+Dv2t/iH4I+Fn7UuuaT/wALK/bGg0LWLrUvDWkX v2DTR8Jk1aRb
NRaR7LhfJs4YZZjOif2baPLFc5vUvfVfAH7SPxo8Vf8ACEfshS+M8/GDRPHM 2l/FPxD/AGdb
fNoug/2fe3ms+R5YtR/bFpqGgp9lt5DJY/8ACVbkMj6ZOq/Rt98MfhrqnjS2 +JGp/DzQ7nxF
Z+T9k1+fSYXvYPJjvIodk5XzF2R6jqCLg/Kt9cqMCaQNynwR+CPiXwN4l134 ufFzx1Y+KPiB
4osbHTtb1vRtCfSdOi06xe6eysrSye5uXijje9vJmeWeeaSa8mJkWFbe3t+X GcWZNmeEjOth
qanRo0oxXs4KU60IumptxhyypRjaUqc370oU1ZxdS9RoVIS0k7Nvr0ett9/N d35Ho9FFFfmx
2BRRRQAUUUUAFFFFABRRRQB8aft8+E9e8cft4fCDwt4Y+JuueDb66+B/xE8j xJ4bt7CW9s9u
ueBXby11C2ubc71Uxt5kL/K7FdrbXXm/+GUPjz/0k1+OH/gg8C//ADNV6F+3 H4Q+P2nftbfC
f49fCP8AZj8VfEvR9C+HPjTQNdtvCGs6Fa3Njc6jf+Gbi1dl1fUbJXjZNLuw TGzsrKuVAYGu
d/4W7+1p/wBIrfjh/wCFR4A/+aivfy6vhqeGSqSs7vqz5zMsNi6mKcqcLqy6 J/mc/wD8MofH
n/pJr8cP/BB4F/8Amao/4ZQ+PP8A0k1+OH/gg8C//M1XQf8AC3f2tP8ApFb8 cP8AwqPAH/zU
Uf8AC3f2tP8ApFb8cP8AwqPAH/zUV3fWsD/z8/Fnn/U8w/59/gjn/wDhlD48 /wDSTX44f+CD
wL/8zVH/AAyh8ef+kmvxw/8ABB4F/wDmaroP+Fu/taf9Irfjh/4VHgD/AOai j/hbv7Wn/SK3
44f+FR4A/wDmoo+tYH/n5+LD6nmH/Pv8Ec//AMMofHn/AKSa/HD/AMEHgX/5 mqP+GUPjz/0k
1+OH/gg8C/8AzNV0H/C3f2tP+kVvxw/8KjwB/wDNRR/wt39rT/pFb8cP/Co8 Af8AzUUfWsD/
AM/PxYfU8w/59/gjn/8AhlD48/8ASTX44f8Agg8C/wDzNUf8MofHn/pJr8cP /BB4F/8Amaro
P+Fu/taf9Irfjh/4VHgD/wCaij/hbv7Wn/SK344f+FR4A/8Amoo+tYH/AJ+f iw+p5h/z7/BH
P/8ADKHx5/6Sa/HD/wAEHgX/AOZqj/hlD48/9JNfjh/4IPAv/wAzVdB/wt39 rT/pFb8cP/Co
8Af/ADUUf8Ld/a0/6RW/HD/wqPAH/wA1FH1rA/8APz8WH1PMP+ff4I5//hlD 48/9JNfjh/4I
PAv/AMzVH/DKHx5/6Sa/HD/wQeBf/maroP8Ahbv7Wn/SK344f+FR4A/+aij/ AIW7+1p/0it+
OH/hUeAP/moo+tYH/n5+LD6nmH/Pv8Ec/wD8MofHn/pJr8cP/BB4F/8Amao/ 4ZQ+PP8A0k1+
OH/gg8C//M1XQf8AC3f2tP8ApFb8cP8AwqPAH/zUUf8AC3f2tP8ApFb8cP8A wqPAH/zUUfWs
D/z8/Fh9TzD/AJ9/gjn/APhlD48/9JNfjh/4IPAv/wAzVH/DKHx5/wCkmvxw /wDBB4F/+Zqu
g/4W7+1p/wBIrfjh/wCFR4A/+aij/hbv7Wn/AEit+OH/AIVHgD/5qKPrWB/5 +fiw+p5h/wA+
/wAEc/8A8MofHn/pJr8cP/BB4F/+ZqvYP+CU/wDyaXqH/ZcPil/6n/iCvP8A /hbv7Wn/AEit
+OH/AIVHgD/5qK9V/wCCa3w5+KPwv/ZUj0L4yfDi+8I6/qXxG8ca/L4c1O/s rm5sbbVPFmr6
naJLJYzz25kNtdwMwjlkVWYruyDXl5pWw9WnFU5X17t/metlNDE0qsnVjbTs l+R71RRRXjHu
hXzh/wAFWP8Ak0vT/wDsuHwt/wDU/wDD9fR9fOH/AAVY/wCTS9P/AOy4fC3/ ANT/AMP1pR/i
x9UZ1v4UvRnm3xTu/DGv/Hzw/wCHbXw18L/HOsab4W1N7rwD438SR291HFcT 2Ji1CKAWd25V
fs0sZcxqP32A3UVN4e8N/wBgfGXQvFGpfBT4XfDa3n0fUtHtbTwhr3m3GuXs zWt0ibDp1mGM
UFhdvgGRtpdgAqsaoa7+zD4nuPjHefFTw18TLC0hfxJJ4p0/Tb7w49w0Ovnw 8dBjkklS6jEt
kLXDm2CJK0oJFyqnYL/xM+A/jb4ifEz4bfE//hM/C1tf/D7xTqWo+fN4Kkmu LqyuoZ7T7FFN
9uVrb/RZ/wB4+JFluIIJvLRY/IP0NXhjI6ubLMWv3ujb/vKNl08kj5CGcY+G B+qJ+5qreTd3
+bML/gpfr/xJ8Jf8E8fjf4u+EXjf/hG/EWj/AAr12/0/W0imaW08ixllkaBo Z4XhuDGjiGdX
/cymOUpKIzE/juh/Gb42/CLxUP2bPgL8OPg7pGsS/H3Tvhzc6lY+ELnSdL+z RfC211ptT+x2
9y7NJA9vHFDamUK1naW9l58JAvY/rX4m/DfwX8Y/ht4h+EXxH0b+0fDvirQ7 vR9e0/7RJD9q
srmF4Z4vMiZXTdG7LuRlYZyCCAaw/wDhnD4Mf8J5/wALN/4Q3/ief8Jx/wAJ h9u/tG5/5DX9
hf2B9q2eZs/5Bn+j+Xt8v/lps8395XoVKc5T5k+363OanVhGnyyXf9LHj2if tIftMa7+0ZrH
wd1u/wDCvg2S/vtZ0vwponin4Z68qxNBDcyafqMGuidNM8RSXENvHfPo1sbS 5gtri5D3Ak0y
cS+O/sDeEf8AhsvwX4A8Eft1Wmh/F2x0T9lj4b+KdM0/xdon2yyOpazJryz3 9xb3klwLvUDa
6dYwteTFnDLdvALZb64if618Pfsn/Anwt8WJPjPovhS+TWDfXV/a2c3iTUJd J0++uRILm/s9
LknaxsrybzrnzbqCCOeU3l2XdjdT+ZR179i79nrXPBeg+Arfw5rmiWPhb7VH 4an8I+N9X0S9
0q0uJBJLp9veafdQ3EOnlkhC2CyC1RbS0RIlW1t1jn2VRyu9d9O+3/D7FqtS UWo6XtrZaen5
b+p51c6v4k+F3xY0b9iT9jD4m+FdJa4sdf12QeLNJfxBY+C7bThoCf8ACO21 hZ3ljNbRyDXr
e8hWa5ZbSAiCGEWslqlrh+Gf2s/2tvjB4x8AfB/4WxfDnSNY1ux+JFv4t8Ua /o1/d21vc+E/
E2n6H9ttNPhu4mkju3mmf7HJdq1utyjfa5zaNHeew69+xd+z1r3gvQfA6eHN c0mHw19q/snV
/C/jfV9H1gfapBNe+bqljdQ3tz9qnVLm586Z/tVxGk8/mTIsg3PA/wCzh8GP hxqvh3XvBvg3
7JfeFdD1XSdHvX1G5mlFvqd1aXmovO8kjG7uLm6sre4mupzJPJKJJGkLTSl3 7Orfey9fT/g/
f0J9pSttd+i89fy+7qfLE/8AwUg/aS0/9m2f9ozX/AHgez/4TT9ljxN8YPh7 4cs3vLv/AIR/
+ybPS5o7LUbtmh/tT7V/a9vKxhgsvsvkSQBrretyvo3i79qX9oP9m/xJq9t+ 0zefDm8tZ/g7
4r+INimgWWp2Nt4aj0J9ME9hd3pN5NqkbjVY/wDTYLG2kVbJ3FjI1wsMO5+0 H+wn8PPGX7JO
t/AX4J+GrHSNYsPgF4h+GHw3udT1W8a20nTtRsLa3EErZlaSPfp+nlpXWWYL bnaSXcP1Pgj9
in9mTwB/a9vo/wANPttjrOh3GhyaL4j1m91fTbDR59on0qwsr6aa30zT5Fjh R7K0jht3S2t0
aMrbwqkqGIvv2/4P9dCnPDuN7d9Py16fr1PmbVv2+/28vgr4b+JVr+0R8C7H T9Y0f4BeMPiD
4JvtT8KWOlWz3OgpZB7WWDT/ABTrbXUcj6jblmMtk0awlU88zFrf0bWP2u/2 kvhB8SdV8K/H
PRPA82l+E/8AhFvEnj/UvDNteKmheG9em1zThGklxKFn/sy+022u7vVphawv ppvJfsVs8CrJ
3E3/AATt/Zc1HStU0bxPpnjjxDDrOh3+i37+K/i94m1eVtNvrWW1vLJJb3UZ Xit545Q0kUbK
jy21pMwM1nayQ7fx1+DOq69/wkHiH4U/C/wPrXiLx9odl4T8Z3PxCvrqTTRo EH9osjPp8cUi
al5UmpXRNkWtBdJcPG93EFjIFTrRV2/1/TuDqUJacv6dvN9L/M+dP2wdf+JP 7VHx58BfD74Z
+N/+ES0PQfjhNoPgfx/pkUz3cXiy18C+MLi8vUEc6wahp9pcPp9q1szKJbqw 1eyukaIbWveP
v2tLDTv2obP4r+MfD9joPiD4QfAL4pL8QNC1DVJ5bHTb60l8D6mQL22tZZZ7 OW0uLW5jnitn
n8i5QPax3Ky2kf0X8Pf2WvhP8PvAvw78ErZ32ryfDO+fUtA1zVr0m+utWlsr yzu9VvHhEa3d
5dJqN/JcSyIRLPdyzFfMIYXvF37NXwD8f/EmX4u+N/hJoereIrrwPfeDdQ1D ULFZft+gXc0U
1xptzG2UubdpIVYJKrhN8wTaJ5Q57KrZu+raf5fkL21K6TWiTX5/n+Z8lat+ 33+3l8FfDfxK
tf2iPgXY6frGj/ALxh8QfBN9qfhSx0q2e50FLIPaywaf4p1trqOR9RtyzGWy aNYSqeeZi1v1
Xxd/a7/bb+C//C0v+Ep0T4V3H/Co/hXb/FPxJ/Z9tqT/AGnTZv7X2+F7bfKu +4H9i3Wdffy0
/eQ/8SY7n2eqTf8ABO39lzUdK1TRvE+meOPEMOs6Hf6Lfv4r+L3ibV5W02+t ZbW8sklvdRle
K3njlDSRRsqPLbWkzAzWdrJD2/j79nD4MfE//hN/+E58G/bv+FjeB4vB/jP/ AImNzF/aGixf
b9lr+7kXysf2pffvItkh8/lzsj2ipV7fF+P/AAO43Vw7a93109PPtc+Zv2iv +ChHx68D/GH4
oeGPhH4QvtTj+FN9BZR+CdM/Z98WeJ7nxncnRbHVxBFruluLHRZJ/t6WapcQ XLQNELqQPHMs
K8refsyf8Lo/bC/aN8U/8O7v2dPi59n+Kml2v/CSfF3W/s2pW23wX4Zf7JEv /CPajm3Xf5in
zl+eaUeWuN7/AFP8SP2Lv2evix40vfHHjTw5rjTat5f/AAkWkaZ431fT9H8Q bI1h/wCJppdr
dR2Wqb4I47aT7XDN5tvFFBJvhjSNe48J/DfwX4H17xP4n8LaN9lvvGWuR6x4 kn+0SP8AbL1L
C009ZdrsRHi1sbWPagVf3W7G5nZm6NScveel7/n3v3BV6cI+4tbW/Ls0+jPm bVv2lPjb8K7/
AOKPgf4b+A/hzofgb4afEbwf8L/h3ZWml3PmQXOtweFYbe4mtopIoUs9POty OLaFka8j8uBX
sPsxnuj4n/tZ/tbfAlPGHwt12L4c+N/HOg33w2uNG1S00a/8OaTe23inxVNo TWU0LXeozQSQ
iznlF4skq5uo/wDRG+zsLj33XP2cPgx4j0rxno2r+DfMh+IGuW+teKHTUbmO WbUre1srW2vY
JUkD2dxDHpti0Mts0Twy2sc0ZWYeZWH4b/Yu/Z68N6DdaB/wjmuav9t1zRtW u9U8V+N9X1rU
pbjSb+PUNNQ39/dTXRt7e7j8+O183yFeWc+X/pE3mN06t9H3/W36fcJVKFld dv0v19fvPHof
2s/2tvB3iTXrX4gxfDnVNH+HHxi8L/D7xVfaNo1/Z3Pim58QPoQiurSCS7mX Ro7FPEFqWWSX
UWv2t5lH9ngo1XvgF+zV8A/2tPDHiT45/tG/CTQ/Fvjj/hanjbR9N8a6nYr/ AGxollpXifVN
M06LS71Ns+k/Z7ezgaNrJ4GW4827z9pmmnf2/Vv2cPgxrn9v/wBqeDfN/wCE o8caR4w13/iY
3K/ada0v+zfsN1xINnlf2Rp37tNsb/Z/nRvMk34fxI/Yu/Z6+LHjS98ceNPD muNNq3l/8JFp
GmeN9X0/R/EGyNYf+JppdrdR2Wqb4I47aT7XDN5tvFFBJvhjSNT2U766rs/6 7W/H5r2tO2l0
+69PXvd/d8vAv2Vv2lf26v2lfDfgLwd4M8b/AA5026n/AGZvh3488T+NvF/h G71O5u9W1pNV
S5hXT7K8sIfLkOnrMJVmjEDI0YgnW4VrSjqP/BS74q/E3/hBv+FZWP8AwhH/ AAknwP8ACnxD
vv8AixHin4l5/t37dssf+JBJa/Yfs39nv++nz9r+0fu44vs0m/2Lx/8AsM+E vi/+1t4l/aC+
I8l9Ba33w58OeHvD+peEPGmraDrdpJZX+u3N7E13pk1vMLOYahYMYRM0cstm ryRhreB66nxv
+xd+z143/sjyfDmueFv7D0O30XTv+Fa+N9X8J40233fZbKT+xbq18+3t98vk RS7kt/Pm8oJ5
0m6FTr8tr/e3r/l9+pbqYfmvb7ktO/r81p0PHrb9uv8AaDmv9Z8c+K/hh4V8 DeE/B37M2gfF
Pxxo3jKTUxq2l31/Br7S6PI0FszRRwvpkTS3P2WSeIWs0a2Vw90rWfjv7Qn7 Xv8AwUX0r4B/
Gf4U/F3wf/wgXiKf9nTxl4x8HeM08J2mky2X9jLYx3cUCaZ4t1d3uJI9TQw3 TTWn2SWKOQRX
oZo4vt+w/Zq+Ael/2tb2Pwk0NLHXPA+n+DdU0X7Cp02fQLH7aLXTfsR/0dbd F1G8TYsYDJNs
bcqIq8r4e/YO/Zr0K/k1LUtE8VeJpJrG6sJl8f8AxL17xLHLY3UEkF1YMmq3 twrWdwjqZrUg
wTyW1rLIjyWls8TlSrSjbm/H/gdvSwQrUIyvy9un/B7+t0eWWn7Qvxt0Tx/4 j+CXhTT/AIc6
d451/wCPtj4Jl8cw+CrkWM9zH8N7DxFcareacl+s13I4tZbGJPtqNDAbTdJN 9lKzmrftZ/tb
WfiHTPgFoUXw51Hxynx9b4c6z4qu9Gv7LSZraTwNL4pXU4dPW7nmikgEkERt WunW6NrIPPs/
tSyWnsN3+xd+z1e+FNQ8JzeHNcX+0tcs9auNci8b6vHrSalbaVbaRHexaqt0 L6C4On2kVrJL
FOrzRvOJTJ9on8y94N/ZP+BPgWHw+NE8KX0914Z8VTeJdO1fWfEmoajqM2rS 6bcaW15d3l3P
JcX8gsLmS1U3MkoSFYUQKsEIjfs619+vfp2/4JPtKNtunbr3/wCBt1D9lX4u +JPjZ8Hh4t8Z
2NjDrGm+KvEPhvVZdMieO2vLnR9avdIlu4ond2t453sWnWBpJWhWYRmWYp5r +dftWfE34k2/
/BNP4/fEe3+IWhp4i0PwP8Q/7F174datMF0/7CdUists4bfFqFvHBClztI8q 8hnVNoRQPb/h
78N/Bfwr0G48MeAtG+wWN1rmp6xPB9okl3Xuo38+oXku6RmI8y6uZ5NoO1d+ 1QqhVBN8Mvht
ceC9U+HFx8PdDfw7rn2/+2tBfSYTZah9ukllvfPgK7JftEk8zzbgfNaaRn3F 2J05ZuFm9bfi
ZKcFU5ktL3+R8zW/7If7R8PwSu9L0NL7Q9euvFVvPrfhOT9rLxvrNt4h0mG2 mSO3j8Q3duNQ
0CQXVwt05sbcm4XT4reV2iuZPJ8d8MftMfHT4a23xv8Ait8EfFf2Tw78Gf2d Li/1jwF8R9Y1
vxe1x4k0vWfH9ncNaatd6lHN9na/0gBp5oXmurOG1j2WRjVI/rW3/wCCeH7A Fp4bu/Blr+wz
8HYtHv763vb7So/hlpS21zc26TJBPJELfa8kaXNwqOQWRbiUAgO2eq179mT9 m3xTpWg6D4n/
AGfPA+o2PhXQ7rRfC9lf+E7OaLR9NubUWdzZWqPGRb28tqBbyRRhUeICNgVG Ky9hPRrT+vRf
dszdV4Waev8AXq/S+6/A+ZvH/wC0X+2X4c/a/wBA/Z10jWPhzovizxlY+F4d R1O70jWdb0nS
Y7q1+IWpPBDZ/wBp2azyRp4fs7Y3qrayXJaSWWJUFta2uH43/wCChP7W2sfB 74t+Lfha/wAO
dF1j4C/DnXNf8Wy6/wCEb/U7bxZc6drXinSNlpFDqdq2kxyP4UmnxJJfMq6k ke5jatLc/aN9
8MvhtqnjS3+I+p/D3Q7jxFZ+T9k16fSYXvYPJjvIotk5XeuyPUdQRcH5Vvrl RgTSBvHv2qf+
Cbf7M/7Xth4f8OfEzwvY2+g6Jfatc3Ohaf4Q0GSPUm1OdJ7/ADcXenz3djJP IsjyXOnz2ly0
kzymbzVikjJUqyT5Xff/AIH3b+YoVaLkuaPb/g/ft5HvtFFFdRyBRRRQAUUU UAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAee/sx67qmnft/fG3XbPwZq V/df8KL+Gb/2
LaS2ouctrPjYFN0syQ5XJJ/eYwp2ljgH6a8OfEDxZresw6XqfwP8U6PBLu36 jqN3pTQw4Ukb
hb30shyQFG1DywzgZI+eP2Tf+Ukfxs/7If8ADf8A9PHjevq+vg8yw1aWYuSr ySVrpKFpW73g
3rs+Vrysz9DyzE0Y5aoujFtp2bc7xv2tNLTpdPzuZfi3xBq3hvTUvtG8D6pr 8rziNrPSJrRJ
EUhj5hN1PCm0EAcMWyw4IyRR8JeNfEviTUnsdZ+EPiLQIkgMi3mr3OmvG7Aq PLAtbuZ9xBJ5
ULhTyDgHoqK5Z4etLEKoq0kv5Uocr++Ll90kdccRSjh3TdKLf8158y+6Sj98 TE8Y+Ktd8MfZ
v7E+Gmt+IvP3+b/Y89in2fbtxv8AtdzDndk42bvunOOMng7xVrvif7T/AG38 NNb8O+Rs8r+2
Z7F/tG7dnZ9kuZsbcDO/b94Yzzjboo+r1vrXtfbS5f5LQ5drb8vP5/Fv5aB9 YpfVvZeyjzfz
Xnzb3/m5fL4dvPU53xb418S+G9SSx0b4Q+ItfieASNeaRc6akaMSw8si6u4X 3AAHhSuGHJOQ
L3hLxBq3iTTXvtZ8D6poEqTmNbPV5rR5HUBT5gNrPMm0kkcsGyp4AwTqUUQw 9aOIdR1pNfyt
Q5V90VL75MJYilLDqmqUU/5rz5n98nH7onL+I/iB4s0TWZtL0z4H+KdYgi27 NR0670pYZsqC
douL6KQYJKncg5U4yME7fhzVb/W9Gh1TU/DN9o88u7fp2oyQNNDhiBuNvLLG cgBhtc8MM4OQ
LtFFLD1qdeVSVaUk7+61Cy16WipabK8npvd6hVxFKpRjCNKMWre8nO7063k4 67uyWu1lochq
fxK8Z2GpXFja/s+eL72KGd447y2vdGEc6gkCRBJqCuFYcjcqtg8gHiuo0y7n v9Nt7660yeyl
mgSSSzuWjMkDEAmNzGzIWU8HazLkcEjmp6KKGHrUZylOtKafRqFl6csYv72w r4ilVgoxpRg1
1Tnd+vNKS+5I4n/havjv/o2nxt/4H6H/APLKuv1O7nsNNuL610ye9lhgeSOz tmjEk7AEiNDI
yoGY8Dcyrk8kDmp6KnD4atRjJTrSnfbmUNPTlhH8b7et3XxNGtKLhRjC3Zz1 9eacvwtv6W5f
w58Sr/VtZh0LxF8LfFPh+e73fYn1G0guIZdqln3TWM1xHb4AGPPaPeWATeQw HUUVl+LfB+k+
NdNTStZu9UhijnEqtpGuXenyFgGGDJayxuy4Y/KSVJwcZAIKdPF0KEo83tJd Oa0b+UnGNt76
qC0srNpyZOeFr10+X2cevLeXzipO+1tHJ63d0mktSiud8JeDPEHhLUnU/EfV NW0poCkOna1H
DNJaEFfLEVwiJK6hN6sbgzyORG3mAh/MPFvxFg8FakkGs+DvEU1jJAGXVtI0 eTUIxKS37gw2
vmXKttUtvMIiAwPM3EKV9djSw/tcTF01ezvZped02lHzdvOw/qcquI9lh5e0 e6tdN+Vmk2/J
X8rnRUVl+EvHHgrx/pr6z4E8YaXrdnFOYZLrSNQjuY0kAVihaNiAwDKcdcMD 3rUrppVaVemq
lKSlF7NO6fo0c9WlVoVHCpFxkt01Zr1TCiiitDMKKKKACiiigAooooAKKKKA CiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAK+cP+CrH/
ACaXp/8A2XD4W/8Aqf8Ah+vo+vnD/gqx/wAml6f/ANlw+Fv/AKn/AIfrSj/F j6ozrfwpejOP
+KfimXQviD4f03XPFXjfRPDt1o2pyXuoeCPBz6vL9tjlsRbRShLC8MStHJds DsUEx/e4wa3g
3xfBqfxasNF8E+PPiP4g0STw7qE+sS+N/AEmkRW10k9itqsUj6ZZ72dJLslQ X4jzgYyeM13w
3+0bpH7T154+0/Q/FGqaHa6pJeQCx8TwLp13oK6CYho8djNdxxjUn1kC5FzJ Ci+SQjXirmAb
3xduPjdqfxX+E+v+BvBfjRdF07xpqaeNtOsdU0mG0fTzZ3dnBdXSvciWdPOl t7qKKJmxEJGl
h+0RwRr9DV4fqTzZYxYuaTtLk53yaR+Hl5ra2103Z8hDM4RwP1f2MW9VzWXN q972vpfvsiz+
3F8c/Gn7Mn7HXxO/aG+Hfgv/AISDXPBfgfUtY0zTHEZiaWC3eQSziSeDdbxY 82ZUkErRRyCI
PKURvOtD/bc0P4U6YPCnjPw58YvF/imf4jad4Ej0G+0PQ59UTXpPBVrr4ts6 W0VosbxhjNcs
/wBnhvLi4YywafEssPsP7Tfwa/4aM/Zt+IX7Pf8Awkn9jf8ACd+B9W8O/wBr /Y/tH2H7bZy2
3n+VvTzdnm7tm9d23G5c5HEf8Ma/8X5/4Xb/AMLH/wCa4f8ACw/7M/sf/qRf +ET+w+Z53/b5
523/AKY+X/y1r0Kiq894+X63/Q5qbo+ztLfX9LfqXdE/bAh8W+JNY0vwL+zt 8Rtd0ewvtZ0v
SPFumWemtp2t6xpb3MN3pkW++We0kFxZXlstzfw2lk81uFW5Intmn8e/Zj/a P/aF/wCCgfgv
wXp1x4y1z4LX0nwP8JePvEt/4R07SLm91S71uTVIIorcahHqVva6eF0qa5VW SS6lW9tA72jW
1xDcejeHv2J7/TP2v5P2pNS8aeFfMS+urpb/AET4cwaZ4o1eOW1ktk0zWdZg nC6ppdukqmG1
NpFIG0/THknmktHkuKPgD9iX4k/AHwX4Wsf2a/jnoekeIvDfgfTvA1zqni7w NNq9lrHhvSpL
k6Olxaw6jaOmoWsdzKrXUE8UM7XV2z2uGtEsptXctdte3lb+rlp0FFpWvpZ6 6d/6tubl/wDH
P4pfAH+yfgz448F658XPGuof2hc+GYvBA0y01LWNAsfsSTapfrqE9hYW1xFN qFpbTR28xE7y
pcwQQxyS21lRvP8AgoP4Fnm8H+H/AAP8D/iN4q8TeNbHxJJp/hTQNKsjc2V3 oGpWum6vY3dx
PeRWVtJb3Ny6ee9x9kma1dYbiV5rRLk1f9kz422niTw98bPA/wC0pYt8UNOs dZstY1zxn4Ru
dV0S5ttUfTJbqCz0uDUrVtPjifRtPS2RLp1SJbhrgXl1cyXhvfBX9jX/AIVF 8QPB3xIuPiP/
AGlfaBofjiLWok0fyItR1LxRr+n67e3MAMzm1t4rq0mSG3YzuIp41ed2iZ5X +/vZbfLy/Hf/
AIJP7i13q/n5/ht+Oxh2/wDwU5+Ad58Ntd+Mdt4P8cL4VsvhXqvxE8KazeeH ltP+Ey0DTIYJ
L+5063uJY7iLymurRF+3RWguPtUctuZ4N0y9T4Q/bL8N674kvPDfjD4K/Ebw hIfCuoeJvDA1
/wANpLc+JtHsXt0urq0sLCa5vopI/ttj/oV5b216zXiItu0iTpF4h+0n+wd4 k8CfsAS+DPBn
ia+8Vax8M/2LvGPwv0rStM8OObnxJc3mlaSkVxFEksjJIX0VVW2USs7XYAfM f7z0bxN+wv40
+Nn/AAkWmftR/tCf8JRY3/wr8R/DzQrvw54Tj0bUotH1z7GL65v5TPcW93qB XTrMpLb21lbo
5uD9lKyxxwSpYi9rdvTz/wCB/V6ccNy3v3738v8Ag/h5cr8OP+Cy/wCyl8Rv Dfj/AF2ys76K
6+H3w51Xxvf6Npni7wvr9zfaTpqK140TaFrF9DBIhlt0VLuS3MrTjyvMWKdo vRvD/wC3j8Nt
U8aWPgTxL8NfHHha+1DXNLtIf+Ep0aG0WCw1WPUf7I1a5/fk2NvfXWmT2ENv ciK/W8ltoJrS
FriLdw/xj/YW/aS/aQ0rX4fjj+0/4HlvtW+FfivwDZ3HhT4TXmnxWum6/axL dyvHca5dGW4S
6sNLljYOiCKK7hZHa5intdz9q34KeCxqvxC+InjSLxxrX/C0fA/h3wTouifD rwrJdaxpeqab
da5f2WpWt4A8Gn3C3GpRvBfXf2e2srizgmkuU3KUE8QleXT0/ryBrDS23fr5 d16sw/2zP2u/
jP4U+LfhH4PfskaJ/bXifTvHEMPiTTL22tjpviLzPCfifV18NLePKv2HUH/s qwlaVtv2VNS0
64dbiCZ4JOqvf2sLDWv2g/AN74G8V32oeANX+DvjvxDrOm6f4bnuL6S+0jU/ DlssRtFgN8l5
b/a9Rt5LAIJxOzwyQmaJUQ+GX7HviSw0P4WeLviR4xsf+E58N/Ea++IPxEvN Oge5g1vW9Q0P
VdMuLWCeXy5ls7YanHBZtMJJY7HTLO2bO0OtH4v/APBN/wCG3xf+M/jf4m33 j/XNM0v4k/Cv
xL4P8Z+HtPSE+bcaxbaLZS6vbTyqzW9wtjodnbmJlkgbyYZFjjcXDXRavZtd WtPLT/hn/V1f
D3SfRPXz1/4df1blfhx/wWX/AGUviN4b8f67ZWd9FdfD74c6r43v9G0zxd4X 1+5vtJ01Fa8a
JtC1i+hgkQy26Kl3JbmVpx5XmLFO0XVa/wD8FKPht4U/tv8A4Sn4D/FTTf8A hGdDTxR4k/tD
wvDD/ZXg9/tG3xNc77geRbn7JdY019utH7NN/wAS392+MP4x/sLftJftIaVr 8Pxx/af8Dy32
rfCvxX4Bs7jwp8JrzT4rXTdftYlu5XjuNcujLcJdWGlyxsHRBFFdwsjtcxT2 vcfHz9jX/heH
/C7f+Lj/ANl/8Lj+B9p8PP8AkD+f/ZHkf2//AKd/rl+0bv7c/wBT+7x9l/1h 8z5BfWbf8N/n
8hv6pdf8Hy8u12HxY/bn8KfCnXvGCH4LeONe8MfDbH/Cz/HmiDShpvhTbYQa lP8AaIrq/hvr
nydPuba7f7Fa3O5JhHH5k6vCnh/jf4/eNNU/aj+M3grxT+1p+0X4VsfCHjjT 9L8N6J8IvgHH
4k02Cyk8M6JfsZbxPC2pn7Q11e3TNG9wGVDF+7VShbqvjz/wSs8C/Gb47eLP i6dH+Dt5H4+v
rW78TX3xC+A9l4n8Q2EkWn2unFdJ1G6uVgtIxb2UMkUVzZ3kcd088rrNHJ9n X334T/Br/hWH
jz4m+N/+Ek+3f8LG8cW/iL7L9j8r+z/K0LSdJ8jdvbzc/wBl+dvwmPP2bTs3 s3GvOVnor/hr
2t5ApYeEbrV2/HTumu551/w254F+Hd/4y+FmseHPiN4m1D4VX2jeGte8U3eh 2UUev69qMGj/
ANl2cMyNb20l5fS6vAhCJDb20iSNcmygktZJzXP+Cg/gXwD4S8Ra78ZPgf8A EbwfrHhe+8Mx
6p4Nu9KstV1Y2mvat/ZOnX0MejXl7FcxvdpdIYIpHu8WcmLdjJbia94x/Y1/ 4SnSvilDb/Ef
7NfePvipoHj7Rbh9H8yLR9S0a18PrZRTxiZTeW5uvD8Msyq9u7xXEkKPEwWe sO//AGJfiT8Q
73WPHPxw+Oeh6l4w1nXPAUst/wCFPA02l6bHpvhbxG2vW1sLS41G7l+0TTT3 kUlwbnYEkgKw
Awv57ft09PPt528+34iX1ZpX8u/lfy7/AIF7Q/8AgoP4FvvEg8KeJ/gf8RvD l1pnirTvDXjq
XWdKsmtvCGram9qmk2d3cW15LDeSXhv7EqNNe9Fst5C16bNWyPnOw/bb+HOj 6P8AEH4i/Gv/
AILW2PgPxN4S+I3je3Hw01NvB1xbWNppXiDUrawtZdLTT11m7je0tbYtDDdJ d3CyHyZkeRHX
6a8Wfsa/8JP/AMJ9/wAXH8j/AITj44eEfiH/AMgfd9i/sP8A4Rv/AEH/AFw8 zz/+Ee/13y+X
9s/1b+V+87f9nz4Nf8KI8B3/AII/4ST+1ft3jjxP4i+1fY/I2f2vrt/q3kbd 758r7b5O/I3+
Vv2pu2KnCvKVm9Nfz8mun6jU8PCN0tdPy13T66fd8+IuP2vfHmmf2F4If9kH xx4g+Ib+B9K8
RePPA/gzW9Cm/wCEQ+3+fHFBNealqFhBebriy1CFXtTLn7E7usSyQ+Z5zpv/ AAUYh1z9oPXN
b03wt4qvPhVZfB3wZr/gTUdLsdNSPxjqPirU5bTTEC3Fwt3DJNJDb2tqJks4 YpG1J75kj+xT
DD17/gkH4bksPB8emzfB3xZdeEPhzpfgOzm+NnwKTxZHFomkz3jaWbZBqVob W8MF60d7MGaK
7kghkjgs1Tyj3HxE/wCCaXgXx94S8QeBb3xZY3Oj6n8OfAPhnTdI1bwdZSWI k8Katf6paPeW
dsLe2uLO4luoYriwgitY/IhljieESoYZ/wBpfT8u2n47/ohr6ouv4Pur/he3 43Zua5/wUH8C
+AfCXiLXfjJ8D/iN4P1jwvfeGY9U8G3elWWq6sbTXtW/snTr6GPRry9iuY3u 0ukMEUj3eLOT
FuxktxMeMv2/ND8Dw+INa1b9nD4jSaD4DsYZ/iv4jt30M23gWQ6bb6pc297G dTFxdyWthdW9
xKdNivY2WXZA88qtGvK/Dj/gmlpXgrwHqnhuG5+Ffhm+1Xxx4M124Hwi+CVr 4W02SLw9rtvq
8cctut1cXE9xO0csDTS3TRRI0TRW6Ms5uaPx5/4JWeBfjN8dvFnxdOj/AAdv I/H19a3fia++
IXwHsvE/iGwki0+104rpOo3VysFpGLeyhkiiubO8jjunnldZo5Ps6tvE8ui/ Lz/4AksJzav8
/L/g/h8/RtW/bx+G2jfGfX/hBefDXxwLfwn440jwn4o8Z/2NCui6dqWrW2my 6XH5rTiW5+0z
ara2222ime3kO+6W2t5IbiW74e/bAh8XeOpNG8Kfs7fEbU/CMXiq68OS/EzT 7PTZtJTUba9k
064Q2qXx1URxahFLayT/AGHyUMb3DOLRTdCl4s/Y1/4Sf/hPv+Lj+R/wnHxw 8I/EP/kD7vsX
9h/8I3/oP+uHmef/AMI9/rvl8v7Z/q38r94fD39m34+fCvxXceHfAX7Rmh2H w2uvHGp+Jp9F
/wCFfNL4haXUdVn1e8tf7Ukv2tRbyXlzPHxp3mrZv5SyrcBb0X++5vL5d/yt 8yLUOXTf59vz
v8g+E/7c/hT4ra94PQfBbxxoPhj4k5/4Vh481saUdN8V7rCfUoPs8VrfzX1t 52n21zdp9ttb
bakJjk8udkhf1PxZ43/4RTXvDGg/8Ijrmpf8JNrkmm/bdJ0/zrfStlhd3n2m 9fcPItz9k+zi
TDZnubePH7zI+Zv2Sf8AglZ4F/ZS+IfhXxB4d0f4Ox6b4FsXtPDereHPgPZa b4uvoxZvZRtq
uuPczm6kaCV3uJbW3spLi4Ctujhaa1l+mfFngj/hK9e8Ma9/wl2uab/wjOuS al9i0nUPJt9V
32F3Z/Zr1Np8+3H2v7QI8rie2t5M/u8F03WcPf3Jqqip+49D50+Pv7UP7ROl /ttv+y18J/Ge
h+HrEeB/DmqWt9qH7P8A4l8Z+fe6nqWsWjC5utJv7W30m3jXToCJLvarebM3 mBYX28r+0B+3
L+0x8HIfi14q1vV/CvhWTwR4V8X6n4U8A+Kfg9rzrrzaZpt9daeYPFA1CHTL 6S5hto9Sexto
WuYLY3Nu+JLSe4j9v+J37JWseNvjbf8Ax6+H37VHxG+Hesav4V0zQNYtvCFp 4fuLa9trC51C
4tnZdV0q9ZJFfU7oExsisrLlSVBql8Q/2GPCnxw17UX/AGjvjT44+IPhi7/t f+zfAetnSrLT
dI/tGwvNNm+zy6XYWl8+3T9QvbRPPupsJcmQ7p0imTOUKzvbv8vz/T1T3NYz oK19rfP8uvr6
NbHK/Fr/AIKLQ+APDfjjR9V/Z++I3hbxZ4O+Dt54/wBah1nw9puqW2gacia0 sMt29lqwtp5G
l0chbOK8WaZbyEqyJFey2V4/8FLvhDof9s+JPij8MPHHg3wVpWueKtHtPiHr drp9xpuq3vh7
+031KK3gsL25v12w6Nqk6NPaxK6WZUHzJYY5NzVv2GPCnjDwX8RvC3xP+NPj jxVffFL4Vx+A
fFfiTVDpUF6+mxya08csS2VhBbx3CrrlzGG8koVgtyULCR5Txb/wT9+Afj/4 bWPwi8ctrmqe
HbXxx4u8TXWny6isX2+XxHDr0Oo2sskKI62/l+Ir5Y/KaOVNkBMrFWLu2Ivo /v8AXr8uwr4a
1mv6t0+ffobfwL/afufjH8SfFHwi8U/s++OPh54i8K6HpOsXen+M59Gm+1WW ozahDbywyaVq
N6h/eaZdKyuyMMIcENmvVK+dP2Jv2b/2m/hn8SfHPxx/at+K3/CQ+IvFeh6H oVlZ/wBtWWp/
Y7LTJtUuEk+12eh6Kh8yTVph5Js2aPydxuJRMIrf6LrWk5OF5fiY1VFTtHy2 9NfxCiiitDMK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOL/ZAvbP Uv8Agov8ZtR0
67iuLe4+Bfw1kgngkDpIjav43KsrDgggggjgg179/wANLfs5f9F/8E/+FVZ/ /HK8G/ZN/wCU
kfxs/wCyH/Df/wBPHjevq+vg82hmEsU/Y1IxfW8HK+21pxt13b/DX9DyieBj hI+2hKStpaaj
bfe8JX6bJf5Qanqem6LptxrOs6hBaWdpA811dXMojjhjUFmd2YgKoAJJPAAz XL6Z+0H8A9a1
K30bRvjf4Qu7y7nSG1tbbxLaySTSMQqoirISzEkAAcknFdfRXLXhjpTi6M4x XVOLk36NTjb7
mddCeCjBqtCUn0tJRS9U4Sv96KXiPxN4c8H6NN4j8W+ILHS9Pt9v2i/1G7SC GLcwVdzuQq5Z
lUZPJIHesTw58cPgr4w1mHw54S+L/hbVNQuN32ew07xBbTzS7VLNtRHLNhVZ jgcAE9q6iiir
DHOvF05xUNLpxbb11tJTSWm3uuz112ClPBKjJVISc9bNSSS00unBt67+8rrT Tcy/FvjjwV4A
01NZ8d+MNL0SzlnEMd1q+oR20byEMwQNIwBYhWOOuFJ7VR8JfF74T+P9SfRv AnxP8O63eRQG
aS10jW4LmRIwVUuVjckKCyjPTLAd66KiicMc8QpRnFU+qcW5f+Bc6S/8BYRn glh2pQk59HzJ
R/8AAeRv/wAmRieMfiX8OPh39m/4WB8QNE0L7Zv+yf2zqsNr5+zbv2eYy7tu 5c46bhnqKPB3
xL+HHxE+0/8ACv8A4gaJrv2PZ9r/ALH1WG68jfu2b/LZtu7a2M9dpx0NbdFH JjvrXNzx9n/L
yvm2/m57b6/Btp5hz4L6ty8kvad+Zcu/8vJfbT4t9fI53xb8XvhP4A1JNG8d /E/w7ol5LAJo
7XV9bgtpHjJZQ4WRwSpKsM9MqR2q94S8ceCvH+mvrPgTxhpet2cU5hkutI1C O5jSQBWKFo2I
DAMpx1wwPetSiiEMcsQ5SnF0+iUWpf8AgXO0/wDwFBKeCeHSjCSn1fMnH/wH kT/8mZy/iP44
fBXwfrM3hzxb8X/C2l6hb7ftFhqPiC2gmi3KGXcjuGXKsrDI5BB71t+HPE3h zxho0PiPwl4g
sdU0+43fZ7/TrtJ4ZdrFW2uhKthlZTg8EEdqu0UUoY5V5OpOLhrZKLTWul5O bT0391XeumwV
Z4J0YqnCSnpduSaemtkoJrXb3nZaa7nIan+0H8A9F1K40bWfjf4QtLy0neG6 tbnxLaxyQyKS
rI6tICrAggg8gjFdRpmp6brWm2+s6NqEF3Z3cCTWt1bSiSOaNgGV0ZSQykEE EcEHNT1S8R6J
/wAJDo02kLq99YPJtaK90648uaCRWDo6kgq2GUEo6tG4yrq6MymKccwp88qk oz091KLi/Rtz
kvLZdypvAVOSNOMod25KS9UlCL8932LtFc78PvFupa7BdaD4rggtvEGkTtFq drCpRZIzI6wX
kasWxDOieYoDOEbzIS7SQyY6KtsNiKeKoRqw2f3p9U10aejW6aaeqMcRQqYa s6c919zXRp9U
1qns001oFcv4j8KfEuTWZtd8FfFj7L521RpGuaFDe2ECBQC0awm3uPMLKDue d0G9xs5Qp1FF
LE4anioKE3JK9/dlKL++LTt5XsPD4mphZ80Em9vejGS+6Sa+drkGmSalLptv LrNpBBeNAhuo
La4M0ccmBuVHZELqDkBiqkjnaOgxPCXxY+HfjfUn0Hw94ogOqwwGa50K8R7X UbeMFRvltJwk
8SnchBdACHRhkMpPRVl+LfA/grx/pqaN478H6XrdnFOJo7XV9PjuY0kAZQ4W RSAwDMM9cMR3
rPERx0YxeHlF23Uk/e/7eXw9bvkl5JGlCWClKSrqSvs4te7/ANuv4vJc0fVm pRVLxHb+I7rR
poPCWq2NjqDbfs91qOnvdQp8w3bokliZsruAw64JB5xg4nhzVvjBDrMOl+Nf BmiSWLbojrWh
61Izl1UkTSWk0KeRG+0jak1w6O6L8675Vqri1RrxpyhK0rWkouSu3az5buPd uSUbfa3sqWFd
ajKpGcbq902k7Jbq9k+yUW5X6bX6iioLvU9NsJ7a1vtQghlvZzDZxyyhWnkE byFEBOWbZG74
GTtRj0BqeulSi20nsczjJJNrcKKKKYgooooAKKKKACiiigAooooAKKKKACii igAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAr5w/4Ksf8ml6f/wBlw+Fv /qf+H6+j6+cP
+CrH/Jpen/8AZcPhb/6n/h+tKP8AFj6ozrfwpejM/Wdd8cXPxC0n4a/D3wzo 9/f6lo1/qbya
1rstjFFDay2cTAGK2nLszXicYUAKeegpJNV+Jvhj4i6Z8PviV4R0CybWNEv9 RsbnQ/Ek97xa
TWcciOstnBtz9sQggt90ggcV4L8Vviz4H8U/tOt8MPjj4L+G+o+HtA1Se2ew 8V6NFNqOnaWN
AGqzeJjPcSFIdN+0RjTn/cBPOQE3O4eRWt4n8Z/s+fs6/Gz4V6R8JPCHwk0K 2+IfizVPDOsa
tZNaWeoFra1uT9ltkhRRKf7Rt4LaXc/7uZoofKaSZWi+hq5VxC82VWGJtQdp cnLHZR1V+W+r
TfxddD5CGKytYH2cqN6mq5rve+jte2istj0z9pX9oT4bfsofAPxb+0f8XdT+ y+HfBuhz6lqG
yaFJbjYv7u2g86SNHuJpCkMMbOvmSyxoDlhWH4C/aq+G2o/D9/iD8T/iv8K9 HsR5Hl6joPxN
h1LT2zoEGtTZupYLYDZatc3SfKd9hFFeny1laOE/bo+G/jT4x/sS/GL4RfDj Rv7R8ReKvhX4
h0fQdP8AtEcP2q9udNuIYIvMlZUTdI6rudlUZySACa8e8Q/sk/EPxd+1NH44 8V/Cyx1PwzF+
1ra+PYpdQms5o0062+F8ekW+oiJ3LCSLWookjG3zkkjSdVCKJR6FSVWM/d20 /U5qcKUqfvPX
X8Lf8E991H9pv9m3SPGniT4cat+0H4HtfEXg3Q5Na8X6DceLLNL3Q9NSOOV7 28gaQPbW6xzR
OZZAqBZUYnDAnyzwB+3x/wANR+C/C2v/ALCvgPQ/G994g8D6d4v1OLxd4z/s Wy0LTb2S5t4L
e4ubO11EvqBurK+ga2hikSFtOuxPNCwt0ucP4Z/Bn44eEv2sLex0j4X65YeA dN8ca/4imj8T
X3h7U/Ddo2opqEr6hoE0cSa9BrFxd6gWnS8H2OGG91e3heSMWTPh/sx/Bz9o X9jDwX4L8U3H
7P8Arnju+tfgf4S+GXiXw34R1jSIr2zu/DUmqJFqtu2oXttb3On3q6hNIu6a G6gVLQPbM1xc
JZT7Sq5bWWt9PT+ti1ToqL1u9La/ff8A4fy1Pb/+Gsvht8PPht/wm/7WWvaH 8H7iz1z+wtVH
jfxFDZ6bJqXk+eFsNQuhDFqNvLDmaGVArlA6TRW9xDc20G54p/ab/Zt8D+C7 D4j+Nf2g/A+j
+HdV0Ma1pmvap4ss7eyvNNMlrEL2KeSQJJbmS+skEqkpuvLdc5lQN494nh/a qsfjb4I/a88Q
fs5X3iCOx8K+KdAT4ceDNU0sa3ottqlz4fubR7yfUNQt7G5kT+xbo3Jt59sM t7bwQreRwyX8
mH+zx+yT8Q9C+PXwt+LnxO+FlikehWPxe1wSX01ncXPhnUfFHizT9UsLbKO+ 28GnyX9vNLbN
JCrJcRrPJHKjSv2lW9kvw9P839xPs6Vrt/ivPT8N9d+p9F3Px0+CVlf+L9Kv PjF4Viuvh9Yx
Xvj22l8Q2yyeGraSBriOfUFL5s42gR5VebYpjRnBKgmjwD8dPgl8V/EniLwZ 8LfjF4V8S6x4
QvvsXi3StA8Q215c6Jc75U8i7ihdmtpN8My7JArbonGMq2PgT4t/sk/EP4Bf 8EzdC0q++Flj
4etfh9/wT2+I3hzxxbafNZrHZeI77TvD9xKhWByJpJp7DU5ZJ496NIjuzlpV L+xeNfgR+0L8
dPtmi+D/ANmjQ/hR/wAIj+zp4z+HXh3T/Ec+kal4bu9S1b+xlsTYW9sLjztH g/seRXW+srV2
hnt1+xNumihlVql7cvbv1/y/GxToUrXUu/bp/n+F/v8AffAP7YP7JPxX8N+I vGfwt/ak+HPi
XR/CFj9t8W6roHjewvLbRLbZK/n3csMzLbR7IZm3yFV2xOc4Vsbnh746fBLx dfyaV4U+MXhX
U7qLxVdeGJbbT/ENtNImt20ElxcaWVRyReRQRSyyW/8ArUjjd2UKpI+Evi1+ yL8Z/iJpXjzU
fhF+yj8cNGm1v9nT4geAYbD4vfG228RS3Opaza2c9hLbG58R6klrbiTSntp2 V4XMuoWJKSwx
zzWnsXx3/Zav/D/jr4kfFXwLZ+FfAGj+C/g74Hn+E/ibUb2DTNG0HVvDl74n umt5zCPNsdLF
pe29peGNYw+nX95BG4DSbSNWt1j+f6/cEqNHpL8vLt956N+19+3T8Nv2Pbnw 1/wlmn/2xDqG
uGPxfDpepQ/bfDOijRtb1R9altWO+a3SPQr3KJiSRYLjyFnmiFvJ2+v/ABl/ sP8AaS8J/s9/
8I35v/CUeB/EPiL+1/tm37N/Zd5ott5HlbDv83+192/euz7Pja3mZTwLwB8E fix8TvG3wk/a
+8R+Bb6217xJ8Yrjxf4osNYQW154U8L/APCIeIdM0XS5IbgiaGSEX9o9zZI0 qxanqeqSx4ik
Yrh/E79h79ou1+LHiXwf8GIfCrfD2f4BeP8Aw78MB4gWGex8JajrI8NpbaHc WE8M4n0tZ9Mv
LqL5Z4Y4Lh7EW0FvaWqTntK1nK3VW9NP68vyXs6N1G/R39dfy/Ffj9F+Af2w f2Sfiv4b8ReM
/hb+1J8OfEuj+ELH7b4t1XQPG9heW2iW2yV/Pu5YZmW2j2QzNvkKrtic5wrY vf8ADTf7Nv8A
0cH4H/5Hj/hC/wDkbLP/AJGT/oC/6z/kIf8ATp/rv9iviD4tfsi/Gf4iaV48 1H4Rfso/HDRp
tb/Z0+IHgGGw+L3xttvEUtzqWs2tnPYS2xufEepJa24k0p7adleFzLqFiSks Mc81p6p+03+x
Hr3iT/hon/hTvwL0OP8A4SD9jyx+G3wp/s+KwtPKuF/4SfztItssn2K3/wBJ 0fIPlwNth5Pk
HyxVa7Xw/n/XkN0aF1735eS/4J9F+N/2m/2bfhn8SdI+DXxI/aD8D+H/ABh4 g+z/ANg+FNb8
WWdpqWpefM0EH2e1lkWWbzJkaNNinc6lRkgivOpv2jP2tvG3xh+I/wAPvgL+ zd8OdX0f4d+K
rXQLnWPF/wAXr/SLm9uZdF0zVWdba30G9VI1TU44wTMWZomO1QQK8P8A2m/2 TP2nfFvxL+On
gLQJfjFd+DvjnfI/2b4e6z4IsvDyW0/hvTNDnj1a41q0n1e1kLWMrSyafDcq lq8DwxyXHmwj
1Twz/wAE9v2fPiT8f/jb8Wf2ov2Qvhz4tuvFHxGsbvwlrni/wjpmrXM2kxeF tBs9qvMkkkMa
3lrfKIm2ncGcLtkVmbnWnKyVtfw19fIFChCN276fjp5ruz2Gx+Pnw20jSri0 +KXxM8D6D4i0
HQ5r/wAbaRB4xhni0P7La2dzfs8sywP9nt47+zkaeWKHEV3bSOkYnQE8BftN /s2/FTwW/wAR
/hh+0H4H8SeHY9cg0WTXtB8WWd5ZLqU8kEUNkZ4pGQXEklzbIkWd7NcRKATI oPgXxA/ZJ+Id
7f8Ax8+Ifh74WWMmveJ/j74A8Y6NPBNZx33iXRPDkHhS6azSZnULJ5+m6vBb xXUkMQnmLM8M
UzTVh/Gj9nX4w/tc6n438e+M/wBl++0bR/Fl98JNDu/APj6+0W6ub3TtA8a3 Oravczx2d5d2
b2bWOoMqxNMZpWtrhDAAYTM3Uqp7d+/n/kvvEqVFpe927eX+b+4+mfCv7Tf7 Nvjr/hFP+EI/
aD8D6z/wnf27/hB/7K8WWdx/wkX2LP2z7D5ch+1+RtbzfK3eVtO/biuIm/aS +PnjjVdU8R/s
5fs56H4w8D+H9cv9H1LVdT+ILaTrGp3unXUtrqMWl2D2EkE/l3EE9rG17eWK zXFvLzHbGG8m
858dfsk/EPUfEnxo8Z6D8LLH+2PG/wC0z8MfEdjqsc1mlzqXhzRH8HvO8kpc N5ds9jrLJBIQ
+4SmNCZ18zqvAbftC/ss22ufBXwX+y5rnxBh1bxx4i8ReHfGmmeJNI0/R4f7 b1m81TyNUF1d
re2n2ae9khke0tb/AHW8UVxGrzSvZQnPUbtLRd0v+H9fu+a5KSV42b7N+V+6 72+/5dvcftxf
sdaX8NtC+Lvin9pzwP4e8O+JND0rWNG1DxX4jt9I8+y1OGebT5THetE8f2iO 1umjV1Vm+yzj
GYZAu58Zf2m/2bf2c/7N/wCGhP2g/A/gT+2fO/sj/hM/Flnpf27ytnm+T9pk Tzdnmx7tudvm
JnG4Z+Svgp8PfFv7GX7W0HgDwZ+zxffGG6+Hv7JXw28GSeIvDEuk2GtwRw3/ AIljMkUOqXVv
ClncmxV50W98xJYLMCK4XdLb0dB/ZE/bC/Zk/wCEA/4Q7W/ipd/2b+zp4G8A 61/woO58Fybt
S0D+0/tEt1/wmESZt3/tFPszWuHbZc/aEjxBuhVqvL8P4bf5/foW6FHmtzfe 9/8AL5rU+377
4m/DbS/Glv8ADjU/iFodv4ivPJ+yaDPq0KXs/nR3ksWyAtvbfHp2oOuB8y2N ywyIZCvlnjD/
AIKP/sSeHPgH4/8A2j/DH7S3gfxl4d+GuhnUvFH/AAhXjLTdRlh3LJ9mthsu Ai3FzJGYbeOR
086UhFOa8d8M/wDBP/4h+E/Dfjfwh4Q8B+FbbWF/Yu8LfCr4feJPFclnrdtb 6jap4gS6s55J
bJWubPfNpEk5exjhulVCbcmMwx8P40/Yv+LHxjv/ABXZ/Df9nj4xeC4/FHwC 8dfDl7r44/Go
eJY4L7XILGWyvYwdf1drazifS5Ibkwqs7SX1kVhnjjmktXKrX5dI/n/XmEKW H5tZaadvn/lp
1PsO0/ai+CVt4F8R/GHxX8bfhzYeBtEvrFIvGMPjy2ksVtruysLm3kvJ3EcN nJKb6IxR+ZKs
sE1pMsn+kiNL1p+03+zbf/DbT/jLY/tB+B5vB+rfbP7L8VxeLLNtNvPskNzP deVdCTypPJhs
rySTax8tLSdmwInK/Ol38HP2hbb4nah+09D+z/rlx9j/AGi7Px9b+BYtY0ga 1fabN8MLbw1J
FEzXosRcQahPKJFlu40MdlO8Ty7oBMad+y/8Uvip8Y/Dfxt+I3wF+waXqn7U 8fxEvPC3im60
y6vfD1lZ/DqTQbS5uVt7ie2a4GrWltPD9lmnaNZ7aUmN0lWF+0q3269n9/8A wPmT7Kja9+l9
193/AAfke++Cf2jPDfjz42zfC3QUsbnR734c6T4v8G+LbPV0mtvE9tdXN5Dd Cy2rtnjtUj0y
WSaKSRQus2m4RiSJpeItf28fDes/sgePP2pvCfhmx1i68J32uWWh+FdO8RpL J4iuYLqSPQ4I
JUiY+ZrMD6Xc2aJHI0sesWZhFwssTy+V+Ov2Mv2i9b/Zrj0v4dalfeDviFb/ ABi+IptNY0XU
IY76Dw54q17XIDdpdRXEZWO2g1PTvEH2USB5p9CtYcRXAjkg7jXv2LL+w/a/ 8H618OtJsdG+
ElvY6Xq+veEtKsYLfSU1bQLW8sdLheySRVlkmTU9OuI7gREWp8EacnJNq1qu eu+n9P8AyDkw
66/0v80Hx+/4KffBL9nyw8QeG9d1vwrrPjnTfhz488Y6N4V0HxzbTR6hbeG5 5Y2s3lZVmhvJ
hDPuiW3lWGTTtTTfJ9iZ5PU/GX7VfwS8MfDzxB8Q/D/jSx8WR+HPFUPhW+03 whqNte3I8RzX
lvYwaK2JVit7x7u7tYCtxJCkTTq0zxRhpF+SvjB+xT+03rHwP8X6T4e+Gn9o apr3gf8AaG8M
2WkwazZJKsvivxC+raLdO8syRC3lhso4mw5lilv7YPEqLcyW/qnxV/Yz8aeI /ir4yX4UeE9D
8P8Ah2y8D/Cf/hALXdHaabNe+FPFOsa0dI2W6u9jbmM2Fv5ywOsKXW+OKcwt DSjOu27r8PK/
5lOnhrLXrrr5pflqei+Dfj58bfDvxD8P/Dz9qj4NeFfCcnjW+m07wVqXgnx7 c+ILa71GGzuL
6WyuvtGmWEtrI1pa3M8TrHNCy2k6ySQSG2juaXxk/wCCgH7Nvw/+G3xZ1/4b /GDwP458YfCP
wPr3iLXvh7onjizfUo/7Lhdp4LiOJpZbTEyrA7vEfLeQAqThTRhh+MP7Tvxh +HHi3xb+zl4q
+F2j/C7xVdeJJZfG2qaLc3Ot3M2i6npEVpaxaRqF6qRqmpzzyzzSRsjQQRxx Ti4lltfD9c+C
f7SniX/gmqf+Cf8Ac/sRX114m8FfALUfCWleOte8RaCNLu9Wh8K3WixXOimO 7muxJdSTeWjX
cGnhbO6uWmkicfZZm51Una/Xp6f8H7hRp0nJc1ul9fXz7W69T6Z+Pv7Vvgv4 AfEn4d/DjxFa
+dN461w2txP5ki/2ZZGa20+O82rE4m3avqmhaf5QKsP7V+0E+TbTsvVePvjp 8EvhR4k8O+DP
il8YvCvhrWPF999i8JaVr/iG2s7nW7nfEnkWkUzq1zJvmhXZGGbdKgxllz86 eLv2A/iX+1J4
k+L3j342ftH/ABG8AWvxRsbjwRd+BfCCeG5rb/hD7F7+0s1a5udMupjJeC91 DUS6SRSwrqy2
zfNaK55X4l/Bn9tfXtBtLq6+F+uav4+1rwOfBPi3xBb33hW58N+Nl02/1OCy uPFelahEXs9H
u47tr94NEeS8EOr39rIoks7NpG6tVXfK/LT+vXW3XsJUqLsuZX6/15baX6dz 1T40ftJ/tt/C
v4peFfAWk/ssfCvVbHx544u/DvhDUrj43alayt5WmalqiT3kK+G5BbbrXTJQ Ujkn2yyIgZ1z
KPYfhF428SeMvDc8HxBtPCth4s0i+ay8VaF4Q8WPrNtpNyUSeKBriS1tZfMa 0ntZyklvEwW4
XAdCkj8r+0J8N/Gnjj4t/AvxP4W0b7VY+Dfipeax4kn+0Rp9jsn8J+IdPWXa 7AyZur61j2oG
b97uxtV2Xyz9q3wR8SdI+PkXgT4B+Lv7Gm/aG0NtC8Zf2XqE1vqGh/YGh+0e KbP7MoNtcLpE
13YNqMolxfp4TgZVhD5pynBtu7V/LsvLuSlTqJJJJ28+/r21PYW/bB/ZJS/0 DSm/ak+HIuvF
d9BZeFrY+N7DzNYuZoLS4hgtV87NxJJBqFhKiR7maO9tnAKzRlr3jf8Aab/Z t+GfxJ0j4NfE
j9oPwP4f8YeIPs/9g+FNb8WWdpqWpefM0EH2e1lkWWbzJkaNNinc6lRkgivi 7Wvg94t1K7/b
Q/Ze/Z4/ZBsZLX4j31t4B0fxh4Yu9Jsbbw5Gfh5oNpawanBPJbzR6XaC9EsI sVvZAsl6q2sT
LGLrc/ab/ZM/ad8W/Ev46eAtAl+MV34O+Od8j/Zvh7rPgiy8PJbT+G9M0OeP VrjWrSfV7WQt
YytLJp8NyqWrwPDHJcebCIdarZ2jfXs/P/L8TRUKN0nK2l915f5/gfb/AIn8 T+G/BPhvUPGf
jPxDY6Ro+kWMt7quq6ndpb21lbRIXlnllchY40RWZnYhVVSSQBXD/tE/tEw/ s+w+ErW1+Eni
rxvrHjfxU2geH/D/AIQfTUuZbldNvtSd2fUry0gSNbfT7gkmXcWCqFJbjc+O nhjxJ42+CXjH
wZ4M8PeFdX1jV/CuoWWlaV46tHuNEvbmW2kSKDUIkBaSzd2VZkUFmiZwASa8 s/b8/Zk8SftM
6H8N4NC+D/w5+INr4M+Ix1/WfBPxSv3ttJ1e2Oh6vp6ozrp9+PMjn1CCdQ1u y5gPzKwU1tUc
0ny+X/BMKag5Lm8/66fmXr79svxPHqtv4K0H9jD4qax4wj0OHWPEvguwv/DC Xvhyyubq8trG
W6mn1qOzl+1Np940a2lxcMiwHzxCXjV7vw8/b4/ZJ+Idh4nuV+O3hXRbrwZ4 q1rQPFOleIPE
9hbXel3OmT6mkz3EXnkwRyQaRf3sRk2s1pA8xVVSTZ5Z8e/2VPjb8fPhP4a+ FDfse/ALwvda
P4VuNK8LeNdP8bXN1ffCq5kLW8N94di/4R2EmS1ghsLqLy59Pbz4FhDxLDHc te039iX4k3Hj
TwR4Y8a6H4H1fwV8Pv2i9d+J2maje38017qH9qx+J7sI1hJZmG1uLHUtasvJ lW5l81bRrnNt
IqQHFTrc2mq/ryXz/TY1cKHJro/X/gv5dfXc9TtP21/2WIvFen/Dvxd8ffA/ hvxVrGuXml6J
4T1vx3pK6lqcsGq3OlqbeCK6kMvm3VrKiRj96rgwyxxTxywpuf8ADTf7Nv8A wuf/AIZw/wCG
g/A//Cw/+hC/4Syz/tr/AI9vtX/Hl5nn/wDHv+++5/q/n+7zXzNbf8E5/jbD 8M/2nPBjeKfC
v2r40fDnxHoHhaQX1z5drc6h4k8c6pC90fs+UjWDxNYK5jEjCSG5AVlWNpaP hPwZ8dNA/bO8
A/s36P8ADH+0/B/w/wDjh4u+I+q+P/set2mLfXdO8SXAt8XWlR6ZN5N14jht P9E1O6nfyfNa
2iAuVtRVaqtzLe35/wBO43Rou/K72v8Al/npY+36KKK6jkCiiigAooooAKKK KACiiigAoooo
A5D9k3/lJH8bP+yH/Df/ANPHjevq+vkT9jbQ7LRP+CiPxi0mynvHis/gv4Bm he81Ca4lZrjV
/F6yB5JXZ5VAtYvLRyywlpjGENxOZPqDxj8P9C8dfZv7bv8AW4Psu/yv7H8S 32nbt23O/wCy
TR+Z90Y35284xuOfgsbPMHKpKVOPtL/Dzvl6fa5E9v7nl5n6HgIYBU6cY1Je ztvyLm/8B52t
/wC//kbdFYng74f6F4F+0/2Jf63P9q2eb/bPiW+1Hbt3Y2fa5pPL+8c7MbuM 52jEHi34YeGv
GupJqus6n4ihljgESrpHi/UtPjKgscmO1uI0ZssfmILEYGcAAcjnj/qykqcf adVzvl/8C5L7
f3V28zsUMD9YcXOXs+/Iub/wHntv/e8/I6Kisvwl4P0nwVpr6Vo13qk0Uk5l ZtX1y71CQMQo
wJLqWR1XCj5QQoOTjJJOX4j+EHhPxTrM2u6nq3imKefbvTTvHGq2cI2qFG2G 3uUjTgDO1Rk5
JySSSpPHrDxcKcXPqnNqK9Jcjb6fZX+ZCGBddqc5KHRqCbfrHnSXX7T/AMuo oql4c8P2HhbR
odC0y4vpYIN2x9R1Oe8mO5ix3TXDvI/JONzHAwBgAAc7qfwQ8GatqVxqt1rX i9Jbmd5ZFtvi
FrMEYZiSQkcd2qRrk8KoCgcAADFFWePjSi6VOLl1Tm0l6NQbevdL9ApQwLqy VSclHo1BNv1T
mktOzf6nX0VBpmnwaTptvpVrJO8VtAkUbXNzJPIVUAAvJIzPI2ByzEsTySSc 1yH/AAoDwJ/0
HvG3/hy9c/8AkyjETx8Yx9hTjJ9eabjb0tCV+u9vx0KEMDKUvbTlFdLQUr+t 5xt07/59tRUG
p6fBq2m3GlXUk6RXMDxSNbXMkEgVgQSkkbK8bYPDKQwPIIIzXL6Z8EPBmk6l b6ra614veW2n
SWNbn4hazPGWUggPHJdski5HKsCpHBBBxVV546M4qjCMl1bk4teiUJX+9CoQ wUoN1pyi+loq
Sfq3ONvuZ19FUvEfh+w8U6NNoWp3F9FBPt3vp2pz2cw2sGG2a3dJE5AztYZG QcgkHE8OfCDw
n4W1mHXdM1bxTLPBu2JqPjjVbyE7lKndDcXLxvwTjcpwcEYIBBVnjlXiqcIu Gl25NNa62ioN
PTb3ld6abhShgnRk6k5Ketkopp6aXbmmtd/ddlrrsdRRWX4t8H6T4101NK1m 71SGKOcSq2ka
5d6fIWAYYMlrLG7Lhj8pJUnBxkAij4S+GHhrwVqT6ro2p+IppZIDEy6v4v1L UIwpKnIjuriR
FbKj5gAwGRnBIJOeOWIUYwi6fVuTUv8AwHkaf/gSCMME8O3KclPouVOP/gXO n/5KzoqpeHPE
ejeLNGh1/QLzz7WfcFYxsjo6sUeN0cBo5EdWR43AdHVlYBlIGVd+LdS0n4nW 3hLWIIE03V9L
L6LdKpDG9hZ2uLeRmO0s0LRSRIoLFbe7ZsCMVP4d8Hf8Iz4j1bUdL1Hy9M1P y510dIcR294X
la5uEbJx52+IsihV8yN5OXmkY5xxVSriFGkrxTlGfRxdk4vfZrpZt80Xoky5 YanSoN1HaTUZ
Q6qSu01tun6Jcslq2jboooruOIKKKKACiiigCl4j8M+HPGGjTeHPFvh+x1TT 7jb9osNRtEnh
l2sGXcjgq2GVWGRwQD2qj4O+HvhfwD9pj8LRX0EFxsAsptXuZ7a2RN22O3hl kaO1jAbAjhVE
ACjGFUDbornlhMLPELESpxdRKylZcyWuie6Wr+9m8cVioYd0Izag9XG75W9N WtnsvuRzvi3x
B8RNB1JLjw98OoNc0pYAbkWeuJDqJkJYbYoJ0SB1HyMWe5jON+FJVVfyT4uf 8FL/ANlX4D+O
ofhX8Vrnx7Z+KX8P2+s3fh/RfhF4j12axtJ7m7tYnnfSbC6hj3zWF4ifvCJB AXQvGyO3vtfm
h/wUm+K//Ch/20Pjp8cf7B/tX/hDP2UPCmu/2X9q8j7Z9k1HxxceT5m1/L3+ Xt37W25ztOMV
8R4g8QZrwZwvic5wa9vUi6cYUp8sYuVStTpq0kk18b+JvW2qR7GS4XB5vjaW DqxVNe83OPM3
aMJSd02106JfM+kP+Hwv7EP/AD1+MH/iM/jz/wCUtH/D4X9iH/nr8YP/ABGf x5/8pa+Sviz+
2p+zH8GvA0/xF8V/GXw3Jpdl48s/B2pXFn4isiLDV57qKCS2nZ5lWJ7ZZTcX EbESRW8M0hQh
MGp8O/29v2RPiR8Ob74r6f8AtA+D9P0LT9Y1bT7m/wBW8V6fFEv9n6hHYy3G 8Tsggd7iykjc
sN0eo2bEKbhFP8yR+k14hTwixUcii6blyJ/vPjtfl23tqffPw9yNVfZvGPmt e3u7bXPsD/h8
L+xD/wA9fjB/4jP48/8AlLR/w+F/Yh/56/GD/wARn8ef/KWvBtE+IXgHxL/Z H/COeONH1D/h
IdHbVtA+xanFL/aWnr5G67t9rHzoB9ptsyplB9oi5+dc+WaL+2doGp2Xw81K +8PWdnb/ABD8
eaxo2m3EuvJsGkW019BY67GxjAntb6aPSIoWXEbPr9kqSymWETY4b6UnG2Lj J0snpvl39+Se
kZy2dm9Kc9r6xtu0ndTw5yim0pYqWvku6X5yX332Psz/AIfC/sQ/89fjB/4j P48/+UtH/D4X
9iH/AJ6/GD/xGfx5/wDKWvnrxX8Y/hD4E0DW/Ffjj4qeG9G0vwzeRWniTUtV 1y3t7fSriVIH
ihuZJHCwO63Nsyq5UsLiIgESLm5rfxC8A+Gv7X/4SPxxo+n/APCPaOura/8A bdTii/s3T28/
bd3G5h5MB+zXOJXwh+zy8/I2ORfSx4ucVJZRTs9nzVNfh20/vR/8Cj3Rp/xD TK72+tS+6Pn/
AJP7n2Pef+Hwv7EP/PX4wf8AiM/jz/5S0f8AD4X9iH/nr8YP/EZ/Hn/ylrwb RPiF4B8S/wBk
f8I5440fUP8AhIdHbVtA+xanFL/aWnr5G67t9rHzoB9ptsyplB9oi5+dc09c +Mfwh8MfDRPj
T4l+KnhvTvB0tnb3cfiy+1y3h0x7e4KCCYXTuIikhkjCNuw5kXBO4ZI/Sx4u lUUFlFNybSS5
ql222kkrbtppLe6a6A/DTK0m3ipWWu0du59C/wDD4X9iH/nr8YP/ABGfx5/8 paP+Hwv7EP8A
z1+MH/iM/jz/AOUtfN3/AA0L8Av+FT/8L6/4Xh4P/wCEF/6HT/hJrX+yf9f9 n/4/PM8n/X/u
vvf6z5PvcVyGv/tg+AZtS0v/AIVf4j8H+ItC1r4b+KfFVj40fxpFDoif2Nc6 bbvHNeQxzpHA
Xv3824G7yBavmOQkhezD/Sh46xVRwp5LC6cou8pxSlGLlKLbslJRTbi3fTYy n4dZNTV5Yt7J
7J6N2Tsujb32PsD/AIfC/sQ/89fjB/4jP48/+UtH/D4X9iH/AJ6/GD/xGfx5 /wDKWvm7xH+0
L8AvB/iyy8BeLfjh4P0vXdS1gaTp2i6j4mtYLu61Ax20gtI4XkDvOUvLR/KU F9t1CcYlQm5q
fxj+EOi/EvTvgtrPxU8N2njHV7NrvSfCdzrlvHqd7bqJSZobVnEsiAQzEsqk AQyc/K2Of/ia
zjPlUv7GhZxck71NYreS01iur2XU0/4htlN2vrT0dvs7vZevkfQv/D4X9iH/ AJ6/GD/xGfx5
/wDKWj/h8L+xD/z1+MH/AIjP48/+UtfN3/DQvwC/4Wx/woX/AIXh4P8A+E6/ 6Ev/AISa1/tb
/UfaP+PPzPO/1H737v8Aq/n+7zXYVlX+lnxZhuX22U048yUleVRXi9pK61T6 NaMqHhnllS/L
iZOzs7KOj7ep9Kfs4/8ABRD9kf8Aat+JOrfBr4O/ETVP+Ew0TQ4davvCnizw TrHhzUm02WZ4
FvYbXV7S2lubcTIY3lhV0jdo1cqZEDe2V+REfg+HxZ+3p49u7TXNQ0XWtF+F /gXUfDPibRZU
jv8ARL9NS8Xol1bO6Om7ZJLG8ciPDPDNNBPHNBNLE/3/APse/thTfGuaf4N/ GSy0/Rfihoun
m7vbLT1eOw8R2COkZ1jSxI7v5G+SJLi1d3msJpo4pHmims7y8/oLwx8Z8n49 xDy3ERVDGqEJ
qF7xqRnTjUbpt6tw5rSi9bLmV1zcvw/EPCeKyWH1im+ejdq9tYtScfe9baPb pva/vFFFFftR
8kFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfOH/BVj/k0vT/APsuHwt/9T/w /X0fXzh/wVY/
5NL0/wD7Lh8Lf/U/8P1pR/ix9UZ1v4UvRnj/APwyh8ef+kmvxw/8EHgX/wCZ qj/hlD48/wDS
TX44f+CDwL/8zVYn/BUb4n+Pfhb+yhqGqeAPDfiC5mutQjW/1jw/quo2R0G2 t4pr5r25m02G
W6Wz3WiW8/lGJjHdMBPASJF+B/Bnxf8AG/wu+Kh8WfCq28WeIfEF74wjvPE+ g+GruSy1Hx1f
213rOqBpjpmnEPM4eZXh2T2LafcRxu0V1bg2n6NhcpliaPOm97LV/nfT5n5r XzNUKri0tFd6
L8FbX5H6J/8ADKHx5/6Sa/HD/wAEHgX/AOZqj/hlD48/9JNfjh/4IPAv/wAz Vdv+038Zf+Gc
/wBm34hftCf8I3/bP/CCeB9W8Rf2R9s+z/bvsVnLc+R5ux/K3+Vt37G27s7W xg+BfFz9rP8A
a2/ZB8Sa7a/HqL4c+PNH0f4BeOfiNbX3hDRr/wAPXN7c6C+jhdMaC4u9QWCM pfSE3QllaRpl
XyIRalrvyZ+zp73+9/5npw9rU2t9y/yPRv8AhlD48/8ASTX44f8Agg8C/wDz NUf8MofHn/pJ
r8cP/BB4F/8Amar5l+Pn7YX7Yeu/svfHLw5oviu++1WHwC8U+JNP+JEH7Nnj LwBH4cudPig/
0RDrF4TdXl3Bc3L288E8bWUmnmV4rlWCL7F8MvgH8Nv2sfi38XYf22/hn4H+ K2qfD3xxpnhr
w+/iPwdDcabplufCegalcmwsbtrhbPz77UbuV33yTun2eGWeZLS3EcKUZO0U /vfn5vsaOE4x
5pNf+Ary7pdzuP8AhlD48/8ASTX44f8Agg8C/wDzNUf8MofHn/pJr8cP/BB4 F/8AmarlfDvj
b42698T9R/ZZ/ZN/aD8Kvp/w98K2Wo6j4w+I2iXPjG5v2vdY1zT10vzbTU9P ZJNOfQ5raSa4
kurmdmUTt58M01x5zrH/AAUg/aS8T/DbVf2hPhv4A8D6X4P8L/sseFvjVr2k a295e6ldfb4d
cuZ9Bt5Ymgij8yHTFVNRdG+zOhJsrsXAFs3Kmt7/AHvpv16EqFWT0t9y67dO v/DnsXif9in4
qeNvDeoeDPGf/BRX4xavo+r2Mtlqulan4V8BXFte20qFJYJYn8MFZI3RmVkY FWViCCDV7/hl
D48/9JNfjh/4IPAv/wAzVec/E/8AbC/a2+DyeMPAWu+DvhzrPjnS774bXujW 1pPf2ekx23iv
xVNobaTNcN5s00lsLOdhqiwxrKbiN/7Nj8loZr3jT9qv9pL4IW3xI+F3xE1H wP4q8a+HND8H
X/hbW9B8K3mk2V7ceJdZvtFs7A6fNqF0ZbhLqw3Iz31rBcNeRQyzadHHJfA5 qV+v3vz8/Jhy
1mun3Ly8vNHcf8MofHn/AKSa/HD/AMEHgX/5mqw/G/7AXjD4mf2R/wALI/b0 +KniD/hH9ct9
a0H+2/BXw/u/7N1KDd5F7b+b4XbybiPe2yVMOu44Iya8rsP29f24/CXhjxv4 K+J/wG0O1+If
hzXPhx/YUPiSxg0Oy1Oy8UeJ30QxSR6brOvfZ/L+y3LLd/aHbdMubErAPtXo 3w8/az+NuhfG
H/hWPx0i8K3uj6D8Rp/h94o8Z+HdGudOhl1u80XRta0W68i4u5106zkS/udK dZLi4ln1CXTB
FtF20US5qMt7/e+/r5MbjXjqrfcuy8vNf1c6r/hlD48/9JNfjh/4IPAv/wAz VH/DKHx5/wCk
mvxw/wDBB4F/+ZqvOfiF8XfEn7Ueh+BfBmu2NjH8Mvi/8fZtA0aS0icXGueE dM0PUNUZ5izy
W9zZ6pf6FOoKiS3vNC1KMbVkuGZPRvgZ/wAUB+2L8Yfgd4e+Tw7Pofhzx9bW TcLYalrNxrNn
qEVui4SK3lk0SO+ZQu97zUdQnd3M4CVHklLS9vV9rkvnjG7tffZd7du4f8Mo fHn/AKSa/HD/
AMEHgX/5mqP+GUPjz/0k1+OH/gg8C/8AzNVh/tWfE34k2/8AwTT+P3xHt/iF oaeItD8D/EP+
xde+HWrTBdP+wnVIrLbOG3xahbxwQpc7SPKvIZ1TaEUDw/4zfAf9oDwJ4d+F PgbT9A1zTvEX
jn44Gw1Dw3B+2j4+vLLVNNtvCXiK8jV9bmtxe6d+/iMrQW1syTNaWwkdgR5K nKMXon06vr95
UIyktWuvSPT7v63sfRn/AAyh8ef+kmvxw/8ABB4F/wDmao/4ZQ+PP/STX44f +CDwL/8AM1WH
+y3pnivwB+1P4w+DWra1rgsdG+B/gS//ALC1T4har4misNSvNW8XG9aK+1Rj cXO5oYoxPIqO
8VtbqURYo40+V/Hv7dH7U5/YDTXPFF3/AMK20vxT+yxPf/DzV7fRNW1i98V6 wPh/PrU9xZ+I
U1aSXRri0mSXEWqQyXFyunvNDd3DyyfZVKcIRTd+vV9Bxp1Jz5Vbp0XXXt/X ofYn/DKHx5/6
Sa/HD/wQeBf/AJmqP+GUPjz/ANJNfjh/4IPAv/zNV6n8OLD4k6X4LsrH4u+L ND1zxEnmf2hq
nhvw9NpVlPmRjH5drNd3bxYjKK26d9zKzDaGCLuVuqcWuv3v/M53Vkn0+5f5 HiH/AAyh8ef+
kmvxw/8ABB4F/wDmao/4ZQ+PP/STX44f+CDwL/8AM1Xt9FHs4+f3v/MXtZeX 3L/I8Ct/2Kfi
paeJLvxna/8ABRX4xRaxf2NvZX2qx+FfAS3NzbW7zPBBJKPDG5443ubhkQkq jXEpABds3v8A
hlD48/8ASTX44f8Agg8C/wDzNV7fRR7KPn97/wAw9rPy+5f5HiH/AAyh8ef+ kmvxw/8ABB4F
/wDmao/4ZQ+PP/STX44f+CDwL/8AM1Xt9FHs4+f3v/MPay8vuX+R4h/wyh8e f+kmvxw/8EHg
X/5mqP8AhlD48/8ASTX44f8Agg8C/wDzNV7fRR7OPn97/wAw9rLy+5f5HiH/ AAyh8ef+kmvx
w/8ABB4F/wDmao/4ZQ+PP/STX44f+CDwL/8AM1Xt9FHs4+f3v/MPay8vuX+R 4h/wyh8ef+km
vxw/8EHgX/5mqP8AhlD48/8ASTX44f8Agg8C/wDzNV7fRR7OPn97/wAw9rLy +5f5HiH/AAyh
8ef+kmvxw/8ABB4F/wDmao/4ZQ+PP/STX44f+CDwL/8AM1Xt9FHs4+f3v/MP ay8vuX+R4h/w
yh8ef+kmvxw/8EHgX/5mqP8AhlD48/8ASTX44f8Agg8C/wDzNV7fRR7OPn97 /wAw9rLy+5f5
HiH/AAyh8ef+kmvxw/8ABB4F/wDmarD0H9gLxh4W8aa98R/DH7enxU07xF4q +y/8JRr1h4K+
H8N7rH2aMxW32qdPC4e48qMlI/MLbFJVcA4r6Loo9lDz+9/5jVaa7fcv8jwL Sf2KfipoN/qe
q6F/wUV+MVlda3fLe6zc2nhXwFHJf3KwRW6zzMvhgGWQQW8EQdssI4Y0ztRQ L3/DKHx5/wCk
mvxw/wDBB4F/+Zqvb6KPZR8/vf8AmL2s/L7l/keIf8MofHn/AKSa/HD/AMEH gX/5mqP+GUPj
z/0k1+OH/gg8C/8AzNV7fRR7OPn97/zD2svL7l/keIf8MofHn/pJr8cP/BB4 F/8Amao/4ZQ+
PP8A0k1+OH/gg8C//M1Xt9FHs4+f3v8AzD2svL7l/keIf8MofHn/AKSa/HD/ AMEHgX/5mqP+
GUPjz/0k1+OH/gg8C/8AzNV7fRR7OPn97/zD2svL7l/keIf8MofHn/pJr8cP /BB4F/8Amao/
4ZQ+PP8A0k1+OH/gg8C//M1Xt9FHs4+f3v8AzD2svL7l/keIf8MofHn/AKSa /HD/AMEHgX/5
mqP+GUPjz/0k1+OH/gg8C/8AzNV7fRR7OPn97/zD2svL7l/keIf8MofHn/pJ r8cP/BB4F/8A
mao/4ZQ+PP8A0k1+OH/gg8C//M1Xt9FHs4+f3v8AzD2svL7l/keIf8MofHn/ AKSa/HD/AMEH
gX/5mqP+GUPjz/0k1+OH/gg8C/8AzNV7fRR7OPn97/zD2svL7l/keIf8MofH n/pJr8cP/BB4
F/8Amao/4ZQ+PP8A0k1+OH/gg8C//M1Xt9FHs4+f3v8AzD2svL7l/keIf8Mo fHn/AKSa/HD/
AMEHgX/5mqP+GUPjz/0k1+OH/gg8C/8AzNV7fRR7OPn97/zD2svL7l/keafs DeE9e8D/ALeH
xf8AC3if4m654yvrX4H/AA78/wASeJLewivbzdrnjp18xdPtra3GxWEa+XCn yopbc252+y6+
UP2Tf+Ukfxs/7If8N/8A08eN6+r6+Sxyti5rzPtMvd8FB+QUUUVyHYFFFFAB RRRQAUUUUAFF
FFABRRRQAUUUUAUtV8OaNrd/pmp6pZ+bPo9815pz+Yy+TM0EtuWwCA37qeVc NkfNnGQCLtFc
h8P9T1LTPGvib4bavqE941jPHrGm3U8pkf7FfyXDLC7MfvR3EF2iKoCpbi2X LMHxx1KtLDYi
EOW3tW1ddZKN1fv7sXr05Uux106VXE4ec+a/s0nZ9IuVtP8At6S0/vN9yfwj 4j1mz8Xal8Ov
GF59ovo/M1PSL/y1jS8sJbiTbEqgDMlrmOGTG75XtpGYNcFE6iiqWieI9G8Q /a10m88x7C+k
s72J42SSCZMEq6OAy5VkdSRh45EdSyOrGsPH6tFUZ1OZ3fLfe3bVtycVpfdr WV3dtV5fWZOr
CFlpzW2v30Vo3ettk9FZWSu0UUV1HKFFFFABRRRQAV+XH/BWjwF4s+Kv7SX7 SHwv8BaT9v13
xJ+xx4e0vRbHz44vtF3cXnjqGGPfIyom53UbmYKM5JAya/Uevzo/bf8AA+i/ Ej/gpD8RvBfi
G91i3s739n/4fedNoHiG80q7XZr/AIxkHl3VlLFPFyoB2Ou5SytlWYH8g8eM V9R8Lcbif5J4
aW1/hxVF7Xjfbbmjfa63PqODKftuI6NP+ZVF23pz62dvufofPfxl/Zj8cy+P PFGpfCn4cWcP
h/TfDfwrPhjSNMltbVLkeGvFWpatdaZaxF0SBxaG3ihEnlW5eeNTLGiyPHwd v4N+I3wU/a0+
H8d9+zx/wm+o6F/wuDXdMh07UtPW7e01bxLot7FfaYbySOMTxxar9jmS4ltG CrfGN5kEK3fv
H/DD3wY/6HX4wf8AiQnjL/5a1Tn/AOCfv7PFzr9t4rudZ+KkmqWVnPaWepP8 e/F5uILeZ4Xm
hSQ6ruVJGt4GdQQGMEZIJRcf5/4Li/KKMHSxFSdSFpXXsbNyeG+rptrFJ25d ZWaveXlb9trZ
XipvmpxUXdfb2Sqe00Tptb7drLzOP1HU/jL+zl+x1rOjad4evND8Y+NPEniG bwvqzPY3Nv4a
1nxN4qddGgvwZJA7xTa3btOYI7qBRY3W15v3C3FNf2a/Cfxn1r4jfBXwJc/8 I3oXwu+G+n/C
/wCGt5Iklxc+FNUeztNWl1K3zIHn8pD4WkgmkmE8dzpMjRmEkzT+kf8ADD3w Y/6HX4wf+JCe
Mv8A5a1T0z9j/wDZ41q91HTdG+KPxUu7jSLxbTVre2/aO8XyPZXDQxTiGZV1 YmNzDNDKFbBK
TRtjDKThS4kyimqtajUqxrSnOo5xox0lKdNp2deWkUp01d25a0ov4pc9ywGK k4wnGLgko2c3
slJb8i30k/OKfRW8r8C/sXfFjxp4+0DW/j7Zf2h4W8bfaPF3xU8Da7JBqWnw 6ssuqNa6JdRt
M0epeXFrljCl35ZjRPBFgAqh7VbXH8J/sNftL3H/AAjv/CyviVrGt/2xrEXh j4if2tercf2h
4Z0r+yvs91d77p/tkGo/2Be7rJt5g/4TzUN/meVdfa/eP+GHvgx/0Ovxg/8A EhPGX/y1qnof
7H/7PHieyfUvDXxR+Kmo28V5cWklxY/tHeL5kS4t5ngnhLJqxAeOaOSJ16o8 bKQCpA7P9eVz
SrQryWy0w0LR+NxsniGk1eNna7VGnzcyjLmy/sfRRcF3/iO72v8AYv39OaVr XVvE/Fn7DX7S
9v8A8JF/wrX4laxon9j6xL4Y+Hf9k3q2/wDZ/hnVf7V+0XVpsuk+xwad/b9l tsl2Gf8A4QPT
9nl+ba/ZPVP2pPhD8QfEHhXwJa/APwb4k8NW/wAJ/HkVzp1l4EXQIL660z/h Hr7T1GkRakXs
ESN9SSJo7tYCsVrcmJSRbGXpP+GHvgx/0Ovxg/8AEhPGX/y1o/4Ye+DH/Q6/ GD/xITxl/wDL
WuWtxhg8TiaVevWlN0+bR4aFpc8VGXMliEpc3vt3WjqTtZNKOscrq06coQgk pW/5eO6s7qzd
PS2n/gK87+V+FfgX8bfCmn6J8drnwD488R63ZfGuXxnrfh/xRrnhw+JNTt28 JT+G0CrYC00m
B0Z4JBELlgbaFpTMZ5Psi0/2jPgh8cv2gdN8ZeMfC/7Mf/CKXnif4EfEfw+m m3mtaX/aV/q2
o23h230835t5mgWeUabPGjLPcRpb2tsZZomfyIvYP+GHvgx/0Ovxg/8AEhPG X/y1o/4Ye+DH
/Q6/GD/xITxl/wDLWrpcY5ZSzCnjYyftKacY/uLJQfN7iisWo8q5nypq60V7 JImW
Re: subtle OCL Error detected: operations with return type EEList<? extends ECla [message #47383 is a reply to message #47326] Sun, 23 December 2007 23:58 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: cdamus.ca.ibm.com

Hi, Philipp,

I don't have the wherewithal just now to look at your sample code, but
find some replies in-line, below.

Cheers,

Christian

Philipp W. Kutter wrote:

> Hi.
> I run the newest Eclipse, EMF and OCL. The OCL version is
> 1.2.0.v200709211511

> I have taken Christian Damus's Library tutorial for OCL
> derive/body/constraints, and added all I need to show the error.
> See Screenshot "EEListExtendsClassProblem.jpg")
> See eclipse projects

> As discussed in other posts, the Industrie's
> EOperation

> getCompany(): EList<? extends Company>

If this EOperation were declared as a multiplicity-many value of type "?
extends Company," then this would work as you expect. Unfortunately, EMF
doesn't allow that as we discovered in discussion on another newsgroup,
and MDT OCL does not yet support Ecore's generic types.


> is giving back the value of the features
> FoodIndustry::company and CarIndustry::company

> This works perfectly, as you can see in the generated editor,
> if you look at read-only, derived feature companyAsReference
> of class Industry in the property editor.
> The OCL definition of companyAsReference is:
> getCompany()

> Using this feature, one can read the name of the first company,
> using OCL. This is done in feature firstCompanyNameFromReference.
> The OCL definition of this working feature:
> companyAsReference->first().name

This works because companyAsReference is declared as a multiplicity-many
EReference of type Company (effectively generalizing the wildcard type of
the operation as simply Company). So, OCL knows what the collection type
is.


> Now, if I define a similar feature, which uses the operation
> getCompany() directly, rather than the reference, it does not
> work. The feature doing this is firstCompanyNameFromOperation,
> its OCL definition:
> getCompany()->first().name

> This is clearly a bug, true?

Well, not actually a bug. An enhancement that has not yet been
implemented. MDT OCL currently maps Ecore's EEList data type to OCL's
Sequence. This is a nice feature, but it deviates from the specification,
because EMOF doesn't define collection types; these are implicit in
multiplicities. OCL defines collection types in order to model values of
properties in the model, but EMOF provides no means by which OCL might
guess that a data type implements Sequence values. We happen to know what
some of Ecore's data types mean, but that's an EMF-ism.

So, technically speaking, OCL shouldn't have a clue of what EEList means
and should treat it as an opaque value (and because data types in EMOF and
in Ecore do not have operations, there wouldn't be much that an OCL
expression could do with these values). However, the MDT implementation
for Ecore has always mapped EEList to Sequence(OclAny) which is why
casting works in firstCompanyNameFromOperationWithOclAsType. MDT OCL
hasn't taken advantage of Ecore's genericity support to be more specific
about the element type of the collection.

Feel free to raise an enhancement request for this. Hopefully a
contributor in the community can work something up (maybe that's you?).
There are some corollaries to consider, including but probably not limited
to:

- UML support: we would need to do the same in the UML metamodel
binding,
to interpret bindings of the EEList template in the UML
representation of the
Ecore metamodel (Ecore.metamodel.uml). Hopefully this metamodel does
represent EEList as a template DataType ... might be an enhancement
request for the UML2 component, otherwise
- EMOF and UML have no notion of wildcard types. MDT OCL could map an
unbounded wildcard to OclAny and a bounded wildcard to (one of) the
upper bound(s), but that wouldn't really be correct. Though, I
suppose it
might not really matter because OCL's collections are immutable
values,
anyway, which is why it can support collection-type conformance in a
way
that Java cannot. This would need thought, especially for multiple
upper
bounds (lower bounds would probably be ignored, but ...)


> To double check, I do an explicit cast in a third feature called
> firstCompanyNameFromOperationWithOclAsType, having
> OCL definition:
> getCompany()->first().oclAsType(Company).name

Yes, this works because you are casting the OclAny element type of the
collection value to Company.


> As you can see in the screenshot
> EditorBehaviorEEListExtendsClassProblem.jpg, this third feature works
> again.

> With other words, the OCL collection operations do not work
> correctly on EMF operations with types like EEList<? extends EClass1>

Well, it's hard to say what is "correct" for a concept that doesn't exist
in OCL :-)
But, MDT OCL does strive to be practically useful, so there is an
opportunity here for a meaty contribution from the community.


> Best Regards, Philipp
Re: subtle OCL Error detected: operations with return type EEList<? extends ECla [message #47414 is a reply to message #47383] Wed, 26 December 2007 10:24 Go to previous messageGo to next message
Philipp Kutter is currently offline Philipp KutterFriend
Messages: 306
Registered: July 2009
Senior Member
Hi, Christian.
Comments and questions in-line


> I don't have the wherewithal just now to look at your sample code, but
> find some replies in-line, below.
Shall I attach it to a but report?

>> As discussed in other posts, the Industrie's
>> EOperation
>
>> getCompany(): EList<? extends Company>
>
> If this EOperation were declared as a multiplicity-many value of type "?
> extends Company," then this would work as you expect. Unfortunately,
> EMF doesn't allow that as we discovered in discussion on another
> newsgroup, and MDT OCL does not yet support Ecore's generic types.

I understand. In fact, everything in MDT OCL works well, except that
I need to add a ".oclAsType()" in addition.

Do you think I should open a feature request for EMF that tells I should
be allowed to define a multiplicity-many return type with type "?
extends Company", rather than the multiplicity-one return type "EList<?
extends Company>" as I have now, and as Ed told us to do on the newsgroup?

>> is giving back the value of the features
>> FoodIndustry::company and CarIndustry::company
>
>> This works perfectly, as you can see in the generated editor,
>> if you look at read-only, derived feature companyAsReference
>> of class Industry in the property editor.
>> The OCL definition of companyAsReference is:
>> getCompany()
>
>> Using this feature, one can read the name of the first company,
>> using OCL. This is done in feature firstCompanyNameFromReference.
>> The OCL definition of this working feature:
>> companyAsReference->first().name
>
> This works because companyAsReference is declared as a multiplicity-many
> EReference of type Company (effectively generalizing the wildcard type
> of the operation as simply Company). So, OCL knows what the collection
> type is.

I understand now.

>> Now, if I define a similar feature, which uses the operation
>> getCompany() directly, rather than the reference, it does not
>> work. The feature doing this is firstCompanyNameFromOperation,
>> its OCL definition:
>> getCompany()->first().name
>
>> This is clearly a bug, true?
>
> Well, not actually a bug. An enhancement that has not yet been
> implemented. MDT OCL currently maps Ecore's EEList data type to OCL's
> Sequence. This is a nice feature, but it deviates from the
> specification, because EMOF doesn't define collection types; these are
> implicit in multiplicities. OCL defines collection types in order to
> model values of properties in the model, but EMOF provides no means by
> which OCL might guess that a data type implements Sequence values. We
> happen to know what some of Ecore's data types mean, but that's an EMF-ism.
>
> So, technically speaking, OCL shouldn't have a clue of what EEList means
> and should treat it as an opaque value (and because data types in EMOF
> and in Ecore do not have operations, there wouldn't be much that an OCL
> expression could do with these values). However, the MDT implementation
> for Ecore has always mapped EEList to Sequence(OclAny) which is why
> casting works in firstCompanyNameFromOperationWithOclAsType. MDT OCL
> hasn't taken advantage of Ecore's genericity support to be more specific
> about the element type of the collection.
>
> Feel free to raise an enhancement request for this. Hopefully a
> contributor in the community can work something up (maybe that's you?).
> There are some corollaries to consider, including but probably not
> limited to:
>
> - UML support: we would need to do the same in the UML metamodel binding,
> to interpret bindings of the EEList template in the UML
> representation of the
> Ecore metamodel (Ecore.metamodel.uml). Hopefully this metamodel does
> represent EEList as a template DataType ... might be an enhancement
> request for the UML2 component, otherwise
> - EMOF and UML have no notion of wildcard types. MDT OCL could map an
> unbounded wildcard to OclAny and a bounded wildcard to (one of) the
> upper bound(s), but that wouldn't really be correct. Though, I
> suppose it
> might not really matter because OCL's collections are immutable values,
> anyway, which is why it can support collection-type conformance in a
> way
> that Java cannot. This would need thought, especially for multiple
> upper
> bounds (lower bounds would probably be ignored, but ...)

Hmm, this overhelms me.

Don't you think it would be a good starting point to create an
enhancement request for EMF, that such an operation should be
represented with a multiplicity-many return type with type "? extends
Company", rather than the multiplicity-one return type "EList<? extends
Company>"?

This would be nicer on the EMF side, and as I understood you, this would
translate directly into OCL.


From what you tell me, OCL should only know what is coming from the
ECore/EMOF model, and not what is comming from the generated Java code.

From that perspective, it may be useful to highlight to Ed again the
existing feature request to support not only Sequence behavior of many
features, but as well set and bag behavior. The reason for him to look
again at this could be, that in OCL different operations can be applied
to these collection types. Does EMof support the specification whether
something is a sequence, a set, or a bag? EMF somehow does it through
the unique and ordered options, but it always generates a list. In OCL,
it should be treated as list, set or bag, depending on this options.

Best, Philipp



>> To double check, I do an explicit cast in a third feature called
>> firstCompanyNameFromOperationWithOclAsType, having
>> OCL definition:
>> getCompany()->first().oclAsType(Company).name
>
> Yes, this works because you are casting the OclAny element type of the
> collection value to Company.
>
>
>> As you can see in the screenshot
>> EditorBehaviorEEListExtendsClassProblem.jpg, this third feature works
>> again.
>
>> With other words, the OCL collection operations do not work
>> correctly on EMF operations with types like EEList<? extends EClass1>
>
> Well, it's hard to say what is "correct" for a concept that doesn't
> exist in OCL :-)
> But, MDT OCL does strive to be practically useful, so there is an
> opportunity here for a meaty contribution from the community.
>
>
>> Best Regards, Philipp
>
Re: subtle OCL Error detected: operations with return type EEList<? extends ECla [message #47443 is a reply to message #47414] Wed, 26 December 2007 12:47 Go to previous messageGo to next message
Eclipse UserFriend
Originally posted by: merks.ca.ibm.com

Philipp,

Comments below.


Philipp W. Kutter wrote:
> Hi, Christian.
> Comments and questions in-line
>
>
>> I don't have the wherewithal just now to look at your sample code,
>> but find some replies in-line, below.
> Shall I attach it to a but report?
>
>>> As discussed in other posts, the Industrie's
>>> EOperation
>>
>>> getCompany(): EList<? extends Company>
>>
>> If this EOperation were declared as a multiplicity-many value of type
>> "? extends Company," then this would work as you expect. Unfortunately,
>> EMF doesn't allow that as we discovered in discussion on another
>> newsgroup, and MDT OCL does not yet support Ecore's generic types.
>
> I understand. In fact, everything in MDT OCL works well, except that
> I need to add a ".oclAsType()" in addition.
>
> Do you think I should open a feature request for EMF that tells I should
> be allowed to define a multiplicity-many return type with type "?
> extends Company", rather than the multiplicity-one return type
> "EList<? extends Company>" as I have now, and as Ed told us to do on
> the newsgroup?
No, you can model this with an EOperation. If necessary, you could
define a feature of type Company, suppress it from the API, and instead
surface it using an EOperation with the type you want to see in the
API. (I don't consider the inability to use wildcards for feature types
as unfortunate.)
>
>>> is giving back the value of the features
>>> FoodIndustry::company and CarIndustry::company
>>
>>> This works perfectly, as you can see in the generated editor,
>>> if you look at read-only, derived feature companyAsReference
>>> of class Industry in the property editor.
>>> The OCL definition of companyAsReference is:
>>> getCompany()
>>
>>> Using this feature, one can read the name of the first company,
>>> using OCL. This is done in feature firstCompanyNameFromReference.
>>> The OCL definition of this working feature:
>>> companyAsReference->first().name
>>
>> This works because companyAsReference is declared as a
>> multiplicity-many EReference of type Company (effectively
>> generalizing the wildcard type of the operation as simply Company).
>> So, OCL knows what the collection type is.
>
> I understand now.
>
>>> Now, if I define a similar feature, which uses the operation
>>> getCompany() directly, rather than the reference, it does not
>>> work. The feature doing this is firstCompanyNameFromOperation,
>>> its OCL definition:
>>> getCompany()->first().name
>>
>>> This is clearly a bug, true?
>>
>> Well, not actually a bug. An enhancement that has not yet been
>> implemented. MDT OCL currently maps Ecore's EEList data type to
>> OCL's Sequence. This is a nice feature, but it deviates from the
>> specification, because EMOF doesn't define collection types; these
>> are implicit in multiplicities. OCL defines collection types in
>> order to model values of properties in the model, but EMOF provides
>> no means by which OCL might guess that a data type implements
>> Sequence values. We happen to know what some of Ecore's data types
>> mean, but that's an EMF-ism.
>>
>> So, technically speaking, OCL shouldn't have a clue of what EEList
>> means and should treat it as an opaque value (and because data types
>> in EMOF and in Ecore do not have operations, there wouldn't be much
>> that an OCL expression could do with these values). However, the MDT
>> implementation for Ecore has always mapped EEList to Sequence(OclAny)
>> which is why casting works in
>> firstCompanyNameFromOperationWithOclAsType. MDT OCL hasn't taken
>> advantage of Ecore's genericity support to be more specific about the
>> element type of the collection.
>>
>> Feel free to raise an enhancement request for this. Hopefully a
>> contributor in the community can work something up (maybe that's
>> you?). There are some corollaries to consider, including but
>> probably not limited to:
>>
>> - UML support: we would need to do the same in the UML metamodel
>> binding,
>> to interpret bindings of the EEList template in the UML
>> representation of the
>> Ecore metamodel (Ecore.metamodel.uml). Hopefully this metamodel
>> does
>> represent EEList as a template DataType ... might be an enhancement
>> request for the UML2 component, otherwise
>> - EMOF and UML have no notion of wildcard types. MDT OCL could map an
>> unbounded wildcard to OclAny and a bounded wildcard to (one of) the
>> upper bound(s), but that wouldn't really be correct. Though, I
>> suppose it
>> might not really matter because OCL's collections are immutable
>> values,
>> anyway, which is why it can support collection-type conformance
>> in a way
>> that Java cannot. This would need thought, especially for
>> multiple upper
>> bounds (lower bounds would probably be ignored, but ...)
>
> Hmm, this overhelms me.
>
> Don't you think it would be a good starting point to create an
> enhancement request for EMF, that such an operation should be
> represented with a multiplicity-many return type with type "? extends
> Company", rather than the multiplicity-one return type "EList<?
> extends Company>"?
It's also an end point when I refuse to do it. :-P
>
> This would be nicer on the EMF side, and as I understood you, this would
> translate directly into OCL.
I think it's gross to try to do something that works only for
multi-valued features; an EOperation is sufficient for your needs.
>
>
> From what you tell me, OCL should only know what is coming from the
> ECore/EMOF model, and not what is comming from the generated Java code.
>
> From that perspective, it may be useful to highlight to Ed again the
> existing feature request to support not only Sequence behavior of many
> features, but as well set and bag behavior. The reason for him to look
> again at this could be, that in OCL different operations can be
> applied to these collection types. Does EMof support the specification
> whether
> something is a sequence, a set, or a bag? EMF somehow does it through
> the unique and ordered options, but it always generates a list. In OCL,
> it should be treated as list, set or bag, depending on this options.

Bugzilla https://bugs.eclipse.org/bugs/show_bug.cgi?id=75931 has been
open for a long time. I terms of reflective access, we couldn't just
introduce changes where an isMany feature would stop returning a list.
But we could surface a view of that list that's a Collection or Set; the
only problem with Set is that the equality method is defined so that
it's incompatible with the equality method for List, so it would need to
be some type of view (just as an EMap has a java.util.Map view). It's
certainly doable, but it's also a very old bugzilla without a lot of
compelling reasons to implement it to justify the significant increase
in complexity.
>
> Best, Philipp
>
>
>
>>> To double check, I do an explicit cast in a third feature called
>>> firstCompanyNameFromOperationWithOclAsType, having
>>> OCL definition:
>>> getCompany()->first().oclAsType(Company).name
>>
>> Yes, this works because you are casting the OclAny element type of
>> the collection value to Company.
>>
>>
>>> As you can see in the screenshot
>>> EditorBehaviorEEListExtendsClassProblem.jpg, this third feature works
>>> again.
>>
>>> With other words, the OCL collection operations do not work
>>> correctly on EMF operations with types like EEList<? extends EClass1>
>>
>> Well, it's hard to say what is "correct" for a concept that doesn't
>> exist in OCL :-)
>> But, MDT OCL does strive to be practically useful, so there is an
>> opportunity here for a meaty contribution from the community.
>>
>>
>>> Best Regards, Philipp
>>
Re: subtle OCL Error detected: operations with return type EEList<? extends ECla [message #47470 is a reply to message #47414] Mon, 31 December 2007 15:15 Go to previous message
Eclipse UserFriend
Originally posted by: cdamus.ca.ibm.com

Hi, Philipp,

I don't think that I do need the actual sample model on a bugzilla. Your
description of the issue is quite clear.

If you can capture the same information in an enhancement request for MDT
OCL, for support of EEList with type argument to be interepreted as
Sequence with the appropriate element type, that will be all that we can
do for now. I don't think it is appropriate to try to bend EMF to make
OCL work better. Rather it should be the other way around.

Although, as this case deals with wildcards, there probably isn't much to
be done there, anyway. Generic types or templates don't exist in (E)MOF
at all, and UML's template model doesn't have wildcards. Moreover, OCL
doesn't use UML templates to model its generic collection types, but
rather defines Collection as a specialization of DataType with an
"elementType" association to Classifier. Can you find a way to avoid
using the wildcard EEList operation in your OCL constraints? Perhaps use
the features from which it computes its result, instead.

Cheers,

Christian
Previous Topic:java.lang.NoClassDefFoundError: org/eclipse/ocl/internal/parser/OCLParser
Next Topic:[Announce] MDT OCL 1.2.0 I200801031555 is available
Goto Forum:
  


Current Time: Thu Apr 25 15:37:55 GMT 2024

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

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

Back to the top