From 702ece51bdce41c356dc795ef5a30da36c7071bb Mon Sep 17 00:00:00 2001 From: John Sirois Date: Fri, 19 Apr 2024 09:37:56 -0700 Subject: [PATCH 1/9] gh-118107: Fix zipimporter ZIP64 handling. The code that handles too large files and offsets was missing an import. --- Lib/zipimport.py | 1 + .../next/Library/2024-04-19-09-28-43.gh-issue-118107.Mdsr1J.rst | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2024-04-19-09-28-43.gh-issue-118107.Mdsr1J.rst diff --git a/Lib/zipimport.py b/Lib/zipimport.py index 21d2dca46f569b..b1f8b048a96b93 100644 --- a/Lib/zipimport.py +++ b/Lib/zipimport.py @@ -517,6 +517,7 @@ def _read_directory(archive): num_extra_values = (len(extra_data) - 4) // 8 if num_extra_values > 3: raise ZipImportError(f"can't read header extra: {archive!r}", path=archive) + import struct values = struct.unpack_from(f"<{min(num_extra_values, 3)}Q", extra_data, offset=4) diff --git a/Misc/NEWS.d/next/Library/2024-04-19-09-28-43.gh-issue-118107.Mdsr1J.rst b/Misc/NEWS.d/next/Library/2024-04-19-09-28-43.gh-issue-118107.Mdsr1J.rst new file mode 100644 index 00000000000000..cb0ab598a8f8cc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-04-19-09-28-43.gh-issue-118107.Mdsr1J.rst @@ -0,0 +1,2 @@ +Fix zipimport reading of ZIP64 files with file entries that are too big or +offset too far. From 923cdceda478e834c644e69c3a5fdf5630ec4a07 Mon Sep 17 00:00:00 2001 From: John Sirois Date: Fri, 19 Apr 2024 09:57:36 -0700 Subject: [PATCH 2/9] Move the struct import to the top level. --- Lib/zipimport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/zipimport.py b/Lib/zipimport.py index b1f8b048a96b93..e0ddf12dc66520 100644 --- a/Lib/zipimport.py +++ b/Lib/zipimport.py @@ -20,6 +20,7 @@ import _imp # for check_hash_based_pycs import _io # for open import marshal # for loads +import struct # for ZIP64 handling import sys # for modules import time # for mktime import _warnings # For warn() @@ -517,7 +518,6 @@ def _read_directory(archive): num_extra_values = (len(extra_data) - 4) // 8 if num_extra_values > 3: raise ZipImportError(f"can't read header extra: {archive!r}", path=archive) - import struct values = struct.unpack_from(f"<{min(num_extra_values, 3)}Q", extra_data, offset=4) From 6fb7668c4f4efee9f57995eec6224a133a70dff6 Mon Sep 17 00:00:00 2001 From: John Sirois Date: Fri, 19 Apr 2024 09:59:00 -0700 Subject: [PATCH 3/9] Fix whitespace to match local convention for import comments. --- Lib/zipimport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/zipimport.py b/Lib/zipimport.py index e0ddf12dc66520..8434fd0a6596db 100644 --- a/Lib/zipimport.py +++ b/Lib/zipimport.py @@ -20,7 +20,7 @@ import _imp # for check_hash_based_pycs import _io # for open import marshal # for loads -import struct # for ZIP64 handling +import struct # for ZIP64 handling import sys # for modules import time # for mktime import _warnings # For warn() From 8d55e2f2267929d73072194aa9fd24913f9cf55b Mon Sep 17 00:00:00 2001 From: John Sirois Date: Fri, 19 Apr 2024 20:11:52 -0700 Subject: [PATCH 4/9] Add a test for large files and fix fallout in zipimporter. --- Lib/test/test_zipimport.py | 23 +++++++++++++++++++++++ Lib/zipimport.py | 6 +++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index ae49700294330c..c5f72d091f2356 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -134,7 +134,9 @@ def getZip64Files(self): def doTest(self, expected_ext, files, *modules, **kw): self.makeZip(files, **kw) + self.doTestWithPreBuiltZip(expected_ext, *modules, **kw) + def doTestWithPreBuiltZip(self, expected_ext, *modules, **kw): sys.path.insert(0, TEMP_ZIP) mod = importlib.import_module(".".join(modules)) @@ -810,6 +812,27 @@ def testZip64CruftAndComment(self): files = self.getZip64Files() self.doTest(".py", files, "f65536", comment=b"c" * ((1 << 16) - 1)) + def testZip64LargeFile(self): + support.requires( + "largefile", + f"test generates files >{0xFFFFFFFF} bytes and takes a long time " + "to run" + ) + self.addCleanup(os_helper.unlink, os_helper.TESTFN) + with open(os_helper.TESTFN, "wb") as f: + f.write(b"data") + f.write(os.linesep.encode()) + f.seek(0xFFFFFFFF, os.SEEK_CUR) + f.write(os.linesep.encode()) + + self.addCleanup(os_helper.unlink, TEMP_ZIP) + with ZipFile(TEMP_ZIP, "w", compression=self.compression) as z: + z.write(os_helper.TESTFN, "data1") + z.writestr("module.py", test_src) + z.write(os_helper.TESTFN, "data2") + + self.doTestWithPreBuiltZip(".py", "module") + @support.requires_zlib() class CompressedZipImportTestCase(UncompressedZipImportTestCase): diff --git a/Lib/zipimport.py b/Lib/zipimport.py index 8434fd0a6596db..4e41d109865e85 100644 --- a/Lib/zipimport.py +++ b/Lib/zipimport.py @@ -20,7 +20,6 @@ import _imp # for check_hash_based_pycs import _io # for open import marshal # for loads -import struct # for ZIP64 handling import sys # for modules import time # for mktime import _warnings # For warn() @@ -518,8 +517,9 @@ def _read_directory(archive): num_extra_values = (len(extra_data) - 4) // 8 if num_extra_values > 3: raise ZipImportError(f"can't read header extra: {archive!r}", path=archive) - values = struct.unpack_from(f"<{min(num_extra_values, 3)}Q", - extra_data, offset=4) + import struct + values = list(struct.unpack_from(f"<{min(num_extra_values, 3)}Q", + extra_data, offset=4)) # N.b. Here be dragons: the ordering of these is different than # the header fields, and it's really easy to get it wrong since From 13edef22777218b8310960654e95cc89c5068e4b Mon Sep 17 00:00:00 2001 From: John Sirois Date: Sun, 21 Apr 2024 12:28:08 -0700 Subject: [PATCH 5/9] Update Misc/NEWS.d/next/Library/2024-04-19-09-28-43.gh-issue-118107.Mdsr1J.rst Co-authored-by: Kirill Podoprigora --- .../next/Library/2024-04-19-09-28-43.gh-issue-118107.Mdsr1J.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2024-04-19-09-28-43.gh-issue-118107.Mdsr1J.rst b/Misc/NEWS.d/next/Library/2024-04-19-09-28-43.gh-issue-118107.Mdsr1J.rst index cb0ab598a8f8cc..0e358d6605e66e 100644 --- a/Misc/NEWS.d/next/Library/2024-04-19-09-28-43.gh-issue-118107.Mdsr1J.rst +++ b/Misc/NEWS.d/next/Library/2024-04-19-09-28-43.gh-issue-118107.Mdsr1J.rst @@ -1,2 +1,2 @@ -Fix zipimport reading of ZIP64 files with file entries that are too big or +Fix :mod:`zipimport` reading of ZIP64 files with file entries that are too big or offset too far. From debba75f42a9ef88c9cc544ed29e55e095296b41 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith [Google LLC]" Date: Sat, 4 May 2024 07:33:56 +0000 Subject: [PATCH 6/9] Speed testZip64LargeFile up by checking in test data. The code to generate the test data is included in the test itself and will run when testdata is not found. --- Lib/test/test_zipimport.py | 87 ++++++++++++++++-- .../sparse-zip64-c0-0x000000000.part | Bin 0 -> 4096 bytes .../sparse-zip64-c0-0x100000000.part | Bin 0 -> 4096 bytes .../sparse-zip64-c0-0x200000000.part | Bin 0 -> 546 bytes .../sparse-zip64-c8-0x000000000.part | Bin 0 -> 8349445 bytes 5 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 Lib/test/zipimport_data/sparse-zip64-c0-0x000000000.part create mode 100644 Lib/test/zipimport_data/sparse-zip64-c0-0x100000000.part create mode 100644 Lib/test/zipimport_data/sparse-zip64-c0-0x200000000.part create mode 100644 Lib/test/zipimport_data/sparse-zip64-c8-0x000000000.part diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index c5f72d091f2356..4f3531ee2cd28a 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -1,8 +1,10 @@ import sys import os import marshal +import glob import importlib import importlib.util +import re import struct import time import unittest @@ -54,6 +56,7 @@ def module_path_to_dotted_name(path): TESTPACK2 = "ziptestpackage2" TEMP_DIR = os.path.abspath("junk95142") TEMP_ZIP = os.path.abspath("junk95142.zip") +TEST_DATA_DIR = os.path.join(os.path.dirname(__file__), "zipimport_data") pyc_file = importlib.util.cache_from_source(TESTMOD + '.py') pyc_ext = '.pyc' @@ -818,18 +821,82 @@ def testZip64LargeFile(self): f"test generates files >{0xFFFFFFFF} bytes and takes a long time " "to run" ) - self.addCleanup(os_helper.unlink, os_helper.TESTFN) - with open(os_helper.TESTFN, "wb") as f: - f.write(b"data") - f.write(os.linesep.encode()) - f.seek(0xFFFFFFFF, os.SEEK_CUR) - f.write(os.linesep.encode()) + + parts_glob = f"sparse-zip64-c{int(self.compression)}-0x*.part" + full_parts_glob = os.path.join(TEST_DATA_DIR, parts_glob) + pre_built_zip_parts = glob.glob(full_parts_glob) self.addCleanup(os_helper.unlink, TEMP_ZIP) - with ZipFile(TEMP_ZIP, "w", compression=self.compression) as z: - z.write(os_helper.TESTFN, "data1") - z.writestr("module.py", test_src) - z.write(os_helper.TESTFN, "data2") + if not pre_built_zip_parts: + if self.compression != ZIP_STORED: + support.requires( + "cpu", + "test requires a lot of CPU for compression." + ) + self.addCleanup(os_helper.unlink, os_helper.TESTFN) + with open(os_helper.TESTFN, "wb") as f: + f.write(b"data") + f.write(os.linesep.encode()) + f.seek(0xFFFFFFFF, os.SEEK_CUR) + f.write(os.linesep.encode()) + with ZipFile(TEMP_ZIP, "w", compression=self.compression) as z: + z.write(os_helper.TESTFN, "data1") + z.writestr("module.py", test_src) + z.write(os_helper.TESTFN, "data2") + + # This "works" but relies on the zip format having a non-empty + # final page due to the trailing central directory to wind up with + # the correct length file. + def make_sparse_zip_parts(name): + empty_page = b"\0" * 4096 + with open(name, "rb") as f: + part = None + try: + while True: + offset = f.tell() + data = f.read(len(empty_page)) + if not data: + break + if data != empty_page: + if not part: + part_fullname = os.path.join( + TEST_DATA_DIR, + "sparse-zip64-c%d-0x%09x.part" % (self.compression, offset) + ) + part = open(part_fullname, "wb") + print("Created", part_fullname) + part.write(data) + else: + if part: + part.close() + part = None + finally: + if part: + part.close() + + if self.compression == ZIP_STORED: + print(f"Creating sparse parts to check in into {TEST_DATA_DIR}:") + make_sparse_zip_parts(TEMP_ZIP) + + else: + def extract_offset(name): + if m := re.search(r"-(0x[0-9a-f]{9})\.part$", name): + return int(m.group(1), base=16) + raise ValueError(f"{name=} does not fit expected pattern.") + offset_parts = [(extract_offset(n), n) for n in pre_built_zip_parts] + with open(TEMP_ZIP, "wb") as f: + for offset, part_fn in sorted(offset_parts): + with open(part_fn, "rb") as part: + f.seek(offset, os.SEEK_SET) + f.write(part.read()) + # Confirm that the reconstructed zip file works and looks right. + with ZipFile(TEMP_ZIP, "r") as z: + self.assertEqual( + z.read("module.py"), test_src.encode(), + msg=f"Recreate {full_parts_glob}, unexpected contents." + ) + self.assertGreater(z.getinfo("data1").file_size, 0xffff_ffff) + self.assertGreater(z.getinfo("data2").file_size, 0xffff_ffff) self.doTestWithPreBuiltZip(".py", "module") diff --git a/Lib/test/zipimport_data/sparse-zip64-c0-0x000000000.part b/Lib/test/zipimport_data/sparse-zip64-c0-0x000000000.part new file mode 100644 index 0000000000000000000000000000000000000000..0bd6df5fc70e151c39876a68605a5acee8bad474 GIT binary patch literal 4096 zcmWIWW@gc40D*5-OCq9F+YSFi0V{(DLrP*vq9G%L00S#f0V5E@XpjUKNY^MB4S~@R m7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVE?ApiiHOApWh literal 0 HcmV?d00001 diff --git a/Lib/test/zipimport_data/sparse-zip64-c0-0x100000000.part b/Lib/test/zipimport_data/sparse-zip64-c0-0x100000000.part new file mode 100644 index 0000000000000000000000000000000000000000..844a68ef5426e54f9a94f01f6971aa0dbc434e09 GIT binary patch literal 4096 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 literal 0 HcmV?d00001 From 83bfe203ee6e80408ab75c5fe9807199ffd00fde Mon Sep 17 00:00:00 2001 From: John Sirois Date: Sat, 4 May 2024 20:34:41 -0500 Subject: [PATCH 7/9] Kill ZIP_DEFLATED sparse trick and document. --- Lib/test/test_zipimport.py | 11 +++++++++++ .../sparse-zip64-c8-0x000000000.part | Bin 8349445 -> 0 bytes 2 files changed, 11 insertions(+) delete mode 100644 Lib/test/zipimport_data/sparse-zip64-c8-0x000000000.part diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index 4f3531ee2cd28a..323818ff3d362d 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -822,6 +822,17 @@ def testZip64LargeFile(self): "to run" ) + # N.B.: We do alot of gymnastics below in the ZIP_STORED case to save + # and reconstruct a sparse zip on systems that support sparse files. + # Instead of creating a ~8GB zip file mainly consisting of null bytes + # for every run of the test, we create the zip once and save off the + # non-null portions of the resulting file as data blobs with offsets + # that allow re-creating the zip file sparsely. This drops disk space + # usage to ~9KB for the ZIP_STORED case and drops that test time by ~2 + # orders of magnitude. For the ZIP_DEFLATED case, however, we bite the + # bullet. The resulting zip file is ~8MB of non-null data; so the sparse + # trick doesn't work and would result in that full ~8MB zip data file + # being checked in to source control. parts_glob = f"sparse-zip64-c{int(self.compression)}-0x*.part" full_parts_glob = os.path.join(TEST_DATA_DIR, parts_glob) pre_built_zip_parts = glob.glob(full_parts_glob) diff --git a/Lib/test/zipimport_data/sparse-zip64-c8-0x000000000.part b/Lib/test/zipimport_data/sparse-zip64-c8-0x000000000.part deleted file mode 100644 index 01ccae32c8bc92bb8d70465a2ebebc393c2d8d07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8349445 zcmeF)yUTUyS-{~hCSii0SXhb(!6u-X#=^$*HkKkb0lT1B*jdHKDv(xeQdopE31Tm? zwXoOLGXH=e87D*L^u7DE)_M;2;R>iTd+)WL`?>D7O7Zhg|K!VG`Mr1V-hJ)efB(@x z|Jk4a?mv9M`FTMMXcVGSJCtv#LfByAf{`jN+{qEh*e)`Q{ z`{y|GR+ifB2oR{}2cP0t5&UAV7cs0RjXF5Fk)q;3pq^ z@GHOgF9W{y^B;fj2jy?;f&>T12nKv+ z;hzW)AV7cs0RjXF5FkK+KnnrEfEH_ZNdg225FkK+009C72oNCfseoX>rxgBy009C7 z2oNAZfB*pk1PHVc5DaLsW|t&DfB*pk1PBlyK!5-N0-p*927F549|#a2K!5-N0t5&U zAV7dX4*|h|9(#660t5&UAV7cs0RjXF5Fqf0fMCEU68(SZb^Uu0RjXF5FkK+009C7J`oTM_(a10B|v}x0RjXF5FkK+009C`1Ox+`EZQ{* z5FkK+009C72oNAZfWR*W1Oxmj5FkK+009C72oNAZfB=DB0)hd(_U*O=2oNAZfB*pk z1PBlyKtM3S-v9vu1PBlyK!5-N0t5&UXeJ;S&}`wZOMn0Y0t5&UAV7cs0Rrs>1OwXt z2>>8KfB*pk1PBlyK!5;&W&(l%%@*#u1PBlyK!5-N0t5&UAkbbwFrfXP000662oNAZ zfB*pk1PBo5CLkElZR74sfB*pk1PBlyK!5-N0^J1!1G@hOxIX~`1PBlyK!5-N0t5(j z6A%pOwsH3*K!5-N0t5&UAV7csf$jo=0p0%s+@Ame0t5&UAV7cs0RjZt2?z$XTe%Ap zAV7cs0RjXF5FkK+Kyv}XfaZSyu1|mf0RjXF5FkK+009E+1Ox-xt=xqP5FkK+009C7 z2oNAZpt*oxK=VHU*C#-L009C72oNAZfB=Dh0)hekcJ9Um2oNAZfB*pk1PBly&|5$- zp!fdWo&W&?1PBlyK!5-N0tEUA2nO`qxf>H8K!5-N0t5&UAV7dXZvnx8-uriZ0t5&U zAV7cs0RjXF5NIeM7|?L(u1tUc0RjXF5FkK+009E61q1_Huixbf5FkK+009C72oNAZ zprL?ZK*OcGG64bv2oNAZfB*pk1PHVi5DaL&ewQaefB*pk1PBlyK!5;&jsk)K9k=ez z1PBlyK!5-N0t5&UAkbMrFrf4H-JJjd0t5&UAV7cs0RjX%3J3;t+`2mxAV7cs0RjXF z5FkK+KxYBLfX>@@cLD?m5FkK+009C72oPu~AQ;ec?JiA#009C72oNAZfB*pkjRgb) z8ZY0~2@oJafB*pk1PBlyK%k|7U_i^YyEFj;1PBlyK!5-N0t5&&77z?*ynI(DK!5-N z0t5&UAV7csft~__0X_Hb)&vL;AV7cs0RjXF5FpT3Kro>1?%kXK0RjXF5FkK+009C7 zdI|^z^xV5!6Cgl<009C72oNAZfIwdX!GONIcXI*+2oNAZfB*pk1PBmlDj*opbn&iD zfB*pk1PBlyK!5-N0&N8Z1KO_M#R(7~K!5-N0t5&UAV8q0fM7t=#k)2E0t5&UAV7cs z0RjXFv=tBxXuEnBCqRGz0RjXF5FkK+0D-Oof&pDO@7@Fm5FkK+009C72oNC9RX{MH z>*n2?009C72oNAZfB*pk1iA_c26WxLdlMi)fB*pk1PBlyK!8A30l|Q-n|E&l1PBly zK!5-N0t5&UXe%HX(027MPJjRb0t5&UAV7cs0Rl}01Ou8b-n9u3AV7cs0RjXF5FkLH zt$<)a+ts@`0RjXF5FkK+009C72s9NC3~0J|*Cs%K009C72oNAZfB=EM0)hd3ckku| z2oNAZfB*pk1PBly&{IG#py%G*ng9U;1PBlyK!5-N0tEUB2nO`sy_*vtK!5-N0t5&U zAV7dXPXWPzo_lv|0t5&UAV7cs0RjXF5NIqQ7|?k6u1{ z009C72oNAZfB*pk4Fv=P8ZO=CM5FkK+009C72oPv5AQ;g8PXGV`0t5&UAV7cs0RjXFG!qaEXtr?IB|v}x z0RjXF5FkK+009Dm0saOE5FkK+009C72oNAZfIu$+!GK=-c3T1j2oNAZfB*pk1PBly zAQ<3pfB*pk1PBlyK!5-N0t5*35)cgNwQsj2K!5-N0t5&UAV7cs0Rle~4Dd%lfB*pk z1PBlyK!5-N0t9*q2nO`px7!jRK!5-N0t5&UAV7cs0l@%&0|W>VAV7cs0RjXF5FkLH zmw;eEuYJ2M0RjXF5FkK+009C72oMkq@Haq!009C72oNAZfB*pk1eys51~gl^>k=S9 zfB*pk1PBlyK!8Ad0l|Rwe*ypq5FkK+009C72oNAZpqYSRK(mFrE&&1r2oNAZfB*pk z1PBoL$p;_&%Da#L^R1u%_TD8FJCBtU=w0RjXF z5FkK+009DD5D*Ob0*8MgK!5-N0t5&UAV7cs0RrU(1Ov*i*aZm?AV7cs0RjXF5FkK+ zz!wDs1HS0t-v|&OK!5-N0t5&UAV7dXbpgSE>Kk@H0t5&UAV7cs0RjXF5FqeH0l|PT zdiXa21PBlyK!5-N0t5&UAW&UEFrfN|-H!kP0t5&UAV7cs0RjXFyeA+S@E(YNB|v}x z0RjXF5FkK+009EU1q1_%FWB`65FkK+009C72oNAZfWUhKf&uS=_*Vi12oNAZfB*pk z1PBlyP+UMTp!kAaj{pGz1PBlyK!5-N0t5)WFCZB3zKDM(K!5-N0t5&UAV7cs0RpuJ z1OsaC*X;-pAV7cs0RjXF5FkK+!21G%0q=|WcLD?m5FkK+009C72oNApTR4cHNBt0RjXF5FkK+009C72)q>#40vne z69NPX5FkK+009C72oNApSwJwL@^;;g009C72oNAZfB*pk1PI&^5Dd71;v)hC2oNAZ zfB*pk1PBlyP*^}Ppzv~CjQ{}x1PBlyK!5-N0t5)$5D*Nwf#M?q1PBlyK!5-N0t5&U zAW&F9Fre^qU5x+%0t5&UAV7cs0RjXF+!7EBxTWGV0t5&UAV7cs0RjXF5Fk)jKro>0 zZrzLk0RjXF5FkK+009C72;34747jD@GXew%5FkK+009C72oNApS3oeJ?rzKu-1PBlyK!5-N0t5&UAW&97Fre&eU5o$$0t5&UAV7cs0RjXF+!hcF zxb5Oo0t5&UAV7cs0RjXF5Fk)hKro={X5EVb0RjXF5FkK+009C72;3GB47ly$Qvw7C z5FkK+009C72oNApRX{MH>So=G009C72oNAZfB*pk1PI&_5Dd5j<6{B@2oNAZfB*pk z1PBlyP*gxLpy*;ei5FkK+009C72oNApQ$R4F=3d>3009C72oNAZ zfB*pk1PI&}5Dd6W;|l@=2oNAZfB*pk1PBlyP*OlJpyXOziU0uu1PBlyK!5-N0t5)$ z6%Y)#OXCXy1PBlyK!5-N0t5&UAW%|3FregGU5Wq!0t5&UAV7cs0RjXF+!qiGxNqYd z0t5&UAV7cs0RjXF5Fk)dKro=>009C72oNAZfB*pk1PDA35Da*L<0}FL2oNAZfB*pk1PBly zP*6ZHpx{zni2wlt1PBlyK!5-N0t5&=5D*M_fa5Cy1PBlyK!5-N0t5&UAW%?1FreU4 zU5Nkz0t5&UAV7cs0RjXFJQ5HLc%009C72oNAZfB*pk zl>`I>Ds9tU2oNAZfB*pk1PBlyK!Cst0)hcAAo&Ra0t5&UAV7cs0RjXF5GW)d7*J@L zu0ntS0RjXF5FkK+009C7UJwurcmc^z2oNAZfB*pk1PBlyK!89Y0l|Pm%XAe21PBly zK!5-N0t5&UAn=NSV8AO%enWr&0RjXF5FkK+009C7>Ieu1)Y+w*5FkK+009C72oNAZ zfB=D41Ox+KQSuuC1PBlyK!5-N0t5&UAW%m@FrdyZ-Gl%E0t5&UAV7cs0RjXFyd)qP z@Dh_B5gT{D=Sn z0t5&UAV7cs0RjXFlo1dND6>izAwYlt0RjXF5FkK+009E82?z$f=Hyod2oNAZfB*pk z1PBlyK%k0%U_g~kx(5LQ1PBlyK!5-N0t5&Ucuhbs;58?|B0zuu0RjXF5FkK+009D3 z1Ox-BY|=dl5FkK+009C72oNAZfWV6af&ni=`56HM1PBlyK!5-N0t5&UC?X&jP-Ky= zL4W`O0t5&UAV7cs0RjYG6c7w}5z5a95FkK+009C72oNAZfItxe!GI!*bPWOo2oNAZ zfB*pk1PBly@T!1dz^hVzM}PnU0t5&UAV7cs0RjYS2nYt$*rQtzAV7cs0RjXF5FkK+ z0D)Hp1Or}`@;d?q2oNAZfB*pk1PBlyP(wg4pvE5Ef&c*m1PBlyK!5-N0t5)WEFc*0 zGL;_^AV7cs0RjXF5FkK+0D%$$f&nGg=n@175FkK+009C72oNAZ;AH{9fS0NKkN^P! z1PBlyK!5-N0t5(@5D*L~u|}65K!5-N0t5&UAV7cs0RpcJ2nM`v<(C8q5FkK+009C7 z2oNAZpn`y4K!q*30|5dA2oNAZfB*pk1PBm#T|hA4bt}IlK!5-N0t5&UAV7cs0Rj~S z1OqB;(H#g7AV7cs0RjXF5FkK+zySflfCE^5N`L?X0t5&UAV7cs0RjXH2nYrgSfVQs zAV7cs0RjXF5FkK+0D%Jnf&mAx{FDFz0t5&UAV7cs0RjXF6c7*$D6m9VAV7cs0RjXF z5FkK+009C=1Ox+)X!$Jx0t5&UAV7cs0RjXF5Xdhe7?6L5Za{zl0RjXF5FkK+009C7 zjtB?_9MSSy0t5&UAV7cs0RjXF5Fn6WKrkTx4&8tN0RjXF5FkK+009C72pkd+3^>H) z#{>uvAV7cs0RjXF5FkJxy?|gq`W3nW0RjXF5FkK+009C72oN|VAQ*6n%Z~{VAV7cs z0RjXF5FkK+Kzaeefb=VL0RjXF5FkK+009C72oNA}Oh7Q;n3rD@AV7cs0RjXF5FkK+ z0D$0m&C=d;$ar5FkK+009C7 z2oNA}R6sD`sF>dqAV7cs0RjXF5FkK+0D;^Bf&sbrXL0RjXF5FkK+009C72oT6DAQ+H&duAs< zfB*pk1PBlyK!5-N0w)9n15TiMga82o1PBlyK!5-N0t5&o77z?bygZ{5AV7cs0RjXF z5FkK+0D%(%f&nMcJVJl~0RjXF5FkK+009C75(@|hBwn7;2@oJafB*pk1PBlyK!Cs* z0l|PXYMvoLfB*pk1PBlyK!5-N0(k`l1M=?9y<|aUZ009C7 z2oNAZfB*pkCj|rpPQrPN009C72oNAZfB*pk1PCM*5DZAVIAaqaK!5-N0t5&UAV7cs zfs+D)0Vm-+Mt}eT0t5&UAV7cs0RjY)3J3-yU7WEA5FkK+009C72oNAZfWTP+!GN=J zo+Chj009C72oNAZfB*pkIRyj*a_-I41PBlyK!5-N0t5&UAVA=(fMCE`InNOwK!5-N z0t5&UAV7csft&(@0Xg?(Y61iZ5FkK+009C72oNA}T0k)1G@S%BNHG%fB*pk1PBlyK!5;&3j%@x z7w|kvfB*pk1PBlyK!5-N0t6BY2nHlvnvn?*AV7cs0RjXF5FkK+z!d?(fGc{QB|v}x z0RjXF5FkK+009E|1Ox-}?aagk2oNAZfB*pk1PBlyK;VjiV89hU&k`U&fB*pk1PBly zK!5;&d;)?2`F3Vv0t5&UAV7cs0RjXF5Fl_#KrrAEpN9z$AV7cs0RjXF5FkK+Kso`z zfOIP}FaZJt2oNAZfB*pk1PBngBp?`YiO<6X2oNAZfB*pk1PBlyKp>rfU_iQ+8JGY8 z0t5&UAV7cs0RjXFToVusxaQ|+0t5&UAV7cs0RjXF5Fn6EKrkTN#>`8A009C72oNAZ zfB*pk1g;4P23+&=Gywtx2oNAZfB*pk1PBnwCLkD)ZDZyoK!5-N0t5&UAV7cs0Rk5V z1OqMtdYk|O0t5&UAV7cs0RjXFBohz}NVYKJ5+Fc;009C72oNAZfB=Du0)hb-0XKrmncqE`?gK!5-N z0t5&UAV7csfkXm=0g0AnR00GD5FkK+009C72oNAJLO?KJgrav4AV7cs0RjXF5FkK+ z0D(LLf&qDUWl{nJ2oNAZfB*pk1PBlyFhW2uV1%M~5FkK+009C72oNAZfB=C!0)hc~ zc4blm1PBlyK!5-N0t5&UATUHgFklFymk=O8fB*pk1PBlyK!5;&Gy;MFX;x)W0t5&U zAV7cs0RjXF5Fju_Krmnkqn8jMK!5-N0t5&UAV7csfiwbw0clocPyz%95FkK+009C7 z2oNAJMnEuNjH9;@AV7cs0RjXF5FkK+0D&w5f&p1JWljPF2oNAZfB*pk1PBlyFh)Qy zV2q=;5FkK+009C72oNAZfB=Ck0)hcqHf2r%1PBlyK!5-N0t5&UATUTkFkld**AO5; zfB*pk1PBlyK!5;&Bm#l~Nfu>H0t5&UAV7cs0RjXF5Fju}Krmnsq}LE2K!5-N0t5&U zAV7csfg}Qg0ZA5ROacT55FkK+009C72oNAJN$u^ z2oNAZfB*pk1PBlyFj_z`V6>?B5gT7ZM;qfB*pk1PBlyK!5;&&;o)1q1R(L0t5&UAV7cs0RjXF5FjvI zKrmo9sTUF;K!5-N0t5&UAV7csfzSei0ioApI06I+5FkK+009C72oNAJUO+Hlys0-5 zAV7cs0RjXF5FkK+0D;H?f&r1YV>SW=2oNAZfB*pk1PBlyFkV0~V7#d}5+Fc;009C7 z2oNAZfB=EW0)hdNw_`Q}1PBlyK!5-N0t5&UATU8dFkk|zR}vsVfB*pk1PBlyK!5;& zzyg8+ftO=60t5&UAV7cs0RjXF5Fju?Krmnes#g*qK!5-N0t5&UAV7csfxrTS0fCoe zGy((&5FkK+009C72oNAJLqITKhN^cGAV7cs0RjXF5FkK+0D-syf&p=NV=@8+2oNAZ zfB*pk1PBlyFhf8vV1}x95+Fc;009C72oNAZfB=EG0)hc?cVjXF1PBlyK!5-N0t5&U zATUKhFklL+ml7aAfB*pk1PBlyK!5;&umXYsVOL`?0t5&UAV7cs0RjXF5Fju`Krmnm ztCtcWK!5-N0t5&UAV7csfv^IC0by5TFaiV!5FkK+009C72oNAJM?f%Oj;ps4AV7cs z0RjXF5FkK+0D-6if&o!CV=e*&2oNAZfB*pk1PBlyFh@WzV2-P|5+Fc;009C72oNAZ zfB=E00)hciH)AdW1PBlyK!5-N0t5&UATUWlFklj_*AgH=fB*pk1PBlyK!5;&paOyc zK^J2z0t5&UAV7cs0RjXF5Fju~Krmnutk)7CK!5-N0t5&UAV7csfuI6{0YMjIECK`w z5FkK+009C72oNAJOF%GSmaO*@AV7cs0RjXF5FkK+0D+hSf&nr2Vk!az2oNAZfB*pk z1PBlyFiSu%V3w@+5+Fc;009C72oNAZfB=D*0)hcC_hKpn1PBlyK!5-N0t5&UATUip zFkl+37ZV^rfB*pk1PBlyK!5;&kOG1MA=hFk0t5&UAV7cs0RjXF5Fjv3Krmn$trrs@ zK!5-N0t5&UAV7csfsg`%0U_67C;|is5FkK+009C72oNAJPe3qWo~<_%AV7cs0RjXF z5FkK+0D*`Cf&me?VkQCv2oNAZfB*pk1PBlyFi$`*V4kfv6Cgl<009C72oNAZfB=Dr z0)hb%w_+v&1PBlyK!5-N0t5&UATUutFkm9CR}&yWfB*pk1PBlyK!5;&fC7R60heMV z0t5&UAV7cs0RjXF5Fjv7Krmn;u2&NvK!5-N0t5&UAV7csfq(*n0Rfj{Bmx8o5FkK+ z009C72oNAJQ$R3armlArAV7cs0RjXF5FkK+0D*V{f&uY%Vj=;Z|ZG0t5&UAV7cs0RjXF5FjvBKrmn`ua^@bK!5-N z0t5&UAV7csfp7wX0pV6+AOZvk5FkK+009C72oNAJS3odeuCKQfAV7cs0RjXF5FkK+ z0D))%f&tMsVjcnn2oNAZfB*pk1PBlyFjqh@V6LyX6Cgl<009C72oNAZfB=DL0)he2 zHewzE1PBlyK!5-N0t5&UATU`#FkmvU*ApN>fB*pk1PBlyK!5;&U;=^x!4_g10t5&U zAV7cs0RjXF5FjvFKrmo3u-6kHK!5-N0t5&UAV7csfnWlH0l^kx90CLg5FkK+009C7 z2oNAJTR<>iwy^gTAV7cs0RjXF5FkK+0D)Knf&sDiVHyGi2oNAZfB*pk1PBlyFk3({ zV79RL6Cgl<009C72oNAZfB=D50)hdt_F)=Xh72oNAZfB*pk1PBly5Jf;RAj&4p zL4W`O0t5&UAV7cs0RjZp2nYtOadrv;0t5&UAV7cs0RjXF5Qrim7!YL><{&_T009C7 z2oNAZfB*pkiv$D%7C}3P009C72oNAZfB*pk1PBBX5DW;i2xAZ+K!5-N0t5&UAV7cs zfkgs>0gIp=Lx2DQ0t5&UAV7cs0RjYq2nYrQS%fhN5FkK+009C72oNAZfWRsN!GKlL z&LKd6009C72oNAZfB*pkF$4qyV(h^b1PBlyK!5-N0t5&UAV6T1fMCEXY3C3iK!5-N z0t5&UAV7csffxdU0WtPq3IYTO5FkK+009C72oNB!Oh7PT8MT855FkK+009C72oNAZ zfItWV!GI8JFa!Yt1PBlyK!5-N0t5&USSBDCu#DP41PBlyK!5-N0t5&UAV465fM7s~ zH5h^b0RjXF5FkK+009C72&@wj3|MFFBmx8o5FkK+009C72oN9;K|nAd!WPUxfB*pk z1PBlyK!5-N0tD6x2nMXPb`k*s1PBlyK!5-N0t5&Uh#(*s5Mc{uAV7cs0RjXF5FkK+ z009CE1q1^YVmpce0RjXF5FkK+009C72m}xi3<$6UBM=}!fB*pk1PBlyK!5;&g#v;B z3$YzVfB*pk1PBlyK!5-N0t5mG2nGaLf)NN1AV7cs0RjXF5FkK+z)AtZfR)JB|PW0t5&UAV7cs0RjXFY!(m<*t`J86Cgl<009C72oNAZfB=ET0)hdH!5v3{ z009C72oNAZfB*pk1U3r@25eq{;|UNTK!5-N0t5&UAV7e?Y5~E3)#A=0K!5-N0t5&U zAV7cs0Rnpk1OxW^JDmUl0t5&UAV7cs0RjXFtQHUqSS{{60t5&UAV7cs0RjXF5FoHu zKrmphztag2AV7cs0RjXF5FkK+z;Xe>faT;4BtU=w0RjXF5FkK+009D91q1`O@;jUW z0RjXF5FkK+009C72rL&63|LO?Kmr5^5FkK+009C72oNB!RX{LcE5E}D5FkK+009C7 z2oNAZfWUeI!GQJVP9#8p009C72oNAZfB*pkI|T#-cIrEu009C72oNAZfB*pk1PH7b z5DZvv?nD9v2oNAZfB*pk1PBlyuv0)VV5h#b2@oJafB*pk1PBlyK!Cso0l|O`=#C^n zfB*pk1PBlyK!5-N0viPc12*D2ng9U;1PBlyK!5-N0t5(b5D*O5fbK{F1PBlyK!5-N z0t5&UAh1zDFkmCTqX`foK!5-N0t5&UAV7e?4gtY{9qP^`K!5-N0t5&UAV7cs0RsC3 z1OxWjJDC6h0t5&UAV7cs0RjXF><|zP*rD!B0t5&UAV7cs0RjXF5FoHmKrmpRy^{$L zAV7cs0RjXF5FkK+z!m|)fGz9}B|v}x0RjXF5FkK+009Eq1Ox-N(L0y`0RjXF5FkK+ z009C72y77$4A{c%Pyz%95FkK+009C72oNB!O+YYU8@+=G5FkK+009C72oNAZfWRIB z!GJyPP9;Eq009C72oNAZfB*pky95LScF8-J009C72oNAZfB*pk1PJUA5DeJk?o=Ff52oNAZfB*pk z1PBlyutPvFV28Rh2@oJafB*pk1PBlyK!CtT0l|Qc_>Lw(fB*pk1PBlyK!5-N0viMb z12&*Lk^lh$1PBlyK!5-N0t5(b6c7y9i0^0u1PBlyK!5-N0t5&UAh1C|Fkl0^BMA^7 zK!5-N0t5&UAV7e?P65Gyo%+ruK!5-N0t5&UAV7cs0Rrm<1OwKaJCOhZ0t5&UAV7cs z0RjXF>=Y0T*s1Sq0t5&UAV7cs0RjXF5FoH#Krmpvxf2NxAV7cs0RjXF5FkK+z*Ygl zfUW!vCqRGz0RjXF5FkK+009Ea1q1_@lRJ!GOK~PA5Qs009C72oNAZ zfB*pks|5rDR*O52009C72oNAZfB*pk1PJUE5DeJs?{oqL2oNAZfB*pk1PBlyuv$Pc zV70jO2oNAZfB*pk1PBlyK!Ctz0l|RH3vfIE0t5&UAV7cs0RjXF5LhfA7_b=JaRdku zAV7cs0RjXF5FkKcvw&d0<^?#O009C72oNAZfB*pk1PCk^5DZuh?l=Mj2oNAZfB*pk z1PBlyuv!Ko0t5&UAV7cs0RjXF5ZEms z7_fT-&L=>C009C72oNAZfB*pkYXt-Y)_OaQ009C72oNAZfB*pk1PE*w5DeJ90s{~r zK!5-N0t5&UAV7csfu#b10ZX|ZMt}eT0t5&UAV7cs0RjZJ3kU{mUx5J#5FkK+009C7 z2oNAZfWT4#!GNXQ4kJK-009C72oNAZfB*pk`vn98_V2(11PBlyK!5-N0t5&UAV6TH zfMCE%ZD$c6K!5-N0t5&UAV7csf&Bu40sD7g0s;gG5FkK+009C72oNB!Qa~_ZrM9yO z5FkK+009C72oNAZfIt8N!GHiuFaiMr1PBlyK!5-N0t5&USSTPEun^l(1PBlyK!5-N z0t5&UAV461fM7s?B^ZGK0RjXF5FkK+009C72rLv33|NTmC;|is5FkK+009C72oN9; zK|nAd!WPUxfB*pk1PBlyK!5-N0tD6x2nMXPb`k*s1PBlyK!5-N0t5&Uh#(*s5Mc{u zAV7cs0RjXF5FkK+009E)1Ox-tSv!dU0RjXF5FkK+009C72!s$23<$9XLl7W9fB*pk z1PBlyK!5;&Wdec$%cvbhfB*pk1PBlyK!5-N0t7+`2nK{$gCPhIAV7cs0RjXF5FkK+ zz%l{BfMwJUB0zuu0RjXF5FkK+009Cq1Ox+O?7KU_g*X7=r)-0t5&UAV7cs0RjXFED{h5SOo1D0t5&UAV7cs0RjXF5FijmKrkT6 zCd@&A009C72oNAZfB*pk1l9-$2CQ**3IPHH2oNAZfB*pk1PBm_A|MzLWfSHgK!5-N z0t5&UAV7cs0Rn3T1OwJMJB0uN0t5&UAV7cs0RjXFgb@%72(t=<5FkK+009C72oNAZ zfB=Cd0)hccm>oiZ009C72oNAZfB*pk1i}ai283CKK?o2aK!5-N0t5&UAV7e?5&^-0 zCCm;XK!5-N0t5&UAV7cs0RnLZ1Owvi!XyL;5FkK+009C72oNAZV10l|Rj#10@p zfB*pk1PBlyK!5-N0&wK!5-N0t5&U zAV7cs0RpiE1OsC2!!!g45FkK+009C72oNAZV77o@z-(dfCqRGz0RjXF5FkK+009EQ z1Ox+uEyOqk2oNAZfB*pk1PBlyKwz?fV8CQxuO~o&009C72oNAZfB*pk!2|>Yf-S^2 z1PBlyK!5-N0t5&UAV6TUfMCF6V6P`YfB*pk1PBlyK!5-N0?`Bn1EOujJOl_3AV7cs z0RjXF5FkKcu7F^`TwiY|K!5-N0t5&UAV7cs0Rqtk1OuXN#5@ED5FkK+009C72oNAZ zV6K2*z+7K%CqRGz0RjXF5FkK+009Ew1Ox-Zt;9eC2oNAZfB*pk1PBlyKwzqXV8B#f zFDF2N009C72oNAZfB*pk;RFN&!mY$W1PBlyK!5-N0t5&UAV6TMfMCE>UN0v=fB*pk z1PBlyK!5-N0`UX{1LEz(L<9&BAV7cs0RjXF5FkKcrhs6;OkM9LK!5-N0t5&UAV7cs z0Rr&^1Owvj#6$!L5FkK+009C72oNAZV5Wdzz)W55CP07y0RjXF5FkK+009C41q1^E zF2zU$2oNAZfB*pk1PBlyKwzSPV8BFNuO>i%009C72oNAZfB*pk0R;pD0xrc!1PBly zK!5-N0t5&UAV6TEfMCExT(2fTfB*pk1PBlyK!5-N0ucoS10rt4OaurJAV7cs0RjXF z5FkKco`7J$JX>!jK!5-N0t5&UAV7cs0Rj;P1Op;&#Y_YU5FkK+009C72oNAZV4i?r zz&u-TCP07y0RjXF5FkK+009Ca1q1^^uEkIU2oNAZfB*pk1PBlyKwz4HV8Aq5FD5{M z009C72oNAZfB*pkAq4~jLaxP71PBlyK!5-N0t5&UAV6T6fMCEhS}!I*fB*pk1PBly zK!5-N0x<;y17hyQR0IeRAV7cs0RjXF5FkKcmVjWuELra*K!5-N0t5&UAV7cs0Rk}v z1OsC3#Z&|c5FkK+009C72oNAZV3vSjz${tsB|v}x0RjXF5FkK+009C)1q1_vF2+~{ z2oNAZfB*pk1PBlyKwy%9V8A3;uO&c$009C72oNAZfB*pkK?MW@f-c5b1PBlyK!5-N z0t5&UAV6S}fMCERSg$2OfB*pk1PBlyK!5-N0#OA71EOxmTm%RZAV7cs0RjXF5FkKc zj(}jm99M58K!5-N0t5&UAV7cs0RmA41OuXO##{sl5FkK+009C72oNAZV2*%bz#La^ zB|v}x0RjXF5FkK+009DF1q1`auEt;l2oNAZfB*pk1PBlyKwyf1V89esFC{>L009C7 z2oNAZfB*pkVFd&O!mh?(1PBlyK!5-N0t5&UAV6S>fMCEBRxc$$fB*pk1PBlyK!5-N z0&xWd1LE$+WCREhAV7cs0RjXF5FkKchJawe3{~$WK!5-N0t5&UAV7cs0RnLa1Owvk z#$*Ht5FkK+009C72oNAZV1|HTzzkLIBtU=w0RjXF5FkK+009Dl1q1^EFUM#E2oNAZ zfB*pk1PBlyKwyG^V88@auOvW#009C72oNAZfB*pkfdvEu0x!pC1PBlyK!5-N0t5&U zAV6S(fMCD`RIemJfB*pk1PBlyK!5-N0+9s-10rw7Yy=1pAV7cs0RjXF5FkKcyntZ9 zcvEjAK!5-N0t5&UAV7cs0RoW)1Op;($7}=$5FkK+009C72oNAZV7!1}z<5({BtU=w z0RjXF5FkK+009D_1q1^^ug7o%2oNAZfB*pk1PBlyKw!9lV8C!vFC;*K009C72oNAZ zfB*pkp#=m3La)bg1PBlyK!5-N0t5&UAV6TafMCFIQZFPxfB*pk1PBlyK!5-N0z-UqLBS3%v0RjXF5FkK+009EQ1q1_vFUWWV2oNAZfB*pk z1PBlyKwz+dV8CEduOmQ!009C72oNAZfB*pk!36{Zf-lH;1PBlyK!5-N0t5&UAV6TS zfMCF2P_H9EfB*pk1PBlyK!5-N0?`Eo1EO!pd;|y(AV7cs0RjXF5FkKctbky^SWj;w zK!5-N0t5&UAV7cs0Rqtl1OuXP$b19{5FkK+009C72oNAZV61>(z*tXjBS3%v0RjXF z5FkK+009Ew1q1`augHJ|2oNAZfB*pk1PBlyKwzkVV8BpLFC##J009C72oNAZfB*pk z;ROT(!mr4H1PBlyK!5-N0t5&UAV6TKfMCE-PA?-sfB*pk1PBlyK!5-N0`Ua|1LE(< zgail>AV7cs0RjXF5FkKcq<~<+NKNk|K!5-N0t5&UAV7cs0Rr&_1Owvl$b^L5FkK+009C7 z2oNAZV3dGhz$i)YAwYlt0RjXF5FkK+009C?1Ox+;EXtS!2oNAZfB*pk1PBlyKwyx7 zV89?quOUEy009C72oNAZfB*pkNdyD~k}S%Y1PBlyK!5-N0t5&UAV6S{fMCENNUtG4 zfB*pk1PBlyK!5-N0$BtE1F~$&oCF9EAV7cs0RjXF5FkKcjDTRk7)Ng*K!5-N0t5&U zAV7cs0RmYB1Ou{c%A5oU5FkK+009C72oNAZV2prZz!*nwAwYlt0RjXF5FkK+009DN z1Ox-ptjeGS2oNAZfB*pk1PBlyKwyY~V89SYFCjpH009C72oNAZfB*pkX#@lV(yYp$ z1PBlyK!5-N0t5&UAV6S1OqZ{%d7+l5FkK+009C72oNAZ;JScdz;#1!AV7cs0RjXF5FkK+009E21Ox+8 zt;?_k2oNAZfB*pk1PBlyK;W`~V8CTUFCajG009C72oNAZfB*pksRRTAQmxCd1PBly zK!5-N0t5&UAVA=iYI0@%50t5&UAV7cs0RjXF5Fn6MKrkTd z=FCli009C72oNAZfB*pk1kMQv2Ap&A6afMR2oNAZfB*pk1PBnwDj*n;b#vw>K!5-N z0t5&UAV7cs0Rra)1Ov{wd5Qo50t5&UAV7cs0RjXFq!kbhNV__N6Cgl<009C72oNAZ zfB=D00)hdj*gQml009C72oNAZfB*pk1kwr!2Bck`!3hu`K!5-N0t5&UAV7e?DFMNN zQ*0h0K!5-N0t5&UAV7cs0Rnji1OxK!&g29L5FkK+009C72oNAZ;EaG^z!^2q5FkK+ z009C72oNAZfB=EK0)hc~cV}_}1PBlyK!5-N0t5&UAaF)NFyM@uX9y4=K!5-N0t5&U zAV7dXVgbQ`#LF`}0RjXF5FkK+009C72oN|SAQ*50%_9T|5FkK+009C72oNAZAhCd8 zK;q>Yod5v>1PBlyK!5-N0t5)05D*MFf#wkc1PBlyK!5-N0t5&UAdp!=Fd*~x%uav+ z0RjXF5FkK+009C7jtd9|95?d>0RjXF5FkK+009C72oT6DAQ+H&duAs=de1CE<{f&c*m1PBlyK!5-N0t5)877z?by*|SeAV7cs0RjXF5FkK+0D;2- zf&qugJV1Z|0RjXF5FkK+009C7QVR$Mq+Xxl2@oJafB*pk1PBlyK!Ctu0l|R7WF8;3CqRGz0RjXF5FkK+009EY z1q1_`~(OPAV7cs z0RjXF5FkL{n1EowF)zO+K!5-N0t5&UAV7cs0Rq_t1Ou{f(EJ1l5FkK+009C72oNAZ z;Fy45z%ehsCP07y0RjXF5FkK+009E&1q1`quh0bu5FkK+009C72oNAZfWRRE!GJ?t zeoTM>0RjXF5FkK+009C7(hCR%q+g*65FkK+009C72oNAZfB=C*0)hdDxcry^0RjXF z5FkK+009C72;>(K49LGjHy}WO009C72oNAZfB*pkM+5`|j%fKU0RjXF5FkK+009C7 z2oT6GAQ+H;hi*WC009C72oNAZfB*pk1da#@1{~4yTLJ_K5FkK+009C72oNApKtM2{ zz!F`7009C72oNAZfB*pk1PB}u5DYkg<);J)5FkK+009C72oNAZpn!m2K!GK?0s#U9 z2oNAZfB*pk1PBl~ARriU0LxDa5FkK+009C72oNAZfItNS!GH=|bO!5Nc0WU)N836(W2oNAZfB*pk1PBl)A|M!0WRb2xfB*pk z1PBlyK!5-N0t8+Z5Da(`%FhT8AV7cs0RjXF5FkK+KotSOfGV4G4*~=T5FkK+009C7 z2oNCfnt))yYfgSefB*pk1PBlyK!5-N0tBiE2nJNyq};JmzeyB009C72oNAZ zfB*pk1PIg-5DciZOE)1vfB*pk1PBlyK!5-N0B009C7 z2oNAZfB*pk1YQsj40r*_PY4hoK!5-N0t5&UAV7dXB>};JO51c70t5&UAV7cs0RjXF z5FqeeKrrCBkzWuXK!5-N0t5&UAV7csfl2~`0hPAtE(8b=AV7cs0RjXF5FkL{xqx86 zb0fbXK!5-N0t5&UAV7cs0Rp821OrN~(`5({AV7cs0RjXF5FkK+z*7OifTu)$K!5-N z0t5&UAV7cs0RjX{2?z$1TBpkpAV7cs0RjXF5FkK+0D-3hf&ov7{D1%f0t5&UAV7cs z0RjXF)DjR3sI^bGAwYlt0RjXF5FkK+009Ee1Ox+~3HhD?0RjXF5FkK+009C72-Fe~ z45+nFw;@1)009C72oNAZfB*pk&jbVmo(cJ$009C72oNAZfB*pk1PBxp5DX}`P}duqt0t5&UAV7cs0RjXF z)DsX4sJBx$B0zuu0RjXF5FkK+009Dz1Ox*f>G+NS0RjXF5FkK+009C72-Fi045+tL zHzGiQ009C72oNAZfB*pkj|2n*9_jdw009C72oNAZfB*pk1PBxq5DX}|R97NEfB*pk z1PBlyK!5-N0uKZP10LY`iU0uu1PBlyK!5-N0t5&Y6c7w3xKvjnK!5-N0t5&UAV7cs z0Rj&M1Op!6_=*4l0t5&UAV7cs0RjXFR1^>lsJK;kB0zuu0RjXF5FkK+009E`1q1`` z+xUh60RjXF5FkK+009C72vigh45+wOcOpQ5009C72oNAZfB*pk_XPw4?%Vi=009C7 z2oNAZfB*pk1PGKA5DX}}R+l0`fB*pk1PBlyK!5-N0(S)j1MbrJf&c*m1PBlyK!5-N z0t5(@6c7w3xmK4VK!5-N0t5&UAV7cs0Rndg1Ox8U_<{fd0t5&UAV7cs0RjXF)D#d5 zsJU0SB0zuu0RjXF5FkK+009E`1Ox-_$@rWA0RjXF5FkK+009C72-Fl145+zRw<17* z009C72oNAZfB*pk_XGq3?#cL^009C72oNAZfB*pk1PBxr5DX}~Sl1#zfB*pk1PBly zK!5-N0(S%i1Ma~1m;eC+1PBlyK!5-N0t5&Y6%Y(4x>(mDK!5-N0t5&UAV7cs0Rndf z1Ox8C_?Q3z0t5&UAV7cs0RjXFR22{msJdDAB0zuu0RjXF5FkK+009EG1q1_byZDp< z0RjXF5FkK+009C72viji45+$U_aZ=m009C72oNAZfB*pkw*>?PZoBxD009C72oNAZ zfB*pk1PGKB5DX~0S{EZgfB*pk1PBlyK!5-N0yhN&18%bTkN^P!1PBlyK!5-N0t5(@ z6%Y(4yIL0`K!5-N0t5&UAV7cs0RlG#1Osle_>cer0t5&UAV7cs0RjXF)D;j6sJmM? zBS3%v0RjXF5FkK+009EG1Ox+asrZZl0RjXF5FkK+009C72-Fo245+(XHzPoR009C7 z2oNAZfB*pkw*&+OZmIZ;009C72oNAZfB*pk1PBxs5DX~1TvsDNfB*pk1PBlyK!5-N z0yhK%18$)BhyVcs1PBlyK!5-N0t5&Y77z?5yj)i!K!5-N0t5&UAV7cs0RlG!1OslM z_=o@j0t5&UAV7cs0RjXFR2C2nsJvZwBS3%v0RjXF5FkK+009DT1q1`$n)rkO0RjXF z5FkK+009C72vimj45++acOyW6009C72oNAZfB*pkZv_Mc-kSJ?009C72oNAZfB*pk z1PGKC5DX~2UY8?4fB*pk1PBlyK!5-N0&fHa1KyDMfB*pk1PBlyK!5-N0t5(@77z?5 zy1PBlyK!5-N0t5&Y7Z406zF^lQK!5-N0t5&UAV7cs0Rry{ z2nM_d;$I06AV7cs0RjXF5FkK+Kyd-VfZ_{wJpu#>{69PQ?yBo{6>xav#y*M(7O6x; z5X%IkU?BlhMnW*Cpacs8(aIPL1qHE)gkTX6I}s!Vv9L*y^rF})L_{mW!pg#bKn&5H zkaPCBe3$n!FJp}P1fqMb@BQXG<}+3$_#;4o009C72oNAZ;F*A6z%vj(5+Fc;009C7 z2oNAZfB=E&0)he6H|%}{2oNAZfB*pk1PBlyK;Wr>V8BxkKM^26fB*pk1PBlyK!5;& z>H>lR)i>;Z1PBlyK!5-N0t5&UAVA=$fMCE=4?htgK!5-N0t5&UAV7csf${=^0p(Zh zf&>Tz!MHX5FkK+009C72oNAZfB=E|0)hecckG4)2oNAZfB*pk1PBly zK;W@}V8CMy|0Y0y009C72oNAZfB*pk^#ue2>hIVM2@oJafB*pk1PBlyK!Ctw0l|RB z8vady009C72oNAZfB*pk1Qrkw3|L^vu1J6Y0RjXF5FkK+009C79tj8rJi_o#0t5&U zAV7cs0RjXF5FoICfMCD^OLj#91PBlyK!5-N0t5&UAn-^)FyIk}e-a=-fB*pk1PBly zK!5;&6$AtWR@kyT5+Fc;009C72oNAZfB=Cv0)hc=Ec}ZA0RjXF5FkK+009C72&^C= z7_h>Y-H`wR0t5&UAV7cs0RjXFyb%x#cw^yT1PBlyK!5-N0t5&UAV6RV0l|PJ*6fl5 z2oNAZfB*pk1PBlyK;Rt#!GL!t{DS}i0t5&UAV7cs0RjXFEFmBmu*8~Ok^lh$1PBly zK!5-N0t5)WBOn;?4uyXZAV7cs0RjXF5FkK+0D(0G1OwLCvs)4%K!5-N0t5&UAV7cs zfwu(&1KyVKzX=c^K!5-N0t5&UAV7e?8Ulg=YwX!A2@oJafB*pk1PBlyK!Cv80)hc= zOZeXe2oNAZfB*pk1PBlyKwuF8!GJ{;?V1D#5FkK+009C72oNAZ;Cljs0sa&S5FkK+ z009C72oNAZfWTS;f&pvo+ieLDAV7cs0RjXF5FkK+fM9^X0RjXF5FkK+009C72oNB! zn1EowVheX&0t5&UAV7cs0RjXF5LjM7FktyV0RRLD5FkK+009C72oNB!n1EowVheX& z0t5&UAV7cs0RjXF5LjM7FktyV0RRLD5FkK+009C72oNB!nt))yY8!W70t5&UAV7cs z0RjXF5LjJ6Fktn+0QV{009C72oNAZfB*pkD++w$)tBD;@bK^hfAp>Yef1ZA`0DjP{byN$ z|9JPOKJlLSe(?4E-+K73pZUvQ`KizU!v{X}`lpY-{_pp_{_p2L|JmRD&0qiUZ~y)$ ze(saM`0=0r&>w&E6aVzdfBWZe{O2z`eBrDA`ltW$)sKGh_rCsXfAG;?{{CP3oY(7<6rv7|9$U2?|b;*!)HJ9JD>Tz!~0%8 z@~+qa{l?$??Cbye@bKS%_mTI%{?dDX;vwqq1PBlyK!5-N0t5&U zSWrMPV8NxkG64bv2oNAZfB*pk1PH7xAQ-Ur{@tDc0RjXF5FkK+009C7))Np6Sa0WU zOn?9Z0t5&UAV7cs0Rn3a2nMXZf43(rK2CTMm_a#7p009C72oNAZfB=Ej1q1_D{|j(`0t5&UAV7cs z0RjXF5Lit>FkrQfyDtF(1PBlyK!5-N0t5&wFCZAO{GR{-0t5&UAV7cs0RjXF5Liq= zFkrETyDk9&1PBlyK!5-N0t5&wFCZAO{GR{-0t5&UAV7cs0RjXF5Liq=FkrETyDk9& z1PBlyK!5-N0t5&U5Df4)K!5-N0t5&UAV7cs0RjZp5)cenYu|25fB*pk1PBlyK!5-N z0t5sD{0$HwK!5-N0t5&UAV7csfwcq#1J>HN+Y%r^fB*pk1PBlyK!5;&zZMMeM?io8 z0RjXF5FkK+009C7))Ej5SZm*IOMn0Y0t5&UAV7cs0RjXB1N;pTAV7cs0RjXF5FkK+ z0D-jx1OwLEx7!jRK!5-N0t5&UAV7cs0l@%&0|W>VAV7cs0RjXF5FkKcF#*AV#TM?m z1PBlyK!5-N0t5&UAh5iEV8HT!0ssgQAV7cs0RjXF5FkKcF#*AV#TM?m1PBlyK!5-N z0t5&UAVA>juU@_T;q`w$_U*5I`71aG5FkK+009C72oNAZfB=E=0)heMSL}iW2oNAZ zfB*pk1PBlyK;VghV89a&KM){5fB*pk1PBlyK!5;&@&bYZ zQx888AV7cs0RjXF5FkK+0D7wmcj2oNAZfB*pk1PBlyK;W5xV8AmFKN287fB*pk1PBly zK!5;&;sSyJ#TV>)1PBlyK!5-N0t5&UAVA=`fMCFL5kC_kK!5-N0t5&UAV7csf!YFs z0k!w*b_56zAV7cs0RjXF5FkL{xqx86a}hriAV7cs0RjXF5FkK+0D;;9f&sPn>vjYP z5FkK+009C72oNAZ;Dvx-zzY(;AV7cs0RjXF5FkK+009D}1q1_1uh-=W5FkK+009C7 z2oNAZfWQj@!GISeenEf$0RjXF5FkK+009C7N(%@ElwPmP5gN2oNAZfB*pk1PBlyK%l6A zU_jBux)uQf1PBlyK!5-N0t5&UxF#SNa81VV2@oJafB*pk1PBlyK!89^0l|Qpdvz-U z1PBlyK!5-N0t5&UAaG4UFyNYu-xDA}fB*pk1PBlyK!5;&ngW6WHTUXP1PBlyK!5-N z0t5&UAVA=%fMCE?8XpiKK!5-N0t5&UAV7csfsz7(0VUV!QUnMPAV7cs0RjXF5FkL{ zs(@g?RT>`QV#<5FkK+009C72oNAZ;JScdz;zp+ z5FkK+009C72oNAZfB=Dt0)hb*x9Uy=2oNAZfB*pk1PBlyK;XK7V8C@7pAaBGfB*pk z1PBlyK!5;&iUNWG6}Re61PBlyK!5-N0t5&UAVA=TfMCE493K%NK!5-N0t5&UAV7cs zfr0{p0R@-pN(2ZHAV7cs0RjXF5FkL{hJawe4ICd4AV7cs0RjXF5FkK+0D*!6f&m4W z>PiF%5FkK+009C72oNAZ;Ff@3z%3o05g*q;1PBlyK!5-N0t5&U zAVA=zfMCE)9v>1QK!5-N0t5&UAV7csfpP+Z0p(WeLIem9AV7cs0RjXF5FkL{rhs6; zO&%W-AV7cs0RjXF5FkK+0D*D>f&t}L>Ouqv5FkK+009C72oNAZ;I@EZz-=F&5+Fc; z009C72oNAZfB=DN0)he6HtIeE2oNAZfB*pk1PBlyK;X83V8Cr3pAsNIfB*pk1PBly zK!5;&Y65}*)i&xr1PBlyK!5-N0t5&UAVA=bfMCEKARiMTK!5-N0t5&UAV7csfnoxJ z0mT;TIs^z1AV7cs0RjXF5FkL{j(}jm9UvbQAV7cs0RjXF5FkK+0D)oxf&s-A>N*4n z5FkK+009C72oNAZ;GTeBz&#m30j1XIG6V<^AV7cs0RjXF5FkL{u7F^`T_O(< zAV7cs0RjXF5FkK+0D)2hf&r!0=`sWe5FkK+009C72oNAZ;J$!hz&k-O%fB*pk1PBlyK!5;&8Ulg=HTLKh1PBlyK!5-N0t5&UAV6TVfMCF8Di0DM zK!5-N0t5&UAV7csff53O0VUSx5(EekAV7cs0RjXF5FkKcvw&d0W-1R7AV7cs0RjXF z5FkK+0D%$$f&nGg=n@175FkK+009C72oNAZV7q`|z;-K75+Fc;009C72oNAZfB=CC z0)hb*w&)H72oNAZfB*pk1PBlyKw!IoV8C`OPZA(NfB*pk1PBlyK!5;&3Ic)w6}IRO z1PBlyK!5-N0t5&UAV6S;fMCE5ERPZ(K!5-N0t5&UAV7csfdT@80R@)m3IqrcAV7cs z0RjXF5FkKchk#(f4lIunAV7cs0RjXF5FkK+0D%Gmf&m4V=n4b~5FkK+009C72oNAZ zV2^-cz#c8n5+Fc;009C72oNAZfB=E~0)hegcjyKL2oNAZfB*pk1PBlyKwyu6V89+N z&k`U&fB*pk1PBlyK!5;&`~rdj`FH3B1PBlyK!5-N0t5&UAV6T3fMCEbE)NqRK!5-N z0t5&UAV7csf%F1`0qIxh0t5&UAV7cs0RjXF5FkKcmw;fvE-nufAV7cs0RjXF5FkK+ z0D<%Zf&uAQ=mG=?5FkK+009C72oNAZV4r|sz&>D&c0RjXF z5FkK+009C72oTsQAQ-R{%;N+I5FkK+009C72oNAZAi02GK=K6|p8x>@1PBlyK!5-N z0t5)`6c7y93FdJE1PBlyK!5-N0t5&UAdp-@Fd+E?jZc680RjXF5FkK+009C7_6i6F z>=pAo0RjXF5FkK+009C72oT6EAQ+H)f2JoufB*pk1PBlyK!5-N0(%7n1NMq}o&W&? z1PBlyK!5-N0t5);77z@`y+6|vAV7cs0RjXF5FkK+0D;{Cf&sh9e1QM~0t5&UAV7cs z0RjXFq!thiNWDJ86Cgl<009C72oNAZfB=Er0)hd%$$WtT0RjXF5FkK+009C72&5Je z3`o5`!xJDtfB*pk1PBlyK!5;&{Q`mk`^|iV009C72oNAZfB*pk1PEjn5Ddt?J+l)a zK!5-N0t5&UAV7csf&Bu40sGB-g8%^n1PBlyK!5-N0t5(T77z@`ygjoMAV7cs0RjXF z5FkK+0D%Jnf&mB6e1!l30t5&UAV7cs0RjXFBo+`1NW46w6Cgl<009C72oNAZfB=C5 z0)hbt(0qje0RjXF5FkK+009C72qYE|3`o2@qZ1%NfB*pk1PBlyK!5;&BLac}N7Q_W z009C72oNAZfB*pk1PJ665Ddt>JChS2K!5-N0t5&UAV7csfg=Kf0Y}t)hX4Tr1PBly zK!5-N0t5);6%Y)_yE~H;AV7cs0RjXF5FkK+0D(gSf&quve2D-70t5&UAV7cs0RjXF zq!kbhNV__N6Cgl<009C72oNAZfB=C*0)hdD*nEiq0RjXF5FkK+009C72&5Gd3`n~= zgA*V?fB*pk1PBlyK!5;&V*-K!$J~62009C72oNAZfB*pk1PEjm5Ddt=Idc;rK!5-N z0t5&UAV7csfnx%K0ms~YivR%v1PBlyK!5-N0t5(T6%Y)_x;b+bAV7cs0RjXF5FkK+ z0D*%7f&mBNe2oAB0t5&UAV7cs0RjXFBoz=0NV+&<6Cgl<009C72oNAZfB=Dm0)hbt z;e3q%0RjXF5FkK+009C72qYB{3`n{-V-p}ifB*pk1PBlyK!5;&qXL2fN9BBv009C7 z2oNAZfB*pk1PJ655Ddt3op@0RjXF5FkK+009C72&5Dc3`n^)LlYoC zfB*pk1PBlyK!5;&;{t*K$L)NR009C72oNAZfB*pk1PEjl5Ddt;H8T?+K!5-N0t5&U zAV7csf#U*#0mtoplK=q%1PBlyK!5-N0t5(T6c7x^xHU5qAV7cs0RjXF5FkK+0D%(% zf&nM+e3bwJ0t5&UAV7cs0RjXFBoq(~NVqg36Cgl<009C72oNAZfB=CL0)hc2@O+g3 z0RjXF5FkK+009C72qY8`3`n>%BNHG%fB*pk1PBlyK!5;&GXjDEXY_oR009C72oNAZ zfB*pk1PJ645Ddt-GZPaaK!5-N0t5&UAV7csfinVv0cZ4lmjD3*1PBlyK!5-N0t5); z6A%o@w=)wHAV7cs0RjXF5FkK+0D)5if&r)ae3<|N0t5&UAV7cs0RjXFq!SPfNVhTr z6Cgl<009C72oNAZfB=D00)hdj_@1PBlyK!5-N0t5);5)cf? zwJ*~WAV7cs0RjXF5FkK+0D;p2f&r%q9YBBp0RjXF5FkK+009C7QV9qKq*|9@2@oJa zfB*pk1PBlyK!Ct$0l|RNgbpA;fB*pk1PBlyK!5-N0;vQ915&NaumlJYAV7cs0RjXF z5FkL{yntZ9c|#`?X0t5&UAV7cs0RjXF5Xd7S z7?5XICM7_C009C72oNAZfB*pkEd&GuS|~b$009C72oNAZfB*pk1PJ625Ddt(E0Yo+ zK!5-N0t5&UAV7csfhGci0ZkYkLVy4P0t5&UAV7cs0RjZl2nYtGS(QNv5FkK+009C7 z2oNAZfIt%g!GI==4k18*009C72oNAZfB*pkX#@lV(yYp$1PBlyK!5-N0t5&UAV8pv zfM7ryN2d@VK!5-N0t5&UAV7csfh+=o0a-R>P67l75FkK+009C72oNC9MnEv2jiXZt z5FkK+009C72oNAZfIt=j!GJ8AGA9871PBlyK!5-N0t5&UXe1yQ&kD49Kx3QxYIRfB*pk z1PBlyK!5;&W&(l%%_tp2fB*pk1PBlyK!5-N0t8YB2nM8BlOYKZAV7cs0RjXF5FkK+ zKr;csfM%2qB0zuu0RjXF5FkK+009Ci1Ox+8tjUlB2oNAZfB*pk1PBlyK%kv~U_d)d zClMe(fB*pk1PBlyK!5;&3<81y8Mb6b0t5&UAV7cs0RjXF5FpS_Kro=4rIQE{AV7cs z0RjXF5FkK+Kn4N9fDBtQBLM;g2oNAZfB*pk1PBmlC?FWn5Ytfv2oNAZfB*pk1PBly zKp=sDU_gQ;8Ib@10t5&UAV7cs0RjXFG!zgFXo%@30t5&UAV7cs0RjXF5Fn61KrkS| zl8i`z009C72oNAZfB*pk1X>CR2DH?476AeT2oNAZfB*pk1PBm_FCZ8Ye@7-HK!5-N z0t5&UAV7cs0Rk-r1Or-XI*R}S0t5&UAV7cs0RjXF#1{|@h`%Ef5+Fc;009C72oNAZ zfB=D}0)hceIUPoT009C72oNAZfB*pk1i}jl283Uc0SOQwK!5-N0t5&UAV7dXQvtz% zrkoBVK!5-N0t5&UAV7cs0RrI#1Ovja$bbY05FkK+009C72oNAZpsj#lKwD3z5gO00RjXF5FkK+009C72oPv2AQ;dX)Nup|5FkK+009C72oNAZAh>{F zK=1__j{pGz1PBlyK!5-N0t5&&77z?*4C*)n1PBlyK!5-N0t5&UAP`(YFd+DXj7NX~ z0RjXF5FkK+009C7S_=pUv=((90RjXF5FkK+009C72oQ)ZAQ%vPKc*uSW=2oNAZfB*pk1PBly&|W|=puMRR2@oJafB*pk1PBlyK!8AG z0l|RC+c6sf0t5&UAV7cs0RjXF5a=Kv7|;RLkpu`3AV7cs0RjXF5FkJxuz+Ad;N=*N z009C72oNAZfB*pk1PF8x5De&m>PP|v2oNAZfB*pk1PBly5LiGkAn;dZ;>+009C72oNAZfB*pk1PH_x5DbXB8Dy5FkK+009C72oNC9M?f&3kE>G&5FkK+009C72oNAZfIw6M!GNfn zF&6;>1PBlyK!5-N0t5&U=p-N*&!iU_ij77>NJ@0t5&UAV7cs z0RjXFbQBN_=!olR0t5&UAV7cs0RjXF5FijxKrkTSQjA1^009C72oNAZfB*pk1bPYx z2K3Z*HURK!5-N0t5&UAV7cs0RrI! z1OvjY#6ScH5FkK+009C72oNAZps#>nKwn>{6Cgl<009C72oNAZfB=DL0)he2HewzE z1PBlyK!5-N0t5&UAkbGpFrcrm(+LnDK!5-N0t5&UAV7dXGy%bYXd5vP0RjXF5FkK+ z009C72oUHjAQ;dY*zp7i5FkK+009C72oNAZAeew)K(K`vhX4Tr1PBlyK!5-N0t5(j z77z^R4D5IU1PBlyK!5-N0t5&UAP`JIFd*1Mj6;9`0RjXF5FkK+009C7dJ6~!^cHqL z0RjXF5FkK+009C72oQ)RAQ%v9AEqHdfB*pk1PBlyK!5-N0=)$U19}TPp8x>@1PBly zK!5-N0t5)e5)cfCwGYz}AV7cs0RjXF5FkK+0D^009C7 z2oNAZfB*pk1PH_t5DbX33zHBaK!5-N0t5&UAV7csfe`|N0V9;Xg8%^n1PBlyK!5-N z0t5)e5fBWBvkQ|DAV7cs0RjXF5FkK+0D&O_f&oLAy@UV(0t5&UAV7cs0RjXFgb@%7 z2(t=<5FkK+009C72oNAZfB=CZ0)hcUn7xDm0RjXF5FkK+009C72!s(33<$FdgAgD< zfB*pk1PBlyK!5;&F#>`CW1PK(009C72oNAZfB*pk1PDYC5DbX233Cu2K!5-N0t5&U zAV7csfiVJt0b`uKg#ZBp1PBlyK!5-N0t5&|5fBWBvI%n#AV7cs0RjXF5FkK+0D(aQ zf&qh|y@mh*0t5&UAV7cs0RjXF1Q8Gn2(k!c5FkK+009C72oNAZfB=C(0)hd9puL6w z0RjXF5FkK+009C72m}!j3<$CaV-O%ffB*pk1PBlyK!5;&Q38Siqolou009C72oNAZ zfB*pk1PH_s5DbX12U8FrK!5-N0t5&UAV7csfl&g20i&e7hX4Tr1PBlyK!5-N0t5)e z5D*NAu?JHSAV7cs0RjXF5FkK+0D)lwf&s&*y@&t-0t5&UAV7cs0RjXFgb)x62(bo3 z5FkK+009C72oNAZfB=DE0)hd0t5&UAV7cs0RjXFOcxLgn7#r75FkK+ z009C72oNAZfB=D^0)hcUxxI`40RjXF5FkK+009C72uv3c44A$G0}voUfB*pk1PBly zK!5;&u>yhtW4*nN009C72oNAZfB*pk1PII)5Db{T0q-Y3fB*pk1PBlyK!5-N0%HXP z1IBuL8vz0Y2oNAZfB*pk1PBnAEg%>$djsB2fB*pk1PBlyK!5-N0t5yN2nGxW_c{Uu z2oNAZfB*pk1PBlyFj+t_VDbXIo&W&?1PBlyK!5-N0t5&Q77z>=4DNLV2oNAZfB*pk z1PBlyKwz?fV8G-Bcs&6E1PBlyK!5-N0t5&U7%dJ^};?5FkK+009C72oNAJS3odeuD`bv zAV7cs0RjXF5FkK+0D<8Gf&s(Hy^sI_0t5&UAV7cs0RjXFOcf9en9A?v1PBlyK!5-N z0t5&UAV6TafMCFIaxWx6fB*pk1PBlyK!5-N0#gM91E%tOIROF$2oNAZfB*pk1PBlq zFCZ8&-rO4r5FkK+009C72oNAZfWS-v!GM|i-c5i20RjXF5FkK+009C7#tR4rj5qg2 z0t5&UAV7cs0RjXF5Fjv9KrmpYzIPKKK!5-N0t5&UAV7csfe8YF0Ta-@k^lh$1PBly zK!5-N0t5(56c7xUi0{<|2oNAZfB*pk1PBlyKwyG^V88@)uOvW#009C72oNAZfB*pk z69ohVCgOWF0RjXF5FkK+009C72oRVdAQ&)1-8%^oAV7cs0RjXF5FkK+z&ruLfO+=b zOn?9Z0t5&UAV7cs0RjYO2nYtuQ1?y(1PBlyK!5-N0t5&UATUorFkqg&HxnR0fB*pk z1PBlyK!5;&DFT84Q`o(f009C72oNAZfB*pk1PDwM5Db_`@5KZN5FkK+009C72oNAZ zV2XfXz!Y{bB|v}x0RjXF5FkK+009Ei1Ox-7(R(og0t5&UAV7cs0RjXF5SSw%7%<1( zTL};#K!5-N0t5&UAV7e?ECIoQS@PaXfB*pk1PBlyK!5-N0tDs=2nNh?_f`S~2oNAZ zfB*pk1PBlyFiSu%V3xf15+Fc;009C72oNAZfB=C>0)hdP;Juar0RjXF5FkK+009C7 z2uuFiYNh2@oJafB*pk1PBlyK!Cs;0l|Pd?%qm(009C7 z2oNAZfB*pk1ZD{c2F#N8UIGLN5FkK+009C72oNAJM?f%Oj=Q%KAV7cs0RjXF5FkK+ z0D)-&f&tU$y_f(20t5&UAV7cs0RjXFOc4+an8NO*1PBlyK!5-N0t5&UAV6T6fMCEh zdM_qGfB*pk1PBlyK!5-N0#gJ81E#QhDFFfm2oNAZfB*pk1PBnACmi%009C72oNAZfB*pk69fbUCZKyI0RjXF z5FkK+009C72oRVlAQ&)H-@6GAAV7cs0RjXF5FkK+z<2?{fbr(uNPqwV0t5&UAV7cs z0RjYO3J3yhtW4*nN009C72oNAZfB*pk1PII) z5Db{T0q-Y3fB*pk1PBlyK!5-N0%HXP1IBuL8vz0Y2oNAZfB*pk1PBnAE+7~%eFX*} zK!5-N0t5&UAV7cs0Rlq>1OtY0dl>-&1PBlyK!5-N0t5&Um@Xg~Fnt9EAV7cs0RjXF z5FkK+009C+1q1_za(fv80t5&UAV7cs0RjXF5ST9@7%+baCLln7009C72oNAZfB*pk zBLxHlMrwN(0RjXF5FkK+009C72oRVrAQ&)z2PPmufB*pk1PBlyK!5-N0wVq0t5&UAV7cs0RjXF5Qrfl7!YF*rXWCo009C72oNAZfB*pkqXYy4 zMoD`Q0RjXF5FkK+009C72oQ)NAQ%v152heMfB*pk1PBlyK!5-N0;2>314c=E4*>!M z2oNAZfB*pk1PBlaA|MzLWD&+7K!5-N0t5&UAV7cs0Rn>r1Oo;^dkp~s1PBlyK!5-N z0t5&U2qGXD5M&X?AV7cs0RjXF5FkK+009Dn1Ox*HL3<4W0t5&UAV7cs0RjXF5Qrim z7!YL><{&_T009C72oNAZfB*pkV*~^P#yEQm0RjXF5FkK+009C72oQ)OAQ%v36Xqa5 zfB*pk1PBlyK!5-N0%HUO1I9Re3jqQI2oNAZfB*pk1PBlaBOn+MW)%h@K!5-N0t5&U zAV7cs0Rlq=1OtXJdkFyo1PBlyK!5-N0t5&U2qPdE5M~tyAwYlt0RjXF5FkK+009C+ z1Ox+yFnb9B0t5&UAV7cs0RjXF5Qrln7!YR{CLut8009C72oNAZfB*pkBLoBkMksp+ z0RjXF5FkK+009C72oQ)PAQ%v57bYPE2oNAZ zfB*pk1PBlaBp?_NXcY zf-S^21PBlyK!5-N0t5&UAV8qAfM7spV8;_6K!5-N0t5&UAV7csfoKAP0ns*M9s&di z5FkK+009C72oNC9S3oeJudmYy5FkK+009C72oNAZfIu_>!GLHRF%JO(1PBlyK!5-N z0t5&U=qn%?(AU@L1PBlyK!5-N0t5&UAV46TfM7tll^BQs0RjXF5FkK+009C72y_(? z4Cu=1Z~_Df5FkK+009C72oN9;PCzgq+)4~YfB*pk1PBlyK!5-N0tC7W2nKZJbvOY6 z1PBlyK!5-N0t5&Uh$kQz5N{_YB0zuu0RjXF5FkK+009C$1q1_n>N=YM0RjXF5FkK+ z009C72*eW*42ZWA6A>UlfB*pk1PBlyK!5;&o&tgaJ$0Q;fB*pk1PBlyK!5-N0t5mI z2nGaPijfEqAV7cs0RjXF5FkK+Kt}<=fR4D1CP07y0RjXF5FkK+009C41q1^EF2zU$ z2oNAZfB*pk1PBlyK%k?5U_eJ)M-w1GfB*pk1PBlyK!5;&hysEE5w~I{0t5&UAV7cs z0RjXF5FpS`Kro=6t&<55AV7cs0RjXF5FkK+Ktut-fQVZ$69EDQ2oNAZfB*pk1PBo5 zCm=mU_i*V7>WP^0t5&UAV7cs0RjXFbQ2H^=tk>c z0t5&UAV7cs0RjXF5FijzKrkTWS`0;i009C72oNAZfB*pk1iA?b26Ur!FaZJt2oNAZ zfB*pk1PBm_DIgdSb1$YMK!5-N0t5&UAV7cs0Rp`Q1Os}>I+p+e0t5&UAV7cs0RjXF z#1s$=h`AS25gSW=2oNAZfB*pk1PBly&|W|= zpuMRR2@oJafB*pk1PBlyK!8AG0l|RC+c6sf0t5&UAV7cs0RjXF5NIzT7|`C-i3A7` zAV7cs0RjXF5FkJxw18kh==B(m009C72oNAZfB*pk1PC-25DaKe>OcYn2oNAZfB*pk z1PBly5L!SmAoO|+M}PnU0t5&UAV7cs0RjY?3kU`@Cv_kJ0t5&UAV7cs0RjXF5Qr@x z7!Z3urXxUr009C72oNAZfB*pktpx-FT8lc5009C72oNAZfB*pk1PH_y5DbXDAJY*a zK!5-N0t5&UAV7csfz|?o0j))yM}PnU0t5&UAV7cs0RjYq3kU`TUy$(#5FkK+009C7 z2oNAZfIwpb!GOk~jw3*T009C72oNAZfB*pk!36{Zf-lH;1PBlyK!5-N0t5&UAV8q8 zfM7slP{$Dvn!JlAV7cs0RjXF5FkK+0D%?) zf&ncQok4&A0RjXF5FkK+009C75(x+fBwChH2@oJafB*pk1PBlyK!8940l|OjpY zfB*pk1PBlyK!5-N0*M3!0}?IEs00WQAV7cs0RjXF5FkLHfq-B@14KsAl14IOMn0Y0t5&U zAV7cs0RjY03kU|BCUgJ+0t5&UAV7cs0RjXF5XdDU7?5jUrX@gt009C72oNAZfB*pk zX9WZU&IYd1PBlyK!5-N z0t5&UNGKo}kZ@^6CP07y0RjXF5FkK+009Cg1Ox+4;Q1;60t5&UAV7cs0RjXF5XdMX z7?5#mW+p&@009C72oNAZfB*pk#{~ofj@$Vr0RjXF5FkK+009C72oT69AQ+HwYi1@u zfB*pk1PBlyK!5-N0>=de1CHDICIJEj2oNAZfB*pk1PBmFDIge-a&3ktK!5-N0t5&U zAV7cs0Ro2w1OpD!`62-V1PBlyK!5-N0t5&UNGTu~kaBH?CP07y0RjXF5FkK+009Dr z1q1^Q)A=F+0t5&UAV7cs0RjXF5XdPY7?5*srY1mu009C72oNAZfB*pkM+F1}j>`ES z0RjXF5FkK+009C72oT6AAQ+HyZ>Ay z<|aUZ009C72oNAZfB*pk#{>iej=A|30RjXF5FkK+009C72oT6BAQ+H!bLJ*MfB*pk z1PBlyK!5-N0>=ad1CF`*76AeT2oNAZfB*pk1PBmFD2 zka&4UCqRGz0RjXF5FkK+009CA1Ox*Pp!o^`0t5&UAV7cs0RjXF5XdYb7?62;W+y;^ z009C72oNAZfB*pk`vn98_M7dVPi`K!5-N0t5&UAV7cs0Rp=P z1Os-H`2qm~1PBlyK!5-N0t5&UNG%{3ka~TFCqRGz0RjXF5FkK+009EK1q1_jllcMx z0t5&UAV7cs0RjXF5Xdbc7?68^rYAsv009C72oNAZfB*pkdj$jo_KJC)009C72oNAZ zfB*pk1PJ675Ddt@KhqN+K!5-N0t5&UAV7csfxQBP0ei(fPk;ac0t5&UAV7cs0RjY) z3kU`zU!d^`5FkK+009C72oNAZfWS@x!GN7$9w$J6009C72oNAZfB*pk$pr)hk}uHs z1PBlyK!5-N0t5&UAV6TJfMCE*Fpm=;K!5-N0t5&UAV7csf$Rc;0ogZbegXst5FkK+ z009C72oNB!Pe3qWpO>cz5FkK+009C72oNAZfIxNu!GP==G(Q0X1PBlyK!5-N0t5&U z*e4(uu+PiW1PBlyK!5-N0t5&UAV46!fM7uS6}kWc0t5&UAV7cs0RjXF5ZEOk7_f`W z!vqKrAV7cs0RjXF5FkJxy?|gq`W3nW0RjXF5FkK+009C72oTsMAQ-TV%fkc+5FkK+ z009C72oNAZAiscMK>i)N0RaL82oNAZfB*pk1PBn=BOn;CN6WJW2oNAZfB*pk1PBly zKp?+>U_kyIx&Z+K1PBlyK!5-N0t5&U*drhqut&?Y1PBlyK!5-N0t5&UAV8pifM7s@ zCAtCu0t5&UAV7cs0RjXF5ZECg7_bA&qXY;LAV7cs0RjXF5FkLHfPi2?fhD>E0RjXF z5FkK+009C72oTsIAQ-R%%cBGc5FkK+009C72oNAZpn`y4K!q*30|5dA2oNAZfB*pk z1PBn=E+81N-O7^$2oNAZfB*pk1PBlyK%jzvU_gZ}x&r|M1PBlyK!5-N0t5&U*e)O# zu-(d&1PBlyK!5-N0t5&UAV8pmfM7t0HM#@=0t5&UAV7cs0RjXF5ZEjr7_gbjg9Hc= zAV7cs0RjXF5FkLHgn(c`i8ZE2oNAZfB*pk1PBn= zCLkEF&B;>)2oNAZfB*pk1PBlyK%k0%U_g~kx(5LQ1PBlyK!5-N0t5&U*d`ztu+7O+ z1PBlyK!5-N0t5&UAV8pufM7tGRk{cP0t5&UAV7cs0RjXF5ZELj7_f=SLj(vAAV7cs z0RjXF5FkLHjDTQ3nN_+70RjXF5FkK+009C72oTsLAQ-TT$wLGP5FkK+009C72oNAZ zppJlGK%HH>2>}8G2oNAZfB*pk1PBn=A|M#BMaeS+2oNAZfB*pk1PBlyK%kC*U_hN+ zx(NXS1PBlyK!5-N0t5&U*dibputmu;1PBlyK!5-N0t5&UAV8pyfM7tOWx5Ih0t5&U zAV7cs0RjXF5ZE9f7_b4!BLoN#AV7cs0RjXF5FkLHkbq!7p=G)X0RjXF5FkK+009C7 z2oTsHAQ-R#$s+^^5FkK+009C72oNAZppt-KK&5TE3jqQI2oNAZfB*pk1PBngFCZ9j z-^ddL2oNAZfB*pk1PBlyK%kOVAV7cs0RjXF z5FkLHlz?DBsdc&x0RjXF5FkK+009C72oSg{AQ*6$$O8lj5FkK+009C72oNAZpq7AO zK&^ec4FLiK2oNAZfB*pk1PBngCmuvAV7cs0RjXF5FkLHn1EnFv4y%00RjXF5FkK+009C72oSg< zAQ*55$j1Z-5FkK+009C72oNAZpqhYSK(&p!4*>!M2oNAZfB*pk1PBngEg%?h+sCH_ z2oNAZfB*pk1PBlyK%km{U_iBvx(@*Y1PBlyK!5-N0t5&UxGf+UaNEbH1PBlyK!5-N z0t5&UAV8p;fM7tmmAViC0t5&UAV7cs0RjXF5V$EI7;uxvhXe=^AV7cs0RjXF5FkLH zoPc0Jxs|#Q0RjXF5FkK+009C72oSg_AQ*6y$A<(65FkK+009C72oNAZpq_wWK)s#1 z5di`O2oNAZfB*pk1PBngB_J4ZOUGvf2oNAZfB*pk1PBlyK%kz0U_iZ{x)A{a1PBly zK!5-N0t5&UxFsMMa7)K$1PBlyK!5-N0t5&UAV8p?fM7turMeOU0t5&UAV7cs0RjXF z5V#>A7;po}M+68EAV7cs0RjXF5FkLHpnzaN!KJzq0RjXF5FkK+009C72oSg-AQ*51 z$43MR5FkK+009C72oNAZprU|aK*g=P69EDQ2oNAZfB*pk1PBngE+80i-Nq*b2oNAZ zfB*pk1PBlyK%k<4U_iyKx)T8c1PBlyK!5-N0t5&UxGo?VaNWiy1PBlyK!5-N0t5&U zAV8p`fM7t$wYn4m0t5&UAV7cs0RjXF5V$HJ7;u%w2LuQZAV7cs0RjXF5FkLHq<~;R z$+fx^0RjXF5FkK+009C72oSg`AQ*6!#s>rl5FkK+009C72oNAZpr(LeK+V0n6#)VS z2oNAZfB*pk1PBngCLkDaO~&sD5FkK+009C72oNAZfIv+F!GM~3bt?h{2oNAZfB*pk z1PBlya7{ok;F^rz6Cgl<009C72oNAZfB=D_0)hcW7wcLC2oNAZfB*pk1PBlyK;Vji zV89g^za~I{009C72oNAZfB*pkMFj){iZ0f*2oNAZfB*pk1PBlyK!Cs%0l|PPFn&#d z009C72oNAZfB*pk1gZ)M22|awdl4W&fB*pk1PBlyK!5;&%L0M{mtFjp009C72oNAZ zfB*pk1PD|W5DcigS@$A9fB*pk1PBlyK!5-N0+$5@11`JxEdc@q2oNAZfB*pk1PBl) zDfB*pk1PBlyK!5-N0t7A!2nJka@k;^(2oNAZfB*pk1PBlyP*y-NpzLa0 zi~s=w1PBlyK!5-N0t5(L6c7x!$l{j-2oNAZfB*pk1PBlyK%lOGU_jm7x)}ii1PBly zK!5-N0t5&UxFjGLa7o4Q2oNAZfB*pk1PBlyK!8A90l|Q}yLB@H1PBlyK!5-N0t5&U zAaF@QFyNAk-w_}{fB*pk1PBlyK!5;&!UBQ;g_rAU1PBlyK!5-N0t5&UAVA=PfMCD{ z6u%-sfB*pk1PBlyK!5-N0)+(x0}3zK)d&zEK!5-N0t5&UAV7e?1p&c;3n+d?fB*pk z1PBlyK!5-N0t6}x2nJN%uDcN+K!5-N0t5&UAV7csftLb;0WVGbh5!Kq1PBlyK!5-N z0t5(D77z@myj^!AK!5-N0t5&UAV7cs0Rk@t1Or~0_zeL91PBlyK!5-N0t5&UC@mlu zP5FkK+009C72oNAZptyiwK=B2;9svRb2oNAZfB*pk1PBm#CLkE_48)HF z2oNAZfB*pk1PBlyK%lsQU_kK&yB+}o1PBlyK!5-N0t5&UcqSki@C?L{1PBlyK!5-N z0t5&UAV8qHfM7uN4Z9x!0t5&UAV7cs0RjXF5O^ve81U4?PXq`MAV7cs0RjXF5FkLH zx`1Fn^$oip0RjXF5FkK+009C72oQKGAQgu@R62oNAZfB*pk1PBlyK%l&UU_kj5yC4Aq1PBly zK!5-N0t5&Ucp@Me@Pxw;1PBlyK!5-N0t5&UAV8qLfM7uV9lId`0t5&UAV7cs0RjXF z5O^#g81PubzX=c^K!5-N0t5&UAV7dXeF4FM`a5<*0t5&UAV7cs0RjXF5FqeaKrrC3 zhJOz&Lz%*BTNL#omHOLV`}SN{L1( zx=m1#RZwVrM4@sEqEKlFdkI{HL@jX%1ZQMtWF`vr`8{Vd=A4b4$@{$j`u%I+jsO7y z1PBlyK!5-N0t5&o1PlfwY8H|J0RjXF5FkK+009C72rLB*1}rJu5FkK+009C72oNAZ zfB=DnfWd%7%|a3&K!5-N0t5&UAV7csfu(@KfF*?+0t5&UAV7cs0RjXF5FpSHFc{G2 zSxN!~2oNAZfB*pk1PBlyun;g9u#oUhfB*pk1PBlyK!5-N0t6ZY1_K&BOG$tL0RjXF z5FkK+009C776JwX782eG5FkK+009C72oNAZfIvjRU_hj3F$oYLK!5-N0t5&UAV7e? zp@6{vM}YtV0t5&UAV7cs0RjXFv;+(WwEC8o009C72oNAZfB*pk1PB-ma0UnvAV7cs z0RjXF5FkK+Kuo}3K&)_a2@oJafB*pk1PBlyKp-z*Fd%;f01zNRfB*pk1PBlyK!89@ zz+gbEaB&F`AV7cs0RjXF5FkJxFJLere*^#!AV7cs0RjXF5FkK+Kuy44K&^3k2@oJa zfB*pk1PBlyK%g#QFra<{009C72oNAZfB*pk1j+&i1Iq2oPJjRb0t5&UAV7cs z0RlwdzYF30RjXF5FkK+009C7x&j6Ry4_1o zfB*pk1PBlyK!5-N0!;yf0nOf}CP07y0RjXF5FkK+0D-Q6!GLb}k`o|6fB*pk1PBly zK!8A0z+gbMc(Dl(AV7cs0RjXF5FkJxD_}4nTfN`}2oNAZfB*pk1PBly5EU>O5G`J8 z0t5&UAV7cs0RjXF5XcG`49He5H~|6#2oNAZfB*pk1PD|G3oOA{K!5-N0t5&UAV7dXTEJjHx_;pa5FkK+009C7 z2oNAZAShrkAXvJ{1PBlyK!5-N0t5&UAdnU?7?7@Ccmf0n5FkK+009C72oMMg7z_xO zE;0cE1PBlyK!5-N0t5)O1q=qX`o0RjXF5FkK+009C7dIAOmdYwy5fB*pk1PBly zK!5-N0&M|<0qy>!CqRGz0RjXF5FkK+0D+!>!GK=p5)&XmfB*pk1PBlyK!8A8z+gc9 z0Ekb3009C72oNAZfB*pkIRS$Kxyl75K!5-N0t5&UAV7csfw+LdfcOCrp8x>@1PBly zK!5-N0t9jb1_N@H3rv6j0RjXF5FkK+009DZ0fPbc6CghU0t5&UAV7cs0RjXF)C3F$ z)EbwU009C72oNAZfB*pk1nL3?1L`M0egXst5FkK+009C72oR_V7!0U2E-wKB1PBly zK!5-N0t5);1q=q{j{pDy1PBlyK!5-N0t5&UhzS@Bh!rj_0RjXF5FkK+009C72;>C} z2IP+b00IOE5FkK+009C72oQ(~7z~INE-nEA1PBlyK!5-N0t5&UFc{zr5FkK+009C7 z2oNAZfB=D(fWd%P-_jBwK!5-N0t5&UAV7cs0fPa~009C72oNAZfB*pk1PBml2^b7$ z^(`#{0t5&UAV7cs0RjXF5O`xSz#$+&fB*pk1PBlyK!5-N0xbc90j<8JB|v}x0RjXF z5FkK+009C91DpW@1PBlyK!5-N0t5&UAkY#p7|`llS^@+J5FkK+009C72oNA(Fu)lg zK!5-N0t5&UAV7cs0Rk}rg8{L^#U((1009C72oNAZfB=EKfWd(L5dc7d009C72oNAZ zfB*pkF#&@CvBJeAK!5-N0t5&UAV7cs0Rr!4v&~_=F8_S{;uQ`81PBlyK!5-N0t5&U zAV6U90tN#nU$KA$2oNAZfB*pk1PBlyKww3{V89B82Lc2L5FkK+009C72oNAJc>#j~ zldo7n0t5&UAV7cs0RjXF5FoHBU@&0S!xI4l1PBlyK!5-N0t5&Un7V+$fT=eu9{~ac z2oNAZfB*pk1PBmV6)+gE>fwn10RjXF5FkK+009C72uxkTV8GNHmX81d0t5&UAV7cs z0RjXFtO*zlSOf7$fB*pk1PBlyK!5-N0t6;5U@&0f1&c?3009C72oNAZfB*pk1l9x$ z2CRX2BtU=w0RjXF5FkK+009CM7cdww@q)!8K!5-N0t5&UAV7cs0Rrm+2eao#hG97I z?8o=n%SW^E)|D0bvU%<5#^%|rv!lSV;q#@}*KeGDe*V|twLR=CWe%RsZ*T71-#foC zoEo;rhmG-d@P2px`(geuJ6rSrer)(Ue$2)Fk0<9JdS!eaA76{>$;P+wFYfN&d~oO1 kxqA=)|J!#z?Ed-o3;+K1?W6N=*cyL6jqhh}KOX=64dN&>ng9R* From 00e30b21e33742f703040fbacaa0c04963079d59 Mon Sep 17 00:00:00 2001 From: John Sirois Date: Mon, 6 May 2024 10:46:19 -0500 Subject: [PATCH 8/9] Fix 80 cols and make generated test data reproducible, with added tests of test. --- Lib/test/test_zipimport.py | 38 +++++++++++++----- .../sparse-zip64-c0-0x000000000.part | Bin 4096 -> 4096 bytes .../sparse-zip64-c0-0x100000000.part | Bin 4096 -> 4096 bytes .../sparse-zip64-c0-0x200000000.part | Bin 546 -> 546 bytes 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index 323818ff3d362d..e9c3218d2bb39e 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -833,7 +833,7 @@ def testZip64LargeFile(self): # bullet. The resulting zip file is ~8MB of non-null data; so the sparse # trick doesn't work and would result in that full ~8MB zip data file # being checked in to source control. - parts_glob = f"sparse-zip64-c{int(self.compression)}-0x*.part" + parts_glob = f"sparse-zip64-c{self.compression:d}-0x*.part" full_parts_glob = os.path.join(TEST_DATA_DIR, parts_glob) pre_built_zip_parts = glob.glob(full_parts_glob) @@ -848,11 +848,19 @@ def testZip64LargeFile(self): with open(os_helper.TESTFN, "wb") as f: f.write(b"data") f.write(os.linesep.encode()) - f.seek(0xFFFFFFFF, os.SEEK_CUR) + f.seek(0xffff_ffff, os.SEEK_CUR) f.write(os.linesep.encode()) - with ZipFile(TEMP_ZIP, "w", compression=self.compression) as z: + os.utime(os_helper.TESTFN, (0.0, 0.0)) + with ZipFile( + TEMP_ZIP, + "w", + compression=self.compression, + strict_timestamps=False + ) as z: z.write(os_helper.TESTFN, "data1") - z.writestr("module.py", test_src) + z.writestr( + ZipInfo("module.py", (1980, 1, 1, 0, 0, 0)), test_src + ) z.write(os_helper.TESTFN, "data2") # This "works" but relies on the zip format having a non-empty @@ -872,7 +880,12 @@ def make_sparse_zip_parts(name): if not part: part_fullname = os.path.join( TEST_DATA_DIR, - "sparse-zip64-c%d-0x%09x.part" % (self.compression, offset) + f"sparse-zip64-c{self.compression:d}-" + f"{offset:#011x}.part", + ) + os.makedirs( + os.path.dirname(part_fullname), + exist_ok=True ) part = open(part_fullname, "wb") print("Created", part_fullname) @@ -903,11 +916,18 @@ def extract_offset(name): # Confirm that the reconstructed zip file works and looks right. with ZipFile(TEMP_ZIP, "r") as z: self.assertEqual( - z.read("module.py"), test_src.encode(), - msg=f"Recreate {full_parts_glob}, unexpected contents." + z.getinfo("module.py").date_time, (1980, 1, 1, 0, 0, 0) + ) + self.assertEqual( + z.read("module.py"), test_src.encode(), + msg=f"Recreate {full_parts_glob}, unexpected contents." ) - self.assertGreater(z.getinfo("data1").file_size, 0xffff_ffff) - self.assertGreater(z.getinfo("data2").file_size, 0xffff_ffff) + def assertDataEntry(name): + zinfo = z.getinfo(name) + self.assertEqual(zinfo.date_time, (1980, 1, 1, 0, 0, 0)) + self.assertGreater(zinfo.file_size, 0xffff_ffff) + assertDataEntry("data1") + assertDataEntry("data2") self.doTestWithPreBuiltZip(".py", "module") diff --git a/Lib/test/zipimport_data/sparse-zip64-c0-0x000000000.part b/Lib/test/zipimport_data/sparse-zip64-c0-0x000000000.part index 0bd6df5fc70e151c39876a68605a5acee8bad474..c6beae8e2552d6a7be5c70df6feeb42230270912 100644 GIT binary patch delta 23 ZcmZorXi(q_@MdPwWq<%hhK+om_yI441OEU3 delta 23 ccmZorXi(q_@MdPwWdMP1R!br_@_ph506mok3IG5A diff --git a/Lib/test/zipimport_data/sparse-zip64-c0-0x100000000.part b/Lib/test/zipimport_data/sparse-zip64-c0-0x100000000.part index 844a68ef5426e54f9a94f01f6971aa0dbc434e09..74ab03b4648948b5a040716f2d0d1dcd6d5f2d8e 100644 GIT binary patch delta 23 bcmZorXi%8o#=^j$$S~0>8%%H9>CO)TL8Ap{ delta 23 fcmZorXi%8o#=>a5Bx0ghHp@4wB@r8Uy7L17UfKwW diff --git a/Lib/test/zipimport_data/sparse-zip64-c0-0x200000000.part b/Lib/test/zipimport_data/sparse-zip64-c0-0x200000000.part index 3f608fa18747835cd1000d7a18a70671f7c44b15..9769a404f675d4d0b38da2a1f8f66cb730d9e3c2 100644 GIT binary patch delta 64 zcmZ3)vWR8EXITaYMTRKVcEkTrz{()P00T=V3ovT2fK*JjW3-1b8W|-RmrS0;*Z}~# C0urkL delta 64 zcmZ3)vWR8EXW4I7OCq9F+YSFi0V{(D0}O1LEWoJ6!f3rDVzM2hJqt+b Date: Tue, 7 May 2024 08:35:25 +0200 Subject: [PATCH 9/9] Add test/zipimport_data to Makefile --- Makefile.pre.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 88ec2009fbfffe..74a438b015a97d 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -2483,7 +2483,8 @@ TESTSUBDIRS= idlelib/idle_test \ test/typinganndata \ test/wheeldata \ test/xmltestdata \ - test/xmltestdata/c14n-20 + test/xmltestdata/c14n-20 \ + test/zipimport_data COMPILEALL_OPTS=-j0