pax_global_header00006660000000000000000000000064133170263200014507gustar00rootroot0000000000000052 comment=f889d7e51c799d7a7176753b3ed662aeeb133e2d libzc-0.4.1/000077500000000000000000000000001331702632000126145ustar00rootroot00000000000000libzc-0.4.1/.gitignore000066400000000000000000000007041331702632000146050ustar00rootroot00000000000000*~* *.o Makefile.in Makefile aclocal.m4 config.h.in config.h config.log config.status libtool stamp-h1 configure autom4te.cache build-aux .dirstamp valgrind.supp *.log *.trs lib/test_key2reduce compile config.guess config.sub depcomp install-sh ltmain.sh missing test-driver /valgrind_run.txt tests/.deps tests/.libs tests/basic tests/bruteforce tests/dictionary tests/file tests/plaintext tests/plaintext_password tests/pwstream tests/reduce debtest/ libzc-0.4.1/.travis.yml000066400000000000000000000030161331702632000147250ustar00rootroot00000000000000language: c os: - linux compiler: - gcc - clang env: global: # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created # via the "travis encrypt" command using the project repo's public key - secure: "EwBWdt7JYKPJWH3pplJ/8Llhkd3t9OkTwwkEmcg9tmg4y6TovpXnNXKK0eUIhCqn4RdaWFYPcGhSlDWwPExW4zh6gwfgm7ejKeRvoffQG0cIxF84AY4oO5b4VDvPKf15AaXqWGLmuZCD06b7vhcjvqt6vhfeMZfBQxwbTysKqDd/2w1en4QWsSCAPrlNj/MLj2lIMn2CkPBd0ovPnAdMzONpvRJuBi5fBW5HfD6dJOPeL4dkO4/b4x4s6km6ver5hIXamAJbr7PI2+1bY/0jK08/uYQM7NjpWlkrJNuuD/OjvZd6NtD8gqK1wgF4Wn7/mBI60PuiTRuhql/IXKNlKGeVN/yPbj4QN5Qe3arpvXw+OTTVsjAxqMe52wZoqgQctI/pFhpQAj2lJj89stybQMc0Mpn3H2ra9x2D5v5OMSrjo6cAGuZ5Sx6+2PZYBPTKZsBDDJ2F6C/su+5KCYxTAJVovpafG9XybTcN716mRqwbCMDCFjix65qLNNMWS3Lf1D1ynLe1aNDrpKlfoCif7ZNHXm9hyvYd5t6S/ZTrMnSIF0tkW3fYSmrziNtknZ4i4I2RfC2Nx1ksMscOzfXdlNeGeUwMtCVX8QDnueUtMjGTSgh548T1iNfWR+oE4uyFcGlpzLFlWWH+BRwBCaST/cjTLW4ShmYgkxCLnqJm+7g=" before_install: - echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca- addons: apt: packages: - check coverity_scan: project: name: "mferland/libzc" description: "Build submitted via Travis CI" notification_email: marc.ferland@gmail.com build_command_prepend: "./autogen.sh; rm -rf build; mkdir build; cd build; ../configure" build_command: "make -j 4" branch_pattern: coverity_scan script: - ./autogen.sh - rm -rf build - mkdir build - cd build - ../configure - make libzc-0.4.1/AUTHORS000066400000000000000000000005561331702632000136720ustar00rootroot00000000000000 Authors of libzc ================ libzc is developed and maintained by Marc Ferland . Parts of this software were inspired by fcrackzip (by Marc Lehmann) and pkcrack (by Peter Conrad). The initial plaintext attack algorithm was devised by Eli Biham and Paul C. Kocher in their paper "A Known Plaintext Attack on the PKZIP Stream Cipher". libzc-0.4.1/COPYING000066400000000000000000001045131331702632000136530ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . libzc-0.4.1/ChangeLog000066400000000000000000000001101331702632000143560ustar00rootroot00000000000000See the log from the git repo: http://github.com/mferland/libzc.git libzc-0.4.1/INSTALL000066400000000000000000000366101331702632000136530ustar00rootroot00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell command `./configure && make && make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. libzc-0.4.1/Makefile.am000066400000000000000000000014051331702632000146500ustar00rootroot00000000000000# Copyright (C) 2012-2018 Marc Ferland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . if USE_CHECK MAYBE_TESTS = tests endif SUBDIRS = lib yazc $(MAYBE_TESTS) ACLOCAL_AMFLAGS = -I m4 libzc-0.4.1/NEWS000066400000000000000000000002241331702632000133110ustar00rootroot00000000000000libzc Release Notes =================== 0.1.0 (2015-05-09) * First release featuring bruteforce, dictionary and plaintext attack modes. libzc-0.4.1/README000077700000000000000000000000001331702632000147462README.mdustar00rootroot00000000000000libzc-0.4.1/README.md000066400000000000000000000040111331702632000140670ustar00rootroot00000000000000 Coverity Scan Build Status Build Status What is it? =========== The libzc library is a simple zip cracking library. It also comes with a command line tool called 'yazc' (Yet Another Zip Cracker). How to install it? ================== Just clone, configure, compile and install. git clone https://github.com/mferland/libzc.git cd libzc ./autogen.sh ./configure CFLAGS='-Ofast -march=native -mtune=native' make sudo make install How to use it? ============== There are currently 3 attack modes available: Bruteforce ---------- This mode tries all possible passwords from the given character set. It supports multi-threading. Example: Try all passwords in [a-z0-9] up to 8 characters with 4 threads: yazc bruteforce -a -n -l8 -t4 archive.zip Dictionary ---------- This mode tries all passwords from the given dictionary file. If no password file is given as argument it reads from stdin. Examples: Try all password from words.dict: cat words.dict | yazc dictionary archive.zip Use John The Ripper to generate more passwords: john --wordlist=words.dict --rules --stdout | yazc dictionary archive.zip Plaintext --------- This mode uses a known vulnerability in the pkzip stream cipher to find the internal representation of the encryption key. Once the internal representation of the key has been found, we try to find the actual (or an equivalent) password. Example: Try to find archive.zip password by using plain.bin using 8 threads: yazc plaintext -t8 plain.bin:100:650 archive.zip:112:662:64 TODO ---- - Support for GPU bruteforce cracking. - Add basic mangling rules to dictionary attack. - Review library api, should be much simpler. - Optionally decrypt the archive (plaintext). - Provide a way to benchmark libzc. libzc-0.4.1/autogen.sh000077500000000000000000000013141331702632000146140ustar00rootroot00000000000000#!/bin/sh # Copyright (C) 2012-2018 Marc Ferland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . autoreconf --install exit 0 libzc-0.4.1/bench/000077500000000000000000000000001331702632000136735ustar00rootroot00000000000000libzc-0.4.1/bench/bruteforce.gnu000066400000000000000000000007641331702632000165550ustar00rootroot00000000000000set title "bruteforce (noradi.zip)" set xrange [] reverse #set yrange [1:25] set logscale y 2 set ytics add ("18.2" 18.2) set grid y set xlabel 'version' set ylabel 'time (s)' set style data histogram set style histogram cluster gap 1 set style fill solid border -1 set xtic rotate by -45 scale 0 set key autotitle columnhead outside bottom center set terminal png enhanced size 800,600 plot 'results.txt' using 2:xticlabel(1), '' using 3, '' using 4, 18.2 title "fcrackzip on Core i7 950 @ 3.07GHz" libzc-0.4.1/bench/log.png000066400000000000000000000227171331702632000151730ustar00rootroot00000000000000‰PNG  IHDR X­¨rBDPLTEÿÿÿæŸV´éžsÃÃç§§ßßߟŸŸ???¿¿¿___¾¾¾ ÿ |ÿ@ÍÀ°ÁÿÁ ¶ÍðÿðÍ·žÿÿÀÿÿ€ÿÀÀÿ pÿ `ÿ @ÿ€@€€€`ÿ€`À€@€€@€€Uk/P@Ý Ý”Óî‚îÿ¥ € õõܸ† ½·kðæŒé–zú€rÿEð€€ÿPÿ“ÎÑÿÿÿÿ‡ÎëÍ€p‹ÿ.‹W"‹"ÿdÿÿׯîîÿ¶ÁîÝ‚àÿÿðUð­Øæîð22ÿÿÿåååÌÌÌÀÀÀ³³³™™™fffMMM333@àÐÿÿ¥**ÿÔÿ€ÿ@€‹0`€À€ÿ€@ÿÀ AiáÈÈÀ@îîÀÿ€ÿÀÿ   ÿÿÿÉ{`.tRNS@æØf pHYsÄÄ•+ IDATxœím𣬶@ÏǽŠ2Žw>N£uþÿ€(˜ôˆ‰Ä¬õ<]•Šl±ªY„­ÿšà¯üëê¨@@@@@@@@@@÷Ñ ÇeúnLÝÒiå†îIÙà ­Rky'dßÖ]“¸7Óî“ öýîÍðqaAÞÇ_¢ ßV:uoc›XðФ6ù¤òFºaèFÕÌM[©©1 Ü4Ín•iÅ£ñG£i­æ'=M®¤ý©Ö2ÛªÇV=D^J6j4•nÞõ£¡qoøãIw ätÝÐôšæFÛo‚ØË0¶M;KKÖ];œ_Ù’ºëçmýVÆbÌ™··ê"”jæ’óþÕ:tá¤i\€yÃÛ$ ïôÔىƜ1v‚Øvï?ê÷ÓüAoJ6þó}-ãvf~µÛGá˜÷äBU-¸·u,Hg2oøãa’‚¼nã™ ŽÞ6ÜÖJ` 8œ[‹¤uÛ㈩WóÀf>—¸·ã˼ƒÛyÂd€ ï#:ƒØÆ=lgÆ0Ég¥ÌäÃWA∦3#ïçgft¯ÌœA @÷a;7f ² ¢×1ˆ¿Ž¤t4¢üOÓþZ“ƒ,‚Ä®Ö-Wʦh®—ó‘yÃc ä}¬W±l‹Ÿ?æ[;mÞiÓDÛ¦1SÚJO“½nå®I “»BeFÖk‹»ŠµG̺4½²cóð*–yc>{¹“yƒ«X ÈûXçA¬ }7jÛ·iý<ˆnüG½Ÿñp%ýO¾Œepó Ó:Ð"fñTßÏbDó FÁcÌ̃€ _Bóz«ö³Ž A2@oáõƒ„µX È× ô‹;XÄ`5o €  €  €  €  €  €  € ¥‚¬wý‹nÿp3 Ñ]Û·æ†z4/0nJ¡ ˽c—$Í]2়2Y½Hr†›R,HÓþ¦ÜFnK± j\Gíj ÀÍx¡‹eo\6ùۇܑWÆ Ë-Ìý¾†·bï÷gï•<<é_1f‡¯á-‚¸ÛˆöFüOÆ_Ã{Î ÊOvº7dÕ Poêb-ì—~\l‚À×ðA^ª @A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@A@àLAô8˜oC7vÃúfüSJõpž }§¬ ºë›¾ÓË»zlûvŒ AøÎ¤m'+‚ý2tË»s&§N€z8u òDËׂ ð5œ/ÈÐõsw+êT)•S'@=œ/È<ìG¾ÝŽ}Nõp¾ ñ }2~´YuÔÃé‚4V‡vlü›ÃÞiü7À—pº ½íOõk¯jØõ¯&Î ðE¼û ²$Ô Pç Òôý¨û~Rv ¢¦ùÅün7¿5“S'@=œ'ˆ-ͺ¸ÄÒ»7ãÓ‚À×ÀbE@w ²,}Ÿ5†“†)uÔÃ{ñKß§Æ\ÅÚ‚ ð5¼G¿ôÝ­êÝ]åEøÞ6q‚ì“ Sꨇ7 2¶z·´÷¸N€zx¯ ÍØµM˾–w ¢§hioJõðnAÌÊÅ~Ÿ0å˜þü™øÇ¿ZÿùfúNAÜ×AŠw ðaÞ,ˆ6Ùè»{6 |ïÄ/}ŸÌ·ým±¾‡÷².}ŸzõpcEïÅŠ €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  ðnA†n솼:êáÍ‚è®oúNgÕ Pod4g¡Ëª @àÍ‚ ]?õûA‚À×ðîAºÇQçÕ P ÒÞ+H3¶ó×vlâ:ÓŸ?ÿøWë?ßLß)H?öë×@×v ð9.9ƒ¼¶S€Ïñæ1ˆ²c•U'@=°Ô@€ÅŠ €  €  €  €  ,H«ºq;Õ¾½N€zHdG5´m;¨qÜ/­:»N€zHDuÛ‰£Ý/Î=»N€zHDGoê‡b§Ö Péƒt“ôÔ·Í_‹žV'@=$ ÒÍÔÎÃô^(}Nõ,ˆšÇ枆W ÇuÔC² ó ÄœDšZ7‚À×#ˆ¹…(‚ÀO‘ÑŲ·mébÁ/‘1H;ÓËb&~‰ŒµXæ osÂE,ï‰B–š°X@ {¹ûðúbùYƘš}¼¼™„)8“ñ¿!9íüã>^ÞŒ p&rBp_ä„:á¾ È uÂ}¹· §L£× ÷å΂ Ý86“:!¥A~– 2ŒƒÉÑ:»ŠÜ:á¾ÜX³ØÄ$LuÙUäÖ ÷寂˜'Õ’Q¯qcA–3HËʹ± v Ò·¬-A~– bôŽ',å=®îË™¦¾?g"A~–{ rò³ÜXÞæƒ”¬¨Ï­îËé:“Q8“]Enp_n,ÈxÆm«“ê„ûrcAÔI+ë„ûrcAÕö–ì*rëte^L%†*¹± íym5Iÿ„ ÈM¸± îKv¹uº2rGn,ȇérKn,ˆ>áúnZ® ‚Ü‘ Òvj°dW‘[§+ƒ w䯂ŒÝBv¹uº2rGn,ȉ ÈÏ‚ 'ÔéÊ È¹« ºŸ´'»ŠÜ:]¹#wDõ“òdW‘[§+ƒ w䮂œ ‚ü,rB®Œ ë´¾– ²t­š ºXã?!òEÜVaÝ4¡ª`±"‚|-÷Dù‰Âe Bÿ«fn+È40ƒžX§+S,Héèþ²§àý7äD*äã?‚œP§+ƒ wAN¨Ó•A;‚ Oèöu ÈÏ‚ ãVùYäfä5´ ²§í&‚ìhÆA`Av(=!¬ HLÛ5ÏYÖdüù3ýõß¾ÕEÛv‚D±»@©Žøß>05îQô:îßCsMÝ&×¹ Ì9Ö”¥C/ ¢—Jâ{qùY8ƒÄØ{•¶û›2"ÈÏ‚ O` y‚€AN¨Ó•y‡ £”ºñùÀAN¨Ó•y‹ ÿ‘ŸüAä„:]¹#rB® ‚Ü9¡NWAP§+ƒ wAN¨Ó•A;‚ 'ÔéÊ ÈAête~@œ#Aête~A!ð¦ È uº2rGä„:]¹#rB® ‚Ü9¡NWAP§+ƒ wAN¨Ó•A;‚ 'ÔéÊ ÈAêteäŽ È uº2rGä„:]¹#rB® ‚Ü9¡NWæ×¹çJF9¡NWæç‘~ɯAN¨Ó•A¹4ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›ä¢@¹:ÐÇË›_dèÆnȫӕA¹4ÐÇË›_Dmߎ;Cä8A®ôñòæW±gÝeÕéÊ ‚\èãåͧŒA†ýÿ}B ‚ ȵ>^Þ|Š JeÕéÊ ‚\èãåÍgÒŽ}V® ‚ 2Æ| 0y¤Û¼:])äã ÈÃþ£júógúë¿}㉶íþ'£Ø]`¼m×\£:÷Ѷ‡vì÷¡‡Ûö©¿ã®ÊQú[ýŽuLŽ{$½Îô:öÍ55v˜\ç.0çXSΤ¯ÏƒìûWg”@Î Wúxyó«‚<Œ?êteA. ôñòæ—çAtoȪӕA¹4ÐÇË›_¤_úq±!rˆ Wúxy3‹/ D«}¼¼A. ü&A2&Pä„:]ùAÒä„:]©¸îškñ©ç>^ÞŒ ÖÝ΋w͵æ@/oF‹ënçÅ’‚ÖÝ΋$9¬»"H rXw;/Dä8°îv^ˆ ) Èq`Ýí¼8AR@ãÀºÛyq ‚¤€ Çu·óâ@IAŽënçÅ’‚ÖÝ΋$9¬»"H rXw;/Dä8°îv^ˆ ) Èq`Ýí¼8AR@ãÀºÛyq ‚¤€ Çu·óâ@IAŽënçÅ’‚ÖÝ΋$9¬»"H rXw;/Dä8°îv^ˆ ) Èq`Ýí¼8AR@ãÀºÛyq ‚¤€ Çu·óâ@IAŽënçÅ’‚ÖÝ΋$9¬»"H rXw;/Dä8°îv^ˆ ) Èq`Ýí¼8AR@ãÀºÛyqà'Úùî Rø½‚ˆ©Kñ¤æš#HügEÒÀ/ä{ÌŠµ¼¹"Ⱦ ‚Ô(‚ 'ƒ Dz«Ave¤¦@99üyAÊG÷‚ ¿ Hi ‚ ‚ ‚T(‚ 'ƒ Ç‚ r©)PANAŽAä2RS ‚œ ‚"‚Èe¤¦@99D‘Ë HM"r2rˆ "—AšEädä8AD.ƒ 5Š ÈÉ Èq ‚ ˆ\Aj A“Aã@A¹ ‚Ô(‚ 'ƒ Ç‚ r©)PANAŽAä2RU tÓRy=™uº2Ro`Æÿ‚ÈôBZÛ9‚LǼY¶¤ÖvŽ Ó1ïƒ H­íA¦c¤Î@A9 Aê D¹(A~Y€¯áA*HÓ÷£îûSŽ :^D¹~\sÊÁÔÆ[+Ü… ùx­-D5í©ÇRŸ O?&Ñ´CaG¯/­±ëŠj,ïGXJm‚4³EíµÇn,üD/3¤Ø®ôYI`1• b]I{mGm ÿF%5–ú1é¸" ,¦2A”= ´×NÙp]Xo~M7*]ò_Ò”žçÊ# ,§2Aš¡Óó·>÷—mܹCé²j[{:˜ýh›¡äŒ¥ŒÊMÉ©®8’Àr*Ä´<]e›j_ô)Òª±Óm®V(­²k³ÝÀaì̧@^Å‘¾@E‚ô®—Ó¦,ÁŒ™»:æ¤7ý¬Ü¿OÛÚÈÕ Áæó‡ý¬º¬º ³ÿs•ƒù’yQ¡8’À¨HÅŒ|Aìécî$]“û÷éç?ªõb>%¨äÀÙí¾ëÌCÿ{e®' ÙŠ# |…ŠYÆö4÷ږݨ®Ïýû´£ZNæHú…ÂÖÍ-ª±iÚ¼3Ö¬±©r¹ŒÖˆ$ð*dn®­ùHïÛq³.jϳ]“ý÷Ö’ÚDÉCŠÆø¤ì¡vY‡:(SzXNV9c˜âH_¡&A&g†= ´YW•LÏj(ÿû´sÿJOYCŠÙGw¨S桚å¢rþ¥ÉâH ©J©iû¹‡dÏüÓdø÷ÉZ^ÕÎÃôv‹ÌßÓ—WõCkÍKe*Ë‘D/"ªì1~q$…Ô%ˆA©f>þ}²&þl3Ÿ½4~d͇¸Ùɹ£6wîÆ.ýc«s§ó“Å‘RŸ óçÿlHS0™þ}2 ñúìå#þTþÿ]×6mú‰]-Cüüž@q$…Ô'ˆù$žêr:0=™Dâ¿O†!ö³ßh’»¼j9i,×ÂÒG0í\WÛ•|ÐGXH}‚Ø1¯¹âÚ´ZÍCáälÅÝß'ÝÖ^’êò—Wµ;YÊLˆ´é]_s5b«)çRñ.2}v“À2êÄLöÌvèÎ.2N˜Ñß'gyÕ0Î&öË«æûÉÖ£2Æ÷†>865¹EfÌnXD…‚L½¦ÖÍpçø1mŸÜåUÍÐ6EË«š~VÊ„õù d6s'òY‘fS£ –Ö­>+Z}¸,¯Ê¢xy•Ò¶N«INgIG}Ç/ãÈôÙM ¨VcÈâG^gr]^5™ÖþþåUîz´»â›ÓY¢!’Îðrl†¼Hó©WÓÁ_fÆs:“Ûòª¹ÑŽéifÛòª¬ƒt§ñÞ_(])×;=3°WÞº®r# Ì¢bA†qkkéÍn[^•yû¿¼Êט|}yˆ—Žåt–úA+¥µVcnWÀÍõÎ=ã˜G½‚Ìý«`ÁHAgrö#ëë–WMSöõe³@f#ã¬ÞŒ†Aë!È´ÍnxZà*Ä‚v&Uv_Çž4J®/G;É9«åì:–ÙÍüƒüâÀä?VqÔ+ˆ¥¼3iý(˜+*»¾w–ÒëÜ’‘ÙÆ3ÿé‘»Àôc3.ØíjLg˜ÞeÞ×øÂ„aÝ‚ÄÉœ_S¹«Ä£=g®íõ×—3Ú@ÔY23òé˜Í¼tÈpè“™òŽ5̺`—›àó,0ëŽiQ`ÞJÒµ ²­#Ìú5?´]Òæ~ÖëËym š ê’0[`n:äæofd,~ƱFå5f\Ù3ö™+IwÔ-ÈÖ™Ìü5͹ÏÖ0ß3Ï!K=9m 2$gü3÷èlá¢tÑâÈíø2ÇjÑõˆœ+'ËuðÌ k`ÁÓl`öJÒ• â;“%¿æ’­ag³þ°áõåô6’ÙæìäoQ:dqä6ß\r¬ëÿ&°èÈRcþÓl`ÁJÒ˜ÊY:“%¿æò῜G2 ‰®/çÌáú¦–{ýÌLþ–¥‹G®óÍ%ÇêÉ»`7^Ù¦Æ3g5l`ÑJÒÚqÉ’_Ó5˜uü‘nHØAÎkîÃuisy÷;¹ ×\g.ŸÝ,]`W~Ǵ╤+Õ b~ÍŒf7tý<²×þÇœ^Vi0k$}›Ë[Äþù,ÜðXsxav3\`—~ËAiX~÷+QÚ|µ¿fN³ëç®ý9ù!Åm`îemm.ë’Ôç³p£cÍ ,ˆZX/€äÜ1-“p%i_!Høkf]]ô~俇lm sª1ßO9ãæ ²pwÇšXnHY¥þŽiÙÑJÒ"¾Bݯ™ÑìÜ×üüß²§ãÆ“1ÄÓEs(Ž,nèå†Ä ìÒɾ—àVaa ç+Ùýšyë²Âüœû©hª1lLñ] θÂwð%‚LÅW–‚ü<æ6N5¦óÒe¨Œ¯ä‚fO5¦óÒe¨‹¯ä‚f·›jLCîÃ÷rA³ÛM5fbÈ]ø"A.hvÑTcr¾IKzYº,ðw.óÜœ¯ä‚f÷ž‡oÃ×ð]‚|@@@@@@oBé«àç@o¢'ËäÓ €‚T…½¹½1ÞÐæ®»c«æŸz5Žª_ºXf‹ù>¶úµ{¢ARö(FŒa4Ï ¦Ù’ÙQ7¹ƒ·Òæ¶ymÓCÆùEÑ-Ý!©Š~\î=loE?ëboænÞ¼<Âm™ËÙ»>¾pcHAêblíYÄÝ’kÖÅ=³¡ëÜÝÀ”^·ôÖ!y7RZÛ~T?:–‡š4fÜÑZAܳ.Ì-»Ì]»^yò¤€ uÑv¶áÏgˆÆ0­OýiÌrTtA€ u1Ÿl¯É?fÆ ÒôË[*ƒ È@ÊPîŽÙC×6VN~lëXýr A>‚Tưtªìl‡ïbµÝnļ‹ ŸA@A@Aäuze®8¬«Uf c™wï,³ã“²oêÉ^¬êÂÛÉûëU–ec¸“vu”{š¢ßíÌ0&ݹ~øñåò2èÛ~n«òó¿M®Soð-nÛÞ>ðDióvc®Ùš¼[³Õݼ_ÿ€’uã¶“¹ÊùÕh_ ²NŸ¸ÊIA^¥õ‰›îÂ9rÓ¢×ÏõnYÁ•ô?ÇͦåqBÉ 9dŒâ‚$‚ ¯¦dl¹L¦©F¥}÷Ý-a7ëJ|™Æ¯àv¯»']ÚH`C ˆ[çø k$ˆ™wÜ®ÜÑ®‡ÛhÿBÍß矮ï/£¿bµ È«]« —ièל'‡Òö[ãG ^“סlƒì—uºASlzÿÔ¹h£ýÖ„gÕÙž—mèMó,j˜]裓՚på’²ÖÃUªq¹y§ÍÐukºVükÿ“‚ü,A; Öš†ºëÔhûmë±,…ûùL`#zÉíˆÛýè‹6Úô»‚µ~Ò{ÒË•‹D/»uQ‡ë*SÝš® DРã\¦>î1)m¿mW©ì'v·^Ò›'‚Ìñ˸:Úhwâ^›fßíÇ Ý“¡H Ò¶ÁÚ”5w È˹xɹMA²ÈÈ¯Ý ¢†ía7ÃÓDÛg]¬iwªš7Y9·ÑÎ_Ϲe©  IDAT»ñt÷—Hžrû$‡ÒŒ[Óm_É¿X“:¶tÙ„?‚$هݫŸrûŸä'(͸mL[l;½½XÓ·„BÝéð.ZnG[’ìCŠîÕO¹EØSšqë2˜ZÓ¡Z^<dþ lØÛ¸zÙ_iÆíéO¹Ex 0ãÖµåÞw‹ÂDÛ¨‹5=<*3H’v‘W?åAàÂŒÛí3zMn}>HG!q’ì´‹¼ú)·fܺ1˜ÛÅ­/Ö¼ÙõÅÃåAà …·½¿æ»¾øËR“ð®@ÑSnŸ= —§Ü¾@@@@2úîèÒþîlÛú“ã}'¦õ6ñ °É/™z– žze·†»ÉJâý ¤ ý˜Ú´c/HÐâWÒÓzmȺB}[—>ò$;w=ê ‰wݺí&+‰÷7@2”>*±$•Œ´^WÀÆ™ý˜•’x×­fS^ïo€ E(»zbéÓØ”ÕíæéË».ý¯uËÈŸ‡;oÜþ–µ»$¿Ú]‡Ù€Ïë5»s%–7Ü2_“àñ˜±¬i‰·ÚÝ<6÷ö HJ»$ó@›²º&ªúwçfÚ˜¦ê3`MD× ÁŠÁ k·Ý²dî•×kv7ùf¾½2‹« »±%ñF[í·ìÇæþR†Ò[{Õ³wg–¾å&=Ú2mk΃¬]½=â3l¥R^¯rû:PKáþÉtƒã^“x£­în+¹Íý¤ ¥·ì£í3M3šŒ ¾ÿîNs„Ëåè×ð0çê™ R^¯ÙÝŒ@–».t¾úèº!ýªm°Õî¦à±¹÷AÊPzË>ryQ¢êdo­ã°÷K„ødí¶ÓnoÓ¾ÄC^¯ÙÝn€an˜²î&z€nÄR$Üê_'ñ®ü;Ä?k} HjwÙ%ªNæC×%?ù Ø9â¯gP ·/åõ*»W½ÿdo»-öq&ñ†[u|ÉJHâý9¤ ¥—ÜiZZº¼;Ÿ-ì#muÐ'²=•'cP-­· J<äõšÝ-Æ-´ý´Ëö]³s'¿ë0‰7Ø –“x)Ciw©]ú?[¢ª×t§t׬°&bËg톂i½R^¯ÙÝþ’Wߘ¦ü,;×uÄnõ»ÉJâý ¤ ¥§u^Â6¯5QÕ¿k/ñvzÍ€5OæAü©!¸½O°Ôäïy½öâ¸î\fì³ì\G”Ä<^wÝMVïO€ Ÿ¤tv.A> ‚|òIäë@@@@ø¨RPÇ'[ðuIEND®B`‚libzc-0.4.1/bench/results.txt000066400000000000000000000006261331702632000161410ustar00rootroot00000000000000version "Core i7 950 @ 3.07GHz - 8 threads" "Core i5 4250U @ 1.30GHz - 3 threads" "Core i5 6600K @ 3.50GHz - 8 threads" v0.3.6 1.862 6.089 1.395 v0.3.5 1.864 6.117 1.327 v0.3.4 1.861 6.098 1.384 v0.3.2 1.893 - 1.071 v0.3.1 2.038 - 1.373 v0.3.0 2.045 - 1.391 v0.2.0 3.144 - 3.547 bc6212 3.82 - 4.427 78b42d 3.81 - 4.408 907fd7 3.822 - 4.465 5e4362 4.59 - 5.107 libzc-0.4.1/bench/runbench.sh000077500000000000000000000017221331702632000160400ustar00rootroot00000000000000#!/bin/sh TMP=$(mktemp -d) REV="v0.3.6 v0.3.5 v0.3.4 v0.3.2 v0.3.1 v0.3.0 v0.2.0 bc621294c57fa688e535babfc0f05726277e65b6 78b42d456766eebf0682c162592603712c7c03f4 907fd7285ab51fe51ad7a67c8f348b4744198fa1 5e4362267fbe30ea08e2cfaa68e903bdb2f79575 " OUT=$(echo $(pwd)/log) cd ${TMP} git clone https://github.com/mferland/libzc.git cp libzc/data/noradi.zip . cd libzc rm -f ${OUT} for r in ${REV} do git checkout ${r} ./autogen.sh ./configure CFLAGS='-Ofast -march=native -mtune=native' make -j8 for i in $(seq 1 10) do if [ -x yazc/yazc ]; then /usr/bin/time -a -o ${OUT} -f "${r} %e" libtool exe yazc/yazc bruteforce -t8 -a ${TMP}/noradi.zip else /usr/bin/time -a -o ${OUT} -f "${r} %e" libtool exe bin/yazc bruteforce -t8 -a ${TMP}/noradi.zip fi done git clean -d -X -f done for r in ${REV} do echo ${r} $(cat ${OUT} | grep ${r} | awk '{ total += $2 } END { print total/NR }') done exit 0 libzc-0.4.1/builddeb000077500000000000000000000004661331702632000143220ustar00rootroot00000000000000#!/bin/sh # Simple debian package build script D="debtest" PN="libzc" PV="0.4.1" PF="${PN}-${PV}" PE="orig.tar.gz" A="${PN}_${PV}.${PE}" rm -rf ${D} mkdir ${D} git archive --format=tar.gz --prefix=${PF}/ HEAD > ${D}/${A} cd ${D} tar xvf ${A} cd ${PF} echo debuild --lintian-opts --profile debian exit 0 libzc-0.4.1/configure.ac000066400000000000000000000051021331702632000151000ustar00rootroot00000000000000# Copyright (C) 2012-2018 Marc Ferland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . AC_PREREQ(2.60) AC_INIT([zc], [0.4.1], [marc.ferland@gmail.com], [libzc], [http://github.com/mferland/libzc]) m4_include([m4/ax_pthread.m4]) AC_CONFIG_SRCDIR([lib/libzc.c]) AM_INIT_AUTOMAKE([-Wall -Werror -Wno-extra-portability]) AC_SYS_LARGEFILE AC_CONFIG_MACRO_DIR([m4]) AM_SILENT_RULES([yes]) LT_INIT([disable-static pic-only]) AC_PREFIX_DEFAULT([/usr]) AC_PROG_CC AC_PROG_CC_C99 AM_PROG_CC_C_O AX_PTHREAD([CLIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_CFLAGS"]) PKG_PROG_PKG_CONFIG PKG_CHECK_MODULES(ZLIB, zlib) PKG_CHECK_MODULES([CHECK], [check >= 0.9.4], [HAVE_CHECK=1], [HAVE_CHECK=0]) AM_CONDITIONAL([USE_CHECK], [test "$HAVE_CHECK" -eq 1]) AC_ARG_ENABLE([logging], AS_HELP_STRING([--disable-logging], [disable system logging @<:@default=enabled@:>@]), [], enable_logging=yes) AS_IF([test "x$enable_logging" = "xyes"], [ AC_DEFINE(ENABLE_LOGGING, [1], [System logging.]) ]) AC_ARG_ENABLE([debug], AS_HELP_STRING([--enable-debug], [enable debug messages @<:@default=disabled@:>@]), [], [enable_debug=no]) AS_IF([test "x$enable_debug" = "xyes"], [ AC_DEFINE(ENABLE_DEBUG, [1], [Debug messages.]) AC_DEFINE(NDEBUG, [], [Assert macro.]) ]) AC_CONFIG_HEADERS(config.h) AC_CONFIG_FILES([ Makefile lib/Makefile yazc/Makefile tests/Makefile lib/libzc.pc ]) AC_OUTPUT AC_MSG_RESULT([ $PACKAGE $VERSION =========== prefix: ${prefix} sysconfdir: ${sysconfdir} libdir: ${libdir} includedir: ${includedir} compiler: ${CC} cflags: ${CFLAGS} ldflags: ${LIBS} ${LDFLAGS} logging: ${enable_logging} debug: ${enable_debug} ]) libzc-0.4.1/data/000077500000000000000000000000001331702632000135255ustar00rootroot00000000000000libzc-0.4.1/data/archive_ptext.zip000066400000000000000000000035631331702632000171250ustar00rootroot00000000000000PK{†[C”vСÑ4cv.texUT ê|mR5m¼Tux èèWÛrG}Ÿ¯˜¼Èv„mlÇ¡*©(¶! 6ë‡Ñìh5xvf=c£Òð’oÈ[Pžóûcéž]I+ù¤Š2Ú¹ž>Ý}º'I ¹Ðž+æÜÛõÂŸŽ˜õ’+1&Ip¢`üŒeâmðƒÝÓ‘ÔEðBóŹœÙLêðüt” “ o¯VÀ‘–]µé%7ÊØÅ)% rKÅ@jWÀ`6ô쪿ëÝ]X¢Å{˜¹öW…ŽG?Ž˲L¤J ü¸€e[‰—þ½Lýp|mËËñíÞ°&Ï™N“×/ƒ£dEraaœÆt½»]ø1!‰—÷NX)\òKÈ}Æ,§„UpœÍ‚ÂQ»;ÔAOl9ÉÍU’¡œô§«õµ6}¼ñ;ÝêmÂ$0Ê»ƒêŸ²œIÕ„0qRNT÷!ÝÚØíìlßÙ~°½I;æÅþï pÄhêTÈÙ™ˆ0Iâ÷ÒèoGåÇ4p†¿g;<ëÅìxtøÍ¨â`ürL6××·[?3Ιb€3O…¦OôÀØöŸѦ¯´¼ÖI_Nh*èñPؾ5æL$É[ éÙl>Ô¸áú{å$îUŒ>f®('NÂ:CŽ–* 6!‰Ðé %isÈt„ûŒ%,ÓåßLºVµžÁ^X-” ¤§3…“—G´”­aÈ1Í]-˜U` €*'ÜJ¿v¤ƒK°wÖ „s0ïú<á;Îæúƃ†Ý/'B™¢ÁRe2É¥Pmzl4øÛyÚ;2yw hHkÏ›â=°TÐt¶#¡¦·P°¯ƒì ¹.0%]Œ…6Œ\¸`vd…i¦®\\‰ç–˜Ê[ÖqF;t—Õ( —”@’Ê‘Üô¥ªÁ çãù¸Âæ fJ›hÍ¥‹¡´t%h⮜/?å% Ê¿hVNà> [04R鼕ýP~(5ÜU$ -£+çlÖkTfÀ—C0šB_Ô·xÙ·6¦gÑ£!s"íôPͪ¥@‚ÉÙä„ô¾ñºgÂ{;·Š€Sf6!¥ øø)€ëß¡ ×í S;ÈQÔg‰V Ú•rÁ^tµ§‡  ‘rø€t¯oiØ%=‡Î†{VÄ4 ¢—fÙš^ ¤B*ƒ¹§ @‚qˆÖöŠÂ`JÑ 8잟SÓª`P64Ì`,‡kXàŠ[£½-ÿ ­é/]9éÖC[½Ù,ZK8šXÅj›¾[aÆ{sM—b}c똯ÈÕ"šƒôWêh^.õùu?T)´À)%yMÞ4iÈ̃7…?@ÿµ1*,&üúÎ ÿXZÓÈôê®ez˜mŒî‡"s|2æ¬eÒœT!¼‰H&È—]€¹U܃:)£žÕ’‚¹Y)cý l,€­6˜®{¨õkü'¸#³u¬4Ýlr¯YFæ\,@cX T†BMr‚Å€¿šKÊÒKs©Ñ¢JYš’·'7oŒ=s ¦mFÔ’û,n.?ÙˆH­°ÌJÉ ™ÒŽ T”ÿðaíÿ¸@Iä½B]Ùén0T,‹o†ò [æ ê¬gÓ)žrrdíØ©±ð/ŸìÞ^†ÀUôØ­ÚY*~®RÆúˆ6Ôþ†}ï^ëºRôj´>`Üm¥²K_Ea7À è!c9Kk2: ú©<¯=8WÄż·eMì(ÈñtS…1JÿW‚ŒíLhçy¬zQ*¥ŸW°i‰s‘tèɆxÊÍTŽ´Ñ\eQbsˆ²7R§æ½‹Ø~Æb÷°@[‰<Ó•FŽár'QÏ1_ÜýÞÑ“ ÏÉPÐ×UÑÿP]sbŒ:“þ#œ§ï¬] š—rsÛ°LÑ‹/ §ir4=wC§œšÒò…î ]}^}÷EšŠÓ•~aðØ­dö±ÿ^ŒMqLûu¡J*2ðÒ¥åÇŒ©*½Ã‚¡óVm:ÞÚŽ?dŽ©‰….Mѯ’f^ê»ôW1«|P~'³k*µ|'<±PÃcÍ3]5ÛÜX‹ê1pÓöÛ²XÖ£i}ƒö2Ußõ4öÒÑ“‹íInR°µjIµ¹ÂÛÑ<.¬‡‹9—£a͈)G¢RºJ*Ymºó·ý“Ô£F›^“ưýEEõšØ*®HíŠJã•€$«¯NÐÜfo·6»åVuí…(õKæ žR›­ý;[)[©6=P¬€4ŠO&ƒ p÷è(z¬‚€‹¯ŒÏ)ü~|°µ†ÞïßÏ }|]ÞÏëçµ»ðsþ¦üPK{†[C”vСÑ4¤cv.texUTê|mRux èèPKLlibzc-0.4.1/data/archivec.zip000066400000000000000000000036171331702632000160440ustar00rootroot00000000000000PK {†[C”vСÝ4cv.texUT ê|mR5m¼Tux èè˜Ô› ë£V Bån;8†õ9W2üÆJêòþNn½Ûü·È$É] M!ß-p“/FHEÂͼ„嬆ùºOúLæƒHñ`âÎÔ}›A«¨KgØL2¿¦~(óQ»¹F “EŸÌÛ*¤¢|ûtËU‡TõøFu"uæ(õsZ +Ž·k­ÿÉÏ=%wmiݼ¹©÷@$5“ùië}`é`½PàEÞ{_ϖ謥è}ê¸Fá[š1¶›ê½æWt"0ýÔÐ2òøý¯l0MŠ1u-ªcÿyU’:¸—Mtƒª²¯‘w„æcâ·ªù²‚° XuÖÄ”‰%:I!Yã Ðý‘ôlkñ”<6O¶Øw™°_L‹Ä©–[WíÛÏ-³E§J7ã ‰éoÒù»|§Mɯqi|àóQ¶B¡×q¹ñH„´ D…I‚¢»Ð}eücç ›’”?™Ê²·¢yçPÛà)I¦j•íJjÐkd T)\ ¼«÷š³)ðuyñ­]òÔù^•ï3Ò "iBqïÒR•ÏÉ„º¡f¸NÕUØd& J–A3·ZñÚ.S$i)ìÓè“Ì é;ÞÜ9™ä[ý „CОfDddL™6ä¼"Õe<û¤kd"VW¿JðÏŸ'ÛWRµ·õ>0L8"aó§«%¿¨"ƒj ¡vKöp‘iÃÆ‡f÷Ù±Ox5êVº ¢™6°žÔ½‡&wT3;¡yO>mƒ²!À.—ò'ù¶SxfxzÃ*¿¶XwfhçË­ƒìÍàËãbv*dVS£Ë•ÝU8ÂHó^íA`K-ß‹.5qvX6ÄåÇì„WÙÆ §—úhx)J\Ž á[fxªÇ—=)a’צ¦åP{/›Qº]ŒTŸê’Ûú1Œkp3ÌíGêw)î§Êæ±[2h¶ÄÄæžM¦QZóïUÜ;á……œšïæ†ti*ÝZ@L¼ÈÁˆ'¿µÛ–L]“ êpû‚s6° 6•Ë”Ì5Ú!Mô½I~v9 ƒ?“eÚ[½çT~8£S»OO´Ô‘ƒKaqÕc¬øÙžï—”W †g™nÙ¥›GŒÎ×vžÏðth…Ì¿Ü ùTH¨•íHMâºXhp·uQg~<ƒÄe§WÞ&,úsÕ‹¸äÔ ’´¯Å:Å»rø¸;%,’åËÙe¤òæ\¿,ŽçÝ×ã€E¾ë Wa݇z7Û˜–­ƒÐ$ÓóS°7›†|ÑÈïzgÀeWÈp1´×c‡Öî‘£F‘–I†h±šp#„¹ÕgoJ÷ t”—çJCöçÞ& o.Ïɺòˆ ­{ ¨6H¿ÍýË ñ ¡ØþÆ2fc}±m²hJÂÏ*GÝKá÷nF’8-{Ÿ½t‘œ|ã0ŒzÉ Ñœ <Ô‚Ä5ÖdFÍúžZ,))úDåIÒ<‘Ëj;uá’Åü|¹Ó×θtàép¿-~Ë+&¤+\­7ñÖ+·‰sM&m9'ò‘(º.lq0ÛÜ9™(¬üsªºð+ctìþyàâ»O-±‘s¢ö1aŠQáŽg‡wN“ƒvc µ›ð`ÏTc)󥪖lÝõ/¡ÉP{”)Z¯*ì”ñ©6]â´‘ír6ÞVþnOꉙq0òÜÐýõ;ÝÍCƒßî]Uìµe‰{°Îͤ½Òxke©õêÆ1¨=©ìp‘Š9Sn† ‘ }ŒWo¥LºGYÎ:ÇeÖ5õÇKwAok JNˆëÍó¬'¬XQ3²ÃùÕg€ægľªÌ<,Ÿc Å-Šä3=óÙ®u5ÀÈ$XyÔžhçHçÕýýÃd–#ö´M¬ÆGpa­RK$™á«¯kŒ·¯I–o_å·ogæ—ÿáÁìÛ0É'‰“ K6õ@¶¡¼Çª&‘¦­,8«Óä2{÷"¶Y0[øíÒô´ñïž±ˆì“‡”x91.½Ë+:ò–´5u7j‰uI¡09~;+ÌÍYY—4FTî°¤éC~3ݨÞȾ®§Ë’luœ9&–ŠÈV—c‚< ·åü,ßR©Ð‰¥úí¸Üb{xÐÊ%¦•ººŒ¦æº_ü¾“ê—|£¿œÃØ^¡ãÅTãƒÂÆ€÷†Ž1$1g`ÖænöAî'Ù°„ <Û9\X¤þ@ÿÏèÊ5s¦ÜŠÈÚ3Iä.mIâJ]+o5¨g ó”'áÐû4þççöþmhÆÃgAòe¡cSì •fÛpÉæZ×íZåà0V ^W(kC'fãd‚]6ŸÚÇõPK”vСÝ4PK {†[C”vСÝ4¤cv.texUTê|mRux èèPKL-libzc-0.4.1/data/dict.txt000066400000000000000000000000371331702632000152110ustar00rootroot00000000000000test1 test2 test3 noradi test4 libzc-0.4.1/data/noradi.zip000066400000000000000000000011621331702632000155250ustar00rootroot00000000000000PK¥m$€BvÒtn TEXT1.TXT‡]î6ØCéˆú®HŒ=t”.3ì’è½j‰ÁêO¿¯wä𬜗@MÇrÔÉIïeÑàidË 2Q)¯ ÁªÓP¤:þh‰j\ú‡ ¬þ\b“¯q·_±?Ú‹¼p¥å§àÒ{j2ï¢!–*„Ô^»òƒRCPKÛ¤m$¾)!cbX TEXT3.TXT •ñÍ•ÒÈÊÛ\ 볿{ˆª µ±."ÂfR‚N²zžœÐŽ1Ë"ÆÕ¶Q÷·ÐȇmmS*vzØ(Ò{.ÇŒ¡iõžf« Äï{Ô§ɽýš(n[lPK¥m$€BvÒtn  TEXT1.TXTPKñ¤m$ý `lc  ›TEXT2.TXTPKÛ¤m$¾)!cbX  .TEXT3.TXTPK¥·libzc-0.4.1/data/pay.zip000066400000000000000000000474241331702632000150550ustar00rootroot00000000000000PK ˆ3¿:Xý3o·ê³æ}ôBu™²7“UÊ/<ÃTݾd›Ã(: ?t(Ä`†Yº=ÝRô'9žÉ­bÈ¿äÍ  XÞzöúQÅ„º·’‹NÚ`A»y× CÙbss"ç¹gBJmXŠ]:òÈÁåMýšK;ëOÐÄ<½y˜Þÿq±fÝÄ¿ú°#¶cª¦ Ïî{ÃqTÿaeúœŒÃÔÜÚ æ_‰ñ/mï¡ð˜—òâšD/‚!×AŽš3BÇËr” ƒÛ…mOƒw\ñp©ý9HÅrÿ0ŽÌë-o‡3aºáÙ÷ëí细×56¨š§ª·F4¶FA݆©!úRT;* 覙Ía4˜¡”ŸÃ}z3;`ü€»Ô©z0ÔzX éõ+Zç©ó¡As“Ef© šZÞ4Ægàÿ^ÌŽáÔü¶GÄ;È‹y#<0š•q†›Ž¥ oƒ´Ú²[_Ú‡¨¬¸(¯ÐžðE^A.9*n‰Ÿ’Jqóáæ‹xRÅnXz=[@MèÖš$Ê)ô£}ˆ“²ðÉY?\w,Ðz›àïÿq™³OË£Ú‘ÀÝX‘òZMúÖækzŠÇfxÒè`ÛÉ"­hÑ(éÞ±bÜ…~ç€/g•Lf…¼òVß Ã 6&MË£eÚŠl6e¥[¥0ío„¤Ž¨Èái­{_‡"í—ºÐj½Ogº ¥ã5Í¿òv–Æè@Jb0®í¾‘ÂÀTcÿ׆¯o&Z¸Fq„÷–zƒÛ}wB”}²lúÊpV‹òoPq;ož6¹«ü—ÐÃo‡RPIÍΖ}*nþcKS×¢ÇI¤¡ý'ž7q› *ˆl™©äPæ êõõ« _§;Šò¶(qâèŸj¯U_àØŒ3 :_±nqÑ©RCÂf®­ÎwÿäԂ¼……‚\²§çø<~r¤/ïKòoÓ¹T¥Ü²í-¬ã'…TêoßSÚÅ0âÌŽS8M^ÃE;g‰aEa¯ú,•·Ë[4ã­¼Æ.‘-)#0•§«u °QâGàØÞ¯w&§A¤ÝÈ ªáMŽóÁPIÅé¡[‚«‡n95 Ö¯­ï Íéq@O°ö©ø$禮7únõ[D “›îep¶ßÜÝ®•*iú@ci‡Ô:ª¬Ô°| |^.eìøˆr’ã‹}žYɉ“3zË>§ÉT‹H™*ö ~»¤Íx8¶NIœê˜éhk¥±hŠ5Hʈ÷û‡³Âë®§T'¬ýAó(÷§Â}—t8ì <'™fy|0r*Xžpû¸ø{¦#X¾æ´å˜k—§ÊÃÒø®Ça¸ñ‡Äu-œyä!à¼ØÕ«¯Û‚dâ6F¼;(W þ#œF8ø(Vž£·+æA'${Œ‰pMÔà]m”;²ä(ÜYr ÞÜ÷ Zv†ô_“²ªEí±Þ 9^Þ }¨Þ„ü Ä`wʵ2û }×ÅB[/êgÓNƼdmu÷øi@Ð… uÙ_Üu„ ¹/®‰”ïÜUÚ1oõÄ 0\[¸,Ö€l1žæ‡€Àã<»;|½ úüš:b«w*ŸIpVød}§â|j;³Ë2h¢ˆ1nm ï;øŸ§ºñ6ê? ¬’aäÇÂjÞ>ÐÔs,•A~WßTEš¦ŽÝÉùª ïÞÓ7š»vóË”@‚÷ĶŠÑ_©ó±¹ÒÚv¾EÊ3Û¹Øk3‹ÆëÅ2Q)æ,§üÓ_¿¹8U! "~³Ôtþ/ĵ fkŸ8È#gñ^Õ×êsRˇ( ZLÏ^ºòЧÙîÃi†04:ÑþŸ'ïi’ìw,˜”·\Cm*²Rêò⦅´IJ5ÎÓû"VMo°`Ÿ$ õÅDçÅ7xŠÎ39:ФiÒð°=ÉÖ¥Ó- Œ¢r‹¨U8ëòËõĵtY9sCë×ôéejP»eØuÒÈ>·ã%–ÇöÐØÙÁËš­®ðüÂó8ADf$%8Z¬à`¡ç¯Î’ÓæÀò ÿýs$OÜAÏ··ý¬‰¨³‰l#$¬Ù±µ$v(PÔÜ·¬°·mp QHt}ÒiÄR™‚þ˳Øÿ<gQÒ¶‚}–€4a€i÷ãŠX`ÂŽÝ"§Áô5,jE@*ЋkŽ©°pYÙ).^××É ÷پƺ¹ø&„S±#¿Aq"Á“ó²ëçU©‰Ãùi{˦ ÅÀ¿ްÝs»A†ó¨TÞóTä‹ñc"¸Ó\A¯Š}ÃÆ5À6sGŸ9k¦€KÁ%ß«ÑL%èöœqâÄB ‘¥ö×/ª  Ä 2=èÑ ®iÝ öÃ/Naa°=•¡­ïa·ŠLóp?k A8%”KÍ%ÿqÄlªUA—kuè3ÚOº¤<:…ôšŒSÕôö–Ôœ[j«Dm ç\wêYÜŒi‰¢Y’—xæ¿#xwæ³ÅШ#¿ºâZ³·X½ :°6½1 è¸) Èös™©e@ÍÅ^1…÷´­‡ó¹œõggsgb²½8ßX—9ä,É ¯òýß´ ñ_yÑ"qµQ³Â-öi·U¡½&3B;ùÔè&n‡4FA¾×ÍüîÏÒI]5“o P-LÎ;N d׿‚¤Š=UâÙÁ³ïÃýFr&…!{[г¦¼¹¥xÐ/_HÍÚ_ËóÝ8‚Zãw;ƒ’ýE½ ;ë/>øÐ¬öПoËÁå•+l‹1ç4ÒdûyM‹#¦ì±p® ”£DnQs¸,A}ƒÕöaz~žÏuÞPõ:MA57MP¿—x>©YŸÖÇ)¸‰ÿ¦(¨>ññ_žT_Ç·|YȪ‰=¿ê}Ë:^®Þ€,W„¿]Äÿý¹j!49tó…È1zK‰à|ÙªžÚ>Äk æN\šÅ†0!(i>út¦‰U¢¼ø”×¥Tâè6dAÄ 8\¹”R}-ün;Gý¼âÚžx‚€éx£ìpí,4]»n][•ŠDl“v7î5®hVi (ÛZ"+Â'ÕY~ Ê9rg¥h YÚßç%¼J‚ZƒæmZ¬ (ÛªCðÓ<ôô[œÆ¼œÛ¦*úÿ ã`þ>!ŽÎ®¹)zTÛ°»R™Ñ—€ãÛìÓŸIž¾?R‡ZÜHÝC’ÍKÞ|CD´Õ¬A0—yd"&8oyåŽf÷ qd±"SkžšE”©Ô(RÂBl%Ñû¾úIŒÄxhäxtUpÈ¥DkºÌsF¦yÚW¤[¼PfŸ,Ï Úø²V²üxë4¯Ùr‘ YYoƒÊ¯2‹kå 0>4 v "9ÑèÛ{æÉgTÇÄÖu™=<à‹])CDÆèˆprF·2ûðV’˜â‡JÄÚmhúÜÁùãÃH™FÖsJÊt€¢Y ñ7ñ¡•R>cNcy/ǾûìнôÛJ9{ÝšMl§Þõ>.Q5oaÐ÷röÁÑúr`©çQVªj»£Tp×{½r—Â0K9pçæÐtµ›Bn”ZxòXîÁæFÎïœ}Ø´ðEÚ”V2ÖÀf,ë·Lñ{9®ˆþ¶ÞDÙÁFIgþÓ& ¥Ê+†%N"P+z\²ºè¢.jÊC¼mM¼Õ’ jä¸SóÑ5sWr!2œ½TÚè¶*ŒÚ7üclô^8ß…î]Æe¶C¹ºíÏ-žs+¡`1¾˜Cð—R$«›É_(Ó*FGä/à_ÜÅK(E†' ë• ”åȘ5úëµÐÚ×{uB]±1Læµ}ë3¾*'ù¤8û1RÔ jëlðȃˆÇ³YîeÆœñ*ô,n¨ÖéÂL01a”YÙïÓg#ÄÄ—x)“ ú3JʲJ¸–­_çµ;êRŠj¤mFP. Øx ~øüÃôÍÍy·“rÐ^…œ½ÂÑ6^¥–è]°Å(#óBöæ~Op Ú¢A£(þ;YÇeð‚V­…¬ÿÈ¡X‰'ÊÚ.ž: u`ôÞâQ<;4¿Ž8ÅM„žA6ÁzL‘ŸÅPÌ»¤¯0 GÕ{ *Ý Õ`«Âxu s1k´ð„uÄ<ú¤bm€C²³.¯=…$ê“è„ÏêùElÔt’ªÉµƒÎÍEëòFá1?À‚?ξv䡹ývVk’¨”ÁÚ”ê÷Ú$Œy"a˜cõŒl+Žb2-?ÆvŒ÷À†ÿ-Oò6^šÑÇaNê#+{ÀÍ.™yoÞÐá²òà}2Ÿ‹V°T)ê ö˜Y¦þi×È“Kè¡_ª£ÓZ)Ä“óàº1â Ú»sX!qé7r‹ÎE3 •ÅN4 ’”K¼¢×ÂË€Ü ê\íëà¬4\Eö“_-eé¯Ðáíæoï!8£[ã}/Ò|L€Rãˆþ>ËG°+ã‚×Õs<Ä \ xï çb¨¾ ߢÖuý g‡×Z§ú"Å¡B–TS#—ü¿›Øœp2èå›ب{•û‰\n)Ív½Z{I°[¼Ot,ìKþ^¹Qå8Ä<ÈáQœNÅ<ñj“øŒ­Ž–£žJ–À¾ÛS¯38)¬Yo‚x\8Jê;©Ú- WÚélÀÄlO9½Íã÷چΓè5u*×jà ñ”O‰RcÐpm£,ÌÚ¡À ×а\¶k‘0{wÝ)0˜8ù‰ëgõÎjjŽeÝ,7¿IÉqGâiø?Ý˔ɡ±wÞxgÂÇóGðæíþzïùéd–+f>ÜM9†XêÝ7`ºiT¾§8à~v®;0¾ Î\ErÇÿ¸$€òmšÃ…•žR Ki“·¼ ö™ÑãÂ@ègüôŽ@¬h’„RÒÎáT›¸ž«ÿbÎc@²’ò»ý}\rJ*·¿ú<ŒÂ™M566syKxüÇÒ-kãê{‰èòýù gÖ16e$§)V|ˆø¥îóÚ¡ŽAÓki¦_s§s®]©MÇ_Qal”wtÇí ="sÕ.ÅnÊ NèÁ?’Ýxôµ¿Ù\}_ºÉãS©GصÿyEzàï'£P_u^7UÏdÞ97ñfõD²ú'qwÖï2Üì U„XÖBOïkPe!;’u-¬üyìÌTÕóAŒýÁï—ÀÍ×úBàk1±¬ïWÊ™n'¢Åq‚!Û¼{Q¼rû™˜^‡›²e:Ç.Eëp^­$‰îmGA‡Á´³f5M 2`æ}±<Ú¡6±•õ×S ¼ÐQuá•ÒØò¤ér2÷Æ7ŸÃöOµÄ/6òˆ¦# “Ëу‡Ë8ñ32E䑭аš?oÑå³Þzhˆtûvèö¨½·¥R ß$èfSûl0s½ÜS+ξ¢#!a°Ø²"ì;ÚÜœˆU ºUá«c]«®àOœÍ’Møž™à”› äØ 8+}{Ç›óó±ä‚ÀÚpÁt@ƒnÉw½Ã8¾ƒo‡Žš NÑ÷äBo̺Öb‡²ïqeŒsGçÚj¼JÉaª ãÁaqu=U!’UÍ]Vå4tQWä€}GüÀd׬RöSr»Q¾U,¯-r_U[=V1 Œ$ñ)þo/ÞžöÙ¼ªï,udùû­fþM]F¨bZNš ¢9Ü€Æe=KUô¡ÆnÂeŽ‘îE")™*zÓÞËöÇDRÊÊì„丑¸\KÇ!0º°í˜Ï3©úQWÍÁT1 ËÃŽççB89ãB³¼[‹!M¶Фîœ\~)“wnèhîí %»T5á EÃÜÆîÆ¡þÐUæžrÜÃ̸-ÿ›ææ{û§žô§çJÉoÕBË_q c¨\cý2 Ô²2H#_jƒ¯®èÀd8;ᣘ;~´A¥ï>VU²Uº%—;µÙ¿ï LyµÅÜÞèíH.Û„–'enž5 ål $ü^Cš{s;‚ñlãÉ`Ù•?¾ŽìÝ»ŽK^:iNQgû¶¶¯çÏþ,þlþÖrÔYÀùÐ;ÔDš(ýc¬Ik‰:ÓççÑ~Û>}ÌæHË"ð∊I›úÉä꛵§b%Ó‡²­‰Í’ˆ÷ŸÒó}hÃ>ú¯¿oÐÚØAÜßJ½ªµçAÊf2ø Ù©…}kYáˆ]“¾ Çi©¡8+.Øf¯™È _”xHkQFkP|柮Ú¾?B6ñ^•nÄO12Ë·‰>é¦yÜ",膮G[±öDnâÕŽw8û.AF?Z̯_mÁó!&3ó¡~Â0”«(ìIÄ™ŽR=|øl=?F•>c|quáæ¢HæªÉeúúÏù&ƒ3ÍŠUbX}Zb@ëñüH. kÄ?LjÈTZC‹Þ›Êø½†¨ÜÛ'ëF.Š«t™¯ø.YÎð/ø{dËþœÚ¿^€ÁöƆîJŽSAÖŸ1§Ð¾#æ0´øx¹Í »Fu™^¤G µÜâ²'Ò8!ÞlPögÄ<'3±ýÝgÃŒ~=fÃKÁ²ó„M|؉É€ã݌Ѷ‘DØÑ/ƒîˆ|0fø»W¬ð¿EæÛÎÞÏÍü*AkLag–2*}3á$Æíg ¬ËÍNaÐA,ÑUÐ:˜ÃÁy®cË4Ï/FìBKHzƒ#׿_ç4CÕ†Zàv87ž’RQmDt1‡ ?¸³‹¾Ð*]ÞÇ\µûüå¨Ú–Ò„‡ÚyÐ*Õ6Ê`A\ I9’zwÅÕˆþ~¥~ ˜¥W”Ÿ™9¤2 Šó@`m¼¶6¡çöU“Ûg^Tqóê!”‰é?T/ Ǩñ2›ŽzröÀ6ayÒ½¶©ôÛ­>N æäE‡A²r6|¬Æ\ÒæY…ô3^ý\#Žüà\nlY˜aV3“׸_¸E…¹üÆÑmÑ+¹›¨[9z<¤ËY®:Œö_Ì»þO‚l‘ã ªL`×Ú¸deZeØêMé‡PŸGøÛöäóBýV&-ÏIQm FílγÈO„Ô$^¾,AÖú±ÍûÈ3Måö¥F< h=™­5÷1 í÷H%ãD¢Î£SÍ7~è@sOvÄ ¹˜…QÌõiø=aZ6—9Ü,ÿÉüç’ ;[°Âž-)*ª7ÑeÜÛ-€ ˜½£[ºwTò 5²ùspÕÄLZÁ÷Ao-U JiÑQàø†”Þ 6ßf>¥N’ ‘éú>xD¿¬;Fìmåß ¸ðó,` ~o)º9pVf ‡ Fü1*l¯ˆ8Äõg6wFJ¡äìÕm]¦ô†ôs´¨Øqùå8Öw¸ËŒˆ”H& «Qï2:ñʇ¬ÉZÅ»¬¨¬u±ü„)®^zõFy)Éý<|‚®‚.X±ÎFË>GÊ‚0îé'¨£2‹·(e©–Ï^èöE}¨&¨/ÎñøÉ ¤ÐŽ}æ‡Á”Ÿl]Ô¸# €eÙúÓï¤*^ÆP’Dî±B"GÇo1ÚLûkö™=>|k»]pàUKÎ#-l‡×nþI'Žõ>è7|’RèìçÈb£,–I[f!7Âyñ¡uð HÖùiÌ®Ñòv3ß§8¾³¢‰@ï³ÙåxâVÓ•Å›’zâ:e"t=—G•*€ìÞÈFÄl™ÊB-/ö*ü¦Æ6Mo۞ȉ ‰aœÃÔÔ½N\;²ýíæ&íJDûA®ðð /´e‚™»·%‡|ä}ØÁšÞ¹+±É"ß´§CQô]8Ò:á»Øf½ˆ¤´‰Ô‹6Þè­#ƕƫÎÿ;1ˆ¾p 6V&$Ô›ãâ*ãf.Ôi& Ò¾ñì Â×Ý8Ç”Ïûb´÷nˆŽeH|Ïk-`×Þ!¿ÐÙ/÷Åmb}ÿ9%þ´pÃ'‰„NmDqî¢r¦œ2˜at©$ÏòhÈw¡D×wÅ…i÷ß!V·ÍWjìvéütÓºßUû‹<\2eKYå!ÄHHÍ¢A0”—[ÅiWÝ*[?(gÒxk*¥h'ª=¬ý¡ŽbÒŠí\-k(xf¦/¯Ÿ öÙ-,;4r«Í*q|¡2íïÙiîÆ3T7.úê´YÏJÖlrÝy3Ë]ñEæÛ|ßñ¸|íw«aeìyõÞ]cåIŒ‡ŸÕÍ8Aœ°"Ðî‡5Æ)ÀFa=ñû5P[à¬nð±¸¢Ýæ ÿ5Ú’ªoOÇFÆ©CR.8#\”Ë ¨dÄSJ“¾.ˆ914aa9-º26_C~h”eîAn€3E¯1á£Iö‹‹ž¶¹o“¡•ï\|0tµ²>M†U^Õz —î”g·È½Êb°2Ê´"ì½S¡ÒD` ßRù!´‰õZÀ‡Ýïoñ™`ÓÊM»ïŠ•¡Ø¿Þ4<éyqŽA.]K6 ®—Øx ²õÜÝr®Ðh-ýø7IcÒµÜ+„Å?‰ßûNO´ãBˆ\ñìþæ…Šæˆ2x5˜v%CY©Ms¡ïÍCó2@f£dÂpDÙÃÆ¨?ïEâ aÎÉô8Aù¾ƒãF¡n¹h`½gm"øoƒA|íÊ{í)P÷ì¿‹¢6j×ûNbk¼²²L¢4V×ËVÆ—ò „Ož©Ú3Úbé»H7•ó±eÞ¿iªÝ˜pèdßvõΣæÎ`”´àío .ù©m¤Žc°`ò³©p*Ÿt†£ù Ý‚¦¹pÂZŸ^i?ðOò›il©<>Ëîœi³¨õ%Þ²Ûž>Yq«?w6ýœÔ¾JœBº£µOò¿;ònœG%cW×Þ±ËîÜ‹çFÛÌèÎl>”‡ûfÐy»*²;PŠ^P\þ³U‰É¼9 çDÓÛ'/ÆR.(úò·›qËN2F$ÞÐLd»ž!œ{'{JDÉ-qÕ« aæ €+ìÌa¬9ks´oûpÄEa±‹½uCâŧ±Ë gÁÿã‡èH³”è˜AEÕ鎑dË ¿ëö)¨ªå¥oë"]Ä|ÂèÔ>ôÔƒÝÁ·eRJnªÌ)[ •Àf‹ŽCÅ-˜° ÛòH\í'ó8’©ýNÕDPÀŽbuÖê/]ö¯ÞH× Ö ^$áÙDpõ¯…Ð÷NÈTôd]ÉQdÎ2Þ :÷ŽoÒåJ [œ Ó4KôQ:¬’Þ³°I—N“g œÓH—‚%gz,³nzòªFÜmÆjÉF¯Ÿ´ª›]R³ÖÂÅx';ìÁ¤£;™6yÇÒ H–pÍŸW·Jh70ƒgþ@·¸ßöYÑúÏ)í!•¼Ð%®Ý`²xey5V›\õM§) ¨hfÆÊˆ»eòæqË‚µ7™ýÅèÍ&ùi*/Ñ9‹Dï²Ü §_Ú&YšDuIbÑ×;ΖKGÞ5 NöÓÃo(.e*µ ¨ uéô}shï­Å*JŒ„†ç„5A’ ËT› ,•ѤÝ/°P1rŸ·æ\}ÀzÐ E T#R8|"Ñøÿ¼´Lç׎ÂüÀf»ôøÎ¯e G†{Ï{ Âðâ¬?dm5ãR‰êâíxô¥}×™Sm!)øžÚ‡¼30¢!I²˜¦È‰tçŠG§WÅH"ïMw©ŽsGÐ€Ä _ÞªŸ ‘ùùtÍéL˾k¸é?wê¾ 8{A& ׯK÷̓»”ùO©ÅœQÒâêÙýKÜxÝT€äÆ8nXØpXÓáþÆaioø««GLb€Æ—ËB¤Ò§@¶­µÃéT:êOÕúƒãºî´‚†üµÿÁ1‡F²pãß×VÂÈux”rß,⃠B6€ù  Ö:«6`1é /ìÞOòÇæË'x¯ávù~UC¯Å“t?)J Ýñ8âŒRï^7°´zÿ²Hx„U}¥kaxîî“ôþ¿$ô‰ãOÄ"ñØXº÷G&s4öùm°ÝCÖ|ýh\n\?¶dß XàâU`myClÅg|YädŒ6^ØL<3>Iýµ©£žêÚ[ ¿r¯vNºÍ†TÀ‹ÊÞµÚWW /)-»YP¯°)â*.ÍÃØºl“×("+È?‚ËqåÛ›Ô1E¿À¨¸Ú~ ¿¾xMzÐEyzŽëriM$Škä)iÉ&püÒB5Xq Ìëš÷ç#o,=ëz\3z°ðÔKc83ªDƒ ×ÁñhXó‰‰R|×a^‰å/ÀÓ›–oM:´¼ÂJþòÏSßeÖw†›T*KÞg©ÖÉÂô‚(ø©âVd˜é¾\FO`_,‡Cóß;á­ÞÔC™÷íç”Ýd²Gxâur Jœ‹+õŽº×ün=Ê"ÇT³îKýßÐúd€Œø˜ÞƉöî°Œ’±¢—D[âÚtT}…XuÝïÌpÝoD·ÕÿïtMç¥A!0e°¤ŒoV¿a/ós‡þCxMPF¹4@Eçǃ5yåH¢/°ƒC VÚ1Ò£xÔ+£qɸª­a\‹0ò1â¾T1:óê[ƒë–è! õÛ}–ØË´mÛ»û¸h¯ºD©bÅðÚÍ£¼®ð°¨„+P8Øþyö¡Šûé È T­á°÷ÐÝ~ÀD+÷cxTOÀ#<§á5J@90â \sFKwašÂ˜Côç]ÏÅSƒ~î–u_ø1ï`rR0Kôd ‹DsX/“‚©µ©Vâl:®þ"Ž7^ä¨êØúU™£Ý9;8ƒÂ §j„x *]ƒ}tv2>*nÁÐh ™%ë`íÿwÏ3‘¢nDÄÅRå÷›B’’w!K«=(úà¾ÑšPÌØØpmJÅ$ÒZæÛfFòæÙŠ>©èZ w}ý£0v´éYåë£ßM ¦–V¤Æ„™l Â0qÚ»ÝóÂxuãÜpç3H5\|ð`f¬vêÿðô0ÕxJ<Æœ|Ê+ºœÄá¤P¸ä`¥%Ô»cKŠk§9¿¹ ¦@ƒµTš >?‘"0^jÿõΤïvñ< v(JE¼ú)œ«n•‹*rjª•×­qXKÏBäÇ©R2zäîÉ®:mr//ÝäÞQœ ˆøHÁÙzñGäÀÝ)à±_7ã¼-ibОű«&Ä‘íjSzP]XD@ÓÀ±$?D`Še>¢¸t!aßdžu‚¹”¶SÀs;$ª-1©tG¾üó (·ÂéóþU¸hAÌó„¤N*æ³r ^ô¦#cÚ™ —‹¼.}̺J.ÅõÜÑ»0qE4ÃQz¥u&»O wí“ÀÔ2üî}ßð+þlœiŸ¹û†LkçÉ?ðá÷|aWqÄ ÜPd&ŒºOvœ§Øˆ…eR^1õ;„긡wJDÁ>„ýïã&I‰[ÿ7ŽU›ã¤‘jOmÞª,vW'÷<ý\TWN‡³ ÝVf4ýý­FìI3 í莑ãÆ$ÿd{NòȃÑ2Î6>ÌLìè No ]¾œN>71šê¥â!á‡EÏ{«¥ÏA›œNc¯|W¨<™ƒ½66uïò•Ô"N$X´Ö´šAžFúyGÞBןZ³è¥Øõ¾‹§ÊàÏõa€Â[÷½wºnhG+2^þiËÎ3;ŸI?lXÜ.ÑQnTLÙ$q ]™­­~$vUÒ´á{=ÈŒú²#ÚCy?Šâ®)+.RPL_PÚE2‰ïí˜dþ-íì4àˆg GmH³W©ïžÒ™héË•ôpêb…3äÉä—´ [Íxˆíy’šmà M©ìÞÝ@vÚ€¯µLö¯¢Žb isØ7G.-ô)sªªEY…AÈL¡!Ë>=EãnVÄh›Q™+Zï^‡í¬ /Y´ˆeOÉÒgxÇvJÜeq×YÎq¢)—Ê ÛÔ[•Å. QŸá7€Z¼ðN‡–(î4·‰ÉÈø/Pï 9“{V×uø“øt”?òrT6TÁÝF«œñ.³n nUÜìÔÜÜAã†É>hr=%îÒ¸¥Af)÷¦0||éEÚú4DfµÚš¢.”ò›‹œ{жÖZU_ªCaNk1¼L†ÛÍ^ç±aŸvå¤@© juxõŠú^M{|ˆàûdù"P+à vP™ç¹î¿ÃæŠ0: †¶ˆýëçÈUç^ -@#võÀNã$+{Uëü³¸Ø4Uð6ê ¥ó°»œ»jWE›ì»áÙ•Å)s^“9_÷^ëÓÓ'“qà1é+:©¾P]&T«k-\+x÷ЮŠÙ°P¬k.ŒM! Èp<)|Èòú¤"áaôÖr8tî(&DvbìDgcCÛ‘/ȳXks9í¦°m)ªÉ€O¥ã€n9»<û'Š·œÊ3!³÷‡)yoýA><F×JS3Þ bt­ )«›Èg6I ¦íÁþBŒ'dÔpÅ4d”7ÒûįýÀóËÔd´d)6F * ›^ê¢íw€&ʆ#ä­öæZº%%;-…ªÖaVm ú<9áw>add ½m#bh뜾="TMÊ ðí©%j~z=€Çïü­J8-ÁÝofq‚ƦO¦‚íW2¸ÎC«tW¡FÛ¾+ÔÖvC6élrix_ ƒéa‹Wäȉè“`:ôîø ‰É [JTŽý$T'SäÖù.Æ" |äVB?r#b"ç®g7ÉTñ‰™Ê¥ƒÿž³£Œ`Ñîƒ@ýÄ:êé:ÔL›ÛÉëŠL›ôÁŽ?s§eÜðDz ï3Q¾6ʧ='áz£‹_“„ÿ½ˆ½®„Ç9Ž*Z)ö™—b-å;*›\¼ñÔõ®²>cH”îZ¿YÖñôïSÿJY;ø¿y8Ê_/½äÙtʵƒêB`½ô¶ ‡+<ŸER³Îú]9T¤=rŒùp]2ѽ¡Å4ëp Ä'ÂH³?ò°§=ð BEWÓ줿§SXMûÁ´rG¸~"| &­@WÂþ ¢”¶:}ž#Û‘!ˆ×(ì}‰r&™dñƒ”1LͳG=*È(R^<ÀÿmóT #žEü0©Ý Ì~óäÎi¯ìÅÐm̹˸íÇ aÃåˆU7Û”³9 ç8ïýðÈ/C±U£sàøÈÆãµ&?dw*OæÝj¢¸ÊCbåÎYôfk\{SúrÊêvBü¤CÜ¥‘ˆÓûÓKÇ^n9«îåÅ…]-ÍõÜ8]ø8µåÓv¹àêçpñùG䧪¢¸þ›Î­@7öqÀþýFUqÃLÊ=N1°òÏ×Ùöô{lÔuLÀPs‹ª ÛoÌ h‹5 R9&ZLHºppÂîÁsx²®Å¤÷GFö™‰Ô{ñ‹[6»m‹`o\“.ÒÝäê^V"žÒ !ßP »õ/âñ£ÑYdŠIßR8$±€/µµ¶¬íájE >d1rW•ONtSS;òÏCN°vÃ÷k0ÿfžh¢a‘R“A†&AËUÎT¦@pH¥‡u\dÅÇÄÞb¸CÓ®ØKŒ÷óÿâeéæÊ;SôK,¬éÀÏnK.ý¢ð¯úéVW~kuÑÉœÈ<íÝ&…¶õÁü3îa«ˆý¯v‚Güeüû£Æ 2gíoáùQÕ‡1EžÓ¶—$‘VUzfŒ‚_ÐݰôkgÛð·‘ŠO'ÙœïÈç6 ~y¦†‚ã¡›ð†ßãý€¸+„Š/¤šäåºFÏYô.pŸoâ½Kƒ\•}ìaGNWXè¦lÜ)_Áƒc †- ÞÅÚª’ô õÃÿL„þ*Zز­ €_[ø0e?‘87kÛ³Èüe41SVÀ4÷˜Jìë>x1¹.Ù¤å ¿Õš‘®ëkdÕ÷üºv3õQø9µiºËfDGg'œèš|?JFZ@+îÒI ~C9 ÅJ á®Þû†x_ÖŒ!Å ÜI‚Ø=ÿÂALcY(Aj‹+z«ÝWœ|üNêiСÅýÔ—ÂDcGQŠH _rx­Ž û! >WY% &ñÙù6i¥…¯ÝçÉîîái5*1µw|ËMÈL¹m^X`IÖ9¡‘Wׯ ±—“­Ò83‘Ù¶~x‡ÌX] ævȤÄ&N¹í³,9é½wêÐt/Æ0'Q¬°¡>=F´áõãgª’ŽnX¨†ÙJbXÜ9a,×܃Q6pVwˆ¿Õc ô€`×I¿½ „%ß§¯µsÆ·Q¹e3F²¾Ê§îÎ`³9æ*ž‚^·ÿbz°e‚¡ÏXæ^>%bx@€^wQN˜æjIµŽ?‘´p€fÁ*µ„‚l×ïßD&ŽÖîüce2°*™èI' ö.cðѤ=Øë3í ¬ Ðæšxß׸xùM¤`üâØ¾DlɺÀefŠõª-qóÿ΋юW²6})–ÁœŠâ’ΨºÔ<[¢P+#%߉Åä.ï#>p˜yQ@ŠÄÇIzn@åŸ!{BR—ÍÔ;{ÞÈKñ‰³[]êA{6§s®ßüV´ÈãÊ`Jb&®³§åZB&e_R9®Nü±@¿¦4´ PêVÙngyOز¦ñ"MÀæž½VZ&,ÖZÄÐmHWîm?Sg ó³ë¤VðGê#›µüæ«ù0yKÿdߣ EÇRÈÅä:>2}TÜÈ]¢ÖɈÍøCÅE¹ôŒS¿KøÒéÎÆKŸÑ†üî/¥¢UMñÅ[kßÖ¹¾Æ&*Û,†½ó•¿}WÑx±Y˜ÝÓ”$õ»8ˆšìïIc]s¨íÙ2§g2þø¶ñ¤¬µ¸/(Ñ$·P5êcá»^ÑŒVÇ.R@’yg¿àÎ7û1BÚ¡r~–©Ähmô‹¢}5'x®Aãí:x’‰Er¹<Ú“6×d.J0,Xú[Õ!&/œ•ÂQDéu(ÝŽN7X¦›Ð«“z’²¢oÕ!WóqžÀU ˜3³ŠÊ«®5ÓLpUÓŠãû,/ÐÄÝð¢õ•0±¶Pxqƒ©l’5mrF¥J-טËÆ¡gJ©)™—ý[¼DÂÞxé|2ÚÇ ïÑ{¸ àŒŠ&°hÇ>æ½Ìv¢Š‘_š)Ͷn ¹ûèá+¸ºÇªV!«nìé6™œÆ²S 2áðŸhuœÆ2S>›ùˆ¬jÇæ9T°µKºoÀ¢i‘ƒhE·O¦gJv¢h1„šâx¨î@ É$â>ÎYŒ;Ò³1X‚ìäè0ËÄ‚¹VŒp„Õä'ž¿“‹÷Á½«;»AÓ{vžƒÑQW>”e”cP•ç ¤µÞ%DðÀÝ“ÛH˜–1'¾ åi4EÙwЍ¡·Ç˜mÔ›3©–êj˹4M°²‘΀î•ã)?–5.ù,|\*Ñ|£F‘ʲ4eSl»„‹ù´DYSIQ ³±­Ö%‰ë¤ Ôîv÷i8oŒygÔn—iìÿ(êýægHEve¾»¡(¢"(Þl2¼nIªnY8Ûás†Oo@6Ò®ø/]$Q`³SŠß·ÏÏĨ*0È:¨–}^U{_ïu”RxÓFÎ)%ß^,¢N¶çy›yãvMYµx,ç©Í·(\øRcBz,bõ‚Býš?§†˰ pÍ/äÄv Í5­$çQ7Å^;Óý¸STͯ©© ùh#ñ„D d—?¤h7J‡6 GO,é]Ç÷ãj±-WUêòÜîqàY;8Ù…~œžu÷}4cáÎåš`& ¾¾² ô}Õ,?,•»slÓ^ÇžaÕ4¯?U!½X!Fª_ýCÑÃI¿€åõ4yk¡;©³¾ñV¢æÉ>ƒ Ì? ð‚sB’DY4ÿϬÉõ¥“Õª;+6üï0*’²NÖý,Ù¼6\žP5Ù€Š8CNé0ya8ÿJ*P»/ñBˆ¤Y·½Â)F¡Å*5ö ð“U ¨çóA¡²\S±¥R$ŠÌ?¼Jmþê¡ ÊH}“1pö¬Ø"H›x%ˆ%Hº½0z»Læ·£ ˆD"‹jp Ñ45D䲪¾,k¸Ã Ý:Óæ"Æ>nõ†Æ¾b„É¥\›©{ÔlšëÜúG©’¦×Y¡ð3S^ßÌâ‡BA÷,·B%ËHþ Þñ€>R>¨ð5³ "ü…«Iz+D©:ißj›¾nŒŠ•Å}î~ Ì娻Vrÿa„‹Ë®uuô§@ÞI"t}$%ßœj–ÿ:!,xX¬ÆÝÄÁÈmÙË·I­júiÛ86rjëºiðŸ´à·lb#Ìè§òö$›š¬ìÉÕŽÖGßm_©`Z«‚Zœs)_õµÛ™O„…1UØ'@z†2\Œöþ_Í]‡ûž~⯗G8äD(©ÏÏT1Hè7vµ„êâÅaÚ’oø¡=à|c„V¤€Àü±ÌLÅõT•Jï? ÓˆYºP\—“ºI& KýЄIbðÖ®5¤7¼U“Iñe#Çÿ¶Ü$@ BÊ€5á+"¸'¡H$XLê­µÛÁ`'³ŽïÑc³nåE€›ÿ4p{ÌZà grNÃR<‹¡ÿ×+* IICò×yz3þ¸Usi-ü Òi ß”áˆ2™¼—-1¯¦Ÿžž&^%vÖM"¾}1p µÃ)¹Â}Ñ$å#¯±<ºâ0¦Z_kR˜€&nf_ÍÚÇL™ñ‚&H Vofà‚¸Ë}7%[wнóJ\:'ƆÝÓ Â~§ä‹¬óœ5ü¬ ²ÐžƒMÚÄø{ŸxÅ¡”Š˜=ÓÀÉ)’¥Rá(Âk\d¼%ÅZüÁè91"}*$ìüÂâbñôô´ù n4êpÄ$ÉQÂ/XûÞ:جmn4Ý·%1Y+ÓI¿7އS×/¸¾¥﬩œŒ¹\LXÃV†i¡ý³W‡ÉPÔÇéÔpÒ)VÐ¥šŒFzsIEFXï½«Š¨¤Çü¶d r)ƒÛÄT‚ u{äÊߊ2×{ïøNrš&œfÉÚ ‘*ÚI"pž®=“ _¶s¾“€Bm¤€qâ¼B&EU´¬ÞìL½únfü)=Û Ý­Ÿ®9 0—7„F/ß‘lÊ# È”cX!Ú°x°LÕVÖdU˜4£Xj@U—ú¥c{õgYœ:AˆØ¿´©/B,sвlÛÏ’üM [:ý S7YV&ˆp“¾³C>.:»Góö1ÖÃéñòÝ_†Õ«»oGý„ÔÁ¥O+»ç½màqþT¢lÒl||®ò¾à{qí«ò:–-_û:D ½Î–“ýØ„„Ì㡨`F{g;dx1–œ¸© êž°‰·çÖ8ä Ekï…ÞGFýåšrÛ2£ÆfyV ;w·+ zrÃ3öF>œWئa¯Ÿ/ LŠÌ‘:A n×2å΃Ö.…±Lçš×¿gªG'}±eå‚_ v”ôî«¶[¿}“J:FÚ{VÇz·ã®k ëé27Q¶fçª k‘IÏ„g´Î)‰‹½ ] ê„PáOÀH0iqø>§Ìó^E¨‘"ÝŠØßCD•( Žß’Eˆ,€bç‡+D…Å«Ž8dZˆ¡Pç;Îż•& î`ôgSæâçæïŸ)ªLª†¿Œhÿßgù„ ez_eʧÿFÚl‹?©Oõ© ß{¯² éþÃ@œ N§Y¥BùŽ"`©eÿ¡¬wõB :îPœÃÈ#[†Þ­‰K€5lËŒ 5s2›11Ì„ˆfY+_¾ ð£i·+X-)ÓH3JÎCÛßyGðƒU ¦áZGpWDÒËŒ}…˜¹Dþ`:y Y5¾úU[ÆŸ/‡û ËK@#ýc¦…Ÿù²”%|Ö%ôRPb¬³§Ø3¯hظE$z©‚OJ"4Tih 6•9,óT®®Vn£ôúÿ¯o'}'GÁò©x_|e¤‡Uõ‰#~f’ü²Œµ™O X‰`±'©{÷/í‹ÊŽðo§I™F÷˜Ôxû\ò`¢žf䓨qyRE”pˆÓ3@¸÷ ª½ÒÎQS@€&~…9¥"裂ɳ‹fR³b¼¸‹ùÞ‡ ·µnÁ©ä@÷¸ÏE—Q¿Z çÂáÂlªŠBhJŸx¸NXç~¶|`Q‚˜adM'Û‡€+ yüMîÎ &O×N|¿¤}=?çÌÈ3\†§»2ÂèH„uß~žÙ05ª™rô]ÌøÏ@o•ãcóæc¨$êZ !%Âgh›×2º¡OCN§螸¥Öy—Ý+,C•w%E{!ÉÒý=Ο4ôY”Á”ž‰™Kƒ<Ëõ.¬?¹P2Rúw܆ԎR"p=§àÇ~@½Hg–#:nüU©¶(šoZ g#¥XdEê’DÇ/5°W&ÊCF³h8 ÖS7‘cÂÕ~q*,§w©[Zdß/˜:@ùXߨÏ[3“•ZI{âr5CÔsy4þ]bG™{QM€VÙtÑ-ânqí! Ç –H‰”8ƒ[e½P¸¹d«÷JÐÏ~;üƒÝÑÆ^2ö¿°±ÕQ½zÝ–¡Åc°#®ìXýÙþ«»øvâÍŠ(˜I˜ãŽn„$}>|SË®MZZsܨô‡5vvHÙ¸HåûdBÖ©©ˆñXѼbê¼²qÑô°{¶rl•ý I›Ò.QÛÓÔ¦ã÷35ú=ì=‹%Þêã¡x:–®úôÊÓ+~}”:pÇ5(ºßG ÝÅíq…"!~þ¥»Aׂ\ ‚d$‹pÆ#,@q^A¦¯rœkÉžß;"+ û¾¤˜©¾³]Fò°q’Y5Gñ–á3îQúÃßR¬S¸så\OŽðÆ3ù‚H<£‘ ›!Bè¶¿¹ÑЛדۃv—b 8½ÿ¸Fš/¶A:œª­¨¸€4Ĥ‘úo¾«g˜îèðöÖ»ÒØ]¬å¥ÞèeM*§°&““Pž¬µi0}Ðs­x³G¹×ibéÙ WϾbø“9‹÷(G%7·5¨3Ù8Ÿb¯-è2!£ß:m1ŠxwNZKòšgçï }µÉ«·‚£d¥ ¥F`()HÎÎ uÂZ§µ ø?ܤ–>©+/å®d©afo¸ÍšqÛðöºðžS£F{#³¤Â@1!x÷´Î"*AÝ`«Ôiࢹ.6­A`#ß®¼Ž?Uâ7w0Ñ6ìÕÓ1~Ä0N§-S¾o\¥ÿ5íµ)Oû¢Ràþží­ B˜>@æQ¼*ÏEˆäÒ§þ{ 0‡™ tN&ŽžVj^ÊsYŸå ¢ν/Cöøâ"§ÚÓ ÉþD+°UZ EëN„éËÑÍÝgá|ŸœF#“ðVËU\ºŒ2š|ÐpêšH8—OÛµ}dl€ fL-i¬òüøHøà”ã^2Á#H˜¢xá_K¥|1‡†;Fï5‡¹ C{dëj¾fqSò¿V›†ÈÊÒœ(œqµŸÔWcűw6Zˆ5#¿;,nÐó³D¼•ªœ·égü¬&†ûxÏå|ù¿!5Ü1ò‹öqüíˆ<‰_™ƒÿ¶ O=ÛÓÿýNtºÕsOŸv{ÄKýÖn9f#Ü» Úƒ¿Š½ÄÝ^”rø€Ò‰,ÙJï SØ-–Ý“ÙíižV³ÔÙ×ÔĈüκŒœýÞ›;ZÁ¿–'ÎMFýHãu¡ëŽ&SºƒÚè¡ óâÛL¬W®AÊW©F­ßYg5ãŽ[ëàäD¥EÙB|‡Ý6ËÌV„l*° 4nù>WÌö>ûé>ÞüÌó—sÁ¶¡d²7Þy!ʨyOˆ„xá EK Þc ­\EKOK±Â SÖÿ#ö¬,žwÅØ­úhX É<[º~·_Ö±wFKoúå\ÛºûÝzz!îöÂSd¦w|s)‡Š>¿¶„úD½É´Ec’µÕŒ‹à0ê§Óƒ…À¶nZÉ2ÎUV©>¡7įLÖ<é)ÌU7WŸìß®}wLû‰£É«–œ‡aéOÅÇð¬ZÖÇZ2ò^ ¸f”ŽÃsi£ôdº‘ÑmkhÍ»û7ißÿY~×Ìoý"£oŽÆtøiÙ/Àÿ“´»›|è@5–…yÊéñüž'K]“wá¬×ÂxÜõÛìßM«Ï¤†¥©Wæåzïya) –ƒå–%á¸×H_ÛÓ6XÔ©S䌀Hä'ð17íû¾jÊI!ZñËë§7¦"0<u]]<,l=q:NÙ:K‰Sod¬é#½QEåæýÜóÆã‰…”Î2§îÀu­ÿØ>)¥µ±õÃÎ…™]+/m†/ÒIñâËÚôv»qâÎ’øûoï»F ŠsàUÍÒžtÒà“C¨5¢@Ý×.áì }o‘‹NKý>ÆkdÃV$ Ÿ¦’–%°ûÇ&€-áFˆxÊ&|[ÞŸ(E >å ˜&S%¿6é¾´ ¦¡æH`h,ûŽÓ8 ‰E¡º<ëÇÑÀ'/´áö´´_ÒËûax‚ññé; Z Ê^UÛòsšù¾‡D”œ£—ÝŠ†ÆÈGþY4ÎYå·Œ@–↠#B)çnF}ÎYÅ=vuTÝ3f‘ ,„Ëʳÿ^Iæ+Ì´;2Á‹ª¸ÁB jpU˜FôPÈž§üe5/ŠBr †PÿE0mn ví¡j¾òúe]’üä…Q¢[°ªtQ'—õut5ËOË㛌8•§þx(æJÜç c ˜“8%™gðgzñ©öoNj+°Éš_$®•èKŒdX°˜S8!:.5žžIVÌwŒ­Ä ‚j'GHàŠGæ~¾sè_R®ÎÅ ŽSÈ%ÝÂcÃnŽÐ¤7ŽV˜k`ŠöK  DYÇgÜŠ²…™ÿ÷·r«9Þò÷Q˜.ÄnjFòɽ”Ä·ÈŠPKXý3o&÷´JîHºsðYÕ^8 ¬~öKôƒýAÍ*y†Qfq(ÑíцIJ7ˆø~*Ýëû,OÝ£20F†›±æ{4S˰ÃÞ.Ç{°ÛùÃÙ˜N®ÀL‰¥#Aøƒ³™ïÀó´DoXCÙÏ@p\ÉàÀ«^¢zF?5”¸¸‰âñÿ6À¿3 âñžöUôtJ¤Q™°‚—¤Ü«!iº‹D ‡º,ü¼ý®á!)ãêkêÉ=üÓ¶†cåm½0\')¥=:„w Ò3bGJ‚Ç·,?œ­ ]Vò]áç zógxñZ€Q#`˜å_uLv§ƒÿཔßU!HÙ®0ÁÃBåâI¸{+uv÷k:'ZW€A«•‹M-Ws<ôdŠÉ¶"Ð¬éª þ³—’ƒÎ7‡É÷íuRI§š>Šøõrµ·¨½à„2§ßò cnÅš€~´š1>OÜ|8¹&n˜1T¢¨V¼ìa²n±å üÞò5všåu6üÁÀ„6È[ݺ•uZóš8†Â~º¹÷¼/í ’‰W×FÀ} lšÍ ãÚëš%yPóàÞK[žÚrêÂ1ÃÕÎ<Š.8€¸ê?ÿ;6W»g5\G¦{˜¢&PªÌUê@Ç•kÕ­¡ÄœÕ™žHç©bü²ðÑëV¾«ÞÀÓ.õõh¹S¹‰{}Ècç‘÷ÎÓ¥5¤¿»ËBCÌ]»ã†¶%¼$³½ò“Ÿ²’”ARÅ"NÎ> ûhnë°²mо H7V”h˜'²‡r0Û¼üXê땤ë yuyWȰq>À¢ÒeÃ!ën‡bD±g¿~;Qa˜ºOæÉü²Ypÿ·kpÏ8“2ç§—ž„k`Å&ø\5èË"Üò-ÀÚ´)ÿn¨eÜpòqù¬Öýy¾\›b~ª­ çRÿ榆õaW¤IÜœù!U³I÷_ìÓæ,Bþ»Èn,½’·—:EÉ­A“:®¦d`åŠÜ.ªY_&Wn†õ4TwMjéâ£- @ñæyײéõjíŒ_B¸{Ê´Jx5–‹Ú;{Ô΂Äk>(þI¨ØâÞ°_&h螯¥7ªÚMãÕ_ìÍ¿·ÿÁ-¤|dÒµ>l³£É×ŬíPKLð²É2PK °›VFM²ÿ¡ºplib/test_file.cUT ktêTktêTux èè·=ÉѶsi-š3&f ¼hŸAô…˜÷ŽÐ0°íHp?î±æÀRPúj?½¨’¾Sv#*ùÅW”@oE²·ÞU%žû*F(L‹î^ÎØ¦Ì«nÇ#*o†,EH_¢Yýö•]Ê?;8‡<|1Vð~hn–ºˆ±á`zÜ×'$ÖÔxrxá;ƒ|üþÐùcEæú»{ñO«f1J~\†¶ O9¶’ájåÅî52 ´ÇóO ¶ƒ-$PZmò‘Mc¼wdþ¤¬¬•;%׿ ñßBŽn¿ýw§«*|ƒ)bÙ’â1?@¤”òjdšGB„Á 4Àfë(‘kØ;2Ž÷:(£ýÄŸÄOÝ)7—1>í·I0‹²éÐâˆÁ½’vòÃý™-‘\ö¤6{3V>úïcËœ‡"ä&.F9‘–¥‚ñô¦Oˆ=× ó)d³C(5$°–nåˆäF‚í–m¾Æ€º]œeiè3TÉ cJoX§„Ÿ49fn¢·°aߎ÷ŒÂƳ1Ùî¸;{üaO%ã'‰Ö5ƒF†yÂQt‰ 8(B7ØêrEÙiçÀ¦¾vví ÄÝ£•YšdŠºvkÈLJ¨Înw4`343jë9gŒCjyoëÍ|Ͱ tÎ,à‰/TAËd¦œQÚE½éŠÕÃJäŒl(KÝ ÈàÒ*Ç{쟅Êjӯ徥qå¼ Ì;‚È<êg H ½¦LÅx(G´Ÿ«3\‹FY›=9N9D­ËÇm^všÁH¢–áñ c ¼mòòR/¶«ÎðI0Çm„ß«‰Çp̺¥Øi×cêHáˆÌÚ!Jš®CDž,£é:(;ƒí3ìûñztÚmE”lîéÀ€¨ó9Àd[œy.•ÃÖ PKM²ÿ¡ºpPK ¯UFŠãÔæjßlib/test_pwgen.cUT @EéTDEéTux èèÛéœ$·°ƒdqx!GÒ2±¢Øž°WÊÉW-ËÅHº”¾’Z‡«a,Áæå/ÌBæJûRHìÎùƒ+¤å6(iÌ-Gíåa!ƒÑÛ´©=ßÂNYæjž7ð²è«oسŸÂã=Ê5ÀB I¶9eÛvN‚©6 /䦕åoˆcýžîZø õäTWÍÜÍ=A‚Ÿn#:G Xa­ ÕqùÍå Ÿ­É«,:”sí*XúH²÷*l Ý[åÆh®qWß‘½)o-_]èßÎåÅ]a>¡´ÆÚíÇùm*ЄöëHï¤ÚF¦ Wý •.¶ì%éš\YÛRŒ¶>f]¦úBÐü>>iVk©£A‹¬b¼ÞÚ”žôGæ©ljZCŒµCœ›¡ïÁ0t)Û&~üáÑ‘ =™Á‰Ôóo;CiLç§ìèŒoÆU*šÅRG@Î^£öç I]§è¶S°å¯^^;›cñÕqèCI&ÍïA¹iÕïì-ÃåÍut&ô!¤’K¾ã TÊQk‰B©x\mtú#¶ò’YñÆ"ú¤¼ÍK¿s4w‚ö"F—Ðmxú·ó¤åa*ºC¢Ø~é›çy/èýäÉä[[DÒèb …¯fÒÈ 0 `¿Ú¤r™À“à Ð˜¬Ðöi-¿ ÚF· ûœåW½gåŠxî¥uXhi‰xJç%¤Í’èVx¦‹O¨L–àšjó`ž»~Pg>íáá¼tò“ëþ÷›6,PÉ_Ÿ‹Ž°9t tz/Žª“†˜Ð‹^ÏóD¤º>‡e¤÷€wþ›qÍsJ¡'^…ûÓs‚²xjeÀ€¨ÐÒrA<±û/ hMk‰Aø½­#¼³¤‚§ ]Qm7ŽJŒ!”=vàFß$F§H•3×ïÔ6TLàãÏú¸ì±drîcÙ7¯-yG)Ø+·gjD ‘ØÇ¬Ú w5Sõö6:òÿc¦v$ Ñ«¯t±Iäo†Œ,ìö@šÄXj²;û˜]&ÈúÎÞÿ%‚’9!àW¦ÈC  œ+_ký2'ëmã®Np^“°ãÜO!ì:¬Õ2žjC‹²Cð­‘§æžÆ«œíýž³ô@*›w¡û÷6ós,Nàkø“½˜uSŸO<ûðMÜdPÅOÉ%'xlPŒ`—*•#ËÛ|.”Ky̨¸oû‘+Qüg;'“benÙ_LM’]Ü‘HV‰ó¸el Ï=RL]êfz¥[hAÙ²õ,n7¶p]„cc̹= ÷4hÏu†WÍ3~o¸ó‰©í>j›¶}Û¨M2„M£¬CT¸£yÝzÄÆ˜‚_’ñùð«¡”7: uIΡ6þ”!úY%©whFúܱ[0=ï¤ùp|{ÓÀx^À: (­‰À«Éâx¿šFB·)ꯡ•¾þm„ïyíA]ò·<¸Ê^æ2O×`±¯ †PKŠãÔæjßPK ¯UFÕÜD] lib/test_pwdict.cUT @EéTDEéTux èèaoh¡è,eɉ蹪³ÖÞðÉÌùs_ò¢ R«‘ÄE.IÞ¬¢w¸{±3lõòuû–#bL½8Wo$Sv_à.™Þáš\ÄëE4WýÙ¹ÆJ›µW9_#b2TwŠl÷l6þ¾†ò¤‰ÀíW>‡D ¹;XMHeeÔþg`i®¦õMˆ:}'éD7‚>E*c¨,S’äÒ!n¸éCVH49-[¼Í› [e½h²º6ÿ2*Æ|RÀCOaÜ ðxCûA¼…jÆeÊÆa‰vÄ}sÕÇ=¿²ƒèl Ê„tç±JIJÜ៚mMáêŒ ?1ôÌpídT.pU„6̯êê!gÒœg½·ålÆÅkê…GÐépÐqý3;Úëï¦èÌ4VÜÕuÿ‡Ÿu“ô”3 ôPýU°÷âß*^±‘MîE¡^R»[ð9„®¬YMø"±Ô¹ yj¡i\ëó—ð8 'ÆÔç 5ÿ`ïµ?— “¹û_bS;g_:)JžÁÄI–ß|ÜfW£ÝÅlñN„Ha%¥‚ŠÈR9]_¡ êöûÒ H™u÷çj€Öo›;b@9Óhñ©Ò¥t  Fê¼ó1.Œ{Ö÷®#Ï~³ù÷KÐ>Ýþê¨BŸ„BØ9´. Ø+Mp^:*¼æYo®)°¢ÕJ°e‚À„ÜÈÞžwÑ«sÞEv!zZ.„ásu®Ú'±+ÞV“É‘cy)¯ÛѸF o b^™õ=!nôr(f3A$ƒÑeù™iés<3EdØÁ7a`œ LèåÃóÏ´~~9¤„UkX*v ± }Ý10•j-‹ͼå&5 Ï1ó`€m)O=šíßíd౉ø·C¼ÛÀcHß*"ԙϖ€ú¯Á¹_·ãÒñÒ™æÄù‚ÎH¥¯B“²×W­Œ“ÏÅhw3Â8I ÜͤRºÏbˆ0-»ÆÓ^Ãm;O¢ ÀCŠŠX’ ‚Ð:;ÜR ÿ“—UÜvH›M«>ɤ¯ÀçÑßjæLê:4Ù…2ŒB\»°¾:Ð~9þfùÄx©LÁ‘€C05Ìi{ê ˜SöÆj›-œÒì;dV'I`UÅž¹LbÞ7¿~~ Z i¿tm2ˆV<êYmd©b\{uô2¹i,N¦ÁÓñËë›&Ãæ¸þ´såÝ€]`ŸšŒÿ—‘X`¬¹ð`8é§Ý˽o{Qsž²ÊÖ[,‰74\²¿I5ßräX¨h@ÝGñ¶óºÎÄ]T1#Ô³ûƒÖÚRø.Ôld¦—袀ÆÙ´Ë›îNâY„lÀÌ\¬p—°òŠåm=êPKÕÜD] PK ¯UFLð²É2´lib/test_crk.cUT@EéTux èèPK °›VFM²ÿ¡ºp´!lib/test_file.cUTktêTux èèPK ¯UFŠãÔæjß´4 lib/test_pwgen.cUT@EéTux èèPK ¯UFÕÜD] ´ølib/test_pwdict.cUT@EéTux èèPKVXlibzc-0.4.1/data/test_bruteforce.sh000077500000000000000000000030111331702632000172560ustar00rootroot00000000000000#!/bin/bash # Copyright (C) 2012-2018 Marc Ferland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . ZIP=$(which zip) CMD="libtool --mode=execute ../yazc/yazc" create_dummy_files() { for i in $(seq 0 2) do dd if=/dev/urandom of=file_${i} bs=$(($RANDOM * 10)) count=1 &>/dev/null done } create_zip_file() { FILES="file_0 file_1 file_2" zip -e -P ${PW} ${E} ${FILES} &>/dev/null } cleanup() { rm -f file_[0-9] e_archive_* } if [ ! -f "${ZIP}" ]; then echo >&2 "error: zip not found!" exit 1 fi while true; do PW=$(cat /dev/urandom | tr -dc 'a-zA-Z' | fold -w $(($RANDOM % 7 + 1)) | head -n 1) E="e_archive_${PW}.zip" cleanup create_dummy_files create_zip_file EINFO=$(${CMD} info ${E} | grep file_0 | sed 's/\ \+/ /g') echo libtool exe ../yazc/yazc bruteforce -aA -l7 ${E} if ! libtool exe ../yazc/yazc bruteforce -aA -l7 ${E}; then echo >&2 "ERROR" exit 1 fi done exit 0 libzc-0.4.1/data/test_non_encrypted.zip000066400000000000000000000250561331702632000201670ustar00rootroot00000000000000PKÔˆžAõªLþ¬R config.hUT ïºàPóºàPux èè•–ßo£8ÇßûWŒ’‡“ª.ÙܽN§# M¸KH¤jŸX~˜`-Ø‘mÚ²ý!m¥VêC:Œ?ßñxfìÉ-Äœ¥ô`dÀ’0"BEH/Î_(ƒ¨:ý[ ‚ž·“›ÉmÛá³ÕÚ=Œõò°T<#aBD³^$*P)ц6’RFÀrÌÙÚ Öl¿„iííUR‘r~8Pvèó^o—KÛyó_4߇)Ð*^B>£!#ðW’§13²¿¡‰ Rš“ äÊ|@ùõýÜ VC€”)Uqט¶ãûO;ˆ-HÁEuº±6[÷iRªƒ½Šôü†:™Óhrmφ"žòõtz¾‹G>0› t s ²’©Âù|òlÍ(b‡Õ“æþBA•Œâi]¥îO«©!²Œ¾$TXamއ—ŒÆ` (Îsh&P‰afòG~¡ ¸€¶ØÚ¶³¶ #ädTë9aA€§p ãï8Ú+væü?siÁèG<ê‰-L—ô|äÈ…’rT¾CeÆË<lˆ‘§kí¶®£"±‘‘‡,ùçP„47b^ô…–yì´ƒ¶b¯„cn>ÝÌ™„¢ðL„¤œ ¢6%¬¹ðÕøjLûèʪˆô‘e˜¢á1û¦û³°3Žœ£Nq7ç½´½»†Q¦ÔñÏÉ„qI©ˆú,¹¿’„Ëõì­£Þ|lÓñl˜·ãòRÂŽ˜+Ë\ ÷Ô £œyU„é¸$fLûþ¸›)"èksßiʹ^Þvïέ›1œÀ-#rÇ„%4mїξ£ ë»PbÔ¡z¿è(á²JgcŸ’ÊngdGÏã9¶¯ìì¶žýìü•‹9 hcõè[Ž®/Z"ö³H] §Âdeaõô¯¾ŠtÞDÇŽÓ°®=´¤’¨;fÆ¥z›iuÙã~SzgÆé96.›àïm| mïï=Ëf¶ï_[uº%qϺ9uß ö‹TUN¡.qmºØMšÛ…½µ26¶c?vWÖÆk~×kꛤyÓ%ï Æ¦ v°®c ) U©/ò“£‚ª2}ƒÔ9hršt5›š›¾•BÀºïÁ› ˜q.êŽÇÔ|Ó—ùoõ¼åa=¾ð¢ý^¸øÞ/v–úPK0|šAŒŠVW config.h.inUT _ÛPïºàPux èè•–Ñn«8†ïû#õb¥ªMÕ³·«•HBÎ!$¤j¯XC° vd›¶yû“œ–ªp¤\DÃðýãñï1÷7°‘"çÛQ1âb0C*1˜A®du|X+%H÷ÔF˜d¨(÷æþêêþ¦˜Ö[¨Pëd‹zdÃ×µÈ07pƾOÝñzÖ¤²½6XA)·[.¶=©þr6ó‚Ù‘›s`$<Ïa/k(’7 ÿde¾£â_8T9/±Í›;O$ì?N‚x~™Æ…1ûèQô²rÙf…•TûKÄ…»X†/CxÚdTæ%‹¦Tä@^ÉÓ<ßã)ÚÓ‹-dQH<¨ƒâ0à Þ^ßk“\îá #ª3¬‹Äd ìZpÚžKÈuàÑöœñ,A×é]Æn y¸€÷‚o   7R– )ŒHFPCÊ’Ž;=R‰â´+€–’ÅËñÏ©6*AR!ÈvÉæ•N{+oåL~93·§–$ËHLS ¨ì¬P¸“ÊhÈ¥¢ ®?qºu™AJÿ¼~Ži’„îjF=By]– ޶¹} ÀYôûÅHDo¨4—bï`⤿z_¥¶í-{p…‘~Sd!‰°³ ëv°³ýÆ,íÉ ™· .ÚÖ ˜“¶eOnòê$ž»Î”p ËIZ"à‡AakÑÔ+p¼gøûQW)y¥w¢´m|楜 ´¤1EræÖ–VHm~O™ÆÒô£gÆ®¦íÃøÑ£/åã#s£xìE¬ml{ h…öhYÿÞ-y§Í¾ÄƒÄ ËwB:!–Èúν½ðïùä&ÒÉþa³›É}øDÊ$Íg! ì”|ãBcŠÑ䘘ÚoüØàÎÀ;7…ØÍг†—¨Üôð{Ÿ¿9Äé uVªæøR#þ³·å_Í$”T[3j芷yïR½öÈEþPKÔˆžA»B\!y config.logUT ïºàPíÂÜPux èèì8]z1™{>%N$¶ÄÄîȊƱ½ 1YG¡›:Ô%×w±Zd“Û%üÛˆÒ ð‚bνEÑ6IBb{.qéuºX`Ÿ7/ºÉÊþ$m²òâ>*ÆiBní˜8µ>È'G@PUéµq8g‰€ h”ƒ¾<CÆi"<Ñk rÜ„Žxa€ì®ìÀ%¾P†Ü ä¢t ò ìkŸv¿ÆãÇДý!ã÷KßNæa´R²ïRcÆI`¯(9"®}„YEІ+ey7”uuVлX3ËÈ["hÑKé©M™;½¾"÷ÇÐæé&o¸†Ç=2y}I¦)%Ï©Cz=ÒŒÔþH7È›é1ÑÔžÖhtÓ8ê^{A7C\c‹Í¿üsDÒàcÞ ÞiG eéOœÓe0ÛþœÉÞÐMwA“ø.ö‚yX@ (3ÖW¦€+ÛYâr‰,T(„±Oo¨_à3ôn@Ei…ÆåxújD!ÔÄG ±QøZêáàq©Uü¾ Wøœ®R¡]ôa£¬h[U;A%'qEÙ2uÛjîHÓÌÁˆ8Kê|D+ ³z6yÞAõ¥&`ˉíû"–®Y#Ñ8õ“bÆÝ t Vï #Ü.i²¤¹N=ß%4¸ñ¢0XÑ !à?b; ê _ sGc±ÏÔªŒ'K°·Ûsð]/Å•p¬~ ÛµµD}aß~” † ‚y˜‚cØR*ÃXª0^¥³7¨‘ º6ƒâ“oZ¯Ç?ìK(†ºS–5ÜI.]¯ÃH àònìÈCw%㬴û¦!Ð^†·èŸ¹¯©¯í ‡EФÁf$D8öu:hLàMø­…>쓞¢Yãp}y‹eBZÇûè€zäED)™„óäÖe~bfθ ŽÙQgžC°Í——g7úÁˆypøL²AˆN`ÅÀゾ_&ÉzÔí.‚T £E×ç¨qw±ö•e²òŸ*)/Œ_8jœ RS‚ófœñÒ0cXòˆº{"ï:x ’  4Î/È/ã««ñùô7Æ`Ý$¨ák­¼$ :¾} që—lø{¸ ÈKÏ_¡ùâ·ïÈ øvŠ$Õ>¨Á7?€CRÅæAOeÂm>Âft ªöwßzcûÙB`²“£u{0ÕåœtÈÞ7o<ÝbB‹L]¯4_á ú~'ºVϳ® ¤e,S+™aœÜK çà•?u)Ic.OÔt u Ø è‡Ø74{eëv$Ÿ5D½-w ¤?8—útMí—èo“ž\G%øžÅhfBž~g6°¥õòlÂPúŠÆB³:Ôz¤us~e'¼½£íWMHû3ªÕùCp=”©l¦‘CïÐÎÒ3×C Wˆ ï ÀŒì ¹;$A˜€ª>#Þë“«ãW`ãg§g§ÓßÐ$_œNÏO&òâ⊌Éåøjzzüæl|E.ß\]^LN”†$­_£3‚´n˜˜ÞÄÈ”¤ã$^S'VÇgg'ÇÓÈï—'ÿ~6½˜ýr5¾¼<¹:âÙ»¦êàúvy–Òë^ÚIÇÇÔ©ËdÜõ“°sÙk°áÆÔŽ 5‘hXˆŒO—ÜzÉrD9Q\GtîmØÈð óJ°Vž,a ¸ÐŽyM©ƒ¥:í@’™FþQæÙàÛ'Ï÷m…3¢€¦mÛŠÔô: ðXöºhb„Ýâ;Ÿqîòæ\‘"êS;ÆY€óãD1ŠsžœÍ¦Ò„`LÈÿ{" û‰]BWO ýb¤ÙÌÙØ3pÛ/ˆLÜzÛ¡‡®™ Hà5:¬ý#¥ðúu’¢ –ä#2f<7;k^Ú1ðþähXàåS,ZŽœ¶spЪþÕÁ/ì» Ú ’ Ú¶k·at£À^û),Åw/ð’9üÕA#¹+Ú‘PǾMŽÉGa®n{9Ÿ S¾­¢v?ܬº¬¹§˜ŠÚY8ø'Eí~ €Å¾x'Ueò¸+(аH)¬B—æR@ù`Kj‡à]êøÞ:¦Ø¯|`ADXNâkÉ(­×~þÑñÃp‘IҤŗçäm˜7ÌtíȃÚØjÕÙÖ”é'AŽýaZÊ|dî3ÿÌKfÎô³\ÌϹ'Ea4‚" ¢N¸¼O@^ª C¦š¤Ùù¹É1æ6äÃ9^BÌZ§ «’1½ÂxÀ+̃ËQ¥ž9£ž¹”¢Åçð˜ãþï²jÔåþ_„€xBÅ+aa*‹„?Û|¾á,E°~]F¢ƒ|v%²ÐgìÌ.Û€DÂ4ÉçN°Ì• Y²­¨Ô«WÒ•tîóŒ1Þ”Òn@ÉæÚ ·sý“yëFý¼-³`MêÔ-Â-e¹­…qœÉº%¼¡ùÙ¬ ‡u¬*HÇAD”ºzuy¡nhÂd‚PêÒË¥Y!ä,äj[à`ɦâÈ(ño˜V-7}¡Ž“™ôvË6e‰ j;Ö'…¦‰LU}g ®Ê™©w*»Y[`âX¶ƒab¨´Þ¦>زÒYÜË BÖ0Ó¿‡,—Ë)wîp·±DN'äx01-+“PÆWçB»7^åÍêë¢B' (u©+Á Âoytéš. œ»¢è(åùÕ’j]êÔÌÏx(ÍxØ74cþudõ Ùº~ºükÌæa³Mší&æÝÍý&¹¦s¬,›]%Mê2O‡L š#±¿×3G¨J•Žøíl(;^ñÁfÂeµñlV ÐÛ;jÞC:øåBÎÁ²ÓÖÜ‹Àï@™1 Œ K–ŒÙý:RP‚@éNmg)Rñ`!1ÅýhÿþÊ †´•¤ ˜îÛ”I4,¬^ð ˜M9Κ`ªçAå£ÚPÃÝCñm¡²åõæä'Â&ËüЦ…ã¹Úë(õÃé=ÛñæÞí1õcúYè™.ÒÁ•½öÀ-âYg¨á‰ƒ¦êÖÀ„¼Í¨ý³³Ã/ b€(H·ØdùZÄI”B> f¢AA!0A£-âØCž(±(,EOo%bx9~mm¥ça®wHž´óoŸ<:"ÍwjóÀ7†ÄÄšxAJs»LÒ(¬³Ë}*šô=ÃÝOå^òÏ·×ÛÝVŠ@‡¹?Ì[ð”„mmÂÑö+àŒm3~á(ìc›ìg+M$ yÖjØÜm¨‘Š&ÖÊŽâI+ã?Û?³ÁýÝz ¤G9ÀÁ‚ü ûÿæà¦`3nŽPˆ¸ÌPGB3Áϰ6À6p)q-òɸàëˆÚ z.§Çú9¿õôh™9'Ã&Í!æ÷QâVV%–mŒÊídú#_!Ì ‚Å‚nÛE_Ï'‡)7iåÚ’›×F–7°¦Ù3øµ®ƒÞ˜ŸÛà9+¹¡q$°ÛVÉØ÷&l…ˆï¡Áú{û[‡Î–yKüUf-|¶x’{cÈV±¦äk¾We&³΋l3{ ôn“̉1p/£Ð&–Ù&º¡@ØÎDWì÷«CÍ}ºaÇÕ|ŸuEq³‘w¸qòœÓQ6ñæçä=àÊC–ÿÔâ쓃&Sò„ôÔýŒ_Ïî<ÍC& êaá¶oå‘ï%PÉYåo½÷í!}%KdäI³h’×@¥4a!Ø8nnÍÊÖt£½mã÷OÎö¦¸Ïs S¾®[,ö`eèŠnÀÿxß[Ö¯ n¶Í,PÞÁžÃåøv ø> oõ½¤Czïù€âô1òÀJ³º4`g€ù©65^'ŠEOßz”+öï¿o“Xˆ³3lH…–”7q%«¾ÇÆæ¦Éí:îåóc´ÐκhSWè …Ýƒ69ŠêNÚäb?¢ )€jí>Œ0~íÅ$hhCv{,ÒêõÔ?®§©Õ›Qd{Àbº'¡ámY0'¢D*Ði=Ë|‘íþÁo”Hûà¶3í¢ ÄbÈw”刜‡è!—|s“/¢NFwØ$ç ýU“ÿ_×äåU|*­ÉP•¶ðde!µžú:©ÕîkšVcñÿId ý¥“_•Nj¦^öÑà'ÁeBÚ¾„¹àί^a|^¨tÄÍ?Cïõjî¹!ª hD¼ä"*‡>(³<>Ÿœ‚‡_RÛ…èX>‘1 Uÿ¢ÐÇ«†eô­*=áÜ*'|Ïé§±ƒtíéÕNŒÝ÷ v#_ÝÅ]¾Ã³¬~‰„êŠxóg1…%ïWÅS¶_ú5q„ ò×ÄÔ=àù¿&ޏŒ¾*å†jäë3¸Äõ‚¯ÊÜÒ¢“ûä¨'ÆH^¼Mv•’4¶¯=ßKî*ŸÅ]–h™Æ/vH‰–<࿘f™ÛÛ³¥Yÿ®4+ï™LŸÏ^ŒŸˆ·èx5þ&óÛd6ýíòd2{Uß9™Ž§µ}Óçg§Ïê{P>u=¯O^_\ý¶§–‰Óóén§Ï¡»®çÍù)tf=;™ÌO{Uö¾ÈJŽpz#!sñUqyòP‡*®W O<•š/'ÆÏ‹ [à#[*Ö¾‹Ü–‹Ú™dKšQ&¸¨]Y¹¾ûŽäíÒr—ÆÍcpi\‘1ž6ìl®-ux÷­H¡K2fñî“«ZEö^°c!%=”ÑòØQBÛJHò­O+ž²öæ×ýa 84pèŸÆƒÕ¶Öû+üþ_‡Ý±*C¢óP2ºQsÑË^þÍÙ«lr³Ùɯӓs\ëÉl&ÙÞäüÜkPsçE£úß–à /áÖp˜½Gà× ùi5¾©nyX;ï´–^~4{qzv2»xñbr2=;NÈí§ô!Ø5;!‘U{ùÕ°ƒ]l÷¥]ŸÏ~sh îÉþ†(|þ\”?a÷$PS8öÈdOuùË|#"!ôå÷Œq²“´¸“óÒCéYjvàÁ®5å…°m *Á/?IÝýòMð¨‹íº!Ùƒ«$Jo^ð‹ëSŒn÷ïbéÚ«©VžÏKû€&;ÆÙ±øB4Ë—^aÙò'z²RŠhš¦ÕÐ÷]F|à 9!ñ§<¤%àì£?Á ×%tÃØ¥k¦f–åŒO 1¾¿žˆ/¡Ù)ÞÌÀ!ƒ•ø6×ÔU³f ÁŠtž‰`†. § •÷ »)3·¥´Æ4Œ/ó€h–y#{[ðpO†­È4J-ý!ÏH®è,7j OTi# VrwÝ¥tï¹V‚˜à2w®™ÑWK‚\Ùo•®ˆOƒE²ÄëÚÒËð–)»¶$R±DÔ3ûÚÀ2¤þÞ®,ñ’ú>»bÅx:3‘_'§üv ÀËCi;7…MÙÿß?ÌÞÁÑžŒ{ݾVõFþºB”ìtgÅË—Áwƒ±‹@âpýž°^x‘z–5C’³ ×2øð_æ. CßYÚüžX™}øYìe/ xá\<¢~h»»Þš˜}SÈ€:â±¶9ÐÊ›®$6ø¼§ôö¸L zuý«*Üí«°í놌ã:;–&a©bÐ_Ûq<“좜º¾‹!iê®dÐÒt½ÊŒB~¡ BZâ­ø;xôñõ\j–ZŸäÛøø¶ÚÒµr'=1·t½ú;%C0°R× üž,û„ˆüˆ \ž‰8†Zs·áÞ›#Vò3h6-âD)Ji‹o“·Ÿ}Èp*Ôê^>Zšð©ÙP ÑãþâX î„eˆÞñG©gPN)0‘uÝ2Q2¥5¬‰Î©Ú[YÉÈ@" ¥aj ÄÃ×jw_*¦ò…I¢¿6SŠÎù[D¼½_¾¨ÃüHšý˜Â—hÖ@¯Ëü-–‚—*Ö›¼û%£ˆÝxý³ûßÊ“·äý»ÖÛñ³ãç/O¯&Ó_Þ‹ŸŸ¼Û‡~øï ÀÌÆÿ²;ŸÞçÔξé¾ë‘wü×]7  Ù…zf3ÿÒu›äÝÓ‚ )¹°µ/#­¡:üì³aö1NV0Ï’°†½ºBÒš‚/ ?J]ƒ²Û‡j# Cqñúj¯¿ÃWöÕá—]Ä:ïkß½’XÑwºí¾®ér>ÂlÛ†Ü+ðæ(ËRýˆ4;?4¥f}çl«EëÏ@Úfà@_"’aí‰=o®O¢½Ê6†[/’`†BÖ«€ÉK Ë’¥Vâ|[,wæA؉’Ä㟊Ÿ;¨ îU‡4*RqÀQe—%G;^‰ç´š¸Ì7¶ïñ­‡ãƒƒîÅõø‡=fÁ*”?¦~Ëe€•{Ù•é÷2ïu/GÌתÃ`Pù§³ß˜#—§Ç]X›Îzÿ§·címG~>ÿ # –Í¢Ž-7mã.´8ÇvR_ü‚ílZ 8•ÆX;òEN¯Ý"ÿýæAJ¤D:i»¸MÄyðMjfÈ•+í<ÍÑË#„L׫Ù'“¿ ¯€ÈµóÕnòòoï<…¬^¹:êØ¼“›§ +êŒc–±7C% Mh¼ô©Ži‡{Ò,&—q”í Þìîž_wé=›úa¼£oœýÓhx•¡F­öê§êߨ½òª£š%¥˜\®‡ÅCû-V×’Užƒ¬"*@‹Kö jõ—Þ©È7®êTVº±ÝC‘ÑKp³ZFËíê+Wj®ý\ÓLŽLž@N×.Ô^ºd_ÕJkyb†ù©\®^T’˜ƒÂsöê6^ãõ«ß¯~ P,±-TÔlªóÅçê-º´1e®f®Õ|ÖÏ vôÆÜšÔÅp=Àè41‹¶‹»e ÍÆñj÷Ýf¶½¡Çêul­‰B¿SÆÅVõÀXÕgƒ‹*E…,¯æ‡‰Õ¤àeÝa0€–ÌÑ¿XMįe¬úfñž‹§V‰‹©1-×ëÅ•:‹äØ”‚Äò {§¨9/žMœ$KÛÎ94¼«1õÜ^ùmÙæ k ؽ§€´¢|¤K=ÖFê›ÆBÆ–²˜±r|tglªÂö< F^Ký.3rP¯½6ªí±#Ã$«çåÊÍŸŸ*Laõ5é+WÉ>bkAfD$£n˽j›F ª6k6û±7r ù#šÖ»NëwÓeå®b Š] Àe«Ÿ)’A±,¢q®X=x»Gv\ë[¥´>g‘Œ>K+`[ñp”‰ÐöÎ…¦œkÁˆÅígÙjÉd± mw[°Ó^ólR dh‘wg‰ópöº'>¹F#wYîâpézmgÆ\¤wÔÜ]çì]‚íî8ÏV$Ø•©Þ‘¡wñûY \4çälµœ%y6Uàó~7›)pm)à§›ÏÂYœìú"Éz%oŒ)¯úNž ÇW¼z#yÏ<ˆzv¨ÈÄ·ø\ÙñI7¯+ø1ÎzÃ.q ÜEÎÛ`¾0hc`DÛVÐþeêN@ÅDvðRZ(òîJ¤9uÒœZ4Db{OØI§Z’°ƒÇÍÖ˜¿¡Kp5èUàt£>Y(u«Jª<Ë’Š˜l^ž‡gÜ€ÁžŠÂ%Ha’àãV6Çáì®Vñs ðáÉ¿ÚýQ¨Ï ãæ6PÐxnòAŒŒàñ¸æAFh¼Qmä'cÒh­7ÞOâ_¸”3V¼ƒ&·±ä;hRJ8QWH¤4é`Ór|} 9ÈËm’­CÄÒÍ,"ÎCÌ1ðNKcÊú–½qQ„>Ž ¹n¬¨J¾?•^µH¸"ë´5°ÿÀÜøªàÙ«-b6ãSîðŸ)ˆ&e´ž'o‘ÉU„uc,T Ö’4Ø}¶7ñ€ðV–p$ÑT(gó9è"‰£¾oËP‹—Õ™ä¯ûÕrùÛÕÞUpµ÷‚C‰•=(×^¨zdŒV£²L²'ÊjïªnftõËU]çõõ–8~*`øÿ¥ PÞ[ñý=yÿh§`D(GLˇXÞ!{õÝ-Ź žüöH5‹œäæ*ø­X¡õì ®"¹Z܆úŠc¡r$6Ò¾‡ ÍsÉ(¥ÆmçQjèua()¡( Ž=ìD+6õÖiJQÊÛo<ªÔ±V×lõ†­f6øo“w^ïÁüî ÚÐa(ÿŠªU}vÿ¥º^&é¶RÁȳˆ>[S ƒ@”šývgtÒlOzÍÉ»ú–Aò´Ù›tBñL§§ã Hbj ‚ˆØßÿ+ðJ{@˜Ìg!ÛÓæEo*ÿÚçfº3>NºÓ6™‡¢Fâû‰ 4 KÚ¼˜Q\ûáv+ûçÄ&¢ŸÉ‹cÎ ¿ó3y¡D¡DD2¢(p’ ƒÑ¶¡8 0H)I&€P‘ÎOOϼô‰ŸZ/Æ1o}8#åð2‹è&%5Ì¥MNÚè†àè ¡8„ª%ìõ¦Ã!LT …éɇþÅ´ÛÃ,Q4=éð±Óz7”­ô `•[õ<%¨O_è¼ïtÞ‰W]pÀE©;˜L›½žl7§M5•~Às¾×GGÁh<<7û&M†œ´@>žzp(;ìÏ•¾oõ:¢ƒÞ!Ixv?ŒóúQÿå®ÝNsî ¼ÿ|oX¹™ì ªÌ€H:Ë@+Ýä…ÄÔÈgowp:üÑŒ³?9 º§ÉTråÞä­æèÏ9‰’Kô;í.©Ö_„R`Bã  ±€×GDÇe‰’òI Å_QšÈ\ BávÊHÑËff „±4Ã(÷-›üb õpyNe$ÊA 69,«IgÔ7§Ã1õ˜¡– ‡^j(£5Þ¶ã Héw‚'eŸ‹ò3§w¯‰ Ùvx1nuLèÙàÂ:÷^ަïÆÐ ã€l8í¶Ì~„4hwúE^ªX»wÚXõ5…ÂG&Çj6RAó¤×‘½áÙN« hw`:Ø8 /ÓWÌj¥ÿPKÔˆžAõªLþ¬R ´config.hUTïºàPux èèPK0|šAŒŠVW ´îconfig.h.inUT_ÛPux èèPKÔˆžA»B\!y ´‰config.logUTïºàPux èèPKï))libzc-0.4.1/data/test_plaintext.sh000077500000000000000000000036701331702632000171410ustar00rootroot00000000000000#!/bin/bash # Copyright (C) 2012-2018 Marc Ferland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . ZIP=$(which zip) CMD="libtool --mode=execute ../yazc/yazc" create_dummy_files() { for i in $(seq 0 2) do dd if=/dev/urandom of=file_${i} bs=$(($RANDOM * 10)) count=1 &>/dev/null done } create_zip_files() { FILES="file_0 file_1 file_2" zip -e -P ${PW} ${E} ${FILES} &>/dev/null zip ${P} ${FILES} &>/dev/null } cleanup() { rm -f file_[0-9] [ep]_archive_* } if [ ! -f "${ZIP}" ]; then echo >&2 "error: zip not found!" exit 1 fi while true; do PW=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w $(($RANDOM % 10 + 1)) | head -n 1) E="e_archive_${PW}.zip" P="p_archive_${PW}.zip" cleanup create_dummy_files create_zip_files EINFO=$(${CMD} info ${E} | grep file_0 | sed 's/\ \+/ /g') PINFO=$(${CMD} info ${P} | grep file_0 | sed 's/\ \+/ /g') POFF1=$(echo ${PINFO} | cut -d' ' -f4) POFF2=$(echo ${PINFO} | cut -d' ' -f5) COFF1=$(echo ${EINFO} | cut -d' ' -f4) COFF2=$(echo ${EINFO} | cut -d' ' -f5) CBEGN=$(echo ${EINFO} | cut -d' ' -f3) echo libtool exe ../yazc/yazc plaintext ${P}:${POFF1}:${POFF2} ${E}:${COFF1}:${COFF2}:${CBEGN} if ! libtool exe ../yazc/yazc plaintext ${P}:${POFF1}:${POFF2} ${E}:${COFF1}:${COFF2}:${CBEGN}; then echo >&2 "ERROR" exit 1 fi done exit 0 libzc-0.4.1/data/test_zyx.zip000066400000000000000000004607011331702632000161520ustar00rootroot00000000000000PK +> C?ëlú‘4ñ° config.guessUT AzRÎùzVux ™²+}ïa„ûw}cðOXô AD‡øàÖZC]µLð^eš…õAýNMT–Á¥ð{ñ»oÿkÒ¬ÕãK4ÌÕ ©ŸÉh'E_ögç>Qs¬^®UË÷Ó^¡ðô¹º ½@Q_wñÓåw¤®®£Šâð2œË‚ºaA +…[ ‹˜ç q ÙÎȉÅ.UÊñ‘ÿ®¦­­D æí@$ÒÜÜ÷ËhJ—@+šÌíù@L¼]ÂéƒîÚûiúêV†;ÅXøK¦ƒš„p~_"îÔ€¢l¥€Y|T¯ªGÖÊ%™Á¿†áÿh‡Ã¢2Å9ú+Ð$;­á!Í™é¤À@“²ŠÌÓ"8~°ݜ½‹+¸ÚúÚ—è6(;kk̽>ÈŽ?{Ž >‹~PßÌ:P/ÐãI3ŽPÅâÀàÃ;?º=η)ð®!„oƒUmm²†£¢«b5äàˆ"Ÿ¾ev¡ó¬,¿8c.qÕüȧ[ñÉRGcSÖú`æû»Ó'$·“tŒçµéÆW›~9ú¶Ø¢/è±ò[mùuF„*ãUÞnY]“¸.µ ž‹ºêð»Ïï·¤H¸è$f(_²¥Ñh:Gõë-(3+¦W¯#Ó¸SŽáXæ¿øGT™¢m’d‚x¼-jšuµèb;ξ-ú±&ŦñÆÑì*AéRLxÿ#Ê$¼J1ÜøéP‡ ÌÄÄçµúó‹—’€  úÊöP_–‚˜™üʪjðàÔŠ ÖUnvúöÉgÿ°×ê òˆp0óÿ_xª·ÓT­;žǤxpè©t½çí-í\w´óýQSiÒ 9=R{„”Vr"#¡Õ,³)ïøfßD³B¸´æÝƸë.\À‹¥µœ~bL ÷ ;mšDá`Kc˜V’IçLbx3_8L?}(—p>q,ø!©Y5´Š*®ú½/l?®Úìè&f°ú4*ÞȽÙБ™tãÀ+·¾¶ß®®«¶¯çDq=K-CƒÜé®êÌ”ÔcXI MŒIö£›UbÎ仚ïX%笡SØŠ_òL}›q‚o­€í8[¡ºV ²ó[ ·%‘WÌaûÒžÛY·Ó“hUdâŽ|&â©+ösæ°™¡r ûÊ8>cÃÝ"äBe¤Ä` ýaç…GÍ„PT/ó43‹û×Ƚ4µ7À=(Ýf'~rô#%ªšþŠ#–zÒƒù²¦Ý¨úìóˆg<Ì ÑC}‚½´Æj{0eÑgÙ öeÆäõGP Šò›B¦Ý22†ä‹}æ\P>UCá_ÄDž@òœG6¯¬D;*LL6ù¨­ƒÆ¯ wÚ‡åEsö¤Øo˜E…ñ¯D›xOµ~ ®Ni^'!>,ßaà)ê %«V‰¤h½Ovƒg¤Ï Ù\)|FßÉ”¹Œ à¿$Z~E"ª{MkÞ„‚ç)¡bz}y-úfRT¤NÆmõ²ˆwœ–ZvI9òŒþ£d6~W>ÅדËêhÛlTÅðÃÿA‹¡‘Gw»î<\”cewÐú_§SQ[É*û3‰NÆ› æD«¢;Þ/±Œ ¨FÏ2–س‚¡„˜y]‹4_¯é_¬5œÑeÛK¡9åow´Ù=ÕÝfv]yv÷wÒ/€òž Ñ©íéâ€pÛñÙòöx5Ox< va½ÿvŒ|5bôsâ)ݤw-ff¶Wi°u§ÊÓîÅ6¥:ÔÒVëɺ·:kB€-«kWÎËDF•¾Ý¯çÂn—ÝKT+Û¥¡®Û•SFñåéŽ{VQ4DLöˆÊó"c?Š7¦Í^&¯‹5p"˜Ì›‹ŸÌ/¬V8_üöÞ z|ÐâY{¨Ö¹Uù[Zh\ÙÌdAá×yd´ÁR4é6“KØÑ¡#!cÓJÕ*tÙ²}jm4k¤m¥´ðÏø¨1½køÏ¶$£Ó neSLr85ÖÄuú$'ú{ø‹ëC²7îßõHv‹úµ;?QIÒÅ]Sº½D=¨:ZºÒN¤„a°™Ê•ìRDšpjC gì“”yÇ}@w†Šž[ôíc3—ÂHMÊžÕÿµñëäÁ±Oš©A²Ö§k-¬m°&:ç w–ÄVû ã¶9!|Om¨ñ‰ß~„ åtN5%cŸ1dðغWæ+Ð ×T¤îÉ&‰;´<{uPƺє<Ôñî2O·ÇÝ»ïÛ:¿ËWª³\C6~]ôU¢rD¼+AÜ$ßbì`¢üAOúóÿd´¶FYurTOyŒ®L õ(ÌNùã¹]UF¸¯|áÏtJ*O33»@igF xtc¾î=1ÃI·TÚ8í× ¨Ñù^ãLUÀ­#l)× =…UH¾uŽwݺ³¯aæ(&ß|F Ê0HZ‚[Ž!y "N® hÈ·* zç¢Wñ~tŽãÓÒKVÈ£©ï[kŒ5ý®±Ê¶mJ˜Ó¿Õ2j„{•Râ›l!ô+<‹Õ—_,óÍ»ZÏlÐ#õЉdOy¿½ör¦MýnnÁíP€‹9^Õà}zep#<$ÁÀ0îJ·t¶"›ËЮÇ}YXÅVH‘0>· ˆ¤ûŒ-›¯«û-V—/Ó¹ú˜9 @}J“a93šîW,FSeU3ßgõÀkÔA¶“f2t:U” Ú ƒg‹Ã7›?kßde^Zíºˆ(‘…˜wv´Œ‡k Ñ”ôQ“ǪS!rYC„®h Ô¿Çœ 3jÊëdöEIã,»¥ážc–1P«oÈdzy— ü|iÜùõ÷¬]8‰ô£­°7ðJFDÂ]åÿƒŠK.Ô¥ãºW°Nþ~:â]ÑŸ÷Öõ‡qJø§q{·?Ö ìiENç´/G°‚êöëQ÷€ß%@Û§š—ÙžæùÖ$}ÈÜ|nÆ~‚6 }E²òdV]wXurAá¡m¯ŸÚšø©Ø3:sÿžpJØ•AEkrök÷:„-#€üž{zÐæ¯xÓñ`«+æx5V__>NWï0Ú[§†ˆ‡î¢ ^müuŲ8L€ËX‚Ös#0My¢)Ùœܺ X&ÇYrRKçÅÕ¼U›dþž“]Aÿ÷ÜØæ]|i©Wß/*ø±T¸KLòØ TèSK#r€¹{$°+E38MHÅYE¸Ã±z|T‚ö!âσ&зoÞß`æIûsŸ ·àý«>Î6i0Œ¢oeBZèðY»œ…Т%g ˆÿ¨œ> 1\^¬T`®;ÒÖ àÐúsipA8\Þ55<õÑ ô[¯­«¦²ŠüØúŸˆÞ ‰‡àüX‡Ú)~Ä'oú˜ª2xñ˜g^$AKìbÿ\àÇþ˜¨Oâ4Å€dÞSñu"¬O6ÿ_*቎úT§{?ðÖ¡ãH$‰óòþQÏíô³ËroÚQ”Ôi_ºO» ë¶·h%ŠXîàŽ±^!h ŠøÂ;ÛîæýVÝÐZ=½@«ï‘äÞeöïÈrˆàm FåxQ”,T÷\oV~[útgúéÂ7™Ž ºî ¯™®zõpŸú>ß–œ·j `bl¤¨q@2ÍûÂ$—´%º°£Z…^ýò¶€÷­PÉß9ÍÆ¡´xa·¡CÃ\èsóâë>–®´bt5·"ƒcS,œÇ˰év´ ücl{§Ò`N8AúdêÍñ6áÉ:\bSõ…ªè@¥øÛÞQÆ-µ\üÙOéñ¼ 6‰O¤¥0.Yh«¿–"Új³%’$Ÿ%¤o°Ã]þm[±†ð&[Ag¹ÎÈ#Éi™ L–Ûîç!á¹Ìo,3áŸô#$‚qcsƒ‰šˆÞ/†Rpçp²¹ùJý63 ó ´H©Ë—»ÔƒÏÇüή^ܾ˜ ]ÉHCI!„9ì…N¡ìšÇ¾¡wOóôöØU_B6˨îÄ}BZ½%2±¾íËæñcFz%ÎS1q}jâ­…Ì•x® zŒgû¶”ÍD\Ñ8¾"_¨ ±LÚW)½Zð6îéÄz ç|ù¥¨úø¾Ö5´=:”PñŠöV¤žÊèϧe[ÕÚ—œ‘º‚ÞÃ¥ j߆ßV%OGrâ¥TQ^Åö3>é]ý¡A”w¾X:)ÅÚêò5¤Ttr¢œB•¿ÕÖ IÈGy!àÑÅÂÃdt5ãb‰ö Ì2åöFÀ <]i¨ÝçUå{¿Ýx5Ù¤}gü–ÉÉÈ!Ðjù÷:XÖQ®â“mÏÈ(ùpA8Ð`Ïs5;ëà–lôï¹—Í·ùSt±I=ïÞ|y=fÛRûޝ½z-K»vÊèüaªÎ%uÔë]¨„SˆÚÌ@ ÈÓ[-!n=‰‡±›ïø7:½ EX‰-}H ^‡W¸ËSZZ€†Š œ‡±‰²›ð»Ð¨|)î…Â9TU n¤s#q‹;k:2ñMoÏœWНY˜DZwtíYWá‘Ü3>Åi'I|†Ò£?Vt_ „OIpÈï 6$ê˜qϳ ¸´Mnù®K‘qU?2q{FuÃÿþ¼cŠã0xS?Nîs*Z¬ñ[–éŽ wÓgŸç 8²33?“pèÌõhÙu>8ÏÀ6é–Ë_d'Àtï4áa‰î­©É™ÇÚn÷dn‘øñO2ດ(üÑ 1yV±R ´o ÎmF#)†>ßC'>¨­„†ì0v±×7RÕs]¹]ŠN…ŽømµäÂ9ÿ1ÌHô7Hk`Cßn_ìmñƒ¥/„/éâµ³îw-ÒT¾4ÐÖdÛ‘å¸+cô4 ‘Œ1Æ;WÓÒDìH£>¬³.r’‹/åKC]Q$frù RKâ 9‡ÏÜ¥¨Äá ©Í›»)K&$PÍÊÅ»cÑ‘¡4ìßß»qŹ©V'RÏ*ª˜]ÎÙ¸±ÃLÀ½w‘â´.Øú†Vˆe¦wÐ\)¥ã=%d3zÖVˆ{|"VFü¼È} ¾ÍCR£\Ê“ ´wùÎ'Œø”9ÝT4¹Öq꾟l4É[=(bÝX¥¯!°°9­Kž•qy3)(ÛáÑ7Þn€šÌ=ë_´•”†‡½‘vÔ›ºó”È ®¶ƒb¬o`Åžx³³EQ0ÖKƒ;ë¢ý[fuè Ù´ÙJx½%©Î kcýqu¿hv&+Ñ1#.¹¤Ÿ!'5ô2^0—6Å$‚ä@*èŒQîsÞô|ò)=€G"´+qØ…Þ=kÌBÙaAPÇ«ëMÀ”*ÂÆ]ør˜mHÃÿ-+4”Ôyü{òÄ\ÍSôv»áÍÉ;Euùÿ%þE·ÅË>JwŠ9jß9 £ˆ¹v}7ßxV]@ÅEpkIÆàBPÇU5¼|X²ªd &lŽ8ÂP¾¼…˜ûRÒ{ä¢kùÃåìÚ(Yã”&5}}8ˆ”þõ”̈§GzùÖ§ ƒœ­¡øTá©§ñ•ºðŒµò Çé=aiP³åö¼PÊÑšì$oÀƤþ/«ãÓ˜Õëi;€¸ @íŽ*|1’Ûð‚s~XþËíI7¢âŸí€ÀÄé:‚ÚÔô5ŒÔú>( .70)B@ÒäU•¦Ä—[ÔqUˆ[VÆ›ÁÑ„¬P¤ËF¡è™ » O¸^Rá!Ì%ÅmÚ·ð©J‚Z(çq· k_Ç=;èêÊ ºë!1*¹ú0 nB=†±ú°ê“õ{¾Ã‚=8¬æDö½cZJ¦S"h,:Ï/pHÿ%³‹e뻌#ÜlùrtÓ¶Ä矡h;CJñ\|¶èƒ‹‚¥©a;Sª{LI?G忔ųÐöki&R®Xt£`»_þº† ‘Nk"ÁÏáè£ÑuTÚdë„Å„Ð\ùÈÞùÀ$\€ƒ°rìÇŒ8o©2³.Â!¥jØ»å}²'Ðù˜^?›fˆV×OÒiU ‚#Y`Óp>ØQz‚ÍámƒgÐ"dbù˜„Žþ‘ó;¸ ˆƒäñ–7(i‰ÿ™Ãù8…” åìh^×á0‘TB81sHöTðBiÜÇŠÄà Wá—oFâE»j6u¾¹ýû„Á<}Òƒ¬¡½R  «î}Æ6IãŽJF 븪¸]”m+ä I«ºF‰%ï@“Ë §™¾ZÿgÈ]²ý®prÓnß}V)¤õ.ÙÝYÉ{vòŒz:÷2†HM#Pê†à†gLºk—›9ˆj°+ÉÜ+F)Z°h’íÓÿ7B1Eבmyý†ú¿Y‚CÇ<óaPëIy¶°íù™ÃvLÒ4b1qòöœþ4{Š×v-J5Q!)VÞ\¢6y}txçÄêÉ{õˆÜzÖ2º8™~” ó¿m8}“~¸hûZš Œ¨LÃ%K܉{Ç¢nÑÈæoc¨B¶íá&°Ç±ÄHŽ@’++g ^‘ðÑø!pvª¥ÄtLyvS}”F6AÝugX¸Ó%¿ïÐ\¸N=íÃD;¥JYÏ%³„ᘀ‘c§ ”ê3=W»¼ìô9tÆ+ìŵáÒBëád‚L¢÷CNX\ãKÑÈæ¦Ý/Èô¹3åúå$ôû¨¿Ø©Ñ8¨‰/{Ï>ò´Î! p¬}éi¯è½m–½²1Ø/ô&gá± 3äçÌÜÞæ'àa€wTbaVâˆò›ÆÑ… ª ”S'dEh\­—$ ¬Êv“0¥­›è  qψ‡“xÉ6#+Áu†»Ô™LÏÛjek¡W‚*Ô¡K§D¨7ûD˜ô‰n5ò”7º>¥!U)Cîv‚öã—\‘‘ü笣 *ïÊÉTS >>hÉ“–\Òv Â^×þ»t\øßÙ ·£û µÛî‚`4Á¼<ý:û‹·_©>ãõ 3.`lÅ“Žc… …¬¾ÓàV0‚z_µü“Nlª«J§Å¤3Œq‰`ãòÀ±ÅÞ É«.WMo¦ƒpdÿ%ÍOžóz_cP<ͰŸ½rªX› šÙc2n ÀØ3<«l¢8Š”~/û¡xþ©axäMÏ’ÊÍ ìM/˜³Âáq*Å ¸Ñƒ–0CP”ÐRõØ”–ƒðÀ V9:Jµ‡Ya[Ñ‚8 Ýc'ªÔž&ÏŸña7½—ëxFuL‘„™Ø[ùxÃÏÐ"Ø{¡`ŸV[Ÿá¨Y§ fèô¯ùËý+i_ôM%¸%YS‰Gß(/šdÒùÚu/¤vït2èxp’GOºù;¼Ž^l| »èf[™üÍæ æou1׿ÚÄ÷ðþü‹X¦ˆ”‡Ck“Õ’ËLëmûDÅ4Ù»„3bé—6›®Ãž"žÈ'ŠKiã}îÝîfÉ,BYŸ6¶Á3е*ŠðÐÖY¥¡R²f.­I#ê×K³25à‹ÕëuSs°-¡Z@ú·Ìȳ;où+ý®¾Â0öj³„ÅÌÁlAçòÈ[; eD¯±"Õ9€Ë ‡ê ÐK 9ÎQ¼;ýZR{Íúy Á ä¬r Äö=œë9E?6÷1Ü xKDò (*.*®œVÐ]EÊ„x5ï¾Ñª¬—Ú ’0;ª>#pœïbjNÔBvïABâÞ=BìS¤‹³—EM*ërƒÝ÷q¤:Ëd‰%=ÉM-JãnWœ@oìF([ê¬ùãUižËÕñi=¤Ñà ~ Óþ†ìêó7SÐÄòUó hApòÇÉx?…"íËù„%Qž¾w°ò]HÎëÀ`¾ùÙäiÂ,rÉtçªôx¿Žøj:@$‚±YD$ SHãNⱉpiª ‹f›Ä.=6as;Ø$7sþjh’½켇„ÚÜ(‚‡ØGŠ ¾WhXhÑÎûÿå\f+ÞÇ"³ÈÀÿúé^ˆÃ*ËŽÝ—ù²9öØñu}…lûÝS›;—²ŠÒŒž2'–¨{ˆ„ÓßìžÞïŒ=Àcê䵊е–BÏ©pZ¡F–^{Œ9¯{ôâºÕND“‘¦?‹Ý<˱áuX_jºâAò…MRLRêV~{œÒäêö1î¦äkdTšl¹gú9<ð#õø u8¸˜MvÉMœ±®½6Õ»W¹’ðc ýÇ4ÆìMÄÍOPÝåÝ ¨8œˆª= ?Ó–C±¥)vFHŒkÂÊܸ°›×s95ÒÀÛàÁU#vÀ §u*¾wú3@öø¦èù´N |¦sdmÇc'À––ÿ[®Ö- $dQ®’ص.çn{Ü%„ë†êwŽš¹Ãšï¥Wù9ÒÈAÕ:‡nüí³¹‚r\ÆBÄè»ä\fÀÏã7…I²sBJˆ‚Õ\0ndUñÞÈ\3E£ÅóM„~»È7c ÙA?«³`˜Y³ÓÀ£} |ðw±ªÑM}«{Ô–ßñJ)л“ó÷oÀ@´hj̵ÍõS|äE`ÑÂØô½È,ç6'Ê—cT?©Óø­Ý½ïDe‘‚á¢Ö«37÷IZO¢W>m’7G(ä)òtVgè8ß BrB—ÿ½!ö@爯±wïžBQ¢R'æ]XÌîjy)öAIVäQž=ëí2™“] y6Š£{˜tÔ¢[×EÉÛÿ;¶ÅP0…«IÃò”{ª®íîÃvxQF5ì!fÿ4¬%Y ìÄlO=,f±X«ßª„O)fâ¥íµ|•GVš67–é —¢Šó UgKª0!TÇ¿ ë,5eœ‡yù¨30±vó/ç>.‰q‡ÌR Vuœ½€A¡"ð‘n^±Ø’&öÝKtáݽˆt î£ê’ŸÀ—Ñ­î´®JÇÖ]lµ‡¤+$¨ê³ôZaáPC<7 0ÈoP9q¹%³%ðÌ_µQ±„ª+ö÷À­úz¼/ˬ õ*ù°g,¿Ôl â÷U@³®´PŠ¥d‘ɾ¸ùºTYÈÀâ(z¿ÜGÏNÄÎÓß|–1 5Z‹©ÆC·5È8ÈhN‚^òˆü´ÊeÒõªÑCã`¶Úꘊ@"Ú®‹®cïGöȆËVeËóeXeá}üs_#nÇ){Ð=8òQÍQ(CðA€‚§œ¬ˆOCÉ„ë¬VÝV2ì.¤&X 9Þ~ix/wÚYPÈ\°Î÷ØPô`{o‹Â@0|QM[ICeõàšüUëéû—[¹æžÎý¿Â¬AÎrèf»D ˆ¡éwr*¶º·b-,Õ“¸Á»&VN¶ Ö~_CiCwÇß âç‚Ú.ß“í?v²Ÿ×S¹y#µÃØ=)"õTOKD«ÈãTS^‚PMÝú¡ð#/õŸLmÝUà ɤ|jAY2çdá4c˜8ÕásÌÚ‚²dÏDzÌQ|éÏrw>°ÞMêt,ºÀ°Ëýý|EÛlVüáV,>%+¥.:þ„{šŸ4·ïÓd{djp?4iI®C"èël ÇUBÛÜ`žhihù»ÐŸþbòŽtPˆ{ó–þÄ¡<^Äϱ;H@_F›¶†»ü²™Þ¬*0½â¨C=“]ø1=i¡bG’[XÁ47Tßœ MÑrŽ éØ$Êq¾Ê‘ƒ=öÛAê(Ãî…cŽ¡Ç4¦©B,wåß6 TU&ñù ý(Ô´ðÏùÜ{ˆ ÈW4'*àNfŒ†6)ÙêZîáI0 iê3'¤\Jð*Ê ’ãpÃû4¾ÌJ»§cÛMî²dW¾TÛIdR÷€rŒå˜·ÇË·ç©ôé±$oŸmcü†,Ç"qÜþ6黫7>ÆÖµóyc¹Í[0™Ì_æìž•ÖL.³¯(ì;_@7iÑ„X1dânj;}X+a<¼¢ñ`³Î*K*j›y<ºf¨¹“©›Ö?)ë;‰iúبÔ=G7Ïü ½Íp8eÝçÒj lÈk¯eµÈh°®:˃֢HÔ;”nS„÷ØXàBT¸¿de2·„¸é‰®ä”&ÝÏþL§ìXäÑè®±9×m¯øF5l+à[×?Rÿ—E ‘bÍðC2š´>:–p¾JÙ5-®¼æÓÚ¿sD[ÈàVE á ¯0ç1ò¼ååNSöWňz/·r95Ò51äߟ“~÷Tk*½G.•Aÿ‡Ø˜§ž?¯Su{E¡ƒ=zDGÝ0öã>šnæ.A¨{¼ËÛÙžà.¸ŒT.¨vÓ€Ëú5À]VÕm‰ýx[þr¬­N¼(Iè:æîÕøR¡{M=©5@ÂòùÑ-˜‘Þ¡+K£g‰“_­…Ê»-¾¯Ó0A¦‘#+i(B¤HÕuzšDº(Ù3rç­2¤ÏG°‘oòèù…ß• S—߀ÛÑá{c;Ñ:M!ãÛ0!Ø3ñ¾¨íÙâF®kê~,Eã@ƒš7DÇù!ÑÞ›4"æYƒ+[¨8ä.¥^ˆ×µ½­e´|¬¥þjé×aä”K¼R{Ž~n’Áµ±ÌñGø4罺 Uц‰×e5ZßO>䡟Â-K)šF¼V,KΡ”¬•ƒaˆ]fM8O†³P¼®f!Tz!l`©ù¬¸ª¥ÛXRj3_’TÙHãµ(8Õ@õ“ýsOÇ'A"ŸÀý™Eû沘nqa8§Ž^b/s75ç Ü™šÎ‘JI"^ßÏ^- H6ïM·) D’ûgÌ¢ž"Ütjr4âÚo‡?Åç•Jj\í¸°¥w¼ÍÄ&'W*}†û\öRpÛã+®;–Ó·?FáÍ%¯ ßBw;Še*ÞTC…|ÿköötæì ½£jï‡Éú‘¡OrW§Æn:½Õ؆yÉÌwÉ]Ú=GÁ;q<æ×’‘‡#‚šcP¯›VÖ¤÷çnÞ.™šð0­¼¸P› ºç¶ù„t$rë¾ïŽïçF–i¾Â1µ£Žo¦P^z’O7ÆbQAB­.Q&1Ϻ·#Dž²¸—æãŠý4ðl[ã·:G  ³>ÝÁ0u>C0Nv >|gË‘=ñòÅîí2# ÉôÜã/¨"v4É(!Ãø9zí)]2z¬tvÒµÏ6´}W “X»ò ‘”w®8Ú*ˆß+Õß^r\€}Od¸ÎZ{zXjWC]2øo:ÅâgömèpC%ˆñ͹ùª8º¹œVâJ&äÞXhçHa*í‰|•wÉÎ3;.D¶l(Ò¯ö•¤[sz.] s×ðp£¥bsêãº(ûTù­w XÄŸ'2ÞŒ€dŒh“çt„"m™¸õ^ßAƒ…ë…ìøÿ·‹€_‡¥4» KDzãf²9ž°qY7»0dI¨üZá^e±=‡F¢tââjž¹^ qDÜàÍl~ñMf#™ÈŸ÷?Áþ#ž+.ÅüxÄÞd;¯F:@meâs·r‰i©+Þ?×ÒÕ…zpOänë±\.–pžxl§ô9Ý.ʶyÛýƒ&ôfǺé–õÒgvˆæðœº>Òj™½%?h–ì\®Fþêo‰EI,Þ|zõp"eEù0ÕL›GE¨Š¶kï±¹5a6-ø£²l~3Hf÷T¹Üÿ©Áµ¥ÉKÖ£þ{­¯ˆ)U–ÚoòñÒp[ú¬}ŠKl5LÀ/´Ã :¥;Q¬Qp¬]>ëGú‘°.aÿf¤Çê6YSí‰Ù¦ÇzÁ[£ÊÁ”måÌAp2E<’e-”Õt$DGŽŒfFF…½R¹ TyO{E]Y5Ï£¦Ýiõ¿_1¾³­ÐÔ[(nkfwàð3¶rý«%áÚê‡?=Ã̆_˜i…)‹­2ƒ"Šœ~Þ@Žv|$íæßjVž¨Dç9Ã3éSŠÝrôoviÌ+Žl¢”SQ9q(- F)«ŽêNñ‘Kcõ#¯Ÿ¶¹bž“ê*{ýqýmº¸Ä­§%¡»(E¤Ë…5F0ªó¦z„‚TÜ¢"&2 oɶÎ- ]íýÝ×¢}gÈ´ìjž®ìÀúGx9‹ßŠ9„hD8ª™DáGìí[YGQoû?tÈêÉsÔ¯”íªÚnêÒ´¯ nyó¸¥xGvê^CRo†¹ÜèT(frÇÅçŽJJæ@·ë¯Óð«¶œ­ ‹¼¨&ôˆ ѶéÐyA”YÚ\NK ©45Jmànƒ³g¥ 93¸le%xŒ|8*ã…¥¦÷àËÓÞ™ã1ÎeBŒvç³U?óÌËìf|èm ”ÎöRÏ’¼&Æqº Ûª•.c˜1Ú§ ìy¡]ìàÁÃo‹í«Ñæ™ßØQ‡G·×%43 Z\?‹Fmø[¬ÞÕ&6œØ-à‰ò«jÝZù‘s¦£À1c#+kKEe¶Ðç&Í:gõ˜+hþròA~ò7FÈ.Í, ]vÖbÓ¯èÆË¥4žÎï°Vç®ïâ¿N½Q]SÄ»HäiÔå?–€îµô¯!û¯!bö¦«Vƒ(Z8„ë‘®8G’yÞðC€^ê»Y— ¬goe 0¼ £ã,ì„Ô/˜+˜e¡¥7ÂÓtž!’LG_U[Þ ›¼I­­œ“˜Ù ÆA-ù˜~[Óâ£Ò>wó‹næ: Bô  o=:ö ú~³ÅSê­µ Óÿááê7ÑÚµ{#ùþ¦6Xûå{í©¼|¹¤}Ñ/I8KÐì[‘s½‹hpT)l2‹{©Êf ÅZˆ8@îæV©Ïàe €8ÚBçL'¯ §…”cˆTáØð Ñ>Oå],àae¢>VÙUs"(£óåz‡xzyŸo2þNÅÖ¸¡Ã~§¢˘;öß"ªN–œ±UD¡•Ý#Ã@ [°D¹ …=soÄ=,á0 ws+~¹ýeäûf0cà ê‚`½QZ Ô»Ù_ÒŠå’ÈRGt_ým_f×õ=;‚ÖÕZÙù±aí^-ùœ‚®Â“?²{_‹Ú>PÖA¡½yön+„Á£{—KýÊÓ/ü$5 èrOPƃH+`‘Q‰Âh3}_fCA˜LªLÇ ‰¯C•2&U‘¾Ï:È'Ù¯ïYDÉ>T $°*Ë%€Ö²¼¦/ èë÷}ýÓ iåYP”_!ôç F#xaþZ²!¬Ü‡ý ؇w|¹L1’ ÆÀŠqëqî³É™%¶|Íê²ýàtX|8s!‡DÒ"JøuA9ã)†éBæõ± •ìÍIgQy(ü8 Ûr<¡‚u¢<Ÿ¥ÉùÇt91NÞŽÿªÙÓ#žüF>(¤¡åÁ—d9=S”œ„qÙçêeø=Ÿ¡ñ{Ÿž…‡mm;Cþœ“ µ1ÏLÂ~þ]e ŽËcÑŒÑf’#1oÈxB»0-ÍÐÅg‡Û`gáàú–`ø,X™y‰r¹Þ¸Fßèáý²Ž5uˆlwÿ™˜êDlšD«:)×ÊñÛ}$ÀE/N£2”!ZIÛƒ"0‡Ö3*ªò.j­#›aÜÆ[B½™LR´KsÒa+]s¥³w|ûý$ŸØúØ–ûöSýîlZâhí>C*ÿ{s@Öà-GY_?èhüÔ ÊÉÎé°LäI;Eç ìRðcò ¥Ø€JéGǽ%ýô¶e>· PšÙ.4ª,ºõâQÊäznX5¨2‹ï[ž¼\3ŠúûG±]U†a=qôÎóΚ· ÊÍö¯í[l9ùÕÅ×ð„SMÝ1”^è‘ë|ß?»,†n\˜Š Ö& ȯµ>½¿­QƒÇûz†ng'Ôƒ,X‚Ú/qgã Æ-cãbŒ> ƒ îj˜âÕ7{5 4üN¥ÀìrOŽ ¥TÂ@‡Ðo ¤þ^Móñ‰íA3ƒXi0¨ð½aY”um½´b<ëŠÁ ÙHÅ0£O‡`Ô”Ö?4úõ¸Âa1šÐcÀ+}CÐ=¼^ƒ(¡QF›ä+—uB ®¡Ii/ÿ<”“+ HVÒ¦–e+Ζ‰§ùk¸\L® ¬³¤•ñÍU–ƒÔAó|ä,üü| «ÛGøÛëÇT‹ç¢kÍ£ÊKÐOâ´)ñ±T͘Áâ\cõ”å-÷Q$!‡ÄŠ–iø ?v¾ŽÒ1;æ¸ÝãÞw ÷TªÖu;ÎxJr¹8ã;L~!‘å˜éìÍ1)E¡Ú%«ºr>æ`ˆ—/ŠôA¥B¦H€Ÿ£5µx¶Æƒ\~3©–wWVrrÊÁ×—òVøíÆjd⯠´ÙðÁGì݃* ¹ZKwzžTòÁ/¾~è´[jQ×>™?0…8ÅÝ1¶?©¤OÍ*Ù_Ú[ò< ¥0qÙtZ¡¾°ä¾ÿ,‡®k­gx%wgïÈzóÌL‹Âv8DgƒT.Y\G•Îì½{£E0m@•_Fp s| á9 åq<úÓ»(XˆeaFiÖ¬/¹µÊäìšÂX—íY:¦3n>Xwd-Tñà;Mýä:âüB*v?æ5ZÓO)ˆÑ7iºGï-1Üñ´˜p³%K>'uê-¼Pët®23Ʀêî:c4ò©Ãjšuo¥ÌVUX¥ÃòFZ?~€RF¡ß±‹c \\G^cÛ:>¡†º2>&®íÃÈLð—…¾ó3?µfOÊL-à“‘ c_¡úK¹ž”Õ™âˆGGxŸRgotˆš1‚¼x©é–×vŽõJ.W/É6ôkà€Ý{%³äZ“Ûaçè6—ŒðxAAŽÅ¶>8Á®mýºÿ!·‰ü€‰_WÖ}rÜa´~dz[h'J[¿Eñ{€¥[ïl·ªUPK?ëlú‘4ñ°PK |—G0}ºÞ  config.hUT ø{V{àVux è蜰 {’]‚¾D°Æù‘­HLúëƒÓLû¡ðܶCß?6uŠ¥‡Ìöñú!iKþ;ÕîQ<KzÝÙ~6Åðh’e¹Âqîé/#Ê5¥à¹4üÝþà§—hBÊ}ù[UfDiNf}yñzŠþèŠ'û =·ù žHQó U£ÃõÚ…¢M“‰~ëóG¸‘åîÏTÙ¾K<.!ì5D€¾z|‘ÞÀ j$G -+Úç!~Í}«ð?<d÷ëÖ)ƪï¤nÓÃgUëŸC®âjÅ›mÉùІ×kEú›ØѺXÄuzèÞ©uèßå­õ­™Yàû­VÓ‰úîOD¬>UÉb(ÜYw­OY¤m$ïèFЬ2šW‡¾/æÜ­ÖÛ×™1ôÔ*Ü=ë þà£ß,A£M¢ûã³TzTè’kíkZ–”ln–¦ŸúéûG(ÇX¼Ýœ™íF ÍxVÙë±ßô²hNðgÖlÙ¤¿¼Ï¨gFšT’ÒçÿTz®'8‚êé{_Û¡öiSȹ‰û& =¬jyƒÛuK ;íón {C(¶²âã`2N¤‰ûþ4 ÏÜšQRÿoä;5~Õ-U—bkÔßœ=êO€Ï 7 Þ–màõ/lÔÀG&_ kÒñï[ž-‘ï¶Ú]Fßèn‡Î9(Šn­ t‘(^e`¶%?/±Êœ9ÞPß1´äw ´í=A\þ¥ë϶žÛ†eHõþ®¾?¾®[?Éj„« }ÞÍ«#*6c½©Q!…4§µˆÍ¼ýÄçÅOȃÁ’æ¦ QþÈ’¹\“ˆTß«­æ9Ža•w†òÀ°ûüHºg4d t\‘l'b9`]aˆ*ù3_s Ø8ûîûú¼Qå‹riœºÑo_HÝlÔ¾ ¡ú"Ù ¬Ì*ؙȕ޲Û˼‰<—<ŠFêÈ % Žã×Ul–v÷șG/4!žÇiÊzHM 奼k¤Ï³¤€A—ÒôPK0}ºÞ  PK |—GPZ², config.h.inUT ë{Vø{Vux èèÅ‹ ´’+´ç.œƒ¸iêÃdÉVlbR9M(ÒùÞŠË6¡veã|Ømä$Œ ôiNÍç¿»~Å@Ë'bád?›¿F"w)œŸ»Ú˜ ¿âëzÙÒâ¬eðMƒl’ÿCí6rÖ¾‰Á)DÙ€äja¡%RÅ̉bB ¤Î¦f&„ܴŵë‚j© «Á¸ŒÈ‹™®Ë/‚„Æ&¯ÇsÂMä¢YZdìk(‚}F'ù½§£…ÃÜf™ÍVWàm_MÛ?×§’Ê`ItW¥ú¼¤t7¡t™¨S$;hí™ižE+ü,¾ê§{ð«½C:œ8`Ä<ïÅÀº3? \^á;ó÷]X Ð[¨Ò²‰ãÐŽ†X!cáÌ]H¾ì0vÇÚ¼„Ÿ˜T•Bhм{8DY÷wŒ*§^µ3ï‘FýÑà(!Ië—ì¸ÌÓ5¢ÏtBX 7ÇøZÎ|ä‡3ú#tŸ)鵊šÊˆtõº¾é£…ÃI¿óMÁÍ7Üô’ÜΠ€¤›‚1HÝÆöTŒÄ½Èe¸ê×ÏRÛÅè©{ ;’D4ü\_o”0瘀ªIEÃöðñ iµsýJÔ³|ÁùŠï]BM¹ÿV¯ö׿hà‹¢ÖBƒºÛÃåùAñ“8ëº!sXÒå1Rá› —z°¢U9üP±¶X$¶½ßÍ)o ……Ö yG^¼?×È®ß'©¥~ù=»™ CÕ4–)ÙTV0F­yt­´Ñ™Ü­íW¿ö§ðüÂI ‡»*žÐEâǾ.³ž)û˜ýˆÿCø¶ØbLŽù@—+ÿ_-ÁZÉ)õÖ‹6ÏaÈSÊîu‡æÕÔÖ+6Þ÷è1-ìð÷¡;]ô wOé¢;µ$é%!¾•õº=Ó@8‚µ®PKPZ²,PK ÉuiHþc­‘ ·‚ config.logUT Š}àVö{Vux èèwÖÕ¢VNÌÞ¥J]« 4‘62šÜ÷ ÉtY7WÁ ¹ãñ¥å׉áÙã7M2½Ûá/:œ²qRp:¨ãV¥ý«óšN°—M b«1nå~ÙJ?…”qÔÑ0Þÿ‚‡†Xë[í ·„Q6CE-1Æ}¶¼Pî5Ë9Nªžc%JƒizŸÝØz¿/쬗 óÖýÿËÎx³7Ù Û!4ž æàšº;ç½±¯Í@=­™’=·Û6Þ´Z­žØ$DkVe1Ö½D$šî¾Š‘‰@ hÈ1§¯³Yyüï.ò î®ßì¯È(Ϋ˜_ù³œz]CûsHUçÁî?±[ó`Azýù©øªÕäÐýÙ¤Y$¨ûÓ'ÜLn”Ò(ãX`߉¦9hØ–SÁGgðsÆó1):}Z̉,IÍU2n—StDíBÇø÷çÖ9V§G‹ó»e¨rãæ˜¥¬U‰gMRÛðsÙ7É|Eût?ÄÍc:É¡Å{lóIDº‘‚`e|jºÖEcîIMŒòÐó–ËÞÄ^` ›Má° ¸VˆÁâ™–…ïÁJ¢Gî´ÎvñùÆÚ’ûí@Di³.Ó@ñ\(£UPVÚÊgÀÀ¡Öè à·ÞÂ,*ÍÞZ[cÍ ©?ƒ‚ á~í!øÖÈt&Q‚ðr¼—cˆŽ—”ú“LVÿ BÂX'޽@tJðF‚ «ŽÎ|CÞÝñ¢º|ŵÓãN¼•]Iã½}¿¸Ñ‘·W^HIu }LŽô¸osFÅòÿ,’s<^*\\Ž›+†TY礅f”Èø‘ç=Ríøøi4ýd@?ø!ü&,áÉi¶þòú•ˆ…µ@ÀX£|}Y0Û:i4Êö’´¬ë¤w7ƒÒk„X¢|^½dqïâ»ÌÏaK”Åðí#eh¬ÈÓáuÔC¶ní˜s³ #ÂL$­¨öp†!üý[ÇÄt¥—Û-Б¦o:2Øi’øhÇ4 óSF}‹ < ‰1* }ƒ}”»&¯…óÊ3&_·d:0bÞ/üE Ôäž³­,¬-M’Üw(%W§—±%ØtÖwD?2¶µ˜&•‰¡>àÚक़D¹{Ï52¿#4#ÞæoxžrUqæ /77Ã^.EE;„lP6ÊÚzVó/5LË1µ4Mæ›×ØaóBmòo¤Um[•™a¤tå×—ˆ>ãÓ¶æmÚljqðNØãl5”I±=Ý›+ÝN:ù[S”>gUñIKî¯Â#o™_d¢I-ãJÖÙ÷«PHø®°De™îQræœ}}Ìžû&ÃÄ«iâOPMä4w#M·ª}+ehɪü±q$â‰ä â½ý!”õlñÖ4¬åGéàïxûF6–·¨éÍ‹‰Z§YÑ?`…Õø—]Wšà¬El×@%@©/Yn!eÆi|FD'ÐPÿ¶ãL5:®;ºßh¡c_%6ƒ ¾Ú 0‡¥·Ox×K¶¼°D}p©$ÑIðùm¶õ¥Ôêêh2}«Äâ¤)²OŸ‰,Ôpi?MCŽ„p,ˆȵdJÜ:µ`Å5¤¹ ‰óÇruË¡RŠ)܈*þýù~6€*G¤]ÅGD—4ÙÖ¡aåÒdÒžò’4 å¹÷’ŠÑ˜fõH;Kój²X]fm¡wc²;QÂú}eO V.QhCäÛûíÇM[è?¬ nÂß®â‘Úaný à ^'¤É[‡ÈúG™ž½TÖ" Å’ +·/ï×þ«˜3¦dÆŒjpp ~Ép’’J4átáSŽCà¼7²†Àê·7Ï"_`õÅüºÁ/$ZSÀ&UÓÈ·rÍ#ND¾0ªêOß~ÖÒÜ_øÁ?Žå#*‰l=ñúCðØš×óó;Þ¶UþÝŽ´D¢àxºŒ÷A"ñs¡»ƒDæ¼U¼o}ôløahfòr/Y ã¦ÚõªœþÑŽ 㪭gÍàU0¶h‘¾¬·y!Ôx€{ô»¸ã†ãîŽpz®®u—Lw:X“t¡²"S™9€‹^f†X¥d+¥D„?ºk÷ûŸŸ€ú ÓÞž¹s’?Þ¤þÀ¿ þW4ÇIáïð½´29Ê®¢—ñÛ^Æ•»3´ Ϭlø’‹?s1ç:¹~ˆ?³£5–«(e@ßÁ¬¹~ëgŸ÷VjTè~õÍ£ã©èE2U.êöÜ·ºT.ThŒ® ›C«¤væÅoMòžúÛùxæ™G*B;àU0xx­n&’òêíûö’EÚb„ÝÚðÔm«t]¹7íêTtèÕ2 €Úl¾ë:‡žÇg•žÜ˜ižþiب¸c ¯8@V˜>¹ RÐX+Š-´=ÚÒçmÊ'bá£y3Dö¥ÁÒÎô¿PO,”y/(豌nÁ4½HÙ0>¨©ñ~ÑÈŽ?+æsùÛÍxõhu*–È×"ø9ÄEÌæ°P´ Š 'm¯Ú8Áض—z]½Œ)žÄ¦Æ<£®ÚV§wP”{cU,J•r;{®&9£yýŸ§¢ÛGzÉ¡éÐ|P~Ö.óÕëSÿ)s*Gï*9ÂØP/5è=æDÓ|Â^þ'©áUN_q.ómÊ3 ó#;ãAר sû|ŽᘓóÎì7K/„†ºÜZ$#Ïq¬QªŸÄhC¬•”.™çÂËý×·‹¿®\‚t2³çK‘E;½9¯ÀÜPµî¥Ý‚‚R?B¤‡"jÓfœ¡]]Ú¯±Û hfÐkã!ô´-¶çñ©rz›Ïä±?®j;éªêø6;žÄ„ê‘}îïŒTIÀ”WËyôÒ,Ý+¡éÿ«wÊ{<>P1Î/°KçA«Êî¿,!Ã7+Âû%õ8N¿ànŽZˆï §•Æ’[V1÷c¯9¹˜ÍÕr™fa•_ã½þ.Ñ7y¥Õ²Ä·XK*]iqv {¥«atåbI!$³PýÓ2Âù­YX¥ ðA°ÕÏ£ò# ëË%IýÁïndlÒ´ÀÖU½©úx£ùÁðGéANþý ¦bS¿Šùî¯7¬ê*9¬‹™Ùúí0ÞaòJíæãxÌxð*ÇîBÀEˆo¸Ç@ê#9 5Ä ·¾RÇÄ¡yHðàÕh!ãŠûyT) …À‰®°õ=]¤=ôÃnB|Iøcs"bðê3³BµL½Ô·˜JŸ}Q๽Ž^ÈbÏA2ÇvQÄyèñ4KRð%2]5ÒÂï&Y•ØÅ&ªŒd§íÃíÇ ¸8íbüwàe•/xRg¿ª¾ŽÃš‹ ¯¶¸Ä|Û$é!èè]–î‹ê3´ãobÎo)$ ¼›guøä0 ÒRT„$·«gä·¤’Íût!¡”Oì1zpà)H¼g6Ûvꊄé3H‘ÀKõÌoÔÈEWÅSÌ}ôµ¼Fì1Ñ,ìÐÅvÑ|Œ„@fwÒ.Bµ{£ì&›-–œݶÆgÂù8ÉôŽ XîªJ-ƃ3$'CP3~KOú‹ ùGÝô΃ÃÈw¬‹ ¸ÑËíìPÄùU¶ÝÇ«”ü–Ž È0øåÎFì룧ç:i'Œ/M©J«fØ:¬ñ«­…kbй@á$£gPR–8ÎÕõŽi  «¼ÓK¨Wå÷N&áTpÑiãØ¿pZ¶i†Óµ¨@µì¥Ä"׃í›qäï3'PRŽ’bå‘ÏÕDD[0&9MAÏ´öKÙ ¨÷tX t~¨è‹®$Om\e—p\Rº_]?*nG^K^£2 ¾>–¤å«2½®Íß:ú³Š&r5í &¾.Y0¬›Ï†TÙìä´µIÓµè] Ñr@¨êˆÔ¹Z÷çüìN„YÅŒ–G)Fg¾r–äÚ$ôAšM~_™cµ Ÿà"E†…ö2T:T„ï =6½Éu•-ªÜsòâ¹ {Àñ‚Üô…SÐVæëŒGßFB¿*ÒÚ”v-Å"bµFê6ÌÜD*5–¹›ªèž‚ [ éçoô·…á>Ãñ3ül(Yà'=xSØñwÄÑlòañ†¦ötºß1‡¤A¯RTE¿CŽ8 Õ….ôƒºæÜqw\ ¢¼ÓNµvázÐp²B!v;y!ÚY9p‘¥§ù„ˆû“[ï@#˜¥g蓵ZiÑœ¡½˜9paº4‚ÙÏɆÁx2»D9ãêzýCðf¨ Ò5-Z&P.J¦{!âÀÕP ˜–éÑ Ïÿ€¢,<}ÖþÄÊ ®µ“ëRÄj»wBiÏ;Vó-iÎ\/Q\\ªÈWùØ3ñÀ÷òÖÔ#×Åy?~ZÀO¸I@ÁùŸºÏ©’èÖšÓpóÌujÐXË"ïâQõˆñ|xœè•òËì_öÕ͵‡;4ôïv£$\Ãzt‡Ïëq^$´”#&}Š„w³½”¢#šä1­ÿòL`À¤’ h×(7Z»5˜«ÓŸ=}ð€Ö§àHž ¤®lR?†•ˆ™^1ì ? f”K•Ü·ÿn[ò½1ØñZ–"·&BÎÕaÇË*”F‘…'ìIˆ•ßÛPS÷ÿhd4Ñë¨{ I¸/¹"‡ SH%OؽÌí¬îS5¡e¶o€ß»ïà Š.àìˆZÛK¡F6Øâ>ngz]¿8·Ãé߇æe!^¼Ú}JWš_¹2€aÃÃ9qûá6‹_Éà3“O!XM ”’‡÷°Ej/{¢‚´YÁ±3®Ô«õó?´7°‚†¿Üe³ÝгR¡æ4Iåó_È3×Bøm2‰”˜}AÜñ…Dµ‘W®–œò‰û¡OÕ^p p ƒvåò,nœx«TT—6\†ê(ëÝ=p.xv°ƒ5ùp7·¹Ê4ýuQDÜ7’I¼˜‹ÒØk{}Q )¯rÊ«»”Å8j›z™—ÖrùÞØ©A»+I‡jÓàŒT^i8Ù³V(>8â”§[®–ÚžÎÂu0°i·u‚ò“-ºÖØ”ŠØE€Ô¼¶ñm,C–ð,•P§°çX åÉâH'~®D~ÝqI5P¨ÈÕÓ)—!­|üÔ™ë£z[6Û²ˆ¤0"¹¬ ÜŽâmÚ© E ˜Lþ[K! ÜE ¿ší¼N,+u™ÄTj»ñêæ*†,ªÖ2¿¡Ù;Íš89¶AƒÐÒ)þ8º³7Ø¢d%M r ùÆBÞJÒªfæŠæ"˜@åW ¦¶°Æ‰µ³õ†H(ÔþªtÆ@–ÚÒpŒ§¨#{ó®ýèzᾯvÁ»øú£Œ¢£#›`½Qñb,tº¥sJn`¡Ÿ<Ëc`u}‘JãÊßiy ¿Jw¸&\LŽ ¼Ò›W†š•Ò×övÆM.¨wõøxt }ÌA–'¬ñ¯ÑîÊ ¨®+Œŧâò÷î²tØÝ:ñ˜fCTÄî‰ö^ZKEÈ@ÉÆ‘# P¢ðlý™ëãÂ]ö¥åFÂb¦ 3)¿lm1€®¬Q4 ‰þ~6½|6%ßS`4lDóˆx¿a¬´7˜<¤u Ìœ–€6:ŒÉN  tª-¤Ð¸‰Gmdô:ÝO àå÷VB'[¼HÀ¬íÔ‘lƒgdð¢õ¹yƉvoH>Æ( XñI꺴Ú\´*%™ÿûê€m¾€äøaþÕõ‚ÇâÔ¯¸"¤lœ”~kËjµR2𠇲S§¤&`ŠÉ#òNSµ|†Èhú §Â5s™Êãæ×Ór”Í5®I)#Y;SµQ›[§ŒãæmÝšU…Ê&å. Áœ¯4\Û=Ï×¶¶*•ÖRì)£%¨­ŒZy¾…6VÿyfĤ£ŠIÖÝyzÅt÷â†T*kQª§E¤|½Ä[DªoE$¨VÙuV¾ºmµp¢¢ós ž¼øgjD šÙ!=flbAìݺ_V?9ˆîgYŸ^ö)›ª÷ú¡ŽA}zâÃhÁÞxŸt:þÆ2߇usO1}všQtãùü?èÃîÔÇO;%˜‚š$˜”aùõE¾· ýãë(ÿ§Û_2ÛE‡Ä—l. èë&t!‚UÊr:]É]tý:½sèÃ2ÑࢉB*ß ZA ¯ãŽúÖ#m¦…4èî°znϪfÙNàXvZloØÉ#‹lþ„kI_eÚeЗ槲¡@Iü3cZ/F/NãO™šÖ&äTAÄ‘Óê¾äË“qQÌŠš$C¨`zÌ·„f2rÍRð2Kƒ&¼ö\öÂÿ\þXŽÄ‘'ÚPïÚ¦²z¡ø+‰4äœÞ²µGK©ãöÍÐ3#ß±?¬³ôˆås±÷™¯ÆÅרDätð¨ù!> ÷¢ þAîpH~Zb4Výí9I¬GÇÄÞñÛßÂp{²žÞÕËÑÄQ2‡àŒfà‚?^Iž¦Ð‘®QèôܱÞ;²òiÓ–h^÷Ý öÕ ?¿.ÓÑ6úO‘ðy5¬…Ʊ8.0RìmYK›"†€Â5ééySÙιæLgµœÝÖÇLkßk°:ì"›é·â=èÉò îä‹qß%„\  5Œ7¼¡×g1æ[™[-U?ã[{õ4ãšÝ2£ïÏÖßMàÇ¿žc‹,ëø±Œ¿.B~†¹2!w©ÖyLÖ¯6ࢢǹ¤Ï1”‰¿ãí¢´ïL¹·õ|  &ú÷“}ÂÁ›¼oJ¢“Ç•TÍa±1*¯2ë^š ÉlCJ‡7þ'PúÎVoÀœ¾T<™Æa¢×L‰i*ÑàÍ™ ÒØ]ï#Ù5v÷õ8<åÒ)Oµ'O޶Í'à÷·iâ~á­ÑcMÉÞ¬·‡-.ÎüÞœìñ!’¦X‘ýž£–)Bë±Fi¦Šu|E%´…7ã\-ü$5*3ëÑ“Žâ³´ªuø5Öû¬BO…–´2$Π®1º „bÀÛ;&wÏ,ꖱ霖 g,uŸ ‡èðèdX‚ž÷1|^ ?j âDË?1Úø½Où)b 55¶AGÂ@Æ‘¬E%Upšj\\ž:ù`ö{žÔº§2’E†<÷&^Éæ@yÔÑž¾ŠŠ,Õ.™¡r2[_ ãÙ¤<Ôá@UbÏã–áõoõO´‹•jÛJþdβà놃ܦñµrÞtGí›.ßÁòþ¨Ùhsà/'Q,7wÑ2®¯¦Ìöy–¦—×ëäá’€`iXn»¥5|ÐÊÑd¶ÎR+Ò¬þlj3Dã<•™2p ¿SÜ7ó®†Óƒ÷ß¿I§£öYüÐt“eë²éù_û{O5XB'v&^­ñMÉ̺Ì$"•|5º^™k¢pÿO,)ÜÞÁS÷Ê?‹yd»+dÚÀky^“V·mž<ÛsŽ%:5¸[ƒ8׿7Ü£ü_òøŒiôc&Éøù:~*ë¡ö¡vÐýñ +¿ã‰©üKƒBë3‰Lꃦ¼I|kN<*ŽCIW¸Æzêk€‡Ó¢3ÍâÒ²)8ÿö×<Å·}ºº XÑÂÞÿúÜ7œÓ6­´ó?ößK9*X¢æxû ¥å8”ƒo(¼R!ór°KºÜQÔQe‹u»8òÖí²Ö]Ѳ­VÚxZÖ â#Ÿ 3Ð 2ø;ÿÊú°9•—’$3öŽ$/$•âϧÌRo½ñœ¯CȽ x¯wLŒ$*Jó=Õ -Q6,Õž)UI «ë?ž†P ThF÷Éãš°u©YË.PÒ"eaõØ€2ö«ˆ?žST:ì’Q÷uéôÚV} 7• aZLË Ü•ŠïŸßWs¨³JA>¿‚£Øç顟1ªwNJ–‡:=ŽËÅxVÖ`0ø5[u꣗³N šøØÆá˜Bìcà;MBdj ”¸Îcµv ®Ò†ÜÚ»¯NC)k’( Ã?¼ÄNGÔ½ ÕŽ[y®ˆKØêY+ ÄJ1A;L˜§•V­Œê«Ý}E‚Ý)Eë¸Ož³€¬Ód0Ò¼ ëá¸'¾%ü¹i›ô,«ñm8:,K[}’0;y¥œví$‘ruÆ€abáì•Gˆb!È/aù¿]ófdÿ‹û–ìÕX~Uº<ÆÄ#K²ì6’m“j&ÑôñÎÞ+‰iŒò—Lb>êÙê±×X«Á¹=ë½ÉÔ>¯5½š„8Qn¡Hw§£¨˜ÛaÏ Aö„Ô …´XBW—m ü¦Œ§‘=²{[jýü®•5V´‰§äê 6“í;”6'pJ'-˜ p‹VßÇ»qf @b\£øÐ~D¦&½rhÐ佈1N}4㨥:…þSÉõWu“˜eD½¼þ_Âa;úóôh^{ùþYLaèý¸²˜úò”ge`k$ØNpŒ_‹Xt@W1ëWaß,6Ö«‚·n|sjöMû{—D›D°ÓŒÓR˼àû˜]UNDê‡É VÁéD+½p“N˨S<…Å>—ø¡¡ 2N}~Í^¹+7ÛTNÍüúûìUQ|°FYyØYH¸ ècTIÕ³'Žó•Þô§nÅ :-ÎÐÌLCºžH©Ìýùç³MuxéƒÑç^Ò±)¥–T“”“ÍÞÔÁ Dffibö¯Þè£/E°n¨-4{x]ljÂǽ̊¨Òˆz¦jÏûæ p˜ù)æÒÎñd€¦2îuéá᱓OGÞvÎf«Ô&TÜSÓ=-s-ëñÙ:I"3µ Ç{¤h*‡Fm˜$?dOñ£¨x´}ì%ß6hgýfúû¹BJJa9ö;\)À Ô¬ÏU¢NT÷¿ÇÛøHöò3O ƒR Ê…ýë‰y‚Öq[8&»)wR\D8ÇèG °ÉЏÙoó’ºÒl¥¹<êÁ#…fŠ<UˆkA±«àpÝ|ص¯9lƒ"–R _RÅWiÈ~#Ûy}õ1zã#|·|L½çy|€Kân ®é<7²—œf`znÜZ}>ÂoÊ NH~XUÕ:¶„WwÐ/ òÂ[Ãnð²¢. oåH¥ìs÷G— ¿4!œïꊓ²CyCà`’¡_ñæA?Ö¬ŒhÒ.\Y2Ä¿šË •1… ô½ÕÜ£P@üÖ\7)•¿ ð$˜ÆòƒZ³m®”^Ø=[?ææÖº8dzh)e‡xÜo›°¨óÍÜø ìLÙÐLíY1YÖ¹r¶&*¨¤3séÖù\óÊÕC´]]­_D/1‚=úØ3h'œUN¸ ô²BhÑZ‰£á0ïdðÔ•¬0“Ü…:HAE1¼™$HêEüŠ`ÐÙyä¼=ïbd½‰XÔâ¦e<­ ³ÞnA«ÿYÒ»m¥1ԄЀ‹VRÙ£BõiRûŒþ†š¸¾Ø¹g(o¢þ+jIçË~´ìd€|xÚA žeʼnñÊïB*ÏÇéX±mÆìãæÒ¯,©Šy[ÿ 𠥫AOgÚa¼ôÙ'áÜnçKö5y<Ò#KèåV/<Ä.4w.átý£jiM¹KßRç|âÜ ˆvFWϱäöqÃ7ùãªOÖŽ Är¬l§ü¡³›¶9bÃÜÆhzÚly˜ÑhöÊqMs}‡RÝæë`RÝ´Óc–9Î_zò¾p-dWϧâ>­ TF¯v«TÒPKþc­‘ ·‚PK |—Gîî܇«J%ò config.statusUT ÷{VŠ}àVux èè¤+aÝí±Aê+çùºöƒ­ÏŸ\Ø"pÙàð‡FÆ8[-Ç!U¶gÊnh¾ò AOjÉs}ÓIÖ<öæJˆ‰IóB·-¤…ýku˜Ì™¡Køˆì¾ç]ß5ò£ ù6Q‰“¨zkdÔ¢û *wÄh²½_Ë #f)\—&I²z½„ÖvëA)Y`+?Ë-ME’F˜vÒ'•e7vW–ìV‚i/ÜËý¯¯9pvôŠ ï¯GÌ¿N¥­§HZB‹%àLç|g}k¬õ…BB“|>5›0–ßA¨¼Žª~@/•ÚíÔz¼8pÇX‰Wý!6ÃÑç8]®T˜£Æ·ªÅOMZƶ_0aÃø»º\|8ªñô>µV*Bw¾,+NIÕeìdHñà\\Á×àµUœ?»ï|3dú&åM”o“À ÿm]ôÑш}Ñêß¶2›i7)°\!Üœ¾q0ìÈ¥ SØ"2ˆqlÝ;)!ÁXFŒ¯­‚b«ÜÏ©F<×’ü;€àß#´è‹ï¶~›j.“î]f^²g=oä ³Ó©äOõ4÷XÍ YdÑ=ºæoð[¦Š:12ªÒó «©b•P¿þ©; £UÝ¢FP3…í§oØËùÂt‰‰TXÉñº¹ -†U9B_¸óõrŒÿä4É0ax! «yšÀò÷I ö #¸yöO 1›Š³üÆp™GâNô'Ë©c7‚ßãz—ɯÜ"2iÑw(ÈJ-Í&>¬Ça”JÝäË (TvE8èI%7Ue™Ü7k)ËLüAlN5é®÷§ÂÁoù=uÅØÎn¡“s„€6f5<ÝÜêÌc³ûHVûc{@…O9Ré Øì-†äSgvŽCVã,åøÂæ…LJX¥¸šÙYø}?yˆöT,iÎ€ê½ bPùµ­%ÿaᄎ/9Ñ<=–ÆëªBsh—*¾Ù@Qƒ‰­SV’GÄ;?w*W‹zìO{¼"nl‡Çü£\™7vÑ5:çŒ"¡x¾ 1ô9Ä'3÷öõTvhÁ³%–I¤Šs|um¸%™ìœ矑ÜWÅgIWå§à)K²QÜ`ñXcŸgÕyJ ñr9a “Á!lö†0òÇ…`eLiå8?ÈkMý¶ræišs³ÆÒåÚá›ÍX†d 6B6Àz&Ö71µ¾–â {—«Ìfu(ñ~ƒ˜WšŠµ9VªE¸8£-ð‰·b¬H¬X^‰ri"ˆ‚sARÒrn]%Æ=jéu3˜Ç[œŽ/ªÖÛ{Š·Ý·¹Ë>íü]í@0¸ $wE°;Ù¨!ê5M­»OêŒEeÞ¨ÞÁtéËÀlÐÎr¥®zÐÅ šþ–ÊŽ“±£BEåÒg&ìëøIÏÈKàꑆðß½âB°Ë}—ó7Bé’yö‘íÊ>ÎXIþ+zïjEbA˜Ñ@ƒ þ[ÎÓRÑI0€ _M‹gqÐ×!-+aØKÿrFˆ¾¾ª ½ õÞCçÛ×äÀ°wÈ+¥,š†Ç“ïNÂÊ=—3†6Xký04€aj4qrNRµ~ÈÅÈ1ðç?©ÖË×ÔÁbÙAØÍ¢á¿ƳoÁªÀO(K"FÑÊöxs²‹³ü.û®>Ã÷í›Æ¶hµaPî$4Wœ†Ó ‡ë‰oL™ûÁׯŒ& ¡Ú’û¨·A€ßãРʽ°ûçÛZŽl©[ƒ&j¢Îü m!Ñš^‰˜YW ÛˆŒ6ÝÄheÒRž±Z¬‰Ó}Ÿ þ/Az5 uôÅ‘›÷•çÆz X5ξ,~Wp•ï hûþˆ:Ûè XvÎÍEí-Ž¡{o â^60¤}EÛkFEÕ‚¾4X‘ö~À:º(¼"R¥âFÈ=HÙ‡Ä=ü6Á=Vz2Ï^‚B#].Osp OÂ7WÍ勌tžèã—æùõˆkü¹V¤…+è’­ü8rã·–ÿ3Ìi–<ÓfØJÉËÏÑ,oÑÿ¥#üá”Wû¦b>Þsut{$˘’ÜŸàÍ#¤¬p›Æ§…³ÀM×k’ɤׇK¡Eö{åÎMÉ àKsÄ3æ’;# “¥‰j¡ø8¢]«'šv€÷À¶vƒÖ6ö×)_Á}P…dAŒUÍ›Á¹‘°‚•¿)=ʱÁÎþÛÏžL­°Pƒq¯¾žÚNS:†Ióšþ“‡y\£¾›J+Ü/O3%TΉöëôlQ2ˆk¸ xÑõ;Óü±{A$'RÕ%¦}» ‘ož&feÞ˜µÄ‘,^ EϪ{ãèL 8ä*X <0 NhQæt¼øo6$éïÛ÷Å2…I‰àåèQµ‡8Þo`{çv$‰z±.ð¢Å4Õm<¿°EÊ_R©ì./†Í*uãv ™‹]Ìý?„¯úv úƒ§É‚‘#&&pL&4Yq“IV}„ÿó\» ®sÍ«é·ãd"…Woç+)Èk`x¶WkoŸk{ YP+é¥}ýÙ=½ï%*šª[`zyç”è̾$® gYD`“ë„Q>+àR¾HжK×Ä‚2T×þº\-ôfmš+"W^Ô9_Pýq­Í޽ìJYeƒÛÑŠ»G‰Iáè‹c*ùC¹­q¿ï‰Nù‘ ÍžkõOè«3+ñãðSà¸úR…œN¶ðð…Œ16P$¯„íàà9²› ^À _)'ƒ Œ©„?d— ^dCòC¤¾T˜ñ—nÚ10gë£än¸»´*j®ƒW8z&ug-òÀ&y:>+;ÙyÓ²ï iid¹ñS~‹öUPnâK’o5õ1(yUªVÑòÝUìjÃç©8ËÎ1æÆ¦/úÙ…Ë£ë›^ñ9ŠîË·ªÇ–‡“€ö¹$ù9ëÀèß25+ù"éS¢Ð$¤<[Ì| …a=dý±Ÿr.TÖæ|××+yhœÄÌœõjFE,†vá)Þ_’˜áÙ ùãØžw°.c`ñ²ÙöW­…iT¤ÌEèRb*ãLZÒÌUzÇB*3±¢ë³(ú,ª=©‰Æ¡ÛᢠS¡£Q`k³RTñåw 6p‡®4~þöWeÇutV¹ð `|^_O €z\YBø¿¯½‘/¬:"úxNYÒ¿l"&¿0sK®ï¦/  ß7êg¯¨l8Š[£RoÒYÚú‘ã8zâ<{T,°2]¡6\Œút©X| œŒèŸñ@t-;*ˆ†šˆc©%K’5+òBD’Ù«£pׄü¬,¾O×ãÖ€™ þ¢aL ¯Tœ,™óÔF«Ëø¿µ(»ÒŸu³‚:ˆN‚øáÍ®ÎÎq¼½OÅ2!"ùIJª ¿àÝaÇŸâà Ö<6…‡ˆØ5¨dêK§ôkÊ«¢‹GÉÔ1ÁÜ¥Ú~s7oÌŽ©…¿1¨(vRÞ$ëÅ+‚Â÷ã‚úM,=A Ø?Eçü¯ÂÓy £ñW¿ûrý÷ºBU¬=ÐèKZb*žç0N‡/#ÁÁìÉÉëN@X¾mCD˜¡ÒÖX\Ö²±³X.é~Ö˜èü;aki¤D4I ¨ü*‚Cĸ+ƒ‰ÝK±izad?æÞûø(q4¨{Þ%ìu•Þ–r…þïKOø›aËHqGÝ©¨ßœu°|ƒüúG° v>rè˜É9Ù¢{Ô<¯–’@=›PrºÞ¤öG¢þ$íã/ÉhÑ‚Ûc½Ûxç&ŒÖlÛþ”™,‹Ô]zó!aíÜc£«Y%´LÞMÃKí¡9+ˆ>"òCcmf‘ô5ø‹ˆÓUÂø!OÌšÈÐ[>ù˜j¶EôðñïŠ9 i49ÏC{ß+6Šl§&Òr¸q6kæ„­}ñ¨÷=G(}å݇ÕKë°"MÌ툯§a§Ð“~*M³-.Ùš§\,ë-ßšœ‚©óÁsµ „ùЃIÈ—Xi24ù Ðyf¯Cï²!'Í®ù!Œëã=.påÉ…Pœ2†~M5ÍMÌîý£]îm ô2ÃY%¼7—§>r$"V ˆEÈp&@(ìo {|´kЮY‚«€†|ÛÍÄnÒÑ[wÝÁE7ˆõÃ'E´ÿ‰2ÒV©‘ŽC Ç»Xö,Ñ]—·´€Ý4î Dì69°\n`ad^ú–£ª¦¦ÿÙMÁÇŒ$«;BD$F‘]ƒ§9%5ëÜ¥aÉ÷ð¼·ÑXøµËÐŽiô2\²yõBîN£à'D¢u˜Ù*ë#€ð]oÛGûdzp–FMÒ!ŽY0LUBNQ”Ÿ÷iI… (! ‹ôñ\ÁˆŒÑ`a•d@é×XDÙt Û ÞÎ…­›âö`pËÂv?a°¬ë¹³ïõ¨Ü¹XqØ‘q éÒì¡¶£¯’V­æç#÷2îÈ(b¿!Ìiò]æ+£`[Ó“e1o„iÃté ²©s¬ÀˆJ¹r êSEmÑ-ª)X™˜@æÒØußl°­j¢Ý×\Gb ¾kÆ]àD×Ä’µ!ã8Pj0Ef'n(4,.C'å@ãL¨al„MK/*δHè‡îkÚi _„ À$¤½´ èhÓ$€ Àƒ.à²yÕLí&ša ÿ¸¥Û‰¢ºùÀ¨[- ¢-6J6vŒJˆL¸çj Íu÷B=¾®!I:ØŽZÚBȲ}V/oõ€ŸŽâìu‹×ÒåÖ±ø³Õnð3Ȳ»î¿µº@¦·G ‚|Ÿç7ûŸ.¡v |y©â›ZE0Æ^-ø­´¼]û†…Æš½ ÍËep3ž¢ÞRxÿJU׺Î9zgC§mÇN>Æ£ó2h ¹5þEvn—/tK\Ù‡ÿ!ë$+wýÛr‡ÞÃuؾèâ ”¸Ï+»ô"²™«¾6=„(¬¼¹gÄ=ÉDçÕ˜ XÈOŠŽÚ¬¥­+vXÝ)Œ´âêñô|®öàÖîp˜hÊ÷^“,¯Çß0Õ±I©Ù"ÑÂTµÉû˜ë|úíðÅ8§A/˜y€”„0«ÇXtGëø¬ó24 £^OõH,°¸¡ÃEàb.q‹.¼ª_þ[¾‘üWnŸÒ—ø (*Øî²âRN=ÆÚí±BÍ?”m5—¾AÔMi~ž¨6×}×H"“‚3Ïþ†+àVç[»Åé<»ÏøTFFghvòÇe®‡Ón ë§År0”ñA[ „?(=~ôëù¬EûÇÍ*¾'™A$Ã{ÃxŸMÛ,ÚªŒ-4ïï‡K°À±K&?ÍÓùMÏM_õŽëp(Ÿ«'¼ö0E2ÕMÎoã¿þ'k`X1_Ŷ|>µMìÚÑU{ °õ„ãÏ#PøÍ̵«0]µ26q¯]c¼§ýÈ|]ýNÁì–uÄÍÉÑGL;ó™…mÏ=T j«µÒòíµ¸(õßYá_ì\ú.U$JÞNmùÁ©&ë ²ÝeµÁ¯Ä³O¿åV«´ýÕ=ñáÌwê-F})ùŒ0#Îj¢¬T^ThÑ>Ž v©H:_Oš%˜ÔÇ·1ÁÈgÕä:RS:ùÎÖVV­…õÌÃ3{âJ¹@½QBÉgPAþfè¼JOÓâKuÍ#™)öT6Øž'æ•0h+ ·ÕÃÉEÃþB+ª›ˆ¸¹r€ä*ùËß+)´g)qëÌšj,Øò ;úõÏCþ;â`X øV¢ÏäÜ`fÀwîïFtºìýW¦¨)-ÇœqPYt±(®¥oç»K£<‰2œmNœ¶Xˆï…¯Õ«á€áÇÇùsä¶ÞÄ¢ÕQHnQи›G£XùÂñðÛìP¢>HÌä8Ñ‹áskܸ#YÓ:¸ûF×þ¡<3‡Ó²¯tõ!áÜ9œ-ƒ¨J¢«&JÁéššI±5¦0­ =„¾Wd½¦l€ä­‚>¸íûÇIg¹jH§ù¡AÐO‚Ÿ]ÝÒ½ßN‘d.ûçú×̰ёF=¯é9Ý#/Aÿª_@e¸üº÷˜gpWY=3õ?¼|º@­^R¥Þâ‰5Ȩ¢ëû÷öŒmh´;„]É×.¯¿[VŒW­•[ÓÉjMê ~C¹ÒÔ‚ü?só»§Lü>yÎFp¨·i&M{æD¡s@Ñí™äãè—¹3ºmÔ­Ø凫u6˜ƒÃ÷×öóqÈV§þ{·9&Y­Ò{ß„^ì* ›ášJàöZ]¦RȵÝ×Þ ÿ$^]«èÍ›÷¹¨\P 7á‘R#®·ÖÆA|sœÁ‹sÃû Eÿäð"_gÒ»PÑ—6Õ›1¶PŠ*ÏP0XÂè6)°fíÀŽN–¹wsµº—wF"Þ¸1„×ÛÅVŒê§Ü—ä_½½'H]bU8ÂðûõÙžóó0’[×ÃN¯ö™»zOXUàý„òì£Ô¼Ç‹N\ŽB‚S:XÓËóüÃcšŽœÿÊüþ·i°Šºzü/Z!¨©/4Îå‹9°Íëõw¬å·Uhofw¬"xcÊzƇ$DlÕê7HUX&dÌã¦Ë· UJÛ½’ü4çüã/šrýÓ¹·­‹dX躙æÍ.m5Çå,³W˜ÐÀH¥ð‘ލáÖ^¯‚ý’jë‡ZaOTfÔIbÉF9Ë|¦½K¹nØ®Mn°€(³ëjzjà„gŠ“8w5?GHŽ·ÞËçPM]™èQJó$ç8ÆÚS«×øË 75Áö³ó•ä7ôcç¢Îñ²ÖÑ‘ÎbX‹¨”ÌYò0]°—ä„ oç¶©x»ÑÖ$üŸ¨Âjã:bc?…£ ÒtW‚6ÔÊ»¦R‚öÈÙM^oÒ`›îia þÀ™Ùö@ƨ q‡ËX ©d0ëìàËaL±C¦`„ä·Nž+¹ð•ÕD|y©M±¢d}‰ÿΔ‹qû`è+n„¸…6Ø8ë‚Õa.Ù.) D”ÜJDMò7Ÿêø~¥A_r‹vd^Z°O¶Ò6Ú”Êã –æÊþ£?ØÓ¨lf=3jâ, iQ¶mç[²`Ükx¯(̦æÒ?”£åþP*†K…×Í"—bã춺C£mXÛÙq“Óe\Ö>0Ç;3_Eå>°ßj<“ˆ0ÍÂH♌?@Þ>k+§ÞÝ*=6Â^¬0”Ü¿í\†"mCžq3n¾ß‘âDrK×Ûmë°+rì 3Ñ€ÍG†_×ÙÉÞÄ07;œå£ƒ xîß U¡ ‚þ%wJÂ=*í³ƒ·Ù¦%`%7ÄyÎrZ­©PÕ‹žÑ°%=3`#BFö["+rÐ’:.ºêæöÂÎÚÆÆ#¶§ÈœÔ¦ü˜ïwÅ£B­k¥àdc€øh•ù²ôÌ\ͪ«r‰Åê;K&€è„Á¤Ûüz¬G‰Ve£oFJN $É?¯ô-ãH'¥yêœb!0ׂÍΰhïåJI _…S°9™÷âi$ž£Ü»1zí]M™”H»™¬þ~}<¡%ÏÎ+lŠ?²ûRR:1ý{6Ä éL&˜‰†çÄGA/U{Ø$X“-»}×°Ù·éÅÆ¤ðú~¸4*!B=€\Ö¼ÐM´˜ø’›­º„9¶Ç2­ÊwŸxg¶çYÔ0T,³¨ª‘Nuª èÂrK×îÑŸ“xÓŒyI º'È$ùÒ¢—õÅ:M3£÷¨­\ŸZpZ»¤çê°úet6ظ†S ´U’¶6ýî²}©„ÒD¾›ÙƒDŸ¯VSb4ôŒ÷F7¯ …:LCÚp%lÛÁ ¯û'wô?:@COä’H,£…Nòصa©ê·üË6ά;@Bö—5)zð ;,ŠŸ¤ò´nø V¤ƒ~Ù©CQu¦”L at5:ÂblÆWÊUúDzÞ”c«á:OŽ):ü{$vÐÛi²=Pœ\Ýê‰ê³¢~_W‰­_™½SìÔôï õ$•K³ßŸØÙ”]” w›°!:˜{&4°µ‡áH͉=·Ï@Ùëfýó+Zp­%˜^Yä’è¬!öA„'M™­ôS „“ûÿ¦¦(*])e`HŒr¢M"hñí~“hNÁVîí®Ä^ $ pÁùPi·}qéÃã˜kžØfTGŒiïSçý°èﳤ,´K8û+÷€< ¸qOº®4 êrà ¿Ã‡Ì#TÍþ4ó²¹Xô#/ÎVõr$Ø\†•Ììa³}‚·G½çç!Ü)Áê¹Sz)fçQúÞöˆÎHÍf…¤Eàƒ|F2'gÔ޻ξŠ0ќٯzgÚD°µÅËzc(uÿ¦Gµ»ªàÚê`zWÊWhD¼‚ÿòÌ:õÂæï}fò–“#¾4ëÓ €£%‡—!Ðîéyí»|¦Âw)±€«cDOô«ìh‰N›w´¨ÔÝöòÔ ùˆÃQ©iÜ{6ľ–-•1?d⹤ÄrF{e*Yµ¿6‹}¦¾–ýçgKß ûù>GÛäµ›Ï-Í ÓøÛs`JÊÂ^;¹.™©™.4³,!xÃö|ÁÏh{ö•Ó%–3mLÿx_*âÚx¸RäªSÜöxÂ÷³žþÎŽ·:Û;G(@â#k¼»DéìHç·(Õ^o“´m®'£þ±#Šax¢ýpúÛ½Â6{r~ìûÖšÝÝÈÓ{¥œÅÖÏ}ÎNzφjݲä/ýi–Г.‡‚Š˜OGKÁlZkêXKKÃQ(´-ÎÛÌ(±LÿǪúžœÉáÐánüÃ䣜­+MužŠëJû¨ÞÈçƒ$Ö çg÷­©[§á®Dö¥þ˜ö¬àªs:äŠ?'H +$ðØ(bp´—ºQe4º´÷¼RCêÒ àOD/1ÁºúJE6ð*˜`¹9÷q¦h; yv°¬0:à¹Bû2’øß[¼i•å|‰ôýŽ>mµ~”Zs{P5·dÒOÇv%¾,Z¹gÒ°QP4øNorˆ“ùHŒ%£i‡Åcì)taÀ®ùÿ¨'c»¡Ïúyc5óöáöçH°„§¢Öç™Ð‚sñ¡Â»{%6G«)?˜zoô©_ê=¥º2xÿç5K‡örÚÛýÙеypQ¾/ÓDÎUŒDÎÕ â÷ì{NˆˆÓ‡,è®"&œCF §;+%¸âOî•6naæÙU³ÛˆBý)G hK~ó»<Ò[9ïã]ùCÁRÔÜyÞ¬Þ+|QŸý€u*}8å×°´®¬A\ÜÔŒv¯ITªs38úhÓ«F{ÞR¢–ÿcÇ‘ÕÚDÚêf.[„àÉVšN™Záû«‹³ù“GV4T†Šp [7¿w ¬×eçß ¼ª> ¦ˆÝýe8ëf³`(.|â½-NêàõƒãS°v¤“o»ÿ¾ä°ç#8$fÂSÁ$çCUìéTÓ[ÄœÉ-”¤JvÞzc´ÙÃ0IÎ÷BlÈ Ïk̃0ÆÌ ÀƒÀîqããÎ\Uü®ÀLõ‰NËóê^h×ý|ÖõQÃëíwªép^šØÿ“åCn8dÔ¾‘>oÍ_÷8âý­Dzø.`AçÚ7«C¶„GXXåÚü¦ ûÉ+9¨xå§ó@¤8Ó?9í‰_Vz@"<€p&' yÍïß„²ÝžRoŸdðuöÀÞ±™}´˜ù÷z.yMf¬áŒ1Väð´~~è¦|4£ lF; ÿçþŠœ´|ýÓ'hl„»K]=hp à(²÷Žjz=ŒJ)€¥¼ÕfÂÕÂ/o–ƒÀöãò#QØR€¬ñCÄ-šê³˜7";î¾)Ø7Š£Ð²s`ÄD­¦ÒùKÃþç+Ó¾Ø~½Òb-rEª:»8´ñô®ZÎXí¥*•ÇopBÀ»ÉíŽoÞ˜qz£Å#Ãß÷má!âlêOüªOÜ<ÖÉgß!†ùÑó}¤0b¿öÃÝ»/ºøœ7ºcÊt´0Jqðwߎ—YgW¹r߆±A†þ3㡌lCû+;¿Ê¨ðC¿&Êîÿs9#®G9£Q6ˆÍ^-+2‘â`ÝÁqÕÿ0û¾óGtBCym¶.#Ô–Ø›„´>£ùœPYÔì-\|Óξ6;9;,éWÆø9v^O~ hÓˆÛ"±jð…‰ãÌÙëÀ[!S™ZAã’®Ù|·ÈÊ.À}ÀeÈ\R<½ƒÿ¹dbãñ¤«1½5êÂ/ÐÚ)­(èlm‚*³Â^M_¸ÙUx¼Ñgdš9Ž­ãÆ;ð»4›Ú§îa†hðl$ˆ ‘zO×gD=vJ9ö™˜ÚÖäë7Õ™˜á‡H¾üpìM› ˮھ¹BC°bám?mOÉÑ„p<_„Øå_›‹jç¢~ÌòƒÆq öž·¯ H¿ÈÉ%ÀHîc<…€TMävíwã ™áO¥çWçÙÑ+¯"âÖÇ4M'TY°ío$†b@ÒVWÇåMƒðàáÉ{mêÊ.XƒøVž”z¸»‰’ö´ˆïnði󸯤…_tã¶}ŒVo¥ Y÷ ì?3 CìB𨅙6°`UŽ;„L|QR?¨^ݽ½ZÞL¼rTpŒ}¨r;DǘÐ:ù`î8 éSp©øIö§¹ÓpðJ 3ó®Å4vB2zx8y’`Ç7IC²DRßaKùÐL$®êÈTšAPG+)g¹íjÚũ̜¸°ÔëámÛ‰¸Ó4:þ=‚qÙ€/pá1ªrïÔŒÓÞR–Ó a¦Ù—¡š×pá\1§(×±ªÃ˜óW5 :ä.Ý–tËËâ ñÏ›/S×D¿VÃ"ÞpÊKýÉ´Ôì¼ûR2™Ú tœ3韑—6^4?xÎ*ØþN¿–úšÅ{˜-sˆúTßÅ=9|ÆjîhY³}‡ÉaÇIÔè= JÌnÛ´l\e#oF¸~dˆ¼ßå\kørëLDöQàKäݲL·;|Ái—D¼J}µ– òßßùseßÍ)iX çÜ£"ûÈ‹¶—ˆD²%U%’ó0/UeëŠHåéQÇw8”*òºg®åü‚°ÞÐ$•ôc©FÌmí6:±^±ñæÖ“ò¢fcíðZÎ'ã--fjýä®S‚Eš ]HÝÅ\ë…µ»eQy³ì@½`"¨´´Æ©¶*§;{ðñuÛ\‹J`ƒ×}td‹–ÕäR–gñ Kš™öI‡>äU BXkg5 áãœ/oÌó}¯7~Y8/+MÛvéHöÊ!óPÆ’´é-Åc$Ä’‘KðþMðiï¯ãÒ%&íSÃ5ðåý*ñMƒmqÎ1ã,óÜÔ!*vqz¤ µö}¡3`¯œ›EƒÓ+{ô…iw“, ¦ÎÊ 7YwÕoG&zºÝ÷{Ý>þôûÙsëVÞÞ€™Õ”êcüàç§åçXúŽ)ì;ÊOQê™úÀäyÃvþ´k€æ^ òìÒ4Œš@æI)[£ Èè¶¥ÞÃRÙÚ„^ü‰3‡ ¿éƒœØ3ç÷-ÞV{ézhBü[ïPÝ· A»VÝ'BÞ’ÖÔZxŠÓ)2úûì?V3"¶¾Ë•z¦ª#²aìrÔ±ŠW?ÍWû›u “f$­S Ì4®$õ†¨/¢Å7¸þ’u+Ì ‰ðžHMÿ®u„Ñ•OÔ硌à‘tÄ1&í¸7×5ƒ#f ú‘ú%èãhÕ+~ 0 ɼìñ\D ½ëá)‰¼·P –SjÜLcº yÑAÁjŠ=¶áÕ¡JÅdŸü½Ö—Mjê­Ðm>y€Í7r¶³ƒ/ê7¸j 圌Àõ±@]èÈаËé1:Ι½GÉcþÌ-öö©Qj–OE†Ö֌슕ÈpÎ88`öypdÅÉñJº£6í¡¨î=oÃŽÒ™–VânµÁhMa™Ã;˜Gò¢‹cÐ nÃÙ¦»JßsŸƒ`"óŽƒÄËx±ã†EÀFÿÎ/„ ’¹$:ÙƒL;„enšz¥òôÀÞ²­uNdø¾lšÒ3å¹»¯‘gŽ´ýèŒru5›öOfu„³0àiŸèFÃç×qvÐ.À™·6¼g6¡€n¥­aÁ[ÁO-hÀËããßß„8‰”6±{9VÍ¢#r¶§)²F Ì@àÑLkž®¬A› Ê›Øyí!(ZbÄ\O³fb¤n$gÆÅTázbx‘T&tê·\–·o í.=tÒ0m Egz˜ñ>ÿòšj¢»03j$^žÚ;¼‘9zW^€BqÓû»twÏýx&rñ¦1=<k|I»«àÛZIëÃüµÏbLK`áN:Íèö»³ç6[sõåw÷p×úƒ&ÐÛ(yÕæÄÌæ›3D|°é™¸7PNJr Üñ6 ^²C‡TñDf/•)ÎoÙL¤œ3¾ï~ÌùÎÇ2‡¯«gV0~ÄEÉL“-Á‹õȾJÌSàÌë3õ§éW>|Ô)ýÝÑÒš`ù¦ñP£p5é™u ¨– Dï£/µˆ¯Y?õcC2å“É>~OzºXÐ塦½ù¦So/ÌL_ b©dè,7ä Y]1“)|ϰ¦¦áaSw(èuøt5TÐ)映¼+R;ÅÙjÁ/Ëi‚ñä±­7ßxt}ÉÁËæ»‡GûXÞÇ?‚ä#c޷肪ý¶ØMv>5ü©I_¾%ÅìmÁ*رt—¥‹Ýc½ZõVø§+ vá¢þÌæ‰)XmI*Ï?îµT¹læUÙÔÖm$* 1sùW£¬ ú¾6oœmáíIGr‹IEd-€8èr ™Äw<Ê=4îºOÖî)‘8qøÂ~| ýºÿªséBúmAg§:®d ôbØlX³¹<@#T ©¢\ðöX]mÁK ¡›§‘$Åï„@ä¢ÿ#_ŒÝ2¸ÙËgd—õyd¤ôIçKŸ(nüLT4âO „Ô+¡Q÷¦ÝßâûÂ"…67 Ë`‘ü_ ý£R½1¸îH¹ýýŒIy²lï-WògÞ0øèé™™j[îÇzñ,@üz†F\B‰ÀêUA+Ú;Ð6 «kQ›©¯ý:Ð|ºÙL¤ÆM‘ë¯ÑÅo(ë+£à;¡‘ú˜¼b(§dÙ&ŸyR‚2ç°uñ|,ËŒ[='îdC 1è3˜+šÊ· er¤YU9eûMÅSÃqášL¾>@°¥Pàgû×ñ¬>#hŸà²fØÍúÿµ3ÿÂgÓú‰úÄ”X™õ0+)„²fU¿âîg×ûúð°,z)€ðHÇ(N¥úYÔÒÿˆ$ZÙ2¨`Q?<µ)ÝâbkEsO‰ii(Á9h7aAáψŠòL¼5š„ òøoNPg:¾Ò¶xÿ ±d¸o®©³„×ûî £ª0ð}·Ó§ËiRRn + 8"пÿ<…¢ÜÞ†ÐíÆ ²ÌirÍ’Í')÷d^d»±ðš‚H²h®r¨¨˜cHklɶÃ,¦î,:›,ñ!kÚSéÂjŸC$•¥&<è4ع¾á œ²ÄðXþ›`äÑòOžsªAZRêAó5¬Æi¾>˜PxB› ¶ïóÙ¦"²g‡>Tìæš šyù^wV7LÂt¼Ä3ý’Òq¹Zcóo+ǘÑÖ™„³QE‰lçW+ ¨["W7 BØLÚõç‰êÓ‹;z–šu |\1•ßNTDX15Ï;*”WÿKnœ8S.–Ÿ°djö¢Ôè €K()Ïö!¤þDRœ»Åê¢HHÊD÷±PF¤ñ%WÔ›÷öšëÏG:$þó€t×§9xP`tRAµ¬>üº«N\/:€«6Ey©’Ú1Ìù5&WC“3Û~ J£9±} SÂ<k:¯¾Çþït¬ ÚøÞç Ýf †^EnÐ;I’ŽE†5s]S1¾3¦>ÊNÄ{3ÊÝúØN¸}PýÅ!üâû€¸¶âr÷Á—Üäsê=–µ¡0¸Ým}åHÝWtÿ€‡ˆHT¢Ù:TH”&ÈpÖm ?j²ã=©ÇÍ#ƒ×ŽéðÖ¿EÄ%<ù|E§²£wŸW2ë¶Ñ%³BWÛÑ#BÖM€‹4ŸQŠC<Ûu©Kd¶ºcÉ;­ÄéH ÿÆ"¤¬„d¥]7oH‹säœ"*É-Çë*kµ°èBÕʲ~ÙFœifl›W«bÒEasâg(|¦xyŒ÷j&]jFì8'§ÚUé#Pn¼eùÇEº²Æ©ëŸ¸hßìÚ–€Ÿ³°GÍ!¡îOÏpµŸ}çÜûn¤åRØÑ¨¼*iŠ)Ï‹Û#¸Éþ6Ÿšó• OöÚ˜–Tò)aJÉYØ(CøÐ C'ÔmÿÆþ?í}°;]u\G'÷v¿™6Xá$žÊþ˜DÙá¿r!‰üÙø(Ì "¬Fܱ`–Á® ]’¡*úÚº.U>ÚÃ9ÖêÓ)Šœ½ü{–ß&WjJ™ò[kDm$µeÎÂiâ.ÊøWÁ'¤2bk÷„ΞÄpUÇ\š]éR¶«)‘ ôz¦¥Õ©÷‡¸Úp“z»ÕÄ43“•ë‡ ê†6@"Nˆ%Ûuf¹’]1^CB(]gê > í$¨äzñí"L¹ÄhnÜ–;…O%@$ÊÇ ˆSíÞnÅúusŤ_¶FÉ~ºS}𣠼Þy¯]²Žé'FC|ÃkÞ‹R™€ÎÇß4’h}>j–Uî|`uÞñpÇk½¢C(ÝÚ“w D/‡Ž”4²ê¯K‰—Pø˜¯²³9÷*Äѽ{ŒÕ âP ~Þ†T#ø'(Ë’÷Ä“ £3‚Jý)äâÉÖµ5šØGPâ vß’ËQDcõN›Ž}œ…í¾rNU÷´“ôþñFܧ@§D"Bîܼo}ÛÚ^$Iu~ÕÖ9zn6?;: ¢ó²êjïUf  rM;ˆ©yä\ áJÓ%X¥,‡]ZB•qb•ìÆî…ãµè”ššÌUæm …ê‡väPhœbƉ›˜&Êɯ{áao9×sWYÒ,d?MàŒ3#ήúÃÂf~£o4Yëv‚ã#g~߯@•yãÖ§! -òâÉÛºà袹ìʯ£„DU6ŽÂô£@YI‹&¡[ïOйcœAÌÁþኛÍêf”}Á¨ÞLøi™ØÎð÷!è[7Õ5ÃÅqH¯¡)Øø%r_Z(aÎúðó ëH2xcãòýÚTµÊ ÙÛÝÒP~ÑFµþã-²? ƒî…~“૤`À¸³òÂ…}œŒéƒßÔìÅ)cPl:·u Çž-¾Â RsmϵG:‘I§±–®>|;yE¥ßjýšlÞÖM¾«iÕ,•[GÖë)±•ÐAo½ ƒâ½ådÙè>®­Š3¨]N>¥òI0;šYÍôªLðÜÞP(Ó?B1xOKÇ+AùØtÙPñ•¼óœË!Ü„ ©ã4ÙHk l)YYQÆËSºV~Ïdk%³…yiR-"Õx"A‘¨nF…dËÞÔ´ñ#»ÂäTMB ¾0{ëG(ᥜ±7ž½Á$jœµI2BO|Ñ5?ùø1NLˆ­j• ئÒ¹ÕLà ‚I¤À­Ò“5¡µ¿c©¨Ï øÌ:RgP×Îg:Þ(»™ïH»©–’¯þ˜OðÔGK}éH±>“©*–IMYGÈ…¦ÐËzµrøwâø;¤©ŒIH,ßê“^D¼¯»K¸T¾0ƒ÷+¶Û&Ú½9½è†$j 9N‡é)>P7ÖGHT ÅYæñ{\'©ÂKîž5ˆaJ5~ïòóCgä)-݆&s;c‡±§ -Hž¦®]-@lúmÁ[îW-ñ8>Ó¨îu&ßÉ¥||8¿¨O?CAèRî£ædDbRw̯<æD‹½oh&·iS—ëÑ»v\åÔ¶Ûòvñ fûºüzm…„®´Ct!óHŽ’žM—ƒ_×»+óø6øœ5´Ôdœap߿븉‡ ³ŒÏµoxŠø²õ£²CñvÒ°“ôR<8;ÂÎñ*ŠRu±TÞÓåpJ9–JŒÐÆw Ûò×%ÝiÄåIЬ{{j°gµÂ|ÑOL—P ‡öX°ïÔ¿÷+)7Ö” (Ø@È%V_ dP:âf½¬‰å¿ÞJ>ýÐý¢KqèCõ¥;Ø9…Ð~GìÉg½€#ׂ‡ ¹Þ’;œŠîíïºé¬¤|û9DæB¢ÎÇt–htf7C׬çªs~`'^fëS$I‘þË_Ò}×®Ëþ>iÍûµÅÕÏ*îX_ÁëÒ„œÛiɃ„GBÀÞë`õ…rÕ'#Ä7½æ‚¤‹}ʼWkÄʹˆCïx” ž÷+†Õ(Íð ú>‰Ò)TšÑž§#V\5M® œŒþ] w¶¨5!ëgr¤³ J5Wƒ3Bùæ{ðXòÉgÒíM¾™à3;М¤þ¶š=[à ÊìAÏB¯ ÁQ¶’ÁýíVK}WÊûÒ$½\´;ÄR{rj£$ž©†®b˜Úi1‰ m{'i‰@_ó›)¶†Ÿ "ÃN2ås2!ò§í}ÜEáµÜ𪩴O@Ë‹,þ7¨¢½¸I‹Ñˆ“^Ù»ƒÈ V­n2 KžªÐ[#çé"?-âöŽÞî:ûô|DS÷2û6b¯ðf8à¬LÆ-µÄÑf=±Ã›Ö”Ä®XÒ;*©%ßa™å½"‘¿{¹õ%«¡“iޗ剰å¼5ÀùljûËq¤óXr—ü”Ëø¿hZ€(9J®–<{ŠÙ*…çzûÛíÉ 9ÜEPóíýÿä=A| 'v?!dÐ#23ú<ºL2o„ŽhÜÖ¬ü‚.-c6Î<7q—ŠÏÓ EŒÄ÷!$×›Ç`˜l;ýr쮬ì¾__ßé¢yC4‡ñtØÍ“f¦îj‘¾ÒÎF ÇJàf xåÒ²Nüv¶_¡YýõrÒ‘J…øXø#¦Aü…Lbôãq§ SÑ Cئ£ôL|’– ÌeTº¶V<6¹¢¼Ó ñ`Zcsžð|z`/²&qNkPË‚2Â¥Žôuû)%üè´mÐp:óÎRE'[úé”™|.1Åüª LŸZ¶iú³Îõ¹÷…WŒaaÏc"¾X \:Òšt}¼K¿Üú½ý®v<­¼nÂV]ªxzbΨ–>R:¥Ñ éP¿%üoŸ–¸ØÅ¶Ü ø”£uõ)¶ÿdÐ êö‰iÃÞYÆ$íØöY|æŸôæ[{žO%ÀÖ«¼§oTãÀ3|2IŠ ›øŸä4ÞO¸ÀvPމª^ŒÃ}…?¾D×vÖX-xÆ×=À ÑdÑW>@¨¼/Jã[ó0¹+Y¯÷ Â7<I¦:`õ¡º· ë¡ ÛPïÈ ¹Q¶ñpû§Ù®ÿÛ'™#ôAò(XÜ4PáO}éKU˜ýv?.µë¾})d§„ëÒÜÜŒG3½%ŸÑXUÝa!+ÈÕ·Ïá6*ˆ2|Üõ¸,5÷7;\–ȼF6äéú0Ùragaî•KÙ Ò<Õ#²ž¯FÁ‹R9ço3aœ 2c¬$º@%V?q ,Ä»$š¹Ò/m^ò”tEàf4ÎzèÈK€«°­DtÐÉ€ÊeÔrflð`õ²»P4êgP-õ¢i†!ªWµßÙ¶è_v ÊíÒ„¿†@³[ú¨šBcNÈ®IvvŽ,6f[lN·µÑ„Žd££ˆ°kži”Æ~VNøJ?Ê©oiÛØæ- >«E¿¢û´¬Eø0‘ôi«,q¹~gÿÁ¿÷Ê ?Öó]0h7“ɰ€úÅ鈔¢/ŠqÏ1ä {!¿nÊ M3…NH¢í™ $nAL¨HPKîî܇«J%òPK +> CÚÓ°»‡'ìŠ config.subUT AzRÎùzVux —ój>K&î~Ú›!èº (ÔÎo l·)Äóð6v›Ç‡*wcl#KòYQŸA9%šp´êF£“[ —F´ø2Ò~BØTêKÈ”)î½8Ó9€xzy¯}Á Íž -jG6nÌ ÖÑWMý‹Úaн¾¨¯ß«ÜÆ„MÀn4@IÊ£cÉ ÊœA¬ÒV´%üÛ´vé…ùÐN£’xÅ{}>½-§,ÐÜ)´=„#äŽ øt…Ò܉-%ø;k|[®¤W0ë{=¡1g\_¥-¢è§¤ƒÄuÿ¼8áctÒ8ånuh1Ž(ªïžÄ“túb0ç¸C4aì„"t‹àÝRψ{' ~[k0Ç™5à¾iù±¢g•ÅžGô6îã}ÔKË@A‚EÉ+ëD̬‹| Z²ÏgcïæÆ\™)]õQËy_I®Q°üQbx†ûRø»Y(‚g¯·OÒ ‘ØN\´ª Ð%×üLëqÞ ¦<æà(C; „¢ËZ2³»I+f$À¸²9aßu“%j'ªh¸é÷ñ|\ü½7¥!–O²U}…iÄÖÁKUÂÝ+äÿ—šbñì/ãÆáú?Wi7¤öŽ¢†gå$ Þa5qØÎɽVCÔõèJr-Ê{Ô;±5žÍ cM>ª‘_µ¼~š &@[GþÍÜ:nž ð+*bÿتpå‘*Á·ÓZ dÉÝxR3£ÁÙx}J¼^Y{²Gš¿îT_튠Žgv›¤KS{¿·P0BK“G7kÝÄà­HèyhÍÉiƒã÷B(á?w`¾¢M5~š6Œy„ |7"I1µtn1(¾ykï²ðM œÔ~Zek„ØË¦”À×Ñ9¡s«¨úÍ)~µm.Ö ÆwÑSšöŠo½™{ó¸Îp %™eï2À vSS—)9Ëü%Õ_ÄèQb1ð$pª ‚qâÊ’ÏP6šã¦\Üò§A*fh²— 7$£ˆ¸k ¶ñ³¡ng¤i[…”U]sÑ”4þ1ØFQŠÐC:ï.ñ:¶(±A“ØBP‰]N†½JåB÷¦ùq‘l#0œY”ð…}Õ–„dèÿÆ0vЪx éc·ö°8o©Œ`}Ä_F|€$æÆÀ€{w s±·P½ã©'¯ŒýÄI¢çÆúÒ†—3ž¶ôuµ85T?P3ÌÛCº¸ÀKÒ=H-Ðê0È6^Še ”»Ø=b±Çˆë†-ªßÇ™žmuس ,@»w¾XåÙRI鵩moiûIMRj0di[A†–ö${;M£'ݨ­ìpŸA†+ ~`Å(ÃÎBe6oîomÁœa’á¯ë™û¾ ^Ñ~B×›› Íf3ƒRœKܹÏedˆ”ÑOgñà1S‚:$ø¦ N¡×S .œôéšNT•á2ν¦Ù¦zXº\Iv'„0æõI§g4¾óäâÃs=QIiÆæ,­]À{H69Ì`™GˆC0›-—œ©¿ S°µ–ÿµCËðÁ@›A‘eÉl—šY#5¢«˜=WH ÄÜB8-wº_ŽC\ê 9ãw¬ þÍÄ<žÒ}qDûŽ|¿·V ÖËeô¨$oFµQóÈøËSˆ¾ùÝî´&Ùz'o$¯ê;‹ª&}˜‹ ÍÞAØG”ÛÑÛp¦5ý§ ÷Çln.JãS%S¿þšgÇaÛæõÓ˜lFËÌ“øŸ£5=ò·á…yúç`!H°a"m< ôö9Ñ/‡š±³3õÎ0«Çò2DV!ÇÏãdVµØ×»K…â›*§ga–„ùÛ==Ã𧻡ӢtŒeׄ·w€›˜a’ÒSå¾d"72W6 ‹L të´øÛ»5N•h7,Ž”mz“φOŸ/ëoÇp»(Yú­æŸÿ55ã«ÍA6ë«Ô[öa¿Þ¿bû tesˆx–U´M™›Gk×\?kÜ?PzèÓôÔ©ÉO$ö1%þ_/·múz™ûKnÑŠ·±ì3AåÚÎva]Ò„ªÛ„cugÓÜI¶àÚ  ?byó=)X#Ý&ˆ sOÝö”ÊâóŸ½{¬ {3©†;k½'oIØílE{åQ:¤„ÕÞ¬‰W ¥½5¯Lüȉù‚µ± ×ÙGI«ƒ ‘ãrâbÑz—Á£ÇK™(Ñi0XYýø+×{ácÜrhÛE Pð>3g÷N©S±$½™³e7:Ê ð9S«6µÑ™O•ÐÕçblŒlâOŸ¥‡ÙmsÏñÙªwÒi-)iÌi.œ?þõ“¯ÔâÇ–¨ÛÑ;˜iÇa#Aà7ÌøujÄd™àa, Œ_†×_¾R‡üMD¸èg´öX…»5¿EFÀ'×âVM<§›}®ÞÍæ¿æÈ§î°–œÍ2æ¬þKúÝTOÆ×gMÓttƒøUW\õa§’ðÔwT"t-âš {\X5Ǧð9j:m#¨¡MJ&Ôf‚ýw¼*.}{Æ<}i ¼#-9=ìÔ‹Êg>k ·!7Vˆ~DV18þVêXTfëòLpì/79’?ç…}¾r«S…àÄÞ§’-»FM§$ˆ×„änáÉ’ÿ&nÕ¼ Í´ê·£mÏêX*ºsϳÔÕÄ_~)rÕï{ ©á¢zëòËb¹x©ÌºÝìéIÕÇ[½P¡—€kŒÅÁíGÑ“pÙ–ŽÆæm½ö‹ãÝáiÔÈe»÷V dYq.uÏï¨I0Ä»J0² ‰žË‚ç˜ ­â/xçœ6ý.~gÌ%nY5Éåz2TB-²xž–äµ’_nbÒžé ´eªFðà00pE‰pÜ»tžÃw0j†ö¹ê†®>>Ô(^Zú›»+vô¿Õ® ÔÎäu€óÿ§³Ý¡’Ò&g–ä[— úòÊÎ3I¶ï~kq]Dè¬Óé+™¡Wk¹„h-˜ù%:8®gëÔ!Ã6‰MŠ4ÉÀQxÙ{-7³˜5ÒÞUÉqéq´§¯«Wy–‘TŽÉ"6–oî‰ Œ[1㫱šÕ1ôŸ‹E'¬‰#(UyÙc@Odú(kOFQ·õ’ë·‹} ´ý1“Z“P¡*+ðî°^sx ³H˜˜4°;„Š2óç@ƒ˜ÆŠÅm·T3Èn$¹Ê’ÄÌç~¥!½®RôÏ !hhCxE¢ˆK¤ÈÁ1¿õùÿQȯìï“”qÐÝ{t\6>[µZE° è!$÷ uY¾7à3l´ŽUý÷…®®•.ÌdÉÉ6ý 0Ý­¢_é8ðEç5Jèwv ¾Ö!DìâQ±¼€æKp•Þ]l¯ÂLOÅq*³ÙŒì}Uýó~ä]¥_jrE¹påüÙlæEsr·®5­ªÔÈTpAz+x•Â*&î« 9¿©Ê7¦r}ˆx0]gð^°õ–ܼ§L/r½³†b³žõa kµu'†c<ÎñúÄJxáƒ}¨žd !Z¤_XR¬Ìr÷l†©eæ/³dG€Ÿô©jHÓŒNöi,e¯cŒk?±H9™»Á#ÑkEØ/›1è>‹¦Šj÷MÃö©*”þ¼"Ã"Î~—Îî$¿Uûa ­ÜÏgˆ©“·Œ*¼Ð2§ §A{„éoÈ8 ï ñ9ÿÓ ñ›9—'yª”&[wB[îW–[üŸ%ÔsÙÓp)ž”q)ú_"Î$¸È¹ liÏ­Œ~ePZ€{¤8rl›p‘W2…Ér¼¯Þ?P0FnW,ã}r§–BÚ2Æ^"~ÎÇó¢{Õ‚¤øïºá)jüXf4¡¢g#]ÞUç/õ‘2/8ÇÇ r/êl¦™¥Ëßò‘”Ú1.}GIÔÀy–‰SMz¯aTÌ}•´ßùÅŸÆ[&²#h¤ ÏâxF[ÎîðÀ¯Ù3¤˜¢¶¶éÑ?"Jö^´ak?ë¼.ÑÒ¸ˆbÈqâPJ@ÚcMÿ[ù‘Q¢3 Qgy[‚Ó  ‡:üÀ»C¢ÉàÉ­‹ý) ¼¥–”vàפ…y½öjj¯IÒŽÓ?ŠÚ(_h¼œË-—Û^mr@a³¡3SÜIõ+µ¶ØSE*Ñ fúEÆ{×Ш¶Â¼Öü×&þÅÓü­ÛóIê™·ßÏWr5ªEÕ鬇†®§òþ¿äÓl|+J”Íû‘©‹%ßñ3ND?ÈV¸2z®K?ÛüR¹¯$ky¡5h {w®kŠrGZGHjgYÆPžíceN²>qŸÀÀ¸,1¹Ì¯Õ‡™ñ¸=¬LªÎiü¢yÏØuÑxu“1@íu© À»—|(Ý¥—؉¯Ùa(„Ë€ÌVÿPŠ êú4¬ðz­Š@¹ÀyxH©å#luÚä‚ ö¥ì^ù}ÐdôÓ°ZhèÓE÷b\Òˆ+YØÌ%Î-z¾°pɤ7SöŒÅZ&·:éŠFÑ»² —Ä3¯½Nø,§¿ €f…•%Ÿéù9‹-gÐÑyƒé8…_PÖgXÅ‚°Js|™þ AǶûý`Ñ:| »Óƒ<ð³|ñxj’ ªÌ9• hèQ¸^±KÖêÛüö Ü€ªS~þˆp¿à[µüÿp©òêú3HEçP­!–Ý ðEÊîþï+´ÈÀcO™‡È¾/÷>pо¨Æn;P5†ò/Q+ÕkTí*¥8ˆ§Mš˜“)#7!Ðážç¯‰H‘dIðÞêá>ÚÁ‡kª·a],J* ’ç¶ÿ‹NêQQ^òEÜÙ ŸŠšÛÊ  Üqal[Ø?eCx†Òºû9R¡8ýî.Û{[d7S’ÈÏ»?9ÂEÌ8“Ì–Û¼Àtcea’ÙAƒÖ–½Ô µÇ]Ú’x6åÈ9¶öÇåîö“ \Ä]Dcí:ÛDˆV±.Î$VZN€÷1µóìÿU^‚€ÂOoÉš¸aûwÔ—~j“jðã©`ÛRdžõÒ²þöºiä\*þ‚¿·£c`^­ªÈ™‰þÙÉi‹X;½œ__Âðº*PZw~öN ¿âõX—xÃ×n­ÈFÇi$¹ŒI~É50–z¤Ù¦ñô»è ¨Ó÷&=›¯ødÿÙs3‰ÂÛÂDŒ—?ȯUVè¹Ó?F¤ß ¢KDd‡ Ô¾#¡K“ '#»BV2s‹‚s)Î]#R6ÝÀ ¾žbÞñ‰b×ËçS1ï¿{à=yâsBôí|ÃÙƒ "5¦ÇKfQTÑwÑú³g¯ƒ#º6 ŒÌæB…‹%ìƒ$.¹’Ë[ ž¦pòfFœ,Å“üðØQÑ)º¶×¨/ê_¢äEÉ ~¶­š›@¶y©ïó˜’l&ÇbíÅu£2)º;¹™ãäïzd­ Êölb|®j(ž1ú§Ö‡žLŸ÷Ÿ Fv_PJ+?ØÒ¨Ü/i~±˜P`O!dÂ÷Ä8F“o6 ýn3 ÈèõÏ®…J‹wÜQË¿è‘ó`ÀÚùÕ¦º•ÙµúÍÛŽg)I¨K­"L$‡+ÆO%L<Á+û¥ù6[e¸@s¸{>½‡Eðf)­ÿ#úšµU6’tÈMŽ-Úf¦ðê/5Ù‹3 „µ{Ž4æÔú'p¯&’Ñ&·ÃŸW°ÿÜ}u©·\mäà‰°b¼A³Ü¼,ƒäßðél…6ÜÐC „ 1 !ÌÜЀŽV¯3j•H®NÇâ…ÙnAtr‹Ì3”]Z’/\ÛÄÈ‘ èo 3t-™µ½ƒ Ù¼Ò’Ö ábÉÌÇ–Â+3‰g”µalNé;iV÷˜|@Daම‰+Ê÷©­m…^ün&}æ0”IɼQs Ť•A"ÅA|öÄ<§ØÂ—üÚ©+kì{¬ÚC·Ä±¾Rds"0KSTìÒÆÌN‡m5O7Æ”/ä$ù’Í”è@ \ømÄZ¯” zœsßñ(»º[(š9|ªaÖ"mв&¹®W¦Åå2—K¤J+£ÚÝ]%Ó}EdÇ“™óbÄ÷åfzһͩ¥®CÒ—ØqÁ'-}®"Ç–Ç÷ ½|¾DÅË©LæÏëûBªp[Œñ cØ‘ªmᕜ°ñÆïƒ ½¹|cÊ©»ü‰=^øí><(>U å?›{pÖ@\6N’†ß>–ƒ/lMÖmP„ ¤‘Ú"#²MD‘ <ÒÆ­ªûŸF—?)c²?eßZ!{·±lÐÚ–s8š`iv â]¦ÃÓ1å4¦O$ù|Òz-¹ ¾‹Ÿa-œ#s¥df¾ß×ܱ¶lsæúF¦´ JB5ßf&„‰,_äT€‰4Áûxê¥3&F­`yjbü†­hÖ¼§ïÑ G­x^qmbº{̽˜,1ÖX@T\1)ÏÕ™-\ß‘`H}·_3T½*:RXxK43ê‘è+¤dQ-¯17>‹`þÙÿè@[OáŒA¾}LJh„¹þ}„¿Dô;¹ÔCý:ÑWá/Ù@ã \èÀëÛ›6PÒÒ+,$ç Œ¹oG}(aÈfr0zÖ"s8ûšŽñà3]‡ÚÓÇ(ÄF¸V$¸0è]Àà-¼ â´úÛº{~Õ\m"¼@FtHÓH5Ø)âÕ¶€¾éƒkJÝ=Æ£ b0r2éÙžÐ>®’UÌôÖNË\à¿R&h©ú D›—Ä‹ Òå6¹Vç°Y"p˜³¶»ð‰ÝYX{îz“Þ($E{>ôΑÇ?NˆF+hŸ¢Ìþ‡Ÿ/蹪¤àYÄ@˜>Ãò‚Ó“¬Ž%æÿ–”&›PIóæ›ñ{ ¾{^S `Žó *ëÊU_øË FmQ|r™æç£8Ch…°ÐõxÛ‚‡gš:ãÏýGçÀÅžúß` ‘åt™ rqFë`GD´´»a˜ÃjÌˤ*ÄÁ޳ e؈€ˆ¤Mm]vœTpŸÜ0û¸…/ZÕ—éqé­RAùK7ëiwå.ÀÒ p¢øòS.ìßÕÅàÊää•(ˆ×»õ·Ë™pßS¤.Â)@±µÌ¤ŸP7µi8 œÔg=Œ(¬ƒð“½XtHjtÇÑŲh§¸ &Ñ^gY‘CÇ2'Šèãrß<é‡A9´j®Öý°ûbÍÕ5•Ÿo°&‘îö³="–O·­?<é†äS )k}¸íâkµKi̽@m5<þ{'Õ)›¡íÏ ¨š¤g…|EØãQâzcW0ÚÞæ“MºÁ9úxn~¥ß÷ß+ŠI-Rƒ/Ù«få‡Ã $‡Kµº“®‰÷œôH0‰­ãšVýKQ¾ZÞŸ 9¤GŠçykÉ0{ÆXUðé©Sq”Ç÷kó‚—ˆ·ýL£C_¤N/“2yúÁ™¦öž˜ª”"P–`WMˆq‡QT U8£´_pZ§˜Æ*_ÿò£7¡;ó…ÁU~ÙIXòUôW÷/Q³˜jo}…Ÿ¤~Îv1`ʱ5ËDHeÂ…Cüè`@6¨?XsYKiø.vNq‚ÀᣘãöV(³a2‚û¯mЇޅ¤ÌþöPˆ¬ °9ãŠÚž-­^ºqaÖ <óy–†Rò#Ž€à€Ç'#•ˆchÞV•sb§Ú°@¾š$¿å:„ýöËAÊÒ¯ôŸs}X„¹ Ƨ¸¬»­ÅÛÓ”P T§vͲ%UZšâsÚhŸgβ”¯[œöOǸóKaÎÊc̉ìb¶kÎo“„sÐEc‹ÜJ'nょ¸&”Í~™š£*%µ.S&@U<¢å4ÓaªÅM~Iñ÷×ÜãèL}QÒÉñƒ½ÎXeBiY]Ôb‚½SKkO4ÂM õ¦š¿ùéÜ%±9c}K¬ÍMF_(F%”æã".ZPKþ§$ˆÖ3§w\pü!,g© *‹Ÿ‡(ò¾L¹ÙÞpû¿[NA‰´|ÏQ.gήZa‚‚ÓÇÏ6ŠœµG$ˆFµÎÆ`SSP¿ì_¸€·ý`KÜPKS+ˆ«µµ¸‰ˆŽìÞË}C1õM<ˆÍ{yïcœ»ÈVl¹ÑB±ê³õð‚¶/˜úô¶Jœ£ø|RLþ ,=Všrê'͹pmÒ97Ô¯"`C¯O$D9bùFæŠ{£Ý8­iMz¢,áZ½üOÅõ+¸à"Ñè’™Í|+Kþ´ MNÔ˜Üô;tÝd¯Ë.r0b"¬È÷\êvœ¿Ü×Në†áÒÃ?™¦ú Î⃢ÑÜd¦Oä_ ´ºßNþ‡¾g ì/@ "<QŸ½-Ú€…O7óÏy_|°ÅÌxÚCw0.þ Ž0%¾#*«æúQ @ÁÜ‹ÉQq¦ÔMY]Òa¨þ:ߨêèX¸œk*-fyøŽrvtDCgpÿƒ^ÅÅrã—=KOÙ o°!I‘lõ‚lЄÙçÜ› ­`AÔ¼ãA¬„h³Ö¿oä2‡#zåPY¦F xm0›(îøæ_ªÄ<-~]o)þéÐqð ¿EßVǪ̈çèH½àÁ4­Á+è ¡l/!Mé¸véõ‰K˜\,Æqs£a´µÅ CP­v—ÿSÖ§çéE9bÁK` ó,V‚‡†É9pgþõø–Ô%¢}µø°ªR¢Šçh¬%^Í 5K†ˆ‹m޵-fd±¡ oN›Áoù †Áal¬­Î‚Ì´ì¼Ê°¥Û>®™±`¶*·)†—DêE²ËÙŽ_e¤á} (}\ ”Í•û^Ïxáäã‡)˜E´Ëø $e9i´9 M<cšþ¬ÂŒåO3·\}­FÞŽÌ]ì’k2{%”“aÊYí§ã¤ñuÿ{/žÉ$ühœg™þELe7ج~¬ZOÛkÖ9ŠRm õR_~zѧãtŠÿ&b£áÏ´côG?8wE§ PªÞt4£R¦ŒÆädAÓjGw\hâ9µØ áŒ*ïÙ?M×2O½Ú§ÂëFj#®oæS/Ÿ£½Ñ& ω¶ÓÆ£`¦¥Z²‚fÌ®UoõLn+oQ“’P¥%·ß&Þ¿uÞÛ&¬Š(‡JX•+”#…t/Ý•}öua½Ê¦(†œÄ8rFL#ƒ›¬¡‚}WÖ™©ôši)ÁXË2º¢LJþ´TqÜÖZ&7鞌!\}•u¯¤›eãk$ìf ]ëRˆç²;©W±•~‚[ ¤6ÁÐÙj8(D+¿³ŒÒÇìèú ÖfИÁ Òîö+æÇ1³§hÑy…07†ŒÚ+\D £Õ‹OE@~ü©͉éäç2½ð<æáû ÏŠÊÜé0˜•¬IZj¦ã¸‹¯  ª ΠP8€!HwxàÁ'žF Rî\”|™H!8ª¢ EÖš=ò8o¸>R’3ªÃ#Žþq_‚¶°–`ŒK9cUz»&5iê)˜ Á»Š„éª}—¢¹¤3˜³kYþ$tTE0l²£êž¼^èøÎÒÿeuJ–ЧoöÃæˆÖñ•ôx*þ[3>é2{¨<ã^_ùªµ™‘¸®ý:÷AîÁ<;{Üh¼ñ›Ud¹}¹È0–­àM@.ýcÕs‹È<Çõ™-GÖG€—f­É_8.ðT¯‹sã²{ΨÙYo¿ÂĺGèd›áØëcl¬wÁí“Ï‹)2s ¥¯9Å«iy»bY£ˆ¶šÁ‡SÙ_,i?¸iÎõ@úÜÛQi ÿǰi÷F-…Îo~êüùªYh:N%ðÀ× -sÔô2TæÎÞxÝꌞƒ¦^6cÜrFð§úJ ZÌ|Þ@ãîÙ œõV…#»2” Ä@Ë» –•è+ÃxÑ£–õ0tçÐ0ý[¦1ŽuŽ|/û$;¾¹u‡!:Týùj3¡ãßÉo˜_@*þ÷ï!eL¤™+ð9fPµ|Àhr:84²»ŸgVï…&KTU±"Ÿëy]ïÇÀr›L¡úKZV=6šÑê9Ô›rk[Ö9& g]kÚée§OâöDB•K÷‡›X¦ÃQD=.·î%xd×°G4&|´Ã9‡ä(ïåe†ÖˆÐÿ˜IÌýúÊü%¡M¯+txyÚz4’#aT:{LŸ>ô!¦Í‰ñçæ¨²Å\ >SòóO‘¨ç¬èõ²°ûó«n, ‘çrb<——(ñJÝ=ÿ0éã•]^ë½wFD¬ÕY‡PÖÁoúמÖÝõç×~"Â:·òX컋Dxi”l©ôök>óÂ7'(>± …Åñ º|„aÕi-9¹v#uêˆ@ªæûù©. ì®Þî±~]¥ÉeÃ1´nYí¾LXSh4LR$û°2%¾t)Afò¦ÊåïMD­ º'0¶Õ}ž €ô^ûq–r{d º°¬ƒëKìÄz–ÀÀæÇùn0|c_ŠÝÃ#ZI @ShŠƒ±»…µq>Ìw°IUH¼ŒˆÆµÙU“,—¦“«mÊè#hs*vô߯] w}fz¢V»tO³ `Dl¾™ëùŠa¿*óW‰<æõˆþ7SJ>‰ÙÖšD\Ÿ/.’-£%fÂjad,zÂe˜Þo¦“¢·Wû5w¶ÖN²  •·åÇ«”¼3b˜NÜèøŠ¦B¦“áþ£Ïƒô©šO¥Ü’6e&Ž"$Û”Áóù‘Wù”®–Äd.ZßÇ€ Ìi#@f[Ųˆ©ØG!ë äg•¾ÕiÃJ$è¢Ù¸UU%}-™Î\vkrÈòd#Œc +p›H4½}RÝHN߸ç%ð'3ñSÕúu^SAGn 5ØÊ/r‘Àî ’Ãþ}ËÍñê 5¿¿=šþ ŠYÞçÄJûåh2Â>Co××cC¥âÿÆû®æï¦W±’y•ÃønoqÒÅJþ’Þ¾œËý&Žq-™õ|·¬ÍßZ~ÁÏEu„ÍjêŒ]z bä˜ÁÀßš0¹1h­ƒh‚TG—Z¾å =·KÙóŒI쬉ÝÖ˜¼oáHÉ-55s ¦ ‹ªs|xû5%ãpìdP°³Æö‡cèVá×PØŠoc–>oÖÑ+ÊÅp³x´ŸÌò­Ž@¹pfžcâî•ãHIg·´•Z¦µÓø)² Kµ™äe'õ,\wgd­OüëmBÑ,}~𨿲0P„é‰6#ZB ãš'[-¡ïœGeb“WpòbPmX (ªs¯[ ®ÍÂK/l”hI¹EÏÙ„{î HòüêâK¡?No!ឯ¶Nö§ØÓ,_åÚóÝÌ$ ³ð;µ?g>³ifÓGˆmÝr÷¡ÀFó¸zå¯x`VoZð¼ÈåTÎÔ ÎÒsxÓ½#Õc&™"ê> ÊRløoåGø-¸ø‰Œ¬ëH× { ÜD.ϵOtÚ,­©¨}¬J¿§´Ý¶xÖY âGY­¨Ø×‹;“ßåSSš¤õ©©Ü> GÕýBÔð„Òö½'÷¡tóUýf·![kkÅp9'/¹,Mý)ÈÕë)E'7³æ®SdEg\ÞÊ2¯ÅgŸÐr.i Æà¤0k„a”Æþ$Ý”¥‰ö5ŸAs²Ê:Àà;äà/Œ$$Aaˆ…ç)âV—¤]¨RH{UÉ@ï zæžWk#ªÂÂhÙµÕ=h¶K…ß¡ƒñýŸ3‹ ¨\¢¸(t ,DèàU•û’½ÁZ/ÉÝËYõÛiìðz¤öx Ã]igÁ>»?Ñjå–q/*x,«&uG)™‰µi½ÛÓQ^ßÖÑéX¬²dôÉôŠø锄•5pŒã^Cž*î+=ŠŸÍJü{W‘‘|ä„·¼{8ȯÙÞòÆ‹µ8Ž ¢Àr*³ˆá;·]n\± Ý‚ט‰çXW¨óï>¾ìƒO‡´ q‘(¨*7<Î]ÂñZtÑd£?Éa›®IP£jtàiÔ§ÎH”þD™ Mãw]æ}(†·«x@#±Gã ñ˜˜fÐâVR£°¸æ- Çà—Ãs“—Târ+"!Ÿû}终ÈöËÍÉg|“t8Ómó¼ç¦×4 HGå@«`njÎ×2k 1¹Ò‰/caºà¢¦;3ƒ¹ÞºØqåúÁ,+~]·IÚbO&-¦/£zx>}î£sPbÞØz´Xk¶ÞKùǬŠÇÝ•-‚­mè«aEÓa>—øÖÛ?‹K®XÖáгO©ç9¨z®N烲XäeŒLË}ë3f¯œéøÔžìº¿ÝbfDÝÓ¦´Oÿò#ˆ×›Å·„ƒõwu"¥¹‹±Î%=æÑ3|”Õ±æcâkµqÍ´Éû¸—]F]`*<:/‘Ê"•ø¢Cà/ÝtË%ìeƒKê¥ÙÈ»ÒïŠèVJUg¿7ˆõ~mð7‰)ãÜQåsƒ®~Ð0†g%ûÐ!f\[jCVEÙ^gó6]†ˆüƒ‡Ž$ôÁº4È~­Y#YVø9,fÇ Ëa‘¤Á2òÈjÉ¥ïwô±ˆfúêqª¹î ß’Çù9¬7‚¨Çž®ó%ÄÁß͘ìÇ1,i¤´‚)„(³Ï89·*¶ë~„2õ G-½ÊéX‹Ø~tSY箂²ÂmþH"?¤Zª.]¤‰äj½ÚRÎKQx„ 1‰¦‹×¹…uÓmf’zµ/"Òµ³ ˜$~Mp*§Ë`õŒMÔ˜ÆæÏAbA´À™öa´2w§¹ºgËT ÈWÜ£Þƒ*8Ø•úó¤G…Ê]o¦KD7§\9òÁ‹*ñz('4IÂJDŒ™è4LÍêƒw(V;t¼}Ùì’ÌÙ0?d‰CUkÆÛ¶“¬»¥²IxœéO¶iÙõMÔf7I†¼ôYCbt¾w­ƒa™Ú„°–Òd§+t‡§H€àt›Ì'çhc&FoíÁçìŽÎG‹§46u€ýmâ!}-KtD ™ïäŒþ@yj 5iÓ‹G‡ƒÚ낤|žáA†ÜÕ&ê ÿcÛi¹óOÉ¥Á§½oõvNè'𹄌1Ö7J+†IlÔä_éSM袉;¦%ãå·í÷ÔµYA§ê7r‡OpáÀ 04h¦lÕ#/™Hïm€¥Ég.WÑã}|Fq Ñneû’½R¢EŽw¨o?RpünŠVSB ´–~   ÏvI’ð~SŸÒÑÎ!F¦?U‘l3üE§–OvŠd@~9ûR2ø,|KzÆp¢Õ–ì‰6\T2¢Ôðt¡sQTÕ0À`Žã,›~oD“hRZÚsp®ÉoJ8/3N)þžî€jÌPnqÇc…[Wnp'³Æ‚b1OpÞ!]ÐUåÄhÍ1¯ý+«ðF0½EonÌÀ¼•a|[t ‚rq•gîÅ‚Ûàä345ÖãÔHb%' ã"ô€³™ˆÚtãc8›M¤¥ /Ø]x«®­ÁŸ—¢7¬k¶ìæò8œŒ]ºÍÑ£l}x@rskõ•f"tdô#Ù76F¹ž¸˜É”®°V‰­CÍBbYVÖUw÷“@²ðVã+pèbúàfëWS aÚ¾ÍÀEüÀ€Å8·õºUéhzª#S¶1É€2~ÊK†Uoñ-”ðßÉ¢@)Œœ™žEH‡V€ÀÒ{bïæãÈì[ùôßj³ÉÿذªÔLœ¡Ã­&¡zÑxbnwR ÊØöº²VæF„Ú­¹v µîë5Õyá çh6òДք´Y…§ãÈшxí–Sví°ÍqŠ“P“ÂEl/÷,ÍSfÜî%RÑ3`/Ħ"Ýöºþ °\IB—$]l‰PŠç[BÈ+pùqÖd˜9SÈ®‚…Û/Œ r«ù2óyMŒ†„ˆÅ(ã„;KxQEO˜êhíÅFl½ûû‰½©äÝÃ$a¼g+–¯sþ,hÆVo·Öº÷èµï‘„Áã¢(#èš%Ÿâ¶%;4˘]º?jº©|€ÎalF”"÷£õL¯‚šŒÔt‘,ý_;“Çþ²¤ýј7ä6¡©vƤ°¡fçä²ßÍ•ª,•1ƦëØÐ…™–è‰)·=öô1>ß34(¯Àÿu ¾ÍUa\¥F£˜Nn4˜‰¸XGô³cƒmø& ™ª2“·k’õõç8A/<˜Á$YÀ,Œ‹Íô*S½vð41 píMÂáRÕGú®‡hw]RR¬H‘™ Œ³söž t•Ìñ½)¶#‚”ë#¡`?c ];ü÷mH†ßbÐôn¨½ˆf ¯UÁ¼®5òÖQ;[¢ /·ïoŽBƒLÐÒœœ¥¾>˜CíO\qžEËÕiÔþ gFØ|nº 1Ý¥œ×ko l|½XƤ\ÃlM=–;@œM ¼Ùu¬°²Š—Gãzíyuã ro‹q¿èìò(» þsˆƒŽÛ9»Uˆ |jLs&æäÕ”¨‘¬²5¼,´„<è‚íÌ~fˆ¿¹Ð]ÀÜ7¤œ”Úí•üç |ÜW0ÕÃõ(ºÜ°úæ}½dÀ—4"M©t`³Ûƒú5O&I ˜‚û‚åÿ^ý@îC"k0zÕ!qìÎ(ªÂÍÛóD“ƤæRÉòÔ#é ç¸/…ipÌ:Gž8ïT@=¤¾2LT–OÇø˜Yõ¸Þlà½\çi åu³A"ôþÝ14•©Îoª¶ûní¸HØZfèQwL»<ÀXϾì‰ê&!MÌu¨=›ra­oˆ{öG!rŸ‹ò“¼ è÷vÒôßëFÆ[¬D/~m2¿È;--sšì?!†_;z53‹oY“P¾ ´U>ïz¼` …O†<ÝåÛ£Úh˜µ.KdáC!íæFl‚ "ƒ)¯üŘþ’…l÷%µüÖà?¢ŠR¡§à„ÅsV£Ôm'Ej#¯”4ƒGÇF»¨»è‹ uÇc”"·êŠX©S¥)†Ê5bß1 ªX-O‘šÓ¸ªeø¿œ9¥gÚàE3Jq­Û†º(Є %qЦÆABUÏÆÓ¸^¾;,äEʬ˜¨ãâÐD=V(gÚ`!Öp²A½Ûº‘…ЄÏï4àæÐ^.Àñî µ€'ÿ7Ñ6BøSú³Ýd)Ò5LÝ@™œf´)0H=ðÁÜ¿ý:]Ñ•.aÀ :â#oµ[O5Aɯ EWîÊ-ÀGuÃðcÝ%vÕ¸Bñ¹âI<›%}ʾ›ÂüôÕÆ(t ¶¾'¾ Í?¶ã¶tka•zͰ^âÝc}â–6uñ™–}Ä}ÑöGì=ÑwzÀ‹Kg±¯^ª¨\˜—HŒéZOËG±ä86’Ÿ76Ï VEÌú¥ì4ðð,—Ö%¨Â=ø1¢•Ënʶo#¿§0ª ûl~pÜBõËÇ ú宇$„k{¾òWé72kÜËË=œÏd•(ä|†]¼’½\ ¿Dia B7¾z¿ã+¤fôè¦Q›Â »ß eøÅ¼;:÷'®@Þ$Jù¥¹ Þ ð%Œö.»Ý,^ñmÛ+7õcëñQgä9zúK¹ˆeƒ>©-–mYR$ÀF ÏÇN ,]`,ÎììÖfÞÇ Wç‹…J•²VÒ;.L&x!õxþÒ³•5lDÊ\—Þ^èóÿ#¶ ð)>©£U]}™Æ|3¡š”Å#ü£NEÒஂíuèy˜ýEÜ}RÄíýIQ›Õœ¤_ÙôA:E\@#ºùر³ùóŸH{‚fÀ¢ìЉ>f»»¬Œm÷ÔÂru yb%T!Ä=çž—‚ì¡«( ¼»òy÷¬lºIZ¯°m,Õ> ©÷´‚?Ó-_+f¦¦rwQjaÊÆj®3á4 ¡‹™kdû/A¯wO‰§<; ÄÉœ@¢;e›`±íAbò¥å9psÈló‰I펳ëœLÈGæíi×yajÍ(yoë%†¸þanã•z\°ìœíƒ=eôò»(»Ät¾‹Õ h9c.¬U­¼€Ô¶ýR¬®¡ÅÆr£Ã¡LºsÍÍ—Kßà´%vÓ3%×z¹b<àÀJƚɳL 2©ƒ"Ïsì 'h¨ø˜PeÂÔU(wòØF’óÇ÷t ¥FxØñçr°§v¹~ý?æ‡îIYÔnÝ·ÖD4‚Ð]”±ðö¥—ÁÕ´ 2‚kSÓ#  _´–=jÛ¿2n¿à(>z†³í~:¤Z¸¶Îéóú å®Èm-Zp6m<ÿ5h¸*E3m“)ÏÆÛáõ§ÏeÉ…Ž+ühÕ×R»Úf-X¨ÂzŸÇÔФ¤å.ÊôìÛýgቭߪ¨^4}/m¶šÊ•¤=â0{>¸àô’à‰÷Uš0¹“F<¨…/ZÒ/óÇÓXãWAvÃA§ Q³?3¾ÓÒÖv®<ÄRw¡ù‹ï/€¶w{4”f„/‰Ž®Œ­*Öü%´üUYÂíò/QluÜMÅÏG5ìa©u=îÝqÑ&´N¸—bôû]®Må†íu›gqäᕆ-bŸ’!‡âK0Ýö¯Œˆ&ØZëÒëͱ}V¯4ÂWÜŸ—¹Òp;ŽàÔÐp%Ì:ò4ªÄÁvUÜtzùDW_ä{•µd 5˜¯–/Ûø”|ÀgØ‘¥)øÆïVÅN°ŒÝgù~ „5ÙÔNƒ×}ŠÙÛã¸)Çp¯Ÿ¯É½éD0‰À[$Jm+0QÍ›×Õ™Ùâa°ÑRTUûf©\„ß¶ÇæPŒ#¶–­¥Nf®r$t¿ñÁ-*‡Ô&RÔˆysÓ€j 2x¨Ìds´x­$v¥`]jZÉ—ò–`¥¹mµ/:k…ª3~¡!sÄPä~Ùçg„·ð-Þ‚@-ýÌþ‘:^,(ÎÞ«LV¨\d2Eš™WÌ|‰z§˜’ReºðÀ_Þ€Ñ.s8 *qp˜•ù¸?û*Æò·cá“ꇤ>‰=3ˆ6‘ÜÆ¾\R´÷ä*­ôÄq§MH¿¼L:©«8šÏïQIiWA^†ã•>êß:Ÿ¦N¢NÔËdÀÆñøJ>†]¼¶½‹ûÖH¢õ ~Xy†5Ý-àòéúNàœºoà[`<…ToÒ–¹_=m–—UeþDQAÅeM²@}7î;|Ì¿©h ÌÏܺ°ýÎL2ÊœæFaeýG tÝ$Ò$ v.uSãz¥Œ6B®™¯È§VXþ‰ŽQj•ÝbãüÞ Ä+.uà^—Q }B¨¥mÚ ÝGÅM›!àÂ6f•CÎiú´4E{Ô6;eíCQñkOL¤ì{>\2KH¹MŒ<|Œ-cæüˆ÷XM\7l>J+F¯‚!ÊAëù‚‹•׆¬KêIe\- ¹©¢~?o¢QÀ†“Ø&¦E´÷)7iŸ¼®ÝV‚ÿNŒdl\R3³¶ÁÉÏf毎¤žâæþç­¯G®n§lv@»ÊbÖc²¶wL .Kº)mÄÀ_UöÃù{Ìj¹žàšÜ‡'ž¿…qRf Ç[¢zÎÛßÐÑlÎçº,¿Ö²õŽ0÷Õÿ¸ß±çá›ø Ê"±B,tÑkáH 5ž°Û¹t¡Ñ©CŠ[û`vwXóíÖß¹?K¶'N¯ñ0Âm©[lÔ¶†¢A}‘ÇXV»CÚ ¯)!.ÒámÆñÕ‹†M׿fÐ_–ì>gËS&ž²EßáFµÞèûƒâ)ò°¿ÆÙùóPå·è"ÊŸ¯nÌlñ óçLóPxáÕ¨7D{ ¡æ\›‘°[Ïôu4눘ê5røpŒCס–ÿZ?2$¬*Ž’çÊmýñQü{Çäe¢—$z\Ql2rK)DB)žúýË^^Ù NŸ,Uï¿ 0%‘n.×Û½3Vú%/ J>ÈDä{¶Q!ÂÁÛØU´¤«·»æ?m½µ*ïS [H'SîÅ †ïË£q¯Zø/À §8´¡ŸÍ–%¡Ý&Á³À@~«§&ùá»D^‹?ÐË‹«UP‹¦3 ÑØéŸ¨yèp:Htêo2=þ¯E×ÛˆëIÅ)P·?n›ß ߇'#úð Âíæ ôÑÛÈ£(&)J)!ƒypz¹®nõÛ䋨®*öPNå˜Gæò8æ–Õ0I9m­ýzVºViL‘´:“ÖK¥RÃn4?Ò£DÖyç6اÀþŠÅð{Ö¹œû)ó?C7m7|Ö¶P`„æ&x³ÆÀ-aïZñ‡"TŽ’w„vÔì8· è1Žç™9“úI£{o_39ÈŠ-®m%A¬¢Ùc¢VQB0¡ÒËmóŸøÚF£¹Ónº÷5±*ó×2êeÍ<Û!5Y©ÿ(,9B"‡¿;h ¸$·N†1Á4ÏnÛšŒt¸êÊ2劘ìȲÈaåmËáW®å~* šÂèœz–°uhVÝú2sH+ëg@( ‡æaÝ·Æ)¨àô>¹=“!€ß—‚I¥sø_ßrJÞ/„ÈîsPmt>éÚ½†V–÷ ¥ŠäÌ¥ÿχ ËT ¶HN7ÅßûŸ¼Ã*ÐLÒÛQ!+/¬ —}͹N¹°mú¶ÑËŒ¬Ëýl×ø×ã7¤jŒÙɽ†J°hrwþ­6¥w«ˆõ'ú‡ÅÎsWøxz)E5íx¥lå‰ ŠÃÊBäëòŒû뺫ÚÅ)ˆ=.!c³A„ý=g—[4Eô?”ÊÙ8~ÙÂú>&Ç…hÿͪ›K¬ÉÆpE¯Šð·™sJMá‚({•Á oâ¨tݯ¤F ¹L«ûÁ™P¤«¾3vœ>¸S°él@‹»è.µØ•¯±'èTƒÇ¿oмðk!C\z{å“7žÝ¹)ÁÒ[&Ø¿µ€"‡Ï´øÕíû~šêÙ¬òµÆU©¾@¦PÏ ûfâ”{âŽú8l×a¨G\àÎôª…2p×a°Çf¢ab¸ÿPÚ¾Á¥.°ý‡!ïFn®ÃOd=‡ì ˜0ÚÓtDå4¶ÀñÆK~„²ÿÕþwÿÕp§`â iô9ä;Ãä…Á´U#[4X2'/hÌÈüË¢cÐ4e´5ývÃÏñÑ÷`]¯N6Óÿ½ço§=o`· 3oÓ´lKx\}Ô²œßCÉMâÛ?2(ì#…q+Ø$'Zz¦n¦KÅŸrÑÇé–U¸×XÃ7í[ŽèЃLî·’î vJús®ÏâèàúZo’¢ÜührÓåUØFP¬fp{™umšVnê`C@õCš¤œéÂÈ™iÒ‚ïÁ+Jœe§µeŒH;T¥´‘Ú¶þ:–CÄè. ‰õé·^è¹Ujhø´1Ah!\†ö.õ£¶Üª†'÷gGTqÚmšò˜–2g§ÞK0>˜Z«`ýÁžÁ¿$—IÎ.xöw$ÈQÉB P›R‚šÃ:ïÒ¡Ú„¦jУô2![, ÿ}ï)V˜rýXÓUxÎÔLHÛ{õBõí{µ¬›46 ÿ)Ö p¸Rö ⳋš„C„î¡ïfp¯=Èú÷²ƒ&ùî¿`ãónÚ'aìJ3“¦h’F%S]1ªG›|†Éw÷‚{?>÷ÊîŒh_د5zÇúÓ)Æ Ûoùâ ˜a“ö²x·ZÀÍÑzMN¸5(¸<ƒçtryn·§ÆÊG§ð¶•G& µÑ‡SZ4³\©K½sÖ*y¤ðVdÊÎRÁi¡©HÖ”€ªTú^ '–Õ ;\<òÐ J)! xMÚÔ=Ut&ä$B6JÀ;lâ]–^º^ž{¬ås;r DDÆ—šÇJ¥1‘¸™s׊½FÇþ¬Y%Þ…,ΕÈÁŸ½ñ¬Àr` [ê­Ârú’ÔžxÅÅ°Ì •AcÍTÒ$ïcÇ‹×âla">»de¶€”Ýz+2ºÙ3tÐ^2ZYdIÿ¦ c£Ô±`?㤮ÏÜRúV°õ?î–ÛWnùlêqj±àMæ$h>ìÕº(x¬œû÷P)”‰2ö}¡žR¢«.*•Ì#ðô¹'³ŒÅŽ v`£È×—iJø–H¨úÈâ2ÌÚO×Éü5"x¯ÖJ!¶œIÜJ>àLÄÍ[Y4ˆ¡—$Ì=uïuð\‡âbÔÇõ C¢8ôãè”Jî€X¦ž-ˆ¶TñÉ¡WšPv¼9”Ð/?râIU#Dv ÛiyJ7®•‘OBc@ƒðŠÉ+/þ€ÊGáŸHI¬TŽ3äâûx±‘0T4¦æ¥[:V\Çû’¾øçç^X5‡‰túGöqÐ4þåle÷äo5fÆ?s’îÝø«¼K Ï!µ@)›kµÆ3’3ÏÊWÁi&ÂN{/0èYêŠøìùѵº®ˆ"ȃßCä7`íYèã{ž°ÞKÎn¨Þ§:zß‹ÿ§¾‰f‡dÕ¯üIFV†Añ¶–>"hæÅJ§ËÃÅ7ñ¨'þ¾cª/<ÁVÚÞë§\{)é‚)T[kω'lëåR qOõ4eDëšÎ§Og{BíãÇ}}d¬…¬ÔØÈÖ Ùôj?Öüó QñãŪ·%¦ÑN@ïÆX¨× Þì'Xn½Ê]Q ZÖ&Õ ôÆ„Nû1àÇ„÷ãÞÍ ›+ú‚U»Öár?Ëó_´/éNSW”Åeaz‚ÛØ¥æ“qD²ÖÌ´:É…ªÕ—¼¼2ÎÔq¼§¥ÏøÞ7àa^®ÈÃÃãÑ™ž––bc8 þ[cPêYãÆñ» ²`¶ÜžÅÞD£&fr8²4]êaÊ€£$9UÊȤðz²™]šª:ÇØU¹Y“‚§©/öÚIŽU“ùÛZTvJ.0UA”m¨T(|7 GZl¨wD_º–P0û§r¨øG7ÐnùJ^1!ѨÛè.ÂRØM°¨î¼êš™S k]}wâÀpßß:ÖAûä»·J-J§Læ~CÁ2”ÞÒÄ~åéNÒ~ìc,Y¬…>¼,±X{‘©Õß4{i’Œ÷[ãr?†[3…¿ÄêjžÅx1@>vËnÊ$øƒXêü>–ÑsOöCÎÑurwIœâªÜܹ§Nˆw:p»¾§ì2Rˆ¡¹‘>4“JUò$‹äþ©¯2„Â)# ®XËÈ×%W¥†Ío§9EºëŠ ¥KdžÍZ#ÏÙ¡§Ë^ïyü~^ ÞöM’;¾'ц‘>ÓâÛ¿¿O%9B#0÷aák<Êm­Þ:Žš5IZŠzÓ kª[Wsÿ 'âÚO»RéQ··lœ­Dz_ì—¦Ê.ó7Û7mPÂÜÖoÁ^Hô›xiÀ'ÞeŽZoøÚFw6ˆ+Œ.ËÞØDýŒ]uÄl>HÔÍ_±ííeݼ7š‹&.»ïI•–úBVîEz‹IöŒÄ•³lúˆÞAû}.þ·Òõz^IŠ¥æ<ßF#ÚÁÛ·! _¨$• P­¶nѻϟ Tg¡æ?Á§s;ÞG•t؈;KöËÀ.´|(“¦ìdY¾_’3˜ÿ⼑†R›ÈQj¹ž”Zzÿ6N¦D–•ö¡{dó›TÔ ¿ìý¢h^ÓºUê= ܽüÏ?V÷—ÛFPåHû1ƒM‚¼Ð`ÉpHä_ ³ÉA% &$÷æN‡ïc;ž…ßk=¦B?#nœœgjb³ëè÷.Ú©ùœ^!MÁаŽ÷-^ü ¼’igš\ÿ:)¿þ¯‚%ÔxTxÃÜ«'këƒ ³8IiÏ{úx6xáÝØÄ&ª“áø:™ $1‚³Ám!w:¢ë7¨ûG<éЉRn`ÚÔFнÙ£ehAíYýÁ&]HÞ?O5•r_vðq›ûQˆ¤.Z «Óg6þÈšgß+ÏB ‹1N¸uæç¤[s„à[}+!–Ä÷tÔBÂßYMåÇcâ$Ø0޽¾†íQ§>txأ߸Òý꺅m:øàD9öë>ÛÊUsÇçÈ{­Y?5öÞß‚õ”£Ì¦mnJ˜¡Öª¨¦Q×&GqsÑ´0͈UD‰Æ^úÒn+¡š@ÜëPaUŒ…•ŽÈðéMÇ6Nß³¡¨Ø4iHÄp‰=¼™ þì’d[¦¡’è§y‘Á£æ I­™s~ÎðáX¼Ä2M.aØh+&|/IäÍÓP¨« Ú=;ß´5@ZHJiù‡9ˆÁû>cU$»¾4.ekOkÚ9zYŸªéþýÀÌjE:¬²eömE`¹ÛB²zWìÀ²W9Ý­ñZè "ÁÉ«$œZx ïwB(—ßr×ú –ë>Öçj0’7p.Ó¥Qaj%!•]þÎSŽ×rÙú÷É*¥ïóWÙL/ƒÛ‡W r÷ÜÛ¯j\Àˆ·Ÿƒû‡’’Ó.Z¥Ð;¨ •[â9`I"ÐO¾a‘5`2–]޼^A‚s`sMÚ½Þ £]jÁa÷7ßû Lñ-lkY™<Î6L6Zæ¡S½Ïáð±%yV*lO^Ы/¤}ó¤Ò!¥V=dEÕâãÖNMo¶Èû;¿QÍ „©1B¹)»˜¡Üèó„ O“lÓÃÛ~FΠÑ=ͪÕp(‹‰þ€4Yΰ°Q Ï¢=íeþMªÄC>‘º× P AÕ×’)á˜ÑwÎeB¸.¶U/å…uáž‹·VÌ#Q?å PùÙšméÙ’1â§D£…7Poú´FÄm9·[Yjd²CÊÇgJ=FĘ>ÐâËè½úžœñÄÉÜø¥aA·&°þ§Ay`ØQÓFžvFà—Ò\«òþ ²¬¯“±è?"úÜÑêd]L»N¬I¾Zü)hF…€ƒ°:F(€ý†q”m¼¹Ìœ5÷/?¶‚h¹”i8¦Á¨§¯d*:~^ûlPÝBis¤F ;˜zÏ©¢T©Î£d?yí?»’q-=1õzÔ£YJx™Å«Á-XôZ¶"´¿„d-(Ò ÷RGŠîꔤ)†ÞŸ=Ò¨6mÆYdö†‡ðŽJaï…‘·Í¯òUýTXä´w]îœØbÉ€‚ P–ùÏÍRˆGøR7Öcì‡V—3ðPÚŸ”äŽ*7Ú\¯#SírE>Uæ‘Àׄžã@·šú¨è;N3TÞBs _jÙìbµ„Bξ‡ÁÐÖÕx$.¢NIeQ=S¶Ì2EèÅL§ ?OÍÆ°ðWMEŽ@rK)Þ"º›­Ù¯|N›‘ÆÖm •e&srÓç\Ñ×=^5ÏÆþue&A hõá}¦ì/˜—ÒŸS´þoÄöuB;×›?ƒ/êGž<WÖÖÝvæ´À^ðvWoþØlþÍHdS9 íQÉ"<®…¶³>Þ„‚¡TòŸ%Ÿì~—1 íædùý½£PƉkx\×"e;ÃÈP‰ªL#›ü²ä™6ÍÎ —©lÄ“ô Y”fѧ0„z·+(Üв™CZõgêJºðd÷Ù`=Ù_…´,H cl0câBæiï#âÒej1œ.¢vý´k1*ŒÝBÁIèß`.ÄÆ:Ç_e°`QrU…5#\æU®3?ÏÈ‘N‰M¶œÎ”ï èìtc‡Ü¶ï1…”6à¨ažñ èAAÝ}³¨^jãØÅ0Τï]5øQ¹ñ?ãŒY‚]<È•EfãáŠiî™Ø&nŸôèk©“%#ôcíÃTüF»±áU»rlÒàî1I~mu$n±ý¿Í-ÌœÞGühR<ÒˆRO¢µª$Â1Ìt·m¤бóáªjh±³3ì£# /§SChÇç¾(­H#Ý2f`⹪ø­:u¦R˜…ëÐÛ¼uëìyá¯ã¿2\´k€³çÛ{ÍeèK+º7¾hÜÀŸª4þ—DéçÍ%æm±~f¯&Ø6¡ª{¶ÊïŒÊЉu‡=ìñUó-gJf¯ì7KB’˜èh¡¦ƒw…U/)U‡wAy:“k“,LçPu˾VòVÞF¥5&êti´8åŸÍ£÷M–Á˜Î“¬Xý ~'S¥÷'¨Œ|y$ûûÛï²A˜TZê(TÅÕ‹i•$¦ã$òÄVWb¼#Ó#Bñ˜’¾‚ÕZïƒûª¾ ·Š+§¿ªVÁt…kn½i¦¼8ä\–9 £¾ªÖQáÄWe¥¢­ä‡ÅÉN‡¬}FºÌfUOuòÂ"=†jXL'I1>´ùA?Zì7ÖHÔ_í×ä: Í@ìt¹¥‡þXJžcµ[7߯a§Ñ‹ü»mæ;î|£m"Aº—Õ|Ó/Á¸z{‰)꦳z´68äÒ³ rK_5~{"1н ‹\û×î-Ù¦UA®wQrDþç ­ß›«fKÀÍýF^hïXð“ æPϺ>K—\þàl”¬T+K6?»…µzÅry>fÑÅ«%Ù]&pVÿþ€?aÂÂc£Š/™oäÛ¥ØÛÜøUÿð)èã×=ãçaZ0uÝ;åú™Ò’EÖÍíþ4±E½óP†ÂÏŸš-y–“ám‘E¥•ËZB³£ƒÔ.-Š»&-b¥sÞ–}º†¤$„»›ÓÃùïNû[àj{ÎûRïêð—¤ –ðl¶ô2¾H+wdwБ¢?¤Ä• ³'Pûä{È7zÈp¢°wŸ`¿ÏQ€> ,cänKÊ£ÔÑ9УÿÂÙdJÂÚB ¥|{+y¾ÈÏíIûÊwç7Cäh°­BüòÖ4Ž€„šVádÝ–ô±m¿oØŠtv£ž·íi_z5÷ºªòñ9𼺹É&ä¯çoªòvPÌÑb1¡xù*&N‹” Ø^Ðö &]öèþÌß§é‡Äé‡q˜âx”u*µx•³1óäPåC÷²”Ð%Åï?‘’–Ó®Øá ÃÌšèªåb@'?îi;ŽæÕ(m?*ñ?{’ÊQ…^F|ê¹æßT´2£Š>ƒ_ ;37sdX¯ñ('ÿûÀþ ’‡4ËæÔlÕUí4š»…Mä~qÁMðÇâMº•°Œà6Ðkãl™$<¾{ÑÎph•Í!y›©2°¿™çck¶ $ÈÑR Þ*]ÊP$ç׺&ÿ–Í-€½Â›ö^—kŽµÚ¤¾\¿ÀC#_YAr#2'´Ú £=<-Ïòõ•J©·Ž®÷êµVY‹°¨(ÀäW—¤8>¨Û¨zaµ§æÉ¢UÄfóê—Ìžâ·>õø§¬±ö_©2Þºãoxëþ´Âqô]H½ÖÆTN‘›¡ÛD­c ³½é­„_0/OÒ°‚Z{àmƒ’†_mRÅ<óö»á5–t'ôÔåö$&ʨ: ¯d,Ëå­û{¹Ûè³ëÀQ~(Â4CÑØL<í* x7¨¡Ù;û¿¶¨¼äh^«~ƒ|%H«ÃfhSY>š×Þë,¨åÜhRÔ!¼ Õ†K$P+ ×™ ³3<Û<-î¸Ú¢;í$Àà ,í±“HFÝ™ŒƒÉý VÛ¼LéàþiûYˆ-ûøAÚŸƒ,Jº|vWHÿ̦g™!?°I9¥ìƒŒ¾ÚÛ¾)5›§q–^ÛƒHKùñüLCôÑím'3 Ô%zO­4ÞyHšðO¿¸ò3è£L„59°|¾g&i@q«¸Ä—µ«¯óY$^Yµ‘$ê¥2 ¥™DÙ®ä®W«á×Þîн¼Qð @¢5-ˆî;¼{ø*¢¬Ng¬Ò'ýª·I 0ˆpßfp¢æ9Õì.'Ê:k¡™7×e"ƒPáÂxYÔð¦ ÛʦÇ8w Ý´ì4•À†ÑÓÓ×<‚|xÿv)¤YÅþm”¯w€Ômë!@æ8G^âR½jÐØ´WÄ@.&3MŠ9V=­jXQ¹‡æY`¶æšû§f“€pÒûѯSh›:áùfØþwï« K®©ôU4Y&>ZÜÅeiê¸Ñ†‡·¾:Õƒó*Ûô/#mܬ[´ I5ì”U^qüpPúQ â8}â‡o“`æÒÄ ù4·ó-‡#"ƒáðßßYíõ‚àv°Œ÷»Ô—>Ô×"F¬ ÿ‹T A¦&µÛE„H+Jò“1t¬$&núZM=x€ŒèI£4»âfÅÔÒòm²ÒÌl3œ…Aï“eŒO7ûl¤ª5œ “ ÑËÆÏ=ï—À¨-lî˜Õ¥Hk¡‚æˆl4m©åC5D´òs‘ŵÒZ?Lû{f(Íp—ú€¥Ñ1–]CsNÀ4=âÓÝD1ãºw+¶ ü6ÂŒe¼éúw½ŠÈÇ„gœU°iË>„:ªhÞbX2ÖÜ8ÍF&›AòŒ]êȧÓJ´M­Úæ'¡"‹w¯j™s‚º¬±,¤M3pë4·‘vÎP¡¼Uõè<©ù€¶ÿˆSÞy¸ŒxU_¦óä,4ÿcÚð¾Ò¨®13àŽC‘O6màŸ[€ÉçìALJ‹+c)GZµ*"ÄÁ'ž³îè]D¶ÿ5á]L»ºÙçØµƒ£PçŠ"ú‘¾ï[Æ™õ‡Á¦+Àžù£š5$Ö܉-À5•HÍÑu.LæQÚìÃóü.~—zʵzÑœÁËÏõ'#Ø_~"=ÜúF…Œ|“KâŠ..xöª‘*…xÔ,6I2+ÿ®µÑ…p¸÷¨Q,ˆ³‡FÿF€bžwïÐÔ=%U&Æ-èÞUÞh{D/ªwôBª­¨rÔ›L·ƒ¯þaDššKiØßQ€£ÿ[úÁ%µÆ·ÐsB=t§mý|<&6œVš7Z¸[ÕcÀí¯‹u#bO9À¾bá[z”÷™jÙàD$â;Ø=ÃÞ’ƒŽQdð0›uŠ"ÔwÐMöZúÂ|µsÜoù7`ó£žU°’ßFÔ`™æ‡I‰?y]|[æ» Yùü:^•…þïšÍZcz%ïsGx{W#+÷góÒÈÃ4ðO´åGL£ÕTØ’aþ_Ò6EJppï·},Ùô*LÞ:ú¹«u—$ÌûRO¾Z£ýè¤gæö|¬MÁB©|œø×°L·!ŽÈD*jB6ôr#Ôíí yl‡EÂh¤á:Ù¶íˤ")¦?Ïä×™|e,ª¹#{Ž#;Ïh#õN—TÈrœ#BHøþV#åaµ RûNÔ0p°ÑÊ…=^$&s¨:t}Fô¼®øÌý¹Ùýðfß&%gckôóú%×L$žß­l;6)b»‡ã‰{“7[.ƒ¢{®¾õ¶,.¨‡Œ˜Ç»[£¤åG{”J¶ÈiÕ ™º mšRû·dšbá 5þ9kU±°6ß"–2o›g††!𚇪ïäV£$†ÓCåìâ"öi€b,Æ8b½H¼EôA7‚ì—±'z–7•ÝúçŒQk¹SSbºñ潸…¤CB¤ùï™!Ay›ÔºIïü Nnmá-¬ôy þ™mÊkŸ-­ú zÌ!ˆqFë0&' l3 F¹ïfËscnj֛Ãî£×žW´{7CYwójyaZK&¾–{Ñþ§3Ï–‘|~ààõX ÷Ùºb]w° HáÛJwÀ[É΃›=¹¦–lÙ^Ü) .Än™µ= +7 ÅÂ@ø^O¦èWx«xfkSCã³³/¼VÌJ«yd÷'ÙâánNùÕ—S÷L§—È9(erY) 5®¦i—« s½ª&–/¹³Píô mu€V…Ñ¥+ä.]Ž&ðâ³ù§ïx‚ ÕJ]2zvíMm¶gû hÈrÐw#‘`¼¯qïŽy¡º<†¾I0œ}±ô„ZŒ˜JÁW‹Z€_¸w3·3„B•Š­„ºq0ƒº1œ›‚©{˜7›¦ÎÔdðGÿ'Ü=Éãÿ;M6Öe ÅÅVz‡ãëɯE¸_C‹¢@, BóHó0ÐjPM»pÂì¡ÆDäa:—ÐíX}Ô”º k.¨ží®Õ‰L®w±)m[xuÛÁy4Opᆰó>¨ à6Ì¥ÓN©¦…4:÷¿šùšÒ‰ÿ?v¦;œˆ~ÀƒÁí>_+î5DÛú÷âsÖ"·¬ñ~¬Ž·²Á£y?)^B½kQ·†y«Øy©-Å G•ß?¼rSÑJ¥c‡Hc@ÀY"A§Üˆr‰2ÃF_÷S¸È³»ÄkI_Çê"Qð°ÃÌêUÙƒþú{Ã¥Úx—$z™ÚGíöz]`ÁÿÜÊ\ŸQÁs¼‘bR[2ðh^ÓPÞÊÅè ‡&l .BÆ,Ú™‡Ÿä0ÖR5H©\IH:t($¿l™fÖÝëÎÞ}„‘q?÷÷ú'¿è%Üéåq—¯¾ß$·JB}°Þ¿èÙfâ„q¸’<9înrÁ #^äiÔ2G–y0 ô&óñx¯£ŠßI¡Yg‡z<} ÃyÀÍkÑ(<2Ë~¢s_u¿}²'[¦÷ w§±¹ì÷ßæŸCM!º_‡åþ½ÃïT)ÜM€Å¼|c+)˜FÞPA®”<¯ÜÊqþsx×ÁÔâˆÆ…_H¡¾d‹²ôž tìG&ìÕ úÓà"ÞætÂ'ñ¬¹Kõ”2FúíÞS{o»/¬y—è·¾e «þb «4œf>O¬)ùçñj*¡[q ,Æ-p| ¨ÚõmòxŸbà1e ûúî&K]ýÆêbû˜L™wÕÎ{’ ¯TÉ⬉¶P¡qµÊ–N)§E™œå¡rD4 ¥-{® “_NVä¹R½b€‹jûÒì2èÂå&6ÿU#âÓ V‰*«q×;‡QžbË[6ÃìÃL´¢ö?÷Tló5îûÈ^ŠÆóÉfä.u±t´)g‡S´à í[ IΓ-­¢Á‘ß}ó¿«Ë4¿ª¨ãT@ZPl0Íq0z7QÕ´Ê5Ð]Ó 6 îüËÈ ,(Ö¤ñS)¨âµÓzÙÔSþ–Cxµ`Ä/fŸ§Sl¹öXk9AKÙ’2^ÚqvUßÌ'“ë9’[Æ‘Ä5çŠóD#}ŒR û :m{’³¤J£¤eœKdhK‘Œm‰Ò·‘™ÚÑ}‘,ÍYŠØg¢k%Ìä¨'ÐQE=—™Bµ4Æ@°&N5³ç±ª ¦«¤¡­èß« klšÂ~…“Õ|k‰$†°åâÁ“c‹î/ڃϒÖÛ\XÌÓu«á˦4›ŠÓþK ¸ôÖœ#ßP›7‘‘³ÒíµCј5 ð3wÝä¤ÍÐöøi=®…ù¤ªlËj+K{Ö¹™ð>ÔäF=]›$'›ÐÆãÓÖ Âû¡p±éˆZ[Ká»Mpr0Glùþ÷ê>tfž/ÓüÉ%Ït#ý›Ñ`ÔŠ®FÚÍŒ¨¸Wg¦Y'=ˆ4@¶‹@åIBt@·ÀSƒ¦–°2g&ýn§‡É<«Ñ2¥Ý´O u®ø„ÿÃz41«.ç´ùYœØ§Iùþ{áZòfý”jʤK®·´[AAûŠTž–I9¹^ÂQ¤"*ÐeDbàÕ,ч£tJõËV‡Âþxdd­ #¢b 0·¼¼¾ÀòOÈ"ÁW©rb7dÀ+<èÈ_Óp&Ûßú÷X&d‹DyìuaW@e,W¢ÒW%$õh½ÏÃ'-ËT{¾G‚~(FÒ¼™"bdÑ>o`*Ä&DÂ[O'¼Ç㪌ÈQ_ɼ5üýû³<ÖÈ}ÃKàO‚‹GÓ$ñý%ýs=Âù8ýY¯âÂè üÒž%©ÛñŒÁ§"Ód®Ú(á÷☕Ó(=‘!}é…^ë‡ÝJÔç¤ÙTmš®mM×ܽi¥1P»%ðºjî3Êsãmà®Sëº>Ò3s xÝú Žy(É%ZAÁαÀ4´H·—){²a†f%v Hþ§Ð¶_.‚£$š8qƒ<¾ß¦$Í ͱ”v Ú(íeV‚ÊÓ]¦×dç|ý³è©g…ÔbXàdðN/´b¡v­ÿ÷32ø54ÏŘsb…œÉkm}Ši¼<(¹F"±´‹ˆŠþ„rcfÞH¦#†¾8Ñ(ÏÆ)eë*™Ñfy.ÌX:¸U¾”í~ô·8µâa2šj«&þ2ãÎŽÿ²k_| ¦¡£sJoÏ.†]‘/‰LØ:¹‘‚ ë©é ÃÛ_Ò–”oC ˆýÓ6ä¬4†ú­bÐR¯ ZY¾ÊµœŠ˜ùÄW 6Ï30”Û:šB ­pgéR1ËàôÀÓ¸[×ѹÂihñ¦a¸w8fFÕû~§+¶u¾•Dˆ§Q® €UáD¼–d#Ô3tÓ›86HNþ±m¢ã>Ä^ifOT™ WDçs„a6œÿûïxõ _¤ªûÎ-6îé YGóÛM%‰ŠÆŠï?ù†òl ŒH;ƒƒÐŽ´·¯JµÚ÷ Ø=Äo÷{zkÛª[MÔ<Êëmú„Ð ûXÜÿý‚zÝ¢›ê¸‡„ô×;© ®·[+×Ïo®7ÿãü\st=­NóíßCÿ„=@ë–?úõ`‰:Á‡´¥3RÞì‡å½.ý׳Z¿_–Di‡£¶ °FÔ0Áå#iOZ7·ö‚[y3(£hDšufļwW‡WϬƒì[‹²±F4MùGÄs.LN¾b®¨c¸£ßбɱùï¨úˆ«ÉQËä[Juh` <ÇÎg¶¦ÂYa#ÝØÒ}ŒIPJ‰ÁÜ`«B.e•ÌtÀÃI…„Õ²‹Ëx]+û™“Ù\Gb{¦žùxWœ Θ`ʦ;BæCYS­WF¼Ç¹‚ Y—àŽbžL‘ìôòhÃÝÇ-<"S6x¾õ‚?…Jå;.†ÁþÔ'#KÍšÚ˜Ýè'õ¯ÜÛ¿þÍ<ˆ/µ+# ndoõ‰„[Ê‚§”²Y½<ÒY¼3¯j\’ñ=Òé}qàôíõp¬Ì<‹uß÷Õ7”¹ÿƒ²Ú5z½ m=ä¶™4—pùb!¤ šŠ/ÖµPù£g áÊ Ç²qÿìg†›šÒ“÷[öj&n¼³JìSQÉô ó/º¥³FÈx®'ðû›Æ`‰A CùeâBY¾@xbÂNà:²³¼¢úöt·WzÆ{p·Û¬˜Àiuy´lñIûÔgå`)-Ä»,J©^/â÷ÕŸˆÈ{I³*„ŠÈNb6ʼn#`B5ûÌ€ÒS\51”A„•ö( ´ÅÁšŒ¨Ì]ñ8~ßsÌR6æ¯-ÙFß{ÀçX\U|í}áÌ}Ëí†è‰o@¢æ|¯T8#ÔéÈ3R:Kd|µcÓhð“ǃ01PóùžJ‡r‘'C-×\¼þþ.6¥þpAÒ•gB<@‡dGRœ§îÄõuôKŽÛih+™¨Ö3QyÀ}«ÝQ;g(s+äBÄ.·IÏý† l€Ã@@©uñ 6Ô SÎÕäÈè-Ї‹%o.ޱðÙBMSß7P£-êÊWÑãòI5ŒBµ{ÿÀQ)Æç clzlT©:±ŽH´ë¬–øXe_sg"ðùå ­.uŽ6æ/õD1?õ“Z}®]ôù|„–—F“Õ˜ˆD2ú¦Ò²Óvô/;ÀF­´ª®pZùõ±âæ=~aٛƀI›4žtì“ëôÌØ=ùM'ðjà˜Fúá§é¥F_ç®zÕÜÏêØâÉ“ü³ d¶JQ$n¡³ìõwN¿Ãþ**:œô¦*”Ú»¸HËjÉ/‹ˆez›Áb ÿuR££ùAÔš£UÄŽ/qË(ÕðjxÃÂcœ§Ñ|’¶€ @†˜Í/¾ažmi#jDtl“‘Âð’4u§ËBÝ!`òœª~VÈé)ïgI:)µ/baø·Ýÿ>“ m7¦ÇºypQnRlØTøÂÐRÅa=TeQê˜Fâ¡/ ß.àÏâj¡]HÇîvB3=g"ÉT2  Øx?)Þ×·S!óN×oŸ¢èM””jõùøÖøµií<6Ü9ñáI™p¶üD²øgtñãöÈQ"h䮿ÀmúÇä¢0ö,Ñ=v`ˆ?^~iÓÂfr/%ØBÝŒïdüÐnu¾¨xâˆÔ/³¯AçMOWòX7h;j F­µ0ã’)\#¼±Ø˜9±˜Œà#j3KF¿*Ç nÅÿÏiÙÆ¦¡l}#ið9—YZîúWï`ÀÔy„‚m{ë¢râÛ%SC{®ŽOÆ«ôX‚)k*Ò—RYЧæÁŒHÁŒ¦Þ3à[“‡{ŒÍÍmŽLƒ2PNr’™Ý|‰ÃÔ7ÌKÒPÀÓ€5K¦í´˜UZD~£ÕVŒ–zÝô åõŒ—d@pÃÑ™ÈàÏ÷X’Gz@Äãr ÓÖÿQLÖ,‚l§¿!³ë«Yˆ‰„á[ØI7°é’'\&=ÁWÞ5V’b[ÑݧM„RËæ!d[Ÿt"DÁ/NŽy\ØLµ9vB™ šBü‡l*ÊNAÞ›ªî¢Oâ3ÿK4>o*ŽIÒ²ˆƒn>X K½SmŒ4¾!^1ãáB‹ÙP³jKjÔ ñ_Ž,ç““b­¿µ£L§le¼œq¹@»"Ìöœ`= l’¥?Q?óšÛ9ÿ >e4J± fƒ¯æ¨Dw&ŒÒt¨¼Œ¯U?ºve¨*k¹‹Íݺí‹Bë(8Äñ˜Kÿ1îx¯#(N°ŠFK¡ƒÄ¹¬w½dù‹r·„˽« â3 µ¿&mPôàkZf2 5w ßôdÓ‰8Žàj¢,b_¨4J'—CÏyFV„¡¡ ØÜT ¿p8&MÂ4áln5›Ÿ„Z¤>iBh¡.P °JUÆánϵeñ[‚jìŽ8Õú·ÖW¨IAúãŸR†èÆxí*|÷4Qÿ?üïFºÉŽ ñNƦ´ÙÅJÞ/’mWÒ›^­èl²–óúô@䯄¢¡óäÛ»æjrQÇ‹ûðŠ{¾ð†i"‚¥w«³í9·ÝƒQæ³'ßôqQ¯9iÇõÊ!È)â®]‰BŠ)›ÕéÉ~‡²ŽÏ€OePålo‘†§/†ÐB4 Œ€r¯i‰ë}G¿7MÖ°5á$؇‘„Hgž‡_ ‘¼ÿ$ßËS^[Ο·9D©2ŒÐ þŸoª³_xnpöøTþ@ª+8ŠKm(Oþ¶kFÕ_®Éx6€w`í0ľCä‹¶È£¤Öçå»mÿS:MtÜE|àvaªÿö+æÞØÀC ‰eB³’µër´Èú©n“—d›`Ó¼›jofŸK¯å‰¾“Âk°áæÌyNPV9&&FK’Õš7£í®3O]M/û3XÅ AXá΂ºm›mUïc?–w=¿ö«çne;À¨¹…„!4pŸE„‰6‰T«µ¸®®"’Zà$÷igÌSÅ‘(Él™>*|ÄŒùتlè`Ë{ º”]¿9CÕP äמÞN±Uè3³›¿'‹¸öâÚßH9¾ ªF tsÍ‹á€AÕ®¡óiŸÅÉ·=bc4×)/žs}-€DÓòo;ÌNЪÄO…–Z›/‚@ðàʘæ¥Ï©YCOK —Iø7IÙþ®ÜmbOyï ›æ§íì­“—¯ˆó;Cß›UÒl½—v^t¥ªj·K²í„Ú°CâN‰F;îÙ<Í™],‚¶÷Á^p ‘Â9¶S’:ꛜ·ä¾Ëù Ð$‚?VoÂÓ¤³K¿Ín1¨¹{e6Ö½š¨´+ 'U\½½$ô©^íFò¥…ã„»Z`ÿHÍÏ*§‡&-ˆ³ úXø¦ŽJ@RPl˜Ö ¾©!)N¦ã2k0 ®—äqð!MÝx³K-\'sN¬âœ¾B9Èuñû,Fƒð ·UñøÏ¯D¢Ãý¯Ý]Ûû%¨« =®—Ûš•:˜e_•–Ω”—Ôº‡7"5ª&‚ Ù–¸5ª-ªÙü6™©‹>у|«aÉþ‡’ÆóD’³€ ˆüè2£å‡ížˆ¸„‡QM#Ëž~«žá—«SÐöóËÅŒw!Ã=‚t3ý´æÆÿ^œµíÙòÃßE+Ðyxèî=6þž€ó¯~¯ µïÇÛAö“œfßlî‰óJöÎÀV¢¡Vc†°‹ËH#ûó¥ù9U8ňÔ:úܰÅË\Y N¬¤*9'žßQþ¿WWÿÒ‡Ïé¶7¼hFÿÿ°m¯Wpê…[èJTV/{ûû{ ŒV٦͙KÎn<z–©\©ÒgúcṞa¯­ÙÉ»Iå›2zµRŽüôpiä%) ¿kQkˬg-¿1ú)më&%m€³)ºÓû²ÃjÛâ vöIésê†8‰ŸÝau·Ù³*S/Dv?¶~{SÇïæín* Æ‘l›Z½õió¥D0 —$ ˜Y‡¡ l`#hijëõç2>²œ%é5Õ-f¯Üd¶¦Îú3ð ¾­S@ùƒŽ7ÙW6@ÐåmÉRÊÜ)(_uo@ÓxFÚýK™}J^Íã•XYù šæ…>ªó IP-Õh¥ðÞÉõÒ‡$J1’] *–u©&\mÔ0¢kÇgU§ú8ám[2k=Ü9 ÓÙæ‰ …ø<¸2QÄ»¦î«\¶¿Þ* >È °ÍƒxQþ„»óÈ´¿a¨81œÝæ;âö?V²“ô×+¶×‹Àd9_‚~Ê ±çriÐÒÄÎHwûv£ãþ k†Iàn3­Êq Öǃ*}H;Ê‹ %˜Öq[„¢ÀiDàgê#JÍðã}§‡~æ‰LNZ†Áñ ̶É}ßšÝa‰Në¹íZ…sÔŸÌ"HÍ™Yv©*û¿Ì6CóºÏusV‹ ¡E„ËŸ/vx "š'¶@!ßdœ'„™¤a¯ÈД§5¶(Z/œ¬•eL¨ñ|…3¤âÚ*¼$Î_)î´ÐÀ $IS‰;Šz,CÙ«3¾žKˆ¯ŸýÀÝ„%çÑaËA(G@4ZÊÎuÄí=¬òŽ•Ñ¥ÜÖÕºÇ;Èv¬’‡-:gà£ÓÓD©ëÕÂýž÷-lQ2qV#®”Ây«FZ-»W¯‹ ÿ‡;•ßc:øÈ*?ÙŽßÞ´ÿvzVC] QPnsæUèòÐC »ÉºY€Íè©éñ:å 9”QîMùŸYilÀ;Úk÷4•¨ŒËã y| ¸È(ɶ§(Òhf´‘6T?:ðb^‡¥÷_ c¤0SÀÅí¨.›1@a)â5‡-Ùh…m €ÂúM½ó‚)j§Sü×SYIJ¡+# ŠZ;oA¡4s2cCò7Ï®ÿB£cQøÐ*€2Öõ^¥“äke1Ë nfÝ*Ûš\ÓÍÊl»ˆ{gì{ÈWtœß$ ±‹òhn†‰»ÙZÅlŠ&¢M‘;)XÍÑæ^ì-íÖü4“å]ó°»má,:¼@Õs]úó vwéÐF–)Oq«p:äÙF$bðo*ØØrZ¤qÚK^þ0°¼DjǸS7wZõ*eW P^Ô³I±»'dމÍpI#°&cbr58¯Gäºb…n"ƽ ÿnYßYBså ¤ŒB¢Ÿ˜Çêølþ# ’Ÿ®¹²Û_ÍØB™[Ú=^wÍÉÄy‹÷"a™ƒœgµ=¾Çå44Ä-"øî,=Tb­R•YvFO«w˜QÄól…U ¼ˆñ¢!}ÌÓ¶ˆ»Òˆž¢˜,†¨LÃÌÏOñÚýÖwW,O–K9‚ö?4ÃÌKqšEÒi¯xHŽëî3_†tÉ»aÛQõw˜pCêÞ·«æ›3¦S‡f§%Ëó R°\3ßË9¡:©-=ÍJ& ºJ‚LÚÞ¸SI¥Ù:ÉF!Èܺ™x\Ž%i€°ó.h À ¹b€Í£K ¡ûQG\ß­›ÒèÍܻĀç£OAæØ} `#‰Îrn¯ ªA®U {»o>žŸÀˆ\ nƒxôÀ}Ôù—§«:@åü ëå“¿S¦”h2§6 ý`ÞüºŒÞ ´Ó*oXF¯×®¬í¹§á”c°€îªŒœf§ð Rô1wr&LÈãÒHÙP+Æ»ê0Õ+ê²ù¹õéÂr_/ë!Rÿ‰kaë!Ëu°ÆèR©>nå™ó–‘švÓ¥ Ì€Ôh‹ ¶kZ…´E ÊÃŽ±D¥8‘¼[GÖb( +ñ½ÒÄªŽÆÁÌn¬o˜×ÃË ÃŸ«ë-0Ðixù\”º³9ˆ$àxkr0¶Öðü$|Mk- T=æ®xðX\rÊA·2hÄý¡$yÕ7>¨ã^Qº³ÓëA¦AÇSSëýRóÝ+Å’X>ð í1ðë !¿Ì6ô]°Öé ‚Ó)Ä~¾ò¹fÔÖìÌw~äÃä“þ>ÃÓÔQT¹žÖf'*0Ä䞈 ÚëÅ-ˆEÿFÅÀM‚Zʼe£²¥·a¯:3‹Ð÷~–k÷éH¾^¶x—Ðf½@=è¶:§a ð7Qýju±$Tƒ#Nw¤¿ì×¹c1€“ᓈy»Uç®JòÇ*Œ’hå$]Sï¨F §š8äÀo.ø5°Û-"Mì²a3p†ÎÙâ» ¼/¬‘ДA0 §†ÿ,ÈЛÑ'‚ÆjÛSh‹„¡±õøFªH&÷Åb¥Ý)€¢m2’‹àšÞÅ®©dx÷0ÀR4>…&ˆzq“ä"yß—š˜šášqÉ[ö·lé>åYŠ‚G 4´•|>êÇÇø´kçs¼¥î øÖËèw+Bähñö¢ÊHø —Ó¿G³˜ ¢ù®ò†1…7Ó4£zÖ…&ÝÝþê[£²"e|k‡­òd‘0ã à§qkW…ÂæG|QÄ-›pXÀ*xW¥yæûîöF[;³ aä§)VR³c›Míöéc5;W69u¡˜¯ÍÉ]¿.¿>CpÝ ÉÃeªô•ÚP»s‚¦Îñ—@x Ûˆë„SŸÈeÐt[ù¸n3j §{ÑýÝ`ÞVšDC¼r¡¶ÿÙüºìÁ›±$ åãʲL ákžŒC"8  îÆ)€¶ÍU $÷Ñ‘G³Ü®agÕƒ4Š#­¸zƦ¸KH9}Õ>jȸäæ3þצ³8lˆå ž¾ëÿ¥¥•ίûVk"åV'{¤Wy &ᄀ@:Lš]z²¢”džNt¯žvOÜli(ê>Ó§‡ ¾ ®õÖ‚“ÞÙ%ùÅ>nüu›óó¬Ë´‘K®0]ý™—oÉ­¦[¼Pl8=ùæl¶ç6çy,õgÞ+¶ j> ÷ó`LÛ‘»á~¬Íò ™œ‹÷àVÄ»‚ëìr…Ùô Gèè×¢ÙûIHŠ¥7ûøe8{ù4‡A&'d„áÅXõub»p¿‘Ý2Øn ÕHU –êf."Òz¼7;£³,¢|üo¯-ÂDš712{;}$…‰ÇþßþT4ݯ!î‹Ùbœ f µ%EÁ‘•“ÆFTáR£ìω¸ïy[á£cµ¨ª+¾“7³}ú,S¸˜'dàkçeçj-µO/–žÑ‹‹¥øDÞñun²{¾éŒ|ê®ã1+ø±ÔÈ4I»²žX눕På>gRöDXãõêÙê¹´upœÏbvHâÀî)X«¡½8z®Wf8@Æ'¿nÔÌ1äµ Õ&ÁØS¥˜UO’êžì^5öž”6gRÂj X?±÷öNÜ´=³û&¡—¡÷J! ÿ ûD¦É(²ØøÔê%£¾Ñw5P Ò ó¿ûð3p¨ÛÕMbú™Üæb©2;ä9çœéѾ³%â]‹gk½…ôê°N,²\}j`I^¹“gXDs\WQþyñ€;Ha4ŽèY%_Ö%ÜÍ”w]–äT×FZ³Tù²æRf°›Œ\ªFÔøbP(\Š+!°íÚ.¸ëºþì$ˆ’€mÓü©[ºÆJÕ_à âKÁÜ7oõ[Ny7Ñÿqn u'¶¥u ÅÛ©{‘eGà—•391&7"He¶VÞÒ‹ñá+a«[;ôã¢þp›ýïÄdÿ ¹pÓj·À¡r×9§o®T‚iá}EYݓ¶„³Ðã|I3ª†IGªÌ“%ûPÑ\?oòˆ¨k)f;§ùbhN£VÉÿ“»?dq'©®‹¶Ns(âUŸbÍ9@Å÷Ï$u³FÅÅ—Å  _<*B ```—ŽŽ´&JyyÐÈm³”µb¢-*'²ß êÚ¡_è »«c"ÖœÆT²¾7˜ÝÕò3†Ò*KýK?’6丿µ¹ê»px_’ï8ŽH\Œ_´)¾—uzM  Íy. Þ=ðØóõ>=žß{y÷àß©´ãûs馯ßõìçö¤<[@KAÞMB ŠƒÎ7’#K^Ý|JÔ~ ÈVf¸o b4 Øð•‡ÉBÀ Ko:x=£‡%ÓcÍRB7 ¥JªC†ã¦ýä yz¤º6nƒ쀽&-5ÐpúlÍrÉå3¢ÑuR”~VJ7M »ìÞ –|\¾=8BM`àKó d@Ô’KåG•wàÙß1Äù€¸Àap¶ õ<Ù9?æøâTÍÑMMçÐþ8?…C%tJ¾‘A"¡qÔš„AMúã!?ZfüÞ`ÒˤC­§äþÃ2B"sû˜K*d˜@FyãkdzÓÈ>WÕKwƒ þ²Zt¹D*^NNæþo«C¡ÒÏ]ïñÞ8]?§Öé{t``ôÓ¢úLº¿E£=I`‹‡Û+BÞzy÷¬Vƒ‡lÀJkµDúµ ñÝVÚ Åcò¹F.X$O{…&>A-ªFîHtÊCå²êµã¶¼âX§^v^Aë™æ¡êíü¿Å©¼ÍÜð©Ä'Å;…y~¨m®6|¨Tû`g®µT ›YJ  $Á´> è‹ùð÷OÙV;Ä€ M-; Ÿ½,"<Ù^€}òpß½¼Ztá…üú¹þÖs*¿i?sÒʃ¯†ä .§´ÏÙQIÇ.15CsLTB¼ý f¿Kúº\j'W›%P…PIKóý/Çj\ð©Yÿé‘'ìýTË0MarÓ£Ši„ >…õ»>¼)àÆQb.œ²°ecJ_*¨ˆ„SZJÂ7g(ðÊsÔ—ˆ¬³Ûáý“¶\=i,Ô.“èkæìn~¶¨Ð8¬j~¹_Ζ{Iãé<§Ñ( OnÞ±¹1l$™Ëô0´ ¹|Eu ©ÒÞŽë,[màƒŸ¹ƒ¡ÎÅ0µ¨#ZTȸ™‰š’¹5pn%ûû§€¬zþ™¡|³$?ZAßN ¿“£ö'¸ã¥x“,•ß…kyýŽô–ÓèÖvÎïaN»¿È|i&èE1a–;Ñ£#Äåæ 9mœ¡âH»O(ëScTÔ^ÓSä,5À÷ݧú-‹Ëg•¥¾rÏ£à#JfMÏ&÷[dïòÙÈ4±ÞiÚ^ÞûUØx9Ôxˆ"k›WówZ"›8µüÔ[°,èÌ’´:ÏpwI:ÿ´Ç?M* àÔ¿ ‚a„ú«ªþ!ëð=ô\JM“ܶnãûë?4²0ó©‘Ás© ß¼GĘò”t‘ßÅæµGW¢µAáV\Ñפ§œM%¾ŠbB4!ÁÅIert.3Taƒ1§ïU=(‘\—˦ºÛp9³eõT²7îw€ EíHµ³46zãoHüÝuhᕺ¿M§”^†„B┪ÿÇÆì O‡/nã]]Vºç;^ߥ+TT w¢ç¶Íòtž'’„’2ÍÕš7W¿¿tˆ¸~\ú˜Ü.Õ3€êûq±ÉÇÅ0§ÔóHhéJ7]™ðE÷›‚µ„›À®aEp ç.² ·ÚÔÁì'~K õ)Rçg#’Ïj×UTÔhýŠõ] 3ë€å ÉI‰“$‘˜;áT2Æ2TGe­¢¥q¥Õ ¶ýgGÒÒ$ê 2¡XNò¥¶á˜…ý\P•——x €;QA ™éljv[’‹éªgú;ùÈàSnFWXU aÅð?ƒªIXFrî5¦¦˜[Ò8A¸ _î½Þú½½§VdîùVfÖo?Æ­„åäÀg~u}RºöölkÞWŠel52+$-!¦óíA•Ø•ä~näTJØRܹ²Àæž»ï‡Ê8¿hR5¨ì¶¯ŒéúEnPT£ºìT²5È_d3\sÿ,oEÿe.¢þ÷Ñt>ø”l!cþ³]öòkÁM¥rÍo¿ZD¸*ö¶öhk4sï[“ ¼釦¤9Œ\®/ÅrµØÌ wðj¢0î¹"þ"Ž n®|£6 Œ¤Âoå‘u1(¯úùÝã8Û‘ä)9+áéæ>.úTÿºZ·N@‘Rgéîò~³%<^ØjžÊ,ç³Ð¦CJbHIEì •Í®³†¼#ýšÁòx¸ªrÓ˜ÈÎu>tÉ\'’ãÔÁî Ÿöe%A¥î>˜“èÕØ êÂI 4·æ#`Ð{·IôØîØíÄRç¥0_—9\,Ù„C‘“4jRçåZªçw¤kZÑ–kǡÎT|áV%v¤$rún[9–lfq;Z /S°y×5•Æ©¹7kôÃ’€ àžÚ‹8´Ú¼Å+ÙAŠÇ wð¡qFeÍt¦0ÐäÅJ›u»©úôÿ:Ôjw´LÛƒ~<ƒÃ\§‚ª)FnÆÓ?Ä,ïÛÞ ºÓ𪸈ãÒð¨gs­Yʰ»hokÃo7º,TjŒ1!MºV±Ãs, },g<ÂE“deŽ)ó)’‘Æà|vsJzˆî»:É–”AÆþ—<øåL{ónyƒ±Ö!CHBGsžÌOft8ÄR¡Ë‹V]'à K—¢(+{Öš€ptê|üt‰çi¾³´@|6|Áª7€‚FÜaZS=±ÁH4u¤IA¼J~Öù7¶r;?È<KÒÚ.¢¦Ü3Ú ­z3Ib¢å<Ñ`êÂ'îØ7q´# !c!ìKÒ[ôÒÖÜ’¤Ïf¬h™| ª rvú }ŠfGÞ, ç"Ú9£wœ³`”$¥|bÝ“ÿëÊD¶QœßBÇ!I{“ᇠiv•¹ÇÏ*aûÞBGr¢‚ý¼sÁf –X’'‡öaû;ÌÓù@nSL×õ½g²Vž”û³)´s%'—èf‹3>ãÐ<„’èÓ2„ðP‡9ý Cð´#P"Æžf4ËàòF‡<% :6ÔâJiãëN[öªšàxÞ´Ö÷ò5ŽU]0§b¹xhÄýÆÒ³1OmiGɨ‰nœë¸°ÏFÐÅs§óN†|kùy/‹ 8Äøæ·Äƒ­ß½¸ðùrrÍ ,Øšãÿù¾Š°ÂišÁb‘2JBù”}Q¥ÎÛZQdZÝ0¸y#±|äCŠÚQ.ßôÓHYñÓÆ‡a h_…žp/Â>ÚuK+!OêÞÁ®Uã‘Ã/ŸééD̵š‹$!ÏŽËÁ‡&·AA*ó÷š†³BD Úc’„Ð $,îÜ}^ üôUC%eª`a¯…ø³~ñRÒO“–@B+$Ä‘%š°ótÒU¸Œ€zY  Q¯i܆Ÿ˜ƒDß¼¤Ó0Ö:ösš)&ÌQ쯔’Ñbñ“'jéðL´ÅÐõ–oB\aæ(šCž;­;­¶×z£øÃKæ·bðËÄÁ @„¸††„cqÂe:ó3ûÅY3 èUU’Ï/®æ¬NŸ0uĵâÙ£ۓܰ A~?8ÂŽ‡‰¹{ »ŽÑ›™‡d÷‹ŠÛlÑØ‰û_RìÈ»»{¶b{Âd·}{ÔI(;²·IŽ›M<^ t´n¦;e1³w±:牼÷~A:{ܘ¨Ä q´Z‰|¶×Õ•kOmɬŽ1‡=Š"À›9|·Ç™‹\¸Ã/8©!îé;_²m㧦t"È&Î*kª¦>>—_ñkJ™'Þ®¥äÿa´×í¼7Œ¼,”˜ÆžÅp/n;|‚XçïÌ8Ǚ̦žÈ¥ÓךTQIqrbÈ|ÎP¶J‘‰c»€Ü|‰ÜúÀŒÓžÝ5½ŠsE;» ²’öÙDcPEâ-½÷ï’Go gvÁQ“GÇçÁÿêN·N&„Û¥¤ó»¤ý´7þNã¶z´Ì-~JÀîü&„Ê0Pƒþ€d!ô†â{R&È´FZÕÇ~ŽøC¬;Ô7Ò9vÀâÂÍßš»  NŽ¥–b+>splæÈõÿ='EaÈáï¨nüü„¹Õ”·mèNk_ïá¿üa±rµ;‚>¢ñ0[(âO ž« iןûÛôgz“‰!{ƒFš—>å”jÿ ¨Ý†â«—0Ÿ´"zÚ5I-Yþ•˜Pü'nQÑL2¦­­ÎÎjBlG/eAú¸7WUÉ©"†­Z(Xˆ“€’4jÓ â7”ço;ˆŠò7ÜL¸`±‚Xc-¡Bûc7WÙq¦:z ؆Ïa# DR.ø'œ˜ºúÅùóižjÌÀŽÃã¡s˜‰›:¥~Χž„ Ž^¬Ï||*>âu\±%ˆËÕæ´U媗ª)Ú@ahYìë'Ýàé}çb@yPðǼOß“ª>ŽSœ õðetxCRe›£@^¢Ö9`üïÜž2ÄÃvu£ðsÎuý¥Ù í2H/ηîú .ÿ\·‰|JÕÞÝãæ‡-¶²[£®O0l³ÕŽžá'R˜ât‚ÊÍ8|k`_9ªÃ"yᜠåP8ÕçâYàäÐv¥ôMþD:ÏÉÉíWÿYd¾éþó±Ï°ƒW}²=,ôÓèÊ‚„,ñô¿úîmض^q¡yQ‘³ošMŸQ—MWþ^GOƒëDfY ÷·âÊÂõäÈɽâ.–1Bi‚S>;jW…CÞŸ¸¸a"·à`8w¯²:uÒµµ°¨óÙ_]“˜Zé,BˆZHò>ˆ¡í¹åe?êº3†‘BwöÛu^7ÂcõV:bÖø ®<Ù¦hþ# û‘‘¶zÞ8Þ-è©]z²'Öà—ã‰Føäž²â&s¬ÚÔäÏ:>eE“—&ÝIÖY( Û¥m".¨˜tr²€Ç®†Í.\ºzµ팥žûH›*ž¤æ-ºf% ©D =œ¯`ŒïòopV–ÄTrS}Šw:Kæ‰u’«tXÚdØòûã.š˜æÓþò#ÄA*޾+9ÅZ ßx߆£î–/°ºïþ_C©Ú^^ù…¿ìWïã|Åïµ|Žão>sZÍ|°ßœØ5 ubû÷kú\¯Ùõ­"œÛ>*i!v/a·UÐ3Iè̲I?çBØi+9eíÞÛÀ±¾°›ÞÊ¿x6xô®ôÅ.ù3æÒ^#0жé KÔ8l¼¶²ŒöÀAá ž5”=Ç»ô*`±ÿZï÷ŠÔ]XpeÞº+)ÚéÑ{?iá/ ¡Œ³ZËÜ,0[žÐ¦0ãLM C¤Ì(Í¡Ñ×*uú7Qac{2Lzå1S—Ä4ÁïË¢ªùP¤‹ ¬à¨n¢í«€³X »Þàuö›X™X×´.f[áVøgʵo }ðì¦%ÒëòK• c Lfyz IÁ‘à4=c Ìo»™wk+ÔSÝ;驽¦s)Þñ/„DÆŒ§ ]R“8[=¯Úí?Žœeâ¾€vû&’ÏqÁøúx£Ü'nœ‰m­N¿9œÚ!¹úì(úlŒ»±#Çë­V1p‹xv¿YÌ0KœèüÕEg¥vËØú˜CÛaQíÍóÅÊ/ßoà“ˆl dRͱ(¯Æ!¼"‡ü¶–Uɳc[¡©lù¨7ÖA¿œÃgù&cø¹¨};iŸË@i)”’nî»@‰ƒÛ¼L×~çø)üͲ>ÔŸJø],“òØUCÀaa˜‡êöC"Dì/fëÔ½ªôtÜæP˜£ìûý8ŽUrÿ=;ŸRÜ…™¸Ä©ò23z Žr‹GdÉöÆ»„fƒ¤Vò¤è³´5%±™|×KIÚî–'Ý÷Ô #r]«„÷‚¢µMÐÅïmWµ‹ÁÔììݫУ†ñƒý~÷Q÷|Í ÝÅ2£š­+ujhD[ÕùФé›k·ˆpýTþ‘UèŠžÊ Z.oi×jôò?/Ú‹ÊàϤ¤jÈÜ—·tÖsŒ_åçr4®÷šäRÎ0‡ øÔÈIÐý|VCe£dW9Qu‚µwì[>4øDÙå´ußäýI J1?À €HR^|ñ/—»ìl‚•cƒbÂŽ†ñ=eì0@ž7?ç7s‹¾î¬swO²"‹Y¶ì‰©sG÷›"N°™"T¡éˆbœÄåveŒ$Üž)¬ɳ(rè•´ðÌ릿¼ÝlX]Á5ϾäK¹bòwl`Ì„üÃzΠ÷{:¿ü9XkííÅЯrØj#Ð÷̧oÚs½Ã²¨²ê‹ïËœIµäÉlµŽ™¸ÉØ8––å¿;»°¾(’8ÞåãcLQå_E»N¥—’ø@wtF N2Âo-C -!Ú#f¸`$ß­Ú7ím·4wp>×E~~v—D¨…«g|ñù ×—ós€tԘݿbétS1• »çî6Xñ§³0¹lâŸM—Úu­µâøtój€Æ£¯©´y®S„3øÌ¶éˆg%½ð‚Ĩ‚å–½Õ›`à7Û:¥|úʒŹ@ús¾öÈœ2þ„8™ãÕóA©çfFôa]šÃîC¡„žWq¡Á™@,á•úšV‹°ÁÃÕV16$€%EHž¬HÊ~:Aº™Ãͱc+Ö*²V¯žlgìˆôrS”%NŽ' EîêÆÂ™ø³Ü§çHèZ#貑Pnû$ēς,¹óCdö'fnªÜv ]\‡øå >(Uw‡üA Y…™²zk°§pÔª€æs¥÷p¡ Órò­*q¬ª#O!?\ýó?3ƒC»³µ(»úvÍbÙL/n>_ƒåâP“–ù~q^tÕ ÑcRVl Œý2 Hö„ÄÒó*ñ”cP¶«i‰®kHy!Л3Öñ÷ªýÝììSL³Ê–Öšëì ™wPáw¶0\¼œ›Úp¼$éçö^½¡%ÛÔÀäÔV*ºÞ wµè™3ÁS]ªÍÙ¯wŸÂ£;í ] ¡vûMÅõ¹á\5¹M7kYé å-#9*,ÿÖdc;ƒ$ë§ôDîc“P¾Ð†j³ê­»DOªjýCø«8ØèµÃçî»<¬:Ó+ë×åLXm¯Æ> ¹»ão½vzÌ“Ž‘4k¹—eM/MÛ õxÏ)lµÌ!0+²Š¹ÏŠkûvÍ{æé,ñçòç üÆùZÿ@€®”8Q·³Àë ðQ#Šzd×ÒB˜…É«\1"¼†(®ã˜‰ëì«Ð1TÇÒÞU-À`"×)e^1q†‹òdÀ<²Q¬Ø’nʺ¹W¡`‘Þ›=o¡Ÿ@•xøš…½%1ˆZ^"¦¥º÷š9k(è/}¯ö: $bG¼dt+WwºÉ†+‹tzíõÇÍíÚÕnmA?:KO'$±OC§øåC²iÞÆÔŸþŽÖ’4lä‚è¹'u$ž·"ù4Xì:çðÅ x•wgÊ—&rCSæC¬ÉÝ:Ý.…CÁ¢i½'žwî ’êÉ—d©–$ —ot3ú)‘×ÁI9¨wþÜ-#ëÛ@;9•ÇÞŠö(nîõ÷vÕtèì†mó>€ÿ—x÷4ë$(Rp]Þš “Å€°ý14â]Ýek4è'7ˉ… _Ýz-×L*á]¾ÈßlwöÆ|Ãá¶7sê¢~9…ÔO²+âb YTµŒÏC2¼;4ŒÖùZO$ê1SŒ&ý?©kÆ NβaîdFH!ÕBø}3¶Öš±Ú#ÝgêÈ©‹S»Ï©àUÒI!1íC‰úWÍ–#o´ò›²J-ï#õèf>É£€‚ý©tIø¶=Þm‘#†‹úŠKøµrÄšÑ}BK·¯²°qÑ ÄA`äŽý³¥˜¸y¯›Í?¡ÍæÄÆÿ<¨—aR´O!¾Õ=êLƒ×è¢Í ŽøÍ¾,&)>€þ€"2Ü÷2»s{£,¡l Õ–Õ¼Û‹€´ š‘ü]rÂäEÃ"Ïù¶äU¶vÍnc‰Ë¸â¢è<.S܉µïä`&ö欋G¾"^øÄjîËæÑíH±±Ú½ÑÜ‹gÔŽq•1&4{"Co/ œ†¿}–ø¯«hi?Dl’jÏÕ DSBÕù0ÈhD@ž@~HK–…¡ˆtG!qVµ¶¦âu(µ¯ÅÞ¾Nï‚ÜCÈ Gú`è+$SÂÆe¾™u+W8ξºŠ”x½*PåQ%ß»Q*R«äÓ‰ç•Kò¬ZíËŸoêYSE:t"‘a'‚óãù-SðˆŸ’}ÃàWÇÂZz7.mcÎÚü‰ÎÁƒ]Ù.û8‰|6½Ý2w_±š¨2ÎéQ,²¦wÕcZxêýë9é¿N®È6n¦+¿ûIÂUèZôîŽ×V„vÖóωEµñq«%HP”ªÖ~N«×€OOvÞT€»tÿØ/­ö›ñ­ùñè¡Ïdƒÿ üÌ…†¯ª'C ”¢_'Ä}mÓ Xè¢TT‚¯R>¡ê'† ÌØvæö²®Ÿ=\3òâ轕㠡¯;ah¤q½ì!4>F®U&¿(Qf( Ç´,á­J±<@t|‰s1%Ž7¬`°$!/´\… ¯Ï"\Ä©þòÀ(„s#®|í·“GZ_ÆÈ&*Pf°W™rK`‚«iå·% h\´eÀ‡œòq™îc—"‹ê"¦W¸e$œy™ÙhµàY”ËÈéz5Š@\ú5ç$Ÿ3ä…Ó»µQqxúö!lügÒ}jÆÊÊÅ…¢ƒö£`~k&JšYb’­ä‰%(ï—l™@YŽåª(ÇuTÐí­6ôPŠEŽY¡zøól¬)]låÁǽ°¶œ`‘a°!è9íX @þZ$úINmo‘eF⥠GZZ¤K;Ýøfœ0¨ýÀ¢ }ñeîèŸ;ØÝþ´'c‰˜À;ÜpÛÑ­~Ë MÅ!káÒ`ðªÌöÇ3L¡_`÷fÿž”ü½Ÿ™á’ø´|ã†ÉÊdÕPÀúÄSå+Ú€þ±lzgê—CX á¶®PõLnp 0¡ûvL ¨yâZé"šú¨¸»,`E”1>+s Ó7yŸå_ïN½ûoÛ3ÈϽ´íF/pw|ì;,¶6´GÑCõþñ,s¯bv₨͟†:‡ÌÚV©dÉ›oÎ nv;<5;cÿÙïÆJ6ÐMjMÙÎü2ñœ§ò—l;.‘è#©,mœÑ5‘du‡ŸPPUÕÍ‚èþÙ%§)âÂlO¦¾e—º†R޳Hæ¼ÏN#Ôü«Ü5ècÃâ/… ÑS·Ù4LT_%ÎÙÅÚÔ°­aö-Vó<.K†ÇiާíaÏ”Íè³,ú›ã8”T÷ÇÐönOFýÓü#h‹œ›\#Š,]²â6¦ZlÒvˆE$õ°´ß‚Zþg|o5²ÍœäuÂ÷ú$= [öq{"ø:IÃÉ i¾C¥ø™öa\›üö}¢a œæ §$ã‹$¦šù¶ v*ïAqgXf¾óAyaÁ˜ 4ùk\VH«q„Í`™KÞƒ Ê.Cº™fs߸]T¿‰–:|¯'¼,¿»V¤ÄI*zÚ´Yœ&ï×e[“¬%pº¢É –yƒûc ؤpF/Ë MÌ@Ÿ¡øwä÷”¾…¼O­Ž!Aò@b)¦5L&’½H”š7è>óÃø°/ƒèiúÚÑB™”æG£O&Û\qÞá1ŒÇi.ÙŠ>ÝZß0jÓdz¬øLË^ ™êT~^‹w›÷°à}uçÂ7Þ_.¡4ó©@¤í8?”Á.Ðy’™e¨ì·ZµK<7—­'j½¿0>e¬[†¼ù×Ùu”]J„qÁ ùGCªÚtñl¹ u«Xj§ŽÃ‘.:Ä Âx•\|2òæRê|ž…Õ}BL:̬ô(ƒÉ×¶Ò Ll¥„êËõ{A‚KÐóºŸYµA¿Äá-í~ÜEõDSù£„CmœÌÃÍczþRýWçœV…½õÂè„ìO ÿ†EéïâPÎs¿›Û8øð ø Ðòx@2yÉGùV…aÜóOɆõ~û„¦K¼SC>1m{~¾|‚*u`‘.J²‹H¤DÔÆ¢‰#¼#@?©ù¤\±J®^Ôàœ¨²˜Sˆ„ 5‰žÉa —‰Þ°”ÁopÊHZñ?iáE*ä¾²[d MÕR診Êíï…{Ÿ²˜¶©8ñö¶Î·+I ‰ôœFÎ%"j4KþóY ®Üí4ïå­æYûtÖL÷78j \ä ÈÕù¾*Õd"¶"Å}>ý·ec¦šAiÏ´5Å9@ön)sÑ¦ÈÆ²‰:µ0Þ¡‹ÖÝ0i \„ê{ž«ZìKö¡ZÅÆ" îO†PÒ\±ƒ—7õ0#AÒÂÜsU2]Ô4ÏýôÇ¿°|¾be¦[F-'ÄÓ/ˆÞ}f´]£’yõIŠôzöÂÖza¦ŸU†C‰~G¢²ÞI,Ðafýﻣ†ga<¢bœÿäcxON̶ŽÒÿ‚Y±ÚÐLòäÊ"‹à×µáw!ÔÁ=wEª3²g.ÿιR9û“IŸrN÷;K4‰ì7áÑó·šù¡vûÍÉBYX§€é69; ØÅîJ§^ÈlzÔ‹!Q,ýÕ«0h±ÍÌ'&¤*åTóŠ,ªïDM Ô‡A§7Š.ëlÄT‘øæ üWÞáçê¦ GÉ~›.'väÐ ['àèB)¶rÜ'7bßXBƒèïÏGÀÌh!~©7“éq±H Ë&SùD<´Éß…Ìè´`FÕaнϔ;ƒv©é.VOò,¼ª£ÌÛR¾šŸu¤F¥Èl^©"0‚!ääH©bNpÇû0U#½"â½ tlʼe!ˆÚ+ÌIvqØBØWœI¡Ö 4ˆÕ&QbÉ5/›É¥„pá1ôÖ­U)õ‡áO>Üé5Wé*0f—¼2K8ãPa5¿ÊŸäñ¶“ã­F·2$\?³§Å6ùÂ]'4z³¼ ‹I•]º©ŒLª/ã›­ÍË^JD#ˆ59‡A蓵•žÞi}±EÇâr=tòDþ.˜dˆÍ7SßnÚ(xù7\œ¿±åé ©–pÛáÇÚ(*×~’ Ü2ÇÔ¨¯ ¦)>þŸkJýsl'ÜS¾ç¸0Â-°Öš -5ümš7œYoÿ9žIð)”¦å Úe0pÜí1½mT2Z!Ý`Îdõ”ýÕàÎÒó‹?„D¤*µKÙíÂxÕ\ô=b5%ØÊšQ#N €Ñ~¯Wn%sPMlXª¥ÑìÃkÙl–¥bCÙö®?¬ÒàËŽ`ØRž¾S‘™{ƽ^yM™µÉˆ%TÑÌAÅòêjþã;ޱZ«·‚u¯|7‰!ߊ¸æòóæ¦ƒÅ©A±Uª8ÎkklfhcøØFëÚÝÒY&Vi[LïÿJ~(æÃøYíý³ò5Õ+0æ’P=íô¼L³áïÀH#è„L9šŸÉUÜóÅyKÙÈñ}9yÛÎ[ý…¿Ûk¹6qü´>ø#H‚$w0çu“)á)‹jô4YK'–KËí’ÒTO<Í2†G´5Ç^Ba¥ô\;üV~VÀ½$3,éßß{êAŸ)!‡"dGäTä€ÖÍ”sj”=-€4ÀùwqiqßÜœC_1É8Öµ}Lá í#öÔÑŸ•6ÿёӵÏÏ_hžÝ6ÊM:€¤‚{pëkäÒ´¾Ò×n¬êçììB.Ë( ';N6}®à€Í¬v…q¤û™*ÛþšÐv.R„Cã¯G3¤ó*‹1˜„Öˆ¡*æâ°²;Ñ‹9í `•:hl²3á±Ëµ:NŽTC-ð:´™”ÇÇ €Œ­$åe‡øhõ9À_°‡Õ03 ®eCo„Êðû(Ò1/{«úZ޳ñ¨¤{ãÕ¦1œhLJè†ÖÊú—½Ì?f* ÎgÖY·w9”:î¾³6ªÓ’¸¤vHáUt+g¢ÌT,¸L„æû°W(Qd W  ¦ú¬î¡£Øºø¨ñ|‡ŠÍø!µ·Ä¡b„_}¿´}VÈ;3ጫJàëÚ"µntÂ^.óMaSÚDH}×ø·.ÅTϳÞËý•ˆ4‹Ü’x»í±5®Æ*ðEwwÎÐï)ÇcãÕ߃tíÛ1©o¹˜CŽIåV¸ÃþdTr9ç•s¨úÙ9¿vtvt#…üà´¤r•ĸb»*«÷h®4ÛZî -Ú±uD$Z6¤ƒ!—ìBñUr­Ïý£‚¦ÛržacQÕ^š˜šO|nØÂÙagV™ÁûIØ¢ÚbMþXû&î^¶ Ó&!š¸Û lûÓI¸>ñz¹Î_ T¹ÙŸP®šËJQÎ77m«“c¨üŸ+æp'û¦wäAö´X¬zþ[DøÑói³jXlœ¹ ›§Ó²²Zåt®cuX¶ñïGÊ#á¢æBõE‹¸Ö»ãñSÇ·Ðf`ÿA:\pÏ&S®|H:ªRYÔô;ÓzÛôóXy¡€™e¤ÜÜùv)a ÙÁ¬ tN£ÐvÓWN9äÅ9ué ÒÁc S9VjÃ3a€AÃ;_)jTD§Â‡ŽŒ+QÜ/3Õó‰¿j€—±4#±—zñåøð¹ÒÛ•¬z±^ ¤côèL!¼Qù\¼ìW¾Ðu5|È‘·ÔñExKBï/;®ø¸L ÔG6ÝœNžº”îN›Cl9ä(6âêw»ÔE9áSŠälp÷‹ü“IÀÇ(È^òm*’7<6ÀiOºÎ[­Š]kJlj:)Œ ïý#ðäj¾/Ý3÷¶ŠÐ~™™Ìõ´w¼h‡Y¹j×qApÇ⻵èß/~ðò( @Ù‹3#*piaS'£E-üèœw¢¶ ß‚—û°Á@ Œ®À˜FGëÅ»B á•lôâöW„ÃØúkc ¢‘áÜ\Øóü\jo¿º<“3wŒ£·HöHxO %¤¡sðóIµÑ§ª¹|é3Ždé‰2)YŒHhw|SpÓôì„fâ¥t?ù3Ê®´«>Í-"xÌÀO|UwL‰E‘-‡È¦yðÂ_êÖÏ Yk¤î+Îáäçc¢…Ž¢G]®“ÕóYÌ?!Ó-{ûaMHV÷€óéB–§ ØØ[ýºK¹èE<©âD,žõ&;¿¹”ø´–JâéÑVÜ ý0Iä5M"3Iz7aùÏKLY`jäNRË$•-¡É ®¢Œø­ó»,PŠ‘Ò™ã»?Ù«‰௵\ÉìŸéÜë´:GaN_ÏkŃÛÓ_‘u¸:ì/ÅB ÿÙHHæË:WZ̬­:oKŒ§µrÇL˜™g{È‚ÊÈЊ±Úâ¤qgêêÜn—-oÍÔØ¬é‘·ÿŸ7°$Ýó^8éeƒÛ…ài,rT›ž²›&ßqJ2—n>Â{ö,œï³F±¤n:˜BwƒbM^ùzó.+Š'¾êLª|aæ¤å8™›eá‘T«C9ÚË‹EeXgНÜ;×oÅ­¦á˜@_”øN™¥ÐÒÞ‡ÄwÉÀ^NÈ÷m°| œ{ø@Ð ·ªŒ:À©‘á_ÈwÖQw³»ŠGq,Y¾¬58«K›Gç3Ÿñó¤ñÄ.NÔ­.¢w ÛÐÖðݼ¸pH°‚:›üœ‘t<ŒÖÉ'.)oõð&Ú¦Ûxˆßf¾iûÿÌìÔÖ~µ,~üõÆENße‘q ué$„ËÙ2*~O‰å'çÜ帓ÔX…I3Nu‰€/Œ.ün5”‹á¡’\ìºå lë¤c>W?|®s,9g~Ý„_¨Å¦\! Þ #d qKóCAØ·‰:Nÿž'ü!´ß°÷í$}ü’¢܆Lìá›þÉþ÷,‚Å7¥jKº-ÅÑÎÓ$ï"®• D÷12¾Õ-øÜÕ¹¶1Š Õäîã«›_L³xÓºy—WÅÿþ¥šó´¤;é)ðW ;›f”vi/™‡šX!Jr‡·y ”ŸEuP|X¡Wsú æ[Ó\ÓÔ#ÙŽ§ IÊÐ${˜¿Ì"Ne‡š°µ¨s•Âψ5,C3¨àZHëÁdÖ07äê]AÊ&CT‘øÔ5ø€‰X0¨–,)¯#WbK»¶ä‚1É—œd`Få€Ðž•5ð37n]„Ðú–`9À‘3wBm»:ÅÐV*ƒ“!ï¨TÁ2»£ÖОǰ>J輘ÿ×5®°²÷wÃh†ß~~N“tN˜‡g7D£b'ûíí:®ß¥”^6c«é´l2á‘‘ƒ…­ôÞ‹ž8±ÉSf»oðÓ®àÿb`¶TüÁì\Të @ñõè‘ИÔí¥\7=í YA½ŸåL“"ÉÙM£‰Ôüõçt’źôºCúlY@ÊG¶ÉOÃE¯¸P 5Í&æƒ>31Á:´II0p„!½Ô´B¼ÂÓA¶91Bª,ȵ$,ÙzeÉÄÆˆÖªMa :}Û bâ%–4î„þx¢ÕD*ãiŠ‹!ÕXL‘©pü_§ Û޹2}ɘVGꬰ¼} WLJcè ®r¼9^ÒÛ Ô†uªÎo=ÛTÖéƒ0(F‰7˜b¢VX-\D­ 6. t­þ À³¡×oÍÕ…ºr>–ŠíVøàkdŽc7CÎ2ŠñYŽ; 2úØHKÀ9º¹ p*dtþSGì=of»WRA(\<ÜöØ´D¦Ó&ORŒÁ’ŒÚZG±…G™†°èB]{~³…h Ë$HafbüÎt×lô‘niÂŒŠ{Uû ÔÇæ–Ux ¢â%ˆöNëÐXôÄs­²á /¦¿’ )b˜³bœõc}Ó‡Ý:«ƒoogoöÞº'=‹–q¯Ó~š£x H¸í´ÃG;_?^®÷Ž3±^Ïòÿ¸LA~çÃ|À@;ÖâËÇy¦Ö¥x…·1÷ôsióà÷ >0Fâ³£uÜÇo«‘‰º‘çãØî!Nˆgv@ÃPNª½¶ýôP®xÕ£À>‚ò¨QùŽ˯e¶¶ÞG®êSæ~Áò>v=N èQô<Ûpî‘l³ÏTÈy¨áסÉ[sV÷PIgèÝ<ùk»P8pqVˆÉ¼Ú7ûÃ!Ð. ­¤ xÛÀÄpc¯Õ_m†ÈƧfLJ9ãEtgÈ8©DŒ9°Æg°ðKL+ÒBö½=ö÷ŽU‚Y³Ÿ¢.Á1&I‡Ñ} ‰ .ýZ·n¼j†t,ë©Çà—ñ2ˆ«¦ÍŸŽÐ¨Ùس!Âcž÷¤=‚-/ˆL¸ýÎ lʬCÀ³Ïo¢Ÿr*!Ý»ïÞlì×Çö õ‡Îœ þçÄÀêG&É@¡DµC²©¿Tï©r‡ƒ,˜ºh¡2`Ü¡?g¨É^v#zØ/å³ÙZ—Ò}ÉG}ñhx¥¨N…u¤s=ýbã­0žaÛ ïX@ j±§]5-xgnK1sºDc-€GiY¡Á9ÈpÄõcú“X™|=lüý…ϵd ŒvÞn$ð³˜aÞóå~Ë¡K{á Ö'€ápƒxmQ‡N ÆŒ#f@ʬl¡‘Ú¤ÐÛoÓÿǰݫ?íq¨Œát6éš5è_~•—œ š¡1÷×W ¸MìªmÈÐR!b(ëXž»AdzÂ|2$ºÙ~P0Y‰§µ3Åö ¦’ü ŸÈfÌï¶ëë"-9ôz„}¾Yl¢>"ÀªPÚÆ~¯n]üÀ  ª'ª÷Ö ^ËÞŠˆ€u‚ õÇ…Ò2Õ€ "ùn÷ŒlënòÜe$Ôq"ýÏÇÂtL/ó¶Mïä qÄ æu‡ëãÀg-ó]7|œŽµ Jƒæ¢èTé §ë¯Ú/WÜsîý͆­C4ˆiÄR9uÚè–£*´±™ÒÔ—¼<¸†-‰)å*é/K ÓOËy‹¥»¥ð¦ 䉾:Ç-äp•tÜפAêäUÊ` ÞCjÕl½gœéVõûÔvTL¬Sry-²ˆ”²ÍÀ]ËÛÁeÓRÑ~žå«‡Ãý/2«KÊwšvµD±Ê3\o= |ü#¤ÜñP‘xˆæ†,>äûÛÇÆaǪ,tòƒ“Ý}û}²¼T2qªƒájøljº]8¹uµcrdäÕ‹~Éñ»€èÈ(x¡>½Bö « jZ®mJ ƒ}eÐÅ)Ç‚P4o‰/¾qðlÅâ‚yÙùͽ„‘Ç^ jþ €[_$íç*`.—jÌ3ÍËœÂФ#œ,rÍÚ»êM üâ—ó#p:&ÛØgœéfoIF#½Ä›Àb6eïðßN?—ØÊ è1{ØâcÊGr q¨¶í±”BÏ^“Ëœ%lÝoó0e M,ñ+7Å EQñ­¿^Aµ·Î®øUËfÙTÝ$_¨k5Ê—_(–[ÂUó€çÎZõËÛ‹ùUZQÞ£‘Ðþ‘M! š´RtÑ|"`+óNH°`´6ï`/ÒSR}-j”ÓÁN¤Ò‡4Ü~T’¹vnK±Ïa±öM•@`PòYxª‡$ìO|͵ ©^ö2¹Åi«A¹ß&Áƒ´Œå9*{በÔFFUã]bt¾…ûI@@@Yp›wÐÈ//O54–" òZN7–= îú(ÕJ°b²³IIˆ=Ëz•ª¢A![hÌÔSù~›÷‚IÕ÷*[÷l ³ ÙÏï¶ö­á­2‚bÁuˆF\˜0 îðÛ,e¸V!Îò˜H½HôæŠö¤m I¼YÅs¹´švpï½>#‰ÞVïUhÄy½2ô¼ ¬›>ÕúÉ Aôû(Zk¶uW­-8›0$˜óÊ”¼—VÛÙF½xÝB.Œ¤6ׯbn²äpiÅWºe¯Í1†ÿR7/"ÔèÀa‘©b¸žpLLòOA3Ÿd¶3·ñLçÙ!nºÊøñg}ªóßL B3Š–ñ#‘Z'qé‡T~Üœ:ƨ%ÖáŽÚS–/¨¡ÒaAÙb°_ûÈb¡RÙÅä÷uœ Ï«û…Ht—oV!ð¿ýc„=Õ»šl/l“J m¡ …iøM›)}.'ÌÿCؽ›Ò_ &Nalí$Wç ¯Žj[)ë°\Û<€Á;¼MËòèÚ{ª³Ùõ9VV’Û?xŽ1µÓ¦zÿ‡|=OÍU›N·hylX\¯RaE=®Úm³Š£9“‡åºZ=Z‘ROÙT^Ïêú Þ|ËÍC½¾Ïíô'ºðnW¥ÄØýÏ^ò`ꀜ&c=ç!ñÞó‹@Axձļu¾}ºƒ"­„uâÆ%§½z/Ãv^6ŠÍ®º„ØkU—Q@JÓ+…ÀºÁ!Ö­% „΃jqãüÒS ¤ü€„Dò&‡”,D:¾ãW8MGÍò:ž‘bõÛ\ß@æ¯& G;?¡ä d‹;´LÌ( @^Q‚Ë¥& SÐøí”c.í&Ÿö–T_:`\¾ â”}òÁƒ7t ˜™qÂþsá)F°õ ·n³Æ4×jö¾í瀂]硾æyލng»Œ_šHï+î·Óç+Ž ŽÖ„¦§HC-‹_Ä<–d] O‡?É:EçIRÕ©ÛÔå×Ã’w½«s8“P§tÏ,_ªu}käô¶“TWèU"Nõq«æ—}Ò炪Ëãß­ü£Ç¦ünš[§b5á?)ü åÊßL˜Ê-±üéìÉÍ‚*yjFø.$¶ÀF«@w²¦ûál_öÌdñ/áBÉñÝßĪ—íÑð8Ô–ø7g ».s?ì’v›öl ì‚zqÙ<¡x¼×zZϯªþnDZ]¦eÖ/ ‚fòÎs•"ŸT/Ζ4ŽTû‡TñF<^p}™J!·9/[Ï£éǹ6,ÃÒy¿¦(C)´Ý¢CDŸ¥G[c¢ é fP¨šü’–ØŸ# M#jŠ©­òE2l•5›Ÿfæ ¯$ARRšA;Q¥?QÏ.'ýxìh¶¥õwÐ41s\ÍÅ_érNÓ›|X£eÎQˆDy%h—c_ê°»§WiâÑw‘6y³°@h¡Çƒ\²4±u;EqÙîäPY¶ëýo(v™÷±`žŒ]œ”Ÿ“ ~Ñúæà0Ù.¾/¾kfAá)Šr|úGÄ7¸¾©Î´§­?uYpÓ@pHiã±éʄጄƒ±‹À<Œ—ÐÒÊÁ‡˜›dúåè'aS`ʬÓQðᘷdË•7Ô¢I¡rç ÓeÎú(ÝÎS*¼dûôõû ‘"•\Ì:ޏ #"è­ÚwG™„”œ¶K†±)N²~èt“rY1(ÿ9dÛD×w˜éƒíõŸwåŸzT£©9y$7=ëHUÄBôdA&­ˆòKÄÀµ,øÔ¦O`äá436¸éIýÏçu¹òk•¢ë؈¢‰mGÒ[#u©¾wHz·Õœ•HDÇ „£íõCwôCØ%»Æ«nþƒ}p:s{ Ý(8ˆO¸•NS´~­·òIãê*ÅMht ûÝ~—Ë[¿ÁÙ ÓpÞ†y,Äõ~ÃDÉ¿ Rî!Œ¿"N€Ï"âžüÿ˜‹4úX6_»cp@Š™¸ §eüS4ÛÉžRñRš¨.ê…”Nm¯½[¨ìï‡_ç™ìàkÄè[måÁkêŠ" {ênÒ••B­¼¥Ñf;z=ÂE[áL`ºÔÆ"Öâ¦I·øø=Õðöqïäÿ0Àc‰zà{½¥l"dɺ­'ÄVîd£ìÅLu Cÿ% 3lMð\&‘F L…¾Ñ‰ò²òD ž69¬Kž1üs¼ÌLuæ~²äݰ&^u鉺´ñçqˆ;±ÁôøbÀ )Oú­t‘ÆM—Ç}iQD œÉBåð[Våbÿ#JLõÕ3”!ÂjF7Ë`øŠÐëvrT‘›•_Õ÷µßÓ‹6£¸t›ýIϘŽ5¾º<Å.±E…jŠÅ—Ì%cr-„Ú¦ükw%+~SŸ%UX š·j)"éí<¼xs–;[èD$>«?¾°ykT–}¶àŸ–^¥Æùy× çZs àôy[ðs™ÒÒÑ©ë™(×ñ´… X0Ϭ2 ÈKz鬲LPªT‹$ LªÞõU7 þÔ Èç‚Z¡¢º¨~5nä“<î`O(ìf†91µÔD‰rNZá2ÖÛïÁYÒd‹4•´@ÍX\Ží´VZã¥Á&£Ù)À ¦_F¹_+qCY/©ÄFò£.½x°\äË–R÷På›3‘+•k±‰ò.À FòÈ6?÷ÌQ¦œ‚!ÕŠ¸s#™èf‹?Xô1³l¢†ôÞÓUå>\­rîÝ‘±R,«ÆñOw{χ(è1öz[A˜‘s&«ÄÆ:8lt´àû;ì!Ay)ÈqcVN.TvåYPýÃ[}Ý s†Ç¥v(ÈV1ê<|Cü–­¤R¦¹.©ó#mÀ§”†£ci ûMÔüöÓŸä½Óä¨7ýŒƒT ó÷Ê›Åçagך}Dú"‹äh$íEcµ››OèoTïll¥7î×âYz3žH½Vxj”¸Æ"‡í¯=ƒqõóæðâ:8>°Ò» .¶($HZÊUb=mj줤“ÚdÖ_rMŒ2ÓKXÓÿ/ÌÓlㄳ—¸’76Œ_…«/ºò“»·µ>ì­.5¿¨ôÛw½kÎåÄÏ๓À²‡%^¾KlŸý–ÉînZÆœèM31 e f±½æï~¸zÊ,4äÿL×Ý1ùð¯®]˜A?Á³i·qa'”s4ªï_¯|œõl júéb%aÐ=còA‰BW‘U2ƽZ©exËô‹†½(ó¥ÿ¸ ^OlW¶ Ÿ€ËÎ…cøÆh\DâÀB“•‹|EÊŒhžÍÏ{Ügä–r;²#9?ÿïWœ  Q…–w×,Žû’mæðbþ?:‡îeµñ»F)q€Ñ 8|Ü5U¿Ä;a ãœT,««ÎÁx‘Î…80{[gT"ß–‚¦'60!‚<][J€‰…›ÖžãÛÎåÍáÂm­tˆ?Y&`—}9ln5V~uiHñî4›bïßàm0WK¥Í Ù‘ô,Eî‡g°Ž¤@›_û[Bõa]A7³x‹É=çóK¹‘ÃRøöMøæ»ƒ¾v,Â1žï:g'd+‹’·—ït†.þ˜Âf.¡ð"K³”pÑó9Dÿ®ËölM=àŸº-,°Œ4X Hbî’kž"'¦°÷. ‡à‰ijó|Ú´œ¨<1H w<0Kë÷ðK˜?iè’f`ZÓ¢;™Qö)š¸œBÇ AlEX0îM[ ë£`KÜÌÞk›y½Ô«t?²“K·oCúÜÌYX!ï"m›¬ ±×½A¥ðí]op%•è…UÑj¯K¥D?óígÄR/3p|Td#jÕÜžßó‘V–ŒŸ&Î#½:A‰ˆZ#–Òë$2G•Q€”Ó¯ò¹5ŸÒiÈ4ÝzmÝv‘ŸP}eÌd2¥¦É±ý˜é]´ž·Î]0{qùÏëï/Ó±ÁÓ~® èNàõì·,÷ßëâŸHÀ¿Úící7€ìBgº‘o¾‹Ûú¤Ss©ÌÈG^ âëpæ–˜ÍL*\~~°°—L‰Ë-^–#!Øô˵¯‰íÿÌÛnžÒñÚþ‡ÿø(œ˧úXý˜ÊDIƒ'‡f²ˆ%~-~^q<¡ñ]ýê¹£Uö'Ú;é–Hc¬0uáÓRØuî8:Mk‚Èûõ’¢|Bùh¹Ñí0Ý´ÛBÕbC˜ÔÕ(*éÃY®‹þƒ§]´±Àáv’VÌ]…kõ—맨 ‘ƒx³w‚º$_—Ç舢#QG<¨µÌ@A¡%7¥@މ!¶—¿m¤òÆw»£ÕJ&d=ܪ­Ìô°OdáéŠ]ÐX‹«š©í´Àži€ÅI­ jÈ{EÇÂÅ0-ꮽí¹"Üë–§<öË.ÂÊ/š¦5ï8^Í©™žhÊФ”‘)ò§yæ¢’Ž››!u; `Èþß¶^PD¥vìÊg ìËç­ùóîsr­+HiFZdïÅ®b:¢Z?¸’áÕ Ï‚êê4l0wŸ×oP!|<\»Ç¶¸ òÀ¸t¡ÝkMa° Õ¼Ú¹HâU[¤áõm>ÑÝK¿Qº úú9ûÊRò#äÁ¹ñ,.oŽgÄJ‡ˆÈt4ˆñƒ÷àúÑÙPtiŒw„Š7ÛJ˜Eo«ÜÊbl{½[îzFÂ£Š¯ùîóÒT_èL¬cyp.™z¢ØTÉñ¸ëBG*N¹6/5”¢ »Å,^{…j·ú)˜¢ô„=ÌáEàÊ«¿Ôù)Ó?Ì`»KŽÉ"B†ƒ ‹ta$²ÛÿXdR»É½æø?Ý|Y»Ú"òý6r¢ð‘‹<’A‚æw_§òÏ È—U9î™È–U Á1ãØÙ+€=Â>äô‡®OÐ}Ö˜"ÕÐõíåñ1Àà†:*¡Èè,#À÷¥åE–pÆœéµ<²¯ÇàŒºŠwzfDº+™°ž±$|Ÿaا˛;>Ež‘˜,ñƉglˆ|ye¯¾Ö™[’Õ$>ôCY#—&·îÈ›êu©ÒŠÊs§æ!“•ö†ý©k¿CH?Ø­Ù2¯ zøPnpÅáh ì߀ÒY† ë@¬Ý®·èåܯnŸE¦KÝH9¨ò&Ãce71 ž_:x~1DPFý(³,°Eïª$}õËppæôü͹AgÖ`†q5ù˜AÒ‰&Y‡ºtîŽëf[&އ÷7@‰¿+¿-ðÞ2ŠÿÇ cr9ø¶ÇÌq™d< 2)Æ(ŒàxöÍ8P£õS£„Ò.5G¶œÍ‰þmh _ßb@ø¦šÆ°d…TÔÈiùvâôfÞ—a¼€ÒÚ›ZHÔ¦M¢ äö­äÕ‹µ)HScîX[êzt¨>ã¿}u‰çÀiò[çXO­wyGÜüh]˜¼ƒ5¶l3Q3È֌űp:Úx-lóMiSäLiáÔ¾!ò‘ÑåjT©¿ðs‚ÖˆEÈ0nã«B¨w‘ýo”æ›pšÿ¾éW9L‰D³Áƒ#A^éìþ^J™æ‰ÚkDâXÙsðÒ‰ qê£éKèGJÿÚ¬§,nðhØj_RÁM ©ú “PšÚ43 ,žUë>Ù¼±­O‚VeÊ™-îŒL«¹ƒŽ¼Y„†Š³‚å“­‰L-<rRvh>‚SGÙ»DZC‚£lR½ÌšÊÍv¿ùQ¹©ðÅáLÿa“øŸôkÀÕpƒ;rúüâë\wM' ·Çó§T\†„Ä®oN¾¥þs2Ñ$ÃѼ²ŽKÓû"Œéæï‡-›>hRCèýF ó¡š3û¥q&¶È†fjÑëypÌ6frßk#&`tNÑ$:$û¶0vó÷;¸<“bŒ-5³¾Eo« üûÕš†Ô}²mÞÊ487šúâúY$¿Ã¯¯]Ÿ"øD~N¹9åÈÝœÆo:š2‰ô]™£Ûòƒ¦ûœƒHœ±lC¿ç êCÄH<½PX0Vç'Úg”qÄ–©—n $ùŽÈª‹ÄM4JƒNÕ#*MšPù8Yv rV…عšTöÉJÏxÞ8ù3}%k»â¼)el,ø¥„ñÌf¡vúK¤yŠ\vé Ã4±]Þ•ˆ(ËÄÅD6Öö ©Ç”F·âÇ–Êq蘬a ñ6…`Œ!Ö+vÛFÖX঺GòMN5òVríÂþnáêãzè¿b“†M•ø(7÷|Ùú™½ÑSÞ0Àº€,´;ž:Áf.̈“€ä1ûtdz Ìæ:öÂýRи7Þk±ZãÖõÊÛMý”òpFS,4‰_þ3¤‡ü!—Yú „""î;nѱfÞ¡3t›tñKBÜ®hPo{Ð"û}»u›*,ýÐÐ"®fÇØíÄþ?\Iˆ¨$žgûU“×ùœÕÙ×Ç2êwÊ\}ç’ª))TBšŽ°ïw@¸±¢n‡G7®ñn§I›Mïå+ÑÁͰ´^éq—?‰ìšI\EfCšE¥ŠèăœÒï¨ñ‘ÂBÌW).›.G‘ò)Ü‚¹vö(Ík ódZ'i›Çƒ²NÇyˆ¹ÕŠ$ zXUî‚tk4‚ð3¾·p©ÂÀu™^ühHÔ‚–_íóC¹üà}`ð‡YÂÀrk­fEIH\^ÆNuª)ow›Ñ%õ˜­áö€»'¾“„qó0õ³ðg>–…Êd‹Y‡kìp¶X„+Îr+‡ô@«[éáùNå•S)ûZ·<ÙÕL»5ùYßè<ÖŽµÒ³¬„ –ûÍ”™eª‰¬×ZLû_+Œ\\rí<5Oí‰uÐÁêÖˆâØ¬:N”…ÅAm¢ô~WŶܔ~Õ3&ã A¨îäÈ«=èŠÁÛèt]WÅvfUÆ -‘½´¯j8±SÍQ1Œ=ºÛ›óo0¬½þ,¦‡ë€ÿÚ嚦—±¯t‚@(°£Z,ûwÕšy—@H‰êÌÖ¥=ȨÓoñAž¨°ƒ#ɬô#£ 2,PK½O…*1w^ÛoFbq˜LÕ$õ¼qÀ7I&¸^Q‰«n¨ÈÎBKÍlÙ³…£ü.v’@÷vcä0Ñ:êÀ Ò­Œ²Œ› \U¿‘BÕ”Þ6x2 ø¬ï~üTžì ÕÈv×r zÚ³L ·‰@:WŒ;HH…, ŒÛd5$á÷:æ¿HÒ®xXif£Ané›Õݰ{¸;K®Ž¥«‰`xÇ1ÿ^É® i4}·„ë,þNYÞ¶ç+¿…í†ã5sRx¢Þlá¬x>\ò½Ï,Ï—µá…¸Ž$xBmý$ìQ(|£4¥»öˆÉXä'íáJßÃv« ±‘[D™!¢ ׯ€ïŸ¾'˜ü Yt‡I´‚Gû–}4Š&ã²ó½-=./!¨œ¥è T ”™¡]åÇ”'!Êiv§YùG=£Íš£po™2‰(ó áz«°Åv»'öÁPÿ[g£@âÃýÏ‹b™áŒ2ë\)3 ovf¦¾N¢tP"NôÕ¯j…z çEfqa¤ˆ‘d¡q —ÿ…\T™ä)óçO=ˆíѯœ '„žüýô GÝÕ,“oÐ[;½Ž¼­ÅôeoRëÌ<˜½* ^[Ær, p†õ¿dùSŠÌŽs[ ®<ÞÉû¾dÜ6zèž3Wd€†à ¦¢4!PñŒ ƒk—Y²]Ï`íI&€v“6éäa¿Éµm„ÏdN íc•î î ÖÿÝ €µñÇgaìµ{dÝ¡àÇ,ÓM–DUsÕop,d rÊ1z«¥ªãðL¦X¢Ëéì “ŠeØá²ëý˜2vÐ|s €þ©î‰»+0b¤0ñŒ­aìµðÏ‚Mºú¸¦À5#R|¼=D4@dnXõÐ/âág£Úžö£ : YÏçqOoýPÐÉ­ÃÞ&‰ƒ—ŸŽ’¯£ÛÎ2A¿ß ìTs¿‰¥£F|aä—”óØ"¨ÈaC1ßSä /;s2¨±Rvæ7èP`rZ‹0úÍN±¹$k"¤ÛêÄi¶” ƒõ{HŽ—¦n9DØc¬V>õʧñëúZÓcMlf0¾ ±y9½Ùoޱ¾ð+y;®«e±s•k(Å­8¢¨¼ ¨ÿßßóÒJI¶ì38´ˆà0pÍ‚«P¹§$ÿ­²E£§EROª0̺-KÛéQÑ‹NÃcö„.¬ˆe"ޢ淼uëÞæ·‹Ó+;¯¦üubV E':Pê3/ØàiŽ/Y[}íLøzr_üåÚ bzõiîôƒk†|U€ ê4}¹?‡z™Å9X(žÒ:­ mSj.ؘij‹+ÓB+öÍÖ°^GSf?àÐVa’QgÛO[x3o}|TF‰pæ#–r=\Dà5¶iëŠÒi-zo®ZÔå-ÿv¯'ʽV:9|‚e@x@F  ¦ªgbWBO^%€Ã¹¼RâK΂ e.écymb8,#×7î±S„—0¡p¢ñƒW‚·$sü¬~ê.©[¡œ¬˜§óýö Üwö|YmÉëXŠQ+îÍóõs¦÷oyûn©R;Wˆí\åÑ‹ÃêíÛa Ÿê¯Î«œ;UHEßC »ŸõdÓ¼0Mä„Ó»is+å(Í+>¢è·Ù ´Ì•Ô§ø[‚),}Üær_„gGõ³ —ÜÎGUâ³§"Ë[ü L)ëjÓq}êOÒ#²vvñ÷gäP‹d÷tqäñ{¾üZ)Bþ]œ‘CÅfN A:D·9_y¯£€ÂA«Öë›WÐ ÔV“ΪǻHêzàû5#v®Öx‡˜øIuúŸÇ>²ŽÐÚ0ˆhJ¯Éúïª}SáI±ÃñÖeP ež.QV¥^òmƒl.?åsêÕ‡LƒãŽIcèô6˜[íÙ¥v0äk±û$]vÑ}œ¨n˜)ÐÌZ#1V(Ï•(SbÂG‰«/"¨®‰Ô,É÷žƒH¿£7Èó˜/*'ÉfvÔx‚;é4”)qŒr=ïd¸yÿ 6q|½[äYh¿Qž—+&0î0 n§ÀbÁCУ>)ðH{£š ì(RÊÇî’ ±Ý‡;à8Ði‚}*Bú1—9 ©Toȳ6õ¦Ï[Ÿ2`VSÆ\’«¡I£¤™Ñ‰ui•'lœÎ$AØÛç£wÞtX›³¼…ÓÂn,Yá+Ì|ìýϼ®fÅ9÷¦爹7îþŒ¢¬üÁЖü x/€( 8øÅÂTQ:[!Ì$ÒI:l´õ4ïÍl†é‡ ôˆƒO*_ŽÉQ`:¹Ð¥æQ샀‰ gDžré2,'øöÿNõm!ÔÑVJæé‰o(?±Ì×`‰—˜$ÐfJ7Ð!Úšj%t‰kòݽåÂ~O+"ÁªvbÜ›õìÑ@UAR€LUè6u;OCʧ[¦zÔ&$/•I°Ì×Ѓ¼èú“³×³$ö’¿éÑô(O<‡´KÍANä{³ÏQ¨Ç,joïKïæ`QÆoÿ‚Ôèh†Q¸ ú"'{ǯ߷~…/š5(õ¨P]idŽWÁ&Ö§ŸcòûW÷ažÅšJaš˜­2HLŠ× »'e¾g¿žy—i¾Ûna­šŸçM&wè[¢'ë$Ù1¶/ºúÒÐ}R@[¢¢Ó1n–¹9P òOŸ Ôj¸c@óˆòä‚Ùôï¢4¥¥ÂÍekìxÍgˆýJRÞ¹hÜNÐx\פ pÇÔÊ–FRq,x Ï Ta^àþ¸pæQë\lÇ?4~‰øä%ά ØÙÌÖÜü—ÞJµ·àä¡[ĘƽRÅž~Œ zÊ'ÏÓXæ–ê%ª šNDi¨;§µ´r>Õ%ó¦¬H€D4y$g”„±Í“ȪÀ·‰Šƒ× ¿ö~ÿÜRU”Ù.@°¸ÙÛ±,ЕöÂñô1ŒƒôTJ¥²ÓËCN…k×'Z½^èøþ@û5{³š‰ ÒÖÙ!Þƒcà€†ªóD\“>Tüf©:”Í*UFþ¿Ã”¾.uÔY<5r°½Dx™Ý4¥„¬Î‹«Ë¥Œ8N»2ζ\x_¼Å샘&=k\ÿD½?®_iºÏtœ6ñ´-üSË@Åé0oÍH*þ»9uÀýnÏà˜‚¤óíY2ÜRÐþÕâ!ô±‚¹¡5ñ+Ú0Sf…m–•‚}ÏÝøqž†3`8ÎYã8ùXå9ÂH^Í][E9¨N·ÀÈêäÑÇŸáQ1`(ºcºm4¡¨0Š=ÖTr³ƒí&ý51åÁYŸÂ ‹Â^}ÁÑórôãäbMýS.Ù÷Ï[Ào$‹6P=Éïð^c“KýÖwZÓà¹é £ôÁYïÚC©9˜¶*†a^ÞÖ Ýq{Ázš8íso°yÍ ,Uq8#:<Ž|°²å+;—|9‡yÊ–X9ÍZ"é"u†«Õ‚‚6$; +š¶l Ø×D Àe‘í<e¸Ô8*ôG—SÔ…b%l¿[õ<ûÛO@3âŽ7Ї(ogú}Š'úÞòZ¯PA<˜»ºqVΣ×k¯‹[à¸Ú~ž‰–.ðNMÃÅzIhð'ß9ËpwÇíïx f.ñéÂ'‚©Äªõ-ö¯X¨èî=Y6kÓíªR-m=T%!¬>áTßm¢N„TNÀ‰èYÄ÷„-sVÉt» Asmbçð(´!aX ˜ÿ"„_S 559°¨ Ö}ÞœOÍçö=…_æ-פO÷X‡Vª^ŒÚfó7Vß83rW–¦é(½»·µ?é{@%¢N8vž'àå¦Û“¨9ßž-è-Çj¿ØüWƒ,"~½IBW9qóÐ[¹Ú¨ü\Äi¥™ÒÅ2û ©”ëx¸*SßþŸ’ˆõW¸Á6T|3šœîàñ†ö/äâè’˜(Ä ÷½æ¶Yá㆕‹ /\Ïèê•„óݬ.uú÷êmMÀ’C†éâ­*Î8¯QžÛ ÌVHñ©Ž™[8{ÀlF¾ïIæ Ç€Y¨¶A*Ø9b”#,ÅaƒV–U]<ÛÐîT踴C?…0ý øºùBhZuŠIƒ3ç·úÌ+>Ò“.“ãZÉ‹i$ÆôO9lº{6´UVcOËÚºLZ,UxWíPÍõ=¦¤“¢Èn´ç˜ó“±žÇíU$ðw7R,ì»À«$íÚ±'[&ÿÒƒfû¹O72æÑ8À#~rЂçY¡êŽ”´^­?Α`Úqi|/݇?ÂH++ÿ ßÓÓ»0T´X”•¬ëÖ´ÏÀTpšS×-*¾‡† ì„Üïöˆ€èÄ)˜džUö×w”†5‘S“ð¹€­dˆx´kݪ‹£åyc‚f™ ĵu|8±©€;È/ו ›>eV÷vÞBÓÖÀ_È 6Œ¬–,!ëò@þòIbué0¢9v÷IY÷Ы]q‡ïæj¨ú…Q}²|‹wŠ— êÆO1Ñ~TyÝ‘P¤õv û©äÞ.`ÒI|Š¥Ð|ƒ#é’¤Ù­®èêu$¶åëqû‡GËyÃi$Ç©)¡[°Õ:RD-dr8箓®+:…°)vf@Fá¿}]ÇË—‡Ó4îÎcdû}fí Ñì¨èé¡[Û•x0z±îÙÌn”°Æ=v­˜¸ ±iTE’×ñŸ ‘mÊÅ©WwZlz¾‰Ä%—óxè´Êç…nøEا_oé—Õ`Á0QØú'Áà{Êe¥â>âE-±€° ø‰þÛêŒ ÀEF3tû-" Ü4¹.|tÕ/avâp²¡Dëøž«f·U› ±äl5€g¥ ˆìzÿaïÁ.þyR¥…“ù©‚ãtÅèbÏÉTæ«Ô‡G[mÒjJŠÜÅ'ÂË ¢Ö ¦‘ðjéÀæ:vŽ÷¾K–jºû²b Åo3G³2S¤4$Õ7;<÷ G/ŠÞ€Æß:´_zDôœ¾¸‚û¬ Çÿó»è2B²Ø…'-àVóåU"v~0•ˆåQÂlþ½˜ôB¬p´*ž:{*ýà Ø5*û ^Y›`¿,ÍѺ³C½HÍ©À×Þ.÷û‡Ì›$˜‹ð§ÓìC°£¦‚‡–_„¸m®4µg Æ=)gÅhŸk¿WdY(ÉJ¾ Ñ(Õò›:‰Aµrð°'€rcåWËá?·yRŠŸÜN¨ʽJ£ýî¯Û±X´ðÓœ>ü{•#ý_Îc-ÓCw £gŠÈ±2*Bq„Ù5‚L#V‹Iåä›^“Bw0'Íú{j¥¹¨¸±¿J œC1s|üñ{êŠÂáš³W锬–U“23#µ …EÞC8 ¸«7ˆó‚ŸÆ˜Œ×ץČz£¦¨CñÄÜ4œ›ÓÖS§#¤*- ÊQ`ûU2z[[öš–ËŽ6ÕúŸ}ÁÕ.È®UÕP °ð“6:ðŽp™h”ØS²’¼©7 Bàg/W4Ÿ?o±žÊ°³ÑÂ%)Z>š,„ó¸E\lŽZº€à\Ëx¡Ž¢_qÙ›ó$y×ËZ‹µ”މJu’M€¶›T)ŸPÊM×oåm¨³x³Å—Ð8UeH³·æuàßÓ3‘l#,ZxÌÿâ˜ôHë´šNÓG¹¾æ"fUMŸ¦” ðà¶ÿp¼’ÙR=k%1‰õ‹Ær}6laïÙŠ¤m\¢ š^õËßÛÆŒ({|^³ÝáGùlz›òÄUº½Ùt×MGê¤ÏI„Q•Í7ÞÚ¬žjÿ`ñxì[‰ÄЋ£5¾B =-áëðöÉXÃ=‰;”‚mIôM X¿© ÈÇ€e8D¹,xqö‘PšÕêÚñ†jÖŒ"${¿ìö«`«éûBxB¹÷4 Å´ajÝÚaœIžÜD,K•y1žŠ R•ºÅ“hYðT(öœl"û¿UÈ{ˆXç`h@ŠÑTcÅhçY{Pãœ[éeýïcŒ“%™1ú)á>0H·âÜ‹ :Ó²{h~ço™ùªÛ*¾Íüä¾×ÉŽT#ŒÓF¶IaPÓò³5‘¥0 Ì ò¢¡JÒèúÀS³øùMvSMÿè𺎚*eoZy’.Á ¹€åë©6¾¢y?¬{·íÍ,‡ê0ùlÇÐL*¯/3ÍT.?Ÿ4Yrü!w'„ѯ›C¾áˆÑ& =¶RÝͰ*›C *ö«)‘åŽê’7ØtZ%…( ®ŒŒÍ†3“ïÖ¶Þ.$ü@áâGLhq|íî•Áù6oÕ‘¡À‚Í.ÜBˆˆÞ㳤*¤Ym* €ôëÃ:+®<¨rU A6m—|ŽàÁSæXM¯= ÿzý‚ïHmm ­H™ùÖÛ GÉ Ë+yû¯Z†˜ …Tµ°°ÁxäöØ>7󆽼7ÚXü‡ GÕª4 ‡àæ£ñÁp?ñ€£î/˜[kìÛW@ÝÖ)â$@…÷ë ¶G‚v?-0iôYª—É<íÛim·6ˆ‘Ñ‹?.[½:Y³ŽÙ”Jñs¶²5ö&yw¼ˆú%Ý ýôÚðk²ÍŒ¨=”´#â¯I\<²6USœõï&Ì7­å§çFCük…îZ± â‰Ì­>ªcMyüU<×öp†˜‚‹ÛX—àk ¦}¦/„t‘¬PhÇB îë‚Y‘`Á£kT9eσïdsXÙŽÔéÎtÞœù| м™.ªÛ(“‘·D¨ÑÚe¦FŽWŒ“#„úÉ † ßÅúc½:/>&i‰HêHiºág92j+Tˆò°Yë‘÷éä[ #+ºêRÒ¦è«åÿôO5¢j (›³ZS,âã!ó±Ô+\;U±kL7­U¶{€î_ššÕ0wŠÄýªL³¨jb8hÔVÞäd-ªAÖŒ1úDzÿ…CÎÁuØæÔËEnäÆ<Ò0Ž"å’ @X“L–vâ"¼¢ÝñÛØ¢¿ÔZÓ”•,Ø.ª}á©sy&³ü-··¨øØ%;¦Ä§ŸÚÂDZ];NqŸ\"Ø.XynØu'7ûg¡ªkˆ…wÎ(íÜzÆ„'o¬?€gídúnèâÍ’*N¦äòJ.Wu‰ ›ÇÐÙ] ’¨öî‡eÀºßt,°¯€ÿªÚíep¹¦t­gTË”ø'»Q‰­QkNÅ·Ï@¿ˆõ’ÞÐùÇ“>⸻l®ÛÁ(êîq#Ó‰´0ü\B*”ü9¯ÿÌX¬Ow4žÈí2¿ =ÀÜ÷>ÔI¸õeÊþÃwµÏÈ,¨¢¡žu²\ÆÈ¬£ƒ$&wîÆñ­ïœ4Å]“&øª%^m+˜ ¯QžWa)§|m¼0eþBh‡||DrµuA¿uœ' »n¨'D¹=°=öÈ¥I(3J‘îÔfüÿzwO^|öË,ÙÝCPÂG¥UFË%%N‰Ÿe¼ªÊ°bž¦’Üårî•‘\$¦…\wc;@àÛá¨À†cùb_—À!Hýx„Q`øáߨkÛ¸7hð¡˜.mdue­®1#h(}‹a±aT­?}žñ4œ,`«i<=NæÑJ¶Õ‚JjgwUuðܺ3 +»Ã?Ÿø¯¯î iÊû!Ént^ýå—B aÌ >Øð°[7¸s`ùf┎läïæUMwš.Š9xÓ”|Mò€dß^÷>c–îkÎΨ³ KX=Î×X<ðXéÝï3ˆé QRq6Þ@ƒ£>R×[ˆç É9ãVd¿ÐBt°¬Ã~ªÔ ÁåòD'_ã¡ôõ]oUkÆ”¬ŠåÿåìqÙéÚÉ6ˆ„°QѲò0ïiN˜Hzø·X²¿t òz´bàºî¥ªë¢hãØ•VZ>«:ö2{Ôu?‚ƒ7ãßçµÂÍìËhéeª¶Üçeƒ¨‹Z .¯ÒA€)òÑÜ Í? %bŒC/NíéCê’÷=Ü´nÆù`¯G¾8.]|VÌ$Z"Ò,0n ˜D„˜ázÛ¦£1S –‘>!0¿GiQG»e T'»lîz v„›;dªñ ”¤qAf܆ìV‹\rY’HAÕʆw®#gèa’\ImžŠûÓÒ¼ŒåÛêÙèÛ,ÎñÂ9PÇ3øAX°|ïbÕ}I¬¸ŠPNŠÂ•’j4ÌòQ+À 3i†v mQIh–¾ßë#IÌ<7?,… ú|Îûòµ åýñ±8ó–ù´AƒÔت ;«ôœdnOÞNNCª´ *^ ½^vÀ Z,4m6}±ŒëÈw¥F¾úÒÀÁÔÅ-oDW´lÀÖÑ")U,t™­ØÂö*$ÉUvʬ‹X:2ÑZ!ŸÌ6nC¤uUì ëœèë H/w”1¤Q©¯X°}‹åö¡MîÛå’ŠÁ°þ‡áðȺý5nš¯éI«­BЯ1‚à“•åðd4¸¯¢qž‡3ø=ØÔjö’®f%žùD¡ØK‡ ߨÍ,뢎å:^>B/30(º†¸ðê=e†= vOH8Z¡>€)9™]ŸÏ^ŒôkVdLýÇÆÒyVÓÙ¯Û±ïÿ¦,QLfð®µ)ðáñÚ!_ŒéµÇzÞAx‹°¦úè+õ˾h$8K@Þ©F,’Î\pBûx[Àz3r.ž²WiÖªiòÎc£Û@t[µc\TöŸ¼6ž?i*´]Ï…b’#ÿá‰bu }ëžâ©E]1fpgÚ"$õ<{æ•Жj¯i5ÜðáHUÙ‡#'ÍTŽeßV±þŒº_J¿e(ÌîÕP ì¤9†¿šl~R¶H”@Íù}oªßÈRº™ïlrgyàýKír¢ ]ŽËFËíéìz%ßÓ3Œv u¶ìÇ‚ž !²/¯ÑXôØEG}¨lÙ“Ä1*8uiLBºNöS^’ÏŒDø5>—`¼ï‰ˆÆÚø¦ÜðÑ(¸õ<äö„3.x’ò ’VeC°¥£‡âßÑ•Þ?û;Ÿ]qÓ`®X,/š’Šðâ[œ“öÄ4ÐÚ_03ÿ*˜ƒ¸þ€wÜ{)·­fÎú2ÍgF~%POšEGrÝ%ÊF+ÞGÎnûåõZíç­¦%Ö̵õßá´‚ŠÀ³ª3qÿ…ÌΑ»)ñK/ÍÑñ’vÉâÆŒEå¸ÉÅn¥ÿí[ºînL©:¯¸fUô÷>¦åTlî —M³MŽ£?ËÀî- XxÖ®ölël:ìEª>'£vJ)ë·ÃO×,›0”á¬46á> ψÿ%¿ò–$œ…‚0 K.nÝýM©¨=Ÿ›×i4ÚN¬wF¢/p¯F¥üþ\Æ r4¡}=òIù8‘³¹ïT¥~× E=°57€ÁžƒA x&¶e”À-„›n°üfM{UAáþ¨L0›_jmýòÃqªî¢P(ú 3v¼ËIcJ ñ $ì&կ݌ 9øŽÁn D× ÂŒ™(5ÖØ &½Š Ëj›]-taÛ©8Ѳ¾vønû·?LûH¡2ÍÈv†](âßøÁ5A©Núõ¯úÕÙ½9³ ýla5Ô Ì'ŸìYœí‰ûêÎîL„ÃTžÓå|—(”ðO”÷Yc ¿{;*Kuê°`ÐÂìЃ;%a²‰½xî·ü3ÍQÙ-vÛø]Ϭ¸!ª¨÷A[:z}Ã/¯˜¹ܧ~ì–Ï”‡ËA4*¬ÅŒˆ<=Ýè¶aêRªtN¹ÛõŒõ-‹ü—R¢/)$õ ~vVëðnÃãÀá8<â»:SŽ—…ǹ€ÈQvüðL1v„¾OeÞòiðÐ↢GžsvHrÄo“øÍ'žAàÊ\üÉã79f¡u~w(%öç(w½(TR?°ƒç+™´‚]צÃRêƒLê‹EÊKclÖGÁœ˜`VÍYŸU+áË펌qa+ÜÛÖÎUozW â6ÖÀ¤³¡1 4´÷0ÆpBL×úƒ_xZ"š2N üÔ‚u?ýGÚúÆÊùIZŸ]I®· Õg‡ Ú6JY‘±ÿª±üSré;Eécô…ãÝâ„F)6£JB|&°³ùF0Z)“÷°zy§Rx&·;Ó¹ÆËs™aˆö¡‘Ó­vÖTލõÕ´T»>§WIk*h‚ãV½x}ωâ AïS»x sÒŽ¥:SgãðR+CWayêß ÉæNÓõÙ~§.±8«ª˜šñI!=ÎÐl<ŸÓ”/VDãºÕ¶¶BO!•eÏ÷/sZQøÈ:ä4žº4áÕ ¦}ìâ¶”ffÇÐ…™°Þëðšé…:×>q|÷!` boÄ£ƒùX,mk š†F¾["( Jžª…þ)#!µH¡åXÛÝQ\Ï7pËÚk—j|7À&ÜjV éPÕ¡ÿLxŸ‰L Á=ÕCˆ›d4ÁÃçElö‹ïÝ‚.»Ø/š”n¯kßßéÒ?õi$íwߦÃéÃðÈ¢ãv» ݼ¼Û1ôœóì…äÁzäm›È.J§ L5îÌóÚÈîgrm”îa©2†Ã?Ï$$uSÍ,Œ¢ÅC­²K¿bÅÍ»TòUÞjîõS>SeøÉqm½Ûû‘F ©‹S*ÿ½óÝû@òžj¦‹?®!™ò+|s>íµj('È*@Sä±z¢r•¤{Q:Ó®N²†UÑòïu3¬(R2ÅÎßѳ îÎ6—ÙkQý£u#áÙžrù…¾ÌeèA:P·~4AÕV©îw¾¤‡!C_Ÿˆ:Íæ5ØÃïP}Ÿ§þï;²Ì4µje7î‚ :mÉbÚŽ›Xw±@PG,u˜›ý¼¼öµ¨hfÐZ}&Rò%J:'M}ÛE©”c. ˜Ë¿A¹wl‰ïP›”?¨E²RpW…Ò©D/±àœ*-ãYLjÃd×úÞp¸ëg¯ý‚!žðõò*ã:uFŒ8'êˆ5Ö»a²è½qx½‡ˆ.sÌ×0ÕêšÅë4aq£Ô'ikñtá¢OvâÊ) …›v•OÀ¢XŽ“º£y×ì•?müÞ_œ=vOª¯‚íðMtW÷èьƊÙi°®ÊÛÒ ç°«ÅmŠ,`Øàö ì}x˜ŒÈo)iÙª-ùÕ½A°õ ærR˜ùtáé ¯ƒê±’W.Û”%íšö«¿¤5.D‘ÅG`ËÉŒ š°u‘ˆ¶ùê(M¸×>4»Ý?HfVJ\ÖÈ%Eû¡+­þTz•S‰šÞÚšYÕµâ ÂÛŽ±‡”PDÞ¾LeCÿ½^„H[HwQ4 ÉjgývƒÃ0F ‰hép¼_½±€ç»C=ÁçÈËFn0‡&4x0ök'^T,zgì¨Fá¿MñµÝ2òÛÛY]öôŒu° Ïv¼”ç0P\`_ÏÕ®€äÄŽÙA1€&¼>D†ûQ;I¤p`eìõ}Àׂœ¶Nî0((:k/Yûg·Ì;…hû üÕž5:ç<Ð` šù½È -]ìÅÔZ'"ÞY²ö®7QJì5ÝÎÈΗ6±m%´Ù U&A„Fft$6 T~›ýuõtÙç]Æê?®õ|3}Š×Lô‹›5¾ ²\Ùw+ðÍóñ;fIP\gŽâ…’ ¼ÑßrÛLA„‰"jYØQû-чaÄgóZîaÁü“߯ÃM;hªƒÀÑ>ö€È*ŸÐÙëhÆ)3Ñ™Ëî«›žÚµ/DLf!åËyõQíWoë%Gä´QûQdØ`Õïʨ쓵ÜúcË’wÏoñ3 ²sS¨Ü»ê€n¬x#(wÞX.¢;Ê7d;J¨8›-3× ƒa&f(º]2ðM–§n¬{ÕÈ{Ï«&.ïùí-%8ô#¯<c/@Ç#Ÿ•ô¹˜íípCöŽm*øó±ý—Ii¸2àb?ƒ×ehé¨4:Œ@ ŒŠÚ^L<'©ÈRN¼/!DFFªïã•ÿƒèwz2¦Ê÷¸Z:!Œ*M;€ÃjB@qÉùÃþRhn ÑíoS™õjb‹Q{¡_ÒÈ?)v¢üåCHNP.±fìûz}SŸy’{‚4¿pQu 9½ÍF¾)殓•‹€Gº§?½½­ ûb³ì[ûÈî쨷n¯Þkö`Ó]Acïc ¹/ºfóqxÚGB*ÕøµñnøxþËÔ'§w{Ù½ÖGó#†±zXõ™ì¹F*Èå _泈IkBb3ÂÃ/cËDc¾$dmæEÔÅçK^ƒ´yžOÁ&ïá°4"½®ƒÙ˜¥jâA±D‚;ŠŠÌ5Àʧ¢Ý¥ÿÃ1'Ã{Ö$C ›0ö+*´ùn`Ö ûº,Lu½0ó+ÉçkëÍNËb˜@TëŸ<=\—>¤äîo.ç—>—ÛËzŽÛ‡Œ£ÞzZÜíÊM³Ón“½†“ªJ?Íaa*åc'Îb‰ûlþ“0Qf’*x5r ÚúðÎG†›à÷´+‡³\Xvø%4Õ>´IºêPîjpïÊ`àœÑ°#ZÙë ¤>˜§ÑAýt²trnŠ .Œšœl_ãrߤû—ëÿS[æk8r3¤/¬º¶ÏÏQœ|ñÈ‹w <|!s}d¼gGEÞtªdÞ£´¤ÔTƒ_°ˆ¾¢ÍëïcxxÆý¿oZÂcIAà2,—túZœòc® ˵ë:ˆ–Þ)ª¶1J¯C oS6f¸JA{AP(Þ†ð]Ü/μOÛâzÔ?-ºL$x1â» ¶ýVé.}ˆ `‹§¦z0ÞTuE.ðêÄ4ÓÁ¯f:C]+ú¡K….zXkÿÛb‚‰0Ì»$”ÌÂv ¥îa2Y4L÷3û%×h”øwŽQ{øÅ üþÙ‹ÖeФbûJª¶m™­MܦêcͰùJvUmÿ«"„8µ}þV{~›hšpó2¢u dg’g¹ä°#Ö¿}…9hÏ0Z-qð•«ïX… lOúpÎ)^(¨3ô—SÂÙt çªR½ý¢!BêÂõùƒ{Y£!ËXž&§áÇM™Zg?«–gQÝ’LA®É¦îGv¯£âù¹iBÈÌÕÚp¬¾5r¸ H5|2R}AôÐryÊêP½ “¾F\¯/ý-tc5̺!¼‚ØÚɺéý’M–€8 ö_[•Ê7(c¬¹Ø=–4Å“%ñŒ¤sÂÇ&Ö!¡: 2ým:}o¾ ¿Ú'Êë>Se1SeÛ‰†øÈ‡àvofÌNÆiúŒw¥>žƒ òøôuxÎiÛõAŒ¼ àãøßÙ¥ã$³“þ}¥…è¨ T øDý`ÔnÞ[õ áZþ‚£d¨-BqÖðÐu»8jMþÏ´Á WÂà—+_È7w™h%’ùÆã ‘Çîv TÛrùÔ_Oí ÍçúªZ»ÏKežŒE4Ç÷Î zÉ6¢Û–Rð‘Àeºªª#­²ÒÆ -½¹+opùÛ$ÕöœgxñÑ © š@\>Ñ&‚.ᬲ×5PûàËNÂ]W9ArV+Q­&ö:IæqxÁ"_iB= KX‚»©["ø EÌÖú쎄u¶ŽâɘV¿Ræø,‘K°"¬N.ŸPg8þ%„ĬCðöB„’üìp¶9!HòÃ0w:Ä1Ø8Žmòp\2‡Z›‹}£»Œ1w|Hп§Â8¦²öÄ¥‹t½fTä¡{K“n…nÿEÌd¶dvÚ¢¦‰i 'vZ™9Ÿ(šj\ÉfTðš‘1ŸC\úLVÈ3åL‘/2-4Œ:ØŒ§r=t+ƒù¿™Xs“ö­ž=$m¾äŽê×5UJ´™ÔðPL^usq¨²[üp"ƒöúïlú»À6}î5CrÃe¡ Ñ>63¹ ,„ÐQGSŽ‹v‘d/¾t|…ïʼƒèéj¼ï¼õë;.`òtù”5bº8gó„Ø¿}÷ º§™Û>Ööf|¦l; ¯ñáòIUÀé°BÚ¬«î·^’ÿÀeŽ´*ü= gÁ<ŠNSú-Ǥ³%6M ÁаªÊ9¾É„q¸íòÞâ ±¶Ó°—š¨ÂvìÓ1¤I,_ó€©û ¾N²Ã‘”jSJ„!ÞÛOÒs¦p÷ÄÔŠ‡K˜y7dŽ¢x˜ gil8Âö ËØæ0€{F0ÿÕ£6ôÚ‡âfÂêLMü¹YFB`åäs-§þ7À’e¿ïtÑÎŽ‚Uªq lÝnîyÆ÷‚i‘v?8~ÀM|þ0e"E<±tü#Oµ7ïKÌá•«Û× MŠU'&`ïµ@žù !Fœ ÓßPor&(ÎqóÍ#Ûp’Þh®¶-I¡‘›!Ï>HåÙí7h´iBãG'Dpk’2ª ó zƒb„cþ~¤lí6K¶»ýqì^Á½ž»Ñàq&‰ºK˜ CÕL=OôÚdñî'Û›§Nõ;§§šoØH¤»¨’«~[Žekò¼?bÙíP#”Ϻ¶½çZÅØI’Ru<qmïÉÅnAz‹Ô‰ïÙM`AD+î_½T´=ecA÷|a2©h 3ÎHï#!Ìˇé[kö’&gÊY‘ĉ‚(ìªF£L`Æ wíÐrZw¿~y²ßÈ6 ÑZ¢µƒdïá¿pԈܵôý]ÀǹÉe÷ÕÁ²šbÆÏº )9î:ýÏ „IÌ.‚Ãõ#yc¾KÖÌ Éìf®<¯`È¡[ål4]¦­Þ÷Ìîßorÿé¦u «Ö¦ðíã¶Æy@bµ#Œîq­„b+Ï»iè"Á¡«àeý÷*;¯<¬‹ †Œ¤y²ƒè3WN3ÂYä…ðïtQ!!+3m¨ NŠ”ÃF8šrg‹¹,¥˜Ä4ýi÷s£ÌÇâ/éòP~!ÓT¯S!vú :'öfeÊ¡B›«Z€ L—„G”[Ÿ‹äO²íæ k»"»Û• íÒ&xF°ÆˆƒÙ@”j¿DDdɬþC¶ yÈNÝ/îôØÅ¶xãÅ´z—„%Qö$MLë¦bÓžúŠ<£¶×-Ó5I#;'|ð ƒMfІô¡ÊbvóC½¢R£Û#àšÄ`Ÿšfµ8§´¼5o†¤óFR Ñ0ûtP¨[!®á¹Ä}’&05ݼSix¯”ç7ºQAý)ÝX)𸺈‚æª*ë¥ÛñkWÞÒqÑVíÎ;¦s‰ú_\°í䡦XmWu‰7xÅG¨{2æw͈(vмÙfÙ+á)>;€¯ýÞÅo´ë²?,ÿ8i«¢²feCZ³!tóoCQlƒc›ûš½3.ÿõ¬`ç)_¡TŸÌŸxˆXg)W¡<Ò%@˜0ËG)dŽÍï¹í<`¢êŸ_M´8X(逦åµ4N óàDë>F“<ø æí…­ð¸ÂÕ_Ôˆ·yÀ~Ÿ8¦&×ÍÎåÂíäï§¿¿6Ò¶/Á¤}ÔÆFÜçOÊÌn­ÅÚ—ï4Òg ý;­‚‘õbMö"Ã8ª¢yï>Fæ[‡évR»–÷hÈj²1ý… °4P6Ã{ÐáÚ.LU7^ªçŒ³K¤rLŸ6’›XÅ@¡¨ sP BÍ„kg ïŸ v¸…åaª,ˆ òü_X*)È Y‡#$ %f†DúbêžæÙÚT9ƒg –qÙ^XRåà‚ɹ§g°´|Mé‘}ÔôÈ’X…+1<}ˆLGAëQ8˜ÖlΉÞKÏ~?Ï“ñ‡) ‡>^áÝÅïÞc+h*³•qþ£hÝ…¯á"ðI0Ó Zz!QŽvã=¬7v¥eF]bc׸g7ñýV(² âÏĬoši¼y@fA¹îcíO¤»‹Ñ»~NÃby÷Ú@q+•6ÊÁ—À”tšoâ¯2~¢Ä¯Yˆ+áä@fÙ|Þh·°¼E_S·góPÔ‹ n}ÅGyÐ#d¡¸«’o’‰¼%(Ð\´–}Cb kê±(ÛÿéôÕæÓÉ6ôkçdñ-foe Pö””{‰+ðÑŽÞ° y1ýø·²ñhä9wªvlbp‘c…2óm9Æ·û &P·‰çÁ먃@“ˆÍ­ÔŽ„yvv-ÓØóFêBÁÕ¾º64é,‡2Hm’<™¹à´€û|Ú=²OÂk5o¨ï:TR«¨?œfa;B[~¬˜\¢‘‚;å´u1ª+OõŽÓM|Æàví;" ~DýV·Åðºò¬h®=lœârJäŽ 4ÔZä#ÔÓlç„G#¿?6ý• Ø7?˜ÉjÜC%785-ãmb„P=r‚®ä`j;ÅÆµù¹©n1Óν{=¦JÁ1РާóþX/+ïc½oEìU«§†ýL ™Äs<,xI0Ž÷j>2´¢’éä:¶Ì«ëëiVfOÕ‡ß9ð1“pº,Õ}…õðÝ`øv‹26tFÀ÷¸Ô4)¾­ô©üoCÕª•(á„×j˜÷OÍ+m æN%D™ò]úàL’'ËKGU]‰F!f ý½"q^H‡+;XÙjÀ› M‚@à® …z$vêðœ,QÀ$ѨTEóù’ Ò®Yz4©þ±O¤u½Lñ2™DöG0b%…iLÖk]ƒë+{œ£[âç2±˜ë MéùÜb4h¨&Ë•W³2 Œ×ȹ9&ÆáË|o¶?vd­ `•Iètwª»ëÛC€Èè ™”ãà O‰ZƒU±}Ó¿W”î¡9Ì¢;¿dŽp½Ø¸¶ÃI÷£«à"ȾýÒ.MÛŽ Ä–PS×ìèRøçë¡:þ¨æ.KHËð¬àÞCµèßÃIûáaŸ®€ÈD^‰±M9þ¤¾ogùЬ^ûèá\­JR0ö3yÂHºÌ'ê[#¡ 1 Þp¬÷{±&êE!Çdp†ÿþÝv¥ óжSh¢zlnœgKEðAýúyÈõeä·ƒqç Ý€œð+I4®ùøÙlÍ‘œÄñ8|¸{äu5#^v¤ˆIÎÜ2,;]¦èѪª, -JøPëÆ‰3ë|¯;$ò- jÜsÔVíg66\ºá˜‚=ñ ÒñÀ¼±6y¬* S½>T´:ç!¾ÈÙ]°„NCO¶€=K¢\…yºên£©ŸNÏܺV-Ñj­7¦i¥!Ïå¢ù#‰sVVõs†ÒŽÓÝàšhL†›Æ"½ŠLÔâ¥Ù'MIƒ2IRq'L,Ê«[…lJ#‹ç›¦ Q…©‹õ*e}tk°8 Ó%\|Ôûøôl'V_¯%Šˆm¶ËWº8|Þ?õíÔ!™·y'Æ ŸðÄs}K®_àÑa ¿É læ•K®wÛÙ\AÄ»*¾F8§+“X+¥Ó¯½oxÊó¡Ð ›p æFÎPò2¨„ùÆ«9&æ£f¶Ú·.õ&®#ð§7æQÈ{Å{ŒËPrN¦[ë²únB]»•3`¦ÜðaIDf»©žb:8ÊxU W’€”ðf;Ù†ÌæL%¬ EZ–m\ÁáÂÝÇ;Ä|Á–Ú\2ëšx{Óe@à”í8€G]ž0®¶v‡§%Q(^ÊŒ¢ÜÙ^¢cü7Z2Ó¢¡ØuƒLÕ¿sOL¨Ð…[|Ãé3ùÔë“„ýý¡÷›ÂÇT®y|Ñl×G¨âg~sFŒ&C?œ Ö…!•„¬2ÞÚu–{-ß(•VI!½°éN剡õ sd—KàoBÚŸsXÕÀPx"µ± Ûm|ÅÄnÆ/u—ÀÓh Í¥·µÚrü’ˆ²QÏSìZÄßA—ë('#ÉÎ[CÿTV×Üp#·. +~u²<¤Çuw4:Ù €b¹¯>)o#9ÀY« •Тp ÅTú_å·Þ×1íÅÁÁýÿ¡¢Õä¥J1ž‹i°lÉVB¸ñ3Ì WºLªÍû$ñrU}Ý_Ú²EÏñšÈŠ—2‹¦÷åq]ùabè¿R‚ Ôg=äô篾úÈ&ðlg2ícJUðÝw¼‚¥<·j3$ømH†ÆÑgTÉá¯;Ë€“ͤlçHˆf&äšÔ`½ªZâÎ 5ñ (L°W:M-“vbÏT ùí¿…*íÑ5ÈÃ!šÞ>â¿Aimê×H*]–…ü"¿Š’¡BWµ6ow"¢™½½•B“MëÃ~ƒ¿ ¦¦\zX4Ú£ úŠì(ìëõünéÅ9Þ¸À¯‚²|,=gî†Íé¥wcYßtSþMŒK^A¶(½Þ˜ÃÖ¦B5Õ¹ì'àùë^’«怦e]®óRZ:ü;4 r ƒhvÔ¶u•^Õ¡‹X¾•D5ÜÖ¢Ø ï»¡:Z¢eŠEE=ýŒHŠ»§«X¯J´€‚FÜ 쾪V|ùŒŽãKÁjÁ¥¤€ÚX­·Ð¨ì{h¿€!‰eTè Ä ² a¤6ðå¿ÑÀis— #ZŠé Íê•mĶkz'òdWˆÑ}¼±”öñóÏ4¿òà®Ý³´Æ;¢ž ïŒ,ú|áۦܑ©ì¹Y¡Œ`R§·Ë°ßz™³ð§ Ü I~ñ¨ùY¯~سÊ8w˜>¿ÐLw£T?‡ÿÀäþÈìŒ V›ãœhÀÑí1Ù«M†tÅrB8úҋ¸’jsâäz¦à“Ùê-uœh{»â|.œQGâ aÂIÀKþééDÕñe¦ÉÇÊÔDU1p-dŽÂ“OÎÊæfóÎþq¹}­Ñ7øIuh¨ë :ž)1#bÀpÉëÃ.Ê÷ì2Ï4Xê-q›ªô½«»)deg—…è&æšoŒö”áfÙfÈf9ú-ÍA^³¬‘[d”( cb¥¶/ŠV¦‘ž ^¸˜cÇ Æ¤¯!w (^”‰Óµº,‹¹µ-âsÜ6säQ°½a–K}ª²È︳Á™ÛEûa?\‚8lQ­B^9ņ&J9áÁUøõ[…E3Ÿ`ö ”AAÏ­Ç~÷Þ3<Д1ëgYLÔ6&5£,×5G®^/£Wåµ­b׊GúÑÒ¦ï¨Ârú!‘ ï.RàzDÏJ§·¬ÿHÅît¹×ôê5/ü ºi6ˆïXÀ3Üì”?Î~âM\%,ì„îÆ%T|h-ºo¶ZSÿ—Q{sJ*L.É-"ýåSºPñˆ“yu_ìüdtžƒÙ‹L‡Vßõ¨J/£mɧÇBôs翯§$ºÌg\çXOìKQmí g+\¤¨™1”~Ú³ ì奩‚î¢ ÁĪ¥ÜhÜŠþͼI{—6qW9ºrd* õjVºÚ !Ñ>8bVj`s7@a¼¨ÌmBftÆ<åÜÑ™µZ¦ÊèÀt äÞø°y2TVõ´{“ VAüúe²±&én½)Bø*áØöÒ Ï/ðÓÍ!…MÞ]׬gÑoS™ÑÔg´oµ"ßB¶ó…¶ ÛÛX=±?*™@¸~Ë…A|•³é§?dyyM³'€¨$É'+ðî>UþkW&Œqå¶B!ƒGŸ)ɞɟkwÔˆøÈAn§×#‘¹a à_UÁû°¸þ^P ….Ru‹U€ú‘r­¢éVx¾š–'ä6¡Ñ(†ÓšOhîÊõ5ËPô0é –ÂM<'#)ß¿ñ¼ U`ùþ¬×€i ª„³‚¨EÏB¤NË$¢ߊË)‘xI¸¼±9šÝ„µø ²É¯'µçZœ¨¢F¡G–Ç­F6#’ÅË,œåÙñõ;ç½>Uìÿ Pï¬T‡3„}@YšAà¬)»œåôW&´ ¤ðJnþêwä³ñZ—ǘÃlZ¯»œÖLÂJSN^’é3^Ö¤0tF}V\¯í€ä1% lïteÖ¯!¬PÿÍ?«d%O”Gô¾Ë’yNy˜©ØžµCØÆbÏã"¸ÆZ”ü4´™š)ê×–÷²rcI1áà`¾ÔV·®HäJ¡0;áËØÃv•\3*š:ÿ{¶ÄI›…îÆiù+wS¾ÖR«0*ï¾o„Ï–10Š#>üùõéÁå¿WŸü ø¾*´AÂðÀ߈.Ÿ­~ç´wV¿Õ|Fœ:Îs7Æ]¢Ùñu&Àˆ$Ë }bÚóñ"N‡†~V‰ÿÖˆŒ÷{j€adÀ?b›þTÝÌ›,·=Åq'7Ú•—óE,aÙ²y!>P°Îßýq `ýÞ½Ma÷¹—ð~ÇL)½W‡ L'!£á²Ævê¦Þ¨OIÔdëKòÍT×B- ÷÷£4‘GÚâox­4/a&z±,¬ùôžò8;¢ƒ48™®5ï1í¾–OYöG©á+Âû"—Ü„óp%h>-ÄJw¯Uçt{š$8ˆ)Øð‚”æfß§Ãu3Ùá žÀVûz+ÓÇç±j:– Bê¡”\i²€0r̓´ù†û.hN×[.#¦:¢\ t(¶†Už<Œ&^˼Yë‚yWo‰²V‰Y³hœqqlɶ,ÁD¡ ¼ªÝC—4v‚¡=ËéÝ +ðW…ÏA‘¬\üãÛA×n¡e :ùïz°ÅF>[*Þ÷©Ë|È0"ÅK#='bßìŒPÏLMÍWGi™î´J>äåmµÆFp4£Ö6!­ø§ÓÇ€H‹ˆÉÚZñu]J©%Æ,;@ÈzB CÐFJt-w@JøCkÈU©húš Uò˜ˆ ð<ÚŽz¿üL²æÿiì'šâõæ¦à·ôÀB¿„>•I‡¸óÝˬgûBTàjð ólˆ™–ŸõÝx4 K¿¿ÁC]øÝnøÈxfp×üþÁÔQú57ŠÒ-ϥ̪$Öÿ©­GYßð’"ýpnáëI‡áW?´—±îSwy!\Ô‰m¿<ž­eäFšÁ° }. Éæj–Û“ß-Æ¥1a4“›eŸÓˆ¢7;Æ·êÝ`ju~鸹)¡¸ jâ®%¡ì(lþ2¡U]-°KÙ譯ϷTF§%³´3ëï˜üјêê—¸l†ÐöŠÈ«°úh¡¦È2ôcÅ \B.á'^ôŽ«æ/õ&渌:ì ½ušÐ/$˜pßÉ §%6pf*“Ĺr™¥·ŸãØeNñJ<‹©7JãþÕýd—Ë£Ø|3• EdÝg¥µB;„nW2DZŨߟzýkˆŒµþ£ø05a(°O#úfILöÁ~LJ¹NH¯‡:ð®dƒkK¹EHHiŽª‘Ô=Wnò4|bµe:±d˜¸·t·!˜¿È‚”ÕöØ!OéýŽ7X²ç x Z§?”÷ç†eì¼×„á>š†§ùÓ|A$˜#·éùJE¢w ÀgBˆÇ;ÝÒQCq‰l³‰Ü/‡*Ý{¡zFü6- B‘™ú/–=DQ QoSz)9:¸qÕ§*_³µ¤‘ÚB¾Rfº3û—ÈÕiWANÁøî¢îEZ¿^†åÁ¿#©´w/ÞO[¦~lÝÑ·üâÍ 71n]Qˆ8X2Ò¹%õp‡:ÿý §vŸn€½Ö®Ñèácwáõ†–æk!/!¹!Êgõ?’ûóu%ìMÏÿVlã(ÿ‚8Ñü­ž1ÄÉãëÄÀÎ÷k—[Ó·ó}Õ3c $)3Ðíw•¥¢›nš]ň‹§ÁÆ¥Ú¬ÎP²SjAõªBŒ¼Dul•ñ­z¤X ~ 7£ÈÒ†`¶Éõ<ñ¬ Âߥ@ÚÔ¬•Âç R½b­Ñ3 ýá®ÔSi»èPç=Ÿgb¬täQ|«IANß 4ª[Åÿœ@øtjâãucþ†$KO¶’_6¿Õ_OeIÆ´*(W:œ÷¤ÙdãïJÊ¡ùB] §“W%d¥‹šê-`3/we~éGS"ú #HC¯ëˆøhêo!lœ°ð5Šj,uLIÛhµç »ðW—' Ø@f>E¬þy´--Œ^ã!·%ŽŸ4Ãm)ÛսьÃ~7öa4þ¢Þ±ª’9>õFÿ²ÌQ¤VbÒ  ru“м+m·)A0‰¢Í´h[±Mýê×"(#oÛ0ÈS †¦£d9– exdÂü}]¯6„k0½®ß¢7Kö­Ít]ÅIáôb.n⩎83_ü4âI±‰¼¹‹;$ÿ'þ“ûI÷Üû&Ápf‹ëwdBvŠ&Se6ü½•›š8V÷`Q ýnÃQÞ›yæFžD—ZJïÁPÜê´TéþÇÛùóåÒIJ/™5¿ ß-›9¦å3cÖLó·UUõÞùÞÚ±‰öºû@2AÎtó‰)¡^{™ƒµj&õb­f‰P†ºw4TM4Lâ(Êùƒ6´NjŽy B˜¦ŸhÇ0ÊÏCa«ÝX«‡%z~àHª©÷¯½m@X5'‰[†š+ç0ˆ¹J …ÛL5ˆýÃ"-˳\¸8ž…nñ&Ë WJ’^£JM …b4È@HqɶÍu„J|´E©ðŽ„cÙ€ÿ„ŸbFâ<)‡ú4‡íõcç•72ÌÓîþºðÂIWÃ^™/|{¾i ‡5ƒ†á›²á®{W÷È„Žg炦šf&Ëë]mžÔësp­ïOçã øM1©/JqOMUn•à¢)ª±Ô Rkè?r MV‹¥XÝáiõ  ‘c^(«¤“©IÜì_aÿòöÇ`(Ýîì¡„“´Ó­Cøù|¿Ý/È;ß³R³à(}3&Êí·†h~+&rÈ}R`¹€ÔuÂ=$½)J öa`ÔÀéóg˜t»Ñ0uP)ÚcýU7ÆOnÙ¶Ùùæ 9Œ   Áƒ«¨×¾ˆLi‡¶¤ÍCŠˆ-".A\¸¢¶Ýo 9 •vOê“xÞæYz´»f*?eˆlÎ_Š«°‹¯£ž]U&Èhì‘gU©~V;¨`_MsPò@iø·Â´q°¶ üdµmNeqøÄlcÓ±c7/7{ç€)„ë+«lUºŠ3¡¡/}}÷µSWf­µ!Ƶ ¤Ûyàòzé€þÎ&AòûͰFôÉ­ªÕÞ$nŽ!‹nžO.‡®Ìç}ïÆ#_ˆ§À£:!=` $àÔ¥Î'9‘žÓz©õèxQ í* ù>Ò—æ{ÞÖÒFø$¶>@à“¥}‘àß—ß¶mdÍ¥ôF8Dx%ec0"ÛÓÔ£bTl:ÖÄ Í:ì yê€W½Ã®»ØÂËv ®lOvæ7¾á9š”‘våþ`öÂöZ\z/eFó—¤ÃĦå'x8Tó … úT¿±I”dU³ïÓ ýÁaПÚ#ïnã×€ JÅãYwè"š½8ņ»„áê²ãVçèy"ÞÐû[Ð'è݆.%“x Íðµ³8S;ÁéaJFåGßôòRynkj@EX×!O´X»ó‡vm–¦?€¡79ûVìŸ&bŽ´³œÑ~¾…7áÌ"©ÌÞl’LOV¼3¥]$BˆÐ±RÏW'Û—&Š:Ø…}F%u©á§¶`L×lâ@°Âé¶cæË0vk …âí?$”s1£Å÷K›û -ù•å,²à°¥o÷r# MÜ^ÒJyòªÐXæ&‚oøŒ Ý[†ÂhÞoxfUþŠnüÓÍãØd!‡È¯BB}÷Ó/»Ñ#®Nz$PÄçBò°æS¡{Ùw*p9™±É›´£Î2^eDIç‹ç?úTP¶ŠwrðÏ© ‚|6îÈÓƒm‹hJ\bÀÉg]”Þˆùzõ½n"(aËû"UFø4]äãp˜_¤@Ý(†fª® 8¦í°®“TS9$ðHéµ[—R5oƒçq=y/íB‚ÙÎPRB–•¥Nè¶Ÿ_~Ø;F¬n; ã[¾ä þ±§ÚP MŠZ»/Ý €ì20‹kI_Ÿq°Å¯Ÿ?Ïx¡gº—¹OjÀ×Á'"Ž5¢õšœ’„7^'ëÑyä=áêµÌmsx¢OTm×¼×V›kJXàß,[N¬j”»-#ñåù‘ÁQCkÀJáRgø# l\¾Föó^­\+ŠEÂïÌE¶pÝ¡ƒÃ–3$ßD´7@èô1Q/¶X|wæÒn¤àJ]þr“ÌЕÜõIÏàæá8bþ^u@_ýÛa MŒ£­’ó2G\ä ×?ËLU`tÑ~ ÕÓ=D»Mj<ýbŒ7n‡VÚlo»ëRл¦ê÷& rë‚|[øx±¼Ä”¹}@9ú H#§ÚC¨ôDÁÏ¥{é5¶VÏÙHgØb¬ÎkºÂ]3®Í%/$Æ¡à2@‡¸f¸¹ƒAÖá·Ì]£’?{)˜b˜ÔMXs—¿J™ÈEÙ&GAØ™2  ÑßI¹ÁhÚ•¢q¸àÈ´´ò›§ÿ ¤òjØk£ŒK`¶¼Šçyš‹”c$>*Œõ¼b–뤌9kȘ)ðv}ï *ÄúΫ0³pÝU4GÚÐ+ô”D$nU;´6÷7öƒ);ž—`EËôTpìxg~©]=[ˆ¼PpMþT§„ ¤tàõÄ ªˆæ—§—v z«Ôð¿x'Oé]>{Þ’`³;Ÿ n¹™Øì«ISÙ62ª©ÊŽì’×ñã´Þú„z¹F²ÿGWCæPœDþõ¹7á«þÏ5ZU¥£0’†§D¤=¢°·-Ì©F)'¸¤ €F¸šæ~47º†» ÆLш_l®Ÿž‘Ê´]øù ¾pø"Ã)„B+ápW+{GÄà&»Ä\5é]×ÈÆ“ð®í˜ËÔEåÀ}ÊõÞcgáíêÇõÊÃ[kŽPsª:”Ô–%Ƈ0Í£ïï-ýlЭZ]éħ@]h=UÅ&MC”8²dkêfU¤â9ýºóS½÷ Д®â$'¦ïg~„M”(åÊ‹+Aņ fe‘ü×n$RÝ-ýnܵÞv v±yp¿ó>ê ”Ihl±–·D“Ëe^Y÷È ºÒM@0Û¡^Là‹°©`»@È}¡l ¦á*çb)óG²¢^·Ž-u—,5}j Q£“ûü£9¯³±‚çâ ýóœASÂlß"-j£Õ4–å[(òï b’ù²ƒ­í̇@q®‚Ù`bgc…ÿpÌ&­Ú£Mc+mygn2çˆ Oóìö ƒx£Œ6 ~.ߎ]»é¹Þ—AÄsd@¹÷j‘*×P®£UÁý°pUcâ»·èRR¿onJ’]õ:-Ô!ÇðuãЦ?ùd!E{5i ãóâiÿKÝâô ~­ÜJÎ$Y-FÙ>"Rp˜°ÌÃUÿÁ½¬SQþywKq.œx ž‚ܵt””¼ý¸ õvËÁ XÜ@ÉhzjTÉæZ¿C.¨Ÿu_xßåIÈýŒÆ¶ЇUiq º¤ºNÎwʺ#~Ï&ŠFÌøÐ,Ø>Â?Ë]z£:@­§'@¦ÇKý/'‹|ƒu°M[6·˜" keìâe[©O±bW–æs?/ÝH˜`>Š´âLüïü•ÎêW›Í£OÇçÎèw¨ëeDa‰¼ìL É"®a·DÀ„7hå…±7Œ}Nç¡›°1©î?H«ìçŒE÷R›$ô23:Œ='§hÂÅñp²ŸÊ6ÌŽ ü;¿ 3@ÇÌ+³û«°™•ƒ_Éu“•Ö¬œ~Q ^n|jŒ ÓØO*/¶ÔÄ­|C•ŒÈ ‚Yƒ`8÷HL|4/ÔIwpSË‹ÙâSÄ®5îª t§—OB ÅgMÑ ¡Òù½ž}R%DŸ r³Í—<ÉC3N÷¾(˜³WZ×!}ÖÆ:™Ú¢ð‘À\m^¬<;,Xé }‰ÝØAh~¹ÐóûÈШÁÕ|JÚvÙÖ¦{Ù@‚Iñe"Íûæg¾š)F%4~ïÀ®BŒømSvn’¶#œ]FùdCKÓj£<-¨`MX}=§ìƒš¼U/ÆKCÙHRF³|ê¨×]á/:ªæÿ9¤ü+9òy ­¢DrOäm-× !Ù[œò¢:%.Ö ·FÙ=´Oÿå…Šs'‘uµsÄ”)Èæ,ç£+/²/zsÝ=—t,·D¥›Ä÷Yh=Š;Š»C•Ów£eJGæa÷vñ9ˆ³Zx*…,Å®¨ºóÆEèç¹³[5N'œÕ¢´ÒÂF“+z¶=ï ãœù‰¦‹­ yrgB¡W)ÀzHŒ˜¢‘öŠqU÷zžìl|{KÃ…Ž»2O^]BÈÛ aˆBâgû:œ:%x K¼cÙ[sÁ¢ÈŠé‰'íŠû– 6}™³û[çÃz&Ç1—¯aWŽ›$¿áðW@X3·XÀ+åT “z`°UnñÏËõ-B’ “!T³5PÌy':Ç,¢¨Z)Q¯G1rš:ÓM l@vwë\Á,9ñ%Ú£tG!Ü<ƒ£„æ:9ìõ…²çiæ˜ôâ:&A/ùf¨Ø°"\s¢2§Áú3‹ÁÿòK¼ ‚C¾ÅŸïÌÅqÕ”<”Á²6ªè`G Îs±Ãš6ÐíÈåˆf+¡^|½"a̿ʟûýýŒWP¤XIÉK<¤Bèm-î,-ëË.Åœ1svUuõ sE³Ìmýªñç¼æìv¶Èí‹]Ç•ÃLZ–CÃñÍwmí¤ü0ÖÌw@Œ­^ÄÛ(­í¾Å¼ŸRUë¦v¾øƒ7ÒfýRì#ù¾¤·«ld‹â>ˆïc~ë "ýìNå“´/g µðÅ‚@:… ûxä[Ð6,ø¨,ÂA̶Gäu£¦¹¦• *Ø CHŸðZó@0ù4•Mí&™…–On£‘ß•E³ç”+G eÁ·WLHò(†Lt&n7^Õ âxß W1Ã's\e¤0ÅšŸBŠ$f¿ÏdF?·¦k‘êçá…/‰¥@Ñ¿†ZSÍÞ*¯¾$¼­Ý¼´ Mëñ38qÙe 7è°Â½“Ç„ ¥ªPYu÷PzŒä\G žíúÝC.À1‚ýy–ßK¢‹`G–±•ûEzÄú) Is•yƒUÿÞjA]{žWŠn¾ä¥K%µêºæ¿ÇìÑÃŒ<ÌïÇYNOÀ)w*ö®öŒ£]ÖÜÏ~ã²jUÀI=ÑZb ö϶”Í1X7"{w¯dÌ}¡¤úÙN¥嵇ÄÍáwQò)sA»jNç\ϰv¸v5¡²²äBÀ³DÇ#Ã~‰÷„L$£#¬ –üh²˜ræs|SåÊò­W‹Zµ©éƬ`ÇBÜ%ý ”Êøê¼WÁêßÙ*üIšŸ ³ŒC×7ðá•~ûbš§cƒ`:ý+¥:W~¬,«£E؃l@ȸ§úưEïÅËþÕ?9§xÿöŸWˆ>m(;¦&šæÔ^“ඤ­l¶šr,hÜKzH®[¸†NÎ%·F²?ovƒ%}?¦iKûæ¬Ï!»©F#§³d’?ä Ž¿d±çÝNU–Qýt­2¥siGFîpØQóÔ …q„Ò½;‚{3ìÅä=«Š­o•¿ ¢GIjœ F&2kýnBCUOµOS—|Ø>';,./ÛœgµŸJ¥ðk"´„¯¤Z` )\¶ò{ØFÊžñxÃã(º£Ü‘9+•zoÅ––(oDè\å|¡È1–|(tì@#Úí–¶™c~6c¥˜zŽ˜¹x·=’çƒØ.q¶¾iðàòª{¨‹ý…oaô¢ó¨ûn »'Eµ²4Pù~H¶ Ù@ÿòþG4’ÿfÝ©ô„îhÆu{F Oÿû/ç‰>Y-ì´ÅîøóÙÁ+=¾ÍÀˆ„ƒAk¨—5\*àRt ¨Ÿ¡€`>åõD@‡S«ÏVGчæR-ã•è*ûàMÏÉ éú/Ÿ8z`DÐ¥96YüUQa`x+³´ìÐì~†›I­?g b6*6–H±]µGyk n³”±÷1(±hÛ´NR^¥„;;O* …A2ô‘žå>w*jb¡X‡ˆ<0ýEÿN"èc)Š ‘¸~qº!‚÷!–€<6&H«Ñ'”1Ëõ r¢ª ,*ZQ¦7“n)]3s!£Œ7î©ô¯œ¾ pÞ.u>5¶å8úC[¼0hÒMK Ôß¾¸€vL¸ÝYy‹×Æâ—$Ú¥«C r ʤÛaV‡œXœñ›yÚë‚ò±¿×ò.˜Ñˆ xZ)Bc“(„¢×tQ¿lRÇ‘6Pg‹x{îløyÙú·»öhœú|ƒõ¥ŽÚ’S!…Ý ã×zÍ8ãq}ïÍC=ÍáF™Ò úŸ(&Eg‚⧃š8'¤<)1,Wu_œÃ²Ùd™È]cÚ^E™*/Éóg'8ÍÍ›Ž4³ÍЂ?+¸ƒEHä<–›€;h—ÓüCÄ€Žf¦òU|¿Éæµµª†»H¥÷?õLõfil†cZy¼úí+Ëäk¼æ(¿¹Áe,:hgz™>TŠ-ÓÔùÛ×L” ¹ÿ–8jô03…9Öq¹F‚šÌþY‹c]Ęƒ±uœ€Yä:ê(’y`)³d0á£Í È‘ ܺ˕{¾™x³øñFª€Ì¶Æ&B±š/pW¤«§¢ Êgö ÿ®õµNò€Ìˆ#\øÇ%‚˜ |3߬$Ý9M‚64cnaξœ$™ÄTPt„•- Rê·!Á›özÿô Üî~6úñ…l¹xmÎ=w%Œ{VPö·óLyˆß(CeÑAÿÛ„âö” í–׳½ô‰Ì:ñjÒñ K\žThuk·uЩe+´-—õEmøhUì̆½@;¶½Ÿˆ2ØÑV2)PãPÐî¦ ´ÊÎ4̬’¬‹ †`ccG–§n êÈÏ {ÙEN¨ÙÚ~ÂV^XæMnjs¬ïí½QPî—|z†oùåvÁLˆ…&ùäIýwHˆÜ}µÁcEí½:{ ünÍæ¡(YË9,Þlý¦ ÉhpN@^F9;D£žË8Öî‡7TáÇ3)̲9Ý(> É\wPÊ\õÇJÂ4÷.ýáôš½ñ–˜ÄX‚÷cC¹½pWêF¬ÀH?K}—Â=4€â 5”˜-ùJª¨®)ïá*-ùHÕ >» od"û H±¾êÈÁdBB-\Kœ¼ÑÊ’©'-äê]à; èãæê{º‘\Od!»€`®˜®ª1·ÝÆ­ˆ®Jó¯è5M•³É¯;ì(Hù"®¿à.AÏö‹ÌO µù<ågÌ„”g#Ćk> ugálû.Ôñ[Ì´«-PKqw©D«$FB´ƒ'eÌÉžt;„ *X×T*Ú . [ĸ÷¶AÝŸ—þÕ¸ÛúÎ`Éþ¹6€‰¹PáË©•EBTuî^ˆwî5lE•ǤÒ&öˆNlóùB ‘‡÷Æ©#ª¡ ØÚ~ÎTö$ üX+)åšKƒ·<ù¢‡„qæ×«2Ó·Ë@ÜþkîBT²ŒLu5#R (ZE¥bn ôw°l¾‹ 8[ÐèiEÑ[°s?@‹\mÕÒó’˪Jr`o¥°^¥úÂ~æ¥yzÂñš>ãGp ´.±ëL#5 tè² &i¡^\µøµ¡ׂ)-N¶.z]£><h ˜·SNM#íÇ64 3ƒ ©q ®Ozý„ˆ©/®Hø€w[ ‘T~½¶MCYD_õ^8³ãï+?»cÁ¹/Ðæ£ YÌ“Nâ®I³urú¯O1Š·ûܼH¶€ry`ý@”ïj5hÊ´8! ¯ “´BB‡Qg>fÖĦÞR§Œý@ÃÕ‹Çsã˜ôeò:›âÊnçPÒyjòJæM©è-SE]–ð]‚£×DŽø5›d‘ Â}‡œ÷ä³ï—o6͵jÅÊbÇx×z¡‰Vq=°&éïlwuš\ †àt&TÒDI¦-B´‚ àrâ¨. 9.kóë¡‚]!k½Qû)Æ'~‡Ü¾Ö ¼ÆƒsJt¦ö…DÛ5fòxÓ†Û&c' âÖ“1::¢Û“iå#N‰B˜h`g®fˆç¦YG¤¥¸g`&œ ±¾›ªäãÊ"g°–­ï;ÃÿîôÝV[X¾<&)¿êaŠv£éŽ‘@YPM&Ú Ç|ûe Ê—hÚ`$LçÈÆÆ)ßRš–A¿È’­&“eᆋøef‡ K·Jù‡Ý7©jw‘Lhʧ«š&’2ΤåTø¹k߈Û=p~¯­5s#n£©žPż¥ì#ý¿Ö¹÷™ž²Ir"ÛƒSâ±–®„ì¢3ÝT Ù¢bÃøLÐ  þ"øä<{Nõ˜è©€)$;Ón¾~©(°nvÝ‹ßa7Ì–†Y^'pÁ­€Ã° ïËÇ0³¿P²«ò@{Ÿ­¹x¼©$ l¹Ià9x⦅³àU-A¡)ôü£k/@á'-á[@¯[U!à6¯£3™qˆíÙi¼ŒÜ˜„Os?csjS©QO»Ñw¾æ¯C|RTm®Í%ó\ê€pc öøûºÓ‡vAQDÝ¥,6@®EÃBIËQ‘JËzÒòt˜z@l:;Ï5¶"{”ï .ÆÓàï\¸Tå”y6 )Â"T'•Ó²pdؕϤCÿMŸjNUN.ßud“ê½7f0cnx¾5÷Zh¤Çí²c·ã+SÍF ú³VÊV[)Dáeû<‰Ìœ@…(ñÙ7PŽÚôã2~e‡²“ù$œà-´@æûNµ¾ 6‘‹’ªíkí1bam"ÃW<øÔ ˆ ‘0r’²Rˆ­.„"§?í G¾@lñòÈ2Qœ×݆U~ŒI1·Ù–˜Ø|(xÛÍÆ5ÄëŸ\¼4NañâóN ; ‘ (SÀ C¼V†a•Ì-ŽDÙoá©°$é»§Ÿ*·)ëO¹Ä.ÿòP Ãâ÷Z¡êY¶$ÔÈóü†!ÝùûOvô&1‚밙˰Ú?{:\‚¢ ¸[Û´½Z±ú²…%T~CBÆ2§¥o—Óî¼J¤ïéÈ%Æ Aë#ùrÛyŠÏ;ê½ÕY~\PO·©háW=fÃ} .«Ff4¹Ì`à^øp³ ¦Ñ£ægߤÄJë\RšˆåÙ>õffÑk¼K¾½£wØ[à:¨|šXÂ©ÕØêa›¯8ât¤Öötåÿ‚± ÏÎ(Åö8ÿ->`ñž¡ç€Ë>ʉ‚^¥ÐTÍø¤×hwo¯;|èj»ÆgMúÛ1Ø~7ñÏ[m†›Q9ŽÞ:Àyd¡å:’H dfÈRö¤R äçò·aªtnöŸgÇÈ÷äs$‰î½ö2+ja{7•øž[Ö Ü‰ùKt0Äb”v âAØï}ÞÌö¥T&¼-ž—YiªÌ¦ô†÷ñ:2”Ãírœ]ñrtÂÇQ«TDzÍÒ¬†Vc‘{¼j=å•gà'÷äËû:ñ¦®`Ürn'A¢=G™Íÿ–Û3_)Mùz^0s°¾—m¨ ¥ ØV•tÉçØIJßý°ñͲNÂ=ïŸYƒUD¦tõõËѨ¥pŸ‚½±s‚UYõ¶<¼)V]ŽÈâ± ü®z¦+.3Q™\`¬uf¡n`ÓÁ6d½â|-7U*' ^‘ê#GCż¤üïþ‘³ðÙ5VƒAÝ5êÛZ=“póà'°ÍÙyÎNÌ3A¾jnÖ ZÞàVö¢o\8ëÌ­vô7IÆl ?=³Žžõ4,R4½‰¹ŠÆs5uÆ*Þq¤îÆ%‡® Ÿ;A´x<öZzëWÇÎ3x$«8V ±_½ú}[Å» • }ðçÕ º´qÅV dvï~]÷^ ¹^œP|òypâ‹ñÖóÒÍ×Uä\æZçcAŠä¾è oWòýeuF•~Þ/r!š½g¸UÂXµ¢ ñÐ Ê ¾î͆¼œ»Šc3¸8˜Ç¾xŸh¦x”óö+þ© ¯©å—zçNbB±€n/9QJæqxq‹_ªåVBZ‰ÝScj†´>N("“îÕÆË¡[ëS®¼™“„Çkë;äáE“…±º‚ð_¡½iÊ!§¤ëD[:d*$"»Ø8xÏÒÎñȘY‚ÝÖ.ÏF?&* ½ÝÙ `(M}G¯Q¥SBVô’…ªBð‘€}Ôz(J^€ 3œjT4m¬ÚJ¦W^’sžNÏu0«Ž˜„å8¸¶ŸUŽÓKÂÛn™·žÞ¾ô}ZÒ¬ßÆ?a€„ªù¨ç@”–ríùÜÒ„‚‹þÓÀÛÕV?IsC$ 2ßxzk–лo×gÖîK™ÇØ#×Ï ŠfzÁG· êI%:»MŒfB•³:–|Õö1³KKÀõ_Õ Ãó ÒÑ_ ¸´5i“Õtí½L÷ýú&{4d6ºŸ»ú<.ÏQÕ²®¾ÐàÿÂʪuÃ?cë£ì\§üA¬)ˆœ49#Z·J”ÿf—0Âôî±BíÛÊ=2Ûj.ÇéIzFbßáyhÚº„Vá}™L[hŠàcó­ã¡ô},X!Ò@8L¥qŒQß•m{5󯇡ŸÊô-zùعylKIr”³’ÊÝfUk‡Öêú,š:™¾l£'[bò€z AC€W_éU“½d^ »ÍÍûä°frˆ„˜ª`yKõÌê4fN[žú¡:ÔÆÅ¨¯~U>O»ÞÊói‘ B÷6s?ÊÓ¢(µI ôv:6©›üñÜé´½°ðj!Š|²^¡}»±¿ªïhqšRæ3JѦ¬¹‘iWéô‹Ï$eBSÌçÄ¿(·Ÿ wæ Æ™•´©êË_ºËïÛµ ÊëÀZV:¼ ÷œÔ&,m )BsèTßàY$e,«Ù±ù™•#žÔùD@Þ vØâGZ’._#|µÞ¢…Ry¶ô˜ÀöPåóÖV¾[ÝÄ¢tåOpYò‡$’2 ÒÖêÌÊ5ZN{Qò"gÉZ PÏYPP‘¢FŽ&=»:ˆ´b'|1¼[µ%6;Éá‘Þ¡k(à¼ü¨ ŠÜ/«h",t—/XO†' …5©v†VÓ³§‚ ‰Ë›Šî]@¡øôÉ@èêÕˆÒF!‚Z+ÑVÖsŠÝY“ú1-ý$¡Åaì°æb ß"{]8Ô·b dô%çµË~=ÊLýÝù4äÌßóýND>8##pbE·~«ü9Þ2¾ÑAw&·.q«˜òòï.p&Ê+~îÀÿQ>Y³ö Äí_öf½‰¾>2ºÆxÍ dŽ.âƒuЖÃ+4ŠM$)JÉE^ä‡ ntÜc èüǸCvÈWÌ@£ÙÃJ§ý(L\Db„ -=00C¨OǵiI±*&S3¬¤õŸÿÏ«ÅÁh/°Ò”®3¯\ÿýL¾ò­„t=À9  Äx*ÆSã“ç•ÐÅò¡ŽAuÕàW.í±J4ß:)§”ñ+à9^ü„Ö±AÃožSé·W§2Ž­ä¡DĹՒaS6vn<ĵŠ&9¶¿A½Ù9ñ1R—(OÌ›é33þàĸÁ,¦†çòÅ—ßLò!‚ÄÆKcÂ|îÚЈÜKµ+Ì™§qeíÒß¾B„%/üTK¾Å~9Á úfrÖªã2ì›cú~%er?BkU¦à3pnã%Æà¬QxuoÁHº¼ä¬L¬}ôft•ùÂ¥"u¹®ƒT¼vsc¶q²0(å‘¶¸‚‹6OcŸbÞö1ëcX’‡Í«DÉ>…dƒ[À²ã]æ`­áG9Ü ö+–•0bÇyZ2x*SˆÜ5t+|˜XeZû÷X™Væ¾åÆ›•2ϴФ|€Tiã,XnÃh¢"Í B,9Å@öªš¡RÚÍù¸-;x EÎT¹KÅÐì·—‰tNd%̱ª5/MAý9ÆÌc­hǧþF` ½<—ÇæùJ­:ļ¥Ò£-±¨ûè\QP(‘@= Ùœ‰Òc|æù{PÝRl·–V{6lÓÈRˆRº(K:ž•¬€/Ç·A~ ±o<£@&S.ߨüp¢¼ú¾³š|6K6~%…ǹèe&õKÆsãŽìŠä{è%¨ M)*,ö]rNÿ ¸ëúôŽxPz v ¾ÑL8ÔÎöQe¡ÍÇ%Bë:¼á%Cæ…äSêʶþû ›nÁTÛœƒËzãUZÒ8(áÿŽr>y_~å75ëÅúa¸ô_«h7Üúí±´‡È§›ã–xÈQW•ÞúYj"ñþùŸ°‡3o"U‘Wî‰êú"´ÛQ»Ù ÿ›bbÏŠVÆ~Ò܃7Þ,ü5íÍï DèZq!2T· } ×£Ò¥cîø ‘íj–)j«⌅¯)A'Ë_ àÂQÏPhZTïT0ñµVÆ,êOè²ë#ÛÛi­ˆgÄ=>ü&‡ª@7bÈÅZ0Kõ}èlÓ.íéáRÜ´_‹”¹‹¢D)— l¹´žÀöÐ-d`£tXtTðjÇîhq§Š¤é~e ŽOì‹¡f‰˜VÕŠÔÒá#"²ÿîuûè€f:ø§ð«´þ‚à‡]„'tƒ.Y m0]gX£úê)7Qzõá%±­w[+ R!QÓWÝ–@tµÛm'ÍG#Ìz–³!Š,Å‘[«õç'üp.¢<³“û™*r«ùéÕ!() aK/o,hº…˜:÷ ´¢©s‰š=A<ŸØÙ \O¸Ò*h¥wHi¥öW]‚AÆkþЯYøá{TÞä¤95üH±Ülù!fažÔkÕw~Ë÷lfû›¸D7ö-•”ºI³uþ-`Eœ˜A/¢™å‰Fû»º8ZÂÒ‚(e‹“¬0Ãä8Aç˜7;iì/W"í\ŸM›– v潤¹ ú=z¨+üiGOüýع׷ŽC7æÜ³ÙóÌû¦‹h‘ Äüí Yœ»çÖ–òÌÀ7N—äc #ºÙkxÅ…‘SÞÇxšÆmv]µ(YHJè2©o{ÙêªM¼ýñ„M5Mi y•¢|.·T‰hX/Rä›tž‰ú5eYg¹„‰&(BÇmá%bw§™cÎÂÜ]‘„x›éó W¢B™~ø‚À°êŸ¥Ü Ó@Á¿¾þÁñè‚Ø·m¨ÀçîJÍs:éeŽúÃ[ñiÒ{¾ Þƒ¦ÏŽ«ÂÔö ¬™Båµ|?å™…Rm>Ävç½ „ÉòŒÁÕÅ Pmåãreãí:=V€ÚCõžÃïæ„²8o¬´Ê1é‹9’« óë1ºW\Œµ€=›PgÇÖm&Bœ}*VÇuM)f¡‹ôU‡DŒR£¿äô¡.% W)7 NÑŽ¡âF“ LGWîQA ,!Úž}¼ñìéѹTke"Ö¹ÔSþ¯è ÞÍ.ùÜü¯<\#Ùvøøš=Þ²C¹úbÓ$è«Yžâ°â&>…õËw nÄjšyÉzù¿²ï"Ì‹è!ž®°}Ò…Ô{f\L½¥?qòRàãù¡5F¼ª‘‹èpZ€1µ[…´‚b´Hõ¸÷Ý}Êd¢“OzÛl´Ú?? ;¼|Nˆ@²ÕþÃnCõ˜¬K‹›mXÌÿ2emS=¼N¦éÄžËmÜ·º}ÀÑûÆ`aåj¾ M(¸p»ïÏÌÚìØuÛ• Å êùZe«Vˆì7£Uª"ÎZB'.Â,$‚ôMÃ"~w3‹´Ë¯ÁyÅï N]•‰Þâ¸&$RdÒjËÁÿÝ´RÀ©2¯úœñ”Åœ[…]nõÒV­¦ŽÚx­Ó_Ñç#kOÆ_>É7PhjÝÔ¡µÇ÷”vrF/‘þlĿѣGÖ³_õ1°Ë8’N6îš®SîRC±lBÙ—ä” R7v 8V„»Ã¥½f?™ *µYÀ’ÖŽˆ“Ž~#¬[1–öˆgÛ”7¨>'m¥¿Ì¬¹²-¶jE\i£ðmëU… ê:-¡On º$¢Žüs?l†ù½†,õ]%“ƒdTíG‚„€YǼAÚFËìÍæbÄb~8î6m0¿·å ¡z£Wðôc"ýˆE‘¿×åè'˜Ý÷œ\†½>_q”ð5?æyÿÝ-Ž>JŽJþBµ “í–„œ"ã¼ðW ‡´º¬HçvÐ&K“6.žNpˆ‡{šÞ3÷J µ½3ª@¯;æ`“ñlШQxÛ‡ÎòÄ`-–|z.jx1ƒ^Âo{õ«-mú7Ûaž«tš^^¿q_Kï™K)ÜØ’<óÅ"‰Ðd¾DÞ"šì\ÌÿAÖL›5lé C–©”aù:_WŸ·. ÐýÑJiJV©“iDÖæøãp m¤«À ˆé]zùFió æú.yW”Ïûú9;–¬‚©6);èê¤'Ã<)Òü&ÎánÇ&Eëx›, «®C«°ƒío*An¢à?ˆ‘¼;™ ÕQú¾¬›°™‰òÜÒÖaÂÓ?¨*ZNñÓQlGþjºž>ïYD¬Áp•œcK „™¿±ãã£=èx@^@’Ëö+† ãY0Ò$‘õÆÍ¬$Ÿzjÿ£V­ÁvèùS†ˆøÄ-!z›y b‰O[ýA‚5Ôpj­2¼;A„¯™wãéŸÎ¯Æ¹zEˆz‰álýaSË|Ä…cqœÞñaR:ñV4¬Þ°éÄPg1ŠG¦ó@-M‡É¢¢ò0dò7«Û¢×ˆ*È ÉjöÕwZŽ©6œ²\§™f³ªe$x¼DÝWë!ûÏ6#¿Åܲ½ñ&ÆÖÄ…2`Tƒ54æÕ vÅ`ìR%íYî~=:Øao ŒÍ°"‰Æ¥HŒ§Î]Òu‰Ï*’\DVp<Ÿ_8±éµ™…³¸6r†™Ž {*Ã=‰òiŽÔFÿDD¢@^¶¤çáÐAðê™Gþ¼.oëA¯™œàëY·Ùó°;Ûë~³Ù ö‰ø*Z­ÁyûÇÛ]®Š×(§² ÔÙ¿Ö…&ù:Òí$À×Q©bÔY°³›v0[d¸lIçMólÃ{â#OcØùV d¡IŠxy$3¦Áô['EˆÐ0qÖ˜âVÒ<‹%àka &…8U›í‹®b–TZS1 ·¼ˆ<ö1}Æm•)>.32òäM¬­;àæ6êàaÃ\Â6éëí³×ðИ³ºjšÅsÝ*Mð¾Eæˆï‘7uW(Ø€ª-x,6)¢lmØ9Âæú žä¬;$ú·è[Eð*òÚ0êoxÉ’%–ñh99»›¿¿øÌ¡Ê{«móâÇØÌÓÂ4ÇpâjjÛ»M%6ʼ)O$Òüf‰e~™‡…š$ÁÛ^a#w¾R¥‘džÔ¬R&U«€ iíÆœ²cËD7=3svˆ0‹ÖÄÈdœ4Ï;è< W ,„Û…œ]3Óð ôõ<šåK4ÉZ#•˜(Ƽøi?‚XX)à%` áO/HÒµp]ß¿^Åè~=¼âž~‚Y{“ED-Nן¿AÑÏ7*ra‡ÑN—ºt›ä˜ p®:ÓMt›tÜ!kù ç»äùdÂ7%ÂçÙ{'ü…¼·ÝŸœÚ¿zgF…zÜg&ö5á\Lkä/•8b)‚Ë@Güúñä[z¸ÇÓϧÿ?`uÛ_,HÈ\£ŽaL@~í¿N¬Seúßú|Ô2ÒýôUØóƒï“Ù¼»ŸÜІ>˜nòë¡Z¨{•~ñƒ!è or@‰Æ_v?<ý%¼ú^Ãz®X›ä<„Š]ÊTsºÅ:}E›WAµ\ü£)G¦ŒòžÈe'õûôžeŽŠ‡g RÐB´¥u–X«ÁIÚsÎrÛz™äBÉ[¶l-zªŒ²Q'^¡Uð鈴uŽîjG~«Fé!Ñ‘¤}¯žùŒ ²ÕÆ|pP”M²P4æ‰P…› WÇ“ß RžN1FFÍñN‚› USb³T¯•§3I[ý†p™{EžÔ®Ã£áØŒÃÃ⣃·ƒÖñ¿¤L 1ñ\¿ñ‡{{”Á‰Ï·q íeŽ•’/1ƒR_™0 E.Ð7JVU¿ŽfTñkxºó€ô¨úz!¼@÷OJöå³#ÆÏ_?ÅfÍÿ÷!<=üEÍw)WO/ÁÒ¿ÜG \Q•ê‰ÿ» VŠ÷èZ3mkb‚ùØ/Šc V35$ÕõM=¥/Šo ì욟“r)“ŠGr¥NJö½Ÿ¼øÔ€’4\50È.?LfTÝý¢”‹Њ°¿¸:)½ÐÀˆ­#éSG¯¼'0MgÚ­^-Ž)íÄй´¤®šc^A¾:"Rt<ù_¾;mÆò=PýèBa' ò8ôŽH\¬„°Æ9DªgÃér´<èÜöMõ:!®»c’ 0;‹D¼\8\@à÷6O'°1v¦1 ¦1LòKÑÓ@ëQ_U?ô‚)BAÖI/b;%6L‘´º¹Fe?¬°<;h‰‰òä®Gœ´ï"vªgà˜M5•x¿I$ic>Wª©Dߥeb U6'b*)‚R¢s Ñ<N¼ƒ×*¦í3À=50þ'_: fFRn‰/µžÛzúg„:+øMöÉ*i@±SjÃT'ºÍT Ž*d4¢U§µ@&<$ +u¨þ\@$¾Ô˜Üb0" ¢-X\ö(l­Ò÷œQ#L7B’E=ËǾ<7ƒˆ»J¿ÍœÐ{«E7G‘v|‹Ìi›V!úö­|°¦²*)ç('’Ѹ(Ìm?ˆJIׯ×ù*8åH¶*Ô§Hx^PäFè[£D0QÏj3™t¹æ»y«7}€³"b†*N p^uÄcœ´ggÿÁ# K ÃÖÌJ áoÅ‘@4»=À‹œW€–í½XK4ö;Z…¦¨[ßCº^ š-ýŸ´™Hã¤OÉW¼gu—Ô’Áìûù¾œncªØÜ²U\8íO§ è±'V"²óFUò.†BnÊk®ï8i[>ªªý' ^´Í -çfv‰2gžÞÅâÝÀ-ñ3”¦oS£ˆÏ¤£‘¡-Ú8oP¤=!ѯ1{R:à‹8Ñ`Y°Ó!ãµDÚ*O«7ûÛ° H…Èc=•ŸQ.q.±2´A÷½ÝH*J «¬Mè<ʺ‡¹˜öP½‚Ñÿsâј±Fî•g›8O}OYKb £¦™0\PBÛ f„‚³vì?EW‚9NÉψEMËÒvÛÀ<á=Ç0~‚ Í”A/Ïø‡’ß¹/Š„ÚyÂeñ·ý¿Uài„“q£®°ŸÚESùqí¾¿HN}¼äøÔá/¥1}¨ ªØ³ˆçN ËBµGp¯b ñ:Œå)ï–•ò ¢‹ö‹)ÆØvâ&¢Þ½G_T cB %ÿŒ0D"nQûLVÈ ƒ-MÚÚòÏÆþˆ=v"ˆàà7ÁY`¥l4ÆJým\U"~á[/pê¥L»—|]oá×d ÎN„˜HèNþ"WŸÉW3Åô`ÏQaiýfH¹2{ÊÂoÇæ^j’lªèí“ØõîÙ¿˜ºàŒØÅà^¦kekÜšÐ9ºÈÈWV°¸|Q0ý ùêc6ÙÁê ÚïUÀfþHއhö–~¼>~NJ—2x6»%÷„}è&Ü5žì‘!%ÀÈ*_€H3ßô§Óg¨F>µy/ذ•ÖÕîofäô†ç‘*ËB­>¹ªvK ½;ÏNX¼¤O|³ nÐ(|w+KR‰Ž ÔÈk5_D®»úàÝHxr?ˆŠ+Å„Î\ÏÎ46'/4)˜G߉%ñSyé¢m@“M¢(6$YKî6í¢•‘GÜa uŠžùˆ¤jÿ¼&u5¼)îSÂR±q·¦&nÒÁS•aÖ%€rÅ%WNh¹Cu*q2"ÖÚMšß½Wîw­Êµ¦:º3É (Ns7«9wp-™kKfqm%…q‚À%@Mg¨¯·G]OöÒJhîú]ú^é¼ßùi{V°Ž>ÀàÇ/ŒàÇê“ÔmDçºçôÝõ~´ñ¯tsÔ³ðË+&¯»Ù-‘, icDXdnýtVL&ù®˜WÎBàdE¸JE°Úù~Z¼‚Ÿ#‘ a)É]ƒÚcnÕîÿ³Ý¾YW§Œ…8?yyÖj=z2S^½Ÿ:Ñs ¦¹+ãQM)ѬsƒY&ßuÅ#û,|sjRp'uÑçþÎuqGÁ“J¹^NÂi™ç[µp.Ëï@#§GÖ N1ýëFŸ íêð34ôeú±@Q_ÍL¥yŽÉ¥ <½Ô…î@É‘¬µëÆ4ÇÚÎØfr¬j±@ÚËŸy¸Y' ÈZ0!½†´p&ˆ£`÷an¥r#[€è &* ÚmInhïUz0 â"PéŽçÜŸJÏ.~±Ó¥Á7@Ë B1¶e¨ÁMÓöv¤  áJ™ËÉ»ï¼CIíŠe¯4¬–9 7nÓÊ\T|&·ŒÌ‘o|FÖÍõîâ¿)h oURH »ìÉn$O5¦\ɲÍ’ wýƒetrú}bVÏt¤S”µjç¸æÓåôa“[íB¨Ru\Hñâxý¬{,B(Þšú}´mÎ$;·´,®çWVPŒ™[¢ìë”WúTöPêç€ãÿ£ˆ•ñ¨ŠÃ ÛîõµÄ'F/ÖŽÂÎø[Ì‹<÷cõyým‘Cô‚4h,¹}sTÌÜ"¬ÌEþ„ Ó‡»ðgxìÀƒXU3#ûpîçÅ‚*ašVèÎÔ'±0Ré TÒ ²öÊ÷ƒÕµ¦q÷0ø2샼š¬;mZoüá­]o$9àŠÑ¦Å÷Hr&q_G~y#iœ5ᦋµ>õWH$ö¬—(Äj ¹>åÿþûG$GáEÚ‘%¿xŽu”™|ƒÍîñI³€çf÷gbÊÜ/W·ê"§u9œUÂÏ áž¼Lµ¯S· øâZ¢ž(ƒÙ+É€DŸh’—*š"$þ¡C%±ÞhžtétoƇõŽ€»ÍlS7íµ"¦åXòUT cÁLðÆ†¾ñ¼|5* Œ­yª“â? mþ)þ€A8Î=yÆFL’ñü’³ïp‹yamûÕú¸àCÎýÕ€îØÔÑfn/bä;€«¤ˆ`ù-ø3|¨ÏÐ0¿ø³u¡:hü]{`éTˆ—ˆbb§v©¼(\Ý´Ï-ýÚ<øI¥šû¯­ãËÃ+tÓÿ[-Ÿ‘v=M‚a†z>±±ÜùÀE¤\§nŠÃ§>~ ö÷)çºb,€¿{XËÈæ2V¤ÐU})R\nŸî¼zãªCÙ£®Ñêõ³‹¿ 81'‚ŒôvØúwŽ…Boÿ°qFÇ`IO§ |Î7öyìÿªþ]Üíí!¹…TÔðX;ÈJ¸XÒ ª‡t~ŽŸ<¿bJMcÞ¯³íÙeªAf\§3ù‰‹ó-¿Œ³ÏeL‹·åÓùÂ+ådüômáKk‰%\ûÅQ>ZfS¼Qm4ÞÉøøeI¿_ŠWZš€!b¬¨ñíñuÙÀZè?]’híOö %” R§´áÛyùƒgZœHëp)ËJ#ÔjŠ£=~»:>‚˜˜¶R`lÆ~÷Ý(8bƒW»xˆšvW¥Þ*Ú–®n¥ƒ{Úƒ4eW³lÜâ«lîû®¦‡ïùeéݯØÙY“nÖóIp#A9ðè;Â÷ئ¤.û&$± ¾Èé nÅ¥55B8Kóláæ›ý’³ûgÄø0Ùp´-þ|Šú½õFˆØEô4$_ç€*fß\ê´l®XçCâg4lâö¬%qéæ1×%4ÿ|&YÕ É*¼…rT¦fxjUz´à!0E¢÷´ÕÀ"œhš%H9gÉ$±v¦“Ã8Íy„“CÀVÍqe¾ßÜa%ãIúj”nw>ŒÌmÊZØÇ /aݾí7ÀŸë.úŽ|æ¤GÞÁ_>"kË•½ÃgøÂõÊlcÚ¬è2Ä‚sl󾔞ûƒ–ú+Žwuë/Ò0Lí«œ#Ïp2 Ã=•9?[WOK#;¦Õ*åÊt¤]vËfÏAÓlÆ‹‹—M× LIÞ0à'<PÛ‘6Ö³iåæD<äAž/$:ѧnÌÊT²‡÷”¸€ ׺/ÌÎA0üæ É$ëĨ‘ØÓ|w­0²ÃÒD ~ëU²^xÐ&q±1b}Bó90N)狱ç/qöZôŸ¼m…v^F8³VNj!Ùœ/ªí¢æ6±ËŠõ• bSÄõsž›ŸF½å¸L®*êyBŽ’6°(ÅnT¨¿ÅšÈ/2g¾ª¼kh°¿ñ ‘ƒEÕ˜HM5è&*aZä9Ô<<:kdée-ò/Úèfìuwé;½·Á”vF¶00g³reRÜÐÊÊ¿Aú×aaøßPÞLg¶µ$#vQWâ_J…#.? ë)Ä“¾äƒÉk⿦YO§ùs5#ïÉ5㪀˜Ðêƒï«÷П'L3£¼÷:oÙaö’@êLˆk#üï‹X—–„-AÏ\íûí;Wüº¹ ¥§ˆkÿKj&œfò´h)?çI ©{­,Ý‚"Ä~m€6èwàVÌàdFHl‹4ö{NZ„¿¹ÿ™ïùï\œ±0²¡øi_|’¬Ü“ågÊWKú<‡ªCÉ/VH}ó'áÁŠoGOÓY fÄnŽH_q¯„Xf6´ F$ཱིh> ¾4¢¡#Þ`}…ãi– Ç:ÂïjÃЮõÇ÷!Çç{˜zÅÕç‚`mêlƒPu0“ïðc/ÛAû™þ›€%š™zópÓ\*÷rA„Zãºfçej4e”mN‚Où‘nòÖ,C!~xˆxjù¶¦æòöT½p#|ŒÿíãSnšÄ:R2²*ç6ºórö“ FÝæ‚~¤—TØ~®ž©3+ &‚ôÇZéiUÞ zo¤‡÷ŽÊÙK]jT˜sœu…ã Õü}oT޳ò' -áË(ªÍ{y½µ‘Î_|-Ü›?Á³âCnŸݯšÐ6ΰ`Žþ UËÞß”7iŽ}Ȧ»á„÷1ÑäüÃÏ[²ã ~™+Ï3f $.t:{$|'-œi¡áCªD:fñ\¹FÐn¤E±1[Äûô8Tˆô@u>þDðÓù–›³¾NJzX’ði¹kJ›7ÞŒîÿï`s·ÉOÆ„v/îûÓ%ú"¤F›z¼N¶I<³ìîNt9 ¯QET>¥“¿¡mßÈ£ âAÅ ÑYü„­âoP{‘B.g A©ˆ8>£oþ§·³ª”ζw¾¬j+Ó'±¤ëÝÎÉ^ä€Ü|“ÆèeÆ^ƒG´¤z3eÁj²1xjÀ4¬U~u¨m¬OJä{;Y±âõ5ËÆ“bÍ8a0T¤ÌyÍAì[F‚“ æ®(½¯áé°'-›&y¹,•Š„ÒUg”XPPPü†H"¬(†žÚ‰¤Â4û•"â²_e eá›QD"êæ!ëë;Ë)L‹Ñ¤7¿Rz&mÏÉjЧâH¿^Uлi­4–y¦ßf]½fIèò\-³RF/gÞ×oÒâœøêE¢0§Y1Àâ,4+´:[š7Û©¨ðFùç._–`oŒqœ.{Z—ÈøJíö‡[%‰S‡m‰øœLt9a´Xâü¼’MqKÔ0, ¯w}B“Š(¥áx]“†»™¼E]gÚt‰HŽÛˆ ®r,üIq¶ŽgÌ‚x—í¦„Y *&*|WX¢»Ù|›¬£ÌC•ÏÏ·;`¦q7D¢:õF8'§°‘OVZ°´Š ?í‚?¹«©ôp5×ÍöÈ)j[5™[Mv®ÏãÄ_LÐy8²1Üúâ…Ì-çt`^ÖMËQ€+&ìz'èÛ²^Ì^I ÷G^„xa Lëâ~ól€w7¨ÀÊqË”¹ôÎòÏf~ba€¨>ñ5¼Nac¤« CkümØßvvæ8ê}Õ%¬‚ëÃL«ÐLâ<èÞ^Yóó)(32ýÑ&=J¸‹TÄ¢Qõ ‹@?õýpسš'+Ù)Å«uÔ r\û{úañÝZ^–àæÂ‚ãögÏUƒg°ŒØ4⢢gWU¢'Zªì@©0¹»jŘe.ÉB}Lû÷¥–MN7EÐuDZC$wÔ¬¾ˆW!›HëÏftÏ®ÚzÈæ.ŸÁej8»w!OIÍ<ÞCîÄ‹ P{÷â AE¼%™!\ +»Qt˜xCŽ4”0L®ª˜ewVÄûzØh*/<¶C÷xlà™yUy³½‹ 2ð|5Óåõ¯гä£'eåû¬v‰Çü¿31£($lÔÆÀ¿DCž÷{ œ£Çy$;¤úÖªÂ9q™e…˜¿M=l‹r8)ˆï7VÉBÐÈ;<÷±;´ä ´—‡h¹hwþùúC½'8RÒ|TÞ|è 2ªà7%¡M&KÕØ—Õ¢ž®ÏL•oYÑtXb’V”æ¡õK½µ úB¢k0Ž{V¾úA·i)6sÀÙw–gCï’Ð>º¤¼æ¾Å7ÄQÄø b¶2Ÿâß^Úx¨ö_YN¶0Mý®·Ñ ô投þ¶úý!Ë2ž¹¬Ø±1«J÷}i$œ* rÜJRì°e\b¦?g ÔpK"j›(ÍÂGªÜX*65“áûNØÇþH¦²P©àŸÓÒ‚=º‹b>°cXSïÌÃGšÑ_­f¼m ®Mýä±¾!¦Q¦fÑ(ð’~,³T@uòYšü-yµŒøóƒ Ì|)^†åH€4ðÿ>ðÏ/;N4àÕáyÿµ’iÏêxRVP¢ª5o†>Xâ½½O*n;ñ –ª7Hšƒ7Qiq±Ý»~N ºP9tá:ìÙ'!¾÷YXî]êªÆ‡§bS{‹áWa®{]ˆÎßµ}dXáë>·Èøt &œCõŒ†Òy|hþ@Z—J¥­èÊ‘bÇóìaƒ2i˜Q'ÖA²U&ΗK¯—-Õ‡‘{É>Zi”†ÿLw¶¢B!»{¿†»ïN¥U™%Jl¸Á¥ 1'"á™`Ëv3Ç ?GÀif¥å÷éÙûg-ƒÅ”Z$ñKRV MYí¹ .pùã ‡ y»¢B±ÿ;ⱻz¬š7Ãf^çtèZSDñ¹½2"ìF«vHoNcVÆÅô¾ÒCÝÄkFȹ ”°'=²²aá!ŠÜæ»DË¢xâ›AÂ]76ëe/oRÃÍ_“}L¡Œ¥ây_å–½ÂÜ)ÑïÎ<7#+Æ€í0¥Šxè{m%³d7Ü í­±ÀBm`­º‚­´vŸý¿)¾xAÔôÕĽ\w0Òiœ§qU©áËÅöà59p•ò¡¤—àŒ`{ÿwe{äÑI’ÿåÁàÈXÂ8_AJTƒÎ•ÈÒ( 阪j7>²ªbe—ÿ<4ùʧ´tXN"ÒQU–¤bPÎÕÄôáÖt‹Ù_®ˆ)&—ËÓG  7]øó.Ó;¤g5 ¯Ülþ\\Ûz¡ j÷Xæq+H&mt:ûÓ=*ÌÙw[)à,:@KDT/‹JÄÚ”a& W¢ #ÈzÍL‡yʘ9Çz‡e áC•‡×!LÌNM² &‚ùëxÙrå:ÿÂÊgOßÖId®Ô9Ây¹ ±`ÆUÉíé2™¿EÙöFŠ?§n¾;ÀÜ¢y›L<ÐÿðÑtR¤| “PÆIÏÑÇ5îofmù9ªVylMá0òÅ[ýNêÿ¿nøV•Ù„"Í@rPèû1‹°åƒØVšhÃS;›šËþê÷•ïš5Á´€X›Û¼UB±~³1—µ›ãNÄ5²¬¦‘þ¿Û#/ÝWþˆv‹¤yÒH—€ÚcWò1˜È1S—Ï¥·G*Ž=qQrÛ€1we€ÖÒwH´»ór›éXij@áé†u€H¸ø-zY•œ%¥_%Õ¬_JìÎaš z3~ÉÑ˽¦[%BŠÞrèž•‚BÖ–¶ÕÂkè^G½Wºm§ó÷:Oï‰ÍøU¼â‚Rá9+Ô§¤Q­4:®ÂuŸ41+ƒ@zÌsŽ¿·¨úºï’¦LØœVbŠàNù¡`t=³S{Êæà]•Ñ©;¾T},[3©€˜òbil×σӰþ¯92QÍ®5düƒJ²”‰—q'÷ÊxèH6˜ðQb`ÄiŒ°¿÷¦šÕæð}±>üØ$ýs-î¡Ù´µò %Ù\$µ…òTäª7 ¦£è/6ér‹|O÷úÊ.WtG?1Sƒa+}‘{ÙNtŠ•ñ¬ ÈRxç,Õ*#ŸÜ #P l‰ïÊÒzß1Sظ[ëtÎ#OØîCã2Ë#xî›}.¼7läJ g˜ èãžÀ0AïÂ+‚µ T6#Xñµí;Ù Äßy:k6Süó¸1½§165>ë=é½Bbœô‡’~Þ‰®|¯D,SH„o½üÅÖA3óˆbáÙ³dW·é¤èJ3¿°iŠÙ$ÈÔ£ó x„Ø­—¼¦…Mª\¤?,Ø}ô£Æìº›ãEâ¡ËÁ[µïi»^¥ð3¤Œ#`}å=[Q‰y0ª¬ÚAˆ8ÍðºÆ@ÁD·Ø¯óy›O Cƒ5Ùì—§å%­óÜT°ø'Áô|eã@²ž†­R³æ/òš¼7x7&¿)…êè–ùóPƒOÁ†¦Èy/ü¹+U?+ÃŽ"¢B׉†¹`L¼½Þ˜·h×Zòr¨úOMhíB' lv7j"Òwí<@Í“cÛ„åÝ›I9¡®cJŒ/(!”µ²Î+0o˜Œ!ÃÊJö½tEÉŠTnŠn%‡Kz ¥o+ÎÏ%Ôȇ¨rSqø9îßV"ŸLIyUt$J àÉèþ9¶"6–€Ú,Ÿu~„ÆÉ?#©•áæO™)>)å¹Á—Ãîÿ®¶8v)'¯ÓŒ›ˆÄž|›GW¬AVµ´ËÝe‚„^ÑëhX“8ÀäÄl€3;jI3Â%æb‹¶±n!eö//î^÷•="UÏb´m ©_î0þQÄ>VáWg\øWèváHp1VÙÕpu§e$pj7¬E6(wéðdDINîN$lìׯðtš»Õ¤ûM“LÀ‘?)´ô¹$a_¹áìL{ [–:µlF âÁ“ _ìGЋîë+Çáï÷uÈEréFB}=¿' Z3_ø`;¾»a-IÌ®L®ÝTœŠ¯,L×j'o²e®¿¡r¾ɼv#²³Å~ãÜM¥epbJž'͇–•À¿èÜÆ¯óp Å㸬΀â+jî/-ñOž±;GºÞcÈÎùî ø(+l®·ï~¡›Ô«ßõ–~cÍëy{ ”x>VÃ~4µ5. åíNÈ©;àPf&óºÃ:ìþ*/.ï«Ïwÿ>AìúŽ_¦dJݨ.rË2‘ìrë}«AÝFßjü£ hßß4YžoqÏ9NÝìŽ\¼ZÊC†‰”ËÕ]œ³°­fycôМ«4ÿ±Ù9Wµ&Ê_V(ÆP\ zš3h©æÔk—(Pr¼¡+h`õ[õÝáÏ_@·{ª-x ZéøWÆmöGM˜ŠäK]¸»¯Zz¤mÚªz«‡°ÚÝ#õä$|9t'$@&Þ®ô¦IöÎî–FByëYn™vm­êã£-þnuüoÓÃ~õžGÊ¥ |¨Û¯âõqïb‘2Ûw'ýA’ß§†ªñx”Ô‚’$¨ro8ŸÌM_!{(¯B$¥q6«&Hß'vÕ(üË †7©œ<]üïÏ„42ZPƒÕäœ";è"­9{û¾œ* ¡.(Ûì/qimõnÈb¦%Èbùï‹x?o®v ¡ô0‹8ò<>u Oš1ó¤—å)*Ò§œ\ˆŸ4ó¼ X,²ºÞR(|à¦Å Õ‚•o=a¯¸E"@§Ö®çuôkÊý½íIÞ0fñ¨~Ù¢Ëãx ýY@Z#žØ±v-÷÷ŸŸˆ*ûÃT/x˜dÇÛoE&ô }r´V«ÏÒpæy"ƒ©]Xd!a‡;ßœâäÚPÜRsZ†ÝßÌN‚Ú¦YCÑÿĤž¯±¦\¥LòØ]’ëAì$ìI-ºo$JK/â“À9mý­ÉôÇD… ¬¤'½±Œ¡Þ黿¼ÚJd˨ÿfN°=I‹“1¹{告$1u rD½ÄKZù¸U^îïo÷Úy÷uâüu%OúµWßf´jçæF«~Õïú›O’{ôÈg„ÝRHè³F½Èé`YÅNtÄ ÌAüÚÿ%èœ+Y!Šýúé"±ð÷¬ÑÛz°O!‡rôŽI‰†óÚÌ>øZÆ:ÜÉ»R´[v€-©Hö¿îëJ/¾…‰'¾ å¾YµhƒÞÛÕ7N…Â+°Kº ý’ÎúëïKJ–Ið(¸øz/fëƒM/¾ ÞO×]…Èh¥­ü¸¿£§àëE°œ—¥æC¤¤‘º4»" æ5È8£S¦:öñjò ± í^}ßY¦eâ6IÚ¿¹CžÐ Ȉò19F ux}æ4´GRJ9+j·QŒéf¡«ð@¬¸Ê·©›rƒ´-êcPÔÌ®i¥#´ƒcËlUIiæ18ìQyóÞ â²íW]» ‘¾öQ÷ÉÇŠ'‰[ÿÃ[Äug ­ß°Nca(‡Æé¸ïHZ9P&ÿB~¤íìÍ v—•d’©P#¼åÿ;Âý-g«šì^*× f7È-u”#°F¼L‹ïݳ ®NÈîà Yý^â+Á&(¥óáéÃùvq&+Í ¦æÝ£²iqÝX9Èã±]ºë–"Ôâ´HÁË×ËÊ"¬m”å¬ö!o°ã^]þÈçÖÂJ‰ÑÁAr¼Ó1 P}'uŠ}½ÚЯ©ÑÜòý쀃§ËlfÓŽ“ç{ßO­ÿis° p÷J›øl-Ôme­ŠçŽDøòãñ4þKOà;òsEŒc4Õ%÷TTõÈdu‡PÐ;/z󆂆„ø3YMWµ D§ýE!×%RÉ}Ê­(.Ö‰$EV_½ uË7QÇG/W#L‘•8oìhë¬NŽMÐî¹EâÌB?•kAlé5•‹;¯†À‹sÌ=5D¹òNÂÈb‰îù-¼,kÝ<ˆ@nn7öB¾ma¿É£óLû&kpáåSµ]Ý8U¿€Ä?NÒjú~_ yiŸ¨^jrß®ÏðÖ\^ua=EñpøLf˜{lç‘Xa©·ÙºË™b-Jé£RQ#`,(#eúˆ\¹E»â3æç>õuéa{†aÚHG½%ËXÍi`Óãù¾›X&cõ®’çªÄö†ê†L¦ƒðÒí€vùÊOÒ9 à<ÂðsŸ,³w¯ zÍô÷ÈgbæÄ{¤šÑ|bÈåÿ ÜS„È<„ ÈèGØøÖò^¢ù*vÁ0úFSi¦ø€<aQ´?™øw¥`:»¼yÎ5\ÈüäS“Í`JÅN¾Z®l¡ÅR(òP¢õ0üo|Ã?`?;À]"G¶éír|ýp£nN(¿XEà©t»@ˆáÍE¤;Í€ÖûË>_p(5F¤[¼;µ ìîPê|u¬µY~Á›rÍùa¿·«Mh†hò6Q39oz ö´‰ƒi¡Œeè%k-çUD®Š* jÙcšÆ&Mêöd=W“ÂÇØ†Ày‹Ì¼·37*¾;kP‡¤}nÅæuSÚ?ª”zÿ©¢ Ó­:8oPuTw– ÞNŠÛ3 Ìb >Ãá9Ñè*;ÝÈõˆ›§¹2/œ!´WÑÏb_M®i³ácÆ OºyíUÌ…G ¢®f8»¢ºîoò&X /±ÅNÊ–§P[!z‰¯­*nBxÆJë¦òù,ô®W-1“ÈNUìu8¹zó_5.Kºþqv/FØk1k,Ö5¼•T¥š[#šVò6d„¼C0‹¤1´e(heúqD4’_Œ8  ‘}縺ß„zs9J':uløáÀa©ÏOÂD¿ÁîXûß³ìâ­¨&þ"…»±W†?©ї ríÖê)lÉÒ†rÕšzÉ—Íu ;“Œ$HÜ"ÓÜä°õË@?éïë\ úlÐ\!RzôÉ ?+¸šP@‚j·^oùh®åÌ$O]Lf¶ÆRª±N•-×ütMQqÆ{ÊŠ Yzf€3C¾fY–B«Iý¶6äòyP7ÅEß¹ìeH0 Q›ƒ™ 5òh~¸6^Žäcm@ ƒl-¥Ž§ÂÁ®ÛaBÄGd–£xÆÔ¢6i>ꕘÿ)yW üpðyÿܶz>öâÂÁ0‹á^>®ÆRY×Ò§ÂlÊg{„Н"apyæÍÞä™4»Ùµ9+°¼`8 `ºÉ?‡*|wq¡ô´MÅ– kS0'®ÖU+¸ÈÜÁ\oòèˆÔ€E@»;©¦Îáû&9Ú5¼ô=bèÖª^*å W¦èz[¶å^ËܬÝÐ>çfY™\™nè¥c,î®v2)aþ¼€ÃKwõw 2ÇÖ5ƒ¬Oðà)%ææf–q{Ú|£EŽw€7£$ª$é:fœ-{s ¯%¤MYq-çf¸|ÏPöÚ+S†IFÄ›°ºÖNZožB^j~q´ìÁóäX{›šþ  mÿÌ5ûk'OîŒ[¸Þ8ïšÀ {1H-5ã½)OÜh¸€¶‡6°>æÕyª |U°±S 8ƒÜ?øIÅŽ¦ŒP}É _x¶ ÷¢¤ÁŸ‰®Õ¦ÑÊÆš¨¼zÁ6oõ(Z…G;fL¤+“ùSÉÀB–¹ _Ži‘*Ûu‰“¯Ñ¢ÕùB›¦g¢êÊW}Ví‰@áÄâMë¥NOp4·Î¼¸ñû³kh­Z~Œ!,†ô¼ßà¼Hòè‡w9˜J]Ï&^¾ÝÑ¥ñAE"­¤”aìlçMÕ'Š(ýÉsA«T‰PœÃ€h£ª¦¦0§ûG´æÕi Ôiðºæœ‚yïÅ’ªÔº²LmmffõsÄÊÍή=¯’IŸ5i¡Dmϧ‚DŠÏ½1—X°F³Ôñ@ÕŸ´¹™ ÞK<»ñGˆØå ØÍÒÚ– ®¸˜Á*÷ükÕ«Ý­H V¥ûlià°‰·AÍUÂR ¸IÓ±²¢{ÔæïþÜS˜¬h×&HÉ”JMQ-j‚x·²s/ §€öS“¹@\sûðp‘0|ÉÅ;ÞÒvY´ñ“«u÷ïW„¶-.Ÿ—S°ÂTl±Õ¨µåé#Næg@ÞjÉS­ž¾‘J¹¶ª˜3n‘Ǥ†6ñ×úuÃÃwë…•s³¼^c´.àd"&§fÒÛ`¨·­¶VŒºØg„7š2gp½´Ë•ÇHÎËPËñHy/'?ôµÎ(ß7ûº’ââA[ ej wf4‚|Žrk-.gå%(ç¯Dú†'í|"#%:Ã÷iZÀÛ›Ã&)X´0Ÿ¯’Ÿ4“•bš†*)ûFm7l#š Bº3¶ÙÜ@¡ ÚoËÕÈMºó½Ï§ÀÛ8#C·ÈáP¡?sëCr‘¾¥gʽå)<#Ì'MqJ–¼äŸ¡uЀ¥Ó¹¬Ììè¥ð«íeöSGeñûµæÛ÷jF —k³- ðåzF[ò”<|,Ó§<÷¬ñä§ÊR¤ýHÈT´ÅÖ±“Œõ§{×;ð§Œé77í蟃Üïàn(w‘œ.¢(­¹œ2‡·Ô¤—:á4®3oîVÐYpôÖ_œñÓ€[sÎ*6Öf«c‰}yÐí>Çœ¤ü‚ƒëOç´rf~4Ì»ð²4úøãVí‚ RÚĘᗴ8·?sÿÙ\Ù3É ¤ï'Ûiü·ÈwåV |-ò´K9îó({›‘vQCÒ¬Íç]t?/K-¬Œ…pEÙª*hC2é8Ÿ"Dà-ðƒRaHSÔæT`nNuIKR˜(r̾ w<äKòÄ.© §¿RýɃ §\Ù ±Rz…ͪT®Eeî\G!;a‹Å0ŸÝyâ럺;œ94ý)–êœ0k8.eÔ=rÒ‘÷•æþqª:ŒYQÖƒÿ’nížM8OŒXR¢‘’%p›˜ „À’ðE5ài¡¹ÆÇ‚yj†Å{þÆðË?á@Ù9¶&gÿï]YöH#û—ôѳ-óK5ËDzj<ƳÞ05¾Ï?Û¹°pÈÀ€¿ËÙ-jñÀ Ï3NyŒ )Mñ/Òð ^‡©!L¦gôü!­n ruþ׸hgþ¨ýøOS¶{ó'Ëi'>v¦Gd{oon0FøŒƒSVÑH¡ª‹‹†?ɺfWŒQ–­¼ÌžØnÇC”"ÍèÑC7ç¤u$óûJ»Ü‰‡à ÈÒ…½I¡Jà“úC0?oyùlÝñ‹§<õ¢",í-jÛŸ£ô^G‡'ojíw«¿fØì¹˜\`µ*lmy±\%}¦›®¬pãâzýåÙ<9Ÿ%°‹ê­ï´°âQT+ ÝﲌŽd€^¯Q³Íú ²E¾UAxø›HúXíC•gè/(â`så ü$Ö˜TK ¾+Â>Fú÷Vµƒÿ%Üi6¦ m•ó+.>ÿ€Òò7¿˜àH1ª‹ãõ"ô‚Ò#(ó@¬IžûÆÇýÛ/^G|`„3͈ÑQû'Ř Q¥®¡å†æÙ½ùKnßqyÊRÈ@ãWs‘›¬Èÿ.ƒÉrmú }5¸U-å§ë0(çÔBÛ7^ŠM±b´œùåƒ'‹.™hâ9Ù­å… ç€‘­™·“<7ˆ˜ ¾wK¶§“Â7XøhÒÕ²ëï°Ž:ðyç huE‰(;)° ø÷ñWmQòÆû¢J3¿z4⪽þˆØëáMMžà‘¶E5¨ò¬M:9ˆ]Ø][ebÀMd]îÀÿ‹¯ÍÆ«GÒA·¹XåeLôÙ"! ç7ÄSø´çe{='%!{ÂæZòüwE|Ú/ ÝÃSŠãì; ÞxóÊQªuT·—…oÇ}}, éIãNÇã5-J?Í?F0YÃÿ,»(Æga—`¯ÕÝcz¨?Šo XÅvßxĆ‘ÁâÍv[ú¯™òöØ9å¥þ[â¼S¡=ýxp´°—÷ÈjÇU߯3u›-wÓ;ç¸zß·5Zùï‰ÅDü"užç$á&Ô!: ü\ê§kµÈv¶ Ð hzhQ)f^0_ øñYo‡³TH€ðÍßò÷ÀŒúAtú+Àá¨Lr¿þžaz²G97µ?ÞPwf0Ek‹üuþqé’k–Úƒ pHiì»T"±•öÌ”n>ÉàΞýV˜ 26s®[—‡¦À´­îÉo© LY—g"Ø ýTI1<úîQŸQ°ü2­Ìw%‚èÍ,ƒfí'40ƒ0†‰:Ìmµ¦¶Q‚u#ðÔÈ1(Ïs†üEõ#E2Ò+±2_©¥¤ó3®S!ê½¾§¤¥JÒ:¡‡‹%ü.óœÞîì3ÆaXe3f–ƒ–[ùJ'íĶˆk‹…Ã*Ð06á?°bµ£./8cÅ|¯(mQ¿Ê4&#Åÿ¬¶ >'O¡¢àA"{õnÍRI¦»¹Â£xv‚šFÓÒ„Ë*j­ýsØâ̾ŸÀòo0¿¨ŽEiôà3;ï> ¬›dÎëIúE[«¨Nñ&ˆrZo»ÓùÕFo¡Ag„íð|üKðN7ƒ*Ÿ0ÑÍb¯ÌH–¹\tô3*ŒŽëÝ6?gß°¨x%*‹éDÞapƒŸÃ@»kGIíÀÖ|Ë; 1¿N¹ø¸·m<íO°ôË€šºNóþÂꑉWE tõ’-ªÝ¹â<µ98´yðZzÅTû8./7 ‰Ù~¸ª­7ç]1ÖA+Î –v£âšÊØ4ºðlwÆ0e8[ì¹Î¤Ðf Â${@ê¯j\þ©Wj°cÛËt³˜¾Pá<žq.MôúÑÇš"¹’}•xð©Òß…äyÊ3bþ‰ ˜§‘ ÓîôÏûËØŸb¯ïB@]KAHÖ,3Eié(9#Ú)rDÀÄ"vls„bÎ7 „U˜ÇÚ­ŽwùªÌ‡¾XE.65ÁÝúäAÅá™»Hwd{m0ºm•¶“ì–t Ì;!®ÝðÇ{ØËÔ$€)pìEò ücúÇ¥–0è5÷Hå,S ¡à‡Ÿå[À84?ô-àPîÍóùð^ÍL¦DU£¥‘r2ëͨÆVm’ÐX¹ÜÍ0äéà/H´U^p·¿îðÏ`9Ãã·jÜí &œ…|á ÖA5¹ƒÍ²ØŒ®L¿Î…,½3×8îØ¢´:…LÔ³êè£Ä„O—Í‹·Ý¤~å½>¯uC–v\[Í s‡±2PÕبcô|ˆ†y(­iÁï|D«^€Ü©¦mkÁNy@­(RÜcuª!û¾¥±+Ü5n!Š3$ùߟ1´‘‰ D€»Nû¸H£v÷Oë¼ò:ˆðEň3DÖ©…1“i ì›h¯k½ÌáR/Õ[º}®¦ «¦O"ßY×-X£˜ð©kæ¹8é½ÇØ¡ÖSÀw8Höý}¶G'Š=ùz§¥'ŸŒ˜ˆýÀ.ðšöº‰GTD¾\‚­M¾•?®ÅrTˆ­±@g€~ý[ù))ë“€Ôc9tíköÿ'Fz$ô‡¾âh4ülMÚôîv{8{³ÏCxø&´¥¤%/]äd{mÞ.nµ6d—+d· ›ë¶\µXº¥@EøZÐÇcÇBæù$Y­R êÉ៚Á5ǧt©¢†‘N´E$)xÖÓÈ ÎÀXFåjOÕZ’å¼à[JHeY5s ê.Dh*¶_=è¨xðÛŠtÏYDø çý.böðÕsÌ,A>PÆÕ¥; ôŸköÙä+À…‹3ìaÅHœ94n°3>Äq×Îã&XÄp ¢ò m\ é"¨†¶‘-"êmÓkKºZ1šGðØû®½»nzÜF(«ñŸ‡ø$é€PK­feŒŒ¦ìPK ˆZtGÏTŒõQò configure.acUT ?HOV“ùzVux èè(†S.í–H÷¨í¥'Šœóqãn€gCžXe¿<ÎzjÏ!•ÈÕ!øÀA°â¡TmÜS·N\BÏ3[~[äZ3'Ì{=÷$šh5ÓÑQ.8f"-Ï W}ùÚ-`’ÎùyÙ #ͨãžê¡¾§Œßïù µïT0ïÙÅÐë}4.¼sX—åÉ Þ\ ™9œ¯nñùf^äþ86µ q†Æ·SãÔØ²N¦ Zè¹±ýÖêouá§:âÄZÑ”yÄ௫Á˵áYlÉïV27>(ã&´FŽ"K:¨ ´ÝëN&$(wõØ !b»l¥ÙÔ¸ÛEÖ#"!Ạî©'Vã•]¼°7^@ðk_ž?!ôtŸh¼b ‡N¨q$–áËó?`¶ÖÑÊ\ÐGO߀. ïΪdͦÕ\þNµrn³ëSá÷|0c€=¯žñåĸ·~¯‰/@0õX/evkp®ŒcFAqu/+v¤uödœ©Ž†¯yrŒN·âyÅ¢§O±ºÅÌußQà”)±âs½_®‰ýµm¨v· »–&õ ’¤hbd@¸òòu1⎒ ñ.‚ÏUÆ>3 „$y;µ´¡ý,Ñ ÜA¯ÿzÈÙ ÝŠŒ¬4;ÉœhŽ(þ6ÙõöÔûZ;ÐØâ˜å$ö¡µmrG{èã•Q!a–TÈÃçÔt¿ë¦ÃiíˆÎ?“¨ôeŽ ÅÔÐ;Ãà"‚*ןÓú'ü9šÎ>àžx6æ½G!³5.»ã"ñ´${#I¡hÞç5Žöpð5rКl6èðŽ!ó­ØZó§!äf|üTøL [lk@Ù`ZÏÓn‘·âëéü!çÜyP|òG`Å.H`"¹màüÊÑŸxd¶QjìF&coEÅË!ï¬JíÎQÓòDðŠéjúRbñ2ÍÀQñ)Äí¦–¬âÏvhÈ.¡Aô^ü”‚ÑGñR6 Ÿ·uã™î[›j±KÊÆ’ÒŒ3?^Ì;SùeÍ×¼Ú35¸3ç=«6åQÛâL Q_{¡ö)·ð ãý9†õIÔ‚¸I¤ªZË%x‡d6ùÚa †Añ\zM¿`QPKÏTŒõQòPK +> C?ëlú‘4ñ° íconfig.guessUTAzRux PK |—G0}ºÞ  ´ç4config.hUTø{Vux èèPK |—GPZ², ´D8config.h.inUTë{Vux èèPK ÉuiHþc­‘ ·‚ ´K;config.logUTŠ}àVux èèPK |—Gîî܇«J%ò ý0\config.statusUT÷{Vux èèPK +> CÚÓ°»‡'ìŠ í2§config.subUTAzRux PK |—G­feŒŒ¦ì ý ÏconfigureUTë{Vux èèPK ˆZtGÏTŒõQò ´[configure.acUT?HOVux èèPK…&_libzc-0.4.1/data/testrandom000077500000000000000000000062421331702632000156370ustar00rootroot00000000000000#!/bin/bash # Copyright (C) 2012-2018 Marc Ferland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . ZIP=$(which zip) ARCHIVE="archive.zip" YAZC="../yazc/yazc" CMD="libtool --mode=execute $YAZC" if [ ! -f "${ZIP}" ]; then echo >&2 "error: zip not found!" exit 1 fi create_dummy_files() { for i in $(seq 0 2) do dd if=/dev/urandom of=file_${i} bs=${RANDOM} count=1 done for i in $(seq 3 6) do dd if=/dev/zero of=file_${i} bs=${RANDOM} count=1 done } cleanup() { rm -f file_[0-9] rm -f archive.zip } generate_random_string() { echo $(cat /dev/urandom | tr -dc "${1}" | fold -w ${2} | head -n 1) } test_zip_1() { # zip files with passwords [a-z] for pw in {a..z} do FILES="" for filen in file_{0..6} do FILES="${FILES} ${filen}" zip -e -P ${pw} ${ARCHIVE} ${FILES} for threads in $(seq 1 8) do for cset in -a -aA -aAn -aAns do if ! ${CMD} bruteforce -t${threads} ${cset} -l1 ${ARCHIVE}; then echo >&2 "yazc failed to find the password (options: -t${threads} ${cset} ${ARCHIVE})" exit 1 fi done done rm ${ARCHIVE} done done } test_zip_2() { # zip files with passwords [a-z][a-z] for pw in {a..z}{a..z} do FILES="" for filen in file_{0..6} do FILES="${FILES} ${filen}" zip -e -P ${pw} ${ARCHIVE} ${FILES} for threads in $(seq 1 8) do for cset in -a -aA -aAn -aAns do if ! ${CMD} bruteforce -t${threads} ${cset} -l2 ${ARCHIVE}; then echo >&2 "yazc failed to find the password (options: -t${threads} ${cset} ${ARCHIVE})" exit 1 fi done done rm ${ARCHIVE} done done } test_zip_6() { # zip files with passwords [a-z] count=0 while [ $count -lt 10 ]; do pw="$(generate_random_string a-z 6)" FILES="file_0 file_1 file_2 file_3" zip -e -P ${pw} ${ARCHIVE} ${FILES} >/dev/null echo "Testing password: ${pw}" if ! ${CMD} bruteforce -t8 -a ${ARCHIVE}; then echo >&2 "yazc failed to find the password (options: -t8 -a ${ARCHIVE}, password: ${pw})" exit 1 fi rm ${ARCHIVE} count=$((count+1)) done } cleanup create_dummy_files test_zip_1 test_zip_2 test_zip_6 cleanup exit 0 libzc-0.4.1/debian/000077500000000000000000000000001331702632000140365ustar00rootroot00000000000000libzc-0.4.1/debian/changelog000066400000000000000000000006301331702632000157070ustar00rootroot00000000000000libzc (0.4.1-1) unstable; urgency=low * New upstream release. * Stop checking for host os (Closes: #884792). * Fix tests failures on big-endian machines (Closes: #884385) -- Marc Ferland Sat, 23 Jun 2018 21:49:20 -0500 libzc (0.3.6-1) unstable; urgency=low * Initial release (Closes: #861582) -- Marc Ferland Thu, 19 Oct 2017 02:16:04 +0000 libzc-0.4.1/debian/compat000066400000000000000000000000031331702632000152350ustar00rootroot0000000000000011 libzc-0.4.1/debian/control000066400000000000000000000025641331702632000154500ustar00rootroot00000000000000Source: libzc Priority: optional Maintainer: Marc Ferland Build-Depends: debhelper (>= 11), zlib1g-dev, check, pkg-config Standards-Version: 4.1.4 Section: libs Homepage: https://github.com/mferland/libzc Package: libzc-dev Section: libdevel Architecture: any Depends: libzc4 (= ${binary:Version}), ${misc:Depends} Description: fast password cracking library for zip archives (dev) libzc is a fast, portable and high-quality zip password cracking library. It is entirely written in C and uses POSIX threads for faster password recovery. A command line utility, yazc, also comes with the library as the default client. . This package provides the development files. Package: libzc4 Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: fast password cracking library for zip archives libzc is a fast, portable and high-quality zip password cracking library. It is entirely written in C and uses POSIX threads for faster password recovery. A command line utility, yazc, also comes with the library as the default client. Package: yazc Section: utils Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: Command line tool for the libzc library Yazc is the command line utility that comes bundled with libzc. It provides easy access to all of libzc attack modes namely: bruteforce, dictionary and plaintext attacks. libzc-0.4.1/debian/copyright000066400000000000000000000065411331702632000157770ustar00rootroot00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: libzc Upstream-Contact: Marc Ferland Source: https://github.com/mferland/libzc Files: * Copyright: 2012-2018, Marc Ferland License: GPL-3+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this program. If not, see . . On Debian systems, the complete text of the GNU General Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". Files: lib/qsort.h Copyright: 1991, 1992, 1996, 1997, 1999, Free Software Foundation, Inc. License: LGPL-2.1+ The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. . The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. . You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. Files: m4/* Copyright: 2011, Daniel Richard G. 2008, Steven G. Johnson License: GPL-3+ with Autoconf exception This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this program. If not, see . . As a special exception, the respective Autoconf Macro's copyright owner gives unlimited permission to copy, distribute and modify the configure scripts that are the output of Autoconf when processing the Macro. You need not follow the terms of the GNU General Public License when using or distributing such scripts, even though portions of the text of the Macro appear in them. The GNU General Public License (GPL) does govern all other use of the material that constitutes the Autoconf Macro. . This special exception to the GPL applies to versions of the Autoconf Macro released by the Autoconf Archive. When you make and distribute a modified version of the Autoconf Macro, you may extend this special exception to the GPL to apply to your modified version as well. libzc-0.4.1/debian/libzc-dev.install000066400000000000000000000000661331702632000173070ustar00rootroot00000000000000usr/include/* usr/lib/*/lib*.so usr/lib/*/pkgconfig/* libzc-0.4.1/debian/libzc.docs000066400000000000000000000000121331702632000160040ustar00rootroot00000000000000README.md libzc-0.4.1/debian/libzc4.install000066400000000000000000000000241331702632000166110ustar00rootroot00000000000000usr/lib/*/lib*.so.* libzc-0.4.1/debian/libzc4.symbols000066400000000000000000000025011331702632000166350ustar00rootroot00000000000000libzc.so.4 libzc4 #MINVER# zc_crk_bforce_force_threads@Base 0.4.0 zc_crk_bforce_init@Base 0.3.1 zc_crk_bforce_new@Base 0.3.1 zc_crk_bforce_ref@Base 0.3.1 zc_crk_bforce_sanitized_charset@Base 0.3.1 zc_crk_bforce_start@Base 0.4.0 zc_crk_bforce_unref@Base 0.3.1 zc_crk_dict_init@Base 0.3.1 zc_crk_dict_new@Base 0.3.1 zc_crk_dict_ref@Base 0.3.1 zc_crk_dict_start@Base 0.3.1 zc_crk_dict_unref@Base 0.3.1 zc_crk_ptext_attack@Base 0.4.0 zc_crk_ptext_find_internal_rep@Base 0.3.1 zc_crk_ptext_find_password@Base 0.3.1 zc_crk_ptext_force_threads@Base 0.4.0 zc_crk_ptext_key2_count@Base 0.3.1 zc_crk_ptext_key2_reduction@Base 0.3.1 zc_crk_ptext_new@Base 0.3.1 zc_crk_ptext_ref@Base 0.3.1 zc_crk_ptext_set_text@Base 0.3.1 zc_crk_ptext_unref@Base 0.3.1 zc_file_close@Base 0.3.1 zc_file_get_filename@Base 0.3.1 zc_file_info_crypt_header_offset@Base 0.3.1 zc_file_info_enc_header@Base 0.3.1 zc_file_info_idx@Base 0.3.1 zc_file_info_name@Base 0.3.1 zc_file_info_next@Base 0.3.1 zc_file_info_offset@Base 0.3.1 zc_file_info_size@Base 0.3.1 zc_file_isopened@Base 0.3.1 zc_file_new_from_filename@Base 0.3.1 zc_file_open@Base 0.3.1 zc_file_ref@Base 0.3.1 zc_file_unref@Base 0.3.1 zc_get_log_priority@Base 0.3.1 zc_new@Base 0.3.1 zc_ref@Base 0.3.1 zc_set_log_fn@Base 0.3.1 zc_set_log_priority@Base 0.3.1 zc_unref@Base 0.3.1 libzc-0.4.1/debian/rules000077500000000000000000000001671331702632000151220ustar00rootroot00000000000000#!/usr/bin/make -f export DEB_BUILD_MAINT_OPTIONS = hardening=+all export DEB_CFLAGS_MAINT_APPEND = -Ofast %: dh $@ libzc-0.4.1/debian/source/000077500000000000000000000000001331702632000153365ustar00rootroot00000000000000libzc-0.4.1/debian/source/format000066400000000000000000000000141331702632000165440ustar00rootroot000000000000003.0 (quilt) libzc-0.4.1/debian/watch000066400000000000000000000001341331702632000150650ustar00rootroot00000000000000version=4 https://github.com/mferland/libzc/releases /mferland/libzc/archive/v(.+)\.tar\.gz libzc-0.4.1/debian/yazc.install000066400000000000000000000001041331702632000163670ustar00rootroot00000000000000usr/bin/yazc usr/share/man/man1/yazc.1 usr/share/doc/yazc/README.md libzc-0.4.1/gen_decryptbyte.py000066400000000000000000000025561331702632000163650ustar00rootroot00000000000000#!/usr/bin/python3 # Copyright (C) 2012-2018 Marc Ferland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Generate decrypt_byte table. # # Rationale: # The original decrypt_byte function: # # unsigned char decrypt_byte() # local unsigned short temp # temp <- Key(2) | 2 # decrypt_byte <- (temp * (temp ^ 1)) >> 8 # end decrypt_byte # # bit1 of temp is always 1 (because of |2) and bit 0 is flipped in # (temp ^ 1). This is equivalent of clearing the last 2 bits of temp # and replacing it with b11 and b10. We can thus generate the final # byte using only the first 14bits of temp: for i in range(2**(16-2)): byte = ((i << 2) | 0x3) * ((i << 2) | 0x2) byte = byte >> 8 byte = byte & 0xff print(format(byte, '#04x') + ", ", end = "\n" if (i + 1) % 8 == 0 else "") libzc-0.4.1/lib/000077500000000000000000000000001331702632000133625ustar00rootroot00000000000000libzc-0.4.1/lib/.gitignore000066400000000000000000000001061331702632000153470ustar00rootroot00000000000000.dirstamp .deps/ .libs/ *.la *.lo libzc.pc test_libzc valgrind_run.txtlibzc-0.4.1/lib/Makefile.am000066400000000000000000000045041331702632000154210ustar00rootroot00000000000000# Copyright (C) 2012-2018 Marc Ferland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . EXTRA_DIST = CLEANFILES = ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} AM_MAKEFLAGS = --no-print-directory AM_CPPFLAGS = \ -include $(top_builddir)/config.h \ -DSYSCONFDIR=\""$(sysconfdir)"\" \ -DLIBEXECDIR=\""$(libexecdir)"\" AM_CFLAGS = \ -Wall -Wextra \ -fvisibility=hidden \ -ffunction-sections \ -fdata-sections AM_LDFLAGS = -lm ${ZLIB_LIBS} # - Start with version information of '0:0:0' for each libtool library. # - Update the version information only immediately before a public release # of your software. More frequent updates are unnecessary, and only # guarantee that the current interface number gets larger faster. # - If the library source code has changed at all since the last update, # then increment revision ('c:r:a' becomes 'c:r+1:a'). # - If any interfaces have been added, removed, or changed since the last # update, increment current, and set revision to 0. # - If any interfaces have been added since the last public release, then # increment age. # - If any interfaces have been removed or changed since the last public # release, then set age to 0. LIBZC_CURRENT=4 LIBZC_REVISION=1 LIBZC_AGE=0 lib_LTLIBRARIES = libzc.la libzc_la_SOURCES =\ common.c \ crc32.h \ decrypt_byte.h \ find_password.c \ inflate.c \ ka.c \ libzc.c \ libzc.h \ libzc_private.h \ list.h \ ptext_attack.c \ ptext_private.h \ ptext_reduce.c \ pwstream.c \ pwstream.h \ qsort.h \ zc_crk_bforce.c \ zc_crk_dict.c \ zc_crk_ptext.c \ zc_file.c include_HEADERS = libzc.h libzc_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(LIBZC_CURRENT):$(LIBZC_REVISION):$(LIBZC_AGE) pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libzc.pc CLEANFILES += libzc.pc libzc-0.4.1/lib/common.c000066400000000000000000000040201331702632000150120ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "libzc_private.h" #include "decrypt_byte.h" int fill_vdata(struct zc_ctx *ctx, const char *filename, struct validation_data *vdata, size_t nmemb) { struct zc_file *file; int err; err = zc_file_new_from_filename(ctx, filename, &file); if (err) return -1; err = zc_file_open(file); if (err) { zc_file_unref(file); return -1; } int size = read_validation_data(file, vdata, nmemb); zc_file_close(file); zc_file_unref(file); return size; } int fill_test_cipher(struct zc_ctx *ctx, const char *filename, unsigned char **buf, size_t *len, uint32_t *original_crc, bool *is_deflated) { struct zc_file *file; int err; err = zc_file_new_from_filename(ctx, filename, &file); if (err) goto err1; err = zc_file_open(file); if (err) goto err2; err = read_crypt_data(file, buf, len, original_crc, is_deflated); zc_file_close(file); zc_file_unref(file); return err ? -1 : 0; err2: zc_file_unref(file); err1: return -1; } void decrypt(const unsigned char *in, unsigned char *out, size_t len, const struct zc_key *key) { struct zc_key k = *key; for (size_t i = 0; i < len - 1; ++i) { out[i] = in[i] ^ decrypt_byte_tab[(k.key2 & 0xffff) >> 2]; update_keys(out[i], &k, &k); } out[len - 1] = in[len - 1] ^ decrypt_byte_tab[(k.key2 & 0xffff) >> 2]; } libzc-0.4.1/lib/crc32.h000066400000000000000000000163551331702632000144610ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _CRC32_H_ #define _CRC32_H_ #include /* crc32 0xdebb20e3 table and supplementary functions. */ static const uint32_t crc_32_tab[] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, }; static const uint32_t crc_32_invtab[] = { 0x00000000, 0xdb710641, 0x6d930ac3, 0xb6e20c82, 0xdb261586, 0x005713c7, 0xb6b51f45, 0x6dc41904, 0x6d3d2d4d, 0xb64c2b0c, 0x00ae278e, 0xdbdf21cf, 0xb61b38cb, 0x6d6a3e8a, 0xdb883208, 0x00f93449, 0xda7a5a9a, 0x010b5cdb, 0xb7e95059, 0x6c985618, 0x015c4f1c, 0xda2d495d, 0x6ccf45df, 0xb7be439e, 0xb74777d7, 0x6c367196, 0xdad47d14, 0x01a57b55, 0x6c616251, 0xb7106410, 0x01f26892, 0xda836ed3, 0x6f85b375, 0xb4f4b534, 0x0216b9b6, 0xd967bff7, 0xb4a3a6f3, 0x6fd2a0b2, 0xd930ac30, 0x0241aa71, 0x02b89e38, 0xd9c99879, 0x6f2b94fb, 0xb45a92ba, 0xd99e8bbe, 0x02ef8dff, 0xb40d817d, 0x6f7c873c, 0xb5ffe9ef, 0x6e8eefae, 0xd86ce32c, 0x031de56d, 0x6ed9fc69, 0xb5a8fa28, 0x034af6aa, 0xd83bf0eb, 0xd8c2c4a2, 0x03b3c2e3, 0xb551ce61, 0x6e20c820, 0x03e4d124, 0xd895d765, 0x6e77dbe7, 0xb506dda6, 0xdf0b66ea, 0x047a60ab, 0xb2986c29, 0x69e96a68, 0x042d736c, 0xdf5c752d, 0x69be79af, 0xb2cf7fee, 0xb2364ba7, 0x69474de6, 0xdfa54164, 0x04d44725, 0x69105e21, 0xb2615860, 0x048354e2, 0xdff252a3, 0x05713c70, 0xde003a31, 0x68e236b3, 0xb39330f2, 0xde5729f6, 0x05262fb7, 0xb3c42335, 0x68b52574, 0x684c113d, 0xb33d177c, 0x05df1bfe, 0xdeae1dbf, 0xb36a04bb, 0x681b02fa, 0xdef90e78, 0x05880839, 0xb08ed59f, 0x6bffd3de, 0xdd1ddf5c, 0x066cd91d, 0x6ba8c019, 0xb0d9c658, 0x063bcada, 0xdd4acc9b, 0xddb3f8d2, 0x06c2fe93, 0xb020f211, 0x6b51f450, 0x0695ed54, 0xdde4eb15, 0x6b06e797, 0xb077e1d6, 0x6af48f05, 0xb1858944, 0x076785c6, 0xdc168387, 0xb1d29a83, 0x6aa39cc2, 0xdc419040, 0x07309601, 0x07c9a248, 0xdcb8a409, 0x6a5aa88b, 0xb12baeca, 0xdcefb7ce, 0x079eb18f, 0xb17cbd0d, 0x6a0dbb4c, 0x6567cb95, 0xbe16cdd4, 0x08f4c156, 0xd385c717, 0xbe41de13, 0x6530d852, 0xd3d2d4d0, 0x08a3d291, 0x085ae6d8, 0xd32be099, 0x65c9ec1b, 0xbeb8ea5a, 0xd37cf35e, 0x080df51f, 0xbeeff99d, 0x659effdc, 0xbf1d910f, 0x646c974e, 0xd28e9bcc, 0x09ff9d8d, 0x643b8489, 0xbf4a82c8, 0x09a88e4a, 0xd2d9880b, 0xd220bc42, 0x0951ba03, 0xbfb3b681, 0x64c2b0c0, 0x0906a9c4, 0xd277af85, 0x6495a307, 0xbfe4a546, 0x0ae278e0, 0xd1937ea1, 0x67717223, 0xbc007462, 0xd1c46d66, 0x0ab56b27, 0xbc5767a5, 0x672661e4, 0x67df55ad, 0xbcae53ec, 0x0a4c5f6e, 0xd13d592f, 0xbcf9402b, 0x6788466a, 0xd16a4ae8, 0x0a1b4ca9, 0xd098227a, 0x0be9243b, 0xbd0b28b9, 0x667a2ef8, 0x0bbe37fc, 0xd0cf31bd, 0x662d3d3f, 0xbd5c3b7e, 0xbda50f37, 0x66d40976, 0xd03605f4, 0x0b4703b5, 0x66831ab1, 0xbdf21cf0, 0x0b101072, 0xd0611633, 0xba6cad7f, 0x611dab3e, 0xd7ffa7bc, 0x0c8ea1fd, 0x614ab8f9, 0xba3bbeb8, 0x0cd9b23a, 0xd7a8b47b, 0xd7518032, 0x0c208673, 0xbac28af1, 0x61b38cb0, 0x0c7795b4, 0xd70693f5, 0x61e49f77, 0xba959936, 0x6016f7e5, 0xbb67f1a4, 0x0d85fd26, 0xd6f4fb67, 0xbb30e263, 0x6041e422, 0xd6a3e8a0, 0x0dd2eee1, 0x0d2bdaa8, 0xd65adce9, 0x60b8d06b, 0xbbc9d62a, 0xd60dcf2e, 0x0d7cc96f, 0xbb9ec5ed, 0x60efc3ac, 0xd5e91e0a, 0x0e98184b, 0xb87a14c9, 0x630b1288, 0x0ecf0b8c, 0xd5be0dcd, 0x635c014f, 0xb82d070e, 0xb8d43347, 0x63a53506, 0xd5473984, 0x0e363fc5, 0x63f226c1, 0xb8832080, 0x0e612c02, 0xd5102a43, 0x0f934490, 0xd4e242d1, 0x62004e53, 0xb9714812, 0xd4b55116, 0x0fc45757, 0xb9265bd5, 0x62575d94, 0x62ae69dd, 0xb9df6f9c, 0x0f3d631e, 0xd44c655f, 0xb9887c5b, 0x62f97a1a, 0xd41b7698, 0x0f6a70d9, }; #define crc32(crc,byte) (crc_32_tab[((crc) ^ (byte)) & 0xff] ^ ((crc) >> 8)) #define crc32inv(crc,byte) (((crc) << 8) ^ crc_32_invtab[(uint8_t)((crc) >> 24)] ^ (byte)) #endif /* _CRC32_H_ */ libzc-0.4.1/lib/decrypt_byte.h000066400000000000000000003055651331702632000162460ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _DECRYPT_BYTE_H_ #define _DECRYPT_BYTE_H_ #include static const uint8_t decrypt_byte_tab[] = { 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0b, 0x0d, 0x0f, 0x11, 0x13, 0x15, 0x18, 0x1a, 0x1d, 0x1f, 0x22, 0x25, 0x29, 0x2c, 0x2f, 0x33, 0x36, 0x3a, 0x3e, 0x42, 0x46, 0x4a, 0x4f, 0x53, 0x58, 0x5d, 0x62, 0x67, 0x6c, 0x71, 0x76, 0x7c, 0x82, 0x87, 0x8d, 0x93, 0x99, 0xa0, 0xa6, 0xad, 0xb3, 0xba, 0xc1, 0xc8, 0xcf, 0xd6, 0xde, 0xe5, 0xed, 0xf5, 0xfd, 0x05, 0x0d, 0x15, 0x1d, 0x26, 0x2e, 0x37, 0x40, 0x49, 0x52, 0x5c, 0x65, 0x6e, 0x78, 0x82, 0x8c, 0x96, 0xa0, 0xaa, 0xb5, 0xbf, 0xca, 0xd4, 0xdf, 0xea, 0xf6, 0x01, 0x0c, 0x18, 0x23, 0x2f, 0x3b, 0x47, 0x53, 0x5f, 0x6c, 0x78, 0x85, 0x92, 0x9f, 0xac, 0xb9, 0xc6, 0xd3, 0xe1, 0xef, 0xfc, 0x0a, 0x18, 0x26, 0x35, 0x43, 0x52, 0x60, 0x6f, 0x7e, 0x8d, 0x9c, 0xab, 0xbb, 0xca, 0xda, 0xea, 0xfa, 0x0a, 0x1a, 0x2a, 0x3a, 0x4b, 0x5b, 0x6c, 0x7d, 0x8e, 0x9f, 0xb1, 0xc2, 0xd3, 0xe5, 0xf7, 0x09, 0x1b, 0x2d, 0x3f, 0x52, 0x64, 0x77, 0x89, 0x9c, 0xaf, 0xc3, 0xd6, 0xe9, 0xfd, 0x10, 0x24, 0x38, 0x4c, 0x60, 0x74, 0x89, 0x9d, 0xb2, 0xc7, 0xdc, 0xf1, 0x06, 0x1b, 0x30, 0x46, 0x5c, 0x71, 0x87, 0x9d, 0xb3, 0xca, 0xe0, 0xf7, 0x0d, 0x24, 0x3b, 0x52, 0x69, 0x80, 0x98, 0xaf, 0xc7, 0xdf, 0xf7, 0x0f, 0x27, 0x3f, 0x57, 0x70, 0x88, 0xa1, 0xba, 0xd3, 0xec, 0x06, 0x1f, 0x38, 0x52, 0x6c, 0x86, 0xa0, 0xba, 0xd4, 0xef, 0x09, 0x24, 0x3e, 0x59, 0x74, 0x90, 0xab, 0xc6, 0xe2, 0xfd, 0x19, 0x35, 0x51, 0x6d, 0x89, 0xa6, 0xc2, 0xdf, 0xfc, 0x19, 0x36, 0x53, 0x70, 0x8d, 0xab, 0xc9, 0xe6, 0x04, 0x22, 0x40, 0x5f, 0x7d, 0x9c, 0xba, 0xd9, 0xf8, 0x17, 0x36, 0x55, 0x75, 0x94, 0xb4, 0xd4, 0xf4, 0x14, 0x34, 0x54, 0x74, 0x95, 0xb5, 0xd6, 0xf7, 0x18, 0x39, 0x5b, 0x7c, 0x9d, 0xbf, 0xe1, 0x03, 0x25, 0x47, 0x69, 0x8c, 0xae, 0xd1, 0xf3, 0x16, 0x39, 0x5d, 0x80, 0xa3, 0xc7, 0xea, 0x0e, 0x32, 0x56, 0x7a, 0x9e, 0xc3, 0xe7, 0x0c, 0x31, 0x56, 0x7b, 0xa0, 0xc5, 0xea, 0x10, 0x36, 0x5b, 0x81, 0xa7, 0xcd, 0xf4, 0x1a, 0x41, 0x67, 0x8e, 0xb5, 0xdc, 0x03, 0x2a, 0x52, 0x79, 0xa1, 0xc9, 0xf1, 0x19, 0x41, 0x69, 0x91, 0xba, 0xe2, 0x0b, 0x34, 0x5d, 0x86, 0xb0, 0xd9, 0x02, 0x2c, 0x56, 0x80, 0xaa, 0xd4, 0xfe, 0x29, 0x53, 0x7e, 0xa8, 0xd3, 0xfe, 0x2a, 0x55, 0x80, 0xac, 0xd7, 0x03, 0x2f, 0x5b, 0x87, 0xb3, 0xe0, 0x0c, 0x39, 0x66, 0x93, 0xc0, 0xed, 0x1a, 0x47, 0x75, 0xa3, 0xd0, 0xfe, 0x2c, 0x5a, 0x89, 0xb7, 0xe6, 0x14, 0x43, 0x72, 0xa1, 0xd0, 0xff, 0x2f, 0x5e, 0x8e, 0xbe, 0xee, 0x1e, 0x4e, 0x7e, 0xae, 0xdf, 0x0f, 0x40, 0x71, 0xa2, 0xd3, 0x05, 0x36, 0x67, 0x99, 0xcb, 0xfd, 0x2f, 0x61, 0x93, 0xc6, 0xf8, 0x2b, 0x5d, 0x90, 0xc3, 0xf7, 0x2a, 0x5d, 0x91, 0xc4, 0xf8, 0x2c, 0x60, 0x94, 0xc8, 0xfd, 0x31, 0x66, 0x9b, 0xd0, 0x05, 0x3a, 0x6f, 0xa4, 0xda, 0x10, 0x45, 0x7b, 0xb1, 0xe7, 0x1e, 0x54, 0x8b, 0xc1, 0xf8, 0x2f, 0x66, 0x9d, 0xd4, 0x0c, 0x43, 0x7b, 0xb3, 0xeb, 0x23, 0x5b, 0x93, 0xcb, 0x04, 0x3c, 0x75, 0xae, 0xe7, 0x20, 0x5a, 0x93, 0xcc, 0x06, 0x40, 0x7a, 0xb4, 0xee, 0x28, 0x63, 0x9d, 0xd8, 0x12, 0x4d, 0x88, 0xc4, 0xff, 0x3a, 0x76, 0xb1, 0xed, 0x29, 0x65, 0xa1, 0xdd, 0x1a, 0x56, 0x93, 0xd0, 0x0d, 0x4a, 0x87, 0xc4, 0x01, 0x3f, 0x7d, 0xba, 0xf8, 0x36, 0x74, 0xb3, 0xf1, 0x30, 0x6e, 0xad, 0xec, 0x2b, 0x6a, 0xa9, 0xe9, 0x28, 0x68, 0xa8, 0xe8, 0x28, 0x68, 0xa8, 0xe8, 0x29, 0x69, 0xaa, 0xeb, 0x2c, 0x6d, 0xaf, 0xf0, 0x31, 0x73, 0xb5, 0xf7, 0x39, 0x7b, 0xbd, 0x00, 0x42, 0x85, 0xc7, 0x0a, 0x4d, 0x91, 0xd4, 0x17, 0x5b, 0x9e, 0xe2, 0x26, 0x6a, 0xae, 0xf2, 0x37, 0x7b, 0xc0, 0x05, 0x4a, 0x8f, 0xd4, 0x19, 0x5e, 0xa4, 0xea, 0x2f, 0x75, 0xbb, 0x01, 0x48, 0x8e, 0xd5, 0x1b, 0x62, 0xa9, 0xf0, 0x37, 0x7e, 0xc6, 0x0d, 0x55, 0x9d, 0xe5, 0x2d, 0x75, 0xbd, 0x05, 0x4e, 0x96, 0xdf, 0x28, 0x71, 0xba, 0x04, 0x4d, 0x96, 0xe0, 0x2a, 0x74, 0xbe, 0x08, 0x52, 0x9d, 0xe7, 0x32, 0x7c, 0xc7, 0x12, 0x5e, 0xa9, 0xf4, 0x40, 0x8b, 0xd7, 0x23, 0x6f, 0xbb, 0x07, 0x54, 0xa0, 0xed, 0x3a, 0x87, 0xd4, 0x21, 0x6e, 0xbb, 0x09, 0x57, 0xa4, 0xf2, 0x40, 0x8e, 0xdd, 0x2b, 0x7a, 0xc8, 0x17, 0x66, 0xb5, 0x04, 0x53, 0xa3, 0xf2, 0x42, 0x92, 0xe2, 0x32, 0x82, 0xd2, 0x22, 0x73, 0xc3, 0x14, 0x65, 0xb6, 0x07, 0x59, 0xaa, 0xfb, 0x4d, 0x9f, 0xf1, 0x43, 0x95, 0xe7, 0x3a, 0x8c, 0xdf, 0x31, 0x84, 0xd7, 0x2b, 0x7e, 0xd1, 0x25, 0x78, 0xcc, 0x20, 0x74, 0xc8, 0x1c, 0x71, 0xc5, 0x1a, 0x6f, 0xc4, 0x19, 0x6e, 0xc3, 0x18, 0x6e, 0xc4, 0x19, 0x6f, 0xc5, 0x1b, 0x72, 0xc8, 0x1f, 0x75, 0xcc, 0x23, 0x7a, 0xd1, 0x28, 0x80, 0xd7, 0x2f, 0x87, 0xdf, 0x37, 0x8f, 0xe7, 0x3f, 0x98, 0xf0, 0x49, 0xa2, 0xfb, 0x54, 0xae, 0x07, 0x60, 0xba, 0x14, 0x6e, 0xc8, 0x22, 0x7c, 0xd7, 0x31, 0x8c, 0xe6, 0x41, 0x9c, 0xf8, 0x53, 0xae, 0x0a, 0x65, 0xc1, 0x1d, 0x79, 0xd5, 0x31, 0x8e, 0xea, 0x47, 0xa4, 0x01, 0x5e, 0xbb, 0x18, 0x75, 0xd3, 0x31, 0x8e, 0xec, 0x4a, 0xa8, 0x07, 0x65, 0xc4, 0x22, 0x81, 0xe0, 0x3f, 0x9e, 0xfd, 0x5d, 0xbc, 0x1c, 0x7c, 0xdc, 0x3c, 0x9c, 0xfc, 0x5c, 0xbd, 0x1d, 0x7e, 0xdf, 0x40, 0xa1, 0x03, 0x64, 0xc5, 0x27, 0x89, 0xeb, 0x4d, 0xaf, 0x11, 0x74, 0xd6, 0x39, 0x9b, 0xfe, 0x61, 0xc5, 0x28, 0x8b, 0xef, 0x52, 0xb6, 0x1a, 0x7e, 0xe2, 0x46, 0xab, 0x0f, 0x74, 0xd9, 0x3e, 0xa3, 0x08, 0x6d, 0xd2, 0x38, 0x9e, 0x03, 0x69, 0xcf, 0x35, 0x9c, 0x02, 0x69, 0xcf, 0x36, 0x9d, 0x04, 0x6b, 0xd2, 0x3a, 0xa1, 0x09, 0x71, 0xd9, 0x41, 0xa9, 0x11, 0x79, 0xe2, 0x4a, 0xb3, 0x1c, 0x85, 0xee, 0x58, 0xc1, 0x2a, 0x94, 0xfe, 0x68, 0xd2, 0x3c, 0xa6, 0x11, 0x7b, 0xe6, 0x50, 0xbb, 0x26, 0x92, 0xfd, 0x68, 0xd4, 0x3f, 0xab, 0x17, 0x83, 0xef, 0x5b, 0xc8, 0x34, 0xa1, 0x0e, 0x7b, 0xe8, 0x55, 0xc2, 0x2f, 0x9d, 0x0b, 0x78, 0xe6, 0x54, 0xc2, 0x31, 0x9f, 0x0e, 0x7c, 0xeb, 0x5a, 0xc9, 0x38, 0xa7, 0x17, 0x86, 0xf6, 0x66, 0xd6, 0x46, 0xb6, 0x26, 0x96, 0x07, 0x77, 0xe8, 0x59, 0xca, 0x3b, 0xad, 0x1e, 0x8f, 0x01, 0x73, 0xe5, 0x57, 0xc9, 0x3b, 0xae, 0x20, 0x93, 0x05, 0x78, 0xeb, 0x5f, 0xd2, 0x45, 0xb9, 0x2c, 0xa0, 0x14, 0x88, 0xfc, 0x70, 0xe5, 0x59, 0xce, 0x43, 0xb8, 0x2d, 0xa2, 0x17, 0x8c, 0x02, 0x78, 0xed, 0x63, 0xd9, 0x4f, 0xc6, 0x3c, 0xb3, 0x29, 0xa0, 0x17, 0x8e, 0x05, 0x7c, 0xf4, 0x6b, 0xe3, 0x5b, 0xd3, 0x4b, 0xc3, 0x3b, 0xb3, 0x2c, 0xa4, 0x1d, 0x96, 0x0f, 0x88, 0x02, 0x7b, 0xf4, 0x6e, 0xe8, 0x62, 0xdc, 0x56, 0xd0, 0x4b, 0xc5, 0x40, 0xba, 0x35, 0xb0, 0x2c, 0xa7, 0x22, 0x9e, 0x19, 0x95, 0x11, 0x8d, 0x09, 0x85, 0x02, 0x7e, 0xfb, 0x78, 0xf5, 0x72, 0xef, 0x6c, 0xe9, 0x67, 0xe5, 0x62, 0xe0, 0x5e, 0xdc, 0x5b, 0xd9, 0x58, 0xd6, 0x55, 0xd4, 0x53, 0xd2, 0x51, 0xd1, 0x50, 0xd0, 0x50, 0xd0, 0x50, 0xd0, 0x50, 0xd0, 0x51, 0xd1, 0x52, 0xd3, 0x54, 0xd5, 0x57, 0xd8, 0x59, 0xdb, 0x5d, 0xdf, 0x61, 0xe3, 0x65, 0xe8, 0x6a, 0xed, 0x6f, 0xf2, 0x75, 0xf9, 0x7c, 0xff, 0x83, 0x06, 0x8a, 0x0e, 0x92, 0x16, 0x9a, 0x1f, 0xa3, 0x28, 0xad, 0x32, 0xb7, 0x3c, 0xc1, 0x46, 0xcc, 0x52, 0xd7, 0x5d, 0xe3, 0x69, 0xf0, 0x76, 0xfd, 0x83, 0x0a, 0x91, 0x18, 0x9f, 0x26, 0xae, 0x35, 0xbd, 0x45, 0xcd, 0x55, 0xdd, 0x65, 0xed, 0x76, 0xfe, 0x87, 0x10, 0x99, 0x22, 0xac, 0x35, 0xbe, 0x48, 0xd2, 0x5c, 0xe6, 0x70, 0xfa, 0x85, 0x0f, 0x9a, 0x24, 0xaf, 0x3a, 0xc6, 0x51, 0xdc, 0x68, 0xf3, 0x7f, 0x0b, 0x97, 0x23, 0xaf, 0x3c, 0xc8, 0x55, 0xe2, 0x6f, 0xfc, 0x89, 0x16, 0xa3, 0x31, 0xbf, 0x4c, 0xda, 0x68, 0xf6, 0x85, 0x13, 0xa2, 0x30, 0xbf, 0x4e, 0xdd, 0x6c, 0xfb, 0x8b, 0x1a, 0xaa, 0x3a, 0xca, 0x5a, 0xea, 0x7a, 0x0a, 0x9b, 0x2b, 0xbc, 0x4d, 0xde, 0x6f, 0x01, 0x92, 0x23, 0xb5, 0x47, 0xd9, 0x6b, 0xfd, 0x8f, 0x22, 0xb4, 0x47, 0xd9, 0x6c, 0xff, 0x93, 0x26, 0xb9, 0x4d, 0xe0, 0x74, 0x08, 0x9c, 0x30, 0xc4, 0x59, 0xed, 0x82, 0x17, 0xac, 0x41, 0xd6, 0x6b, 0x00, 0x96, 0x2c, 0xc1, 0x57, 0xed, 0x83, 0x1a, 0xb0, 0x47, 0xdd, 0x74, 0x0b, 0xa2, 0x39, 0xd0, 0x68, 0xff, 0x97, 0x2f, 0xc7, 0x5f, 0xf7, 0x8f, 0x27, 0xc0, 0x58, 0xf1, 0x8a, 0x23, 0xbc, 0x56, 0xef, 0x88, 0x22, 0xbc, 0x56, 0xf0, 0x8a, 0x24, 0xbf, 0x59, 0xf4, 0x8e, 0x29, 0xc4, 0x60, 0xfb, 0x96, 0x32, 0xcd, 0x69, 0x05, 0xa1, 0x3d, 0xd9, 0x76, 0x12, 0xaf, 0x4c, 0xe9, 0x86, 0x23, 0xc0, 0x5d, 0xfb, 0x99, 0x36, 0xd4, 0x72, 0x10, 0xaf, 0x4d, 0xec, 0x8a, 0x29, 0xc8, 0x67, 0x06, 0xa5, 0x45, 0xe4, 0x84, 0x24, 0xc4, 0x64, 0x04, 0xa4, 0x44, 0xe5, 0x85, 0x26, 0xc7, 0x68, 0x09, 0xab, 0x4c, 0xed, 0x8f, 0x31, 0xd3, 0x75, 0x17, 0xb9, 0x5c, 0xfe, 0xa1, 0x43, 0xe6, 0x89, 0x2d, 0xd0, 0x73, 0x17, 0xba, 0x5e, 0x02, 0xa6, 0x4a, 0xee, 0x93, 0x37, 0xdc, 0x81, 0x26, 0xcb, 0x70, 0x15, 0xba, 0x60, 0x06, 0xab, 0x51, 0xf7, 0x9d, 0x44, 0xea, 0x91, 0x37, 0xde, 0x85, 0x2c, 0xd3, 0x7a, 0x22, 0xc9, 0x71, 0x19, 0xc1, 0x69, 0x11, 0xb9, 0x61, 0x0a, 0xb2, 0x5b, 0x04, 0xad, 0x56, 0x00, 0xa9, 0x52, 0xfc, 0xa6, 0x50, 0xfa, 0xa4, 0x4e, 0xf9, 0xa3, 0x4e, 0xf8, 0xa3, 0x4e, 0xfa, 0xa5, 0x50, 0xfc, 0xa7, 0x53, 0xff, 0xab, 0x57, 0x03, 0xb0, 0x5c, 0x09, 0xb6, 0x63, 0x10, 0xbd, 0x6a, 0x17, 0xc5, 0x73, 0x20, 0xce, 0x7c, 0x2a, 0xd9, 0x87, 0x36, 0xe4, 0x93, 0x42, 0xf1, 0xa0, 0x4f, 0xff, 0xae, 0x5e, 0x0e, 0xbe, 0x6e, 0x1e, 0xce, 0x7e, 0x2f, 0xdf, 0x90, 0x41, 0xf2, 0xa3, 0x55, 0x06, 0xb7, 0x69, 0x1b, 0xcd, 0x7f, 0x31, 0xe3, 0x96, 0x48, 0xfb, 0xad, 0x60, 0x13, 0xc7, 0x7a, 0x2d, 0xe1, 0x94, 0x48, 0xfc, 0xb0, 0x64, 0x18, 0xcd, 0x81, 0x36, 0xeb, 0xa0, 0x55, 0x0a, 0xbf, 0x74, 0x2a, 0xe0, 0x95, 0x4b, 0x01, 0xb7, 0x6e, 0x24, 0xdb, 0x91, 0x48, 0xff, 0xb6, 0x6d, 0x24, 0xdc, 0x93, 0x4b, 0x03, 0xbb, 0x73, 0x2b, 0xe3, 0x9b, 0x54, 0x0c, 0xc5, 0x7e, 0x37, 0xf0, 0xaa, 0x63, 0x1c, 0xd6, 0x90, 0x4a, 0x04, 0xbe, 0x78, 0x33, 0xed, 0xa8, 0x62, 0x1d, 0xd8, 0x94, 0x4f, 0x0a, 0xc6, 0x81, 0x3d, 0xf9, 0xb5, 0x71, 0x2d, 0xea, 0xa6, 0x63, 0x20, 0xdd, 0x9a, 0x57, 0x14, 0xd1, 0x8f, 0x4d, 0x0a, 0xc8, 0x86, 0x44, 0x03, 0xc1, 0x80, 0x3e, 0xfd, 0xbc, 0x7b, 0x3a, 0xf9, 0xb9, 0x78, 0x38, 0xf8, 0xb8, 0x78, 0x38, 0xf8, 0xb8, 0x79, 0x39, 0xfa, 0xbb, 0x7c, 0x3d, 0xff, 0xc0, 0x81, 0x43, 0x05, 0xc7, 0x89, 0x4b, 0x0d, 0xd0, 0x92, 0x55, 0x17, 0xda, 0x9d, 0x61, 0x24, 0xe7, 0xab, 0x6e, 0x32, 0xf6, 0xba, 0x7e, 0x42, 0x07, 0xcb, 0x90, 0x55, 0x1a, 0xdf, 0xa4, 0x69, 0x2e, 0xf4, 0xba, 0x7f, 0x45, 0x0b, 0xd1, 0x98, 0x5e, 0x25, 0xeb, 0xb2, 0x79, 0x40, 0x07, 0xce, 0x96, 0x5d, 0x25, 0xed, 0xb5, 0x7d, 0x45, 0x0d, 0xd5, 0x9e, 0x66, 0x2f, 0xf8, 0xc1, 0x8a, 0x54, 0x1d, 0xe6, 0xb0, 0x7a, 0x44, 0x0e, 0xd8, 0xa2, 0x6d, 0x37, 0x02, 0xcc, 0x97, 0x62, 0x2e, 0xf9, 0xc4, 0x90, 0x5b, 0x27, 0xf3, 0xbf, 0x8b, 0x57, 0x24, 0xf0, 0xbd, 0x8a, 0x57, 0x24, 0xf1, 0xbe, 0x8b, 0x59, 0x27, 0xf4, 0xc2, 0x90, 0x5e, 0x2d, 0xfb, 0xca, 0x98, 0x67, 0x36, 0x05, 0xd4, 0xa3, 0x73, 0x42, 0x12, 0xe2, 0xb2, 0x82, 0x52, 0x22, 0xf2, 0xc3, 0x93, 0x64, 0x35, 0x06, 0xd7, 0xa9, 0x7a, 0x4b, 0x1d, 0xef, 0xc1, 0x93, 0x65, 0x37, 0x0a, 0xdc, 0xaf, 0x81, 0x54, 0x27, 0xfb, 0xce, 0xa1, 0x75, 0x48, 0x1c, 0xf0, 0xc4, 0x98, 0x6c, 0x41, 0x15, 0xea, 0xbf, 0x94, 0x69, 0x3e, 0x13, 0xe8, 0xbe, 0x94, 0x69, 0x3f, 0x15, 0xeb, 0xc2, 0x98, 0x6f, 0x45, 0x1c, 0xf3, 0xca, 0xa1, 0x78, 0x50, 0x27, 0xff, 0xd7, 0xaf, 0x87, 0x5f, 0x37, 0x0f, 0xe8, 0xc0, 0x99, 0x72, 0x4b, 0x24, 0xfe, 0xd7, 0xb0, 0x8a, 0x64, 0x3e, 0x18, 0xf2, 0xcc, 0xa7, 0x81, 0x5c, 0x36, 0x11, 0xec, 0xc8, 0xa3, 0x7e, 0x5a, 0x35, 0x11, 0xed, 0xc9, 0xa5, 0x81, 0x5e, 0x3a, 0x17, 0xf4, 0xd1, 0xae, 0x8b, 0x68, 0x45, 0x23, 0x01, 0xde, 0xbc, 0x9a, 0x78, 0x57, 0x35, 0x14, 0xf2, 0xd1, 0xb0, 0x8f, 0x6e, 0x4d, 0x2d, 0x0c, 0xec, 0xcc, 0xac, 0x8c, 0x6c, 0x4c, 0x2c, 0x0d, 0xed, 0xce, 0xaf, 0x90, 0x71, 0x53, 0x34, 0x15, 0xf7, 0xd9, 0xbb, 0x9d, 0x7f, 0x61, 0x44, 0x26, 0x09, 0xeb, 0xce, 0xb1, 0x95, 0x78, 0x5b, 0x3f, 0x22, 0x06, 0xea, 0xce, 0xb2, 0x96, 0x7b, 0x5f, 0x44, 0x29, 0x0e, 0xf3, 0xd8, 0xbd, 0xa2, 0x88, 0x6e, 0x53, 0x39, 0x1f, 0x05, 0xec, 0xd2, 0xb9, 0x9f, 0x86, 0x6d, 0x54, 0x3b, 0x22, 0x0a, 0xf1, 0xd9, 0xc1, 0xa9, 0x91, 0x79, 0x61, 0x49, 0x32, 0x1a, 0x03, 0xec, 0xd5, 0xbe, 0xa8, 0x91, 0x7a, 0x64, 0x4e, 0x38, 0x22, 0x0c, 0xf6, 0xe1, 0xcb, 0xb6, 0xa0, 0x8b, 0x76, 0x62, 0x4d, 0x38, 0x24, 0x0f, 0xfb, 0xe7, 0xd3, 0xbf, 0xab, 0x98, 0x84, 0x71, 0x5e, 0x4b, 0x38, 0x25, 0x12, 0xff, 0xed, 0xdb, 0xc8, 0xb6, 0xa4, 0x92, 0x81, 0x6f, 0x5e, 0x4c, 0x3b, 0x2a, 0x19, 0x08, 0xf7, 0xe7, 0xd6, 0xc6, 0xb6, 0xa6, 0x96, 0x86, 0x76, 0x66, 0x57, 0x47, 0x38, 0x29, 0x1a, 0x0b, 0xfd, 0xee, 0xdf, 0xd1, 0xc3, 0xb5, 0xa7, 0x99, 0x8b, 0x7e, 0x70, 0x63, 0x55, 0x48, 0x3b, 0x2f, 0x22, 0x15, 0x09, 0xfc, 0xf0, 0xe4, 0xd8, 0xcc, 0xc0, 0xb5, 0xa9, 0x9e, 0x93, 0x88, 0x7d, 0x72, 0x67, 0x5c, 0x52, 0x48, 0x3d, 0x33, 0x29, 0x1f, 0x16, 0x0c, 0x03, 0xf9, 0xf0, 0xe7, 0xde, 0xd5, 0xcc, 0xc4, 0xbb, 0xb3, 0xab, 0xa3, 0x9b, 0x93, 0x8b, 0x83, 0x7c, 0x74, 0x6d, 0x66, 0x5f, 0x58, 0x52, 0x4b, 0x44, 0x3e, 0x38, 0x32, 0x2c, 0x26, 0x20, 0x1b, 0x15, 0x10, 0x0a, 0x05, 0x00, 0xfc, 0xf7, 0xf2, 0xee, 0xe9, 0xe5, 0xe1, 0xdd, 0xd9, 0xd5, 0xd2, 0xce, 0xcb, 0xc8, 0xc5, 0xc2, 0xbf, 0xbc, 0xb9, 0xb7, 0xb5, 0xb2, 0xb0, 0xae, 0xac, 0xab, 0xa9, 0xa8, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1, 0xa1, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa1, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa7, 0xa8, 0xa9, 0xab, 0xad, 0xaf, 0xb1, 0xb3, 0xb5, 0xb8, 0xba, 0xbd, 0xbf, 0xc2, 0xc5, 0xc9, 0xcc, 0xcf, 0xd3, 0xd6, 0xda, 0xde, 0xe2, 0xe6, 0xea, 0xef, 0xf3, 0xf8, 0xfd, 0x02, 0x07, 0x0c, 0x11, 0x16, 0x1c, 0x22, 0x27, 0x2d, 0x33, 0x39, 0x40, 0x46, 0x4d, 0x53, 0x5a, 0x61, 0x68, 0x6f, 0x76, 0x7e, 0x85, 0x8d, 0x95, 0x9d, 0xa5, 0xad, 0xb5, 0xbd, 0xc6, 0xce, 0xd7, 0xe0, 0xe9, 0xf2, 0xfc, 0x05, 0x0e, 0x18, 0x22, 0x2c, 0x36, 0x40, 0x4a, 0x55, 0x5f, 0x6a, 0x74, 0x7f, 0x8a, 0x96, 0xa1, 0xac, 0xb8, 0xc3, 0xcf, 0xdb, 0xe7, 0xf3, 0xff, 0x0c, 0x18, 0x25, 0x32, 0x3f, 0x4c, 0x59, 0x66, 0x73, 0x81, 0x8f, 0x9c, 0xaa, 0xb8, 0xc6, 0xd5, 0xe3, 0xf2, 0x00, 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5b, 0x6a, 0x7a, 0x8a, 0x9a, 0xaa, 0xba, 0xca, 0xda, 0xeb, 0xfb, 0x0c, 0x1d, 0x2e, 0x3f, 0x51, 0x62, 0x73, 0x85, 0x97, 0xa9, 0xbb, 0xcd, 0xdf, 0xf2, 0x04, 0x17, 0x29, 0x3c, 0x4f, 0x63, 0x76, 0x89, 0x9d, 0xb0, 0xc4, 0xd8, 0xec, 0x00, 0x14, 0x29, 0x3d, 0x52, 0x67, 0x7c, 0x91, 0xa6, 0xbb, 0xd0, 0xe6, 0xfc, 0x11, 0x27, 0x3d, 0x53, 0x6a, 0x80, 0x97, 0xad, 0xc4, 0xdb, 0xf2, 0x09, 0x20, 0x38, 0x4f, 0x67, 0x7f, 0x97, 0xaf, 0xc7, 0xdf, 0xf7, 0x10, 0x28, 0x41, 0x5a, 0x73, 0x8c, 0xa6, 0xbf, 0xd8, 0xf2, 0x0c, 0x26, 0x40, 0x5a, 0x74, 0x8f, 0xa9, 0xc4, 0xde, 0xf9, 0x14, 0x30, 0x4b, 0x66, 0x82, 0x9d, 0xb9, 0xd5, 0xf1, 0x0d, 0x29, 0x46, 0x62, 0x7f, 0x9c, 0xb9, 0xd6, 0xf3, 0x10, 0x2d, 0x4b, 0x69, 0x86, 0xa4, 0xc2, 0xe0, 0xff, 0x1d, 0x3c, 0x5a, 0x79, 0x98, 0xb7, 0xd6, 0xf5, 0x15, 0x34, 0x54, 0x74, 0x94, 0xb4, 0xd4, 0xf4, 0x14, 0x35, 0x55, 0x76, 0x97, 0xb8, 0xd9, 0xfb, 0x1c, 0x3d, 0x5f, 0x81, 0xa3, 0xc5, 0xe7, 0x09, 0x2c, 0x4e, 0x71, 0x93, 0xb6, 0xd9, 0xfd, 0x20, 0x43, 0x67, 0x8a, 0xae, 0xd2, 0xf6, 0x1a, 0x3e, 0x63, 0x87, 0xac, 0xd1, 0xf6, 0x1b, 0x40, 0x65, 0x8a, 0xb0, 0xd6, 0xfb, 0x21, 0x47, 0x6d, 0x94, 0xba, 0xe1, 0x07, 0x2e, 0x55, 0x7c, 0xa3, 0xca, 0xf2, 0x19, 0x41, 0x69, 0x91, 0xb9, 0xe1, 0x09, 0x31, 0x5a, 0x82, 0xab, 0xd4, 0xfd, 0x26, 0x50, 0x79, 0xa2, 0xcc, 0xf6, 0x20, 0x4a, 0x74, 0x9e, 0xc9, 0xf3, 0x1e, 0x48, 0x73, 0x9e, 0xca, 0xf5, 0x20, 0x4c, 0x77, 0xa3, 0xcf, 0xfb, 0x27, 0x53, 0x80, 0xac, 0xd9, 0x06, 0x33, 0x60, 0x8d, 0xba, 0xe7, 0x15, 0x43, 0x70, 0x9e, 0xcc, 0xfa, 0x29, 0x57, 0x86, 0xb4, 0xe3, 0x12, 0x41, 0x70, 0x9f, 0xcf, 0xfe, 0x2e, 0x5e, 0x8e, 0xbe, 0xee, 0x1e, 0x4e, 0x7f, 0xaf, 0xe0, 0x11, 0x42, 0x73, 0xa5, 0xd6, 0x07, 0x39, 0x6b, 0x9d, 0xcf, 0x01, 0x33, 0x66, 0x98, 0xcb, 0xfd, 0x30, 0x63, 0x97, 0xca, 0xfd, 0x31, 0x64, 0x98, 0xcc, 0x00, 0x34, 0x68, 0x9d, 0xd1, 0x06, 0x3b, 0x70, 0xa5, 0xda, 0x0f, 0x44, 0x7a, 0xb0, 0xe5, 0x1b, 0x51, 0x87, 0xbe, 0xf4, 0x2b, 0x61, 0x98, 0xcf, 0x06, 0x3d, 0x74, 0xac, 0xe3, 0x1b, 0x53, 0x8b, 0xc3, 0xfb, 0x33, 0x6b, 0xa4, 0xdc, 0x15, 0x4e, 0x87, 0xc0, 0xfa, 0x33, 0x6c, 0xa6, 0xe0, 0x1a, 0x54, 0x8e, 0xc8, 0x03, 0x3d, 0x78, 0xb2, 0xed, 0x28, 0x64, 0x9f, 0xda, 0x16, 0x51, 0x8d, 0xc9, 0x05, 0x41, 0x7d, 0xba, 0xf6, 0x33, 0x70, 0xad, 0xea, 0x27, 0x64, 0xa1, 0xdf, 0x1d, 0x5a, 0x98, 0xd6, 0x14, 0x53, 0x91, 0xd0, 0x0e, 0x4d, 0x8c, 0xcb, 0x0a, 0x49, 0x89, 0xc8, 0x08, 0x48, 0x88, 0xc8, 0x08, 0x48, 0x88, 0xc9, 0x09, 0x4a, 0x8b, 0xcc, 0x0d, 0x4f, 0x90, 0xd1, 0x13, 0x55, 0x97, 0xd9, 0x1b, 0x5d, 0xa0, 0xe2, 0x25, 0x67, 0xaa, 0xed, 0x31, 0x74, 0xb7, 0xfb, 0x3e, 0x82, 0xc6, 0x0a, 0x4e, 0x92, 0xd7, 0x1b, 0x60, 0xa5, 0xea, 0x2f, 0x74, 0xb9, 0xfe, 0x44, 0x8a, 0xcf, 0x15, 0x5b, 0xa1, 0xe8, 0x2e, 0x75, 0xbb, 0x02, 0x49, 0x90, 0xd7, 0x1e, 0x66, 0xad, 0xf5, 0x3d, 0x85, 0xcd, 0x15, 0x5d, 0xa5, 0xee, 0x36, 0x7f, 0xc8, 0x11, 0x5a, 0xa4, 0xed, 0x36, 0x80, 0xca, 0x14, 0x5e, 0xa8, 0xf2, 0x3d, 0x87, 0xd2, 0x1c, 0x67, 0xb2, 0xfe, 0x49, 0x94, 0xe0, 0x2b, 0x77, 0xc3, 0x0f, 0x5b, 0xa7, 0xf4, 0x40, 0x8d, 0xda, 0x27, 0x74, 0xc1, 0x0e, 0x5b, 0xa9, 0xf7, 0x44, 0x92, 0xe0, 0x2e, 0x7d, 0xcb, 0x1a, 0x68, 0xb7, 0x06, 0x55, 0xa4, 0xf3, 0x43, 0x92, 0xe2, 0x32, 0x82, 0xd2, 0x22, 0x72, 0xc2, 0x13, 0x63, 0xb4, 0x05, 0x56, 0xa7, 0xf9, 0x4a, 0x9b, 0xed, 0x3f, 0x91, 0xe3, 0x35, 0x87, 0xda, 0x2c, 0x7f, 0xd1, 0x24, 0x77, 0xcb, 0x1e, 0x71, 0xc5, 0x18, 0x6c, 0xc0, 0x14, 0x68, 0xbc, 0x11, 0x65, 0xba, 0x0f, 0x64, 0xb9, 0x0e, 0x63, 0xb8, 0x0e, 0x64, 0xb9, 0x0f, 0x65, 0xbb, 0x12, 0x68, 0xbf, 0x15, 0x6c, 0xc3, 0x1a, 0x71, 0xc8, 0x20, 0x77, 0xcf, 0x27, 0x7f, 0xd7, 0x2f, 0x87, 0xdf, 0x38, 0x90, 0xe9, 0x42, 0x9b, 0xf4, 0x4e, 0xa7, 0x00, 0x5a, 0xb4, 0x0e, 0x68, 0xc2, 0x1c, 0x77, 0xd1, 0x2c, 0x86, 0xe1, 0x3c, 0x98, 0xf3, 0x4e, 0xaa, 0x05, 0x61, 0xbd, 0x19, 0x75, 0xd1, 0x2e, 0x8a, 0xe7, 0x44, 0xa1, 0xfe, 0x5b, 0xb8, 0x15, 0x73, 0xd1, 0x2e, 0x8c, 0xea, 0x48, 0xa7, 0x05, 0x64, 0xc2, 0x21, 0x80, 0xdf, 0x3e, 0x9d, 0xfd, 0x5c, 0xbc, 0x1c, 0x7c, 0xdc, 0x3c, 0x9c, 0xfc, 0x5d, 0xbd, 0x1e, 0x7f, 0xe0, 0x41, 0xa3, 0x04, 0x65, 0xc7, 0x29, 0x8b, 0xed, 0x4f, 0xb1, 0x14, 0x76, 0xd9, 0x3b, 0x9e, 0x01, 0x65, 0xc8, 0x2b, 0x8f, 0xf2, 0x56, 0xba, 0x1e, 0x82, 0xe6, 0x4b, 0xaf, 0x14, 0x79, 0xde, 0x43, 0xa8, 0x0d, 0x72, 0xd8, 0x3e, 0xa3, 0x09, 0x6f, 0xd5, 0x3c, 0xa2, 0x09, 0x6f, 0xd6, 0x3d, 0xa4, 0x0b, 0x72, 0xda, 0x41, 0xa9, 0x11, 0x79, 0xe1, 0x49, 0xb1, 0x19, 0x82, 0xea, 0x53, 0xbc, 0x25, 0x8e, 0xf8, 0x61, 0xca, 0x34, 0x9e, 0x08, 0x72, 0xdc, 0x46, 0xb1, 0x1b, 0x86, 0xf0, 0x5b, 0xc6, 0x32, 0x9d, 0x08, 0x74, 0xdf, 0x4b, 0xb7, 0x23, 0x8f, 0xfb, 0x68, 0xd4, 0x41, 0xae, 0x1b, 0x88, 0xf5, 0x62, 0xcf, 0x3d, 0xab, 0x18, 0x86, 0xf4, 0x62, 0xd1, 0x3f, 0xae, 0x1c, 0x8b, 0xfa, 0x69, 0xd8, 0x47, 0xb7, 0x26, 0x96, 0x06, 0x76, 0xe6, 0x56, 0xc6, 0x36, 0xa7, 0x17, 0x88, 0xf9, 0x6a, 0xdb, 0x4d, 0xbe, 0x2f, 0xa1, 0x13, 0x85, 0xf7, 0x69, 0xdb, 0x4e, 0xc0, 0x33, 0xa5, 0x18, 0x8b, 0xff, 0x72, 0xe5, 0x59, 0xcc, 0x40, 0xb4, 0x28, 0x9c, 0x10, 0x85, 0xf9, 0x6e, 0xe3, 0x58, 0xcd, 0x42, 0xb7, 0x2c, 0xa2, 0x18, 0x8d, 0x03, 0x79, 0xef, 0x66, 0xdc, 0x53, 0xc9, 0x40, 0xb7, 0x2e, 0xa5, 0x1c, 0x94, 0x0b, 0x83, 0xfb, 0x73, 0xeb, 0x63, 0xdb, 0x53, 0xcc, 0x44, 0xbd, 0x36, 0xaf, 0x28, 0xa2, 0x1b, 0x94, 0x0e, 0x88, 0x02, 0x7c, 0xf6, 0x70, 0xeb, 0x65, 0xe0, 0x5a, 0xd5, 0x50, 0xcc, 0x47, 0xc2, 0x3e, 0xb9, 0x35, 0xb1, 0x2d, 0xa9, 0x25, 0xa2, 0x1e, 0x9b, 0x18, 0x95, 0x12, 0x8f, 0x0c, 0x89, 0x07, 0x85, 0x02, 0x80, 0xfe, 0x7c, 0xfb, 0x79, 0xf8, 0x76, 0xf5, 0x74, 0xf3, 0x72, 0xf1, 0x71, 0xf0, 0x70, 0xf0, 0x70, 0xf0, 0x70, 0xf0, 0x70, 0xf1, 0x71, 0xf2, 0x73, 0xf4, 0x75, 0xf7, 0x78, 0xf9, 0x7b, 0xfd, 0x7f, 0x01, 0x83, 0x05, 0x88, 0x0a, 0x8d, 0x0f, 0x92, 0x15, 0x99, 0x1c, 0x9f, 0x23, 0xa6, 0x2a, 0xae, 0x32, 0xb6, 0x3a, 0xbf, 0x43, 0xc8, 0x4d, 0xd2, 0x57, 0xdc, 0x61, 0xe6, 0x6c, 0xf2, 0x77, 0xfd, 0x83, 0x09, 0x90, 0x16, 0x9d, 0x23, 0xaa, 0x31, 0xb8, 0x3f, 0xc6, 0x4e, 0xd5, 0x5d, 0xe5, 0x6d, 0xf5, 0x7d, 0x05, 0x8d, 0x16, 0x9e, 0x27, 0xb0, 0x39, 0xc2, 0x4c, 0xd5, 0x5e, 0xe8, 0x72, 0xfc, 0x86, 0x10, 0x9a, 0x25, 0xaf, 0x3a, 0xc4, 0x4f, 0xda, 0x66, 0xf1, 0x7c, 0x08, 0x93, 0x1f, 0xab, 0x37, 0xc3, 0x4f, 0xdc, 0x68, 0xf5, 0x82, 0x0f, 0x9c, 0x29, 0xb6, 0x43, 0xd1, 0x5f, 0xec, 0x7a, 0x08, 0x96, 0x25, 0xb3, 0x42, 0xd0, 0x5f, 0xee, 0x7d, 0x0c, 0x9b, 0x2b, 0xba, 0x4a, 0xda, 0x6a, 0xfa, 0x8a, 0x1a, 0xaa, 0x3b, 0xcb, 0x5c, 0xed, 0x7e, 0x0f, 0xa1, 0x32, 0xc3, 0x55, 0xe7, 0x79, 0x0b, 0x9d, 0x2f, 0xc2, 0x54, 0xe7, 0x79, 0x0c, 0x9f, 0x33, 0xc6, 0x59, 0xed, 0x80, 0x14, 0xa8, 0x3c, 0xd0, 0x64, 0xf9, 0x8d, 0x22, 0xb7, 0x4c, 0xe1, 0x76, 0x0b, 0xa0, 0x36, 0xcc, 0x61, 0xf7, 0x8d, 0x23, 0xba, 0x50, 0xe7, 0x7d, 0x14, 0xab, 0x42, 0xd9, 0x70, 0x08, 0x9f, 0x37, 0xcf, 0x67, 0xff, 0x97, 0x2f, 0xc7, 0x60, 0xf8, 0x91, 0x2a, 0xc3, 0x5c, 0xf6, 0x8f, 0x28, 0xc2, 0x5c, 0xf6, 0x90, 0x2a, 0xc4, 0x5f, 0xf9, 0x94, 0x2e, 0xc9, 0x64, 0x00, 0x9b, 0x36, 0xd2, 0x6d, 0x09, 0xa5, 0x41, 0xdd, 0x79, 0x16, 0xb2, 0x4f, 0xec, 0x89, 0x26, 0xc3, 0x60, 0xfd, 0x9b, 0x39, 0xd6, 0x74, 0x12, 0xb0, 0x4f, 0xed, 0x8c, 0x2a, 0xc9, 0x68, 0x07, 0xa6, 0x45, 0xe5, 0x84, 0x24, 0xc4, 0x64, 0x04, 0xa4, 0x44, 0xe4, 0x85, 0x25, 0xc6, 0x67, 0x08, 0xa9, 0x4b, 0xec, 0x8d, 0x2f, 0xd1, 0x73, 0x15, 0xb7, 0x59, 0xfc, 0x9e, 0x41, 0xe3, 0x86, 0x29, 0xcd, 0x70, 0x13, 0xb7, 0x5a, 0xfe, 0xa2, 0x46, 0xea, 0x8e, 0x33, 0xd7, 0x7c, 0x21, 0xc6, 0x6b, 0x10, 0xb5, 0x5a, 0x00, 0xa6, 0x4b, 0xf1, 0x97, 0x3d, 0xe4, 0x8a, 0x31, 0xd7, 0x7e, 0x25, 0xcc, 0x73, 0x1a, 0xc2, 0x69, 0x11, 0xb9, 0x61, 0x09, 0xb1, 0x59, 0x01, 0xaa, 0x52, 0xfb, 0xa4, 0x4d, 0xf6, 0xa0, 0x49, 0xf2, 0x9c, 0x46, 0xf0, 0x9a, 0x44, 0xee, 0x99, 0x43, 0xee, 0x98, 0x43, 0xee, 0x9a, 0x45, 0xf0, 0x9c, 0x47, 0xf3, 0x9f, 0x4b, 0xf7, 0xa3, 0x50, 0xfc, 0xa9, 0x56, 0x03, 0xb0, 0x5d, 0x0a, 0xb7, 0x65, 0x13, 0xc0, 0x6e, 0x1c, 0xca, 0x79, 0x27, 0xd6, 0x84, 0x33, 0xe2, 0x91, 0x40, 0xef, 0x9f, 0x4e, 0xfe, 0xae, 0x5e, 0x0e, 0xbe, 0x6e, 0x1e, 0xcf, 0x7f, 0x30, 0xe1, 0x92, 0x43, 0xf5, 0xa6, 0x57, 0x09, 0xbb, 0x6d, 0x1f, 0xd1, 0x83, 0x36, 0xe8, 0x9b, 0x4d, 0x00, 0xb3, 0x67, 0x1a, 0xcd, 0x81, 0x34, 0xe8, 0x9c, 0x50, 0x04, 0xb8, 0x6d, 0x21, 0xd6, 0x8b, 0x40, 0xf5, 0xaa, 0x5f, 0x14, 0xca, 0x80, 0x35, 0xeb, 0xa1, 0x57, 0x0e, 0xc4, 0x7b, 0x31, 0xe8, 0x9f, 0x56, 0x0d, 0xc4, 0x7c, 0x33, 0xeb, 0xa3, 0x5b, 0x13, 0xcb, 0x83, 0x3b, 0xf4, 0xac, 0x65, 0x1e, 0xd7, 0x90, 0x4a, 0x03, 0xbc, 0x76, 0x30, 0xea, 0xa4, 0x5e, 0x18, 0xd3, 0x8d, 0x48, 0x02, 0xbd, 0x78, 0x34, 0xef, 0xaa, 0x66, 0x21, 0xdd, 0x99, 0x55, 0x11, 0xcd, 0x8a, 0x46, 0x03, 0xc0, 0x7d, 0x3a, 0xf7, 0xb4, 0x71, 0x2f, 0xed, 0xaa, 0x68, 0x26, 0xe4, 0xa3, 0x61, 0x20, 0xde, 0x9d, 0x5c, 0x1b, 0xda, 0x99, 0x59, 0x18, 0xd8, 0x98, 0x58, 0x18, 0xd8, 0x98, 0x58, 0x19, 0xd9, 0x9a, 0x5b, 0x1c, 0xdd, 0x9f, 0x60, 0x21, 0xe3, 0xa5, 0x67, 0x29, 0xeb, 0xad, 0x70, 0x32, 0xf5, 0xb7, 0x7a, 0x3d, 0x01, 0xc4, 0x87, 0x4b, 0x0e, 0xd2, 0x96, 0x5a, 0x1e, 0xe2, 0xa7, 0x6b, 0x30, 0xf5, 0xba, 0x7f, 0x44, 0x09, 0xce, 0x94, 0x5a, 0x1f, 0xe5, 0xab, 0x71, 0x38, 0xfe, 0xc5, 0x8b, 0x52, 0x19, 0xe0, 0xa7, 0x6e, 0x36, 0xfd, 0xc5, 0x8d, 0x55, 0x1d, 0xe5, 0xad, 0x75, 0x3e, 0x06, 0xcf, 0x98, 0x61, 0x2a, 0xf4, 0xbd, 0x86, 0x50, 0x1a, 0xe4, 0xae, 0x78, 0x42, 0x0d, 0xd7, 0xa2, 0x6c, 0x37, 0x02, 0xce, 0x99, 0x64, 0x30, 0xfb, 0xc7, 0x93, 0x5f, 0x2b, 0xf7, 0xc4, 0x90, 0x5d, 0x2a, 0xf7, 0xc4, 0x91, 0x5e, 0x2b, 0xf9, 0xc7, 0x94, 0x62, 0x30, 0xfe, 0xcd, 0x9b, 0x6a, 0x38, 0x07, 0xd6, 0xa5, 0x74, 0x43, 0x13, 0xe2, 0xb2, 0x82, 0x52, 0x22, 0xf2, 0xc2, 0x92, 0x63, 0x33, 0x04, 0xd5, 0xa6, 0x77, 0x49, 0x1a, 0xeb, 0xbd, 0x8f, 0x61, 0x33, 0x05, 0xd7, 0xaa, 0x7c, 0x4f, 0x21, 0xf4, 0xc7, 0x9b, 0x6e, 0x41, 0x15, 0xe8, 0xbc, 0x90, 0x64, 0x38, 0x0c, 0xe1, 0xb5, 0x8a, 0x5f, 0x34, 0x09, 0xde, 0xb3, 0x88, 0x5e, 0x34, 0x09, 0xdf, 0xb5, 0x8b, 0x62, 0x38, 0x0f, 0xe5, 0xbc, 0x93, 0x6a, 0x41, 0x18, 0xf0, 0xc7, 0x9f, 0x77, 0x4f, 0x27, 0xff, 0xd7, 0xaf, 0x88, 0x60, 0x39, 0x12, 0xeb, 0xc4, 0x9e, 0x77, 0x50, 0x2a, 0x04, 0xde, 0xb8, 0x92, 0x6c, 0x47, 0x21, 0xfc, 0xd6, 0xb1, 0x8c, 0x68, 0x43, 0x1e, 0xfa, 0xd5, 0xb1, 0x8d, 0x69, 0x45, 0x21, 0xfe, 0xda, 0xb7, 0x94, 0x71, 0x4e, 0x2b, 0x08, 0xe5, 0xc3, 0xa1, 0x7e, 0x5c, 0x3a, 0x18, 0xf7, 0xd5, 0xb4, 0x92, 0x71, 0x50, 0x2f, 0x0e, 0xed, 0xcd, 0xac, 0x8c, 0x6c, 0x4c, 0x2c, 0x0c, 0xec, 0xcc, 0xad, 0x8d, 0x6e, 0x4f, 0x30, 0x11, 0xf3, 0xd4, 0xb5, 0x97, 0x79, 0x5b, 0x3d, 0x1f, 0x01, 0xe4, 0xc6, 0xa9, 0x8b, 0x6e, 0x51, 0x35, 0x18, 0xfb, 0xdf, 0xc2, 0xa6, 0x8a, 0x6e, 0x52, 0x36, 0x1b, 0xff, 0xe4, 0xc9, 0xae, 0x93, 0x78, 0x5d, 0x42, 0x28, 0x0e, 0xf3, 0xd9, 0xbf, 0xa5, 0x8c, 0x72, 0x59, 0x3f, 0x26, 0x0d, 0xf4, 0xdb, 0xc2, 0xaa, 0x91, 0x79, 0x61, 0x49, 0x31, 0x19, 0x01, 0xe9, 0xd2, 0xba, 0xa3, 0x8c, 0x75, 0x5e, 0x48, 0x31, 0x1a, 0x04, 0xee, 0xd8, 0xc2, 0xac, 0x96, 0x81, 0x6b, 0x56, 0x40, 0x2b, 0x16, 0x02, 0xed, 0xd8, 0xc4, 0xaf, 0x9b, 0x87, 0x73, 0x5f, 0x4b, 0x38, 0x24, 0x11, 0xfe, 0xeb, 0xd8, 0xc5, 0xb2, 0x9f, 0x8d, 0x7b, 0x68, 0x56, 0x44, 0x32, 0x21, 0x0f, 0xfe, 0xec, 0xdb, 0xca, 0xb9, 0xa8, 0x97, 0x87, 0x76, 0x66, 0x56, 0x46, 0x36, 0x26, 0x16, 0x06, 0xf7, 0xe7, 0xd8, 0xc9, 0xba, 0xab, 0x9d, 0x8e, 0x7f, 0x71, 0x63, 0x55, 0x47, 0x39, 0x2b, 0x1e, 0x10, 0x03, 0xf5, 0xe8, 0xdb, 0xcf, 0xc2, 0xb5, 0xa9, 0x9c, 0x90, 0x84, 0x78, 0x6c, 0x60, 0x55, 0x49, 0x3e, 0x33, 0x28, 0x1d, 0x12, 0x07, 0xfc, 0xf2, 0xe8, 0xdd, 0xd3, 0xc9, 0xbf, 0xb6, 0xac, 0xa3, 0x99, 0x90, 0x87, 0x7e, 0x75, 0x6c, 0x64, 0x5b, 0x53, 0x4b, 0x43, 0x3b, 0x33, 0x2b, 0x23, 0x1c, 0x14, 0x0d, 0x06, 0xff, 0xf8, 0xf2, 0xeb, 0xe4, 0xde, 0xd8, 0xd2, 0xcc, 0xc6, 0xc0, 0xbb, 0xb5, 0xb0, 0xaa, 0xa5, 0xa0, 0x9c, 0x97, 0x92, 0x8e, 0x89, 0x85, 0x81, 0x7d, 0x79, 0x75, 0x72, 0x6e, 0x6b, 0x68, 0x65, 0x62, 0x5f, 0x5c, 0x59, 0x57, 0x55, 0x52, 0x50, 0x4e, 0x4c, 0x4b, 0x49, 0x48, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x41, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4b, 0x4d, 0x4f, 0x51, 0x53, 0x55, 0x58, 0x5a, 0x5d, 0x5f, 0x62, 0x65, 0x69, 0x6c, 0x6f, 0x73, 0x76, 0x7a, 0x7e, 0x82, 0x86, 0x8a, 0x8f, 0x93, 0x98, 0x9d, 0xa2, 0xa7, 0xac, 0xb1, 0xb6, 0xbc, 0xc2, 0xc7, 0xcd, 0xd3, 0xd9, 0xe0, 0xe6, 0xed, 0xf3, 0xfa, 0x01, 0x08, 0x0f, 0x16, 0x1e, 0x25, 0x2d, 0x35, 0x3d, 0x45, 0x4d, 0x55, 0x5d, 0x66, 0x6e, 0x77, 0x80, 0x89, 0x92, 0x9c, 0xa5, 0xae, 0xb8, 0xc2, 0xcc, 0xd6, 0xe0, 0xea, 0xf5, 0xff, 0x0a, 0x14, 0x1f, 0x2a, 0x36, 0x41, 0x4c, 0x58, 0x63, 0x6f, 0x7b, 0x87, 0x93, 0x9f, 0xac, 0xb8, 0xc5, 0xd2, 0xdf, 0xec, 0xf9, 0x06, 0x13, 0x21, 0x2f, 0x3c, 0x4a, 0x58, 0x66, 0x75, 0x83, 0x92, 0xa0, 0xaf, 0xbe, 0xcd, 0xdc, 0xeb, 0xfb, 0x0a, 0x1a, 0x2a, 0x3a, 0x4a, 0x5a, 0x6a, 0x7a, 0x8b, 0x9b, 0xac, 0xbd, 0xce, 0xdf, 0xf1, 0x02, 0x13, 0x25, 0x37, 0x49, 0x5b, 0x6d, 0x7f, 0x92, 0xa4, 0xb7, 0xc9, 0xdc, 0xef, 0x03, 0x16, 0x29, 0x3d, 0x50, 0x64, 0x78, 0x8c, 0xa0, 0xb4, 0xc9, 0xdd, 0xf2, 0x07, 0x1c, 0x31, 0x46, 0x5b, 0x70, 0x86, 0x9c, 0xb1, 0xc7, 0xdd, 0xf3, 0x0a, 0x20, 0x37, 0x4d, 0x64, 0x7b, 0x92, 0xa9, 0xc0, 0xd8, 0xef, 0x07, 0x1f, 0x37, 0x4f, 0x67, 0x7f, 0x97, 0xb0, 0xc8, 0xe1, 0xfa, 0x13, 0x2c, 0x46, 0x5f, 0x78, 0x92, 0xac, 0xc6, 0xe0, 0xfa, 0x14, 0x2f, 0x49, 0x64, 0x7e, 0x99, 0xb4, 0xd0, 0xeb, 0x06, 0x22, 0x3d, 0x59, 0x75, 0x91, 0xad, 0xc9, 0xe6, 0x02, 0x1f, 0x3c, 0x59, 0x76, 0x93, 0xb0, 0xcd, 0xeb, 0x09, 0x26, 0x44, 0x62, 0x80, 0x9f, 0xbd, 0xdc, 0xfa, 0x19, 0x38, 0x57, 0x76, 0x95, 0xb5, 0xd4, 0xf4, 0x14, 0x34, 0x54, 0x74, 0x94, 0xb4, 0xd5, 0xf5, 0x16, 0x37, 0x58, 0x79, 0x9b, 0xbc, 0xdd, 0xff, 0x21, 0x43, 0x65, 0x87, 0xa9, 0xcc, 0xee, 0x11, 0x33, 0x56, 0x79, 0x9d, 0xc0, 0xe3, 0x07, 0x2a, 0x4e, 0x72, 0x96, 0xba, 0xde, 0x03, 0x27, 0x4c, 0x71, 0x96, 0xbb, 0xe0, 0x05, 0x2a, 0x50, 0x76, 0x9b, 0xc1, 0xe7, 0x0d, 0x34, 0x5a, 0x81, 0xa7, 0xce, 0xf5, 0x1c, 0x43, 0x6a, 0x92, 0xb9, 0xe1, 0x09, 0x31, 0x59, 0x81, 0xa9, 0xd1, 0xfa, 0x22, 0x4b, 0x74, 0x9d, 0xc6, 0xf0, 0x19, 0x42, 0x6c, 0x96, 0xc0, 0xea, 0x14, 0x3e, 0x69, 0x93, 0xbe, 0xe8, 0x13, 0x3e, 0x6a, 0x95, 0xc0, 0xec, 0x17, 0x43, 0x6f, 0x9b, 0xc7, 0xf3, 0x20, 0x4c, 0x79, 0xa6, 0xd3, 0x00, 0x2d, 0x5a, 0x87, 0xb5, 0xe3, 0x10, 0x3e, 0x6c, 0x9a, 0xc9, 0xf7, 0x26, 0x54, 0x83, 0xb2, 0xe1, 0x10, 0x3f, 0x6f, 0x9e, 0xce, 0xfe, 0x2e, 0x5e, 0x8e, 0xbe, 0xee, 0x1f, 0x4f, 0x80, 0xb1, 0xe2, 0x13, 0x45, 0x76, 0xa7, 0xd9, 0x0b, 0x3d, 0x6f, 0xa1, 0xd3, 0x06, 0x38, 0x6b, 0x9d, 0xd0, 0x03, 0x37, 0x6a, 0x9d, 0xd1, 0x04, 0x38, 0x6c, 0xa0, 0xd4, 0x08, 0x3d, 0x71, 0xa6, 0xdb, 0x10, 0x45, 0x7a, 0xaf, 0xe4, 0x1a, 0x50, 0x85, 0xbb, 0xf1, 0x27, 0x5e, 0x94, 0xcb, 0x01, 0x38, 0x6f, 0xa6, 0xdd, 0x14, 0x4c, 0x83, 0xbb, 0xf3, 0x2b, 0x63, 0x9b, 0xd3, 0x0b, 0x44, 0x7c, 0xb5, 0xee, 0x27, 0x60, 0x9a, 0xd3, 0x0c, 0x46, 0x80, 0xba, 0xf4, 0x2e, 0x68, 0xa3, 0xdd, 0x18, 0x52, 0x8d, 0xc8, 0x04, 0x3f, 0x7a, 0xb6, 0xf1, 0x2d, 0x69, 0xa5, 0xe1, 0x1d, 0x5a, 0x96, 0xd3, 0x10, 0x4d, 0x8a, 0xc7, 0x04, 0x41, 0x7f, 0xbd, 0xfa, 0x38, 0x76, 0xb4, 0xf3, 0x31, 0x70, 0xae, 0xed, 0x2c, 0x6b, 0xaa, 0xe9, 0x29, 0x68, 0xa8, 0xe8, 0x28, 0x68, 0xa8, 0xe8, 0x28, 0x69, 0xa9, 0xea, 0x2b, 0x6c, 0xad, 0xef, 0x30, 0x71, 0xb3, 0xf5, 0x37, 0x79, 0xbb, 0xfd, 0x40, 0x82, 0xc5, 0x07, 0x4a, 0x8d, 0xd1, 0x14, 0x57, 0x9b, 0xde, 0x22, 0x66, 0xaa, 0xee, 0x32, 0x77, 0xbb, 0x00, 0x45, 0x8a, 0xcf, 0x14, 0x59, 0x9e, 0xe4, 0x2a, 0x6f, 0xb5, 0xfb, 0x41, 0x88, 0xce, 0x15, 0x5b, 0xa2, 0xe9, 0x30, 0x77, 0xbe, 0x06, 0x4d, 0x95, 0xdd, 0x25, 0x6d, 0xb5, 0xfd, 0x45, 0x8e, 0xd6, 0x1f, 0x68, 0xb1, 0xfa, 0x44, 0x8d, 0xd6, 0x20, 0x6a, 0xb4, 0xfe, 0x48, 0x92, 0xdd, 0x27, 0x72, 0xbc, 0x07, 0x52, 0x9e, 0xe9, 0x34, 0x80, 0xcb, 0x17, 0x63, 0xaf, 0xfb, 0x47, 0x94, 0xe0, 0x2d, 0x7a, 0xc7, 0x14, 0x61, 0xae, 0xfb, 0x49, 0x97, 0xe4, 0x32, 0x80, 0xce, 0x1d, 0x6b, 0xba, 0x08, 0x57, 0xa6, 0xf5, 0x44, 0x93, 0xe3, 0x32, 0x82, 0xd2, 0x22, 0x72, 0xc2, 0x12, 0x62, 0xb3, 0x03, 0x54, 0xa5, 0xf6, 0x47, 0x99, 0xea, 0x3b, 0x8d, 0xdf, 0x31, 0x83, 0xd5, 0x27, 0x7a, 0xcc, 0x1f, 0x71, 0xc4, 0x17, 0x6b, 0xbe, 0x11, 0x65, 0xb8, 0x0c, 0x60, 0xb4, 0x08, 0x5c, 0xb1, 0x05, 0x5a, 0xaf, 0x04, 0x59, 0xae, 0x03, 0x58, 0xae, 0x04, 0x59, 0xaf, 0x05, 0x5b, 0xb2, 0x08, 0x5f, 0xb5, 0x0c, 0x63, 0xba, 0x11, 0x68, 0xc0, 0x17, 0x6f, 0xc7, 0x1f, 0x77, 0xcf, 0x27, 0x7f, 0xd8, 0x30, 0x89, 0xe2, 0x3b, 0x94, 0xee, 0x47, 0xa0, 0xfa, 0x54, 0xae, 0x08, 0x62, 0xbc, 0x17, 0x71, 0xcc, 0x26, 0x81, 0xdc, 0x38, 0x93, 0xee, 0x4a, 0xa5, 0x01, 0x5d, 0xb9, 0x15, 0x71, 0xce, 0x2a, 0x87, 0xe4, 0x41, 0x9e, 0xfb, 0x58, 0xb5, 0x13, 0x71, 0xce, 0x2c, 0x8a, 0xe8, 0x47, 0xa5, 0x04, 0x62, 0xc1, 0x20, 0x7f, 0xde, 0x3d, 0x9d, 0xfc, 0x5c, 0xbc, 0x1c, 0x7c, 0xdc, 0x3c, 0x9c, 0xfd, 0x5d, 0xbe, 0x1f, 0x80, 0xe1, 0x43, 0xa4, 0x05, 0x67, 0xc9, 0x2b, 0x8d, 0xef, 0x51, 0xb4, 0x16, 0x79, 0xdb, 0x3e, 0xa1, 0x05, 0x68, 0xcb, 0x2f, 0x92, 0xf6, 0x5a, 0xbe, 0x22, 0x86, 0xeb, 0x4f, 0xb4, 0x19, 0x7e, 0xe3, 0x48, 0xad, 0x12, 0x78, 0xde, 0x43, 0xa9, 0x0f, 0x75, 0xdc, 0x42, 0xa9, 0x0f, 0x76, 0xdd, 0x44, 0xab, 0x12, 0x7a, 0xe1, 0x49, 0xb1, 0x19, 0x81, 0xe9, 0x51, 0xb9, 0x22, 0x8a, 0xf3, 0x5c, 0xc5, 0x2e, 0x98, 0x01, 0x6a, 0xd4, 0x3e, 0xa8, 0x12, 0x7c, 0xe6, 0x51, 0xbb, 0x26, 0x90, 0xfb, 0x66, 0xd2, 0x3d, 0xa8, 0x14, 0x7f, 0xeb, 0x57, 0xc3, 0x2f, 0x9b, 0x08, 0x74, 0xe1, 0x4e, 0xbb, 0x28, 0x95, 0x02, 0x6f, 0xdd, 0x4b, 0xb8, 0x26, 0x94, 0x02, 0x71, 0xdf, 0x4e, 0xbc, 0x2b, 0x9a, 0x09, 0x78, 0xe7, 0x57, 0xc6, 0x36, 0xa6, 0x16, 0x86, 0xf6, 0x66, 0xd6, 0x47, 0xb7, 0x28, 0x99, 0x0a, 0x7b, 0xed, 0x5e, 0xcf, 0x41, 0xb3, 0x25, 0x97, 0x09, 0x7b, 0xee, 0x60, 0xd3, 0x45, 0xb8, 0x2b, 0x9f, 0x12, 0x85, 0xf9, 0x6c, 0xe0, 0x54, 0xc8, 0x3c, 0xb0, 0x25, 0x99, 0x0e, 0x83, 0xf8, 0x6d, 0xe2, 0x57, 0xcc, 0x42, 0xb8, 0x2d, 0xa3, 0x19, 0x8f, 0x06, 0x7c, 0xf3, 0x69, 0xe0, 0x57, 0xce, 0x45, 0xbc, 0x34, 0xab, 0x23, 0x9b, 0x13, 0x8b, 0x03, 0x7b, 0xf3, 0x6c, 0xe4, 0x5d, 0xd6, 0x4f, 0xc8, 0x42, 0xbb, 0x34, 0xae, 0x28, 0xa2, 0x1c, 0x96, 0x10, 0x8b, 0x05, 0x80, 0xfa, 0x75, 0xf0, 0x6c, 0xe7, 0x62, 0xde, 0x59, 0xd5, 0x51, 0xcd, 0x49, 0xc5, 0x42, 0xbe, 0x3b, 0xb8, 0x35, 0xb2, 0x2f, 0xac, 0x29, 0xa7, 0x25, 0xa2, 0x20, 0x9e, 0x1c, 0x9b, 0x19, 0x98, 0x16, 0x95, 0x14, 0x93, 0x12, 0x91, 0x11, 0x90, 0x10, 0x90, 0x10, 0x90, 0x10, 0x90, 0x10, 0x91, 0x11, 0x92, 0x13, 0x94, 0x15, 0x97, 0x18, 0x99, 0x1b, 0x9d, 0x1f, 0xa1, 0x23, 0xa5, 0x28, 0xaa, 0x2d, 0xaf, 0x32, 0xb5, 0x39, 0xbc, 0x3f, 0xc3, 0x46, 0xca, 0x4e, 0xd2, 0x56, 0xda, 0x5f, 0xe3, 0x68, 0xed, 0x72, 0xf7, 0x7c, 0x01, 0x86, 0x0c, 0x92, 0x17, 0x9d, 0x23, 0xa9, 0x30, 0xb6, 0x3d, 0xc3, 0x4a, 0xd1, 0x58, 0xdf, 0x66, 0xee, 0x75, 0xfd, 0x85, 0x0d, 0x95, 0x1d, 0xa5, 0x2d, 0xb6, 0x3e, 0xc7, 0x50, 0xd9, 0x62, 0xec, 0x75, 0xfe, 0x88, 0x12, 0x9c, 0x26, 0xb0, 0x3a, 0xc5, 0x4f, 0xda, 0x64, 0xef, 0x7a, 0x06, 0x91, 0x1c, 0xa8, 0x33, 0xbf, 0x4b, 0xd7, 0x63, 0xef, 0x7c, 0x08, 0x95, 0x22, 0xaf, 0x3c, 0xc9, 0x56, 0xe3, 0x71, 0xff, 0x8c, 0x1a, 0xa8, 0x36, 0xc5, 0x53, 0xe2, 0x70, 0xff, 0x8e, 0x1d, 0xac, 0x3b, 0xcb, 0x5a, 0xea, 0x7a, 0x0a, 0x9a, 0x2a, 0xba, 0x4a, 0xdb, 0x6b, 0xfc, 0x8d, 0x1e, 0xaf, 0x41, 0xd2, 0x63, 0xf5, 0x87, 0x19, 0xab, 0x3d, 0xcf, 0x62, 0xf4, 0x87, 0x19, 0xac, 0x3f, 0xd3, 0x66, 0xf9, 0x8d, 0x20, 0xb4, 0x48, 0xdc, 0x70, 0x04, 0x99, 0x2d, 0xc2, 0x57, 0xec, 0x81, 0x16, 0xab, 0x40, 0xd6, 0x6c, 0x01, 0x97, 0x2d, 0xc3, 0x5a, 0xf0, 0x87, 0x1d, 0xb4, 0x4b, 0xe2, 0x79, 0x10, 0xa8, 0x3f, 0xd7, 0x6f, 0x07, 0x9f, 0x37, 0xcf, 0x67, 0x00, 0x98, 0x31, 0xca, 0x63, 0xfc, 0x96, 0x2f, 0xc8, 0x62, 0xfc, 0x96, 0x30, 0xca, 0x64, 0xff, 0x99, 0x34, 0xce, 0x69, 0x04, 0xa0, 0x3b, 0xd6, 0x72, 0x0d, 0xa9, 0x45, 0xe1, 0x7d, 0x19, 0xb6, 0x52, 0xef, 0x8c, 0x29, 0xc6, 0x63, 0x00, 0x9d, 0x3b, 0xd9, 0x76, 0x14, 0xb2, 0x50, 0xef, 0x8d, 0x2c, 0xca, 0x69, 0x08, 0xa7, 0x46, 0xe5, 0x85, 0x24, 0xc4, 0x64, 0x04, 0xa4, 0x44, 0xe4, 0x84, 0x25, 0xc5, 0x66, 0x07, 0xa8, 0x49, 0xeb, 0x8c, 0x2d, 0xcf, 0x71, 0x13, 0xb5, 0x57, 0xf9, 0x9c, 0x3e, 0xe1, 0x83, 0x26, 0xc9, 0x6d, 0x10, 0xb3, 0x57, 0xfa, 0x9e, 0x42, 0xe6, 0x8a, 0x2e, 0xd3, 0x77, 0x1c, 0xc1, 0x66, 0x0b, 0xb0, 0x55, 0xfa, 0xa0, 0x46, 0xeb, 0x91, 0x37, 0xdd, 0x84, 0x2a, 0xd1, 0x77, 0x1e, 0xc5, 0x6c, 0x13, 0xba, 0x62, 0x09, 0xb1, 0x59, 0x01, 0xa9, 0x51, 0xf9, 0xa1, 0x4a, 0xf2, 0x9b, 0x44, 0xed, 0x96, 0x40, 0xe9, 0x92, 0x3c, 0xe6, 0x90, 0x3a, 0xe4, 0x8e, 0x39, 0xe3, 0x8e, 0x38, 0xe3, 0x8e, 0x3a, 0xe5, 0x90, 0x3c, 0xe7, 0x93, 0x3f, 0xeb, 0x97, 0x43, 0xf0, 0x9c, 0x49, 0xf6, 0xa3, 0x50, 0xfd, 0xaa, 0x57, 0x05, 0xb3, 0x60, 0x0e, 0xbc, 0x6a, 0x19, 0xc7, 0x76, 0x24, 0xd3, 0x82, 0x31, 0xe0, 0x8f, 0x3f, 0xee, 0x9e, 0x4e, 0xfe, 0xae, 0x5e, 0x0e, 0xbe, 0x6f, 0x1f, 0xd0, 0x81, 0x32, 0xe3, 0x95, 0x46, 0xf7, 0xa9, 0x5b, 0x0d, 0xbf, 0x71, 0x23, 0xd6, 0x88, 0x3b, 0xed, 0xa0, 0x53, 0x07, 0xba, 0x6d, 0x21, 0xd4, 0x88, 0x3c, 0xf0, 0xa4, 0x58, 0x0d, 0xc1, 0x76, 0x2b, 0xe0, 0x95, 0x4a, 0xff, 0xb4, 0x6a, 0x20, 0xd5, 0x8b, 0x41, 0xf7, 0xae, 0x64, 0x1b, 0xd1, 0x88, 0x3f, 0xf6, 0xad, 0x64, 0x1c, 0xd3, 0x8b, 0x43, 0xfb, 0xb3, 0x6b, 0x23, 0xdb, 0x94, 0x4c, 0x05, 0xbe, 0x77, 0x30, 0xea, 0xa3, 0x5c, 0x16, 0xd0, 0x8a, 0x44, 0xfe, 0xb8, 0x73, 0x2d, 0xe8, 0xa2, 0x5d, 0x18, 0xd4, 0x8f, 0x4a, 0x06, 0xc1, 0x7d, 0x39, 0xf5, 0xb1, 0x6d, 0x2a, 0xe6, 0xa3, 0x60, 0x1d, 0xda, 0x97, 0x54, 0x11, 0xcf, 0x8d, 0x4a, 0x08, 0xc6, 0x84, 0x43, 0x01, 0xc0, 0x7e, 0x3d, 0xfc, 0xbb, 0x7a, 0x39, 0xf9, 0xb8, 0x78, 0x38, 0xf8, 0xb8, 0x78, 0x38, 0xf8, 0xb9, 0x79, 0x3a, 0xfb, 0xbc, 0x7d, 0x3f, 0x00, 0xc1, 0x83, 0x45, 0x07, 0xc9, 0x8b, 0x4d, 0x10, 0xd2, 0x95, 0x57, 0x1a, 0xdd, 0xa1, 0x64, 0x27, 0xeb, 0xae, 0x72, 0x36, 0xfa, 0xbe, 0x82, 0x47, 0x0b, 0xd0, 0x95, 0x5a, 0x1f, 0xe4, 0xa9, 0x6e, 0x34, 0xfa, 0xbf, 0x85, 0x4b, 0x11, 0xd8, 0x9e, 0x65, 0x2b, 0xf2, 0xb9, 0x80, 0x47, 0x0e, 0xd6, 0x9d, 0x65, 0x2d, 0xf5, 0xbd, 0x85, 0x4d, 0x15, 0xde, 0xa6, 0x6f, 0x38, 0x01, 0xca, 0x94, 0x5d, 0x26, 0xf0, 0xba, 0x84, 0x4e, 0x18, 0xe2, 0xad, 0x77, 0x42, 0x0c, 0xd7, 0xa2, 0x6e, 0x39, 0x04, 0xd0, 0x9b, 0x67, 0x33, 0xff, 0xcb, 0x97, 0x64, 0x30, 0xfd, 0xca, 0x97, 0x64, 0x31, 0xfe, 0xcb, 0x99, 0x67, 0x34, 0x02, 0xd0, 0x9e, 0x6d, 0x3b, 0x0a, 0xd8, 0xa7, 0x76, 0x45, 0x14, 0xe3, 0xb3, 0x82, 0x52, 0x22, 0xf2, 0xc2, 0x92, 0x62, 0x32, 0x03, 0xd3, 0xa4, 0x75, 0x46, 0x17, 0xe9, 0xba, 0x8b, 0x5d, 0x2f, 0x01, 0xd3, 0xa5, 0x77, 0x4a, 0x1c, 0xef, 0xc1, 0x94, 0x67, 0x3b, 0x0e, 0xe1, 0xb5, 0x88, 0x5c, 0x30, 0x04, 0xd8, 0xac, 0x81, 0x55, 0x2a, 0xff, 0xd4, 0xa9, 0x7e, 0x53, 0x28, 0xfe, 0xd4, 0xa9, 0x7f, 0x55, 0x2b, 0x02, 0xd8, 0xaf, 0x85, 0x5c, 0x33, 0x0a, 0xe1, 0xb8, 0x90, 0x67, 0x3f, 0x17, 0xef, 0xc7, 0x9f, 0x77, 0x4f, 0x28, 0x00, 0xd9, 0xb2, 0x8b, 0x64, 0x3e, 0x17, 0xf0, 0xca, 0xa4, 0x7e, 0x58, 0x32, 0x0c, 0xe7, 0xc1, 0x9c, 0x76, 0x51, 0x2c, 0x08, 0xe3, 0xbe, 0x9a, 0x75, 0x51, 0x2d, 0x09, 0xe5, 0xc1, 0x9e, 0x7a, 0x57, 0x34, 0x11, 0xee, 0xcb, 0xa8, 0x85, 0x63, 0x41, 0x1e, 0xfc, 0xda, 0xb8, 0x97, 0x75, 0x54, 0x32, 0x11, 0xf0, 0xcf, 0xae, 0x8d, 0x6d, 0x4c, 0x2c, 0x0c, 0xec, 0xcc, 0xac, 0x8c, 0x6c, 0x4d, 0x2d, 0x0e, 0xef, 0xd0, 0xb1, 0x93, 0x74, 0x55, 0x37, 0x19, 0xfb, 0xdd, 0xbf, 0xa1, 0x84, 0x66, 0x49, 0x2b, 0x0e, 0xf1, 0xd5, 0xb8, 0x9b, 0x7f, 0x62, 0x46, 0x2a, 0x0e, 0xf2, 0xd6, 0xbb, 0x9f, 0x84, 0x69, 0x4e, 0x33, 0x18, 0xfd, 0xe2, 0xc8, 0xae, 0x93, 0x79, 0x5f, 0x45, 0x2c, 0x12, 0xf9, 0xdf, 0xc6, 0xad, 0x94, 0x7b, 0x62, 0x4a, 0x31, 0x19, 0x01, 0xe9, 0xd1, 0xb9, 0xa1, 0x89, 0x72, 0x5a, 0x43, 0x2c, 0x15, 0xfe, 0xe8, 0xd1, 0xba, 0xa4, 0x8e, 0x78, 0x62, 0x4c, 0x36, 0x21, 0x0b, 0xf6, 0xe0, 0xcb, 0xb6, 0xa2, 0x8d, 0x78, 0x64, 0x4f, 0x3b, 0x27, 0x13, 0xff, 0xeb, 0xd8, 0xc4, 0xb1, 0x9e, 0x8b, 0x78, 0x65, 0x52, 0x3f, 0x2d, 0x1b, 0x08, 0xf6, 0xe4, 0xd2, 0xc1, 0xaf, 0x9e, 0x8c, 0x7b, 0x6a, 0x59, 0x48, 0x37, 0x27, 0x16, 0x06, 0xf6, 0xe6, 0xd6, 0xc6, 0xb6, 0xa6, 0x97, 0x87, 0x78, 0x69, 0x5a, 0x4b, 0x3d, 0x2e, 0x1f, 0x11, 0x03, 0xf5, 0xe7, 0xd9, 0xcb, 0xbe, 0xb0, 0xa3, 0x95, 0x88, 0x7b, 0x6f, 0x62, 0x55, 0x49, 0x3c, 0x30, 0x24, 0x18, 0x0c, 0x00, 0xf5, 0xe9, 0xde, 0xd3, 0xc8, 0xbd, 0xb2, 0xa7, 0x9c, 0x92, 0x88, 0x7d, 0x73, 0x69, 0x5f, 0x56, 0x4c, 0x43, 0x39, 0x30, 0x27, 0x1e, 0x15, 0x0c, 0x04, 0xfb, 0xf3, 0xeb, 0xe3, 0xdb, 0xd3, 0xcb, 0xc3, 0xbc, 0xb4, 0xad, 0xa6, 0x9f, 0x98, 0x92, 0x8b, 0x84, 0x7e, 0x78, 0x72, 0x6c, 0x66, 0x60, 0x5b, 0x55, 0x50, 0x4a, 0x45, 0x40, 0x3c, 0x37, 0x32, 0x2e, 0x29, 0x25, 0x21, 0x1d, 0x19, 0x15, 0x12, 0x0e, 0x0b, 0x08, 0x05, 0x02, 0xff, 0xfc, 0xf9, 0xf7, 0xf5, 0xf2, 0xf0, 0xee, 0xec, 0xeb, 0xe9, 0xe8, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe1, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe7, 0xe8, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfd, 0xff, 0x02, 0x05, 0x09, 0x0c, 0x0f, 0x13, 0x16, 0x1a, 0x1e, 0x22, 0x26, 0x2a, 0x2f, 0x33, 0x38, 0x3d, 0x42, 0x47, 0x4c, 0x51, 0x56, 0x5c, 0x62, 0x67, 0x6d, 0x73, 0x79, 0x80, 0x86, 0x8d, 0x93, 0x9a, 0xa1, 0xa8, 0xaf, 0xb6, 0xbe, 0xc5, 0xcd, 0xd5, 0xdd, 0xe5, 0xed, 0xf5, 0xfd, 0x06, 0x0e, 0x17, 0x20, 0x29, 0x32, 0x3c, 0x45, 0x4e, 0x58, 0x62, 0x6c, 0x76, 0x80, 0x8a, 0x95, 0x9f, 0xaa, 0xb4, 0xbf, 0xca, 0xd6, 0xe1, 0xec, 0xf8, 0x03, 0x0f, 0x1b, 0x27, 0x33, 0x3f, 0x4c, 0x58, 0x65, 0x72, 0x7f, 0x8c, 0x99, 0xa6, 0xb3, 0xc1, 0xcf, 0xdc, 0xea, 0xf8, 0x06, 0x15, 0x23, 0x32, 0x40, 0x4f, 0x5e, 0x6d, 0x7c, 0x8b, 0x9b, 0xaa, 0xba, 0xca, 0xda, 0xea, 0xfa, 0x0a, 0x1a, 0x2b, 0x3b, 0x4c, 0x5d, 0x6e, 0x7f, 0x91, 0xa2, 0xb3, 0xc5, 0xd7, 0xe9, 0xfb, 0x0d, 0x1f, 0x32, 0x44, 0x57, 0x69, 0x7c, 0x8f, 0xa3, 0xb6, 0xc9, 0xdd, 0xf0, 0x04, 0x18, 0x2c, 0x40, 0x54, 0x69, 0x7d, 0x92, 0xa7, 0xbc, 0xd1, 0xe6, 0xfb, 0x10, 0x26, 0x3c, 0x51, 0x67, 0x7d, 0x93, 0xaa, 0xc0, 0xd7, 0xed, 0x04, 0x1b, 0x32, 0x49, 0x60, 0x78, 0x8f, 0xa7, 0xbf, 0xd7, 0xef, 0x07, 0x1f, 0x37, 0x50, 0x68, 0x81, 0x9a, 0xb3, 0xcc, 0xe6, 0xff, 0x18, 0x32, 0x4c, 0x66, 0x80, 0x9a, 0xb4, 0xcf, 0xe9, 0x04, 0x1e, 0x39, 0x54, 0x70, 0x8b, 0xa6, 0xc2, 0xdd, 0xf9, 0x15, 0x31, 0x4d, 0x69, 0x86, 0xa2, 0xbf, 0xdc, 0xf9, 0x16, 0x33, 0x50, 0x6d, 0x8b, 0xa9, 0xc6, 0xe4, 0x02, 0x20, 0x3f, 0x5d, 0x7c, 0x9a, 0xb9, 0xd8, 0xf7, 0x16, 0x35, 0x55, 0x74, 0x94, 0xb4, 0xd4, 0xf4, 0x14, 0x34, 0x54, 0x75, 0x95, 0xb6, 0xd7, 0xf8, 0x19, 0x3b, 0x5c, 0x7d, 0x9f, 0xc1, 0xe3, 0x05, 0x27, 0x49, 0x6c, 0x8e, 0xb1, 0xd3, 0xf6, 0x19, 0x3d, 0x60, 0x83, 0xa7, 0xca, 0xee, 0x12, 0x36, 0x5a, 0x7e, 0xa3, 0xc7, 0xec, 0x11, 0x36, 0x5b, 0x80, 0xa5, 0xca, 0xf0, 0x16, 0x3b, 0x61, 0x87, 0xad, 0xd4, 0xfa, 0x21, 0x47, 0x6e, 0x95, 0xbc, 0xe3, 0x0a, 0x32, 0x59, 0x81, 0xa9, 0xd1, 0xf9, 0x21, 0x49, 0x71, 0x9a, 0xc2, 0xeb, 0x14, 0x3d, 0x66, 0x90, 0xb9, 0xe2, 0x0c, 0x36, 0x60, 0x8a, 0xb4, 0xde, 0x09, 0x33, 0x5e, 0x88, 0xb3, 0xde, 0x0a, 0x35, 0x60, 0x8c, 0xb7, 0xe3, 0x0f, 0x3b, 0x67, 0x93, 0xc0, 0xec, 0x19, 0x46, 0x73, 0xa0, 0xcd, 0xfa, 0x27, 0x55, 0x83, 0xb0, 0xde, 0x0c, 0x3a, 0x69, 0x97, 0xc6, 0xf4, 0x23, 0x52, 0x81, 0xb0, 0xdf, 0x0f, 0x3e, 0x6e, 0x9e, 0xce, 0xfe, 0x2e, 0x5e, 0x8e, 0xbf, 0xef, 0x20, 0x51, 0x82, 0xb3, 0xe5, 0x16, 0x47, 0x79, 0xab, 0xdd, 0x0f, 0x41, 0x73, 0xa6, 0xd8, 0x0b, 0x3d, 0x70, 0xa3, 0xd7, 0x0a, 0x3d, 0x71, 0xa4, 0xd8, 0x0c, 0x40, 0x74, 0xa8, 0xdd, 0x11, 0x46, 0x7b, 0xb0, 0xe5, 0x1a, 0x4f, 0x84, 0xba, 0xf0, 0x25, 0x5b, 0x91, 0xc7, 0xfe, 0x34, 0x6b, 0xa1, 0xd8, 0x0f, 0x46, 0x7d, 0xb4, 0xec, 0x23, 0x5b, 0x93, 0xcb, 0x03, 0x3b, 0x73, 0xab, 0xe4, 0x1c, 0x55, 0x8e, 0xc7, 0x00, 0x3a, 0x73, 0xac, 0xe6, 0x20, 0x5a, 0x94, 0xce, 0x08, 0x43, 0x7d, 0xb8, 0xf2, 0x2d, 0x68, 0xa4, 0xdf, 0x1a, 0x56, 0x91, 0xcd, 0x09, 0x45, 0x81, 0xbd, 0xfa, 0x36, 0x73, 0xb0, 0xed, 0x2a, 0x67, 0xa4, 0xe1, 0x1f, 0x5d, 0x9a, 0xd8, 0x16, 0x54, 0x93, 0xd1, 0x10, 0x4e, 0x8d, 0xcc, 0x0b, 0x4a, 0x89, 0xc9, 0x08, 0x48, 0x88, 0xc8, 0x08, 0x48, 0x88, 0xc8, 0x09, 0x49, 0x8a, 0xcb, 0x0c, 0x4d, 0x8f, 0xd0, 0x11, 0x53, 0x95, 0xd7, 0x19, 0x5b, 0x9d, 0xe0, 0x22, 0x65, 0xa7, 0xea, 0x2d, 0x71, 0xb4, 0xf7, 0x3b, 0x7e, 0xc2, 0x06, 0x4a, 0x8e, 0xd2, 0x17, 0x5b, 0xa0, 0xe5, 0x2a, 0x6f, 0xb4, 0xf9, 0x3e, 0x84, 0xca, 0x0f, 0x55, 0x9b, 0xe1, 0x28, 0x6e, 0xb5, 0xfb, 0x42, 0x89, 0xd0, 0x17, 0x5e, 0xa6, 0xed, 0x35, 0x7d, 0xc5, 0x0d, 0x55, 0x9d, 0xe5, 0x2e, 0x76, 0xbf, 0x08, 0x51, 0x9a, 0xe4, 0x2d, 0x76, 0xc0, 0x0a, 0x54, 0x9e, 0xe8, 0x32, 0x7d, 0xc7, 0x12, 0x5c, 0xa7, 0xf2, 0x3e, 0x89, 0xd4, 0x20, 0x6b, 0xb7, 0x03, 0x4f, 0x9b, 0xe7, 0x34, 0x80, 0xcd, 0x1a, 0x67, 0xb4, 0x01, 0x4e, 0x9b, 0xe9, 0x37, 0x84, 0xd2, 0x20, 0x6e, 0xbd, 0x0b, 0x5a, 0xa8, 0xf7, 0x46, 0x95, 0xe4, 0x33, 0x83, 0xd2, 0x22, 0x72, 0xc2, 0x12, 0x62, 0xb2, 0x02, 0x53, 0xa3, 0xf4, 0x45, 0x96, 0xe7, 0x39, 0x8a, 0xdb, 0x2d, 0x7f, 0xd1, 0x23, 0x75, 0xc7, 0x1a, 0x6c, 0xbf, 0x11, 0x64, 0xb7, 0x0b, 0x5e, 0xb1, 0x05, 0x58, 0xac, 0x00, 0x54, 0xa8, 0xfc, 0x51, 0xa5, 0xfa, 0x4f, 0xa4, 0xf9, 0x4e, 0xa3, 0xf8, 0x4e, 0xa4, 0xf9, 0x4f, 0xa5, 0xfb, 0x52, 0xa8, 0xff, 0x55, 0xac, 0x03, 0x5a, 0xb1, 0x08, 0x60, 0xb7, 0x0f, 0x67, 0xbf, 0x17, 0x6f, 0xc7, 0x1f, 0x78, 0xd0, 0x29, 0x82, 0xdb, 0x34, 0x8e, 0xe7, 0x40, 0x9a, 0xf4, 0x4e, 0xa8, 0x02, 0x5c, 0xb7, 0x11, 0x6c, 0xc6, 0x21, 0x7c, 0xd8, 0x33, 0x8e, 0xea, 0x45, 0xa1, 0xfd, 0x59, 0xb5, 0x11, 0x6e, 0xca, 0x27, 0x84, 0xe1, 0x3e, 0x9b, 0xf8, 0x55, 0xb3, 0x11, 0x6e, 0xcc, 0x2a, 0x88, 0xe7, 0x45, 0xa4, 0x02, 0x61, 0xc0, 0x1f, 0x7e, 0xdd, 0x3d, 0x9c, 0xfc, 0x5c, 0xbc, 0x1c, 0x7c, 0xdc, 0x3c, 0x9d, 0xfd, 0x5e, 0xbf, 0x20, 0x81, 0xe3, 0x44, 0xa5, 0x07, 0x69, 0xcb, 0x2d, 0x8f, 0xf1, 0x54, 0xb6, 0x19, 0x7b, 0xde, 0x41, 0xa5, 0x08, 0x6b, 0xcf, 0x32, 0x96, 0xfa, 0x5e, 0xc2, 0x26, 0x8b, 0xef, 0x54, 0xb9, 0x1e, 0x83, 0xe8, 0x4d, 0xb2, 0x18, 0x7e, 0xe3, 0x49, 0xaf, 0x15, 0x7c, 0xe2, 0x49, 0xaf, 0x16, 0x7d, 0xe4, 0x4b, 0xb2, 0x1a, 0x81, 0xe9, 0x51, 0xb9, 0x21, 0x89, 0xf1, 0x59, 0xc2, 0x2a, 0x93, 0xfc, 0x65, 0xce, 0x38, 0xa1, 0x0a, 0x74, 0xde, 0x48, 0xb2, 0x1c, 0x86, 0xf1, 0x5b, 0xc6, 0x30, 0x9b, 0x06, 0x72, 0xdd, 0x48, 0xb4, 0x1f, 0x8b, 0xf7, 0x63, 0xcf, 0x3b, 0xa8, 0x14, 0x81, 0xee, 0x5b, 0xc8, 0x35, 0xa2, 0x0f, 0x7d, 0xeb, 0x58, 0xc6, 0x34, 0xa2, 0x11, 0x7f, 0xee, 0x5c, 0xcb, 0x3a, 0xa9, 0x18, 0x87, 0xf7, 0x66, 0xd6, 0x46, 0xb6, 0x26, 0x96, 0x06, 0x76, 0xe7, 0x57, 0xc8, 0x39, 0xaa, 0x1b, 0x8d, 0xfe, 0x6f, 0xe1, 0x53, 0xc5, 0x37, 0xa9, 0x1b, 0x8e, 0x00, 0x73, 0xe5, 0x58, 0xcb, 0x3f, 0xb2, 0x25, 0x99, 0x0c, 0x80, 0xf4, 0x68, 0xdc, 0x50, 0xc5, 0x39, 0xae, 0x23, 0x98, 0x0d, 0x82, 0xf7, 0x6c, 0xe2, 0x58, 0xcd, 0x43, 0xb9, 0x2f, 0xa6, 0x1c, 0x93, 0x09, 0x80, 0xf7, 0x6e, 0xe5, 0x5c, 0xd4, 0x4b, 0xc3, 0x3b, 0xb3, 0x2b, 0xa3, 0x1b, 0x93, 0x0c, 0x84, 0xfd, 0x76, 0xef, 0x68, 0xe2, 0x5b, 0xd4, 0x4e, 0xc8, 0x42, 0xbc, 0x36, 0xb0, 0x2b, 0xa5, 0x20, 0x9a, 0x15, 0x90, 0x0c, 0x87, 0x02, 0x7e, 0xf9, 0x75, 0xf1, 0x6d, 0xe9, 0x65, 0xe2, 0x5e, 0xdb, 0x58, 0xd5, 0x52, 0xcf, 0x4c, 0xc9, 0x47, 0xc5, 0x42, 0xc0, 0x3e, 0xbc, 0x3b, 0xb9, 0x38, 0xb6, 0x35, 0xb4, 0x33, 0xb2, 0x31, 0xb1, 0x30, 0xb0, 0x30, 0xb0, 0x30, 0xb0, 0x30, 0xb0, 0x31, 0xb1, 0x32, 0xb3, 0x34, 0xb5, 0x37, 0xb8, 0x39, 0xbb, 0x3d, 0xbf, 0x41, 0xc3, 0x45, 0xc8, 0x4a, 0xcd, 0x4f, 0xd2, 0x55, 0xd9, 0x5c, 0xdf, 0x63, 0xe6, 0x6a, 0xee, 0x72, 0xf6, 0x7a, 0xff, 0x83, 0x08, 0x8d, 0x12, 0x97, 0x1c, 0xa1, 0x26, 0xac, 0x32, 0xb7, 0x3d, 0xc3, 0x49, 0xd0, 0x56, 0xdd, 0x63, 0xea, 0x71, 0xf8, 0x7f, 0x06, 0x8e, 0x15, 0x9d, 0x25, 0xad, 0x35, 0xbd, 0x45, 0xcd, 0x56, 0xde, 0x67, 0xf0, 0x79, 0x02, 0x8c, 0x15, 0x9e, 0x28, 0xb2, 0x3c, 0xc6, 0x50, 0xda, 0x65, 0xef, 0x7a, 0x04, 0x8f, 0x1a, 0xa6, 0x31, 0xbc, 0x48, 0xd3, 0x5f, 0xeb, 0x77, 0x03, 0x8f, 0x1c, 0xa8, 0x35, 0xc2, 0x4f, 0xdc, 0x69, 0xf6, 0x83, 0x11, 0x9f, 0x2c, 0xba, 0x48, 0xd6, 0x65, 0xf3, 0x82, 0x10, 0x9f, 0x2e, 0xbd, 0x4c, 0xdb, 0x6b, 0xfa, 0x8a, 0x1a, 0xaa, 0x3a, 0xca, 0x5a, 0xea, 0x7b, 0x0b, 0x9c, 0x2d, 0xbe, 0x4f, 0xe1, 0x72, 0x03, 0x95, 0x27, 0xb9, 0x4b, 0xdd, 0x6f, 0x02, 0x94, 0x27, 0xb9, 0x4c, 0xdf, 0x73, 0x06, 0x99, 0x2d, 0xc0, 0x54, 0xe8, 0x7c, 0x10, 0xa4, 0x39, 0xcd, 0x62, 0xf7, 0x8c, 0x21, 0xb6, 0x4b, 0xe0, 0x76, 0x0c, 0xa1, 0x37, 0xcd, 0x63, 0xfa, 0x90, 0x27, 0xbd, 0x54, 0xeb, 0x82, 0x19, 0xb0, 0x48, 0xdf, 0x77, 0x0f, 0xa7, 0x3f, 0xd7, 0x6f, 0x07, 0xa0, 0x38, 0xd1, 0x6a, 0x03, 0x9c, 0x36, 0xcf, 0x68, 0x02, 0x9c, 0x36, 0xd0, 0x6a, 0x04, 0x9f, 0x39, 0xd4, 0x6e, 0x09, 0xa4, 0x40, 0xdb, 0x76, 0x12, 0xad, 0x49, 0xe5, 0x81, 0x1d, 0xb9, 0x56, 0xf2, 0x8f, 0x2c, 0xc9, 0x66, 0x03, 0xa0, 0x3d, 0xdb, 0x79, 0x16, 0xb4, 0x52, 0xf0, 0x8f, 0x2d, 0xcc, 0x6a, 0x09, 0xa8, 0x47, 0xe6, 0x85, 0x25, 0xc4, 0x64, 0x04, 0xa4, 0x44, 0xe4, 0x84, 0x24, 0xc5, 0x65, 0x06, 0xa7, 0x48, 0xe9, 0x8b, 0x2c, 0xcd, 0x6f, 0x11, 0xb3, 0x55, 0xf7, 0x99, 0x3c, 0xde, 0x81, 0x23, 0xc6, 0x69, 0x0d, 0xb0, 0x53, 0xf7, 0x9a, 0x3e, 0xe2, 0x86, 0x2a, 0xce, 0x73, 0x17, 0xbc, 0x61, 0x06, 0xab, 0x50, 0xf5, 0x9a, 0x40, 0xe6, 0x8b, 0x31, 0xd7, 0x7d, 0x24, 0xca, 0x71, 0x17, 0xbe, 0x65, 0x0c, 0xb3, 0x5a, 0x02, 0xa9, 0x51, 0xf9, 0xa1, 0x49, 0xf1, 0x99, 0x41, 0xea, 0x92, 0x3b, 0xe4, 0x8d, 0x36, 0xe0, 0x89, 0x32, 0xdc, 0x86, 0x30, 0xda, 0x84, 0x2e, 0xd9, 0x83, 0x2e, 0xd8, 0x83, 0x2e, 0xda, 0x85, 0x30, 0xdc, 0x87, 0x33, 0xdf, 0x8b, 0x37, 0xe3, 0x90, 0x3c, 0xe9, 0x96, 0x43, 0xf0, 0x9d, 0x4a, 0xf7, 0xa5, 0x53, 0x00, 0xae, 0x5c, 0x0a, 0xb9, 0x67, 0x16, 0xc4, 0x73, 0x22, 0xd1, 0x80, 0x2f, 0xdf, 0x8e, 0x3e, 0xee, 0x9e, 0x4e, 0xfe, 0xae, 0x5e, 0x0f, 0xbf, 0x70, 0x21, 0xd2, 0x83, 0x35, 0xe6, 0x97, 0x49, 0xfb, 0xad, 0x5f, 0x11, 0xc3, 0x76, 0x28, 0xdb, 0x8d, 0x40, 0xf3, 0xa7, 0x5a, 0x0d, 0xc1, 0x74, 0x28, 0xdc, 0x90, 0x44, 0xf8, 0xad, 0x61, 0x16, 0xcb, 0x80, 0x35, 0xea, 0x9f, 0x54, 0x0a, 0xc0, 0x75, 0x2b, 0xe1, 0x97, 0x4e, 0x04, 0xbb, 0x71, 0x28, 0xdf, 0x96, 0x4d, 0x04, 0xbc, 0x73, 0x2b, 0xe3, 0x9b, 0x53, 0x0b, 0xc3, 0x7b, 0x34, 0xec, 0xa5, 0x5e, 0x17, 0xd0, 0x8a, 0x43, 0xfc, 0xb6, 0x70, 0x2a, 0xe4, 0x9e, 0x58, 0x13, 0xcd, 0x88, 0x42, 0xfd, 0xb8, 0x74, 0x2f, 0xea, 0xa6, 0x61, 0x1d, 0xd9, 0x95, 0x51, 0x0d, 0xca, 0x86, 0x43, 0x00, 0xbd, 0x7a, 0x37, 0xf4, 0xb1, 0x6f, 0x2d, 0xea, 0xa8, 0x66, 0x24, 0xe3, 0xa1, 0x60, 0x1e, 0xdd, 0x9c, 0x5b, 0x1a, 0xd9, 0x99, 0x58, 0x18, 0xd8, 0x98, 0x58, 0x18, 0xd8, 0x98, 0x59, 0x19, 0xda, 0x9b, 0x5c, 0x1d, 0xdf, 0xa0, 0x61, 0x23, 0xe5, 0xa7, 0x69, 0x2b, 0xed, 0xb0, 0x72, 0x35, 0xf7, 0xba, 0x7d, 0x41, 0x04, 0xc7, 0x8b, 0x4e, 0x12, 0xd6, 0x9a, 0x5e, 0x22, 0xe7, 0xab, 0x70, 0x35, 0xfa, 0xbf, 0x84, 0x49, 0x0e, 0xd4, 0x9a, 0x5f, 0x25, 0xeb, 0xb1, 0x78, 0x3e, 0x05, 0xcb, 0x92, 0x59, 0x20, 0xe7, 0xae, 0x76, 0x3d, 0x05, 0xcd, 0x95, 0x5d, 0x25, 0xed, 0xb5, 0x7e, 0x46, 0x0f, 0xd8, 0xa1, 0x6a, 0x34, 0xfd, 0xc6, 0x90, 0x5a, 0x24, 0xee, 0xb8, 0x82, 0x4d, 0x17, 0xe2, 0xac, 0x77, 0x42, 0x0e, 0xd9, 0xa4, 0x70, 0x3b, 0x07, 0xd3, 0x9f, 0x6b, 0x37, 0x04, 0xd0, 0x9d, 0x6a, 0x37, 0x04, 0xd1, 0x9e, 0x6b, 0x39, 0x07, 0xd4, 0xa2, 0x70, 0x3e, 0x0d, 0xdb, 0xaa, 0x78, 0x47, 0x16, 0xe5, 0xb4, 0x83, 0x53, 0x22, 0xf2, 0xc2, 0x92, 0x62, 0x32, 0x02, 0xd2, 0xa3, 0x73, 0x44, 0x15, 0xe6, 0xb7, 0x89, 0x5a, 0x2b, 0xfd, 0xcf, 0xa1, 0x73, 0x45, 0x17, 0xea, 0xbc, 0x8f, 0x61, 0x34, 0x07, 0xdb, 0xae, 0x81, 0x55, 0x28, 0xfc, 0xd0, 0xa4, 0x78, 0x4c, 0x21, 0xf5, 0xca, 0x9f, 0x74, 0x49, 0x1e, 0xf3, 0xc8, 0x9e, 0x74, 0x49, 0x1f, 0xf5, 0xcb, 0xa2, 0x78, 0x4f, 0x25, 0xfc, 0xd3, 0xaa, 0x81, 0x58, 0x30, 0x07, 0xdf, 0xb7, 0x8f, 0x67, 0x3f, 0x17, 0xef, 0xc8, 0xa0, 0x79, 0x52, 0x2b, 0x04, 0xde, 0xb7, 0x90, 0x6a, 0x44, 0x1e, 0xf8, 0xd2, 0xac, 0x87, 0x61, 0x3c, 0x16, 0xf1, 0xcc, 0xa8, 0x83, 0x5e, 0x3a, 0x15, 0xf1, 0xcd, 0xa9, 0x85, 0x61, 0x3e, 0x1a, 0xf7, 0xd4, 0xb1, 0x8e, 0x6b, 0x48, 0x25, 0x03, 0xe1, 0xbe, 0x9c, 0x7a, 0x58, 0x37, 0x15, 0xf4, 0xd2, 0xb1, 0x90, 0x6f, 0x4e, 0x2d, 0x0d, 0xec, 0xcc, 0xac, 0x8c, 0x6c, 0x4c, 0x2c, 0x0c, 0xed, 0xcd, 0xae, 0x8f, 0x70, 0x51, 0x33, 0x14, 0xf5, 0xd7, 0xb9, 0x9b, 0x7d, 0x5f, 0x41, 0x24, 0x06, 0xe9, 0xcb, 0xae, 0x91, 0x75, 0x58, 0x3b, 0x1f, 0x02, 0xe6, 0xca, 0xae, 0x92, 0x76, 0x5b, 0x3f, 0x24, 0x09, 0xee, 0xd3, 0xb8, 0x9d, 0x82, 0x68, 0x4e, 0x33, 0x19, 0xff, 0xe5, 0xcc, 0xb2, 0x99, 0x7f, 0x66, 0x4d, 0x34, 0x1b, 0x02, 0xea, 0xd1, 0xb9, 0xa1, 0x89, 0x71, 0x59, 0x41, 0x29, 0x12, 0xfa, 0xe3, 0xcc, 0xb5, 0x9e, 0x88, 0x71, 0x5a, 0x44, 0x2e, 0x18, 0x02, 0xec, 0xd6, 0xc1, 0xab, 0x96, 0x80, 0x6b, 0x56, 0x42, 0x2d, 0x18, 0x04, 0xef, 0xdb, 0xc7, 0xb3, 0x9f, 0x8b, 0x78, 0x64, 0x51, 0x3e, 0x2b, 0x18, 0x05, 0xf2, 0xdf, 0xcd, 0xbb, 0xa8, 0x96, 0x84, 0x72, 0x61, 0x4f, 0x3e, 0x2c, 0x1b, 0x0a, 0xf9, 0xe8, 0xd7, 0xc7, 0xb6, 0xa6, 0x96, 0x86, 0x76, 0x66, 0x56, 0x46, 0x37, 0x27, 0x18, 0x09, 0xfa, 0xeb, 0xdd, 0xce, 0xbf, 0xb1, 0xa3, 0x95, 0x87, 0x79, 0x6b, 0x5e, 0x50, 0x43, 0x35, 0x28, 0x1b, 0x0f, 0x02, 0xf5, 0xe9, 0xdc, 0xd0, 0xc4, 0xb8, 0xac, 0xa0, 0x95, 0x89, 0x7e, 0x73, 0x68, 0x5d, 0x52, 0x47, 0x3c, 0x32, 0x28, 0x1d, 0x13, 0x09, 0xff, 0xf6, 0xec, 0xe3, 0xd9, 0xd0, 0xc7, 0xbe, 0xb5, 0xac, 0xa4, 0x9b, 0x93, 0x8b, 0x83, 0x7b, 0x73, 0x6b, 0x63, 0x5c, 0x54, 0x4d, 0x46, 0x3f, 0x38, 0x32, 0x2b, 0x24, 0x1e, 0x18, 0x12, 0x0c, 0x06, 0x00, 0xfb, 0xf5, 0xf0, 0xea, 0xe5, 0xe0, 0xdc, 0xd7, 0xd2, 0xce, 0xc9, 0xc5, 0xc1, 0xbd, 0xb9, 0xb5, 0xb2, 0xae, 0xab, 0xa8, 0xa5, 0xa2, 0x9f, 0x9c, 0x99, 0x97, 0x95, 0x92, 0x90, 0x8e, 0x8c, 0x8b, 0x89, 0x88, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8b, 0x8d, 0x8f, 0x91, 0x93, 0x95, 0x98, 0x9a, 0x9d, 0x9f, 0xa2, 0xa5, 0xa9, 0xac, 0xaf, 0xb3, 0xb6, 0xba, 0xbe, 0xc2, 0xc6, 0xca, 0xcf, 0xd3, 0xd8, 0xdd, 0xe2, 0xe7, 0xec, 0xf1, 0xf6, 0xfc, 0x02, 0x07, 0x0d, 0x13, 0x19, 0x20, 0x26, 0x2d, 0x33, 0x3a, 0x41, 0x48, 0x4f, 0x56, 0x5e, 0x65, 0x6d, 0x75, 0x7d, 0x85, 0x8d, 0x95, 0x9d, 0xa6, 0xae, 0xb7, 0xc0, 0xc9, 0xd2, 0xdc, 0xe5, 0xee, 0xf8, 0x02, 0x0c, 0x16, 0x20, 0x2a, 0x35, 0x3f, 0x4a, 0x54, 0x5f, 0x6a, 0x76, 0x81, 0x8c, 0x98, 0xa3, 0xaf, 0xbb, 0xc7, 0xd3, 0xdf, 0xec, 0xf8, 0x05, 0x12, 0x1f, 0x2c, 0x39, 0x46, 0x53, 0x61, 0x6f, 0x7c, 0x8a, 0x98, 0xa6, 0xb5, 0xc3, 0xd2, 0xe0, 0xef, 0xfe, 0x0d, 0x1c, 0x2b, 0x3b, 0x4a, 0x5a, 0x6a, 0x7a, 0x8a, 0x9a, 0xaa, 0xba, 0xcb, 0xdb, 0xec, 0xfd, 0x0e, 0x1f, 0x31, 0x42, 0x53, 0x65, 0x77, 0x89, 0x9b, 0xad, 0xbf, 0xd2, 0xe4, 0xf7, 0x09, 0x1c, 0x2f, 0x43, 0x56, 0x69, 0x7d, 0x90, 0xa4, 0xb8, 0xcc, 0xe0, 0xf4, 0x09, 0x1d, 0x32, 0x47, 0x5c, 0x71, 0x86, 0x9b, 0xb0, 0xc6, 0xdc, 0xf1, 0x07, 0x1d, 0x33, 0x4a, 0x60, 0x77, 0x8d, 0xa4, 0xbb, 0xd2, 0xe9, 0x00, 0x18, 0x2f, 0x47, 0x5f, 0x77, 0x8f, 0xa7, 0xbf, 0xd7, 0xf0, 0x08, 0x21, 0x3a, 0x53, 0x6c, 0x86, 0x9f, 0xb8, 0xd2, 0xec, 0x06, 0x20, 0x3a, 0x54, 0x6f, 0x89, 0xa4, 0xbe, 0xd9, 0xf4, 0x10, 0x2b, 0x46, 0x62, 0x7d, 0x99, 0xb5, 0xd1, 0xed, 0x09, 0x26, 0x42, 0x5f, 0x7c, 0x99, 0xb6, 0xd3, 0xf0, 0x0d, 0x2b, 0x49, 0x66, 0x84, 0xa2, 0xc0, 0xdf, 0xfd, 0x1c, 0x3a, 0x59, 0x78, 0x97, 0xb6, 0xd5, 0xf5, 0x14, 0x34, 0x54, 0x74, 0x94, 0xb4, 0xd4, 0xf4, 0x15, 0x35, 0x56, 0x77, 0x98, 0xb9, 0xdb, 0xfc, 0x1d, 0x3f, 0x61, 0x83, 0xa5, 0xc7, 0xe9, 0x0c, 0x2e, 0x51, 0x73, 0x96, 0xb9, 0xdd, 0x00, 0x23, 0x47, 0x6a, 0x8e, 0xb2, 0xd6, 0xfa, 0x1e, 0x43, 0x67, 0x8c, 0xb1, 0xd6, 0xfb, 0x20, 0x45, 0x6a, 0x90, 0xb6, 0xdb, 0x01, 0x27, 0x4d, 0x74, 0x9a, 0xc1, 0xe7, 0x0e, 0x35, 0x5c, 0x83, 0xaa, 0xd2, 0xf9, 0x21, 0x49, 0x71, 0x99, 0xc1, 0xe9, 0x11, 0x3a, 0x62, 0x8b, 0xb4, 0xdd, 0x06, 0x30, 0x59, 0x82, 0xac, 0xd6, 0x00, 0x2a, 0x54, 0x7e, 0xa9, 0xd3, 0xfe, 0x28, 0x53, 0x7e, 0xaa, 0xd5, 0x00, 0x2c, 0x57, 0x83, 0xaf, 0xdb, 0x07, 0x33, 0x60, 0x8c, 0xb9, 0xe6, 0x13, 0x40, 0x6d, 0x9a, 0xc7, 0xf5, 0x23, 0x50, 0x7e, 0xac, 0xda, 0x09, 0x37, 0x66, 0x94, 0xc3, 0xf2, 0x21, 0x50, 0x7f, 0xaf, 0xde, 0x0e, 0x3e, 0x6e, 0x9e, 0xce, 0xfe, 0x2e, 0x5f, 0x8f, 0xc0, 0xf1, 0x22, 0x53, 0x85, 0xb6, 0xe7, 0x19, 0x4b, 0x7d, 0xaf, 0xe1, 0x13, 0x46, 0x78, 0xab, 0xdd, 0x10, 0x43, 0x77, 0xaa, 0xdd, 0x11, 0x44, 0x78, 0xac, 0xe0, 0x14, 0x48, 0x7d, 0xb1, 0xe6, 0x1b, 0x50, 0x85, 0xba, 0xef, 0x24, 0x5a, 0x90, 0xc5, 0xfb, 0x31, 0x67, 0x9e, 0xd4, 0x0b, 0x41, 0x78, 0xaf, 0xe6, 0x1d, 0x54, 0x8c, 0xc3, 0xfb, 0x33, 0x6b, 0xa3, 0xdb, 0x13, 0x4b, 0x84, 0xbc, 0xf5, 0x2e, 0x67, 0xa0, 0xda, 0x13, 0x4c, 0x86, 0xc0, 0xfa, 0x34, 0x6e, 0xa8, 0xe3, 0x1d, 0x58, 0x92, 0xcd, 0x08, 0x44, 0x7f, 0xba, 0xf6, 0x31, 0x6d, 0xa9, 0xe5, 0x21, 0x5d, 0x9a, 0xd6, 0x13, 0x50, 0x8d, 0xca, 0x07, 0x44, 0x81, 0xbf, 0xfd, 0x3a, 0x78, 0xb6, 0xf4, 0x33, 0x71, 0xb0, 0xee, 0x2d, 0x6c, 0xab, 0xea, 0x29, 0x69, 0xa8, 0xe8, 0x28, 0x68, 0xa8, 0xe8, 0x28, 0x68, 0xa9, 0xe9, 0x2a, 0x6b, 0xac, 0xed, 0x2f, 0x70, 0xb1, 0xf3, 0x35, 0x77, 0xb9, 0xfb, 0x3d, 0x80, 0xc2, 0x05, 0x47, 0x8a, 0xcd, 0x11, 0x54, 0x97, 0xdb, 0x1e, 0x62, 0xa6, 0xea, 0x2e, 0x72, 0xb7, 0xfb, 0x40, 0x85, 0xca, 0x0f, 0x54, 0x99, 0xde, 0x24, 0x6a, 0xaf, 0xf5, 0x3b, 0x81, 0xc8, 0x0e, 0x55, 0x9b, 0xe2, 0x29, 0x70, 0xb7, 0xfe, 0x46, 0x8d, 0xd5, 0x1d, 0x65, 0xad, 0xf5, 0x3d, 0x85, 0xce, 0x16, 0x5f, 0xa8, 0xf1, 0x3a, 0x84, 0xcd, 0x16, 0x60, 0xaa, 0xf4, 0x3e, 0x88, 0xd2, 0x1d, 0x67, 0xb2, 0xfc, 0x47, 0x92, 0xde, 0x29, 0x74, 0xc0, 0x0b, 0x57, 0xa3, 0xef, 0x3b, 0x87, 0xd4, 0x20, 0x6d, 0xba, 0x07, 0x54, 0xa1, 0xee, 0x3b, 0x89, 0xd7, 0x24, 0x72, 0xc0, 0x0e, 0x5d, 0xab, 0xfa, 0x48, 0x97, 0xe6, 0x35, 0x84, 0xd3, 0x23, 0x72, 0xc2, 0x12, 0x62, 0xb2, 0x02, 0x52, 0xa2, 0xf3, 0x43, 0x94, 0xe5, 0x36, 0x87, 0xd9, 0x2a, 0x7b, 0xcd, 0x1f, 0x71, 0xc3, 0x15, 0x67, 0xba, 0x0c, 0x5f, 0xb1, 0x04, 0x57, 0xab, 0xfe, 0x51, 0xa5, 0xf8, 0x4c, 0xa0, 0xf4, 0x48, 0x9c, 0xf1, 0x45, 0x9a, 0xef, 0x44, 0x99, 0xee, 0x43, 0x98, 0xee, 0x44, 0x99, 0xef, 0x45, 0x9b, 0xf2, 0x48, 0x9f, 0xf5, 0x4c, 0xa3, 0xfa, 0x51, 0xa8, 0x00, 0x57, 0xaf, 0x07, 0x5f, 0xb7, 0x0f, 0x67, 0xbf, 0x18, 0x70, 0xc9, 0x22, 0x7b, 0xd4, 0x2e, 0x87, 0xe0, 0x3a, 0x94, 0xee, 0x48, 0xa2, 0xfc, 0x57, 0xb1, 0x0c, 0x66, 0xc1, 0x1c, 0x78, 0xd3, 0x2e, 0x8a, 0xe5, 0x41, 0x9d, 0xf9, 0x55, 0xb1, 0x0e, 0x6a, 0xc7, 0x24, 0x81, 0xde, 0x3b, 0x98, 0xf5, 0x53, 0xb1, 0x0e, 0x6c, 0xca, 0x28, 0x87, 0xe5, 0x44, 0xa2, 0x01, 0x60, 0xbf, 0x1e, 0x7d, 0xdd, 0x3c, 0x9c, 0xfc, 0x5c, 0xbc, 0x1c, 0x7c, 0xdc, 0x3d, 0x9d, 0xfe, 0x5f, 0xc0, 0x21, 0x83, 0xe4, 0x45, 0xa7, 0x09, 0x6b, 0xcd, 0x2f, 0x91, 0xf4, 0x56, 0xb9, 0x1b, 0x7e, 0xe1, 0x45, 0xa8, 0x0b, 0x6f, 0xd2, 0x36, 0x9a, 0xfe, 0x62, 0xc6, 0x2b, 0x8f, 0xf4, 0x59, 0xbe, 0x23, 0x88, 0xed, 0x52, 0xb8, 0x1e, 0x83, 0xe9, 0x4f, 0xb5, 0x1c, 0x82, 0xe9, 0x4f, 0xb6, 0x1d, 0x84, 0xeb, 0x52, 0xba, 0x21, 0x89, 0xf1, 0x59, 0xc1, 0x29, 0x91, 0xf9, 0x62, 0xca, 0x33, 0x9c, 0x05, 0x6e, 0xd8, 0x41, 0xaa, 0x14, 0x7e, 0xe8, 0x52, 0xbc, 0x26, 0x91, 0xfb, 0x66, 0xd0, 0x3b, 0xa6, 0x12, 0x7d, 0xe8, 0x54, 0xbf, 0x2b, 0x97, 0x03, 0x6f, 0xdb, 0x48, 0xb4, 0x21, 0x8e, 0xfb, 0x68, 0xd5, 0x42, 0xaf, 0x1d, 0x8b, 0xf8, 0x66, 0xd4, 0x42, 0xb1, 0x1f, 0x8e, 0xfc, 0x6b, 0xda, 0x49, 0xb8, 0x27, 0x97, 0x06, 0x76, 0xe6, 0x56, 0xc6, 0x36, 0xa6, 0x16, 0x87, 0xf7, 0x68, 0xd9, 0x4a, 0xbb, 0x2d, 0x9e, 0x0f, 0x81, 0xf3, 0x65, 0xd7, 0x49, 0xbb, 0x2e, 0xa0, 0x13, 0x85, 0xf8, 0x6b, 0xdf, 0x52, 0xc5, 0x39, 0xac, 0x20, 0x94, 0x08, 0x7c, 0xf0, 0x65, 0xd9, 0x4e, 0xc3, 0x38, 0xad, 0x22, 0x97, 0x0c, 0x82, 0xf8, 0x6d, 0xe3, 0x59, 0xcf, 0x46, 0xbc, 0x33, 0xa9, 0x20, 0x97, 0x0e, 0x85, 0xfc, 0x74, 0xeb, 0x63, 0xdb, 0x53, 0xcb, 0x43, 0xbb, 0x33, 0xac, 0x24, 0x9d, 0x16, 0x8f, 0x08, 0x82, 0xfb, 0x74, 0xee, 0x68, 0xe2, 0x5c, 0xd6, 0x50, 0xcb, 0x45, 0xc0, 0x3a, 0xb5, 0x30, 0xac, 0x27, 0xa2, 0x1e, 0x99, 0x15, 0x91, 0x0d, 0x89, 0x05, 0x82, 0xfe, 0x7b, 0xf8, 0x75, 0xf2, 0x6f, 0xec, 0x69, 0xe7, 0x65, 0xe2, 0x60, 0xde, 0x5c, 0xdb, 0x59, 0xd8, 0x56, 0xd5, 0x54, 0xd3, 0x52, 0xd1, 0x51, 0xd0, 0x50, 0xd0, 0x50, 0xd0, 0x50, 0xd0, 0x50, 0xd1, 0x51, 0xd2, 0x53, 0xd4, 0x55, 0xd7, 0x58, 0xd9, 0x5b, 0xdd, 0x5f, 0xe1, 0x63, 0xe5, 0x68, 0xea, 0x6d, 0xef, 0x72, 0xf5, 0x79, 0xfc, 0x7f, 0x03, 0x86, 0x0a, 0x8e, 0x12, 0x96, 0x1a, 0x9f, 0x23, 0xa8, 0x2d, 0xb2, 0x37, 0xbc, 0x41, 0xc6, 0x4c, 0xd2, 0x57, 0xdd, 0x63, 0xe9, 0x70, 0xf6, 0x7d, 0x03, 0x8a, 0x11, 0x98, 0x1f, 0xa6, 0x2e, 0xb5, 0x3d, 0xc5, 0x4d, 0xd5, 0x5d, 0xe5, 0x6d, 0xf6, 0x7e, 0x07, 0x90, 0x19, 0xa2, 0x2c, 0xb5, 0x3e, 0xc8, 0x52, 0xdc, 0x66, 0xf0, 0x7a, 0x05, 0x8f, 0x1a, 0xa4, 0x2f, 0xba, 0x46, 0xd1, 0x5c, 0xe8, 0x73, 0xff, 0x8b, 0x17, 0xa3, 0x2f, 0xbc, 0x48, 0xd5, 0x62, 0xef, 0x7c, 0x09, 0x96, 0x23, 0xb1, 0x3f, 0xcc, 0x5a, 0xe8, 0x76, 0x05, 0x93, 0x22, 0xb0, 0x3f, 0xce, 0x5d, 0xec, 0x7b, 0x0b, 0x9a, 0x2a, 0xba, 0x4a, 0xda, 0x6a, 0xfa, 0x8a, 0x1b, 0xab, 0x3c, 0xcd, 0x5e, 0xef, 0x81, 0x12, 0xa3, 0x35, 0xc7, 0x59, 0xeb, 0x7d, 0x0f, 0xa2, 0x34, 0xc7, 0x59, 0xec, 0x7f, 0x13, 0xa6, 0x39, 0xcd, 0x60, 0xf4, 0x88, 0x1c, 0xb0, 0x44, 0xd9, 0x6d, 0x02, 0x97, 0x2c, 0xc1, 0x56, 0xeb, 0x80, 0x16, 0xac, 0x41, 0xd7, 0x6d, 0x03, 0x9a, 0x30, 0xc7, 0x5d, 0xf4, 0x8b, 0x22, 0xb9, 0x50, 0xe8, 0x7f, 0x17, 0xaf, 0x47, 0xdf, 0x77, 0x0f, 0xa7, 0x40, 0xd8, 0x71, 0x0a, 0xa3, 0x3c, 0xd6, 0x6f, 0x08, 0xa2, 0x3c, 0xd6, 0x70, 0x0a, 0xa4, 0x3f, 0xd9, 0x74, 0x0e, 0xa9, 0x44, 0xe0, 0x7b, 0x16, 0xb2, 0x4d, 0xe9, 0x85, 0x21, 0xbd, 0x59, 0xf6, 0x92, 0x2f, 0xcc, 0x69, 0x06, 0xa3, 0x40, 0xdd, 0x7b, 0x19, 0xb6, 0x54, 0xf2, 0x90, 0x2f, 0xcd, 0x6c, 0x0a, 0xa9, 0x48, 0xe7, 0x86, 0x25, 0xc5, 0x64, 0x04, 0xa4, 0x44, 0xe4, 0x84, 0x24, 0xc4, 0x65, 0x05, 0xa6, 0x47, 0xe8, 0x89, 0x2b, 0xcc, 0x6d, 0x0f, 0xb1, 0x53, 0xf5, 0x97, 0x39, 0xdc, 0x7e, 0x21, 0xc3, 0x66, 0x09, 0xad, 0x50, 0xf3, 0x97, 0x3a, 0xde, 0x82, 0x26, 0xca, 0x6e, 0x13, 0xb7, 0x5c, 0x01, 0xa6, 0x4b, 0xf0, 0x95, 0x3a, 0xe0, 0x86, 0x2b, 0xd1, 0x77, 0x1d, 0xc4, 0x6a, 0x11, 0xb7, 0x5e, 0x05, 0xac, 0x53, 0xfa, 0xa2, 0x49, 0xf1, 0x99, 0x41, 0xe9, 0x91, 0x39, 0xe1, 0x8a, 0x32, 0xdb, 0x84, 0x2d, 0xd6, 0x80, 0x29, 0xd2, 0x7c, 0x26, 0xd0, 0x7a, 0x24, 0xce, 0x79, 0x23, 0xce, 0x78, 0x23, 0xce, 0x7a, 0x25, 0xd0, 0x7c, 0x27, 0xd3, 0x7f, 0x2b, 0xd7, 0x83, 0x30, 0xdc, 0x89, 0x36, 0xe3, 0x90, 0x3d, 0xea, 0x97, 0x45, 0xf3, 0xa0, 0x4e, 0xfc, 0xaa, 0x59, 0x07, 0xb6, 0x64, 0x13, 0xc2, 0x71, 0x20, 0xcf, 0x7f, 0x2e, 0xde, 0x8e, 0x3e, 0xee, 0x9e, 0x4e, 0xfe, 0xaf, 0x5f, 0x10, 0xc1, 0x72, 0x23, 0xd5, 0x86, 0x37, 0xe9, 0x9b, 0x4d, 0xff, 0xb1, 0x63, 0x16, 0xc8, 0x7b, 0x2d, 0xe0, 0x93, 0x47, 0xfa, 0xad, 0x61, 0x14, 0xc8, 0x7c, 0x30, 0xe4, 0x98, 0x4d, 0x01, 0xb6, 0x6b, 0x20, 0xd5, 0x8a, 0x3f, 0xf4, 0xaa, 0x60, 0x15, 0xcb, 0x81, 0x37, 0xee, 0xa4, 0x5b, 0x11, 0xc8, 0x7f, 0x36, 0xed, 0xa4, 0x5c, 0x13, 0xcb, 0x83, 0x3b, 0xf3, 0xab, 0x63, 0x1b, 0xd4, 0x8c, 0x45, 0xfe, 0xb7, 0x70, 0x2a, 0xe3, 0x9c, 0x56, 0x10, 0xca, 0x84, 0x3e, 0xf8, 0xb3, 0x6d, 0x28, 0xe2, 0x9d, 0x58, 0x14, 0xcf, 0x8a, 0x46, 0x01, 0xbd, 0x79, 0x35, 0xf1, 0xad, 0x6a, 0x26, 0xe3, 0xa0, 0x5d, 0x1a, 0xd7, 0x94, 0x51, 0x0f, 0xcd, 0x8a, 0x48, 0x06, 0xc4, 0x83, 0x41, 0x00, 0xbe, 0x7d, 0x3c, 0xfb, 0xba, 0x79, 0x39, 0xf8, 0xb8, 0x78, 0x38, 0xf8, 0xb8, 0x78, 0x38, 0xf9, 0xb9, 0x7a, 0x3b, 0xfc, 0xbd, 0x7f, 0x40, 0x01, 0xc3, 0x85, 0x47, 0x09, 0xcb, 0x8d, 0x50, 0x12, 0xd5, 0x97, 0x5a, 0x1d, 0xe1, 0xa4, 0x67, 0x2b, 0xee, 0xb2, 0x76, 0x3a, 0xfe, 0xc2, 0x87, 0x4b, 0x10, 0xd5, 0x9a, 0x5f, 0x24, 0xe9, 0xae, 0x74, 0x3a, 0xff, 0xc5, 0x8b, 0x51, 0x18, 0xde, 0xa5, 0x6b, 0x32, 0xf9, 0xc0, 0x87, 0x4e, 0x16, 0xdd, 0xa5, 0x6d, 0x35, 0xfd, 0xc5, 0x8d, 0x55, 0x1e, 0xe6, 0xaf, 0x78, 0x41, 0x0a, 0xd4, 0x9d, 0x66, 0x30, 0xfa, 0xc4, 0x8e, 0x58, 0x22, 0xed, 0xb7, 0x82, 0x4c, 0x17, 0xe2, 0xae, 0x79, 0x44, 0x10, 0xdb, 0xa7, 0x73, 0x3f, 0x0b, 0xd7, 0xa4, 0x70, 0x3d, 0x0a, 0xd7, 0xa4, 0x71, 0x3e, 0x0b, 0xd9, 0xa7, 0x74, 0x42, 0x10, 0xde, 0xad, 0x7b, 0x4a, 0x18, 0xe7, 0xb6, 0x85, 0x54, 0x23, 0xf3, 0xc2, 0x92, 0x62, 0x32, 0x02, 0xd2, 0xa2, 0x72, 0x43, 0x13, 0xe4, 0xb5, 0x86, 0x57, 0x29, 0xfa, 0xcb, 0x9d, 0x6f, 0x41, 0x13, 0xe5, 0xb7, 0x8a, 0x5c, 0x2f, 0x01, 0xd4, 0xa7, 0x7b, 0x4e, 0x21, 0xf5, 0xc8, 0x9c, 0x70, 0x44, 0x18, 0xec, 0xc1, 0x95, 0x6a, 0x3f, 0x14, 0xe9, 0xbe, 0x93, 0x68, 0x3e, 0x14, 0xe9, 0xbf, 0x95, 0x6b, 0x42, 0x18, 0xef, 0xc5, 0x9c, 0x73, 0x4a, 0x21, 0xf8, 0xd0, 0xa7, 0x7f, 0x57, 0x2f, 0x07, 0xdf, 0xb7, 0x8f, 0x68, 0x40, 0x19, 0xf2, 0xcb, 0xa4, 0x7e, 0x57, 0x30, 0x0a, 0xe4, 0xbe, 0x98, 0x72, 0x4c, 0x27, 0x01, 0xdc, 0xb6, 0x91, 0x6c, 0x48, 0x23, 0xfe, 0xda, 0xb5, 0x91, 0x6d, 0x49, 0x25, 0x01, 0xde, 0xba, 0x97, 0x74, 0x51, 0x2e, 0x0b, 0xe8, 0xc5, 0xa3, 0x81, 0x5e, 0x3c, 0x1a, 0xf8, 0xd7, 0xb5, 0x94, 0x72, 0x51, 0x30, 0x0f, 0xee, 0xcd, 0xad, 0x8c, 0x6c, 0x4c, 0x2c, 0x0c, 0xec, 0xcc, 0xac, 0x8d, 0x6d, 0x4e, 0x2f, 0x10, 0xf1, 0xd3, 0xb4, 0x95, 0x77, 0x59, 0x3b, 0x1d, 0xff, 0xe1, 0xc4, 0xa6, 0x89, 0x6b, 0x4e, 0x31, 0x15, 0xf8, 0xdb, 0xbf, 0xa2, 0x86, 0x6a, 0x4e, 0x32, 0x16, 0xfb, 0xdf, 0xc4, 0xa9, 0x8e, 0x73, 0x58, 0x3d, 0x22, 0x08, 0xee, 0xd3, 0xb9, 0x9f, 0x85, 0x6c, 0x52, 0x39, 0x1f, 0x06, 0xed, 0xd4, 0xbb, 0xa2, 0x8a, 0x71, 0x59, 0x41, 0x29, 0x11, 0xf9, 0xe1, 0xc9, 0xb2, 0x9a, 0x83, 0x6c, 0x55, 0x3e, 0x28, 0x11, 0xfa, 0xe4, 0xce, 0xb8, 0xa2, 0x8c, 0x76, 0x61, 0x4b, 0x36, 0x20, 0x0b, 0xf6, 0xe2, 0xcd, 0xb8, 0xa4, 0x8f, 0x7b, 0x67, 0x53, 0x3f, 0x2b, 0x18, 0x04, 0xf1, 0xde, 0xcb, 0xb8, 0xa5, 0x92, 0x7f, 0x6d, 0x5b, 0x48, 0x36, 0x24, 0x12, 0x01, 0xef, 0xde, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x67, 0x56, 0x46, 0x36, 0x26, 0x16, 0x06, 0xf6, 0xe6, 0xd7, 0xc7, 0xb8, 0xa9, 0x9a, 0x8b, 0x7d, 0x6e, 0x5f, 0x51, 0x43, 0x35, 0x27, 0x19, 0x0b, 0xfe, 0xf0, 0xe3, 0xd5, 0xc8, 0xbb, 0xaf, 0xa2, 0x95, 0x89, 0x7c, 0x70, 0x64, 0x58, 0x4c, 0x40, 0x35, 0x29, 0x1e, 0x13, 0x08, 0xfd, 0xf2, 0xe7, 0xdc, 0xd2, 0xc8, 0xbd, 0xb3, 0xa9, 0x9f, 0x96, 0x8c, 0x83, 0x79, 0x70, 0x67, 0x5e, 0x55, 0x4c, 0x44, 0x3b, 0x33, 0x2b, 0x23, 0x1b, 0x13, 0x0b, 0x03, 0xfc, 0xf4, 0xed, 0xe6, 0xdf, 0xd8, 0xd2, 0xcb, 0xc4, 0xbe, 0xb8, 0xb2, 0xac, 0xa6, 0xa0, 0x9b, 0x95, 0x90, 0x8a, 0x85, 0x80, 0x7c, 0x77, 0x72, 0x6e, 0x69, 0x65, 0x61, 0x5d, 0x59, 0x55, 0x52, 0x4e, 0x4b, 0x48, 0x45, 0x42, 0x3f, 0x3c, 0x39, 0x37, 0x35, 0x32, 0x30, 0x2e, 0x2c, 0x2b, 0x29, 0x28, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x23, 0x24, 0x25, 0x27, 0x28, 0x29, 0x2b, 0x2d, 0x2f, 0x31, 0x33, 0x35, 0x38, 0x3a, 0x3d, 0x3f, 0x42, 0x45, 0x49, 0x4c, 0x4f, 0x53, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x6f, 0x73, 0x78, 0x7d, 0x82, 0x87, 0x8c, 0x91, 0x96, 0x9c, 0xa2, 0xa7, 0xad, 0xb3, 0xb9, 0xc0, 0xc6, 0xcd, 0xd3, 0xda, 0xe1, 0xe8, 0xef, 0xf6, 0xfe, 0x05, 0x0d, 0x15, 0x1d, 0x25, 0x2d, 0x35, 0x3d, 0x46, 0x4e, 0x57, 0x60, 0x69, 0x72, 0x7c, 0x85, 0x8e, 0x98, 0xa2, 0xac, 0xb6, 0xc0, 0xca, 0xd5, 0xdf, 0xea, 0xf4, 0xff, 0x0a, 0x16, 0x21, 0x2c, 0x38, 0x43, 0x4f, 0x5b, 0x67, 0x73, 0x7f, 0x8c, 0x98, 0xa5, 0xb2, 0xbf, 0xcc, 0xd9, 0xe6, 0xf3, 0x01, 0x0f, 0x1c, 0x2a, 0x38, 0x46, 0x55, 0x63, 0x72, 0x80, 0x8f, 0x9e, 0xad, 0xbc, 0xcb, 0xdb, 0xea, 0xfa, 0x0a, 0x1a, 0x2a, 0x3a, 0x4a, 0x5a, 0x6b, 0x7b, 0x8c, 0x9d, 0xae, 0xbf, 0xd1, 0xe2, 0xf3, 0x05, 0x17, 0x29, 0x3b, 0x4d, 0x5f, 0x72, 0x84, 0x97, 0xa9, 0xbc, 0xcf, 0xe3, 0xf6, 0x09, 0x1d, 0x30, 0x44, 0x58, 0x6c, 0x80, 0x94, 0xa9, 0xbd, 0xd2, 0xe7, 0xfc, 0x11, 0x26, 0x3b, 0x50, 0x66, 0x7c, 0x91, 0xa7, 0xbd, 0xd3, 0xea, 0x00, 0x17, 0x2d, 0x44, 0x5b, 0x72, 0x89, 0xa0, 0xb8, 0xcf, 0xe7, 0xff, 0x17, 0x2f, 0x47, 0x5f, 0x77, 0x90, 0xa8, 0xc1, 0xda, 0xf3, 0x0c, 0x26, 0x3f, 0x58, 0x72, 0x8c, 0xa6, 0xc0, 0xda, 0xf4, 0x0f, 0x29, 0x44, 0x5e, 0x79, 0x94, 0xb0, 0xcb, 0xe6, 0x02, 0x1d, 0x39, 0x55, 0x71, 0x8d, 0xa9, 0xc6, 0xe2, 0xff, 0x1c, 0x39, 0x56, 0x73, 0x90, 0xad, 0xcb, 0xe9, 0x06, 0x24, 0x42, 0x60, 0x7f, 0x9d, 0xbc, 0xda, 0xf9, 0x18, 0x37, 0x56, 0x75, 0x95, 0xb4, 0xd4, 0xf4, 0x14, 0x34, 0x54, 0x74, 0x94, 0xb5, 0xd5, 0xf6, 0x17, 0x38, 0x59, 0x7b, 0x9c, 0xbd, 0xdf, 0x01, 0x23, 0x45, 0x67, 0x89, 0xac, 0xce, 0xf1, 0x13, 0x36, 0x59, 0x7d, 0xa0, 0xc3, 0xe7, 0x0a, 0x2e, 0x52, 0x76, 0x9a, 0xbe, 0xe3, 0x07, 0x2c, 0x51, 0x76, 0x9b, 0xc0, 0xe5, 0x0a, 0x30, 0x56, 0x7b, 0xa1, 0xc7, 0xed, 0x14, 0x3a, 0x61, 0x87, 0xae, 0xd5, 0xfc, 0x23, 0x4a, 0x72, 0x99, 0xc1, 0xe9, 0x11, 0x39, 0x61, 0x89, 0xb1, 0xda, 0x02, 0x2b, 0x54, 0x7d, 0xa6, 0xd0, 0xf9, 0x22, 0x4c, 0x76, 0xa0, 0xca, 0xf4, 0x1e, 0x49, 0x73, 0x9e, 0xc8, 0xf3, 0x1e, 0x4a, 0x75, 0xa0, 0xcc, 0xf7, 0x23, 0x4f, 0x7b, 0xa7, 0xd3, 0x00, 0x2c, 0x59, 0x86, 0xb3, 0xe0, 0x0d, 0x3a, 0x67, 0x95, 0xc3, 0xf0, 0x1e, 0x4c, 0x7a, 0xa9, 0xd7, 0x06, 0x34, 0x63, 0x92, 0xc1, 0xf0, 0x1f, 0x4f, 0x7e, 0xae, 0xde, 0x0e, 0x3e, 0x6e, 0x9e, 0xce, 0xff, 0x2f, 0x60, 0x91, 0xc2, 0xf3, 0x25, 0x56, 0x87, 0xb9, 0xeb, 0x1d, 0x4f, 0x81, 0xb3, 0xe6, 0x18, 0x4b, 0x7d, 0xb0, 0xe3, 0x17, 0x4a, 0x7d, 0xb1, 0xe4, 0x18, 0x4c, 0x80, 0xb4, 0xe8, 0x1d, 0x51, 0x86, 0xbb, 0xf0, 0x25, 0x5a, 0x8f, 0xc4, 0xfa, 0x30, 0x65, 0x9b, 0xd1, 0x07, 0x3e, 0x74, 0xab, 0xe1, 0x18, 0x4f, 0x86, 0xbd, 0xf4, 0x2c, 0x63, 0x9b, 0xd3, 0x0b, 0x43, 0x7b, 0xb3, 0xeb, 0x24, 0x5c, 0x95, 0xce, 0x07, 0x40, 0x7a, 0xb3, 0xec, 0x26, 0x60, 0x9a, 0xd4, 0x0e, 0x48, 0x83, 0xbd, 0xf8, 0x32, 0x6d, 0xa8, 0xe4, 0x1f, 0x5a, 0x96, 0xd1, 0x0d, 0x49, 0x85, 0xc1, 0xfd, 0x3a, 0x76, 0xb3, 0xf0, 0x2d, 0x6a, 0xa7, 0xe4, 0x21, 0x5f, 0x9d, 0xda, 0x18, 0x56, 0x94, 0xd3, 0x11, 0x50, 0x8e, 0xcd, 0x0c, 0x4b, 0x8a, 0xc9, 0x09, 0x48, 0x88, 0xc8, 0x08, 0x48, 0x88, 0xc8, 0x08, 0x49, 0x89, 0xca, 0x0b, 0x4c, 0x8d, 0xcf, 0x10, 0x51, 0x93, 0xd5, 0x17, 0x59, 0x9b, 0xdd, 0x20, 0x62, 0xa5, 0xe7, 0x2a, 0x6d, 0xb1, 0xf4, 0x37, 0x7b, 0xbe, 0x02, 0x46, 0x8a, 0xce, 0x12, 0x57, 0x9b, 0xe0, 0x25, 0x6a, 0xaf, 0xf4, 0x39, 0x7e, 0xc4, 0x0a, 0x4f, 0x95, 0xdb, 0x21, 0x68, 0xae, 0xf5, 0x3b, 0x82, 0xc9, 0x10, 0x57, 0x9e, 0xe6, 0x2d, 0x75, 0xbd, 0x05, 0x4d, 0x95, 0xdd, 0x25, 0x6e, 0xb6, 0xff, 0x48, 0x91, 0xda, 0x24, 0x6d, 0xb6, 0x00, 0x4a, 0x94, 0xde, 0x28, 0x72, 0xbd, 0x07, 0x52, 0x9c, 0xe7, 0x32, 0x7e, 0xc9, 0x14, 0x60, 0xab, 0xf7, 0x43, 0x8f, 0xdb, 0x27, 0x74, 0xc0, 0x0d, 0x5a, 0xa7, 0xf4, 0x41, 0x8e, 0xdb, 0x29, 0x77, 0xc4, 0x12, 0x60, 0xae, 0xfd, 0x4b, 0x9a, 0xe8, 0x37, 0x86, 0xd5, 0x24, 0x73, 0xc3, 0x12, 0x62, 0xb2, 0x02, 0x52, 0xa2, 0xf2, 0x42, 0x93, 0xe3, 0x34, 0x85, 0xd6, 0x27, 0x79, 0xca, 0x1b, 0x6d, 0xbf, 0x11, 0x63, 0xb5, 0x07, 0x5a, 0xac, 0xff, 0x51, 0xa4, 0xf7, 0x4b, 0x9e, 0xf1, 0x45, 0x98, 0xec, 0x40, 0x94, 0xe8, 0x3c, 0x91, 0xe5, 0x3a, 0x8f, 0xe4, 0x39, 0x8e, 0xe3, 0x38, 0x8e, 0xe4, 0x39, 0x8f, 0xe5, 0x3b, 0x92, 0xe8, 0x3f, 0x95, 0xec, 0x43, 0x9a, 0xf1, 0x48, 0xa0, 0xf7, 0x4f, 0xa7, 0xff, 0x57, 0xaf, 0x07, 0x5f, 0xb8, 0x10, 0x69, 0xc2, 0x1b, 0x74, 0xce, 0x27, 0x80, 0xda, 0x34, 0x8e, 0xe8, 0x42, 0x9c, 0xf7, 0x51, 0xac, 0x06, 0x61, 0xbc, 0x18, 0x73, 0xce, 0x2a, 0x85, 0xe1, 0x3d, 0x99, 0xf5, 0x51, 0xae, 0x0a, 0x67, 0xc4, 0x21, 0x7e, 0xdb, 0x38, 0x95, 0xf3, 0x51, 0xae, 0x0c, 0x6a, 0xc8, 0x27, 0x85, 0xe4, 0x42, 0xa1, 0x00, 0x5f, 0xbe, 0x1d, 0x7d, 0xdc, 0x3c, 0x9c, 0xfc, 0x5c, 0xbc, 0x1c, 0x7c, 0xdd, 0x3d, 0x9e, 0xff, 0x60, 0xc1, 0x23, 0x84, 0xe5, 0x47, 0xa9, 0x0b, 0x6d, 0xcf, 0x31, 0x94, 0xf6, 0x59, 0xbb, 0x1e, 0x81, 0xe5, 0x48, 0xab, 0x0f, 0x72, 0xd6, 0x3a, 0x9e, 0x02, 0x66, 0xcb, 0x2f, 0x94, 0xf9, 0x5e, 0xc3, 0x28, 0x8d, 0xf2, 0x58, 0xbe, 0x23, 0x89, 0xef, 0x55, 0xbc, 0x22, 0x89, 0xef, 0x56, 0xbd, 0x24, 0x8b, 0xf2, 0x5a, 0xc1, 0x29, 0x91, 0xf9, 0x61, 0xc9, 0x31, 0x99, 0x02, 0x6a, 0xd3, 0x3c, 0xa5, 0x0e, 0x78, 0xe1, 0x4a, 0xb4, 0x1e, 0x88, 0xf2, 0x5c, 0xc6, 0x31, 0x9b, 0x06, 0x70, 0xdb, 0x46, 0xb2, 0x1d, 0x88, 0xf4, 0x5f, 0xcb, 0x37, 0xa3, 0x0f, 0x7b, 0xe8, 0x54, 0xc1, 0x2e, 0x9b, 0x08, 0x75, 0xe2, 0x4f, 0xbd, 0x2b, 0x98, 0x06, 0x74, 0xe2, 0x51, 0xbf, 0x2e, 0x9c, 0x0b, 0x7a, 0xe9, 0x58, 0xc7, 0x37, 0xa6, 0x16, 0x86, 0xf6, 0x66, 0xd6, 0x46, 0xb6, 0x27, 0x97, 0x08, 0x79, 0xea, 0x5b, 0xcd, 0x3e, 0xaf, 0x21, 0x93, 0x05, 0x77, 0xe9, 0x5b, 0xce, 0x40, 0xb3, 0x25, 0x98, 0x0b, 0x7f, 0xf2, 0x65, 0xd9, 0x4c, 0xc0, 0x34, 0xa8, 0x1c, 0x90, 0x05, 0x79, 0xee, 0x63, 0xd8, 0x4d, 0xc2, 0x37, 0xac, 0x22, 0x98, 0x0d, 0x83, 0xf9, 0x6f, 0xe6, 0x5c, 0xd3, 0x49, 0xc0, 0x37, 0xae, 0x25, 0x9c, 0x14, 0x8b, 0x03, 0x7b, 0xf3, 0x6b, 0xe3, 0x5b, 0xd3, 0x4c, 0xc4, 0x3d, 0xb6, 0x2f, 0xa8, 0x22, 0x9b, 0x14, 0x8e, 0x08, 0x82, 0xfc, 0x76, 0xf0, 0x6b, 0xe5, 0x60, 0xda, 0x55, 0xd0, 0x4c, 0xc7, 0x42, 0xbe, 0x39, 0xb5, 0x31, 0xad, 0x29, 0xa5, 0x22, 0x9e, 0x1b, 0x98, 0x15, 0x92, 0x0f, 0x8c, 0x09, 0x87, 0x05, 0x82, 0x00, 0x7e, 0xfc, 0x7b, 0xf9, 0x78, 0xf6, 0x75, 0xf4, 0x73, 0xf2, 0x71, 0xf1, 0x70, 0xf0, 0x70, 0xf0, 0x70, 0xf0, 0x70, 0xf0, 0x71, 0xf1, 0x72, 0xf3, 0x74, 0xf5, 0x77, 0xf8, 0x79, 0xfb, 0x7d, 0xff, 0x81, 0x03, 0x85, 0x08, 0x8a, 0x0d, 0x8f, 0x12, 0x95, 0x19, 0x9c, 0x1f, 0xa3, 0x26, 0xaa, 0x2e, 0xb2, 0x36, 0xba, 0x3f, 0xc3, 0x48, 0xcd, 0x52, 0xd7, 0x5c, 0xe1, 0x66, 0xec, 0x72, 0xf7, 0x7d, 0x03, 0x89, 0x10, 0x96, 0x1d, 0xa3, 0x2a, 0xb1, 0x38, 0xbf, 0x46, 0xce, 0x55, 0xdd, 0x65, 0xed, 0x75, 0xfd, 0x85, 0x0d, 0x96, 0x1e, 0xa7, 0x30, 0xb9, 0x42, 0xcc, 0x55, 0xde, 0x68, 0xf2, 0x7c, 0x06, 0x90, 0x1a, 0xa5, 0x2f, 0xba, 0x44, 0xcf, 0x5a, 0xe6, 0x71, 0xfc, 0x88, 0x13, 0x9f, 0x2b, 0xb7, 0x43, 0xcf, 0x5c, 0xe8, 0x75, 0x02, 0x8f, 0x1c, 0xa9, 0x36, 0xc3, 0x51, 0xdf, 0x6c, 0xfa, 0x88, 0x16, 0xa5, 0x33, 0xc2, 0x50, 0xdf, 0x6e, 0xfd, 0x8c, 0x1b, 0xab, 0x3a, 0xca, 0x5a, 0xea, 0x7a, 0x0a, 0x9a, 0x2a, 0xbb, 0x4b, 0xdc, 0x6d, 0xfe, 0x8f, 0x21, 0xb2, 0x43, 0xd5, 0x67, 0xf9, 0x8b, 0x1d, 0xaf, 0x42, 0xd4, 0x67, 0xf9, 0x8c, 0x1f, 0xb3, 0x46, 0xd9, 0x6d, 0x00, 0x94, 0x28, 0xbc, 0x50, 0xe4, 0x79, 0x0d, 0xa2, 0x37, 0xcc, 0x61, 0xf6, 0x8b, 0x20, 0xb6, 0x4c, 0xe1, 0x77, 0x0d, 0xa3, 0x3a, 0xd0, 0x67, 0xfd, 0x94, 0x2b, 0xc2, 0x59, 0xf0, 0x88, 0x1f, 0xb7, 0x4f, 0xe7, 0x7f, 0x17, 0xaf, 0x47, 0xe0, 0x78, 0x11, 0xaa, 0x43, 0xdc, 0x76, 0x0f, 0xa8, 0x42, 0xdc, 0x76, 0x10, 0xaa, 0x44, 0xdf, 0x79, 0x14, 0xae, 0x49, 0xe4, 0x80, 0x1b, 0xb6, 0x52, 0xed, 0x89, 0x25, 0xc1, 0x5d, 0xf9, 0x96, 0x32, 0xcf, 0x6c, 0x09, 0xa6, 0x43, 0xe0, 0x7d, 0x1b, 0xb9, 0x56, 0xf4, 0x92, 0x30, 0xcf, 0x6d, 0x0c, 0xaa, 0x49, 0xe8, 0x87, 0x26, 0xc5, 0x65, 0x04, 0xa4, 0x44, 0xe4, 0x84, 0x24, 0xc4, 0x64, 0x05, 0xa5, 0x46, 0xe7, 0x88, 0x29, 0xcb, 0x6c, 0x0d, 0xaf, 0x51, 0xf3, 0x95, 0x37, 0xd9, 0x7c, 0x1e, 0xc1, 0x63, 0x06, 0xa9, 0x4d, 0xf0, 0x93, 0x37, 0xda, 0x7e, 0x22, 0xc6, 0x6a, 0x0e, 0xb3, 0x57, 0xfc, 0xa1, 0x46, 0xeb, 0x90, 0x35, 0xda, 0x80, 0x26, 0xcb, 0x71, 0x17, 0xbd, 0x64, 0x0a, 0xb1, 0x57, 0xfe, 0xa5, 0x4c, 0xf3, 0x9a, 0x42, 0xe9, 0x91, 0x39, 0xe1, 0x89, 0x31, 0xd9, 0x81, 0x2a, 0xd2, 0x7b, 0x24, 0xcd, 0x76, 0x20, 0xc9, 0x72, 0x1c, 0xc6, 0x70, 0x1a, 0xc4, 0x6e, 0x19, 0xc3, 0x6e, 0x18, 0xc3, 0x6e, 0x1a, 0xc5, 0x70, 0x1c, 0xc7, 0x73, 0x1f, 0xcb, 0x77, 0x23, 0xd0, 0x7c, 0x29, 0xd6, 0x83, 0x30, 0xdd, 0x8a, 0x37, 0xe5, 0x93, 0x40, 0xee, 0x9c, 0x4a, 0xf9, 0xa7, 0x56, 0x04, 0xb3, 0x62, 0x11, 0xc0, 0x6f, 0x1f, 0xce, 0x7e, 0x2e, 0xde, 0x8e, 0x3e, 0xee, 0x9e, 0x4f, 0xff, 0xb0, 0x61, 0x12, 0xc3, 0x75, 0x26, 0xd7, 0x89, 0x3b, 0xed, 0x9f, 0x51, 0x03, 0xb6, 0x68, 0x1b, 0xcd, 0x80, 0x33, 0xe7, 0x9a, 0x4d, 0x01, 0xb4, 0x68, 0x1c, 0xd0, 0x84, 0x38, 0xed, 0xa1, 0x56, 0x0b, 0xc0, 0x75, 0x2a, 0xdf, 0x94, 0x4a, 0x00, 0xb5, 0x6b, 0x21, 0xd7, 0x8e, 0x44, 0xfb, 0xb1, 0x68, 0x1f, 0xd6, 0x8d, 0x44, 0xfc, 0xb3, 0x6b, 0x23, 0xdb, 0x93, 0x4b, 0x03, 0xbb, 0x74, 0x2c, 0xe5, 0x9e, 0x57, 0x10, 0xca, 0x83, 0x3c, 0xf6, 0xb0, 0x6a, 0x24, 0xde, 0x98, 0x53, 0x0d, 0xc8, 0x82, 0x3d, 0xf8, 0xb4, 0x6f, 0x2a, 0xe6, 0xa1, 0x5d, 0x19, 0xd5, 0x91, 0x4d, 0x0a, 0xc6, 0x83, 0x40, 0xfd, 0xba, 0x77, 0x34, 0xf1, 0xaf, 0x6d, 0x2a, 0xe8, 0xa6, 0x64, 0x23, 0xe1, 0xa0, 0x5e, 0x1d, 0xdc, 0x9b, 0x5a, 0x19, 0xd9, 0x98, 0x58, 0x18, 0xd8, 0x98, 0x58, 0x18, 0xd8, 0x99, 0x59, 0x1a, 0xdb, 0x9c, 0x5d, 0x1f, 0xe0, 0xa1, 0x63, 0x25, 0xe7, 0xa9, 0x6b, 0x2d, 0xf0, 0xb2, 0x75, 0x37, 0xfa, 0xbd, 0x81, 0x44, 0x07, 0xcb, 0x8e, 0x52, 0x16, 0xda, 0x9e, 0x62, 0x27, 0xeb, 0xb0, 0x75, 0x3a, 0xff, 0xc4, 0x89, 0x4e, 0x14, 0xda, 0x9f, 0x65, 0x2b, 0xf1, 0xb8, 0x7e, 0x45, 0x0b, 0xd2, 0x99, 0x60, 0x27, 0xee, 0xb6, 0x7d, 0x45, 0x0d, 0xd5, 0x9d, 0x65, 0x2d, 0xf5, 0xbe, 0x86, 0x4f, 0x18, 0xe1, 0xaa, 0x74, 0x3d, 0x06, 0xd0, 0x9a, 0x64, 0x2e, 0xf8, 0xc2, 0x8d, 0x57, 0x22, 0xec, 0xb7, 0x82, 0x4e, 0x19, 0xe4, 0xb0, 0x7b, 0x47, 0x13, 0xdf, 0xab, 0x77, 0x44, 0x10, 0xdd, 0xaa, 0x77, 0x44, 0x11, 0xde, 0xab, 0x79, 0x47, 0x14, 0xe2, 0xb0, 0x7e, 0x4d, 0x1b, 0xea, 0xb8, 0x87, 0x56, 0x25, 0xf4, 0xc3, 0x93, 0x62, 0x32, 0x02, 0xd2, 0xa2, 0x72, 0x42, 0x12, 0xe3, 0xb3, 0x84, 0x55, 0x26, 0xf7, 0xc9, 0x9a, 0x6b, 0x3d, 0x0f, 0xe1, 0xb3, 0x85, 0x57, 0x2a, 0xfc, 0xcf, 0xa1, 0x74, 0x47, 0x1b, 0xee, 0xc1, 0x95, 0x68, 0x3c, 0x10, 0xe4, 0xb8, 0x8c, 0x61, 0x35, 0x0a, 0xdf, 0xb4, 0x89, 0x5e, 0x33, 0x08, 0xde, 0xb4, 0x89, 0x5f, 0x35, 0x0b, 0xe2, 0xb8, 0x8f, 0x65, 0x3c, 0x13, 0xea, 0xc1, 0x98, 0x70, 0x47, 0x1f, 0xf7, 0xcf, 0xa7, 0x7f, 0x57, 0x2f, 0x08, 0xe0, 0xb9, 0x92, 0x6b, 0x44, 0x1e, 0xf7, 0xd0, 0xaa, 0x84, 0x5e, 0x38, 0x12, 0xec, 0xc7, 0xa1, 0x7c, 0x56, 0x31, 0x0c, 0xe8, 0xc3, 0x9e, 0x7a, 0x55, 0x31, 0x0d, 0xe9, 0xc5, 0xa1, 0x7e, 0x5a, 0x37, 0x14, 0xf1, 0xce, 0xab, 0x88, 0x65, 0x43, 0x21, 0xfe, 0xdc, 0xba, 0x98, 0x77, 0x55, 0x34, 0x12, 0xf1, 0xd0, 0xaf, 0x8e, 0x6d, 0x4d, 0x2c, 0x0c, 0xec, 0xcc, 0xac, 0x8c, 0x6c, 0x4c, 0x2d, 0x0d, 0xee, 0xcf, 0xb0, 0x91, 0x73, 0x54, 0x35, 0x17, 0xf9, 0xdb, 0xbd, 0x9f, 0x81, 0x64, 0x46, 0x29, 0x0b, 0xee, 0xd1, 0xb5, 0x98, 0x7b, 0x5f, 0x42, 0x26, 0x0a, 0xee, 0xd2, 0xb6, 0x9b, 0x7f, 0x64, 0x49, 0x2e, 0x13, 0xf8, 0xdd, 0xc2, 0xa8, 0x8e, 0x73, 0x59, 0x3f, 0x25, 0x0c, 0xf2, 0xd9, 0xbf, 0xa6, 0x8d, 0x74, 0x5b, 0x42, 0x2a, 0x11, 0xf9, 0xe1, 0xc9, 0xb1, 0x99, 0x81, 0x69, 0x52, 0x3a, 0x23, 0x0c, 0xf5, 0xde, 0xc8, 0xb1, 0x9a, 0x84, 0x6e, 0x58, 0x42, 0x2c, 0x16, 0x01, 0xeb, 0xd6, 0xc0, 0xab, 0x96, 0x82, 0x6d, 0x58, 0x44, 0x2f, 0x1b, 0x07, 0xf3, 0xdf, 0xcb, 0xb8, 0xa4, 0x91, 0x7e, 0x6b, 0x58, 0x45, 0x32, 0x1f, 0x0d, 0xfb, 0xe8, 0xd6, 0xc4, 0xb2, 0xa1, 0x8f, 0x7e, 0x6c, 0x5b, 0x4a, 0x39, 0x28, 0x17, 0x07, 0xf6, 0xe6, 0xd6, 0xc6, 0xb6, 0xa6, 0x96, 0x86, 0x77, 0x67, 0x58, 0x49, 0x3a, 0x2b, 0x1d, 0x0e, 0xff, 0xf1, 0xe3, 0xd5, 0xc7, 0xb9, 0xab, 0x9e, 0x90, 0x83, 0x75, 0x68, 0x5b, 0x4f, 0x42, 0x35, 0x29, 0x1c, 0x10, 0x04, 0xf8, 0xec, 0xe0, 0xd5, 0xc9, 0xbe, 0xb3, 0xa8, 0x9d, 0x92, 0x87, 0x7c, 0x72, 0x68, 0x5d, 0x53, 0x49, 0x3f, 0x36, 0x2c, 0x23, 0x19, 0x10, 0x07, 0xfe, 0xf5, 0xec, 0xe4, 0xdb, 0xd3, 0xcb, 0xc3, 0xbb, 0xb3, 0xab, 0xa3, 0x9c, 0x94, 0x8d, 0x86, 0x7f, 0x78, 0x72, 0x6b, 0x64, 0x5e, 0x58, 0x52, 0x4c, 0x46, 0x40, 0x3b, 0x35, 0x30, 0x2a, 0x25, 0x20, 0x1c, 0x17, 0x12, 0x0e, 0x09, 0x05, 0x01, 0xfd, 0xf9, 0xf5, 0xf2, 0xee, 0xeb, 0xe8, 0xe5, 0xe2, 0xdf, 0xdc, 0xd9, 0xd7, 0xd5, 0xd2, 0xd0, 0xce, 0xcc, 0xcb, 0xc9, 0xc8, 0xc6, 0xc5, 0xc4, 0xc3, 0xc2, 0xc1, 0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc7, 0xc8, 0xc9, 0xcb, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd8, 0xda, 0xdd, 0xdf, 0xe2, 0xe5, 0xe9, 0xec, 0xef, 0xf3, 0xf6, 0xfa, 0xfe, 0x02, 0x06, 0x0a, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x27, 0x2c, 0x31, 0x36, 0x3c, 0x42, 0x47, 0x4d, 0x53, 0x59, 0x60, 0x66, 0x6d, 0x73, 0x7a, 0x81, 0x88, 0x8f, 0x96, 0x9e, 0xa5, 0xad, 0xb5, 0xbd, 0xc5, 0xcd, 0xd5, 0xdd, 0xe6, 0xee, 0xf7, 0x00, 0x09, 0x12, 0x1c, 0x25, 0x2e, 0x38, 0x42, 0x4c, 0x56, 0x60, 0x6a, 0x75, 0x7f, 0x8a, 0x94, 0x9f, 0xaa, 0xb6, 0xc1, 0xcc, 0xd8, 0xe3, 0xef, 0xfb, 0x07, 0x13, 0x1f, 0x2c, 0x38, 0x45, 0x52, 0x5f, 0x6c, 0x79, 0x86, 0x93, 0xa1, 0xaf, 0xbc, 0xca, 0xd8, 0xe6, 0xf5, 0x03, 0x12, 0x20, 0x2f, 0x3e, 0x4d, 0x5c, 0x6b, 0x7b, 0x8a, 0x9a, 0xaa, 0xba, 0xca, 0xda, 0xea, 0xfa, 0x0b, 0x1b, 0x2c, 0x3d, 0x4e, 0x5f, 0x71, 0x82, 0x93, 0xa5, 0xb7, 0xc9, 0xdb, 0xed, 0xff, 0x12, 0x24, 0x37, 0x49, 0x5c, 0x6f, 0x83, 0x96, 0xa9, 0xbd, 0xd0, 0xe4, 0xf8, 0x0c, 0x20, 0x34, 0x49, 0x5d, 0x72, 0x87, 0x9c, 0xb1, 0xc6, 0xdb, 0xf0, 0x06, 0x1c, 0x31, 0x47, 0x5d, 0x73, 0x8a, 0xa0, 0xb7, 0xcd, 0xe4, 0xfb, 0x12, 0x29, 0x40, 0x58, 0x6f, 0x87, 0x9f, 0xb7, 0xcf, 0xe7, 0xff, 0x17, 0x30, 0x48, 0x61, 0x7a, 0x93, 0xac, 0xc6, 0xdf, 0xf8, 0x12, 0x2c, 0x46, 0x60, 0x7a, 0x94, 0xaf, 0xc9, 0xe4, 0xfe, 0x19, 0x34, 0x50, 0x6b, 0x86, 0xa2, 0xbd, 0xd9, 0xf5, 0x11, 0x2d, 0x49, 0x66, 0x82, 0x9f, 0xbc, 0xd9, 0xf6, 0x13, 0x30, 0x4d, 0x6b, 0x89, 0xa6, 0xc4, 0xe2, 0x00, 0x1f, 0x3d, 0x5c, 0x7a, 0x99, 0xb8, 0xd7, 0xf6, 0x15, 0x35, 0x54, 0x74, 0x94, 0xb4, 0xd4, 0xf4, 0x14, 0x34, 0x55, 0x75, 0x96, 0xb7, 0xd8, 0xf9, 0x1b, 0x3c, 0x5d, 0x7f, 0xa1, 0xc3, 0xe5, 0x07, 0x29, 0x4c, 0x6e, 0x91, 0xb3, 0xd6, 0xf9, 0x1d, 0x40, 0x63, 0x87, 0xaa, 0xce, 0xf2, 0x16, 0x3a, 0x5e, 0x83, 0xa7, 0xcc, 0xf1, 0x16, 0x3b, 0x60, 0x85, 0xaa, 0xd0, 0xf6, 0x1b, 0x41, 0x67, 0x8d, 0xb4, 0xda, 0x01, 0x27, 0x4e, 0x75, 0x9c, 0xc3, 0xea, 0x12, 0x39, 0x61, 0x89, 0xb1, 0xd9, 0x01, 0x29, 0x51, 0x7a, 0xa2, 0xcb, 0xf4, 0x1d, 0x46, 0x70, 0x99, 0xc2, 0xec, 0x16, 0x40, 0x6a, 0x94, 0xbe, 0xe9, 0x13, 0x3e, 0x68, 0x93, 0xbe, 0xea, 0x15, 0x40, 0x6c, 0x97, 0xc3, 0xef, 0x1b, 0x47, 0x73, 0xa0, 0xcc, 0xf9, 0x26, 0x53, 0x80, 0xad, 0xda, 0x07, 0x35, 0x63, 0x90, 0xbe, 0xec, 0x1a, 0x49, 0x77, 0xa6, 0xd4, 0x03, 0x32, 0x61, 0x90, 0xbf, 0xef, 0x1e, 0x4e, 0x7e, 0xae, 0xde, 0x0e, 0x3e, 0x6e, 0x9f, 0xcf, 0x00, 0x31, 0x62, 0x93, 0xc5, 0xf6, 0x27, 0x59, 0x8b, 0xbd, 0xef, 0x21, 0x53, 0x86, 0xb8, 0xeb, 0x1d, 0x50, 0x83, 0xb7, 0xea, 0x1d, 0x51, 0x84, 0xb8, 0xec, 0x20, 0x54, 0x88, 0xbd, 0xf1, 0x26, 0x5b, 0x90, 0xc5, 0xfa, 0x2f, 0x64, 0x9a, 0xd0, 0x05, 0x3b, 0x71, 0xa7, 0xde, 0x14, 0x4b, 0x81, 0xb8, 0xef, 0x26, 0x5d, 0x94, 0xcc, 0x03, 0x3b, 0x73, 0xab, 0xe3, 0x1b, 0x53, 0x8b, 0xc4, 0xfc, 0x35, 0x6e, 0xa7, 0xe0, 0x1a, 0x53, 0x8c, 0xc6, 0x00, 0x3a, 0x74, 0xae, 0xe8, 0x23, 0x5d, 0x98, 0xd2, 0x0d, 0x48, 0x84, 0xbf, 0xfa, 0x36, 0x71, 0xad, 0xe9, 0x25, 0x61, 0x9d, 0xda, 0x16, 0x53, 0x90, 0xcd, 0x0a, 0x47, 0x84, 0xc1, 0xff, 0x3d, 0x7a, 0xb8, 0xf6, 0x34, 0x73, 0xb1, 0xf0, 0x2e, 0x6d, 0xac, 0xeb, 0x2a, 0x69, 0xa9, 0xe8, 0x28, 0x68, 0xa8, 0xe8, 0x28, 0x68, 0xa8, 0xe9, 0x29, 0x6a, 0xab, 0xec, 0x2d, 0x6f, 0xb0, 0xf1, 0x33, 0x75, 0xb7, 0xf9, 0x3b, 0x7d, 0xc0, 0x02, 0x45, 0x87, 0xca, 0x0d, 0x51, 0x94, 0xd7, 0x1b, 0x5e, 0xa2, 0xe6, 0x2a, 0x6e, 0xb2, 0xf7, 0x3b, 0x80, 0xc5, 0x0a, 0x4f, 0x94, 0xd9, 0x1e, 0x64, 0xaa, 0xef, 0x35, 0x7b, 0xc1, 0x08, 0x4e, 0x95, 0xdb, 0x22, 0x69, 0xb0, 0xf7, 0x3e, 0x86, 0xcd, 0x15, 0x5d, 0xa5, 0xed, 0x35, 0x7d, 0xc5, 0x0e, 0x56, 0x9f, 0xe8, 0x31, 0x7a, 0xc4, 0x0d, 0x56, 0xa0, 0xea, 0x34, 0x7e, 0xc8, 0x12, 0x5d, 0xa7, 0xf2, 0x3c, 0x87, 0xd2, 0x1e, 0x69, 0xb4, 0x00, 0x4b, 0x97, 0xe3, 0x2f, 0x7b, 0xc7, 0x14, 0x60, 0xad, 0xfa, 0x47, 0x94, 0xe1, 0x2e, 0x7b, 0xc9, 0x17, 0x64, 0xb2, 0x00, 0x4e, 0x9d, 0xeb, 0x3a, 0x88, 0xd7, 0x26, 0x75, 0xc4, 0x13, 0x63, 0xb2, 0x02, 0x52, 0xa2, 0xf2, 0x42, 0x92, 0xe2, 0x33, 0x83, 0xd4, 0x25, 0x76, 0xc7, 0x19, 0x6a, 0xbb, 0x0d, 0x5f, 0xb1, 0x03, 0x55, 0xa7, 0xfa, 0x4c, 0x9f, 0xf1, 0x44, 0x97, 0xeb, 0x3e, 0x91, 0xe5, 0x38, 0x8c, 0xe0, 0x34, 0x88, 0xdc, 0x31, 0x85, 0xda, 0x2f, 0x84, 0xd9, 0x2e, 0x83, 0xd8, 0x2e, 0x84, 0xd9, 0x2f, 0x85, 0xdb, 0x32, 0x88, 0xdf, 0x35, 0x8c, 0xe3, 0x3a, 0x91, 0xe8, 0x40, 0x97, 0xef, 0x47, 0x9f, 0xf7, 0x4f, 0xa7, 0xff, 0x58, 0xb0, 0x09, 0x62, 0xbb, 0x14, 0x6e, 0xc7, 0x20, 0x7a, 0xd4, 0x2e, 0x88, 0xe2, 0x3c, 0x97, 0xf1, 0x4c, 0xa6, 0x01, 0x5c, 0xb8, 0x13, 0x6e, 0xca, 0x25, 0x81, 0xdd, 0x39, 0x95, 0xf1, 0x4e, 0xaa, 0x07, 0x64, 0xc1, 0x1e, 0x7b, 0xd8, 0x35, 0x93, 0xf1, 0x4e, 0xac, 0x0a, 0x68, 0xc7, 0x25, 0x84, 0xe2, 0x41, 0xa0, 0xff, 0x5e, 0xbd, 0x1d, 0x7c, 0xdc, 0x3c, 0x9c, 0xfc, 0x5c, 0xbc, 0x1c, 0x7d, 0xdd, 0x3e, 0x9f, 0x00, 0x61, 0xc3, 0x24, 0x85, 0xe7, 0x49, 0xab, 0x0d, 0x6f, 0xd1, 0x34, 0x96, 0xf9, 0x5b, 0xbe, 0x21, 0x85, 0xe8, 0x4b, 0xaf, 0x12, 0x76, 0xda, 0x3e, 0xa2, 0x06, 0x6b, 0xcf, 0x34, 0x99, 0xfe, 0x63, 0xc8, 0x2d, 0x92, 0xf8, 0x5e, 0xc3, 0x29, 0x8f, 0xf5, 0x5c, 0xc2, 0x29, 0x8f, 0xf6, 0x5d, 0xc4, 0x2b, 0x92, 0xfa, 0x61, 0xc9, 0x31, 0x99, 0x01, 0x69, 0xd1, 0x39, 0xa2, 0x0a, 0x73, 0xdc, 0x45, 0xae, 0x18, 0x81, 0xea, 0x54, 0xbe, 0x28, 0x92, 0xfc, 0x66, 0xd1, 0x3b, 0xa6, 0x10, 0x7b, 0xe6, 0x52, 0xbd, 0x28, 0x94, 0xff, 0x6b, 0xd7, 0x43, 0xaf, 0x1b, 0x88, 0xf4, 0x61, 0xce, 0x3b, 0xa8, 0x15, 0x82, 0xef, 0x5d, 0xcb, 0x38, 0xa6, 0x14, 0x82, 0xf1, 0x5f, 0xce, 0x3c, 0xab, 0x1a, 0x89, 0xf8, 0x67, 0xd7, 0x46, 0xb6, 0x26, 0x96, 0x06, 0x76, 0xe6, 0x56, 0xc7, 0x37, 0xa8, 0x19, 0x8a, 0xfb, 0x6d, 0xde, 0x4f, 0xc1, 0x33, 0xa5, 0x17, 0x89, 0xfb, 0x6e, 0xe0, 0x53, 0xc5, 0x38, 0xab, 0x1f, 0x92, 0x05, 0x79, 0xec, 0x60, 0xd4, 0x48, 0xbc, 0x30, 0xa5, 0x19, 0x8e, 0x03, 0x78, 0xed, 0x62, 0xd7, 0x4c, 0xc2, 0x38, 0xad, 0x23, 0x99, 0x0f, 0x86, 0xfc, 0x73, 0xe9, 0x60, 0xd7, 0x4e, 0xc5, 0x3c, 0xb4, 0x2b, 0xa3, 0x1b, 0x93, 0x0b, 0x83, 0xfb, 0x73, 0xec, 0x64, 0xdd, 0x56, 0xcf, 0x48, 0xc2, 0x3b, 0xb4, 0x2e, 0xa8, 0x22, 0x9c, 0x16, 0x90, 0x0b, 0x85, 0x00, 0x7a, 0xf5, 0x70, 0xec, 0x67, 0xe2, 0x5e, 0xd9, 0x55, 0xd1, 0x4d, 0xc9, 0x45, 0xc2, 0x3e, 0xbb, 0x38, 0xb5, 0x32, 0xaf, 0x2c, 0xa9, 0x27, 0xa5, 0x22, 0xa0, 0x1e, 0x9c, 0x1b, 0x99, 0x18, 0x96, 0x15, 0x94, 0x13, 0x92, 0x11, 0x91, 0x10, 0x90, 0x10, 0x90, 0x10, 0x90, 0x10, 0x90, 0x11, 0x91, 0x12, 0x93, 0x14, 0x95, 0x17, 0x98, 0x19, 0x9b, 0x1d, 0x9f, 0x21, 0xa3, 0x25, 0xa8, 0x2a, 0xad, 0x2f, 0xb2, 0x35, 0xb9, 0x3c, 0xbf, 0x43, 0xc6, 0x4a, 0xce, 0x52, 0xd6, 0x5a, 0xdf, 0x63, 0xe8, 0x6d, 0xf2, 0x77, 0xfc, 0x81, 0x06, 0x8c, 0x12, 0x97, 0x1d, 0xa3, 0x29, 0xb0, 0x36, 0xbd, 0x43, 0xca, 0x51, 0xd8, 0x5f, 0xe6, 0x6e, 0xf5, 0x7d, 0x05, 0x8d, 0x15, 0x9d, 0x25, 0xad, 0x36, 0xbe, 0x47, 0xd0, 0x59, 0xe2, 0x6c, 0xf5, 0x7e, 0x08, 0x92, 0x1c, 0xa6, 0x30, 0xba, 0x45, 0xcf, 0x5a, 0xe4, 0x6f, 0xfa, 0x86, 0x11, 0x9c, 0x28, 0xb3, 0x3f, 0xcb, 0x57, 0xe3, 0x6f, 0xfc, 0x88, 0x15, 0xa2, 0x2f, 0xbc, 0x49, 0xd6, 0x63, 0xf1, 0x7f, 0x0c, 0x9a, 0x28, 0xb6, 0x45, 0xd3, 0x62, 0xf0, 0x7f, 0x0e, 0x9d, 0x2c, 0xbb, 0x4b, 0xda, 0x6a, 0xfa, 0x8a, 0x1a, 0xaa, 0x3a, 0xca, 0x5b, 0xeb, 0x7c, 0x0d, 0x9e, 0x2f, 0xc1, 0x52, 0xe3, 0x75, 0x07, 0x99, 0x2b, 0xbd, 0x4f, 0xe2, 0x74, 0x07, 0x99, 0x2c, 0xbf, 0x53, 0xe6, 0x79, 0x0d, 0xa0, 0x34, 0xc8, 0x5c, 0xf0, 0x84, 0x19, 0xad, 0x42, 0xd7, 0x6c, 0x01, 0x96, 0x2b, 0xc0, 0x56, 0xec, 0x81, 0x17, 0xad, 0x43, 0xda, 0x70, 0x07, 0x9d, 0x34, 0xcb, 0x62, 0xf9, 0x90, 0x28, 0xbf, 0x57, 0xef, 0x87, 0x1f, 0xb7, 0x4f, 0xe7, 0x80, 0x18, 0xb1, 0x4a, 0xe3, 0x7c, 0x16, 0xaf, 0x48, 0xe2, 0x7c, 0x16, 0xb0, 0x4a, 0xe4, 0x7f, 0x19, 0xb4, 0x4e, 0xe9, 0x84, 0x20, 0xbb, 0x56, 0xf2, 0x8d, 0x29, 0xc5, 0x61, 0xfd, 0x99, 0x36, 0xd2, 0x6f, 0x0c, 0xa9, 0x46, 0xe3, 0x80, 0x1d, 0xbb, 0x59, 0xf6, 0x94, 0x32, 0xd0, 0x6f, 0x0d, 0xac, 0x4a, 0xe9, 0x88, 0x27, 0xc6, 0x65, 0x05, 0xa4, 0x44, 0xe4, 0x84, 0x24, 0xc4, 0x64, 0x04, 0xa5, 0x45, 0xe6, 0x87, 0x28, 0xc9, 0x6b, 0x0c, 0xad, 0x4f, 0xf1, 0x93, 0x35, 0xd7, 0x79, 0x1c, 0xbe, 0x61, 0x03, 0xa6, 0x49, 0xed, 0x90, 0x33, 0xd7, 0x7a, 0x1e, 0xc2, 0x66, 0x0a, 0xae, 0x53, 0xf7, 0x9c, 0x41, 0xe6, 0x8b, 0x30, 0xd5, 0x7a, 0x20, 0xc6, 0x6b, 0x11, 0xb7, 0x5d, 0x04, 0xaa, 0x51, 0xf7, 0x9e, 0x45, 0xec, 0x93, 0x3a, 0xe2, 0x89, 0x31, 0xd9, 0x81, 0x29, 0xd1, 0x79, 0x21, 0xca, 0x72, 0x1b, 0xc4, 0x6d, 0x16, 0xc0, 0x69, 0x12, 0xbc, 0x66, 0x10, 0xba, 0x64, 0x0e, 0xb9, 0x63, 0x0e, 0xb8, 0x63, 0x0e, 0xba, 0x65, 0x10, 0xbc, 0x67, 0x13, 0xbf, 0x6b, 0x17, 0xc3, 0x70, 0x1c, 0xc9, 0x76, 0x23, 0xd0, 0x7d, 0x2a, 0xd7, 0x85, 0x33, 0xe0, 0x8e, 0x3c, 0xea, 0x99, 0x47, 0xf6, 0xa4, 0x53, 0x02, 0xb1, 0x60, 0x0f, 0xbf, 0x6e, 0x1e, 0xce, 0x7e, 0x2e, 0xde, 0x8e, 0x3e, 0xef, 0x9f, 0x50, 0x01, 0xb2, 0x63, 0x15, 0xc6, 0x77, 0x29, 0xdb, 0x8d, 0x3f, 0xf1, 0xa3, 0x56, 0x08, 0xbb, 0x6d, 0x20, 0xd3, 0x87, 0x3a, 0xed, 0xa1, 0x54, 0x08, 0xbc, 0x70, 0x24, 0xd8, 0x8d, 0x41, 0xf6, 0xab, 0x60, 0x15, 0xca, 0x7f, 0x34, 0xea, 0xa0, 0x55, 0x0b, 0xc1, 0x77, 0x2e, 0xe4, 0x9b, 0x51, 0x08, 0xbf, 0x76, 0x2d, 0xe4, 0x9c, 0x53, 0x0b, 0xc3, 0x7b, 0x33, 0xeb, 0xa3, 0x5b, 0x14, 0xcc, 0x85, 0x3e, 0xf7, 0xb0, 0x6a, 0x23, 0xdc, 0x96, 0x50, 0x0a, 0xc4, 0x7e, 0x38, 0xf3, 0xad, 0x68, 0x22, 0xdd, 0x98, 0x54, 0x0f, 0xca, 0x86, 0x41, 0xfd, 0xb9, 0x75, 0x31, 0xed, 0xaa, 0x66, 0x23, 0xe0, 0x9d, 0x5a, 0x17, 0xd4, 0x91, 0x4f, 0x0d, 0xca, 0x88, 0x46, 0x04, 0xc3, 0x81, 0x40, 0xfe, 0xbd, 0x7c, 0x3b, 0xfa, 0xb9, 0x79, 0x38, 0xf8, 0xb8, 0x78, 0x38, 0xf8, 0xb8, 0x78, 0x39, 0xf9, 0xba, 0x7b, 0x3c, 0xfd, 0xbf, 0x80, 0x41, 0x03, 0xc5, 0x87, 0x49, 0x0b, 0xcd, 0x90, 0x52, 0x15, 0xd7, 0x9a, 0x5d, 0x21, 0xe4, 0xa7, 0x6b, 0x2e, 0xf2, 0xb6, 0x7a, 0x3e, 0x02, 0xc7, 0x8b, 0x50, 0x15, 0xda, 0x9f, 0x64, 0x29, 0xee, 0xb4, 0x7a, 0x3f, 0x05, 0xcb, 0x91, 0x58, 0x1e, 0xe5, 0xab, 0x72, 0x39, 0x00, 0xc7, 0x8e, 0x56, 0x1d, 0xe5, 0xad, 0x75, 0x3d, 0x05, 0xcd, 0x95, 0x5e, 0x26, 0xef, 0xb8, 0x81, 0x4a, 0x14, 0xdd, 0xa6, 0x70, 0x3a, 0x04, 0xce, 0x98, 0x62, 0x2d, 0xf7, 0xc2, 0x8c, 0x57, 0x22, 0xee, 0xb9, 0x84, 0x50, 0x1b, 0xe7, 0xb3, 0x7f, 0x4b, 0x17, 0xe4, 0xb0, 0x7d, 0x4a, 0x17, 0xe4, 0xb1, 0x7e, 0x4b, 0x19, 0xe7, 0xb4, 0x82, 0x50, 0x1e, 0xed, 0xbb, 0x8a, 0x58, 0x27, 0xf6, 0xc5, 0x94, 0x63, 0x33, 0x02, 0xd2, 0xa2, 0x72, 0x42, 0x12, 0xe2, 0xb2, 0x83, 0x53, 0x24, 0xf5, 0xc6, 0x97, 0x69, 0x3a, 0x0b, 0xdd, 0xaf, 0x81, 0x53, 0x25, 0xf7, 0xca, 0x9c, 0x6f, 0x41, 0x14, 0xe7, 0xbb, 0x8e, 0x61, 0x35, 0x08, 0xdc, 0xb0, 0x84, 0x58, 0x2c, 0x01, 0xd5, 0xaa, 0x7f, 0x54, 0x29, 0xfe, 0xd3, 0xa8, 0x7e, 0x54, 0x29, 0xff, 0xd5, 0xab, 0x82, 0x58, 0x2f, 0x05, 0xdc, 0xb3, 0x8a, 0x61, 0x38, 0x10, 0xe7, 0xbf, 0x97, 0x6f, 0x47, 0x1f, 0xf7, 0xcf, 0xa8, 0x80, 0x59, 0x32, 0x0b, 0xe4, 0xbe, 0x97, 0x70, 0x4a, 0x24, 0xfe, 0xd8, 0xb2, 0x8c, 0x67, 0x41, 0x1c, 0xf6, 0xd1, 0xac, 0x88, 0x63, 0x3e, 0x1a, 0xf5, 0xd1, 0xad, 0x89, 0x65, 0x41, 0x1e, 0xfa, 0xd7, 0xb4, 0x91, 0x6e, 0x4b, 0x28, 0x05, 0xe3, 0xc1, 0x9e, 0x7c, 0x5a, 0x38, 0x17, 0xf5, 0xd4, 0xb2, 0x91, 0x70, 0x4f, 0x2e, 0x0d, 0xed, 0xcc, 0xac, 0x8c, 0x6c, 0x4c, 0x2c, 0x0c, 0xec, 0xcd, 0xad, 0x8e, 0x6f, 0x50, 0x31, 0x13, 0xf4, 0xd5, 0xb7, 0x99, 0x7b, 0x5d, 0x3f, 0x21, 0x04, 0xe6, 0xc9, 0xab, 0x8e, 0x71, 0x55, 0x38, 0x1b, 0xff, 0xe2, 0xc6, 0xaa, 0x8e, 0x72, 0x56, 0x3b, 0x1f, 0x04, 0xe9, 0xce, 0xb3, 0x98, 0x7d, 0x62, 0x48, 0x2e, 0x13, 0xf9, 0xdf, 0xc5, 0xac, 0x92, 0x79, 0x5f, 0x46, 0x2d, 0x14, 0xfb, 0xe2, 0xca, 0xb1, 0x99, 0x81, 0x69, 0x51, 0x39, 0x21, 0x09, 0xf2, 0xda, 0xc3, 0xac, 0x95, 0x7e, 0x68, 0x51, 0x3a, 0x24, 0x0e, 0xf8, 0xe2, 0xcc, 0xb6, 0xa1, 0x8b, 0x76, 0x60, 0x4b, 0x36, 0x22, 0x0d, 0xf8, 0xe4, 0xcf, 0xbb, 0xa7, 0x93, 0x7f, 0x6b, 0x58, 0x44, 0x31, 0x1e, 0x0b, 0xf8, 0xe5, 0xd2, 0xbf, 0xad, 0x9b, 0x88, 0x76, 0x64, 0x52, 0x41, 0x2f, 0x1e, 0x0c, 0xfb, 0xea, 0xd9, 0xc8, 0xb7, 0xa7, 0x96, 0x86, 0x76, 0x66, 0x56, 0x46, 0x36, 0x26, 0x17, 0x07, 0xf8, 0xe9, 0xda, 0xcb, 0xbd, 0xae, 0x9f, 0x91, 0x83, 0x75, 0x67, 0x59, 0x4b, 0x3e, 0x30, 0x23, 0x15, 0x08, 0xfb, 0xef, 0xe2, 0xd5, 0xc9, 0xbc, 0xb0, 0xa4, 0x98, 0x8c, 0x80, 0x75, 0x69, 0x5e, 0x53, 0x48, 0x3d, 0x32, 0x27, 0x1c, 0x12, 0x08, 0xfd, 0xf3, 0xe9, 0xdf, 0xd6, 0xcc, 0xc3, 0xb9, 0xb0, 0xa7, 0x9e, 0x95, 0x8c, 0x84, 0x7b, 0x73, 0x6b, 0x63, 0x5b, 0x53, 0x4b, 0x43, 0x3c, 0x34, 0x2d, 0x26, 0x1f, 0x18, 0x12, 0x0b, 0x04, 0xfe, 0xf8, 0xf2, 0xec, 0xe6, 0xe0, 0xdb, 0xd5, 0xd0, 0xca, 0xc5, 0xc0, 0xbc, 0xb7, 0xb2, 0xae, 0xa9, 0xa5, 0xa1, 0x9d, 0x99, 0x95, 0x92, 0x8e, 0x8b, 0x88, 0x85, 0x82, 0x7f, 0x7c, 0x79, 0x77, 0x75, 0x72, 0x70, 0x6e, 0x6c, 0x6b, 0x69, 0x68, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x62, 0x63, 0x64, 0x65, 0x67, 0x68, 0x69, 0x6b, 0x6d, 0x6f, 0x71, 0x73, 0x75, 0x78, 0x7a, 0x7d, 0x7f, 0x82, 0x85, 0x89, 0x8c, 0x8f, 0x93, 0x96, 0x9a, 0x9e, 0xa2, 0xa6, 0xaa, 0xaf, 0xb3, 0xb8, 0xbd, 0xc2, 0xc7, 0xcc, 0xd1, 0xd6, 0xdc, 0xe2, 0xe7, 0xed, 0xf3, 0xf9, 0x00, 0x06, 0x0d, 0x13, 0x1a, 0x21, 0x28, 0x2f, 0x36, 0x3e, 0x45, 0x4d, 0x55, 0x5d, 0x65, 0x6d, 0x75, 0x7d, 0x86, 0x8e, 0x97, 0xa0, 0xa9, 0xb2, 0xbc, 0xc5, 0xce, 0xd8, 0xe2, 0xec, 0xf6, 0x00, 0x0a, 0x15, 0x1f, 0x2a, 0x34, 0x3f, 0x4a, 0x56, 0x61, 0x6c, 0x78, 0x83, 0x8f, 0x9b, 0xa7, 0xb3, 0xbf, 0xcc, 0xd8, 0xe5, 0xf2, 0xff, 0x0c, 0x19, 0x26, 0x33, 0x41, 0x4f, 0x5c, 0x6a, 0x78, 0x86, 0x95, 0xa3, 0xb2, 0xc0, 0xcf, 0xde, 0xed, 0xfc, 0x0b, 0x1b, 0x2a, 0x3a, 0x4a, 0x5a, 0x6a, 0x7a, 0x8a, 0x9a, 0xab, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22, 0x33, 0x45, 0x57, 0x69, 0x7b, 0x8d, 0x9f, 0xb2, 0xc4, 0xd7, 0xe9, 0xfc, 0x0f, 0x23, 0x36, 0x49, 0x5d, 0x70, 0x84, 0x98, 0xac, 0xc0, 0xd4, 0xe9, 0xfd, 0x12, 0x27, 0x3c, 0x51, 0x66, 0x7b, 0x90, 0xa6, 0xbc, 0xd1, 0xe7, 0xfd, 0x13, 0x2a, 0x40, 0x57, 0x6d, 0x84, 0x9b, 0xb2, 0xc9, 0xe0, 0xf8, 0x0f, 0x27, 0x3f, 0x57, 0x6f, 0x87, 0x9f, 0xb7, 0xd0, 0xe8, 0x01, 0x1a, 0x33, 0x4c, 0x66, 0x7f, 0x98, 0xb2, 0xcc, 0xe6, 0x00, 0x1a, 0x34, 0x4f, 0x69, 0x84, 0x9e, 0xb9, 0xd4, 0xf0, 0x0b, 0x26, 0x42, 0x5d, 0x79, 0x95, 0xb1, 0xcd, 0xe9, 0x06, 0x22, 0x3f, 0x5c, 0x79, 0x96, 0xb3, 0xd0, 0xed, 0x0b, 0x29, 0x46, 0x64, 0x82, 0xa0, 0xbf, 0xdd, 0xfc, 0x1a, 0x39, 0x58, 0x77, 0x96, 0xb5, 0xd5, 0xf4, 0x14, 0x34, 0x54, 0x74, 0x94, 0xb4, 0xd4, 0xf5, 0x15, 0x36, 0x57, 0x78, 0x99, 0xbb, 0xdc, 0xfd, 0x1f, 0x41, 0x63, 0x85, 0xa7, 0xc9, 0xec, 0x0e, 0x31, 0x53, 0x76, 0x99, 0xbd, 0xe0, 0x03, 0x27, 0x4a, 0x6e, 0x92, 0xb6, 0xda, 0xfe, 0x23, 0x47, 0x6c, 0x91, 0xb6, 0xdb, 0x00, 0x25, 0x4a, 0x70, 0x96, 0xbb, 0xe1, 0x07, 0x2d, 0x54, 0x7a, 0xa1, 0xc7, 0xee, 0x15, 0x3c, 0x63, 0x8a, 0xb2, 0xd9, 0x01, 0x29, 0x51, 0x79, 0xa1, 0xc9, 0xf1, 0x1a, 0x42, 0x6b, 0x94, 0xbd, 0xe6, 0x10, 0x39, 0x62, 0x8c, 0xb6, 0xe0, 0x0a, 0x34, 0x5e, 0x89, 0xb3, 0xde, 0x08, 0x33, 0x5e, 0x8a, 0xb5, 0xe0, 0x0c, 0x37, 0x63, 0x8f, 0xbb, 0xe7, 0x13, 0x40, 0x6c, 0x99, 0xc6, 0xf3, 0x20, 0x4d, 0x7a, 0xa7, 0xd5, 0x03, 0x30, 0x5e, 0x8c, 0xba, 0xe9, 0x17, 0x46, 0x74, 0xa3, 0xd2, 0x01, 0x30, 0x5f, 0x8f, 0xbe, 0xee, 0x1e, 0x4e, 0x7e, 0xae, 0xde, 0x0e, 0x3f, 0x6f, 0xa0, 0xd1, 0x02, 0x33, 0x65, 0x96, 0xc7, 0xf9, 0x2b, 0x5d, 0x8f, 0xc1, 0xf3, 0x26, 0x58, 0x8b, 0xbd, 0xf0, 0x23, 0x57, 0x8a, 0xbd, 0xf1, 0x24, 0x58, 0x8c, 0xc0, 0xf4, 0x28, 0x5d, 0x91, 0xc6, 0xfb, 0x30, 0x65, 0x9a, 0xcf, 0x04, 0x3a, 0x70, 0xa5, 0xdb, 0x11, 0x47, 0x7e, 0xb4, 0xeb, 0x21, 0x58, 0x8f, 0xc6, 0xfd, 0x34, 0x6c, 0xa3, 0xdb, 0x13, 0x4b, 0x83, 0xbb, 0xf3, 0x2b, 0x64, 0x9c, 0xd5, 0x0e, 0x47, 0x80, 0xba, 0xf3, 0x2c, 0x66, 0xa0, 0xda, 0x14, 0x4e, 0x88, 0xc3, 0xfd, 0x38, 0x72, 0xad, 0xe8, 0x24, 0x5f, 0x9a, 0xd6, 0x11, 0x4d, 0x89, 0xc5, 0x01, 0x3d, 0x7a, 0xb6, 0xf3, 0x30, 0x6d, 0xaa, 0xe7, 0x24, 0x61, 0x9f, 0xdd, 0x1a, 0x58, 0x96, 0xd4, 0x13, 0x51, 0x90, 0xce, 0x0d, 0x4c, 0x8b, 0xca, 0x09, 0x49, 0x88, 0xc8, 0x08, 0x48, 0x88, 0xc8, 0x08, 0x48, 0x89, 0xc9, 0x0a, 0x4b, 0x8c, 0xcd, 0x0f, 0x50, 0x91, 0xd3, 0x15, 0x57, 0x99, 0xdb, 0x1d, 0x60, 0xa2, 0xe5, 0x27, 0x6a, 0xad, 0xf1, 0x34, 0x77, 0xbb, 0xfe, 0x42, 0x86, 0xca, 0x0e, 0x52, 0x97, 0xdb, 0x20, 0x65, 0xaa, 0xef, 0x34, 0x79, 0xbe, 0x04, 0x4a, 0x8f, 0xd5, 0x1b, 0x61, 0xa8, 0xee, 0x35, 0x7b, 0xc2, 0x09, 0x50, 0x97, 0xde, 0x26, 0x6d, 0xb5, 0xfd, 0x45, 0x8d, 0xd5, 0x1d, 0x65, 0xae, 0xf6, 0x3f, 0x88, 0xd1, 0x1a, 0x64, 0xad, 0xf6, 0x40, 0x8a, 0xd4, 0x1e, 0x68, 0xb2, 0xfd, 0x47, 0x92, 0xdc, 0x27, 0x72, 0xbe, 0x09, 0x54, 0xa0, 0xeb, 0x37, 0x83, 0xcf, 0x1b, 0x67, 0xb4, 0x00, 0x4d, 0x9a, 0xe7, 0x34, 0x81, 0xce, 0x1b, 0x69, 0xb7, 0x04, 0x52, 0xa0, 0xee, 0x3d, 0x8b, 0xda, 0x28, 0x77, 0xc6, 0x15, 0x64, 0xb3, 0x03, 0x52, 0xa2, 0xf2, 0x42, 0x92, 0xe2, 0x32, 0x82, 0xd3, 0x23, 0x74, 0xc5, 0x16, 0x67, 0xb9, 0x0a, 0x5b, 0xad, 0xff, 0x51, 0xa3, 0xf5, 0x47, 0x9a, 0xec, 0x3f, 0x91, 0xe4, 0x37, 0x8b, 0xde, 0x31, 0x85, 0xd8, 0x2c, 0x80, 0xd4, 0x28, 0x7c, 0xd1, 0x25, 0x7a, 0xcf, 0x24, 0x79, 0xce, 0x23, 0x78, 0xce, 0x24, 0x79, 0xcf, 0x25, 0x7b, 0xd2, 0x28, 0x7f, 0xd5, 0x2c, 0x83, 0xda, 0x31, 0x88, 0xe0, 0x37, 0x8f, 0xe7, 0x3f, 0x97, 0xef, 0x47, 0x9f, 0xf8, 0x50, 0xa9, 0x02, 0x5b, 0xb4, 0x0e, 0x67, 0xc0, 0x1a, 0x74, 0xce, 0x28, 0x82, 0xdc, 0x37, 0x91, 0xec, 0x46, 0xa1, 0xfc, 0x58, 0xb3, 0x0e, 0x6a, 0xc5, 0x21, 0x7d, 0xd9, 0x35, 0x91, 0xee, 0x4a, 0xa7, 0x04, 0x61, 0xbe, 0x1b, 0x78, 0xd5, 0x33, 0x91, 0xee, 0x4c, 0xaa, 0x08, 0x67, 0xc5, 0x24, 0x82, 0xe1, 0x40, 0x9f, 0xfe, 0x5d, 0xbd, 0x1c, 0x7c, 0xdc, 0x3c, 0x9c, 0xfc, 0x5c, 0xbc, 0x1d, 0x7d, 0xde, 0x3f, 0xa0, 0x01, 0x63, 0xc4, 0x25, 0x87, 0xe9, 0x4b, 0xad, 0x0f, 0x71, 0xd4, 0x36, 0x99, 0xfb, 0x5e, 0xc1, 0x25, 0x88, 0xeb, 0x4f, 0xb2, 0x16, 0x7a, 0xde, 0x42, 0xa6, 0x0b, 0x6f, 0xd4, 0x39, 0x9e, 0x03, 0x68, 0xcd, 0x32, 0x98, 0xfe, 0x63, 0xc9, 0x2f, 0x95, 0xfc, 0x62, 0xc9, 0x2f, 0x96, 0xfd, 0x64, 0xcb, 0x32, 0x9a, 0x01, 0x69, 0xd1, 0x39, 0xa1, 0x09, 0x71, 0xd9, 0x42, 0xaa, 0x13, 0x7c, 0xe5, 0x4e, 0xb8, 0x21, 0x8a, 0xf4, 0x5e, 0xc8, 0x32, 0x9c, 0x06, 0x71, 0xdb, 0x46, 0xb0, 0x1b, 0x86, 0xf2, 0x5d, 0xc8, 0x34, 0x9f, 0x0b, 0x77, 0xe3, 0x4f, 0xbb, 0x28, 0x94, 0x01, 0x6e, 0xdb, 0x48, 0xb5, 0x22, 0x8f, 0xfd, 0x6b, 0xd8, 0x46, 0xb4, 0x22, 0x91, 0xff, 0x6e, 0xdc, 0x4b, 0xba, 0x29, 0x98, 0x07, 0x77, 0xe6, 0x56, 0xc6, 0x36, 0xa6, 0x16, 0x86, 0xf6, 0x67, 0xd7, 0x48, 0xb9, 0x2a, 0x9b, 0x0d, 0x7e, 0xef, 0x61, 0xd3, 0x45, 0xb7, 0x29, 0x9b, 0x0e, 0x80, 0xf3, 0x65, 0xd8, 0x4b, 0xbf, 0x32, 0xa5, 0x19, 0x8c, 0x00, 0x74, 0xe8, 0x5c, 0xd0, 0x45, 0xb9, 0x2e, 0xa3, 0x18, 0x8d, 0x02, 0x77, 0xec, 0x62, 0xd8, 0x4d, 0xc3, 0x39, 0xaf, 0x26, 0x9c, 0x13, 0x89, 0x00, 0x77, 0xee, 0x65, 0xdc, 0x54, 0xcb, 0x43, 0xbb, 0x33, 0xab, 0x23, 0x9b, 0x13, 0x8c, 0x04, 0x7d, 0xf6, 0x6f, 0xe8, 0x62, 0xdb, 0x54, 0xce, 0x48, 0xc2, 0x3c, 0xb6, 0x30, 0xab, 0x25, 0xa0, 0x1a, 0x95, 0x10, 0x8c, 0x07, 0x82, 0xfe, 0x79, 0xf5, 0x71, 0xed, 0x69, 0xe5, 0x62, 0xde, 0x5b, 0xd8, 0x55, 0xd2, 0x4f, 0xcc, 0x49, 0xc7, 0x45, 0xc2, 0x40, 0xbe, 0x3c, 0xbb, 0x39, 0xb8, 0x36, 0xb5, 0x34, 0xb3, 0x32, 0xb1, 0x31, 0xb0, 0x30, 0xb0, 0x30, 0xb0, 0x30, 0xb0, 0x30, 0xb1, 0x31, 0xb2, 0x33, 0xb4, 0x35, 0xb7, 0x38, 0xb9, 0x3b, 0xbd, 0x3f, 0xc1, 0x43, 0xc5, 0x48, 0xca, 0x4d, 0xcf, 0x52, 0xd5, 0x59, 0xdc, 0x5f, 0xe3, 0x66, 0xea, 0x6e, 0xf2, 0x76, 0xfa, 0x7f, 0x03, 0x88, 0x0d, 0x92, 0x17, 0x9c, 0x21, 0xa6, 0x2c, 0xb2, 0x37, 0xbd, 0x43, 0xc9, 0x50, 0xd6, 0x5d, 0xe3, 0x6a, 0xf1, 0x78, 0xff, 0x86, 0x0e, 0x95, 0x1d, 0xa5, 0x2d, 0xb5, 0x3d, 0xc5, 0x4d, 0xd6, 0x5e, 0xe7, 0x70, 0xf9, 0x82, 0x0c, 0x95, 0x1e, 0xa8, 0x32, 0xbc, 0x46, 0xd0, 0x5a, 0xe5, 0x6f, 0xfa, 0x84, 0x0f, 0x9a, 0x26, 0xb1, 0x3c, 0xc8, 0x53, 0xdf, 0x6b, 0xf7, 0x83, 0x0f, 0x9c, 0x28, 0xb5, 0x42, 0xcf, 0x5c, 0xe9, 0x76, 0x03, 0x91, 0x1f, 0xac, 0x3a, 0xc8, 0x56, 0xe5, 0x73, 0x02, 0x90, 0x1f, 0xae, 0x3d, 0xcc, 0x5b, 0xeb, 0x7a, 0x0a, 0x9a, 0x2a, 0xba, 0x4a, 0xda, 0x6a, 0xfb, 0x8b, 0x1c, 0xad, 0x3e, 0xcf, 0x61, 0xf2, 0x83, 0x15, 0xa7, 0x39, 0xcb, 0x5d, 0xef, 0x82, 0x14, 0xa7, 0x39, 0xcc, 0x5f, 0xf3, 0x86, 0x19, 0xad, 0x40, 0xd4, 0x68, 0xfc, 0x90, 0x24, 0xb9, 0x4d, 0xe2, 0x77, 0x0c, 0xa1, 0x36, 0xcb, 0x60, 0xf6, 0x8c, 0x21, 0xb7, 0x4d, 0xe3, 0x7a, 0x10, 0xa7, 0x3d, 0xd4, 0x6b, 0x02, 0x99, 0x30, 0xc8, 0x5f, 0xf7, 0x8f, 0x27, 0xbf, 0x57, 0xef, 0x87, 0x20, 0xb8, 0x51, 0xea, 0x83, 0x1c, 0xb6, 0x4f, 0xe8, 0x82, 0x1c, 0xb6, 0x50, 0xea, 0x84, 0x1f, 0xb9, 0x54, 0xee, 0x89, 0x24, 0xc0, 0x5b, 0xf6, 0x92, 0x2d, 0xc9, 0x65, 0x01, 0x9d, 0x39, 0xd6, 0x72, 0x0f, 0xac, 0x49, 0xe6, 0x83, 0x20, 0xbd, 0x5b, 0xf9, 0x96, 0x34, 0xd2, 0x70, 0x0f, 0xad, 0x4c, 0xea, 0x89, 0x28, 0xc7, 0x66, 0x05, 0xa5, 0x44, 0xe4, 0x84, 0x24, 0xc4, 0x64, 0x04, 0xa4, 0x45, 0xe5, 0x86, 0x27, 0xc8, 0x69, 0x0b, 0xac, 0x4d, 0xef, 0x91, 0x33, 0xd5, 0x77, 0x19, 0xbc, 0x5e, 0x01, 0xa3, 0x46, 0xe9, 0x8d, 0x30, 0xd3, 0x77, 0x1a, 0xbe, 0x62, 0x06, 0xaa, 0x4e, 0xf3, 0x97, 0x3c, 0xe1, 0x86, 0x2b, 0xd0, 0x75, 0x1a, 0xc0, 0x66, 0x0b, 0xb1, 0x57, 0xfd, 0xa4, 0x4a, 0xf1, 0x97, 0x3e, 0xe5, 0x8c, 0x33, 0xda, 0x82, 0x29, 0xd1, 0x79, 0x21, 0xc9, 0x71, 0x19, 0xc1, 0x6a, 0x12, 0xbb, 0x64, 0x0d, 0xb6, 0x60, 0x09, 0xb2, 0x5c, 0x06, 0xb0, 0x5a, 0x04, 0xae, 0x59, 0x03, 0xae, 0x58, 0x03, 0xae, 0x5a, 0x05, 0xb0, 0x5c, 0x07, 0xb3, 0x5f, 0x0b, 0xb7, 0x63, 0x10, 0xbc, 0x69, 0x16, 0xc3, 0x70, 0x1d, 0xca, 0x77, 0x25, 0xd3, 0x80, 0x2e, 0xdc, 0x8a, 0x39, 0xe7, 0x96, 0x44, 0xf3, 0xa2, 0x51, 0x00, 0xaf, 0x5f, 0x0e, 0xbe, 0x6e, 0x1e, 0xce, 0x7e, 0x2e, 0xde, 0x8f, 0x3f, 0xf0, 0xa1, 0x52, 0x03, 0xb5, 0x66, 0x17, 0xc9, 0x7b, 0x2d, 0xdf, 0x91, 0x43, 0xf6, 0xa8, 0x5b, 0x0d, 0xc0, 0x73, 0x27, 0xda, 0x8d, 0x41, 0xf4, 0xa8, 0x5c, 0x10, 0xc4, 0x78, 0x2d, 0xe1, 0x96, 0x4b, 0x00, 0xb5, 0x6a, 0x1f, 0xd4, 0x8a, 0x40, 0xf5, 0xab, 0x61, 0x17, 0xce, 0x84, 0x3b, 0xf1, 0xa8, 0x5f, 0x16, 0xcd, 0x84, 0x3c, 0xf3, 0xab, 0x63, 0x1b, 0xd3, 0x8b, 0x43, 0xfb, 0xb4, 0x6c, 0x25, 0xde, 0x97, 0x50, 0x0a, 0xc3, 0x7c, 0x36, 0xf0, 0xaa, 0x64, 0x1e, 0xd8, 0x93, 0x4d, 0x08, 0xc2, 0x7d, 0x38, 0xf4, 0xaf, 0x6a, 0x26, 0xe1, 0x9d, 0x59, 0x15, 0xd1, 0x8d, 0x4a, 0x06, 0xc3, 0x80, 0x3d, 0xfa, 0xb7, 0x74, 0x31, 0xef, 0xad, 0x6a, 0x28, 0xe6, 0xa4, 0x63, 0x21, 0xe0, 0x9e, 0x5d, 0x1c, 0xdb, 0x9a, 0x59, 0x19, 0xd8, 0x98, 0x58, 0x18, 0xd8, 0x98, 0x58, 0x18, 0xd9, 0x99, 0x5a, 0x1b, 0xdc, 0x9d, 0x5f, 0x20, 0xe1, 0xa3, 0x65, 0x27, 0xe9, 0xab, 0x6d, 0x30, 0xf2, 0xb5, 0x77, 0x3a, 0xfd, 0xc1, 0x84, 0x47, 0x0b, 0xce, 0x92, 0x56, 0x1a, 0xde, 0xa2, 0x67, 0x2b, 0xf0, 0xb5, 0x7a, 0x3f, 0x04, 0xc9, 0x8e, 0x54, 0x1a, 0xdf, 0xa5, 0x6b, 0x31, 0xf8, 0xbe, 0x85, 0x4b, 0x12, 0xd9, 0xa0, 0x67, 0x2e, 0xf6, 0xbd, 0x85, 0x4d, 0x15, 0xdd, 0xa5, 0x6d, 0x35, 0xfe, 0xc6, 0x8f, 0x58, 0x21, 0xea, 0xb4, 0x7d, 0x46, 0x10, 0xda, 0xa4, 0x6e, 0x38, 0x02, 0xcd, 0x97, 0x62, 0x2c, 0xf7, 0xc2, 0x8e, 0x59, 0x24, 0xf0, 0xbb, 0x87, 0x53, 0x1f, 0xeb, 0xb7, 0x84, 0x50, 0x1d, 0xea, 0xb7, 0x84, 0x51, 0x1e, 0xeb, 0xb9, 0x87, 0x54, 0x22, 0xf0, 0xbe, 0x8d, 0x5b, 0x2a, 0xf8, 0xc7, 0x96, 0x65, 0x34, 0x03, 0xd3, 0xa2, 0x72, 0x42, 0x12, 0xe2, 0xb2, 0x82, 0x52, 0x23, 0xf3, 0xc4, 0x95, 0x66, 0x37, 0x09, 0xda, 0xab, 0x7d, 0x4f, 0x21, 0xf3, 0xc5, 0x97, 0x6a, 0x3c, 0x0f, 0xe1, 0xb4, 0x87, 0x5b, 0x2e, 0x01, 0xd5, 0xa8, 0x7c, 0x50, 0x24, 0xf8, 0xcc, 0xa1, 0x75, 0x4a, 0x1f, 0xf4, 0xc9, 0x9e, 0x73, 0x48, 0x1e, 0xf4, 0xc9, 0x9f, 0x75, 0x4b, 0x22, 0xf8, 0xcf, 0xa5, 0x7c, 0x53, 0x2a, 0x01, 0xd8, 0xb0, 0x87, 0x5f, 0x37, 0x0f, 0xe7, 0xbf, 0x97, 0x6f, 0x48, 0x20, 0xf9, 0xd2, 0xab, 0x84, 0x5e, 0x37, 0x10, 0xea, 0xc4, 0x9e, 0x78, 0x52, 0x2c, 0x07, 0xe1, 0xbc, 0x96, 0x71, 0x4c, 0x28, 0x03, 0xde, 0xba, 0x95, 0x71, 0x4d, 0x29, 0x05, 0xe1, 0xbe, 0x9a, 0x77, 0x54, 0x31, 0x0e, 0xeb, 0xc8, 0xa5, 0x83, 0x61, 0x3e, 0x1c, 0xfa, 0xd8, 0xb7, 0x95, 0x74, 0x52, 0x31, 0x10, 0xef, 0xce, 0xad, 0x8d, 0x6c, 0x4c, 0x2c, 0x0c, 0xec, 0xcc, 0xac, 0x8c, 0x6d, 0x4d, 0x2e, 0x0f, 0xf0, 0xd1, 0xb3, 0x94, 0x75, 0x57, 0x39, 0x1b, 0xfd, 0xdf, 0xc1, 0xa4, 0x86, 0x69, 0x4b, 0x2e, 0x11, 0xf5, 0xd8, 0xbb, 0x9f, 0x82, 0x66, 0x4a, 0x2e, 0x12, 0xf6, 0xdb, 0xbf, 0xa4, 0x89, 0x6e, 0x53, 0x38, 0x1d, 0x02, 0xe8, 0xce, 0xb3, 0x99, 0x7f, 0x65, 0x4c, 0x32, 0x19, 0xff, 0xe6, 0xcd, 0xb4, 0x9b, 0x82, 0x6a, 0x51, 0x39, 0x21, 0x09, 0xf1, 0xd9, 0xc1, 0xa9, 0x92, 0x7a, 0x63, 0x4c, 0x35, 0x1e, 0x08, 0xf1, 0xda, 0xc4, 0xae, 0x98, 0x82, 0x6c, 0x56, 0x41, 0x2b, 0x16, 0x00, 0xeb, 0xd6, 0xc2, 0xad, 0x98, 0x84, 0x6f, 0x5b, 0x47, 0x33, 0x1f, 0x0b, 0xf8, 0xe4, 0xd1, 0xbe, 0xab, 0x98, 0x85, 0x72, 0x5f, 0x4d, 0x3b, 0x28, 0x16, 0x04, 0xf2, 0xe1, 0xcf, 0xbe, 0xac, 0x9b, 0x8a, 0x79, 0x68, 0x57, 0x47, 0x36, 0x26, 0x16, 0x06, 0xf6, 0xe6, 0xd6, 0xc6, 0xb7, 0xa7, 0x98, 0x89, 0x7a, 0x6b, 0x5d, 0x4e, 0x3f, 0x31, 0x23, 0x15, 0x07, 0xf9, 0xeb, 0xde, 0xd0, 0xc3, 0xb5, 0xa8, 0x9b, 0x8f, 0x82, 0x75, 0x69, 0x5c, 0x50, 0x44, 0x38, 0x2c, 0x20, 0x15, 0x09, 0xfe, 0xf3, 0xe8, 0xdd, 0xd2, 0xc7, 0xbc, 0xb2, 0xa8, 0x9d, 0x93, 0x89, 0x7f, 0x76, 0x6c, 0x63, 0x59, 0x50, 0x47, 0x3e, 0x35, 0x2c, 0x24, 0x1b, 0x13, 0x0b, 0x03, 0xfb, 0xf3, 0xeb, 0xe3, 0xdc, 0xd4, 0xcd, 0xc6, 0xbf, 0xb8, 0xb2, 0xab, 0xa4, 0x9e, 0x98, 0x92, 0x8c, 0x86, 0x80, 0x7b, 0x75, 0x70, 0x6a, 0x65, 0x60, 0x5c, 0x57, 0x52, 0x4e, 0x49, 0x45, 0x41, 0x3d, 0x39, 0x35, 0x32, 0x2e, 0x2b, 0x28, 0x25, 0x22, 0x1f, 0x1c, 0x19, 0x17, 0x15, 0x12, 0x10, 0x0e, 0x0c, 0x0b, 0x09, 0x08, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00 }; #endif /* _DECRYPT_BYTE_H_ */ libzc-0.4.1/lib/find_password.c000066400000000000000000000252371331702632000164010ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "ptext_private.h" #include "crc32.h" #define PREKEY1 0x57d2770 /* the only key1 value possible before * 0x12345678, found by exhaustive * search */ #define PASS_MAX_LEN 13 struct final { const uint8_t (*lsbk0_lookup)[2]; const uint32_t *lsbk0_count; char pw[PASS_MAX_LEN]; struct zc_key k[PASS_MAX_LEN + 1]; /* 14 --> store the internal rep at index 0 */ struct zc_key saved; int len_under_test; }; static void inplace_reverse(char *str, size_t len) { char *end = str + len - 1; #define XOR_SWAP(a,b) \ do \ { \ a ^= b; \ b ^= a; \ a ^= b; \ } while (0) while (str < end) { XOR_SWAP(*str, *end); str++; end--; } #undef XOR_SWAP } /** * Zero-out pw and keys */ static void reset(struct final *f) { memset(f->pw, 0, PASS_MAX_LEN); memset(&f->k[1], 0, PASS_MAX_LEN * sizeof(struct zc_key)); } static void save_internal_rep(struct final *f) { f->saved = f->k[0]; } static void restore_internal_rep(struct final *f) { f->k[0] = f->saved; } /** * From 'k' msb and 'km1' lsb (previous key from 'k'), find the key * (key being the byte that went through the crc32 function). */ static char recover_input_byte_from_crcs(uint32_t km1, uint32_t k) { return (lsb(km1) ^ crc_32_invtab[msb(k)] ^ 0x00) & 0xff; } /** * From 'pw', calculate the internal representation of the key and * compare it with 'k'. */ static int compare_pw_with_key(const char *pw, size_t len, const struct zc_key *k) { struct zc_key tmp; set_default_encryption_keys(&tmp); for (size_t i = 0; i < len; ++i) update_keys(pw[i], &tmp, &tmp); return (k->key0 == tmp.key0 && k->key1 == tmp.key1 && k->key2 == tmp.key2) ? 0 : -1; } static int compare_revpw_with_key(const char *pw, size_t len, const struct zc_key *k) { char revpw[PASS_MAX_LEN]; for (int i = len - 1, j = 0; i >= 0; --i, ++j) revpw[j] = pw[i]; return compare_pw_with_key(revpw, len, k); } /** * passwords length 1->4 */ static int try_key_1_4(struct final *f) { for (int len = 1; len <= 4; ++len) { /* recover k0 msb */ f->k[len].key0 = crc32inv(f->k[len - 1].key0, 0x0); /* recover bytes */ uint32_t prev = KEY0; for (int j = 0, k = len - 1; j < len; ++j, --k) { f->pw[j] = recover_input_byte_from_crcs(prev, f->k[k].key0); prev = crc32(prev, f->pw[j]); } if (compare_pw_with_key(f->pw, len, f->k) == 0) return len; } return -1; } /** * From k1 MSBs found earlier, recover full k1 and k0 LSBs. For * example, from: * * key0 = 0x54dca24b key1 = 0x1b079a3b key2 = 0x120a6936 --> Initial * key0 = 0x???????? key1 = 0x64329027 key2 = 0xbd806642 * key0 = 0x???????? key1 = 0x1c?????? key2 = 0x3d945e94 * key0 = 0x???????? key1 = 0x2b?????? key2 = 0x4ccb4379 * key0 = 0x???????? key1 = 0xb3?????? key2 = 0xa253270a * key0 = 0x12345678 key1 = 0x23456789 key2 = 0x34567890 * * recover: * * key0 = 0x54dca24b key1 = 0x1b079a3b key2 = 0x120a6936 --> Initial * key0 = 0x??????97 key1 = 0x64329027 key2 = 0xbd806642 * key0 = 0x??????a2 key1 = 0x1cd05dd7 key2 = 0x3d945e94 * key0 = 0x??????23 key1 = 0x2b7993bc key2 = 0x4ccb4379 * key0 = 0x??????96 key1 = 0xb303049c key2 = 0xa253270a * key0 = 0x12345678 key1 = 0x23456789 key2 = 0x34567890 */ static bool recover_key1_key0lsb(struct zc_key *k, const uint8_t (*lsbk0_lookup)[2], const uint32_t *lsbk0_count, uint32_t level) { if (level == 0) return k->key1 == KEY1; uint32_t key1 = k->key1; uint32_t key1m1 = (k + 1)->key1; uint32_t key1m2 = (k + 2)->key1; uint32_t rhs_step1 = (key1 - 1) * MULTINV; uint32_t rhs_step2 = (rhs_step1 - 1) * MULTINV; uint8_t diff = msb(rhs_step2 - mask_msb(key1m2)); for (uint32_t c = 2; c != 0; --c, --diff) { for (uint32_t i = 0; i < lsbk0_count[diff]; ++i) { uint32_t lsbkey0i = lsbk0_lookup[diff][i]; if (mask_msb(rhs_step1 - lsbkey0i) == mask_msb(key1m1)) { (k + 1)->key1 = rhs_step1 - lsbkey0i; k->key0 = (k->key0 & 0xffffff00) | lsbkey0i; /* set LSB */ if (recover_key1_key0lsb(k + 1, lsbk0_lookup, lsbk0_count, level - 1)) return true; } } } return false; } /** * From the internal representation, we can calculate key1_0, key2_0, * and key2_-1. See equation 2 in Biham & Kocher. */ static void key_56_step1(struct zc_key *k) { /* recover full key2_0 */ k[1].key2 = crc32inv(k[0].key2, msb(k[0].key1)); /* recover full key1_0 */ k[1].key1 = ((k[0].key1 - 1) * MULTINV) - lsb(k[0].key0); /* recover full key2_-1 */ k[2].key2 = crc32inv(k[1].key2, msb(k[1].key1)); } /** * From full key2_0, key1_0 and key2_-1 recover the other full key2 * values and k1 MSBs. * * For example, from: * * key0 = 0x54dca24b key1 = 0x1b079a3b key2 = 0x120a6936 --> Initial * key0 = 0x???????? key1 = 0x64329027 key2 = 0xbd806642 * key0 = 0x???????? key1 = 0x???????? key2 = 0x3d945e94 * key0 = 0x???????? key1 = 0x???????? key2 = 0x???????? * key0 = 0x???????? key1 = 0x???????? key2 = 0x???????? * key0 = 0x12345678 key1 = 0x23456789 key2 = 0x34567890 * * recover key2 MSBs: * * key0 = 0x54dca24b key1 = 0x1b079a3b key2 = 0x120a6936 --> Initial * key0 = 0x???????? key1 = 0x64329027 key2 = 0xbd806642 * key0 = 0x???????? key1 = 0x???????? key2 = 0x3d945e94 * key0 = 0x???????? key1 = 0x???????? key2 = 0x4ccb43?? <-- * key0 = 0x???????? key1 = 0x???????? key2 = 0xa253???? <-- * key0 = 0x12345678 key1 = 0x23456789 key2 = 0x34567890 * * then recover k1 MSBs and the full key2 values: * * key0 = 0x54dca24b key1 = 0x1b079a3b key2 = 0x120a6936 --> Initial * key0 = 0x???????? key1 = 0x64329027 key2 = 0xbd806642 * key0 = 0x???????? key1 = 0x1c?????? key2 = 0x3d945e94 <-- * key0 = 0x???????? key1 = 0x2b?????? key2 = 0x4ccb4379 <-- * key0 = 0x???????? key1 = 0xb3?????? key2 = 0xa253270a <-- * key0 = 0x12345678 key1 = 0x23456789 key2 = 0x34567890 * */ static void key_56_step2(struct zc_key *k, int start) { uint32_t prev = KEY2; /* recover key2_-2 (24 bits msb) */ k[3].key2 = crc32inv(k[2].key2, 0x0); /* recover key2_-3 (16 bits msb) */ k[4].key2 = crc32inv(k[3].key2, 0x0); /* recover key2_-4 (8 bits msb) */ k[5].key2 = crc32inv(k[4].key2, 0x0); /* TODO: k[5] is already known if key is only 5 chars */ /* recover full key1 values */ for (int i = start; i >= 2; --i) { k[i].key1 = recover_input_byte_from_crcs(prev, k[i].key2) << 24; prev = crc32(prev, msb(k[i].key1)); /* do not overwrite key2_-1, since we know the full value */ if (i > 2) k[i].key2 = prev; } } static bool verify_against_key2m1(const struct zc_key *k) { return crc32(k[3].key2, msb(k[2].key1)) == k[2].key2; } static int try_key_5_6(struct final *f) { struct zc_key *k = f->k; key_56_step1(k); for (int i = 4; i <= 5; ++i) { key_56_step2(k, i); if (!verify_against_key2m1(k)) continue; set_default_encryption_keys(&k[i + 1]); k[i + 2].key1 = PREKEY1; if (!recover_key1_key0lsb(&k[1], f->lsbk0_lookup, f->lsbk0_count, i)) continue; /* recover bytes */ for (int j = 0; j < i + 1; ++j) { f->pw[j] = recover_input_byte_from_crcs(k[j + 1].key0, k[j].key0); k[j + 1].key0 = crc32inv(k[j].key0, f->pw[j]); } if (compare_revpw_with_key(f->pw, i + 1, &f->k[0]) < 0) continue; inplace_reverse(f->pw, i + 1); return i + 1; } return -1; } static void recover_prev_key(const struct zc_key *k, char c, struct zc_key *prev) { prev->key2 = crc32inv(k->key2, msb(k->key1)); prev->key1 = ((k->key1 - 1) * MULTINV) - lsb(k->key0); prev->key0 = crc32inv(k->key0, c); } static int recurse_key_7_13(struct final *f, size_t level, struct zc_key current, char *pw) { /* * Try all the possible values at position key_0, key_-1, up to * key_l-6 basically offsetting the internal representation by one * byte at each recursion level. */ if (level > 0) { struct zc_key prev; for (int i = 0; i < 256; ++i) { *pw = i; recover_prev_key(¤t, i, &prev); int ret = recurse_key_7_13(f, level - 1, prev, pw + 1); if (ret > 0) return ret + 1; } return -1; } /* * Try to recover the remaining 6 key bytes by using the same * algorithm as try_key_5_6 (l=6). */ struct zc_key *k = f->k; *k = current; key_56_step1(k); key_56_step2(k, 5); /* verify against key2_-1 */ if (!verify_against_key2m1(k)) goto next; set_default_encryption_keys(&k[6]); k[7].key1 = PREKEY1; if (!recover_key1_key0lsb(&k[1], f->lsbk0_lookup, f->lsbk0_count, 5)) goto next; for (int j = 0; j < 6; ++j) { pw[j] = recover_input_byte_from_crcs(k[j + 1].key0, k[j].key0); k[j + 1].key0 = crc32inv(k[j].key0, pw[j]); } if (compare_revpw_with_key(f->pw, f->len_under_test, &f->saved) < 0) goto next; /* got it! */ inplace_reverse(f->pw, f->len_under_test); return 6; next: restore_internal_rep(f); return -1; } static int try_key_7_13(struct final *f) { save_internal_rep(f); for (int i = 1, len = 7; i <= 7; ++i, ++len) { f->len_under_test = len; if (recurse_key_7_13(f, i, f->k[0], f->pw) == len) { restore_internal_rep(f); return len; } } restore_internal_rep(f); return -1; } static int find_password(const uint8_t (*lsbk0_lookup)[2], const uint32_t *lsbk0_count, const struct zc_key *int_rep, char *out, size_t len) { struct final f; int ret; if (len < PASS_MAX_LEN) return -1; if (int_rep->key0 == KEY0 && int_rep->key1 == KEY1 && int_rep->key2 == KEY2) return 0; /* password has 0 bytes */ /* initialise final structure */ f.lsbk0_lookup = lsbk0_lookup; f.lsbk0_count = lsbk0_count; f.k[0] = *int_rep; ret = try_key_1_4(&f); if (ret > 0) goto found; reset(&f); ret = try_key_5_6(&f); if (ret > 0) goto found; reset(&f); ret = try_key_7_13(&f); if (ret > 0) goto found; /* password not found */ return -1; found: memset(out, 0, len); memcpy(out, f.pw, ret); return ret; } ZC_EXPORT int zc_crk_ptext_find_password(struct zc_crk_ptext *ptext, const struct zc_key *internal_rep, char *out, size_t len) { return find_password(ptext->lsbk0_lookup, ptext->lsbk0_count, internal_rep, out, len); } libzc-0.4.1/lib/inflate.c000066400000000000000000000045541331702632000151600ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include struct zlib_state { z_stream s; }; /* to silence compiler warnings about missing prototypes */ int inflate_new(struct zlib_state **zlib); void inflate_destroy(struct zlib_state *zlib); int inflate_buffer(struct zlib_state *zlib, unsigned char *in, size_t inlen, unsigned char *out, size_t outlen, uint32_t original_crc); int test_buffer_crc(unsigned char *in, size_t inlen, uint32_t original_crc); int inflate_new(struct zlib_state **zlib) { struct zlib_state *tmp; tmp = calloc(1, sizeof(struct zlib_state)); if (!tmp) return -1; tmp->s.zalloc = Z_NULL; tmp->s.zfree = Z_NULL; tmp->s.opaque = Z_NULL; if (inflateInit2(&tmp->s, -MAX_WBITS) != Z_OK) { free(tmp); return -1; } *zlib = tmp; return 0; } void inflate_destroy(struct zlib_state *zlib) { inflateEnd(&zlib->s); free(zlib); } int inflate_buffer(struct zlib_state *zlib, unsigned char *in, size_t inlen, unsigned char *out, size_t outlen, uint32_t original_crc) { int ret; uint32_t crc; zlib->s.avail_in = inlen; zlib->s.next_in = in; crc = crc32(0L, Z_NULL, 0); do { zlib->s.avail_out = outlen; zlib->s.next_out = out; ret = inflate(&zlib->s, Z_NO_FLUSH); if (ret < 0) { inflateReset(&zlib->s); return -1; } crc = crc32(crc, out, outlen - zlib->s.avail_out); } while (ret != Z_STREAM_END); inflateReset(&zlib->s); return crc == original_crc ? 0 : -1; } int test_buffer_crc(unsigned char *in, size_t inlen, uint32_t original_crc) { uint32_t crc = crc32(0L, Z_NULL, 0); crc = crc32(crc, in, inlen); return crc == original_crc ? 0 : -1; } libzc-0.4.1/lib/ka.c000066400000000000000000000046201331702632000141230ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "libzc_private.h" #include "qsort.h" #include #include static void uint_qsort(uint32_t *arr, uint32_t n) { #define uint_lt(a,b) ((*a)<(*b)) QSORT(uint32_t, arr, n, uint_lt); } static void sort(struct ka *a) { uint_qsort(a->array, a->size); } int ka_alloc(struct ka **a, size_t initial_size) { struct ka *tmp; if (initial_size == 0) return -1; tmp = calloc(1, sizeof(struct ka)); if (!tmp) return -1; tmp->array = calloc(1, initial_size * sizeof(uint32_t)); if (!tmp->array) { free(tmp); return -1; } tmp->capacity = tmp->size = initial_size; *a = tmp; return 0; } void ka_free(struct ka *a) { if (!a) return; free(a->array); free(a); } int ka_append(struct ka *a, uint32_t key) { uint32_t *tmp; if (a->size < a->capacity) { a->array[a->size] = key; ++a->size; return 0; } a->capacity += 4096; tmp = realloc(a->array, a->capacity * sizeof(uint32_t)); if (!tmp) { perror("realloc failed"); return -1; } a->array = tmp; a->array[a->size] = key; ++a->size; return 0; } void ka_uniq(struct ka *a) { size_t i = 0; size_t j; if (a->size <= 1) return; sort(a); /* reduce by removing duplicates */ for (j = 1; j < a->size; ++j) { if (a->array[j] != a->array[i]) a->array[++i] = a->array[j]; } a->size = i + 1; } void ka_squeeze(struct ka *a) { if (a->size == a->capacity) return; a->array = realloc(a->array, a->size * sizeof(uint32_t)); a->capacity = a->size; } void ka_empty(struct ka *a) { /* future append will restart at 0 */ a->size = 0; } #ifdef ENABLE_DEBUG void ka_print(struct ka *a, FILE *stream) { for (uint32_t i = 0; i < a->size; ++i) fprintf(stream, "0x%0x\n", a->array[i]); } #endif libzc-0.4.1/lib/libzc.c000066400000000000000000000106051331702632000146330ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include "libzc.h" #include "libzc_private.h" /** * SECTION:libzc * @short_description: libzc context * * The context contains the default values for the library user, * and is passed to all library operations. */ /** * zc_ctx: * * Opaque object representing the library context. */ struct zc_ctx { int refcount; void (*log_fn)(struct zc_ctx *ctx, int priority, const char *file, int line, const char *fn, const char *format, va_list args); int log_priority; }; void zc_log(struct zc_ctx *ctx, int priority, const char *file, int line, const char *fn, const char *format, ...) { va_list args; va_start(args, format); ctx->log_fn(ctx, priority, file, line, fn, format, args); va_end(args); } static void log_stderr(struct zc_ctx *UNUSED(ctx), int UNUSED(priority), const char *UNUSED(file), int UNUSED(line), const char *fn, const char *format, va_list args) { fprintf(stderr, "libzc: %s: ", fn); vfprintf(stderr, format, args); } static int log_priority(const char *priority) { char *endptr; int prio; prio = strtol(priority, &endptr, 10); if (endptr[0] == '\0' || isspace(endptr[0])) return prio; if (strncmp(priority, "err", 3) == 0) return LOG_ERR; if (strncmp(priority, "info", 4) == 0) return LOG_INFO; if (strncmp(priority, "debug", 5) == 0) return LOG_DEBUG; return 0; } /** * zc_new: * @inctx: zc library context * * Create a new library context. * * Returns: 0 on success, -1 on error. **/ ZC_EXPORT int zc_new(struct zc_ctx **inctx) { const char *env; struct zc_ctx *ctx; ctx = calloc(1, sizeof(struct zc_ctx)); if (!ctx) return -1; ctx->refcount = 1; ctx->log_fn = log_stderr; ctx->log_priority = LOG_ERR; /* environment overwrites config */ env = getenv("ZC_LOG"); if (env) zc_set_log_priority(ctx, log_priority(env)); info(ctx, "ctx %p created\n", ctx); dbg(ctx, "log_priority=%d\n", ctx->log_priority); *inctx = ctx; return 0; } /** * zc_ref: * @ctx: zc library context * * Take a reference of the zc library context. * * Returns: the passed zc library context **/ ZC_EXPORT struct zc_ctx *zc_ref(struct zc_ctx *ctx) { if (!ctx) return NULL; ctx->refcount++; return ctx; } /** * zc_unref: * @ctx: zc library context * * Drop a reference of the zc library context. If the refcount * reaches zero, the resources of the context will be released. * **/ ZC_EXPORT struct zc_ctx *zc_unref(struct zc_ctx *ctx) { if (!ctx) return NULL; ctx->refcount--; if (ctx->refcount > 0) return ctx; info(ctx, "ctx %p released\n", ctx); free(ctx); return NULL; } /** * zc_set_log_fn: * @ctx: zc library context * @log_fn: function to be called for logging messages * * The built-in logging writes to stderr. It can be * overridden by a custom function, to plug log messages * into the user's logging functionality. * **/ ZC_EXPORT void zc_set_log_fn(struct zc_ctx *ctx, void (*log_fn)(struct zc_ctx *ctx, int priority, const char *file, int line, const char *fn, const char *format, va_list args)) { ctx->log_fn = log_fn; info(ctx, "custom logging function %p registered\n", log_fn); } /** * zc_get_log_priority: * @ctx: zc library context * * Returns: the current logging priority **/ ZC_EXPORT int zc_get_log_priority(struct zc_ctx *ctx) { return ctx->log_priority; } /** * zc_set_log_priority: * @ctx: zc library context * @priority: the new logging priority * * Set the current logging priority. The value controls which messages * are logged. **/ ZC_EXPORT void zc_set_log_priority(struct zc_ctx *ctx, int priority) { ctx->log_priority = priority; } libzc-0.4.1/lib/libzc.h000066400000000000000000000115401331702632000146370ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _LIBZC_H_ #define _LIBZC_H_ #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** * zc_ctx: * * library user context - reads the config and system environment, * user variables, allows custom logging */ struct zc_ctx; struct zc_ctx *zc_ref(struct zc_ctx *ctx); struct zc_ctx *zc_unref(struct zc_ctx *ctx); int zc_new(struct zc_ctx **inctx); void zc_set_log_fn(struct zc_ctx *ctx, void (*log_fn)(struct zc_ctx *ctx, int priority, const char *file, int line, const char *fn, const char *format, va_list args)); int zc_get_log_priority(struct zc_ctx *ctx); void zc_set_log_priority(struct zc_ctx *ctx, int priority); /** * zc_file: * * contains information about the zip file. */ struct zc_file; struct zc_file *zc_file_ref(struct zc_file *file); struct zc_file *zc_file_unref(struct zc_file *file); int zc_file_new_from_filename(struct zc_ctx *ctx, const char *filename, struct zc_file **file); const char *zc_file_get_filename(const struct zc_file *file); int zc_file_open(struct zc_file *file); int zc_file_close(struct zc_file *file); bool zc_file_isopened(struct zc_file *file); struct zc_info; struct zc_info *zc_file_info_next(struct zc_file *, struct zc_info *info); const char *zc_file_info_name(const struct zc_info *info); uint32_t zc_file_info_size(const struct zc_info *info); long zc_file_info_offset(const struct zc_info *info); long zc_file_info_crypt_header_offset(const struct zc_info *info); const uint8_t *zc_file_info_enc_header(const struct zc_info *info); int zc_file_info_idx(const struct zc_info *info); /** * zc_crk_dict: * * Dictionnary attack. */ struct zc_crk_dict *zc_crk_dict_ref(struct zc_crk_dict *crk); struct zc_crk_dict *zc_crk_dict_unref(struct zc_crk_dict *crk); int zc_crk_dict_new(struct zc_ctx *ctx, struct zc_crk_dict **crk); int zc_crk_dict_init(struct zc_crk_dict *crk, const char *filename); int zc_crk_dict_start(struct zc_crk_dict *crk, const char *dict, char *pw, size_t len); /** * zc_crk_bforce: * * Bruteforce attack. */ #define ZC_PW_MINLEN 1 #define ZC_PW_MAXLEN 16 #define ZC_CHARSET_MAXLEN 96 struct zc_crk_pwcfg { char set[ZC_CHARSET_MAXLEN + 1]; size_t setlen; size_t maxlen; char initial[ZC_PW_MAXLEN + 1]; }; struct zc_crk_bforce; struct zc_crk_bforce *zc_crk_bforce_ref(struct zc_crk_bforce *bforce); struct zc_crk_bforce *zc_crk_bforce_unref(struct zc_crk_bforce *bforce); int zc_crk_bforce_new(struct zc_ctx *ctx, struct zc_crk_bforce **bforce); int zc_crk_bforce_init(struct zc_crk_bforce *bforce, const char *fname, const struct zc_crk_pwcfg *cfg); const char *zc_crk_bforce_sanitized_charset(const struct zc_crk_bforce *bforce); void zc_crk_bforce_force_threads(struct zc_crk_bforce *bforce, long w); int zc_crk_bforce_start(struct zc_crk_bforce *bforce, char *out_pw, size_t out_pw_size); /** * zc_crk_ptext: * * Plaintext cracker. Typically you would call: * 1- zc_crk_ptext_new(); * 2- zc_crk_ptext_set_text(); * 3- zc_crk_ptext_key2_reduction(); * 4- zc_crk_ptext_attack(); * 5- zc_crk_ptext_find_internal_rep(); * 6- zc_crk_ptext_unref(); */ struct zc_key { uint32_t key0; uint32_t key1; uint32_t key2; }; struct zc_crk_ptext; struct zc_crk_ptext *zc_crk_ptext_ref(struct zc_crk_ptext *ptext); struct zc_crk_ptext *zc_crk_ptext_unref(struct zc_crk_ptext *ptext); int zc_crk_ptext_new(struct zc_ctx *ctx, struct zc_crk_ptext **ptext); int zc_crk_ptext_set_text(struct zc_crk_ptext *ptext, const uint8_t *plaintext, const uint8_t *ciphertext, size_t size); void zc_crk_ptext_force_threads(struct zc_crk_ptext *ptext, long w); int zc_crk_ptext_key2_reduction(struct zc_crk_ptext *ptext); size_t zc_crk_ptext_key2_count(const struct zc_crk_ptext *ptext); int zc_crk_ptext_attack(struct zc_crk_ptext *ptext, struct zc_key *out_key); int zc_crk_ptext_find_internal_rep(const struct zc_key *start_key, const uint8_t *ciphertext, size_t size, struct zc_key *internal_rep); int zc_crk_ptext_find_password(struct zc_crk_ptext *ptext, const struct zc_key *internal_rep, char *out, size_t len); #ifdef __cplusplus } /* extern "C" */ #endif #endif libzc-0.4.1/lib/libzc.pc.in000066400000000000000000000003731331702632000154210ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libzc Description: Library for cracking zip file passwords Version: @VERSION@ Libs: -L${libdir} -lzc Libs.private: Cflags: -I${includedir} Requires.private: zlib libzc-0.4.1/lib/libzc_private.h000066400000000000000000000127261331702632000164000ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _LIBZC_PRIVATE_H_ #define _LIBZC_PRIVATE_H_ #include #include #include #include "libzc.h" #include "crc32.h" #include "decrypt_byte.h" #ifdef __GNUC__ # define UNUSED(x) UNUSED_ ## x __attribute__((__unused__)) #else # define UNUSED(x) UNUSED_ ## x #endif static inline void __attribute__((always_inline, format(printf, 2, 3))) zc_log_null(struct zc_ctx *UNUSED(ctx), const char *UNUSED(format), ...) {} #define zc_log_cond(ctx, prio, arg...) \ do { \ if (zc_get_log_priority(ctx) >= prio) \ zc_log(ctx, prio, __FILE__, __LINE__, __FUNCTION__, ## arg); \ } while (0) #ifdef ENABLE_LOGGING # ifdef ENABLE_DEBUG # define dbg(ctx, arg...) zc_log_cond(ctx, LOG_DEBUG, ## arg) # else # define dbg(ctx, arg...) zc_log_null(ctx, ## arg) # endif # define info(ctx, arg...) zc_log_cond(ctx, LOG_INFO, ## arg) # define err(ctx, arg...) zc_log_cond(ctx, LOG_ERR, ## arg) #else # define dbg(ctx, arg...) zc_log_null(ctx, ## arg) # define info(ctx, arg...) zc_log_null(ctx, ## arg) # define err(ctx, arg...) zc_log_null(ctx, ## arg) #endif #define ZC_EXPORT __attribute__ ((visibility("default"))) void zc_log(struct zc_ctx *ctx, int priority, const char *file, int line, const char *fn, const char *format, ...) __attribute__((format(printf, 6, 7))); #define MULT 134775813u #define MULTINV 3645876429u /* modular multiplicative inverse mod2^32 */ #define KEY0 0x12345678 #define KEY1 0x23456789 #define KEY2 0x34567890 #define ZIP_ENCRYPTION_HEADER_LENGTH 12 #define VDATA_MAX 5 #define max(a, b) (( a > b) ? a : b) #define min(a, b) (( a > b) ? b : a) #define INFLATE_CHUNK 16384 struct validation_data { uint8_t encryption_header[12]; uint8_t magic; }; static inline uint32_t pow2(uint32_t p) { return (1 << p); } static inline uint32_t mask_msb(uint32_t v) { return (v & 0xff000000); } static inline uint32_t mask_lsb(uint32_t v) { return (v & 0x000000ff); } static inline uint8_t msb(uint32_t v) { return (v >> 24); } static inline uint8_t lsb(uint32_t v) { return (v & 0xff); } static inline void update_keys(char c, struct zc_key *ksrc, struct zc_key *kdst) { kdst->key0 = crc32(ksrc->key0, c); kdst->key1 = (ksrc->key1 + (kdst->key0 & 0xff)) * MULT + 1; kdst->key2 = crc32(ksrc->key2, kdst->key1 >> 24); } static inline void set_default_encryption_keys(struct zc_key *k) { k->key0 = KEY0; k->key1 = KEY1; k->key2 = KEY2; } static inline void reset_encryption_keys(const struct zc_key *base, struct zc_key *k) { *k = *base; } static inline uint8_t decrypt_byte(uint32_t k) { k |= 2; return ((k * (k ^ 1)) >> 8) & 0xff; } static inline uint8_t decrypt_header(const uint8_t *hdr, struct zc_key *k, uint8_t magic) { uint8_t c; for (size_t i = 0; i < ZIP_ENCRYPTION_HEADER_LENGTH - 1; ++i) { c = hdr[i] ^ decrypt_byte_tab[(k->key2 & 0xffff) >> 2]; update_keys(c, k, k); } /* Returns the last byte of the decrypted header */ return hdr[ZIP_ENCRYPTION_HEADER_LENGTH - 1] ^ decrypt_byte_tab[(k->key2 & 0xffff) >> 2] ^ magic; } int fill_vdata(struct zc_ctx *ctx, const char *filename, struct validation_data *vdata, size_t nmemb); int fill_test_cipher(struct zc_ctx *ctx, const char *filename, unsigned char **buf, size_t *len, uint32_t *original_crc, bool *is_deflated); size_t read_validation_data(struct zc_file *file, struct validation_data *vdata, size_t nmemb); bool test_one_pw(const char *pw, const struct validation_data *vdata, size_t nmemb); int read_crypt_data(struct zc_file *file, unsigned char **buf, size_t *len, uint32_t *original_crc, bool *is_deflated); void decrypt(const unsigned char *in, unsigned char *out, size_t len, const struct zc_key *key); /* zlib stuff */ struct zlib_state; int inflate_new(struct zlib_state **zlib); void inflate_destroy(struct zlib_state *zlib); int inflate_buffer(struct zlib_state *zlib, const unsigned char *in, size_t inlen, unsigned char *out, size_t outlen, uint32_t original_crc); int test_buffer_crc(unsigned char *in, size_t inlen, uint32_t original_crc); /* key array helper */ struct ka { uint32_t *array; size_t size; size_t capacity; }; int ka_alloc(struct ka **a, size_t init_size); void ka_free(struct ka *a); int ka_append(struct ka *a, uint32_t key); void ka_uniq(struct ka *a); void ka_squeeze(struct ka *a); void ka_empty(struct ka *a); #ifdef ENABLE_DEBUG #include void ka_print(struct ka *a, FILE *stream); #endif static inline uint32_t ka_at(const struct ka *a, uint32_t index) { return a->array[index]; } static inline void ka_swap(struct ka **a1, struct ka **a2) { struct ka *t = *a1; *a1 = *a2; *a2 = t; } #endif libzc-0.4.1/lib/list.h000066400000000000000000000135231331702632000145120ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* Adapted from Linux kernel list.h */ #ifndef __LIST_H_ #define __LIST_H_ struct list_head { struct list_head *next; struct list_head *prev; }; #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name) #define INIT_LIST_HEAD(ptr) do { \ (ptr)->next = (ptr); (ptr)->prev = (ptr); \ } while(0) /* * Insert a new entry between two known consecutive entries. * * This is only for internal list manipulation where we know * the prev/next entries already! */ static inline void __list_add(struct list_head *new, struct list_head *prev, struct list_head *next) { next->prev = new; new->next = next; new->prev = prev; prev->next = new; } /** * list_add - add a new entry * @new: new entry to be added * @head: list head to add it after * * Insert a new entry after the specified head. * This is good for implementing stacks. */ static inline void list_add(struct list_head *new, struct list_head *head) { __list_add(new, head, head->next); } /** * list_add_tail - add a new entry * @new: new entry to be added * @head: list head to add it before * * Insert a new entry before the specified head. * This is useful for implementing queues. */ static inline void list_add_tail(struct list_head *new, struct list_head *head) { __list_add(new, head->prev, head); } /* * Delete a list entry by making the prev/next entries * point to each other. * * This is only for internal list manipulation where we know * the prev/next entries already! */ static inline void __list_del(struct list_head *prev, struct list_head *next) { next->prev = prev; prev->next = next; } /** * list_del - deletes entry from list. * @entry: the element to delete from the list. * Note: list_empty on entry does not return true after this, the entry is in an undefined state. */ static inline void list_del(struct list_head *entry) { __list_del(entry->prev, entry->next); entry->next = (void *) 0; entry->prev = (void *) 0; } /** * list_del_init - deletes entry from list and reinitialize it. * @entry: the element to delete from the list. */ static inline void list_del_init(struct list_head *entry) { __list_del(entry->prev, entry->next); INIT_LIST_HEAD(entry); } /** * list_move - delete from one list and add as another's head * @list: the entry to move * @head: the head that will precede our entry */ static inline void list_move(struct list_head *list, struct list_head *head) { __list_del(list->prev, list->next); list_add(list, head); } /** * list_move_tail - delete from one list and add as another's tail * @list: the entry to move * @head: the head that will follow our entry */ static inline void list_move_tail(struct list_head *list, struct list_head *head) { __list_del(list->prev, list->next); list_add_tail(list, head); } /** * list_empty - tests whether a list is empty * @head: the list to test. */ static inline int list_empty(struct list_head *head) { return head->next == head; } /** * list_entry - get the struct for this entry * @ptr: the &struct list_head pointer. * @type: the type of the struct this is embedded in. * @member: the name of the list_struct within the struct. */ #define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) /** * list_for_each - iterate over a list * @pos: the &struct list_head to use as a loop counter. * @head: the head for your list. */ #define list_for_each(pos, head) \ for (pos = (head)->next; pos != (head); \ pos = pos->next) /** * list_for_each_prev - iterate over a list backwards * @pos: the &struct list_head to use as a loop counter. * @head: the head for your list. */ #define list_for_each_prev(pos, head) \ for (pos = (head)->prev; pos != (head); \ pos = pos->prev) /** * list_for_each_safe - iterate over a list safe against removal of list entry * @pos: the &struct list_head to use as a loop counter. * @n: another &struct list_head to use as temporary storage * @head: the head for your list. */ #define list_for_each_safe(pos, n, head) \ for (pos = (head)->next, n = pos->next; pos != (head); \ pos = n, n = pos->next) /** * list_for_each_entry - iterate over list of given type * @pos: the type * to use as a loop counter. * @head: the head for your list. * @member: the name of the list_struct within the struct. */ #define list_for_each_entry(pos, head, member) \ for (pos = list_entry((head)->next, typeof(*pos), member); \ &pos->member != (head); \ pos = list_entry(pos->member.next, typeof(*pos), member)) /** * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry * @pos: the type * to use as a loop counter. * @n: another type * to use as temporary storage * @head: the head for your list. * @member: the name of the list_struct within the struct. */ #define list_for_each_entry_safe(pos, n, head, member) \ for (pos = list_entry((head)->next, typeof(*pos), member), \ n = list_entry(pos->member.next, typeof(*pos), member); \ &pos->member != (head); \ pos = n, n = list_entry(n->member.next, typeof(*n), member)) #endif libzc-0.4.1/lib/ptext_attack.c000066400000000000000000000221711331702632000162240ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include "ptext_private.h" #include "list.h" #define k2(index) w->key2_final[index] #define k1(index) w->key1_final[index] #define k0(index) w->key0_final[index] #define cipher(index) w->ciphertext[index] #define plaintext(index) w->plaintext[index] struct worker { uint32_t key2_final[13]; uint32_t key1_final[13]; uint32_t key0_final[13]; const uint8_t *plaintext; /* points to ptext->plaintext */ const uint8_t *ciphertext; /* points to ptext->ciphertext */ const uint8_t (*lsbk0_lookup)[2]; /* points to ptext->lsbk0_lookup */ const uint32_t *lsbk0_count; /* points to ptext->lsbk0_count */ const struct key2r *k2r; /* points to ptext->k2r */ struct zc_key inter_rep; pthread_t id; pthread_mutex_t *mutex; size_t *next; struct zc_crk_ptext *ptext; int worker_err_status; int pthread_create_err; struct list_head workers; }; static void compute_one_intermediate_int_rep(uint8_t cipher, uint8_t *plaintext, struct zc_key *k) { k->key2 = crc32inv(k->key2, msb(k->key1)); k->key1 = ((k->key1 - 1) * MULTINV) - lsb(k->key0); uint32_t tmp = k->key2 | 3; uint32_t key3 = lsb((tmp * (tmp ^ 1)) >> 8); *plaintext = cipher ^ key3; k->key0 = crc32inv(k->key0, *plaintext); } static int compute_intermediate_internal_rep(struct worker *w, struct zc_key *k) { uint32_t i = 4; k->key2 = k2(i); k->key1 = k1(i); /* key0 is already set */ do { uint8_t p; compute_one_intermediate_int_rep(cipher(i - 1), &p, k); if (p != plaintext(i - 1)) break; --i; } while (i > 0); if (i == 0) { w->inter_rep = *k; return 0; } return -1; } static bool verify_key0(const struct worker *w, uint32_t key0, uint32_t start, uint32_t stop) { for (uint32_t i = start; i < stop; ++i) { key0 = crc32(key0, plaintext(i)); if (mask_lsb(key0) != k0(i + 1)) return false; } return true; } static void key_found(struct worker *w) { pthread_mutex_lock(w->mutex); w->ptext->found = true; w->ptext->found_by = pthread_self(); pthread_mutex_unlock(w->mutex); } static void compute_key0(struct worker *w) { struct zc_key k = { .key0 = 0x0, .key1 = 0x0, .key2 = 0x0 }; /* calculate key0_6{0..15} */ k.key0 = (k0(7) ^ crc_32_tab[k0(6) ^ plaintext(6)]) << 8; k.key0 = (k.key0 | k0(6)) & 0x0000ffff; /* calculate key0_5{0..23} */ k.key0 = (k.key0 ^ crc_32_tab[k0(5) ^ plaintext(5)]) << 8; k.key0 = (k.key0 | k0(5)) & 0x00ffffff; /* calculate key0_4{0..31} */ k.key0 = (k.key0 ^ crc_32_tab[k0(4) ^ plaintext(4)]) << 8; k.key0 = (k.key0 | k0(4)); /* verify against known bytes */ if (!verify_key0(w, k.key0, 4, 12)) return; if (compute_intermediate_internal_rep(w, &k) == 0) key_found(w); } static void recurse_key1(struct worker *w, uint32_t current_idx) { if (current_idx == 3) { compute_key0(w); return; } uint32_t key1i = k1(current_idx); uint32_t rhs_step1 = (key1i - 1) * MULTINV; uint32_t rhs_step2 = (rhs_step1 - 1) * MULTINV; uint8_t diff = msb(rhs_step2 - (mask_msb(k1(current_idx - 2)))); for (uint32_t c = 2; c != 0; --c, --diff) { for (uint32_t i = 0; i < w->lsbk0_count[diff]; ++i) { uint32_t lsbkey0i = w->lsbk0_lookup[diff][i]; if (mask_msb(rhs_step1 - lsbkey0i) == mask_msb(k1(current_idx - 1))) { w->key1_final[current_idx - 1] = rhs_step1 - lsbkey0i; w->key0_final[current_idx] = lsbkey0i; recurse_key1(w, current_idx - 1); } } } } static void compute_key1(struct worker *w) { /* find matching msb, section 3.3 from Biham & Kocher */ for (uint32_t i = 0; i < pow2(24); ++i) { const uint32_t key1_12_tmp = mask_msb(k1(12)) | i; const uint32_t key1_11_tmp = (key1_12_tmp - 1) * MULTINV; if (mask_msb(key1_11_tmp) == mask_msb(k1(11))) { w->key1_final[12] = key1_12_tmp; recurse_key1(w, 12); } } } static uint32_t compute_key1_msb(struct worker *w, uint32_t current_idx) { const uint32_t key2i = k2(current_idx); const uint32_t key2im1 = k2(current_idx - 1); return (key2i << 8) ^ crc_32_invtab[key2i >> 24] ^ key2im1; } static int recurse_key2(struct worker *w, struct ka **array, uint32_t current_idx) { uint8_t key3im1; uint8_t key3im2; if (current_idx == 1) { compute_key1(w); return 0; } key3im1 = generate_key3(w, current_idx - 1); key3im2 = generate_key3(w, current_idx - 2); /* empty array before appending new keys */ ka_empty(array[current_idx - 1]); if (key2r_compute_single(k2(current_idx), array[current_idx - 1], key2r_get_bits_15_2(w->k2r, key3im1), key2r_get_bits_15_2(w->k2r, key3im2), KEY2_MASK_8BITS)) return -1; ka_uniq(array[current_idx - 1]); for (uint32_t i = 0; i < array[current_idx - 1]->size; ++i) { w->key2_final[current_idx - 1] = ka_at(array[current_idx - 1], i); w->key1_final[current_idx] = compute_key1_msb(w, current_idx) << 24; if (recurse_key2(w, array, current_idx - 1)) return -1; } return 0; } static void ptext_final_deinit(struct ka **key2) { for (uint32_t i = 0; i < 12; ++i) { if (key2[i]) { ka_free(key2[i]); key2[i] = NULL; } } } static int ptext_final_init(struct ka **key2) { memset(key2, 0, sizeof(struct ka *)); for (uint32_t i = 0; i < 12; ++i) { /* 64: probably too much but will work everytime */ if (ka_alloc(&key2[i], 64)) { ptext_final_deinit(key2); return -1; } } return 0; } static int get_next_index(struct worker *w, size_t *i) { pthread_mutex_lock(w->mutex); if (w->ptext->found || *w->next == w->ptext->key2->size) { pthread_mutex_unlock(w->mutex); return -1; } *i = (*w->next)++; pthread_mutex_unlock(w->mutex); return 0; } static void *worker(void *p) { struct ka *array[12]; struct worker *w = (struct worker *)p; if (ptext_final_init(array)) return NULL; while (1) { size_t next; if (get_next_index(w, &next)) break; /* nothing more to do */ w->key2_final[12] = w->ptext->key2->array[next]; if (recurse_key2(w, array, 12)) { w->worker_err_status = -1; break; } } ptext_final_deinit(array); return NULL; } static void dealloc_workers(struct list_head *head) { struct worker *w, *tmp; list_for_each_entry_safe(w, tmp, head, workers) { list_del(&w->workers); free(w); } } static int alloc_workers(struct zc_crk_ptext *ptext, struct list_head *head, pthread_mutex_t *mutex, size_t *next, long count) { for (long i = 0; i < count; ++i) { struct worker *w = calloc(1, sizeof(struct worker)); if (!w) { dealloc_workers(head); return -1; } w->plaintext = ptext->plaintext; w->ciphertext = ptext->ciphertext; w->lsbk0_lookup = ptext->lsbk0_lookup; w->lsbk0_count = ptext->lsbk0_count; w->k2r = ptext->k2r; w->mutex = mutex; w->next = next; w->ptext = ptext; list_add(&w->workers, head); } return 0; } ZC_EXPORT void zc_crk_ptext_force_threads(struct zc_crk_ptext *ptext, long w) { ptext->force_threads = w; } static long threads_to_create(const struct zc_crk_ptext *ptext) { if (ptext->force_threads > 0) return ptext->force_threads; long n = sysconf(_SC_NPROCESSORS_ONLN); if (n < 1) return 1; return n; } ZC_EXPORT int zc_crk_ptext_attack(struct zc_crk_ptext *ptext, struct zc_key *out_key) { struct list_head head; pthread_mutex_t mutex; size_t next = 0; struct worker *w; int err; pthread_mutex_init(&mutex, NULL); INIT_LIST_HEAD(&head); err = alloc_workers(ptext, &head, &mutex, &next, threads_to_create(ptext)); if (err) goto end; list_for_each_entry(w, &head, workers) { /* best effort */ w->pthread_create_err = pthread_create(&w->id, NULL, worker, w); if (w->pthread_create_err) perror("pthread_create failed"); } err = -1; list_for_each_entry(w, &head, workers) { if (w->pthread_create_err) continue; pthread_join(w->id, NULL); pthread_mutex_lock(&mutex); if (w->worker_err_status) { err(ptext->ctx, "worker %p encountered a fatal error\n", w); } else if (ptext->found && pthread_equal(ptext->found_by, w->id)) { *out_key = w->inter_rep; err = 0; } pthread_mutex_unlock(&mutex); } dealloc_workers(&head); end: pthread_mutex_destroy(&mutex); return err; } ZC_EXPORT int zc_crk_ptext_find_internal_rep(const struct zc_key *start_key, const uint8_t *ciphertext, size_t size, struct zc_key *internal_rep) { struct zc_key k; uint32_t i; /* the cipher text also includes the 12 prepended bytes */ if (size < 12) return -1; i = size - 1; k = *start_key; do { uint8_t p; compute_one_intermediate_int_rep(ciphertext[i], &p, &k); } while (i--); *internal_rep = k; return 0; } libzc-0.4.1/lib/ptext_private.h000066400000000000000000000033261331702632000164350ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _PTEXT_PRIVATE_H_ #define _PTEXT_PRIVATE_H_ #include #include #include "libzc.h" #include "libzc_private.h" #define KEY2_MASK_6BITS 0xfc00 #define KEY2_MASK_8BITS 0xff00 struct zc_crk_ptext { struct zc_ctx *ctx; int refcount; const uint8_t *plaintext; const uint8_t *ciphertext; size_t size; struct ka *key2; struct key2r *k2r; uint8_t lsbk0_lookup[256][2]; uint32_t lsbk0_count[256]; bool found; pthread_t found_by; long force_threads; }; #define generate_key3(s, i) (s->plaintext[i] ^ s->ciphertext[i]) /* key2 reduction */ struct key2r; int key2r_new(struct key2r **key2r); void key2r_free(struct key2r *key2r); uint16_t *key2r_get_bits_15_2(const struct key2r *key2r, uint8_t key3); struct ka *key2r_compute_first_gen(const uint16_t *key2_bits_15_2); int key2r_compute_single(uint32_t key2i_plus_1, struct ka *key2i, const uint16_t *key2i_bits_15_2, const uint16_t *key2im1_bits_15_2, uint32_t common_bits_mask); #endif /* _PTEXT_PRIVATE_H_ */ libzc-0.4.1/lib/ptext_reduce.c000066400000000000000000000136701331702632000162300ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "ptext_private.h" struct key2r { uint16_t *bits_15_2_cache; }; static void generate_key2_bits_15_2(uint16_t *value, uint8_t key3) { uint32_t valuei = 0; for (uint32_t i = 0; i < pow2(16); i += 4) { uint8_t key3tmp = ((i | 2) * (i | 3)) >> 8; if (key3 == key3tmp) { value[valuei] = i; ++valuei; } } } static uint16_t *generate_bits_15_2(void) { uint16_t *tmp; tmp = malloc(256 * 64 * sizeof(uint16_t)); if (!tmp) return NULL; for (uint32_t key3 = 0; key3 < 256; ++key3) generate_key2_bits_15_2(&tmp[key3 * 64], key3); return tmp; } static void generate_all_key2_bits_31_2(uint32_t *key2, const uint16_t *key2_bits_15_2) { uint32_t i, j; for (i = 0; i < pow2(16); ++i) for (j = 0; j < 64; ++j) key2[i * 64 + j] = (i << 16) | key2_bits_15_2[j]; } int key2r_new(struct key2r **k2r) { struct key2r *tmp; uint16_t *bits_15_2_tmp; tmp = calloc(1, sizeof(struct key2r)); if (!tmp) return -1; bits_15_2_tmp = generate_bits_15_2(); if (!bits_15_2_tmp) { free(tmp); return -1; } tmp->bits_15_2_cache = bits_15_2_tmp; *k2r = tmp; return 0; } void key2r_free(struct key2r *k2r) { free(k2r->bits_15_2_cache); free(k2r); } uint16_t *key2r_get_bits_15_2(const struct key2r *k2r, uint8_t key3) { return &k2r->bits_15_2_cache[key3 * 64]; } struct ka *key2r_compute_first_gen(const uint16_t *key2_bits_15_2) { struct ka *karray; if (ka_alloc(&karray, pow2(22))) return NULL; generate_all_key2_bits_31_2(karray->array, key2_bits_15_2); return karray; } static uint32_t bits_1_0_key2i(uint32_t key2im1, uint32_t key2i) { uint8_t key2i_msb = key2i >> 24; uint32_t tmp = key2im1 ^ crc_32_invtab[key2i_msb]; tmp = (tmp >> 8) & 0x3; /* keep only bit 9 and 8 */ return tmp; } static int generate_all_key2i_with_bits_1_0(struct ka *key2i_array, uint32_t key2i, const uint16_t *key2im1_bits_15_2) { const uint32_t key2im1_bits_31_10 = (key2i << 8) ^ crc_32_invtab[key2i >> 24]; const uint32_t key2im1_bits_15_10_rhs = key2im1_bits_31_10 & 0xfc00; for (int j = 0; j < 64; ++j) { const uint32_t key2im1_bits_15_10_lhs = key2im1_bits_15_2[j] & 0xfc00; /* the left and right hand side share 6 bits in position [15..10]. See biham & kocher 3.1. */ if (key2im1_bits_15_10_rhs == key2im1_bits_15_10_lhs) { uint32_t key2im1; key2im1 = key2im1_bits_31_10 & 0xfffffc00; key2im1 |= key2im1_bits_15_2[j]; if (ka_append(key2i_array, key2i | bits_1_0_key2i(key2im1, key2i))) return -1; } } return 0; } int key2r_compute_single(uint32_t key2i_plus_1, struct ka *key2i, const uint16_t *key2i_bits_15_2, const uint16_t *key2im1_bits_15_2, uint32_t common_bits_mask) { const uint32_t key2i_bits31_8 = (key2i_plus_1 << 8) ^ crc_32_invtab[key2i_plus_1 >> 24]; const uint32_t key2i_bits15_10_rhs = key2i_bits31_8 & common_bits_mask; for (uint32_t i = 0; i < 64; ++i) { const uint32_t key2i_bits15_10_lhs = key2i_bits_15_2[i] & common_bits_mask; /* the left and right hand side share the same 6 bits in position [15..10]. See biham & kocher 3.1. */ if (key2i_bits15_10_rhs == key2i_bits15_10_lhs) { uint32_t key2i_tmp; /* save 22 most significant bits [31..10] */ key2i_tmp = key2i_bits31_8 & 0xfffffc00; /* save bits [15..2] with common 6 bits */ key2i_tmp |= key2i_bits_15_2[i]; /* save bits [1..0] */ if (generate_all_key2i_with_bits_1_0(key2i, key2i_tmp, key2im1_bits_15_2)) return -1; } } return 0; } static int key2r_compute_next_array(struct ka *key2i_plus_1, struct ka *key2i, const uint16_t *key2i_bits_15_2, const uint16_t *key2im1_bits_15_2, uint32_t common_bits_mask) { ka_empty(key2i); for (uint32_t i = 0; i < key2i_plus_1->size; ++i) { if (key2r_compute_single(ka_at(key2i_plus_1, i), key2i, key2i_bits_15_2, key2im1_bits_15_2, common_bits_mask)) return -1; } return 0; } #define SWAP(x, y) do { typeof(x) SWAP = x; x = y; y = SWAP; } while (0) ZC_EXPORT int zc_crk_ptext_key2_reduction(struct zc_crk_ptext *ptext) { struct ka *key2i_plus_1; struct ka *key2i; uint8_t key3i; uint8_t key3im1; /* first gen key2 */ key3i = generate_key3(ptext, ptext->size - 1); key2i_plus_1 = key2r_compute_first_gen(key2r_get_bits_15_2(ptext->k2r, key3i)); if (!key2i_plus_1) return -1; /* allocate space for second array */ if (ka_alloc(&key2i, pow2(22))) { ka_free(key2i_plus_1); return -1; } /* perform reduction */ const uint32_t start_index = ptext->size - 2; for (uint32_t i = start_index; i >= 12; --i) { key3i = generate_key3(ptext, i); key3im1 = generate_key3(ptext, i - 1); if (key2r_compute_next_array(key2i_plus_1, key2i, key2r_get_bits_15_2(ptext->k2r, key3i), key2r_get_bits_15_2(ptext->k2r, key3im1), i == start_index ? KEY2_MASK_6BITS : KEY2_MASK_8BITS)) goto err; ka_uniq(key2i); SWAP(key2i, key2i_plus_1); } ka_squeeze(key2i_plus_1); /* note: we swapped key2i and key2i+1 */ ptext->key2 = key2i_plus_1; /* here, key2i_plus_1, is the array at * index 13 (n=14) this leaves 13 * bytes for the actual attack */ ka_free(key2i); return 0; err: ka_free(key2i); ka_free(key2i_plus_1); return -1; } libzc-0.4.1/lib/pwstream.c000066400000000000000000000200071331702632000153670ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "pwstream.h" #include "libzc_private.h" static const struct entry null_entry = { -1, -1, -1}; /* This algorithm distributes a pool of characters to 'n' password streams. These streams can then generate passwords that are mutually exclusive. For example: pool: a,b,c Distribute to 4 streams of 3 characters (last character appears first): stream0: [a,a] [a,a] [a,c] --> aaa, baa, caa stream1: [a,a] [b,c] [a,c] --> aba, aca, bba, bca, cba, cca stream2: [b,b] [a,c] [a,c] --> aab, abb, acb, bab, bbb, bcb, cab, cbb, ccb stream3: [c,c] [a,c] [a,c] --> aac, abc, acc, bac, bbc, bcc, cac, cbc, ccc The output of the algorithm is a table of streams*characters entries. Each entry contains a start and end offset to the character pool. Using these offsets we can easily loop over all possible 'strings' using simple for-loops. Pseudo-code (again for 3 characters strings): for (i = table[stream0, 2].start; i <= table[stream0, 2].stop; ++i) str[0] = pool[i]; for (j = table[stream0, 1].start; j <= table[stream0, 1].stop; ++j) str[1] = pool[j]; for (k = table[stream0, 0].start; k <= table[stream0, 0].stop; ++k) str[2] = pool[k]; do_stuff(str); The entry table is divided in the following way: +----------------------------------+ |s0c0|s1c0|s2c0|s0c1|s1c1|s2c1|....| +----------------------------------+ where s0-->stream0 and c0-->character0. */ struct pwstream { struct entry *entry; size_t initial; size_t rows; size_t cols; size_t real_cols; size_t plen; }; static int compare_entries(const void *a, const void *b) { const struct entry *ea = (const struct entry *)a; const struct entry *eb = (const struct entry *)b; /* since entries are always mutually exclusive, compare only the * 'start' member */ return (ea->start > eb->start) - (ea->start < eb->start); } static void sort(struct entry *e, size_t streams) { qsort(e, streams, sizeof(struct entry), compare_entries); } /** * Get entry pointer at [row][col]. */ static struct entry *get(struct pwstream *t, size_t row, size_t col) { return &t->entry[t->cols * row + col]; } /** * Split the given sequence of length 'len' in streams. * i.e.: 1,2,3,4,5 in 3 streams ==> [1,2],[3,4],[5] */ static void split_less(size_t plen, size_t streams, struct entry *t) { for (size_t i = 0; i < streams; ++i) { int start = (i * plen) / streams; t[i].start = start; t[i].initial = start; t[i].stop = ((i + 1) * plen) / streams - 1; } } /** * 1,2,3 in 4 streams ==> [1],[1],[2],[3] */ static void split_more(size_t plen, size_t streams, struct entry *e) { for (size_t i = 0; i < streams; ++i) { int tmp = i % plen; e[i].start = tmp; e[i].stop = tmp; e[i].initial = tmp; } sort(e, streams); } /** * 1,2,3,4 in 4 streams ==> [1],[2],[3],[4] */ static void split_equal(size_t plen, struct entry *e) { for (size_t i = 0; i < plen; ++i) { e[i].start = i; e[i].stop = i; e[i].initial = i; } } /** * Distribute sequence @seq in @streams and store the result at @entry. */ static void distribute(size_t plen, size_t streams, struct entry *entry) { if (streams == 1) { entry->start = 0; entry->stop = plen - 1; entry->initial = 0; } else if (streams == plen) { split_equal(plen, entry); } else if (streams > plen) { split_more(plen, streams, entry); } else split_less(plen, streams, entry); } /** * Compares entries e1 and e2. */ static bool is_equal_entries(const struct entry *e1, const struct entry *e2) { return (e1->start == e2->start && e1->stop == e2->stop); } /** * Initialize entry table with default values. */ static void entry_table_init(struct pwstream *t, int start, int stop) { for (size_t i = 0; i < t->rows * t->cols; ++i) { t->entry[i].start = start; t->entry[i].stop = stop; t->entry[i].initial = start; } } /** * Count the number of entries identical to @e on row @row. */ static size_t uniq(struct pwstream *t, size_t row, const struct entry *e) { size_t count = 0; struct entry *n = get(t, row, 0); for (size_t i = 0; i < t->cols; ++i) { if (is_equal_entries(&n[i], e)) ++count; } return count; } /** * Count the number of entries identical to @e and consider @len * entries. */ static size_t uniq_from_entry(const struct entry *e, size_t len) { size_t count = 1; /* first entry is always equal */ for (size_t i = 1; i < len; ++i) { if (is_equal_entries(&e[i], e)) ++count; } return count; } static void recurse(struct pwstream *t, size_t count, struct entry *e) { if (count == 1) return; distribute(t->plen, count, e); size_t u = 0; for (size_t i = 0; i < count; i += u) { u = uniq_from_entry(&e[i], count - i); recurse(t, u, &e[i + t->cols]); } } static void generate(struct pwstream *pws) { /* do a first distribution for character 0 */ distribute(pws->plen, pws->cols, pws->entry); /* generate the remaining entries */ for (size_t i = 0, u = 0; i < pws->cols; i += u) { u = uniq(pws, 0, &pws->entry[i]); if (u > 1) recurse(pws, u, get(pws, 1, i)); } } static bool is_before(const struct entry *e, int c) { return (c < e->start); } static bool is_after(const struct entry *e, int c) { return (c > e->stop); } static bool is_enclosed(const struct entry *e, int c) { return !is_before(e, c) && !is_after(e, c); } static void generate_initial_indexes(struct pwstream *pws, const size_t *initial) { for (size_t i = 0; i < pws->rows; ++i) { for (size_t j = 0; j < pws->cols; ++j) { struct entry *e = get(pws, i, j); if (is_enclosed(e, initial[i])) e->initial = initial[i]; else if (is_after(e, initial[i])) e->initial = e->stop; else e->initial = e->start; } } } static size_t ceil_streams(size_t pool_len, size_t pw_len, size_t streams) { long double permut = powl((long double)pool_len, (long double)pw_len); if (permut == HUGE_VALL) /* assume we won't ever have more than HUGE_VAL streams */ return streams; else if (permut < (long double)streams) return (size_t)permut; return streams; } int pwstream_new(struct pwstream **pws) { struct pwstream *p = calloc(1, sizeof(struct pwstream)); if (!p) return -1; p->entry = NULL; p->rows = 0; p->cols = 0; p->plen = 0; *pws = p; return 0; } void pwstream_free(struct pwstream *pws) { if (pws->entry) free(pws->entry); free(pws); } int pwstream_generate(struct pwstream *pws, size_t pool_len, size_t pw_len, size_t streams, const size_t *initial) { if (pws->entry) free(pws->entry); size_t cstrm = ceil_streams(pool_len, pw_len, streams); pws->entry = calloc(cstrm * pw_len, sizeof(struct entry)); if (!pws->entry) { pws->rows = 0; pws->cols = 0; pws->plen = 0; pws->real_cols = 0; return -1; } pws->rows = pw_len; pws->cols = cstrm; pws->plen = pool_len; pws->real_cols = streams; entry_table_init(pws, 0, pool_len - 1); generate(pws); if (initial) generate_initial_indexes(pws, initial); return 0; } const struct entry *pwstream_get_entry(struct pwstream *pws, size_t stream, size_t pos) { if (stream >= pws->cols) return &null_entry; return get(pws, pos, stream); } size_t pwstream_get_pwlen(const struct pwstream *pws) { return pws->rows; } size_t pwstream_get_stream_count(const struct pwstream *pws) { return pws->real_cols; } bool pwstream_is_empty(struct pwstream *pws, unsigned int stream) { return stream >= pws->cols; } libzc-0.4.1/lib/pwstream.h000066400000000000000000000025201331702632000153740ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _PWSTREAM_H_ #define _PWSTREAM_H_ struct pwstream; struct entry { int start, stop, initial; }; int pwstream_new(struct pwstream **pws); void pwstream_free(struct pwstream *pws); int pwstream_generate(struct pwstream *pws, size_t pool_len, size_t pw_len, size_t streams, const size_t *initial); const struct entry *pwstream_get_entry(struct pwstream *pws, size_t stream, size_t pos); size_t pwstream_get_pwlen(const struct pwstream *pws); size_t pwstream_get_stream_count(const struct pwstream *pws); bool pwstream_is_empty(struct pwstream *pws, unsigned int stream); #endif /* _PWSTREAM_H_ */ libzc-0.4.1/lib/qsort.h000066400000000000000000000261401331702632000147060ustar00rootroot00000000000000/* $Id: qsort.h,v 1.5 2008-01-28 18:16:49 mjt Exp $ * Adopted from GNU glibc by Mjt. * See stdlib/qsort.c in glibc */ /* Copyright (C) 1991, 1992, 1996, 1997, 1999 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Douglas C. Schmidt (schmidt@ics.uci.edu). The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ /* in-line qsort implementation. Differs from traditional qsort() routine * in that it is a macro, not a function, and instead of passing an address * of a comparison routine to the function, it is possible to inline * comparison routine, thus speeding up sorting a lot. * * Usage: * #include "iqsort.h" * #define islt(a,b) (strcmp((*a),(*b))<0) * char *arr[]; * int n; * QSORT(char*, arr, n, islt); * * The "prototype" and 4 arguments are: * QSORT(TYPE,BASE,NELT,ISLT) * 1) type of each element, TYPE, * 2) address of the beginning of the array, of type TYPE*, * 3) number of elements in the array, and * 4) comparision routine. * Array pointer and number of elements are referenced only once. * This is similar to a call * qsort(BASE,NELT,sizeof(TYPE),ISLT) * with the difference in last parameter. * Note the islt macro/routine (it receives pointers to two elements): * the only condition of interest is whenever one element is less than * another, no other conditions (greather than, equal to etc) are tested. * So, for example, to define integer sort, use: * #define islt(a,b) ((*a)<(*b)) * QSORT(int, arr, n, islt) * * The macro could be used to implement a sorting function (see examples * below), or to implement the sorting algorithm inline. That is, either * create a sorting function and use it whenever you want to sort something, * or use QSORT() macro directly instead a call to such routine. Note that * the macro expands to quite some code (compiled size of int qsort on x86 * is about 700..800 bytes). * * Using this macro directly it isn't possible to implement traditional * qsort() routine, because the macro assumes sizeof(element) == sizeof(TYPE), * while qsort() allows element size to be different. * * Several ready-to-use examples: * * Sorting array of integers: * void int_qsort(int *arr, unsigned n) { * #define int_lt(a,b) ((*a)<(*b)) * QSORT(int, arr, n, int_lt); * } * * Sorting array of string pointers: * void str_qsort(char *arr[], unsigned n) { * #define str_lt(a,b) (strcmp((*a),(*b)) < 0) * QSORT(char*, arr, n, str_lt); * } * * Sorting array of structures: * * struct elt { * int key; * ... * }; * void elt_qsort(struct elt *arr, unsigned n) { * #define elt_lt(a,b) ((a)->key < (b)->key) * QSORT(struct elt, arr, n, elt_lt); * } * * And so on. */ /* Swap two items pointed to by A and B using temporary buffer t. */ #define _QSORT_SWAP(a, b, t) ((void)((t = *a), (*a = *b), (*b = t))) /* Discontinue quicksort algorithm when partition gets below this size. This particular magic number was chosen to work best on a Sun 4/260. */ #define _QSORT_MAX_THRESH 4 /* Stack node declarations used to store unfulfilled partition obligations * (inlined in QSORT). typedef struct { QSORT_TYPE *_lo, *_hi; } qsort_stack_node; */ /* The next 4 #defines implement a very fast in-line stack abstraction. */ /* The stack needs log (total_elements) entries (we could even subtract log(MAX_THRESH)). Since total_elements has type unsigned, we get as upper bound for log (total_elements): bits per byte (CHAR_BIT) * sizeof(unsigned). */ #define _QSORT_STACK_SIZE (8 * sizeof(unsigned)) #define _QSORT_PUSH(top, low, high) \ (((top->_lo = (low)), (top->_hi = (high)), ++top)) #define _QSORT_POP(low, high, top) \ ((--top, (low = top->_lo), (high = top->_hi))) #define _QSORT_STACK_NOT_EMPTY (_stack < _top) /* Order size using quicksort. This implementation incorporates four optimizations discussed in Sedgewick: 1. Non-recursive, using an explicit stack of pointer that store the next array partition to sort. To save time, this maximum amount of space required to store an array of SIZE_MAX is allocated on the stack. Assuming a 32-bit (64 bit) integer for size_t, this needs only 32 * sizeof(stack_node) == 256 bytes (for 64 bit: 1024 bytes). Pretty cheap, actually. 2. Chose the pivot element using a median-of-three decision tree. This reduces the probability of selecting a bad pivot value and eliminates certain extraneous comparisons. 3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving insertion sort to order the MAX_THRESH items within each partition. This is a big win, since insertion sort is faster for small, mostly sorted array segments. 4. The larger of the two sub-partitions is always pushed onto the stack first, with the algorithm then concentrating on the smaller partition. This *guarantees* no more than log (total_elems) stack size is needed (actually O(1) in this case)! */ /* The main code starts here... */ #define QSORT(QSORT_TYPE,QSORT_BASE,QSORT_NELT,QSORT_LT) \ { \ QSORT_TYPE *const _base = (QSORT_BASE); \ const unsigned _elems = (QSORT_NELT); \ QSORT_TYPE _hold; \ \ /* Don't declare two variables of type QSORT_TYPE in a single \ * statement: eg `TYPE a, b;', in case if TYPE is a pointer, \ * expands to `type* a, b;' wich isn't what we want. \ */ \ \ if (_elems > _QSORT_MAX_THRESH) { \ QSORT_TYPE *_lo = _base; \ QSORT_TYPE *_hi = _lo + _elems - 1; \ struct { \ QSORT_TYPE *_hi; QSORT_TYPE *_lo; \ } _stack[_QSORT_STACK_SIZE], *_top = _stack + 1; \ \ while (_QSORT_STACK_NOT_EMPTY) { \ QSORT_TYPE *_left_ptr; QSORT_TYPE *_right_ptr; \ \ /* Select median value from among LO, MID, and HI. Rearrange \ LO and HI so the three values are sorted. This lowers the \ probability of picking a pathological pivot value and \ skips a comparison for both the LEFT_PTR and RIGHT_PTR in \ the while loops. */ \ \ QSORT_TYPE *_mid = _lo + ((_hi - _lo) >> 1); \ \ if (QSORT_LT (_mid, _lo)) \ _QSORT_SWAP (_mid, _lo, _hold); \ if (QSORT_LT (_hi, _mid)) { \ _QSORT_SWAP (_mid, _hi, _hold); \ if (QSORT_LT (_mid, _lo)) \ _QSORT_SWAP (_mid, _lo, _hold); \ } \ \ _left_ptr = _lo + 1; \ _right_ptr = _hi - 1; \ \ /* Here's the famous ``collapse the walls'' section of quicksort. \ Gotta like those tight inner loops! They are the main reason \ that this algorithm runs much faster than others. */ \ do { \ while (QSORT_LT (_left_ptr, _mid)) \ ++_left_ptr; \ \ while (QSORT_LT (_mid, _right_ptr)) \ --_right_ptr; \ \ if (_left_ptr < _right_ptr) { \ _QSORT_SWAP (_left_ptr, _right_ptr, _hold); \ if (_mid == _left_ptr) \ _mid = _right_ptr; \ else if (_mid == _right_ptr) \ _mid = _left_ptr; \ ++_left_ptr; \ --_right_ptr; \ } \ else if (_left_ptr == _right_ptr) { \ ++_left_ptr; \ --_right_ptr; \ break; \ } \ } while (_left_ptr <= _right_ptr); \ \ /* Set up pointers for next iteration. First determine whether \ left and right partitions are below the threshold size. If so, \ ignore one or both. Otherwise, push the larger partition's \ bounds on the stack and continue sorting the smaller one. */ \ \ if (_right_ptr - _lo <= _QSORT_MAX_THRESH) { \ if (_hi - _left_ptr <= _QSORT_MAX_THRESH) \ /* Ignore both small partitions. */ \ _QSORT_POP (_lo, _hi, _top); \ else \ /* Ignore small left partition. */ \ _lo = _left_ptr; \ } \ else if (_hi - _left_ptr <= _QSORT_MAX_THRESH) \ /* Ignore small right partition. */ \ _hi = _right_ptr; \ else if (_right_ptr - _lo > _hi - _left_ptr) { \ /* Push larger left partition indices. */ \ _QSORT_PUSH (_top, _lo, _right_ptr); \ _lo = _left_ptr; \ } \ else { \ /* Push larger right partition indices. */ \ _QSORT_PUSH (_top, _left_ptr, _hi); \ _hi = _right_ptr; \ } \ } \ } \ \ /* Once the BASE array is partially sorted by quicksort the rest \ is completely sorted using insertion sort, since this is efficient \ for partitions below MAX_THRESH size. BASE points to the \ beginning of the array to sort, and END_PTR points at the very \ last element in the array (*not* one beyond it!). */ \ \ { \ QSORT_TYPE *const _end_ptr = _base + _elems - 1; \ QSORT_TYPE *_tmp_ptr = _base; \ register QSORT_TYPE *_run_ptr; \ QSORT_TYPE *_thresh; \ \ _thresh = _base + _QSORT_MAX_THRESH; \ if (_thresh > _end_ptr) \ _thresh = _end_ptr; \ \ /* Find smallest element in first threshold and place it at the \ array's beginning. This is the smallest array element, \ and the operation speeds up insertion sort's inner loop. */ \ \ for (_run_ptr = _tmp_ptr + 1; _run_ptr <= _thresh; ++_run_ptr) \ if (QSORT_LT (_run_ptr, _tmp_ptr)) \ _tmp_ptr = _run_ptr; \ \ if (_tmp_ptr != _base) \ _QSORT_SWAP (_tmp_ptr, _base, _hold); \ \ /* Insertion sort, running from left-hand-side \ * up to right-hand-side. */ \ \ _run_ptr = _base + 1; \ while (++_run_ptr <= _end_ptr) { \ _tmp_ptr = _run_ptr - 1; \ while (QSORT_LT (_run_ptr, _tmp_ptr)) \ --_tmp_ptr; \ \ ++_tmp_ptr; \ if (_tmp_ptr != _run_ptr) { \ QSORT_TYPE *_trav = _run_ptr + 1; \ while (--_trav >= _run_ptr) { \ QSORT_TYPE *_hi; QSORT_TYPE *_lo; \ _hold = *_trav; \ \ for (_hi = _lo = _trav; --_lo >= _tmp_ptr; _hi = _lo) \ *_hi = *_lo; \ *_hi = _hold; \ } \ } \ } \ } \ \ } libzc-0.4.1/lib/zc_crk_bforce.c000066400000000000000000000475151331702632000163350ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include "list.h" #include "libzc.h" #include "pwstream.h" #include "libzc_private.h" /* The length here refers to the length of the 'candidate' field. */ #define LEN 64 /* bruteforce cracker */ struct zc_crk_bforce { struct zc_ctx *ctx; int refcount; /* validation data */ struct validation_data vdata[VDATA_MAX]; size_t vdata_size; unsigned char *cipher; size_t cipher_size; bool cipher_is_deflated; uint32_t original_crc; uint8_t pre_magic_xor_header; /* zip filename */ char *filename; /* initial password */ char ipw[ZC_PW_MAXLEN + 1]; size_t ipwlen; size_t maxlen; /* character set */ char set[ZC_CHARSET_MAXLEN + 1]; size_t setlen; /* password streams */ struct pwstream **pws; size_t pwslen; /* result of thread creation */ int pthread_create_err; long force_threads; struct list_head workers_head; struct list_head cleanup_head; pthread_mutex_t mutex; pthread_cond_t cond; bool found; }; struct worker { struct list_head workers; struct list_head cleanup; pthread_t thread_id; size_t id; char pw[ZC_PW_MAXLEN + 1]; bool found; unsigned char *inflate; unsigned char *plaintext; struct zlib_state *zlib; struct hash { uint32_t initk0[LEN]; uint32_t initk1[LEN]; uint32_t initk2[LEN]; uint32_t k0[LEN]; uint32_t k1[LEN]; uint32_t k2[LEN]; uint64_t candidate; } h; struct zc_crk_bforce *crk; }; static size_t unique(char *str, size_t len) { if (len <= 1) return len; size_t j = 0; for (size_t i = 1; i < len; ++i) { if (str[i] != str[j]) str[++j] = str[i]; } return j + 1; } static int compare_char(const void *a, const void *b) { return (*(const char *)a - * (const char *)b); } static size_t sanitize_set(char *set, size_t len) { qsort(set, len, sizeof(char), compare_char); size_t newlen = unique(set, len); set[newlen] = '\0'; return newlen; } static bool pw_in_set(const char *pw, const char *set, size_t len) { for (size_t i = 0; pw[i] != '\0'; ++i) { if (!memchr(set, pw[i], len)) return false; } return true; } static bool test_password(struct worker *w, const struct zc_key *key) { int err; decrypt(w->crk->cipher, w->plaintext, w->crk->cipher_size, key); pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); if (w->crk->cipher_is_deflated) err = inflate_buffer(w->zlib, &w->plaintext[12], w->crk->cipher_size - 12, w->inflate, INFLATE_CHUNK, w->crk->original_crc); else err = test_buffer_crc(&w->plaintext[12], w->crk->cipher_size - 12, w->crk->original_crc); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); return err ? false : true; } static bool try_decrypt(const struct zc_crk_bforce *crk, const struct zc_key *base) { struct zc_key key; for (size_t i = 0; i < crk->vdata_size; ++i) { reset_encryption_keys(base, &key); if (decrypt_header(crk->vdata[i].encryption_header, &key, crk->vdata[i].magic)) return false; } return true; } static void do_work_recurse(struct worker *w, size_t level, size_t level_count, char *pw, struct zc_key *cache, struct entry *limit) { const struct zc_crk_bforce *crk = w->crk; int first = limit[0].initial; int last = limit[0].stop + 1; if (level == 1) { for (int p = first; p < last; ++p) { update_keys(crk->set[p], &cache[level_count - 1], &cache[level_count]); if (try_decrypt(crk, &cache[level_count])) { if (test_password(w, &cache[level_count])) { pw[level_count - 1] = crk->set[p]; w->found = true; pthread_exit(w); } } } } else { size_t i = level_count - level; for (int p = first; p < last; ++p) { pw[i] = crk->set[p]; update_keys(pw[i], &cache[i], &cache[i + 1]); do_work_recurse(w, level - 1, level_count, pw, cache, &limit[1]); } } limit[0].initial = limit[0].start; } static uint64_t try_decrypt_fast(const struct zc_crk_bforce *crk, struct hash *h) { uint8_t check[LEN]; uint32_t crcindex[LEN]; uint32_t crcshr8[LEN]; uint32_t *k0 = h->k0; uint32_t *k1 = h->k1; uint32_t *k2 = h->k2; h->candidate = 0; /* first pass */ for (int i = 0; i < 11; ++i) { uint8_t header = crk->vdata[0].encryption_header[i]; #if defined(__GNUC__) && !defined(__clang__) #pragma GCC ivdep #endif for (int j = 0; j < LEN; ++j) check[j] = header ^ decrypt_byte(k2[j]) ^ k0[j]; /* update key0 */ #if defined(__GNUC__) && !defined(__clang__) #pragma GCC ivdep #endif for (int j = 0; j < LEN; ++j) k0[j] = crc_32_tab[check[j]] ^ (k0[j] >> 8); /* update key1 */ #if defined(__GNUC__) && !defined(__clang__) #pragma GCC ivdep #endif for (int j = 0; j < LEN; ++j) k1[j] = (k1[j] + (k0[j] & 0xff)) * MULT + 1; /* update key2 -- loop is in two parts */ #if defined(__GNUC__) && !defined(__clang__) #pragma GCC ivdep #endif for (int j = 0; j < LEN; ++j) { crcindex[j] = (k2[j] ^ (k1[j] >> 24)) & 0xff; crcshr8[j] = k2[j] >> 8; } #if defined(__GNUC__) && !defined(__clang__) #pragma GCC ivdep #endif for (int j = 0; j < LEN; ++j) k2[j] = crc_32_tab[crcindex[j]] ^ crcshr8[j]; } for (int j = 0; j < LEN; ++j) check[j] = crk->pre_magic_xor_header ^ decrypt_byte(k2[j]); for (int j = 0; j < LEN; ++j) h->candidate |= check[j] ? 0 : (uint64_t)1 << j; return h->candidate; } static int try_decrypt2(const struct zc_crk_bforce *crk, struct worker *w) { struct zc_key key; struct hash *h = &w->h; #define RESET() do \ { \ key.key0 = h->initk0[ctz]; \ key.key1 = h->initk1[ctz]; \ key.key2 = h->initk2[ctz]; \ } while (0) do { int ctz = __builtin_ctzll(h->candidate); h->candidate &= ~((uint64_t)1 << ctz); size_t j = 1; for (; j < crk->vdata_size; ++j) { RESET(); if (decrypt_header(crk->vdata[j].encryption_header, &key, crk->vdata[j].magic)) break; } if (j == crk->vdata_size) { RESET(); if (test_password(w, &key)) return ctz; } } while (h->candidate); #undef RESET return -1; } /* out[5] = c % in[5]; out[4] = (c / in[5]) % in[4]; out[3] = (c / in[5] / in[4]) % in[3]; out[2] = (c / in[5] / in[4] / in[3]) % in[2]; out[1] = (c / in[5] / in[4] / in[3] / in[2]) % in[1]; out[0] = (c / in[5] / in[4] / in[3] / in[2] / in[1]) % in[0]; */ static void indexes_from_raw_counter(uint64_t c, const int *in, int *out) { uint64_t tmp[6]; int i = 5; tmp[i] = c; do { tmp[i - 1] = tmp[i] / in[i]; } while (i-- > 0); for (i = 0; i < 6; ++i) out[i] = tmp[i] %= in[i]; } static void do_work_recurse2(struct worker *w, size_t level, size_t level_count, char *pw, struct zc_key *cache, struct entry *limit) { const struct zc_crk_bforce *crk = w->crk; if (level_count > 5 && level == 6) { int first[6], last[6], p[6], out[6], in[6], ret; uint64_t pwi = 0; for (int i = 0; i < 6; ++i) { first[i] = limit[i].initial; last[i] = limit[i].stop + 1; } for (p[0] = first[0]; p[0] < last[0]; ++p[0]) { update_keys(crk->set[p[0]], &cache[0], &cache[1]); for (p[1] = first[1]; p[1] < last[1]; ++p[1]) { update_keys(crk->set[p[1]], &cache[1], &cache[2]); for (p[2] = first[2]; p[2] < last[2]; ++p[2]) { update_keys(crk->set[p[2]], &cache[2], &cache[3]); for (p[3] = first[3]; p[3] < last[3]; ++p[3]) { update_keys(crk->set[p[3]], &cache[3], &cache[4]); for (p[4] = first[4]; p[4] < last[4]; ++p[4]) { update_keys(crk->set[p[4]], &cache[4], &cache[5]); for (p[5] = first[5]; p[5] < last[5]; ++p[5]) { update_keys(crk->set[p[5]], &cache[5], &cache[6]); /* save password hashes */ w->h.initk0[pwi % LEN] = w->h.k0[pwi % LEN] = cache[6].key0; w->h.initk1[pwi % LEN] = w->h.k1[pwi % LEN] = cache[6].key1; w->h.initk2[pwi % LEN] = w->h.k2[pwi % LEN] = cache[6].key2; if (++pwi % LEN) continue; if (try_decrypt_fast(crk, &w->h) == 0) continue; ret = try_decrypt2(crk, w); if (ret < 0) continue; /* copy the loop length to 'in' */ for (int i = 0; i < 6; ++i) in[i] = last[i] - first[i]; /* adjust the counter to the index of * the correct hash */ pwi = pwi - (LEN - 1 - ret) - 1; indexes_from_raw_counter(pwi, in, out); for (int i = 0; i < 6; ++i) pw[i] = crk->set[out[i] + first[i]]; w->found = true; pthread_exit(w); } } } } } } /* Test all remaining candidates since none of them has been filtered by try_decrypt_fast. */ w->h.candidate = UINT64_MAX >> (pwi % LEN); ret = try_decrypt2(crk, w); if (ret < 0) return; for (int i = 0; i < 6; ++i) in[i] = last[i] - first[i]; pwi = pwi - ((pwi % LEN) - 1 - ret) - 1; indexes_from_raw_counter(pwi, in, out); for (int i = 0; i < 6; ++i) pw[i] = crk->set[out[i] + first[i]]; w->found = true; pthread_exit(w); } else { int first = limit[0].initial; int last = limit[0].stop + 1; for (int p = first; p < last; ++p) { pw[0] = crk->set[p]; update_keys(pw[0], &cache[0], &cache[1]); do_work_recurse2(w, level - 1, level_count, &pw[1], &cache[1], &limit[1]); } } limit[0].initial = limit[0].start; } static void fill_limits(struct pwstream *pws, struct entry *limit, size_t count, size_t stream) { for (size_t i = 0, j = count - 1; i < count; ++i, --j) limit[i] = *pwstream_get_entry(pws, stream, j); } static void do_work(struct worker *w, struct pwstream *pws, size_t stream, char *pw) { size_t level = pwstream_get_pwlen(pws); struct zc_key cache[level + 1]; struct entry limit[level]; fill_limits(pws, limit, level, stream); memset(cache, 0, sizeof(struct zc_key) * (level + 1)); set_default_encryption_keys(cache); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); if (level < 6) do_work_recurse(w, level, level, pw, cache, limit); else do_work_recurse2(w, level, level, pw, cache, limit); pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); } static void worker_cleanup_handler(void *p) { struct worker *w = (struct worker *)p; pthread_mutex_lock(&w->crk->mutex); list_del(&w->workers); list_add(&w->cleanup, &w->crk->cleanup_head); pthread_cond_signal(&w->crk->cond); pthread_mutex_unlock(&w->crk->mutex); } static void dealloc_workers(struct zc_crk_bforce *crk) { struct worker *w, *wtmp; list_for_each_entry_safe(w, wtmp, &crk->workers_head, workers) { list_del(&w->workers); free(w->inflate); free(w->plaintext); inflate_destroy(w->zlib); free(w); } } static int alloc_workers(struct zc_crk_bforce *crk, size_t workers) { for (size_t i = 0; i < workers; ++i) { struct worker *w = calloc(1, sizeof(struct worker)); if (!w) { dealloc_workers(crk); return -1; } w->found = false; w->crk = crk; w->id = i; w->inflate = malloc(INFLATE_CHUNK); if (!w->inflate) { free(w); dealloc_workers(crk); return -1; } w->plaintext = malloc(crk->cipher_size); if (!w->plaintext) { free(w->inflate); free(w); dealloc_workers(crk); return -1; } if (inflate_new(&w->zlib) < 0) { free(w->plaintext); free(w->inflate); free(w); dealloc_workers(crk); return -1; } list_add(&w->workers, &crk->workers_head); } return 0; } /* * Returns -1 on error, 1 on success. */ static int wait_workers_created(struct zc_crk_bforce *crk) { pthread_mutex_lock(&crk->mutex); while (!crk->pthread_create_err) pthread_cond_wait(&crk->cond, &crk->mutex); pthread_mutex_unlock(&crk->mutex); return crk->pthread_create_err; } static void *worker(void *p) { struct worker *w = (struct worker *)p; pthread_cleanup_push(worker_cleanup_handler, w); if (wait_workers_created(w->crk) < 0) goto end; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); for (size_t i = 0; i < w->crk->pwslen; ++i) { if (pwstream_is_empty(w->crk->pws[i], w->id)) continue; do_work(w, w->crk->pws[i], w->id, w->pw); pthread_testcancel(); } end: pthread_cleanup_pop(1); return NULL; } static void broadcast_workers_err(struct zc_crk_bforce *crk, int err) { pthread_mutex_lock(&crk->mutex); crk->pthread_create_err = err; pthread_cond_broadcast(&crk->cond); pthread_mutex_unlock(&crk->mutex); } static int create_workers(struct zc_crk_bforce *crk, size_t *cnt) { struct worker *w; size_t created = 0; pthread_mutex_lock(&crk->mutex); list_for_each_entry(w, &crk->workers_head, workers) { if (pthread_create(&w->thread_id, NULL, worker, w)) { perror("pthread_create failed"); pthread_mutex_unlock(&crk->mutex); broadcast_workers_err(crk, -1); /* failure */ *cnt = created; return -1; } ++created; } pthread_mutex_unlock(&crk->mutex); broadcast_workers_err(crk, 1); /* success */ *cnt = created; return 0; } /* called while holding mutex */ static void cancel_workers(struct zc_crk_bforce *crk) { struct worker *w; int err; list_for_each_entry(w, &crk->workers_head, workers) { err = pthread_cancel(w->thread_id); if (err) perror("pthread_cancel failed"); assert(err == 0); } } static void wait_workers(struct zc_crk_bforce *crk, size_t workers, char *pw, size_t len) { int workers_left = workers; /* waits for workers on the 'cleanup' list */ do { pthread_mutex_lock(&crk->mutex); while (list_empty(&crk->cleanup_head)) pthread_cond_wait(&crk->cond, &crk->mutex); struct worker *w, *tempw; list_for_each_entry_safe(w, tempw, &crk->cleanup_head, cleanup) { list_del(&w->cleanup); pthread_join(w->thread_id, NULL); if (w->found) { memset(pw, 0, len); strncpy(pw, w->pw, len); crk->found = true; cancel_workers(crk); } free(w->inflate); free(w->plaintext); inflate_destroy(w->zlib); free(w); --workers_left; } pthread_mutex_unlock(&crk->mutex); } while (workers_left); } static void dealloc_pwstreams(struct zc_crk_bforce *crk) { for (size_t l = 0; l < crk->pwslen; ++l) { if (crk->pws[l]) pwstream_free(crk->pws[l]); } free(crk->pws); } static void fill_initial_pwstream(size_t *initial, const char *ipw, size_t ipwlen, const char *set, size_t setlen) { for (size_t i = ipwlen - 1, j = 0; j < ipwlen; --i, ++j) initial[j] = (const char *)memchr(set, ipw[i], setlen) - set; } /* when generating the first streams, take into account the * initial password provided */ static int alloc_first_pwstream(struct pwstream **pws, const char *ipw, size_t ipwlen, const char *set, size_t setlen, size_t workers) { struct pwstream *tmp; size_t initial[ipwlen]; if (pwstream_new(&tmp)) return -1; fill_initial_pwstream(initial, ipw, ipwlen, set, setlen); pwstream_generate(tmp, setlen, ipwlen, workers, initial); *pws = tmp; return 0; } static int alloc_pwstreams(struct zc_crk_bforce *crk, size_t workers) { const char *ipw = crk->ipw; size_t ipwlen = crk->ipwlen; size_t maxlen = crk->maxlen; size_t to_alloc = maxlen - ipwlen + 1; const char *set = crk->set; size_t setlen = crk->setlen; crk->pws = calloc(1, sizeof(struct pwstream *) * to_alloc); if (!crk->pws) return -1; if (alloc_first_pwstream(&crk->pws[0], ipw, ipwlen, set, setlen, workers)) { free(crk->pws); return -1; } crk->pwslen = 1; for (size_t i = 1; i < to_alloc; ++i) { if (pwstream_new(&crk->pws[i])) { dealloc_pwstreams(crk); return -1; } crk->pwslen++; pwstream_generate(crk->pws[i], setlen, ipwlen + i, workers, NULL); } return 0; } static int set_pwcfg(struct zc_crk_bforce *crk, const struct zc_crk_pwcfg *cfg) { /* basic sanity checks */ if (cfg->setlen == 0 || cfg->setlen > ZC_CHARSET_MAXLEN || cfg->maxlen == 0 || cfg->maxlen > ZC_PW_MAXLEN) return -1; if (strnlen(cfg->set, ZC_CHARSET_MAXLEN) != cfg->setlen) return -1; memcpy(crk->ipw, cfg->initial, ZC_PW_MAXLEN + 1); memcpy(crk->set, cfg->set, ZC_CHARSET_MAXLEN + 1); crk->maxlen = cfg->maxlen; crk->setlen = sanitize_set(crk->set, cfg->setlen); crk->ipwlen = strnlen(crk->ipw, ZC_PW_MAXLEN); if (!crk->ipwlen) { /* no initial password supplied, use first set character */ crk->ipw[0] = crk->set[0]; crk->ipw[1] = '\0'; crk->ipwlen = 1; return 0; } if (crk->ipwlen > crk->maxlen) return -1; if (!pw_in_set(crk->ipw, crk->set, crk->setlen)) return -1; return 0; } ZC_EXPORT int zc_crk_bforce_init(struct zc_crk_bforce *crk, const char *filename, const struct zc_crk_pwcfg *cfg) { int err; err = set_pwcfg(crk, cfg); if (err) { err(crk->ctx, "failed to set password configuration\n"); return -1; } err = fill_vdata(crk->ctx, filename, crk->vdata, VDATA_MAX); if (err < 1) { err(crk->ctx, "failed to read validation data\n"); return -1; } crk->vdata_size = err; crk->pre_magic_xor_header = crk->vdata[0].magic ^ crk->vdata[0].encryption_header[11]; if (crk->cipher) { free(crk->cipher); crk->cipher = NULL; } err = fill_test_cipher(crk->ctx, filename, &crk->cipher, &crk->cipher_size, &crk->original_crc, &crk->cipher_is_deflated); if (err) { err(crk->ctx, "failed to read cipher data\n"); return -1; } if (crk->filename) free(crk->filename); crk->filename = strdup(filename); return 0; } ZC_EXPORT int zc_crk_bforce_new(struct zc_ctx *ctx, struct zc_crk_bforce **crk) { struct zc_crk_bforce *tmp; int err; tmp = calloc(1, sizeof(struct zc_crk_bforce)); if (!tmp) return -1; err = pthread_mutex_init(&tmp->mutex, NULL); if (err) { err(ctx, "pthread_mutex_init() failed: %s\n", strerror(err)); free(tmp); return -1; } err = pthread_cond_init(&tmp->cond, NULL); if (err) { err(ctx, "pthread_cond_init() failed: %s\n", strerror(err)); pthread_mutex_destroy(&tmp->mutex); free(tmp); return -1; } tmp->ctx = ctx; tmp->refcount = 1; tmp->force_threads = -1; INIT_LIST_HEAD(&tmp->workers_head); INIT_LIST_HEAD(&tmp->cleanup_head); *crk = tmp; dbg(ctx, "cracker %p created\n", tmp); return 0; } ZC_EXPORT struct zc_crk_bforce *zc_crk_bforce_ref(struct zc_crk_bforce *crk) { if (!crk) return NULL; crk->refcount++; return crk; } ZC_EXPORT struct zc_crk_bforce *zc_crk_bforce_unref(struct zc_crk_bforce *crk) { if (!crk) return NULL; crk->refcount--; if (crk->refcount > 0) return crk; if (crk->filename) free(crk->filename); if (crk->cipher) free(crk->cipher); pthread_cond_destroy(&crk->cond); pthread_mutex_destroy(&crk->mutex); free(crk); return NULL; } ZC_EXPORT const char *zc_crk_bforce_sanitized_charset(const struct zc_crk_bforce *crk) { return crk->set; } ZC_EXPORT void zc_crk_bforce_force_threads(struct zc_crk_bforce *bforce, long w) { bforce->force_threads = w; } static long threads_to_create(const struct zc_crk_bforce *crk) { if (crk->force_threads > 0) return crk->force_threads; long n = sysconf(_SC_NPROCESSORS_ONLN); if (n < 1) return 1; return n; } ZC_EXPORT int zc_crk_bforce_start(struct zc_crk_bforce *crk, char *pw, size_t len) { size_t w; if (!len) return -1; w = threads_to_create(crk); if (alloc_pwstreams(crk, w)) { err(crk->ctx, "failed to allocate password streams\n"); goto err1; } if (alloc_workers(crk, w)) { err(crk->ctx, "failed to allocate workers\n"); goto err2; } crk->found = false; if (create_workers(crk, &w)) err(crk->ctx, "failed to create workers\n"); wait_workers(crk, w, pw, len); dealloc_pwstreams(crk); return crk->found ? 0 : 1; /* return -1 on error, 1 if not found else 0. */ err2: dealloc_pwstreams(crk); err1: return -1; } libzc-0.4.1/lib/zc_crk_dict.c000066400000000000000000000106161331702632000160100ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include "libzc.h" #include "libzc_private.h" #define PW_BUF_LEN 64 struct zc_crk_dict { struct zc_ctx *ctx; int refcount; char *filename; struct validation_data vdata[VDATA_MAX]; size_t vdata_size; unsigned char *cipher; unsigned char *plaintext; unsigned char *inflate; struct zlib_state *zlib; size_t cipher_size; bool cipher_is_deflated; uint32_t original_crc; FILE *fd; }; static inline void remove_trailing_newline(char *line) { while (*line) { if (*line == '\n' || *line == '\r') { *line = '\0'; return; } ++line; } return; } ZC_EXPORT struct zc_crk_dict *zc_crk_dict_ref(struct zc_crk_dict *crk) { if (!crk) return NULL; crk->refcount++; return crk; } ZC_EXPORT struct zc_crk_dict *zc_crk_dict_unref(struct zc_crk_dict *crk) { if (!crk) return NULL; crk->refcount--; if (crk->refcount > 0) return crk; free(crk->filename); free(crk->cipher); free(crk->plaintext); free(crk->inflate); inflate_destroy(crk->zlib); free(crk); return NULL; } ZC_EXPORT int zc_crk_dict_new(struct zc_ctx *ctx, struct zc_crk_dict **crk) { struct zc_crk_dict *tmp; tmp = calloc(1, sizeof(struct zc_crk_dict)); if (!tmp) return -1; tmp->ctx = ctx; tmp->refcount = 1; *crk = tmp; return 0; } ZC_EXPORT int zc_crk_dict_init(struct zc_crk_dict *crk, const char *filename) { int err; crk->inflate = malloc(INFLATE_CHUNK); if (!crk->inflate) { err(crk->ctx, "failed to allocate memory\n"); return -1; } err = fill_vdata(crk->ctx, filename, crk->vdata, VDATA_MAX); if (err < 1) { err(crk->ctx, "failed to read validation data\n"); return -1; } crk->vdata_size = err; err = fill_test_cipher(crk->ctx, filename, &crk->cipher, &crk->cipher_size, &crk->original_crc, &crk->cipher_is_deflated); if (err) { err(crk->ctx, "failed to read cipher data\n"); return -1; } crk->plaintext = malloc(crk->cipher_size); if (!crk->plaintext) { free(crk->inflate); free(crk->cipher); return -1; } crk->filename = strdup(filename); if (inflate_new(&crk->zlib) < 0) { free(crk->inflate); free(crk->cipher); free(crk->plaintext); free(crk->filename); return -1; } return 0; } static bool test_password(struct zc_crk_dict *crk, const char *pw) { struct zc_key key, base; size_t i = 0; set_default_encryption_keys(&base); while(pw[i] != '\0') { update_keys(pw[i], &base, &base); ++i; } for (i = 0; i < crk->vdata_size; ++i) { reset_encryption_keys(&base, &key); if (decrypt_header(crk->vdata[i].encryption_header, &key, crk->vdata[i].magic)) return false; } decrypt(crk->cipher, crk->plaintext, crk->cipher_size, &base); int err; if (crk->cipher_is_deflated) err = inflate_buffer(crk->zlib, &crk->plaintext[12], crk->cipher_size - 12, crk->inflate, INFLATE_CHUNK, crk->original_crc); else err = test_buffer_crc(&crk->plaintext[12], crk->cipher_size - 12, crk->original_crc); return err ? false : true; } ZC_EXPORT int zc_crk_dict_start(struct zc_crk_dict *crk, const char *dict, char *pw, size_t len) { FILE *f; char pwbuf[PW_BUF_LEN]; int err = 1; if (len > PW_BUF_LEN || !crk->vdata_size) return -1; if (dict) { f = fopen(dict, "r"); if (!f) { err(crk->ctx, "fopen() failed: %s\n", strerror(errno)); return -1; } } else f = stdin; while (1) { char *s = fgets(pwbuf, PW_BUF_LEN, f); if (!s) { err = -1; break; } remove_trailing_newline(s); if (test_password(crk, s)) { err = 0; memset(pw, 0, len); strncpy(pw, s, len); break; } } fclose(f); return err; } libzc-0.4.1/lib/zc_crk_ptext.c000066400000000000000000000047761331702632000162430ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * References: * http://en.wikipedia.org/wiki/Modular_multiplicative_inverse * http://ca.wiley.com/WileyCDA/WileyTitle/productCd-047011486X.html */ #include #include #include #include "ptext_private.h" static void generate_key0lsb(struct zc_crk_ptext *ptext) { /* reset lsb counters to 0 */ memset(ptext->lsbk0_count, 0, 256 * sizeof(uint32_t)); for (uint32_t i = 0, p = 0; i < 256; ++i, p += MULTINV) { uint8_t msbp = msb(p); ptext->lsbk0_lookup[msbp][ptext->lsbk0_count[msbp]++] = i; } } ZC_EXPORT struct zc_crk_ptext *zc_crk_ptext_ref(struct zc_crk_ptext *ptext) { if (!ptext) return NULL; ptext->refcount++; return ptext; } ZC_EXPORT struct zc_crk_ptext *zc_crk_ptext_unref(struct zc_crk_ptext *ptext) { if (!ptext) return NULL; ptext->refcount--; if (ptext->refcount > 0) return ptext; dbg(ptext->ctx, "ptext %p released\n", ptext); ka_free(ptext->key2); key2r_free(ptext->k2r); free(ptext); return NULL; } ZC_EXPORT int zc_crk_ptext_new(struct zc_ctx *ctx, struct zc_crk_ptext **ptext) { struct zc_crk_ptext *new; new = calloc(1, sizeof(struct zc_crk_ptext)); if (!new) return -1; if (key2r_new(&new->k2r)) { free(new); return -1; } generate_key0lsb(new); new->ctx = ctx; new->refcount = 1; new->found = false; new->force_threads = -1; *ptext = new; dbg(ctx, "ptext %p created\n", new); return 0; } ZC_EXPORT int zc_crk_ptext_set_text(struct zc_crk_ptext *ptext, const uint8_t *plaintext, const uint8_t *ciphertext, size_t size) { if (size < 13) return -1; ptext->plaintext = plaintext; ptext->ciphertext = ciphertext; ptext->size = size; return 0; } ZC_EXPORT size_t zc_crk_ptext_key2_count(const struct zc_crk_ptext *ptext) { if (ptext->key2) return ptext->key2->size; return 0; } libzc-0.4.1/lib/zc_file.c000066400000000000000000000265361331702632000151550ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include "libzc.h" #include "libzc_private.h" #include "list.h" #define ZIP_SIG 0x04034b50 #define ZIP_DATA_DESC_SIG 0x08074b50 #define ZIP_STATIC_HEADER_LEN 30 #define GP_BIT_HAS_DATA_DESC (1 << 3) #define GP_BIT_ENCRYPTION 0x1 #define MAX_FNLENGTH (4096 + 255) /* zip file */ struct header { uint16_t version_needed; uint16_t gen_bit_flag; uint16_t comp_method; uint16_t last_mod_time; uint16_t last_mod_date; uint32_t crc32; uint32_t comp_size; uint32_t uncomp_size; uint16_t filename_length; uint16_t extra_field_length; char *filename; }; struct zc_info { uint8_t enc_header[ZIP_ENCRYPTION_HEADER_LENGTH]; uint8_t magic; int idx; long enc_header_offset; long begin_offset; long end_offset; struct header header; struct list_head header_list; }; /** * SECTION:file * @short_description: libzc zip file * * The file structure contains information about the targeted zip * file. */ /** * zc_file: * * Opaque object representing the zip file. */ struct zc_file { struct zc_ctx *ctx; int refcount; char *filename; FILE *stream; struct list_head info_head; }; static uint16_t get_le16_at(const uint8_t *b, size_t i) { return b[i + 1] << 8 | b[i]; } static uint32_t get_le32_at(const uint8_t *b, size_t i) { return b[i + 3] << 24 | b[i + 2] << 16 | b[i + 1] << 8 | b[i]; } static bool is_encrypted(uint16_t flag) { return !!(flag & GP_BIT_ENCRYPTION); } static bool has_data_desc(uint16_t flag) { return !!(flag & GP_BIT_HAS_DATA_DESC); } static bool is_deflated(uint16_t flag) { return flag == 0x8; } static bool is_stored(uint16_t flag) { return flag == 0x0; } static uint8_t check_byte(const struct header *h) { if (has_data_desc(h->gen_bit_flag)) return h->last_mod_time >> 8; return h->crc32 >> 24; } static void clear_header_list(struct zc_file *f) { struct zc_info *i, *tmp; list_for_each_entry_safe(i, tmp, &f->info_head, header_list) { list_del(&i->header_list); free(i->header.filename); free(i); } } static int fill_header_list(struct zc_file *f) { int ret, sig, idx = 0; uint8_t buf[ZIP_STATIC_HEADER_LEN - 4]; struct zc_info *info; rewind(f->stream); while (1) { /* read zip header signature */ ret = fread(buf, 4, 1, f->stream); if (ret != 1) return -1; sig = get_le32_at(buf, 0); if (sig != ZIP_SIG) return idx == 0; info = calloc(1, sizeof(struct zc_info)); if (!info) goto err1; /* static header */ ret = fread(buf, ZIP_STATIC_HEADER_LEN - 4, 1, f->stream); if (ret != 1) goto err2; info->header.version_needed = get_le16_at(buf, 0); info->header.gen_bit_flag = get_le16_at(buf, 2); info->header.comp_method = get_le16_at(buf, 4); info->header.last_mod_time = get_le16_at(buf, 6); info->header.last_mod_date = get_le16_at(buf, 8); info->header.crc32 = get_le32_at(buf, 10); info->header.comp_size = get_le32_at(buf, 14); info->header.uncomp_size = get_le32_at(buf, 18); info->header.filename_length = get_le16_at(buf, 22); info->header.extra_field_length = get_le16_at(buf, 24); /* filename (variable length) */ if (!info->header.filename_length || info->header.filename_length > MAX_FNLENGTH) goto err2; info->header.filename = calloc(1, info->header.filename_length + 1); if (!info->header.filename) goto err2; ret = fread(info->header.filename, info->header.filename_length, 1, f->stream); if (ret != 1) goto err2; /* skip the extra field */ ret = fseek(f->stream, info->header.extra_field_length, SEEK_CUR); if (ret < 0) goto err2; /* set offsets and read encrypted header */ if (is_encrypted(info->header.gen_bit_flag)) { info->magic = check_byte(&info->header); info->enc_header_offset = ftell(f->stream); info->begin_offset = info->enc_header_offset + ZIP_ENCRYPTION_HEADER_LENGTH; info->end_offset = info->enc_header_offset + info->header.comp_size; ret = fread(info->enc_header, ZIP_ENCRYPTION_HEADER_LENGTH, 1, f->stream); if (ret != 1) goto err2; } else { info->magic = 0; info->enc_header_offset = -1; info->begin_offset = ftell(f->stream); info->end_offset = info->begin_offset + info->header.comp_size; } /* seek to end of compressed stream */ ret = fseek(f->stream, info->end_offset, SEEK_SET); if (ret) goto err2; /* seek data descriptor signature */ if (has_data_desc(info->header.gen_bit_flag)) { int data_desc_sig; /* signature 4 bytes (optional) crc-32 4 bytes compressed size 4 bytes uncompressed size 4 bytes */ ret = fread(buf, 4, 1, f->stream); if (ret != 1) goto err2; data_desc_sig = get_le32_at(buf, 0); ret = fseek(f->stream, data_desc_sig == ZIP_DATA_DESC_SIG ? 12 : 8, SEEK_CUR); if (ret) goto err2; } info->idx = idx; list_add_tail(&info->header_list, &f->info_head); ++idx; } return 0; err2: free(info->header.filename); free(info); err1: clear_header_list(f); return -1; } ZC_EXPORT struct zc_file *zc_file_ref(struct zc_file *file) { if (!file) return NULL; file->refcount++; return file; } ZC_EXPORT struct zc_file *zc_file_unref(struct zc_file *file) { if (!file) return NULL; file->refcount--; if (file->refcount > 0) return file; dbg(file->ctx, "file %p released\n", file); free(file->filename); free(file); return NULL; } /** * zc_file_new_from_filename: * * Allocate a new zc_file from the given filename. The file existence * is not verified at this stage. * * @retval 0 Success * @retval -1 Error */ ZC_EXPORT int zc_file_new_from_filename(struct zc_ctx *ctx, const char *filename, struct zc_file **file) { struct zc_file *newfile; newfile = calloc(1, sizeof(struct zc_file)); if (!newfile) return -1; newfile->ctx = ctx; newfile->refcount = 1; newfile->filename = strdup(filename); INIT_LIST_HEAD(&newfile->info_head); *file = newfile; dbg(ctx, "file %p created for %s\n", newfile, filename); return 0; } /** * zc_file_get_filename: * * @retval Filename of the passed zc_file object. */ ZC_EXPORT const char *zc_file_get_filename(const struct zc_file *file) { return file->filename; } /** * zc_file_open: * * Open the file for reading. * * @retval Returns the fopen() return value. */ ZC_EXPORT int zc_file_open(struct zc_file *file) { FILE *stream; if (zc_file_isopened(file)) return -1; stream = fopen(file->filename, "r"); if (!stream) { err(file->ctx, "open() failed: %s.\n", strerror(errno)); return -1; } dbg(file->ctx, "file %p open returned: %p\n", file, stream); file->stream = stream; if (fill_header_list(file)) { err(file->ctx, "failure while reading headers.\n"); goto err; } return 0; err: fclose(file->stream); file->stream = NULL; return -1; } /** * zc_file_close: * * Close the file. * * @retval Returns the fclose() return value. */ ZC_EXPORT int zc_file_close(struct zc_file *file) { if (!zc_file_isopened(file)) return -1; clear_header_list(file); if (fclose(file->stream)) { err(file->ctx, "fclose() failed: %s.\n", strerror(errno)); return -1; } dbg(file->ctx, "file %p closed\n", file); file->stream = NULL; return 0; } /** * zc_file_isopened: * * @retval Whether or not the file is opened. */ ZC_EXPORT bool zc_file_isopened(struct zc_file *file) { return (file->stream != NULL); } /** * read_validation_data: * * Read the validation data from the file and store them in the vdata * array. At most nmemb elements will be stored in the array. * * The file must be opened before calling this function. * * @retval 0 No encryption data found in this file. * @retval >0 The number of encryption data objects read. */ size_t read_validation_data(struct zc_file *file, struct validation_data *vdata, size_t nmemb) { struct zc_info *info; size_t valid_files = 0; list_for_each_entry(info, &file->info_head, header_list) { if (!is_encrypted(info->header.gen_bit_flag)) continue; if (!is_deflated(info->header.comp_method) && !is_stored(info->header.comp_method)) continue; vdata[valid_files].magic = info->magic; memcpy(vdata[valid_files].encryption_header, info->enc_header, ZIP_ENCRYPTION_HEADER_LENGTH); if (++valid_files == nmemb) break; } return valid_files; } static struct zc_info *find_file_smallest(struct zc_file *file) { struct zc_info *info, *ret = NULL; long s = LONG_MAX; list_for_each_entry(info, &file->info_head, header_list) { if (!is_encrypted(info->header.gen_bit_flag)) continue; if (!is_deflated(info->header.comp_method) && !is_stored(info->header.comp_method)) continue; long tmp = info->end_offset - info->begin_offset; if (tmp < s) { s = tmp; ret = info; } } return ret; } int read_crypt_data(struct zc_file *file, unsigned char **buf, size_t *len, uint32_t *original_crc, bool *deflated) { struct zc_info *info; size_t to_read; int err; info = find_file_smallest(file); if (!info) return -1; to_read = info->end_offset - info->enc_header_offset; err = fseek(file->stream, info->enc_header_offset, SEEK_SET); if (err) { err(file->ctx, "fseek(): %s\n", strerror(errno)); return -1; } unsigned char *tmp = malloc(to_read); if (!tmp) { err(file->ctx, "malloc() failed(): %s\n", strerror(errno)); return -1; } size_t ret = fread(tmp, 1, to_read, file->stream); if (ferror(file->stream)) { err(file->ctx, "fread() error.\n"); goto err; } else if (feof(file->stream)) { err(file->ctx, "fread() read past eof. File corrupted?\n"); goto err; } *buf = tmp; *len = ret; *original_crc = info->header.crc32; *deflated = is_deflated(info->header.comp_method); return 0; err: free(tmp); return -1; } ZC_EXPORT struct zc_info *zc_file_info_next(struct zc_file *file, struct zc_info *info) { struct zc_info *i; if (!info) { i = list_entry((&file->info_head)->next, typeof(*i), header_list); return i; } i = list_entry(info->header_list.next, struct zc_info, header_list); if (&i->header_list == &file->info_head) return NULL; return i; } ZC_EXPORT const char *zc_file_info_name(const struct zc_info *info) { return info->header.filename; } ZC_EXPORT uint32_t zc_file_info_size(const struct zc_info *info) { return info->header.uncomp_size; } ZC_EXPORT long zc_file_info_offset(const struct zc_info *info) { return info->begin_offset; } ZC_EXPORT long zc_file_info_crypt_header_offset(const struct zc_info *info) { return info->enc_header_offset; } ZC_EXPORT const uint8_t *zc_file_info_enc_header(const struct zc_info *info) { return info->enc_header; } ZC_EXPORT int zc_file_info_idx(const struct zc_info *info) { return info->idx; } libzc-0.4.1/m4/000077500000000000000000000000001331702632000131345ustar00rootroot00000000000000libzc-0.4.1/m4/.gitignore000066400000000000000000000000771331702632000151300ustar00rootroot00000000000000libtool.m4 ltoptions.m4 ltsugar.m4 ltversion.m4 lt~obsolete.m4 libzc-0.4.1/m4/ax_pthread.m4000066400000000000000000000505221331702632000155210ustar00rootroot00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_pthread.html # =========================================================================== # # SYNOPSIS # # AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) # # DESCRIPTION # # This macro figures out how to build C programs using POSIX threads. It # sets the PTHREAD_LIBS output variable to the threads library and linker # flags, and the PTHREAD_CFLAGS output variable to any special C compiler # flags that are needed. (The user can also force certain compiler # flags/libs to be tested by setting these environment variables.) # # Also sets PTHREAD_CC to any special C compiler that is needed for # multi-threaded programs (defaults to the value of CC otherwise). (This # is necessary on AIX to use the special cc_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these flags, # but also to link with them as well. For example, you might link with # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # # If you are only building threaded programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" # CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # CC="$PTHREAD_CC" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant # has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to # that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the # PTHREAD_PRIO_INHERIT symbol is defined when compiling with # PTHREAD_CFLAGS. # # ACTION-IF-FOUND is a list of shell commands to run if a threads library # is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it # is not found. If ACTION-IF-FOUND is not specified, the default action # will define HAVE_PTHREAD. # # Please let the authors know if this macro fails on any platform, or if # you have any other suggestions or comments. This macro was based on work # by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help # from M. Frigo), as well as ac_pthread and hb_pthread macros posted by # Alejandro Forero Cuervo to the autoconf macro repository. We are also # grateful for the helpful feedback of numerous users. # # Updated for Autoconf 2.68 by Daniel Richard G. # # LICENSE # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2011 Daniel Richard G. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation, either version 3 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General # Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 24 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_PROG_SED]) AC_LANG_PUSH([C]) ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on Tru64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then ax_pthread_save_CC="$CC" ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) AC_MSG_RESULT([$ax_pthread_ok]) if test "x$ax_pthread_ok" = "xno"; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi CC="$ax_pthread_save_CC" CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 # (Note: HP C rejects this with "bad form for `-t' option") # -pthreads: Solaris/gcc (Note: HP C also rejects) # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads and # -D_REENTRANT too), HP C (must be checked before -lpthread, which # is present but should not be used directly; and before -mthreads, # because the compiler interprets this as "-mt" + "-hreads") # -mthreads: Mingw32/gcc, Lynx/gcc # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case $host_os in freebsd*) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) ax_pthread_flags="-kthread lthread $ax_pthread_flags" ;; hpux*) # From the cc(1) man page: "[-mt] Sets various -D flags to enable # multi-threading and also sets -lpthread." ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" ;; openedition*) # IBM z/OS requires a feature-test macro to be defined in order to # enable POSIX threads at all, so give the user a hint if this is # not set. (We don't define these ourselves, as they can affect # other portions of the system API in unpredictable ways.) AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], [ # if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) AX_PTHREAD_ZOS_MISSING # endif ], [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) ;; solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (N.B.: The stubs are missing # pthread_cleanup_push, or rather a function called by this macro, # so we could check for that, but who knows whether they'll stub # that too in a future libc.) So we'll check first for the # standard Solaris way of linking pthreads (-mt -lpthread). ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags" ;; esac # GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) AS_IF([test "x$GCC" = "xyes"], [ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"]) # The presence of a feature test macro requesting re-entrant function # definitions is, on some systems, a strong hint that pthreads support is # correctly enabled case $host_os in darwin* | hpux* | linux* | osf* | solaris*) ax_pthread_check_macro="_REENTRANT" ;; aix*) ax_pthread_check_macro="_THREAD_SAFE" ;; *) ax_pthread_check_macro="--" ;; esac AS_IF([test "x$ax_pthread_check_macro" = "x--"], [ax_pthread_check_cond=0], [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) # Are we compiling with Clang? AC_CACHE_CHECK([whether $CC is Clang], [ax_cv_PTHREAD_CLANG], [ax_cv_PTHREAD_CLANG=no # Note that Autoconf sets GCC=yes for Clang as well as GCC if test "x$GCC" = "xyes"; then AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ # if defined(__clang__) && defined(__llvm__) AX_PTHREAD_CC_IS_CLANG # endif ], [ax_cv_PTHREAD_CLANG=yes]) fi ]) ax_pthread_clang="$ax_cv_PTHREAD_CLANG" ax_pthread_clang_warning=no # Clang needs special handling, because older versions handle the -pthread # option in a rather... idiosyncratic way if test "x$ax_pthread_clang" = "xyes"; then # Clang takes -pthread; it has never supported any other flag # (Note 1: This will need to be revisited if a system that Clang # supports has POSIX threads in a separate library. This tends not # to be the way of modern systems, but it's conceivable.) # (Note 2: On some systems, notably Darwin, -pthread is not needed # to get POSIX threads support; the API is always present and # active. We could reasonably leave PTHREAD_CFLAGS empty. But # -pthread does define _REENTRANT, and while the Darwin headers # ignore this macro, third-party headers might not.) PTHREAD_CFLAGS="-pthread" PTHREAD_LIBS= ax_pthread_ok=yes # However, older versions of Clang make a point of warning the user # that, in an invocation where only linking and no compilation is # taking place, the -pthread option has no effect ("argument unused # during compilation"). They expect -pthread to be passed in only # when source code is being compiled. # # Problem is, this is at odds with the way Automake and most other # C build frameworks function, which is that the same flags used in # compilation (CFLAGS) are also used in linking. Many systems # supported by AX_PTHREAD require exactly this for POSIX threads # support, and in fact it is often not straightforward to specify a # flag that is used only in the compilation phase and not in # linking. Such a scenario is extremely rare in practice. # # Even though use of the -pthread flag in linking would only print # a warning, this can be a nuisance for well-run software projects # that build with -Werror. So if the active version of Clang has # this misfeature, we search for an option to squash it. AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown # Create an alternate version of $ac_link that compiles and # links in two steps (.c -> .o, .o -> exe) instead of one # (.c -> exe), because the warning occurs only in the second # step ax_pthread_save_ac_link="$ac_link" ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" ax_pthread_save_CFLAGS="$CFLAGS" for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" ac_link="$ax_pthread_save_ac_link" AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], [ac_link="$ax_pthread_2step_ac_link" AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], [break]) ]) done ac_link="$ax_pthread_save_ac_link" CFLAGS="$ax_pthread_save_CFLAGS" AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" ]) case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in no | unknown) ;; *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; esac fi # $ax_pthread_clang = yes if test "x$ax_pthread_ok" = "xno"; then for ax_pthread_try_flag in $ax_pthread_flags; do case $ax_pthread_try_flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -mt,pthread) AC_MSG_CHECKING([whether pthreads work with -mt -lpthread]) PTHREAD_CFLAGS="-mt" PTHREAD_LIBS="-lpthread" ;; -*) AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) PTHREAD_CFLAGS="$ax_pthread_try_flag" ;; pthread-config) AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) PTHREAD_LIBS="-l$ax_pthread_try_flag" ;; esac ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_LINK_IFELSE([AC_LANG_PROGRAM([#include # if $ax_pthread_check_cond # error "$ax_pthread_check_macro must be defined" # endif static void routine(void *a) { a = 0; } static void *start_routine(void *a) { return a; }], [pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */])], [ax_pthread_ok=yes], []) CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" AC_MSG_RESULT([$ax_pthread_ok]) AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$ax_pthread_ok" = "xyes"; then ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_CACHE_CHECK([for joinable pthread attribute], [ax_cv_PTHREAD_JOINABLE_ATTR], [ax_cv_PTHREAD_JOINABLE_ATTR=unknown for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [int attr = $ax_pthread_attr; return attr /* ; */])], [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], []) done ]) AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ test "x$ax_pthread_joinable_attr_defined" != "xyes"], [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$ax_cv_PTHREAD_JOINABLE_ATTR], [Define to necessary symbol if this constant uses a non-standard name on your system.]) ax_pthread_joinable_attr_defined=yes ]) AC_CACHE_CHECK([whether more special flags are required for pthreads], [ax_cv_PTHREAD_SPECIAL_FLAGS], [ax_cv_PTHREAD_SPECIAL_FLAGS=no case $host_os in solaris*) ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" ;; esac ]) AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ test "x$ax_pthread_special_flags_added" != "xyes"], [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" ax_pthread_special_flags_added=yes]) AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], [ax_cv_PTHREAD_PRIO_INHERIT], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int i = PTHREAD_PRIO_INHERIT;]])], [ax_cv_PTHREAD_PRIO_INHERIT=yes], [ax_cv_PTHREAD_PRIO_INHERIT=no]) ]) AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ test "x$ax_pthread_prio_inherit_defined" != "xyes"], [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) ax_pthread_prio_inherit_defined=yes ]) CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" # More AIX lossage: compile with *_r variant if test "x$GCC" != "xyes"; then case $host_os in aix*) AS_CASE(["x/$CC"], [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], [#handle absolute path differently from PATH based program lookup AS_CASE(["x$CC"], [x/*], [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) ;; esac fi fi test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" AC_SUBST([PTHREAD_LIBS]) AC_SUBST([PTHREAD_CFLAGS]) AC_SUBST([PTHREAD_CC]) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test "x$ax_pthread_ok" = "xyes"; then ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) : else ax_pthread_ok=no $2 fi AC_LANG_POP ])dnl AX_PTHREAD libzc-0.4.1/runastyle.sh000077500000000000000000000016261331702632000152060ustar00rootroot00000000000000#!/bin/sh # Copyright (C) 2012-2018 Marc Ferland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . OPTIONS="\ --style=linux \ --pad-oper \ --indent=force-tab=8 \ --max-code-length=80 \ -k3 \ -W3 \ -m0 \ -M80 \ --suffix=none \ " astyle $OPTIONS "./yazc/*.c" "./yazc/*.h" "./lib/*.c" "./lib/*.h" "./tests/*.c" "./tests/*.h" exit 0 libzc-0.4.1/runcppcheck.sh000077500000000000000000000015771331702632000154720ustar00rootroot00000000000000#!/bin/bash # Copyright (C) 2012-2018 Marc Ferland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . BIN=`which cppcheck` OPT="--enable=all --language=c --platform=unix64 --std=c99" FILES="yazc/ lib/" if [ ! -x "$BIN" ]; then echo >&2 "cppcheck is not installed." exit 1 fi ${BIN} ${OPT} ${FILES} libzc-0.4.1/runvalgrind.sh000077500000000000000000000040751331702632000155140ustar00rootroot00000000000000#!/bin/bash # Copyright (C) 2012-2018 Marc Ferland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . VALGRIND=`which valgrind` YAZC="yazc/yazc" OPTS="--tool=memcheck --leak-check=full --show-leak-kinds=all --log-file=valgrind_run.txt" CMD="libtool --mode=execute $VALGRIND $OPTS $YAZC" check_output() { if cat valgrind_run.txt | grep -q "no leaks are possible" then tput setf 2 echo OK tput setf 7 rm -f valgrind_run.txt else tput setf 1 echo LEAK tput setf 7 cat valgrind_run.txt exit 1 fi } $CMD check_output $CMD --help check_output $CMD bruteforce --help check_output $CMD bruteforce -l0 data/noradi.zip check_output $CMD bruteforce -t0 data/noradi.zip check_output $CMD bruteforce -t1 data/noradi.zip check_output $CMD bruteforce -cabc -t1 -l5 -iabcdef data/noradi.zip check_output $CMD bruteforce -cabc -t1 -l5 -iaaaaaa data/noradi.zip check_output $CMD bruteforce -a -t1 -l6 -inoradh data/noradi.zip check_output $CMD dictionary --help check_output for i in `seq 2` do $CMD bruteforce -cnoradi -t${i} data/noradi.zip check_output done $CMD dictionary -d data/dict.txt data/noradi.zip check_output $CMD dictionary -d data/dict.txt data/test_non_encrypted.zip check_output $CMD bruteforce -cnoradi -t1 data/test_non_encrypted.zip check_output $CMD plaintext check_output $CMD plaintext --help check_output $CMD plaintext data/archive_ptext.zip:64:1808 data/archivec.zip:76:1820:64 check_output exit 0 libzc-0.4.1/tests/000077500000000000000000000000001331702632000137565ustar00rootroot00000000000000libzc-0.4.1/tests/Makefile.am000066400000000000000000000046031331702632000160150ustar00rootroot00000000000000# Copyright (C) 2012-2018 Marc Ferland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . TESTS = basic file pwstream bruteforce dictionary reduce plaintext_password plaintext check_PROGRAMS = basic \ file \ pwstream \ bruteforce \ dictionary \ reduce \ plaintext_password \ plaintext AM_CPPFLAGS = -DDATADIR='"$(top_srcdir)/data/"' @CPPFLAGS@ # basic functions test basic_SOURCES = check_basic.c basic_CFLAGS = @CHECK_CFLAGS@ -I$(top_srcdir)/lib basic_LDADD = $(top_builddir)/lib/libzc.la @CHECK_LIBS@ # zc_file related functions file_SOURCES = check_file.c file_CFLAGS = @CHECK_CFLAGS@ -I$(top_srcdir)/lib file_LDADD = $(top_builddir)/lib/libzc.la @CHECK_LIBS@ # zc_crk_bforce related functions bruteforce_SOURCES = check_bruteforce.c bruteforce_CFLAGS = @CHECK_CFLAGS@ -I$(top_srcdir)/lib bruteforce_LDADD = $(top_builddir)/lib/libzc.la @CHECK_LIBS@ # zc_crk_dict related functions dictionary_SOURCES = check_dictionary.c dictionary_CFLAGS = @CHECK_CFLAGS@ -I$(top_srcdir)/lib dictionary_LDADD = $(top_builddir)/lib/libzc.la @CHECK_LIBS@ # pwstream related functions pwstream_SOURCES = check_pwstream.c pwstream_CFLAGS = @CHECK_CFLAGS@ -I$(top_srcdir)/lib pwstream_LDADD = $(top_builddir)/lib/pwstream.lo @CHECK_LIBS@ -lm # reduce related functions reduce_SOURCES = check_reduce.c reduce_CFLAGS = @CHECK_CFLAGS@ -I$(top_srcdir)/lib reduce_LDADD = $(top_builddir)/lib/ptext_reduce.lo \ $(top_builddir)/lib/ka.lo \ @CHECK_LIBS@ # plaintext password functions plaintext_password_SOURCES = check_plaintext_password.c plaintext_password_CFLAGS = @CHECK_CFLAGS@ -I$(top_srcdir)/lib plaintext_password_LDADD = $(top_builddir)/lib/libzc.la @CHECK_LIBS@ # plaintext related functions plaintext_SOURCES = check_plaintext.c plaintext_CFLAGS = @CHECK_CFLAGS@ -I$(top_srcdir)/lib plaintext_LDADD = $(top_builddir)/lib/libzc.la @CHECK_LIBS@ libzc-0.4.1/tests/check_basic.c000066400000000000000000000101231331702632000163350ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include /* libzc */ #include struct zc_ctx *ctx; void setup(void) { zc_new(&ctx); } void teardown(void) { zc_unref(ctx); } START_TEST(test_zc_log_priority) { zc_set_log_priority(ctx, 2); ck_assert_int_eq(zc_get_log_priority(ctx), 2); } END_TEST START_TEST(test_zc_refcount) { struct zc_ctx *p; ck_assert_ptr_eq(zc_ref(ctx), ctx); /* inc */ p = zc_unref(ctx); ck_assert_ptr_eq(p, ctx); /* dec */ ctx = p; p = zc_unref(ctx); ck_assert_ptr_eq(p, NULL); /* dec */ ctx = p; ck_assert_ptr_eq(zc_unref(NULL), NULL); } END_TEST START_TEST(test_zc_file_refcount) { struct zc_file *file, *tmp; int ret; ret = zc_file_new_from_filename(ctx, "dummy", &file); ck_assert_int_eq(ret, 0); tmp = zc_file_ref(file); ck_assert_ptr_eq(tmp, file); /* inc */ file = tmp; tmp = zc_file_unref(file); ck_assert_ptr_eq(tmp, file); /* dec */ file = tmp; tmp = zc_file_unref(file); ck_assert_ptr_eq(tmp, NULL); /* dec */ ck_assert_ptr_eq(zc_file_unref(NULL), NULL); /* dec */ } END_TEST START_TEST(test_zc_crk_dict_refcount) { struct zc_crk_dict *p, *tmp; int ret; ret = zc_crk_dict_new(ctx, &p); ck_assert_int_eq(ret, 0); tmp = zc_crk_dict_ref(p); ck_assert_ptr_eq(tmp, p); /* inc */ p = tmp; tmp = zc_crk_dict_unref(p); ck_assert_ptr_eq(tmp, p); /* dec */ p = tmp; tmp = zc_crk_dict_unref(p); ck_assert_ptr_eq(tmp, NULL); /* dec */ ck_assert_ptr_eq(zc_crk_dict_unref(NULL), NULL); /* dec */ } END_TEST START_TEST(test_zc_crk_bforce_refcount) { struct zc_crk_bforce *p, *tmp; int ret; ret = zc_crk_bforce_new(ctx, &p); ck_assert_int_eq(ret, 0); tmp = zc_crk_bforce_ref(p); ck_assert_ptr_eq(tmp, p); /* inc */ p = tmp; tmp = zc_crk_bforce_unref(p); ck_assert_ptr_eq(tmp, p); /* dec */ p = tmp; tmp = zc_crk_bforce_unref(p); ck_assert_ptr_eq(tmp, NULL); /* dec */ ck_assert_ptr_eq(zc_crk_bforce_unref(NULL), NULL); /* dec */ } END_TEST START_TEST(test_zc_crk_ptext_refcount) { struct zc_crk_ptext *p, *tmp; int ret; ret = zc_crk_ptext_new(ctx, &p); ck_assert_int_eq(ret, 0); tmp = zc_crk_ptext_ref(p); ck_assert_ptr_eq(tmp, p); /* inc */ p = tmp; tmp = zc_crk_ptext_unref(p); ck_assert_ptr_eq(tmp, p); /* dec */ p = tmp; tmp = zc_crk_ptext_unref(p); ck_assert_ptr_eq(tmp, NULL); /* dec */ ck_assert_ptr_eq(zc_crk_ptext_unref(NULL), NULL); /* dec */ } END_TEST Suite *basic_suite(void) { Suite *s; TCase *tc_core; s = suite_create("Basic"); tc_core = tcase_create("Core"); tcase_add_checked_fixture(tc_core, setup, teardown); tcase_add_test(tc_core, test_zc_log_priority); tcase_add_test(tc_core, test_zc_refcount); tcase_add_test(tc_core, test_zc_file_refcount); tcase_add_test(tc_core, test_zc_crk_dict_refcount); tcase_add_test(tc_core, test_zc_crk_bforce_refcount); tcase_add_test(tc_core, test_zc_crk_ptext_refcount); suite_add_tcase(s, tc_core); return s; } int main(void) { int number_failed; Suite *s; SRunner *sr; s = basic_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_NORMAL); number_failed = srunner_ntests_failed(sr); srunner_free(sr); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } libzc-0.4.1/tests/check_bruteforce.c000066400000000000000000000200261331702632000174170ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "libzc.h" struct zc_ctx *ctx; struct zc_crk_bforce *crk; static void setup() { zc_new(&ctx); zc_crk_bforce_new(ctx, &crk); zc_crk_bforce_force_threads(crk, 1); } static void teardown() { zc_crk_bforce_unref(crk); zc_unref(ctx); } START_TEST(test_parameter_set) { struct zc_crk_pwcfg cfg; /* empty set */ memset(cfg.set, 0, ZC_CHARSET_MAXLEN + 1); cfg.setlen = 5; cfg.maxlen = 5; memcpy(cfg.initial, "test", 5); ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "noradi.zip", &cfg), -1); } END_TEST START_TEST(test_parameter_setlen) { struct zc_crk_pwcfg cfg; /* wrong setlen */ strcpy(cfg.set, "aaaaabcd"); cfg.maxlen = 5; strcpy(cfg.initial, "a"); /* sanitze will correct the setlen */ cfg.setlen = 8; ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "noradi.zip", &cfg), 0); ck_assert_str_eq(zc_crk_bforce_sanitized_charset(crk), "abcd"); cfg.setlen = 0; ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "noradi.zip", &cfg), -1); cfg.setlen = ZC_CHARSET_MAXLEN; ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "noradi.zip", &cfg), -1); cfg.setlen = ZC_CHARSET_MAXLEN + 1; ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "noradi.zip", &cfg), -1); } END_TEST START_TEST(test_parameter_init_leak) { struct zc_crk_pwcfg cfg; strcpy(cfg.set, "abcd"); cfg.maxlen = 5; cfg.setlen = 4; strcpy(cfg.initial, "a"); /* first call */ ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "noradi.zip", &cfg), 0); ck_assert_str_eq(zc_crk_bforce_sanitized_charset(crk), "abcd"); /* second call, should not leak */ ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "noradi.zip", &cfg), 0); ck_assert_str_eq(zc_crk_bforce_sanitized_charset(crk), "abcd"); /* third call, should not leak */ ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "noradi.zip", &cfg), 0); ck_assert_str_eq(zc_crk_bforce_sanitized_charset(crk), "abcd"); } END_TEST START_TEST(test_bruteforce_password_found) { struct zc_crk_pwcfg cfg; char out[7]; strcpy(cfg.set, "noradiqwerty"); cfg.maxlen = 6; cfg.setlen = 12; memset(cfg.initial, 0, ZC_PW_MAXLEN + 1); ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "noradi.zip", &cfg), 0); ck_assert_int_eq(zc_crk_bforce_start(crk, out, sizeof(out)), 0); ck_assert_str_eq(out, "noradi"); } END_TEST START_TEST(test_bruteforce_password_found_multicall) { struct zc_crk_pwcfg cfg; char out[7]; strcpy(cfg.set, "noradiqwerty"); cfg.maxlen = 6; cfg.setlen = 12; memset(cfg.initial, 0, ZC_PW_MAXLEN + 1); ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "noradi.zip", &cfg), 0); ck_assert_int_eq(zc_crk_bforce_start(crk, out, sizeof(out)), 0); ck_assert_str_eq(out, "noradi"); memset(out, 0, sizeof(out)); ck_assert_int_eq(zc_crk_bforce_start(crk, out, sizeof(out)), 0); ck_assert_str_eq(out, "noradi"); } END_TEST START_TEST(test_bruteforce_password_not_found) { struct zc_crk_pwcfg cfg; char out[7]; strcpy(cfg.set, "noradiqwerty"); cfg.maxlen = 4; cfg.setlen = 12; memset(cfg.initial, 0, ZC_PW_MAXLEN + 1); ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "noradi.zip", &cfg), 0); ck_assert_int_eq(zc_crk_bforce_start(crk, out, sizeof(out)), 1); } END_TEST START_TEST(test_bruteforce_password_not_found_multicall) { struct zc_crk_pwcfg cfg; char out[7]; strcpy(cfg.set, "noradiqwerty"); cfg.maxlen = 4; cfg.setlen = 12; memset(cfg.initial, 0, ZC_PW_MAXLEN + 1); ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "noradi.zip", &cfg), 0); ck_assert_int_eq(zc_crk_bforce_start(crk, out, sizeof(out)), 1); ck_assert_int_eq(zc_crk_bforce_start(crk, out, sizeof(out)), 1); } END_TEST START_TEST(test_bruteforce_stored) { struct zc_crk_pwcfg cfg; char out[5]; strcpy(cfg.set, "password"); cfg.maxlen = 4; cfg.setlen = 8; memset(cfg.initial, 0, ZC_PW_MAXLEN + 1); ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "stored.zip", &cfg), 0); ck_assert_int_eq(zc_crk_bforce_start(crk, out, sizeof(out)), 0); ck_assert_str_eq(out, "pass"); } END_TEST START_TEST(test_bruteforce_stored_multicall) { struct zc_crk_pwcfg cfg; char out[5]; strcpy(cfg.set, "password"); cfg.maxlen = 4; cfg.setlen = 8; memset(cfg.initial, 0, ZC_PW_MAXLEN + 1); ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "stored.zip", &cfg), 0); ck_assert_int_eq(zc_crk_bforce_start(crk, out, sizeof(out)), 0); ck_assert_str_eq(out, "pass"); ck_assert_int_eq(zc_crk_bforce_start(crk, out, sizeof(out)), 0); ck_assert_str_eq(out, "pass"); } END_TEST #define CANCEL_TESTS 10 static void test_cancel(size_t threads) { struct zc_crk_pwcfg cfg; char out[7]; strcpy(cfg.set, "noradi"); cfg.maxlen = 6; cfg.setlen = 6; memset(cfg.initial, 0, ZC_PW_MAXLEN + 1); ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "noradi.zip", &cfg), 0); for (int i = 0; i < CANCEL_TESTS; ++i) { zc_crk_bforce_force_threads(crk, threads); ck_assert_int_eq(zc_crk_bforce_start(crk, out, sizeof(out)), 0); ck_assert_str_eq(out, "noradi"); } } START_TEST(test_bruteforce_thread_cancellation) { /* Thread cancellation can easily break when making changes, if it does, try to catch it here. If thread cancellation is broken this loop should trigger the problem and the program will just hang forever (making the test fail). */ for (size_t i = 1; i <= 10; ++i) test_cancel(i); } END_TEST START_TEST(test_bruteforce_pay) { struct zc_crk_pwcfg cfg; char out[10]; strcpy(cfg.set, "amorpheus!"); cfg.maxlen = 10; cfg.setlen = 10; strcpy(cfg.initial, "moaaaaaaa"); ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "pay.zip", &cfg), 0); zc_crk_bforce_force_threads(crk, 8); ck_assert_int_eq(zc_crk_bforce_start(crk, out, sizeof(out)), 0); ck_assert_str_eq(out, "morpheus!"); } END_TEST START_TEST(test_bruteforce_pthread_create_fail) { struct zc_crk_pwcfg cfg; char out[7]; strcpy(cfg.set, "noradiqwerty"); cfg.maxlen = 6; cfg.setlen = 12; memset(cfg.initial, 0, ZC_PW_MAXLEN + 1); ck_assert_int_eq(zc_crk_bforce_init(crk, DATADIR "noradi.zip", &cfg), 0); /* create an insane amount of threads, should return an error (not * crash ...) */ zc_crk_bforce_force_threads(crk, 95884); ck_assert_int_eq(zc_crk_bforce_start(crk, out, sizeof(out)), 1); } END_TEST Suite *bforce_suite(void) { Suite *s; TCase *tc_core; s = suite_create("bruteforce"); tc_core = tcase_create("Core"); tcase_add_checked_fixture(tc_core, setup, teardown); tcase_add_test(tc_core, test_parameter_set); tcase_add_test(tc_core, test_parameter_setlen); tcase_add_test(tc_core, test_parameter_init_leak); tcase_add_test(tc_core, test_bruteforce_password_found); tcase_add_test(tc_core, test_bruteforce_password_found_multicall); tcase_add_test(tc_core, test_bruteforce_password_not_found); tcase_add_test(tc_core, test_bruteforce_password_not_found_multicall); tcase_add_test(tc_core, test_bruteforce_stored); tcase_add_test(tc_core, test_bruteforce_stored_multicall); tcase_add_test(tc_core, test_bruteforce_thread_cancellation); tcase_add_test(tc_core, test_bruteforce_pay); #ifdef EXTRACHECK tcase_add_test(tc_core, test_bruteforce_pthread_create_fail); #endif tcase_set_timeout(tc_core, 120); suite_add_tcase(s, tc_core); return s; } int main(void) { int number_failed; Suite *s; SRunner *sr; s = bforce_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_NORMAL); number_failed = srunner_ntests_failed(sr); srunner_free(sr); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } libzc-0.4.1/tests/check_dictionary.c000066400000000000000000000047101331702632000174260ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "libzc.h" #define LEN 20 struct zc_ctx *ctx; struct zc_crk_dict *crk; char pw[LEN]; static void setup() { zc_new(&ctx); zc_crk_dict_new(ctx, &crk); } static void teardown() { zc_crk_dict_unref(crk); zc_unref(ctx); } START_TEST(test_init_file_not_found) { ck_assert_int_eq(zc_crk_dict_init(crk, "doesnotexits.zip"), -1); } END_TEST START_TEST(test_init_file_found) { ck_assert_int_eq(zc_crk_dict_init(crk, DATADIR "noradi.zip"), 0); } END_TEST START_TEST(test_dict_not_found) { zc_crk_dict_init(crk, DATADIR "noradi.zip"); ck_assert_int_eq(zc_crk_dict_start(crk, "doesnotexits", pw, LEN), -1); } END_TEST START_TEST(test_dict_success) { zc_crk_dict_init(crk, DATADIR "noradi.zip"); ck_assert_int_eq(zc_crk_dict_start(crk, DATADIR "dict.txt", pw, LEN), 0); ck_assert_str_eq(pw, "noradi"); } END_TEST START_TEST(test_dict_fail) { zc_crk_dict_init(crk, DATADIR "noradi.zip"); ck_assert_int_eq(zc_crk_dict_start(crk, DATADIR "pw.txt", pw, LEN), -1); } END_TEST Suite *dict_suite(void) { Suite *s; TCase *tc_core; s = suite_create("dictionary"); tc_core = tcase_create("Core"); tcase_add_checked_fixture(tc_core, setup, teardown); tcase_add_test(tc_core, test_init_file_not_found); tcase_add_test(tc_core, test_init_file_found); tcase_add_test(tc_core, test_dict_not_found); tcase_add_test(tc_core, test_dict_success); tcase_add_test(tc_core, test_dict_fail); suite_add_tcase(s, tc_core); return s; } int main(void) { int number_failed; Suite *s; SRunner *sr; s = dict_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_NORMAL); number_failed = srunner_ntests_failed(sr); srunner_free(sr); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } libzc-0.4.1/tests/check_file.c000066400000000000000000000133341331702632000162020ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include /* libzc */ #include struct zc_ctx *ctx; struct zc_file *file; void setup(void) { zc_new(&ctx); file = NULL; } void teardown(void) { zc_file_unref(file); zc_unref(ctx); } START_TEST(test_zc_file_new) { zc_file_new_from_filename(ctx, "toto.zip", &file); fail_if(strcmp(zc_file_get_filename(file), "toto.zip") != 0, "Filename does not match."); ck_assert(zc_file_isopened(file) == false); } END_TEST START_TEST(test_zc_file_open_existant) { zc_file_new_from_filename(ctx, DATADIR "test.zip", &file); ck_assert(zc_file_isopened(file) == false); fail_if(zc_file_open(file) != 0, "File could not be opened."); ck_assert(zc_file_isopened(file) == true); zc_file_close(file); ck_assert(zc_file_isopened(file) == false); } END_TEST START_TEST(test_zc_file_open_nonexistant) { zc_file_new_from_filename(ctx, "doesnotexists.zip", &file); ck_assert(zc_file_isopened(file) == false); fail_if(zc_file_open(file) == 0, "Non-existant file reported having been opened."); ck_assert(zc_file_isopened(file) == false); } END_TEST START_TEST(test_zc_file_close_opened) { zc_file_new_from_filename(ctx, DATADIR "test.zip", &file); zc_file_open(file); fail_if(zc_file_close(file) != 0, "Closing existant file failed."); } END_TEST /* * data/test.zip: * INDEX NAME OFFSETS SIZE ENCRYPTED HEADER * 0 lib/test_crk.c 72 84 4742 4658 f00e35670cf88aa5e98ae477 * 1 lib/test_file.c 1386 1398 5862 4464 b73dc9d1b67312692d069a33 * 2 lib/test_pwgen.c 2686 2698 9577 6879 dbe99c24b7b0836471782106 * 3 lib/test_pwdict.c 4163 4175 7340 3165 616f68a1e82c05651dc989e8 */ START_TEST(test_zc_file_info_encrypted) { const uint8_t header[4][12] = { {0xf0, 0x0e, 0x35, 0x67, 0x0c, 0xf8, 0x8a, 0xa5, 0xe9, 0x8a, 0xe4, 0x77}, {0xb7, 0x3d, 0xc9, 0xd1, 0xb6, 0x73, 0x12, 0x69, 0x2d, 0x06, 0x9a, 0x33}, {0xdb, 0xe9, 0x9c, 0x24, 0xb7, 0xb0, 0x83, 0x64, 0x71, 0x78, 0x21, 0x06}, {0x61, 0x6f, 0x68, 0xa1, 0xe8, 0x2c, 0x05, 0x65, 0x1d, 0xc9, 0x89, 0xe8} }; const uint32_t info_size[4] = {4658, 4464, 6879, 3165}; const long info_offset[4] = {84, 1398, 2698, 4175}; const long info_crypt[4] = {72, 1386, 2686, 4163}; const char *info_filename[4] = {"lib/test_crk.c", "lib/test_file.c", "lib/test_pwgen.c", "lib/test_pwdict.c" }; struct zc_info *info; const uint8_t *buf; zc_file_new_from_filename(ctx, DATADIR "test.zip", &file); zc_file_open(file); int i = 0; info = zc_file_info_next(file, NULL); do { fail_if(strcmp(zc_file_get_filename(file), info_filename[i]) == 0); ck_assert(zc_file_info_size(info) == info_size[i]); ck_assert(zc_file_info_offset(info) == info_offset[i]); ck_assert(zc_file_info_crypt_header_offset(info) == info_crypt[i]); ck_assert(zc_file_info_idx(info) == i); buf = zc_file_info_enc_header(info); for (int j = 0; j < 12; ++j) ck_assert(buf[j] == header[i][j]); info = zc_file_info_next(file, info); ++i; } while (info); ck_assert_int_eq(i, 4); zc_file_close(file); } END_TEST /* * data/test_non_encrypted.zip: * INDEX NAME OFFSETS SIZE ENCRYPTED HEADER * 0 config.h -1 66 2964 2898 000000000000000000000000 * 1 config.h.in -1 1075 3722 2647 000000000000000000000000 * 2 config.log -1 1997 32999 31002 000000000000000000000000 */ START_TEST(test_zc_file_info_non_encrypted) { const uint32_t info_size[3] = {2898, 2647, 31002}; const long info_offset[3] = {66, 1075, 1997}; const char *info_filename[3] = {"config.h", "config.h.in", "config.log" }; struct zc_info *info; const uint8_t *buf; zc_file_new_from_filename(ctx, DATADIR "test_non_encrypted.zip", &file); zc_file_open(file); int i = 0; info = zc_file_info_next(file, NULL); do { fail_if(strcmp(zc_file_get_filename(file), info_filename[i]) == 0); ck_assert(zc_file_info_size(info) == info_size[i]); ck_assert(zc_file_info_offset(info) == info_offset[i]); ck_assert(zc_file_info_crypt_header_offset(info) == -1); ck_assert(zc_file_info_idx(info) == i); buf = zc_file_info_enc_header(info); for (int j = 0; j < 12; ++j) ck_assert(buf[j] == 0); info = zc_file_info_next(file, info); ++i; } while (info); ck_assert_int_eq(i, 3); zc_file_close(file); } END_TEST Suite *file_suite(void) { Suite *s; TCase *tc_core; s = suite_create("File"); tc_core = tcase_create("Core"); tcase_add_checked_fixture(tc_core, setup, teardown); tcase_add_test(tc_core, test_zc_file_new); tcase_add_test(tc_core, test_zc_file_open_existant); tcase_add_test(tc_core, test_zc_file_open_nonexistant); tcase_add_test(tc_core, test_zc_file_close_opened); tcase_add_test(tc_core, test_zc_file_info_encrypted); tcase_add_test(tc_core, test_zc_file_info_non_encrypted); suite_add_tcase(s, tc_core); return s; } int main(void) { int number_failed; Suite *s; SRunner *sr; s = file_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_NORMAL); number_failed = srunner_ntests_failed(sr); srunner_free(sr); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } libzc-0.4.1/tests/check_plaintext.c000066400000000000000000000062051331702632000172720ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "libzc.h" #include "test_plaintext.h" struct zc_ctx *ctx; void setup_ptext() { zc_new(&ctx); } void teardown_ptext() { zc_unref(ctx); } START_TEST(test_zc_ptext_new) { struct zc_crk_ptext *ptext; fail_unless(zc_crk_ptext_new(ctx, &ptext) == 0, NULL); fail_unless(zc_crk_ptext_unref(ptext) == 0, NULL); } END_TEST START_TEST(test_zc_ptext_set_cipher_and_plaintext) { struct zc_crk_ptext *ptext; fail_unless(zc_crk_ptext_new(ctx, &ptext) == 0, NULL); fail_unless(zc_crk_ptext_set_text(ptext, test_plaintext, test_ciphertext, TEST_PLAINTEXT_SIZE) == 0, NULL); fail_unless(zc_crk_ptext_unref(ptext) == 0, NULL); } END_TEST START_TEST(test_zc_crk_ptext_attack) { struct zc_crk_ptext *ptext; struct zc_key out_key; fail_unless(zc_crk_ptext_new(ctx, &ptext) == 0, NULL); fail_unless(zc_crk_ptext_set_text(ptext, test_plaintext, test_ciphertext, TEST_PLAINTEXT_SIZE) == 0, NULL); fail_unless(zc_crk_ptext_key2_reduction(ptext) == 0, NULL); fail_unless(zc_crk_ptext_attack(ptext, &out_key) == 0, NULL); fail_unless(out_key.key0 == 0x6b1e4593 && out_key.key1 == 0xd81e41ed && out_key.key2 == 0x9a616e02, NULL); fail_unless(zc_crk_ptext_unref(ptext) == 0, NULL); } END_TEST START_TEST(test_zc_crk_ptext_find_internal_rep) { struct zc_key out_key = { .key0 = 0x6b1e4593, .key1 = 0xd81e41ed, .key2 = 0x9a616e02 }; struct zc_key internal_rep; fail_unless(zc_crk_ptext_find_internal_rep(&out_key, test_encrypted_header, 12, &internal_rep) == 0, NULL); fail_unless(internal_rep.key0 == 0x9ccebdf4 && internal_rep.key1 == 0x758c65be && internal_rep.key2 == 0xc661eb70, NULL); } END_TEST Suite *plaintext_suite() { Suite *s = suite_create("plaintext"); TCase *tc_core = tcase_create("Core"); tcase_add_checked_fixture(tc_core, setup_ptext, teardown_ptext); tcase_add_test(tc_core, test_zc_ptext_new); tcase_add_test(tc_core, test_zc_ptext_set_cipher_and_plaintext); #ifdef EXTRACHECK tcase_add_test(tc_core, test_zc_crk_ptext_attack); tcase_add_test(tc_core, test_zc_crk_ptext_find_internal_rep); tcase_set_timeout(tc_core, 60 * 60); #endif suite_add_tcase(s, tc_core); return s; } int main() { int number_failed; Suite *s; SRunner *sr; s = plaintext_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_NORMAL); number_failed = srunner_ntests_failed(sr); srunner_free(sr); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } libzc-0.4.1/tests/check_plaintext_password.c000066400000000000000000000171261331702632000212200ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "libzc.h" struct zc_ctx *ctx; struct zc_crk_ptext *ptext; struct test_pool { struct zc_key k; const char *pw; size_t len; }; #ifdef EXTRACHECK #define POOL_LEN 22 #else #define POOL_LEN 19 #endif struct test_pool pool[POOL_LEN] = { { { 0x64799c96, 0xb303049c, 0xa253270a }, "a", 1 }, { { 0xfd70cd2c, 0x5f7c5a8a, 0x0bef8959 }, "b", 1 }, { { 0x8a77fdba, 0xd4359550, 0x7185d3f1 }, "c", 1 }, { { 0x14136819, 0xc6da8e2b, 0x823ca2b9 }, "d", 1 }, { { 0x6b644339, 0xb7a8c716, 0x2943427d }, "12", 2 }, { { 0xe0be8d5d, 0x70bb3140, 0x7e983fff }, "123", 3 }, { { 0x5dd2af4d, 0x589d03b4, 0x3cf5ffa4 }, "abc", 3 }, { { 0x42ef4ac3, 0x8d167254, 0x428e6d93 }, "abcd", 4 }, { { 0x86acf865, 0x35f28777, 0x487a4de6 }, "eert", 4 }, { { 0xc7c2fd91, 0x8ceeffa2, 0x607e0c0b }, "marc", 4 }, { { 0x71850bee, 0xf0d3c2f5, 0xcd86a60b }, "12345", 5 }, { { 0x69ca8e31, 0xada107e8, 0x1a02db98 }, "soleil", 6 }, { { 0xbfa7c384, 0x8ce275f6, 0x381ff5ad }, "pploam", 6 }, { { 0x92d892f8, 0x929fc2cd, 0xbecc427c }, "olivier", 7 }, { { 0xf06c6793, 0xa728bdfe, 0xad145306 }, "quanfp5", 7 }, { { 0xc55fcbf5, 0xb45779f0, 0xaad9ef66 }, "p)(]lkj", 7 }, { { 0xf5ba4621, 0x5333625d, 0x6c5eaac2 }, "laurence", 8 }, { { 0x6c0c6c36, 0x4c8d85db, 0xdf01fc4f }, "mmna017f", 8 }, { { 0x354fe972, 0x1d10245c, 0xb361d1e4 }, "uuhnd5FG%", 9 }, #ifdef EXTRACHECK { { 0x315e2c2d, 0x5b1586ba, 0xf57b0245 }, "kkjnhbgv78", 10 }, { { 0xd9a4f37e, 0x671cc039, 0xe1c65a02 }, "yhfg-098m31", 11 }, { { 0x9986f7db, 0x67338fae, 0x131eb6d7 }, "0098ikjmn3@@", 12 }, #endif }; void setup_ptext() { zc_new(&ctx); zc_crk_ptext_new(ctx, &ptext); } void teardown_ptext() { zc_crk_ptext_unref(ptext); zc_unref(ctx); } START_TEST(test_zc_crk_ptext_find_password_0) { char pw[14]; struct zc_key internal_rep = { .key0 = 0x12345678, .key1 = 0x23456789, .key2 = 0x34567890 }; ck_assert_int_eq(zc_crk_ptext_find_password(ptext, &internal_rep, pw, sizeof(pw)), 0); } END_TEST START_TEST(test_zc_crk_ptext_find_password_1) { char pw[14]; struct zc_key internal_rep = { .key0 = 0x64799c96, .key1 = 0xb303049c, .key2 = 0xa253270a }; ck_assert_int_eq(zc_crk_ptext_find_password(ptext, &internal_rep, pw, sizeof(pw)), 1); ck_assert_str_eq(pw, "a"); } END_TEST START_TEST(test_zc_crk_ptext_find_password_2) { char pw[14]; struct zc_key internal_rep = { .key0 = 0x23bd1e23, .key1 = 0x2b7993bc, .key2 = 0x4ccb4379 }; ck_assert_int_eq(zc_crk_ptext_find_password(ptext, &internal_rep, pw, sizeof(pw)), 2); ck_assert_str_eq(pw, "aa"); } END_TEST START_TEST(test_zc_crk_ptext_find_password_3) { char pw[14]; struct zc_key internal_rep = { .key0 = 0x98f19da2, .key1 = 0x1cd05dd7, .key2 = 0x3d945e94 }; ck_assert_int_eq(zc_crk_ptext_find_password(ptext, &internal_rep, pw, sizeof(pw)), 3); ck_assert_str_eq(pw, "aaa"); } END_TEST START_TEST(test_zc_crk_ptext_find_password_4) { char pw[14]; struct zc_key internal_rep = { .key0 = 0x2f56297, .key1 = 0x64329027, .key2 = 0xbd806642 }; ck_assert_int_eq(zc_crk_ptext_find_password(ptext, &internal_rep, pw, sizeof(pw)), 4); ck_assert_str_eq(pw, "aaaa"); } END_TEST START_TEST(test_zc_crk_ptext_find_password_5) { char pw[14]; struct zc_key internal_rep = { .key0 = 0x54dca24b, .key1 = 0x1b079a3b, .key2 = 0x120a6936 }; ck_assert_int_eq(zc_crk_ptext_find_password(ptext, &internal_rep, pw, sizeof(pw)), 5); ck_assert_str_eq(pw, "aaaaa"); } END_TEST START_TEST(test_zc_crk_ptext_find_password_6) { char pw[14]; struct zc_key internal_rep = { .key0 = 0xdbef1574, .key1 = 0xc060416c, .key2 = 0x54cc5d40 }; ck_assert_int_eq(zc_crk_ptext_find_password(ptext, &internal_rep, pw, sizeof(pw)), 6); ck_assert_str_eq(pw, "aaaaaa"); } END_TEST START_TEST(test_zc_crk_ptext_find_password_7) { char pw[14]; struct zc_key internal_rep = { .key0 = 0x6d060bfe, .key1 = 0xc76ff413, .key2 = 0x7388dade }; ck_assert_int_eq(zc_crk_ptext_find_password(ptext, &internal_rep, pw, sizeof(pw)), 7); ck_assert_str_eq(pw, "aaaaaaa"); } END_TEST START_TEST(test_zc_crk_ptext_find_password_8) { char pw[14]; struct zc_key internal_rep = { .key0 = 0x60dd88de, .key1 = 0xcf040cb6, .key2 = 0x6ac3a828 }; ck_assert_int_eq(zc_crk_ptext_find_password(ptext, &internal_rep, pw, sizeof(pw)), 8); ck_assert_str_eq(pw, "aaaaaaaa"); } END_TEST START_TEST(test_zc_crk_ptext_find_password_9) { char pw[14]; struct zc_key internal_rep = { .key0 = 0x5bbe7395, .key1 = 0xe446ee78, .key2 = 0x92b84d33}; ck_assert_int_eq(zc_crk_ptext_find_password(ptext, &internal_rep, pw, sizeof(pw)), 9); ck_assert_str_eq(pw, "aaaaaaaaa"); } END_TEST START_TEST(test_zc_crk_ptext_find_password_10) { char pw[14]; struct zc_key internal_rep = { .key0 = 0xba8b8876, .key1 = 0xf00562a7, .key2 = 0x02ff2b47 }; ck_assert_int_eq(zc_crk_ptext_find_password(ptext, &internal_rep, pw, sizeof(pw)), 10); ck_assert_str_eq(pw, "aaaaaaaaaa"); } END_TEST START_TEST(test_zc_crk_ptext_find_password_11) { char pw[14]; struct zc_key internal_rep = { .key0 = 0x83690e4f, .key1 = 0x3ed1c6cf, .key2 = 0x29db36b3 }; ck_assert_int_eq(zc_crk_ptext_find_password(ptext, &internal_rep, pw, sizeof(pw)), 11); ck_assert_str_eq(pw, "aaaaaaaaaaa"); } END_TEST START_TEST(test_zc_crk_ptext_find_password_pool) { char pw[14]; struct zc_key internal_rep; for (int i = 0; i < POOL_LEN; ++i) { internal_rep = pool[i].k; ck_assert_int_eq(zc_crk_ptext_find_password(ptext, &internal_rep, pw, sizeof(pw)), pool[i].len); ck_assert_str_eq(pw, pool[i].pw); } } END_TEST Suite *plaintext_password_suite() { Suite *s = suite_create("plaintext_password"); TCase *tc_core = tcase_create("Core"); tcase_add_checked_fixture(tc_core, setup_ptext, teardown_ptext); tcase_add_test(tc_core, test_zc_crk_ptext_find_password_0); tcase_add_test(tc_core, test_zc_crk_ptext_find_password_1); tcase_add_test(tc_core, test_zc_crk_ptext_find_password_2); tcase_add_test(tc_core, test_zc_crk_ptext_find_password_3); tcase_add_test(tc_core, test_zc_crk_ptext_find_password_4); tcase_add_test(tc_core, test_zc_crk_ptext_find_password_5); tcase_add_test(tc_core, test_zc_crk_ptext_find_password_6); tcase_add_test(tc_core, test_zc_crk_ptext_find_password_7); tcase_add_test(tc_core, test_zc_crk_ptext_find_password_8); #ifdef EXTRACHECK tcase_add_test(tc_core, test_zc_crk_ptext_find_password_9); tcase_add_test(tc_core, test_zc_crk_ptext_find_password_10); tcase_add_test(tc_core, test_zc_crk_ptext_find_password_11); tcase_set_timeout(tc_core, 3600); #else tcase_set_timeout(tc_core, 60); #endif tcase_add_test(tc_core, test_zc_crk_ptext_find_password_pool); suite_add_tcase(s, tc_core); return s; } int main() { int number_failed; Suite *s; SRunner *sr; s = plaintext_password_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_NORMAL); number_failed = srunner_ntests_failed(sr); srunner_free(sr); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } libzc-0.4.1/tests/check_pwstream.c000066400000000000000000000202731331702632000171250ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "libzc_private.h" #include "pwstream.h" struct pwstream *pws; void setup_pws() { pwstream_new(&pws); } void teardown_pws() { pwstream_free(pws); } static void test_generated_stream(const struct entry *ref) { size_t streams = pwstream_get_stream_count(pws); size_t pwlen = pwstream_get_pwlen(pws); for (size_t i = 0; i < streams; ++i) { for (size_t j = 0; j < pwlen; ++j) { const struct entry *e = pwstream_get_entry(pws, i, j); ck_assert_int_eq(e->start, ref[i * pwlen + j].start); ck_assert_int_eq(e->stop, ref[i * pwlen + j].stop); ck_assert_int_eq(e->initial, ref[i * pwlen + j].initial); /* printf("%d, %d\n", pwstream_get_start_idx(pws, i, j), */ /* pwstream_get_stop_idx(pws, i, j)); */ } } } /* pool len: 3 pw len: 3 streams: 3 */ static const struct entry test_initial1[] = { {0, 0, 0}, {0, 2, 0}, {0, 2, 0}, {1, 1, 1}, {0, 2, 0}, {0, 2, 0}, {2, 2, 2}, {0, 2, 0}, {0, 2, 0}, }; START_TEST(generate_test_initial1) { pwstream_generate(pws, 3, 3, 3, NULL); test_generated_stream(test_initial1); } END_TEST /* pool len: 3 pw len: 3 streams: 3 */ static const struct entry test_initial2[] = { {0, 0, 0}, {0, 2, 0}, {0, 2, 0}, {1, 1, 1}, {0, 2, 0}, {0, 2, 0}, {2, 2, 2}, {0, 2, 0}, {0, 2, 0}, }; static const size_t initial2[] = {0, 0, 0}; START_TEST(generate_test_initial2) { pwstream_generate(pws, 3, 3, 3, initial2); test_generated_stream(test_initial2); } END_TEST /* pool len: 3 pw len: 3 streams: 3 */ static const struct entry test_initial3[] = { {0, 0, 0}, {0, 2, 1}, {0, 2, 0}, {1, 1, 1}, {0, 2, 1}, {0, 2, 0}, {2, 2, 2}, {0, 2, 1}, {0, 2, 0}, }; static const size_t initial3[] = {0, 1, 0}; START_TEST(generate_test_initial3) { pwstream_generate(pws, 3, 3, 3, initial3); test_generated_stream(test_initial3); } END_TEST /* pool len: 3 pw len: 3 streams: 3 */ static const struct entry test_initial4[] = { {0, 0, 0}, {0, 2, 1}, {0, 2, 0}, {1, 1, 1}, {0, 2, 1}, {0, 2, 0}, {2, 2, 2}, {0, 2, 1}, {0, 2, 0}, }; static const size_t initial4[] = {1, 1, 0}; START_TEST(generate_test_initial4) { pwstream_generate(pws, 3, 3, 3, initial4); test_generated_stream(test_initial4); } END_TEST /* pool len: 3 pw len: 3 streams: 3 */ static const struct entry test_initial5[] = { {0, 0, 0}, {0, 2, 1}, {0, 2, 1}, {1, 1, 1}, {0, 2, 1}, {0, 2, 1}, {2, 2, 2}, {0, 2, 1}, {0, 2, 1}, }; static const size_t initial5[] = {1, 1, 1}; START_TEST(generate_test_initial5) { pwstream_generate(pws, 3, 3, 3, initial5); test_generated_stream(test_initial5); } END_TEST /* pool len: 3 pw len: 3 streams: 2 */ static const struct entry test_initial6[] = { {0, 0, 0}, {0, 2, 0}, {0, 2, 0}, {1, 2, 2}, {0, 2, 0}, {0, 2, 0}, }; static const size_t initial6[] = {2, 0, 0}; START_TEST(generate_test_initial6) { pwstream_generate(pws, 3, 3, 2, initial6); test_generated_stream(test_initial6); } END_TEST /* pool len: 3 pw len: 3 streams: 2 */ static const struct entry test_initial7[] = { {0, 0, 0}, {0, 2, 2}, {0, 2, 0}, {1, 2, 2}, {0, 2, 2}, {0, 2, 0}, }; static const size_t initial7[] = {2, 2, 0}; START_TEST(generate_test_initial7) { pwstream_generate(pws, 3, 3, 2, initial7); test_generated_stream(test_initial7); } END_TEST /* pool len: 2 pw len: 2 streams: 5 */ static const struct entry over_streams1[] = { {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {1, 1, 1}, {1, 1, 1}, {0, 0, 0}, {1, 1, 1}, {1, 1, 1}, { -1, -1, -1}, { -1, -1, -1}, }; START_TEST(generate_over_streams1) { pwstream_generate(pws, 2, 2, 5, NULL); test_generated_stream(over_streams1); } END_TEST /* pool len: 1 pw len: 2 streams: 5 */ static const struct entry over_streams2[] = { {0, 0, 0}, {0, 0, 0}, { -1, -1, -1}, { -1, -1, -1}, { -1, -1, -1}, { -1, -1, -1}, { -1, -1, -1}, { -1, -1, -1}, { -1, -1, -1}, { -1, -1, -1} }; START_TEST(generate_over_streams2) { pwstream_generate(pws, 1, 2, 5, NULL); test_generated_stream(over_streams2); } END_TEST /* pool len: 1 pw len: 1 streams: 5 */ static const struct entry over_streams3[] = { {0, 0, 0}, { -1, -1, -1}, { -1, -1, -1}, { -1, -1, -1}, { -1, -1, -1} }; START_TEST(generate_over_streams3) { pwstream_generate(pws, 1, 1, 5, NULL); test_generated_stream(over_streams3); } END_TEST /* pool len: 3 pw len: 5 streams: 5 */ static const struct entry less[] = { {0, 0, 0}, {0, 0, 0}, {0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {0, 0, 0}, {1, 2, 1}, {0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {1, 1, 1}, {0, 0, 0}, {0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {1, 1, 1}, {1, 2, 1}, {0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {2, 2, 2}, {0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {0, 2, 0} }; START_TEST(generate_less) { pwstream_generate(pws, 3, 5, 5, NULL); test_generated_stream(less); } END_TEST /* pool len: 3 pw len: 5 streams: 10 */ static const struct entry less1[] = { {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 2, 0}, {0, 2, 0}, {0, 0, 0}, {0, 0, 0}, {1, 2, 1}, {0, 2, 0}, {0, 2, 0}, {0, 0, 0}, {1, 1, 1}, {0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {0, 0, 0}, {2, 2, 2}, {0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {1, 1, 1}, {0, 0, 0}, {0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {1, 1, 1}, {1, 1, 1}, {0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {1, 1, 1}, {2, 2, 2}, {0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {2, 2, 2}, {0, 0, 0}, {0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {2, 2, 2}, {1, 1, 1}, {0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {2, 2, 2}, {2, 2, 2}, {0, 2, 0}, {0, 2, 0}, {0, 2, 0} }; START_TEST(generate_less1) { pwstream_generate(pws, 3, 5, 10, NULL); test_generated_stream(less1); } END_TEST /* pool len: 8 pw len: 5 streams: 5 */ static const struct entry more[] = { {0, 0, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {1, 2, 1}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {3, 3, 3}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {4, 5, 4}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {6, 7, 6}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0}, {0, 7, 0} }; START_TEST(generate_more) { pwstream_generate(pws, 8, 5, 5, NULL); test_generated_stream(more); } END_TEST /* pool len: 5 pw len: 5 streams: 5 */ static const struct entry equal[] = { {0, 0, 0}, {0, 4, 0}, {0, 4, 0}, {0, 4, 0}, {0, 4, 0}, {1, 1, 1}, {0, 4, 0}, {0, 4, 0}, {0, 4, 0}, {0, 4, 0}, {2, 2, 2}, {0, 4, 0}, {0, 4, 0}, {0, 4, 0}, {0, 4, 0}, {3, 3, 3}, {0, 4, 0}, {0, 4, 0}, {0, 4, 0}, {0, 4, 0}, {4, 4, 4}, {0, 4, 0}, {0, 4, 0}, {0, 4, 0}, {0, 4, 0} }; START_TEST(generate_equal) { pwstream_generate(pws, 5, 5, 5, NULL); test_generated_stream(equal); } END_TEST Suite *pwstream_suite() { Suite *s = suite_create("pwstream"); TCase *tc_core = tcase_create("Core"); tcase_add_checked_fixture(tc_core, setup_pws, teardown_pws); tcase_add_test(tc_core, generate_test_initial1); tcase_add_test(tc_core, generate_test_initial2); tcase_add_test(tc_core, generate_test_initial3); tcase_add_test(tc_core, generate_test_initial4); tcase_add_test(tc_core, generate_test_initial5); tcase_add_test(tc_core, generate_test_initial6); tcase_add_test(tc_core, generate_test_initial7); tcase_add_test(tc_core, generate_over_streams1); tcase_add_test(tc_core, generate_over_streams2); tcase_add_test(tc_core, generate_over_streams3); tcase_add_test(tc_core, generate_less); tcase_add_test(tc_core, generate_less1); tcase_add_test(tc_core, generate_more); tcase_add_test(tc_core, generate_equal); suite_add_tcase(s, tc_core); return s; } int main() { int number_failed; Suite *s; SRunner *sr; s = pwstream_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_NORMAL); number_failed = srunner_ntests_failed(sr); srunner_free(sr); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } libzc-0.4.1/tests/check_reduce.c000066400000000000000000000055631331702632000165370ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "ptext_private.h" #include "test_plaintext.h" #define KEY3(index) test_plaintext[index] ^ test_ciphertext[index] struct key2r *k2r; void setup_key2r() { key2r_new(&k2r); } void teardown_key2r() { key2r_free(k2r); } START_TEST(test_can_get_bits_15_2) { uint16_t *bits15_2; bits15_2 = key2r_get_bits_15_2(k2r, 0); fail_if(bits15_2[0] != 0); } END_TEST START_TEST(test_can_generate_first_gen_key2) { struct ka *key2_first_gen; uint16_t *bits15_2; bits15_2 = key2r_get_bits_15_2(k2r, 0); key2_first_gen = key2r_compute_first_gen(bits15_2); fail_if(ka_at(key2_first_gen, 0) != 0); ka_free(key2_first_gen); } END_TEST START_TEST(test_can_generate_next_array_from_plaintext) { struct ka *key2_first_gen; struct ka *key2_next_gen; uint8_t key3i = KEY3(TEST_PLAINTEXT_SIZE - 1); uint8_t key3im1 = KEY3(TEST_PLAINTEXT_SIZE - 2); uint8_t key3im2 = KEY3(TEST_PLAINTEXT_SIZE - 3); key2_first_gen = key2r_compute_first_gen(key2r_get_bits_15_2(k2r, key3i)); ka_alloc(&key2_next_gen, pow2(22)); ka_empty(key2_next_gen); for (uint32_t i = 0; i < key2_first_gen->size; ++i) { fail_if(key2r_compute_single(ka_at(key2_first_gen, i), key2_next_gen, key2r_get_bits_15_2(k2r, key3im1), key2r_get_bits_15_2(k2r, key3im2), KEY2_MASK_6BITS) != 0); } ka_uniq(key2_next_gen); fail_if(key2_next_gen->size != 2256896); ka_free(key2_next_gen); ka_free(key2_first_gen); } END_TEST Suite *reduce_suite() { Suite *s = suite_create("reduce"); TCase *tc_core = tcase_create("Core"); tcase_add_checked_fixture(tc_core, setup_key2r, teardown_key2r); tcase_add_test(tc_core, test_can_get_bits_15_2); tcase_add_test(tc_core, test_can_generate_first_gen_key2); #ifdef EXTRACHECK tcase_add_test(tc_core, test_can_generate_next_array_from_plaintext); #endif tcase_set_timeout(tc_core, 60); suite_add_tcase(s, tc_core); return s; } int main() { int number_failed; Suite *s; SRunner *sr; s = reduce_suite(); sr = srunner_create(s); srunner_run_all(sr, CK_NORMAL); number_failed = srunner_ntests_failed(sr); srunner_free(sr); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } libzc-0.4.1/tests/gentestpool.py000077500000000000000000000127671331702632000167130ustar00rootroot00000000000000#!/usr/bin/python # Copyright (C) 2012-2018 Marc Ferland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys initial_state = [0x12345678, 0x23456789, 0x34567890] crc32tab = [0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d] def crc32(crc, byte): i = (crc ^ byte) & 0xff return crc32tab[i] ^ crc >> 8 def update_key(c, key): key[0] = crc32(key[0], c) key[1] = ((key[1] + (key[0] & 0xff)) * 134775813 + 1) & 0xffffffff key[2] = crc32(key[2], key[1] >> 24) def calculate_initial_state(pw, key): while pw != '': update_key(ord(pw[0]), key) pw = pw[1:] def print_key(c, key): print '[{}] %s'.format(', '.join("0x" + hex(x)[2:].zfill(8) for x in key)) % c pw = ['a', 'b', 'c', 'd', '12', '123', 'abc', 'abcd', 'eert', 'marc', 'olivier', 'laurence', 'soleil', '12345', 'pploam', 'quanfp5', 'mmna017f', 'p)(]lkj', 'kkjnhbgv78', '0098ikjmn3@@', 'uuhnd5FG%', 'yhfg-098m31'] pw.sort(key=len) print '#define POOL_LEN {}'.format(len(pw)) print 'struct test_pool pool[POOL_LEN] = {' for p in pw: k = list(initial_state) calculate_initial_state(p, k) print ' { { ' + '{}'.format(', '.join("0x" + hex(x)[2:].zfill(8) for x in k)) + ' }}, "{}", {} }},'.format(p, len(p)) print '};' libzc-0.4.1/tests/initkeys.py000077500000000000000000000117331331702632000161770ustar00rootroot00000000000000#!/usr/bin/python # Copyright (C) 2012-2018 Marc Ferland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys crc32tab = [0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d] def crc32(crc, byte): i = (crc ^ byte) & 0xff return crc32tab[i] ^ crc >> 8 def update_key(c, key): key[0] = crc32(key[0], c) key[1] = ((key[1] + (key[0] & 0xff)) * 134775813 + 1) & 0xffffffff key[2] = crc32(key[2], key[1] >> 24) def print_key(c, key): print '[{}] %s'.format(', '.join("0x" + hex(x)[2:].zfill(8) for x in key)) % c pw = sys.argv[1] key = [0x12345678, 0x23456789, 0x34567890] print_key('(null)', key) while pw != '': update_key(ord(pw[0]), key) print_key(pw[0], key) pw = pw[1:] libzc-0.4.1/tests/test_plaintext.h000066400000000000000000000160261331702632000172030ustar00rootroot00000000000000/* * zc - zip crack library * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _TEST_PLAINTEXT_H_ #define _TEST_PLAINTEXT_H_ #define TEST_PLAINTEXT_SIZE 500 static const uint8_t test_plaintext[TEST_PLAINTEXT_SIZE] = { 0x9d, 0x57, 0xdb, 0x72, 0x13, 0x47, 0x10, 0x7d, 0x9f, 0xaf, 0x98, 0xbc, 0xc8, 0x76, 0x90, 0x84, 0x6d, 0x6c, 0xc7, 0xa1, 0x2a, 0xa9, 0x28, 0xb6, 0x21, 0x04, 0x13, 0x0c, 0x36, 0x90, 0x14, 0xeb, 0x87, 0xd1, 0xec, 0x68, 0x35, 0x78, 0x76, 0x66, 0x3d, 0x17, 0x63, 0xa3, 0xd2, 0x07, 0xf0, 0x92, 0x6f, 0xc8, 0x5b, 0x50, 0x9e, 0xf3, 0x07, 0xfb, 0x63, 0xe9, 0x9e, 0x5d, 0x49, 0x2b, 0xf9, 0x02, 0xa4, 0x8a, 0x32, 0xda, 0xb9, 0x9e, 0x3e, 0xdd, 0x7d, 0xba, 0x27, 0x49, 0x0d, 0x0f, 0xb9, 0xd0, 0x9e, 0x2b, 0xe6, 0xdc, 0xdb, 0x8d, 0xf5, 0xc2, 0x9f, 0x8e, 0x98, 0xf5, 0x92, 0x2b, 0x31, 0x26, 0x49, 0x70, 0xa2, 0x60, 0xfc, 0x8c, 0x65, 0xe2, 0x6d, 0xf0, 0x83, 0xdd, 0xd3, 0x91, 0xd4, 0x45, 0xf0, 0x42, 0xf3, 0xc5, 0xb9, 0x9c, 0xd9, 0x4c, 0xea, 0x1f, 0x1e, 0xf0, 0xfc, 0x74, 0x94, 0x09, 0x93, 0x0b, 0x6f, 0xaf, 0x16, 0x56, 0xc0, 0x91, 0x96, 0x5d, 0xb5, 0xe9, 0x25, 0x37, 0xca, 0xd8, 0xc5, 0x29, 0x25, 0x0b, 0x17, 0x72, 0x18, 0x4b, 0xc5, 0x40, 0x6a, 0x11, 0x57, 0xc0, 0x60, 0x36, 0xf4, 0x19, 0xec, 0x19, 0x8f, 0xaa, 0xbf, 0xeb, 0xdd, 0x5d, 0x58, 0xa2, 0xc5, 0x7b, 0x98, 0x0f, 0xb9, 0xf6, 0x57, 0x85, 0x18, 0x1d, 0x8e, 0x47, 0x3f, 0x8e, 0x12, 0xcb, 0xb2, 0x4c, 0xa4, 0x4a, 0x0c, 0xfc, 0xb8, 0x80, 0x65, 0x1b, 0x5b, 0x89, 0x17, 0x97, 0xfe, 0xbd, 0x4c, 0xfd, 0x70, 0x7c, 0x6d, 0xcb, 0xcb, 0xf1, 0x08, 0x17, 0xed, 0xde, 0xb0, 0x26, 0xcf, 0x99, 0x4e, 0x93, 0xd7, 0x2f, 0x83, 0x12, 0xa3, 0x64, 0x19, 0x45, 0x72, 0x61, 0x61, 0x9c, 0xc6, 0x1d, 0x74, 0xbd, 0xbb, 0x5d, 0xf8, 0x31, 0x21, 0x89, 0x97, 0x1e, 0x17, 0xf7, 0x07, 0x4e, 0x58, 0x29, 0x5c, 0xf2, 0x4b, 0xc8, 0x04, 0x7d, 0xc6, 0x2c, 0xa7, 0x8f, 0x84, 0x55, 0x70, 0x1c, 0x9c, 0xcd, 0x82, 0x1f, 0xc2, 0x51, 0xbb, 0x3b, 0x1b, 0xd4, 0x06, 0x41, 0x4f, 0x6c, 0x39, 0xc9, 0xcd, 0x55, 0x92, 0x90, 0x17, 0xa1, 0x9c, 0xf4, 0x05, 0xa7, 0xab, 0xf5, 0x8f, 0xb5, 0x36, 0x7d, 0xbc, 0xf1, 0x3b, 0xdd, 0xea, 0x6d, 0xc2, 0x24, 0x30, 0xca, 0xbb, 0x83, 0xea, 0x90, 0x9f, 0xb2, 0x9c, 0x49, 0xd5, 0x05, 0x84, 0x30, 0x71, 0x52, 0x4e, 0x54, 0xf7, 0x21, 0xdd, 0xda, 0xd8, 0xed, 0xec, 0x6c, 0x7f, 0xdf, 0xd9, 0x7e, 0xb0, 0xbd, 0x49, 0x90, 0x3b, 0xe6, 0xc5, 0x08, 0xfe, 0xef, 0x0b, 0x70, 0xc4, 0x68, 0xea, 0x54, 0x18, 0xc8, 0xd9, 0x99, 0x88, 0x30, 0x49, 0xe2, 0x04, 0xf7, 0xd2, 0xe8, 0x6f, 0x47, 0xe5, 0xc7, 0x34, 0x70, 0x86, 0xbf, 0x67, 0x3b, 0x3c, 0xeb, 0x07, 0xc5, 0xec, 0x78, 0x74, 0xf8, 0xcd, 0xa8, 0xe2, 0x60, 0xfc, 0x72, 0x4c, 0x36, 0xd7, 0xd7, 0xb7, 0x5b, 0x3f, 0x33, 0xce, 0x99, 0x62, 0x01, 0x80, 0x33, 0x4f, 0x85, 0xa6, 0x4f, 0xf4, 0xc0, 0xd8, 0x1c, 0xf6, 0x9f, 0x07, 0xd1, 0xa6, 0xaf, 0xb4, 0xbc, 0x10, 0xd6, 0x49, 0x5f, 0x4e, 0x68, 0x2a, 0xe8, 0xf1, 0x50, 0xd8, 0xbe, 0x35, 0xe6, 0x4c, 0x24, 0xc9, 0x5b, 0xa0, 0xe9, 0x14, 0x0f, 0xd9, 0x6c, 0x9d, 0x08, 0x3e, 0xd4, 0xb8, 0xe1, 0xfa, 0x01, 0x7b, 0xe5, 0x24, 0x13, 0x05, 0xee, 0x55, 0x8c, 0x3e, 0x66, 0xae, 0x28, 0x27, 0x4e, 0xc2, 0x3a, 0x0f, 0x43, 0x8e, 0x96, 0x7f, 0x2a, 0x20, 0x36, 0x21, 0x89, 0xd0, 0xe9, 0x0c, 0x25, 0x69, 0x18, 0x73, 0xc8, 0x74, 0x16, 0x84, 0xfb, 0x8c, 0x25, 0x8f, 0x2c, 0xd3, 0xe5, 0xdf, 0x4c, 0xba, 0x56, 0xb5, 0x9e, }; static const uint8_t test_ciphertext[TEST_PLAINTEXT_SIZE] = { 0xbb, 0x1c, 0xe2, 0xec, 0x37, 0x00, 0x50, 0x2e, 0x39, 0x43, 0xf1, 0xcf, 0x46, 0x2e, 0xba, 0x7b, 0x6f, 0x4d, 0xf1, 0xc9, 0x54, 0x15, 0x3a, 0x58, 0x7c, 0x33, 0x3c, 0xe8, 0xf5, 0xf2, 0x43, 0x33, 0x90, 0xd9, 0x02, 0xd1, 0xb5, 0xc4, 0x9b, 0x26, 0xfd, 0xee, 0xde, 0x56, 0x77, 0x3d, 0x41, 0x4f, 0x13, 0xfa, 0xc8, 0x4c, 0x7c, 0x20, 0x8c, 0x58, 0x31, 0x85, 0xf3, 0x32, 0x95, 0x38, 0x2e, 0x1b, 0x08, 0x71, 0x93, 0x8f, 0x0c, 0xd2, 0xbb, 0xdd, 0x2e, 0x72, 0xa9, 0x62, 0x7e, 0xc2, 0x8d, 0x99, 0xeb, 0x97, 0xbc, 0x5f, 0xa1, 0xe8, 0x2a, 0x3e, 0x9c, 0x4b, 0xe8, 0x50, 0x45, 0x54, 0x68, 0x45, 0x91, 0x0b, 0xef, 0x61, 0x29, 0x7f, 0x30, 0x94, 0x8c, 0xd7, 0x59, 0x06, 0xb5, 0xab, 0x61, 0xd4, 0xe2, 0xca, 0x75, 0xda, 0x23, 0xa2, 0x09, 0x98, 0xf3, 0x4d, 0xc3, 0x06, 0xe9, 0xb7, 0x96, 0xc0, 0x72, 0x74, 0xec, 0xb3, 0xd0, 0x30, 0xe0, 0x83, 0xe6, 0x13, 0xf1, 0x32, 0xe6, 0x63, 0xfa, 0x26, 0xb7, 0xd4, 0xb9, 0x11, 0x45, 0x60, 0x20, 0xb5, 0x11, 0x1a, 0xc8, 0x54, 0x1f, 0xab, 0x4f, 0x15, 0xec, 0x04, 0x0d, 0xfd, 0xbc, 0x85, 0x75, 0x81, 0xd5, 0x8b, 0x17, 0x84, 0x72, 0xdd, 0xf1, 0x50, 0x11, 0x90, 0x31, 0xa5, 0x26, 0x11, 0x15, 0xbd, 0x13, 0x53, 0x69, 0xa0, 0x66, 0xd3, 0x0c, 0x95, 0x28, 0xa2, 0xfa, 0xfb, 0x25, 0x07, 0xb7, 0xac, 0xa6, 0x2c, 0x05, 0xa0, 0xb9, 0xeb, 0xd4, 0x6e, 0x98, 0x1d, 0xeb, 0x23, 0x5d, 0xbc, 0x99, 0x3b, 0x31, 0x7d, 0x0b, 0x26, 0xf3, 0x26, 0x45, 0x64, 0xd7, 0x1e, 0x96, 0x48, 0xc5, 0x91, 0xe7, 0x49, 0xd6, 0x74, 0x2c, 0xfd, 0x3a, 0xd7, 0x04, 0xa8, 0x9a, 0x54, 0x69, 0xbb, 0x09, 0x2f, 0x77, 0x77, 0xba, 0x32, 0x9a, 0x01, 0x91, 0x98, 0x31, 0x8d, 0xa4, 0x41, 0xc4, 0x65, 0x58, 0x39, 0x7a, 0x24, 0x5b, 0x82, 0x4b, 0x31, 0xa3, 0xef, 0x6c, 0x87, 0xf1, 0xda, 0xb5, 0x26, 0xf2, 0xfd, 0xd2, 0x97, 0xe6, 0x46, 0xad, 0x49, 0x69, 0x18, 0x36, 0xdf, 0x7d, 0xba, 0x46, 0x1d, 0x70, 0xbc, 0x62, 0x3f, 0x5e, 0x7c, 0xae, 0x17, 0xd9, 0x11, 0x9d, 0x1d, 0xe2, 0x29, 0x56, 0x97, 0x5f, 0xfc, 0x02, 0xbf, 0x30, 0x3a, 0x1c, 0x56, 0x08, 0xbd, 0xae, 0x9d, 0xa7, 0x41, 0xca, 0x41, 0xed, 0x34, 0xd1, 0x1e, 0x1b, 0xca, 0x5e, 0x06, 0x41, 0x6b, 0x29, 0x5f, 0xc9, 0x4d, 0x78, 0xd4, 0x0d, 0xc6, 0x9c, 0xbc, 0xc0, 0xf0, 0x3f, 0x87, 0x7d, 0x27, 0xfb, 0x10, 0xb9, 0xbf, 0x55, 0x65, 0x5f, 0x73, 0xcc, 0x82, 0x6d, 0x65, 0xad, 0xfb, 0x12, 0xcd, 0x66, 0x7e, 0xfb, 0x54, 0x2e, 0x94, 0x53, 0xd7, 0xa9, 0x43, 0x2d, 0x78, 0xf8, 0xc9, 0x92, 0x11, 0x6b, 0x09, 0x5a, 0x5c, 0x78, 0x85, 0xc0, 0x20, 0x6a, 0x9e, 0xda, 0x05, 0xcb, 0xbb, 0x27, 0xc8, 0xdd, 0xbf, 0x76, 0x70, 0x67, 0xcf, 0x19, 0x44, 0x75, 0xdd, 0x57, 0x60, 0xb3, 0xc9, 0xdb, 0xcf, 0x8e, 0x2f, 0x14, 0x32, 0xdd, 0x03, 0x90, 0xb5, 0xe4, 0x35, 0x97, 0x38, 0xbe, 0x68, 0x88, 0xf5, 0x8e, 0xfe, 0x22, 0x58, 0x4e, 0x19, 0xcf, 0xcd, 0xd2, 0xab, 0x2e, 0x89, 0x63, 0xb5, 0x7e, 0x5d, 0x14, 0x0b, 0x58, 0x24, 0x85, 0xe1, 0x6f, 0x50, 0x1b, 0x61, 0x73, 0xf0, 0x3d, 0xc0, 0x1b, 0xe2, 0xfe, 0xaf, 0x1a, 0x72, 0x12, 0x8c, 0x64, 0xda, 0x1a, 0xbd, 0x1f, 0x4c, 0xab, 0xa0, 0xa5, 0x64, 0xbd, 0x83, 0xc1, 0xee, 0x4c, 0x73, 0x3b, 0xf0, 0x53, 0xa5, 0xc4, 0x4f, 0xbd, 0x1a, 0x12, 0x2d, 0x67, 0xd4, 0x34, 0x5a, 0x4c, 0x3e, }; static const uint8_t test_encrypted_header[12] = { 0x44, 0x87, 0x7d, 0x06, 0x52, 0xbd, 0x2d, 0x09, 0xbc, 0x4f, 0x1e, 0xe2, }; #endif libzc-0.4.1/yazc/000077500000000000000000000000001331702632000135625ustar00rootroot00000000000000libzc-0.4.1/yazc/.gitignore000066400000000000000000000000231331702632000155450ustar00rootroot00000000000000yazc .deps/ .libs/ libzc-0.4.1/yazc/Makefile.am000066400000000000000000000017461331702632000156260ustar00rootroot00000000000000# Copyright (C) 2012-2018 Marc Ferland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . bin_PROGRAMS = yazc yazc_SOURCES = \ yazc.c \ yazc-bruteforce.c \ yazc-dictionary.c \ yazc-plaintext.c \ yazc-info.c \ yazc.h yazc_CFLAGS = $(AM_CFLAGS) -Wall -Wextra -I$(top_srcdir)/lib yazc_LDADD = $(top_builddir)/lib/libzc.la dist_man_MANS = yazc.1 docdir = $(datadir)/doc/yazc doc_DATA = $(top_srcdir)/README.md libzc-0.4.1/yazc/yazc-bruteforce.c000066400000000000000000000161401331702632000170340ustar00rootroot00000000000000/* * yazc - Yet Another Zip Cracker * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include "yazc.h" #include "libzc.h" #define PW_LEN_DEFAULT 8 #define PWSET_LOWER 1 #define PWSET_UPPER (1 << 1) #define PWSET_NUMB (1 << 2) #define PWSET_SPEC (1 << 3) static const char *filename; static struct zc_crk_pwcfg pwcfg; static long thread_count; static bool stats = false; struct charset { const char *set; int len; }; static const struct charset lowercase_set = { .set = "abcdefghijklmnopqrstuvwxyz", .len = 26, }; static const struct charset uppercase_set = { .set = "ABCDEFGHIJKLMNOPQRSTUVWXYZ", .len = 26 }; static const struct charset number_set = { .set = "0123456789", .len = 10 }; static const struct charset special_set = { .set = " !\"#$%&'()*+,-./:;<=>?`[~]^_{|}", .len = 32 }; static const char short_opts[] = "c:i:l:aAnsSt:h"; static const struct option long_opts[] = { {"charset", required_argument, 0, 'c'}, {"initial", required_argument, 0, 'i'}, {"length", required_argument, 0, 'l'}, {"alpha", no_argument, 0, 'a'}, {"alpha-caps", no_argument, 0, 'A'}, {"numeric", no_argument, 0, 'n'}, {"special", no_argument, 0, 's'}, {"threads", required_argument, 0, 't'}, {"stats", no_argument, 0, 'S'}, {"help", no_argument, 0, 'h'}, {NULL, 0, 0, 0} }; static void print_help(const char *name) { fprintf(stderr, "Usage:\n" "\t%s [options] filename\n" "\n" "The '%s' subcommand tests every password combination until the\n" "right one is found.\n" "\n" "Options:\n" "\t-c, --charset=CHARSET use character set CHARSET\n" "\t-i, --initial=STRING initial password\n" "\t-l, --length=NUM maximum password length\n" "\t-a, --alpha use characters [a-z]\n" "\t-A, --alpha-caps use characters [A-Z]\n" "\t-n, --numeric use characters [0-9]\n" "\t-s, --special use special characters\n" "\t-t, --threads=NUM spawn NUM threads\n" "\t-S, --stats print statistics\n" "\t-h, --help show this help\n", name, name); } static char *make_charset(int flags, char *buf, size_t buflen) { size_t len = 0; if (flags & PWSET_LOWER) len += lowercase_set.len; if (flags & PWSET_UPPER) len += uppercase_set.len; if (flags & PWSET_NUMB) len += number_set.len; if (flags & PWSET_SPEC) len += special_set.len; if (len > buflen) return NULL; memset(buf, 0, buflen); if (flags & PWSET_LOWER) strncat(buf, lowercase_set.set, buflen - strlen(buf) - 1); if (flags & PWSET_UPPER) strncat(buf, uppercase_set.set, buflen - strlen(buf) - 1); if (flags & PWSET_NUMB) strncat(buf, number_set.set, buflen - strlen(buf) - 1); if (flags & PWSET_SPEC) strncat(buf, special_set.set, buflen - strlen(buf) - 1); return buf; } static int launch_crack(void) { struct zc_ctx *ctx; struct zc_crk_bforce *crk; char pw[ZC_PW_MAXLEN + 1]; struct timeval begin, end; int err = -1; if (zc_new(&ctx)) { yazc_err("zc_new() failed!\n"); return EXIT_FAILURE; } if (zc_crk_bforce_new(ctx, &crk)) { yazc_err("zc_crk_bforce_new() failed!\n"); goto err1; } if (zc_crk_bforce_init(crk, filename, &pwcfg)) { yazc_err("zc_crk_bforce_init() failed!\n"); goto err2; } zc_crk_bforce_force_threads(crk, thread_count); if (stats) { if (thread_count == -1) puts("Worker threads: auto"); else printf("Worker threads: %ld\n", thread_count); printf("Maximum length: %zu\n", pwcfg.maxlen); printf("Character set: %s\n", zc_crk_bforce_sanitized_charset(crk)); printf("Filename: %s\n", filename); } gettimeofday(&begin, NULL); err = zc_crk_bforce_start(crk, pw, sizeof(pw)); gettimeofday(&end, NULL); if (stats) printf("Runtime: %f secs.\n", (double)(end.tv_usec - begin.tv_usec) / 1000000 + (double)(end.tv_sec - begin.tv_sec)); if (err > 0) printf("Password not found\n"); else if (err == 0) printf("Password is: %s\n", pw); else yazc_err("zc_crk_bforce_start failed!\n"); err2: zc_crk_bforce_unref(crk); err1: zc_unref(ctx); return err; } static int do_bruteforce(int argc, char *argv[]) { const char *arg_set = NULL; const char *arg_initial = NULL; const char *arg_threads = NULL; const char *arg_maxlen = NULL; int arg_charset_flag = 0; for (;;) { int c; int idx; c = getopt_long(argc, argv, short_opts, long_opts, &idx); if (c == -1) break; switch (c) { case 'c': arg_set = optarg; break; case 'i': arg_initial = optarg; break; case 'l': arg_maxlen = optarg; break; case 'a': arg_charset_flag |= PWSET_LOWER; break; case 'A': arg_charset_flag |= PWSET_UPPER; break; case 'n': arg_charset_flag |= PWSET_NUMB; break; case 's': arg_charset_flag |= PWSET_SPEC; break; case 't': arg_threads = optarg; break; case 'S': stats = true; break; case 'h': print_help(basename(argv[0])); return EXIT_SUCCESS; default: yazc_err("unexpected getopt_long() value '%c'.\n", c); return EXIT_FAILURE; } } if (optind >= argc) { yazc_err("missing filename.\n"); return EXIT_FAILURE; } filename = argv[optind]; /* password stop length */ if (arg_maxlen) { pwcfg.maxlen = atoi(arg_maxlen); if (pwcfg.maxlen < ZC_PW_MINLEN || pwcfg.maxlen > ZC_PW_MAXLEN) { yazc_err("maximum password length must be between %d and %d.\n", ZC_PW_MINLEN, ZC_PW_MAXLEN); return EXIT_FAILURE; } } else pwcfg.maxlen = PW_LEN_DEFAULT; /* number of concurrent threads */ if (arg_threads) { thread_count = atol(arg_threads); if (thread_count < 1) { yazc_err("number of threads can't be less than one.\n"); return EXIT_FAILURE; } } else thread_count = -1; /* auto */ /* character set */ if (!arg_set) { if (!arg_charset_flag) { yazc_err("no character set provided or specified.\n"); return EXIT_FAILURE; } char *tmp = make_charset(arg_charset_flag, pwcfg.set, ZC_CHARSET_MAXLEN); if (!tmp) { yazc_err("generating character set failed.\n"); return EXIT_FAILURE; } } else strncpy(pwcfg.set, arg_set, ZC_CHARSET_MAXLEN); /* character set length */ pwcfg.setlen = strnlen(pwcfg.set, ZC_CHARSET_MAXLEN); /* initial password */ if (arg_initial) strncpy(pwcfg.initial, arg_initial, ZC_PW_MAXLEN); else memset(pwcfg.initial, 0, ZC_PW_MAXLEN); return launch_crack(); } const struct yazc_cmd yazc_cmd_bruteforce = { .name = "bruteforce", .cmd = do_bruteforce, .help = "bruteforce password cracker", }; libzc-0.4.1/yazc/yazc-dictionary.c000066400000000000000000000055351331702632000170470ustar00rootroot00000000000000/* * yazc - Yet Another Zip Cracker * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "yazc.h" #include "libzc.h" static const char short_opts[] = "d:h"; static const struct option long_opts[] = { {"dictionary", required_argument, 0, 'd'}, {"help", no_argument, 0, 'h'}, {NULL, 0, 0, 0} }; static void print_help(const char *cmdname) { fprintf(stderr, "Usage:\n" "\t%s [options] filename\n" "Options:\n" "\t-d, --dictionary=FILE read passwords from FILE\n" "\t-h, --help show this help\n", cmdname); } static int launch_crack(const char *dict_filename, const char *zip_filename) { struct zc_ctx *ctx; struct zc_crk_dict *crk; char pw[ZC_PW_MAXLEN + 1]; int err = -1; if (zc_new(&ctx)) { yazc_err("zc_new() failed!\n"); return -1; } if (zc_crk_dict_new(ctx, &crk)) { yazc_err("zc_crk_dict_new() failed!\n"); goto err1; } if (zc_crk_dict_init(crk, zip_filename)) { yazc_err("zc_crk_dict_init() failed!\n"); goto err2; } err = zc_crk_dict_start(crk, dict_filename, pw, sizeof(pw)); if (err > 0) printf("Password not found\n"); else if (err == 0) printf("Password is: %s\n", pw); else yazc_err("zc_crk_dict_start failed!\n"); err2: zc_crk_dict_unref(crk); err1: zc_unref(ctx); return err; } static int do_dictionary(int argc, char *argv[]) { const char *dict_filename = NULL; const char *zip_filename = NULL; int err; for (;;) { int c; int idx; c = getopt_long(argc, argv, short_opts, long_opts, &idx); if (c == -1) break; switch (c) { case 'd': dict_filename = optarg; break; case 'h': print_help(basename(argv[0])); return EXIT_SUCCESS; default: yazc_err("unexpected getopt_long() value '%c'.\n", c); return EXIT_FAILURE; } } if (optind >= argc) { yazc_err("missing filename.\n"); return EXIT_FAILURE; } zip_filename = argv[optind]; printf("Dictionary file: %s\n", !dict_filename ? "stdin" : dict_filename); printf("Filename: %s\n", zip_filename); err = launch_crack(dict_filename, zip_filename); return err; } const struct yazc_cmd yazc_cmd_dictionary = { .name = "dictionary", .cmd = do_dictionary, .help = "dictionary password cracker", }; libzc-0.4.1/yazc/yazc-info.c000066400000000000000000000105751331702632000156350ustar00rootroot00000000000000/* * yazc - Yet Another Zip Cracker * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include "yazc.h" #include "libzc.h" #define MAX(a, b) (( a > b) ? a : b) static const char short_opts[] = "h"; static const struct option long_opts[] = { {"help", no_argument, 0, 'h'}, {NULL, 0, 0, 0} }; struct zc_ctx *ctx; static void print_help(const char *cmdname) { fprintf(stderr, "Usage:\n" "\t%s [options] filename\n" "Options:\n" "\t-h, --help show this help\n", cmdname); } static int do_info(int argc, char *argv[]) { const char *filename; struct zc_file *file; struct zc_info *info; int err = EXIT_SUCCESS, c, idx; c = getopt_long(argc, argv, short_opts, long_opts, &idx); if (c != -1) { switch (c) { case 'h': print_help(basename(argv[0])); return EXIT_SUCCESS; default: yazc_err("unexpected getopt_long() value '%c'.\n", c); return EXIT_FAILURE; } } if (optind >= argc) { yazc_err("missing filename.\n"); return EXIT_FAILURE; } filename = argv[optind]; if (zc_new(&ctx)) { yazc_err("zc_new() failed!\n"); return EXIT_FAILURE; } if (zc_file_new_from_filename(ctx, filename, &file)) { yazc_err("zc_file_new_from_filename() failed!\n"); err = EXIT_FAILURE; goto err1; } if (zc_file_open(file)) { yazc_err("zc_file_open() failed!\n"); err = EXIT_FAILURE; goto err2; } size_t fn_max_len = 0, crypt_max_len = 0, offset_begin_max_len = 0, offset_end_max_len = 0, size_max_len = 0; info = zc_file_info_next(file, NULL); while (info) { char buf[256]; /* filename */ size_t tmp1 = strlen(zc_file_info_name(info)); if (tmp1 > fn_max_len) fn_max_len = tmp1; /* encrypted header */ snprintf(buf, sizeof(buf), "%li", zc_file_info_crypt_header_offset(info)); tmp1 = strlen(buf); if (tmp1 > crypt_max_len) crypt_max_len = tmp1; /* offset begin */ snprintf(buf, sizeof(buf), "%li", zc_file_info_offset(info)); tmp1 = strlen(buf); if (tmp1 > offset_begin_max_len) offset_begin_max_len = tmp1; /* offset end */ snprintf(buf, sizeof(buf), "%li", zc_file_info_offset(info) + zc_file_info_size(info)); tmp1 = strlen(buf); if (tmp1 > offset_end_max_len) offset_end_max_len = tmp1; /* size */ snprintf(buf, sizeof(buf), "%u", zc_file_info_size(info)); tmp1 = strlen(buf); if (tmp1 > size_max_len) size_max_len = tmp1; info = zc_file_info_next(file, info); } printf("%-5s %*s %*s %*s %-24s\n", "INDEX", (int)(-MAX(fn_max_len, 8)), "NAME", (int)(-(crypt_max_len + offset_begin_max_len + offset_end_max_len + 2)), "OFFSETS", (int)(-size_max_len), "SIZE", "ENCRYPTED HEADER"); info = zc_file_info_next(file, NULL); while (info) { const uint8_t *ehdr = zc_file_info_enc_header(info); printf("%5d %*s %*li %*li %*li %*u %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", zc_file_info_idx(info), (int)(-MAX(fn_max_len, 8)), zc_file_info_name(info), (int)(-crypt_max_len), zc_file_info_crypt_header_offset(info), (int)(-offset_begin_max_len), zc_file_info_offset(info), (int)(-offset_end_max_len), zc_file_info_offset(info) + zc_file_info_size(info), (int)(-size_max_len), zc_file_info_size(info), ehdr[0], ehdr[1], ehdr[2], ehdr[3], ehdr[4], ehdr[5], ehdr[6], ehdr[7], ehdr[8], ehdr[9], ehdr[10], ehdr[11]); info = zc_file_info_next(file, info); } zc_file_close(file); err2: zc_file_unref(file); err1: zc_unref(ctx); return err; } const struct yazc_cmd yazc_cmd_info = { .name = "info", .cmd = do_info, .help = "print zip file content info", }; libzc-0.4.1/yazc/yazc-plaintext.c000066400000000000000000000215371331702632000167120ustar00rootroot00000000000000/* * yazc - Yet Another Zip Cracker * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "yazc.h" #include "libzc.h" static const char short_opts[] = "t:h"; static const struct option long_opts[] = { {"threads", required_argument, 0, 't'}, {"help", no_argument, 0, 'h'}, {NULL, 0, 0, 0} }; static struct zc_ctx *ctx; struct filed { const char *name; /* file name */ int fd; /* file descriptor */ off_t txt_begin; /* begin offset of the plain or cipher text */ off_t txt_end; /* end offset of the plain or cipher text */ off_t file_begin; /* offset of the first byte for the file we are using in the encrypted archive */ void *map; }; static struct filed cipher = {NULL, 0, 0, 0, -1, NULL}; static struct filed plain = {NULL, 0, 0, 0, -1, NULL}; static long thread_count; static void print_help(const char *name) { fprintf(stderr, "Usage:\n" "\t%s [options] PLAIN:OFF1:OFF2 CIPHER:OFF1:OFF2:BEGIN\n" "\n" "The plaintext subcommand uses a known vulnerability in the pkzip\n" "stream cipher to find the internal representation of the encryption\n" "key. To use this attack type you need at least 13 known plaintext\n" "bytes from any file in the archive.\n" "\n" "Example:\n" "\t %s plain.bin:100:650 archive.zip:112:662:64\n" "\n" "Use plaintext bytes 100 to 650 and map them to ciphertext bytes\n" "112 to 662. Use these bytes to reduce the number of keys and perform\n" "the attack. Once the intermediate key is found, decrypt the rest of\n" "the cipher (begins at offset 64) to get the internal representation.\n" "\n" "Options:\n" "\t-t, --threads=NUM spawn NUM threads\n" "\t-h, --help show this help\n", name, name); } static int parse_offset(const char *tok, off_t *offset) { char *endptr; long int val = strtol(tok, &endptr, 0); if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || (errno != 0 && val == 0)) return -1; if (endptr == tok) return -1; if (val < 0) return -1; *offset = val; return 0; } static int parse_opt(char *opt, int count, const char **filename, off_t *off1, off_t *off2, off_t *off3) { char *saveptr = NULL, *token; int err = -1; if (!opt) return -1; token = strtok_r(opt, ":", &saveptr); if (!token) return -1; *filename = token; for (int i = 0; i < count; ++i) { token = strtok_r(NULL, ":", &saveptr); if (!token) return -1; switch (i) { case 0: err = parse_offset(token, off1); break; case 1: err = parse_offset(token, off2); break; case 2: err = parse_offset(token, off3); break; } if (err) return -1; } return 0; } static bool validate_offsets() { if (plain.txt_begin >= plain.txt_end || cipher.txt_begin >= cipher.txt_end) return false; if (plain.txt_end - plain.txt_begin < 13 || cipher.txt_end - cipher.txt_begin < 13) return false; if (plain.txt_end - plain.txt_begin != cipher.txt_end - cipher.txt_begin) return false; if (cipher.file_begin > cipher.txt_begin) return false; if (cipher.txt_begin - cipher.file_begin < 12) return false; return true; } static off_t offset_in_file(const struct filed *file) { return file->file_begin == -1 ? file->txt_begin : file->file_begin; } static size_t size_of_map(const struct filed *file) { return file->txt_end - offset_in_file(file) + 1; } static int mmap_text_buf(struct filed *file) { int fd; void *map; struct stat filestat; fd = open(file->name, O_RDONLY); if (fd < 0) { yazc_err("open() failed: %s.\n", strerror(errno)); return -1; } if (fstat(fd, &filestat) < 0) { yazc_err("fstat() failed: %s.\n", strerror(errno)); goto error; } if (filestat.st_size == 0) { yazc_err("file %s is empty.\n", file->name); goto error; } map = mmap(NULL, filestat.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if (map == MAP_FAILED) { yazc_err("mmap() failed: %s.\n", strerror(errno)); goto error; } file->fd = fd; file->map = map; return 0; error: if (close(fd)) yazc_err("close() failed: %s\n", strerror(errno)); return -1; } static int unmap_text_buf(struct filed *file) { if (munmap(file->map, size_of_map(file)) < 0) yazc_err("munmap() failed: %s.\n", strerror(errno)); if (close(file->fd)) yazc_err("close() failed: %s.\n", strerror(errno)); return 0; } static int do_plaintext(int argc, char *argv[]) { const char *arg_threads = NULL; struct zc_crk_ptext *ptext; int err = 0; for (;;) { int c, idx; c = getopt_long(argc, argv, short_opts, long_opts, &idx); if (c == -1) break; switch (c) { case 't': arg_threads = optarg; break; case 'h': print_help(basename(argv[0])); return EXIT_SUCCESS; default: yazc_err("unexpected getopt_long() value '%c'.\n", c); return EXIT_FAILURE; } } if (optind >= argc) { yazc_err("missing arguments.\n"); print_help(basename(argv[0])); return EXIT_FAILURE; } /* number of concurrent threads */ if (arg_threads) { thread_count = atol(arg_threads); if (thread_count < 1) { yazc_err("number of threads can't be less than one.\n"); return EXIT_FAILURE; } } else thread_count = -1; /* auto */ if (parse_opt(argv[optind], 2, &plain.name, &plain.txt_begin, &plain.txt_end, NULL) < 0) { yazc_err("parsing plaintext file offsets failed.\n"); return EXIT_FAILURE; } if (parse_opt(argv[optind + 1], 3, &cipher.name, &cipher.txt_begin, &cipher.txt_end, &cipher.file_begin) < 0) { yazc_err("parsing cipher file offsets failed.\n"); return EXIT_FAILURE; } if (!validate_offsets()) { yazc_err("offsets validation failed.\n"); return EXIT_FAILURE; } if (mmap_text_buf(&plain) < 0) { yazc_err("mapping plaintext data failed.\n"); return EXIT_FAILURE; } if (mmap_text_buf(&cipher) < 0) { yazc_err("mapping ciphertext data failed.\n"); goto error1; } zc_new(&ctx); if (!ctx) { yazc_err("zc_new() failed!\n"); goto error2; } err = zc_crk_ptext_new(ctx, &ptext); if (err < 0) { yazc_err("zc_crk_ptext_new() failed!\n"); goto error3; } err = zc_crk_ptext_set_text(ptext, &((const uint8_t *)plain.map)[plain.txt_begin], &((const uint8_t *)cipher.map)[cipher.txt_begin], size_of_map(&plain)); if (err < 0) { yazc_err("zc_crk_ptext_set_text() failed!\n"); goto error4; } zc_crk_ptext_force_threads(ptext, thread_count); printf("Key2 reduction..."); fflush(stdout); err = zc_crk_ptext_key2_reduction(ptext); if (err < 0) { printf("\n"); yazc_err("reducing key2 candidates failed.\n"); goto error4; } printf(" done! %zu keys found.\n", zc_crk_ptext_key2_count(ptext)); printf("Attack running..."); fflush(stdout); struct zc_key out_key; err = zc_crk_ptext_attack(ptext, &out_key); if (err < 0) { printf("\n"); yazc_err("attack failed! Wrong plaintext?\n"); goto error4; } printf(" done!\n"); printf("Intermediate key: 0x%x 0x%x 0x%x\n", out_key.key0, out_key.key1, out_key.key2); struct zc_key int_rep; err = zc_crk_ptext_find_internal_rep(&out_key, &((const uint8_t *)cipher.map)[cipher.file_begin], cipher.txt_begin - cipher.file_begin, &int_rep); if (err < 0) { yazc_err("finding internal representation failed.\n"); goto error4; } printf("Internal key representation: 0x%x 0x%x 0x%x\n", int_rep.key0, int_rep.key1, int_rep.key2); printf("Recovering original password..."); fflush(stdout); char pw[14]; err = zc_crk_ptext_find_password(ptext, &int_rep, pw, sizeof(pw)); if (err < 0) { yazc_err(" failed!\n"); err = EXIT_FAILURE; goto error4; } printf("\nOriginal password: "); for (int i = 0; i < err; ++i) { if (isprint(pw[i])) printf("%c ", pw[i]); else printf("0x%x ", pw[i]); } printf("\n"); err = EXIT_SUCCESS; error4: zc_crk_ptext_unref(ptext); error3: zc_unref(ctx); error2: unmap_text_buf(&cipher); error1: unmap_text_buf(&plain); return err; } const struct yazc_cmd yazc_cmd_plaintext = { .name = "plaintext", .cmd = do_plaintext, .help = "plaintext attack", }; libzc-0.4.1/yazc/yazc.1000066400000000000000000000105611331702632000146150ustar00rootroot00000000000000.\" Copyright (C) 2012-2018 Marc Ferland .\" .\" This program is free software: you can redistribute it and/or modify .\" it under the terms of the GNU General Public License as published by .\" the Free Software Foundation, either version 3 of the License, or .\" (at your option) any later version. .\" .\" This program is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public License .\" along with this program. If not, see . .\" Process this file with .\" groff -man -Tascii yazc.1 .\" .TH YAZC 1 .SH NAME yazc \- yet another zip cracker .SH SYNOPSIS .\" set vertical line break space to 0 .PD 0 .B yazc\fR [\fB\-h\fR] [\fB\-V\fR] .PP .B yazc .I COMMAND OPTIONS\fR... \fIFILE .PD 1 .SH DESCRIPTION .B yazc cracks password protected zip files. Three attack methods are supported: \fIbruteforce\fR, \fIdictionary\fR and \fIplaintext\fR. .PP Note: Only files encrypted using the legacy Pkware encryption method are supported. .PP .SH BRUTEFORCE The \fIbruteforce\fR command tries every possible character combination. A general rule of thumb is to use this command when you suspect the password to be 8 characters or less. .TP .BR \-c ", " \-\-charset=\fICHARSET\fR Set the character set to CHARSET. .TP .BR \-i ", " \-\-initial=\fISTRING\fR Set the initial password to STRING. .TP .BR \-l ", " \-\-length=\fINUM\fR Set the maximum password length to LENGTH characters. .TP .BR \-a ", " \-\-alpha Use characters [a-z]. .TP .BR \-A ", " \-\-alpha-caps Use characters [A-Z]. .TP .BR \-n ", " \-\-numeric Use characters [0-9]. .TP .BR \-s ", " \-\-special Use special characters "!:$%&/()=?{[]}+-*~#@|;". .TP .BR \-t ", " \-\-threads=\fINUM\fR Distribute load to NUM threads. For maximum performance, this should be set to the number of logical processors available. .TP .BR \-h ", " \-\-help Display help and exit. .SH DICTIONARY The \fIdictionary\fR command reads passwords from a text file (or stdin if no file argument is provided). It is assumed that each password is separated by a newline. .TP .BR \-d ", " \-\-dictionary=\fIFILE\fR Read passwords from FILE. .TP .BR \-h ", " \-\-help Display help and exit. .SH PLAINTEXT The \fIplaintext\fR command uses a known vulnerability in the pkzip stream cipher to find the internal representation of the encryption key. To use this attack type, you need at least 13 known plaintext bytes from any file in the archive. Generally, this means that you need to obtain at least 13 bytes of the \fBcompressed\fR stream before it was encrypted. .PP The \fIplaintext\fR command expects two file arguments along with the corresponding offsets separated by colons. The first file argument is the plaintext filename and offsets: .PP .RS PLAINTEXT:BEGIN:END .RE .PP The second file argument is the encrypted archive filename and offsets (this time including the offset of the first byte of the cipher): .PP .RS CIPHERTEXT:BEGIN:END:CIPHER_BEGIN .RE .SH INFO The \fIinfo\fR command lists the filenames, offsets and the encryption header for each file in the archive. This is useful to determine what configuration to pass to the \fIplaintext\fR command. .SH EXAMPLES Use a \fIbruteforce\fR attack on file archive.zip using only lower case letters and distribute the load to 8 threads: .PP .nf .RS yazc bruteforce -a -t8 archive.zip .RE .fi .PP Use a \fIdictionary\fR attack on file archive.zip and use passwords from rockyou.txt: .PP .nf .RS cat rockyou.txt | yazc dictionary archive.zip .RE .fi .PP Use a \fIplaintext\fR attack on archive.zip. Take plaintext bytes 100 to 650 and map them to ciphertext bytes 112 to 662. Use these bytes to reduce the number of keys and perform the attack. Once the intermediate key is found, decrypt the rest of the cipher (begins at offset 64) to get the internal representation (the encryption key derived from the password). If possible the actual (or equivalent) password will also be recovered and printed. .PP .nf .RS yazc plaintext plain.bin:100:650 archive.zip:112:662:64 .RE .fi .SH AUTHOR Marc Ferland .PP Part of this software was inspired by fcrackzip by Marc Lehmann and pkcrack by Peter Conrad. The original plaintext algorithm was developed by Eli Biham and Paul C. Kocher. libzc-0.4.1/yazc/yazc.c000066400000000000000000000070121331702632000146740ustar00rootroot00000000000000/* * yazc - Yet Another Zip Cracker * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include "yazc.h" #include "config.h" #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) static const char options_s[] = "+hV"; static const struct option options[] = { {"help", no_argument, NULL, 'h' }, {"version", no_argument, NULL, 'V' }, {NULL, 0, 0, 0} }; static const struct yazc_cmd yazc_cmd_help; static const struct yazc_cmd *yazc_cmds[] = { &yazc_cmd_help, &yazc_cmd_bruteforce, &yazc_cmd_dictionary, &yazc_cmd_plaintext, &yazc_cmd_info, }; static int help(int UNUSED(argc), char *argv[]) { size_t i; printf("yazc - Crack password protected zip files\n" "Usage:\n" "\t%s command [command_options]\n\n" "Options:\n" "\t-V, --version show version\n" "\t-h, --help show this help\n\n" "Commands:\n", basename(argv[0])); for (i = 0; i < ARRAY_SIZE(yazc_cmds); ++i) { if (yazc_cmds[i]->help) printf(" %-12s %s\n", yazc_cmds[i]->name, yazc_cmds[i]->help); } return EXIT_SUCCESS; } static void print_version() { fprintf(stderr, "yazc " PACKAGE_VERSION "\n" "Copyright (C) 2012-2018 Marc Ferland\n" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" "Report bugs to: "PACKAGE_BUGREPORT"\n"); } static const struct yazc_cmd yazc_cmd_help = { .name = "help", .cmd = help, .help = "Show help message", }; void yazc_log(const char *UNUSED(file), int UNUSED(line), const char *fn, const char *format, ...) { va_list args; va_start(args, format); fprintf(stderr, "yazc: %s: ", fn); vfprintf(stderr, format, args); va_end(args); } void yazc_err(const char *format, ...) { va_list args; va_start(args, format); fprintf(stderr, "Error: "); vfprintf(stderr, format, args); va_end(args); } int main(int argc, char *argv[]) { const char *cmd; bool found = false; size_t i; for (;;) { int c; c = getopt_long(argc, argv, options_s, options, NULL); if (c == -1) break; switch (c) { case 'h': help(argc, argv); return EXIT_SUCCESS; case 'V': print_version(); return EXIT_SUCCESS; case '?': return EXIT_FAILURE; default: yazc_err("unexpected getopt_long() value '%c'.\n", c); return EXIT_FAILURE; } } if (optind >= argc) { yazc_err("missing command.\n"); goto fail; } cmd = argv[optind]; for (i = 0; i < ARRAY_SIZE(yazc_cmds); i++) { if (strcmp(yazc_cmds[i]->name, cmd) != 0) continue; found = true; break; } if (!found) { yazc_err("invalid command '%s'.\n", cmd); goto fail; } return yazc_cmds[i]->cmd(--argc, ++argv); fail: help(argc, argv); return EXIT_FAILURE; } libzc-0.4.1/yazc/yazc.h000066400000000000000000000033171331702632000147050ustar00rootroot00000000000000/* * yazc - Yet Another Zip Cracker * Copyright (C) 2012-2018 Marc Ferland * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _YAZC_H_ #define _YAZC_H_ #include #include "libzc.h" struct yazc_cmd { const char *name; int (*cmd)(int argc, char *argv[]); const char *help; }; #define fatal(arg...) \ do { \ yazc_log(__FILE__, __LINE__, __FUNCTION__, ## arg); \ exit(EXIT_FAILURE); \ } while (0) #ifdef __GNUC__ # define UNUSED(x) UNUSED_ ## x __attribute__((__unused__)) #else # define UNUSED(x) UNUSED_ ## x #endif void yazc_log(const char *file, int line, const char *fn, const char *format, ...) __attribute__((format(printf, 4, 5))); void yazc_err(const char *format, ...) __attribute__((format(printf, 1, 2))); extern const struct yazc_cmd yazc_cmd_bruteforce; extern const struct yazc_cmd yazc_cmd_dictionary; extern const struct yazc_cmd yazc_cmd_plaintext; extern const struct yazc_cmd yazc_cmd_info; #endif /* _YAZC_H_ */