From: Roy Lyseng Date: January 13 2011 8:48am Subject: bzr commit into mysql-trunk branch (roy.lyseng:3322) Bug#58561 List-Archive: http://lists.mysql.com/commits/128598 X-Bug: 58561 Message-Id: <20110113084822.BB82D1F2@tyr67.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0978841623243722045==" --===============0978841623243722045== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/rl136806/mysql/repo/mysql-review/ based on revid:olav.sandstaa@stripped 3322 Roy Lyseng 2011-01-13 Bug#58561: Server Crash with correlated subquery and MyISAM tables when semijoin=on The problem here is that the variable 'sargables' contains invalid data after call to update_ref_and_keys(), causing a segmentation fault. Further inspection showed that the number of conditions was calculated erroneously, and it was also noticed that it was because thd->lex->current_select was not equal to select_lex passed as argument. The culprit was found to be subselect_single_select_engine::exec() that did not restore the value of 'current_select' after an engine was changed. Problem is fixed by restoring current_select properly. We also clean up the code slightly by replacing thd->lex->current_select in update_ref_and_keys() with the passed select_lex argument. mysql-test/include/subquery.inc Added test case for bug#58561. mysql-test/r/subquery_all.result mysql-test/r/subquery_all_jcl6.result mysql-test/r/subquery_nomat_nosj.result mysql-test/r/subquery_nomat_nosj_jcl6.result mysql-test/r/subquery_none.result mysql-test/r/subquery_none_jcl6.result Added test results for bug#58561. sql/item_subselect.cc In subselect_single_select_engine::exec(), restored saved 'current_select' when an engine is changed. Implemented 'clean exit' policy as a code cleanup fix. sql/sql_select.cc In update_ref_and_keys(), replaced reference to thd->lex->current_select with the select_lex passed as argument. This is a code cleanup fix. modified: mysql-test/include/subquery.inc mysql-test/r/subquery_all.result mysql-test/r/subquery_all_jcl6.result mysql-test/r/subquery_nomat_nosj.result mysql-test/r/subquery_nomat_nosj_jcl6.result mysql-test/r/subquery_none.result mysql-test/r/subquery_none_jcl6.result sql/item_subselect.cc sql/sql_select.cc === modified file 'mysql-test/include/subquery.inc' --- a/mysql-test/include/subquery.inc 2010-11-23 15:18:44 +0000 +++ b/mysql-test/include/subquery.inc 2011-01-13 08:47:33 +0000 @@ -5067,6 +5067,65 @@ EXPLAIN SELECT * FROM t1 WHERE EXISTS (S --echo DROP TABLE t1; +--echo # +--echo # BUG#58561: Server Crash with correlated subquery and MyISAM tables +--echo # + +CREATE TABLE cc ( + pk INT, + col_int_key INT, + col_varchar_key VARCHAR(1), + PRIMARY KEY (pk), + KEY col_int_key (col_int_key), + KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO cc VALUES (10,7,'v'); +INSERT INTO cc VALUES (11,1,'r'); + +CREATE TABLE bb ( + pk INT, + col_date_key DATE, + PRIMARY KEY (pk), + KEY col_date_key (col_date_key) +) ENGINE=MyISAM; +INSERT INTO bb VALUES (10,'2002-02-21'); + +CREATE TABLE c ( + pk INT, + col_int_key INT, + col_varchar_key VARCHAR(1), + PRIMARY KEY (pk), + KEY col_int_key (col_int_key), + KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO c VALUES (1,NULL,'w'); +INSERT INTO c VALUES (19,NULL,'f'); + +CREATE TABLE b ( + pk INT, + col_int_key INT, + col_varchar_key VARCHAR(1), + PRIMARY KEY (pk), + KEY col_int_key (col_int_key), + KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO b VALUES (1,7,'f'); + +SELECT col_int_key +FROM b granparent1 +WHERE (col_int_key, col_int_key) IN ( + SELECT parent1.pk, parent1.pk + FROM bb parent1 JOIN cc parent2 + ON parent2.col_varchar_key = parent2.col_varchar_key + WHERE granparent1.col_varchar_key IN ( + SELECT col_varchar_key + FROM c) + AND parent1.pk = granparent1.col_int_key + ORDER BY parent1.col_date_key +); + +DROP TABLE bb, b, cc, c; + --echo End of 5.6 tests --echo # === modified file 'mysql-test/r/subquery_all.result' --- a/mysql-test/r/subquery_all.result 2010-12-16 17:38:26 +0000 +++ b/mysql-test/r/subquery_all.result 2011-01-13 08:47:33 +0000 @@ -6214,6 +6214,59 @@ id select_type table type possible_keys 2 SUBQUERY t1 ref a a 5 const 1 Using index DROP TABLE t1; +# +# BUG#58561: Server Crash with correlated subquery and MyISAM tables +# +CREATE TABLE cc ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO cc VALUES (10,7,'v'); +INSERT INTO cc VALUES (11,1,'r'); +CREATE TABLE bb ( +pk INT, +col_date_key DATE, +PRIMARY KEY (pk), +KEY col_date_key (col_date_key) +) ENGINE=MyISAM; +INSERT INTO bb VALUES (10,'2002-02-21'); +CREATE TABLE c ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO c VALUES (1,NULL,'w'); +INSERT INTO c VALUES (19,NULL,'f'); +CREATE TABLE b ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO b VALUES (1,7,'f'); +SELECT col_int_key +FROM b granparent1 +WHERE (col_int_key, col_int_key) IN ( +SELECT parent1.pk, parent1.pk +FROM bb parent1 JOIN cc parent2 +ON parent2.col_varchar_key = parent2.col_varchar_key +WHERE granparent1.col_varchar_key IN ( +SELECT col_varchar_key +FROM c) +AND parent1.pk = granparent1.col_int_key +ORDER BY parent1.col_date_key +); +col_int_key +DROP TABLE bb, b, cc, c; End of 5.6 tests # # BUG#46743 "Azalea processing correlated, aggregate SELECT === modified file 'mysql-test/r/subquery_all_jcl6.result' --- a/mysql-test/r/subquery_all_jcl6.result 2010-11-30 13:55:22 +0000 +++ b/mysql-test/r/subquery_all_jcl6.result 2011-01-13 08:47:33 +0000 @@ -6218,6 +6218,59 @@ id select_type table type possible_keys 2 SUBQUERY t1 ref a a 5 const 1 Using index DROP TABLE t1; +# +# BUG#58561: Server Crash with correlated subquery and MyISAM tables +# +CREATE TABLE cc ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO cc VALUES (10,7,'v'); +INSERT INTO cc VALUES (11,1,'r'); +CREATE TABLE bb ( +pk INT, +col_date_key DATE, +PRIMARY KEY (pk), +KEY col_date_key (col_date_key) +) ENGINE=MyISAM; +INSERT INTO bb VALUES (10,'2002-02-21'); +CREATE TABLE c ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO c VALUES (1,NULL,'w'); +INSERT INTO c VALUES (19,NULL,'f'); +CREATE TABLE b ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO b VALUES (1,7,'f'); +SELECT col_int_key +FROM b granparent1 +WHERE (col_int_key, col_int_key) IN ( +SELECT parent1.pk, parent1.pk +FROM bb parent1 JOIN cc parent2 +ON parent2.col_varchar_key = parent2.col_varchar_key +WHERE granparent1.col_varchar_key IN ( +SELECT col_varchar_key +FROM c) +AND parent1.pk = granparent1.col_int_key +ORDER BY parent1.col_date_key +); +col_int_key +DROP TABLE bb, b, cc, c; End of 5.6 tests # # BUG#46743 "Azalea processing correlated, aggregate SELECT === modified file 'mysql-test/r/subquery_nomat_nosj.result' --- a/mysql-test/r/subquery_nomat_nosj.result 2010-11-30 13:55:22 +0000 +++ b/mysql-test/r/subquery_nomat_nosj.result 2011-01-13 08:47:33 +0000 @@ -6214,6 +6214,59 @@ id select_type table type possible_keys 2 SUBQUERY t1 ref a a 5 const 1 Using index DROP TABLE t1; +# +# BUG#58561: Server Crash with correlated subquery and MyISAM tables +# +CREATE TABLE cc ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO cc VALUES (10,7,'v'); +INSERT INTO cc VALUES (11,1,'r'); +CREATE TABLE bb ( +pk INT, +col_date_key DATE, +PRIMARY KEY (pk), +KEY col_date_key (col_date_key) +) ENGINE=MyISAM; +INSERT INTO bb VALUES (10,'2002-02-21'); +CREATE TABLE c ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO c VALUES (1,NULL,'w'); +INSERT INTO c VALUES (19,NULL,'f'); +CREATE TABLE b ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO b VALUES (1,7,'f'); +SELECT col_int_key +FROM b granparent1 +WHERE (col_int_key, col_int_key) IN ( +SELECT parent1.pk, parent1.pk +FROM bb parent1 JOIN cc parent2 +ON parent2.col_varchar_key = parent2.col_varchar_key +WHERE granparent1.col_varchar_key IN ( +SELECT col_varchar_key +FROM c) +AND parent1.pk = granparent1.col_int_key +ORDER BY parent1.col_date_key +); +col_int_key +DROP TABLE bb, b, cc, c; End of 5.6 tests # # BUG#46743 "Azalea processing correlated, aggregate SELECT === modified file 'mysql-test/r/subquery_nomat_nosj_jcl6.result' --- a/mysql-test/r/subquery_nomat_nosj_jcl6.result 2010-11-30 13:55:22 +0000 +++ b/mysql-test/r/subquery_nomat_nosj_jcl6.result 2011-01-13 08:47:33 +0000 @@ -6218,6 +6218,59 @@ id select_type table type possible_keys 2 SUBQUERY t1 ref a a 5 const 1 Using index DROP TABLE t1; +# +# BUG#58561: Server Crash with correlated subquery and MyISAM tables +# +CREATE TABLE cc ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO cc VALUES (10,7,'v'); +INSERT INTO cc VALUES (11,1,'r'); +CREATE TABLE bb ( +pk INT, +col_date_key DATE, +PRIMARY KEY (pk), +KEY col_date_key (col_date_key) +) ENGINE=MyISAM; +INSERT INTO bb VALUES (10,'2002-02-21'); +CREATE TABLE c ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO c VALUES (1,NULL,'w'); +INSERT INTO c VALUES (19,NULL,'f'); +CREATE TABLE b ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO b VALUES (1,7,'f'); +SELECT col_int_key +FROM b granparent1 +WHERE (col_int_key, col_int_key) IN ( +SELECT parent1.pk, parent1.pk +FROM bb parent1 JOIN cc parent2 +ON parent2.col_varchar_key = parent2.col_varchar_key +WHERE granparent1.col_varchar_key IN ( +SELECT col_varchar_key +FROM c) +AND parent1.pk = granparent1.col_int_key +ORDER BY parent1.col_date_key +); +col_int_key +DROP TABLE bb, b, cc, c; End of 5.6 tests # # BUG#46743 "Azalea processing correlated, aggregate SELECT === modified file 'mysql-test/r/subquery_none.result' --- a/mysql-test/r/subquery_none.result 2010-11-29 13:30:18 +0000 +++ b/mysql-test/r/subquery_none.result 2011-01-13 08:47:33 +0000 @@ -6213,6 +6213,59 @@ id select_type table type possible_keys 2 SUBQUERY t1 ref a a 5 const 1 Using index DROP TABLE t1; +# +# BUG#58561: Server Crash with correlated subquery and MyISAM tables +# +CREATE TABLE cc ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO cc VALUES (10,7,'v'); +INSERT INTO cc VALUES (11,1,'r'); +CREATE TABLE bb ( +pk INT, +col_date_key DATE, +PRIMARY KEY (pk), +KEY col_date_key (col_date_key) +) ENGINE=MyISAM; +INSERT INTO bb VALUES (10,'2002-02-21'); +CREATE TABLE c ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO c VALUES (1,NULL,'w'); +INSERT INTO c VALUES (19,NULL,'f'); +CREATE TABLE b ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO b VALUES (1,7,'f'); +SELECT col_int_key +FROM b granparent1 +WHERE (col_int_key, col_int_key) IN ( +SELECT parent1.pk, parent1.pk +FROM bb parent1 JOIN cc parent2 +ON parent2.col_varchar_key = parent2.col_varchar_key +WHERE granparent1.col_varchar_key IN ( +SELECT col_varchar_key +FROM c) +AND parent1.pk = granparent1.col_int_key +ORDER BY parent1.col_date_key +); +col_int_key +DROP TABLE bb, b, cc, c; End of 5.6 tests # # BUG#46743 "Azalea processing correlated, aggregate SELECT === modified file 'mysql-test/r/subquery_none_jcl6.result' --- a/mysql-test/r/subquery_none_jcl6.result 2010-11-29 13:04:34 +0000 +++ b/mysql-test/r/subquery_none_jcl6.result 2011-01-13 08:47:33 +0000 @@ -6217,6 +6217,59 @@ id select_type table type possible_keys 2 SUBQUERY t1 ref a a 5 const 1 Using index DROP TABLE t1; +# +# BUG#58561: Server Crash with correlated subquery and MyISAM tables +# +CREATE TABLE cc ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO cc VALUES (10,7,'v'); +INSERT INTO cc VALUES (11,1,'r'); +CREATE TABLE bb ( +pk INT, +col_date_key DATE, +PRIMARY KEY (pk), +KEY col_date_key (col_date_key) +) ENGINE=MyISAM; +INSERT INTO bb VALUES (10,'2002-02-21'); +CREATE TABLE c ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO c VALUES (1,NULL,'w'); +INSERT INTO c VALUES (19,NULL,'f'); +CREATE TABLE b ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO b VALUES (1,7,'f'); +SELECT col_int_key +FROM b granparent1 +WHERE (col_int_key, col_int_key) IN ( +SELECT parent1.pk, parent1.pk +FROM bb parent1 JOIN cc parent2 +ON parent2.col_varchar_key = parent2.col_varchar_key +WHERE granparent1.col_varchar_key IN ( +SELECT col_varchar_key +FROM c) +AND parent1.pk = granparent1.col_int_key +ORDER BY parent1.col_date_key +); +col_int_key +DROP TABLE bb, b, cc, c; End of 5.6 tests # # BUG#46743 "Azalea processing correlated, aggregate SELECT === modified file 'sql/item_subselect.cc' --- a/sql/item_subselect.cc 2010-12-29 00:38:59 +0000 +++ b/sql/item_subselect.cc 2011-01-13 08:47:33 +0000 @@ -2303,6 +2303,7 @@ int join_read_next_same_or_null(READ_REC int subselect_single_select_engine::exec() { DBUG_ENTER("subselect_single_select_engine::exec"); + int rc= 0; char const *save_where= thd->where; SELECT_LEX *save_select= thd->lex->current_select; thd->lex->current_select= select_lex; @@ -2313,16 +2314,19 @@ int subselect_single_select_engine::exec unit->set_limit(unit->global_parameters); if (join->optimize()) { - thd->where= save_where; - executed= 1; - thd->lex->current_select= save_select; - DBUG_RETURN(join->error ? join->error : 1); + executed= true; + rc= join->error ? join->error : 1; + goto exit; } if (save_join_if_explain()) - DBUG_RETURN(1); /* purecov: inspected */ + { + rc= 1; + goto exit; + } if (item->engine_changed) { - DBUG_RETURN(1); + rc= 1; + goto exit; } } if (select_lex->uncacheable && @@ -2331,9 +2335,8 @@ int subselect_single_select_engine::exec { if (join->reinit()) { - thd->where= save_where; - thd->lex->current_select= save_select; - DBUG_RETURN(1); + rc= 1; + goto exit; } item->reset(); item->assigned((executed= 0)); @@ -2389,14 +2392,15 @@ int subselect_single_select_engine::exec tab->read_first_record= tab->save_read_first_record; tab->read_record.read_record= tab->save_read_record; } - executed= 1; - thd->where= save_where; - thd->lex->current_select= save_select; - DBUG_RETURN(join->error||thd->is_fatal_error); + executed= true; + + rc= join->error || thd->is_fatal_error; } + +exit: thd->where= save_where; thd->lex->current_select= save_select; - DBUG_RETURN(0); + DBUG_RETURN(rc); } int subselect_union_engine::exec() === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2010-12-29 00:38:59 +0000 +++ b/sql/sql_select.cc 2011-01-13 08:47:33 +0000 @@ -6165,9 +6165,9 @@ update_ref_and_keys(THD *thd, DYNAMIC_AR can be not more than select_lex->max_equal_elems such substitutions. */ - sz= max(sizeof(KEY_FIELD),sizeof(SARGABLE_PARAM))* - (((thd->lex->current_select->cond_count+1)*2 + - thd->lex->current_select->between_count)*m+1); + sz= max(sizeof(KEY_FIELD), sizeof(SARGABLE_PARAM)) * + (((select_lex->cond_count + 1) * 2 + + select_lex->between_count) * m + 1); if (!(key_fields=(KEY_FIELD*) thd->alloc(sz))) return TRUE; /* purecov: inspected */ and_level= 0; --===============0978841623243722045== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/roy.lyseng@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: roy.lyseng@stripped # target_branch: file:///home/rl136806/mysql/repo/mysql-review/ # testament_sha1: d6eae69f363ea714664b93b901d29d32990b60a7 # timestamp: 2011-01-13 09:48:22 +0100 # base_revision_id: olav.sandstaa@stripped\ # mvpa9nlv4eu063m6 # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWcX29iEADMD/gFSwQABY//// ///foL////5gEie+jfMOrrBsdDoAAAA1ugMXTnDo6AC2NKA1Qa5223bDohIogk9NNJhMo/STbVNp PUaZA9R6jTJk0NNNqaAyGQ5hNGRoaGQwjQyGmjQAYjJkAwgGA5hNGRoaGQwjQyGmjQAYjJkAwgGA SJNU9U8mqP1NTDKaMT00TGk9T1AAGgAAAAEUSGk0mTJMNDVPKfqmmnpN6amiaYj0mnqbUNG0IaDa QRSCAJkBGmjRMIEnqm9CnpPUDTQbUaMQ0D1J0kTVbQW3ferJWMW2Eh2td90NKQ6dkfL+IrUSWZrl 0KPr/e89zHPNZZLELZ2Qta37l6Ojqwa8TOkQaUbQU4GPKPIOYFkDnpUyRxbsM1Hn0WxJETTDTvDE DEDGAxxR5jA7qiJuETYNBkA2FB3A3UyrcNPZYq1GowCEg2b87hmx5nOTsI1Vy0rfdsvt7lmIuuIn DB4U3AHChve72k8IDpHgWJQG5BeN3fdZf1n0nKSDIMg+sRMYL6FhEV9IJXVXh/WhBQgrQMGwG222 MbYw0d76i2rK8zrG5lpO8zK8Gm5XBOavU1pJmCjo7GQ4mlVDJIgTmKJKaE0LSsYHJLm405s6XPSp unIn2LQCxbOJFlYG4JYAYEOwRLHdXSCytndAkN8DkF7FgWmpeRYWESqJzGf7u9TPquA5/jaU2zIv tX2rVaLRaLK664F99q1Fqt61r3qXLcL4FotxhkPGRvru6FlEltWazRJv6N//AFvHdrxIjMIqh/I0 lHfylzX5Lvrs2trRuXmO6LrvViNceFC+7PeYzIu+uhfWvCvKu0veuaHiY7w6S3muXKcpSuEp4RZu 7i6dAInh4gSFoQM2O2XZp2iiDn6zAUlTlJi2y9rAQ7u9u+WEN7T5p5+N0vmnhiMB9YCPX6/1odcO GevbL7ce0QvgUOn4DEAxrexc/HBs396VkZHtXtWwe8uDCJECwIn5dObGx5kS0RKkIia7td2sFgdF h5tvPugtV5/IEtrIDIhIhV6PraxjtkUKDlHGvkh8SwIkjAhIiYalxLZK0XaWj3V+HTAwORYWVkWi 6llaomR1r9HLyfLLBwjJdMYxkRn+OQ8R4xAeQSKUmaC8ZUaFvh2H+jU+29xt2Ynsczm5L9/tjU16 WFwzWw4jYffBZlib5zcJ9pZsqJaLtFhduZAbSBHBBlnVEzSyMYtgiJzvKHQZHmhFYG/CxC0KywnE NsY8NxaCMbL2ChoVBkpLXAhyShbJVS80oJcQhQ7yGSDAAbWAKkplV7FganGpaXmNSsErDiFt41yJ xFaDRmTE/NoKd/2lCx2H3GBMqmDniKZkEi4zAiG12xUjawRedxgZ1wNC23hvTEe1YCFkliz+KJHh XBaC5XMXiJd57RYyg1YGBSH05gN0mFoQ9p3FOB2H4ZLaiNbORqd5XkOZI0nBp3Hxrzsy6ZT3XV22 1Ohk3QKaSxbD+IFILlKEpGkgrBZ+O7Z0LxwzJmpDI7tSRIsIEy5yz50PayYUt8sMiOa9SZoZAcbi MA4oSOwkYGkzdI4IdhltLzpUCR5GT1iBullDD3ReLDUWA+i7xB3ExqMxTmQtBxgoV36RENAqOPMZ BlNtnJJRBdIkV8JhyIfEwOA5Fxx3E9g1P1bOwrcTNCNdx0lqUN50kjmUMzGRoeY5FhBQwLd7uHdK ypriA5BbDK4lRnIUsPEzSvCHcUlbAb5XYikUcCKGZKMfvlutaGwt76AXTN5Mm7zOpdntZFsEFN5c GLmQaGp4FtIsLTDA3GRmbzbu2vEnYOWuM9vEldMIiyQakGpG9HQhs+ZLb1MphF1pifGm44ltTkYD IkWCnOlTA5TLC2O/vt8yOHCXISLi4uuqcKkakyDcSH4Oh7iB/M61aG000tnGmVI55HcbC6wkWTGl SpwN26bwN5sYLhwtt6mGppqY38XTsEoORgXFsz4ilp+wSdLiwgmdx8x3mBkEzj8pD69x6kir7ip2 9B7siW+WW2TPlyEr2kyCdxxbBLZgWlBDgUOBY5YVGmVw+MamwwcBS+GC8sLjPYpsG0goWHTpQ2Gh 5nEU0N59lSCLTM0OZYHmWHQKmuB9gvEJF5jvaA38b5n9RM4ik6HIZc7ShiTvCD3F1lCZXUttLrDQ w3KeZ+ip4GhcbTQ3Fx4nzOXq3+J5m83CmQptPxMz2OeTHK3KL68O3gSPPZMpBrPuIdha352k1TES woX5soZSKa2868jU2GF5B8jc4zKYbNkjGU60wmVmtoUKlupidpdYTq7zA3+ljiYy9DYTxKHrPQ5H 0yLC2zaXnCpU47SLjYbi4wLS90Nht2yKGZwgsfl387QK7cwLzlObFc8im2yhKyw7JiXwLUokOcUV EVBWWPY7CK3rRQkV83BEiDuIRCwsKH2ibbQhYPOS9S+4C8YhjkhQWWIiIggj7QWmj3IfOnghcJOb S1h2KmU8qgcPYIRzAcTBL3YhdaEc0yES1glhBLjSvm+OKIAhIPgCFFshbfqyIlwLREsA6l6pAtW1 YXOC2KBKytoLILhYif7kRLwXGuYWgidoiX9oqF/XkX3wP8wtVrlBZ/5E+QvbaC7YvvXjBcQiUUU9 AIQqEjDAhEDEDED++2LwehQIRIyC8QiVwRJRDgBaAewFlEsXJatAW8FhEA6xeMRPktyJ8dsZXgkc F0ZhNBxXJRKrIXkC2U9wLryRPBbREqC+MhE3AhyyXpA6QPQRNQNoiaok0BmoGKgSETCwp2iJ2gVF 5UVW1cIWoLgCwgNVjrPfOnSPpejwdQL9hH7Uog4kDkSEoGN3REU7o0JiYmKRKEIkFlYWUSESFlYQ GUSrQGiYgCBZb+ig3hYSCeIKKKT3H7/KXE1U6yEHERIkCk4tJyHvOlRF8SoXBaKic1SgcN8oxJJX T4YK9eBE2LO5aBU875d/mvR0CoJLEE8S4UQQTLVSPUqiWH7T3HhVRTJRTkIDdizj/OCE0xAsfO4I Q8O2FXuQnup4jeVHPvLYMT4V8NIGEYWFhZflJZr7HoepVjiHoUKH7fHcYHqEjoXnobSpQxMiZsBa FPeUORcexbS0jPPUrx/l7WYvgNAzVOge8qAFbzPQRccZQg47CGxMWdKyWQsLCzg8R2/AqvlVTZyL O04HQs5bDtvNx3GB3GhougwyiDkSBYIWA8Li036HLn2bipLAyUUybOZFeoklX+Fr63gMnVYA6D+p aSNFkYAZEOpElbAWyVgYRIFhoITRJqB18aifoPg4fYepuBffbdEGhQobvYm7QIZxKUlZeuIeKFCZ 1JnecPatLCwg2lD2CCXfEZczEzUsMlOpPAtUJBeZG/kC/J5NTyNS0/A4ini+47OFD1wI0p6FTXQS top9D2Hibr/fxuHXvl4f35G4mhWvwpwhs8KdaE5lLlW0IQl1KndPsn2dDfWZShaPENNhwLjhjx8f 4S3xONmpeaj8XvPke42WHDgcjtNyHzQ0G+D6QS5oWhQF0BhmYG+0mHU1K/uSij5VPredCfQ6zoBx KfXQ2HMsOp7fDu8IvOH7zQOBma9nXnjG/5yLwLVHtO43hKczKyygD8D5E/B1JAqSOjJSZ1NvoULr ANhn47S+lO/yHTMn5dOLun+QFwAckPlxzEI7gJn5niKI3VQ2Hn7NGeA2lDQcxvIosEO3oNIkzpgc RmOEzKhBJBoKZlwmM0QcBq6C5ZMuzkd5efM+BMwevqJ9hvM+3yE9T/5DxQ1ByHlBsmG+Np8DeU62 B7NY7SaphQg1D5s76DANT5m2QeTBdyPD1DaiamLtPUTYBz8dhwJlASEVLQu3JDTHTBEOGPmNhZlu wcdpzDnNnMfMKYBy7TtNTaVlPU6b/VQizZQSvQqe6p3qPUuOw2Bn9xn+/vB4hw587oPLEvFF/nl6 db9C4GKv1j604A0Nrxjn82g1CaeLhMDeOJyKaag8ZQJQ4dQHj3j2LAkdBODdcYcW6/5CJshQI9+4 6GJ6GYAr87iQPxHsNzmbT3beAMEHvCxTaJFLBoHIFtgUWgWhJRTI52ATG0t2HDJDJVgQ5EguUaGE Iap1b7jGWkXw+UBsJikiSBousqFPe9B5dMJeB7Kn6TrxO7aIHViY3EgIrp3miEnnb4cjbPrIxyL7 RP2ZnYWO3c2dq/mTWuzZizlGM6ShnqZS2inEm3UQsJS3oTJ33eAokogpAKtAbFBAMYt4gqxpIkYQ dTPxe08QHJ4Xon1O4920y0wJaxGgKkhRYFLRDQrsJrEhumcW3ZyZeNOxg2TOU1QyGZRsNDtqcPj+ kPMvRRfMeslA4ARQ2fu5C0KgU0pT6GZRORB6KvFWbstAz4lXISUbQ5XWm/h2YH69iph0eeKBceb3 c7VkLAsKDJSG1tEt1OZ5C2B7AP8wLNdTMv9hS3bsM6nyqaUHbYfHgcXy8zQe05IPmUMTU/pPU4eQ AdOhNCCG+aeVcZwnfGvQMPfvxKKQomGpE9QGo8vD7w/ovUUxw2EbG3qBWxUSQwpNLACNnLmiIxlk 98oFBeBwpw1V76lCK1h5F6ybnzlOGmUgGQ9QhoMOnPcA2xa6G4K2QA3BgRGNiS2NLEzBGvSHE5Fk wmcSK2b+4Lg29kV2K+2xVxi5rbYGCT+fnQnqA8fiY7jZmBVD3RkhfbI2A/jJC5LiA9u6YhGZy0cB WVm9lQZW223JfMYjOSyyEpWm3jTEF4njBNXgW2ttttttttttxHAMAoVQPtLfQxK6jpn1jl0lFJ0o dzUsGJRZaWBLENAaLKKHQWpdaWIWwKLKUAoKgtKCRoJkVoGClImgAQwMJqBvm1YehuXNZiEWCdsw ghfb7jHaT3k9t2p8j0wLwg3q72cTNmU1L+yZIk8CR9CR6Ms8RE8MG8+o2AB7z9ff9pocO+MgDlFK sizg0OAUsHAuH8p2xHI9Sp2GRIxO48T7F7jEeTxt2+aikVm9gHQ0iusYKBKYlsFhUljLasZjo249 uEgBM7pUTrZCcDgPE0HebD4HuLqkBdA/j1kiYQKAXQiZgd1JcigCzgFnKCqpHE7tD+IIUFNp4Fxe n5SVOiBU9iwoexl3ln0kbTXjxBg7ys9N7IKwxGnqyw/4u5IpwoSGL7exCA== --===============0978841623243722045==--