From: Martin Zaun Date: September 28 2010 8:19am Subject: bzr commit into mysql-5.1-telco-7.1 branch (martin.zaun:3838) List-Archive: http://lists.mysql.com/commits/119230 Message-Id: <201009280821.o8S8L9Ab008841@rcsinet13.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1688012697==" --===============1688012697== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/mz/mysql/ndb-7.1-opt64-gcc/ based on revid:martin.zaun@stripped 3838 Martin Zaun 2010-09-28 ndbjtie - minor fixes of jtie unit tests (removed static object construction) modified: storage/ndb/src/ndbjtie/jtie/test/myapi/myapi.cpp storage/ndb/src/ndbjtie/jtie/test/myapi/myapi.hpp storage/ndb/src/ndbjtie/jtie/test/myapi/myapi_test.cpp storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/A.java storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/B0.java storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/B1.java storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/MyJapi.java storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi_lib.cpp storage/ndb/src/ndbjtie/jtie/test/myjapi/test/MyJapiTest.java === modified file 'storage/ndb/src/ndbjtie/jtie/test/myapi/myapi.cpp' --- a/storage/ndb/src/ndbjtie/jtie/test/myapi/myapi.cpp 2010-02-13 08:01:08 +0000 +++ b/storage/ndb/src/ndbjtie/jtie/test/myapi/myapi.cpp 2010-09-28 08:19:43 +0000 @@ -25,30 +25,156 @@ #include "myapi.hpp" #include "helpers.hpp" -void f0() -{ - TRACE("void f0()"); -} - +// --------------------------------------------------------------------------- +// static initializations // --------------------------------------------------------------------------- -A * A::a = new A(); - -int32_t A::d0s = 10; -const int32_t A::d0sc = -10; int32_t B0::d0s = 20; const int32_t B0::d0sc = -20; + int32_t B1::d0s = 30; const int32_t B1::d0sc = -30; -const C1 * const C1::cc = new C1(); -C1 * const C1::c = new C1(); -const C0 * const C0::cc = C1::cc; -C0 * const C0::c = C1::c; - -D0 D0::d; -D1 D1::d; -D2 D2::d; +A * A::a; +int32_t A::d0s = 10; +const int32_t A::d0sc = -10; + +void B0::init() { +} + +void B0::finit() { +} + +void B1::init() { +} + +void B1::finit() { +} + +void A::init() { + assert(!a); + a = new A(); + //printf(" a = %p\n", a); +} + +void A::finit() { + assert(a); + delete a; + a = NULL; +} + +// ---------------------------------------- + +const C0 * C0::cc; +C0 * C0::c; + +const C1 * C1::cc; +C1 * C1::c; + +void C0::init() { + assert(!c); + assert(!cc); + assert(C1::c); + assert(C1::cc); + c = C1::c; + cc = C1::cc; + //printf(" c = %p, cc = %p\n", C0::c, C0::cc); +} + +void C0::finit() { + assert(c); + assert(cc); + c = NULL; + cc = NULL; +} + +void C1::init() { + assert(!c); + assert(!cc); + c = new C1(); + cc = new C1(); + //printf(" c = %p, cc = %p\n", C1::c, C1::cc); +} + +void C1::finit() { + assert(c); + assert(cc); + delete c; + delete cc; + c = NULL; + cc = NULL; +} + +// ---------------------------------------- + +D0 * D0::d; +D1 * D1::d; +D2 * D2::d; + +void D0::init() { + assert(!d); + d = new D0(); +} + +void D0::finit() { + assert(d); + delete d; + d = NULL; +} + +void D1::init() { + assert(!d); + d = new D1(); +} + +void D1::finit() { + assert(d); + delete d; + d = NULL; +} + +void D2::init() { + assert(!d); + d = new D2(); +} + +void D2::finit() { + assert(d); + delete d; + d = NULL; +} + +// ---------------------------------------- + +void myapi_init() { + // some order dependencies + D2::init(); + D1::init(); + D0::init(); + C1::init(); + C0::init(); + B1::init(); + B0::init(); + A::init(); +} + +void myapi_finit() { + A::init(); + B0::init(); + B1::init(); + C0::init(); + C1::init(); + D0::init(); + D1::init(); + D2::init(); +} + +// --------------------------------------------------------------------------- + +void f0() +{ + TRACE("void f0()"); +} // --------------------------------------------------------------------------- === modified file 'storage/ndb/src/ndbjtie/jtie/test/myapi/myapi.hpp' --- a/storage/ndb/src/ndbjtie/jtie/test/myapi/myapi.hpp 2010-04-15 16:37:27 +0000 +++ b/storage/ndb/src/ndbjtie/jtie/test/myapi/myapi.hpp 2010-09-28 08:19:43 +0000 @@ -37,6 +37,18 @@ #include "helpers.hpp" +// ---------------------------------------------------------------------- +// initializer and finalizer functions +// ---------------------------------------------------------------------- + +// initializer avoiding issues with static construction of objects +extern void myapi_init(); +extern void myapi_finit(); + +// ---------------------------------------------------------------------- +// void result/parameter types +// ---------------------------------------------------------------------- + extern void f0(); // ---------------------------------------------------------------------- @@ -452,6 +464,16 @@ extern void f784(double * const); // ---------------------------------------------------------------------- struct B0 { + static int32_t d0s; + static const int32_t d0sc; + + int32_t d0; + const int32_t d0c; + + static void init(); + + static void finit(); + B0() : d0(21), d0c(-21) { TRACE("B0()"); }; @@ -461,8 +483,7 @@ struct B0 { ABORT_ERROR("!USE OF COPY CONSTRUCTOR!"); }; - virtual ~B0() { - }; + virtual ~B0() {}; B0 & operator=(const B0 & p) { TRACE("B0 & operator=(const B0 &)"); @@ -473,13 +494,6 @@ struct B0 { // ---------------------------------------------------------------------- - static int32_t d0s; - static const int32_t d0sc; - int32_t d0; - const int32_t d0c; - - // ---------------------------------------------------------------------- - static int32_t f0s() { TRACE("int32_t B0::f0s()"); return 20; @@ -498,6 +512,16 @@ struct B0 { }; struct B1 : public B0 { + static int32_t d0s; + static const int32_t d0sc; + + int32_t d0; + const int32_t d0c; + + static void init(); + + static void finit(); + B1() : d0(31), d0c(-31) { TRACE("B1()"); }; @@ -507,8 +531,7 @@ struct B1 : public B0 { ABORT_ERROR("!USE OF COPY CONSTRUCTOR!"); }; - virtual ~B1() { - }; + virtual ~B1() {}; B1 & operator=(const B1 & p) { TRACE("B1 & operator=(const B1 &)"); @@ -519,13 +542,6 @@ struct B1 : public B0 { // ---------------------------------------------------------------------- - static int32_t d0s; - static const int32_t d0sc; - int32_t d0; - const int32_t d0c; - - // ---------------------------------------------------------------------- - static int32_t f0s() { TRACE("int32_t B1::f0s()"); return 30; @@ -544,6 +560,15 @@ struct B1 : public B0 { struct A { static A * a; + static int32_t d0s; + static const int32_t d0sc; + + int32_t d0; + const int32_t d0c; + + static void init(); + + static void finit(); A() : d0(11), d0c(-11) { TRACE("A()"); @@ -572,16 +597,9 @@ struct A { // ---------------------------------------------------------------------- - static int32_t d0s; - static const int32_t d0sc; - int32_t d0; - const int32_t d0c; - - // ---------------------------------------------------------------------- - static A * deliver_ptr() { TRACE("A * A::deliver_ptr()"); - return a; + return A::a; }; static A * deliver_null_ptr() { @@ -591,7 +609,7 @@ struct A { static A & deliver_ref() { TRACE("A & A::deliver_ref()"); - return *a; + return *A::a; }; static A & deliver_null_ref() { @@ -621,9 +639,8 @@ struct A { static void print(A * p0) { TRACE("void A::print(A *)"); - // in case of problems with %p - //printf(" p0 = %lx\n", (unsigned long)p0); printf(" p0 = %p\n", (void*)p0); + fflush(stdout); }; // ---------------------------------------------------------------------- @@ -821,8 +838,15 @@ inline int32_t h3r(int8_t p0, int16_t p1 // ---------------------------------------------------------------------- struct C0 { + static C0 * c; + static const C0 * cc; + const int64_t id; + static void init(); + + static void finit(); + C0() : id((int64_t)this) { TRACE("C0()"); } @@ -874,10 +898,6 @@ struct C0 { // (non-virtual) instance (on purpose) array functions // ---------------------------------------------------------------------- - static C0 * const c; - static const C0 * const cc; - //printf(" cp = %p, c = %p, cc = %p\n", cp, C0::c, C0::cc); - void check(int64_t id) const { TRACE("void check(int64_t) const"); if (id != this->id) ABORT_ERROR("id != this->id"); @@ -885,7 +905,8 @@ struct C0 { void print() const { TRACE("void C0::print() const"); - printf(" this->id = %lx\n", id); + printf(" this->id = %llx\n", id); + fflush(stdout); } const C0 * deliver_C0Cp() const { @@ -934,6 +955,13 @@ struct C0 { }; struct C1 : public C0 { + static C1 * c; + static const C1 * cc; + + static void init(); + + static void finit(); + C1() { TRACE("C1()"); }; @@ -985,10 +1013,6 @@ struct C1 : public C0 { // (non-virtual) instance (on purpose) array functions // ---------------------------------------------------------------------- - static C1 * const c; - static const C1 * const cc; - //printf(" cp = %p, c = %p, cc = %p\n", cp, C1::c, C1::cc); - const C1 * deliver_C1Cp() const { TRACE("const C1 * C1::deliver_C1Cp() const"); return cc; @@ -1041,36 +1065,45 @@ struct C1 : public C0 { struct D1; struct D0 { + static D0 * d; + static void init(); + static void finit(); + virtual ~D0() {} + int f_d0() { TRACE("D0::f_d0()"); return 20; } int f_nv() { TRACE("D0::f_nv()"); return 21; } virtual int f_v() { TRACE("D0::f_v()"); return 22; } static D1 * sub(); - static D0 d; - virtual ~D0() {} }; struct D1 : D0 { + static D1 * d; + static void init(); + static void finit(); + virtual ~D1() {} + int f_d1() { TRACE("D0::f_d1()"); return 30; } int f_nv() { TRACE("D1::f_nv()"); return 31; } virtual int f_v() { TRACE("D1::f_v()"); return 32; } static D1 * sub(); - static D1 d; - virtual ~D1() {} }; struct D2 : D1 { + static D2 * d; + static void init(); + static void finit(); + virtual ~D2() {} + int f_d2() { TRACE("D2::f_d2()"); return 40; } int f_nv() { TRACE("D2::f_nv()"); return 41; } virtual int f_v() { TRACE("D2::f_v()"); return 42; } static D1 * sub(); - static D2 d; - virtual ~D2() {} }; // d1class instance returns (casts unnecessary but for attention) -inline D1 * D0::sub() { TRACE("D1 * D0::sub()"); return ((D1*)&D1::d); } -inline D1 * D1::sub() { TRACE("D1 * D1::sub()"); return ((D1*)&D2::d); } -inline D1 * D2::sub() { TRACE("D1 * D2::sub()"); return NULL; } +inline D1 * D0::sub() { TRACE("D1 * D0::sub()"); return ((D1*)D1::d); } // D1 +inline D1 * D1::sub() { TRACE("D1 * D1::sub()"); return ((D1*)D2::d); } // D2 +inline D1 * D2::sub() { TRACE("D1 * D2::sub()"); return NULL; } // -- // ---------------------------------------------------------------------- // enums === modified file 'storage/ndb/src/ndbjtie/jtie/test/myapi/myapi_test.cpp' --- a/storage/ndb/src/ndbjtie/jtie/test/myapi/myapi_test.cpp 2010-04-06 06:28:25 +0000 +++ b/storage/ndb/src/ndbjtie/jtie/test/myapi/myapi_test.cpp 2010-09-28 08:19:43 +0000 @@ -751,6 +751,8 @@ main(int argc, const char* argv[]) printf("\n--> main()\n"); (void)argc; (void)argv; + myapi_init(); + if (true) { test0(); test1(); @@ -769,6 +771,8 @@ main(int argc, const char* argv[]) test12(); } + myapi_finit(); + printf("\n<-- main()\n"); return 0; } === modified file 'storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/A.java' --- a/storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/A.java 2010-04-06 06:28:25 +0000 +++ b/storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/A.java 2010-09-28 08:19:43 +0000 @@ -25,17 +25,9 @@ public class A extends com.mysql.jtie.Wr // this c'tor may me protected, for access from JNI is still possible // with default constructor, cdelegate needs to be written from JNI protected A() { - System.out.println("<-> myjapi.A()"); + //System.out.println("<-> myjapi.A()"); }; -/* - // this c'tor may me protected, for access from JNI is still possible - protected A(long cdelegate) { - super(cdelegate); - //System.out.println("<-> myjapi.A(" + Long.toHexString(cdelegate) + ")"); - }; -*/ - // constructor wrapper (mapped by reference) static public native A create_r(); === modified file 'storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/B0.java' --- a/storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/B0.java 2010-04-06 06:28:25 +0000 +++ b/storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/B0.java 2010-09-28 08:19:43 +0000 @@ -25,17 +25,9 @@ public class B0 extends com.mysql.jtie.W // this c'tor may me protected, for access from JNI is still possible // with default constructor, cdelegate needs to be written from JNI protected B0() { - System.out.println("<-> myjapi.B0()"); + //System.out.println("<-> myjapi.B0()"); }; -/* - // this c'tor may me protected, for access from JNI is still possible - protected B0(long cdelegate) { - super(cdelegate); - //System.out.println("<-> myjapi.B0(" + Long.toHexString(cdelegate) + ")"); - }; -*/ - // static method static public native int f0s(); === modified file 'storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/B1.java' --- a/storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/B1.java 2010-04-06 06:28:25 +0000 +++ b/storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/B1.java 2010-09-28 08:19:43 +0000 @@ -25,17 +25,9 @@ public class B1 extends B0 { // this c'tor may me protected, for access from JNI is still possible // with default constructor, cdelegate needs to be written from JNI protected B1() { - System.out.println("<-> myjapi.B1()"); + //System.out.println("<-> myjapi.B1()"); }; -/* - // this c'tor may me protected, for access from JNI is still possible - protected B1(long cdelegate) { - super(cdelegate); - //System.out.println("<-> myjapi.B1(" + Long.toHexString(cdelegate) + ")"); - }; -*/ - // static method static public native int f0s(); === modified file 'storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/MyJapi.java' --- a/storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/MyJapi.java 2010-04-15 16:37:27 +0000 +++ b/storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi/MyJapi.java 2010-09-28 08:19:43 +0000 @@ -27,6 +27,10 @@ import java.nio.ByteBuffer; public class MyJapi { + // ---------------------------------------------------------------------- + // Mapping of void result/parameters + // ---------------------------------------------------------------------- + static public native void f0(); // ---------------------------------------------------------------------- === modified file 'storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi_lib.cpp' --- a/storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi_lib.cpp 2010-04-06 06:28:25 +0000 +++ b/storage/ndb/src/ndbjtie/jtie/test/myjapi/myjapi_lib.cpp 2010-09-28 08:19:43 +0000 @@ -69,6 +69,10 @@ JNI_OnLoad(JavaVM * jvm, void * reserved return JNI_ERR; } + VERBOSE("initializing the myapi resources ..."); + myapi_init(); + VERBOSE("... initialized the myapi resources"); + VERBOSE("... loaded the MyJAPI JTie library"); return required_jni_version; } @@ -82,6 +86,10 @@ JNI_OnUnload(JavaVM * jvm, void * reserv TRACE("void JNI_OnUnload(JavaVM *, void *)"); VERBOSE("unloading the MyJAPI JTie library..."); + VERBOSE("releasing the myapi resources ..."); + myapi_finit(); + VERBOSE("... released the myapi resources"); + JTie_OnUnload(jvm, reserved); VERBOSE("... unloaded the MyJAPI JTie library"); === modified file 'storage/ndb/src/ndbjtie/jtie/test/myjapi/test/MyJapiTest.java' --- a/storage/ndb/src/ndbjtie/jtie/test/myjapi/test/MyJapiTest.java 2010-04-15 16:37:27 +0000 +++ b/storage/ndb/src/ndbjtie/jtie/test/myjapi/test/MyJapiTest.java 2010-09-28 08:19:43 +0000 @@ -2488,11 +2488,10 @@ public class MyJapiTest { out.println("\ncalling A.print()..."); try { A.print(a); - assert (false); // XXX conflicts with catch... + throw new RuntimeException("Expected exception not thrown."); } catch (AssertionError e) { out.println("... successfully caught: " + e); } - out.println("\ncalling A.deliver_ptr()..."); A pa = A.deliver_ptr(); assert (pa != null); @@ -2517,7 +2516,7 @@ public class MyJapiTest { out.println("\ncalling A.deliver_null_ref()..."); try { A.deliver_null_ref(); - assert (false); // XXX conflicts with catch... + throw new RuntimeException("Expected exception not thrown."); } catch (AssertionError e) { out.println("... successfully caught: " + e); } @@ -3292,88 +3291,88 @@ public class MyJapiTest { out.println("... ap = " + ap); assert (ap != null); - out.println(); + out.println("\ncalling A.h0()..."); A.h0(); - out.println(); + out.println("\ncalling A.h1(byte)..."); A.h1((byte)1); - out.println(); + out.println("\ncalling A.h2(byte), short)..."); A.h2((byte)1, (short)2); - out.println(); - A.h3((byte)1, (short)2, 3); + out.println("\ncalling A.h3(byte), short, int)..."); + A.h3((byte)1, (short)2, (int)3); - out.println(); + out.println("\ncalling A.h0r()..."); n = A.h0r(); assert (n == 0); - out.println(); + out.println("\ncalling A.h1r(byte)..."); n = A.h1r((byte)1); assert (n == 1); - out.println(); + out.println("\ncalling A.h2r(byte, short)..."); n = A.h2r((byte)1, (short)2); assert (n == 3); - out.println(); - n = A.h3r((byte)1, (short)2, 3); + out.println("\ncalling A.h3r(byte, short, int)..."); + n = A.h3r((byte)1, (short)2, (int)3); assert (n == 6); - out.println(); + out.println("\ncalling a.g0c()..."); a.g0c(); - out.println(); + out.println("\ncalling a.g1c(byte)..."); a.g1c((byte)1); - out.println(); + out.println("\ncalling a.g2c(byte, short)..."); a.g2c((byte)1, (short)2); - out.println(); - a.g3c((byte)1, (short)2, 3); + out.println("\ncalling a.g3c(byte, short, int)..."); + a.g3c((byte)1, (short)2, (int)3); - out.println(); + out.println("\ncalling a.g0()..."); a.g0(); - out.println(); + out.println("\ncalling a.g1(byte)..."); a.g1((byte)1); - out.println(); + out.println("\ncalling a.g2(byte, short)..."); a.g2((byte)1, (short)2); - out.println(); - a.g3((byte)1, (short)2, 3); + out.println("\ncalling a.g3(byte, short, int)..."); + a.g3((byte)1, (short)2, (int)3); - out.println(); + out.println("\ncalling n = a.g0rc()..."); n = a.g0rc(); assert (n == 0); - out.println(); + out.println("\ncalling n = a.g1rc(byte)..."); n = a.g1rc((byte)1); assert (n == 1); - out.println(); + out.println("\ncalling n = a.g2rc(byte, short)..."); n = a.g2rc((byte)1, (short)2); assert (n == 3); - out.println(); - n = a.g3rc((byte)1, (short)2, 3); + out.println("\ncalling n = a.g3rc(byte, short, int)..."); + n = a.g3rc((byte)1, (short)2, (int)3); assert (n == 6); - out.println(); + out.println("\ncalling n = a.g0r()..."); n = a.g0r(); assert (n == 0); - out.println(); + out.println("\ncalling n = a.g1r(byte)..."); n = a.g1r((byte)1); assert (n == 1); - out.println(); + out.println("\ncalling n = a.g2r(byte, short)..."); n = a.g2r((byte)1, (short)2); assert (n == 3); - out.println(); - n = a.g3r((byte)1, (short)2, 3); + out.println("\ncalling n = a.g3r(byte, short, int)..."); + n = a.g3r((byte)1, (short)2, (int)3); assert (n == 6); out.println("\ncalling A.delete_p(a)..."); @@ -3857,8 +3856,6 @@ public class MyJapiTest { test12(); } else { out.println(); - test10(); - out.println(); test12(); } --===============1688012697== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/martin.zaun@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: martin.zaun@stripped # target_branch: file:///Users/mz/mysql/ndb-7.1-opt64-gcc/ # testament_sha1: a519f4b2bee2fc28f3cdab5c63d57da44037b588 # timestamp: 2010-09-28 01:19:49 -0700 # base_revision_id: martin.zaun@stripped\ # kq4slvxe45kuo39u # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWY29Qn0ADblfgEZQdnf//36X nxS////7YA+r3hfXcFw7jZ7Y97mq9Mnr3BoAZ1Nvd7NPXd2O7d2OJthQHRgSJQSbRMp+ptJPxBqT 9SaPSNNDTQaaD1ANHqDQSSA0EEGqnpP1Hqp7VGeqZGEYACYE0YTEOMmTQxGJowCMBMIAwE00aZGg GGaSCaRGkxT1GnqB6QA9QANGgNAAARKJT01PIDUmZGjKn6U/VAD2qZPKDCAADQEURCYmmhpNCaaZ oBMlHlGgDQB6TQNNKpwAR/lx+F8NyESpuTJZanrVt9KsoIaQmDd4IgJmki0fvy/c38SWp47barDJ mTMHJtP+U5/vVNEbJSFhCjCMIwjFTF0Uk0ZczVNJnyKpi0KPkhPTHBITiExCYxLjZ8VaQwcr8elA tkuFeCufxVyvy9K3QuYQ2ucAFgTbBLgMLiyN8BA3kSZys8jXQLGirBImRK1avwMarfO0OZ6ghRXv RmXuRYXNL24mtDaM1g6giHUACtgL2wEhFFkFTph3eI/U7xy5pH04lSITbBMRERNv8L0b7zE1ofah ehAJGJBWRWSQW78BXDryyfxks5jXSPhMTN2f1Z7dq37PCmJYtWgKkneF4vIwWtWI9IJ4VZ2tGaeL 72xFNkBN8mbQ1tLGiih7mxg7i5sZKNiih7FixsJwemuHC+L4FbhNLOzxq+MyGRX3m6HWsqli+qeB aNVHWc0sZttbVSxttIbmTBz/d0Jfaddo1VoKk1VKn/Xlb6jHf5iwmZO2wWVWNle+0JhYvVIXh893 va6Fe1qshSoBaZ6VC2CYwwwwwwX/MaxMYhgWUKCi2awohCE/d+E6qoavp3bbBxCxhy+vtkGAebYB 3Ibh4GhjhxpdhuvQ3dgZHk1E3A7/uizSwQxKFDDHMAyNWefoI7H70+wHly5R3U8Y8Isr40tnws/0 +IRHkYQNkoUu244zwwpuOsU3sDAcA3HYrHNRokIAxZAWScHvHsAzB6S5jBEdlx7e2E69k0v2c8PT J3kVmYzCZaeMRJIEleZp86Jq2doTCZLkvIjDe6b7l27JpLsQXkkkkkkkjYmJOLuGDY1oYMGDIYmh Ah7r0J7WlJbSowMwyRWpQKNT0NMqJoJoGg23STcTAevOkia+eMgwGCHWnmCsULh4hC7UJUP5ECbL Q+x3YIa1F3qsXErc8/LoEi9XmEYkKsrEHCMU89OZbyCsRzpwgkk4gnYJVi7bS2wqVKlTr6GVHAQP eROXlHlCRMSlJDyaNUOZ3uTXihUbzmfn0PbCnqPXCYCPRbR4xcl+y2xeaA74mSC2RZBN0W4+K/xK cPCy5RyW7jfz6NX+qNQQ+EiC5fKvAd5ISXKnk3Xqbglg4DBgYkiwydQPFK9LZUqqmjTRwRYwyIG0 zC3UVNphZKcShYXm2EGwrrxHnDmiOEzJMTMNEsC9juOejqM9zplqyJTo8kjAwA6cbpRdMCUrnO0l TDbx58VeLtrs9J1g0sSLSd2lO/QyQ22geQvCnY12BunyjNFftsGkHMQwVl+hxrTzv41KnTIW3Y42 +HhU8E3mLFddMt2n5/PmGI+gNbAk3AFjHXLBOhNTdcZ+2k34S3bTVwYwjrOA3ZSfpl6cCpr+dk48 cBSWJbgNQ3miIIcQ1VvAPEg1yEhg0zFtBjOnckfIU7tZz/DeDsgXPbzwbra3XbK7O3qpZFtLzLLu HHXHQismPPei7DhstgNhaZ1iew4mmWqU7jVjeMjX+ZI1KQ6qxpsQPTcN1Qgn15IFdEn2MZLTFZED 0eoA4KQlk5m5I5kzhiJQ6zN+hEY8A71HowML9rbBhMrzQGuG2tsG7muJia1nDCI6BqKY3l8BBio4 KMVxsMLpO2KXSbyBtDyF0nUWWAyLIMgyCSBLZSOkjiZyg1NLqRBwIMuO6mDBmwTEHSZWAUKEnF5j gbSuw612YB96bXgxjgkunql9cjEDPLmOiX33qYiAVXhW8C6TJEpRIygu0ZnIlFova4kNwXzQ4Irj SipsUVI2M1mdqVJWzAH0jutWHKQMmRgyIY2LHUZGhtc/qj9Vqv5Gqw2jb7y3jFtKY0rTpNzBgRBD IHxbeCixVU8gHJZkQMaMzJCzHe+Y4bkZWmhK7uUmOMXlW50jrSZuSLxPYoT2LGlS93xS0/85GB1a HCwU4FA2vFR8OoU0x4ZZaq78IsnOUufVoprUFZyMuL+JHzE8jWRKLE6p/GvnGwO1PVPRfaY9Mzwd SZFi5uVhBdu3Mr5+iQ5LqOdw3NScDY4pdHZS40moWhaEsMqbzWJy4des/BIq5vmNIXldVhmLQ4Kq RoSg1io7mCV5WgOkJnhG2CTTXETJqU6HKeIpGehsakDYgccQfJlsEGuRflhoxq9WBKLRKE0C5lE7 cyokMX15jomcE7yqTtXqmXqKceXLc1vuctWicI0OZtbaY1SvI5562HKEyw9yhQ6GR4V56ZncCKbW LNJ3iF50p0i5WBJt5ZdAvKMjOK5sJDl8TpEyRU4l2LD1iGpCpJiF6gtSe5LBY5GDLEb0KKE8Mj/C 3gDBArUiqqSpEUQKkCoohCqSVVVJNq6nteJOtRKDEJK/EiSemsJLosmoWxSVlgnODaOS6cU2RjEg RR9KTQRVo7Kg0lYSUEeVS7u41YaF8bjpjTpQsrba0SQkkCQ63zidQIbtW1CBEvpCPFCgVkkiyOTk hueEtUC/5sF88bp4xPQfiFhfw9aFCUpWRqwUKEUosDOHywmgmQgjxjBql4krVuJWQlq0gFjC648I eC5YdkzsPSmPHuBlBlXMWINyDDfOQg8YbgzBIbg2tHT4f0hQK+t8cAG0NTu72jEjKhQGPv+VRD2F q4v4p8/v7c6iQD4xEJvzwNXxMlJ9CUIOk5yc8h5fPRrxHQQZHMSHrr0dYhYzKZSaklO4W4AXai0N LKgFCCU0vg5A+ANMGL9wOAIYw/zX0HZESviIHQcBCjlADX7YIF6uaFszC7tSu1t6C0m6hnsKSUuJ zUM03cW0ojkAXSAIsMBfEMafAAHXfS/a6XK+U3seMgUFRUUnM+o5kKmD2CZMYckeyU6LkQbJAbuo DnsgK8jOFOCmHBhJiGzbYWmiWoqM5qp5grDZoJSrS6EWU+EiP71Ay7NIiOdlKoZuZjJhaMAEkFYB SCx1utreabU3nUbzMNsZHP25Ts2W3YkO5AprE0SHLpDQ4LZExVIKnco2pDzGSu56TMy5h1ZaX9J6 CbfIjq2qOjTBsH+KHqHxsusAbFA2neaGRFvwgocjI5MHG2CYtiDUdNCTv67DmDELPNDehbaO6Amh uQvBz0obi43npzkVxMnPkvqLsj6rq3h0YM+x2dkFxaKlAoiqBHAmkSYgxKS2lKYw7ZQQu3TIbsaF l4d1weMKSp2jUogcAORYoeJZxFO57Ou0Lj3lK+OfvKnqWFhJBTudyi7DSLGg5EsRIjlj5EhTDC8i Aj1hiQ2bMZvlgjfOg2/ZBWgziO2gCCGNthvlsFSO9KAvzBNNEfd3m+zCEOmlQTVaGMUELWQyBXvB 8oBoc8qyHbHJgAJw8+QCab+ChSbjbHaJooyF0KBjT6gy7YALYAz49Wa7zDFhGkcEhUWtKsaVKh3X vu1HkNacmIdKrZtut1DmBhinxp4QG/YguJuomjHzYIQYo+Svcr8pvUZhnNYM2ve8E4BgDr5JQO9D UIwISBe9u9uAb16IAfb8PcoyWcxsZ+ij4CBk84pApPW/Yd4kIT2wBepsqColcDs1TUTTiJgoChjc cbbY4kYqNKEkl7fq+C0ZJLCzBof8GpqQBhwLkLRAp+dIQoI0gCZ1IXAOzO2fmloO0sl1agJRdfbf QADxYsLVZBugWEICwhRliFIej3tRW08MJb0E7VA6ovEPSCUbTLD8RH4A4ZPoIelX5KNxv2B7G56g HszD1FMA4kAso6PcOuiEUsE9B2Z+PcqF8JsOmMEBT363buUcsMQ83qSWkXx9D1OB0lCraKFp8q3X XU2BbdzeX5KolANpGftImz5cVXBxSr2WWc4VULRCMVAnRLju82r8LjkWknGA1S05SFcN1RDMlDXG aG0dBgbsQaobFHWJyjybsk1CGrNSgHqJYQxABidrkDaWyO2TxQphmWBykGV17TgBICwAYDAwOhI2 UgaKPqUF6MJQ7xC1QNg5gNMir3EifEyHfdbHCQa5CMQ4/ggbdJogAHuHVzglQOBpBBbYo6AwEFIs opqlNqY70tHpsPzNPjBjCECBN31Poo+bbvDFOYlFvVjN5kzB+b4IHTsAJiIdV7aBeZcN91SX3PIU uuPtOTsoVROZyPIUyimZ9RyVDMKdP5PgA6FHanco8+nkIFWgv7pNSp0muAPtaKFHa1KJ/4u5Ipwo SEbeoT6A --===============1688012697==--