pax_global_header00006660000000000000000000000064135365746720014534gustar00rootroot0000000000000052 comment=43c09e94bc05e8699fdc624ac51b4e49b98d20bb snek-1.1/000077500000000000000000000000001353657467200123355ustar00rootroot00000000000000snek-1.1/.gitignore000066400000000000000000000001071353657467200143230ustar00rootroot00000000000000TAGS snek-builtin.h snek-gram.h snek.pc **/*.o **/*.pyc **/__pycache__ snek-1.1/CODE_OF_CONDUCT.md000066400000000000000000000064521353657467200151430ustar00rootroot00000000000000# Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at conduct@keithp.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq snek-1.1/CONTRIBUTING.md000066400000000000000000000055701353657467200145750ustar00rootroot00000000000000# Contributing to Snek We welcome contributions of all forms, including patches to code and documentation, issue reports, or just kind words. ## Getting Current Source Code Snek sources are maintained in git and hosted in two places. 1. [keithp.com](https://keithp.com/cgit/snek.git/). This is the 'canonical' source location. 2. [github](https://github.com/keith-packard/snek). This should exactly mirror the code at keithp.com. I've placed it here to make contributing to Snek easier for people familiar with github. You can create a local copy of the repository with git clone: $ git clone git://keithp.com/git/snek.git or $ git clone https://github.com/keith-packard/snek.git ## Lola The only non-standard tool used to build Snek is “lola”, which is a custom LL parser generator designed to construct compact parse tables for simple languages, like Snek. That's also available on both keithp.com and github: 1. [keithp.com](https://keithp.com/git/lola.git/). 2. [github](https://github.com/keith-packard/lola). Just like Snek, you can get it from either place using: $ git clone git://keithp.com/git/lola.git or $ git clone https://github.com/keith-packard/lola.git Lola is a Python program; installing it is a simple matter of copying the script someplace in your path. You can use the Makefile for that if you like: $ cd lola $ make install The default location is /usr/local/bin ## Building Snek from Source Snek uses simple Makefiles. Because so much of snek targets embedded systems, using a more sophisticated system like meson is actually pretty hard. $ cd snek $ make ## Patch Submission You can submit patches in a couple of ways: 1. Mail to the snek list (see below). This can be tricky as it requires a friendly email system, and you'll have to subscribe to the mailing list before it will let you post anything (sigh). Here's a simple example sending the latest patch in your local repository to the list: $ git send-email --to snek@keithp.com HEAD^ 2. Generate a pull-request in github. 1. Fork the snek project into your own github account 2. Push patches to that repository 3. While viewing your repository, click on the 'New pull request' button and follow the instructions there. ## Issue Tracking We're using the issue tracker on Github for now; if you have issues, please submit them to the [Snek Issue Tracker](https://github.com/keith-packard/snek/issues) ## Mailing List Snek has a mailing list, hosted at keithp.com. You can [subscribe here](https://keithp.com/mailman/listinfo/snek). This is a public list, with public archives. Participants are expected to abide by the Snek Code of Conduct. ## Code of Conduct Snek uses the [Contributor Covenant](https://www.contributor-covenant.org/), which you'll find in the source tree. Please help make Snek a kind and welcoming environment by following those rules. snek-1.1/COPYING000066400000000000000000001045131353657467200133740ustar00rootroot00000000000000 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 . snek-1.1/Makefile000066400000000000000000000045351353657467200140040ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_NO_BUILD_TARGETS = 1 SNEK_ROOT = . include snek-install.defs SNEK_OTHEROS?=1 ifeq ($(SNEK_OTHEROS),1) SNEK_OTHEROS_DIR=$(SNEK_HOSTS)/linux $(SNEK_HOSTS)/windows $(SNEK_HOSTS)/macosx endif SUBDIRS = snekde doc examples $(SNEK_OTHEROS_DIR) SNEKS = $(SNEK_PORTS)/posix/snek $(FIRMWARE) all: $(SNEKS) +for dir in $(SUBDIRS); do (cd $$dir && make PREFIX=$(PREFIX) DESTDIR=$(DESTDIR)); done $(SNEKS): FORCE +cd `dirname $@` && make PREFIX=$(PREFIX) DESTDIR=$(DESTDIR) FORCE: check: all +cd test && make $@ SHAREFILES = \ snek.defs \ $(SNEK_SRC) \ $(SNEK_EXT_SRC) \ $(SNEK_RAW_INC) \ $(SNEK_EXT_INC) \ $(SNEK_BUILTINS) \ $(SNEK_EXT_BUILTINS) \ $(SNEK_ROOT)/snek-gram.ll \ $(SNEK_ROOT)/snek-builtin.py IMAGEFILES = \ snek.svg DOCFILES = \ $(IMAGEFILES) PKGFILES = \ snek.pc install: $(SHAREFILES) $(PKGFILES) $(DOCFILES) install -d $(DESTDIR)$(SHAREDIR) for i in $(SHAREFILES); do install --mode=644 "$$i" $(DESTDIR)$(SHAREDIR); done install -d $(DESTDIR)$(PKGCONFIG) for i in $(PKGFILES); do install --mode=644 "$$i" $(DESTDIR)$(PKGCONFIG); done install -d $(DESTDIR)$(DOCDIR) for i in $(DOCFILES); do install --mode=644 "$$i" $(DESTDIR)$(DOCDIR); done +for dir in $(SUBDIRS); do (cd $$dir && make PREFIX=$(PREFIX) DESTDIR=$(DESTDIR) $@); done +for snek in $(SNEKS); do (cd `dirname $$snek` && make PREFIX=$(PREFIX) DESTDIR=$(DESTDIR) $@); done upload: +cd doc && make upload for otheros in $(SNEK_OTHEROS_DIR); do (cd "$$otheros" && make upload); done snek.pc: snek.pc.in $(SNEK_SED) $^ > $@ snek-mu.py: find . -name '*.builtin' -print0 | xargs -0 python3 ./snek-builtin.py --mu -o $@ clean: rm -f snek.pc +for dir in $(SUBDIRS); do (cd $$dir && make PREFIX=$(PREFIX) DESTDIR=$(DESTDIR) $@); done +for snek in $(SNEKS); do (cd `dirname $$snek` && make PREFIX=$(PREFIX) DESTDIR=$(DESTDIR) $@); done snek-1.1/README.md000066400000000000000000000133171353657467200136210ustar00rootroot00000000000000# Snek — a tiny python-inspired language for embedded computing ![Snek picture](snek.svg) Snek is a tiny embeddable language targeting processors with only a few kB of flash and ram. Think of something that would have been running BASIC years ago and you'll have the idea. These processors are too small to run [MicroPython](https://micropython.org/). ## Documentation * The [Snek Home Page](https://keithp.com/snek) provides more information about the language and community. * [Snek Manual in HTML format](https://keithp.com/snek/snek.html) * [Snek Manual in PDF format](https://keithp.com/snek/snek.pdf) ## Downloads * Snek is packaged for Debian but not yet in the main archive. I have made packages available in my personal archive for now. Instructions for using that can be found [here](http://keithp.com/archive/README). This archive also includes _lola_, the LL parser generator used in building Snek. * Packages for Linux, Mac OS X and Windows are available in the [Snek Dist directory](http://keithp.com/snek/dist) ## To Do list I think the basic Snek language is pretty complete at this point, but there are always improvements that can be made. ## Recent Changes Here's some places that have seen recent work * [Adafruit ItsyBitsy 5V](https://www.adafruit.com/product/3677) port. This device uses the Atmel ATmega 32u4 SoC which is similar to the 328P, but has integrate USB support so it doesn't need an external USB to serial converter. Getting a USB stack tucked into the ROM took some squeezing, and I had to remove some functionality (random numbers and pre-defined port names) to make it fit. * [NeoPixel](https://learn.adafruit.com/adafruit-neopixel-uberguide) driver. NeoPixel is Adafruit's name for the WS2812 (and similar) scalable full-color light source. The current driver is samd21g-specific, but could be ported to other SoCs. * [Circuit Playground Express](https://www.adafruit.com/product/3333) port. The 10 integrated NeoPixels encourated me to write a NeoPixel driver. This still needs drivers for the accelerometer, speaker and microphone. * [Crickit FeatherWing](https://www.adafruit.com/product/3343) port. This device has built-in drivers for motors and other devices, along with convenient plugs for other devices. If you want to get started building Snek robots, this is a great board to buy. ## Build and Run! If you want to build Snek yourself, ### Dependencies To build Snek you need these dependencies: * [Lola](https://keithp.com/cgit/lola.git/) * [gcc-avr](https://ccrma.stanford.edu/~juanig/articles/wiriavrlib/AVR_GCC.html) * [avr-libc](https://www.nongnu.org/avr-libc/) * [gcc-arm-none-eabi](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads) * [newlib-nano](https://keithp.com/newlib-nano/) * [python3](https://www.python.org/) * [pyserial](https://github.com/pyserial/) * [python curses](https://docs.python.org/3/library/curses.html) On Debian, you can get everything other than Lola from the main archive: # apt install gcc-avr avr-libc python3-serial gcc-arm-none-eabi libnewlib-nano-arm-none-eabi To install Lola, download the source and install it; $ git clone git://keithp.com/git/lola.git $ cd lola && make install ### Building and install In the source of the project run: $ make $ make install ## Running on Embedded Devices Snek is designed to run on small embedded devices with 32kB or more of flash and 2kB or more of RAM. Snek has been ported to a variety of embedded devices, providing access to pins as GPIOs as well as some built-in peripherals. Documentation about the supported boards can be found in the [Snek Manual](https://keithp.com/snek/snek.html). ## Running on Linux, Mac OS X Windows Snek is also built to run natively on Linux, Mac OS X and Windows. When installed, you'll find it available in the regular system menu. ## The Snek Development Environment Snekde is provided on all three platforms; you'll find it in the system menu on Linux and Windows and down in your personal Applications directory on Mac OS X. The snekde window is split into two parts. The upper 2/3 is a text editor for source code. The bottom 1/3 lets you interact with the Snek device over the USB port. The very top line lists functions that you can invoke by pressing the associated function key: * F1 — Device. Connect to a serial port. * F2 — Get. Get source code saved to the Snek device eeprom into the editor pane. * F3 — Put. Put code from the editor pane into the Snek device eeprom. * F4 — Quit. Exit snekde. * F5 — Load. Read source code from the file system into the editor pane. * F6 — Save. Write source code from the editor pane to the file system. There are a couple more keybindings which you'll want to know: * Page-up/Page-down — Switch between the editor pane and the interaction pane. * Ctrl-X/Ctrl-C/Ctrl-V — Usual cut/copy/paste commands. * Ctrl-C — In the interaction pane, this interrupts any snek program running on the device. Note that this means you don't get a Copy command in the interaction pane. * Ctrl-Z — Undo. Tab auto-indents the current line. Backspace backs up over a tabstop when appropriate. ## Examples There are examples provided, some of which work with both Python and Snek, and some of which show how to use SoC-specific APIs that aren't available in Python. ## Contributions I'd love to receive more contributions in the form of patches, suggestions and bug reports. Please feel free to send mail or use the github process. I've created a mailing list for collaboration; you'll need to subscribe to be able to post. Subscribe to the [snek mailing list here](https://keithp.com/mailman/listinfo/snek) snek-1.1/ao/000077500000000000000000000000001353657467200127345ustar00rootroot00000000000000snek-1.1/ao/ao-led.c000066400000000000000000000127631353657467200142520ustar00rootroot00000000000000/* * Copyright © 2018 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "ao.h" #ifndef LED_0_INVERT #define LED_0_INVERT 0 #endif #ifndef LED_1_INVERT #define LED_1_INVERT 0 #endif #ifndef LED_2_INVERT #define LED_2_INVERT 0 #endif #ifndef LED_3_INVERT #define LED_3_INVERT 0 #endif #ifndef LED_4_INVERT #define LED_4_INVERT 0 #endif #ifndef LED_5_INVERT #define LED_5_INVERT 0 #endif #ifndef LED_6_INVERT #define LED_6_INVERT 0 #endif #ifndef LED_7_INVERT #define LED_7_INVERT 0 #endif #ifndef LED_8_INVERT #define LED_8_INVERT 0 #endif #ifndef LED_9_INVERT #define LED_9_INVERT 0 #endif #ifndef LED_10_INVERT #define LED_10_INVERT 0 #endif #ifndef LED_11_INVERT #define LED_11_INVERT 0 #endif #ifndef LED_12_INVERT #define LED_12_INVERT 0 #endif #ifndef LED_13_INVERT #define LED_13_INVERT 0 #endif #ifndef LED_14_INVERT #define LED_14_INVERT 0 #endif #ifndef LED_15_INVERT #define LED_15_INVERT 0 #endif #ifndef LED_16_INVERT #define LED_16_INVERT 0 #endif #ifndef LED_17_INVERT #define LED_17_INVERT 0 #endif #ifndef LED_18_INVERT #define LED_18_INVERT 0 #endif #ifndef LED_19_INVERT #define LED_19_INVERT 0 #endif #ifndef LED_20_INVERT #define LED_20_INVERT 0 #endif #ifndef LED_21_INVERT #define LED_21_INVERT 0 #endif #ifndef LED_22_INVERT #define LED_22_INVERT 0 #endif #ifndef LED_23_INVERT #define LED_23_INVERT 0 #endif #ifndef LED_24_INVERT #define LED_24_INVERT 0 #endif #ifndef LED_25_INVERT #define LED_25_INVERT 0 #endif #ifndef LED_26_INVERT #define LED_26_INVERT 0 #endif #ifndef LED_27_INVERT #define LED_27_INVERT 0 #endif #ifndef LED_28_INVERT #define LED_28_INVERT 0 #endif #ifndef LED_29_INVERT #define LED_29_INVERT 0 #endif #ifndef LED_30_INVERT #define LED_30_INVERT 0 #endif #ifndef LED_31_INVERT #define LED_31_INVERT 0 #endif #ifdef LEDS_AVAILABLE static const struct { void *port; uint8_t pin; uint8_t invert; } ao_leds[] = { #ifdef LED_0_PORT [0] { LED_0_PORT, LED_0_PIN, LED_0_INVERT }, #endif #ifdef LED_1_PORT [1] { LED_1_PORT, LED_1_PIN, LED_1_INVERT }, #endif #ifdef LED_2_PORT [2] { LED_2_PORT, LED_2_PIN, LED_2_INVERT }, #endif #ifdef LED_3_PORT [3] { LED_3_PORT, LED_3_PIN, LED_3_INVERT }, #endif #ifdef LED_4_PORT [4] { LED_4_PORT, LED_4_PIN, LED_4_INVERT }, #endif #ifdef LED_5_PORT [5] { LED_5_PORT, LED_5_PIN, LED_5_INVERT }, #endif #ifdef LED_6_PORT [6] { LED_6_PORT, LED_6_PIN, LED_6_INVERT }, #endif #ifdef LED_7_PORT [7] { LED_7_PORT, LED_7_PIN, LED_7_INVERT }, #endif #ifdef LED_8_PORT [8] { LED_8_PORT, LED_8_PIN, LED_8_INVERT }, #endif #ifdef LED_9_PORT [9] { LED_9_PORT, LED_9_PIN, LED_9_INVERT }, #endif #ifdef LED_10_PORT [10] { LED_10_PORT, LED_10_PIN, LED_10_INVERT }, #endif #ifdef LED_11_PORT [11] { LED_11_PORT, LED_11_PIN, LED_11_INVERT }, #endif #ifdef LED_12_PORT [12] { LED_12_PORT, LED_12_PIN, LED_12_INVERT }, #endif #ifdef LED_13_PORT [13] { LED_13_PORT, LED_13_PIN, LED_13_INVERT }, #endif #ifdef LED_14_PORT [14] { LED_14_PORT, LED_14_PIN, LED_14_INVERT }, #endif #ifdef LED_15_PORT [15] { LED_15_PORT, LED_15_PIN, LED_15_INVERT }, #endif #ifdef LED_16_PORT [16] { LED_16_PORT, LED_16_PIN, LED_16_INVERT }, #endif #ifdef LED_17_PORT [17] { LED_17_PORT, LED_17_PIN, LED_17_INVERT }, #endif #ifdef LED_18_PORT [18] { LED_18_PORT, LED_18_PIN, LED_18_INVERT }, #endif #ifdef LED_19_PORT [19] { LED_19_PORT, LED_19_PIN, LED_19_INVERT }, #endif #ifdef LED_20_PORT [20] { LED_20_PORT, LED_20_PIN, LED_20_INVERT }, #endif #ifdef LED_21_PORT [21] { LED_21_PORT, LED_21_PIN, LED_21_INVERT }, #endif #ifdef LED_22_PORT [22] { LED_22_PORT, LED_22_PIN, LED_22_INVERT }, #endif #ifdef LED_23_PORT [23] { LED_23_PORT, LED_23_PIN, LED_23_INVERT }, #endif #ifdef LED_24_PORT [24] { LED_24_PORT, LED_24_PIN, LED_24_INVERT }, #endif #ifdef LED_25_PORT [25] { LED_25_PORT, LED_25_PIN, LED_25_INVERT }, #endif #ifdef LED_26_PORT [26] { LED_26_PORT, LED_26_PIN, LED_26_INVERT }, #endif #ifdef LED_27_PORT [27] { LED_27_PORT, LED_27_PIN, LED_27_INVERT }, #endif #ifdef LED_28_PORT [28] { LED_28_PORT, LED_28_PIN, LED_28_INVERT }, #endif #ifdef LED_29_PORT [29] { LED_29_PORT, LED_29_PIN, LED_29_INVERT }, #endif #ifdef LED_30_PORT [30] { LED_30_PORT, LED_30_PIN, LED_30_INVERT }, #endif #ifdef LED_31_PORT [31] { LED_31_PORT, LED_31_PIN, LED_31_INVERT }, #endif }; #define N_LED (sizeof (ao_leds)/sizeof(ao_leds[0])) void ao_led_on(AO_LED_TYPE colors) { AO_LED_TYPE i; for (i = 0; i < N_LED; i++) if (colors & (1 << i)) ao_gpio_set(ao_leds[i].port, ao_leds[i].pin, !ao_leds[i].invert); } void ao_led_off(AO_LED_TYPE colors) { AO_LED_TYPE i; for (i = 0; i < N_LED; i++) if (colors & (1 << i)) ao_gpio_set(ao_leds[i].port, ao_leds[i].pin, ao_leds[i].invert); } void ao_led_init(void) { AO_LED_TYPE bit; for (bit = 0; bit < N_LED; bit++) ao_enable_output(ao_leds[bit].port, ao_leds[bit].pin, 0); } #endif snek-1.1/ao/ao-led.h000066400000000000000000000112761353657467200142550ustar00rootroot00000000000000/* * Copyright © 2012 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _AO_LED_H_ #define _AO_LED_H_ /* * ao_led.c */ #define AO_LED_NONE 0 #ifndef AO_LED_TYPE #define AO_LED_TYPE uint32_t #endif /* Turn on the specified LEDs */ void ao_led_on(AO_LED_TYPE colors); /* Turn off the specified LEDs */ void ao_led_off(AO_LED_TYPE colors); /* Set all of the LEDs to the specified state */ void ao_led_set(AO_LED_TYPE colors); /* Set all LEDs in 'mask' to the specified state */ void ao_led_set_mask(AO_LED_TYPE colors, AO_LED_TYPE mask); /* Toggle the specified LEDs */ void ao_led_toggle(AO_LED_TYPE colors); /* Turn on the specified LEDs for the indicated interval */ void ao_led_for(AO_LED_TYPE colors, AO_TICK_TYPE ticks); /* Initialize the LEDs */ void ao_led_init(void); #ifdef LED_0_PORT #define AO_LED_0 (1 << 0) #else #define AO_LED_0 0 #endif #ifdef LED_1_PORT #define AO_LED_1 (1 << 1) #else #define AO_LED_1 0 #endif #ifdef LED_2_PORT #define AO_LED_2 (1 << 2) #else #define AO_LED_2 0 #endif #ifdef LED_3_PORT #define AO_LED_3 (1 << 3) #else #define AO_LED_3 0 #endif #ifdef LED_4_PORT #define AO_LED_4 (1 << 4) #else #define AO_LED_4 0 #endif #ifdef LED_5_PORT #define AO_LED_5 (1 << 5) #else #define AO_LED_5 0 #endif #ifdef LED_6_PORT #define AO_LED_6 (1 << 6) #else #define AO_LED_6 0 #endif #ifdef LED_7_PORT #define AO_LED_7 (1 << 7) #else #define AO_LED_7 0 #endif #ifdef LED_8_PORT #define AO_LED_8 (1 << 8) #else #define AO_LED_8 0 #endif #ifdef LED_9_PORT #define AO_LED_9 (1 << 9) #else #define AO_LED_9 0 #endif #ifdef LED_10_PORT #define AO_LED_10 (1 << 10) #else #define AO_LED_10 0 #endif #ifdef LED_11_PORT #define AO_LED_11 (1 << 11) #else #define AO_LED_11 0 #endif #ifdef LED_12_PORT #define AO_LED_12 (1 << 12) #else #define AO_LED_12 0 #endif #ifdef LED_13_PORT #define AO_LED_13 (1 << 13) #else #define AO_LED_13 0 #endif #ifdef LED_14_PORT #define AO_LED_14 (1 << 14) #else #define AO_LED_14 0 #endif #ifdef LED_15_PORT #define AO_LED_15 (1 << 15) #else #define AO_LED_15 0 #endif #ifdef LED_16_PORT #define AO_LED_16 (1 << 16) #else #define AO_LED_16 0 #endif #ifdef LED_17_PORT #define AO_LED_17 (1 << 17) #else #define AO_LED_17 0 #endif #ifdef LED_18_PORT #define AO_LED_18 (1 << 18) #else #define AO_LED_18 0 #endif #ifdef LED_19_PORT #define AO_LED_19 (1 << 19) #else #define AO_LED_19 0 #endif #ifdef LED_20_PORT #define AO_LED_20 (1 << 20) #else #define AO_LED_20 0 #endif #ifdef LED_21_PORT #define AO_LED_21 (1 << 21) #else #define AO_LED_21 0 #endif #ifdef LED_22_PORT #define AO_LED_22 (1 << 22) #else #define AO_LED_22 0 #endif #ifdef LED_23_PORT #define AO_LED_23 (1 << 23) #else #define AO_LED_23 0 #endif #ifdef LED_24_PORT #define AO_LED_24 (1 << 24) #else #define AO_LED_24 0 #endif #ifdef LED_25_PORT #define AO_LED_25 (1 << 25) #else #define AO_LED_25 0 #endif #ifdef LED_26_PORT #define AO_LED_26 (1 << 26) #else #define AO_LED_26 0 #endif #ifdef LED_27_PORT #define AO_LED_27 (1 << 27) #else #define AO_LED_27 0 #endif #ifdef LED_28_PORT #define AO_LED_28 (1 << 28) #else #define AO_LED_28 0 #endif #ifdef LED_29_PORT #define AO_LED_29 (1 << 29) #else #define AO_LED_29 0 #endif #ifdef LED_30_PORT #define AO_LED_30 (1 << 30) #else #define AO_LED_30 0 #endif #ifdef LED_31_PORT #define AO_LED_31 (1 << 31) #else #define AO_LED_31 0 #endif #define AO_LEDS_AVAILABLE (AO_LED_0 | \ AO_LED_1 | \ AO_LED_2 | \ AO_LED_3 | \ AO_LED_4 | \ AO_LED_5 | \ AO_LED_6 | \ AO_LED_7 | \ AO_LED_8 | \ AO_LED_9 | \ AO_LED_10 | \ AO_LED_11 | \ AO_LED_12 | \ AO_LED_13 | \ AO_LED_14 | \ AO_LED_15 | \ AO_LED_16 | \ AO_LED_17 | \ AO_LED_18 | \ AO_LED_19 | \ AO_LED_20 | \ AO_LED_21 | \ AO_LED_22 | \ AO_LED_23 | \ AO_LED_24 | \ AO_LED_25 | \ AO_LED_26 | \ AO_LED_27 | \ AO_LED_28 | \ AO_LED_29 | \ AO_LED_30 | \ AO_LED_31) #ifndef LEDS_AVAILABLE #define LEDS_AVAILABLE AO_LEDS_AVAILABLE #endif #endif /* _AO_LED_H_ */ snek-1.1/ao/ao-notask.c000066400000000000000000000017261353657467200150020ustar00rootroot00000000000000/* * Copyright © 2012 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include static volatile void *ao_wchan; uint8_t ao_sleep(void *wchan) { ao_wchan = wchan; ao_arch_wait_interrupt(); return 0; } void ao_wakeup(void *wchan) { (void) wchan; ao_wchan = 0; } snek-1.1/ao/ao-notask.h000066400000000000000000000016201353657467200150000ustar00rootroot00000000000000/* * Copyright © 2012 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _AO_NOTASK_H_ #define _AO_NOTASK_H_ uint8_t ao_sleep(void *wchan); void ao_wakeup(void *wchan); #endif /* _AO_NOTASK_H_ */ snek-1.1/ao/ao-panic.c000066400000000000000000000037131353657467200145730ustar00rootroot00000000000000/* * Copyright © 2009 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "ao.h" #ifndef HAS_BEEP #error Please define HAS_BEEP #endif #if !HAS_BEEP #define ao_beep(x) #endif #if !LEDS_AVAILABLE #define ao_led_on(x) #define ao_led_off(x) #endif #ifndef AO_LED_PANIC #define AO_LED_PANIC AO_LED_RED #endif static void ao_panic_delay(uint8_t n) { uint8_t i = 0, j = 0; while (n--) { #ifdef AO_PANIC_DELAY_SCALE uint8_t s = AO_PANIC_DELAY_SCALE; while (s--) #endif while (--j) while (--i) ao_arch_nop(); } } void ao_panic(uint8_t reason) { uint8_t n; ao_arch_block_interrupts(); for (;;) { ao_panic_delay(20); #if HAS_BEEP for (n = 0; n < 5; n++) { ao_beep(AO_BEEP_HIGH_PANIC); ao_panic_delay(1); ao_beep(AO_BEEP_LOW_PANIC); ao_panic_delay(1); } ao_beep(AO_BEEP_OFF); ao_panic_delay(2); #endif #ifdef SDCC #pragma disable_warning 126 #endif if (reason & 0x40) { ao_led_on(AO_LED_PANIC); ao_beep(AO_BEEP_HIGH_PANIC); ao_panic_delay(40); ao_led_off(AO_LED_PANIC); ao_beep(AO_BEEP_OFF); ao_panic_delay(10); } for (n = 0; n < (reason & 0x3f); n++) { ao_led_on(AO_LED_PANIC); ao_beep(AO_BEEP_MID_PANIC); ao_panic_delay(10); ao_led_off(AO_LED_PANIC); ao_beep(AO_BEEP_OFF); ao_panic_delay(10); } } } snek-1.1/ao/ao-product.c000066400000000000000000000123371353657467200151630ustar00rootroot00000000000000/* * Copyright © 2009 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "ao.h" #include "ao-product.h" /* Defines which mark this particular AltOS product */ #define LE_WORD(x) ((x)&0xFF),((uint8_t) (((uint16_t) (x))>>8)) #if HAS_USB /* Maximum power in mA */ #ifndef AO_USB_MAX_POWER #define AO_USB_MAX_POWER 100 #endif #ifndef AO_USB_SELF_POWER #define AO_USB_SELF_POWER 1 #endif #define AO_USB_DEVICE_CLASS_COMMUNICATION 0x02 #define AO_USB_INTERFACE_CLASS_CONTROL_CDC 0x02 #define AO_USB_INTERFACE_CLASS_DATA_CDC 0x0A #ifndef AO_USB_DEVICE_CLASS #define AO_USB_DEVICE_CLASS AO_USB_DEVICE_CLASS_COMMUNICATION #endif #ifndef AO_USB_INTERFACE_CLASS_DATA #define AO_USB_INTERFACE_CLASS_CONTROL AO_USB_INTERFACE_CLASS_CONTROL_CDC #define AO_USB_INTERFACE_CLASS_DATA AO_USB_INTERFACE_CLASS_DATA_CDC #endif #include "ao-usb.h" #define HEADER_LEN 9 #define CONTROL_CLASS_LEN 35 #define DATA_LEN (9 + 7 * AO_USB_HAS_OUT + 7 * AO_USB_HAS_IN + 7 * AO_USB_HAS_IN2 + 7 * AO_USB_HAS_IN3) #define TOTAL_LENGTH (HEADER_LEN + AO_USB_HAS_INT * CONTROL_CLASS_LEN + DATA_LEN) #define NUM_INTERFACES (AO_USB_HAS_INT + 1) /* USB descriptors in one giant block of bytes */ const uint8_t ao_usb_descriptors [] = { /* Device descriptor */ 0x12, AO_USB_DESC_DEVICE, LE_WORD(0x0110), /* bcdUSB */ AO_USB_DEVICE_CLASS, /* bDeviceClass */ 0x00, /* bDeviceSubClass */ 0x00, /* bDeviceProtocol */ AO_USB_CONTROL_SIZE, /* bMaxPacketSize */ LE_WORD(AO_idVendor_NUMBER), /* idVendor */ LE_WORD(AO_idProduct_NUMBER), /* idProduct */ LE_WORD(0x0100), /* bcdDevice */ 0x01, /* iManufacturer */ 0x02, /* iProduct */ 0x03, /* iSerialNumber */ 0x01, /* bNumConfigurations */ /* Configuration descriptor */ 0x09, AO_USB_DESC_CONFIGURATION, LE_WORD(TOTAL_LENGTH), /* wTotalLength */ NUM_INTERFACES, /* bNumInterfaces */ 0x01, /* bConfigurationValue */ 0x00, /* iConfiguration */ 0x80 | (AO_USB_SELF_POWER << 6), /* bmAttributes */ AO_USB_MAX_POWER >> 1, /* bMaxPower, 2mA units */ #if AO_USB_HAS_INT /* Control class interface */ 0x09, AO_USB_DESC_INTERFACE, 0x00, /* bInterfaceNumber */ 0x00, /* bAlternateSetting */ 0x01, /* bNumEndPoints */ AO_USB_INTERFACE_CLASS_CONTROL, /* bInterfaceClass */ 0x02, /* bInterfaceSubClass */ 0x01, /* bInterfaceProtocol, linux requires value of 1 for the cdc_acm module */ 0x00, /* iInterface */ /* Header functional descriptor */ 0x05, AO_USB_CS_INTERFACE, 0x00, /* bDescriptor SubType Header */ LE_WORD(0x0110), /* CDC version 1.1 */ /* Call management functional descriptor */ 0x05, AO_USB_CS_INTERFACE, 0x01, /* bDescriptor SubType Call Management */ 0x01, /* bmCapabilities = device handles call management */ 0x01, /* bDataInterface call management interface number */ /* ACM functional descriptor */ 0x04, AO_USB_CS_INTERFACE, 0x02, /* bDescriptor SubType Abstract Control Management */ 0x02, /* bmCapabilities = D1 (Set_line_Coding, Set_Control_Line_State, Get_Line_Coding and Serial_State) */ /* Union functional descriptor */ 0x05, AO_USB_CS_INTERFACE, 0x06, /* bDescriptor SubType Union Functional descriptor */ 0x00, /* bMasterInterface */ 0x01, /* bSlaveInterface0 */ /* Notification EP */ 0x07, AO_USB_DESC_ENDPOINT, AO_USB_INT_EP|0x80, /* bEndpointAddress */ 0x03, /* bmAttributes = intr */ LE_WORD(8), /* wMaxPacketSize */ 0xff, /* bInterval */ #endif /* Data class interface descriptor */ 0x09, AO_USB_DESC_INTERFACE, AO_USB_HAS_INT, /* bInterfaceNumber */ 0x00, /* bAlternateSetting */ AO_USB_HAS_OUT + AO_USB_HAS_IN + AO_USB_HAS_IN2 + AO_USB_HAS_IN3, /* bNumEndPoints */ AO_USB_INTERFACE_CLASS_DATA, /* bInterfaceClass = data */ 0x00, /* bInterfaceSubClass */ 0x00, /* bInterfaceProtocol */ 0x00, /* iInterface */ #if AO_USB_HAS_OUT /* Data EP OUT */ 0x07, AO_USB_DESC_ENDPOINT, AO_USB_OUT_EP, /* bEndpointAddress */ 0x02, /* bmAttributes = bulk */ LE_WORD(AO_USB_OUT_SIZE),/* wMaxPacketSize */ 0x00, /* bInterval */ #endif #if AO_USB_HAS_IN /* Data EP in */ 0x07, AO_USB_DESC_ENDPOINT, AO_USB_IN_EP|0x80, /* bEndpointAddress */ 0x02, /* bmAttributes = bulk */ LE_WORD(AO_USB_IN_SIZE),/* wMaxPacketSize */ 0x00, /* bInterval */ #endif /* String descriptors */ 0x04, AO_USB_DESC_STRING, LE_WORD(0x0409), /* iManufacturer */ AO_iManufacturer_LEN, AO_USB_DESC_STRING, AO_iManufacturer_UCS2, /* iProduct */ AO_iProduct_LEN, AO_USB_DESC_STRING, AO_iProduct_UCS2, /* iSerial */ AO_iSerial_LEN, AO_USB_DESC_STRING, AO_iSerial_UCS2, /* Terminating zero */ 0 }; #endif snek-1.1/ao/ao-usb.h000066400000000000000000000076421353657467200143040ustar00rootroot00000000000000/* * Copyright © 2012 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _AO_USB_H_ #define _AO_USB_H_ /* * ao_usb.c */ /* Put one character to the USB output queue */ int ao_usb_putc(char c, FILE *file); /* Try to read one char from USB */ int ao_usb_pollchar(void); /* Get one character from the USB input queue */ int ao_usb_getc(void); /* Flush the USB output queue */ int ao_usb_flush(FILE *file); /* Enable the USB controller */ void ao_usb_enable(void); /* Disable the USB controller */ void ao_usb_disable(void); /* Initialize the USB system */ void ao_usb_init(void); extern const uint8_t ao_usb_descriptors []; #define AO_USB_SETUP_DIR_MASK (0x01 << 7) #define AO_USB_SETUP_TYPE_MASK (0x03 << 5) #define AO_USB_SETUP_RECIP_MASK (0x1f) #define AO_USB_DIR_OUT 0 #define AO_USB_DIR_IN (1 << 7) #define AO_USB_TYPE_STANDARD 0 #define AO_USB_TYPE_CLASS (1 << 5) #define AO_USB_TYPE_VENDOR (2 << 5) #define AO_USB_TYPE_RESERVED (3 << 5) #define AO_USB_RECIP_DEVICE 0 #define AO_USB_RECIP_INTERFACE 1 #define AO_USB_RECIP_ENDPOINT 2 #define AO_USB_RECIP_OTHER 3 /* standard requests */ #define AO_USB_REQ_GET_STATUS 0x00 #define AO_USB_REQ_CLEAR_FEATURE 0x01 #define AO_USB_REQ_SET_FEATURE 0x03 #define AO_USB_REQ_SET_ADDRESS 0x05 #define AO_USB_REQ_GET_DESCRIPTOR 0x06 #define AO_USB_REQ_SET_DESCRIPTOR 0x07 #define AO_USB_REQ_GET_CONFIGURATION 0x08 #define AO_USB_REQ_SET_CONFIGURATION 0x09 #define AO_USB_REQ_GET_INTERFACE 0x0A #define AO_USB_REQ_SET_INTERFACE 0x0B #define AO_USB_REQ_SYNCH_FRAME 0x0C #define AO_USB_DESC_DEVICE 1 #define AO_USB_DESC_CONFIGURATION 2 #define AO_USB_DESC_STRING 3 #define AO_USB_DESC_INTERFACE 4 #define AO_USB_DESC_ENDPOINT 5 #define AO_USB_DESC_DEVICE_QUALIFIER 6 #define AO_USB_DESC_OTHER_SPEED 7 #define AO_USB_DESC_INTERFACE_POWER 8 #define AO_USB_GET_DESC_TYPE(x) (((x)>>8)&0xFF) #define AO_USB_GET_DESC_INDEX(x) ((x)&0xFF) #define AO_USB_CONTROL_EP 0 #define AO_USB_CONTROL_SIZE 32 #define AO_USB_INT_EP 1 #define AO_USB_INT_SIZE 8 #ifndef AO_USB_OUT_EP #define AO_USB_OUT_EP 4 #define AO_USB_IN_EP 5 #define AO_USB_IN2_EP 6 #define AO_USB_IN3_EP 7 #endif #ifndef AO_USB_HAS_OUT #define AO_USB_HAS_OUT 1 #endif #ifndef AO_USB_HAS_IN #define AO_USB_HAS_IN 1 #endif #ifndef AO_USB_HAS_INT #define AO_USB_HAS_INT 1 #endif #ifndef AO_USB_HAS_IN2 #define AO_USB_HAS_IN2 0 #endif #ifndef AO_USB_HAS_IN3 #define AO_USB_HAS_IN3 0 #endif /* * USB bulk packets can only come in 8, 16, 32 and 64 * byte sizes, so we'll use 64 for everything */ #define AO_USB_IN_SIZE 64 #define AO_USB_OUT_SIZE 64 #define AO_USB_EP0_IDLE 0 #define AO_USB_EP0_DATA_IN 1 #define AO_USB_EP0_DATA_OUT 2 #define AO_USB_EP0_STALL 3 #define LE_WORD(x) ((x)&0xFF),((uint8_t) (((uint16_t) (x))>>8)) /* CDC definitions */ #define AO_USB_CS_INTERFACE 0x24 #define AO_USB_CS_ENDPOINT 0x25 #define AO_USB_SET_LINE_CODING 0x20 #define AO_USB_GET_LINE_CODING 0x21 #define AO_USB_SET_CONTROL_LINE_STATE 0x22 /* Data structure for GET_LINE_CODING / SET_LINE_CODING class requests */ struct ao_usb_line_coding { uint32_t rate; uint8_t char_format; uint8_t parity; uint8_t data_bits; } ; extern struct ao_usb_line_coding ao_usb_line_coding; extern uint8_t ao_usb_running; #endif /* _AO_USB_H_ */ snek-1.1/ao/ao.h000066400000000000000000000065751353657467200135210ustar00rootroot00000000000000/* * Copyright © 2009 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _AO_H_ #define _AO_H_ #include #include #include #include #include #include #include #include #define AO_MAX_VERSION 8 /* * ao_panic.c */ #define AO_PANIC_CRASH 1 /* Processor crashed */ #define AO_PANIC_USB 2 /* USB communication error */ /* Stop the operating system, beeping and blinking the reason */ void ao_panic(uint8_t reason); /* * ao_timer.c */ #ifndef AO_TICK_TYPE #define AO_TICK_TYPE uint32_t #define AO_TICK_SIGNED int32_t #endif extern volatile AO_TICK_TYPE ao_tick_count; /* Our timer runs at 1kHz */ #ifndef AO_HERTZ #define AO_HERTZ 1000 #endif #define AO_MS_TO_TICKS(ms) ((ms) / (1000 / AO_HERTZ)) #define AO_SEC_TO_TICKS(s) ((s) * AO_HERTZ) /* Returns the current time in ticks */ AO_TICK_TYPE ao_time(void); /* Returns the current time in ns */ uint64_t ao_time_ns(void); /* Suspend the current task until ticks time has passed */ void ao_delay(uint16_t ticks); /* Initialize the timer */ void ao_timer_init(void); /* Initialize the hardware clock. Must be called first */ void ao_clock_init(void); #if AO_POWER_MANAGEMENT /* Go to low power clock */ void ao_clock_suspend(void); /* Restart full-speed clock */ void ao_clock_resume(void); #endif /* * Various drivers */ #if LEDS_AVAILABLE || HAS_LED #include #endif #if HAS_USB #include #endif /* * ao_stdio.c */ #define AO_READ_AGAIN (-1) extern uint8_t ao_stdin_ready; /* * Fifos */ #ifndef AO_FIFO_SIZE #define AO_FIFO_SIZE 256 #endif #if AO_FIFO_SIZE > 255 typedef uint16_t fifo_t; #else typedef uint8_t fifo_t; #endif struct ao_fifo { fifo_t remove; fifo_t count; char fifo[AO_FIFO_SIZE]; }; static inline void ao_fifo_insert(struct ao_fifo *f, char c) { fifo_t insert = (f->remove + f->count) & (AO_FIFO_SIZE - 1); f->fifo[insert] = c; f->count++; } static inline char ao_fifo_remove(struct ao_fifo *f) { char c = f->fifo[f->remove]; f->remove = (f->remove + 1) & (AO_FIFO_SIZE - 1); f->count--; return c; } static inline bool ao_fifo_full(struct ao_fifo *f) { return f->count == AO_FIFO_SIZE; } static inline bool ao_fifo_empty(struct ao_fifo *f) { return f->count == 0; } static inline fifo_t ao_fifo_space(struct ao_fifo *f) { return f->count; } static inline bool ao_fifo_has_space(struct ao_fifo *f, fifo_t amount) { return amount <= AO_FIFO_SIZE - f->count; } static inline bool ao_fifo_mostly(struct ao_fifo *f) { return f->count >= AO_FIFO_SIZE * 3 / 4; } static inline bool ao_fifo_barely(struct ao_fifo *f) { return f->count <= AO_FIFO_SIZE * 1 / 4; } #include #endif /* _AO_H_ */ snek-1.1/ao/make-product.py000077500000000000000000000046011353657467200157050ustar00rootroot00000000000000#!/usr/bin/python3 import argparse def write_ucs2(a, description): l = len(a) print("/* %s */" % description) print("#define AO_%s_LEN 0x%02x" % (description, l * 2 + 2)) print("#define AO_%s_STRING \"%s\"" % (description, a)) print("#define AO_%s_UCS2" % description, end='') for i in range(l): c = a[i] if i > 0: print(",", end='') if 0x20 <= ord(c) and ord(c) < 128: print(" '%c', 0" % c, end='') else: print(" LE_WORD(0x%04x)," % c, end='') print("\n") def write_string(a,description): print("/* %s */" % description) print("#define AO_%s_STRING \"%s\"" % (description, a)) def write_int(a, description): print("/* %s */" % description) print("#define AO_%s_NUMBER %d\n" % (description, a)) def write_hex(a, description): print("/* %s */" % description) print("#define AO_%s_NUMBER 0x%04x\n" % (description, a)) def auto_int(x): return int(x,0) def make_product(): manufacturer = "keithp.com" product = "MetroSnek" version = "0.0" output = "" serial = 1 user_argind = 0 id_vendor = 0xfffe id_product = 0x000a parse = argparse.ArgumentParser() parse.add_argument("-m", "--manufacturer", help="manufacturer name", default=manufacturer) parse.add_argument("-p", "--product", help="product name", default=product) parse.add_argument("-V", "--id_vendor", type=auto_int, help="vendor id number", default=id_vendor) parse.add_argument("-i", "--id_product", type=auto_int, help="product id number", default=id_product) parse.add_argument("-v", "--version", help="version string", default=version) parse.add_argument("-s", "--serial", type=auto_int, help="serial number", default=serial) args = parse.parse_args() if args.manufacturer: manufacturer = args.manufacturer if args.product: product = args.product if args.id_vendor: id_vendor = args.id_vendor if args.id_product: id_product = args.id_product if args.version: version = args.version if args.serial: serial = args.serial write_ucs2(manufacturer, "iManufacturer") write_ucs2(product, "iProduct") write_ucs2("%06d" % serial, "iSerial") write_int(serial, "iSerial") write_hex(id_product, "idProduct") write_hex(id_vendor, "idVendor") write_string(version, "iVersion") make_product() snek-1.1/chips/000077500000000000000000000000001353657467200134435ustar00rootroot00000000000000snek-1.1/chips/atmega/000077500000000000000000000000001353657467200147015ustar00rootroot00000000000000snek-1.1/chips/atmega/ef_acosh.c000066400000000000000000000026771353657467200166300ustar00rootroot00000000000000/* ef_acosh.c -- float version of e_acosh.c. * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== * */ #include "fdlibm.h" #ifdef __STDC__ static const float #else static float #endif one = 1.0, ln2 = 6.9314718246e-01; /* 0x3f317218 */ #if defined(_IEEE_LIBM) && defined(HAVE_ALIAS_ATTRIBUTE) __strong_reference(__ieee754_acoshf, acoshf); #endif #ifdef __STDC__ float __ieee754_acoshf(float x) #else float __ieee754_acoshf(x) float x; #endif { float t; __int32_t hx; GET_FLOAT_WORD(hx,x); if(hx<0x3f800000) { /* x < 1 */ return (x-x)/(x-x); } else if(hx >=0x4d800000) { /* x > 2**28 */ if(!FLT_UWORD_IS_FINITE(hx)) { /* x is inf of NaN */ return x+x; } else return __ieee754_logf(x)+ln2; /* acosh(huge)=log(2x) */ } else if (hx==0x3f800000) { return 0.0; /* acosh(1) = 0 */ } else if (hx > 0x40000000) { /* 2**28 > x > 2 */ t=x*x; return __ieee754_logf((float)2.0*x-one/(x+__ieee754_sqrtf(t-one))); } else { /* 10x3f800000) /* |x|>1 */ return (x-x)/(x-x); if(ix==0x3f800000) return x/zero; if(ix<0x31800000&&(huge+x)>zero) return x; /* x<2**-28 */ SET_FLOAT_WORD(x,ix); if(ix<0x3f000000) { /* x < 0.5 */ t = x+x; t = (float)0.5*log1pf(t+t*x/(one-x)); } else t = (float)0.5*log1pf((x+x)/(one-x)); if(hx>=0) return t; else return -t; } snek-1.1/chips/atmega/ef_remainder.c000066400000000000000000000030111353657467200174600ustar00rootroot00000000000000/* ef_remainder.c -- float version of e_remainder.c. * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ #include "fdlibm.h" #ifdef __STDC__ static const float zero = 0.0; #else static float zero = 0.0; #endif #if defined(_IEEE_LIBM) && defined(HAVE_ALIAS_ATTRIBUTE) __strong_reference(__ieee754_remainderf, remainderf); #endif #ifdef __STDC__ float __ieee754_remainderf(float x, float p) #else float __ieee754_remainderf(x,p) float x,p; #endif { __int32_t hx,hp; __uint32_t sx; float p_half; GET_FLOAT_WORD(hx,x); GET_FLOAT_WORD(hp,p); sx = hx&0x80000000; hp &= 0x7fffffff; hx &= 0x7fffffff; /* purge off exception values */ if(FLT_UWORD_IS_ZERO(hp)|| !FLT_UWORD_IS_FINITE(hx)|| FLT_UWORD_IS_NAN(hp)) return (x*p)/(x*p); if (hp<=FLT_UWORD_HALF_MAX) x = __ieee754_fmodf(x,p+p); /* now x < 2p */ if ((hx-hp)==0) return zero*x; x = fabsf(x); p = fabsf(p); if (hp<0x01000000) { if(x+x>p) { x-=p; if(x+x>=p) x -= p; } } else { p_half = (float)0.5*p; if(x>p_half) { x-=p; if(x>=p_half) x -= p; } } GET_FLOAT_WORD(hx,x); SET_FLOAT_WORD(x,hx^sx); return x; } snek-1.1/chips/atmega/erf_gamma.c000066400000000000000000000020301353657467200167560ustar00rootroot00000000000000/* erf_gamma.c -- float version of er_gamma.c. * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== * */ /* __ieee754_gammaf_r(x, signgamp) * Reentrant version of the logarithm of the Gamma function * with user provide pointer for the sign of Gamma(x). * * Method: See __ieee754_lgammaf_r */ #include "fdlibm.h" #if defined(_IEEE_LIBM) && defined(HAVE_ALIAS_ATTRIBUTE) __strong_reference(__ieee754_gammaf_r, gammaf_r); #endif #ifdef __STDC__ float __ieee754_gammaf_r(float x, int *signgamp) #else float __ieee754_gammaf_r(x,signgamp) float x; int *signgamp; #endif { return __ieee754_expf (__ieee754_lgammaf_r(x,signgamp)); } snek-1.1/chips/atmega/erf_lgamma.c000066400000000000000000000167031353657467200171460ustar00rootroot00000000000000/* erf_lgamma.c -- float version of er_lgamma.c. * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== * */ #include "fdlibm.h" #ifdef __STDC__ static const float #else static float #endif two23= 8.3886080000e+06, /* 0x4b000000 */ half= 5.0000000000e-01, /* 0x3f000000 */ one = 1.0000000000e+00, /* 0x3f800000 */ pi = 3.1415927410e+00, /* 0x40490fdb */ a0 = 7.7215664089e-02, /* 0x3d9e233f */ a1 = 3.2246702909e-01, /* 0x3ea51a66 */ a2 = 6.7352302372e-02, /* 0x3d89f001 */ a3 = 2.0580807701e-02, /* 0x3ca89915 */ a4 = 7.3855509982e-03, /* 0x3bf2027e */ a5 = 2.8905137442e-03, /* 0x3b3d6ec6 */ a6 = 1.1927076848e-03, /* 0x3a9c54a1 */ a7 = 5.1006977446e-04, /* 0x3a05b634 */ a8 = 2.2086278477e-04, /* 0x39679767 */ a9 = 1.0801156895e-04, /* 0x38e28445 */ a10 = 2.5214456400e-05, /* 0x37d383a2 */ a11 = 4.4864096708e-05, /* 0x383c2c75 */ tc = 1.4616321325e+00, /* 0x3fbb16c3 */ tf = -1.2148628384e-01, /* 0xbdf8cdcd */ /* tt = -(tail of tf) */ tt = 6.6971006518e-09, /* 0x31e61c52 */ t0 = 4.8383611441e-01, /* 0x3ef7b95e */ t1 = -1.4758771658e-01, /* 0xbe17213c */ t2 = 6.4624942839e-02, /* 0x3d845a15 */ t3 = -3.2788541168e-02, /* 0xbd064d47 */ t4 = 1.7970675603e-02, /* 0x3c93373d */ t5 = -1.0314224288e-02, /* 0xbc28fcfe */ t6 = 6.1005386524e-03, /* 0x3bc7e707 */ t7 = -3.6845202558e-03, /* 0xbb7177fe */ t8 = 2.2596477065e-03, /* 0x3b141699 */ t9 = -1.4034647029e-03, /* 0xbab7f476 */ t10 = 8.8108185446e-04, /* 0x3a66f867 */ t11 = -5.3859531181e-04, /* 0xba0d3085 */ t12 = 3.1563205994e-04, /* 0x39a57b6b */ t13 = -3.1275415677e-04, /* 0xb9a3f927 */ t14 = 3.3552918467e-04, /* 0x39afe9f7 */ u0 = -7.7215664089e-02, /* 0xbd9e233f */ u1 = 6.3282704353e-01, /* 0x3f2200f4 */ u2 = 1.4549225569e+00, /* 0x3fba3ae7 */ u3 = 9.7771751881e-01, /* 0x3f7a4bb2 */ u4 = 2.2896373272e-01, /* 0x3e6a7578 */ u5 = 1.3381091878e-02, /* 0x3c5b3c5e */ v1 = 2.4559779167e+00, /* 0x401d2ebe */ v2 = 2.1284897327e+00, /* 0x4008392d */ v3 = 7.6928514242e-01, /* 0x3f44efdf */ v4 = 1.0422264785e-01, /* 0x3dd572af */ v5 = 3.2170924824e-03, /* 0x3b52d5db */ s0 = -7.7215664089e-02, /* 0xbd9e233f */ s1 = 2.1498242021e-01, /* 0x3e5c245a */ s2 = 3.2577878237e-01, /* 0x3ea6cc7a */ s3 = 1.4635047317e-01, /* 0x3e15dce6 */ s4 = 2.6642270386e-02, /* 0x3cda40e4 */ s5 = 1.8402845599e-03, /* 0x3af135b4 */ s6 = 3.1947532989e-05, /* 0x3805ff67 */ r1 = 1.3920053244e+00, /* 0x3fb22d3b */ r2 = 7.2193557024e-01, /* 0x3f38d0c5 */ r3 = 1.7193385959e-01, /* 0x3e300f6e */ r4 = 1.8645919859e-02, /* 0x3c98bf54 */ r5 = 7.7794247773e-04, /* 0x3a4beed6 */ r6 = 7.3266842264e-06, /* 0x36f5d7bd */ w0 = 4.1893854737e-01, /* 0x3ed67f1d */ w1 = 8.3333335817e-02, /* 0x3daaaaab */ w2 = -2.7777778450e-03, /* 0xbb360b61 */ w3 = 7.9365057172e-04, /* 0x3a500cfd */ w4 = -5.9518753551e-04, /* 0xba1c065c */ w5 = 8.3633989561e-04, /* 0x3a5b3dd2 */ w6 = -1.6309292987e-03; /* 0xbad5c4e8 */ #ifdef __STDC__ static const float zero= 0.0000000000e+00; #else static float zero= 0.0000000000e+00; #endif #ifdef __STDC__ static float sin_pif(float x) #else static float sin_pif(x) float x; #endif { float y,z; __int32_t n,ix; GET_FLOAT_WORD(ix,x); ix &= 0x7fffffff; if(ix<0x3e800000) return __kernel_sinf(pi*x,zero,0); y = -x; /* x is assume negative */ /* * argument reduction, make sure inexact flag not raised if input * is an integer */ z = floorf(y); if(z!=y) { /* inexact anyway */ y *= (float)0.5; y = (float)2.0*(y - floorf(y)); /* y = |x| mod 2.0 */ n = (__int32_t) (y*(float)4.0); } else { if(ix>=0x4b800000) { y = zero; n = 0; /* y must be even */ } else { if(ix<0x4b000000) z = y+two23; /* exact */ GET_FLOAT_WORD(n,z); n &= 1; y = n; n<<= 2; } } switch (n) { case 0: y = __kernel_sinf(pi*y,zero,0); break; case 1: case 2: y = __kernel_cosf(pi*((float)0.5-y),zero); break; case 3: case 4: y = __kernel_sinf(pi*(one-y),zero,0); break; case 5: case 6: y = -__kernel_cosf(pi*(y-(float)1.5),zero); break; default: y = __kernel_sinf(pi*(y-(float)2.0),zero,0); break; } return -y; } #if defined(_IEEE_LIBM) && defined(HAVE_ALIAS_ATTRIBUTE) __strong_reference(__ieee754_lgammaf_r, lgammaf_r); #endif #ifdef __STDC__ float __ieee754_lgammaf_r(float x, int *signgamp) #else float __ieee754_lgammaf_r(x,signgamp) float x; int *signgamp; #endif { float t,y,z,nadj = 0.0,p,p1,p2,p3,q,r,w; __int32_t i,hx,ix; GET_FLOAT_WORD(hx,x); /* purge off +-inf, NaN, +-0, and negative arguments */ *signgamp = 1; ix = hx&0x7fffffff; if(ix>=0x7f800000) return x*x; if(ix==0) return one/zero; if(ix<0x1c800000) { /* |x|<2**-70, return -log(|x|) */ if(hx<0) { *signgamp = -1; return -__ieee754_logf(-x); } else return -__ieee754_logf(x); } if(hx<0) { if(ix>=0x4b000000) /* |x|>=2**23, must be -integer */ return one/zero; t = sin_pif(x); if(t==zero) return one/zero; /* -integer */ nadj = __ieee754_logf(pi/fabsf(t*x)); if(t=0x3f3b4a20) {y = one-x; i= 0;} else if(ix>=0x3e6d3308) {y= x-(tc-one); i=1;} else {y = x; i=2;} } else { r = zero; if(ix>=0x3fdda618) {y=(float)2.0-x;i=0;} /* [1.7316,2] */ else if(ix>=0x3F9da620) {y=x-tc;i=1;} /* [1.23,1.73] */ else {y=x-one;i=2;} } switch(i) { case 0: z = y*y; p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*a10)))); p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11))))); p = y*p1+p2; r += (p-(float)0.5*y); break; case 1: z = y*y; w = z*y; p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12))); /* parallel comp */ p2 = t1+w*(t4+w*(t7+w*(t10+w*t13))); p3 = t2+w*(t5+w*(t8+w*(t11+w*t14))); p = z*p1-(tt-w*(p2+y*p3)); r += (tf + p); break; case 2: p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5))))); p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5)))); r += (-(float)0.5*y + p1/p2); } } else if(ix<0x41000000) { /* x < 8.0 */ i = (__int32_t)x; t = zero; y = x-(float)i; p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6)))))); q = one+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6))))); r = half*y+p/q; z = one; /* lgamma(1+s) = log(s) + lgamma(s) */ switch(i) { case 7: z *= (y+(float)6.0); /* FALLTHRU */ case 6: z *= (y+(float)5.0); /* FALLTHRU */ case 5: z *= (y+(float)4.0); /* FALLTHRU */ case 4: z *= (y+(float)3.0); /* FALLTHRU */ case 3: z *= (y+(float)2.0); /* FALLTHRU */ r += __ieee754_logf(z); break; } /* 8.0 <= x < 2**58 */ } else if (ix < 0x5c800000) { t = __ieee754_logf(x); z = one/x; y = z*z; w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6))))); r = (x-half)*(t-one)+w; } else /* 2**58 <= x <= inf */ r = x*(__ieee754_logf(x)-one); if(hx<0) r = nadj - r; return r; } snek-1.1/chips/atmega/exp2.c000066400000000000000000000011471353657467200157260ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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 2 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. */ float exp2f(float x) { return powf(2.0f, x); } snek-1.1/chips/atmega/fdlibm.h000066400000000000000000000306561353657467200163210ustar00rootroot00000000000000 /* @(#)fdlibm.h 5.1 93/09/24 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* REDHAT LOCAL: Include files. */ #include #include #include #include #include typedef int32_t __int32_t; typedef uint32_t __uint32_t; typedef float double_t; /* REDHAT LOCAL: Default to XOPEN_MODE. */ #define _XOPEN_MODE /* Most routines need to check whether a float is finite, infinite, or not a number, and many need to know whether the result of an operation will overflow. These conditions depend on whether the largest exponent is used for NaNs & infinities, or whether it's used for finite numbers. The macros below wrap up that kind of information: FLT_UWORD_IS_FINITE(X) True if a positive float with bitmask X is finite. FLT_UWORD_IS_NAN(X) True if a positive float with bitmask X is not a number. FLT_UWORD_IS_INFINITE(X) True if a positive float with bitmask X is +infinity. FLT_UWORD_MAX The bitmask of FLT_MAX. FLT_UWORD_HALF_MAX The bitmask of FLT_MAX/2. FLT_UWORD_EXP_MAX The bitmask of the largest finite exponent (129 if the largest exponent is used for finite numbers, 128 otherwise). FLT_UWORD_LOG_MAX The bitmask of log(FLT_MAX), rounded down. This value is the largest input that can be passed to exp() without producing overflow. FLT_UWORD_LOG_2MAX The bitmask of log(2*FLT_MAX), rounded down. This value is the largest input than can be passed to cosh() without producing overflow. FLT_LARGEST_EXP The largest biased exponent that can be used for finite numbers (255 if the largest exponent is used for finite numbers, 254 otherwise) */ #ifdef _FLT_LARGEST_EXPONENT_IS_NORMAL #define FLT_UWORD_IS_FINITE(x) 1 #define FLT_UWORD_IS_NAN(x) 0 #define FLT_UWORD_IS_INFINITE(x) 0 #define FLT_UWORD_MAX 0x7fffffff #define FLT_UWORD_EXP_MAX 0x43010000 #define FLT_UWORD_LOG_MAX 0x42b2d4fc #define FLT_UWORD_LOG_2MAX 0x42b437e0 #define HUGE ((float)0X1.FFFFFEP128) #else #define FLT_UWORD_IS_FINITE(x) ((x)<0x7f800000L) #define FLT_UWORD_IS_NAN(x) ((x)>0x7f800000L) #define FLT_UWORD_IS_INFINITE(x) ((x)==0x7f800000L) #define FLT_UWORD_MAX 0x7f7fffffL #define FLT_UWORD_EXP_MAX 0x43000000 #define FLT_UWORD_LOG_MAX 0x42b17217 #define FLT_UWORD_LOG_2MAX 0x42b2d4fc #define HUGE ((float)3.40282346638528860e+38) #endif #define FLT_UWORD_HALF_MAX (FLT_UWORD_MAX-(1L<<23)) #define FLT_LARGEST_EXP (FLT_UWORD_MAX>>23) /* Many routines check for zero and subnormal numbers. Such things depend on whether the target supports denormals or not: FLT_UWORD_IS_ZERO(X) True if a positive float with bitmask X is +0. Without denormals, any float with a zero exponent is a +0 representation. With denormals, the only +0 representation is a 0 bitmask. FLT_UWORD_IS_SUBNORMAL(X) True if a non-zero positive float with bitmask X is subnormal. (Routines should check for zeros first.) FLT_UWORD_MIN The bitmask of the smallest float above +0. Call this number REAL_FLT_MIN... FLT_UWORD_EXP_MIN The bitmask of the float representation of REAL_FLT_MIN's exponent. FLT_UWORD_LOG_MIN The bitmask of |log(REAL_FLT_MIN)|, rounding down. FLT_SMALLEST_EXP REAL_FLT_MIN's exponent - EXP_BIAS (1 if denormals are not supported, -22 if they are). */ #ifdef _FLT_NO_DENORMALS #define FLT_UWORD_IS_ZERO(x) ((x)<0x00800000L) #define FLT_UWORD_IS_SUBNORMAL(x) 0 #define FLT_UWORD_MIN 0x00800000 #define FLT_UWORD_EXP_MIN 0x42fc0000 #define FLT_UWORD_LOG_MIN 0x42aeac50 #define FLT_SMALLEST_EXP 1 #else #define FLT_UWORD_IS_ZERO(x) ((x)==0) #define FLT_UWORD_IS_SUBNORMAL(x) ((x)<0x00800000L) #define FLT_UWORD_MIN 0x00000001 #define FLT_UWORD_EXP_MIN 0x43160000 #define FLT_UWORD_LOG_MIN 0x42cff1b5 #define FLT_SMALLEST_EXP -22 #endif #ifdef __STDC__ #undef __P #define __P(p) p #else #define __P(p) () #endif /* * set X_TLOSS = pi*2**52, which is possibly defined in * (one may replace the following line by "#include ") */ #define X_TLOSS 1.41484755040568800000e+16 /* Functions that are not documented, and are not in . */ #ifdef _SCALB_INT extern double scalb __P((double, int)); #else extern double scalb __P((double, double)); #endif extern double significand __P((double)); extern long double __ieee754_hypotl __P((long double, long double)); /* ieee style elementary functions */ extern double __ieee754_sqrt __P((double)); extern double __ieee754_acos __P((double)); extern double __ieee754_acosh __P((double)); extern double __ieee754_log __P((double)); extern double __ieee754_atanh __P((double)); extern double __ieee754_asin __P((double)); extern double __ieee754_atan2 __P((double,double)); extern double __ieee754_exp __P((double)); extern double __ieee754_cosh __P((double)); extern double __ieee754_fmod __P((double,double)); extern double __ieee754_pow __P((double,double)); extern double __ieee754_lgamma_r __P((double,int *)); extern double __ieee754_gamma_r __P((double,int *)); extern double __ieee754_log10 __P((double)); extern double __ieee754_sinh __P((double)); extern double __ieee754_hypot __P((double,double)); extern double __ieee754_j0 __P((double)); extern double __ieee754_j1 __P((double)); extern double __ieee754_y0 __P((double)); extern double __ieee754_y1 __P((double)); extern double __ieee754_jn __P((int,double)); extern double __ieee754_yn __P((int,double)); extern double __ieee754_remainder __P((double,double)); extern __int32_t __ieee754_rem_pio2 __P((double,double*)); #ifdef _SCALB_INT extern double __ieee754_scalb __P((double,int)); #else extern double __ieee754_scalb __P((double,double)); #endif /* fdlibm kernel function */ extern double __kernel_standard __P((double,double,int)); extern double __kernel_sin __P((double,double,int)); extern double __kernel_cos __P((double,double)); extern double __kernel_tan __P((double,double,int)); extern int __kernel_rem_pio2 __P((double*,double*,int,int,int,const __int32_t*)); /* Undocumented float functions. */ #ifdef _SCALB_INT extern float scalbf __P((float, int)); #else extern float scalbf __P((float, float)); #endif extern float significandf __P((float)); /* ieee style elementary float functions */ extern float __ieee754_sqrtf __P((float)); extern float __ieee754_acosf __P((float)); extern float __ieee754_acoshf __P((float)); extern float __ieee754_logf __P((float)); extern float __ieee754_atanhf __P((float)); extern float __ieee754_asinf __P((float)); extern float __ieee754_atan2f __P((float,float)); extern float __ieee754_expf __P((float)); extern float __ieee754_coshf __P((float)); extern float __ieee754_fmodf __P((float,float)); extern float __ieee754_powf __P((float,float)); extern float __ieee754_lgammaf_r __P((float,int *)); extern float __ieee754_gammaf_r __P((float,int *)); extern float __ieee754_log10f __P((float)); extern float __ieee754_sinhf __P((float)); extern float __ieee754_hypotf __P((float,float)); extern float __ieee754_j0f __P((float)); extern float __ieee754_j1f __P((float)); extern float __ieee754_y0f __P((float)); extern float __ieee754_y1f __P((float)); extern float __ieee754_jnf __P((int,float)); extern float __ieee754_ynf __P((int,float)); extern float __ieee754_remainderf __P((float,float)); extern __int32_t __ieee754_rem_pio2f __P((float,float*)); #ifdef _SCALB_INT extern float __ieee754_scalbf __P((float,int)); #else extern float __ieee754_scalbf __P((float,float)); #endif #if !__OBSOLETE_MATH /* The new math code does not provide separate wrapper function for error handling, so the extern symbol is called directly. This is valid as long as there are no namespace issues (the extern symbol is reserved whenever the caller is reserved) and there are no observable error handling side effects. */ # define __ieee754_exp(x) exp(x) # define __ieee754_log(x) log(x) # define __ieee754_pow(x,y) pow(x,y) # define __ieee754_expf(x) expf(x) # define __ieee754_logf(x) logf(x) # define __ieee754_powf(x,y) powf(x,y) #endif /* float versions of fdlibm kernel functions */ extern float __kernel_sinf __P((float,float,int)); extern float __kernel_cosf __P((float,float)); extern float __kernel_tanf __P((float,float,int)); extern int __kernel_rem_pio2f __P((float*,float*,int,int,int,const __int32_t*)); /* The original code used statements like n0 = ((*(int*)&one)>>29)^1; * index of high word * ix0 = *(n0+(int*)&x); * high word of x * ix1 = *((1-n0)+(int*)&x); * low word of x * to dig two 32 bit words out of the 64 bit IEEE floating point value. That is non-ANSI, and, moreover, the gcc instruction scheduler gets it wrong. We instead use the following macros. Unlike the original code, we determine the endianness at compile time, not at run time; I don't see much benefit to selecting endianness at run time. */ #ifndef __IEEE_BIG_ENDIAN #ifndef __IEEE_LITTLE_ENDIAN #error Must define endianness #endif #endif /* A union which permits us to convert between a double and two 32 bit ints. */ #ifdef __IEEE_BIG_ENDIAN typedef union { double value; struct { __uint32_t msw; __uint32_t lsw; } parts; } ieee_double_shape_type; #endif #ifdef __IEEE_LITTLE_ENDIAN typedef union { double value; struct { __uint32_t lsw; __uint32_t msw; } parts; } ieee_double_shape_type; #endif /* Get two 32 bit ints from a double. */ #define EXTRACT_WORDS(ix0,ix1,d) \ do { \ ieee_double_shape_type ew_u; \ ew_u.value = (d); \ (ix0) = ew_u.parts.msw; \ (ix1) = ew_u.parts.lsw; \ } while (0) /* Get the more significant 32 bit int from a double. */ #define GET_HIGH_WORD(i,d) \ do { \ ieee_double_shape_type gh_u; \ gh_u.value = (d); \ (i) = gh_u.parts.msw; \ } while (0) /* Get the less significant 32 bit int from a double. */ #define GET_LOW_WORD(i,d) \ do { \ ieee_double_shape_type gl_u; \ gl_u.value = (d); \ (i) = gl_u.parts.lsw; \ } while (0) /* Set a double from two 32 bit ints. */ #define INSERT_WORDS(d,ix0,ix1) \ do { \ ieee_double_shape_type iw_u; \ iw_u.parts.msw = (ix0); \ iw_u.parts.lsw = (ix1); \ (d) = iw_u.value; \ } while (0) /* Set the more significant 32 bits of a double from an int. */ #define SET_HIGH_WORD(d,v) \ do { \ ieee_double_shape_type sh_u; \ sh_u.value = (d); \ sh_u.parts.msw = (v); \ (d) = sh_u.value; \ } while (0) /* Set the less significant 32 bits of a double from an int. */ #define SET_LOW_WORD(d,v) \ do { \ ieee_double_shape_type sl_u; \ sl_u.value = (d); \ sl_u.parts.lsw = (v); \ (d) = sl_u.value; \ } while (0) /* A union which permits us to convert between a float and a 32 bit int. */ typedef union { float value; __uint32_t word; } ieee_float_shape_type; /* Get a 32 bit int from a float. */ #define GET_FLOAT_WORD(i,d) \ do { \ ieee_float_shape_type gf_u; \ gf_u.value = (d); \ (i) = gf_u.word; \ } while (0) /* Set a float from a 32 bit int. */ #define SET_FLOAT_WORD(d,i) \ do { \ ieee_float_shape_type sf_u; \ sf_u.word = (i); \ (d) = sf_u.value; \ } while (0) /* Macros to avoid undefined behaviour that can arise if the amount of a shift is exactly equal to the size of the shifted operand. */ #define SAFE_LEFT_SHIFT(op,amt) \ (((amt) < 8 * sizeof(op)) ? ((op) << (amt)) : 0) #define SAFE_RIGHT_SHIFT(op,amt) \ (((amt) < 8 * sizeof(op)) ? ((op) >> (amt)) : 0) #ifdef _COMPLEX_H /* * Quoting from ISO/IEC 9899:TC2: * * 6.2.5.13 Types * Each complex type has the same representation and alignment requirements as * an array type containing exactly two elements of the corresponding real type; * the first element is equal to the real part, and the second element to the * imaginary part, of the complex number. */ typedef union { float complex z; float parts[2]; } float_complex; typedef union { double complex z; double parts[2]; } double_complex; typedef union { long double complex z; long double parts[2]; } long_double_complex; #define REAL_PART(z) ((z).parts[0]) #define IMAG_PART(z) ((z).parts[1]) #endif /* _COMPLEX_H */ #define __ieee754_fmodf fmodf snek-1.1/chips/atmega/kf_cos.c000066400000000000000000000030571353657467200163160ustar00rootroot00000000000000/* kf_cos.c -- float version of k_cos.c * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ #include "fdlibm.h" #ifdef __STDC__ static const float #else static float #endif one = 1.0000000000e+00, /* 0x3f800000 */ C1 = 4.1666667908e-02, /* 0x3d2aaaab */ C2 = -1.3888889225e-03, /* 0xbab60b61 */ C3 = 2.4801587642e-05, /* 0x37d00d01 */ C4 = -2.7557314297e-07, /* 0xb493f27c */ C5 = 2.0875723372e-09, /* 0x310f74f6 */ C6 = -1.1359647598e-11; /* 0xad47d74e */ #ifdef __STDC__ float __kernel_cosf(float x, float y) #else float __kernel_cosf(x, y) float x,y; #endif { float a,hz,z,r,qx; __int32_t ix; GET_FLOAT_WORD(ix,x); ix &= 0x7fffffff; /* ix = |x|'s high word*/ if(ix<0x32000000) { /* if x < 2**27 */ if(((int)x)==0) return one; /* generate inexact */ } z = x*x; r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6))))); if(ix < 0x3e99999a) /* if |x| < 0.3 */ return one - ((float)0.5*z - (z*r - x*y)); else { if(ix > 0x3f480000) { /* x > 0.78125 */ qx = (float)0.28125; } else { SET_FLOAT_WORD(qx,ix-0x01000000); /* x/4 */ } hz = (float)0.5*z-qx; a = one-qx; return a - (hz - (z*r-x*y)); } } snek-1.1/chips/atmega/kf_sin.c000066400000000000000000000025231353657467200163200ustar00rootroot00000000000000/* kf_sin.c -- float version of k_sin.c * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ #include "fdlibm.h" #ifdef __STDC__ static const float #else static float #endif half = 5.0000000000e-01,/* 0x3f000000 */ S1 = -1.6666667163e-01, /* 0xbe2aaaab */ S2 = 8.3333337680e-03, /* 0x3c088889 */ S3 = -1.9841270114e-04, /* 0xb9500d01 */ S4 = 2.7557314297e-06, /* 0x3638ef1b */ S5 = -2.5050759689e-08, /* 0xb2d72f34 */ S6 = 1.5896910177e-10; /* 0x2f2ec9d3 */ #ifdef __STDC__ float __kernel_sinf(float x, float y, int iy) #else float __kernel_sinf(x, y, iy) float x,y; int iy; /* iy=0 if y is zero */ #endif { float z,r,v; __int32_t ix; GET_FLOAT_WORD(ix,x); ix &= 0x7fffffff; /* high word of x */ if(ix<0x32000000) /* |x| < 2**-27 */ {if((int)x==0) return x;} /* generate inexact */ z = x*x; v = z*x; r = S2+z*(S3+z*(S4+z*(S5+z*S6))); if(iy==0) return x+v*(S1+z*r); else return x-((z*(half*y-v*r)-y)-v*S1); } snek-1.1/chips/atmega/math_config.h000066400000000000000000000247451353657467200173440ustar00rootroot00000000000000/* Configuration for math routines. Copyright (c) 2017-2018 Arm Ltd. All rights reserved. SPDX-License-Identifier: BSD-3-Clause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the company may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _MATH_CONFIG_H #define _MATH_CONFIG_H #include #include #ifndef WANT_ROUNDING /* Correct special case results in non-nearest rounding modes. */ # define WANT_ROUNDING 1 #endif #ifndef WANT_ERRNO /* Set errno according to ISO C with (math_errhandling & MATH_ERRNO) != 0. */ # define WANT_ERRNO 1 #endif #ifndef WANT_ERRNO_UFLOW /* Set errno to ERANGE if result underflows to 0 (in all rounding modes). */ # define WANT_ERRNO_UFLOW (WANT_ROUNDING && WANT_ERRNO) #endif /* Compiler can inline round as a single instruction. */ #ifndef HAVE_FAST_ROUND # if __aarch64__ # define HAVE_FAST_ROUND 1 # else # define HAVE_FAST_ROUND 0 # endif #endif /* Compiler can inline lround, but not (long)round(x). */ #ifndef HAVE_FAST_LROUND # if __aarch64__ && (100*__GNUC__ + __GNUC_MINOR__) >= 408 && __NO_MATH_ERRNO__ # define HAVE_FAST_LROUND 1 # else # define HAVE_FAST_LROUND 0 # endif #endif /* Compiler can inline fma as a single instruction. */ #ifndef HAVE_FAST_FMA # if __aarch64__ || __ARM_FEATURE_FMA # define HAVE_FAST_FMA 1 # else # define HAVE_FAST_FMA 0 # endif #endif #if HAVE_FAST_ROUND /* When set, the roundtoint and converttoint functions are provided with the semantics documented below. */ # define TOINT_INTRINSICS 1 /* Round x to nearest int in all rounding modes, ties have to be rounded consistently with converttoint so the results match. If the result would be outside of [-2^31, 2^31-1] then the semantics is unspecified. */ static inline double_t roundtoint (double_t x) { return round (x); } /* Convert x to nearest int in all rounding modes, ties have to be rounded consistently with roundtoint. If the result is not representible in an int32_t then the semantics is unspecified. */ static inline int32_t converttoint (double_t x) { # if HAVE_FAST_LROUND return lround (x); # else return (long) round (x); # endif } #endif #ifndef TOINT_INTRINSICS # define TOINT_INTRINSICS 0 #endif static inline uint32_t asuint (float f) { union { float f; uint32_t i; } u = {f}; return u.i; } static inline float asfloat (uint32_t i) { union { uint32_t i; float f; } u = {i}; return u.f; } static inline uint64_t asuint64 (double f) { union { double f; uint64_t i; } u = {f}; return u.i; } static inline double asdouble (uint64_t i) { union { uint64_t i; double f; } u = {i}; return u.f; } #ifndef IEEE_754_2008_SNAN # define IEEE_754_2008_SNAN 1 #endif static inline int issignalingf_inline (float x) { uint32_t ix = asuint (x); if (!IEEE_754_2008_SNAN) return (ix & 0x7fc00000) == 0x7fc00000; return 2 * (ix ^ 0x00400000) > 0xFF800000u; } static inline int issignaling_inline (double x) { uint64_t ix = asuint64 (x); if (!IEEE_754_2008_SNAN) return (ix & 0x7ff8000000000000) == 0x7ff8000000000000; return 2 * (ix ^ 0x0008000000000000) > 2 * 0x7ff8000000000000ULL; } #if __aarch64__ && __GNUC__ /* Prevent the optimization of a floating-point expression. */ static inline float opt_barrier_float (float x) { __asm__ __volatile__ ("" : "+w" (x)); return x; } static inline double opt_barrier_double (double x) { __asm__ __volatile__ ("" : "+w" (x)); return x; } /* Force the evaluation of a floating-point expression for its side-effect. */ static inline void force_eval_float (float x) { __asm__ __volatile__ ("" : "+w" (x)); } static inline void force_eval_double (double x) { __asm__ __volatile__ ("" : "+w" (x)); } #else static inline float opt_barrier_float (float x) { volatile float y = x; return y; } static inline double opt_barrier_double (double x) { volatile double y = x; return y; } #pragma GCC diagnostic ignored "-Wunused-variable" static inline void force_eval_float (float x) { volatile float y = x; } static inline void force_eval_double (double x) { volatile double y = x; } #pragma GCC diagnostic pop #endif /* Evaluate an expression as the specified type, normally a type cast should be enough, but compilers implement non-standard excess-precision handling, so when FLT_EVAL_METHOD != 0 then these functions may need to be customized. */ static inline float eval_as_float (float x) { return x; } static inline double eval_as_double (double x) { return x; } #ifdef __GNUC__ # define NOINLINE __attribute__ ((noinline)) # define likely(x) __builtin_expect (!!(x), 1) # define unlikely(x) __builtin_expect (x, 0) #else # define NOINLINE # define likely(x) (x) # define unlikely(x) (x) #endif /* gcc emitting PE/COFF doesn't support visibility */ #if defined (__GNUC__) && !defined (__CYGWIN__) # define HIDDEN __attribute__ ((__visibility__ ("hidden"))) #else # define HIDDEN #endif /* Error handling tail calls for special cases, with a sign argument. The sign of the return value is set if the argument is non-zero. */ /* The result overflows. */ HIDDEN float __math_oflowf (uint32_t); /* The result underflows to 0 in nearest rounding mode. */ HIDDEN float __math_uflowf (uint32_t); /* The result underflows to 0 in some directed rounding mode only. */ HIDDEN float __math_may_uflowf (uint32_t); /* The result overflows. */ HIDDEN double __math_oflow (uint32_t); /* The result underflows to 0 in nearest rounding mode. */ HIDDEN double __math_uflow (uint32_t); /* The result underflows to 0 in some directed rounding mode only. */ HIDDEN double __math_may_uflow (uint32_t); /* Division by zero. */ HIDDEN double __math_divzero (uint32_t); /* Error handling using input checking. */ /* Error handling using output checking, only for errno setting. */ /* Check if the result overflowed to infinity. */ HIDDEN double __math_check_oflow (double); /* Check if the result underflowed to 0. */ HIDDEN double __math_check_uflow (double); /* Check if the result overflowed to infinity. */ static inline double check_oflow (double x) { return WANT_ERRNO ? __math_check_oflow (x) : x; } /* Check if the result underflowed to 0. */ static inline double check_uflow (double x) { return WANT_ERRNO ? __math_check_uflow (x) : x; } /* Shared between expf, exp2f and powf. */ #define EXP2F_TABLE_BITS 5 #define EXP2F_POLY_ORDER 3 extern const struct exp2f_data { uint64_t tab[1 << EXP2F_TABLE_BITS]; double shift_scaled; double poly[EXP2F_POLY_ORDER]; double shift; double invln2_scaled; double poly_scaled[EXP2F_POLY_ORDER]; } __exp2f_data HIDDEN; #define LOGF_TABLE_BITS 4 #define LOGF_POLY_ORDER 4 extern const struct logf_data { struct { double invc, logc; } tab[1 << LOGF_TABLE_BITS]; double ln2; double poly[LOGF_POLY_ORDER - 1]; /* First order coefficient is 1. */ } __logf_data HIDDEN; #define LOG2F_TABLE_BITS 4 #define LOG2F_POLY_ORDER 4 extern const struct log2f_data { struct { double invc, logc; } tab[1 << LOG2F_TABLE_BITS]; double poly[LOG2F_POLY_ORDER]; } __log2f_data HIDDEN; #define POWF_LOG2_TABLE_BITS 4 #define POWF_LOG2_POLY_ORDER 5 #if TOINT_INTRINSICS # define POWF_SCALE_BITS EXP2F_TABLE_BITS #else # define POWF_SCALE_BITS 0 #endif #define POWF_SCALE ((double) (1 << POWF_SCALE_BITS)) extern const struct powf_log2_data { struct { double invc, logc; } tab[1 << POWF_LOG2_TABLE_BITS]; double poly[POWF_LOG2_POLY_ORDER]; } __powf_log2_data HIDDEN; #define EXP_TABLE_BITS 7 #define EXP_POLY_ORDER 5 /* Use polynomial that is optimized for a wider input range. This may be needed for good precision in non-nearest rounding and !TOINT_INTRINSICS. */ #define EXP_POLY_WIDE 0 /* Use close to nearest rounding toint when !TOINT_INTRINSICS. This may be needed for good precision in non-nearest rouning and !EXP_POLY_WIDE. */ #define EXP_USE_TOINT_NARROW 0 #define EXP2_POLY_ORDER 5 #define EXP2_POLY_WIDE 0 extern const struct exp_data { double invln2N; double shift; double negln2hiN; double negln2loN; double poly[4]; /* Last four coefficients. */ double exp2_shift; double exp2_poly[EXP2_POLY_ORDER]; uint64_t tab[2*(1 << EXP_TABLE_BITS)]; } __exp_data HIDDEN; #define LOG_TABLE_BITS 7 #define LOG_POLY_ORDER 6 #define LOG_POLY1_ORDER 12 extern const struct log_data { double ln2hi; double ln2lo; double poly[LOG_POLY_ORDER - 1]; /* First coefficient is 1. */ double poly1[LOG_POLY1_ORDER - 1]; struct {double invc, logc;} tab[1 << LOG_TABLE_BITS]; #if !HAVE_FAST_FMA struct {double chi, clo;} tab2[1 << LOG_TABLE_BITS]; #endif } __log_data HIDDEN; #define LOG2_TABLE_BITS 6 #define LOG2_POLY_ORDER 7 #define LOG2_POLY1_ORDER 11 extern const struct log2_data { double invln2hi; double invln2lo; double poly[LOG2_POLY_ORDER - 1]; double poly1[LOG2_POLY1_ORDER - 1]; struct {double invc, logc;} tab[1 << LOG2_TABLE_BITS]; #if !HAVE_FAST_FMA struct {double chi, clo;} tab2[1 << LOG2_TABLE_BITS]; #endif } __log2_data HIDDEN; #define POW_LOG_TABLE_BITS 7 #define POW_LOG_POLY_ORDER 8 extern const struct pow_log_data { double ln2hi; double ln2lo; double poly[POW_LOG_POLY_ORDER - 1]; /* First coefficient is 1. */ /* Note: the pad field is unused, but allows slightly faster indexing. */ struct {double invc, pad, logc, logctail;} tab[1 << POW_LOG_TABLE_BITS]; } __pow_log_data HIDDEN; #endif snek-1.1/chips/atmega/sf_asinh.c000066400000000000000000000030631353657467200166410ustar00rootroot00000000000000/* sf_asinh.c -- float version of s_asinh.c. * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ #include "fdlibm.h" #ifdef __STDC__ static const float #else static float #endif one = 1.0000000000e+00, /* 0x3F800000 */ ln2 = 6.9314718246e-01, /* 0x3f317218 */ huge= 1.0000000000e+30; #ifdef __STDC__ float asinhf(float x) #else float asinhf(x) float x; #endif { float t,w; __int32_t hx,ix; GET_FLOAT_WORD(hx,x); ix = hx&0x7fffffff; if(!FLT_UWORD_IS_FINITE(ix)) return x+x; /* x is inf or NaN */ if(ix< 0x31800000) { /* |x|<2**-28 */ if(huge+x>one) return x; /* return x inexact except 0 */ } if(ix>0x4d800000) { /* |x| > 2**28 */ w = __ieee754_logf(fabsf(x))+ln2; } else if (ix>0x40000000) { /* 2**28 > |x| > 2.0 */ t = fabsf(x); w = __ieee754_logf((float)2.0*t+one/(__ieee754_sqrtf(x*x+one)+t)); } else { /* 2.0 > |x| > 2**-28 */ t = x*x; w =log1pf(fabsf(x)+t/(one+__ieee754_sqrtf(one+t))); } if(hx>0) return w; else return -w; } #ifdef _DOUBLE_IS_32BITS #ifdef __STDC__ double asinh(double x) #else double asinh(x) double x; #endif { return (double) asinhf((float) x); } #endif /* defined(_DOUBLE_IS_32BITS) */ snek-1.1/chips/atmega/sf_erf.c000066400000000000000000000157761353657467200163310ustar00rootroot00000000000000/* sf_erf.c -- float version of s_erf.c. * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ #include "fdlibm.h" #ifdef __v810__ #define const #endif #ifdef __STDC__ static const float #else static float #endif tiny = 1e-30, half= 5.0000000000e-01, /* 0x3F000000 */ one = 1.0000000000e+00, /* 0x3F800000 */ two = 2.0000000000e+00, /* 0x40000000 */ /* c = (subfloat)0.84506291151 */ erx = 8.4506291151e-01, /* 0x3f58560b */ /* * Coefficients for approximation to erf on [0,0.84375] */ efx = 1.2837916613e-01, /* 0x3e0375d4 */ efx8= 1.0270333290e+00, /* 0x3f8375d4 */ pp0 = 1.2837916613e-01, /* 0x3e0375d4 */ pp1 = -3.2504209876e-01, /* 0xbea66beb */ pp2 = -2.8481749818e-02, /* 0xbce9528f */ pp3 = -5.7702702470e-03, /* 0xbbbd1489 */ pp4 = -2.3763017452e-05, /* 0xb7c756b1 */ qq1 = 3.9791721106e-01, /* 0x3ecbbbce */ qq2 = 6.5022252500e-02, /* 0x3d852a63 */ qq3 = 5.0813062117e-03, /* 0x3ba68116 */ qq4 = 1.3249473704e-04, /* 0x390aee49 */ qq5 = -3.9602282413e-06, /* 0xb684e21a */ /* * Coefficients for approximation to erf in [0.84375,1.25] */ pa0 = -2.3621185683e-03, /* 0xbb1acdc6 */ pa1 = 4.1485610604e-01, /* 0x3ed46805 */ pa2 = -3.7220788002e-01, /* 0xbebe9208 */ pa3 = 3.1834661961e-01, /* 0x3ea2fe54 */ pa4 = -1.1089469492e-01, /* 0xbde31cc2 */ pa5 = 3.5478305072e-02, /* 0x3d1151b3 */ pa6 = -2.1663755178e-03, /* 0xbb0df9c0 */ qa1 = 1.0642088205e-01, /* 0x3dd9f331 */ qa2 = 5.4039794207e-01, /* 0x3f0a5785 */ qa3 = 7.1828655899e-02, /* 0x3d931ae7 */ qa4 = 1.2617121637e-01, /* 0x3e013307 */ qa5 = 1.3637083583e-02, /* 0x3c5f6e13 */ qa6 = 1.1984500103e-02, /* 0x3c445aa3 */ /* * Coefficients for approximation to erfc in [1.25,1/0.35] */ ra0 = -9.8649440333e-03, /* 0xbc21a093 */ ra1 = -6.9385856390e-01, /* 0xbf31a0b7 */ ra2 = -1.0558626175e+01, /* 0xc128f022 */ ra3 = -6.2375331879e+01, /* 0xc2798057 */ ra4 = -1.6239666748e+02, /* 0xc322658c */ ra5 = -1.8460508728e+02, /* 0xc3389ae7 */ ra6 = -8.1287437439e+01, /* 0xc2a2932b */ ra7 = -9.8143291473e+00, /* 0xc11d077e */ sa1 = 1.9651271820e+01, /* 0x419d35ce */ sa2 = 1.3765776062e+02, /* 0x4309a863 */ sa3 = 4.3456588745e+02, /* 0x43d9486f */ sa4 = 6.4538726807e+02, /* 0x442158c9 */ sa5 = 4.2900814819e+02, /* 0x43d6810b */ sa6 = 1.0863500214e+02, /* 0x42d9451f */ sa7 = 6.5702495575e+00, /* 0x40d23f7c */ sa8 = -6.0424413532e-02, /* 0xbd777f97 */ /* * Coefficients for approximation to erfc in [1/.35,28] */ rb0 = -9.8649431020e-03, /* 0xbc21a092 */ rb1 = -7.9928326607e-01, /* 0xbf4c9dd4 */ rb2 = -1.7757955551e+01, /* 0xc18e104b */ rb3 = -1.6063638306e+02, /* 0xc320a2ea */ rb4 = -6.3756646729e+02, /* 0xc41f6441 */ rb5 = -1.0250950928e+03, /* 0xc480230b */ rb6 = -4.8351919556e+02, /* 0xc3f1c275 */ sb1 = 3.0338060379e+01, /* 0x41f2b459 */ sb2 = 3.2579251099e+02, /* 0x43a2e571 */ sb3 = 1.5367296143e+03, /* 0x44c01759 */ sb4 = 3.1998581543e+03, /* 0x4547fdbb */ sb5 = 2.5530502930e+03, /* 0x451f90ce */ sb6 = 4.7452853394e+02, /* 0x43ed43a7 */ sb7 = -2.2440952301e+01; /* 0xc1b38712 */ #ifdef __STDC__ float erff(float x) #else float erff(x) float x; #endif { __int32_t hx,ix,i; float R,S,P,Q,s,y,z,r; GET_FLOAT_WORD(hx,x); ix = hx&0x7fffffff; if(!FLT_UWORD_IS_FINITE(ix)) { /* erf(nan)=nan */ i = ((__uint32_t)hx>>31)<<1; return (float)(1-i)+one/x; /* erf(+-inf)=+-1 */ } if(ix < 0x3f580000) { /* |x|<0.84375 */ if(ix < 0x31800000) { /* |x|<2**-28 */ if (ix < 0x04000000) /*avoid underflow */ return (float)0.125*((float)8.0*x+efx8*x); return x + efx*x; } z = x*x; r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4))); s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5)))); y = r/s; return x + x*y; } if(ix < 0x3fa00000) { /* 0.84375 <= |x| < 1.25 */ s = fabsf(x)-one; P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6))))); Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6))))); if(hx>=0) return erx + P/Q; else return -erx - P/Q; } if (ix >= 0x40c00000) { /* inf>|x|>=6 */ if(hx>=0) return one-tiny; else return tiny-one; } x = fabsf(x); s = one/(x*x); if(ix< 0x4036DB6E) { /* |x| < 1/0.35 */ R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*( ra5+s*(ra6+s*ra7)))))); S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*( sa5+s*(sa6+s*(sa7+s*sa8))))))); } else { /* |x| >= 1/0.35 */ R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*( rb5+s*rb6))))); S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*( sb5+s*(sb6+s*sb7)))))); } GET_FLOAT_WORD(ix,x); SET_FLOAT_WORD(z,ix&0xfffff000); r = __ieee754_expf(-z*z-(float)0.5625)*__ieee754_expf((z-x)*(z+x)+R/S); if(hx>=0) return one-r/x; else return r/x-one; } #ifdef __STDC__ float erfcf(float x) #else float erfcf(x) float x; #endif { __int32_t hx,ix; float R,S,P,Q,s,y,z,r; GET_FLOAT_WORD(hx,x); ix = hx&0x7fffffff; if(!FLT_UWORD_IS_FINITE(ix)) { /* erfc(nan)=nan */ /* erfc(+-inf)=0,2 */ return (float)(((__uint32_t)hx>>31)<<1)+one/x; } if(ix < 0x3f580000) { /* |x|<0.84375 */ if(ix < 0x23800000) /* |x|<2**-56 */ return one-x; z = x*x; r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4))); s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5)))); y = r/s; if(hx < 0x3e800000) { /* x<1/4 */ return one-(x+x*y); } else { r = x*y; r += (x-half); return half - r ; } } if(ix < 0x3fa00000) { /* 0.84375 <= |x| < 1.25 */ s = fabsf(x)-one; P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6))))); Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6))))); if(hx>=0) { z = one-erx; return z - P/Q; } else { z = erx+P/Q; return one+z; } } if (ix < 0x41e00000) { /* |x|<28 */ x = fabsf(x); s = one/(x*x); if(ix< 0x4036DB6D) { /* |x| < 1/.35 ~ 2.857143*/ R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*( ra5+s*(ra6+s*ra7)))))); S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*( sa5+s*(sa6+s*(sa7+s*sa8))))))); } else { /* |x| >= 1/.35 ~ 2.857143 */ if(hx<0&&ix>=0x40c00000) return two-tiny;/* x < -6 */ R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*( rb5+s*rb6))))); S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*( sb5+s*(sb6+s*sb7)))))); } GET_FLOAT_WORD(ix,x); SET_FLOAT_WORD(z,ix&0xfffff000); r = __ieee754_expf(-z*z-(float)0.5625)* __ieee754_expf((z-x)*(z+x)+R/S); if(hx>0) return r/x; else return two-r/x; } else { if(hx>0) return tiny*tiny; else return two-tiny; } } #ifdef _DOUBLE_IS_32BITS #ifdef __STDC__ double erf(double x) #else double erf(x) double x; #endif { return (double) erff((float) x); } #ifdef __STDC__ double erfc(double x) #else double erfc(x) double x; #endif { return (double) erfcf((float) x); } #endif /* defined(_DOUBLE_IS_32BITS) */ snek-1.1/chips/atmega/sf_exp.c000066400000000000000000000071271353657467200163400ustar00rootroot00000000000000/* Single-precision e^x function. Copyright (c) 2017 Arm Ltd. All rights reserved. SPDX-License-Identifier: BSD-3-Clause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the company may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "fdlibm.h" #if !__OBSOLETE_MATH #include #include #include "math_config.h" /* EXP2F_TABLE_BITS = 5 EXP2F_POLY_ORDER = 3 ULP error: 0.502 (nearest rounding.) Relative error: 1.69 * 2^-34 in [-ln2/64, ln2/64] (before rounding.) Wrong count: 170635 (all nearest rounding wrong results with fma.) Non-nearest ULP error: 1 (rounded ULP error) */ #define N (1 << EXP2F_TABLE_BITS) #define InvLn2N __exp2f_data.invln2_scaled #define T __exp2f_data.tab #define C __exp2f_data.poly_scaled static inline uint32_t top12 (float x) { return asuint (x) >> 20; } float expf (float x) { uint32_t abstop; uint64_t ki, t; /* double_t for better performance on targets with FLT_EVAL_METHOD==2. */ double_t kd, xd, z, r, r2, y, s; xd = (double_t) x; abstop = top12 (x) & 0x7ff; if (__builtin_expect (abstop >= top12 (88.0f), 0)) { /* |x| >= 88 or x is nan. */ if (asuint (x) == asuint (-INFINITY)) return 0.0f; if (abstop >= top12 (INFINITY)) return x + x; if (x > 0x1.62e42ep6f) /* x > log(0x1p128) ~= 88.72 */ return __math_oflowf (0); if (x < -0x1.9fe368p6f) /* x < log(0x1p-150) ~= -103.97 */ return __math_uflowf (0); #if WANT_ERRNO_UFLOW if (x < -0x1.9d1d9ep6f) /* x < log(0x1p-149) ~= -103.28 */ return __math_may_uflowf (0); #endif } /* x*N/Ln2 = k + r with r in [-1/2, 1/2] and int k. */ z = InvLn2N * xd; /* Round and convert z to int, the result is in [-150*N, 128*N] and ideally ties-to-even rule is used, otherwise the magnitude of r can be bigger which gives larger approximation error. */ #if TOINT_INTRINSICS kd = roundtoint (z); ki = converttoint (z); #else # define SHIFT __exp2f_data.shift kd = (double) (z + SHIFT); /* Rounding to double precision is required. */ ki = asuint64 (kd); kd -= SHIFT; #endif r = z - kd; /* exp(x) = 2^(k/N) * 2^(r/N) ~= s * (C0*r^3 + C1*r^2 + C2*r + 1) */ t = T[ki % N]; t += ki << (52 - EXP2F_TABLE_BITS); s = asdouble (t); z = C[0] * r + C[1]; r2 = r * r; y = C[2] * r + 1; y = z * r2 + y; y = y * s; return (float) y; } #endif /* !__OBSOLETE_MATH */ snek-1.1/chips/atmega/sf_exp2.c000066400000000000000000000062241353657467200164170ustar00rootroot00000000000000/* Single-precision 2^x function. Copyright (c) 2017 Arm Ltd. All rights reserved. SPDX-License-Identifier: BSD-3-Clause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the company may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "fdlibm.h" #if !__OBSOLETE_MATH #include #include #include "math_config.h" /* EXP2F_TABLE_BITS = 5 EXP2F_POLY_ORDER = 3 ULP error: 0.502 (nearest rounding.) Relative error: 1.69 * 2^-34 in [-1/64, 1/64] (before rounding.) Wrong count: 168353 (all nearest rounding wrong results with fma.) Non-nearest ULP error: 1 (rounded ULP error) */ #define N (1 << EXP2F_TABLE_BITS) #define T __exp2f_data.tab #define C __exp2f_data.poly #define SHIFT __exp2f_data.shift_scaled static inline uint32_t top12 (float x) { return asuint (x) >> 20; } float exp2f (float x) { uint32_t abstop; uint64_t ki, t; /* double_t for better performance on targets with FLT_EVAL_METHOD==2. */ double_t kd, xd, z, r, r2, y, s; xd = (double_t) x; abstop = top12 (x) & 0x7ff; if (__builtin_expect (abstop >= top12 (128.0f), 0)) { /* |x| >= 128 or x is nan. */ if (asuint (x) == asuint (-INFINITY)) return 0.0f; if (abstop >= top12 (INFINITY)) return x + x; if (x > 0.0f) return __math_oflowf (0); if (x <= -150.0f) return __math_uflowf (0); #if WANT_ERRNO_UFLOW if (x < -149.0f) return __math_may_uflowf (0); #endif } /* x = k/N + r with r in [-1/(2N), 1/(2N)] and int k. */ kd = (double) (xd + SHIFT); /* Rounding to double precision is required. */ ki = asuint64 (kd); kd -= SHIFT; /* k/N for int k. */ r = xd - kd; /* exp2(x) = 2^(k/N) * 2^r ~= s * (C0*r^3 + C1*r^2 + C2*r + 1) */ t = T[ki % N]; t += ki << (52 - EXP2F_TABLE_BITS); s = asdouble (t); z = C[0] * r + C[1]; r2 = r * r; y = C[2] * r + 1; y = z * r2 + y; y = y * s; return (float) y; } #endif /* !__OBSOLETE_MATH */ snek-1.1/chips/atmega/sf_log1p.c000066400000000000000000000057641353657467200165730ustar00rootroot00000000000000/* sf_log1p.c -- float version of s_log1p.c. * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ #include "fdlibm.h" #ifdef __STDC__ static const float #else static float #endif ln2_hi = 6.9313812256e-01, /* 0x3f317180 */ ln2_lo = 9.0580006145e-06, /* 0x3717f7d1 */ two25 = 3.355443200e+07, /* 0x4c000000 */ Lp1 = 6.6666668653e-01, /* 3F2AAAAB */ Lp2 = 4.0000000596e-01, /* 3ECCCCCD */ Lp3 = 2.8571429849e-01, /* 3E924925 */ Lp4 = 2.2222198546e-01, /* 3E638E29 */ Lp5 = 1.8183572590e-01, /* 3E3A3325 */ Lp6 = 1.5313838422e-01, /* 3E1CD04F */ Lp7 = 1.4798198640e-01; /* 3E178897 */ #ifdef __STDC__ static const float zero = 0.0; #else static float zero = 0.0; #endif #ifdef __STDC__ float log1pf(float x) #else float log1pf(x) float x; #endif { float hfsq,f,c=0.0f,s,z,R,u; __int32_t k,hx,hu,ax; GET_FLOAT_WORD(hx,x); ax = hx&0x7fffffff; k = 1; if (!FLT_UWORD_IS_FINITE(hx)) return x+x; if (hx < 0x3ed413d7) { /* x < 0.41422 */ if(ax>=0x3f800000) { /* x <= -1.0 */ if(x==(float)-1.0) return -two25/zero; /* log1p(-1)=+inf */ else return (x-x)/(x-x); /* log1p(x<-1)=NaN */ } if(ax<0x31000000) { /* |x| < 2**-29 */ if(two25+x>zero /* raise inexact */ &&ax<0x24800000) /* |x| < 2**-54 */ return x; else return x - x*x*(float)0.5; } if(hx>0||hx<=((__int32_t)0xbe95f61f)) { k=0;f=x;hu=1;} /* -0.2929>23)-127; /* correction term */ c = (k>0)? (float)1.0-(u-x):x-(u-(float)1.0); c /= u; } else { u = x; GET_FLOAT_WORD(hu,u); k = (hu>>23)-127; c = 0; } hu &= 0x007fffff; if(hu<0x3504f7) { SET_FLOAT_WORD(u,hu|0x3f800000);/* normalize u */ } else { k += 1; SET_FLOAT_WORD(u,hu|0x3f000000); /* normalize u/2 */ hu = (0x00800000-hu)>>2; } f = u-(float)1.0; } hfsq=(float)0.5*f*f; if(hu==0) { /* |f| < 2**-20 */ if(f==zero) { if(k==0) return zero; else {c += k*ln2_lo; return k*ln2_hi+c;}} R = hfsq*((float)1.0-(float)0.66666666666666666*f); if(k==0) return f-R; else return k*ln2_hi-((R-(k*ln2_lo+c))-f); } s = f/((float)2.0+f); z = s*s; R = z*(Lp1+z*(Lp2+z*(Lp3+z*(Lp4+z*(Lp5+z*(Lp6+z*Lp7)))))); if(k==0) return f-(hfsq-s*(hfsq+R)); else return k*ln2_hi-((hfsq-(s*(hfsq+R)+(k*ln2_lo+c)))-f); } #ifdef _DOUBLE_IS_32BITS #ifdef __STDC__ double log1p(double x) #else double log1p(x) double x; #endif { return (double) log1pf((float) x); } #endif /* defined(_DOUBLE_IS_32BITS) */ snek-1.1/chips/atmega/sf_log2.c000066400000000000000000000064671353657467200164150ustar00rootroot00000000000000/* Single-precision log2 function. Copyright (c) 2017 Arm Ltd. All rights reserved. SPDX-License-Identifier: BSD-3-Clause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the company may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "fdlibm.h" #if !__OBSOLETE_MATH #include #include #include "math_config.h" /* LOG2F_TABLE_BITS = 4 LOG2F_POLY_ORDER = 4 ULP error: 0.752 (nearest rounding.) Relative error: 1.9 * 2^-26 (before rounding.) */ #define N (1 << LOG2F_TABLE_BITS) #define T __log2f_data.tab #define A __log2f_data.poly #define OFF 0x3f330000 float log2f (float x) { /* double_t for better performance on targets with FLT_EVAL_METHOD==2. */ double_t z, r, r2, p, y, y0, invc, logc; uint32_t ix, iz, top, tmp; int k, i; ix = asuint (x); #if WANT_ROUNDING /* Fix sign of zero with downward rounding when x==1. */ if (__builtin_expect (ix == 0x3f800000, 0)) return 0; #endif if (__builtin_expect (ix - 0x00800000 >= 0x7f800000 - 0x00800000, 0)) { /* x < 0x1p-126 or inf or nan. */ if (ix * 2 == 0) return __math_divzerof (1); if (ix == 0x7f800000) /* log2(inf) == inf. */ return x; if ((ix & 0x80000000) || ix * 2 >= 0xff000000) return __math_invalidf (x); /* x is subnormal, normalize it. */ ix = asuint (x * 0x1p23f); ix -= (uint32_t) 23 << 23; } /* x = 2^k z; where z is in range [OFF,2*OFF] and exact. The range is split into N subintervals. The ith subinterval contains z and c is near its center. */ tmp = ix - OFF; i = (tmp >> (23 - LOG2F_TABLE_BITS)) % N; top = tmp & 0xff800000; iz = ix - top; k = (int32_t) tmp >> 23; /* arithmetic shift */ invc = T[i].invc; logc = T[i].logc; z = (double_t) asfloat (iz); /* log2(x) = log1p(z/c-1)/ln2 + log2(c) + k */ r = z * invc - 1; y0 = logc + (double_t) k; /* Pipelined polynomial evaluation to approximate log1p(r)/ln2. */ r2 = r * r; y = A[1] * r + A[2]; y = A[0] * r2 + y; p = A[3] * r + y0; y = y * r2 + p; return (float) y; } #endif /* !__OBSOLETE_MATH */ snek-1.1/chips/atmega/sf_log2_data.c000066400000000000000000000050131353657467200173700ustar00rootroot00000000000000/* Data definition for log2f. Copyright (c) 2017 Arm Ltd. All rights reserved. SPDX-License-Identifier: BSD-3-Clause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the company may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "fdlibm.h" #if !__OBSOLETE_MATH #include "math_config.h" const struct log2f_data __log2f_data = { .tab = { { 0x1.661ec79f8f3bep+0, -0x1.efec65b963019p-2 }, { 0x1.571ed4aaf883dp+0, -0x1.b0b6832d4fca4p-2 }, { 0x1.49539f0f010bp+0, -0x1.7418b0a1fb77bp-2 }, { 0x1.3c995b0b80385p+0, -0x1.39de91a6dcf7bp-2 }, { 0x1.30d190c8864a5p+0, -0x1.01d9bf3f2b631p-2 }, { 0x1.25e227b0b8eap+0, -0x1.97c1d1b3b7afp-3 }, { 0x1.1bb4a4a1a343fp+0, -0x1.2f9e393af3c9fp-3 }, { 0x1.12358f08ae5bap+0, -0x1.960cbbf788d5cp-4 }, { 0x1.0953f419900a7p+0, -0x1.a6f9db6475fcep-5 }, { 0x1p+0, 0x0p+0 }, { 0x1.e608cfd9a47acp-1, 0x1.338ca9f24f53dp-4 }, { 0x1.ca4b31f026aap-1, 0x1.476a9543891bap-3 }, { 0x1.b2036576afce6p-1, 0x1.e840b4ac4e4d2p-3 }, { 0x1.9c2d163a1aa2dp-1, 0x1.40645f0c6651cp-2 }, { 0x1.886e6037841edp-1, 0x1.88e9c2c1b9ff8p-2 }, { 0x1.767dcf5534862p-1, 0x1.ce0a44eb17bccp-2 }, }, .poly = { -0x1.712b6f70a7e4dp-2, 0x1.ecabf496832ep-2, -0x1.715479ffae3dep-1, 0x1.715475f35c8b8p0, } }; #endif /* !__OBSOLETE_MATH */ snek-1.1/chips/atmega/snek-atmega-eeprom.c000066400000000000000000000034141353657467200205300ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include "snek.h" #include "snek-io.h" #include snek_poly_t snek_builtin_eeprom_write(void) { uint8_t c; snek_offset_t addr = 0; for (addr = 0; addr < 1024; addr++) { c = snek_uart_getch(); if (c == '\r') c = '\n'; if (c == ('d' & 0x1f)) c = 0xff; eeprom_write_byte((uint8_t *) addr, c); if (c == 0xff) break; } return SNEK_NULL; } snek_poly_t snek_builtin_eeprom_show(uint8_t nposition, uint8_t nnamed, snek_poly_t *args) { uint8_t c; snek_offset_t addr = 0; (void) nnamed; (void) args; if (nposition) putc('b' & 0x1f, stdout); for (addr = 0; addr < 1024; addr++) { c = eeprom_read_byte((uint8_t *) addr); if (c == 0xff) break; putc(c, stdout); } if (nposition) putc('c' & 0x1f, stdout); return SNEK_NULL; } static snek_soffset_t snek_eeprom_addr; snek_poly_t snek_builtin_eeprom_erase(void) { if (eeprom_read_byte((uint8_t *) 0) != 0xff) eeprom_write_byte((uint8_t *) 0, 0xff); return SNEK_NULL; } int snek_eeprom_getchar(FILE *stream) { (void) stream; if (snek_eeprom_addr < 1024) { uint8_t c = eeprom_read_byte((uint8_t *) (snek_eeprom_addr++)); if (c != 0xff) return c; } snek_interactive = true; snek_duino_file.get = snek_io_getc; return EOF; } snek-1.1/chips/atmega/snek-atmega-math.c000066400000000000000000000012771353657467200201770ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include "snek.h" #include float exp2f(float x) { return powf(2.0f, x); } float expm1f(float x) { return expf(x) - 1.0f; } snek-1.1/chips/atmega/snek-atmega-math.h000066400000000000000000000031671353657467200202040ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _SNEK_MEGA_MATH_H_ #define _SNEK_MEGA_MATH_H_ float exp2f(float x); float expm1f(float x); #define __ieee754_remainderf remainderf #define __ieee754_acoshf acoshf #define __ieee754_atanhf atanhf #define __ieee754_sqrtf sqrtf #define __ieee754_lgammaf_r lgammaf_r #define __ieee754_gammaf_r gammaf_r #define _IEEE_LIBM double acosh(double x); double asinh(double x); double atanh(double x); double log1p(double x); double log2(double x); double erf(double x) ; double erfc(double x); double tgamma(double x); float acoshf(float x); float asinhf(float x); float atanhf(float x); float log1pf(float x); float log2f(float x); float erff(float x); float erfcf(float x); float tgammaf(float x); float remainderf(float x, float y); float lgammaf_r(float x, int *signp); #define __math_invalidf(x) (x) #define __math_divzerof(x) (NAN) #endif /* _SNEK_MEGA_MATH_H_ */ snek-1.1/chips/atmega/snek-atmega-serial.c000066400000000000000000000103141353657467200205150ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include "snek.h" /* UART baud rate */ #define UART_BAUD 38400 #define UART_BAUD_U2X(div) ((F_CPU / (div) / UART_BAUD - 1) / 2) #define UART_U2X (UART_BAUD_U2X(4) <= 4095) #define UART_BAUD_SCALE (UART_U2X ? UART_BAUD_U2X(4) : UART_BAUD_U2X(8)) #define RINGSIZE 16 typedef volatile struct uart_ring { uint8_t read; uint8_t count; uint8_t buf[RINGSIZE]; } uart_ring_t; static uart_ring_t rx_ring, tx_ring; static volatile uint8_t rx_flow; static volatile uint8_t tx_flow; /* Start at EMPTY state so we send a ^Q at startup time */ #define FLOW_EMPTY 0 #define FLOW_RUNNING 1 #define FLOW_FULL 2 #define FLOW_STOPPED 3 static bool ring_full(uart_ring_t *ring) { return ring->count == RINGSIZE; } static bool ring_empty(uart_ring_t *ring) { return ring->count == 0; } static bool ring_mostly_full(uart_ring_t *ring) { return ring->count >= (RINGSIZE / 2); } static int ring_get(uart_ring_t *ring) { if (ring_empty(ring)) return -1; uint8_t c = ring->buf[ring->read]; ring->read = (ring->read + 1) & (RINGSIZE - 1); ring->count--; return c; } static bool ring_put(uart_ring_t *ring, uint8_t c) { if (ring_full(ring)) return false; uint8_t write = (ring->read + ring->count) & (RINGSIZE - 1); ring->buf[write] = c; ring->count++; return true; } static void next_flow(void) { rx_flow = (rx_flow + 1) & 3; } static void _snek_uart_tx_start(void) { if ((UCSR0A & (1 << UDRE0)) && !tx_flow) { uint8_t c; if ((rx_flow & 1) == 0) { next_flow(); if (rx_flow == FLOW_RUNNING) c = 'q' & 0x1f; else c = 's' & 0x1f; } else { int ic; ic = ring_get(&tx_ring); if (ic == -1) return; c = ic; } UCSR0B |= (1 << UDRIE0); UDR0 = c; } } static void _snek_uart_flow_do(void) { next_flow(); _snek_uart_tx_start(); } static void _snek_uart_xon(void) { if (rx_flow == FLOW_STOPPED && ring_empty(&rx_ring)) _snek_uart_flow_do(); } static void _snek_uart_xoff(void) { if (rx_flow == FLOW_RUNNING && ring_mostly_full(&rx_ring)) _snek_uart_flow_do(); } #if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) #define UDRE_vect USART0_UDRE_vect #define RX_vect USART0_RX_vect #else #define UDRE_vect USART_UDRE_vect #define RX_vect USART_RX_vect #endif ISR(UDRE_vect) { UCSR0B &= ~(1 << UDRIE0); _snek_uart_xon(); _snek_uart_tx_start(); } ISR(RX_vect) { uint8_t c = UDR0; switch (c) { case 'c' & 0x1f: snek_abort = true; break; case 's' & 0x1f: tx_flow = true; return; case 'q' & 0x1f: tx_flow = false; _snek_uart_tx_start(); return; } ring_put(&rx_ring, c); _snek_uart_xoff(); } char snek_uart_getch(void) { int c; for (;;) { cli(); c = ring_get(&rx_ring); if (c != -1) break; sei(); } _snek_uart_xon(); sei(); return c; } void snek_uart_putch(char c) { if (c == '\n') snek_uart_putch('\r'); for (;;) { cli(); if (ring_put(&tx_ring, c)) { _snek_uart_tx_start(); sei(); return; } sei(); } } int snek_uart_putchar(char c, FILE *stream) { (void) stream; snek_uart_putch(c); return 0; } void _snek_uart_puts(const char *PROGMEM string) { char c; while ((c = pgm_read_byte(string++))) snek_uart_putch(c); } void snek_uart_init(void) { UBRR0H = (uint8_t) (UART_BAUD_SCALE >> 8); UBRR0L = (uint8_t) (UART_BAUD_SCALE); UCSR0A = ((1 << TXC0) | (UART_U2X << U2X0) | (0 << MPCM0)); UCSR0C = ((0 << UMSEL01) | (0 << UMSEL00) | (0 << UPM01) | (0 << UPM00) | (0 << USBS0) | (1 << UCSZ00) | (1 << UCSZ01) | (0 << UCPOL0)); UCSR0B = ((1 << RXCIE0) | (0 << TXCIE0) | (0 << UDRIE0) | (1 << RXEN0) | (1 << TXEN0) | (0 << UCSZ02) | (0 << TXB80)); snek_uart_puts("Welcome to Snek " SNEK_VERSION "\n"); } snek-1.1/chips/atmega/snek-atmega.builtin000066400000000000000000000011641353657467200204670ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # time.sleep, 1 time.monotonic, 0 reset, 0 random.seed, 1 random.randrange, 1 snek-1.1/chips/atmega/snek-atmega.defs000066400000000000000000000022471353657467200177450ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_ATMEGA_MATH_SRC = \ snek-math.c \ ef_remainder.c \ snek-atmega-math.c \ sf_asinh.c \ ef_acosh.c \ ef_atanh.c \ sf_log1p.c \ sf_log2.c \ sf_log2_data.c \ sf_erf.c \ wf_tgamma.c \ erf_lgamma.c \ erf_gamma.c \ kf_sin.c \ kf_cos.c SNEK_ATMEGA_SRC = \ snek-atmega-eeprom.c \ snek-io.c \ snek-atmega-serial.c SNEK_ATMEGA_MATH_INC = \ $(SNEK_ATMEGA)/snek-atmega-math.h \ $(SNEK_ATMEGA)/fdlibm.h \ $(SNEK_ATMEGA)/math_config.h SNEK_ATMEGA_INC = \ $(SNEK_ATMEGA)/snek-atmega.h SNEK_ATMEGA_MATH_BUILTINS = \ snek-math.builtin SNEK_ATMEGA_BUILTINS = \ snek-eeprom.builtin \ snek-gpio.builtin \ snek-atmega.builtinsnek-1.1/chips/atmega/snek-atmega.h000066400000000000000000000104371353657467200172530ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #ifndef _SNECK_DUINO_H_ #define _SNECK_DUINO_H_ #include #include #include #include #define SNEK_DEBUG 0 #define strtof(a,b) strtod(a,b) #define VALUE_STACK_SIZE 16 #define PARSE_STACK_SIZE 52 #define SNEK_STACK 32 #define PARSE_TABLE_DECLARATION(t) PROGMEM t #define PARSE_TABLE_FETCH_TOKEN(a) ((token_key_t) pgm_read_byte(a)) #define PARSE_TABLE_FETCH_INDEX(a) ((uint8_t) pgm_read_byte(a)) #define ERROR_FETCH_FORMAT_CHAR(a) ((char) pgm_read_byte(a)) /* no sense linking both functions */ #define memcpy(a,b,c) memmove(a,b,c) #define snek_error_name snek_internal_error #define snek_error(fmt, args...) ({ \ static const char PROGMEM __fmt__[] = (fmt); \ snek_internal_error(__fmt__, ## args); \ }) #define snek_error_0_name snek_internal_error_0 #define snek_error_0(string) ({ \ static const char PROGMEM __string__[] = (string); \ snek_internal_error_0(__string__); \ }) #define fprintf(file, fmt, args...) ({ \ static const char PROGMEM __fmt__[] = (fmt); \ fprintf_P(file, __fmt__, ## args); \ }) #define sprintf_const(dst, fmt, args...) ({ \ static const char PROGMEM __fmt__[] = (fmt); \ sprintf_P(dst, __fmt__, ##args); \ }) #define SNEK_BUILTIN_NAMES_DECLARE(n) PROGMEM n #define SNEK_BUILTIN_NAMES(a) ((uint8_t) pgm_read_byte(&snek_builtin_names[a])) #define SNEK_BUILTIN_NAMES_CMP(a,b) strcmp_P(a,b) #define SNEK_BUILTIN_DECLARE(n) PROGMEM n #define SNEK_BUILTIN_NFORMAL(b) ((int8_t) pgm_read_byte(&(b)->nformal)) #define SNEK_BUILTIN_FUNCV(b) ((snek_poly_t(*)(uint8_t, uint8_t, snek_poly_t *)) pgm_read_ptr(&(b)->funcv)) #define SNEK_BUILTIN_FUNC0(b) ((snek_poly_t(*)(void)) pgm_read_ptr(&(b)->func0)) #define SNEK_BUILTIN_FUNC1(b) ((snek_poly_t(*)(snek_poly_t)) pgm_read_ptr(&(b)->func1)) #define SNEK_BUILTIN_FUNC2(b) ((snek_poly_t(*)(snek_poly_t, snek_poly_t)) pgm_read_ptr(&(b)->func2)) #define SNEK_BUILTIN_FUNC3(b) ((snek_poly_t(*)(snek_poly_t, snek_poly_t, snek_poly_t)) pgm_read_ptr(&(b)->func3)) #define SNEK_BUILTIN_FUNC4(b) ((snek_poly_t(*)(snek_poly_t, snek_poly_t, snek_poly_t, snek_poly_t)) pgm_read_ptr(&(b)->func4)) #define SNEK_BUILTIN_VALUE(b) ((snek_poly_t)(uint32_t)pgm_read_dword(&(b)->value)) #define SNEK_ROOT_DECLARE(n) PROGMEM n #define SNEK_ROOT_TYPE(n) ((const snek_mem_t *) pgm_read_ptr(&(n)->type)) #define SNEK_ROOT_ADDR(n) ((void **) pgm_read_ptr(&(n)->addr)) static inline const char * avr_snek_builtin_names_return(const uint8_t *bits) { static char ret[SNEK_BUILTIN_NAMES_MAX_LEN + 1]; char *r = ret; while ((*r++ = (char) pgm_read_byte(bits++))) ; return ret; } static inline int avr_snek_builtin_names_len(const char *a) { int len = 0; while (pgm_read_byte(a++)) len++; return len; } #define snek_builtin_names_return(a) avr_snek_builtin_names_return(a) #define snek_builtin_names_len(a) avr_snek_builtin_names_len(a) #define SNEK_MEM_DECLARE(n) PROGMEM n #define SNEK_MEM_SIZE(m) ((snek_offset_t (*)(void *addr)) pgm_read_word(&(m)->size)) #define SNEK_MEM_MARK(m) ((void (*)(void *addr)) pgm_read_ptr(&(m)->mark)) #define SNEK_MEM_MOVE(m) ((void (*)(void *addr)) pgm_read_ptr(&(m)->move)) #define SNEK_MEMS_DECLARE(n) PROGMEM n void snek_uart_init(void); int snek_uart_putchar(char c, FILE *stream); int snek_uart_getchar(FILE *stream); int snek_eeprom_getchar(FILE *stream); char snek_uart_getch(void); void _snek_uart_puts(const char *PROGMEM string); void snek_uart_putch(char c); #define snek_uart_puts(string) ({ static const char PROGMEM __string__[] = (string); _snek_uart_puts(__string__); }) #define SNEK_IO_PUTS(s) snek_uart_puts(s) #define SNEK_IO_LINEBUF 80 #define SNEK_IO_PUTC(c) snek_uart_putch(c) #define SNEK_IO_GETC(s) snek_uart_getch() extern FILE snek_duino_file; #endif /* _SNEK_DUINO_H_ */ snek-1.1/chips/atmega/wf_tgamma.c000066400000000000000000000024021353657467200170050ustar00rootroot00000000000000/* w_gammaf.c -- float version of w_gamma.c. * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ #include "math.h" #include "fdlibm.h" #ifdef __STDC__ float tgammaf(float x) #else float tgammaf(x) float x; #endif { float y; int local_signgam; y = __ieee754_gammaf_r(x,&local_signgam); if (local_signgam < 0) y = -y; #ifdef _IEEE_LIBM return y; #else if(_LIB_VERSION == _IEEE_) return y; if(!finitef(y)&&finitef(x)) { if(floorf(x)==x&&x<=(float)0.0) /* tgammaf pole */ return (float)__kernel_standard((double)x,(double)x,141); else /* tgammaf overflow */ return (float)__kernel_standard((double)x,(double)x,140); } return y; #endif } #ifdef _DOUBLE_IS_32BITS #ifdef __STDC__ double tgamma(double x) #else double tgamma(x) double x; #endif { return (double) tgammaf((float) x); } #endif /* defined(_DOUBLE_IS_32BITS) */ snek-1.1/chips/avr/000077500000000000000000000000001353657467200142335ustar00rootroot00000000000000snek-1.1/chips/avr/ao-adc-avr.c000066400000000000000000000073761353657467200163260ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "ao.h" #include "ao_pwmin.h" volatile __xdata struct ao_data ao_data_ring[AO_DATA_RING]; volatile __data uint8_t ao_data_head; #ifdef TELESCIENCE const uint8_t adc_channels[AO_LOG_TELESCIENCE_NUM_ADC] = { 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, }; #endif #ifdef TELEPYRO const uint8_t adc_channels[AO_TELEPYRO_NUM_ADC] = { 0x00, /* ADC0 v_batt */ 0x04, /* ADC4 sense_a */ 0x05, /* ADC5 sense_b */ 0x06, /* ADC6 sense_c */ 0x07, /* ADC7 sense_d */ 0x23, /* ADC11 sense_e */ 0x22, /* ADC10 sense_f */ 0x21, /* ADC9 sense_g */ 0x20, /* ADC8 sense_h */ }; #endif #define NUM_ADC (sizeof (adc_channels) / sizeof (adc_channels[0])) static uint8_t ao_adc_channel; #define ADC_CHANNEL_LOW(c) (((c) & 0x1f) << MUX0) #define ADC_CHANNEL_HIGH(c) ((((c) & 0x20) >> 5) << MUX5) #define ADCSRA_INIT ((1 << ADEN) | /* Enable ADC */ \ (0 << ADATE) | /* No auto ADC trigger */ \ (1 << ADIF) | /* Clear interrupt */ \ (0 << ADIE) | /* Enable interrupt */ \ (6 << ADPS0)) /* Prescale clock by 64 */ #define ADCSRB_INIT ((0 << ADHSM) | /* No high-speed mode */ \ (0 << ACME) | /* Some comparitor thing */ \ (0 << ADTS0)) /* Free running mode (don't care) */ static void ao_adc_start(void) { uint8_t channel = adc_channels[ao_adc_channel]; ADMUX = ((0 << REFS1) | /* AVcc reference */ (1 << REFS0) | /* AVcc reference */ (1 << ADLAR) | /* Left-shift results */ (ADC_CHANNEL_LOW(channel))); /* Select channel */ ADCSRB = (ADCSRB_INIT | ADC_CHANNEL_HIGH(channel)); /* High channel bit */ ADCSRA = (ADCSRA_INIT | (1 << ADSC) | (1 << ADIE)); /* Start conversion */ } ISR(ADC_vect) { uint16_t value; /* Must read ADCL first or the value there will be lost */ value = ADCL; value |= (ADCH << 8); ao_data_ring[ao_data_head].adc.adc[ao_adc_channel] = value; if (++ao_adc_channel < NUM_ADC - HAS_ICP3_COUNT) ao_adc_start(); else { #if HAS_ICP3_COUNT /* steal last adc channel for pwm input */ ao_data_ring[ao_data_head].adc.adc[ao_adc_channel] = ao_icp3_count; #endif ADCSRA = ADCSRA_INIT; ao_data_ring[ao_data_head].tick = ao_time(); ao_data_head = ao_data_ring_next(ao_data_head); ao_wakeup((void *) &ao_data_head); ao_cpu_sleep_disable = 0; } } void ao_adc_poll(void) { ao_cpu_sleep_disable = 1; ao_adc_channel = 0; ao_adc_start(); } void ao_data_get(__xdata struct ao_data *packet) { uint8_t i = ao_data_ring_prev(ao_data_head); memcpy(packet, (void *) &ao_data_ring[i], sizeof (struct ao_data)); } static void ao_adc_dump(void) __reentrant { static __xdata struct ao_data packet; uint8_t i; ao_data_get(&packet); printf("tick: %5u", packet.tick); for (i = 0; i < NUM_ADC; i++) printf (" %2d: %5u", i, packet.adc.adc[i]); printf("\n"); } __code struct ao_cmds ao_adc_cmds[] = { { ao_adc_dump, "a\0ADC" }, { 0, NULL }, }; void ao_adc_init(void) { PRR0 &= ~(1 << PRADC); DIDR0 = 0xf3; DIDR2 = 0x3f; ADCSRB = ADCSRB_INIT; ADCSRA = ADCSRA_INIT; ao_cmd_register(&ao_adc_cmds[0]); } snek-1.1/chips/avr/ao-arch-funcs.h000066400000000000000000000044571353657467200170440ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ao_spi.c */ extern __xdata uint8_t ao_spi_mutex; #define ao_spi_get_mask(reg,mask,bus,speed) do { \ ao_mutex_get(&ao_spi_mutex); \ (reg) &= ~(mask); \ } while (0) #define ao_spi_put_mask(reg,mask,bus) do { \ (reg) |= (mask); \ ao_mutex_put(&ao_spi_mutex); \ } while (0) #define ao_spi_get_bit(reg,bit,pin,bus,speed) do { \ ao_mutex_get(&ao_spi_mutex); \ (pin) = 0; \ } while (0) #define ao_spi_put_bit(reg,bit,pin,bus) do { \ (pin) = 1; \ ao_mutex_put(&ao_spi_mutex); \ } while (0) #define ao_gpio_token_paster(x,y) x ## y #define ao_gpio_token_evaluator(x,y) ao_gpio_token_paster(x,y) #define ao_gpio_set(port, bit, pin, v) do { \ if (v) \ (ao_gpio_token_evaluator(PORT,port)) |= (1 << bit); \ else \ (ao_gpio_token_evaluator(PORT,port)) &= ~(1 << bit); \ } while (0) /* * The SPI mutex must be held to call either of these * functions -- this mutex covers the entire SPI operation, * from chip select low to chip select high */ #define ao_enable_output(port, bit, pin, v) do { \ ao_gpio_set(port, bit, pin, v); \ ao_gpio_token_evaluator(DDR,port) |= (1 << bit); \ } while (0) void ao_spi_send_bus(void __xdata *block, uint16_t len) __reentrant; void ao_spi_recv_bus(void __xdata *block, uint16_t len) __reentrant; #define ao_spi_send(block, len, bus) ao_spi_send_bus(block, len) #define ao_spi_recv(block, len, bus) ao_spi_recv_bus(block, len) void ao_spi_init(void); #define ao_spi_init_cs(port, mask) do { \ SPI_CS_PORT |= (mask); \ SPI_CS_DIR |= (mask); \ } while (0) snek-1.1/chips/avr/ao-arch.h000066400000000000000000000060571353657467200157260ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _AO_ARCH_H_ #define _AO_ARCH_H_ #include #include #include #include /* * AVR definitions and code fragments for AltOS */ #ifndef AO_STACK_SIZE #define AO_STACK_SIZE 116 #endif /* Various definitions to make GCC look more like SDCC */ #define ao_arch_naked_declare __attribute__((naked)) #define ao_arch_naked_define #define __pdata #define __data #define __xdata #define __code const #define __reentrant #define __critical #define __interrupt(n) #define __at(n) #define ao_arch_reboot() /* XXX */ #define ao_arch_nop() asm("nop") #define ao_arch_interrupt(n) /* nothing */ #define AO_ROMCONFIG_VERSION 2 #define AO_ROMCONFIG_SYMBOL(a) const extern AO_ROMCONFIG_SYMBOL(0) uint16_t ao_serial_number; #define AVR_PUSH8(stack, val) (*((stack)--) = (val)) /* Idle the CPU (if possible) waiting for an interrupt. Enabling * interrupts and sleeping the CPU must be adjacent to eliminate race * conditions. In all cases, we execute a single nop with interrupts * enabled */ #define ao_arch_wait_interrupt() do { \ sleep_enable(); \ sei(); \ sleep_cpu(); \ sleep_disable(); \ ao_arch_nop(); \ cli(); \ } while (0) #define ao_arch_restore_stack() do { \ uint8_t sp_l, sp_h; \ sp_l = (uint16_t) ao_cur_task->sp; \ sp_h = ((uint16_t) ao_cur_task->sp) >> 8; \ asm("out __SP_H__,%0" : : "r" (sp_h) ); \ asm("out __SP_L__,%0" : : "r" (sp_l) ); \ asm("pop r0" "\n\t" \ "out __SREG__, r0"); \ asm("pop r0" "\n\t" "pop r1" "\n\t" "pop r2" "\n\t" "pop r3" "\n\t" "pop r4"); \ asm("pop r5" "\n\t" "pop r6" "\n\t" "pop r7" "\n\t" "pop r8" "\n\t" "pop r9"); \ asm("pop r10" "\n\t" "pop r11" "\n\t" "pop r12" "\n\t" "pop r13" "\n\t" "pop r14"); \ asm("pop r15" "\n\t" "pop r16" "\n\t" "pop r17" "\n\t" "pop r18" "\n\t" "pop r19"); \ asm("pop r20" "\n\t" "pop r21" "\n\t" "pop r22" "\n\t" "pop r23" "\n\t" "pop r24"); \ asm("pop r25" "\n\t" "pop r26" "\n\t" "pop r27" "\n\t" "pop r28" "\n\t" "pop r29"); \ asm("pop r30" "\n\t" "pop r31"); \ asm("ret"); \ } while(0) #define ao_arch_critical(b) do { cli(); do { b } while (0); sei(); } while (0) #define ao_arch_block_interrupts() cli() #define ao_arch_release_interrupts() sei() #define AO_TELESCIENCE_NUM_ADC 12 #endif /* _AO_ARCH_H_ */ snek-1.1/chips/avr/ao-snek-avr.c000066400000000000000000000234611353657467200165300ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include "ao.h" #include "snek.h" #include #define clockCyclesPerMicrosecond (F_CPU / 1000000L) #define clockCyclesToMicroseconds(a) ((a) / clockCyclesPerMicrosecond) // the prescaler is set so that timer0 ticks every 64 clock cycles, and the // the overflow handler is called every 256 ticks. #define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256)) // the whole number of milliseconds per timer0 overflow #define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000) // the fractional number of milliseconds per timer0 overflow. we shift right // by three to fit these numbers into a byte. (for the clock speeds we care // about - 8 and 16 MHz - this doesn't lose precision.) #define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3) #define FRACT_MAX (1000 >> 3) volatile uint32_t timer0_millis = 0; static uint8_t timer0_fract = 0; #define PB 0 #define PC 1 #define PD 2 #define PE 3 #define PF 4 #define MAKE_MAP(P,B) (((P) * 3) << 3 | (B)) #define MAP_P(M) ((M) >> 3) #define MAP_B(M) ((M) & 7) /* * GPIOs: * * 0 D0 PD2 * 1 D1 PD3 * 2 D2 PD1 SDA * 3 D3 PD0 PWM OC0B SCL * 4 D4 PD4 * 5 D5 PC6 PWM OC3A * 6 D6 PD7 PWM OC4D * 7 D7 PE6 * 8 D8 PB4 * 9 D9 PB5 PWM OC1A * 10 D10 PB6 PWM OC1B * 11 D11 PB7 PWM OC0A * 12 D12 PD6 * 13 D13 PC7 PWM OC4A * 14 A0 PF7 ADC ADC7 * 15 A1 PF6 ADC ADC6 * 16 A2 PF5 ADC ADC5 * 17 A3 PF4 ADC ADC4 * 18 A4 PF1 ADC ADC1 * 19 A5 PF0 ADC ADC0 * 20 MISO PB3 MISO * 21 MOSI PB2 MOSI * 22 SCK PB1 SCK */ #define NUM_PIN 23 #define NUM_ADC 6 #define FIRST_ADC 14 static uint8_t power[NUM_PIN]; static uint8_t power_pin; static uint8_t dir_pin; static uint8_t on_pins[NUM_PIN]; #define SNEK_PULL_NONE 0 #define SNEK_PULL_UP 1 /* digital pins all use PULL_UP by default */ static uint8_t pull[NUM_PIN] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; ISR(TIMER0_OVF_vect) { // copy these to local variables so they can be stored in registers // (volatile variables must be read from memory on every access) uint32_t m = timer0_millis; uint8_t f = timer0_fract; m += MILLIS_INC; f += FRACT_INC; if (f >= FRACT_MAX) { f -= FRACT_MAX; m += 1; } timer0_fract = f; timer0_millis = m; } static void port_init(void) { /* Enable ADC */ ADCSRA = ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0) | (1 << ADEN)); /* Timer 0 */ TCCR0A = ((1 << WGM01) | (1 << WGM00)); /* / 64 */ TCCR0B = ((0 << CS02) | (1 << CS01) | (1 << CS00)); /* enable interrupt */ TIMSK0 = (1 << TOIE0); /* Timer 1 (clkio/64) */ TCCR1B = ((0 << CS12) | (1 << CS11) | (1 << CS10)); /* Phase correct 8-bit */ TCCR1A = ((0 << WGM12) | (0 << WGM11) | (1 << WGM10)); OCR1AH = 0; OCR1BH = 0; /* Timer 3 (clkio/64) */ TCCR3B = ((0 << CS32) | (1 << CS31) | (1 << CS30)); TCCR3A = ((1 << WGM30)); /* Timer 4 */ /* PWM mode */ TCCR4A = ((1 << PWM4A) | (1 << PWM4B)); /* (clkio/64) */ TCCR4B = ((0 << CS43) | (1 << CS42) | (1 << CS41) | (1 << CS40)); /* Phase correct */ TCCR4D = ((0 << WGM41) | (1 << WGM40)); /* count to 255 */ TC4H = 0; OCR4C = 0xff; memset(power, 0xff, NUM_PIN); DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0; } #include #include static jmp_buf snek_reset_buf; int __attribute__((OS_main)) main (void) { stderr = stdout = stdin = &snek_avr_file; ao_usb_init(); setjmp(snek_reset_buf); port_init(); snek_init(); fprintf(stdout, "Welcome to snek " SNEK_VERSION "\n"); fflush(stdout); for (;;) snek_parse(); } static const PROGMEM uint8_t _pin_map[NUM_PIN] = PIN_MAP; static const PROGMEM uint8_t _adc_map[NUM_ADC] = ADC_MAP; static uint8_t const PROGMEM ocr_reg_addrs[NUM_PIN] = OCR_REG_ADDRS; static volatile uint8_t const PROGMEM tcc_reg_addrs[] = TCC_REG_ADDRS; static uint8_t const PROGMEM tcc_reg_vals[] = TCC_REG_VALS; static uint8_t pin_map(uint8_t pin) { return pgm_read_byte(&_pin_map[pin]); } static volatile uint8_t * ddr_reg(uint8_t pin) { return (volatile uint8_t *) (uintptr_t) (0x24 + MAP_P(pin_map(pin))); } static volatile uint8_t * pin_reg(uint8_t pin) { return (volatile uint8_t *) (uintptr_t) (0x23 + MAP_P(pin_map(pin))); } static volatile uint8_t * port_reg(uint8_t pin) { return (volatile uint8_t *) (uintptr_t) (0x25 + MAP_P(pin_map(pin))); } static uint8_t bit(uint8_t pin) { return 1 << MAP_B(pin_map(pin)); } static bool has_adc(uint8_t p) { return FIRST_ADC <= p && p < (FIRST_ADC + NUM_ADC); } static volatile uint8_t * ocr_reg(uint8_t pin) { return (volatile uint8_t *) (uintptr_t) pgm_read_byte(&ocr_reg_addrs[pin]); } static bool has_pwm(uint8_t p) { return ocr_reg(p) != NULL; } static volatile uint8_t * tcc_reg(uint8_t pin) { return (volatile uint8_t *) (uintptr_t) pgm_read_byte(&tcc_reg_addrs[pin]); } static uint8_t tcc_reg_val(uint8_t pin) { return (uint8_t) pgm_read_byte(&tcc_reg_vals[pin]); } static void set_dir(uint8_t pin, uint8_t d) { volatile uint8_t *r = ddr_reg(pin); volatile uint8_t *p = port_reg(pin); uint8_t b = bit(pin); if (d) { *r |= b; } else { *r &= ~b; if (pull[pin]) *p |= b; else *p &= ~b; } } static uint8_t snek_poly_get_pin(snek_poly_t a) { snek_soffset_t p = snek_poly_get_soffset(a); if (p < 0 || NUM_PIN <= p) snek_error_value(a); return p; } snek_poly_t snek_builtin_talkto(snek_poly_t a) { snek_list_t *l; uint8_t p, d; if (snek_poly_type(a) == snek_list) { l = snek_poly_to_list(a); p = snek_poly_get_pin(snek_list_get(l, SNEK_ZERO, true)); d = snek_poly_get_pin(snek_list_get(l, SNEK_ONE, true)); } else { p = d = snek_poly_get_pin(a); } if (!snek_abort) { set_dir(p, 1); set_dir(d, 1); power_pin = p; dir_pin = d; } return SNEK_NULL; } static inline bool is_on(uint8_t pin) { return on_pins[pin]; } static inline void set_on(uint8_t pin) { on_pins[pin] = 1; } static inline void set_off(uint8_t pin) { on_pins[pin] = 0; } static snek_poly_t set_out(uint8_t pin) { uint8_t p = 0; if (is_on(pin)) p = power[pin]; if (has_pwm(pin)) { if (0 < p && p < 255) { *ocr_reg(pin) = p; *tcc_reg(pin) |= tcc_reg_val(pin); return SNEK_NULL; } *tcc_reg(pin) &= ~tcc_reg_val(pin); } if (p) *port_reg(pin) |= bit(pin); else *port_reg(pin) &= ~bit(pin); return SNEK_NULL; } snek_poly_t snek_builtin_setpower(snek_poly_t a) { float p = snek_poly_get_float(a); if (p < 0.0f) p = 0.0f; if (p > 1.0f) p = 1.0f; power[power_pin] = (uint8_t) (p * 255.0f + 0.5f); return set_out(power_pin); } snek_poly_t snek_builtin_setleft(void) { set_on(dir_pin); return set_out(dir_pin); } snek_poly_t snek_builtin_setright(void) { set_off(dir_pin); return set_out(dir_pin); } snek_poly_t snek_builtin_on(void) { set_on(power_pin); return set_out(power_pin); } snek_poly_t snek_builtin_off(void) { set_off(power_pin); return set_out(power_pin); } snek_poly_t snek_builtin_onfor(snek_poly_t a) { snek_builtin_on(); snek_builtin_time_sleep(a); return snek_builtin_off(); } snek_poly_t snek_builtin_pullnone(snek_poly_t a) { uint8_t p = snek_poly_get_pin(a); if (!snek_abort) pull[p] = SNEK_PULL_NONE; return SNEK_NULL; } snek_poly_t snek_builtin_pullup(snek_poly_t a) { uint8_t p = snek_poly_get_pin(a); if (!snek_abort) pull[p] = SNEK_PULL_UP; return SNEK_NULL; } #define analog_reference 1 snek_poly_t snek_builtin_read(snek_poly_t a) { uint8_t p = snek_poly_get_pin(a); if (snek_abort) return SNEK_NULL; set_dir(p, 0); if (has_adc(p) && !pull[p]) { uint8_t pin = pgm_read_byte(&_adc_map[p - FIRST_ADC]); ADMUX = (analog_reference << REFS0) | (pin & 7); ADCSRA |= (1 << ADSC); while (ADCSRA & (1 << ADSC)) ; uint8_t low = ADCL; uint8_t high = ADCH; float value = ((uint16_t) high << 8 | low) / 1023.0f; return snek_float_to_poly(value); } else { return snek_bool_to_poly(*pin_reg(p) & bit(p)); } } snek_poly_t snek_builtin_stopall(void) { uint8_t p; for (p = 0; p < NUM_PIN; p++) if (is_on(p)) { set_off(p); set_out(p); } return SNEK_NULL; } static uint32_t snek_millis(void) { uint32_t millis; cli(); millis = timer0_millis; ao_arch_nop(); sei(); ao_arch_nop(); return millis; } snek_poly_t snek_builtin_time_sleep(snek_poly_t a) { uint32_t expire = snek_millis() + (snek_poly_get_float(a) * 1000.0f + 0.5f); while (!snek_abort && (int32_t) (expire - snek_millis()) > 0) ao_arch_nop(); return SNEK_NULL; } snek_poly_t snek_builtin_time_monotonic(void) { return snek_float_to_poly(snek_millis() / 1000.0f); } static uint16_t random_next; snek_poly_t snek_builtin_random_seed(snek_poly_t a) { random_next = a.u; return SNEK_NULL; } snek_poly_t snek_builtin_random_randrange(snek_poly_t a) { random_next = random_next * 31421 + 6927; return snek_float_to_poly(random_next % snek_poly_get_soffset(a)); } extern char __snek_data_start__, __snek_data_end__; extern char __snek_bss_start__, __snek_bss_end__; extern char __text_start__, __text_end__; extern char __data_start__, __data_end__; extern char __bss_start__, __bss_end__; snek_poly_t snek_builtin_reset(void) { /* reset data */ memcpy_P(&__snek_data_start__, (&__text_end__ + (&__snek_data_start__ - &__data_start__)), &__snek_data_end__ - &__snek_data_start__); /* reset bss */ memset(&__snek_bss_start__, '\0', &__snek_bss_end__ - &__snek_bss_start__); /* and off we go! */ longjmp(snek_reset_buf, 1); return SNEK_NULL; } snek-1.1/chips/avr/ao-usb-avr.c000066400000000000000000000251741353657467200163640ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "snek.h" #include "ao.h" #include "ao-usb.h" struct ao_usb_setup { uint8_t dir_type_recip; uint8_t request; uint16_t value; uint16_t index; uint16_t length; } ao_usb_setup; static struct ao_fifo ao_usb_rx_fifo; static const uint8_t * ao_usb_ep0_in_data; static uint8_t ao_usb_ep0_in_len; static bool ao_usb_ep0_in_pending; static uint8_t ao_usb_address; static uint8_t ao_usb_ep0_in_buf[2]; static uint8_t ao_usb_ep0_out_len; static uint8_t *ao_usb_ep0_out_data; uint8_t ao_stdin_ready; static bool ao_usb_in_flushed; uint8_t ao_usb_running; #define EP_SIZE(s) ((s) == 64 ? 0x30 : \ ((s) == 32 ? 0x20 : \ ((s) == 16 ? 0x10 : \ 0x00))) static void _ao_usb_set_ep0(void) { /* Set the CONTROL max packet size, single buffered */ UENUM = 0; UECONX = (1 << EPEN); /* Enable */ UECFG0X = ((0 << EPTYPE0) | /* Control */ (0 << EPDIR)); /* Out (ish) */ UECFG1X = (EP_SIZE(AO_USB_CONTROL_SIZE) | /* Size */ (0 << EPBK0) | /* Single bank */ (1 << ALLOC)); UEIENX = ((1 << RXSTPE) | /* Enable SETUP interrupt */ (1 << RXOUTE) | /* Enable OUT interrupt */ (0 << TXINE)); /* Disable IN interrupt */ ao_usb_address = 0; ao_usb_ep0_in_pending = false; } static void _ao_usb_set_configuration(void) { /* Interrupt EP */ UENUM = AO_USB_INT_EP; UECONX = (1 << EPEN); /* Enable */ UECFG0X = ((3 << EPTYPE0) | /* Control */ (1 << EPDIR)); /* In */ UECFG1X = (EP_SIZE(AO_USB_INT_SIZE) | /* Size */ (0 << EPBK0) | /* Single bank */ (1 << ALLOC)); /* Allocate */ /* Set the IN max packet size, double buffered */ UENUM = AO_USB_IN_EP; UECONX = (1 << EPEN); /* Enable */ UECFG0X = ((2 << EPTYPE0) | /* Bulk */ (1 << EPDIR)); /* In */ UECFG1X = (EP_SIZE(AO_USB_IN_SIZE) | /* Size */ (1 << EPBK0) | /* Double bank */ (1 << ALLOC)); /* Allocate */ /* Set the OUT max packet size, double buffered */ UENUM = AO_USB_OUT_EP; UECONX = (1 << EPEN); /* Enable */ UECFG0X = ((2 << EPTYPE0) | /* Bulk */ (0 << EPDIR)); /* Out */ UECFG1X = (EP_SIZE(AO_USB_OUT_SIZE) | /* Size */ (1 << EPBK0) | /* Double bank */ (1 << ALLOC)); /* Allocate */ UEIENX = (1 << RXOUTE); /* Enable OUT interrupt */ ao_usb_running = true; } ISR(USB_GEN_vect) { uint8_t udint = UDINT; UDINT = 0; if (udint & (1 << EORSTI)) _ao_usb_set_ep0(); } struct ao_usb_line_coding ao_usb_line_coding = {115200, 0, 0, 8}; /* Walk through the list of descriptors and find a match */ static void ao_usb_get_descriptor(uint16_t value) { const uint8_t *descriptor; uint8_t type = value >> 8; uint8_t index = value; descriptor = ao_usb_descriptors; while (descriptor[0] != 0) { if (descriptor[1] == type && index-- == 0) { if (type == AO_USB_DESC_CONFIGURATION) ao_usb_ep0_in_len = descriptor[2]; else ao_usb_ep0_in_len = descriptor[0]; ao_usb_ep0_in_data = descriptor; break; } descriptor += descriptor[0]; } } /* Send an IN data packet */ static void _ao_usb_ep0_flush(void) { UENUM = 0; if ((UEINTX & (1 << TXINI)) == 0) return; uint8_t this_len = ao_usb_ep0_in_len; if (this_len > AO_USB_CONTROL_SIZE) this_len = AO_USB_CONTROL_SIZE; ao_usb_ep0_in_len -= this_len; if (ao_usb_ep0_in_len == 0 && this_len != AO_USB_CONTROL_SIZE) ao_usb_ep0_in_pending = false; while (this_len--) { uint8_t c = *ao_usb_ep0_in_data++; UEDATX = c; } /* Clear the TXINI bit to send the packet */ UEINTX &= ~(1 << TXINI); } /* Read data from the ep0 OUT fifo */ static void _ao_usb_ep0_fill(uint8_t len) { if (len > ao_usb_ep0_out_len) len = ao_usb_ep0_out_len; ao_usb_ep0_out_len -= len; /* Pull all of the data out of the packet */ UENUM = 0; while (len--) { uint8_t c = UEDATX; *ao_usb_ep0_out_data++ = c; } /* ACK the packet */ UEINTX &= ~((1 << RXSTPI) | (1 << RXOUTI)); } static void _ao_usb_ep0_setup(void) { /* Pull the setup packet out of the fifo */ ao_usb_ep0_out_data = (uint8_t *) &ao_usb_setup; ao_usb_ep0_out_len = 8; _ao_usb_ep0_fill(8); ao_usb_ep0_in_data = ao_usb_ep0_in_buf; ao_usb_ep0_in_len = 0; switch(ao_usb_setup.request) { case AO_USB_REQ_GET_STATUS: ao_usb_ep0_in_len = 2; break; case AO_USB_REQ_SET_ADDRESS: ao_usb_address = ao_usb_setup.value; break; case AO_USB_REQ_GET_DESCRIPTOR: ao_usb_get_descriptor(ao_usb_setup.value); break; case AO_USB_REQ_GET_CONFIGURATION: ao_usb_ep0_in_len = 1; break; case AO_USB_REQ_SET_CONFIGURATION: _ao_usb_set_configuration(); break; case AO_USB_REQ_GET_INTERFACE: ao_usb_ep0_in_len = 1; break; case AO_USB_REQ_SET_INTERFACE: break; case AO_USB_SET_LINE_CODING: ao_usb_ep0_out_len = 7; ao_usb_ep0_out_data = (uint8_t *) &ao_usb_line_coding; break; case AO_USB_GET_LINE_CODING: ao_usb_ep0_in_len = 7; ao_usb_ep0_in_data = (uint8_t *) &ao_usb_line_coding; break; case AO_USB_SET_CONTROL_LINE_STATE: break; } /* Queue up an IN packet if the SETUP was IN or the length was 0 (and we need to ack) */ if ((ao_usb_setup.dir_type_recip & AO_USB_DIR_IN) || ao_usb_setup.length == 0) { if (ao_usb_setup.length < ao_usb_ep0_in_len) ao_usb_ep0_in_len = ao_usb_setup.length; ao_usb_ep0_in_pending = true; } } /* Wait for a free IN buffer */ static void _ao_usb_in_wait(void) { for (;;) { /* Check if the current buffer is writable */ UENUM = AO_USB_IN_EP; if (UEINTX & (1 << RWAL)) break; /* Wait for an IN buffer to be ready */ for (;;) { UENUM = AO_USB_IN_EP; if ((UEINTX & (1 << TXINI))) break; UEIENX |= (1 << TXINE); ao_sleep(&ao_usb_in_flushed); } /* Ack the interrupt */ UEINTX &= ~(1 << TXINI); } } /* Queue the current IN buffer for transmission */ static inline void _ao_usb_in_send(void) { UEINTX &= ~(1 << FIFOCON); } int ao_usb_flush(FILE *file) { (void) file; if (!ao_usb_running) return 0; ao_arch_block_interrupts(); /* Anytime we've sent a character since * the last time we flushed, we'll need * to send a packet -- the only other time * we would send a packet is when that * packet was full, in which case we now * want to send an empty packet */ if (!ao_usb_in_flushed) { ao_usb_in_flushed = true; _ao_usb_in_wait(); _ao_usb_in_send(); } ao_arch_release_interrupts(); return 0; } int ao_usb_putc(char c, FILE *file) { (void) file; if (!ao_usb_running) return (unsigned char) c; if (c == '\n') ao_usb_putc('\r', file); ao_arch_block_interrupts(); _ao_usb_in_wait(); /* Queue a byte */ UENUM = AO_USB_IN_EP; UEDATX = c; /* Send the packet when full */ if ((UEINTX & (1 << RWAL)) == 0) _ao_usb_in_send(); ao_usb_in_flushed = false; ao_arch_release_interrupts(); return (unsigned char) c; } static void _ao_usb_fifo_check(void) { while (!ao_fifo_full(&ao_usb_rx_fifo)) { UENUM = AO_USB_OUT_EP; for (;;) { uint8_t intx = UEINTX; if (intx & (1 << RWAL)) break; if (intx & (1 << FIFOCON)) { /* Ack the last packet */ UEINTX &= ~(1 << FIFOCON); } /* Check to see if a packet has arrived */ if ((intx & (1 << RXOUTI)) == 0) { UEIENX |= (1 << RXOUTE); return; } /* Ack the interrupt */ UEINTX = ~(1 << RXOUTI); } /* Pull a character out of the fifo */ uint8_t c = UEDATX; if (c == ('c' & 0x1f)) snek_abort = true; ao_fifo_insert(&ao_usb_rx_fifo, c); } } static int _ao_usb_pollchar(void) { if (ao_fifo_empty(&ao_usb_rx_fifo)) return AO_READ_AGAIN; uint8_t c = ao_fifo_remove(&ao_usb_rx_fifo); _ao_usb_fifo_check(); return c; } int ao_usb_getc(void) { int c; ao_arch_block_interrupts(); while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN) ao_sleep(&ao_stdin_ready); ao_arch_release_interrupts(); return c; } static void _ao_usb_ep0_handle(void) { UENUM = 0; uint8_t intx = UEINTX; if (intx & (1 << RXSTPI)) { _ao_usb_ep0_setup(); } if (intx & (1 << RXOUTI)) { _ao_usb_ep0_fill(UEBCLX); ao_usb_ep0_in_pending = true; /* we need to ack the packet */ } if ((UEIENX & (1 << TXINE)) && (intx & (1 << TXINI))) { if (ao_usb_address) { UDADDR = (1 << ADDEN) | ao_usb_address; ao_usb_address = 0; } } if (ao_usb_ep0_in_pending) { _ao_usb_ep0_flush(); UEIENX |= (1 << TXINE); } else { UEIENX &= ~(1 << TXINE); } } /* Endpoint interrupt */ ISR(USB_COM_vect) { uint8_t i = UEINT; UEINT = 0; if (i & (1 << 0)) _ao_usb_ep0_handle(); if (i & (1 << AO_USB_IN_EP)) { UENUM = AO_USB_IN_EP; UEIENX = 0; ao_wakeup(&ao_usb_in_flushed); } if (i & (1 << AO_USB_OUT_EP)) { UENUM = AO_USB_OUT_EP; UEIENX = 0; _ao_usb_fifo_check(); if (!ao_fifo_empty(&ao_usb_rx_fifo)) ao_wakeup(&ao_stdin_ready); } } #if AVR_VCC_5V #define AO_PAD_REGULATOR_INIT (1 << UVREGE) /* Turn on pad regulator */ #endif #if AVR_VCC_3V3 /* TeleScience V0.1 has a hardware bug -- UVcc is hooked up, but UCap is not * Make this work by running power through UVcc to the USB system */ #define AO_PAD_REGULATOR_INIT (1 << UVREGE) /* Turn off pad regulator */ #endif #if F_CPU == 16000000UL #define AO_USB_PLL_INPUT_PRESCALER (1 << PINDIV) /* Divide 16MHz clock by 2 */ #endif #if F_CPU == 8000000UL #define AO_USB_PLL_INPUT_PRESCALER 0 /* Don't divide clock */ #endif #define AO_USB_CON ((1 << USBE) | /* USB enable */ \ (0 << RSTCPU) | /* do not reset CPU */ \ (0 << LSM) | /* Full speed mode */ \ (0 << RMWKUP)) /* no remote wake-up */ \ void ao_usb_init(void) { /* Configure pad regulator */ UHWCON = AO_PAD_REGULATOR_INIT; /* Enable USB device, but freeze the clocks until initialized */ USBCON = AO_USB_CON | (1 < * * 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. */ #include "snek.h" #include "snek-io.h" #include FILE snek_avr_file = FDEV_SETUP_STREAM(ao_usb_putc, snek_eeprom_getchar, _FDEV_SETUP_RW); static void snek_intflash_wait_idle(void) { /* Wait for any outstanding writes to complete */ while (EECR & (1 << EEPE)) ; } static void snek_intflash_write(snek_offset_t pos, uint8_t d) { EEAR = pos; EEDR = d; ao_arch_critical( EECR |= (1 << EEMPE); EECR |= (1 << EEPE); ); snek_intflash_wait_idle(); } static uint8_t snek_intflash_read(snek_offset_t pos) { EEAR = pos; EECR |= (1 << EERE); return EEDR; } snek_poly_t snek_builtin_eeprom_write(void) { uint8_t c; snek_offset_t addr = 0; for (addr = 0; addr < 1024; addr++) { c = ao_usb_getc(); if (c == '\r') c = '\n'; if (c == ('d' & 0x1f)) c = 0xff; snek_intflash_write(addr, c); if (c == 0xff) break; } return SNEK_NULL; } static snek_soffset_t snek_eeprom_addr; #if 0 snek_poly_t snek_builtin_eeprom_load(void) { snek_interactive = false; snek_eeprom_addr = 0; snek_avr_file.get = snek_eeprom_getchar; return SNEK_NULL; } #endif static int __attribute__((noinline)) eeprom_showc(char c) { return ao_usb_putc(c, NULL); } static uint8_t __attribute__((noinline)) eeprom_getc(void) { if (snek_eeprom_addr < 1024) return snek_intflash_read(snek_eeprom_addr++); return 0xff; } snek_poly_t snek_builtin_eeprom_show(uint8_t nposition, uint8_t nnamed, snek_poly_t *args) { uint8_t c; (void) nnamed; (void) args; if (nposition) eeprom_showc('b' & 0x1f); snek_eeprom_addr = 0; while ((c = eeprom_getc()) != 0xff) eeprom_showc(c); if (nposition) eeprom_showc('c' & 0x1f); return SNEK_NULL; } snek_poly_t snek_builtin_eeprom_erase(void) { if (snek_intflash_read(0) != 0xff) snek_intflash_write(0, 0xff); return SNEK_NULL; } int snek_eeprom_getchar(FILE *stream) { (void) stream; uint8_t c = eeprom_getc(); if (c != 0xff) return c; snek_interactive = true; snek_avr_file.get = snek_io_getc; return EOF; } snek-1.1/chips/avr/snek-avr.builtin000066400000000000000000000011641353657467200173530ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # reset, 0 time.sleep, 1 time.monotonic, 0 random.seed, 1 random.randrange, 1 snek-1.1/chips/avr/snek-avr.defs000066400000000000000000000036521353657467200166320ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_AO = $(SNEK_ROOT)/ao SNEK_LOCAL_VPATH = $(SNEK_AVR):$(SNEK_AO) SNEK_AVR_SRC = \ snek-io.c \ snek-avr-eeprom.c \ ao-snek-avr.c \ ao-usb-avr.c \ ao-notask.c \ ao-product.c \ ao-panic.c \ strtod.c SNEK_AVR_INC = \ ao.h \ ao-arch.h \ ao-arch-funcs.h \ ao-led.h \ ao-notask.h \ ao-pins.h \ ao-product.h \ snek-avr.h \ ao-usb.h SNEK_AVR_BUILTINS = \ snek-gpio.builtin \ snek-eeprom.builtin \ snek-avr.builtin OPT=-Os -frename-registers -funsigned-char -fno-jump-tables -mcall-prologues SNEK_CFLAGS = $(SNEK_MOST_WARNINGS) $(SNEK_BASE_CFLAGS) AO_CFLAGS=\ -std=gnu99 $(OPT) -g AVR_CFLAGS=-DF_CPU=$(AVR_CLOCK) -mmcu=atmega32u4 -g $(SNEK_CFLAGS) -Waddr-space-convert \ -I. -I$(SNEK_AVR) -I$(SNEK_AO) -I$(SNEK_ROOT) $(AO_CFLAGS) CFLAGS = $(AVR_CFLAGS) $(SNEK_CFLAGS) LDSCRIPT=$(SNEK_AVR)/snek-avr51.x LDFLAGS=-Wl,-uvfprintf -lprintf_flt -lm \ -Wl,--defsym -Wl,__TEXT_REGION_LENGTH__=0x8000 \ -Wl,--defsym -Wl,__DATA_REGION_LENGTH__=0x880 \ -Wl,--defsym -Wl,__EEPROM_REGION_LENGTH__=0x400 \ -Wl,-T$(LDSCRIPT) \ -Wl,-Map=$(MAP) CC=avr-gcc BASE=$(PROGNAME)-$(SNEK_VERSION) PROG=$(BASE).elf HEX=$(BASE).hex MAP=$(BASE).map PRODUCT=$(PRODUCT_NAME)-v$(SNEK_VERSION) IDPRODUCT=0x000a .SUFFIXES: .elf .hex .elf.hex: avr-objcopy -O ihex -R .eeprom $^ $@ ao-product.h: $(SNEK_ROOT)/snek.defs Makefile python3 $(SNEK_AO)/make-product.py -v $(SNEK_VERSION) -p $(PRODUCT_NAME) > $@ snek-1.1/chips/avr/snek-avr.h000066400000000000000000000074671353657467200161500ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #ifndef _SNEK_AVR_H_ #define _SNEK_AVR_H_ #include #include #include #include #include #define sqrtf snek_sqrtf static inline float sqrtf(float x) { return powf(x, 0.5f); } #define SNEK_DEBUG 0 #define strtof(a,b) strtod(a,b) #define VALUE_STACK_SIZE 16 #define PARSE_STACK_SIZE 56 #define SNEK_STACK 32 #define PARSE_TABLE_DECLARATION(t) PROGMEM t #define PARSE_TABLE_FETCH_TOKEN(a) ((token_key_t) pgm_read_byte(a)) #define PARSE_TABLE_FETCH_INDEX(a) ((uint8_t) pgm_read_byte(a)) #define ERROR_FETCH_FORMAT_CHAR(a) ((char) pgm_read_byte(a)) /* no sense linking both functions */ #define memcpy(a,b,c) memmove(a,b,c) #define snek_error_name snek_internal_error #define snek_error(fmt, args...) ({ \ static const char PROGMEM __fmt__[] = (fmt); \ snek_internal_error(__fmt__, ## args); \ }) #define snek_error_0_name snek_internal_error_0 #define snek_error_0(string) ({ \ static const char PROGMEM __string__[] = (string); \ snek_internal_error_0(__string__); \ }) #define fprintf(file, fmt, args...) ({ \ static const char PROGMEM __fmt__[] = (fmt); \ fprintf_P(file, __fmt__, ## args); \ }) #define sprintf_const(dst, fmt, args...) ({ \ static const char PROGMEM __fmt__[] = (fmt); \ sprintf_P(dst, __fmt__, ##args); \ }) #define SNEK_BUILTIN_NAMES_DECLARE(n) PROGMEM n #define SNEK_BUILTIN_NAMES(a) ((uint8_t) pgm_read_byte(&snek_builtin_names[a])) #define SNEK_BUILTIN_NAMES_CMP(a,b) strcmp_P(a,b) #define SNEK_BUILTIN_DECLARE(n) PROGMEM n #define SNEK_BUILTIN_NFORMAL(b) ((int8_t) pgm_read_byte(&(b)->nformal)) #define SNEK_BUILTIN_FUNCV(b) ((snek_poly_t(*)(uint8_t, uint8_t, snek_poly_t *)) pgm_read_ptr(&(b)->funcv)) #define SNEK_BUILTIN_FUNC0(b) ((snek_poly_t(*)(void)) pgm_read_ptr(&(b)->func0)) #define SNEK_BUILTIN_FUNC1(b) ((snek_poly_t(*)(snek_poly_t)) pgm_read_ptr(&(b)->func1)) #define SNEK_BUILTIN_FUNC2(b) ((snek_poly_t(*)(snek_poly_t, snek_poly_t)) pgm_read_ptr(&(b)->func2)) #define SNEK_BUILTIN_FUNC3(b) ((snek_poly_t(*)(snek_poly_t, snek_poly_t, snek_poly_t)) pgm_read_ptr(&(b)->func3)) #define SNEK_BUILTIN_FUNC4(b) ((snek_poly_t(*)(snek_poly_t, snek_poly_t, snek_poly_t, snek_poly_t)) pgm_read_ptr(&(b)->func4)) #define SNEK_BUILTIN_VALUE(b) ((snek_poly_t)(uint32_t)pgm_read_dword(&(b)->value)) #define SNEK_ROOT_DECLARE(n) PROGMEM n #define SNEK_ROOT_TYPE(n) ((const snek_mem_t *) pgm_read_ptr(&(n)->type)) #define SNEK_ROOT_ADDR(n) ((void **) pgm_read_ptr(&(n)->addr)) static inline const char * avr_snek_builtin_names_return(const uint8_t *bits) { static char ret[SNEK_BUILTIN_NAMES_MAX_LEN + 1]; char *r = ret; while ((*r++ = (char) pgm_read_byte(bits++))) ; return ret; } #define snek_builtin_names_return(a) avr_snek_builtin_names_return(a) #define snek_builtin_names_len(a) strnlen_P(a, SNEK_BUILTIN_NAMES_MAX_LEN+1) #define SNEK_MEM_DECLARE(n) PROGMEM n #define SNEK_MEM_SIZE(m) ((snek_offset_t (*)(void *addr)) pgm_read_word(&(m)->size)) #define SNEK_MEM_MARK(m) ((void (*)(void *addr)) pgm_read_ptr(&(m)->mark)) #define SNEK_MEM_MOVE(m) ((void (*)(void *addr)) pgm_read_ptr(&(m)->move)) #define SNEK_MEMS_DECLARE(n) PROGMEM n int snek_eeprom_getchar(FILE *stream); #define SNEK_IO_LINEBUF 80 extern FILE snek_avr_file; #endif /* _SNEK_AVR_H_ */ snek-1.1/chips/avr/snek-avr51.x000066400000000000000000000205711353657467200163250ustar00rootroot00000000000000/* Default linker script, for normal executables */ /* Copyright (C) 2014-2015 Free Software Foundation, Inc. Copying and distribution of this script, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr") OUTPUT_ARCH(avr:51) __TEXT_REGION_LENGTH__ = DEFINED(__TEXT_REGION_LENGTH__) ? __TEXT_REGION_LENGTH__ : 128K; __DATA_REGION_LENGTH__ = DEFINED(__DATA_REGION_LENGTH__) ? __DATA_REGION_LENGTH__ : 0xff00; __EEPROM_REGION_LENGTH__ = DEFINED(__EEPROM_REGION_LENGTH__) ? __EEPROM_REGION_LENGTH__ : 64K; __FUSE_REGION_LENGTH__ = DEFINED(__FUSE_REGION_LENGTH__) ? __FUSE_REGION_LENGTH__ : 1K; __LOCK_REGION_LENGTH__ = DEFINED(__LOCK_REGION_LENGTH__) ? __LOCK_REGION_LENGTH__ : 1K; __SIGNATURE_REGION_LENGTH__ = DEFINED(__SIGNATURE_REGION_LENGTH__) ? __SIGNATURE_REGION_LENGTH__ : 1K; __USER_SIGNATURE_REGION_LENGTH__ = DEFINED(__USER_SIGNATURE_REGION_LENGTH__) ? __USER_SIGNATURE_REGION_LENGTH__ : 1K; MEMORY { text (rx) : ORIGIN = 0, LENGTH = __TEXT_REGION_LENGTH__ data (rw!x) : ORIGIN = 0x800100, LENGTH = __DATA_REGION_LENGTH__ eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = __EEPROM_REGION_LENGTH__ fuse (rw!x) : ORIGIN = 0x820000, LENGTH = __FUSE_REGION_LENGTH__ lock (rw!x) : ORIGIN = 0x830000, LENGTH = __LOCK_REGION_LENGTH__ signature (rw!x) : ORIGIN = 0x840000, LENGTH = __SIGNATURE_REGION_LENGTH__ user_signatures (rw!x) : ORIGIN = 0x850000, LENGTH = __USER_SIGNATURE_REGION_LENGTH__ } SECTIONS { /* Read-only sections, merged into text segment: */ .hash : { *(.hash) } .dynsym : { *(.dynsym) } .dynstr : { *(.dynstr) } .gnu.version : { *(.gnu.version) } .gnu.version_d : { *(.gnu.version_d) } .gnu.version_r : { *(.gnu.version_r) } .rel.init : { *(.rel.init) } .rela.init : { *(.rela.init) } .rel.text : { *(.rel.text) *(.rel.text.*) *(.rel.gnu.linkonce.t*) } .rela.text : { *(.rela.text) *(.rela.text.*) *(.rela.gnu.linkonce.t*) } .rel.fini : { *(.rel.fini) } .rela.fini : { *(.rela.fini) } .rel.rodata : { *(.rel.rodata) *(.rel.rodata.*) *(.rel.gnu.linkonce.r*) } .rela.rodata : { *(.rela.rodata) *(.rela.rodata.*) *(.rela.gnu.linkonce.r*) } .rel.data : { *(.rel.data) *(.rel.data.*) *(.rel.gnu.linkonce.d*) } .rela.data : { *(.rela.data) *(.rela.data.*) *(.rela.gnu.linkonce.d*) } .rel.ctors : { *(.rel.ctors) } .rela.ctors : { *(.rela.ctors) } .rel.dtors : { *(.rel.dtors) } .rela.dtors : { *(.rela.dtors) } .rel.got : { *(.rel.got) } .rela.got : { *(.rela.got) } .rel.bss : { *(.rel.bss) } .rela.bss : { *(.rela.bss) } .rel.plt : { *(.rel.plt) } .rela.plt : { *(.rela.plt) } /* Internal text space or external memory. */ .text : { *(.vectors) KEEP(*(.vectors)) /* For data that needs to reside in the lower 64k of progmem. */ *(.progmem.gcc*) /* PR 13812: Placing the trampolines here gives a better chance that they will be in range of the code that uses them. */ . = ALIGN(2); __trampolines_start = . ; /* The jump trampolines for the 16-bit limited relocs will reside here. */ *(.trampolines) *(.trampolines*) __trampolines_end = . ; /* avr-libc expects these data to reside in lower 64K. */ *libprintf_flt.a:*(.progmem.data) *libc.a:*(.progmem.data) *(.progmem*) . = ALIGN(2); /* For future tablejump instruction arrays for 3 byte pc devices. We don't relax jump/call instructions within these sections. */ *(.jumptables) *(.jumptables*) /* For code that needs to reside in the lower 128k progmem. */ *(.lowtext) *(.lowtext*) __ctors_start = . ; *(.ctors) __ctors_end = . ; __dtors_start = . ; *(.dtors) __dtors_end = . ; KEEP(SORT(*)(.ctors)) KEEP(SORT(*)(.dtors)) /* From this point on, we don't bother about wether the insns are below or above the 16 bits boundary. */ *(.init0) /* Start here after reset. */ KEEP (*(.init0)) *(.init1) KEEP (*(.init1)) *(.init2) /* Clear __zero_reg__, set up stack pointer. */ KEEP (*(.init2)) *(.init3) KEEP (*(.init3)) *(.init4) /* Initialize data and BSS. */ KEEP (*(.init4)) *(.init5) KEEP (*(.init5)) *(.init6) /* C++ constructors. */ KEEP (*(.init6)) *(.init7) KEEP (*(.init7)) *(.init8) KEEP (*(.init8)) *(.init9) /* Call main(). */ KEEP (*(.init9)) *(.text) . = ALIGN(2); *(.text.*) . = ALIGN(2); *(.fini9) /* _exit() starts here. */ KEEP (*(.fini9)) *(.fini8) KEEP (*(.fini8)) *(.fini7) KEEP (*(.fini7)) *(.fini6) /* C++ destructors. */ KEEP (*(.fini6)) *(.fini5) KEEP (*(.fini5)) *(.fini4) KEEP (*(.fini4)) *(.fini3) KEEP (*(.fini3)) *(.fini2) KEEP (*(.fini2)) *(.fini1) KEEP (*(.fini1)) *(.fini0) /* Infinite loop after program termination. */ KEEP (*(.fini0)) _etext = . ; __text_end__ = .; } > text .data : { PROVIDE (__data_start = .) ; PROVIDE (__data_start__ = .) ; PROVIDE (__snek_data_start__ = .); snek*(.data) snek*(.data*) PROVIDE (__snek_data_end__ = .); *(.data) *(.data*) *(.gnu.linkonce.d*) *(.rodata) /* We need to include .rodata here if gcc is used */ *(.rodata*) /* with -fdata-sections. */ *(.gnu.linkonce.r*) . = ALIGN(2); _edata = . ; PROVIDE (__data_end = .) ; PROVIDE (__data_end__ = .) ; } > data AT> text .bss ADDR(.data) + SIZEOF (.data) : AT (ADDR (.bss)) { PROVIDE (__bss_start = .) ; PROVIDE (__bss_start__ = .) ; PROVIDE (__snek_bss_start__ = .); snek*(.bss) snek*(.bss*) snek*(COMMON) PROVIDE (__snek_bss_end__ = .); *(.bss) *(.bss*) *(COMMON) PROVIDE (__bss_end = .) ; PROVIDE (__bss_end__ = .) ; } > data __data_load_start = LOADADDR(.data); __data_load_end = __data_load_start + SIZEOF(.data); /* Global data not cleared after reset. */ .noinit ADDR(.bss) + SIZEOF (.bss) : AT (ADDR (.noinit)) { PROVIDE (__noinit_start = .) ; *(.noinit*) PROVIDE (__noinit_end = .) ; _end = . ; PROVIDE (__heap_start = .) ; } > data .eeprom : { /* See .data above... */ KEEP(*(.eeprom*)) __eeprom_end = . ; } > eeprom .fuse : { KEEP(*(.fuse)) KEEP(*(.lfuse)) KEEP(*(.hfuse)) KEEP(*(.efuse)) } > fuse .lock : { KEEP(*(.lock*)) } > lock .signature : { KEEP(*(.signature*)) } > signature .user_signatures : { KEEP(*(.user_signatures*)) } > user_signatures /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } .note.gnu.build-id : { *(.note.gnu.build-id) } /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } /* DWARF 3 */ .debug_pubtypes 0 : { *(.debug_pubtypes) } .debug_ranges 0 : { *(.debug_ranges) } /* DWARF Extension. */ .debug_macro 0 : { *(.debug_macro) } } snek-1.1/chips/avr/strtod.c000066400000000000000000000124331353657467200157210ustar00rootroot00000000000000/* Copyright (c) 2002-2005 Michael Stumpf Copyright (c) 2006,2008 Dmitry Xmelkov All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* $Id: strtod.c 2191 2010-11-05 13:45:57Z arcanum $ */ #include #include #include #include #include /* INFINITY, NAN */ #include /* Only GCC 4.2 calls the library function to convert an unsigned long to float. Other GCC-es (including 4.3) use a signed long to float conversion along with a large inline code to correct the result. */ extern double __floatunsisf (unsigned long); PROGMEM static const float pwr_p10 [6] = { 1e+1, 1e+2, 1e+4, 1e+8, 1e+16, 1e+32 }; PROGMEM static const float pwr_m10 [6] = { 1e-1, 1e-2, 1e-4, 1e-8, 1e-16, 1e-32 }; /** The strtod() function converts the initial portion of the string pointed to by \a nptr to double representation. The expected form of the string is an optional plus ( \c '+' ) or minus sign ( \c '-' ) followed by a sequence of digits optionally containing a decimal-point character, optionally followed by an exponent. An exponent consists of an \c 'E' or \c 'e', followed by an optional plus or minus sign, followed by a sequence of digits. Leading white-space characters in the string are not skipped. The strtod() function returns the converted value, if any. If \a endptr is not \c NULL, a pointer to the character after the last character used in the conversion is stored in the location referenced by \a endptr. If no conversion is performed, zero is returned and the value of \a nptr is stored in the location referenced by \a endptr. If the correct value would cause overflow, plus or minus \c INFINITY is returned (according to the sign of the value), and \c ERANGE is stored in \c errno. If the correct value would cause underflow, zero is returned and \c ERANGE is stored in \c errno. */ double strtod (const char * nptr, char ** endptr) { union { unsigned long u32; float flt; } x; unsigned char c; int exp; unsigned char flag; #define FL_MINUS 0x01 /* number is negative */ #define FL_ANY 0x02 /* any digit was readed */ #define FL_OVFL 0x04 /* overflow was */ #define FL_DOT 0x08 /* decimal '.' was */ #define FL_MEXP 0x10 /* exponent 'e' is neg. */ if (endptr) *endptr = (char *)nptr; c = *nptr++; flag = 0; x.u32 = 0; exp = 0; while (1) { c -= '0'; if (c <= 9) { flag |= FL_ANY; if (flag & FL_OVFL) { if (!(flag & FL_DOT)) exp += 1; } else { if (flag & FL_DOT) exp -= 1; /* x.u32 = x.u32 * 10 + c */ x.u32 = (((x.u32 << 2) + x.u32) << 1) + c; if (x.u32 >= (ULONG_MAX - 9) / 10) flag |= FL_OVFL; } } else if (c == (('.'-'0') & 0xff) && !(flag & FL_DOT)) { flag |= FL_DOT; } else { break; } c = *nptr++; } if (c == (('e'-'0') & 0xff) || c == (('E'-'0') & 0xff)) { int i; c = *nptr++; i = 2; if (c == '-') { flag |= FL_MEXP; c = *nptr++; } else if (c == '+') { c = *nptr++; } else { i = 1; } c -= '0'; if (c > 9) { nptr -= i; } else { i = 0; do { if (i < 3200) i = i * 10 + c; c = *nptr++ - '0'; } while (c <= 9); if (flag & FL_MEXP) i = -i; exp += i; } } if ((flag & FL_ANY) && endptr) *endptr = (char *)nptr - 1; x.flt = __floatunsisf (x.u32); /* manually */ if (x.flt != 0) { int pwr; if (exp < 0) { nptr = (void *)(pwr_m10 + 5); exp = -exp; } else { nptr = (void *)(pwr_p10 + 5); } for (pwr = 32; pwr; pwr >>= 1) { for (; exp >= pwr; exp -= pwr) { union { unsigned long u32; float flt; } y; y.u32 = pgm_read_dword ((float *)nptr); x.flt *= y.flt; } nptr -= sizeof(float); } } return x.flt; } snek-1.1/chips/samd21/000077500000000000000000000000001353657467200145325ustar00rootroot00000000000000snek-1.1/chips/samd21/ao-adc-samd21.c000066400000000000000000000050431353657467200171110ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include #include static void ao_adc_sync(void) { while (samd21_adc.status & (1 << SAMD21_ADC_STATUS_SYNCBUSY)) ; } uint16_t ao_adc_read(uint8_t channel) { ao_adc_sync(); samd21_adc.inputctrl = ((channel << SAMD21_ADC_INPUTCTRL_MUXPOS) | (SAMD21_ADC_INPUTCTRL_MUXNEG_GND << SAMD21_ADC_INPUTCTRL_MUXNEG) | (0 << SAMD21_ADC_INPUTCTRL_INPUTSCAN) | (0 << SAMD21_ADC_INPUTCTRL_INPUTOFFSET) | (SAMD21_ADC_INPUTCTRL_GAIN_DIV2 << SAMD21_ADC_INPUTCTRL_GAIN)); ao_adc_sync(); samd21_adc.swtrig = (1 << SAMD21_ADC_SWTRIG_START); while ((samd21_adc.intflag & (1 << SAMD21_ADC_INTFLAG_RESRDY)) == 0) ; uint16_t result = samd21_adc.result; return result; } void ao_adc_init(void) { /* supply a clock */ samd21_gclk_clkctrl(0, SAMD21_GCLK_CLKCTRL_ID_ADC); /* enable the device */ samd21_pm.apbcmask |= (1 << SAMD21_PM_APBCMASK_ADC); /* Reset */ samd21_adc.ctrla = (1 << SAMD21_ADC_CTRLA_SWRST); while ((samd21_adc.ctrla & (1 << SAMD21_ADC_CTRLA_SWRST)) != 0 || (samd21_adc.status & (1 << SAMD21_ADC_STATUS_SYNCBUSY)) != 0) ; /* Load ADC calibration values */ uint32_t b = (samd21_aux1.calibration >> SAMD21_AUX1_CALIBRATION_ADC_BIASCAL) & SAMD21_AUX1_CALIBRATION_ADC_BIASCAL_MASK; uint32_t l = (samd21_aux1.calibration >> SAMD21_AUX1_CALIBRATION_ADC_LINEARITY) & SAMD21_AUX1_CALIBRATION_ADC_LINEARITY_MASK; samd21_adc.calib = ((b << SAMD21_ADC_CALIB_BIAS_CAL) | (l << SAMD21_ADC_CALIB_LINEARITY_CAL)); samd21_adc.ctrlb = ((0 << SAMD21_ADC_CTRLB_DIFFMODE) | (0 << SAMD21_ADC_CTRLB_LEFTADJ) | (0 << SAMD21_ADC_CTRLB_FREERUN) | (0 << SAMD21_ADC_CTRLB_CORREN) | (SAMD21_ADC_CTRLB_RESSEL_12BIT << SAMD21_ADC_CTRLB_RESSEL) | (SAMD21_ADC_CTRLB_PRESCALER_DIV512 << SAMD21_ADC_CTRLB_PRESCALER)); samd21_adc.sampctrl = 0x3f; samd21_adc.refctrl = (SAMD21_ADC_REFCTRL_REFSEL_INTVCC1 << SAMD21_ADC_REFCTRL_REFSEL); samd21_adc.ctrla = (1 << SAMD21_ADC_CTRLA_ENABLE); /* Discard the first sample */ (void) ao_adc_read(0); } snek-1.1/chips/samd21/ao-adc-samd21.h000066400000000000000000000013141353657467200171130ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #ifndef _AO_ADC_SAMD21_H_ #define _AO_ADC_SAMD21_H_ uint16_t ao_adc_read(uint8_t channel); void ao_adc_init(void); #endif /* _AO_ADC_SAMD21_H_ */ snek-1.1/chips/samd21/ao-apa102.c000066400000000000000000000032601353657467200162600ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #define bit(v) do { \ port_c->outtgl = (1 << pin_c); \ ao_arch_nop(); \ ao_gpio_set(port_d, pin_d, v); \ ao_arch_nop(); \ port_c->outtgl = (1 << pin_c); \ ao_arch_nop(); \ } while (0) #define byte(v) do { \ uint8_t _bit_ = 0x80; \ while (_bit_) { \ bit(!!((v) & _bit_)); \ _bit_ >>= 1; \ } \ } while(0) #define repeat(v,c) do { \ uint8_t _i_; \ for (_i_ = 0; _i_ < (c); _i_++) \ bit(v); \ } while (0) void ao_snek_apa102_write(void *gpio_d, uint8_t pin_d, void *gpio_c, uint8_t pin_c, int npixel, struct snek_neopixel *pixels) { struct samd21_port *port_d = gpio_d; struct samd21_port *port_c = gpio_c; ao_gpio_set(port_c, pin_c, 1); int i; for (i = 0; i < 32; i++) ao_arch_nop(); repeat(0, 32); while (npixel--) { byte(0xff); byte(pixels->b); byte(pixels->g); byte(pixels->r); } repeat(1, 32); } snek-1.1/chips/samd21/ao-arch-funcs.h000066400000000000000000000114221353657467200173310ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _AO_ARCH_FUNCS_H_ #define _AO_ARCH_FUNCS_H_ #define AO_MODE_PULL_NONE 0 #define AO_MODE_PULL_UP 1 #define AO_MODE_PULL_DOWN 2 static inline void ao_enable_port(struct samd21_port *port) { (void) port; samd21_pm.apbbmask |= (1 << SAMD21_PM_APBBMASK_PORT); } static inline void ao_disable_port(struct samd21_port *port) { (void) port; } static inline void ao_gpio_set(struct samd21_port *port, uint8_t bit, uint8_t v) { if (v) port->outset = (1 << bit); else port->outclr = (1 << bit); } static inline uint8_t ao_gpio_get(struct samd21_port *port, uint8_t bit) { return (port->in >> bit) & 1; } static inline void ao_gpio_dir_set(struct samd21_port *port, uint8_t bit, bool output) { if (output) port->dirset = (1 << bit); else port->dirclr = (1 << bit); } static inline void ao_enable_output(struct samd21_port *port, uint8_t pin, uint8_t v) { ao_enable_port(port); ao_gpio_set(port, pin, v); samd21_port_dir_set(port, pin, SAMD21_PORT_DIR_OUT); samd21_port_pincfg_set(port, pin, (1 << SAMD21_PORT_PINCFG_DRVSTR) | (1 << SAMD21_PORT_PINCFG_PULLEN) | (1 << SAMD21_PORT_PINCFG_INEN) | (1 << SAMD21_PORT_PINCFG_PMUXEN), (0 << SAMD21_PORT_PINCFG_DRVSTR) | (0 << SAMD21_PORT_PINCFG_PULLEN) | (0 << SAMD21_PORT_PINCFG_INEN) | (0 << SAMD21_PORT_PINCFG_PMUXEN)); } static inline void ao_enable_input(struct samd21_port *port, uint8_t pin, uint32_t mode) { ao_enable_port(port); samd21_port_dir_set(port, pin, SAMD21_PORT_DIR_IN); uint8_t pincfg; pincfg = ((0 << SAMD21_PORT_PINCFG_DRVSTR) | (0 << SAMD21_PORT_PINCFG_PULLEN) | (1 << SAMD21_PORT_PINCFG_INEN) | (0 << SAMD21_PORT_PINCFG_PMUXEN)); if (mode != AO_MODE_PULL_NONE) { pincfg |= (1 << SAMD21_PORT_PINCFG_PULLEN); ao_gpio_set(port, pin, mode == AO_MODE_PULL_UP); } samd21_port_pincfg_set(port, pin, (1 << SAMD21_PORT_PINCFG_DRVSTR) | (1 << SAMD21_PORT_PINCFG_PULLEN) | (1 << SAMD21_PORT_PINCFG_INEN) | (1 << SAMD21_PORT_PINCFG_PMUXEN), pincfg); } static inline void ao_enable_cs(struct samd21_port *port, uint8_t pin) { ao_enable_output(port, pin, 1); } #define ARM_PUSH32(stack, val) (*(--(stack)) = (val)) typedef uint32_t ao_arch_irq_t; static inline uint32_t ao_arch_irqsave(void) { uint32_t primask; asm("mrs %0,primask" : "=&r" (primask)); ao_arch_block_interrupts(); return primask; } static inline void ao_arch_irqrestore(uint32_t primask) { asm("msr primask,%0" : : "r" (primask)); } static inline void ao_arch_memory_barrier(void) { asm volatile("" ::: "memory"); } #define ao_arch_wait_interrupt() do { \ asm("\twfi\n"); \ ao_arch_release_interrupts(); \ asm(".global ao_idle_loc\nao_idle_loc:"); \ ao_arch_block_interrupts(); \ } while (0) #define ao_arch_critical(b) do { \ uint32_t __mask = ao_arch_irqsave(); \ do { b } while (0); \ ao_arch_irqrestore(__mask); \ } while (0) /* ao_serial_samd21.c */ #if USE_SERIAL_0_FLOW && USE_SERIAL_0_SW_FLOW || USE_SERIAL_1_FLOW && USE_SERIAL_1_SW_FLOW #define HAS_SERIAL_SW_FLOW 1 #else #define HAS_SERIAL_SW_FLOW 0 #endif #if USE_SERIAL_1_FLOW && !USE_SERIAL_1_SW_FLOW #define USE_SERIAL_1_HW_FLOW 1 #endif #if USE_SERIAL_0_FLOW && !USE_SERIAL_0_SW_FLOW #define USE_SERIAL_0_HW_FLOW 1 #endif #if USE_SERIAL_0_HW_FLOW || USE_SERIAL_1_HW_FLOW #define HAS_SERIAL_HW_FLOW 1 #else #define HAS_SERIAL_HW_FLOW 0 #endif struct ao_samd21_usart { struct ao_fifo rx_fifo; struct ao_fifo tx_fifo; struct samd21_sercom *reg; uint8_t tx_running; uint8_t draining; #if HAS_SERIAL_SW_FLOW /* RTS - 0 if we have FIFO space, 1 if not * CTS - 0 if we can send, 0 if not */ struct samd21_port *gpio_rts; struct samd21_port *gpio_cts; uint8_t pin_rts; uint8_t pin_cts; uint8_t rts; #endif }; #if HAS_USART_0 extern struct ao_samd21_usart ao_samd21_usart0; #endif void ao_serial_init(void); /* ao_usb_samd21.c */ #if AO_USB_OUT_HOOK void ao_usb_out_hook(uint8_t *buffer, uint16_t count); #endif void start(void); #endif /* _AO_ARCH_FUNCS_H_ */ snek-1.1/chips/samd21/ao-arch.h000066400000000000000000000062521353657467200162220ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _AO_ARCH_H_ #define _AO_ARCH_H_ #include #include /* * Samd21 definitions and code fragments for AltOS */ #define AO_LED_TYPE uint16_t #define ao_arch_naked_declare __attribute__((naked)) #define ao_arch_naked_define #define ao_arch_reboot() \ (samd21_scb.aircr = ((SAMD21_SCB_AIRCR_VECTKEY_KEY << SAMD21_SCB_AIRCR_VECTKEY) | \ (1 << SAMD21_SCB_AIRCR_SYSRESETREQ))) #define ao_arch_nop() asm("nop") #define ao_arch_interrupt(n) /* nothing */ #define ao_arch_block_interrupts() asm("cpsid i") #define ao_arch_release_interrupts() asm("cpsie i") /* * ao_timer.c * * For the samd21, we want to use the DFLL48 clock */ /* GCLK 0 is always the system clock source */ #define AO_GCLK_SYSCLK 0 /* If there's a 32kHz xtal, use that for the 32kHz oscillator */ #ifdef AO_XOSC32K # ifndef AO_GCLK_XOSC32K # define AO_GCLK_XOSC32K 1 # endif #endif /* If there's a high-freq xtal, use that */ #ifdef AO_XOSC # ifndef AO_GCLK_XOSC # define AO_GCLK_XOSC 1 # endif # ifndef AO_XOSC_GCLK_DIV # define AO_XOSC_GCLK_DIV 1 # endif # define AO_FDPLL96M ((AO_XOSC_FREQ / AO_XOSC_DIV * AO_XOSC_MUL) / AO_XOSC_GCLK_DIV) /* By default, use the xosc for the system, but allow the dfll48m to * drive USB if desired. */ # ifndef AO_GCLK_FDPLL96M # define AO_SYSCLK AO_FDPLL96M # define AO_GCLK_FDPLL96M AO_GCLK_SYSCLK # define AO_GCLK_DFLL48M 2 # endif #endif /* AO_XOSC */ #if AO_DFLL48M # ifndef AO_GCLK_DFLL48M # define AO_SYSCLK AO_DFLL48M # define AO_GCLK_DFLL48M AO_GCLK_SYSCLK # endif #endif #ifndef AO_GCLK_USB # if AO_DFLL48M # define AO_GCLK_USB AO_GCLK_DFLL48M # else # define AO_GCLK_USB AO_GCLK_SYSCLK # endif #endif #define AO_HCLK (AO_SYSCLK / AO_AHB_PRESCALER) #define AO_HCLK (AO_SYSCLK / AO_AHB_PRESCALER) #define AO_PCLK (AO_HCLK / AO_APB_PRESCALER) #define AO_SYSTICK (AO_HCLK) #define AO_PANIC_DELAY_SCALE (AO_SYSCLK / 12000000) #define AO_SAMD21_NVIC_HIGH_PRIORITY (0 << 6) #define AO_SAMD21_NVIC_CLOCK_PRIORITY (1 << 6) #define AO_SAMD21_NVIC_MED_PRIORITY (2 << 6) #define AO_SAMD21_NVIC_LOW_PRIORITY (3 << 6) /* ADC maximum reported value */ #define AO_ADC_MAX 4095 /* This has to be 65536 so that TCC and TC match; TC isn't configurable */ #define AO_TCC_PERIOD 65536 #define SNEK_PWM_MAX (AO_TCC_PERIOD-1) #define AO_TICK_TYPE uint32_t #define AO_TICK_SIGNED int32_t bool ao_usb_waiting(void); #define AO_CMD_LEN 128 #define AO_STACK_SIZE 2048 #endif /* _AO_ARCH_H_ */ snek-1.1/chips/samd21/ao-dma-samd21.c000066400000000000000000000121231353657467200171200ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include uint8_t ao_dma_done[SAMD21_DMAC_NCHAN]; static struct samd21_dmac_desc samd21_dmac_desc[SAMD21_DMAC_NCHAN] __attribute__((aligned(16))); static struct samd21_dmac_desc samd21_dmac_wrb[SAMD21_DMAC_NCHAN] __attribute__((aligned(16))); static volatile uint16_t saved_intpend; static volatile int interrupts; void samd21_dmac_isr(void) { uint16_t intpend = samd21_dmac.intpend; ++interrupts; saved_intpend = intpend; if (intpend & 0xff00) { uint8_t id = (intpend >> SAMD21_DMAC_INTPEND_ID) & SAMD21_DMAC_INTPEND_ID_MASK; samd21_dmac.intpend = intpend; if (intpend & (1 << SAMD21_DMAC_INTPEND_TCMPL)) { ao_dma_done[id] = 1; ao_wakeup(&ao_dma_done[id]); } } } static void dump_dma(char *where) { printf("DMA %s ctrl %04x intpend %04x intstatus %04x\n", where, samd21_dmac.ctrl, samd21_dmac.intpend, samd21_dmac.intstatus); fflush(stdout); printf(" busych %04x pendch %04x active %08x chctrla %02x\n", samd21_dmac.busych, samd21_dmac.pendch, samd21_dmac.active, samd21_dmac.chctrla); fflush(stdout); printf(" chctrlb %08x chintflag %02x chstatus %02x\n", samd21_dmac.chctrlb, samd21_dmac.chintflag, samd21_dmac.chstatus); fflush(stdout); printf(" btctrl %04x btcnt %04x srcaddr %08x dstaddr %08x descaddr %08x\n", samd21_dmac_desc[0].btctrl, samd21_dmac_desc[0].btcnt, samd21_dmac_desc[0].srcaddr, samd21_dmac_desc[0].dstaddr, samd21_dmac_desc[0].descaddr); fflush(stdout); printf("intpend %04x interrupts %d\n", saved_intpend, interrupts); ao_delay(AO_SEC_TO_TICKS(1)); } void ao_dma_start_transfer(uint8_t id, void *src, void *dst, uint16_t count, uint32_t chctrlb, uint16_t btctrl) { /* Set up the descriptor */ samd21_dmac_desc[id].btctrl = btctrl; samd21_dmac_desc[id].btcnt = count; samd21_dmac_desc[id].srcaddr = (uint32_t) src; samd21_dmac_desc[id].dstaddr = (uint32_t) dst; samd21_dmac_desc[id].descaddr = 0; dump_dma("start"); /* Configure the channel and enable it */ ao_arch_block_interrupts(); samd21_dmac.chid = id; samd21_dmac.chctrlb = chctrlb; samd21_dmac.chctrla = (1 << SAMD21_DMAC_CHCTRLA_ENABLE); ao_arch_release_interrupts(); } void ao_dma_done_transfer(uint8_t id) { printf("done[%d] = %d\n", id, ao_dma_done[id]); dump_dma("done"); /* Disable channel */ ao_arch_block_interrupts(); samd21_dmac.chid = id; samd21_dmac.chctrla = 0; ao_arch_release_interrupts(); /* Reset done flag */ ao_dma_done[id] = 0; } void ao_dma_init(void) { uint8_t ch; /* Enable DMAC clocks */ samd21_pm.ahbmask |= (1 << SAMD21_PM_AHBMASK_DMAC); samd21_pm.apbbmask |= (1 << SAMD21_PM_APBBMASK_DMAC); #if 0 /* Enable HPB clocks so we can talk to peripherals */ samd21_pm.ahbmask |= ((1 << SAMD21_PM_AHBMASK_HPB0) | (1 << SAMD21_PM_AHBMASK_HPB1) | (1 << SAMD21_PM_AHBMASK_HPB2)); #endif samd21_pm.apbamask |= (1 << SAMD21_PM_APBAMASK_PAC0); samd21_pm.apbbmask |= (1 << SAMD21_PM_APBBMASK_PAC1); samd21_pm.apbcmask |= (1 << SAMD21_PM_APBCMASK_PAC2); /* Reset DMAC device */ samd21_dmac.ctrl = 0; samd21_dmac.ctrl = (1 << SAMD21_DMAC_CTRL_SWRST); while (samd21_dmac.ctrl & (1 << SAMD21_DMAC_CTRL_SWRST)) ; samd21_dmac.baseaddr = (uint32_t) &samd21_dmac_desc[0]; samd21_dmac.wrbaddr = (uint32_t) &samd21_dmac_wrb[0]; samd21_dmac.swtrigctrl = 0; /* Set QoS to highest value */ samd21_dmac.qosctrl = ((SAMD21_DMAC_QOSCTRL_HIGH << SAMD21_DMAC_QOSCTRL_DQOS) | (SAMD21_DMAC_QOSCTRL_HIGH << SAMD21_DMAC_QOSCTRL_FQOS) | (SAMD21_DMAC_QOSCTRL_HIGH << SAMD21_DMAC_QOSCTRL_WRBQOS)); /* Enable DMAC controller with all priority levels */ samd21_dmac.ctrl = ((1 << SAMD21_DMAC_CTRL_DMAENABLE) | (1 << SAMD21_DMAC_CTRL_LVLEN(0)) | (1 << SAMD21_DMAC_CTRL_LVLEN(1)) | (1 << SAMD21_DMAC_CTRL_LVLEN(2)) | (1 << SAMD21_DMAC_CTRL_LVLEN(3))); /* Reset all DMAC channels */ for (ch = 0; ch < SAMD21_DMAC_NCHAN; ch++) { samd21_dmac.chid = ch; samd21_dmac.chctrla = (1 << SAMD21_DMAC_CHCTRLA_SWRST); while (samd21_dmac.chctrla & (1 << SAMD21_DMAC_CHCTRLA_SWRST)) ; samd21_dmac.chintenset = (1 << SAMD21_DMAC_CHINTFLAG_TCMPL); } /* configure interrupts */ samd21_nvic_set_enable(SAMD21_NVIC_ISR_DMAC_POS); samd21_nvic_set_priority(SAMD21_NVIC_ISR_DMAC_POS, 3); } snek-1.1/chips/samd21/ao-dma-samd21.h000066400000000000000000000021561353657467200171320ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _AO_DMA_SAM21_H_ #define _AO_DMA_SAM21_H_ extern uint8_t ao_dma_done[SAMD21_DMAC_NCHAN]; void ao_dma_init(void); void ao_dma_start_transfer(uint8_t id, void *src, void *dst, uint16_t count, uint32_t chctrlb, uint16_t btctrl); void ao_dma_done_transfer(uint8_t id); #endif /* _AO_DMA_SAM21_H_ */ snek-1.1/chips/samd21/ao-flash-samd21.c000066400000000000000000000133221353657467200174560ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include #include /* Erase rows are four pages */ static uint32_t samd21_nvmctrl_row_size(void) { return samd21_nvmctrl_page_size() * 4; } /* size of a lock region. That's just total flash size / 16 */ static uint32_t samd21_nvmctrl_lock_region(void) { return samd21_flash_size() >> 4; } /* Find the bit index of an address within the lock word */ static uint8_t ao_flash_lock_region_bit(void *addr) { return ((uint32_t) addr) / samd21_nvmctrl_lock_region(); } static uint8_t ao_flash_is_locked(void *addr) { return (samd21_nvmctrl.lock >> ao_flash_lock_region_bit(addr)) & 1; } /* Execute a single flash operation, waiting for it to complete. This * bit of code must be in ram */ static void __attribute__ ((section(".ramtext"),noinline)) _ao_flash_execute(uint16_t cmd) { while ((samd21_nvmctrl.intflag & (1 << SAMD21_NVMCTRL_INTFLAG_READY)) == 0) ; samd21_nvmctrl.ctrla = ((cmd << SAMD21_NVMCTRL_CTRLA_CMD) | (SAMD21_NVMCTRL_CTRLA_CMDEX_KEY << SAMD21_NVMCTRL_CTRLA_CMDEX)); while ((samd21_nvmctrl.intflag & (1 << SAMD21_NVMCTRL_INTFLAG_READY)) == 0) ; samd21_nvmctrl.intflag = ((1 << SAMD21_NVMCTRL_INTFLAG_READY) | (1 << SAMD21_NVMCTRL_INTFLAG_ERROR)); } /* Set the address of the next flash operation */ static void _ao_flash_set_addr(void *addr) { while ((samd21_nvmctrl.intflag & (1 << SAMD21_NVMCTRL_INTFLAG_READY)) == 0) ; samd21_nvmctrl.addr = ((uint32_t) addr) >> 1; while ((samd21_nvmctrl.intflag & (1 << SAMD21_NVMCTRL_INTFLAG_READY)) == 0) ; } /* Unlock a region of flash */ static void _ao_flash_unlock(void *addr) { if (!ao_flash_is_locked(addr)) return; _ao_flash_set_addr(addr); _ao_flash_execute(SAMD21_NVMCTRL_CTRLA_CMD_UR); } #if 0 /* Lock a region of flash */ static void _ao_flash_lock(void *addr) { if (ao_flash_is_locked(addr)) return; _ao_flash_set_addr(addr); _ao_flash_execute(SAMD21_NVMCTRL_CTRLA_CMD_LR); } #endif /* Erase a row of flash */ static void _ao_flash_erase_row(void *row) { _ao_flash_unlock(row); _ao_flash_set_addr(row); _ao_flash_execute(SAMD21_NVMCTRL_CTRLA_CMD_ER); } static uint32_t flash_write_offset; static uint8_t flash_write_byte; static bool flash_write_pending; extern uint16_t __flash__[]; extern uint16_t __flash_end__[]; #define __flash8__ ((uint8_t *) __flash__) #define __flash8_end__ ((uint8_t *) __flash_end__) static uint32_t ao_flash_size(void) { return __flash8_end__ - __flash8__; } static bool _ao_flash_row_erased(void *dst) { uint8_t *d = dst; uint32_t offset; uint32_t row_size = samd21_nvmctrl_row_size(); for (offset = 0; offset < row_size; offset++) if (d[offset] != 0xff) return false; return true; } static void ao_flash_start_page(void *dst) { fflush(stdout); ao_arch_block_interrupts(); if (((uintptr_t) dst & (samd21_nvmctrl_row_size() - 1)) == 0) { _ao_flash_unlock(dst); if (!_ao_flash_row_erased(dst)) _ao_flash_erase_row(dst); } /* Clear write buffer */ _ao_flash_execute(SAMD21_NVMCTRL_CTRLA_CMD_PBC); ao_arch_release_interrupts(); } static void ao_flash_finish_page(void *dst) { fflush(stdout); ao_arch_block_interrupts(); _ao_flash_set_addr(dst); _ao_flash_execute(SAMD21_NVMCTRL_CTRLA_CMD_WP); ao_arch_release_interrupts(); } void ao_flash_write_init(void) { flash_write_offset = 0; flash_write_pending = false; } void ao_flash_write_byte(uint8_t c) { /* Check for start page */ if (flash_write_offset % samd21_nvmctrl_page_size() == 0) ao_flash_start_page(__flash8__ + flash_write_offset); /* write the byte */ if (flash_write_pending) { __flash__[flash_write_offset >> 1] = ((uint16_t) c << 8) | flash_write_byte; flash_write_offset += 2; flash_write_pending = false; } else { flash_write_byte = c; flash_write_pending = true; } /* Check for end page */ if (flash_write_offset % samd21_nvmctrl_page_size() == 0) ao_flash_finish_page(__flash8__ + flash_write_offset - samd21_nvmctrl_page_size()); } void ao_flash_write_flush(void) { uint32_t page_size = samd21_nvmctrl_page_size(); if (flash_write_pending) ao_flash_write_byte(0xff); if ((flash_write_offset % page_size) != 0) ao_flash_finish_page(__flash8__ + (flash_write_offset & ~(page_size - 1))); } static uint32_t flash_read_offset; void ao_flash_read_init(void) { flash_read_offset = 0; } uint8_t ao_flash_read_byte(void) { if (flash_read_offset >= ao_flash_size()) return 0xff; return __flash8__[flash_read_offset++]; } static uint32_t ao_flash_first_erased(void) { uint32_t offset = ao_flash_size(); while (offset > 0) { --offset; if (__flash8__[offset] != 0xff) return offset + 1; } return 0; } void ao_flash_erase_all(void) { uint32_t offset = ao_flash_first_erased(); uint32_t row_size = samd21_nvmctrl_row_size(); if (offset == 0) return; /* compute last byte to erase */ offset -= 1; offset &= ~(row_size - 1); for (;;) { ao_arch_block_interrupts(); _ao_flash_unlock(__flash8__ + offset); _ao_flash_erase_row(__flash8__ + offset); ao_arch_release_interrupts(); if (offset == 0) break; offset -= row_size; } } snek-1.1/chips/samd21/ao-flash.h000066400000000000000000000020331353657467200163730ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _AO_FLASH_H_ #define _AO_FLASH_H_ void ao_flash_write_init(void); void ao_flash_write_byte(uint8_t c); void ao_flash_write_flush(void); void ao_flash_read_init(void); uint8_t ao_flash_read_byte(void); void ao_flash_erase_all(void); #endif /* _AO_FLASH_H_ */ snek-1.1/chips/samd21/ao-interrupt.c000066400000000000000000000061721353657467200173350ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include extern void main(void); extern char __stack__; extern char __text_start__, __text_end__; extern char __data_start__, __data_end__; extern char __bss_start__, __bss_end__; /* Interrupt functions */ void samd21_halt_isr(void) { ao_panic(AO_PANIC_CRASH); } void samd21_ignore_isr(void) { } const void *samd21_interrupt_vector[]; uint32_t samd21_flash_size(void) { uint32_t nvmp = (samd21_nvmctrl.param >> SAMD21_NVMCTRL_PARAM_NVMP) & SAMD21_NVMCTRL_PARAM_NVMP_MASK; uint32_t psz = (samd21_nvmctrl.param >> SAMD21_NVMCTRL_PARAM_PSZ) & SAMD21_NVMCTRL_PARAM_PSZ_MASK; /* page size is 2**(3 + psz) */ return nvmp << (3 + psz); } void start(void) { /* Turn on sysctrl */ samd21_pm.apbamask |= (1 << SAMD21_PM_APBAMASK_SYSCTRL); samd21_scb.vtor = (uint32_t) &samd21_interrupt_vector; memcpy(&__data_start__, &__text_end__, &__data_end__ - &__data_start__); memset(&__bss_start__, '\0', &__bss_end__ - &__bss_start__); main(); } #define STRINGIFY(x) #x #define isr(name) \ void __attribute__ ((weak)) samd21_ ## name ## _isr(void); \ _Pragma(STRINGIFY(weak samd21_ ## name ## _isr = samd21_ignore_isr)) #define isr_halt(name) \ void __attribute__ ((weak)) samd21_ ## name ## _isr(void); \ _Pragma(STRINGIFY(weak samd21_ ## name ## _isr = samd21_halt_isr)) isr(nmi); isr_halt(hardfault); isr_halt(memmanage); isr_halt(busfault); isr_halt(usagefault); isr(svc); isr(debugmon); isr(pendsv); isr(systick); isr(pm); /* IRQ0 */ isr(sysctrl); isr(wdt); isr(rtc); isr(eic); isr(nvmctrl); isr(dmac); isr(usb); isr(evsys); isr(sercom0); isr(sercom1); isr(sercom2); isr(sercom3); isr(sercom4); isr(sercom5); isr(tcc0); isr(tcc1); isr(tcc2); isr(tc3); isr(tc4); isr(tc5); isr(tc6); isr(tc7); isr(adc); isr(ac); isr(dac); isr(ptc); isr(i2s); isr(ac1); isr(tcc3); #undef isr #undef isr_halt #define i(addr,name) [(addr)/4] = samd21_ ## name ## _isr __attribute__ ((section(".interrupt"))) const void *samd21_interrupt_vector[] __attribute((aligned(128))) = { [0] = &__stack__, [1] = start, i(0x08, nmi), i(0x0c, hardfault), i(0x2c, svc), i(0x30, debugmon), i(0x38, pendsv), i(0x3c, systick), i(0x40, pm), /* IRQ0 */ i(0x44, sysctrl), i(0x48, wdt), i(0x4c, rtc), i(0x50, eic), i(0x54, nvmctrl), i(0x58, dmac), i(0x5c, usb), i(0x60, evsys), i(0x64, sercom0), i(0x68, sercom1), i(0x6c, sercom2), i(0x70, sercom3), i(0x74, sercom4), i(0x78, sercom5), i(0x7c, tcc0), i(0x80, tcc1), i(0x84, tcc2), i(0x88, tc3), i(0x8c, tc4), i(0x90, tc5), i(0x94, tc6), i(0x98, tc7), i(0x9c, adc), i(0xa0, ac), i(0xa4, dac), i(0xa8, ptc), i(0xac, i2s), i(0xb0, ac1), i(0xb4, tcc3), }; snek-1.1/chips/samd21/ao-neopixel.c000066400000000000000000000041651353657467200171240ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include void ao_snek_neopixel_write(void *gpio, uint8_t pin, int npixel, struct snek_neopixel *pixels) { volatile uint32_t *outtgl = &(((struct samd21_port *) gpio)->outtgl); uint32_t value = ((uint32_t) 1 << pin); while (npixel--) { int32_t p = pixels->p; uint8_t bit; pixels++; ao_arch_block_interrupts(); for (bit = 0; bit < 24; bit++) { *outtgl = value; ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); if (p < 0) { ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); *outtgl = value; } else { *outtgl = value; ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); } ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); ao_arch_nop(); p <<= 1; } ao_arch_release_interrupts(); } } snek-1.1/chips/samd21/ao-serial-samd21.c000066400000000000000000000156731353657467200176530ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include static int _ao_usart_tx_start(struct ao_samd21_usart *usart) { if (!ao_fifo_empty(&usart->tx_fifo)) { #if HAS_SERIAL_SW_FLOW if (usart->gpio_cts && ao_gpio_get(usart->gpio_cts, usart->pin_cts, foo) == 1) { ao_exti_enable(usart->gpio_cts, usart->pin_cts); return 0; } #endif if (usart->reg->intflag & (1 << SAMD21_SERCOM_INTFLAG_DRE)) { usart->tx_running = 1; usart->reg->intenset = (1 << SAMD21_SERCOM_INTFLAG_DRE) | (1 << SAMD21_SERCOM_INTFLAG_TXC); usart->reg->data = ao_fifo_remove(&usart->tx_fifo); ao_wakeup(&usart->tx_fifo); return 1; } } return 0; } static void _ao_usart_rx(struct ao_samd21_usart *usart, int is_stdin) { if (usart->reg->intflag & (1 << SAMD21_SERCOM_INTFLAG_RXC)) { if (!ao_fifo_full(&usart->rx_fifo)) { ao_fifo_insert(&usart->rx_fifo, usart->reg->data); ao_wakeup(&usart->rx_fifo); if (is_stdin) ao_wakeup(&ao_stdin_ready); #if HAS_SERIAL_SW_FLOW /* If the fifo is nearly full, turn off RTS and wait * for it to drain a bunch */ if (usart->gpio_rts && ao_fifo_mostly(usart->rx_fifo)) { ao_gpio_set(usart->gpio_rts, usart->pin_rts, usart->pin_rts, 1); usart->rts = 0; } #endif } else { usart->reg->intenclr = (1 << SAMD21_SERCOM_INTFLAG_RXC); } } } static void ao_usart_isr(struct ao_samd21_usart *usart, int is_stdin) { _ao_usart_rx(usart, is_stdin); if (!_ao_usart_tx_start(usart)) usart->reg->intenclr = (1 << SAMD21_SERCOM_INTFLAG_DRE); if (usart->reg->intflag & (1 << SAMD21_SERCOM_INTFLAG_TXC)) { usart->tx_running = 0; usart->reg->intenclr = (1 << SAMD21_SERCOM_INTFLAG_TXC); if (usart->draining) { usart->draining = 0; ao_wakeup(&usart->tx_fifo); } } } static const uint32_t ao_usart_speeds[] = { [AO_SERIAL_SPEED_4800] = 4800, [AO_SERIAL_SPEED_9600] = 9600, [AO_SERIAL_SPEED_19200] = 19200, [AO_SERIAL_SPEED_57600] = 57600, [AO_SERIAL_SPEED_115200] = 115200, }; static void ao_usart_set_speed(struct ao_samd21_usart *usart, uint8_t speed) { uint64_t top = (uint64_t) ao_usart_speeds[speed] << (4 + 16); uint16_t baud = 65536 - (top + AO_SYSCLK/2) / AO_SYSCLK; usart->reg->baud = baud; } static void ao_usart_init(struct ao_samd21_usart *usart, int hw_flow, int id) { struct samd21_sercom *reg = usart->reg; (void) hw_flow; /* Send a clock along */ samd21_gclk_clkctrl(0, SAMD21_GCLK_CLKCTRL_ID_SERCOM0_CORE + id); samd21_nvic_set_enable(SAMD21_NVIC_ISR_SERCOM0_POS + id); samd21_nvic_set_priority(SAMD21_NVIC_ISR_SERCOM0_POS + id, 4); /* enable */ samd21_pm.apbcmask |= (1 << (SAMD21_PM_APBCMASK_SERCOM0 + id)); /* Reset */ reg->ctrla = (1 << SAMD21_SERCOM_CTRLA_SWRST); while ((reg->ctrla & (1 << SAMD21_SERCOM_CTRLA_SWRST)) || (reg->syncbusy & (1 << SAMD21_SERCOM_SYNCBUSY_SWRST))) ; reg->ctrlb = ((0 << SAMD21_SERCOM_CTRLB_CHSIZE) | (0 << SAMD21_SERCOM_CTRLB_SBMODE) | (0 << SAMD21_SERCOM_CTRLB_COLDEN) | (0 << SAMD21_SERCOM_CTRLB_SFDE) | (0 << SAMD21_SERCOM_CTRLB_ENC) | (0 << SAMD21_SERCOM_CTRLB_PMODE) | (1 << SAMD21_SERCOM_CTRLB_TXEN) | (1 << SAMD21_SERCOM_CTRLB_RXEN) | (3 << SAMD21_SERCOM_CTRLB_FIFOCLR)); ao_usart_set_speed(usart, AO_SERIAL_SPEED_9600); /* finish setup and enable the hardware */ reg->ctrla = ((0 << SAMD21_SERCOM_CTRLA_SWRST) | (1 << SAMD21_SERCOM_CTRLA_ENABLE) | (1 << SAMD21_SERCOM_CTRLA_MODE) | (1 << SAMD21_SERCOM_CTRLA_RUNSTDBY) | (0 << SAMD21_SERCOM_CTRLA_IBON) | (0 << SAMD21_SERCOM_CTRLA_SAMPR) | (1 << SAMD21_SERCOM_CTRLA_TXPO) | /* pad[2] */ (3 << SAMD21_SERCOM_CTRLA_RXPO) | /* pad[3] */ (0 << SAMD21_SERCOM_CTRLA_SAMPA) | (0 << SAMD21_SERCOM_CTRLA_FORM) | /* no parity */ (0 << SAMD21_SERCOM_CTRLA_CMODE) | /* async */ (0 << SAMD21_SERCOM_CTRLA_CPOL) | (1 << SAMD21_SERCOM_CTRLA_DORD)); /* LSB first */ /* Enable receive interrupt */ reg->intenset = (1 << SAMD21_SERCOM_INTFLAG_RXC); } static int _ao_usart_pollchar(struct ao_samd21_usart *usart) { int c; if (ao_fifo_empty(&usart->rx_fifo)) c = AO_READ_AGAIN; else { uint8_t u; u = ao_fifo_remove(&usart->rx_fifo); if ((usart->reg->intenset & (1 << SAMD21_SERCOM_INTFLAG_RXC)) == 0) { if (ao_fifo_barely(&usart->rx_fifo)) usart->reg->intenset = (1 << SAMD21_SERCOM_INTFLAG_RXC); } #if HAS_SERIAL_SW_FLOW /* If we've cleared RTS, check if there's space now and turn it back on */ if (usart->gpio_rts && usart->rts == 0 && ao_fifo_barely(usart->rx_fifo)) { ao_gpio_set(usart->gpio_rts, usart->pin_rts, foo, 0); usart->rts = 1; } #endif c = u; } return c; } static char ao_usart_getchar(struct ao_samd21_usart *usart) { int c; ao_arch_block_interrupts(); while ((c = _ao_usart_pollchar(usart)) == AO_READ_AGAIN) ao_sleep(&usart->rx_fifo); ao_arch_release_interrupts(); return (char) c; } static void ao_usart_putchar(struct ao_samd21_usart *usart, char c) { ao_arch_block_interrupts(); while (ao_fifo_full(&usart->tx_fifo)) ao_sleep(&usart->tx_fifo); ao_fifo_insert(&usart->tx_fifo, c); _ao_usart_tx_start(usart); ao_arch_release_interrupts(); } static void ao_usart_drain(struct ao_samd21_usart *usart) { ao_arch_block_interrupts(); while (!ao_fifo_empty(&usart->tx_fifo) || usart->tx_running) { usart->draining = 1; ao_sleep(&usart->tx_fifo); } ao_arch_release_interrupts(); } #if HAS_SERIAL_0 struct ao_samd21_usart ao_samd21_usart0; void samd21_sercom0_isr(void) { ao_usart_isr(&ao_samd21_usart0, USE_SERIAL_0_STDIN); } char ao_serial0_getchar(void) { return ao_usart_getchar(&ao_samd21_usart0); } void ao_serial0_putchar(char c) { ao_usart_putchar(&ao_samd21_usart0, c); } int _ao_serial0_pollchar(void) { return _ao_usart_pollchar(&ao_samd21_usart0); } void ao_serial0_drain(void) { ao_usart_drain(&ao_samd21_usart0); } void ao_serial0_set_speed(uint8_t speed) { ao_usart_drain(&ao_samd21_usart0); ao_usart_set_speed(&ao_samd21_usart0, speed); } #endif /* HAS_SERIAL_0 */ void ao_serial_init(void) { #if HAS_SERIAL_0 #if SERIAL_0_PA10_PA11 /* Pin settings */ ao_enable_port(&samd21_port_a); samd21_port_pmux_set(&samd21_port_a, 10, SAMD21_PORT_PMUX_FUNC_C); samd21_port_pmux_set(&samd21_port_a, 11, SAMD21_PORT_PMUX_FUNC_C); #else #error "No SERIAL_0 port configuration specified" #endif ao_samd21_usart0.reg = &samd21_sercom0; ao_usart_init(&ao_samd21_usart0, 0, 0); #if USE_SERIAL_0_STDIN ao_add_stdio(_ao_serial0_pollchar, ao_serial0_putchar, NULL); #endif #endif } snek-1.1/chips/samd21/ao-serial.h000066400000000000000000000046021353657467200165610ustar00rootroot00000000000000/* * Copyright © 2012 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _AO_SERIAL_H_ #define _AO_SERIAL_H_ #define AO_SERIAL_SPEED_4800 0 #define AO_SERIAL_SPEED_9600 1 #define AO_SERIAL_SPEED_19200 2 #define AO_SERIAL_SPEED_57600 3 #define AO_SERIAL_SPEED_115200 4 #if HAS_SERIAL_0 extern volatile struct ao_fifo ao_serial0_rx_fifo; extern volatile struct ao_fifo ao_serial0_tx_fifo; char ao_serial0_getchar(void); int _ao_serial0_pollchar(void); uint8_t _ao_serial0_sleep_for(uint16_t timeout); void ao_serial0_putchar(char c); void ao_serial0_drain(void); void ao_serial0_set_speed(uint8_t speed); #endif #if HAS_SERIAL_1 extern volatile struct ao_fifo ao_serial1_rx_fifo; extern volatile struct ao_fifo ao_serial1_tx_fifo; char ao_serial1_getchar(void); int _ao_serial1_pollchar(void); uint8_t _ao_serial1_sleep_for(uint16_t timeout); void ao_serial1_putchar(char c); void ao_serial1_drain(void); void ao_serial1_set_speed(uint8_t speed); #endif #if HAS_SERIAL_2 extern volatile struct ao_fifo ao_serial2_rx_fifo; extern volatile struct ao_fifo ao_serial2_tx_fifo; char ao_serial2_getchar(void); int _ao_serial2_pollchar(void); uint8_t _ao_serial2_sleep_for(uint16_t timeout); void ao_serial2_putchar(char c); void ao_serial2_drain(void); void ao_serial2_set_speed(uint8_t speed); #endif #if HAS_SERIAL_3 extern volatile struct ao_fifo ao_serial3_rx_fifo; extern volatile struct ao_fifo ao_serial3_tx_fifo; char ao_serial3_getchar(void); int _ao_serial3_pollchar(void); uint8_t _ao_serial3_sleep_for(uint16_t timeout); void ao_serial3_putchar(char c); void ao_serial3_drain(void); void ao_serial3_set_speed(uint8_t speed); #endif void ao_serial_init(void); #endif /* _AO_SERIAL_H_ */ snek-1.1/chips/samd21/ao-snek.c000066400000000000000000000073451353657467200162440ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include #include #include #include #include #include #include void ao_snek_set_pwm(void *gpio, uint8_t pin, void *timer, uint8_t config, uint16_t value) { uint8_t ch = config & AO_SNEK_TIMER_CH_MASK; uint8_t func = config & AO_SNEK_TIMER_FUNC_MASK; uint8_t dev = config & AO_SNEK_TIMER_DEV_MASK; if (dev == AO_SNEK_TIMER_DEV_TCC) ao_tcc_set(timer, ch&3, value); else ao_tc_set(timer, ch, value); switch (func) { case AO_SNEK_TIMER_FUNC_E: samd21_port_pmux_set(gpio, pin, SAMD21_PORT_PMUX_FUNC_E); break; case AO_SNEK_TIMER_FUNC_F: samd21_port_pmux_set(gpio, pin, SAMD21_PORT_PMUX_FUNC_F); break; } samd21_port_pincfg_set(gpio, pin, (1 << SAMD21_PORT_PINCFG_DRVSTR) | (1 << SAMD21_PORT_PINCFG_PULLEN) | (1 << SAMD21_PORT_PINCFG_INEN), (0 << SAMD21_PORT_PINCFG_DRVSTR) | (0 << SAMD21_PORT_PINCFG_PULLEN) | (0 << SAMD21_PORT_PINCFG_INEN)); } static void ao_snek_clr_pmux(void *port, uint8_t pin) { samd21_port_pincfg_set(port, pin, (1 << SAMD21_PORT_PINCFG_PMUXEN), (0 << SAMD21_PORT_PINCFG_PMUXEN)); } void ao_snek_clr_pwm(void *port, uint8_t pin) { ao_snek_clr_pmux(port, pin); } void ao_snek_set_adc(void *gpio, uint8_t pin) { samd21_port_pmux_set(gpio, pin, SAMD21_PORT_PMUX_FUNC_B); samd21_port_pincfg_set(gpio, pin, (1 << SAMD21_PORT_PINCFG_DRVSTR) | (1 << SAMD21_PORT_PINCFG_PULLEN) | (1 << SAMD21_PORT_PINCFG_INEN), (0 << SAMD21_PORT_PINCFG_DRVSTR) | (0 << SAMD21_PORT_PINCFG_PULLEN) | (1 << SAMD21_PORT_PINCFG_INEN)); } void ao_snek_clr_adc(void *gpio, uint8_t pin) { ao_snek_clr_pmux(gpio, pin); } uint16_t ao_snek_get_adc(uint8_t adc) { return ao_adc_read(adc); } #ifdef AO_LED_TX void ao_snek_running(bool running) { if (running) ao_led_on(AO_LED_TX); else ao_led_off(AO_LED_TX); } #endif void ao_usb_out_hook(uint8_t *hook_buf, uint16_t len) { uint16_t i; for (i = 0; i < len; i++) if (hook_buf[i] == ('c' & 0x1f)) snek_abort = true; } int _errno; int *__errno(void) { return &_errno; } static jmp_buf snek_reset_buf; extern char __snek_data_start__, __snek_data_end__; extern char __snek_bss_start__, __snek_bss_end__; extern char __text_start__, __text_end__; extern char __data_start__, __data_end__; extern char __bss_start__, __bss_end__; snek_poly_t snek_builtin_reset(void) { /* reset data */ memcpy(&__snek_data_start__, &__text_end__ + (&__snek_data_start__ - &__data_start__), &__snek_data_end__ - &__snek_data_start__); /* reset bss */ memset(&__snek_bss_start__, '\0', &__snek_bss_end__ - &__snek_bss_start__); /* and off we go! */ longjmp(snek_reset_buf, 1); return SNEK_NULL; } int main(void) { ao_clock_init(); #ifdef LEDS_AVAILABLE ao_led_init(); #endif #ifdef AO_LED_TX ao_led_on(AO_LED_TX); #endif ao_timer_init(); ao_tcc_samd21_init(); ao_tc_samd21_init(); ao_adc_init(); ao_usb_init(); setjmp(snek_reset_buf); ao_snek_port_init(); snek_init(); snek_eeprom_load(); printf("Welcome to snek " SNEK_VERSION "\n"); fflush(stdout); #ifdef AO_LED_TX ao_snek_running(false); #endif for (;;) snek_parse(); } snek-1.1/chips/samd21/ao-snek.h000066400000000000000000000041471353657467200162460ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #ifndef _AO_SNEK_H_ #define _AO_SNEK_H_ #include #define RX_LINEBUF 132 #define SNEK_GETC() getc(stdin) #define SNEK_POOL (16 * 1024) #define SNEK_IO_GETC(file) ao_usb_getc() #define SNEK_IO_WAITING(file) ao_usb_waiting() void ao_snek_set_pwm(void *gpio, uint8_t pin, void *timer, uint8_t c, uint16_t value); void ao_snek_clr_pwm(void *gpio, uint8_t pin); #ifdef AO_SNEK_PWM_RAMP_STEP #define AO_TIMER_HOOK ao_snek_step_pwm() void ao_snek_step_pwm(void); #endif int ao_snek_getc(FILE *stream); void snek(void); extern bool snek_eof; #define SNEK_PIN_PULL_DOWN 0x01 #define SNEK_PIN_PULL_UP 0x02 #define SNEK_PIN_RAMP_PWM 0x04 void snek_eeprom_load(void); int snek_eeprom_getchar(FILE *stream); void ao_snek_set_adc(void *gpio, uint8_t pin); void ao_snek_clr_adc(void *gpio, uint8_t pin); uint16_t ao_snek_get_adc(uint8_t adc); void ao_snek_port_init(void); void ao_snek(void); void ao_snek_reset(void); void ao_snek_running(bool running); #ifdef AO_LED_TX #define SNEK_CODE_HOOK_START ao_snek_running(true); #define SNEK_CODE_HOOK_STOP ao_snek_running(false); #endif struct snek_neopixel { union { struct { uint8_t _extra, b, r, g; }; uint32_t p; }; }; extern struct snek_neopixel *snek_neopixels; #define SNEK_MEM_CACHE_NUM 1 #define SNEK_MEM_CACHE_0 snek_neopixels void ao_snek_neopixel_write(void *port, uint8_t pin, int npixel, struct snek_neopixel *pixels); void ao_snek_apa102_write(void *gpio_d, uint8_t pin_d, void *gpio_c, uint8_t pin_c, int npixel, struct snek_neopixel *pixels); #endif /* _AO_SNEK_H_ */ snek-1.1/chips/samd21/ao-stdio.c000066400000000000000000000017141353657467200164200ustar00rootroot00000000000000/* * Copyright © 2009 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "ao.h" #include "snek-io.h" static FILE __stdio = FDEV_SETUP_STREAM(ao_usb_putc, snek_io_getc, ao_usb_flush, _FDEV_SETUP_RW); FILE *const __iob[3] = { &__stdio, &__stdio, &__stdio }; snek-1.1/chips/samd21/ao-tc-samd21.c000066400000000000000000000031731353657467200167720ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include #include void ao_tc_set(struct samd21_tc *tc, uint8_t channel, uint32_t value) { tc->mode_16.cc[channel] = value; } static void ao_tc_init(struct samd21_tc *tc, uint32_t apbcmask) { samd21_pm.apbcmask |= apbcmask; /* Reset the device */ tc->ctrla = (1 << SAMD21_TC_CTRLA_SWRST); while ((tc->ctrla & (1 << SAMD21_TC_CTRLA_SWRST)) != 0 || (tc->status & (1 << SAMD21_TC_STATUS_SYNCBUSY)) != 0) ; tc->ctrla = ((SAMD21_TC_CTRLA_PRESCSYNC_GCLK << SAMD21_TC_CTRLA_PRESCSYNC) | (SAMD21_TC_CTRLA_PRESCALER_DIV1 << SAMD21_TC_CTRLA_PRESCALER) | (SAMD21_TC_CTRLA_WAVEGEN_NPWM << SAMD21_TC_CTRLA_WAVEGEN) | (SAMD21_TC_CTRLA_MODE_COUNT16) | (1 << SAMD21_TC_CTRLA_ENABLE)); } void ao_tc_samd21_init(void) { /* SAMD21G18 has only TC3-TC5 */ samd21_gclk_clkctrl(0, SAMD21_GCLK_CLKCTRL_ID_TCC2_TC3); samd21_gclk_clkctrl(0, SAMD21_GCLK_CLKCTRL_ID_TC4_TC5); ao_tc_init(&samd21_tc3, 1 << SAMD21_PM_APBCMASK_TC3); ao_tc_init(&samd21_tc4, 1 << SAMD21_PM_APBCMASK_TC4); ao_tc_init(&samd21_tc5, 1 << SAMD21_PM_APBCMASK_TC5); } snek-1.1/chips/samd21/ao-tc-samd21.h000066400000000000000000000013571353657467200170010ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #ifndef _AO_TC_SAMD21_H_ #define _AO_TC_SAMD21_H_ void ao_tc_set(struct samd21_tc *tc, uint8_t channel, uint32_t value); void ao_tc_samd21_init(void); #endif /* _AO_TC_SAMD21_H_ */ snek-1.1/chips/samd21/ao-tcc-samd21.c000066400000000000000000000043201353657467200171300ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include #include void ao_tcc_set(struct samd21_tcc *tcc, uint8_t channel, uint32_t value) { tcc->cc[channel] = value; } static void ao_tcc_init(struct samd21_tcc *tcc, uint32_t apbcmask) { samd21_pm.apbcmask |= apbcmask; /* Reset the device */ tcc->ctrla = (1 << SAMD21_TCC_CTRLA_SWRST); while ((tcc->ctrla & (1 << SAMD21_TCC_CTRLA_SWRST)) != 0 || (tcc->syncbusy & (1 << SAMD21_TCC_SYNCBUSY_SWRST)) != 0) ; tcc->per = AO_TCC_PERIOD - 1; #if 0 tcc->evctrl = ((1 << SAMD21_TCC_EVCTRL_MCEO(0)) | (1 << SAMD21_TCC_EVCTRL_MCEO(1)) | (1 << SAMD21_TCC_EVCTRL_MCEO(2)) | (1 << SAMD21_TCC_EVCTRL_MCEO(3))); #endif tcc->wave = ((SAMD21_TCC_WAVE_WAVEGEN_NPWM << SAMD21_TCC_WAVE_WAVEGEN) | (0 << SAMD21_TCC_WAVE_RAMP) | (0 << SAMD21_TCC_WAVE_CIPEREN) | (0 << SAMD21_TCC_WAVE_CCCEN(0)) | (0 << SAMD21_TCC_WAVE_CCCEN(1)) | (0 << SAMD21_TCC_WAVE_CCCEN(2)) | (0 << SAMD21_TCC_WAVE_CCCEN(3)) | (0 << SAMD21_TCC_WAVE_POL(0)) | (0 << SAMD21_TCC_WAVE_POL(1)) | (0 << SAMD21_TCC_WAVE_POL(1)) | (0 << SAMD21_TCC_WAVE_POL(3)) | (0 << SAMD21_TCC_WAVE_SWAP(0)) | (0 << SAMD21_TCC_WAVE_SWAP(1)) | (0 << SAMD21_TCC_WAVE_SWAP(1)) | (0 << SAMD21_TCC_WAVE_SWAP(3))); tcc->ctrla = (1 << SAMD21_TCC_CTRLA_ENABLE); } void ao_tcc_samd21_init(void) { samd21_gclk_clkctrl(0, SAMD21_GCLK_CLKCTRL_ID_TCC0_TCC1); samd21_gclk_clkctrl(0, SAMD21_GCLK_CLKCTRL_ID_TCC2_TC3); ao_tcc_init(&samd21_tcc0, 1 << SAMD21_PM_APBCMASK_TCC0); ao_tcc_init(&samd21_tcc1, 1 << SAMD21_PM_APBCMASK_TCC1); ao_tcc_init(&samd21_tcc2, 1 << SAMD21_PM_APBCMASK_TCC2); } snek-1.1/chips/samd21/ao-tcc-samd21.h000066400000000000000000000013661353657467200171440ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #ifndef _AO_TCC_SAMD21_H_ #define _AO_TCC_SAMD21_H_ void ao_tcc_set(struct samd21_tcc *tcc, uint8_t channel, uint32_t value); void ao_tcc_samd21_init(void); #endif /* _AO_TCC_SAMD21_H_ */ snek-1.1/chips/samd21/ao-timer.c000066400000000000000000000177071353657467200164270ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include #include #ifndef HAS_TICK #define HAS_TICK 1 #endif #if HAS_TICK volatile AO_TICK_TYPE ao_tick_count; AO_TICK_TYPE ao_time(void) { return ao_tick_count; } uint64_t ao_time_ns(void) { AO_TICK_TYPE before, after; uint32_t cvr; do { before = ao_tick_count; cvr = samd21_systick.cvr; after = ao_tick_count; } while (before != after); return (uint64_t) after * (1000000000ULL / AO_HERTZ) + (uint64_t) cvr * (1000000000ULL / AO_SYSTICK); } #if AO_DATA_ALL volatile uint8_t ao_data_interval = 1; volatile uint8_t ao_data_count; #endif void samd21_systick_isr(void) { ao_arch_release_interrupts(); if (samd21_systick.csr & (1 << SAMD21_SYSTICK_CSR_COUNTFLAG)) { ++ao_tick_count; #ifdef AO_TIMER_HOOK AO_TIMER_HOOK; #endif } } #if HAS_ADC void ao_timer_set_adc_interval(uint8_t interval) { ao_arch_critical( ao_data_interval = interval; ao_data_count = 0; ); } #endif #define SYSTICK_RELOAD (AO_SYSTICK / AO_HERTZ - 1) void ao_timer_init(void) { samd21_systick.csr = 0; samd21_systick.rvr = SYSTICK_RELOAD; samd21_systick.cvr = 0; samd21_systick.csr = ((1 << SAMD21_SYSTICK_CSR_ENABLE) | (1 << SAMD21_SYSTICK_CSR_TICKINT) | (SAMD21_SYSTICK_CSR_CLKSOURCE_HCLK_8 << SAMD21_SYSTICK_CSR_CLKSOURCE)); /* Set clock to lowest priority */ samd21_scb.shpr3 |= 3 << 30; } #endif void ao_clock_init(void) { /* Set flash wait state to tolerate 48MHz */ samd21_nvmctrl.ctrlb |= (1 << SAMD21_NVMCTRL_CTRLB_RWS); samd21_pm.apbamask |= ((1 << SAMD21_PM_APBAMASK_GCLK) | (1 << SAMD21_PM_APBAMASK_SYSCTRL)); /* Reset gclk */ samd21_gclk.ctrl = (1 << SAMD21_GCLK_CTRL_SWRST) ; /* Wait for reset to complete */ while ((samd21_gclk.ctrl & (1 << SAMD21_GCLK_CTRL_SWRST)) && (samd21_gclk.status & (1 << SAMD21_GCLK_STATUS_SYNCBUSY))) ; #ifdef AO_XOSC /* Enable xosc (external xtal oscillator) */ samd21_sysctrl.xosc = ((SAMD21_SYSCTRL_XOSC_STARTUP_8192 << SAMD21_SYSCTRL_XOSC_STARTUP) | (1 << SAMD21_SYSCTRL_XOSC_AMPGC) | (SAMD21_SYSCTRL_XOSC_GAIN_16MHz << SAMD21_SYSCTRL_XOSC_GAIN) | (0 << SAMD21_SYSCTRL_XOSC_ONDEMAND) | (1 << SAMD21_SYSCTRL_XOSC_RUNSTDBY) | (1 << SAMD21_SYSCTRL_XOSC_XTALEN)); samd21_sysctrl.xosc |= ((1 << SAMD21_SYSCTRL_XOSC_ENABLE)); /* Wait for xosc */ while ((samd21_sysctrl.pclksr & (1 << SAMD21_SYSCTRL_PCLKSR_XOSCRDY)) == 0) ; /* Use xosc as source of gclk generator AO_GCLK_XOSC */ samd21_gclk_gendiv(AO_GCLK_XOSC, 1); samd21_gclk_genctrl(SAMD21_GCLK_GENCTRL_SRC_XOSC, AO_GCLK_XOSC); samd21_gclk_clkctrl(AO_GCLK_XOSC, SAMD21_GCLK_CLKCTRL_ID_DPLL); /* program DPLL */ /* Divide down to 1MHz */ samd21_sysctrl.dpllctrlb = (((AO_XOSC_DIV/2 - 1) << SAMD21_SYSCTRL_DPLLCTRLB_DIV) | (0 << SAMD21_SYSCTRL_DPLLCTRLB_LBYPASS) | (SAMD21_SYSCTRL_DPLLCTRLB_LTIME_DEFAULT << SAMD21_SYSCTRL_DPLLCTRLB_LTIME) | (SAMD21_SYSCTRL_DPLLCTRLB_REFCLK_XOSC << SAMD21_SYSCTRL_DPLLCTRLB_REFCLK) | (0 << SAMD21_SYSCTRL_DPLLCTRLB_WUF) | (1 << SAMD21_SYSCTRL_DPLLCTRLB_LPEN) | (SAMD21_SYSCTRL_DPLLCTRLB_FILTER_DEFAULT << SAMD21_SYSCTRL_DPLLCTRLB_FILTER)); /* Multiply up to 48MHz */ samd21_sysctrl.dpllratio = ((AO_XOSC_MUL - 1) << SAMD21_SYSCTRL_DPLLRATIO_LDR); /* Always on in run mode, off in standby mode */ samd21_sysctrl.dpllctrla = ((0 << SAMD21_SYSCTRL_DPLLCTRLA_ONDEMAND) | (0 << SAMD21_SYSCTRL_DPLLCTRLA_RUNSTDBY)); /* Enable DPLL */ samd21_sysctrl.dpllctrla |= (1 << SAMD21_SYSCTRL_DPLLCTRLA_ENABLE); /* Wait for the DPLL to be enabled */ while ((samd21_sysctrl.dpllstatus & (1 << SAMD21_SYSCTRL_DPLLSTATUS_ENABLE)) == 0) ; /* Wait for the DPLL to be ready */ while ((samd21_sysctrl.dpllstatus & (1 << SAMD21_SYSCTRL_DPLLSTATUS_CLKRDY)) == 0) ; samd21_gclk_wait_sync(); /* * Switch generator 0 (CPU clock) to DPLL */ /* divide by 1 */ samd21_gclk_gendiv(AO_GCLK_SYSCLK, AO_XOSC_GCLK_DIV); /* select DPLL as source */ samd21_gclk_genctrl(SAMD21_GCLK_GENCTRL_SRC_FDPLL96M, AO_GCLK_FDPLL96M); #endif #ifdef AO_DFLL48M /* * Enable DFLL48M clock */ samd21_sysctrl.dfllctrl = (1 << SAMD21_SYSCTRL_DFLLCTRL_ENABLE); samd21_dfll_wait_sync(); #ifdef AO_XOSC32K #define AO_GCLK_XOSC32K 1 /* Enable xosc32k (external 32.768kHz oscillator) */ samd21_sysctrl.xosc32k = ((6 << SAMD21_SYSCTRL_XOSC32K_STARTUP) | (1 << SAMD21_SYSCTRL_XOSC32K_XTALEN) | (1 << SAMD21_SYSCTRL_XOSC32K_EN32K)); /* requires separate store */ samd21_sysctrl.xosc32k |= (1 << SAMD21_SYSCTRL_XOSC32K_ENABLE); /* Wait for osc */ while ((samd21_sysctrl.pclksr & (1 << SAMD21_SYSCTRL_PCLKSR_XOSC32KRDY)) == 0) ; /* * Use xosc32k as source of gclk generator AO_GCLK_XOSC32K */ samd21_gclk_gendiv(AO_GCLK_XOSC32K, 1); samd21_gclk_genctrl(SAMD21_GCLK_GENCTRL_SRC_XOSC32K, AO_GCLK_XOSC32K); /* * Use generator as source for dfm48m reference */ samd21_gclk_clkctrl(AO_GCLK_XOSC32K, SAMD21_GCLK_CLKCTRL_ID_DFLL48M_REF); /* Set multiplier to get as close to 48MHz as we can without going over */ samd21_sysctrl.dfllmul = (((31/4) << SAMD21_SYSCTRL_DFLLMUL_CSTEP) | ((255/4) << SAMD21_SYSCTRL_DFLLMUL_FSTEP) | ((AO_DFLL48M / AO_XOSC32K) << SAMD21_SYSCTRL_DFLLMUL_MUL)); /* pull out coarse calibration value from rom */ uint32_t coarse = ((samd21_aux1.calibration >> SAMD21_AUX1_CALIBRATION_DFLL48M_COARSE_CAL) & SAMD21_AUX1_CALIBRATION_DFLL48M_COARSE_CAL_MASK); samd21_sysctrl.dfllval = ((coarse << SAMD21_SYSCTRL_DFLLVAL_COARSE) | (512 << SAMD21_SYSCTRL_DFLLVAL_FINE)); samd21_sysctrl.dfllctrl = 0; samd21_dfll_wait_sync(); samd21_sysctrl.dfllctrl = ((1 << SAMD21_SYSCTRL_DFLLCTRL_MODE) | (1 << SAMD21_SYSCTRL_DFLLCTRL_ENABLE)); samd21_dfll_wait_sync(); samd21_gclk_wait_sync(); /* wait for fine lock */ while ((samd21_sysctrl.pclksr & (1 << SAMD21_SYSCTRL_PCLKSR_DFLLLCKC)) == 0 || (samd21_sysctrl.pclksr & (1 << SAMD21_SYSCTRL_PCLKSR_DFLLLCKF)) == 0) ; #else samd21_sysctrl.dfllmul = (((31/4) << SAMD21_SYSCTRL_DFLLMUL_CSTEP) | ((255/4) << SAMD21_SYSCTRL_DFLLMUL_FSTEP) | ((AO_DFLL48M / 1000) << SAMD21_SYSCTRL_DFLLMUL_MUL)); /* pull out coarse calibration value from rom */ uint32_t coarse = ((samd21_aux1.calibration >> SAMD21_AUX1_CALIBRATION_DFLL48M_COARSE_CAL) & SAMD21_AUX1_CALIBRATION_DFLL48M_COARSE_CAL_MASK); samd21_sysctrl.dfllval = ((coarse << SAMD21_SYSCTRL_DFLLVAL_COARSE) | (512 << SAMD21_SYSCTRL_DFLLVAL_FINE)); samd21_sysctrl.dfllctrl = 0; samd21_dfll_wait_sync(); samd21_sysctrl.dfllctrl = ((1 << SAMD21_SYSCTRL_DFLLCTRL_MODE) | (1 << SAMD21_SYSCTRL_DFLLCTRL_BPLCKC) | (1 << SAMD21_SYSCTRL_DFLLCTRL_CCDIS) | (1 << SAMD21_SYSCTRL_DFLLCTRL_USBCRM) | (1 << SAMD21_SYSCTRL_DFLLCTRL_ENABLE)); samd21_dfll_wait_sync(); samd21_gclk_wait_sync(); #endif /* * Switch generator to DFLL48M */ /* divide by 1 */ samd21_gclk_gendiv(AO_GCLK_SYSCLK, 1); /* select DFLL48M as source */ samd21_gclk_genctrl(SAMD21_GCLK_GENCTRL_SRC_DFLL48M, AO_GCLK_DFLL48M); #endif /* Set up all of the clocks to be /1 */ samd21_pm.cpusel = ((0 << SAMD21_PM_CPUSEL_CPUDIV)); samd21_pm.apbasel = ((0 << SAMD21_PM_APBASEL_APBADIV)); samd21_pm.apbbsel = ((0 << SAMD21_PM_APBBSEL_APBBDIV)); samd21_pm.apbcsel = ((0 << SAMD21_PM_APBCSEL_APBCDIV)); /* Disable OSC8M */ samd21_sysctrl.osc8m &= ~(1 << SAMD21_SYSCTRL_OSC8M_ENABLE); /* Additional misc configuration stuff */ /* Disable automatic NVM write operations */ samd21_nvmctrl.ctrlb |= (1 << SAMD21_NVMCTRL_CTRLB_MANW); } snek-1.1/chips/samd21/ao-usb-samd21.c000066400000000000000000000523661353657467200171650ustar00rootroot00000000000000/* * Copyright © 2012 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "ao.h" #include "ao-usb.h" #include "ao-product.h" #ifndef AO_POWER_MANAGEMENT #define AO_POWER_MANAGEMENT 0 #endif #ifndef AO_USB_DEVICE_ID_SERIAL #define AO_USB_DEVICE_ID_SERIAL 1 #endif #if USE_USB_FIFO static struct ao_fifo ao_usb_rx_fifo; #endif #define AO_USB_OUT_SLEEP_ADDR (&ao_usb_out_avail) #define SAMD21_USB_ALIGN __attribute__ ((aligned(4))) struct ao_usb_setup { uint8_t dir_type_recip; uint8_t request; uint16_t value; uint16_t index; uint16_t length; } ao_usb_setup; static uint8_t ao_usb_ep0_state; struct samd21_usb_desc samd21_usb_desc[8] SAMD21_USB_ALIGN; /* Pending EP0 IN data */ static uint8_t ao_usb_ep0_in_tmp[2]; /* small buffer */ static const uint8_t *ao_usb_ep0_in_data; /* Remaining data */ static uint8_t ao_usb_ep0_in_len; /* Remaining amount */ /* Pending EP0 OUT data */ static uint8_t *ao_usb_ep0_out_data; static uint8_t ao_usb_ep0_out_len; /* Endpoint 0 buffers */ static uint8_t ao_usb_ep0_in_buf[AO_USB_CONTROL_SIZE] SAMD21_USB_ALIGN; static uint8_t ao_usb_ep0_out_buf[AO_USB_CONTROL_SIZE] SAMD21_USB_ALIGN; #if AO_USB_HAS_INT /* Pointer to interrupt buffer in USB memory */ static uint8_t ao_usb_int_buf[AO_USB_INT_SIZE] SAMD21_USB_ALIGN; #endif /* Buffers in DRAM */ #if AO_USB_HAS_IN static uint8_t ao_usb_in_tx_which; static uint8_t ao_usb_tx_count; static uint8_t ao_usb_in_buf[2][AO_USB_IN_SIZE] SAMD21_USB_ALIGN; #endif #if AO_USB_HAS_OUT static uint8_t ao_usb_out_rx_which; #if !USE_USB_FIFO static uint8_t ao_usb_rx_count, ao_usb_rx_pos; #endif static uint8_t ao_usb_out_buf[2][AO_USB_OUT_SIZE] SAMD21_USB_ALIGN; #endif /* Marks when we don't need to send an IN packet. * This happens only when the last IN packet is not full, * otherwise the host will expect to keep seeing packets. * Send a zero-length packet as required */ static uint8_t ao_usb_in_flushed; /* Marks when we have delivered an IN packet to the hardware * and it has not been received yet. ao_sleep on this address * to wait for it to be delivered. */ static uint8_t ao_usb_in_pending; /* Marks when an OUT packet has been received by the hardware * but not pulled to the shadow buffer. */ static uint8_t ao_usb_out_avail; uint8_t ao_usb_running; static uint8_t ao_usb_configuration; #define AO_USB_EP0_GOT_SETUP 1 #define AO_USB_EP0_GOT_RX_DATA 2 #define AO_USB_EP0_GOT_TX_ACK 4 static uint8_t ao_usb_ep0_receive; static uint8_t ao_usb_address; static uint8_t ao_usb_address_pending; /* * Set current device address and mark the * interface as active */ static void ao_usb_set_address(uint8_t address) { samd21_usb.dadd = (1 << SAMD21_USB_DADD_ADDEN) | (address << SAMD21_USB_DADD_DADD); ao_usb_address_pending = 0; } /* * Initialize an entpoint */ static void ao_usb_init_bank(struct samd21_usb_desc_bank *bank, uint8_t *buf, uint16_t size) { bank->addr = (uint32_t) buf; uint32_t size_bits = 0; switch (size) { case 8: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_8; break; case 16: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_16; break; case 32: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_32; break; case 64: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_64; break; case 128: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_128; break; case 256: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_256; break; case 512: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_512; break; case 1023: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_1023; break; } bank->pcksize = ((0 << SAMD21_USB_DESC_PCKSIZE_BYTE_COUNT) | (0 << SAMD21_USB_DESC_PCKSIZE_MULTI_PACKET_SIZE) | (size_bits << SAMD21_USB_DESC_PCKSIZE_SIZE) | (0 << SAMD21_USB_DESC_PCKSIZE_AUTO_ZLP)); } static void ao_usb_init_ep(uint8_t ep, uint8_t type_out, void *out_buf, uint16_t out_size, uint8_t type_in, void *in_buf, uint16_t in_size) { /* set up descriptors */ ao_usb_init_bank(&samd21_usb_desc[ep].bank[0], out_buf, out_size); ao_usb_init_bank(&samd21_usb_desc[ep].bank[1], in_buf, in_size); samd21_usb.ep[ep].epcfg = ((type_out << SAMD21_USB_EP_EPCFG_EP_TYPE_OUT) | (type_in << SAMD21_USB_EP_EPCFG_EP_TYPE_IN)); /* Clear all status bits */ samd21_usb.ep[ep].epstatusclr = 0xff; /* Select interrupts */ uint8_t epinten = 0; if (out_buf) epinten |= (1 << SAMD21_USB_EP_EPINTFLAG_TRCPT0); if (in_buf) epinten |= (1 << SAMD21_USB_EP_EPINTFLAG_TRCPT1); if (ep == 0) epinten |= (1 << SAMD21_USB_EP_EPINTFLAG_RXSTP); samd21_usb.ep[ep].epintenset = epinten; } static void ao_usb_set_ep0(void) { ao_usb_init_ep(AO_USB_CONTROL_EP, SAMD21_USB_EP_EPCFG_EP_TYPE_OUT_CONTROL, ao_usb_ep0_out_buf, AO_USB_CONTROL_SIZE, SAMD21_USB_EP_EPCFG_EP_TYPE_IN_CONTROL, ao_usb_ep0_in_buf, AO_USB_CONTROL_SIZE); ao_usb_running = 0; /* Reset our internal state */ ao_usb_ep0_state = AO_USB_EP0_IDLE; ao_usb_ep0_in_data = NULL; ao_usb_ep0_in_len = 0; ao_usb_ep0_out_data = NULL; ao_usb_ep0_out_len = 0; } static void ao_usb_set_configuration(void) { #if AO_USB_HAS_INT ao_usb_init_ep(AO_USB_INT_EP, SAMD21_USB_EP_EPCFG_EP_TYPE_OUT_DISABLED, NULL, 0, SAMD21_USB_EP_EPCFG_EP_TYPE_IN_INTERRUPT, ao_usb_int_buf, AO_USB_INT_SIZE); #endif #if AO_USB_HAS_OUT ao_usb_init_ep(AO_USB_OUT_EP, SAMD21_USB_EP_EPCFG_EP_TYPE_OUT_BULK, &ao_usb_out_buf[0][0], AO_USB_OUT_SIZE, SAMD21_USB_EP_EPCFG_EP_TYPE_IN_DUAL_BANK, &ao_usb_out_buf[1][0], AO_USB_OUT_SIZE); /* At first receive, we'll flip this back to 0 */ ao_usb_out_rx_which = 1; #endif #if AO_USB_HAS_IN /* Set up the IN end point */ ao_usb_init_ep(AO_USB_IN_EP, SAMD21_USB_EP_EPCFG_EP_TYPE_OUT_DUAL_BANK, &ao_usb_in_buf[0][0], AO_USB_IN_SIZE, SAMD21_USB_EP_EPCFG_EP_TYPE_IN_BULK, &ao_usb_in_buf[1][0], AO_USB_IN_SIZE); /* First transmit data goes to buffer 0 */ ao_usb_in_tx_which = 0; #endif ao_usb_in_flushed = 1; ao_usb_in_pending = 0; ao_wakeup(&ao_usb_in_pending); ao_usb_out_avail = 0; ao_usb_configuration = 0; ao_wakeup(AO_USB_OUT_SLEEP_ADDR); } /* Send an IN data packet */ static void ao_usb_ep0_flush(void) { uint8_t this_len; /* Check to see if the endpoint is still busy */ if ((samd21_usb.ep[0].epstatus & (1 << (SAMD21_USB_EP_EPSTATUS_BK1RDY))) != 0) return; this_len = ao_usb_ep0_in_len; if (this_len > AO_USB_CONTROL_SIZE) this_len = AO_USB_CONTROL_SIZE; if (this_len < AO_USB_CONTROL_SIZE) ao_usb_ep0_state = AO_USB_EP0_IDLE; ao_usb_ep0_in_len -= this_len; memcpy(ao_usb_ep0_in_buf, ao_usb_ep0_in_data, this_len); ao_usb_ep0_in_data += this_len; /* Mark the endpoint as TX valid to send the packet */ samd21_usb_desc_set_byte_count(AO_USB_CONTROL_EP, 1, this_len); samd21_usb_ep_set_ready(AO_USB_CONTROL_EP, 1); } /* Read data from the ep0 OUT fifo */ static void ao_usb_ep0_fill(void) { uint16_t len = samd21_usb_desc_get_byte_count(AO_USB_CONTROL_EP, 0); if (len > ao_usb_ep0_out_len) len = ao_usb_ep0_out_len; ao_usb_ep0_out_len -= len; /* Pull all of the data out of the packet */ memcpy(ao_usb_ep0_out_data, ao_usb_ep0_out_buf, len); ao_usb_ep0_out_data += len; /* ACK the packet */ samd21_usb_ep_clr_ready(AO_USB_CONTROL_EP, 0); } static void ao_usb_ep0_in_reset(void) { ao_usb_ep0_in_data = ao_usb_ep0_in_tmp; ao_usb_ep0_in_len = 0; } static void ao_usb_ep0_in_queue_byte(uint8_t a) { if (ao_usb_ep0_in_len < sizeof (ao_usb_ep0_in_tmp)) ao_usb_ep0_in_tmp[ao_usb_ep0_in_len++] = a; } static void ao_usb_ep0_in_set(const uint8_t *data, uint8_t len) { ao_usb_ep0_in_data = data; ao_usb_ep0_in_len = len; } static void ao_usb_ep0_out_set(uint8_t *data, uint8_t len) { ao_usb_ep0_out_data = data; ao_usb_ep0_out_len = len; } static void ao_usb_ep0_in_start(uint16_t max) { /* Don't send more than asked for */ if (ao_usb_ep0_in_len > max) ao_usb_ep0_in_len = max; ao_usb_ep0_flush(); } struct ao_usb_line_coding ao_usb_line_coding = {115200, 0, 0, 8}; #if AO_USB_DEVICE_ID_SERIAL static uint8_t ao_usb_serial[2 + 64]; /* Convert a 32-bit value to 8 hexidecimal UCS2 characters */ static void hex_to_ucs2(uint32_t in, uint8_t *out) { int i; for (i = 28; i >= 0; i -= 4) { uint8_t bits = (in >> i) & 0xf; *out++ = ((bits < 10) ? '0' : ('a' - 10)) + bits; *out++ = 0; } } /* Encode the device ID (128 bits) in hexidecimal to use as a device * serial number */ static void ao_usb_serial_init(void) { ao_usb_serial[0] = 66; /* length */ ao_usb_serial[1] = AO_USB_DESC_STRING; hex_to_ucs2(samd21_serial.word0, ao_usb_serial + 2 + 0); hex_to_ucs2(samd21_serial.word1, ao_usb_serial + 2 + 16); hex_to_ucs2(samd21_serial.word2, ao_usb_serial + 2 + 32); hex_to_ucs2(samd21_serial.word3, ao_usb_serial + 2 + 48); } #endif /* Walk through the list of descriptors and find a match */ static void ao_usb_get_descriptor(uint16_t value, uint16_t length) { const uint8_t *descriptor; uint8_t type = value >> 8; uint8_t index = value; descriptor = ao_usb_descriptors; while (descriptor[0] != 0) { if (descriptor[1] == type && index-- == 0) { uint8_t len; if (type == AO_USB_DESC_CONFIGURATION) len = descriptor[2]; else len = descriptor[0]; #if AO_USB_DEVICE_ID_SERIAL /* Slightly hacky - the serial number is string 3 */ if (type == AO_USB_DESC_STRING && (value & 0xff) == 3) { descriptor = ao_usb_serial; len = sizeof (ao_usb_serial); } #endif if (len > length) len = length; ao_usb_ep0_in_set(descriptor, len); break; } descriptor += descriptor[0]; } } static void ao_usb_ep0_setup(void) { /* Pull the setup packet out of the fifo */ ao_usb_ep0_out_set((uint8_t *) &ao_usb_setup, 8); ao_usb_ep0_fill(); if (ao_usb_ep0_out_len != 0) return; if ((ao_usb_setup.dir_type_recip & AO_USB_DIR_IN) || ao_usb_setup.length == 0) ao_usb_ep0_state = AO_USB_EP0_DATA_IN; else ao_usb_ep0_state = AO_USB_EP0_DATA_OUT; ao_usb_ep0_in_reset(); switch(ao_usb_setup.dir_type_recip & AO_USB_SETUP_TYPE_MASK) { case AO_USB_TYPE_STANDARD: switch(ao_usb_setup.dir_type_recip & AO_USB_SETUP_RECIP_MASK) { case AO_USB_RECIP_DEVICE: switch(ao_usb_setup.request) { case AO_USB_REQ_GET_STATUS: ao_usb_ep0_in_queue_byte(0); ao_usb_ep0_in_queue_byte(0); break; case AO_USB_REQ_SET_ADDRESS: ao_usb_address = ao_usb_setup.value; ao_usb_address_pending = 1; break; case AO_USB_REQ_GET_DESCRIPTOR: ao_usb_get_descriptor(ao_usb_setup.value, ao_usb_setup.length); break; case AO_USB_REQ_GET_CONFIGURATION: ao_usb_ep0_in_queue_byte(ao_usb_configuration); break; case AO_USB_REQ_SET_CONFIGURATION: ao_usb_configuration = ao_usb_setup.value; ao_usb_set_configuration(); break; } break; case AO_USB_RECIP_INTERFACE: switch(ao_usb_setup.request) { case AO_USB_REQ_GET_STATUS: ao_usb_ep0_in_queue_byte(0); ao_usb_ep0_in_queue_byte(0); break; case AO_USB_REQ_GET_INTERFACE: ao_usb_ep0_in_queue_byte(0); break; case AO_USB_REQ_SET_INTERFACE: break; } break; case AO_USB_RECIP_ENDPOINT: switch(ao_usb_setup.request) { case AO_USB_REQ_GET_STATUS: ao_usb_ep0_in_queue_byte(0); ao_usb_ep0_in_queue_byte(0); break; } break; } break; case AO_USB_TYPE_CLASS: switch (ao_usb_setup.request) { case AO_USB_SET_LINE_CODING: ao_usb_ep0_out_set((uint8_t *) &ao_usb_line_coding, 7); break; case AO_USB_GET_LINE_CODING: ao_usb_ep0_in_set((const uint8_t *) &ao_usb_line_coding, 7); break; case AO_USB_SET_CONTROL_LINE_STATE: break; } break; } /* If we're not waiting to receive data from the host, * queue an IN response */ if (ao_usb_ep0_state == AO_USB_EP0_DATA_IN) ao_usb_ep0_in_start(ao_usb_setup.length); } static void ao_usb_ep0_handle(uint8_t receive) { ao_usb_ep0_receive = 0; if (receive & AO_USB_EP0_GOT_SETUP) { ao_usb_ep0_setup(); } if (receive & AO_USB_EP0_GOT_RX_DATA) { if (ao_usb_ep0_state == AO_USB_EP0_DATA_OUT) { ao_usb_ep0_fill(); if (ao_usb_ep0_out_len == 0) { ao_usb_ep0_state = AO_USB_EP0_DATA_IN; ao_usb_ep0_in_start(0); } } } if (receive & AO_USB_EP0_GOT_TX_ACK) { #if HAS_FLIGHT && AO_USB_FORCE_IDLE ao_flight_force_idle = 1; #endif if (ao_usb_ep0_state == AO_USB_EP0_DATA_IN) ao_usb_ep0_flush(); /* Wait until the IN packet is received from addr 0 * before assigning our local address */ if (ao_usb_address_pending) ao_usb_set_address(ao_usb_address); } } #if AO_POWER_MANAGEMENT static void ao_usb_suspend(void) { stm_usb.cntr |= (1 << STM_USB_CNTR_FSUSP); ao_power_suspend(); stm_usb.cntr |= (1 << STM_USB_CNTR_LP_MODE); ao_clock_suspend(); } static void ao_usb_wakeup(void) { ao_clock_resume(); stm_usb.cntr &= ~(1 << STM_USB_CNTR_FSUSP); ao_power_resume(); } #endif #if USE_USB_FIFO static void ao_usb_fifo_check(void) { uint8_t next_which = 1 - ao_usb_out_rx_which; if (ao_usb_out_avail & (1 << next_which)) { uint8_t *buf = ao_usb_out_buf[next_which]; uint16_t len = samd21_usb_desc_get_byte_count(AO_USB_OUT_EP, next_which); if (ao_fifo_has_space(&ao_usb_rx_fifo, len)) { uint16_t i; #if AO_USB_OUT_HOOK ao_usb_out_hook(buf, len); #endif for (i = 0; i < len; i++) ao_fifo_insert(&ao_usb_rx_fifo, buf[i]); samd21_usb_ep_clr_ready(AO_USB_OUT_EP, next_which); ao_usb_out_avail &= ~(1 << next_which); ao_usb_out_rx_which = next_which; ao_wakeup(AO_USB_OUT_SLEEP_ADDR); } } } #endif void samd21_usb_isr(void) { uint16_t intflag = samd21_usb.intflag; uint16_t epintsmry = samd21_usb.epintsmry; samd21_usb.intflag = intflag; if (epintsmry & (1 << 0)) { uint8_t epintflag = samd21_usb.ep[0].epintflag; samd21_usb.ep[0].epintflag = epintflag; if (epintflag & (1 << SAMD21_USB_EP_EPINTFLAG_RXSTP)) ao_usb_ep0_receive |= AO_USB_EP0_GOT_SETUP; else if (epintflag & (1 << SAMD21_USB_EP_EPINTFLAG_TRCPT0)) ao_usb_ep0_receive |= AO_USB_EP0_GOT_RX_DATA; if (epintflag & (1 << SAMD21_USB_EP_EPINTFLAG_TRCPT1)) ao_usb_ep0_receive |= AO_USB_EP0_GOT_TX_ACK; ao_usb_ep0_handle(ao_usb_ep0_receive); } #if AO_USB_HAS_OUT if (epintsmry & (1 << AO_USB_OUT_EP)) { uint8_t epintflag = samd21_usb.ep[AO_USB_OUT_EP].epintflag; samd21_usb.ep[AO_USB_OUT_EP].epintflag = epintflag; uint8_t avail = (epintflag >> SAMD21_USB_EP_EPINTFLAG_TRCPT0) & 3; if (avail) { ao_usb_out_avail |= avail; ao_usb_running = 1; #if USE_USB_FIFO ao_usb_fifo_check(); #else ao_wakeup(AO_USB_OUT_SLEEP_ADDR); #endif } } #endif #if AO_USB_HAS_IN if (epintsmry & (1 << AO_USB_IN_EP)) { uint8_t epintflag = samd21_usb.ep[AO_USB_IN_EP].epintflag; samd21_usb.ep[AO_USB_IN_EP].epintflag = epintflag; uint8_t done = (epintflag >> SAMD21_USB_EP_EPINTFLAG_TRCPT0) & 3; if (done) { ao_usb_in_pending &= ~done; ao_wakeup(&ao_usb_in_pending); } } #endif #if AO_USB_HAS_INT if (epintsmry & (1 << AO_USB_INT_EP)) { } #endif if (intflag & (1 << SAMD21_USB_INTFLAG_EORST)) { ao_usb_set_ep0(); } #if AO_POWER_MANAGEMENT if (istr & (1 << STM_USB_ISTR_SUSP)) ao_usb_suspend(); if (istr & (1 << STM_USB_ISTR_WKUP)) ao_usb_wakeup(); #endif } #if AO_USB_HAS_IN /* Queue the current IN buffer for transmission */ static void _ao_usb_in_send(void) { ao_usb_in_pending |= 1 << ao_usb_in_tx_which; if (ao_usb_tx_count != AO_USB_IN_SIZE) ao_usb_in_flushed = 1; samd21_usb_desc_set_byte_count(AO_USB_IN_EP, ao_usb_in_tx_which, ao_usb_tx_count); samd21_usb_ep_set_ready(AO_USB_IN_EP, ao_usb_in_tx_which); /* Toggle our usage */ ao_usb_in_tx_which = 1 - ao_usb_in_tx_which; ao_usb_tx_count = 0; } /* Wait for a free IN buffer. Interrupts are blocked */ static void _ao_usb_in_wait(void) { /* Wait for an IN buffer to be ready */ while ((ao_usb_in_pending & (1 << ao_usb_in_tx_which)) != 0) ao_sleep(&ao_usb_in_pending); } int ao_usb_flush(FILE *file) { (void) file; if (!ao_usb_running) return 0; /* Anytime we've sent a character since * the last time we flushed, we'll need * to send a packet -- the only other time * we would send a packet is when that * packet was full, in which case we now * want to send an empty packet */ ao_arch_block_interrupts(); if (!ao_usb_in_flushed) { _ao_usb_in_wait(); if (!ao_usb_in_flushed) _ao_usb_in_send(); } ao_arch_release_interrupts(); return 0; } int ao_usb_putc(char c, FILE *file) { (void) file; if (!ao_usb_running) return (unsigned char) c; if (c == '\n') ao_usb_putc('\r', file); ao_arch_block_interrupts(); _ao_usb_in_wait(); ao_usb_in_flushed = 0; ao_usb_in_buf[ao_usb_in_tx_which][ao_usb_tx_count++] = c; /* Send the packet when full */ if (ao_usb_tx_count == AO_USB_IN_SIZE) _ao_usb_in_send(); ao_arch_release_interrupts(); if (c == '\n') ao_usb_flush(file); return (unsigned char) c; } #endif #if AO_USB_HAS_OUT #if !USE_USB_FIFO static bool _ao_usb_out_recv(void) { uint8_t next_which = 1 - ao_usb_out_rx_which; if ((ao_usb_out_avail & (1 << next_which)) != 0) { /* switch current buffer */ ao_usb_out_rx_which = next_which; ao_usb_out_avail &= ~(1 << ao_usb_out_rx_which); ao_usb_rx_count = samd21_usb_desc_get_byte_count(AO_USB_OUT_EP, ao_usb_out_rx_which); ao_usb_rx_pos = 0; return true; } return false; } #endif static int _ao_usb_pollchar(void) { uint8_t c; if (!ao_usb_running) return AO_READ_AGAIN; #if USE_USB_FIFO if (ao_fifo_empty(&ao_usb_rx_fifo)) return AO_READ_AGAIN; c = ao_fifo_remove(&ao_usb_rx_fifo); ao_usb_fifo_check(); #else for (;;) { if (ao_usb_rx_pos != ao_usb_rx_count) break; /* Check for packet */ if (!_ao_usb_out_recv()) return AO_READ_AGAIN; } /* Pull a character out of the fifo */ c = ao_usb_out_buf[ao_usb_out_rx_which][ao_usb_rx_pos++]; if (ao_usb_rx_pos == ao_usb_rx_count) samd21_usb_ep_clr_ready(AO_USB_OUT_EP, ao_usb_out_rx_which); #endif return c; } int ao_usb_getc(void) { int c; ao_arch_block_interrupts(); while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN) ao_sleep(AO_USB_OUT_SLEEP_ADDR); ao_arch_release_interrupts(); return c; } bool ao_usb_waiting(void) { bool waiting; ao_arch_block_interrupts(); waiting = !ao_fifo_empty(&ao_usb_rx_fifo); ao_arch_release_interrupts(); return waiting; } #endif void ao_usb_disable(void) { ao_arch_block_interrupts(); samd21_nvic_clear_enable(SAMD21_NVIC_ISR_USB_POS); /* Disable USB pull-up */ samd21_usb.ctrlb |= (1 << SAMD21_USB_CTRLB_DETACH); /* Switch off the device */ samd21_usb.ctrla &= ~(1 << SAMD21_USB_CTRLA_ENABLE); /* Disable the interface */ samd21_pm.apbbmask &= ~(1 << SAMD21_PM_APBBMASK_USB); ao_arch_release_interrupts(); } void ao_usb_enable(void) { int t; /* Set up USB DM/DP pins */ samd21_port_pmux_set(&samd21_port_a, 24, SAMD21_PORT_PMUX_FUNC_G); samd21_port_pmux_set(&samd21_port_a, 25, SAMD21_PORT_PMUX_FUNC_G); /* Assign gclk 0 to USB reference */ samd21_gclk_clkctrl(AO_GCLK_USB, SAMD21_GCLK_CLKCTRL_ID_USB); /* Enable USB clock */ samd21_pm.apbbmask |= (1 << SAMD21_PM_APBBMASK_USB); /* Reset USB Device */ samd21_usb.ctrla |= (1 << SAMD21_USB_CTRLA_SWRST); while ((samd21_usb.syncbusy & (1 << SAMD21_USB_SYNCBUSY_SWRST)) == 0) ; while ((samd21_usb.syncbusy & (1 << SAMD21_USB_SYNCBUSY_SWRST)) != 0) ; memset(&samd21_usb_desc, 0, sizeof (samd21_usb_desc)); /* Detach */ samd21_usb.ctrlb |= (1 << SAMD21_USB_CTRLB_DETACH); samd21_usb.descadd = (uint32_t) &samd21_usb_desc; /* Load calibration values */ uint32_t transn = ((samd21_aux1.calibration >> SAMD21_AUX1_CALIBRATION_USB_TRANSN) & SAMD21_AUX1_CALIBRATION_USB_TRANSN_MASK); if (transn == 0x1f) transn = 5; uint32_t transp = ((samd21_aux1.calibration >> SAMD21_AUX1_CALIBRATION_USB_TRANSP) & SAMD21_AUX1_CALIBRATION_USB_TRANSP_MASK); if (transp == 0x1f) transp = 29; uint32_t trim = ((samd21_aux1.calibration >> SAMD21_AUX1_CALIBRATION_USB_TRIM) & SAMD21_AUX1_CALIBRATION_USB_TRIM_MASK); if (trim == 7) trim = 3; samd21_usb.padcal = ((transn << SAMD21_USB_PADCAL_TRANSN) | (transp << SAMD21_USB_PADCAL_TRANSP) | (trim << SAMD21_USB_PADCAL_TRIM)); samd21_usb.qosctrl = ((3 << SAMD21_USB_QOSCTRL_CQOS) | (3 << SAMD21_USB_QOSCTRL_DQOS)); ao_arch_block_interrupts(); /* set full speed */ samd21_usb.ctrlb = (SAMD21_USB_CTRLB_SPDCONF_FS << SAMD21_USB_CTRLB_SPDCONF); /* Set device mode */ samd21_usb.ctrla = ((0 << SAMD21_USB_CTRLA_MODE) | (1 << SAMD21_USB_CTRLA_RUNSTDBY) | (1 << SAMD21_USB_CTRLA_ENABLE)); while ((samd21_usb.syncbusy & (1 << SAMD21_USB_SYNCBUSY_ENABLE)) != 0) ; /* configure interrupts */ samd21_nvic_set_enable(SAMD21_NVIC_ISR_USB_POS); samd21_nvic_set_priority(SAMD21_NVIC_ISR_USB_POS, 2); samd21_usb.intenset = ((1 << SAMD21_USB_INTFLAG_EORST)); ao_arch_release_interrupts(); for (t = 0; t < 50000; t++) ao_arch_nop(); /* Attach */ samd21_usb.ctrlb &= ~(1 << SAMD21_USB_CTRLB_DETACH); } void ao_usb_init(void) { ao_usb_enable(); #if AO_USB_DEVICE_ID_SERIAL ao_usb_serial_init(); #endif ao_usb_ep0_state = AO_USB_EP0_IDLE; } snek-1.1/chips/samd21/registers.ld000066400000000000000000000024301353657467200170610ustar00rootroot00000000000000samd21_scs = 0xe000e000; samd21_systick = 0xe000e010; samd21_nvic = 0xe000e100; samd21_scb = 0xe000ed00; samd21_ahb_apb_a = 0x40000000; samd21_pac0 = 0x40000000; samd21_pm = 0x40000400; samd21_sysctrl = 0x40000800; samd21_gclk = 0x40000c00; samd21_wdt = 0x40001000; samd21_rtc = 0x40001400; samd21_rtc = 0x40001400; samd21_eic = 0x40001800; samd21_ahb_apb_b = 0x41000000; samd21_pac1 = 0x41000000; samd21_dsu = 0x41002000; samd21_nvmctrl = 0x41004000; samd21_port_a = 0x41004400; samd21_port_b = 0x41004480; samd21_dmac = 0x41004800; samd21_usb = 0x41005000; samd21_mtb = 0x41006000; samd21_ahb_apb_c = 0x42000000; samd21_pac2 = 0x42000000; samd21_evsys = 0x42000400; samd21_sercom0 = 0x42000800; samd21_sercom1 = 0x42000c00; samd21_sercom2 = 0x42001000; samd21_sercom3 = 0x42001400; samd21_sercom4 = 0x42001800; samd21_sercom5 = 0x42001c00; samd21_tcc0 = 0x42002000; samd21_tcc1 = 0x42002400; samd21_tcc2 = 0x42002800; samd21_tc3 = 0x42002c00; samd21_tc4 = 0x42003000; samd21_tc5 = 0x42003400; samd21_tc6 = 0x42003800; samd21_tc7 = 0x42003c00; samd21_adc = 0x42004000; samd21_ac = 0x42004400; samd21_dac = 0x42004800; samd21_ptc = 0x42004c00; samd21_i2s = 0x42005000; samd21_ac1 = 0x42005400; samd21_tcc3 = 0x42006000; samd21_aux0 = 0x00804000; samd21_aux1 = 0x00806000; samd21_serial = 0x0080a000; snek-1.1/chips/samd21/samd21.h000066400000000000000000001460121353657467200157760ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #ifndef _SAMD21_H_ #define _SAMD21_H_ #include typedef volatile uint64_t vuint64_t; typedef volatile uint32_t vuint32_t; typedef volatile void * vvoid_t; typedef volatile uint16_t vuint16_t; typedef volatile uint8_t vuint8_t; struct samd21_pac { vuint32_t wpclr; vuint32_t wpset; }; extern struct samd21_pac samd21_pac0; extern struct samd21_pac samd21_pac1; extern struct samd21_pac samd21_pac2; #define samd21_pac0 (*(struct samd21_pac *) 0x40000000) #define samd21_pac1 (*(struct samd21_pac *) 0x41000000) #define samd21_pac2 (*(struct samd21_pac *) 0x42000000) struct samd21_gclk { vuint8_t ctrl; vuint8_t status; vuint16_t clkctrl; vuint32_t genctrl; vuint32_t gendiv; }; extern struct samd21_gclk samd21_gclk; #define samd21_gclk (*(struct samd21_gclk *) 0x40000c00) #define SAMD21_GCLK_CTRL_SWRST 0 #define SAMD21_GCLK_STATUS_SYNCBUSY 7 #define SAMD21_GCLK_CLKCTRL_ID 0 #define SAMD21_GCLK_CLKCTRL_ID_DFLL48M_REF 0 #define SAMD21_GCLK_CLKCTRL_ID_DPLL 1 #define SAMD21_GCLK_CLKCTRL_ID_DPLL_32K 2 #define SAMD21_GCLK_CLKCTRL_ID_WDT 3 #define SAMD21_GCLK_CLKCTRL_ID_RTC 4 #define SAMD21_GCLK_CLKCTRL_ID_EIC 5 #define SAMD21_GCLK_CLKCTRL_ID_USB 6 #define SAMD21_GCLK_CLKCTRL_ID_EVSYS_CHANNEL_0 0x07 #define SAMD21_GCLK_CLKCTRL_ID_EVSYS_CHANNEL_1 0x08 #define SAMD21_GCLK_CLKCTRL_ID_EVSYS_CHANNEL_2 0x09 #define SAMD21_GCLK_CLKCTRL_ID_EVSYS_CHANNEL_3 0x0a #define SAMD21_GCLK_CLKCTRL_ID_EVSYS_CHANNEL_4 0x0b #define SAMD21_GCLK_CLKCTRL_ID_EVSYS_CHANNEL_5 0x0c #define SAMD21_GCLK_CLKCTRL_ID_EVSYS_CHANNEL_6 0x0d #define SAMD21_GCLK_CLKCTRL_ID_EVSYS_CHANNEL_7 0x0e #define SAMD21_GCLK_CLKCTRL_ID_EVSYS_CHANNEL_8 0e0f #define SAMD21_GCLK_CLKCTRL_ID_EVSYS_CHANNEL_9 0x10 #define SAMD21_GCLK_CLKCTRL_ID_EVSYS_CHANNEL_10 0x11 #define SAMD21_GCLK_CLKCTRL_ID_EVSYS_CHANNEL_11 0x12 #define SAMD21_GCLK_CLKCTRL_ID_SERCOMx_SLOW 0x13 #define SAMD21_GCLK_CLKCTRL_ID_SERCOM0_CORE 0x14 #define SAMD21_GCLK_CLKCTRL_ID_SERCOM1_CORE 0x15 #define SAMD21_GCLK_CLKCTRL_ID_SERCOM2_CORE 0x16 #define SAMD21_GCLK_CLKCTRL_ID_SERCOM3_CORE 0x17 #define SAMD21_GCLK_CLKCTRL_ID_SERCOM4_CORE 0x18 #define SAMD21_GCLK_CLKCTRL_ID_SERCOM5_CORE 0x19 #define SAMD21_GCLK_CLKCTRL_ID_TCC0_TCC1 0x1a #define SAMD21_GCLK_CLKCTRL_ID_TCC2_TC3 0x1b #define SAMD21_GCLK_CLKCTRL_ID_TC4_TC5 0x1c #define SAMD21_GCLK_CLKCTRL_ID_TC6_TC7 0x1d #define SAMD21_GCLK_CLKCTRL_ID_ADC 0x1e #define SAMD21_GCLK_CLKCTRL_ID_AC_DIG 0x1f #define SAMD21_GCLK_CLKCTRL_ID_AC_ANA 0x20 #define SAMD21_GCLK_CLKCTRL_ID_DAC 0x21 #define SAMD21_GCLK_CLKCTRL_ID_PTC 0x22 #define SAMD21_GCLK_CLKCTRL_ID_I2S_0 0x23 #define SAMD21_GCLK_CLKCTRL_ID_I2S_1 0x24 #define SAMD21_GCLK_CLKCTRL_ID_TCC3 0x25 #define SAMD21_GCLK_CLKCTRL_GEN 8 #define SAMD21_GCLK_CLKCTRL_CLKEN 14 #define SAMD21_GCLK_CLKCTRL_WRTLOCK 15 #define SAMD21_GCLK_GENCTRL_ID 0 #define SAMD21_GCLK_GENCTRL_SRC 8 #define SAMD21_GCLK_GENCTRL_SRC_XOSC 0 #define SAMD21_GCLK_GENCTRL_SRC_GCLKIN 1 #define SAMD21_GCLK_GENCTRL_SRC_GCLKGEN1 2 #define SAMD21_GCLK_GENCTRL_SRC_OSCULP32K 3 #define SAMD21_GCLK_GENCTRL_SRC_OSC32K 4 #define SAMD21_GCLK_GENCTRL_SRC_XOSC32K 5 #define SAMD21_GCLK_GENCTRL_SRC_OSC8M 6 #define SAMD21_GCLK_GENCTRL_SRC_DFLL48M 7 #define SAMD21_GCLK_GENCTRL_SRC_FDPLL96M 8 #define SAMD21_GCLK_GENCTRL_GENEN 16 #define SAMD21_GCLK_GENCTRL_IDC 17 #define SAMD21_GCLK_GENCTRL_OOV 18 #define SAMD21_GCLK_GENCTRL_OE 19 #define SAMD21_GCLK_GENCTRL_DIVSEL 20 #define SAMD21_GCLK_GENCTRL_RUNSTDBY 21 #define SAMD21_GCLK_GENDIV_ID 0 #define SAMD21_GCLK_GENDIV_DIV 8 struct samd21_pm { vuint8_t ctrl; vuint8_t sleep; vuint8_t reserved_02; vuint8_t reserved_03; vuint32_t reserved_04; vuint8_t cpusel; vuint8_t apbasel; vuint8_t apbbsel; vuint8_t apbcsel; vuint32_t reserved_0c; vuint32_t reserved_10; vuint32_t ahbmask; vuint32_t apbamask; vuint32_t apbbmask; vuint32_t apbcmask; vuint32_t reserved_24; vuint32_t reserved_28; vuint32_t reserved_2c; vuint32_t reserved_30; vuint8_t intenclr; vuint8_t intelset; vuint8_t intflag; vuint8_t reserved_37; vuint8_t rcause; }; extern struct samd21_pm samd21_pm; #define samd21_pm (*(struct samd21_pm *) 0x40000400) #define SAMD21_PM_CPUSEL_CPUDIV 0 #define SAMD21_PM_APBASEL_APBADIV 0 #define SAMD21_PM_APBBSEL_APBBDIV 0 #define SAMD21_PM_APBCSEL_APBCDIV 0 #define SAMD21_PM_APBAMASK_PAC0 0 #define SAMD21_PM_APBAMASK_PM 1 #define SAMD21_PM_APBAMASK_SYSCTRL 2 #define SAMD21_PM_APBAMASK_GCLK 3 #define SAMD21_PM_APBAMASK_WDT 4 #define SAMD21_PM_APBAMASK_RTC 5 #define SAMD21_PM_APBAMASK_EIC 6 #define SAMD21_PM_AHBMASK_HPB0 0 #define SAMD21_PM_AHBMASK_HPB1 1 #define SAMD21_PM_AHBMASK_HPB2 2 #define SAMD21_PM_AHBMASK_DSU 3 #define SAMD21_PM_AHBMASK_NVMCTRL 4 #define SAMD21_PM_AHBMASK_DMAC 5 #define SAMD21_PM_AHBMASK_USB 6 #define SAMD21_PM_APBBMASK_PAC1 0 #define SAMD21_PM_APBBMASK_DSU 1 #define SAMD21_PM_APBBMASK_NVMCTRL 2 #define SAMD21_PM_APBBMASK_PORT 3 #define SAMD21_PM_APBBMASK_DMAC 4 #define SAMD21_PM_APBBMASK_USB 5 #define SAMD21_PM_APBCMASK_PAC2 0 #define SAMD21_PM_APBCMASK_EVSYS 1 #define SAMD21_PM_APBCMASK_SERCOM0 2 #define SAMD21_PM_APBCMASK_SERCOM1 3 #define SAMD21_PM_APBCMASK_SERCOM2 4 #define SAMD21_PM_APBCMASK_SERCOM3 5 #define SAMD21_PM_APBCMASK_SERCOM4 6 #define SAMD21_PM_APBCMASK_SERCOM5 7 #define SAMD21_PM_APBCMASK_TCC0 8 #define SAMD21_PM_APBCMASK_TCC1 9 #define SAMD21_PM_APBCMASK_TCC2 10 #define SAMD21_PM_APBCMASK_TC3 11 #define SAMD21_PM_APBCMASK_TC4 12 #define SAMD21_PM_APBCMASK_TC5 13 #define SAMD21_PM_APBCMASK_TC6 14 #define SAMD21_PM_APBCMASK_TC7 15 #define SAMD21_PM_APBCMASK_ADC 16 #define SAMD21_PM_APBCMASK_AC 17 #define SAMD21_PM_APBCMASK_DAC 18 #define SAMD21_PM_APBCMASK_PTC 19 #define SAMD21_PM_APBCMASK_I2S 20 #define SAMD21_PM_APBCMASK_AC1 21 #define SAMD21_PM_APBCMASK_TCC3 24 struct samd21_sysctrl { vuint32_t intenclr; vuint32_t intenset; vuint32_t intflag; vuint32_t pclksr; vuint32_t xosc; vuint32_t xosc32k; vuint32_t osc32k; vuint32_t osculp32k; vuint32_t osc8m; vuint32_t dfllctrl; vuint32_t dfllval; vuint32_t dfllmul; vuint32_t dfllsync; vuint32_t bod33; vuint32_t reserved_38; vuint32_t vreg; vuint32_t vref; vuint32_t dpllctrla; vuint32_t dpllratio; vuint32_t dpllctrlb; vuint32_t dpllstatus; }; extern struct samd21_sysctrl samd21_sysctrl; #define samd21_sysctrl (*(struct samd21_sysctrl *) 0x40000800) #define SAMD21_SYSCTRL_PCLKSR_XOSCRDY 0 #define SAMD21_SYSCTRL_PCLKSR_XOSC32KRDY 1 #define SAMD21_SYSCTRL_PCLKSR_OSC32KRDY 2 #define SAMD21_SYSCTRL_PCLKSR_OSC8MRDY 3 #define SAMD21_SYSCTRL_PCLKSR_DFLLRDY 4 #define SAMD21_SYSCTRL_PCLKSR_DFLLOOB 5 #define SAMD21_SYSCTRL_PCLKSR_DFLLLCKF 6 #define SAMD21_SYSCTRL_PCLKSR_DFLLLCKC 7 #define SAMD21_SYSCTRL_PCLKSR_DFLLRCS 8 #define SAMD21_SYSCTRL_PCLKSR_BOD33RDY 9 #define SAMD21_SYSCTRL_PCLKSR_BOD33DET 10 #define SAMD21_SYSCTRL_PCLKSR_B33SRDY 11 #define SAMD21_SYSCTRL_PCLKSR_DBPLLLCKR 15 #define SAMD21_SYSCTRL_PCLKSR_DPLLLCKF 16 #define SAMD21_SYSCTRL_PCLKSR_DPLLTO 17 #define SAMD21_SYSCTRL_XOSC_ENABLE 1 #define SAMD21_SYSCTRL_XOSC_XTALEN 2 #define SAMD21_SYSCTRL_XOSC_RUNSTDBY 6 #define SAMD21_SYSCTRL_XOSC_ONDEMAND 7 #define SAMD21_SYSCTRL_XOSC_GAIN 8 #define SAMD21_SYSCTRL_XOSC_GAIN_2MHz 0 #define SAMD21_SYSCTRL_XOSC_GAIN_4MHz 1 #define SAMD21_SYSCTRL_XOSC_GAIN_8MHz 2 #define SAMD21_SYSCTRL_XOSC_GAIN_16MHz 3 #define SAMD21_SYSCTRL_XOSC_GAIN_30MHz 4 #define SAMD21_SYSCTRL_XOSC_AMPGC 11 #define SAMD21_SYSCTRL_XOSC_STARTUP 12 #define SAMD21_SYSCTRL_XOSC_STARTUP_1 0 #define SAMD21_SYSCTRL_XOSC_STARTUP_2 1 #define SAMD21_SYSCTRL_XOSC_STARTUP_4 2 #define SAMD21_SYSCTRL_XOSC_STARTUP_8 3 #define SAMD21_SYSCTRL_XOSC_STARTUP_16 4 #define SAMD21_SYSCTRL_XOSC_STARTUP_32 5 #define SAMD21_SYSCTRL_XOSC_STARTUP_64 6 #define SAMD21_SYSCTRL_XOSC_STARTUP_128 7 #define SAMD21_SYSCTRL_XOSC_STARTUP_256 8 #define SAMD21_SYSCTRL_XOSC_STARTUP_512 9 #define SAMD21_SYSCTRL_XOSC_STARTUP_1024 10 #define SAMD21_SYSCTRL_XOSC_STARTUP_2048 11 #define SAMD21_SYSCTRL_XOSC_STARTUP_4096 12 #define SAMD21_SYSCTRL_XOSC_STARTUP_8192 13 #define SAMD21_SYSCTRL_XOSC_STARTUP_16384 14 #define SAMD21_SYSCTRL_XOSC_STARTUP_32768 15 #define SAMD21_SYSCTRL_XOSC32K_ENABLE 1 #define SAMD21_SYSCTRL_XOSC32K_XTALEN 2 #define SAMD21_SYSCTRL_XOSC32K_EN32K 3 #define SAMD21_SYSCTRL_XOSC32K_AAMPEN 5 #define SAMD21_SYSCTRL_XOSC32K_RUNSTDBY 6 #define SAMD21_SYSCTRL_XOSC32K_ONDEMAND 7 #define SAMD21_SYSCTRL_XOSC32K_STARTUP 8 #define SAMD21_SYSCTRL_XOSC32K_WRTLOCK 12 #define SAMD21_SYSCTRL_OSC8M_ENABLE 1 #define SAMD21_SYSCTRL_OSC8M_RUNSTDBY 6 #define SAMD21_SYSCTRL_OSC8M_ONDEMAND 7 #define SAMD21_SYSCTRL_OSC8M_PRESC 8 #define SAMD21_SYSCTRL_OSC8M_PRESC_1 0 #define SAMD21_SYSCTRL_OSC8M_PRESC_2 1 #define SAMD21_SYSCTRL_OSC8M_PRESC_4 2 #define SAMD21_SYSCTRL_OSC8M_PRESC_8 3 #define SAMD21_SYSCTRL_OSC8M_PRESC_MASK 3 #define SAMD21_SYSCTRL_OSC8M_CALIB 16 #define SAMD21_SYSCTRL_OSC8M_FRANGE 30 #define SAMD21_SYSCTRL_OSC8M_FRANGE_4_6 0 #define SAMD21_SYSCTRL_OSC8M_FRANGE_6_8 1 #define SAMD21_SYSCTRL_OSC8M_FRANGE_8_11 2 #define SAMD21_SYSCTRL_OSC8M_FRANGE_11_15 3 #define SAMD21_SYSCTRL_DFLLCTRL_ENABLE 1 #define SAMD21_SYSCTRL_DFLLCTRL_MODE 2 #define SAMD21_SYSCTRL_DFLLCTRL_STABLE 3 #define SAMD21_SYSCTRL_DFLLCTRL_LLAW 4 #define SAMD21_SYSCTRL_DFLLCTRL_USBCRM 5 #define SAMD21_SYSCTRL_DFLLCTRL_RUNSTDBY 6 #define SAMD21_SYSCTRL_DFLLCTRL_ONDEMAND 7 #define SAMD21_SYSCTRL_DFLLCTRL_CCDIS 8 #define SAMD21_SYSCTRL_DFLLCTRL_QLDIS 9 #define SAMD21_SYSCTRL_DFLLCTRL_BPLCKC 10 #define SAMD21_SYSCTRL_DFLLCTRL_WAITLOCK 11 #define SAMD21_SYSCTRL_DFLLVAL_FINE 0 #define SAMD21_SYSCTRL_DFLLVAL_COARSE 10 #define SAMD21_SYSCTRL_DFLLVAL_DIFF 16 #define SAMD21_SYSCTRL_DFLLMUL_MUL 0 #define SAMD21_SYSCTRL_DFLLMUL_FSTEP 16 #define SAMD21_SYSCTRL_DFLLMUL_CSTEP 26 #define SAMD21_SYSCTRL_DFLLSYNC_READREQ 7 #define SAMD21_SYSCTRL_DPLLCTRLA_ENABLE 1 #define SAMD21_SYSCTRL_DPLLCTRLA_RUNSTDBY 6 #define SAMD21_SYSCTRL_DPLLCTRLA_ONDEMAND 7 #define SAMD21_SYSCTRL_DPLLRATIO_LDR 0 #define SAMD21_SYSCTRL_DPLLRATIO_LDRFRAC 0 #define SAMD21_SYSCTRL_DPLLCTRLB_FILTER 0 #define SAMD21_SYSCTRL_DPLLCTRLB_FILTER_DEFAULT 0 #define SAMD21_SYSCTRL_DPLLCTRLB_FILTER_LBFILT 1 #define SAMD21_SYSCTRL_DPLLCTRLB_FILTER_HBFILT 2 #define SAMD21_SYSCTRL_DPLLCTRLB_FILTER_HDFILT 3 #define SAMD21_SYSCTRL_DPLLCTRLB_LPEN 2 #define SAMD21_SYSCTRL_DPLLCTRLB_WUF 3 #define SAMD21_SYSCTRL_DPLLCTRLB_REFCLK 4 #define SAMD21_SYSCTRL_DPLLCTRLB_REFCLK_XOSC32 0 #define SAMD21_SYSCTRL_DPLLCTRLB_REFCLK_XOSC 1 #define SAMD21_SYSCTRL_DPLLCTRLB_REFCLK_GCLK_DPLL 2 #define SAMD21_SYSCTRL_DPLLCTRLB_LTIME 8 #define SAMD21_SYSCTRL_DPLLCTRLB_LTIME_DEFAULT 0 #define SAMD21_SYSCTRL_DPLLCTRLB_LTIME_8MS 4 #define SAMD21_SYSCTRL_DPLLCTRLB_LTIME_9MS 5 #define SAMD21_SYSCTRL_DPLLCTRLB_LTIME_10MS 6 #define SAMD21_SYSCTRL_DPLLCTRLB_LTIME_11MS 7 #define SAMD21_SYSCTRL_DPLLCTRLB_LBYPASS 12 #define SAMD21_SYSCTRL_DPLLCTRLB_DIV 16 #define SAMD21_SYSCTRL_DPLLSTATUS_LOCK 0 #define SAMD21_SYSCTRL_DPLLSTATUS_CLKRDY 1 #define SAMD21_SYSCTRL_DPLLSTATUS_ENABLE 2 #define SAMD21_SYSCTRL_DPLLSTATUS_DIV 3 struct samd21_dmac { vuint16_t ctrl; vuint16_t crcctrl; vuint32_t crcdatain; vuint32_t crcchksum; vuint8_t crcstatus; vuint8_t dbgctrl; vuint8_t qosctrl; uint8_t reserved_0f; vuint32_t swtrigctrl; vuint32_t prictrl0; uint32_t reserved_18; uint32_t reserved_1c; vuint16_t intpend; uint16_t reserved_22; vuint32_t intstatus; vuint32_t busych; vuint32_t pendch; vuint32_t active; vuint32_t baseaddr; vuint32_t wrbaddr; uint16_t reserved_3c; uint8_t reserved_3e; vuint8_t chid; vuint8_t chctrla; uint8_t reserved_41; uint16_t reserved_42; vuint32_t chctrlb; uint32_t reserved_48; vuint8_t chintenclr; vuint8_t chintenset; vuint8_t chintflag; vuint8_t chstatus; }; extern struct samd21_dmac samd21_dmac; #define samd21_dmac (*(struct samd21_dmac *) 0x41004800) struct samd21_dmac_desc { vuint16_t btctrl; vuint16_t btcnt; vuint32_t srcaddr; vuint32_t dstaddr; vuint32_t descaddr; } __attribute__((aligned(8))); #define SAMD21_DMAC_NCHAN 12 #define SAMD21_DMAC_CTRL_SWRST 0 #define SAMD21_DMAC_CTRL_DMAENABLE 1 #define SAMD21_DMAC_CTRL_CRCENABLE 2 #define SAMD21_DMAC_CTRL_LVLEN(x) (8 + (x)) #define SAMD21_DMAC_QOSCTRL_WRBQOS 0 #define SAMD21_DMAC_QOSCTRL_FQOS 2 #define SAMD21_DMAC_QOSCTRL_DQOS 4 #define SAMD21_DMAC_QOSCTRL_DISABLE 0 #define SAMD21_DMAC_QOSCTRL_LOW 1 #define SAMD21_DMAC_QOSCTRL_MEDIUM 2 #define SAMD21_DMAC_QOSCTRL_HIGH 3 #define SAMD21_DMAC_SWTRIGCTRL_SWTRIG(n) (0 + (n)) #define SAMD21_DMAC_PRICTRL0_LVLPRI0 0 #define SAMD21_DMAC_PRICTRL0_RRLVLEN0 7 #define SAMD21_DMAC_PRICTRL0_LVLPRI1 8 #define SAMD21_DMAC_PRICTRL0_RRLVLEN1 15 #define SAMD21_DMAC_PRICTRL0_LVLPRI2 16 #define SAMD21_DMAC_PRICTRL0_RRLVLEN2 23 #define SAMD21_DMAC_PRICTRL0_LVLPRI3 24 #define SAMD21_DMAC_PRICTRL0_RRLVLEN3 31 #define SAMD21_DMAC_INTPEND_ID 0 #define SAMD21_DMAC_INTPEND_ID_MASK 0xf #define SAMD21_DMAC_INTPEND_TERR 8 #define SAMD21_DMAC_INTPEND_TCMPL 9 #define SAMD21_DMAC_INTPEND_SUSP 10 #define SAMD21_DMAC_INTPEND_FERR 13 #define SAMD21_DMAC_INTPEND_BUSY 14 #define SAMD21_DMAC_INTPEND_PEND 15 #define SAMD21_DMAC_INTSTATUS_CHINT(n) (0 + (n)) #define SAMD21_DMAC_BUSYCH_BUSYCH(n) (0 + (n)) #define SAMD21_DMAC_PENDCH_PENDCH(n) (0 + (n)) #define SAMD21_DMAC_ACTIVE_LVLEX(x) (0 + (x)) #define SAMD21_DMAC_ACTIVE_ID 8 #define SAMD21_DMAC_ACTIVE_ABUSY 15 #define SAMD21_DMAC_ACTIVE_BTCNT 16 #define SAMD21_DMAC_CHCTRLA_SWRST 0 #define SAMD21_DMAC_CHCTRLA_ENABLE 1 #define SAMD21_DMAC_CHCTRLB_EVACT 0 #define SAMD21_DMAC_CHCTRLB_EVACT_NOACT 0 #define SAMD21_DMAC_CHCTRLB_EVACT_TRIG 1 #define SAMD21_DMAC_CHCTRLB_EVACT_CTRIG 2 #define SAMD21_DMAC_CHCTRLB_EVACT_CBLOCK 3 #define SAMD21_DMAC_CHCTRLB_EVACT_SUSPEND 4 #define SAMD21_DMAC_CHCTRLB_EVACT_RESUME 5 #define SAMD21_DMAC_CHCTRLB_EVACT_SSKIP 6 #define SAMD21_DMAC_CHCTRLB_EVIE 3 #define SAMD21_DMAC_CHCTRLB_EVOE 4 #define SAMD21_DMAC_CHCTRLB_LVL 5 #define SAMD21_DMAC_CHCTRLB_TRIGSRC 8 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_DISABLE 0x00 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_SERCOM_RX(n) (0x01 + (n) * 2) #define SAMD21_DMAC_CHCTRLB_TRIGSRC_SERCOM_TX(n) (0x02 + (n) * 2) #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC0_OVF 0x0d #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC0_MC0 0x0e #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC0_MC1 0x0f #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC0_MC2 0x10 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC0_MC3 0x11 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC1_OVF 0x12 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC1_MC0 0x13 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC1_MC1 0x14 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC2_OVF 0x15 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC2_MC0 0x16 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC2_MC1 0x17 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TC3_OVF 0x18 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TC3_MC0 0x19 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TC3_MC1 0x1a #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TC4_OVF 0x1b #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TC4_MC0 0x1c #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TC4_MC1 0x1d #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TC5_OVF 0x1e #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TC5_MC0 0x1f #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TC5_MC1 0x20 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TC6_OVF 0x21 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TC6_MC0 0x22 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TC6_MC1 0x23 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TC7_OVF 0x24 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TC7_MC0 0x25 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TC7_MC1 0x26 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_ADC_RESRDY 0x27 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_DAC_EMPTY 0x28 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_I2S_RX_0 0x29 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_I2S_RX_1 0x2a #define SAMD21_DMAC_CHCTRLB_TRIGSRC_I2S_TX_0 0x2b #define SAMD21_DMAC_CHCTRLB_TRIGSRC_I2S_TX_1 0x2c #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC3_OVF 0x2d #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC3_MC0 0x2e #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC3_MC1 0x2f #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC3_MC2 0x30 #define SAMD21_DMAC_CHCTRLB_TRIGSRC_TCC3_MC3 0x31 #define SAMD21_DMAC_CHCTRLB_TRIGACT 22 #define SAMD21_DMAC_CHCTRLB_TRIGACT_BLOCK 0 #define SAMD21_DMAC_CHCTRLB_TRIGACT_BEAT 2 #define SAMD21_DMAC_CHCTRLB_TRIGACT_TRANSACTION 3 #define SAMD21_DMAC_CHCTRLB_CMD 24 #define SAMD21_DMAC_CHCTRLB_CMD_NOACT 0 #define SAMD21_DMAC_CHCTRLB_CMD_SUSPEND 1 #define SAMD21_DMAC_CHCTRLB_CMD_RESUME 2 #define SAMD21_DMAC_CHINTFLAG_TERR 0 #define SAMD21_DMAC_CHINTFLAG_TCMPL 1 #define SAMD21_DMAC_CHINTFLAG_SUSP 2 #define SAMD21_DMAC_CHSTATUS_PEND 0 #define SAMD21_DMAC_CHSTATUS_BUSY 1 #define SAMD21_DMAC_CHSTATUS_FERR 2 #define SAMD21_DMAC_DESC_BTCTRL_VALID 0 #define SAMD21_DMAC_DESC_BTCTRL_EVOSEL 1 #define SAMD21_DMAC_DESC_BTCTRL_BLOCKACT 3 #define SAMD21_DMAC_DESC_BTCTRL_BEATSIZE 8 #define SAMD21_DMAC_DESC_BTCTRL_SRCINC 10 #define SAMD21_DMAC_DESC_BTCTRL_DSTINC 11 #define SAMD21_DMAC_DESC_BTCTRL_STEPSEL 12 #define SAMD21_DMAC_DESC_BTCTRL_STEPSIZE 13 struct samd21_nvmctrl { vuint32_t ctrla; vuint32_t ctrlb; vuint32_t param; vuint32_t intenclr; vuint32_t intenset; vuint32_t intflag; vuint32_t status; vuint32_t addr; vuint32_t lock; }; extern struct samd21_nvmctrl samd21_nvmctrl; #define samd21_nvmctrl (*(struct samd21_nvmctrl *) 0x41004000) #define SAMD21_NVMCTRL_CTRLA_CMD 0 #define SAMD21_NVMCTRL_CTRLA_CMD_ER 0x02 #define SAMD21_NVMCTRL_CTRLA_CMD_WP 0x04 #define SAMD21_NVMCTRL_CTRLA_CMD_EAR 0x05 #define SAMD21_NVMCTRL_CTRLA_CMD_WAP 0x06 #define SAMD21_NVMCTRL_CTRLA_CMD_RWWEEER 0x1a #define SAMD21_NVMCTRL_CTRLA_CMD_RWEEEWP 0x1c #define SAMD21_NVMCTRL_CTRLA_CMD_LR 0x40 #define SAMD21_NVMCTRL_CTRLA_CMD_UR 0x41 #define SAMD21_NVMCTRL_CTRLA_CMD_SPRM 0x42 #define SAMD21_NVMCTRL_CTRLA_CMD_CPRM 0x43 #define SAMD21_NVMCTRL_CTRLA_CMD_PBC 0x44 #define SAMD21_NVMCTRL_CTRLA_CMD_SSB 0x45 #define SAMD21_NVMCTRL_CTRLA_CMD_INVALL 0x46 #define SAMD21_NVMCTRL_CTRLA_CMD_LDR 0x47 #define SAMD21_NVMCTRL_CTRLA_CMD_UDR 0x48 #define SAMD21_NVMCTRL_CTRLA_CMDEX 8 #define SAMD21_NVMCTRL_CTRLA_CMDEX_KEY 0xa5 #define SAMD21_NVMCTRL_CTRLB_RWS 1 #define SAMD21_NVMCTRL_CTRLB_MANW 7 #define SAMD21_NVMCTRL_CTRLB_SLEEPRM 8 #define SAMD21_NVMCTRL_CTRLB_READMODE 16 #define SAMD21_NVMCTRL_CTRLB_CACHEDIS 18 #define SAMD21_NVMCTRL_INTENCLR_READY 0 #define SAMD21_NVMCTRL_INTENCLR_ERROR 1 #define SAMD21_NVMCTRL_INTENSET_READY 0 #define SAMD21_NVMCTRL_INTENSET_ERROR 1 #define SAMD21_NVMCTRL_INTFLAG_READY 0 #define SAMD21_NVMCTRL_INTFLAG_ERROR 1 #define SAMD21_NVMCTRL_STATUS_PRM 0 #define SAMD21_NVMCTRL_STATUS_LOAD 1 #define SAMD21_NVMCTRL_STATUS_PROGE 2 #define SAMD21_NVMCTRL_STATUS_LOCKE 3 #define SAMD21_NVMCTRL_STATUS_NVME 4 #define SAMD21_NVMCTRL_STATUS_SB 8 #define SAMD21_NVMCTRL_PARAM_NVMP 0 #define SAMD21_NVMCTRL_PARAM_NVMP_MASK 0xffff #define SAMD21_NVMCTRL_PARAM_PSZ 16 #define SAMD21_NVMCTRL_PARAM_PSZ_MASK 0x7 #define SAMD21_NVMCTRL_PARAM_RWWEEP 20 #define SAMD21_NVMCTRL_PARAM_RWWEEP_MASK 0xfff static inline uint32_t samd21_nvmctrl_page_size(void) { return 1 << (3 + ((samd21_nvmctrl.param >> SAMD21_NVMCTRL_PARAM_PSZ) & SAMD21_NVMCTRL_PARAM_PSZ_MASK)); } uint32_t samd21_flash_size(void); struct samd21_port { vuint32_t dir; vuint32_t dirclr; vuint32_t dirset; vuint32_t dirtgl; vuint32_t out; vuint32_t outclr; vuint32_t outset; vuint32_t outtgl; vuint32_t in; vuint32_t ctrl; vuint32_t wrconfig; vuint32_t reserved_2c; vuint8_t pmux[16]; vuint8_t pincfg[32]; }; extern struct samd21_port samd21_port_a; extern struct samd21_port samd21_port_b; #define samd21_port_a (*(struct samd21_port *) 0x41004400) #define samd21_port_b (*(struct samd21_port *) 0x41004480) #define SAMD21_PORT_PINCFG_PMUXEN 0 #define SAMD21_PORT_PINCFG_INEN 1 #define SAMD21_PORT_PINCFG_PULLEN 2 #define SAMD21_PORT_PINCFG_DRVSTR 6 #define SAMD21_PORT_PMUX_FUNC_A 0 #define SAMD21_PORT_PMUX_FUNC_B 1 #define SAMD21_PORT_PMUX_FUNC_C 2 #define SAMD21_PORT_PMUX_FUNC_D 3 #define SAMD21_PORT_PMUX_FUNC_E 4 #define SAMD21_PORT_PMUX_FUNC_F 5 #define SAMD21_PORT_PMUX_FUNC_G 6 #define SAMD21_PORT_PMUX_FUNC_H 7 #define SAMD21_PORT_PMUX_FUNC_I 8 #define SAMD21_PORT_DIR_OUT 1 #define SAMD21_PORT_DIR_IN 0 static inline void samd21_port_dir_set(struct samd21_port *port, uint8_t pin, uint8_t dir) { if (dir) port->dirset = (1 << pin); else port->dirclr = (1 << pin); } static inline void samd21_port_pincfg_set(struct samd21_port *port, uint8_t pin, uint8_t pincfg_mask, uint8_t pincfg) { port->pincfg[pin] = (port->pincfg[pin] & ~pincfg_mask) | pincfg; } static inline uint8_t samd21_port_pincfg_get(struct samd21_port *port, uint8_t pin) { return port->pincfg[pin]; } static inline void samd21_port_pmux_set(struct samd21_port *port, uint8_t pin, uint8_t func) { uint8_t byte = pin >> 1; uint8_t bit = (pin & 1) << 2; uint8_t mask = 0xf << bit; uint8_t value = (port->pmux[byte] & ~mask) | (func << bit); port->pmux[byte] = value; samd21_port_pincfg_set(port, pin, (1 << SAMD21_PORT_PINCFG_PMUXEN), (1 << SAMD21_PORT_PINCFG_PMUXEN)); } struct samd21_adc { vuint8_t ctrla; vuint8_t refctrl; vuint8_t avgctrl; vuint8_t sampctrl; vuint16_t ctrlb; vuint16_t reserved_06; vuint8_t winctrl; vuint8_t reserved_09; vuint16_t reserved_0a; vuint8_t swtrig; vuint8_t reserved_0d; vuint16_t reserved_0e; vuint32_t inputctrl; vuint8_t evctrl; vuint8_t reserved_15; vuint8_t intenclr; vuint8_t intenset; vuint8_t intflag; vuint8_t status; vuint16_t result; vuint16_t winlt; vuint16_t reserved_1e; vuint16_t winut; vuint16_t reserved_22; vuint16_t gaincorr; vuint16_t offsetcorr; vuint16_t calib; vuint8_t dbgctrl; vuint8_t reserved_2b; vuint32_t reserved_2c; }; #define SAMD21_ADC_CTRLA_SWRST 0 #define SAMD21_ADC_CTRLA_ENABLE 1 #define SAMD21_ADC_CTRLA_RUNSTDBY 2 #define SAMD21_ADC_REFCTRL_REFSEL 0 #define SAMD21_ADC_REFCTRL_REFSEL_INT1V 0 #define SAMD21_ADC_REFCTRL_REFSEL_INTVCC0 1 #define SAMD21_ADC_REFCTRL_REFSEL_INTVCC1 2 #define SAMD21_ADC_REFCTRL_REFSEL_VREFA 3 #define SAMD21_ADC_REFCTRL_REFSEL_VREFB 4 #define SAMD21_ADC_REFCTRL_REFCOMP 7 #define SAMD21_ADC_AVGCTRL_SAMPLENUM 0 #define SAMD21_ADC_AVGCTRL_ADJRES 4 #define SAMD21_ADC_SAMPCTRL_SAMPLEN 0 #define SAMD21_ADC_CTRLB_DIFFMODE 0 #define SAMD21_ADC_CTRLB_LEFTADJ 1 #define SAMD21_ADC_CTRLB_FREERUN 2 #define SAMD21_ADC_CTRLB_CORREN 3 #define SAMD21_ADC_CTRLB_RESSEL 4 #define SAMD21_ADC_CTRLB_RESSEL_12BIT 0 #define SAMD21_ADC_CTRLB_RESSEL_16BIT 1 #define SAMD21_ADC_CTRLB_RESSEL_10BIT 2 #define SAMD21_ADC_CTRLB_RESSEL_8BIT 3 #define SAMD21_ADC_CTRLB_PRESCALER 8 #define SAMD21_ADC_CTRLB_PRESCALER_DIV4 0 #define SAMD21_ADC_CTRLB_PRESCALER_DIV8 1 #define SAMD21_ADC_CTRLB_PRESCALER_DIV16 2 #define SAMD21_ADC_CTRLB_PRESCALER_DIV32 3 #define SAMD21_ADC_CTRLB_PRESCALER_DIV64 4 #define SAMD21_ADC_CTRLB_PRESCALER_DIV128 5 #define SAMD21_ADC_CTRLB_PRESCALER_DIV256 6 #define SAMD21_ADC_CTRLB_PRESCALER_DIV512 7 #define SAMD21_ADC_SWTRIG_FLUSH 0 #define SAMD21_ADC_SWTRIG_START 1 #define SAMD21_ADC_INPUTCTRL_MUXPOS 0 # define SAMD21_ADC_INPUTCTRL_MUXPOS_BANDGAP 0x19 # define SAMD21_ADC_INPUTCTRL_MUXPOS_SCALEDCOREVCC 0x1a # define SAMD21_ADC_INPUTCTRL_MUXPOS_SCALEDIOVCC 0x1b # define SAMD21_ADC_INPUTCTRL_MUXPOS_DAC 0x1c #define SAMD21_ADC_INPUTCTRL_MUXNEG 8 # define SAMD21_ADC_INPUTCTRL_MUXNEG_GND 0x18 # define SAMD21_ADC_INPUTCTRL_MUXNEG_IOGND 0x19 #define SAMD21_ADC_INPUTCTRL_INPUTSCAN 16 #define SAMD21_ADC_INPUTCTRL_INPUTOFFSET 20 #define SAMD21_ADC_INPUTCTRL_GAIN 24 #define SAMD21_ADC_INPUTCTRL_GAIN_1X 0 #define SAMD21_ADC_INPUTCTRL_GAIN_DIV2 0xf #define SAMD21_ADC_INTFLAG_RESRDY 0 #define SAMD21_ADC_INTFLAG_OVERRUN 1 #define SAMD21_ADC_INTFLAG_WINMON 2 #define SAMD21_ADC_INTFLAG_SYNCRDY 3 #define SAMD21_ADC_STATUS_SYNCBUSY 7 #define SAMD21_ADC_CALIB_LINEARITY_CAL 0 #define SAMD21_ADC_CALIB_BIAS_CAL 16 extern struct samd21_adc samd21_adc; #define samd21_adc (*(struct samd21_adc *) 0x42004000) /* TC */ struct samd21_tc { vuint16_t ctrla; vuint16_t readreq; vuint8_t ctrlbclr; vuint8_t ctrlbset; vuint8_t ctrlc; vuint8_t reserved_07; vuint8_t dbgctrl; vuint8_t reserved_09; vuint16_t evctrl; vuint8_t intenclr; vuint8_t intenset; vuint8_t intflag; vuint8_t status; union { struct { vuint8_t count; vuint8_t reserved_11; vuint16_t reserved_12; vuint8_t per; vuint8_t reserved_15; vuint16_t reserved_16; vuint8_t cc[2]; } mode_8; struct { vuint16_t count; vuint16_t reserved_12; vuint32_t reserved_14; vuint16_t cc[2]; } mode_16; struct { vuint32_t count; vuint32_t reserved_14; vuint32_t cc[2]; } mode_32; }; }; extern struct samd21_tc samd21_tc3; #define samd21_tc3 (*(struct samd21_tc *) 0x42002c00) extern struct samd21_tc samd21_tc4; #define samd21_tc4 (*(struct samd21_tc *) 0x42003000) extern struct samd21_tc samd21_tc5; #define samd21_tc5 (*(struct samd21_tc *) 0x42003400) extern struct samd21_tc samd21_tc6; #define samd21_tc6 (*(struct samd21_tc *) 0x42003800) extern struct samd21_tc samd21_tc7; #define samd21_tc7 (*(struct samd21_tc *) 0x42003c00) #define SAMD21_TC_CTRLA_SWRST 0 #define SAMD21_TC_CTRLA_ENABLE 1 #define SAMD21_TC_CTRLA_MODE 2 #define SAMD21_TC_CTRLA_MODE_COUNT16 0 #define SAMD21_TC_CTRLA_MODE_COUNT8 1 #define SAMD21_TC_CTRLA_MODE_COUNT32 2 #define SAMD21_TC_CTRLA_WAVEGEN 5 #define SAMD21_TC_CTRLA_WAVEGEN_NFRQ 0 #define SAMD21_TC_CTRLA_WAVEGEN_MFRQ 1 #define SAMD21_TC_CTRLA_WAVEGEN_NPWM 2 #define SAMD21_TC_CTRLA_WAVEGEN_MPWM 3 #define SAMD21_TC_CTRLA_PRESCALER 8 #define SAMD21_TC_CTRLA_PRESCALER_DIV1 0 #define SAMD21_TC_CTRLA_PRESCALER_DIV2 1 #define SAMD21_TC_CTRLA_PRESCALER_DIV4 2 #define SAMD21_TC_CTRLA_PRESCALER_DIV8 3 #define SAMD21_TC_CTRLA_PRESCALER_DIV16 4 #define SAMD21_TC_CTRLA_PRESCALER_DIV64 5 #define SAMD21_TC_CTRLA_PRESCALER_DIV256 6 #define SAMD21_TC_CTRLA_PRESCALER_DIV1024 7 #define SAMD21_TC_CTRLA_RUNSTDBY 11 #define SAMD21_TC_CTRLA_PRESCSYNC 12 #define SAMD21_TC_CTRLA_PRESCSYNC_GCLK 0 #define SAMD21_TC_CTRLA_PRESCSYNC_PRSEC 1 #define SAMD21_TC_CTRLA_PRESCSYNC_RESYNC 2 #define SAMD21_TC_READREQ_ADDR 0 #define SAMD21_TC_READREQ_RCONT 14 #define SAMD21_TC_READREQ_RREQ 15 #define SAMD21_TC_CTRLB_DIR 0 #define SAMD21_TC_CTRLB_ONESHOT 2 #define SAMD21_TC_CTRLB_CMD 6 #define SAMD21_TC_CTRLC_INVEN(x) (0 + (x)) #define SAMD21_TC_CTRLC_CPTEN(x) (4 + (x)) #define SAMD21_TC_DBGCTRL_DBGRUN 0 #define SAMD21_TC_EVCTRL_EVACT 0 #define SAMD21_TC_EVCTRL_TCINV 4 #define SAMD21_TC_EVCTRL_TCEI 5 #define SAMD21_TC_EVCTRL_OVFEO 8 #define SAMD21_TC_EVCTRL_MCEO(x) (12 + (x)) #define SAMD21_TC_INTFLAG_MC(x) (4 + (x)) #define SAMD21_TC_INTFLAG_SYNCRDY 3 #define SAMD21_TC_INTFLAG_ERR 1 #define SAMD21_TC_INTFLAG_OVF 0 #define SAMD21_TC_STATUS_STOP 3 #define SAMD21_TC_STATUS_SLAVE 4 #define SAMD21_TC_STATUS_SYNCBUSY 7 /* TCC */ struct samd21_tcc { vuint32_t ctrla; vuint8_t ctrlbclr; vuint8_t ctrlbset; vuint16_t reserved_06; vuint32_t syncbusy; vuint32_t fctrla; vuint32_t fctlrb; vuint32_t wexctrl; vuint32_t drvctrl; vuint16_t reserved_1c; vuint8_t dbgctrl; vuint8_t reserved_1f; vuint32_t evctrl; vuint32_t intenclr; vuint32_t intenset; vuint32_t intflag; vuint32_t status; vuint32_t count; vuint16_t patt; vuint16_t reserved_3a; vuint32_t wave; vuint32_t per; vuint32_t cc[4]; vuint32_t reserved_54; vuint32_t reserved_58; vuint32_t reserved_5c; vuint32_t reserved_60; vuint16_t pattb; vuint16_t reserved_66; vuint32_t waveb; vuint32_t perb; vuint32_t ccb[4]; }; extern struct samd21_tcc samd21_tcc0; #define samd21_tcc0 (*(struct samd21_tcc *) 0x42002000) extern struct samd21_tcc samd21_tcc1; #define samd21_tcc1 (*(struct samd21_tcc *) 0x42002400) extern struct samd21_tcc samd21_tcc2; #define samd21_tcc2 (*(struct samd21_tcc *) 0x42002800) extern struct samd21_tcc samd21_tcc3; #define samd21_tcc3 (*(struct samd21_tcc *) 0x42006000) #define SAMD21_TCC_CTRLA_SWRST 0 #define SAMD21_TCC_CTRLA_ENABLE 1 #define SAMD21_TCC_CTRLA_RESOLUTION 5 #define SAMD21_TCC_CTRLA_RESOLUTION_NONE 0 #define SAMD21_TCC_CTRLA_RESOLUTION_DITH4 1 #define SAMD21_TCC_CTRLA_RESOLUTION_DITH5 2 #define SAMD21_TCC_CTRLA_RESOLUTION_DITH6 3 #define SAMD21_TCC_CTRLA_PRESCALER 8 #define SAMD21_TCC_CTRLA_PRESCALER_DIV1 0 #define SAMD21_TCC_CTRLA_PRESCALER_DIV2 1 #define SAMD21_TCC_CTRLA_PRESCALER_DIV4 2 #define SAMD21_TCC_CTRLA_PRESCALER_DIV8 3 #define SAMD21_TCC_CTRLA_PRESCALER_DIV16 4 #define SAMD21_TCC_CTRLA_PRESCALER_DIV64 5 #define SAMD21_TCC_CTRLA_PRESCALER_DIV256 6 #define SAMD21_TCC_CTRLA_PRESCALER_DIV1024 7 #define SAMD21_TCC_CTRLA_RUNSTDBY 11 #define SAMD21_TCC_CTRLA_PRESYNC 12 #define SAMD21_TCC_CTRLA_PRESYNC_GCLK 0 #define SAMD21_TCC_CTRLA_PRESYNC_PRESC 1 #define SAMD21_TCC_CTRLA_PRESYNC_RESYNC 2 #define SAMD21_TCC_CTRLA_ALOCK 14 #define SAMD21_TCC_CTRLA_CPTEN(n) (24 + (n)) #define SAMD21_TCC_CTRLB_DIR 0 #define SAMD21_TCC_CTRLB_LUPD 1 #define SAMD21_TCC_CTRLB_ONESHOT 2 #define SAMD21_TCC_CTRLB_IDXCMD 3 #define SAMD21_TCC_CTRLB_IDXCMD_DISABLE 0 #define SAMD21_TCC_CTRLB_IDXCMD_SET 1 #define SAMD21_TCC_CTRLB_IDXCMD_CLEAR 2 #define SAMD21_TCC_CTRLB_IDXCMD_HOLD 3 #define SAMD21_TCC_CTRLB_CMD 5 #define SAMD21_TCC_CTRLB_CMD_NONE 0 #define SAMD21_TCC_CTRLB_CMD_RETRIGGER 1 #define SAMD21_TCC_CTRLB_CMD_STOP 2 #define SAMD21_TCC_CTRLB_CMD_UPDATE 3 #define SAMD21_TCC_CTRLB_CMD_READSYNC 4 #define SAMD21_TCC_CTRLB_CMD_DMAOS 5 #define SAMD21_TCC_SYNCBUSY_SWRST 0 #define SAMD21_TCC_SYNCBUSY_ENABLE 1 #define SAMD21_TCC_SYNCBUSY_CTRLB 2 #define SAMD21_TCC_SYNCBUSY_STATUS 3 #define SAMD21_TCC_SYNCBUSY_COUNT 4 #define SAMD21_TCC_SYNCBUSY_PATT 5 #define SAMD21_TCC_SYNCBUSY_WAVE 6 #define SAMD21_TCC_SYNCBUSY_PER 7 #define SAMD21_TCC_SYNCBUSY_CC(x) (8 + (x)) #define SAMD21_TCC_SYNCBUSY_PATTB 16 #define SAMD21_TCC_SYNCBUSY_WAVEB 17 #define SAMD21_TCC_SYNCBUSY_PERB 18 #define SAMD21_TCC_SYNCBUSY_CCB(x) ((19 + (x)) #define SAMD21_TCC_EVCTRL_EVACTO 0 #define SAMD21_TCC_EVCTRL_EVACT1 3 #define SAMD21_TCC_EVCTRL_CNTSEL 6 #define SAMD21_TCC_EVCTRL_OVFEO 8 #define SAMD21_TCC_EVCTRL_TRGEO 9 #define SAMD21_TCC_EVCTRL_CNTEO 10 #define SAMD21_TCC_EVCTRL_TCINV(x) (12 + (x)) #define SAMD21_TCC_EVCTRL_MCEI(x) (16 + (x)) #define SAMD21_TCC_EVCTRL_MCEO(x) (24 + (x)) #define SAMD21_TCC_INTFLAG_OVF 0 #define SAMD21_TCC_INTFLAG_TRG 1 #define SAMD21_TCC_INTFLAG_CNT 2 #define SAMD21_TCC_INTFLAG_ERR 3 #define SAMD21_TCC_INTFLAG_UFS 10 #define SAMD21_TCC_INTFLAG_DFS 11 #define SAMD21_TCC_INTFLAG_FAULTA 12 #define SAMD21_TCC_INTFLAG_FAULTB 13 #define SAMD21_TCC_INTFLAG_FAULT0 14 #define SAMD21_TCC_INTFLAG_FAULT1 15 #define SAMD21_TCC_INTFLAG_MC(x) (16 + (x)) #define SAMD21_TCC_WAVE_WAVEGEN 0 #define SAMD21_TCC_WAVE_WAVEGEN_NFRQ 0 #define SAMD21_TCC_WAVE_WAVEGEN_MFRQ 1 #define SAMD21_TCC_WAVE_WAVEGEN_NPWM 2 #define SAMD21_TCC_WAVE_WAVEGEN_DSCRITICAL 4 #define SAMD21_TCC_WAVE_WAVEGEN_DSBOTTOM 5 #define SAMD21_TCC_WAVE_WAVEGEN_DSBOTH 6 #define SAMD21_TCC_WAVE_WAVEGEN_DSTOP 7 #define SAMD21_TCC_WAVE_RAMP 4 #define SAMD21_TCC_WAVE_CIPEREN 7 #define SAMD21_TCC_WAVE_CCCEN(x) (8 + (x)) #define SAMD21_TCC_WAVE_POL(x) (16 + (x)) #define SAMD21_TCC_WAVE_SWAP(x) (24 + (x)) /* USB */ struct samd21_usb { vuint8_t ctrla; vuint8_t reserved_01; vuint8_t syncbusy; vuint8_t qosctrl; vuint32_t reserved_04; vuint16_t ctrlb; vuint8_t dadd; vuint8_t reserved_0b; vuint8_t status; vuint8_t fsmstatus; vuint16_t reserved_0e; vuint16_t fnum; vuint16_t reserved_12; vuint16_t intenclr; vuint16_t reserved_16; vuint16_t intenset; vuint16_t reserved_1a; vuint16_t intflag; vuint16_t reserved_1e; vuint16_t epintsmry; vuint16_t reserved_22; vuint32_t descadd; vuint16_t padcal; uint8_t reserved_2a[0x100 - 0x2a]; struct { vuint8_t epcfg; vuint8_t reserved_01; vuint8_t reserved_02; vuint8_t binterval; vuint8_t epstatusclr; vuint8_t epstatusset; vuint8_t epstatus; vuint8_t epintflag; vuint8_t epintenclr; vuint8_t epintenset; vuint8_t reserved_0a[0x20 - 0x0a]; } ep[8]; }; extern struct samd21_usb samd21_usb; #define samd21_usb (*(struct samd21_usb *) 0x41005000) #define SAMD21_USB_CTRLA_SWRST 0 #define SAMD21_USB_CTRLA_ENABLE 1 #define SAMD21_USB_CTRLA_RUNSTDBY 2 #define SAMD21_USB_CTRLA_MODE 7 #define SAMD21_USB_SYNCBUSY_SWRST 0 #define SAMD21_USB_SYNCBUSY_ENABLE 1 #define SAMD21_USB_QOSCTRL_CQOS 0 #define SAMD21_USB_QOSCTRL_DQOS 2 #define SAMD21_USB_CTRLB_DETACH 0 #define SAMD21_USB_CTRLB_UPRSM 1 #define SAMD21_USB_CTRLB_SPDCONF 2 #define SAMD21_USB_CTRLB_SPDCONF_FS 0 #define SAMD21_USB_CTRLB_SPDCONF_LS 1 #define SAMD21_USB_CTRLB_SPDCONF_MASK 0x3 #define SAMD21_USB_CTRLB_NREPLY 4 #define SAMD21_USB_CTRLB_GNAK 9 #define SAMD21_USB_CTRLB_LPMHDSK 10 #define SAMD21_USB_CTRLB_LPMHDSK_NONE 0 #define SAMD21_USB_CTRLB_LPMHDSK_ACK 1 #define SAMD21_USB_CTRLB_LPMHDSK_NYET 2 #define SAMD21_USB_CTRLB_LPMHDSK_MASK 3 #define SAMD21_USB_DADD_DADD 0 #define SAMD21_USB_DADD_ADDEN 7 #define SAMD21_USB_STATUS_SPEED 2 #define SAMD21_USB_STATUS_LINESTATE 6 #define SAMD21_USB_FNUM_MFNUM 0 #define SAMD21_USB_FNUM_FNUM 3 #define SAMD21_USB_FNUM_FNCERR 15 #define SAMD21_USB_INTFLAG_SUSPEND 0 #define SAMD21_USB_INTFLAG_SOF 2 #define SAMD21_USB_INTFLAG_EORST 3 #define SAMD21_USB_INTFLAG_WAKEUP 4 #define SAMD21_USB_INTFLAG_EORSM 5 #define SAMD21_USB_INTFLAG_UPRSM 6 #define SAMD21_USB_INTFLAG_RAMACER 7 #define SAMD21_USB_INTFLAG_LPMNYET 8 #define SAMD21_USB_INTFLAG_LPMSUSP 9 #define SAMD21_USB_PADCAL_TRANSP 0 #define SAMD21_USB_PADCAL_TRANSN 6 #define SAMD21_USB_PADCAL_TRIM 12 #define SAMD21_USB_EP_EPCFG_EP_TYPE_OUT 0 #define SAMD21_USB_EP_EPCFG_EP_TYPE_OUT_DISABLED 0 #define SAMD21_USB_EP_EPCFG_EP_TYPE_OUT_CONTROL 1 #define SAMD21_USB_EP_EPCFG_EP_TYPE_OUT_ISOCHRONOUS 2 #define SAMD21_USB_EP_EPCFG_EP_TYPE_OUT_BULK 3 #define SAMD21_USB_EP_EPCFG_EP_TYPE_OUT_INTERRUPT 4 #define SAMD21_USB_EP_EPCFG_EP_TYPE_OUT_DUAL_BANK 5 #define SAMD21_USB_EP_EPCFG_EP_TYPE_IN 4 #define SAMD21_USB_EP_EPCFG_EP_TYPE_IN_DISABLED 0 #define SAMD21_USB_EP_EPCFG_EP_TYPE_IN_CONTROL 1 #define SAMD21_USB_EP_EPCFG_EP_TYPE_IN_ISOCHRONOUS 2 #define SAMD21_USB_EP_EPCFG_EP_TYPE_IN_BULK 3 #define SAMD21_USB_EP_EPCFG_EP_TYPE_IN_INTERRUPT 4 #define SAMD21_USB_EP_EPCFG_EP_TYPE_IN_DUAL_BANK 5 #define SAMD21_USB_EP_EPSTATUS_DTGLOUT 0 #define SAMD21_USB_EP_EPSTATUS_DTGLIN 1 #define SAMD21_USB_EP_EPSTATUS_CURBK 2 #define SAMD21_USB_EP_EPSTATUS_STALLRQ0 4 #define SAMD21_USB_EP_EPSTATUS_STALLRQ1 5 #define SAMD21_USB_EP_EPSTATUS_BK0RDY 6 #define SAMD21_USB_EP_EPSTATUS_BK1RDY 7 #define SAMD21_USB_EP_EPINTFLAG_TRCPT0 0 #define SAMD21_USB_EP_EPINTFLAG_TRCPT1 1 #define SAMD21_USB_EP_EPINTFLAG_TRFAIL0 2 #define SAMD21_USB_EP_EPINTFLAG_TRFAIL1 3 #define SAMD21_USB_EP_EPINTFLAG_RXSTP 4 #define SAMD21_USB_EP_EPINTFLAG_STALL 5 struct samd21_usb_desc_bank { vuint32_t addr; vuint32_t pcksize; vuint16_t extreg; vuint8_t status_bk; vuint8_t reserved_0b; vuint32_t reserved_0c; }; struct samd21_usb_desc { struct samd21_usb_desc_bank bank[2]; }; extern struct samd21_usb_desc samd21_usb_desc[8]; #define SAMD21_USB_DESC_PCKSIZE_BYTE_COUNT 0 #define SAMD21_USB_DESC_PCKSIZE_BYTE_COUNT_MASK 0x3fff #define SAMD21_USB_DESC_PCKSIZE_MULTI_PACKET_SIZE 14 #define SAMD21_USB_DESC_PCKSIZE_MULTI_PACKET_SIZE_MASK 0x3fff #define SAMD21_USB_DESC_PCKSIZE_SIZE 28 #define SAMD21_USB_DESC_PCKSIZE_SIZE_8 0 #define SAMD21_USB_DESC_PCKSIZE_SIZE_16 1 #define SAMD21_USB_DESC_PCKSIZE_SIZE_32 2 #define SAMD21_USB_DESC_PCKSIZE_SIZE_64 3 #define SAMD21_USB_DESC_PCKSIZE_SIZE_128 4 #define SAMD21_USB_DESC_PCKSIZE_SIZE_256 5 #define SAMD21_USB_DESC_PCKSIZE_SIZE_512 6 #define SAMD21_USB_DESC_PCKSIZE_SIZE_1023 7 #define SAMD21_USB_DESC_PCKSIZE_SIZE_MASK 7 #define SAMD21_USB_DESC_PCKSIZE_AUTO_ZLP 31 static inline uint32_t samd21_usb_desc_get_byte_count(uint8_t ep, uint8_t bank) { return ((samd21_usb_desc[ep].bank[bank].pcksize >> SAMD21_USB_DESC_PCKSIZE_BYTE_COUNT) & SAMD21_USB_DESC_PCKSIZE_BYTE_COUNT_MASK); } static inline void samd21_usb_desc_set_byte_count(uint8_t ep, uint8_t bank, uint32_t count) { uint32_t pcksize = samd21_usb_desc[ep].bank[bank].pcksize; pcksize &= ~(SAMD21_USB_DESC_PCKSIZE_BYTE_COUNT_MASK << SAMD21_USB_DESC_PCKSIZE_BYTE_COUNT); pcksize &= ~(SAMD21_USB_DESC_PCKSIZE_MULTI_PACKET_SIZE_MASK << SAMD21_USB_DESC_PCKSIZE_MULTI_PACKET_SIZE); pcksize |= (count << SAMD21_USB_DESC_PCKSIZE_BYTE_COUNT); samd21_usb_desc[ep].bank[bank].pcksize = pcksize; } static inline void samd21_usb_desc_set_size(uint8_t ep, uint8_t bank, uint32_t size) { uint32_t pcksize = samd21_usb_desc[ep].bank[bank].pcksize; pcksize &= ~(SAMD21_USB_DESC_PCKSIZE_SIZE_MASK << SAMD21_USB_DESC_PCKSIZE_SIZE); uint32_t size_bits = 0; switch (size) { case 8: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_8; break; case 16: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_16; break; case 32: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_32; break; case 64: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_64; break; case 128: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_128; break; case 256: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_256; break; case 512: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_512; break; case 1023: size_bits = SAMD21_USB_DESC_PCKSIZE_SIZE_1023; break; } pcksize |= (size_bits << SAMD21_USB_DESC_PCKSIZE_SIZE); samd21_usb_desc[ep].bank[bank].pcksize = pcksize; } static inline void samd21_usb_ep_set_ready(uint8_t ep, uint8_t bank) { samd21_usb.ep[ep].epstatusset = (1 << (SAMD21_USB_EP_EPSTATUS_BK0RDY + bank)); samd21_usb.ep[ep].epintflag = (1 << (SAMD21_USB_EP_EPINTFLAG_TRFAIL0 + bank)); } static inline void samd21_usb_ep_clr_ready(uint8_t ep, uint8_t bank) { samd21_usb.ep[ep].epstatusclr = (1 << (SAMD21_USB_EP_EPSTATUS_BK0RDY + bank)); } static inline uint8_t samd21_usb_ep_ready(uint8_t ep) { return (samd21_usb.ep[ep].epstatus >> SAMD21_USB_EP_EPSTATUS_BK0RDY) & 3; } static inline uint8_t samd21_usb_ep_curbk(uint8_t ep) { return (samd21_usb.ep[ep].epstatus >> SAMD21_USB_EP_EPSTATUS_CURBK) & 1; } /* sercom */ struct samd21_sercom { vuint32_t ctrla; vuint32_t ctrlb; vuint32_t reserved_08; vuint16_t baud; vuint8_t rxpl; vuint8_t reserved_0f; vuint32_t reserved_10; vuint8_t intenclr; vuint8_t reserved_15; vuint8_t intenset; vuint8_t reserved_17; vuint8_t intflag; vuint8_t reserved_19; vuint16_t status; vuint32_t syncbusy; vuint32_t reserved_20; vuint32_t addr; vuint16_t data; vuint16_t reserved_2a; vuint32_t reserved_2c; vuint8_t dbgctrl; vuint8_t reserved_31; vuint16_t reserved_32; vuint16_t fifospace; vuint16_t fifoptr; }; extern struct samd21_sercom samd21_sercom0; extern struct samd21_sercom samd21_sercom1; extern struct samd21_sercom samd21_sercom2; extern struct samd21_sercom samd21_sercom3; extern struct samd21_sercom samd21_sercom4; extern struct samd21_sercom samd21_sercom5; #define samd21_sercom0 (*(struct samd21_sercom *) 0x42000800) #define samd21_sercom1 (*(struct samd21_sercom *) 0x42000c00) #define samd21_sercom2 (*(struct samd21_sercom *) 0x42001000) #define samd21_sercom3 (*(struct samd21_sercom *) 0x42001400) #define samd21_sercom4 (*(struct samd21_sercom *) 0x42001800) #define samd21_sercom5 (*(struct samd21_sercom *) 0x42001c00) #define SAMD21_SERCOM_CTRLA_SWRST 0 #define SAMD21_SERCOM_CTRLA_ENABLE 1 #define SAMD21_SERCOM_CTRLA_MODE 2 # define SAMD21_SERCOM_CTRLA_MODE_USART 1 # define SAMD21_SERCOM_CTRLA_MODE_I2C_MASTER 5 #define SAMD21_SERCOM_CTRLA_RUNSTDBY 7 /* USART mode */ #define SAMD21_SERCOM_CTRLA_IBON 8 #define SAMD21_SERCOM_CTRLA_SAMPR 13 #define SAMD21_SERCOM_CTRLA_TXPO 16 #define SAMD21_SERCOM_CTRLA_RXPO 20 #define SAMD21_SERCOM_CTRLA_SAMPA 22 #define SAMD21_SERCOM_CTRLA_FORM 24 #define SAMD21_SERCOM_CTRLA_CMODE 28 #define SAMD21_SERCOM_CTRLA_CPOL 29 #define SAMD21_SERCOM_CTRLA_DORD 30 /* I2C master mode */ #define SAMD21_SERCOM_CTRLA_PINOUT 16 #define SAMD21_SERCOM_CTRLA_SDAHOLD 20 #define SAMD21_SERCOM_CTRLA_SDAHOLD_DIS 0 #define SAMD21_SERCOM_CTRLA_SDAHOLD_75NS 1 #define SAMD21_SERCOM_CTRLA_SDAHOLD_450NS 2 #define SAMD21_SERCOM_CTRLA_SDAHOLD_600NS 3 #define SAMD21_SERCOM_CTRLA_MEXTTOEN 22 #define SAMD21_SERCOM_CTRLA_SEXTTOEN 23 #define SAMD21_SERCOM_CTRLA_SPEED 24 #define SAMD21_SERCOM_CTRLA_SPEED_STANDARD 0 #define SAMD21_SERCOM_CTRLA_SPEED_FAST 1 #define SAMD21_SERCOM_CTRLA_SPEED_HIGH 2 #define SAMD21_SERCOM_CTRLA_SCLSM 27 #define SAMD21_SERCOM_CTRLA_INACTOUT 28 #define SAMD21_SERCOM_CTRLA_INACTOUT_DIS 0 #define SAMD21_SERCOM_CTRLA_INACTOUT_55US 1 #define SAMD21_SERCOM_CTRLA_INACTOUT_105US 2 #define SAMD21_SERCOM_CTRLA_INACTOUT_205US 3 #define SAMD21_SERCOM_CTRLA_LOWTOUT 30 /* USART mode */ #define SAMD21_SERCOM_CTRLB_CHSIZE 0 #define SAMD21_SERCOM_CTRLB_SBMODE 6 #define SAMD21_SERCOM_CTRLB_COLDEN 8 #define SAMD21_SERCOM_CTRLB_SFDE 9 #define SAMD21_SERCOM_CTRLB_ENC 10 #define SAMD21_SERCOM_CTRLB_PMODE 13 #define SAMD21_SERCOM_CTRLB_TXEN 16 #define SAMD21_SERCOM_CTRLB_RXEN 17 #define SAMD21_SERCOM_CTRLB_FIFOCLR 22 /* I2C mode */ #define SAMD21_SERCOM_CTRLB_SMEN 8 #define SAMD21_SERCOM_CTRLB_QCEN 9 #define SAMD21_SERCOM_CTRLB_CMD 16 #define SAMD21_SERCOM_CTRLB_CMD_NOP 0 #define SAMD21_SERCOM_CTRLB_CMD_START 1 #define SAMD21_SERCOM_CTRLB_CMD_READ 2 #define SAMD21_SERCOM_CTRLB_CMD_STOP 3 #define SAMD21_SERCOM_CTRLB_ACKACT 18 #define SAMD21_SERCOM_CTRLB_ACKACT_ACK 0 #define SAMD21_SERCOM_CTRLB_ACKACT_NACK 1 #define SAMD21_SERCOM_CTRLB_FIFOCLR 22 /* USART mode */ #define SAMD21_SERCOM_INTFLAG_DRE 0 #define SAMD21_SERCOM_INTFLAG_TXC 1 #define SAMD21_SERCOM_INTFLAG_RXC 2 #define SAMD21_SERCOM_INTFLAG_RXS 3 #define SAMD21_SERCOM_INTFLAG_CTSIC 4 #define SAMD21_SERCOM_INTFLAG_RXBRK 5 #define SAMD21_SERCOM_INTFLAG_ERROR 7 /* I2C mode */ #define SAMD21_SERCOM_INTFLAG_ERROR 7 #define SAMD21_SERCOM_INTFLAG_RXFF 4 #define SAMD21_SERCOM_INTFLAG_TXFE 3 #define SAMD21_SERCOM_INTFLAG_SB 1 #define SAMD21_SERCOM_INTFLAG_MB 0 #define SAMD21_SERCOM_INTENCLR_DRE 0 #define SAMD21_SERCOM_INTENCLR_TXC 1 #define SAMD21_SERCOM_INTENCLR_RXC 2 #define SAMD21_SERCOM_INTENCLR_RXS 3 #define SAMD21_SERCOM_INTENCLR_CTSIC 4 #define SAMD21_SERCOM_INTENCLR_RXBRK 5 #define SAMD21_SERCOM_INTENCLR_ERROR 7 #define SAMD21_SERCOM_STATUS_PERR 0 #define SAMD21_SERCOM_STATUS_FERR 1 #define SAMD21_SERCOM_STATUS_BUFOVF 2 #define SAMD21_SERCOM_STATUS_CTS 3 #define SAMD21_SERCOM_STATUS_ISF 4 #define SAMD21_SERCOM_STATUS_COLL 5 #define SAMD21_SERCOM_STATUS_TXE 6 #define SAMD21_SERCOM_SYNCBUSY_SWRST 0 #define SAMD21_SERCOM_SYNCBUSY_ENABLE 1 #define SAMD21_SERCOM_SYNCBUSY_CTRLB 2 #define SAMD21_SERCOM_SYNCBUSY_SYSOP 2 #define SAMD21_SERCOM_ADDR_ADDR 0 #define SAMD21_SERCOM_ADDR_LENEN 13 #define SAMD21_SERCOM_ADDR_HS 14 #define SAMD21_SERCOM_ADDR_TENBITEN 15 #define SAMD21_SERCOM_ADDR_LEN 16 #define SAMD21_SERCOM_DBGCTRL_DBGSTOP 0 #define SAMD21_SERCOM_FIFOSPACE_TXSPACE 0 #define SAMD21_SERCOM_FIFOSPACE_TXSPACE_MASK 0x1f #define SAMD21_SERCOM_FIFOSPACE_RXSPACE 8 #define SAMD21_SERCOM_FIFOSPACE_RXSPACE_MASK 0x1f #define SAMD21_SERCOM_FIFOPTR_CPUWRPTR 0 #define SAMD21_SERCOM_FIFOPTR_CPUWRPTR_MASK 0xf #define SAMD21_SERCOM_FIFOPTR_CPURDPTR 8 #define SAMD21_SERCOM_FIFOPTR_CPURDPTR_MASK 0xf /* The SYSTICK starts at 0xe000e010 */ struct samd21_systick { vuint32_t csr; vuint32_t rvr; vuint32_t cvr; vuint32_t calib; }; extern struct samd21_systick samd21_systick; #define samd21_systick (*(struct samd21_systick *) 0xe000e010) #define SAMD21_SYSTICK_CSR_ENABLE 0 #define SAMD21_SYSTICK_CSR_TICKINT 1 #define SAMD21_SYSTICK_CSR_CLKSOURCE 2 #define SAMD21_SYSTICK_CSR_CLKSOURCE_EXTERNAL 0 #define SAMD21_SYSTICK_CSR_CLKSOURCE_HCLK_8 1 #define SAMD21_SYSTICK_CSR_COUNTFLAG 16 #define SAMD21_SYSTICK_PRI 15 /* The NVIC starts at 0xe000e100, so add that to the offsets to find the absolute address */ struct samd21_nvic { vuint32_t iser; /* 0x000 0xe000e100 Set Enable Register */ uint8_t _unused020[0x080 - 0x004]; vuint32_t icer; /* 0x080 0xe000e180 Clear Enable Register */ uint8_t _unused0a0[0x100 - 0x084]; vuint32_t ispr; /* 0x100 0xe000e200 Set Pending Register */ uint8_t _unused120[0x180 - 0x104]; vuint32_t icpr; /* 0x180 0xe000e280 Clear Pending Register */ uint8_t _unused1a0[0x300 - 0x184]; vuint32_t ipr[8]; /* 0x300 0xe000e400 Priority Register */ }; extern struct samd21_nvic samd21_nvic; #define samd21_nvic (*(struct samd21_nvic *) 0xe000e100) #define SAMD21_NVIC_ISR_PM_POS 0 #define SAMD21_NVIC_ISR_SYSCTRL_POS 1 #define SAMD21_NVIC_ISR_WDT_POS 2 #define SAMD21_NVIC_ISR_RTC_POS 3 #define SAMD21_NVIC_ISR_EIC_POS 4 #define SAMD21_NVIC_ISR_NVMCTRL_POS 5 #define SAMD21_NVIC_ISR_DMAC_POS 6 #define SAMD21_NVIC_ISR_USB_POS 7 #define SAMD21_NVIC_ISR_EVSYS_POS 8 #define SAMD21_NVIC_ISR_SERCOM0_POS 9 #define SAMD21_NVIC_ISR_SERCOM1_POS 10 #define SAMD21_NVIC_ISR_SERCOM2_POS 11 #define SAMD21_NVIC_ISR_SERCOM3_POS 12 #define SAMD21_NVIC_ISR_SERCOM4_POS 13 #define SAMD21_NVIC_ISR_SERCOM5_POS 14 #define SAMD21_NVIC_ISR_TCC0_POS 15 #define SAMD21_NVIC_ISR_TCC1_POS 16 #define SAMD21_NVIC_ISR_TCC2_POS 17 #define SAMD21_NVIC_ISR_TC3_POS 18 #define SAMD21_NVIC_ISR_TC4_POS 19 #define SAMD21_NVIC_ISR_TC5_POS 20 #define SAMD21_NVIC_ISR_TC6_POS 21 #define SAMD21_NVIC_ISR_TC7_POS 22 #define SAMD21_NVIC_ISR_ADC_POS 23 #define SAMD21_NVIC_ISR_AC_POS 24 #define SAMD21_NVIC_ISR_DAC_POS 25 #define SAMD21_NVIC_ISR_PTC_POS 26 #define SAMD21_NVIC_ISR_I2S_POS 27 #define SAMD21_NVIC_ISR_AC1_POS 28 #define SAMD21_NVIC_ISR_TCC3_POS 29 #define IRQ_MASK(irq) (1 << (irq)) #define IRQ_BOOL(v,irq) (((v) >> (irq)) & 1) static inline void samd21_nvic_set_enable(int irq) { samd21_nvic.iser = IRQ_MASK(irq); } static inline void samd21_nvic_clear_enable(int irq) { samd21_nvic.icer = IRQ_MASK(irq); } static inline int samd21_nvic_enabled(int irq) { return IRQ_BOOL(samd21_nvic.iser, irq); } static inline void samd21_nvic_set_pending(int irq) { samd21_nvic.ispr = IRQ_MASK(irq); } static inline void samd21_nvic_clear_pending(int irq) { samd21_nvic.icpr = IRQ_MASK(irq); } static inline int samd21_nvic_pending(int irq) { return IRQ_BOOL(samd21_nvic.ispr, irq); } #define IRQ_PRIO_REG(irq) ((irq) >> 2) #define IRQ_PRIO_BIT(irq) (((irq) & 3) << 3) #define IRQ_PRIO_MASK(irq) (0xff << IRQ_PRIO_BIT(irq)) static inline void samd21_nvic_set_priority(int irq, uint8_t prio) { int n = IRQ_PRIO_REG(irq); uint32_t v; v = samd21_nvic.ipr[n]; v &= ~IRQ_PRIO_MASK(irq); v |= (prio) << IRQ_PRIO_BIT(irq); samd21_nvic.ipr[n] = v; } static inline uint8_t samd21_nvic_get_priority(int irq) { return (samd21_nvic.ipr[IRQ_PRIO_REG(irq)] >> IRQ_PRIO_BIT(irq)) & IRQ_PRIO_MASK(0); } /* Cortex M0+ SCB */ struct samd21_scb { vuint32_t cpuid; vuint32_t icsr; vuint32_t vtor; vuint32_t aircr; vuint32_t scr; vuint32_t ccr; vuint32_t shpr1; vuint32_t shpr2; vuint32_t shpr3; vuint32_t shcrs; vuint32_t cfsr; vuint32_t hfsr; uint32_t unused_30; vuint32_t mmfar; vuint32_t bfar; }; extern struct samd21_scb samd21_scb; #define samd21_scb (*(struct samd21_scb *) 0xe000ed00) #define SAMD21_SCB_AIRCR_VECTKEY 16 #define SAMD21_SCB_AIRCR_VECTKEY_KEY 0x05fa #define SAMD21_SCB_AIRCR_PRIGROUP 8 #define SAMD21_SCB_AIRCR_SYSRESETREQ 2 #define SAMD21_SCB_AIRCR_VECTCLRACTIVE 1 #define SAMD21_SCB_AIRCR_VECTRESET 0 /* The NVM Calibration and auxiliary space starts at 0x00800000 */ struct samd21_aux0 { vuint64_t userrow; }; extern struct samd21_aux0 samd21_aux0; #define samd21_aux0 (*(struct samd21_aux0 *) 0x00804000) #define SAMD21_AUX0_USERROW_BOOTPROT 0 #define SAMD21_AUX0_USERROW_EEPROM 4 #define SAMD21_AUX0_USERROW_BOD33_LEVEL 8 #define SAMD21_AUX0_USERROW_BOD33_ENABLE 14 #define SAMD21_AUX0_USERROW_BOD33_ACTION 15 #define SAMD21_AUX0_USERROW_WDT_ENABLE 25 #define SAMD21_AUX0_USERROW_WDT_ALWAYS_ON 26 #define SAMD21_AUX0_USERROW_WDT_PERIOD 27 #define SAMD21_AUX0_USERROW_WDT_WINDOW 31 #define SAMD21_AUX0_USERROW_WDT_EWOFFSET 35 #define SAMD21_AUX0_USERROW_WDT_WEN 39 #define SAMD21_AUX0_USERROW_BOD33_HYST 40 #define SAMD21_AUX0_USERROW_LOCK 48 struct samd21_aux1 { vuint64_t reserved_00; vuint64_t device_config; vuint64_t reserved_10; vuint64_t reserved_18; vuint64_t calibration; vuint64_t reserved_28; }; extern struct samd21_aux1 samd21_aux1; #define samd21_aux1 (*(struct samd21_aux1 *) 0x00806000) #define SAMD21_AUX1_CALIBRATION_ADC_LINEARITY 27 #define SAMD21_AUX1_CALIBRATION_ADC_LINEARITY_MASK 0xff #define SAMD21_AUX1_CALIBRATION_ADC_BIASCAL 35 #define SAMD21_AUX1_CALIBRATION_ADC_BIASCAL_MASK 0x7 #define SAMD21_AUX1_CALIBRATION_OSC32K_CAL 38 #define SAMD21_AUX1_CALIBRATION_USB_TRANSN 45 #define SAMD21_AUX1_CALIBRATION_USB_TRANSN_MASK 0x1f #define SAMD21_AUX1_CALIBRATION_USB_TRANSP 50 #define SAMD21_AUX1_CALIBRATION_USB_TRANSP_MASK 0x1f #define SAMD21_AUX1_CALIBRATION_USB_TRIM 55 #define SAMD21_AUX1_CALIBRATION_USB_TRIM_MASK 0x07 #define SAMD21_AUX1_CALIBRATION_DFLL48M_COARSE_CAL 58 #define SAMD21_AUX1_CALIBRATION_DFLL48M_COARSE_CAL_MASK 0x3f struct samd21_serial { vuint32_t reserved_00; vuint32_t reserved_04; vuint32_t reserved_08; vuint32_t word0; vuint32_t reserved_10; vuint32_t reserved_14; vuint32_t reserved_18; vuint32_t reserved_1c; vuint32_t reserved_20; vuint32_t reserved_24; vuint32_t reserved_28; vuint32_t reserved_2c; vuint32_t reserved_30; vuint32_t reserved_34; vuint32_t reserved_38; vuint32_t reserved_3c; vuint32_t word1; vuint32_t word2; vuint32_t word3; vuint32_t reserved_4c; }; extern struct samd21_serial samd21_serial; #define samd21_serial (*(struct samd21_serial *) 0x0080a000) static inline void samd21_gclk_wait_sync(void) { while (samd21_gclk.status & (1 << SAMD21_GCLK_STATUS_SYNCBUSY)) ; } static inline void samd21_dfll_wait_sync(void) { while ((samd21_sysctrl.pclksr & (1 << SAMD21_SYSCTRL_PCLKSR_DFLLRDY)) == 0) ; } static inline void samd21_gclk_gendiv(uint32_t id, uint32_t div) { if (div == 1) div = 0; samd21_gclk.gendiv = ((id << SAMD21_GCLK_GENDIV_ID) | (div << SAMD21_GCLK_GENDIV_DIV)); samd21_gclk_wait_sync(); } static inline void samd21_gclk_genctrl(uint32_t src, uint32_t id) { samd21_gclk.genctrl = ((id << SAMD21_GCLK_GENCTRL_ID) | (src << SAMD21_GCLK_GENCTRL_SRC) | (0 << SAMD21_GCLK_GENCTRL_OE) | (1 << SAMD21_GCLK_GENCTRL_GENEN)); samd21_gclk_wait_sync(); } static inline void samd21_gclk_clkctrl(uint32_t gen, uint32_t id) { samd21_gclk.clkctrl = ((gen << SAMD21_GCLK_CLKCTRL_GEN) | (id << SAMD21_GCLK_CLKCTRL_ID) | (1 << SAMD21_GCLK_CLKCTRL_CLKEN)); samd21_gclk_wait_sync(); } #define isr_decl(name) \ void samd21_ ## name ## _isr(void) isr_decl(halt); isr_decl(ignore); isr_decl(nmi); isr_decl(hardfault); isr_decl(memmanage); isr_decl(busfault); isr_decl(usagefault); isr_decl(svc); isr_decl(debugmon); isr_decl(pendsv); isr_decl(systick); isr_decl(pm); /* IRQ0 */ isr_decl(sysctrl); isr_decl(wdt); isr_decl(rtc); isr_decl(eic); isr_decl(nvmctrl); isr_decl(dmac); isr_decl(usb); isr_decl(evsys); isr_decl(sercom0); isr_decl(sercom1); isr_decl(sercom2); isr_decl(sercom3); isr_decl(sercom4); isr_decl(sercom5); isr_decl(tcc0); isr_decl(tcc1); isr_decl(tcc2); isr_decl(tc3); isr_decl(tc4); isr_decl(tc5); isr_decl(tc6); isr_decl(tc7); isr_decl(adc); isr_decl(ac); isr_decl(dac); isr_decl(ptc); isr_decl(i2s); isr_decl(ac1); isr_decl(tcc3); #undef isr_decl #endif /* _SAMD21_H_ */ snek-1.1/chips/samd21/snek-altos.builtin000066400000000000000000000012411353657467200202000ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # time.sleep, 1 time.monotonic, 0 pulldown, 1 reset, 0 random.seed, 1 random.randrange, 1 neopixel, 1 #include snek-1.1/chips/samd21/snek-altos.c000066400000000000000000000027041353657467200167610ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include #include #include static uint32_t snek_millis(void) { return ao_time_ns() / 1000000; } snek_poly_t snek_builtin_time_sleep(snek_poly_t a) { uint32_t expire = snek_millis() + (snek_poly_get_float(a) * 1000.0f + 0.5f); while (!snek_abort && (int32_t) (expire - snek_millis()) > 0) ; return SNEK_NULL; } snek_poly_t snek_builtin_time_monotonic(void) { return snek_float_to_poly(snek_millis() / 1000.0f); } static uint64_t random_x, random_w; #define random_s 0xb5ad4eceda1ce2a9ULL snek_poly_t snek_builtin_random_seed(snek_poly_t a) { random_x = a.u; random_x |= random_x << 32; random_w = 0; return SNEK_NULL; } snek_poly_t snek_builtin_random_randrange(snek_poly_t a) { random_x *= random_x; random_w += random_s; random_x += random_w; random_x = (random_x >> 32) | (random_x << 32); return snek_float_to_poly(random_x % snek_poly_get_soffset(a)); } snek-1.1/chips/samd21/snek-eeprom.c000066400000000000000000000033421353657467200171250ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include #include #include #include snek_poly_t snek_builtin_eeprom_write(void) { uint8_t c; ao_flash_write_init(); for (;;) { c = SNEK_IO_GETC(stdin); if (c == '\r') c = '\n'; if (c == ('d' & 0x1f)) c = 0xff; ao_flash_write_byte(c); if (c == 0xff) break; } ao_flash_write_flush(); return SNEK_NULL; } snek_poly_t snek_builtin_eeprom_show(uint8_t nposition, uint8_t nnamed, snek_poly_t *args) { uint8_t c; (void) nnamed; (void) args; if (nposition) putc('b' & 0x1f, stdout); ao_flash_read_init(); for (;;) { c = ao_flash_read_byte(); if (c == 0xff) break; putc(c, stdout); } if (nposition) putc('c' & 0x1f, stdout); return SNEK_NULL; } static int (*save_getc)(FILE *file); snek_poly_t snek_builtin_eeprom_erase(void) { ao_flash_erase_all(); return SNEK_NULL; } void snek_eeprom_load(void) { snek_interactive = false; ao_flash_read_init(); save_getc = __iob[0]->get; __iob[0]->get = snek_eeprom_getchar; } int snek_eeprom_getchar(FILE *stream) { (void) stream; uint8_t c = ao_flash_read_byte(); if (c != 0xff) return c; snek_interactive = true; __iob[0]->get = save_getc; return EOF; } snek-1.1/chips/samd21/snek-gpio.c000066400000000000000000000414501353657467200165760ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include #include #include static uint8_t power_pin; static uint8_t dir_pin; static uint16_t power[AO_SNEK_NUM_PIN]; static uint8_t pull[AO_SNEK_NUM_PIN]; #ifdef AO_SNEK_PWM_RAMP_STEP static int32_t current_power[AO_SNEK_NUM_PIN]; static uint8_t pwm_ramping; #endif static uint32_t on_pins; struct ao_snek_pin { void *gpio; void *timer; uint8_t pin; uint8_t channel; uint8_t adc; uint8_t flags; }; #ifndef AO_SNEK_FLAGS_0 #define AO_SNEK_FLAGS_0 0 #endif #ifndef AO_SNEK_FLAGS_1 #define AO_SNEK_FLAGS_1 0 #endif #ifndef AO_SNEK_FLAGS_2 #define AO_SNEK_FLAGS_2 0 #endif #ifndef AO_SNEK_FLAGS_3 #define AO_SNEK_FLAGS_3 0 #endif #ifndef AO_SNEK_FLAGS_4 #define AO_SNEK_FLAGS_4 0 #endif #ifndef AO_SNEK_FLAGS_5 #define AO_SNEK_FLAGS_5 0 #endif #ifndef AO_SNEK_FLAGS_6 #define AO_SNEK_FLAGS_6 0 #endif #ifndef AO_SNEK_FLAGS_7 #define AO_SNEK_FLAGS_7 0 #endif #ifndef AO_SNEK_FLAGS_8 #define AO_SNEK_FLAGS_8 0 #endif #ifndef AO_SNEK_FLAGS_9 #define AO_SNEK_FLAGS_9 0 #endif #ifndef AO_SNEK_FLAGS_10 #define AO_SNEK_FLAGS_10 0 #endif #ifndef AO_SNEK_FLAGS_11 #define AO_SNEK_FLAGS_11 0 #endif #ifndef AO_SNEK_FLAGS_12 #define AO_SNEK_FLAGS_12 0 #endif #ifndef AO_SNEK_FLAGS_13 #define AO_SNEK_FLAGS_13 0 #endif #ifndef AO_SNEK_FLAGS_14 #define AO_SNEK_FLAGS_14 0 #endif #ifndef AO_SNEK_FLAGS_15 #define AO_SNEK_FLAGS_15 0 #endif #ifndef AO_SNEK_FLAGS_16 #define AO_SNEK_FLAGS_16 0 #endif #ifndef AO_SNEK_FLAGS_17 #define AO_SNEK_FLAGS_17 0 #endif #ifndef AO_SNEK_FLAGS_18 #define AO_SNEK_FLAGS_18 0 #endif #ifndef AO_SNEK_FLAGS_19 #define AO_SNEK_FLAGS_19 0 #endif #ifndef AO_SNEK_FLAGS_20 #define AO_SNEK_FLAGS_20 0 #endif #ifndef AO_SNEK_FLAGS_21 #define AO_SNEK_FLAGS_21 0 #endif #ifndef AO_SNEK_FLAGS_22 #define AO_SNEK_FLAGS_22 0 #endif #ifndef AO_SNEK_FLAGS_23 #define AO_SNEK_FLAGS_23 0 #endif #ifndef AO_SNEK_FLAGS_24 #define AO_SNEK_FLAGS_24 0 #endif #ifndef AO_SNEK_FLAGS_25 #define AO_SNEK_FLAGS_25 0 #endif #ifndef AO_SNEK_FLAGS_26 #define AO_SNEK_FLAGS_26 0 #endif #ifndef AO_SNEK_FLAGS_27 #define AO_SNEK_FLAGS_27 0 #endif #ifndef AO_SNEK_FLAGS_28 #define AO_SNEK_FLAGS_28 0 #endif #ifndef AO_SNEK_FLAGS_29 #define AO_SNEK_FLAGS_29 0 #endif #ifndef AO_SNEK_FLAGS_30 #define AO_SNEK_FLAGS_30 0 #endif static const struct ao_snek_pin ao_snek_pin[AO_SNEK_NUM_PIN] = { { .gpio = AO_SNEK_GPIO_0, .pin = AO_SNEK_PIN_0, .timer = AO_SNEK_TIMER_0, .channel = AO_SNEK_CHANNEL_0, .adc = AO_SNEK_ADC_0, .flags = AO_SNEK_FLAGS_0 }, { .gpio = AO_SNEK_GPIO_1, .pin = AO_SNEK_PIN_1, .timer = AO_SNEK_TIMER_1, .channel = AO_SNEK_CHANNEL_1, .adc = AO_SNEK_ADC_1, .flags = AO_SNEK_FLAGS_1 }, { .gpio = AO_SNEK_GPIO_2, .pin = AO_SNEK_PIN_2, .timer = AO_SNEK_TIMER_2, .channel = AO_SNEK_CHANNEL_2, .adc = AO_SNEK_ADC_2, .flags = AO_SNEK_FLAGS_2 }, { .gpio = AO_SNEK_GPIO_3, .pin = AO_SNEK_PIN_3, .timer = AO_SNEK_TIMER_3, .channel = AO_SNEK_CHANNEL_3, .adc = AO_SNEK_ADC_3, .flags = AO_SNEK_FLAGS_3 }, { .gpio = AO_SNEK_GPIO_4, .pin = AO_SNEK_PIN_4, .timer = AO_SNEK_TIMER_4, .channel = AO_SNEK_CHANNEL_4, .adc = AO_SNEK_ADC_4, .flags = AO_SNEK_FLAGS_4 }, { .gpio = AO_SNEK_GPIO_5, .pin = AO_SNEK_PIN_5, .timer = AO_SNEK_TIMER_5, .channel = AO_SNEK_CHANNEL_5, .adc = AO_SNEK_ADC_5, .flags = AO_SNEK_FLAGS_5 }, { .gpio = AO_SNEK_GPIO_6, .pin = AO_SNEK_PIN_6, .timer = AO_SNEK_TIMER_6, .channel = AO_SNEK_CHANNEL_6, .adc = AO_SNEK_ADC_6, .flags = AO_SNEK_FLAGS_6 }, { .gpio = AO_SNEK_GPIO_7, .pin = AO_SNEK_PIN_7, .timer = AO_SNEK_TIMER_7, .channel = AO_SNEK_CHANNEL_7, .adc = AO_SNEK_ADC_7, .flags = AO_SNEK_FLAGS_7 }, { .gpio = AO_SNEK_GPIO_8, .pin = AO_SNEK_PIN_8, .timer = AO_SNEK_TIMER_8, .channel = AO_SNEK_CHANNEL_8, .adc = AO_SNEK_ADC_8, .flags = AO_SNEK_FLAGS_8 }, { .gpio = AO_SNEK_GPIO_9, .pin = AO_SNEK_PIN_9, .timer = AO_SNEK_TIMER_9, .channel = AO_SNEK_CHANNEL_9, .adc = AO_SNEK_ADC_9, .flags = AO_SNEK_FLAGS_9 }, { .gpio = AO_SNEK_GPIO_10, .pin = AO_SNEK_PIN_10, .timer = AO_SNEK_TIMER_10, .channel = AO_SNEK_CHANNEL_10, .adc = AO_SNEK_ADC_10, .flags = AO_SNEK_FLAGS_10 }, { .gpio = AO_SNEK_GPIO_11, .pin = AO_SNEK_PIN_11, .timer = AO_SNEK_TIMER_11, .channel = AO_SNEK_CHANNEL_11, .adc = AO_SNEK_ADC_11, .flags = AO_SNEK_FLAGS_11 }, { .gpio = AO_SNEK_GPIO_12, .pin = AO_SNEK_PIN_12, .timer = AO_SNEK_TIMER_12, .channel = AO_SNEK_CHANNEL_12, .adc = AO_SNEK_ADC_12, .flags = AO_SNEK_FLAGS_12 }, { .gpio = AO_SNEK_GPIO_13, .pin = AO_SNEK_PIN_13, .timer = AO_SNEK_TIMER_13, .channel = AO_SNEK_CHANNEL_13, .adc = AO_SNEK_ADC_13, .flags = AO_SNEK_FLAGS_13 }, { .gpio = AO_SNEK_GPIO_14, .pin = AO_SNEK_PIN_14, .timer = AO_SNEK_TIMER_14, .channel = AO_SNEK_CHANNEL_14, .adc = AO_SNEK_ADC_14, .flags = AO_SNEK_FLAGS_14 }, { .gpio = AO_SNEK_GPIO_15, .pin = AO_SNEK_PIN_15, .timer = AO_SNEK_TIMER_15, .channel = AO_SNEK_CHANNEL_15, .adc = AO_SNEK_ADC_15, .flags = AO_SNEK_FLAGS_15 }, { .gpio = AO_SNEK_GPIO_16, .pin = AO_SNEK_PIN_16, .timer = AO_SNEK_TIMER_16, .channel = AO_SNEK_CHANNEL_16, .adc = AO_SNEK_ADC_16, .flags = AO_SNEK_FLAGS_16 }, #if AO_SNEK_NUM_PIN > 17 { .gpio = AO_SNEK_GPIO_17, .pin = AO_SNEK_PIN_17, .timer = AO_SNEK_TIMER_17, .channel = AO_SNEK_CHANNEL_17, .adc = AO_SNEK_ADC_17, .flags = AO_SNEK_FLAGS_17 }, #endif #if AO_SNEK_NUM_PIN > 18 { .gpio = AO_SNEK_GPIO_18, .pin = AO_SNEK_PIN_18, .timer = AO_SNEK_TIMER_18, .channel = AO_SNEK_CHANNEL_18, .adc = AO_SNEK_ADC_18, .flags = AO_SNEK_FLAGS_18 }, #endif #if AO_SNEK_NUM_PIN > 19 { .gpio = AO_SNEK_GPIO_19, .pin = AO_SNEK_PIN_19, .timer = AO_SNEK_TIMER_19, .channel = AO_SNEK_CHANNEL_19, .adc = AO_SNEK_ADC_19, .flags = AO_SNEK_FLAGS_19 }, #endif #if AO_SNEK_NUM_PIN > 20 { .gpio = AO_SNEK_GPIO_20, .pin = AO_SNEK_PIN_20, .timer = AO_SNEK_TIMER_20, .channel = AO_SNEK_CHANNEL_20, .adc = AO_SNEK_ADC_20, .flags = AO_SNEK_FLAGS_20 }, #endif #if AO_SNEK_NUM_PIN > 21 { .gpio = AO_SNEK_GPIO_21, .pin = AO_SNEK_PIN_21, .timer = AO_SNEK_TIMER_21, .channel = AO_SNEK_CHANNEL_21, .adc = AO_SNEK_ADC_21, .flags = AO_SNEK_FLAGS_21 }, #endif #if AO_SNEK_NUM_PIN > 22 { .gpio = AO_SNEK_GPIO_22, .pin = AO_SNEK_PIN_22, .timer = AO_SNEK_TIMER_22, .channel = AO_SNEK_CHANNEL_22, .adc = AO_SNEK_ADC_22, .flags = AO_SNEK_FLAGS_22 }, #endif #if AO_SNEK_NUM_PIN > 23 { .gpio = AO_SNEK_GPIO_23, .pin = AO_SNEK_PIN_23, .timer = AO_SNEK_TIMER_23, .channel = AO_SNEK_CHANNEL_23, .adc = AO_SNEK_ADC_23, .flags = AO_SNEK_FLAGS_23 }, #endif #if AO_SNEK_NUM_PIN > 24 { .gpio = AO_SNEK_GPIO_24, .pin = AO_SNEK_PIN_24, .timer = AO_SNEK_TIMER_24, .channel = AO_SNEK_CHANNEL_24, .adc = AO_SNEK_ADC_24, .flags = AO_SNEK_FLAGS_24 }, #endif #if AO_SNEK_NUM_PIN > 25 { .gpio = AO_SNEK_GPIO_25, .pin = AO_SNEK_PIN_25, .timer = AO_SNEK_TIMER_25, .channel = AO_SNEK_CHANNEL_25, .adc = AO_SNEK_ADC_25, .flags = AO_SNEK_FLAGS_25 }, #endif #if AO_SNEK_NUM_PIN > 26 { .gpio = AO_SNEK_GPIO_26, .pin = AO_SNEK_PIN_26, .timer = AO_SNEK_TIMER_26, .channel = AO_SNEK_CHANNEL_26, .adc = AO_SNEK_ADC_26, .flags = AO_SNEK_FLAGS_26 }, #endif #if AO_SNEK_NUM_PIN > 27 { .gpio = AO_SNEK_GPIO_27, .pin = AO_SNEK_PIN_27, .timer = AO_SNEK_TIMER_27, .channel = AO_SNEK_CHANNEL_27, .adc = AO_SNEK_ADC_27, .flags = AO_SNEK_FLAGS_27 }, #endif #if AO_SNEK_NUM_PIN > 28 { .gpio = AO_SNEK_GPIO_28, .pin = AO_SNEK_PIN_28, .timer = AO_SNEK_TIMER_28, .channel = AO_SNEK_CHANNEL_28, .adc = AO_SNEK_ADC_28, .flags = AO_SNEK_FLAGS_28 }, #endif #if AO_SNEK_NUM_PIN > 29 { .gpio = AO_SNEK_GPIO_29, .pin = AO_SNEK_PIN_29, .timer = AO_SNEK_TIMER_29, .channel = AO_SNEK_CHANNEL_29, .adc = AO_SNEK_ADC_29, .flags = AO_SNEK_FLAGS_29 }, #endif #if AO_SNEK_NUM_PIN > 30 { .gpio = AO_SNEK_GPIO_30, .pin = AO_SNEK_PIN_30, .timer = AO_SNEK_TIMER_30, .channel = AO_SNEK_CHANNEL_30, .adc = AO_SNEK_ADC_30, .flags = AO_SNEK_FLAGS_30 }, #endif #if AO_SNEK_NUM_PIN > 31 #error too many pins #endif }; void ao_snek_port_init(void) { uint8_t p; for (p = 0; p < AO_SNEK_NUM_PIN; p++) { ao_snek_clr_pwm(ao_snek_pin[p].gpio, ao_snek_pin[p].pin); ao_enable_input(ao_snek_pin[p].gpio, ao_snek_pin[p].pin, AO_MODE_PULL_NONE); pull[p] = AO_MODE_PULL_NONE; if (ao_snek_pin[p].flags & SNEK_PIN_PULL_DOWN) pull[p] = AO_MODE_PULL_DOWN; else if (ao_snek_pin[p].flags & SNEK_PIN_PULL_UP) pull[p] = AO_MODE_PULL_UP; } memset(power, 0xff, sizeof(power)); } static void ao_snek_port_set_pwm(uint8_t p, uint16_t pwm) { ao_snek_set_pwm(ao_snek_pin[p].gpio, ao_snek_pin[p].pin, ao_snek_pin[p].timer, ao_snek_pin[p].channel, pwm); } static void ao_snek_port_clr_pwm(uint8_t p) { ao_snek_clr_pwm(ao_snek_pin[p].gpio, ao_snek_pin[p].pin); } static void ao_snek_port_set(uint8_t p, uint16_t value) { ao_gpio_set(ao_snek_pin[p].gpio, ao_snek_pin[p].pin, !!value); } static uint8_t ao_snek_port_get(uint8_t p) { return ao_gpio_get(ao_snek_pin[p].gpio, ao_snek_pin[p].pin); } static uint16_t ao_snek_port_get_analog(uint8_t p) { return ao_snek_get_adc(ao_snek_pin[p].adc); } static bool has_pwm(uint8_t p) { return ao_snek_pin[p].timer != NULL; } #ifdef AO_SNEK_PWM_RAMP_STEP static bool has_ramp_pwm(uint8_t p) { return (ao_snek_pin[p].flags & SNEK_PIN_RAMP_PWM) != 0; } static bool has_ramp_dir(uint8_t p) { return p > 0 && (ao_snek_pin[p-1].flags & SNEK_PIN_RAMP_PWM) != 0; } #endif static bool has_adc(uint8_t p) { return ao_snek_pin[p].adc != 0xff; } static bool is_on(uint8_t pin) { return (on_pins >> pin) & 1; } static void set_on(uint8_t pin) { on_pins |= ((uint32_t) 1) << pin; } static void set_off(uint8_t pin) { on_pins &= ~(((uint32_t) 1) << pin); } static snek_poly_t _set_out(uint8_t pin, uint16_t p) { #ifdef AO_SNEK_PWM_RAMP_STEP if (has_ramp_dir(pin) || has_ramp_pwm(pin)) { pwm_ramping = 1; return SNEK_NULL; } #endif if (has_pwm(pin)) { if ((0 < p && p < SNEK_PWM_MAX)) { ao_snek_port_set_pwm(pin, p); return SNEK_NULL; } ao_snek_port_clr_pwm(pin); } ao_snek_port_set(pin, p); return SNEK_NULL; } #ifdef SNEK_DRV8833 static snek_poly_t set_out(uint8_t pin) { uint16_t p = 0; if (IS_DRV8833_DIR(pin) || IS_DRV8833_PWM(pin)) { uint8_t dir, pwm; if (IS_DRV8833_DIR(pin)) { dir = pin; pwm = DRV8833_FIND_PWM(pin); } else { pwm = pin; dir = DRV8833_FIND_DIR(pin); } if (is_on(pwm)) p = power[pwm]; if (is_on(dir)) { _set_out(pwm, 0); return _set_out(dir, p); } else { _set_out(dir, 0); return _set_out(pwm, p); } } else { if (is_on(pin)) p = power[pin]; return _set_out(pin, p); } } #else static snek_poly_t set_out(uint8_t pin) { uint16_t p = 0; if (is_on(pin)) p = power[pin]; return _set_out(pin, p); } #endif #ifdef AO_SNEK_PWM_RAMP_STEP static int32_t ao_snek_pwm_power(uint8_t p) { if (!is_on(p)) return 0; if (is_on(p+1)) return (int32_t) power[p]; else return - (int32_t) power[p]; } void ao_snek_step_pwm(void) { uint8_t p; if (!pwm_ramping) return; pwm_ramping = 0; for (p = 0; p < AO_SNEK_NUM_PIN; p++) { if (ao_snek_pin[p].flags & SNEK_PIN_RAMP_PWM) { int32_t pow = ao_snek_pwm_power(p); if (current_power[p] != pow) { /* Compute next power value */ int32_t change = pow - current_power[p]; if (change < -AO_SNEK_PWM_RAMP_STEP) change = -AO_SNEK_PWM_RAMP_STEP; else if (change > AO_SNEK_PWM_RAMP_STEP) change = AO_SNEK_PWM_RAMP_STEP; current_power[p] += change; /* Convert power value into dir/pwm */ bool dval; uint16_t pval; if (current_power[p] >= 0) { dval = true; pval = (uint16_t) current_power[p]; } else { dval = false; pval = (uint16_t) -current_power[p]; } /* Set dir and pwm pins */ ao_snek_port_set(p + 1, dval); ao_snek_port_set_pwm(p, pval); /* Note that we're still changing the value */ pwm_ramping = 1; } } } } #endif static void set_dir(uint8_t pin, uint8_t d) { if (d) { if (has_adc(pin)) ao_snek_clr_adc(ao_snek_pin[pin].gpio, ao_snek_pin[pin].pin); ao_enable_output(ao_snek_pin[pin].gpio, ao_snek_pin[pin].pin, is_on(pin) && power[pin] != 0); set_out(pin); } else { uint32_t mode = AO_MODE_PULL_UP; switch (pull[pin]) { case AO_MODE_PULL_NONE: mode = AO_MODE_PULL_NONE; break; case AO_MODE_PULL_DOWN: mode = AO_MODE_PULL_DOWN; break; case AO_MODE_PULL_UP: mode = AO_MODE_PULL_UP; break; } if (has_adc(pin)) { if (mode == AO_MODE_PULL_NONE) ao_snek_set_adc(ao_snek_pin[pin].gpio, ao_snek_pin[pin].pin); else ao_snek_clr_adc(ao_snek_pin[pin].gpio, ao_snek_pin[pin].pin); } ao_enable_input(ao_snek_pin[pin].gpio, ao_snek_pin[pin].pin, mode); } } static uint8_t snek_poly_get_pin(snek_poly_t a) { snek_soffset_t p = snek_poly_get_soffset(a); if (p < 0 || AO_SNEK_NUM_PIN <= p) snek_error_value(a); return p; } snek_poly_t snek_builtin_talkto(snek_poly_t a) { snek_list_t *l; uint8_t p, d; if (snek_poly_type(a) == snek_list) { l = snek_poly_to_list(a); p = snek_poly_get_pin(snek_list_get(l, SNEK_ZERO, true)); d = snek_poly_get_pin(snek_list_get(l, SNEK_ONE, true)); } else { p = d = snek_poly_get_pin(a); } if (!snek_abort) { set_dir(p, 1); if (p != d) set_dir(d, 1); power_pin = p; dir_pin = d; } return SNEK_NULL; } snek_poly_t snek_builtin_setpower(snek_poly_t a) { float p = snek_poly_get_float(a); if (p < 0.0f) p = 0.0f; if (p > 1.0f) p = 1.0f; power[power_pin] = (uint16_t) (p * SNEK_PWM_MAX + 0.5f); return set_out(power_pin); } snek_poly_t snek_builtin_setleft(void) { set_on(dir_pin); return set_out(dir_pin); } snek_poly_t snek_builtin_setright(void) { set_off(dir_pin); return set_out(dir_pin); } snek_poly_t snek_builtin_on(void) { set_on(power_pin); return set_out(power_pin); } snek_poly_t snek_builtin_off(void) { set_off(power_pin); return set_out(power_pin); } snek_poly_t snek_builtin_onfor(snek_poly_t a) { snek_builtin_on(); snek_builtin_time_sleep(a); return snek_builtin_off(); } snek_poly_t snek_builtin_pullnone(snek_poly_t a) { uint8_t p = snek_poly_get_pin(a); if (!snek_abort) pull[p] = AO_MODE_PULL_NONE; return SNEK_NULL; } snek_poly_t snek_builtin_pullup(snek_poly_t a) { uint8_t p = snek_poly_get_pin(a); if (!snek_abort) pull[p] = AO_MODE_PULL_UP; return SNEK_NULL; } snek_poly_t snek_builtin_pulldown(snek_poly_t a) { uint8_t p = snek_poly_get_pin(a); if (!snek_abort) pull[p] = AO_MODE_PULL_DOWN; return SNEK_NULL; } #define analog_reference 1 snek_poly_t snek_builtin_read(snek_poly_t a) { uint8_t p = snek_poly_get_pin(a); if (snek_abort) return SNEK_NULL; set_dir(p, 0); if (has_adc(p) && pull[p] == AO_MODE_PULL_NONE) { float value = ao_snek_port_get_analog(p) / (float) AO_ADC_MAX; return snek_float_to_poly(value); } else { return snek_bool_to_poly(ao_snek_port_get(p)); } } snek_poly_t snek_builtin_stopall(void) { uint8_t p; for (p = 0; p < AO_SNEK_NUM_PIN; p++) if (on_pins & ((uint32_t) 1 << p)) { set_off(p); set_out(p); } return SNEK_NULL; } static uint8_t snek_poly_to_inten(snek_poly_t a) { float f = snek_poly_get_float(a); if (f < 0.0f) f = 0.0f; if (f > 1.0f) f = 1.0f; return (uint8_t) (f * 255.0f + 0.5f); } struct snek_neopixel *snek_neopixels; static snek_offset_t snek_neopixel_count; snek_poly_t snek_builtin_neopixel(snek_poly_t pixels) { if (snek_poly_type(pixels) != snek_list) return snek_error_type_1(pixels); snek_list_t *pixels_list = snek_poly_to_list(pixels); if (snek_list_type(pixels_list) == snek_list_dict) return snek_error_type_1(pixels); if (snek_neopixels == NULL || snek_neopixel_count < pixels_list->size) { snek_neopixels = snek_alloc(pixels_list->size * sizeof (struct snek_neopixel)); if (!snek_neopixels) return SNEK_NULL; snek_neopixel_count = pixels_list->size; } snek_poly_t *pixels_data = snek_list_data(pixels_list); for (int p = 0; p < pixels_list->size; p++) { snek_poly_t pixel = pixels_data[p]; if (snek_poly_type(pixel) != snek_list) return snek_error_type_1(pixel); snek_list_t *pixel_list = snek_poly_to_list(pixel); if (snek_list_type(pixel_list) == snek_list_dict || pixel_list->size != 3) return snek_error_type_1(pixel); snek_poly_t *pixel_data = snek_list_data(pixel_list); snek_neopixels[p].r = snek_poly_to_inten(pixel_data[0]); snek_neopixels[p].g = snek_poly_to_inten(pixel_data[1]); snek_neopixels[p].b = snek_poly_to_inten(pixel_data[2]); if (snek_abort) return SNEK_NULL; } if (power_pin == dir_pin) ao_snek_neopixel_write(ao_snek_pin[power_pin].gpio, ao_snek_pin[power_pin].pin, pixels_list->size, snek_neopixels); else ao_snek_apa102_write(ao_snek_pin[power_pin].gpio, ao_snek_pin[power_pin].pin, ao_snek_pin[dir_pin].gpio, ao_snek_pin[dir_pin].pin, pixels_list->size, snek_neopixels); return SNEK_NULL; } snek-1.1/chips/samd21/snek-samd21.defs000066400000000000000000000052651353657467200174320ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_AO = $(SNEK_ROOT)/ao SNEK_LOCAL_VPATH = $(SNEK_SAMD21):$(SNEK_AO) SNEK_SAMD21_SRC = \ ao-snek.c \ snek-altos.c \ snek-eeprom.c \ snek-math.c \ snek-gpio.c \ snek-io.c \ ao-interrupt.c \ ao-led.c \ ao-timer.c \ ao-neopixel.c \ ao-apa102.c \ ao-usb-samd21.c \ ao-tcc-samd21.c \ ao-tc-samd21.c \ ao-adc-samd21.c \ ao-flash-samd21.c \ ao-stdio.c \ ao-notask.c \ ao-product.c \ ao-panic.c SNEK_SAMD21_INC = \ ao.h \ ao-adc-samd21.h \ ao-arch.h \ ao-arch-funcs.h \ ao-flash.h \ ao-led.h \ ao-notask.h \ ao-pins.h \ ao-product.h \ ao-serial.h \ ao-snek.h \ ao-tcc-samd21.h \ ao-tc-samd21.h \ ao-usb.h \ samd21.h SNEK_SAMD21_BUILTINS = \ snek-gpio.builtin \ snek-eeprom.builtin \ snek-altos.builtin \ $(SNEK_ROOT)/snek-math.builtin NEWLIB_PRINTF_CFLAGS = NEWLIB_CFLAGS= \ -ffreestanding -nostdlib \ -isystem $(NEWLIB_NANO)/arm-none-eabi/include \ $(NEWLIB_PRINTF_CFLAGS) OPT=-Os WARN_FLAGS=-Wall -Wextra -Werror -Wcast-align \ -Wpointer-arith \ -Wstrict-prototypes \ -Wmissing-prototypes \ -Wmissing-declarations \ -Wnested-externs \ -Wshadow \ -Warray-bounds=2 AO_CFLAGS=\ -std=gnu99 $(WARN_FLAGS) $(OPT) -g SAMD21_CFLAGS=-mlittle-endian -mcpu=cortex-m0 -mthumb\ -I$(SNEK_SAMD21) -I$(SNEK_AO) -I$(SNEK_ROOT) -I. $(AO_CFLAGS) $(NEWLIB_CFLAGS) CFLAGS = $(SAMD21_CFLAGS) $(SNEK_CFLAGS) LDSCRIPT=$(SNEK_SAMD21)/snek-samd21.ld LDFLAGS=$(CFLAGS) -Wl,-T$(SNEK_SAMD21)/registers.ld -Wl,-T$(LDSCRIPT) -n LIBS=-L$(NEWLIB_NANO)/arm-none-eabi/lib/thumb/v6-m -lc -lm -lgcc CC=arm-none-eabi-gcc OBJCOPY=arm-none-eabi-objcopy NEWLIB_NANO=/usr/lib/newlib-nano PROG=$(PROGNAME)-$(SNEK_VERSION).elf BIN=$(PROGNAME)-$(SNEK_VERSION).bin UF2=$(PROGNAME)-$(SNEK_VERSION).uf2 MAP=$(PROGNAME)-$(SNEK_VERSION).map PRODUCT=$(PRODUCT_NAME)-v$(SNEK_VERSION) IDVENDOR?=0xfffe IDPRODUCT?=0x000a .SUFFIXES: .elf .bin .uf2 .elf.bin: $(OBJCOPY) -O binary -j '.text' -j '.ARM.exidx' -j '.rodata' -j '.textram' -j '.data' $^ $@ .bin.uf2: python3 $(SNEK_SAMD21)/uf2conv.py -b 0x2000 -c -o $@ $^ ao-product.h: $(SNEK_ROOT)/snek.defs Makefile python3 $(SNEK_AO)/make-product.py -i $(IDPRODUCT) -V $(IDVENDOR) -v $(SNEK_VERSION) -p $(PRODUCT_NAME) > $@ snek-1.1/chips/samd21/snek-samd21.ld000066400000000000000000000045341353657467200171060ustar00rootroot00000000000000/* * Copyright © 2012 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ MEMORY { rom (rx) : ORIGIN = 0x00002000, LENGTH = 128K - 8K flash (rw) : ORIGIN = 0x00020000, LENGTH = 64K ram (!w) : ORIGIN = 0x20000000, LENGTH = 32K - 2K stack (!w) : ORIGIN = 0x20000000 + 32k - 2K, LENGTH = 2K } SECTIONS { /* * Rom contents */ .text ORIGIN(rom) : { __text_start__ = .; KEEP(*(.interrupt)) /* interrupt vectors */ . = ORIGIN(rom) + 0x100; *(.text*) /* Executable code */ } > rom .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } > rom .rodata : { . = ALIGN(8); *(.rodata*) /* Constants */ . = ALIGN(8); } > rom __text_end__ = .; /* Functions placed in RAM (required for flashing) * * Align to 8 bytes as that's what the ARM likes text * segment alignments to be, and if we don't, then * we end up with a mismatch between the location in * ROM and the desired location in RAM. I don't * entirely understand this, but at least this appears * to work... */ __data_start__ = ORIGIN(ram); .textram : { *(.ramtext) . = ALIGN(8); } >ram AT>rom /* Data -- relocated to RAM, but written to ROM */ .data : { __snek_data_start__ = .; snek*(.data) __snek_data_end__ = .; *(.data) /* initialized data */ . = ALIGN(8); __data_end__ = .; } >ram AT>rom .bss : { __bss_start__ = .; __snek_bss_start__ = .; snek*(.bss) snek*(COMMON) __snek_bss_end__ = .; *(.bss) *(COMMON) . = ALIGN(8); __bss_end__ = .; } >ram PROVIDE(end = .); PROVIDE(__stack__ = ORIGIN(stack) + LENGTH(stack)); PROVIDE(__flash__ = ORIGIN(flash)); PROVIDE(__flash_end__ = ORIGIN(flash) + LENGTH(flash)); } ENTRY(start); snek-1.1/chips/samd21/uf2conv.py000077500000000000000000000232631353657467200164770ustar00rootroot00000000000000#!/usr/bin/env python3 # # Microsoft UF2 # # The MIT License (MIT) # # Copyright (c) Microsoft Corporation # # All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. import sys import struct import subprocess import re import os import os.path import argparse UF2_MAGIC_START0 = 0x0A324655 # "UF2\n" UF2_MAGIC_START1 = 0x9E5D5157 # Randomly selected UF2_MAGIC_END = 0x0AB16F30 # Ditto families = { 'SAMD21': 0x68ed2b88, 'SAMD51': 0x55114460, 'NRF52': 0x1b57745f, 'STM32F1': 0x5ee21072, 'STM32F4': 0x57755a57, 'ATMEGA32': 0x16573617, } INFO_FILE = "/INFO_UF2.TXT" appstartaddr = 0x2000 familyid = 0x0 def is_uf2(buf): w = struct.unpack(" 476: assert False, "Invalid UF2 data size at " + ptr newaddr = hd[3] if curraddr == None: appstartaddr = newaddr curraddr = newaddr padding = newaddr - curraddr if padding < 0: assert False, "Block out of order at " + ptr if padding > 10*1024*1024: assert False, "More than 10M of padding needed at " + ptr if padding % 4 != 0: assert False, "Non-word padding size at " + ptr while padding > 0: padding -= 4 outp += b"\x00\x00\x00\x00" outp += block[32 : 32 + datalen] curraddr = newaddr + datalen return outp def convert_to_uf2(file_content): global familyid datapadding = b"" while len(datapadding) < 512 - 256 - 32 - 4: datapadding += b"\x00\x00\x00\x00" numblocks = (len(file_content) + 255) // 256 outp = b"" for blockno in range(numblocks): ptr = 256 * blockno chunk = file_content[ptr:ptr + 256] flags = 0x0 if familyid: flags |= 0x2000 hd = struct.pack(b"= 3 and words[1] == "2" and words[2] == "FAT": drives.append(words[0]) else: rootpath = "/media" if sys.platform == "darwin": rootpath = "/Volumes" elif sys.platform == "linux": tmp = rootpath + "/" + os.environ["USER"] if os.path.isdir(tmp): rootpath = tmp for d in os.listdir(rootpath): drives.append(os.path.join(rootpath, d)) def has_info(d): try: return os.path.isfile(d + INFO_FILE) except: return False return list(filter(has_info, drives)) def board_id(path): with open(path + INFO_FILE, mode='r') as file: file_content = file.read() return re.search("Board-ID: ([^\r\n]*)", file_content).group(1) def list_drives(): for d in get_drives(): print(d, board_id(d)) def write_file(name, buf): with open(name, "wb") as f: f.write(buf) print("Wrote %d bytes to %s." % (len(buf), name)) def main(): global appstartaddr, familyid def error(msg): print(msg) sys.exit(1) parser = argparse.ArgumentParser(description='Convert to UF2 or flash directly.') parser.add_argument('input', metavar='INPUT', type=str, nargs='?', help='input file (HEX, BIN or UF2)') parser.add_argument('-b' , '--base', dest='base', type=str, default="0x2000", help='set base address of application for BIN format (default: 0x2000)') parser.add_argument('-o' , '--output', metavar="FILE", dest='output', type=str, help='write output to named file; defaults to "flash.uf2" or "flash.bin" where sensible') parser.add_argument('-d' , '--device', dest="device_path", help='select a device path to flash') parser.add_argument('-l' , '--list', action='store_true', help='list connected devices') parser.add_argument('-c' , '--convert', action='store_true', help='do not flash, just convert') parser.add_argument('-f' , '--family', dest='family', type=str, default="0x0", help='specify familyID - number or name (default: 0x0)') args = parser.parse_args() appstartaddr = int(args.base, 0) if args.family.upper() in families: familyid = families[args.family.upper()] else: try: familyid = int(args.family, 0) except ValueError: error("Family ID needs to be a number or one of: " + ", ".join(families.keys())) if args.list: list_drives() else: if not args.input: error("Need input file") with open(args.input, mode='rb') as f: inpbuf = f.read() from_uf2 = is_uf2(inpbuf) ext = "uf2" if from_uf2: outbuf = convert_from_uf2(inpbuf) ext = "bin" elif is_hex(inpbuf): outbuf = convert_from_hex_to_uf2(inpbuf.decode("utf-8")) else: outbuf = convert_to_uf2(inpbuf) print("Converting to %s, output size: %d, start address: 0x%x" % (ext, len(outbuf), appstartaddr)) if args.convert: drives = [] if args.output == None: args.output = "flash." + ext else: drives = get_drives() if args.output: write_file(args.output, outbuf) else: if len(drives) == 0: error("No drive to deploy.") for d in drives: print("Flashing %s (%s)" % (d, board_id(d))) write_file(outbuf, d + "/NEW.UF2") if __name__ == "__main__": main() snek-1.1/doc/000077500000000000000000000000001353657467200131025ustar00rootroot00000000000000snek-1.1/doc/.gitignore000066400000000000000000000001101353657467200150620ustar00rootroot00000000000000snek.html snek.pdf coderay-asciidoctor.css snek-book.pdf snek-cover.pdf snek-1.1/doc/Makefile000066400000000000000000000027201353657467200145430ustar00rootroot00000000000000SNEK_NO_BUILD_TARGETS = 1 SNEK_ROOT=.. include $(SNEK_ROOT)/snek-install.defs .SUFFIXES: .adoc .pdf .html ADOC_FILES=snek.adoc PDF_FILES=$(ADOC_FILES:.adoc=.pdf) HTML_FILES=$(ADOC_FILES:.adoc=.html) CSS_FILES=snek.css coderay-asciidoctor.css IMAGE_FILES=../snek.svg all: $(HTML_FILES) $(PDF_FILES) BOOK_FILES=snek-book.pdf snek-cover.pdf snek-book-book.pdf snek-cover-book.pdf book: $(BOOK_FILES) LETTER_ATTRIBUTES=--attribute='pdf-style=snek' BOOK_ATTRIBUTES=--attribute='pdf-style=snek-book' ATTRIBUTES=--attribute="revdate=$(SNEK_DATE)" --attribute="version=$(SNEK_VERSION)" .adoc.html: asciidoctor -v -B$(SNEK_ROOT) $(ATTRIBUTES) -b html5 $*.adoc .adoc.pdf: asciidoctor-pdf -B$(SNEK_ROOT) $(ATTRIBUTES) $(LETTER_ATTRIBUTES) $*.adoc $(PDF_FILES): snek-theme.yml $(IMAGE_FILES) DOCFILES=$(PDF_FILES) $(HTML_FILES) $(CSS_FILES) install: $(DOCFILES) install -d $(DESTDIR)$(DOCDIR) for i in $(DOCFILES); do install --mode=644 "$$i" $(DESTDIR)$(DOCDIR); done snek-book.pdf: snek.adoc snek-book-theme.yml asciidoctor-pdf -o `pwd`/$@ -B$(SNEK_ROOT) $(ATTRIBUTES) $(BOOK_ATTRIBUTES) snek.adoc snek-book-book.pdf: snek-book.pdf pdfbook2 -n --paper=letter snek-book.pdf snek-cover.pdf: snek-cover.svg rsvg-convert -d 72 -p 72 -f pdf -o $@ $^ snek-cover-book.pdf: snek-cover.svg rsvg-convert -d 69.05 -p 69.94 -f pdf -o $@ $^ upload: $(DOCFILES) rsync -avz $(DOCFILES) fonts $(SNEKDOC) clean:: rm -f $(PDF_FILES) $(HTML_FILES) $(BOOK_FILES) coderay-asciidoctor.css snek-1.1/doc/fonts/000077500000000000000000000000001353657467200142335ustar00rootroot00000000000000snek-1.1/doc/fonts/DejaVuSansMono-Bold.ttf000066400000000000000000012074201353657467200204720ustar00rootroot00000000000000 FFTMo9,GDEFdWHtGPOS:U-\GSUB\OS/2&" Vcmapdi"x6cvt I*8fpgmq49j:4gasp: glyf F:headzB6hhea $hmtxloca͢t93maxpm namet4jm!BpostK{0prepLQ3 =}}luv      DFLT&arab0cyrl>grekPlao \latnh SRB 4ISM 4KSM 4LSM 4MOL 4NSM 4ROM 4SKS 4SSM 4markmark&mark.mkmk4 $,4<DLTHn  " j{j&0  j:j|yz}jQ]jjh $6HZl~ P< x P< < |@ 4X P< p x{j~jj  $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|l@Lh\hP p QQUu" 3  o ! $s 4 4w ; x x{j~jj $6HZl~ hU hE hc hG h h h h  vwyz|}~ &,28>DJPVj hjQ]jj\jhj jJh  &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~bzb2_bVS ;Ckkk2zo.2r brw>*{v&#_BCbO&cnkkkk}<xx%iFWW@TT[:B`^L?c:Es[Tv;]48x, X&(oXoXloPXdToXOJB<ExKUTTTRlbOW&ZZs{;#7fkf**.z"/*3[c k:Bo:s62C2> ^n~*6.Zw.k~BVKO2 Gh8pBh<U=7~e<PL#j_ 38~~{)Kprf{+>V;'o"?4W QQSu$ 5  q ! $u 4 4y 7 :z = ~  vwyz|}~ &,28>DJPVj hjQ]jj\jhj jJh } &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~hh6zhhhhhhhh6hhhhhhhh`h`hg`hh`h2h`h`h`h`h`h`h`hh`h`h`h`h`h`zh`hh`hh`hh`hhh`hh6h`-```h`hh`h`h`g`h`h`h`h`h`h`h`h`h`h``h`h`hh`h`h`h`h`h`h`h``h`h``h`'}{gfid id6hhhhh`hhhA`hk!$=DKN]"2345  68BB:HH;<=>@BCDiqEsNdfhijm n o q r t v xV\bhntzh`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`/ ntz "(.4:@FLRX^djpv|  >DJPV\bhntz` NDFLT&arab2cyrlFgrekXlao blatnlSRB F CAT PESP PGAL PISM XKSM XLSM XMOL bNSM XROM bSKS XSSM X case8dlig>finaDinitJligaPloclVlocl\medibrligh $,4<DLTHL V  Z  6N    Jjp5 6 8 : < > B D H J N R V Z ^ ` b d f j n r v z ~        " Rjlu# 4T' @ F L P T X \ h l p t x |      $VVXXZ^cjlrtu"T' ? E K O S W [ g k o s w {        #VVXXZ^cjlrtu"   B  B > $  <  8  6  <  8  6  O LI  c 33f  &(PfEd m`, 4,, 4~!AEM?CXauz~_csV_  :UZmt{? .<[ex{-McyEMWY[]} # & 7 : ? I K _ q !!!!!!!"!$!&!+!.!H!Q!_!""" "#"-"="i""""""""####!#(#+#z#}#####$#&/&&&&'' '''K'M'R'V'^'u'''''''''))))**/*k+ +,d,p,w,z,...%..'t $CLPCXatz~br1Ya  !@Z`ty~?,0>bw{0Th| HPY[]_  & / 9 < E K _ p t !!! !!!!"!$!&!*!.!H!P!S!!"""#"'"4"A"m"""""""#####%#+#5#}#####$#%&8&&&''' ')'M'O'V'X'a'''''''''))))**/*j++,d,m,u,y,|...".."RpvqiWSPKJIHG97) CBA9410+'" m,+)(&  kge_[YXUKIEC;9/-+)'! ~wrqokjifdKDC ~+OGC@2\"<40/.ݖݐݎ݆ddddFdEd-c{q7%  ~b!$ACELMP`gks|?CCXXaatuzz~~_)bcrs1VY_a GI  K  MNOP!:Q@UkZZ`mtty{~??    ,.0<>[!be?wxC{{EFGdk-0MTchy| !7 E=HMcPWiYYq[[r]]s_}t   # & &) / 7* 9 :3 < ?5 E I9 K K> _ _? p q@ t B ] j !!!!! !!!!!!!!"!"!$!$!&!&!*!+!.!.!H!H!P!Q!S!_!!!"""("" )"#"#3"'"-4"4"=;"A"iE"m"n""""""""""""""########!#%#(#+#+#5#z#}#} .## /## 3## 7## 8## L$#$# N%&/ O&8& && && && '' '' ' '' ')'K 'M'M +'O'R ,'V'V 0'X'^ 1'a'u 8'' M'' N'' f'' u'' v'' x'' y'' z'' )) )) )) )) ** */*/ *j*k ++ ++ ,d,d ,m,p ,u,w ,y,z ,|, .. .. .".% ....   "'  R    !pt %v * ZZ    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a%rdei'xpkvjd0shigw%#8l|cn,TLm})b!" :v34 &y#+gyquvwzzxh3#N\{#'##\ #\\w#3b##\b b b%%1/#/ 9bRsq#oVd\Hf```{\{`o7L'5%={D=!/s, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-,%%I%%I` ch #:e:-hh@ b/10!%!!hsr) @ d <2991/0!!!#  !#qe@ d1<20!!!++J@0g g    91/<<<<<<<2220333#3!####5!#5!#3_^aJ^^^^J^Jvuu%vD /P@+)%$(hh!/$, ( 0<21/<22290>54&#.'.546753.'?FE>??ˍWggU̹GP>[ٴ O=>O-C:9L-.+=BI' (0Ϭ ! '3V@-(  (kk kj.k%1"+1""499991/999904632#"&"32654& 4632#"&"32654&!?9PP9:OP)˹=8ON9:QRXO::OO:9PP`^P::OP99Q%*8@Z)(*()(-,.+23456718%8+(%#1) #1p#popnr)($ +.#  .8 )$. 9999999991/99990KSX999Y"%#"5467.54632.#">54&'3!32676767fKWꍋ20ID@APR=D9DI"BCr;H23ёXN<$%86$~f &b993V+wIz  d10!+ @ut  29910#&547䟚@=5R @ut  299103#6545䞛䄀=?y9TJ@(   n   <2<2991<22990 %#'-73%TJLLLLKLXXB\ #@ v    <<1<<0!!#!5!RPRPjo@ w 10!#9co-10!!-wow 1/0!!MoqB`@ d103#m{V #$@ x! xn!r$  $10@////////// / / ?????????? ? ? OOKKKKK K O TTTPPPTT T ddd```dd d    T////////// / /   $]]4632#"&"326&32#"H45HH54H|f^^fg^^5HH54HGB~{|~o $@xxdx  1/20!%!!!J5JML J/s'[@/% zy xnx    991/990KSX9Y"!!577>54&#">32uL=KByoOkk^;H5/FVAdm?<')ݿX^D}L(G@)p zy#p z y pnr) &  )9190#32654&#">32!"&'32654&%nyynTgg\qd^xxWOS]*( !εǢ&$/1o^s}fu B@   % xd   <291/<290KSXY" !!3#!!y5jBF<@!xzyx xd r  190!!>32!"&'32654&#"+$R.`fSXOQ  ))u''b $5@{{ z y{"nr%   %190"32654&.#">32# !2`ee``gg#OC/c..F싄--AAn75@%xd 991/0KSXY"!!!P #/D@% {'{-{nr'0 $*  ! 0991990"32654&%.54632#"&54632654&#"hczzcc{zqvto|eWXeeXVf}gg~eg}}'yغx(&ĉ׊TXggXWefoN$7@{ zy{ {nr% " %19073267#"543 !"&2654&#"OC/dF7_ee_`gg .,AAi}}'@ ww <21/0!!!!MM's' "@ww   <210!#!!MNMoXmy@29190 5y!X'y@vv<210!!!!X!!Xmy@<919055X!`a)$q@8   %$  fhn !  %<2999991/9990KSX99Y"!!!546?>54&#">32  >PZ?-\\T`beD^XD&cNY=P+CDGF 89L\VBT= s 4]@1(+$ 4| | }'$|+}|+15'(   ! .529919999904&#"326#5#"&5463254&#"3267# !2fYYeeYYf&gHȥGl"0PE\Qm`v4!qqrR511/)//77! @;      %h~d     KSK QZX @8Y91/<90KSXY"@,0000 5::5s|]]!!!!!hi\uZq+q} >@$h hdh   !2991/9032654&#32654&#%!2)čqvp_anF`wyjFP\\S뽼 İ9.@op op nr! 210%# !2.#"32679FU>.UDLLLL+$$xy$$FAAFu(@p dp !  "99991/0326&#! )P<nB? tsJ *@ppd p#  2<1/0)!!!!!J^?{yX %@ppd# 21/0!!!!!XBuujS@!ppopnr%! 1990@]]#5!# !2.#"326hUu?-ZL>`.DTIKsy30PQH &@pd  " 221/<20!!!!!!'q'9+h% #@pd p 221/220!!!!!y))3m.@ opp dr  199073265!!!"&mVctl_JVX\t 4u a@3  %d   291/<290KSXY"!! !!u'N)Nw@ pd1/03!!'w/V{ @  % % 91@ d /<290@  %KSXY" ]@R )=??   & )/708?    ]]K TX 88Y!!###V`bq+sTwX S@%d&& 991/<2990KSXY"]@  ]]!!!!w=^=+=\u #@ppnr !! '10"326&! ! hqhhqrhh    xx{,@pp d !  299991/032654&#%! !#!yuu`5nJbyyb\u<@ pp n ! !'9919990# ! "326&   ~xqhhqrhh~xL  f@6  %p pd   !  "29991/<9990KSX9Y"!&'&+!! 32654&#',A/ Ok^ yihz A^y暶 i_mm^V'p@>'' '%' o!p o pnr('$ ($"(9999190KSX99Y".54$32.#"!"&'32654&'ߞge_`krSohvlmxPLU/.CFVP>Q10Bڦ541TRcYCeZw@ pd1/20)!!!jf*@  pr d  1299990!3265!! j'reer''ppR9m@%%dKSK QZX@8Y91/290KSXY"@  ]]%!!!h)g)+ @@      % d   /91/<<90KSXY"]@6fe   )&ghj f g wzsx]]!3!! !kT;H+ @C    % d   KSK QZX@8Y91/<290KSXY"@  ]]) ! ! !V11X%!S@(%d 9991/290KSXY"! !!>"#>3XwLs 8@%pdp 991/0KSXY"!!!5!Lw#$@ut10!#3!ZoB`@ d9910 #Nm/+ @ut9910!53#5+޾9@ d91290 # #--/10!5/۾f"1K TKT[X@8Y0 #fx^T{ %@/   ggh g#r #  .)&22991/99990@-400 4!urr  ]"326=%!5#"&546!354&#"5>3 ZMt#5d gdikapTfLZq}JPʵĻ1GI5:(&w 6@  h hrt2 0221/9904&#"326>32#"&'!!Rl__nn__lh6Ze.$-6]]ba%}.@yh yh r 75210%# !2.#"3267%Jb&ZS@RUB9++89*,7;9:Z;6@hhrt2 )221/990!!5#"3232654&#"$/eZl__nn__lSab40]\}{L@#   hy h r .)190@ ]%# 32!3267.#"Nfv ekspex 7**->w:?itw{q;4@ t  <<2991/22990!!!!5!546;#"XB/bNʜ0bXH} (I@(  &' hyhh#')& 2 ))221999904&#"326!"&'326=#"325!#r]\qq\]r%\]S[|v+f`+%B .,u|yPN, 8ZR/.@ h t 7  521/<99990!4&#"!!>32/ENPZ#j)yh}]f *@  s  <<1/20!!!5!!!!Dlm%`XR 7@  s  <2991990%#!53265!5!5!!RbRN%+nTV @@! %t  .5 291/<90KSXY"!! !!%`cXd}^B `TZF %@t  991/990!5!;!"&NRbѶ`nR{"@'  h :=:=:#K TK T[X@8Y91/<<<299990@7      /////////?? ? ? ? ?????]>32#4&#"#4&#"#3>32!fJo&22((22&nDDpGD}TV{1{VT}1`tBMQ/{0@  h 7  521/<99990!4&#"!!>32/ENO[#j)zi~`]fbo{ #@hhr . )10"32654&32#"hixxijxx==Vw{9@hhr 20221990%!!>32#"&4&#"326$.eZbl__nn__l ab]񢸸ZV;{ 5@ h hr 2)22199032654&#"#"325!!l__nn__l6Ze/$1^]04ba#{)@ h  21/990.#"!!>320M]&%+w&ln``i+{'@=    %  yhyh%r( >7"5(99991990KSX99Y"(!]@+ $)) ) ) ) ) ),//,))))) (!$'].#"#"&'32654&/.54632QXbd Tema^gjKQ_=4598P2&##7:<98<"&o11@  <<2991/<2990!!;#"&5!5!IUKA>%`0@  hr   7521/299990!3265!!5#"&%DOOY%iTyh~]fP`i@%%1/91/290KSXY"X]@U  ZUUY]] !!)``j` @@      %    /91/<<90KSXY"h ]@@     )&') 96k c wxuy   ]]333! !ywꈇ`5ZF7` @B    %  1/ 91/<290KSXY" ]@    96]] ! ! !yV`yHN;X`w@A     %    1 /9129990KSX9Y"+5326?!!;vwZT+V44y=o<A)9` 8@%6/ 2991/0KSXY"!!!5!MiN``$^@0 %   !  t% $  %<<29999999199999990#"&=4&+5326=46;#"3k>>k{hFb~~bFhחsrݓTѥ͐Ut10#!$`@1%   #t%# %<2<9999999199999990326=467.=4&+532;#"+yhHb}~aGiym>>mVͤэVחstݔXy++@  19990#"'&'.#"5>32326yKOZq Mg3NJNS5dJ t]F+<73 ":?=6 7=` @d  <29910!!!3 !#E+e !F@& yh yh r" -/"<<<2212<220.'>7#&573 8x?@w84xC=ur{~5*1L0+" :9!wb>@  zyhn x <<1/222990.#"!!!!3#535632N9EjcPS)+N^T /c@8  *( -'! ) -0)'!$ * ( $02299912299904&#"3267'#"&''7.5467'7>32;dJIeeIJd$P0'T-)S.'QIccIJffq)S,/Q$*S)/Q&u@<%  d    229991/2<2<290KSXY"! !3!!!!!5!'!53>"#>VddVX𻗽J@ <210##  =% >y@C/0*1 06 'f&*f# f f54%.#"#"&'532654/$5467.5463271a71|U6LU v_fFAѺYUUIMR haG@ЬJX$E(6X`$E+Ql:4Ki neY/2{Q95Fs^!2xR-;1@ 1<203#%3#u1}N1ID@%  >2>&JDB C8B ,/210.#"3267#"&546322#"&'.5467>"3267>54&'.P4[0akjb5`*7j2ʩ7iZZ\[[[~}[[[\ZZ~cIGHHGGcdFHHHHHh__g$ZZ[~}[[[[[[}~[ZZGIGebHHIIHHbeGIG %)d@4 $#(&$& n*&(' #*229991999905#"326#"&546;54&#"5>32#!!fmd=6Vn2yN[[R@ILP4818g96u11!"@ww# -@   U U <2991<2990 5 5++#Xjy@ v 10!#!X!,-10!!-w}N 4L\@3-*+'0!52+A M*',$0-!1E3+E$CGB3C;B/29991<99902#"&'.5467>#32654&'2#'.'##%"3267>54&'.hZZ\[[[~}[[[\ZZb@@998(NG&7O?9)cIGHHGHccGHHHHHNZZ[~}[[[[[[}~[ZZb((+)oXZAU 81:/qGIGebJGHHGJbeGIG-X10!!-wV@ n@@102#"&546"32654&hCz//12.0zDHdbHHdc30/xDBz./3dHHbcGHdXy *@v  v   <2<21/<<0!!#!5!!!fff!bb2@ ^9190!!56754&#"5>32f3Z:WK8MKB6-+KO4<#"}o~*(D@& #  )^&^ )9190#532654&#"5>32#"&'532654&FooJUOFEDECibouKJCPU_b2,-3teI^p\y@8=D f"1K TKT[X@8Y0!#fT` G@'  hr !    75!29912<<990!3265!3267#"&'#"&'RRQP!+J#H[%nF;ST XrsrsG> KSNP/0F;) "@d 91290!###.54$!fN۲w 10!!Moo39 )@   ^ 12035733!9x-+)N0@ n  9910!!4632#"&"32654&%PŦçkIUUIIUUV޾~mm}}mm~\# -@   U U<<991<29905-5-++#wvwv/w{'BV'{ /w{'{& tV/w'BV'u p`%x@<   %%  fh&# !  &<<99999919990KSX99Y"!!!3267#"&546?>54765  >PZ=-\\SabeD^XB&EocMY;Q,CDGF89L\V@T?!k&$ u@ ]1!k&$ u@ ]1!k&$ u  +@ ]1!m&$ u$ +@O$@]1!k&$ u   +@  p? 0/   ]1!m!@M ! !%h  i ~!   "999991/<9990KSXY"]@\ !000 0!o  !!' )!;44 ;!t |! ! !]] !!!.54632%32654&#"!/\uZ,*uv*N57MN65Nsq%a=uu>_6MM66MMAc@3  %p hpdp~  % /<291/<20KSXY"!!!!!!#36Vfnj{o9&u&Jk&( uJk&( uJk&( uJk&( u%k&, u%k&, u%k&, u+1%k&, u+K SKQZX@88Y1u 9@hp dp  ! "/<29991/2203#326&#! )#53P<nBĉr tswXm&1 u#+@O#@]1\uk&2 u@]1\uk&2 u@]1\uk&2 u +@]1\um&2 u1" +@O1@"]1\uk&2 u +1wXs 0@   <291<290  ' 7 XJJGJHJHH )s@> )*  '$ ($p$ pn$r*(! '!)!!!'*.99999991999999903264&'.#".5!27!"&''U8rh9N4pi## g=q''j@xb9= >5 33X>=s^xCBrjfk&8 u@]1jfk&8 u@]1jfk&8 u +@]1jfk&8 u +1k&< u{0@hh d !  2299991/032654&#!3 !#!ytu`'n5nIbxyd2X@2)#,2&h&h/tr*  #A  ) .+/399991/990#"&'532654'&/.5467.#"!4632 }t aRP=|C:s6IUsV;< b\^`#[Q@Y J>^ C:HX D0M~JIebf^Tf&DC^Tf&Dv^Tf&Dg @?&/&]1^T9&Dy^T1&Dj^T&Dw{ A@K. 4, ;5#A  ggy 451g8g,>8& rB#;-, 4T)-RB<999912222999990@'33040536G3G4G5G6YYYYW3W6 A]5#"326554&#"!3267#"&'#"&546;54&#"5>32>32IWY@=?=2??2=d_A=Bo%}&HF\}f&HC'\}f&Hv'\}f&Hg' @?/]1\}1&Hj'f&Cf&vf&g1&jbf(@N (((#$%$"!"%%$%('%"! #&#h hr#t)'& !#(%" .))999919990KSX9Y".#"32654&#"432''%'!%+1b0izwhms udV(?7%\)B}-b2 wumt{u/9&Qyboh&Rbog&Rbog&gR+@]1bo&yR1 ++1bo&jR +1BV $@v  <<10!!!!!!55uK +s@>+,  )*&h&h&r,+,* # )#.),99999999199999990 32654&.#".5327#"&''?B&hxJZ>'jy--UC./SCc:"4Im=+-yLk--w%f&XC%f&Xv%f&Xg +@]1%1&Xj +1;Xf&\vVw9@hhrt 20221990%!!>32#"&4&#"326$.eZbl__nn__lab]񢸸;X1&\j, +@!p_PO@?0/ ]1!N& $ +@ O@/ ]1@]0^T&D!k&$ ^TF&D!o'xc$^ol{'xDAk&& upf&Fvf}k' u&Jf&giF9k&& d%1&FKjk&& uGf&Fhfu}&' Zg cAnA1G@8@/]1uZ$F@&"   "hhrt   2)%<<1/<2990!5!5!3#!5#"3232654&#"2$/eZl__nn__l"ttab40]JN& (@]0\}&'HJk&( \}F&H'Jk&( \}1&H'oK'x(\o}{'xHJk&( 5u\}k&Hh @?/]1ujk' yu*bXHf&gJujk&* 2bXHF&Jujk&* 2bXH1&Juj' *bXH'dJ@?]0Hk' u+ +1/k' uK +1K QX@8Y@O]0>@   pd    "<22<221/<2<<220!!5!3#!!!#53!5'q&ن'qhQ /B@" ht 7  5<<<1/<<299990!4&#"!#535!23!>32/ENP--ݠ#jQQ)yhGF}zz]fij%m' u,$ #+19&y@]1%N& ,+@/ ]1@]0&%k&, F&o%&,xBo&Lxg%k&, ` @ 1/20!!!5!!Dlm`D@# op p dpr ! 221/2<22990%32765!!#"&!#3!3>?HU'(STEl9ǾMVX\:: uv43 N G@$   s   ! <<<21/22<220%#!53265!5!5!!!!!5!#3#ѵbRN%o6!nTVm!k' @u-+1Xf&gu0&r(.0'(N` ?@  %  .5 291/<290KSXY"!! !!%`cXd`}^B `Tl' v/ZFl' vOK QX@8Y@O]00'(/Z0F&(O' Do/Z' kO'y/Z'yO @/]1 7@  pd    <2.9991/903'%!%!q'p}wo™%\D@%  t  <<99991/99905'!5!%;!"&duK'grSbѶӦâѠnwXl' v1/m&vQw0X&:(10/{&@(QwXk&1 )u/f&Qh$'QajVe2@ pndp 21/90+532654&#"!!>32e\\y%dR^jm;>'%~nlnˁoKN4X/{5@ hh 75 21/99990+532654'&#"!!>32/[Zy'dR"#NO.-#jQQTklnz45GG~`]fij\uN& 2+@ O@/ ]1@]0bo&R+@/ ]1\uk&2 boF&R\uk&2 bof&RD>@!p  pdp %  <99991/220! )!!!";C=.{\[|478nͲɮ{ )5o@1("!% !gy3g -%g r6*0T!*R(6<9912<22999990@ !"()]!3267#"&'#"32>32'54&#"4&#"326>c_>2:MN;;NM:ߐ;:,*JJMG8;;Bjfm' u8- #+@O@ ]1%9&yX* +1jfN& 8+@ O@/ ]1@]0%&X+@/ ]1jfk&8 %F&Xjfm&8wR @]0%&Xwjfk&8 =f&Xj_f&8xo`&Xxbr' |:+1m&gZ+1r' |< +1;Xm&g\+@]1k&< u( +@ po `_ PO @? 0/  ]1sl' v=9m&v]sk&= 291&]sk&= u9f&]h;*@  t <991/90)!5!546;#"B/Nʜ0A w >32#"&'!#535!!!&"26Ze.܊$*lnn]]bazzD(?@$h hdh   !$'+9291/9032654&#3264&#%!2)"#546r-qv--p_anB1F`wyjFPS뽼 İ/B;ʜ{Jw"'!!!632 &"2\llhQlnnæ~D+%3264&+'3 !yuuy٢n5bbR-&"2>32#"&'!'lnn6Ze.ܖD]]ba9/@! <1@ op opn r0>3 !"&'3254#"DU.>UFLLLL$$rr$$HFAAFk %27# %6326;#"&#"E0-Xa\1)!Hx#@7.8"#%27# !2676;#"&#"&HZy'_.#K33sV89Vl7+rU?u"0#547676; !#26& 0KnB'&4MFmts?}#";! $545676?6%3!jĈvqeH+ejyw`+ Q2[w"7632!5!!526&"*hlʳl\lnn4Da=n{%/%#"'&'&'532?654#"32%26&#"~}cTy `&ZQh:#?ixxijxx5?NM ",f==KJJ +@   21@ p pdp/0!!!!!J^{?+B\u=@ ! !'991@ p p nppr9905!54&#">3 ! %3267\nxLLFU 9 iad__AFH$$xxٯ}L(>@  !!&)1@ pn)p) p#r)90.54$32.#";#"3267# $546ō\ggTnyynxx^dq%!(*]SOW}s^o1/$&٢lXe!!!+5276=!eSZVh)%C}+dl72}-[Xv!!#!532765!5!546;#&XT\c()obcl78TNʜ&k(%27#5!# %632676;#"'&# ]*̬@<< Za\1)}."TsC  l7.R:dO  '! !%3254hrACr%v ]u~ *'&'&'&#"#3>32?67653hbYDG?@$$xUAA X+19y} V*4GF}]fij 4 T^xh0!!!#"'&y&&fln.-vx%!!3#!!!#53y)) !!!676&|'@MD6$wGq3= 476;#"3! !![Zy'b+)`cXdAml75}^B `TZF3+;!"&=#53!5! RbѶN^n^BP! !''7!gkd)NUTEWR%#"&326532653#5"&#!fJo&d((d&nppGD<}TV{D{VT}D+tBMQV!+532765!!! T0<;+<^Z4K=+=V/{!4&#"!!>32/ENO[#jTzi~`]f\u  &5%63 &'&#"!3276hn-]O` I|:3U- Q )4qr4(txxpOD2P_xx]'2 'R &5%6327!#327&#"d(ECOu]rxSU+Cg//g&q+pi5x yhV{327!##""327&훀꓌ixxi,<< =|erП]]3264&#"#5476763! !#!quu 0K/5Jbb'&4MFmVw$&"2"'!#776;#"3632Rlnn k QZy'_.#\QDal7+Wy*!&5&+!!3 3264&#',!0Ok^' yihz _y+暶 i_^V(03267# $546?>54&#">32ّLPxmlvhoSrk`_eg7eCYcRT45B01Q>PVFC ./˞+{'>323267#"&546?654&#"Y_ꚨQKjg^ame㕠T dbXQ=&"<89<:7##&2P8954bx;Xv&(;#"&5# %53232#%&'&'32'3@䨇.2\K t8G (`@iHs@ lY265LoX1 !!;#+532767&'&5!5!IUUZy'b+"PYKA+fl7,eHQ>w"#5476762'!!,0!Z{i0!H "MAM-o147676;#"!!;#"&5!5[Ry'b+)IU`mb 75gKAZVw!!!!;#"&Tb'~ҭVl'8'XhZw##"47#5!32654&'!wxllxQNpgfqPRmn8mO֦M uR'53!"'&5!276%xliB'&&f-H9mȷn.-X!!776&S.a)=?51JL@\MX` +5326?!76&kwZT+u%p[RS4;^0"=o<A)_;;& #O9s!3!!!5#53!\Uw&4`!3!!!57#5!!Min`  "# '&5!327654'&+5!!>aEb)"'toNkIQm?tk9)qo dn  %2765!! &54767675!!# J1>6n GOoNot׊54&#">323+uLmT;KByoOkk^;H u5HtAVAdm?<')ݿX^H "#!!!2! '&5!32654'&+DtKQG>OJoKKfO@tfstt_95jcf54nHc` 2!"'&'32654'&+!!lxiGGghhf_[KKY0,fgst%)58jcf54v5?%#"'&'327654'&+#5;5!3[w٣IIDFFHHY43NTB61^ׅ#*+rB`GLr!¦QVr{!!6763254'&#";LL\DP22nN o%,p\NqBA!! +'I!!!!!!!5!5!5! ffff:!k&$ u^Tf&Dh%k&, uf&h\uk&2 ubof&Rhjfk&8 u%f&Xhjf' &8j%O'q;jf&8'  %'jf&8'  %'jf&8'  %'\}{!' 'j$^TO'q;!& &$j^TO&D&q;N' &ujk' yu*bXHf&hJuk' u.k' uN\_u&x2b_o{&xR\_uN& b_o& k' uynHcf&h8Xk&hujk' yu*bXHf&vJ333327653#"5##8EΝ9RJ%2:8}0qhwXk' u1/h&Qk' uf&vk& ug&!k&$ ^Tf&D!k&$ ^TF&DoJk&( \}f&H'Jk&( \}F&H'o%k&, f&%k&, F&\uk&2 bof&R\uk&2 boF&R=k&5 f&Udk&5 #F&Udjfk&8 %f&Xjfk&8 %F&XV&6+{&VZw&7o1&gW6R2 >54.#"57>54.#"632]XLqKF_38@Qv;!2QP(vzS"$yhv@.5NSk7@])U_!OBN-6O'8Xqj1nOc{05>54&#"57>54.#"5632EUx9 E|fCxK48Kj5.IG$ghFIVK&h%+?DV-JVEMB5@!,@ ~υ*CZ\0qHk' u+/k' uKjVe!4&#"!!>32e^jm;>'%~oKN4t%-%724#"'632#"'#67&'#"32!26&"-h*4X|u+D=$>L׵<0$DxEEx yaGyl$>40/-DsX!!#+532767!5!LSZy'b+"w#dl7,dX9`!!#+532767!5!MSZy'b+"N``dl7,d!k&$ ^T1&DoJ&(2\o}{&H2\u' 'j2boO'q;\u&2' jboO'q;\uk&2 bo1&R\u& 'j2boO'q;N& <;X&\1t %724#"7632#"'#67&'&5!5!-h*4BX|u* J[N) y1BXl}7&%t{/%724#"7632#"'#67&'&=4'&#"!!67632$R!)$Fd{]!u ~;I?##0T`j y1BXl+5GQt`l3!3ߨot1$%724#"'7632#"'#67&'&5!5!!!!V$S!*2%Fc{^"t ~;I%^j y1BXl>XR` ,@    991990%#!53265!5!RbRN+nT-26&"&"2>32#"&'#5#"323KMMKMM%e?Gi !hG?d&DD]]baab40]]SJ{-&"226&"#"3253>32#"&'#KMMDKMM&d?Gi !hG?e%DD]]04baab]]! !!#'#7'7'3'i<ʢ\BC-Z!,UK2bs{s[q^??y?R( &#"# ''&5!27&'3267}jFUן:>.UN$!7RLL_$$r1y Ms~"&AF''7&5!27&'3267#"'&#"?&ZS j&*=MUBJbyB uw9 ~y!Z9:++~~ !3#!!#5(vb !'!!7#7#٢/`4TTb_rBsI1\w+{1.#"#"';# /&'32654&/.54632QXbd T}<肰 a^gjKQ_=4598P2&Pۭ s7:<98<"&9`!;# /!j3-<肰AiN`);PۭV$"#"#5476767637$!!!264'&#N+0!K0DVpz==p$0 "MB?~m66'!2)#533264&#32654&+3}}}p_ančqv׽ İRPSff`wyjg53!!!3#! '&)265U''VVvyzwRrrڇ&=pp9 !!!icc!+!! !&5&+!#533264&#k ,!0Okٯ'Lyihz暶 _y+Ni_^{.#"!!!#53!>320M]& zcc%+w&6J`ind{ ,27654'&#"!67632!#32767# &@B.,Nt@@"6RTdր~44dhccj`pP**fL--XWq}J((ʵ^]1G%$:(&xY{5!!5#"763226&"5$/JKelkZHGlnna114/.DxY{%!!67632#"'&&"2$/KJeklZGHblnn_a11䘘/.ODw $9@h  hr!t2! 0%22991/04&#"326>32#"&'!463!#"Rl__nn__lh6Ze.ܵ3 !"&'32654&#"Jb$ZS@RUB'++*, 7;9:s/}-%32'&#"763!"'"''47&'&76!2&'&#"96SgfQ=ZSTS@MLR9Kr]G&A,7MM$26&"7!;#"'&=#"'&32nVXX"-5aHH%<;QdbɺG99D:Stnlka110/.FO#26&"%!5#"32776;#"mVXX%xQ˽H99+EHa4Dab40/.]gl75Xy{ 703267!57632!"&&'&#"ke vԒ <<;\}{?@ . )991@ yh hr9905!5.#">3 #"%3267\ekfv)'spex w x:? **'twzq{ 332767#"'&'&'&#"67632?;#"'&5_-HN10 w@A;hUYY^`___5!Hq; ?;:n,Q`ƟVv)?!"D07o[t(<@! h )#"h&r) "5)190467.54632.#";#"3267#"$jvyi;vvshydvn8yd"B6,@_B=T/$fk{(\@! yh#) y hr)& )190 KTX)@))848Y%%]!"&'532654&+532654&#"5>32)boXrq2uhzy]=p"#(YO56E1>W0{A#"&'5327654'&+5327654'&#"567632?;#"'&5'Cr?@wuJTCNOUH'NI/&XK1?@&[R>fZPOEi>  !HZ<0=JJp\["TO E.)  O.N7o[$ley. !27654'&+5327654'&%672'$*F(5:&J@*?;9Yon:8<:nmY%?H "J7#"-VWbLHIGgVV=LX`%#!53265!5!!5!3#RbRN+nV ;"32765#"'&54763!3676;#"#!"'&'32765Y1200\Z12;HG]lkkl'RW|*TONOKHHIABwRROPRR:Gb..⡠rv..!6MM|VU`*%#"'&54763)!"'&'3265"3265.=_mnnm.'VPQQMJJJ[f11_[fb\⡠!6OP:7_%%#"'&7632&'&#"32767'#5!7]edk򍍐`YXOQPQPQPMN'"!e2(1YXYY baoo ' !!3254g> CCN}V#L~||bo`%254'!!! 54f-,,CCW;HJ9SLJ*^!32765!!#"'&#"#NP--#jQQVy44GF}\]fij*!4'&#"!476;#">32*#"NP--[Zy'dRjQQ)y44GF}@kln]fijV*(%4'&#"!476;#">32+5326#"NP--[Zy'dRjQQSZy'dR)y44GF}@kln]fij)blnjh!!!3#!!5!5!5!!fDllܐ@`!5!#"'&5D&&fmnl.-vxjh` !!5!!5!llbXz*#"';!"'&=&#"567632!5!3276xJHHN6>(*bZ\NJNHJRNG=FDF+<77llu:?= le"&#";&;!"&=#&'&!5!!;2` 3RbѶ{@'N 028?pno)b̜rD^%!5!;!"'&N*(b\Z77llH. !;#"&5#5!!#"'&'32654'&+V$[=J휉l;S<5ssMNNMGEgm88n~Nn`L9 !qfst%)58jcf54P`"%#"'&326532653#5"'&!!fJ78&d((d&7788pGDdd<w1}TV{1{VT}tB&')(PV`"%#"'&326532653#"'&!!fJ78&d((d&7788pGDdd<w1}TV{1{VT}B&')(PV{367632+5327654'&#"#4'&#"#367632!32K77GJc R""133267DDpF#"dddl77~)*+-y1y-+*)~1`tD$'R@F{'!54'&'&'&#"+5326=!67632 &\55ZYzRB'CKK[Vo77#WVyv\pb./DF{"4&'&#"!!67632;#"'&5&'U<5'CKLZRSUuY_-HWK`b./wxj/.vxY` !!!!xI}`uubo{ !7632#"'"!3&'&!#3276bzi<. % .5!!5#"'&'0L^EE&$,XZv<::45,,! >&ln`45327676765!!5#"'&'0L^EE& $,XZv<::45,,! >#9/u`45MV`%327676765!;#"'&'#=#"'&'M0A@M]FE& %()d'yZS+YYw<:945,! >&66n\67lb)`45V{.#"!!676320N\FF&&*ZXx<994+,,! >&lnR `45V{!.#";#"'&5!676320N\FF&(*f&xZ`&*ZXx<994+,,! >&ln%77lp7`45J`35!476;#"!XZT%%QP! KJ`35!4'&+532!~$$VXZK !PQhh`+!&'&'&+!! 32?674'&'&'&#*9  4'$lwxHFX>W) 1 +B- m WF`MLtDC_(:% A` "#327654'&'32767!#!!OO['(('%K-+%k322?s99nnf HI Ga/0!GHoKJ`V({8&'&#"#"';#"'&532654'&/.54632QWXXb22 TKJrq?A)d'yZ[ade^gj&%Q_^_=48P2&TUVWS)7lk7<98"&[Xv!#!53276546;#"T\c()Ccl78ʜ@[Xv!##!53265!5!!5!546;#"3R[bR)B/JblnNʜ0A[Xv!&'&+532;!"'&B)(c[T@}87lc;Xv&(%;++5$!346;#""#"67638t K\24@5Hi@`(Yl ʜ@L56TJ`!5!4'&+532!!~$$VXZ>K !PQVJ!!;#"'&5!5!%%TZXDK !PQ>Xx`!5#"&=#53!!!3)32760hRR&:&HDNP,%J]f/yhF;U|`&327654'&'!##"54767#5!&@+99^_89+@LE86>OELQskXWWXksTH;l:pAT}`$#'&55#53!?27654'&/A;0}}o[Z%"%`D=/!D;lyx:yƩ 4aXksTHP`3!! Pdid`j` !# # #!!ӄ`:676;#"!! ;RSvwZ**+ٞIHo<)D`!!!DOQf`Yx(.V`!!;#"'&'!5!FN(*d&xZTN``77lbv[`%3276'&!367632+'47!5!R'& /62]N N9G`v[0@78nHc`! !5!!"'&'32654'&+7yNqMGghhfa``]KK9 !qfst%)6jcf54eHl` .&'&23676 !5!5#7#$!2&'&++ c4'xMqNFet ;K}A U4X9 !qfs.( #-[H*4+32765&'&#"67636!XTN33YHHFFDIIؽw[rLG`Br+*#Ӆ^+!&'&54762&'&#"3y[wأIIDFFHHY33N ^ׅ#+rB`GLr+!'"'&'327674'&#XB[wأIIDFFHHY33N3^ׅ#*+rB`GLrV+#%32767#'&54762&'&#"3YHHFFDIIؽwwأIIDFFHHY4`Br+#Ӆaׅ#+rC_7 *32654&#"47632 '&47632"'&EWUyxvyUW䦥.#"1<"Db"#6^^aa5'''/-6L&&wZ` ,@ hh  !21/9032654&#32654&#%!2#!^^^^HNLJSNdn33320203፛Rsjley.% !";#""'&54767&'&547676H F(5:&J@*?;9?Yon:8<:nmY-kl%?H "J7#"-VWbLHIGgVV=t=+%#"'&7632676;#".#"32767'#5!^ddk򍎐VZy'dRQPQQ'!"e2eln10YX xY` !!!!!!xFUF`k1^Wt$!!3+5$)3!5!&#"?676%8tFZҽ4Ni]kb)+VSk ]L@6hVh` !! !7!h@D4d$V'``!!!D`FVM'%#"325#476;#"!26&"*;9HɶR<;&IHa6,+XX+[1/0411aml76e}\\D\?&327654'&#"67632;#!5+53lTN34YHHFFDIIټw[ rLG`Br+*#҅^p¾?&5&'&547632&'&#";3+!5#53#[w٣IIDFFHHY43NTp^ׅ#+rB`GLr¾3 %(26&"73!!!+5#"'&7632 !rBBr!կa,-=s?@A@w6++R\\D\SL`ۦa11/.~@ 4>!#5#"76323!#"'&'32654'&+26&"Z>?=;9:7SX--Xe! rBBr {ab4/.]SL9 !qfst%)6jcf54\\D\9<%3276'&26&"73!367632+'47!+5#"'&7632! rBBr ԯ 8/yz-,=s@?@Aw6++R9Gi\\D\SL`v[0@78a11/.~B/I&'&#"#"'&'#"'&5#533367632532654'&/&'&547#3b1455;2`-,DD<@?@56(G998U:=<8>@R0e/.3=48H:'SUVW"(PQ>½K3ZH7<98"%RQ0*K !XH&.35476;#"+532767#"'&5#53#323(17~;563NNN0Ab+bl7.bPQ>CK !Qs3<G367632&'&#"763#"'"''47&'&'#"'&5#5332'&#"#;&54Y6222'.-2U]>e=x1$65"!XN23-)#,7Gr]G&A#(PQ>J9K,K !JX3;>32+5327654'&"####535476;#"ϮZ?`0176~H<^ϰ32(b]fikTkl77z45GG~NNN04?&'&#"#"'&'#"&5#5!;5327654'&/&'&54632o0545;2`--DD=?@A}nb;:x9> Q1d/.999=48H:'SUVW#)`77H7:98"%RQ.#5!;!5!!!5#"&b:aaٯ~n`77`9 333# #333# #9xyyy޼yxxyyy޼yxsPTQ PTQ %#!#!#!#!>)>)8J"332765!!#"'&54'&+5328""NO/,$LJjPR**d&xZV^Vy44GG|\]33ij:7lcQV)3327653;#"'&=#"'&54'&+5328>@$$BPaJHxUA@#!PaHE^VyhGF}˄nlk}]fij:7leI#4&#"#367632,2300De443i~D:'(Fh5;<I#4&#"#476;#"67632,23;9M@400Deh3i~D:'(Fa<=~>JL4vjK+532765#5!5#53Ktʖ?zox~J~rU|&'&#"#367632|)*1>*/ 99L, $"b !<>tb6 U|32767>53#5#"'&'U)*1>*/ 99L, $"J !<>!b6 "32767>53#;#"'&'=#"&'))2;-, @N:5rM&J!I #<>!8~=7{J6: "#327654'&'3276?3#!322:l0]j! (I%$FG()|)7((?Y**t 333# #ޜUNLWWV=F+5326?33&45LL96ŤYY((}">!bitfLL2764'4#7&&'&6vTSSTvt'&l&'STTS0"'&4763"vTSSTv6&'&&tSTTS'&l&'H327654'&#"567632#6}1!!9g..--,/.iyLY;m8@+'6%@  vJyQ5H#&'&547632&'&#"3m;YLyi./,--..g9!!1}8d5QyJv  @%6'+@f5@ 91290K TKT[X@878Y3#'#Ʋff5@ 91<90K TKT[X@878Y 373Dzx @1@0#ǽ+-X [@1@0#ǽ+-j&)^0Cbs0v6`!!he|6`!h|&`cL&`dL.j 533##5#5J!5!J>մF;1L R@ ] ]10K TK T[X@878YK TX@878Y4632#"&732654&#"LvwwvM67MN66Mvvvv7LM66MMoj@  ] 1/90!33267#"&546-5%=2&M(6_)r|7GF'1 \V5m 9@$    999919999990K TK T[X@878YK TK T[X@878Y@M           &]'&'&#"#4632326=3#"&j7 +$%g^$H)>%$'g^$BT%>;+?:)=f2%7;!"'&7r&&iNBs87o[ 5&73733254؜}~ztoق2SFEE['#5!;#"'&z4?ʆ:;~J>~=<J..#"#"'&'532654'&/&'&547632V4p8?@6d20IHADDE>.8(.Fhb[sTr..> Lw)=f4@@o]991<2055]3#3#Vfxfh #ȾD'f###£׮fxx 'vuF >32#." cd FJKE2@10!32!525#xxz#3$5zyz;f!#!fN'CN'vyo#5353#&M33##ٽSC~n!5!#+1532654&'3#"&CI'1 \V5mR2&;1'M(7^)s{6  "&463"3\\%22% 2%&2V53533W;fN#5!##+` #53533##SG~5!S+G/X/ %+53276=!/[Zy'b+)#+ml75}V 75!;#"'&#)+b'yZ[)}}57lm2(1000]!!-2(@ 1<203#%3#u D  1  0#"&546324&#"326D]\\]3%%22%%3\\\\$32%&23t:@10!#oo3!@   ]1/90!#"&'532654&'97{0e5-T$:A*.>j/_[ .(R<o?x j&#ǽD-&#5##v@#"'#"'&'3276732767y0@k>=k. MPMG@FF0:m@ 91<90 373Dzx@ 912903#'#Ʋm> @  ]]1<0332673#"& dSSc EKJF@ #."#>32 dc EKJF 7@$    999919999990@M           &]'&'&#"#4632326=3#"&j7 +$%g^$H)>%$'g^$BR%>;+?:-j&10!!-wڼBXy+ax5!x5!'uwy')?rs 0526544%22%\ 2&%2-n3353.vJ&!5#=n@67632632#&'"#&'"y0@k=>k. NONF@FF0:map '7'77h)!#532654'&/&'&5463#"$ 9?, ;? 'RRz .!RSz#: &77;1v $#&'& #&%6iy z 3OG$%%$GN(tf3AntVH%#AnHV #"=3;X3Vhs' fv-; &jf'yJf'yHf'%f'Uuf'f';wf' &!$}%XL!)! qi0/=J(s=H+\u3"326&! ! qhhqrhh  \  xx%,u.!)!!Hi+V{0wX1H )!!!!!HAA!\u2HX{3bx !! !!o>nZw7<\u&.67654'&'3!35&'&547675#!QQ[\ww]\wb#QQ Uk?  HJllKFFKllJH=?kU;P3!35&'&!!6765!wwb'@'@'a+~[##[ą+ZwF@$    OON N 9991/<299073&5323!>54&#"!Zxllx)QNpgfqPR'm8nȿm O֦M%k' uk' u6f&f&V/f& f&L& 6y(7!;#"'&''&'&7676'&'"7A$DRfQ1*5ʵjpq$A;::6GElT =$,9xУ[[RMBVo!%!! 5456'&E,rbbEI8    8V`!!&'&+532w)n*&*Pn]o(vVH JYbo!%/&547632&'&'&#"32#"76"326&G~}cTy `&ZQh:#?;ixxijxx)?NM ",f=KJtV##52764'&# !5!3T][TF!;)l MX[TL&DV/{!4&#"!!>32/ENO[#jTzi~`]fao(&'&"2767  G -<<- -99- $wppvvRQ`;#"'&5#5%%T:NZX` J!!PN`sP ! !'&'&+532)''^p_o<q-wJJXT`w/x`67676'&'!!!@|8M6P3E.*{2'Z|u4@bY|rNįt`V#$! %$47#5! #52764'&sl3S][TF!0A*R LX[TL&bo{R`#3267#"&'.=!!#51F",c7Or`? " VX#sVw{  #"&'!&"2Z6lnn{]^SDV*}$%#52764'&# '&!2.#"R^\SF";w&ZS@RM?LX[TL&9*,7;WGb`#"476)327654'&z(C$=8\]^r'J`!!;#"'&5!%%T:NZX`K !PNL`!"'&5#5!327676'&'!ZXJ9g>  L#7&$PN JB7gLGةAVj!2!$76676'&&`rkjs+*Z6j{4V@BsSV}dxaM>HV`'!&'&+532!;#"'&Cz#%&OudgRPC)#%&PvgdSr6LJ<mLJ>EV`%6!!$!!n$nn$n$d 3V@ O@`3676!#"'#"'&7!2H WlrU11UslW H86*CqSSq61&jL1& jbof&Lf& @f&p$ # 76'&!"'&7607676"B ws6Fqn r96$(-k<`zt ~xim$ $6'&'&'&%6#"'&3676g2DTGjЈ ۞Q;^{/G/z xGCcX}վUjNk"!4''&676'&\+**SJtxLGkeJZ vV "40z7/cT$f'O"k& u:V'67!!&'&4%67654'&W$dTܢe)FF6$&EEj#U mi$a mE+_q!v+\u!`#5!#'$'%!76''iKJ#  9$G@F=#- t 4`/'5&'&7'&7676'&#"5677632y&͟2!/65F\8R~ 0=2C\gO\ 20R[Fk{ZsB="20BPZPa|bl\Vu "326&!&'&! hqhhqrhh!ܛ\  Y  `*~xƇbVo{ "326&!&'&32hixxijxx)܋^[Jha#j=i`9 $2'527654'&#"76)!8b^\TF!;Ÿ|DRfa\T&(%xyǬjZVt`""#52764'&# '&76)AMM=nR^\SF";wxM[\ILX[TL&X) V"%&7632.#"!!#"&'53676y~fs7+P'R4F7czc<;7W RS; 4`+6'&#"56776327'&'&7'&765F\8R~!0=2C\8R~!/6sB= 20BPZPa|blB= 20R[Fk{Kw{!3!! ! #"&'$&"2 "Z6lnn(S]^D%}FXRM\u!3276!&'&#"! ! @Q )4qr4(_ 4rq4  _xx]ΔKyyHxx}$%# '&76!2&'&#"!!32767FYPgZTSS?MOPL.7LXGIC9*,6[5XfAZ;%}%7032767!5!&'&#"6763 !"'&CIGXM7.LPOM?SSTZgPY9 ;ZAfX5[6 ,흜{Vw9&V{ !!###V`b'+%TVV{ !!!#!V{}'%.Vw{%!!!5#53! #"&&"2GhhZblnnppS]OD9703254#">3 !"&LLLLDU.>U+HFAAFH$$rr$9'y29&6yEJk&N uJk&N uX,%+532654'&/"!#5!!6?67632ڈbR#`)GG" -ݾ+/5^)Q+nz3%  D1C0$ 5iXk&L u9:@!pop op nr! 2210%# !2.#"!!32679AZ>.]?6`<IJ+"&xy'!2UCDV6%,%k&? u+K SKQZX@88Y1m-%3264&+#+532>!32#6%tt%% rFhn laaZѰ+o'%3264&+!#3!332#6%tt%Bn laaZh9'!!670767632!4'&'0'"0!#"+/5^)Q#`)GG" -ݾ0$ 5iz3%  D1Cuk&S uwXk&Q uk&\ H 3!!!!!'q'/+B!${3@pp p d!   2<99991/0%32654&+!!3 )yuuyn5kbyyb'}%X@ pd1/0!!/(m@p dp  1/2<<0 KTX@8788Y@  ]!32645!3#!# 0d*P~ `3Uc5/BJ( u@   <<91@ Bd /<<2290KSX Y@ I:I:I:I:I:I: <<<<3! ##'# !MM dv_}LwX M@  %d && 991/<2990@  ]KSXY"!!!X^+==wXk&Q u.H1@1@ ppd/<0@ ]+3267!! \ _c fѰ+ aoM+V{0H+\u2H@pd"1/<0!!!!+/{39&Zw7+326?!!>uP:a(71<1/jl#|@:  :: <<<<1@p dp/<2<20 KTKT[KT[KT[KT[X!  @878Y@ 00 0 ???]!5&5475!!>54&'sZUxsZVwssffpҏэ;P G@ pd " 1/220 KTKT[X @ 878Y3!!!3!P'q'//Beg"@p d  21/290!#"&5!3265g%¯#|GbVI3VN @ dp:= : =: 1/2<<0 KTX @ 848 @8Y KTKT[KT[KT[X @848Y@ ////])33333..Nw@ d p:=: : =:1/<<<<0 KTX@848 @8Y@   //// ])333333#zB000%32654&+#5!3 !5)tt)!5avaZ(%32654&+!3 )!'tt  yavaZ+|U,@p p d  !  299991/0%32654&+!3 !ytty'n5avaZ9!"63 !"'3 !(횒.>Ҩ(k|HHrqHH{&9@p"np r%pd:$ :$%:'<91/990"36766'&!367632#"'&#2:**),4"(,"'shdWgwoeloyxwx y"uSA@ ! 291@ B ppd /<90KSX  Y;#" .54$)!#tnntFK٢m_^#˱+N^T{DAoK ,5@* .$)-21@ 'h!h r-0632#"4/&4767676%6"32654&n&0u6$ZyU3ixxijxxK #of=4 JIX@ RwZ` ,@ hh  !21/9032654&#32654&#%!2#!}vv}NN@SNdn=FF;0119ۍSlj`@ 1/0!!{`?`l@     1/2<<0@  ]KTX@878Y!265!3#!#(5O{XF^VU{\}{H`u@   <<91@ B /<<2290KSX Y@ I:I:I:I:I:I: <<<<3!##'#!HH`WVJz1zU7{&>@ $ '1@yh!' y hr'90#"&'532654&+532654!"5>32YOsuc{rFTUs=w,1(TT56E|4}qC` ]@  74 221@% /<<990 KTXA @88YKSX@ Y!!!C#e`5`5CF&q`Ei`/@ 1@h/<0@ ]+532>5!!; _ dPQPIVz` @  !  91@  /<290@  %KSXY"K TX 88Y KTX @ 848Y!!# ##V```q7s/` %@  74 221/<20!!!!!/#=``}bo{R/`@741/<0!!!/`{`Vw{S%}F/`@ 1/20!!!5/`{;X`\OV>@ : :: <<<<1@t h hr <2<20&733>54&'  FjjFHjjHV..gs77`[a` %@    7 1/220%#!!!!#=#`{{$a!@  7 421/20;!!#"&5!\k"޾+[;3N` @ := : =: 1/2<<0 KTX @ 848 @8Y KTKT[KT[KT[X @848Y@ ////])33333`{{:`w@  :=: : =:1/<<<<0 KTX@848 @8Y@   //// ])333333#QV`{{{(`3264&#'32#!#5!FInjjnI^=;۬`3264&#32#!!B2jj2m%=;Z``$`$@h h 7 4291/032654&#32#!{njjn{,=FF;Z`%{"'3 7!5!&#"63 ő.#5駄$V ur T8{ 2@hhr  ::: !291/0"32654&33676#"'&'# ,^c+8T\k"BnmVf½›t`Q[ڔu `T`@@  291@ B  /<90KSX  Y;#" .546)!#nPPn)+y F=<S\}f&nC'\}1&nj'Xw53!!!>325654&#"!#K~R[i\L]fn2Ƭg f&lv%}<@" yh yh r 752210%# !2.#"!!3267%Jb&ZS@R|_UB9++89*,7;Ug9:+{VL1&jXRM` 3264&##+532>5!32+.2jj2v , dPV =;PIZ#`3264&#!#3!332#.2jj2+ =;!`}ZB53!!!>32!4&"!#KjE\L]fJyhf&svCf&qC';XF&|/` !!!!#!#>#`{%32654&+535!!!3 )5)tt)'C5avaѠd(32#!#53!!!3264&#F^#nInjjn})=;\uabo{X@pd1/0!!!/2@ 1/0!!3N{`:/X !#53!!!هhM\` !#53!!!݂h6X!2+532654'&+!!!5~d+QڈbR#X5inz31RX/`32+53276=4'&+!!!QQY[qb)("%LxihӶjl77|14k` 3 !3!3###' L MMv_  Bd`3!3!3###'S'HHWWV%z1zU}oL&Po7{&pu3!#!!!=#'N)BN`%3!#!!!)#d%`cX `T`}^%!#!!!!!3!'q'h9/`)!!!!!!!#=#!`}qN 33!!!#!N;DB"]N` 33!!!#!NC8`zro9&uZo%}&HzZw )!!!!!%1/` )!5!!!!!B<9V`!!!944b`)7! !3#!#35>"#>3Xw@@9V`!!3#!5#535944b`)>۰>!# ! ! !  V11XB%!7`%3!# ! !!5VVyHNeg!3!670767072!4'&'&#"e#*/79^)Q#`GG.-f2$ 5i1z3% C/K%, k&O F&ouX !!!2+5327654'&#/'NOUW.QZ[ڈe&)#1FN5ool77~/1X`!!!32+53276=4'&#%`c QQY[qb)("%Lk`}%ihӶjl77|14XH%+53265!!!!!H\[ڈbR'q'+nlnmh9X/`%+53265!!!!!/Y[qbR#=#+jln`}eg#"'&'&5!3276765!!!D+/59^)Q##`GG.-#0$ 5i3z3% CF$a%5#"'&'&5!;!!!k+# 7sk"e[3=! '!!k&I ^TF&i!k&I u   +@  p? 0/   ]1^T1&ji{Jk&N \}F&n\uQ\}{\uk' u\}&j k' uO&jo}Lk' uP7&jp ynHc`8wXN& QC&qwXk' uQC&qj\uk&W u +1bo&jw +1\u-bo{\uk' ubo&j9k' uf%&jN& \;X&|k' u\;X&j|k&\ ;Xf&|egk' u`$&jX )!!!!%3` )!!!!!`B(k' (ud&j}LRt\u4ZV;{T:`ZG%!327.'7>5!.'#".G'qf 4.'7%F"k|;'p(L" 9RZ< +2Cbo!54&"!!!4> ^qq;| |;CppbۍCC!!#!#".> 4&";炻x9;| |;qq8O3bGΉECۙVpp`8[@#!4> 3#!4&"!!;| |;qqۍCCۙbppb| .5!!!26=!^;||;' qq''ۍCCۙppM"3!>54&#"!5!2!k'QPsy:[?! ʇC$P^KG^苵%NyT<1@WE4pa 3!!!!p'6?bo!54&"!!4> ^qq;| |;Cpp ۍCC+(53#".4>;54."#4> 32>=#"OWW3^[01\QkBjiBA DŽAA;( k?=Ckp:2ks8CiF%%FiCۍCCViZ/J5`!!!3# .>;"265';||;9x3O8qqbۍCEЍG#@[8`ppVjf!54&#"!!>32fqfdp'.j?|;1CpykzpC73!!'w/N2>53#".5##3 $0! KjkO`58K..K8_|t77t|#+<33>32.#"#".5467#2>54.'#.6~Q*`XGKX^,0W(yD8X}gҀ8*(f 1ac4W*,?eF&  4&dֈWsS-]o^f_[,0^\Zg<Tjf!#".5!3267f.k>|;'qfcq`Cۙ1pxl@%.5467>7!#z5`I+qvaTaͻ-#F4@M/BdROD\/oqh( -G <%267.#".'#".54>32>54."!54>21X0/\."('XH1V& ? ReO]33]OXO!)!>WlZA$UĒU /#()H)v8z@0Y)KB*RyPO}V-;5NckX% Qh?C!4> 3!4&"!!;| |;GqqۍCCۙVppG&>3"!".5467>7 3!?T&Xi}KCqS.TQ'N);5B;,EpP+?s_AeHNB}< a(#2!!# .5!265;||;'qqVۍCCۙpp28#".=!32>54&#!!2>54&"!4>2>NJŅE*:U8?X7wp[0C*[XD|Ү}FRH5O4bML\ )L:#$=S0_q1@#TOTUcm:;n_m&I^m! .5#!26=!;||;qq''ۍCCۙppK32>=!".54>7.+32%.#" =Wl[@$'RƒSBfx6:90 ]BIJ! %&8\C%^gV%#ThBF|Η]    ~ Jjf!4&"!4> fqq;| |;RppۍCCM$.#"!5!232>Tot:[?! ɈE<\o2%L&8]C%%NyT<1@S⏃қeBY6| Q4##54>32#4&'bU@֖ك8X`AxhݞXX݄iHA2>54."267>54&#".54>32!!!>nS04\c;.'3X( SL]S-4Uyh}4*TV%'Y%Ea<  'XWQ!Fg?7Sc,*!!)J!FS 7GNN#9~znT1eT2K!3#!4&"!4> qq;| |;bppۍCCjf!265! .j'qq';||;'ppRۍCC!3!#".=!3267G.k>|;'qfcq/CۙCpxlig?32>54'.54>32!4.#"#".5&=O*&F6!?ax|v[8*FgZy:&9F >1;a||a;A~w{ĈHK\1*G8.?2,5Dc^+`]VA&@nQ3=! $;-4H7.6Gge`yDE}kjf!54&"!4> fqq;| |;CppۍCC2G"32>54.2#".=!32>54.#!3.54>3D''D40C)(C4pz@KO:P2>NJŅE*:U8?X7:V8@y/="#>//>#">.=p_^(Sah.bML\ )L:#$=S0*K8!*Y)^o>pa3!!!p'6 -!>54.'.>75!#IR) )RHIS( (SIg)*gi**iw+Zdeb23aedZ+]ܜVzzV]3.4> #"&'!!!5#"32>54.9wz;;z+f1cْtK+.L98I,,d{EG|cd|FQ6L./M86N0.M7\u2 -7%>4.'#.54>;#".53"3IS( (SI)\nꇱi*,PO, )RH$. .$,VzN% NrK$M˂WiJ''JiWWV, " dI6!#9cf !fxH%#>7>73)PvH1WxHSb9Bn#2(L`?"+9'A~lPf !fxC@)#>32#".'332>54.#"7\{Qgs=*SzP1bS:6& ":K)SsIYgH&7`K8hR19^F %"0 7`3!#zP`+%#"'&32>532>53#5#".!!eK78 !2" "2! mE!@4%pHCde;w1@Q//Q>1>Q//Q@tBM%3V<{%!!!>32!54&#"<|#jENO[V ^ezi`AV{(%#!#".54>325!32>4.#"mldi76h`_$D4K0/L55L/0K4VHMێۗOèZ/0YY0/ZgVj{%#!4&#"!!>32jENO[#jVTzi`^e B!26=!!5#"&5!BrDY%j%`5yh0^eLAV{&!#".54>325!32>4.#"oldi76h`_$D4K0/L55L/0K4HMێۗOèKZ/0YY0/Z )!!!!%CLbV<{!!>32!4&#"323##".54>332>=#"(1_Q'PA(#G^l5OvIEMQm>HsR,5Wq<"5&#(f2(/=}d@%Ec? .I2:⨏f)'JiANsK%5)BkM)=A&#"2>5#".4>;!39N00NrO0$3PnYw77x$m/W~[14\KRMmP,a̚ZLV*!4&#"!!>32*ENO[#j)zi^eHV`!!# OV3#3>322>53#5#".54."< &/6551& "2! mE451& "2" V'7_d>Q//Q@tBM7_d>>Q/.Q@bo,!##".54>72>54./#"aQ[-9D~}D"GnM7UtV7)<'*msXG^؛VV؃Ze P[16^I>`L<V+!265!!#"&%DY%jyhP^e+K7.@!5#".4>7.546?!3:7672>=4.'75I[5aR$.XQLP,G4EvR&%0K]-V3lcRdgVj{!4&#"!!>32j]ENO[#jTzi`^e`F*=!5#".5467#53>32.#"326=4.'Fj^T&'$i2}\ "$! +% )KD<fyC$&#OY#CdA##K^eL]umXi:  0C(cE_>#%SI6h!5#"&5!265!+j%DY3ͦ^eTyh7X`%#!532>5!,^i1E+%+~p39]B5gj#5!3265!!5#"&ENO[#jzi^eV3y323!!".54>7>54.#"'>Ul~D'AaV_Q|0P; 1Rm +{QV-!".54>7.546?32673*J8!2EPY.1\G+39xB#/?9#T2cF~kW=!;U53yz2)E_:?:{@"G1?8xf$*#PV`+#".'#"'&32>532>53_6!@4%!eK78 !2" "2! V6:%3HCde;w1@Q//Q>1>Q//Q@VGy,D3!!".54>7>54.54>32%">54.G9ni)C/&|1P: -=$!)>H>)MahGF<(','O_2/H`c'G=1"9J'$RVT$!G&1J??OfGSl?7jX/>")@5/18#(1RsZM,%G7"u\{&"!!>32!!5>54.B-@)# 4I^7\X*5F'+<&*F+H`5{`*G5FuRPl+0enzF8gN.+`XaVp!#"&5!265!pQj%DY%P^eTyh7#Q{+!#4.#"#5#"&5332>73>32 "  mEo "! mEp>Q/)H8tBM1>Q/)G8tBMV*{!4&#"!!>32*ENO[#j)zi ^euX[}J`%!!%`QV+!#4.#"##"&5332>53>32 "a5o " b6p>Q/.Q@D?1>Q/)G8ACAV{*%!!!5#53!632#"4."2>inn$\`h67id,4K`L55L`K4DDOۋۖNZ/0YY0/Zbo{R*V#)4#.'7".4>;"34.'>-hByh' @CH(]c34ii~i-QLGHK.N;9N/A|Θ[Y'?V45I/2Z~Z2FNr.x)?fI- ;[w.%!5#"&5!265!j%DY%^eyh'!!!!MM'-%'-/HŞߎ;<;m$/#4''3767653653#"''##53+#*L&   %,s$ۻ44`OpR3&#]|0q<* S3E{;m*532767#"'&54767&'&5476'##53B4V53Y31*"@GC1.N@?G?2,2&!e*ۻ44`m|&z-,#-/ F?n=@;#v{ =TBV\L98FGDC+P=YNc-%57&'&54767632&767h8@}SnZdFG+9:H:Z?LWaKaKQ6&Xs%#4FD7CARXL%5,iGec50$ $*  ,$ QB]WEfnf`-Sm\daّ֔w<$6!`]]T'&e   %327654'&#"!#53!632YM,>5M(N365%65!"'&'&7!3276M 20yl$.0`UZkFOIij﷯\HK\ssj1+-3<,276'&'&'&#"&!4763&547632p1& 04Y2xAw~M`b|_'7&':&4Of7*g?'H-8XD&  %"327654'&'2'"'&5476).N(@A5/VǎQ%T=1V9>( <6-T|PQ#JQL  &"34'&!5 767"'&'&5476326LG($L:0 ,*F94D\0('3g'm8h"(uA~b7S:(05%5%0ppV05%0p*%654#"&'&547633"'&'5676 &$ 50?4M_/?%M(=tVF,*#$!4D\0(%3g1+k 05%0p(#'&54737676537654'3'&x=Es7" ,$ 4G +@&#^2$NQ2omb}8>#&!RY$6,It5\ ;! 4&"2>"&462FhEEhF2GF34FG732767#"'&'>|*631N:B6^f:lq=& )L0-Av84373^^F!!Jldx )!d&..l> 1<>}x!'!767!!"* %IiB=t/)ut_ptmTTPf>x%!!7676537653#"' D7Cx<,2/< F(9y-8 {)[D >2%,*1lL6 x*32767#"'&54767&'&5476`iST0PQNB6fpkMH|eepdOFO=4x!6E'5 PN>Q!S#!'%}pmrh/>5lwUflx "27654'&' '&47hP5<<6RNLZtrZQ[[Q꿻܆&zBx!'# '53 JT[10xN|EeF22Zzx!!6767!Ym,fJ Nc/n?5&<eNRa{oZzx!&'&'!6ZlfKMcЯo>4xhfNSa{z|x&'&'&7676!&'&#"ЈZDgvi\6/1vIF1>3#""@:#GlocyG O%(H'%s'J 3#3#!!@V ^,,6767654'3is$Kpm\erPO``Nov_E9!# VI@L !!%goqgpoUU 57&'&54767632&#"7T "$C5H@&a |H&    ]l-%2767654/&'&54767#"'$47!&xH^'45!"1K79 ~xhWohpl,&y1l".BX6]E+//193J<01)|n]30 b,@^n@ _' )7G%63&'&54767&'5#"'&'#"'&547!%27654'&'67654'&#"9"*%D(3?=bf^E=SP8C!N'-_"x>fy(&547632&'327#"'!! x\$Jk jܤx3767&'&547676&'&32704trzV`jXX>+a?,Vv)krm!RA@!JYZzxZzxz|xt'/333#!!67654'&'56764'&'xxxfy}lvQ&69(L5./4N0} FR~ TI - *hj.! #$>s{%#"547"54263 !4#"游ʑ,Lۖf7pQQuYl)"2546632&# '%7654t$P{R~8:tqu;;=MkČG:.j)y}47&76$!4&$'632y*, N~j+8Hu]6OA$,Ll^ȨH 463 &'%327'&32'4:NJ*!y @?Aquxs  A@@?K &"32654& 76'#5432!"!54n$ % *+C{aKKG 5"32654&"76767$326765! 54%7654$ % #t}Q҆em0o %"%Ƀ@<@BDkQcC;;eo">!fkz 3265!$'&7&5!2#"'3jj~$,*Xf,_b2O6hKM{V{$"24#"54$76Ȭ)kyx5 *%"32654&"&#"2#"5!23263!4#" $ & *|H, <8@>"&Y %"%ӎPW0n{$"272#"5"547663 !4#"ՀӨ9y6ܸu3I jdmbJS~ +"32654&4323254#4%$7" $ % fz3%:?( %"%Hھ|XsEhf\[K24#"5765&5476325!!"'@>]J*uP]#8Zs@0[2JFfHMM}T|"247&76325!%$ԛ% &xLB}T"247&76325!%$ԛ% &xhBT0 A"32654&!"32654&"' &54323253325&74453$ % $ & TeTXXTМЀ %"% %"%JJbߩ44ˆ+,@T} +"32654&#"' &5432325332536$ & 'BCTeTXXT %"%3^^JJbߩ44ˆH} ,"32654&2?33253%&'# 47&76D$ % LRZLĒ>%  %"%㩪,-=%ۂPH ,"32654&2?33253%&'# 47&76D$ % LRZLĒ>%  %"%㩪,-=%ۂP`!325!!"'#"543225""T)3Ƅu`,888fk  32765!$'&7&5!2#"'3jj??$,*Xf,_bZYO6hKMd )"32654&4%$5! &#%$&763232,$ $ /(8. <h $ $ ,^$RE?`{<> +%"32654&! '&'&7 3654#"%6#% $ 2,L/-(9X!$ $UzƜ1o5Ox{"326! %,'4323254#"0@@<) =;TYr>0!-553! '&'&7 365# "32654& 54!"CЀ,L/-(')% $ L@Uz!.!$ $6/'= 4"327$"327$7&76365&5632676#4#"%A?A?pƾ6\w5@W?:@@@L@@@E>/>icbX #+"32654&%$%&'&54327654=$ % 骅 AcS %"$36H9Gt6caf5 1"32654&$'&'$6!2327#"&#"%$&76$ %   ph@\†bjC %"%ŇD0tHG_)Rq}]  ''&'$! #"'"32?6+(xsx 8@7YCt N*(mEsJR'^R, '&76'&'07o V@P5)C21skf!4#"! fܺN=  Au f&/ %$ 5 '& [_0~9e}%$ 3!5 54 [`f G~9fP3} %$ 5 '&#'57 [_&&&&0~9e}#### _%$ 3!5 54#'57 \`f &&&&G~9fP3}####i&7'6'&762'6C3217*9{[l僐,.--Tbڂf xm&7'5667&763253% 2AKA |ۺ f@TwdD:0;QF, &'676'&76Lk`W r,sWf-2G)4G^&/'&767%254Gb*gW/A67 *ut7.,U 3533##5#zۺPhi%&767'6&j=DAA566bq ! $546732654&'3.'!'q-(xikvYK@,6\,"H%]x8ڡWedn'6.#32! 6756&'&5!94P54S;9R35C8,Tf[SZ00ZSPyP(@3i*3 !_#bsBPn*-%' 7! %>54.#".5! d}~'3B$8, /6O   /D2# "/--/"Kt/~m V4.+"32>5>7.54632632#".5.+"!4.%' a+%!4" 'AT3]KKcd30a`@eO8$C =cc="8HKI;&m8S89kS2"=U3_.,#CiEE3mxr4&@SZ[' )giI;6BY@-'+#anp*'%! 46732654&#".5 p UQ sghfdXf #fJG_*)*jd_`mjQW8F"Z"76;(Sbnp*:! $'4>7326=4&+532>54.#".5 p ! xgmvcX??)E16K.`q '_^d`r=A?S&P#llUX\XU/H23M5KN'4b09@ m``4#mbp 34&'&>4.#"326%! 467.7! |54&+"#"5!263  D) E2432R<6:!_ IwWPIpl0@$HHLBNy}IBfbmIS ~~? EELbp*'#>54.#"#.5&!2p0UD;?7O18X= B732>=4&+532654.#5 o*/ ~q1N7IXUL=ri_onq$RK<|'su/H3/nwDK-E/n_|#*bnp*6"!.'.#"'>7&546! .5467>54.^֐KX;$ Ji$Q5qj ,#   #?WUdUgn3>~*?l- ! 7*&=0H'Q>DdA dp/4.#"326%# 4>3254&#!5463 J:T45S;qaq&?~}AFn*yoU` WtFEnOkl{Bw6*6^]46bbbp 4&#"76%! $5&63!!">3Jtmiwsjmw& ((0gF 4A37 6!>=4&+"#4&/"!.=432>32(C36A$ 3-?7*2 'G:3D(3a$#W2:uuu;:mhb/Y[lY[0ein:73326&+532674&'$5!#p&#  }rar}l{Nar%PUjk349 !524!vrML6B 55 54%5%q&rd<_C$?> 7C% BhZkj5P6I CRc9Q{R*]FA!>54.+"#4.+"!.=4%2>32 "B9=G"  @  E "HB9I*%^?m$(hL73! 717ds reGuwDL 12iDhqmp@D%# 4>73254.#"#'4.#"#".'32>32>32o*8 p "' $!#-#!$3+*< #'*"*5#5I#&rA/)WRGm3^5sp9T76T:$,% )0( ' C77Cn*S4&/"32>5+".5;2>=#57##54632632o #/&A}v"jH".")8")7"'5AiZ(.dp(;B!(:&lm7,$!E6`RD:AD"bno7%! 4>732>54.#".5!2<645!o 3%~v1R:!:aICN   KF9f#@?A#A3c1sp"GkIwx=8;,(&W"<:@'H 657!9m*F>7$5432>32>54.+"#4&+"%.'&#"5>d&'kF+C0%8% WB%*+4)"^?&2 L$##$B>me_13UKF%J(1^1(ߧGV؅%=/" 9<dnp ,! !>=#".54>7!3265!p 7dl"847!@8aJ7=T73L3qu%u]_' /k{Brjg6=_L?:9!GY3Z]v@4.#"326%! 4>34&#"#54.#"!!2>3 P V^'@Cl-17%*#%Z%#{RlSk?>iQPwN'y  r430RQ np 5Q6UOQSbp/4.#">3!654.#"!4632.B(BH18F-8Ĉ"A[9ch2)4]F*0;! US% pOqJ#z5f?Zu9oP4# 54>7!2>56+532'6&'&'!{PHY[;Ә2P:*8#Qh;sa97!+)]hFy1@X~?ca\NbyAC$O|X·+=8BR"vbp 4.#"32>%! !2J 54.#"4>32>3 !4.#"#54.#">72!".5 6I+>^>9Q46U< 2XzH)PG:&Z%#*%++xC@xy<NuO'!GqPQoF?kJqL')=)QSZ6Q5 pn 1)+8:zM{bnnG32>54.#"! 472>'4&'.'" !!3#},69.,59/  uh5V; `P4=   "1)UU&C11C&%@//@\l $$c]5O5Dn*0V*\bE# F4/T9ao 4&#"326%!".5!>3Jyhluxlgw%ÂA$0oGLц<5anp(%! 46772656&'.'7%!%p@Aqfm~`Nbcd xed`dQU2]3suioU'CH5e)OM>HbpA! 5!32654.#!5!2>54.#!5!2>54.'.53p%ofl      !.'!32'4'#53>54.+532654.+5325&'&'3p0%! F"$ "# F$8F##`/-$ >GbbEJp=@Nbp* #>'6&#"267.5% 7$'okk}mftHj }{ &mC[$#aXXQNv+anp*"% 7326=4&#5326'!%p+*/vgi|roz}|`{jdtjypû d=|anp8%! %32>=4.+53>7#.54$"32$7p&wg4U< !>V6.S@(9=<A!!kZ}}3O55.G/0QsH 4c]ʽdbkoB)sm'#"325;54#"! !35#$! 3#3ʽy&kkk4c{L~fLo* 34&+"265%!"'#52>'4&'#&3$5!2>3##P#3d!&<(+I4bz_[R(yQ\@<<5>:<~C%&z{7Pn8654#"!6=!! 47.x]~hq!":b}^ooNc5=T+(4&'.#"'67.5%'>54'"3SNIm2R:͡86okC/XC.L|n#,m|I'bzDwwLu*.T*kP1 3#3#3#<л~R4#"322"43!%"\PUX]' *Cw;l5{ @32654&#"26=%!4&#"5>32>32+3267#"&'#"&IWY@=?=&2~2=d_A=B/fk{2#"'&'5327654'&+5327654'&#"56763 )HI]hjyTlz2US>hu2@`g#qriiXohib'(@BW  &1E OY"[\pigd %!!5!!!!!%bV{ (3!4&#"5>32>32#"&'#"&26=7326&#"c_uAHv&DX&h+0)5!264&#!5!264&#!5!#GD}TV{1{VT}1`tBMQ!fJo&d((d&np 33#'##hX:8I#3#3!5##3и6p\Dc"3264&#32654&#%!2#!|XHLT||F<>D0\\ln6<F-43/jiQZ nbym,32654&#'32+2n\\nK{zDD !!!!!!JpjDD 5!5!5!5!5!DjpJۑ*5#5!#"&54632.#"326~"6JȾ8n0(dJD<14AGș  33 ## "4RJx]D3!DDN 33###ppޠddonb0 33##0``0 ##3Ƥ`D` "265446  &BB@.H[232654&#%32+#LZJJZĪDU7DC7{{#'&'&+#!232654&#(r2D: `VLDBN'%4 ^DrVf$5>=4##5!#ĺ(32653#"&(FH?GG?9񫚚 333# #DP^4ljdsfI) %"326=7#5#"&546;54&#"5>32gR81IQ"h?yA?B}C=~G/:*3bX ?F)-qeni() |) ,27654'&#"367632+32767#"&*g))1J(("35?xQO! ?B>?B<~G9*20X @fF*qen54( |053#5#"&547632264&"鸸//@yDC~8.,DxEExY]6UUggg @32654&#"26=%!4&#"5>32>32+3267#"&'#"&5.78('(& O ?<&K& O4A^R>em010$U..Y(>NR:p\..+*(*01 F55F vPU! /-0,g_hg45"%"%04&"2>32#"&'#3DxEEx"Z8~y@^yggg4476]g03#5#"&54632264&"鸸^@y~8ZDxEExM]674ggg#"&54632!3267'.#"@J"a`@{DHG?LCJH #ABE?>32#"'&=!.#"327679@J^]WVa`@{D$$G?&&TTRSCJH #@"!#"?$2&'&54632&'&#";#"32767#"'&546X-.:BCLV5DM64'BJt)bek$%1aX &z ,2 33?HS$2#"'&'5327654'&+5327654'&#"567632X-.:BCLV5DM64'BJt)bek$%1aX &z ,2 33?HS. &4&"26#"&'5326=#"&5463253HtGGtH:r:4l:NJYAxw=^TeeTUeeAFC,,2.P'm !#5!#3#53y浵~~Q& 373##&?7w%5>32#4&"#4&"#3>2A.\E??FUG(&pF/0EmE0/FmsA%+-M+532654'&#"#3>32:8L?312_Be333<<~=JfD('Gs^49:<" "3264&632#"hBLLBCLLwhhhh0бO053264&#"567632#"'&O*./6ZaaZ41/)4558\]>65!ef WXʮ " 4632#4&#""LCBL՘\hh\" #"&533265LCBL՘\hh\0#3>32#"&64&"2踸^@y~8ZDxEExb^674ggg93#;#"&5#535.6p~*$~Zz!~M32653#5#"&M+d8^BefwD:OFh]49v!5!264&#!5!#5MAXOkh:@&Y2S;Y\"#"'&5326532653#5"'&;A.\"#??##U$#(&88anF/0EnE0/FA%#3໖s&AdU|YdMs;ds>dbXH} (%32654&#"6!2.#">32#"&'!r]\qq\]r\]S[|v+f`+ۓW .,u|yPNZR:jh`53!5!!3#!!5!5llZXF!5!;#+532767#"&NRbSZy'b+"Ѷ`n9}+dl7,d0#367632#"&64&"2踸0.@yCD~8ZDxEExYs]6UU4gggO#"&632.#"3267/k>8j4)`4ZaaZ6]*6!fe !JM,;2'&#"763#*''47&'&7632&'&#"$"]R4AkA~3'\]]8554)004Z01 * e@4'$W6XW 33^V% (.#"32654&7#"&54632''7'37>BMKAEI J?6(e#c:*FQFXdea7MUzBA=qAHEB$(#"&'532654&+532654&#"5>32`kǺ>F8HGWetJB[UMyVL:[ SH?f2,z&"  Xa1IJ3###53546;#"ٸi*F7~ ~,qW~t]33#+532767#53 ppADp'@v?CB2(#"'&5476;#"'&'53265"326='[ v\/<~g+#, #5!;#"&t4=ǃs~J>~y,#5!;+53267#"&t4=57L>0s~J>~x;:~78yxY3!!y03>32+5327654'&#"#4'&#"#367632@/\#"-.n>3   "#+*$#(&87z8=~J|FDmDFmsA&"#"&533265332653##"&;A.\E  F+*G(&panF/0EnE0/F0%+- (#=4'&'.#"+53276=367632ż &:!"98kM4*0/9e45>R10U{ rCCK{\7BC"4&'&#"#367632;#"'&56&!*/09e445Jj8<0( 1*[s\7BD~KCGn0 33##0lm" !7632#"'"!3&'&+3276"XYXYYXYB&&E &BC&=0XYYXXYY4(??(4-44#+7675#5!#3!535&'76764'&fHm/mHffHmѻmH////=0X@q~~q@XX@h~~h@A^ 44R 44O:&'&#"#"';#"'&=327654&/&'&547632S3787> 5e/.GH()?L99=?@;A!"0Y3i10IJ;<;- /0Pa10.~=< " -.L[22 +532765476;#"5:Ȕ>55*y8<~ Iq,+~ $93#;+532767&'&5#535.659L>28~*$~x9<~8)-z!~"#5#"'&=#533333+32760/Ae4344ƹ-12]4;;ummD'!b$327654'&'5!##"&54767#5!?)H;<#$) /,#"'1%q+-AG%n$#'&=#5;?27654'&/L)%OO|Fh99ee <+&+l!J=XYXDC~D~¯_71P<@/(f3# ໖sG !!!5!V4st{y!!;#"'&'!5!4t?L95ttdJ~=7{y.]3276'&!367632+'47!5!?3;1t (B3_$y)7!5!#"&'532654&+4[1G^AA>x;W\_\jz yP|<79;" .#"3267"&54632BCBBADEAll~hh! &$^ T{&D}k&% w1&Ed}2&%2w&E}j&%jw&EoAk' u&u&opf&vf&HFuk&' Z;1&G2u&'Z2;&Gju&'Zj;&Gou'H'Zo;&Gu&'Z;&GJ&(\}{&H'J&(\}{&H'oJk&2&( \o}F&2&H'Xk&) ;k&I ujN&* 2bXH&JHk&+ /k&K 2H&+2/&KHk' u+/y&KjH oH&+Co/&KH&+/&K%&,&Luk' u.k' uNu2&.2&N2uj&.j&N22&/2Z2F&O2N& Z2FN& j&/2ZjF&O&/2ZF&OV{k' u0Rf&vPV{k&0 R1&PV2{&0R2{&PwXk&1 /1&Qw2X&12/{&QwjX&1j/{&QwX&1/{&Q\u' 2' 2bo&y&R{r&3 w|Vwf&S{k&3 Vw1&Sk&5 #1&U2&5#2{&U2N& #2&j&5#j{&UVk&6 +1&V2V&62+{&V2Vk&&6 2+1&&VZwk&7 o1k&W Z2w&7o21&WZjw&7oj1&WZw&7o1&Wj2f&82%`&Xjf&8%`&Xjf&8%`&Xjf&8' 2 %&X&y9T&9 \P&Yy92&9P2`&Yr' |:m&CZr' |:m&v1Z`'j/:&jZk&: 1&Z2&:2`&Zk&; 71&[k' u;7&[jk&< ;X1&\sr&= .|9m&]gs2&=29`&]sj&=j9`&]j/&Ko1&Wj/&Zw;X/&\w ;k&A bo!!2&$^2T{&D!2r& |^2Tm&g!' &$ ^T&<!2k& ^2T&u2J&(\2}{&H'Jm' 1u(\}&yH2Jr& |\2}m&g"2%&,2&L\2u&2b2o{&R\2ur& |b2om&gk&b u f&cvk&b u f&cCm&b u 9&cy2&b 2&cj2f&82%`&Xk&q vuf&rvdk&q vuf&rCdm&q vu9&ryd2&qv2&rdr' |<;Xm&C\2&<;2`&\,m' u<;X&y\6r&6r& 6r&6r&6r&6r&6&6&r'Hr' r'r'pr'{4r'gT'H"'r&r& 2r&<r&xr&r&Jr'IJr' IJr';Jr';gJr'r5Jr'hV/r&V/r& V2r&V<r&Vxr&Vr&V/&V/&Hr'Hr' Hr'Hr'+Hr'6Hr'6(H'(H'r&r& 2r&<r&xr&r& & &%r'I%r' I%r'T%r'@q%r'|?%r'rU%'IU%'Ibor&bor& bor&bor&bxr&br&[ur'ur' Iur'Our'O%ur'0ur'&Lr& Lr&  Lr& Lr& Lr& Lr& L& L& zr' mr'r''@r&@r& @r&@r&@r&@r&@&@&owr')wr' bwr'Owr'O>wr'Iwr'Iw'}w'q6f&C6ff&CfV/f&CV/ff&C fbof&CbofLf&C Lf@f&C@f6Vr&͜!6Vr&͜"6Vr&͜#6Vr&͜$6Vr&%͜6Vr&&͜6V&͜'6V&͜(Vr&)Vr&*Vr&+Vr&,pVr&-4Vr&.TV&/"V&0V/r'=V/r'>V2r'?V<r'@Vxr&AVr&BV/'CV/'DVHr&EVHr&FVHr&GVHr&H+VHr&IVHr&J(VH&K(VH&L@Vr&u@Vr&v@Vr&w@Vr&x@Vr&y@Vr&z@V&{@V&|oVwr&})Vwr&~Vwr&Vwr&>Vwr&Vwr&Vw&}Vw&6F&6&6Vf&͜6Vy&͜6Vf&͜69&6V9&͜!k& !N& f'*f!V& rV r!55#5! Ax 9y ;'TjV/f'V/{'V/f'V/9&V/9' Jf'DJfHf'&yHfVH&2r'6xr&n. 'F&&&  9& &%k& %N& )%f'b%f<r'@ r'  ' LF& L& L& LVwr& Vwr&  L9& L& k& N& f'f{r' 5;'rj-; fC@Vf&@V`&@Vf&@9&@V9&8uf'qUufBwf'{wfZVw& fv r5!#7 @ïx-10!!-w-/10!!//10!!//10!!//10!!/'__ &BBL@ tW10!3c~L@ tW10!#:bjo@ wW10!#9coL#b9 &@ t WW 1<20!3!3b`~~9 &@ t WW 1<20!#!#9b9b9o &@ w WW 1<20!#!#9b9bo9 #!#bAb;3 $@f d ?  <<1<20!!!!!5!LK}8;39@ff  d ?  <<2<<212<220!!!!!!!5!!5!LLKK}+}` 10467>32#"&'.736HI256743IH426I235624HI447743?!!?qH9o #@w VV V 1/<<220!!!!!!q'd'd'ooo $0<HLp@?J%K+I"L 71= +"%j4C: L(I1KJ\\F\7@\1.\1(\/99991/<2229999904632#"&5%"32654&4632#"&%"32654&4632#"&%"32654&%wwwu2IH33JJxvvw4GH33JKޥxwvw3HH33JK'!xwxwK24KK42IxwxG45LM41J+xwxH35LM41J^\1<HWg"2654&46367636762#"/#"/#"&"2654&4632#"&"2765454'&!"2654&#'-@@ZBCגkjIIjiKIӕjhIKihJKhj4GHfJKxvvwh,A?[! #?,  [AB^\H35LM41J}xTSTSwxSTSTNG45LM41J}xwxK24K&$13$&& )+ &K42I`J!`u`'--D`'-w'--`J#!J`u`'00B`'0w&00Z/#@ U29190 5/+#y#@ U<9190 5-+#wv"'4)#'!6763267654'&![`bede""^XD#.  S#F 8LAB\VC)*= %(+C" M B0_  $'5 $SLUSPPSEFE !#3#3!/+ !53#53#5+޾tt&'  4&3' D' 4; 2###ͼ農 '47632"'"2764632#"&$"H !! (TUUT <XFFHFFE4llll&@ !3!53#3#Xn|洴 ~~w E@    %   ^ <<91<290KSXY"333##5!5mmw)%#!!>32#"&'5327654'&#"G+y8 `_gfAF3B;=j8777\6677ߑON}LL &%GA('  ("264&'&#">32#"'&54632"##"F081.nr dDKLUTUT033?'&JI''Nݕ xv%$GHMMff !#!MUu2 )7"327654'%.5476  '&547672764'&#"**TDC**)NPRSRS('LT1/VWWW11k"#x"##"<;##"#tF$#9:#i^Cj;<<=hC/.86Mz@AABxK971b  .532767#"'&547632#"'&27654'&#"J081.m99!22DKKTTUTgh033A"##"ABF## <;w$HGLMffkl ''JI''N'(8 !!#5!5!58G!!LGA!!!!ffƅ #.67SQQSdabc~| 3#>54&dbbdSPP|~I#4'&#"#3676322300Df433i~D('Gs^4;;T@d9C{dTtdTudCBd%CCdTDdCEdTFd TGd4Hd%Id)JdifKdifLd)&d,d"5dtd-dIhVd&g2d'h}d3dIMd09dJ~d9%:d$!!!!!!#"32.#"3267$Ii8w@@w88l!Fi+Eh,6767# !2.#"3>32.#"!(%PQQ_M_QQXZ(30zW !@!_f "I77ef87ID: ̦c[[!!!!3#!#5/Ѳz[X"XnS#67632.#"!!!!!!35#535#56kpQN=Dh1.IIȫw|'&>:r 'B0#4'&#"#3676323632#754'&#"#m4C#$+66CJ97wn8 |2@% ۾75UU``/085cs VH)v75TR#5#535#53!3!3#3#!#!3'"aMBBBnAAAARlbMxJJJJP3264&##532654&/.54%+#!2333632.#"#"'&'#"&5\1551: %S2-./hT,C{n{C2 ,-B+^71]*,+!*wSsr04}]M_ml%N9"/:90/ # U~^> 0035+. #F2654&+#.+#!232654&/.54632.#"#"'&9C;;CZf?5<HPP,E$ 8;?@;;)=#k7yH@x597*6#i>A?ZgfXspR֔-v/:90/  0035+. #"&)-1'#53'33733733#3#####5373'!37TE11DThprJrrh&;;x;;#vvVVBvvBvvvv !2#4&+!%"3;!տQ~PտQ~Y*5=YAHJB @@=kbq~Es/4 %UAB`_KBjoD7=AiK}f^[@ )5'32327&547632#527654'#"'&#"654'&#"ؿlCm(IQXMboB0?iqK:(/$3!%DlX``S㫣lm@.jVBthP#lH+990C<#(/! 3#3#!#!#535#53!327676'!%&'&+5\cVVb\nffffy;*\ ;ynKg((gKntgPgM1 w((P 1K,[x$-#5!#5&'&76753&'&'6767uOrz^b፭]Xl`bPgh"'N;]=mi@^TKF#eiϥ"7?& 6#PU"53!3#3#!!!#537!!/3':?+}EhgxhhF~+$++P(UÕeeÕÊ63267# $545#536767!5!654&#">323#!xmlvho O9+ rk`_eg|P=5YcRT45 2 f@PVFC ./_T. )%#&'$%6753&'&'6767_h8:Ьݢ:8g_Q\DGHB[T%;/+R7r~or 7N'(OQ"z!Zw !!!!!!Z-Ygz%#!#!'&+532767!7!&'&+7zV  V5K,!0Oky4 /Xy 4zX8J_@[ _y,>**;1 %3267# !2."_|dT ȄE}=[~oi 7@,L]r4*:0N̾ '1.#"3267#"&632#3"32654&'2#"&65::@@:!;2.M''M#+//+)00)@!vv#B5qtsrrstqT3!3'!!!!!!+aa#]x}+ ;`!>54&#"!!>32Nۅ:7Sty/#t0e (5:=\gL;`4#"!'7!7>2!6+qStyқ7?#&B00ۅ w6;N>;}N,7?2#".5467>"3267>54&'.!2+#3264&#hZZ\[~}ڶ[\ZZ~cIGHHcdFHHHHHss|AGGANZZ[~}ڶ[[}~[ZZGIGebIIHHbeGIGwuu`7e5J3%!2+!327&+67654'&J m5//5=*__*]x~#g)ZZ)'%!# ! %27&"676'&|F"Cobbbbn%lkh4334a%-13&'&7!.+!!2!27&#676'&%3{THvu2M;o.a4w5}fcd)1ED)m=s@1F~h|hb)tL #!$5>+;6-0$(v# *%;(#8MX!GL!!+Im6#"'&'&'&'&'&#"'67676327676'#5!#O$0-6;+>4!# >&.&=A"?,.!" v([+!!O7!XM8#(H. % #vdB!!'#537xZx#xZxxx##xxM'75'3''#xx$"xxxZx#xZxB'73'7'7#'7!5,xZx#xZxxxݎxxM77#75'73؂xxގxxcxZx#xZxB'!5!7w>x#xx1xx##xxB'7!'7'7!'4x‚x#x>w1xxݎxxB 53#5!5x#x,x##xM %'3'3!5x$"x,rx#xB !'7'7!#3rx#xxݎxM 7#7#5!؂xގxx#xrM%7'3'7!!5"xx$"xx",#xYx#xxB(276767654'&'&'4#!5g    @16T)+51@x#x  Q87;=49(*x##xB(!'7'7!"'&'&'&547>763"j x#x@15+)T61@   xݎx*(94=;78Q  B$=+#5#53547>76"3276767654&'&'&g@16**)+50AGx#xT61@  G    ))87;=49(*x##xH;78R  H  B$=23'7'7##5#"'&'&'&54767676";54'&'&'&j@16Tx#xGA05+)**61@    G R87;Hxݎx*(94=;78))  H  BF26767676763226767'7'7#"'&'&'&'&'&"#"'5[ #$! x#x,"    "/x#x   %$   xݎx "  ! x##xB#'7#533'7'v81x#x81x#x'x##x'xݎx9~ 7'7ckn"[ kOcuP%8 5!#Ђx"xhx##xw !#!'7'zfx$xWxݎx8e !3!5x"xwx##xe '7'7!3x$xxݎxW5p !5!7#7[_xݎxwx#x?^ !3!5Xxx"xx##x2X '5476767632#4'&'&'&7#7,#!A=PNZ]KS;>#"!*#13#'Dxݎxq!TPA>! #;SK]ZNP=A!#qx#x%'C "()/ZOR?<# !>APT2V 5!7!##2lv<ĻʌvĜ<B  !!#33#'7!5!'7xpxxpx xx,xx742#"'&'.5476732767>54/#7!&>((*MGgZsn_aMOP(%R.-'<0CA57---0v\bon_cMG.(()LNkoaZU-8:>=96/(-,r=ZHv74#5!#53276767654'&'7#"'&'&'&5476v0---75AC0<'-.R%(POMa_nsZgGM*((=\vdHZ=r,-(/69=>:8-UZaokNL)((.GMc_nmdB5!B#x4#xB!!BM̂xx#M3'#"xMxM#'x$M4x#B!5!'74x#xB'7!5xxM!37xM̂xM!#73ضx#x4B  '7!5!'7 5!!x4x##x4̂xxx#xx M  '#' #737"xx$rxxMx4x##x4̂xB 5!!'7!5!'7B#x4̂x*x4x##xxxxB'5!!!!5#x4̂4̂x>#xx# M73'#'#'3i"xx$x44x#B'7!5!'7!5!'7x44x#>xxݎ M%#73737#hxxގ#x4̂4̂xB '7!55!x#x4x#xB !! !5!'7BM̂xM4x#x#xB!73!!!'7#5!!{Va6PEV`6Dx#x\HHVߞ;cff:bDx##xHHB!7'#53533'7'7##5'35#HHDx#xDDx#xDHHHfDx##xDDxݎxDfHB!'7#5!7!5!73'7/!7'!8Va68PxV`6Dx#xHH;cff:bDxݎxHHB!!5!3HH\ Dx#xDyHHfDx##xDfM#'3'#' fDx$"xDfI\Dx#xD \HB!5!'7'7!5!7Dx#xD \HyfDxݎxDfHM%37#73fDxގxDfH\ Dx#xDHB5!'7'7%!7'!Dx#xDDx#xDkHHHDx##xDDxݎxDfHHHM'3'7#77'Dx$"xDDxގxHIIHWDx#xDaDx#xHHkHH}6##7!#V`JvnJVJpvJT '#5!#5'5CJnvJ`JvdpJ^VT%753!5373JvdpJ^V^JndvJ}6%33!'38V^JpdvJV`JvnJB!!!!5!!qYNx#xdfYfx##xfB'!5!7'!5!7!5Yx#xNYdYfxݎxfYfB3773#''#5[KLnDvvx#xPP~~x##xB'7'7#''#5377vx#xvvDnLKxݎx~~PPM%#5#535#535'3'3#3x$"xV¼x#xVM3#3#7#75#535#5353xގxV»x#xVŸB #553353!Ƃx#xC{x##xM 5'3'#7#7x$"xnƂx#x}ʻB 3'7'7+53#53Ƃx#x}ʻxݎxM 7#757'3'3؂xގxƂx#x}6B !!#3xpxxxB 3#'7!5!'7xpx,xx 5!5! !!5cm 깹] 333'#!#\^Z A !!75!!5 ]]YY ###3!3"^\ZX0 m 3'335%!!# #^\znnZgm %3'3#!5%# #3!^\^dddZm! #!5#7'# #3! ^^dd9cm! # #3!3#!!5#3f\ F ^m!וddkn'33%# ##!#'37"\`\\\~$ym?TT %3'3#!5'3!3#7# ##'37^\^p\\\@ddZm?TTB 5#35!7'!!!5 5ddm]]YY'd!#7!##gv<ĻdgdvĜ<,x!5!!53753dĜ<cg<Ļd 3'3#7## #3 3^\\^XZZ֤mmB676323'7'7##"'&'#58X)O$A?x#x:[V6NJ9\ 63SxݎxH9ZY8J M 3'#'737"xxxxMx4x#x4̂xB'7!5!'7!5!'7!5!'7x444x#?xxݎB#5!5!53!hZיrrh4_+__|z|?X!0?"'&''7&'&54767>2"&'2767>54'&ww&'''OO_:3www('''OO_;4AA565  AAA565 ww49_pm__ONP(&www4;_mp__OOP((D56MJ@  56JM@K@&%h91/90KSXY"% !!{!5q!!{qdmCq?3 3ް2ް22013!!"&63!!"!Q )SS) PH{__{HPd;w +mq?33%ް 222ް2222*+/"/01#"!#73#!!3!!"'&'7&'&63S) W J+!y 53W ^c>H{HPPHC4|Pu_`P`_cnB / 3 3ް2ް22fff01!!3!!".>3!!"U*^_*&,bމ`+dmCq?33ް2ް22 01&'.#!5!2#!5!26767!5 )SS) mPH{b{HPd;w +kq?33*3+3ް222 ް222%2/"/01%326767!73&'&''7#53!5!&#!5!2'#܃S) V SK,"xk 52X ^c>H{HPPHC4PuP`bcnB/33fffް2ް22 01!5!&'&#!5!2#!5!276|*]^+&,bމ`+3!L9@__120!!!9_^-L9!!!L-^LP *@     <91990 5!! !!5my=/9) ӇB v10!!BKXy !!5!3!!!5!ff!bbqB`yTU etrX)'1 ,@     9190'%3##q@`44{$1v&,u)1e&,B=  %.#"326"&'#"&54632>3"36J032#"&'#"&546320P2;JC88b6J0#@ a/<<1@h h//047632&#"#"'732UpsXlNGUnsXlNGD"McoHޕMcoH^#+4632&#"#"'732%4632&#"#"'732ronQ.A&ronQ.A&ronQ.A&ronQ.A&D"K&ޑK&"K&ޑK&^#+A4632&#"#"'732%4632&#"#"'732%4632&#"#"'732aroKnR&roKnR&rnLnR&rpKmR&roKnR&roKnR&D"KzޑKz"KzޑKz"KzޑKziB'4W'W$i>'0$'$Wi'$WiB'0$'4W'$WB &&tJi !!!!!!PMM:>/6'n$'oT'$'T&Xy''~CXy0#"'&'.#"5>323326yKOZq Mg3NJNS`u_G0;73 ":?<776<Xy032?3632.#"#"&'XJG_u`SNJN3gM qZOK0A<677323267#"''43NJNSFXɉ;5GJKOK[C :?<7Dj323326!!yKOZq Mg3NJNS`t_F(!Z<73 ":?=676=X'y#"'&'.#"5>323326!!yKOZq Mg3NJNS`u_G)!;73 ":?<776323326!!!!yKOZq Mg3NJNS`u_G)!!;73 ":?<7763233263!!!'7#5!7!5!7yKOZq Mg3NJNS`u_G`aG#z`;73 ":?<7763236767!!!!'\UQ:43NJNS`jNDJKHEL=a?]R<# :?<77 Y A;XXy7Z@110+5.*'   '.5  810*8<29199999990#"'&'.#"5>323326#"'&'.#"5>323326yKOZq Mg3NJNS` t_FIKOZq Mg3NJNS` u_GZ<73 ":?=67 6=;73 ":?<77 6<X=y4&'&#"5>3223267#"'3267#"'&''75>3243NJNS`f]GJKO)-D\NFIKOZq gZpNS#(  :?<76Z323326#"'&'.#"5>323326!!yKOZq Mg3NJNS` u_GJKOZq Mg3NJNS`u_G)!;73 ":?<77 6<;73 ":?<776323326#"'&'.#"5>323326#"'&'.#"5>323326yKOZq Mg3NJNS` t_FIKOZq Mg3NJNS` u_GJKOZq Mg3NJNS`u_Gu<73 ":?=67 6=};73 ":?<77 6<;73 ":?<776<X<y"32?3632.#"#"&'!5!5XJG_u`SNJN3gM qZOK!!A<67732#6454&#"#4&#"#3>32V""V!Z6^b"%25'26 R28W35uo :5SN[5SM%Q//7V'x:%)!!!!#546?>54&#"5>323#V""J 6 0*)^3@"   v v  <291<2<2.990!3!!!'7#5!7!NŮmA1}X<y !!!!!!X!!!Xy{!5!73#!!!!'7#537!5!~P$fZ=e(lN"ebSbKXy !!!!!!!!X!!!!Xy &@v  <2291/90 5!5y!PNFXy &@v  <<291/9055%!!X!! Xy 3!! 5!5X!!! PNFXy 3!!55%!5X!!> X}y#5!7!5!73!!!' 5ZYM{~ X!i i행PNX}y#5!7!5!73!!!'55%ZYM{~ X!i i행Wyq&%5767$'567Rȳ}v֜P ij~wԞP(Fd%EP7(Ge#Xy%5%7%'bk8jyx!:_|:XCXy'75%%57'xk8Zj<y:_|B:[XCX<yD7%!!'7!5!7%5%ykSnKAD*ZWOzd#@4=PhLx"LX<y@7'#5375%7%5!!' z0VFdjeG'C0'Pau6LvLXy!#"'&'.#"5>323326 5yKOZq Mg3NJNS`u_GJ!;73 ":?<776<PNXy!#"'&'.#"5>32332655%yKOZq Mg3NJNS`u_G)!;73 ":?<776<X<yD+.7%3267#"'&'&''75>327%5%RmKKt`GJKOZq G:GAFJNSMOyel!PNX yy  5 55%y!!PNXTy1!7%'757%57%5%77'4PGx0e4P0GkB$$1F4F\}F5F\|t?t?XTy15%%''5%75%7XZuu: &uvk;Z&vFIs}FyJs}Vwa%&'567$wSh"/_D$#Q_Vwa%$VhSbQ#$DbO/"X[y5%$X{qQ_#pOKI4 &X[y%%$ynq{_Q#yBpR&4 RIKX2y%%#"'&'.#"5>323326%$yKOZq Mg3NJNS`u_GJQ_;73 ":?<776<TKI4 &X2y%%#"'&'.#"5>323326%$yKOZq Mg3NJNS`u_G)_Q;73 ":?<776<TR&4 RIKVw67&%'&'567677\RN@E߾\SiIRa_bIGE#"R!+Vw'76?&'67&qRN@E߾\SiIRab_bb*IE#"R!+DXyx!!"3!!"'&5476?:nLMm:׃x|~KM᎚ِXyx2#!5!27654&#!5̍:mMLnxϚMK~|Xyy %&'&5476;3!!!"''#"T=1̆cHcw.nL!5ِEFǚ|~K Xyy +'7#5!!5!232654'&'}=1̆cH>9c.nLA!5ِE,F9|~K Xy)%!5!!"3!!"'&5476y:nLMm:׃c|~KM᎚ِXy)7!!2#!5!27654&#!5X!:̍:mMLnQϚMK~|Xy(#"3!!!"#!!'7#537&'&5476;7OnL!-u/K.~=M=̦CH|~KuLx#BِEXy(!5!27+!!'7#537!5!327654/:*'EE/&`-u/K.~-/ mMLL ,E(ϚuLxuMK~|M Xy)!%!'7!5!7#"'&54763!!"3!!y(6^N׃:nLNl:=6ؔDuِ|~KM1DXy) 2!!'7!5!7!5!27654&#!5̍Kh]6(6^:lNLn)ϚR"KDؔDuMK~|Zw3#%3653! qwyRVBZw3653! 3##5#535ZwyPFVBZXVy!!!!X!6XVy!5!!5y6Xy 5!!!!!X!!6*@Xy !5!!5!!5y!6?j>#!#>33!3>33?2"&'&'&547676"2767>54&'&'3!!#!5!WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:FXVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;93372"&'&'&547676"2767>54&'&'!!WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:FMXVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;933?2"&'&'&547676"2767>54&'&'77''7WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:F8xxyxXVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;9yxxx3372"&'&'&547676"2767>54&'&''WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:FxxXVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;9_xx37!!2"&'&'&547676"2767>54&'&'M.WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:F/XVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;933BL2"&'&'&547676"2767>54&'&'2#"&546"32654WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:F7b%&'qqX>=,-?XVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;9d)'%`8nqq>Z<=,,3!)/7?E2"&'&'&547676&'&'&'75676767'%654'WV,+++WWWW+++,VW:F!#!E: ֈ :E!#!F: & XVWih{xihWVXXVWhix{hiWV9  9{18@9p 9 9 w:A92t3!;!!!!2"&'&'&547676"2767>54&'&'+{{WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:F@XVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;93372"&'&'&547676"2767>54&'&'!!WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:FMXVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;92K 3!!#!5!!!!o2K !!!!!Moת2K 77''7!!! yxxxoixxyxs2K !!!!!M3o/B!!#/^B!!5!3^  B!#!5RPB35!3!BXmy5 y!.Xmy-'55E.!U`aXy %!55 y!! $]PNCXy 7!!-55X! !U]g&"26!5!6762"'&!OsPOtOrw#[륢S'PQqOO>-"YR%ZLw #4&'&#! wwy H\PZ/w73653! Zwy\Hx< |bc|zbw 10!!Mv\ !!'*]])]\@寯X'y32?3632.#"#"&'!5XJG_u`SNJN3gM qZOK!A<677F =0|bF=&N@NU@Xy&3!!!'7#537!5!!5!3>F =0|bF=&NjN@Xy5!7!!!!!!!'7Xw!6_H4%H@CffXy!!!'7!5!7!5!!5y_H4%Hw6jCffXy" %3267#"''&#"5>327%5yL;5GJKOK[_b43NJNSFXH!e3275%X!V_;5GJKOK[_b43NJNSFXJ,323267#"''yQ_k43NJNSFX]_;5GJKOK[_KI4 & :?<7D323267#"''X_Q{43NJNSFX]_;5GJKOK[_R&4 RIK :?<7D # #hGf> 3 3h*f> # #!!h gGf> # #!!!!h ggGfj!#!/+!#5+d!3 "/+!53!+ dR!!3#CܐRL  R!!3# C RL ~3#!!C~ L ~!!3# C R Xjy!#yG,$%%$nn!"nn 8ʸ /!%6 !&'&";112Q2qp`XXV@@VY  67"7,J5PP5JkX*77*I=P"2642#"''7&546xtyΞi56؝wYe:vuvo3N=eXt#O'+6@KV#"&46235462+32"&=#"&46;5#'54&#"3!3264&#"32654&#!#"3265k֘֗kk֗֗kL65LL56LM56LM56LM55LL56LJחkkחחkkט5LL56LLkLL55KK65LL65KK5Xjy!3!y3j !#! 5!# 5; p;!!3Xp;)3!X;5f477632#"&'&'&#"jkbwL=.> \bP \bP]Y"\I\\\\I`LLMK\y>>(I !!3#!#%33'((d&sd4^7 h\\D?ccB !!!5!!5RR(!!!OZW !!!!5!5!![[[ZWT !!!!!!!!!55[[˰f W5 ! 7 !!-.O|c;5[Z.Ґ|_W=&  7 #276'&"! '&'676 !%!pqqpB`Ϙ_BB_1`B[5;@@@@EI7XX7H"H7XX7IÐW3#3#&'$%67%676'&ff2ffff1ff=>>=E>>>3;@;$;;#p#3##tD&  BB 3!!#!5!M%6BB #!5!3!MU 6%4 !%!!,5m5A4 !!!!;rԵ5mY5A !! ![[#ZCoW^pK  !!! ;[5;Ő[#ZB35!3!!#!B#x ^x#x6xB3 '7!#!5!3!'7x] x#x6x !%!!%!ex[xWx x !!'7!!'7!;Őxex[xÂx'3273632#'#"'$%65'&#"pp./NRR2]PQ pqp/@ XX`H>@B !=!3!ZZ!3 33!#!3!3POJ3+^/4 57!!#xr;rw/Krm-4 % !%!5 !53!]UPmrZ[zB"35!5&'&7673!654'BB4_`4AD1b`4CP5544}4_`4&1c`3)2HK33HK2B '!!#!5!'"xKJx$xMTx# !! '!'!;xcx~WxwzxwB !!!#!5BKKRPT!3 3!###!##mPOmʀʀ3+^4!5 !! 3!xS;ZKmy4 !!!!5!#];r~U[ZZ,B#!#&'&547675!5654/RC0b`3BC5_`5BP3366:2e`2k5_`58'2GI23JM2B!7!5!3!!7"xJKx#x;4łx !%!!7!!7x&xWxpwx&  & >'  &  D'  D&#"632&"26"'# #'(J^\Ncdbd TN+ddbc724& 7 Z^& >& 7B3#%3#!#!5u`RP 3#%3#!!un2xqv7& -i&  8t'  B3653#&'&33zgJʾOhz)<Ґifj3Z\|Y Xy33!!!!#&'&TTʭpH6LL7uEy 7NL7Xyi&a 8Xmyi&! 8B !!!#BK9c!%!567!6!&'&'&'yKH FJ97;6L2J!/,3 4(`<?-joo   lXy(8#"'&56776326"&'&&'&'&'&'3276y m{{d m{{cf/ %#2J!UI*/YKX M3 +/fg/  Do}R ( p}I ( " q}}RXy3#"'#&'&#"5>323326yKOP!G*iceOu5c|oq/1$Hp X?+.D`0Xy!.'!5>3!67'ydafN"32 7 ]J3,AI^9lys:932M#%]J3,AI^9lys:932"326=7#5#"&546;54&#"5>320;0]J3,AI^9lys:932'''']J3,AI^9lys:92".33&'."#67>76#FVʓVVʓ= mm &#Km % mK$ʓVVʓVVj,(Km@@mK( mK,K/,Km F^%.!4>2".7!&'."67>54h4.#52".ut&F@mm@@mSoʓVVʓVnt]&sْFUSm@@mm@VʓVV!!![ZWm !5! ݠr0p !!#v !&5 ƠT_Cm 5!p g!0v  !!#ƚΐ,Um!!! # q !!#v!!  rm!!#N#!0v !!!##m !4763!!"{zf+!u0%y!4'&/32765!-9+en:==@ne( =F|AEuH<y 3!!"'&5!+f}{y%0Wy!! m 4'&#!!2!+fz{}%0y&'&!;!76<(en@==:ne+!< TuEA|R=y !#!!2765{}f+!y0%! z% !!!#!55!mw ¤]]]! !!;bc;$<n$c 1/<03!3n$CVj5!jl!X3 !@ <j 5!!5!!5!r#B#B#j<l !!!!!r#B#B#XXXm 333mjjjm !!!@@@mjjj<j 53353353353X 5!###ljjjX !5!!!5!4l t,> 3!!!--Axj 333!xjkx 3!3!kA 5!5!5!3,,=jX 5!333jkkX 5!35!3̠= 3!!!!-- ABx 333!!xs  x 3!33!!-skA jB !5!5!5!3,,X !5!333xtjk X 5!3!5!33t,  !5!!5!4B 5!!###sjjj 5!!5!3!!t,-sjB 5!5!3!,-XAj 5!333!jkk 5!5!333!XkA!5!5!5!3!!!!,,--AB5!333!!###sjkkjj !!!!5!5!333!-s t,jBkA 43!!"yY[p~| 4&#!5!2[Yxp~|j 5!2653#xY[j~|qj !"&533![Yyjq|~*m3YѲ/ Y*m#3*/ Y*m # # 3 3*iSjh5!|j3?hj5!h}j3@hl|X!@?hl!h}X!@@l5!5!!5ijVV333PP?@l!!!iXVV#!#P@P?@ ?!?j!j!k!@!!B!B! F!Z ! ! h!| ! *!> 3 i }8m #'+/37;?53!5353!5353!5353!5353!5353!5353!5353!53Z667576l #'+/37;?CGKOSW[_cgkosw53%5353535353535353%5353535353535353%5353535353535353%5353%5353%53eeefffdddheefcd!!!z m #A35#35#35#35#35#35#35#35#35#!#5#!5#!35#35#35#35!3h̚h̚̚h̚̚hϚ2̙Ϛ#366B BF Zi!}@i }i !!}} @@&  !!!@@!!i }&  !!!}}w!N<w7!!!xr$<w 3!254#!") ) xrVVVw&  w !%!5!5!5!5!5!5!5!5!5!N54&'.#"!624HI347652IH637J347744IH426532<( 67672"'327$%&#"!zzzzzzzz12Ι4FG΍FG@XXXX(( !#%&#")7632ΙK/zzzz`XXGG 3327$3!#"'&12zzzzXX`GG7| %63"71{y`X{G7| 2#'&#82{{x|XG7 527638x{{ΚT{GZ7 "'$33{y{TX`G|0#'&"#%632ˡqppp12A@_XX32763#"'$pppqΙ@@XX`wN<wN<w!Nw!v<`/3267>54&'.#"467>32#"&'.H+(*h9;i)*,++(i::f+),H736HI256743IH426?:IILII޸[["[[w !!!!!!IIN< w !%!!5!!!I) NjBZ7="-?33 #&'&+"'&#"/573;2?"#'57#&'#"#567635a)8)kOkaKA-'= //G),Y=  !H$ /+HDH)+) $., fYYx !=Z Lx73&'37&'67&'67&'67'32654'&'7654&#"3672 $54767&'&47'&27632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5430'&327632#"/#"?#"54?'&5432&5432&56327&5432'&327632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5432PO~ )*+')+(@&'$||e?/A}]\B-71SLoWj\vLLr%%,* #$ )*n$ % +) $ #*+    ? '+&()&(+&p   % % +) $ $*+*EC*Z*,)-)-*,%&%&fБfU 5HhfeefhH2pu^QFs棥sKQG4 4  22044 22 9       L%('*%)(*%)(*t     144 22 0r!2CTev+&'&54?6?6/&2#"/547672#"/547672#"'=47672#"/54762#"/54762#"'=4762#"/547672#"'=47672#"/54762#"/547672#"/547672#"/547672#"/5476l=.%G\&#- Lj.N 0d&K4i    }    g    s            &                            H5-V"*2-.T<:U'EGE'DN-ֈU]\`CDcbF]WWZA@ZZ@AZZA@[[@AZKPrqqrPGeޝdMP䠠P }2ٛk A4&#"26%4&#"326#"547&'&4632 $54'&'&4632XP79NNqO.N97OO79N']EacDC_\n\U>DbcEXFDbbDEaaEEaaEDaa+G詄UUSj멏i LVV6 "32654&7#"32?ɏǾ/`TcȐɎ;P12Y.1"264&"3264#"54327&5432#"'&'@KjjjiOiiLKirqrtPssrqQܩZTdIU )5AMYdp{3/&76'!'47653!476=332654&#"#"&54632'#"&54632#"&54632&'&676&'&676'.7>'.76$6&'&%6&'&6>'.>'.f<;.=+,>/;Kyz~LZ|WX{{XX{IE11EE11ET    m       ;   R       s@dd@s}>}=/NnN/=}>@MllMNkk& % I% % "!$# "! "!! & % % & %-5AMYdp|5#!4'&'5#2#"&546"264&"264"2647>'.7>'.%676&'&>&'&7>'.%7>'.676&'&676&'&753!476=3''676%27/&76'77&'&/#?6'&7liilYz{XW|{bEEbEd      8    @     .HxttxH%?%5E$6  6$D5%?%-5!!1(~(1 5,4t4(4N4(4t4;hhh%%#%% $ %_ $ $!"!$!/!!!" $ $ $ %:-,GtG,-: XLRqqRLX ![$n[ii[n$[!ob !!'!tKZGkcn "!!'!##&+572367676hNn_5, S Grj3#-EmDJ~o.(*!4\tR~UL !!'!  ##' CI3Z  > << 5DCX << ; YD36273 ##'5&< +Z@\\DC ZY\5#,5>~3+&=4%3+&=4%3+&=43+&=4%3+&=43+&=43+&=4%33 #&'&+"'&#"/573;2?"#'57#&'#"#567635@)A({@(@){A)A(@A(^)4 'iOj_J@,&< //F(0'&&'ܐ'J&(lN5  >! )&V?<?$&$ '& ZN N />Eqw!674#!!6?676'4#'323276767654#3#&'&'&6%67!672!&=75$/563&43!32+'!67#>54&53 *,  3)="(&)09$) L&TE` MPA[MH Y $ ;&&e=O%/ N ,8(.7L1Rf~H8SQ,zH%9D6 )jGP@4Rjd_*KfsDIR 9! O  -]&C+/3#"'43727&'#"$472776725676&5&U8)$ tJ .; d3f,"3' VD ( GL/7;;,g t^F$< LD&?>X4R !/# I ? P?D!)Mv>/z2!"&54676737#&'&54>;7#"&546767!7!"&54>3!6763!2h!.)g$'30!/&j ! /:(/  )/ 9)/  9)0:*0z2463!2!2#!!+32#3#i9/ ! j&/!03&$g).!);0)9  /)9 /*  /(:!!C4&#!"!&3!!"3!#";#"3&'6737#&'6737!"'67!7!"'63!67!2e;'+pCCo CCCC2CCKK<LLKK%JJ60"2=2).=<==<@=:>=;TT USUT UT83$QE!D72654'6#"'4#"'54#"'54#"'675674767#%$4:JILLHOKHLKIhghgighgD>-sJ1 b6'SS cRR SS?SS\\K\\;\\]]!A*>K !C!254+'3254+'!254#!'!254!&#!"0!463!!2!!#!3#3lCC2CCCC oCCp+'q=2"06KJ%LKLL:=@<==<=.)g%27TT TUST E!C32=732=7325732'654&#'%2&'&5&'5&'IKLHKOHLLIJ:4$N->DghgighghSS=SS SSb SS'6a!0J)K>*B \\]]:]]J]] O!%)-1523656;2#'7+"/#"'+"5&54775'"'5476;25'7&567635&56;374765'75'76=4'&+ '"'4!#"'&36365&5&#%#754'&5&&547'5367&7+&'&'735&2?"5775537'7'3533553535'32767&5%2?&#%55'575775775uo,Mz"060D/5I:2'5:6&" *:D:S46$.e QN5  u4MDa 6bUP+ ,H;`I23N5( (#I0M '^5%#!:X+ "*  6W}W:uW4 5vT & /H3V XD9\SL+&31.d+%X!Q $2``KPPPG[6%# Qy- 6[[3GK[O`_A[-)$t7 L-$ L6=" (CJ#R"0 :~GB{~Eoj<4S[Za LC5 ) .U%+Z&)͢ 7e<ILAaMoK33K@G6 $$(& (''&1/----2)( (-((d.'-T?OK8T$ !T3(-<((')))())( &2%2#"'&=477654'#"'5473t\*e O@UCXq P S. P ӍMOb>YaYƮ58l7P P@ $0<FX + &=%6&#"3 6=%&#"';27!54767%!&'&'2+"'&=476^7\Pg㑵Hr'.)%sM M#fC-7!%A.; ӎw:kKqz +H*G;M tu/&((AA&:+C;."/ 8Pi>'67&&&'6.7#"'&'#"'676'773.#'6'5676&&5476'&'67&&07 ^< 1x,B5@2 JVMv!#uA+UBDX[f*;-10)..C,sB#HKU P]12<0VQ }%'H6-T}^$k7 R2'7f!A\;y?1!50BEt"!zkQ;0qu0\oi:5oPZjsXFaPJGl;4ejN^1F[q7&&'7'6&'$#&7'&#"'5&767#&''5$'67'6'6'5$'67'656&'67&'6'&'''5$7676'&&'6'63&7"7&'7&'7&'7&'6'6%676767&77&77&''5&"'6%35&'.54>23#67#&8 p +WDTc'H @XO`= ;*)8 kDv/Pk-J KDhGa D`gBD6DDD =3dTDW, :g j)Yi#'WtI-9w18$^8;./7-I)jS)'#i\-IM91D;8%a7/.D=uRNBR&'%QBNRq d2 D s98C ["|44&3, '2^3R T(B?#'9C- !y ~#Z10>N?$%Y4 )%FN? ({ usis< 3(&^T05<>7;,#4[:O(vAfGEtYB z^~4j #,;b:['~Av@~EQ Bak4~_H#T2 $$$$ 2T"`q$&'6&'67327&#!65#&3jjdnh wWVݱqZre[c7 7 cyX ,35'533#3!'#'5!5!5#53!5!5#!!ʶ~~ blvF F A<<3ffX苜qXGccGap 3264&#!2+73 #'#5# 3m`hh`2`Ĉѳh|;vvʷ}f33#!!#'!'57!5#'5735 64pzp7d+!#!573#'5!3!'573!#'73!#'5IxOOTxSVVdY\yvVPPvIyY',32#' 37+ &5%6323'#57'53mJl{~m@+ݼh4144'0>,_ vNknmmnObs32732753"'#"'432364'5;+"'#"'53275'&'&54?5572'#&'&547634%476='4&#68$$B )Z>&A_;i88u-o1bFGfQ_M5mwLbkjI,K=''8 0##Rm4 ڹ+ܴ5!PP"4\=ѻ"8Qý32#"&546324&"26%#"5432itvxsq1"00" 0/B//B/#a`ir|H!//!"00""00"!/0 _b #>DJPV\bhn27654'&#"&7367'67675673#''5&'&'7&'%67'7&'67'%7&'&'%6767%&'&$h%$%%34$&1++XSA N@`==k>P CRX++XYC P>k==l?L ?Q oL+ Nn;P?;@  nMNn3%%%%34%&&%s==`?J >PW,,WW? K?_==f?H?PW,,WU?H?^<=Ke+cL mCP`k<<!4(0847632#"'&7327654#"&#%#&7&'67&'67!󫪪vӤ=6 5N'V[S.U[R󫬬񫪪񿉊 ʯX[V[X[V[!4(0847632#"'&7327654#"73$3&'67&'67!󫪪vѦ=63QNV[S.U[R󫬬񫪪񿉊w  'X[V[X[V[!4!)47632#"'&%#$''&'6%&'6!󫪪4>;D@KDzcngk?dnhk󫬬񫪪I kpinipi !4 "*2:AIX3#''%#&'52#"'&5476!!'5%!!'53'5%3'5%3#'32765'&#"M==,/0#H 8&O6 |7iY06./==e6a&i1r4z012+KN2HQ>>>>f^2"/1]8`1"Y 4f2y5+ +"'5$76%&'547327676=&#; hz0/O{[(*TQ~`NO =tR[\ 8d<+% &56;2'5$%75#"3vh0.P~N^(8P,VRZycOpO >S\^ f`1B7#5#53'&'&54767&'&=33676=3#327654'&O&"}|fzg}}"&&"}UQn$mQU}"$nQUVV{xVVUQ<"{u^^\ _u{"#| zUOOUz |#YOT{zQPPQz{TO@>)4'&#"3276&5476327#'#53'&`____`oŠqk]^^]YYňÁhgf@> '"3276'&'7#5373'#"'&5476j___``_ߓqŊqYX]]XYfhhĈÁj0 '&'&376&+"'&5'476%7!Z{z[ZZ[~\YWmpN#ZX[[YZ[PQmp#TG*52764'&#"#463233#!5sPQPPtrQPyzg֏LQQQPPQr{{t|g*#"#53533#632#47654&#"#ddiqqCBigIIugzyUr}ppDtPQs_CS 7"27654'&7#"&54767##53#533333#3##h. @\ ! 2(>>?ZW~>'3|}}! -/@ /- !^'?XY??~YX?(F}R}hh}}hLS<#5#535&'&'5'73'3#'73'676=35'73'13|e{vw}wwUATwx|xxS@Wwx}vv|d|re{Eus~~suE|VAKtrrt@X{Ius~~suI{dr|*! #!!!'!27674'&#_82V)3{D#MHZW{s{?zK8! %#"#&5463 67!2#6#";z\)MaBuh __ itBaM(]y tt[+##+tt\5."264&'67>3"#"&54767&'&#52hq៝rd:BJ|^d#!p⡠q $c]7A;{26XY "zz" YX62 &'5 %$ 56?6'.j拈|*xIIz'&|JJx, F42$8"3264,'5'&54632264&" &$#"&547>ȜmmNMm} lyzU<Mnnnm+}7 lyzU<|||,&(uO#eaHG||||Q'(sO#e‹`IH=! <>'.463227#"&5454&#"&'&5476766&D9BB8Ğv?W:pbW~tp) "-ff)-gtpQ@3AA:ACj›GmN?ijbvr56WGe((Wi0154d)-?/6?2>32>32#&'567'6'#4&&#4'3>64&"-S5,9"\0+Fgv!4u|W")^,k ikdS!eb[_[H|NYC:RHB=G`SnU|#!!!53&54632!!5#67654&"U't00Z =yy= :]ZssZ JjkkjJ 2f4%353'5#"'&''#&&#4'3>32>32YE;<<-!&Y*dx cf_Oz.*O2)7Ze``b<`WuALh`8!5!1##'!5!_drrPk^K{U_W{'/27632#"'#576&#"4'5267>327&'"2XCZd}uud$gq~dV)40tlx!&%"dLk}:Uwma4 sOHK{wY@x A63276327632&"'&#"'&#'6327627632&#"'&#"'&#'YR #{=('%{XNCEz>O&z>'(#&R #{=O&{YNCEz>'(%{=('#&ee22ee$l66kd23dEPdd33dd$l76kd34eE^s#!5!37!!'  L34((C $Td67&'&"!3!67>54.#"!5&'.54>325467675#53533#63232>54.#"3'8xpA?9l9>@q<;9'D} 5RTP=: SSPSS ;r>>p  p>>r> !A% )RSQ1 )6BB6) 1QSR) p  ""V{zHNRh|&'4>32"'4>32&'4>32&54>32&54>32#!5!'!567>54.#"32367>4.#"323732>4.#"327>54.#"732>54.#"I )),(?)(#!3()3$))BG!(( K{mg,;h IXI L$  P   H''1|G''#s%'')7$ ''A  ''HTݬ9.%~~ rF)~ wpa!'-23353#3!53573#'5#5335!75!!5'57!ePPeeQQeDpH>H@A~}}~00mrTTreppe-!7CQ^&54767&'&'5676767&'&54>32!535#5##3654."!2>4.#" 1""#@%@#!@% ?$##0 ܍a1%?E?%4,/--+D,/1+ 4;AB<>"  "#>"">#"  ">#10$ITNnVB, n ?%#Naji-/4^t&AYcgb3%' + ((NV8OQĿ>:<uyg**5 k5h P[32>4.#"732>54.#"!5&546767&'&546767&'&4>32'&'.#"+L)+L*+M)(LH     > |n @: !:;! 8An} E04`a30TL**LTM((     ++x: 8>>q ?9 9? q>>8 :x++c^UZbbZU^jg% $Tdhy47&'&";67>54.#"!5&'.54>325467675#53533#63232>54.#"!57#&'.54>3234'67632#7$5oh<:5d4:;i865%1MNJ96 MMJMM 68JNM0v    +0 +/0U-,,+,.T1/, 9j9:h  h:9j9a &LMK- '2==2' -KML& 1  V//X//X//V6HLP&'4>32"'4>32&'4>32&54>32&54>32#!5!5!M ,,.*C,+%#7+,7%,+ FK#++ PDNAM**4d;K))$'**,dY&"**E #**L:ƥ??@@=%)5!5!3353#3!53573#'5#5335!mD^JJ^W^KK^׋LLZZ,}}uz%yuu{{u}--4@4767&'&'5676767&'&54>32!&7535#5##3 1!!#?%?#!?% >$""/ _1+ 4:AA<="  !#=""=#!  "=![1=%T e >6.HC'L"'G 12h[FH`[$%ok+*8d .Ncv[.7&546767&'&546767&'&4>32 w "E> #@!!?% =E!w ./@ =CDz" E>"">E "zDC= @/.QO##"'##565'##"/547?kM ,4N"DF &Fi?JO/FB!O {|Im<&=M2227632#&547636=4'&#"#4'&#"=` ]d2 cBU;/G;SXMB:@B ս;7hf% #>|\@9@O &&5 iC n:^O G  %2O7236;2"'##'65##"'&5476;235&'&=476jS c1=EO ;SCFRʝT6*F@E1;O+.`162V Yi8/D ;8[B VRP"<B+"'##565#+"'&575477;2732;276=4'&3&'"ih;F(wQ"DG".FWCNfBy" bODUq5u4  Pro@ |S`64 '4'&'~ v '  w (  w ' $k=F F>jG3~Pjb^*IerN{̑?qJAe}Ωv6\~x(ONPPNO(!8?|EE|?8!r!_3#"/4?23D-!]UF+}{<!/3#'654'&'#"547326Rs9W5[S%3;B[/OBC'*|<j_g#"=4?2%#"=4?23ɧ%QM?ˠ)TK7(w7џ5s ?|O"'4723!#"5472!5YA>RHIOq 1 ӫg 4D% 3363'$6'"I+4 puoS^*  3%#'#3%#';&2 IʗHj7*(,377#'#'547#5773%%,ppsr,'zzxz'984?/99e5>:_`qE#&#"'5654'5673;54'56732733273+&##&"#&'565*G1 VV2Is3'{'3sI1VV 0Gs3'{'3sP3+1='3sH1WW1Hs3'=1+3PH2WW2H. ;G7567&'&'3#6737'#&'7#&'6735'67#3335#5*)SR))&*&';((:'&)'ȶkkn\\[[nȶ kk n[[\\n`ff/ee.((&(;((:(&((@))SS**n\][[o jj |o[\\\n jj e(P( /N#.6CMhw!2732!'5675&'&=32#&'567637&/7&+"+&'532?4/%32#'#&'&=4?#'57335'3!273+#&='#"/547354;2?!&=35-,;K> #WU* y "њHV ηz/;@"q=o )we)$IY'L ALaXwH >X%CII$PC/DN6g+  b% #  jnN :3 O+5{bQ< ,d-  X] f '^ JJA!< 8 2E35733!&54?'7'7!!"'&%#'73676'77'7'&'676}]} =--HW(7*! >y*1c{F=.,H-.'d(#Y+GC8957jN})%%tGl5nm3(,H:0/(_kiN}!N920K 1DW3!5>7>54&#"5>32&54?'7'7!!"'&%#'73676/77'7'&'676@.#5*"I?6O"[m" c<,+GU 5) <|w)/ayD<,+G,,&a(!>B<#q'%NG91 M7835hL{'$$qEh3kj2'+G8/.&HghL{ L8*/D *(=Pc#"&'532654&+532654&#"5>32&54?'7'7!!"'&%#'73676/77'7'&'676D|q%N24H'CB=9PS3464E>6O#]o 32EX!#"632#"&'532654&#"&54?'7'7!!"'&%#'73676'77'7'&'676H$evyn$L27C'y*1c{F=.,H-.&c)"ERUHHS S /(*. 8956jN~(%%tGk5nm3(,H:00'\jiN}!N91/K "7J]"3264&7.#"632#"&54632&54?'7'7!!"'&%#'73676/77'7'&'676]'00'*//l+2>AB(S`dT^dyg7<,+GU 5) <|w)/ayD<,+G,,&a(!.T--T.H D&RECSukf{7835hL{(#$qEi4lj2'+G8/.&HhgLz L8*.- X.A!#!&54?'7'7!!"'&%#'73676'77'7'&'676n!?/.JY08+"(@},2fH?/-J.0'f*#&K:;68nP*%'wIn7rp5).J<21(vmmQ"P;:1-K':7&54?'7'7!!"'&%#'73676'77'7'&'676N!?/.JY08+"(@},2fH?/-J.0'f*#:<68mP*&&wHn7qp5 ).J;11)wnlP!P;;199'9HR!273!567&#2&'676+&'67'#'6765'533!273+#/#"/47$,7Jv I MO $p%|I ^ [T<K"(~GW$?8?])( EAs#L, T 0 ` +WVۄ`$$a.|%2<J\e3 + &=762367#&'&#367&#&#"3274/"34?3'35732?5#+'535^-J|@h'\-e@<r2&H); uZJM =9jl:jgb.Qi2Q|酝:*}( dpR!h j `]_i$x:-(^%,3"ؿEa HMP E7g /:BR`j # &5%6; 65%&# 327#57&/#2#&'676+'%3#'#&/47'3327##'%3#"/6j1M{ǮG&z v$ExݨE(+=R:n:D!s Y!gQKum;} uA;>e=g¯Cy??ԢB|*>w4I ' 5@` bC$ j$H?iM!%.|7H27&' # &5%6367&#'.7&67263'#%; 65%&# mJB|e6O}°I+o|BJn^jaygwaaygxaj^w$FyتFG퇢D{C?` B]ww]B JХC}.?yP%.232#!7&!"4#".54767267p   {u*_ Jcllm8*#I%<($|ʀX#{Nwt7mnld4)5:IIIB,<_4767632#"'&'&!%!!  >W$`4 Z|b<_/374767632#"'&'&4767632#"'&'&!%!!    UW$`H    Z|b<_/GKO4767632#"'&'&4767632#"'&'&4767632#"'&'&!%!!      UW$`H      Z|b<[/G_cg4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&!%!!    /    UW$`  K     Z|b<_/G_w{4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&4767632#"'&'&!%!!    /      >W$`  L      Z|b<V/G_w4767632#"'&'&%4767632#"'&'&4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&!%!!  0      /    UW$`+    .      @  Z|b.t )2 $$ >54.#"4>32#"&h..--t*Ƅ2..2/.y )62 $$ >54.#"4>32#"&$2#".46h..--1.-.y*Ƅ2..2//2..2/.t 2 $$2>4.#"h-..-t*f/2..2/.j '2 $$2>4.#"$32>4."h-..-q.-.1-j*f/2..2/y2..2/R7!!R-ӖR7!!%!!RMzM; 67'&/#'3#67$#%ׯP==Ͱ̼bN+#!f"K++!|o554.#"##"'5##"&'&'0!5!5&'.4>32!!676767'7' :!9!"9 :! F GF;kY_1278e56d:81)RLk<GG E~^ : : ; ;NG 5 e4G( Li) enf77fne )i (G4e5 G( Pm 9Y%&'%67&673&/'67'&'"&'4?&'37' '7 &/7&'#>7$%88EFu/- 6uNDL22LENu/80uFD8jU45B%y\A@Yy$F 0=/0 ,-X70 ;~*2 %% 2*~697X-,oo  +F9d1 ) ( 1d9C1*CT'&#"'5&767#&$'&%'6'&'''$'676'&5$'6%'.54>32D$ "@F,NNNvF8p^Lb2  N**+ B@0"AR/0?wA%od/D&3.YaQ/5#3$"uI' @3/u= =#n- .... w3% % 32+#".7!"&'&'#&=4;73737D*$#GFHH%#Ι+(&aa'm99m9 3.055_4i4_550.3k  #tttk"632&'.'#####֊v)%8 _^>:k{ZG_?g@`H,>|:=+,j,,<6O/233<bbJ 132>4.#"367#&7&$735&'.4>2,P*+P,.N+)PƗd"/%(MM~95DLMNMD2)WN,,NWP**g!ʇw֜s~  &JJ&?GO277''"/&'&'7&'&'7&47'6767'676?  6"&462EG#96\>42(p __ p(24>\69#G#:5\>42(p __ p(24>\5:'NmNNm U%4m+3 EJ5:6JE 3+m4%T  T%4m+3 EJ6:5JE 3,l4%T '\nMMnM* ? !&+05:?DP3&7"7&'7&'7&'7&'6'6%676767&77&77&'"32654&'5&'.4>323#67#&#"'5&'&547&"'6%6761a$O` "NiB*4l,4"U47),3($aM#"aT*BF 4,=44#Y3,)0BB0/CBO"!-$F$FJF1.#- -#-2MJF$G# 8<g7*!2U6J%n=_CBnT> rYw0d "*7]6U$u=n;wBLz >\e0wZ3C.1BB1.C(N "%""%" M#p.PA.$;QW$.AP-{ "R &.FR2#".54>&'767&%76'&''67&'&'&'67676547676'&7>3263'##"'&'&'&54767&'&547676&'&#"6&%6767&'&'&676&5467&'&6732767&h@9h),)RP|  |PR-*g:>/**Y&()((')&&)')(()% @9f+.TR"`33`\_ .np, 00441/ ,pn, ]]&&()&&EEEJ032WyQT.,d9@.**..1230IDE%&**%&F+.SEFE.IMMI."#FES. !  ";-0.--.0IM+.REF$$1.%2S_`Q2%-1OQQO2-$3Q`_R3&.>GIIG"" 7447#.$$FER/+L"  !75/57%"IJJI* )p~67&'67&'4&6%67.'4'6&&'6767&54?67&'&#&'#&'5&'"'67&'&47632>4.#"72#".4>"0'-, )*#'05%"*%%, ),,"GNYI'+""$(JYNO21, 9,4=SM:7,: -12-[[Z[]WXIOMKLMN2 Y{\ bCWDJgABcp7L^BML0b \u]! @R%KlhhO+ww+O hhlK$PZX'@D 0:)ww*;0 EA&XZw[[[[GJMMJ"( %3!'#!52#"62#".54>o:5(67%'$(n H0L*I"33'554#$/* PR 6h"&>I > >A>!!ua!&5476'#5!+{h_a66mHHm.rZy'#"'&#"'&'&'&547676763232767676'&'&'&/&'&'&547676762!2!%3276767654'&'&'&#"&#"3276767654'&'&˗Pz  ,D@   7;+  23  M98G ):               r         0   L:5U        .\ r26767654'&'."#"'%"'&'&'&54767676;27>764'.'&+"'&'&'&547676762%632$"26767654'&'&#  #  @!R763276;%326767654'&'&'&#"6767654'&'&'&#"32ɓ E79E"  21 +96  >B+  # zOo              49D   /    "    :           =JZx-4H67&'&'&+"'&'&'&4767676327632 #"/#"'&'&'&54767676;276276767654'&'&'&"276767654'&'&'&""'&'&'&547676762"'&'&'&547676762'&'&'&547654'&'&'&";276-&#"+"276767654'&5476%327%&"'&'&4767628?.  !  !a=?^'_)\?=a! !# "!.8?""  "  "  "   f  2 .?E S@6f G=. 2  ŕ6@  B   )_>9 9>_)  % I        ? *        ;d.      ?P   !-  @( ,#%>  NpNM&_*# (! &) ,,f&  ! (K_  Z0-  Yi D   cp-)L &gK1 [N3$ n/ "!0{I"H#fmt2>,7HBI.;/8[, Q[z)  .)S9L *E   '+(4%(4  *X >  7A) 0'-570+I;-% *#%(0  ]'5.  U-9Lp{7654'"'&#"+"'7&54?67676763276323273#5%6767'&#"6%"/67#"27632327654'73654'676547& t!M#l5G;@\ 2BX-0%-m * '?,N ?'!&R;-> <\-R5-6E!"$b$6$!q",; t@P"#C  *FS "DX@! %z$(`]jMP   &O/+@ p_u<  3  DMKZRdYL6D_YBI5.!!''kGWz")3SZ67654/##3276?7%754'654'36767632#"'&54767632'0,,; (| w| ki5.U,\\    %g .  ;,-0j{w {w3V. T, \[^     -5& '-EL4'&'&/767675'7! !'7!654'!4'!!$4767>2"&'&'!654'$$CCC||]V|V#u    9Z(f(Y7%$66%"'&'&'&47676762%'b&I    )^tN/  /dIW?    @ViDV /  V%&%$64'%%&'&'&"27676@))< "  " ]NO]    9|23277632#"'&'&5476"# 6v>? (-=%P8j?  #j<  y"$"JrB23277632#"'&'&5476"" YTo k%,02?=V8jiA{C {u+'qP?  ' 7 sssssstsXrsrtsssr@Q  ' 7 5NB2632#"'&'#"'&547677&'&54763267632676   Bt  ah>) c!  ,Hs *ܡ   },"2A "  {3+Q26#"'#"'&'#'&'#"'&547&'&54767&'&54763267632676  ΂    NjM  rkW* & \ *3 #ﳎ*3 Tv! ( 5+" , @V #!!!!!%!!!!!!!!#!5!3 ;E;JEJJJ<;E;EJK!IKV{ !!!!!!||uv9f35#7!!#!5!3*+մܳ*ִ0r!!%!!!!!!/0``1/`1) !!#!5!3^^^~S3!!'#'!!#!!3!5LDʃDMA #5!#3!3'3#!#35!3###5353;9nj#5AI##0vQ#"#3;54'&'&'!"3276767653#4'&'&'&+3!52767>5/]LED73!&&54GBO]63H>SkS>H388]OBG45&&!35FEL]63H>SS>H38882I32367675&'&'.5467676236767>32#"&'&'&'#"'&'.546767675&% >#"? ?"#>    G   >#"? ?"#>  G     F  >##> >##>   F    ?#"> >"#?4'&'&'&'.54767676322767676767632#"'&'&'&'&'&#"'&'&'&5476767676765"#"'&'&'&5476767632B ,#,+%) 3!, &&*-#''#-*&& &$0 )$W$) 0$' L+,$&&$,/"&&$b3") M*,%&&%,."'%%0 )$W#) 4!, &&+,$''$,+&& &$1 ,#,+$)0267632#"'&'&'3&'&'&54676763267632#"'&'#"'&'&'&5476767#6767632#"'&'"'&'&'&54767#"'&'&'&54767676325##"'&'&'&54767#"'&'&'&476767632&'&547676763235#"'.'&5476767632&'&54767676h             -  (                  '    *             .         +j276767653"4'&'&'&+sidUS+*+'WPihtthiPW'+*+SUdi),)URhexuhbXR,,,,RYaitwfgSU),%t?247676763"'&'&'&5!276767653"4'&'&'&LEA86:4DDMMDD4:68AEtjdVT,*+(XQjhvvhjQX(+*,TVdj-76DCOME@:66:?FLOCC67-*UShgyvjbYS,-,-RZbjvyghTU*,(8 %%! !)ttJHcdecH]F]~]^C5 )!%%!2#"'&'&'&54767676hzt@z@Az@t{ne_RP)((&SNcdome_RP)((&SMdd0x}*(QObbrle]TP)**(QObbooe]TN+*(.'"276767654'&'&'! !_)(""""()_)(""""(Y$(*/.*(#  #(*./*($]^#< '1%%2"'&'&'&5476767! !#xxa)(#""#()a)(#""#(YDgghgD^I^W $(*0.+($  $(+.0*($ YZ(8 3'7'3!%%!! !hE۱CCDe g  g f ҁссi:]^= 3'7'3!%%!7!7'7!hTDEDDTNPPIQ2P11P2#mm(? -5%7'%!! !] P  gfeer­696ƌ]^^. /'%!!%!77!yrryyqm"_^^l%%tu%ߴ߳!63% %#'-7:|:||9|kֵֵkֶWz`37'%7% %#'ZZZZZ]^Z^ZZ˛ʜm˜˜mʜ0o #'!5!73!P6M6P$6PMP66R#6QLR6$Q6L$z     - h<_K <; L_zK <; J`;<_  '!'/7'?!7% % -[9^[[ZG^ZZz'}*}zy}*}'q^\\ZG^ZZ:\O}zy}*}'yz(}2 % %  h_y(_^(zFGs% % -hVHzVUzHrVU{HUVH% % -hhhႁhhhႂhhh$h7% %' 7-'hX5 5XV6 6g5VW6 6WV5 0t/37%!!%'#''7'%!5!%7'77;[TA:#T8#AT[TA#9T#8AT T8#AT[U@#7S#9@U[TA8#154'&5476276767632#"#"#"327232#"'&'&/"'&5476=&'&'#"'&'&54767632332?&547'&#"#"#"'&'&54767632676?>$,.c.,$> ]5 71+: H3> kR  Sk >3H :+17 7Z  >$,.c.,$? Z7 71+: H3> lR  Rk >3H :+17 9X  ib9@R'))'R@9dg  8d< +$;)01):$* \570+9 F3= kQ  Sj  =3F 9+077Y  >$,.a.,$? Y770+9 G3= kR  Qk =3G 9+079W     > h`9@Q'(('Q@9bf  7c<+$:)/0(:$+HH#:.'W4,CEH@,4W'*>&DL:Z##KGW,f ',;[;;+*Q--}KOW*AA*WSGu5-U&+;;[;,)  '+;[<>**Q--}KNW+@@-USFu5-S(+;>Y;+* !67654'&"327632#"'&'&/#"'&5476=#"'&'&5476763232?'&#"#"'&'&5476763254'&5476276767632#"'&#"#"'&#"327676%32767654'&'&#"#"i/)F)/,UK:M $\/8E(5>H6-EFJA-5H;8)D7.\# L;KU,*UK;K #\.7F'5>H5-DE-6H<7*C8/\$ M:K U+:6-21 4 $:<;$ 4 22-6 O;(A7##7A(; !*:#.#;&Rm!CcJMU)??,RMJcCoS%9#.#;)!  );#-$:'Qn!DcIMU*??*UMIcD oS%;#.$:* f /D;;D/ $i"276767654'&'&'767632#"'#"'&'&'&'#"'&'&'&5476767#"'&'&'&5476767632&'&5476767632o00'))'00o00'))'0]0+)*+%# #+%0%##&&.0%+%   #%'.0$,#0%-# #%'.0$.  #%'-1$,#$%*/0961/*%%*/1690/*%) "*&0-(%$$$)-0&*!&"*!$$)-0&-#%(-0&*"" (-0&*"$$(./& n%#"'&'&'&5476767#"'&'&'&5476767632&'&54767676267632#"'#"'&'&'&27654'&'&'&"67&'&'&'276767&54767'&'&#"276767654'&/?676767654'&'&'&#"h &,&1/(&#!$&1%-$!&$/'.)2$-%c%-$2-*++&$!$-%1&$!#&(/1&,& =s0 9 55%R 9 !_  , 9 R%5s  _!#'"+'0/)&$%%).2'+$ * '1.*%%%%*.1' * "+'2.)%%$&)/0'+"'#L% %L %#M L:2(&6  _ M#%   6&(2: -[3b &'#"'&'&'&547676763267'&#"327%327676764'&'.#"7632#"'%&'&54767676324676762676322##"'&'"'&'.5#"'&'&'&54767"'&'&'&54767676&'&'&'&'&'67676?&'32767677676765&'&'.#"7676767&'&'&/326767674'&'&'67'&'&'&#"67'&'&'&'67676767"276767654'&'&'"'&'&'&54?&'276767654'7654'&'&'&"67'&547676762    (  b  (       #!"G"!# * " ' ## G!""  '  Y m    ( y   ( O k  w  m Q (  O (     ? ?   + / L* / *   +. M+ .*   !!!! '? ?' "#& #'"!!  '? ?'  !"!  $&  m P    O        m     y    O k         b       %j<\l"276767654'&'&/2#"'&'&'&47676762#"'&'&'&54767676% %-[''!  !''[&( !! (TB39)+,+76?A3:(+,+76>tjeVT,++(XRiiuskdVT,**(XQijtuz"z!uv!z"z#&(,-''""''-,(&#e)*:6?;97,+)*97z88,+,*UThgyricYT+,,*USigtvjbZR-,zvvz"z vv!z29"327632#"'&'&/#"'&5476=#"'&'&5476763232?'&#"#"'&'&5476763254'&5476276767632#"'&#"27654'&%&'&#"327676%327632 654'&'&#"#"i"(-+S I9K #Y.6C&4<F4,CDH?,4F96(B5-Y" K8IS*)RI8J "Y-5D&3<F4,CC,4F:6(A6.Y# K9I R*"(-62 #9~3 #9; 01+56 00,5`%;G,A $.?'!3&@!*Yx$ ImPT]-EE0ZTPmI "zZ)!?&3!'@-$ #,A'!2'?!*Yx$ImQT\.EE.\TQmI#yZ)!A&2"'?.#~&41%%14>3t-3>41%%14>3f^CC^B%@#@@%@#-4>41%%14>4-3>41%%14>3+  V  ++  V  !r +?Sg"&46277''"'&'&476762"'&'&4767622"'&'&4767$2"'&'&4767eeeBABA#U##U##U##U#V%**%V&**KV&**&V%**~ffeAA$AAV%**%V&**V&**&V%**#U##U##U##U#  &3@MYam+%5%32476;#"'&'?632&54?#"632/&54#"/72#547"&462"'&=3?_?6 6  6] 6'?&M&C_CC_?&M&< 'L&&L'!6 6^6!6 >_CC_D<>"l267632%632#"'%3#"'&'"'&547#"'&54727%#"'&47632%&'&54763&5476h!#;'&1'h 9##8)'1!, ;#A#; '&1')8##9 h'12;# 4%.&! 6 = 6%".% 3 3 G%.56 = 6 %".G 4 $8 ! 54."#"54$32632#"_ ɀ~~a>E  %!#!3!p EE?p9E=V %!%!35!cE:d FF8 %!!![:F:\;[0q %!!7!N]<N;)G+t  ,o9; #q !rQk!k`!733}b>v!#7#)iC~' 4 4#' 5 5#g]jOS2#"327676765#"'&546;57!##"'&'&'&54767676%#     42;%-n`Ԯrr#26A@:V7:$)&7.Yq   % $.277g[(dVDQ49%*,04?()-#52&'&547676762"'&'&'&5476767hc"$njln(Lfe*+$$$$+*e*+$%%$+! #'(*dRjjSc*('!"%*,20,+%""%+,02,*%"%C&'&547676762476767622"'&'&'&5476767hcn(%X%&&&W%(nؖe*+$$$$+*e*+$%%$+,Dj*('(&,,&('(*kC"&*,11,*%##%*,11,*&".i%%&%&54767676247676762hhÔ*(42u24)(()42u24(*i\=97,*+*96@@69*+*,79=Zr_'#"'&'&'&547676763"'&'&'&5476767632_dA=;0-/.=:DD:=./-0;=Abx1.=8DC9() 1F="%".4"tNa5&$4! /.r<@6B2L_0>Q#kI|"rz7&)?),%=^K=.C26F@13.!9+cM313N676 547&'&327#"'#536767&'&'&5432&5476323254'&543253%5@26`', =NR6#!vWR>4 2:O t51"".1&X.RO A5ȏ )T/186,FAS :#(=:tA0 9SD 'A#5}11BO9 "'&'&'&547676763"3ᗊpm8884qlYTN! !C@RP]e:6pltm9:'62~~jf77"05276767654'.'4]PR@C! !NTYlq4888mpe'67fj~~27&:9mtlo7:fkR !&547jljjlyyxzQqpnc$0!!676n wu;;vi43f$lcC}U# 3tD}U 3 DutV.! !JV. ! JA! !m^\GHB ! ^^HHv!'7DWWWW|'7'7WWbW>W^$#"&=4&+5326=46;#"3xMe,,fLx1d=AOOA=dƂ׈ihDŽOߍOi(326=467&'&=4&+532;#"+5nCFVU$#Cn5BB*)p//oTBB¥P⎁AAPDBۇ45iDCS/~ #!5!3}t]} 7%d^=]d>S~5 /%0~##t] '-f\=]d]>-!'7!. (``I)=2"&'&'&5476?!".'&47>3!'&'&54767>2 '!  `!!  !' ,&   &   S~&!5! F78-x!5!5 V(Mr6u #3#3#3!!5 鴴ZZ---I(,,,,S~  55!#3#3#3F9UU**b]^bUUUS~!!5 F7.`tq!%  qR{V$%! S%@{V t%226=3!5 5!"'&'&'&6  $hI$  h$   6<47676763!5 5!"6  $hI$  $   $O!! e 6n55!lMlTwccwekl!5!!53 ' !_[y"kd""e/l5!!53 ' !_["/d""5 !73#57!%!6UcGjbzbdǩ""ap 5!'53#'!!!7%acߎA[؁(ZqZ{{{ĒҒ}TM %'!'!53 !;qKRnKa26wwIw22wT}> 3#5!7!!! ZQtZQ0L>ssjLK2Nu '!53#'5!'7! !pSn%R&%Ua2wKJ,Lw22w)1 '7!573#5!7! !r&j&St&SpWl6qM,LLyy77y@!6767632#"'&'&'!  6IYZgb^UMI%&&"LF\Zfc^UM3!t:6I&&&#LHZZhc\UMH'&&#L2<tt XNy "&*.37#37#37#37#5'!!55!!3'#3'#3'#3'#r+qr*rr+rr+rV{{*q+*r*+r++r+9Ɔ\]t] 7&#"7'7 #%5#t69.wZY96t".*X/S~k 55!5!!7'!nnUVGG8:ȏu\j '327'' #395t".Y/Y"u69.xXXN2%&#"6767&'&"67632&'&547676767}:"  s %*&*(&"!#!"O>>;*E/4767!"!47676763"'&'&'&5!3!&'&5v  5 $ %% $  H vgMME %!#"!% EMu\2&'&'&'&54767#"'&'276?&'&'32\":  #'$'$#Y@I:86s6::I  #&'#'" X  :5*+B67"'&'&'&547676$47676762"'&'&'%&'&'&547676762$[ /  H =a=   / ZI=X  q> d(*c     XJn.676767632#"'&'&'&%&'&54767&'&54765 #&+*1)F-Y)) .EOO/3S>>S&/ #$))%#]]#%))$#&e"'&'.54?654'&'&'&+"#!".4?64/&4676763!2;276767654/&54676762 I ]]I    Q      Q  %eg"'&'.54?654'&'&'&+"#!".4?64/&4676763!2;276767654/&54676762 GKa u~iKG E     2 +#76767&'&/3#6767!5!!5!&'&'g?j7R=y66y=R6k?VO S+ +Sd _8=eyu'&utj{J<p1 GM+ SR-PAdmR &567$'&76&#""+MG 1p7 mdAP-KS g264&"%!!"&462OsPOtOw#[륢S'MPQqOO>-"YR%u#\u ! !h i/u-1) 3%!!!!U2xxx #3!5!!50xUx2xQ ! !RppQ ! !pWz' | |Wz' } }5 !!d#xxx#xx#5 '7!5!'75xx#xx5!'7'7!d#xgx#xxx#xxݎxx# $%YzxˑP-,S'GF' 7654'mfxˑPS''|H r UH '_ H38 b u#\u h u-B\33##!##533RPPRB\333333#######5ُُPPُُRRRRPPPP/   ! !! ! hZ[MM-3zwXsXy'~CXy''~CT}!! 7J771!# 7881!3 85 ''!jxxGF5 !0wxF5 77!xGVxH5 !xGwT} !5 5! 7E7Jɩ771 # #3 ک878F8w7!!!xr$<w!!!xr<w7!!xr$<w%!!Yr$<w% h5bcJ6bw bc66bw ! bc6bw! 5bc6b w #)-17%#535#5#5#5##5'3#5#5#5#5#5##5##5###5ZssssVrrrrsZVr~rZHNrrrrZZrHNbVrrrrrrVV%%;#"'&5! !&'&+3264&#Tb'~V^ ,A/ Ok^yihz)lhh暶 A^yi_^`~!5!!5#"'&3227654'&"Z$3QRmtsaOOr<<>==><<6+b22rv/0YVV{##!!+53265}`byMdRsTqen! !!!!!i@m'\Z'cq`~!%!!67632#"'&4'&"276$3QRmtsaOO<<>==><<թb22p/0H!!!!'hh/`!!!/#`Aj2!$76676'&&`rkjs+*Z6j{4@BsSV}dxaM> !5#"'&'3276767654&+5!2,XZv<::40L^EE& Sb<ҵ@`45,,! >&64pnbo{&"26$  6 54&"OsPOsPp% ]`xxiPPsOO*=CWW K_Xd3!3h&D6.54$32.#";#"'%&'&'&'32654&'ߞge_`kr*(SU@aS@G:dLohvlmxPLU/.CFVP>((20Ejmp6GxY41TRcYCes%;#"/&'5!!FdSwkwF3Gxp`#'!767#"&5476?67654747! [`bede""^XD#. #F8LAB\VC)*= %(+C" Xy0'C:!#!/:+#5!!!V&3!! P/+!53!+ P#5331мtt#5331t#5331ht#53314t!#533#1t53#3м053#3d53#3h53#34!53#t!!#03!!#̼d3!!#3!!#d!3!0E 3'#'32+53265 ENPZ#j[Zy'dRyh}]fTkln'!J=!5!5!5!J>>!!# !#qed10!+eg`lDe"&'&#"3;!"&5#"'&!5!! ;2RbѶ{@'N ?28Ԅn+)b̜P !!3!#!P=g}^=/B=a{3##4&#"!!>32ENO[#jzi~`]f!!!!!"#5476+'B1TT9+h/B;NP33533#####5335:UUTT}}}\tk\\ff1"+.#"#"'#"&632632!3267"264&IF@L@J^XWZ"`a@{CBLKKKABE?UU0VVCJH #Hhhhhbo#2#"67.5463%""326&rv.6 VHrPixxijxx|=k)m9%QJ JG@& t ZYX  X<2<<991/<2<2990!!!!!!#53546;#"%%\۽PDB/-cNʜ0 J?@" t ZYX X<2991/<229903#!#535463!!#"۽B/cNʜ30L'  EL'  hX'  '  L' a EL' D lX' @ l' 8 0' S E`' . d]X'  `' D '  E'  ' 2 4' S ' G E&  5z<' ;[ _' @~ 'N$ E& N mD'N ?'N |!' 0 N&  4q&  j&  V|1' 8P N &  ,(q&  &  B"X ' ]475353;#"'&'&5327'&54767&5$02a@M(1l\>mF|iɖ{1'OZ$^>B/7*_lH>^OpbĘDh '@5~\c& W c& X  8X ' ]473#%3#;#"'&'&5327'&54767&5$02a@M(1l\>mF|iɖ{1'OZ$>>B/7*_lH>^OpbĘDh '@5\c& W lc& X @X ' ]48<5353&'&5327'&54767&5$';#"'&'!53JE>>mF|iɖ{1'OZ& 2a@M(1N.1]_lH>^OpbĘDh '@5>B/7 n\c& W c& X @X ' &]49=5335353&'&5327'&54767&5$';'!53MZ >mF|iɖ{1'OZ& 2a@M(.#._lH>^OpbĘDh '@5>B/?\c& W c& X T' a` '  b&aNU` & bN ]lnl1%!"'$47!32767654/&'&54767;#"' `pl,&y1[xH](45[ "G(79 -RTHLF0 b,@^n@",DX6,vB"C@,\ 04G?!+  c' n &  T+&  &    &%#"'$47!3276765'!;#"E EzjF/?I,6gb`-d t8@<"0@%3!"'&547!763&'&54767&'5%376'&'&'%67654'&#"kB)!F'-p 77/&9 A53 <$4#50!&'&54767&'53376'&'&'%67654'&#"&<*%D(E+k/61"  3]Q=ERH' >B*)!F'-p 77/&9 A5X %!#53276=!Hw,1VV,1j%#!53276=!3!!"^@,1"1,HH,1jj1,ut* rX' 3 ' ? 0v&kvkw ;#"'&=!1,cK\W#u71,\W+0x0y&yk*z&zk0{&{k|&|k;!}!&k}-Q'~W& B~Q'WQ& B'L '`fs & b&W& BV';tw& & p& pW !;! '&1,PWxj0,\e'  E&  X'  p' p %i' rV&  k' C Ek&  Ls3&  4R3&  >R' > E&  0q' 2R k' 7, X ' ]X & V (\c& W  c& X  X ]X /;#"'&'&'327'&54767&5$& na`(1l;)'I|iɖ{1'OZ$B(-s}n}c`D^OpbĘDh '@5\c&'&'&5672+5327676G+9RHK07hdw}[;  #4f5uTD4FD7< 33M! '_%5,iGec50$ $*   CARX,$ QB  8-Sm\daّ֔w<$6!`]]T'3WEfnf' -%&'+53276=3676+"7327654'&#"V<%&:WE*((0HNRXLگ]>4FD7$(/`rNN`Jfnf`-,$ QB 9"327654'&#"'&'+53276=3676;#"/EC8\?hڢ8Q%VE*(FOQX $3H3 &_QB*,$ b$/drNN`Jfnf' 5-' Oe& n & o & p  g %%327654'&#"%;#"/#!#53!632M,>5M5M5M(N365,K+)5!27654'&54767Z)6r u^Jf>^\$$(B;G&m16%*%Xy}qe$%)5!27654'&54767;#"'0V>)6r u^J',8.RP"\$$(B;G&m16%*$YYo#;#"''&'&7!3276765@390gL(5n$.0`UZkFOkK',7bCsL\ssj1+-3dij )5!2765!VP,0e\,1jl%#!532765!;!"^@,1"1,HH,2ilj1,<p$5;#"''&!4763&547632276'&'&'&#"D5("V  ntY2xAw~M`bp1& 04!+ 3DP&4OKf7*g?'J 7&':'*%276'&'&'&#+53767632#"31?1& 04"J@ZZ-aA`b|a7&'9`@(H.8XD/%276'&'&'&##"'+532767632;#"1?1& 04ui"IAkZZ+SA`b ,Dd7&'9Pl}P@(JG7'  &  O-3' R 3' R %rV| %&'&'2&'!;#"'0'#"'$5476 f=ef^E=S*%"*% '   P8C!N'-_ ;49rFq#+CIQ=ERHf\DM`L(22(L`MD\Y>GE:8E&uHg>MOufU`p\`wxxw`\p`UfuOM>gHL s  )"34'&!5 767"'&'&54763236Lut*8$4'&'&5476762;#"'&#"'&&7!2767#/1/N,`V@I #,+3 *L>Koz$m<49f,; 2$0bjCA2:Zᬪ *Ll,& #,lpS& lU& lS#"'5327!65!S;QjK`UrH{/!B_M PSgl%"'5327!65!;#"hjK`UrH{/!a=Mi PSg..j (  !46?>54&#">32!5h: &DX^Deb`T\\-?ZP> j: =TBV\L98FGDC+P=YNc{ !!!5!#!!3--%8`xxpp;f@10!#!f-1@ 1<20KTX@878Y3#%3#u810K TX@878Y@ //]!# !@   " "999991<<99990K TX"""@878YK TX"""@878Y@]             ! !.]'&'&#"#5463232653#"&j6-(mX$K&<'$'kX%G"<2j'<9j810K TX@878Y@ //]#7b@ 91<90K TK T[X@878YK TX@878Y@/// ]!#'#5߲Ʋh@ 91290K TK T[X@878YK TX@878Y@//// ]373ݲDz/wqB@ 9910KTKT[KT[X@878Y78]'T%#%vwck 3>323.#"bLM`c<=<=ck @  ]]120332673#"&bLM`k<=<=uk10!!kcbk/@ @O?/]1_j2^k$l"$:?02\[3#*2-~^xf $!$#1/GB  iuw^h68@6`azRK@mzdQLF6f_fj.<UjVo+\7/2C!Fx)Ab"$ +*"N? 5353!532^5353^? 5335353!53}^ I-  5dl %4'&"27>"'&47623J22J?@?@@?@$2%&2@@@@@??lXd@@%d p & &91/2990KSXY!!+53265!l\\y'dR; gnln!"'&547!32764'pg3|nuZqX4;TfnLH0DI0("6654&#322765#"'&54767632!&'&47!i)@5,!,)'j$i+TcQ_V.Nݢ057D(K#N$.=*,̖"Fc8(R&HTsu~]zJ\k' ' @ &  9X &]8X 1&] PX &] B'>a|:654'&32#"'$&7!3276767#"'&54767632,,;!%&,?Mﲥ{# $xZ;re73 C\|-wqb`YM]#&-#*B|^6()[:\^-"')Hac)s52(#4&o#"'$47!3276765'!T54765  >PZ=-\\SabeD^XB&ocMY;Q,CDGF89L\V@T? uYCo_<р?р?mTmmh!%5yBj-q{s}fosXXX!}umuVw\\Zj9so/9^Z\bZRbZ#oP7;Xw-wX--XFo9///!!!!!!w\\\\\wjjjj^^^^^^\\\\bbbbbbB;;!^!^!^ZZ\\\\\ubububub muZZZZ%wwwj\b\b\bD##ZoZoZojjjjjj;sss +-}a\}l[& ZPR\ b;ooZZus ns nQI!^\bjjjjj\!^!^ubu\b\b nubw!^!^o\\o\b\b=#jjZo6njs!^\\b\b\b\b;1%o 9nxxMFX\f0l|bbjjXlrPPP@DxbKRMhA[[[;XUTP:D.vne7wl=x^hF3BQJ4.98QIIUUHH - -)s.L )'JH --L) NNoSV;`S/-to - -X-Jas-yU!}!s\u!Vw\bZ\PZ6L68baP/bbLAHE@LbL@pi"$":4\b`Z cr-4\VV.muw!}( }wwuV\Z#PeNN(|S^Aw?\EVb;O7aN:(8`\\#;(\b/\ }u%NNZ997e ue!^!^\\\\\ } nww\b\b\b;;;e(}\ZGb!!bMpb+!jN#j@G!G!2!KjM4H!j!ij2p3\CPAgA6AHObggPuaQuQAb*.-;;YLXXX<< HH<L000*0;8l}>fBZZzXXXX l}>>LZZz>lyKGf{5SK}}TTHHfd>O>X5RRk i 3hbdPabbbbbdbbaabdb9b^baabcbaamMcP~5fiba)(+",DD*:PN D002())000$$.'&M"O""09M&UMb:jZ0OJ%$Jt2M'?'',,x 0"O9G.)"!^}}}ZZZZZ\\\ub CuuuZZZZVRVRVRwwww\b####ZoZoZoZojjjj9P9P77;ssso;b!^!^!^!^\\\\b\b    j;;;66666666q5T"h6,((  r@UUbbbbbb\&LLLLLLLL{n@@@@@@@@p*?}66bbLL@@66666666q5T",((@@@@@@@@p*?}6666666!!!  y   ) LLLLLL-@@@@@8UBZ--j9Z/&&&% I9% )"I&'I0J9YEn'<2 <,.Zg;;2J Zu!/////#/#/BBBBB;IBBBBBBBBBBBB9?222B77BBBBB BB B BBBBBBBB}}BBBBBBBBAB',B BBBBBBBB!w?ddcddcBXqy111 XXBJ/XXXXXXXXXXXXXXXWXXXXXXQQXXXXXXXXVVNXXXXXXXXXWXXXXXXXXXXXXVVXXXXVVXXXXXXXXXXZZXXXX>>2222BBBBXXXXZZXZZXXXXXXXXXXXXXXXX9?rn//  XG#X  C@_24BBBBBB!BBB!BBB-XXXB!XXXX@64HFFFn<<<<<<xxxxxxxhhiFiiDDu777777aa"5"Y::;+6.ocN8/&//0 "N`ya7g!!!!GCL54=/U28Y^CVpj6gv2 1.rjD7`./<KD$>K--9.7.P<<<<<<....RRs'J*R*"..:=4%=?D-W&W;%J@3@V90~0G+%(C(#(=(.6W0$2$0174!$%2 02)!"$E=80+Qg.rA1fnCDStSt-IS-6SS`{{66O6ee5a}T2)XtSuN*u5&%2SBu)QQWW|uBBPwXXT11T1`V!`AbsX//EEGelPa1b EEEEEEOOXXXX`` n n000*0;LEVEEXXXXXX``<< HTHTO<VLvlllll.- /oZ-P-EOlXXXLDDDDxXH0d  \  ` $p||,D d` x h !!P!!""H#@#$`$%& &'`'(@()**++,<,-.@./H0@112823(34t4t456 778(9\9:;<<@T>?H@@D@ALA|AABpBCC C@D4DXD|DDEFG8GPGhGGGGGHH<HII$IHItIIJ8K<K`KKKKLlM\MtMMMMMOhOOOOOPPP4PLQdQ|QQQQRRtS|SSSST TTU U8UPUhUUUUUUVV(V@VXVpVVWlWWWWWXXX4XLXpXXXXXYYY<Y`YZ,ZZ[[D[\[t[[[[\ \]]]]]^l^^^^___0_T_```x`````a ab4bhbbbbbcddddeee0eHe`exeeeeeff fDfxfgtggghh4hLhphhhhhi i,iPixiiijjj4jLjkkklDllm|mn\nlno8op,pq0qr4rsstttHttu@uuv4vvw@wXwpwx<xyyzz|z{{x{|,|d|||}}`}~~L~px\40H`x0Hh @Xp0H`x4Ld| $<Tl,D\t4Ph`,D\|4Ld`8d\d@00|H hpx<x(d<L`\LhLT@plX4XT8pP4|<lh8x Ì4tĄĔĤĴ,ň@Ɯ 0DlLjǜǰȸHXʔ ˬ@`̰̈(8HẌ͔́(t΄,XpϤ$@ThЌЬ@dшѴ4hҨ@ӤӴLԌLDpր֐ּ֠ @d׌؀ؘبؼ <dtلٜٴ $<Tl|ڌڜhxۈ۴ ,<x܈ܘ,<ݨXpވޠ޸߈@P0@\l4 |<Tl<(@XT`,|$p(``xH` Xh( 0(@P<L\l @<\$\(0HX8HX`p $    (     4 L  l|tH `p(8t4L4pt0$(@|4Ld|8Xhx 8Ph 0@P`pL  X  !8!"<""##$$d%%`%&0&'''(p()x)**`++L,,8,-P-`-. .0.P../0/P/0 0018112$23@334<45556677L78(8889@9:p::;D;;;<8<<=l==>>?T??@@l@AAxAAAAAB B$B<BTBlBBCC`CxCCDDE\EtEEFlFFFFGGHtHHIpJJ,JXJKK$KKL<L|LLLMM,M\MN<NO(OpOPPPQQ(Q\QQQQRR(R@RXRpRRRRRSxSThTxTTTTU<UV$V4VDVTVWDWX<XY(YZ<Z[[l[\X\]]^L^_l_`$`a@abXccd8ddeeXepef fpfg0gghPhphihiiij\jktl`lmn0noLopqq|rrs(stXtuvtwwxdy$yzTz{|h|}X~0d<tL(,(``,hH 4x 8xd\lX0 `\@0TT0\\PL\,D\t(@Xp8Ph(@Xp0H`x 8Ph(@Xx(@Xp4Ph(@Xp(@Xp0H`x 8Ph 8Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x(@Phx 8Ph(@Xp0H`x¨ 8PhÀØð(@XpĈĠĸ 0XhŀŘŰ 8H`|ƔƬ4Ld|njǨ $4Ld|ȔȬ,<TlɄɜɴ,TTTTTTTTTTTTʀʐʸ0Ldˠ<̜\͔pPPФ0PlҌ,Ӵ0`|ԘԴlդ ֐ 4pؠؼLٰٜ(<Pdxڌڠڴ,@Th|ېۤ۸@݄04 (tL| `p@l<8(Hh(H`H8h(X \`p0,pPDl  Hp4$l8xP4tl , h   4    h   @ |   4 p Td d\ P<,`X L$Pl<hPh   8 d  !L!""""##0#l##$$l$%4%& &'$'()X* *+p+,x,--$-D-d--.L.//H//0112223,3l34$4h45 5l56(6|67L78489t99::;4;x;<(<=4=> >T>? ?|?@$@A$AABHBBBC,C`CCDtE(EFG`HHI0IJJK0KKKL L4LXLLLM<MMNNHNxNOOLOOPlPQQLQQR0RS8STTLTUUVVVVVW,WTW|WWXX0XPXpXXXYY0YYYZZp[T[x[[[[\T\\]H]bPbbcc4c|cd,dDdePeheeffDffg ghghhhiiTijjdjjk8kklHlllmm(m@mXmmmnnHnnnno0oooopq@qqrPrhrs@sPs`spssssst0tu\vDwxxy`yz zHzdzzz{,{P{l{{{{|0|||}}l}}~ ~8~|~~~~ XD Dh<`0X4\,\0X$P|$L|L$\0d@hHt4`$h @pT<l8x <X| <Xt8Tp  D\<\@\8h<X,Tp$DxH`@TXp$l,T0Pxh (TptT<0ƤT xXˌXʹLИ\H`״XPܴ8,Ph$x$xt`dtpDx`8`8L\`$|t8\ pT    (D8@0| 0  !!`!"#$<%P%&t'(),t. ..//`1$24|849;<<?T@B CDHE(EFFtFFGHI8IlIIJJ|JKLdM NPhST(TUPUVtW0WX$XYYPYZZl[[`[\\h]^`bd8ehnorHsstvwxz${h{||H|x|}}}8}T}x}}}~xLHhL$`@hD<h<d,T,`H<LD(<,`L Ph,T|,`<lD$L<<\l 4\Dl 8h|0`<`L08`x 8Ph(@Xp0H`x$<Tl0H`0H`4Ld|Xhxdt@P,p,<Ldt,D\t4D| $<Tl,<8,4LdtDx¨H $<Td8Ƭ <,D\tɌɤɼ0ˬ˼0h̬̼`tΌΤμ` мTd(@Xp҈ҠҸPӨӨӨӨӨӨ4|Ԭ\֔tdؘp٠ Lhڄڠ(L|܈,ި4TtLHh(@P  +e@$_B] 5m  4     S *b *  &  "I : & hCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain DejaVu Sans MonoDejaVu Sans MonoBoldBoldDejaVu Sans Mono BoldDejaVu Sans Mono BoldDejaVu Sans Mono BoldDejaVu Sans Mono BoldVersion 2.35Version 2.35DejaVuSansMono-BoldDejaVuSansMono-BoldDejaVu fonts teamDejaVu fonts teamhttp://dejavu.sourceforge.nethttp://dejavu.sourceforge.netFonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. http://dejavu.sourceforge.net/wiki/index.php/Licensehttp://dejavu.sourceforge.net/wiki/index.php/License~Z   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  sfthyphenAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F4uni01F5uni01F6uni01F8uni01F9AEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236dotlessjuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0243uni0244uni0245uni024Cuni024Duni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C8uni02C9uni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D6uni02D7uni02DEuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EEuni02F3 gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0343uni0358uni0361uni0374uni0375uni037Auni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0theta1Upsilon1uni03D3uni03D4phi1omega1uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0472uni0473uni0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni04A2uni04A3uni04A4uni04A5uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04BAuni04BBuni04C0uni04C1uni04C2uni04C3uni04C4uni04C7uni04C8uni04CBuni04CCuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni0510uni0511uni051Auni051Buni051Cuni051Duni0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0559uni055Auni055Buni055Cuni055Duni055Euni055Funi0561uni0562uni0563uni0564uni0565uni0566uni0567uni0568uni0569uni056Auni056Buni056Cuni056Duni056Euni056Funi0570uni0571uni0572uni0573uni0574uni0575uni0576uni0577uni0578uni0579uni057Auni057Buni057Cuni057Duni057Euni057Funi0580uni0581uni0582uni0583uni0584uni0585uni0586uni0587uni0589uni058Auni0606uni0607uni0609uni060Auni060Cuni0615uni061Buni061Funi0621uni0622uni0623uni0624uni0625uni0626uni0627uni0628uni0629uni062Auni062Buni062Cuni062Duni062Euni062Funi0630uni0631uni0632uni0633uni0634uni0635uni0636uni0637uni0638uni0639uni063Auni0640uni0641uni0642uni0643uni0644uni0645uni0646uni0647uni0648uni0649uni064Auni064Buni064Cuni064Duni064Euni064Funi0650uni0651uni0652uni0653uni0654uni0655uni065Auni0660uni0661uni0662uni0663uni0664uni0665uni0666uni0667uni0668uni0669uni066Auni066Buni066Cuni066Duni0674uni0679uni067Auni067Buni067Euni067Funi0680uni0683uni0684uni0686uni0687uni0691uni0698uni06A4uni06A9uni06AFuni06BEuni06CCuni06F0uni06F1uni06F2uni06F3uni06F4uni06F5uni06F6uni06F7uni06F8uni06F9uni0E3Funi0E81uni0E82uni0E84uni0E87uni0E88uni0E8Auni0E8Duni0E94uni0E95uni0E96uni0E97uni0E99uni0E9Auni0E9Buni0E9Cuni0E9Duni0E9Euni0E9Funi0EA1uni0EA2uni0EA3uni0EA5uni0EA7uni0EAAuni0EABuni0EADuni0EAEuni0EAFuni0EB0uni0EB1uni0EB2uni0EB3uni0EB4uni0EB5uni0EB6uni0EB7uni0EB8uni0EB9uni0EBBuni0EBCuni0EC8uni0EC9uni0ECAuni0ECBuni0ECCuni0ECDuni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10F6uni10F7uni10F8uni10F9uni10FAuni10FBuni10FCuni1D02uni1D08uni1D09uni1D14uni1D16uni1D17uni1D1Duni1D1Euni1D1Funi1D2Cuni1D2Duni1D2Euni1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D62uni1D63uni1D64uni1D65uni1D77uni1D78uni1D7Buni1D85uni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Buni1E9Funi1EA0uni1EA1uni1EACuni1EADuni1EB0uni1EB1uni1EB6uni1EB7uni1EB8uni1EB9uni1EBCuni1EBDuni1EC6uni1EC7uni1ECAuni1ECBuni1ECCuni1ECDuni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE8uni1EE9uni1EEAuni1EEBuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni2010uni2011 figuredashuni2015uni2016 underscoredbl quotereverseduni201Funi2023uni202Funi2031minuteseconduni2034uni2035uni2036uni2037 exclamdbluni203Duni203Euni203Funi2045uni2046uni2047uni2048uni2049uni204Buni205Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni2095uni2096uni2097uni2098uni2099uni209Auni209Buni209Cuni20A0 colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9uni20AAdongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20B8uni20B9uni2102uni2105uni210Duni210Euni210Funi2115uni2116uni2117uni2119uni211Auni211Duni2124uni2126uni212Auni212B estimateduni2148uni2150uni2151onethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2189 arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21D6uni21D7uni21D8uni21D9uni21DAuni21DBuni21DCuni21DDuni21DEuni21DFuni21E0uni21E1uni21E2uni21E3uni21E4uni21E5uni21E6uni21E7uni21E8uni21E9uni21EAuni21EBuni21ECuni21EDuni21EEuni21EFuni21F0uni21F1uni21F2uni21F3uni21F4uni21F5uni21F6uni21F7uni21F8uni21F9uni21FAuni21FBuni21FCuni21FDuni21FEuni21FF universaluni2201 existentialuni2204emptysetgradientelement notelementuni220Asuchthatuni220Cuni220Duni220Euni2210uni2213uni2215 asteriskmathuni2218uni2219uni221Buni221C proportional orthogonalangleuni2223 logicaland logicalor intersectionunionuni222Cuni222D thereforeuni2235uni2236uni2237uni2238uni2239uni223Auni223Bsimilaruni223Duni2241uni2242uni2243uni2244 congruentuni2246uni2247uni2249uni224Auni224Buni224Cuni224Duni224Euni224Funi2250uni2251uni2252uni2253uni2254uni2255uni2256uni2257uni2258uni2259uni225Auni225Buni225Cuni225Duni225Euni225F equivalenceuni2262uni2263uni2266uni2267uni2268uni2269uni226Duni226Euni226Funi2270uni2271uni2272uni2273uni2274uni2275uni2276uni2277uni2278uni2279uni227Auni227Buni227Cuni227Duni227Euni227Funi2280uni2281 propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni2288uni2289uni228Auni228Buni228Duni228Euni228Funi2290uni2291uni2292uni2293uni2294 circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni229Euni229Funi22A0uni22A1uni22A2uni22A3uni22A4 perpendicularuni22B2uni22B3uni22B4uni22B5uni22B8uni22C2uni22C3uni22C4dotmathuni22C6uni22CDuni22CEuni22CFuni22D0uni22D1uni22DAuni22DBuni22DCuni22DDuni22DEuni22DFuni22E0uni22E1uni22E2uni22E3uni22E4uni22E5uni22E6uni22E7uni22E8uni22E9uni22EFuni2300uni2301houseuni2303uni2304uni2305uni2306uni2308uni2309uni230Auni230Buni230Cuni230Duni230Euni230F revlogicalnotuni2311uni2312uni2313uni2314uni2315uni2318uni2319uni231Cuni231Duni231Euni231F integraltp integralbtuni2325uni2326uni2327uni2328uni232Buni2335uni2336uni2337uni2338uni2339uni233Auni233Buni233Cuni233Duni233Euni233Funi2340uni2341uni2342uni2343uni2344uni2345uni2346uni2347uni2348uni2349uni234Auni234Buni234Cuni234Duni234Euni234Funi2350uni2351uni2352uni2353uni2354uni2355uni2356uni2357uni2358uni2359uni235Auni235Buni235Cuni235Duni235Euni235Funi2360uni2361uni2362uni2363uni2364uni2365uni2366uni2367uni2368uni2369uni236Auni236Buni236Cuni236Duni236Euni236Funi2370uni2371uni2372uni2373uni2374uni2375uni2376uni2377uni2378uni2379uni237Auni237Duni2380uni2381uni2382uni2383uni2388uni2389uni238Auni238Buni2395uni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23A7uni23A8uni23A9uni23AAuni23ABuni23ACuni23ADuni23AEuni23CEuni23CFuni2423SF100000uni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254Buni254Cuni254Duni254Euni254FSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000uni256Duni256Euni256Funi2570uni2571uni2572uni2573uni2574uni2575uni2576uni2577uni2578uni2579uni257Auni257Buni257Cuni257Duni257Euni257Fupblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxH22073uni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EEuni25EFuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2601uni2602uni2603uni2604uni2605uni2606uni2607uni2608uni2609uni260Auni260Buni260Cuni260Duni260Euni260Funi2610uni2611uni2612uni2613uni2614uni2615uni2616uni2617uni2618uni2619uni261Auni261Buni261Cuni261Duni261Euni261Funi2620uni2621uni2622uni2623uni2624uni2625uni2626uni2627uni2628uni2629uni262Auni262Buni262Cuni262Duni262Euni262Funi2638uni2639 smileface invsmilefacesununi263Duni263Euni263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647uni2648uni2649uni264Auni264Buni264Cuni264Duni264Euni264Funi2650uni2651uni2652uni2653uni2654uni2655uni2656uni2657uni2658uni2659uni265Auni265Buni265Cuni265Duni265Euni265Fspadeuni2661uni2662clubuni2664heartdiamonduni2667uni2668uni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2670uni2671uni2672uni2673uni2674uni2675uni2676uni2677uni2678uni2679uni267Auni267Buni267Cuni267Duni267Euni267Funi2680uni2681uni2682uni2683uni2684uni2685uni2686uni2687uni2688uni2689uni268Auni268Buni2690uni2691uni2692uni2693uni2694uni2695uni2696uni2697uni2698uni2699uni269Auni269Buni269Cuni26A0uni26A1uni26B0uni26B1uni2701uni2702uni2703uni2704uni2706uni2707uni2708uni2709uni270Cuni270Duni270Euni270Funi2710uni2711uni2712uni2713uni2714uni2715uni2716uni2717uni2718uni2719uni271Auni271Buni271Cuni271Duni271Euni271Funi2720uni2721uni2722uni2723uni2724uni2725uni2726uni2727uni2729uni272Auni272Buni272Cuni272Duni272Euni272Funi2730uni2731uni2732uni2733uni2734uni2735uni2736uni2737uni2738uni2739uni273Auni273Buni273Cuni273Duni273Euni273Funi2740uni2741uni2742uni2743uni2744uni2745uni2746uni2747uni2748uni2749uni274Auni274Buni274Duni274Funi2750uni2751uni2752uni2756uni2758uni2759uni275Auni275Buni275Cuni275Duni275Euni2761uni2762uni2763uni2764uni2765uni2766uni2767uni2768uni2769uni276Auni276Buni276Cuni276Duni276Euni276Funi2770uni2771uni2772uni2773uni2774uni2775uni2794uni2798uni2799uni279Auni279Buni279Cuni279Duni279Euni279Funi27A0uni27A1uni27A2uni27A3uni27A4uni27A5uni27A6uni27A7uni27A8uni27A9uni27AAuni27ABuni27ACuni27ADuni27AEuni27AFuni27B1uni27B2uni27B3uni27B4uni27B5uni27B6uni27B7uni27B8uni27B9uni27BAuni27BBuni27BCuni27BDuni27BEuni27BFuni27C2uni27C5uni27C6uni27DCuni27E0uni27E6uni27E7uni27E8uni27E9uni27EAuni27EBuni27F5uni27F6uni27F7uni2987uni2988uni2997uni2998uni29EBuni29FAuni29FBuni2A00uni2A2Funi2A6Auni2A6Buni2B05uni2B06uni2B07uni2B08uni2B09uni2B0Auni2B0Buni2B0Cuni2B0Duni2B12uni2B13uni2B14uni2B15uni2B16uni2B17uni2B18uni2B19uni2B1Auni2C64uni2C6Duni2C6Euni2C6Funi2C70uni2C75uni2C76uni2C77uni2C79uni2C7Auni2C7Cuni2C7Duni2C7Euni2C7Funi2E18uni2E1Funi2E22uni2E23uni2E24uni2E25uni2E2EuniA708uniA709uniA70AuniA70BuniA70CuniA70DuniA70EuniA70FuniA710uniA711uniA712uniA713uniA714uniA715uniA716uniA71BuniA71CuniA71DuniA71EuniA71FuniA722uniA723uniA724uniA725uniA726uniA727uniA789uniA78AuniA78BuniA78CuniA78DuniA78EuniA790uniA791uniA7AAuniA7F8uniA7F9uniF6C5uniFB52uniFB53uniFB54uniFB55uniFB56uniFB57uniFB58uniFB59uniFB5AuniFB5BuniFB5CuniFB5DuniFB5EuniFB5FuniFB60uniFB61uniFB62uniFB63uniFB64uniFB65uniFB66uniFB67uniFB68uniFB69uniFB6AuniFB6BuniFB6CuniFB6DuniFB6EuniFB6FuniFB70uniFB71uniFB72uniFB73uniFB74uniFB75uniFB76uniFB77uniFB78uniFB79uniFB7AuniFB7BuniFB7CuniFB7DuniFB7EuniFB7FuniFB80uniFB81uniFB8AuniFB8BuniFB8CuniFB8DuniFB8EuniFB8FuniFB90uniFB91uniFB92uniFB93uniFB94uniFB95uniFB9EuniFB9FuniFBAAuniFBABuniFBACuniFBADuniFBE8uniFBE9uniFBFCuniFBFDuniFBFEuniFBFFuniFE70uniFE71uniFE72uniFE73uniFE74uniFE76uniFE77uniFE78uniFE79uniFE7AuniFE7BuniFE7CuniFE7DuniFE7EuniFE7FuniFE80uniFE81uniFE82uniFE83uniFE84uniFE85uniFE86uniFE87uniFE88uniFE89uniFE8AuniFE8BuniFE8CuniFE8DuniFE8EuniFE8FuniFE90uniFE91uniFE92uniFE93uniFE94uniFE95uniFE96uniFE97uniFE98uniFE99uniFE9AuniFE9BuniFE9CuniFE9DuniFE9EuniFE9FuniFEA0uniFEA1uniFEA2uniFEA3uniFEA4uniFEA5uniFEA6uniFEA7uniFEA8uniFEA9uniFEAAuniFEABuniFEACuniFEADuniFEAEuniFEAFuniFEB0uniFEB1uniFEB2uniFEB3uniFEB4uniFEB5uniFEB6uniFEB7uniFEB8uniFEB9uniFEBAuniFEBBuniFEBCuniFEBDuniFEBEuniFEBFuniFEC0uniFEC1uniFEC2uniFEC3uniFEC4uniFEC5uniFEC6uniFEC7uniFEC8uniFEC9uniFECAuniFECBuniFECCuniFECDuniFECEuniFECFuniFED0uniFED1uniFED2uniFED3uniFED4uniFED5uniFED6uniFED7uniFED8uniFED9uniFEDAuniFEDBuniFEDCuniFEDDuniFEDEuniFEDFuniFEE0uniFEE1uniFEE2uniFEE3uniFEE4uniFEE5uniFEE6uniFEE7uniFEE8uniFEE9uniFEEAuniFEEBuniFEECuniFEEDuniFEEEuniFEEFuniFEF0uniFEF1uniFEF2uniFEF3uniFEF4uniFEF5uniFEF6uniFEF7uniFEF8uniFEF9uniFEFAuniFEFBuniFEFCuniFEFFuniFFF9uniFFFAuniFFFBuniFFFCuniFFFDu1D55A dlLtcaronDieresisAcuteTildeGrave CircumflexCaron fractionslash uni0311.case uni0306.case uni0307.case uni030B.case uni030F.case thinquestion uni0304.caseunderbar underbar.wideunderbar.smalljotdiaeresis.symbols arabic_dot arabic_2dots arabic_3dots uni066E.fina uni06A1.init uni06A1.medi uni066F.fina uni06A1.finaarabic_3dots_aarabic_2dots_a arabic_4dotsarabic_gaf_bararabic_gaf_bar_a arabic_ringEng.altuni066Euni066Funi067Cuni067Duni0681uni0682uni0685uni0692uni06A1uni06B5uni06BAuni06C6uni06CEuni06D5exclamdown.casequestiondown.case uni2E18.case@tGG22dk  Y&Y@&2G@AGA2k2%e}f2 ]%]@%e2d~}d|S{f{2zez2yxfxdwvts s rq.rq.pfp}onmnml]mmli%l]l@kkji%ji@%hfhdgfgdfefedcba}`^d\[\[Z2Y-YXWWV2UTS TS RQRQPQPONMdNMdLKJIJIHGF}EDE}DCA?2>=<=<; <; :9:98 998 8@76776-6545K4343212d1-10/@0D/.-.-,--@@ ,+,,@ +*++@ * **@W)K('K&$&$%$%K$$#""2! 4!>  42@ @@ @WK77222X}X       @   @   @ @  d+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++snek-1.1/doc/fonts/DejaVuSansMono-BoldOblique.ttf000066400000000000000000007562741353657467200220320ustar00rootroot00000000000000 FFTMo9,GDEF1a&HDGPOStGSUB ed`OS/2Vcmapcvt >8fpgmQ0gasp glyf4headGh6hhea $hmtx\&loca`)*@maxp BT, nameTL!postytuc?prepԱ,=}}<deefghuv m n o p  N\DFLTcyrl$lao .latn:mark ntz "(.4:@FLRX^djpv|cIgMaH+u^D,vdJdJ`F-waGbHcI;oQQ ;obI;ofM<paGaGdJQQ `GaGW=Hbeehu>DJPV\bhntz`|| DFLTcyrl&lao 8latnBSRB F CAT PESP PGAL PISM XKSM XLSM XMOL bNSM XROM bSKS XSSM Xcasedlig locl&locl, " $(@  h oO nLI  c A363Ef   Ry PfEd! m`, , ~!AEM?CXauz~_csV_? .<[ex{-McyEMWY[]} # & 7 : ? I K _ q !!!!!!!"!$!&!+!.!H!Q!_!""" "#"-"="i""""""""####!#(#+#z#}#####$#&&<&G&g&o''''''))))**/*k+ +,d,p,w,z,...%..' !$CLPCXatz~br1Ya?,0>bw{0Th| HPY[]_  & / 9 < E K _ p t !!! !!!!"!$!&!*!.!H!P!S!!"""#"'"4"A"m"""""""#####%#+#5#}#####$#%&8&?&`&i''''''))))**/*j++,d,m,u,y,|...".."ogUQNIHGFE75' ~xge\GF{kihec ~vqa`^\YWNLJF=8FD/,'/!ߵ)#!c@c[bewx{{-0M0TcNhy^|p EHMPWYY [[ ]]_}.cr   # & & / 7 9 : < ? E I K K _ _ p q t    !!!!! !!!"!!%!!'!"!"(!$!$)!&!&*!*!++!.!.-!H!H.!P!Q/!S!_1!!>!"?"""" "#"#"'"-"4"="A"i"m" ""(""A""E""F""K""P""`##a##h##v##!x#%#(~#+#+#5#z#}#}##########$#$#%&&8&< &?&G &`&g &i&o '' '' '' '' '' '' )) )) )) )) ** */*/ *j*k ++ !++ *,d,d 3,m,p 4,u,w 8,y,z ;,|, =.. A.. B.".% C.... G H W"' \ b h j k m n pZZ u   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpk(vjsgwl|cnTm}b : n oyewqstuzxvf#3#N#'#\ ##3##/%%1/;sqoV#d\H```{\{`o7L'5%={D=!/s, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-hh@ 7/10!%!!hsr)R ]@.    49    99991/0KSX9Y"!!! # 7# f!qe@ 91<20!!!++N@3      91/<2<<22<<220#3333#3#####73#73J^^^6H6^_^_5H5^qrvuu%v'D /m@;)%%$(<54&#.'.54$?3.';Rb95HS49Ua3YWD0/GL22 ZD*9-.,=BZ(|',.! '3V@-(  (?? ?>.?%1"+1""499991/999904632#"&"32654& 4632#"&"32654&!?9PP9:OP)˹=8ON9:QRXO::OO:9PP`^P::OP99Q&0@O$%$&%%$()'/.040'$ % -<;C<BE%%!&!0$ ' !* 199999991/99990KSX999Y"%#"&547.54$32.#">73!3267VWź FA16BX^&(*0 xlsZ^^,Z.H23հi:d/#&GB"tW :][4\c910!+R7 @ G   99910 #&5789RPۏͦJ"F!qV @G  999104'3q89QQ8[%3y9TJ@(   B   <2<2991<22990 %#'-73%TJLLLLKLXXB\ #@ H   <<1<<0!!#!5!RPRPo4@4I10KSX9Y"!#:6׬o9910!!+u8\o/@4I91/0KSXY"!!NFoB3@ 49/9910KSXY"3#TmZw /@ J$J-B$E0 '010@////////// / / ?????????? ? ? D@@@@@E UPPPPPU ookkkkk k o   C////////// / /  ]]4632#"&3267654&#"#"&547>32I45JJ54IjDG@k$6ABGCj$6AfUIeSJ5HI43IGqljc\rkheI+ O@(4JJ9J   991/20KSXY"!%!!!^J3F53bL J/oc@24LK JBJ 9999991/9990KSX9Y"!!7%6754&#">32bi3K13^pcRv3me:(.RbHQ;: (*{"`(M@,M LK#M L K MBE) ) &  )999190#32654&#">32!"&'32654&4|sjSn6hXfz6`loUFL*( Ÿ$&$.0Rc` o@<      4 J9    991/<290KSXY" !!3#!!u51>?:jBj@84JLKJ J9 E  999190KSX9Y"!!>32!"&'32654&#"T+35!H)__3F_ǎzNO  (*hy(&` '8@M M L KM%BE(  (91904&#"326.#">32#"&5476$32#[Mi[Kln3?654&#">32Z 7XX]kJEYt5fhbui~`N]~C9>IH 7:_bVis ?a@4-0)? OO P,)O0P O09@? < ,- <&<3@999991999902654&#"#7#"&5432>54&#"3267# 476$32hQGgP+r<Hh |i|X[`OQ?k_XTtP-MXS]R1531/#B[kv{؛0095~D<ͨ@$ n@:      4<Q9    91/<90KSXY" !!!!!hqpq+q#@I###  # #4T T9T S"  "#$9991/90KSX9999Y"] ]32654&# 32654&#%!2#!VŜjoTDy{VZK׾LEKFVRFmjD@릤 l?C<J@UCVUCV BE  99910K TX @ 878Y%#"476$32.#"3267MUyaRM@2XP6EU~vQ^+$$nr$$DEaUkӇCI ]@+   4V 9V    9991/0KSX99Y" ]]3267654&#! #! `p+4A};%hH^?XXj%~ WqE\P U@/  4VV9 VS   91/0KSXY")!!!!!_ 3??1L{y/ P@+4VV9S   91/0KSXY"!!!!!>B3#uf&x@3#&& !"&4"##V%VUCV BE'%$#"&'991990KSX9Y"K TX'@''878Y%#"476$32.#"3267#7!FsxbQMB3QG4)E "t$?91^;@"os$$CF;9/~MbN# @?     4VS9   91/<20KSXY"P]@ PPPPP]!!!!!!'oqn'ف9+h J@&  4V9 V    991/220KSXY"!!!!! 3y3׼)43)3R@+  4 UCVV 9E  991990KSX9Y"'3267!!#"&ANgtq4!RCCqoNX`_l 7785X w@B      49   91/<290KSXY"!! !!'l3\R_- P!6@4V991/0KSXY"3!!P#'w3/  @I     4 9   991/<290KSXY"K TK T[X @ 878Y@>  /////   '//)/;8]]!!## #a1)h/q+qR @:  49  9991/<2990KSXY"(]@*5(*'%300005QWPPWPWPW]]!!! ! /=+==)P@V'VB'E*! *10@+0044553300000000 0!0"0#0$0%]4&#"3267>7>47>32#"&dPQ;d$+PQ;c%-dUMbTNxxGE'\sKxvGE,Ss ck@;    4TT 9   9991/0KSX999Y"32654&#%!2+!)Th}I:N蹤mJ[MrB[Q=-|@%VV BE." " ".99991990@A000 0 0 00000000005553$3%3&0'0(0)0*0+0,0- ]#"&547>324&#"3267>7>cTNaU#iIӛPQ;d$+PQ;c%-]Bn/xxGE'\sKxvGE,Ss@Q       4T T9    999991/<9990KSX999Y"(](]!&'&+!!232654&#=Dj5ius#ZP{\\ HWx կi|NM'@;'''4 ' UC!V U C VBE('$ $(99991990KSX99Y"   ]@    ( ]]@() ( ( 9 9 9 I I I Y Y Y h h h y y y ( ]].54!2.#"!"&'32654&'|Cg[9Dovtn|;akFEP~))>?qXTS3A451QUud>[}@4V9991/20KSXY"K TKT[KT[KT[KT[KT[X@878Y@ ])!!!j1#3-s@=   4  VE9 9991299990KSX99Y"!3267!#"&546D'\Tl'#P?L} '/RZz|R?JNƷ*d-F@#4991/290KSXY"%!!!-{dA#+)Z @A      4 9    91/<290KSXY"]@**5888]33!!!l )3 ;H+q? u@?    4 9   91/<290KSXY")! !!/pf#hA1N`@149 91/290KSXY"!!!%BsswwL  7@4V9V   91/0KSXY"!!!7!13/Z}#?F@!4WWG9910KSXY"!#3!D&%ZTB.@49910KSXY"#mjB@4WWG9910KSXY"!73#7!d%%9@ 991290 # #--W/10!5/۾s`f/910K TKT[X@878Y#fx/u{ *@O      4!  ]]!<"\]%[E_ (  !"(+99999991/9990KSX999Y"K TK T[KT[KT[KT[KT[KT[X+++@878Y@23 0!0"3#vv x  ]]"3267%!7#"&54$!37>54&#"7>32Q?v7{Cn7%faRv/q[hm?Rm}MM1 9<98'''j/ @J    4 <<E[G    999991/990KSX9999Y"K TKT[KT[KT[X  @878Y%254&#"!!>32#"&XoSJrZ)/%w?_=7Euoephw`c۽i}{W@ ` <K< K [E  99910K TKT[KT[X@878Y%#"$5!2.#"3267MSo(bL5=Nz|F[%!!=)+:8ƀ~44B @J    4 <<E[ G    999991/990KSX9999Y"K TK T[KT[KT[X  @878Y"3254&7!!7#"&547>32yoSIrZ}%B_>8Eupephw`cܾkL}&w@#`d<Kc#< [E'& '999910K TK T[X'''@878Y@ & ]%#"$547>32!3267>54&#"_nXPT  l]fYd(7**afm-vSce>;h Ubvv@=    4 ddG e    99991/22990KSX9Y"K TX@878YK TKT[KT[X@878Y!!!!7!7>;#"XX+ۮ+*+A:LNӓ7X +@\+ + + + +* +'(&)+ +4)* `<<K<&[*ef,* )+ + ,9999199990KSX99999Y"K TK T[KT[X,,,@878Y]%254&#"!"&'326?#"&547>327!sRHrP5bW6KW}6`TIFjh#% dofo --u|SUѲlgtng;`@L   4  <[G   99991/<99990KSX999Y"K TK T[KT[KT[KT[KT[X@878Y@    7 ]!>54&#"!!>32Nۅ:7Sty/#t0e (5:=\gL7 @5   4 i hded    991/20KSXY"K TK T[KT[KT[KT[KT[X@878Y!!!7!!!!5Dl++m%C`X@?   4 id dhef  .991990KSX9Y"K TX@878YK TK T[KT[KT[X@878Y]%#!73267!7!7!!!=/;-df+N)B%+.;4kTVR @D      4eG   991/<90KSXY"K TX  @878Y!! !!%r9tRZ^B `T @/ 4dGd  999991/990KSX9Y"K TKT[KT[KT[X@878Y@ ]3!!"&5467!7!q>N-ͪ +Vm!-%pF,{+@k !    $!"!#""!4&$!  <)[$e" $,"%  &!"% # % " ,.999999999991/<<<29990KSX99Y"KTK T[KT[KT[KT[X,,,@878Y@? ? ? ?????7???????@@@@@@@ @ GOOOOOOOOOO O!O"O#O$O%O&O'O(PPPPPP P __________ _!_"_#_$_%_&_'_( !"$%&'L]>32#>54&#"#>54&#"#3>32 L\l  #"09 $"/7)yEEW@Kpa/aK13=(*Zw1*B(*Wz1`tDKK;`{@L   4  <[e   9991/<99990KSX999Y"K TK T[KT[KT[KT[KT[X@878Y@ ]!>54&#"!!>32Nۅ:7Ruy% 0e (5:=`\gLXy} !@ <<[E 104&#"32!2!"&R]U{aSyM mvjy6BpV{@M4<<[Efe    999991990KSX9999Y"K TX @ 878Y%!!>32#"&7254&#"{{-%!G]>8EupoSJrZ ba۽j|rephwDV}@N4<<[Efe  999991990KSX9999Y"K TK T[KT[X  @878Y7!!#"&547>32"3254&V'%s?_>8FtooTJrZP_dܾk}sdqhw{}@5       4 <[ e   91/990KSX99Y"KTX@878Y.#"!!>320vJ(d%#>w>o,/+)``iZF{'@<    4 ``<K<K%[E( " "(9999190KSX99Y"K TK T[X(((@878Y@(-/// / / ,/. / :::JJJYYY ]].#"#"&'32654&/.54$32F2K]^nIJvhc3V]n{=Xzr]=56F;-7%%r##8;KC.4'$p@>  4 de d  9991/<2990KSX9Y"K TX@878YK TKT[KT[X@878Y!!;#"&5467!7!P>+hj`@O   4  <E e  9991/299990KSX999Y"K TK T[X@878YKTX@878Y@      ]!3267!!7#"&546{#:6Sqz#!,eT4:?wZiH`@#4e91/290KSXY"K TK T[X@878YKTK T[K T[KT[KT[KT[X@878Y@    ] !!P``nZ-` @B      4 e    91/<290KSXY"]@.&))::KL   **-<<<IM[\]]333! !`!#^`5ZN` @@    4 e   91/<290KSXY"K TX @ 878YKTKT[KT[KT[KT[KT[KT[KT[X  @878Y@ )8HYY]] !! !#ժ- `dR=X`@A     4  df e  99129990KSX9Y"K TX@878YK TK T[KT[KT[X@878Y+7326?!!'p~-uWd<')5yi54&+7326?>!3#"3o%Ĩ + `w>%=)+${hY& }_S) DPm}880=L=nVѧWLE'.8;3k10#0@i+,+,,+ 4+1''%,%W'W/W'G1/, 1'&%(&01.991999999990KSX9999Y"326?>7.546?>54&+732;#"+{gX' ~^T) BQy%ͤ)_t>%>)+UͤTOG*06<1`r#m :UFtޓXy++@ ll  19990#"'&'.#"5>32326yKOZq Mg3NJNS5dJ t]F+<73 ":?=6 7=R` `@0 49e  999910KSX9Y"!!!3H8 f#E+ehN$R@1` `J K JK[ E%  ""%912<220.'>7#.547>73N5-n@@@3>A77mfP{775rh5(/L.)" țjSY"j@F  4 dLK<B J  9991/222990KSX9Y".#"!!!!3#737$325i!P+?34@-%3J))N ^T /c@8  *( -'! ) -0)'!$ * ( $02299912299904&#"3267'#"&''7.5467'7>32;dJIeeIJd$P0'T-)S.'QIccIJffq)S,/Q$*S)/Q&?@K  4 u u9   .9991/2<2<290KSXY"!!3!!!!!7!'!73==%s$dVTd%:%X𻗽J@ <210##  h=#G@N7829 %8?/;.2;+;;EB+H785 (" 5%(9B 8?"B5("B54&'.#"#"&'732654/.5467.54632P&:>#&N:)9>&"J-D?U^=micUor-+Rb.JKV^dmPzr30G7,X&':6&'X(#@"!D?)HECAzLTC+e?!"D?Ee DHsK]2)b?;H1a@99991<20K TK T[X@878Y@////????]]3#%3#Z111}N1ID@%  q po>qpo2n>n&JD  8 ,/210.#"3267#"&546322#"&'.5467>"3267>54&'.P4[0akjb5`*7j2ʩ7iZZ\[[[~}[[[\ZZ~cIGHHGGcdFHHHHHh__g$ZZ[~}[[[[[[}~[ZZGIGebHHIIHHbeGIG *.t@A! '~!~ -~+ +'~}~|B/! *$-,.+/  $ $ /999999919990#7#"&546;7>54&#"7>32"3267!!X.{OkЇIF9S!PAzu:,Up#P@X65zh#(*(&i^ EHK,:xNN# 1@    // 991<299077N--v\/-w#Xjy@ H 10!#!X!,9910!!+u8}N 4L\@3-*+'0!o5n2+oAn M*',$0-!1"3+"$ G3 ;/29991<99902#"&'.5467>#32654&'2#'.'##%"3267>54&'.hZZ\[[[~}[[[\ZZb@@998(NG&7O?9)cIGHHGHccGHHHHHNZZ[~}[[[[[[}~[ZZb((+)oXZAU 81:/qGIGebJGHHGJbeGIGXB19910K TK T[X@878Y!!w%V@m mB102#"&546"32654&hCz//12.0zDHdbHHdc30/xDBz./3dHHbcGHdXy *@H  H   <2<21/<<0!!#!5!!!fff!bbL@&4 3999999190KSXY"!!76754&#"7>32h3[HC?MLIfD-%A[-1$#lc/(K@+ # )  &33)999190#732654&#"7>32#"&'732654&omX^PF0PIBypScKE>O`oW73(.fYZo cJQF-59f-10KTK T[X@878Y!#wAFfT{`&@V   &#$"% 4 % <"Ef e'&'%  '9912<2990KSX999Y"!3267!3267#"&'#"&'7-!D=Rf! +.P$HL 5{F:LaT X0?Fps#! KSOO0/f; `@-  49  <9991290KSX9Y"!###.54-վEfN'-/@4I910KSXY"!!NHo|! S@+334       99120KSXY"3?33!;jŇo-+)N+ 4@~~ }~B  999910432#"&4&#"326!!3%D=WxEIH7:_bVik&$ {3uwk&$ x3urk&$ |3um&$ y3unk&$ w3um !@J    !  !4 < = Q  " !  "99991/<9990KSXY"32654&#"!!!.54632!oM66MN56MEku$*vt/P6MM66MMq$j5uu;lj@L    4V <V9VQS  91/<20KSXY"!!!!!!!33<3N64H}nj{o&&uk&( {Xuk&( xXuk&( |Xuk&( wXuk&, {/uk&, x/uk&, |/uk&, w/u"}@F!" 4<V9V #" #99991/220KSX99Y"! #!#733#3267654&#;%hH^/f?-N`p+4A}WqE\PFrXXj%~m&1 y3u=k&2 {3u=k&2 x3u=k&2 |3u=m&2 y3u=k&2 w3uwXs 0@   <291<290  ' 7 XJJGJHJHHsL'.l@8+'/.(+%&"V"+VB"E/ .(% '& &/999999919999999032.547>327#"&''.#"wM8}4 bUNi= L5Nr9K4y6b<=2^"J'BAs8a,>ObJHrN47-k&8 {9u-k&8 x9u-k&8 |9u-k&8 w9uNk&< x/u@L  4TT9 9991/0KSX9999Y"!!32# 32654&#w@#'/I:NVg|L㸯qB\RJ[M3@e )*+*&'%(++*4("!%3.+%`< %<.G E))*31! (+*1!  ! 1*499999999991/99990KSX999Y"KTKT[KT[KT[K T[X444@878Y@lllllllllll ]#"&'732654/.546754&#"!6$32y`L;:B@1:k.ZhoE,*ZR]r) #dS9`L;}D ODBoG-g;%@Gfefݮ+d/uf&DC/f&Dv/uf&De/9&Dw/u1&Dj/u&Du{ L3@. .8765493.01/2.43 <1!C=("L !`"<`= ]]1]"K%c9]=\F@[+%E1_MLI 32!"<=.(16C.I..M9999999912<22999990KSX9999Y"KTXMMM@878Y@,3;3<3=/012 L0000;0<0=]]7#"3267>54&#"!3267#"&'#"&546;7>54&#"7>32>32Jbu:1CP% (,8G=UF8A/9Q^ =Yl DA4V/OERt4T~NgU332#"&ZoSJrZ{%uG]>8Eupephwba۽j|X1&\jN&$ /u&Dk& $/uF&Do'vc$/ou{'v Dk&& xuf&FvVk' |u&f&eVFk& d&1&KF4k&& }uf&FfVk&' }IuBv' vwGBs'@h'&% #"$      4 "  <"<E[G %      (999991/<2990KSX9999Y"!7!7!3#!7#"&547>32"3254&VB%/%%B_>8EupoSIrZTtt`cܾkqephwN&( L&H'k& (LF&'Hk& (L1&'Ho'v(Lo}'vHk&( }muLf&HfBfk' |u*Xf&eJfk& 2*XF&Jfk& 2*X1&Jf' *X+'ZrJk' |Lu+;`k' |-uK4!!7!3#!!!#73!7'+q+&+ ځ׆ #q#hQ8#!67654&#"!#737!!!>32%݄ :7St| # >0e),:=zz\g&m' y/u,;9&wN&, B&k& ,`F&Bo&,(vio>&Lv}k& ,7` j@"4ded   991/20KSXY"KTKT[KT[K T[X  @878Y!!!7!!5Dl++m`%3267#!#"&!#3!3{>,lBJO1>]wIG8/9/00JX`_l n853 u"%+73267#7!7#3!!!7!#3#_#6%/z]0IR.+G{ .. qGH.;4kTVk' |u-X f&e0X'(.R0'(NA` !! !!%Jc7wS`}^B `TPsl' x/v/rm' x.wOP0!'(/5 &L-OP' vn/!' v"OP'y/l'y?O! d@8   4  V9   .9991/90KSXY"3'%!7!P`s+'_s^\w3c#%@J 4dGd  99991/990KSX9Y"KTKT[K T[X@878Y3!!"&5467'!7!%=N-Ω 5Zb+V^"gEl -%pF,Ò:ˊl' xBv1;o&v Q0&C(1;0`{&j(Qk&1 }u;f&QfS'_QV6&#"!!>32 +73267IjmIM#'/>~84qqy,%dgoKN4nlnfX{#+732767654'&#"!!>32v1poy,'d43| NOv|# 1j<$Tkl77=+,5~`]fi?eC=N&2 Xy&R=k& 2XyF&R=Ck& 2Xf&RHc@84V V 9VS    91/220KSXY"!"&547>3!!!! ";b3C54&#"!3267#"&'#"&547>32>32267>7>54&#" (,7G> VH9@/9R^2\@68DŽSx%0Rr4D 394D3B'40UYF54O]72((QEKK<=<;>1XZ@JvaZxHA@I*|HQz"IAl' x0v5]o'v U0'(5!0{&(Uk&5 }7uf&UfVl' xBv6Zo&v Vk' |Nu6ZFf&eVo&6ZoF{&Vk&6 }/uZf&Vfo&7o&Wk&7 }Our&W vs)#73!!!3#kh&b22b&!!!3#;#"'&54?#737!7!>>,&&U,I/#&,>)!P3k=P>-m' y9u8j9&wX-N&8 j&X-k& 8jF&X-m&u R8j &Xu-Ck& 8jf&X-_&8vjo`&Xv)Zr' |G|:Z-o&e ZNr' |:|<Xo&e \Nk&< w/u l' xBv=1o&v ] k& 2=11&] k&= }/u1f&]f)!7!7>;#"oۮ+*+A:Nӓ7P/'%!#737!3#>32#"&7254&#"}) % ??_=7EuooSJrZzz`c۽i}qephw"')"#76763!232>&# 32>&#zSG*>&$tnJ%94D-po#PnU-/b"%<"MUQPSF`jHP"'!!!632&"2I6 .)KNK76?H?Kæ~D;p%32>&+'3 !y/byTmn5`bbR.}&"2>32#"&'!'7?H?KHZǛ76e ܵ|D]]ba9703276#">3 !"&@?L11sLY@KU.IItU+HFAAFH$$rr$k %27# %6326;#"&#"@Ije/-p`+];2 x1]Hx#@7.8"#%27# !2676;#"&#"456c:Xoy,'_8,"4ndD4/sV89Vl7+rU?!"#767676; !#26&s>_nMMz33j&4MFmts?;#";! &767676?6%3!]Ĉ_Y)%W4Dejyw`+ Q2[n"7632!7!!7 26&"67ʳGK) ?I?J4DT={%/%#"'&'&'732?676#"32%26&#"PcRs* Y%WQhA( jV53Mi@Tij@T5?NM ",f==KJ 3!!!!!2{L3??2B+[u6'&#">3 ! 732767SLY@MUJJJqrK2(HbyAFH$$xx~_PxxP<'"267# &7>7.76$32.#";vg5kq*Ϧx$0\a4_Tnhn2}s^o1/$&٢!(*]SOWX !!!+7276?!?3^ 2foV,h3/B}+dl72}-X7!!#!732767!7!7>;#&X,0gq+c34,'+obcl78TNʜNk(%27#7!# %632676;#"'&# #]170̅Hia<: nb,];2]jP+"TsC  l7.R:dOT^ '!!%3276VBbCK34B%v ]u~t*'&76'&#"#3>32?67673.Y,/)3 ?@21}.u+U-,)3 [;CI9y} V*4GF}]fij 4 T^x !!!#"'&2y2אf2VW.-vx!!3#!!!#73 2y2b&6)22)6&b 1!!!676&98ߣc#'s@؋x6@G:$wGq3= 676;#"3! !!1poy,'b53Dc8wSۻAml75}^B `T3+;!"&?#73!7!% =b,ь1%p,N^n^B!!''%!H׋&E P)+UTEW %#"&326732673#7"&/sJH>d9d6&}`pGD<}TV{D{VT}D+tBMQcVn!+732767!!! m@_0,<::=Z4K=+=eVw{!6&#"!!>32v0NOw}#!1jyTzi~`]f>u  &7%63 6'&#"!3276"+ztTaJ}N3*&UVyQqrK;txxpOD2P_xx]I&2&RE &7%6327!#327&#"_ ,|[GPWvݒD@!CgFgU%q+pi5x yh8Vf{327!##""327&iWgmi@Ti+Nd* =|erП]]Q32>&#"#7676763! !#!U/b>_/5`mJbb'&4MFmVv$&"2"'!#776;#"36322?I?J?>76&#">32ǛRd eml;ro, c ak`m8ng'7eCYcRT45B01Q>PVFC ./˞|[{'>323267#"&7>?676&#"^__UV ^g^l2se"X  YbX\=&"<89<:7##&2P8954 X&(;#"&7# %53232#%4'&'32'3p ?+'͇24/2F:t8)oa@ iHY@ lY265LX  !!;#+732767&'&7!7!>,g=U$1hoy+'b6+BJ+d,>KA+fl7,eHQ>R"#76767632'!!,!<&j{h/2!H!MAL-t67676;#"!!;#"&7!7+pey,'b53+g=U,*e+`mb 75gKAV!!!!;# 4?22 ',~V=, >&8<'XhY##"67#7!32676&'!c7%==%)4a{ *Cgf* "C4mn8mO֦M >N'73!"'&7!276@ c7%=G,"2'f^!H9mȷn.-XT !!776&rr./8i52JL@\MXF` +7326?!76&Q,wZ`@"%f^_1eW?-=o<A)_;;& #O9 !3!!!7#73!/0&2/]&w&0`!3!!!?#7!!"-&M+i-o% ` "# '&7!327676'&+7!!6lw+>V=bF #!'+30!Je6;m?tk9)qo dn %2767!! &76767677!!#  X<>+69[euS03-+(8N5J߀tPcfq! ϋ..H`!#"32767# '&76767677!!+UU}]fel:mllgڂ+[cwS-+45fcj6%tsޏfq! V`932767#"'&547676%76767654'&+!7!lEOie=m#*&.dnoom+itjqYhY>f*$.Y('"08g!CA &%+ K;jC:$ $"i$!!?#7!7>76&#">323+Qu3L1%UG\[ coOv5s^%Y[u%6UtAVAdm?<')ݿX^H"#!!!2! '&7!32676'&+33DsF:3+lw+>D@oAAfO@tfstt_95jcf54H` 2!"'&'32676'&+!!na33+gdd_9U[AAY)Y0,fgst%)58jcf54v58%#"'&'327676'&+#7;7!3 Ip-*٣EF=:=BDHoA%7T8%!B!%61^ׅ#*+rB`GLr!¦V{!!676;27676'&#"@<<)"^O_,% c& !iI7 o%,p\])(UN& A,AQ!!t +le'!!!!!!!7!7!7!t C.f+.fXXf.+f.:Rk&$ }/u/f&Dfk&, }/uf&f=k&2 }/uXf& zf-k&8 }Dujf&Xf-'h^' w<8jO&q#;-' xN' w68j0&x-' w6&8 }kj&r-&8' w6 {j&rSz{'h^' w<$/uO&q#;'h^&$ /uO'q#;&DjN& &f,k' }u*Xf&fJXk' }Pu.Rk' }uN=_&2vX_y}&Rv=_N& X_y&k' }/uyHf&6ffk' xu*Xf&vJ333327673#"7##oo 8E! WH;;ށ9RJ%2:8}0qhk&1 {[u;`h&QjHk' xuf&vsLk& x3uf&vvk& $/uf&Dfk& $/uF&Dk& (Lf&'Hk& (LF&'Hk& ,7f&k& ,7F&=k& 2Xyf&R=k& 2XyF&Rk& 5f&dUk& 5F&dU-k& 8jf&X-k& 8jF&X&6ZF{&V&7'WRj: >54.#"7%>54.#"$32j4Q[y}< +poZ97O-9D6ZO1)DF$6hhE"Sslr*g""hv@ "69LOa13I U_"SLT>*> ,F^]O{37>54&#"?>54.#"7632B^0V1@{usa6bB4<,R|D) '?? ,YZ<gyA8C@#h&2>DR*=EEME=C/#4 ~υ 4ILk' }Lu+;sk' }uKt%-%726#"'632#"'#67&'#"32!26&"^-g*3}-HtC2%?%3+JL67='g$0?!wi?!x yaGyl$>40/-D X6!!#+732767!7!C/31foy+'c5+0_w#dl7,d^X`!!1+732767!7!P,0M+2foy,'b5+-``dl7,dk& $/u1&Do&2(Lo}&2H='h^' w<2XyO&q#;='h^' y&2XyO&q";=k& 2Xy1&R='h^&2 XyO&q";NN&< X&\tZ %726#"7632#"'#67&'&7!7!5-g*3`}.HtB%9F1,N y1BXl}7&t{/%726#"7632#"5#67&'&?6'&#"!!67632$S!)9tc{.H^9uz*41/ ?-2}#%9T(8!`j y1BXl+5GQt`l3!3ߨt$%726#"'7632#"5#67&'&7!7!!!!$S")!-:sd{.H^9t {*41Y,=%=,^j y1BXl>X`%#!73267!7!!=/;-df+N+.;4kT-26&"&"2>32 #"&'#7#"323?(q?*Z?(q?)@8v?\77ІGV ! 4{GY77ҋ?RsDD]]baab40]]S5J{-&"226&"#"3273>32 #"&'#?(q?*?(q?)@8v?\77ІGV ! 4{GY77ҋ?RsDD]]04baab]]rM!!!#'#7'7'3'EiNUx9M! &lP{s[q^??y?RrM( &#"# ''&7!27&'32672MUy͋,J.UK"Fj9LZ_$$r1y Ms~"&AF''7&7!27&'3267#"'&#"!tcZOt &;UN5Rbu !uw9 ~y!Z9:++~~V !3#!!#7'%6w3bi%_!'!!7#7#DDFi2'&#%N+& =&W1D-.eٛVp'32p$0 "MB?~m66+32654&#%!2#!#7332654&+3Dy{VZK׾LEKB~.~Ŝjo.mjD@릤 l?C<RfVRg47#73!!!3# &%32?!-R&R''Z&Z"NF''\`2 R`TfDRZ=@ !!!A+!#!#73!2!&'&'32654&+Jss0pĵ=Dj7Q\\\NN HWx |NM{.#"!!!#73!>32(xM]2z&UUc&c_%">w&6J`i^{ ,27676'&#"!67632!#32767# & IJ%#NtQQ}"EZ[d#& --dhhhu0hpP**fL--XWq}J((ʵ^]1G%$:(&x{7!!7#"763226&"$!BTTe67Z?>]?H?Ja114/.D Y{%!!67632#"'&&"2N$!BUSe67Z>??H?J_a11䘘/.OD2$67632#"&'!676;#"3&"2IQPZNN86e 1poy,'dg?H?K]./ba@klnKDH'}70326&#"6763 !"'&H56EDUAvRSRJ4[WXZuu66bQQ9 :P7 ,s}-%3276#"763!"'"''67&'&76!2&'&#"a46 S*:fJ0t65ZOQJ46GFR 9Kr]G&A,7B$26&"7!;#"'&?#"'&32?2|?5s#6+a3418EEQEE77G00D:Stnlka110/.#26&"%!7#"32776;#"d?3{?4> 8Q77H006Y]a,4Dab40/.]gl75%y{ 703267!77632!"&6'&#"%4_e 457v 00epEE7 ?:w 喗*q=><;Sz{>3 #"'&7!6&#"32767nvwx75mm4ew-/peHH!'**“ w:?t;<>=q{ 332767#"'&'&'&#"67632?;#"'&7[!HN<;="7]eht.Riz7] M9hu+2Dfb qrlm^.tklbً=@BW  &1E OY"[\px{2!"'&'7327676'&+7327676'&#"767632+bfej.Refrq&lZ<2+uhCY M-zoV.~lk]"UU=p\["YO E1&  WB@{A#"&'7327676'&+7327676'&#"767632?;#"'&7'En02JO.=JLUH*SC+&+XK6E 8![U@l._RREY5 !) !#HZ& 7=JJp\["TO E.)  O.N7o[$ly. !27676'&+7327676'&%672'$HG*F.< 4!J*@/E 42b_]IF~.,~~M@M%?H "J7#"-VWbLHIGgVV=LXT`%#!73267!7!!7!3#1,bgL&3,N_&+nV ;"32767#"'&76763!3676;#"#!"'&'327675YAB !\ZAB=NQP]LL1+'-hn|.*'(+1TLJI3ACBIPQ wRROPRR:Gb..⡠rv..!6MMbV`*%#"'&76763)!"'&'3267"3267P_NO1,.'2VMNK4BEEJ +["!_[=b\⡠!6OP:r_%%#"'&7632&'&#"3276?#7!gjikop23`UTG.GKMPba <='#"+e2(1YXYY Hao 7!!3276DI,f=.B\CCcN}V#L~||`%276' !!! 76- ; /CC=h'.1*W;HJ9SLJ^!32767!!#"'&#NP;:|#u1j<=Vy44GF}\]fij!!6'&#"!676;#">32 ݄NP;:|1poy,'dg1j<=)y44GF}@kln]fij9VJ(%6'&#"!676;#">32+7326}NP;;}1poy,'dh1j=<(2goy,'dh)y44GF}@kln]fij)bln!!!3#!!7!7+7!!-f9D^&)l,,l)@&3ܐ`!7!#"'&7,De,VW,l.-vx` !!7!!7!=l,,l,,b*#"';!"'&?&#"767632!7!3276-VNMN6: b,EG1NV,ZMORe,NB>FIL+<77llu:?= m"&#";4;!"&?#&76!7!!; 2`=b,ь1{&+@D,N 028?pno)b̜ D%!7!;!"'&4+N b+GF77llH. !;#"&7#7!!#"'&'32676'&+A|ZT)I,^0+U,k6M%"+MKJF:=Dh..n~Nn`L9 !qfst%)58jcf54,`"%#"'&326732673#7"'&/sJ$%>zd9d6&>?1/pGDdd<w1}TV{1{VT}tB&')(,V`"%#"'&326732673#"'&/sJ#%>zd9d6i&>?00pGDdd<w1}TV{1{VT}B&')( V{367632 +7327676'&#"#6'&#"#367632./99K#$={/Z^c, R-, 22 31'=?DD`F#"dddl77~)*+-y1y-+*)~1`tD$'RF{'!7676'&'&#"+7326?!67632хP &\FF=+'qpz-RT+' VTT[xVo77#WVyv\pb./F&{"6&'&#"!!67632;#"'&7 'UMDl' VTUZ;<,U-uBG&-HWK`b./wxj/.v ` !!! !I}`uubo{ !7632#"'"!36'&!#3276-jmojniN7!!7#"'&''zL^KK2 )d$"?bdv<87.5,,! >&ln`45+327676767!!7#"'&'b'zL^KK2$!>bev<77/5,,! >#9/u`45V@`%327676767!;#"'&71?#"'&'F'=&66n\67lb)`45!V{.#"!!67632n(wN\ML2'-&"&lnR `45{V{!.#";#"'&7!67632n(wN\ML2'\g&,xEJ0&"&ln%77lp7`45`37!676;#"!,d+gj,T+,g,QP! K `37!6'&+732!,~gV,HK+d,K !PQ`+!&'&'&+!! 32?676'&'&'&#(0s$"$Vlhi"US0>W/ 9  %A- m WF`MLtDC_(:% ` "#327676'&'32767!#!!O4O[-."!%K313kF;;Bm++|}f HI Ga/0!GHoKJ`|Vi{8&'&#"#"';#"'&732676'&/.76$32i2GRSXb78  P;:"?@d',yEF12V^`^gu Nz  _[\=48P2&TUVWS)7lk7<98"&X7!#!732767>;#"0gq+c34'+Ccl78ʜ@X7!##!73267!7!!7!7>;#"3U1fo+bhM&3,)'+B9r&JblnNʜ0AX!6'&+732;!"'&E B+'c+FA@}87lcX7&(%;++5$!3>;#""#"6763̋)8t,\q2;93'+@ 5Hi >a2Yl ʜ@L56T:(`!7!6'&+732!!z>,~gV,HJ*d,>>K !PQV!!;#"'&7!7!>+T,KH++>DK !PQ>C`!7#"&?#73!!!3)3276U 0hz( R&R_&_:_&_H&0NP:0J]f/yhF;V`&327676'&'!##"76767#7!fO.A((^_IJ27&@+#20 KW\&ELQskXWWXksTH;l:pA`$#'&77#73! ?27676'&'7,6!1oCC,=,%C=!&`VO6!;lyx:yƩ 4aXksTH`#!!>iEf`jn` !###!!d`676;#"!!fZ`av+wZ00A!s~ٞIHo<)`!!!OQ\\`Yx(V]`!!;#"'&7!7!,/N"d&+xEB$,``77lb`%3276'&!367632+'67!7!'& --1.CM1; -9G`v[0@78H`! !7!!"'&'32676'&+M+-!Ik73+gdd_9W[Z]AA9 !qfst%)6jcf54 H` .&'&23676!7!7#7#$!26'&+j c8*+- Hk82+ i=9tm3A}A U4X9 !qfs.( #-[H*4V327676'&#"67636!PTdB&CHLJN:JMLؔ])-n`rLG`Br+*#Ӆ^!&'&76762&'&#"3q`Hp-)أFE>:>BDHo@$8 ^ׅ#+rB`GLr!'"'&'327676'&#`B`Hp-)أFE>:>BDHo@$83^ׅ#*+rB`GLrQV#%32767#'&76762&'&#"&CHMJN:KLMؔ]**أEF=:>BCHoA`Br+#Ӆaׅ#+rC_6 *32676&#"67632 '&67632"'&EDCyxvyhj1䂁13. +)1< Rb6^^aa5'''/-6L&& ]` &27676'&+27>&+#!!2vH,+ !!J&R^44T^( ^)) cc4520Lf2QHIjOP`GFR:97ey.% !";#""'&76767&'&767676 HGF.< 4!J*@/E 42b_]IF~.,~~M@Mkl%?H "J7#"-VWbLHIGgVV=t,+%#"'&7632676;#".#"3276?#7!Xhiikpq322ioy,'dg7HPbc y'##+e2eln10YX  ` !!!!!!FOUOFZZ`k1W$!!3+5$)3!7!&#"?676UB%ب(9t0Voҽ;93,Ni ^kb3+VSk ]L@6:>BDHpA$8TD&%%&p^ׅ#+rB`GLr¾ %(26&"73!!!+7#"'&7632?re?r3tU,a* 066=s!"67_^w6!"}\\D\SL`ۦa11/.~@ 4> !#7#"76323!#"'&'32676'&+26&"B /m+rs>:<6:1357Sm##XeR?re?r2{ab4/.]SL9 !qfst%)6jcf54\\D\9<%3276'&26&"73!367632+'67!+7#"'&7632?re?r2tU,$0Y/y4< z  /66=s"!68]_w6!#}9Gi\\D\SL`v[0@78a11/.~g/I&'&#"#"'&'#"'&7#733367632732676'&/&'&767#32'.05;$# u.Y"UU<<<9%'+d,>>% 2X965/778>K L-^ g3=48H:'SUVW"(PQ>½K3ZH7<98"%RQ0*K !X &.37676;#"+732767#"'&7#73#3>'AB+(& ,/DL~+;#%'+d,>g3NNN0Ab+bl7.bPQ>CK !s3<G367632&'&#"763#"'"''67&'&'#"'&7#733276#"#;&76F=(w6..)4)(1V ae,<>x) ''%+d,= X N2g3'&)#,7Gr]G&A#(PQ>J9K,K !~X3;>32+7327676'&"####737676;#"Ϯ!%n?`)1KK~H+<$#} ^*)}Ϯ,'BA+(&b]fikTkl77z45GG~NNN0?&'&#"#"'&'#"&7#7!;7327676'&/&'&7>321&0/5;#$ u.Y!UU=<<:}D0,b ;0l9>%& K-] 966=48H:'SUVW#)`77H7:98"%RQ#7!;!7!!!7#"&,b ;*,a*}D`77`3 333# #333# #3$Ϳ&%C$Ϳ%&sPTQ PTQ" %#!#!#!#!?WW9LWW:>)>)J"332767!!#"'&76'&+732MP<:}$v1UTj;=(d&,xEB^Vy44GG|\]33ij:7lcV;)3327673;#"'&?#"'&76'&+732V#>@22},P,a531,U-+(P,a31^VyhGF}˄nlk}]fij:7le#6&#"#367632OK !23%$FB65De)(3i~D:'(Fh5;<#6&#"#676;#"67632OK !23$%FwGEM@@65DeQ3i~D:'(Fa<=~>JL4vj+732767#7!7#73 ? ]z&ox~J~r&'&#"#367632'(1>-3 8z%?>L,"b !<>tb6 32767>73#7#"'&';'(1>-3 8z%?>L,"J !<>!b6 "32767>73#;#"'&?#"&' '&2;1/  8z@N.+%~M&GI #<>!8~=7{J6: "#327676'&'3276?3#!322:S0  {+%&)E NOz()|)7((?Y**t1 333# #=F"+7326?33q7<=LL9=(UYY((}">!bitCf8@4G910KSX9Y"!35׬~q!#R94׭~$Y27>'H#x7-.6vDC.cdvt'&l&'STTSr0"'&6763"!vDB.cdv6..tSTTS'&l&'e327676'&#"767632#6}>) -g.001 010ib=iEq68@+'6%@  vJyQ5_#&'&767632&'&#"3P6i1I[i,-( )*,.gF( $}8d5QyJv  @%6'+@PFf6@ 991290K TKT[X@878Y3#'#󷰘ff6@ 991<90K TKT[X@878Y#373F򶮙x@1@0#ll+XB[@1@0#ll+Mj&0CbV0v.`!!e|[`!C|&Y`aL&`bLj 733##7#7,,",,"w[!7!9>"մ`FR;1 :@ 2 210K TK T[X@878Y4632#"&732654&#"ϦwvvwM76MN57Mvvvv7LM66MMo#@   2 91/90!33267#"&546K04*%P-1\+ctNPJ!) MB<yh9@     99991999999990K TK T[X@878YK TX@878Y@'           ]'&'&#"#>3232673#"&1*"4 _"=.3$&4 }e#AT%!E<$'C>uf2%7;!"'&7""i#:/ ls87o[ 7673733276r)$١Ya toق2SFEE[cn#7!;#"'&^zw(?ʆ./~J>~=<'.#"#"&'732676&/.7>32.j8?F4`OAA8z uufL@ 1<20@/,,,,&87663146LLJJBB]!#3#fxff#VVD';f###yfxx` &st$+F>32#654'&""˜H7(+rL;b"@#%KEa!32$!727#03xyz$#3$7#0yy30z9f!#Af'C1'vy6#7373#%#lo-33##۾$%$dCn!7!#%+lE7326764'3#"&:A'= tV5bR2&;1'M(7^)s{6- 9 "&54763"]XbL]%Fo?wS?:%PK73733%#$%N#7!##n%+%#2 #73733##%#$%$@G7!A$+$GXi %+73276?!P0qoy,'b63#+ml75}V ?!;#"'&# b',yEE)}}57lm28(!9910@ //??]!!$0B2(E@99991<20@////????]]3#%3#00  1  0#"&5476322654#"cL\]XbL\]Y%FI%EwS@o?wS?o;#Q:%P6:!#o|%@    291/90!#"&'732654&'4$$4f0+R#DI0\,cv 62E7ovj&#VVD &#7##I$$Iv@#"'#"'&73276732767/5@k0Kj  LP(LG*@FF0:mI;@ 991<90#373񷲚x@ 9912903#'#J񷲜mb> @  1<990332673#"&5bXLQuƘ =HME(@#454'&"#>32ȍ(+q"˝G7@$%JFL;b 7n@     99991999999990@'           ]'&'&#"#>3232673#"&1*"4 _"=.3$&4 }e#AR%!E<$'C>Mj&9910!!rw%ڼB6+#"'&'.#"7>32326-WOZg Gb3NV,ZS5`D j]F+<73 ":?=6 7=x7!&&x7!&&'!ttuwyrM'N?rs  2654#72#!%FI]YcL];#Qo>wS@ n3373 I$$Iv&!7#ppD,,=n@67632632#6'"#6'"/5@k0Kj  LP(LG*@FF0:mH '7'77Nlhilh),!#732676'&/&'&7>3#"9F " ;D'RRz .!RSz#: &$;1tj $#4'& #6%6k9  3OG$%%$GN(tCf3ġtVH%# H{Vs #"?3;cX$3VhL'9fv;('pjf&-yf&f&f&f&tNf&;xf&O(&$%zJ)! qi)_/=( =+[u3 "326&! ! 22 q449qr449JVJJ\  xx,X.3!!!iq3+ 01 )!!!!!A2A2o!2=2jV3  !! !!22>3227N<[u%-67676/3!37&'&7676?#!aE5Mp))jx32wNo))jx32U'^A  Uk? HJllKFFKllJH=?kUq?;3!37&'&!!6767!x32wHkKC'C1% '[1C'CK|+~[##[ą+x'3&7323!>76&#"! c7%=^=%))4a{ *Cgf* "C4'm8nȿm O֦Mk' w/uNk' w/u5f&df&eVf&Of&(& 5y(7!;#"'&''&'&767676'"79DR,fA<1=˴NR6=AMK!"*'GD#lT =$+9xУ[[RMBV!%!! 7676'&Ea,Y7Yo-Da.++9(-EI8    AV`!!&'&+732)})SSW $ *.PmO^(vVH JY8|!%/&767632&'&'&#"32#"76"326&cRs* Y%WQhA( j53Mi@Tij@T)?NM ",f=KJdRtB"3276767#"'&76767&'&767632&'&'&#";xM9 -;rthf+ k4nhtt _^<<W^s* Z$WQi@((4g+/ )A!!*%VVyKK@?dNM "* !V#727>'&# !7!:1DMmd,F;g[1),l,T MX[TL&DeVw{!6&#"!!>32v0NOw}#!1jyTzi~`]fao(6'&"2767  ]YB2,VD0v$ƐlƐwppvvRQO`;#"'&7#7hT:,NJI+d,` J!!PNA`qIz!!'&'&+732Ȳ`k !!^p-P_<q-wJJXT{`w`67676'&'!!! Jf <34&ޑW2'Z|u4@bY|rNįt`pV$! %$67#7! #727>'&xP;4,l,1%+.!0CMmd,F0A*R LX[TL&Xy}R`#3267#"&'.?!!#7,h%F"%.f7Ok z㮢,`? " VX#sV{  #"&'!&"2"68Z}#rܾt*?H?K{]^SDV}$%#727>'&# '&!2.#"ҌDLmd,E;_s56cZJ45R! <1LX[TL&9*,7;WG,`#"676)327676'&ș(551(,G/N TikMN 6=8\]^r'`!!;#"'&7!,gT:,NJI+d`K !PN`!"'&7#7!32767654'!2JI+d,ɓ9gZ"7=#) :PN J!!7gLGةHVj!2!$76676'&HU:caRRw`?,;;.wL^&7)L4 j{4V@BsSV}dxaM>V`'!&'&+732!;#"'&L&i !O-ueXF.&:)h !P-vgVGr6LJ<mLJ>sV$`%6!!$!!4f$ghdSSzfg$f8^$d 3V@ O@`3676!#"'#"'&7! 2UH%g;eTE\gH[86*CqSSq6OH1&j1&j Xf&f& @f&oV$ # 7676!"'&7607676"&WxsI]5cLC@n)l!?F-k<`zt ~x^m$ $6'&'&'&%6#"'&3676 #T A@CN^XSTujH*<,_zEf/z xGCcX}վUjNk!6''&676'&wJK'hh-Cj}3Qk@1qS "40z7/cT.f&k' wu8V'67!!&'&6%67676'&#jS$SPw5/iQQPx50,%Y* 2z)&W * j#U mi$a mE+_q!v+\u!`#7!#'$7%!767'K,,J.Q 7e9YD5%F?JMF=$3- t `/'7&76776767676#"7677632gᯪ-iDNKF]D,]{ BUGC]gO\ 20R[Fk{ZsB="20BPZPa|blV "326& !&'&! q54:qr459QQA_JKUKIt  `*~xƇV{ "326& !&'&32i@Tij@TQQHniW45pJha#j=iZ9 %2#727>'&#"76)!"@oNK!md,F;IIƪ|3Yk11sfb\SL%xyǬkIV`""#727>'&# '&76)ݛP^! ;/mCMnd,F<^t66,M[\ILX[TL&/)UV"%67632.#"!!#"&'73276yn2.&J'QAU7czc<;7=P 3 '&7 6'&# A2^N5]/:1H]H3 !"&@?L11sLY@KU.IItU+HFAAFH$$rr$&0y9'yE4k&L {Xuk&L wXuX -%+732676'&/"!#7!!6?676321oo+bhZ])GM% :Z((d15< T$=)+klnz3%  D1C0$ 5izk' xuJ| 7# 547!2& !d)@I.z@y.<2gs͇HCuyH6,k&= wXu-a"%32>4&+# +732>!32#% Q%#Fw%0 r\E^Shqn;lacQZѰ+o9 %326764&+!#3!332#%Q%"nBnqn .la|)cQZh9:D $!!6?67632!6'&/"!# (d15< T$=)ob])GM% :Z0$ 5iz3%  D1CXk' xuQk&O {u(Fk& Z 3!!!!!"'q'>>/+B$%32>&+!!3 )gy/by2:n5`kbb'%z!!"2/x!!3267!3#! qd; Pq>~> ZFU1K/B(|V#!3!##'yffEV5pEE*v_  d` !!!"s+==k& OX.u +3267!!h#Fw\3 _vN2SfѰ+ aoM+ 0+=2j!!!!+/3&7(F+3276?!!\u2P:K=S1s1/jl#476?!#7&$>4&'.C̕/͔tAw* r\KQsff͒LS4w(xq?; #!!!3!""'q'q>//B !#"&7!3267ݕ6‡)g#YkG{QVI3V )33333"..2)333333#bz"Bq000|l %326764&+#7!3 !) Q)U)!q5-av,fQZD~ ,0sbOn#i08+N֐^m!/u{D$K!,46?6767676%67632 $26764&"$12~X3&E)0w==5%(BӜ BӜL ,IX@  #ofLX G b` !3!2!'327654&+7327654&+ ^E?"}AQ`}+,7<`|jGy_#&Y15>#3qj`!!C+{``3267!3#!!!JcLEO{c8X8 (VU{FL}H-`#!3!##'_CC wI`;;0WWVJz1zU4M{-?3267654&+7327654#"7>32#"&4.Z{rF+TN]랤+Z|eKKaѭs,1(T =0 Th4O@p}qL\L+` 3!!!+##݋`55+F&oA``+732>7!!}&(>_/ d^FRQݯPI` !!## #`31`/`q7s?` !!!!!ee#J=J``}Xy}R?`!!!ݯï`{`V{S{F`!!!7+̯ݯ+`{X`\=V%.547733>764&'0M5GOO4MJ!9CK!9DVMZ.gN[s7P}P}`[m` 3!!!3##=#c8`{{(a;!!#"'&'&7!M  0rk_"Qkv'<+=! 'e[3` )33333𯲯𯲯`{{`#333333#𯲯𯲯Vc8`{{{ik`3#7!32#'327654&+,RԷ"TIn;KTnIZt&+&\/4` 327654&#32#!!222;KT2bRhO"%&\/4ZVAt&+``` 327654&#32#!2{n;KTnRԷ",&\/4Zt&+`F6{"'3 7!7!&#"63 Ł5n^#+駚4tO5V ur TkKX>{:"32767676765&'&'&!36767632#"'&'&7#)N-  #*- " %Tj7!32+22;KT2v&(>,/ d^FRVR "&\/4PIZt&+` 327654&#!#3!332#22;KT2eeJ+JR "&\/4!`}Zt&+(3#73!!!>3 !654#"(+U#U+K:1jI@ rNw8L]fCTJ;,zAf&vq+f&C<oXF&zZ` 3!!!!#Z#>#88`{]^%32676&+737!!!3 ))a)5)'C))5/-avaѠdtc32#!#73!!! 32>&#aD^+J#J+n\2Inu_n})=;>uabo{!!!"<n/2S!!3%N=g{`:z )#73!!!!ف.s2@/WMHj` !#73!!!YY+V++h+6X{!2+732676'&+!!!5~Z&=)_1+bhRW"25inz31RX`32+73276?6'&+!!!~==)$1no+qb43KxO)ihӶjl77|14k`|V#!3!3###'zeeD=Lq> 4qEE)v_  Bd-`#!3!3###'_CC RSc8'I`;;0WWV%z1zUo`&N4oM{&ntX3!#!!!門M _ 'l3\p -p`%3!#!!!Qh?#wS%JcD `T`}^%t!#!!!!!3!"'nqn'h9/p`)!!!!!!!gg#J=J#!h`}qN #3!!!#!C"p;pD0ŃB"]&` #3!!!#!LCL8)ee`zro&Xuo{&xHJt )!!!!!22%1pU ` )!7!!!!ݱ))̈!hBN<V`!!!4n4YY`)7R!!3#!#37>> 3333 Xw@@ZV`!!3#!7#7374n4 +""+ `)>۰>t3!#! !!SM I1m1p%!7S`%3!#! !!0h?5VyVDyHNe!3!670767072!6'&'&#"e.#/5?:T$=)zm]GM2:ef2$ 5i1z3% C;`K,|Vk& M-F&mXT !!!2+7327676'&#-b"'r@NUM(<(_0po+e14R(EN5ool77~/1Xp`!!!32+73276?6'&#"O%Jc ==)$1no+qb43Kk`}%ihӶjl77|14X%+73267!!!!!0ro+bhy"'nqn'+nlnmh9X `%+73267!!!!!71no+qbh_g#J=J#+jln`},t#"'&'&7!3276767!!!wb15<:T$=)f#Y]GM2:Q#Mۀ0$ 5i3z3% Ct(a%7#"'&'&7!;!!!+(kv'<+B  0rk_"?he[3=! 'j !j.k& G/uF&gnk' w3uG/u1&jgj{k& LLF&l[uQSz{[uk' w3uSz1&j|Vk' wuM-1&jbm`k' wuN41&j_nyH`6N&O +&ok&O wu+&jo=k' w3uUXy1&ju[u+bo{[uk' w3ubo1&jk' wudF1&j9(FN&Z X&z(Fk' w9uZX1&jz(Fk& ZXf&zk' wu^(1'j~t{ )!!!!"2%3p` )!!!!)!h`B:k' wMub1&j<RdRt=4DV}T)Z:Z-`Z#!327.'7>7!&'#".''Yf% $'#@2B:va'p(L" 9Rx "32C!76&"!!!>  X̊B3Pڶe aCppbۍCC7!#!#".>  6&";3PP炭]6b a4X̊ +I3bGΉECۙVpp`8[@#7> 3#!6&"!De a43PX̊ۍCCۙbpp) .7!!!26?!:ea'H"JX̊''ۍCCۙpp"#!>76&#"!7!2!(?'R}#Oy:bN: ;Gg Frh2KG^苵%NyT<1@WE4 #!!!!!"'I26u?3!76&"!!>  X̊2e aCpp ۍCC(53#".>;76."#> 32>?#"uW2W'StyF.SqQk 4cpP1 k i0;,# 'k?PCkp:2ks8CiF%%FiCۍCCViZ/J5`!!3# .>;"267'P34eb6aȂ3VD. X̊BbۍCEЍG#@[8`ppVW!76&#"!!>32A Yfd~"'N3n?a1CpykzpC3!!#'w3/2>73#".67##3  0% >ajk}9T!H`58K..K8_|t77t|$,):33>32.#"#".7>7#2>76.'0.BQ*]TB>APZ,0[,udhꚛ` R: XmF)C:T?eF&  4&dֈd]o^f_[,0^\Zg<Tx!#".7!3267N3o>am'|Yfc5`Cۙ1pxl%.7>76$7!#=1V< q {TG{f#*%F4@M/BdROD\GJLHA - ?%267.#".'#".7>32>76."!7>2T1^9(T."0 j4EU/&>/aeOzLKnOXE0L,Pl`Q?"޷u% /#()$$)M:8z@0Y)KB*RyPO}V-;5NckX% Qh?C7V> 3!6&"!De a2GX̊ۍCCۙVpp%>3"!".7>7673!6jLT3&\u^*CkF)@W5eiNP=;,EpP+?s_AeH'ctDy a(#B!# .7!2672e`'X̊VۍCCۙpp!8#".?!32>76&#!!2>76&"!>2e`׊l$*.O8?_B) bp3[0H4 LhcҢi'mP1@"bML\ )L:#$=S0_q1@#TOTUcm:;n_m&I^my .7#!26?!ea2X̊''ۍCCۙpp#32>?!".7>7.+32%.#"f,PlaQ?'"t$!j877/ ]3AFG< $%8j\F^gV%#ThBF|Η]    ~ J!6&"!> X̊ڶe aRppۍCCM$6&#"!7!232>}Qt:bN9 ;Gid{7; < J&8l^I%NyT<1@S⏃қeBY6| Q>##7>32#6&'evk疡d 7]AxhݞXX݄i@2>7>."267676&#".67>2!!!>gE -#PnK+ *3^-"CL]zH   0KjИh< Lu`3&?'Y%Ea<'XWQ!Fg?7Sc,*!!PDFS 7GNN#9~znT1.SsUT2K3#!6&"!> @43PX̊ڶe abppۍCC1!267! .F'X̊'ea'ppRۍCC/3!#".?!32673GN3o>` 'Yfc~/CۙCpxl-=32>76.7>32!6.#"#".7a4L*8V;!3WorhI%=Vs[c 3D A8* -WrwnMaw{p&K\1"=V3.?2,5Dc^+`]VA&@nQ3=! $;-4H7.6Gge`yDE}k!76&"!>  X̊ڶe aCppۍCC!G"32>76.2#".?!32>76.#!3.7>3I0>40H3>pd!gX6@ `׊l$*.O8?_C( 0O83_/="#>//>#">.=p_^(Sah.bML\ )L:#$=S0*K8!*Y)^o>#!!!!"'I26 -!>7>.'.6>?!#4J[:%HHJ\;%II=H6UK6WÈw+Zdeb23aedZ+]ܜVzzV].> #"&'!!!7#"32>76.}Zb\Ȁ+a-,2c2YtP6 #F98O6! "d{EG|cd|FQ6L./M86N0.M7=2 .8%>.'#.7>; .673"3J[8""KIYP?jnHN-Eet:IH$0,$,VzN%)JmHNrK$M˂WiJ''JiWWV, " rbZIu!#<95حf !GdfxQ~%#>7>73S|RKiKVkC 4W~#2(L`?"+9'A~lP5f!fx@)#>32#".7332>76.#"UuQg`$ >bP1^G(0*4H)ScYgH&7`K8hR19^F %"0 7`3!9!#z+`+%#"'&32>732>73#7#"./rK$$={  2&  2% &|E!<-pHCde;w1@Q//Q>1>Q//Q@tBM%3V_{%!!!>32!76&#"!,|R+#!2jy)6-1NOvQV ^ezi`QV{*%#!#".7>327!32>76.#"t,mRqdL a`9!$"B0/VF6$B/0TF5VHMێۗOèPQZ/0YQQY0/Z VO{%#!6&#"!!>32O,R1NOv}#!2jy)bVTzi`^e F!26?!!7#"&7!,rY/t/% 1jy)%U`5yh0^eLQV{(!#".7>327! 32>76.#"!+oqdL a`9!$"B0/VF6$B/0TF5HMێۗOèQZ/0YQQY0/Z^ )!!!!//%UC,LbV_{!!>32!6&#"+Z+#!2jy)݅1NOv ^e)ziV{,=>.#"!!>23##".7>332>?#"N SQ'WN< +#!UgqjcS?!EM(r>HlC Kfx<1&#."f60$/=}d@%Ec? .I28Zpf)'JiANsK%5)BkM)=(#"2>7".67>;!39WA-DrYB-fB4Me}^:`΅U$Um,/W~[14\KRMmP,,PmLs̚ZLVI!6&#"!!>32I݄1NOv#u1jx)zi^eV`!!,-# V1#3>322>73#7#".67>."~b*f63/&<  2% &|E3/&<  2% V9.7_d>Q//Q@tBM7_d>>Q/.Q@., !##".7>72>76./#":|Q,[n~}eAaSc&Kt`J4 0"*mXG^؛VV؃Ze P[16^I>`L<V!267!!#"&%0t}%s1jyyhP^e7\KD-?)7#".>7.7>?!326?2>?>.' CSa5ax:"R|b%0K]-V3lcRd V1{!6&#"!!>32+]1NOv}#!2jy)Tzi`^e`\*=!7#".7>7#73>32.#"326?6.''r 1j^u;T9i,C\ !# 1'$ )PMI"b_"e ## Ot6Y@7LK^eL]umXi:  0C(cE_>#%SI6hj !7#"&7!267! 1jy)%/t,3ͦ^eTyh7pX``%#!732>7!Oti,1J6% %+~p39]B5#7!3267!!7#"&+1NOv}#!2jyzi^e6Vyy523!!".7>7>76.#"'>lh& ":Twf8Q5,|0J/ GiGbb8  )@+%KD9*qy 7\{QoV-!".7>7.7>?32673~,*D- 4L_kq71T: LDO)= 39#Z7AQpT5;U53yz2)E_:?:{@"G1?8xf$*#RV`+#".5#"'&32>732>73d&j6!<-0qK$$={  2&  2% V6:%3HCde;w1@Q//Q>1>Q//Q@IVy.H3!!".7>7>76.7>32%">76.X|1Q:#',|1J/*=M+(* 2;/ 7Qfu@hk),LE4 #?^C, %A`c'G=1"9J'$RVT$!G&1J??OfG7gYI47jX/>")@5/18#(17WG;64%G7"B{&"!!>32!!7>7>.-H8' }#!BTc7\y@ .#"#7#"&7332>73>32  $ &|EE*  $ &|EF+>Q/)H8tBM1>Q/)G8tBMVq{!6&#"!!>32q݅1NOv,#!2jy)zi ^e%XJO`%!!+%`)V+!#>.#"##"&7332>73>32  #" g(l6E*   "# i%o6F+>Q/.Q@E>1>Q/)G8ACV{+%!!!7#73!632#"6."2>8,i m,m$!`J ad "B`UG5$B`TFDDOۋۖNZ/0YQQY0/ZXy}RV#*5#.'7".>;"3>.'>URRA{lX2:C'}]QMziV}NLP @KP  E9|;YA+A|Θ[Y'?V45I/2Z~Z2FNr.<<)?fI- ;[w:%!7#"&7!267!:, 1jx)%/t}%^eyhZv'!!!!)MG@MH'%%Pc8ߎvv'/3 33#!!67676'&'767>'&';x;KxK0Xi %z::vHS+>1"I)7!5(2N0} FR~ TI - *hj.! #${%#"767"76263 !6#"(('H&&ʑ\?ۚfHpQQuY6)"276$632&# 7%7676;  @2 P{iS028A%tqu;;=MkČG:.j)N~67&76$ !6&$'632NB!/6N:pp"Zk/&':KG' p]6OA$,Ll^Ȩc >3 &7%327'&32769fy3e`,x12 @ ?A quxs  A@@?W &"32676&  76'#7632#"!76r$# %!E+:|08Mt$&ڸ"=y!$` %"%:~6Yh>{aKKO 5"32676&"76767$326767! 76%7676$" %"S*=+e |Q/FK#e01m7$o %"%Ƀ@<@BDkQcC;;eo">!Hz 3267! &767&7!2#"'3Qk"n%n9! 6FW f9Ob2O6hKM0{$"26#"76$76gv! J!(''*(kyx *7"32676&"&#"2#"7!23263 !6#"$" %"|-T&+)C= o,[\4@(+*gP]##A)is@0[2JFfHMMM|"267&76327!%$g0%'%%!)%V &xLB&"267&76327!%$׀h0%'$% *%W &xhB0 A"32676&!"32676&"' &76323273327&76673$" %"$" %!HEtzv,"'YTX<<XTY!)М $1(a %"% %"%JJbߩ44ˆ+,@ *"32676&#"' &763232733273g$# %!Et{v,"'YTX<<XT %"%3JJbߩ44ˆ} ,"32676&2?33273%&'# 67&76$" %"HR!--"ZL!>Œ6.=/ 3 -  %"%㩪,-=%ۂP! ,"32676&2?33273%&'# 67&76m$# %!IS!-.!ZL!>Ē5.>. 2 .! %"%㩪,-=%ۂP`!327!!"'#"763227"%%"?T>u `,888   32767! &767&7!2#"'3)jPP#%:! 6FW f:ObZYO6hKM- )"32676&6%$7! &#%$&763232$" $")19(ϱϼ ,:C.)80h $ $ ,^$RE?`{< +7"32676& ! '&'&7 3676#"%6%" $"Il1'K %,/M$-)S&W !$ $UzƜ1o5{"326! %,76323276#"@@$ƾ$Cq7#e""w!TV@?:u@@@@LBE>/>icb$ #+"32676&%$ %&'&76327676$" %!<<<;z1z"):3c4VS %"$36H9Gt6cafI 1"32676&$76'$6!2327#"&#"%$&76$# %! %?4ph@ͺbj ;O,+= %"%ŇD0tHG_)Rq}] ? ''&'$! #"'"32?6T ɍ@Ex "$837 YQs,%N*(mEsJ?'ee}^, '&767&'07r$63 l Mӭ8@P5)C21s!6#"! ܎/N?tF6T  Au 'u/f%$ 7 76 $?IZ_E:$ 0~9e}%$ 3!7 76 %?I[`G%f% #G~9fP3}%$ 7 76#'? $?IZ_E:$ $-$-0~9e}####A%$ 3!7 76#'? $?H[`F$f$ #$-$-G~9fP3}####-)&776'&762'62 30 .9&){KYj,.--TbڂfxY&775667&763273% ><XM|@@*ۺ f@TwdD:0;QF, &'6767676;`n ,,,sWf-2G)4G^&/'&7767%276Te/'E~QFGI! v*EW}u"E#IK|X!767&76$7673( "Ij1k%.Z?^)47676367673!#7676'&'&'&3&76'$B?2! UfYGgy% ="!BEam%!9>TT WK{;PH9;Ed>Gb*gW/A67 *ut7.,U 3733##7#$**%**zۺULolPjj%&76776&)-,. >C B@566>k,! &547>73267654&'3.547!'b2 ?0" Lik6FU #)CōnZ*9%654' ;2! 47%>76.#".67! 3 5 R{N^6\-% .@$:0!9xF?O.&-%Hn]=G /D2# "/--/"$(Kt/e6m e654.+"32>7>7.5467>32632#".5476&+"!6.#"" a9 !%!;-# K !)-47 .]=YcO Sx`@]C(Q CH OqxuV$0BH&"=/ m$889\ 52"=U3_.,#C0'iEE3mnEWr4&@SX,/) )9/'jiI;6BI$-'+#n*2%! 47>73267654&#".67!3 1R - n_ ]sg{}DdXu   L f<07JG_*)*BV_`%;XQW8'Z"76;(4=n*K! &547>7326?654&+732>7654.#".547! /N #-TgmGX?)?)I:*  ,F.` G {i^7r1:=A?S&P# @\UX\4I/H275KN b09+ m2;`4#q;#*!N&D654&'#">654.#"326%! &547>7.547! %B?D%?9T\ *M63[J7 .N5iC3~eI8DX ;/Z!&9SR$%A\?4 IU,-UzM7.IN(ޑGU3*t8!%d*1?n-*bA >6.+"3267%#>76&+"#"&54?!263 H D.$<.24B/IjKCN.B_ :DaWzaBWp'0@$(7654.#"#.54676!2r/JmOJZ6 'G18`M6 '-<@0< f!Tz9LB90 FQ,+QuJAq3QL8xo0bTE%Fn=!# &547>732>?654&+73267654.#7 0) ,8;  Xq1R@+ &X+UY)ii,wvfB Ź4=$RK<|'#Ec/H3/3(.\DK 7.5476$! .7>7>7654.4CxD8# J~m.]7X"-, A,    +  2QUZP\d֚Ugn3>~B]f͏>H?l- ! # &=0H'Q>+#EA $9654.#"326%# 47>327654&#!76$3  ,O45XI4 Pqa;a}AéFf,YoUj  F3 FFEnO@2Nxkl{BwIWw6*63!!">3 Bmi @ikFf# +(2 +9rFE6IE7HґBP4A37H >!>?654&+"#6&/"!.546?632>32 '>Z?BV8 0 -?LM7*C/ 2.'- 03Z*^2}:uuu;:mhb/-"!DlY[0A$Zn:! 47>733267654&+73267654&'$547!#8^6  1)Wra Ql{'Npro%Si]_9L6?349 !524!$E`0(IrML,= 5C'"])77 7654%7%1T &OdG!>76.+"#6.+"!.546?6%2>32y 9XDH\6 8@NP  E$2 27./  0 t?e.oLp7DfE' Ipg%1%/./:")5Q. qGU ?2K{(O247NR~)-0 /9+m?'3 654&'#>73! 547e$iQl|uy0Ot_ HӺLb r[>12iDh"`r+qHm@L%# 47>73276.#"#7>54.#"#".'32>32>326-H *:F$# \p."- , !#4+($2&"n %(1<#5<1Am/C5?)WRGm3^5"E`9T76G &$,% )0( ' C77ClAO9n*a6&/"32>7+".547;2>?#?##"# 4?>32632zo!6,*#@]v"jl 6Q1.VE.-Y$ZY 6Aa[ )Dgbc /@J&3! ")8" &"'5AiZ(.du/19(1!(:&lm7ENa,$!EgDS6`RD:A3n*=%! 47>732>7>54.#".67!2>7!b( ,?,"% Yv1XH66UICY  @G@3  =fI3<#@?A#A3c1#D_"GkIwn@k=8;,(&W"<:@'H 657!9-m*O>7&54?632>32>7654.+"#6&+"%654.'&#"d!? 1>].rFl )?U9/I3 @WQQ B& + Y!.&"iK&2 35L$##$tRfB>me_13UKF%J'^1(>8]GV؅ :/" 9<$n 4! 47!>?#".547>7!3267!1M 5 7 d~1(?99!k ,LuU7IfF+ )H3q]%uP7A+#]_' /kw'=KBrjg6=_L?:9!8' 63Z]+J654.#"326%! &547>3654&#"#764.#"!!2>3  0Q64UE2 7\>V|?`dˁCb$37%, "* RZq3R2 >-C?>iQ7.NN'yGSr430( = np 5Q6UOQS.6N7654.#">3!67654.#"!>32(@(BX+8732>7654+7327654&'&547!gRM2`ߘ8TtM7Q=* QoJ.Y(a'3!&VEFy1@}6~?p\NbyAC`$O|X&e· 4-'. >"e7#"654.#"32>%! 47!2,N6A7]J552Sk$D=0nO; LR&F5!HpKjHU$ -!: (X32>7654.#">32>32!>54.#"#76.#">72!".547T &B+>dL4 ,K46YH5HgH)L?. 6Z  $ (%,":3Ch4x]<0HO'!GqPB0 BF?kJqL')=)QSJ`6=( pn 1)+8:z%GVM!JUnV32>7654.#"! 47672>7654&'.'" 547!!3# "1>8* #0>8)YRD  Uh5[E0 AH+,  E Oc#-7" xJ+$211C&0//@\83;l $$=P5O5/`*0V*-4bE# F4.P9}6'*U#654&#"326%!".547!>3 Hhl GlgF5f$m7;267654&'.54?%!%!(K `R$# Kcm;FU?92Q% Wi2VXR3B6?QU2]3& @aio5l'Cv45e)OM>H@.N! 4?!3267654.#!7!2>76.#!7!2>76.'.5473#%? %Lfl  +  +8Q2` )J_2 MA7(h}A3<#@YJR(  P$*( =^!Q&vFRenf! 4767>54&'!327654'#73>764.+732676.+732754'&5473A0R4   &L d1)",  )", )Fw 2A!OH<"^<[cOd#`*$(/$ 5GbP&Jp1m@>| *->7654&#"267.547% 323$' ?dr Jmf}Hn$k> 73!a7 9zj5-D$#C5LaXM8=JYXQNv+n*+% 4?326?654&+73267!%3RH G$GTgil~&r &N,qH`:2;{@Vtj!K`û d=I(,nG%! 47%32>?654.+73>7#"#".5476$!3"32$7RH ' Og4ZF/ 4R6,/\P>;>>{m 'D*kD!~XZN9D*$Dh3O556/0QsH 3cn*).ʼdb~koB)H# 3#"327;7654#"! 47!37#$47! 3#3ʽ E&UJ\ F k*kk0s4xp',{L,3f(.L!o*=654&+"267%!"'#72>76&'#&3$4?!2>3#P# Y d- 7R<$-)+N<* b,:`* ,Q[@1Q!-<5/<M mR*3%! &547%$7654#"'>32327>.'7K, IrB=5&!} --0R&ݿ4<vzU`!Q *9!Hh1;ޅB(!,($u'mE0!3267654.'%!#"'323267!! &547&pZud +SC0ER& \Qd&Z  3>y~,+ Bhe0b>~E=?'& z{706~n8 +67654#"!6?!! 54767.54(V 7eI~=h %aq"(!7Ab}Q^oo)1c5Z-N=+2654&'.#"'67.547%'>7654'"3/Sh^t*<" W #O[o  3'S3'!,|n#,m|N &'  'X3$Yӻ,6/<Cw;l { L32654&#"326?%!>54&#"7>32>32+3267#"&'#"&5467 Jbu:1CP (,8GfUF8A/9Q^ =Yl DA4V/OERt4T~NgU354&#"7>32>32#"&'#"&5467"3267>7>54& (,7Gg VH9@/9R^2\@68DŽSx%0R4D 394D3B'40UYF54O]72((QEKKĀ=<;>1X@JvaZxHA@I*|HQz"IA/{ 32!6&#"4W4 Tji /=񥹹/ #"!326755% Tji /=)9)!2>&#!!#'9yu{~}9`9WI&DX&hB-7373!!2>&#!!#-...|9TVQX>99t;*v&DX&h*\0)7!2>&#!7!2>&#!7!#uA0.}\N{1.{^L}1.`)t=8f!fJo&d((d&np 33#'##j\`I!#3#3!7##3!",']TEDc (3267654&#3267654&#%!2#!1|XS 7T=&|FE .D0zn]jK6C(3F-4 )^GQZ ]<ym 3267654&#'32+h2nt 5n+K{C1:^v>L !!!!!!=Jp#j+D 7!7!7!7!7!+j#pJۑ!7#7!#"&547>32.#"326~"J>J)8i+$\>HH?t 7!#3!730jjN 73267#7!#"&&,p>JQ Ro<|14AGș  33##]@bЕd7Jx]W3!󢺆DN 33## #k)ޢonb 33# #ȐvȐv`` ##3vƢv|`D`  "267654>  &54\Z*Hc*c[Y<)_[=(ۯgEWۯfF 3267654&#'32+#"/LZT7ZD=U7D(/kW${!#'&'&+#!23267654&# pI D:@ vt,VLN 0N'%4 ^DcP#Vf$5>$,Q##7!#s32673#"&54go0V og!e';7654'&#"7>32g\ 1IdF*q?y8)?BJAG9&/: bX ?F)-8*Bni >(R,42767654'&#"367632+32767#"&54.g-. 1J21F*89?xb[Y?B@BI@G_9 20X @fF*bBn54 fR,$ 73#7#"&547>322>54&"z'54@yQ ~8)'&xY&xY]6P2< +Qg +Q I32676&#"26?%!654&#"7>32>32+3267#"&'#"&47 .7A '(0 O+ %<&R,$T4AU#[>eL00$[42](>GY:p1..+*(*01 '&5F v (D! /-0,X9hg,"%"%dvU 654&"2>32#"&'#3&xY'xl-d8~S y@Ty +Qg+R44Q2<76]g3#7#"&547>322>54&"A(h@yQ ~8P&xY'xM]67P2<4 +Qg+R'#"'&547>32!3267'654'&#"aDJM7 כF2 "*`@JtG?YT32#"'&54?!654'&#"32767pDJN6 כG1  )`@JtG?-,T32&'&#";#"32767#"'&547>U&˜:@BIS4CM!:+$BJt+@5GHDC<ICD>XP{$% aX z ,'  3-5HS:#"'&'732767654'&+732767654'&#"767632U&˜:@BIS4CM!:+$BJt+@5GHDC<ICD>XP{$% aX z ,'  3-5HS( ,654&"26#"&'7326?#"&547>3273+tZ)t\:o7/g:NW #bAx[ w=T -ReT"+QeAFC,,R)12.Pim !#7!#3#73ZaI&~~Q 3%3##{ŸI/7w%5%>32#654&"#654&"#3>2H.\"DN ?# NN ?!Ny NU?(&O+>i. 0Em,!/FmsA%+-&#+73267654'&#"#3>32KFCL??F12%$EzjBe(3<<~=Jf ('Gs^49:&>##"3267654'&>32#"'&54B`BC`QӕH2 ӖG3h\$. 4h\$. 4ĘX?^'-X?^'"0732>54&#"767632#"'&#+,6ZuAZ442/9778K6ڣ>42!e|6V W?b&, >32#654&#"ӕz -CB`՘^'-$.Th\9#"&54733267ӕz -CB`՘^'-$.Th\#3>32#"&$654&"2@(i@yP ~8P&xY'xb^67Q1;4 *Qg+QL3#;#"&547#737":'6O8"~*$~K@ )!~432673#7#"'&5454&#!7!#5 MH GOk  h7(&4!.E$Y\(#"'&547326732673#7"'& H.\ DN ?" NN ?! Ny ''U (&8+>ian, 0En+!/FA%T #3f7sdWd4sdTsdV} +"3254&%$!2.#">32#"&'!rRHrP4bV6JV~6`THFjh"do fo--u|SUѲlgtngjA`73!7!!3#!!7!7;%3,,3%*l++l*\Xr!7!;#+732767#"&ި+N=b 1foy+'b6+ь`n9}+dl7,d #367632#"&$654&"2z'63@yQ SU~8P&xY&xYs]6P232.#"3267K3p> ۤ8f/#Z4ZuAZ6c1a',!f^7U !GM 4;27654#"763#*''67&'&5467632&'&#"g""]L4Uk A ~ / 6'nn833/#--4Z:; $ ee@4'$>a'XW 33^%& ..#"3267>7#"&547>32''7'37;B] -AE]u0 ͙y‰'MM-FQF"-Pea7Mf"+/[&*zBA=qAHEB.#"&'73267654&+732676&#"7>32^P ۺ>C4HG[ XtJBaOM{YO: i I2?f2"z&"  PG1IW3###737>;#" bb z*#F7~ ~,qW~T33#+732767#73`^ppMQp'@v?CB,-#"'&547676;#"'&'73267"326?2e v\/<s~g+Q#7!;#"&54t =ǃJ~!1~bF)#7!;+73267#"&54^tw =ABL>:J~!1~x;:~78bF);<3!![ 08>32+732767654'&#"#654'&#"#367632H/\ D8:n>3J   NN Nz &(+*>(&8)?kz8=~J|-Dm* FmsA&.(#"&54733267332673##"&"I.\!DN  # NN !N;O+*>(&N+>jan. 0En,!/F0%+-*#?676'.#"+73276?367632J ,":*,"FEkM4`4549e(>R10U{ rCCK{\7B)@((6&'&#"#367632;#"'&5476/*^'-XYY>](4(? -4-44)3676?#7!#3!737&'&567>54'&%wTq/iD9D9X@q~~q@Ae#X@h~~h@Add^ 4z5#R 4z5#-D&'&#"#"';#"'&54?327676&/&'&54767632-467>"#z3`&QQ() ?L- 7<=;A$%*U1e(ST;:9) /"1a10 !~=&E)5 " -"2[22  +732767676;#"@F> ~=>*y8<~ Iq,+~ $c 3#;+732767&'&547#737 ":'6@DL>!* 8"~*$~x9<~8)@ )!~&#7#"'&54?#733333+3276|/64Ae)445555-12#]4;%=#+mm '!b-3267654'&'7!##"&5476767#7!c1( ;G%n>+##"'&54?#7;?2767654'&'7# a`|Fc+"ee&"( <60 #k!J'$+YXB+D&,D~¯Q#71P$&/(f}3# Zf7s  !!!7!4Ds{y!!;#"'&547!7!e4Ct ?L-td!~=&G&y]!3276'0#"!367632+'67!7! 3D)M1i! (B3_i$y %!7!#"&'73267654&+'4Z/C<ڹA= 9r;Wg K\jz f3|<7 )5!654&#"3267"&547>32CB_DE_ؕi(i(-&7ul~,'5vhkCNlBO &$/ u{&Dk& %/1&dE2&%/2&Ej&%/j&Eok&&&u xuof&vV&FHk& 'B1&G2&'B2&Gj&'Bj&Go&'Ho&G&'&G&('}&'H&(C}&'Hok& &(2LoF&'&H2/k& )k& IfN&* 2X&Jk& +;`k& K2&+;2`&KR&+ w\;`y&KjHHo'+ko`'K&+;`&K&,7&LXk&. xuRk&N xu2X&.R2&2NjX&.Rj&2NP2!&2/2 &OP2N& 62N& 7Pj!&2/Mj &O2!&2/ &O k&0 x?uf&Pv k& 01&P2 &02{&Pk& 1;`1&Q2&1;2`{&Qj&1;j`{&Q&1`{&Q=&2' y x2X'H&wRr&3 xw|Vf&Sk& 3V1&Sk& 51&U2&52{&U2N& T2&Uj&5Mj{&Uk& 6ZF1&V2&6Z2F{&V2k& &6Z2F1&&Vk& 7k& W2&72&WMj&7Mj&W&7&W-2&8B2`&X&8`&X&8`&X-&8' y x2j'H&Xw-T&9 y\&Yw2-&92`&Y)Zr&: {|Z-o&C Z)Zr&: x|Z-o&vH Z)Z`'j5/:Z-&jZ)Zk& :Z-1&Z)2Z&:Z2-`&Zq?k& ;1&[q?k&; wu&j[Nk& <X1&\ r&= |.|1m&]e2 &=12`&']j &=1j`&];j`&K&WjZ-/&ZuX/&\u k& A8|!2&$/2u{&D2?r& ||/2um&e& ' {l$/u'B<2k& /2u&s2&(L2}&'Hm&( ypuL&Hw2r& ||L2m&e"2&,27&L=2&2X2y}&R=2r& ||X2ym&eIk&b xuf&cvIk&b {uf&cCIm&b yu9&cw2I&b2&c-2&8j2`&Xk&q xvuf&rvdk&q {vuf&rCdm&q yvu9&rwd2&qv2&rdNr&< {|Xo&C \2N&<2`',\Nm&< y1uX&\w5r&l5r&5r&y5r&5&r&z5:r&5&{5&r&lHr&r&yr&r&z{r&g&{H&dRr&ldRr&dr&ydr&d&r&zd:r&cr&lIr&Ir&y;Gr&;r&zrr&heVwr&leVwr&eVr&yeVr&eV&r&zeV:r&eV&{eV&1r&lcr&r&yr&~r&z6r&6&{&Or&lOr&r&y r&H&r&zO:r&O&{O&cr&lIr&I8r&yTLr&@r&z|r&r&{I&IXyr&lXyr&Xr&yXr&X&r&zX:r&r&lr&I3r&yO[r&Oxr&z0xr&&r& lr& r& yr& &r& z:r& & {& Nr&Nr&Nr&oN&@r&l@r&@r&y@r&@&r&z@:r&@&{@&xr&lxr&b3xr&yO[xr&Oxr&zIxr&Ix&{7x&q5f&C5fdRf&CdfeVwf&CeVfOf&COfXyf&CXff& Cf@f&C@f5Vr&˜5Vr&˜5Vr&˜5Vr&˜5V&r&˜5V:r&˜5V&˜5V&˜Vr&kVr&kVr&kVr&kVr&kVr&kV&kV&kCVwr&CVwr&CVr&CVr&CV&r'CV:r'CV&CV&1Vr&kcVr&kVr&kVr&k~Vr&kVr&kV&kV&k@Vr&@Vr&@Vr&@Vr&@V&r&@V:r&@V&@V&Vxr&kVxr&k3Vxr&k[Vxr&kVxr&kVxr&kVx&k7Vx&k5F&5&5Vf& ˜5Vy&˜5Vf&˜59&m5V9&c˜k& N& f&*fV&krl{Vsr!77#7!2"Axyh9w;&jmTTCVwf&$CVw{&CVf&eVw9&mCVw9&rf&Dff&&fV&kr'l6H&r'l.n&lmMO`F&OB&OH&O(Oh9&mO&nk& N& f&bf r'@R:r'&mMF& & & (Vr&lVr&9& m& nNk& NN& Nf&tNfr&5s;H&jr;(s`fC@Vf&,@V`&@Vf&@9&m@V9&f&qfxf&{xfVx&k9fvLr7!#7 M"A"ïx9910!!+u8@ 9910!! 1/@ 9910!! 1/@ 9910!! 1/@ 9910!! 1/'__ &BB8@4G910KSX9Y"!35׬~4@4G10KSX9Y"!#95׬o4@4I10KSX9Y"!#:6׬oa#a8s8 d@2     4 G    991<20KSX99Y"!3!35׬5׬~~ `@0     4 G   91<20KSX99Y"!#!#}95׬-95׬o `@0     4 I   91<20KSX99Y"!#!#93լ+:3լoX #!#P8s8A7t8;y Z@/4; 9    9991<20KSXY"!!!!!7!yLL++L}81;{@J   4;;  9      999912<220KSXY"!!!!!!!7!!7!yLN-ZL+JJ+LZ-J}+}` 10467>32#"&'.736HI256743IH426I235624HI447743?!!?qHLo u@;    4I   999991/<<220KSXY"!!!!!!:F'E;Hooo $0<HLp@?J%K+I"L 71= +"%>4C: L(I1KJ11F17@11.11(1/99991/<2229999904632#"&5%"32654&4632#"&%"32654&4632#"&%"32654&%wwwu2IH33JJxvvw4GH33JKޥxwvw3HH33JK'!xwxwK24KK42IxwxG45LM41J+xwxH35LM41J^\1<HWg"2654&46367636762#"/#"/#"&"2654&4632#"&"2765454'&!"2654&#'-@@ZBCגkjIIjiKIӕjhIKihJKhj4GHfJKxvvwh,A?[! #?,  [AB^\H35LM41J}xTSTSwxSTSTNG45LM41J}xwxK24K&$13$&& )+ &K42Ia`l!a`u`('D`&'w`$#!$`u`'B1`'&w1m#@ /91907m2)w#=w#@ /9190 7%'-B#wv'4$x$(!6763267676'&!}bm4mjje`a ./piQ 3* ( 7 7S#F 8^^LAB\VC)*= %(+C" M B0_  $'5 $SLUSPPSEFE? !#3#3!D&z%z%j !73#73#7%z%z%޾tt'  4' 4' ; 2###T%#Ҥ,ԿH農/ #647632"326767654'&#"#"&4767>32J%#J2.L'3/&%&H=4UUg$%95e <e?<7UabH>8TbaxYL+*|RMV@ !3!73#3#mn|R* ~~w _@3 3  3 334      991<290KSXY" 333##7!7Reml#${)%!!67632#"'&'7327654'&#"@%k&SS~DDK<$2=?o^_yvtSL&& !#!o ?u2  -=4&#"326'&'&547632#"'&54767327654'&#"L@P23('AMdJ&&iiPP?@jN++ijRRFG !2F/. !;A-,1:+*B0T'(=gHI78YR99./G}KL78d_CC)"!4,#"!$3732767#"'&547632#"'&327654&#"!$+223oKK"+66?uEDlmOP++LEcb012 7I54@5M33 <=u$>>l``FGytsTL%%188R1<988 !!#5!5!58G!!LGA!!!!ffƅR #.547R#$42P]`ZFR 654&'3#$33QP]`[ #6'&#"#367632OJ 23%%Ey65Df)'3i~D('Gs^4;;/Td!C{dTtdTudCdCd!TdCd Td!Td4d%d)diRfdiRfddddt}ddhTdgdcnh{dd dd|dL%dL %!!!!!!#"32.#"3267B#b9=Aú$%As2 1e*E & B/6767#"476$32.#"!>32.#"'*]u7r^^\l1ad3O[Ps 4a#.C&g $N12J=78IDbǭ`e!!!!3#!#741/5!l!l./u"ݹ#!!37#737#737632.#"!!!H!./ )(0SL25~@q?<>(A)¸ Wz|%(=;zWB/#6'&#"#3676323632#?6'&#"#fk" 4AZC6;:AI00lL yaTH1?."C־75``/085cs VH)v75TR!#7#737#73!3!3#3#!#!3' -a&A-B&AVB/-H*!  $ 2644.YK&)qUu.&l=75I5g30`+05+dP~57KN*_zQV& .(D) 64$( (91iOUMkc> %2473$ . @!F2676&+#.+#!232676&/.7>32.#"#"'&v@@ .@U(:31::˙6}_Q(5059=7>"8 {U5p@8l269#2 S;<?ZgfXspR֔-v/:90/  0035+. #T"&)-1'#73'33733733#3#!#!#7373'!37kI4;;:4HZnOoH r1 r'vvVVBvvBvvvv= !2 #6&+#%"3;3ɐ6:: 1tksʐ7:: /uY*5=YBjs&j/,v@@#$u& uUCJ UC JB E*-,&+*'## %+#-999999999122<290632.#"!!!!3267#"=#73>7#7]VPI@8Oi9RZRhMs?LUTT$$KMg|>Z$$ +K!!!!!!!#7j[KHcw_`u!8LȘ !'?'7!!!77oDo o^~8*83n!n<^:MS:MS9MR9M7.i'6767632#"'&'32767654'&#"67'6767632#"'&'&/#"'&54767632327676767654&'&&#"032Ho$*(0.;' '#-/29"f  ,#'  !% l*%$GmoOL'$  0@&++6)!  5SK# 0*G(o&4+-' 1  7+Уc]97#96O3AHJB @@=kb3JMq~Es/4 %UA4G_KBjoD7=AiK}f^<={@  1@'32327&54767632#72767654'#"'&#"6764'&#"Ϝq:])| \fK* *m**tQ;)v;.*/qI"'" Dl26X``7a0<㫂&'lm@.j?3thP#l$:990C#i"',!23#3#+!#737#73!!6'&+!323~|TG HL%:N蹤mٱVUYY yG[ZH--HpB[QHZHHZ(zfffE[x&1#7!#7&'&54776?3&'&'6767o#@xy{]^jW>ˢXPaS+RG]b!&LA^I-//STKF#dtiϥ"7?& 6#PaQYU"73!3#3#!!!#737!!/3'# CL!E--tؤF!~D(DjQUÕeeÕÊ63267# &767#736767!7!676&#">323#!seml;ro,&' c8&+ak`m8ng'|&bA5&YcRT45 2 f@PVFC ./_T6 )%#&'&%6?3&'&'67679jm;;65͗KGE$%95bTFIHcc >610%R7r~or 7N'(OQ"z!o !!!!!!2٦33-Yr &#!#!'&+732767!7!&'&+7 | |"A]*4k .k0y@ /~y)z~2@_@[ @_y,>**;t%%3267# '&547!2."U|d] ք{OH}8Sryx A< 7@,Lԉk|r4*:0Nuev t ,>.#"3267#"&5467>32#3"32654&'2#"&5467>8+1=N.*:4*G$jt)',qI!Cj<-@.?du$")oDdt$"(o9"QT#EiPYV5IFID˫cL]]ɬaM\^3!3'!!!!!!+aa#]x}+ ;`K;`4#"!'7!7>2!6+qStyқ7?#&B00ۅ w63"!#7267 8 7  b%4)/*W- -*W-  4D4E:F9G=>;N>;}N,6>2#".5467>"3267>54&'.33264&#32+hZZ\[~}ڶ[\ZZ~cIGHHcdFHHHHHsߔ|AGGA|NZZ[~}ڶ[[}~[ZZGIGebIIHHbeGIGw5e7J3%!2+!327&+67654'&J m5//5=*__*]x~#g)ZZ)'%!# ! %27&"676'&|F"Cobbbbn%lkh4334a%-13&'&7!.+!!2!27&#676'&%3{THvu2M;o.a4w5}fcd)1ED)m=s@1F~h|hb)tL #!$5>+;6-0$(v# *%;(#8MX!GL!!+Im6#"'&'&'&'&'&#"'67676327676'#5!#O$0-6;+>4!# >&.&=A"?,.!" v([+!!O7!XM8#(H. % #vdB!!'#537xZx#xZxxx##xxM'75'3''#xx$"xxxZx#xZxB'73'7'7#'7!5,xZx#xZxxxݎxxM77#75'73؂xxގxxcxZx#xZxB'!5!7w>x#xx1xx##xxB'7!'7'7!'4x‚x#x>w1xxݎxxB 53#5!5x#x,x##xM %'3'3!5x$"x,rx#xB !'7'7!#3rx#xxݎxM 7#7#5!؂xގxx#xrM%7'3'7!!5"xx$"xx",#xYx#xxB(276767654'&'&'4#!5g    @16T)+51@x#x  Q87;=49(*x##xB(!'7'7!"'&'&'&547>763"j x#x@15+)T61@   xݎx*(94=;78Q  B$=+#5#53547>76"3276767654&'&'&g@16**)+50AGx#xT61@  G    ))87;=49(*x##xH;78R  H  B$=23'7'7##5#"'&'&'&54767676";54'&'&'&j@16Tx#xGA05+)**61@    G R87;Hxݎx*(94=;78))  H  BF26767676763226767'7'7#"'&'&'&'&'&"#"'5[ #$! x#x,"    "/x#x   %$   xݎx "  ! x##xB#'7#533'7'v81x#x81x#x'x##x'xݎx9~ 7'7ckn"[ kOcuP%8 5!#Ђx"xhx##xw !#!'7'zfx$xWxݎx8e !3!5x"xwx##xe '7'7!3x$xxݎxW5p !5!7#7[_xݎxwx#x?^ !3!5Xxx"xx##x2X '5476767632#4'&'&'&7#7,#!A=PNZ]KS;>#"!*#13#'Dxݎxq!TPA>! #;SK]ZNP=A!#qx#x%'C "()/ZOR?<# !>APT2V 5!7!##2lv<ĻʌvĜ<B  !!#33#'7!5!'7xpxxpx xx,xx742#"'&'.5476732767>54/#7!%?((*MGgZsn_aMOP(%R.-'<0CA57---0v\apn_cMG.(()LNkoaZU-8:>=96/(-,r=ZHv74#5!#53276767654'&'7#"'&'&'&5476v0---75AC0<'-.R%(POMa_nsZgGM*((=\vdHZ=r,-(/69=>:8-UZaokNL)((.GMc_nmdB5!B#x4#xB!!BM̂xx#M3'#"xMxM#'x$M4x#B!5!'74x#xB'7!5xxM!37xM̂xM!#73ضx#x4B  '7!5!'7 5!!x4x##x4̂xxx#xx M  '#' #737"xx$rxxMx4x##x4̂xB 5!!'7!5!'7B#x4̂x*x4x##xxxxB'5!!!!5#x4̂4̂x>#xx# M73'#'#'3i"xx$x44x#B'7!5!'7!5!'7x44x#>xxݎ M%#73737#hxxގ#x4̂4̂xB '7!55!x#x4x#xB !! !5!'7BM̂xM4x#x#xB!73!!!'7#5!!{Va6PEV`6Dx#x\HHVߞ;cff:bDx##xHHB!7'#53533'7'7##5'35#HHDx#xDDx#xDHHHfDx##xDDxݎxDfHB!'7#5!7!5!73'7/!7'!8Va68PxV`6Dx#xHH;cff:bDxݎxHHB!!5!3HH\ Dx#xDyHHfDx##xDfM#'3'#' fDx$"xDfI\Dx#xD \HB!5!'7'7!5!7Dx#xD \HyfDxݎxDfHM%37#73fDxގxDfH\ Dx#xDHB5!'7'7%!7'!Dx#xDDx#xDkHHHDx##xDDxݎxDfHHHM'3'7#77'Dx$"xDDxގxHIIHWDx#xDaDx#xHHkHH}6##7!#V`JvnJVJpvJT '#5!#5'5CJnvJ`JvdpJ^VT%753!5373JvdpJ^V^JndvJ}6%33!'38V^JpdvJV`JvnJB!!!!5!!qYNx#xdfYfx##xfB'!5!7'!5!7!5Yx#xNYdYfxݎxfYfB3773#''#5[KLnDvvx#xPP~~x##xB'7'7#''#5377vx#xvvDnLKxݎx~~PPM%#5#535#535'3'3#3x$"xV¼x#xVM3#3#7#75#535#5353xގxV»x#xVŸB #553353!Ƃx#xC{x##xM 5'3'#7#7x$"xnƂx#x}ʻB 3'7'7+53#53Ƃx#x}ʻxݎxM 7#757'3'3؂xގxƂx#x}6B !!#3xpxxxB 3#'7!5!'7xpx,xx 5!5! !!5cm 깹] 333'#!#\^Z A !!75!!5 ]]YY ###3!3"^\ZX0 m 3'335%!!# #^\znnZgm %3'3#!5%# #3!^\^dddZm! #!5#7'# #3! ^^dd9cm! # #3!3#!!5#3f\ F ^m!וddkn'33%# ##!#'37"\`\\\~$ym?TT %3'3#!5'3!3#7# ##'37^\^p\\\@ddZm?TTB 5#35!7'!!!5 5ddm]]YY'd!#7!##gv<ĻdgdvĜ<,x!5!!53753dĜ<cg<Ļd 3'3#7## #3 3^\\^XZZ֤mmB676323'7'7##"'&'#58X)O$A?x#x:[V6NJ9\ 63SxݎxH9ZY8J M 3'#'737"xxxxMx4x#x4̂xB'7!5!'7!5!'7!5!'7x444x#?xxݎB#5!5!53!hZיrrh4_+__|z|?X!0?"'&''7&'&54767>2"&'2767>54'&ww&'''OO_:3www('''OO_;4AA565  AAA565 ww49_pm__ONP(&www4;_mp__OOP((D56MJ@  56JM@K@&4<91/90KSXY"% !!{!5q!!{qdm3!!"&63!!"!Q )SS) PH{__{HPd;w +#"!#73#!!3!!"'&'7&'&63S) W J+!y 53W ^c>H{HPPHC4|Pu_`P`_cn!!3!!".>3!!"U*^_*&,bމ`+dm&'.#!5!2#!5!26767!5 )SS) mPH{b{HPd;w +%326767!73&'&''7#53!5!&#!5!2'#܃S) V SK,"xk 52X ^c>H{HPPHC4PuP`bcn!5!&'&#!5!2#!5!276|*]^+&,bމ`+3!L9@44120!!!9_^-L9!!!L-^LP *@     <91990 5!! !!5my=/9) ӇB H 10!!BKXy !!5!3!!!5!ff!bbB3yTU etrX)1 ,@     9190'%3##q@`44{$1v(3#532654&#"5>32#"&'532654&'%3##oooJUOFEDECibouKJCPU_b@`442,-3teI^p\y@8=D{$1e 333##5!5'%3##mmw>@`44&{$  %.#"326"&'#"&54632>3"36J032#"&'#"&546320P2;JC88b6J0#47632&#"#"'732UpsXlNGUnsXlNGD"McoHޕMcoH^#+4632&#"#"'732%4632&#"#"'732ronQ.A&ronQ.A&ronQ.A&ronQ.A&D"K&ޑK&"K&ޑK&^#+A4632&#"#"'732%4632&#"#"'732%4632&#"#"'732aroKnR&roKnR&rnLnR&rpKmR&roKnR&roKnR&D"KzޑKz"KzޑKz"KzޑKziB'I$'IWI4Wi>'IW'I$I0$i'IWI$iB'IW'I$'I4WI0$B 'ItJi !!!!!!RMM/6&'IT'I$'IoTIn$Xy&'I~IXy0#"'&'.#"5>323326yKOZq Mg3NJNS`u_G0;73 ":?<776<Xy032?3632.#"#"&'XJG_u`SNJN3gM qZOK0A<677323267#"''43NJNSFXɉ;5GJKOK[C :?<7Dj323326!!yKOZq Mg3NJNS`t_F(!Z<73 ":?=676=X'y#"'&'.#"5>323326!!yKOZq Mg3NJNS`u_G)!;73 ":?<776323326!!!!yKOZq Mg3NJNS`u_G)!!;73 ":?<7763233263!!!'7#5!7!5!7yKOZq Mg3NJNS`u_G`aG#z`;73 ":?<7763236767!!!!'\UQ:43NJNS`jNDJKHEL=a?]R<# :?<77 Y A;XXy7Z@110+5.*'   'l.5l l l810* 8<29199999990#"'&'.#"5>323326#"'&'.#"5>323326yKOZq Mg3NJNS` t_FIKOZq Mg3NJNS` u_GZ<73 ":?=67 6=;73 ":?<77 6<X=y4&'&#"5>3223267#"'3267#"'&''75>3243NJNS`f]GJKO)-D\NFIKOZq gZpNS#(  :?<76Z323326#"'&'.#"5>323326!!yKOZq Mg3NJNS` u_GJKOZq Mg3NJNS`u_G)!;73 ":?<77 6<;73 ":?<776323326#"'&'.#"5>323326#"'&'.#"5>323326yKOZq Mg3NJNS` t_FIKOZq Mg3NJNS` u_GJKOZq Mg3NJNS`u_Gu<73 ":?=67 6=};73 ":?<77 6<;73 ":?<776<X<y"32?3632.#"#"&'!5!5XJG_u`SNJN3gM qZOK!!A<67732#6454&#"#4&#"#3>32V""V!Z6^b"%25'26 R28W35uo :5SN[5SM%Q//7V'x:%)!!!!#546?>54&#"5>323#V""J 6 0*)^3@"   H H   <291<2<2.990!3!!!'7#5!7!NŮmA1}X<y !!!!!!X!!!Xy{!5!73#!!!!'7#537!5!~P$fZ=e(lN"ebSbKXy !!!!!!!!X!!!!Xy &@H  <2291/90 5!5y!PNFXy &@H  <<291/9055%!!X!! Xy 3!! 5!5X!!! PNFXy 3!!55%!5X!!> X}y#5!7!5!73!!!' 5ZYM{~ X!i i행PNX}y#5!7!5!73!!!'55%ZYM{~ X!i i행Wyq&%5767$'567Rȳ}v֜P ij~wԞP(Fd%EP7(Ge#Xy%5%7%'bk8jyx!:_|:XCXmy55X!`aX<yD7%!!'7!5!7%5%ykSnKAD*ZWOzd#@4=PhLx"LX<y@7'#5375%7%5!!' z0VFdjeG'C0'Pau6LvLXy!#"'&'.#"5>323326 5yKOZq Mg3NJNS`u_GJ!;73 ":?<776<PNXy!#"'&'.#"5>32332655%yKOZq Mg3NJNS`u_G)!;73 ":?<776<X<yD+.7%3267#"'&'&''75>327%5%RmKKt`GJKOZq G:GAFJNSMOyel!PNX yy  5 55%y!!PNXTy1!7%'757%57%5%77'4PGx0e4P0GkB$$1F4F\}F5F\|t?t?XTy15%%''5%75%7XZuu: &uvk;Z&vFIs}FyJs}Vwa%&'567$wSh"/_D$#Q_Vwa%$VhSbQ#$DbO/"X[y5%$X{qQ_#pOKI4 &X[y%%$ynq{_Q#yBpR&4 RIKX2y%%#"'&'.#"5>323326%$yKOZq Mg3NJNS`u_GJQ_;73 ":?<776<TKI4 &X2y%%#"'&'.#"5>323326%$yKOZq Mg3NJNS`u_G)_Q;73 ":?<776<TR&4 RIKVw67&%'&'567677\RN@E߾\SiIRa_bIGE#"R!+Vw'76?&'67&qRN@E߾\SiIRab_bb*IE#"R!+DXyx!!"3!!"'&5476?:nLMm:׃x|~KM᎚ِXyx2#!5!27654&#!5̍:mMLnxϚMK~|Xyy %&'&5476;3!!!"''#"T=1̆cHcw.nL!5ِEFǚ|~K Xyy +'7#5!!5!232654'&'}=1̆cH>9c.nLA!5ِE,F9|~K Xy)%!5!!"3!!"'&5476y:nLMm:׃c|~KM᎚ِXy)7!!2#!5!27654&#!5X!:̍:mMLnQϚMK~|Xy(#"3!!!"#!!'7#537&'&5476;7OnL!-u/K.~=M=̦CH|~KuLx#BِEXy(!5!27+!!'7#537!5!327654/:*'EE/&`-u/K.~-/ mMLL ,E(ϚuLxuMK~|M Xy)!%!'7!5!7#"'&54763!!"3!!y(6^N׃:nLNl:=6ؔDuِ|~KM1DXy) 2!!'7!5!7!5!27654&#!5̍Kh]6(6^:lNLn)ϚR"KDؔDuMK~|Zw3#%3653! qwyRVBZw3653! 3##5#535ZwyPFVBZXVy1/3ް2/301!!!!X!6XVy1/3ް2/301!5!!5y6Xy I?3 ް 2 ް2/33 3015!!!!!X!!6*@Xy K?3ް2 ް 2 / 301!5!!5!!5y!6?j>#!#>33!3>33?2"&'&'&547676"2767>54&'&'3!!#!5!WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:FXVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;93372"&'&'&547676"2767>54&'&'!!WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:FMXVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;933?2"&'&'&547676"2767>54&'&'77''7WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:F8xxyxXVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;9yxxx3372"&'&'&547676"2767>54&'&''WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:FxxXVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;9_xx37!!2"&'&'&547676"2767>54&'&'M.WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:F/XVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;933BL2"&'&'&547676"2767>54&'&'2#"&546"32654WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:F7b%&'qqX>=,-?XVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;9d)'%`8nqq>Z<=,,3!)/7?E2"&'&'&547676&'&'&'75676767'%654'WV,+++WWWW+++,VW:F!#!E: ֈ :E!#!F: & XVWih{xihWVXXVWhix{hiWV9  9{18@9p 9 9 w:A92t3!;!!!!2"&'&'&547676"2767>54&'&'+{{WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:F@XVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;93372"&'&'&547676"2767>54&'&'!!WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:FMXVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;92K 3!!#!5!!!!o2K !!!!!Moת2K 77''7!!! yxxxoixxyxs2K !!!!!M3o/B!!#/^B!!5!3^  B!#!5RPB35!3!BXmy5 y!.Xmy-'55E.!U`aXy %!55 y!! $]PNCXy 7!!-55X! !U]g&"26!5!6762"'&!OsPOtOrw#[륢S'PQqOO>-"YR%ZLw #4&'&#! wwy H\PZ/w73653! Zwy\Hz> |bc||bI10!!Mv\ !!'*]])]\@寯X'y32?3632.#"#"&'!5XJG_u`SNJN3gM qZOK!A<677F =0|bF=&N@NU@Xy&3!!!'7#537!5!!5!3>F =0|bF=&NjN@Xy5!7!!!!!!!'7Xw!6_H4%H@CffXy!!!'7!5!7!5!!5y_H4%Hw6jCffXy" %3267#"''&#"5>327%5yL;5GJKOK[_b43NJNSFXH!e3275%X!V_;5GJKOK[_b43NJNSFXJ,323267#"''yQ_k43NJNSFX]_;5GJKOK[_KI4 & :?<7D323267#"''X_Q{43NJNSFX]_;5GJKOK[_R&4 RIK :?<7D # #hGf> 3 3h*f> # #!!h gGf> # #!!!!h ggGfjT!#!W$o !#7>$db!3b $"}!73!z$> dR!!3#CܐRL  R!!3# C RL ~3#!!C~ L ~!!3# C R Xjy!#yG,$%%$nn!"nn 8ʸ !%6 !&'&";112Q2qp`XXV@@VY  67"7,J5PP5JkX*77*I=P"2642#"''7&546xtyΞi56؝wYe:vuvo3N=eXt#O'+6@KV#"&46235462+32"&=#"&46;5#'54&#"3!3264&#"32654&#!#"3265k֘֗kk֗֗kL65LL56LM56LM56LM55LL56LJחkkחחkkט5LL56LLkLL55KK65LL65KK5Xjy!3!y3j !#! 5!# 5; p;!!3Xp;)3!X;5f477632#"&'&'&#"jkbwL=.> \bP \bP]Y"\I\\\\I`LLMK\y>>(I !!3#!#%33'((d&sd4^7 h\\D?ccB !!!5!!5RR(!!!OZW !!!!5!5!![[[ZWT !!!!!!!!!55[[˰f W5 ! 7 !!-.O|c;5[Z.Ґ|_W=&  #276'&"! '&'676 !%!pqqpB`Ϙ_BB_1`B[5;@@@@EI7XX7H"H7XX7IÐW3#3#&'$%67%676'&ff2ffff1ff=>>=E>>>3;@;$;;#p#3##tD'  BB 3!!#!5!M%6BB #!5!3!MU 6%4 !%!!,5m5A4 !!!!;rԵ5mY5A !! ![[#ZCoW^pK  !!! ;[5;Ő[#ZB35!3!!#!B#x ^x#x6xB3 '7!#!5!3!'7x] x#x6x !%!!%!ex[xWx x !!'7!!'7!;Őxex[xÂx'3273632#'#"'$%65'&#"pp./NRR2]PQ pqp/@ XX`H>@B !=!3!ZZ!3 33!#!3!3POJ3+^/4 57!!#xr;rw/Krm-4 % !%!5 !53!]UPmrZ[zB"35!5&'&7673!654'BB4_`4AD1b`4CP5544}4_`4&1c`3)2HK33HK2B '!!#!5!'"xKJx$xMTx# !! '!'!;xcx~WxwzxwB !!!#!5BKKRPT!3 3!###!##mPOmʀʀ3+^4!5 !! 3!xS;ZKmy4 !!!!5!#];r~U[ZZ,B#!#&'&547675!5654/RC0b`3BC5_`5BP3366:2e`2k5_`58'2GI23JM2B!7!5!3!!7"xJKx#x;4łx !%!!7!!7x&xWxpwx&   !5!'!! ;qi0Z/=>&  &  D&  D&#"632&"26"'# #'(J^\Ncdbd TN+ddbc724& Z^' J !!!!!!!MM['ZWB3#%3#!#!5u`RP 3#%3#!!un2xqv7' J-i' 8 t'  B3653#&'&33zgJʾOhz)<Ґifj3Z\|Y Xy33!!!!#&'&TTʭpH6LL7uEy 7NL7Xyi' 8aXmyi' 8!B !!!#BK9c!%!567!6!&'&'&'yKH FJ97;6L2J!/,3 4(`<?-joo   lXy(8#"'&56776326"&'&&'&'&'&'3276y m{{d m{{cf/ %#2J!UI*/YKX M3 +/fg/  Do}R ( p}I ( " q}}RXy3#"'#&'&#"5>323326yKO54&#">32!!!  >PZ?-\\T`beD^XD&[cNY=P+CDGF 89L\VBT= WXy67!!67!%".'X[XU*>P!G*iceOu5c|oq/1$Hp X?+.D`0Xy!.'!5>3!67'ydafN"32 7 ]J3,AI^9lys:932M#%]J3,AI^9lys:932"326=7#5#"&546;54&#"5>320;0]J3,AI^9lys:932'''']J3,AI^9lys:92".33&'."#67>76#FVʓVVʓ= mm &#Km % mK$ʓVVʓVVj,(Km@@mK( mK,K/,Km F^%.!4>2".7!&'."67>54h4.#52".ut&F@mm@@mSoʓVVʓVnt]&sْFUSm@@mm@VʓVV!!![ZWm !5! ݠr0p !!#v !&5 ƠT_Cm 5!p g!0v  !!#ƚΐ,Um!!! # q !!#v!!  rm!!#N#!0v !!!##m !4763!!"{zf+!u0%y!4'&/32765!-9+en:==@ne( =F|AEuH<y 3!!"'&5!+f}{y%0Wy!! m 4'&#!!2!+fz{}%0y&'&!;!76<(en@==:ne+!< TuEA|R=y !#!!2765{}f+!y0%! z% !!!#!55!mw ¤]]]! !!;bc;$<$!3!39W Vj5!jl!X3 !@ <j 5!!5!!5!r#B#B#j<l !!!!!r#B#B#XXXm 333mjjjm !!!@@@mjjj<j 53353353353X 5!###ljjjX !5!!!5!4l t,> 3!!!--Axj 333!xjkx 3!3!kA 5!5!5!3,,=jX 5!333jkkX 5!35!3̠= 3!!!!-- ABx 333!!xs  x 3!33!!-skA jB !5!5!5!3,,X !5!333xtjk X 5!3!5!33t,  !5!!5!4B 5!!###sjjj 5!!5!3!!t,-sjB 5!5!3!,-XAj 5!333!jkk 5!5!333!XkA!5!5!5!3!!!!,,--AB5!333!!###sjkkjj !!!!5!5!333!-s t,jBkA 43!!"yY[p~| 4&#!5!2[Yxp~|j 5!2653#xY[j~|qj !"&533![Yyjq|~*m3YѲ/ Y*m#3*/ Y*m # # 3 3*iSjh5!|j3?hj5!h}j3@hl|X!@?hl!h}X!@@l5!5!!5ijVV333PP?@l!!!iXVV#!#P@P?@ n?!?j!j!k!@!!B!B! F!Z ! ! h!| ! *!> 3 i v}8m #'+/37;?53!5353!5353!5353!5353!5353!5353!5353!53Z667576l #'+/37;?CGKOSW[_cgkosw53%5353535353535353%5353535353535353%5353535353535353%5353%5353%53eeefffdddheefcd!!!z m #A35#35#35#35#35#35#35#35#35#!#5#!5#!35#35#35#35!3h̚h̚̚h̚̚hϚ2̙Ϛ#366B kBF yZi!}@i }i !!}} @@&  !!!@@!!i }&  !!!}}w!N<w7!!!xr$<w 3!254#!") ) xrVVVw&  w !%!5!5!5!5!5!5!5!5!5!N54&'.#"!624HI347652IH637J347744IH426532<( 67632#"'327$%&#"!zzzzzzzz12Ι4GG΍GG@XXXX(( !#%&#")7632ΙK/zzzz`XXGG 3327$3!#"'&12zzzzXX`GG7| %63"71{y`X{G7| 2#'&#82{{x|XG7 527638x{{ΚT{GZ7 "'$33{y{TX`G|0#'&"#%632ˡqppp12A@_XX32763#"'$pppqΙ@@XX`wN<wN<w!Nw!v<`/3267>54&'.#"467>32#"&'.H+(*h9;i)*,++(i::f+),H736HI256743IH426?:IILII޸[["[[w !!!!!!IIN< w !%!!5!!!I) NDJPV\bhn27654'&#"&7367'67675673#''5&'&'7&'%67'7&'67'%7&'&'%6767%&'&$h%$%%34$&1++XSA N@`==k>P CRX++XYC P>k==l?L ?Q oL+ Nn;P?;@  nMNn3%%%%34%&&%s==`?J >PW,,WW? K?_==f?H?PW,,WU?H?^<=Ke+cL mCP`k<<!4(0847632#"'&7327654#"&#%#&7&'67&'67!󫪪vӤ=6 5N'V[S.U[R󫬬񫪪񿉊 ʯX[V[X[V[!4(0847632#"'&7327654#"73$3&'67&'67!󫪪vѦ=63QNV[S.U[R󫬬񫪪񿉊w  'X[V[X[V[!4!)47632#"'&%#$''&'6%&'6!󫪪4>;D@KDzcngk?dnhk󫬬񫪪I kpinipi !4 "*2:AIX3#''%#&'52#"'&5476!!'5%!!'53'5%3'5%3#'32765'&#"M==,/0#H 8&O6 |7iY06./==e6a&i1r4z012+KN2HQ>>>>f^2"/1]8`1"Y 4f2y`1B7#5#53'&'&54767&'&=33676=3#327654'&O&"}|fzg}}"&&"}UQn$mQU}"$nQUVV{xVVUQ<"{u^^\ _u{"#| zUOOUz |#YOT{zQPPQz{TO@>)4'&#"3276&5476327#'#53'&`____`oŠqk]^^]YYňÁhgf@> '"3276'&'7#5373'#"'&5476j___``_ߓqŊqYX]]XYfhhĈÁj0 '&'&376&+"'&5'476%7!Z{z[ZZ[~\YWmpN#ZX[[YZ[PQmp#TG*52764'&#"#463233#!5sPQPPtrQPyzg֏LQQQPPQr{{t|g*#"#53533#632#47654&#"#ddiqqCBigIIugzyUr}ppDtPQs_CS 7"27654'&7#"&54767##53#533333#3##h. @\ ! 2(>>?ZW~>'3|}}! -/@ /- !^'?XY??~YX?(F}R}hh}}hLS<#5#535&'&'5'73'3#'73'676=35'73'13|e{vw}wwUATwx|xxS@Wwx}vv|d|re{Eus~~suE|VAKtrrt@X{Ius~~suI{dr|*! #!!!'!27674'&#_82V)3{D#MHZW{s{?zK8QO##"'##565'##"/547?kM ,4N"DF &Fi?JO/FB!O {|Im<&=M2227632#&547636=4'&#"#4'&#"=` ]d2 cBU;/G;SXMB:@B ս;7hf% #>|\@9@O &&5 iC n:^O G  %2O7236;2"'##'65##"'&5476;235&'&=476jS c1=EO ;SCFRʝT6*F@E1;O+.`162V Yi8/D ;8[B VRP"<B+"'##565#+"'&575477;2732;276=4'&3&'"ih;F(wQ"DG".FWCNfBy" bODUq5u4  Pro@ |S`64 'RHIOq 1 ӫg 4D% 3363'$6'"I+4 puoS^*  3%#'#3%#';&2 IʗHj7*(,377#'#'547#5773%%,ppsr,'zzxz'984?/99e5>:_B@&*'$676#"'6767 5N@#3 J<*Ĕ $8FJ, SR-PAdmR Ga&767$7676&#""G,*PH$/YL-"YR%u#\u ! !h i/u-1x 3%!!!!;̢4U2xxxLY #3 !7!!7ʢ̢U4x2xQ1 !!R1mpp !!2mpW+'  z'  5 !!d#xxx#xx#5 '7!5!'75xx#xx5!'7'7!d#xgx#xxx#xxݎxx# $%!::11uP-,S'GF'N 7676']::@v 11uPS''H dXi:H 'iMH38 b u#\u h u-B\33##!##533RPPRB\333333#######5ُُPPُُRRRRPPPP/   ! !! ! hZ[MM-3zwXsXy&I~Xy&'I~IT}!! 7J771!# 7881!3 85 ''!jxxGF5 !0wxF5 77!xGVxH5 !xGwT} !5 5! 7E7Jɩ771 # #3 ک878F8w7!!!xr$<w!!!xr<w7!!xr$<w%!!Yr$<w% h5bcJ6bw bc66bw ! bc6bw! 5bc6b w #)-17%#535#5#5#5##5'3#5#5#5#5#5##5##5###5ZssssVrrrrsZVr~rZHNrrrrZZrHNbVrrrrrrVV+%;# 47! !&+3267654'&#8 ',~" iK *4k;k^Oy{+z)=,AOfH8D @_yi_m%:/= 7!!7 '&7!32765#"8P$!TL'#3j/j`+h ZZV # #!!+73267""`30b4y,MdhsTqenC !!!!!q''cq '!!6 !65'"325eP"$!L'#j/jspթhᵉZZk!!!!'n3hh?R`!!!R+e#J`@j2!$76676'&GV:caw`>-;;/xL^&7)L5 j{4@BsSV}dxaM> !7#"'&'3276767676&+7!2"?bdv<78.6(yL^KL2^=b+<ҋ@`45,,! >&64pnbo{&"26$  6 76&"@s_@s_xjVj%|nO TӜ iPPsOO*=CWW _Vd, 3!3-~>&D4&'&54!2.#";#"/&'&'&'32654&'=>Cg[9Dov{^rE@G9:p.#$"r|;akFEQJK~))>?qXTS6AP!zGx251QUud>[<%;#"/&'7!!H76&/.76$32.#"77 7GL+  eW4RT\i 3IA"v{ =TBV\L98FGDC+P=YNcwI#7337%мtt<I#733$YtI#733$htI#733$4tI!#733#H% 켼tI73#3d%% м0 73#3)$$[d73#3$$h73#3$$Ӽ4Z!73#u%%tI!!#%0 3!!#<$̼d3!!#x$x3!!#$<dZ33!%0l 3'#'YkgKQovoQe #'737CYkgKQovoQ+ 3#73#G>P>&+ 73 73>N >h&&A}#D Z~d37 !7 !7 1^81^%1:$-HXcmZ `!7 6!7 6!7  *6*6*N(6aY 7!$*.P)jc@N1 V{ 7!$3>P)jc8^N1 V%+73267!!!!!3rqy,%dgx"'nqn':nlnlh9;X`!>54&#"!!>32+73267!:7Sty/#t0e 1y+'dh5:=\gL/Sn1L'U!}=!7!7!7!>"">"!! #u f!qe910!ll+^nD";!"&7#"76!7!!%&#";4l=b,ь1l{',@D,N ; 2`CԄn+)b̜28? !!3!# !/iq>h=/B=Z{ 3##67654&#"!!>32#cc8:7R;:y% 0e:=HH`\g&'"!!!!!!"#7676'oqn'ف>&$tn9+h%<"MUQ$33733#####7337UUxHHxTT}}}\tk\\ff1"+6&#"#"'#"&632632!3267"2>& =F@YyEJMi<ӖFk " Qa@I6B`$7_$7ABE?UU0VVCJH #Hhhhh)*2 54767.54763%"&"26765%5"b6(V)/\BӜ BӜ |LX LXkbMB@KGGB@]       4 ddGe       999991/<2<2990KSX9Y"!!!!!!#737>;#"%9Zۮɮۮ-'P+CB:-cNɝ1B@M    4 ddG e      99991/<22990KSX9Y"3#!#737>3!!#"d+ۮ-'B:cNɝ31j%!?6?>54&#">32  @7 7 iubƥhf5tYEJs]XW5v{iVb_:7HI>9C~dN`: !!!5!#!!3--%8`xxpp9f!#Af;\@99991<20KTX@878Y@////????]]3#%3#P/15Ds10K TX@878YK TX@878YKTX@878Y@++//]]!#+s`@  99991<<99990K TX@878YK TX@878YKTX@878Y@%         ]'.#"#>3232673#"&1!#5 `%A#5%'4 ^%@!% @8) =:Xy} !@ <<[E 104&#"32!2!"&R]U{aSyM mvjy6BpX910#ɏX?@ 991<90!#'#L\s@ 991290!373/wo@ 9910'T%#%vucfk>32#."(ǓJ@V76 cC:m=<=ck@  1290332673#"&5 ROGj(Ɠk<7=6}uk9910!!0kcCk!#!#&}kOcvk#!#kk,!!!767676767654'&#"67632I 7Y01O9!B\IH7:_bViW AuY55_<рDрDvm[vdhR'!RqyB\Z+`m?71XXX#/fP==-)qTj9s//BL;R;XDZjZ1XRhhNXX9f!R/Zj=====ws----//////LLLLR;XXXXXBjjjj///BBLLLLLffff;B RAPPPP%;;;Sf=X=X=X!ZZZZ-j-j-j-j-j-j)Z111/";.!;nT[<Tu  de>8Q A|RY>0.8QlR/=X-j-j-j-j-jS//jfR=X=Xf;js//LL=X=X-j-jZ; ^/L=X=X=X=X5ssd[^x HB%S-lbH9m ,, bK@U+!{|:CV Q6 7 <~Eg~3qYe_PM.wRyuc`w<s9PyRu;96od-@B Ib(M6s H{9tO[=[q5deO5A8deaOAIpX,Hs@OX@o^.8ZI/VUkP[F|a(x|u=(q|/$ qL4++A?X?=(iFLLQqZ(A+Z]t>bSH|4%JUZ7e;|,(//jL[S[S|4++=X[b[bF((((<d=D)Z77)$x7!y#M>1/-!=ZQ5+Q FQ.7D \p67oRIp?*%O)XZ6NcWOH0$M& -$?-)Uj>$!K9$ #H9-$+# * ! ~N] ,)B* Q$(i&9L4T4Tj\FGW,Kd;-c> ////BBB'CL/f;;;Hk;RRRPPPM2;;;=XMZZZMM-B-j)Z)Z)Z)Z)Zqq111;Z8////LLL=X=X-j55555555ddddddd Heeeeeeee2dOO HOOOd9MXXXXXX4\yy o@@@@@@@@4\755ddeeOOXX@@55555555CCCCCCCC2d@@@@@@@@4\75555555{yCCCeCHOOOOOO Rtss@@@@@9L1a11=$j/! ! /!! !c LLCBBE6ortt;;2oJ /* / -BBBBB;IBBBBBBBBBBBB9?222B77BBBBB BB B BBBBBBBB}}BBBBBBBBAB',B BBBBBBBB!w?ddcddcBXy111 XXBJ/XXXXXXXXXXXXXXXWXXXXXXQQXXXXXXXXVVNXXXXXXXXXWXXXXXXXXXXXXVVXXXXVVXXXXXXXXXXZZXXXX>>2222BBBBXXXXZZXZZXXXXXXXXXXXXXXXX9?rno}  XG#X  C@_24BBBBBB!BBB!BBB-XXXB!XXXX@64HFFF<<<<<<xxxxxxxhhiFiiDDu777777aa"!!!!GCL2 1rjD7BGuxLQWN:uBBPwXXT11T1=C?@b,WXjw<l# ;1Un"1)BB95sXX/OP-RZWDDDDHL  P 4D P\`d(|d p!|"#\$0$%p&$&'$''(L(() *+,`-.t/h0223457894:H;l<0=h>h?@lAXBtClDE\EFGTGTGHIJKKM,MNOPLPPQRLRS4STTUVVVW|XXXXXYYZZ,ZDZ\[d\D\\\t\\\\\]]^^(^@^X^p^^_` `8`P`h``axcc0cHc`cxcceeefff4fLfdf|fgggghhh4hiiiiijkk k8kPkhkkkkkkll(l@lXlplllmnn n8nPnhnnnnnnoo(o@oXopoooop,ppppqqq4qLqdq|rrs s$s<sTslsssst t$t<tTtluvv0vHv`vxvvvw0wwwwxxx4y zzzz{ {${<{T{l{{{{{{||,|D|\|}} }8}P}h}}}}}}~~(~@~X~p~~~~~0lx<tp< `LD84Dh<48H@D\xPH $ 4 $<Tt4Dd|4Ld| t4Ld| $<Tl,D\tPTl $<Tt,@ (Hx@4`84 PXdp,t DD 8XhlD P”,è\Ĭ pHƜ ǐ8xDɰ(,˔t͌,θxϸd\Ҽӈp֌T׬XT٨Xڰx(hxL݌Tް <L|ߌߠߴ Pl|xx \x @P`p8xdt8T@d,\x x$`40@PPx0 @\0H`x 8HXhl|hdD4Dp@0t`,(\tP<L$T 4  4 D T  H     0 l  @ X p  8Ptd|HX@P 0\l|Xh$d$xLT<L(\tDThx8x4   0  !8!H!X!p!!"h""###P#$$$$4$d$$%%t%&<&&&''d''(,(h((()))L))*$*p**+++4+,,l,-@----.. .0.@.X.p......// /0/@/X/p//////00 080P0h00000011D1t11111112223L334p44566d66778h9,9|::T;;P;<8<==>,>x>?|?@@AdAB BBBC CTCtCDDDEEF0FFG8GHpHHIJJ`JpK4KL@LLM MMN\NOP<PLPQ,Q|QQR<RRSSTT,TU4UV@VWDWXlXYXYZXZ[0[\h\]^0^^_`(`aLabcDccd$dldde,eff`fg ggghhhi,ij`kl(lmnlo(ophq4qrls(stxuPuvhwDxXyzz{x|$|}`~\\|d | H|dLP lDx(LL8T`8|\ XH$dT@ 8 P4<X|(0d,$LL$<Tl 8Ph(@Xp 8Ph(@Xp0H`x 8Ph 8Ph(@Xp 8Ph0Ph(@Xp0H`x 8H`x(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xpˆ ¸0H`xÐè 8PhĀĘİ(@XpňŠŸ0H`xƐƨ 8Phǀǘǰ(@XpȈȠȸ 8H`pɈɘɰ0H`xʐʨ 8Phˀ˘˰(@Xp̸̠̈0H`x͐ͨ 8Ph΀Θΰ(@XhπϐϠ $<TlЄДЬм 8PhxѐѨ8PhҀҘҨ 8P`xӐӠӰ(@PhxԐԠDxլt,Tؘ8tD`hޘ޸,Lߐ<XtxP\8 H$8L`t(<Pdx,@$l (x@|0lh(x8L,<L$Dd$DdL,t4|pd<|4p    l   D |   $ \ dHl 4X|$xPxPPHDlPT HDlD L  !0!!"("""#L##$$%%&`&&''(0())4)|)**0*p****++,,-P-p----.8.x./D00$0H0d000114112D2334 45060678t8949:d:|:::; ;h;<4<|<==P=>|??@@H@@A@AAB BBCLCCD0DE EFFGGHGH8HHIItIJJKXKKLXLMMpMNpNO@OOPLPQ QQQRShT4TUVWpX0XY4YpYZZ(ZLZtZZZ[<[|[\\T\\\]P]]^8^__T__``p`axab@bbcPcdXde e0e\eeeffXf|fffgg<gdgghhhThhiijj8jXjxjk(k`kl pq,qTqqqrPrrsDssttTttu uXuuv4vww@wwx$xxy4yhyyzLz{ {\{t{{{{|\|t||}}\}t}}}~`~x~~L p$$<T 8 <$@x,Hl dH<XtPL(Lp DdDpDlHp@l<d <p @tT$X|(P|4h L(X0p\,\8Tp<d4Pl0Lh|Dt@dxPhP`Hd(DlD`0\x8|\l XXd0`,plPTP8ð(PxĠ0XHǸt4ˠ ̜(͈Ό8Ϝ ЬєXҬ<Ԙ\լ֐֠d״,hؐظ Tٜ,`ڔڴL۠۰8`܌ܸDxݤ Pހް߄x xL$8`P$Hl@lDp<dL` T(Tx0p<  h H@  < +k@_B m H  ^4 \     S :z : . 4U " : &6 hCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain DejaVu Sans MonoDejaVu Sans MonoBold ObliqueBold ObliqueDejaVu Sans Mono Bold ObliqueDejaVu Sans Mono Bold ObliqueDejaVu Sans Mono Bold ObliqueDejaVu Sans Mono Bold ObliqueVersion 2.35Version 2.35DejaVuSansMono-BoldObliqueDejaVuSansMono-BoldObliqueDejaVu fonts teamDejaVu fonts teamhttp://dejavu.sourceforge.nethttp://dejavu.sourceforge.netFonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. http://dejavu.sourceforge.net/wiki/index.php/Licensehttp://dejavu.sourceforge.net/wiki/index.php/License~Z   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  sfthyphenAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F4uni01F5uni01F6uni01F8uni01F9AEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0221uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236dotlessjuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0243uni0244uni0245uni024Cuni024Duni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C8uni02C9uni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D6uni02D7uni02DEuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EEuni02F3 gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0343uni0358uni0361uni0374uni0375uni037Auni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0theta1Upsilon1uni03D3uni03D4phi1omega1uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0472uni0473uni0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni04A2uni04A3uni04A4uni04A5uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04BAuni04BBuni04C0uni04C1uni04C2uni04C3uni04C4uni04C7uni04C8uni04CBuni04CCuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni0510uni0511uni051Auni051Buni051Cuni051Duni0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0559uni055Auni055Buni055Cuni055Duni055Euni055Funi0561uni0562uni0563uni0564uni0565uni0566uni0567uni0568uni0569uni056Auni056Buni056Cuni056Duni056Euni056Funi0570uni0571uni0572uni0573uni0574uni0575uni0576uni0577uni0578uni0579uni057Auni057Buni057Cuni057Duni057Euni057Funi0580uni0581uni0582uni0583uni0584uni0585uni0586uni0587uni0589uni058Auni0E3Funi0E81uni0E82uni0E84uni0E87uni0E88uni0E8Auni0E8Duni0E94uni0E95uni0E96uni0E97uni0E99uni0E9Auni0E9Buni0E9Cuni0E9Duni0E9Euni0E9Funi0EA1uni0EA2uni0EA3uni0EA5uni0EA7uni0EAAuni0EABuni0EADuni0EAEuni0EAFuni0EB0uni0EB1uni0EB2uni0EB3uni0EB4uni0EB5uni0EB6uni0EB7uni0EB8uni0EB9uni0EBBuni0EBCuni0EC8uni0EC9uni0ECAuni0ECBuni0ECCuni0ECDuni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10F6uni10F7uni10F8uni10F9uni10FAuni10FBuni10FCuni1D02uni1D08uni1D09uni1D14uni1D16uni1D17uni1D1Duni1D1Euni1D1Funi1D2Cuni1D2Duni1D2Euni1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D62uni1D63uni1D64uni1D65uni1D77uni1D78uni1D7Buni1D85uni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Buni1E9Funi1EA0uni1EA1uni1EACuni1EADuni1EB0uni1EB1uni1EB6uni1EB7uni1EB8uni1EB9uni1EBCuni1EBDuni1EC6uni1EC7uni1ECAuni1ECBuni1ECCuni1ECDuni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE8uni1EE9uni1EEAuni1EEBuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni2010uni2011 figuredashuni2015uni2016 underscoredbl quotereverseduni201Funi2023uni202Funi2031minuteseconduni2034uni2035uni2036uni2037 exclamdbluni203Duni203Euni203Funi2045uni2046uni2047uni2048uni2049uni204Buni205Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni2095uni2096uni2097uni2098uni2099uni209Auni209Buni209Cuni20A0 colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9uni20AAdongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20B8uni20B9uni2102uni2105uni210Duni210Euni210Funi2115uni2116uni2117uni2119uni211Auni211Duni2124uni2126uni212Auni212B estimateduni2148uni2150uni2151onethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2189 arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21D6uni21D7uni21D8uni21D9uni21DAuni21DBuni21DCuni21DDuni21DEuni21DFuni21E0uni21E1uni21E2uni21E3uni21E4uni21E5uni21E6uni21E7uni21E8uni21E9uni21EAuni21EBuni21ECuni21EDuni21EEuni21EFuni21F0uni21F1uni21F2uni21F3uni21F4uni21F5uni21F6uni21F7uni21F8uni21F9uni21FAuni21FBuni21FCuni21FDuni21FEuni21FF universaluni2201 existentialuni2204emptysetgradientelement notelementuni220Asuchthatuni220Cuni220Duni220Euni2210uni2213uni2215 asteriskmathuni2218uni2219uni221Buni221C proportional orthogonalangleuni2223 logicaland logicalor intersectionunionuni222Cuni222D thereforeuni2235uni2236uni2237uni2238uni2239uni223Auni223Bsimilaruni223Duni2241uni2242uni2243uni2244 congruentuni2246uni2247uni2249uni224Auni224Buni224Cuni224Duni224Euni224Funi2250uni2251uni2252uni2253uni2254uni2255uni2256uni2257uni2258uni2259uni225Auni225Buni225Cuni225Duni225Euni225F equivalenceuni2262uni2263uni2266uni2267uni2268uni2269uni226Duni226Euni226Funi2270uni2271uni2272uni2273uni2274uni2275uni2276uni2277uni2278uni2279uni227Auni227Buni227Cuni227Duni227Euni227Funi2280uni2281 propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni2288uni2289uni228Auni228Buni228Duni228Euni228Funi2290uni2291uni2292uni2293uni2294 circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni229Euni229Funi22A0uni22A1uni22A2uni22A3uni22A4 perpendicularuni22B2uni22B3uni22B4uni22B5uni22B8uni22C2uni22C3uni22C4dotmathuni22C6uni22CDuni22CEuni22CFuni22D0uni22D1uni22DAuni22DBuni22DCuni22DDuni22DEuni22DFuni22E0uni22E1uni22E2uni22E3uni22E4uni22E5uni22E6uni22E7uni22E8uni22E9uni22EFuni2300uni2301houseuni2303uni2304uni2305uni2306uni2308uni2309uni230Auni230Buni230Cuni230Duni230Euni230F revlogicalnotuni2311uni2312uni2313uni2314uni2315uni2318uni2319uni231Cuni231Duni231Euni231F integraltp integralbtuni2325uni2326uni2327uni2328uni232Buni2335uni2336uni2337uni2338uni2339uni233Auni233Buni233Cuni233Duni233Euni233Funi2340uni2341uni2342uni2343uni2344uni2345uni2346uni2347uni2348uni2349uni234Auni234Buni234Cuni234Duni234Euni234Funi2350uni2351uni2352uni2353uni2354uni2355uni2356uni2357uni2358uni2359uni235Auni235Buni235Cuni235Duni235Euni235Funi2360uni2361uni2362uni2363uni2364uni2365uni2366uni2367uni2368uni2369uni236Auni236Buni236Cuni236Duni236Euni236Funi2370uni2371uni2372uni2373uni2374uni2375uni2376uni2377uni2378uni2379uni237Auni237Duni2380uni2381uni2382uni2383uni2388uni2389uni238Auni238Buni2395uni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23A7uni23A8uni23A9uni23AAuni23ABuni23ACuni23ADuni23AEuni23CEuni23CFuni2423SF100000uni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254Buni254Cuni254Duni254Euni254FSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000uni256Duni256Euni256Funi2570uni2571uni2572uni2573uni2574uni2575uni2576uni2577uni2578uni2579uni257Auni257Buni257Cuni257Duni257Euni257Fupblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxH22073uni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EEuni25EFuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2638uni2639 smileface invsmilefacesununi263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647spadeuni2661uni2662clubuni2664heartdiamonduni2667uni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi27C2uni27C5uni27C6uni27DCuni27E0uni27E6uni27E7uni27E8uni27E9uni27EAuni27EBuni27F5uni27F6uni27F7uni2987uni2988uni2997uni2998uni29EBuni29FAuni29FBuni2A00uni2A2Funi2A6Auni2A6Buni2B05uni2B06uni2B07uni2B08uni2B09uni2B0Auni2B0Buni2B0Cuni2B0Duni2B12uni2B13uni2B14uni2B15uni2B16uni2B17uni2B18uni2B19uni2B1Auni2C64uni2C6Duni2C6Euni2C6Funi2C70uni2C75uni2C76uni2C77uni2C79uni2C7Auni2C7Cuni2C7Duni2C7Euni2C7Funi2E18uni2E1Funi2E22uni2E23uni2E24uni2E25uni2E2EuniA708uniA709uniA70AuniA70BuniA70CuniA70DuniA70EuniA70FuniA710uniA711uniA712uniA713uniA714uniA715uniA716uniA71BuniA71CuniA71DuniA71EuniA71FuniA722uniA723uniA724uniA725uniA726uniA727uniA789uniA78AuniA78BuniA78CuniA78DuniA78EuniA790uniA791uniA7AAuniA7F8uniA7F9uniF6C5uniFFF9uniFFFAuniFFFBuniFFFCuniFFFDu1D55A dlLtcaronDieresisAcuteTildec6462Grave CircumflexCaron fractionslash uni0311.case uni0306.case uni0307.case uni030B.case uni030F.case thinquestion uni0304.caseunderbar underbar.wideunderbar.smalljotdiaeresis.symbolsEng.altexclamdown.casequestiondown.case uni2E18.case@tGG22dk  Y&Y@&~2}|{zG{{@zyAzGyAxw2xkw2vutsrqp%olkj j iihghhgg@fed:d}cbcbaba`;`2_^_^];]d\ [Z[ZY]ZZYX%Y]Y@X%WV;V}U:U2T;T'SRSdRQPdOSM;M2L:L2KJ;JdIHGF F F@ED.ED@.CBABA@]AA@=%@]@@?k>=%>=%<;4K7 7   @6 2   2X}Xd++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++snek-1.1/doc/fonts/DejaVuSansMono-Oblique.ttf000066400000000000000000007531201353657467200212140ustar00rootroot00000000000000 FFTMo9,GDEF1\&HDGPOSr.GSUBed`OS/2Vcmapcvt &fpgmgasp@ glyf4Lhead 6hhea B/ $hmtxF"? @$locaF"d*DJPV\bhntzt|w|w|w|wt`~~`~` DFLTcyrl&lao 8latnBSRB F CAT PESP PGAL PISM XKSM XLSM XMOL bNSM XROM bSKS XSSM Xcasedlig locl&locl, " $(@g ~  oO nLI  c A363Ef   Ry PfEd m`, , ~!AEM?CXauz~_csV_? .[ex{-McyEMWY[]} # & 7 : ? I K _ q !!!!!!!"!$!&!+!.!H!Q!_!""" "#"-"="i""""""""####!#(#+#z#}#####$#&&<&G&g&o''''''))))**/*k+ +,d,p,w,z,...%..' !$CLPCXatz~br1Ya?,0bw{0Th| HPY[]_  & / 9 < E K _ p t !!! !!!!"!$!&!*!.!H!P!S!!"""#"'"4"A"m"""""""#####%#+#5#}#####$#%&8&?&`&i''''''))))**/*j++,d,m,u,y,|...".."nfTPMHGFED64& ~xge\GF{kihec ~vqa`^\YWNLJF=8FD/,'/!ߵ)#!c@c!"?"""" "#"#"'"-"4"="A"i"m" ""(""A""E""F""K""P""`##a##h##v##!x#%#(~#+#+#5#z#}#}##########$#$#%&&8&< &?&G &`&g &i&o '' '' '' '' '' '' )) )) )) )) ** */*/ *j*k ++ !++ *,d,d 3,m,p 4,u,w 8,y,z ;,|, =.. A.. B.".% C.... G H W"' \ b h j k m n pZZ u   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpk(vjsgwl|cnTm}b : n oydvqrstzwue##X!#/{{RfoZ!7={fs +bb#3N{T\q#w!`j#fy```{w`{{RNNfffHF?{L'5oojo{-{{=foD7f}s, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-hh@ O/10!%!!hsr)s` Y@.   :TSQ 991/0KSX9Y"3 #3#ʁX2s2qeR@UQ1<20###Ѯ++P@5 X X    91/<2<<22<<220#3 33!!!!###!7!!7! Siih'T'hhii'T'haabbN; 0l@@()%/0%W$ZXWZX!0 !()/ %$, 19991/29999902654&'#.'7.54$?3.'+uV^PwTe;__#QhZ 0d/UH AYQ LEtNUcEJ-.+73#'#"&547.54632.#"326773>J zk{;_hǼA|9#*zLq,_AGB͋fqGG֯!g4l7&&s^/Iuw96Q10#+u @hg   99910 #&5;32267654&#"P77ON87PsTTߔürUUݓþP/E]bkP0F\g7PP78NOEEg`f__{ T@* :ccQc   99991/20KSX2Y"7!7%3!!9#`5!ɪuLJժf\@99991@ q cac/29990@9%!!7754&#"7>32  n!7'r\~)paGR!#]jCD12›`g*N(J@+c W q cW qc#ae) )  & )99190!"&'732654&+732654&#"7>32rl^&[b {Rq%{Tس~%%45uy|d_((!? s@>      : cQ     991/<290KSXY" !33##!7JٜFE$3dT j@8  : cWbccQe!   !999190KSX9Y"!!>32#"&'732654&#"`!H/Y,i`XlH)T^OKժ|VPP!32ꮀ(&\h *;@ ccr W bc(ae+ "+9104&#"32.#">32#"&5476$32\tkzk $:K7DqPDNzNDb1KRqzy '%'fiǸwSa`צf5@:cQ91/0KSXY"!#! <^+)f #/?@" c* c$cae*t0 '-!09919904&#"326.5432#"&546"32654&5vpykl(ֲ ~uf{xtŚi~&i)̳`|cr}[l?L *3@cr c( ca(e+"+91032654&#"732#"&5467>32#"&Jtkxk#:K7DqPCNzNDbKqzzٺ%'fiȹvS`a֦X#%O@):nun91/0KSXY"3#3#'?>54&#"7>323#`MqkUGpcOi$meaiT<1[^[Ho8JRGB98~^lVFfVu @o@5.1*@ xx -*x1!x1:A@= -. ='=4A9991999990@ ]2654&#"#7#"&54327>54&#"3267# 476$32}eX{c3QT_TX9xC-BS|n& Ә`nїap}o?D9H=+#4~}՝{=ѰM/ v@B      :cyQ    91/<90KSXY" !3#!##-+{ u@@       :c cQc z   !9991/90KSX99Y"32654&# 32654&#%!2)mkÈ{Xo}bи}<ݮkff>^T|s2@|{c|{c ae  99910%#"5476$32.#"3267T[rkPK)@P_GhUX5)) |*(?>QS{@=j P@(   : c Qc   99991/0KSX99Y"%267654&+ )DD6ErgTGh#}s?w/5 X@0    :ccQcz   991/0KSXY"!!!!!!Xu!TV rh!wժF\ S@,    :ccQz  991/0KSXY"!!!!#o!\Vd ժH7N)a@3&))#$"%):%&"&c("c|{cae*('&%)*9991990KSX9Y"%#"5467>76$32.#"3267#7!Wu! #^8kPM)AQbD,N"#Dl%L`>? ZouC|*(?>SQ4arQ%# {@B     :czQ   9991/<20KSXY"3!3#!#v)vʋՉd+99 ?@"  : cQc   91/220KSXY"!!!!7!!Z>!:!!9ժNU@.  : {cc Qe  991990KSX9Y"'73267!7!#"&-Hg(!H8a=OSD.J j@;      :}   991/<290KSXY"33 ##ApyN 8@:cQ9991/0KSXY"3!!q!eժ  @D     : }   99991/<290KSXY"]@&  ]]!!# ## nݺNs +/ @<  :}  9991/<2990KSXY"]@  )]!3!#3+3R)!@c c'ae**10%267654&#"#"&47>7>32U/J\inU/L\i-+C'Xڑ++C'XڑÇf_f_hun\;yo\;y3h@6    :cc Q   99991/0KSX999Y"32654&#%!2!##m|mu/ϿlgR-3@c%c ae.+"+.991990#"&47>7>32267654&#" ++C'Xڑ@%6OU/J\inU/L\io\;ySotC_!\f_f_h @R       :c c Q      9999991/<9990KSX999Y"#.+#!232654&#HW6yj,mn{!)fۣ~jhybճWpi{'@:    : |qc|qc%ae(  "(9999190KSX99Y"8]@<'''))))777  (((%%%%88VVVV]].#"!"&'732654&/.54!2{'Q]byhd)bpXeJ P;<GX('2--EBRZ)!:y(5@@:cQ99991/20KSXY"!!#!t!++ժ+P~@K   : ceQ991290KSX99Y"33267>73#"&546s˳mnY|--˲*_NGj=h ;\\9>h?8;%~+J@':}91/290KSXY"%3!3V1ƾ+R` @J        : }    91/<<90KSXY" ]@\  ;u      )%& 86736 FFCE ZVTU kfch e zvvy u   %]]333##ZIyF +f9 ~@H      : }    91/<290KSXY"33 ##D1dDf@5:} 9991/290KSXY"33#σub 9@:cQc   91/0KSXY"!!!7!1-" )՚oG@":~~g9910KSXY"!#3!mVdB0@:Q910KSXY"#3ժǪC@ :~~g9910KSXY" !73#7X+ޏH@ Q91290 # #Ȳu-m/10!5/mPPPf2@ 910K TKT[X@878Y#ŏfxH?{ .@a! "   : %  &W%")e,% &,/99991/99990KSX99999Y"']@65$0%0&5'  ' ]]"326?#7#"&54$!37>54&#"7>32wt+DRgX&} Hn5 ~uVo#lY 3{IScԹ)L^e= U[33'' h;T%@L$#  $#"$# !#$#$#%$$#:! e$""#%!#$ $#&999991/990KSX9999Y"%267>54&#">32#"&'#3T.19eeS30:k>fRHL|b"/ZV^l\XVo{RTVϺlsVTq{4@WZWZ e   99910%#"&547>32.#"3267IZk[]߅YO%BUn<8?`S3')ܕbcb++:6YYRh>?w%@L  $%#: # e# &999991/990KSX9999Y""3267>54&3#7#"&547>32X.16feU018msѸAdPEK|aWWZsZXWrxCTVҼ!lvxWbf} &\@" W&Y#  e'  &  '999910@h hooooo ooooo ]]>54&#"#"&547>32!3267t{,uigxjSm Xr#x++֜,mVZ"eN 498j@9     :       999991/22990KSXY"#"!!#!7!7>3_`)&Sec/яN;Hy{.@[ ... ..-.)*+(,..: , W  ) -/-,. .#/999199990KSX99999Y"%267>54&#"#"&'7326?#"&547>3273O.17pdr5RK%IP%:nPHJoe"ZTZjwwI,.uW[׸jp|aUTH@R    :   99991/<990KSX999Y"#67654&#"#3>323]W!{/tKb J G'QWab ^= h@7   :      99991/20KSXY"!!!7!!3#f׾mnm-`/BCV r@@  :     91990KSX9Y"!7!+73263#)ʵ_nJ-wZ {@:!!     :   991/<90KSXY"w]v}p]]33 ##%uͨXZFF?7]@/:    99999991/990KSX9Y";#"&5467!7!XY[ϭ #6IHP.{+@e    $%"%#""%:!  &$ )$" $"%  &!"% # %" ,.999999999991/<<<299990KSX99Y"K TX,,,@878Y>32#>54&#"#>54&#"#3>32'}MVg}.3KT+}}/1JQ-}٨,o@K\DIm\6kw\u?8aq=:w``323]W!{۸ Kb J G'QW`ab ^uZ{ !@ e  10"324&'2#"&547>ppp_RJO⓻RKOVΊmvvˇqtxVh{%@N%$#" ! :e&&# &.99991990KSX9999Y"%#3>32#"&7267>54&#"%o-=dOFKzdQ-18gfU018p RXлnvzTHYU\qZXXr{bV{{%s@=  : e&# &999991990KSX99Y"%#"&547>3273#"3267>54&=fRHKтd#ոU.19efR20:kTVϻ"pvxUUXV^l[WUp{{h@7       : c    991/990KSX99Y".#"#3>32-wL&kٸ(CՇGs(y,,`x~%#s5{)@;  !    ! : !WZWZ'e* ! $*9999190KSX99Y"]@`++''99IIDDYYYY)iiii)yyytty)) ' ' //55GGv]].#"#"&'732654'&/.54$325#GMHutQc%^S CyX9-/f\b8{\##55w\c4!g!dp@@  :   9991/<2990KSX9Y"!!;#"&5467!7!=^wNfߧ w+>3B5ovD/`>}m`@Q     :  e   99991/2990KSX999Y"332673#7#"&546]U!{ڸ!Ii J%DOUyba~']`J@'!!!!:91/290KSXY"33#`D\#` @J      !!! ! :     91/<<90KSXY" ]@f   * J       *$ :4 GCD ZZ T kfh c yxy u   !]]333##\ 1j<צ`wBo` ~@H!! ! !  !  !!!:    91/<290KSXY" ## 3>_4q`DT uV`~@F!  !!!!!:     99129990KSX9Y"+7326?33>g6:`lQu<+ٷhkILJ]qTN^Nm` 7@!!:  91/0KSXY"!!!7!?.!u!`ۓ%4@)(54.  $-59991@: 5'- )'.)~)~'~g599999990KSX@* -.-..-    9999Y#";#"&546?67654&+7326?>7>3N^3!xoIP/VaNH- bq>=~2H6/OgK@&!3?9m{D% 2-UKn{'"10#4@e -.-..-    :-5)  )'.)~'~)~g54.  5)('*(5.99199999990KSX9999Y"7326?>7.546?>54&+732;#"#N^3!xpJP/UbMJ- bp>= /H6/OfLA&"3@9l{ D% 1-VJn|'"Xy &@ ll 1<2990#"'&'.#"5>32326yKOZq Mg3OINS5dJ t]F ;73 !;?<6 7=s` a@1 :SQ  999910KSX9Y"#73#3B1ˁX1b+e{?$V@3WY WY  e %  "" %912<990.'>7#.547>73? 1{HAK!K?7f7̢FV8f7<}u5&,-(!úD`16"+`႙@F  :  Wqa c  9991/2<2990KSX9Y".#"!!!!73#737$32%6y?&+rZ 3!Z/3<+-ُ/яLB /}@B (-  * -'! ) -0)$ !'$* EFE( $02299999999912299999999904&#"3267'#"&''7.5467'7>32d|[Z}}Z[|Z^.[20`0\^.[3.^Z{{Z\}~t]1]02[-^Z3].2]-_/@]  :    Q    9991/2<2<290KSXY"!#!7!7'!73333!! wbbs7ln   o#o1ho#@ <210##  d7-4Bv@E$%B<;5& %, XX2aC$%5 "<%&,/B;"%/"%8%/?%)C9999919990.#"#"&'732654/.5467.54632>54&/-!G:gV|Ur))FS!J=p J}Pv)%GTXkPRVU~&(bHOZ ;VuEe5#Z7$'^Nb| 3UoI`?%P53o75p^34p73`SF-n@99991<20@@@@@PPPP]K TX@878YK TX@878Y3#%3#''}N1ID@'  &>>2J- /,(8 (8*D/210.#"3267#"&54632'"3267>54&'.'2#"&'.5467>`:o:u8g24r=г=rjKKMMKLijLLKLKKkZZ\[[[~}[[[\ZZ/lhȬJKKjhKLLLLLijKKJgZZ[~}[[[[[[}~[ZZ  +/o@?  .,#", &a0 .- )/,0 #"6)6099999919990"326?#7#"&546;47654&#"7>32!!ٔI"3267>54&'.XXP:&rk1=-7ffZJJDZZ\[[[~}[[[\ZZ~jKKMMKLijLLKLKKLbeG]C;P*T6?>5VZZ[~}[[[[[[}~[ZZgJKKjhKLLLLLijKKJb+@ 9910!!V+u @ a#$# 102#"&546"32654&hAu,-/OomOPqp1.-rBoPPlnNOpXy.@ l l   <2<21/<<07!!!!#!5!X!dCDLI3j@5:  aK999999199990KSX99Y"!!?$54&#"7>32!9J?3zST}5vrni3=%)o^(H@*  #a)   KK& )99190#"&'732654&+732654&#"7>32HNЯB;Ch2pUYHHavVV*e<Gz7yr\ [Gy\NC@jP@33sd[Ot?ff/10K TKT[X@878Y3#ufV`&@\   &#$"% :%   c"e '&'  %'99912<99999990KSX999Y"3326733267#"&5#"&''-mf! (J!CO5b\| mV H6[a  UIRLSS};u g@0  :Q  99991290KSX9Y"!###.54/эZfN/`/@:n910KSXY"3#;`us\ X@. JJ:  `     99120KSX2Y"3?33!qu c)t'+n)!7@  a"  !"6 6"999910"&5467>3232654&#"!!yA8=Z@7=cWjcWk\WCJNXBJNTixؗix{RZ# 3@  u   CC991<2990?777R+^#T+^# ^R^ ^R/m{'V'{ }/y{'{& }tV/m'V'u }p`!@J !!!:S WY c "  ! ! "99919990KSX9Y"33267#"&546?>7#73PojUGodOj%lebhT=1Ϛ]]YHo8JRGB98~^lVFfVk&$ z3uEk&$ x3u3m&$ {3u^&$ y3uLN&$ w3um !@Q   !! !!  !:  c  [ y   " ""!"99991/<9990KSXY"4&#"326!.54632#!#Y?@WW@?Y33srPF#Z?YWA?XX`#kErrQ {o@P   :c ccQcz  91/<20KSXY"!!!!!!#!!V3!jd!K\5ժFժsu&&d5k&( z`u5k&( x`u5m&( {`u5N&( w`u9k&, z9u9k&, x9u9m&, {9u9N&, w9ujk@;  : cQc    99991/220KSXY"%267654&+!! )#73DD6Er[ kgTGhщ{}s?+/ŕ{^&1 y/uRk&2 z+uRk&2 x+uRm&2 {+uR^&2 y+uRN&2 w+u;T .@     <91<290 7   ^t^_t\t%\^u^uw^ 8o@;)9$863 '$*73(c$c3a$e9)9(*-7  '-6 8 -999999999199999990%3267654&' .#"#"&''7.547>327B^Bp=26yf[8q<2:$iSXQ6^cwhTXM6Td,2'{#)u'+l <[Z..@:V++}@Pk&8 z7uPk&8 x7uPm&8 {7uPN&8 w7uDk&< x9u3 @I   :c cQ   999991/0KSX9999Y"#32! 32654&#FH#3`i|m縘gb7f5@[#$# $$#45512035:3*$ #0W0e445$'# 35'*-  '' '-56999999991/990KSX999Y">32#"&'732654&/.5467>54&#"#*˰ )<3sQGA;G6U=Z8˲h\yۻqϠ!F$`&=,'UW !}l4R?/D\?$OYH?f&DCHjf&DvH?f&DdHZ7&DvH?&DjH?N&Dt{ OP@'O'OO'  ';:987<6'5':+ $!F@6?$O4%W$!(@W?<IC.(ePOL?965F$%+4@L'1P999999912<2<29999990KSX9999Y"@`>#>$>%0?0@Z#Z$Z%Z&ooollloooooj#j$j%j2o3o4o5oNoO{#{${%{&#$%&%9#9$9%2?2@I#I$I%I&j3 ]]7#"3267>54&#"!3267#"&'#"&546;7>54&#"7>32>321}i##N;Ze=D;SjaUF5";Hj/]uUM1L#O8Rv2PyH'!b3C'\uq{&Fhbff&HCbff&Hvbff&Hdbf&Hj=f&C=If&v=f&d=&jwj!0@L:! %%+ e1( .(!. ( 19999199990KSX9Y"#"&5467>32.''%'3%.#"324&f{qKFMLGL0 5)h%P,sh/֗htx~io{&V:^\VȑX\ xA@eTV7&QvuZf&RCuff&RvuZf&RduZ7&RvuZ&RjXyo '@l D <<103#3#!!j!/ '1m@:'2"1( +%&""+"e2'2& 1(.%.  . 299999999199999990 324&.547>327#"&''.#"N4PKQߓNx.p]{ RJOJ{3w\%I49W.`0Pnwu$$M2Tmvv%%L'}mf&XC}mf&Xv}mf&Xd}m&XjVf&\vVh%@M%$#" ! :e&& &.9991990KSX9999Y"%#3>32#"&7267>54&#"%or=dOFKzdQ-18gfU018pRXлnvzTHYU\qZXXr{V&\ji0&$ H?&Dm&$ HJH&Du.'u$Hu?{'unDsk&& xuf&FvZsm' {u&qf&dZFsP&& Kq&FKsm&& |uf&FeZjm&' |*uwg v9Q?}Gjw-@|  "! #+,-+,-*: + "e+ %.999991/<2990KSX99999Y""3267>54&!7!733##7#"&547>32X.16feU018m>IAdPEK|aWWZsZXWrx5yyTVҼ!lvxW50&( bf&H#5m&( bfH&H5P&( bf&H5u'uh(buf}'uH5m&( |ubf&He7Nm' {9u*;Hyf&dJNm&* 2;HyH&JNP&* 2;Hy&JN'*;HyN'Q.Jm' {Ku+THm' {,uK43!733##!##73!7+*++ ʊ֊׆ ,*,9Q,##654'&#"##7373!!67632 (p~ZX!{} }a >C^^r>%JA1B)G[Xzz`21qBiK9^' y9u,=97&v90&, =+&9m&, =JH&]u&,$ulAu&Lup9P&, =` C@":   991/20KSXY"!!!7!!f׾mnm`/B%73267#7!#"&!#3!73#w)+tD]d%}4@fC >OSD.êS !!!7!!3#!7!+73263#-׾mnm-)ʵ_nJ-a/BCwm' {u-Vf&dJ&h.Z'N` 33 ##Y[>vҢW`/ZFB?NIl' x7v/7Im' x7wON &l/7'ONR' vn/7 ' v)ONb'yc/79'y;O e@8    : Qc     .99991/90KSXY"3%!!'%sr)Iqq dqJdϨ3hdXZ@K:   99991/990KSX9Y";#"&5467'!7!%XY[ϭ ;Jss;JX%6IH#O(c$)br' xI|1T_m&vQ&(1TH{&QQm&1 |uT~f&Qe0'^IQ{(V+7327676&#"#3>32&nnZ98#T|'#'L~3ij>>Wot}Vn{$+73267654'&#"#367632\&moZr 'qXW!{ڸ!D]^s>%6ij|~A2B)G[\``21qBjJR0&2 uZ&RRm&2 uZH&RRk&2 uf&R#H"b@7!"!"!"!""!:c c Q c"!    #91/220KSXY"%!"&5476$3!!!! ";P!B5VR!WH!k!v/1}{>᪪ђlêFlm7~j=xz{,8P@\-'@?6758'@@?  '@? '?@?:8/-59 - E5- W 5*eQB8/.- N N2'N'!Q9999912<99999990KSX99Y"o.]@oo o o jjo-i/o8 ]>32!3267#"&'#"&5467>7>32!7>54&#"267>7>54&#":Pz aUF6#;G_":Q;'8uP|4IB=Sk7<`(HCA_(J?@+TZ[nNX:2)+E@AD6NyGfkDVL8GNGB,jl MTEF5`V$QW l' x7v56m'vU &}53{&U m&5 |Buf&UeZ{r' xI|6s_m&vV{m' {ou6sJ&dEVu{&6su5{&V{m&6 |9usNf&Veu5&7ud&Wy5m&7 |`u&W vW*3!!!!#!7!!s!-p !pp! p+ժA@V!!!3#;#"'&54?#737!7!>^-- &uE+--+>1%91S5e:J>P^' y7u8}m7&vXP0&8 }m&XPm&8 }mH&XPm&8t}m&XtyPk&8 }f&XPe&8u}sm`&XuR`t&: {J|\#m&dZDt&< {R|Vm&d\DN&< w9ur' xI|=Nmm&v]P&= 2Nm&]m&= |9uNmf&]e!#!7!7>;#"-)&_`яNSe;T/>32#"&'##7373!!267>54&#">f))HMmm|b" Q 0T.19eeS30:kTVϺms@?VTzzZV^l\XVo{T!*32676H#!"#7>332676&#Wt|0"}'5E8 #~2j/>orqp ˘//&r1F݇G,L>32#"&'#!!&#"32=DEdgh=in !&#"32>32#"'&'#'S^[Y*)/0;fUV56dDCYmnnnRRX랝+,S|170732#"7>3 !"&)=X<5F=@@=C!%# !2676;".#"3267DSRkbF@)JoZ98<])(`M9++8(8rGj>>~A:;>jH3 !#"#7> 6&!#VJKv6E8 #a@@//&r1FHKwd#";7!! &7676%3器~' F(H}Xɉ{+ˡdv 32676&#"7!#7#"32aS]))_Y$Ҹ>dˬ65%fDFLT}SW;7,,R=p{ 6%2676&#"#"/732376?676'&'&'&'&32=*)e)*f!2f0"=DHH JD,  %i\^78088'L (=\ $+/! -&3 !7!!7!!7w!ir!VT!+t\7!'&#"7>32 !3276u,#(VV)U[LLK'!(_PS{@=))yz~#vuH(.76$32.#";#"3267#"&7>|i#0Is$`Y bp'ng("{ (({smz45$&ΕVM!!!!+7327677"U !%noZ98ժH#ij>>~GV$+"!!+732767!7!767676;b..)deF1i/0(#i,AJb)(gc``01N\''@g(%# !2676;".#"3267#7!`vHG^QoT?6B_;=Ck0N {KMonj>5MI!GRcI ! 7 3 3327P1ch8=?un+J&#767673#"'&76&#"#36763288C=PP-Ú77*8CBH"{.vhUUum14IBe``  19!7!!;#"'&7r!=!ǯ !Z ٪HE'+z=>jf7!!3!!#!!7!!7!!Z=!p !O9!!9O!pժi@676'&0##3lT%-WEq"ˁ r3r%BshT7676;#"33 ##&nnZ98`=wҢWij>>~ZFB?;#"&?#73!7!;+6BY饌&&ߠ  |~ĎɎd% ##''3:\.Ze:dn@Jo |%"%#"&33267332673#7#"&0wJF8Ǩ.FPS-Ũ/#JIQ-ŧާ,p?LWrHE! s{ p{+`>~}R]{#6&#"#3>32\ڹOq"{ڸ!Ds~d``ct\  32'&#"32767\LLLB,#(_S;#'!(_P:z~{{vu&2 {&R*6%63273# &#"327-_8>Pݯӱ90!@@CXY+͠v~^}R4{ %63273##"'&7327&#"}UWeRްeI:MV~,`/s%+n+͝u"mmBx +#"#7>3! 27676&+D[m^t6E8 #~'^!]mM//&r1FE8D V_*3267'"#"67232#"&'#76;#"I"*Q b@{˪65fo:DN5/2FIWS.OZ"#.+#3323 654'&#JX3{h.icG"4nPcEg3->nhy]oQك^Y% P0EI'>323267#"&7>?>76&#"hqV'qhہ*ti)$o^g''Ƞ/ vp{DI--յ1#hcq<;3{'>323267#"&7>?>76&#"sWZʸHszTq%pS Mjl}SX9!!1Yc55##}#JKSQ.. V>!6'&#"3;#"'&7# 76!23 n| wZdAE#)*/@)-0A3=g)(V\`@oV !!;+73276?#"&7!7!>^wKu&nnZ98(ϊ'w+>|bij>>~`>o4&#7>3!!#6R8 #!-/7&r1F+j!!;#"&7!7!7676;#"^wKuϊ'w*&nnZ98`|b`ij>>~V5;#"'&47!7!!0ߥE-+!s!- ujDE?78'8vq'Xd|M##"67#7! 76'7"a6$==$""+-4-+Fj"n8!L ILX(!"'&733276'3hHE& !Z-+Fia6%> ILɸC #367632'&#"u2-P?b("8t*b7m*9 VZ`+7326?3676'&xSU|lLbN1ôJY]j,QN$h:=HTN~)+) =  !3!#!!7#7!!C!P"! e!"՚i@Xyb!!!#!!7!7!!K-!8Z! dbҖg 7676'&+7!7!2! $7UU{rsNO!! 2ivZA=++KKKKIJG8+lh3! $76767637!!#" 76++fjki !!kjUU{rs݊hl+8GJIKKKKLn` 7!!#"3267# &767676Aj9e@zy38GFmgLxkj^V5zrܨ JKKK21%݊hm*8VC`'2767# 5476%$7654#!!7! TQSZ#^RYaQ.$Sej!NG6&, 5%b f8d1a w[ 6323#!!7!7!67676'&#"$$?1SP!Ex!u!!/" $4Dc``JU?T<>< % 7676'&#!!!!2! &735 66 W^#$!zFrO_}nw~FVrAV{#3676327654'&+";-!DZҸ7% S0 *vBz FN1pJ[05W2(E(Ar_3#+)'6vp3!!!!#!7!7!7!O_!._!dd!_.!_ls`nm&$ |9uHlf&De9m&, |\u=Nf&eRm&2 |\uuf&Re2Pm&8 |Nu}mf&XeP' w2'gH8}m2&q%<P' x`' w28}&H<P&8' w2 |h}&T<P' w2' zn8}m&B<pW{Hx2&qM<s'gH&$ Hx2'qM<o0& &Nm' |9u*;Hyf&eJJm' |9u.Zm' |9uNRe&2uueZ{&RuRe0& ueZ&m' |9uyLf&e5Nk' x9u*;Hyf&vJ%2763#"'&7!#3!36)44:>HH8hEՊ#w+w57Of'MSb9du'k&1 zFuTHf&QCo<k' x*uf&vk' x+u/f&v'k&$ H?f&DWm&$ ~H?H&D5k&( bff&H5m&( ~bfH&H9k&, =f&9m&, ~=H&Rk&2 uZf&RRm&2 ~uZH&R k&5 f&U m&5 ~H&UPk&8 }mf&XPm&8 ~}mH&X{&6s5{&6V5&7d'W"R+276$>54.7%>54.#"7$32+..;.9!)Fd2";͈:_$m`0*GL*(Ϋ/\KJ99&(?SP,Fu3~}=Uc 6Hj+v~}<2I%RO{3 7,54&#"?>54.#"7$32p/M1! ]P;E%AE(D!&c_'!5!:3%3?=a.pFTVU@l)=;Z:tO#C8;+2)!m' |Ku+THm' |uKlN(1%7276"'676#"'#7&/'&'&3232676&"C{!h+>65PjqSBԚ))DԐ>>t#O9 Y%Z5H7WSCT4V6!!3+73276?!7!m"%noZ98՚o*ij>>~Vb!!#+73276?!7!y- %nnZ98|! bܖij>>~%P&$ H?&D5u&(2buf}&H2R'gH' w22uZ2&q%<R'gH' y2uZ2&q(<RP&2 uZ&RR'gH&2 uZ2&q%<D0&< V&\*l%7276"#7&'&7!7!676#"jC{!-wi $h+=F>O9aJwt# l?{.%7276"'676"'#7&'&?6&#"#3>32Cz" g$>r.O9aJs{``>^>>t#O9aJ;>V` !7!+7326)ʵ_nwB@12676&"&#"32>32 #"&'#7#"323T(~*))(S'PP~))(PPN+n=yO56z32 #"&'#T(~*))S'PP~))(PPN+n=yO56zZBC {J8FFJ!@w@) '&#"# /'&!27&'3267COV<eU[wZ.3G[M74YV EXU$ ~)) F/ndJI ~' @=( &#"# /'&7!27&'3267wJ9H)OSRtM *$6aQI&%uNh G`M7S]++ L8 rMq;>L 3!!!!!7!ˑ!O!dp! iAY #!7!7##'6{-!;V2J\Z[|BJ8jF`{5.#"3#"'&/&/7632676/&'&7>32`#FS}NGo!x{z#L'Tf@G)^.%{hA>zB:: Z9..QSKJ#}^R ~$=&[5#`cY1!GJ!b!;#"'&/&#?!- .{#L4[Tf@G1Z b ~$=&[?%x"#7>3!2##326&#6E8 #~'*+uʕʌ4//&r1F '32654&#%!2)#7332654&+3Xo}bи}^T|nȮkfƕ67#733!33# &73276!P}!}ˑː!+_Jj۬V,3"={;ww@  #!#+ 32654&##.+##73!2#f~PHW6yj,mnv{z чV/pijhybwv{& !!##733>32Z+" XX b(CՋRyXЙ<Ĥx~Hoe{ )32676&#"3>32+3267#"&'.=dl%| Nƀ%o^e$mX-+qpepӺ)Ld_y64''RR2{73#7#"32 676& ٸ>dˬ65&eT^ ))`ыSW;7WT04{%#3>32#"&&  ٸ>dˬ65e(T^))` \SWW '&#"3267632#"&'#7676;#"!S^*)_<U{>3 !"&'732676&#"RRkQE%=])(`M%++*,A:;>lw,%3276#"67&'&76!2&'&#"63 !"8K e 2&u45UNME!FJJPyyPMv+/#R9K9DhT#3 #+qrfrVs$2676&"3;#"'&?#"32tSB՚)*EBpH833&5EEP56 QkTC~>>jiáS,+;7WQ$2676&"%7676;#"#7#"32:SB՚*)EF&[]8H0/߷5P55 PkT ij>>~SW;7WSCW{632!"&'7326?!706&#"1/45[a$bX#]^"++98ȷpW{7!76&#"7>3 #"73267q#Xx$q[54ֿp/Z89++"Ţ{ 4%676732#"'&7&'&7>3273;#"'&7i&  ,g6G3  'ROQT"SQY P!10-'֊>8E#Z`vg'#d4*,#)u10`Z{h{0&'&76$32&'&#";#"32767#"'&7>r53QXZd cTTL @?PPc_^T"f]^Vyx _A@^  VJ=+,nQb54"[\mBA{2#"&'7327676'&+7327676'&#"767632<< U["EXWdeeKIQP ACKYYm n]_PNM_JJm\["45bQ77,+=J++  ^@A{B#"&'7327676'&+7327676'&#"76763273;#"'&7'^)* zy?B"2AAKNO54qv|f>? /0h8DCS!SGGÊO 0/,'=_JJm\["45bQ77,+=J++  OAf10`ZȢAWy+ 27676'&+7327>'&%672#'&RWSvAM1&F3/]TSg]OuvJBN^B6@JN67=6s-VWggVW>XVy`!+73267!7!!7!y \%ݥZr\ Fbh(Ӝ}}ؤiJH&07676;#"#"&'7326?#"63"326Y&\]19)(1>>#Fy6y"6X3. SmPIng\"ij>>~.,}^\::bH\ &0"326#"&'7326?#"67630!RPd1LN$YC">mĭ3,9b.,}^\:㣝y!%#7!#"76!2&'&#"32b7AgN[R55>dep!ijSGyyOMM">KMrqfqrkR` 7 333276>-X.@uq|2232#6&#"#7676;#"Ds},Oq"{&moZ98 `cJij>>~NV.->32+73276?6&#"#7676;#"Cs},n&nnZ98nNq!{&nnZ98 `cʀij>>~6ij>>~3#!!!!!7!!7!!.bb <mnm< Fˏ5i`!#"'&70!7!;ͥFE'o׊BZjf;6~|2` !!!!7!! mnm`By&;#"&?&#"7>32!7!3267#"'I%;7-";#"&?67# 7632!7!3#'6#"3`CY饌&%=&06%Kߘ6M \|~¾󠠄K9YVz;#"'&7!7! BYLG'|~jdL.;#"&7#7!!2#"'&'7327676'&+7!0Gg%W![T\G/-+LKMM&9W_^;32 +73276?#6&#"#6&#"#3>320vJF8e%ffR54}.FPS,}}.#JIQ,}ڧ-o?LWHEjj>>~s{p{``32;#"'&]pSS {ٵ!EX?>-?4),OO__^edwxH10`` { !3!#.ү{yyH{  #"%"!6'&!3276ҽ8888]R*7,3 $3]C{-m__mOmmOE`!!!!!"'&763#";_9pFbb65oo**EE`ݛlklm0{73276?332767676'&#"#"&7#"'&76769% 2"9$#u#$ 09*&%P; -nMO/Mo',2) `pB?UO++OU=]pxeY􎃃BcW}!*3#7;#3+737&'&76767676'&1I^78v//L^87{J9]*)2eU>^)*3"ouu{{BnmBHImnI `7327673#7#"'&'##,gg%sڹ"Nfg efNf21J 7327673#7#"'&'"#,di$ŹԹ"Ngf eif21gV`#7327673;#"'&?#7#"'&'"$,fh%si1F>?)"Ngf efN 10``f21VG{&'&#"#367632#"#,gh%Ź,"Ngf ef f21VG{#&'&#"#;#"'&?3367632###,gg%si>@*"Nfg ee10``֔f210{676;#"!!7!))eej0-rmnib`020{!!7!6'&+732tinotkѴ??V00`b `!#&'&+#!2327676'&#4**#rj)44a\\\ FBwHH77w 66^q$%'`PQi++ST** `!#!3327673327676'&+eT z||ڹ\aBBUG>@wGI86wSiQP`'%$q^667**TS++rVf{=.#"#"/;#"'&?327676'&/&'&76$32f"FZLM **=f?((**T@%$!*ML[[ 10``=Wg5-,QK((%$JK)V676;#"+73276_xr#hbîc-/*ceF1i0/pR[V((h)``01V!+73267!7!!7!7>;#">\&ܥZr\ F=$˳c]uh(Ӝ}}ؤiNQgcVoe;#"'&76'&+732i1F@?+cAJ(10`a(h((VaYV!#"327673## 76!3676;#"w |n*'Be*)#ibîd-/3A0Ǜo@`\V()gG`!7!6&+732!! >^vKuω'v+>>`|b@W!!;#"&7!7!~>^Kuω'+>|b >`!733!33##7#"&?)32763 bb:bb X"Wcau-./|i^Ĥrq,HKEioabdo?ܤdqnܑkmhq` !+"'&7#7!?27676'&'&B^"!.F??*oSg4kk/8QDdqn``;612abdw7,`!##3è}T`U` !###33Uŭtjj`j >;#"##u|lLbM2ózHTl}33#ff}8 ~V`!!;#"'&?!7!k \  ;5*+)! `ۧ10``%D`!#67!7!7!332!703276#H !Pej!t.$  FY3<;4% 6[L` 2!"'&'7327676'&+7!7!{juZA=+^``c&KmqsMO!ej 8*mh%12KKKJ#Lk`$- 76676'&+7!7!2#6'07&#"327L'2) NO!ej iv[@=8Q 9tŃ qL;*1JJ$8+lgqUeR8y*K/K'L327676'&#"76763 #?lI,MPTRV!SUTUlT$!rLbAr+#}swt#&'&7676!2&'&#"3YV!$UNME!FKIPyF+@ws}#+rAbLr83!"'&'7327676'&#YV!$UNME!FJJPyF+@tws}#+rAbLr[J#676!2&'&#"32767# '&7)$UMNE!FKJPyF,MPRSV!STUUjV$>}#+rAAr+#}^-sB )67632 '&7 676'&#"67632"'&^*}{)*P}}RQQQxx ((/. O^5ԜИٍccƍffff.""""./B!!a } &327676'&# 327676&#%!2#!F]8< #$^6U32 CV==cn10yyc36?\13+*?.Vi?>NNuTTz#y+";#"3$''"'&7>7.767632tCL1&E3-uTWQaMBcSTg]Ovu6=76NJ@6sx>WVggWV0%#7!#"'&76325676;#"#&'&#"32Z6tg>\]443D *PON(&;7a`P452 ^`03j&Brqfqr { 3!3#!#VVgg{A4V3#3## 76!3!7#"3276Z-ٵ)Ad+(;w {i0p?`я3A0NL` ## 33¹} kL T#{3!!dʽ!{/"V<)%#"'&76327676;#"# 276'&"n?LL]ONg]99&*POO&&κO((VUO()Ud0110d``01jtssttssxL$327676'&#"76763 3###73?lI,MPTRV!SUTUlT$!*65rLbAr+#}swԤ$7&'&7676!2&'&#";3###7*YV!$UNME!FKIPyF+@>F66ws}#+rAbLr #26&"3!!!+7#"32O8O8 vnT !^!4EANbg߀N/1%j+^Lۓa31DD10ML C3276'&#"%#7#"'&76323!2#"'&'7327676'&+7!OXWJHOWXHƼo!7>>Jz-.gmkzJ,+voV !?B3+9789&)nArJK(*ch cqjtssttss_3d0110d^L$8*mh%12KKKJ ,326&"!7!332+#67'#7#"3233276#O8N7|#s !i\/$ \]!6}KyZfzJXvn h *5j 3.#"#"'&'#"&7#7333#;732676'&/.7>32^!'^6Rb -R#n"#6757qB)vQQ>o>vEk3m:Neb#`>{=g?((TT@I!,KL!&`>NM55YQK($)$V%.!7676;#"+73276?#"'&7#73!33>#SMJ$&)PP5%N&'+.)vee>5jvUNZV()g)_`02PM`> &'pf.6@3632&'&#"632#"'67&'#"&7#733276#"&77#3>y3-.&!&,*0lQRO%Uu0$1(\rC)vQQ> -W N=.03rvE‚#+qrfr9DhT"2`>9KiNVf3+7327676&#"####737>;#";67632])DCm? ,JY|ooji$qhj;>m"<~-x+&?)TT?&$!,KL\[&:MV3-+RK(#*$JAD7 3!!!+sU!]rvGLۓ 333# #333# #t12t͉4Lt22tΉ4U= !#!#!#!#sS3k3S3k3UXrXHJ#32673##"'&7?6'&+732?l>]p {ҋwFLMX33-mN%5**)֟ybe22wx0t 10`` .V/!7#"'&7?6'&+73232673;#"'&7"32JtI=N^EutB4|JycwYYk\g883>32#6&#"#7676;#"4|JycJtI=N^Eum>=rB98wYXj\1Sw66WUzW 3+732673#t||r,B;tsxlX6Vr[t.#"#3>32`,b@uzu0S  qksa97]|v32673#7#"&'q,b@uzu0S  qkJa97*C32673;#"'&?#7#"&'>,b@ulC,r()/T  qkJH VX66x a97!+33276?3327676'&+@7 LMzt3j>))4{,&'}K,- ##K}N;[--s?5/. 333# #t22t͈4+7326?33YGkN\D0=/{}<{RpEW(K/itf9@:og910KSX9Y"#73)~g3#j(~f672676ʠg @j G@ sA?,__=>X@?X=>POPPV"'&6763"33sA?,__s @i F@ PPOP>=X?@X>~327676'&#"767632#(yC, 2q24454555E8QSoG=@*7K$@ ` XFh_@C~#&'&767632&'&#"3WGg:8Sh512,-//2qK+ *y=AmC@_hFX ` @$K7*@fR@91290K TKT[X@878YK TX@878Y3#'#͓ufNf:@91<90K TKT[X@878Y#373wx@1@0#kk+b+@1@0%#kk+h/'0Cb0vO#!!rerJ';#!HreJN#`=#a/U 733##7#7-++++uyYu!7!;>ߖ)JHwDm)N h@ " I"10K TK T[K T[X@878YKTKT[KT[KT[X@878Y4&#"3267#"&54632X@@WW@@X{ssss;@XWA@WX?sstuX"@    9991/90!33267#"&546w=@/-!B "G"alK:e&%& PG7xV7@!   91<99990K TK T[X@878Y@=     ]K TK T[X@878Y@           ]'.#"#>3232673#"&/#*/}rY+D&/ )1}qY,B`1KN&/NMf\%3;!"'&7iDA'wd10`ZȢ/ 7673733276͂#$忉s /MM8 ;#"'&547#7![ 8h- o."#W<(@":Q"/2&'&#"#"'&'732676'&/&'&767632-329V00 Y'x*,XW8<;A;;<=Rbk'h'(PP@77 a /$*+MW33 k2-*)*IX01  #'#37ΉRH+#&'&767632.#"3WGg:8Sh512,-^2qK+ *y[AmC@_hFX `@$K7*@*X!!7!yЈ[*X!!7!3<4*X3#!7*xxhh*X3#!7<4*X%3!7y PfC?ffvfdV7vb+@ 9910!!V )JH&@ H H91<90332673#"&546xWUPjw HADJLvwDm$@ 9910@ @@PP]3#)F-jD2#767676#"76w #?:G: w[F[ƪ@$C!Xl05^ )NtfH@ 1<20@)////2222BBBBVSUU]3#3#҇LfxNfe#VVD*'4f#!#2ufxx)J&rs0)H>32#6&#"'A3wRUWn)H9fLJJLe #3Y#77#732oo1{73#3"11op{?f3#Мf'0Cb0v73#7#7K"_#:L#33"_"걈p!7!#_@q732676&'3#"&4P.8  m]0_hw-+76 >&Dzs5. :"&54763"]XbL]3+61lbo?wS?b#.A#>lq3!7373":#7!##S#cv{ #73733##'"""fck7!fc5V %+73276?&moZ98ij>>~PVE 73;#"'&7m !ZͥEE&~>>ji c/"@ 9910@ @@PP]3#H'_d.>@99991<20@@@@@PPPP]3#%3#((  1  0#"&5476322654&#"cL\]XbL\]Y3b233`0wS@o?wS?oQA#>QB#=>;3#Ous&@    991/90!#"&'732654&'+%#w,^/(I CK@]$]m<6N6ubu s/#WWD4/#7!#@&&@J9X#"6533273273"]Lt&uhf,vie-vGtR@ 91<90#373ēx:@ 912903#'#zmu8&@ H H91<90332673#"&546xxWUPjw ADJLv@:#454'&#"#>32w%)WUow'A3B"%JLH9f05@!   91<99990@=     ]@           ]'.#"#>3232673#"&/#*/}rY+D&/ )1}qY,B^1KN&/NMh/@ 9910!!VєmB]< #"'&'.#"7>32326"VOZg Gb3OU"YS5`D i]F ;73 !;?<6 7=&h!5&hhh5!Ĥ' MN`LMw@'/ZsVFFJ 27654H#3+723]YcL]l$-A#>bo>wS@43!735@&&@J /!!jjN66&b9X632#6#"#6'"#72tLt&uhf,vie-vGtRr_ '7'77VMdreMdrI}`}}a~~a}}`).7>77>76'&'RN/RN0PQn +0PQn  &Ds7"#6%62#&%nv..vd<<tf3tVH%#HVY #"?3;LX$ 3Vh#'?ffvF'irjf'>/`yf'DQf'f'Df'Df'f'&$%EI%!3:ceyy5(=+t\!7!#"32 32)r!P@@PLLLBǪ/bz~9,J.3#3#es+# 01 !7!7!!7!A!\!)A!A!ժ9R2U33 !!7 7!!"! !6!!A@57D<tZ&/3!737&'&7676?#7!67676'&'=Oe-.s!!Oe.-s!!O3P6"InO3Q7"+v[ssZttZss[v*DD*7*DD*9;67633!737&'&3^O?g?CCL*!!*DVLCC?0B["WDWx ֪ WW"#73&7323!7676 D"a6$=g=$"1"+--+Fj" 7oȼ߅LI L9N' w9uDN' w9uEf&ff&|Vff&ff&& Ey +76'&32703;#"'&''&'&767aSh#+68Uq Yo^D Cm5UW6: oik*%1)0T*XmY*)Vl!7#76'$`+^F6 9Td697+!k;%8Eb6=q'0 AV`&+7323#^1FzSSD~S]V_H" 4"32676&%&'&76$32&'&#"76*)e)*fh!2 f0"=DQR JD,  %i\_8888&L (=\ $+.! -&Jm@0326?#"'&'&'&767676;7#"'&'&76?6?27.#"YE$U^b$6{ x@4 ' *hv~ hI)  ,BMQX#iB2("P7Kp-*/6 B6 .(\=2 R%#677676'&# !7!@EYaD3' 9YM$f$%#KOxsPWKL,#%5,*3eaZi|V\{#6&#"#3>32\ڹNq!{ڸ!Ds}```cH6'&#"!3276 #"%%*fZ2%%*f[ҪHIIH<⇙8wyvs`;#"'&7#71lXn@?*n`+.0`b;`p8{ ##'&#7Ù#1Ee<2V`wa`!367676'&'31]|je P4&ޑ`T|p5dwY|rNįtR&%#677676'&# 6%$67#7! @EYaD3' 9\-c3&$$9%!*<KOxsPWKL,#%5,*p$Rݿ &uZ{RH`!#3267#"&7!##1$%7-%M%qB"T`PH? X%Vz{6#"&'#76&#"32VU65fn=HS\)*`{WS<R{$%#677676'&# !2.#"@EYbD3& 9laQF&<]()HIKOxsPWKL,#%5,*8(8*,A:no{` 32676'&%#"763!;^$)e)&@,884$ Gos*◗- `%;#"'&7!7!!lXn@?*g##j0`b`%"'&7!337676'&'1#%lrn*?@,4P4R}0.Տb`s{ZwfvtVh )"27676'&'2##"'&7673~A^i`*)84 Y`53NN^_4: G>d$(69g;ˑRh]c[斘n,mJseg.V`#&+73 3;# zE X1F EvX1Fz ~,~V`%67673#&'&733CJe!|~*NN_f*~|!C2;@WxؑoW@2`&#"&'#"'&376763767OpJoUn"Y&p8,@V8)II V?E+8H`{gLHk{A>oRyRo>-&j&j uff&f& 2f&5$ # 7654'$'&763 '7676q ZiMKNCEBM \I,!2TpA{z Ʋ iR$ $6'&'&'&7!2#"'&3276(*f>5{B_NwR^YTTuomM9T^yhpw{A K~}Sj~9#6''&7676'&F ~~#*Tj}!Qu6hU0rROv~*+40r51_Tf'E9N' wuqVi'#&'&7673767676'&' OPg85tEERh85v [Bh)$7][Bf*$6VyvaxxGnռFCImֹD` !3237667%&# 67#7!C4FTW_QA1*\ct3NB$_$+T3 `/%76#"'&767676676'&632767vp9 yN @{],p9 yN , ZMf lh|TDY|lp"=lh|TDY| lcV #"32&'&32pP@?POCVLLBLK|O"y|•"jVo{ "32676& #&'& ㌻)*f*)eNNI^871Ҽ78w mw.vR#"32#677676'&#"'&76)Nd<;tzIEYbD3& 9w]PGǭ2e!+wTOxsPWKL,#%5,*˞nͱR`#7! 32'27676'&'&'&7676396: '2DaZD@bIH))rYĜ*,5%#,LKWPsxOJonlU\)GV#!#"&'32767!7!676327.#"@dOW0]+ )b9xA<[Fx,L 0_1s q_K!s7oQ>d1 7"'&7 6'&724V9-$DO6,9-$DO[~,`*l#FR`*l#FRva #!3a<l&pM]Vw!#76#'0#0?&'&zrdc&AqX.Ya*uh.nm3iFKI Mf7L[OF5`4 x #&'#&' #'@ֹ#ڹI( -ȹXVU65f7!S\)*`pp>WS170732#"7>3 !"&)=X<>++B$32676&#!3)!jjﰮDEXx@"(F"{f>d%E3!!F"!/ժq32!3#!3!!_M04ZTy_>>+B9,L B5(~B#333##'ݪϨttl`}ZZ5{ZSS0кvN #3!#"3+3m&N J.s #726!#S1?z eBS.+W++ 0+R2!#!#++33s&57&+7327676733Z[:UL\!mQ770ٖoJ+'/.M *5>0!47%73 #7&>4&'03  Y3es;tCoS zz w ȇ{{W9; #3!33#"")_>+B47332673##"'d_ /muh{ˀ~DMAr(Ex+:b )33333"++#333333#6"_>++B;%326&+ !7!32#~3!u++ )+ !3%327676&+ 332#"[f\G\w["u[+++J8)3;%326&+ 332#ꍹ3"u++ )L"'7 767!7!64'& 763 >)}y}|2!sD)xKHtR}_@}R̀sj #"32332 ##3(lk@@(kloJ{LKlu8o#CiyzjMf#.5476$3!#! 3!!"Edx )1{'g'e0:+wټ)H?{DGs7 -65# 3 6  &546?6767676%67ZTOF8-  123&+%5dS2/bLP`{WjYIUA   +td`#!2#!327654&#32>4&#>,ǀCycu4&Y}J6stSPPsTNʦ}J7u gQs}o`[+[` 33!33#+ڸ潸U8`66Lb47332673##"'& GGXvMaڸ[:T;0:o'+R8` )33333(ڨ𽨽`66`#333333#ڨ𽨽𽨽U8`666Lng` !!2#!# 7654+Xѳ(H #F`;p#Ѥϵ` )332' 7654+# ڶX[fM #SFڸ`;S@p#)`X`%32676&+3!2#.pٸXA֙YZ^X`;a6{? 67!7!654'& 763 !"a&gf,.H&tP69yհoGp{VkKW{ $6764'&"3  '&547##3&#%,B:SO9^ڸh4lkVd:A`;E`3.547>3!##;#";m0{ !ڸYT7G8n]*49;ImVabfm&Ckbf&j#ksV63#733!!63 76654#"sUU@M ~6 !3яLsFVs_A;m&vQi{%# '&!2.#"%!3267RRtt56aQF&<]sU,@H`M9++8*,A:pSdq;>s5{V=L=&jԯVM`"%2654+##+73267!32( F 0%VjX'#UuL!N5X)рiv;p#Ѥy`%27654+32+!#3!3# Fd(ddڨYlYp#Ѥ`9J3#733!!63 #654#"JUU@M>> !3яLsK^BA2m&v0pVm&C@nVH&yr` 33!3!#rڸ罸88`6f;%32676&+32#!!7!73!~J*++ ++q zQn`733!!!2#!32676&+nTTW; !H|wy͓LΧXZZZt\aH{E@3!3!F"?]/2$#!38=bX`:E !!##73!!#!ݡˡ!`!/>s^` !!##73!!!`aa!X$ ¸Ef#!!!2+7327676&#"!/V7ZY.<4~L!>GE&8]|9ժFwr|zKK"V^`#!!3 +7327676'&#_$;:B,5)edn*14! )`GQ``07 )~B#3333###'ݪϩsslj:`?`}ZZ5{ZSS/B0кv`#3333###'2ǫTTS_MU84XDDEPPlL_uN&MBuA{&mJ%3###33t]<)q"ˁE8h`%3###33Z6*ҢWھ[>4B?`/Z!#!#3!33#ʋՉ#v)v^9dV`!#!#3!33#bbڸWWZ`CX4K #3!!!#!"wlw"!d9` 33!!!#!ڨYYdfd`9ǖ6su&Wduq{&wh5 !#!7!!3#?+!t!+^++t` !#!7!!3#c#&#ɓZ 4D<V`33#ß~VV`lDJ33!!#!7!7 !RR!mP\PV`333##7#737Þ} // `l550%3### 33g]<8}3B`%3### 33Z6b*v4?Hk#6&#"#36?6?2a\Nqj`2X!P"˄+74H0I > ڗ*\cU'% T pTHK9,~Bm&L H&lfJ32+7327676&+#33]Y.<4~L!>GF%9]|r"ˁqwr|zKK"hV`3 +7327676'&+#33x::B,5)edn*14! )/Wھ[>wGQ``07 )&?`/f%+732767!#3!34L!>GF%v׊"w)whzzKK_9dVV`+732767!#3!3)edn*1fbڸWW``07 `CE !#!!3#"!/^ժ^` !#!!3#L$ȒZ`4_H #Hϸ1m&F HJH&fLN' w3uFH?&jfo{5m&K bfH&kt\QpW{t\N' w+upW&j~BN' wWuL&jlNN' w$uMBA&jmyL`50&N V&nN' w+uNV&jnRN' w+uTuZ&jtt\*H{t\N' w+uH&jLN' wuca6&j&0&Y V&y&N' w5uYV&jy&k&Y Vf&yN' w+u]&j} !#3"'&'&7332767673=^j+75G0H >,ZUNqj_2X!I$'% T pI*\z)b!#3#"&73326?36ZJ'A^s},44Nq!(~5" 2 N' w+ua&jHRJmR4bV{{TR`:\#`Z:&>73&'#".73327.'jA,?-9dQL}nb *_VM73I3_,@ J\9 ):D;x| ,\L06k2i#76.#"!!#>2@+ +`UVqH% ]!Wcܣak,[K00K[,#= |x::x|s`&##!".7>32 >.#"3!`!}WWjafon`Hu *`UVrK- &]V m=>ˍʀ;;ʏ7kT46ba6L>23##6.#"#kcܣaQ!W +`UVqH% + |x::x|a=J,[K00K[,@".73!!32>?3cܣbH!l *_VUsH% +|x;;x| ,\L00L\,)!!332>76."#7>2I^lld'g!D?32tW8mbG!~سs%^cA K1\in00nBB 7!!3!!!"I!ꪪi#76.#"!!>2@+ *`UVrH% !1cܣak,\L00L\,` |x;;x|*:"#>323##".>;7>&32>7#"\>ôqxwf "8RoIHpD.ToH0 .#":/&8$8-L1jysܒIKޓ4kq;3lr8{nڨm?AkP@&33##".7>3!"32>7H}!}Wgno\mj VuN/ "[VUtK( eBʁ;H֏ؑKBqpC4Tk75#76.#"#3>32 , +`UVqH% #T=Ona,\L00L\,3P&*;x|3!!+!dժ2>73".67##3ӌ8`?,;_{8e!H`1Kf>>fKIwo55owO2*B33>32.#"".67>7#2>7>.+Ƿ04S?eG% F6:4TSvT0-Tv[e4?yl[B%#?Wgu=@ykX@$a!##".7332>73T=Onbʌ +_VUrH% C%*;x|3,\L00L\,X/%.7>76$73(0R8&FhG0wuˮM-8@/7B(FO[3bV;3qqm`M-1<.'#".>32>76."#7>2"3267.8K\4P24gpHpGEdHgKEg8lcG"~سs%=W9?LK9}T=nf6a-S^&JnqO)MBa邂n10nBAkIHME23!6.#"#kcܣa!{ +`UVqH% + |x::x|J,[K00K[, $"!".7>7>736$33!m9 <`? {w?{;䀯=Y[ ,D,&KAȤ8Y>PQCzs3". y-^.!#".7332>7!cܣa *_VUsH% ժ|x;;x| ,\L00L\,89 .732>76.#!7!2>76&"#>32V^c 8h|Y8 ?iI!PBeH, h^edd& 1EW1@V- _MM`AqU1.Ql>?fF&*GZ0vpq{[i88gZ;hS<G`s".7#7!32>?3ecܣb! *_VUsH% +|x;;x|b,\L00L\,8h/2>?3".7>7'.+732'.#"009maG!~زr& zAR3k%-!{3zB) %,.Hon20nBEN(g N|!#6.#"#>2 *`UVrH% cܣaJ,\L00L\, |x;;x|m'6."#7>2#732>09mbF"~زs%!HYee`():*Z.Hon20nBEqhD!cEeNW##7>32#>.9YvN0 hᓝb  "ZGl IpX*9؜VV؂\OvO)E6.#".67>32!!33267>>.#"32>I &H7VpC  -Gcc[ pSg!D?(Lf9  +L>/2R91AGH 8{vlQ0e~y%L.+4^dzEEh|7)=(4[{G)0nw>23##6.#"#kcܣaQ!W +`UVqH%  |x::x|a=J,[K00K[,S332>73".7& *_VUsH% cܣb,\L00L\,J|x;;x|(\332>733!#".7iC +_VUrH% !RT=Ona`,\L00L\,ժ%*;x|-v=332>76.7>32#6.#"#"..EmDAt]@ >YfmeW9Qts\ /WA@dH. 1`}X&aw{p&KuO)&IjE:S>-&$.;SqLQn@@nQ4W>"!;S2BV<-1?af`yDE}|#76.#"#>2S+ *`UVrH% cܣak,\L00L\, |x;;x|8D"32>.'2 .732>76.#!7!.7>PeC')VIBdG+*~j`! 0EW1@U- ]c 7i|X6 ?hI!&ZL&AU`YC))CY`V@:iY;fQ:Ibq9_NM`AqU13Vq>:_D%9DHYj:!!#I""O, +3>.'.6>?3#^JjN9.&WHJlN9.&XItF6RG6S/gk23kg/WܜVzzVݜW.>2#".'!!#7#7"2>76.V[V{ HD:@",//"oK-2alI, ._vBDv^`wC *(Hf|gK*'HhA>fJR2 )3>#"&'.6?33"&7>;7">.#2>d0HeE"IUc;l6==!YUŚ @kgH|P)/D/ 'A| #ZRRnI/Ti!  iT_g83EfC B*F)md/5fVa(3#U⁐՘?mv%%#>7>73B >Zs@5~sX  1O@;jV>,M'fCb}*#>7632#".'332>76.#"Z~Z@BC}Y) 4Oj@*M=&1*,C)13sV$MvR3YB&0K6 %*?*  3!9!#z5`)%#".673327673327>73#7#"0uKDT% ~}GO*++}}/JI(+}ڧ-o?rHE.qw9=?78=s`32O//Nq"_VR,!Ds}V ab]Vsw %#".7>32733## 6& >feRfedST\ T^TXQ؈ۙRVT/VR+V3{3##6&#"#3>32 kRNq"{ڸ!Ds}ُV``abbr3!!326?3#7#"&bܸU/kPp!.!Dr{lLח0ad]Vsw%#".7>32733! 6& >feRfedT\ T^TXQ؈ۙRVTR7C )3!!!#/Uz%LVO{#6&#"!!3>32ONq",!Ds}Jl abV{+;6.#"#3>323##".7>32>7#" ?qRM{^C˷+!-X^g=fZeh$hz>HlC Kfx7".7>3!33O;lZD,ZrX? \\P Y{UU:laep;32Nq!ηuDs}-abV`!!3- V-327673#7#".6?>'&#"#3>32 JI()-|٧-o?HQ 1 JI()-Ϧg-o?HQ y8=?`7'32>7>.'#"!ZaYeS.`POzY: !&NzZ=`2onf*zΗUUzˍR!bSoAAoS3omf*BqV332673##"&7|Op!{ԹsDr|-{RadNBK]0E#7#".7>7.7>?3326732>?>.'#;Pb.d"O_n;Y~IWi8K+ CJ*  .'(N=MvV6 KCDzdG, /{[,J6Bve`D-?N( ?OU100$ EvV17]{DV3ywl'5{+V {3!6&#"#3>32 Nq"{ڸ!Ds}/``abo(;2.#"#7#".767#73>32>?6.'_2 56rtr5vm%t!!M\k>\{ErQD>5S0KsR2 OkHm *MnD Or,H4@qZ+^uAXuF76.#"'>32t*?' Qy|W >fG#MMGu+dqz@jg%W{rI/?$2msz~D;`C$%6"e-H47icK~q`LNB{QvV1!!".7>7".7>?3267#9& =Xn|@-gR, IBre%5P ;N'#?)Vx[:+A,:4 ElL<{7`q,`/'8% q7>76.7>32%">76.tX{qI  t&>) mW", '1' 4K]hm6fi)H+[N:  ( AK_ >cO}p_N+9 BI;=@#5ZRLQY45_Q@.5g4N3!ADFLR,RN=K?`B!!{$"#3>32!!7>76.>jR9 ڸ"EycB 8Qh@)IqS8*X4ZzFs`dcF}gSv94myPIa8wg`XJV~3326733!#"&JOp!йsDr|H/ӑRad-{.!#>'&#"#7#".673327673>32| JI((-o?GP | JI()-|-o?GP y8=e^`32TNq"͸,!Ds}J ab]H{J"`%!!3_&"ٸ`,V.!#>'&#"##".673327673>32| JI((֧e-o?GP | JI()-ѧg-o?GP y8=e 32#"&&#"32]?ww?deSffg'T\T_ccTVRۊٗQVTuZ{RV$+6##".'73".7>;2"6.#2>aӋRRKzdQ$8FW8b]% P}fV`;} k8vc^dACךU[7P2,J5.-PpCHpM'GH+OHBRZ`2Bu3326733!7#"&ܸPp!|_!Dr{l{/ad$R%3#3#1ӥ1R\$7'{vv?99>>p'0333#!!67676'&'767676'&'MM]]d0[f~#:d:x~GR@6{e:I5*ev! LVxZQ-x.6{<2'1mc,#{)7&7676&767#"767#"763263 #6#"? ?B ~ ?B (('H(&ʑ\?!sBA?>BA?pпQQ92,"2"76767$32632&#"# 76%7676`,ΘA- IOaL@3l^0&Ͻ%JX4*oabu;\SfaƎ:F78UNQ8327&'"76#"%67&76$ #&67 #"'632`24F616C!/6!:pp2\ -;! 9' 2'#u`0'"/6OAK %[9.ȵ!>3 #"&?327#'&&776jefy3Lx/F. B BC quЍ h! ACBB_ )"32676&2 6''&7632#7676r$# %!Eec9};V #&!Of!*` %"%:yx~)RhKK>i 9"32676&&7656767$ 3276320! 76-676$" %"Y)=(qdz0y*/Fk?W0,S!sF3Ho %"%}@~Y9peDQcFlWNn-7V= ,2676&'&! 3%$6567&7'7$"%""/@Uppr=.<l"$~"L7 $! $?=Qm.uG4 0{$"276$#"76$76g ֛'&T*&''*(@@@PyxH *%"32676&"#" #"7323272 #6#"?$# %!Fz>6-U&*)C&"$C+7 %"%&PW0{#$"2"22#"7#&767663 #6#"]<"$,r#&##u|y܀ݹIedm%>{'&7766323276#6%$7"B CC "!()*$r11cRsBF;BCACKؼJjeh0 26#"73267$76767673!"'#@@>z]iF(+*s@0egu/ssM|"267&76% 3%$g+ܰ%'&!&%<9V &Ѩ'LB&"267&76! 3%$׀h*ܰ%'% '%<:۸W &Ѩ'hB P J"32676&"32676&+&'#"'&7632'3273767&76676'7$" %!$" %"cYt~@<w+''N f<<stZ!)Ѳ! >@#blb &"$ %"%IJTObo;4ˋP6A^g[oPI$0+&'#"'&7632'32737673"32676& kb{dXt~@=w+'(N f<<stm$# %!,PIIJTObo;4ˋ %"%2} ,"32676&2737673%&'# 67&76$# %!tn!<=#vi >hXt>. 2,! %"%4ˮ/IJ=%ۏ  ,"32676&2737673%&'# 67&76$" %"sn <=#vi >iXt=/ 2,  %"%4˯IJ=%ۏ`3323!"'#"763227Ӹ66?x>)`,88{ ,2676&'&! 3%$4767&7'7$"$""/@Ur>.<k"$}#L7  $! $&=Qm.uG4 - +"32676&6! ! &%$&7676$" $"T,>96mJG2))BX $ $8${{N& .%"32676& %&'&'&7!2767!"'676%" $"Il1D%,/MNfQ!S6=(w!$ $TrJco<7{"326! %&$7623 76! %@@$ƾ$E##e$!"SW@D?@w@@@@LBE>/} cbWZC %-"32676&%$ %&'&763 76.$" %!<<;z1 ɝ{#**E:8)"9] B<S %"$36H9G)#$67K 6"32676&$76%$76!232'&#"%$'&76$" %"T1$ 04KZEhrZ;U E?Oq\,)l %"%+DYl0yP^d6Qqt^}]Fk&$"2''&'$! '&7"32?6\gR1ʞ?F)+(#(&etmh% N)=md'dud ! &7623$76'76"4+-* A H B8 ?;kP$U.FM?>=({ ##"2#"73276#"IO7N&&&TR ;C >@{jVR777r't/eT~i! ! !7 76! $%>=&=>?&'%~?>~Ti! ! 3!? 76! %%>=&=M'&%~?>wJ~T~i! ! !7 76! #7$%>=&=>?&'++%~?>~NTi! ! 3!? 76! #7%%>=&=M'&**%~?>wJ~T3<"36676'#"7632AB/D$e?Io[$N[u'"327"767&7623273,JH @@&,Ws> [yu?{EBXF@ '676%"7676! 6"3oc A"!7*9.`hH;A?~= h\$kb8:;-F_Zkf2)< 73733##7<****؎nP<r 632#"326##&иLT{-z!! 476733 654'&5473$a1ch A\??KibcW?3O)$YF,W9%3%! 47%67654#"&547! 654% !; -[ Q[|#4_X  A F+,Q7654>)jS:PrYz | f[|v 2K_[ ajBOeu>3['! 47!23654##7! 654# 3 `Eye,2 9 IdL] }!>>&-4T\GP?YN#! 47)!"363654# ; j2CM"9#Y|J$OFU[ڀGYH:Q?" .#67654+"#654+"#&54?!2363 .(7 wK@(66)M,3 w \{h4[`5.$N1P-+56fhhJ\QS1! 476733 654+7327654'&5473\Dp #wt @ ?R(#'&79BZ~/(I>3ه|0A'$"=T0KY2! 4733 7 7654%7%O0z '4B ; hk+2" 4? 3|g9 Ҁ 1b5\TҸ[?=4$Oۥ30@DgN{R=bbJ^ !! 4733 654&54767d=Ķ H? ]K[K<r'"xV}|8;?-Y%3! 47! 65'#z #A0)oYv"uR>_i=pd=v_-TnlY 5! 476733 7654##7654'#"'73263236;2LMe  /e40J>X>HAV++3OLg!k +34=Z{~,$*!tW;|_bc1:NW <K!# 473; ?654'#736?654+"!# 4?!23632654+"32VG48 /+ $PP7$ HS;(]Pw0s1x*FM22=2:(!e<'D:)i{ dyq+%^(i!@5`:DU7?1KV 76?&54?!3676?654+"#654+"'6&#"IA `_6Z/̌"+ dd:"<< +L2/fiS66PggJ^F>.5<(KHAJTUY"! 473$?## 47%33 73IFi /0l28+ .e/'18'!bMESB6 \'3! 47%3654#"#7654#"#323632654# 32\Yfe-8 n(U,Gܺ_ H#jJY!0%!#*!l.8/RAJ;(#$654'&# #! '54#"36326uAŲ4@:rBpc*7G06RNK\AM<V`M h3Y%3! 4?! 654+7327654'&5473bT?: XJ#leXf!saDdL۞h*"^)%w"]&/t[ ! 47!233654# 3 c/hsMWK[sNQ@vM<])6!23632#654#"#7654#"367  4?3$654+ <0d8( n)8_me+"G@DYM3b#!/%~߁Pc\Pc&fMrXD&YB5C! 4767 654'&547 547!33#;27654+"N4{ c{-2M] AAKUcB ]]&m%3=i^i$I&!}S^W/8M 0Ni7H?bJ+'%~_! 473363654# 3 g9«v)cvJ  `N_N^Q@O?HYC+%! 4767 654'&54?%773%[.U >s#..58#})0B@M}YiG>2Bwx}J$Lv?! 4?33 7654'#7327654+7327654'&5473F7x  'RdR[yuh-5>ee/'*ezLM h/.h~:PmYZ! 47654'3!27654'#7367654+7327654+7327654'&5473;T> ;kE D]D gkooz!&|W;F+ W`EG5,,#w j\Iy#B2)q""x 0/!I`#27&547% 323&'$654# ra jx>F)q) #< ` /M1(ZQmLI Jvjt| 7&U6({:F?O#p*!#Y3+!! 47%$7654#"7! ! 654'7)SX I]X{ =` *5 I;%7Y83<srg$z8A:08ԃM.')&G%\Ln-RYn('3! 654'7!+"'#; 3! 47)m; Y@D,2O;u 0-*Œ?.08Y(!p#09W$*!6?3! 5476%$47$7654! T 6u7 -C1 k7@u!yLL(/TK)."!).'syh"56&#"'6?&547%'54' |\_ZsWxUq:)^_ytJfFO=%SD@b*2 3#3#3#"""㰽s2"5476;%"654#"32 7֥ @$Fap% Xx$-80<LRQ(m2&q{ O3267>54&#"326?%!>54&#"7>32>32+3267#"&'#"&54671}i##N;ZeD;Sj+aUF5";Hj/]uUM1L#O8Rv2PyH'!b3C'\iV{0#"'&'732676'&+732676'&#"767632r53QXZd cTTL @?PPc_^T"f]^Vyx A@^  VJ=+,nQb54"[\m Pd %!!7!!!#73)q-я{,8P%#"&546?!>54&#"7>32>32#"&!3267"3267>7>54&:PzaUF6#;G_":Q;'8uP|4B=Sk<`(HCA_(Jb?@+TZ[nNX:2)+E@AD6NyGfkDL8GNdGB,jl MTEF5`V$QW/{  #6&#"71Ҽ7)e)/./  332678.8*f*/.+0[%!7!2676&#!7!#J$$^$WD"lp2rV$W?373!7!2676&#!7!#W'(A''##jxexE$$v:&"zlp2r+S")7!2676&#!7!2676&#!7!#rB0w!}o |p!`!`6, Y"iJo5FP;9JI9!c?Le !3#'!# l~n|U!#3#3!7##3!0;)it:T___D_P (3267654&#3267654&#%!2#!;okIjT1[_=]ydUZF+EO2BX?F(1]bFMX b8rt 267654&+2+$O=~؉*ؿN9Povu;ID !!!!!!.P0d;___ !7!!7!7!7ע;d0R_/__!#"&547>32.#"326?#7!`zPDP654&#"3267 &547> 'a`s$'`as*Y*>Z=hG6qhF6qרaJ^שcI 3267654&#%!2+#=XsHYyASJ1H]oP { #'.+#!23267654&#.9"TG C>zD|y:\hF[' ?]Z4DmNShPIK/CA !!#!Sڐ_33267>73#"&'.540dn  F67Q  od931qCBe#% =4!!!!4<8l$! !#D7> 333# #5|*Å|x yY>) ."326?#7#"&546;7>54&#"7>32KI+3A7]}Ot.{F`s§PI6~FD{8u E)/7wg+]58]Nm" 03e\Q:& 03267654&#"3>32+3267#"&'&54"&eu6D`~Ot1}Pl[;];@Ez8Wr??#6vh+f]85]:im+9g..-) 73#7#"&547>32267654&"-tt'k?W !@V -r .pNO/0P2;08,1]{w7+2^z O3267>54&#"326?%!>54&#"7>32>32+3267#"&'#"&5467 NC2%8@ +%4C 8 =5,[!&S-CXY:Q`J 51S02V$3K X2MZ )7",K) ',GH.P3>,1 `.+-,QEpz1 +/^%##%VIG4%267>54&#">32#"&'#3L5V$@?5V %C'h@gs4-0N>Tuu304=GH320?DK/0thQ=@G0/Og%"3267>54&3#7#"&5467>32h7T"@@5W#EkItt)h?gr3+/N>\103AGH311@CKDO/0ujP54&#"#"&5467>32!32676RIMB~AKC4Eub\8H  CKeU}wX=02k8, NR $(7!7654'&#"7>32#"'&5473267. !0m8LH9I2 !ݗ<'w$UT2!<&8 fW<\*0Q6O)3 /bW*0.547>32.#";#"3267#"&547>H93q?>j0Vh IUid^x \m>w5@v6o?# KX ]0*,Q>- )5a[C=S*0#"&'73267654&+73267654&#"7>32H93q?>j0Vh IUid^x \m>w5@v6o?# KX ]0*,Q>- )5a[C=S.267>54&#"#"&'7326?#"&5467>327302S#G?aHO"3d0.c2^g%nEar2-/F?`t3/2}32#>54&#"#>54&#"#3>32N16A PiN  05OiN /3Ojj F)/:&)=3M<g3B $H}g6@ # Cs6"#*++73267654&#"#3>32Xht9HW&HQnMtt+vHl>!pmwXEG$%?g`s^67d;*. "32654&'2#"&5467>gFGgF<{4/1\v4/2IHIHWxsM=BBzrL?AC4>32#"&'73267654&#"3i3{ "ߤ3\+&V:m Jmg!#4>32#654&#"4#a { 2XYuՠS2;6*3_zx4#"&54733267#a { 2XYuՠT1;6*3_zx%#3>32#"&7267>54&#"Fst'l?fp1,0M?Y3U#A@5W#FbP.1tiP>BD/(203@GG221@DKD!!;#"&5467#737'K1@jbK'P %R>B&TP+332673#7#"&5466TuU;5PoMut.qBR`|&,0h_b^76RG4}!7!267654&#!7!#K_fVlqi7"g32#"&'#N.08pdr6 RL&HP&:nPHJnf"2ZTZjwQwI,.uW[׸jp|aU `!!!7!!7!!7!!<mnm< pFFhˏ5iV);+73276?#"&7!7!BY&moZ980&|~ij>>~ #3>32#"&654&"26tt'k?W !@Vw -r .pNqO/0O2<08+2]{w7+2^z3#"&5467>32.#"3267!.i8D9;T8i2)Y5El%$'VV[).XX ` @?s'"@*bhj*!0#"&5467>32.''7'37.#"32654&NG/-0Yy0-0T  !YB2qIAi `TN:ACxrF;>E0 430pQ13 CJ$8%0#"&'73267654&+73267654&#"7>32PBŠ6o9,n?m U_chVeLW0pDEv3y a H*]fa;7#9Q0" ,] P75H3#"3###737>3<< xtx yvU/88P#P,l\>73#7!3#+7326?c3! Ut 2VPoQ/f18_*^j(kD|X ~5;xt4)2_zf[bF53N/8*332673##"&546UtU(FRmNtuJ+wGl?{#&?g`bO68d;)&3#!3#3!737#737#tt)>&&,r\PP\=#"&547#7!;+hH F)W 9t`:!(@Pp7 !#3!73#@ggP-PP#3!737#737#7!#&&-@-\PP\PP/3#"5476;33#7#"3276.ttŧytrx)? rPHB,^ssW?#5"  ;#"&547#7!:!8dM .!7X`32#654&#"eV!10X+a7[2SVR ;FixlX6V~a88f5/=w,!"Ck\[v+764'&#"#3>32;#"'&547B :G44NWW,`8[  C  1"U H/-B-56\sa88B$6/w6*3"%; )=x5*4")%F&'&#"#"/;#"'&54?32767654'&/&'&547>32,329V01 Y&v+9<  Cr'  :v=R21 g&h'@nb /$+0Wf , X6!9%/"19- *,X`>;#"+7326LG{no>; ~r-C;]MecU-:JxlX6%!!;+73276?#"'&547#737"BJDChu9"#,B"P#]m;t>g>t>uu7t7>=Jz0 N^B;\\`9C*D'0$+-6/&7!267654&'7!##"&547>72MlI27;!׎|]X\{'yK5\mY.`#{\8b(!S $Ry:6"3+"&5473;7267654&'&t [44*8a'"W8%/p+)mY/e##3{i{s !!!7!^=R^P!!#;#"'&54?!7!VG  2!V ^=R 5 X6,+; ^ ^#67#7!7!3632#7327654#Ma \&nIw n#8!!^R^=_jR ! 2#"&'73267654&+7!7!CJ9Cݱ;y>/xDxVhnL\& f2|mTP2I]R^% "654'&#"!3276  &5476& XY@8 M XY@9&S.S.l?32&VVL~g?f&VVM]XK_۩YK_ &$H ?{&DP&% ;T&E2c&%;cT&E&%;T&Esuk' xu&&duf&vZ&FhjP&' w&Gcj&'wc&Gj&'h&Guj&'wu&Gj&':&G5&(Hf}&H5&(>f}&H5um&2&( bufH&2&H\P&) P&I N0&* 2;Hy&JP&+ THP&K c&+TcH&KN' w`u+THX&KjH?u&+buH&K&+TH&K0&,0&LJk&. xuZk&N xrucJ&.Zc&N2J&.Z&N2Nc &/2 c&ONci0&6  ci0&7 N &/2h&ON &/2:&O k&0 x8uf&Pv P&0 &Pc &0c{&PP&1 TH&Qc&1TcH{&Q&1TH{&Q&1:H{&QR' x2' y2u&R&vH3r&3 xw|Vhf&S3P&3 Vh&S P&5 &U c&5c{&U c0&T c&U &5h{&U{P&6 s5&Vc{&6sc5{&Vc{P&&6 sc5&&V5P&7 dP&W c5&7cd&Wh5&7hd&W:5&7:d&WPd&8_dm`&X0&80m`&X:&8:m`&XP' x2' y8}&v&XH+E&9 y\&Yvc+&9c`&YR`r&: z|\#m&CZR`r&: x|\#m&vOZR`4'j8$:\#&jZR`P&: \#&ZRc`&:\c#`&Z9P&; &[9N' w`u;&[jDP&< V&\t&= {.|Nmm&]dc&=Ncm`&]&=Nm`&]TH&Kd&Wj\#b&ZtVb&\t P&A _H"c&$Hc?{&Dct& {|Hc?m&d' zT&$ HJ&H& & & %Vzr&l%Vzr&7&m &n Dm& D0& Df'DDfr'F-'rjFPfC2Vf&,2V`&2Vf&27&m2V7&Tf'fTf'fV&k?ffvdxr73#3"e""ïd/Z9910!!P !/Zy@ 9910!!/yy@ 9910!!/yy@ 9910!!/yy@ 9910!!/y'__ ]&BB9@:og910KSX9Y"#73)~5@:og10KSX9Y"3#)/5@:on10KSX9Y"3#)/B#7B*t* e@3     :o g     991<20KSX99Y"#73#73& '~~y _@0     : og     91<20KSX99Y"3#%3#))/ _@0     : on     91<20KSX99Y"3#%3#''/) #7##7*s**s*;o \@0: Q   99991<20KSXY"3!!#!7!Roٮo\];;o@L       :   Q   999122220KSXY"%!#!7!!7!3!!!RPojoRRohn\\?!   & 104632#"&?}|}||{|?q?)/ w@<    :n    999991/<<220KSXY"3#3#3#<o;;///'3?Km@<%1= 1%+\C7IF:4(:"FG4"@ "G""".G"@(/99991/<22299990'32654&#"4632#"&32654&#"4632#"&32654&#"4632#"&H%'H_EDbcCE_yxxwyLaEEacCEayyxxy aEF`bDEayyxxy7a`JGacECcaEyxyEaaECcaExxy"GaaGCcaExxy @LP[f4632#"&62654&#"4626763267632#"'&'#"'&'#"&732654&#"/2654&#"2654&#"yxxyyaacCEڊE EfdE EfddeF FceF  FceeO:9QR8:O%'QtPR8:QzQtPR8:QyxxyaaECcyS  SS SxyT TT T{GacECcaa`JGaaGCcaEGaaGCca`F3`u`'jZ`r&',`#3W`u8`'j`*'',5m#@uC91907m+!{#R=s#@uC9190%77=+_# ^R?'4M_$#7>3273767676'&f #`o%ih\[..piR6 22T6J! 7 #D98``LAB\VBT=BR-;,,1Y7 B $7#"$'5ZThh~vvuw~i !#3#3!mVEF #73#7!!73'X;ޏ'  4x' ^S?' '; 2###/%$ڤ0ЍH辸a $<4762#"&%#"'&5476767632276767654'&#"bJ&%6N89JKd??&&:9JJc@@Y6.,!/!!H8,. /#"@  ,kMO&&EDl{zOO&%ED8NtsdV'&5NtujO'&? !3!73#3#(wettPPD t@> JJ J  J: `   991<290KSXY"33##7!7 !iuw!#~ oy}y4&!!>32#"&'7327654'&#"1 <MM##A>IM`H~09v?}RR66`5782_ ?@gFAB0.rABaH() b64'&#"326.#"67632#"'&5476767632f''HbCB))Ha'\2TT%1;?LvBA.5BCRJJ-Bfg200?#"GFkC'&ThPP=87h?FC.7ABx]deRx<< a!#!u  $5A,:4'&#"3276&'&547632#"'&5476"327654'&M-,O`=>ZLc==H$%dcxBAkS,+̟POFG2UnNER98((A%%87V;F34();eHHfPOA@0.Ku99d]BBUZF7@11F2a4327654'&#"732767#"&54767>32#"'&NH`DC)(HaAB'.-3UT%.?>Lx-5RKK4.Bgf3//@DGFkE&&KKh PP9pgCBC.66BAx^Rw=< , !!#5!5!5j,__3!!f3_a!!!!ff`D_; #.547;%&e1/Q[jPO< 654&'3&&f00VQZiP#6&#"#367632KK;PZ;:Dy-@@Px^!{TP43`s^6~aTd\C{d3TtdTudCd4CdbTdaCdATdaTd?d8d di;fdi<fd)d%d.ds|d$dXSd gd8nzdddd"{dD%dQ##"32.#"3267!!!!!!>DHEs.+mD;mC>F,o6667756GFDFG kN9,6<073&'3267#"'#7&'#7&'&476$;73&'&$/zE"/2. rd'ad"y#,'4yQ e_d zsZlL245+,#$- r9(YY34@W} XI FRlzd N2%6767#"476$32.#"3>32.#"JGkd'cef_ekR"PhM24WFy7W,6m ,Y348XGGa^lzkVeX]ɨ9!!!!3###7K4,-=Hϔ-#!!73#737#737632.#"!!!BB0@@!8y:&ecm.(*.BI+#6'&#"#367623632#6&#"#Se@ GT<=Inn1;:,teM=GhUNnM2FU<=In"xGM_a`f21>&>E3\__"&)''#!333#3#!###737#73377'(%hkkkhkk'(4&{{&&{{{?X32654&#+#32333632.#"#"'&'#"&54673#;732654/.545{TY=65M{9bcg9Y>^,T(#O)GQ_Y/J((cUc53pa 7!`". @:M46tY`;%y^ E326&##.+#!232676&/.7>32.#"#"'&;TdGT}CEEFty`L#6 3468J[ 1^#^Gv;d((]3OX 1Q#kN|45/b؍$~3YQKP%$((TT@I!**"&)-1'#73'3!73!733#3#####7!73'!!7g=&[8\89%=!Og!h "!Q;!uuguuguuuuE %2 #6&#!#)"33!3Ɠ5E@+SMrƔ6D?,SV*$oNw&ik-|@C$%|{c!|{ c '+a!e.'.-,+($$ &,$.9999999991<22299032.#"!!!!3267#"5#73>7#7]LJH'FGG28 /LU'PV1 1!*(A32#"'&'"32676767654'&'&67'>7632#"'.'&/#"'&547>3232676767654'&'&&#"32\!+"X3&; #$06- -$   #  U@'D[i&#  />$*)5' / 2/=! S6&X&8^) 5$  '*ޛkSo;48O07zfi8@ 3l8#?7%!73:'& )3^ ";6T$B~od4LNtFu05 .' #UB4F_A9pTne?<&#cE# 51A'632327&54767632#72767654'#"'&#"%67654'&#"~mfp,=,> Xa|jG) )l#tz`MJcg1 1.$Q./*`NkB04X``7a0<㫃%&†qJ< Na~hFl*!#??0W!}3!!&+!23#3#!###737#73!32767!%&+Vl[p[ `f(Su˳dcnmև %\MZ.+ZfJZYZ*/Y<[x&1#7&'&54776?3&'&'6767#7!'_L@_R_J&FYQaG=D;Gnpiuel_[6*5nnͦ$F_0,?'S*% ldYl7!3!#3##!##7373!/3|IH>2gbϿ'R{{{{{A667676&#"7>323#!!3267#"&767#736767!7e A^g'qV' o):7hہ*ti) WD 4cq<;''K={[/ {9b{DI--N@{ O/{!,&'&#2767#&'&776?)GLKff]]o)gc_\4d5]=?,e+\RV_P0- W6i----iH$"u9Bt"#BuflCg3 !!!!#!s!s!-+ժx p%!!##.+732767!7!&'&+7OF#O\cJ,+3|i.hc ݑVGO(32%3#%"&5467>3232654&#"5E$(H)-CD$PK1X.v@@+xF)Pڞjz'!4Rf}'!277Sq95/I:!*'?[jb!8Z@AKä^ChffDielmcfaBF5:3!3%!!!!!!Dfegq  dx+%THKTH632#64&#"#'?3%Ǘŋ]W!{ 1$ÑEmJHWEbOYbcJ %# !3!# GHMZMd q+y 02#"547"327654!!3>3"##726 4 42 3 b[y$U2 y$U2 .=.= 0Z/= 1Q~>;\>}N*3>"32>54.'2#".5467>32654&#%!2+#hjMMKLijKLkZZ\[~}ڶ[\ZZ&RXXRuJjhKLLLijJgZZ[~}ڶ[[}~[ZZICBISqmopB 33!27&#%!2+!67654'&` `s1:+YX*q jdZ)VV) (%#'#  %27&"676'&\ӿ,F E]]]][{ab[ 2222jT%%5$c$% &.2&'&+3!.+!!2!27&#676'&%3A::f&AVy-`5?vfAd)7%LK$201/O~hbb)j)V>U)- fh@6    :   Q  1 1010/91<<2<<90KSXY"###5!3###r}r7q^^-B0 %#!!!5!bJZCJ]d qddd J.m -)7 7673 $54$32!"53!25&'&#"6Ky {U>ZLtࠢ""38M{{M7M3TT<`xGZAEIpP3RQ4O !!!7!#3#3#B!#n!ӄO-`ddh/{& }'V{/{& }'`{/m{& }'{uV/m& }'tuV/{& }'{V/& }'tV/& }'uV/{& }'V/{& }'{V/{& }'V/{& }'{V/& }'uV/{& }'V/{& }'V/m{& }{/m'uV& }B} 5!!B#ZpZR#ZZM '#'"ZZ$MZpZ#B} '7!5!'7ZpZ#ZZM !737@ZZ#ZpZB}!5!'7'mZ#ZZ#ZߠZ#R#ZZRZM%7#7'3'ZRZZ$R"ZݠZ#ZZ#Za 7!##:nt':tna #5'#5!tn'dtna )53753dtnntda 733!ntd:ntB}3!'7!5!7ѓc}Z#Z㔎RZ#R#ZRB}#5!7!'7'7!'/cZ#ZߤRZRZRYxa532767676767632&'&'&#"#"'&/#7!$f ! +!3-68+2",j!!!3 .6+85.0$m: w '07)(6;C+ : ,:'+:Yxa5!5!#5#"'&'&'.'&#"'6767632327676:m$0.58+6. 3!!!j,"2+86-3!+ ! f:d+':, : +C;6()70' wB}!!'#537i&ڠZZ#ZZZZ#R#ZZM'75'3''#ZZ$R"ZZ&ZZ#ZZB}'73'7'7#'7!5hZZ#ZZZZRZZM77#75'73ZZRZZ'ZZ#ZZ&B}'!5!7ZZ#ZZ1ZZ#R#ZZB}'7!'7'7!'4ZZ#ZZ1ZZRZZB} 53#5!5뤤4Z#ZhZ#R#ZM %'3'3!5Z$R"Zh̠Z#Z4B} !'7'7!#3̠Z#Z4ZRZM 7#7#5!ZRZ4Z#Z̤M%'7'3'73!5ZZ$R"ZZhZZ#ZZB#(276767654'&'&'4#!5d >b-*,%:0Z#Z  *+(54<852.&Z#R#ZB#)!'7'7!"'&'&'&547676763"mEZ#Z0:%,*-11> ZRZ&.258<45(+  B#$>2+#5!5!54767676"3276767654'&'&'&l>b-*,%:0ΠZ#Z2)-019 o #*+(54<852.&ՠZ#R#Z};47(+ }  B#$>!'7'7!#5#"'&'&'&54767>";54'&'&'&e910-)2Z#ZΤ0:%,*-b> o #+(74;}ZRZ&.258<45(+*  } B}X3267676767632267676?'7'7#&"'&'&'&'&'&""'&'&'&#5! ! Z#Z  > >  Z#Z" *!#$' * ZRZ %  '%  %' " Z#R#ZB!'7#5!3'7'<2Z#Z<2Z#Z Z#R#Z ZRZq` %7'7]JQgz=Zӄh PJV}e 5!#Z"ZǠZ#R#Ze !#!'7'< Z$Z9kZRZe !3!5zZ"ZZ#R#Ze '7'7!354'&/#7!J%%%'HD_SlhX[HJ%%%%Jw422-A8;>112-!:zJZ[ghX\HC+%%'GKY[eg[WMs2=>FD{2,/2{DF>H':Xy6#5!#52767>54'&'7#"'&'&'&54767<:!-211>;8A-224wJ%%%%JH[XhlS_DH'&&&Iz:d'H>FD{2/,2{DF>=2sMW[ge[YKG'%%+CH\Xhg[[IB}5!B#Zp{#ZB!!BMZZ#M3'#|"ZMZM#'Z$MpZ#B}!5!'7pZ#ߤZB'7!5Z{ZM!37ZMZGM!#73{Z#ZpB|  '7!5!'7 5!!ZpZ##ZpZZZR#ZZ*M !737 3'#'2ZZR"ZZ#ZpZMZpZB| '7!5!'7%!!ZpZ#ZpZuRZZ#ZZ#B|'5!!!!5 #ZppZ>R#ZZ#R*M73'#'#'3hR"ZZ$RZppZ#B|'7!5!'7!5!'7ZppZ#>RZZR*M%#73737#hRZZR#ZppZBA! '7!=!Z#Zp{Z{#ZBA! !! !5!'7BMZMpZ#ߤZ#ZB}!73!!!'7#5!!qVa6ZEV`6NZ#Z">RRjը;mRR:lNZ#R#ZRRB!!373'7'7#'7#537!7'!RRȚNZ#ZN|NZ#ZN.9#!RRRRNZRZN ~NZ#R#ZN RRB}!'7#5!7!5!73'7'%!7'!`]Va6.ZxV`6NZ#ZRR;mRR:lNZRZRRB}!!5!RRpNZ#ZNRRRNZ#R#ZNRM#'3'#'RNZ$R"ZNRSpNZ#ZNpRB}!5!'7'7!5!7NZ#ZNpRRNZRZNRRM%37#73RNZRZNRRpNZ#ZNRB}!!7/7'7!5mRRRNZ#ZNNZ#ZNRRRNZRZNNZ#R#ZNM'77#7'3SRRSQNZRZNNZ$R"ZpRRmRRANZ#ZNNZ#Z6a##7!#tn::n3:t:5p::6a '#5!#5'5C:3n::n:4:dp:nt6%753!5373:4:dp:ntn:nd:4:6%3!'3n:nd:4:n::p5:tB}5!!!!!Z#Zwgw"?Z#R#ZRwRwRB}!5!7!5!'!5!70"wgwZ#?RwRwRZRB}37773'''#5:;!\[`Z#ZCCjjZ#R#ZB}'7'7#'''53777Z#Z`[\!;:ZRZjjCCM%#5#535#535'3'3#3Z$R"ZtZ#ZtM533#3#7#75#535#5ZRZtZ#ZtB} !553353!Z#Z{Z#R#ZM '3'#7#7Z$R"ZnZ#Z}ʻB} !'7'7!+53#53Z#Z}ʻZRZM 7#77'3'3ZRZZ#Z}6B} !!#3#Z4ZݤZ#ZZ#B} 3#'7!5!'7뤤Z4̠ZZ#h#ZZ 5!5! !!? Ou]%uuv 333'#!#\^vtP uB !!75!!5 t]]Xv ###3!3,^\X& v 3'335%!!# #^\XtvpFguv %3'3#!5%# #3!^\^$tv~Fuv #3#!5#3/# #3!J\^^|HGetvJ~{GGMuv 3#!!5#3# #3!F\ F ^tvW~uv 3'333'37# ##!#^\fd^tv ^u9v #!5#3'%3'37#7# ##3!3^^ fd^tvJ^uB '#35!7'!!!5 5~t]]EF 7!##!#*:ntaI':tnIFEF %!53753!5!ldtn~ntd&Iv #7#3'# #3 3\^^tvP*OutuB}'0#"'&'#53676323'7'7%&'&#"!32764RvxN1kk2Ow9g' Z#Z 0GD2 & +JD5@3PO2BB4R,( : ZRZ11/0*M !#737'#'RZZ"ZZ$#ZpZ*ZpZ#Ba7!5!'7!5!'7'7!5!ppZ#Zp?ZRRRZB}#5!5!53!Z#Z[qZ#R#ZB}!5!53!'7'7!#p\Z#ZߤZRZB}#53533'7'7##Z#ZZ#ZߠZ#R#ZZRZB}#5##5#53533533ҤtZ#ZtZ#R#ZB}#53533533'7'7##5##tZ#ZtߤZRZB}53533533'7'7##5##5Z#Z8Z#Z8ߠZ#R#ZZRZ !! ?OuuuB 7% !5uzR##7 ! ?S:uuzRuu##% %!3!3hV[7l n7R{+u\ #&'&#"327673 u B!OO!B ocI7͙7IcL 0"'&547632654'&#"563 3276767&#" \m`cu\6% GGnth r5?,/H@3H5,Y:$UeI+HQ\N,tqzSd69->eSY׮l 7!!5!!5!!LLk+5!#7#53!5!!5!733!ZD2/+^^``kIb!0?"'&''7&'&54767>2"&'2767>54'&&cv-'''OO_@8vcu-'''OO_A:GE:;9($(#&GFF:;9cv8@_pm__ONP(-vcu:A_mp__OOP(-9;SPF($(9;PSF'O@*BBBB:91/90KSXY"#3 !q!#7!hqqPC?3 3ް2ް22013!!"&63!!"!0",Z(膆(\JN*"f_QQĪKM_fOPi%+i?33ް2&2'2$%ް2222//01%3!!"''7&'&6;73#!!#"!#L(0,:CyEB航6'|>v\JK-".4"$: 1cQı2#KK_ff_lFO]B/ 3 3ް2ް2201!3!!".>3!!"N=c(憆(c=֪I9[[9IPC?33ް2ް22 01&'.#!5!2#!5!276767!5 ,Z(؈膆(\JL, 1f_rĪKM_fOPi%+h?3333ް2$2%2&'ް222//01&#!5!27+'7#53!5!3276767!73&'&'(/-9CyDD舫6'{rx\JJ. 4 %:  1crı2ݪyKK_ff_lFO]B/33ް2ް22  015!&'&#!5!2#!5!2767>b(؈憆(؆b>,I9[[9I3!L9@ LL120!#!L^L9!3!9_k^L= -@     <91990!!5 5!!LR%# Չ\P_X-yl10!!X!תXy!5!!5!3!!y!DCmILB#+U e+Gr?; /@     99190'%3##d)#Ӕ/}b%9;v 3'%3###"&'532654&+532654&#"5>32d)#Ӕ/>^c:r;Eq-evnmBJ]b`W,p;Eu2X}b%9lP|yQDJLl?<8?yvcG];e '%3##33##5!5 !d)#Ӕ/ڢtt}}b%9Soyc %.#"326"&'#"&54632>3"38\32#"&'#"&546329[=G[TFBi8\=G[SDCj~/[w~SNAU}^sdlkutcjmvu۠d|k֥s}T!3!T*,}T!3!T*p_,33# NM^T,3 3#T^,$476767632#4'&'&'&#"#;9_UijB9 KGLV32326yKOZq Mg3OINS5dK t]F;73 ";@<7  6<Xy32767>32.#"#"&'XJF]t Kd5SNIO3gM qZOK?<6  7<@;" 37;XyG&'&#"5>323267#"''43OINS61-NSXIFJKOQdSP  ;@<7 W"323326X!!KOZq!Sc1NJOR`!t]D;83$777=X`y!!#"'&'.#"5>32326X!!KOZq Mg3OINS5dK t]F c;73 ";@<7  6<Xbz'767#"'!!'7#5!7&'&567676ǧfYUE5kIQ%\n*xrYQMoIF\<[ETFR q$"B2(d%(9L5XXy$!!!!#"'&'.#"5>32326X!!!KOZq Mg3OINS52'V t]Fجϯ;73 ";@<7 " 6<X1y0%#5!7!5!73!!!'#"'&'.#"5>32326Qu{hq,gqTKOZq Mg3OINS52'V t]FR=R ;73 ";@<7 " 6<Xy.1%!5!7!5!7&'.#"5>3273267#"'!!!!'hMEnK Mg3OINS523J:VQ FJKO!8!E$F";@<7 832326#"'&'.#"5>323326yKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]Dï;73 ";@<7  6<а;83 $77 7=X0y8&#"5>327&'&#"5>323267#"'3267#"/'00NJOR:G67'43OINS520N]a91FJKO?J4r[DKKOdgb 7 ;@<7 !7)32326#"'&'.#"5>323326!!yKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]D*!;73 ";@<7  6<а;83 $77 7=Xy7S#"'&'.#"5>323326#"'&'.#"5>32326#"'&'.#"5>323326yKOZq Sc1NJOR` t]DKKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]D;83 $77 7=;73 ";@<7  6<а;83 $77 7=Xy$!5!53276767632.#"#"&'y!JF]t V'25SNIO3gM qZOKج#?<6 " 7<@;" 37;Wy' %52% $'"51pZV(IٜXDz;%76767!##"'&'&'#5!!5367676323!&'&'&i1*+V WJRNMR  W,!::!,\HSLPM% +*%'H:^2:A<336G84^:H'@'H?Y L=@33/N0<^:H'%X`z!!5367676323!&'&'&!!i:!,\HSLPM% +*!#'H?Y L=@33/N0<^:H'%X`y'I Xy& 'IIXy'Io& IWz'In& IJ. 3#3#!5!5J=>𹬬J. ##!!!!>7BX`y 365&'!!5!&547!5!!%43448>!0IG00GG2?8>;_8X`y !!!!"264&'2#"&546X!!IdddeH:l'**z{ BbFE``bq+((d:svvX`yK!!!!2&'56X!! BS X`yD!!!!73# X!!鏫 BZVX`yD!!!!33#X!!֕ BLVX`y!!!!!!'X!!߰ TU UT BX`y !!!!!3!X!!-e Bz(iE`07GO!!!!#"3###535463!3267#"&54632.#"'53#5#"&4632264&"X!!4@#mmC???DJB&G$$K&aqk[Q_B;18BCC?-I\\I-?p`ctiF6A?9i=$#tu#gSSSX`y*!!!!>32#4&#"#4&#"#3>32X!!."]?T\Y88EQY7:DQYYU;;R B=:xoHOM]QHPL^P%U20=X`y ,!!!!3#7#546?>54&#"5>32X!!ffc`--A6(Y1/a3\p$-, BiN2A+,/-7#!^aO&E++ X%y<@ l  l  <291<2<<990!3!!!'7#5!7!X}y}J;fժhӬXyB !!!!!!X!!!جX y%#5!7!5!7!5!73!!!!!'G=XkXU7Y Z:wSAw@Xy 7!!!!!!!!X!!!!߬Vw? (@l  <2291/905!5w!!LK Xy? (@l  <<291/90-5!!X#!!VVTw 3!!5!5V!!!!߬¶LK VTw 3!!-5!5V!!!!߬VVw#5!7!5!73!!!'5 p[5m{*[y~!߬`u,`vLKVw#5!7!5!73!!!'-5 p[5m{*[y!!߬`u,`vWy&%5767$'5674[šzآb|۠M)Ig#M(Jh#Xy %5%%%'w2rK/dtm0x0oVXy '75%%5%'rKnd.t'o0xEu0#oVX y!5!%5%%%!!'XC_^?sMN#N+PJ>`5Yd|5X y!!'7#5375%7%57'NEO>:fLNtt5\h}a5H<Vw?#%#"'&'.#"5>323265wKOZq Mg3OINS52'V t]FJ!;73 ";@<7 " 6<LKVw?!(%#"'&'&'&#"5676323276-5wKHGOZq M343OFGINIIS52'V t]FDE)!!;3 " @< " 6V w+.%"5>327%5%%%3267#"'&'&''}QINSE^AsMP#Bt]FJKOZq _4O;@<7փ_5Xc|6V w27'732767#"'&'&''5676?5%7%53;L t]FDEJGLGOZq P32326&%&%5$7$7wKOZq Mg3OINS5dK t]FJl#a;73 ";@<7  6<RO]ɗ9=}Vw*%#"'&'.#"5>3232655%$wKOZq Mg3OINS5dK t]F)a#l;73 ";@<7  6<R˖}=9"]OV[w67&%'&'5$774hmU֠Gc _eT2wnw2"O0Bj%V[w'567&'567&hmU*c _eT2Vwnw 2O0BDj%Xy_%!"'&54763!!"3!yɊD_`Dƍ^`Xy_75!27654&#!5!2#XD`_DȊɣ`^ȋXy> #"&'&5476;7!!!!"#'J_+30TD~K9# K^+#Eƍ5p5Xy> 32654'&'7+'7!5!!5!237RJ_+30TD~K9FC K9^+#Eƍ55Xy%!5%!"'&54763!!"3!y!ɊD_`Dƍ^`Xy%!=!27654&#!5!2#yD`_DȊɪ`^ȋX,y&%!!'7#5!7&'&5476;73!!!#"$UrG6:qYȲG5^_=R5 Yƍ5p&`=X,y!++!!'7#5!7!5!&#!5!27327654'&'92D4VqF53 D&#I`__ 2ȋ559`^`X0y!%!'7!5!7#"'&54763!!"3!!yR|ɊD_aDAQjfƍ^`5eX0y"%!'7!5!7#!5!27654&#!5!2yR|Da_DȊ]zTQjf`^nj^DeN3#%332653! &1N332653! &3##5#535eDddXwy1/3ް2/301!!!!X!w@Xwy1/3ް2/301!5!!5ywXy H/3 ް 2 ް2/33 3017!!!!!!X!!w߸Xy J/3ް2 ް 2 / 301%!5!5!!5y!w54&'&'3!!#!5!ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FތPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Oi372"&'&'&547676"2767>54&'&'!5ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FMPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9ՌOi3?2"&'&'&547676"2767>54&'&'77''7ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FBccccPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9ccccOi372"&'&'&547676"2767>54&'&''ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:F,ccPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9KccOi73#2"&'&'&547676"2767>54&'&'ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Oi2L2#"&546"326542"&'&'&547676"2767>54&'&'h7b%&'qqnNL88OݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:F)'%`8nqqMpLM77POO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Oi!'/7=E2"&'&'&547676%&'&'& 654'67676-ݾOO''''OOݾOO''''OOf:F-T1-F::E.S1.E:POO__pm__ONPPNO__mp__OOAϚ9FPQ9.9떖EQPD19Oi!;!!!!2"&'&'&547676"2767>54&'&'+{{ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:F;gZfPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Pj.22"&'&'&54676"267>54&'&'&!5!ݾNNONݾOO''NON-R9;99;9FG:;99;:FFxmPpnPNPPNP^_mpON<<9;SQ;:<9;PS;:+Pi%!!!3!!#!5!3Ҍ8Ȍ7nj6Pi %!!!!53rM_Pi%!!!7   '3ͬc  ccc #c ccc Pi 3#!!! 3Xy!!#yӪXy!!5!3y--Xy!!5!!C!DZXy!!5!ZXyw 5V!Xyw7%X!ߨVw^^Xy? %!5 5yyy!LKXy? 7!!7-X!!ߨ{?繷g 7!6762"'&'$&"26i1[륢S4OsPOtO.D/YR3BPQqOOLN #4&#"#6! NMz(/N7332653! &;zMig Y/`n103#`7 !!'  TS TS8X`y!532767>32.#"#"&'yJF]t Kd5SNIO3gM qZOK ?<6  7<@;" 37; !33qj}+)y ##y(,}Zw #!"3!!"&5463!! )!"3!wk:PP:jkwj Q9:PD{  |Zw #!2654&#!5!2#!! )5!254#!Z:PP:kjyikQ9:PXAy 755%5!5X!#!!ʶLK XAy % 5 -5!!y#!!!!KL VVw?  55!5!w!!!KLVXy? 55%5!X!#!Vw $75$&%&%5$7$7"nWlܜ86s˖}=9]OVw $'$'5%$5)n˱#lݷW680O]"ɗ9=}Vw)%*67&'&%&''&'57&%5$?7dMjTVʥ3˱!3a4m"cjX)3S][e﹏3N@%HZ-=}k$Vw)$(6%'56?56%7$'57&%D>WwZN(۷+/m")33 +Si063hiyje˖X[y3!!!'7#! !PYBzrYh?ݪ@?@X[y3!'7#5!!5!!PYzrY(s??ݪ@X>y!!!!!!'7!5!7!X!w R`RgfjfX>y%!'7!5!7!5!!5!!yRgw! RjfhDfVw?%%&'&#"5>327%5 %3267#"''43OINS:Z0!!x2XIFJKOQd>3  ;@<7 ҧK{"327V!!?E>XIFJKOQd>C43OINS:Z0"323267#"''&%&%5$7$743OINS61-NSXIFJKOQdSl#a  ;@<7 W"323267#"''55%$43OINS61-NSXIFJKOQdSa#l  ;@<7 W" # #h֣ͣG9> 3 3h*338> !!# #g֣ͣrcG9> !!!!# #gg֣ͣrrcG9)!##m ##7G9 33b"m!733QXG%C!!3#CrrCr[  C!!3# CrrCr[ %~!!3#CrrCr  ~!!3# CrrCr Xsy^!#y^ap$%%$~  %6 %!&'&"112*zz`XXroGGnY  67" ,J5PP5JX*77*#L8P"2642#"''7&546Ċnji56؝]QBɉLJo3NEQ\|G+-7AJT35#"&546;5#"&46235462+32"&=54&#"3#"2653264&"2654&#ςYxxYςZxxZE1/EE0uu0EE`Ev/EDaEEaDE/wZ\ZЂZwwZЂZ\Zwu0EE`E`E/1EE0E`EE0u0EE1/EXsy^!3!yߨys+~!#!r ~5!#r rS;+;!!3vrr;)3!rv;SLl4732#"'&'.#"0 Pd@7+ h$TA6?&H| #"&546323250 Pd@7+ h$DTA6?&Hk-khi !!!#%!!h\roa`޾"(I  !! #37!#3'Q''Ho99Ƀo!p=⻻}(TI #!!7!#3'l)okkɃ=r!r⻻+2" #/;GS_kw+7CO[gs!2#!"543!254#!"+"=4;2+"=4;27+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2%+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;22+"=4"=43+"=4;2+"=4;2"=43!2#\\K\=Kl]\\\\]ii\][]\\\\\\\\]\\]\\\\\\x::f>]Y"\I\\\\I`LLMK\y>>(I !! 3#)%3!'-''96=ûHJ7 hHH--JJXy !5!!!!5!D!DZP4!!!rrZm4 !%!!5!5!5!!mr4 3#3#!%!!5!!omrX4  ! !! !ZS;Z$m4& 4 '3276'&#"!#"'&'!!67632!zzzzzzzzIwwHS;HwwI΍GG2GG$_EXXE^m_DXXE_3#%673#&'%676'&1rsrs2srsrTTTT@TTT|B B@B)B)΍11@4121tD'  XBy 3!!#!5!y ]XBy 3!!#!5fa]<4 !%!!Ybm5A4 !!!!;rbmY5A4 !%!5!mrXae4 !%! !2mrx1xB35!3!!#!B#ZCkZF#Z-ӠZB3 '7!#!5!3!'7ZlDZ#Z-ӤZ4 !%!!5!!ZZmrϠZnZ4 !!'7!!!'7;rZZmZ1X1Z'327#"'$%'3632# 6'&#"zz=>lWWsPYX2灾vzz>GjX`OXGX4y !5!!5!yeZrr^Z%3 33!#!!3/ .^+^kk4 7!!#xr;rc/Krmu4 % !%!50!53!ymrZ[zXy&'&47673!!5!64'<<<.LM.;<+PN.;==R-*/KO/'-TQ0˪1.Xy '!!#!5!'"ZABZ$ZuZ#4 !!%!!''!;GZZHrZEZwXy !!!5!!X!D!CZ%3 !#!3!###.77/^+kk4! !! 3!xS;ZK{mu4 ! !%!#5!5!"~~+mrz[ZXy!5!5!!#&'&476654'#D!C<+PN.;<.LM.==<<}}-TP/ .LO//AJ/,EN*Xy!7!5!3!!7@ZBAZ#ZhZ4 !7!)!7ZbZmEZwZ4&  4 % !3!5!y;Ūy_r4?'  4&  4D'  ,D$467632#4& #62"&$&"264:zӃ:4ር♜VuVRyV8vu4DֆMUTyRT4& Z^' J4 !!!3#3#xrZm9Xy3#%3#!5!!?ʲC!D$Z 3#%3#!#7!?9hwMq&J ?H&  8t'  ,3+33676767653#&'&'&'&  V &#$K 9BU5>=5^:;^D`1o%".+y 9 :C[\l3;b 89hbXy3!!#"'&7633!!";;yV__W9|+q_ih_XyH&a 8XyH&! 8Xy !!3#X!Ścת% *!%#567!676&'&'&'&|z*(2J E<iKH#&GIJE E|-2 M3 +O  ! r; ?9y?p  ! Xy*= 67 '&5677%"632327'&32767#"'&'.#"y{h p{"zi piE5 5dJ t]BFZCEF4 Zq Mg3ħĨ1P$s 7%ےs3 !Xy3#"'#&'&#"5>323326yKOGU43OINS52^NFz;7 (  ;?<6 '='3#3!!#7#537 `?+0'7ϺrSSr4!!!!3!!!'7#5!7!xrddeZmn;fժhӬ4&*!!!#546?>54&#"5>323#xr=TZ>/mNb^hC^XE&Zm]bRY;X1YnED98L\VBT=/Xy673367##%.XhZvrM'hx:Bxv`M]Pd H d-Dbgd *Xy633267#.'#%'Xr<;oj/eE}{SC5E%rI1V /dj6`;#"'&'#5"$lYoRQ`+.0`b;VT{6#"&'#76&#"32ttf,n䇅{WS<F`&#"&'#"'&37676376' 2KUXK2~)@V""V@)~`{gLHk{A>oRyRo>4y& 45{!%&'&#"!!32?# '&76!2!5! %%cjf_[_fMJOhk en(',g c\\c( r4`& 4`& Fy *'&'&3273;#"'&''&'&767,-b=MJMUHi;c( #) Xn^T).\-rv~ oik*%1)0T*XmY*). #5!!!#oo.ڭ%ۭ&H:07 %#"326=7#5#"&546;54&#"5>32hHH#[]E>Vcii!fHatLT5m4:j2O85%--JJ??8?vh+]85l[hmKDg/R: 953353!53!5!#"326=7#5#"&546;54&#"5>32as7s9s;#[]E>Vcii!fHatLT5m4:j2Op"r??8?vh+]85l[hmKDg..R:1=[%5!!5!#"326=7#5#"&546;54&#"5>32#"326757#5#"&546;5.#"5>320;0#[]E>Vcii!fHatLT5m4:j2Op""[]E>Vbii"eIasLS5m4:j2Op"rrrr??8?vh+]85l[hmKDg..R}??8?vh+]85l[hmKDg..Rk*.26:>B#5#"&546;54&#"5>32#"326=%=!!%%%5!55qi!fHatLT5m4:j2O85%#[]E>Vc,,,,]85l[hmKDg/R}??8?vhyyrDyyyyrryyR8~4<DLTZ`%#5&'&'&''7&5475'7676767537'5676767'7&'&'&'5'7'%654d3/D9229D/3d4.E9229E.42*  *22*  *2*88fWfEOPDfWg88fWeDPOEeWf8g * apa *  * aa * ba.43ab-45F^'04>2".33&'."#67>76#FVʓVVʓ"vv"Z83Pv"Υ"vP3ʓVVʓVVnh<8PvDDvP8"vP9~?9Pv"F^&0!4>2".7!&'."67>4'&hVʓVVʓDvP479;;74PvD"MʓVVʓVVv"i c;DD;g"vP F^ %7'32>4.#52".VFoDvvDDvYoʓVVʓVSwVF_YvDDvvDoVʓVV4!!!xrZm #53àZ03#s #5ˠАWeE%3 53Zz i#0s  3#àР˓[m#!!# q3#s!!`N um!5!#z3#zz3!5!`z m #4763!!"ƺoyeD9uߑfW#'&%'53 763:*enK==Mne( =C _AEc H<  3!!"'&59De{oVfd #3ƺ m 4'&#!5!2 9Deyo}Wf &'&3!3#76<(enM==Kne*!<McEA_I= 3#!5!2765 o{eD9ᏞfV3 wv% !!!!55!#uX ̼uu]]e! !!;bc;$<:.]3!3:~\T\~.%yj5!jl!X3 !@ <j 5!!5!!5!r#B#B#j<l !!!!!r#B#B#XXXm 333mjjjm !!!@@@mjjj<j 53353353353X 5!###ljjjX !5!!!5!4l t,> 3!!!--Axj 333!xjkx 3!3!kA 5!5!5!3,,=jX 5!333jkkX 5!35!3̠= 3!!!!-- ABx 333!!xs  x 3!33!!-skA jB !5!5!5!3,,X !5!333xtjk X 5!3!5!33t,  !5!!5!4B 5!!###sjjj 5!!5!3!!t,-sjB 5!5!3!,-XAj 5!333!jkk 5!5!333!XkA!5!5!5!3!!!!,,--AB5!333!!###sjkkjj !!!!5!5!333!-s t,jBkA 43!!"yY[p~| 4&#!5!2[Yxp~|j 5!2653#xY[j~|qj !"&533![Yyjq|~*m3YѲ/ Y*m#3*/ Y*m # # 3 3*iSjh5!|j3?hj5!h}j3@hl|X!@?hl!h}X!@@l5!5!!5ijVV333PP?@l!!!iXVV#!#P@P?@ n?!?j!j!k!@!!B!B! F!Z ! ! h!| ! *!> 3 i v}8m #'+/37;?53!5353!5353!5353!5353!5353!5353!5353!53Z667576l #'+/37;?CGKOSW[_cgkosw53%5353535353535353%5353535353535353%5353535353535353%5353%5353%53eeefffdddheefcd!!!z m #A35#35#35#35#35#35#35#35#35#!#5#!5#!35#35#35#35!3h̚h̚̚h̚̚hϚ2̙Ϛ#366B kBF yZi!}@i }i !!}} @@&  !!!@@!!i }&  !!!}}w!N<w7!!!xr$<w 3!254#!") ) xrVVVw&  w !%!5!5!5!5!5!5!5!5!5!N?:IILII޸[["[[w !!!!!!IIN< w !%!!5!!!I) NDJPV\bhn27654'&#"&7367'67675673#''5&'&'7&'%67'7&'67'%7&'&'%6767%&'&$h%$%%34$&1++XSA N@`==k>P CRX++XYC P>k==l?L ?Q oL+ Nn;P?;@  nMNn3%%%%34%&&%s==`?J >PW,,WW? K?_==f?H?PW,,WU?H?^<=Ke+cL mCP`k<<!4(0847632#"'&7327654#"&#%#&7&'67&'67!󫪪vӤ=6 5N'V[S.U[R󫬬񫪪񿉊 ʯX[V[X[V[!4(0847632#"'&7327654#"73$3&'67&'67!󫪪vѦ=63QNV[S.U[R󫬬񫪪񿉊w  'X[V[X[V[!4!)47632#"'&%#$''&'6%&'6!󫪪4>;D@KDzcngk?dnhk󫬬񫪪I kpinipi !4 "*2:AIX3#''%#&'52#"'&5476!!'5%!!'53'5%3'5%3#'32765'&#"M==,/0#H 8&O6 |7iY06./==e6a&i1r4z012+KN2HQ>>>>f^2"/1]8`1"Y 4f2y`1B7#5#53'&'&54767&'&=33676=3#327654'&O&"}|fzg}}"&&"}UQn$mQU}"$nQUVV{xVVUQ<"{u^^\ _u{"#| zUOOUz |#YOT{zQPPQz{TO@>)4'&#"3276&5476327#'#53'&`____`oŠqk]^^]YYňÁhgf@> '"3276'&'7#5373'#"'&5476j___``_ߓqŊqYX]]XYfhhĈÁj0 '&'&376&+"'&5'476%7!Z{z[ZZ[~\YWmpN#ZX[[YZ[PQmp#TG*52764'&#"#463233#!5sPQPPtrQPyzg֏LQQQPPQr{{t|g*#"#53533#632#47654&#"#ddiqqCBigIIugzyUr}ppDtPQs_CS 7"27654'&7#"&54767##53#533333#3##h. @\ ! 2(>>?ZW~>'3|}}! -/@ /- !^'?XY??~YX?(F}R}hh}}hLS<#5#535&'&'5'73'3#'73'676=35'73'13|e{vw}wwUATwx|xxS@Wwx}vv|d|re{Eus~~suE|VAKtrrt@X{Ius~~suI{dr|*! #!!!'!27674'&#_82V)3{D#MHZW{s{?zK8QO##"'##565'##"/547?kM ,4N"DF &Fi?JO/FB!O {|Im<&=M2227632#&547636=4'&#"#4'&#"=` ]d2 cBU;/G;SXMB:@B ս;7hf% #>|\@9@O &&5 iC n:^O G  %2O7236;2"'##'65##"'&5476;235&'&=476jS c1=EO ;SCFRʝT6*F@E1;O+.`162V Yi8/D ;8[B VRP"<B+"'##565#+"'&575477;2732;276=4'&3&'"ih;F(wQ"DG".FWCNfBy" bODUq5u4  Pro@ |S`64 'RHIOq 1 ӫg 4D% 3363'$6'"I+4 puoS^*  3%#'#3%#';&2 IʗHj7*(,377#'#'547#5773%%,ppsr,'zzxz'984?/99e5>:_Xy@&*'$676#"'67667 h5X@!2 ^:H~](#7NE SRQO1̡LH~&77$7676&#""~EV*( :^#D89hH܏1OQ S g !"&462264&"1[륢S4fOsPOtOۨD/YR3BPQqOOu#\u ! !h i/u-1xZ 3%!#3!+<ZdddwY #3 !73#7<dZd 3#˪5hppK #3J5hp' 8  ' 8 5} !!d#ZDZZ#ZZ#5} '7!5!'75ZDZ#ZZ5} '7!5!'75Z!Z#ZߠZ#ZZ#R#ZZ,V $%::h11Q-,S'HH({ 7676'@::x*11QS'(4H k|@QelH 'fQMH8eu#\u h u-Xqy33#####533ܨDDDDXqy333333#######5ʨssrDDDDDDP/  3# ! % ! ts_e;TXy'I$Xy'IW'I$T}!! 7J771!# 7881!3 85 ''!jxxGF5 !0wxF5 77!xGVxH5 !xGwT} !5 5! 7E7Jɩ771 # #3 ک878F8w7!!!xr$<w!!!xr<w7!!xr$<w%!!Yr$<w% h5bcJ6bw bc66bw ! bc6bw! 5bc6b w #)-17%#535#5#5#5##5'3#5#5#5#5#5##5##5###5ZssssVrrrrsZVr~rZHNrrrrZZrHNbVrrrrrrVL +;#"'&47!2#.+3 654'&#ōߥE-(mPcJW3|i.ic g3,>jDEoQك^nhy]k7% P0EL 73#7 '&7#"326TD޸&;X2Pٔkk;!ؔ;!V+u'AҨz5.V  ##!!+732767-]r"n&moZ98'ij>>= %!#3!3jV" ѲR{p '#36 3265#" :D"&X2ٔ;!ؔlk;!}fu١5.yAҨb3!!#w! 9V.`#3!rdڸY`9Mh '"27676'&'2#"'&7673WA\j_,+:5 ]d97^`5;~ F?c%*9:e;ˑRh]c[斘,mKseg. !#7#"&'732676&+732+E؃Do/$2rI(=cݳ$w"$.*gQH{"2>   676326pJrҽp-pTT (nI^[]-=P@7'"]_$5zWXUdY 3#3)mKqD{9;#"./&'&'732654&/.54!2.#"y@Q!3?.E7@52ed)bpXeJ P_'Q]by٢UO #8$H -EBRZ)!:y(&;<GX('2p#7!7!;#".'&/&#!cO$FJ(Q!r I[35-5`o^+7&()6?p`$36767#"'&7676?>7#7 #`o%ih\[..piR6 422T6J! 7S #D98``LAB\VBT=;-;,,1Y7Xy'IW!##m#7!#o3!3V!733;X)u$%#?>'./.76$32.#"22" &GI.gS%TOl /II{4<5/VVL89CFnY1^5YVe*X3# 3 X0X[*X3# 3u= $dX*X3# 39y X*X3# 3 X*X73#3#X*X3##3Ɉ X0XX3##3D $dXX3##3A XvX3##3̪} X:X%3#!#3 X*X!#!!/ yXX!#3!!/ <ẌX!#3!!/ xXvX!#3!!/ Xd:X%!!3I X{ 3'#':Yyj?CUC-U #'7374:Y{j?CUC 3#3#7G3f*D #73#73ހG3fRoUwD Z~d37 !7 !7  |W|;pO:$-H'ŢcmZ3`!7 !7 !7 3T6T )~6|MY[ 7! 2LP)j *.1 V[{ 7! 2LP)j %X.1 V +732767!#3!&moZ98׊"w)wij>>9dTVH!+732767654&#"#3>32&ܥ0]W!{/tKb Ӝ G'QWab ^4X#%[Iw !7!7!7!>>I`3 #ʁX2qeQ10#ll+]V!6#"3;#"'&7# 7632!7!3#6M \kCYKG&}=&15&KߘK9|~jd !33###_>3B3)*{3>323##67654&#"# Kb jU8]W!{`ab /03L G'QWT"#7>;!3#!#06D8 #~v)vʋՉ//&r1Fd+9$3!733##!##73!7]UUxMMxTTn]}}}\rk\\~~?$07 6762!3267#&'&'#"&76%"32676&6&#"&> l| bm7KG:L ]z>XsCXYsC4IVTT Z2fq fW TRzxw{{wxz[^cWa %"32676&'6#">7.7>3%"*)e)*fo888-:G% ߞ"(gڜ-*/1|kI5b@`   :        2999991/<2<2990KSX9Y"3#'#"!#!##737>3/-J__۸%&Sec/яNb@K   :     99991/<22990KSX9Y"!#!"!!##737>Ѹ__)پ&{Sec/яNT#'-7>?67654'&#"06763237 e3232673#"&"*&"6}#|U">##$(8 } ~\79 32mn 6.mn=Y910@//]]KTX@878YK TX@878Y#]@ 91<90@/// ]K TX@878YKTX@878Y3#'#՞ј5c@ 91290@//// ]K TX@878YKTX@878Y#373-՞ї /mf@ 9910'F#ll{Wm> #.#"# C9wVSRo{xz=5]8796{m @  HH120332673#"&wYRSlw#m6978w{zP"@ 9910@ OO__]3#(Pck3#3#=Gkc'k#!#Vk,0#7676?>7654'&'"#"7676323#/! HK40 >2'@M*N=KL |2! !#OJ; 2bEBTY;X1-%#D>YHis ^@/ :SQ 99991/0KSX9Y"#73#3B1ˁX1+e!@J !!!:S WY ce Q"  ! ! "99919990KSX9Y"33267#"&546?>7#73PojUGodOj%lebhT=1D]]YHo8JRGB98~^lVFfV AuY2p_<рEрEmdhsR!uX/bb{\)?XXXXFs5\N9NR3R PRdHH;wb;T=Z7Tubs}\NX{/dJX/+X3?}\R///os55559999RRRRRPPPP37HHHHHHbbbb====wTuuuuuX/}}}}HHHssssww5b5b5b5b5bN;N;N;N;T,9=9=9=]A9=ZN7N7N7N7XTTT(}RuRuRu# 3 ssssP}P}P}P}P}P}R\NNN;T,Di0CHdv3tHG'G97T%c}t *}x I oMX XArvsH9=RuP}P}P}P}P}pHHoN;ZRuRuN;To/HH5b5b9=9=RuRu P}P}s"RT4H5bRuRuRuRu* Bxxxvo0UQCp{BJyk%N2YDC!A Ecg00 r)c@a~D#'8[^az 4N"xQD H.z[]*fVh'O/yw/"[?w*?'.lvf5P _4:u@0h<x4r?QE5t9R3t9E|EA_|8uH%{t2u299q\H1v t73ss55PEp99\"K&Eq5~sR3s&03HGdbBVVVuV1I+nXa;bbss==JVrfntEEsE~BVs+T9~VE_HHo5btptp~BVVRutta&&&HRbR\:sL@2/L88mWS(-8,R V'}5]+b]7JN]+o&5Nv\9wJ-#],u\>2Ni=0H>M& 2 -7Ck(TTTT'@E_<{^,UTSX"W[Y"QK^lN)KU\3[]&_HLIS"-=#Rssi +V+A)&%$**? +.444D+#?[+#I3-*%3>*&/t [-%6P %H;;;swwhw:5H5>5b\N;TTT?bT00ZZZN N NhN:TTT:Ru33 hssshh::P_00::P}R\R\R\R\R\NNNT\_HHHH5b5b5b9=RuRu P}EEEEEEEE^|Ki||||||||8jjKif^uuuuuu ^22222222^EE||uu22EEEEEEEE^|[[[[[[[[22222222^EEEEEEE22[[[|[; Q8j99mj%% 22222TT?d//);??Z85=?Mx?'a?4baAaa\34baAa)%.$ "DQNN9-. w! 3<gpt:TTJyB%0 ////////////////BBBBBYYBBBBBBBBBBBBq?QQ2BXXBBBBGB*BB*B*BBBBBBBBBBBBBBBBBBEEB*BBBBBBBB%uIXX+?;;;)}}?5XJWXXXXXXXXXXXXXXXWXXXXXWJJXXXXXXXEXXXXXXVXVVVVWXXXXVVVVVVVVVXVVVVVVXXXXXXXXXXXXXX^^OOOOOOOOPPPPPXXXXXXXXiXZZXXVXVVVVXXXXVVVVPIr% % XaGX++|h}2HXXXBBX%XXX%XXX?XXXX%XXXX6FFHRFFF    :<<<<<<xxxxxxxhhiFiiDDu777777?aa"!!!!GCL2 1rjD7X~uxw ,{uXXPXXT11T1LVM zYX)[{-U3TX[)T?abb??/^?DDDD@p, x0  H  @H d|`8TddXt8 8!l!"#0$T%%&&&'<''')|*+,$,-./01812345d6l7X89\:(;;<=l>8>?@ AhAAB|CXD<EPFPFGHlIJKK<KlLMMMNOlOPQQQRhSSSSSTTUU U8UPVXW8WPWhWWWWWWXXYY Y8YPYhYY[[4[L[d[|[\t]]]^^^4^L``````aa,aDa\bbbbbbcclddddddfff0fHf`fxfffffgg g8gPghgggii(i@iXipiiiiijjj0jHj`jxjjjjjkHkkklll4lLldl|lmmtmnnn4nLnnnnnooo0oHoppqq q8qPqhqqr`rxrrrrrsuuuuuuvv(v@vXvpvvvvvwww0wtwwxx(x@xXxpxxxxxyyy0yHy`yxyyyyyzzDz{h{x{|H|}$}~ ~~~P@0|hXP\lXddtXHdPTl@0@Xp 8Xp(@Xp0H`x0H`x 8Ph(@Xp0d|<4Ll $<TX \T$x xTX,|ll@$xl(tp<,ht\l$l0,4`l\0„XTĸŔ ƨ< tȬ\Pˬ\͸΄$ ЈD$ҐX4p԰@PՐ4֘pנװ@\p؄ش٤4DۄX|ݨ$4DTdtބ޸,l|P`8d DHd pdt@$HXh0h<(Hd 8Ph$4DTdhxd| \HDTP<D0HT xpTdpx \||0@ $      ,     0      8 H X h        0h\ ,4L\(Tdt,<p8<t,X 8Ph`pP X  `   !!4!D!t!!"D""###,#D#$ $t$$% %@%X%p%%%%%%&&&(&@&X&p&&&&&&'' '8'P'`'p'''''(((0(H(`(x())d)|)))))))*x*+T+,,,- -.P../8/0P01l12H23L348455l6<667P78P99D9:h:x;<;L;p;;; >t>??d@@@@AB,BxBC\CDdDDE4EEFpFGH@HPHI4IIIJLJJKKLL0LMpNNODOPQ8QR0RS<STTUtVVWLWX@XYYZ[x\$\]h]]^H^`^__X_` `l`a0aLab\bbbc@cdhe efHfgghhhipijtkkxlllmnpnoppq@qr<rsttuLvHvwDwxy<yzHz{P{{|}h}~~ X0d4`Lppp4`$xhdPx8x04, |L\, @,lT D`T<ddD\t$@Xp0H`x(@Xp0H`x 8Ph(@Xp(@Xp0H`x(@Xp0Pp0H`x 8Ph(@Xh0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x0@Xh 8Ph(@Xp0H`x 8Ph(@Xp0H`xˆ °(@XpÈàð $<TlĄĔĬ 8PhŀŘŰ 8PhxƐƨƸ(@XhǀǐǨǸ XȐ4ɐ@d˜4l40XxєѴ TҜҸ@Tӌ,HԈԈDՀ4ְX׀0D|ٴ,@Th|ڐڤڸ0DXlۀ۔ۨۼ  4ܰt\d\l,d XT$t0D8HXh<\|<\|4dDD|$lD<xX8p4h,T|@0xDd  H   $    @    T   L  (t,h8Hd<,hp(`T4`,$@   4 H X !X!"0"##@#P#x#$$$%x&P&t&&&&'0'`''(8())l)*h++,-8-./\/0d001101P1124223(3h3345d56t677D788D889H9::X:;$;<$<=p==>|??@?x?@H@AlAB<BBC4CCDDDELEF FlFG GxGHtHHIJ8KKLhMPN@OOOP,PPPQQ4Q\QQQR,R|RRS0S\SST,ThTUXUUV4VhVW8WXdXYYTYZZ[D[\\,\X\\\]]T]x]]]^ ^4^\^^^__L__``aa8aXaxab(b`bcgh,hThhhiDiijDjjkkPkkllTllm,m|n n@nno(oop0pdppqLqrrTrlrrrrshssstt`txttu8uuuuvwdwxxpxydyzzdz{{|{{|<|l}}~T8p$HdHd(D <X8pDh@d0PtDtDpDpDl8dP X4h(T(T@l,\8xPL8h8Tp4\p4Pl(X 4Hdx$<`|l <X4`| 4P|$Lh(ldX\8`d@l,D\(P, Ltd$Plp\d(tH0ɔ8x8̘8@Π,hϤ,\А hќ4҈ HpӘH|԰0XՈոּL׼P٠lڀڨT۸@X|ܠ`ݐDpޜ@hߐ߸ <l@thxx tH@<  (D +j@P_Bc V  %4 #     S 0k 0  ,( "m : & hCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain DejaVu Sans MonoDejaVu Sans MonoObliqueObliqueDejaVu Sans Mono ObliqueDejaVu Sans Mono ObliqueDejaVu Sans Mono ObliqueDejaVu Sans Mono ObliqueVersion 2.35Version 2.35DejaVuSansMono-ObliqueDejaVuSansMono-ObliqueDejaVu fonts teamDejaVu fonts teamhttp://dejavu.sourceforge.nethttp://dejavu.sourceforge.netFonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. http://dejavu.sourceforge.net/wiki/index.php/Licensehttp://dejavu.sourceforge.net/wiki/index.php/License~Z   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  sfthyphenAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DFuni01E0uni01E1uni01E2uni01E3Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F4uni01F5uni01F6uni01F8uni01F9AEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0221uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236dotlessjuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0243uni0244uni0245uni024Cuni024Duni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C8uni02C9uni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D6uni02D7uni02DEuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EEuni02F3 gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0343uni0358uni0361uni0374uni0375uni037Auni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0theta1Upsilon1uni03D3uni03D4phi1omega1uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0472uni0473uni0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni04A2uni04A3uni04A4uni04A5uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04BAuni04BBuni04C0uni04C1uni04C2uni04C3uni04C4uni04C7uni04C8uni04CBuni04CCuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni0510uni0511uni051Auni051Buni051Cuni051Duni0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0559uni055Auni055Buni055Cuni055Duni055Euni055Funi0561uni0562uni0563uni0564uni0565uni0566uni0567uni0568uni0569uni056Auni056Buni056Cuni056Duni056Euni056Funi0570uni0571uni0572uni0573uni0574uni0575uni0576uni0577uni0578uni0579uni057Auni057Buni057Cuni057Duni057Euni057Funi0580uni0581uni0582uni0583uni0584uni0585uni0586uni0587uni0589uni058Auni0E3Funi0E81uni0E82uni0E84uni0E87uni0E88uni0E8Auni0E8Duni0E94uni0E95uni0E96uni0E97uni0E99uni0E9Auni0E9Buni0E9Cuni0E9Duni0E9Euni0E9Funi0EA1uni0EA2uni0EA3uni0EA5uni0EA7uni0EAAuni0EABuni0EADuni0EAEuni0EAFuni0EB0uni0EB1uni0EB2uni0EB3uni0EB4uni0EB5uni0EB6uni0EB7uni0EB8uni0EB9uni0EBBuni0EBCuni0EC8uni0EC9uni0ECAuni0ECBuni0ECCuni0ECDuni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10F6uni10F7uni10F8uni10F9uni10FAuni10FBuni10FCuni1D02uni1D08uni1D09uni1D14uni1D16uni1D17uni1D1Duni1D1Euni1D1Funi1D2Cuni1D2Duni1D2Euni1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D62uni1D63uni1D64uni1D65uni1D77uni1D78uni1D7Buni1D85uni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Buni1E9Funi1EA0uni1EA1uni1EACuni1EADuni1EB0uni1EB1uni1EB6uni1EB7uni1EB8uni1EB9uni1EBCuni1EBDuni1EC6uni1EC7uni1ECAuni1ECBuni1ECCuni1ECDuni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE8uni1EE9uni1EEAuni1EEBuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni2010uni2011 figuredashuni2015uni2016 underscoredbl quotereverseduni201Funi2023uni202Funi2031minuteseconduni2034uni2035uni2036uni2037 exclamdbluni203Duni203Euni203Funi2045uni2046uni2047uni2048uni2049uni204Buni205Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni2095uni2096uni2097uni2098uni2099uni209Auni209Buni209Cuni20A0 colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9uni20AAdongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20B8uni20B9uni2102uni2105uni210Duni210Euni210Funi2115uni2116uni2117uni2119uni211Auni211Duni2124uni2126uni212Auni212B estimateduni2148uni2150uni2151onethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2189 arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21D6uni21D7uni21D8uni21D9uni21DAuni21DBuni21DCuni21DDuni21DEuni21DFuni21E0uni21E1uni21E2uni21E3uni21E4uni21E5uni21E6uni21E7uni21E8uni21E9uni21EAuni21EBuni21ECuni21EDuni21EEuni21EFuni21F0uni21F1uni21F2uni21F3uni21F4uni21F5uni21F6uni21F7uni21F8uni21F9uni21FAuni21FBuni21FCuni21FDuni21FEuni21FF universaluni2201 existentialuni2204emptysetgradientelement notelementuni220Asuchthatuni220Cuni220Duni220Euni2210uni2213uni2215 asteriskmathuni2218uni2219uni221Buni221C proportional orthogonalangleuni2223 logicaland logicalor intersectionunionuni222Cuni222D thereforeuni2235uni2236uni2237uni2238uni2239uni223Auni223Bsimilaruni223Duni2241uni2242uni2243uni2244 congruentuni2246uni2247uni2249uni224Auni224Buni224Cuni224Duni224Euni224Funi2250uni2251uni2252uni2253uni2254uni2255uni2256uni2257uni2258uni2259uni225Auni225Buni225Cuni225Duni225Euni225F equivalenceuni2262uni2263uni2266uni2267uni2268uni2269uni226Duni226Euni226Funi2270uni2271uni2272uni2273uni2274uni2275uni2276uni2277uni2278uni2279uni227Auni227Buni227Cuni227Duni227Euni227Funi2280uni2281 propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni2288uni2289uni228Auni228Buni228Duni228Euni228Funi2290uni2291uni2292uni2293uni2294 circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni229Euni229Funi22A0uni22A1uni22A2uni22A3uni22A4 perpendicularuni22B2uni22B3uni22B4uni22B5uni22B8uni22C2uni22C3uni22C4dotmathuni22C6uni22CDuni22CEuni22CFuni22D0uni22D1uni22DAuni22DBuni22DCuni22DDuni22DEuni22DFuni22E0uni22E1uni22E2uni22E3uni22E4uni22E5uni22E6uni22E7uni22E8uni22E9uni22EFuni2300uni2301houseuni2303uni2304uni2305uni2306uni2308uni2309uni230Auni230Buni230Cuni230Duni230Euni230F revlogicalnotuni2311uni2312uni2313uni2314uni2315uni2318uni2319uni231Cuni231Duni231Euni231F integraltp integralbtuni2325uni2326uni2327uni2328uni232Buni2335uni2336uni2337uni2338uni2339uni233Auni233Buni233Cuni233Duni233Euni233Funi2340uni2341uni2342uni2343uni2344uni2345uni2346uni2347uni2348uni2349uni234Auni234Buni234Cuni234Duni234Euni234Funi2350uni2351uni2352uni2353uni2354uni2355uni2356uni2357uni2358uni2359uni235Auni235Buni235Cuni235Duni235Euni235Funi2360uni2361uni2362uni2363uni2364uni2365uni2366uni2367uni2368uni2369uni236Auni236Buni236Cuni236Duni236Euni236Funi2370uni2371uni2372uni2373uni2374uni2375uni2376uni2377uni2378uni2379uni237Auni237Duni2380uni2381uni2382uni2383uni2388uni2389uni238Auni238Buni2395uni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23A7uni23A8uni23A9uni23AAuni23ABuni23ACuni23ADuni23AEuni23CEuni23CFuni2423SF100000uni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254Buni254Cuni254Duni254Euni254FSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000uni256Duni256Euni256Funi2570uni2571uni2572uni2573uni2574uni2575uni2576uni2577uni2578uni2579uni257Auni257Buni257Cuni257Duni257Euni257Fupblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxH22073uni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EEuni25EFuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2638uni2639 smileface invsmilefacesununi263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647spadeuni2661uni2662clubuni2664heartdiamonduni2667uni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi27C2uni27C5uni27C6uni27DCuni27E0uni27E6uni27E7uni27E8uni27E9uni27EAuni27EBuni27F5uni27F6uni27F7uni2987uni2988uni2997uni2998uni29EBuni29FAuni29FBuni2A00uni2A2Funi2A6Auni2A6Buni2B05uni2B06uni2B07uni2B08uni2B09uni2B0Auni2B0Buni2B0Cuni2B0Duni2B12uni2B13uni2B14uni2B15uni2B16uni2B17uni2B18uni2B19uni2B1Auni2C64uni2C6Duni2C6Euni2C6Funi2C70uni2C75uni2C76uni2C77uni2C79uni2C7Auni2C7Cuni2C7Duni2C7Euni2C7Funi2E18uni2E1Funi2E22uni2E23uni2E24uni2E25uni2E2EuniA708uniA709uniA70AuniA70BuniA70CuniA70DuniA70EuniA70FuniA710uniA711uniA712uniA713uniA714uniA715uniA716uniA71BuniA71CuniA71DuniA71EuniA71FuniA722uniA723uniA724uniA725uniA726uniA727uniA789uniA78AuniA78BuniA78CuniA78DuniA78EuniA790uniA791uniA7AAuniA7F8uniA7F9uniF6C5uniFFF9uniFFFAuniFFFBuniFFFCuniFFFDu1D55A dlLtcaronDieresisAcuteTildeGrave CircumflexCaron fractionslash uni0311.case uni0306.case uni0307.case uni030B.case uni030F.case thinquestion uni0304.caseunderbar underbar.wideunderbar.smalljotdiaeresis.symbolsEng.altexclamdown.casequestiondown.case uni2E18.case@֚ԴG}%2і}2»}Y&Y@&//2G@GddkY }:Y :  V f   XA W%d]%]@%XA~XA~}|d{dzy@}xwvutst2srqpq(ponmlkldkjkji hgf f f@ed.ed.cXAcbY ba`a`_]``_[%_]_@^]\[%\[%ZY ZY XW%XAWVW%VUTSRSRQPONBNSMLxKJ}KJ}IHGDCB2A@BAF@?-@B?>@?->=<;:9S:98(9S8(76543210/+ /.d-,+ ,+ *)('-'&%%2$#"!-!1 d 2 @:%%:B-B   :    @$--:-  d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++snek-1.1/doc/fonts/DejaVuSansMono.ttf000066400000000000000000012304201353657467200176100ustar00rootroot00000000000000 FFTMo9,GDEFs,HGPOS9GSUBY;OS/2@Vcmapd["@Ncvt  WH0fpgm[kYxgaspZ$ glyfucZ0head{Y<6hhea<<$hmtxGH<`Zloca<V4maxp'd name`!post}Uprep:)=}}uv     ( DFLT&arab0cyrl>grekPlao \latnj SRB 4ISM 4KSM 4LSM 4MOL 4NSM 4ROM 4SKS 4SSM 4mark mark,mark4mkmk:rtbdB &.6>FPX`Rx | 558b" p{h&0  c"c|yz}]j]jbj $6HZl~ P|H 0 P|H <P ,  T`  P|H    x{hhhn  "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\Xd|dh0`tXtX <|00hL( Tplx`x z   ! ! # $x{hhh $6HZl~ h5 h[ h Tl+ h h h \h  vwyz|}~ &,28>DJPV]j]j]j]j]jbj]j]jh|  &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| dt hd8|$|`HLD \t@4H(|XT(lt<0xx_` iFWW@TT[:B`LLL[Z[IWTL4K]l8@^  @bXXXXoM!TxxTT&~O[ XPXD,aDf\Ph< \\\0,0@, d `|tL`00@\  T`@L845D80H <D<x(LX$Tt0TLh0pLh<pl$d`0h8< PLdhx8TR m$v2z`M;)RDhp_)I R|o~4QQSTVu#$ (  d #h 3 3l 6 9m < q     ! ! # $ vwyz|}~ &,28>DJPV]j]j]j]j]jbj]j]jh ^   "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLDhxzOhDh*hDhhhhDhhhvhhVhYDxhVVhxhhsDVhDDDDDDzzzzhhhh6hhhhhhhhhhh46vvvvhhhhhhhhhhhhhhhVVVDD6h6hzvzvzvzvhVhVhVhVhhhhhhhhYDxxxx9hVhVhhhhhhDDhhhhhhhxhxhhhhhhhhhhshVhhhhhhhhhhh 66hhhVVh"VhVhVhhhDDxVhhXVVjhhhhhDDVhhVVhVhVIV$=D]4:IWfoqr "#&36k      | *:  "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~      & , 2 8 > D J P V \ b h n t z     " ( . 4 : @ F L R X ^ d j p v |     $ * 0 6 < B H N T Z ` f l r x ~      & , 2 8 > D J P V \ b h n t z     " ( . 4 : @ F L R X ^ d j p v |  $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| hhhh66zzhhhhhhhhhhhhhhhh66hhhhhhhhhhhhhhh`hhh`hhv`vhhh`hVhhhhV22h`hh`hh`hh`hVh`hVh`hh`hhhh`hh`hh`hh`hh`hVh`hhhhhhhzzzzzzhhhh66hhhhhhhhhhhhh6666hhhhhhh`h`vvvvhhhhhhhhhhhh`hhhhhhVhhVhVhhhhh`6h66hhzvzvzvzv`zvhVhVhVhVhhhhhhhhhhhhhhh`hhVh`2222222hhhh`hhhhVh`hVhhhhhhhhh`h6h6h`6h`hhhhhhh`hhhhhhhhhhhhhhhhhhhhhh`hhhhVhhhhhhhhhhhhhhhhhh  `6666hhhhh`hVVVhhVhhVhhVhhhhhhhh22hhhhhhVh`hVhh`hhh`hVh`hV66Vhhh`hhhhhh`hVhhhh66h`hh`hh`hh`h)`)`YYhhv`vv`v`v`vZ`Zr`rv`v`V>>Vh`hV`n`nVh`hh`hVooooVD`Dh`h88PP>>Vh`hh`hVh`hV`Vf&Vh`hh`hh`hh`hhhVh`hhh6`6Vh`hVh`hVc`ch`h``h`hVssVssVx`xVssV`VhhVh`hh`hh`hh`hh`hhhh`h`Vh`hh`hVh`hV$$$$h`h ` >`>h`hh`hVh`hhhV$$h`hh`h`h`v`h`h`h`h`h`h`h`h`h`h``h`h`hh`h`h`h`h`h`h`h`5`h`h``h`''}{}hhRREE^^rrhhhh??aaiihhhhhhGGhhhhhh6h\aadd55g'ee``66LhViihhh`hhhVVhhVhhViiV11`hhkkh%$=D]4Kjsxk 5<:>BbDHgiqlsu%{{AA        "+12 $*06<BHNTZ`flrx~h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`hhhhhhhhhhhhhhhhhhhhhhhhhhh`h`h`/-3 ntz "(.4:@FLRX^djpv|>DJPV\bhntztwwwwt`~~`~`/ lDFLT&arab2cyrlFgrekblao nlatnx SRB F CAT RESP RGAL RISM ZKSM ZLSM ZMOL fNSM ZROM fSKS ZSSM Z case>ccmpDdligJfinaPinitVliga\loclbloclhmedinrligt   (08@HPX`hX\  l  l   $$XLMLM&   ojp5 5 7 9 ; = A C G I M Q U Y ] _ a c e i m q u y }       ! Rjlu# " "4T' ? E K O S W [ g k o s w {        #VVXXZ^cjlrtu"T' > D J N R V Z f j n r v z ~       "VVXXZ^cjlrtu"   A  A > $  ;  7  5  ;  7  5  O LI LM  & ' (c 33f  &(PfEd@ m`, 4D, 4~!AEM?CXauz~_csV_  :UZmt{? .<[ex{-McyEMWY[]} # & 7 : ? I K _ q !!!!!!!"!$!&!+!.!H!Q!_!""" "#"-"="i""""""""####!#(#+#z#}#####$#&/&&&&'' '''K'M'R'V'^'u'''''''''))))**/*k+ +,d,p,w,z,...%..'t $CLPCXatz~br1Ya  !@Z`ty~?,0>bw{0Th| HPY[]_  & / 9 < E K _ p t !!! !!!!"!$!&!*!.!H!P!S!!"""#"'"4"A"m"""""""#####%#+#5#}#####$#%&8&&&''' ')'M'O'V'X'a'''''''''))))**/*j++,d,m,u,y,|...".."RpvqiWSPKJIHG97) CBA9410+'" m,+)(&  kge_[YXUKIEC;9/-+)'! ~wrqokjifdKDC ~+OGC@2[!;3/.-ݕݏݍ݅ddddEdDd,czp6$   ~b!$ACELMP`gks|?CCXXaatuzz~~_)bcrs1VY_a GI  K  MNOP!:Q@UkZZ`mtty{~??    ,.0<>[!be?wxC{{EFGdk-0MTchy| !7 E=HMcPWiYYq[[r]]s_}t   # & &) / 7* 9 :3 < ?5 E I9 K K> _ _? p q@ t B ] j !!!!! !!!!!!!!"!"!$!$!&!&!*!+!.!.!H!H!P!Q!S!_!!!"""("" )"#"#3"'"-4"4"=;"A"iE"m"n""""""""""""""########!#%#(#+#+#5#z#}#} .## /## 3## 7## 8## L$#$# N%&/ O&8& && && && '' '' ' '' ')'K 'M'M +'O'R ,'V'V 0'X'^ 1'a'u 8'' M'' N'' f'' t'' u'' w'' x'' y'' )) )) )) )) ** */*/ *j*k ++ ++ ,d,d ,m,p ,u,w ,y,z ,|, .. .. .".% ....   "'  R    pt $v ) ZZ p֣     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a%rdei'xpkvjd0shigw%#8l|cn,TLm})b!" :v34 &y#+gyquvwzzxhf 7X!uu9!{Xm{o{RoZ!=fs +b#1N {T\q#w`j#fy```{{w`b{!{RNNfffHF?{L'oo5jo{-{3=foD7f}s, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-,%%I%%I` ch #:e:-hh/10!%!!hsr) @ <2991/03#3#qeR@1<20###Ѯ++J@0     91/<<<<<<<2220333!3!###!5!!5!#3hiiThiih)T/hTaabbNZ /d@9($)%/%$(!$, ( 0<2<1/299990>54&'#.'5.546753.'n|phumdfbdcӿdOTUPDNtd]gp^Vd-.)>B+/Qš ! *9V@/7(" "7(.+  % 4  + :99991/9999032654&#"4632#"&'%32654&#"4632#"&iNMklLNi@s..2H#)iOMllMMk@u--1?NjkMMljO0./t?``OikMMkjN0--uA9*7@b  -,.+2345617B7 1 +"1"!% (! 7+!(!(! .899999991/9990KSX999Y" >54/3#'#"5467.54632.#"3267>7#'&JKNSj抋20ǭAF;}Eap:6\[ț*\,#1h F'XmFD ̉dHG'%[M;I\ 10#+u @  29910#&547u;:\' @  299103#654\<<J+N@,       <2<2991<22990 %#'-73%+f9s9f9PsPbybcyXqy '@    <<1<<0!!#!5!CDDD/@ 103#Śc/dm10!!d 11/03#1fB7@ 103#ymL # @  $!"!$10@////////// / / ?????????? ? ? OOOO O ____ _    F////////// / / __________ _ _  $]]4632#"&"32'2#"M68PO98K7PP78NL0670xx~F &@ ## 1/20%!5%3!!:P6ȪuLJժ#Q@)%%B   "$91/20KSX92Y"%!!567>54&#"5>32uu5dF[pga Yd8ժ.>zO}BC12`tA7(G@)  #)&" )9190#"&'532654&+532654&#"5>32ggfbYhyI'Ǖ&$54zms{(( ۵{fo B@   B    $<291/<290KSXY" !33##!5)!3d-=@"   "190!!>32#"&'532654&#"+W,wN\aQFժ 21%%L$=@#  %"& "%190.#">32# !2"32654&?M0n#J݁%'dkuzl75@%%B"991/0KSXY"!#!5V+N #/C@% '-'0 $*$ "!0991990"32654&%.54632#"$54632654&#"hʁ򑁖Myz{yŗT!Ѳ!!ȟɠbx~~xzF $;@" ""%"  &%1902654&#"532#"543 !"&T?M/nI%'!dk  os'@ <21/03#3#'9' %@  103#3#Śc /Xyw!@('29190 5yR!÷X`y@ <210!!!!X!! BXyw!@('<919055X!R^^="{@B  %%B !    ) #99991/9990KSX99Y"#546?>54&#"5>323#=TZ>/mNb^hC^XE&bRY;X1YnED98L\VBT=/s 4p@1(+$ 4 '$+1+5' ( + . !+ -.5<991999990@ ]4&#"326#5#"&5463254&#"!267# !2kkkk%RӡP$J6l90?{:]x<!o?DF=?z% @A%%%% % % %  % B   / 91/<90KSXY"]@    ]]!3#!#hnl#+{q =@#   21 0!29991/9032654&#32654&#%!2)qﰖ뒃JF{f>p}qdƵϠ1.@  2 10210%# !2.#"32671M[?[MJVXI5))pn))=@@=R(@  2 1099991/0% 6&!# )`dVDѦHKw/N )@  13 21/0!!!!!!vTrwժFX $@14 21/0!!!!#o\eժH7fP<@!   6251990%# !2.#"3267#5!PQv@^PQ_ſCe){KMon56MI!H &@ 1 0 221/<203!3#!#)d+9 %@ 77 221/220!!!!5!!=99ժm,@    51990753265!5!#"&m[hqG`=QQD, @!% %B  0 291/<290KSXY"]@L&&6FUWX dzy{ ',+&:IGG[WXXWkzx]]33 ##wVhs@ 141/03!!dժVy @,  B    / 0 91/<290KSXY" ]@$  &)&) 6968  ]]! !###V+'F m@B10 991/<2990KSXY"]@&)&8Wdjuz &)FIWgh]]!3!#3+3u\ #@ 2 62510#"32#"32IIz~u+@  2 8 3291/032654&#%!2+#ꌝL/ϔu\=@   2 625999919990"#"32#"32ȗyHdIj@8  %%B     21  0299991/<9990KSX9Y"#.+#!232654&#NnRٲM{cݑohy]ҔYJ'@=  %  %B %( &919"0(9999190KSX99Y"]@ ]].#"#"&'532654&/.54$32\^mjikshulм V;53#"&'.  yVWx! 9FBjiCE:= m];<<;\lh?;::;>9L@)%%%%B/091/290KSXY"%3#3h_KKѪ++ @D    %%% % B    /91/<<90KSXY" ]@^ //+ ??8 ZZ  &*%*(+ % & 5:5:;: 4 6 TTZXWV[[RW X ] gh yvy v #]]333# #ŏӬ߿ʿD"+w @K % % % %%%% % B   ;/; 0 91/<290KSXY"7]@8  '()& X xyw !%+% 5UYX es]]3 3 # #VHNAu3B}%Y@.%%%%B<< 9991/290KSXY"3 3#%lk!mb E@%%B/0 991/0KSXY"]]!!!5!" ՚ow@=210!#3!XfB7@ 10 #%mZ@=210!53#5XޏH@ 91290 # #Ȳu-m/10!5/mPPf%@ <1K TKT[X@8Y0 #fx#{ )n@*  ! $   D >*22991/99990@00 0!0" ]#"326757#5#"&546;5.#"5>32=zl;^[fX=& 3qpepӺ)Ld_y64''RR2X 0@  G F221/9904&#"326>32#"&'#3,fd./xRXWS%{/@   F210%# !2.#"3267%JR%QNI]`A9++88*,A:;>{0@G H221/9903#5#"3232654&#"Z.deCSW;7W {X{E@&    IH991990!3267# 32.#"X㿮Xmi[ ^Z89++9 @Ţ'4@     <<2991/22990#"!!#!5!5463'cM+Qgc/яN{H{ )H@' '  $(*' G!H*221999904&#"326#"&'5326=#"3253ZLSbC,ml/9.,}^\::VZ,@  J  F21/<990#4&#"#3>32jq1sJ`cD .@ L LK <<1/20!!!5!!3#mnm`/BCV 8@   <2991990!5!+53263#XZZӜ} @:  B  DE 291/<90KSXY"]@R546Ffuv ('(;;797JIYYkiiiyxyy]]33 ##Gb{ZFB?  &@   L 991/990;#"&5!5![Y饵|~mo{"@'  MNMNME#K TKT[X8Y<91/<<<299990@G000000 0 0 ????????? #]>32#4&#"#4&#"#3>32"iJo5FP;9JI9!c?LeHEws{p{``32jq1sJ``cH{ #@  D>10"32654&'2#"hڜ-.VT{3@ GF221990%#3>32#"&4&#"326w.df SWWRw 3@   G>22199032654&#"#"3253#L-ed.+SY7:WSj{O@   21/990@%  0030@@C@PPPP].#"#3>32;zI.Dv6y.*`w"${'u@@    B %( OI"E(99991990KSX99Y".#"#"&'532654/.54632OS}{\JSjgTzEZ9..QSKJ#}##55cY1!1@  <<2991/<2990!!;#"&5!5!f^^uϪ+|b`>^,@    JF21/2990332653#5#"&økp1qJyaddm`e@)BIE91/290KSXY"']@%]]3 3#dEFr`T` @E      B    /91/<<90KSXY" ]@      &&)&))#, 96993< EI F J VX W Y fifij e vzx| r -   ++>>< H Y jih {yz|  ]]333# #àö`wBfL` @H      B  IE 91/<290KSXY" ]@ fivy  :4 ZV ]] # # 3 ^oo)'`?HkhV`@E       B   IE9129990KSX9Y"8]@v  &&8IIY ]]+532673 3Z.Gc".\mQ\GOLGhu:NN^Nlb X@BIE 2991/0KSXY"8]@68EJWXejuz ]!!!5!-}bܖ%$f@5 %   !  % $  = %<<29999999199999990#"&=4&+5326=46;#"3@k>>j@FU[noZUtrݓWV10#$j@7%   #%#= %<2<9999999199999990326=467.=4&+532;#"+DVZon[VD>k@@k>XXrtݔXy &@  '1<2990#"'&'.#"5>32326yKOZq Mg3OINS5dJ t]F ;73 !;?<6 7=` !@  <29910533b)eq%!N@*   " E"<<<2212<990.'>7#&5473%C??BI9gg9ބ5(,-("9="+` 츸X>@     <<1/2<2990.#"!!!!53#5354632D>Cs3A,,ُ/яLB /@ (-  * -'! @') -0)$ !'$* xyx( $02299999999912299999999904&#"3267'#"&''7.5467'7>32d|[Z}}Z[|Z^.[20`0\^.[3.^Z{{Z\}~t]1]02[-^Z3].2]-_%@D% % %%B  < e e<<2<299991/2<2<290KSXY"3 33!!!#!5!5'!53%lkVoqZmo#o o#o!<210##  = 2>j@<#$93 $*0?#54&S9akԂ[]=:̭IWW9fqր][<;ȧH>=><''PGZsweZ54m@''TLf{xf[1,pE-Z/L-Z/L?F@aa1<203#%3#?}N1ID@'  &>>2J\ ^,8 8YD/210.#"3267#"&54632'"3267>54&'.'2#"&'.5467>`:o:u8g24r=г=rjKKMMKLijLLKLKKkZZ\[[[~}[[[\ZZ/lhȬJKKjhKLLLLLijKKJgZZ[~}[[[[[[}~[ZZ %)d@6  (&&  #*& (' j kji*22999199990"326=7#5#"&546;54&#"5>32!!|WHi1Rwu3}CD?kdPDN@Ms=@pABtZ\#! {w# /@    v v<2991<2990 5 5L-+-+#RRXsy^@ '10!#!X!^?dm10!!d }N4L@I  ] ] B   A)5)M  \\ [G#X;#Y//29999129990KSX9Y"2#'.+##32654&2#"&'.5467>"3267>54&'.XXP:&rk1=-7ffZJJDZZ\[[[~}[[[\ZZ~jKKMMKLijLLKLKKLbeG]C;P*T6?>5VZZ[~}[[[[[[}~[ZZgJKKjhKLLLLLijKKJ=b10!!=V+u @ STS 102#"&546"32654&hAu,-/OomOPqp1.-rBoPPlnNOpXy.@    <2<21/<<07!!!!#!5!X!dCDLIB}a@WWBA     @9991990KSX9Y"!!57>54&#"5>32eQdR1q?Ay;Jwrnaz3=L$$}k9wuF(\A          @#) & )99190#"&'532654&+532654&#"5>32^c:r;Eq-evnmBJ]b`W,p;Eu2X`lP|yQDJLl?<8?yvcG]f%@ <1K TKT[X@8Y03#fT` L@*  !   JF!99912<9903326533267#"&'#"&'øxo ! &D">K .Y\,T H;8 OOPNLPj; #@WW1 9120!###.54$FfNݸ/`103#`u)X 9A      @  aW}a 12035733!j c)t'+n 3@   jkji9910"32654&'2#"&546!!hfssfeusgʫ˫\{u༻߻`{\# /@   vv <<991<2990 5 %5 +-:+-#^R^  ^R^  Z{'BV'{ Z{'{& tVZ'BV'u p`!%@G  %%B! "$ $&# # )"#&999919990KSX99Y"33267#"&546?>54565#53%=TZ>/mNb^hC^XC&ϚbRY;X1YnED98L\V@T?%k&$ u@O ]1%k&$ u@O ]1%m&$ u  +@ /  ]1%^&$ u# +@O#@]1%N&$ u +@p0? /]1%m !@W % %%% %!%! %!! % !B     !  PPK/K!"2299999991/<9990KSXY"]@  ]]4&#"326!.54632#!#Y?@WX??Y:Arr@;nlZ?YWA?XXP!yIrrIv${g@7 % %%%B    c /<291/<20KSXY"!!!!!!#!3eex5ժFժu1&d&Nk&( uNk&( uNm&( uNN&( uk&, uk&, um&, u  Ic:1N&, u+1N ;@!    21 0 0<291/220 )#53 6&!#!!VD}}/`ŕ{HK+Fb&1 y"+@O"@]1u\k&2 u@O]1u\k&2 u@O]1u\m&2 u +@ /]1u\^&2 u 0!+@O0@!]1u\N&2 u +@p0? /]1;T .@     <91<290 7   ^t^_t\t%\^u^uw^ +k@:+)&  *&&, #* #)+262#5,999999991/9999990324&' .#"#"&''7&5327sT sV)+y=g %s9d/NZIn-QUPeQzQQFIRPJ=k&8 u@O]1=k&8 u@O]1=m&8 u $+@ $/ $ ]1=N&8 u$!+@p!$0!?$ !/$!$]1%k&< u@ ]14 @  28  32299991/032654&#33 !##ꞝL!󄃃}/V@1-'!  **.  !' $'$-DF099991/9904632#"&'532654&/.5467.#"#7C:oEBL;lAxC\[yqyrq|d1M*%]taQG_J'8O#kr#f&DC#f&Dv#f&Dg#7&Dy#&Dj#&Dw){ C@I=70 6 %C "76. 3@:("D%=/.M/u MCM6+sD299912<2<2<999990@ 05060708]5#"32654&#"!3267#"&'#"&546;54&#"5>32>321xYS\JMWWLepO27Gn 'aȿuc^8>M<[|%!YHZqYa4+#"33)+RNPPXx+'#!?@=Bu%{&hF{Xf&HC{Xf&Hv{Xf&Hg{X&Hj@@]1Df&CDf&vDf&g @@ 0 ]1D&j +1H)@O B $ *'! !'D! >*999999199990KSX9Y"#"32.''7'3%.#"32654&Ŷ"#!H&!!#R-:/(  (-Y,\bPȑ^b n7&QyHf&RCHf&RvHf&Rg+@]1H7&Ry. +@ 0 ?. /. .]1H&Rj +@ p_PO@]1Xyo '@ w <<103#3#!!j!/ +s@>+,&  )&  *&& &,+,* # )#D>,99999999199999990 32654&'.#".5327#"&''m1$eA H#cC')d<]*,g9\ //4o0.0tGGq.78MBz;32#"&4&#"326w.dfSWWhV&\j%0& $ +@ @O /]1#&D%m& $+@ _PO@/ ]1#H&D%u'x$ur{'xYD1k&& Zu%f&FvZ1t' ~|&%f&gZF1P& K&%&KF1m&& Zu%f&FhZRg&' o{ ' :G @8@]1N{$H@ "  @"   GH%<<1/<2990!5!533##5#"3232654&#"Z1.de5yySW;7W N0& ({X&#HNm& ({XH&HNP& ({X&HuN'x1({uX{'xHNg&( $o{Xa&Hh#fPm' u*{Hf&gJfPm& 2*{HH&JfPP& 2*{H&JfP'*{HN'.JHm' u+ +@ /]1m' uKKQX@8Y@p`O]0?@!     1 0<22<221/<2<<2203!533##!##53!5*ʇʆ*9QF?@"   J  F<221/<<2990#4&#"##5353!!>32jq}}a1sJzz`c^' u, +@ O@ ?0 / ]1D7&y0& ,+@O@]1D&m& ,+@O@]1DH&u&,xFuD&LxPP& ,D` "@LLK 1/20!!!5!!mnm`/B =@!   "!221/2<220%532765!5!#"'&!#3!53#=Ga'&HHAA@-]@QQJKDuuêK I@&  ! <<<<1/22<220!5!+53263#!!!5!#3#ZZi,+뗗Ӝ}/BCmm' 0u-Vf&g&j.'N` @9  B  DE 291/<290KSXY"]@R546Ffuv ('(;;797JIYYkiiiyxyy]]33 ##Gb`/ZFB?sl' v/@ ]1 l' vOKQX@8Y@O]0s&f/ &Os' m/' Os'y`/'yOs 7@   1 4<2.9991/903%!!'7;NwdPo;jnL >@!    <<2999991/9990;#"&5'!5!%[Y饵P{;Pu|~$o/nFk' !u1m&vQF&*1{&0QFm&1 *uf&Qh&Q{aIV=2@  1021/90+5327654&#"#3>32=YZͧZ-,t|6~ij>>WotV{ 2@  JF!21/90+5327654&#"#367632YZ͹Z-,jqFE1TTsTU6ij>>~ʗ[\``21qpu\0& 2+@ O@/ ]1H&R+1u\m& 2 +@/ ]1HH&R#+@]1u\k& 2Hf&RH;@     -299991/220%! )!!!";(RH=MKF{ 8i@92/ & 8   #5/)#92& MuMCM,s9299912<229999904654&#"265&#"!3267#"&'#"32>32PVWMfRPhgPPcpP/;}Jb04TY/%W & +#T53+)CBDA88>A>Ak' u5jm'vU&r5 {&Ug&5 ojf&UhZJk' u6m&vVJm' u6f&gVuJ&6u{&VJm&6 uf&Vh/u&7u&yW/m&7 u +1~&W /-@  : : <<1/2<20!!!!#!5!!/s-  +ժA@B@!    <<<<2991/<2<2990!!3#;#"&=#535!5!f^^uϪ+|b>=^' u8/ +@O@ ]17&yX'+@/ ]1=0& 8+@ O@/ ]1&X+1=m& 8+@/ ]1H&X+@]1=m&8w g&Xw=k& 8f&Xe=&8xu^&Xxt' |:+1m&gZ+1%t' |< +1hVm&g \%N&< u +1k' u=m&vV]P& 2=&]m&= uf&]h',@   <991/990#!5!546;#"+cM=яNQFX%>32#"&'##53533!!#&#"32y,fd.{{aRXWSzzc)?@$   2 !$'+9291/9032654&#32654&#%!2)"#546xxtB>d{f>p}qdƵϠ/Wp1FqJX>32#"&'#!!&#"32y,fd.RXWS0 327654'&#'3)'KKOO{e5Fq>=DEdgh=< !&#"32>32#"'&'#'҈FDDFl,fttttdLL.zYmnnnRRX랝+,S|1/@21 <1@   0>3 !"&'532#"M[?[MIXVJ))gj))=@0230@=<g"%# !2676;".#"3267M[?ZO*ZT3,JVXI5))p*32j>5F=@@=^s!%# !2676;".#"3267JR%FC=ZZ-,I]`A9++8(8rGj>>~A:;>N3 !#"#546 6&!#FVD6<0c//&r1FHKwN#";5!! $5476%3羽EF5e{ɉ{+ˡd4 32654&#"5!#5#"32_.df,T}SW;7XR=G{ 7%2654&#"#"/532376?654'&'&'&'&32h(>vwf2BFKI I<' )iy|{L (=\RR $+.! -&N +@ 1 3 21@  /0!5!!5!!5NwrT+u\=@ 26 25991@  9905!54#"5>32#"327uVJM[׌~ S@=))yz~#7(>@  22&0)1@ )) #)90.54$32.#";#"3267#"$546IyhYbfgg"{ (({smz45$&Ε?V!!!!+532765| YZZ-,ժH#ij>>~V'$+"!!+532765!5!547676;'a'&QRF1i&&(W%6MI!RI ! 5 3 3325D`H&0tt?uo+EA&#767653#"'&54&#"#367632"&76/JI_BG}MKUv14IBe``  1:!5!!;#"'&5=,-Z٪\Y+z=>jf!!3!!#!!5!!5!!= 99ժi@n67632'&#"##3i~\/j!-<BmV c3r%3sh5476;#"33 ##YZ͹Z-,Gbij>>~ZFB? ;#"&=#53!5!;+[Y饵 |~ĎɎ1m% # #''3C\P"Pn@Jo |mo"%#"&33265332653#5#"&8"iJo5FP;9JI9!c?LerHE! s{ p{+`=R{#4&#"#3>32jq1sd``cu\  32'&#"32767\:DC; 9CD8 z~{{vu'y2 {'R-%63273# &#"327-N5>o毴o8=yy=Y+͠v~^VR{ 763273##"'&7327&#"VPeo~簵noVAA( /s%+n+͝u"mmB8!+#"#54763! 27654&+Vn]6<0``~'R@]M//&r1FRQE8DVT*3265'"#"67232#"&'#76;#"w" . [f,?N͹ /2FIWS.O#.+#33232654&#N76SٲM{cݑ77hy]ҔYJ'>323267#"$546?>54&#"iV luhskijm^\''Ƞ/ vp{DI--յ1#hcq<;{'>323267#"&546?>54&#"PZڒEzTgjS썉J\{}SO9!!1Yc55##}#JKSQ..xmvV[!&'&#"3;#"'&5# 54!238!n|wx'%dQW/R5-0A3=g)(V\`@oV !!;+53276=#"&5!5!f^^uYZ͹Z-,(Ϫ+|bij>>~`>/&#5463!!#ŃF1-/7&r1F+!!;#"&5!5!5476;#"f^^uϪ*YZ͹Z-,`|b`ij>>~/V!!;#"'&5!/s-,-ZߥZY+ժ~>>ji? '8v'q'|XdJ##"47#5! 54'5{no{x4xn8!L IL*!"'&533254'3\Z,,Zxznjf?~>> ILɸ#367632'&#"kSHcm.-PKG "(3t*b7m*9 Vm+5326?3 67632'&#"nQGJ|lLT3!;^2Q+31705+h:=HTN~) )!3!#!!5#5!!uP" "v՚i@5b!!!#!!5!5!!-8YbҖg 7654'&+5!5!2! $5dc{dd\^rhbVPKKKKIJG8+lh3! $54767635!!#" 76RUci r\\dc{dd݊hl+8GJIKKKK}LT` 5!!#"3267# $547676peje]\dcmTjdc^QVbܨ JKKK21%݊hm*8V$` 2767# 4%$54#0!!5! TMOQWPVa ejo0, 5%b|8d1a# 6323#!!5!5!67654'&#"п -"BP8u~i9Dc``JU?T<>< % 7654'&#!!!!2! &53h<= \^G/"icUPRz,ʞ[+3IJ I8+le[tG)}LT` 7654'&#!!!76!"'57?\]ȨgcUQԪ-5IJ,39+lhJc 4'&+#5333#!"'53276MJY>lunc9rO_}nw~FVrA}Vg{#36763254'&#"64QҸMNr98xܭz BR1pqWBA3#+9'6-3!!!!#!5!5!5!^^``l%m&$ u#f&Dhm&, uDf&hu\m&2 uHf&Rh=m&8 u#+@ /##]1f&Xh=' &8j2&&Xq<=' &8 &&X<=' &8 &&X<=' &8 '<zW{%' 'j$#2'q<%'j& $#2'q<0' )&fPm' u*{Hf&hJm' u.m' uNue\&x2eH{&xRue\0& eH&m' uy}LTf&h8Va&h#fPk' Zu*{Hf&vJ=%2763#"'&5!#3!3m6!h9Hն+ROf'MSb9du'Fk' u1f&CQk' u)f&vk' u/f&v%k& $#f&D%m& $#H&DNk& ({Xf&HNm& ({XH&Hk& ,Df&m& ,DH&u\k& 2Hf&Ru\m& 2HH&Rk& 5hf'Um& 5jH'U=k& 8f&X=m& 8H&XJ&6{&V/&7&YW}RT. 56$>54&#"57>54.#"5632 4o1\}p_s54&#"57>54.#"5$32Fp>!BlJc(v];?"AW?-1CA#E ptgDZX%KlaF='.`[b[3XpVU 32=t|6~kWotl(1%7276"'676#"'#7&/'&'&3232654&"m B{ rhG0wD &8Md\]P{#looԐ>>t#O9 Y%Z5H7WSCTV!!3+53276=!5!"YZ͹Z-,՚o*ij>>~Vb!!#+53276=!5!-}YZ͹Z-,|bܖij>>~%%P& $#&DuN&2({uX{&2Hu\' 'j2H2'q<u\&2' jH2'q<u\P& 2H&Ru\'j& 2H2'q<%0& <hV&\l %7276"#7&'&5!5!676#" B{wD3' rhF>O9aJwt#jlf{.%7276"'676"'#7&'&=4&#"#3>324 B{zgG1wD3'5ZI9!c?98>>r.O9aJs{``>t#O9aJ;>V` ,@   991990!5!+5326XZZӜ}xY12654&"&#"32>32#"&'#5#"323QSSQPQRRQP]=zz<\o\32#"&'#QSSZQPPSSPP]=yz<\o\GJR\D%QM((_]q"! ^`A7S]++ L8 rMq;> 3!!!!!5! d iA!#!5!7##'-.d'Jug[|BJ8jF{5.#"3#"'&/&/5632654/&'&54632OS}{\Jvh*L'TrGY3e2{zD>zEGIZ9..QSKJ#}^R ~$=&[5#`cY1!GJ!b!;#"'&/&#=!-j1 *L4[TrGY=Zb ~$=&[?%7"#5463!2##326&#v6<0~'ʌ//&r1F q(!2)#5332654&#32654&+3F뒃ﰖƵϠn,>p}qd?{ƕ)533!33##"&'.=)3267>5~9FBjiCE:  yVWx! A?;::;>`m];<<;\l9 #3#i++!!2#.+##5332654&#LN76SٲM{cmˉҔ77hy]w{.#"!!##533>32;zI[M ܹ.Dv6y.*l\<Ĥw"$8{ )32654&#"3>32+3267#"&'.>zl<^\fX<& +qpepӺ)Ld_y64''RR2{{0@G H221/99053#5#"3232654&#"Z.deэSW;7W Wy 0@  G F221/9904&#"326>32#"&'#3.de,-xSWWS^X $9@  !G! F%22991/04&#"326>32#"&'#46;#",fd.̸ZZ/xRXWS~Ӝ}}{0@ <1@   0>3 !"&'532654&#"JR&PNH\`@%++*,A:;>s:{!)47&'&!2.#"63 !"'3254#" 90%QNI]cU-RG+>jiáS,+;7W{7 &32654&#"%5476;#"#5#"32;mjkookjDGH8H$#${PϳQ{#T ij>>~SW;7WSzW{432!"&'5326=!7!.#"z [imX^^"++98ȷzW{?@ I H991@  9905!54&#"5>3 #"73267zXmi[&Z89++"Ƣ{ )%654'2273;#"&5 '&'&'& 56BL+>w9P!1jcGF:“֊>8E#ZuaQ`vg("chV({09@ 22&%!*2 &.F110&'&54632&'&#";#"32767#"'&546wA@Q[\ihWVLHHZ[c[[MaZ[V_A@^  VJ=+,nQb54"[\m({(<@! #)) )& )190#"&'532654&+532654&#"5>32U`LdKhiP_m"#ibQnW=JV^8{B#"&'5327654'&+5327654'&#"56763273;#"'&55c88hh@H9DDKCE@?qv|f6688h8AANODE<[KO 0A=1_JJm\["45bQ77,+=J++  OAf10`ZȢA"y( !27654'&+532764&%632#"'$Sv<;;!!;yUkbbkˠU^A;;LL67ss.gg=XVq^!+53265!5!!5!qZZh(Ӝ}}ؤg {H4&05476;#"#"&'5326=#"43#"326HH1:hh>CO6xn#{XЮmssngn^ ij>>~.,}^\:<bH4^ $!"326#"&'5326=#"4763!|LSbC,muq9b.,}^\:ᥟzX %#5!#"!2&'&#"32BHXN,>hhxpVHdbbd">:KMrqfqrfQk^".5 3 3265+]ܞ^+ r.$a32#4&#"#5476;#"}2rjrZZκZX `cJij|~V(>32+5327654&#"#5476;#"}1rX[̸[-,jrZZκZX `c6ij>>~ʗij|~23#!!!!!5!!5!! bnnl~ ˏ5i ^!#"'&5!5!; ̦ZXXZjf;8~|2^ !!!!5!!nnl^BXy&;#"&=&#"5>32!5!3267#"'.H>ꤶ./OINS)&r\FJKOUi(? ;?<65=>;7-4 ;#"&=# 5432!5!3#'&#"3[Y襵>5*GN\|~ܽ󠠄K9V  ;#"&5!5![Y饵|~(L-;#"&5#5!!2#"'&'532654'&+5!HHTgOE@KOPUCWJJX|~A$8+lh%12KJhj^!%#"&3326532653#5#"&2"hJn4FP<88 d>LfpHE!s{p{`LfpHE!s{p{)32+532654&#"#4&#"#3>32"iJoSN5FP;9JI9!c?S,5HEcԜ|~s{p{^^@;#+VM{+532765367632#4&#"{5D1DCWVV\^oA@01re22wx\__V{ 4'&#"#3>32;#"'&./]p@A2XVV?4<>OO__^edwxH10``A{ !3!##{yyH{  #"%"!&'&!3276ߌH?7?H4HH4{-m__mOmmOE`!!!!!"'&763#";d~~~~ KKKK`hghi&{.4'&#"3276=332#"'&'#"'&57!29PHJ|")u) }07_CC_vD8@jxZqosO++Oz2ee2z| VH&/#5!#3!535&'&76767654'&_|{_hd{{dE,HH,O1HH1ouu{{BnmBHImnI^732653#5#"&';zI.Dv6.*+w"$732653#5#"&';zI.Dv6.*w"$fV^;#"&=#"&'532653YZNb.Dv6;zI}}w"$.*+jV{.#"#3>32;zI.Dv6y.*)w"$jV{;#"&53>32.#"#,,[.Dv6;zI[[}?>rw"$.*ll2{476;#"!!5!RRҼj&$pnhb`022{!!5!4&+532jnnHlдRRV``bzW^!#&'&+#!2327654'&#7545â?;;alkpw?@@?w 66^q$%'^NMi++ST**zW^!#!3327673327654'&+jpkl|a;;?î545(w?@@?wSiQP^)%$q^667**TS++V{8.#"#"';#"&=327654'&/&'&54632N[DF20@RRz|hj&"nfdbbFF24@LLf?((**T@%$!*MLZ[705-,QK((%$JK}VT+5326546;#"ӳZZcMӜ}}¸Qg}VT!+53265!5!!5!546;#"4ZZ=cMh(Ӝ}}ؤiPQg}VT^;#"&54'&+532'&cݳ--Zg() |@>vV[!#"327673## 54!3476;#"8tn!ʷ5RWQîd%'3A0Ǜo@`\V()g+`!5!4&+532!!H^^uϪ+>`|bW!!;#"&5!5!f^^uϪ+|b >`!533!33##5#"&=)3276:CYYu>>|WMĤ45wEioabdo?ܤdqnܑkmhAw` !+"'&5#5!?27654'&'&UBr86FRQS&(g3XXBO\Ldqn``;612abdw7,H`!# #3T`` !# # #33”­jj`jH >;#"# #4N|lLT2"zHTlfk}3 3#f%.]}8 V`!!;#"&=!5!;4z `ۧ10%*`!#47!5!5!332!'3254#ejL<FX3<;4% 6[}LT` 2!"'&'5327654'&+5!5!ajbVQ^cdjTmcd\]ej8*mh%12KKKJiLh`$- 76654'&+5!5!2#4'07&#"327* \^ejeidTQ'd( }ŃcL;*1JJ$8+lgqUeR8y*K/K327654'&#"56763 #?W::fPONNLQQUmlprLbAr+#}swt#&'&5476!2&'&#"3ʪplnUQQLNONPc9:Vws}#+rAbLr3!"'&'5327674'&#˪plmUQQLNNOPc9:Vtws}#+rAbLrJ#476!2&'&#"32767# '&5nUQQLNONPc99cPNONLQQUn>}#+rAAr+#}_-sB (47632 7 654'&#"47632"'&_ԚO̵eddede"!/."!B^!"5Ԝ0ٍccƍffff.""""./B!!} -@   F!21/9032654&#32654&#%!2#!]_Z^UTTVeb`sci?\dU?.Vi}u"y+";#"3$''"'&5467.5476322s9@< <@7uTxVddjbbjdd6=76NJ@6sx>WVggWV6l0%#5!#"'&76325476;#"#&'&#"32t:{}|3H >ws}#+rAbLr #26&"3!!!+5#"32deen a^!;8NN8:j+^Lۓa31DD10ML C3276'&#"%#5#"'&76323!2#"'&'5327654'&+5!22XW3223WX2o#55JzLMMLzJ55#o ?M;319;<@3xAr;<78chqjtssttss_3d0110d^L$8*mh%12KKKJ6 ,326&"!5!332+#47'#5#"3233254#dees ai$\\#jKyyKj#n0 h*5j 3.#"#"'&'#"&5#5333#;532654'&/.54632/e6RR;Y%w026:8>qaQQo-Ek>v;NTj&g[{=l?((TT@I!,KL!&`>NM55YQK($)$V4%.!5476;#"+53276=#"'&5#53!3A &'p.6@3632&'&#"632#"'47&'#"&5#533254#"&57#3uZ310.///0l;;;2v1+\!raQQ$-WO=MT-E‚#+qrfr9DhT"2`>9KiNVH3+5327654&#"####53546;#";67632G11l?KJYhonjjhqij;/m(56Ft<;H``01/яNPhce22wx%7&'&#"#"'&'#367632327654'&/&'&;>ABgf$&n/<>][ALODKTLDCKEJIa54%"092?)TT?&$!,KL\[&:MV3-+RK(#*$JA 3!!!+ۊqvLۓB 333# #333# #ttttU=B!#!#!#!#kkUXrXJ 4&+53232653#9O%5zpcęaBþybV "32653;#"'&'5#"4'&+532Zgo0>*m/2O?*mbþyf\gę10A @ 32tNN^luu)qJy}wYYk\g88A3>32#4&#"#5476;#")qJy}tNN^lu43rB98wYXj\1Sw66WU 3+532653#wtgr,B0ttxlX6Vr8.#"#3>327.bjtt%uT  qksa97832653#5#"&'.bjtt%uT  qkJa97Q32653;#"'&=#5#"&'Q.biuB-r33$vS  qkJH VX66x a970!+33276?3327654'&+CGDDuj=%%(f{n!!!|K((((K|N;[--s?5/.B 333# #tt+5326?331]O\D05 {{bpEW(K/itf--452654DŽ@XX@rPPPP=>X@?X=>POPP"'&4763"3tPNNPt@XX@PPOP>=X?@X>^s327654'&#"567632#(y6$$>q31210336WEDGkM@*7K$@ ` XFh_@C^s#&'&547632&'&#"3kGDFV63301213q>$$6yMAmC@_hFX ` @$K7*@)f7@  91290K TKT[X@878Y3#'#f)f7@  91<90K TKT[X@878Y373x$@1@0#+=b$@1@0%#+=/yX0CbyX0v#!!heJ'#!heJ#c#d>U 533##5#5uJu!5!J>ߖ/)HDV{ W @  P{P10K TK T[X@878YK TX@878Y#"&546324&#"326{tsst{X@@WW@@Xssss?XW@AWXu"  @  |1/90!33267#"&546w-+76 >&Dzs5=X.. W]0i7@!   PP99991<<99990K TK T[X@878YKTX@878Y@?       ]'.#"#>3232673#"&d9!&$|f['@%9! '$}f['@Z7JQ!7JQXfs%3;!"'&5k&&iWRd10`ZȢ% '&73733256/MMV| ;#"&5#5!88hr.EGWwl:Q[v/).#"#"&'532654'&/.54632P1j8WV>](}248{D@}=RX o)k`@q a//$)*+MWfk2-*SIXa #'#37 ͉H+^s#&'&547632&'&#"3kGDFV63301213q>$$6y[AmC@_hFX ` @$K7*@,X!!5!yЈ,X!!5!34,X3#!5hh,X3#!54,X%3!5" DfCfv)fg7y=b10!!=V 7/)H @ PP1<0332673#"&/w `WU`w HLJJLD@ a103#?Fj82#567654#"56J24C1xZ@Vƪ@$C!Xl05^ V{wXf%@991<203#3# fx)fh"#DVv'4f#!#͇fxx/)'vu/)H >32#.#"/ w`UW` )LJJL" #3ﻒY#55#53pp{53#3"pp{f3# qfyX0CbyX0v53#5#5L:#33T걈s^p!5!#.q532654&'3#"&=X.. W]0ihw-+76 >&Dzs5  "&463"]]3GGlbbG23GbL3!5353:^H#5!##걈c_I #53533##sc^5!tcV %+53276=YZ͹Z-,ij>>~V 73;#"'&5,-ZͥZY~>>jic/@a103#?d.@ aa1<203#%3#@ D  1  0#"&546324&#"326D]\\]bG33FF33G\\\\2GF34FG;@103#ﻒu)8  @ |1/90@ IYiy]!#"&'532654&'85xv-W,"K/:=,,>i0Y[ 0.W=u#x $s/#DU|/#5!#|J9X#"4533273273"h;tv gfv ifvtR)@  91<90373x)@  912903#'#m/8 @ PP1<0332673#"&/w `WU`w LJJL/: #.#"#>32w `WU`w LJJL5@!   PP99991<<99990@?       ]'.#"#>3232673#"&d9!&$|f['@%9! '$}f['@X7JQ!7JQ=/10!!>VєmB]Xy a&h!5&hhh5!Ĥ/'\ ]`LM'ogDdFFJ  26544#3GG3]]lG32GbU|3!53UJU |/!!|&b9X632#&#"#&'"#72h54'&' RJ 6"RH 0PQn +0PQn  &77Dv7"#4%62#&%n~vv<<tf3AntVH%#AnHV #"=3;X3Vh'fv?F&jrf&>/`yNf&DHf&f&D\f&pf&f&6&%$q%sL%1/01/0@%%%%% !3yyN(=H+u\6@ 26 25IJ]1@ 0!5!#"32#"320qYǪIIz~,.%0/01/<0@%%%%3#3#+#Vy0F1H (1  <<1@   /0!5!5!!5HA)Aժ9u\2HXu3xm < 1 <21@ /220@% %%% !!5 5!!9" :A@/7%<uZ&/M@"2  &,2(0<<2<<21@&( '   /<<2<<203!535&'&547675#5!67654'&'Ͱa|{aa{{bL+CC+LL*DD*+v[ssZttZss[v*DD*7*DD*;uZ9@  <<1@   /22<<2067633!535&'&3I.K{bb{L-I["WDWx ֪ WW"J@@qqro prol 991@ /<20353&5323!5654#"J{n !o{1xx 7oȼ߅LI LN' u%N' uFf&(f&Vf&6f&3i& Fy *'&'&3273;#"'&''&'&767,-b=MJMUHi;c( #) Xn^T).\-rv~ oik*%1)0T*XmY*)Va!%#54'$QQ 0kEb6=q'0  Vm`&+532 3#-^1FAF[D~S]VH" 4"32654&%&'&54632&'&#"76hY(>f2BFUR I<' )iy|{L (=\ $+.! -&({R&%#457654'&# !5!OTJPE* :Lf.,KOxsPWKL,#%5,*3eaZiV{.@ J  F21@    /90#4&#"#3>32jq1s```cH9@ D >221@ @]0&'&#"!32762#"?HH?5@HH@<⇙8wyvs6`@ 1@ /0;#"'&'#5"$lYoRQ`+.0`b;`D # #'&#5~J/1Fe<2T`wtB`!367676'&'3!xdLjE.*{`T|p5dwY|rNįtR8&%#457654'&# 4%$47#5! OTJPE* 9MKOxsPWKL,#%5,*p$Rݿ &H{RP`!#3267#"&5!##P117,#J%q\T`PH? XVT{.@ G  F21@  906#"&'#764&#"326ttf,n䇅{WS<R%{$%#457654'&# !2.#"OTJPE* :%QNI]]^KOxsPWKL,#%5,*8(8*,A:nok` 2@  D>ij991@ 20"32654'&7'"763!aFH<Ηr{sPSے-- 2^!@  1@ /20%;#"'&5!5!!$lYoRR0`b3i`%27676'&'3%"'&5#5!tZ;jF-*RR"$vfwZ{s`b;+.0LVh )O@ '#* KQXYԴ0'']<<Դ0]1@' *2<220"27654'&'2##"'&7673A\VMMG*w|~~hA1LLNeˑRh]c[斘n,mKseg.YVx`#&+53 3;# t/1FC /1Fz ~,~VN`%67653#&'&533?>TyyT>?@WxؑoW@F`&#"&'#"'&37676376' 2KUXK2~)@V""V@)~`{gLHk{A>oRyRo>6&j3i& jHf&3if& Ff&$ # 76'&%$'&763 '7676] NI5|utf M2C6R6WpA{z Ʋ itR$ $6'&'&'&7!2#"'&32765JgNn-R Nr^ydPpw{A K~}Sj~"#4''&5676'&qO**d\txLJso@z8 vVOv~*+40r51_Tpf&"N& umVd'#&'&7673567654'&'ĸh]i^V5RR*aW4QQ(VyvaxxGnռFCImֹD9` !32376&7%&# 67#5!'TQ0'( 0A_+T3 4`/&'&7'&7676'&#"56776327'5!`ȍ=`[+9[R~!*`ȍ=`[+9[&͘7 cl|YDT|˩hl="pl |YDT|˩hlfMZuV\ #"32&'&32_{|^"y|•"jVH{ "32654&#&'& h1`{{_ mw.vRL#"32#457654'&#"'&76)MbzYTJPE* 9{2e+wTOxsPWKL,#%5,*˞nͱR)`#!"#457654'&#"76))I]]_bNTJPE* 9ۓ eUlnoJOxsPWKL,#%5,*8(X)V#!47632.#"!!#"&'53276`1c3$R,x:KAb9f.1d0W@Rd>Qoɏ?s!K_`7"'&76'&52n 'BQ_'BQ_[~,`*l#FR`*l#FRM #!3M&pM]!V!#56#'0#0?&'&bTB9[@[`7"7>9[@[|"O z:6hl0%[Ml |"Oz:6hl0%?[MVT{ 7636#"&')! $&#"32nttf,hՇ<WSs)%{FVMu\&'&#"!3276 32 5DC6 >BCD@qopުՈOz~ {!&'&#"!!32?# '&76!2 %%cjf_[_fMJOhk en(' c\\c(  {"056763 !"/532767!5!&'&#"'(ne khOJMf_[_fjc% ؜c\\c VT1&Vy ! !###V{+'`VO` !!###`{`UVT{##5#537636#"&'!&#"32wiinttf,;pp>WS17532#"5>3 !"&IXVJM[?[5=@0230@=))gj)1&2y1'yc6Nk' uNNN' 8uN*o/32654&#"##5!!676767632#"'4=N qjqjW.E~C%0"@X UkiS*\o-* % T pFwusk' HuL1L@!21 0221IIPX@8Y0327# !2&#"!^?s}RooR}J6,N&? u+1m-%326&+32+##526!Z}y^ϬvH+W"%32654&+!#3!332#!Z}x_uwg)9dqco"676767632#4&#"##5!%0"@X UjqjW.E~-* % T pΗ*\o-k' uSFk' uQhm& \H 33!3!#)v++B%$q2@   21 0291/032654&#!3)!qﰖE{e5F{f>dghq%s141/03!!/ժ!0@  1@ /2220%3#!#32!!3!7yŪM0'TB /ѪBL ҪN(x@   <<91@ B /<<2290KSX@ % %Y@ I:I:I:I:I:I: <<<<33 ##'# 3 0YY0S0кv{Z7F <@  B 10 991/<2990KSXY"33!#3+3Fm& Q.F$@  1@  /<0#526!#v.+W++Vy0H+u\2H@ 101/<0!#!#++u31&/7h?@ B120KSX@%%%%Y+532767673 3;E,LE\mQ.-"X74oJ+'/.M *5>Bg@2  2 <<<<1@ /<2<20 KTKT[KT[KT[X!  @868Y3#5&%>54&'II Ǹ ˥II<{z WS ;P $@   1/22033!33#P)ˆ+BD @   021/20332673##"&nmuz[v~PEx+:r` &@   1@ /2<<0)33333`++</@   1@   /22<<03333333#<ຆ++B u*@ 2 2/1@  /0%32654&+!5!32#ϊ)+An ,@  22/1@  /<20!3%327654&+332#[fN+1@"#( +0! 3 632#"6/&4767676%67䐌x$[3#F#3bJ/P{3-wRIUA   +t` -@   F!21/9032654&#32654&#%!2#!_eUkUTTVe_cmcpPO^UCCVpou`@ 1/0#!6`ih`0@  1@  /2220%3#!#325!!3y-C7 "Ld64d!{X{H;`x@  <<91@ B /<<2290KSX@  Y@ I:I:I:I:I:I: <<<<33##'#3hh`Pl4_P({` =@ F 221@B /<2990KSX@ Y #33#b縸)`)H&q``"@ 1@ /<0!#!+53265 _7#U^`v=` N@B      221/<290KSX@  Y3 3###=ww`M` $@   F 221/<20!#3!3#b縸`9H{R`@F1/<0!#!#bW6`VT{S%{F`@ 1/<0#!5!и&6ʖhV`\cVec@    <<<54&xjjx޸ܸxjj ++ gsL`[|^` $@   1/220%#!3!3^渖L`66b!@   F21  /20332673##"&øknXrE5od]'+}U` $@    1/2<0)33333U(`66P`-@   1@  /2<0)333333#".𨐖`666L`)@  2/1@  /0%32654&+#5!!2#|y֜XZZZʖ;hi` +@   2/1@  /<20!3%32654&+332#S|yS[`Y[[[`;8`*@    F291/0%32654&+3!2#{֙YZ^X`;%{K@  <21@   IIPX @8Y07532767!5!&'&#"5>3 !"&A`^S E^]INQ%R9>;qdRp:A,*윜+N{ ?@#    221/904&#"726332#"'##3pLLqjUUe9ҝ暙?``B@  291@ B  /<90KSX  Y;#".5463!##r78r5ܖaUmV9{Xm&nC{X&nj##VT533!!>32564&#"##@1|yj{яLs`c. m&lvQ%{L@    F 221IIPX@8Y0%# '&!2.#"%!3267%JR%QNI]]E S^`A9++8*,A:pSdq;>{VDLD&j +1VM `%2+##+53265!327 RC'#U^5iрiv;A`%254+32+!#3!3 褽l`9#9533!!>32#4&#"##@1sjqяLs`cBm&sv0m&qC@hVH&|` 33!3!#ø`6 u%326&+32#!!5!53!q zQ533!!!2#!3264&+WH|y͓LΧXZu\aH{s@141/03!3!/2$@ 1/0#!38X`:Us 3!!!!##U/#˂>` !#53!!!!`¸ fs#!!!2+5327654&#/7qohfL>87||9ժFwr|zKK"VR`#!!3 +5327654'&#HRRQn!&&1`GQ``07 )3 3333###'0:YY{ZSS/B0кv;`33333###';M4hhPPlL_u7&Pu({&p%3###33VrwBh`%3###33,bG*B?`/Z%3##!#3!3)˪B9db|`%3##!#3!3ø縸*`Cq 33!!!#!ql"d9}` 33!!!#!}f`9ǖ6u1&dZu%{&hz/ %3##!5!!+s-B+` %3##!5!!ø&ɸ*%<\Vt`3 3#\IIT`lD%3 3!!#!5!5%lk! mP\P\Vt`3 33##5#535\IIT`l55%3## # 3 3XfuPHNAB}3BL`%3## # 3 3o)'o*?HkG#4&#"#36?6?2GjqjW.E#20@0X U ڗ*\cU'% T pK,m& O;H&of32+5327654&+#33stohfL>87||wwqwr|zKK"hVm`3 +5327654'&+#33j:HRRQn!&&1'wGQ``07 )&?`/fH%+532765!#3!3HhgL>87)hzzKK_9dV`+532765!#3!3RQn!&``07 `CG %"'&'&5332767653##|#3/@0X TjqjW.Fժ$'% T pI*\z)b%6#"&53326=3##c<1Tsjqø~3$2 #%m& I+@ _PO@/ ]1#H&i%N&I u +@p0? /]1#&ji){Nm& N{XH&nu\QzW{u\N' uzW&jN' uO;&jo7N' uP(&jpy}LT`8F0& Q&qFN' uQ&jqu\N&W u +@p0? /]1H&wj+@ pO@]1u\-H{u\N' uH&j1N' uf%&jh0& \hV&|hN' u\hV&j|hk& \hVf&|DN' u`&js %3##!!/Bժ` %3##!!øȸ*`AnN' udhi&j7R({u\4RwT:`ZwZ'>53.'#".53327.'S5 #"? F,X,pny@:hVL4=_3_,@ J\9 2D;x| ,\L06k2P#54.#"!!#4>2*:iUVh:@yܮy@k,[K00K[,#= |x::x|U|&##!".54>324.#"3!|}jzB?xonyA:jUVh88hV m=>ˍʀ;;ʏ7kT46ba664>23##4.#"#6@yܮy@:iUVh: |x::x|a=J,[K00K[,P".53!!32>=3*@yܮy@:hVUi:|x;;x| ,\L00L\,`q)!!332>54."#54>2q'@TXX$gC32vvnU3%MvvN%PT^cA K1\in00nBBxY %!!3!!CꪪP#54.#"!!4>2*:iUVh:0@yܮy@k,\L00L\,` |x;;x|+*:"#4>323##".4>;54.32>5#"yHExwE2Y{IHzY22YzHF"2#"4#$3!L1jysܒIKޓ4kq;3lr8{nڨm?AkP@U|&33##".54>3!"32>55}}Aynox?Bzj Vh88hVUj:Bʁ;H֏ؑKBqpC4Tk7=#54.#"#3>32=:iUVh:6Ony@,\L00L\,3P&*;x|63!!dժ]t2>53".5##3 $=`: I҅M`1Kf>>fKIwo55owO6)A33>32.#"#".5467#2>54.+64/sR<]QN-kOa8[4Szjw./-%HqsK* &J +%?eG% F6:4TSvT0de4?yl[B%#?Wgu=@ykX@$a=!##".5332>53=6Ony@:hVUi:%*;x|3,\L00L\,X[v%.54676$73v4[C'h{uk˵n>7<@/7B(=gbV;3qqm`M-_r.9.'#".4>32>."#54>2"3267.p^QeL#H$XpHxU//UxHgX2:%MvvN%PTB=IG?L>D|nf6a-S^&JnqO)MBan10nBAkIHME23!4.#"#6@yܮy@{:iUVh: |x::x|J,[K00K[,Vz!"!".54676736$33!zmP╣zs3D3y-^6!#".5332>5@yܮy@:hVUi:ժ|x;;x| ,\L00L\,@9 .532>54.#!5!2>54&"#4>32<}|;!HrsI#(MqIPB];~yAvedxC4L.Dc@_MM`AqU1.Ql>?fF&*GZ0vpq{[i88gZ;hS<G`s6".5#5!32>=3@yܮy@:hVUi:|x;;x|b,\L00L\,`q/2>=3".54>7'.+532'.#"3&NwuM$PTKuAZ8n%-{3~H (-/HuSn20nBEN(g N=!#4.#"#4>2=:iUVh:@yܮy@J,\L00L\, |x;;x|`q'4."#54>2#532>&NwuM$PT$>PXZ( ^.HuSn20nBEqhD!cEeNA##54>32#4.ǾVi9>ГӁ79iGl IpX*9؜VV؂\OvO`p)D4.#".54>32!!33267>4.#"32>1N7VvM*0Nrc{6DoLgC(^E/ %H>LpJ%CR2R91AGH 8{vlQ0e~y%L.+4^dzE 5GOP%)=(4[{G(*a64>23##4.#"#6@yܮy@:iUVh: |x::x|a=J,[K00K[,=332>53".5:hVUi:@yܮy@,\L00L\,J|x;;x|!332>533!#".5!:hVUi:R6Ony@`,\L00L\,ժ%*;x|ig=332>54.54>32#4.#"#".i0UtDAmN,BkkB5otsq8<]A@]=+IbnsnbI+A~w{ĈHKuO)&IjEH`B.0:Y_Qn@@nQ4W>"!;S25K8)%&1A[zR`yDE}=#54.#"#4>2=:iUVh:@yܮy@k,\L00L\, |x;;x|@D"32>4.'2 .532>54.#!5!.54>ڐ^66^IB]96ju=4L.Dc@;}}; GssG (LpI 1!=uL&AU`YC))CY`V@:iY;fQ:Ibq9_NM`AqU13Vq>:_D%9DHYj:J!!#ROF +3>4.'.>753#Ia;;aHIb::bIe&'ef((f/gk23kg/WܜVzzVݜW3.4>2#".'!!#5#5"2>54.7sr66r{ JJB,ʿg>@id;<_vBDv^`wC *(Hf|gK*'HhA>fJu\2G)3>#"&'.=33"&54>;5"4.#2>/P?ESb;l7>73y)Jg=2yjH'F_7DjA 1O@;jV>,MyXfCb*#4>7632#".'332>54.#"P7dV=BCh@"Cb@*QG5 6& 4G)20}sV$MvR3YB&0K6 %*?*  3!#zgi`'%#".5332653327653#5#"2"hKD]; HO<JI!c?rHE.qw9z78=?`32jqV1sV abIVw %#".54>32533## 6& &-fep<32ʔjq1sُV``ab-3!!326=3#5#"&/kp1rlLח0adIVw%#".54>32533! 6& &-fep<32jq1sJl abBV{+;.#"#3>323##".54>32>7#",U}RMsL'"IUd=fwEeh Gfz>HsR,5Wq<%A3$2("5/fq<*Ze :L-Sچf)'JiANsK%< IvV)=(5)I%!"2>5".54>3!33&;`F& BefC 6qo42n{:laep;32jq1sabGV`!!3 hVh+327653#5#".=4'&#"#3>32JI!c?H\3JI!c?H\378=?`7%32>54.'#"EZ!%9wv9=iPϔjACmPOmD5.NmD`2onf*zΗUUzˍR!bSoAAoS3omf*BqV332653##"&5kp1r{RadK%/D#5#".547.546?3327>32>=4.'D)ZwG?Uh;Y`3Ķ9T839 $2" 8C9W=MlC6_K9cI*, 5~[,J6Bve`-?N( ?OU010$ $EvV17]{DV3ywl'5{rV_{3!4&#"#3>32ʕjq1s/``ab2*=2.#"#5#".547#53>32>=4.' 86jd](xI?Qf>\[-862}'CX0Kg?-bm18 *MnD Or,H4@qZ+^uAXuF54.#"'>32 t*D07".546?3267#=/"?pM  +A,:4 ElL<{7`q,`/'8% qZվA'gVi`'%#".5332653327653##"2"hKD]; HO<JI!c?rHE.qw9z78=? 54.54>32%">54.):_y~y_: t&C1RH $7@7$IxPf}F*+VD*-6-2?kD)KiO}p_N+9 BI;=@#5ZRLQY4O`65g4N3!ADFLR,QO=K?`B!M{$"#3>32!!5>54.;>`@!1ycZ+7R5)?\<=c4ZzFs`dcF}gSv94myPIa8^XfVj3326533!#"&fkp1rH/ӑRadhi{,!#4'&#"#5#".53327653>32iJI !c?G[4JI!c?G[478=e^`32jq1sJ abH4{J"`%!!3&"`hVi,!#4'&#"##".53327653>32iJI !c?G[4JI!c?G[478=e 32#"&&#"32xx.dep<;pfgccTVRۊٗQVTH{R(V$+6##".'73".54>;2"4.#2>8zËKnb-{!GP]8bn::of{9H}t{yKc^M!CךU[7P2,J5.-PpCHpM'GH+OHBRZ`2BuH3326533!5#"&Hkp_1rl{/adR%3#3#Rdm$7'd?98>1"$/#4'&'3767653653#"''##53 ra{ .r &q,bS !/#12j{@E#$]|0q!<"5DAb1)*5"32767#"'&54767&'&'&76'##53|LAV:218UG&/=8O6-N@?_F?D(7-"Gq/#)^ %$ \*$@.!* n F?\KH* #TH#5DAbZw %3#%3#3#%3#ô ^ %3#%3#%3#3#%3#̠&!#53ӤR@dm 327654'+53367657M593pQf$h?FA@6b !eI(R[2* #53 3#ӤR%@-$%#5754&'./.54632.#"'/XZH߸g^aOl39ZZ8{4<5/VVL89CFnY1^5YVeU-"%56767&'&54767632&767/SD435gcbnZdF31`9:H:ZU!LOTAKv?=0ps2# &W[&tr 3# E' , ' qrE '  E'  X f'  ]X f$$27'&5767&X$JԖ`e_'@5 ^vbĘe4)X ' ]j%67654'&'3#"'532T! D' U a$?%#"'&7673327676'4/37653323#"'&' &!UNBAE3I0<^yM\dsቬ+;H2zm^\꜑#P}g£x&R" C~m8($' c c =%327654'&#"67632+"'&5#"'&5473767654'&'3HIj($@GgLK1ZX%5,0.3cM[|dh<2=B%A !  .DF-%!mNH7(M' Oe  %327654'&#"!#53367632,Ij($?GhKL1[W~.DF-%!mNظ\wLR! Xn*' X &/.Q&+8O\79LK5:,]-#4CK%63#"'&&733276u2lecw@A(IiTcI9(jzG1H*V\ss~B")T.327654'&'&#"&#4763&547632#XzL,5;(.;Dn2KxAZM\MObxX'*9:X DD(NOf7*(?$S-8AP6`'  ""327654'&'2#"'&5476B!799[]KB{ƶ`Q%T*WE{R,,9.UMAx|KU#JNL 3 &"4'&!5 767&'&'&547632?,3/V%.-js1v-3t9>YH9!$7+(;ڮ.TVLh+bZ3[f5%#"'$47332767654'&'&767632#4'&y]H?BKSxlkA;"b^M`72'#}[7 0&huqc-##NG".*3:,=2IB="9), g:^M ' r tD5%5%DHHnnnnD&567&'&54763233"/#"'&5332767654&#"t$!lD?I'8 .4LT^s7Z $08 " ,d$* 9^W4'6O'&n=NV)qaK" %D5%%5%DHHnnnnnD5%DHnnD/&'&54763233"'&'#5276767654'&#" lD?I'8" +EɓV  , 8_W4'6O -n=*{nmp" %D5%DHnn0('&54737676537654'3'&x!9EO)"a 2=`KG g&ZGM'DA2omb}8T"RY$6s9It6X !Vz 4&"2>#"&4632XXXXztrrt?XW@AWX栠732767#"&'gC*6:*kWZZB6"D6{S )L}@"Fw \v4373ŠF3#< !#'3<&1yI !n8#'337673#" &1CRz6 *boajr!nUPymL%#'37676537653#"' &1/(0H/<(F!34.5WY9!nr|> @2%,*;l>3  *"2767#"'&54767&'&'&76`yg\NNYp0.VhG hRcpl?AOXj<9U9iDGTOA7.?#ou\N/ b \^xH a8' &6F('&5473327&'&5476&'5#"'767654'&#"%327654'&Cv-(;G--0M,Q;(J$"':AGb 41~!$@K5:,+  iEN@TSZ 'C49g=ql@H=.%4-+#%v%'r.C!0B7,g`o6oU%m`m!3/AbM3))I~R~R0`'0333#!!67654'&'567654'&'|djw~~tdxd=HL@|c3?>1fv! LVxZQ-x.6{<2'1mc,#>d{*>@ #% +BA?>pпQQ9l,"2"54767$32632&#"# '4%7654DҼJPi?3k]KM?oabu;\SfaƎ:F78UyP8327&'"'&#"%47&76$#&67 #"'632Y60I616*, !*:9u`0'"/6OAK %[9.ȵ!463 #"&'7325#'&&7'6et !yCBBquЍ h! ACBB|U )"32654&24''&5432#5476n$ % *|{e6Lj` %"%:yx~)RhKK>a 9"32654&&5456767$ 3276320! 54-6546$ % #vdz]#x.>r>>$o %"%}@~Y9peDQcFlWNn-7Vs\ ,2654&'&! 3%$4567&7'7$!% /@l~.ZA $! $?=Qm.uG4 {V{,@ //1@ <0%"32544$#"54$76f@@@)@@@@Pyxo *%"32654&"#" #"5323272#4#"$ % zw6^"$J7f %"%&PW0>{#$"2"22#"5#&567663 #4#"&퀀!7y{^܀ݹIedm%jh{'>@ $/<@ )1@")<@ & )<0&7'64323254#4%$7"6CBCbRBCACKؼJjeh0KT 24#"53265$54767653!"'#@>z]U]xTrs@0egu/ss}T|"247&76% 3%$Զ%< &Ѩ'LB}T"247&76! 3%$Զ%< &Ѩ'hBc J"32654&"32654&+&'#"'&5432'3253765&7465&'7$ % $ & cge~PLfrtгJwT\U &"$ %"%IJTObo;4ˋP6A^g[oPIcb$0+&'#"'&5432'32537653"32654&b\U{cge~PLfrt$ & ,PIIJTObo;4ˋ %"%el} ,"32654&2537653%&'# 47&76b$ $ 0nuhigeޘ %"%4ˮ/IJ=%ۏel ,"32654&2537653%&'# 47&76b$ $ 0nuhigeޘ %"%4˯IJ=%ۏ``3323!"'#"543225cиx)3Ɯ)`,88{s\ ,2654&'&! 3%$4567&7'7$!% /@l~.ZA $! $&=Qm.uG4 dm +"32654&&! ! &%$&7676=$ $ W6tm2JX $ $8${{N&ap .%"32654&%&'&'&7!2765!"'676F% $ WD NbfP'G!$ $TrJco<ob{"326! %&$'423 54! P@@<)"FTY=Ib" 2:%"32654&%!$76! 6'&'7%&'&'&7!276 54! H& $ JF r cXD NbfPt!$ $=1TvTEmMd 6"327$"327$7&76365+&7632676#4#"A?A?`ƾ5@VC?/@@@L@@@E>/} cbWZwj %-"32654&7$%&'&763 54\$ %  ʪ=A8)SUB<S %"$36H9G)#$67U 6"32654&$'&%$76!232'&#"%$'&762$ % T\oEh@MqKUPn^ %"%+DYl0yP^d6Qqt^}]F0&$"2''&'$! '&5"32?6*ʁ+=x #esZh N)=md[d'u ! &7623$54'74"m#!AVB8?kP$U.F~>=!{ ##"2#"5324#j=;C>{jVnn!r&/S~i! ! !5 74! $&>%~?>~Si! ! 3!= 74! %&>%~?>wJ~S~i! ! !5 74! #5$&>%~?>~NSi! ! 3!= 74! #5%&>%~?>wJ~T3"36654'#"5432AA\(DeN[̼o[$N[ux"325"547&5423253,r>Jm,Ws> [yu?{EBXFE '656%"'&76! 4"3VA!. {x9f>.`h>4A?~= h\$kb8:;-F_Zkf2)I 53533##5J؎؎؎P;r 432#"324ЄLT3z! 473! 4'$331=PU~iibcWOJf34! %56'&53!! 4<1~k  !TxY9vwsknWa!%! %674#"&5! % %a lշ._z-FH+,S.+RLo ۤTnB7W !,6752363 ! 54+"&$54+"32(TX[P<fI+yhZtԕGw, bb+]mLVW3! 473! 5 &5 3I%$&>8 wjs oeKrdW2'! 673! =4+5374# #&5! 24:ip II-<-]mxRbXxR~X{\+2 ! 75&7!  4'"6258TW\F ;IJ:QU-\p!7 %#65+"! 5!2363 6#&32Ԅ!S}GJtAFWHCBuccyi2#! #&! 2Ɣ#cZY4! 473! =+53254!5 4C(pbAAZZwfq211W2 #&$'6?! &65l_$^M>p v\Y1xOh_[ )euG4! !234!#5!  ! 4E%D˼  }>>&T2! )!"363! %22:M#@͹$[ڀ g7 ##654#"#4+"#&=!2363 K@BM{hIF`fhh&4!! 473! !#53274%$534D'e[?RܬW&Z~IJȕ!6G))=iY32! 3! 5 '%5%30>'Mhko 4>>HS2>+3|'! %!5!$! 3#3%! ! 5)54!  I8<rrr OfkQؔc7X!,!"'#!52'4#&3$5!23634+"32~ Mas1D>3LIvjt| ٔxukYf!! %$54#"'! ! 4'7fGD `U6I@bYsrg8A:ԃM){6\lY4(3! 4%7%#"'#% 3! #>U&;3̿0?7YpnWc$!6=3! 47$$5! nڞòd?;kHuLL8TWJ&)*y54&#"'675&%'% t_CCty`^q|ytJfI8=\ ۣb*#2 3#3#3##Ѻ/㰽;2"4;%"4#"32lѹF|pux$LRQ´){ B32654&#"26=%!>54&#"5>32>32+3267#"&'#"&1xYS\JMLepO27Gn 'aȿuc^8>M<[|%!YHZqYaq4+#"33)+RNPPXx+'#!?@=B2({0#"'&'532654'&+532654'&#"567632wA@Q[\ihWVLHHZ[c[[MaZ[VA@^  VJ=+,nQb54"[\mPDd %!!5!!!#53)Ḹя{ 6326="326&!54&#"5>32>32#"&'#"&PVWMZfRPhgPPTcpP/;}Jb04TY/%W & +ݮyT53+)CBDA>A>A2/H{  #4&#"Ð/.G/  33265G.Ð/.+[%!5!2654&#!5!#J^adlp2r?W75353!5!2654&#!5!#?idxEvDFzlp2r+")5!2654&#!5!2654&#!5!#HEws{p{``PDP. &#"32 &6 Ua`UU`aڜ›>pU?32654&#%!2+#XcbYSJKR]#'.+#!232654&#1E4p1M>ze\Y_[' ?]Z4D|vShPIKHM!!#!ڀ_A33267>53#"&'.A L67K $,*kCBk*,$=4!!!!4<8l$! !#n 333# #|ZkmZ|xyY>E )#"326757#5#"&546;5.#"5>32&ffMD_ntt&pQlT];y:Av7X|&??8?vh+]85l[hmKDg..RE )32654&#"3>32+3267#"&'.&&ffMD_ntt&pQlT];y:Av7X|&??8?vh+f]85lZimKDg..RG53#5#"&546323264&#"tt`??aVTSXXSTNO/00z{{ B32654&#"26=%!4654&#"5>32>32+3267#"&'#"&5kK84:/0n06@F2Q #S-E^T=bg~yI>;#T'1S&9NT8m\)3?26JUJLXP ZQ`.+-,`\`d1CH^#$"%G4&"2>32#"&'#3VWWaA?`tt]z{{.10/OgG3#5#"&546323264&#"tt`??aVTSXXSTDO/00z{{1!3267#"&54632.#" xn7yEB{9t\UTm 2gp fnZ_bW15!54&#"5>32#"&732671xn7yEB{9t\UTm 2gp fnZ_bWO(.54632.#";#"3267#"&546KQ3sCBm0W][Uhd^jrm>s0=r6]H5KX ]0*"0Q>-7;af]=SO(#"&'532654&+532654&#"5>32KQ3sCBm0W][Uhd^jrm>s0=r6]H5KX ]0*"0Q>-7;af]=SG '4&#"32#"&'5326=#"&5463253UQUZZVPɖ0i4>d+]V_E||D^tgxxz)f[bF5302QI !#5!#3#53W?浵ss#PP-8 33##8x0BVxyDI%">32#4&#"#4&#"#3>32B/UFj",2%j$/.#jj?'0@)&ug@Eg?Es6"#'[v+5327654&#"#367632v89hu9CGR,+tt54Ilj!pm;32#"&'53264&#"X.c43a1.\;muvl=_)ʮl$!~~!#: 46 #4&#":&{[YX[ՠxzzx:  &533265ڜ{[YX[ՠxzzxG#3>32#"&$4&"2uu`?@`8UWWbP/00z{{M!!;#"&5#535};JkPF7R]rTP[v332653#5#"&[tCGRWttkGlj{TPg`b^68~}!5!2654&#!5!#K`Yslqj=?gd{H{ (%326&#"432.#">32#"&'#3LSbC,ml/#.,}^\VZ:5`!!!5!!5!!5!!5nnlphˏ5iV ;+53276=#"&5!5![YYZ͹Z-,0|~ij>>~G#3>32#"&$4&#"32tt`??a9VTSXXSTNqO/00z{{Xy#"&632.#"3267y.c43a1.\;muvl=_)6l$!}ut~!#QI+325&#"47&'&547632.#"632#"d&/\R@5a$^`^63302b3q>>>5|4 * &:/ZXX `@?@bj:)#"&54632.''7'37.#"32654&|s .sPm4\a^UV^%wp237,pQ57vonwwn=rO(#"&'532654&+532654&#"5>32T]5sQ0"*0] XK5HWz#"3###535463z>1tkqU.98P#P,gabo53#5!3#+53276=Ι<98h9\P\ m;d+]V_E|~4wuxzzf[bF53[v332653##"&[tCGRWttkGlj{TPg`bO68~C3#!3#3!535#535#4tt)r\PP\ap #"&5#5!;phq)99uun@PpFFI !#3!53#I?P-PPG#3!535#535#5!#?\PP\PPdm3#"54;33#'0#"3276ttdytrx !3rJMB ,|ssW?#5$ U| ;#"&5#5!98dv.FFXtp(QU| ;+53276=#"&5#5!9889ht9hr.EGbm;32+53276=14&#"#4&#"#3>32B.V"#23_uj3",2%j$/.$ii>(0@)&:;Sm;32#4&#"MU!1$XT8[]V;;FQxlX6V~a88wYYk\U|$54'&#"#367632;#"'&5:G()WW*+7[//$1!U&'H/Y,-56\sa8BDH V6X66x? 33##?-{{~: #"'&547"!&'&!3276&NNNMMNNX-(e(-W !-XY-!TUTTTTU=5cc5=J,==,:&/#5!#3!535&'&5476767654'&3fwx=%; )=xw>)[v<.#"#"/;#"'&=32654'&/.547632P1j8W*,]({44MN8> 0Br34@>?=RX!k)k`FG@98b/$+*MW33 V6X66x"192-*TIX00xY46;#"+5326 j{mo>1gr,B0]MecU-:JxlX6M!!!;+53276=#"'&5#535}J88hu956PF]m;T_^s!!#;#"'&=!5!jG$2!V&'G^=R V6X66x ^M^#47#5!5!3632#'03254#a\'Ln& m,8!!^R^=jR332#"&'532654&+5!5!dCP>i;}C5~Dx~uhn\' xM|mTPJS]R^: .#"!326 #"&54UYXUcVXYV&l~~g~]% &$ #{&DqP& %X&2Ecq&%cX&Eq&%X&Eu1k' Zu&d&u%f&vZ&hFRP& '{&GcR&'{c&GR&'{&G}uR''{u&GR&'{&GN&({X{&HN&({X{&HuNm& &(2{uXH&&H2XP& 6)'P& IfP0& 2*{H&JHP& +P& KcH&+c&KH5' \+X'jHKuH'+7u'KH&+&K&,D&Lk' u.k' %uNc&.c&2N&.&2Ncs&2/c &Ocs0& c 0& s&2/ &Os&2/ &OVyk' u0mof&vPVyP& 0mo&PVcy&0mco{&PFP& 1&QcF&1c{&QF&1{&QF&1{&Qu\&2'  2H'&Ryur' w|3VTf&SuP& 3VT&SP& 5j&Uc&5jc{&Uc0& =c&&5={&UJP& 6&VcJ&6c{&VcJP& &6c&&V/P& 7P& W/c&7c&W/&7&W/&7&Wd=&8d^&X=&8^&X=&8^&X=' ' 28'&yX9E' \9dm&yY9c&9dcm`&Yr' |:m&CZr' |:m&v@Z4'j$:&jZP& :&Zc&:c`&ZP& ;L&[5' \;L&j[%P& <hV&\t' .|=m&g]c&2=cb&]&2=b&]&K'jW&wZhV&w \'P& AH"%c&$c#{&D%ct' |c#m&g%& &$ #'<%cm& c#&ucN&({cX{&HN^' *u({X7&yHcNt' |{cXm&g"c&,cD&Luc\&2cH{&Ruc\t' |cHm&gk' ub f&vck' ub f&Cc^' ub 7&ycc&b c{&cc=&8c^&X k' vuq'f'vdr k' vuq'f'Cdr ^' vuq'7'ydr c'vq'cq'dr%r' |<hVm&C\%c&<hV`'\%^' u<hV7&y\Fr&Fr& Fr&Fr&Fr&Fr&F&F&%r&%r& pkr&vkr&vr&r&&&p(r&(r& (r&(r&(r&(r&~Nr&~Nr& Nr&Nr&Nr&Nr&Vr&Vr& Vr&Vr&Vr&Vr&V&V&LHr&]LHr& ]?Hr&J?Hr&JHr&|Hr&|cH&DcH&D6r&6r& r&r&'r&r&&&~r&~r& r&r&r&r&&&Hr&Hr& Hr&Hr&Hr&Hr&\r&~\r& \r&\r&\r&v\r&v3ir& 3ir&  3ir& 3ir& 3ir& 3ir& 3i& 3i& r& ?r&JDr&1&Fr&Fr& Fr&Fr&Fr&Fr&F&F&r&er& vr&r&r&r&&&Ff&CFf(f&C(fVf&CVff&C6fHf&CHf3if& C3ifFf&CFfFVr&!͜FVr&"͜FVr&#͜FVr&$͜FVr&͜%FVr&͜&FV&'͜FV&(͜%Vr&)%Vr&*kVr&+kVr&,Vr&-Vr&.V&/V&0Vr&=Vr&>Vr&?Vr&@Vr'AVr'BV&CV&DLVHr&ELVHr&F?VHr&G?VHr&HVHr&IVHr&JcVH&KcVH&LFVr&uFVr&vFVr&wFVr&xFVr&yFVr&zFV&{FV&|Vr&}eVr&~Vr&Vr&Vr&Vr&V&V&FH&F&FVf&͜FVy&͜FVf&͜F7&FV7&͜%m& %0& f&pf%V&rVr#525#53d7yF&jTVf&V{&Vf&V7&V7&Nf&vNf[Hf&DHfVH&r''r'8d&/H&6&&67&&m& 0& f&fr' r' $d& 3iH& 3i& 3i& 3iVTr& VTr&  3i7& 3i& %m& %0& [f&Dpf~ur& F&jr?FfCFVf&FV`&FVf&F7&FV7&\f&\ff&fJV&fvr53#3"ïddm10!!d dmy/10!!/yy/10!!/yy/10!!/yy/10!!/y'__ ]&BB-@ 10#53Ěb~-@ 103#1řb/103#Śc/-#5b %@   1<20#53#53Ěb5Ǚb~~ '@   1<203#%3#řb5Ěb/ * @  1<203#%3#řb5Ěb/ #5!#5bb;/ '@  RQ R <<1<203!!#!5!nn\];/<@  R Q R <<2<<212<220%!#!5!!5!3!!!/nnnn\\?!   V 104632#"&?}|}||{|?q?P1 #@   1/<<2203#3#3#P3f111'3?Kt@%1= 1%+C@&7IF:4(:PFz4P@ PzP"P.zP@(/99991/<22299990'32654&#"4632#"&32654&#"4632#"&32654&#"4632#"&H%'H_EDbcCE_yxxwyLaEEacCEayyxxy aEF`bDEayyxxy7a`JGacECcaEyxyEaaECcaExxy"GaaGCcaExxy DP\h4632#"&62654&#"'4626763267632#"'&'#"'&'#"&732654&#"32654&#"32654&#"yxxyyaacCE%'E FedE  FeddeF  EdeF FceeO:8RR8:OxQ::PR8:QzQ::PR8:QyxxyaaECca`JyS  SS SxyT TT  T{GacECcaEGaaGCcaEGaaGCca`$3`u`'--j`P'-,'--`$#3$V`u`'00j`P&0'0,0Z/#@ v29190 5/-+#Ry#@ v<9190 5 +-#^R^  '4%#56763253767654'& Yb^`_hon"!^XE&->B% #D9``LAB\VBT=BR-;,,1Y7 B $7#"$'5ZThh~vvuw~iw !#3#3!XEFZ !53#53#5Xޏ!'  !' 4' ;g 2###׍辸= ,47632""327654'&'2#"'&5476"%F$W+,,+WX+,,+XLLLLJKKL @ !UUUUUUUUYnmnmmnmnH !3!53#3#z(洴ttPPD  5   @  W <291<29033##5!5 !wtt}oyc?}!!!>32#"&'532654&#"f6TTXYJz04?9= 25DIJLL...P\\PS****hQQ;JJKJ hh2112=!#!=HCD0;.="327654'&'&'&547632#"'&54767327654&#"hT-../RU-../P--KKKK--P]12PPPP210'(KL('NMK(')+*++*+NM*+/23Gc;::;cG3288Yq?@?@pZ88C#$$#CDH$$0.27654'&#"532765#"'&547632#"'&SP-..-PS+***(X/x==jDHIKLKKZ[-..44]\4421ab21hQP854&e_]]_eTSS}~A @ 32tNN^luu)qJy}wYYk\sa88=T@dXC{dB}TtdFTud CBd?}CCdITDd=CEd;RFd0TGd?Hd8Id JdifKdifLdE&d1,d:5dsd1-dAhVd8g2dV|n}d%3dAMdG9d[v~dM%:d ##"32.#"3267!!!!!!;JܾL:9II9^o78?*?77IG8GI`{c9'.473&'3267#"'#7&'#7&'&76?3&',;8+$"5:lUXn;4";τPqJ8=0;i<)^_HH?WgjιKp(_Y,%6767# !2.#"3>32.#"YQbUYoHqWUnrV,e#7!v'/_HGghGG_^ٜu]\YC!!!!3###5ZpP~WHE9El#!!53#535#535632.#"!!!?-쿿=OL=tyB_))HmBo)632#4&#"#5#&'&#"#3>323 0?o5FP;]iJI9!c?L3!Bjbws{E78{``N#55YQKP%$((TT@I!*##` E326&##.+#!232654&/.54632.#"#"'&]``]z/YM$TP*N(:?>?>SZAm)naAt02k:WX?^)}j9>/b؍$~3YQKP%$((TT@I!* *-037#!3!73!733#3#####53'#53'33ٹpg1 2CYȿYD2FIn$uumuuwugu* %2#4&#!#)"33!3*ԕ|aԕ~V*$oN{&lz%%3p@< 1& (# #43('1)-&- 2'-4229999999999122<2032.#"!!!!3267#"#73&'&54767#70TJBN1Fi1OCHU,1u1!(*=Dl-.&nC>*( n -/ l*33!!###5<~rTws1s/!5!!77#'%5'+s-PPMMo؈onوn9-bw'67>32#"'&'"326767654'&'&67'>7632#"'.'&/#"'&54632326767654'&'&&#"32fbU!O3'A"+0.!. !  _ \5#?\k2,,#2!$(2( 4" )1>((E8&^ ,9Q F 9)ЗiRm:3Xwdg7? 2j7#=5(6$ 629T/ (2M !:5S}$@{mbq~Es/4 -& "TAB`]|@8nRkcd]aC".)5'632327&547632#527654'#"'&#"%654'&#"o|@X"07PYtaTk~j[IwmqJ2530D#24!`NkBX``S㫣†qJ`R{{{{{A667654&#"5>323#!!3267#"$547#536767!5? 7^\iV ^':,hski HE 4cq<;''K={[/ {9b{DI--N@{ O/{O!,&'&#2767#&'&576757O[TUeeUT[Y\Y[dsye]Y\[CvlCi----iH$"u9Bt"#BuflC/ !!!!#!/ss-+ժx hq%!!##.+532767!7!&'&+7q7V#7KPN76SٲM{cݑG; 74K7{P{V^77hy]M@f{L5N{1 %3267# !2."_|dT ȄE}=[~oi 7@,L]r4*:0N̾ (2.#"3267#"&54632%3#"326.2"&54:F#KVVK#F:-Q.~*Pʇ=II=323]W!{/tKb J G'QWab ^TH632#64&#"#'?3%Ǘŋ]W!{ 1$ÑEmJHWEbOYbcJ %# !3!# GHMZMd q+  #  "32!!3463"##526eb223b WU&WU&  1Q~>;\>}N*3>"32>54.'2#".5467>32654&#%!2+#hjMMKLijKLkZZ\[~}ڶ[\ZZ&RXXRuJjhKLLLijJgZZ[~}ڶ[[}~[ZZICBISqmopB 33!27&#%!2+!67654'&` `s1:+YX*q jdZ)VV) (%#'#  %27&"676'&\ӿ,F E]]]][{ab[ 2222jT%%5$c$% &.2&'&+3!.+!!2!27&#676'&%3A::f&AVy-`5?vfAd)7%LK$201/O~hbb)j)V>U)- fh@6    B     ` `_`_/91<<2<<90KSXY"###5!3###r}r7q^^-B0 %#!!!5!bJZCJ]d qddd J.%m -)7 7673 $54$32!"53!25&'&#"6Ky {U>ZLtࠢ""38M{{M7M3TT<`xGZAEIpP3RQ4O !!!7!#3#3#B!#n!ӄO-`ddhZ{& '{EVZ{& '{G`e{'uV& {e'uV& tZ{'CV& {Z'CV& tZ'CV& u Z{'CV& Bj{'DV& {j{'DV& C_{'FV& {_'FV& u_{'FV& C_{'FV& EZ{& {e'@& uVB} 5!!B#ZpZR#ZZM '#'"ZZ$MZpZ#B} '7!5!'7ZpZ#ZZM !737@ZZ#ZpZB}!5!'7'mZ#ZZ#ZߠZ#R#ZZRZM%7#7'3'ZRZZ$R"ZݠZ#ZZ#Za 7!##:nt':tna #5'#5!tn'dtna )53753dtnntda 733!ntd:ntB}3!'7!5!7ѓc}Z#Z㔎RZ#R#ZRB}#5!7!'7'7!'/cZ#ZߤRZRZRYxa532767676767632&'&'&#"#"'&/#7!$f ! +!3-68+2",j!!!3 .6+85.0$m: w '07)(6;C+ : ,:'+:Yxa5!5!#5#"'&'&'.'&#"'6767632327676:m$0.58+6. 3!!!j,"2+86-3!+ ! f:d+':, : +C;6()70' wB}!!'#537i&ڠZZ#ZZZZ#R#ZZM'75'3''#ZZ$R"ZZ&ZZ#ZZB}'73'7'7#'7!5hZZ#ZZZZRZZM77#75'73ZZRZZ'ZZ#ZZ&B}'!5!7ZZ#ZZ1ZZ#R#ZZB}'7!'7'7!'4ZZ#ZZ1ZZRZZB} 53#5!5뤤4Z#ZhZ#R#ZM %'3'3!5Z$R"Zh̠Z#Z4B} !'7'7!#3̠Z#Z4ZRZM 7#7#5!ZRZ4Z#Z̤M%'7'3'73!5ZZ$R"ZZhZZ#ZZB#(276767654'&'&'4#!5d >b-*,%:0Z#Z  *+(54<852.&Z#R#ZB#)!'7'7!"'&'&'&547676763"mEZ#Z0:%,*-11> ZRZ&.258<45(+  B#$>2+#5!5!54767676"3276767654'&'&'&l>b-*,%:0ΠZ#Z2)-019 o #*+(54<852.&ՠZ#R#Z};47(+ }  B#$>!'7'7!#5#"'&'&'&54767>";54'&'&'&e910-)2Z#ZΤ0:%,*-b> o #+(74;}ZRZ&.258<45(+*  } B}X3267676767632267676?'7'7#&"'&'&'&'&'&""'&'&'&#5! ! Z#Z  > >  Z#Z" *!#$' * ZRZ %  '%  %' " Z#R#ZB!'7#5!3'7'<2Z#Z<2Z#Z Z#R#Z ZRZq` %7'7]JQgz=Zӄh PJV}e 5!#Z"ZǠZ#R#Ze !#!'7'< Z$Z9kZRZe !3!5zZ"ZZ#R#Ze '7'7!354'&/#7!J%%%'HD_SlhX[HJ%%%%Jw422-A8;>112-!:zJZ[ghX\HC+%%'GKY[eg[WMs2=>FD{2,/2{DF>H':Xy6#5!#52767>54'&'7#"'&'&'&54767<:!-211>;8A-224wJ%%%%JH[XhlS_DH'&&&Iz:d'H>FD{2/,2{DF>=2sMW[ge[YKG'%%+CH\Xhg[[IB}5!B#Zp{#ZB!!BMZZ#M3'#|"ZMZM#'Z$MpZ#B}!5!'7pZ#ߤZB'7!5Z{ZM!37ZMZGM!#73{Z#ZpB|  '7!5!'7 5!!ZpZ##ZpZZZR#ZZ*M !737 3'#'2ZZR"ZZ#ZpZMZpZB| '7!5!'7%!!ZpZ#ZpZuRZZ#ZZ#B|'5!!!!5 #ZppZ>R#ZZ#R*M73'#'#'3hR"ZZ$RZppZ#B|'7!5!'7!5!'7ZppZ#>RZZR*M%#73737#hRZZR#ZppZBA! '7!=!Z#Zp{Z{#ZBA! !! !5!'7BMZMpZ#ߤZ#ZB}!73!!!'7#5!!qVa6ZEV`6NZ#Z">RRjը;mRR:lNZ#R#ZRRB!!373'7'7#'7#537!7'!RRȚNZ#ZN|NZ#ZN.9#!RRRRNZRZN ~NZ#R#ZN RRB}!'7#5!7!5!73'7'%!7'!`]Va6.ZxV`6NZ#ZRR;mRR:lNZRZRRB}!!5!RRpNZ#ZNRRRNZ#R#ZNRM#'3'#'RNZ$R"ZNRSpNZ#ZNpRB}!5!'7'7!5!7NZ#ZNpRRNZRZNRRM%37#73RNZRZNRRpNZ#ZNRB}!!7/7'7!5mRRRNZ#ZNNZ#ZNRRRNZRZNNZ#R#ZNM'77#7'3SRRSQNZRZNNZ$R"ZpRRmRRANZ#ZNNZ#Z6a##7!#tn::n3:t:5p::6a '#5!#5'5C:3n::n:4:dp:nt6%753!5373:4:dp:ntn:nd:4:6%3!'3n:nd:4:n::p5:tB}5!!!!!Z#Zwgw"?Z#R#ZRwRwRB}!5!7!5!'!5!70"wgwZ#?RwRwRZRB}37773'''#5:;!\[`Z#ZCCjjZ#R#ZB}'7'7#'''53777Z#Z`[\!;:ZRZjjCCM%#5#535#535'3'3#3Z$R"ZtZ#ZtM533#3#7#75#535#5ZRZtZ#ZtB} !553353!Z#Z{Z#R#ZM '3'#7#7Z$R"ZnZ#Z}ʻB} !'7'7!+53#53Z#Z}ʻZRZM 7#77'3'3ZRZZ#Z}6B} !!#3#Z4ZݤZ#ZZ#B} 3#'7!5!'7뤤Z4̠ZZ#h#ZZ 5!5! !!? Ou]%uuv 333'#!#\^vtP uB !!75!!5 t]]Xv ###3!3,^\X& v 3'335%!!# #^\XtvpFguv %3'3#!5%# #3!^\^$tv~Fuv #3#!5#3/# #3!J\^^|HGetvJ~{GGMuv 3#!!5#3# #3!F\ F ^tvW~uv 3'333'37# ##!#^\fd^tv ^u9v #!5#3'%3'37#7# ##3!3^^ fd^tvJ^uB '#35!7'!!!5 5~t]]EF 7!##!#*:ntaI':tnIFEF %!53753!5!ldtn~ntd&Iv #7#3'# #3 3\^^tvP*OutuB}'0#"'&'#53676323'7'7%&'&#"!32764RvxN1kk2Ow9g' Z#Z 0GD2 & +JD5@3PO2BB4R,( : ZRZ11/0*M !#737'#'RZZ"ZZ$#ZpZ*ZpZ#Ba7!5!'7!5!'7'7!5!ppZ#Zp?ZRRRZB}#5!5!53!Z#Z[qZ#R#ZB}!5!53!'7'7!#p\Z#ZߤZRZB}#53533'7'7##Z#ZZ#ZߠZ#R#ZZRZB}#5##5#53533533ҤtZ#ZtZ#R#ZB}#53533533'7'7##5##tZ#ZtߤZRZB}53533533'7'7##5##5Z#Z8Z#Z8ߠZ#R#ZZRZ !! ?OuuuB 7% !5uzR##7 ! ?S:uuzRuu##% %!3!3hV[7l n7R{+u\ #&'&#"327673 u B!OO!B ocI7͙7IcL 0"'&547632654'&#"563 3276767&#" \m`cu\6% GGnth r5?,/H@3H5,Y:$UeI+HQ\N,tqzSd69->eSY׮l 7!!5!!5!!LLk+5!#7#53!5!!5!733!ZD2/+^^``kIb!0?"'&''7&'&54767>2"&'2767>54'&&cv-'''OO_@8vcu-'''OO_A:GE:;9($(#&GFF:;9cv8@_pm__ONP(-vcu:A_mp__OOP(-9;SPF($(9;PSF'O@*iiiiB91/90KSXY"#3 !q!#7!hqqP3!!"&63!!"!0",Z(膆(\JN*"f_QQĪKM_fOPi%+%3!!"''7&'&6;73#!!#"!#L(0,:CyEB航6'|>v\JK-".4"$: 1cQı2#KK_ff_lFO]B/ 3 3ް2ް2201!3!!".>3!!"N=c(憆(c=֪I9[[9IP&'.#!5!2#!5!276767!5 ,Z(؈膆(\JL, 1f_rĪKM_fOPi%+&#!5!27+'7#53!5!3276767!73&'&'(/-9CyDD舫6'{rx\JJ. 4 %:  1crı2ݪyKK_ff_lFO]5!&'&#!5!2#!5!2767>b(؈憆(؆b>,I9[[9I3!L9@ 120!#!L^L9!3!9_k^L= 7   @  <91990!!5 5!!LR%# Չ\P_X-y10!!X!תXy!5!!5!3!!y!DCmILfB7+U e+Gr?'; /@     99190'%3##d)#Ӕ/}b%9;v'ue,;e'Be, %.#"326"&'#"&54632>3"38\32#"&'#"&546329[=G[TFBi8\=G[SDCj~/[w~SNAU}^sdlkutcjmvu۠d|k֥s}T!3!T*,}T!3!T*p_,33# NM^T,3 3#T^,$476767632#4'&'&'&#"#;9_UijB9 KGLV32326yKOZq Mg3OINS5dK t]F;73 ";@<7  6<Xy32767>32.#"#"&'XJF]t Kd5SNIO3gM qZOK?<6  7<@;" 37;XyG&'&#"5>323267#"''43OINS61-NSXIFJKOQdSP  ;@<7 W"323326X!!KOZq!Sc1NJOR`!t]D;83$777=X`y!!#"'&'.#"5>32326X!!KOZq Mg3OINS5dK t]F c;73 ";@<7  6<Xbz'767#"'!!'7#5!7&'&567676ǧfYUE5kIQ%\n*xrYQMoIF\<[ETFR q$"B2(d%(9L5XXy$!!!!#"'&'.#"5>32326X!!!KOZq Mg3OINS52'V t]Fجϯ;73 ";@<7 " 6<X1y0%#5!7!5!73!!!'#"'&'.#"5>32326Qu{hq,gqTKOZq Mg3OINS52'V t]FR=R ;73 ";@<7 " 6<Xy.1%!5!7!5!7&'.#"5>3273267#"'!!!!'hMEnK Mg3OINS523J:VQ FJKO!8!E$F";@<7 832326#"'&'.#"5>323326yKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]Dï;73 ";@<7  6<а;83 $77 7=X0y8&#"5>327&'&#"5>323267#"'3267#"/'00NJOR:G67'43OINS520N]a91FJKO?J4r[DKKOdgb 7 ;@<7 !7)32326#"'&'.#"5>323326!!yKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]D*!;73 ";@<7  6<а;83 $77 7=Xy7S#"'&'.#"5>323326#"'&'.#"5>32326#"'&'.#"5>323326yKOZq Sc1NJOR` t]DKKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]D;83 $77 7=;73 ";@<7  6<а;83 $77 7=Xy$!5!53276767632.#"#"&'y!JF]t V'25SNIO3gM qZOKج#?<6 " 7<@;" 37;Wy' %52% $'"51pZV(IٜXDz;%76767!##"'&'&'#5!!5367676323!&'&'&i1*+V WJRNMR  W,!::!,\HSLPM% +*%'H:^2:A<336G84^:H'@'H?Y L=@33/N0<^:H'%X`z!!5367676323!&'&'&!!i:!,\HSLPM% +*!#'H?Y L=@33/N0<^:H'%X`y& Xy& ''Xy'& oWz'& nJ. 3#3#!5!5J=>𹬬J. ##!!!!>7BX`y 365&'!!5!&547!5!!%43448>!0IG00GG2?8>;_8X`y !!!!"264&'2#"&546X!!IdddeH:l'**z{ BbFE``bq+((d:svvX`yK!!!!2&'56X!! BS X`yD!!!!73# X!!鏫 BZVX`yD!!!!33#X!!֕ BLVX`y!!!!!!'X!!߰ TU UT BX`y !!!!!3!X!!-e Bz(iE`07GO!!!!#"3###535463!3267#"&54632.#"'53#5#"&4632264&"X!!4@#mmC???DJB&G$$K&aqk[Q_B;18BCC?-I\\I-?p`ctiF6A?9i=$#tu#gSSSX`y*!!!!>32#4&#"#4&#"#3>32X!!."]?T\Y88EQY7:DQYYU;;R B=:xoHOM]QHPL^P%U20=X`y ,!!!!3#7#546?>54&#"5>32X!!ffc`--A6(Y1/a3\p$-, BiN2A+,/-7#!^aO&E++ X%y<@     <291<2<<990!3!!!'7#5!7!X}y}J;fժhӬXyB !!!!!!X!!!جX y%#5!7!5!7!5!73!!!!!'G=XkXU7Y Z:wSAw@Xy 7!!!!!!!!X!!!!߬Xy? (@( ' <2291/905!5y!!LK Xy? (@ (' <<291/90-5!!X#!!VVTw 3!!5!5V!!!!߬¶LK VTw 3!!-5!5V!!!!߬VVw#5!7!5!73!!!'5 p[5m{*[y~!߬`u,`vLKVw#5!7!5!73!!!'-5 p[5m{*[y!!߬`u,`vWy&%5767$'5674[šzآb|۠M)Ig#M(Jh#Xy %5%%%'w2rK/dtm0x0oVXy '75%%5%'rKnd.t'o0xEu0#oVX y!5!%5%%%!!'XC_^?sMN#N+PJ>`5Yd|5X y!!'7#5375%7%57'NEO>:fLNtt5\h}a5H<Vw?#%#"'&'.#"5>323265wKOZq Mg3OINS52'V t]FJ!;73 ";@<7 " 6<LKVw?!(%#"'&'&'&#"5676323276-5wKHGOZq M343OFGINIIS52'V t]FDE)!!;3 " @< " 6V w+.%"5>327%5%%%3267#"'&'&''}QINSE^AsMP#Bt]FJKOZq _4O;@<7փ_5Xc|6V w27'732767#"'&'&''5676?5%7%53;L t]FDEJGLGOZq P32326&%&%5$7$7wKOZq Mg3OINS5dK t]FJl#a;73 ";@<7  6<RO]ɗ9=}Vw*%#"'&'.#"5>3232655%$wKOZq Mg3OINS5dK t]F)a#l;73 ";@<7  6<R˖}=9"]OV[w67&%'&'5$774hmU֠Gc _eT2wnw2"O0Bj%V[w'567&'567&hmU*c _eT2Vwnw 2O0BDj%Xy_%!"'&54763!!"3!yɊD_`Dƍ^`Xy_75!27654&#!5!2#XD`_DȊɣ`^ȋXy> #"&'&5476;7!!!!"#'J_+30TD~K9# K^+#Eƍ5p5Xy> 32654'&'7+'7!5!!5!237RJ_+30TD~K9FC K9^+#Eƍ55Xy%!5%!"'&54763!!"3!y!ɊD_`Dƍ^`Xy%!=!27654&#!5!2#yD`_DȊɪ`^ȋX,y&%!!'7#5!7&'&5476;73!!!#"$UrG6:qYȲG5^_=R5 Yƍ5p&`=X,y!++!!'7#5!7!5!&#!5!27327654'&'92D4VqF53 D&#I`__ 2ȋ559`^`X0y!%!'7!5!7#"'&54763!!"3!!yR|ɊD_aDAQjfƍ^`5eX0y"%!'7!5!7#!5!27654&#!5!2yR|Da_DȊ]zTQjf`^nj^DeN3#%332653! &1N332653! &3##5#535eDddXwy1/3ް2/301!!!!X!w@Xwy1/3ް2/301!5!!5ywXy H/3 ް 2 ް2/33 3017!!!!!!X!!w߸Xy J/3ް2 ް 2 / 301%!5!5!!5y!w54&'&'3!!#!5!ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FތPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Oi372"&'&'&547676"2767>54&'&'!5ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FMPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9ՌOi3?2"&'&'&547676"2767>54&'&'77''7ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FBccccPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9ccccOi372"&'&'&547676"2767>54&'&''ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:F,ccPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9KccOi73#2"&'&'&547676"2767>54&'&'ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Oi2L2#"&546"326542"&'&'&547676"2767>54&'&'h7b%&'qqnNL88OݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:F)'%`8nqqMpLM77POO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Oi!'/7=E2"&'&'&547676%&'&'& 654'67676-ݾOO''''OOݾOO''''OOf:F-T1-F::E.S1.E:POO__pm__ONPPNO__mp__OOAϚ9FPQ9.9떖EQPD19Oi!;!!!!2"&'&'&547676"2767>54&'&'+{{ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:F;gZfPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Oi372"&'&'&547676"2767>54&'&'!5!ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:F2mPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9IPi%!!!3!!#!5!3Ҍ8Ȍ7nj6Pi %!!!!53rM_Pi%!!!7   '3ͬc  ccc #c ccc Pi 3#!!! 3Xy!!#yӪXy!!5!3y--Xy!!5!!C!DZXy!!5!ZXyw 5V!Xyw7%X!ߨVw^^Xy? %!5 5yyy!LKXy? 7!!7-X!!ߨ{?繷g 7!6762"'&'$&"26i1[륢S4OsPOtO.D/YR3BPQqOOLN #4&#"#6! NMz(/N7332653! &;zMig Y/`103#`7 !!'  TS TS8X`y!532767>32.#"#"&'yJF]t Kd5SNIO3gM qZOK ?<6  7<@;" 37; !33qj}+)y ##y(,}Zw #!"3!!"&5463!! )!"3!wk:PP:jkwj Q9:PD{  |Zw #!2654&#!5!2#!! )5!254#!Z:PP:kjyikQ9:PXAy 755%5!5X!#!!ʶLK XAy % 5 -5!!y#!!!!KL VVw?  55!5!w!!!KLVXy? 55%5!X!#!Vw $75$&%&%5$7$7"nWlܜ86s˖}=9]OVw $'$'5%$5)n˱#lݷW680O]"ɗ9=}Vw)%*67&'&%&''&'57&%5$?7dMjTVʥ3˱!3a4m"cjX)3S][e﹏3N@%HZ-=}k$Vw)$(6%'56?56%7$'57&%D>WwZN(۷+/m")33 +Si063hiyje˖X[y3!!!'7#! !PYBzrYh?ݪ@?@X[y3!'7#5!!5!!PYzrY(s??ݪ@X>y!!!!!!'7!5!7!X!w R`RgfjfX>y%!'7!5!7!5!!5!!yRgw! RjfhDfVw?%%&'&#"5>327%5 %3267#"''43OINS:Z0!!x2XIFJKOQd>3  ;@<7 ҧK{"327V!!?E>XIFJKOQd>C43OINS:Z0"323267#"''&%&%5$7$743OINS61-NSXIFJKOQdSl#a  ;@<7 W"323267#"''55%$43OINS61-NSXIFJKOQdSa#l  ;@<7 W" # #h֣ͣG9> 3 3h*338> !!# #g֣ͣrcG9> !!!!# #gg֣ͣrrcG9w!##mZ##5w33ϸ"mZ!533X%C!!3#CrrCr[  C!!3# CrrCr[ %~!!3#CrrCr  ~!!3# CrrCr Xsy^!#y^ap$%%$~  /%6 %!&'&"112*zz`XXroGGnY  67" ,J5PP5JX*77*#L8P"2642#"''7&546Ċnji56؝]QBɉLJo3NEQ\|G+-7AJT35#"&546;5#"&46235462+32"&=54&#"3#"2653264&"2654&#ςYxxYςZxxZE1/EE0uu0EE`Ev/EDaEEaDE/wZ\ZЂZwwZЂZ\Zwu0EE`E`E/1EE0E`EE0u0EE1/EXsy^!3!yߨys+~!#!r ~5!#r rS;+;!!3vrr;)3!rv;SLl4732#"'&'.#"0 Pd@7+ h$TA6?&H| #"&546323250 Pd@7+ h$DTA6?&Hk-khi !!!#%!!h\roa`޾"(I  !! #37!#3'Q''Ho99Ƀo!p=⻻}(TI #!!7!#3'l)okkɃ=r!r⻻+2" #/;GS_kw+7CO[gs!2#!"543!254#!"+"=4;2+"=4;27+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2%+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;22+"=4"=43+"=4;2+"=4;2"=43!2#\\K\=Kl]\\\\]ii\][]\\\\\\\\]\\]\\\\\\x::f>]Y"\I\\\\I`LLMK\y>>(I !! 3#)%3!'-''96=ûHJ7 hHH--JJXy !5!!!!5!D!DZP4!!!rrZm4 !%!!5!5!5!!mr4 3#3#!%!!5!!omrX4  ! !! !ZS;Z$m4&  74 '3276'&#"!#"'&'!!67632!zzzzzzzzIwwHS;HwwI΍GG2GG$_EXXE^m_DXXE_3#%673#&'%676'&1rsrs2srsrTTTT@TTT|B B@B)B)΍11@4121tD&  XBy 3!!#!5!y ]XBy 3!!#!5fa]<4 !%!!Ybm5A4 !!!!;rbmY5A4 !%!5!mrXae4 !%! !2mrx1xB35!3!!#!B#ZCkZF#Z-ӠZB3 '7!#!5!3!'7ZlDZ#Z-ӤZ4 !%!!5!!ZZmrϠZnZ4 !!'7!!!'7;rZZmZ1X1Z'327#"'$%'3632# 6'&#"zz=>lWWsPYX2灾vzz>GjX`OXGX4y !5!!5!yeZrr^Z%3 33!#!!3/ .^+^kk4 7!!#xr;rc/Krmu4 % !%!50!53!ymrZ[zXy&'&47673!!5!64'<<<.LM.;<+PN.;==R-*/KO/'-TQ0˪1.Xy '!!#!5!'"ZABZ$ZuZ#4 !!%!!''!;GZZHrZEZwXy !!!5!!X!D!CZ%3 !#!3!###.77/^+kk4! !! 3!xS;ZK{mu4 ! !%!#5!5!"~~+mrz[ZXy!5!5!!#&'&476654'#D!C<+PN.;<.LM.==<<}}-TP/ .LO//AJ/,EN*Xy!7!5!3!!7@ZBAZ#ZhZ4 !7!)!7ZbZmEZwZ4&  4& 4?&  4&  4D&  ,D$467632#4& #62"&$&"264:zӃ:4ር♜VuVRyV8vu4DֆMUTyRT4&  7Z^' >4& 7Xy3#%3#!5!!?ʲC!D$Z 3#%3#!#7!?9hwMq' ?H' 8 t'  ,3+33676767653#&'&'&'&  V &#$K 9BU5>=5^:;^D`1o%".+y 9 :C[\l3;b 89hbXy3!!#"'&7633!!";;yV__W9|+q_ih_XyH' 8aXyH' 8!Xy !!3#X!Ścת% *!%#567!676&'&'&'&|z*(2J E<iKH#&GIJE E|-2 M3 +O  ! r; ?9y?p  ! Xy*= 67 '&5677%"632327'&32767#"'&'.#"y{h p{"zi piE5 5dJ t]BFZCEF4 Zq Mg3ħĨ1P$s 7%ےs3 !Xy3#"'#&'&#"5>323326yKOGU43OINS52^NFz;7 (  ;?<6 '='3#3!!#7#537 `?+0'7ϺrSSr4!!!!3!!!'7#5!7!xrddeZmn;fժhӬ4&" 7Xy673367##%.XhZvrM'hx:Bxv`M]Pd H d-Dbgd *Xy633267#.'#%'Xr<;oj/eE}{SC5E%rI1V /dj6`VT{ F`4y& 45{& .4`& 4`& Fy. ! //1 /<20#5!!!#oo.ڭ%ۭ&H:07 %#"326=7#5#"&546;54&#"5>32hHH#[]E>Vcii!fHatLT5m4:j2O85%--JJ??8?vh+]85l[hmKDg/R: 953353!53!5!#"326=7#5#"&546;54&#"5>32as7s9s;#[]E>Vcii!fHatLT5m4:j2Op"r??8?vh+]85l[hmKDg..R:1=[%5!!5!#"326=7#5#"&546;54&#"5>32#"326757#5#"&546;5.#"5>320;0#[]E>Vcii!fHatLT5m4:j2Op""[]E>Vbii"eIasLS5m4:j2Op"rrrr??8?vh+]85l[hmKDg..R}??8?vh+]85l[hmKDg..Rk*.26:>B#5#"&546;54&#"5>32#"326=%=!!%%%5!55qi!fHatLT5m4:j2O85%#[]E>Vc,,,,]85l[hmKDg/R}??8?vhyyrDyyyyrryyR8~4<DLTZ`%#5&'&'&''7&5475'7676767537'5676767'7&'&'&'5'7'%654d3/D9229D/3d4.E9229E.42*  *22*  *2*88fWfEOPDfWg88fWeDPOEeWf8g * apa *  * aa * ba.43ab-45F^'04>2".33&'."#67>76#FVʓVVʓ"vv"Z83Pv"Υ"vP3ʓVVʓVVnh<8PvDDvP8"vP9~?9Pv"F^&0!4>2".7!&'."67>4'&hVʓVVʓDvP479;;74PvD"MʓVVʓVVv"i c;DD;g"vP F^ %7'32>4.#52".VFoDvvDDvYoʓVVʓVSwVF_YvDDvvDoVʓVV4!!!xrZm #53àZ03#s #5ˠАWeE%3 53Zz i#0s  3#àР˓[m#!!# q3#s!!`N um!5!#z3#zz3!5!`z m #4763!!"ƺoyeD9uߑfW#'&%'53 763:*enK==Mne( =C _AEc H<  3!!"'&59De{oVfd #3ƺ m 4'&#!5!2 9Deyo}Wf &'&3!3#76<(enM==Kne*!<McEA_I= 3#!5!2765 o{eD9ᏞfV3 wv% !!!!55!#uX ̼uu]]e! !!;bc;$<.: 1/<03!3T.%yj5!jl!X3 !@ <j 5!!5!!5!r#B#B#j<l !!!!!r#B#B#XXXm 333mjjjm !!!@@@mjjj<j 53353353353X 5!###ljjjX !5!!!5!4l t,> 3!!!--Axj 333!xjkx 3!3!kA 5!5!5!3,,=jX 5!333jkkX 5!35!3̠= 3!!!!-- ABx 333!!xs  x 3!33!!-skA jB !5!5!5!3,,X !5!333xtjk X 5!3!5!33t,  !5!!5!4B 5!!###sjjj 5!!5!3!!t,-sjB 5!5!3!,-XAj 5!333!jkk 5!5!333!XkA!5!5!5!3!!!!,,--AB5!333!!###sjkkjj !!!!5!5!333!-s t,jBkA 43!!"yY[p~| 4&#!5!2[Yxp~|j 5!2653#xY[j~|qj !"&533![Yyjq|~*m3YѲ/ Y*m#3*/ Y*m # # 3 3*iSjh5!|j3?hj5!h}j3@hl|X!@?hl!h}X!@@l5!5!!5ijVV333PP?@l!!!iXVV#!#P@P?@ ?!?j!j!k!@!!B!B! F!Z ! ! h!| ! *!> 3 i }8m #'+/37;?53!5353!5353!5353!5353!5353!5353!5353!53Z667576l #'+/37;?CGKOSW[_cgkosw53%5353535353535353%5353535353535353%5353535353535353%5353%5353%53eeefffdddheefcd!!!z m #A35#35#35#35#35#35#35#35#35#!#5#!5#!35#35#35#35!3h̚h̚̚h̚̚hϚ2̙Ϛ#366B BF Zi!}@i }i !!}} @@&  !!!@@!!i }&  !!!}}w!N<w7!!!xr$<w 3!254#!") ) xrVVVw&  w !%!5!5!5!5!5!5!5!5!5!N?:IILII޸[["[[w !!!!!!IIN< w !%!!5!!!I) N"-?33 #&'&+"'&#"/573;2?"#'57#&'#"#567635a)8)kOkaKA-'= //G),Y=  !H$ /+HDH)+) $., fYYx !=Z Lx73&'37&'67&'67&'67'32654'&'7654&#"3672 $54767&'&47'&27632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5430'&327632#"/#"?#"54?'&5432&5432&56327&5432'&327632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5432PO~ )*+')+(@&'$||e?/A}]\B-71SLoWj\vLLr%%,* #$ )*n$ % +) $ #*+    ? '+&()&(+&p   % % +) $ $*+*EC*Z*,)-)-*,%&%&fБfU 5HhfeefhH2pu^QFs棥sKQG4 4  22044 22 9       L%('*%)(*%)(*t     144 22 0r!2CTev+&'&54?6?6/&2#"/547672#"/547672#"'=47672#"/54762#"/54762#"'=4762#"/547672#"'=47672#"/54762#"/547672#"/547672#"/547672#"/5476l=.%G\&#- Lj.N 0d&K4i    }    g    s            &                            H5-V"*2-.T<:U'EGE'DN-ֈU]\`CDcbF]WWZA@ZZ@AZZA@[[@AZKPrqqrPGeޝdMP䠠P }2ٛk A4&#"26%4&#"326#"547&'&4632 $54'&'&4632XP79NNqO.N97OO79N']EacDC_\n\U>DbcEXFDbbDEaaEEaaEDaa+G詄UUSj멏i LVV6 "32654&7#"32?ɏǾ/`TcȐɎ;P12Y.1"264&"3264#"54327&5432#"'&'@KjjjiOiiLKirqrtPssrqQܩZTdIU )5AMYdp{3/&76'!'47653!476=332654&#"#"&54632'#"&54632#"&54632&'&676&'&676'.7>'.76$6&'&%6&'&6>'.>'.f<;.=+,>/;Kyz~LZ|WX{{XX{IE11EE11ET    m       ;   R       s@dd@s}>}=/NnN/=}>@MllMNkk& % I% % "!$# "! "!! & % % & %-5AMYdp|5#!4'&'5#2#"&546"264&"264"2647>'.7>'.%676&'&>&'&7>'.%7>'.676&'&676&'&753!476=3''676%27/&76'77&'&/#?6'&7liilYz{XW|{bEEbEd      8    @     .HxttxH%?%5E$6  6$D5%?%-5!!1(~(1 5,4t4(4N4(4t4;hhh%%#%% $ %_ $ $!"!$!/!!!" $ $ $ %:-,GtG,-: XLRqqRLX ![$n[ii[n$[!ob !!'!tKZGkcn "!!'!##&+572367676hNn_5, S Grj3#-EmDJ~o.(*!4\tR~UL !!'!  ##' CI3Z  > << 5DCX << ; YD36273 ##'5&< +Z@\\DC ZY\5#,5>~3+&=4%3+&=4%3+&=43+&=4%3+&=43+&=43+&=4%33 #&'&+"'&#"/573;2?"#'57#&'#"#567635@)A({@(@){A)A(@A(^)4 'iOj_J@,&< //F(0'&&'ܐ'J&(lN5  >! )&V?<?$&$ '& ZN N />Eqw!674#!!6?676'4#'323276767654#3#&'&'&6%67!672!&=75$/563&43!32+'!67#>54&53 *,  3)="(&)09$) L&TE` MPA[MH Y $ ;&&e=O%/ N ,8(.7L1Rf~H8SQ,zH%9D6 )jGP@4Rjd_*KfsDIR 9! O  -]&C+/3#"'43727&'#"$472776725676&5&U8)$ tJ .; d3f,"3' VD ( GL/7;;,g t^F$< LD&?>X4R !/# I ? P?D!)Mv>/z2!"&54676737#&'&54>;7#"&546767!7!"&54>3!6763!2h!.)g$'30!/&j ! /:(/  )/ 9)/  9)0:*/z2463!2!2#!!+32#3#i9/ ! j&/!03'$g).!*:0)9  /)9 /)  /(:!!C4&#!"!&3!!"3!#";#"3&'6737#&'6737!"'67!7!"'63!67!2e;'+pCCo CCCC2CCKK<LLKK%JJ60"2=2).=<==<@=:>=;TT USUT UT83$QE!D72654'6#"'4#"'54#"'54#"'675674767#%$4:JILLHOKHLKIhghgighgD>-sJ1 b6'SS cRR SS?SS\\K\\;\\]]!A*>K!!D!254+'3254+'!254#!'!254!&#!"0!463!!2#!!#!3#3lCC2CCCC oCCp+'q=2"06JJ%KKLL:=@<==<=.)g$38TU TUSU TTE!C32=732=7325732'654&#'%2&'&5&'5&'IKLHKOHLLIJ:4$N->DghgighghSS=SS SSb SS'6a!0J)K>*B \\]]:]]J]] O!%)-1523656;2#'7+"/#"'+"5&54775'"'5476;25'7&567635&56;374765'75'76=4'&+ '"'4!#"'&36365&5&#%#754'&5&&547'5367&7+&'&'735&2?"5775537'7'3533553535'32767&5%2?&#%55'575775775uo,Mz"060D/5I:2'5:6&" *:D:S46$.e QN5  u4MDa 6bUP+ ,H;`I23N5( (#I0M '^5%#!:X+ "*  6W}W:uW4 5vT & /H3V XD9\SL+&31.d+%X!Q $2``KPPPG[6%# Qy- 6[[3GK[O`_A[-)$t7 L-$ L6=" (CJ#R"0 :~GB{~Eoj<4S[Za LC5 ) .U%+Z&)͢ 7e<ILAaMoK33K@G6 $$(& (''&1/----2)( (-((d.'-T?OK8T$ !T3(-<((')))())( &2%2#"'&=477654'#"'5473t\*e O@UCXq P S. P ӍMOb>YaYƮ58l7P P@ $0<FX + &=%6&#"3 6=%&#"';27!54767%!&'&'2+"'&=476^7\Pg㑵Hr'.)%sM M#fC-7!%A.; ӎw:kKqz +H*G;M tu/&((AA&:+C;."/ 8Pi>'67&&&'6.7#"'&'#"'676'773.#'6'5676&&5476'&'67&&07 ^< 1x,B5@2 JVMv!#uA+UBDX[f*;-10)..C,sB#HKU P]12<0VQ }%'H6-T}^$k7 R2'7f!A\;y?1!50BEt"!zkQ;0qu0\oi:5oPZjsXFaPJGl;4ejN^1F[q7&&'7'6&'$#&7'&#"'5&767#&''5$'67'6'6'5$'67'656&'67&'6'&'''5$7676'&&'6'63&7"7&'7&'7&'7&'6'6%676767&77&77&''5&"'6%35&'.54>23#67#&8 p +WDTc'H @XO`= ;*)8 kDv/Pk-J KDhGa D`gBD6DDD =3dTDW, :g j)Yi#'WtI-9w18$^8;./7-I)jS)'#i\-IM91D;8%a7/.D=uRNBR&'%QBNRq d2 D s98C ["|44&3, '2^3R T(B?#'9C- !y ~#Z10>N?$%Y4 )%FN? ({ usis< 3(&^T05<>7;,#4[:O(vAfGEtYB z^~4j #,;b:['~Av@~EQ Bak4~_H#T2 $$$$ 2T"`q$&'6&'67327&#!65#&3jjdnh wWVݱqZre[c7 7 cyX ,35'533#3!'#'5!5!5#53!5!5#!!ʶ~~ blvF F A<<3ffX苜qXGccGap 3264&#!2+73 #'#5# 3m`hh`2`Ĉѳh|;vvʷ}f33#!!#'!'57!5#'5735 64pzp7d+!#!573#'5!3!'573!#'73!#'5IxOOTxSVVdY\yvVPPvIyY',32#' 37+ &5%6323'#57'53mJl{~m@+ݼh4144'0>,_ vNknmmnObs32732753"'#"'432364'5;+"'#"'53275'&'&54?5572'#&'&547634%476='4&#68$$B )Z>&A_;i88u-o1bFGfQ_M5mwLbkjI,K=''8 0##Rm4 ڹ+ܴ5!PP"4\=ѻ"8Qý32#"&546324&"26%#"5432itvxsq1"00" 0/B//B/#a`ir|H!//!"00""00"!/0 _b #>DJPV\bhn27654'&#"&7367'67675673#''5&'&'7&'%67'7&'67'%7&'&'%6767%&'&$h%$%%34$&1++XSA N@`==k>P CRX++XYC P>k==l?L ?Q oL+ Nn;P?;@  nMNn3%%%%34%&&%s==`?J >PW,,WW? K?_==f?H?PW,,WU?H?^<=Ke+cL mCP`k<<!4(0847632#"'&7327654#"&#%#&7&'67&'67!󫪪vӤ=6 5N'V[S.U[R󫬬񫪪񿉊 ʯX[V[X[V[!4(0847632#"'&7327654#"73$3&'67&'67!󫪪vѦ=63QNV[S.U[R󫬬񫪪񿉊w  'X[V[X[V[!4!)47632#"'&%#$''&'6%&'6!󫪪4>;D@KDzcngk?dnhk󫬬񫪪I kpinipi !4 "*2:AIX3#''%#&'52#"'&5476!!'5%!!'53'5%3'5%3#'32765'&#"M==,/0#H 8&O6 |7iY06./==e6a&i1r4z012+KN2HQ>>>>f^2"/1]8`1"Y 4f2y5+ +"'5$76%&'547327676=&#; hz0/O{[(*TQ~`NO =tR[\ 8d<+% &56;2'5$%75#"3vh0.P~N^(8P,VRZycOpO >S\^ f`1B7#5#53'&'&54767&'&=33676=3#327654'&O&"}|fzg}}"&&"}UQn$mQU}"$nQUVV{xVVUQ<"{u^^\ _u{"#| zUOOUz |#YOT{zQPPQz{TO@>)4'&#"3276&5476327#'#53'&`____`oŠqk]^^]YYňÁhgf@> '"3276'&'7#5373'#"'&5476j___``_ߓqŊqYX]]XYfhhĈÁj0 '&'&376&+"'&5'476%7!Z{z[ZZ[~\YWmpN#ZX[[YZ[PQmp#TG*52764'&#"#463233#!5sPQPPtrQPyzg֏LQQQPPQr{{t|g*#"#53533#632#47654&#"#ddiqqCBigIIugzyUr}ppDtPQs_CS 7"27654'&7#"&54767##53#533333#3##h. @\ ! 2(>>?ZW~>'3|}}! -/@ /- !^'?XY??~YX?(F}R}hh}}hLS<#5#535&'&'5'73'3#'73'676=35'73'13|e{vw}wwUATwx|xxS@Wwx}vv|d|re{Eus~~suE|VAKtrrt@X{Ius~~suI{dr|*! #!!!'!27674'&#_82V)3{D#MHZW{s{?zK8! %#"#&5463 67!2#6#";z\)MaBuh __ itBaM(]y tt[+##+tt\5."264&'67>3"#"&54767&'&#52hq៝rd:BJ|^d#!p⡠q $c]7A;{26XY "zz" YX62 &'5 %$ 56?6'.j拈|*xIIz'&|JJx, F42$8"3264,'5'&54632264&" &$#"&547>ȜmmNMm} lyzU<Mnnnm+}7 lyzU<|||,&(uO#eaHG||||Q'(sO#e‹`IH=! <>'.463227#"&5454&#"&'&5476766&D9BB8Ğv?W:pbW~tp) "-ff)-gtpQ@3AA:ACj›GmN?ijbvr56WGe((Wi0154d)-?/6?2>32>32#&'567'6'#4&&#4'3>64&"-S5,9"\0+Fgv!4u|W")^,k ikdS!eb[_[H|NYC:RHB=G`SnU|#!!!53&54632!!5#67654&"U't00Z =yy= :]ZssZ JjkkjJ 2f4%353'5#"'&''#&&#4'3>32>32YE;<<-!&Y*dx cf_Oz.*O2)7Ze``b<`WuALh`8!5!1##'!5!_drrPk^K{U_W{'/27632#"'#576&#"4'5267>327&'"2XCZd}uud$gq~dV)40tlx!&%"dLk}:Uwma4 sOHK{wY@x A63276327632&"'&#"'&#'6327627632&#"'&#"'&#'YR #{=('%{XNCEz>O&z>'(#&R #{=O&{YNCEz>'(%{=('#&ee22ee$l66kd23dEPdd33dd$l76kd34eE^s#!5!37!!'  L34((C $Td67&'&"!3!67>54.#"!5&'.54>325467675#53533#63232>54.#"3'8xpA?9l9>@q<;9'D} 5RTP=: SSPSS ;r>>p  p>>r> !A% )RSQ1 )6BB6) 1QSR) p  ""V{zHNRh|&'4>32"'4>32&'4>32&54>32&54>32#!5!'!567>54.#"32367>4.#"323732>4.#"327>54.#"732>54.#"I )),(?)(#!3()3$))BG!(( K{mg,;h IXI L$  P   H''1|G''#s%'')7$ ''A  ''HTݬ9.%~~ rF)~ wpa!'-23353#3!53573#'5#5335!75!!5'57!ePPeeQQeDpH>H@A~}}~00mrTTreppe-!7CQ^&54767&'&'5676767&'&54>32!535#5##3654."!2>4.#" 1""#@%@#!@% ?$##0 ܍a1%?E?%4,/--+D,/1+ 4;AB<>"  "#>"">#"  ">#10$ITNnVB, n ?%#Naji-/4^t&AYcgb3%' + ((NV8OQĿ>:<uyg**5 k5h P[32>4.#"732>54.#"!5&546767&'&546767&'&4>32'&'.#"+L)+L*+M)(LH     > |n @: !:;! 8An} E04`a30TL**LTM((     ++x: 8>>q ?9 9? q>>8 :x++c^UZbbZU^jg% $Tdhy47&'&";67>54.#"!5&'.54>325467675#53533#63232>54.#"!57#&'.54>3234'67632#7$5oh<:5d4:;i865%1MNJ96 MMJMM 68JNM0v    +0 +/0U-,,+,.T1/, 9j9:h  h:9j9a &LMK- '2==2' -KML& 1  V//X//X//V6HLP&'4>32"'4>32&'4>32&54>32&54>32#!5!5!M ,,.*C,+%#7+,7%,+ FK#++ PDNAM**4d;K))$'**,dY&"**E #**L:ƥ??@@=%)5!5!3353#3!53573#'5#5335!mD^JJ^W^KK^׋LLZZ,}}uz%yuu{{u}--4@4767&'&'5676767&'&54>32!&7535#5##3 1!!#?%?#!?% >$""/ _1+ 4:AA<="  !#=""=#!  "=![1=%T e >6.HC'L"'G 12h[FH`[$%ok+*8d .Ncv[.7&546767&'&546767&'&4>32 w "E> #@!!?% =E!w ./@ =CDz" E>"">E "zDC= @/.QO##"'##565'##"/547?kM ,4N"DF &Fi?JO/FB!O {|Im<&=M2227632#&547636=4'&#"#4'&#"=` ]d2 cBU;/G;SXMB:@B ս;7hf% #>|\@9@O &&5 iC n:^O G  %2O7236;2"'##'65##"'&5476;235&'&=476jS c1=EO ;SCFRʝT6*F@E1;O+.`162V Yi8/D ;8[B VRP"<B+"'##565#+"'&575477;2732;276=4'&3&'"ih;F(wQ"DG".FWCNfBy" bODUq5u4  Pro@ |S`64 '4'&'~ v '  w (  w ' $k=F F>jG3~Pjb^*IerN{̑?qJAe}Ωv6\~x(ONPPNO(!8?|EE|?8!r!_3#"/4?23D-!]UF+}{<!/3#'654'&'#"547326Rs9W5[S%3;B[/OBC'*|<j_g#"=4?2%#"=4?23ɧ%QM?ˠ)TK7(w7џ5s ?|O"'4723!#"5472!5YA>RHIOq 1 ӫg 4D% 3363'$6'"I+4 puoS^*  3%#'#3%#';&2 IʗHj7*(,377#'#'547#5773%%,ppsr,'zzxz'984?/99e5>:_`qE#&#"'5654'5673;54'56732733273+&##&"#&'565*G1 VV2Is3'{'3sI1VV 0Gs3'{'3sP3+1='3sH1WW1Hs3'=1+3PH2WW2H. ;G7567&'&'3#6737'#&'7#&'6735'67#3335#5*)SR))&*&';((:'&)'ȶkkn\\[[nȶ kk n[[\\n`ff/ee.((&(;((:(&((@))SS**n\][[o jj |o[\\\n jj e(P( /N#.6CMhw!2732!'5675&'&=32#&'567637&/7&+"+&'532?4/%32#'#&'&=4?#'57335'3!273+#&='#"/547354;2?!&=35-,;K> #WU* y "њHV ηz/;@"q=o )we)$IY'L ALaXwH >X%CII$PC/DN6g+  b% #  jnN :3 O+5{bQ< ,d-  X] f '^ JJA!< 8 2E35733!&54?'7'7!!"'&%#'73676'77'7'&'676}]} =--HW(7*! >y*1c{F=.,H-.'d(#Y+GC8957jN})%%tGl5nm3(,H:0/(_kiN}!N920K 1DW3!5>7>54&#"5>32&54?'7'7!!"'&%#'73676/77'7'&'676@.#5*"I?6O"[m" c<,+GU 5) <|w)/ayD<,+G,,&a(!>B<#q'%NG91 M7835hL{'$$qEh3kj2'+G8/.&HghL{ L8*/D *(=Pc#"&'532654&+532654&#"5>32&54?'7'7!!"'&%#'73676/77'7'&'676D|q%N24H'CB=9PS3464E>6O#]o 32EX!#2632#"&'532654&#"&54?'7'7!!"'&%#'73676'77'7'&'676Hevyn$L27C'y*1c{F=.,H-.&c)"ERUHHS S /(*. 8956jN~(%%tGk5nm3(,H:00'\jiN}!N91/K "7J]"3264&7.#"632#"&54632&54?'7'7!!"'&%#'73676/77'7'&'676]'00'*//l+2>AB(S`dT^dyg7<,+GU 5) <|w)/ayD<,+G,,&a(!.T--T.H D&RECSukf{7835hL{(#$qEi4lj2'+G8/.&HhgLz L8*.- X.A!#!&54?'7'7!!"'&%#'73676'77'7'&'676n!?/.JY08+"(@},2fH?/-J.0'f*#&K:;68nP*%'wIn7rp5).J<21(vmmQ"P;:1-K':7&54?'7'7!!"'&%#'73676'77'7'&'676N!?/.JY08+"(@},2fH?/-J.0'f*#:<68mP*&&wHn7qp5 ).J;11)wnlP!P;;199'9HR!273!567&#2&'676+&'67'#'6765'533!273+#/#"/47$,7Jv I MO $p%|I ^ [T<K"(~GW$?8?])( EAs#L, T 0 ` +WVۄ`$$a.|%2<J\e3 + &=762367#&'&#367&#&#"3274/"34?3'35732?5#+'535^-J|@h'\-e@<r2&H); uZJM =9jl:jgb.Qi2Q|酝:*}( dpR!h j `]_i$x:-(^%,3"ؿEa HMP E7g /:BR`j # &5%6; 65%&# 327#57&/#2#&'676+'%3#'#&/47'3327##'%3#"/6j1M{ǮG&z v$ExݨE(+=R:n:D!s Y!gQKum;} uA;>e=g¯Cy??ԢB|*>w4I ' 5@` bC$ j$H?iM!%.|7H27&' # &5%6367&#'.7&67263'#%; 65%&# mJB|e6O}°I+o|BJn^jaygwaaygxaj^w$FyتFG퇢D{C?` B]ww]B JХC}.?yP%.232#!7&!"4#".54767267p   {u*_ Jcllm8*#I%<($|ʀX#{Nwt7mnld4)5:IIIB,<_4767632#"'&'&!%!!  >W$`4 Z|b<_/374767632#"'&'&4767632#"'&'&!%!!    UW$`H    Z|b<_/GKO4767632#"'&'&4767632#"'&'&4767632#"'&'&!%!!      UW$`H      Z|b<[/G_cg4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&!%!!    /    UW$`  K     Z|b<_/G_w{4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&4767632#"'&'&!%!!    /      >W$`  L      Z|b<V/G_w4767632#"'&'&%4767632#"'&'&4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&!%!!  0      /    UW$`+    .      @  Z|b.t )2 $$ >54.#"4>32#"&h..--t*Ƅ2..2/.y )62 $$ >54.#"4>32#"&$2#".46h..--1.-.y*Ƅ2..2//2..2/.t 2 $$2>4.#"h-..-t*f/2..2/.j '2 $$2>4.#"$32>4."h-..-q.-.1-j*f/2..2/y2..2/R7!!R-ӖR7!!%!!RMzM; 67'&/#'3#67$#%ׯP==Ͱ̼bN+#!f"K++!|o554.#"##"'5##"&'&'0!5!5&'.4>32!!676767'7' :!9!"9 :! F GF;kY_1278e56d:81)RLk<GG E~^ : : ; ;NG 5 e4G( Li) enf77fne )i (G4e5 G( Pm 9Y%&'%67&673&/'67'&'"&'4?&'37' '7 &/7&'#>7$%88EFu/- 6uNDL22LENu/80uFD8jU45B%y\A@Yy$F 0=/0 ,-X70 ;~*2 %% 2*~697X-,oo  +F9d1 ) ( 1d9C1*CT'&#"'5&767#&$'&%'6'&'''$'676'&5$'6%'.54>32D$ "@F,NNNvF8p^Lb2  N**+ B@0"AR/0?wA%od/D&3.YaQ/5#3$"uI' @3/u= =#n- .... w3% % 32+#".7!"&'&'#&=4;73737D*$#GFHH%#Ι+(&aa'm99m9 3.055_4i4_550.3k  #tttk"632&'.'#####֊v)%8 _^>:k{ZG_?g@`H,>|:=+,j,,<6O/233<bbJ 132>4.#"367#&7&$735&'.4>2,P*+P,.N+)PƗd"/%(MM~95DLMNMD2)WN,,NWP**g!ʇw֜s~  &JJ&?GO277''"/&'&'7&'&'7&47'6767'676?  6"&462EG#96\>42(p __ p(24>\69#G#:5\>42(p __ p(24>\5:'NmNNm U%4m+3 EJ5:6JE 3+m4%T  T%4m+3 EJ6:5JE 3,l4%T '\nMMnM* ? !&+05:?DP3&7"7&'7&'7&'7&'6'6%676767&77&77&'"32654&'5&'.4>323#67#&#"'5&'&547&"'6%6761a$O` "NiB*4l,4"U47),3($aM#"aT*BF 4,=44#Y3,)0BB0/CBO"!-$F$FJF1.#- -#-2MJF$G# 8<g7*!2U6J%n=_CBnT> rYw0d "*7]6U$u=n;wBLz >\e0wZ3C.1BB1.C(N "%""%" M#p.PA.$;QW$.AP-{ "R &.FR2#".54>&'767&%76'&''67&'&'&'67676547676'&7>3263'##"'&'&'&54767&'&547676&'&#"6&%6767&'&'&676&5467&'&6732767&h@9h),)RP|  |PR-*g:>/**Y&()((')&&)')(()% @9f+.TR"`33`\_ .np, 00441/ ,pn, ]]&&()&&EEEJ032WyQT.,d9@.**..1230IDE%&**%&F+.SEFE.IMMI."#FES. !  ";-0.--.0IM+.REF$$1.%2S_`Q2%-1OQQO2-$3Q`_R3&.>GIIG"" 7447#.$$FER/+L"  !75/57%"IJJI* )p~67&'67&'4&6%67.'4'6&&'6767&54?67&'&#&'#&'5&'"'67&'&47632>4.#"72#".4>"0'-, )*#'05%"*%%, ),,"GNYI'+""$(JYNO21, 9,4=SM:7,: -12-[[Z[]WXIOMKLMN2 Y{\ bCWDJgABcp7L^BML0b \u]! @R%KlhhO+ww+O hhlK$PZX'@D 0:)ww*;0 EA&XZw[[[[GJMMJ"( %3!'#!52#"62#".54>o:5(67%'$(n H0L*I"33'554#$/* PR 6h"&>I > >A>!!ua!&5476'#5!+{h_a66mHHm.rZy'#"'&#"'&'&'&547676763232767676'&'&'&/&'&'&547676762!2!%3276767654'&'&'&#"&#"3276767654'&'&˗Pz  ,D@   7;+  23  M98G ):               r         0   L:5U        .\ r26767654'&'."#"'%"'&'&'&54767676;27>764'.'&+"'&'&'&547676762%632$"26767654'&'&#  #  @!R763276;%326767654'&'&'&#"6767654'&'&'&#"32ɓ E79E"  21 +96  >B+  # zOo              49D   /    "    :           =JZx-4H67&'&'&+"'&'&'&4767676327632 #"/#"'&'&'&54767676;276276767654'&'&'&"276767654'&'&'&""'&'&'&547676762"'&'&'&547676762'&'&'&547654'&'&'&";276-&#"+"276767654'&5476%327%&"'&'&4767628?.  !  !a=?^'_)\?=a! !# "!.8?""  "  "  "   f  2 .?E S@6f G=. 2  ŕ6@  B   )_>9 9>_)  % I        ? *        ;d.      ?P   !-  @( ,#%>  NpNM&_*# (! &) ,,f&  ! (K_  Z0-  Yi D   cp-)L &gK1 [N3$ n/ "!0{I"H#fmt2>,7HBI.;/8[, Q[z)  .)S9L *E   '+(4%(4  *X >  7A) 0'-570+I;-% *#%(0  ]'5.  U-9Lp{7654'"'&#"+"'7&54?67676763276323273#5%6767'&#"6%"/67#"27632327654'73654'676547& t!M#l5G;@\ 2BX-0%-m * '?,N ?'!&R;-> <\-R5-6E!"$b$6$!q",; t@P"#C  *FS "DX@! %z$(`]jMP   &O/+@ p_u<  3  DMKZRdYL6D_YBI5.!!''kGWz")3SZ67654/##3276?7%754'654'36767632#"'&54767632'0,,; (| w| ki5.U,\\    %g .  ;,-0j{w {w3V. T, \[^     -5& '-EL4'&'&/767675'7! !'7!654'!4'!!$4767>2"&'&'!654'$$CCC||]V|V#u    9Z(f(Y7%$66%"'&'&'&47676762%'b&I    )^tN/  /dIW?    @ViDV /  V%&%$64'%%&'&'&"27676@))< "  " ]NO]    9|23277632#"'&'&5476"# 6v>? (-=%P8j?  #j<  y"$"JrB23277632#"'&'&5476"" YTo k%,02?=V8jiA{C {u+'qP?  ' 7 sssssstsXrsrtsssr@Q  ' 7 5NB2632#"'&'#"'&547677&'&54763267632676   Bt  ah>) c!  ,Hs *ܡ   },"2A "  {3+Q26#"'#"'&'#'&'#"'&547&'&54767&'&54763267632676  ΂    NjM  rkW* & \ *3 #ﳎ*3 Tv! ( 5+" , @V #!!!!!%!!!!!!!!#!5!3 ;E;JEJJJ<;E;EJK!IKV{ !!!!!!||uv9f !!#!5!335#*+մ*ִw0r!!%!!!!!!/0``1/`1) !!#!5!3^^^~S3!!'#'!!#!!3!5LDʃDMA #5!#3!3'3#!#35!3###5353;9nj#5AI##0vQ#"#3;54'&'&'!"3276767653#4'&'&'&+3!52767>5/]LED73!&&54GBO]63H>SkS>H388]OBG45&&!35FEL]63H>SS>H38882I32367675&'&'.5467676236767>32#"&'&'&'#"'&'.546767675&% >#"? ?"#>    G   >#"? ?"#>  G     F  >##> >##>   F    ?#"> >"#?4'&'&'&'.54767676322767676767632#"'&'&'&'&'&#"'&'&'&5476767676765"#"'&'&'&5476767632B ,#,+%) 3!, &&*-#''#-*&& &$0 )$W$) 0$' L+,$&&$,/"&&$b3") M*,%&&%,."'%%0 )$W#) 4!, &&+,$''$,+&& &$1 ,#,+$)0267632#"'&'&'3&'&'&54676763267632#"'&'#"'&'&'&5476767#6767632#"'&'"'&'&'&54767#"'&'&'&54767676325##"'&'&'&54767#"'&'&'&476767632&'&547676763235#"'.'&5476767632&'&54767676h             -  (                  '    *             .         +j276767653"4'&'&'&+sidUS+*+'WPihtthiPW'+*+SUdi),)URhexuhbXR,,,,RYaitwfgSU),%t?247676763"'&'&'&5!276767653"4'&'&'&LEA86:4DDMMDD4:68AEtjdVT,*+(XQjhvvhjQX(+*,TVdj-76DCOME@:66:?FLOCC67-*UShgyvjbYS,-,-RZbjvyghTU*,(8 %%! !)ttJHcdecH]F]~]^C5 )!%%!2#"'&'&'&54767676hzt@z@Az@t{ne_RP)((&SNcdome_RP)((&SMdd0x}*(QObbrle]TP)**(QObbooe]TN+*(.'"276767654'&'&'! !_)(""""()_)(""""(Y$(*/.*(#  #(*./*($]^#< '1%%2"'&'&'&5476767! !#xxa)(#""#()a)(#""#(YDgghgD^I^W $(*0.+($  $(+.0*($ YZ(8 3'7'3!%%!! !hE۱CCDe g  g f ҁссi:]^= 3'7'3!%%!7!7'7!hTDEDDTNPPIQ2P11P2#mm(? -5%7'%!! !] P  gfeer­696ƌ]^^. /'%!!%!77!yrryyqm"_^^l%%tu%ߴ߳!63% %#'-7:|:||9|kֵֵkֶWz`37'%7% %#'ZZZZZ]^Z^ZZ˛ʜm˜˜mʜ0o #'!5!73!P6M6P$6PMP66R#6QLR6$Q6L$z     - h<_K <; L_zK <; J`;<_  '!'/7'?!7% % -[9^[[ZG^ZZz'}*}zy}*}'q^\\ZG^ZZ:\O}zy}*}'yz(}2 % %  h_y(_^(zFGs% % -hVHzVUzHrVU{HUVH% % -hhhႁhhhႂhhh$h7% %' 7-'hX5 5XV6 6g5VW6 6WV5 0t/37%!!%'#''7'%!5!%7'77;[TA:#T8#AT[TA#9T#8AT T8#AT[U@#7S#9@U[TA8#154'&5476276767632#"#"#"327232#"'&'&/"'&5476=&'&'#"'&'&54767632332?&547'&#"#"#"'&'&54767632676?>$,.c.,$> ]5 71+: H3> kR  Sk >3H :+17 7Z  >$,.c.,$? Z7 71+: H3> lR  Rk >3H :+17 9X  ib9@R'))'R@9dg  8d< +$;)01):$* \570+9 F3= kQ  Sj  =3F 9+077Y  >$,.a.,$? Y770+9 G3= kR  Qk =3G 9+079W     > h`9@Q'(('Q@9bf  7c<+$:)/0(:$+HH#:.'W4,CEH@,4W'*>&DL:Z##KGW,f ',;[;;+*Q--}KOW*AA*WSGu5-U&+;;[;,)  '+;[<>**Q--}KNW+@@-USFu5-S(+;>Y;+* !67654'&"327632#"'&'&/#"'&5476=#"'&'&5476763232?'&#"#"'&'&5476763254'&5476276767632#"'&#"#"'&#"327676%32767654'&'&#"#"i/)F)/,UK:M $\/8E(5>H6-EFJA-5H;8)D7.\# L;KU,*UK;K #\.7F'5>H5-DE-6H<7*C8/\$ M:K U+:6-21 4 $:<;$ 4 22-6 O;(A7##7A(; !*:#.#;&Rm!CcJMU)??,RMJcCoS%9#.#;)!  );#-$:'Qn!DcIMU*??*UMIcD oS%;#.$:* f /D;;D/ $i"276767654'&'&'767632#"'#"'&'&'&'#"'&'&'&5476767#"'&'&'&5476767632&'&5476767632o00'))'00o00'))'0]0+)*+%# #+%0%##&&.0%+%   #%'.0$,#0%-# #%'.0$.  #%'-1$,#$%*/0961/*%%*/1690/*%) "*&0-(%$$$)-0&*!&"*!$$)-0&-#%(-0&*"" (-0&*"$$(./& n%#"'&'&'&5476767#"'&'&'&5476767632&'&54767676267632#"'#"'&'&'&27654'&'&'&"67&'&'&'276767&54767'&'&#"276767654'&/?676767654'&'&'&#"h &,&1/(&#!$&1%-$!&$/'.)2$-%c%-$2-*++&$!$-%1&$!#&(/1&,& =s0 9 55%R 9 !_  , 9 R%5s  _!#'"+'0/)&$%%).2'+$ * '1.*%%%%*.1' * "+'2.)%%$&)/0'+"'#L% %L %#M L:2(&6  _ M#%   6&(2: -[3b &'#"'&'&'&547676763267'&#"327%327676764'&'.#"7632#"'%&'&54767676324676762676322##"'&'"'&'.5#"'&'&'&54767"'&'&'&54767676&'&'&'&'&'67676?&'32767677676765&'&'.#"7676767&'&'&/326767674'&'&'67'&'&'&#"67'&'&'&'67676767"276767654'&'&'"'&'&'&54?&'276767654'7654'&'&'&"67'&547676762    (  b  (       #!"G"!# * " ' ## G!""  '  Y m    ( y   ( O k  w  m Q (  O (     ? ?   + / L* / *   +. M+ .*   !!!! '? ?' "#& #'"!!  '? ?'  !"!  $&  m P    O        m     y    O k         b       %j<\l"276767654'&'&/2#"'&'&'&47676762#"'&'&'&54767676% %-[''!  !''[&( !! (TB39)+,+76?A3:(+,+76>tjeVT,++(XRiiuskdVT,**(XQijtuz"z!uv!z"z#&(,-''""''-,(&#e)*:6?;97,+)*97z88,+,*UThgyricYT+,,*USigtvjbZR-,zvvz"z vv!z29"327632#"'&'&/#"'&5476=#"'&'&5476763232?'&#"#"'&'&5476763254'&5476276767632#"'&#"27654'&%&'&#"327676%327632 654'&'&#"#"i"(-+S I9K #Y.6C&4<F4,CDH?,4F96(B5-Y" K8IS*)RI8J "Y-5D&3<F4,CC,4F:6(A6.Y# K9I R*"(-62 #9~3 #9; 01+56 00,5`%;G,A $.?'!3&@!*Yx$ ImPT]-EE0ZTPmI "zZ)!?&3!'@-$ #,A'!2'?!*Yx$ImQT\.EE.\TQmI#yZ)!A&2"'?.#~&41%%14>3t-3>41%%14>3f^CC^B%@#@@%@#-4>41%%14>4-3>41%%14>3+  V  ++  V  !r +?Sg"&46277''"'&'&476762"'&'&4767622"'&'&4767$2"'&'&4767eeeBABA#U##U##U##U#V%**%V&**KV&**&V%**~ffeAA$AAV%**%V&**V&**&V%**#U##U##U##U#  &3@MYam+%5%32476;#"'&'?632&54?#"632/&54#"/72#547"&462"'&=3?_?6 6  6] 6'?&M&C_CC_?&M&< 'L&&L'!6 6^6!6 >_CC_D<>"l267632%632#"'%3#"'&'"'&547#"'&54727%#"'&47632%&'&54763&5476h!#;'&1'h 9##8)'1!, ;#A#; '&1')8##9 h'12;# 4%.&! 6 = 6%".% 3 3 G%.56 = 6 %".G 4 $8 ! 54."#"54$32632#"_ ɀ~~a>E  %!#!3!p EE?p9E=V %!%!35!cE:d FF8 %!!![:F:\;[0q %!!7!N]<N;)G+t  ,o9; #q !rQk!k`!733}b>v!#7#)iC~' 4 4#' 5 5#g]jOS2#"327676765#"'&546;57!##"'&'&'&54767676%#     42;%-n`Ԯrr#26A@:V7:$)&7.Yq   % $.277g[(dVDQ49%*,04?()-#52&'&547676762"'&'&'&5476767hc"$njln(Lfe*+$$$$+*e*+$%%$+! #'(*dRjjSc*('!"%*,20,+%""%+,02,*%"%C&'&547676762476767622"'&'&'&5476767hcn(%X%&&&W%(nؖe*+$$$$+*e*+$%%$+,Dj*('(&,,&('(*kC"&*,11,*%##%*,11,*&".i%%&%&54767676247676762hhÔ*(42u24)(()42u24(*i\=97,*+*96@@69*+*,79=Zr_'#"'&'&'&547676763"'&'&'&5476767632_dA=;0-/.=:DD:=./-0;=Abx1.=8DC9() 1F="%".4"tNa5&$4! /.r<@6B2L_0>Q#kI|"rz7&)?),%=^K=.C26F@13.!9+cM313N676 547&'&327#"'#536767&'&'&5432&5476323254'&543253%5@26`', =NR6#!vWR>4 2:O t51"".1&X.RO A5ȏ )T/186,FAS :#(=:tA0 9SD 'A#5}11BO9 "'&'&'&547676763"3ᗊpm8884qlYTN! !C@RP]e:6pltm9:'62~~jf77"05276767654'.'4]PR@C! !NTYlq4888mpe'67fj~~27&:9mtlo7:fkR !&547jljjlyyxzQqpnc$0!!676n wu;;vi43f$lcC}U# 3tD}U 3 DutV.! !JV. ! JA! !m^\GHB ! ^^HHv!'7DWWWW|'7'7WWbW>W^$#"&=4&+5326=46;#"3xMe,,fLx1d=AOOA=dƂ׈ihDŽOߍOi(326=467&'&=4&+532;#"+5nCFVU$#Cn5BB*)p//oTBB¥P⎁AAPDBۇ45iDCS/~ #!5!3}t]} 7%d^=]d>S~5 /%0~##t] '-f\=]d]>-!'7!. (``I)=2"&'&'&5476?!".'&47>3!'&'&54767>2 '!  `!!  !' ,&   &   S~&!5! F78-x!5!5 V(Mr6u #3#3#3!!5 鴴ZZ---I(,,,,S~  55!#3#3#3F9UU**b]^bUUUS~!!5 F7.`tq!%  qR{V$%! S%@{V t%226=3!5 5!"'&'&'&6  $hI$  h$   6<47676763!5 5!"6  $hI$  $   $O!! e 6n55!lMlTwccwekl!5!!53 ' !_[y"kd""e/l5!!53 ' !_["/d""5 !73#57!%!6UcGjbzbdǩ""ap 5!'53#'!!!7%acߎA[؁(ZqZ{{{ĒҒ}TM %'!'!53 !;qKRnKa26wwIw22wT}> 3#5!7!!! ZQtZQ0L>ssjLK2Nu '!53#'5!'7! !pSn%R&%Ua2wKJ,Lw22w)1 '7!573#5!7! !r&j&St&SpWl6qM,LLyy77y@!6767632#"'&'&'!  6IYZgb^UMI%&&"LF\Zfc^UM3!t:6I&&&#LHZZhc\UMH'&&#L2<tt XNy "&*.37#37#37#37#5'!!55!!3'#3'#3'#3'#r+qr*rr+rr+rV{{*q+*r*+r++r+9Ɔ\]t] 7&#"7'7 #%5#t69.wZY96t".*X/S~k 55!5!!7'!nnUVGG8:ȏu\j '327'' #395t".Y/Y"u69.xXXN2%&#"6767&'&"67632&'&547676767}:"  s %*&*(&"!#!"O>>;*E/4767!"!47676763"'&'&'&5!3!&'&5v  5 $ %% $  H vgMME %!#"!% EMu\2&'&'&'&54767#"'&'276?&'&'32\":  #'$'$#Y@I:86s6::I  #&'#'" X  :5*+B67"'&'&'&547676$47676762"'&'&'%&'&'&547676762$[ /  H =a=   / ZI=X  q> d(*c     XJn.676767632#"'&'&'&%&'&54767&'&54765 #&+*1)F-Y)) .EOO/3S>>S&/ #$))%#]]#%))$#&e"'&'.54?654'&'&'&+"#!".4?64/&4676763!2;276767654/&54676762 I ]]I    Q      Q  %eg"'&'.54?654'&'&'&+"#!".4?64/&4676763!2;276767654/&54676762 GKa u~iKG E     2 +#76767&'&/3#6767!5!!5!&'&'g?j7R=y66y=R6k?VO S+ +Sd _8=eyu'&utj>jijR"53#5#"'&323276'&#"3UVn၂pVTMLNMMNLA+l99lg-,..VVy ##! !+532765YZͷZ-,'ij>>% %!#3!3iVO7n lѲR{jR"%#367632#"'&'&#"327"3UVn၂pVT+MLNMMNLl99f-,[љH3!!# 9`#3!{`9Lh '"27654'&'2#"'&7673A\VMMG*w|~~hA1LLNeˑRh]c[斘,mKseg.!#5#"&'532654&+532.Dv6;zIMcݳw"$.*gQH{"264   676326^\`s-!\[^[]-=P@7'"]_$5hXd3#3h݄D8.#";#"./.'&'532654&/&'&54$32\^mjj3!2_Pf-Efoshul]^ V;5#5% Yb^`_hon"!^XE&->B%S #D9``LAB\VBT=;-;,,1Y7Xy&CW:w!##Z:#5!#J&w3!3XZ!533XKP,X3#3,X0X,X3#3,$dX,X3#3,X,X3#3,X,X%3#3#,񈈈X,X3##3X0X,X3##3$dX,X3##3X,X3##3X,X%3#!#3X,X!#!!yX,X!#3!!Ẍ,X!#3!!X,X!#3!!Xd,X%!!3XT| 3'#'L:LjLCUCT| #'737:LjLCUC( 3#3#'( f*D( #53#73 fRo(D dA!5 !5 !5 ||pO  'ŢcmZn`!5 !5 !5 TT  |MY 5! u .1 V{ 5! u X.1 VH+532765!#3!HYZͧZ-,)ij>>9dV4&#"#3>32+532765bjq1sYZ͹Z-,`c6ij>>~'IJ !5!5!5!J>>I3#qe10#+D`V4 ;#"&5# 5432!5!3#'&#"3[Y襵>5*GN\|~󠠄K9T !33###TÆ3B3z^{3##4&#"#3>32Ҍjq1sL``c"#546;!3#!#R>d9/Wp1Fd+93!533##!##53!5:]UUTT]}}}\rk\\~~?$07 6762!3267#&'&'#"&54%"32654&.#"&N [ xm7zEB{:] M.X[[XY[[X[VTl T Z2fq fW TRzxw{{wxz[^cWH %"32654&'6#"467.5463%!"h{1PAž(rڜ-*/1|I5#7N@*        JEE<2<2991/<299903#'#"!#!##535463wcM%ɩQge/яN#7B@#    JE E<<991/<29990#!"!!##5354637cM%۸ɩ{Qge/яNE &  E &   X&    X&   E &  E &  x X&   X&  E &  E &  r  X&  z X&  E&  7'E&  -x&  m&  E&  E'  y&  |&  EW& NLfEH'N4W & NK& N]r&  tj' v ?' ,~ '  ~&  j ' t ?' ,x  '  X f&] {X f& U /}>\/' a8 V>/'  8 WX f&] X f& U &8\/' 8 V8/' 8 WX f&] *X f& U B\/'  V>/' 8 WX f&] 2X f& U ^\/'  V>/' 8 Wa7&a ` D' \ a'NUa` 'N a ]2%#"'$4733267654'&54767;#"'&'0Qcpl?AOL64)>.VhFd((&*=#>2(I=/ b \^xHj<9"1B,f%TOA7.N?+  cG& J' T +9'  9'  6 "  &#"'&47332767654'3;#"'G{579T?:!e#"#V4^Wt<;?xC3^w3UT8@0&6D%3!"''&5473327&'&5476&'5%67654'&#"%3276'&'&bJDv-(0g:-0M,QG$"':AG 5' 343%@K5:,+ CfN@TSZ 'AO@H=.%4-+#%v_U[1C "&_ ,:%&'&5476&'53!"'+532767654'&#"%3276'&'&\:-0M,QG JF$"':AG 5' 3CfN@TSZ 'AO844U@H=.%4-+#%v_U[1C "&_X %!#53 76=3`H՞,1VV,1jٻX%#!5!276=33!!"^L,02,*VV,1jj1,t| X'  X'  Dv&vkDw"k ;#"'&=31,cK\WL71,\W+DxDy&kyDz&kzD{&k{0|&k|Vz}&}kU-Q&W~'~ A 9&W9'' AL 3&s`>Z '2>   &W &V AV&tY|_' 'p 'p  WL 3;!"'&L2,PXskj1,\eE&  E'  X&  X&  &r j'  E &  E '  #' R ' R E&  E'  ,&  R&  ,X f&] X f' p U\/'   V/'   WX f]X f.%3#"'&'&'27'&5767&5$(1{R=IrbJԖ`e_$m3HZdP]vbĘe4)@5 [_w\/&'&'&5672+5327676SSgURHKLXJKݣdht^#4b4bBPH:jV/);#"'&'+53276767&'&'&5672~AI2h6:H~D&a ] ` '   a$cF"'&''#"'&7673327676'&/37653323;#"'4A@E2J/1%=Gq_ev!UNBAF3I2Q, E;eF*L$Ftg£x&R" C~m8*@#?9,%#GvOdT7323;#"'#"'&'#"'&'+53276=32765!5d*,""@e;6:HO7* F35C%&F:DF*7@`*%Rx&),`X I6[m8*6759,%#GvOdTtg$&c 6 '   e'   f' R  ge G%327654'&#"%;#"/+"'&5#"'&5473767654'&'367632Ij($?GhK=.';4f&4-//3fJZ}eh<2H7(28`@%(jm=vbw $A7. *727&'&5763"327%+5=K4X}ں>SF8I \Y];d}M4F!Ť$/%+532767&'&5476762;#""654'hkB;(aD hYYf MXD=pʨ4/gg/($'UZ'-)74--38)-'bM,(U __ z F&i w L'  }F' w ~L'  &  *jL'  ?' ~ ~' " }t&  ]~' Nk ?&  ,~~&  n!D#"'5327654'&'&7676;#"''&5473327676J&P DfXRNB8D-<9_h$$EB|=Q&v+6(  %z|qe))5!27654'&54767;#"'&/P/62 hF F&,@XB:f"``h$$EB|=Q&v+6(  %?+)x.CKo $;#"'#"'&&733276761,+K8N3h^}cw@A(IiTcEkj1,3]?~/"*V\ss~B")9(j )5!27653WP,1se\,1j%)5327653;! hL,02,VV,1jkj1,TpGt4%327654'&'&#"#"'&#4763&547632;#" zL,5;(.;D Kp#IxAIM\HT(RfV*9:X DD(PNKOmf7*(?$G@^m*%'+53276767632%327654'&'&#"d`p@ht4,+^]EE>/4:''5)24ed0$#1P8O$*ME5EX !a%m/%#"'+53276767632;#"%327654'&'&#"|an@h4,+^]HB3&id>/4:''5).4fb0$#1P8S1>/E5EX d%6& "  ' w &  R&  Rr $&'&'&'3;#"'&'#"'&5476 xRot$8pqZI-&8:m*12e CY>)2'+eO,3;I0D-=67654'&#"27&'&5476&'5#"'+5327654'&$"':A4N--0M,Q;(Jxb 41~! @H=.%4-+#%v iEN@TSZ 'C49g=ql)D%'r.C!v-3j  ;AWE L9P)8K6(S/VL_+Y9K1\St|7%&'&'&54767632;#"'&##"'&'&73327676 ,)MW,.@"##C@"*5NhLy $Eq:<3, $.=N/[ EW3235huFX^"!ݺh^bNm/>ZUb=*(DV\BAL89DEnY1X;YTBEbD !!!5!#3#3#!#n!7`ddh%$q%1&R'N(X)fP*H+,m-.s/Vy0F1u\2u3u\45J6/7=899:;%<=#{DXE%{F{G{X{H'I{H{JKDLVMN Omo{P{QH{RVT{SRwTj{U{VW^Xdm`Y`ZL`[hV`\b]LF#7fo-L7NFf@103# qf?Q@ aa1<20KTX@878YKTK T[X@878Y3#%3#?Zk10K TX@878YKTX@878Y@&  //// //]]3#@   99991<<990KTKT[X@878Y@t        !      ]]'.#"#4632326=3#"&d9 #(}gU$=19#(}fT"<9! 2-ev 3)dwyi10K TX@878YKTX@878YKTX@878Y@ //]#1Ś7]@ 91<90K TX@878YKTX@878Y@ //, ]3#'# ӌ7i@ 91290KTX@878YK TX@878Y@ //*//]373 ӌ Zj@ 9910'3$ll/{m > #.#"/  waSRd {xz{w8796/{m @ PP120332673#"&/w dRSaw m6978w{zPa103#PXck@ 1<203#3#\zkcyk#!#uŚŚkf$(#5476?>54'&'&56763#7:)*%>8'9@B9Q[~CG=9. bEBTY;X1I*%#D>"Y`LAB\VE'*==010!!=V045!5!5gr4!5!;r4!5!/r^s 2"&46"264hrL&'◚vURyVP%`8n|TyRTv?F3#%3#?53#73#'3# 3#3#'3#}}dE&"'&547332767654'3;#"'&')+ubEW-7!K4/+X`t8A>|0l7%5A8>7KZd3(,*OQ/9?0654'&323276767'&54767632#!V)B,4((7(*HTO<?aNbNLZB`.NJ|m+M;3*)3P& ]027EW4,E$2Hf3Џ,' 3;!"'#!5327&'&5476762"67654'&'ȷ$&ň($28 D@$ 8P2*I1C299(M.L,0W 5+5DE2.4!.@%&'&'&54767632;+'$'&547332766'&'&#"B.y9()Wp8c2X]0Lh^E>>:lu{/"'"5 9Ld/  #+m=E2X:SmJN}`kI="'&4762<R8R8z?@?@@?@(8)*8@@@@@??V<D@!B  10291/<2990KSXY33+532765#5YZ͹Z-,˹iij>>iE'&5473327654'ߚ)+ubj{G{yo9;>|0lALj@G}t8654'&32676#"'&54767632'&'&5473)B,4((7(*H[b?zKbNLc9g'!.9ΊMRVV+M;3*)3P&;f4KCW-3E$2Zwfj}ػH(E  '  &  E'   X '8]X ' ]X ' T]&a>x9654'&"32#"'&&733276767#"'&54767632)B,4P7&,Hir$$xZT0A&?zKbNLZB`.,L95T2R$T&()X\^-"2(hLDV,4D$2Hf3C'o6#"'&47332767654'3dG{579T?:"FHt<;?xC3b`L 3H'ps'(tr @ <2991/0533)eq!%@G  %%B! "$ $&# # )"#&999919990KSX99Y"33267#"&546?>54565#53%=TZ>/mNb^hC^XC&DbRY;X1YnED98L\V@T? uYFL_<рDрD9mhR!9\XdffXXX%fmVuu/9%fZH{{{mjdLhX%?wXd=+XBFjX%%%%%%uuuuu%){{{{X/hh%%%{{{{{{{f{f{f{f{FmLuuuHj j///%h%F0<<^u?4An1mu -V8xv// 'J}}}9%uz%%)f{uu}f{=)/%%{{uuhj/}%{uuuu%hjxx/!79{{{zz8{zffX(hhgEfjjzz}}}v_AHHf}i_6w#6AAQ0^^))$=$=yy>/VX%V[^,,,,,)=/?VX)"V//yysb^_s?$U))//=X/UU?p6%%u%Vux/%uuJ%F63F 6DtP3LYF633Ft"p"m94u`!Y4uVUm"h%!Vu/hBPr< A<L}i{;=hcL|}PhN{{# A#h uU;bq}/%\%\L;%%){uzuz;}uuuhhhhhhAhuwU6`x+U]6[_6V6@6``A`6!i@F3uGzygIrIBIGhrh=hgfhhW(Hd11ZdL EEEXXX$$ zzC6LDDDDDD0V\~~6EEEEEEXXXX ~~>ly|as{jK}}cceesdaobwU0[SSSSxEV_In7777-7777Vv7kn#)+?+77LL,:d^E<<.?AEEGGG11OOGI8%[:X::GM[%#H[#{:GXQ:OWbG[CaIGdUU~%%UU?::[xM Fa^M3:%{{{}{{{{{f{7VmVmVmujj==////9d9dLL%hh%%%%{{{uu    ' ' ' '%h%h%hFFFFFFFF%%llMM@@cc66'33333333@EFFFFFFFFfFF633FFFFFFFFFF%%llMM@@ccFFFFFFFFfFFFFFFF%%%['/66333333%%[p?FFFFFJdd??PZZ!!=H ?I=;0A=XBF ?I=;0E1:1A8V%AG[M {_m *{%*/.j5'/h:TTJ B%0J%  BBBBBYYBBBBBBBBBBBBq?QQ2BXXBBBBGB*BB*B*BBBBBBBBBBBBBBBBBBEEB*BBBBBBBB%uIXXf+?;;;)}}?5XJWXXXXXXXXXXXXXXXWXXXXXWJJXXXXXXXEXXXXXXXXVVVVWXXXXVVVVVVVVVXVVVVVVXXXXXXXXXXXXXX^^OOOOOOOOOPPPPXXXXXXXXiXZZXXVXVVVVXXXXVVVVPIrZZ% % XaGX++|h}2HXXXBBX%XXX%XXX?XXXX%XXXX6FFHRFFF    <<<<<<xxxxxxxhhiFiiDDu777777?aa"2"Y::;+6.ocN8/&/// "N`ya7g!!!!GCL54=/U28Y^CVpj6gv2 1.rjD7`./<KD$>K--9.7.P<<<<<<....RRs'J*R*"..:=4%=?D-W&W;%J@3@V90~0G+%(C(#(=(.6W0$2$0174!$%2 02)!"$E=80+Qg.rA1fnCDStSt-IS-6SS`{{66O6ee5a}T2)XtSuN*u5&%2X87u)(,,uXXPXXT11T1jV%jLXZZ,,,,,,,,,,,,,,,TT(((AnTz?##EEEEEEEEEEEEjjXXXXXXXX`` 6|DD"DDDD0VLZ| LEEEEEEXXXXXX``$$  zzjC G6LZ||@S__R%fmVuu/9%{{{mjdLhf?y77//Xf=^?EjEEEXXXC6LLLLL,x 8d x ( d  4  ,(PD  !!T!!""@"#p$$%%&8''p'(P)L)*+ +,,,-P.<./ /0123X4$4T5$55567L8d989::<<=`==?,?X?@<@ABBCC@CPCDHDDEE FF8F\FFFH$HHI I$I<ITIlIIIJlJJJKK<KtKLMM4MdMMN@O$O<OTOlOOOQQQ4QLQdQQQQQS S$S<STS|SST8U<UTUlUUUVpVVVVWW,WDW\WtWWWWWXXXDXTYY(Y@YXYpYYYYYZZZ0ZHZ`ZxZZZZ[$[\D\x\\\\]](]@]X]^P___0_H_``\`````aa,aDabHb`bxbbbbbcddDdddddde|fffffg g$g<gTglgggggghh8hPhiLixiiijj<jTjljjjjjkk4kLkpkkkkklldlmmn ndno`op@pPpqqlrrtsst txtuXuvv\vw wTwxxLxxyy,yyzlz{\{|L|\|},}h}~~ ~<~~TH d0 dt4Ll ,DTt $<Tl, 8Ph(@Xp0H`xLTD,Ld|``\XxD@h(4pxdhl(``0XtD$$(x Lh LXH$L<L <T @4 @`XT4 (8HXÔ,Ĉ@pŀŰ,@TƀƜƬƼ`(|ɰ,d,Tt˄˔ˤ˴d̤̔L\x͔,TxΔΨμ$hϘϼ (XЈд`ь4XҠpӤԄ԰0L|ՠH֨$D`׈טר0H`xؐؠذ 0@Phxڈیۜ۬܌ܜ@0H`xސ ߔt\\l t|@pPhT@Xpl tH84,((8txh(8Hl|<$4px P tpL$dt,h    t   @    h 8HXx< d d(@Xp,h0`p h 0H`$lp $4D\t $4D\t(@Xp0Ht 0x (  ! !"8""##$$d%%d%&0&'$''(l())*,*+$+t,4,\,-l-|.0.@.d.t../H/h/0(001(112233X3x344455667 7T778x89::,:t:;8;H;h;<`H>?4???@,@A A$A<ATAlAAAAABBBBBCCLCdD$D<DEElEFFF4FLFdG G|HH HIIIIJJJKhKLLLLLLLLM(MMNNO4OOPTPPPQ QxQQQQQRR R8RPRhRRRS8SPT T0T@TPT`TpTUtUUUV VWlWXY$YZXZ[x[\h](]]^T_,_`H`a$abPbc\ddedfffggdg|gh h\hhiLijj jkkHk\kklDlmLmn$noodop0ppqdqr0rss\sttupuvLvw4wxxxyTyzz{`{|\|}X}~,~~`@tH,40h h 4L,<$pl `PxDTD LD((lx d(| |0H`x,D\t4Ld|,D\t4Ld| $<Tl,D\t,D\t4Ld|,D\t<\t4Ld| $<Tl,DTl4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld|,DTl| $<Tl,D\t4Ld| $<Tl,D\t4Ldt(@Xp $<Tl| 8Ph€˜¨ 8P`xÐàð(@PhxĐĠ,XŀŨTƐƴlX8ɐɐ ,Hh̠̄Lh0`ΐάϤLд4\ҠH|0DXlԀԔԨԼ  4H\pՄ՘լք4lpP 8Hݐt$0t0X|t @` @`P@pX8H8 \ 8L,H<`(LplDlL LDD0d4p(d  l  $   , p  `   P  <(\@p<@dP,,@P\ Dl|@((@x$L 8 !H!"#$8%,%%&' '8'`'''(((()8)x)**L+0+,@,,-T--.P../4/00T011t12t3344H45T556067,78$88999:D:;;<D>>??@ATBBCDEPFFTFFG$GLGpGGGHHTHHII\IIIJXJJKDKL L`LLM4MN4NOOlOPPQQRHR\RlRRRS STSSSSTT<TdTTTU(U8U|UVWW$WHWhWWXXXXXYL]^\^^^_$_t__`t`aaHaaab8bbcc\cd<dpdeeXeff`ffg,g|gh4hhhhhhitiiiij@jXjpjkk|kkklxmDmmnPnhno<oLo\olooooop,pqprps@tpuuv@vlvvvw0wLwwwwxx$xDxxxyy$y\yyzzPz|zzz{{0{d{{||H||}}@}d}}}}~~<~\~~~~(LtLxHpHtDh<h(\0h @t,X,`Dx4hP(X$@`|,Hd 4Hd (D`|0  <Pd8TD\0\| 8T (Tp$@hD<048x<D4(dh$dL<d(Dl\|H|(x°(ÜL,`,Ɉ ˬp4Ф 8ӌִ0׸(،٠ܜ(@PhPL8<LH`P88\$48TdLd4H,     T8x !(!"L"#%(L)*|**+8,.0T4 57X78;,<=>@ AAABLBBCDEEDEEEFTFGH<HJxL@OPPQ(QRLSSSTtTU(UUVDVW8WWX@XZ\]`adxjtkn nop\qsXtuw@wwx xPxxxyy,yPytyyz{P|$|} ~@$8x@h@p<d,\X8 l$|\xp@4\ h PpXhDp0\8h<,,PxHt Dl 4\4T\L4D(l`x0H`x 8Ph(@Xp0H`x 8Ph t8l(8l|,DTl,D\t0H`x 8Phxx,D\ll t(@Xp\4DH 8Ph€˜°@LńxnjǤǼt0dt0H`xː˨\Tͬ͜ͼ ,<L\l|ΌΜάμ ,<L\l|όϜϬϼ ,<L\l|ЌМЬм ,<L\l|Ѩ Ҩ\lդ,X֜Lxהװ<TxبٸT$\|ܜx|ޜ޴<Tl| ) +kW_B]  @  4     S  b     " :R & hhCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain DejaVu Sans MonoDejaVu Sans MonoBookBookDejaVu Sans MonoDejaVu Sans MonoDejaVu Sans MonoDejaVu Sans MonoVersion 2.35Version 2.35DejaVuSansMonoDejaVuSansMonoDejaVu fonts teamDejaVu fonts teamhttp://dejavu.sourceforge.nethttp://dejavu.sourceforge.netFonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. http://dejavu.sourceforge.net/wiki/index.php/Licensehttp://dejavu.sourceforge.net/wiki/index.php/License~Z )  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * sfthyphenAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F4uni01F5uni01F6uni01F8uni01F9AEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236dotlessjuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0243uni0244uni0245uni024Cuni024Duni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C8uni02C9uni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D6uni02D7uni02DEuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EEuni02F3 gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0343uni0358uni0361uni0374uni0375uni037Auni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0theta1Upsilon1uni03D3uni03D4phi1omega1uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0472uni0473uni0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni04A2uni04A3uni04A4uni04A5uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04BAuni04BBuni04C0uni04C1uni04C2uni04C3uni04C4uni04C7uni04C8uni04CBuni04CCuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni0510uni0511uni051Auni051Buni051Cuni051Duni0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0559uni055Auni055Buni055Cuni055Duni055Euni055Funi0561uni0562uni0563uni0564uni0565uni0566uni0567uni0568uni0569uni056Auni056Buni056Cuni056Duni056Euni056Funi0570uni0571uni0572uni0573uni0574uni0575uni0576uni0577uni0578uni0579uni057Auni057Buni057Cuni057Duni057Euni057Funi0580uni0581uni0582uni0583uni0584uni0585uni0586uni0587uni0589uni058Auni0606uni0607uni0609uni060Auni060Cuni0615uni061Buni061Funi0621uni0622uni0623uni0624uni0625uni0626uni0627uni0628uni0629uni062Auni062Buni062Cuni062Duni062Euni062Funi0630uni0631uni0632uni0633uni0634uni0635uni0636uni0637uni0638uni0639uni063Auni0640uni0641uni0642uni0643uni0644uni0645uni0646uni0647uni0648uni0649uni064Auni064Buni064Cuni064Duni064Euni064Funi0650uni0651uni0652uni0653uni0654uni0655uni065Auni0660uni0661uni0662uni0663uni0664uni0665uni0666uni0667uni0668uni0669uni066Auni066Buni066Cuni066Duni0674uni0679uni067Auni067Buni067Euni067Funi0680uni0683uni0684uni0686uni0687uni0691uni0698uni06A4uni06A9uni06AFuni06BEuni06CCuni06F0uni06F1uni06F2uni06F3uni06F4uni06F5uni06F6uni06F7uni06F8uni06F9uni0E3Funi0E81uni0E82uni0E84uni0E87uni0E88uni0E8Auni0E8Duni0E94uni0E95uni0E96uni0E97uni0E99uni0E9Auni0E9Buni0E9Cuni0E9Duni0E9Euni0E9Funi0EA1uni0EA2uni0EA3uni0EA5uni0EA7uni0EAAuni0EABuni0EADuni0EAEuni0EAFuni0EB0uni0EB1uni0EB2uni0EB3uni0EB4uni0EB5uni0EB6uni0EB7uni0EB8uni0EB9uni0EBBuni0EBCuni0EC8uni0EC9uni0ECAuni0ECBuni0ECCuni0ECDuni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10F6uni10F7uni10F8uni10F9uni10FAuni10FBuni10FCuni1D02uni1D08uni1D09uni1D14uni1D16uni1D17uni1D1Duni1D1Euni1D1Funi1D2Cuni1D2Duni1D2Euni1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D62uni1D63uni1D64uni1D65uni1D77uni1D78uni1D7Buni1D85uni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Buni1E9Funi1EA0uni1EA1uni1EACuni1EADuni1EB0uni1EB1uni1EB6uni1EB7uni1EB8uni1EB9uni1EBCuni1EBDuni1EC6uni1EC7uni1ECAuni1ECBuni1ECCuni1ECDuni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE8uni1EE9uni1EEAuni1EEBuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni2010uni2011 figuredashuni2015uni2016 underscoredbl quotereverseduni201Funi2023uni202Funi2031minuteseconduni2034uni2035uni2036uni2037 exclamdbluni203Duni203Euni203Funi2045uni2046uni2047uni2048uni2049uni204Buni205Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni2095uni2096uni2097uni2098uni2099uni209Auni209Buni209Cuni20A0 colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9uni20AAdongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20B8uni20B9uni2102uni2105uni210Duni210Euni210Funi2115uni2116uni2117uni2119uni211Auni211Duni2124uni2126uni212Auni212B estimateduni2148uni2150uni2151onethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2189 arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21D6uni21D7uni21D8uni21D9uni21DAuni21DBuni21DCuni21DDuni21DEuni21DFuni21E0uni21E1uni21E2uni21E3uni21E4uni21E5uni21E6uni21E7uni21E8uni21E9uni21EAuni21EBuni21ECuni21EDuni21EEuni21EFuni21F0uni21F1uni21F2uni21F3uni21F4uni21F5uni21F6uni21F7uni21F8uni21F9uni21FAuni21FBuni21FCuni21FDuni21FEuni21FF universaluni2201 existentialuni2204emptysetgradientelement notelementuni220Asuchthatuni220Cuni220Duni220Euni2210uni2213uni2215 asteriskmathuni2218uni2219uni221Buni221C proportional orthogonalangleuni2223 logicaland logicalor intersectionunionuni222Cuni222D thereforeuni2235uni2236uni2237uni2238uni2239uni223Auni223Bsimilaruni223Duni2241uni2242uni2243uni2244 congruentuni2246uni2247uni2249uni224Auni224Buni224Cuni224Duni224Euni224Funi2250uni2251uni2252uni2253uni2254uni2255uni2256uni2257uni2258uni2259uni225Auni225Buni225Cuni225Duni225Euni225F equivalenceuni2262uni2263uni2266uni2267uni2268uni2269uni226Duni226Euni226Funi2270uni2271uni2272uni2273uni2274uni2275uni2276uni2277uni2278uni2279uni227Auni227Buni227Cuni227Duni227Euni227Funi2280uni2281 propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni2288uni2289uni228Auni228Buni228Duni228Euni228Funi2290uni2291uni2292uni2293uni2294 circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni229Euni229Funi22A0uni22A1uni22A2uni22A3uni22A4 perpendicularuni22B2uni22B3uni22B4uni22B5uni22B8uni22C2uni22C3uni22C4dotmathuni22C6uni22CDuni22CEuni22CFuni22D0uni22D1uni22DAuni22DBuni22DCuni22DDuni22DEuni22DFuni22E0uni22E1uni22E2uni22E3uni22E4uni22E5uni22E6uni22E7uni22E8uni22E9uni22EFuni2300uni2301houseuni2303uni2304uni2305uni2306uni2308uni2309uni230Auni230Buni230Cuni230Duni230Euni230F revlogicalnotuni2311uni2312uni2313uni2314uni2315uni2318uni2319uni231Cuni231Duni231Euni231F integraltp integralbtuni2325uni2326uni2327uni2328uni232Buni2335uni2336uni2337uni2338uni2339uni233Auni233Buni233Cuni233Duni233Euni233Funi2340uni2341uni2342uni2343uni2344uni2345uni2346uni2347uni2348uni2349uni234Auni234Buni234Cuni234Duni234Euni234Funi2350uni2351uni2352uni2353uni2354uni2355uni2356uni2357uni2358uni2359uni235Auni235Buni235Cuni235Duni235Euni235Funi2360uni2361uni2362uni2363uni2364uni2365uni2366uni2367uni2368uni2369uni236Auni236Buni236Cuni236Duni236Euni236Funi2370uni2371uni2372uni2373uni2374uni2375uni2376uni2377uni2378uni2379uni237Auni237Duni2380uni2381uni2382uni2383uni2388uni2389uni238Auni238Buni2395uni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23A7uni23A8uni23A9uni23AAuni23ABuni23ACuni23ADuni23AEuni23CEuni23CFuni2423SF100000uni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254Buni254Cuni254Duni254Euni254FSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000uni256Duni256Euni256Funi2570uni2571uni2572uni2573uni2574uni2575uni2576uni2577uni2578uni2579uni257Auni257Buni257Cuni257Duni257Euni257Fupblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxH22073uni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EEuni25EFuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2601uni2602uni2603uni2604uni2605uni2606uni2607uni2608uni2609uni260Auni260Buni260Cuni260Duni260Euni260Funi2610uni2611uni2612uni2613uni2614uni2615uni2616uni2617uni2618uni2619uni261Auni261Buni261Cuni261Duni261Euni261Funi2620uni2621uni2622uni2623uni2624uni2625uni2626uni2627uni2628uni2629uni262Auni262Buni262Cuni262Duni262Euni262Funi2638uni2639 smileface invsmilefacesununi263Duni263Euni263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647uni2648uni2649uni264Auni264Buni264Cuni264Duni264Euni264Funi2650uni2651uni2652uni2653uni2654uni2655uni2656uni2657uni2658uni2659uni265Auni265Buni265Cuni265Duni265Euni265Fspadeuni2661uni2662clubuni2664heartdiamonduni2667uni2668uni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2670uni2671uni2672uni2673uni2674uni2675uni2676uni2677uni2678uni2679uni267Auni267Buni267Cuni267Duni267Euni267Funi2680uni2681uni2682uni2683uni2684uni2685uni2686uni2687uni2688uni2689uni268Auni268Buni2690uni2691uni2692uni2693uni2694uni2695uni2696uni2697uni2698uni2699uni269Auni269Buni269Cuni26A0uni26A1uni26B0uni26B1uni2701uni2702uni2703uni2704uni2706uni2707uni2708uni2709uni270Cuni270Duni270Euni270Funi2710uni2711uni2712uni2713uni2714uni2715uni2716uni2717uni2718uni2719uni271Auni271Buni271Cuni271Duni271Euni271Funi2720uni2721uni2722uni2723uni2724uni2725uni2726uni2727uni2729uni272Auni272Buni272Cuni272Duni272Euni272Funi2730uni2731uni2732uni2733uni2734uni2735uni2736uni2737uni2738uni2739uni273Auni273Buni273Cuni273Duni273Euni273Funi2740uni2741uni2742uni2743uni2744uni2745uni2746uni2747uni2748uni2749uni274Auni274Buni274Duni274Funi2750uni2751uni2752uni2756uni2758uni2759uni275Auni275Buni275Cuni275Duni275Euni2761uni2762uni2763uni2764uni2765uni2766uni2767uni2768uni2769uni276Auni276Buni276Cuni276Duni276Euni276Funi2770uni2771uni2772uni2773uni2774uni2775uni2794uni2798uni2799uni279Auni279Buni279Cuni279Duni279Euni279Funi27A0uni27A1uni27A2uni27A3uni27A4uni27A5uni27A6uni27A7uni27A8uni27A9uni27AAuni27ABuni27ACuni27ADuni27AEuni27AFuni27B1uni27B2uni27B3uni27B4uni27B5uni27B6uni27B7uni27B8uni27B9uni27BAuni27BBuni27BCuni27BDuni27BEuni27C2uni27C5uni27C6uni27DCuni27E0uni27E6uni27E7uni27E8uni27E9uni27EAuni27EBuni27F5uni27F6uni27F7uni2987uni2988uni2997uni2998uni29EBuni29FAuni29FBuni2A00uni2A2Funi2A6Auni2A6Buni2B05uni2B06uni2B07uni2B08uni2B09uni2B0Auni2B0Buni2B0Cuni2B0Duni2B12uni2B13uni2B14uni2B15uni2B16uni2B17uni2B18uni2B19uni2B1Auni2C64uni2C6Duni2C6Euni2C6Funi2C70uni2C75uni2C76uni2C77uni2C79uni2C7Auni2C7Cuni2C7Duni2C7Euni2C7Funi2E18uni2E1Funi2E22uni2E23uni2E24uni2E25uni2E2EuniA708uniA709uniA70AuniA70BuniA70CuniA70DuniA70EuniA70FuniA710uniA711uniA712uniA713uniA714uniA715uniA716uniA71BuniA71CuniA71DuniA71EuniA71FuniA722uniA723uniA724uniA725uniA726uniA727uniA789uniA78AuniA78BuniA78CuniA78DuniA78EuniA790uniA791uniA7AAuniA7F8uniA7F9uniF6C5uniFB52uniFB53uniFB54uniFB55uniFB56uniFB57uniFB58uniFB59uniFB5AuniFB5BuniFB5CuniFB5DuniFB5EuniFB5FuniFB60uniFB61uniFB62uniFB63uniFB64uniFB65uniFB66uniFB67uniFB68uniFB69uniFB6AuniFB6BuniFB6CuniFB6DuniFB6EuniFB6FuniFB70uniFB71uniFB72uniFB73uniFB74uniFB75uniFB76uniFB77uniFB78uniFB79uniFB7AuniFB7BuniFB7CuniFB7DuniFB7EuniFB7FuniFB80uniFB81uniFB8AuniFB8BuniFB8CuniFB8DuniFB8EuniFB8FuniFB90uniFB91uniFB92uniFB93uniFB94uniFB95uniFB9EuniFB9FuniFBAAuniFBABuniFBACuniFBADuniFBE8uniFBE9uniFBFCuniFBFDuniFBFEuniFBFFuniFE70uniFE71uniFE72uniFE73uniFE74uniFE76uniFE77uniFE78uniFE79uniFE7AuniFE7BuniFE7CuniFE7DuniFE7EuniFE7FuniFE80uniFE81uniFE82uniFE83uniFE84uniFE85uniFE86uniFE87uniFE88uniFE89uniFE8AuniFE8BuniFE8CuniFE8DuniFE8EuniFE8FuniFE90uniFE91uniFE92uniFE93uniFE94uniFE95uniFE96uniFE97uniFE98uniFE99uniFE9AuniFE9BuniFE9CuniFE9DuniFE9EuniFE9FuniFEA0uniFEA1uniFEA2uniFEA3uniFEA4uniFEA5uniFEA6uniFEA7uniFEA8uniFEA9uniFEAAuniFEABuniFEACuniFEADuniFEAEuniFEAFuniFEB0uniFEB1uniFEB2uniFEB3uniFEB4uniFEB5uniFEB6uniFEB7uniFEB8uniFEB9uniFEBAuniFEBBuniFEBCuniFEBDuniFEBEuniFEBFuniFEC0uniFEC1uniFEC2uniFEC3uniFEC4uniFEC5uniFEC6uniFEC7uniFEC8uniFEC9uniFECAuniFECBuniFECCuniFECDuniFECEuniFECFuniFED0uniFED1uniFED2uniFED3uniFED4uniFED5uniFED6uniFED7uniFED8uniFED9uniFEDAuniFEDBuniFEDCuniFEDDuniFEDEuniFEDFuniFEE0uniFEE1uniFEE2uniFEE3uniFEE4uniFEE5uniFEE6uniFEE7uniFEE8uniFEE9uniFEEAuniFEEBuniFEECuniFEEDuniFEEEuniFEEFuniFEF0uniFEF1uniFEF2uniFEF3uniFEF4uniFEF5uniFEF6uniFEF7uniFEF8uniFEF9uniFEFAuniFEFBuniFEFCuniFEFFuniFFF9uniFFFAuniFFFBuniFFFCuniFFFDu1D55Au1D670u1D671u1D672u1D673u1D674u1D675u1D676u1D677u1D678u1D679u1D67Au1D67Bu1D67Cu1D67Du1D67Eu1D67Fu1D680u1D681u1D682u1D683u1D684u1D685u1D686u1D687u1D688u1D689u1D68Au1D68Bu1D68Cu1D68Du1D68Eu1D68Fu1D690u1D691u1D692u1D693u1D694u1D695u1D696u1D697u1D698u1D699u1D69Au1D69Bu1D69Cu1D69Du1D69Eu1D69Fu1D6A0u1D6A1u1D6A2u1D6A3u1D7F6u1D7F7u1D7F8u1D7F9u1D7FAu1D7FBu1D7FCu1D7FDu1D7FEu1D7FF dlLtcaron DiaeresisAcuteTildeGrave CircumflexCaron fractionslash uni0311.case uni0306.case uni0307.case uni030B.case uni030F.case thinquestion uni0304.caseunderbar underbar.wideunderbar.smalljotdiaeresis.symbols arabic_dot arabic_2dots arabic_3dots uni066E.fina uni06A1.init uni06A1.medi uni066F.fina uni06A1.finaarabic_3dots_aarabic_2dots_a arabic_4dotsarabic_gaf_bararabic_gaf_bar_a arabic_ringEng.altuni066Euni066Funi067Cuni067Duni0681uni0682uni0685uni0692uni06A1uni06B5uni06BAuni06C6uni06CEuni06D5exclamdown.casequestiondown.case uni2E18.case]A GA% } % 2  %%@Y}2}Y&Y@&//2G@Gddkߖږ؍ }:Ս :  ϊ̖ˋ%}Ś   ]%]@%AA dd@2(-}-d   ..A]%]@%%%A  %d%BSx~}~}}|{zwvut uu@t tss@rqponSonm(nSm(lk2ji2hgfedcbcbba`_^Z ^]d\[Z [Z YXWVUU2TSRQ}PONM-MLK(JIJ7ICIHEHGCGdFEFEDCD7CBCC@@ BABB@ A@AA@ @? @@@ ? ? ?@@d>=-=<;(:9B9d818K76-65K404K3032B21-10/-/. .-,--@ ,,,@@+*%+* *%):)('&%B%E$#""! -!} -KBBF-B-B-B@  @   @    @  @7    -:-:-d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++snek-1.1/doc/fonts/OpenSans-Bold.ttf000066400000000000000000006665201353657467200173750ustar00rootroot000000000000000DSIGt:WtGDEF&SGPOS 77S8GSUB+=TOS/2u`cmap)/hcvt -fpgmsugaspS glyf%Khead<6hhea) Rt$hmtx$kernT+ ~qp6loca`+TVmaxp5 namef{"'postCl-&+prep k:9_< BJ   y X/\ 33f @ [(1ASC X ^ Ju+-X5?R!R=\?XR?=HuNJyNN#dH7HBHuR?XXX-f`w{dwBhP^w^wHh^) 3V1N 3BJLV\\\)Bqq}qB\\\y/B 7'h'RXJuRqhjd/RX=dm\X/;LH=qHu\9R . . Z=w{{{{*B9/^w^w^w^w^w^w    VVVVVVVV\\\\\qqqq\B\\\\\X\BBBBVVVw\w\w\w\\/1\{\{\{\{\{\wwwwBBq?qqBq+BqBhq}PqqcqmBBB;B^w\^w\^w\w\HHcHSh^\h^\h^\h^\)y/)y/)y/ B B B B B B171717VVV^w\h^\qT Hu JB`}D9{1^wBP3R^wN)\VmJ79-\qNBB)-\H\qN\B\BH\\y\9\N))V\mB )\)m{q)}jwh^B9hq)`9`} {/^`^ww)9\V?m?NHRV\P\qN)L\7\m/\ ?{J\B1\\qqq}B`RRRJT?%?!{5{bu ??!RRu wbf#R#B\?))9J7f : ; Z C;D9 )Xd%qLXXVXX))hq}^^N) T-;-+VyHTTq}) 3VrXy))wo\{\wbLf 7o) )qm^w\ w )\wo\w\wjw1\hu))Tj/y/;/^qN RP% 7w?\w\)f/ q)T/om{m?{TBJLm?{JhBVVVV{v\\\/^qN99^w\^w\^w\NHJ999m?{}?y/) V \\h\b\N9JND{XfwN\)//XsNVVVVVVVVVVV{\{\{\{\{{\{\{\BquBq^w\^w\^w\^w^w\^w\^w\wo\wo\wo\wo\wo\ B B1\- -11111 VV-f=BNdH7HB1)R)y/\\\\\n 0HI~'2a7 # O_?M   " & 0 3 : < D p y  !!!! !"!&!.!^"""""""+"H"`"e% IJ(3b7 #P`>M   & 0 2 9 < D p t  !!!! !"!&!.!["""""""+"H"`"d%aIvhcb]gD Xz}} Bvt n%"iOS0L\pr`<&'()*+,-./0123456789:;<=>?@AIJ$%TUVWXY\]^_`abcdefhijklmnopqrstuvhijkFopqrstu45]^@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,F#F`F# F`ab# # pE` PXaYh:-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-@ !H U UHUPLOMdNLd&4U%3$UMLdLLF 3UU3U?KFFF#3"U3U3UU3U03UoTS++KRK P[%S@QZUZ[XYBK2SX YKdSXBYss+ss+++++s^st++++t+++++++++++++^u^{V+T$$$$Vzzp Kh}+y* }Hq R  5  Z y < { $ m:Xz:sQ?V0 eq:++\``fm.#D~5K`v  , = !! !2!!!!!!!""v"""""########$$$$$$$$%%%%%%%%%&4&&&&&&'>'O'`'p'''''''''( ((.(?(K(S(((()))$)0)<)M)])n)~)))))))**R******+ ++#+4+K+W+c+t+++++,,,,-,9,E,Q,,,,,- --*-6----...*.;./2/C/S/_/k/|////////0000.0?0~0001 11,1<1N1_1q11111111222"232D2T2~23X34 44/4?4J4U444455M5u5566Z6n6w666666777767>7F7N7V7777788D8L8q8y8889A9I99::!:1:A:Q:b:t:;E;<>7>>>?H??@@W@A$AvAAABBB)B;BBBBCCC!CCD&D7DHDzDDDDE(E0EEFF,FaFFFFFFFFG!G)G1GdGGHH]HHI;IIIJZJJK"K*K}KLL$L[LLMMMDMLMTM{MMMN%N]NNOObOOPCPPQQQmQuQ}QQQRIRRRRSS>SOS`SqSSSSSSSTT+TLTkTTTUUAUUVV^VWW W7WfWrWWXXXYYZWZ[([0[[[[[\>\w\\\]$]]]^(^`^^^^__?_a___``p``aLaaaaaaaaaaaaaabc\cmcuddKdddddee:eeeef`fgggg"gNgdgugggh)hhi(iij6jjk\klOlmn0nnnoSoop$~Pe~e:CgH9CM_V\q࿉TV]wYucVf=J,`5=@;Xj0]?3310#))Ry @  $??3333331073#&R1 ή27=d @  $??33333310#654'3d1:1?V5@    ?293393933393910%'%7)u!㜉'm)hy9w)hpX9 &@  /3332293333310!5!3!!#}}dz?/33210%#7!4|A$ =V/333105!=u9 @  TY ?+331074632#"&uZVS[\RT\TVXRO[YD@ ??993310!D!JJH (@  OY OY?+?+993310!"!2326&#"H5]nl`akm^|so  yN *@   ??3939339910!!77'3NMNMwNP=@  NYNY?+9?+9399333310!!5>54&#"'>32!Pod,aQUWlhtG}sn;XVNH\L)dteNB&[@/"  '(!$OYPY   $  OY ?+3?9/_^]+9+39933339910!"'32654&##532654#"'6!2UdoqH[o$O+6hsgVYl0;Ր#q F@"  PY ??39/3+3933393339910#!!5!3!5467#q" %4//i>RNkd5V@+  OYNY OY?+?+9/3+99399393993102!"'3 54!"'!!76fO^5({7#=O *5 BHP$A@! ""%&PYOYOY?+?+9/+99339910!2&#"3632#"&2654&#"Hon}GYWd ccjcd^}m` {k{zQw7P.@NY??+999393103!!%/HJ".S@), &  /0!!)) QY #QY?+?+93939939329399102#"$5467&&54$32654&'"6654&J|}nxhsrqOaMebNdɿpEXr̻}JOkV`cQCuBbQD<_2.`?EPBJ%?@  ##&' PYOYPY?+?+9/+99399210!"'532667##"&5432%"32654&JCT\j :r `lbd^}FPV[ë^L|j|{Pwus &@ TY TY ?+?+33331074632#"&4632#"&uZVS[\RT\ZVS[]QT\TVXRO[YTVXRQYX?s(@  TY /?+3323310%#74632#"&4|A$/ZVS[]QT\ TVXRQYXX9'@=/333233993310%59TX9$@ P`/33/]33233105!5!X%}X9+@=/3333339933105XT=J%D@"   &' ##TY# OY?+?+3/_^]99393331054676654&#"'6324632#"&RmiC`Vmd`3ZVS[\RT\J`PK^:ADb}ƥndGJ<D?tg610&RB)=9Jb)y&@ LY??+3933310!!!!!sPs^%@  LY?+?3333310# 5!3265^5N!}3 *@    ?3?3333393310!!!67991 @JM(\F@"     ?333?3333333933333310!!&'!!667!667!H 50 11+%* ,1),63ݢ9B37QNHV D@       ?3?3933332339933933310!!!!!V:V;5N5)+6@ ??3933939233310!!!1NP\Z/1q ;@ LYLY?+9?+999333310!!5!!!qVDs@  $?3?3329310!!#3s B@ ??333310!!!J3 @ $?3?33393103#5!!3qT=-@?39/32333933103#J}NH$?33310!5!NRL!@ @ /93210&&'5!?DV?,BeV;u"J@&  ""$# KY FYFY??+3?+9/+333392910!'##"&5467754#"'6323265f;M®evjaK 1QeXZzeB@!!    GYGY?+?+99??3339933102#"'##!36"32654&p31 kpqhkt^opsЏ{E!\s*@   GYGY?+?+333910 !2&&#"3267f šZH|>XKJ=-L%/2/$\q@@!  !   GYGY?+?+99??3333910"323&5!#'#'26754&#"o 2; hjumo}fqr23}bf쑥!\bsF@# JY JY FY?+?+9/+933333910"!&& 32!3267oanr6/ebP{qq{R*3*.(')u<@ FY GY ??+?3+3339333310!!#5754632&#"! ϨϞ{N\NA:yyRR/M1GO^} /@ IY GY?+3??+3333310"'53265!432#"FuTFIMG1pSSVT)kGOI@#    ??39393?3339333393107!!!!Ņ9XD1`TiJ??3310!!!1Bs#M@& % $  GY  ?33??3+39333933939310!!4&#"!33663236632!4&#"QWuj)-nY-nQWpoyy^MWNV'yys1@  GY  ?3??+93393310!!4&#"!336632V^r)3ryy^QS\s (@  GYGY?+?+33331032654&#"!"&5!2m{zkl{zl1̍0sC@"  ! GY GY?+???+99993333310"'#!33632"324&p+kiqhkte;J!R\qs B@!" ! GY GY ?+?+99??333399310%26754&#""3237!!47#otlo{kj< 1ۅ%14PT=kQTws%@    ?29??3393102&#"!3366>)%5-4s ^^s\s%?@ '&   FY FY?+?+993333339910#"&'53254&&'.54632&&#"zKUQ,lZy7ʿ\TLWz:L! (6`$-9&6\wWX$.I)<;5\x/7L=@   FY GY?+?3+3993333910%27#"&5#5773!!wPprX9I#3fA>^2@  GY??+9?33333910!'##"&5!3265!)1s1V^r1NUsyy^ ,@   ?2?3333393310!!367!V?$ (?V^yl`}^J@$   ?3?339933333933333310!#!!3677!3667!7Vt0 P  . +^LUVa]H, ^ L@$    ?3?3933333339933939910!!!!ZZ};#d^L@%    GY ?2?+3?39333333939310!367!#"'532677N  G'AOL7AQy"^Rpg[u cd77^ =@  FYFY?+9?+933399310!!5!5!!B Q6@ ! $ ?3?393333933339104춯463"&5}~cKJdW\XR>}FDռ" # DF}/?/93103#!R"6@ $#$?3?39333393333910#566554675&'4&'523"RcKvsJdQ{}-pr5DG+ Vk "+FD5sn TTRaX'9}7@  /32}/3333333993310"56323267#"&'&B7}6gIKb5~6eBxZC6m 7@9m%8u^&@  TY "??+39333103!#"&546323^ZVS[]QT\^1%TVXRQYXD@#  OYOY??99//99++9939333210%$753&&#"3267#3\ӲZH|>ytRd; A$-= RjX@,   QY NYOY?+?+99/3+39939933399102&#"!!!!56655#53546]sNTwgMR@YSۏN,rdq!'<@"  "() %/32993291047'76327'#"''7&732654&#"6[ji[55}_esT}6mPQoqONof_57Ynk\}}33{}]hMonNPnpq@8   RY RY  ??39/3+329+333339339933399310!3#3#!5#535#53!H9<\Zݲ/#@ ?/99//9333103#3#j)-8U@* ."'39:6611**%%KYKY?+?+993333993333333910467&54632&&#"#"'53254&&'&&7654&'yH=߶RDNQJcr}>?˒QF%ZP߂tNe%5%O(TT 3.01J-@mS(iJO)9u'03"JCh.9YD^1O  @   /333932104632#"&%4632#"&K@BKLA@KQ?^\X9 6@   /33333/39333333310!5!3!!#5!}}}{/J(@   ?39?399333310!576654&#"'632!yf90(Qc{^i`JdY2&(XuUu_;9%>@    &' # !?3?39/399933933910#"'53254&##532654&#"'6632^h{XNp\SQ23/T9e>g7 nOyFZk5549&2&(/>L!@ @ /93210567!L?V4Ge42^?@   GY ??+99??33339339103265!#'##"&'!!X^~r1+*xX>h 1yyUU.,UJq/@ MY/3/+9/932910####"&563!>T\P3u)} @   TY/+33104632#"&uZVS[]QT\TVXRQYX4@      ?33/99|/9339310#"'53254'73ND[HNJXr>S=e\JH *@    ??3939339910#77'%3H0Nm-Jp_$*=9 @  ?32993310#"&5463232654&#"ᷟ#AHH??HHA\ŧŦdeeddccR^ Z@*       /3339/33393333333223323310'7'7ss#;w\\w9;w\\w9.&{'< ?55.&{'t?5Z&u'< -?55=y^'F@$"() %%TY% OY#?+?+3/_^]3939333103267#"&54676655#"&54632Ylm9WYO`fbja_5(ZVS[]QT\^JbMNX?9J:*8EliFJ=;VTVXRQYXs&$CR&+5s&$vR&+5s&$KVR&+5`&$RVR&+5V&$jVR #&+55 &$PuX #?55%o@<  LY LY      LYLY?+??+399//_^]++3333393339310!!!!!!!!!!#%3z\`Nw&&zs&(CR&+5s&(v\R&+5s&(KR&+5V&(jR !&+55*s&,CR&+5B.s&,vR&+5As&,K"R&+59V&,j"R !&+55/u H@$    LY  LY LY?+?+9/3+333333333103! !!#%4&##3#3 /fe|bңRdT`&1RR&+5ws&2CuR&+5ws&2vFR&+5ws&2KR#&+5w`&2RR&+5wV&2jR +&+55  @  /2229333107'՘-1-Ӗ-+ј-՘w"9@  #$! LY !LY?+?+9999339910!"''7&!27&#"4'3 ŋZZiQƒTX8Ti3 LhszAlmF}ht-u'^s&8C+R&+5^s&8vR&+5^s&8KR &+5^V&8jR (&+55s&<vR&+5 6@  MY MY  ??99//++33333310!#!!3232654&##6 Dd|dt%&@aL:0*4([bzN"$2{)3<*HwQ@j17P.^;yxHN!R&\j ,&+55&$MXR&+5V;&DM &&+5}&$NVR&+5V;+&DN &&+5&$Q{VLu&DQws&&v R&+5\!&Fvo&+5ws&&KR$&+5\!&FK#&+5wf&&OR&+5\&FO;&+5ws&&LR&+5\!&FL&+5us&'LhR&+5\%&G8o/u\ (`@1  *&) #GYJYGY?+??99//3+3+993333333399910"323&55!5!5!3##'#'26754&#"l5 ;2@ hLnieoSd  TPe3ǡT{&(MR&+5\b&HM&+5}&(NR&+5\b+&HN&+5I&(O/5&+5\b&HO?#&+5&(Q5\(bs&HQ?s&(LR&+5\b!&HL!&+5w's&*KR(&+5m!&JKN&+5w'}&*NR&+5m+&JND&+5w'f&*OR"&+5m&JOH&+5w;'&*9m!&J:ZE&+5fs&+KR&+5&KK5 ## ?5Q@( LY     ?3?399//33333+333333333333103#!!!#535!!5!5!fʸ6C5w-ôT@*  GY JY    ?3?99//3+3+9333333933910!!4#"!#535!!!3632ϴsϜ1;fP/ǡS.`&,R"R&+5&R&+5?&,M$R&+5&M&+5}&,N$R&+5+&N&+5B&,Qw+&LQ!Bf&,OTR&+5^??3310!!!1^BR &,-)&LMJhR s&-KR&+5}!&7K&+5;P&.9;&N9u^A@    ??39393?333333293107!!!!ύ:EHƏ1FnZ^ۡR?s&/vR&+5&Ovg  ?5;?&/9Jc;&O9?&/8u ?5&O8?&/O/p&OO8? E@!       LY?+?993993993333333103'7!7!Eq6uQ)oXĞX K@#    ??99//33933333999999107!'7!FuGq1+ph+p-s&1vDR&+5!&Qv&+5;&19;s&Q9us&1LR&+5!&QLN&+5'QRH@#   LY'?+3?33?39932933999910"'3267#!!3'&5!rS]Imv {R[SN}PmJsA@!  GYGY?+3???+933933910"'53254#"!336632=kM;<{r)2tʼ۫^OUw&2MR&+5\&RM &+5w}&2NR&+5\+&RN &+5ws&2SBR (&+55\!&RS{ ,&+55wP#e@6  %$LY   LY  LY LYLY?+?+?+?+9/_^]+333339333310!!# !2!!!!!"3267&&P&-S>=#d3Az&# ik \{s+2p@:/0&&004 3/JY//,JY )GY FY#GY?+3+?+99?+9/+9333339399910 '#"&5!2632!326732654&#"%"!&&pGkdQfm{zkl{zl^| u-OM*.'(Esyo}Hs&5vR &+5!&Uv&+5;H&59c;ws&U9Hs&5L3R&+5S!&UL&+5^s&6vNR0&+5\!&Vv .&+5^s&6KR5&+5\!&VK3&+5^&6zb\s&Vz-^s&6LR-&+5\!&VL+&+5);y&79)/;7L&W9)ys&7LR &+5/(&W8?5)yF@#   LYLY ??9/3+3+39333339910!!#53!!!3#sPsTb/7L]@/     FY JY GY?+?39/3+3+39933399333910%27#"&55#535#5773!!!!wPp4IX9I#fƔA>^`&8RR&+5&XR1&+5^&8MR&+5&XM/&+5^}&8NR&+5+&XN1&+5^&8PR &+55&XPN &+55^s&8SR %&+55!&XS '&+55^&8QH^&XQs&:KqR+&+5!&ZK+&+5s&<KR&+5!&\K$&+5V&<jR &+551qs&=vNR&+57!&]v&+51qf&=OR&+57&]O&+51qs&=LR&+57!&]L&+5? "@  GY??+333310"!4632&Pϼ͞xG\-\//I@$   FYGYGY?++9/3+39333333910#"'5325#5754632&#"3#鼰kM;;}–pHR?myqRR/F!-w@;! "(@ ((  /.LY +!%?3?392239/+3333933932932999910!!!&54632&'5667!4&#"366/jl+pm1fVDpL.jVl6**7V&2U>J#:Wn-!EG*x t7-33-\3V;",8D~@?'(#,##3--9?3??  ""FE,66'<0B@ KY FYFY??+3?+9/+239333392993293210!'##"&5467754#"'63232655667!#"&546324&#"326f;M®evj.jVώppqn6**710*6aK 1QeXZze/*x iDlnli-33--44%s&vR&+5V!&vA&+5ws&v1R+&+5\!&v{,&+5^;&69\;s&V9! *@  /22933333310&'#567!TMN˽CeH]SQ_p4F!*@   /32933333310!&&'5367Tlw˓RT!T2/{]SWY/3910!!Z+ &@ @o /3]293210#"&'3327 ܦ/UU+/6} /3910432#"SSGOTJ  @   /33/]39310#"&546324&#"326Jppqn6**600*6lnli-33--44  ?3/9910327#"&54673-#7o- J8-lU)56m+QD^@  /93210667!#5 Nm6T 2@  ! /33399939323104632#"&%432#"&'667!#G:9JJ9:G#9JJ9+5u'{B'(T 2>+5'+T 2>+5',T 2>+59&2RT 2 >+5'<T  2 >+5l&vZT $2$$>+5&U "&+555$%T@LY??+33310!!TJ9 ((1q=f+wG@% LY   LY LY?+?+9/_^]+33333310!5! ! 32654&#"3iQQeϿfzmm|B,P.3 /@  LY ?3?+333393310!!!&& 3 R <>)Jo01R? C@#  LY    LY LY?+?+9/_^]+33333310!!!!!Rdw=Hw2=#@ LY?3?+333310!!!!!=L3NyS@)      LY  LY?+99?+93993339939310355!!"'63!N5J3#-  = )y7<\"+V@+""+ -',+ +MY! $$MY    ??99//3+33+333339333331032654&##5#"$546$335!32###"33)衏55)9V;m@@  MY ??339/3+33333933310!#!# !33!3265!33"#L !7 W@+  " !  LY  LY?3+3?+993333333333993310"!!&54$3 !!654&%Ąs<?yv}H]AƸ`H9V&,j"R !&+55V&<jR &+55\^&~T13&+5N%^&T%/&+5^&Tw&+5^&T &+5&UD *&+555\q *K@&)", +GY%HY%) GY ?+93+?+9?3333339910%26754&#""323673327#"&'#ovko{kv2+ 'T [pv"nߏ 00TT^7ahv MZ)X@," '' +*"##"GY## GY GY?+?+9/+9?333393339102#"'!4$"32654&##532654&~0<|H5cnnй?4'|pnsmf\d^<@  ??33333333939310!47!3667!8,V=B9=c-6VR>I,Yt\)k@5!!$+$*$$!''GY!!   FY?+3?99323+9933333993393910&54632&&#"!"$5464&'326oэy\XIJC_i{xioz-B-76.6iF^Ҷ]:#~e}N%s&b@2## ('&&JY& &&   FY FY ?+?+999/_^]+933333933910#"!267! $54675&54632&&#"3H gY瀐sX^wMqnAH}-)Mk 1э.&026B7\ P@' " ! !FY"??+99339333333399310!6654&'$4%#!5!EOOfH43V'IgA%]/ )M~ ߶JZ5 !}s2@  GY  ????+93393310!4&#"!336632V^r)3ryyy^QS\+ ?@ FY FY  FY?+?+9/+33333310! ! 267!"!&&  uk7iyln i kui5^ !@   GY ?+?33910327#"&5I#3^!"b@2 ""$"# HY HY ??+?+393333339939393103'&&#"5632327#"&'&'##$\_24OWss3%L7!$r'n)r+ .!\ZJ Fhb lwC4L^ws^ *@  ?2?9323393310!36!!9Esf4X^+\.e@2%&&))#  ##0/!++/JY &" JY ?+33?9/+9333339933339333104675&5467##5!#"33#"!6654&'&&\ۇC$K끓/aEOOf~6 4k% ҉u_R{{GU5!}f]/ )&\sR^B@!  FY GY?+??+333339933910%27#"&5!!#57!#C?)66#Buf31ys/@  GY GY?+??+3333310#"'#!32%"32654&ښqj+t#3f^-@  GY?+?333333310 !32654&'!2ir}r+3( `kַv\w #P@)## %$FY FY"  ??3+3?393?+33339333104&#"66$5474632^Z9@nxZJֺNOa a#zy4 m X@,"!  HYHY?+3??+3?93333333339333102!327#"&'!&&#"56ZrP)J39F=14Un}4hF88;rm3q{%@5 Fu`F>FA@   FY ??3+3?3?33339333106654!!$!PN#<& !3ŭ ;m{^'?@ %%) (! FY?3+33?39/333393910"&'##"47!3265!3265!z) .w0@%}c`SLLT^d}%@1iind.Ѥt'هs3 &j #&+55&j' +&+55\^&RTB"&+5^&TN&+5m{^&T50&+5V&(jR !&+55)R@*   LYLYMY?+??+39/+3339392910"'3266554&#!!!!!!2mtWcI62S_ZJ\&+D7YG^νTs&avR&+5w#?@  LYLY LY?+?+9/+33339910"!!327# 4$32'&J y ɼjzMloWɿM(#jW70%<^6B,9V&,j"R !&+55hR-#Q@* %$#LY LYLYLY?+?+?+9/+33399333103 !!!'"'5326!32654&##s'i>_T@:35>7[ X^HcaW Hefc[R@*   LY LY LY?+??39/++33333933310!!!!!!!3 32654&##i#65s'X^Hw=aefeY)F@#   LY LY ?3?+39/+333933910!4&#!!!!!!2FPZJYG^Ѻ`s&vR&+59&6^R&+5V= 2@  LY'??3+?333339310!!!!!!!=TR65VL$ ?@  LY LY LY?+?+9/+333339103 !!!!32654&##z8VhO7HefeY%Ta V Q@(     ' LY LY?+?+33?33333939393103!3!!!! q)Tl ];"COLTV^(T@(       ?33?339333333332333393333310!!!!!!?!@<<B^&J@% !(!'MY $$MY$ MY ?+?+9/+93339933910! '3 54&##532654&#"'6$32ȫ^nq{ԅ}`O-3ahXfKYwSM,@  ?2?39933339910!3!!4#! sZ>VJ&6R&+5` 4@    ?3?39333233333310!!!!!`6 J<B=1@  LY LY??+?+3339310!!!'"'5326!=>_T@:35>7[ caW 0f+w2=n3w&)y79E@!    LY?+?39333393939310#"'3267!379@    LY '??+33?33/3333339310!!3!!!!!5"68@`LJu A@!  LY LY LY?+?+9/+33393310!!!!3 32654&##uV{8/hPaefeY A@   LY LY?+?39/+?333339310!!!3 32654&##!!p6d5NQC5beffXy 2@ LY LY?+?9/+3333310!!!3 32654&##V6z80hO7aefeYHI@&  LY    LY LY?+?+9/_^]+33333910"'63 !"'3267!5!&&)c]bEc x8'gq}KMQ@+    LY LY    LY?+??9/_^]+?+3333393310! !!!!! 3 4&#"6"I<N+LwM>!3x Q@(   MY LY  ?3?+9/+933339339310!&&54$!!!#"33| ʙx12юJ1VdapV;uD\%#D@"% !!$ FYGYHY?+?+9/+933333310%6%36632! 2#"\%7,#~|=5d16kY5(1P{RXox+#2Q)^ N@'" !JY JY  JY ?+?+9/+93333393910#!!24&##3264#!326qnw=ffaead9Zc^B;If8^@FY??+33310!!-^^o1^I@%   FY # FY ?+33?3?+333399339310%#!!!36!3\WMw^`op$\bsH^R@'      ?33?339333333223333393333310!!!!!!;dVVd;?77FN#s(L@&'  #*)('('JY((  FY FY ?+?+9/+933399339102654&#"'6632# '532654&##5jzMPZw߉uV`v8=66&!-'9 "}efVE(.C>DA#^ ,@     ?3?39932339910!!47!o^FFw^#?&6&+5^ 6@   ?3?39333233333310!!!!}PE71^7^^5@  FY  HY??+3?+3339310!!!#"'5326! \|jD119M=Ny O!^:@     ?33?3993323393310!!#&''!!>!!6++13 !%,q>l nD^#MGn^ 3@  FY   ?3?39/+33333310!!!!!1V^R3^\sR^#@ FY?3?+333310!!!k^y^sS\sF/=^(@ FY??+3339310!!!5=^y^\\'P@( ! FY FY ??3+3?3+3?333393333310!$54%!4&'66>4&ŚXd/%d ^[od^ 4@   FY#??+3?333339310%3!!!!!N12^y{^-@ FY  ??39/+33333103267!!#"&5XM1jU^g( 8.!^ 5@  FY?+3?3333339310!!!!!!!!1w1w1^yyo^>@    FY#??+33?33/3333339310%3!!!!!!!!1w1w1^yyf^ A@!  JY FY JY?+?+9/+333933103 !!!54&##325gh^PyA:-^ C@! JY JY?+?39/+?3333393103 #!!4&##32!!ѓ11Xhg1^A:^^ 2@ JYJY?+?9/+33333103 !!!4&##321hg^A:Js?@   JY FYFY?+?+9/+33333910"'53267!5!&&#"'663 ҆nx ZkdwVK^EP{|?#-sI@&   GY FY  GY?+??9/+?+3333393310#"$'#!!36$3232654&#"1%bqobcpob13^R^ M@&     JYJY ?3?+9/+933339329310!!&&5463!!#33#"J-loϨnYKU-sbFOI\b&Hj 1&+55&j@6$$$('' GYJY  GY?+3??99//3+3+93333399339910"'53254&#"!#535!!!3632=kM;<{^VsϜ1;fʼnn/ǡS!&v&+5\sA@! JY FYFY?+?+9/+333339910 !2&#"!!3267!Xkis[ngOf#* JAz}˃}$,I\sVL&j &+55}M^Q@* ! JYFY HYJY?+?+?+9/+3339933310!##"'5326!32!4&##32- \|jD119M=#bay OP`A:^Q@)   FYJY JY ?3+?39/++3333393331032!!!!!!!4&##32^;1\1Dba3^RA:V@+   GY JY    ?3?99//3+3+9333339933910!!4#"!#535!!!3632ϴsϜ1;fP/ǡS!&v&+5?&\6&+5o^ 6@   #FY?+3?3?333393103!!!!!12x^yo}#@ LY??+333310!!!!! q6#@ FY??+333310!!!!!^1s&:CR&&+5!&ZC&&+5s&:vR&&+5!&Zvd&&+5V&:joR 3&+55&Zj 3&+55s&<C|R&+5!&\CY&+5R/333105!R\R/333105!R\R/333105!R\1N @  /39/3233310!5!5!5!NRR1@  ?33210'673'e5B#[q@ ?33210#72~E(?@ /33210%#7!4|A$ @  ?33210#&'7?%@;a Uw%@  ?323322210673!%673!e5B#e5B#[q[qw #@    ?323322210#7!#7!2~E2~E((? "@    /323322210%#7!#7!4|A$4|A$  { N@%     ??9/3339933339333993310%!5!%77777LB_{}@>           ??99//3339933333993333339333933333310%%!5'75!%%oK78L//L87K/-yxb)  /93104632#"&b욣ub9 #,@ $ TY! ?33+3333221074632#"&%4632#"&%4632#"&uZVS[\RT\GZWS[\RU\HZVS[\RT\TVXRO[YQTVXRO[YQTVXRO[Y?  "-7BCd@1.>8388E D)###C5 @+1;& ?32???333223/3329333293332103254#"#"&5!2%#3254#"#"&5!23254#"#"&5!2;-2``2-Y+-2``2-YP,2``2,X5}{}J}{}}{}j BR^0@/39/39333333210Rs=wwR^0@/39/39333323310'7s#;w\\w9u'Hw@ ??33210#+Jf *@     ??39299339104&#"#3363 D<9ZHǢIL@`qTe/#'V@+  RYNY NY ??+9/+9/3+333333333910!!!#53!!!!<ϕoRj%y@=  " &' ! RY !RYNYOY?+?+99/3+32+3993399333333939102&&#"!!!!!!5667#535#53546]NEPLggFJdKR#VVqsJl'*jUss)q@< #''% + +*QY NY&#&QY#!PY # # #NY??+99//3++3+?+3339339933391032654&##!#!! 27#"&5#5773!!B~T5uNSaXHhumh#3>lgGD==DG>Zud7f@IItZOJĨǤdeeddcc82)f_+-)$F@ "  %&""   /3/9/93399399333339310%2673#"&5556746324#"66+5X9Z@-       /3333322323333399392910'7#5!7!5!3!!1YPP`\OT۪V٪V9= :@     /2/9/339333333331035!5VTX9= 6@    /2/39/39333333331035! 5XT>JXP B@    ??9333993393333310#3P=r=r!fg)&IL)&IOh3? @  /3293210#"&'!32673Ysec ?gS[_}^ !@  GY?+3?33310"'53265!FuTFIMG1VT)^@  ?93210667!#^'PV1@^;@  /93210667!#^'K[V1@N!@  /93210!5673'NX1@)5  @   !?3?399331032654&#"!"&5!2%-12..21-X}|{{}3 J B@     ??9/3392999333399310##5!533!547}} 5ᗗAͤVblT9L@$  !?3?39/3393993939393102#"'53254&#"'!!6d27WQ?8m%84 *?@+-58@   !?3?39/39993399310#"&5%366322654&#"ٯ#C YJt;><9Dm5W+/G?6DjBT;J(@ ??399939310!5!TMJ)-5!-F@!%+%+  ./ (( !"?2?393939933993399102#"&5467&54632654'"6654&CLKB#GW:9;(A+B BA>=21 , 84 95!/333333333/3339333333333333339/333/39/3/339/393/399333333333933939332933333333333310!#%5!#533!5353!5!!5!5!#3#35!#35!35!#35#3#3#"&546323254#"%32##32654&##32654#"'53253T/0momImmmm0oowoooomm~smp.,;0m^{B.$*/;J1%Z^4+V}i0oo/mmmmmmoo;mmJoooo/yhIaCS1D D8QYb" "+%J fVr_cT*X@)%  +, (("""//99//3333/9933999939333210 54676654&#"63232654&#"TV,AgIOGRZ?>1HT;GFBIHCHEVW/2A1R~X8*P:/5K6DpJ;?HI>@IH}!&7L&+5))6v@="4 1 1*..((6  78GY44 **FY11FY1%FY?+?+9/+339/+9933939399333310&&#"!"&54654&#"'63232655'&$&546323e;F *0LZga\Ȣ,ߩ89r+-5i+*V^X?GKO!tьF@"   MY?+3??9333333393310>32&#"!!}>xhu_UB,(5C6PTB +'`/3^(l@5 ##  * )!!  FY &FY?3+39?+339/3339939393993310"'##"547!57!!4'!32655!326FS R??3@>\gTLLTg\fѲɰssu&0vT&+5B!&Pv,&+5&$[sV;u&D[r9&2R\XN  @  /39/393210#"&546324&#"326Nppqn6**600*6lnli-33--44yh+1@ ?2939392210467#"&767!#yIE%-%?BCJZ**RpJ%%-J'CW^)&I'IL/)&I'IO/wH@#     LY @ LY?+?+993/3393339910! ! 65!3 !"jRZ]-${=պszmk=2.\"#H@# $#   GY@ GY?+?+993/3393339910!"&5!265!32654&#"pG-Wi4m{zkl{zla1̍0EE-k}()9@  @LY?+?39/3/33323310665!# 5!3265^JF- k5jg¢!iJsJ@%  @KY GY??+9?39/+/339323310!'##"&5!3265!665!3)0s1V^r1GN- lMVsyyutfW!C!vR /23910#'6654&#"56632 K6*"AJi)Ϝ)G 3% " oR%}/10432#"٦TR疖GNs&(CzR&+5s&CTR&+5\b!&HC$&+5#!&C &+5w=2b@1++((00 4#3))  MY-&&LY ?3+39?3+3339/33339393310"'663 !"&'# !2&&#"327!3254&'ZDl@K )tMMt) JBlD[&SU6Hl!-1g]4^dSl"}O@(  MY LY   LY?+?99//+3+3333333339103 !!!5!5!!32654&##5{8V5yiPd7defeY'J@&  FYJY JY?+?39/++3333333339103 !!!5!5!!4&##3231g9hgyˤyA:R"U@,!$#LYLY! LY ?+??9/3+3?+333399339910!3267# #!!3!2&&#"!f Ъarhw6,|$dZWdw(%(#N=:g':s W@- " ! FY  FY FY?+??9/3+3?+333393339910"$'#!!36$32&#"!!3271[MVxdkZ ts3^R,$?qp~PE E@#     MY  ?33?39/+3333999222210!#!#!!!'df-{/u9 wwDdYE4^ L@%    JY  ?33?39/+3333393333999910#!#!!!!'&'bNPo #HZZ^uPW] t@9     LY  ?3333?9/+3393?3333339/39333399999910!#!#!!!!!!!'&'dg6{/u93\ wwwCDd'47^x@;  FY   ?3333??39/+339333339/339333399999910#!#!!!!!!!3&'oBBn#`553^RDI)F@B    LY MY ?22?9/33+39333+93333393339393393931036675!!&&'!!):9{)TCGV({ų$Ջ+%;|dqe{{9^@B    JY JY ?22?9/33+39333+93333393339393393931036675!!&&'!7!u(}[4Yy*t^8/6<^hZ} mjj {'MB ? DNm"#@V"  ! % $#% " "LYMY LY   ?333??9/39/++39333+933333233933393933939310!67!!!!5!!&&'!!P,36C9{)TCGV({3+%;|dqe{{9L^"#@U"  ! % $#% " "JYJY FY  ?333??9/9/+3+39333+933333233933393933939310!67!!!!5!!&&'!7!#u 3Yz)u^J0>]_\b)YhZ6ì{ԅϾSw`6NWe "')X)enahXfKYw6Lw(dN./#dL@Y4* 99 GEECCIIIB@ *0N?@@**M?{H3"6TJ~iholaKYUON0V4D|턄vpjzMPZA>]W9RVcd o"a_{ "}e'44*)@ADA8=66&!! l_)fL-muFw ?@ LY LY  LY?+?+9/+33339910! ! 267!"!&&iQQeHzmm|ۮ\s ?@ JY GY GY?+?+9/+33333310!"&5!2267!"!&&ap>ndbpm1̍0ttttqppqA@  LY ?3??+933333393310"!!67>32&B.@*9!+67\xVtF3GvsK'f@@    GY ??+?3933333393310!367>32&#"!?2 ,{3LkULH+' 3^Oo|Xj1,7s&v'R )&+55!&v *&+55w ".k@7  0)0#/ ,LY &LY  MY ?2?+3?393?+?+33222333939310!367!#"'532677! ! 326&#"N  G'ANM7AQy"LECK ^Rpg[u cd7{xxv\ )s"0k@7  2##2**1- GY-&GY&  GY ?2?+3?393?+?+33222333939310!367!#"'53267732654&#"!"&5!2M  H'AMO9@Qy";m{zkl{zl^Kwg[u cd7)̍0w91(P@*#'  !!* )#' 'LY@ LY?3+3?3+3333393910#"'$%66326632$%#"'9#qv.$D=5H1}E0-E'ff)(ss$FC{&<2,B&%**JMKKM\+T@, $$** !!- ,'$**FY@ FY ?3+33?3+33333393910#"&'&54763266326654&'#"&' H69G nj99+>SOPI>=6D1&5:;6'%#!RR">'+!3~/816Aw=1GY@PLO=cGRKNxRw>/-!pcenA6) 3;1bt6&-&]V:5:Z\R)@R@RDH54MH+AAHH# (##TS@,AHHEPEDDP,P,P15511;@   FY (@FY&?2+39?3+33323/99//9/3933333393339332910 32&&#"3273265#"'632!"'#"'&&#"#54>32356654.54632f|V?B%wlmv'A>V||z&g2.+ ":fT:pwN2B%,%NGNT)&< V$&-&^V ;4:Yw=B2@@H?<;4788;;++((00 B#A4??@95=<8<<@@))  MY-&&LY ?3+39?3+3339/23229333339393322310"'663 !"&'# !2&&#"327!3254&#'##'##'5'ZDXcGRKNxRw>/-!JT oYggggY*@A  )&%!""%%    ,+))&#''"&&* ?223?3323333933333939339993393229910!!366!36!!#'##'##'5f@% ? j`4ㅘ'R7117117P^ov6u>?;/XffffXw#3@  LYLY?+?+?3339310 4$32&&#"!267!ZMe[Z:NjWg':\s3@ GYGY?+?+?3339310&!2&#"327!Z!Xh~rw}* PB% hy ?/9910%'%7%7%LG㴁FGJ{J;{Z}9IĤ{{ @  /393210#"&543!632#6083m bm69+3G8u^s9H @  /29/392102>32#&&#"##5Nwp:in? +.IJ%-&6ua1;47X$@  /393939102&&546oGN%-%D1~UX:5 : V`MYX$@ /3939391056654.546320E%-%NGNT^V ; 5:Y) (6DR_m@JP4,H,,ck:&B&&^ k^VkVnod^WjgS``gIA;O7EE>LLZ-%3))"00ZZgg  /32/329/39/3332229/3332223322299932932932102#&&#"#62#&&#"#662#&&#"#66!2#&&#"#662#&&#"#66!2#&&#"#662#&&#"#6!2#&&#"#66]qOb@3/2),!$6::$,2?@ #037;(++;3# /3/393333339993333333210#6736673#&'5&&'5'766'677'&&&'7BF$a5Ia4GA݁ZBO݁ExbCExbC{LbRC&b'Z1BO݁GA܂!Ia5F$a5DnXb'XDnXbYFcbxF24bEV+!"[@-! #  " LY  '!?222??993+/33293339993210!3!!!!4#!#"&'!3267 sNZwYsce {>VTLgS[_ooN? !_@/  "  ! @  FY  #??+??39922/33293339993210!!!!47!#"&&'!3267o+މ)g  Yqgd^FFw^ὩJlN_[/N@( LY  LY  LY ?+?99//3+3+33333333910!!3 !!#535!32654&##+z8V6hO7!HefeYP@) JYJYJY??+9/39/++33333333391035!!!3 !!#4&##321ymhg5?oA:u@;    LY LY  ??9/2++99399399333393293999910'##!! 37'7654&##_]XsVr D:R)w>}p5Rou5Zmhs(@A!"$"##&&* )!$##"&"&GY GY?2+???99+9939939933992393393999910"'#!336632'"337'7654&p+6c^l4qhktfRe;JSSѠ{v!{dNl/P A@   LY  LY ??+9/3+3333333910!!!!#53PoʉTd^ A@   FY  GY ??+9/3+3333333910!!!!#53Lω^^yU@+  LY LY LY??+9/+?+393333393910"!!!632#"&'32654&m5Jk1nJ o ס/Ͱ ^Y@-  HYGY  HY?+3??+9/+93333339910%#"'3265!"!!!632zr-y1t}*.1JKD31^ Vn@6   LY  '?33??39333333+3/333333333933333910!!!!!#!!!?!@R=ը<<BLoX^i@4    FY  #??+?3?33933333/333333393333333910!!!!#!!!;d VVd;?77F^&N#s&1VJ@$    LY'??33+?3933/333333233910!!#!!!Gո6 J1 L<Bo5^M@&    FY#??+3??3933/333333233910!3!#!!}PE)71#^7^Pa@/      ?3?93333233393333339999910!!773!!#j|6zXdZcbGy^U@)        ?2?393333332233333999910!737!!#'!cthE>8.N\Nȱ?Mǿp7>8&=Jpb"W}L}{jz18\s*3@H" 220+0%%+++54+%0+0.2(.FY((GY 22 ""  GY JY ?+3+3/399?+9/+9933333339393933310327#"'#"32&#"327&&546324&#"6VN*;@HTb*y0CX8ohol *,-ZLgv4V"74OM9H~W@w&&9\s&F)Vy 6@  LYLY'??+?+393333310!!!!!!+sPs L/o=^ :@   FY FY#??+?+333933310!!!!!5=^fy<^5@  ??33?33333933310!!367!NP $"NM^I<`^@.   LY  ??39/3939+33333933339910!!!!!!5!1N??P\Z)^L@%    FY??33+3?33339939333310!!!!5!!367!#NP $"NM^I<`V^@.      LY'??3+3?39333/33332993239333910!!#!!!%ժ:V;5N5 L)+ o^g@3    FY  #?3??+39333?/33333399339399910!!!!#!!3ZZ ;#d)VHK@%@  ' LY LY?+?3+39/?333993310!!!!!!!!;i6+NTL/o7^D@"   FY FY  #??+3?3+3333993310!!!!!!#51^lyymVF@@   LY  LY'??+?39/+/333333310!!!#"&5!3267!+ʚ]5buRw6 L54&ɶ\jk!)J{o^@@  FY FY #??+?39/+/3333333103267!!!!#"&5XM1jU^g( 8.mJ@$    LY?3?9/333+3933333933310#"&5!367!!#q((5bmY6ʁnɶ\neH 3J5-{^J@$    FY?3?9/333+3933333933310#"&5!33367!!#F31}N^1iC}Zg)6f+@ LY ??39/+3333310!6632!4&#"!6[buOv3'Ǹjk *q^-@  FY ?3?9/+3333310!4#"!!66321jWH^D8.`!(c@3% &*) $""LY%@ LY LY?+3?9/3+3+99333333933310%2$7# #"&547333! !"!4&bLn}?5`)%d%\[ ҕ ]DKBU6ztYHX8u|Gݳ`s%g@5"#'&$! !  FYJY"@JY?+?9/3+3+99393333339333106$32!3267# ' 54733%"!&&N!jbN)`%^| w+-'(`E75Nsyp|V$+}@@#$$))!( - ,$''%%LY( @LY"MY"?3+3?9/3+3+99?3333933339939310&#"&547333! !32$7!"!4&?5`)%d%\[ ҼLnm~ (IztYHX8u|G]D@> duo`s '@C %%$  ) ( #&##!FY JY$@  !JY?+?9/3+3+9939?3333933339939310&&' 5473336$32!3267!"!&&ݵ)`!jb^| w(`E75N+-? +syp|B,&6uR&+5?&6/&+5X@,  !  LY MY  ??39/3+3?+33333393399310"!!7!32#"&'32654&Ko6X/nJ@Pס/Ͱ ^X@, GY  HY?+3??39/3+33333339939310%#"'32654&#"!!!2yr-y1t~2z1X'D3 ^ VI@%  'LY LYLY?+?+?+?/3332939310!!!'"'5326!!!=>_T@:35>7[ NucaW TLo^N@(FY HY FY#??+?+3?+/3329339310%!!!!#"'5326!+݉ \|jD119M=Ny OfC@" LY  LY?+3??39/+333333910%#"'3265!!!!!fKR~6C5Z/= ^E@"  HY FY??39/+?+333333310!!!!#"&'326711Lv@prlo3^R :VL@&    LY  LY '??3+?39/+/33293333310!!!!!!!!fN6C5 Lw=Jo^M@'    FY  FY #??+??39/+/33293333310!!!!!!!1+݉V^R3^mV=@  LY  'LY?+??39/+333333310!!!3#"&5!3267!]5buRw6V+4&ɶ\jk!){o^=@  FY  # FY ?+??39/+3333333103267!!!35#"&5XM1jU^g( op8.V!T@*   '   LY?33+?3993?/332933393310!#!!3!!!!46#!# ZoN L{uX^TL1oL^U@+  FY#??+?3?3993/332933393310%!!!#&''!!>!!+މ6++13 !%,q>l nD^#MGnB,&$6uR&+5V\?&D6)&&+5V&$jVR #&+55V;&Dj 8&+55%VuvA&(6R&+5\b?&H6&+5=@ LY  LY LY?+?+9/+33333310"6$3 ! 5!&&267!3pZ+ ӕ [G SEnuH#\ws=@ JY  JY FY?+?+9/+33333310%267! !"55!&&#"566Zcv >t<6ckXvun} 𔂒&2,$V&jR 1&+55\w&j 1&+55V&jXR '&+55&j '&+55^V&j-R <&+55N#&j >&+559jP@( MY  MY LY?+9?+9/+33339939310!!! '32654&##hP]h{Z\d O,5irf_9V^R@) FY  GY FY?+9?+9/+33333939310!5!#"'32654&##F\evbxP-3&MR&+5#&Mu&+5V&jR %&+55#&ju #&+55wV&2jR +&+55\&Rj /&+55w ?@ LY LY  LY?+?+9/+33339910! ! 267!"!&&iQQeHzmm|ۮ\s ?@ JY GY GY?+?+9/+33333310!"&5!2267!"!&&ap>ndbpm1̍0ttttqppqwV&~jR /&+55\&j 1&+55HV&j#R /&+55J&j /&+559&M1R&+5&\M&+59V&j1R )&+55&\j ,&+559s&SR &&+55!&\SR )&+55mV&jVR )&+55{&j# (&+55VT /@  LY LY'??+?+3333310!!!!T+TLo^ /@  FY FY#??+?+3333310!!!!-^f^V&j5R -&+55-&j ,&+55/P& >+5^& >+5&;>+5  ^&[>+5Va@1      LY?3?9/3+3399333393393333310!!!!!!!!q)V;5N'hN)j ^i@5       FY?3?9/3+33993333933939393103!!3#!!#fZZ.+dJ=\b 4@ LYLY??+9/+33333104$!3!! #"33\8{5VPh1JYefe\qG\&S@)&& ( ' ##LYLY??9/+39/+3933339339104$!3!3265!#"&'#"&#"3265\* s5OVZN1l'+}H][Tb1BAfq-N=?Jil`fA;\ ,W@- $ .*-  (GYHY!GY?+3+?+999/?333393910"323&&5!32655!#"&''26754&#"^j 1PXWK-x>.Zofjqb(6&*fiKFfq=L7R!(R@)$ *$)MY&&!MY& LY?+?+9/3/+9333933339103265!#"&54&##53 54&#"'6!2SUYO1ùXkqo$eYfq-jmNXdΐ9\s(V@+'" * )('('JY (( HY  FY ?+?+99//9+9333933339102654&#"'663232655!#"&54&##5erMOZxׄWK-8=66%".&9 'zfq̙efVs[@.  !  MY MY LY  '??+?+9/+99333333933910!!!4&##53 54#"'6!2+ȶu*o$LjmѦdΐNo-s"]@/" $ #!""!JY "" FY# FY ?+??+9/9+99333333939102654&#"'6632!!!4&##5jzMPZwсoי8=66&!-'9 "}egFNI!D@!   #" LY LY ?3+3?+9/3339933103265!#"&5!'"'5326!OWZN2>_T@:35>7[ rwHCfq-=caW ^D@! ! FYHY ?3+3?+9/33399331032655!#"&5##"'5326!jPXWK- \|jD119M=/yJCfq OZ@-  LY LY ?+??99//+3933333333933103265!#"&'!!!!!=IUUI165}KFfq-=^Z@-  FY  HY?+??99//+393333333393310!!32655!#"&'5!!2NQUI-k^RHCfqV3^w@@! LYLY LY?+?9/++333393910!! 4$3 &&#"32655!5MkrhӚ5{gTk9*\s@@!   GYFY GY?+?9/++333393910!! !2&&#"!265!\E,\KH]*0V#'tc)b?@  LY  LY ?+?9/+3333939103265!#"&5!!!KVXL1sPs}KFfq-˾?/F^?@  FY HY?+?9/+333393910!32655!#"&'!5=PXVL-^KFfqX(R@)% "*"")%MYLY LY?+?+9/+93333933991046632&#"33#"32$7! $54675&&v΅z릪 a̷`i[COwQKfXhaga1/OʒN%s$N@'!! &%$$JY$$ FY FY ?+?+9/+93339993310#"!267! $54675&54$32&#"3HoX瀐o[RㅏDIy.(Mk 1э,(GhB7b&9 >+5^& >+5R&$gDVR;u&Dg&$f#R&+5V;&Df'&+5&$w!R &+55V&Dw )&+55&$xR &+55;&Dx 0&+55J&$y!R '&+55V&Dy <&+55b&$zR ,&+55V;&Dz A&+55Rs&$'KXRgD &+5VR; &D&Kg ##&+5&${)R &+55V;&D{ .&+55&$|'R  &+55V;&D| 5&+55X&$}'R +&+55V;&D} @&+55b&$~'R &+55V;&D~ ,&+55R} $!!!!&'#"&'3327432#"7jj{%!F ܦ/UUTR\D`|$/6}jGNVR;+&D'gN/&+5R&(g\Rbs&Hg&(fR&+5\b&Hf &+5`&(RR&+5\b&HR &+5&(wR &+55\&Hw "&+55&(xR &+55b&Hx )&+55J&(yR %&+55\&Hy 5&+55b&(zR *&+55\b&Hz :&+55Rs&('KRg&+5\Tb!&H&Kg)&+5B&,fR&+5u<&f&+5BR&,gR&LgwR&2g\Rs&Rgw&2fR&+5\&Rf&+5w&2wR &+55\ &Rw  &+55w&2xR #&+55&Rx '&+55wJ&2yR /&+55\&Ry 3&+55wb&2zR 4&+55\&Rz 8&+55wRs&2'gKR&+5\R!&R'gK #&+5ws&_vR&+5\!&`v}$&+5ws&_CdR'&+5\!&`C,&+5w&_fR"&+5\&`f'&+5w`&_RR"&+5\&`R'&+5wR&_g\R&`gR^&8gR^&Xg^&8f^R&+5&Xf&+5)s&avR&&+5s!&bv &+5)s&aCR&&+5s!&bC &+5)&afdR!&+5s&bf$&+5)`&aRR!&+5s&bR3#&+5R)&ag}Rs&bgR&<g^&\gV&<fR &+5&\f&+5`&<RR &+5&\R&+5\ &B!  /2]210&&'5!!&&'5!F>"-!d)I-!d)17H892H8-9 @   /3]29/10#&'#567!'673#pcrapg;5YU5CK[eAN[nYu  @  /]239/1067!#&'#7#&'53/pg<1~(arjiX@6SH,Ae`FwWpY- %@ /3]29/239310#'6654&#"5632#&'#567!!} 7B%+#%F^qȢpcrapg;5`r=t H)K[eAN1%)@ ! !!!/3]22/39/3/310".#"#663232673#&'#567!7$KHC(+ q kS%MHB))q jZSB0<!1o$0t}GQJN`E;1@   /]23910673#%#"&'332677F/\s àsXXr i`naNWS^L1@   /3]2910#&'53%32673#"&'je/FrY[p Uz`i3K_WS1 -@   /33/]2393]210#'6654#"563232673#"&'126k 3';5FVdrY[p 4A)n )hCK_WS1 $+@"@ H"     /3]22/3+2/3103273#"&'%".#"#663232673jb $KHC+( q b\%MHB))q h;F1$.dy$0mp +@  /?39393393104&'3#"'5326NFOB#pJR<7#-4mB54&#"'6632!?pZ,PTTXz mTP03@MHwZx{NB&V@-"( ""'PY |  $$OY$& OY %?+?+9/_^]+93333933910!"'32654&##532654#"'6!2UdoqH[+$O+6hsgVYl0;Րys F@"  PY %??39/3+3933393339910%#!!5!3!5467#y#Vs2"0%d5rP@(OYNY OY%?+?+9/+33333933993102!"'3 54!"'!!76fO^5({7#=bO *5 BHP7Pp,@NY$??+93339310!!%/HJBJ%F@# ##&'  PYOY&PY%?+?+9/+999399210!"'532667##"&5432%"32654&JCT\j :r `lbd^}PV[ë^L|j|{Pw)&IIR#4@@4$,+,-0&(() )200//)562&&,*$$)  0))*5-*?33/339/33/3399333/993939223399333310#"'532654&'.54632&&#"##33#7#uoXsX-/#%lH'r_p48<'%-*JiFdq+6'#&57@7Cq7D\7F\7G7Hq7J7777777 7W7Xq7Y\7_7`q7b7q7\7q7 \7!q7"\7#q7%q7&\7'q7(\7)q7*\7+q7,\7-q7.\7/q70\71q72\73q74\76q78q7:q7<@<C<D<F<G<H<J<< <W<X<Y<_<`<b<<<< <!<"<#<%<&<'<(<)<*<+<,<-<.</<0<1<2<3<4<6<8<:<<<@<B<D<I<J<K<L<M<N<O<Q<R<S<T<U<V<W<X<Y<Z<[<\<]<^<_<`<b<d<f<h<j<l<n=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_>-DD DD EE EYEZE[E\E]EE7E<E>E@EEEE EpF)F )F)F )HH HYHZH[H\H]HH7H<H>H@HHHH HpI{I {I{I {KK KK NFNGNHNRNTNNNNNNNNNNNNNNNNNNNNNNNNNNNNHN`N6N8N:N<N@NBNDNJNLNNNRNTNVNXNZN\N^N`PP PP QQ QQ RR RYRZR[R\R]RR7R<R>R@RRRR RpSS SYSZS[S\S]SS7S<S>S@SSSS SpURU RUDUFUGUHUJURUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUDUFUHURU RUYU`UU U"U&U(U*U,U.U0U2U4U6U8U:U<U@UBUDUJULUNURUTUVUXUZU\U^U`W)W )W)W )YRY RYYY")YRYY RY ZRZ RZZZ")ZRZZ RZ [F[G[H[R[T[[[[[[[[[[[[[[[[[[[[[[[[[[[[H[`[6[8[:[<[@[B[D[J[L[N[R[T[V[X[Z[\[^[`\R\ R\\\")\R\\ R\ ^-q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq-{&*24G_IKMOQSUWY[]_-{-{-{-{$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjln$;=;=?C X!#%')+-/13             YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p   YZ[\]7<>@ pR R")R R  YZ[\]7<>@ pR R")R R q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  &*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_$79:;<=$&68:;=?C X!#%')+-/13oqsR R "@E=K=N=O=`={R R$79:;<=$&68:;=?C X!#%')+-/13oqs-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p  &*24G_IKMOQSUWY[]_FGHRTH`68:<@BDJLNRTVXZ\^`FGHRTH`68:<@BDJLNRTVXZ\^`\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqsR R "@E=K=N=O=`=R R\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs  $79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs-{R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`$$$$")$$q$&$*$2$4$7)$D\$Fq$Gq$Hq$Jq$P$Q$Rq$S$Tq$U$V$X$Y$Z$[$\$]$q$q$q$q$q$q$$$$$$$$q$\$\$\$\$\$\$q$q$q$q$q$q$q$q$q$q$q$$$$$$q$\$q$\$q$\$$q$$q$$q$$q$q$q$q$q$q$q$q$$q$$q$$q$$q$$$$ $$q$$q$$q$$q$$$$!$$)$&)$+$-$/$1$3$5$7$<$>$@$Cq$D\$F\$G$Hq$J$$$$$$$ $W$Xq$Y\$_$`q$b$q$\$q$ \$!q$"\$#q$%q$&\$'q$(\$)q$*\$+q$,\$-q$.\$/q$0\$1q$2\$3q$4\$6q$8q$:q$&@&Cq&D\&F\&G&Hq&J&&&&&&& &W&Xq&Y\&_&`q&b&q&\&q& \&!q&"\&#q&%q&&\&'q&(\&)q&*\&+q&,\&-q&.\&/q&0\&1q&2\&3q&4\&6q&8q&:q&(@(Cq(D\(F\(G(Hq(J((((((( (W(Xq(Y\(_(`q(b(q(\(q( \(!q("\(#q(%q(&\('q((\()q(*\(+q(,\(-q(.\(/q(0\(1q(2\(3q(4\(6q(8q(:q(8@8C8D8F8G8H8J88 8W8X8Y8_8`8b8888 8!8"8#8%8&8'8(8)8*8+8,8-8.8/808182838486888:8<8@8B8D8I8J8K8L8M8N8O8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8b8d8f8h8j8l8n9R9 R999")9R99 R9 :::"):$:&:*:2:4:D:F:G:H:J:P:Q:R:S:T:U:V:X:]:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::!:+:-:/:1:3:5:<:>:@:C:D:F:G:H:J:: :W:X:Y:_:`:b:::: :!:":#:%:&:':(:):*:+:,:-:.:/:0:1:2:3:4:6:8:::<:@:B:D:I:J:K:L:M:N:O:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:^:_:`:b:d:f:h:j:l:n;&;*;2;4;;;;;;;;;;;;;;;;;;;;G;_;I;K;M;O;Q;S;U;W;Y;[;];_=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_?&?*?2?4????????????????????G?_?I?K?M?O?Q?S?U?W?Y?[?]?_CqC qC&C*C- C2C4C7qC9C:C<CCCCCCCCCCCCCCCCCCCCC$qC&qC6C8C:CGCCCCCqC qC_CICKCMCOCQCSCUCWCYC[C]C_CoCqCsCqDD DD E-{GGG$G7G9G:G;G<G=GGGGGGGGGGG$G&G6G8G:G;G=G?GCGGGGGGG GXGGG!G#G%G'G)G+G-G/G1G3GoGqGsGVqV qVfVmVqqVrVsVuVxVqV qVT[[[V[_[b[d[i[p[q[r[t[u[x[[[ [T\\\V\_\b\f\i\m\s\v\y\z\{\|\}\~\\\\\\\\\\\\\\\\\\\\ \!]q]r]x]T^^ ^^ _q_ q_f_m_qq_r_s_u_x_q_ q_T```V`_`b`i`t`` aaaaV\a_\ab\afai\amasavayqaza{a|a}a~qaaaaaaaaaqaaqaqaaqaaaaaqaaaaaaa a!aSbqb qbfbmbqqbrbsbubxbqb qbTdfdmdsfffVf_fbfdfifpfqfrftfufxfff fThfhmhshhiqi qifimiqqirisiuixiqi qiTmmmVm_mbmdmimpmqmrmtmumxmmm mToooVo_obodoiotooo qqqqV\q_\qb\qfqi\qmqsqvqyqqzq{q|q}q~qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq q!qSrrrVr_rbrfrirmrsrvryrzr{r|r}r~rrrrrrrrrrrrrrrrrrrr r!sssVs_sbsdsispsqsrstsxsss sTtftmtsttuuuVu_ubufuiumuu vqvrvxvTxxxVx_xbxfxixmxsxvxyxzx{x|x}x~xxxxxxxxxxxxxxxxxxxx x!y){{ {{ || |||| ~) y~     y~ y~         y~       n| q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqql~    n|   n|   n| l|~  qff jlrqs~ffqqq q  q q qqq qn|q qq  r|  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq)l|~    l|~   rsz|  rsv  l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqqqff jlrqs~ffqqq q  q  rsz l|~  ))  n|   n|  rsz|  rsz|   ) js      j  )j       js   s  j        m  m         js    m  m  j   sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R 7$&q7$&q7$&q$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q                        q  q  q                             ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q    q    q    q q  q   !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) & * 2 4 7q 8 9 : <                         $q &q * , . 0 2 4 6 8 : G f m qq r s u x  q  q   q  \ q        T _ a l |\ ~        q    q    q  \  \    \     \        q  I K M O Q S U W Y [ ] _ a c e g i k m o q s q!q!r!x!TSSSS TTTVT_TbTfTiTmTsTvTyTzT{T|T}T~TTTTTTTTTTTTTTTTTTTT T!XqX qX&X*X- X2X4X7qX9X:X<XXXXXXXXXXXXXXXXXXXXX$qX&qX6X8X:XGXXXXXqX qX_XIXKXMXOXQXSXUXWXYX[X]X_XoXqXsXqYY YY ZZZVZ_ZbZdZiZpZqZrZtZuZxZZZ ZT`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`RbIfbWfbYfbZfb[fb\fbfb%fb'fb7fbfbfb4fb5fb]fb^fbpfbfbfjj jj llllllllllllllllllllll lrlslzl|lllllllllllllllllllllllllllll llllllmmmmmmm msmmmnn nnnnnnnnn n|nnnnnnnnnnnnnnn nnnoo ooooooooo omooooooooooooooooooooooooooopppppplp~ppppppppppppppppp p ppprqr qrrrqrrrrrrrqr qrnr|rrrrrrrrqrrrrrrrrrrrrrrrrrrr qrrqrrrsqs qssssssssssssqs qsjsms}sssssssssssssssssssssssssssss s ssssstqt qtttqtttttttqt qtnt|ttttttttqttttttttttttttttttt qttqtttuqu quuuuuuuuuuuuqu qujumu}uuuuuuuuuuuuuuuuuuuuuuuuuuuuu u uuuuuv vx xzzzz zzzzz z|q|q||||||||q| q|r|s|||||| | ||||}} }}}}}}}}} }}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~ ~r~s~z~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~  qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  s s s rsz|    rsz|    rsz|  sl~  )    |   m rsv    )))))) jklqrsuwy}~)))))    ) js   f |   l{=}~j    )l{=}~j  l|~  j  l|~  j  l|~  j  )  )))))) jklqrsuwy}~)))))    ) js  \ \fH\ \|qqH HHq qq qmqq   l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )) jklqrsuwy}~))     s)) jklqrsuwy}~))     sl{=}~j  )  )    |         l|~  j   f m| )  )  )  q qqq qn|q qq  q qqq qn|q qq       rsz|    rsz|   l|~  j    )   rsz|    rsz|    rsz|    rsz|   qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )))))) jklqrsuwy}~)))))    ) js  l{=}~j  l|~  j          q             r v |       q                                                                           q             r v |       q                                      )   q rv|q    q rv|q    r    r|   )  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq     !q! q!&!*!- !2!4!7q!9!:!<!!!!!!!!!!!!!!!!!!!!!$q!&q!6!8!:!G!!!!!q! q!_!I!K!M!O!Q!S!U!W!Y![!]!_!o!q!s!q"" "" #q# q#&#*#- #2#4#7q#9#:#<#####################$q#&q#6#8#:#G#####q# q#_#I#K#M#O#Q#S#U#W#Y#[#]#_#o#q#s#q$$ $$ %q% q%&%*%- %2%4%7q%9%:%<%%%%%%%%%%%%%%%%%%%%%$q%&q%6%8%:%G%%%%%q% q%_%I%K%M%O%Q%S%U%W%Y%[%]%_%o%q%s%q&& && 'q' q'&'*'- '2'4'7q'9':'<'''''''''''''''''''''$q'&q'6'8':'G'''''q' q'_'I'K'M'O'Q'S'U'W'Y'[']'_'o'q's'q(( (( )q) q)&)*)- )2)4)7q)9):)<)))))))))))))))))))))$q)&q)6)8):)G)))))q) q)_)I)K)M)O)Q)S)U)W)Y)[)])_)o)q)s)q** ** +q+ q+&+*+- +2+4+7q+9+:+<+++++++++++++++++++++$q+&q+6+8+:+G+++++q+ q+_+I+K+M+O+Q+S+U+W+Y+[+]+_+o+q+s+q,, ,, -q- q-&-*-- -2-4-7q-9-:-<---------------------$q-&q-6-8-:-G-----q- q-_-I-K-M-O-Q-S-U-W-Y-[-]-_-o-q-s-q.. .. /q/ q/&/*/- /2/4/7q/9/:/</////////////////////$q/&q/6/8/:/G/////q/ q/_/I/K/M/O/Q/S/U/W/Y/[/]/_/o/q/s/q00 00 1q1 q1&1*1- 121417q191:1<111111111111111111111$q1&q16181:1G11111q1 q1_1I1K1M1O1Q1S1U1W1Y1[1]1_1o1q1s1q22 22 3q3 q3&3*3- 323437q393:3<333333333333333333333$q3&q36383:3G33333q3 q3_3I3K3M3O3Q3S3U3W3Y3[3]3_3o3q3s3q44 44 5-{66 6Y6Z6[6\6]6676<6>6@6666 6p7-{88 8Y8Z8[8\8]8878<8>8@8888 8p9-{:: :Y:Z:[:\:]::7:<:>:@:::: :p;-{<< <Y<Z<[<\<]<<7<<<><@<<<< <p=-{>> >Y>Z>[>\>]>>7><>>>@>>>> >p?-{@@ @Y@Z@[@\@]@@7@<@>@@@@@@ @pA-{BB BYBZB[B\B]BB7B<B>B@BBBB BpC-{DD DYDZD[D\D]DD7D<D>D@DDDD DpIII$I7I9I:I;I<I=IIIIIIIIIII$I&I6I8I:I;I=I?ICIIIIIII IXIII!I#I%I'I)I+I-I/I1I3IoIqIsIJJ JYJZJ[J\J]JJ7J<J>J@JJJJ JpKKK$K7K9K:K;K<K=KKKKKKKKKKK$K&K6K8K:K;K=K?KCKKKKKKK KXKKK!K#K%K'K)K+K-K/K1K3KoKqKsKLL LYLZL[L\L]LL7L<L>L@LLLL LpMMM$M7M9M:M;M<M=MMMMMMMMMMM$M&M6M8M:M;M=M?MCMMMMMMM MXMMM!M#M%M'M)M+M-M/M1M3MoMqMsMOOO$O7O9O:O;O<O=OOOOOOOOOOO$O&O6O8O:O;O=O?OCOOOOOOO OXOOO!O#O%O'O)O+O-O/O1O3OoOqOsOQQQ$Q7Q9Q:Q;Q<Q=QQQQQQQQQQQ$Q&Q6Q8Q:Q;Q=Q?QCQQQQQQQ QXQQQ!Q#Q%Q'Q)Q+Q-Q/Q1Q3QoQqQsQSSS$S7S9S:S;S<S=SSSSSSSSSSS$S&S6S8S:S;S=S?SCSSSSSSS SXSSS!S#S%S'S)S+S-S/S1S3SoSqSsSUUU$U7U9U:U;U<U=UUUUUUUUUUU$U&U6U8U:U;U=U?UCUUUUUUU UXUUU!U#U%U'U)U+U-U/U1U3UoUqUsUXIRXWRXYfXZfX[fX\fXfX%RX'RX7fXfXfX4RX5RX]RX^RXpfXRXRZIRZWRZYfZZfZ[fZ\fZfZ%RZ'RZ7fZfZfZ4RZ5RZ]RZ^RZpfZRZR\IR\WR\Yf\Zf\[f\\f\f\%R\'R\7f\f\f\4R\5R\]R\^R\pf\R\R^IR^WR^Yf^Zf^[f^\f^f^%R^'R^7f^f^f^4R^5R^]R^^R^pf^R^R`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`Raaa$aaaaaaaaaaCaa aXaaa!a#a%a'a)a+a-a/a1a3fIffWffYffZff[ff\ffff%ff'ff7ffffff4ff5ff]ff^ffpfffffhIfhWfhYfhZfh[fh\fhfh%fh'fh7fhfhfh4fh5fh]fh^fhpfhfhfjIfjWfjYfjZfj[fj\fjfj%fj'fj7fjfjfj4fj5fj]fj^fjpfjfjflIflWflYflZfl[fl\flfl%fl'fl7flflfl4fl5fl]fl^flpflflfnIfnWfnYfnZfn[fn\fnfn%fn'fn7fnfnfn4fn5fn]fn^fnpfnfnfooo")o$o&o*o2o4oDoFoGoHoJoPoQoRoSoToUoVoXo]oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooo!o+o-o/o1o3o5o<o>o@oCoDoFoGoHoJoo oWoXoYo_o`oboooo o!o"o#o%o&o'o(o)o*o+o,o-o.o/o0o1o2o3o4o6o8o:o<o@oBoDoIoJoKoLoMoNoOoQoRoSoToUoVoWoXoYoZo[o\o]o^o_o`obodofohojolonpRp Rppp")pRpp Rp qqq")q$q&q*q2q4qDqFqGqHqJqPqQqRqSqTqUqVqXq]qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqq!q+q-q/q1q3q5q<q>q@qCqDqFqGqHqJqq qWqXqYq_q`qbqqqq q!q"q#q%q&q'q(q)q*q+q,q-q.q/q0q1q2q3q4q6q8q:q<q@qBqDqIqJqKqLqMqNqOqQqRqSqTqUqVqWqXqYqZq[q\q]q^q_q`qbqdqfqhqjqlqnrRr Rrrr")rRrr Rr sss")s$s&s*s2s4sDsFsGsHsJsPsQsRsSsTsUsVsXs]ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssss!s+s-s/s1s3s5s<s>s@sCsDsFsGsHsJss sWsXsYs_s`sbssss s!s"s#s%s&s's(s)s*s+s,s-s.s/s0s1s2s3s4s6s8s:s<s@sBsDsIsJsKsLsMsNsOsQsRsSsTsUsVsWsXsYsZs[s\s]s^s_s`sbsdsfshsjslsntRt Rttt")tRtt Rt { {{ {")$q&*247)D\FqGqHqJqPQRqSTqUVXYZ[\]qqqqqqq\\\\\\qqqqqqqqqqqq\q\q\qqqqqqqqqqqqqqq qqqq!$)&)+-/1357<>@CqD\F\GHqJ WXqY\_`qbq\q \!q"\#q%q&\'q(\)q*\+q,\-q.\/q0\1q2\3q4\6q8q:q9 9B#FQ i uR  . .2*` r   F , \ t  (2 8Z \ \ TJDigitized data copyright 2010-2011, Google Corporation.Open SansBoldAscender - Open Sans Bold Build 100Version 1.10OpenSans-BoldOpen Sans is a trademark of Google and may be registered in certain jurisdictions.Ascender Corporationhttp://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0Digitized data copyright 2010-2011, Google Corporation.Open SansBoldAscender - Open Sans Bold Build 100Version 1.10OpenSans-BoldOpen Sans is a trademark of Google and may be registered in certain jurisdictions.Ascender Corporationhttp://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0ff      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~.notdefnullnonmarkingreturnspaceexclamquotedbl numbersigndollarpercent ampersand quotesingle parenleft parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon semicolonlessequalgreaterquestionatABCDEFGHI.altJKLMNOPQRSTUVWXYZ bracketleft backslash bracketright asciicircum underscoregraveabcdefghijklmnopqrstuvwxyz braceleftbar braceright asciitildenonbreakingspace exclamdowncentsterlingcurrencyyen brokenbarsectiondieresis copyright ordfeminine guillemotleft logicalnotuni00AD registered overscoredegree plusminus twosuperior threesuperioracutemu paragraphperiodcenteredcedilla onesuperior ordmasculineguillemotright onequarteronehalf threequarters questiondownAgraveAacute AcircumflexAtilde AdieresisAringAECcedillaEgraveEacute Ecircumflex Edieresis Igrave.alt Iacute.altIcircumflex.alt Idieresis.altEthNtildeOgraveOacute OcircumflexOtilde OdieresismultiplyOslashUgraveUacute Ucircumflex UdieresisYacuteThorn germandblsagraveaacute acircumflexatilde adieresisaringaeccedillaegraveeacute ecircumflex edieresisigraveiacute icircumflex idieresisethntildeograveoacute ocircumflexotilde odieresisdivideoslashugraveuacute ucircumflex udieresisyacutethorn ydieresisAmacronamacronAbreveabreveAogonekaogonekCacutecacute Ccircumflex ccircumflexCdotcdotCcaronccaronDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflexGbrevegbreveGdotgdot Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbar Itilde.altitilde Imacron.altimacron Ibreve.altibreve Iogonek.altiogonekIdotaccent.altdotlessiIJ.altij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotLslashlslashNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautOEoeRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexScedillascedillaScaronscaron Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflex YdieresisZacutezacute Zdotaccent zdotaccentZcaronzcaronlongsflorin Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccent circumflexcaronmacronbreve dotaccentringogonektilde hungarumlauttonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos.alt Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIota.altKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9Iotadieresis.altUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronpirhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055.alt afii10056.alt afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveendashemdash afii00208 underscoredbl quoteleft quoterightquotesinglbase quotereversed quotedblleft quotedblright quotedblbasedagger daggerdblbulletellipsis perthousandminutesecond guilsinglleftguilsinglright exclamdblfraction nsuperiorfranc afii08941pesetaEuro afii61248 afii61289 afii61352 trademarkOmega estimated oneeighth threeeighths fiveeighths seveneighths partialdiffDeltaproduct summationminusradicalinfinityintegral approxequalnotequal lessequal greaterequallozengeuniFB01uniFB02 cyrillicbrevedotlessjcaroncommaaccent commaaccentcommaaccentrotate zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperioruni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200BuniFEFFuniFFFCuniFFFDuni01F0uni02BCuni03D1uni03D2uni03D6uni1E3Euni1E3Funi1E00uni1E01uni1F4Duni02F3 dasiaoxiauniFB03uniFB04OhornohornUhornuhornuni0300uni0301uni0303hookdotbelowuni0400uni040Duni0450uni045Duni0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BF uni04C0.altuni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CE uni04CF.altuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7 uni1EC8.altuni1EC9 uni1ECA.altuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1uni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni20ABuni030Fcircumflexacutecombcircumflexgravecombcircumflexhookcombcircumflextildecombbreveacutecombbrevegravecomb brevehookcombbrevetildecombcyrillichookleftcyrillicbighookUCcyrillicbighookLCone.pnumzero.osone.ostwo.osthree.osfour.osfive.ossix.osseven.oseight.osnine.osffuni2120Tcedillatcedillag.altgcircumflex.alt gbreve.altgdot.altgcommaaccent.altIIgraveIacute Icircumflex IdieresisItildeImacronIbreveIogonek IdotaccentIJ IotatonosIota Iotadieresis afii10055 afii10056uni04C0uni04CFuni1EC8uni1ECA   46latnMOL ROM  nlatnMOL (ROM B      ligaligaligalnumlnumlnumloclloclonumonumonumpnumpnumpnumsalt saltsaltss01"ss01*ss012ss02:ss02@ss02Fss03Lss03Rss03Xtnum^tnumftnumn    &.6>FNV^Pz2HJJ.,ZgwEG      !$%IJ6 "(^IO]ILI5O4LI^V0R *H C0?1 0 +0a +7S0Q0, +7<<<Obsolete>>>0!0 +iV˱H,[ ]0z0b8%a&Z0  *H 0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0 070615000000Z 120614235959Z0\1 0 UUS10U VeriSign, Inc.1402U+VeriSign Time Stamping Services Signer - G200  *H 0ĵR`)J[/Kk5TX56^bMRQ4q{f*j 7٘tvJcEG.k NK+XJ,XB-uލǎlLgrIž`<cxi{-004+(0&0$+0http://ocsp.verisign.com0 U003U,0*0(&$"http://crl.verisign.com/tss-ca.crl0U% 0 +0U0U0010 UTSA1-20  *H PK$ $- 7 ,Za񑑳V@뒾89u6t:O7ʕBǠWdB5N3M'L8MxSݤ^ ⥾`߭(ǥKd[98"3/!?DA e$HDT\y>]r},CS}=*:Om ]^SWp`+nx'4[^I2300-GߍRFCmH 10  *H 01 0 UZA10U Western Cape10U Durbanville10 U Thawte10U Thawte Certification10UThawte Timestamping CA0 031204000000Z 131203235959Z0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0"0  *H 0 ʲ }uNgadڻ30X~k6xw~o< hlʽR-H=]_/kLR`@~ ?Ǵ߇_zj1.G 1s W-x43h/Š*Ë!fXWou<&]'x1"ijGC_^|}bM "Vͮv M٠h;004+(0&0$+0http://ocsp.verisign.com0U00AU:0806420http://crl.verisign.com/ThawteTimestampingCA.crl0U% 0 +0U0$U0010U TSA2048-1-530  *H JkXD1y+LͰXn)^ʓR G'/8ɓN"b?7!Op18UN$ҩ'NzaA*^ݻ+>W~ +;R8'?J00eeR&.Y)"\0  *H 0_1 0 UUS10U VeriSign, Inc.1705U .Class 3 Public Primary Certification Authority0 090521000000Z 190520235959Z01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0"0  *H 0 g`IoV|f^ q-!ќPL"5; .Z|=;%X{ ξ'tag'MjaXy'M4+G Df$fO8TrfujIh8y 0,`Hת809:|@T/ܨR>+!\ P4.M^%Ԍn|)]1ZՌgX5+!`x^{`W ]A cT`C!00U00pU i0g0e `HE0V0(+https://www.verisign.com/cps0*+0https://www.verisign.com/rpa0U0m+ a0_][0Y0W0U image/gif0!00+kπjH,{.0%#http://logo.verisign.com/vslogo.gif0U%0++04+(0&0$+0http://ocsp.verisign.com01U*0(0&$" http://crl.verisign.com/pca3.crl0)U"0 010UClass3CA2048-1-550Uk&pȡ?-50  *H ݔAaix0Ɛ<~B$s/DrPU nQj71ܥ-OM2NgUejzd8xEv1z`³]fvYI8VAwX00fgymPSo0  *H 01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0 100729000000Z 120808235959Z01 0 UUS10U Massachusetts10 UWoburn10U Monotype Imaging Inc.1>0<U 5Digital ID Class 3 - Microsoft Software Validation v210U Type Operations10UMonotype Imaging Inc.00  *H 0Di|U 25L3^ L*8ט@I "SOCʋVnH9c;$5}rGWyˊJ@p-5cįפ {uePd"}KXEMYLM00 U00U0DU=0;09753http://csc3-2009-2-crl.verisign.com/CSC3-2009-2.crl0DU =0;09 `HE0*0(+https://www.verisign.com/rpa0U% 0 +0u+i0g0$+0http://ocsp.verisign.com0?+03http://csc3-2009-2-aia.verisign.com/CSC3-2009-2.cer0U#0k&pȡ?-50 `HB0 +700  *H N"gA~™cjrb<8=_G_[KI  VD 5< D`E*oL;4gpZ9\Zl5|eKmIp=b۴A~}n"w6MZ S1+(RzkwD ]%,͊0>KyʦN $ 񺐶\<'MU,:&lDOw( 0{ *H  1l0h0g0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA8%a&Z0 +]0 *H  1  *H 0 *H  1 110505165508Z0# *H  1񤟓 A{l˨ߐ`0  *H b=Di?=դZ ޝ'WBʅmo*s^sz-A&FxӂkVG}|`A_-`E4QV 2gSgusnek-1.1/doc/fonts/OpenSans-BoldItalic.ttf000066400000000000000000006404541353657467200205210ustar00rootroot000000000000000DSIGIU +tGDEF&'GPOS 77'8GSUB+='OS/2y`cmap)/hcvt gifpgmsugasp' glyfIg%Xhead<6hhea"t$hmtxFkernT+ ~E6loca`Vmaxp< namejHpost7l`&+prep: _< cIJ X  XW/\33f @ [(1ASC! X ^ J+)h3sD Jm\hm9)H^hBhhhhhhXhNh7hVHHhmhmhm\5{j5V5?5{55%5 5 5{5{5=)?'J^w93FoZ%ZZuZ%T%`%`%`%=%%ZZ^%H^ofN}?'shhmJhhhshXho}Hhm)}mhm;\o=H1 a a ){V5V5V5V5j% 5{{{{{hd5FZZZZZZZZuZuZuZuZ`%`%`$`%H%ZZZZZhm+oooo's'sZZZ{Z{Z{Z{Zj5Zj%ZV5uZV5uZV5uZV5uZV5uZ{T{T{T{T5%5%`%`%`%``%%`5%%%5`%%5`%5`%%5y%' 5% 5% 5%s 5%{Z{Z{Z5{Z5^%5^5^%=)=)=)=)?H8?H^?Hoooooo'N}'sJJJ hZ)Zd+=)o7oyHo`BTo;oo5oVH "-""N>"d>G55V5J5{5 5 5+{55X?{Z'%`wZ;7'Z%d`%ff\Z^ZZ^wZjwwZ`wZwZV55{=)555555;V5) 5 55 55{55{?{5b5V555 5ZmZZuZ1oo%T%Z%Z=%'sZ?j=j^jd\mjh%uZ%Z`%`%`1%%'sj5%'N}'N}'N}'s)))3,sj9wswj !;h s H}hh9h){)jm a \ f L {hmdbLhmhmhmhmqH%H%o=`{b/^Z{RZVyHTT`ju^ 5=%Z;f%%-{%Z3jbV5 5uZo1f{=5%Zd5%5%1ww{Z3^f3^f {}Z{Z1Z1f{ZhH-q?oZo;))5j5s5T5%Z)15%5Z5%{/J!5H%)5%B5%{Z{Z?h%fLu\bb5%;=J;=J5%F5%!5H%b5ZZ)ZV5uZHDu3HDu3)1q` 5o 5o{Z{Z{Z's's'sb5%5mj?=Z=ZB+5/%{ Zb^D'5ZZZZZZZZZZZZV5uZV5uZV5uZV5uZV5uZV5uZV5uZV5uZ`%`{Z{Z{Z{Z{Z{Z{Z-{%Z-{%Z-{%Z-{%Z-{%Zoo3j3j3j3j3j's's's6`FV`V`qZ'`hhNZ`}?E%?HV55555555595%"5555555 0HI~'2a7 # O_?M   " & 0 3 : < D p y  !!!! !"!&!.!^"""""""+"H"`"e% IJ(3b7 #P`>M   & 0 2 9 < D p t  !!!! !"!&!.!["""""""+"H"`"d%aIvhcb]gD Xz}} Bvt n%"iOS0L\pr`<&'()*+,-./0123456789:;<=>?@AIJ$%TUVWXY\]^_`abcdefhijklmnopqrstuvhijkFopqrstu45]^@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,F#F`F# F`ab# # pE` PXaYh:-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-@ !H U UHUPLOMdNLd&4U%3$UMLdLLF 3UU3U?KFFF#3"UO"3U3UU3U0U3UoTS++KRK P[%S@QZUZ[XYBK2SX YKdSXBYss++ss++++s+s^st++++t+++++++++++++^Nu^{o+TVKh)1Qy8Y'j/$FJ8^  L g @  . `  J f z $ p ?6]&Z)R-rGYU:VWs&p&GsK\m~ /@Rct%6Hr U# /A  K ! >Y>>??l??@@\@@AAsAAABB?B|BBBBBBBC.C6C}CDDeDDE3EvEFF#FFFFFFGGqGGGGH/HQHrHHHHHHHHI II'IMIeI}IIIIJ"JTJJJKiKqKyKKKKLL^LM2MMNENNNODO[OrOOOPP1P[PvPPQQQQRR@RLRXR}RRRRS SSSSST@TTTTTTTTTTTTTTUVVVVVW"W3WDWPW\WhWWX\XY.Y{YZZZ$Z-ZUZnZZZZ[[X[[\W\\]]h]^^U^__`;`C`K``aaSaeawaaabJccd:dde e=ebeeefg/ggh,hhi/i_iijjbjjjk)k^kkl lQlllm$m[mmn"noo&o2o^ooop4pmppqqgqqr2rzrrsDst trtztttu'ukuuv2vmvvw)wnwwwwwxx xx"x2xxxxxyy!y2yvyyyyyzz z(z0zBzSzezwzzzzzzz{{'{L{^{p{| |Q||}}C}K}~~^~WN݁!^Gɂڂ"4FXjɃۃ#8LXdu˄݄%7L`qÅԅ .@Rdyφ*6BSduȇه *;L\hƈ?ҊC >_&iqaύۍAQarɎێ*6KSem  /2/310!!7!!IhyJh"@   TY ?+?9/_^]10#!4632#"&TkaDRnYIRZlLEWlK ?3210#!#%GJ)5;@ 0@  ?3?399//]333333333310!!####7!7#7!333337# EtusqF!wuttENhhii3`%+C@%+ %&OY  PY@H,?99//3++33+3910#7&'&&546773&'6654&' ',ђG#!jn?BH?N1#>EP J k B=|DA 3a H>.;=D+ݴREBfR8TKOCUp_ġk P'5@QY   !%OY% OY ?+?+9/_^]+910#"'32654!#732654&#"'6632PT].IVN|ي}yuO 23q|nCJdQAP %@PY ??9/33+3910#!!7!3!7667#??07ê1: 8#a//i:#?vh&@PYNY OY?+?+9/+102#"&'32654&#"'!!6oԏu=smfoh7XHθ.# c{^^!NX&-@  PY OYOY?+?+9/+9104$32&#"3632#"&2654&#"Xz,}b3TkBsĝc}CEjRI1-H9$HئMFMF7\,A Dk(.Z8gYAJ @ LY??39/+910!!!!&55J'u' ,A\D`^z$x55@MY  LYLY?+?+9/_^]+9102!!32654##32654##ꦙdw5yyʴu na[Htg{7@ LY LY ?+?+10"327#"$32&&Ӏ\}ovjˢŵMM+-<;&5+ @ LYLY?+?+10#!! 2654&##+=5'۔|sch'H5 .@ LY  LY LY?+?+9/_^]+10!!!!!!!f526C7#P5 @ LYLY?+?9/+10!!!!!!f5.6O8'{m&@LY LY LY?+?+9/+10!# $32&&#"327!3sJW񉑖L^B5.!& c(0ͱ+5 @LYL ?3?39/]+10!!!!!!!oΆ)52yy1w= @  ?33?3310!!77'7!Ly$ɘ%%ɜRRRNRR  LY#?+?10"'53267!^]XLc{%14Rydq5 #@  ?3?9339310!!!!7!u}m52iPFBD5LY?+?103!!5526J5@  ?33?3910!!67#!#!!F'54= 65DqEJmX 5@   ?3?39910!!#!!36! "5eT 6R تPL{ @ LY LY?+?+10# $32%"32654&\ysyypA' >Ǝ5@ LY LY?+?9/+1032654##!#!!2 8J@Vm5Rt{!@LYLY?+3?+10!# $32%"32654&\ysyyp!bwH' >Ǝ5&@ MY   LY ?+?39/+91032654&##!!2!N_fJw5g-ruRRyŞ71)V# @ LYLY?+?+9910#"'32654&&'&&546632&#"݇p~2cp|ٴmSjBsyxZlUJ+A8JcpqcJZJ=[KP@ LY?+3?10!!!!!;77@  LY?+?310!"&547!326791{ NHBiJ3q  ??391067!!!N <'3+>pJ-Xg/@ ?3?33910!!3667!367!!'47.E-Zq +XJ5y145@3~JыXFy @   ?3?3910!!!!!dt@@kX+?@ ??393310!!!svVww8fPy/ $@LYLY?+9?+910!!7!!!+& 5)T1'?3?310!!#3'}- ??10!Jw'?3?3103#7!!\#-)qT' ?29103#k߮nJyFH /]310!7!{6! /10#&&'5!G$7$OEEZs %@  GYGY??+?+?9910"&54632373#7#'26654&#"a'9CENM?D{ICgTPG]tXX%h!+@   GYGY?+?+??99//102#"'##!366"326654-R:J->)+N-D|PJACzKsؾУubHP`uZs@  GYGY?+?+10"&54$32&&#"3267ו\6hBUM[QLE[H"߀`a/#OZ#'@ GYGY??+?+?9910"&546323767!#7#726654&#"Rw5L-G!B}LKAD{IeJZnUfWNP`tZBs!.@KY  JY FY ?+?+9/_^]+10"32654"&54$32!#3267X-3g`WesaS_RU[i&0V%*@ GYFYGY?+?+?+9910"'53267#?6632&#"3#-hF=6=\̣)ðhPE@9F 1MPZőTT1PA>s(4>4@:KY()&5KY&(JY(.KY?+?+?+/339/+10#"'!"&5467&5467&&5463232654&'"32654#;(T<;鉒JYfA>SSVjm—AiM_gK]\)4B 3"xf0/VGg/1~ZVBsZR'*șswuu%m@ GY  ?3??+910!!654#"!!36632Ӊl\+bJ-'*A>dD3{1M]Ik% @  IY  ???+104632#"!!B_WILX\-dWY>:Pc^ @IYGY?+??+10"'5327!4632#"ZhF=5$.MX_WILX\)PWY>:Pc%@  ?3??910!!!!3XxJJ-^HJ)Lf% ??10!!!RJ-%s&%@% !GY"??2+3?339910236632!654#"!654#"!336L+Diӊb\,`Ӊb\+bsnvLhD3{/D3{1^%ms@ GY  ?3??+910!!654#"!33632Ӊl\+bъD3{1^䧛IkZTs @ GYGY?+?+104#"3266%#"&54$32%KwKKxC/z}{ہMhs!'@ GYGY?+?+99??102#"&'#!336"326654-Sx3 HV :DMJACzKsJYJP`uZs$'@  GYGY?+?+??9910"&&54632373!667#726654&#"XMV:9/4:H=@IKAD{II_gKY^LކP`tXX%s@   ???29102&#"!336J;%B-7t%js  ^s" @ FY FY?+?+9910#"&'532654&'&&54632&#"=kEPfJ^y`ɢcv9F@X{nq#ZA8+D4D\_T3+';-?^oL'@@ FYGY?+?+3310%27#"&547#?3!!Aao sĄ12s#5~2>TJo^@  GY ??+?3910!3267!#7##"&547-l\+b-Ҋ^sD3{㥜]xf^  ??391067!!!7%)C'--FR^b}^@  ?33?3910!!3>7!3767!!47X>=3VH I3 \^+莛P2^ @   ?3?3910!!!!{Asb-}=!NVs^@   GY ?+?3/310!3667!!"'532677f'80)GXZ9D0T6^z3U `e1^ $@FYFY?+9?+910!!7!7!!#?s3+Sd'@  '?3?3933104#726766333#"&54776-z=&T1ZQB-US$C:5'?SaAJqN,E6(y9DE/ ?103#!&@ %&'?3?393310 3"##56676675&5477654T'-z>%-]XBo%II)8DETa䪌AI)on 3+E6(m'%}(@ ?_/]q333}/3310"56323267#"&'&&V6}6e@jV@^03z=g;daYLB7m$=@ RY  RY  ??39/3+3_^]29+310!3#3#!7#737#73!`s7'%//%')hNݲ/?/99//103#3#)*5@1+1( "?3?3910467&&54632&#"#"'532654&'&&6654_k*8ĬRQW&4̄c[B^ud3>Wd15YD"e9XTj+B'jżs#e:KiF9'C.95[66U._0mF  /333104632#"%4632#"UMNRTNADOQfNPlIWnNP84IW}\&6G@2p     #3+#?3?39/]q39/]q310"3267#"&54632&4$32#"$732$54$#"ohoh+;ЎKr~^]Í妤򒍆9H:^ZƤ椦m@  ?329910"&546632373#7#'26654#"qgr\dx<'P1-N5XIeuxgZB\hSLjwoHZ =@    0  /]3339/]33393333310%H9ϛgϛgm%?@?//]q310%#!5!%#l)j}\ &69@       #3+#?3?399//]3]39/3310###!232654&##4$32#"$732$54$#"XVC4L3HRGQ5\^]Í妤V!)j>=;;^ZƤ椦3@/?o/]310!7!- X@ p _  ?3]]21046632#"&&732654&#"][]\\^]][ABZ[AA[q]\^\][Z^?[\>?^_m% @ /33333/310!5!3!!#5!noq;J+@   ?3?3910!7%>54&#"'6632!x#o<3#VfdJn{,`[J[>8*(R9<~aFjef_\9-%'@ # !?3?39/]3910#"&'532654&##732654&#"'632-fsֲK2}Lb4>"ZTa4-VfRWu!H=:%389((B\o! /1067!#OO.VX8>^ @ GY ??+??399103267!#7##"&'#!!?0Z-b-u3MEV-\T\P3)}jD1@   ?33/99|/10#"'53254&'73VB?>f>O`'t~R"- H1J   ??99103#67'ϺT@fmb-Q)   ?3210#"&54632"32654)apЭ@WP?TinozkH7 E@'     Oo/]3339/33393333310'7'77on1N^g31N^g3aJ'&{< ?55a'tq&{?5'J'<Zu) ?55y^&&@ $$TY$ "?3?+9/_^]103267#"&546676677#"&54632spzE2q\9n]F`o^DQmYIS^NiLSV7v D}RsY>Y>!s\kLFVlJs&$CR&+5 s&$vR&+5s&$KsR&+5`&$RR&+5V&$jwR #&+55 &$P5X %?55oH@' LY   LY   LYLY?+?+3?99//+9/_^]+10!!!!!!!!!#9JVP6C7"OP\`X{7&&z35s&(CR &+55s&(v}R&+55s&(K9R&+55V&(j)R &+55s&,CR &+5s&,vR&+5s&,KrR&+5V&,jzR &+55%+ -@LY LY LY?+?+9/3+310#!#73! 2654&##3#+=}7'۔|sK7GcTdh'5`&1RR&+5{s&2CwR&+5{s&2vR$&+5{s&2KR"&+5{`&2RR%&+5{V&2jR /&+55  @ /_/]107'՘-1-Ӗ-+ј-՘d& @ #MY#LY?+?+9910#"''7&5$327%"&'326|lyb\{iu[~rTE;^|qAGs LuY E+P%=s&8CDR&+5s&8vR&+5s&8KR&+5V&8jR (&+55?s&<v{R&+55w @ LY LY  ??99//++10!#!!3232654##wV>522#d7J''w:,@& ))GYFY05GY0?+?+?+9102#"'532654&'&&54676654&#"#"'53276$NbI.,9kKֻne^5R^FZuBMOU`x+ЭZF=6%/rJ*55+SS=NB5(F>HtDTzB%N9>Igx=ƵZ!&DC"&+5Z!&Dvs)&+5Z &DK'&+5Z&DR*&+5Z&Dj 4&+55Z&DP $&+55Zs,:CT@0 >"KY> >>;JY4GY'FY -GY ??+3+?+?+?9/_^]+910"&'#7##"&546323736632!#3267%26654&#""32654m/G\`29,\4ohBLH|JBEDxFAqX-6<^XMڻ_MWZ1>`g.(VP`}T\saS_Zs&FzZB!&HC#&+5ZB!&Hv-*&+5ZM!&HK(&+5ZB&Hj 5&+55%C!&C&+5%P!&v@ &+5$M!&K &+5%7&j &+55H',7@&FYFY?+?29/+99910&'77#"&546323&''26654&#"j"ZvbLQ@S.aXnBqAMFIr?N".=NjkΥ>?a!odM[jkQ[%&QR+ &+5ZT!&RC&+5Zh!&RvX"&+5ZU!&RK &+5Z&RR#&+5ZT&Rj -&+55m%3@$ P`p?//]q3]2]2105!4632#"&4632#"&mJBBIJAAKJBCHJAAKdLKNIFRNKMQGFQN+f% @"FYFY?+?+9910#"''7&54$327%"&255T{fmwH`FTBBQEm#r 15lkM8Xnik6}~ P Do!&XC&+5o!&Xv&+5o!&XK&+5o&Xj *&+55s!&\v&+5h#'@ GYGY?+?+??99102#"'#!!36"326654&-≲] H-B3GvICHExKKs̓P`XXs&\j *&+55&$MR&+5Z&DM#$&+5}&$N\R&+5Z+&DN#&+5&$Q7Zs&DQ{7s&&vR"&+5Z+!&Fv"&+5{7s&&KR &+5Z&!&FK &+5{7f&&OR#&+5Z&FO#&+5{7s&&LR$&+5Z]!&FL$&+55+s&'L\R&+5Z&G8'%+Zq+J@) KY %GY   GY??+?9/_^]+9/3+3991023467!7!7!3##7##"&54626654&#"TX}- )'#-#)MUQDtLAIGzGL5EPlǡTZKõNwlHXzoXX5&(MVR&+5ZB&HM %&+55}&(NR&+5Zc+&HN$&+55I&(O-5&+5ZB&HO+&+55&(QZ(Bs&HQ5s&(L-R&+5Z!&HL,&+5{ms&*KR$&+5!&JKFE&+5{m}&*NR &+5+&JNA&+5{mf&*OR'&+5&JO#H&+5{;m&*9!&J:wC&+55s&+KR&+5%&KKN &+55-3@ LYL  ?3?39/]+9/39103#!!!#737!!7!7!{)Ά))(2))1V%)%w-ô%` <@!   KYGY   ?3?9/]+9/3+3910!!654#"!#737!!!36632}j]+V+#-!++&*>dPD3{oǡǤ}N\Of`&,RR&+5%|&R &+5&,MR&+5%&M&+5}&,N]R&+5%S+&N&+5&,Q&LQ`f&,OsR&+5%?^ ??10!!!R-^R&,-%&LM`Rs&-KUR&+5D!&7K&+55;&.9%;&N9{%^@  ?3?3910!!!!3XxJ-G ^H^x*5s&/vR&+5%&Ov &+55;&/9B;&O9"5&/8!?5%N&O85&/Oup%&OO!8 '@    LY?+?939103'7!7!9g:fݒ/kjV6wN˧h @  ??939107!'7!/@jcjys'  'Zs#09K@) 4KY4 44 1JY $GY +GYFY?+?+?+?+9/_^]+9910"&'#"&54$32632!#3267"3254&%"32654t.?{݊h3f`We]hGpEIImJX-MDDMI[i&0.(y~[b `evaS_5s&5vR&+5%!&Uv&+55;&59;s&U9&5s&5LBR!&+5%,!&UL&+5)xs&6vhR,&+5!&Vv+&+5)ds&6KR*&+5!&VKt)&+5)V&6zds&Vz/)s&6LR.&+5"!&VL-&+5;&798;oL&W9s&7LR&+5^(&W8$@  LY ?+3?9/333103#!#73!!!7}}7L77RTboL 9@ KY @FYGY?+?+339/3+310%27#"&5477#737#?3!!3#Aao !))Ą12))#5~2>TƔJ`&8RR&+5o&XR1 &+5&8MR&+5o&XM9&+5}&8NR&+5o+&XN&+5&8PR &+55o&XP &+55s&8S?R &&+55oR!&XS (&+55&8Qmo^&XQs&:KR%&+5}!&ZK%&+5?s&<KR&+5s!&\K&+5?V&<j#R &+55s&=vjR&+5 !&]v&+5f&=OR&+5&]O&+5s&=L R&+52!&]L&+5 @ GY GY?+?+10"'53276632&#"HhF=6$*ïkPE@9EM1PA/@ FYGYGY?+?+9/+9910"'5327#?6632&#"3#hF=6$)ðhPE@9F 1MqPT1PA>b)&.,@*LY** '`$$?3?39]29/+10!!!&54632%667!#4&#"326!&'=M+on$*V:Tנ7**600*7+5C pDJB0Bny/ 1p&-33--33oj5UZ !4BQ@/ @ H)@-3").):Pc  @    /3]210#"&546324&#"326 rnon7**600*7komk-33--44T  /?3103327#"&5467wH ,:TPfw_x`h2kXRM;!@ o /]99//3310".#"#3232673b1K@;!1;1MB:"0B!'!835!' 37! /321067!#%67!#ru1+`ru1+`5E5E5^/1067!#5LJxƧV /333910667!#4632#"%4632#"IZMD<=GJy'MD<=GJy*KNP93IWnNP93IW&$T 2>+5)}jD"/'(T 2>+5"7'+T 2>+5"',T 2>+5>&2wT 2 >+5"v'<7T  2 >+5>''vT #2##>+5Gx&U .&+555$5%5LY?+?10!!!!b5.6b(5(=5+{.@LY  LYLY?+?+9/_^]+10!7%# $3 %"32654&5D5\_"ńt}jf!V3 18Ŏ,5.R ?2?910#!!&5{V; /*TDDqOW5051h .@LY   LY LY ?+?+9/_^]+10!!!!!8eb755{3w=H{25@ LY?+?310!!!!!d350L53 *@LY LY?+9?+99910#77!!!+116> T5)7?<{H <@! MY  @   MYP`?]+99?_^]+99107.5%7!6654&'!-1wtY%%1dvpvo tב?  Ǧm ©py;%@MYO ??339/]3+310#!#"&547!33!3267!\_^'eop"f)omNϸYl!D1bR !@LY LY ?3+3?+10"!!&&54$3 !!$4&TooLO;5uewH#l7w;~K?ebV&,jzR &+55?V&<j#R &+55Z^&~TD7&+5'/^&T.&+5%m^&TB&+5`^&T&+5w&U 1&+555Zs!/+@)GY HY"GY?3++?+?99106673327#"'##"&546322654&#"w;-]C=$?f-Q\Y}3MtC@AGyHA)WSxA _F[N^ VP`xc\+0@$%%$GY%% GY GY ?+?+?9/+9102#"&'!66"32654&##732654&#๧}OLrY.Sfh6qic/3;n|Jw!*cx|#~\\|DK;^ ??33310!7!3>!}3'-- CbjP)i_> 7'$@" FYGY?+?+93310&54632&#"!"&542654'pcwCP.hef~M~5 ?3A^a$\909@100JY00'!%$%$FY%?+99/_^]9/+93310#"!6654&'&&5%5&&5467##7!#"33PFFlxW-WcqO;Jk`k:51-jusfsDU4[\qz.&3"F=^rPp* @xSPTZTsR^^"@ FYGY?+?+33?10%27#"&546!!#77!#ABd rο/l!7yF3yR(Hhs"@ GYGY?+?+?910#"'!>32"326654&h_ H.֝NWj"71dEuLB|R:oXmXbZs !@!  GY?+/_^]3310!6654&'&&54$32&#"Ndja1WcqO>G \~bTOPj-2ObB[\qz.(7 GƔKH9pZ;^@ FY GY?+?+310#"&54$3!!%"3254'JWσ1A/%5iRt)Nm[;-xՄof^%^@  FYGY?+?+310%27#"&547!77!!Aao s1s#5}2>RJw^@  GY?+?310"&547!3 !+5-PƶFP`=<}aZ#(@ FY ""GY"?+99?+?10%>54#"&&5476632DfQ^Y(i߬uTDn/̯Ω`݃3OmxҼ &s(@HY HY?+?+??9102!327#"&'!&&#"'63|@LJ 01-:ab~)5 **"'4es1:;!}NMA'w @  GY ?3+3??3?106!!&&547!ĵ-cb+[W `-1ƪFP`='4&##!!!!32uNPDIL% ?F7894b&'LF =6^'BL5s&av}R&+5{7.@LY  LY LY?+?+9/_^]+10"!!!27#"$32&&95\zhvH˿MM+18)8)V6,V&,jzR &+55R-?$0@$LYLY LYLY?+?+?+9/+1032!!# #"'53266!32654&##DJOP?5/ATPiGLw_amu?'HyuJQ5)@ LY  LY?+??39/3+310!!!!!!!3232654##@m52wy1wVI}my1Eynh#@ LY   LY ?+3?39/+104&##!!!!32!67JKِ789Td 'D7^>p^25s&vR&+5&6/R&+55V @  U LY ?3+??310!!!!!!j40\\LJV$5 &@ LY  LYLY?+?+9/+102!!!!2654##dN566A%lTyujw5%5a;V $@ ULY LY ?+33?+?31036!3!!!!5y\] NoLTV^5(!@  ?33?339310!!!!!!/ %H'ܗ TT-13)'-@MY $$MY$ MY ?+?+9/+910!"&'32654&##73 54&#"'6632ŏ͋N٪3_^m{mw $+cys]WHR{[GX5@    ?3?39910!!7'!!r^d#5AJ؏LF5&6R&+55 @  ?3?393310!!!!!`52X1T-@LY LY?+?+?10 #"'53266!!#OP?5/ATPiG]u?'J505+{25n53{7&7@  LY?+?39310"'32667!67!|WQu0J?13.XN  '"AQ]:n'yI{Hsy;5V @ U LY?+3??310%!!!!!h\/540`L@m@ LY ??39/+10!#"&547!327!w p1l 21V9;%.$JJ5 @ LY?+3?33103!!!!!55:};}9LLJ5V@ U LY?+33??3310%!!!!!!!\5:};}9`LL@' &@LY LY  LY?+?+9/+1032!!!!32654##CI7dlHuj5"@ LY  LY?+??39/+10!!!!!!3232654##59Rh52w%iEM6Kuj5R @LY LY?+?9/+10!!!3232654##RI52wCJdlKuj.@LY   LYLY?+?+9/_^]+10%267!7!75!"'63 #"&'<5A}PyS83ZE%.`5#2@ LY    LYLY?+?+??_^]9/+10#"47!!!!32%"32654&Ͱ52yPe kfwjkerD'2, 4;ɋ $@MY  LY ?+?39/+310!&&54$!!!#"33akY3wm^l1DkJ1roO[ZsDm#&$@  FYGY?+?9/+91076$%36632#"&%26654#"mH +ZB`BsGs8<K#g 9(-/WtTVykZRsOZZs *-@$$JY$$!JYJY?+?+9/+9102#"&54$32654&#"32654&ǻyyYZu۔[YU\apU'W_BsprTjYCh iuVDBAnFE05s& @"$FYFY?+?+9910632327#"&54>7>54#"гBpRdA^rFoE:yrX_{T;#$*dZ/']|S6,",VKZ)%1@  FY GYGY?+?+9/+9310#"&546323754&#"'63 267&&#"yݍ`|ja?j!YGsLJѺ$Ͼ)1BWݺXcZBsHs9=@ 7KY99'GY"-  GY2?3+3?3+3??9/3+310##"'7326654&#"56323!3632&#"327#"&55#!+9M:/5THHA-LLfd!d9$GA45}HA-LIiȬ` ށ`a/ `a-=s$-@#$$#JY$$ FY FY?+?+9/+9102654&#"'632!"&'53 54##7όtDVEMH~eE-;D.4-"Vh$8(#Xuo^Xo?&X6&+5%^ @  ?3?393310!!!!X!u.o^!^s@GY HY ?+?+?10!!&#"#"'53267>32Ӽ(CZJH#C[`Y<%/2O&fpWEu?gNio/u93^@    ?33?3910#&'!!667!!R*?; B-'>Oh^#TG54&'ܢ`h+ZVV]R]Q[Od٦&/ g j jr`^[jo^%@ "FYGY?+?+??39103267!327!&'##"&5473l\+b->'3`a Ɖ^sD3{Au-ȥD\^@GY ??29/+910!32677!!7##"&547->>9b--@+^D2?@/Oj^%%@%  !!GY?3+3??3399103267!#7##"'##"&547!3267c]+c-+Յ-b\/`^sF1{㦛Ik}sD3{jo^./@. $"FY**GY?3+3?+??3399103267!327!&'##"'##"&547!3267c]+c-=)1ag+Յ-b\/`^sF1{Au/㦛Ik}sD3{\^&@JY FY JY ?+?+9/+10632#"&547!732654#"cX}X1LCVgFZ^:xeFn=BYI{ NjJ^ "@JY JY ?+??39/+10632# 47"32654!!5bbisܘz%9J>4IY-^:yhEWfp}C5=>]Iw%^h^@JY  JY ?+?9/+10632#"&547!"32654V|-FZNBVfyeAsw}g%>AZH{s&@KYGY GY?+?+9/+102#"'53267!7!754&#"'6ב쿘h4xNq!+dWQ9]9Ps7'u{[c R%Ts *@ FY  GYGY?+?+??9/+10#"&55#!!36$32"326654Tb0]9NDnD@nB53^R y}{^#.@!!KY!!JY HY?+?+?9/+910"#"'53267767&5463!!"339R.Bo[<(%*5@_[O]FM];Odt-"3mAWI7CZB&Hj 5&+55%`*H@($ &'&KY'' ) GY    $)$GY?+??9/_^]+9/3+3910!!36632#"'53267654#"!#737!{++&,>d)ɣhF=5=]j\,X+#-sǻfN\OfLQYD3{oǡ!&v/&+5Zs&@KY GYGY?+?+9/+10"&54$32&&#"!!3267ؗ \6hB["o+LEZH"sr/#OsV%L%7&j &+55M{s(5:@!)JY &&GY&HY 1JY ?+?+?+9/_^]+10632#"&547'"#"&'532677>32"32654?ln|Z-CYGDHge3;!%/3M#+Q̝ΝEZLCVgyeIk@[ gp\:[#=BYI{1{^$-@JYFY JY ?+??39/++10632#"&547!!!!!"32654?tf|c/\'Z-EZLCVgye=]3^R}[#=BYI{%`%!&v&+5s?&\6&+5j^$@ GY??+??399103!3267!#7##"&547T1`Lۉl\+b-҉)=YsD3{㥜D\5@ LY?+?10!!!Bu56H%5@ GY?+?10!!!!I@f^1s&:C%R &+5}!&ZCs &+5s&:vR'&+5}!&Zv;'&+5V&:j}R 2&+55}&Zj 2&+55?s&<CR &+5s!&\CM&+5)/3107!)1T1)/3107!)1+1),2'BBv045H./H@ %)H]5]+++55sZ ?10'673{g[gjR ?10#6JgYj' /10%#6ygXj' ?10#'7 C hh s  ?3210'673!'6739gab%g[gj ?3210#6!#66JgYjg/}'5tLB /2210%#6!#66ygXj d2y'9{B  '@  ??9/333993310%!7!%ɘ4'"CBa;!E@!        ??99//3339933333993310%%!7777!%%XD447Z37D3/wvh) @ ?/]1046632#"&hUix}uja|Ȇ9&'1bs u &4@N9@5520LLL?";;+E?333?3??9/]39/]33310"3254#"&54632%#"3254#"&54632"326654#"&54632?_8A^pzo{@'I.7B^oxj|'H.7)H/lyj|``mJp]a`dړ!4paana`d۔#% HZ@ 0 /]39/]310H9ϛgHP-@Oo/]39/393310'7Pn1N^g3&3 ??10#?JX@   ?3]q2910654#"#3632'TA<\=͔d}adX "J|yo^-#R;@RY NY  NY ?+?9/+9/_^]3+310!!!#73!!!!$57%-5H8##V@0"#"RY ##/## ##RY OYNY?+9?+9/3+39/_^]3+31076632&#"!!!!!!7667#737#7s)îq`Hc+')%+71em%'VDM_qsE!n\s9.F@$%&@#& )&)QY&& NY NYQY?+?+?9/+9/+331032654&##!#!!2267#"&547#?33#3`^D+Ro8=+&@+h{>o{3.B.KP5t/Vjs$()&J@(RY @ RY OY NY?+?+9/3+3_^]2+310"!!!!327# #7367#73632&&a8\' +%Yg~B% }'WGdV}WXՕ"Qx{??C0.91{'3%@(%% /?3?3??9/39/310"&5432&#"3267##"&54632"32654ʨmb7U;2M+63!=@`?ʮ}̭+E(*&?T})#PA@#$))& @ H/+]q333}/33222}/3310"56323267#"&'&&"5632327#"&'&&V3zJqh @ ??933310#3h>s>s!fg%t&IL%&IO=? /3210#"&547!3267"Ԙ ck?LXbD^  GY?+?10"'53267!XhF=6=\-MPZ) ?1067!#S)@{9E{; /10667!#{Q!}EV39>Mm! /10!56673mWC(;;Jb5% !?3?310"3254#"&54632?_7B^i~i``d陟 /J- !@  ?3?9/]33310##7!7!3!77w !yw: <ᗗ-JL^95@p !?3?39/]3102#"'532654#"'!!6qڳ]3|9Yc?FLw)+$k6#NFnC Z9#$!@p!?3?39/]310632#"&54632&#"2654&#"LPtiyơ$f+9WmI=K3*=H/-X|mȬwp[G07MI1B{Jm ?3?10!7!{j'/J)R5'",@ ( # !?3?29102#"&5467&&54632654&"654&dYAOƫxm39=5,4<+##1@^*paXi $bIi^x&#W>n,]*2?+,82(8*)K"&Z9#!@ !?3?39/]310#"'53267#"&54632"32654&Y9\ z&ZshyƠ:K2*(A+B BA>=21 , 84 95!/333333333/3339333333333333339/333/39/3/339/393/310!#%5!#533!5353!5!!5!5!#3#35!#35!35!#35#3#3#"&546323254#"%32##32654&##32654#"'53253T/0momImmmm0oowoooomm~smp.,;0m^{B.$*/;J1%Z^4+V}i0oo/mmmmmmoo;mmJoooo/yhIaCS1D D8QYb" "+%J fVr_cT*1@ (("""//99//3333/993310 54676654&#"63232654&#"TV,AgIOGRZ?>1HT;GFBIHCHEVW/2A1R~X8*P:/5K6DpJ;?HI>@IH!&7L&+5jRu) 7H@'6)06770FY0 00FY0&FY?+?+9/_^]+9/39910654&#"#"&547654#"563232.546323|H?BA69+-tmfo#|z;|1Ye2;y\E]M9-e[IvS,f mr%#H@  MY?+??933107632&#"!!qCфSO8&;@uw8f{PN/^^+1@ ##  FY )FY?2+3?+339/910"&547!77!##"&'4'!32677!32)YIi/lBpESdrӾiRXoaim]I0۬oU2s+5u&0vT&+5%!&Pv/&+5&$[^Zs&D[B&2d\  /39/310#"&546324&#"326rppn7**600*7kmlk-33--44fh3 ?1067!#%467#"&=RxȖEO869Oyl^tJ)&  &,<%-8<GF@'@FIY@:#GY *66FY;' 2GY-?2+3?3+33?3+3??+10"'53267#?6632&#"!76632&#"3#!"'5327!!!4632#"-hF=6=\̣)ðhPE@9F )ðhOEA9E 1MhF=6$tM-`WILX\PZőTT1PA>T1PA>^WY>:Pc%;8<?@!;:#GY *66FY '2GY-?2+3?33+33?3+3??10"'53267#?6632&#"!76632&#"3#!"'5327!!!-hF=6=\̣)ðhPE@9F )ðhOEA9E 1MhF=6$tMI-PZőTT1PA>T1PA>{#'@ @  LY LY?+?+9910# $3 67!%"32654&\2p / /ysyypA' J:Tͷ>ƎZ"'@@ GYGY?+?+99102667!#"&54$4#"3266sDT' 0.KwKKxCs<3NMEz}{` @  @ LY ?+?39/310667!!"&547!3267'LT/ 7!#7##"&5473l\+b-3D+/ :̮҉^sD3{p >aj㥜D\!C!vRER /2910#76654&#"5632NA 3JIezAZH{5j$9@LY  LY LY?+?+??9/_^]3+310"!!3267#"7#!!3!2&75|JƆ52yR zhv˲#3 -M+ V;18a%s%1@ FY  GY GY?+?+??9/3+310"&547#!!36$32&&#"!!3267b0]B#µ\5hBP'g0]Q={[& 1^RH#mb`a#/O %@ MY ??339/+3910!!#!!!#7&'/)uD15|wDw~{;^ %@ JY   ??339/+3910!#!#!&'9%Pa) ^ZZ^e55@ MY LY  ??3?9/++3910!#!#!!!!!!3&'D1/Z5)x^?u*wwwCDdڗc%H^-@   FY  ?3?39/3+33910#!#!!!!!!!'Vhc\\jZt333^R4@ MYLY?+99?339/+33310#6677!!&&##!#"!VDHyq !/.}ʃ7W(Fkى$D`T{O_3qC^2@KY JY?+99?339/33+310#6677!#&&'!7!f=zPR%! \g/8źs}mhh3I@=885 %8@%LY LY?+9?39/33+3310!!#"!67!!!!7!!&&##7m˃ 9P)2;52yG^]2 !./qCL{M]/o?&[xD`T%^"8@ FY  " "JY ?+9?39/33+3310!67!!!!7!#&&'!7!+2c\SP%#]g/8ĻLX)3^RFhh 3HA=88/LN@(# M>8;GB B8@+,,+MY,,882MYJ8MY#?+?3+9/+9_^]293310327632&&#"&54667>54&##73 54&#"'667&'53>32&#"Œw^)wGXW7zJ8`yB3_^mVn2fk/P`b:<*"&%_Qw t)J)vY!:TF[SHR{7Mhp>YK' CW!/)dLP@+C**M /  #KLLKJYLL= JY =0FY=#?+?+39/+9_^]2933102654&#"'67&'53>32&#"32632&&#"#"&5467>54&##7ՍmDVEMHu)Tk/Q_e7>(%#$N>~wpUG>EADBL4V]ߌs4XX-;D.4-"4P{p>ZI' 1>?h$8vX -++! #;24:uw{ &@LY LY LY?+?+9/+10# $32267!"!74&\4{1x=yA' Cɴ8۷3ZTs &@JY GY GY?+?+9/+10#"&54$32267!"!54&TM|"{PK{$LMT|r[b{ndi@  LY?+??910667>32&#"!!J\v_RF4-@Z3'31:"῕HZcbQD>ff@  GY?+??91067>32&#"!! wux@H??>GV3X3i޴}>Vi:a4$DHcjW[)OmDvm"("3;&-&p \1* "-2Q)#i8NKVC(;,0pqXW2XZTR,@Rg@EDD P8-..488@& H8844; ;  ! FY& FY?3+3?3+399_^]23/+]9/39/310"'#"&54632&#"32673254&#"'632#".#"#6632356654&'&&5432'iɐfVvvw@I?}HVnnU>)z݌?Nl`)>"("4;&-&w\0* "^RB5CU@0;??CC/CCCC C8LLZ-%3))"00ZZgg  /32/329/39/3332229/33322233222102#&&#"#62#&&#"#662#&&#"#66!2#&&#"#662#&&#"#66!2#&&#"#662#&&#"#6!2#&&#"#66]qO0@ #037;(++;3# /3/3933333310#6736673#&'5&&'5'766'677'&&&'7BF$a5Ia4GA݁ZBO݁ExbCExbC{LbRC&b'Z1BO݁GA܂!Ia5F$a5DnXb'XDnXbYFcbxF24bE5VH$+@$!@ LY  U??3+?3229910!3!!!#7'!#"&547!3267jA r1^d#"Ԙ dlLFTL؏L/[_jo?+/@+#(@ "GYFY?+?+??392210!7##"&547!3267!3!#"&547!3267Ɖ-l\+b-i2 ckȥD\sD3{?¤Xb5R3@LY  LY LY?+?9/+9/3+310!!#737!3#3232654##RI7 2!8!CJdl!Kujs%=@ KYJY  !JY ?+?9/_^]+9/+9910!!632#"&547#737!"32654m/)eX})/-JFZLCVf5)xeFn N=BZH{54@  LY  LY ?+?9/+999910'##!!2327'7654##zt>DgtVm5Rd8+)416J BR%qRi?_hs';@ #"   GY GY ?+??+?999999102'"&'#!336"33'76654-7=4Sx3 HV :F|NE0 714:s]RJYJ}ZVyRhKl $@LY  LY ?+?9/3+310!!!#73!!58}7.6RTd^ $@ FY  GY ?+?9/3+310!!!!#735I/1XZ1b^^5'@ LY LYLY?+?+?9/+10"!!!632#"'3254&VI6u5.6VPXsؾzȑ/ g13 ӥ% ^'@GYGY HY?+?+?9/+10%#"'32654&#"!!!632ՒR`}YW/#P5I53Pʸ+6ؼqz^V-@   UMY?+33??339310!!!!!!3!;ܗk/ %Hя\13 TT-`os9C@$"&&KY $$"55GY FY).GY)?+/+?3+3???9/3+31023!3632&#"327!&&55#!##"'7326654&#"569d!d9$GA45}NERP\``9M:/5THHA-LLs/ `a!o֯-= ށ`a)&s&q5V$@  UMY?+???393310%!!#!!!#]52X`1T-%o^$@   "GY?+???393310!3!#!!X!`u.o^u!^5@    ?3?3910!!#!!73!`{Vyo52KXNTTf/Z^@ ?3?3910!!!737!!#'-oVDP"}#N/^dE_m  ` $-xL}fޯbZs+7\@,2" ))2KY))))) )@ H)) JY @GY"FY?+?++9/+_^]+99910327#"'#"&54$32&#"33&&546326654&#"yZ">8FUk`}ؙ A/D3{/D3{1^?<f^  ??3/331067!!!'3)Chi'05reR^PaL?-@ LY      ??393/]3+310!!!!!!7!svV'5:958fPy^@ FY  ??3?33+31067!!!!!7!!$:)C1781'-1mnR^9Vy#@ U MY?+???3910!!!!!!t@@kX߲\+`o^#@  " GY ?+???3910!!!!#!{Asb- ^}=!NuVVo&@U LY   LY?+3?3+3?10!!!!!!!B\/750 LNT\o1^#2@!" ! FY !FYGY?+?+?3+3?9103267!327!&'##"&547#7!Xfa+b->'3`a ƉP11yXD9uAu-ȡZyV"@LY UMY?+??39/+10!#"&547!327!!!w p1l 2\1V9;%.$J@`o^)@ GY "GY?+??39/+910!7##"&5477!32677!3!@+3->>9b--`/OD2?@um-@LY??39/+999910!!##"&547!367!7wfLFA p1l }EDR^21./9;%.$v H,^+@GY ??39/+9999910736677!!7##7"&5477!>H1/E\#-?+>I6/3^D2^#ß/D$ըO5@ LY ?3?9/+10!632!654#"!j2w pm V5@.$Jq%!^@ GY  ?3?9/+10!!654&#"!!3632=>9b--?+#F1?@^ѴD=;#-4@' '' MY''$LYLY?+?+9/+9910!2!#327# 7&&54733"32654&Xv~jűJ5--׀0\Ed'BƳKM&VqubQ='/gɞvr;Ds#,4@'''KY''$JYFY?+?+9/+3310"&55$547333632!#3267"32654:+)! <=ٱ3g`We6X-)dR@G*.[i&0VsaS_=V; 0;@ .MY')ULY*''"LY'?+3?+?9/+9910"32654&47333!2!#327!&57&&0\EzJ5-- ^~ v~jņV^ɞvr;DubQ='/,=ƳK= f2Vos/;@)% KY " JY !FY?+3?+?9/+3310"32654632!#3267!&&55$54733X-X<=ٱ3g`WeP\:+)!saS_[i&0C'ҡ)dR@G*.,&6`R&+5?&6y>&+55'@ MY LY?+??39/+310"!!!#"'325sSMm52XvbĨ{z!TR13 B% ^'@KY HY ?+??39/+310!#"'32654&#"!!X-]b{|oF;N-n^۷դ+6ȵt^V$@LYULY LY ?+?+??+10!!!! #"'532661OP?5/ATPiGTLu?'os!&@"FYGYHY?+?+?+?10%3!#&#"#"'53267>32 (CZJH#C[`Y<%/2O&fpWEu?gNio/u95,@ LY    LY  ??3?+9/_^]+10"'3267!!!!!{}'k)52yy1=12=% ^"@FY HY?+??39/+10!!#"'3267!!D]]Z-5ԛgrobx"Xb^R:<3^5V,@LY    LYU??2+?39/_^]+10!!!!!!!!=)52yy11w=TL%o ^%@FY " FY?+???39/+10!!!!!!3!`b0]]Z-3^RVm"@LY UMY?+??39/+10!!!#"&547!327![єD p1l 2V;V9;%.$JJo^)@GY " GY ?+??39/+91032677!!!37667##"&5477!>>9b--T 3^D2?@o7-uO5VH#@  LYU??33+?3910!#!!3!!!#7#j= 65D'1:/mHPXETL ou^$@    "FY?+??3?3910!#&'!!67!3!#R*?; X1'>Oh^#TGX,^&$6uR&+5Z?&D6%&+5V&$jqR #&+55Z&Dj 4&+55oZs5&(6'R&+5Z?&H6&&+5D"&@MY LY LY ?+?+9/+10"63 #"&54$!3654&267#"mS "k@N, NFĴ)%wn`%o^ @"GYGY?+?+?103!!3!%3I`^u5V&jRR *&+55jJ&j 4&+557@ LY  LY LYMY?+?+?+9/3+310"'532677!#73!!!!!iH7K4Ʈ1#9;fqɋ}KHZ#1,@   +GY $$GY ?3+3?+?99/10%#"&546323466!32677!#"&'%26654&#")Ϻ努` S- @3KN51C-߽s,IwFCIExKLȾhK[2$8=cVTI|P`XXq,0@MY**%MY* LY?+?+9/+9/103267!#"&54654&##732654&#"'6!2DntzBPT6c, ml/QOrs)n}t`w-&M-OUws?NiӐs+0@)JY ##FY# GY ?+?+9/+9/103267!#"&554&##732654&#"'632A2IM=1C+Ͻ\}-pIQFJH{s)65ZiŢ)OD:E6,.!Vj$"V%0@MY$U MY!MY?+?+?9/+910!654##73 54&#"'6632!!DO4~^^m{mň \m?-HR{[GX` wO`os$0@JY#"FY GY?+?+?9/+910!7654&##732654&#"'6323!L7^^-}tDVEMHр`DH;;D.4-"Vm!3%Xud&!@ &LY&  LY?3+3?+/103267!#"&547! #"'53266<;ETT5b+OP?5/ATPiG<"3?fq-ñ>qu?'s/"@*GY* GY"HY ?3++?+/1032677!#"&547&#"#"'53267>32+@3KN51C- b(CZJH#C[`Y<%/2O&fpWE T8=c¯6;?gNio/u9q25o.@ LY  LY?+??39/_^]+/103267!#"&5467!!!!<;ETT6c+!)52yy<"3?fq-ô-k=%^&@FY HY?+??39/+/10!!32677!#"&5477!!D]]Z- C6CQ51C- b^RV4&68`w®6;#3^{&@LY LY LY?+?+9/+10!! $32&&#"!267!#DseJ!50c6"ʷZs&@FY GY GY?+?+9/+10!!"&54$32&#"3267!7 82mDmh[iG2&Halkj9@LY LY?+?+3/10!!3267!#"&54777<;ETT5b+<"3?fq-ñ>q^^@FY GY ?+?+3/1032677!#"&547!7!!b@3KN52D+T/1` T8=cñEt17D'-@# MY LYLY?+?+9/+9102&&#"33#"3267!"$54675&54$#~Afjz3{ˉ{]O,>P/@^N[Sur\N5+VȲ H'/s"+@LY"LY"LY MY?+?+?+?+10!#"'532677!! #"'53266+X'iH732'M'hH7q,-#%5%A6=)x)A<>$^,o/#yx1 '- j`)<MRz<  /32910#"&54733275673;"џB?eG+N? 0  /32910#"&5473327&'53;"џB~58+Nsbji!@   /32299310#"&5473327'#76654#"5632;"џB5CD h 63-* *uQ5T28%#' 5)>5%0v t8I{Lpm.(F /?310254&'3#"'5Jm1-\=:f5a9vr|`/ ?2210"'53267!hH732!8(mÅ<5A^lYŐJ/7JKWN*n}'-@QY %%OY%& OY %?+?+9/+910#"'32654!#732654&#"'6632񽧃T].IVN|ي:yuO 23q|nCJdQA)s '@PY %??9/3+93910%#!!7!3!667#MP191 &?D=smpE0s&@PYNY OY%?+?+9/+102#"&'32654&#"'!!67ԏu=smfoh7XHWθ.# c{^^!NZtu@ $NY?+9?10!!8) ?nE3'-@!PYOY& OY%?+?+9/+910#"'32667##"&54632"326654&3potys*oAAe7KDT1PA>"3>@1%%+*#  /#((*5-*?33/39/3/3993399310#"'532654&''&&54632&&#"##33#7#dunXsW-0$%2bFq_p38<(Q.FgGdq+6'#'1eC]r4}C .!2^o^/y&7z\VoL&Wz%s +.@&#(#GY#GYGY?+?+?+?9910%26654&#""'326767##"&54632373HxFFFExKL;e!HS_<9d߈|P`XX5BZcOkm^LֿeJZ/!&K2&+5+&N.&+5&O#5&+5!&:{0&+55 ??103!581J5s&CR&+55s&vR &+55s&KIR &+55V&jQR &+555`&ROR &+55~&MeR&+55}&N4R&+5&Qd5f&OXR &+55RE&-"/'T 2>+555V&jQR &+5555V&jQR &+55555;&fR&+5R&g2I6$$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs) $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q  q q q           ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q   q   q    q q  q  !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) -&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq7$&q&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq$q$ q$&$*$- $2$4$7q$9$:$<$$$$$$$$$$$$$$$$$$$$$$q$&q$6$8$:$G$$$$$q$ q$_$I$K$M$O$Q$S$U$W$Y$[$]$_$o$q$s$q%%%$%7%9%:%;%<%=%%%%%%%%%%%$%&%6%8%:%;%=%?%C%%%%%%% %X%%%!%#%%%'%)%+%-%/%1%3%o%q%s%&&&*&2&4&&&&&&&&&&&&&&&&&&&&G&_&I&K&M&O&Q&S&U&W&Y&[&]&_'''$'7'9':';'<'='''''''''''$'&'6'8':';'='?'C''''''' 'X'''!'#'%''')'+'-'/'1'3'o'q's'(-{)))"))$))))))))))C)) )X)))!)#)%)')))+)-)/)1)3.&.*.2.4....................G._.I.K.M.O.Q.S.U.W.Y.[.]._/\/ \/&/*/2/4/7/8/9/:/</////////////////////////$/&/*/,/./0/2/4/6/8/:/G/////\/ \/_/a/I/K/M/O/Q/S/U/W/Y/[/]/_/a/c/e/g/i/k/m/o/q/s/222$27292:2;2<2=22222222222$2&26282:2;2=2?2C2222222 2X222!2#2%2'2)2+2-2/21232o2q2s2333$3;3=3333333333;3=3?3C33 3X333!3#3%3'3)3+3-3/3133444$47494:4;4<4=44444444444$4&46484:4;4=4?4C4444444 4X444!4#4%4'4)4+4-4/41434o4q4s47777")7$q7&7*727477)7D\7Fq7Gq7Hq7Jq7P7Q7Rq7S7Tq7U7V7X7Y7Z7[7\7]7q7q7q7q7q7q77777777q7\7\7\7\7\7\7q7q7q7q7q7q7q7q7q7q7q777777q7\7q7\7q7\77q77q77q77q7q7q7q7q7q7q7q77q77q77q77q7777 77q77q77q77q7777!7$)7&)7+7-7/717375777<7>7@7Cq7D\7F\7G7Hq7J7777777 7W7Xq7Y\7_7`q7b7q7\7q7 \7!q7"\7#q7%q7&\7'q7(\7)q7*\7+q7,\7-q7.\7/q70\71q72\73q74\76q78q7:q7<@<C<D<F<G<H<J<< <W<X<Y<_<`<b<<<< <!<"<#<%<&<'<(<)<*<+<,<-<.</<0<1<2<3<4<6<8<:<<<@<B<D<I<J<K<L<M<N<O<Q<R<S<T<U<V<W<X<Y<Z<[<\<]<^<_<`<b<d<f<h<j<l<n=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_>-DD DD EE EYEZE[E\E]EE7E<E>E@EEEE EpF)F )F)F )HH HYHZH[H\H]HH7H<H>H@HHHH HpI{I {I{I {KK KK NFNGNHNRNTNNNNNNNNNNNNNNNNNNNNNNNNNNNNHN`N6N8N:N<N@NBNDNJNLNNNRNTNVNXNZN\N^N`PP PP QQ QQ RR RYRZR[R\R]RR7R<R>R@RRRR RpSS SYSZS[S\S]SS7S<S>S@SSSS SpURU RUDUFUGUHUJURUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUDUFUHURU RUYU`UU U"U&U(U*U,U.U0U2U4U6U8U:U<U@UBUDUJULUNURUTUVUXUZU\U^U`W)W )W)W )YRY RYYY")YRYY RY ZRZ RZZZ")ZRZZ RZ [F[G[H[R[T[[[[[[[[[[[[[[[[[[[[[[[[[[[[H[`[6[8[:[<[@[B[D[J[L[N[R[T[V[X[Z[\[^[`\R\ R\\\")\R\\ R\ ^-q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq-{&*24G_IKMOQSUWY[]_-{-{-{-{$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjln$;=;=?C X!#%')+-/13             YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p   YZ[\]7<>@ pR R")R R  YZ[\]7<>@ pR R")R R q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  &*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_$79:;<=$&68:;=?C X!#%')+-/13oqsR R "@E=K=N=O=`={R R$79:;<=$&68:;=?C X!#%')+-/13oqs-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p  &*24G_IKMOQSUWY[]_FGHRTH`68:<@BDJLNRTVXZ\^`FGHRTH`68:<@BDJLNRTVXZ\^`\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqsR R "@E=K=N=O=`=R R\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs  $79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs-{R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`$$$$")$$q$&$*$2$4$7)$D\$Fq$Gq$Hq$Jq$P$Q$Rq$S$Tq$U$V$X$Y$Z$[$\$]$q$q$q$q$q$q$$$$$$$$q$\$\$\$\$\$\$q$q$q$q$q$q$q$q$q$q$q$$$$$$q$\$q$\$q$\$$q$$q$$q$$q$q$q$q$q$q$q$q$$q$$q$$q$$q$$$$ $$q$$q$$q$$q$$$$!$$)$&)$+$-$/$1$3$5$7$<$>$@$Cq$D\$F\$G$Hq$J$$$$$$$ $W$Xq$Y\$_$`q$b$q$\$q$ \$!q$"\$#q$%q$&\$'q$(\$)q$*\$+q$,\$-q$.\$/q$0\$1q$2\$3q$4\$6q$8q$:q$&@&Cq&D\&F\&G&Hq&J&&&&&&& &W&Xq&Y\&_&`q&b&q&\&q& \&!q&"\&#q&%q&&\&'q&(\&)q&*\&+q&,\&-q&.\&/q&0\&1q&2\&3q&4\&6q&8q&:q&(@(Cq(D\(F\(G(Hq(J((((((( (W(Xq(Y\(_(`q(b(q(\(q( \(!q("\(#q(%q(&\('q((\()q(*\(+q(,\(-q(.\(/q(0\(1q(2\(3q(4\(6q(8q(:q(8@8C8D8F8G8H8J88 8W8X8Y8_8`8b8888 8!8"8#8%8&8'8(8)8*8+8,8-8.8/808182838486888:8<8@8B8D8I8J8K8L8M8N8O8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8b8d8f8h8j8l8n9R9 R999")9R99 R9 :::"):$:&:*:2:4:D:F:G:H:J:P:Q:R:S:T:U:V:X:]:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::!:+:-:/:1:3:5:<:>:@:C:D:F:G:H:J:: :W:X:Y:_:`:b:::: :!:":#:%:&:':(:):*:+:,:-:.:/:0:1:2:3:4:6:8:::<:@:B:D:I:J:K:L:M:N:O:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:^:_:`:b:d:f:h:j:l:n;&;*;2;4;;;;;;;;;;;;;;;;;;;;G;_;I;K;M;O;Q;S;U;W;Y;[;];_=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_?&?*?2?4????????????????????G?_?I?K?M?O?Q?S?U?W?Y?[?]?_CqC qC&C*C- C2C4C7qC9C:C<CCCCCCCCCCCCCCCCCCCCC$qC&qC6C8C:CGCCCCCqC qC_CICKCMCOCQCSCUCWCYC[C]C_CoCqCsCqDD DD E-{GGG$G7G9G:G;G<G=GGGGGGGGGGG$G&G6G8G:G;G=G?GCGGGGGGG GXGGG!G#G%G'G)G+G-G/G1G3GoGqGsGVqV qVfVmVqqVrVsVuVxVqV qVT[[[V[_[b[d[i[p[q[r[t[u[x[[[ [T\\\V\_\b\f\i\m\s\v\y\z\{\|\}\~\\\\\\\\\\\\\\\\\\\\ \!]q]r]x]T^^ ^^ _q_ q_f_m_qq_r_s_u_x_q_ q_T```V`_`b`i`t`` aaaaV\a_\ab\afai\amasavayqaza{a|a}a~qaaaaaaaaaqaaqaqaaqaaaaaqaaaaaaa a!aSbqb qbfbmbqqbrbsbubxbqb qbTdfdmdsfffVf_fbfdfifpfqfrftfufxfff fThfhmhshhiqi qifimiqqirisiuixiqi qiTmmmVm_mbmdmimpmqmrmtmumxmmm mToooVo_obodoiotooo qqqqV\q_\qb\qfqi\qmqsqvqyqqzq{q|q}q~qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq q!qSrrrVr_rbrfrirmrsrvryrzr{r|r}r~rrrrrrrrrrrrrrrrrrrr r!sssVs_sbsdsispsqsrstsxsss sTtftmtsttuuuVu_ubufuiumuu vqvrvxvTxxxVx_xbxfxixmxsxvxyxzx{x|x}x~xxxxxxxxxxxxxxxxxxxx x!y){{ {{ || |||| ~) y~     y~ y~         y~       n| q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqql~    n|   n|   n| l|~  qff jlrqs~ffqqq q  q q qqq qn|q qq  r|  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq)l|~    l|~   rsz|  rsv  l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqqqff jlrqs~ffqqq q  q  rsz l|~  ))  n|   n|  rsz|  rsz|   ) js      j  )j       js   s  j        m  m         js    m  m  j   sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R 7$&q7$&q7$&q$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q                        q  q  q                             ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q    q    q    q q  q   !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) & * 2 4 7q 8 9 : <                         $q &q * , . 0 2 4 6 8 : G f m qq r s u x  q  q   q  \ q        T _ a l |\ ~        q    q    q  \  \    \     \        q  I K M O Q S U W Y [ ] _ a c e g i k m o q s q!q!r!x!TSSSS TTTVT_TbTfTiTmTsTvTyTzT{T|T}T~TTTTTTTTTTTTTTTTTTTT T!XqX qX&X*X- X2X4X7qX9X:X<XXXXXXXXXXXXXXXXXXXXX$qX&qX6X8X:XGXXXXXqX qX_XIXKXMXOXQXSXUXWXYX[X]X_XoXqXsXqYY YY ZZZVZ_ZbZdZiZpZqZrZtZuZxZZZ ZT`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`RbIfbWfbYfbZfb[fb\fbfb%fb'fb7fbfbfb4fb5fb]fb^fbpfbfbfjj jj llllllllllllllllllllll lrlslzl|lllllllllllllllllllllllllllll llllllmmmmmmm msmmmnn nnnnnnnnn n|nnnnnnnnnnnnnnn nnnoo ooooooooo omooooooooooooooooooooooooooopppppplp~ppppppppppppppppp p ppprqr qrrrqrrrrrrrqr qrnr|rrrrrrrrqrrrrrrrrrrrrrrrrrrr qrrqrrrsqs qssssssssssssqs qsjsms}sssssssssssssssssssssssssssss s ssssstqt qtttqtttttttqt qtnt|ttttttttqttttttttttttttttttt qttqtttuqu quuuuuuuuuuuuqu qujumu}uuuuuuuuuuuuuuuuuuuuuuuuuuuuu u uuuuuv vx xzzzz zzzzz z|q|q||||||||q| q|r|s|||||| | ||||}} }}}}}}}}} }}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~ ~r~s~z~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~  qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  s s s rsz|    rsz|    rsz|  sl~  )    |   m rsv    )))))) jklqrsuwy}~)))))    ) js   f |   l{=}~j    )l{=}~j  l|~  j  l|~  j  l|~  j  )  )))))) jklqrsuwy}~)))))    ) js  \ \fH\ \|qqH HHq qq qmqq   l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )) jklqrsuwy}~))     s)) jklqrsuwy}~))     sl{=}~j  )  )    |         l|~  j   f m| )  )  )  q qqq qn|q qq  q qqq qn|q qq       rsz|    rsz|   l|~  j    )   rsz|    rsz|    rsz|    rsz|   qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )))))) jklqrsuwy}~)))))    ) js  l{=}~j  l|~  j          q             r v |       q                                                                           q             r v |       q                                      )   q rv|q    q rv|q    r    r|   )  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq     !q! q!&!*!- !2!4!7q!9!:!<!!!!!!!!!!!!!!!!!!!!!$q!&q!6!8!:!G!!!!!q! q!_!I!K!M!O!Q!S!U!W!Y![!]!_!o!q!s!q"" "" #q# q#&#*#- #2#4#7q#9#:#<#####################$q#&q#6#8#:#G#####q# q#_#I#K#M#O#Q#S#U#W#Y#[#]#_#o#q#s#q$$ $$ %q% q%&%*%- %2%4%7q%9%:%<%%%%%%%%%%%%%%%%%%%%%$q%&q%6%8%:%G%%%%%q% q%_%I%K%M%O%Q%S%U%W%Y%[%]%_%o%q%s%q&& && 'q' q'&'*'- '2'4'7q'9':'<'''''''''''''''''''''$q'&q'6'8':'G'''''q' q'_'I'K'M'O'Q'S'U'W'Y'[']'_'o'q's'q(( (( )q) q)&)*)- )2)4)7q)9):)<)))))))))))))))))))))$q)&q)6)8):)G)))))q) q)_)I)K)M)O)Q)S)U)W)Y)[)])_)o)q)s)q** ** +q+ q+&+*+- +2+4+7q+9+:+<+++++++++++++++++++++$q+&q+6+8+:+G+++++q+ q+_+I+K+M+O+Q+S+U+W+Y+[+]+_+o+q+s+q,, ,, -q- q-&-*-- -2-4-7q-9-:-<---------------------$q-&q-6-8-:-G-----q- q-_-I-K-M-O-Q-S-U-W-Y-[-]-_-o-q-s-q.. .. /q/ q/&/*/- /2/4/7q/9/:/</////////////////////$q/&q/6/8/:/G/////q/ q/_/I/K/M/O/Q/S/U/W/Y/[/]/_/o/q/s/q00 00 1q1 q1&1*1- 121417q191:1<111111111111111111111$q1&q16181:1G11111q1 q1_1I1K1M1O1Q1S1U1W1Y1[1]1_1o1q1s1q22 22 3q3 q3&3*3- 323437q393:3<333333333333333333333$q3&q36383:3G33333q3 q3_3I3K3M3O3Q3S3U3W3Y3[3]3_3o3q3s3q44 44 5-{66 6Y6Z6[6\6]6676<6>6@6666 6p7-{88 8Y8Z8[8\8]8878<8>8@8888 8p9-{:: :Y:Z:[:\:]::7:<:>:@:::: :p;-{<< <Y<Z<[<\<]<<7<<<><@<<<< <p=-{>> >Y>Z>[>\>]>>7><>>>@>>>> >p?-{@@ @Y@Z@[@\@]@@7@<@>@@@@@@ @pA-{BB BYBZB[B\B]BB7B<B>B@BBBB BpC-{DD DYDZD[D\D]DD7D<D>D@DDDD DpIII$I7I9I:I;I<I=IIIIIIIIIII$I&I6I8I:I;I=I?ICIIIIIII IXIII!I#I%I'I)I+I-I/I1I3IoIqIsIJJ JYJZJ[J\J]JJ7J<J>J@JJJJ JpKKK$K7K9K:K;K<K=KKKKKKKKKKK$K&K6K8K:K;K=K?KCKKKKKKK KXKKK!K#K%K'K)K+K-K/K1K3KoKqKsKLL LYLZL[L\L]LL7L<L>L@LLLL LpMMM$M7M9M:M;M<M=MMMMMMMMMMM$M&M6M8M:M;M=M?MCMMMMMMM MXMMM!M#M%M'M)M+M-M/M1M3MoMqMsMOOO$O7O9O:O;O<O=OOOOOOOOOOO$O&O6O8O:O;O=O?OCOOOOOOO OXOOO!O#O%O'O)O+O-O/O1O3OoOqOsOQQQ$Q7Q9Q:Q;Q<Q=QQQQQQQQQQQ$Q&Q6Q8Q:Q;Q=Q?QCQQQQQQQ QXQQQ!Q#Q%Q'Q)Q+Q-Q/Q1Q3QoQqQsQSSS$S7S9S:S;S<S=SSSSSSSSSSS$S&S6S8S:S;S=S?SCSSSSSSS SXSSS!S#S%S'S)S+S-S/S1S3SoSqSsSUUU$U7U9U:U;U<U=UUUUUUUUUUU$U&U6U8U:U;U=U?UCUUUUUUU UXUUU!U#U%U'U)U+U-U/U1U3UoUqUsUXIRXWRXYfXZfX[fX\fXfX%RX'RX7fXfXfX4RX5RX]RX^RXpfXRXRZIRZWRZYfZZfZ[fZ\fZfZ%RZ'RZ7fZfZfZ4RZ5RZ]RZ^RZpfZRZR\IR\WR\Yf\Zf\[f\\f\f\%R\'R\7f\f\f\4R\5R\]R\^R\pf\R\R^IR^WR^Yf^Zf^[f^\f^f^%R^'R^7f^f^f^4R^5R^]R^^R^pf^R^R`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`Raaa$aaaaaaaaaaCaa aXaaa!a#a%a'a)a+a-a/a1a3fIffWffYffZff[ff\ffff%ff'ff7ffffff4ff5ff]ff^ffpfffffhIfhWfhYfhZfh[fh\fhfh%fh'fh7fhfhfh4fh5fh]fh^fhpfhfhfjIfjWfjYfjZfj[fj\fjfj%fj'fj7fjfjfj4fj5fj]fj^fjpfjfjflIflWflYflZfl[fl\flfl%fl'fl7flflfl4fl5fl]fl^flpflflfnIfnWfnYfnZfn[fn\fnfn%fn'fn7fnfnfn4fn5fn]fn^fnpfnfnfooo")o$o&o*o2o4oDoFoGoHoJoPoQoRoSoToUoVoXo]oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooo!o+o-o/o1o3o5o<o>o@oCoDoFoGoHoJoo oWoXoYo_o`oboooo o!o"o#o%o&o'o(o)o*o+o,o-o.o/o0o1o2o3o4o6o8o:o<o@oBoDoIoJoKoLoMoNoOoQoRoSoToUoVoWoXoYoZo[o\o]o^o_o`obodofohojolonpRp Rppp")pRpp Rp qqq")q$q&q*q2q4qDqFqGqHqJqPqQqRqSqTqUqVqXq]qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqq!q+q-q/q1q3q5q<q>q@qCqDqFqGqHqJqq qWqXqYq_q`qbqqqq q!q"q#q%q&q'q(q)q*q+q,q-q.q/q0q1q2q3q4q6q8q:q<q@qBqDqIqJqKqLqMqNqOqQqRqSqTqUqVqWqXqYqZq[q\q]q^q_q`qbqdqfqhqjqlqnrRr Rrrr")rRrr Rr sss")s$s&s*s2s4sDsFsGsHsJsPsQsRsSsTsUsVsXs]ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssss!s+s-s/s1s3s5s<s>s@sCsDsFsGsHsJss sWsXsYs_s`sbssss s!s"s#s%s&s's(s)s*s+s,s-s.s/s0s1s2s3s4s6s8s:s<s@sBsDsIsJsKsLsMsNsOsQsRsSsTsUsVsWsXsYsZs[s\s]s^s_s`sbsdsfshsjslsntRt Rttt")tRtt Rt { {{ {")$q&*247)D\FqGqHqJqPQRqSTqUVXYZ[\]qqqqqqq\\\\\\qqqqqqqqqqqq\q\q\qqqqqqqqqqqqqqq qqqq!$)&)+-/1357<>@CqD\F\GHqJ WXqY\_`qbq\q \!q"\#q%q&\'q(\)q*\+q,\-q.\/q0\1q2\3q4\6q8q:q9 9 B*MX wR  . .F*t r  " T8 *N  &  (n 8 \ \* TDigitized data copyright 2010-2011, Google Corporation.Open SansBold ItalicAscender - Open Sans Bold Italic Build 100Version 1.10OpenSans-BoldItalicOpen Sans is a trademark of Google and may be registered in certain jurisdictions.Ascender Corporationhttp://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0Digitized data copyright 2010-2011, Google Corporation.Open SansBold ItalicAscender - Open Sans Bold Italic Build 100Version 1.10OpenSans-BoldItalicOpen Sans is a trademark of Google and may be registered in certain jurisdictions.Ascender Corporationhttp://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0ff      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~.notdefnullnonmarkingreturnspaceexclamquotedbl numbersigndollarpercent ampersand quotesingle parenleft parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon semicolonlessequalgreaterquestionatABCDEFGHI.altJKLMNOPQRSTUVWXYZ bracketleft backslash bracketright asciicircum underscoregraveabcdefghijklmnopqrstuvwxyz braceleftbar braceright asciitildenonbreakingspace exclamdowncentsterlingcurrencyyen brokenbarsectiondieresis copyright ordfeminine guillemotleft logicalnotuni00AD registered overscoredegree plusminus twosuperior threesuperioracutemu paragraphperiodcenteredcedilla onesuperior ordmasculineguillemotright onequarteronehalf threequarters questiondownAgraveAacute AcircumflexAtilde AdieresisAringAECcedillaEgraveEacute Ecircumflex Edieresis Igrave.alt Iacute.altIcircumflex.alt Idieresis.altEthNtildeOgraveOacute OcircumflexOtilde OdieresismultiplyOslashUgraveUacute Ucircumflex UdieresisYacuteThorn germandblsagraveaacute acircumflexatilde adieresisaringaeccedillaegraveeacute ecircumflex edieresisigraveiacute icircumflex idieresisethntildeograveoacute ocircumflexotilde odieresisdivideoslashugraveuacute ucircumflex udieresisyacutethorn ydieresisAmacronamacronAbreveabreveAogonekaogonekCacutecacute Ccircumflex ccircumflexCdotcdotCcaronccaronDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflexGbrevegbreveGdotgdot Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbar Itilde.altitilde Imacron.altimacron Ibreve.altibreve Iogonek.altiogonekIdotaccent.altdotlessiIJ.altij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotLslashlslashNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautOEoeRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexScedillascedillaScaronscaron Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflex YdieresisZacutezacute Zdotaccent zdotaccentZcaronzcaronlongsflorin Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccent circumflexcaronmacronbreve dotaccentringogonektilde hungarumlauttonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos.alt Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIota.altKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9Iotadieresis.altUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronpirhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055.alt afii10056.alt afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveendashemdash afii00208 underscoredbl quoteleft quoterightquotesinglbase quotereversed quotedblleft quotedblright quotedblbasedagger daggerdblbulletellipsis perthousandminutesecond guilsinglleftguilsinglright exclamdblfraction nsuperiorfranc afii08941pesetaEuro afii61248 afii61289 afii61352 trademarkOmega estimated oneeighth threeeighths fiveeighths seveneighths partialdiffDeltaproduct summationminusradicalinfinityintegral approxequalnotequal lessequal greaterequallozengeuniFB01uniFB02 cyrillicbrevedotlessjcaroncommaaccent commaaccentcommaaccentrotate zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperioruni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200BuniFEFFuniFFFCuniFFFDuni01F0uni02BCuni03D1uni03D2uni03D6uni1E3Euni1E3Funi1E00uni1E01uni1F4Duni02F3 dasiaoxiauniFB03uniFB04OhornohornUhornuhornuni0300uni0301uni0303hookdotbelowuni0400uni040Duni0450uni045Duni0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BF uni04C0.altuni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CE uni04CF.altuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7 uni1EC8.altuni1EC9 uni1ECA.altuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1uni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni20ABuni030Fcircumflexacutecombcircumflexgravecombcircumflexhookcombcircumflextildecombbreveacutecombbrevegravecomb brevehookcombbrevetildecombcyrillichookleftcyrillicbighookUCcyrillicbighookLCone.pnumzero.osone.ostwo.osthree.osfour.osfive.ossix.osseven.oseight.osnine.osffuni2120Tcedillatcedillag.altgcircumflex.alt gbreve.altgdot.altgcommaaccent.altIIgraveIacute Icircumflex IdieresisItildeImacronIbreveIogonek IdotaccentIJ IotatonosIota Iotadieresis afii10055 afii10056uni04C0uni04CFuni1EC8uni1ECA   46latnMOL ROM  nlatnMOL (ROM B      ligaligaligalnumlnumlnumloclloclonumonumonumpnumpnumpnumsalt saltsaltss01"ss01*ss012ss02:ss02@ss02Fss03Lss03Rss03Xtnum^tnumftnumn    &.6>FNV^Pz2HJJ.,ZgwEG      !$%IJ6 "(^IO]ILI5O4LI^V0R *H C0?1 0 +0a +7S0Q0, +7<<<Obsolete>>>0!0 +V DXT_)2]0z0b8%a&Z0  *H 0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0 070615000000Z 120614235959Z0\1 0 UUS10U VeriSign, Inc.1402U+VeriSign Time Stamping Services Signer - G200  *H 0ĵR`)J[/Kk5TX56^bMRQ4q{f*j 7٘tvJcEG.k NK+XJ,XB-uލǎlLgrIž`<cxi{-004+(0&0$+0http://ocsp.verisign.com0 U003U,0*0(&$"http://crl.verisign.com/tss-ca.crl0U% 0 +0U0U0010 UTSA1-20  *H PK$ $- 7 ,Za񑑳V@뒾89u6t:O7ʕBǠWdB5N3M'L8MxSݤ^ ⥾`߭(ǥKd[98"3/!?DA e$HDT\y>]r},CS}=*:Om ]^SWp`+nx'4[^I2300-GߍRFCmH 10  *H 01 0 UZA10U Western Cape10U Durbanville10 U Thawte10U Thawte Certification10UThawte Timestamping CA0 031204000000Z 131203235959Z0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0"0  *H 0 ʲ }uNgadڻ30X~k6xw~o< hlʽR-H=]_/kLR`@~ ?Ǵ߇_zj1.G 1s W-x43h/Š*Ë!fXWou<&]'x1"ijGC_^|}bM "Vͮv M٠h;004+(0&0$+0http://ocsp.verisign.com0U00AU:0806420http://crl.verisign.com/ThawteTimestampingCA.crl0U% 0 +0U0$U0010U TSA2048-1-530  *H JkXD1y+LͰXn)^ʓR G'/8ɓN"b?7!Op18UN$ҩ'NzaA*^ݻ+>W~ +;R8'?J00eeR&.Y)"\0  *H 0_1 0 UUS10U VeriSign, Inc.1705U .Class 3 Public Primary Certification Authority0 090521000000Z 190520235959Z01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0"0  *H 0 g`IoV|f^ q-!ќPL"5; .Z|=;%X{ ξ'tag'MjaXy'M4+G Df$fO8TrfujIh8y 0,`Hת809:|@T/ܨR>+!\ P4.M^%Ԍn|)]1ZՌgX5+!`x^{`W ]A cT`C!00U00pU i0g0e `HE0V0(+https://www.verisign.com/cps0*+0https://www.verisign.com/rpa0U0m+ a0_][0Y0W0U image/gif0!00+kπjH,{.0%#http://logo.verisign.com/vslogo.gif0U%0++04+(0&0$+0http://ocsp.verisign.com01U*0(0&$" http://crl.verisign.com/pca3.crl0)U"0 010UClass3CA2048-1-550Uk&pȡ?-50  *H ݔAaix0Ɛ<~B$s/DrPU nQj71ܥ-OM2NgUejzd8xEv1z`³]fvYI8VAwX00fgymPSo0  *H 01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0 100729000000Z 120808235959Z01 0 UUS10U Massachusetts10 UWoburn10U Monotype Imaging Inc.1>0<U 5Digital ID Class 3 - Microsoft Software Validation v210U Type Operations10UMonotype Imaging Inc.00  *H 0Di|U 25L3^ L*8ט@I "SOCʋVnH9c;$5}rGWyˊJ@p-5cįפ {uePd"}KXEMYLM00 U00U0DU=0;09753http://csc3-2009-2-crl.verisign.com/CSC3-2009-2.crl0DU =0;09 `HE0*0(+https://www.verisign.com/rpa0U% 0 +0u+i0g0$+0http://ocsp.verisign.com0?+03http://csc3-2009-2-aia.verisign.com/CSC3-2009-2.cer0U#0k&pȡ?-50 `HB0 +700  *H N"gA~™cjrb<8=_G_[KI  VD 5< D`E*oL;4gpZ9\Zl5|eKmIp=b۴A~}n"w6MZ S1+(RzkwD ]%,͊0>KyʦN $ 񺐶\<'M?B*P`z>G^^wEŕu uc~E%I ,]4@XdV^P #aez\U> 5`K-s6 Muu߸0{ *H  1l0h0g0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA8%a&Z0 +]0 *H  1  *H 0 *H  1 110505165509Z0# *H  1szlSÆR0  *H  33f @ [(1ASC X m RR1yL%P%dHVyJ7L-Hy9+PV HT-F#^FND5PV`9HHH -Rd1hdPh!F^`h`hjZ3PP=u/3J%PV%VVN-\F\V%%VDw5\H 1w=wBHRRf`j\-1sJH+\`?H1=1?`%fPV19#1sLS %1hddddF(`h`h`h`h`hy`hPJJJJJJ{JPVVVVV~k!X\VVVVVHRV\\\\%JJJ1hPV1hPV1hPV1hPV%VNVdVdVdVdVdVhhhh!\Bq F2F^FBF^FFoqV\\\\`hV`hV`hVhVjjmj[ZDwZDWZDwZDa353=35\\\\\\PHPP=1=1=19qJ{J`hRVZDw`%NTsPVF{d!d=!`hFP`hJ3P'Lqq^1&P`Vo?\{N`V{Vo?V\#V{FR`!VV\3DVsV;NV+'Pb{NVNPbd3}hZF(^?3s-dd5TX!`h1h3s'Lj o3b\RoJ7X\VoHhRVB%PV1V ^V1T39VqVVDwo%qhXPHPHPHPJJL%y9%w9o1o#JV %Vy1y3J3LRNof7m)7)%^1f A]{*3! Hf#boHHHHF--`%11)11`111=1)1/Vy`JV% `=Jb?\ 5- 1-hV3{UejFdV hX} L bT-oqq'`hV Bh VhV h=) hPhZV3V{}PN%%qXX`V-5TXoH?}Z3y1HhV1hPV31PP\ 3 1oVjV^F5J!Rj^VjFJJ{Jd_VX^VX^V5TXoHJ`hV`hV`hV\RT3sssj^Vbf  J%VXJVo 3H DHZbPhHV-3%1T`o?!JJJJJJJJJJJdVdVdVdVdbdVdVdVFhF}`hV`hV`hV`7`hV`hV`hVhVhVhVhVhV\\3{3{3{3{3{PPPNV-  3V919F^FND5-7B35%V%V%V%V%VXr 0HI~'2a7 # O_?M   " & 0 3 : < D p y  !!!! !"!&!.!^"""""""+"H"`"e% IJ(3b7 #P`>M   & 0 2 9 < D p t  !!!! !"!&!.!["""""""+"H"`"d%aIvhcb]gD Xz}} Bvt n%"iOS0L\pr`<&'()*+,-./0123456789:;<=>?@AIJ$%TUVWXY\]^_`abcdefhijklmnopqrstuvhijkFopqrstu45]^@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,F#F`F# F`ab# # pE` PXaYh:-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-@ YG!H U UHUXXXWT VT UTDTTT&4U3U3UQN PN ONDNTNN3UU3U?dMDLKF JF IF HH$HGF $F3U3U?_3U?oTS++KRK P[%S@QZUZ[XYBK2SX YKdSXBYss+stu+++s+s+++ss^st+++s+++++++s+++s+++++^uml5`#3Z D=/#<F/3$$$$X}|-Zy==$Z/ e  A  ] | L ) y%LjQ:x ayQ*:6l%VV3:ZMoI_t   * < Q !!!"!3!E!!!!!!!"/""""""#########$$$$$$$%%%(%%%%%%%&4&&&&&&'<'M'^'n'''''''''( ((-(>(J(R((((() ))()4)E)U)f)v))))))))*L******++++/+G+S+_+p++++++, ,,&,2,F,[,,,,,,- --(-v----. .././///?/K/W/h/x/////////0 00.0m0000111/1A1R1d1v11111111222&272G2r23V34 44+4<4G4R4}44455:5e555666J6R6g6|6666666777!7)7177777788"8G8O888999f9999: ::.:@:;;[;=F===>V>^>>?@??@@e@A$AAAAAAABBBSBBBBBC1CCCCD"D*DrDzDDDE0EEEFFVF^FfFnFvF~FFFFFG$GZGGHH`HHIGIIJ JbJJJK*KKKLLILLLLLMM-M5MMMN N@NNOOZOP P]PnPPQ3Q;QCQUQ]QRR&R7RGRzRRRRRS SS-S>SOSeS{SSSSSTTHTyTTU^UUVrVzVVVVVW5W}WXeXYYYZ-ZZZ[[[.[E[[\\B\X\\])]?]]]]]^^0^Z^z^^^_0_{__`c``````````````bbxbbcc_cccdd ddLdddeexeff&f/f8fbf{ffffg;gghPhi%inij)jkkhklpm mmmn9nno o2oDoPo\opEqqrkrs@ssst t=tnu`vvlvw'wwxFxxyy`yz-z9zEzz{%{{{||d||}1}n}~ ~c~w;6͂YJ& XCш`_gx̉܊4ΊKȋڋ1BTfwΌM_q}TgҐBd’aM'3DUgyӔ"4FXj|˕ו&8J\n̖'3DUgyӗ!3DUfxʘۘ 1BTevșٙ"V̛%W̜JpÝ3~)&Ǡ.>N_pʠ۠%:BT\nv~@  ?2/3993310!!7!!JixJhR)@   ZY ??+9/333310!!4632#"&3Tlgfimbcp[ee[Zeey@ ?3233210!!!))?))%'@Q        !      ?333?33399//39399933399339939999103!!#!#5!7#!!3!337#JIGHH JH I-yy{{Ph+,{@D**++ &&.-%     /    WY@WY+).,?99//3+3+9_^]]33333333933310%&'32654&&'.546753&#"#tgUO9qGwѨPA/tgѶmD XL;O)0!.:)/ul W^'&!+5#J-%o '3J@$(.""((5 4%1+ ?32???3233293332931032654&#"#"&54632%!32654&#"#"&54632R&&&%%&'%Ʒı+&&+!!+'%ǶısfdusfhmJsfudduhmHo(3e@6/5/& ) 5 4 ''1&1,S#O???93999/3333933929910!'#"&&5%&&5463267!3267'4&#"66ucZs\>EKQ@lZJ9VR'9+*?X9IJ=>II>|ytlüT *@   ??3939339910!!47'!o%7du-1-b=@  UYUY?+9?+9399333310!!>54&#"'>32!be^%JCEYqq{+Z)iuT.9BOMeW.dsV F\'N@'"  ()VY %%TY% TY ?+?+9/+99933939910!"&'32654&&##3 54&#"66321nvu`Tw>oZ\-YKty,."-H1/INK1_;/_;/VB)D+0:5m$D@" ""%& VYTYVY?+?+9/+999333310!"'3267##"&543 %"32654&miFVV 'LnR &AQFHA`YS 9H@"(^hRa^BYV{ (@ ZY ZY ?+?+93331074632#"&4632#"&Vmhcjm`crngcjlafo\dd\Zedq[dd[Zff9{"@ ZY /?+993310!674632#"&aO; @khdklcfm+Wg[deZZfeH;'@=/333233993310%5; lHf?;@  /32993310!!H / 7H;+@=/333333993310%Hl )?%B@  ' &##ZY# YY?+?+9/939393331054676654&#"6!24632#"&'PfQGL=ʋq|i5khdko`cpVb@3R5*1kĩyOD?+3\de[[dcRf5Aa@.;;66 )== ""..BC 99(% ?  +2%+/3?399//33933999339939393910#"&'##"&54663232654#"!2$7! 4$3232677&#"anO$k|QQ14At |EgI@   NYNY?+?+993333310!'5' ! !2654&# em\]h'eEqmX K@%   QYPY ?3?+9/+99333393910!! !3254##)uT@dJNP)ZZ&4@!'(!OY NY?+?+9993310#"&'32654&&'.54$!2&#"ZkqfXR!IE&y͕MFYŽu)3`:A=0-.GAzli^6(+DZU3$@ NY??+39310!!!!!#uTsCy%@  NY?+?3993310! !3265ytqym2yX 9@  @ L??39+333393310!!!667!/#>*JaF<1Z@   @ L@ L   ?3?3399++33333933333310!!&&'!!67!6!- + $#-}6 Cn} B :}}(PA#f^s)ׅVo H@    @ L L  ?3?39++323393310!!!!!7A817<P5@   @ L??39+33339310!!!r/= ;@ OYOY?+9?+999333310!!5!!!yT?|uh"@  %?3?2339310!!#3h 7'@ ??333310!`!!/#"@  %?3?23393103#5!!/ Z;%N,@ /39/32333933103!||:A{/33310!5!! @  /]910&$'5!E^4;,JFBJy!M@(   "# IY MY IY??+9?9/++9993339310!'##"&5467754#"6!22655jKOj|q.GeZbH TfZHXh!>@   "#  GYGY?+?+99??993333102#"&&'#!!366"3265;?bM3>90RLLVEJ08o?XNrz7yV*@ GYGY?+?+993910 !2&&#"3276ŮsGxA_hɬ,6V%ddV!@@  "# GYGY?+?+99??99339310"&5323&5!!'#26754&#"yc_;Te(^MV\MUV 8LZ/쏣5v{VP@)     LY  JYIY?+?+9/_^]+999339910 ! !3267"!&&" Eqge\ğE]PY-3_l'//$W]Rb-B@!FY FY ??+?3+39933339310#!#5754632&#"3;yN\THE-)HH`7>(5>@E/) (";6@6")""?@(33GY8MY %%%=MY%,LY?+?+9/9/9++9?3933393399393310#"'33 !"$547&&5467&&5463232654&##"32654#" ?%^L}4M:\Xe$5hWha?W{y8=uym9:M桗;b05Q8'w0;G8-%;\VV3@  GY ?3??+999333310!4#"!!36632P`[y8fj䡻ݖXH5 $@  HY???+933310!!!4632#"yobmmdmXVXV5 -@ HY GY?+??+9333310"&'325!4632#"j0}%@8w۶bmmd 1w7sXVXVF9@   ??3933?333393331067!!!!G2wAw}q?@ua@ ??9310!!!y}#I@$ ##$%  GY ?33??3+3939939332310!4&#"!4&#"!!3663236632?DZTx3 =@ !" GY GY?+???+9999333310"&'#!!3632"32654&/VCy>7mVENTKDD9Jw9Yb{yV>@     GYGY?+?+99??99333310"3237!!47#26554&#"ݿhRy `,YQR^R88"/n/ݔ%@   ?29??9933102&#"!!36633.#0Uty#=1 unmZow$@@! %&$  JY IY?+?+93399333310#"&'3254&'&&54632&&#"~a[UG|pjjN7`Cwu7\$9(4:/D@}1/#1/)?1^5oP=@    FY@ GY?+?3+399333391027#"&5#577!!!OnO`Ůe!'"ӟ{Gnm0@  GY??+?399933310!'##"&5!3265!11v?HeVNSorm6@   L?2+?3333393310!!347!PPmb!%4=/mY@&     L  L ?33+3?333+3333933333310!''#!!36!3667!V1se\,4i`. dyImM\1{LE m J@   L@ L  ?3?399++993333339910!!!!wqDCB+>XmU@   @ L GY ?2?+33+9333333939310!367!#"'32667@VNR5D4N:!mv3HE4K3 (IS1m =@  FYFY?+9?+933399310!!5!!!VFy?c+=5#6@#$ %#% ?3?3933339933391026554663"&&554&#=sbY?&qp*FNapYQ?,&qy vl',@PZB@ ??9310!! .B9"4@  $#" %?3?39333299333910"#6654675&&54&&'239oblRpq'=ZbsZP@34lv yq'+?QYH=@    /339910"6323267#"&'&1n{hEzYk2}8iG}Tyl$7@9m"7R)@  ZY %??+9/333310!!#"&54632J3PkhfilcendN[fe\ZdeHB@"  VYVY??99//99++99393332103&&#"327#5&5475ϫsGxA_hɬ˚ K%dR"))fV@+  WY UYTY?+?+99/3+39939333992102&#"!!!!>55#3546nh:7XQ9R7BGj`M9/;L8bv`'<@"  "() %/32993291047'76327'#"''7&%32654&#")}{TX[Vx))yxYXdLw{)Q6:TT:8OYWw{)-}Lf^Rww'%swR\8OM::OQq@8   XY XY  ??39/3+329+333339339933399310!3#3#!5#535#53!X8uuB$@ ??99//933310!!!!  j),6Q@(- &2 7800(55($MYMY?+?+993333993333333310467&54632&&#"#"'53254&'.%654&'jVN޸bI7l[S@T}̔OE>l@#Xo)Tb:#@z/fV(.J+H"GaMy<^V,@`*=0?bvo3P:/<9V) #  @    /3339933104632#"&%4632#"&\NO]]ON\\PP]]PQ[KSUIGURJKSVHGUS\;%5B@ &.&.67   *"2?3?399//339933993310"327#"&54632&4$32#"$732$54$#"wQ[W[x~Ц\j|^ZäzvrD@N8^Zƞ훝1$A@! !!%&" ?32/9339993939310'#"&5467754&#"'6632%32655;-0qRm}X339e5Ll[P$"2~p.RW_~?9%B@ !!  &' # !?33?339/399933939910#"'53254&##532654&#"'632JXa^ij|utAFhPGD*22X5u’Nm hWxFQC)%)+"(ss! @  /]9105667!SPH`&@-m;@    GY ??+??3999933333103265!!'##"&'!!CO]S5"qB8D ysrXT(+ZYf+@  /3?39/9939310####"&53!6Gy33V @   ZY/+93104632#"&Vmhcjm`dq\dd\Zgf)@   ?3/939393910#"'53254&'73|MS@4RBH `Jm/!3'k9Jh *@    ??3939339910!467'3h -WTJd#0J1 @  ?32993310#"&546323254#"904ccdPͪΩWULP)/ 8@     /39/3993233323310%%%%)}}1\[\['<'{ ?55%'t7'/{?5SN'</&u ?55% &@@!'($$ZY$ YY%?+?+9/9393933310327!"&54676655#"&54632Pf9BK>̋nd:^jieilbendVb@$<3'*0jĨxQ@B,3_]dd]Zdcs&$CR&+5s&$v R&+5s&$KR&+5&$RR&+5u&$jR %&+55L&$P}@ %>%%>+55/m@9  NY OY    OYNY?+??+399//++339933333993910!!!!!!!!!!#/KdFt'J^aThpy-&QRb&+5V!&RC"&+5V!&Rv"&+5V!&RK#&&+5V-&RR7!&+5V#&Rj .&+55H=*@  /32233933310!4632#"&4632#"&HiOMKRWFGUOMKRWFGUL RXWSPZX^RXWSPZXV#9@  $%!!JYJY?+?+9999339910%&!27!"''&#"4'326:}mGC}hT !$.ri 1rgq*3'oih"kCc0 V-F!&XC&+5!&Xv&+5!&XKB"&+5#&Xj1 *&+55!&\v &+5">@ #$   GY GY?+?+99??993333106632#"'#!!"32654&+dryUDNTP?BNX<\?jw{{#&\j ,&+55&$MR&+5Jy&DM+%&+5&$NR&+5JyL&DN/%&+5&$QyJ&DQhs&&vR!&+5VZ!&Fv&+5hs&&KR%&+5V1!&FK#&+5h&&OR &+5V5&FO3&+5hs&&LR&+5V;!&FL &+5ws&'LoR&+5V&G8wV9'W@,% ()#GYLY GY?+?99//993+3+?993333339210"5323&&55#535!3#!'#26754&#"ײj Xi TBWHR!/I q5bdmtgv&(MR&+5V&HM&+5&(NR&+5VL&HN&+5j&(O5&+5V5&HOH$&+5&(QV&HQs&(LR&+5V!&HL!&+5h`s&*KR(&+5!&JKL&+5h`&*NR&+5L&JN B&+5h`&*OR#&+55&JOG&+5h;`&*9#!&J:B&+5s&+KR&+5&KKB l >+5BQ@(   NY  ?3?399//33333+993333333333105!!5!3#!!!#55!s3u3T+O@(   GY LY ??399//93+3+99333333910#535!3#36632!4#"! 7gv`Zy)%*VJ㢼u j&,RpR&+5-&R &+5F?&,MgR&+5&M&+52[&,NaR&+5L&N&+5F?&,Q^ 5&LQdF?&,OsR&+5m@ ??9310!!!ymF5&,-q5&LMw^5:s&-K R&+5 !&7K&+5;&.9;F&N9Fm8@  ?3?39333333933310!!!3667!Gw <*}bmu^6<\s&/vR&+5o#&Ovg  l >+5;\&/9hq;&O9@u&/8?5&O8=&/O`t ! >+5)&OO 8 >+5 3@    OY?+?939999333103'7!7!fӔ39oju *@   ??93999333107!'%!qrx|EC5s&1vyR&+5!&Qv&+5;&19#;&Q9s&1LR&+5!&QLJ&+5''QN<@   PY?+?33?399993939910"'3267#!!3&5!_&S3ws/ =`3[[BE@#  GYGY?+?33??+9993333910"&'3254&#"!!36632=-z,D1qFAcXy'12q 1^amOQüh&2MR&+5V&RM+&+5h&2NR&+5VL&RN%&+5hs&2S^R )&+55V!&RS ,&+55hF"_@2 #$OY  OY  NY NYNY?+?+?+?+9/+993933339310!!# !2!!!!!"327&&F"9^BCD'L}L"v cg G+V'-r@;*+ ""++./*LY**(JY  %FY IYFY?+3+?+99?+9/+9993939999310"'# !2632!32732654&#"%"!&&+╛Htª\L\[KL\YMT\>3ZqV/$MRbs&5vR&+5!&Uv/&+5;&59m;&U9<s&5L=R&+5[!&UL&+5ZZs&6vR0&+5w!&VvV.&+5ZZs&6KR4&+5W!&VK2&+5ZZ&6zw&VzdZZs&6LR,&+5a!&VL*&+53;&79P5;oP&W93s&7LR &+5=F(&W8 t>+53A@!     NY NY?+3?9/3+393333310!!!3#!#Tuh C#E5Pa@1     FY LY GY?+?39/3+39+39933399333910267#"&55#535#577!!!!!(JiŮtte57! !?G{ۘ-?/y&8RR&+5-&XRX&+5y&8MR&+5&XMJ&+5y&8NR&+5L&XNH&+5y!&8PR &+55&XPy &+55}s&8SR %&+55!&XS (&+55y&8QFm&XQ 1s&:KR*&+5/!&ZK3*&+5Ps&<KBR&+5!&\K$&+5Pu&<j-R &+55=s&=vqR&+51!&]vL&+5=&=OR&+515&]O&+5=s&=LR&+51!&]L&+5b@ IY??+39310!!46632&&#"yTK&H.<1yS6 ATL@'! !FYFY GY?+?+?9?3+39333339310!#"&'325#5754632&#"!Ƕ*,>1^ǦLP;50Hd-m`%ս6BM$01q@7$$ ++%% 3 2#(.@NY ..1?3?9/329/+29333393333339399103!!!3&54632'&&'667!!4&#"326' PN+JN xwu@8 !h$h"O1##1**#1T7*j)6t!G68V&e&..&%//Jy!+7C|@@  (""2,,8>2> >ED+&55;@/AA& IY MY IY??+9?9/++9/9/329933293333910!'##"&546%754#"6!226555667!#"&546324&#"326jKO|q.GeZ 2aјyxxv1##1**#1bHñTfZHXh-n% iDorts&..&%///s&vR&+5J%!&v@&+5hs&vRR,&+5V!&v-&+5Z;Z&69 w;&V9/! @   /2]293310&'!5667!1Tu}EE&^0fk+A:/!@    /3]293310!&&'5!67/B,w'LE}uT!BA+5Vy'(T 2>+5T'+T 2>+5r',3T 2>+5m&2wT 2 >+5'<T  2 >+5&vT $2$$>+5R&U. (&+555$%m@OY??+99310!!ms!((==+h I@'  PY   OY OY?+?+9/_^]+99339910! ! 32654&#"!!m\]hrdqm>F?,. *@  ?3?3333393310!!!!&&'FD-)JL03F01PH ?@   OY  NY OY?+?+9/+99339910!!!!!RZ`Bh2L#@ NY?3?+993310!!!!!Lrmss3JG@#     OY NY?+3?+39399333393103!!"'63!JPNDm3) 3 37P<L"+P@(' +,-**PY "$$PY??9/93+33+3993933333210!32##!5#"$&546$3332654&##!#"33} 吙%} ~~vu|y{˴|r|ww;qB@    NY??339/3+39939333310!!# !33!3265!!#w%p}r~'* ~r{p#1- Q@(   !" NY  NY?3+3?+93993333999910"!!&5!2!!6654&/cr`uEE}ZxcŧHDH%N干OmKƣ&^u&,jGR !&+55Pu&<jFR &+55V-\&~Tq3&+5?'\&T/&+5\&T&+5R\&TO&+5&UT /&+555V-}*E@#) ##+,  &GYGYGY?+3+?+99?99333310"32367!327#"&'#26754&#"t/)H'-R o+nKYSV\PR54RVi/ipy NY/w )+Z@-$ ))   ,-%$%$FY%% GY FY?+?+9/+9?993339399102#"&'!4$"32654&##32654&`4y+UOs.`ola9&DJTҺ!4kl/aaO]#\NNTm<@  ??33333333939310!47!367!d4-dt0!F}^+7Qa<oV'$Y@, %&" ""FY FY?+?+93993399339339910&5463 &#"!"$54'326ԊyMݤKaZLO[ӜsjA @gdV՘ugWho?'&b@3##  '(!& &KY && &&!IYFY?+?+9/_^]+9999939399310#"327# $54675&&54$32&#"3JZf/m؆~^oo|ofu%'aX.!h [$2GK-'V%?@!  ! " FY?+99?339939233104%#!!!6654&&'.V K[mpAW&\hE"uUQ&}G$$"l2@  GY ????+999333104#"!!36632RcXy'12sqɞmPP3V+ ?@ IY IY  IY?+?+9/+99339910! ! 267!"!&&%XUR\VQ[S jvenRm @   GY ?+?993103267#"&5 u7^<mf?Fm?!#Q@) #%#$GY GY ??+93?+3333393993101'&&#"6632327#"&''&'#]PCD(t!I!5:5%&-|;F$!)RR3 PZ_( jVwG1mwm *@   ?2?3329393310!36!! UGmGGfV%-_@/  (""/.**.FY.%"  FY?+3?9/+93393233933939104675&5467##!# 33#"!6654&'&&Vqc(;Y7{ry0tg7pAWKtϾ9.Tv"޷I>Xe9<0@G$,0.VR mB@!   FYGY?+??+339939933310267#"&5#!#57!#q"W"3Sy-2 )J}A39/@   FY GY?+??+9933310#"&'#!!2%"32654&L3y( Ӧ^+UIM5$l:{%&V) -@ !"!" GY?+?3393310!2&&#"!6654&&'.V-oG:Z_5xjpAW+jUJ-5^,X\?}G$!%%V=m5@   FYGY?+?+399333910 5!!!3254&&'#"K]?권aV$2o"9(݄y"qz@\PEm5@  FY GY ?+?+3939310327#"&5!57!40Or̯!JA48+?զ}m%@  GY?+?3993310 !32654!OScUM* gr]$Vo#I@% !$%FY!FY??3+3?+99393333910$54746324&#"66ox#ALe`HA1%iv))VvqF~EU]l@6   GYGY?+??+939?933333933393393102!327#"&''!&#"6>)Z+T64l1IJw0Y=Hij{9n)9{%'E@"  GY ??3+3?3?99393339310665!!$!TiZx7(}f{$$+@x bm)A@  ' '*+# GY?3+39?39/993939310"&'##"47!3265!32654'!* &0;}AOL3t36IGU# "CDS:%9HBHMLSLs;9 6@  NY??+3?399339310!!!!!!N3Drju-@  NY??39/+9933310!!#"&5!327!urV^Xͺjk\Dj 5@   NY?+3?3399393310!!!!!!!mlrr9 JD@!    NY?+33?33?99339393103!!!!!!!ml3rr3 A@!  PY NY PY?+?+9/+99393310!!!!3 3254##+92AT53sCj A@  PY PY?+?39/+?993339310!!!3 3254##!!P2Ayrj} 2@ PY PY?+?9/+9933310!!!3 3254##P2AyhRL@&  OY  NY NY?+?+9/9+999333910"663 ! '3267!!&&)HRswNmᆖ H 2(5;.{~SL\~>1I@&  NY NY  NY?+??9/+?+9939332310! #!!3! 3265#"1=sN+DOu|yh5X P@(  QYPY ?3?+9/9+33939339310!&&5!!!#"33@ovTuT_lgnJ>~JwLK[\JyDX'#V@+  !!$% IY FYGY?+?+9/93+99933339310466$%36632! 24#"X=:%tpQ'#hR:j͊I +*GkVF^pN]0mN@'   LY KY  KY ?+?+9/+99933393910!!!24&##324##326tezkHDՐl>=Hcmm5.Y.m@FY??+99310!!=ymm`m M@'   FY # FY?+33?3?+333393939310!!!367!3!#dWw>;``Ô'VHmR@'      ?33?339333333223333393333310!!!!!!#}`VVH%%??RH/%X@,$ &'%$%$KY%% FY IY ?+?+9/9+9999339399102654#"6632!"&'32654&##5ufoypo^x}p]j_|(,KG2$[ p /+X016(Jm.@     ?3?39999339910!!47! =Nm83PmJV&6&+5qm 6@  ?3?39339333232310!!!!XA\ym?mm1@  FY GY??+?+9939310!!##"'32667!y!dhI!7-8+#J#]@Xm<@       ?33?3993993393310!!!&''!!677!X Qu;AXX A'm NFjKmL@/ۆPm 3@   FY   ?3?39/+99333310!!!!!6yymhNmVRm#@ FY?3?+993310!!!yymJmSVF1m$@ FY??+39310!!!!yqJJ#m\VN@'   !  FY FY??3+3?3+3?993933333210!$5%!4&'6680s%BAb^9`b5+#Yu'or m[`m 6@   FY#??+3?399339310!!!!!3k`mJVm-@  FY  ??39/+9933310327!!#"&5kry¥mru2Tm 3@  FY?+3?3399393210!!!!!!!:}5mJJ`mD@!    FY#??+33?3399339393103!!!!!!!^:}5#=mJJ1sm K@(  KY FYKY?+?+9/_^]+99393310!!!32!4&##32%syBN=AJ#hI~ôf;4fmI@'   KY   KY ??+?39/_^]+993339310!!!!3 !!4&##32fy%'%TBM>Bmhôm;4bm <@   KY   KY ?+?9/_^]+99333103 !!4&##32%'%TBM>Bmhôm;43G@$   IY  LY IY?+?9/+9+999339210"&'3267!5!&&#"'6632tQgv}iTV#&Hj 1&+55'Y@.  ()$GYLY $$ GY?+??99//93+3+993333393910#"&'3254#"!#535!3#366321'BդôJ#]@h;4m\@1   FYKY   KY?+??39/_^]+3/+993339333103 !!#!!3!4&##32%'%yBM>BդôNmh;4q!&v&+5V&\6'&+5`m 4@  # FY?+3?3?99393210!!!!!!!pgqmJ`#@ OY??+993310!!!\Zus:#@ FY??+993310!!!!!y%V m&1s&:CTR&&+5/!&ZC&&+51s&:vVR&&+5/!&Zv&&+51u&:jR 2&+55/#&Zj9 2&+55Ps&<CR&+5!&\Cr &+5J/33310!JlJ/33310!JhL/33310!Lh1!@ ?39/3233310!5!5!5!1Zm?9310'7!#dMCm%m?9310!\UD= 9+m?9310!&7yDQ`òm @    ?32993310'7!!'7!!dMCdMCm%m @     ?32993310!!!\UDT]SD= = 9+@    /2/3993310!67!!67aO; TaO; +WgWgo N@%     ??9/3339933339333993310%!!%;<+<J;?so_o}@>           ??99//3339933333993333339333933333310%%!'7!%%@;;C33C;G;@1XwvJm @   ?9/393104632#"&JR쮺0Vf #/@  $% ZY! ?33+3393331074632#"&%4632#"&%4632#"&Vmhcjm`crPmhcjm`crPmhcjm`cr\dd\Zed[\dd\Zed[\dd\Zed%  '3>Jd@1(.""((EE499??L K<%%H16B+ ?32???33322333293332332931032654&#"#"&54632%!32654&#"#"&5463232654&#"#"&54632R&&&%%&'%Ʒı+&&+!!+'%ǶılL+!!++!ɴısfdusfhmJsfudduhmudduu`y yJP/"@/9/9333210J{LLP/"@/9/9323310%%}1\[RT'RNm@ ??33210!mJoD+@    ?3929/99333104&#"!3366327%-9/#%_Qq}F<]hR41{LO@(   XYTY TY ??+99//+3+399333339910!!!#53!!!!+?yf$x@?  !%&  XYXY @ UYTY?+?+39/3_^]2+3+39939333339333102&#"!!!!!!667#535#53546Z[po3:@@)vFP+%7B?5Xv-;QBX9j"*_@0  ' #+,#TY *TY?3??+99//3333+9933399333910267#"&55#573!!!#!! 32654##9e 6Kçi2-*-ho8#}{19Y[W7'@L  %%% ()XY{I @ XY ##UY#UY?+?+9/33+3_^]+]2+393929993310"!!5!!327#"$'#53'57#53632&=pw R!yf/3CwxkY,ͤ77+ L3)D,[@1*&&! -. (@`$??2]q2?32993293933910!#"&546323254#"%"&54632&#"3279+4G..XX\|n@SHio][NJέͪQ]ê:'+37J#F@ "  $%"" /3/93393999333333310%265!#"&555746324&#"64(+ٰ.\%& g[;//JɺWF^ED7h{K{& D"1^:Fծ%%[f))/!%me[w! :@    NY?3?+939933933107!!!&! R=J8PD"@ NY/3?+993310!!!grP#fP B@   NY NY/+9?+9993333931055!!!8P dHL=X/39910!HL #6@  /3/9/33339393310##!!\#bm31 +J@"#) ) ,- !&& -/39/9/3393999933933310#"'#"&54632663227&#"%"32654&3U]{?Ek;X@=?@+36E?DG*24^^CJƑBKdd:,-5b-<>+*8m @  /2/33393102&#"#"'326546}n1**ˀjn40&71/808=131ӿH&=y'aaA>+5H?'Z@-       /3333322323333399392910'7#!7!!73!!-j;;Vom?Vff iH=&{+?5H=&!{+?5FX B@    ??93339933933333103#FŽ> !!P-m5'LNI-\'ONI`9V @  /22933310"&'!327!JFLSK)ٺbXm @  GY?+?93310"&'325!j0}%@8w 1w7%@  ?]931067!#%+c#r81;@  ?]9/9310667!#1cGaX8?!@ /]9310!53# s1)3  @   !?3?399331032654&#"#"&54632H$,+&&+,$sstpJ 8@    ??39/33339933333310#!5!5!3!547}^'}p(fՋ+EBd!`;D@    !?3?39/39939939399102#"'53254#"'!!6f217#&H2"*kf+b13 #@@  $%!!?3?39/]3933993399102654&#"&#"36632#"&5!2/'(#0/.U6Ixw WHp|GF58027#0E ^i*,Ѷ =J(@ ??399939310!5!VQJ׸L)3!-F@!%+%+  ./ (( !"?2?393939933993399102#"&54667&5463254&'"6654&=P^Rˣ5L}-63l2Abk)'&,"+({i;a2&jLx4F2%Vgx}*.P%."!+)"/3 "8@" #$ !?3?39/]3999399310"32654&3267##"&54632!"'/'(#0/.3ljd WHp|!.58027#0E#fa*,ѶJ #'+/37;?CGS[kt| @@<0A=1 NTcpp``llzggvvkkHHXXT E)% D($  }}kduullvvkVKKkk\ ZQQt\\ -  $1'2D=G>(A+B BA>=21 , 84 95!/333333333/3339333333333333339/333/39/3/339/393/399333333333933939332933333333333310!#%5!#533!5353!5!!5!5!#3#35!#35!35!#35#3#3#"&546323254#"%32##32654&##32654#"'53253J//lnlJllll/nnwnnnnll~smp/+;0m^{A/#)/;J1%[_4(V}i0oo/mmmmmmoo;mmJoooo/yhIaCS1B D6QYb" "+%J fVr_cV*X@)%  +, (("""//99//3333/9933999939333210 54676654&#"63232654&#"TX,AgIXPRl?>1HT;GFBIHCHEVW/2A1R~X11P:/5K6DpJ;?HI>@IH !&7L&+5%m '-5j@6+((11.33$$-67+. .FY  GY  ((1FY(FY?+?+99//+3+399339939939310! &574&#"'63232655'&$&54663 3&&#"h*.gbU_narא1+oZZ.c&rbR,+,cK|ِo_"\Sk\B@   PY?+??933333339331076632&#"!!:ygW*",Nzt3ry#?/=Fm-\@-##""++   /."" FY(GY?2+39?+339/333993939310"47#57!##"&'#326655!32654'3F3|. 2@O17u51OB5  }ݺynwzk^1Nr1dwqq[-uou&0vT&+5}!&Pv-&+5&$[Jy&D[!'\Q2?V @  /39/39310#"&546324&#"326Vwxyt/%#/(*#1rtrq%//%%//\^;3@  ?2]93993339104%#"&67!#\FT>GOHDTe/34g  @+5S$y-5&I'INL-&I'INOhS@)     NY@ NY?+?+993993393993310! ! 665!!2654&# p]i'w)''omJzF9XV"S@)  #$  GY@ GY?+?+993993393993310! !2665!32654&#"+tK17yWo%$M[XNM[ZL9>3CDoos;@    @NY?+?399399332310665!# 5!3265yADy&y͠d}|n!js!uy"D@! "" "#$"!@ GY?+?3993?993332310!'##"&5!3265!665!21s?HbW17yJtoORormpJ<!CU !vMe-Rjj /2910#'6654&#"5632jSV B.(0<]Nn/+%"xF!} /104632#"&FblmdieXVXVVs&(CR&+5%s&CTR&+5V!&HC%&+5J!&C%&+5h3X@+#1#,,))11  45**  NY.&&NY ?3+39?3+39/99393939910"663 #"&'#"$5!2&#"3267!32654&'aY?V&AЈOUƗB'QL?kF5>O__OeNy@3F(dBm^@-   ?3?3933993333939339993310#!!367!36!!'&y .l}(oPw K:G;qmt2@P<:m;PV@.   KYKY KY?+?39/_^]++3993333339105!!!3 !!#4&##326y!MWIWmm561m!`@1 "# NY NYNY?+??9/3+39?+9993393339910 !!3267# #!!3!2&q9BYƟzˈ"qs}7${*21'=+*5:jl@9   IY IY  IY?+??9/_^]+393?+9993393339910 #!!36$!2&#"!!3279y"qUO p_ONm`TEPMaO\S L@%    QY  ?33?39/+3333393333999910#!#!!!!bRRij++JNhm U@+      KY   ?33?39/+33333933999910!#!#!3#>=nh muum  X|@B  QY NY SY  ?333??+9///++393323939399999910#!#!!!!!!!!RQhsk++TJNhmx@=     KY FY ?333??399//++3339339393333399999910!#!#!!!!!3#=>soi muuNmh c@0  QY ?33?+939/3933333993933339910!!&&'!!>75/{hy`3o{7M0.G?{o6ZplIPZ;TrheŏSmf@3 LY  MY ?33?9/3+3+939333993933339910!&'!"!75!s,tS'LI)TmQĞm3B`*L m #@D"!# ##%$%#" " "QY NY ?333??99//+33+9393393399929333399910!&&'!!67!!!!5!hzb1n{7M0.G?{o&s5u{PY;Trhe;Tpm @F   "!" LY  MYFY ?333??99//++3+9393393399929333399910!&'!"!67#!!!5!s+uT'LJ)Tm sŝm3B`#/Nmh-H@J.2( 88 DBB@@FF F?= =(( JI<3:@:PY 3232OY33@DD F@%QY%,?3?+?33_^]29|/9/+9+99339333333393102&#"32632&#"&54676654&##326654#"667&'5!66a*53Y.}g:Ed8B_&߿t<ǗYoSg_m OK*s;#-# "ŢGOIJ@44nf9CONuY/sK@N5+:: GEECCII IB@ +1M@++L?=6I=IY6565KY66IGG @CI'IY'-IY?+?+?33_^]29|/9/+9+93333399933333339102&#"32632&&#"#"&54676654&##532654&#"667&'5366R9"D%Hqro^xmPH3ejdaad8@     NY?+?3?33333933102&#"!!667>9'&>59/-/\(_BG:9:>K6@ GY ?3??+3333393310!!!347>32&#"3}P q0Xx`)d#(*).mb!%4=^:,4s&vR ,&+55!&v .&+55h A&2\`V &R\hH3'[@.&&  ""  ()$"&&NY@NY?3+33?3+33933333933310#"&'$%6632632665'#"'H!s$|IFx&=33=&L``(ϚEMggNVF+W@+$ *  " " ,-'$**FY@ FY ?3+33?3+3399339933333310#"&'&54766326632654'#"&'F J86J  L84L _ K94L ``K85K _9 6AB5$+% 6@B4$E6AC4HH6AB3JhJ[@E39H9-RKK  VNVV&BB??-HH-\]ONN0@@)0606NY0&)E<)LMBĽ;7BCdW[_"92>&/&F5>O__OeNy@3F(d" Rxf2. :9Df)):O{@=FLMBDffffAF5>O__OeNy@3F(d"  ,@@**)!! %%&&.-*"   %*?3?32222/933993333933333939339993310#'##'##'5#!!367!36!!'&RF11F11FP .l}(kLw K:Gffff;qmt32#4&#"##5N}{D1/%?<}&.&=195 o"@  /393929104632"&_[WcB$A2RgD99".go$@  /39393910#56654&'&54632:8#CdVVexg399Db% (6DR`n@JP4,H,,dl:&B&&^ l^VlVope^WkhSaahIA;O7EE>LLZ-%3))"00ZZhh  /32/329/39/3332229/3332223322299932932932102#&&#"#662#&&#"#662#&&#"#66!2#&&#"#662#&&#"#66!2#&&#"#662#&&#"#66!2#&&#"#66js3Gwwdjs3G<=wis3G9?vhs3G9@wis3G;=vhs3G<>wjr3G<>wjs3F<>wr\"AYur\"! Yuq^!!#Yvp_!!#Zuq^"! Yvp_"! Zuq]"! Ztq]#! Yu%y'07@`@314)-!%8<<%-4AB $259=(,,=5$ /3/3933333393333333310#6736673#&'5&&'5'76'6677'&&&'7f=(5I2SU݁ZBOӋ}24},=Hl[kQ}5c/*K1QW݁GAӋI='5F$2"|&O~/+T|}TAK9` [@.   !" NY  ?222??+99?99333923933310!3!!!#4#!"&'!3267!`G;L EJUMOL)dd+^\\^`LV[@.    @  JY  #??+??3992299333923933310!!!#47!%"&'!327! =NoFLSK)m8P3PmlbXP@)  PYSY  PY?+?99//3+3+99333333910!!#35!!!3 3254##'3>2@P<:R@*   KYKYKY??+99//3+3+993333339105!!!3 !!#4&##326x!ғNMWHXZsZ561e@4     QYQY??9/++933993399333939310##!! 3'7654##?WuKc_\/hm ߎ?Ŝ,<&P@*$  $ '($"$GY   FY?+???9+993993333910"&'#!!3632"'7654&{7\Ey>7rZNZ^WW`}[U;Hw9YH tǁE/m =@   OY OY?+?9/3+39933339103!!!!!#fssC3m =@   FY FY?+?9/3+39933339103!!!!!#+\yݨ5F@$   NYNYOY??+9/+?+99333910!!!!632#"&'3265!"+sG2dk|Y+ܔD#95mF@$ FYFYFY?+??+9/+993392910%#"'32654&#"!!!632zJqlekp8'ysWEf/+~om9o@7    NY ?33??+?3933333333393339333339310!!!!!#!!V}R JPPL<<FH`mm@6      FY  #??+?3?33933333333393339333339310!!!!#!!!#}`!VH%%=??RX&H/&j9K@%    NY??+??3933993333339310!!#!!!JNs=D<F`mK@%     FY#??+??3933993333339310!!!#!!X!\ym=?m^@.       ?3?939339933339339333910!!#!!73!7qsqdH<IFm`@/    ?3?93993399333393339333103!!#'!!j7\yX #qlmX@+   SY   ?3?39339/3+333339333333910!!!#35!3#67!Bus[33/F';qV@*       LY??9/3+3?399//333339333333310!3#!!!#53XB\y%?3bF@"    NY?3?+393333339933310!!!!!67!ZBus[34/FsC;q1m N@&   FY ??3?+99//333339933310!!!!!XB\yH%?J#9F@$     NY   NY??+??39/+9933393310!!!!!!!!35sDT`mF@$   FY  FY #??+??39/+9933393310!!3!!!!6ymh=Nm A@!   NY NY ?3??+9/+993393310!!!!!!!!s5sTm A@!   FY  FY  ?3??+9/+993393310!!!!!!yy6mNmh5 N@( !"NYNY NY ?+?3?+9/+993933310632#"&'32654&#"!!!!L D1]fwuSrms+ݖD#%s5mmN@( !FY FY FY?3?+9/+?+9939339310!!!!!632#"'32654&#"yyTHx%g.lekp:$Jm/~ohP-7q@9 . 663.3%((.. 8960+0QY++NY PY #NY?++9?+9/+999339992933910327#"'#"$5!2&#"327&&546324#"6!yiPOIx:Ԙfۜ:/K/`XPs{s51DV%1 'e}U o/K{;^ӍJL?r@_VN'2q@9. ++(.(""..34+1%1JY%% FYJY  IY ?+9/+?+9/+99933999293391027#"'#"!2&&#"3&&546326654&#"=A7I@Rqvl  m]KYY`V!P%'-&"NV<!P601.<*["^:*.h&&)V&F39 6@  NYNY??+?+3939310!!!!!!#TDsC1`m 6@   FY FY#??+?+3939310!3!!!!qJ=J#P<m0@   ?3?322333393310%!347!!R Ryib!%;6P^@.   NY  ??39/3939+33333933339910!!!!5!!5!GrGDmV@*   FY?2+3?3933?33339333399103!5!347!!!!5!w7R R8y#Jv!$:6#97[@-       NY??+??9393933333333999310!!#!!!VA81D7< `fmY@,     FY  #?3??+9399?33333333999310!!!!#!w ̿CB+>=X39dL@&    NY NY??+3?3+39939393910!!!!!!!3DrsC1`mJ@%    FY FY  #??+3?3+39939393910!!!3!!!!JJ=J#o9A@!  NY NY??+?39/+993393310!!!#"&5!327!y3V^DXͺjk\DjV`mA@!    FY  JY  #??+?39/+993393310327!3!!#"&5myѴmtw)PTžjuV@*  NY  ??3999/399+399933393331067!!##"&5!3?PXrFbA<J^!jJ<ͺj_eBVmV@*  FY  ??3999/399+399933393331067!!#5#"&5!353M6yD?42;H{rA4+@  NY ??39/+9933310!$32!4&#"!sV_sXͻk\Dm-@  FY ?3?9/+9933310!4#"!!632jvy¥u1/mdT^=!(Z@-%& * )% RY"PYNY?+?+9/+333933993333910"$'#"&547!33! !3 %"!&&}ȼ@'%5/*t3Rh)ow V!džhfF4###-^}>FO%X@,"# ' &LY"  JYIY?+?+9/33+3933993333910 $'# 5473336$3 !327"!&&D3%5 "Fmʹ^șPYh[A. ^mV0#Rb9=")l@8! &' + *!OY& RY!#PY??+?39/+333+93399333399310&'#"&547!33! !3 %"!&&@'%5/*t3Rh)w V91@hfF4###-^}>g"Ac`!'k@7$%) (!  LY$ "JY#JY?3+??+9/33+393399333399310%!&&'# 5473336$3 !327"!&&DyD3%5 "FmʹAPY?=n+h[A. ^mVRbF?,=&6P&+5V&6&+55G@$   NYQY??39/3+?+9933339310!!!!!"'32654&#"+s 횏{bxgew -D-!5omL@& IY FY ?+??39/+39933339310!#"'32654&#"!!Arx%g.le}dkym /~p!m9M@(NY PY NY??+?+?+99339333910!!!!#"'3266!{;LMFkpUF<&47.R#Ds{?1W78`mM@(FY GY JY#??+?+?+99339333910!!!##"'32667!!dhI!7-8+#PJ#]@5=@  NYNY?+??39/+99333310%!"'3265!!!!!|hqoy5s-D-5m?@    FYFY?+??39/+993333910%#"'325!!!!!zHsy6R/+sNmh9P@)     NY   NY??+??39/+993333393310!!!!!!!!;L5sDT`mP@)    FY  JY #??+??39/+993333393310!!!!!!!6ymhPNmj9uA@!  NY NY ??3?+9/+993393310!!5#"&5!327!!53V^9 Xͺjk\DjJV`m=@  FY  # JY ?+??39/+993333310327!!!35#"&5ku¥mt1`To9ZZ@.      NY ?3?3??+9939933339393310!#!!3!!!#467# 1+;K 2z`mY@-  JY#??+?3?39939933339393310!!#!&''!!>7!2L=;+gZ' ZFPPVD@"     LY JYIY?+?+9/+999339210 ! 55!&&#"6627!H9lʹUæZ ^lV-'uRb^u&jR 1&+55V#&j /&+55=u&jR '&+55#&j^ '&+55Xu&jR <&+55H/#&j ;&+55JZ@-   SY  NY NY?+9?+9/+399939939310!!!"'32654&###3+mccpbC ޵OT-3KSM@mX@,   JY  GY FY?+9?+9/+39939939310!!! '32654&##V_ax‡)+NP/7spyb%&MR&+5J&M&+5%u&jR %&+55J#&j $&+55hu&2jR +&+55V#&Rj .&+55h~Vhu&~jR +&+55V#&j /&+55Ru&jR 0&+553#&j~ 1&+55&MwR&+5&\M&+5u&jXR /&+55#&\j ,&+55s&SR -&+55!&\S *&+55juu&jR '&+55V#&j3 &&+559m 1@ OYNY?+?+?99393103!!!!3`m /@ FY FY#??+?+9939310!3!!=m=mu&j9R +&+55f#&j ,&+55m&1m&D&; m&[ f@4      OY>N ?3?9/]3+33993333339933993310!!!!!!!77Aq)777>A< m^@.      FY ?3?9/3+33993333333399339910#3!!3#!!'!DC#>Z\XJ^ 9@  PYPY??+9/+399333104$!3!! $#"33JA1PJVGJ#J@% ##$% PY    NY?3+39?99//+9939339310"'#"&54$!3!3265!#"3265ك~=1 :CF5K8<+tt#XPQ[s{EM07V'!.S@), &  /0  )GY ""FY?3+3?+9/99?9939399310"&'#"323&5!3265!26754&#"7Jz_;Ec+}z )W@,$!! &&*+NY$OY  NY ?+?99//+9+999393333910265!! &54&##32654#"6$32F5ͽuOE{71Q[s{XN@cHpS=(,K$#2$[ 9!X@- "# NY OY NY??+?9/+9+999393339910!!!4&##32654#"6$32^3ͽuOE{Dl[@lE@#   NY   NY?+??399//+9939332310 &55!!!!!3265!^s4IF5+jFQ[s{TmG@$  FY  FY?+??399//+9939333310!!3265!#"&&55!!6EcbȈNmhA@!  PY NY NY ?+?+9/+99339910 5!!! !2&#"Ll[}11qb8/XVH@$  JY FY IY?+?+9/+999339910! !2&&# 3267#U4e.QmqQY{5-R'ӜUO 3?@   NY  NY ?+?9/+3993939103265!! &5!!!%4IF5TjFQ[s{C1m?@   FY  GY ?+?9/+3993939103265!#"&&5!!!-ElbȈ#`&T@*$! !!'($OY NY NY?+?+9/9+999393339104$32&#"33# 32$7!"$&54675$# 8}rmT`FTfn72RF5+OkDŽ:?'&`um&!&$gJ!y&DgF&$fR&+5Jy&Df+'&+5&$wR &+55Jj&Dw? (&+55&$xR &+55y&Dxf (&+55J&$yR &+55J&DyB (&+55b&$zR .&+55Jy&DzB @&+55!s&$'KRg &+5J!y&D&KgX ""&+5&${R &+55Jy&D{^ +&+55&$|R &+55Jy&D|^ *&+55\&$}R &+55Jy &D}F "&+55b&$~R &+55Jy&D~J "&+55!&$'gNF &+5J!yL&D'gHN 00&+5!&(g1V!&Hgm&(fR&+5V&HfB!&+5&(RR&+5V-&HR-$&+59&(wR &+55Vu&HwJ "&+55b&(x5R &+55&Hxh "&+55J&(yR &+55V &HyR "&+55b&(zR *&+55V&HzR :&+55!s&('g3KR &+5V%!&H'gXK ''&+5F?&,ffR&+5hh&f &+5F!?&,g}!5&Lg7h!&2gV!&Rgsh&2fR&+5V&Rf7&+5h&2wR &+55Vo&RwD &+557&2x R &+55&Rxj &+55hJ&2yR &+55V&RyD &+55hb&2zR 4&+55V&RzL 7&+55h!s&2'KRg &+5V!!&R&Kgw &+5hs&_vR(&+5V!&`v ,,&+5hs&_C`R(&+5V!&`C ,,&+5h&_fR$&+5V&`fJ ((&+5h&_RR'&+5V-&`RB ##&+5h!&_g!V!&`g}!y&8g!m&Xgy&8fR&+5&XfR&+5s&av;R&&+5!&bv ,,&+5s&aCR&&+5!&bC ,,&+5&afR"&+5&bfX ((&+5&aRR%&+5-&bRV ##&+5!&ag!&bg!P&<gm&\g P&<fHR&+5&\f&+5P&<RVR&+5-&\R%&+5V9&B!  /2]210&&'5!!&&'5!SV"c)SV e'A0K9A-F5+ @   /3]99/10#&'#567!'67!#ijra^yy^^X7=F`eAnnVqTz- @   /3]99/10#&'#567!%#&'5!arji;rc=7XAe`FExzTqV #@  /3]99/2910#&'#567!#'254#"5632ijra^yy^} yC$$FhoF`eAnnbw1l1- Q&7@!" /""/""/3]]23/]2910"'&#"#663232673#&'#5767!0ff#1# } lX%PKC/% pQ8}??7OU##){!*{7L0:7qP(Yw  /33107673#"&'332673<zU rb^|+d8GISUG /3310#&'53"&'332673=77y rb^|3g`߹ISUG #@ /23/]2910"&'332673#'2654#"5632= rb^|(ky/'5"0)BZ^ٹISUGi+`) K $'@""/"" /2]22]210"&'332673"'&#"#663232673= W^{!0ff#1# } lX%PKC/% pϠ,=45A##){!*{&@  //3939339104&'3#"'5325P^Px[SGM)RLB}Ei  P @  /2/93310"'3265!T?@JD0kju9  @  /2/93310"'3265!T?@JD0kj5yq *@   ??3939339910!!47'!qn,0eu5)V (@  TY &TY?+?+993310! ! 32654&#"$  5IYVFIUWID2&2}1 *@   ??3939339910!!47'!o1<Vu6.w}9{C@!   UY&UY?+9?+9399393910!!%>54#"6$32!{Jhw5ύ\#?ZF+Rzeuf>F\&S@* !!  '( $TYVY $& TY %?+?9/+9+99933933910!"&'32654&##3 54&#"66321nyx`TwZ\-YKqB,.".H2.INXF);8^NE @@    VY&%??3+33?9933399310%#!!5!3!5467#z}[  YB^sfˍ8Ty^RL@&  VYUY TY%?+?+9/3+39939339102!"'32654&#"'!!66~qWOnvxz]l7BNBu֌PD(4][S_#HFqNm.@UY$??+99939310!!lH5Do5m$D@" ""%& VYTY$VY&?+?+9/+999333310!"'3267##"&543 %"32654&mkMVV 'LnR &AQFHA`[S 9H@")^iQa^B[~-&IINB 3u@93!*+*)&.&'' -.--451#*#!+!'  .''4+((?3/339/33/399333993993339333393310#"'532654'.54632&#"##!!#47#}j^ea (CVN'yonDO>D-8UUdu-9*%AT5gs+5+u&jR &+55+u&jR &+55++rr&fR &+5!3&gN2I6$$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs) $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q  q q q           ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q   q   q    q q  q  !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) -&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq7$&q&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq$q$ q$&$*$- $2$4$7q$9$:$<$$$$$$$$$$$$$$$$$$$$$$q$&q$6$8$:$G$$$$$q$ q$_$I$K$M$O$Q$S$U$W$Y$[$]$_$o$q$s$q%%%$%7%9%:%;%<%=%%%%%%%%%%%$%&%6%8%:%;%=%?%C%%%%%%% %X%%%!%#%%%'%)%+%-%/%1%3%o%q%s%&&&*&2&4&&&&&&&&&&&&&&&&&&&&G&_&I&K&M&O&Q&S&U&W&Y&[&]&_'''$'7'9':';'<'='''''''''''$'&'6'8':';'='?'C''''''' 'X'''!'#'%''')'+'-'/'1'3'o'q's'(-{)))"))$))))))))))C)) )X)))!)#)%)')))+)-)/)1)3.&.*.2.4....................G._.I.K.M.O.Q.S.U.W.Y.[.]._/\/ \/&/*/2/4/7/8/9/:/</////////////////////////$/&/*/,/./0/2/4/6/8/:/G/////\/ \/_/a/I/K/M/O/Q/S/U/W/Y/[/]/_/a/c/e/g/i/k/m/o/q/s/222$27292:2;2<2=22222222222$2&26282:2;2=2?2C2222222 2X222!2#2%2'2)2+2-2/21232o2q2s2333$3;3=3333333333;3=3?3C33 3X333!3#3%3'3)3+3-3/3133444$47494:4;4<4=44444444444$4&46484:4;4=4?4C4444444 4X444!4#4%4'4)4+4-4/41434o4q4s47777")7$q7&7*727477)7D\7Fq7Gq7Hq7Jq7P7Q7Rq7S7Tq7U7V7X7Y7Z7[7\7]7q7q7q7q7q7q77777777q7\7\7\7\7\7\7q7q7q7q7q7q7q7q7q7q7q777777q7\7q7\7q7\77q77q77q77q7q7q7q7q7q7q7q77q77q77q77q7777 77q77q77q77q7777!7$)7&)7+7-7/717375777<7>7@7Cq7D\7F\7G7Hq7J7777777 7W7Xq7Y\7_7`q7b7q7\7q7 \7!q7"\7#q7%q7&\7'q7(\7)q7*\7+q7,\7-q7.\7/q70\71q72\73q74\76q78q7:q7<@<C<D<F<G<H<J<< <W<X<Y<_<`<b<<<< <!<"<#<%<&<'<(<)<*<+<,<-<.</<0<1<2<3<4<6<8<:<<<@<B<D<I<J<K<L<M<N<O<Q<R<S<T<U<V<W<X<Y<Z<[<\<]<^<_<`<b<d<f<h<j<l<n=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_>-DD DD EE EYEZE[E\E]EE7E<E>E@EEEE EpF)F )F)F )HH HYHZH[H\H]HH7H<H>H@HHHH HpI{I {I{I {KK KK NFNGNHNRNTNNNNNNNNNNNNNNNNNNNNNNNNNNNNHN`N6N8N:N<N@NBNDNJNLNNNRNTNVNXNZN\N^N`PP PP QQ QQ RR RYRZR[R\R]RR7R<R>R@RRRR RpSS SYSZS[S\S]SS7S<S>S@SSSS SpURU RUDUFUGUHUJURUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUDUFUHURU RUYU`UU U"U&U(U*U,U.U0U2U4U6U8U:U<U@UBUDUJULUNURUTUVUXUZU\U^U`W)W )W)W )YRY RYYY")YRYY RY ZRZ RZZZ")ZRZZ RZ [F[G[H[R[T[[[[[[[[[[[[[[[[[[[[[[[[[[[[H[`[6[8[:[<[@[B[D[J[L[N[R[T[V[X[Z[\[^[`\R\ R\\\")\R\\ R\ ^-q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq-{&*24G_IKMOQSUWY[]_-{-{-{-{$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjln$;=;=?C X!#%')+-/13             YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p   YZ[\]7<>@ pR R")R R  YZ[\]7<>@ pR R")R R q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  &*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_$79:;<=$&68:;=?C X!#%')+-/13oqsR R "@E=K=N=O=`={R R$79:;<=$&68:;=?C X!#%')+-/13oqs-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p  &*24G_IKMOQSUWY[]_FGHRTH`68:<@BDJLNRTVXZ\^`FGHRTH`68:<@BDJLNRTVXZ\^`\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqsR R "@E=K=N=O=`=R R\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs  $79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs-{R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`$$$$")$$q$&$*$2$4$7)$D\$Fq$Gq$Hq$Jq$P$Q$Rq$S$Tq$U$V$X$Y$Z$[$\$]$q$q$q$q$q$q$$$$$$$$q$\$\$\$\$\$\$q$q$q$q$q$q$q$q$q$q$q$$$$$$q$\$q$\$q$\$$q$$q$$q$$q$q$q$q$q$q$q$q$$q$$q$$q$$q$$$$ $$q$$q$$q$$q$$$$!$$)$&)$+$-$/$1$3$5$7$<$>$@$Cq$D\$F\$G$Hq$J$$$$$$$ $W$Xq$Y\$_$`q$b$q$\$q$ \$!q$"\$#q$%q$&\$'q$(\$)q$*\$+q$,\$-q$.\$/q$0\$1q$2\$3q$4\$6q$8q$:q$&@&Cq&D\&F\&G&Hq&J&&&&&&& &W&Xq&Y\&_&`q&b&q&\&q& \&!q&"\&#q&%q&&\&'q&(\&)q&*\&+q&,\&-q&.\&/q&0\&1q&2\&3q&4\&6q&8q&:q&(@(Cq(D\(F\(G(Hq(J((((((( (W(Xq(Y\(_(`q(b(q(\(q( \(!q("\(#q(%q(&\('q((\()q(*\(+q(,\(-q(.\(/q(0\(1q(2\(3q(4\(6q(8q(:q(8@8C8D8F8G8H8J88 8W8X8Y8_8`8b8888 8!8"8#8%8&8'8(8)8*8+8,8-8.8/808182838486888:8<8@8B8D8I8J8K8L8M8N8O8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8b8d8f8h8j8l8n9R9 R999")9R99 R9 :::"):$:&:*:2:4:D:F:G:H:J:P:Q:R:S:T:U:V:X:]:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::!:+:-:/:1:3:5:<:>:@:C:D:F:G:H:J:: :W:X:Y:_:`:b:::: :!:":#:%:&:':(:):*:+:,:-:.:/:0:1:2:3:4:6:8:::<:@:B:D:I:J:K:L:M:N:O:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:^:_:`:b:d:f:h:j:l:n;&;*;2;4;;;;;;;;;;;;;;;;;;;;G;_;I;K;M;O;Q;S;U;W;Y;[;];_=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_?&?*?2?4????????????????????G?_?I?K?M?O?Q?S?U?W?Y?[?]?_CqC qC&C*C- C2C4C7qC9C:C<CCCCCCCCCCCCCCCCCCCCC$qC&qC6C8C:CGCCCCCqC qC_CICKCMCOCQCSCUCWCYC[C]C_CoCqCsCqDD DD E-{GGG$G7G9G:G;G<G=GGGGGGGGGGG$G&G6G8G:G;G=G?GCGGGGGGG GXGGG!G#G%G'G)G+G-G/G1G3GoGqGsGVqV qVfVmVqqVrVsVuVxVqV qVT[[[V[_[b[d[i[p[q[r[t[u[x[[[ [T\\\V\_\b\f\i\m\s\v\y\z\{\|\}\~\\\\\\\\\\\\\\\\\\\\ \!]q]r]x]T^^ ^^ _q_ q_f_m_qq_r_s_u_x_q_ q_T```V`_`b`i`t`` aaaaV\a_\ab\afai\amasavayqaza{a|a}a~qaaaaaaaaaqaaqaqaaqaaaaaqaaaaaaa a!aSbqb qbfbmbqqbrbsbubxbqb qbTdfdmdsfffVf_fbfdfifpfqfrftfufxfff fThfhmhshhiqi qifimiqqirisiuixiqi qiTmmmVm_mbmdmimpmqmrmtmumxmmm mToooVo_obodoiotooo qqqqV\q_\qb\qfqi\qmqsqvqyqqzq{q|q}q~qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq q!qSrrrVr_rbrfrirmrsrvryrzr{r|r}r~rrrrrrrrrrrrrrrrrrrr r!sssVs_sbsdsispsqsrstsxsss sTtftmtsttuuuVu_ubufuiumuu vqvrvxvTxxxVx_xbxfxixmxsxvxyxzx{x|x}x~xxxxxxxxxxxxxxxxxxxx x!y){{ {{ || |||| ~) y~     y~ y~         y~       n| q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqql~    n|   n|   n| l|~  qff jlrqs~ffqqq q  q q qqq qn|q qq  r|  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq)l|~    l|~   rsz|  rsv  l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqqqff jlrqs~ffqqq q  q  rsz l|~  ))  n|   n|  rsz|  rsz|   ) js      j  )j       js   s  j        m  m         js    m  m  j   sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R 7$&q7$&q7$&q$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q                        q  q  q                             ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q    q    q    q q  q   !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) & * 2 4 7q 8 9 : <                         $q &q * , . 0 2 4 6 8 : G f m qq r s u x  q  q   q  \ q        T _ a l |\ ~        q    q    q  \  \    \     \        q  I K M O Q S U W Y [ ] _ a c e g i k m o q s q!q!r!x!TSSSS TTTVT_TbTfTiTmTsTvTyTzT{T|T}T~TTTTTTTTTTTTTTTTTTTT T!XqX qX&X*X- X2X4X7qX9X:X<XXXXXXXXXXXXXXXXXXXXX$qX&qX6X8X:XGXXXXXqX qX_XIXKXMXOXQXSXUXWXYX[X]X_XoXqXsXqYY YY ZZZVZ_ZbZdZiZpZqZrZtZuZxZZZ ZT`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`RbIfbWfbYfbZfb[fb\fbfb%fb'fb7fbfbfb4fb5fb]fb^fbpfbfbfjj jj llllllllllllllllllllll lrlslzl|lllllllllllllllllllllllllllll llllllmmmmmmm msmmmnn nnnnnnnnn n|nnnnnnnnnnnnnnn nnnoo ooooooooo omooooooooooooooooooooooooooopppppplp~ppppppppppppppppp p ppprqr qrrrqrrrrrrrqr qrnr|rrrrrrrrqrrrrrrrrrrrrrrrrrrr qrrqrrrsqs qssssssssssssqs qsjsms}sssssssssssssssssssssssssssss s ssssstqt qtttqtttttttqt qtnt|ttttttttqttttttttttttttttttt qttqtttuqu quuuuuuuuuuuuqu qujumu}uuuuuuuuuuuuuuuuuuuuuuuuuuuuu u uuuuuv vx xzzzz zzzzz z|q|q||||||||q| q|r|s|||||| | ||||}} }}}}}}}}} }}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~ ~r~s~z~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~  qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  s s s rsz|    rsz|    rsz|  sl~  )    |   m rsv    )))))) jklqrsuwy}~)))))    ) js   f |   l{=}~j    )l{=}~j  l|~  j  l|~  j  l|~  j  )  )))))) jklqrsuwy}~)))))    ) js  \ \fH\ \|qqH HHq qq qmqq   l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )) jklqrsuwy}~))     s)) jklqrsuwy}~))     sl{=}~j  )  )    |         l|~  j   f m| )  )  )  q qqq qn|q qq  q qqq qn|q qq       rsz|    rsz|   l|~  j    )   rsz|    rsz|    rsz|    rsz|   qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )))))) jklqrsuwy}~)))))    ) js  l{=}~j  l|~  j          q             r v |       q                                                                           q             r v |       q                                      )   q rv|q    q rv|q    r    r|   )  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq     !q! q!&!*!- !2!4!7q!9!:!<!!!!!!!!!!!!!!!!!!!!!$q!&q!6!8!:!G!!!!!q! q!_!I!K!M!O!Q!S!U!W!Y![!]!_!o!q!s!q"" "" #q# q#&#*#- #2#4#7q#9#:#<#####################$q#&q#6#8#:#G#####q# q#_#I#K#M#O#Q#S#U#W#Y#[#]#_#o#q#s#q$$ $$ %q% q%&%*%- %2%4%7q%9%:%<%%%%%%%%%%%%%%%%%%%%%$q%&q%6%8%:%G%%%%%q% q%_%I%K%M%O%Q%S%U%W%Y%[%]%_%o%q%s%q&& && 'q' q'&'*'- '2'4'7q'9':'<'''''''''''''''''''''$q'&q'6'8':'G'''''q' q'_'I'K'M'O'Q'S'U'W'Y'[']'_'o'q's'q(( (( )q) q)&)*)- )2)4)7q)9):)<)))))))))))))))))))))$q)&q)6)8):)G)))))q) q)_)I)K)M)O)Q)S)U)W)Y)[)])_)o)q)s)q** ** +q+ q+&+*+- +2+4+7q+9+:+<+++++++++++++++++++++$q+&q+6+8+:+G+++++q+ q+_+I+K+M+O+Q+S+U+W+Y+[+]+_+o+q+s+q,, ,, -q- q-&-*-- -2-4-7q-9-:-<---------------------$q-&q-6-8-:-G-----q- q-_-I-K-M-O-Q-S-U-W-Y-[-]-_-o-q-s-q.. .. /q/ q/&/*/- /2/4/7q/9/:/</////////////////////$q/&q/6/8/:/G/////q/ q/_/I/K/M/O/Q/S/U/W/Y/[/]/_/o/q/s/q00 00 1q1 q1&1*1- 121417q191:1<111111111111111111111$q1&q16181:1G11111q1 q1_1I1K1M1O1Q1S1U1W1Y1[1]1_1o1q1s1q22 22 3q3 q3&3*3- 323437q393:3<333333333333333333333$q3&q36383:3G33333q3 q3_3I3K3M3O3Q3S3U3W3Y3[3]3_3o3q3s3q44 44 5-{66 6Y6Z6[6\6]6676<6>6@6666 6p7-{88 8Y8Z8[8\8]8878<8>8@8888 8p9-{:: :Y:Z:[:\:]::7:<:>:@:::: :p;-{<< <Y<Z<[<\<]<<7<<<><@<<<< <p=-{>> >Y>Z>[>\>]>>7><>>>@>>>> >p?-{@@ @Y@Z@[@\@]@@7@<@>@@@@@@ @pA-{BB BYBZB[B\B]BB7B<B>B@BBBB BpC-{DD DYDZD[D\D]DD7D<D>D@DDDD DpIII$I7I9I:I;I<I=IIIIIIIIIII$I&I6I8I:I;I=I?ICIIIIIII IXIII!I#I%I'I)I+I-I/I1I3IoIqIsIJJ JYJZJ[J\J]JJ7J<J>J@JJJJ JpKKK$K7K9K:K;K<K=KKKKKKKKKKK$K&K6K8K:K;K=K?KCKKKKKKK KXKKK!K#K%K'K)K+K-K/K1K3KoKqKsKLL LYLZL[L\L]LL7L<L>L@LLLL LpMMM$M7M9M:M;M<M=MMMMMMMMMMM$M&M6M8M:M;M=M?MCMMMMMMM MXMMM!M#M%M'M)M+M-M/M1M3MoMqMsMOOO$O7O9O:O;O<O=OOOOOOOOOOO$O&O6O8O:O;O=O?OCOOOOOOO OXOOO!O#O%O'O)O+O-O/O1O3OoOqOsOQQQ$Q7Q9Q:Q;Q<Q=QQQQQQQQQQQ$Q&Q6Q8Q:Q;Q=Q?QCQQQQQQQ QXQQQ!Q#Q%Q'Q)Q+Q-Q/Q1Q3QoQqQsQSSS$S7S9S:S;S<S=SSSSSSSSSSS$S&S6S8S:S;S=S?SCSSSSSSS SXSSS!S#S%S'S)S+S-S/S1S3SoSqSsSUUU$U7U9U:U;U<U=UUUUUUUUUUU$U&U6U8U:U;U=U?UCUUUUUUU UXUUU!U#U%U'U)U+U-U/U1U3UoUqUsUXIRXWRXYfXZfX[fX\fXfX%RX'RX7fXfXfX4RX5RX]RX^RXpfXRXRZIRZWRZYfZZfZ[fZ\fZfZ%RZ'RZ7fZfZfZ4RZ5RZ]RZ^RZpfZRZR\IR\WR\Yf\Zf\[f\\f\f\%R\'R\7f\f\f\4R\5R\]R\^R\pf\R\R^IR^WR^Yf^Zf^[f^\f^f^%R^'R^7f^f^f^4R^5R^]R^^R^pf^R^R`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`Raaa$aaaaaaaaaaCaa aXaaa!a#a%a'a)a+a-a/a1a3fIffWffYffZff[ff\ffff%ff'ff7ffffff4ff5ff]ff^ffpfffffhIfhWfhYfhZfh[fh\fhfh%fh'fh7fhfhfh4fh5fh]fh^fhpfhfhfjIfjWfjYfjZfj[fj\fjfj%fj'fj7fjfjfj4fj5fj]fj^fjpfjfjflIflWflYflZfl[fl\flfl%fl'fl7flflfl4fl5fl]fl^flpflflfnIfnWfnYfnZfn[fn\fnfn%fn'fn7fnfnfn4fn5fn]fn^fnpfnfnfooo")o$o&o*o2o4oDoFoGoHoJoPoQoRoSoToUoVoXo]oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooo!o+o-o/o1o3o5o<o>o@oCoDoFoGoHoJoo oWoXoYo_o`oboooo o!o"o#o%o&o'o(o)o*o+o,o-o.o/o0o1o2o3o4o6o8o:o<o@oBoDoIoJoKoLoMoNoOoQoRoSoToUoVoWoXoYoZo[o\o]o^o_o`obodofohojolonpRp Rppp")pRpp Rp qqq")q$q&q*q2q4qDqFqGqHqJqPqQqRqSqTqUqVqXq]qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqq!q+q-q/q1q3q5q<q>q@qCqDqFqGqHqJqq qWqXqYq_q`qbqqqq q!q"q#q%q&q'q(q)q*q+q,q-q.q/q0q1q2q3q4q6q8q:q<q@qBqDqIqJqKqLqMqNqOqQqRqSqTqUqVqWqXqYqZq[q\q]q^q_q`qbqdqfqhqjqlqnrRr Rrrr")rRrr Rr sss")s$s&s*s2s4sDsFsGsHsJsPsQsRsSsTsUsVsXs]ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssss!s+s-s/s1s3s5s<s>s@sCsDsFsGsHsJss sWsXsYs_s`sbssss s!s"s#s%s&s's(s)s*s+s,s-s.s/s0s1s2s3s4s6s8s:s<s@sBsDsIsJsKsLsMsNsOsQsRsSsTsUsVsWsXsYsZs[s\s]s^s_s`sbsdsfshsjslsntRt Rttt")tRtt Rt { {{ {")$q&*247)D\FqGqHqJqPQRqSTqUVXYZ[\]qqqqqqq\\\\\\qqqqqqqqqqqq\q\q\qqqqqqqqqqqqqqq qqqq!$)&)+-/1357<>@CqD\F\GHqJ WXqY\_`qbq\q \!q"\#q%q&\'q(\)q*\+q,\-q.\/q0\1q2\3q4\6q8q:q h & * P8 &  $  (h 8 \ \$ T  Digitized data copyright 2011, Google Corporation.Open Sans ExtraboldRegularAscender - Open Sans Extrabold Build 100Version 1.10OpenSans-ExtraboldOpen Sans is a trademark of Google and may be registered in certain jurisdictions.Ascender Corporationhttp://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0Digitized data copyright 2011, Google Corporation.Open Sans ExtraboldRegularAscender - Open Sans Extrabold Build 100Version 1.10OpenSans-ExtraboldOpen Sans is a trademark of Google and may be registered in certain jurisdictions.Ascender Corporationhttp://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0ff      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~.notdefnullnonmarkingreturnspaceexclamquotedbl numbersigndollarpercent ampersand quotesingle parenleft parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon semicolonlessequalgreaterquestionatABCDEFGHI.altJKLMNOPQRSTUVWXYZ bracketleft backslash bracketright asciicircum underscoregraveabcdefghijklmnopqrstuvwxyz braceleftbar braceright asciitildenonbreakingspace exclamdowncentsterlingcurrencyyen brokenbarsectiondieresis copyright ordfeminine guillemotleft logicalnotuni00AD registered overscoredegree plusminus twosuperior threesuperioracutemu paragraphperiodcenteredcedilla onesuperior ordmasculineguillemotright onequarteronehalf threequarters questiondownAgraveAacute AcircumflexAtilde AdieresisAringAECcedillaEgraveEacute Ecircumflex Edieresis Igrave.alt Iacute.altIcircumflex.alt Idieresis.altEthNtildeOgraveOacute OcircumflexOtilde OdieresismultiplyOslashUgraveUacute Ucircumflex UdieresisYacuteThorn germandblsagraveaacute acircumflexatilde adieresisaringaeccedillaegraveeacute ecircumflex edieresisigraveiacute icircumflex idieresisethntildeograveoacute ocircumflexotilde odieresisdivideoslashugraveuacute ucircumflex udieresisyacutethorn ydieresisAmacronamacronAbreveabreveAogonekaogonekCacutecacute Ccircumflex ccircumflexCdotcdotCcaronccaronDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflexGbrevegbreveGdotgdot Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbar Itilde.altitilde Imacron.altimacron Ibreve.altibreve Iogonek.altiogonekIdotaccent.altdotlessiIJ.altij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotLslashlslashNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautOEoeRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexScedillascedillaScaronscaron Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflex YdieresisZacutezacute Zdotaccent zdotaccentZcaronzcaronlongsflorin Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccent circumflexcaronmacronbreve dotaccentringogonektilde hungarumlauttonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos.alt Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIota.altKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9Iotadieresis.altUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronpirhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055.alt afii10056.alt afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveendashemdash afii00208 underscoredbl quoteleft quoterightquotesinglbase quotereversed quotedblleft quotedblright quotedblbasedagger daggerdblbulletellipsis perthousandminutesecond guilsinglleftguilsinglright exclamdblfraction nsuperiorfranc afii08941pesetaEuro afii61248 afii61289 afii61352 trademarkOmega estimated oneeighth threeeighths fiveeighths seveneighths partialdiffDeltaproduct summationminusradicalinfinityintegral approxequalnotequal lessequal greaterequallozengeuniFB01uniFB02 cyrillicbrevedotlessjcaroncommaaccent commaaccentcommaaccentrotate zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperioruni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200BuniFEFFuniFFFCuniFFFDuni01F0uni02BCuni03D1uni03D2uni03D6uni1E3Euni1E3Funi1E00uni1E01uni1F4Duni02F3 dasiaoxiauniFB03uniFB04OhornohornUhornuhornuni0300uni0301uni0303hookdotbelowuni0400uni040Duni0450uni045Duni0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BF uni04C0.altuni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CE uni04CF.altuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7 uni1EC8.altuni1EC9 uni1ECA.altuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1uni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni20ABuni030Fcircumflexacutecombcircumflexgravecombcircumflexhookcombcircumflextildecombbreveacutecombbrevegravecomb brevehookcombbrevetildecombcyrillichookleftcyrillicbighookUCcyrillicbighookLCone.pnumzero.osone.ostwo.osthree.osfour.osfive.ossix.osseven.oseight.osnine.osffuni2120Tcedillatcedillag.altgcircumflex.alt gbreve.altgdot.altgcommaaccent.altIIgraveIacute Icircumflex IdieresisItildeImacronIbreveIogonek IdotaccentIJ IotatonosIota Iotadieresis afii10055 afii10056uni04C0uni04CFuni1EC8uni1ECA   46latnMOL ROM  nlatnMOL (ROM B      ligaligaligalnumlnumlnumloclloclonumonumonumpnumpnumpnumsalt saltsaltss01"ss01*ss012ss02:ss02@ss02Fss03Lss03Rss03Xtnum^tnumftnumn    &.6>FNV^Pz2HJJ.,ZgwEG      !$%IJ6 "(^IO]ILI5O4LI^V0R *H C0?1 0 +0a +7S0Q0, +7<<<Obsolete>>>0!0 + r VZŽZ,`]0z0b8%a&Z0  *H 0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0 070615000000Z 120614235959Z0\1 0 UUS10U VeriSign, Inc.1402U+VeriSign Time Stamping Services Signer - G200  *H 0ĵR`)J[/Kk5TX56^bMRQ4q{f*j 7٘tvJcEG.k NK+XJ,XB-uލǎlLgrIž`<cxi{-004+(0&0$+0http://ocsp.verisign.com0 U003U,0*0(&$"http://crl.verisign.com/tss-ca.crl0U% 0 +0U0U0010 UTSA1-20  *H PK$ $- 7 ,Za񑑳V@뒾89u6t:O7ʕBǠWdB5N3M'L8MxSݤ^ ⥾`߭(ǥKd[98"3/!?DA e$HDT\y>]r},CS}=*:Om ]^SWp`+nx'4[^I2300-GߍRFCmH 10  *H 01 0 UZA10U Western Cape10U Durbanville10 U Thawte10U Thawte Certification10UThawte Timestamping CA0 031204000000Z 131203235959Z0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0"0  *H 0 ʲ }uNgadڻ30X~k6xw~o< hlʽR-H=]_/kLR`@~ ?Ǵ߇_zj1.G 1s W-x43h/Š*Ë!fXWou<&]'x1"ijGC_^|}bM "Vͮv M٠h;004+(0&0$+0http://ocsp.verisign.com0U00AU:0806420http://crl.verisign.com/ThawteTimestampingCA.crl0U% 0 +0U0$U0010U TSA2048-1-530  *H JkXD1y+LͰXn)^ʓR G'/8ɓN"b?7!Op18UN$ҩ'NzaA*^ݻ+>W~ +;R8'?J00eeR&.Y)"\0  *H 0_1 0 UUS10U VeriSign, Inc.1705U .Class 3 Public Primary Certification Authority0 090521000000Z 190520235959Z01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0"0  *H 0 g`IoV|f^ q-!ќPL"5; .Z|=;%X{ ξ'tag'MjaXy'M4+G Df$fO8TrfujIh8y 0,`Hת809:|@T/ܨR>+!\ P4.M^%Ԍn|)]1ZՌgX5+!`x^{`W ]A cT`C!00U00pU i0g0e `HE0V0(+https://www.verisign.com/cps0*+0https://www.verisign.com/rpa0U0m+ a0_][0Y0W0U image/gif0!00+kπjH,{.0%#http://logo.verisign.com/vslogo.gif0U%0++04+(0&0$+0http://ocsp.verisign.com01U*0(0&$" http://crl.verisign.com/pca3.crl0)U"0 010UClass3CA2048-1-550Uk&pȡ?-50  *H ݔAaix0Ɛ<~B$s/DrPU nQj71ܥ-OM2NgUejzd8xEv1z`³]fvYI8VAwX00fgymPSo0  *H 01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0 100729000000Z 120808235959Z01 0 UUS10U Massachusetts10 UWoburn10U Monotype Imaging Inc.1>0<U 5Digital ID Class 3 - Microsoft Software Validation v210U Type Operations10UMonotype Imaging Inc.00  *H 0Di|U 25L3^ L*8ט@I "SOCʋVnH9c;$5}rGWyˊJ@p-5cįפ {uePd"}KXEMYLM00 U00U0DU=0;09753http://csc3-2009-2-crl.verisign.com/CSC3-2009-2.crl0DU =0;09 `HE0*0(+https://www.verisign.com/rpa0U% 0 +0u+i0g0$+0http://ocsp.verisign.com0?+03http://csc3-2009-2-aia.verisign.com/CSC3-2009-2.cer0U#0k&pȡ?-50 `HB0 +700  *H N"gA~™cjrb<8=_G_[KI  VD 5< D`E*oL;4gpZ9\Zl5|eKmIp=b۴A~}n"w6MZ S1+(RzkwD ]%,͊0>KyʦN $ 񺐶\<'M5qxl[P ڟp!;p2ɺjMIXftG cazO,l,3^5GTXCJ'd 198X5qJsnek-1.1/doc/fonts/OpenSans-ExtraBoldItalic.ttf000066400000000000000000006406541353657467200215270ustar00rootroot000000000000000DSIG,8tGDEF&(GPOS 77(88GSUB+=(pOS/2`cmap)/hcvt fpgmsugasp#(glyfD/K&*headBf<6hheat$hmtx] kernT+ ~E,6loca.WVmaxpo namefdupost7l&+prepR@.58_< eK   [/\: 33f @ [(1ASC X m o +=VPD{Vfss?N#1jssXfm-Rh! hy!!!h!hZ!7!F!R!h!h3!b+j}{NP{HHoTTTTH/y{hTT?`ZXfZ`ojL %oPq;=Rq`fPPBo%fss#Ps1Ohhhhhhh h!!!!hhhhy R!hhhhhf^}}}}!TTTTTTTTTTTTTTTTTTfB````ZZhThThT hT hT hT hTy!RTy T!T!T!T!T!Thy{hy{hy{hy{!!hhhhhd3Z!7!7!7!7!DLR!R!R!R!hThThTuh T3!3!3!b+b+b+b+jt8j?j}`}`}`}`}`}`{fZPPP hTT^Bb+ooBHso? Bo-obbhss^ F hw, 1h!7!L!P!#hhZ!F!R!sh!!jj\N/h Tu)1V` T+`-9u)B`1V`BTTNTT-B`T`B1V`T`B!;7! hb+hh!#)!D!h!!7!Z)!w}\!\!)!F!!h!! hjD\N! !w!!! !3uTVT TTR!``V!TThZT-`h``}NTT-%T ThZ`;! {f{f{fZ!!!3m^mm^bVV/#V P= 3h5!L7!)f/fhu)L -fVmoNHRqP//bHfPZPP^PRP\PFRmVybZV^NF!hhT+s/o/mhT{}%`]1!\!T`jhX!1!PhmT!'!yX !9`hThXhX ?h 'T'h^Tjh TjhX hT3'PL;L !`!b!J7 d!}R!!Z!mZ!qB!!H!%fhT hTjZX'Z'BZ!VVhw}R!/b!f!!!hhThTT!T!-!-w}R!\!`\!`hThThT -DZDZDZ7!!T7 D`NBTBTX?JDZJs!hTRB5u)JhThThThThThThThThThThThT!T!T!T!T!O!T!T!ThhhThThThThThThTmhTmhTmhTmhTmhT}`}`{}%`{}%`{}%`{}%`{}%`ZZZ!  fvT#w{M,c'{j?     s  0HI~'2a7 # O_?M   " & 0 3 : < D p y  !!!! !"!&!.!^"""""""+"H"`"e% IJ(3b7 #P`>M   & 0 2 9 < D p t  !!!! !"!&!.!["""""""+"H"`"d%aIvhcb]gD Xz}} Bvt n%"iOS0L\pr`<&'()*+,-./0123456789:;<=>?@AIJ$%TUVWXY\]^_`abcdefhijklmnopqrstuvhijkFopqrstu45]^@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,F#F`F# F`ab# # pE` PXaYh:-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-@ YGH!H U UHUXXXWT VT UTDTTT%3$UQN PN ONDNTNN3UU3U?dMDLKF JF IF HH$HGF $F#"33U3UU3U?_U3U?oTS++KRK P[%S@QZUZ[XYBK2SX YKdSXBYss++stu+++++s+s+++ss^st+++s+++++++s+++s+++++^Numl`7#7ZD=/#<F/5GeyHs0Rc,{69#K - G ~ ! l  M w  @ e y / { ELrB|Fq/V;L2z619 R;_ !y&2CTew&7HYk*;p&7H ,=N`   i ! !X!i!z!!!!!!!!"""'"8"H"Y"e"m""""###0#<#H#Y#i#z########$$R$$$$$$%%%%0%C%O%[%l%}%%%%%%&&&&/&D&u&&&&&&&''G'''''''(M((((()))*):)K)\)h)t))))))**V*g*w*******++ ++)+:+K+[+m+~+++++,,N,-<-M-^-o------..,.X.|.../7/K/S/h/}///////0 000$0,0|000000011!1R1Z1b112 2X2j2|222223/3344m445:5b5j5556?6G6677N7788X88999%959F9X999:: ::'::;;;);S;[;;;;;<$>M>>>?M???@J@@A@AHABB BBCB~BBBBBCC CC_CgCCDzOz_zqzzzzzz{{'{9{{||Z||} }}f}~1~~:8}ÁEށ8Ȃڂ"4FXmɃۃ&:FRct˄݄%:N_p|…ԅ .@Rg{Ά߆ $0ARctȇ؇*;KW+*x܊>|Ќ PXxэLčЎ)9IZkĎՎ4āKG8(5I:DP'5@3", ???32?3210!"32654&#"&54632"32654&#"&54632^A2M54K;qˁlɉy2M54K;ṕlɉJ܂T݁+)P웧n܂T݁,(P웦)1.@*PY--$$  SY ?+?939?+10467&&54632667!!'#"$"6654&27%/㠶$O.kF+1=3HE,M=u_<.;߰^$Sm=QEKT ?10!THD   '??10!!&DCA4CTFJB xf3{  '??10!4'!A6'GPVMHY|'# ?9/10%%'7%tpʔPd?)V/T^f5  /3333310!!!!!!a`J`/10%!67t5^)y s/310!?)@8h ZY ?+1054632#"&rT`xN`m|PKvpJD ??10!DF!?@ TY TY?+?+10#"&5$32%"32654&ت,Ƈd)7nD-:kK%1'}!TNVU]9  ??9310!!67'!{0N5˗l7|D#}\@ UY UY?+9?+10!!654&#"6!2!54(x3݌11Ǫ f(7@WY   && TY& TY ?+?+9/_^]+910!"&'32654&&##32654&#"'6632ftBҊ6vkT5NH?u~q!~)&Ld]W66#]Q.8TQC %@ VY??9/9+910#!!!3!767#);<3h1 3?khaK+@VYUY TY?+?+9/+3102!"&'3 54&#"'!!6ρ6OReV5t"z-D);#,'D-3L^ \N%(@ VY VYVY?+?+9/9+102&#"3632#"&5472654#"f?_Xw/jɠU7BV\DZ5DįinTilBC#@ UY??+9103!!#F3oG11 ,(@'' WY !WY?+?+9399102#"$5%&546632654"6654&}\`Ly I76654#"6324632#"& 6XaYIZ~w7gwdU urW]oWc@Pt\@:J(FmYkHA+w%(@  OY NY?+?+993310!"&'32654&&'&&546632&#"nGTXJL,`ujᅦx@EC^vr1/^5H>9//P^uskX861UGW@ NY??+310!!!!!syEGsC}@  NY?+?310!"&&547!3267;o y^k\nz@AoD/} @  $  ??99]10!!!3667+Lh~=J3p@4))@$ +  ??9]]31077!6!!47!!(^OP {/3 !UN1r bh蜠>Jl# $@$ + ??9]]10!!!!!PD3{5++}@$??99]10!!!8yyx7 $@OYOY?+9?+910!!7!!!/!C4D?~f  '?2?210!!#37'7'  ??10!!{  '?2?2103#7!!P7w,Z;%9?39/3103!w@9H#{/310!7!_9! /]10#&&'5!R AK@T '@GYGY ??+?+99?1026654&#"!7##"&5463237!52[6(*L{ 8R߇T256#u^AO{NAѳtKU#&@ GYGY?+???+9910"&'#!!3>32"326654S|?1I1&40;J1t2Z5&(1^:@Q}~;-Ѳ^rdANv_T!@  GYGY?+?+10"&54$32&#"3267ߙì{\>jD 9~Ur2[6P1^:=[%O-{O@Ѳru^vaTu!&@LYJYIY?+?+9/+10"&54$32!#3267"32654&#;Oap=j m|(S/39-XSD ,/ ,@ FY FYGY?+?+?39+310"'3267#?6632&#"3#na?6JL++ϬP5c@A#1B+/56xDA7vKYLs2[6P1^:B^%tJ9eÄsu^va@   ?29??102&#"!!3668T6Eg{ j}5Ampa"(@   JY IY?+?+993310#"'32654&'&&54632&&#"{ކ\QDD4hjapWyB3L?G?72(%!#3;:l46+3D,#p?P @ FYGY?+?33+31027#"&547#?!!!7Bu̔T)ډ1 ?T#/CLpXM?`m@ GY ??+?99103267!!7##"&547!-;at 6mw,*']Uj{[RXm @ % ??99]103!3>!"&mI-bRfm)@% *  ??9]]310!67#!!367!3>!H <=iBm.* PISmMv$3 m $@% * ??9]]10!!!!!;L/THB+:m)@"  GY ??+399_^]10!366!#"'32677R+%b`\>.?Wo+m>WC3 IN) m $@FYFY?+9?+910!!7!!!#+C+5e+s)@ !!'?3?393310%3#"&5477654&#2677>33qR%T\5wp7az>QN5ZP #-X牌?@K>M_|C7H`otX9/  #??10!! #(@ "! '?3?393310#>76675&5477654#323"1JIH$ 5{ "6=%Yh:y{7%.;cn 7 >XE<BEQ]` /@  /99//3310"6323267#"&'&&P4}?k=cgC^439k>gaKW<=m)@9m'J@ ' ZY ?+?9/10!!#"&54632HVrW]mYb!`N;k~QKmxOf(@TYVY ??99//3+3+10#7$773&&#"3267Z3 !zmzOb1?h@>;HJJD2#9%cnOE2(N "1@WY UYUY?+?+39/3+3102&&#"3#!!>77#37>RYlB`3#+9kP\H?LY19v&0 1Dr^Jw"98SR`WjJ'@ %/3291047'76327'#"''7&%32654&#".`V`X}++{}`XlN{.V?A[YC@U\\}}+0Rh^\{{)'w{Z^@XY?=ZXL->@ XY @ XY  ??9/3+3_^]299+310!3#3#!7#737#73!%-+))+-#́;́D #??99//10!!!! %/)0;A@"19974++94(!(MY! MY ?+?+93993239910467&&54632&&#"#"&'532654&'&&654&\V&*߸d[A<3A9L\ %n8UaEQ>Izn%-JXJIT5&g3f:+-!)-qc4&i93,4D9/&A(GF"+R13L6RP# /33310432#"&%432#"&PɪXRɨcdXRh}>A}a\>qP%5-@     *"2?3?399//]]3310"327#"&54632&4$32#"$732$54$#"P\X[x~Ϧ\rt\^ţzvrD@R<`\ƞ!%@  ([?2+399//99102373#7##"&&546626654&#"@_6 $Ǫ Y<`9Z`.B$'!'C'&(;V/Vb?xYxM{C5=QA05=L ?  /39/310%=o#{3'R!Z/39/10!!!@Z\qP &69@      +#3?3?399//]339/33910!#!!232654&##4$32#"$732$54$#"Y_ "R N?8qx+`GW, OjdSg[n]B &+'PD+-B4+r! /]1067!!{-cf65m @GY?+??9?10"'#!!32667!!7#!f &5}X-4=.uDMYN?,*4zw'{f/3/39/10####"&53!6Gy33s  ZY/+104632#"&sqRcqV^j}QJuqP#  ?3/10#"'53254'73sMaDKy 1I)%sH   ??93103!67'R"Jwvlfi;Nj @ ([?3+3104&#"326%#"&5432Z 8oK\uC(H,:=da`T!&DC!&+5T!&DvN(&+5T&DK&&+5T-&DR*&+5T#&Dj 0&+55T&DP #&+55T*6@Q@,:!LY::7JY 1GY$IY +GY ??+3/+?+93/+9/+?10"'#7##"&546323736632!#32672654&#""32654&S 8R߇\x25:H|ӂMw:1PM_.*Fdq{B2ѥ-CU%OANy!&(MTR&+5Tu&HM%&+5!&(N R&+5TL&HN%&+5!l&(O5&+5Tu7&HO)&+5!&(QTu&HQ !s&(L+R&+5T!&HL,&+5hs&*KR!&+5{!&JKG&+5h&*NR&+5{L&JND&+5h&*OR"&+5{7&JOH&+5h;&*9 {!&J:HE&+5!s&+KR&+5&KKX p >+5!L,@NY     ?3?399//33333+103#!!!#737!!7!7!1y}y/#[ R-읝╕ 1@ GYLY ?3?99//3+3+9103632!654&#"!#737!!0ck}m-DW`}4! 3vov N?,*=[&,RR&+5-&R&+5&,MR&+5L&M &+5(&,NnR&+5L&N&+5&,Q7&LQ&,OfR&+5m ??10!!!}m3l'-h,w7'ML3s&-KtR&+5!&7K&+5!;&.9;^&N9Zm@    ?2?393310!367!!!3 - OLJeE}m2 wQ5!Qs&/vR&+5E&Ov  p >+5!;&/9?;&O9C!&/8F&O8!!n&/Ox  % >+5`&OO8 >+5 !@  OY ??+993310!7!!'%jZNCgN}\['H @   ??9933107!'%!}Vu}ZVj+߈+߅7!\s&1vPR&+5!&QvL!&+5!;\&19+;&Q9!\s&1LR&+5!&QL#&+5D'Qe!3\@ OY#?+??910"'3267#!!366!jk_``z~5F )|\533UINCJ $@ GYGY?+???+910"'327654&#"!!36632'na89!,|=t}5 7l(/N@++m_Sj{Hh&2MR&+5T&RM&+5h&2NR&+5TL&RN&+5hs&2S7R ,&+55TT!&RSo *&+55h!:@ NY OY  NY NYNY?+?+?+?+9/+10!!# 54$32!!!!!27&#"{h]u%^ajC"/HD:`T5e`e%n)1ڥT*4C@$.LY..+JY   FY IY%FY?+3+?+992/+9/+10"'#"&54$32632!#3267"3254&%"32654&}\|Z;OarRuTQx.M+5'@ NYOY ??9/3+3+3103#!#3!!!'FpypD9EG^?CN!8@FY LY GY?+?339/3+39+310267#"&547#737#?!!!3#3f1ǥl3l#)ڇ/ ?#3!A~5XۜD}&8RR &+5`-&XR1#&+5}&8MR&+5`&XM)&+5}&8NR&+5`L&XN&+5}!&8PuR &+55`&XP &+55}s&8S9R '&+55`!&XS *&+55}&8Q`m&XQ)s&:KR&+5f!&ZK$&+5}s&<KDR&+5!&\K&+5}u&<j=R &+55s&=v;R&+5f!&]v&+5&=OR&+5 7&]Oh&+5s&=LR&+5!&]L&+5 @ GY GY?+?+10"'32676632&#"%na?6JL*Ьvk>;&7 +//:3@ H :@:(GY:3!GY3.??+?+22+99?1067!!#"&546324&#"32626654&#"!7##"&5463237!YA}<\>FFc&$T 2>+5sy `'T( 2>+5 Y'T+ 2>+5&,T 2>+5,7'T2 2 >+5 '<`T  2 >+5'vT %2%%>+5&U !&+555$!%!OY??+10!!!!y5^C)(!(=!+h&@PY  NY NY?+?+9/+10! # 4$4&#"326E}E 2ktikhopoc}3PJ2!y盆,!.} ?3?310!!!!'547#)bk 8JP=cBC!P0!\1 &@OY  NY OY?+?+9/+10!!!!!H}DqA7@`Bh2!@ NY?3?+10!!!!!yy5ks!3 $@OY OY?+9?+910#!!!=9;C#JBj^7}<\1@QY PY??99//3+33+310%7!!7&$%4'66\w^%q%11WUi1hD dZ" ;N !@OY ??339/3+310!!&$547!33!32667!Tm{kER qUY<m{{+LKK%.5+dXa!(@ NY NY ?3+3?+9310"!!&&54$3 !!654&h]c7HRoDm[!RFoRpo@DCLQsF!r:u&,jR &+55}u&<j)R &+55T ^&~T\=&+5)^&T53&+5^&Tf$&+5V^&T*&+5`&U &&+555T #1*@GY$GY+GY?+??+992+102367!327#"&'##"&54626654&#"P8SD3,4P4a5?(Q~j"/IY?o/Y5,1]9. =I^4Qz8(= FI<6иnolCMw_GH)0@ FYGY&GY??+?+9/+91032#"'32654&##32654&#"N@8ã{ZqQ+McWK=J`4,BJ?@kSZ["oT9k|l8|y85͗]ZDX9*$@%FY IY?+?+93310&54$32&&#"#"&542654&' lU83:?argLn4 \o3}3<71)''PTb|vBb-oDL)'?@" & &KY && &&  IY FY ?+?+9/_^]+99910#"3267!"$54675&54$32&&#"33NpxhWQj~jrL>VZZa0./2!3M|@,0)+$+'%B @! IY?+9/33104%##!!654.'&&B&0x?]/ևPd~Ygd.G3|w ղ;Z3An]g_)%(D@ GY ???+9?104&#"!!36632!6,GL&t}5 7l}++rm_Sj{VN`+&@IY IY IY?+?+9/+10#"&546323267"!654n&+-=v*9j8P-Q`4&>/h\<<*ZUxM- !(^5UYx $;vuQmw`m  ??9910!367!!`{+ u%6m(tBP.1@..FY..%/ /(!%!JY%/?+3339/+910#"!654&'&&54675&&5467##!#"3@7=wsXfd[xuhKDsdYJ@R9.WkGQ1E@Ri\ei)M@@v0)hD\ md@=TRNXm!@  FY GY?+??+3310%#"&547#!#77!!327ȞVʹ|'9V @Jd-AVXJRw<%=)%@GY GY?+??+9310#"&'#!>32"326654VrH}--@K+G6V4D6P:s?GrMT!#@ $ GY /?+3310!6654&&'&&54$32&&#"17y6[de]gKEuhoU{3lBCdY^bR9#+7%@vL(,%XTqm@  FY FY?+?+310#"&5!!!%"32654_N<;^.`+-)K\VE!  WxIJ$FK?}- -@ GYGY?+??3+9933102!327#"&''!&&#"66FI+(1CvJ5 /-/=.XqF1)%A:` @GY ??3+3?3?1064'!!&&547!!`` TD u#JJ*p]5c(IQ{12-6Bm'"@FY%?3+39?39/10%#"&5!3267!3254'!!"&+Bv+-0==y?!'`s䉒j\FyO@"fqsMX_I:D}T1,cVx_S;H!N,@PY NY  PY?+??39/+3+10!!!!!!!3232654&##N}y5pKsqsMX_I:DTx_S;H"@NYNY?3?9/++31032!654&##!!!!9ӺNy^ 40yEGAm,$2*sC!s&vR&+5D&6/R&+5!7 @  NY  #?2??+310!!!!!!VZ`erJ7$! &@PY OY  PY ?+?+9/+10!32!!32654&##C'.3MX_I:D{_S;H!%!a)7 "@ NY # NY?+33?3?+10!!36!3#!bbT٪V77 `)@"f}T1,cVJ!P0!+h2!n!3hR&7D@   OY ?+?99310367!#"'3267! -nepcISS(m =gĚ30Q0\s;!7 @ NY#??+3?3103!!!!!d5\1r@ NY ??39/+10!#"&547!3267!s­ hb K<6{6T1J. ;>& jJ! @ NY?+3?33103!!!!!!/rrJ!7@#  NY?+33?33?10!!!!!!!3!^/rr{?&@ PY NYPY?+?+9/+1032654&##32!!!!NX^I:CAE1_S;H2sC! #@PY PY?+3?39/+10!!!3232654&##!y3qsMX_I:D5x_S;HJ!y @PY PY?+?9/+10!!!3232654&##y5qsMX_I:Dx_S;H3@  OYNY NY?+?+9/+9910267!!54&#"6$3 #"'3ChvhZ }}۱L/7rX9,9VG*0!^!2@ NY NYNY?+?+99??9/+10 # 5#!!34&#"3269y5pZ_[db^]G( 5'rؘu= (@ QY PY  ?3?+9/+910!&&54!!!#"33-IA5ys\MdM;==f JwiSMETDV!(1@  !IY GYGY?+?+9/+931036632#"547626654&#"&fx3ZOI/\:+"b0! A}lGSϿ &h]4:J?_(T&-@&&LY&& JY #JY?+?+9/+9102!"$54$32654#7254&#"uXc&H{3B{9' 9Y#c#zSPZ$59{^"&J\%(@! ! #IY#JY?+?+99331066323267#"&5467>54#"QkQT#+;:Z\ˁBJXn#-1vr:2*/->""!7NT)'-@ " "FY GYGY?+?+9/+910#"&546323754&#"663 267&#"ǥuӅV*rYlLiaHj2ZMi>OӶ bU$+'!Ci;FTuHj3=@ ,',GY' $$JY "11GY ?3+3??9/3+3?3+3106323!36$32&#"327#"&5#!##"'32654#"Kt^u^9,MVE3gb2KLsЬ_^:KYF3fb2K^#Q뭓"H-诔!^&-@&%&%LY&& FY IY ?+?+9/+9102654&#"632!"&'3254&##7tc8CIRTy^]Dig6**)",&Vf(vQ0&&Z_7-`mX`V&X6&+5Xm @ ??910!!!!DXp}lmm1@FY GY ??+?+10!!&#"#"'3267>32T}IVO1m-;atG,`(wjhj{[R;,*'QC= m@ GY  ??39/+10327!!##"&&547!-y@-}V oMw@79,*%aNO{ R`Rm)'@  ) %%GY ??3+3?93103267!!7##"&'##"&547!3267HCZ!w;wuAo}& J\nmT%^'majdjd_ng32"32654&G_N+IVO1<!313#?39/310!7!7!7!^'^'1Zm ?10'67!w h 6l>^ ?10!667w\"CXQ/10%!66^2q;;; ?10!&'7#: e pm  ?3210'67!!'67!fm!13X h 6ls>^o ?3210!677!!677w\13YM'I):Yu[vb /2210%!66!!677^2qR3<=V*;;t]sB@   ??9/33310%!!767ˎu>) NJEso c /F)@   ??99//333333106767%!'777!77%k74l< {>7R;8 N>^  u  Vm   ?9/31046632#"&V^r˴vlޠH Jh& 'XP N'5@N)@6L3;""E, ???32?33322310!"32654&#"&54632"32654&#"&54632"32654&#"&54632^A2M54K;qˁlɉy2M54K;ṕlɉ2M54K;ṕlɉJ܂T݁+)P웧n܂T݁,(P웦H܂T݁,(P웦T =L9 /9/10=o3+ /9/10%%i oL1NI" &Z1 ??10!1AJh@  ([?3+9/9910654#"!36632M :,7"= 4lTSoY(BZpM6qR):B2@XYTY TY ??+99//+3+3103#!#73!!!!++3y7}+}jC+F>$K@' XY #$#XY $ $ $UY UY?+?+999//39+33+310>32&#"3#3#!!667#737#7uuYlw^%)-+\H?jZ+-[&0?/A{PR9 OD{ -6@ TY ))%#&&&TY??+99//3333+?310!#!! 32654&##267#"&5467#773!!?e5G@WuJ;;f1+&ڏ8BJz]8SA~[˶YD":5%A@" XYXY VY  UY?+?+99//3+33+310"!!3#3267#"&'#737#73632&M)-+7NKN~+mj/uT>sVx;@R>%A{27NL5@0)" ???32?3210!#"&5432"32654&%"&5432&&#"3267;Vڵֺ'J0GɤI^JOSc?L%-/pTf,@ ?33339/33399310##5!###!!#47#ŪD!@.p!/J$vfH%@ /2/9/3933910"&546632!3267&&#"y1RQHbٓ2Xz#5Fi)|5Buh'@&{  ?555uh'@&u3}  ?555L'@&='`  ?555 '@'?5  ?555)%&@ IY FYFY?+?+9/+10#"&546324&#"6632267&&#"nXfVO<>h{K|% D"1^:EԮ%%[f))/!%me[w @ OY?+93?310#7!!47H-h1 %+7K8VPPRNY/3?+10!!!fsP#f-P  $@NY NY"?+9?+91055!!!-7P dfJ5Z/310!fJVF/3/9/310##!!\#mm=1 ++@ !&& -/39/9/33939910#"'#"&54632663227&#"%"32654&=U\{ABk;X@=?@,36E?DG*35^^FGžƑBKdd;+-5b-<>+*8m ?2?3102&#"#"'326546}n1**ˀjn40&71/808=131ӿN%Dy)/@%%%"  /99//3399//3310"6323267#"&'&"6323267#"&'&7l}iN~Mh2~8jE|Wik~iN~Mc2~8jE|Wjxm 7A8l#74ym 7A8l#8H?'@  /33322310'7#!7!!73!!-j;;Vom?Vff iR% /3/33/2105!%1@-q? /3/33/310%!q?2F)@Pb  ?/99103#PŽ> !!P/7&ILH/+&IOHH5V /2210 7!3267!H?WESaL$T)3H?Z`m GY?+?10"'327!9na88!(/5 ?]1067!#E*j2tE}RQf;=@  /]9/1067!#fM jYVi! /]10!5673JM(D}Z3Z  !?3?310#"&54632"32654Z̘lƀ7N:S^Ժ0;3}H^ @  ??9/933310#!7!7!3!667/qrEwqo> ,{{AF =^9j@  !?3?39/33102#"'532654#"'!!6ĽblLXI\wS3}v6<;2Z TRR3D##@   !?2?39/]393102&&#"3632#"&52654&#"{D:[ r" Tb}Ϩ.$/;!/>! PhNhdz6ED1##D1*\H ??3910!7!\\1)1HLF3X$/+ !%?2?399102#"&5467&&546632654&"654&;.ٺol(8Y ':,*. 7 1%1m3D$#@   !?2?39/]39310"'53267##"&5463 "32654& h7=fs'Tb}ΩX %-:".>!3QeNhgF/##@5*Z #'+/37;?CGS[kt|@O}}vkduullkVKKkk\ ZQQt\\-,  $1'2D=G>(A+B BA>=21  84 95!/39/933333333399/333/39/3/39/3933/310!#%5!#533!5353!5!!5!5!#3#35!#35!35!#35#3#3#"&546323254#"%32##32654&##32654#"'53253Z//momImmmm/oovoooomm~smq/,=.m^{B.$*.1HT;GFBIHCHEVW/2A1R~X11P:/5K6DpJ;?HI>@IH!&7L&+5^ '.88@ GY!2!FY,222((7FY(FY?+?+99//3+3+10#"&&54654#"'63232667.54$323654&#"F8˅d)/e^u099jY?dfW4-bҔIV*M+) tm]+OO"2bzr8DW32&&#"yxXif37a;N#m'1@!!  FY FY?3+39?+339/10%#"&547#77!#!"&%27!32667!Bm':犖_qo+-$2&&y"j\RMU\5O<3mmn..!!Pu&0vT&+5!&Pv2&+5&$[T&D[N+'2\L   /3210#"&546324&#"326xzxx1#%1++#1ruto&..&&..^ ?399//1067!#%4%#"&BAJ7dPJY+&!QNCKmhb-^ ("&8A/7=ALP@+EKHYE?1""($: ( FY@7(3$$FY-GY?3+3?3+3?333+3393??+10"'3267!#"'3267#?6632&#"!76632&#"3#!!%4632#"na?6JK+ݶna?6JL++ϬP5c@A#1K)˲P4b@A#1A+}wk[ctm/=,sMX_I:Dmx_S;H1'$-@IYJY @ JY ?+?39/++310!!632!"&547#37!"32654&:!G_L<)GH1A88G8mأPy^W(#&860;!$=@ "NY  NY NY?+??9/3+39?+910"!!3267# 5#!!3!2&& m0F-e^Sy5pWuhr|s+w$6Z+/ (;>A-h$I@(IY " IY     IY?+??9/_^]+393?+910"&&55#!!36$32&&#"!!3267B}j^}VE&qQl3lBIi!4B;HKk̏Hmf**$NENb4(Zm @ RY ?22?39/+310#!!#!#!|ZNxwL+CJ++FTwm #@ KY  ?33?9/9+310!#!#!!#%R\>KK?hI muum!.@RYRY  ?333?339/++310!!!!!!!#!#!jy5{eZNywL+DTGJ++Fm1@ KYKY ?333?9/99+3+10!#!#!#!!!!#R\>KL?iX}bf>I muufm+y3@RY  ?33?9/333+93910!&'!!77!!#]kk'I{{4X=VL#"/}\= VOc`17a-Xum3@  LY ?33?9/333+93910!!6677!!&&'7!}^\.G;}S"J^5 3VH Od^T* Da! N @@! RYRY ?333?3/9/++9393310!&'!!7!!!!7!!]jj)H{{4X=VL;y5{##/}\= VOc`Va-m">@ !!!LY KY?333?39/33++93910!!67!!!!7!!&&'7!^\/I8}+X}b#H^6 3VH T^J1fm+C* DaMS@+E7RYEE2? *OYJ2! @ QY$?3+_^]29|/9?39/+99?9/+104&##32654&#"667&&'536632&#"32772&&#""&54$%66DP\Å}b&0@v&w]M'$)?{Bˮ|{l332&#"372&&#"#"&546676654&##mtc8CIRTv"Pv&[nrDJ+&(,Z9y^]VT8Wd@/X[l~eig**)",&.Fxv2]N* %5>f(vQ%,%! - ^*'7-Nu`h &@PYPYPY?+?+9/+10 # $267!4&#"!c#d2Pkd`8G*  NnT 0@LY  JYJY?+?+9/_^]+10"&54$32"!54&267! "9f-=7fSoZ/MMkW)@ NY??9?+10!!!3667>32&#"Lh~8Ll4m+B8S#3pBCOCDX@ GY??9?+10!!!366776632&#"m|$m\cC)5-B mI-g&ʔ'7>s&vR $&+55X!&v !&+55h &2\T &R\h1,0@* '%%NY@ NY ?3+3?3+399104$7632#"&'&4'#"&'6326h3x*H S;+F b"t%@ork&ClB p:4"v"<;<506?e,(F͡4h)%E+T -0@+ %FY@(%%FY ?3+3?3+39910#"&'&&54$76324'#"&'663266 ?=64 ō!\e: N<*BHY= E;'@Lb۶;89<-`bu3EDM-9tq,=BA25h+2CW_@5WFF@OOR@A@APA`AA A6A6KKR )")NY""00NY?3+39?9/3+3/399//_^]]9/31032654#"632#"&'#"$32&&#"326#5654'&&54632#".#"#663237 ha[V^Д(6B_M-A"`SSeiݭ3##bSK]63GygU$15@zz|BXCmR]iWo+3:*~<{hB %&-@U. & 4;&-&T2CWM@&WFFOK66#AAKKR@O# )#)GY#00FY?3+39?39/+3239/9310326654&#"632#"'#"&54$32&#"326#5654'&&54632#".#"#66323q[BKvI:696V~{hMKfו D*r10Ak=DMK}ݭ3##gNK]63GygU$15@zz|B[Sa`TZ=hɒD=J"^peW_]{hB %&/>V/ ' 4;&-&h+D CA@ &&3NY   @8A-""NY??3+39?32222/+39/10#'##'##'7"$32&&#"3267!32654#"632# 'o`ZB`[A^)B_M B.aS[f:: ua[V^I9Dgggg0 3:,uw ,<qCmR\jX#+@##! ?2?3399332222/103!!6!!#'##'##'7}'#fa"8) o`[A`ZB^)mxco6^qZffffhT@NY NY  ??+?+10"3267!&$32&&qmbz77T!@ GYFY??+?+10&&54$32&#"327kƩ{\@iCop!OP<`h33}  ?/10%'7'77'77' ݒۋ݋܁{D /22310#"&5463!6632#IB=BZPEG>A\N2,=8E\0/>7G[D;@ ?O_ /]29310267632#75&#"##7oJnZLw @c?3'0&~8, G 1#;o /3104632"&;rAf<%0) "'ips /310#56654'&&54632lthY4#"fNK]YHi .&% %&0=V (6DR`n_@-e^WkhSaahIA;O7EE>LLZ-%3))"00ZZhh  /32/329/39/3332229/33322233222102#&&#"#662#&&#"#662#&&#"#66!2#&&#"#662#&&#"#66!2#&&#"#662#&&#"#66!2#&&#"#66gs3Gxwags3G<>whs3G9@whr6D;?whs3G<>whr3G<>wks3G<=wjs3G<>wp^"A]qp^"! ]qp_!!#Zur]" $Yvp_"! Zur]"! Yvr\"! Yuq]"! ]qm $,4;0@ 96*&&6$14!$/3/3933333310767'&'7'667%&''6673&&'5#677&'}"QF[k+|+FUA}i^ I*cFEӋ F$*ۄOF|i^+|"TDx5)}:GA' I 2dBO ,N4!7 +@# @NY?3+?32299?10 !3267!#!!3!!!#6;FLXKa L#$j5d@R? +}]]`Z#^``qV*/@"' $@ GYGY?+?+?3922?10!7##"&547!3267!!!"&'!3267!>m-;at>{߁FMWKa L"jhj{[R;,*')ټ`Z`Z!y/@PYRY  PY?+?99//3+3+10!!#37!3#3232654&##y݋=>sMX_I:Dvx_S;HL$7@JYIY   JY ?+?99//_^]3+3+10!!632!"&547#37!"32654&:RG_};)yH1A87H8Z}ؤYpK]"#&860;!J&@ OY OY  ??9/9++910'##!! 654&##3'7J5FJ`dy5E4TJHq+@s^ :T:I^^(,@'GY  'GY?+???9+910"&'#!!36632'654&#"'c8 ,3}X5 7lͪ19@MIDWt" R}Qv;y` 5{#!-@NYOY  NY ?+?9?+9/+10632#"'32654&#"!!!Jl8ӛxnM4^y5^C)3B1Ӿs BZm-@FYGY  FY ?+?9?+9/+10632#"'32654&#"!!!(0̢vxgZG} C{oΥ0)6Yhm}7-@#   PY?33+?3399333?10!!!!!!#!7Be~1TT+P1`j3B@#,',GY' $$JY ""11GY ?3+3???9/3+3?9+3106323!36$32&#"327!&#!##"'32654#"Kt^u^9,MVE3eFG;@p_^:KYF3fb2K^#Q]O\TH-诔&!^&!7#@ # PY?3+?3993?10!!!!!#?y5d1T+P`Xm#@  GY "??3+?399310!!!#!!Ddop}lm)m!/+@    ?3?93939910!!373!!#}dqy5J!n2Iy37#0%@ om@   ??9107!!#'!!73/@M%N@t}sqB knmw5! +@OY   ??9/9993+3310!!!#37!3#!JgdyۍE`F`=)#@hh#^+@  LY??9/3+3?39310#737!3#367!!! 43$(1 TEJeE}򮿄I5 @ NY ??+910!!!!!RxE +1sCBm @  FY?+?910!!!!B=ymCXq}J# J!7$@ NY  PY #??3+?39/+103!!!!!!!d}y5p\p1T`Xm$@ IY  GY "??3+?39/+103!!!!#!VXf\^}mf)Hm! #@ NY  NY ?3?3+9/+10!!!!!!Hy}y5p\pT m #@ IY  FY ?3?3+9/+10!!#!!3 =}\^}VXmHmf!/@NYNY  NY ?+?99?+9/+10632#"'32654&#"!!!!-h:ќxnK4^yy5k3B1Խs Bsm2@FY FY  IY ??+9/+?+9910"!#!!632#"'32654&wH}ߴ}m(0ˣvxfTRmΥ0)6Zgh 88@RY$++0NY+QY$$7OY$?++?+9/+9106654#"&&5432327#"&'# $32&#"32'K[T8?&ײћ3AWt;f>-?bt`E]sd`V24Iut\-MѴa 71% !}T9 78@LY$++0IY+JY$$6IY$?++?+9/+910"6654&&546323267#"&'#"&54$32&#"32*6>E+#κgW+OYpX3f'aIR8?=e?q+XEHI a6.,P`רp. 2,"FnmhR&&T!&F7 @ NYPY#??+?+3103!!!!!eEG1sC`P53@."  GY /*IY/?33+??3+393?104&#"!654#"!!3663236632327!&5476& J[o}HD[ v}5=suAo%H,n4(*wZ^mr]kdjediH= 3,7S8}<Xm@  ??3?9910!!3>!}f"&mI-bR'}%@ OY  ??39/39+310!!!!7!!7!8 !E-y-C @ m!@  FY??3+3?9910!!!7!!!3>!o>)})="&#mI-bR7@PY  #???9+10!!#!!!f>dĒD3{51++` m@ " GY ??9+?10!!!!!#!;L/e3nHB+:)7%@ NY #NY?3+3??+310!!!!!3!!EHesCr{B`m%+@# FY  GY"??+3?9+3103267!327!&'##"&547#!#f3%HztG,wYDs?=;=Aw,*'QC= 3(wjhov8#R7"@NY PY#??+?39/+10!!#"&547!3267!ds­ hb K<6{61T1J. ;>& j{`m"@GY GY "??+?39/+1032677!3!!##"&5466!-HT-dV =xG B9,*)5,XUIR'@NY??9/93+910%#"&547!367!!B- hb LCBQ8ys7XH61J. U8#jJ m'@ GY  ??9/93+910%7#"&547!73667!!#) &79'65'5>}V *3w R;6h`!)@ NY ?3?9/+10632!654&#"!s iwb L<6{6y1T8C3;>%!Xm@ GY ?3?9/+104&#"!!3632!6-@U#-}V n;}9++md`szRV!*1@ !%!QY%% "NY NY ?+?+9/33+310327# 5$47!!2!#"32654je^PwJ1nPzDJT`)wF$!+/4hoQ&S<Ͳ;u]Ub#-5@ 'LY ''$JYIY?+?+9/33+3910"&5&&54673632!#3267"32654&띨"'->EE@"fD}T1,cV` $@FYGY GY"??+?+?+10!!&#"#"'3267>32{IVO1{Hmf)7&@#NY PY ?3?+9/+?107#"&547!3267!!!%1­ hb K<6{6c1T1J. ;>& jJ7`m&@"GY GY ?3?+9/+?107##"&5477!327!!!+ .Wu!0-wAT7(8~v7++%q`!7!@NY   #???93+10!#677#!#!!3!@u2:Cq5D%@__!`^m#@"GY   ??93+?10#!#!!3!!!!676/ "H/ l={G"1um)L^,&$6mR&+5TV&D6 &+5/u&$jR  &+55T#&Dj 0&+55T!,&(6R &+5T,V&H6"&+5! &@QY NY NY ?+?+9/+104&#"63 #"&54!3267#"TrgMuhDUa{)CFGʴšt`Sb-N!&@ LY JYIY?+?+9/+102#"&54$!354#"66267#"ݿ:&L/ωV>?>J3Qv;y` 5jx2-cl##@PY OY/+??9+10!#"'32667#!!!fTT/ωVK2ĒD3{51b2/eh++ m#@GY IY ??9+/+10!!!!#"'32667#!;L/o`L/ωV@=>J3HB+:x2-cl-@OY?O  ??99/]3+3910!!#3!!3 PDDr>RF55@A m)@FY  ??9/99993+310!#3!!3#!);V?ǞD@ĬTm#aX^B @ OYOY??+9/+104!3!! $#"33BX$Rm8VtI>;JbN9ITGB&)@ OY  ##OY?3+39?99//+10"'#"&54!3!3267!#"3267mvR*Rm("1=T^-+ct7-.6nn^f5+>Q9n_:?/#T#04@ +GY $GYHY?+?+?+999/?10"&'# 46323767!32677!26654&#"u34WwֆQv7> ,::-?/;V0.*1X62B4@qES%O-5%#Cr7`uAOsbX15@ OY'',,#NY, OY?+?+99//+99104&##32654&#"6!23267!#"&546bsD{UMENFoȱ ("1=T^- FE8HK17:. Xgq:+>Q9˿ 4J*4@IY$LY  HY ?+?99//+9+9102677!#"&54&##732654&#"6632:;-@._qe5stc8CuTgwycV+9DqȿD9**)"?$ f(aQ%#Z7(3@OY%OYPY#??+?9/+9+9103!!654&##32654&#"6$32 dHC[U[6h5zȱqAhDg*FE8DI.@@(JT]_!xJ`%4@ LY##GY#!" IY?+??+9/+99104&##732654&#"6323!!6-ih5sd9BKLTyaYn= m7-**)".$Vf(VG4$)I(+@OY"NY" OY?+3+?+9/10#"'32667!3267!#"&546'5HQJ-&5>@"f("1=T^- }T1,cV^j1+>Q9˿)[-.+@))FY) HY !GY?+3+?+9/1032677!#"&547&#"#"'3267>32,::-?/ VIVO1Q9˿Ew>^jm&@HYIY??399//+?+10!!3!32677!#"&547^}VX ,::-?/Hmfh5%#CrȽMh&@PY NY NY?+?+9/+10!! $3 &#"327!'@ ymn@X, kZ䡊~T&@IY GY FY?+?+9/+10#"&54$32&#"3267#-<;ͼ{zzGDD`=FPQ9˾Rj_CfB m%@ HYFY?+3?+9/10!!!32677!#"&547`==P ,::-?/J#5%#CrȽ3D5?)4@ OY&OY   OY?+?9/9+9+9104$!2&&#"33#"3267#"$54675&&:zHZQahAVurljuӧr'AM08?1L?TXGJ,41'ε2)~)$*@#OY#OYPY OY/+?+?+?+10!#"'32677!##"'32667!)T.ωV@"f1b2dm+}T1,cV**@'FY'GYIY GY/+?+?+?+103#"'32677#&#"#"'3267>32K.ωV@=X[ IVO1TZ!;N:L:j @   /3]991067!#''#%67!#VHT;FG?Z+9Sڭ~OW@f? (!@   /]92910&&'7!67!#''#q?f% 1}VHT;FG7x* mj Sڭ~OW@f@ /]9/239107254#"563267!#'#X y-72WM]FQj[HTT:'WI4W@Xխ~K[ $7@  "@ H""//]]23/+23910667!#&'#"&'&#"#66323273G.2iL5`sJ)<&A(/}i00H"? ~96w=:?89#- $K} @  @ H /2+3310!"&547332767!#? ]i(?Z 8-"PG?? )  @  @ H /2+3310!"&5473327&&'7!? ]i(@c 0-"PGP7x* mk  @ O_ /2]23310!"&54733277254#"5632? ]i( ^%)!-N~-"PGZj-ya3&'@##@ H! /3]22+299//10#"&547332667'"&'&#"#66323273Ĩ SsTW< ^)<&A(1un1LJ Ct{I:81#$"{m%%Ewp! //3102654&'3#"'5X8;#BِwEH+3(PSsz +1 /3/10#"'3267+T/ψX54&#">32!1H;$*x|`~^_qI,&bT.u50(-@WY && TY&& TY %?+?+9/+910!"&'32654&&##32654&#"'66320tBҊ6vkT5NH?u~=!~)&Ld]W66#]Q.8TQCL %@ VY$??9/3+39910%#!!!3!667#HI8`8&#VPTځDf`+@VYUY TY%?+?+9/+3102!"&'3 54&#"'!!6Uρ6OReV5t"z-D);#,'D-3L^ \M@ UY$??+910!!F3oG1,cj$-@ VYVY& VY%?+?+9/+910#"'3267##"&54632"32654&js`\o(;`/Ia\Jf7;:%_Oܺ feBP'=8@: ( FY7(3$$FY-GY?3+3?3+3?33+3310"'3267!#"'3267#?6632&#"!76632&#"3#na?5KK+ݶna?6JK+)˲P4b@A#1K)˲P4b@A#1A+/)3QIet1=*0uJiq+5u&jOR &+55u&jOR &+55b&fR &+5&g2I6$$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs) $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q  q q q           ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q   q   q    q q  q  !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) -&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq7$&q&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq$q$ q$&$*$- $2$4$7q$9$:$<$$$$$$$$$$$$$$$$$$$$$$q$&q$6$8$:$G$$$$$q$ q$_$I$K$M$O$Q$S$U$W$Y$[$]$_$o$q$s$q%%%$%7%9%:%;%<%=%%%%%%%%%%%$%&%6%8%:%;%=%?%C%%%%%%% %X%%%!%#%%%'%)%+%-%/%1%3%o%q%s%&&&*&2&4&&&&&&&&&&&&&&&&&&&&G&_&I&K&M&O&Q&S&U&W&Y&[&]&_'''$'7'9':';'<'='''''''''''$'&'6'8':';'='?'C''''''' 'X'''!'#'%''')'+'-'/'1'3'o'q's'(-{)))"))$))))))))))C)) )X)))!)#)%)')))+)-)/)1)3.&.*.2.4....................G._.I.K.M.O.Q.S.U.W.Y.[.]._/\/ \/&/*/2/4/7/8/9/:/</////////////////////////$/&/*/,/./0/2/4/6/8/:/G/////\/ \/_/a/I/K/M/O/Q/S/U/W/Y/[/]/_/a/c/e/g/i/k/m/o/q/s/222$27292:2;2<2=22222222222$2&26282:2;2=2?2C2222222 2X222!2#2%2'2)2+2-2/21232o2q2s2333$3;3=3333333333;3=3?3C33 3X333!3#3%3'3)3+3-3/3133444$47494:4;4<4=44444444444$4&46484:4;4=4?4C4444444 4X444!4#4%4'4)4+4-4/41434o4q4s47777")7$q7&7*727477)7D\7Fq7Gq7Hq7Jq7P7Q7Rq7S7Tq7U7V7X7Y7Z7[7\7]7q7q7q7q7q7q77777777q7\7\7\7\7\7\7q7q7q7q7q7q7q7q7q7q7q777777q7\7q7\7q7\77q77q77q77q7q7q7q7q7q7q7q77q77q77q77q7777 77q77q77q77q7777!7$)7&)7+7-7/717375777<7>7@7Cq7D\7F\7G7Hq7J7777777 7W7Xq7Y\7_7`q7b7q7\7q7 \7!q7"\7#q7%q7&\7'q7(\7)q7*\7+q7,\7-q7.\7/q70\71q72\73q74\76q78q7:q7<@<C<D<F<G<H<J<< <W<X<Y<_<`<b<<<< <!<"<#<%<&<'<(<)<*<+<,<-<.</<0<1<2<3<4<6<8<:<<<@<B<D<I<J<K<L<M<N<O<Q<R<S<T<U<V<W<X<Y<Z<[<\<]<^<_<`<b<d<f<h<j<l<n=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_>-DD DD EE EYEZE[E\E]EE7E<E>E@EEEE EpF)F )F)F )HH HYHZH[H\H]HH7H<H>H@HHHH HpI{I {I{I {KK KK NFNGNHNRNTNNNNNNNNNNNNNNNNNNNNNNNNNNNNHN`N6N8N:N<N@NBNDNJNLNNNRNTNVNXNZN\N^N`PP PP QQ QQ RR RYRZR[R\R]RR7R<R>R@RRRR RpSS SYSZS[S\S]SS7S<S>S@SSSS SpURU RUDUFUGUHUJURUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUDUFUHURU RUYU`UU U"U&U(U*U,U.U0U2U4U6U8U:U<U@UBUDUJULUNURUTUVUXUZU\U^U`W)W )W)W )YRY RYYY")YRYY RY ZRZ RZZZ")ZRZZ RZ [F[G[H[R[T[[[[[[[[[[[[[[[[[[[[[[[[[[[[H[`[6[8[:[<[@[B[D[J[L[N[R[T[V[X[Z[\[^[`\R\ R\\\")\R\\ R\ ^-q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq-{&*24G_IKMOQSUWY[]_-{-{-{-{$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjln$;=;=?C X!#%')+-/13             YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p   YZ[\]7<>@ pR R")R R  YZ[\]7<>@ pR R")R R q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  &*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_$79:;<=$&68:;=?C X!#%')+-/13oqsR R "@E=K=N=O=`={R R$79:;<=$&68:;=?C X!#%')+-/13oqs-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p  &*24G_IKMOQSUWY[]_FGHRTH`68:<@BDJLNRTVXZ\^`FGHRTH`68:<@BDJLNRTVXZ\^`\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqsR R "@E=K=N=O=`=R R\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs  $79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs-{R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`$$$$")$$q$&$*$2$4$7)$D\$Fq$Gq$Hq$Jq$P$Q$Rq$S$Tq$U$V$X$Y$Z$[$\$]$q$q$q$q$q$q$$$$$$$$q$\$\$\$\$\$\$q$q$q$q$q$q$q$q$q$q$q$$$$$$q$\$q$\$q$\$$q$$q$$q$$q$q$q$q$q$q$q$q$$q$$q$$q$$q$$$$ $$q$$q$$q$$q$$$$!$$)$&)$+$-$/$1$3$5$7$<$>$@$Cq$D\$F\$G$Hq$J$$$$$$$ $W$Xq$Y\$_$`q$b$q$\$q$ \$!q$"\$#q$%q$&\$'q$(\$)q$*\$+q$,\$-q$.\$/q$0\$1q$2\$3q$4\$6q$8q$:q$&@&Cq&D\&F\&G&Hq&J&&&&&&& &W&Xq&Y\&_&`q&b&q&\&q& \&!q&"\&#q&%q&&\&'q&(\&)q&*\&+q&,\&-q&.\&/q&0\&1q&2\&3q&4\&6q&8q&:q&(@(Cq(D\(F\(G(Hq(J((((((( (W(Xq(Y\(_(`q(b(q(\(q( \(!q("\(#q(%q(&\('q((\()q(*\(+q(,\(-q(.\(/q(0\(1q(2\(3q(4\(6q(8q(:q(8@8C8D8F8G8H8J88 8W8X8Y8_8`8b8888 8!8"8#8%8&8'8(8)8*8+8,8-8.8/808182838486888:8<8@8B8D8I8J8K8L8M8N8O8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8b8d8f8h8j8l8n9R9 R999")9R99 R9 :::"):$:&:*:2:4:D:F:G:H:J:P:Q:R:S:T:U:V:X:]:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::!:+:-:/:1:3:5:<:>:@:C:D:F:G:H:J:: :W:X:Y:_:`:b:::: :!:":#:%:&:':(:):*:+:,:-:.:/:0:1:2:3:4:6:8:::<:@:B:D:I:J:K:L:M:N:O:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:^:_:`:b:d:f:h:j:l:n;&;*;2;4;;;;;;;;;;;;;;;;;;;;G;_;I;K;M;O;Q;S;U;W;Y;[;];_=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_?&?*?2?4????????????????????G?_?I?K?M?O?Q?S?U?W?Y?[?]?_CqC qC&C*C- C2C4C7qC9C:C<CCCCCCCCCCCCCCCCCCCCC$qC&qC6C8C:CGCCCCCqC qC_CICKCMCOCQCSCUCWCYC[C]C_CoCqCsCqDD DD E-{GGG$G7G9G:G;G<G=GGGGGGGGGGG$G&G6G8G:G;G=G?GCGGGGGGG GXGGG!G#G%G'G)G+G-G/G1G3GoGqGsGVqV qVfVmVqqVrVsVuVxVqV qVT[[[V[_[b[d[i[p[q[r[t[u[x[[[ [T\\\V\_\b\f\i\m\s\v\y\z\{\|\}\~\\\\\\\\\\\\\\\\\\\\ \!]q]r]x]T^^ ^^ _q_ q_f_m_qq_r_s_u_x_q_ q_T```V`_`b`i`t`` aaaaV\a_\ab\afai\amasavayqaza{a|a}a~qaaaaaaaaaqaaqaqaaqaaaaaqaaaaaaa a!aSbqb qbfbmbqqbrbsbubxbqb qbTdfdmdsfffVf_fbfdfifpfqfrftfufxfff fThfhmhshhiqi qifimiqqirisiuixiqi qiTmmmVm_mbmdmimpmqmrmtmumxmmm mToooVo_obodoiotooo qqqqV\q_\qb\qfqi\qmqsqvqyqqzq{q|q}q~qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq q!qSrrrVr_rbrfrirmrsrvryrzr{r|r}r~rrrrrrrrrrrrrrrrrrrr r!sssVs_sbsdsispsqsrstsxsss sTtftmtsttuuuVu_ubufuiumuu vqvrvxvTxxxVx_xbxfxixmxsxvxyxzx{x|x}x~xxxxxxxxxxxxxxxxxxxx x!y){{ {{ || |||| ~) y~     y~ y~         y~       n| q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqql~    n|   n|   n| l|~  qff jlrqs~ffqqq q  q q qqq qn|q qq  r|  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq)l|~    l|~   rsz|  rsv  l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqqqff jlrqs~ffqqq q  q  rsz l|~  ))  n|   n|  rsz|  rsz|   ) js      j  )j       js   s  j        m  m         js    m  m  j   sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R 7$&q7$&q7$&q$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q                        q  q  q                             ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q    q    q    q q  q   !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) & * 2 4 7q 8 9 : <                         $q &q * , . 0 2 4 6 8 : G f m qq r s u x  q  q   q  \ q        T _ a l |\ ~        q    q    q  \  \    \     \        q  I K M O Q S U W Y [ ] _ a c e g i k m o q s q!q!r!x!TSSSS TTTVT_TbTfTiTmTsTvTyTzT{T|T}T~TTTTTTTTTTTTTTTTTTTT T!XqX qX&X*X- X2X4X7qX9X:X<XXXXXXXXXXXXXXXXXXXXX$qX&qX6X8X:XGXXXXXqX qX_XIXKXMXOXQXSXUXWXYX[X]X_XoXqXsXqYY YY ZZZVZ_ZbZdZiZpZqZrZtZuZxZZZ ZT`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`RbIfbWfbYfbZfb[fb\fbfb%fb'fb7fbfbfb4fb5fb]fb^fbpfbfbfjj jj llllllllllllllllllllll lrlslzl|lllllllllllllllllllllllllllll llllllmmmmmmm msmmmnn nnnnnnnnn n|nnnnnnnnnnnnnnn nnnoo ooooooooo omooooooooooooooooooooooooooopppppplp~ppppppppppppppppp p ppprqr qrrrqrrrrrrrqr qrnr|rrrrrrrrqrrrrrrrrrrrrrrrrrrr qrrqrrrsqs qssssssssssssqs qsjsms}sssssssssssssssssssssssssssss s ssssstqt qtttqtttttttqt qtnt|ttttttttqttttttttttttttttttt qttqtttuqu quuuuuuuuuuuuqu qujumu}uuuuuuuuuuuuuuuuuuuuuuuuuuuuu u uuuuuv vx xzzzz zzzzz z|q|q||||||||q| q|r|s|||||| | ||||}} }}}}}}}}} }}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~ ~r~s~z~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~  qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  s s s rsz|    rsz|    rsz|  sl~  )    |   m rsv    )))))) jklqrsuwy}~)))))    ) js   f |   l{=}~j    )l{=}~j  l|~  j  l|~  j  l|~  j  )  )))))) jklqrsuwy}~)))))    ) js  \ \fH\ \|qqH HHq qq qmqq   l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )) jklqrsuwy}~))     s)) jklqrsuwy}~))     sl{=}~j  )  )    |         l|~  j   f m| )  )  )  q qqq qn|q qq  q qqq qn|q qq       rsz|    rsz|   l|~  j    )   rsz|    rsz|    rsz|    rsz|   qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )))))) jklqrsuwy}~)))))    ) js  l{=}~j  l|~  j          q             r v |       q                                                                           q             r v |       q                                      )   q rv|q    q rv|q    r    r|   )  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq     !q! q!&!*!- !2!4!7q!9!:!<!!!!!!!!!!!!!!!!!!!!!$q!&q!6!8!:!G!!!!!q! q!_!I!K!M!O!Q!S!U!W!Y![!]!_!o!q!s!q"" "" #q# q#&#*#- #2#4#7q#9#:#<#####################$q#&q#6#8#:#G#####q# q#_#I#K#M#O#Q#S#U#W#Y#[#]#_#o#q#s#q$$ $$ %q% q%&%*%- %2%4%7q%9%:%<%%%%%%%%%%%%%%%%%%%%%$q%&q%6%8%:%G%%%%%q% q%_%I%K%M%O%Q%S%U%W%Y%[%]%_%o%q%s%q&& && 'q' q'&'*'- '2'4'7q'9':'<'''''''''''''''''''''$q'&q'6'8':'G'''''q' q'_'I'K'M'O'Q'S'U'W'Y'[']'_'o'q's'q(( (( )q) q)&)*)- )2)4)7q)9):)<)))))))))))))))))))))$q)&q)6)8):)G)))))q) q)_)I)K)M)O)Q)S)U)W)Y)[)])_)o)q)s)q** ** +q+ q+&+*+- +2+4+7q+9+:+<+++++++++++++++++++++$q+&q+6+8+:+G+++++q+ q+_+I+K+M+O+Q+S+U+W+Y+[+]+_+o+q+s+q,, ,, -q- q-&-*-- -2-4-7q-9-:-<---------------------$q-&q-6-8-:-G-----q- q-_-I-K-M-O-Q-S-U-W-Y-[-]-_-o-q-s-q.. .. /q/ q/&/*/- /2/4/7q/9/:/</////////////////////$q/&q/6/8/:/G/////q/ q/_/I/K/M/O/Q/S/U/W/Y/[/]/_/o/q/s/q00 00 1q1 q1&1*1- 121417q191:1<111111111111111111111$q1&q16181:1G11111q1 q1_1I1K1M1O1Q1S1U1W1Y1[1]1_1o1q1s1q22 22 3q3 q3&3*3- 323437q393:3<333333333333333333333$q3&q36383:3G33333q3 q3_3I3K3M3O3Q3S3U3W3Y3[3]3_3o3q3s3q44 44 5-{66 6Y6Z6[6\6]6676<6>6@6666 6p7-{88 8Y8Z8[8\8]8878<8>8@8888 8p9-{:: :Y:Z:[:\:]::7:<:>:@:::: :p;-{<< <Y<Z<[<\<]<<7<<<><@<<<< <p=-{>> >Y>Z>[>\>]>>7><>>>@>>>> >p?-{@@ @Y@Z@[@\@]@@7@<@>@@@@@@ @pA-{BB BYBZB[B\B]BB7B<B>B@BBBB BpC-{DD DYDZD[D\D]DD7D<D>D@DDDD DpIII$I7I9I:I;I<I=IIIIIIIIIII$I&I6I8I:I;I=I?ICIIIIIII IXIII!I#I%I'I)I+I-I/I1I3IoIqIsIJJ JYJZJ[J\J]JJ7J<J>J@JJJJ JpKKK$K7K9K:K;K<K=KKKKKKKKKKK$K&K6K8K:K;K=K?KCKKKKKKK KXKKK!K#K%K'K)K+K-K/K1K3KoKqKsKLL LYLZL[L\L]LL7L<L>L@LLLL LpMMM$M7M9M:M;M<M=MMMMMMMMMMM$M&M6M8M:M;M=M?MCMMMMMMM MXMMM!M#M%M'M)M+M-M/M1M3MoMqMsMOOO$O7O9O:O;O<O=OOOOOOOOOOO$O&O6O8O:O;O=O?OCOOOOOOO OXOOO!O#O%O'O)O+O-O/O1O3OoOqOsOQQQ$Q7Q9Q:Q;Q<Q=QQQQQQQQQQQ$Q&Q6Q8Q:Q;Q=Q?QCQQQQQQQ QXQQQ!Q#Q%Q'Q)Q+Q-Q/Q1Q3QoQqQsQSSS$S7S9S:S;S<S=SSSSSSSSSSS$S&S6S8S:S;S=S?SCSSSSSSS SXSSS!S#S%S'S)S+S-S/S1S3SoSqSsSUUU$U7U9U:U;U<U=UUUUUUUUUUU$U&U6U8U:U;U=U?UCUUUUUUU UXUUU!U#U%U'U)U+U-U/U1U3UoUqUsUXIRXWRXYfXZfX[fX\fXfX%RX'RX7fXfXfX4RX5RX]RX^RXpfXRXRZIRZWRZYfZZfZ[fZ\fZfZ%RZ'RZ7fZfZfZ4RZ5RZ]RZ^RZpfZRZR\IR\WR\Yf\Zf\[f\\f\f\%R\'R\7f\f\f\4R\5R\]R\^R\pf\R\R^IR^WR^Yf^Zf^[f^\f^f^%R^'R^7f^f^f^4R^5R^]R^^R^pf^R^R`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`Raaa$aaaaaaaaaaCaa aXaaa!a#a%a'a)a+a-a/a1a3fIffWffYffZff[ff\ffff%ff'ff7ffffff4ff5ff]ff^ffpfffffhIfhWfhYfhZfh[fh\fhfh%fh'fh7fhfhfh4fh5fh]fh^fhpfhfhfjIfjWfjYfjZfj[fj\fjfj%fj'fj7fjfjfj4fj5fj]fj^fjpfjfjflIflWflYflZfl[fl\flfl%fl'fl7flflfl4fl5fl]fl^flpflflfnIfnWfnYfnZfn[fn\fnfn%fn'fn7fnfnfn4fn5fn]fn^fnpfnfnfooo")o$o&o*o2o4oDoFoGoHoJoPoQoRoSoToUoVoXo]oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooo!o+o-o/o1o3o5o<o>o@oCoDoFoGoHoJoo oWoXoYo_o`oboooo o!o"o#o%o&o'o(o)o*o+o,o-o.o/o0o1o2o3o4o6o8o:o<o@oBoDoIoJoKoLoMoNoOoQoRoSoToUoVoWoXoYoZo[o\o]o^o_o`obodofohojolonpRp Rppp")pRpp Rp qqq")q$q&q*q2q4qDqFqGqHqJqPqQqRqSqTqUqVqXq]qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqq!q+q-q/q1q3q5q<q>q@qCqDqFqGqHqJqq qWqXqYq_q`qbqqqq q!q"q#q%q&q'q(q)q*q+q,q-q.q/q0q1q2q3q4q6q8q:q<q@qBqDqIqJqKqLqMqNqOqQqRqSqTqUqVqWqXqYqZq[q\q]q^q_q`qbqdqfqhqjqlqnrRr Rrrr")rRrr Rr sss")s$s&s*s2s4sDsFsGsHsJsPsQsRsSsTsUsVsXs]ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssss!s+s-s/s1s3s5s<s>s@sCsDsFsGsHsJss sWsXsYs_s`sbssss s!s"s#s%s&s's(s)s*s+s,s-s.s/s0s1s2s3s4s6s8s:s<s@sBsDsIsJsKsLsMsNsOsQsRsSsTsUsVsWsXsYsZs[s\s]s^s_s`sbsdsfshsjslsntRt Rttt")tRtt Rt { {{ {")$q&*247)D\FqGqHqJqPQRqSTqUVXYZ[\]qqqqqqq\\\\\\qqqqqqqqqqqq\q\q\qqqqqqqqqqqqqqq qqqq!$)&)+-/1357<>@CqD\F\GHqJ WXqY\_`qbq\q \!q"\#q%q&\'q(\)q*\+q,\-q.\/q0\1q2\3q4\6q8q:q?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~.notdefnullnonmarkingreturnspaceexclamquotedbl numbersigndollarpercent ampersand quotesingle parenleft parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon semicolonlessequalgreaterquestionatABCDEFGHI.altJKLMNOPQRSTUVWXYZ bracketleft backslash bracketright asciicircum underscoregraveabcdefghijklmnopqrstuvwxyz braceleftbar braceright asciitildenonbreakingspace exclamdowncentsterlingcurrencyyen brokenbarsectiondieresis copyright ordfeminine guillemotleft logicalnotuni00AD registered overscoredegree plusminus twosuperior threesuperioracutemu paragraphperiodcenteredcedilla onesuperior ordmasculineguillemotright onequarteronehalf threequarters questiondownAgraveAacute AcircumflexAtilde AdieresisAringAECcedillaEgraveEacute Ecircumflex Edieresis Igrave.alt Iacute.altIcircumflex.alt Idieresis.altEthNtildeOgraveOacute OcircumflexOtilde OdieresismultiplyOslashUgraveUacute Ucircumflex UdieresisYacuteThorn germandblsagraveaacute acircumflexatilde adieresisaringaeccedillaegraveeacute ecircumflex edieresisigraveiacute icircumflex idieresisethntildeograveoacute ocircumflexotilde odieresisdivideoslashugraveuacute ucircumflex udieresisyacutethorn ydieresisAmacronamacronAbreveabreveAogonekaogonekCacutecacute Ccircumflex ccircumflexCdotcdotCcaronccaronDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflexGbrevegbreveGdotgdot Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbar Itilde.altitilde Imacron.altimacron Ibreve.altibreve Iogonek.altiogonekIdotaccent.altdotlessiIJ.altij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotLslashlslashNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautOEoeRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexScedillascedillaScaronscaron Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflex YdieresisZacutezacute Zdotaccent zdotaccentZcaronzcaronlongsflorin Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccent circumflexcaronmacronbreve dotaccentringogonektilde hungarumlauttonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos.alt Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIota.altKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9Iotadieresis.altUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronpirhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055.alt afii10056.alt afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveendashemdash afii00208 underscoredbl quoteleft quoterightquotesinglbase quotereversed quotedblleft quotedblright quotedblbasedagger daggerdblbulletellipsis perthousandminutesecond guilsinglleftguilsinglright exclamdblfraction nsuperiorfranc afii08941pesetaEuro afii61248 afii61289 afii61352 trademarkOmega estimated oneeighth threeeighths fiveeighths seveneighths partialdiffDeltaproduct summationminusradicalinfinityintegral approxequalnotequal lessequal greaterequallozengeuniFB01uniFB02 cyrillicbrevedotlessjcaroncommaaccent commaaccentcommaaccentrotate zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperioruni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200BuniFEFFuniFFFCuniFFFDuni01F0uni02BCuni03D1uni03D2uni03D6uni1E3Euni1E3Funi1E00uni1E01uni1F4Duni02F3 dasiaoxiauniFB03uniFB04OhornohornUhornuhornuni0300uni0301uni0303hookdotbelowuni0400uni040Duni0450uni045Duni0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BF uni04C0.altuni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CE uni04CF.altuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7 uni1EC8.altuni1EC9 uni1ECA.altuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1uni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni20ABuni030Fcircumflexacutecombcircumflexgravecombcircumflexhookcombcircumflextildecombbreveacutecombbrevegravecomb brevehookcombbrevetildecombcyrillichookleftcyrillicbighookUCcyrillicbighookLCone.pnumzero.osone.ostwo.osthree.osfour.osfive.ossix.osseven.oseight.osnine.osffuni2120Tcedillatcedillag.altgcircumflex.alt gbreve.altgdot.altgcommaaccent.altIIgraveIacute Icircumflex IdieresisItildeImacronIbreveIogonek IdotaccentIJ IotatonosIota Iotadieresis afii10055 afii10056uni04C0uni04CFuni1EC8uni1ECA   46latnMOL ROM  nlatnMOL (ROM B      ligaligaligalnumlnumlnumloclloclonumonumonumpnumpnumpnumsalt saltsaltss01"ss01*ss012ss02:ss02@ss02Fss03Lss03Rss03Xtnum^tnumftnumn    &.6>FNV^Pz2HJJ.,ZgwEG      !$%IJ6 "(^IO]ILI5O4LI^V0R *H C0?1 0 +0a +7S0Q0, +7<<<Obsolete>>>0!0 +-?7,3ILf.C]0z0b8%a&Z0  *H 0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0 070615000000Z 120614235959Z0\1 0 UUS10U VeriSign, Inc.1402U+VeriSign Time Stamping Services Signer - G200  *H 0ĵR`)J[/Kk5TX56^bMRQ4q{f*j 7٘tvJcEG.k NK+XJ,XB-uލǎlLgrIž`<cxi{-004+(0&0$+0http://ocsp.verisign.com0 U003U,0*0(&$"http://crl.verisign.com/tss-ca.crl0U% 0 +0U0U0010 UTSA1-20  *H PK$ $- 7 ,Za񑑳V@뒾89u6t:O7ʕBǠWdB5N3M'L8MxSݤ^ ⥾`߭(ǥKd[98"3/!?DA e$HDT\y>]r},CS}=*:Om ]^SWp`+nx'4[^I2300-GߍRFCmH 10  *H 01 0 UZA10U Western Cape10U Durbanville10 U Thawte10U Thawte Certification10UThawte Timestamping CA0 031204000000Z 131203235959Z0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0"0  *H 0 ʲ }uNgadڻ30X~k6xw~o< hlʽR-H=]_/kLR`@~ ?Ǵ߇_zj1.G 1s W-x43h/Š*Ë!fXWou<&]'x1"ijGC_^|}bM "Vͮv M٠h;004+(0&0$+0http://ocsp.verisign.com0U00AU:0806420http://crl.verisign.com/ThawteTimestampingCA.crl0U% 0 +0U0$U0010U TSA2048-1-530  *H JkXD1y+LͰXn)^ʓR G'/8ɓN"b?7!Op18UN$ҩ'NzaA*^ݻ+>W~ +;R8'?J00eeR&.Y)"\0  *H 0_1 0 UUS10U VeriSign, Inc.1705U .Class 3 Public Primary Certification Authority0 090521000000Z 190520235959Z01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0"0  *H 0 g`IoV|f^ q-!ќPL"5; .Z|=;%X{ ξ'tag'MjaXy'M4+G Df$fO8TrfujIh8y 0,`Hת809:|@T/ܨR>+!\ P4.M^%Ԍn|)]1ZՌgX5+!`x^{`W ]A cT`C!00U00pU i0g0e `HE0V0(+https://www.verisign.com/cps0*+0https://www.verisign.com/rpa0U0m+ a0_][0Y0W0U image/gif0!00+kπjH,{.0%#http://logo.verisign.com/vslogo.gif0U%0++04+(0&0$+0http://ocsp.verisign.com01U*0(0&$" http://crl.verisign.com/pca3.crl0)U"0 010UClass3CA2048-1-550Uk&pȡ?-50  *H ݔAaix0Ɛ<~B$s/DrPU nQj71ܥ-OM2NgUejzd8xEv1z`³]fvYI8VAwX00fgymPSo0  *H 01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0 100729000000Z 120808235959Z01 0 UUS10U Massachusetts10 UWoburn10U Monotype Imaging Inc.1>0<U 5Digital ID Class 3 - Microsoft Software Validation v210U Type Operations10UMonotype Imaging Inc.00  *H 0Di|U 25L3^ L*8ט@I "SOCʋVnH9c;$5}rGWyˊJ@p-5cįפ {uePd"}KXEMYLM00 U00U0DU=0;09753http://csc3-2009-2-crl.verisign.com/CSC3-2009-2.crl0DU =0;09 `HE0*0(+https://www.verisign.com/rpa0U% 0 +0u+i0g0$+0http://ocsp.verisign.com0?+03http://csc3-2009-2-aia.verisign.com/CSC3-2009-2.cer0U#0k&pȡ?-50 `HB0 +700  *H N"gA~™cjrb<8=_G_[KI  VD 5< D`E*oL;4gpZ9\Zl5|eKmIp=b۴A~}n"w6MZ S1+(RzkwD ]%,͊0>KyʦN $ 񺐶\<'MPvWPf✴1d8s. n&ռ= M`z0{ *H  1l0h0g0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA8%a&Z0 +]0 *H  1  *H 0 *H  1 110505165509Z0# *H  1\̻mZ6T\Sf0  *H wcm= +d{DZL)qJrnp5BLo:kKڽ"^ɢ[yIQ4@wyhl;#Ori°19}v"=# cBYsnek-1.1/doc/fonts/OpenSans-Italic.ttf000066400000000000000000006376401353657467200177230ustar00rootroot000000000000000DSIGZw@*,tGDEF&& GPOS 77&,8GSUB+=&dOS/2M=`cmap)/hcvt fpgm~agasp#%glyfPXT%headGc<6hhea t$hmtxkernT+ ~C6locaM0VmaxpC nameSt"post7l&+prepT _< cHK b  y W/\k33f @ [(1ASC X H ++?hHX\BHRH`jh7+hyh/h h/hhPhhh`hb+hyhhyjoqVTVVVjmV#uVVTTVV'hb'?JJj#5'Do?b;bbb;;99;;}bb+;mZqbu;hhshhhhh;oXh7mh`wo=V{BWjqqqqqqVVVVTHThwhhhhVbbbbbbbbbbbb;;;;Z;}b}b}b}b}bh}=qqqq;;qbqbqbbbbbTVbTHbVbVbVbVbVbjjjjmV;mV;;;;;;#uV99V9VV9VD9T;T;T;)]T;}b}b}bbV+;V+V+;'m'm'm'm;Z+hqhqhqhqhqhqu;???3hqbbw}='mooHoD'uooPooqGG`\GBTqhqVVwV?mVuVwTT#oVV+'b?;qhbTmJ?b;Xbqh9bR}bLbbXL\bbqh}bbVVV'#7VVyVoVqZVVVV5BVVyV'TmVoVV'RTTTJVoVVbTdNb7bb}qq;L=;}b;b;;NbqqqqT'?;7b;7bm;;9;;;qV;uuu;777'1\{\}\{}ZN+DXD h-h7h?9;yVS]Rww hdb'hshhh\\Vy!TT\}/VmT;qb;sZ3}bq.VVbqhj\V;;V;HRVh;B}by`y` ybbbhbu{Tw}))VqmV'VN V;B}T+;yT5uV9{NjV; V;V;bb;bm+7BZZoT;PP5V;3JmV;yV;T=qbqbbVbJT;JT;5B}5uVqVq}b}b}b;;;qV;JV'`bfb+sV;bDVPy?7qbqbqbqbqbqbqbqbqbqbqbqbVbVbVbVbVbVbVbVb;}b}b}b}b}b}b}b}b}b}b}b}bhqhqqqqqq;;;V TobJxRRoF<9 R/55555/V/V/V/V/V/V/V/V//VRV`/VVVVVVV 0HI~'2a7 # O_?M   " & 0 3 : < D p y  !!!! !"!&!.!^"""""""+"H"`"e% IJ(3b7 #P`>M   & 0 2 9 < D p t  !!!! !"!&!.!["""""""+"H"`"d%aIvhcb]gD Xz}} Bvt n%"iOS0L\pr`<&'()*+,-./0123456789:;<=>?@AIJ$%TUVWXY\]^_`abcdefhijklmnopqrstuvhijkFopqrstu45]^@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-@ !H U UHU?MK&LK3KF%&4U%3$UJI3IF%3UU3U?GFF#"33U3UU3UOU3UoTS++KRK P[%S@QZUZ[XYBK2SX YKdSXBYss++^stu+++++t+st+++++++++++++st+++^NuH^If%3S}/P`9 (KF.T  ; U * v  P s # ? S n I } Z!CxJN .rDVA%DFFX&@~"Vl,?Y -@%tr h y !! !2!C!U!f!r!~!!!!!!!" "")"1"""""""###%#6#H#Y#k#|######$'$r$$$$$$$$%%%$%0%B%T%`%k%%%%%%%%&&4&^&p&&&&&&''P'b's''''((((((((() ))-)9)E)W)i)t))))*$*6*G*Y*j*|*******+++$+6+I+[+l+~++++,2,--$-6-H-Y-d-o----..4.W...////'/4/A/M/Z/f/z///////000!0A0I0Q00000001E1M111222(292K2^233H33444o44451595^5566K667737788e8x8888899.9s9{9999:7:t::::;; ;;R;Z;;<< .>a>>?FFFFFGGaGiGzGGGHH#H4HFHXHkH}HHHHHHHI I I7I]IIIJ'JAJQJJJKK9KEKZKKL2LMMaMNNSN[NNNNNOJOuOOOOPJPsPQQ3Q`QQQQQQRR/R_RRSS.SSSSSSSSSSSSSSSTU1UCUKUUVTVfVxVVVVVWXXmXXYFYOYXYaYYYYYYZUZZ[/[[\\F\\],]]^I^_y___`"`\`````a:ab?bcaccd,dcddddefWfg gQgghVhhhiJijjjjPjjjk3ktkkll9lkllm8mnn#n/nYnnno-oeoopp[ppq,qzqqrVrs,sssst tPttuuLuuuv9v|vvvvvwwww0wAwwwwxx%x8xKxxxxyyy-y?yGyOybytyyyyyyyzzz,zRzwzzz{5{y{{|4|e|m|}'}}~5~~6ɀUӁ%-{Ё܁ 2EXk~ς.ATg}΃*=PcvƄ؄,?Rexąڅ ,=OasƆ؆ 0BTeq}ˇ܇H}‰@r>^gÊPϋ׋T΍,8Dҍ,?QcuƎΎ  /2/310!!7!!IhyJh++@ OY?+?9/10#4632#"&+m1OD-8NB173LX76D^8B ?3210#!#kHkH?;3@   ?3?39/333339/3333310!!#!#!7!!7!3!3!!! b }y e -{}1} /`RRTLLTH/%,:@ )", % KY&&KY//99//3+3+92310#7&'53&&546773&'6654&'11xRIb}ؿ''|?y^wk~BQlvEI:)-1r @? H7 |\6T J tb5Y+:%@%118 ?3?3??9/39/310#"32654#"&54632"32>54#"&54632Ø>!Ci?jAhE?eVnzertx#Bj@k4T?&@eWmzertxJNt gkc1\~wOGlb1B 50@**'(0-/JY3 JY3?+?+?999/10">54&267%467&54632673#'#"&itRh>UWr΀p;شgԯAnQHeux܉DxnxsGN\:MY3B[CbuIjߔfɞNvbR*{ndV ?10#kHR  '??103#RrS@ ` '??10#3q`'}Uj ?3/10%%'%7V{wqt57s)/4ym  /33310!5!3!!#{zy}+/10%#7#q~N79s/3107!7#"՞+# OY ?+1074632#"&+QG+5PD.6JM[45G_4} ??10#}Ӯ-JyD @ KY KY?+?+10#"&5$3 "3265D񳰼 mqwdosqaجC/  ??9910!#7'3L;2YPb5:n 7@ KYLY?+?+310!!7>54&#"'632!}fa/xgMYRްO]}{Kct9Dsoб/1(-@KY && KY& KY ?+?+9/+910#"'532654&##732654&#"'6321ʳ||ү^UtcPbP }rO15\l6BvL %@LY ??9/3+33310##!733!6#+HJpBu.@TcNN)2$PH-@MYLY KY?+?+9/+9102#"'532654&#"'!!6Vג֓0bZJ!W}ѲyOf~ 9IZ(-@ !MY KYKY?+?+9/+9104$32&#"36632#"&26654#"yoI#DfD;j䓶^QB|`0y#O^ŬYlq9_rby@ LY?+?3103!7!1{!`V%12@)# ,KY,, &KY KY ?+?+9/+9102#"&5467&&546632654&"6654&Üjxᘾؾ_Qm phrNXsͭPNszfũLE`oa54&+pjp@ 3c琴mlLY)v Wٌ"/,KWžW|9jzZ+d @ OY OY ?+?+1074632#"&4632#"&+QG+5PD.6PGaSA.6JM[45G_4M[hI]5d@ @ OY ?+/10%#74632#"&#q~NcPGaSA.6M[hI]5y@ //3293310%5ibߕ/33/]3105!5!hZby@ //33933105yiHs!bZ&%@$$OY$ IY?+?+9/910667>54&#"'66324632#"&esP.g`QB=\R}XPG,5SA.6[dXd>]e332{x[qhM[45I]4oF5A*@&+ 6==   +2?399//33339310#"'##"&546632326654#"!27# $!2"32&nzosA}X@DfNJ  J^\BAUF?Tޤ$.uVZqA_nr]S;@ IY?3?9/+310!#3#&'-K#%W/Jm+X}V -@  JY JY JY ?+?+9/+910 #!32654&##!2654&##s{15' • n~hgnt{ @ IY IY ?+?+10"327#"$32&ëVndŗE3ݻ9+PEV @ JYJY?+?+10!!! 2$54&##z5V2DzmpNpVj &@ IYIY IY?+?+9/+10!!!!!!!5!5 br5+Vj @ IYIY?+?9/+10!#!!!!5n N&@IY IY IY?+?+9/+10!# $32&&#"327!5˚huhBMj͸j`9K! (,"2'Vs @ IY ?3?39/+10!#!#3!3=l5Pn @ JY  JY?+3?+310!!77'7!\%#^^#L%5  IY"?+?10"'732673i0ELd3O}xDV+ @  ?3?39910!#&'#33 HH}5e:VVIY?+?1033!V55!T@  ?33?3910!##33!#7#+5  Ѯ~3HJ}LJNwMT@  ?3?39910!###33673s4 *5*</ @ IY IY?+?+10# $32%"32654&OĨW+̜lV @ JY JY?+?9/+10!##!232654&##Ç{5J=ض}o #@IYIY?+?+910"32654&# $32#jĨO5i+NV &@JY  IY?+?39/+910#! #32654&#5@ifЇ`ey`Aym'#& @ IY IY?+?+9910#"&'532654&'&&54$32&&#"jGiuc_BBE"Jig5"TNwQUt&.&,w6MD=Xdy@ IY?+3?10!#!7!!j!h@  IY?+?310#"&547332677,:QxnjRu  ??3310%673#3=e߿󴢪aŐJ^ċ@    ?3?33910!#&5##3367336731H,> YC+  K8ňH{Xb`S} @  ?3?39910!##33T3J??39103#3qwg% @IYIY?+?+3310!!7!7!!u{q Zdo'?3?310!!#3s}}!P ??10#wٚJjj'?3?3103#7!!w@|ߍ5)//33103#5Vm -)hDH/310!7!o+?!/10#&&'53h=+h=<b`\ '@  FY FY ?+?+??99102373#7##"&5462654&#"\( CƋ)axp[hf^\c]Ƭd)gzڣrq;9"'@ FYFY?+?+??9910"&'##336632"32654!a% F}J370 ]` `uoichfXvoƭnu+b\@  FYFY?+?+10"&54$32&#"3267֔/xcpiuH>|R33(?b!'@  FYFY?+?+??991023673#7##"&5462654&#"W Ne^&^ulgeiZwf}hĮd#otեb\"&@FYFYFY?+?+9/+10"&54632!#3267"32654&ҕ!{?c^4g0 IYwP$0,#ἧwq5F *@  FYGYFY?+?+?+3310"'53267#?6632&#"3#hE8@0LR .(t +L=W]'|s:CBdȥalL\(5CH@(33FY9GY &33(&@GY&(GY(,GY?+?+?+99//9++310#"'!"&5467&5467&&5463232654&''326654&#"L)7B?uܐNf[?PNLJlxZPOv?XRNuAHk>`5N)ʓi6)PEc+ }SMZt>H~UYTVRVQ;)@  FY?+?3?910!654#"#336632ٔY!eJ!#) ^d'j^)v'Rf{j>h!; ??2103#34632#"&y@3XC,(4H8GZ7L1 @ FY?+?210"'532734632#"&E6=:}+$T@3VC,&4L8GZ7L19!@    ?3??99103##3J+'RJHr-/- {o9- ??103#3L;\,'@  ! 'FY?3+3?33?9910!654&#"#33663236632#654&#">KTy!e W\qz VcEJQwk^)FNxߝ%Hwht}yDn`h*>KtՒ ;)\@   FY?+?3?910!654&#"#336632ٔGNY!e ``h(?Lxޞ%Hze}Oe`bV @ FYFY?+?+102#"&5464&#"326ܐڒ}km_wh]VżľOqs 9Z"'@   FYFY?+?+??9910"&'##33632"32654!a( kP `uoichdZ&Z4ðnu+b`\"'@ FYFY?+?+??99102373#67##"&5462654&#"^% C}e 0_`)\ymbeh\e[-ylïh"izף;h\@   FY?+??9102&#"#33>E3$54[wk H^g\ xՂ H_S-D\$ @ FY FY?+?+9910#"'532654&'&&54632'&#"ɩFE~Ftlʥ68ew]jGok].7E*.dN9NDI`J+WE8P?nbH  ?2?31033373}@4EHh`\uH@    ?3?33910!&55##33673363?  2S+/Z'%n Z^NvHXz|u^5*V XH @  ?3?39910#33#类J9N5d;H@  FY?+?3910336673#"'532677bJ #hEH]HD?DRu7LHERW+aec}H @GYGY?+?+3310!!7!7!!1!XuV}/'@  &'??329/3910"&54766'4#72676633"3!% vD"!i\G~h/ISiw4YWhFIW{z);H:(51 ??103#'@  &'??239/391023"##52676675&54776541!wC$ shH~k2Qciv0]D+Vh}HWBu}*;HA"51sP3T /332210"56323267#"&'&&\62bEtV@a273dH~HKZE4m%B7n! ^@ " OY?+?9/103#4632#"&mQF,5QA06+L\46G]3)(@ MYKY   ??99//++3310#7&&546773&#"3267F}+#{%wb/mnpivH>{"Ϛ> (4}(>1@ NYKYLY?+3?+9/3+3102&#"!!!!7677#73JB2Er/XP!G5/LKVOb+.^a!'$@  %/322291047'76327'#"''7&732654&#"D\grre\FFZbuwbZDghhfub\FFZhqwbZDFZ`wggh=@! MYMY  ??399//]92+33+31033!!!#!7!7!733F!)98"!ʣ @ ??9/9/103#3# ;,8-@3--603'$GY GY?+?+9331047&54632&#"#"'532654&'&&6654&wϰ5vfyL|db4zor̰w8LefpTRjeP_cjFD{EΌXq !@    //3399333310XN׬qoVqHvQ}1E1 /3/10#!579sj-5-@%))5** #''..  ?3?39/399/39/3104$32#"$732$54$#"%###323254&##^Zi-*װ֯_Uq壝Z\_fZ^Zƭӭ)*N~#`p~L>/310!7!!^F   /3/3104632#"&732654&#"׵STqtRSrsRPvSTPtuORuu !@     //399//33310!5!3!!#5!{z{x}`J  ?33?310!7%>54&#"'632!sW(>;Zi;}m}iJjdcW/5@PZeq^c}w9"@ " !?3?39/3910#"'53254##732654&#"'632%EN}l}rͲZ_atE;f^7mr fE8HkRG<=D]Xp_6!  /106673#8%&Ki<:16jH @  FY?+???39910326673#7##"'##3'Y"i ]bp3 HP vyh`N4I\@ IY/+/39/910####"&563!rs>T-}3KZhV /3210#"'53254&'73Ӣ)-&NZWQQG+5PC/6]K]f304|wbmdJM[44G_3s&$CR &+5Ms&$vR &+58s&$KBR &+5/&$R`R &+5+%&$jBR ""&+55&$P@o]]]]55<@ IY IY IYIY?+?+3?9/+9/+10!!!#!!!!!#bJ!ds6TN/+P &&z#Vjs&(CR  &+5Vjs&(v}R &+5Vjs&(KFR &+5Vj%&(jBR &+55s&,CR  &+5ks&,vR &+5Is&,KSR &+5>%&,jUR &+55H -@IY JY JY?+?+9/3+310!!#73! 2$54&##!!z V2DzoJ!jmpN T/&1RR &+5s&2ChR &+5s&2v!R %%&+5s&2KR ""&+5/&2RR %%&+5%&2jR //&+551w @   /3/39107'b@CcBa`Ac@``@`w )#@#$&IY&IY?+?+910#"''7&5$327"&4'326ȄpjOcHr02)Z!#[W`\69\>?ڇ\XZvWqJls&8CXR &+5s&8v#R &+5s&8KR &+5%&8jR ))&+55s&<vTR &+5VR %@ JY  JY ??9/+9/+10!##33232654&##RF55⌑=ٶ~nX?,@6' 9FY $FYFY?+?+?+910"'532676632#"'532654&&'&&54667>54&#"E6=2AT+¢*Qn_/l3ٸ]3>q.BXE%>]P>"iYw(_n"Ǝ}9c[iSD8B"kqCG)3te(>87En<5VGE8?C%@I}齮b`!&DC ""&+5b`!&DvD **&+5b`!&DK ''&+5b`&DR **&+5b`&Dj 44&+55b`&DP $$&+55bX\*8BB@$ y=<:?>=P'0@ "!FY$FY?+?+910#"''7&546327%"&4'326dbimDjhiw>pld6 9eg_A}RgNDOai\-/T#-q^!&XC &+5q^!&Xvh ""&+5q^!&XK &+5q^&Xj ,,&+55;!&\v ""&+59$'@  FYFY?+?+??9910"&'##336632"32654!b' f_( e_ `uoichfXhHGD}hðnu+;&\j ,,&+557&$MbR &+5b`f&DM# $$&+5N7&$N3R &+5b`&DN $$&+5H&$Q-bH`\&DQ s&&v9R ""&+5b!&FvF ""&+5 s&&KR &+5b!&FK &+5 1&&OR !!&+5b&FO !!&+5 s&&LR %%&+5b!&FL %%&+5Vs&'L^R  &+5b&G8Hb/*9@ GY %FYFY?+?+??9/3+3991023?!7!733##7##"&5462654&#"{a) y')e^^tqfggbdZW_'}hĮc#pu֫Vj&(MZR &+5bf&HM &&&+5Vj7&(N=R &+5b&HN &&&+5Vj&(O\5 &+5b&HO ++&+5VHj&(QLbg\&HQ!Vjs&(L/R &+5b!&HL //&+5Ns&*KR $$&+5L!&JK JJ&+5N7&*NR !!&+5L&JN GG&+5N1&*OR &&&+5L&JO LL&+5;N&*9-L!&J:u HH&+5Vss&+KR &+5;3&KK= $$&+5V4@ JY IY  ?3?39/+9/33+33103##!##7373!737!Dᬏl5581j/P-;%/@   GY FY?+?3?9/3+3910!654#"##7373!!3632ّX!a ')^X цY.x1ف擆:lo/&,RtR &+5;&R  &+5E&,MpR &+5;f&M &+5`7&,NER &+5;&N &+5H&,QH&LQ+1&,OR &+5;H ??103#3H&,-;%&LMs&-K&R &+5!&7K &+5V;+&.99;!&N9F9!H@    ?3?399103##3J+'R>2/- {oH;V[s&/vR &+59<&Ov  &+5V;V&/9;-&O9V$&/89z&O8?Vv&/Ohe9&OOV %@  IY?+?99//9103'737!Tmo;ʨ>c]Ƭd)gzڣrqs&vTR &+5bX!&v LL&+5ws&vR 33&+5=P!&v9 11&+5';#&69;D\&V9!  /3210#&'#56673g9hlmw%[*0wF'cB9!  /32103673#&''d)O*{{jW "[+! d9mPM4_Bf/310!!!f /3210#"&5573327"qbJ\"劂wj;B}D /104632#"&D@2XC+&6`5JZ7L1' @  / ?  /3]210#"&546324&#"326xcev|_evh@31B;83@ctsb^ura5>>56==oH  /2103327#"&54667RD(E')*DS_*P[AJM*F kSN5YO:P/  /2310".#"#3232673F(KGC ,3d:,OG>,3dB#+#9:$+$6?u!   /32106673#%6673#,/3EVV/,3EV-KA23FA2ou  /106673#o.mGhT@%&,jUR &+55%&<jR &+55bu&~T ;;&+5?u&T 22&+5;)u&T ##&+5hu&T &+5J&U00&+555b\#1*@+FY$$FY?3+3?+?991023673327#"55##"&5462654&#"wc& 6.%XH"&N Y\!`up[ff^\a]x2LuD-#& y  maŭe)gzݬrq+6@ $%%$FY%%FYFY?+?+?9/+9910>32#"&'"32665!#732654&-R'||VR}w)5PfQDHo0h(3?&2Z_cvT H ??3910#633673*PJV?<ӒVJj+#@&& FY FY?+?+9/310&&54632&&#"#"&542654&'TaQǡCkz:ae>Ts DNNQsy>%ZU,EECr؇ֱ&eC2󰁓?Z(-@''FY'' !FY FY ?+?+9/+910#"327#"&54675&&546632&&#"33prgF_JOgr>/;whZ}leTVZ&-sN_KH"`YFMb^3@ # FY?+39?99104##7!#6654&'&&bPsXwhN\nJC{z^ qku3>uYGN`p6-?2C;)\@   FY?+???910654&#"#336632oGNY!e ``h(?Lxޞ%Hze}Oetb1+ &@FYFY FY?+?+9/+10"&53 '2!"!65EꪇJ!\uK+ nFڏ#=!ـ%hH FY?+?10%27#"&5463}0[c&yu wv!k L0w9!H! "@  FY FY?+?+?910'&&#"'632327#"&'&5# HC70?H`w@w :""AZS +7B5m` <xb } cixjHwbH   ??2310363#bJ JKHNR^04@-&//GY//&#(!%&&%FY&?+92?9/+99910#"#6654&'&&54675&&5467##7!#"!37P~\I_mKGlm.DY9^/\Yr^k3WES_l91C07, _t$R_bVRLH"@ FYFY?+?+33?10%27#"&547!##77!#,(F?[_uͪ ы !u]Q=RJBPc:)$-Z"@ FYFY?+?+?910#"&'#!2%"32654&-XG\_sy,Rnk^u9E/nGwQn bR\!@  #FY?+?9910#6654&'&&54$32&&#"-]^dM]^ZDn/*pGnlVsN$4yYFTS?4=)9֙H3"bH@  FY FY?+?+310#"&5!!!"3254'F%+"|xHXە5_O]kvLH@  FYFY?+?+310%27#"&547!77!!5[!e }q {u:uwvABPo>::JH@  FY?+?3?10"&54633263zn!uda0EMxmKbZ#(@FY  FY?+33?+3?10&&5476632#4#"66կĞk'bGPoFd +h LJ'@FY FY?+?+??991023327#"&'#&&#"'6em)C9;&)B?fr/9`< 5.3FJtZ]F }~sv@O?{f @  FY ?3+3??3?10663#&&5473ѩedfjjzz/mUy+"ů\yuH bwH'$@% FY"?2+3?39/910"&547332332654'3#"&'y~:A=C}aOXXh&j %%&+55J&j ''&+55bu&RT %%&+5Ju&T &+5bwu&T 11&+5Vj%&(jBR &+55+@IYIYIY?+?+3?9/+10"'53267654&#!#!7!!! %FCY9%PE'#6,>%&,jUR &+555-!0@ IYIY!JY IY?+?+?+9/+10 #"'53266!3 !! 4&##KL143Si^mJstցX5t@snV)@  IY   JY ?+??39/3+31033 !!!#3! 4&##snđ5<r{uPI@po#@ IY   IY ?+3?39/+104&#!#!7!!!2#6il霬!fZZZ;ZP^'qR]V1s&vR &+5Pb&6qR &+5Vy @  " IY ?3+??3103!3!#!ZPRXJ}$Zj &@ IY  IYJY?+?+9/+10 !!!! 4&##N5 e-s}uF)K@roV%VjaV$@" IY  IY?+33?+?310!#367!3#!PuPqf'DrM={ŢEVj(@  ?33?33910333###Hh}^wwFF!)%%''-@JY %%JY% JY ?+?+9/+910#"'532654!#732654&#"'6632'ɬNpȻ}iHqׁ#pO-;jbv{J?V@  ?3?29910333#7##Zʡ<"NuJ9!y-Vb&6R &+5V1 @  ?3?3910!##33)45+8%1@IY IY?+?+?10 #"'53266!#KL143Si^ɬցX5JT0Vs+2VynV3 &7P@  IY?+?3910"&'532673673'`[Ijbˬ1=@V| '{}kn˯s;TX @ " IY?+3??310%#!3!3rP/5w{'@ IY ??39/+910!#"&547332673FɜmkRdKXXJ^d%NO!.JT @ IY?+3?331033!3!3T5JT@ " IY?+33??3310%#!3!3!3?rP5{ &@ IY  IY JY?+?+9/+10 !!!7! 4&##! s}uFK@roVT "@IY   JY ?+??39/+10!#3!3 !! 4&##5ㅋ5Hst@snV @IY JY?+?9/+103 !! 4&##75Hst@sno&@IY IYIY?+?+9/+10%2!7!74&#"'632#"&'5w-d?+ǵdOj\c\)HL%*0V#*@ IY  IYIY?+?+??9/+10#"47!#3!!2%"32654&5>Bt 䅱X+DGP(]ϙݾo &@JY JY?+?39/+910#&54$!!##"33R1}̬beJb|b`\Dd($@ "FYFY?+?9/+910476$76632#"&26654&#"dJpZjvoJg盼`VXX\I+B,%UhXcîʞ^v{gsfbZ'-@!!FY!! FY FY ?+?+9/+9102#"&54$!2654&#"32654&nahɊۏ|&᰸fZ@r[`W:/i[QMkbHP7mZ$ @ "FYFY?+?+99106632327#"&54667>54#"tLd3biLg5 ,"zjG=?M7DOTKTc93>I/wHb5))-@ #GY FYFY?+?+9/+910#"&54632375&#"'66322&&#"5겨e-pg+8?1Y[ai.ѺBS[ /z$/p~zb\H\<G@':GY  <(FY#/  FY4?3+3?3+3??9/_^]3+310##"'732654&#"5632333>32&#"327#"&547##!ԅC85/ichc1?W2dizO>67hbbd9:S4gL"s퓊8 F\&-@%&&%FY&& FY FY?+?+9/+910 54&#"'6632#"'532654&##7{#VVBS5[cִGQfk!?J &+)ym1E+-qbYMq^HXql&X67 &+5;3H @  ?3?39103##3^wsqH#HP@FY FY ?+?+?10!#&#"#"'5326676632#''M`RSTtd/'@[W@Wz~x =Y LW=FH@    ?33?3910!#&'#3673ɼey{ns"Wq#\qXH+AM;H @ FY   ?3?39/+10!3#!#abhiH5HbVR;)\Q9ZSb\F;\P;H\b#+@ #FY FY ?3+3?3+3??10##&&54$73>54&'jɡfdƚ^CnektXƻʮ$̷-P)񑑦 H[q^H!!@ !"FY?3+3??3910326673327#&&5##"&547ÖX"dN3qP>9قHIY2xN3Nkdeݍ>n3H@ FY  ??39/+910326773#67## 477''PG0A+6H5SAq57qH,%@, ''FY?3+3??339910326673#7##"&'##"&547332667?=LTy!d W\qz TdEJPzkHK\+ENxߝwhsz{DnKf+>KrؑqH6)@!$6 *"1$1FY$?33+33??3399103266733267#&&5##"&'##"&547332667B=LTy!d+#' qP?<qz EJPxkHIY,GLxߝQ0'' kde݂s?sId+>KtԓT;H-@FYFYFY?+?+9/+910632#"&547!7!"32654&}_ǪbGegadrbhˠ_cϒj>a]vcTNH )@ FY FY ?+??39/+910!#3!632#"&547"32654&>g}^ƪdiadsbH ˡ_can:a]vcUMH$@ FY  FY ?+?9/+910632#"&5473"32654&ZmmɄfkij|ihm\[calM`B11D7 UF]d]py׼NFn[, >pDe`j\nb&Hj 66&+55;!*<@$ &'&GY''$) FY $)$FY?+??9/+9/3+3910!!3632#"'5327654#"##7373^&  $E6;;|*X!\ 'ZTᒄ>h嫟c$wߞLف7!&v ..&+5b\&@FY FYFY?+?+9/+10"&54$32&#"!!3267֘/xc}2!+w9r[|\33#A{)?D\V;L;&j &+55MP(45@&)FY&&FY&/FY?+33?+9/+910632#"&547&#"#"'532667>32"32654&j^ƪ`!vcTN9H"2@FYFYFY?+??399//++910632#"&547!#3!3"32654&{`ƪnV@ IY?+?103!#?b7+:;@ GY?+?10!#!3BnͨF5H?s&:CR &+5u!&ZC !!&+5s&:vR ''&+5u!&Zv ))&+5%&:jmR 11&+55u&Zj{ 33&+55s&<CzR  &+5;!&\C &+57u/3107!7#7"ՠ7hu/3107!7#"ՠ7hu10'BtB%{ ?10'63b8 }  ?10#7(XE[*+/10%#7#q~N ?10#&'7w={{  ?3210'63!'63P)b8*z } ?3210#7!#67(XE- ^9u[*~%R /3210%#7!#7#q~N+ _?< "@  ??9/333910%#73%Ǧ#%%ΏF! ] N?@!       ??99//3333339910%%#773%%F%υ%7g'7υG&y+! z !  /104632#"&Ǔ}\^Y]b\c+5'',;GV1@<<TT&22 9 BBM?333?3??9/39/33310#"32>54#"&54632"32>54#"&54632"32654#"&54632Ø>wBj@k4T?&?eVmzertwBj@k4T?&@eWmzertxCi?jAhE?eVnzertxJN~yOGkc1\~wOGlb1Ɂt gkc1 BXq-//93310XN׬qB|Q1s//93310'7xM(qRM}2K5&  ??10#™=J!@  ?3?2910654#"#3632=VLO=wehDVN!}D*TyNP1i-2@LY NY  LY ?+?9/3+39/+10!!##73!!!!97!s !-'S@/"#"MY#&'&MY'''?'O' #'#'LY KY?+?+399//_^]3+33+31076632&&#"!!!!!!76677#737#7f6(ְ[AB9Ai/s%r\K!Gny!s/'!.q|݅)t7$-H@%$ NY$%"KY%%$-KYMY?+?+?9/+9/+339/10%27#"&547#?33#32!##32654&##6EIa`gPdh-T*1{BՉ1w a[5ywNKρV-&,?Ѷw?&K@) NYMY !!LY! LY?+?+99//_^]3+33+310"!!!!!27#"55#7367#7332&KG }){aEYFPq1DžAc7; PT +1N2%@-(#?3?3??9/39/310##"&546632%"326654%"&546632&#"3267GuSivYm=YyBo63nHNbbBo95pGNbd̓gtpqip[da]lTUhwZda^pQPl'  /2/3102&#"#"'53265R(/?F7<3^`ytrs}3/!@ '$*/3/232322310"56323267#"&'&&"56323267#"&'&&\37bEtV@a273eH~HKZ046bAO@a273dH~HBb@9m%B7o! A7m "B7n! '@  //99//33333310#5!!5!3!!!'{=Dj95 %@//39/3393310%5 5!hhcߖ %@//39/339331055!hHp!cZ鍍f  /33/10#3 fH9 &IL&IO\5  /3210!"&5473326759 pqzx %"XbH FY?+?10"'53273E6=:}+$; ?106673#%^7\7575;  /106673#X9\V0N;7+!  /10#56673+$\=\68.<5  !?3?310#"&54632"3254bmt|ckBk>7?j֕%wx`e,Ҭ\J !@   ??9/3333310##7!733#7Ɂ++yEZeCBI$q9@  !?3?39/39102#"'532654&#"'!!6ps\wdhoYJCC5{A+jp4HkZ?N-y 7%@   !?3?39/39106632#"&54632&#"2654#"Je8`qP_sՔC>;Fp#bQaw/X3B-/~haZ8s`1ODIUJ- ?3?310!7!y-Jr^9"/@ )) # !?3?29/399102#"&547&&54632654&">54&j}m^I=Sy#bOcw/X3B-/|iaZȕ{ub1ODIUT #'+/37;?CGS[kt|@N*B)AF>E=&2%1 VKcuult\ZQ} vk K}kl\QQ\lk}K -, 48!59/333/3339/////////33333393322222210!#%5!#533!5353!5!!5!5!#3#35!#35!35!#35#3#3#"&546323254#"%32##32654&##32654#"'53253T/0momImmmm0oowoooomm~smp.,;0m^{B.$*/;J1%Z^4+V}i0oo/mmmmmmoo;mmJoooo/yhIaCS1D D8QYb" "+%J fVr_cT*@ (""//9////310 54676654&#"63232654&#"TV,AgIOGRZ?>1HT;GFBIHCHEVW/2A1R~X8*P:/5K6DpJ;?HI>@IH!&7L &+5} /+1;<@%5%GY/55*FY**9FY*!FY?+?+9/+9/3+310#"&54676654&#"76323267$46323365#"%*9 NHJV$"pÞnWbPkŒKC&K" VGRNABP~~cW҅sjkK:RTTu&0vT &+5;!&Pv 66&+5&$[b`\&D[/s&2y\@y   /3210#"&546324&#"326ydewvfdq?33@:93?atrabsv_6==65>>3^{   /310673#'467#"&+V@`B>A 4.07eZV0 "2>-=ALJ@&JE@@(?3$$FY- (: ( GY7(FY?3+3?3+333?3+3?3210"'53267!#"'53267#?6632&#"!76632&#"3##34632#"&!G6=6DV'E8@0FX .(t +L=W]-)q$-L=Y\+Oy@3XC,&6s|:t{:CBdȥallŦf|lèH6IZ7L1;AA@"7("(FY1">,,GY;, FY?3+3?3+333?3+3??10!#3"'53267!#"'53267#?6632&#"!76632&#"3#KG6=6DV'E8@0FX .(t +L=W]-)q$-L=Y\+s|:t{:CBdȥallŦf|lè%%@ IY IY?+?+9310# $326673"32654&OҔBQV!-ĨW+qj!8ulbH$%@ FY!FY?+?+931026673#"&5464&#"326nOX !#ڒ}km_wh]V!4ViľOqs @  IY ?+?3931063#"&5473!267+("ݫ7#.$"wVonhDq #@  FY?+??39931032667363#7##"&546ÖX"d("⨴ b_HIY,x"!}b,j.v!C!vRe /210#76654&#"5632ncj^^@4'82AowR^o5.*d Tw}  /104632#"&@3.*C,&64K4&7L1Vjs&(CR  &+5Vs&CfR &+5b!&HCU $$&+5q^!&XC &+5`8/@,,!!IY2((IY?3+3?3+39/910"'632#"&'#"&54$32&&#"32677332654&6^4Hur!1tѱ hR3Z6|~m56 ܎l/+V۷fΏ]SR^X"&[E˙hH@  ???33910333663##섪F ?9C oq:Kܪ5Hvt3T{1@IY IY @JY?+99//+3+310!!!7!3!!3232654&##{"4==r!>+u܎`rc\'#8@ FY FY FY ?+?3+39/+910!63 #"&547#7373!"32654&IqXɬb/-}oij{mߩ˜Uiϒs5c[teWKVB%1@IY!IY! IY?+?+??9/3+310"!!327#"47!#3!6$32&Bo Vn5B5,ÜH3>U9$ Z=P'PE;\%1@ FY  FY FY?+?+??9/3+310"&547!#336$32&#"!!3267ia;‡/xc~2!-vNz<~45H5336|(?q #@ IY ?33?9/+3310!###3##7'&'R{pZow^CPLh;}H !@FY   ?3?339/+310#####&'P\fo\߬JsHH1VZ+@ IY   ?3?39/3+33310!###!#3!3##7'&';}s5mnw\ FPPlLxI;=H,@  FY ?3?3?9/3+3310#######3!L^gm\!i`3 1HH51P{!4@ !JY !IY?+?339/3+3333310#>77!#&&####"!RPtk)g{> \fIcQ6wI싋M7ɒh=,cq=\H4@  GYFY?+?339/3+3333310#>77!#&&###"!o8d]Qc:1/Wcqn [r<)7jjg< ^ii @opTlTMq1V{$'=@! '%   IY   'IY ?+?3?9/3+333310!667!#3!7!#&&+##"!"D+}5)g{>\fm}IwHx+P㋋M7ɉq=f;\;FH #?@" # GY! FY   #FY ?+?3?9/+3+333310!67!#3!7!#&&###"!3.4i`ws10Y`qm \l>)8mW*H5biiVpNMs1Z'Jd@8?9IY??A00GIY)JY00AA5IYA" JY/ # JY?+33_^]+?+99//+9+9/+104!#732654&#"'67&''53>32&#"327632&#"&5467>Ȼ}iH'J$xTBPAF'&*%7>54##7#DP6w0_yAPZh6/'%"C?[aWcdĿ^:;ZL0Z0\`}EpGrBєÉ##>Y~HjtFq3Z{[mxViY6,#) 'kYN^76SBDuf &@IY IY IY?+?+9/+10# $3227!"!654&O55Z5aW+#R,0bV &@FY FY FY?+?+9/+10#"&54632267!"!74&ڒx$w*>u¾OȩANJ{d@  JYJY?++??3102&#"#3767>0F*<&>>Aa)b``p+^X&̂8`!N@  GY ?3?+?103367>32&#"#`@FV=MaF)%'*=0}H?dTc,y;ads&v+R ""&+55`!!&v ""&+55 &2\bhV&R\V1.9@% @--IY (# #IY ?+33?+332310#"&'&54$7632%"&'6326'J6;>ƣ+'p;>3Bntu0^1A-{s>1K6+%lC82g/-!(P1,0!>^Rb;05@%/ @(##FY /FY ?+3?3+332210#"&'&&546766322654&'#"&'6;jƄF328p̈́E638"2 vFG(Q#6 NIQM. ;0;2ᮜ(;-;3"|%-'`A"nF`3!UC@!$>' .  H4.4IYN.A;';IY"'?3+3?3+3232299210#".#"#63237654&'&&5432"'#"54$32&&#"326732654&#"'632fQuc^9d2=kjnAr!\9BN`ͱ hR3Z6||S:5Oܑla6^4Hyy$*$r$*$՘DJ,. GCX'1X"&[F9{}C[+ch>kimA{s'$1+;B;;X#0럅PP$-$x9ryp#+#Hq"J.. #&E` FE@") ::") @ )/)/IY)@6"6IY"?3+3?3+3339/33910#'##'##'7"'632#"&'#"&54$32&&#"32677332654&NwHJ-6^4Hur!1tѱ hR3Z6|~m56 ܎lgggg3+V۷fΏ]SR^X"&[E˙h&*@$  #???332322910#'##'##'733663##wHH+F ?9C oq:Kܪ5 gggg\Hvt3T @ IYIY?+?+?10&5$32&#"327gdŗEǥMC (PEݾrb\@ FYFY?+?+?10"&54$32&#"327eԖ/xcqiwgXӼ_33뢀|/du @  ?910%'%7%7%XH㴁EHJ{J;{Z}9IĤ{TN /9/310#"&543!632Y(,Z*,CH_1w^'">=wh /323102>32#754&#"##7Qys>dj{5)+pQ ^$+$_O$"%+%y}j/ /3104632&}A>*,#x9>("0.JC}/  /3105654'&&5432}srp)"^9BHq"J,. HC) (6DR_me@4 >7ELHZS`gc")0,,,%3Vcc\j:HHAO3jOOj3  /3/39///3333333332222210&&#"#632&&#"#6632&&#"#6632!&&#"#6632&&#"#6632!&&#"#6632&&#"#632!&&#"#6632o3@,/2('$ < 8//99//2210#677&''6673&&'7%'67'&'7%'766&&'57 F$a5sGA݁R Ia4!&b'ZEx+REC{L%ExbCWBO݁#BO݁ Ia5uGA܂24bE<Y?DnXFcDnXb'X< F$a5Vb",@"@ " IY ?+???32299103333##7##!"&54733267Z<"N9 qru}9!y-b{w %"[_qo,1@,$@) " FYFY?+?+??3229103266733##7##"&547!"&54733267ÖX"dȣlj ]cV9 qrHIZ1xI{ze>n{w %"[_V3@IY IY  JY ?+?9/+9/3+310!!3 !!#73732654&##5'/ <!)ntޏhݩrc"9@ GY FY  FY ?+?9/+9/3+3910!!63 # 47#7373"32654&ypX5}ohk|mߪ=[cn:c[udWKV9@  JY JY?+?9/+99//9933102'###327'7654&##JRu{5`BDJ}@=\}o9Z)?@ "%"%$$$  FY FY?+?+??9999//993310"&'##33632'"327'7654!b' mPJL=`urhJHWgfXV94ð`@mv;S,Nb $@ IY  IY ?+?9/3+310!!!##73b mF!w ^H $@ GY FY?+?9/3+3103#73!!!!;ig9oJi}}Vj.@  JY IYIY?+?+?9/+910"#!!632#"'532654& \%5q?Jq}wှy /5&; hH.@ FYFYFY?+?+?9/+910"&'53254&#"#!!632ND^+)[?rK4cCdFS3l] $,)HnˆŮ)@  " IY?+??3?339103333####Hh}^%sO`wFF!}%%\<@@":GY<<3"(FY#/  FY4?3+3?3+3???9/3+310##"'732654&#"5632333>32&#"327#&&547##!ԅC85/ichc1?W2dizO>67hbbdNBoJgL"s퓊g ۽8 H'&dHF\&T/"@  "IY?+???3910%3###33pR<45!{+8%;#H"@   "FY?+???391033###3^qPNsoH`{#HT-+@      ?3?399//99910!###3733 +P}}5Efy`8?^5?F(@  ?3?39999//9103#373%3##'ۦo{E% \)JLFuDlXsV))@ IY  ?3?39/3+39910!###73733#3 ۮ}!)'!Pсf9!*@  GY  ?3??9/3+39910373!!33###Ǖ))=40+'R \- {o !@   IY?+?3?910!##!7!33!+8%NH !@   FY ?+?3?9103##!7!soH#Vs%@ IY   "IY?+???39/+10%3##!#3!3^qOl5}Pn;H%@ FY " FY ?+???39/+10!33##!#abʑqPhiH5E{HV $@ IY   IY ?+?3?9/+10#!#3!!T駏l5Pn;H $@ FY   FY?+?3?9/+10!!!#!#abɪhiH5˒JHVN0@ JY IYIY?+?+?39/+910!#!#!632#"'532654&#"'5ё?J q}wှ\%^ /5&; H!0@FY  FY  FY ?+?+?39/+910632#"'5326654&#"#!#!S:m\qY*X>m\qP5bɨ=jmʈĭ3$+JHy-93@ %.++4JY IY IY#IY?+?+++910327#"&'#"$32&#"327&54632654&#"y.@CJ@WQ.9Z4Vy}:]a*Vuɀ!9<<{yÃE Ao|zQH &&7bH\&Fw @" IYIY?+?+3?10%3##!7!!qPj!h};\92@&-#*$#"*FY1*GY?+?3+3??3?9910%327#&547654#"#654&#"#33663236632%-3nO\Qwk>KTy!e W\qz VcX 'k$0<].tՒ ^)FNxߝ%Hwht}y)P-l,<bH   ??3910%673#3u33ggD yLnm%@  IY  ??39/3+39103!!#!7!73 " JL g#`+H!@   GY ?3+3??3910%673!!##733u33LLD y}o}Hn @  "IY?+???39910%3###33qR\T՜}3J?H @ " FY?+???39910#333##J:qR=N5d`{='@ " IY  IY?+3?+3??10%#!!7!!!3qP/j du{}ZH'/@% "$%$FY%FY?3+3?+3??910326673327#&&5##"&547!7!;vY!d #-3nQ?@\arU0z,& )kdexe0v')@ IY "IY?+??39/+910###"&5473326733;O٭uqR`W{XX4TK(GH03H)@FY " FY?+??39/+9103267733##67##"&546>3˒qPS#ȅ EH^)oE{?ǒ&JE'2@  IY ??39/+9/9/33910!# 47333673FbB> yw WeJG_X:'1;3.(KHZ5J1H4@ FY ??39/+9/9/339103673#67##7"&546>?=SA-m75AHZ+#Jrs5-+\0T@IY?3?9/+91063 #654&#"#3ޥH wy T`Y5\Z3:3.*II13;H@ FY  ?3?9/+910!654#"#336632>,U!Y`9#[,jHl~2i\̍wQJaoHݸɬ3$!/H1$@"IY IYIY ??++?+?103##! #"'532661KL143Si^{ցX5P&@"FYFYFY?+?+?+?10%3##&#"#"'5326676632BǨ''M`RSTtd/'@[W@Wz~x{ =Y LWVs"@ IY   IY?+??39/+10"'5326!#3!3˔t}8sl5D15 'Pn; H"@FY FY?+??39/+10!3#"'53267!#ab?y`[|/\iH51?HVs%@ IY   "IY?+???39/+10%3##!#3!3^紐l5}Pn;H%@ FY " FY ?+???39/+10!33##!#abȣǨhiH5I{H')@IY "IY?+??39/+910!#3# 47332673NRq_٭ yw R`XX1;3.(JI /J`H)@FY " FY ?+??39/+910326773##3667##"&546>.Rl/! ؇AH^)k~F*V5T%@  "IY?+?33?3910!##33!3##7#+5  ~3HJ}L{NwM=FH%@ " FY?+33??3910#&'#36733##ey{ns"WˤǑq#\qXH+AMGy,b&$6R &+5b&D6P ##&+5+%&$jBR ""&+55b`&Dj 44&+55bX\Vb&(6sR &+5b,&H6 %%&+5T#&@IY IY IY ?+?+9/+10"56632#"&54$!36554&27# yzic(Dj~5`2&N9PZe;\"&@FYFYFY?+?+9/+102#"&54$!374&#"566267#"ϖO2!zKPd:h. I\ݾvP.&."wp5FT%&jR 77&+55;&j 66&+55%&j9R %%&+55&j# PP&+55'%&jR ;;&+55c&jz ::&+55Z/@JYIY JY?+?+39/+310#"&'532654&##7!7!#Ԍ^AӒ 3v-$hts曋uH/@GYFY FY?+?+9/+3310#"'532654&##7!7!ɉ~ҬH رFXӸr}V&MR &+5q^f&XM- &+5V%&jR ""&+55q^&Xj ,,&+55%&2jR //&+55b&Rj //&+55~bV%&~jR 33&+55b&j 22&+55o%&jR 22&+55B&jU //&+55P&M\R &+5;f&\M &+5P%&jDR ))&+55;&\j ,,&+55Ps&SR ))&+55;(!&\S ,,&+55'%&jR **&+553&j ,,&+55Vj @" IY IY?+?+?10!3##jrP5};^H @"FYFY?+?+?103!!3#;9onPH{VT%&j'R ))&+55&j 44&+55yb7@IYIYJY JY "?+?+?+9/3+310!!!3#"'532677##73b mF!h=scC%.4(5  zu>3y^H7@GYFYFY FY"?+?+?+9/3+310%#"'532677##73!!!!=qbB&/3(6 ig9oJLp>3}}y'@JY JY"?+?+??39910%3#"'532677##33=paB&02(6 ZTՓ~q>33JyH'@ FYFY"?+?+??39910#333#"'532677#类J9=pcB&02(6 JN5d^{t>3)@IY  ?3?39/93+3910##!7!33!  !D`3H)@  GY ?3?39/3+39910!33!!##!uӪJwud-}N` @ JYJY?+?9/+104$!33! #"!3`8CⱵ!{pJbGfD%1@IY""IY?3+3?9/+9/910#"'#"&54!33327#"3267Dg(ɤG઻U$UO/iujgoP p 'NR[l{fbH$10@!,FY%%FY ?3+3?+?9/991032673#"&'##"&5463236732654&#"SVduBB+ijapa) L]yohdh+Tbz=ռm~o°`dZbH$nuتR-:@ '',JY,JY,#IY,?+?+9/+9/99104654&##732654&#"'663232673#  ˾upGsՁƮlNXgo`f,'#U8tadhv{K>$|ve\pɱm\*8@ !'FY !!FY! FY ?+?+9/+999/1032673# 74&##732654&#"'632duBB+ŶVgkXVHH5Z\dXz=ֻZTHc[DJ'T{lm3%4@ JY%"JY"IY?+?+?9/+9910!#654!#732654&#"'6323#\L٬rajWG*qdL+э_e?7{)pf\\&4@#FY"FYFY?+?+?9/+99103##66'4&##732654&#"'632nM"%^_kXVHH5Zah,yP@c[DJ'T{ll$'@ $$IY$IY?3+3?+9/1032673#"&547! #"'53266eq `h+ƯKL143Si^w9o˳A>ցX5P.)@**FY*" "FY?+33?+9/10326673#"&547&#"#"'5326676632jD[:BHgzu''M`RSTtd/'@[W@Wz~x2im=O>H$ =Y LWRHV3,@IY IY ?+??39/+9/1032673#"&547!#3!3gr`h-ð5l5#t̲=XPnB;mH,@FYFY?+??39/+9/10!#3!3326673#"&546biabD[:BHgzH5;H2im=ODN&@IY IY IY?+?+9/+10!#"$32&&#"326!1+eBlU띻1y'T/%b\\&@FY FY FY?+?+9/+10!#"&54$32&#"3 !o;*pJ@"@?\:&*N?%@ IY IY?+?+39/107!!32673#"&547!!ieq `f-įyH-o̲4asV/H%@ FY FY ?+?+39/10326673#"&547!7!!D[:AHgxu w2im=N>H Dy(-@&JY JYJY?+?+9/+9104$32&&#"33#"3267#"&54675&&9ӂM[WQܙnSk{-HFvC3~tzv6&Q°"?Zy1 +@ IY JYIY JY"?+?+?+?+103#"'53277#! #"'532661@o`F#,7MKL143Si^ՁnqցX5yP)+@'FY'FYFY FY"?+?+?+?+10%3#"'532677#&#"#"'5326676632?>pbA(03(5 ''M`RSTtd/'@[W@Wz~x~q>3 =Y LW&$gb`\&Dg&$fR &+5b`&Df &&&+5X&$wR &+55b&Dw ,,&+55%&$xR &+55b`&Dx ,,&+55 /&$yR &+55b&Dy ,,&+55b&$zR 00&+55b&Dz BB&+558s&$'gKBR &+5b`!&D'gK --&+5R&${R &+55b`&D{ !!&+55P&$|R &+55b`&D| ))&+55PX&$}R ##&+55b`&D} 55&+55b&$~R %%&+55b&D~ 77&+55N7&$'N3Rg &+5b`&D&Ng $$&+5Vj&(gb\&HguVj&(fR &+5b&Hf ((&+5V/&(RTR &+5b &HR ,,&+5VV&(wR &+55b&Hw ..&+55Vj&(xR &+55b&Hx ..&+55V /&(yR &+55b&Hy ..&+55Vb&(zR --&+55bf&Hz DD&+55Vjs&('gKFR &+5b!&H'guK //&+5)&,fR &+5;&f  &+5&,g&LgN&2g5bV&Rg&2fR !!&+5b&Rf !!&+5&2wyR ''&+55b&Rw ''&+55&2xuR ''&+55b&Rx ''&+55/&2yuR ''&+55b&Ry ''&+55b&2zuR ==&+55br&Rz ==&+55s&2'g5KR ((&+5b!&R'gK-h@ --%((&+5+5s&_vR //&+5bH!&`v9 --&+5s&_ChR ''&+5bH!&`C %%&+5&_fR **&+5bH&`f **&+5/&_RR //&+5bH&`R --&+5&_g5bH&`g&8gq^H&Xg&8fmR &+5q^&Xf &+5s&avR &&&+5q!&bvT ))&+5s&aC=R &+5q!&bC !!&+5&afsR !!&+5q&bf %%&+5/&aRR &&&+5q&bR1 ))&+5&agq&bg&<gL;H&\gy&<fR &+5;&\f/ &+5/&<RR &+5;&\R ""&+5/&B!  /3210#&&'53#&&'53Pm; (j^o; ,g;?;?j@  /399//3103#&'#7667673#V/9a^xJ K8.^++E`5<9ml:@/^>+u*V7@  /399//3103#&'#766&''3V/9a^xJ KCk8A5<9ml:@.=p]"@  /3299//3103#&'#76676654&#"5632V/9a^xJ KQED.(*BVXTH5<9ml:@ ^ (#N<9AE'#'@   !/39///33310".#"#632326733#&'#76'JD?+5e:*LD<&3 d@WW/9[bJ5%.5$';=3:7qi? b @ /29/210"&'33273673#xkWM5p"iI,ELيvA6w}_n,z' `@  /39/210&'73"&'33273'rH1HVxkWM5p"m`bgvA6w} ` @  /329/21076654&#"5632"&'33273EF.(%#:W\VH+xkWM5p"` '(P=vA6w}TH /2102654'3#"'7B9@)u"{A,$IEfT)p4qzk yy /210%#"'53267yBqbA(7%-4;ol3>yy /210%#"'53267yBqbA(7%-4;ol3>Yb q @ KY &MY?+?+10#"&54632%"32654& ϋsh_zrg_qKW򣍘J{\  ??9910!#667'3| <WN?:9Gl)q@ KY&LY?+3?+10!!7>54&#"'6632!%y5WUJjRznBa9ltg=JW?RodLTxzr(-@KY && KY&& KY %?+?+9/+910#"'532654&##732654&#"'632zʳ||ү^UtcPbP. }rO15\l6Bv\ !@MY $??39/33+310%##!733!667'NLy/H@_9s{DNxi@]-@MYLY KY%?+?+9/+9102#"'532654&#"'!!6ג֓0bZJ!W$ѲyOf~ 9IoD]@ $LY?+?310!7!1{!<2r(-@ !MY!!KY& KY%?+?+9/+910#"'532##"&546632%"32>54&pjp@ 3c琴mlLY)vWٌ"/,KWžW|9jzZ=:@(3$$FY-: ( GY7(FY?3+3?3+33?3+3310"'53267!#"'53267#?6632&#"!76632&#"3#!G6=6DV'E8@0FX .(t +L=W]-)q$-L=Y\+s|:t{:CBdȥallŦf|lèRV1%@,$  )$?3?3222109##33#7#%#"'53254&'&&54632&#"wyy~B^b4^iK~em^#PO5B7TsJ'nG-/yfs!l(j,2%+\DYn%c#/+(3"0Y&7z?/D&Wz5b\ +.@ FYFY!'FY!?+?+?+?9910%2654&#"%##"&54632373#"'532676]yifeh_`X C-Ҷ>P$w#otףZylïhtF$25b!&K 22&+55b&N //&+55b&O# 44&+55b!&:{ 00&+5V5 ??1033V7JVQs&CR &+5VBs&vR  &+5V(s&K2R  &+5V)%&j@R &+55Vv/&RGR  &+5V&MIR &+5VA7&N&R &+5H5&QFVt1&OfR  &+5Vd&-/` 'TV5V%&j6R &+55V5V%&j6R &+55V5V5V &fR  &+55&gf2I6$$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs) $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q  q q q           ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q   q   q    q q  q  !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) -&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq7$&q&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq$q$ q$&$*$- $2$4$7q$9$:$<$$$$$$$$$$$$$$$$$$$$$$q$&q$6$8$:$G$$$$$q$ q$_$I$K$M$O$Q$S$U$W$Y$[$]$_$o$q$s$q%%%$%7%9%:%;%<%=%%%%%%%%%%%$%&%6%8%:%;%=%?%C%%%%%%% %X%%%!%#%%%'%)%+%-%/%1%3%o%q%s%&&&*&2&4&&&&&&&&&&&&&&&&&&&&G&_&I&K&M&O&Q&S&U&W&Y&[&]&_'''$'7'9':';'<'='''''''''''$'&'6'8':';'='?'C''''''' 'X'''!'#'%''')'+'-'/'1'3'o'q's'(-{)))"))$))))))))))C)) )X)))!)#)%)')))+)-)/)1)3.&.*.2.4....................G._.I.K.M.O.Q.S.U.W.Y.[.]._/\/ \/&/*/2/4/7/8/9/:/</////////////////////////$/&/*/,/./0/2/4/6/8/:/G/////\/ \/_/a/I/K/M/O/Q/S/U/W/Y/[/]/_/a/c/e/g/i/k/m/o/q/s/222$27292:2;2<2=22222222222$2&26282:2;2=2?2C2222222 2X222!2#2%2'2)2+2-2/21232o2q2s2333$3;3=3333333333;3=3?3C33 3X333!3#3%3'3)3+3-3/3133444$47494:4;4<4=44444444444$4&46484:4;4=4?4C4444444 4X444!4#4%4'4)4+4-4/41434o4q4s47777")7$q7&7*727477)7D\7Fq7Gq7Hq7Jq7P7Q7Rq7S7Tq7U7V7X7Y7Z7[7\7]7q7q7q7q7q7q77777777q7\7\7\7\7\7\7q7q7q7q7q7q7q7q7q7q7q777777q7\7q7\7q7\77q77q77q77q7q7q7q7q7q7q7q77q77q77q77q7777 77q77q77q77q7777!7$)7&)7+7-7/717375777<7>7@7Cq7D\7F\7G7Hq7J7777777 7W7Xq7Y\7_7`q7b7q7\7q7 \7!q7"\7#q7%q7&\7'q7(\7)q7*\7+q7,\7-q7.\7/q70\71q72\73q74\76q78q7:q7<@<C<D<F<G<H<J<< <W<X<Y<_<`<b<<<< <!<"<#<%<&<'<(<)<*<+<,<-<.</<0<1<2<3<4<6<8<:<<<@<B<D<I<J<K<L<M<N<O<Q<R<S<T<U<V<W<X<Y<Z<[<\<]<^<_<`<b<d<f<h<j<l<n=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_>-DD DD EE EYEZE[E\E]EE7E<E>E@EEEE EpF)F )F)F )HH HYHZH[H\H]HH7H<H>H@HHHH HpI{I {I{I {KK KK NFNGNHNRNTNNNNNNNNNNNNNNNNNNNNNNNNNNNNHN`N6N8N:N<N@NBNDNJNLNNNRNTNVNXNZN\N^N`PP PP QQ QQ RR RYRZR[R\R]RR7R<R>R@RRRR RpSS SYSZS[S\S]SS7S<S>S@SSSS SpURU RUDUFUGUHUJURUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUDUFUHURU RUYU`UU U"U&U(U*U,U.U0U2U4U6U8U:U<U@UBUDUJULUNURUTUVUXUZU\U^U`W)W )W)W )YRY RYYY")YRYY RY ZRZ RZZZ")ZRZZ RZ [F[G[H[R[T[[[[[[[[[[[[[[[[[[[[[[[[[[[[H[`[6[8[:[<[@[B[D[J[L[N[R[T[V[X[Z[\[^[`\R\ R\\\")\R\\ R\ ^-q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq-{&*24G_IKMOQSUWY[]_-{-{-{-{$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjln$;=;=?C X!#%')+-/13             YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p   YZ[\]7<>@ pR R")R R  YZ[\]7<>@ pR R")R R q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  &*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_$79:;<=$&68:;=?C X!#%')+-/13oqsR R "@E=K=N=O=`={R R$79:;<=$&68:;=?C X!#%')+-/13oqs-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p  &*24G_IKMOQSUWY[]_FGHRTH`68:<@BDJLNRTVXZ\^`FGHRTH`68:<@BDJLNRTVXZ\^`\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqsR R "@E=K=N=O=`=R R\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs  $79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs-{R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`$$$$")$$q$&$*$2$4$7)$D\$Fq$Gq$Hq$Jq$P$Q$Rq$S$Tq$U$V$X$Y$Z$[$\$]$q$q$q$q$q$q$$$$$$$$q$\$\$\$\$\$\$q$q$q$q$q$q$q$q$q$q$q$$$$$$q$\$q$\$q$\$$q$$q$$q$$q$q$q$q$q$q$q$q$$q$$q$$q$$q$$$$ $$q$$q$$q$$q$$$$!$$)$&)$+$-$/$1$3$5$7$<$>$@$Cq$D\$F\$G$Hq$J$$$$$$$ $W$Xq$Y\$_$`q$b$q$\$q$ \$!q$"\$#q$%q$&\$'q$(\$)q$*\$+q$,\$-q$.\$/q$0\$1q$2\$3q$4\$6q$8q$:q$&@&Cq&D\&F\&G&Hq&J&&&&&&& &W&Xq&Y\&_&`q&b&q&\&q& \&!q&"\&#q&%q&&\&'q&(\&)q&*\&+q&,\&-q&.\&/q&0\&1q&2\&3q&4\&6q&8q&:q&(@(Cq(D\(F\(G(Hq(J((((((( (W(Xq(Y\(_(`q(b(q(\(q( \(!q("\(#q(%q(&\('q((\()q(*\(+q(,\(-q(.\(/q(0\(1q(2\(3q(4\(6q(8q(:q(8@8C8D8F8G8H8J88 8W8X8Y8_8`8b8888 8!8"8#8%8&8'8(8)8*8+8,8-8.8/808182838486888:8<8@8B8D8I8J8K8L8M8N8O8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8b8d8f8h8j8l8n9R9 R999")9R99 R9 :::"):$:&:*:2:4:D:F:G:H:J:P:Q:R:S:T:U:V:X:]:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::!:+:-:/:1:3:5:<:>:@:C:D:F:G:H:J:: :W:X:Y:_:`:b:::: :!:":#:%:&:':(:):*:+:,:-:.:/:0:1:2:3:4:6:8:::<:@:B:D:I:J:K:L:M:N:O:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:^:_:`:b:d:f:h:j:l:n;&;*;2;4;;;;;;;;;;;;;;;;;;;;G;_;I;K;M;O;Q;S;U;W;Y;[;];_=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_?&?*?2?4????????????????????G?_?I?K?M?O?Q?S?U?W?Y?[?]?_CqC qC&C*C- C2C4C7qC9C:C<CCCCCCCCCCCCCCCCCCCCC$qC&qC6C8C:CGCCCCCqC qC_CICKCMCOCQCSCUCWCYC[C]C_CoCqCsCqDD DD E-{GGG$G7G9G:G;G<G=GGGGGGGGGGG$G&G6G8G:G;G=G?GCGGGGGGG GXGGG!G#G%G'G)G+G-G/G1G3GoGqGsGVqV qVfVmVqqVrVsVuVxVqV qVT[[[V[_[b[d[i[p[q[r[t[u[x[[[ [T\\\V\_\b\f\i\m\s\v\y\z\{\|\}\~\\\\\\\\\\\\\\\\\\\\ \!]q]r]x]T^^ ^^ _q_ q_f_m_qq_r_s_u_x_q_ q_T```V`_`b`i`t`` aaaaV\a_\ab\afai\amasavayqaza{a|a}a~qaaaaaaaaaqaaqaqaaqaaaaaqaaaaaaa a!aSbqb qbfbmbqqbrbsbubxbqb qbTdfdmdsfffVf_fbfdfifpfqfrftfufxfff fThfhmhshhiqi qifimiqqirisiuixiqi qiTmmmVm_mbmdmimpmqmrmtmumxmmm mToooVo_obodoiotooo qqqqV\q_\qb\qfqi\qmqsqvqyqqzq{q|q}q~qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq q!qSrrrVr_rbrfrirmrsrvryrzr{r|r}r~rrrrrrrrrrrrrrrrrrrr r!sssVs_sbsdsispsqsrstsxsss sTtftmtsttuuuVu_ubufuiumuu vqvrvxvTxxxVx_xbxfxixmxsxvxyxzx{x|x}x~xxxxxxxxxxxxxxxxxxxx x!y){{ {{ || |||| ~) y~     y~ y~         y~       n| q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqql~    n|   n|   n| l|~  qff jlrqs~ffqqq q  q q qqq qn|q qq  r|  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq)l|~    l|~   rsz|  rsv  l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqqqff jlrqs~ffqqq q  q  rsz l|~  ))  n|   n|  rsz|  rsz|   ) js      j  )j       js   s  j        m  m         js    m  m  j   sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R 7$&q7$&q7$&q$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q                        q  q  q                             ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q    q    q    q q  q   !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) & * 2 4 7q 8 9 : <                         $q &q * , . 0 2 4 6 8 : G f m qq r s u x  q  q   q  \ q        T _ a l |\ ~        q    q    q  \  \    \     \        q  I K M O Q S U W Y [ ] _ a c e g i k m o q s q!q!r!x!TSSSS TTTVT_TbTfTiTmTsTvTyTzT{T|T}T~TTTTTTTTTTTTTTTTTTTT T!XqX qX&X*X- X2X4X7qX9X:X<XXXXXXXXXXXXXXXXXXXXX$qX&qX6X8X:XGXXXXXqX qX_XIXKXMXOXQXSXUXWXYX[X]X_XoXqXsXqYY YY ZZZVZ_ZbZdZiZpZqZrZtZuZxZZZ ZT`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`RbIfbWfbYfbZfb[fb\fbfb%fb'fb7fbfbfb4fb5fb]fb^fbpfbfbfjj jj llllllllllllllllllllll lrlslzl|lllllllllllllllllllllllllllll llllllmmmmmmm msmmmnn nnnnnnnnn n|nnnnnnnnnnnnnnn nnnoo ooooooooo omooooooooooooooooooooooooooopppppplp~ppppppppppppppppp p ppprqr qrrrqrrrrrrrqr qrnr|rrrrrrrrqrrrrrrrrrrrrrrrrrrr qrrqrrrsqs qssssssssssssqs qsjsms}sssssssssssssssssssssssssssss s ssssstqt qtttqtttttttqt qtnt|ttttttttqttttttttttttttttttt qttqtttuqu quuuuuuuuuuuuqu qujumu}uuuuuuuuuuuuuuuuuuuuuuuuuuuuu u uuuuuv vx xzzzz zzzzz z|q|q||||||||q| q|r|s|||||| | ||||}} }}}}}}}}} }}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~ ~r~s~z~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~  qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  s s s rsz|    rsz|    rsz|  sl~  )    |   m rsv    )))))) jklqrsuwy}~)))))    ) js   f |   l{=}~j    )l{=}~j  l|~  j  l|~  j  l|~  j  )  )))))) jklqrsuwy}~)))))    ) js  \ \fH\ \|qqH HHq qq qmqq   l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )) jklqrsuwy}~))     s)) jklqrsuwy}~))     sl{=}~j  )  )    |         l|~  j   f m| )  )  )  q qqq qn|q qq  q qqq qn|q qq       rsz|    rsz|   l|~  j    )   rsz|    rsz|    rsz|    rsz|   qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )))))) jklqrsuwy}~)))))    ) js  l{=}~j  l|~  j          q             r v |       q                                                                           q             r v |       q                                      )   q rv|q    q rv|q    r    r|   )  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq     !q! q!&!*!- !2!4!7q!9!:!<!!!!!!!!!!!!!!!!!!!!!$q!&q!6!8!:!G!!!!!q! q!_!I!K!M!O!Q!S!U!W!Y![!]!_!o!q!s!q"" "" #q# q#&#*#- #2#4#7q#9#:#<#####################$q#&q#6#8#:#G#####q# q#_#I#K#M#O#Q#S#U#W#Y#[#]#_#o#q#s#q$$ $$ %q% q%&%*%- %2%4%7q%9%:%<%%%%%%%%%%%%%%%%%%%%%$q%&q%6%8%:%G%%%%%q% q%_%I%K%M%O%Q%S%U%W%Y%[%]%_%o%q%s%q&& && 'q' q'&'*'- '2'4'7q'9':'<'''''''''''''''''''''$q'&q'6'8':'G'''''q' q'_'I'K'M'O'Q'S'U'W'Y'[']'_'o'q's'q(( (( )q) q)&)*)- )2)4)7q)9):)<)))))))))))))))))))))$q)&q)6)8):)G)))))q) q)_)I)K)M)O)Q)S)U)W)Y)[)])_)o)q)s)q** ** +q+ q+&+*+- +2+4+7q+9+:+<+++++++++++++++++++++$q+&q+6+8+:+G+++++q+ q+_+I+K+M+O+Q+S+U+W+Y+[+]+_+o+q+s+q,, ,, -q- q-&-*-- -2-4-7q-9-:-<---------------------$q-&q-6-8-:-G-----q- q-_-I-K-M-O-Q-S-U-W-Y-[-]-_-o-q-s-q.. .. /q/ q/&/*/- /2/4/7q/9/:/</////////////////////$q/&q/6/8/:/G/////q/ q/_/I/K/M/O/Q/S/U/W/Y/[/]/_/o/q/s/q00 00 1q1 q1&1*1- 121417q191:1<111111111111111111111$q1&q16181:1G11111q1 q1_1I1K1M1O1Q1S1U1W1Y1[1]1_1o1q1s1q22 22 3q3 q3&3*3- 323437q393:3<333333333333333333333$q3&q36383:3G33333q3 q3_3I3K3M3O3Q3S3U3W3Y3[3]3_3o3q3s3q44 44 5-{66 6Y6Z6[6\6]6676<6>6@6666 6p7-{88 8Y8Z8[8\8]8878<8>8@8888 8p9-{:: :Y:Z:[:\:]::7:<:>:@:::: :p;-{<< <Y<Z<[<\<]<<7<<<><@<<<< <p=-{>> >Y>Z>[>\>]>>7><>>>@>>>> >p?-{@@ @Y@Z@[@\@]@@7@<@>@@@@@@ @pA-{BB BYBZB[B\B]BB7B<B>B@BBBB BpC-{DD DYDZD[D\D]DD7D<D>D@DDDD DpIII$I7I9I:I;I<I=IIIIIIIIIII$I&I6I8I:I;I=I?ICIIIIIII IXIII!I#I%I'I)I+I-I/I1I3IoIqIsIJJ JYJZJ[J\J]JJ7J<J>J@JJJJ JpKKK$K7K9K:K;K<K=KKKKKKKKKKK$K&K6K8K:K;K=K?KCKKKKKKK KXKKK!K#K%K'K)K+K-K/K1K3KoKqKsKLL LYLZL[L\L]LL7L<L>L@LLLL LpMMM$M7M9M:M;M<M=MMMMMMMMMMM$M&M6M8M:M;M=M?MCMMMMMMM MXMMM!M#M%M'M)M+M-M/M1M3MoMqMsMOOO$O7O9O:O;O<O=OOOOOOOOOOO$O&O6O8O:O;O=O?OCOOOOOOO OXOOO!O#O%O'O)O+O-O/O1O3OoOqOsOQQQ$Q7Q9Q:Q;Q<Q=QQQQQQQQQQQ$Q&Q6Q8Q:Q;Q=Q?QCQQQQQQQ QXQQQ!Q#Q%Q'Q)Q+Q-Q/Q1Q3QoQqQsQSSS$S7S9S:S;S<S=SSSSSSSSSSS$S&S6S8S:S;S=S?SCSSSSSSS SXSSS!S#S%S'S)S+S-S/S1S3SoSqSsSUUU$U7U9U:U;U<U=UUUUUUUUUUU$U&U6U8U:U;U=U?UCUUUUUUU UXUUU!U#U%U'U)U+U-U/U1U3UoUqUsUXIRXWRXYfXZfX[fX\fXfX%RX'RX7fXfXfX4RX5RX]RX^RXpfXRXRZIRZWRZYfZZfZ[fZ\fZfZ%RZ'RZ7fZfZfZ4RZ5RZ]RZ^RZpfZRZR\IR\WR\Yf\Zf\[f\\f\f\%R\'R\7f\f\f\4R\5R\]R\^R\pf\R\R^IR^WR^Yf^Zf^[f^\f^f^%R^'R^7f^f^f^4R^5R^]R^^R^pf^R^R`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`Raaa$aaaaaaaaaaCaa aXaaa!a#a%a'a)a+a-a/a1a3fIffWffYffZff[ff\ffff%ff'ff7ffffff4ff5ff]ff^ffpfffffhIfhWfhYfhZfh[fh\fhfh%fh'fh7fhfhfh4fh5fh]fh^fhpfhfhfjIfjWfjYfjZfj[fj\fjfj%fj'fj7fjfjfj4fj5fj]fj^fjpfjfjflIflWflYflZfl[fl\flfl%fl'fl7flflfl4fl5fl]fl^flpflflfnIfnWfnYfnZfn[fn\fnfn%fn'fn7fnfnfn4fn5fn]fn^fnpfnfnfooo")o$o&o*o2o4oDoFoGoHoJoPoQoRoSoToUoVoXo]oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooo!o+o-o/o1o3o5o<o>o@oCoDoFoGoHoJoo oWoXoYo_o`oboooo o!o"o#o%o&o'o(o)o*o+o,o-o.o/o0o1o2o3o4o6o8o:o<o@oBoDoIoJoKoLoMoNoOoQoRoSoToUoVoWoXoYoZo[o\o]o^o_o`obodofohojolonpRp Rppp")pRpp Rp qqq")q$q&q*q2q4qDqFqGqHqJqPqQqRqSqTqUqVqXq]qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqq!q+q-q/q1q3q5q<q>q@qCqDqFqGqHqJqq qWqXqYq_q`qbqqqq q!q"q#q%q&q'q(q)q*q+q,q-q.q/q0q1q2q3q4q6q8q:q<q@qBqDqIqJqKqLqMqNqOqQqRqSqTqUqVqWqXqYqZq[q\q]q^q_q`qbqdqfqhqjqlqnrRr Rrrr")rRrr Rr sss")s$s&s*s2s4sDsFsGsHsJsPsQsRsSsTsUsVsXs]ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssss!s+s-s/s1s3s5s<s>s@sCsDsFsGsHsJss sWsXsYs_s`sbssss s!s"s#s%s&s's(s)s*s+s,s-s.s/s0s1s2s3s4s6s8s:s<s@sBsDsIsJsKsLsMsNsOsQsRsSsTsUsVsWsXsYsZs[s\s]s^s_s`sbsdsfshsjslsntRt Rttt")tRtt Rt { {{ {")$q&*247)D\FqGqHqJqPQRqSTqUVXYZ[\]qqqqqqq\\\\\\qqqqqqqqqqqq\q\q\qqqqqqqqqqqqqqq qqqq!$)&)+-/1357<>@CqD\F\GHqJ WXqY\_`qbq\q \!q"\#q%q&\'q(\)q*\+q,\-q.\/q0\1q2\3q4\6q8q:q9 9B%HS myR  .  .8*f r    J   6 j   (D 8l \ \ T\Digitized data copyright 2010-2011, Google Corporation.Open SansItalicAscender - Open Sans Italic Build 100Version 1.10OpenSans-ItalicOpen Sans is a trademark of Google and may be registered in certain jurisdictions.Ascender Corporationhttp://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0Digitized data copyright 2010-2011, Google Corporation.Open SansItalicAscender - Open Sans Italic Build 100Version 1.10OpenSans-ItalicOpen Sans is a trademark of Google and may be registered in certain jurisdictions.Ascender Corporationhttp://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0ff      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~.notdefnullnonmarkingreturnspaceexclamquotedbl numbersigndollarpercent ampersand quotesingle parenleft parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon semicolonlessequalgreaterquestionatABCDEFGHI.altJKLMNOPQRSTUVWXYZ bracketleft backslash bracketright asciicircum underscoregraveabcdefghijklmnopqrstuvwxyz braceleftbar braceright asciitildenonbreakingspace exclamdowncentsterlingcurrencyyen brokenbarsectiondieresis copyright ordfeminine guillemotleft logicalnotuni00AD registered overscoredegree plusminus twosuperior threesuperioracutemu paragraphperiodcenteredcedilla onesuperior ordmasculineguillemotright onequarteronehalf threequarters questiondownAgraveAacute AcircumflexAtilde AdieresisAringAECcedillaEgraveEacute Ecircumflex Edieresis Igrave.alt Iacute.altIcircumflex.alt Idieresis.altEthNtildeOgraveOacute OcircumflexOtilde OdieresismultiplyOslashUgraveUacute Ucircumflex UdieresisYacuteThorn germandblsagraveaacute acircumflexatilde adieresisaringaeccedillaegraveeacute ecircumflex edieresisigraveiacute icircumflex idieresisethntildeograveoacute ocircumflexotilde odieresisdivideoslashugraveuacute ucircumflex udieresisyacutethorn ydieresisAmacronamacronAbreveabreveAogonekaogonekCacutecacute Ccircumflex ccircumflexCdotcdotCcaronccaronDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflexGbrevegbreveGdotgdot Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbar Itilde.altitilde Imacron.altimacron Ibreve.altibreve Iogonek.altiogonekIdotaccent.altdotlessiIJ.altij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotLslashlslashNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautOEoeRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexScedillascedillaScaronscaron Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflex YdieresisZacutezacute Zdotaccent zdotaccentZcaronzcaronlongsflorin Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccent circumflexcaronmacronbreve dotaccentringogonektilde hungarumlauttonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos.alt Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIota.altKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9Iotadieresis.altUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronpirhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055.alt afii10056.alt afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveendashemdash afii00208 underscoredbl quoteleft quoterightquotesinglbase quotereversed quotedblleft quotedblright quotedblbasedagger daggerdblbulletellipsis perthousandminutesecond guilsinglleftguilsinglright exclamdblfraction nsuperiorfranc afii08941pesetaEuro afii61248 afii61289 afii61352 trademarkOmega estimated oneeighth threeeighths fiveeighths seveneighths partialdiffDeltaproduct summationminusradicalinfinityintegral approxequalnotequal lessequal greaterequallozengeuniFB01uniFB02 cyrillicbrevedotlessjcaroncommaaccent commaaccentcommaaccentrotate zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperioruni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200BuniFEFFuniFFFCuniFFFDuni01F0uni02BCuni03D1uni03D2uni03D6uni1E3Euni1E3Funi1E00uni1E01uni1F4Duni02F3 dasiaoxiauniFB03uniFB04OhornohornUhornuhornuni0300uni0301uni0303hookdotbelowuni0400uni040Duni0450uni045Duni0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BF uni04C0.altuni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CE uni04CF.altuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7 uni1EC8.altuni1EC9 uni1ECA.altuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1uni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni20ABuni030Fcircumflexacutecombcircumflexgravecombcircumflexhookcombcircumflextildecombbreveacutecombbrevegravecomb brevehookcombbrevetildecombcyrillichookleftcyrillicbighookUCcyrillicbighookLCone.pnumzero.osone.ostwo.osthree.osfour.osfive.ossix.osseven.oseight.osnine.osffuni2120Tcedillatcedillag.altgcircumflex.alt gbreve.altgdot.altgcommaaccent.altIIgraveIacute Icircumflex IdieresisItildeImacronIbreveIogonek IdotaccentIJ IotatonosIota Iotadieresis afii10055 afii10056uni04C0uni04CFuni1EC8uni1ECA   46latnMOL ROM  nlatnMOL (ROM B      ligaligaligalnumlnumlnumloclloclonumonumonumpnumpnumpnumsalt saltsaltss01"ss01*ss012ss02:ss02@ss02Fss03Lss03Rss03Xtnum^tnumftnumn    &.6>FNV^Pz2HJJ.,ZgwEG      !$%IJ6 "(^IO]ILI5O4LI^V0R *H C0?1 0 +0a +7S0Q0, +7<<<Obsolete>>>0!0 +UazƲIVv]0z0b8%a&Z0  *H 0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0 070615000000Z 120614235959Z0\1 0 UUS10U VeriSign, Inc.1402U+VeriSign Time Stamping Services Signer - G200  *H 0ĵR`)J[/Kk5TX56^bMRQ4q{f*j 7٘tvJcEG.k NK+XJ,XB-uލǎlLgrIž`<cxi{-004+(0&0$+0http://ocsp.verisign.com0 U003U,0*0(&$"http://crl.verisign.com/tss-ca.crl0U% 0 +0U0U0010 UTSA1-20  *H PK$ $- 7 ,Za񑑳V@뒾89u6t:O7ʕBǠWdB5N3M'L8MxSݤ^ ⥾`߭(ǥKd[98"3/!?DA e$HDT\y>]r},CS}=*:Om ]^SWp`+nx'4[^I2300-GߍRFCmH 10  *H 01 0 UZA10U Western Cape10U Durbanville10 U Thawte10U Thawte Certification10UThawte Timestamping CA0 031204000000Z 131203235959Z0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0"0  *H 0 ʲ }uNgadڻ30X~k6xw~o< hlʽR-H=]_/kLR`@~ ?Ǵ߇_zj1.G 1s W-x43h/Š*Ë!fXWou<&]'x1"ijGC_^|}bM "Vͮv M٠h;004+(0&0$+0http://ocsp.verisign.com0U00AU:0806420http://crl.verisign.com/ThawteTimestampingCA.crl0U% 0 +0U0$U0010U TSA2048-1-530  *H JkXD1y+LͰXn)^ʓR G'/8ɓN"b?7!Op18UN$ҩ'NzaA*^ݻ+>W~ +;R8'?J00eeR&.Y)"\0  *H 0_1 0 UUS10U VeriSign, Inc.1705U .Class 3 Public Primary Certification Authority0 090521000000Z 190520235959Z01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0"0  *H 0 g`IoV|f^ q-!ќPL"5; .Z|=;%X{ ξ'tag'MjaXy'M4+G Df$fO8TrfujIh8y 0,`Hת809:|@T/ܨR>+!\ P4.M^%Ԍn|)]1ZՌgX5+!`x^{`W ]A cT`C!00U00pU i0g0e `HE0V0(+https://www.verisign.com/cps0*+0https://www.verisign.com/rpa0U0m+ a0_][0Y0W0U image/gif0!00+kπjH,{.0%#http://logo.verisign.com/vslogo.gif0U%0++04+(0&0$+0http://ocsp.verisign.com01U*0(0&$" http://crl.verisign.com/pca3.crl0)U"0 010UClass3CA2048-1-550Uk&pȡ?-50  *H ݔAaix0Ɛ<~B$s/DrPU nQj71ܥ-OM2NgUejzd8xEv1z`³]fvYI8VAwX00fgymPSo0  *H 01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0 100729000000Z 120808235959Z01 0 UUS10U Massachusetts10 UWoburn10U Monotype Imaging Inc.1>0<U 5Digital ID Class 3 - Microsoft Software Validation v210U Type Operations10UMonotype Imaging Inc.00  *H 0Di|U 25L3^ L*8ט@I "SOCʋVnH9c;$5}rGWyˊJ@p-5cįפ {uePd"}KXEMYLM00 U00U0DU=0;09753http://csc3-2009-2-crl.verisign.com/CSC3-2009-2.crl0DU =0;09 `HE0*0(+https://www.verisign.com/rpa0U% 0 +0u+i0g0$+0http://ocsp.verisign.com0?+03http://csc3-2009-2-aia.verisign.com/CSC3-2009-2.cer0U#0k&pȡ?-50 `HB0 +700  *H N"gA~™cjrb<8=_G_[KI  VD 5< D`E*oL;4gpZ9\Zl5|eKmIp=b۴A~}n"w6MZ S1+(RzkwD ]%,͊0>KyʦN $ 񺐶\<'ML kernT+ ~h6loca=ZlVmaxpj name 悤-postCl$&+prepގ]:f_< BK b   X/\5,33f @ [(1ASC X ? +7uq{-R-=hhoD\sq^+myoLooo^9qjoZH\o1 #3N9R3XJ=bwwdwf/-wwT7R=THoN+T!PdNuRo\dmo5)=q+LFuH; )^Jujjjjo4oZoo:/w9=b=b=b=b=b=bbwdwdwdwdwkuwwwwwow=b=b=bwwwww/wjdwjdwjdwjdwjdw/-/-/-/-oo$o$oZ'oZhZHawww/wm\oT\oT\oT\oT1 1 1 #399RRRRRRs=bubw\oT++u%7sd?5!))HujRoZ?)h=1 9oN{3Ro:9w^uw u^wwuwwwwmwwuwwj \ooZo:HR  9j=yRs1  oN\ D F9=b{^^)dwRD\fww)\w7+)Db;)dw^wTw^#3#3#39RRRJ))D)ffD{{ q R HqhNJms 3Rf 5ZwVod%{oooow551D+=3%VyTT) P3=b`{3w<Qjjdw bJ s dyR#{w -wZw!w wsu))//^ jyRD1' ^)Bbww1 )99 7 )\\Hd=5d=5oZ=R=?s\\foZ=b=bubjdwdwdw=RyRDRwwwFD   \^/^ 7N7owqwR PRVs wj )s^s\=b=b=b=H=b=b=b=b=b=b=b=bjdwjdwjdwjdwjdkjdwjdwjdwoZpoZwwwwwwwwwwww999w uu;11?w33*d-/{s\1 wwwwwAZ 0HI~'2a7 # O_?M   " & 0 3 : < D p y  !!!! !"!&!.!^"""""""+"H"`"e% IJ(3b7 #P`>M   & 0 2 9 < D p t  !!!! !"!&!.!["""""""+"H"`"d%aIvhcb]gD Xz}} Bvt n%"iOS0L\pr`<&'()*+,-./0123456789:;<=>?@AIJ$%TUVWXY\]^_`abcdefhijklmnopqrstuvhijkFopqrstu45]^@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-@ TF!SRRFXPF!H U UHUOMXNMRMFQ'3&U&2%3$U3U3ULJOKJxJF:3UU3U?IFXHFGF FF7F#3"U3U3UU3UOU3UoTS++KRK P[%S@QZUZ[XYBK2SX0YKdSX BYss++^stu+++++t^s+++^st+++++++++++++++++++++++^Nu?_Z^WR^a[Y`RVRRp$$$$Pv~!Up+nch Ci K 2  D b $ a  b @y;d|T3uMy c0E~@e+Fm'QY3?z7js:Pe{ .@  ! 3 !'!!!!!!"2""""""########$$$*$$$$$$$%K%%%%%&&[&l&}&&&&'<'M']'n'~'''''''(S(d(t(((((((()))")2)C)T)`)p)))*C*T*e*v*********++!+-+8+s++++++++,,P,a,q,},,,,,-G-X-h-y---........///'/7/C/O/`/p/{////070H0X0i0y00000001H1Y1j1{111111122*2z33333334 494g44445,5j555666*6;6M6^6p6|666666667?7G7O7}7777778=8E8M8899o9999999:I::;\;<">s>? ?A?|?@?@@AAA/A?APAbAABBB$B6B>BBC8CICZCCCCCD7D?DDE"E3EgEEEEEEEEF#F+F3FdFFG GTGGH8HHHIXIIJ#J+JyJK KKOKKLL L2L:LBLhLpLLM MHMyMNNRNNOEOOPPPiPqPyPPPQOQWQgQwQQQRRR'R8RJR\RmR~RRRRRSS3STSSST"TTTUUU]UeUUUUV VWVW4WX(XYYYYaYYYYZZsZZ[[/[[[[\i\\\]]+]7]a]]]]^$^g^^__z______________aahayabbGbbbbbcc8cvcccdUddee ee9ePeaereeffhfg!gghuvvkvw,wwxxnxyypy|yyzzSzz{8{v{{|=|||}}h}~|~~~~~4zMȁ\OgYarۅ.y S+vȈ (9I[lt|@RcuO`pƊ؊ -?Pbs‹ikGOUZL֓u}Ӕ$0 BzUo() |Vn&xq  ,0K@'0-./!'  !'-/21**0/0/$?3?3??9/39/3933333310324&#"#"&5463232#"#"&54632#Z`c^`ZݖwZ``Zݔ`+uܹrq'J{ +7Q@-2 ,) 98$%/  5LY !LY?+?+?99993333310467'&&546326673#'#"&2676654&#"{KB@=V `? \mǀgy7(Pp||jrslRGJik7HtZS,tWgHevOROkU_^ut?9310#!=!R @   ?/99331073#&Rq0o1 ή3l= @   ?/993310#'3ۛo0q1:͵1h@ ?910%'%7w%u|}z'kh'G{GT'ho# 8@#  RY/?_ /]3+3939910!!#!5!3qNRPRRPRD3//9910%#7' KcAM!\7R@ SY/+99105!\RRD@  QY?+93107432#"PRRPNbbb@ ??993310#h Js (@  MY MY?+?+993310#"3232#"}v~pPIDP @    ?3?9933310!#47'3b  9V)G)q2@  MYNY?+?+993310!!5>54&#"'632!m>6߿ۓXZE̳^(Q@+#  *)NY  &&MY& MY ?+?+9/_^]+99333910!"'532654&##532654&#"'6632ӫߦT\ܞխmp1U{^Sc,2`z=JCGS+u @@!  MY?33?9/+993333310##!533!7#u^yguuC .%:@ MYNY MY?+?+9/+933102#"&'532654&#"'!!6 mBl_‚<:-o+(g7+˭''`#&N@*# (' OY  OYMY?+?+9/_^]+9933310$32&#"36632#"2654&#"^NIg LmߤfhcoXbdSοZNoxm+@NY?+9?93310!!5!NZV`Iy$1W@/ /( ",32",,"OY, ,, %MY MY ?+?+9/_^]+9393333102#"&5467&&546632654&'"6654&F㍞즮j򻨤ȝบe?wϾpIOFLviV|UGyFkW:?kxo (N@*% *)!OYp MY OY?+?+9/_^]+9933310#"'532##"&5432"326654&& hX+y  Inǐu#eg]J|VeV`gcչZMusD-9@"  QY / O o   QY?+/_^]+9399107432#"432#"&PRRPPR/#".Nbbbbb5..LD-/@  QY_   /]+//9310%#67432#"&/ KcABPR/#".a)lbb5..o # @?_/]93105#L7 =_ko#?@) RY RY/o/]+_^]]+9105!5!oLuRRhRRo # @?_/]93105o7Ljc_&=`9'A@!$  )(& PY&"QY&?+?+9/93933310546776654&#"'6632432#"%Ke[H>OP%nO$A\8@EsPRRPy%{YO=xN#'P0 ŬDfWQ/6Ybabbbq;5@T@-<;6 ". (.BA >+990 @  2%+2?3/39/]3339/39933333310#"&'##"&543232654$#"!267# $3232&#"Yo +lŠFQgۼN3]zKnwOrl]de)0hi$$4cPeZ#<@     LY?3?9/+99333310!#3#!&'qLA@s # D`>n`NQ@+   !LY LYLY?+?+9/_^]+99333310! #!!2654&#!! !@fBλXT+uJ-&@LY JY ?+?+9310 !27# 4$32&?*=֩)o/Z3eTP\P%(@  LYLY?+?+993310!!! !!3 %~^mo:= E@%   JY JY JY?+?+9/_^]+933310!!!!!!!Gn^^ <@!  JY? JY??+9/_^]+93310!#!!!!5f!El^_):@ KY LY LY?+?+9/+93310!! 4$32&# !27!U)B8ʍMeZfYX\X9 7@  JY/ ?3?39/]+99333310!#!#3!3gffVg1wZ 7@   LY LY?+3?+3933310!!57'5!FB AAH5 @  JY"?+?93310"'5323!\;NGfXJ 5@     ?3?399333310!##373}ff=V@KY?+?9931033!f`>@     ?33?39933933333310!##333#47#Rbg F|JTt|.@  ?3?39999333310!###33&53g bfa cvL (@  KY KY?+?+993310! ! ! ! _02ZTk^]mT=<Q? 4@  LY LY??+9/+9933310!##! 32654&##?ff 9@  KYJY?+3?+9333310## ! ! ! M!_02ZT6J^]mT=<Q R@.   LY?O  LY?+?39/_^]+393333310#! #%!2654&##5f\z}ʓ,f}Xo$4@ %& LYJY?+?+9993310# '532654&&'&&54$32&#"Fε%;Oy;fCSmZ4MNXLQhS:;o '%@ KY?+3?9310!#!5!!Lg%%V``%@  LY?+?3993310!"533265gNN *@ ??3993333103#367/oZmpT;JqK3D@"    ?3?3393993333333310!#&'#363663\T(;VnkNq%3 ) ghYWR9aUO(wlH,N 5@    ?3?3999333310!##33NuPHqAsm;VrF9,@ ??3993339103#3niu -RJ 8@  KYKY?+9?+993310!!5!5!!JXqL `LZ@  ?3/3993310!!!!ZTJ^@ ??993310##gJ3@  ?3/3993310!!5!!3JT=^X19'@?2993333103#XDdur1pNH@ SY/+3310!5!NRR! @  /99310#&&'53E`!FO/0LbR$Q@, "&% IY    HYFY?+?+?9/_^]+99333310!'##"&54$7754&#"'632%2655JRv ~%'ɾ}iWHTVT-FDZk yfqL!>@   #"  FYHY?+?+??99993333102#"&'##3366"3265t6 >c>yT`XyXJUb\ZwT&@ FYFY?+?+9310"32&#"327hhιh&-1X/5\3w >@   !   FYHY?+?+??999933331023&53#'##""!26554&DvDbA|ᲳgTVh~y즺 *Z2wTG@'    HY HYFY?+?+9/_^]+933310"32!3267"!4&mͿ]l\{$9P+Z(ý=@  HY HY?+33?+?9399310!##5754632&#"!JcʓZZPOta:%TȻVe-T)3?@G :4$.*$A@'2! 7IY` )2GY)'=IY')IY),IY?+?+?+9/+9/_^]+339993333310#"'332!"&5467&&547&&54632! 4&## 32654&#"ZѰJ;>O]w1;_jϰk;MS?EpT/40pM2mS'l bX~3@    FY ?3??+999333310!4&#"#33663 õcc=rbXs9) %@ `  ???]933310!#3432#"ccq?##??.`2.-4) 4@  @FY?+??_^]9333310"'53253432#"%P7E@  !   FYHY?+?+??9999333310"32373#47#'2654&#"9uTbvƩ -z~X T,@   FY?+??99933102&#"#3366bEODIcT CT_?xaTXT#4@ %$ FYFY?+?+9993310#"'532654&'.54632&#"XڀC͸%yCCkRkYRp6;UkMzBZBXNUf?5UlyF;@    HYHY?+?+333/939910%27#"&5#5773!!^FH^23?XDP:-VP}x?0@     FY?+??39993331032653#'#!  ·bTj?@X? (@    ?2?39333310!33673\f8)+f\?jr?L@'     ?3?33939393333333310!&'##33673363$-bj=;ZHHdJJ+?nMkLAp7? 3@     ?3?399933331033##rDAmsm/6?2@   FY?+?3/393333103363#"'532>7fi*_f;PkL9F:C3N?S ?b\l6V0e!RZ? 8@  HYHY?+9?+993310!!5!5!!Zw?X?X=7@   ?3/39/3993993310"&54'5665%wåzlh|XbaYfe[QPbc^+Zjhς{X@ ??93103#\\H7@    ?3/39/39939933104675&&54&'52#5665NYaaY{myÍy'{1gkZdaP[egoh#=,@ o@ H/+]329910"56323267#"'&N1v8l}=le~^8k>0qIt|=;^n,:=@`1@H9HT )@" QY?+?9/9333103#432#"&=wPR/#".ibb5.._@;  MY  MY 0`p??9/]q+39/_^]3+939910%&5475332&#"327###ZͺRgɴn R"+!7T3:\8N1O@*     OYMYNY?+9?+9/3+39399310!!5665#534632&#"!FN)n{ķ#t0`TR)DVBR 'T@%  )(@ H @ H  "o/]329+2+293310'#"''7&547'763272654&#"Z;nk;ZZ;gi;Ziӗi<]]P@-5*8<1 %@?<5-! IY !'IY!?+?+99933333310467&&54632&&#"#"&'532654&&'&&76654&&'eXVNˮ#[M3xVV\V2Ȑe?RX@Qc-S&/nQu@P"YK6E>+@fe*lR%_Nc[7AB.IqANH?)r@>PJ2pPL@  /329933104632#"%4632#"P @@?} @@?m.(VVV.(VVdD%5N@/.&76     "2*"?3?399//]3]3933310"327#"&54632&4$32#"$732$54$#"Trfj޺wl%b^^]0/͵ϲD+X-4S-^ZƲѲ0.N!D!7@ #" ?3]39/39333310'#"&5467754&#"'632%32655Tv_p_LDWm!urdF=ZiXtz-HTbZdg+MK1I8=6>d\@=R}- -@    _/]329333310%R5>>h6==++++o3@ RY/?_ /]+99310#!5RR\7RdD%5c@6  .& 76  "2*"?3?399//]3]39/33933333331032654#####324$32#"$732$54$#"p[hnMHyҨeӏ^^]0/͵ϲ]YOy"whp|^ZƲѲ0.f@ SY/+3310!5! Ru #@ ?  ?3]29933104632#"&732654&#"~~~ZzWV{xYZw[~|]\}o#'+W5Ju%@   ?33?393310!576654&#"'632!u}^]Mlm1w|6SJNyMGSRAgo/TW])9#?@% %$O_o ! !?3?39/]]3993310#"'532654&##532654&#"'632hXIxswwwij^Pv/Nk-bWSNTWMCQNF^x! @    /993106673#I$hFO04W??@     FY?+???39399933331032653#'##"&'#·bT2uc3c?@XM]79\Nb+qR-@ JY/+/9/393310####"&563!Rdd@RF3oD3+'@    /?39/393310#"'532654'73yD>NR]`Bde X 84^u%LJ @    ?2?99933103#47'^\b /#czMF! %@  ?3]2993310#"&54632324&#"dmmduH}# )@   _/]3/293310'7'7#>>5==5w+jk+yw+jk+y;p&{'?< ?55 {&{'t?5)&u'<F +?55Ju%T(?@ #*)!!&QY! PY#?+?+9/939333103277#"&54667>55432#"&9OaZI>}l@%oN(M@E/PR/#".%}UO=wO|.O0 ƪFl`o5[aa+bb5..s&$CR&+5s&$voR&+5s&$KR&+5&$RR&+5&$jR &+55&$P ?55m@;   JY   LY JYJY?+?+3?9/+9/_^]+93333993310!!!#!!!!!!#3%om@gd^^&&zs&(CR &+5s&(vFR&+5s&(KR&+5&(jR &+554s&,CR &+5Z_s&,vWR&+5[s&,KR&+5:6&,jR &+55/% [@6 JY?_o  LY LY?+?+9/_^]3+39399310!!#53! !!!!3 %~^moj^:=^&1RuR&+5s&2CmR&+5s&2v%R!&+5s&2KR%&+5&2RR"&+5&2jR (&+55w @  _   /]910'7H:h:ij9i9 :ih9h9:#U@1  %$!  !KY KY?+?+3399933910!"''7&!27'3 &# VJZ_0lHooËkxx;q]y<;jT=ȫ fs&8C9R&+5s&8vR&+5s&8KR&+5&8jR "&+559s&<v)R&+5? @@!  LY  LY/  ??9/]+9/+99333310!##3! 32654&##?ff  D4A@" & -. .65&2.2)HY2HY?+?+?999333310#"&'532654&'&&54676654&#"#4632Q;JAj[-_/AEryNn`AJJAcϽo@I',0B-KckC%k&0mjSzKWxV9QELTyl璥̺&QR&+5w9!&RC&+5w9!&Rvj"&+5w9!&RK &&+5w9&RR#&+5w9&Rj )&+55o# \@=RYP  RY@/?_ /]333/]+/_^]q+9399105!432#"&432#"&oPR/#".PR/#".RRcc4..tbb5..w9h#U@1  %$! FY !FY?+3?+399933910#"''7&5327&#"4'3269vVH]yz`JhpNbH^!bq:x )h|7zZwBR!&XC&+5!&Xvf&+5!&XK &+5&Xj #&+55!&\v"&+5L >@"! FYHY?+?+??9999333310632#"'##3265!"rsccsټTJXby&\j )&+55&$M1R&+5b5&DM(&+5!&$NR&+5b&DN%&+5B&$QbBR)4j@< ..'2 !'65@P '#.IY #'#HY#*FY?+?+?9/_^]+99/_^]393333310327#"&54767'##"&54$7754&#"'632%2655j1!(@Tc(&YRv ~%HGɾ}n T_WFECGiWHTVT-?qDZk yfqs&&vR &+5w!&Fv3&+5s&&KR$&+5w!&FK#&+5&&OR&+5w&FOX&+5s&&LR&+5w!&FL&+5%s&'LPR&+5w;&G8/%w'b@8 $)( IY FY  !HY?+?_^]+??9/3+39993391023&55!5!533##'##""!26554&DvD'bA|ᲳgTVh~ykRR *Z2&(MR&+5w5&HM&+5!&(N R &+5w&HN&+5&(Om5&+5w&HON$&+5B&(QPwgT&HQN%s&(LR&+5w!&HL&+5)s&*KR(&+5-!&JKM&+5)!&*NR&+5-&JN@&+5)&*O?R#&+5-&JOH&+5;)&*9-!&J:?D&+5s&+KR&+5&KK"&+5`@4    JYJY/ ?3?39/]+9/33+3393399103!33##!##5!fVggf^1J^Y@2     IY  FY ?]+?3?9/3+393933910!4&#"##5353!!3663 ųcc'=rRRbXsX&,RR&+5O&Rz&+5$O&,MR&+55&M&+5$M!&,NR &+5&N&+5ZB&,Qf'BF&LQZ&,OFR&+5?@ ??9310!#3cc?Z&,-o&LMH$s&-KR&+5 !&7K&+5;&.9;&N9)? 7@       ?3?3993333103##3+xTwcccb0%}?s&/vYR&+5&Ov &+5;&/9Ba;(&O9&/8 ?5H&O8&/Ok&OO8 9@   @ KY?+?9/99399103'73%!ω)fD/'VJp+L` =@$   ?_ ??9/]q99399107#'73+c-c1gF1VHs"s&1vR&+5!&Qv`&+5;&19;T&Q9Ps&1LR&+5!&QL&+5Z&QL<@   JY"?+?33?3999333310!!"'5325##33&53];NH bfa cX vLT>@ FYFY?+?+??999333310"'53254&#"#336632O9En_[^^wT ,3g@7'0'1! '54 0HY00 00 -* *FY $$FY?3+3?3+39/_^]+99933339910"&'#"&532!2!326732654&#"%"!4&7;ƙt9n!Ų]l\Ŵ )P+Z(5½s&5vbR &+5!&Uv&+5;&59m;T&U9s&5LR&+5!&ULx&+5os&6v?R.&+5TX!&Vv-&+5os&6KR2&+5TX!&VK1&+5o&6zFTXT&Vzos&6LR(&+5TX!&VL'&+5 ;'&79;yF&W9| 's&7LR &+5&W8D '?@!  JY  KY ?+3?9/3+3939910!!#!5!!5!!Lbgf%%_F_=``yFR@-  HY @  HYHY?+?+339/3+3939103#5773!!!!327#"&5#)23?5X^^FH^9:-VV}xP/&8RqR&+5&XR&+5&8MR&+55&XM#&+5!&8NR&+5&XN&+5&8PR &+55&XP &+55s&8SR #&+55!&XSX $&+55B&8QB/?#M@*  " "%$@P # #FY?+?3?393/_^]3933331032653327#"&54767'#!"&5 ·bHGj1!(@Tc('Nj?@X?qHn T_WFEE<3s&:K?R)&+5!&ZK)&+59s&<KR&+5!&\K&&+59&<jR &+55RJs&=vXR&+5RZ!&]v&+5RJ&=O\R&+5RZ&]O&+5RJs&=L R &+5RZ!&]L &+5 !@ HY?+?93310!#4632&#"cZZPOta˸VD@$ MYMY MY?+?+9/3+39399105754632&#"!!#"'5325/ϙReYGsf玈U7NBV;%ɺVXZ%.}@J(*   *.  0 /.@H. # JY  O(_(o(( ?3]9////]+_^]33+333393333310#!#&&54632&'32654&#"7673#DRD)sn5DTxabx1$(чL=>LN<2@ IY    HYFY?+?+?9/_^]+92_^]2]9/9333333310!'##"&54$7754&#"'632%26556673##"&5463232654&#"JRv ~%'ɾ}0k!#DD#xaaxxaaxL>>KN;)bDFzclqFCCxejr]+q! (@    /299333310#&'53673qHbLFrklqF{^qr]%P5@  H/+39910!!%+5R7` @   /22993310"'332673JR]XX]PWKKW 3  /9310432#"@""@m`2.-4s%  @   /32993310#"&5463232654&#"%xaaxxaaxK>>KN;>Katta^uv]BKKB@KL?B^&@    `p//]393310327#"&54673j1!(@TcPHZHGn T_WF8?q&@    /22993310"&'&&#"#663232673 $N> = -<I jT0P*"@.>Lj%5(EWo2",IStz!#@   /32933106673#%6673#HUwFRHUwF!rm!rms @    /993106673#8wZ4:KeMX5h1@  /39/33933310673##432#"%432#"K(ug2:@??@@??@}4GVVVVVVV &$T:?5oD3H &(ZT?5L &+ZT?5 ',T?5 &2 T?5) '<T ?5 &vTP&U &&+555$%@JY?+?99310!#!!5f!E^}((RJ=+H@*  JY?_o  KY KY?+?+9/_^]+93310!!%! ! ! ! g_02ZT_#k^]mT=<QZ,. *@ ?3?993333103#3#&'qqT1HsL%D`@"&% #HY?+3?93933333105!#654&&'&&54>7!݁::2?`r4vjѸ3\iVKqO!:VC<~Vg17,&мdT7@      FY?+???9399333104&#"#336632cT6p?WSMw+ I@'   HY/ HY HY?+?+9/_^]+99333310# 3  !"!3-a# _  qm LH=P?@  HY ?+?99310327#"&5]jA@R%?oT ?!"?@ "$#  IY IY?+?+?9333939310#'.#"5632327#"&''# 7#2B0,:?3DXD/$04C` YDkS* K.k++ J@Im_R?w? (@   ?3?2399333310333#f"8_f??qvwos/\@0!'  , $'10..IY..%#'$%$HY%?+3?9/+9939333339910#"#654&&'&&54675&&5467##5!#"!3)A}q`r5ujϺysEX| ]wK#&fawc2:*&ơ* $o+ VO^fw9TR?7@    HYHY?+?+33?93310%27#"&5!##57!#=*%-[gbݥD Ttq:V5T;@   FYHY?+?+?999933310#"&'##32%"32654&5TAb5Daþ#55^# ==woT 5@ "! #FY?+?939333310#6654&'.532&&# F%3`7;vM E*j`"h_,SJGJ2AFzDž:1Xw? 7@    HY FY?+?+39339310#"5!!#3265'#"1+³ĵO#V)P?,@HY HY ?+?+39310!327#"&5!57PRmxKG9oע?V[T:=?+@  HY?+?399333310"&3324&'3Zb!bS܈twT#J@&  %$FY  HY?3+3?+??9333993310$7!24&#">}PfJqXZi! "8{f (0T  N"H@)   $#IY IY?+?+??9329391023327#"&&'#&&#"56(8,(Xoj624$*&%;:QC8bp4#%.N:`(X& L1i-:3C:G?G@$   FY ?3+3??3?9333993310654&'3#$3$`?bb8~ݚ&   wh?)O@'#$$' ' '+* # FY?3+3?39/993333333910"&'##"4733265332654'3 q# 'i:AfB7|krcun|7Bg?;g_g_ 啍DؙP&j &+55=&j &&+55w9s&RT"&+5=s&T&+5whs&T3&+5&(jR &+55 D@% JYKYKY?+?+3?9/+933310"'5326554&#!#!5!!!2^0:TmvggdzV``s&avZR&+5B@$ JY LY JY?+?+9/_^]+93310 !!!27# 4$32&?,=֩)o^/Z3eTP\Po6Z,:6&,jR &+55H5-#O@*%$#LYLYKY JY ?+?+?+9/+39333310#!! #"'5326!3232654&##nGRMvb>7=0DND\>NJܰVo\f 3{塭#V@/    JY   LY?+??39/_^]]3+39333331032#!!#3!332654&##m/ffg۰1-{ ;@   JY KY?+3?39/+933310!2#4&#!#!5!!½ixLgoqV``s&vR&+5 D&6!R&+5 0@  "KY?3+??3933310!!#!3!3%b%fLfqV$R K@*   LY     KY LY?+?+9/_^]]+9333102#!!!!2654&#!Z^51+ž1`)%a E@$   " KY  KY?+33?+?393333310#!#3!3#!bci nR̃q>((=L@(      ?33?3393933333993210333###qLfLrf<<:R%N@* !'&KY ##JY#JY?+?+9/_^]+9933910!"'532654&##532654&#"'6!2L_`ʹol:`BGVh.2`}?MP.@    ?3?29999333310333#47##b`gc fDfJD&6R&+5 6@     ?3?393393333310!##33-ff=<</@ KY JY ?+?+?93310!#! #"'5326!g)\?EbKC2=4Was9V};\0+2n?3& '7 9@      KY?+?39393393310"'5326673373wIV`HgX?y#r+-Rdg%1mLEJ=cxDosN; 2@  "KY?+3??3933310%3#!3!3bfLf`/qV8@   KY??39/+999933310!##"&53!2673fgE`f{g3#;= 1@  KY?+3?33933310!!3!3!3=fffVV;@    " KY?+33??33933331033!3!33#fffbVV/q  K@*   LY KY LY?+?+9/_^]]+933310!!5!!2#%!2654&#!Z žV`{ZK@*  LY    LY ?+??39/_^]]+9333310!#3!2#!3!2654&#!ffif!̷{T @@# LY   LY?+?9/_^]]+9933310!2#!3!2654&#!5'\f-ž1FqB@$  JY  LY JY ?+?+9/_^]+93310"'63 #"'53 !5!PX)Dq6o#+\N3^3R3^,O@+      JY    KYKY?+?+??9/_^]+93333310! !#3!! 32#"bffL%K  kT1w8hmU<;R R@.  LY?O  LY?+?39/_^]+393333310#&&5!!##"3!!y{\fĽ}ʙJ}ݙbRD{#%A@! ""'&" FYFY?+?39/+93933310%6$736632#"2654&#"{cx_ kk߫tQYc#1V8'm^ϑ?Z@1  ! GY  GY  GY ?+?+9/_^]q+993333910#!!24!!! 4&#!!26fsu5ͺJp%Z9guyq?N_Q^5?@HY?+?99310!#!5c?)-? E@$    " FY  GY?+33?+?393333310#!#36!3#!-bbH qϿ*wTHL?L@(        ?33?339393333333331033###3wdy)d+y?''+D7T&P@,%! %('%&&%HY&& && HY FY?+?+9/_^]+9933910 54&#"'632#"&'532654&##5'~PO%ynj9gUjaf%#RN4l)"c1#}tqlV? ,@   ?33?33993333103#7#_{? !?&6 &+5? 6@   ?3?3933933333103##3{ ee?'??/@ FY FY?+?+?93310!#!#"'532!bWm'#q$<uaZ?>@  ?33?3939933333310%73##&&'#3>9^1X!Z:%j&?.f;5?a-? =@"  HY/?_o   ?3?39/]+99333310!3#!#bbNc?# ?w9TR?%@ GY?+?3993310!#!#!cccc?LTSwTF)h?%@ HY?+3?9310!#!5!hb?V?\wK@(   !  FY FY?3+3?3+3??9333910#&54734&'66bb!((&@P7?[? 2@    " GY?+3??3933310#!3!33ccbq??8@   FY  ??39/+99993331032673##"&5b`ccdp?zFMMBx? 1@   GY?+3?33933310%!3!3!3ccc^??;@   " GY ?+33??339333310%!33#!3!3cblcc^1q?)? O@.   GY  HY  GY?+?+9/_^]]+933310! #!!5!!2654&#`\RuӛVG|rja? O@.  GY  GY?+??39/_^]]+9333310! #!3!2654&##3ZbcKbbuӛ?Gvvla?? D@'  GY  GY?+?9/_^]]+9933310! #!3!2654&#=cpuӛ?GxtlaDwTD@&   HY    FYFY?+?+9/_^]+93310"&'53267!5!&&#"'6632f\(hͳj8E \5X:;0qڸ.+ 2XҾX5\TXTV)L&j &+55)M? V@0 "!GY  FYGY FY ?+?+?+9/_^]+9333310!2!!!#"'532!!2654&&#^͸\Wo% r&8umv^ZPswJU'h?T@-     GY    GY ?+??39/_^]3+3933399310!2#!!#3!!2654&&#'ĶccKc8uz?.?.Pm{KW&!&v&+5&\6&+5? 0@   "GY ?3+??3933310!!3!3!#7ccc?'@ JY?+?9933103!#cEf-u5'@ HY?+?993310!#!35c`?J3s&:CR&+5!&ZCX&+53s&:vR%&+5!&Zv %&+53&:j?R ,&+55&Zj ,&+559s&<C~R &+5!&\C,&+5RR@ SY/+99105!R\RRRR@ SY/+99105!R\RRRRlN'BBv%&HH++5 @  ?99310'673) c+AE p[eX @  ?99310#67 KcA@`#rD3'83HHH H H+++++5 @  ?99310#&'7 EA(c# WfT|J"@   ?3293310'673!'673f "b*BBN c+AE x[bfp[eXJ"@   ?3293310#67!#67 KcA@ $b(BB`#rWb-fDq '85HHH H H+++++55{s B@'   TY@??9/]+993910%#53%suRug3p_{si@C    TY   TY@   ??99//]+9_^]+993910%%#553%% guRRugpspE%pcp7 @ ?/]93104632#"&QIIQRHHRY[^VU`^&'q  ,0:Fa@36;1A!'0-./  !'-/;AHG8D**0/0/4>$?333?3??9/39/33393333333310324&#"#"&5463232#"#"&54632#32#"#"&54632Z`c^`ZݖwZ``Zݔ`+-Z``Zݔuܹrq'Jrq NR}@ _/]9310R5>>++H}@ _/]9310'7==5w+jk+y&=@ ??333210#=^+Jq-.@      ?3]2?399333104&#"#33632=UUl\ZK F-]Qn|Ze`hV@0  OYNY?   NY ?+?9/_^]+9/3+393910!!##53!!!!ufok}R+R9^^N1&m@> $ &('OY$@ H@OY  MY  NY ?+9?+9/3+3+2+3939310!!!!56655#535#5354632&#"!eFN)n{ķ#RRt0`TTRRDVBR&j@8 " (' @ MYMY&MYMY?+?+?9/+9/+33933339910%27#"5#57733#!##3 32654&##':20S㠠'=F-f:VB R;+V jV@JX*@P "  (,+ ! OY!@ H!@ OY ? %%MY%MY?+?+9/_^]]q3+3+2+393333310"!!!!327#"#53&57#5332&#)E블QG*' XK'uRhARA^" R&KfR2"(VH -1H@& 1./0& +.032)1 010#?3?3??9/39/393333310#"&5463232654&#""&54632&#"327#ݝga_fe`ced]ULyv}dUV^+N|z|JX|z T%Jsm&O@)$  ('$   $$  /3/39///]3999993993310%273#"&556746324&#"66ZNh^j\}stƽXQGIDH咭+T&Vӆ|\ij`s1M&*p@>" (),+ '%LY LY ''(LY'?+?3?39/_^]+_^]+99933333310!###33&53#"&5463232654&#"5!h bf#bda^ec`+tLh{}y|VV L@'    ?3333]2222339333333310##5!###33#7#9V XR}}VNN}ah^/RvfH9@  ! /??3/299//]3933310"&546632!3267&&#"y1RQHbٓ2Xz#5Fi)|5Buw'@'{  ?555 '@N'u  ?5555&='y@= +?555Z'@)' ?  ?555w&L@' $('  FYFYFY?+?+9/+999333310"&54632654&#"563 '2&&#"ϥ`=1,'_voͶ6KE!c33\L{} 5@  KY?+?999933331073!! P05|yy;{9#%@ KY?+?3993310!#!f?TLV E@$   JY JY?+9?+99393331055!!!VxtwF_E^E^o#)@RY/?_ /]+99105!oRR%,@  //39/332933310##533bn^X{ #/B@%! ' -10-** $$?/]223]22399331026632#"&'#"&546"32654&!"3267&&[A?^~^?BZPs77sPXhiOWjjWJs=l~t|:?^o*9}`qH9=;^n,:=@`qH9o#g@B  RY    RY / o  /]+993_^]]+9939910'!5!!5!!!!L{^ I}:%RFR1'RRo#&+W ?55o#&!+W ?55w- 5@    ?/99333333103# w1=1w!m&ILf&IOf @   /22993310"&'332673N Xjonk Xمn[^k? @  FY?+?93310"'53253%P7EABEF\k,-  !4589 //39399/]/+]3339/q33339393933333310!#%5!#533!5353!5!!5!5!#3#35!#35!35!#35#3#3#"&546323254#"%32##32654&##32654#"'53253T/0momImmmm0oowoooomm~smp.,;0m^{B.$*/;J1%Z^4+V}i0oo/mmmmmmoo;mmJoooo/yhIaCS1D D8QYb" "+%J fVr_cT*8@ % ,+(""//9///339333310 54676654&#"63232654&#"TV,AgIOGRZ?>1HT;GFBIHCHEVW/2A1R~X8*P:/5K6DpJ;?HI>@IH !&7L&+5  +,5f@6-*3$  $+76-0+!',,+FY,,'IY''0FY'FY?+?+9/+9/+99933333310#"&547654&#"'632! 4'$$546323'&#"-#'7>IPX( lw/^A'm>xw%71K_]4jkO84ÏZZneP6@ JY?+??9339393107632&#"#32fC*IwTiuq@b ZW-?,V@-''&  &.-&&HY+""FY?3+3?+3399/933333910"&'##"&547!57!!4'!32655332#j(%rSbҨ6QGIAS}mrbykbnkeߎ:Vě칱݆u&0vT&+5f!&Pv,&+5&$[bR&D[&2D\O ?55{- @   /32993310#"&5463232654&#"-xaaxxaaxK>>KN;>Katta^uv]BKKB@KLh&@   /93310673#%467#"&W$sj14gf$( .6CBxTf7&D%F&I'IfL&I'IfO D@" "!  @ KY KY?+?+9993339910! ! 6653! ! _0JQOh skkTk^]#T=<Qw!D@! #"  @ FY FY?+?+999933239910#"&532667332654&#"9tہHGd f`RŴǴ!Պ )&#@@  @ LY  LY ?+?39/+9933323106653!"533265YSi gqN#M@& ! @ IY FY?+??39/+9993332331032653>53#'##"&5 bBM!e @waT4v?@Xz Brn{\RX !C<!vQ R6d /210#'6654&#"5632d P YQCN0-47ly$y8,00N [j} /10432#"j@##@`2.-4s&(CR &+5s&CLR&+5w!&HC&+5!&C &+5B5T@+ 3%%+76("(/(/KY("KY"?3+3?3+39/9339333910%273324&#"'6632#"&'##"32&&#"gfnSg?_/+DsGoNLoItA+H\/kVLPRiA"^$c+55+qT#^$?G@%   ?3?339393333333310#33663363#%gyh'a"Qfє^eAR&?jMZL [@2  LYLY@ LY?+?9/_^]q+9/3+3939310!3!!!2#!!!2654&#!Pfi!=Tըb'`@7  GY    IY GY ?+?3+39/_^]]+939310!!! #!#5353!2654&#dr=bq?QӛQGxtla X@0 ! JY LY JY?+?+??9/_^]3+393333310 !!!27# !#3!!2&+bffu*֩)o^/Z3]1w4jP\PT"Z@2  $# HY     FY FY?+?+??9/_^]3+393333310"!#3!632&&#"!!327hccd =465Hй}-?'XX5\ O@-    JY_    ?33?9/]+3993333310####3#!&&'wbos1bs'RX"NNDb4X ? C@$    IY   ?3?339/+393333310#####!'#1eяbgo>t(/?  ?zQc@5     JY   ?3?9/3+3399333339992210####!#3!3#!&'Hbo3%ff1br3}y" !111wD-%Ue3Wh?e@=      HYP` ?3?3?9/]3+339333333310#####!#3!!'#d݃bfccfa#r/??''`Ps!m@; !!#"! LY 0  JY?+99?339/_^]3+3993339333310#&&####"#>75!Iyh\bi-#g"m|R h/hxJVFp/mhɞH!V^ ? m@< "! HY  PHY?+99?339/_^]33+393339333310#&&####"#>75!;]}Y6i,}u%c"w}+i0Z`)M[?S8kXsTTqH|r;uSVq$'~@E%&#"''!#)( !JY'!!!!$#&$$&JY$?+9?39/_^]33+3393333393333910#&&####"#667!#3!5!J~g,i,#g"u{NhB5ff%BVD7f'-i`^,')V^Z?#&r@=$%"!&& "('  HY& #"%##%HY#?+9?39/33+33933333933339102#&&####"#667!#3!5!dY3h*t{+b+|t)f6*ccv)NZ?S|5iXmKKkH>e%?'SVRhI@RG6<',$ '3870 f' c`kjjil`V{u? M@+JY?_o  KY  KY?+?+9/_^]+99333310! !  !"!_02Zr9 k^]m@. 1w9T M@+HY?O  FY  FY?+?+9/_^]+99333310#"&532267!"!&&9tƭ!Պ ) .@  LY?+??999333210"#367>32&1>;3^mfU$,Q@P_J0**h4{8y@ZT,@ HY ?2?+?99333210!3367>32&#"\fI%N}$EL;-D'?#Stm|6Xav s&vR "&+55!&v5 "&+55  0S@,0 ! !)210+ KY KY &+LY&?+?+?+?399933339310! ! 32#"%33663#"'5326677 8.f W g5RlN9F:C3M>)7mg\pOB@M#>5P#v8V/akw-T&R\ (P@+ !!& &*)JY$!& &KY ?+3333?33+339333910#"'$%6326326'#"'KI9IK6OO 6#OrJJA>EEtPNOL*&Pwb'P@+!%  )(FY#!% %FY ?+3333?33+339333910#"'&5476326326654&'#"'bJDLM}GJFC!HF(#LLHHBBB-2CY|@G 93OP0##P)7>3Y [ZYDDAOO O OO6KT7666& -&-KY & KY ?3+3?399+3_^]229/^]33/39333310%26732#"'6632#"&'##"32&&#"5654.54632%#"''&&#"#546323^JT_ض?_/+DsGoNLoItA+H\/fg$( .6 pCTC%8?Zif2`usL<=?:fD&N"^$c+55+qT#^$Sg8&D$FD1 :Khs4/w+=R@N3,HI' !',08IR TSR>>;HHM0//// /DMM@ HM   HY# FY*?3+3?3+399+_^]2^]q29/33/39333310%#"4632&#"32732654&#"'632#"56654.54632%#"'&&#"#546323 byWn{R!RKmjnnzNRR{hSԀgf9F$( .6 q~E#8?Zif2`us%9-V+CC+V-Tf77#%FD19:K hs4/B Cq@>&A3- &39 ED-606 @ H  6@=6=KY#60KY)0?3+3?3+322+239/9339393310#'##'##'5273324&#"'6632#"&'##"32&&#"{P 68 75 PZgfnSg?_/+DsGoNLoItA+H\/kVuuuuHPRiA"^$c+55+qT#^$ )l@;  ))( $%  %+*) @ H  $ )?3?3322+239993333333999910#'##'##'5#33663363#P 57 75 P%gyh'a"Qfє^euuuujAR&?jMZL /@  LY KY ?+?+?93310 !27## 4$32&?:E:g!=֩)o mTP\PwT+@  FY GY?+?+?9310%27##"32&#"{LGd+hH-1X/sdD@*       /99339910'%7%7%R)/+1P5-1'\-VJIN-JiJ @   /333993310463!6632#!#"&11%'((,7H&&((1#3)%1.$3+$$@  @ H /+23/3993102676632#54&#"##=zp9f6dkZ?8&I~q L-qj K:715@  /93104632&&6/ '$fg9F$D&8g5@  /93105654.54632ff~$( .6Sg8&D$F) (6DR_m@8 7D=>S_YZ(!" )6/0`mfgERKL "(06>DLRZ_gmon)"0@ H03,,%3mZSf@ HfjVcc\jE>7L@ HLO:HHAO3jOOj3 @ H  H /3+2/3+29///333+2333+2333+29333333333333333310&&#"#632&&#"#6632&&#"#6632!&&#"#6632&&#"#6632!&&#"#6632&&#"#632!&&#"#6632oL3=AK ]qOL3=AKdg\sL3>ALeg\s/L3>ALeg\s1L3>ALeg\s/L3>ALeg\sK3>AK \sE;>ALeg\s930    IY GY?   GY ?+?9/_^]q]+9/_^]3+3939310!!! #!#533!2654&#`=cp RӛRGxtla?]@2      LY  LY ?+?9/+9999999333910'###! 327'76654&##?pkyEeff ́XuFRP75!3'rLT'f@7% )(!  !FYHY?+?+??9999999993333910"'##33632''27'76!"scTpyF{ZyXFE{TJXb+51X"3{ / D@%  JY?   JY ?+?9/_^]3+3939910!!##53!!5If!E^Z^^5? H@)   HY  O _   HY ?+?9/_^]3+3939910!!!##53!5ncgVVG@'  LY JY JY ?+?+?9/_^]+933310!632#"'532!"#1sl%rl_f^1e8.$P ??@" FYHY FY ?+?+?9/+933310!632#"'532654&#"#!F]eηWpubVcy:dD#?L\@2     " JY?+??3?339393333333333103333####qLfL#^c3f<<:n1qd?\@2       " GY ?+??3?33939333333333310333####3wdy)nb5d+y?/1q''+RB&TDB7T&E@&      "JY?+???3993333310%3###373`bTff=^1qV?F@$      "GY?+???393393333331033###3{tb?ee?-1q'?C@$     ?3?3993333333310!###3733}VffV{c?E@&       ?3?399333333331033##'#3V{sVee<(T/B4?1O@,   JY ?3?39/3+3993933103533#73###1f=g}f^"VP@-     HY  ?3??9/3+399393310353!!33###c+xTwccLVb0%} '>@"     KY?+?3?99333310!##!5!73'}f>V`V)T? A@!      HY ?+?3?933933333103##!5!{ e?'VhL@)     JY     "JY?+???39/_^]+93333310%3##!#3!3vb{ffVg^1q1w?R@/    HY?O  " GY ?+???39/_^]+93333310!33##!#bwbwNc?#1q ?7 G@&   JY     KY ?+?3?9/_^]+9333310!#!#3!!7gffVV1wm? M@,   HY?O    HY?+?3?9/_^]+9333310!!!#!#bNc?#V ?K@)  LY   KYJY?+?+?39/_^]+9333310!#!#!632#"'532#"gfqnr}t_VV1e8-& ?C@$ FYGY FY?+?+?39/+9333310632#"'53265!"#!#!]QWrkd[Ibc'b:dD?+5m@;3 &,1&&763#.  ) JY @).KY)) ))KY KY?+?+9/_^]++999993339910327#"&'#"$5!2&# !267&5432#"6YkJ7*aa;dלF)OKo&_itksXD\=+(Si`i b0HwT 6m@ &,&&,487$ "/ )) FY)@ H)) 2HY @FY"FY?+?++9/++9999933399106654&#""'#"&&532&#"327&54632327OKN`IU}~rVvR@E<_N1jaX(>-,zA3~L+ 3[rEXB&&#wBT&Fu ' 4@  " KYJY?+?+3?93310%3##!5!!Lwc{%%^1qV``)h? 4@  " HY GY?+?+3?93310!3##!5!hwcv?u1qV9<? /@   ??3?339393310#33673b\f8)+f?jr9J@(    JY  ??39/3+3993339103!!#!5!53n;i=u C_m_;?@@"   HY?33+3??39393310!!!#!5!336733b5\f8)+fVjV?jruF@'      "JY?+???3993333310%3###33ec9PHqAsm;^1qVrF7?F@'     " GY?+???3993333310#333##mrDAmLmc9/6/1q {@@"  " KY  KY?+3?+3??933310%3#!!5!!!3ߜbC1Lf`/qV`` V)R?@@"    "  HY GY ?+3?+3??933310!!33#!!5!^wcb5u1qVH@%   KY "JY?+??39/+999333310%3###"&53!2673wb{gE`f^1q{g3#;d?H@%   FY " GY?+??39/+999333310326733###"&5b`cvbwdp?zFM1qMBxm@?  `p  KY ??39/+999/9/_^]]933339910!###"&53!336673fVgEVIf{H?3r$/?a@5   `p  FY ??39/+9/_^]999/933339910333673##5#"&5VccV#?z7tlx-@  KY ?3?9/+99333103$32#4&#"#fgFymf3fo7%?-@   FY  ?3?9/+9933310!4&#"#36632]bccdpmzDP#?MC=&`@6$#('##JY#?#_#o## ## KY KY?+?+9/_^]3+39333331047336$3 !!267# &&"!=dNR  +^rB-29B??B%`Cf^qJ*55T%Z@0#"  '&""HY "" ""HYFY?+?+9/_^]3+393333310"&&5473632!3267"!4&~vdͿ]l\{ vaA-28P+Z(ս=!(l@=&%*)%%JY%?%_%o%% %% " "KY KY?+3?+?9/_^]3+393333331047336$3 !!267##$&&"!=dNR  +^rcB-29B??B%`Ca4qJ*55T!(f@7%&! *) %%HY%% %%!""HY!!FY!?+3?+?9/_^]3+3933333310#&'&&5473632!3267#"!4&c~vdͿ]l\`evaA-28P+Z(սZ,=P&6^&+5L&6Z&+5K@'   KY JY?+??39/+33393333310!#3363 #"'532!"5ffՁJ6.BRrs[)L 1e8* ) ?H@%  HYFY?+??39/+3393333310!#33 #"'532654&#"cc{ "bz~[/gF\P?:d(=A@$JY"KY JY ?+?+??+9333310%3##! #"'5326!u{)\?EbKC2=4Was9^1qV};\??A@$ GY"FY FY ?+?+??+9333310%3##!#"'532!uvWm'#q$<^1quaZE@% JY  JY?+??39/_^]+9333310%!"&'532!#3!3LvHzffVg^3">/y-?G@' HY  FY?+??39/_^]+9333310!3#"'53265!#b~WalxNc?%6b=?Q@,     JY     "JY?+???39/_^]+933333310%3##!#3!3u{ffVg^1q1w?W@2    HY?O  " GY ?+???39/_^]+933333310!33##!#buwNc?!1q ?H@%   KY "JY?+??39/+999333310!##3#"&53!2673{bwgE`fg3#;?H@%  FY  " GY ?+??39/+99933331032673##3#"&5b`cwcwdp?zFMMBxO@*     " JY?+??3?3993333333310!##3333##47#Rbu{ F|1qTt|J?S@+    " GY ?+??3?393993333333310%733###&&'#3>9ts1X!Z:%j&1q?.f;5?aZ,D&$6R&+5b&D6%&+5&$jR &+55b&Dj 5&+55bLTD&(6R &+5w&H6&+5!=@   JY KY KY ?+?+9/+933310"5663 # 5!2!〹gIY5" :jId+ysl=bAwT=@     HY FYHY?+?+9/+9333102#"55!&&#"566267! v،YjZ`T P*Z'!&jR +&+55w&j -&+55=&jR "&+55L&jZ "&+55R&jR 6&+55D7&jr 7&+55RJ@'KYKY KY?+?+99/+9933310 !"'532654&##5!5!65r/Sm`V7``j?V@0 FY? HY FY?+?+99/_^]+9933310#"'532654&##5!5!?#|яZZ|{ הwDf+$عP=XI&MR&+55&M-&+5&jR  &+55&j &+55&2jR (&+55w9&Rj )&+55~w9T&~jR *&+55w9&j +&+55Fq&jR +&+55Dw&j +&+55 &M-R&+55&\M&+5 &jR (&+55&\j )&+55 s&SmR )&+55!&\S *&+55&jTR "&+55&j $&+55 /@   "JY JY ?+?+?93310!!3##!Eccf^1q5? /@   "HY GY ?+?+?93310!!3##bbc?Vu1q&jR (&+55&j '&+55/]@4 JY? JYJY JY "?+?+?+9/_^]3+39399310!!3#"'53255##53!!5Iw\Z9*-'c{!E^hs\|^^5?_@7HYO_HYGY GY "?+?+?+9/_^]3+3933310!!!3#"'53255##53!5nv\Z;'-'bwgVdhs\|VN@, JY JY"?+?+??3993333310%3#"'53255##33w\Z;'-'bNPHqAsm;^hs\|VrF7?N@,GY GY "?+?+??3993333310333#"'53255##rDAmLm\[;'-'b9m/6/hs\|NI@)    LY ?3?39/33+339333310!33!!##!+osmf/uPHq?wrZV7?O@.   IY/?_o ?3?39/]33+339333310!33!!##!{#rDAm)ysms`6!Ro :@  LY   LY?+?9/_^]+99333103!"&5463!!"3!g\'ٿ-JοZw Gq!"X@- ""$##LY # LY?2+3?9/_^]+9/993339310"&54$!33!2653#"'# 3265#!ftwg^yRLі˶w?+Q@)(#-, FY %%HY?3+3?+?9939/9339931023&5332653#"'##""!26554&Dp7czmbBmᲳgT^`~yG *Z2R/+]@2!") "-,!!&KY? , JY&KY&?+?+9/_^]+99/9393310#532654&#"'663232653#"&'&&ͪgp9p~ܜ vywf `~=OPRHħ%ҬP`T+S@+") "-, %HY, HY%HY%?+?+9/+99/9393310#532654&#"'6632323#"&&'&&px{%PXc`qi 7Z]btMVhc]jHR#+[{vrbp01GBo_R`"Y@1  $#KY?  " JY  JY ?+?+?9/_^]+993339103##4&##532654&#"'6!2ۚwb{ʹpk9` #1q`}@LPVT O@*   "! HY  " HY GY?+?+?9/+99333910 54&#"'6323##4&##5'~PO%zawcvjaf%#RN4n1q?mhV"C@#" "$#KY JYKY?+?+?+9/933310!#"'53266!323#"&5E$NRucB7=23D0FS.wzfVv\?qHWɧ)?C@#  FY HY FY?+?+?+9/933310!2653# !#"'532!obWo!s&qӏOfpbZ)I@'JY  JY ?+??399//_^]+9333310323#"&5!#3!3yfff-gu R1w`?O@-  HY?O   HY?+??399//_^]+9333310!332653#"&55!#bv|bmc?#6ϗOˏ?h:@KY LY LY?+?+9/+93310!! 4$32&&# !2!bRfU'P`( fXaT*$^#-"wT:@HY FY FY?+?+9/+93310!# 4$32&#"3 !ݍ ϣ #D'DXB 9@   KYJY?+?+39/933105!!323#"&5 !!}fV``)+)F?9@   HY HY ?+?+39/93310!!23# !5!^c51GlVs5&N@*#   ('$KY  JYJY?+?+9/_^]+99339104663 &#"33#"327! $54675&&r҄3ܦɴTl^oZk`VeOĒ ^TT D@&  "! JY KY JYJY"?+?+?+?+933310! #"'5326!3#"'53255#=)\?EbKC2=4Was9w\[8*-'b{V};\hs\|?C@%  GY FY  FYGY"?+/+?+?+933310!#"'532!3#"'53255#DWm'#q$:/("4T^deCYYD]qkQ "'%HH‡~]SS]}u"=@ " "@ H" "/?/3]9///+]33310".#"#66323273#&'#567)'G@:PI\N'E?:KL _eCYYD]=(/(ar'/'enO~]SS]} #@ @ H/2+99//]310"'3326736673#R]XX]P"32}%p+DWKKW*L]5y% #@   @ H /3+99//]310#&&'53"'332673D*r$}3&.5R]XX]P%{3^9?b''"8P^R]XX]P}k+Z #&?HJWKKWu ";@!  p    / ?  /2]9///3]33]3/10"'332673".#"#663232673R]XX]Pk'G@:PI\N'E?:-* L _WKKWZ(/(ar'/'F9en;BZ&@  ` p  //]3933104&'3#"'532GI[fV8+"0kHq?vWcT 1J^@  "/3?39931073#"'53255#w\[8*-'b^hs\|1J^@  "/3?39931073#"'53255#w\[8*-'b^hs\|?# @    ?3?9933310!#47'3#b  :V)G)ws (@  MY 'MY?+?+993310#"323 4&#"ķj11-3^ @    &?3?9933310!#47'3c 'Q5Rф%CH3s<@  MY'NY?+9?+9393310!!5>54&#"'632!~75{X+stHl|Fv*t(Q@+#  *)NY  &&MY&' MY %?+?+9/_^]+99333910!"'532654&##532654&#"'6632ߦT\ܞխmp1U{Sc,2`z=JCGS`^ <@ MY &$??39/3+3993333310%##!533!7#`^xd%}C*,/_:@ MYNY& MY%?+?+9/+933102#"&'532654&#"'!!6  mBl_‚<:-+(g7+˭''`#/_(@NY&$??+393310!5!ZV`I{sv(I@(% *)!OY p MY' OY%?+?+9/_^]9+933310#"'532##"&5432"326654&&hX+y  Inǐu#eg]|VeV`gcչZMus;&IIf\Z!2Q@*+..-2"*)&&' '*-43(.*"'0+$(?333]2222293333333310#"'53254&'&&54632&#"##33#7#5{>ch;qpUhzWP^EV;n^K"R}}V\qN!y;:('YONe!L!6/28)$4F`h^/ '&7z%yF&Wzw T)G@&' *+FY  $FY HY?+?+99??3+933331047##"32373#"'53265%2654&#"vuTݜ٠Ʃv6 -FkXȴ[ w !&K7&+5w &N*&+5w &OP2&+5w !&:}.&+55??91033fJ@s&C8R&+5>s&v6R &+5&s&KR&+5&jR &+55l&RR&+5&MR&+5!&NR&+5AB`&QC&OR &+59&- &VT?55&jR &+555&jR &+5555&fqR&+5B&gV2I6$$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs) $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q  q q q           ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q   q   q    q q  q  !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) -&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq7$&q&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq$q$ q$&$*$- $2$4$7q$9$:$<$$$$$$$$$$$$$$$$$$$$$$q$&q$6$8$:$G$$$$$q$ q$_$I$K$M$O$Q$S$U$W$Y$[$]$_$o$q$s$q%%%$%7%9%:%;%<%=%%%%%%%%%%%$%&%6%8%:%;%=%?%C%%%%%%% %X%%%!%#%%%'%)%+%-%/%1%3%o%q%s%&&&*&2&4&&&&&&&&&&&&&&&&&&&&G&_&I&K&M&O&Q&S&U&W&Y&[&]&_'''$'7'9':';'<'='''''''''''$'&'6'8':';'='?'C''''''' 'X'''!'#'%''')'+'-'/'1'3'o'q's'(-{)))"))$))))))))))C)) )X)))!)#)%)')))+)-)/)1)3.&.*.2.4....................G._.I.K.M.O.Q.S.U.W.Y.[.]._/\/ \/&/*/2/4/7/8/9/:/</////////////////////////$/&/*/,/./0/2/4/6/8/:/G/////\/ \/_/a/I/K/M/O/Q/S/U/W/Y/[/]/_/a/c/e/g/i/k/m/o/q/s/222$27292:2;2<2=22222222222$2&26282:2;2=2?2C2222222 2X222!2#2%2'2)2+2-2/21232o2q2s2333$3;3=3333333333;3=3?3C33 3X333!3#3%3'3)3+3-3/3133444$47494:4;4<4=44444444444$4&46484:4;4=4?4C4444444 4X444!4#4%4'4)4+4-4/41434o4q4s47777")7$q7&7*727477)7D\7Fq7Gq7Hq7Jq7P7Q7Rq7S7Tq7U7V7X7Y7Z7[7\7]7q7q7q7q7q7q77777777q7\7\7\7\7\7\7q7q7q7q7q7q7q7q7q7q7q777777q7\7q7\7q7\77q77q77q77q7q7q7q7q7q7q7q77q77q77q77q7777 77q77q77q77q7777!7$)7&)7+7-7/717375777<7>7@7Cq7D\7F\7G7Hq7J7777777 7W7Xq7Y\7_7`q7b7q7\7q7 \7!q7"\7#q7%q7&\7'q7(\7)q7*\7+q7,\7-q7.\7/q70\71q72\73q74\76q78q7:q7<@<C<D<F<G<H<J<< <W<X<Y<_<`<b<<<< <!<"<#<%<&<'<(<)<*<+<,<-<.</<0<1<2<3<4<6<8<:<<<@<B<D<I<J<K<L<M<N<O<Q<R<S<T<U<V<W<X<Y<Z<[<\<]<^<_<`<b<d<f<h<j<l<n=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_>-DD DD EE EYEZE[E\E]EE7E<E>E@EEEE EpF)F )F)F )HH HYHZH[H\H]HH7H<H>H@HHHH HpI{I {I{I {KK KK NFNGNHNRNTNNNNNNNNNNNNNNNNNNNNNNNNNNNNHN`N6N8N:N<N@NBNDNJNLNNNRNTNVNXNZN\N^N`PP PP QQ QQ RR RYRZR[R\R]RR7R<R>R@RRRR RpSS SYSZS[S\S]SS7S<S>S@SSSS SpURU RUDUFUGUHUJURUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUDUFUHURU RUYU`UU U"U&U(U*U,U.U0U2U4U6U8U:U<U@UBUDUJULUNURUTUVUXUZU\U^U`W)W )W)W )YRY RYYY")YRYY RY ZRZ RZZZ")ZRZZ RZ [F[G[H[R[T[[[[[[[[[[[[[[[[[[[[[[[[[[[[H[`[6[8[:[<[@[B[D[J[L[N[R[T[V[X[Z[\[^[`\R\ R\\\")\R\\ R\ ^-q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq-{&*24G_IKMOQSUWY[]_-{-{-{-{$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjln$;=;=?C X!#%')+-/13             YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p   YZ[\]7<>@ pR R")R R  YZ[\]7<>@ pR R")R R q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  &*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_$79:;<=$&68:;=?C X!#%')+-/13oqsR R "@E=K=N=O=`={R R$79:;<=$&68:;=?C X!#%')+-/13oqs-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p  &*24G_IKMOQSUWY[]_FGHRTH`68:<@BDJLNRTVXZ\^`FGHRTH`68:<@BDJLNRTVXZ\^`\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqsR R "@E=K=N=O=`=R R\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs  $79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs-{R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`$$$$")$$q$&$*$2$4$7)$D\$Fq$Gq$Hq$Jq$P$Q$Rq$S$Tq$U$V$X$Y$Z$[$\$]$q$q$q$q$q$q$$$$$$$$q$\$\$\$\$\$\$q$q$q$q$q$q$q$q$q$q$q$$$$$$q$\$q$\$q$\$$q$$q$$q$$q$q$q$q$q$q$q$q$$q$$q$$q$$q$$$$ $$q$$q$$q$$q$$$$!$$)$&)$+$-$/$1$3$5$7$<$>$@$Cq$D\$F\$G$Hq$J$$$$$$$ $W$Xq$Y\$_$`q$b$q$\$q$ \$!q$"\$#q$%q$&\$'q$(\$)q$*\$+q$,\$-q$.\$/q$0\$1q$2\$3q$4\$6q$8q$:q$&@&Cq&D\&F\&G&Hq&J&&&&&&& &W&Xq&Y\&_&`q&b&q&\&q& \&!q&"\&#q&%q&&\&'q&(\&)q&*\&+q&,\&-q&.\&/q&0\&1q&2\&3q&4\&6q&8q&:q&(@(Cq(D\(F\(G(Hq(J((((((( (W(Xq(Y\(_(`q(b(q(\(q( \(!q("\(#q(%q(&\('q((\()q(*\(+q(,\(-q(.\(/q(0\(1q(2\(3q(4\(6q(8q(:q(8@8C8D8F8G8H8J88 8W8X8Y8_8`8b8888 8!8"8#8%8&8'8(8)8*8+8,8-8.8/808182838486888:8<8@8B8D8I8J8K8L8M8N8O8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8b8d8f8h8j8l8n9R9 R999")9R99 R9 :::"):$:&:*:2:4:D:F:G:H:J:P:Q:R:S:T:U:V:X:]:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::!:+:-:/:1:3:5:<:>:@:C:D:F:G:H:J:: :W:X:Y:_:`:b:::: :!:":#:%:&:':(:):*:+:,:-:.:/:0:1:2:3:4:6:8:::<:@:B:D:I:J:K:L:M:N:O:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:^:_:`:b:d:f:h:j:l:n;&;*;2;4;;;;;;;;;;;;;;;;;;;;G;_;I;K;M;O;Q;S;U;W;Y;[;];_=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_?&?*?2?4????????????????????G?_?I?K?M?O?Q?S?U?W?Y?[?]?_CqC qC&C*C- C2C4C7qC9C:C<CCCCCCCCCCCCCCCCCCCCC$qC&qC6C8C:CGCCCCCqC qC_CICKCMCOCQCSCUCWCYC[C]C_CoCqCsCqDD DD E-{GGG$G7G9G:G;G<G=GGGGGGGGGGG$G&G6G8G:G;G=G?GCGGGGGGG GXGGG!G#G%G'G)G+G-G/G1G3GoGqGsGVqV qVfVmVqqVrVsVuVxVqV qVT[[[V[_[b[d[i[p[q[r[t[u[x[[[ [T\\\V\_\b\f\i\m\s\v\y\z\{\|\}\~\\\\\\\\\\\\\\\\\\\\ \!]q]r]x]T^^ ^^ _q_ q_f_m_qq_r_s_u_x_q_ q_T```V`_`b`i`t`` aaaaV\a_\ab\afai\amasavayqaza{a|a}a~qaaaaaaaaaqaaqaqaaqaaaaaqaaaaaaa a!aSbqb qbfbmbqqbrbsbubxbqb qbTdfdmdsfffVf_fbfdfifpfqfrftfufxfff fThfhmhshhiqi qifimiqqirisiuixiqi qiTmmmVm_mbmdmimpmqmrmtmumxmmm mToooVo_obodoiotooo qqqqV\q_\qb\qfqi\qmqsqvqyqqzq{q|q}q~qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq q!qSrrrVr_rbrfrirmrsrvryrzr{r|r}r~rrrrrrrrrrrrrrrrrrrr r!sssVs_sbsdsispsqsrstsxsss sTtftmtsttuuuVu_ubufuiumuu vqvrvxvTxxxVx_xbxfxixmxsxvxyxzx{x|x}x~xxxxxxxxxxxxxxxxxxxx x!y){{ {{ || |||| ~) y~     y~ y~         y~       n| q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqql~    n|   n|   n| l|~  qff jlrqs~ffqqq q  q q qqq qn|q qq  r|  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq)l|~    l|~   rsz|  rsv  l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqqqff jlrqs~ffqqq q  q  rsz l|~  ))  n|   n|  rsz|  rsz|   ) js      j  )j       js   s  j        m  m         js    m  m  j   sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R 7$&q7$&q7$&q$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q                        q  q  q                             ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q    q    q    q q  q   !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) & * 2 4 7q 8 9 : <                         $q &q * , . 0 2 4 6 8 : G f m qq r s u x  q  q   q  \ q        T _ a l |\ ~        q    q    q  \  \    \     \        q  I K M O Q S U W Y [ ] _ a c e g i k m o q s q!q!r!x!TSSSS TTTVT_TbTfTiTmTsTvTyTzT{T|T}T~TTTTTTTTTTTTTTTTTTTT T!XqX qX&X*X- X2X4X7qX9X:X<XXXXXXXXXXXXXXXXXXXXX$qX&qX6X8X:XGXXXXXqX qX_XIXKXMXOXQXSXUXWXYX[X]X_XoXqXsXqYY YY ZZZVZ_ZbZdZiZpZqZrZtZuZxZZZ ZT`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`RbIfbWfbYfbZfb[fb\fbfb%fb'fb7fbfbfb4fb5fb]fb^fbpfbfbfjj jj llllllllllllllllllllll lrlslzl|lllllllllllllllllllllllllllll llllllmmmmmmm msmmmnn nnnnnnnnn n|nnnnnnnnnnnnnnn nnnoo ooooooooo omooooooooooooooooooooooooooopppppplp~ppppppppppppppppp p ppprqr qrrrqrrrrrrrqr qrnr|rrrrrrrrqrrrrrrrrrrrrrrrrrrr qrrqrrrsqs qssssssssssssqs qsjsms}sssssssssssssssssssssssssssss s ssssstqt qtttqtttttttqt qtnt|ttttttttqttttttttttttttttttt qttqtttuqu quuuuuuuuuuuuqu qujumu}uuuuuuuuuuuuuuuuuuuuuuuuuuuuu u uuuuuv vx xzzzz zzzzz z|q|q||||||||q| q|r|s|||||| | ||||}} }}}}}}}}} }}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~ ~r~s~z~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~  qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  s s s rsz|    rsz|    rsz|  sl~  )    |   m rsv    )))))) jklqrsuwy}~)))))    ) js   f |   l{=}~j    )l{=}~j  l|~  j  l|~  j  l|~  j  )  )))))) jklqrsuwy}~)))))    ) js  \ \fH\ \|qqH HHq qq qmqq   l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )) jklqrsuwy}~))     s)) jklqrsuwy}~))     sl{=}~j  )  )    |         l|~  j   f m| )  )  )  q qqq qn|q qq  q qqq qn|q qq       rsz|    rsz|   l|~  j    )   rsz|    rsz|    rsz|    rsz|   qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )))))) jklqrsuwy}~)))))    ) js  l{=}~j  l|~  j          q             r v |       q                                                                           q             r v |       q                                      )   q rv|q    q rv|q    r    r|   )  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq     !q! q!&!*!- !2!4!7q!9!:!<!!!!!!!!!!!!!!!!!!!!!$q!&q!6!8!:!G!!!!!q! q!_!I!K!M!O!Q!S!U!W!Y![!]!_!o!q!s!q"" "" #q# q#&#*#- #2#4#7q#9#:#<#####################$q#&q#6#8#:#G#####q# q#_#I#K#M#O#Q#S#U#W#Y#[#]#_#o#q#s#q$$ $$ %q% q%&%*%- %2%4%7q%9%:%<%%%%%%%%%%%%%%%%%%%%%$q%&q%6%8%:%G%%%%%q% q%_%I%K%M%O%Q%S%U%W%Y%[%]%_%o%q%s%q&& && 'q' q'&'*'- '2'4'7q'9':'<'''''''''''''''''''''$q'&q'6'8':'G'''''q' q'_'I'K'M'O'Q'S'U'W'Y'[']'_'o'q's'q(( (( )q) q)&)*)- )2)4)7q)9):)<)))))))))))))))))))))$q)&q)6)8):)G)))))q) q)_)I)K)M)O)Q)S)U)W)Y)[)])_)o)q)s)q** ** +q+ q+&+*+- +2+4+7q+9+:+<+++++++++++++++++++++$q+&q+6+8+:+G+++++q+ q+_+I+K+M+O+Q+S+U+W+Y+[+]+_+o+q+s+q,, ,, -q- q-&-*-- -2-4-7q-9-:-<---------------------$q-&q-6-8-:-G-----q- q-_-I-K-M-O-Q-S-U-W-Y-[-]-_-o-q-s-q.. .. /q/ q/&/*/- /2/4/7q/9/:/</////////////////////$q/&q/6/8/:/G/////q/ q/_/I/K/M/O/Q/S/U/W/Y/[/]/_/o/q/s/q00 00 1q1 q1&1*1- 121417q191:1<111111111111111111111$q1&q16181:1G11111q1 q1_1I1K1M1O1Q1S1U1W1Y1[1]1_1o1q1s1q22 22 3q3 q3&3*3- 323437q393:3<333333333333333333333$q3&q36383:3G33333q3 q3_3I3K3M3O3Q3S3U3W3Y3[3]3_3o3q3s3q44 44 5-{66 6Y6Z6[6\6]6676<6>6@6666 6p7-{88 8Y8Z8[8\8]8878<8>8@8888 8p9-{:: :Y:Z:[:\:]::7:<:>:@:::: :p;-{<< <Y<Z<[<\<]<<7<<<><@<<<< <p=-{>> >Y>Z>[>\>]>>7><>>>@>>>> >p?-{@@ @Y@Z@[@\@]@@7@<@>@@@@@@ @pA-{BB BYBZB[B\B]BB7B<B>B@BBBB BpC-{DD DYDZD[D\D]DD7D<D>D@DDDD DpIII$I7I9I:I;I<I=IIIIIIIIIII$I&I6I8I:I;I=I?ICIIIIIII IXIII!I#I%I'I)I+I-I/I1I3IoIqIsIJJ JYJZJ[J\J]JJ7J<J>J@JJJJ JpKKK$K7K9K:K;K<K=KKKKKKKKKKK$K&K6K8K:K;K=K?KCKKKKKKK KXKKK!K#K%K'K)K+K-K/K1K3KoKqKsKLL LYLZL[L\L]LL7L<L>L@LLLL LpMMM$M7M9M:M;M<M=MMMMMMMMMMM$M&M6M8M:M;M=M?MCMMMMMMM MXMMM!M#M%M'M)M+M-M/M1M3MoMqMsMOOO$O7O9O:O;O<O=OOOOOOOOOOO$O&O6O8O:O;O=O?OCOOOOOOO OXOOO!O#O%O'O)O+O-O/O1O3OoOqOsOQQQ$Q7Q9Q:Q;Q<Q=QQQQQQQQQQQ$Q&Q6Q8Q:Q;Q=Q?QCQQQQQQQ QXQQQ!Q#Q%Q'Q)Q+Q-Q/Q1Q3QoQqQsQSSS$S7S9S:S;S<S=SSSSSSSSSSS$S&S6S8S:S;S=S?SCSSSSSSS SXSSS!S#S%S'S)S+S-S/S1S3SoSqSsSUUU$U7U9U:U;U<U=UUUUUUUUUUU$U&U6U8U:U;U=U?UCUUUUUUU UXUUU!U#U%U'U)U+U-U/U1U3UoUqUsUXIRXWRXYfXZfX[fX\fXfX%RX'RX7fXfXfX4RX5RX]RX^RXpfXRXRZIRZWRZYfZZfZ[fZ\fZfZ%RZ'RZ7fZfZfZ4RZ5RZ]RZ^RZpfZRZR\IR\WR\Yf\Zf\[f\\f\f\%R\'R\7f\f\f\4R\5R\]R\^R\pf\R\R^IR^WR^Yf^Zf^[f^\f^f^%R^'R^7f^f^f^4R^5R^]R^^R^pf^R^R`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`Raaa$aaaaaaaaaaCaa aXaaa!a#a%a'a)a+a-a/a1a3fIffWffYffZff[ff\ffff%ff'ff7ffffff4ff5ff]ff^ffpfffffhIfhWfhYfhZfh[fh\fhfh%fh'fh7fhfhfh4fh5fh]fh^fhpfhfhfjIfjWfjYfjZfj[fj\fjfj%fj'fj7fjfjfj4fj5fj]fj^fjpfjfjflIflWflYflZfl[fl\flfl%fl'fl7flflfl4fl5fl]fl^flpflflfnIfnWfnYfnZfn[fn\fnfn%fn'fn7fnfnfn4fn5fn]fn^fnpfnfnfooo")o$o&o*o2o4oDoFoGoHoJoPoQoRoSoToUoVoXo]oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooo!o+o-o/o1o3o5o<o>o@oCoDoFoGoHoJoo oWoXoYo_o`oboooo o!o"o#o%o&o'o(o)o*o+o,o-o.o/o0o1o2o3o4o6o8o:o<o@oBoDoIoJoKoLoMoNoOoQoRoSoToUoVoWoXoYoZo[o\o]o^o_o`obodofohojolonpRp Rppp")pRpp Rp qqq")q$q&q*q2q4qDqFqGqHqJqPqQqRqSqTqUqVqXq]qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqq!q+q-q/q1q3q5q<q>q@qCqDqFqGqHqJqq qWqXqYq_q`qbqqqq q!q"q#q%q&q'q(q)q*q+q,q-q.q/q0q1q2q3q4q6q8q:q<q@qBqDqIqJqKqLqMqNqOqQqRqSqTqUqVqWqXqYqZq[q\q]q^q_q`qbqdqfqhqjqlqnrRr Rrrr")rRrr Rr sss")s$s&s*s2s4sDsFsGsHsJsPsQsRsSsTsUsVsXs]ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssss!s+s-s/s1s3s5s<s>s@sCsDsFsGsHsJss sWsXsYs_s`sbssss s!s"s#s%s&s's(s)s*s+s,s-s.s/s0s1s2s3s4s6s8s:s<s@sBsDsIsJsKsLsMsNsOsQsRsSsTsUsVsWsXsYsZs[s\s]s^s_s`sbsdsfshsjslsntRt Rttt")tRtt Rt { {{ {")$q&*247)D\FqGqHqJqPQRqSTqUVXYZ[\]qqqqqqq\\\\\\qqqqqqqqqqqq\q\q\qqqqqqqqqqqqqqq qqqq!$)&)+-/1357<>@CqD\F\GHqJ WXqY\_`qbq\q \!q"\#q%q&\'q(\)q*\+q,\-q.\/q0\1q2\3q4\6q8q:q?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~.notdefnullnonmarkingreturnspaceexclamquotedbl numbersigndollarpercent ampersand quotesingle parenleft parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon semicolonlessequalgreaterquestionatABCDEFGHI.altJKLMNOPQRSTUVWXYZ bracketleft backslash bracketright asciicircum underscoregraveabcdefghijklmnopqrstuvwxyz braceleftbar braceright asciitildenonbreakingspace exclamdowncentsterlingcurrencyyen brokenbarsectiondieresis copyright ordfeminine guillemotleft logicalnotuni00AD registered overscoredegree plusminus twosuperior threesuperioracutemu paragraphperiodcenteredcedilla onesuperior ordmasculineguillemotright onequarteronehalf threequarters questiondownAgraveAacute AcircumflexAtilde AdieresisAringAECcedillaEgraveEacute Ecircumflex Edieresis Igrave.alt Iacute.altIcircumflex.alt Idieresis.altEthNtildeOgraveOacute OcircumflexOtilde OdieresismultiplyOslashUgraveUacute Ucircumflex UdieresisYacuteThorn germandblsagraveaacute acircumflexatilde adieresisaringaeccedillaegraveeacute ecircumflex edieresisigraveiacute icircumflex idieresisethntildeograveoacute ocircumflexotilde odieresisdivideoslashugraveuacute ucircumflex udieresisyacutethorn ydieresisAmacronamacronAbreveabreveAogonekaogonekCacutecacute Ccircumflex ccircumflexCdotcdotCcaronccaronDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflexGbrevegbreveGdotgdot Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbar Itilde.altitilde Imacron.altimacron Ibreve.altibreve Iogonek.altiogonekIdotaccent.altdotlessiIJ.altij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotLslashlslashNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautOEoeRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexScedillascedillaScaronscaron Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflex YdieresisZacutezacute Zdotaccent zdotaccentZcaronzcaronlongsflorin Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccent circumflexcaronmacronbreve dotaccentringogonektilde hungarumlauttonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos.alt Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIota.altKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9Iotadieresis.altUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronpirhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055.alt afii10056.alt afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveendashemdash afii00208 underscoredbl quoteleft quoterightquotesinglbase quotereversed quotedblleft quotedblright quotedblbasedagger daggerdblbulletellipsis perthousandminutesecond guilsinglleftguilsinglright exclamdblfraction nsuperiorfranc afii08941pesetaEuro afii61248 afii61289 afii61352 trademarkOmega estimated oneeighth threeeighths fiveeighths seveneighths partialdiffDeltaproduct summationminusradicalinfinityintegral approxequalnotequal lessequal greaterequallozengeuniFB01uniFB02 cyrillicbrevedotlessjcaroncommaaccent commaaccentcommaaccentrotate zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperioruni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200BuniFEFFuniFFFCuniFFFDuni01F0uni02BCuni03D1uni03D2uni03D6uni1E3Euni1E3Funi1E00uni1E01uni1F4Duni02F3 dasiaoxiauniFB03uniFB04OhornohornUhornuhornuni0300uni0301uni0303hookdotbelowuni0400uni040Duni0450uni045Duni0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BF uni04C0.altuni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CE uni04CF.altuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7 uni1EC8.altuni1EC9 uni1ECA.altuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1uni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni20ABuni030Fcircumflexacutecombcircumflexgravecombcircumflexhookcombcircumflextildecombbreveacutecombbrevegravecomb brevehookcombbrevetildecombcyrillichookleftcyrillicbighookUCcyrillicbighookLCone.pnumzero.osone.ostwo.osthree.osfour.osfive.ossix.osseven.oseight.osnine.osffuni2120Tcedillatcedillag.altgcircumflex.alt gbreve.altgdot.altgcommaaccent.altIIgraveIacute Icircumflex IdieresisItildeImacronIbreveIogonek IdotaccentIJ IotatonosIota Iotadieresis afii10055 afii10056uni04C0uni04CFuni1EC8uni1ECA   46latnMOL ROM  nlatnMOL (ROM B      ligaligaligalnumlnumlnumloclloclonumonumonumpnumpnumpnumsalt saltsaltss01"ss01*ss012ss02:ss02@ss02Fss03Lss03Rss03Xtnum^tnumftnumn    &.6>FNV^Pz2HJJ.,ZgwEG      !$%IJ6 "(^IO]ILI5O4LI^V0R *H C0?1 0 +0a +7S0Q0, +7<<<Obsolete>>>0!0 +ϗmR]0z0b8%a&Z0  *H 0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0 070615000000Z 120614235959Z0\1 0 UUS10U VeriSign, Inc.1402U+VeriSign Time Stamping Services Signer - G200  *H 0ĵR`)J[/Kk5TX56^bMRQ4q{f*j 7٘tvJcEG.k NK+XJ,XB-uލǎlLgrIž`<cxi{-004+(0&0$+0http://ocsp.verisign.com0 U003U,0*0(&$"http://crl.verisign.com/tss-ca.crl0U% 0 +0U0U0010 UTSA1-20  *H PK$ $- 7 ,Za񑑳V@뒾89u6t:O7ʕBǠWdB5N3M'L8MxSݤ^ ⥾`߭(ǥKd[98"3/!?DA e$HDT\y>]r},CS}=*:Om ]^SWp`+nx'4[^I2300-GߍRFCmH 10  *H 01 0 UZA10U Western Cape10U Durbanville10 U Thawte10U Thawte Certification10UThawte Timestamping CA0 031204000000Z 131203235959Z0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0"0  *H 0 ʲ }uNgadڻ30X~k6xw~o< hlʽR-H=]_/kLR`@~ ?Ǵ߇_zj1.G 1s W-x43h/Š*Ë!fXWou<&]'x1"ijGC_^|}bM "Vͮv M٠h;004+(0&0$+0http://ocsp.verisign.com0U00AU:0806420http://crl.verisign.com/ThawteTimestampingCA.crl0U% 0 +0U0$U0010U TSA2048-1-530  *H JkXD1y+LͰXn)^ʓR G'/8ɓN"b?7!Op18UN$ҩ'NzaA*^ݻ+>W~ +;R8'?J00eeR&.Y)"\0  *H 0_1 0 UUS10U VeriSign, Inc.1705U .Class 3 Public Primary Certification Authority0 090521000000Z 190520235959Z01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0"0  *H 0 g`IoV|f^ q-!ќPL"5; .Z|=;%X{ ξ'tag'MjaXy'M4+G Df$fO8TrfujIh8y 0,`Hת809:|@T/ܨR>+!\ P4.M^%Ԍn|)]1ZՌgX5+!`x^{`W ]A cT`C!00U00pU i0g0e `HE0V0(+https://www.verisign.com/cps0*+0https://www.verisign.com/rpa0U0m+ a0_][0Y0W0U image/gif0!00+kπjH,{.0%#http://logo.verisign.com/vslogo.gif0U%0++04+(0&0$+0http://ocsp.verisign.com01U*0(0&$" http://crl.verisign.com/pca3.crl0)U"0 010UClass3CA2048-1-550Uk&pȡ?-50  *H ݔAaix0Ɛ<~B$s/DrPU nQj71ܥ-OM2NgUejzd8xEv1z`³]fvYI8VAwX00fgymPSo0  *H 01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0 100729000000Z 120808235959Z01 0 UUS10U Massachusetts10 UWoburn10U Monotype Imaging Inc.1>0<U 5Digital ID Class 3 - Microsoft Software Validation v210U Type Operations10UMonotype Imaging Inc.00  *H 0Di|U 25L3^ L*8ט@I "SOCʋVnH9c;$5}rGWyˊJ@p-5cįפ {uePd"}KXEMYLM00 U00U0DU=0;09753http://csc3-2009-2-crl.verisign.com/CSC3-2009-2.crl0DU =0;09 `HE0*0(+https://www.verisign.com/rpa0U% 0 +0u+i0g0$+0http://ocsp.verisign.com0?+03http://csc3-2009-2-aia.verisign.com/CSC3-2009-2.cer0U#0k&pȡ?-50 `HB0 +700  *H N"gA~™cjrb<8=_G_[KI  VD 5< D`E*oL;4gpZ9\Zl5|eKmIp=b۴A~}n"w6MZ S1+(RzkwD ]%,͊0>KyʦN $ 񺐶\<'MDBkC.$.=ƫНݿD%J-+@0{ *H  1l0h0g0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA8%a&Z0 +]0 *H  1  *H 0 *H  1 110505165510Z0# *H  1ϗ~fQig}0  *H ],X:l`ήZ4[͌ۡTy?11'%', to6L葬H"!}_FdB^3:M   & 0 2 9 < D p t  !!!! !"!&!.!["""""""+"H"`"d%aIvhcb]gD Xz}} Bvt n%"iOS0L\pr`<&'()*+,-./0123456789:;<=>?@AIJ$%TUVWXY\]^_`abcdefhijklmnopqrstuvhijkFopqrstu45]^@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-@ TNdSF<RFdPF3OF!H U UHU?MJLIKFr&4U%3$UJF?IF<3UU3U?HFrGFk3U3UU3UOU3UoTS++KRK P[%S@QZUZ[XYBK2SX YKdSXBYss++^stu++++++st+++++++++++++st++++++++^Nu?JVZQ^RX^RLV\TdJEb%0SA`%k:$BM6[  D ^ / |  ' X {  0 M a ~  ` %k3U"Y*Z;yUg\ Xv I )Nr m~ ,=N_q#4EVh +=N&6GX ->O`r  + < w !!!&!r!!!!!!!!!"" "1"B"S"c"t"""#####3#D#U#a#m#~########$$$0$w$$$$%%!%2%>%I%Z%k%w%%%%%%%& &&!&2&B&N&Z&&&&&&&'''b''''''((h((() ))')8)I)Y)j){))))))))*!*u********+ ++*+6+G+W+h+x+++++++,&,q,--"-3-D-T-_-j----..2.T...///!/3/E/W/h/z/////////060>0F0j0r0z0000111!1v1~122'292I2Y2i2z223Q3|34)4t455(50555666[667!7X778+8s8888999*9x999999:L::::;;";^;f;n;;;<=>J>>??W???@K@@@AoAAABB@BzBBBBBBBC+C3C~CD DtDE EKEEF7FHFFFGG GG'GGGGH HPHqHHHHHHHIII/IEIMIZItIIIIJJ@JpJJJKKKKKKKL"L^LM2MMNENNNO&O=OTOkOOOPPDPVPvPPQaQQQRR#R/RSRxRRRRS6SvSSTBTTTTTTTTTTTTTTUUV VVVW&W7WHWTW`WmWWWWX>XXYYY'Y0YVYmY~YYYZZYZZ[T[[\\e\]]Z]^#^_]_e_m_``K`}````a0aboc$cddHddde e-ePf$ffgKggh=hhiiJiijPj\jhjjk kPkkl l:lnllmmQmn$nnnnoNoVo}oop"pWppq&qlqrrGrrsIst#t+twT2,B2+Cy=8AH5E ?3210#!#ǒ=Pȑ=ORJ3@  ?3?39/333339/3333310!7!3!3!!!!#!#!7!!!w7ZmVv/ZXkxP::PrO==O!!(/>@"%,(/  MY" ))MY  //99//3+33+3910#7&&'53.546773&'6654&'ݻ5R3O:AHnnV/ӧ)P)#nm|a2y`m1Jdӗ  ^"'5LcC?N= x'/kko%N>}f)  SY/3+310!5!3!!#3oeoedldp/107#67"PJO|\h\R-P GY/+107!RZZR QY?+1074632#"R2,B2*D78AH5E; ??10#;n/J3@ KY KY?+?+10#"&463 "3264&3R؆YׅTׄ}zwhXPbR  ??310!#67'3i7*C4Z\$2N'-@ KYLY?+?+910!!7>54&#"'632!ƬQ6֭WhǮ]pIn7(-@LY && KY& KY ?+?+9/+910#"&'532654&##732654&#"'6632Դu`Aղun}1Trb) eV`rzKCKD !@KY ??9/3+3310!#!73!!7#/P`PPqv OP.B?uss`q{[KX3/@MYLY KY?+?+9/+33102!"&'532654&#"'!!6FTA񪌅nBpbo̱(kZnj)1`V(-@ !KY KYKY?+?+9/+910$32&#"36632#"&26654&#"I{;VTIDsxޒup[Qp, Z^bɶu~?owr@ LY?+3?103!7!ZV`nbB$0#@+ KY %KY?+?+9102#"&5467&&54632654&"6654&᣾ɂxtיdX2ڿ|StͪLNttiNHdIhy[J>|ms#&-@ LYKY MY?+?+9/+910#"'53 ##"&546632%"32>54&#rHWiڙ㢺wޒpZ}Sm,Zҳu~AnvufV @ QY QY?+?+104632#"4632#"3+B2*D3,A3)D9@H7D8AH7CV@  QY ?+/10%#674632#"#IIO|Z3+B2*D`[\9@H7D /33105n!Jgq/@ SYSY/++105!5!yuddXbb= /33105!mq^g)Jbs%)@$$QY$  PY?+3?+9/9107667>54&#"'66324632#"jhvr;s'UeU_32,B1+DjIT{Kl|eV1:w=__`8AG6E}H9FA@!A6:FY.6 A FYAA.6.)GY.6"GY6?+/+9/3+39/+910#"&5##"&546632326654&&#"!27#"$5$!2"3267&pqbq6Zp~zT'EBVW6˨XqfQIe-NBZߥnYaf4ŌQGQyRZR9?vՄ\e!@ IY?3?9/+310!#3#&'%u6CiQ'EDd#?f!-@IYIYIY?+?+9/+910!2#!!2654&#!!2654&#{ɴ}7֜Vٴz+w{u@ IY IY ?+?+10"327#"$32&&˵όhޱ-7mp3^1"  DZ"f @ IYIY?+?+10#!! 2$5!#61!Q$o_˽jfs &@ IYIY IY?+?+9/+10!!!!!!!=)6uNs^^f` @ IYIY?+?9/+103#!!!!g6:^_=&@IY IY IY?+?+9/+10!# $32&&#"327!Xeq^&nXʲԛuVI$ &(^. |/f\ @ IY ?3?39/+10!#!#3!3'dg6fd1w @ JY JY?+3?+310!!77'7!\  ?  AA   IY"?+?10"&'732730P 9P15i#\-f @   ?3?3910!##373og6fE-yZfNIY?+?1033!f6fm`mw@   ?33?3310%3#7####3ݖeO3:`5JqNDffb ?33?3310!###33673-V2_6P 3^n{ @ IY IY?+?+10#"$32%"32$54&{Dҩ;*vfy @ IY IY?+?9/+10!##!23265!#yɁg6;N {#@IYIY?+?+9910#"$32%"32$54&{ JDҩl-L*vfy (@ IY IY?+?39/+9910#! #%3265!#Pg6/ϲoy8y\ % ) @ # JY IY?+?+9910#"&'532654.'&&546632&&#"XW"GoLwvԃcW BObw;~d")m\=WFB*Lvvc#+^(.gBOf|@ IY?+3?10!#!7!!f!PHX^^s@  IY?+?310# 473!267s:HgV./Svp}Y_  ??3310%673#33I54&&#"/;PR-TΆaYJ4fL|ȀdPvf|WO}IL"'@ GYFY?+?+??9910"&'##33663 "32654&q7PG_]}c[Ff|Ȁbvk{ {ODfP@  FYGY?+?+10"&54632&#"3267ݮɓkkovGyGtQ+Z/ޯ!\9f'@ FY GY ?+?+??99102363### 462>54&#"1 cR-[YH{k|ȀPB]vb}T~f}P &@FYFYGY?+?+9/+10"&54632!#327"3 4&խŽr!21WĵLzi,6I^ECWq'@FY HY GY?+?3+3?+10"'53267#?6632&#"3#065/X\##I]W<`s#!ZjCPk}QZLT*7EH@(*GY*55HY!  ( ;FY5 5 ((BFY(.FY?+?+99//+9+3?+10#"'#"&54%&547&&54663232654&''326654&#"L#mx?PX?RyZ5NGOkpEN+}ujXIpe]J?O p:m` !P))/ p\b*Q{O$XojebU[ -3ptJ\hsVL @ FY ?3??+910!654&#"#336632W[pŇ$fbL`V,Ny|\@PZ#eOq}vFp^L ??2103#34632#"&b`5,&9,#?7BH9B' @  GY?+?210"'5326734632#"&>3/BR] `#,&9,#\g~ B7BH9B'L @    ?3??9103##3a}&)jP`J`Fb+/L ??103#3^N^H^P+%@ ! 'FY?3+3?33?9910!654#"#33663236632#654&#"Ǔj#dbP!PojrMvudVL0m}%%?qr{s7\Nx8MUL P@ FY  ?3??+910!654&#"#33632W[pŇ$fbR%\@PZ#?xFp^bT @ FYFY?+?+102#"&546"!2654&ŏ|vuTٿ̿NVۤ-T!&@ GY FY?+???+9910"'##336632"32651 cPR-[|\WH{k|~H+ uP}?'b+3P"'@ FYGY?+?+??99102373### 462>54&#"m7P_b@]}b\Eg|Ȁ[Ptmvd}IHDR@   GY?+??9102&#"#33>E6/B^ dbPIdqR]?^S.1P& @ FY FY?+?+9910#"'532654&&'&&54632&#"αJEEbhšK9#t"WLr_-'Kk.2sj*@;8P^#X@jU7BG)?Q\q?'@@HY FY ?+?+3310!327#"&547#?3~DTeEcla77?QcAVmhI_Cm+?@  FY?+??3910326673#7##"&547}_[nÅ!ibP샇?Fj4JW|w76675&&547654&Lu7cd}X `T5JylKE6 $HPf`)J_ MSNamvuV&TOR~iA7L=(,2Vh3=@ RYRY/+/+3310"56323267#"'&&^1v8l}=lf~]6k@ozu>e=;^n,::C`qHP @ " QY ?+?9/103##"54632>w2,B2+C}8AH7D(@ MY KY   ??99//+33+10#7&&546773&#"327#B]-$Z&teknwvץ:'Z/ޱ<\:-@ MY KYLY?+?+9/3+3102'&#"!!!!7667#7366o'6l{Ih92V]#9L)NT2RY^T R^3u(D@$   RY&RY/++9////////221047'76327'#"''7&732654&&#"J?i}vi=NN=hw~f=JXuuIKrvk@NN>jy\>LP>btsKN@@#MY/  MY  ??39/3+3_^]+333103!!!!#!7!7!7!3H u '=;i@+)d1LT!TL7B@ ??99//103#3#Bdddd f/<'@*07! FY !'FY!?+?+910467&&546632&#"#"'532654&'&&6654&Ӌ@O\t~~|\p]1z`v/JU|q\w1qgvs e1mBJyD:P6]M;[=4K_?x@VL5c'ib>X4AbW9OC01\Hl  /32104632#"%4632#"D)$6*"7)$6*"7V1:@0:?1:@0:s%5?@& GYGY     "2GY"*GY"?+?+99//_^]]++10"327#"&54632&4$32#"$732$54$#"Urhiܻwl$c^^]0.ѳΫD+X-4S-^ZƲѲ30+&@  TY TY?+?2+99102373#7##"&54267654&#"7U#BH`P^BH9^:9gv}qlm3H:Uߠ={L $@    //333310779@:?1'm1'}SY/+10#!5d dM(Pu%5R@. HYFY  "2GY"*GY"?+?+99//_^]]3+9/+91032654#####324$32#"$732$54$#"p]fnOFxӨeӏZ^\0.ѳΫ]YPz whp|^YͲѲ30\u IY/+10!7!s5a; @ RY RY?+3/+104632#"&732654&#"{zyzI[\[ZxxzzYYZm @  SY SY /+/+3310!5!3!!#5!oeoeoubjbpddRJ@ NYNY ?+3?+10!76654&#"'632!\)[MC_c)lIh5v|JPvQ;LL>Z6Z7jfm9'-@NY %% NY% NY !?+?+9/+910#"&'532654##732654&#"'632ajBON[;).|?cxTVfKDdc(mdvU~hHMFZ(iZOcPDED@VqD!  /106673#DB-3VC3JB6H? @  FY?+???399107326673#7##"&'##3aWnƒ$hcNUl!?aReRZA9+F`!@@IY?+9/9310####"&563!de@QF3qo3}R /29/310#"'53254'73ŗ. *ƗnPN^mOsa JP   ?2?9/103#>7'PTv "4u'9;=9)I;' @ TYTY?++102#"&5466"326654&ixPernSVFl7#"54632fnvr;w&UfUa13,A2*DQT{Kj}dV19q=`^_/8AH8Cs&$C1R&+5=s&$vXR&+5s&$K1R&+5V&$RPR&+5&$j+R !&+55&$P@?]]q554@ IYIY IY  IY?+3?99//+++310!!!#!!!!!!#{)nDsuNr X ^^&&z+fss&(C}R &+5fss&(vJR&+5fss&(KNR&+5fs&(jBR &+55s&,CER &+5>s&,vYR&+5s&,K8R&+5&,j6R &+55Z -@IY IY IY?+?+9/3+310#!#73! 2$5!#!!1!Q$΁z}o_`˽j`fb&1RR&+5{s&2CR&+5{s&2vR%&+5{s&2KR#&+5{&2RR&&+5{&2jR .&+55Dd   /3/399107''FJMDLDDLEICCIC",.@!&' ) IY)IY?+?+9910#"''7&5$327"&4&'32${hׅBqEۅF-7ܝ\+#:k#kp@y53nwƢi4qU*dss&8CR&+5ss&8vR&+5ss&8KR&+5s&8jR &&+55s&<vR&+5f? @ IY IY ??99//++10!##3323 65!#?Gg6f9D</@3,& 6FY #GYGY?+?+?+910"'53267!2#"'532654&'&&546676654&#"I.5>OX1PEYzkED;`Tմ[->?NRJ*Obe=n_ !Zege{qKSLa:3K&?_Am$.|Kl6:iE9\UGF\7FPf7!&DC+#&+5f7!&Dv+&+5f7#&DK)&+5f7&DR,&+5f7&Dj 4&+55f7h&DP %&+55fP,<FD@% @!FY@@ =66FY&- -GY ?3+3?3+3??9/+910"&'#7##"&54632373632!#3267%2>54&#""3 654&{'M) ^qx|jx ;B#p~'EBPC}W(b\{qUw;0Mxieqd{o3-*^% ZT=v̺GSfP&Fzyf}!&HC"&+5f!&Hv*&+5f!&HK(&+5f&Hj 3&+55L!&C&+5L!&v &+5L!&K &+5L&j &+55fL#.8@ (GY GY?+?39/+9/9910&'7%!"&5463234''26654&&#"6h; b3 'WY~k(VH'=vkF[|`T54&#"4Kl+c+R-[YH{k|ȀP*YTTvb}T~fs&(MmR&+5f5&HM$&+5fs&(NPR&+5f&HN$&+5fs&(O5&+5f}&HO)&+5fbs&(QLf}P&HQ!fss&(LDR&+5f!&HL-&+5=s&*KR%&+5L!&JKM&+5=&*NR!&+5L&JNI&+5=!&*OR&&+5L&JON&+5;=&*9!L!&J:9J&+5f\s&+KR&+5L &KK)#&+5f1@ IY IY    ?3?399//+33+33103##!##733!3!!dglN[&,RUR&+5B&R&+5&,MYR&+5L5&M&+5&,N(R&+5L&N&+5b&,Qb&LQ!&,OR&+5L? ??103#3b`?:&,-FI&LMs&-KR&+5q!&7K&+5f;&.9}L;&N9-L? @    ?3?39103##3a}&)jP``AFb+/?fNs&/v[R&+5L4&OvO &+5f;N&/9w;&O9f&/8 ?5LS&O8??5fN&/OfxEF&OOu'N %@  IY?+?99//9103'73%!dq'Ǯf+gm PNw5 L` = @  ??99//9107#'73^)^%^DhH)cHfbs&1vR&+5L;!&QvV"&+5f;b&19L; P&Q9Vfbs&1LR&+5L !&QL%&+5&Q}?5fb%@   IY"?+??3399//10"&'73267##33673%\ :Oq}#2_6P 3^)\n\ĶL P"#@FYGY?+?+??910"'53267654&#"#33632A//AR[W[pŇ$fbR%#\fb\@PZ#?xFp{&2MR&+5b5&RM&+5{&2NR&+5b&RN&+5{s&2S'R /&+55bg!&RS .&+55/"4@ IYIYIY  IY IY?+?+??9/+++10!!#"$32!!!!!27&#"fi*LׂnuNrD0nO+^^  zbT#09;@ 4FY44 1$ $FY **FY?3+3?3+39/+9910"&'#"&546326632!#327"!2654&"3 4& A䏸Fr |vu21Y̿Nzi&;iEu%+vY]j' !<A<6GA<8EB-:WC?fU5Zpic#7s1@9DD9;BBX3JG6f7&D&PvL-@#BB/B?B_BoBBBB B%%%%%%/]55/]5s&vR&+5f!&vP&+5s&vR6&+5-1!&v1&+5%; &69;1P&V9! /3210#&'#566731F[776D&@c+<9s#8:@:! /321036673#&&'1HZ775D*?_*!=9s#7>J95/10!!5X /3210#"&55733267xitEHVUgxre\DF=MF  /104632#"F+'9-#;V8AH:A1h @  / ?  /3]210#"&546324&#"326sX]nwZXmNC6 #&+555$f%f`IY?+?103#!!g6^(fs(=f\+{&@IYIYIY?+?+9/+10!7%#"$32%"32$54&?Dҩaav;*v,f. ?3?910#3#&'Cw>\e3TJΌmw0fb1s &@IY IY IY ?+?+9/+10!!!!!7r@)D/^^^^{2f\@ IY?+?310!#!#!'d g6Vfy3q /@ IY IY?+33?+339/310#77!!'7!rHPX{T^^7<q#.@#  IY IY  ??99//++9999107.54$773$54&'#11k3)d'3E#gȭ{ȂɻE|왮y};!@JY ??339/3+310###"&547333332673 `g`Og7= g 5dei89fwAi{$!@IY  IY ?3+333?+10"!7!.54$32!!7$4&oܜ\7ck ZTT3= y  mi鏁˩n9^^}J~^9&,j6R &+55&<jR &+55fm&~T;&+5;p&T2&+5L &T"&+5pz&T&+5%&U{ &&+555fmP!1*@+FY""GY?3+3?+?991023673327#"&547## 462>54&&#"q45R$R"I L'7~tV }_i1']#.mQBV#of[`uJ"!@# HY?+33?9104#!7!#6654&'&&ut`Z.]ofW*FYuZZIwhSSUrO-)>N5@VS|92I-;L P"@   FY?+???9310654&#"#33632W[pŇ$fbR%\@PZ#?xFpr{=+ "&@ GY  FYFY?+?+9/+10%2! !654&"&54663 שOH {xf9rvK8qBPp7EXSiPpy? FY?+?10%27#"&5473Z7LTAdkbDTsbS{4g=L?R!"0@ " FYHY?+?+?9939/10#'&&#"'632327#"&'&'1Lag> QX'A3Jw{n%* $'1NI /k+ibR~?< NV`慠H?wy?  ?3?210363#ybF!@bDd?ȧ=;`35@ (22FY22(#*$'('HY(?+33?9/+9910#"#654&'.54675&&5467##7!#"33Hjz\.LFx>G}xQ1vzɸsWmZ!򏽳Nfzg2+=U===0@-=QuV'k/SSkeuubTRZ?"@ HYHY?+?+33?10%27#"&547!##77!#b+/+=HV-bu&= R V??[?QK.#/T"@  FYFY?+?+?9102#"&'#"32654&ŐYM`c_U/\~xT8FBVN0fJP@ #FY?+?910&#"#6654&'&&54632mnlu0fv]yKYKkn/^}X.4hSAx:=I)@ƪH+h?@  HY FY?+?+310#"&54$3!#"326654&'֚#-줙w^%y(QFɄSNHR?@  HYFY?+?+310%27#"&547!77!!=[o*clD@DVngR|_?Qk9AJ%?@ FY?+?310"&5473323㢴%iff |gi!W.;T%%@GY" FY?2+3?+??10&&5476632#4&#"66˿њ?tbaaWRfǻE@䴪敚-цpx- -)#J!/@ FY GY?+?+??99991023327#"'#.#"'66?J*7kE @;/'5;9w^A ,#&(CJ+Oj<dNRC6U7T  @  FY ?3+3??3?10$3#&&5473P ff^fcfbvBy. ϯ`:]#aBD?)"@( FY%?2+3?39/910"&547332673324'3#"&'Rf^\V}#H`BTN\x̆X{]|LZ3TZu(Ǘ8b^Ty&j #&+55%&j &&+55b&RT$&+5%&T&+5D&T3&+5fs&(jBR &+55o"+@IYIYIY?+?+3?9/+10"'532677654&#!#!7!!!2;FE.y} wӤf!REj1 bxZ@EmdX^^KIf`s&avTR&+5&@IYIY IY?+?+9/+10"!!327#"$32&EZ͌g求-qm^Ui3^1 DZ@% 6,&,j6R &+55-$,@IYIYIY IY ?+?+?9/++10#!!#"'53266!32%32654&#!(re60-9Nmc=ݕX<]`X7uYf)@ IY  IY?+??39/3+310#!!#3!332%32654&#\g6fhޓ1wwWq#@IY  IY ?+3?39/+10!654&#!#!7!!! TwӤf!REj1L f{uCshX^^)S:fs&vR&+55J&6R&+5f\ @  " IY ?3+??3103!3!#!d!fXLdNIVJd$fD &@ IY IYIY?+?+9/+10#!!!32%32654&#6wޕ^ӳYf%f`a\ $@" IY  IY?+33?+?310%#!#36!!TbiP9QeiORݰ^>dMkfs(@  ?33?33910333###X}g3{RfE@>+&-@IY $$JY$ IY ?+?+9/+910#"'53265!#7326654&#"'632۶Ӳh|6إ*gOuj`Zir|wLfb   ?33?221033#7#fO ndx#e<J9f|fbJ&6 R&+5f @  ?3?3910!##33՗g6f')#@IY IY?+?+?10#"'53266!#(re60-9Nmcye!X<]`X7JXmw0f\+{2f\nfy3&75@  IY ?3?+9910"'532673663]?C_oui L!ot-po%u)=qsy};f\ @ "  IY?+3??31033#!3!dߨbhO6d>d@ IY ??39/+910!#"&54733273۽iffri٠dm[@dt8\^ZJf @ IY?+3?331033!3!3f6dX#dZ#dXXJf@ " IY?+33??3310%#!3!3!3biP6dX#dZ#d^>dXXs &@ IY IYIY?+?+9/+10#!!7!32%32654&#s!ݕX^uYf "@ IY IY?+??39/+10#!332%32654&##36hޕf5fuY/f @ IY IY?+?9/+10#!332%32654&#6hޕuYN&@IY IYIY?+?+9/+10%2!7!74&#"'6632#"'5m91f̀rEΑHPE`H@^&HKm\f$*@ IY  IYIY?+?+??9/+10#"47!#3!6$32%"32$54&}g6f( ѩ?*`@1w/sm &@ IY  IY ?+?39/+910#&&54$!!##"33L}ixLf䤔{(wJ{߷f7PDbT*$@"FYFY?+?9/+910476$73632#"&26654&#"bލ]LK ?{7ۖܔst[}mei .C V 9)/ƻЕꔊt#/hP(-@""FY""FYGY?+?+9/+9102#"&54$32654!"32654&hue̒q'pP}ww\^Uչ=I|kȂzXgN\P(#@"%FYFY?+?+910>32327#"&54667>54&#"ydY)};nkBlGn3b[:U* uloE8N`CW]IZ+}R}e<;DN3KK'!f)(-@ #FY GYGY?+?+9/+910#"&54632365#"'66322#"fB5}%'4D¹;FtsϵzȮVK 'R(E\+ f}PH{P;=@ 8FY88: /4/GY4(#(GY#?3+3?3+3??9/3+3103>32&#"327# 47####"'732654&#"563 33^̃M:9Fqqv}5

32`&$\xhGVn`%J`]KT|wQ[OYZLW-?@     ?33?33339/10!#&&'#3663,CZeIu L d? 7|Jm? @ GY   ?3?39/+10!3#!#dqhefnod?!?bTRL PQTSfPFH^PP'?\b"-@"GY FY ?3+3?+33??10##&&54$732654&'skZi‘c^RŏzrB'r̠¹( ?[m+?$!@ $"FY?3+3??3910326673327#&&57##"&547}_[nÅ!ibT(dePC6Tr?Fg7JWhBYM_ SN3qr|w8059)0dlXKUTfX!%*T# JT#*@ GYFYFY?+?+??9/+102#"&547!#3!6"32654&H𡶷od`d3zs}pT6;?! Vڦ2?&.@$$HY$$HY FY?+?+?9/+910"#"'53267667&&54663!#"!3RSiL83AR>! 32"32654&5Yٳ jwZTn`  Ka]I*PikAOzsx߆wTơLOXZMzƋLKweeJ?$2@FYGYGY?+??399//++910763 #"&547!#3!3"32654&s8uaTod`didN6qL Ğb?! xKzszhbL H!&v &+5'&\6&+5m+?(@ FY?+???39/9103#326673#7##"&547 ZZX;_[nÅ!ibP샇VjFj4JW|w???322333?3210##"&54632'"3254&#"&54632"32654&#"&54632'"32654&jodopxgmyoOQRHHdopxgmNSRHTLHPdooxgmxoOQQHTLIJМ0EttMmlyМ0JstmlМ0Ettpi V{ /331079?1'%{ /33107'7^9=@{1P'^2'1 ??10#k>J3@  @ TY?+?2910654#"#336632HVTYw?/@LY LY LY?+?99//3+3+10!!!!!!##7 $;5?g@'^^^1^&T@/ !"!MY ""?"O" ""MYKYLY?+3?+9/3+39/_^]3+3102'&#"!!!!!!76677#737#73766o'6l{+h/c1V_"1-)NT2RRdY^T \RRϻ=o ,F@$**),',MY,, LY LY!KY!?+?+?9/+9/+339/10!##323265!##3267#"547#?3g6)S4A.;E4N`77N R}g=BIVNgCP&L@)MY " MY""LY"LY?+?+9/3+39/_^]3+310"!!!!327#"55#7367#7332&ߺR4 Xs_^y5fmRbwR9^7RetR ZRN'3@+1! ???32?3210#"&546632&#"3272#"&54664&#"326jHqY]ROHCgQUJw{Nau|ROGFf7eyJuz~nlP'R%vpiwnhQTVXsm&)@$     /3/399//9929910%273#"&556746324&#"66ZNh^j\}stƽXQGIDH咭+T&Vӆ|\ij`s1MND (1@  &  ?333?39/]39/33310!##337!2#"&5464&#"326fJ)+`5{\A(zZbv3UJlZHl?sJVV~raYgdc @ ?3333233210##5!###33#7#V XR}}VNN}ah^/{vH /3/29/310"&546632!3267&&#"1RQHbٓ7Xz#5Fi)|7@u9Z'@&{  ?555S'@F&u  ?555S'@5&=  ?555=P'@' ?  ?555-'@ ! ?3?39/9310#"&546327&#"56632267&#"-𰚮U9-*9q_um}GȰ5i#b @  IY?+?3103!7!C *g!FJBFZe2@ IY?+?310!#!f?TLV @ IY IY?+?+331055!!!VxtwF_E^E^/ SY/+105!dd%//9/3310##533bn^X{ #/*@**SY $$SY/2+3/3+3991026632#"&'#"&546"32654&!"3267&&[A?^~^?BZPs77sPXhiOWjjWJs=e?:^o!'9}apG=;^n,::C`qHo#/@RY RY    //99//3+33+310'!5!!5!!!!L{^ I}:%RFR1'RR/ @ SY /3/+105 5!n!Jgqdd= @ SY /33/+1055!!mq^g)Jbddw-  //33103# w1=1w!m'L5I/'O7Ij/3210#"&5473327 RUeta&$-DG?  GY?+?10"'532673>3/BR] `#\g~   /106673#$h` :0.6'6;  /106673#"g` =/V,=(9  ! /10#56673 "g`?/,=&;s3 @ NY NY!?+?+10#"&54632"32654&dpoxgmNSQHTLIН0Jstpi5J %@NY  ??9/3+33310##7!733#671R1yV}=$ f/LA&"~Z7(@NY NY!?+?39/9+9102#"'532654&#"'!!6p}~SfotVRNZ!yP@`tu1]BjMWN5&-@ NYNYNY!?+?+9/+910&#"3632#"&546322654&#"3B|#U]pN^nt|وT]zHE:i=QZ`whZ\" ӔlE[8_MUgJ@ NY?+3?10!7!d JPAm;#0#@* $NY NY !?+?+9102#"&5467&&54632654&">54&bwav?Lj~s<2hsUJZoRQ[2@SG+JfYOx1(dGpqbb-/[8f+#fSAL_ORgT #'+/37;?CGS[kt|@N-luuk\}}VKvkZQ\t\84 0%3&1HT;GFBIHCHEVW/2A1R~X8*P:/5K6DpJ;?HI>@IH!&7L&+5 D)2?<@&7&HY077,FY,,=FY,!FY?+?+9/+9/3+310#"&5476654&#"76323267#"&54632333654&#"uz:D%;668K3/+dZޘmRop`sszgBZM:LskDWe೹}Rpe|=*@΁@ IY?+??91066632&#"#3tf<);i]liwd9 X i!s?--@##  HY *FY?2+3?+339/10"&547!77!##"&'4'!32673326|tVr^ QRt#;a6QF]ZW?QEv^T䈜c&Pbmwu&0v}T&+5H^!&Pvq5&+5&$[f7P&D[%'\2m @ H @ H /+3+210#"&546324&#"326mta`mm`atYE76E?<7E\lj\]jnY9DD9:CCZ  ?3210673#'467#"&i;<9t7<2&*,!U1`V#]3 #1:^&Luw&O$%@  IY IY?+?+9910#"$326673"32$54&{DӏBfhi 5-ҩ;*lm)qbyc=?[Iq˃L7s1@IY IY @IY?+99//+3+310#!!7!3!!32%32654&#s9DhDdLݕ^-^YH'%8@ FY HY GY ?+?3+39/+910!!763 #"&547#7373"32654&Z8ubTd4d^M6r?Q^ ĞiQ vMzsygcf)%1@IY!IY! IY?+?+??9/3+310"!!327#"47!#3!6$32&GZ ͋tg6f07-om^"r 3^1 `X1w.DZ@JRP$1@ FY  FYGY?+?+??9/3+310"&547!#3!632&#"!!3267qd`d4ȇkkn1EyH{J3?+Z/T6E!\9- #@  JY ?33?9/+3310!###3##!'&'^Vm_E`}LTX^g#$+JN$Yd? !@HY   ?3?339/+310#####!'bRm^s}cH#4??b1^f-@ JY   ?3?339/3+33310!###!#3!3##!'&'^VlAg6fF`}LX7zf#$++wJN%\YL?,@  HY ?3?3?9/3+3310#####!#3!!'bRm^s}c1m^^jF+H#4??b1^`"0@JY  ""IY?+33?339/33+310#>77!#.####"!=FlhmA i4j^bbw]=v<ZVK3xm2-m+D?0@HY  HY?+33?339/33+310#>77!#&&'#!b9kg  ^b{F6c3{v_wqs[-eoif8}EE Dzu7f+'XQ}qf`%(9@ IY&   ( (IY ?+33?3?9/33+3310!667!#3!7!#.####"!)O6g6fmA i4j^bbw]=Um#ZVK3xm2-m+DJ?"%9@ GY#   % %HY ?+33?3?9/33+3310!667!#3!7!#&&'##"! #C0ud`^@  ^azF5b3{w^w Bdo?T?>}EE Dxw7f+Zy}q\NZ@3A32&#"37632&##"&54667>hz_O6Xp^!^>K@DC#"&%c5uڧQDKMH^NBpOd!`Zir|C4L32&#"7`g{Ye[j8EMd*\BJvrEƒTZiX=qJ)v _ ^=L@DC"#!&bJ]qu\gVB;^ `/ `TE\="soaY\{kN^".PI @E^H' MYu{6@ IY]m?  IY IY?+?+9/_^]]+10#"$322!"!74&{kFF)33,E)A8%sbT 4@FY?O FYFY?+?+9/_^]+102#"&546267!"!654&ŏ (F-Tٿ̿N8442H@  JY?+??310%66>32&#"#3Wv<_rK++MnKXdu/~t7T hJhP@  HY ?3?+?10337>32&#"#hel?5SeD0,<^;q?!L,}o9 N cHs&vfR !&+55h!&v  &+55 &2\dT'\R{0K@##/) /O IY&))IY H?3++3?+33_^]999910#"&'&54$76632%"'6632665%{޺ 9#&9 ©, 7#&; /R 4"&: N''-+&#%&-/)S )"$++zW?b-\@8!,% +;K FY#%$ 4 D     %FY ?+3_^]]3?+3_^]]39999102#"&'&&54676"&'6326654&'#3y}ՍE"3}C"2qf@JqbLN)($ȚH(&է9C'%;;Ik#72H[}@ PYL>443JY4@: H4B@Y YY Y Y;B;JYB@ HB YL 0 % %IY --IY?3+3?3+399++_^]_^]++910%2654&#"'63 #"'#"&532&#"3267#"&'&&#"#6632376654&'&&54632\˙Z{w;].-wO͒b|9Ъ d9Za]QU05<Kv?*O/>Q c_0f\KR+pW +8+#38H#u!TDEI+HV@6"&2NR(=7^d("Jq> 2  7m`-CVnKGT9/T@ HT6/.HY/@( H/=@=6HY=@ H=G+""GY ((GY?3+3?3+399+++++910%2654&#"'63 #"'#"&54632&#"3267#"&'&&#"#6632376654'.54632JUULR+mbobpc̃eO7CCPx>p%'l 7n[*O/>Q c_/g\LL0pW (:%+#38Hss/R9i55l>T6($R,=8^e(#Jq= 3   77EK@'=A=AE HE@;?B**IY0&&IY ?3+3?3+39/922+99//10"'63 #"&'#"&532&#"!2677332654&#'##'##'7;].-wOl܌p)jƪ d9Za]Qz#5m)tX{s P N -m!TDEbÌd\WiHV@gY6љ'puuuusj$1@  $ H$! ?223?339922+99//1033363###'##'##'7bLTEb\ @b>c=]r P M -?[Iq˃L7tttt@ IY IY ?+?+?10"327#&5$32&˵ٽ6}ffhޱ-mp # DZ@fP@ FY GY?+?+?10%27#"&54632&#"XLbdʗkkosF$T+Z/Ⲛ'^@   //910%'%7%7%1'H'%F)B);@D5%ŤBuH  /2310#"&5463!6632R"%::*+"(yV$,3++""Wu /332102676632#654#"##74yd:uBXi]i,ccr?#!LC V$9Q\  /9104632&&0&P%+wjc,9>' 9%B"n{ /9105654'.5432{jcw+ P&0KkB%9  >9) (6DR_m`@0(!%6/,3_YV\mfcjD=:ARKHO %3j\AOOA\j3%  //9//////2222222210&&#"#632&&#"#6632&&#"#6632!&&#"#6632&&#"#6632!&&#"#6632&&#"#632!&&#"#6632o //10#677&''6673&&'7%'67'&'7%'766&&'57 F$a5sGA݁R Ia4!&b'ZEx+REC{L%ExbCWBO݁#BO݁ Ia5uGA܂24bE<Y?DnXFcDnXb'X< F$a5fbJ"(@ IY  "" ?2222??3+?10333##7##"&5473327f)6 nݤrС60e} RUe>d`Jng("-DGm+-/@-%+  FY HY"??+?+?3922103266733##7##"&547#"&5473327}_[nÅ!ibפuϕ섆  RUf?Fj8JSAo|wEk6{D=͆_ww H^ )h3LH'?.@ GYHYFY?+?+?9/+910"'532654&#"#!!632fLXbzfO@mbmR9Lp`%c0?Qz _(@ " IY?+?33?339103333####X}g3{biP^RfE@>+}>d{P=@@" $ FY($$ & ="2 GY- 9GY?3+3?3+3???9/3+310# 47####"'732654&#"563 333>32&#"327#R  m`m΂K<8Gtnv~4d')#H?"@   "HY?+???391033###3ZX{fdQEyqbbn?'Cm%?f/@/  ?3?399//9]10#37733##g6f6V!EsoCV8H?6@   @ H ?3?399//+]91033##'#37V+-"1D0VDfqbbn[H9<?f7@! JY o ?3?39/]3+3910!###73733#73og-f/]ERRVyZL4@  HY  /   ?3??9/]3+39103###7373!!a}&)jP`,`+yjFb+/NN !@  IY ?+?3?9103##!7!3՘f!#''X^Rw? !@   HY?+?3?9107!3##Ro=yqbQ %f\%@IY " IY?+???39/+10!!#3!33#×g6fdߨbhO1w>dJm?%@ GY " FY ?+???39/+10!33##!#dqheײgdTnod?!?m?f $@ IY   IY ?+?3?9/+10!#!#3!!dg6fX1wJ? $@GY  HY ?+?3?9/+10!#!#3!!!fnod`dqh?!Qf=0@ IY IYIY?+?+?39/+910!#!#!632#"'532654&#"'d g6D=͆_wwٿ>EV\ )h3L F? 0@GY  GY  FY ?+?+?39/+910632#"'532654&#"#!#hdDCp`hJXbzf?Rmhd?) _%c0?m.<N@+%/#6, IY ,6IY,, , ,,IY#IY?+?+9/_^]++999910327#"&'#"$32&#"327&&546326654&#"mht?kG4dHsP92@0"  FY!1,HY1?+?3+3??3?99104&#"#654#"#33663236632327#&&54666VL0mfj#dbP!PojrMvuRT!edP=DZXMU}%%?qr{s7\g8aM_YF6,x<q?   ??3910%663#3h >ff]edmfCy$M!v)@  JY  ??39/3+39103!!#!7!73 u !RiX d1\-RmR<?%@ HY ?2+3??3931033336633###-dm >fX]V?!vCyRfy}"@  IY"??+??3910%###33biP^`jw^>dZr1w;"@  HY"??+??3910%###33ffdRTwydux@PCm!+2+H'@ "IY IY?+3?+3??10!7!!!33#!qPH"eߨbiPX^^X>dT?(/@' "&'&HY'FY?3+3?+3??910!326673327#&&57##"&547!7!b_[m„$ibT(ddOA8Nuc;JWhBYM_ RK8mv|wd?)@ FY "FY?+??39/+910##"&5473327733##6?:dE Ya0bײfeTTsxuJf XJWZ?mz<@ IY??39/+9999/9/_^]10%#"&5473333673#Aiffri OWPdeC5@dt8\^xDJmB?6@ FY ??39/+9/9/99910336773#667##"&547PE W_BV@)bf22-7V5:?XJW3  Z饶!{rJf dF@IY ?3?9/+910632#654&#"#Óhggshߟe6Z>fo=^]ZH?@ FY  ?3?9/+910!654&#"#336632E Za/bg12/Nt@AVJXZ?on|r*f&04@"" &IY*&&'IYIY?+?+9/3+39/10!2!#3267#"47"&54733"3 $54&mE1 j|~pXcdeK;|8G(0`1%.U8_PF36:[Y䲷u{dJP-4@(( "-"FY-- FY GY?+?+9/3+39/10"3 4&632!#327#"&547"&54733D21Y5r!Xc`hFTXzi,6I^E:5_PF37:^)3=@$$) )IY-))"*IYIY?+3?+?9/3+39/10!2!#3267#&547"&54733"3 $54&mE1 j|vgHhKXcdeK;|8G(0`/%T+U8_PF36:[Y䲷u{dJP'0=@""' 'FY+''"(FYGY?+?+?9/3+39/310632!#327#&&547"&54733"3 4&J5r!?eDXc`h21YRzi,6I^Aaѯ:5_PF37:^FT,J&6fR&+5{&6L?&+5f+@IY IY ?+??39/+9910632#"'532654&#"#33(*·_wwalg6f)h3?{)H?)@HY FY?+??39/+910#"'532654&#"#33eNVeze=8hbbn=V׼%b/ ? $@"IYIY IY??++?+?10!#"'53266!3##N(re60-9NmcyݤsѠX<]`X7>dH$@"FYHY GY ??++?+?10&#"#"'532667>323##L&$\xhGVn`%J`]KT|wQ[פuϦOYZLWAof\"@ IY  IY?+??39/+10"'532!#3!3r,@ >{g6fdH-i" F1wJm?"@ GY   FY?+??39/+10"'53267!#3!3fLXb.pod`dqhe+y%c0?!`f\%@IY " IY?+???39/+10!#3!33##Zg6fdߤsѡ1w>dJm?%@ GY  "FY?+???39/+10%##!#3!33tϦnod`dqheT=o?!)@IY"IY?+??39/+910#"&54733273##3۽iffri٠d˦Hh^m[@dt8\^ZJ?)@FY " FY ?+??39/+91032773##3767##"&547PE Ya0bJb\13:?XJWZ|xuJf mw$@ "IY?+??3?3310%33##7####3ݖsѠO3:`5>dqNDf-?$@   "HY?+??3?3310#&&'#36633##u,CZeIu٣uϞ L d? 7|Ao,VJ&$6{R&+5f7&D6B%&+5&$j+R !&+55f7&Dj 4&+55fPfsJ&(6R&+5f&H6$&+5^ "&@ IY IYIY?+?+9/+10#"&54$!3654&#"566322#  vsbKbeE瀞2MYa/':vy=TP &@ GY GYFY?+?+9/+102#"&54$!3654&#"56267# –rGC 11WPŽzi%=J^FET^ &jR 5&+55=T&j 3&+55&jR $&+55{&j N&+55&jR 9&+55&j> <&+55 9&@IYIY IY?+?+9/+10#"&'5326654&##7!7!dd҃dhH)n#,uj^kX1^X\'?&@FYFY FY?+?+9/+10#"'532665!#7!7!Ӆx6KkKϮ@h#/p7P=XOfb&MR&+5m+5&XM%&+5fb&jR  &+55m+&Xj +&+55{&2jR .&+55b&Rj -&+55{~bT{&~jR 2&+55b&j 1&+55N&jR .&+55 '&j< 3&+555&M\R&+5'5&\M&+55&jDR '&+55'&\jr *&+555s&ShR (&+55'!&\S +&+55&j=R (&+55&j ,&+55f` @"IYIY?+?+?103!!3#f6biP^>dH#? @"HY FY?+?+?10%##!!mgdTmT?m?Qff&jR *&+55!&j 4&+55H`7@JYIYIY IY "?+?+?+9/3+310!!!3#"'53277##73`O}8QI0 !T^RWSXgR#?7@ HY HY FYGY"?+?+?+9/3+3103#73!!!!3#"'53277HjhmVZ5RH0 !TPQdPRWSXgy}'@IY IY"?+?+??39910%3#"'53277##33J7QH1" Sw`jw^WSXgZr1;'@ FYGY"?+?+??39910#333#"'53277#wydux@ٕ5RH0 !Tp!+2/WSXgy})@  JY ?3?39/3+39910##!7!33!\k9jw-3ZRriR;)@ HY  ?3?39/3+39910#!7!33!!#wyduxeb!R2R\o @ IYIY?+?9/+104$!33!"&# !3\ g IhJfG\1(1@ IY $ $IY ?3+3?9/+9/910#"&'#"&54$!33327# 326671n ɖm{g qZ2mv\ZP렯c[(}$Ug BwKf-.@(FY  GY ?3+3?+?999/1032673# #! 46323632>54&#"h\t{ G\I%1 cYH{k|ȀfhZ"vbB]F}T~26@'',IY, JY,#IY,?+?+9/+9/9104&##7326654&#"'63232673#"&&547h|6إqYslkq#ĖXH `Zir|wL*&??Ug|z 塨DzJ*{P+6@$$)GY) FY) GY)?+?+9/+9/910%74&##732654&#"'663232673#"&7bsZhX=qJ)SVypw!H\J&w[U\woN^".P2$tqxZ|&0@IY$"" JY$IY$?+?+?9/+9104&##7326654&#"'6323##6h|6إ$chP@`Zir|wL*6r>d%h/P&0@! GY "FYFY?+?+?9/+910%3##7654&##732654&#"'6632}feT/TZhX=qJ)SVy T?mA$k_\woN^".P2$tq(@&'@#IY #IY#?+?3+39/10%32673#"&547!#"'53266!m[slkq#Ėg(re60-9Nmc`Q_|z 塨tB<]`X7sH,'@((FY(  GY ?3+3?+9/10%32673#"&547&#"#"'532667>32pw!H\J&}&$\xfIVn`#J`]KSzzQ[Z|GkJOYZLYq{f,@IYIY?+??39/+9/10!#3!332673#"&546Zg6fdm[slkq#Ė1wIQ_|z 塨t/aJ)?,@GYGY?+??39/+9/10!#3!332673#"&547od`dqhepw!H\J&?!i`JZ}Gk=&@IY IY IY?+?+9/+10!!"$32&&#"32667!T0eq^&nXʲėvw-  &(^. |sbT0@FY  FY FY?+?+9/_^]+10!#"&54$32'&#"3267!f3ߕPk)Ax||(Eݽ2*:T#?ힵó%@ IY IY ?+?+39/10%32673#"&547!7!!n[rlkq#ĖPHR^|z 塨rB^^o{T?%@HY GY?+?+39/10!7!!32673#"&547}qx G\I&QQdDZ|Hjh'-@&IY JYIY?+?+9/+9104632&#"33#"3267#"&54675&PdS5垕\uuVڼ+1>Vo}`$4c/"¬ E;mP!)@IY IY IY IY"?+??++?+10#"'53266!3#"'53277#(re60-9Nmcyݍ7QH1" S!X<]`X7WSXgXH()@&FY&FYGY GY"?+??++?+10%3#"'53277#&#"#"'532667>326QI0 !T&$\xhGVn`%J`]KT|wQ[TWSXgOYZLW&$gf7P&Dg&$fR&+5f7&Df&&+5&$wR &+55f&Dw 0&+55&$xR '&+55f7}&Dx :&+55%&$yR &+55f&Dy 0&+55i&$zR &+55f&Dz 0&+55s&$'K+Rg&+5f7#&D&Kg)&+5&${R &+55f7&D{ %&+55&$|R &+55f7&D| %&+55V&$}R &+55f7&D} %&+55i&$~R &+55fi&D~ %&+55#&$'N3Rg&+5f7&D&Ng%&+5fs&(gf}P&Hgfs&(fR&+5f&Hf%&+5fs&(RXR&+5f&HR+&+5f&(wR &+55f&Hw /&+55fs&(xR $&+55f}&Hx 9&+55f%&(yR &+55fl&Hy /&+55fi&(zR &+55fT&Hz /&+55fss&('KFRg&+5f!&H&Kg(&+5&,f R&+5L&f&+5&,gw&Lg<{&2g|bT&Rg{&2fR &+5b&Rf&+5&2wyR *&+55b&Rw )&+55{&2xuR 4&+55b}&Rx 3&+55{%&2yuR *&+55bx&Ry )&+55{i&2zuR *&+55b`&Rz )&+55{s&2'KRgx#&+5b!&R&Kg"&+5s&_vR.&+5b!&`v+&+5s&_CR&&+5b!&`C$&+5&_fR(&+5b&`f&&+5&_RR/&+5b&`R#&+5&_gxb&`gs&8g$m+?&Xgs&8fmR&+5m+&Xf&+5s&avR&&+5mw!&bv*&+5s&aCR&+5mw!&bC"&+5&afR &+5mw&bf%&+5&aRR'&+5mw&bR"&+5&ag$mw&bg&<g2'?&\gt&<fR &+5'&\f/&+5&<R R&+5'&\R"&+5&B?! /3210#&&'53#&&'53J/}1sKI/}/t/</<@@ H H  /32++106673#&'#%6673#?1M_9$cZ%2m76B'9+>7ih8%w+9mm} !@ @ H H/3++210&&'536673#&'#97{rU$u?1M_9$cZ%"t.;o'9+>7ih83@@ H@ H  /32_]+299//+3106673#&'##7654#"5632?1M_9$cZ%?W1--'9+>7ih8l!)X L8 :(%@%"@ H  /32+]32106673#&'#"&'&&#"#663232673?1M_9$cZ%*K)#>(.=LkU2M;2-;Ne'9+>7ih8k"!4Cel$':Ane!7@ @ H /32+10#"&55733267'6673#zitEHVUg*o#.>Awse\DF=M1 t32q"!#@ @ H /32+10#"&55733267'&&'53zitEHVUg>wsZ)wse\DF=M&t++{#!# 0@ H@ H@ H /32++2+9/310#"&557332677#7654#"5632zitEHVUg`UC["2? wse\DF=M8N+^ Q: < )!@&#@ H /32+222210#"&55733267'"&'&&#"#663232673zitEHVUg *L(#>(.=LkU2M;2-;Newse\DF=M{"!4Cel$':Anesb /210254'3#"'7;v T+mh2 dPsKfzE B^ /210%#"'53277B8RH0 !T1^WSXg?T /210%#"'53277?5RH0 !T/TWSXgx&hd @ MY &MY?+?+10#"&54632%"32654&웳uq{iJ݉ګ'/Z  ??310!#67'3/h4(Y3ZG#?{NZd@ LY&LY?+?+910!!7>54&#"'6632!ˊz8th;TqIkjHcyuEXhNHQ~V_df(-@LY && KY&& KY %?+?+9/+910#"&'532654&##732654&#"'6632dԴu`Aղun}1Tr1b) eV`rzKCKZ !@KY $??9/3+3310%!#!73!!7#P`OPnwh;(8Lyra RV Q/@MYLY KY%?+?+9/+33102!"&'532654&#"'!!6ּTA񪌅nBpb ̱(kZnj)1`lO@ $LY?+3?10!7! ZV`nW7`&-@ LYKY& MY%?+?+9/+910#"'53 ##"&546632%"32>54&rHWiڙ㢺wޒpZ}Sm,Zҳu~Anvu;8@3GY.#FY*8 HY' ?33+33?3+3?3+310"'53267#?6632&#"!76632&#"3##"'53267!065/X\##I]W<`s###I]W=as#"z065/X\#!ZjCPk}Pm{QZZjZ)+$5#@3'-%1*+.+?3?322223310#"'532654&'.54632&&#"##33#7#zoQ]a[\?mQJ_Yk!d)EG7_`L!R}}V]nR#C859+!3?:OhL ;2.6#&6Hah^/y&7z'7?&WzF7P-.@ 'FYGYFY?+?+?+?9910"&'53267##"&5463237326654&#"fH<>H*FH{1;P1UH{k|Ȁe'g'0Ek2xOF7!&K5&+5F7&N1&+5F7&O76&+5F7!&:j2&+5f ??1033f6bJf s&CR&+5fDs&v_R &+5fs&K$R &+5f&jR &+55fF&R@R&+5f&M6R&+5f&NR&+5b&Q/fB!&OqR &+5f&-m'T?5ff&jR &+55ff&jR &+55fff&fR&+50&gZ2I6$$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs) $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q  q q q           ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q   q   q    q q  q  !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) -&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq7$&q&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq$q$ q$&$*$- $2$4$7q$9$:$<$$$$$$$$$$$$$$$$$$$$$$q$&q$6$8$:$G$$$$$q$ q$_$I$K$M$O$Q$S$U$W$Y$[$]$_$o$q$s$q%%%$%7%9%:%;%<%=%%%%%%%%%%%$%&%6%8%:%;%=%?%C%%%%%%% %X%%%!%#%%%'%)%+%-%/%1%3%o%q%s%&&&*&2&4&&&&&&&&&&&&&&&&&&&&G&_&I&K&M&O&Q&S&U&W&Y&[&]&_'''$'7'9':';'<'='''''''''''$'&'6'8':';'='?'C''''''' 'X'''!'#'%''')'+'-'/'1'3'o'q's'(-{)))"))$))))))))))C)) )X)))!)#)%)')))+)-)/)1)3.&.*.2.4....................G._.I.K.M.O.Q.S.U.W.Y.[.]._/\/ \/&/*/2/4/7/8/9/:/</////////////////////////$/&/*/,/./0/2/4/6/8/:/G/////\/ \/_/a/I/K/M/O/Q/S/U/W/Y/[/]/_/a/c/e/g/i/k/m/o/q/s/222$27292:2;2<2=22222222222$2&26282:2;2=2?2C2222222 2X222!2#2%2'2)2+2-2/21232o2q2s2333$3;3=3333333333;3=3?3C33 3X333!3#3%3'3)3+3-3/3133444$47494:4;4<4=44444444444$4&46484:4;4=4?4C4444444 4X444!4#4%4'4)4+4-4/41434o4q4s47777")7$q7&7*727477)7D\7Fq7Gq7Hq7Jq7P7Q7Rq7S7Tq7U7V7X7Y7Z7[7\7]7q7q7q7q7q7q77777777q7\7\7\7\7\7\7q7q7q7q7q7q7q7q7q7q7q777777q7\7q7\7q7\77q77q77q77q7q7q7q7q7q7q7q77q77q77q77q7777 77q77q77q77q7777!7$)7&)7+7-7/717375777<7>7@7Cq7D\7F\7G7Hq7J7777777 7W7Xq7Y\7_7`q7b7q7\7q7 \7!q7"\7#q7%q7&\7'q7(\7)q7*\7+q7,\7-q7.\7/q70\71q72\73q74\76q78q7:q7<@<C<D<F<G<H<J<< <W<X<Y<_<`<b<<<< <!<"<#<%<&<'<(<)<*<+<,<-<.</<0<1<2<3<4<6<8<:<<<@<B<D<I<J<K<L<M<N<O<Q<R<S<T<U<V<W<X<Y<Z<[<\<]<^<_<`<b<d<f<h<j<l<n=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_>-DD DD EE EYEZE[E\E]EE7E<E>E@EEEE EpF)F )F)F )HH HYHZH[H\H]HH7H<H>H@HHHH HpI{I {I{I {KK KK NFNGNHNRNTNNNNNNNNNNNNNNNNNNNNNNNNNNNNHN`N6N8N:N<N@NBNDNJNLNNNRNTNVNXNZN\N^N`PP PP QQ QQ RR RYRZR[R\R]RR7R<R>R@RRRR RpSS SYSZS[S\S]SS7S<S>S@SSSS SpURU RUDUFUGUHUJURUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUDUFUHURU RUYU`UU U"U&U(U*U,U.U0U2U4U6U8U:U<U@UBUDUJULUNURUTUVUXUZU\U^U`W)W )W)W )YRY RYYY")YRYY RY ZRZ RZZZ")ZRZZ RZ [F[G[H[R[T[[[[[[[[[[[[[[[[[[[[[[[[[[[[H[`[6[8[:[<[@[B[D[J[L[N[R[T[V[X[Z[\[^[`\R\ R\\\")\R\\ R\ ^-q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq-{&*24G_IKMOQSUWY[]_-{-{-{-{$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjln$;=;=?C X!#%')+-/13             YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p   YZ[\]7<>@ pR R")R R  YZ[\]7<>@ pR R")R R q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  &*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_$79:;<=$&68:;=?C X!#%')+-/13oqsR R "@E=K=N=O=`={R R$79:;<=$&68:;=?C X!#%')+-/13oqs-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p  &*24G_IKMOQSUWY[]_FGHRTH`68:<@BDJLNRTVXZ\^`FGHRTH`68:<@BDJLNRTVXZ\^`\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqsR R "@E=K=N=O=`=R R\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs  $79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs-{R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`$$$$")$$q$&$*$2$4$7)$D\$Fq$Gq$Hq$Jq$P$Q$Rq$S$Tq$U$V$X$Y$Z$[$\$]$q$q$q$q$q$q$$$$$$$$q$\$\$\$\$\$\$q$q$q$q$q$q$q$q$q$q$q$$$$$$q$\$q$\$q$\$$q$$q$$q$$q$q$q$q$q$q$q$q$$q$$q$$q$$q$$$$ $$q$$q$$q$$q$$$$!$$)$&)$+$-$/$1$3$5$7$<$>$@$Cq$D\$F\$G$Hq$J$$$$$$$ $W$Xq$Y\$_$`q$b$q$\$q$ \$!q$"\$#q$%q$&\$'q$(\$)q$*\$+q$,\$-q$.\$/q$0\$1q$2\$3q$4\$6q$8q$:q$&@&Cq&D\&F\&G&Hq&J&&&&&&& &W&Xq&Y\&_&`q&b&q&\&q& \&!q&"\&#q&%q&&\&'q&(\&)q&*\&+q&,\&-q&.\&/q&0\&1q&2\&3q&4\&6q&8q&:q&(@(Cq(D\(F\(G(Hq(J((((((( (W(Xq(Y\(_(`q(b(q(\(q( \(!q("\(#q(%q(&\('q((\()q(*\(+q(,\(-q(.\(/q(0\(1q(2\(3q(4\(6q(8q(:q(8@8C8D8F8G8H8J88 8W8X8Y8_8`8b8888 8!8"8#8%8&8'8(8)8*8+8,8-8.8/808182838486888:8<8@8B8D8I8J8K8L8M8N8O8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8b8d8f8h8j8l8n9R9 R999")9R99 R9 :::"):$:&:*:2:4:D:F:G:H:J:P:Q:R:S:T:U:V:X:]:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::!:+:-:/:1:3:5:<:>:@:C:D:F:G:H:J:: :W:X:Y:_:`:b:::: :!:":#:%:&:':(:):*:+:,:-:.:/:0:1:2:3:4:6:8:::<:@:B:D:I:J:K:L:M:N:O:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:^:_:`:b:d:f:h:j:l:n;&;*;2;4;;;;;;;;;;;;;;;;;;;;G;_;I;K;M;O;Q;S;U;W;Y;[;];_=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_?&?*?2?4????????????????????G?_?I?K?M?O?Q?S?U?W?Y?[?]?_CqC qC&C*C- C2C4C7qC9C:C<CCCCCCCCCCCCCCCCCCCCC$qC&qC6C8C:CGCCCCCqC qC_CICKCMCOCQCSCUCWCYC[C]C_CoCqCsCqDD DD E-{GGG$G7G9G:G;G<G=GGGGGGGGGGG$G&G6G8G:G;G=G?GCGGGGGGG GXGGG!G#G%G'G)G+G-G/G1G3GoGqGsGVqV qVfVmVqqVrVsVuVxVqV qVT[[[V[_[b[d[i[p[q[r[t[u[x[[[ [T\\\V\_\b\f\i\m\s\v\y\z\{\|\}\~\\\\\\\\\\\\\\\\\\\\ \!]q]r]x]T^^ ^^ _q_ q_f_m_qq_r_s_u_x_q_ q_T```V`_`b`i`t`` aaaaV\a_\ab\afai\amasavayqaza{a|a}a~qaaaaaaaaaqaaqaqaaqaaaaaqaaaaaaa a!aSbqb qbfbmbqqbrbsbubxbqb qbTdfdmdsfffVf_fbfdfifpfqfrftfufxfff fThfhmhshhiqi qifimiqqirisiuixiqi qiTmmmVm_mbmdmimpmqmrmtmumxmmm mToooVo_obodoiotooo qqqqV\q_\qb\qfqi\qmqsqvqyqqzq{q|q}q~qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq q!qSrrrVr_rbrfrirmrsrvryrzr{r|r}r~rrrrrrrrrrrrrrrrrrrr r!sssVs_sbsdsispsqsrstsxsss sTtftmtsttuuuVu_ubufuiumuu vqvrvxvTxxxVx_xbxfxixmxsxvxyxzx{x|x}x~xxxxxxxxxxxxxxxxxxxx x!y){{ {{ || |||| ~) y~     y~ y~         y~       n| q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqql~    n|   n|   n| l|~  qff jlrqs~ffqqq q  q q qqq qn|q qq  r|  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq)l|~    l|~   rsz|  rsv  l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqqqff jlrqs~ffqqq q  q  rsz l|~  ))  n|   n|  rsz|  rsz|   ) js      j  )j       js   s  j        m  m         js    m  m  j   sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R 7$&q7$&q7$&q$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q                        q  q  q                             ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q    q    q    q q  q   !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) & * 2 4 7q 8 9 : <                         $q &q * , . 0 2 4 6 8 : G f m qq r s u x  q  q   q  \ q        T _ a l |\ ~        q    q    q  \  \    \     \        q  I K M O Q S U W Y [ ] _ a c e g i k m o q s q!q!r!x!TSSSS TTTVT_TbTfTiTmTsTvTyTzT{T|T}T~TTTTTTTTTTTTTTTTTTTT T!XqX qX&X*X- X2X4X7qX9X:X<XXXXXXXXXXXXXXXXXXXXX$qX&qX6X8X:XGXXXXXqX qX_XIXKXMXOXQXSXUXWXYX[X]X_XoXqXsXqYY YY ZZZVZ_ZbZdZiZpZqZrZtZuZxZZZ ZT`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`RbIfbWfbYfbZfb[fb\fbfb%fb'fb7fbfbfb4fb5fb]fb^fbpfbfbfjj jj llllllllllllllllllllll lrlslzl|lllllllllllllllllllllllllllll llllllmmmmmmm msmmmnn nnnnnnnnn n|nnnnnnnnnnnnnnn nnnoo ooooooooo omooooooooooooooooooooooooooopppppplp~ppppppppppppppppp p ppprqr qrrrqrrrrrrrqr qrnr|rrrrrrrrqrrrrrrrrrrrrrrrrrrr qrrqrrrsqs qssssssssssssqs qsjsms}sssssssssssssssssssssssssssss s ssssstqt qtttqtttttttqt qtnt|ttttttttqttttttttttttttttttt qttqtttuqu quuuuuuuuuuuuqu qujumu}uuuuuuuuuuuuuuuuuuuuuuuuuuuuu u uuuuuv vx xzzzz zzzzz z|q|q||||||||q| q|r|s|||||| | ||||}} }}}}}}}}} }}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~ ~r~s~z~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~  qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  s s s rsz|    rsz|    rsz|  sl~  )    |   m rsv    )))))) jklqrsuwy}~)))))    ) js   f |   l{=}~j    )l{=}~j  l|~  j  l|~  j  l|~  j  )  )))))) jklqrsuwy}~)))))    ) js  \ \fH\ \|qqH HHq qq qmqq   l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )) jklqrsuwy}~))     s)) jklqrsuwy}~))     sl{=}~j  )  )    |         l|~  j   f m| )  )  )  q qqq qn|q qq  q qqq qn|q qq       rsz|    rsz|   l|~  j    )   rsz|    rsz|    rsz|    rsz|   qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )))))) jklqrsuwy}~)))))    ) js  l{=}~j  l|~  j          q             r v |       q                                                                           q             r v |       q                                      )   q rv|q    q rv|q    r    r|   )  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq     !q! q!&!*!- !2!4!7q!9!:!<!!!!!!!!!!!!!!!!!!!!!$q!&q!6!8!:!G!!!!!q! q!_!I!K!M!O!Q!S!U!W!Y![!]!_!o!q!s!q"" "" #q# q#&#*#- #2#4#7q#9#:#<#####################$q#&q#6#8#:#G#####q# q#_#I#K#M#O#Q#S#U#W#Y#[#]#_#o#q#s#q$$ $$ %q% q%&%*%- %2%4%7q%9%:%<%%%%%%%%%%%%%%%%%%%%%$q%&q%6%8%:%G%%%%%q% q%_%I%K%M%O%Q%S%U%W%Y%[%]%_%o%q%s%q&& && 'q' q'&'*'- '2'4'7q'9':'<'''''''''''''''''''''$q'&q'6'8':'G'''''q' q'_'I'K'M'O'Q'S'U'W'Y'[']'_'o'q's'q(( (( )q) q)&)*)- )2)4)7q)9):)<)))))))))))))))))))))$q)&q)6)8):)G)))))q) q)_)I)K)M)O)Q)S)U)W)Y)[)])_)o)q)s)q** ** +q+ q+&+*+- +2+4+7q+9+:+<+++++++++++++++++++++$q+&q+6+8+:+G+++++q+ q+_+I+K+M+O+Q+S+U+W+Y+[+]+_+o+q+s+q,, ,, -q- q-&-*-- -2-4-7q-9-:-<---------------------$q-&q-6-8-:-G-----q- q-_-I-K-M-O-Q-S-U-W-Y-[-]-_-o-q-s-q.. .. /q/ q/&/*/- /2/4/7q/9/:/</////////////////////$q/&q/6/8/:/G/////q/ q/_/I/K/M/O/Q/S/U/W/Y/[/]/_/o/q/s/q00 00 1q1 q1&1*1- 121417q191:1<111111111111111111111$q1&q16181:1G11111q1 q1_1I1K1M1O1Q1S1U1W1Y1[1]1_1o1q1s1q22 22 3q3 q3&3*3- 323437q393:3<333333333333333333333$q3&q36383:3G33333q3 q3_3I3K3M3O3Q3S3U3W3Y3[3]3_3o3q3s3q44 44 5-{66 6Y6Z6[6\6]6676<6>6@6666 6p7-{88 8Y8Z8[8\8]8878<8>8@8888 8p9-{:: :Y:Z:[:\:]::7:<:>:@:::: :p;-{<< <Y<Z<[<\<]<<7<<<><@<<<< <p=-{>> >Y>Z>[>\>]>>7><>>>@>>>> >p?-{@@ @Y@Z@[@\@]@@7@<@>@@@@@@ @pA-{BB BYBZB[B\B]BB7B<B>B@BBBB BpC-{DD DYDZD[D\D]DD7D<D>D@DDDD DpIII$I7I9I:I;I<I=IIIIIIIIIII$I&I6I8I:I;I=I?ICIIIIIII IXIII!I#I%I'I)I+I-I/I1I3IoIqIsIJJ JYJZJ[J\J]JJ7J<J>J@JJJJ JpKKK$K7K9K:K;K<K=KKKKKKKKKKK$K&K6K8K:K;K=K?KCKKKKKKK KXKKK!K#K%K'K)K+K-K/K1K3KoKqKsKLL LYLZL[L\L]LL7L<L>L@LLLL LpMMM$M7M9M:M;M<M=MMMMMMMMMMM$M&M6M8M:M;M=M?MCMMMMMMM MXMMM!M#M%M'M)M+M-M/M1M3MoMqMsMOOO$O7O9O:O;O<O=OOOOOOOOOOO$O&O6O8O:O;O=O?OCOOOOOOO OXOOO!O#O%O'O)O+O-O/O1O3OoOqOsOQQQ$Q7Q9Q:Q;Q<Q=QQQQQQQQQQQ$Q&Q6Q8Q:Q;Q=Q?QCQQQQQQQ QXQQQ!Q#Q%Q'Q)Q+Q-Q/Q1Q3QoQqQsQSSS$S7S9S:S;S<S=SSSSSSSSSSS$S&S6S8S:S;S=S?SCSSSSSSS SXSSS!S#S%S'S)S+S-S/S1S3SoSqSsSUUU$U7U9U:U;U<U=UUUUUUUUUUU$U&U6U8U:U;U=U?UCUUUUUUU UXUUU!U#U%U'U)U+U-U/U1U3UoUqUsUXIRXWRXYfXZfX[fX\fXfX%RX'RX7fXfXfX4RX5RX]RX^RXpfXRXRZIRZWRZYfZZfZ[fZ\fZfZ%RZ'RZ7fZfZfZ4RZ5RZ]RZ^RZpfZRZR\IR\WR\Yf\Zf\[f\\f\f\%R\'R\7f\f\f\4R\5R\]R\^R\pf\R\R^IR^WR^Yf^Zf^[f^\f^f^%R^'R^7f^f^f^4R^5R^]R^^R^pf^R^R`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`Raaa$aaaaaaaaaaCaa aXaaa!a#a%a'a)a+a-a/a1a3fIffWffYffZff[ff\ffff%ff'ff7ffffff4ff5ff]ff^ffpfffffhIfhWfhYfhZfh[fh\fhfh%fh'fh7fhfhfh4fh5fh]fh^fhpfhfhfjIfjWfjYfjZfj[fj\fjfj%fj'fj7fjfjfj4fj5fj]fj^fjpfjfjflIflWflYflZfl[fl\flfl%fl'fl7flflfl4fl5fl]fl^flpflflfnIfnWfnYfnZfn[fn\fnfn%fn'fn7fnfnfn4fn5fn]fn^fnpfnfnfooo")o$o&o*o2o4oDoFoGoHoJoPoQoRoSoToUoVoXo]oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooo!o+o-o/o1o3o5o<o>o@oCoDoFoGoHoJoo oWoXoYo_o`oboooo o!o"o#o%o&o'o(o)o*o+o,o-o.o/o0o1o2o3o4o6o8o:o<o@oBoDoIoJoKoLoMoNoOoQoRoSoToUoVoWoXoYoZo[o\o]o^o_o`obodofohojolonpRp Rppp")pRpp Rp qqq")q$q&q*q2q4qDqFqGqHqJqPqQqRqSqTqUqVqXq]qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqq!q+q-q/q1q3q5q<q>q@qCqDqFqGqHqJqq qWqXqYq_q`qbqqqq q!q"q#q%q&q'q(q)q*q+q,q-q.q/q0q1q2q3q4q6q8q:q<q@qBqDqIqJqKqLqMqNqOqQqRqSqTqUqVqWqXqYqZq[q\q]q^q_q`qbqdqfqhqjqlqnrRr Rrrr")rRrr Rr sss")s$s&s*s2s4sDsFsGsHsJsPsQsRsSsTsUsVsXs]ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssss!s+s-s/s1s3s5s<s>s@sCsDsFsGsHsJss sWsXsYs_s`sbssss s!s"s#s%s&s's(s)s*s+s,s-s.s/s0s1s2s3s4s6s8s:s<s@sBsDsIsJsKsLsMsNsOsQsRsSsTsUsVsWsXsYsZs[s\s]s^s_s`sbsdsfshsjslsntRt Rttt")tRtt Rt { {{ {")$q&*247)D\FqGqHqJqPQRqSTqUVXYZ[\]qqqqqqq\\\\\\qqqqqqqqqqqq\q\q\qqqqqqqqqqqqqqq qqqq!$)&)+-/1357<>@CqD\F\GHqJ WXqY\_`qbq\q \!q"\#q%q&\'q(\)q*\+q,\-q.\/q0\1q2\3q4\6q8q:q?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~.notdefnullnonmarkingreturnspaceexclamquotedbl numbersigndollarpercent ampersand quotesingle parenleft parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon semicolonlessequalgreaterquestionatABCDEFGHI.altJKLMNOPQRSTUVWXYZ bracketleft backslash bracketright asciicircum underscoregraveabcdefghijklmnopqrstuvwxyz braceleftbar braceright asciitildenonbreakingspace exclamdowncentsterlingcurrencyyen brokenbarsectiondieresis copyright ordfeminine guillemotleft logicalnotuni00AD registered overscoredegree plusminus twosuperior threesuperioracutemu paragraphperiodcenteredcedilla onesuperior ordmasculineguillemotright onequarteronehalf threequarters questiondownAgraveAacute AcircumflexAtilde AdieresisAringAECcedillaEgraveEacute Ecircumflex Edieresis Igrave.alt Iacute.altIcircumflex.alt Idieresis.altEthNtildeOgraveOacute OcircumflexOtilde OdieresismultiplyOslashUgraveUacute Ucircumflex UdieresisYacuteThorn germandblsagraveaacute acircumflexatilde adieresisaringaeccedillaegraveeacute ecircumflex edieresisigraveiacute icircumflex idieresisethntildeograveoacute ocircumflexotilde odieresisdivideoslashugraveuacute ucircumflex udieresisyacutethorn ydieresisAmacronamacronAbreveabreveAogonekaogonekCacutecacute Ccircumflex ccircumflexCdotcdotCcaronccaronDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflexGbrevegbreveGdotgdot Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbar Itilde.altitilde Imacron.altimacron Ibreve.altibreve Iogonek.altiogonekIdotaccent.altdotlessiIJ.altij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotLslashlslashNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautOEoeRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexScedillascedillaScaronscaron Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflex YdieresisZacutezacute Zdotaccent zdotaccentZcaronzcaronlongsflorin Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccent circumflexcaronmacronbreve dotaccentringogonektilde hungarumlauttonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos.alt Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIota.altKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9Iotadieresis.altUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronpirhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055.alt afii10056.alt afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveendashemdash afii00208 underscoredbl quoteleft quoterightquotesinglbase quotereversed quotedblleft quotedblright quotedblbasedagger daggerdblbulletellipsis perthousandminutesecond guilsinglleftguilsinglright exclamdblfraction nsuperiorfranc afii08941pesetaEuro afii61248 afii61289 afii61352 trademarkOmega estimated oneeighth threeeighths fiveeighths seveneighths partialdiffDeltaproduct summationminusradicalinfinityintegral approxequalnotequal lessequal greaterequallozengeuniFB01uniFB02 cyrillicbrevedotlessjcaroncommaaccent commaaccentcommaaccentrotate zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperioruni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200BuniFEFFuniFFFCuniFFFDuni01F0uni02BCuni03D1uni03D2uni03D6uni1E3Euni1E3Funi1E00uni1E01uni1F4Duni02F3 dasiaoxiauniFB03uniFB04OhornohornUhornuhornuni0300uni0301uni0303hookdotbelowuni0400uni040Duni0450uni045Duni0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BF uni04C0.altuni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CE uni04CF.altuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7 uni1EC8.altuni1EC9 uni1ECA.altuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1uni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni20ABuni030Fcircumflexacutecombcircumflexgravecombcircumflexhookcombcircumflextildecombbreveacutecombbrevegravecomb brevehookcombbrevetildecombcyrillichookleftcyrillicbighookUCcyrillicbighookLCone.pnumzero.osone.ostwo.osthree.osfour.osfive.ossix.osseven.oseight.osnine.osffuni2120Tcedillatcedillag.altgcircumflex.alt gbreve.altgdot.altgcommaaccent.altIIgraveIacute Icircumflex IdieresisItildeImacronIbreveIogonek IdotaccentIJ IotatonosIota Iotadieresis afii10055 afii10056uni04C0uni04CFuni1EC8uni1ECA   46latnMOL ROM  nlatnMOL (ROM B      ligaligaligalnumlnumlnumloclloclonumonumonumpnumpnumpnumsalt saltsaltss01"ss01*ss012ss02:ss02@ss02Fss03Lss03Rss03Xtnum^tnumftnumn    &.6>FNV^Pz2HJJ.,ZgwEG      !$%IJ6 "(^IO]ILI5O4LI^V0R *H C0?1 0 +0a +7S0Q0, +7<<<Obsolete>>>0!0 + έX[;&*렂]0z0b8%a&Z0  *H 0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0 070615000000Z 120614235959Z0\1 0 UUS10U VeriSign, Inc.1402U+VeriSign Time Stamping Services Signer - G200  *H 0ĵR`)J[/Kk5TX56^bMRQ4q{f*j 7٘tvJcEG.k NK+XJ,XB-uލǎlLgrIž`<cxi{-004+(0&0$+0http://ocsp.verisign.com0 U003U,0*0(&$"http://crl.verisign.com/tss-ca.crl0U% 0 +0U0U0010 UTSA1-20  *H PK$ $- 7 ,Za񑑳V@뒾89u6t:O7ʕBǠWdB5N3M'L8MxSݤ^ ⥾`߭(ǥKd[98"3/!?DA e$HDT\y>]r},CS}=*:Om ]^SWp`+nx'4[^I2300-GߍRFCmH 10  *H 01 0 UZA10U Western Cape10U Durbanville10 U Thawte10U Thawte Certification10UThawte Timestamping CA0 031204000000Z 131203235959Z0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0"0  *H 0 ʲ }uNgadڻ30X~k6xw~o< hlʽR-H=]_/kLR`@~ ?Ǵ߇_zj1.G 1s W-x43h/Š*Ë!fXWou<&]'x1"ijGC_^|}bM "Vͮv M٠h;004+(0&0$+0http://ocsp.verisign.com0U00AU:0806420http://crl.verisign.com/ThawteTimestampingCA.crl0U% 0 +0U0$U0010U TSA2048-1-530  *H JkXD1y+LͰXn)^ʓR G'/8ɓN"b?7!Op18UN$ҩ'NzaA*^ݻ+>W~ +;R8'?J00eeR&.Y)"\0  *H 0_1 0 UUS10U VeriSign, Inc.1705U .Class 3 Public Primary Certification Authority0 090521000000Z 190520235959Z01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0"0  *H 0 g`IoV|f^ q-!ќPL"5; .Z|=;%X{ ξ'tag'MjaXy'M4+G Df$fO8TrfujIh8y 0,`Hת809:|@T/ܨR>+!\ P4.M^%Ԍn|)]1ZՌgX5+!`x^{`W ]A cT`C!00U00pU i0g0e `HE0V0(+https://www.verisign.com/cps0*+0https://www.verisign.com/rpa0U0m+ a0_][0Y0W0U image/gif0!00+kπjH,{.0%#http://logo.verisign.com/vslogo.gif0U%0++04+(0&0$+0http://ocsp.verisign.com01U*0(0&$" http://crl.verisign.com/pca3.crl0)U"0 010UClass3CA2048-1-550Uk&pȡ?-50  *H ݔAaix0Ɛ<~B$s/DrPU nQj71ܥ-OM2NgUejzd8xEv1z`³]fvYI8VAwX00fgymPSo0  *H 01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0 100729000000Z 120808235959Z01 0 UUS10U Massachusetts10 UWoburn10U Monotype Imaging Inc.1>0<U 5Digital ID Class 3 - Microsoft Software Validation v210U Type Operations10UMonotype Imaging Inc.00  *H 0Di|U 25L3^ L*8ט@I "SOCʋVnH9c;$5}rGWyˊJ@p-5cįפ {uePd"}KXEMYLM00 U00U0DU=0;09753http://csc3-2009-2-crl.verisign.com/CSC3-2009-2.crl0DU =0;09 `HE0*0(+https://www.verisign.com/rpa0U% 0 +0u+i0g0$+0http://ocsp.verisign.com0?+03http://csc3-2009-2-aia.verisign.com/CSC3-2009-2.cer0U#0k&pȡ?-50 `HB0 +700  *H N"gA~™cjrb<8=_G_[KI  VD 5< D`E*oL;4gpZ9\Zl5|eKmIp=b۴A~}n"w6MZ S1+(RzkwD ]%,͊0>KyʦN $ 񺐶\<'M'Yhް= nWAmzv("住K6,`'\K?n}鯕^FրcԣhDʝi͞zQn 3SB0|0{ *H  1l0h0g0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA8%a&Z0 +]0 *H  1  *H 0 *H  1 110505165510Z0# *H  1~-X `Ҏۅd0  *H CNENj㦈z C| rSRPfE᫒׋Ajz d55e+KX՟h`cmap)/hcvt Mfpgm~agasp#7lglyft8K%/headv<6hhea st$hmtx5<kernT+ ~U@6loca)4VmaxpC  names xpostCl@&+prepC !__< 51LL b  { V/\33f @ [(1ASC@ X H #5+3hq^R^=jVh?T!fd^+u^hj!!?hwho1y/ }s!}T#`'9;};}djmh{R3V1s^ss}sb'3qssDj91'R=hHh#?{h!{5dFRhTdmh1!=q!%LBP=K=.=o3 }ssss<T</;};};};};};}{s^s^s^s^s^s^^s}s}s}s}sqssssshss^s^s^ }s }s }s }ss/ss}ss}ss}ss}ss}s}b'}b'}b'}b'*T5TT #`3%''Y''/s;}s;}s;}sb}qDD`Ddjjdjjdjjdjjmmmh9{{RRRRRRs^^;}sdjj  -%o%!}/)'sR;}T9mH;}Jm{bj^mBP<{sZs qZss%FVqs3sss^/s s/ss)}djT<#`o/)wsJ9;} }mbjBD% =f3s^wm)}sD'ss)q1'-))9q%}smsj'7mh9h9h9{RRRJ\\?\={{F d%oRoP y'mbD?)w'5%BPf=G= =G=jf' Lhd%w bhhhoq';)93#Vy!TT\ 9qs^Ru3uu=}s%RS ;s}sfZm ^!# ?^m=}s  }}s}Bs}ws^}sju)))%/7/m#3=JDJ\D/#)/;}s }sm){{V')=F3=F3Td9;Ts^s^^s}suyfuyfJDJ;}s=}s=}s =97m)7/mR'1's1+s;NjPN/PN }s-)oZs^s^s^s-s^s^s^s^s^s^s^s^s}ss}ss}ss}ss]}Js}ss}ss}sT{T;}s;}s;}s;}a;}s;}s;}s=}s=}s=}s=}s=}s%R%R%R%R%R{{{sqqhyyyh1-4s-)^u^hjmZ\mqqqqq;;;;;;;;;V;^; 0HI~'2a7 # O_?M   " & 0 3 : < D p y  !!!! !"!&!.!^"""""""+"H"`"e% IJ(3b7 #P`>M   & 0 2 9 < D p t  !!!! !"!&!.!["""""""+"H"`"d%aIvhcb]gD Xz}} Bvt n%"iOS0L\pr`<&'()*+,-./0123456789:;<=>?@AIJ$%TUVWXY\]^_`abcdefhijklmnopqrstuvhijkFopqrstu45]^@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-@ !H U UHU?MK&LK3KF%&4U%3$UJI3IF%3UU3U?GFF#3"U3U3UU3UOU3UoTS++KRK P[%S@QZUZ[XYBK2SX YKdSXBYss++^stu+++++t+st+++++++++++++st+++^NuHQw{jA_t[F4DdA  U  9 l  V , y $ K 6Or$yT(f'O(hGKSGcEl{+7HYj|*;L]n  * ; L ^ o !!(!8!H!X!i!z"""!"1"A"R"c"t"""###/#?#O#`#$ $$,$<$M$]$$$$$%%%%0%@%Q%a%r%%%%%%&:&K&[&l&|&&&&&&&&' ''*';'G'W'h'y'("(3(D(U(f(w(((((((()) ))L)])n)y))))))*-*>*N*Z*e*v***+'+8+H+Y+i+{++,i,z,,,,,,,,----.->-I-T-e-u-...%.6.F.W.g.y........///+/;/L/]/n/~//0w11'181I1Y1d1o111122T2{2233N3_3g3x33333333444"4*4244444455525:5q5y5556<666666677k788g899L999:,:4:_::;;\;;<%<]<==_=====> >>o>>>>>>?S???@@7@?@@@@@A,AAABBVcVVVW2WbWX,X>XPX}XXXXYY!Y@YuYYZMZnZ['['['['['['['['['['['['['['\q\\\]l]^ ^^-^9^E^W^^^^_@__`1`:`C`L`z`````aNaab;bbc?ccd,ddeiefg0g8g@ggh/hghyhii iijk;kl:l}lmm3m`mmnooop1ppqCq{qrrUrrsssPssttXttuu]uuvvsvwBwwwxx4xPbtӋ -BVbnÌՌ /AVj{͍ލ&8J\nɎَ (4@L]nҏ #4EVfrj‘2{͒;DNޔ nzqǖؖ .?J[gyΗ /2/3/3/310!!7!!IhyJh+@   OY ??+9/933310#3432#"&Fi3x:?@94D#FB@G?@  ?32993310#!#?(i)+)h)3@U     !  ! NY NYO O   /3?399//]]33+3333+339939939939223910!!#!#!5!!5!3!3!!!BTTRPD+RR1TT/BRRTLLT  &-f@5'%* ! ./%  MY$*LY*+MY*//99//92+33+33+3933333333310#5"&'53&&546753&'4&'6 ̷pCSYͥ˧4JYZocf#%/AE; N2_{eHY,{L\)]h- !-1E@$ ("".( 023 + + +010%?3?3??99//33933331032#"#"&5463232654&#"#"&54632#JSSJʙJTTPPTTJ˙Փ+TR۫ Jq 5Q@0#*+.+-#& 673 IY3'-0/&** / JY ?+?9/99?+93333106654&#"27%467.546326673#'#"&HWegVYoKo\,U=$į8CD+vE}XKSMa`DYfAuf_bj9k]y>cݲj\??9310#?(i)R! @   '??99331073#&R1 ή26=  @    '??993310#654'3 1:1V0@    ?29333910%'%7++uo^j^Foh) (@  PY/]3+3933310!!#!5!3dfV?m /9910%#67^b5}A drh2\T?q/399105!T٘ @  OY ?+931074632#"&=9:AB93CjCEECAF???9910#ߦ!Jf- (@  KY KY?+?+993310#"3232#"-ᖤr~r~';;% $@    ??9/9993310!#47'3ˢ4Xt.r+d%+@ KYLY?+?+93310!!5>54&#"'632!%?p8~[dXSu+8% =1*"% BC55FY;GY "***GY*(?GY(.GY?+?+?+99//99++993333310#"'332!"&5467&&5467&&5463232654&##"3254#"1,1+jJZ²t*9@EUkVEnq~Ztu~Hi#qG8U-+dP59UlKHDJA,>85GF4@  GY@FY?+?+393310%267# #5773!!,Ri*F`>^u  OPE{cj9H4@   FY ??+?393993331032653#'##"&5Lz 3tH9@QVH @   ??399910!3363`P u̲`HvD5M0#H,@    ?3?339933339910!&'##3366733663/4(ծjo 1ɴ8#;ѯ_HcPK95uu$'H "@  ?3?39991033##! ʼ1\DH$@  FY ?2?+991033663#"'53277O S)FLJ7DI=H_3|  RmH +@ GYGY?+?+93310!!5!5!!mV]qV=,@  '??933333310%&&54ᘡ463uq~xtض f\/hY\`2' '{@ ??93103#H,@ '??933333310&54'52"5665467 vz~;otnq?''a[Yhљ\f)rxhP)T$@ PYPY/+/+9910"56323267#"&'&&R56dDqYBb/66fH~HKZC6m&@9n! ^+@  OY "??+9/9333103##"&54632i3y<@      ??99//333393333310%#5&5%53&#"327iK11m6 >!3;?DH@&   NY LYKY?+?+9/3+393333102&#"!!!!5655#5346={}ZAJTM|d,/<{' @ "()%/33/399331047'76327'#"''7&732654&#"J^hf_JJ\fd\Jttrtzk\II\qvg\GI\k|pqrqV@.        ??399//]9223333933333103!!!!#!5!5!5!3H{`=ä<e {$@ ??99//9333103#3# {1=C@&2*8 #>?;6-! !'GY! GY ?+?+99333310467&&54632&&#"#"'532654&&'.7654&'VNJT^a5bLtt{RJڀNR0lsB1DU)V%(oUy'';@54&#"'632!YR!P?4bEBYJhVaL6DE&2XopP!9#9@" $%]mL ! !?3?39/]]]39310#"'53254##532654&#"'6632sRDt{uwgcPCBp8E?^Pg/8{DkOD=D+#Z-6w!    /99106673#0o ,@o>AA4DH5@  FY  ??+??399333331032653#'##"'##3V oX }@\T4q`'@ /3?39/93310####"&563!`rs>T-P3LZ @   OY/+93104632#"&>8:AB93CBEEBAF?%$@ /29/393310#"'532654&'733--;OQOmXn7aj j(6+5s'LJ @  ?2?9/9933103#47'R6CC[Z-_`B %@  ?3]2993310#"&5463232654&#"[hi\\ig\ozzzz{vvPu #@   /3/393310'7'7uuXuuuX iG_^EiiG_^EiK'&{< ?55.'?&{tN?5!&u'<m +?553wT^(A@"##)* && OY& IY#?+?+9/_^]9333103267#"&54>76655#"&54632NKay=zPb;ƾ#@Y6eAy;>B73F3zTjKM8dq&0`FiYR/Xt]+EB@G@s&$CR&+5s&$vR&+5s&$K#R&+5/&$RR&+5%&$j7R $&+55&$P9N@,   IYIY IY  IY?+??99//+++33933310!!!#!!!!!!#DTv/)}&&zs&(CR &+5s&(v?R&+5s&(KR&+5%&(jR !&+55<Vs&,CR &+5Tss&,vaR&+5s&,KR&+5<o%&,jR !&+55/H W@2 IY?  JY JY?+?+9/_^]3+39333310!!#53! !#!!3 Hw{Q|{b@ ?/&1RR&+5}s&2CyR&+5}s&2v R!&+5}s&2KR&&+5}/&2RR!&+5}%&2jR -&+55  @    /993310'7`^`e^dacc_c``e}#N@,  $%! !IY IY?+?9+99933910!"''7&!27'32&#"exl`Dѝaxjn`s'ejndOme^PLR2*Is&8CFR&+5s&8vR&+5s&8K}R &+5%&8jR '&+55{s&<v1R&+5y 6@  JY JY ??99//++99333310!##33 32654&##yḪʾꏤ0A@")*# *12*..&FY.*FY?+??+9/9333310#"'53254&'&&54676654&# #4632X8GNf³k?HSn`EGK@sFC! *93_eE'/KkFR{T?j59Z5PUL^!&DC&&+5^!&Dv+.&+5^!&DK3&+5^&DR.&+5^&Dj :&+55^&DP (&+55^s\)4;a@3*$08090 <=-'-FY11GY8$'"'5FY?3+3?39/993+3+39333399310467754&#"'66326632!!267# '#"&732655"!4&^tw4Jb)5nC:[TVe}QņkXy /D{T)5W_X`ku#'&!j_Ycm2s\&FzFs!&HC&+5s!&HvN$&+5s!&HK)&+5s&Hj 0&+55c!&CQ&+52!&v  &+5U!&K&+5&j &+55qb!&J@+!  '( FY  $FY?+?39/99+933310#"54327&''7&'774&# 326bd9I\^EfLϘ3 yֿl>1uIKkwr蓪D&QR&+5sb!&RC&+5sb!&RvV"&+5sb!&RK'&+5sb&RR"&+5sb&Rj .&+55h)3@  PY/+3/33/39333105!4632#"&4632#"&h;64:;34=;64:;34=<=?:9@?<=?:9@?sb#K@)  $%! FY !FY?+?9+999339910#"''7&327&#"4'326bpTr^ tTua5Kr3/Gq%EuN +LwLf5Ԥd}39!&XC&+59!&Xvq&+59!&XK#&+59&Xj! *&+55!&\v&+5u">@ $#   FY FY?+?+99??993333106632#"'##3%"3 4&XBjz H/YOӡ"M?5.4Z)&\j +&+55&$M?R&+5^b&DM(&+57&$N+R&+5^&DN%&+5B&$Q^BZ&DQ}s&&vR &+5s!&FvD &+5}s&&KR%&+5s!&FK%&+5}1&&OR &+5s&FOP &+5}s&&LR"&+5s!&FL"&+5Xs&'LXR&+5s&G8 #?5/Hs'd@7%()GY/    "FY FY?+?+99?9/_^]3+3?933333310%##"323&55!5!533##%26554&#" sw @&,SI%w#&(MR&+5sb&HM &+57&(NR &+5s&HN&+5&(Oo5&+5s&HOT$&+5B&(Qssa\&HQfs&(LR&+5s!&HL&&+5}=s&*KR*&+5'1!&JKP&+5}=7&*NR&+5'1&JNB&+5}=1&*OdR%&+5'1&JOK&+5};=&*9''1!&J:DF&+5s&+KR&+5D&KK%&+5T@,   IY JY ?3?399//33+33+9333333331053!533##!##55!ɪȪuP1DY@2   FY GY   /    ?3?9///]3+3+3933333310!4&#"##5353!!36632z? 1tT8O[\/&,RR&+5x&R &+5*&,MR&+52b&M&+57&,NR &+58&N&+5TBV&,Qh5B&LQTV1&,OPR&+5VH@ ??9310!#3VHT&,-l&LM`es&-KR&+5O!&7K&+5;&.9;&N9+F /@   ?3?399333103##3/b FqyFqs&/vcR&+5,&Ov &+5;&/91Y;W&O9&/8 ?5&O8+?5&/Og&OOB8 =@!     IY?+?99//99333103'73%!iC)C;reFy<' 7@      ??99//9339333107#'73VHѦnF`^p?THqw ?s&1vR&+5D!&Qvy&+5;?&19;D\&Q9V?s&1LR&+5D!&QL &+5'Q?5?8@  IY"?+??3999333310"'53265##33&53b6GSijzoN=XD\8@ FYFY?+??9?+933310"'53254&#"#336632%V7<>z 4nnjyHRX}&2MR&+5sbb&RM&+5}7&2NR&+5sb&RN&+5}s&2SR +&+55sb!&RSZ ,&+55}S@.  !IY IY  IY IYIY?+?+?+?+9/+933310!!# !2!!!!!"327&f\\@fZ'MDpWWjh)!uqZ*1U@-%/%23+( (FY.FY .. ""FY?3+3?39/99++393399310 '#"326632!!26732654&#"%"!4&}>щ>:~'J^WX!G  tw1 ,wrpyiw#'' 9ؤs&5vyR&+5'!&Uv&+5;&59}`;'\&U9s&5LR!&+5'!&ULv&+5js&6vPR.&+5js!&Vv.&+5js&6KR3&+5js!&VK3&+5j&6z'js\&Vzjs&6LR0&+5js!&VL0&+5;Z&79;F&W9Zs&7LR&+5&W8b?5Z?@!   JY IY?+3?9/3+3933310!5!!!!#!51H16ʪ/^FL@)  GY GY @FY?+?9/3+3+39333310%27# 5#53#5773!!!!U< j*ȍF`>-u\PE/&8RoR&+59&XR&+5&8MR&+59b&XM&+57&8NR&+59&XN&+5&8PR &+559&XP# &+55s&8SR %&+559!&XSh (&+55B&8Q!BeH&XQLs&:KTR(&+5#!&ZK+&+5{s&<KR&+5!&\K$&+5{%&<jR &+55R?s&=vBR&+5Rm!&]v&+5R?1&=ODR&+5Rm&]O&+5R?s&=LR&+5Rm!&]L&+5 @  FY??+39310!#!2&#"Vg`d+WIaY%{z D@$  !" FY FYFY?+?+9/3+3933310"'53265#5754632&#"!!HE@F=_MޢUxfy! @    /329106673#%6673#$n%:ae1e%:`0E?0D:?0s   /99106673#5 m1dHRJL +@  !"   /399//393310673#'4632#"&%4632#"&A!y3P4&)17#&44&)17#&4C=4.4.21124.4.211 &$T ?5LZyu &(}T?5 '+T?5D ',T?5 &2DT?5 '< T ?53 &v?T#?5&U .&+555$%@IY??+99310!#{'m((R?=+}?@   IY IY IY?+?+9/+99339910!!%! ! 32#"u`D;bs3?nhep0,*.TV,. @   ?3?99910!#&'#3ӶW!GZ^q0?1H% 4@  IY  IY IY?+?+9/+910!!!!!5Ru#Hy}2 #@ IY?3?+993310!#!#! Ch3J\ 5@   IY IY?+?+3933310355!!'!J+\`To+Z7{<j"+P@)' +,- **JY"$$JY??99//3+3+339333333310332###5#"$54663332654&+"33۬F)-Cι:9˴EùԷ;m>@  IY ??339/3+393333310!##"&&5333332653##-ϰ-z!dƻ{P9@    !IY  IY?3+333?+93310"!5!&5! !!5654!lb:;bk5v^6`xN<o%&,jR !&+55{%&<jR &+55ss&~T4&+5Zs&T/&+5Ds&T;&+5s&T&+5q&U; 4&+555s\ *G@$ '"+,'(( FY FY$ ?3+3?+993?9333310%26554&# "323673327#"&'#Pѓy6 )T!.AQY ;wPԋ) )TT\8BtIr wQVVQ)L@('"*+#"FY## FY FY?+?+99//+?93333102#"&'#46"32654&##532654&ymO䞝]Vp\з3*&41%{ H!@ ??39/3910#4733>3@+?^)+k05`&r,OBGo[sұsJ5٠Z\%M@+# &'%%FY%% %% !FY FY ?+?+9/_^]+993310# 3267#"&54675&&54632&&#"!˔ɓTdnbkad?^O=Zb'/Kb) \!-*so 0@!"#FY?+33?9333105!#654&'&&54>7!;}}o˼;p(ߦbvI%m[k8=$rD\/@   FY  ???9?+99333104&#"#336632z3qHQYIsJ+ I@'FY  FY  FY?+?+9/_^]+99333310#"322!"!Jy   jvk13)H@ FY ?+?993103267#"&5NIW%ei2Hhe   FF!"3@$#FY FY ??+93?+3910#'.#"5632327#"&'&'#:2C1:9D?[yX6k*#!0=JST X7UF$ < 13 yLS`tDHwH@  ?2?9993103363#SHC>Qqo1I@'- (%2300GY00&)%&%FY&#??+39/+99333310#"#6654&'&&54675&5467##5!#"33V2_T6C5BsǞًsD3Pb=$nZAcG47="Ȱ' @u2 P_slsb\RH6@    FY FY?+??+3393310%27#"5!##57!#}&0+T#ݏL3uFJDŶH,@ FY FY ?+?+39310!3267#"&5!57P/b#o0הH }JDqH%@  FY?+?3993310"&332654&'3s覞"$ X֌sL\"A@#   #$FY  FY??3+3??+93333310$746324&#"66σYQhڈy|fIN #(Zu|u#l&'xrPN 9@!"! FYFY?+??+?9391023327#"&'#&&#"566N>,>T0R?--<;s;Ь&F+%1N+[pazJvhDcP =@ FY ??3+3?3?933333106654&'3#$3Z%?ix& " sH'=@ & ()& FY#?2+3?39/99339310"54733265332654'3#"'#7DD9xk^ij]kx7EA9˶D A(؏}7ɀֶ &j %&+55q&j9 +&+55sbs&RT!"&+5qs&T'&+5ss&T1&+5%&(j'R !&+55BF@& IYIYIY?+??+39/+933310"'5326554&#!#!5!!!2`67[ehC|pq^s&avZR&+5}8@ IYIY IY?+?+9/+93310"!!327# !2&B)  ɡyNG379m_XRj6TV,<o%&,jR !&+55`h-##G@& $%#IY IY JY JY?+?+?+9/+933310!!!#"'532>!3 32654&###9TPkE@2?0A+7DAz:LƷfHy>gM|TJ@&   IY  JY?+??39/3+3933333310!!!#3!33 32654&##T}y9NĹfPnM}B:@  IY IY  ?3?9/++3933310!2#4&#!#!5!! ٪}}}~qs&vR&+5^&6DR&+5  0@  IY"??3+?3933310!!#!3!3 />}$} =@   IY IYJY?+?+9/+933310!!!!3232654&##}T^Ltᆳ'YTx%aJ C@$    IY " IY?+33?3?+93333310#!#3!3!!Jq Ή}3Y(<@    ?33?33933333933310333###V9:R<<<J5(C@$# )*JY &&JY& JY ?+?+9/+993310!"'532654&##532654&#"'6632`gᢉnuTe`O.2k2JrKMR4@   ?2?3993399333310333#47##˟4 ˺J%5R^&6R&+5 -@  ?3?399393310!##33\y<:-@ IY JY??+?+93310!#!'"'53266!٪%=]~J;6;5O=]8!EWYq0+}2 nh3}&Z7*@    IY?+?3993910"'5326733673%oT]`nBǼ g-T+eA1/T5껪Ojs; 2@  IY"??+3?3933310%3#!3!3 漢}-@ IY ??39/+9933310!##"&5332673Ǫjߪa\5'Eyt7y 1@  IY?+3?33933310!!3!3!3yPXX;@  "  IY?+33?33?933331033!3!33#ɪGH} =@  IY IY JY?+?+9/+933310#!!5!3 32654&##G~  ?@  IY JY?+?39/+?9333310333 #%32654&###3ɪܑ{R 2@ IY JY?+?9/+9933310#!3! ! 4&#!# +l =:@ IY  IY IY?+?+9/+93310"'632!"'53 !5!&ӬH9Sc13LTl9"!G@&     IY IY  IY?+??9/+?+93333310! !#3!! 32#" dQ3VqoUP7No2**.3N =@   JY  JY  ?3?+9/9+933310#&&54$!!##"!3{㷾{b3ϞJb~^ZDwT!";@ $# FY FY??+9/9+39333107$736632#" !"w >k1Lu h2=&:"!T`bs?h7LHI@&   !FY FY  FY ?+?+9/+99333310#!! 4&#!! 4&#!!26){o1{}~5ko ~oHYQPCLDH@FY??+99310!#!DFH)hH C@$    GY " FY?+33?3?+93333310#!#36!3!#hV+ l{ G69s\HF<@        ?33?3393333393331033###3Ŷ67F++3D\"M@+  !#$"!"!FY"" "" FY FY ?+?+9/_^]+993310 54#"'632#"'532654!#57M~f;ɽ~t큷ɘ*L9%gGVc]bH 4@      ????999933333103#77#LQϛHI9\Hb &6=&+5 H -@    ?3?3993933103##3/' H+HH-@ FY GY??+?+93310!#!#"'532!`v6 s#^ {/F5@  ??3?399399333310%773##&'#3+)ӓ:5+]v:JKwFInbH 9@  FY/?   ?3?39/]+99333310!3#!#VfH5Hsb\RHH#@ FY?3?+993310!#!#!VHu\Ss\F)H$@ FY??+39310!#!5!jFH\qFL@'     FY FY??3+3?3+3?9333333310#&5473%66Fٰ{%$.&DT''H[H 2@    FY"??+3?3933310#!3!33ݦyF{HGG-H-@  FY  ??39/+993331032673##"&5B[iiqHp8CH;oH 1@   FY?+3?33933310%!3!3!3A妏HG F;@    FY "??+33?339333310%!33#!3!3榝N妏IyFI)H =@   FY FY FY?+?+9/+933310!2#!!5!4&#!! -9%L|9]SyH ?@   FY FY?+?39/+?9333310!2#!3#3! 54&#V+9#zHH\TLH 2@  FY FY?+?9/+9933310! #!3!2654&#VR@ˢH\][U9}\D@&   FY    FYFY?+?+9/_^]+93310"'53267!5!&&#"'663 Vv<[ )g/7P 9$6#3\Q@-     FY FY     FY?+??9/_^]+?+93333310#"'!#3!663232654&#"3ᦦ!% H5%H =@    FY FY ?3?+9/9+9333103#&&5463!#!!!!";ʵ zNrs&Hj 0&+55D'f@:%%()! FYGY/ !!FY?+??9///_^]3+3+3933333310"'53254&#"##5353!!36632/O4:7zo 1tɉRT8O[D!&v&+5s\D@& FY  FYFY?+?+9/_^]+93310"32&#"!!327yR91m) t#* 3;9js\VfL&j &+55fMBHL@) FY  FY GY FY?+?+?+9/+933331032!!!#"'532!4&##3 Ke(8 s#P}> {[UFJ@&    FY  FY?+??39/3+3933333310!2!!!#3!3 54&#N` F;F7\TD !&v3&+5 &\6&+5FF 2@   " FY?+3?3?933310!!3!3!#/JFI#@ IY??+9933103!#fk-:D'@ GY??+993310!#!3D9HALs&:CR&+5#!&ZCs&+5Ls&:vR#&+5#!&Zv&&+5L%&:jdR /&+55#&Zj 2&+55{s&<CR &+5!&\Ca&+5Rq/399105!R\٘Rq/399105!R\٘Rq1N@  /3/3333210!5!5!5!NRR1D ?9910'673% b8{B%Z yD ?9910#75b5zF dr?mF ?9910#&'7%B{-m^e@   ?32910'63!'6738z{; b8{B%saZ y@  ?32910#7!#675b5zF '`8}B dr[zd4] 8 @ H H H+++55{ C@!     ?.333?9/333933333310%#53%11L11`_{u@:          ??99//9922333333333393333333333333310%%#553%%9a11Z++Z11a+{+|^  /93104632#"&qlitsjkry~|{w&'%d ; $/;F[@0 0B6<+%%+<B GH33(? "99-D D D?3??99//3333?33393333331032#"#"&5!2%#32654&#"#"&5!232654&#"#"&5!2S]]S8iՔ+S][YY[]S78Q][YY[]Q뢛8TRJݫ? Ru@ //993310RVw!w'EGPu@ //993310'7uuX iG_^EiJ&y??3310#yJm!&@    ?2?399333104&#"#3363 LNPr[t` K!TGizXeTb#K@(  NYLY LY ??+99//+3+39333310!!##53!!!!4̦D +DH%p@@ "  &'NY  ! NY !!!?!O! !!LYKY?+?+99//_^]3+33+39333333102&#"!!!!!!5655#535#53546ɞb4@4ȹRu}PEӁGMR?&q@? $ '( NYNY/ ""LY"LY?+?+99//_^]3+33+3933333310 !!!!327#"#53'57#5332&OA%˪.'$ɥG5m9@-BA *,P$aV +E@$% *  *,-# '  ??99//33?3?39333310##"&546323254#"%"&54632&#"327Ք+ʦhX!QPbZNJ۱#g!e%w$=@#  %&#     /3/399//99333310%273#"&5556746324#"$}_``NruίRC>oզ#q&򊟡Jh{+VlK'+_@1  "+(,-% ((()JY(?3?3?+99//9933933333310!###33&53#"&5463232654&#"5!ǻL"Q][OO[\RVl:Grvusspp %O@'    ?229/33333333393333310##5!###33#7#q{Xw˴gjj/R//PvfH4@  ! /?/2/39/]93933310"&546632!3267&&#"y1RQHbٓ2Xz#5Fi)|5BuG'\&{@` ?555 ''@uu ?555G'&= @q ,?555j'F'@m?1 ?555f5(A@"&)* "GY FYFY?+?+9/9+933310#"&546327!"56632267&&#"5쭬a+>0/J_xPeee53]KZ,!%Ɛalv'm (@    IY??+999331073!!&'Ϧ!=(DhNfy!#@ IY?3?+993310!#!wX ZL 1@   IY IY?+?+933331055!!!Lw@Ck3lh)@ PY/+99105!h%@   //9/933310##5!3o!Tw- !-3@ +% ./" ( /333/3993393310#"&'#"&54632632267&&#""32654&-]AJ;=:᰻jb-/p@@(10'PY/ *@*$PY*@PY/ @ PY /]+_^]++_^]+993310"56323267#"&'&&"56323267#"&'&&P69lCpXM[-56eCoXI[195jEtRE_173dEvOTU@9n%!B9m%D5m "B7n !"h)F@&  PY  PY/3+3/_^]3+393310!5!!5!!!!!'}T-}m}97h)&+t ?55h)&!+t ?55o= @  //999933103# oHh{"&SYNX)h )9#6@! %$ !?3?39/]93933310632&#"36632#"&2654&#")J14S qU}DQcXVUpjr+;~c]cO[Z;Y|9J@  ??39310!5!^9VJt^39"-?@" &+ ./ )))) !#?2?39/]39993333102#"&5467&&54632654&''"654&d|IUJ95TVZT]QHFDKDQNvhLJqtEt..]Df~farT #'+/37;?CGS[kt|@A@=<10 TNXHvkp`zgED)(%$ ;g`87/k4,H# N  *BZQ\t\)AF>duulE=}VKkvk&2%1 BA>\=l 12k \lkkl\-, 9854! /333333333/3333333339///999999333322339333233933333333333333333333333310!#%5!#533!5353!5!!5!5!#3#35!#35!35!#35#3#3#"&546323254#"%32##32654&##32654#"'53253T/0momImmmm0oowoooomm~smp.,=.m^{B.$*/;J1%Z^4+V}i0oo/mmmmmmoo;mmJoooo/yhIaCS1BD5QYb" "+%J fVr_cT*.@ % +,(""//9///33910 54676654&#"63232654&#"TV,AgIOGRZ?>1HT;GFBIHCHEVW/2A1R~X8*P:/5K6DpJ;?HI>@IHW!&7L&+5D +-6f@9 4%.+-% 78GY!.!GY+... ..((1FY(FY?+?+99//_^]3+3+933333310! 47654&#"'6323 4'&$&546323%&#"Vw$ 6!S_X]wɠ*{]aN.AnX9{z/# v']]#:p?,iׁ_K{(@ JY?+??993106632&#"#39zM\:0((;V|e##7l08U/wH)L@'!!' *+ FY$FY?2+3?+339/99339310"&54!57!##"'#32655332654')LJuȹDD?Blu]lk]umoJD綶΄g}zqu&0vT&+5!&Pv-&+5&$[5^Z&D[&2\G ?55u5 @   /32993310#"&546324&#"3265}fexxee~nB33B<95@axubbuva9<<98==h@    /9310673#%47#"&F)w1Ny%]7CzN9v=H)5JD'I&ILm'I&IOm}d!<@ "#  IY IY?+?+999333310! ! >5332#"aCE2:h`uqjh Cfi'1+'1s"<@ #$  FY FY?+?+999333310#"&532>5332654&#"b| ى3:yfG%ӊ +Acn&{3@   IY?+?39999333310>53! 533265:F!ԪƸ>pnFD@"    FY??+?3939933333310326536653#'##"&5LzRJ  4oF;>y RUS!C !vRs@   /23339310#'6654&#"563 s i VNCI> &E׌"q2++)d ;}  /33104632#"&;;*(::(*;9669777s&(CR &+5Rs&ChR&+5s!&HC&+5b!&C&+51E@$"*'/ '23IY((,%%IY ?3+3?39/9+3933310"'632#"&'## 32&&#"327332<^-E~lSPk|F-]<ϻffΥ/)Pa-32.wSxP)L7LK0 (H(@   ??339?910#33663363#&'  .J - ۶}!3HI]5$,RZ\L@( IYIYJY?+?99//+3+393333310!3!!3 !!!32654&##?^1hڶdf+z'G@&    FYFY  FY ?+?39/++393333310!!! #!#5353! 54&#X?!1Hͦ\T! J@) !"IYIY IY?+??9/3+3?+933310"!!327# !#3!%2&&= ˜dq0նHd379pTP3N\0&\!Y@2   "# FY  FY    FY?+??9/_^]3+3?+93333310"'!#3!6$32&#"!!3267w ᦦ! Q62e =wbn H3 3%9m 4@   IY  ?33?9/9+39310####3#!'&'߲hg\LR8@VVJ?ϐdb yH 5@   FY  ?33?9/9+39310#####!&&'#Ѭqsͬ!+8" HH-lj\^F@%    IY    ?333?39/93+33933310####!#3!3#!&'"_ff>v #PPPnJH5V/ChHM@+    FY/? ?333??9/]93+33933310#####!#3!#!FΪqnѬߦ^h Y HH3s"_"K@( !$#!!IYJY"?33?9/33+3+99933310#.####"#>75!)Zvd2#DeY[cA /cve {H;o`&B'_o7şI9 H #N@*!"%$" "FYGY# ?33?9/33+33+99933310#.####"#>75!WoI1":TL KR8'0InW %Hi0PiqPWG @^P=iO2`i$'a@5!&#'%'"# )(#$&$&IY!IY'!!$?333??9/33+33+99933333310#.####"#67!#3!5!=]xe-Fi_^dB!78Rh {H;hc(D(_l7:P酙7H$'g@:!&#'%'"# )(#$&$&FY!FY'/!?!!!$?333??9/]33+33+99933333310#.####"#67!#3!5!1XoI0":VJ KT7&/%ͦ5!%Hi1NirPVF?\Px(H5bi?N5K@M!?FF ?7C<*-( LMIJYI941../. .*@CJY<**$JY* IY IY# IY "?+?++?+39/+9_^]92?+933310327632&#"#"&5467665!#532654&#"'67&''536632&#"WYaxxFGPDiii̵@ᢉjnV9u1{\\@20+,o0抆72'3}~  k7ErrBy4;sVq RG 7{NF@N)6 . >2@<) GHD>AGYAA/A A>&FY#FY3232FY!#& >>8FY> ",GY?+??3+9///+9++_^]+99333102&#"32772&&##"&5467$54&##53 54#"'67&'53663-)/g-z]m0KYVz}'T7\Nw7JX;|~\g{KXNp O>k9Gʔ*,1+'wpt}aZ"$7ub4nUmu} G@%IY  IY  IY?+?+9/_^]+99333310! ! 2!"!&`D;ba + nhepD sb\ I@'FY  FY  FY?+?+9/_^]+99333310#"&532267!"!&&b|  i %ӊ +MXH @JY ??9?+3910"#367>32&;N9RH# F;TnY*O87gVǏA=R@ GY ??9?+3910!336>32&#"jdR`%G[T-&/:Hdv 5z{4 T\Hs&vR !&+55=!&vd "&+55}  .D@& !.'/0%*JY%  IY IY?+?+?393?+93310! ! 32#"%33663#"'532677TC,#EoN S+ELJ7B^u#=ohfp1+)/Af,  gYs{\&R\u}-(Q@* & "" )*$"& &IY IY?33+33?33+339333333310#"'$%6326632654'#"'w|+|y -!ʽI6nʽnqs,oo)61,ll,s)0&V)1/'XV's-P@*  +%#  ./(%++FY  FY ?33+33?33+33933333310#"&'&54766326632665%#"&' @89= >98@ P} <5g| =35< }%%6-+8$& $8*+9&*"Jү`>* ,};ETU@.C7++&FKPH< 7 UV R@H:"@:@IY(:4IY.4?3+3?3+329/393310#".#"#54632326732#"'632!"&'# 32&&#"5654.5432Txf+/<}tp:pwN(X=7]ҥ<_+FyhLKnyF+^<x$\8Cy$+$43gn$,$B?9HN- (+Rb(0-+uUvR+h=H)5IDs*?N\@3((,"@E JB6 OP2:?--6LB @ FYFY% FY?3+3?39++323293310"'#"32&#"!273 4&#"'6632#".#"#5463235654.5432+^\Ϻ>w(9YGtm1{p>oC-nsGY9(w>QTxe+k}sp:qvNw$\8CAA#( 3^P*&3 x$*$fdo%+%ݡ>H(8JD^ @_@40$96>6) $AB-'-IY77!' @ H  @';3!3IY!?3+3?322+239/9+3933310#'##'##'5"'632!"&'## 32&&#"3267332P 21!1/!PC<]-F|tL Np~F-]<ҾA3fԥgggg+)Pc001/rUvP)&&7LJ1 ( *?@$$ +,( @ H  #??3322+239?910#'##'##'5#33663363#&R2112P'') # - ۶}!gggg%_HIo#Q,RZ\}-@  IY IY  ??+?+93310"!27## 4$32&H o9HG3tmVTNs\/@  FYFY?+?+?93310"32&#"3267#uO01h5P9+"3nju/@!    ?9910'%7%7%yB!C!v!DA9CBsdu=Css@   /332993310#"&5463!6632#*03)*6+/3-,6-2255).0138(@   /233991027632#54#"##5xQot}j+fyTb;:odf$+$y5@  /93104632&C8\$w8EL6(J@5@   /93105654.5432w$\8C@J(6LE) (6DR_m@I_(DZ"> R6mL0gno:HHAOED>LVcc\jf_Zm,,%3/"(6OLjm3663mjLO  /3/39////////333333333333333333910&&#"#632&&#"#6632&&#"#6632!&&#"#6632&&#"#6632!&&#"#6632&&#"#632!&&#"#6632o4@%% >:),25 ?@;+.6/'$3 //9910#67'66737&'&&'57667'67'&'7&&'7 F$a5; Ia4#GA݁hBO݁CCExEx+REC{Lj'ZC&#BO݁GA܂ Ia5; F$a5'XDnXY?DnXFcEf=? 'Q@*$%()IY$ IY !IY ?+?+99//3+3933333310473337! !3267# "&"!&=q"M)(eʍr݂nI62 3Z!(X@/  !&! )*!" FY%  "FYFY?+?+99//3+3??93333310&'$54733376632!3267#"!4&տj" ebD= E2/;g#i *AHTV,`&6T&+5 &6&+5B@% IYIY JY ??39/9++?+933310"#337 !"&'53254$^_ObR|Fz{<T1  !HB@%  FYGYFY??39/9++?+933310!#33#"'532654&#"T7n̅_.lGR\H<&9@IY JY IY"??+?+?+933310%3##!'"'53266!ٸŜ%=]~J;6;5O=]8}!EWYF9@ FY GY FY"??+?+?+933310%3##!#"'532!߰}^v:q"yd =@   IY IY?+??39/+9333310%!"&'53 !#3!3RzM{1#Pn bHG@'   FY    FY?+??39/_^]+9333310"'53265!#3!3ӄ]of}vd :=H5D@$    IY   IY"??+??39/+933333310%3##!#3!3Ş}PnFD@$    FY  FY "??+??39/+933333310!33##!#Vf}F7IyF=@    IY "IY?+??39/+9333310!##3#"&5332673Ǫjߪa5'Eyt7-H=@   FY  " FY ?+??39/+933331032673##3#"&5B[iiqHp8C aH;)H@%   IY" ?3?3??+9933933333310!##!333##47#PǞ /^J}F?@     FY "??3+??39939333310%7733###&'#3+)Ӱ}:5)-]vIy:JKwF-nTV,^&$69R&+5^ &D6%&+5%&$j=R $&+55^&Dj :&+55^s\^&(6R &+5s &H6 &+5uX=@  IY  IY IY?+?+9/+933310"5663 ! 5!27!s҆Ko/5L& qqF N f\;@    FY FYFY?+?+9/+9333102#"55!&&#"566267!b_Y Í\ i̻!)("uX%&jR /&+55f&j 1&+55%&jR '&+55&j '&+55J5%&jR >&+55D&j 8&+55J7@@#IYJY JY?+?9/++3933310! '532654&##5!5!$`jߌN? O.2ޙH@@# FYGY FY?+?9/++3933310#"'532654&##5!5!ꊷȡy8rʈFVr{R&MR&+5bb&M1&+5R%&jR %&+55b&j= #&+55}%&2jR -&+55sb&Rj .&+55}~sb\}%&~jR /&+55sb&j 0&+55=%&jR 0&+559}&j 0&+55&M/R&+5b&\M&+5%&j;R ,&+55&\j +&+55s&SR *&+55!&\S )&+55%&jjR )&+55-&j (&+55 -@   IY "IY?+??+93310!!3##?k}}BF -@   FY "FY?+??+93310!!3##Fy %&jR -&+55y&j ,&+55/u&uBH&uu&;X'u4H&[;@"     IY  ?3?39/993+3910!33!!##!3wklp<wpTbED}'H;@"     GY  ?3?39/993+3910!33!!##!u! hʼfw\/ D7 4@ IYJY??+9/+99333104$!33! $#"33$ ƪc ¶pJ|s7Gw#F@$ ##$%IY JY?2+3?99//9+93339310"&54$!3332653#"&'#"!265N*"dyϸv3q)!p{nRZwps".Q@), &&/0 *FY##FY ?3+3?+9/99?933339310%2653#"&'##"323&&53!26554&# vkȽ+Kj? mw9[qq[)  /MUp#NN*K@(("" +,JY  %%IY% JY?+?+99//+9933310#532654&#"'663232653#"&'&&՚ggT]bl|wpҽl7ErHPħ3іy)ȖP\%K@( $$ &'!FYFYFY?+?+99//+9933310%23# &&##53 54#"'6632Bݦo!KM9Uhc{ w 9McX$"($9zjN#J@(#! #$%JY##IY#!" JY?+??+9/+99333104&##532654&#"'66323##ᤇiiTaìk:BrJNħ}PZJ@(  FYFY" FY?+??+9/+99333104!#53 54&#"'6323##˖u9w=˿~p-ǍRPFJ9 %fy!#:@## $%IY  JY ?3+3?+9/93310!#"'53266!32653#"&5 H+LSdE@2?1@,8J7ospqͼDf>hωyy))F:@FYGY ?3+3?+9/93310323#"&5!#"'532!hwզ^v:q"q ;=d ^C@#  IY IY ?+??399//+9333331032653#"&5!#3!3nspqȿ'٪yy)3PnHM@*  FY   FY?+??399//_^]+93333310!3323#"&55!#VPjwզH5= 9sH}:@IY IY IY?+?+9/+93310!! 4$32&&# 3 !f4UxSBZW V`T1'&.s\:@ FY FY FY?+?+9/+93310!! !2&#"3265!C!ԯ;ũ?C'+PJߠ9@  IYIY?+3?+9/933105!!323#"&5&+5&${R &+55^&D{ -&+55&$|R &+55^&D| -&+55X&$}R !&+55^&D} 7&+55^&$~R '&+55^ &D~ =&+55I&$'N-dg&+5^&D&Ngy%&+5&(gs\&Hg&(fR&+5s&Hf&+5/&(RR&+5s&HR$&+5o&(wR &+55s\&Hw !&+55]&(xR &+55J&Hx !&+559J&(yR &+55s&Hy !&+55b&(zR *&+55s&Hz 9&+55s&('gKR%&+5s!&H'gK4&+5TV&,fR&+5{&fs&+5TV&,gf&Lgb}&2gsb\&Rg}&2fR&+5sb&Rf&+5}&2w}R &+55su&Rw &+55}&2x}R &+55ab&Rx &+55}J&2y{R &+55sb&Ry &+55}b&2zyR 6&+55sb&Rz 7&+55}s&2'gKR1&+5sb!&R'gK2&+5}ds&_v+R+&+5s!&`vm+&+5}ds&_CR#&+5s!&`C$&+5}d&_fR&&+5s&`f'&+5}d/&_RR+&+5s&`R#&+5}d&_g{s&`g&8gJ9H&Xg&8fTR&+59&Xf&+5{s&avR%&+5!&bvy&&+5{s&aCZR&+5!&bC&+5{&af`R &+5&bf"&+5{/&aRR%&+5&bR&+5{&agL&bg{&<gH&\g{&<fR &+5&\fj&+5{/&<RR&+5&\R&+5s&B! @   /32339910#&&'53#&&'53`4%c1`8%c1*?=D,?=Dq (@   /399//9339910#&'#57673'673#^pcra^5p4BPI6Sx`K[eA<{M^[pn` *@   /399//9339910#&'#57673%#&'53^arji^5p4B_xT4KAe`F<{M^^plaq{ 4@!   /3299//93339310#&'#57673#'6654&#"5632^pcra^5p4BP 9?9+.7K[eA<{M^{gQ &%Ph%:@ '"  " "/9///3339339910".#"#663232673#&'#57673-%GC?(*[ eK%IC>(* Z c^^arji^5p4B5%12jq$11hsAe`F<{M^y$@ @ /32339910673# 332673^P1Vw`>f LjbVi her]H9A@xy$@ @ /32339910#&'53 332673^wV4K5f LjbVi ]rlaH9A@xy.@  /239/2339310#'6654&#"5632 3326731R 9B9,%$>f LjbVi yd)Z %%NH9A@xh $0@" & @ !/2339/3329910".#"#663232673 332673-%GC?(*[ dL%IC>(* Z cf LjbVi 3$02hq$11grH9A@x1Bm@   /293104'3#"'5326ߋ{fcA2 6%3gx[gl 0uq @  /299310%#"'5325q8<)=^d0uq @  /299310%#"'5325q8<)=^d%4Cxss (@  KY &MY?+?+993310#"3232654&#"/55-7^ &@   ??99//993310!#47'37C>Z1C0pr#)s,@ KY&LY?+3?+9310!!5>54&#"'632!Rq,wX\Zڂ/whSAWg=Jms^t'G@&" ()KY %%KY%& KY %?+?+9/+9933310!"&'53 !#532654&#"'6632t[_`{^ȓ~`mTZ#,/1) kz4FpGQf^ B@!  MY $??9/933+393333310%##!533!47#f٨2 )D9s}D\V\_:@KYLY KY%?+?+9/+933102#"'53265!"'!!6- Fe^V7%s&O-327Iu/^+_@LY$??+9310!5!^h)j%t%A@"" &'MY KY&MY%?+?+9/9+933310!"'532##"&5432"326654&&%htDPf 7rЕx[XR)3SW0JFif'II\"3Z@.,00.*&&( (.54+1$-/-)/##( ())?3/32/3993339933333310#"'53254&&'&&54632&#"##33#7#H|Jjw6UxQn}\"dS7@7Cq7D\7F\7G7Hq7J7777777 7W7Xq7Y\7_7`q7b7q7\7q7 \7!q7"\7#q7%q7&\7'q7(\7)q7*\7+q7,\7-q7.\7/q70\71q72\73q74\76q78q7:q7<@<C<D<F<G<H<J<< <W<X<Y<_<`<b<<<< <!<"<#<%<&<'<(<)<*<+<,<-<.</<0<1<2<3<4<6<8<:<<<@<B<D<I<J<K<L<M<N<O<Q<R<S<T<U<V<W<X<Y<Z<[<\<]<^<_<`<b<d<f<h<j<l<n=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_>-DD DD EE EYEZE[E\E]EE7E<E>E@EEEE EpF)F )F)F )HH HYHZH[H\H]HH7H<H>H@HHHH HpI{I {I{I {KK KK NFNGNHNRNTNNNNNNNNNNNNNNNNNNNNNNNNNNNNHN`N6N8N:N<N@NBNDNJNLNNNRNTNVNXNZN\N^N`PP PP QQ QQ RR RYRZR[R\R]RR7R<R>R@RRRR RpSS SYSZS[S\S]SS7S<S>S@SSSS SpURU RUDUFUGUHUJURUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUDUFUHURU RUYU`UU U"U&U(U*U,U.U0U2U4U6U8U:U<U@UBUDUJULUNURUTUVUXUZU\U^U`W)W )W)W )YRY RYYY")YRYY RY ZRZ RZZZ")ZRZZ RZ [F[G[H[R[T[[[[[[[[[[[[[[[[[[[[[[[[[[[[H[`[6[8[:[<[@[B[D[J[L[N[R[T[V[X[Z[\[^[`\R\ R\\\")\R\\ R\ ^-q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq-{&*24G_IKMOQSUWY[]_-{-{-{-{$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjln$;=;=?C X!#%')+-/13             YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p   YZ[\]7<>@ pR R")R R  YZ[\]7<>@ pR R")R R q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  &*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_$79:;<=$&68:;=?C X!#%')+-/13oqsR R "@E=K=N=O=`={R R$79:;<=$&68:;=?C X!#%')+-/13oqs-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p  &*24G_IKMOQSUWY[]_FGHRTH`68:<@BDJLNRTVXZ\^`FGHRTH`68:<@BDJLNRTVXZ\^`\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqsR R "@E=K=N=O=`=R R\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs  $79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs-{R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`$$$$")$$q$&$*$2$4$7)$D\$Fq$Gq$Hq$Jq$P$Q$Rq$S$Tq$U$V$X$Y$Z$[$\$]$q$q$q$q$q$q$$$$$$$$q$\$\$\$\$\$\$q$q$q$q$q$q$q$q$q$q$q$$$$$$q$\$q$\$q$\$$q$$q$$q$$q$q$q$q$q$q$q$q$$q$$q$$q$$q$$$$ $$q$$q$$q$$q$$$$!$$)$&)$+$-$/$1$3$5$7$<$>$@$Cq$D\$F\$G$Hq$J$$$$$$$ $W$Xq$Y\$_$`q$b$q$\$q$ \$!q$"\$#q$%q$&\$'q$(\$)q$*\$+q$,\$-q$.\$/q$0\$1q$2\$3q$4\$6q$8q$:q$&@&Cq&D\&F\&G&Hq&J&&&&&&& &W&Xq&Y\&_&`q&b&q&\&q& \&!q&"\&#q&%q&&\&'q&(\&)q&*\&+q&,\&-q&.\&/q&0\&1q&2\&3q&4\&6q&8q&:q&(@(Cq(D\(F\(G(Hq(J((((((( (W(Xq(Y\(_(`q(b(q(\(q( \(!q("\(#q(%q(&\('q((\()q(*\(+q(,\(-q(.\(/q(0\(1q(2\(3q(4\(6q(8q(:q(8@8C8D8F8G8H8J88 8W8X8Y8_8`8b8888 8!8"8#8%8&8'8(8)8*8+8,8-8.8/808182838486888:8<8@8B8D8I8J8K8L8M8N8O8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8b8d8f8h8j8l8n9R9 R999")9R99 R9 :::"):$:&:*:2:4:D:F:G:H:J:P:Q:R:S:T:U:V:X:]:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::!:+:-:/:1:3:5:<:>:@:C:D:F:G:H:J:: :W:X:Y:_:`:b:::: :!:":#:%:&:':(:):*:+:,:-:.:/:0:1:2:3:4:6:8:::<:@:B:D:I:J:K:L:M:N:O:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:^:_:`:b:d:f:h:j:l:n;&;*;2;4;;;;;;;;;;;;;;;;;;;;G;_;I;K;M;O;Q;S;U;W;Y;[;];_=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_?&?*?2?4????????????????????G?_?I?K?M?O?Q?S?U?W?Y?[?]?_CqC qC&C*C- C2C4C7qC9C:C<CCCCCCCCCCCCCCCCCCCCC$qC&qC6C8C:CGCCCCCqC qC_CICKCMCOCQCSCUCWCYC[C]C_CoCqCsCqDD DD E-{GGG$G7G9G:G;G<G=GGGGGGGGGGG$G&G6G8G:G;G=G?GCGGGGGGG GXGGG!G#G%G'G)G+G-G/G1G3GoGqGsGVqV qVfVmVqqVrVsVuVxVqV qVT[[[V[_[b[d[i[p[q[r[t[u[x[[[ [T\\\V\_\b\f\i\m\s\v\y\z\{\|\}\~\\\\\\\\\\\\\\\\\\\\ \!]q]r]x]T^^ ^^ _q_ q_f_m_qq_r_s_u_x_q_ q_T```V`_`b`i`t`` aaaaV\a_\ab\afai\amasavayqaza{a|a}a~qaaaaaaaaaqaaqaqaaqaaaaaqaaaaaaa a!aSbqb qbfbmbqqbrbsbubxbqb qbTdfdmdsfffVf_fbfdfifpfqfrftfufxfff fThfhmhshhiqi qifimiqqirisiuixiqi qiTmmmVm_mbmdmimpmqmrmtmumxmmm mToooVo_obodoiotooo qqqqV\q_\qb\qfqi\qmqsqvqyqqzq{q|q}q~qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq q!qSrrrVr_rbrfrirmrsrvryrzr{r|r}r~rrrrrrrrrrrrrrrrrrrr r!sssVs_sbsdsispsqsrstsxsss sTtftmtsttuuuVu_ubufuiumuu vqvrvxvTxxxVx_xbxfxixmxsxvxyxzx{x|x}x~xxxxxxxxxxxxxxxxxxxx x!y){{ {{ || |||| ~) y~     y~ y~         y~       n| q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqql~    n|   n|   n| l|~  qff jlrqs~ffqqq q  q q qqq qn|q qq  r|  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq)l|~    l|~   rsz|  rsv  l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqqqff jlrqs~ffqqq q  q  rsz l|~  ))  n|   n|  rsz|  rsz|   ) js      j  )j       js   s  j        m  m         js    m  m  j   sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R 7$&q7$&q7$&q$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q                        q  q  q                             ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q    q    q    q q  q   !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) & * 2 4 7q 8 9 : <                         $q &q * , . 0 2 4 6 8 : G f m qq r s u x  q  q   q  \ q        T _ a l |\ ~        q    q    q  \  \    \     \        q  I K M O Q S U W Y [ ] _ a c e g i k m o q s q!q!r!x!TSSSS TTTVT_TbTfTiTmTsTvTyTzT{T|T}T~TTTTTTTTTTTTTTTTTTTT T!XqX qX&X*X- X2X4X7qX9X:X<XXXXXXXXXXXXXXXXXXXXX$qX&qX6X8X:XGXXXXXqX qX_XIXKXMXOXQXSXUXWXYX[X]X_XoXqXsXqYY YY ZZZVZ_ZbZdZiZpZqZrZtZuZxZZZ ZT`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`RbIfbWfbYfbZfb[fb\fbfb%fb'fb7fbfbfb4fb5fb]fb^fbpfbfbfjj jj llllllllllllllllllllll lrlslzl|lllllllllllllllllllllllllllll llllllmmmmmmm msmmmnn nnnnnnnnn n|nnnnnnnnnnnnnnn nnnoo ooooooooo omooooooooooooooooooooooooooopppppplp~ppppppppppppppppp p ppprqr qrrrqrrrrrrrqr qrnr|rrrrrrrrqrrrrrrrrrrrrrrrrrrr qrrqrrrsqs qssssssssssssqs qsjsms}sssssssssssssssssssssssssssss s ssssstqt qtttqtttttttqt qtnt|ttttttttqttttttttttttttttttt qttqtttuqu quuuuuuuuuuuuqu qujumu}uuuuuuuuuuuuuuuuuuuuuuuuuuuuu u uuuuuv vx xzzzz zzzzz z|q|q||||||||q| q|r|s|||||| | ||||}} }}}}}}}}} }}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~ ~r~s~z~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~  qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  s s s rsz|    rsz|    rsz|  sl~  )    |   m rsv    )))))) jklqrsuwy}~)))))    ) js   f |   l{=}~j    )l{=}~j  l|~  j  l|~  j  l|~  j  )  )))))) jklqrsuwy}~)))))    ) js  \ \fH\ \|qqH HHq qq qmqq   l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )) jklqrsuwy}~))     s)) jklqrsuwy}~))     sl{=}~j  )  )    |         l|~  j   f m| )  )  )  q qqq qn|q qq  q qqq qn|q qq       rsz|    rsz|   l|~  j    )   rsz|    rsz|    rsz|    rsz|   qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )))))) jklqrsuwy}~)))))    ) js  l{=}~j  l|~  j          q             r v |       q                                                                           q             r v |       q                                      )   q rv|q    q rv|q    r    r|   )  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq     !q! q!&!*!- !2!4!7q!9!:!<!!!!!!!!!!!!!!!!!!!!!$q!&q!6!8!:!G!!!!!q! q!_!I!K!M!O!Q!S!U!W!Y![!]!_!o!q!s!q"" "" #q# q#&#*#- #2#4#7q#9#:#<#####################$q#&q#6#8#:#G#####q# q#_#I#K#M#O#Q#S#U#W#Y#[#]#_#o#q#s#q$$ $$ %q% q%&%*%- %2%4%7q%9%:%<%%%%%%%%%%%%%%%%%%%%%$q%&q%6%8%:%G%%%%%q% q%_%I%K%M%O%Q%S%U%W%Y%[%]%_%o%q%s%q&& && 'q' q'&'*'- '2'4'7q'9':'<'''''''''''''''''''''$q'&q'6'8':'G'''''q' q'_'I'K'M'O'Q'S'U'W'Y'[']'_'o'q's'q(( (( )q) q)&)*)- )2)4)7q)9):)<)))))))))))))))))))))$q)&q)6)8):)G)))))q) q)_)I)K)M)O)Q)S)U)W)Y)[)])_)o)q)s)q** ** +q+ q+&+*+- +2+4+7q+9+:+<+++++++++++++++++++++$q+&q+6+8+:+G+++++q+ q+_+I+K+M+O+Q+S+U+W+Y+[+]+_+o+q+s+q,, ,, -q- q-&-*-- -2-4-7q-9-:-<---------------------$q-&q-6-8-:-G-----q- q-_-I-K-M-O-Q-S-U-W-Y-[-]-_-o-q-s-q.. .. /q/ q/&/*/- /2/4/7q/9/:/</////////////////////$q/&q/6/8/:/G/////q/ q/_/I/K/M/O/Q/S/U/W/Y/[/]/_/o/q/s/q00 00 1q1 q1&1*1- 121417q191:1<111111111111111111111$q1&q16181:1G11111q1 q1_1I1K1M1O1Q1S1U1W1Y1[1]1_1o1q1s1q22 22 3q3 q3&3*3- 323437q393:3<333333333333333333333$q3&q36383:3G33333q3 q3_3I3K3M3O3Q3S3U3W3Y3[3]3_3o3q3s3q44 44 5-{66 6Y6Z6[6\6]6676<6>6@6666 6p7-{88 8Y8Z8[8\8]8878<8>8@8888 8p9-{:: :Y:Z:[:\:]::7:<:>:@:::: :p;-{<< <Y<Z<[<\<]<<7<<<><@<<<< <p=-{>> >Y>Z>[>\>]>>7><>>>@>>>> >p?-{@@ @Y@Z@[@\@]@@7@<@>@@@@@@ @pA-{BB BYBZB[B\B]BB7B<B>B@BBBB BpC-{DD DYDZD[D\D]DD7D<D>D@DDDD DpIII$I7I9I:I;I<I=IIIIIIIIIII$I&I6I8I:I;I=I?ICIIIIIII IXIII!I#I%I'I)I+I-I/I1I3IoIqIsIJJ JYJZJ[J\J]JJ7J<J>J@JJJJ JpKKK$K7K9K:K;K<K=KKKKKKKKKKK$K&K6K8K:K;K=K?KCKKKKKKK KXKKK!K#K%K'K)K+K-K/K1K3KoKqKsKLL LYLZL[L\L]LL7L<L>L@LLLL LpMMM$M7M9M:M;M<M=MMMMMMMMMMM$M&M6M8M:M;M=M?MCMMMMMMM MXMMM!M#M%M'M)M+M-M/M1M3MoMqMsMOOO$O7O9O:O;O<O=OOOOOOOOOOO$O&O6O8O:O;O=O?OCOOOOOOO OXOOO!O#O%O'O)O+O-O/O1O3OoOqOsOQQQ$Q7Q9Q:Q;Q<Q=QQQQQQQQQQQ$Q&Q6Q8Q:Q;Q=Q?QCQQQQQQQ QXQQQ!Q#Q%Q'Q)Q+Q-Q/Q1Q3QoQqQsQSSS$S7S9S:S;S<S=SSSSSSSSSSS$S&S6S8S:S;S=S?SCSSSSSSS SXSSS!S#S%S'S)S+S-S/S1S3SoSqSsSUUU$U7U9U:U;U<U=UUUUUUUUUUU$U&U6U8U:U;U=U?UCUUUUUUU UXUUU!U#U%U'U)U+U-U/U1U3UoUqUsUXIRXWRXYfXZfX[fX\fXfX%RX'RX7fXfXfX4RX5RX]RX^RXpfXRXRZIRZWRZYfZZfZ[fZ\fZfZ%RZ'RZ7fZfZfZ4RZ5RZ]RZ^RZpfZRZR\IR\WR\Yf\Zf\[f\\f\f\%R\'R\7f\f\f\4R\5R\]R\^R\pf\R\R^IR^WR^Yf^Zf^[f^\f^f^%R^'R^7f^f^f^4R^5R^]R^^R^pf^R^R`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`Raaa$aaaaaaaaaaCaa aXaaa!a#a%a'a)a+a-a/a1a3fIffWffYffZff[ff\ffff%ff'ff7ffffff4ff5ff]ff^ffpfffffhIfhWfhYfhZfh[fh\fhfh%fh'fh7fhfhfh4fh5fh]fh^fhpfhfhfjIfjWfjYfjZfj[fj\fjfj%fj'fj7fjfjfj4fj5fj]fj^fjpfjfjflIflWflYflZfl[fl\flfl%fl'fl7flflfl4fl5fl]fl^flpflflfnIfnWfnYfnZfn[fn\fnfn%fn'fn7fnfnfn4fn5fn]fn^fnpfnfnfooo")o$o&o*o2o4oDoFoGoHoJoPoQoRoSoToUoVoXo]oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooo!o+o-o/o1o3o5o<o>o@oCoDoFoGoHoJoo oWoXoYo_o`oboooo o!o"o#o%o&o'o(o)o*o+o,o-o.o/o0o1o2o3o4o6o8o:o<o@oBoDoIoJoKoLoMoNoOoQoRoSoToUoVoWoXoYoZo[o\o]o^o_o`obodofohojolonpRp Rppp")pRpp Rp qqq")q$q&q*q2q4qDqFqGqHqJqPqQqRqSqTqUqVqXq]qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqq!q+q-q/q1q3q5q<q>q@qCqDqFqGqHqJqq qWqXqYq_q`qbqqqq q!q"q#q%q&q'q(q)q*q+q,q-q.q/q0q1q2q3q4q6q8q:q<q@qBqDqIqJqKqLqMqNqOqQqRqSqTqUqVqWqXqYqZq[q\q]q^q_q`qbqdqfqhqjqlqnrRr Rrrr")rRrr Rr sss")s$s&s*s2s4sDsFsGsHsJsPsQsRsSsTsUsVsXs]ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssss!s+s-s/s1s3s5s<s>s@sCsDsFsGsHsJss sWsXsYs_s`sbssss s!s"s#s%s&s's(s)s*s+s,s-s.s/s0s1s2s3s4s6s8s:s<s@sBsDsIsJsKsLsMsNsOsQsRsSsTsUsVsWsXsYsZs[s\s]s^s_s`sbsdsfshsjslsntRt Rttt")tRtt Rt { {{ {")$q&*247)D\FqGqHqJqPQRqSTqUVXYZ[\]qqqqqqq\\\\\\qqqqqqqqqqqq\q\q\qqqqqqqqqqqqqqq qqqq!$)&)+-/1357<>@CqD\F\GHqJ WXqY\_`qbq\q \!q"\#q%q&\'q(\)q*\+q,\-q.\/q0\1q2\3q4\6q8q:q9 9BI 9 gsR{  . .+*Y r   <  Q i y ( 8E \} \ T5Digitized data copyright 2010-2011, Google Corporation.Open SansRegularAscender - Open Sans Build 100Version 1.10OpenSansOpen Sans is a trademark of Google and may be registered in certain jurisdictions.Ascender Corporationhttp://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0Digitized data copyright 2010-2011, Google Corporation.Open SansRegularAscender - Open Sans Build 100Version 1.10OpenSansOpen Sans is a trademark of Google and may be registered in certain jurisdictions.Ascender Corporationhttp://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0ff      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~.notdefnullnonmarkingreturnspaceexclamquotedbl numbersigndollarpercent ampersand quotesingle parenleft parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon semicolonlessequalgreaterquestionatABCDEFGHI.altJKLMNOPQRSTUVWXYZ bracketleft backslash bracketright asciicircum underscoregraveabcdefghijklmnopqrstuvwxyz braceleftbar braceright asciitildenonbreakingspace exclamdowncentsterlingcurrencyyen brokenbarsectiondieresis copyright ordfeminine guillemotleft logicalnotuni00AD registered overscoredegree plusminus twosuperior threesuperioracutemu paragraphperiodcenteredcedilla onesuperior ordmasculineguillemotright onequarteronehalf threequarters questiondownAgraveAacute AcircumflexAtilde AdieresisAringAECcedillaEgraveEacute Ecircumflex Edieresis Igrave.alt Iacute.altIcircumflex.alt Idieresis.altEthNtildeOgraveOacute OcircumflexOtilde OdieresismultiplyOslashUgraveUacute Ucircumflex UdieresisYacuteThorn germandblsagraveaacute acircumflexatilde adieresisaringaeccedillaegraveeacute ecircumflex edieresisigraveiacute icircumflex idieresisethntildeograveoacute ocircumflexotilde odieresisdivideoslashugraveuacute ucircumflex udieresisyacutethorn ydieresisAmacronamacronAbreveabreveAogonekaogonekCacutecacute Ccircumflex ccircumflexCdotcdotCcaronccaronDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflexGbrevegbreveGdotgdot Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbar Itilde.altitilde Imacron.altimacron Ibreve.altibreve Iogonek.altiogonekIdotaccent.altdotlessiIJ.altij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotLslashlslashNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautOEoeRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexScedillascedillaScaronscaron Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflex YdieresisZacutezacute Zdotaccent zdotaccentZcaronzcaronlongsflorin Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccent circumflexcaronmacronbreve dotaccentringogonektilde hungarumlauttonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos.alt Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIota.altKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9Iotadieresis.altUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronpirhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055.alt afii10056.alt afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveendashemdash afii00208 underscoredbl quoteleft quoterightquotesinglbase quotereversed quotedblleft quotedblright quotedblbasedagger daggerdblbulletellipsis perthousandminutesecond guilsinglleftguilsinglright exclamdblfraction nsuperiorfranc afii08941pesetaEuro afii61248 afii61289 afii61352 trademarkOmega estimated oneeighth threeeighths fiveeighths seveneighths partialdiffDeltaproduct summationminusradicalinfinityintegral approxequalnotequal lessequal greaterequallozengeuniFB01uniFB02 cyrillicbrevedotlessjcaroncommaaccent commaaccentcommaaccentrotate zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperioruni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200BuniFEFFuniFFFCuniFFFDuni01F0uni02BCuni03D1uni03D2uni03D6uni1E3Euni1E3Funi1E00uni1E01uni1F4Duni02F3 dasiaoxiauniFB03uniFB04OhornohornUhornuhornuni0300uni0301uni0303hookdotbelowuni0400uni040Duni0450uni045Duni0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BF uni04C0.altuni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CE uni04CF.altuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7 uni1EC8.altuni1EC9 uni1ECA.altuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1uni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni20ABuni030Fcircumflexacutecombcircumflexgravecombcircumflexhookcombcircumflextildecombbreveacutecombbrevegravecomb brevehookcombbrevetildecombcyrillichookleftcyrillicbighookUCcyrillicbighookLCone.pnumzero.osone.ostwo.osthree.osfour.osfive.ossix.osseven.oseight.osnine.osffuni2120Tcedillatcedillag.altgcircumflex.alt gbreve.altgdot.altgcommaaccent.altIIgraveIacute Icircumflex IdieresisItildeImacronIbreveIogonek IdotaccentIJ IotatonosIota Iotadieresis afii10055 afii10056uni04C0uni04CFuni1EC8uni1ECA   46latnMOL ROM  nlatnMOL (ROM B      ligaligaligalnumlnumlnumloclloclonumonumonumpnumpnumpnumsalt saltsaltss01"ss01*ss012ss02:ss02@ss02Fss03Lss03Rss03Xtnum^tnumftnumn    &.6>FNV^Pz2HJJ.,ZgwEG      !$%IJ6 "(^IO]ILI5O4LI^V0R *H C0?1 0 +0a +7S0Q0, +7<<<Obsolete>>>0!0 +@mnTA6}]0z0b8%a&Z0  *H 0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0 070615000000Z 120614235959Z0\1 0 UUS10U VeriSign, Inc.1402U+VeriSign Time Stamping Services Signer - G200  *H 0ĵR`)J[/Kk5TX56^bMRQ4q{f*j 7٘tvJcEG.k NK+XJ,XB-uލǎlLgrIž`<cxi{-004+(0&0$+0http://ocsp.verisign.com0 U003U,0*0(&$"http://crl.verisign.com/tss-ca.crl0U% 0 +0U0U0010 UTSA1-20  *H PK$ $- 7 ,Za񑑳V@뒾89u6t:O7ʕBǠWdB5N3M'L8MxSݤ^ ⥾`߭(ǥKd[98"3/!?DA e$HDT\y>]r},CS}=*:Om ]^SWp`+nx'4[^I2300-GߍRFCmH 10  *H 01 0 UZA10U Western Cape10U Durbanville10 U Thawte10U Thawte Certification10UThawte Timestamping CA0 031204000000Z 131203235959Z0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0"0  *H 0 ʲ }uNgadڻ30X~k6xw~o< hlʽR-H=]_/kLR`@~ ?Ǵ߇_zj1.G 1s W-x43h/Š*Ë!fXWou<&]'x1"ijGC_^|}bM "Vͮv M٠h;004+(0&0$+0http://ocsp.verisign.com0U00AU:0806420http://crl.verisign.com/ThawteTimestampingCA.crl0U% 0 +0U0$U0010U TSA2048-1-530  *H JkXD1y+LͰXn)^ʓR G'/8ɓN"b?7!Op18UN$ҩ'NzaA*^ݻ+>W~ +;R8'?J00eeR&.Y)"\0  *H 0_1 0 UUS10U VeriSign, Inc.1705U .Class 3 Public Primary Certification Authority0 090521000000Z 190520235959Z01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0"0  *H 0 g`IoV|f^ q-!ќPL"5; .Z|=;%X{ ξ'tag'MjaXy'M4+G Df$fO8TrfujIh8y 0,`Hת809:|@T/ܨR>+!\ P4.M^%Ԍn|)]1ZՌgX5+!`x^{`W ]A cT`C!00U00pU i0g0e `HE0V0(+https://www.verisign.com/cps0*+0https://www.verisign.com/rpa0U0m+ a0_][0Y0W0U image/gif0!00+kπjH,{.0%#http://logo.verisign.com/vslogo.gif0U%0++04+(0&0$+0http://ocsp.verisign.com01U*0(0&$" http://crl.verisign.com/pca3.crl0)U"0 010UClass3CA2048-1-550Uk&pȡ?-50  *H ݔAaix0Ɛ<~B$s/DrPU nQj71ܥ-OM2NgUejzd8xEv1z`³]fvYI8VAwX00fgymPSo0  *H 01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0 100729000000Z 120808235959Z01 0 UUS10U Massachusetts10 UWoburn10U Monotype Imaging Inc.1>0<U 5Digital ID Class 3 - Microsoft Software Validation v210U Type Operations10UMonotype Imaging Inc.00  *H 0Di|U 25L3^ L*8ט@I "SOCʋVnH9c;$5}rGWyˊJ@p-5cįפ {uePd"}KXEMYLM00 U00U0DU=0;09753http://csc3-2009-2-crl.verisign.com/CSC3-2009-2.crl0DU =0;09 `HE0*0(+https://www.verisign.com/rpa0U% 0 +0u+i0g0$+0http://ocsp.verisign.com0?+03http://csc3-2009-2-aia.verisign.com/CSC3-2009-2.cer0U#0k&pȡ?-50 `HB0 +700  *H N"gA~™cjrb<8=_G_[KI  VD 5< D`E*oL;4gpZ9\Zl5|eKmIp=b۴A~}n"w6MZ S1+(RzkwD ]%,͊0>KyʦN $ 񺐶\<'M0{ *H  1l0h0g0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA8%a&Z0 +]0 *H  1  *H 0 *H  1 110505165510Z0# *H  1T+ 'S8V0  *H wo"kEN@;'JV:j|{`N+Wg3+)쾼Y)$wILt=.o !9V8 chX)snek-1.1/doc/fonts/OpenSans-Semibold.ttf000066400000000000000000006602201353657467200202420ustar00rootroot000000000000000DSIG=>KtGDEF&FGPOS 77G8GSUB+=GTOS/2`cmap)/hcvt 4fpgm~agaspF glyfw%>head<6hhea t$hmtx ekernT+ ~dP6locaHVDVmaxp8 name$Ot9postCl &+prepxn_< L}LxT d  T{ W/\X33f @ [(1ASC X R 5}+/oT`R=bJ`#?H3XZV'u^JXV39?`f`/oJHywByJddVbDLyLyfd B3LojZfff#s;;;ffsb%'HhJD-h-`5Huhs%d9sR`Hdmm`3-j=q3T =sP<.77JJJJJJLywwww4J:/DLyLyLyLyLyLyTZZZZZZZfffff;;;;ffffff`fJJJZJZJZyfyfyfyff/ fwfwfwfwfwfysysysys ;4;;J;0J;HJbdd;V;V;]V;VZ\DDDDLyfLyfLyfyfssaskfdbfdbfdbfdb%'%'%' JBDBDBDLZLZLyffdb#;`J3dJHR/wBLyJbDLLyLbmFD:fTf'RfTffffff  f\o fow'RDyfdJ:dd'# JHR w%XVV#bLyy bq+B{3Zh#fo'HjjP/ff+JfhBo{Bf fb;;; J+o   JRRRJ%?--+{%{ R}RPh wDhBJ?yf)P/FDfA-PVP/ 9`d%s/\`^`b####;sff'H+9/'Vy3TT;jZ#bJZf # #jy'f4 wVfjd}d - y%/3'm\Nyf^q^q yfyXfXyfJjDy fhu))/ X/ X'H/ =X9y/fyf+LLs#+V%%J%o-1hJJZJZLZwf/`/`%oX'HBH)VjVjLyfNyfNyf+BB J J JZ{X/ hhofLoFfD3DN3N%7u9y5f+bT-JZJZJZJJZJZJZJZJZJZJZJZwfwfwfwfwwfwfwfJ;wJ;LyfLyfLyfLy!LyfLyfLyfjy'fjy'fjy'fjy'fjy'fJJJ fNTNRTTTT/mq5R5Vu^JXV#V%'fffffqqqqqqqqqLqq 0HI~'2a7 # O_?M   " & 0 3 : < D p y  !!!! !"!&!.!^"""""""+"H"`"e% IJ(3b7 #P`>M   & 0 2 9 < D p t  !!!! !"!&!.!["""""""+"H"`"d%aIvhcb]gD Xz}} Bvt n%"iOS0L\pr`<&'()*+,-./0123456789:;<=>?@AIJ$%TUVWXY\]^_`abcdefhijklmnopqrstuvhijkFopqrstu45]^@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-@ !H U UHU?OFNMMF&4U%$HLKKF3UU3U?JJJIHFGFIF#H"U3U3UU3UU3UoTS++KRK P[%S@QZUZ[XYBK2SX YKdSXBYss++^stt+++++t++ssst+++++++++++++st+++^NuR{1$$$$W}ym>_v eV?8bn  H  5 f  _  u  6 j ,Z.N;#0y&_GwApAt+ppL!MO7Y*@Uk!2  ! s ! !s!!!!!""~""""""#m#y########$j$z$$$$$%%y%%%%%&"&3&D&T&e&u&&&&&&&&'''#'/'7''''''(((&(7(G(X(h(y((((((();))))))******A*M*Y*j*{******+++"+.+:+w++++++, ,,a,,,,,---u-. ..(.4.E.U.f.v.........//?///////0 00.0@0L0X0i0z0000000111:1222223333L3|33344G4445%565X5j5|555555566 666#6y6666677 7/777w77788O8888889 999:)::;>;y;;</>d>>?\?@@"@3@C@S@d@v@@A!A)A1ACAKABBDBUBfBBBBBC;CCCCD&D7DlDDDDDDDDE!E)E1EbEEF FOFFG"GGGH1HHHIIOIIIJ(J_JJJKKKK I:K#9L%7 JT )-W@0-*+,%  %*,/.'''-`   ,-,"?3?3??9/]q39/]393333331032#"#"&5!232#"#"&5!2#:BB:¥?;BB;¦@+''ڕ)%!J` 2T@.,+'(!+!(43%-*,'$', KY0 LY0?+?+?999933333106654&#"27%467&&54632673!'#"$C54&#"'6632!9!ym2wiTgzG{~Hcr>QgVմc V-&C@$ "('OY $$MY$ MY ?+?+9/+993310!"'532654&##53 54&#"'6!2]`^zwSis f O.2~un^f/D'm H@'  MY P??39/]]33+3933333310##!533!47#mdV <??Ho}B^u):@MYNY MY?+?+9/+933102!"'53265!"'!!66JQZ/4i8!#eO.2 >^?$D@#" &% OYOYMY?+?+9/+9933310!2&#"36632#"&2654&#"^nLLd /sޝ}y{{LJoZQY!~Aq;J=%@NY?+?93310!!5!BϤX9#07@+!21!!++ $OY OY ?+?+9/3999102#"$5467&&54632654&''"6654&HrF}t dz,Tdxc{ɿVu̻zLPohswfQ9 :?cU4RC/5uNUcV7%D@#" '& OYMYOY?+?+9/+9933310!"'532##"&5432%"32654&&7:YZ ;pޜ~zy{wE|FPVZP}_YZj (@ QY QY ?+?+93991074632#"&432#"&LHILMHHLKJMHHL}INQFGSRPGGSR?j2@   QY ?+/_^]93310%#7432#"&0E"#KJMHHLPGGSR`1&@?o/]q9310%51/#yf)-@ RYRY/Oo/]++9105!5!f=?q`1&@?o/]q93105`#//XyRm&A@!!('$ KY$QY$?+?+9/9393331054676654&#"'632432#"&PdwEpi_MT,Ym]?HLMGGL@nN^hHTZ6&qKujUI`Q-OHGSQoV5?L@&;:6#.(.A@ =288 +2&+/3?39/3339/39933333310#"&'##"&543232654$#"!27# $32327&#"ZkOt 1ZLHhO]Ŧ6"bS ?HTHNNҳ/̞ZVeش%J7@  LY ?3?39/+9333310!!#!&&'Lя##15 4jDd(({!I@&  #"KYLYLY?+?+9/+99333310! #!32654&##32654&#. |斊 Z_rg\1s|rny&@ LY LY ?+?+9310"3267# 4$32&&/]^h5@   ?3?399333310!!#367!5basFxo>@LY?+?9931033!k>@      ?33?3993333333310!##!3!#47#9XQR I9uJm^%=2@    ?3?3999933333310!!##!3&531" Ay!Qy (@  LY LY?+?+993310! ! 32#"eKFdtjjv  2@  LY LY?+?9/+9933310!##! 32654&##'~|y;@   LY LY?+3?+9333310!# ! 32#"^'eKFdJHjjv  D@#  KY   LY ?+?39/+39333331032654&###! !|z|l\tyHd $4@ &% LY LY?+?+9993310#"'532654&'&&54$32&#" da|ȤLÙtx0nFM/6l[RrNQВ\ReS9QH;Cth%@ LY?+3?9310!#!5!!RKR;%@  LY?+?3993310# 533 ;RN cc *@   ??3993333103#366716 6JsA2L0 @@!      ?3?33993333333310!!&&'!366736730 -1 ,#'9h9*@2͝UAVwR 5@    ?3?3999333310!!!!!: RR7V)<,@ ??399393310!#!^Z/BX 8@ LYLY?+9?+993310!!5!5!!X3Cͨq@  ?3/3993310!!!!q)g@ ??993310# J3@  ?3/3993310!!5!!3+/'@?2993333103#yYJsH/33310!5!swjP!  /9910&&'5!E0&,4:F3Zf&I@& $(' JY HYHY?+?+?9/+99333310!'##"&546%754&#"'6632%2655\/PchUHLZ_XeI;ji2"/1`cfJQ@@!   !  FYFY?+?+??9999333102#"'##336"3265t+ p}}fї)ʵƻyff&@  FYFY?+?+9310"!2&# 327fGaᏊ?%,A:N% fT@@!  !  FYFY?+?+??999933310"323&53#'#'26754&#"r ) q|,/wE쑥!Ѱɺf9fG@'    HY HYGY?+?+9/_^]+933310 32!3267"!&&baVp -6%+)"Ȏ#B;@  FY HY?3+3?+?9399310!##5754632&#"!춶|x>WOPI`nHHĽ)ccHNf+8Cr@=+%>9% 2,%ED"V*%p LRn[H=_Ghplutu3@  FY  ?3??+999333310!#4&#"#33663 ugp 0r~u_lPXk6@"  /_o??/]q933310!#34632#"&E@>EE>@ER%?DD?EE>@Ec?DD?u#ʵȹfTf @@  "! FY FY ?+?+99??993333310%26554&#""32373#467#^~hA h%ʹȻ-1MX,bNf#@    ?2?9?9933102&#"#3366G.26 7f Rctbf!4@ #" GYHY?+?+9993310#"'53254&&'&&54632&#"݆è0nbîLza|<;CZ*8<&JvOJj4H?5Xs'H=@   @  HYFY?+?+33939910%27# #5773!!DVV'{BP;U`ThVUQmR0@  FY?+??399933310!'##"&5332653! 1thoMXV'HR (@    ?2?39333310!33673\:  =ZR}dHsR>@!    ?3?393333333310!&#!33667!36733D :"0 )-7R+qRʐI/F18{!NR 3@     ?3?3999333310!!!!  5}bJR3@    FY ?+?3?39333310!3663!"'532773 0'NJ5DE)Rv7 hDR 8@  HYHY?+9?+993310!!5!5!!/3 -E@'   ?3/39/]39939993104!5265463&&57rgfs[]7SR' $RT?/93103#ٴ-E@'   ?3/39/]399399391056654675&54&'523"_jj{[n}{K\y ')RSdTUe`;1h@@$ RY @RY?o/]+_^]+9910"56323267#"&'&J2{=cBvXY4}:iA}T<=l%7>:o#7^(@   QY ?+/9/9333103!#"&546323!KJHLLHHM8JNOIETQJ@) MYMY  ?]2+?_^]+39333310%#5&54753&#"3267wΞFhKW; =;²%HVU@.   OY MYNY?+3?+9/_^]3+393399102&#"!!!!56655#5346µLzsBPb^RG[-pu':@%"  )( %o/]3299331047'76327'#"''7&732654&#"@ydssby??wcr~Yw@^aa]mhw?Audswbw==wctbba}[@3  PY   PY  ??39/3+39/_^]33+39391033!!!#5!5!5!533HAqv$@ ??99//9399103#3#ٴEs#-9M@,4&.27 !;:72*IY$IY?+?+9933333310467&54632&&#"#"'53254&&'.7654&'MI۹[cDtx=nԆMQ*da=0mm|6E'P+S"*2m6O3DmYPG(3+66&7]ua-FD8AgKg5[% @  /329933104632#"&%4632#"&%C05?@40CC05@B30Cw>7>75@:;>7>76?:dD&6F@(/' 87   #3+#?3?39/]39/]3933310"3267#"&54632&4$32#"$732$54$#"}oxl{7~.sxĊAj^^{$$ۧ߬ 3F7^Zƪݨ!%9!9@ !!#"! ?3]339/39333310'#"&546774&#"'63232655#.vGqqkEEZx6Gm`[\a76ijhoHH8sF}}A<@1XRR+Rh! )@    /329333310%Rde1^a^a`1+#@RY//]+99310#!5!1yHJdD%5]@3  .& 76 "2*"?3?39/]39/]39/3933333331032654&#####!24$32#"$732$54$#"EJLIOCZ^^{$$ۧ߬FAH9}>sZ^Zƪݨ!%/33310!5! m9 @   ?329933104632#"&&732654&#"mXXfJJfhHHhWYFhgGLfh`1 7@   RY  RY/]3+3?+939910!5!3!!#5!rqrij3J'@   ?39?393310!576654&#"'632!uA@3]l^\Jpj;46XywrS-9#9@ %$ ! !?3?39/]q3993310#"'53254##53254&#"'6632QO^_z}siE89a9T=bK_'nM>O}48(%r.;{jP!  /99105667!j9y#4GF==5uR;@   FY?+???39999333331032653#'##"'##3ڒ" 0hO'STZ$>qw-@ KY/+/9/393310####"&563!w>TD39j @   QY/+93104632#"&LHILMHHLINQFGSR-@   @ H/?39/+393310!"'532654'73B76E6?T)PZ!-UX_TJ "@     ?3?999310#77'%3/vXJg[,Yp= %@  ?3]2993310#"&5463232654&#"ϯNXXNNXXNdonnoqmmPh! %@   /3/293310'7'7!g=fQa\^^PQa\^^P<1'&{<\ ?55.H'&{t?57h''<u ?557w^'H@&"")( %%QY% KY"?+?+9/_^]939333103267#"&546676655#"&54632Rf|>lkZRR*Vr^>KJHLLHHM?jPbbKN^7&nIrhZLaO-@JNOIETQJs&$CR&+5Js&$vR&+5Js&$K;R&+5JH&$R-R&+5J>&$jFR %&+55J &$PVm $?55e@6   LY LY LYLY?+?+3?9/+9/+93333993310!!!#!!!!!!#/;7{jr5y&&zs&(CR&+5s&(vNR&+5s&(KR&+5>&(jR !&+554s&,CR&+5Js&,vR&+5s&,K R&+5:>&,jR !&+55/^ G@% LY LY LY?+?+9/3+39399310!!#53! ##!!3 ^no[3͠o IZH&1RR&+5ys&2CwR!&+5ys&2v'R!&+5ys&2KR$&+5yH&2RR &+5y>&2jR -&+55 @  /_/]9107'}HI}E{}FF{}F}y#N@-  %$! !LY LY?+?+99933910!"''7&!274'32&#"Ք^beKǛZcPaNK\tQ^yjR\<R;;s&8C7R&+5;s&8vR&+5;s&8KR&+5;>&8jR '&+55s&<vXR&+5 F@%  LY     LY ??9/+9/_^]+99333310!##33 32654&## ~{3A@"%,--54%1-1(FY1HY?+?+?999333310#"'53254&'&&54676654&#"#4$32}MBZ6-9_\W,̾m:CEywhDGK@oJ3E:3&@>_pGA%1=XJI|T?i57U3HQlisͨZ!&DC0&+5Z!&DvL0&+5Z!&DK3&+5Z&DR/&+5Z&Dj <&+55Z&DP *&+55Zf&07s@?!-4-5' -98!$ -JY$ 4IY44$ 1HY HY GY$)HY$?3++?3++9/+9/+999333339910467754#"'6632632!!27#"&'#"&732655"!4&ZɍJXccx8 #VnC^|p u=LR/1P)"mn}^`aff&Fzdf9!&HC%&+5f9!&Hv`%&+5f9!&HK(&+5f9&Hj 1&+55!&CQ &+5!&v2 &+5!&K&+5X&j &+55f}!'P@+ ")(  GY %GY?+?9/+99/9933310#"54327&''7&'774&#"326}W>XVQTvX𗃗7 ow;+?Qqu&QR!&+5f}!&RC&+5f}!&Rvo&+5f}!&RK "&+5f}&RR&+5f}&Rj +&+55`14@   RY//]+33/3/3933105!4632#"&4632#"&`?@=@D9{Puf<@ FYFY?+?+??9933310"'53254&#"#3366321bB:?in!1rŦ5zxROVy&2MR&+5f}&RM&+5yZ&2NR&+5f}&RN &+5ys&2S+R *&+55f}!&RSj (&+55yV@/ ! LY LY  LY LYLY?+?+?+?+9/+9333310!!# !2!!!!!"327&fmX?s^:@ЁTPjhr55#%fLf)0o@= $-$.$21  -HY ---- *HY 'FY GY!FY?+3+?+3+9/_^]+99933339910 '!"32632!326732654&#"%"!4&狄yB f`TGn ~6 +b`%+(#?¿̋ s&5vR&+5N!&Uv&+5; &59a;Nf&U9 s&5L'R&+5km!&UL&+5d s&6vNR.&+5b!&Vv+&+5d s&6KR1&+5b!&VK.&+5d &6zDbf&Vzd s&6LR*&+5b!&VL'&+5;h&79!';H&W9hs&7LR &+5'N&W8 h?@!  KY  LY?+3?9/3+3939910!#!5!!5!!!!RKR{V'HW@/  @ IY HYFY?+?3+39/+9993910%27#"&55#535#5773!!!!FM]&}AP;!ߪɣhVî;H&8RR&+5m&XR&+5;&8MR&+5m&XM#&+5;Z&8NR&+5m&XN!&+5;&8PR &+55m&XP7 &+55;s&8SR $&+55x!&XS '&+55+;&8Q3+}R&XQ s&:KbR)&+5s!&ZK*&+5s&<KR&+5J!&\K!&+5>&<jR &+55BXs&=vHR&+5D!&]v&+5BXL&=O-R&+5D&]O&+5BXs&=LR&+5D!&]L&+5  !@  FY?+?93310"#4632&/ƒj9]``+#D@$  ! HY FYFY?+?+9/3+3939910"'53265#5754632&#"3#bWH>>PFæNr*:WBNAZgqEoWamNL!.t@3   0/@ H%KY ,LY,,@ H@ H?3/+]9/+]99//+3++9333310#!#&54632&'5667!4&#"3326K‰Lkg uQ pp C9<./<32 -9j>m:nf{y/4k&P5'*3773299Z&.:F@D8>2 $28'*HG.@> H..5o**?*_* *;5P5`5555A/@ JY HYHY?+?+?9/+92_^]2^]q9/+933333310!'##"&54$%754&#"'6632%2655567!"&54632"32654&\/CvfeGVL`hX1bL-;hhdg5555566WW;ij**00`h`NM9[f @xkhywhmxM55655655s&vuR&+5Z!&vA&+5ys&v%R-&+5f}!&vh,&+5d; &69b;f&V9! (@     /229333310&'#567!F{igz??IkgMin! (@    /329333310!&'5367~gAWa!|.iZ]dS#/39910!!#$@   /2]2993310"&'332673^,QSie ٟ09B?   /93104632#"&E@>EE>@Ew?DD?l>13<@/1>o.@@.2=I1=P >7<9;::;u8=;::J&$T ?59j @   QY/+93104632#"&KIILNGGMKNPIHPN'(T?5'+T?5',T?5&2JT?5'<T ?5N&vLT#?5&U ,&+555J$%%@ LY?+?9910!#%/((BX=B+y:@  LY LY LY?+?+9/+93310!5! ! 32#"FeKFdLotjjvJ,. (@   ?3?39333310#!#& "A,jJJ01L1 :@   LY LY LY ?+?+9/+93310!!!!!5Rm^ y2%%@ LY?+?3993310!#!#!%{d3Lj C@#    LY LY?+3?+393933310355!!'%!L1!9;h7<b="+a@7+"" ' -,$$KY+ +KY! P `    ??99//]3+3_^]3+3933391032654&##5#"$546$335332###"33˽1!;= 1ʷh;mD@@   LY ??339/3+393339910!### 333332653D11H !7ɫD?@#   ! LY  LY?3+3?+9333310"!5!&5! !!5654&#ܓnl>>lqjkP$Yjd):>&,jR !&+55>&<jR &+55fh&~T'5&+5Th&T-&+5uh&TX&+5h&T&+5&U? 4&+555ff +J@') "-,* FY& FY FY& ?3++?+?99933993310%26754&# "323673327#"&'#^~Ox5 )",(O_hs α}, ,USa3Re9< NY%M@)#'&FY FY FY ?+?+?9/+993333102#"'#4$ 3 4&##532654&w̄ +\Hй4,A4NwmtLR6@   ??39993339910#4733>3P8.LD #)f*8VFJ9"Nmf{)B@"!$+*!! GY'FY?+?+93393339910&54632&&#"#"$5464&'326ڼi`UaOWtǬUpwĉ-B+;C8:lSlӲr>*ȏyTf#M@+  %$##HY #### GY GY ?+?+9/_^]+993310#"!27#"$54675&54632&&#"3{ܳNoG쑘SRVKi 6ȈO0LGf{!@@  #" "GY?+33?9393333310#6654&&'&&547#!5!Ʌ;L(`Qt,#7u=M1!%!& ZmA tuf2@   FY  ????+99933310#4&#"#33663 ulq! 2pzROVkfo+ ?@ GY HY  HY?+?+9/+99333310!"!22!"!&o %  kuj  R @   FY ?+?99310327#"&5Y[%zBRR!">@ "$#  FY FY?+?+?939333310#'&&#"5632327#"&'&'#-%]Q85DRge6B<*/R#Zn%B #=+cO ANJ Wi+uRw9R (@    ?3?293333103363# BRS֧<f{-b@3 %&&))# #/. ,, &HY &" GY ?+33?9/+99393333399104675&5467##5!#"33#"#6654&'$fێB-?6k:Khs\0 ѮR,@   GYFY?+?+39310327#"&5!57!+Y]e~ )NdTR+@  FY?+?399333310"&332654&'3~(' \mۨyfd!F@$   #"HY  GY?3+3?+??933929910$46324&#"66ܰ\L;Vm_%- tzw,9 $0\ H@) "!FY FY?+?+??9329391023327#"&'#&&#"56G_F,o)G#M@,2AZz7H3-+L\.a{'!XF ~e~]PLC@"  GY ?3+3??3?93333399106654&'3#$3*E㝫q& )Ѻ loR%K@%$ '&$ GY!?2+3?39/993333933310"47332332654'3#"'#8>B;neݲfm=@?6I I* / &j #&+55&j/ +&+55f}h&RT1&+5h&T9&+5oh&T/&+5>&(j R !&+55D@% LYLYLY?+?+3?9/+933310"'5326554&#!#!5!!!2gITKWOhwHrbal]=ȵ%s&avoR&+5y:@ LYLY LY?+?+9/+93310"!!327# 4$32&&FX ݡGZ}BAoU^7#d 6J,:>&,jR !&+55dh-b#L@)%$#LYLYLY LY ?+?+?+9/+9333310!!!#"'5326!3 32654&##b2EZmIB96HSf<w#RqV}_w@q~xl}N@)  LY LY  LY?+??39/++933399310!!!#3!33 32654&##}/u!TqVmVBq~vn;@ LY  LY ?+3?39/+933310!4&#!#!5!!!2_p)'h_=Ƕ#s&vR&+5 w&6PR&+5m% 0@  #LY?3+??3933310!!#!3!3%AHmJ$ =@  LYLY LY?+?+9/+933310!!!!3 32654&##W|s@ȏH{eq~yk%%a m E@$    #LY LY ?+33?+?39333331073!3#!#! q:sy Lmz(#L@)       ?33?33939333333310!3!!#!/-<<> X%C@$ !'&KY ##KY# KY ?+?+9/+993310! '53 54&##53 54&#"'6!2`ܯad㰥jgm1`O.2tz]l8C2@    ?3?299993333331033!#47#!  w+Jjw&6R&+5# 6@     ?3?393393333310!!#3!#P<> /@ LY LY?+?+?93310!#!'"'5326! `O_IB96HQaCV2P 0B+y2%n3y&h7 1@   LY?+?39393310#"'53267!3673Utcbk[{2e0 IP'Yt/#h#9b=s;m 2@  #LY?+3??3933310%3#!3!3%8@  LY ??39/+999933310!##"&5332673kq_H0*óRrp#+ 1@   LY?+3?33933310%!3!3!3Jmb;@   # LY ?+33??339333310%!33#!3!3FF 9@  LY LY LY?+?+9/+93310!!!5!3 32654&##FOP$@q~vnH =@  LY LY?+??39/+9333310!!33 32654&###3_%?s~wkf 2@ LY LY?+?9/+9933310!!33 32654&##8'ɡîBq~vnB:@ LY LY LY ?+?+9/+93310"'63 !"'53267!5!&&VFhdc\V^wuA%G@&     LY  LYLY?+?+??9/+93333310! !#3!! 32#"BL5TucDm-@t s D@#  KY LY?+?39/+393333310!$4$!!##"33𾗡Ja7JJkyvZfDhy#"=@ $# GYFY?+?39/+9933310%6%36632#" #"h! 9iAzgr9*(2S[hXL8\1R V@.   HY  HY  HY ?+?+9/_^]+993333910#!! 4&#!!24&#!326h倈||gfvz7)iRPCuB;=sR@GY?+?99310!#s RfR#yR E@$    " HY  GY?+33?+?393333310#!#36!3!# Zv wyWyy=dpf9fHmRL@(      ?33?339393333333331033!#!3M:;N911;Hf#M@+  #%$"##"HY #### GY GY?+?+9/_^]+9933102654#"'632# '532654&##5LՅsčGJHO:$cEVOQSNR2@      ?3?3999933333310!#467!+ RcZ-./R%&6h&+5R 6@   ?3?393393333310!!#3V7"R1R5R/@ GY FY?+?+?93310!#!#"'532!5_zM4%%fu!pR:@  ?33?39933333310%767!##&'#!# )9-2*7 0P\}&:jhR 2&+55s&Zj 3&+55s&<CR&+5J!&\C]&+5R/399105!R\ǾR/399105!R\ǾR/399105!R\Ǿ1N0@   H H/+3+]2333310!5!5!5!NRR1s@  ?99310'673% f6@%Srs@ ?99310#7d5{E!?@@P/]99310%#730E"׺u@  ?99310#&'7"E5ep\"@   ?329331063#%673#5}ERf6@%Sr "@    ?3293310#73#73s5{E5{E"!+) )@    @P/]3293310%#73#737yB$0B${ >@$   LY??9/+993910%#53%35A53V_{i@C    LY  LYP   ??99//]+9_^]+993910%%#5753%%TV33R--R33V- yz  /93104632#"&zyxx슐 #/@  %$ QY! ?33+3393331074632#"&%4632#"&%4632#"&LHILMHHL-LHILMHHL-LHILMHHL}INQFGSRHINQFGSRHINQFGSRR  $/:Em@< %+6;0A  %+;AGF"88-CCC`33(>?333?3??9/]q39/]333933333333103265#"#"&5!2%#3265#"#"&5!23265#"#"&5!2@HGDH@ժH+@GGDG@ժH9>GGDG>ӪH'J%ݕ%m Rh^@ /9310Rd1^aPh^@ /9310'7^fQa\^^P&6w@ ??333210#ZJh*@     ?3?2399333104&#"#3363 HEEfR IPCfsVeAB%L@)  PYMY  MY ?+?9/+9/3+393910!!##53!!!!7죣@-KJX"z@D   $# PY/  PYMYNY?+9?+9/3+3_^]2+3933333333102&#"!!!!!!5667#535#53546ŮL{yaV PCەTz\'c@5 # )(PY MY'MYOY?+?+?9/+9/3+3933333310%27# #57733#!##! 32654&##OBIL}>j<==%%AXLf,L@) & !*.-( $?3?3??9/39/q393333310##"&546323254#""&54632&#"327+!UGn_.XKmWLJrK+%%)P$I@$"  &%"  ?3?39/399999/93993310%2673#"&5556746324#"66JW DvjPem:4olhfĴǚK]6'+Y@/"  )*-, (%()((?333?39/]329993333333310!!##!3&53#"&5463232654&#"5! R  #HTQHHQRJ?q' kllkliiL@'    ?3333]2222339333333310##5!###33#7#w)LٲғPwX/DvfH5@  ! /??3/299/]3933310"&546632!3267&&#"y1RQHbٓ2Xz#5Fi)|5BuAP'&{@ ?555-j''@u ?555Ph'&=@ ,?555VL'q'@? ?555PL!D@#  #"HY FY FY?+?+9/+993331074&#"5632!"&54!2&#"32XyyG"GJy ^Llm/ 7@    LY?+99?993333107!!!&&/uF+!.+Ӌ٭_@#3$@ LY?+/3993310!#!?k}#<m9# D@#   LY LY/+9?+99393331055!!!9]fy#o5`y1+@ RY//]+99105!`y%.@  //39/33293331010##5!33s1+@@$)  #-,# & ?   /]333223993310#"'#"&54632632267&&#""32654&1zx|8_0-^>EPR6_2-a;CTV͈öOUQQ^FHZBOSRR\HHZ!@  ?2?393102&#"#"'532546`>CBLDbBO:iV \q3/.q@B'0/&) RY @RY)#RY)) )@RY?_/]+_^]++_^]/+910"56323267#"&'&&"56323267#"&'&&H57mHH\5~8fCsXGc349jFyRIb05|:eEvSU_A7o#7?:l%@9l"?:m##`1 U@4  RY   RY / O o  /]+993+9939910'7#5!7!5!!!!!`RgG dhEѲݳGӳݲ^1  %@  RY?/]/+9310%5 5!1/#-y?`1  '@  RY?/]/+931055!`#//XyRbF 5@    ?/99333333103# b^=^H!))#&IL#z&IO% @   /22993310"&'332673F +QSbf ٙHP#WdR @  FY?+?93310"'532537jFDGs@  ?99310673#s/Z+垑>Bf; @  /993106673#f+\*T@BP8f! @   /99310#56673- ]+5GM;'7  @   !?3?399331032654&#"!"&5!2@HHCCHH@J5J >@    ?3?9/]333393333310##5!533!547}x}4$CͲadh6H7-@  !?3?39/39333102#"&'53254&#"'!!6jK*1;gX=PT#2s{ )GM+' +9#6@! %$ !?3?39/]3993331032&#"36632#"&2654&#"+K63F !l@NARGHC_T04?PMEQJ5Qc9J @ ?3?93310!5!XCyJ՗{/7".?@" ),&0/)  # !?3?29933339102#"&5467&&54632654&'"6654&u]SJTG:GIJG`H;>8=8A1?;ygK-nGsuFm,1^Dg}j4CC49KG5,)><2,5'9#8@! %$ !?3?39/]39933310#"'53267##"&54632%"32654&N33E !l@ARGHC_T;04?PMEQJ5QcT #'+/37;?CGS[kt|@[p`zglvvkXHTN $%()DE01<=@A   #-.478;HN`gk}ZQVKuOlll\vkt\}KkQ\pkk@5 HkO\\ %&)*12=>ABEF\k,-  !4589 //39399/]/+]3339/q33339393933333310!#%5!#533!5353!5!!5!5!#3#35!#35!35!#35#3#3#"&546323254#"%32##32654&##32654#"'53253T/0momImmmm0oowoooomm~smp.,=.m^{B.$*/;J1%Z^4+V}i0oo/mmmmmmoo;mmJoooo/yhIaCS1DD5QYb" "+%J fVr_cT*8@ % ,+(""//9///339333310 54676654&#"63232654&#"TV,AgIOGRZ?>1HT;GFBIHCHEVW/2A1R~X8*P:/5K6DpJ;?HI>@IH!&7L&+5j=)+4i@8,)2$ $+65,*+*HY ++' GY''/GY'GY?+?+9/_^]+9/3+39333333310! 4774&#"'6323 5'&$&5463 3%&&#"` 1+7r}_\ mfNȡ̵YoLT#&<Q,7->fS/de?Y['**odžLB~6@ KY?+??933933910>32&#"#!ZqJ]??:#):XyV&TW(4c/#!R'X@.' %  )( GY"GY?2+3?+339/9933393310"&547!57!##"'#325332654'sb`ZMM^cnZ[khXdTá|u&0vT&+5!&Pv-&+5J&$[TZf&D[&23\ fB 2@ _   /q3]q]2993310#"&546324&#"326Bkjjl<./<650:h|zhh{d3773299h'@  ?93310673#%467#"&C=lƌ~BA")"96ۆ+Ќ .GD%½@@  @ KYLY?+?39/+9933323106653! 53! ;NJawZNd VVM@&   @ JY FY?+??39/+99933332310!'##"&53326536653!1thoOJbvMXV'wc4!C!vR /210#'6654#"5632 KIm<8DIӓ'] 0,Id y} /104632#"& E@@CD?@E?DE>;FEs&(CR&+5s&C^R&+5f9!&HC%&+5!&C&+5}2N@(++(0 # (43))  LY-&&LY ?3+3?3+39/99333910"'6632!"&'# 32&&#"3273324+XDX75!#&&####"!p/bdwl=)jJ#!Mf*32&#"#SM_nn=5eNFjkvǰᰦnDKKT\6B-4+e3am.3-' v~uw`i{u!M5]I- LN*TXGk@<.7 >D**<@2D   IH, 2332HY,33'D>A@ H>@>9HY>'GY'"?+?3++299/9+93933333102&#"32772&&#"#"&5%$54&##532654#"'67&'53>9@-/-]&|уqTc-H\Uf T7Ew+uLvFuNHW_X F9d9%d'(/-) SLGJH6U|7YM+mDuy ?@ LY LY  LY?+?+9/+99333310! ! 267!"!&&eKFdTƽXtjjvuHf}f ?@ HY FY  FY?+?+9/+99333310#"&532267!"!&&} ++Ќ .{w4@    LY?+??993333210"!367>32&6H.9:>32&#"!O 2l,JeSA/!+.3RJ5IGr3 HAws&vR )&+55!&v +&+55y  ,R@,, ! !'.-,  LY LY$)KY$?+?+?+?3?3933339310! ! 32#"%!3673!"'53277uH94Gž\1:(MJ5DE)zqp~{b}Ss hff *T@-*  %,+* FY FY"'FY"?+?+?+?3?39333393310#"&532! !"!3673!"'53277}攅166)KO7DE'+Ќ .{pa]q hy%/*O@*$( ! ,+LY$&( (LY ?33+33/33+339333310#"'$%66326632654'#"'%vx/ J86J1NF3g$"ki&y)qq&=<'>00>'{(-#P()RP)f)P@+"(  +*GY"%( (FY ?33+33?33+339333310#"'&547663266326'#"&'qt B62B h:85;=8;<+%ik$% "3''5$;(&(&<;3>-++->yd.BSp@?9:JC,  &0:CGO UTB1Q1:: ::F6=GFFLY)##LY ?3+3?3+3_^]229/^]33/39333310"'632!"&'# 32&#"3267324#".#"#5432356654.5432Pl@=# F?45#(+5?CK RQ*+N+55199@ H9CB  GY FY&?2+3?3+32+_^]29/33/39333310"32&#"3273265#"'632#"'#".#"#54632356654.54632ZيkGXJτu3~Q3O"Hpllcs[*3+y:qwNy;:!)!A8BK'#9/f+?ȿ9XXȝ#*#7<'vz%-%[}N7-/Nj#0>g@9(('. ! '147;> @?6::>@ H>84<@''LY+$$LY ?3+3?3+39/22+239333910"'632!"&'# 32&&#"3273324#'##'##'5+XDNsMXiPEU+Ʒmb]xƚP-21+1/-P,_c?=B:vSx_-L\P-#32#54#"##5Nwp;|h*\ra%-%xx)X#)#F@ /93104632&&MB9@6:<|AO0-* 7P}F@  /931056654.54632|;:!)!@9BKV|P7-0O) (6DR_m@8 7D=>S_YZ(!" )6/0`mfgERKL "(06>DLRZ_gmon)"0@ H03,,%3mZSf@ HfjVcc\jE>7L@ HLO:HHAO3jOOj3 @ H  H /3+2/3+29///333+2333+2333+29333333333333333310&&#"#632&&#"#6632&&#"#6632!&&#"#6632&&#"#6632!&&#"#6632&&#"#632!&&#"#6632o(+/2@# / :7+2 77 2+  //9//////]]]910#6736673#&'5&&'5'76&'7'677'&&BF$a5Ia4GA݁ZBO݁C?b~C7`#WCGaC)`Z1BO݁GA܂!Ia5F$a5D.`NDKb:;D4`ND6b2mw'e@6'!    )('   @$ # LY?+???32_^]29993333333331033!!!#4>7#!#"&'33267 $ Xtge Z;TU]\J.jwfU\_{% g@6  "!  @ " GY ?+???32_^]29993333333333310!3##47!%"&'332673+ Xvcf R*Zd/hRfU[`/O@*  LYLY  LY ?+?9/+9/3+3939310!!3 !!#535332654&##@".c DȪs~um wW@/  IYHY HY?+?9/_^]+9/3+3939310353!!!2#!#4&##!2 P {)SB]@2      LY  LY ?+?9/+9999999333910'###! 327'7654&##jdh}`{72RoT;cnaA{f'a@8% "#! !)( #"   FY FY?+?+??9999339310"'##33632'"327'7654&t# nhw;'nh>}Dh=>e#ʵfY/+ :@  LY  LY ?+?9/3+3939910!!##53!!dj7o R :@   GY  FY ?+?9/3+3939910!!!##53! T디=ö)I@(   LY   LYLY?+??+9/_^]+933310"#!!632#"&'532654&N>`pj(fE{T 6 ؟1 BR?@" FYFYFY?+?+?9/+933310"'532654&#"#!!63 qnmv|9:V< 89 ZR m\@2     # LY?+??3?33939333333333310!3!3###!/<<>{R\@2       " GY ?+??3?33939333333333310333###!3MBw:;NRy11=X+&{H+f&mA@$      #LY?+???399333310%3###367!5basFxo>yRF@$      "GY?+???3933933333310!3###3V7Tn"Ry1RC@$     ?3?3993333333310!!##373!}}PfFeRQ@*     ?3?393399933333333103!!#'#37cH`uR/K@* LY  ?3?399/3+39393310!!##53533#67!5ﴴbasN˝xo> Q@.     IY  ?3??9/3+399393310353!!37!!## ] NCfMȦd%h @@#      LY?+?3?99333310!!!#!<M35Ds9R A@!      GY ?+?3?933933333103!#!5!6!BR1m)D@$     LY   #LY?+???39/+93333310%3##!#3!3B^mV{\RD@$    GY " GY ?+???39/+93333310!33##!# RDd#R ?@!   LY   LY ?+?3?9/+9333310!#!#3!!^;mVR ?@!   GY   GY?+?3?9/+9333310!!!#!# KRDf#RZ M@*"!LY  LY LY?+?3?+9/_^]+9333310632#"&'532654&#"#!#!dZMfH5֛/ RC@$ ! FYGY FY?+?+?39/+9333310%#"'532654&#"#!#!632kˊlfst|)54:~?8; XhR# y*6m@;4 %+1%%874".  ((.KY(( (( LY @LY LY?+?++9/_^]+999993339910327#"'#"$5!2&# 327&546324&#"66{o=JN@$#  ('#@ ##HY ####" HYGY?3+?+?9/_^]+99_^]933333310&'$5473336$32!!267#"!4&ٽ d+ 6ggdr $R;*@Z#-?9J,#w&6BR&+5m%&6&+5bE@%   !  KY LY ??3?+9/+3933310"#37!32#"&'532654$ar*XQJ>R֜/ RB@# FY FY?+??39/3+93333310%#"'53265!"#3!tԍjol|Xe/?8;ksRmD@$ #LYLY LY ?+?+?+?93333310%!!#!'"'5326! `O_IB96HQaCV2P {!RD@$ "GYGY FY ?+?+?+?93333310%3##!#"'532!3_{R/%%av#qB=@  LY LY?+??39/+9333310%#"&'53265!#3!3BcG^w/mV R=@     GY  FY?+??39/+9333310"&'53267!#3!3Lp6mnvr ;#RDmFI@'     LY   #LY?+???39/+933333310%!!#!#3!3B^mV{uRI@'    GY " GY ?+???39/+933333310!33##!# RDd#RmH@%     LY  #LY?+??39/+999333310!##3#"&5332673͇kq_mdw0*óRrp#+yfRH@%  HY  " GY ?+??39/+99933331032673##3#"&5wU]޿akRl/4y=<9mU@.      # LY?+33??3993333333310!##!3!!!#467#9XQR IYu12x={RQ@*     " GY ?+33??39933333333310%767!3###&'#!# )9-2*7%0P\d}&$jJR %&+55Z&Dj <&+55Zfw&(6R &+5f9%&H6&+5=@   LY LY LY ?+?+9/+933310"5663 ! 5!&&267!Qz{- w=2otH`=f=@     HY GYHY?+?+9/+933310 #"55!&&#"566267!'Uq f R'$8>&jR /&+55`=&j 0&+55#>&j3R '&+55m&j '&+55X>&jR ;&+55H&j 9&+55BPH@&  KY LY KY ?+?+99/+3933310!5!! '53 4!#))cgnPLͪ> O.2)RH@&  HY GY FY ?+?+99/+3933310!5!#"'53265!#A^^iy1ДyL,.-&MR&+5&MR&+5>&jR &&+55&jX $&+55y>&2jR -&+55f}&Rj +&+55y ?@ LY LY  LY?+?+9/+99333310! ! 267!"!&&eKFdTƽXtjjvuHf}f ?@ HY FY  FY?+?+9/+99333310#"&532267!"!&&} ++Ќ .{y>&~jR /&+55f}&j 0&+55B>&jR /&+55B&j .&+55 &M/R&+5J&\M&+5 >&j5R ,&+55J&\j *&+55 s&SR )&+55J!&\S+ '&+55>&j`R )&+55f&j (&+55m- /@   #LY LY ?+?+?93310!!3##l{sR /@   "GY GY ?+?+?93310!!3## RH>&j'R -&+55&j -&+55/D+& DR&D>&;qDR&[I@)    LY ?3?39/33+339333310!!!!!!!!w/} RR}1^X+mVNRE@%   HY ?3?39/33+3393333103!!3#!!#m  JG}=%boL 2@  LY LY?+?9/+99333103! $54$!3#"33\\,!ȫJnx}pfTGo"R@) ""  $##LY# LY?2+3?9/+9/993339310"&54$!333253#"&'#"3265?+s+gnjwR#SHz_Sf+R@+# )-,  'FYFY FY?2++?+?9/99933339310"323&5332653#"&''26754&#"Dm ^ifZy@:h~v)1pLywfv|GaPZ!ү}3)P@* !( !+* %KY* KY%LY%?+?+9/+99/933310#532654&#"'6!232653#"&'4wY\w`gi`tah3=~lp|+Df&P@* %"%('!HY'GYFY?+?+9/+99/933310%2653!"&'&&##532654#"'6632fe\XѧI_zj}v|qg[GJH*%9ue3m!"J@(   $#KY # KY  LY ?+?+?9/+99333103##4&##532654&#"'6632ύwc f"r}v`ipHLN{fJ@(  ! HY " GY GY?+?+?9/+99333102654#"'6323##4&##5ᶠL~rGJHO9 !i9XVZ!C@# ! !#"!!LY! LY LY?+?+?+9/93331032653#"&5!#"'5326_ff_/FZmIB96HSf<i^rz+pz_wRC@#GY FY FY?+?+?+9/93331032653!"&5!#"'532![g`]\_{R/%%av#}idv|qqK@&    LY  LY?+??39/+9/93333310 !#3!332653VyZdf[mVjarz+RK@&   GYFY?+??39/+9/93333310!332653!"&'5!#^d^[^RD+idv|qd#Ry:@ LY LY LY?+?+9/+93310!! 4$3 &#"32655!NwQVhBcSc\ff:@ GY FY GY?+?+9/+93310!! !2&&#"3265!-G$KJMjO),R"(Š+9@ LY LY ?+?+39/9331032653#"&5!5!!cdd`ZEPjasy+n+R9@  GY FY?+?+39/93310"&5!5!!3253?^f!jeb&C@$  #('$KY LYLY?+?+9/+99331046632&&#"!3#"! 7! $54675&&~휚qrbfh ĸ̻^j]FL?8e`zv^MƓTf!C@$#"!!HY!! GY GY ?+?+9/+993310# !27#"$54675&54632&#"3Ǽ{ڳHVKi 6ȇOHLGD&DR&DyJ&$gZyf&DgJ&$fR&+5Z&Df+&+5J&$wR &+55Z&Dw -&+55J&$xR &+55&Dx 4&+55JJ&$yR &+55Z^&Dy -&+55Jb&$zR .&+55Z&Dz E&+55yJs&$'gKBR &+5Zy!&D'gK7&+5J&${ R &+55Z&D{ /&+55J&$|R &+55Z&D| /&+55JX&$}R "&+55Z&D} 9&+55J`&$~R (&+55Z&D~ ?&+55yJb&$'NBZg&+5Zy&D&Ng'&+5y&(gfy9f&Hg&(fR&+5f9&Hf &+5H&(RR&+5f9&HR$&+5&(wR &+55f&Hw "&+55&(xR &+559&Hx )&+55hJ&(yR &+55fb&Hy "&+55b&(zR *&+55f9&Hz :&+55ys&('gKR&+5fy9!&H'gK,&+5J&,fR&+5w&f&+5Jy&,gy&Lgyy&2gfy}f&Rgy&2fR&+5f}&Rf&+5y&2wR &+55f&Rw &+55y&2xR %&+55!}&Rx #&+55yJ&2yR &+55f}&Ry &+55yb&2zR 6&+55f}&Rz 4&+55yys&2'gKR(&+5fy}!&R'gK &&+5ys&_v!R(&+5fs!&`vu,&+5ys&_CuR(&+5fs!&`C#&+5y&_fR#&+5fs&`f'&+5yH&_RR'&+5fs&`R#&+5yy&_gfys&`gy;&8ghymR&Xg;&8fXR&+5m&Xf&+5s&avR#&+5!&bv(&+5s&aC7R#&+5!&bC&+5&afbR&+5&bf#&+5H&aRR"&+5&bR&+5y&agdy&bgy&<gJR&\g&<fR &+5J&\f&+5H&<RR&+5J&\R&+5f&B!  /2210&&'53!&&'53NDc1Dc163=D63=DN @    /399//310#&'#5673'673#pcra=XTS2E}K[eAYch\rT @  /399//3106673#&'#7#&'53RpMXarjiT{L5Nc)Ae`Fien]N !@   @ H/3+299//310#&'#5673#'6654#"5632pcra=X}h A8Z%#=K[eAYtlGz"7iR$I !!"H!@H ! !/?@H/3+]9///33++310".#"#663232673#&'#56731$IEB(*egR%KF@(*e gxuzc[w:C)!)1g"+1l{EYQMU`T@  @ H/3+99//310673#"&'332673JJ1ZsrP]eWh eft[LIKJT@  @ H/3+99//310#&'53"&'33273psZ1GI  [tk`㝎T.@H /?o/3]299//+310#'6654#"5632"&'332731u^ 91P)$EYe  {f)d 3ZDT%E@ "@"H  /?@H/3+]9///3+3]310".#"#663232673"&'3326731$IEB(*eeT%KF@(*e e䙩\fc\  3!(2by"+1hsC>>C+@`  //]393104&'3#"'5326JEH>"yhFA6.%/6qB8IT-ar-D @    3/299310"'53253QE78mݖDVD @    3/299310"'53253QE78mݖD>/ !@   ??999310!#47'3NwcDRmH} (@  MY &MY?+?+993310#"3232654&#"H535Ϻ5h !@   ??999310!#47'39DwČ<1{M5 }+@ MY&NY?+?+93310!!5>54&#"'6632! +[)ne^P}x|側n{YQ5GPLAhTv| V-}&C@$ "('OY $$MY$& MY %?+?+9/+993310!"'532654&##53 54&#"'6!2]`^zwUcs !P.2~uo^f2@oh A@"   OY $??9/33+39933310%##!533!47#o_T-Psm:8Vp7u)h<@  MYNY MY%?+?+9/+9333102!"'53265!"'!!66JLZ:(i8!#eDP-4 >^?J=h+@$NY?+9?93310!5!BΣX9V7}%D@#" '& OYMY&OY%?+?+9/+9933310!"'532##"&5432%"32654&&7:YZ 9sޜ~zy{wD}PVYQ}`Y[#)&IIV#4_@12-00/4$,+&(() ),/65 0,$))*2-&*?3333/3]2222/999333333333310#"'53254&&'.54632&&#"##33#7#/zNqfw'TQF"ogn+*N20=5UuI۰Ӕ`q%/V!%$7H4Yn.p)%&/"3\wX/h&7zd'H&WzfTf &J@'  !'(!#GY FYGY?+?+99??+99333310%26754&#"7##"32373!"'53265\} mv 䃕)ȷĽ- 4DVfT!&K3&+5fT&N'&+5fT&OF0&+5fT!&:w+&+5??91033Js&CR &+5s&vIR &+5s&KR&+5r>&jR &+55H&RR &+5z&MR&+5Z&NR&+5L+&Q5L&OR &+5h&-qN'Tr>&jR &+55r>&jR &+55+&fR&+5y&g2I6$$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs) $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q  q q q           ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q   q   q    q q  q  !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) -&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq7$&q&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq$q$ q$&$*$- $2$4$7q$9$:$<$$$$$$$$$$$$$$$$$$$$$$q$&q$6$8$:$G$$$$$q$ q$_$I$K$M$O$Q$S$U$W$Y$[$]$_$o$q$s$q%%%$%7%9%:%;%<%=%%%%%%%%%%%$%&%6%8%:%;%=%?%C%%%%%%% %X%%%!%#%%%'%)%+%-%/%1%3%o%q%s%&&&*&2&4&&&&&&&&&&&&&&&&&&&&G&_&I&K&M&O&Q&S&U&W&Y&[&]&_'''$'7'9':';'<'='''''''''''$'&'6'8':';'='?'C''''''' 'X'''!'#'%''')'+'-'/'1'3'o'q's'(-{)))"))$))))))))))C)) )X)))!)#)%)')))+)-)/)1)3.&.*.2.4....................G._.I.K.M.O.Q.S.U.W.Y.[.]._/\/ \/&/*/2/4/7/8/9/:/</////////////////////////$/&/*/,/./0/2/4/6/8/:/G/////\/ \/_/a/I/K/M/O/Q/S/U/W/Y/[/]/_/a/c/e/g/i/k/m/o/q/s/222$27292:2;2<2=22222222222$2&26282:2;2=2?2C2222222 2X222!2#2%2'2)2+2-2/21232o2q2s2333$3;3=3333333333;3=3?3C33 3X333!3#3%3'3)3+3-3/3133444$47494:4;4<4=44444444444$4&46484:4;4=4?4C4444444 4X444!4#4%4'4)4+4-4/41434o4q4s47777")7$q7&7*727477)7D\7Fq7Gq7Hq7Jq7P7Q7Rq7S7Tq7U7V7X7Y7Z7[7\7]7q7q7q7q7q7q77777777q7\7\7\7\7\7\7q7q7q7q7q7q7q7q7q7q7q777777q7\7q7\7q7\77q77q77q77q7q7q7q7q7q7q7q77q77q77q77q7777 77q77q77q77q7777!7$)7&)7+7-7/717375777<7>7@7Cq7D\7F\7G7Hq7J7777777 7W7Xq7Y\7_7`q7b7q7\7q7 \7!q7"\7#q7%q7&\7'q7(\7)q7*\7+q7,\7-q7.\7/q70\71q72\73q74\76q78q7:q7<@<C<D<F<G<H<J<< <W<X<Y<_<`<b<<<< <!<"<#<%<&<'<(<)<*<+<,<-<.</<0<1<2<3<4<6<8<:<<<@<B<D<I<J<K<L<M<N<O<Q<R<S<T<U<V<W<X<Y<Z<[<\<]<^<_<`<b<d<f<h<j<l<n=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_>-DD DD EE EYEZE[E\E]EE7E<E>E@EEEE EpF)F )F)F )HH HYHZH[H\H]HH7H<H>H@HHHH HpI{I {I{I {KK KK NFNGNHNRNTNNNNNNNNNNNNNNNNNNNNNNNNNNNNHN`N6N8N:N<N@NBNDNJNLNNNRNTNVNXNZN\N^N`PP PP QQ QQ RR RYRZR[R\R]RR7R<R>R@RRRR RpSS SYSZS[S\S]SS7S<S>S@SSSS SpURU RUDUFUGUHUJURUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUDUFUHURU RUYU`UU U"U&U(U*U,U.U0U2U4U6U8U:U<U@UBUDUJULUNURUTUVUXUZU\U^U`W)W )W)W )YRY RYYY")YRYY RY ZRZ RZZZ")ZRZZ RZ [F[G[H[R[T[[[[[[[[[[[[[[[[[[[[[[[[[[[[H[`[6[8[:[<[@[B[D[J[L[N[R[T[V[X[Z[\[^[`\R\ R\\\")\R\\ R\ ^-q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq-{&*24G_IKMOQSUWY[]_-{-{-{-{$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjln$;=;=?C X!#%')+-/13             YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p   YZ[\]7<>@ pR R")R R  YZ[\]7<>@ pR R")R R q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  &*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_$79:;<=$&68:;=?C X!#%')+-/13oqsR R "@E=K=N=O=`={R R$79:;<=$&68:;=?C X!#%')+-/13oqs-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p  &*24G_IKMOQSUWY[]_FGHRTH`68:<@BDJLNRTVXZ\^`FGHRTH`68:<@BDJLNRTVXZ\^`\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqsR R "@E=K=N=O=`=R R\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs  $79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs-{R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`$$$$")$$q$&$*$2$4$7)$D\$Fq$Gq$Hq$Jq$P$Q$Rq$S$Tq$U$V$X$Y$Z$[$\$]$q$q$q$q$q$q$$$$$$$$q$\$\$\$\$\$\$q$q$q$q$q$q$q$q$q$q$q$$$$$$q$\$q$\$q$\$$q$$q$$q$$q$q$q$q$q$q$q$q$$q$$q$$q$$q$$$$ $$q$$q$$q$$q$$$$!$$)$&)$+$-$/$1$3$5$7$<$>$@$Cq$D\$F\$G$Hq$J$$$$$$$ $W$Xq$Y\$_$`q$b$q$\$q$ \$!q$"\$#q$%q$&\$'q$(\$)q$*\$+q$,\$-q$.\$/q$0\$1q$2\$3q$4\$6q$8q$:q$&@&Cq&D\&F\&G&Hq&J&&&&&&& &W&Xq&Y\&_&`q&b&q&\&q& \&!q&"\&#q&%q&&\&'q&(\&)q&*\&+q&,\&-q&.\&/q&0\&1q&2\&3q&4\&6q&8q&:q&(@(Cq(D\(F\(G(Hq(J((((((( (W(Xq(Y\(_(`q(b(q(\(q( \(!q("\(#q(%q(&\('q((\()q(*\(+q(,\(-q(.\(/q(0\(1q(2\(3q(4\(6q(8q(:q(8@8C8D8F8G8H8J88 8W8X8Y8_8`8b8888 8!8"8#8%8&8'8(8)8*8+8,8-8.8/808182838486888:8<8@8B8D8I8J8K8L8M8N8O8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8b8d8f8h8j8l8n9R9 R999")9R99 R9 :::"):$:&:*:2:4:D:F:G:H:J:P:Q:R:S:T:U:V:X:]:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::!:+:-:/:1:3:5:<:>:@:C:D:F:G:H:J:: :W:X:Y:_:`:b:::: :!:":#:%:&:':(:):*:+:,:-:.:/:0:1:2:3:4:6:8:::<:@:B:D:I:J:K:L:M:N:O:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:^:_:`:b:d:f:h:j:l:n;&;*;2;4;;;;;;;;;;;;;;;;;;;;G;_;I;K;M;O;Q;S;U;W;Y;[;];_=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_?&?*?2?4????????????????????G?_?I?K?M?O?Q?S?U?W?Y?[?]?_CqC qC&C*C- C2C4C7qC9C:C<CCCCCCCCCCCCCCCCCCCCC$qC&qC6C8C:CGCCCCCqC qC_CICKCMCOCQCSCUCWCYC[C]C_CoCqCsCqDD DD E-{GGG$G7G9G:G;G<G=GGGGGGGGGGG$G&G6G8G:G;G=G?GCGGGGGGG GXGGG!G#G%G'G)G+G-G/G1G3GoGqGsGVqV qVfVmVqqVrVsVuVxVqV qVT[[[V[_[b[d[i[p[q[r[t[u[x[[[ [T\\\V\_\b\f\i\m\s\v\y\z\{\|\}\~\\\\\\\\\\\\\\\\\\\\ \!]q]r]x]T^^ ^^ _q_ q_f_m_qq_r_s_u_x_q_ q_T```V`_`b`i`t`` aaaaV\a_\ab\afai\amasavayqaza{a|a}a~qaaaaaaaaaqaaqaqaaqaaaaaqaaaaaaa a!aSbqb qbfbmbqqbrbsbubxbqb qbTdfdmdsfffVf_fbfdfifpfqfrftfufxfff fThfhmhshhiqi qifimiqqirisiuixiqi qiTmmmVm_mbmdmimpmqmrmtmumxmmm mToooVo_obodoiotooo qqqqV\q_\qb\qfqi\qmqsqvqyqqzq{q|q}q~qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq q!qSrrrVr_rbrfrirmrsrvryrzr{r|r}r~rrrrrrrrrrrrrrrrrrrr r!sssVs_sbsdsispsqsrstsxsss sTtftmtsttuuuVu_ubufuiumuu vqvrvxvTxxxVx_xbxfxixmxsxvxyxzx{x|x}x~xxxxxxxxxxxxxxxxxxxx x!y){{ {{ || |||| ~) y~     y~ y~         y~       n| q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqql~    n|   n|   n| l|~  qff jlrqs~ffqqq q  q q qqq qn|q qq  r|  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq)l|~    l|~   rsz|  rsv  l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqqqff jlrqs~ffqqq q  q  rsz l|~  ))  n|   n|  rsz|  rsz|   ) js      j  )j       js   s  j        m  m         js    m  m  j   sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R 7$&q7$&q7$&q$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q                        q  q  q                             ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q    q    q    q q  q   !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) & * 2 4 7q 8 9 : <                         $q &q * , . 0 2 4 6 8 : G f m qq r s u x  q  q   q  \ q        T _ a l |\ ~        q    q    q  \  \    \     \        q  I K M O Q S U W Y [ ] _ a c e g i k m o q s q!q!r!x!TSSSS TTTVT_TbTfTiTmTsTvTyTzT{T|T}T~TTTTTTTTTTTTTTTTTTTT T!XqX qX&X*X- X2X4X7qX9X:X<XXXXXXXXXXXXXXXXXXXXX$qX&qX6X8X:XGXXXXXqX qX_XIXKXMXOXQXSXUXWXYX[X]X_XoXqXsXqYY YY ZZZVZ_ZbZdZiZpZqZrZtZuZxZZZ ZT`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`RbIfbWfbYfbZfb[fb\fbfb%fb'fb7fbfbfb4fb5fb]fb^fbpfbfbfjj jj llllllllllllllllllllll lrlslzl|lllllllllllllllllllllllllllll llllllmmmmmmm msmmmnn nnnnnnnnn n|nnnnnnnnnnnnnnn nnnoo ooooooooo omooooooooooooooooooooooooooopppppplp~ppppppppppppppppp p ppprqr qrrrqrrrrrrrqr qrnr|rrrrrrrrqrrrrrrrrrrrrrrrrrrr qrrqrrrsqs qssssssssssssqs qsjsms}sssssssssssssssssssssssssssss s ssssstqt qtttqtttttttqt qtnt|ttttttttqttttttttttttttttttt qttqtttuqu quuuuuuuuuuuuqu qujumu}uuuuuuuuuuuuuuuuuuuuuuuuuuuuu u uuuuuv vx xzzzz zzzzz z|q|q||||||||q| q|r|s|||||| | ||||}} }}}}}}}}} }}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~ ~r~s~z~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~  qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  s s s rsz|    rsz|    rsz|  sl~  )    |   m rsv    )))))) jklqrsuwy}~)))))    ) js   f |   l{=}~j    )l{=}~j  l|~  j  l|~  j  l|~  j  )  )))))) jklqrsuwy}~)))))    ) js  \ \fH\ \|qqH HHq qq qmqq   l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )) jklqrsuwy}~))     s)) jklqrsuwy}~))     sl{=}~j  )  )    |         l|~  j   f m| )  )  )  q qqq qn|q qq  q qqq qn|q qq       rsz|    rsz|   l|~  j    )   rsz|    rsz|    rsz|    rsz|   qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )))))) jklqrsuwy}~)))))    ) js  l{=}~j  l|~  j          q             r v |       q                                                                           q             r v |       q                                      )   q rv|q    q rv|q    r    r|   )  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq     !q! q!&!*!- !2!4!7q!9!:!<!!!!!!!!!!!!!!!!!!!!!$q!&q!6!8!:!G!!!!!q! q!_!I!K!M!O!Q!S!U!W!Y![!]!_!o!q!s!q"" "" #q# q#&#*#- #2#4#7q#9#:#<#####################$q#&q#6#8#:#G#####q# q#_#I#K#M#O#Q#S#U#W#Y#[#]#_#o#q#s#q$$ $$ %q% q%&%*%- %2%4%7q%9%:%<%%%%%%%%%%%%%%%%%%%%%$q%&q%6%8%:%G%%%%%q% q%_%I%K%M%O%Q%S%U%W%Y%[%]%_%o%q%s%q&& && 'q' q'&'*'- '2'4'7q'9':'<'''''''''''''''''''''$q'&q'6'8':'G'''''q' q'_'I'K'M'O'Q'S'U'W'Y'[']'_'o'q's'q(( (( )q) q)&)*)- )2)4)7q)9):)<)))))))))))))))))))))$q)&q)6)8):)G)))))q) q)_)I)K)M)O)Q)S)U)W)Y)[)])_)o)q)s)q** ** +q+ q+&+*+- +2+4+7q+9+:+<+++++++++++++++++++++$q+&q+6+8+:+G+++++q+ q+_+I+K+M+O+Q+S+U+W+Y+[+]+_+o+q+s+q,, ,, -q- q-&-*-- -2-4-7q-9-:-<---------------------$q-&q-6-8-:-G-----q- q-_-I-K-M-O-Q-S-U-W-Y-[-]-_-o-q-s-q.. .. /q/ q/&/*/- /2/4/7q/9/:/</////////////////////$q/&q/6/8/:/G/////q/ q/_/I/K/M/O/Q/S/U/W/Y/[/]/_/o/q/s/q00 00 1q1 q1&1*1- 121417q191:1<111111111111111111111$q1&q16181:1G11111q1 q1_1I1K1M1O1Q1S1U1W1Y1[1]1_1o1q1s1q22 22 3q3 q3&3*3- 323437q393:3<333333333333333333333$q3&q36383:3G33333q3 q3_3I3K3M3O3Q3S3U3W3Y3[3]3_3o3q3s3q44 44 5-{66 6Y6Z6[6\6]6676<6>6@6666 6p7-{88 8Y8Z8[8\8]8878<8>8@8888 8p9-{:: :Y:Z:[:\:]::7:<:>:@:::: :p;-{<< <Y<Z<[<\<]<<7<<<><@<<<< <p=-{>> >Y>Z>[>\>]>>7><>>>@>>>> >p?-{@@ @Y@Z@[@\@]@@7@<@>@@@@@@ @pA-{BB BYBZB[B\B]BB7B<B>B@BBBB BpC-{DD DYDZD[D\D]DD7D<D>D@DDDD DpIII$I7I9I:I;I<I=IIIIIIIIIII$I&I6I8I:I;I=I?ICIIIIIII IXIII!I#I%I'I)I+I-I/I1I3IoIqIsIJJ JYJZJ[J\J]JJ7J<J>J@JJJJ JpKKK$K7K9K:K;K<K=KKKKKKKKKKK$K&K6K8K:K;K=K?KCKKKKKKK KXKKK!K#K%K'K)K+K-K/K1K3KoKqKsKLL LYLZL[L\L]LL7L<L>L@LLLL LpMMM$M7M9M:M;M<M=MMMMMMMMMMM$M&M6M8M:M;M=M?MCMMMMMMM MXMMM!M#M%M'M)M+M-M/M1M3MoMqMsMOOO$O7O9O:O;O<O=OOOOOOOOOOO$O&O6O8O:O;O=O?OCOOOOOOO OXOOO!O#O%O'O)O+O-O/O1O3OoOqOsOQQQ$Q7Q9Q:Q;Q<Q=QQQQQQQQQQQ$Q&Q6Q8Q:Q;Q=Q?QCQQQQQQQ QXQQQ!Q#Q%Q'Q)Q+Q-Q/Q1Q3QoQqQsQSSS$S7S9S:S;S<S=SSSSSSSSSSS$S&S6S8S:S;S=S?SCSSSSSSS SXSSS!S#S%S'S)S+S-S/S1S3SoSqSsSUUU$U7U9U:U;U<U=UUUUUUUUUUU$U&U6U8U:U;U=U?UCUUUUUUU UXUUU!U#U%U'U)U+U-U/U1U3UoUqUsUXIRXWRXYfXZfX[fX\fXfX%RX'RX7fXfXfX4RX5RX]RX^RXpfXRXRZIRZWRZYfZZfZ[fZ\fZfZ%RZ'RZ7fZfZfZ4RZ5RZ]RZ^RZpfZRZR\IR\WR\Yf\Zf\[f\\f\f\%R\'R\7f\f\f\4R\5R\]R\^R\pf\R\R^IR^WR^Yf^Zf^[f^\f^f^%R^'R^7f^f^f^4R^5R^]R^^R^pf^R^R`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`Raaa$aaaaaaaaaaCaa aXaaa!a#a%a'a)a+a-a/a1a3fIffWffYffZff[ff\ffff%ff'ff7ffffff4ff5ff]ff^ffpfffffhIfhWfhYfhZfh[fh\fhfh%fh'fh7fhfhfh4fh5fh]fh^fhpfhfhfjIfjWfjYfjZfj[fj\fjfj%fj'fj7fjfjfj4fj5fj]fj^fjpfjfjflIflWflYflZfl[fl\flfl%fl'fl7flflfl4fl5fl]fl^flpflflfnIfnWfnYfnZfn[fn\fnfn%fn'fn7fnfnfn4fn5fn]fn^fnpfnfnfooo")o$o&o*o2o4oDoFoGoHoJoPoQoRoSoToUoVoXo]oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooo!o+o-o/o1o3o5o<o>o@oCoDoFoGoHoJoo oWoXoYo_o`oboooo o!o"o#o%o&o'o(o)o*o+o,o-o.o/o0o1o2o3o4o6o8o:o<o@oBoDoIoJoKoLoMoNoOoQoRoSoToUoVoWoXoYoZo[o\o]o^o_o`obodofohojolonpRp Rppp")pRpp Rp qqq")q$q&q*q2q4qDqFqGqHqJqPqQqRqSqTqUqVqXq]qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqq!q+q-q/q1q3q5q<q>q@qCqDqFqGqHqJqq qWqXqYq_q`qbqqqq q!q"q#q%q&q'q(q)q*q+q,q-q.q/q0q1q2q3q4q6q8q:q<q@qBqDqIqJqKqLqMqNqOqQqRqSqTqUqVqWqXqYqZq[q\q]q^q_q`qbqdqfqhqjqlqnrRr Rrrr")rRrr Rr sss")s$s&s*s2s4sDsFsGsHsJsPsQsRsSsTsUsVsXs]ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssss!s+s-s/s1s3s5s<s>s@sCsDsFsGsHsJss sWsXsYs_s`sbssss s!s"s#s%s&s's(s)s*s+s,s-s.s/s0s1s2s3s4s6s8s:s<s@sBsDsIsJsKsLsMsNsOsQsRsSsTsUsVsWsXsYsZs[s\s]s^s_s`sbsdsfshsjslsntRt Rttt")tRtt Rt { {{ {")$q&*247)D\FqGqHqJqPQRqSTqUVXYZ[\]qqqqqqq\\\\\\qqqqqqqqqqqq\q\q\qqqqqqqqqqqqqqq qqqq!$)&)+-/1357<>@CqD\F\GHqJ WXqY\_`qbq\q \!q"\#q%q&\'q(\)q*\+q,\-q.\/q0\1q2\3q4\6q8q:q h $ % N3 $  "  (_ 8 \ \ Tw  Digitized data copyright 2011, Google Corporation.Open Sans SemiboldRegularAscender - Open Sans Semibold Build 100Version 1.10OpenSans-SemiboldOpen Sans is a trademark of Google and may be registered in certain jurisdictions.Ascender Corporationhttp://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0Digitized data copyright 2011, Google Corporation.Open Sans SemiboldRegularAscender - Open Sans Semibold Build 100Version 1.10OpenSans-SemiboldOpen Sans is a trademark of Google and may be registered in certain jurisdictions.Ascender Corporationhttp://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0ff      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~.notdefnullnonmarkingreturnspaceexclamquotedbl numbersigndollarpercent ampersand quotesingle parenleft parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon semicolonlessequalgreaterquestionatABCDEFGHI.altJKLMNOPQRSTUVWXYZ bracketleft backslash bracketright asciicircum underscoregraveabcdefghijklmnopqrstuvwxyz braceleftbar braceright asciitildenonbreakingspace exclamdowncentsterlingcurrencyyen brokenbarsectiondieresis copyright ordfeminine guillemotleft logicalnotuni00AD registered overscoredegree plusminus twosuperior threesuperioracutemu paragraphperiodcenteredcedilla onesuperior ordmasculineguillemotright onequarteronehalf threequarters questiondownAgraveAacute AcircumflexAtilde AdieresisAringAECcedillaEgraveEacute Ecircumflex Edieresis Igrave.alt Iacute.altIcircumflex.alt Idieresis.altEthNtildeOgraveOacute OcircumflexOtilde OdieresismultiplyOslashUgraveUacute Ucircumflex UdieresisYacuteThorn germandblsagraveaacute acircumflexatilde adieresisaringaeccedillaegraveeacute ecircumflex edieresisigraveiacute icircumflex idieresisethntildeograveoacute ocircumflexotilde odieresisdivideoslashugraveuacute ucircumflex udieresisyacutethorn ydieresisAmacronamacronAbreveabreveAogonekaogonekCacutecacute Ccircumflex ccircumflexCdotcdotCcaronccaronDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflexGbrevegbreveGdotgdot Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbar Itilde.altitilde Imacron.altimacron Ibreve.altibreve Iogonek.altiogonekIdotaccent.altdotlessiIJ.altij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotLslashlslashNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautOEoeRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexScedillascedillaScaronscaron Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflex YdieresisZacutezacute Zdotaccent zdotaccentZcaronzcaronlongsflorin Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccent circumflexcaronmacronbreve dotaccentringogonektilde hungarumlauttonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos.alt Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIota.altKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9Iotadieresis.altUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronpirhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055.alt afii10056.alt afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveendashemdash afii00208 underscoredbl quoteleft quoterightquotesinglbase quotereversed quotedblleft quotedblright quotedblbasedagger daggerdblbulletellipsis perthousandminutesecond guilsinglleftguilsinglright exclamdblfraction nsuperiorfranc afii08941pesetaEuro afii61248 afii61289 afii61352 trademarkOmega estimated oneeighth threeeighths fiveeighths seveneighths partialdiffDeltaproduct summationminusradicalinfinityintegral approxequalnotequal lessequal greaterequallozengeuniFB01uniFB02 cyrillicbrevedotlessjcaroncommaaccent commaaccentcommaaccentrotate zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperioruni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200BuniFEFFuniFFFCuniFFFDuni01F0uni02BCuni03D1uni03D2uni03D6uni1E3Euni1E3Funi1E00uni1E01uni1F4Duni02F3 dasiaoxiauniFB03uniFB04OhornohornUhornuhornuni0300uni0301uni0303hookdotbelowuni0400uni040Duni0450uni045Duni0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BF uni04C0.altuni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CE uni04CF.altuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7 uni1EC8.altuni1EC9 uni1ECA.altuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1uni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni20ABuni030Fcircumflexacutecombcircumflexgravecombcircumflexhookcombcircumflextildecombbreveacutecombbrevegravecomb brevehookcombbrevetildecombcyrillichookleftcyrillicbighookUCcyrillicbighookLCone.pnumzero.osone.ostwo.osthree.osfour.osfive.ossix.osseven.oseight.osnine.osffuni2120Tcedillatcedillag.altgcircumflex.alt gbreve.altgdot.altgcommaaccent.altIIgraveIacute Icircumflex IdieresisItildeImacronIbreveIogonek IdotaccentIJ IotatonosIota Iotadieresis afii10055 afii10056uni04C0uni04CFuni1EC8uni1ECA   46latnMOL ROM  nlatnMOL (ROM B      ligaligaligalnumlnumlnumloclloclonumonumonumpnumpnumpnumsalt saltsaltss01"ss01*ss012ss02:ss02@ss02Fss03Lss03Rss03Xtnum^tnumftnumn    &.6>FNV^Pz2HJJ.,ZgwEG      !$%IJ6 "(^IO]ILI5O4LI^V0R *H C0?1 0 +0a +7S0Q0, +7<<<Obsolete>>>0!0 +; U|xG{Ӊf;]0z0b8%a&Z0  *H 0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0 070615000000Z 120614235959Z0\1 0 UUS10U VeriSign, Inc.1402U+VeriSign Time Stamping Services Signer - G200  *H 0ĵR`)J[/Kk5TX56^bMRQ4q{f*j 7٘tvJcEG.k NK+XJ,XB-uލǎlLgrIž`<cxi{-004+(0&0$+0http://ocsp.verisign.com0 U003U,0*0(&$"http://crl.verisign.com/tss-ca.crl0U% 0 +0U0U0010 UTSA1-20  *H PK$ $- 7 ,Za񑑳V@뒾89u6t:O7ʕBǠWdB5N3M'L8MxSݤ^ ⥾`߭(ǥKd[98"3/!?DA e$HDT\y>]r},CS}=*:Om ]^SWp`+nx'4[^I2300-GߍRFCmH 10  *H 01 0 UZA10U Western Cape10U Durbanville10 U Thawte10U Thawte Certification10UThawte Timestamping CA0 031204000000Z 131203235959Z0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0"0  *H 0 ʲ }uNgadڻ30X~k6xw~o< hlʽR-H=]_/kLR`@~ ?Ǵ߇_zj1.G 1s W-x43h/Š*Ë!fXWou<&]'x1"ijGC_^|}bM "Vͮv M٠h;004+(0&0$+0http://ocsp.verisign.com0U00AU:0806420http://crl.verisign.com/ThawteTimestampingCA.crl0U% 0 +0U0$U0010U TSA2048-1-530  *H JkXD1y+LͰXn)^ʓR G'/8ɓN"b?7!Op18UN$ҩ'NzaA*^ݻ+>W~ +;R8'?J00eeR&.Y)"\0  *H 0_1 0 UUS10U VeriSign, Inc.1705U .Class 3 Public Primary Certification Authority0 090521000000Z 190520235959Z01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0"0  *H 0 g`IoV|f^ q-!ќPL"5; .Z|=;%X{ ξ'tag'MjaXy'M4+G Df$fO8TrfujIh8y 0,`Hת809:|@T/ܨR>+!\ P4.M^%Ԍn|)]1ZՌgX5+!`x^{`W ]A cT`C!00U00pU i0g0e `HE0V0(+https://www.verisign.com/cps0*+0https://www.verisign.com/rpa0U0m+ a0_][0Y0W0U image/gif0!00+kπjH,{.0%#http://logo.verisign.com/vslogo.gif0U%0++04+(0&0$+0http://ocsp.verisign.com01U*0(0&$" http://crl.verisign.com/pca3.crl0)U"0 010UClass3CA2048-1-550Uk&pȡ?-50  *H ݔAaix0Ɛ<~B$s/DrPU nQj71ܥ-OM2NgUejzd8xEv1z`³]fvYI8VAwX00fgymPSo0  *H 01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0 100729000000Z 120808235959Z01 0 UUS10U Massachusetts10 UWoburn10U Monotype Imaging Inc.1>0<U 5Digital ID Class 3 - Microsoft Software Validation v210U Type Operations10UMonotype Imaging Inc.00  *H 0Di|U 25L3^ L*8ט@I "SOCʋVnH9c;$5}rGWyˊJ@p-5cįפ {uePd"}KXEMYLM00 U00U0DU=0;09753http://csc3-2009-2-crl.verisign.com/CSC3-2009-2.crl0DU =0;09 `HE0*0(+https://www.verisign.com/rpa0U% 0 +0u+i0g0$+0http://ocsp.verisign.com0?+03http://csc3-2009-2-aia.verisign.com/CSC3-2009-2.cer0U#0k&pȡ?-50 `HB0 +700  *H N"gA~™cjrb<8=_G_[KI  VD 5< D`E*oL;4gpZ9\Zl5|eKmIp=b۴A~}n"w6MZ S1+(RzkwD ]%,͊0>KyʦN $ 񺐶\<'MM   & 0 2 9 < D p t  !!!! !"!&!.!["""""""+"H"`"d%aIvhcb]gD Xz}} Bvt n%"iOS0L\pr`<&'()*+,-./0123456789:;<=>?@AIJ$%TUVWXY\]^_`abcdefhijklmnopqrstuvhijkFopqrstu45]^@G[ZYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! , `E% Fa#E#aH-, EhD-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,CRX!!!!!F#F`F# F`ab# # pE` PXaFY`h:Y-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY&QX@cTX@C`BY@cTXC`BYYYYYYCTX@ @@ @  CTX@   CRX@ @@ @Y@U@cUZX  YYYBBBBB-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,CPCT[X!# Y-,Y+-,-@ !H U UHU?OFNMMF&4U%$LKKF3UU3U?JJJIHFGFIF#H"U3U3UU3UU3UoTS++KRK P[%S@QZUZ[XYBK2SX YKdSXBYss++^stt+++++t++ssst+++++++++++++st+++^NuRy1Fc!'Gp'GT({/}+w8  8 n  [ 0 U  $ 8 S o 0 c C2u;t 4xS|);+v &(g&8e+iBXm 0A)ul~hyP\m~K\m~ G X i z !!!!3!D!P!\!n!!!!!!!!" ""~"""""""#####5#F#X#i#{#####$$e$w$$$$$$$$% %%$%6%H%T%_%%%%%%%%&&3&b&t&&&&&&' 'Q'c't''''((((((((() ))-)9)E)W)i)t))))*(*:*K*]*n********+++)+:+M+_+p+++++,3,-5-G-Y-k-|-----. .(.[..../:/K/T/f/x////////00 000i0q0y0000011 1=1E1M1112?2R2e2v222233u334@445555=555666S6677K7w788U88888899Z9l99999:1:v::::;;B;J;R;;;<&:>w>>?D???@3@x@@AJAAAABBLBuB}BBBBBBCCJCCD:DDEEWEEFFrFFFFFFGXGGGGHH;H[HmH~HHHHHHHIII%I>IYIoIIIIJ/JJJK?KGKOKhKKKKLLtLM@MMNSNNNNO O!O8OOOOPP0PPQ#Q[QQQQQR R/RHRaRzRRSS_SyST T T T T T T T T T T T T T U+U~UUVVBVVVVVVWWGWXXXXY:YYYYYYYZZZ'ZZ[[l[\\Q\\]]j]^^r^____`+`b`````a8abDbcwcddFd}dddefffg\gghIhhiiQiijVjbjnjjkkOkkll4lglllmLmnnnnno3o;oboopp:pqpqqJqqrrTrsssstttbttu-ujuuv vNvvww"w4wEwXwjwrwzwwwx5xHxZxmxxxxy+y=yNyaysyyyyyyyyzzz)z;zNz`zszzzzz{?{{||P|||}}}~5~~(̀^߁nvł%1CUh{ǂڂ+>Qdwƃۃ):M`s҄!-9EQcuԅ #8J[m~ņц݆+EPdA=ObC} ?3210#!#H`J373@     ?3?399//333333333310!!####7!!7!33333# Ty{yuT'yyyyRh^^ZZ=H%+A@"@H% ++@  OY@&&MY/3+3/3+393+10#7&'5&&546773&'6654'--ʼnN\T%#VnPu8`VesYYn C*88uBB3Xr bMe,D ]Lb)F )7'@555$.?3?3??99//3310"326654#"&54632%#"326654#"&546327X5P4W;os|jw> 4W9Q4X;oqjv#zgtf͚'J%sluh˚*BZ 14@#/$),&&+KY/ KY/?+?+?99910"6654&267%467&54632673!'#"&W^>iHMJapXṠmHq^j|lXm\KuDBG67}JVVmbբ[pPG ?10#HN '??103#NsWC~f/ '??10#3/s\$G V ?10%%'%7dt f%Gb%-=sȐ dòu  RY/3+310!5!3!!#{yw}V/10%#6N}i_/R LY/+107!/--!N QY ?+1074632#"&!^T8C_MB?^Sc?=NgG ??10#+J\L @ MY MY?+?+10#"&5$32%"3265L¿pakNZdc(o   ??9910!#67'3}69Njf7/u=?@ MYNY?+9?+10!!7>54&#"'6632!_$װ}8cZFesxuNn{FUc54&#"'6324632#"&k{kO%UQMNN˫h\^T8CbLB=ZMPQ0FX7%qxwJvUSc?=OdEdF8D,@ 9(5 ?? -!5(-/3?39/3339/3910#"&'##"&54632326654$#"327#"$5$!2"32677&wքbi e{4UJ\eOH|GƩ$3VRpRw)@5Nۦ\J xr-\zVZ8vkgN@ LY ?3?39/+10!#!#&5;9( 7WjHf4F -@  KYLYLY?+?+9/+9102!!32654##32654&## 㭙lw5nNjߵߓxtlyoۈ~bg!@ LY LY ?+?+10"327#"$32&&򑥡`٬^?̴DC) \"0F @ LYLY?+?+10!!! 2$54&##o5q$ı}l58ȸF &@ LYLY LY?+?+9/+10!!!!!!!N5+T)`u8F @ LYLY?+?9/+10!#!!!!35+`- :\&@LY LY LY?+?+9/+10!# $32&#"327!pՄwogZmjP (%$ )1Vͷ!sF @ LY ?3?39/+10!#!#3!3Vʋ56mV? @ KY KY?+3?+310!!77'7! ;枅<3;;<hs LY#?+?10"'73273hBTE5+.hZFf @  ?3?39910!!#37!?u5헍d>cFyLY?+?1033!F5+D@   ?33?399310!##!3!#67#s .5Cm^X'/}v}JhBD@   ?3?39910!!##!3673f 5 2E6A @ LY LY?+?+10# $32%"32654&Vۊ{L+ ]ʭSΪF@ LY LY?+?9/+1032654&##!##!2^uywWns5N쟒md#@LYLY?+9?+10!# $32%"32654&Vۊ{[H+ ]ʭSѪF &@ KY LY?+?39/+910#!2!'32654&##{5RϏ{v|wHĥ4HƖi\';$ @ LYLY?+?+9910#"'532654&'.546632&#"ҊRid5{ͰVm?gvKauhEkSCnOl\Nu^/G=Aa@ LY?+3?10!#!7!!-+@  LY?+?310#"&547332678wy'DSWwXFfqH  ??3910%673!3FCJ JwgL@    ?3?3399310!!'7#!3367336673%%/F5 S;TfJj݆IX+N% @  ?3?39910!!!3!JJ P:??3910!#3F rwo) @LYLY?+3?+310!!7!7!!T!R+#?Ϭ'?3?310!!#3R}'g ??10#Jq'?3?3103#7!!j1'T%//39103#%`N[NDH/310!7!u1! /10#&&'53A"/U?C^f '@  FYFY?+??+?9910"&54632373#7#'2654&#"a' >iRf^LUZQ˸`[WľXkfe/P#'@ FYFY?+?+??9910"&'##336632"32654Bb( @JG 2ZV Qc]UUVZV?/qW϶`k^f@  FYFY?+?+10"&54$32&#"3267ؓ FzcpcJAS=5ox, G^!.@ FY HY FY?+?+?+?991023673#7##"&5462654&#"oY LX\ RaWYUXfhfjZ˺dD[n^f #&@HY HY GY ?+?+9/+10"32654&"&54$32!#3267`%@ݛ +qpHa`kb39:Uo~&.,%)@FY HYFY?+?+33?+10"'5327#?6632&#"3#LZ;@2+ٳ,s`=J>ES%(jL\Ƨ+VbV㽲wf'4AH@(((FYη`k^f"'@ FYFY?+?+??99102373#667##"&5462654&#"q[ @K ?TZ Pa[QVYf]8lZͶfD^k/f@    ???92102&#"#3366>.360~'j Sf  Rxiqf" @ GYHY?+?+9910#"'532654&'&&54632&#"ҾaxEk}gֶĖL~I[BfiX.TCZPE3I=C_TLB;-F7;Tc\%H'@@ HYFY?+?+3310%27# 547#?3!!DS#x<y4'z 29J:nR7%+3oR@   FY?+??3910326673#7##"&5467HncRg {R4rӎtm?{>HdPR  ??321033366737T7RJ)Vy^R@   ?3?3399310!'7!336733>3L5/  B+P/sF>~;RzW`k52nTR @  ?3?39910!3!#3}9uVRR@  FY?+?391033673#"'532677d? V1%PZԏLCK2Jx@3R>Eb>Wp\R $@HYHY?+9?+910!!7!7!! {I'% J' @  &'?3/39/]3910 5477654#7267>33"3-'x;Z{<)`WF~t+ AM=HA!Ue-'y?"j]F~t+ VN#=HA!TdΥEP5mz07B,:(o;+h@ RYRY/+/+10"56323267#"&'&&X3z;l'>:o!!  ^@  QY ?+/9/103!#"&54632ݮ7^P;DbNA<VPd?߹D>MVaIpwilfϼttNfv\ES]>Kcw dAN+E<+C28`\=LuC]QG+I0<Aj>=W9$m<F?09G:/>d7rr`OwÅ}Pd /3210%P蓴?vLpLu+RY/+10#!5 +w/Rb,53@%)))5***'-)**)-  ?3?39///3]3]3104$32#"$732$54$#"%###! 32654&##^]{$%ݭۨ[UȬ[ QTHTZ[SH^Zƨ߬!# S|$EngH?I8o%/310!7!s';N   /32104632#"&&732654&#"ˆXXhJHhgIJhˆXXFhhFJhgu $@ RY B RYp/]q3+3?+10!5!3!!#5!{y}崴NJ  ?39?310!7%>54&#"'6632! oK#80[dPD^s/evsJ_RH&.4P{67x_Eon[h9#'@ ! !?3?39/]q3910#"'532654##732654#"'632mhNJǪp~zZcl]Yku\`D~|ZvbB8GJEqDAdAyZo! /1067!#a6GlB4R @  FY?+???3991032673#7##"'##3fB?q-f KWl/ BR3AHocQI>bT/3?39/10####"&563!>SEf39juVD@ @ H/?39/+310#"'53254&'73줎@6/1FEb2H@jz`(+ `TJ   ?2?9103#67'c(9}MO.P @  ?3]210#"&546632%"32654TnzXk|QgpMe~pzo  \  /3/210'7'7sH^wJrL9Pq\`LP'&{< ?55y'w&{t?5l/'!'<+u ?55uZ%-@ ##QY# MY"?+?+9/_^]9103267#"&5467667#"&54632mtkM%TQLOK̮]`'`R8C]OB?SONP0GW7&pxu@u_^UcA&$j\R $$&+55N&$Pm $?55%<@ LY LY LYLY?+?+3?9/+9/+10!!!!!!!!!#VP+T+ bMRpju5}!&&z+Fs&(CR  &+5Fs&(v}R &+5Fs&(K?R &+5F>&(j5R !!&+55?s&,C R  &+5s&,vR &+5s&,KcR &+5~>&,jgR !!&+555 -@LY LY LY?+?+9/3+310!!#73! 2$54&##!!o-q$ı^-Z}lo58ȸIZDH&1RR &+5s&2CoR &+5s&2vR $$&+5s&2KR ""&+5H&2RR %%&+5>&2jR 11&+55 @   /3/39107'}897{z7}5{{5{m'.@!"$ LY$LY?+?+9910#"''7&5$327%"&4'326}vgVٽw^ۍPkKw|LSh ^hXLDAX78Rs&8CNR &+5s&8vR &+5s&8KR &+5>&8jR ++&+55s&<vfR &+5Fd @ LY LY ??99//++10!##33232654&##dlB53a:`wyy1mb9,@1% 4GY "HYFY?+?+?+910"'532676632#"'532654&'&&54676654&#"uEH=4AS0ѳv=JkH&ƶe~~iv/XRNY[bQ^U4*Wh̠WA#,9TVc>AE::C?>>AE::Cw@GH?@IG@GH?@IG3Z&.@$% GYGY?+?+9910#"''7&54$327%"&26654'5bi{sFgV}d?X-YUL);`hJ=l`udN'#%#-!o!&XC &+5o!&Xvs ""&+5o!&XK  &+5o&Xj //&+55VR!&\v  &+5P$'@  FYFY?+?+??9910"&'##33632"32654&J^+`023T`\VVVR[U[^1̹bideVR&\j --&+55q&$M{R &+5^&DM# $$&+5Z&$NHR &+5^&DN $$&+5-N&$Q1^-f&DQ!s&&vR !!&+5^!&Fv/  &+5!s&&KR &+5^!&FK &+5!L&&OR ""&+5^&FO !!&+5!s&&LR $$&+5^*!&FL ##&+5Fs&'L\R &+5^^&G8$?55^P)Q@0IY / $FY  FY?+??_^]+?9/_^]3+3991023677!7!733##7##"&5462654&#"fZ!P%%#R]PdT\WULKim=g]еX^WkF&(MXR &+5^&HM ''&+5FZ&(N-R &+5^(&HN ''&+5F/&(OD5 &+5^&HO --&+5F-&(Q/^Ff&HQFs&(L-R &+5^G!&HL //&+5\s&*KR $$&+5w!&JK HH&+5\Z&*NR !!&+5w&JN EE&+5\L&*OR ''&+5w&JO! KK&+5;\&*9#w!&J:u EE&+5Fs&+KR &+5/q&KKF !!&+5F0@  LY  ?3?39/+9/33333103##!##7373!737!^"ʋ%//6/++תm-/?<@!   IYFY   ?3?9/]+9/3+3910!654#"##7373!!3663 yIqZ$%%D#TS]{G8sщPãj]8hH&,RR &+5/M&R  &+5z&,MR &+5/&M &+5Z&,NQR &+5/&N &+5-?&,Q-V&LQF?L&,O{R &+5/R ??10!#3Rh@&,-/&LM3his&-K>R &+5!&7K &+5F;f&.9/;&N9`/R@    ?3?3910!!#3#шM9 7V`R5Fs&/vR &+5/u&Ov  &+5F;y&/9o;d&O9Fd&/8 ?5/&O8 &+5F&/Ook/3&OO] y #@ @ LY?+?9/9103'737!FjTR՜|T\+0ukL (@ /O_ ??9/]9107#'73_OߏqXP׬7Z3{ Ds&1vPR &+5/V!&Qvq !!&+5D;&19/;Jf&Q9dDs&1LR &+5/m!&QL $$&+5.'QDj@  LY#?+??39910"'7327##!3673l@WC6C-52+j}J/Jf"#@ FYFY?+??+?910"'5327654#"#336632LH=8'Hpb Sg"\Z)r׈+Rvk:{S&2MR &+5^7&RM &+5Z&2NR &+5^7&RN &+5s&2S3R ..&+55^!&RS; ..&+55R!:@ LY LY  LY LYLY?+?+?+?+9/+10!!# $32!!!!!27&#"3TVVّN+T+`lJADq+ u5ʭ^f"/9;@ 3HY33 0# #FY **FY?3+3?3+39/+9910"&'#"&546326632!#3267"3254&%"32654&x0ړbI}/qqEo[]WWa[ci"<\\M[g&<jR &+55s&=vR &+5!&]v &+5L&=O1R &+5&]O &+5s&=LR &+5!&]L &+5@ FY FY?+?+10"'532676632&#"h[;@3>\)u`=J=ET(di+Ucۿo(@FY HY FY?+9/3+3+10"'53267#?6632&#"3#Z;@2>]%sb>J=GS%+dimGu+UcmN&.M@*LY. $@ H@ H*$$*@ H?3/+]9///+]+3333+10#!#&54632%667!#4&#"326!&'T+#gh+&5V:./<65.:1f& rBs#0Qgzz$/1019912773h]kG^ !4BQ@-_  " )@2,").)iRf^LUZQ),)5f{yfg{yi2992088˸`[WľXkfe%s&vmR &+5^!&v JJ&+5ms&vR 00&+53Z!&v? //&+5';;&69;qf&V9b+!  /3210#&'#56673+LUi~&?snD(cm!  /32103673#&'E]}qP!,!:xiIG/n/310!!F%J /3]210#"&54733267JIWX_t$?>>?BN  /104632#"&BNG5BQA4FbDT56GR4 @  / p  /3]]210#"&546324&#"326jjgh`6uj7ɨ"!@LY LY ?3+3?+10"!7!&&54$32!!7654&\zVc+)hfjEժm++맟bUjĄ~ˀn媸>&,j|R !!&+55>&<j#R &+55^h&~T' 66&+53h&T ,,&+5/Jh&T% !!&+5dh&T &+5}o&U((&+555^f -+@(FYFY!FY?3++?+?9910237673327#"'##"&5462654&#"oU*']0P"&>RT]T_WOVXf'R'D?"$ fTͶ_D [n)6@ "##"FY## FY FY ?+?+?9/+99102#"&'#66"32654##732654&}wޛQRwT2d{#'C9)AXF'7H׽ *쾘PdHNR ??39910#6336673?+;a!ɝ Fߥ@=#?*$@%% GY FY?+?+93310&54632&&#"#"&&542654'3ܸ`b]?PTZ(Rwd;R  ?3?210363#dC HGRZDVs/4@%..HY..%#'$%%$GY%?+9?9/+99310#"#6654&'&&54675&&5467##7!#"!3DLTtiT^sJ?gdoS7&$} bפPb1?VPQkq2*7,<-{Zo' H[^7dRThR"@ GYGY?+?+33?10%27#"&547!##77!##64Rlps{;&} $nd9KVhjP*#DJf"@ FYFY?+?+?910#"'#632%"32654&J혥s R8`h&FO|VZV|GwY "do^jf@  #FY?+?9310#6654&'&&54$32&#"LWvhS_WfA[Fze]cf{2:[OXR?-9%AЕJ=5w^R@ GY FY?+?+310#"&54$3!!%"3254'#Ryٗ$%^ċ9RuY1 ޗmTR@  GYFY?+?+310%27# 547!77!!JDS#w=q'r2=]jPD-+3}oR@  FY?+?310"&5473323xyGv9gH^^j$'@GY !!FY?+33?+??10&&547>32#4#">Т~i%eqco;Hzy]G!\Ѽ (al ^%@FY FY?+?+??991023327#"&'!&&#"'6pw#mF 48--LVs{+\q9 /--)P^ KBF_N@! @  GY ?3+3??3?10%63#&&54733%de wmf$p*(Ȫ=@f]?fpl^R'$@% GY#?2+3?39/910"&54733267332654'3#"'z~O]@(,sQM7>ȶ~ɇ}--yƼdXd&j &&&+55}o&j ((&+55^7h&RT $$&+5}oh&T &+5^h&T 00&+5F>&(j=R !!&+55+@LYLYLY?+?+3?9/+10"'532676654&#!#!7!!32dbD?KUZO] -+JL\edAGI=`Fs&av}R &+5!&@LYLY LY?+?+9/+10"!!327#"$32&?B)Wp`׮^KD!"* \R';6?,>&,j|R !!&+55hs-#0@"LY#LYLY LY?+?+?+9/+10#"'53266!32!!2654##<—J;<(DXSjF}X}e?2 +F)@  LY  LY ?+??39/3+310332!!!#3!2654##P|b}5|뜠|eda+#@ LY   LY ?+3?39/+104&###!7!!3 #6'W] -+JtTa1LF=DhbKFXs&vR &+5 jy&6PR &+5Fm @  # LY ?3+??3103!3!#!{1 mWVmJmN$H &@ LY  LYLY?+?+9/+102!!!!2654##Xq5+Qed{c+F%FaJo5 $@# LY  LY?+33?+?310!#3!3#!{VVrCaKPoo^ExF(B!@  ?33?33931033!##!9K NLL'#+-j(-@KY && KY& KY ?+?+9/+910!"&'532654&##732654&#"'6632jйRTm)ncZ}싵&).6sexZZyRDF@  ?3?2991033!#7#!{ݷ4 Tp{ -hJNFy&6R &+5FX @  ?3?393310!!#3!D5om/F)d@LY LY?+?+?10#"'53266!#ΰQ47-DXSjF ?2 JD0F+2FnF3!&7 j@   LY?+?39310"'53267367!nOReUQ' 2/v}k'b=vQղIs%;Dmy @ # LY?+3??310%#!3!3)V05# J@ LY ??39/+910!#"&54733273%{okDV=PD*LJD @ LY?+3?331033!3!3D5  JDm@ # LY?+33??3310%#!3!3!3V5   &@ LY  LY LY?+?+9/+102!!!7!2654&##s -@toedci\+F"@LY  LY ?+??39/+10!#3!32!!2654&##d5|X5^uo|eh]+F# @LY  LY ?+?9/+1032!!2654##h|fu5ne+&@LY LYLY?+?+9/+10% !7!74&#"'632#"&'5}j)9Gj>mPZH(PI$-/0F#*@ LY  LYLY?+?+??9/+10#"47!#3!32%"32654&ҋ5#Gm uvO* A3m!L\˯Rح $@KY  LY ?+?39/+310!&&54$!!##"33oIh[){sJ=jJJfo^fDh'$@ !GYFY?+?9/+910476$736632#"&26654#"hCZjϋ'J`QRK=4D1cȘXZ1w}oXq\^5f(-@""HY"" HY HY ?+?+9/+9102#"&54$32654&#"32654&mВqpivq~w'ՅOf;4dZ?u_OIHמ\P8G%f# @ !GYGY?+?+99106323267#"&546676654#"}WQUJc^Og`~TuC;aC:=4".!XdI%R4fJ^`)'-@ !GY FYFY?+?+9/+910#"&546323754&#"'663 27&&#"`亻~叿^ke6?Gz)rMSN\;ij."- Zh}ۃjs^fHTf;=@ 9IY;;'FY".  FY3?3+3?3+3??9/3+310##"'7326654&#"5632333632&#"327#"&557##6D=%0*_UYQ8=LRef7S6),2ZYUS2CFVe uy&) s}!!+ f%-@$%%$HY%% GY GY?+?+9/+9102654#"'632#"&'532654&##7|=ɫ{Zb\A]d'PQuJT~ntZ&!X_SHEoRXo'&X6 &+5/R @  ?3?393310!!#3uFrnR!Rb`@FY FY ?+?+?10!#&#"#"'532667>32%!H^QJWja@3$(1JEDIcxs@VAѵg1+)R@     ?33?399310#&'#!67!#0b )_=6d9LM_RZYo/R @ GY   ?3?39/+10!3#!#^_dHfRD#R^7dR/JfQPfS^fF/fPVRR\^X#+@ #GY GY ?3+3?3+3??10#&&54$73>54&'Ӥܿdg֤#]/nao]m^n`^¾Ш &ż0 v` wڀ| TR[myR!!@ !"FY?3+3??391032673327#&&'##"&547p-c $"!3}Y;:҆R^L5:""&aPҘD}hR@ FY  ??39/+910326773#667##"&5477;J=z2@ ! 6RV5GBw1n/b & $0}Xs r}Khyk+dR^L1DC9##%(}ntw;z^U.XR-@ HY GY HY ?+?+9/+910632#"&547!7!"32654&bkpqז\'H/OhcvXt`Moh2eWJEuR")@ HY !  HY ?+??39/+910632#"&547"32654&#3d}UԼ H` ]nVR-ԨVhi+$gWM@RuR$@ HY  HY ?+?9/+910632#"&5473"32654&oxtۘ»=[k jx[saXbkC4#eWJEbf4@HY <LFY FY?+?+9/_^]+102#"&'53267!7!54#"'6ԊO*x| V#>l7Bf­=!!K/d"*@ GY  FYFY?+?+??9/+10#"&57##336$32%"326654&f^= dTQZ^PL]G#RD#j{nv;R$.@""HY""HY FY?+?+?9/+910"#"'53267667&5463!#"33`?Y$KUiIG,$,>%2V4]R^maSDBHj2 6I^R;`UKFF^&Hj 99&+55/?)R@1# %&%IY&& ( FY     #(#FY?+??9/_^]]+9/3+3910!!3632#"'5327654#"##7373?D#2È&^6;:'p-Z$%fJpƝL`O0^ã%!&v ,,&+5^f&@HY FYFY?+?+9/+10"&54$32&#"!!3267זFzcp'&bji:xZZ=5$&j}-GqfV/VL/&j &+55VM`)57@ *HY''FY'FY 0HY ?+?+?+9/+910632#"&547&#"#"'532667>32"32654&Հ[qו\!=RHNQjc>3"*0IAFL\pb7NhcvYt`Mo&:juR 22&+55y^&Zj 11&+55s&<CR  &+5VR!&\C, &+5//3107!/+F+/w/3107!/++/w,2'BvBw1 ?10'673}"WzML s/ ?10#67'%R+~S_@VV/10%#6Nli_ ?10#&'7 . oڬZ |w  ?3210'63!'673 TzM{"WzM!L s ?3210#67!#67'%R+~ b3t S_@Vr&]  /2210%#6!#7Nli_ \xO '@  ??9/333933310%#73%ƞ+'"F!_DE@!    ??99//9333933333333310%%#7773%%3F--7 `-7F- wx  //104632#"&dufqmrs%o'!'1  )7CQ3@885OOO$>>.H?333?3??99//333310"326654#"&54632%#"326654#"&54632"326654#"&546327X5P4W;os|jw>5V:R6X9osjv-4W9Q4X;oqjv#zgtf͚'J%rpzc˚)sluh˚* }Pdb/10P=vL \/10'7t!ZwNnL@w' ??10#=J9@  ?3?2310654#"#36321V GFw>dT\R:My_X6>r1@NY PY NY ?+9/3+39/+10!!##73!!!!87 +_-L$O@+#$#PY$$$  PY $ $  MYNY?+3?+99//3+3_^]3+31076632&&#"!!!!!!7667#737#7m/⼾X8>^o#N!M9-6$aw !#V+ehJv73,9@ '$'PY MY"$ $"MYOY?+?+?9///++31032654##!##!227#"&547#?33#);Bt87PVptzEo1#L ,짒ɻ!+pg=\H\`ݪ>&*3'S@/PY PY p !!MY!NY?+?+99//_^]^]3+33+310"!!!!327#"5#7367#7332&&vA!n T!yx! \GXPf6jCH<=_,,7",3%@.(#?3?3??9/39/310##"&546632%"326654%"&546632&#"3267Cæ{Wm|Mdi4M-^rXb-NA<_4y/E%PJ{}o{POُ}zp' OL)d&#@$$  ?3?399//33310%2673#"&5556746324#"66@M Ti>DnX.,^Tie¶¶(ˡ`egI_7)u ,4@ !' ?3?3?399//]339910!##376737!#"&546632%"326654 '$51$ҁ##WpyXmx5P-e6N.s/VeJtsyt VHQMq&@  ?3333339/32210##5!###33#7#ǒ?ת͒RsX/yvuH@ /3/29/310"&546632!3267&&#"1RRHbٓ2Xz#5Fh)|5Bu$'&{@ ?55510W''@uu ?555d'&=@s *?555"''@? ?555`\%(@  FY GY FY?+9/++910#"&546324&#"5663227&&#"\丸Ǐ꘣Yy;AAN}&k@XU?ʬ6u(*"(CSrv) @  LY?+?910!!7!&$J{PNщ:j#XLY?+/310!#!dk}#<m#T #@ LYLY?+9/+91055!!!\fw#o5uw+ RY/+105!uwb//9/3910##5!36N +$@$&!/333/333910#"'#"&54632632267&&#""32654&N:Sx|8^0-_b>>R`\ oy+1/S@-**$RY** *@'RY RY @RY/+_^]++_^]+10"56323267#"&'&&"56323267#"&'&&X3z;l'#A8o$ uD5m%@9n !%u '@RY RY /33+3+33310#5!7!5!3!!!'^=g\ehݳGӳݴEu @  RY/+/_^]1035!75uXGyu @    RY/+/_^]1035! 5uXHX0XyRf @  //910#3 f>^=^!-- &IL&IOL' /3210#"&54733267'˱jo'5YaR FY?+?10"'53273q]6>7'&!` /10673#P9!6琝E5; /10673#W0AVADL! /10#56673La(@x>D{5 !?3?310"3254#"&546323X:VYnby|fs'qs枞"FJ %@   ??9/]33310##7!733!77z''y{4" B9݁3Ps9@  !?3?39/3102#"'532654&#"'!!6qΫ\nsedRB:K?x!7,um4C`L?>7 7%@  !?3?39/]3910632#"&54632&#"2654&#"JHxetUbR>%8OwVCX53)H/9%Z}jc[({kU8=%ED=JJL ?3?10!7!sV/Jו{j7+@ &  !?3?29102#"&547&&54632654"6654&x?L942A9:N6=0 F;1m`C'aKz|fO'[E=&2%1 }kKvVVKpKK@: HulOltZZ\QOQ KlQQlK -, 48!59/333/3339//////3]333q3+]33333222222]10!#%5!#533!5353!5!!5!5!#3#35!#35!35!#35#3#3#"&546323254#"%32##32654&##32654#"'53253T/0momImmmm0oowoooomm~smp.,;0m^{B.$*/;J1%Z^4+V}i0oo/mmmmmmoo;mmJoooo/yhIaCS1D D8QYb" "+%J fVr_cT*@ (""//9///3310 54676654&#"63232654&#"TV,AgIOGRZ?>1HT;GFBIHCHEVW/2A1R~X8*P:/5K6DpJ;?HI>@IHE!&7L &+5s/R9).9@@#,2!!2HYGY!!''7GY'GY?+?+99//_^]++3310#"&54>54#"763232&$546323654&#"*76a[Xc ;ܳ'kUNKS%0]WQ#: '^R7d]Y,E8ͳ6"lm(Cg@  KY?+??933106632&#"#3Dw՛bH=-(1drwQx h)dR+-@ ##  GY GY?2+?+339/910"&547!77!##"'4'!32677332a^'ߐ26)?>Lb#sx¶(jPd~[g^[\dL9IDu&0vT &+5/!&Pv //&+5N&$[;^f&D[72&2o\e @    /q3210#"&546324&#"326ol}jh:/.<64/:dzggzzg1771299bV ?10673#%4%#"&U?to% BG715Bi:P,%/;9=IK@'G@AA<;)66HY &2FY-"FY?3+3?3+3?33+33??9/10"'5327#?6632&#"!76632&#"3##"'5327!#34632#"&LZ;@2,ٳ,s`=J>ES,u`>J=GQ'+_6<6(J(*NE6AOB3FjL\Ƨ+VbV`Ũ+VbV㽲RDT56GR49=?@!<;"FY )66HY &2FY-?2+3?33+33?3+3??10"'5327#?6632&#"!76632&#"3##"'5327!#3LZ;@2,ٳ,s`=J>ES,u`>J=GQ'+_6<6(J(*LjL\Ƨ+VbV`Ũ+VbV㽲$"@  LY LY?+?+9910# $3 6673%"32654&V.HM) ۊ{L+ %j8fʭSΪ^$"@ !FYFY?+?+991026673#"&54$4&#"3266nGX([b[]QcaZPd9GYLZkyov# @   LY ?+?39/3106673#"&54733267)T\ /9%{H`uZ9৯m/ .@  JY  FY?+??39/+910326736673#7##"&547p-cP_,RgR^L1wtmB}!C!vRU3 /210#76654#"5632[KZ)F=Uq5[6+=Yy}  /3104632#"&NF6@OB3FDT56GR4Fs&(CR  &+5Fs&C}R &+5^!&HCn %%&+5o!&XC &+581@++  LY2''LY?3+3?3+39/910"'632#"'#"5$32&&#"32677332654&5[5XmY>xum)X7pvpsgu5)QPLJa* aw؋`T a+œ{V5JTЍfJR@ ???3393221033363##? )-6JF-RhdJfPZ/@KY LY LY?+99//+3+310!!!7!73!!3232654&##+35L)5h:luyb'c\L%'$8@ HY GY HY ?+?3+39/+910!632#"&547#7373!"32654&=>myvޖú\'--ZkjyXs_Moh2fVGHFV%1@LY!LY! LY?+?+??9/3+310"!!3267#"47!#3!!2&ϫ;@)U^^j5S װ`߿.G%$$ @6m%F\R/f$1@ GY FYFY?+?+??9/3+310"&57##336$32&&#"!!3267f^@âF0kBg,'bqd:}UV#RD=!+mz!+G %@ KY ?33?9/+3910!###!##7'&&'ێVBXT977!#&&####"!T=of\9[q:DK Ui7fT쁆L ውW=y^b]z9fR*@JY HY?+?339/33+310#6677!#&&'#"!jIyEV0+# 5F]7^p8 Qf:dTNJBmˋUbV}5f/R #3@ GY!   #HY ?+?3?9/33+3310!67!#3!7!#&&'#"!d/1g^EX1 +# =CfjEV-s\Z'#RDSiiHtkDWM?[ DjHM@(:4C8>> >4 '(('KY((F44/KY4KY/+?+39/+993_^]3910327632&#"&546%6654&##732654&#"'67&'53>32&#"jйƢl}D__CkCAs٨)ncZ&oj-NSS12(("KR}14N#&q"vqbzZZyvJt>YE$:`VZEI@'(= DEEDHY=EE7 7-GY7" @ H  HY ?+3+29?+9/9+93102654#"'67&'536632&#"32632&#"&5467>54##7z~@q(]MHdzC1-&$L:Ň}]_mۃV}NHo9Cey<$PQuJ;MR^vL 8G8lvSoX1+L ''r -I:u &@LY LY LY?+?+9/+10# $32267!"!654&V'5 G8L+ ,8H#%^7d &@HY FY GY?+?+9/+10#"&54$32267!"!54&7b#gb&aL)-ox3qw@  KY?+??910%67>32&#"!33Jbi|VBE/3=\@J ˈ?f_FbbZ@  GY ?+??9103367>32&#"!b7 1I?\oJ>*$#0=kRnË5r6 D;s&vR ""&+55bb!&vd !!&+55 &2\^d&R\V1-,@, ,LY"$&&LY ?33/+33+333310#"&'&54$7663226'#"'6E;/LE!fy,5290鳫"0*1+"Qz(!E.]{A=*`#TW@3LL6=$C=CLY!    @H   *=NI6ILY16?3+3?3299//+_^]93/3+39/310#".#"#663237654&'&&5432"'632#"'#"5$32&&#"326732654&{!!Lwf[0\u=qosA썒}&l?O5[5XȁW_%ðum)X7stVHt|a#*#p%-%^~T#= QG* axB6 a+]S^))<No@@= H<,IY<7@@ 471IY777@ H7L4    GY# GY?3+3?3+39/_^]3+]+9/++10"'#"&54632&#"3273254#"'632#".#"#663237654&'&&54632hyĉzfLEF}q^BY3x!!Lwf[0\u>qorA}$85?NSSX=-oo9+=ȝ"*"q%+%]T$?  (,I FE@" @! (99!(.(.LY(@5!5LY!?3+3?3+39/22999310#'##'##'7"'632#"'#"5$32&&#"32677332654&s t1F1F1+ 5[5XmY>xum)X7pvpsgu5)QPLJa6gggg6* aw؋`T a+œ{V5JTЍfJ $8@!##  @ H  ?33?3322+9393?10#'##'##'73363##- u3F3G2( ? )-6JF-6gggg6;RhdJfPZ!@ LY LY ?+?+?10"327#&5$32&󎨜]ifa׮^ͮ!9 (\R^f@ FYFY?+?+?10&&54$32&#"327diÙFzccZqdf`ԷZ=5hu-7o @   ?910%'%7%7%RH㴁EHJ{J;{Z}9IĤ{?J  /33210#"&5463!632W-0EEZ..BE^7%;F_.&  (,J) (6DR_m @ H  "00,&4@ H4)ZggS`IB:P@ HPE>LL7Ec^Vk@ Hk``)`EE`) @ H /2/3+9///]+2333+2333+23333+2102#&&#"#62#&&#"#662#&&#"#66!2#&&#"#662#&&#"#66!2#&&#"#662#&&#"#6!2#&&#"#66]qObvzw%ֆI GNmdPf'<@  # "" FY FY ?+??+99?999102'#"'##336"37'7654BF-"X VR cT`WQ"AajHP5} $@ LY  LY ?+?9/3+310!!!##73}+\>+ƒ냔+NoR $@ HY FY?+?9/3+3103#73!!!!/b%e+\; '`Ŵ;F.@  LY LYLY?+?+?9/+910"#!!632#"'532654&/W(5+b@X ġsk^ 0/5/ R.@FYFY FY?+?+?9/+910%#"'53254&#"#!!632Vbmnc=+X)V=N7˺/9؃VRmB+@ # LY?+??3?33931033!3###!9K āVTLL'+-{Tf;B@#$((IY &&"77FY +0+0FY+?+33?3+3???9/3+3102333632&#"327#&&557####"'7326654&#"56+ef7S6),2ZYXTNL}Tee6D=%0*_UYQ8=Lf&) u{wպ!!+ uy-j& -f&PDmV$@  #LY?+???393310%3###3!Xw5oo/F)/yR$@   "FY?+???393310!3###3u}XlrnR!RDd*@      ?3?393399910!!##373!5#R{u5H:ZFRVFHR,@  ?3?3993399910!#3737!!#'1oiC  9$K=Rl@>^kFm2@ LY  ?3?39/]3+3910!!##73733#!?u+#"+JbL˟^/-@IY   ?3??99/3+310373!!3!!##%'%B((#шMfı|` #@  LY?+?3?93310!!#!7!! +3nl/F)L/R #@   GY ?+?3?93310!!#!7!!Jt'=nR!Fm%@ LY   #LY?+???39/+10%3##!#3!3߁Vʋ56mV/yR%@ GY " FY ?+???39/+10!33##!#^_}XdHfRDq#RF $@ LY   LY ?+?3?9/+10#!#3!!`ʋ56-)mV/R $@ GY   GY?+?3?9/+10!!!#!#^_C)dHfRDh#RFq0@ LY LYLY?+?+?39/+910!#!#!632#"'5326654&#"; 5@Zt~}lS.c13 / %R0@FYGY FY ?+?+?39/+910632#"'532654&#"#!#!#N;ˍXggkd>.Xdnm/9؂VhR+5K@+,# ))1KY))`) )) LY @LY!LY?+?++9/_^]+910327#"'#"$32&#"337&54632654#"%8AJ>ffZwYڄtFS_ꃠLrπ%n[Q{!n^*  /#ϭ·+1Q5Ȓ^{f,7S@- $**2HY***@ H** HY @GY"GY?+?++9/+_^]+910327#"'#"&54$32&#"337&&546326654#"{m)7>BRk]pٓ2n$5@KfXi_%ɤ}J^D>MHC P"E z|(}K5fbn5a-!&&;^-f&Fm @# LYLY?+?+3?10%3##!7!!;܁V-+/yf34@11$."))FY/GY?+??3+3??393310236632327#&54766'4#"#654#"#336'"KgJ"*2{X02wl+eun-b ftw7u"!"$'=8$R-+R<dPR   ??3910%673#33V/hi7 7TN\%@  LY  ??39/3+3910!!!#!7!73F %+AB+o!7%PR!@   HY ?3+3??3910%673!!##733(c/ 'AB'7e7:R.m% @  #LY?+???39910%3##!3!ׁVyJJ P:{qR @ " FY?+???39910!3!3##3|Xn}9umV'@ # LY  LY?+3?+3??10%#!!7!!!3V/ ++! ZyR&.@$"#$#GY $FY?3+3?3+3?910326673327#&&'##"&547!7!^h}Jpb#(4{Z<=Ɇa''Q0pՎ"! &aPҗVmǺoJ)@ LY #LY?+??39/+910###"&5473326733V{vPso ^XoD0&?@ 02*"{hR)@FY " FY?+??39/+91032733####"&547=F?b}X{8RL3BGwqMoJ2@   LY ??39/+339/9/910!#"&54733673%{|WDA uq KPHE[zD4+2>-.&DEP0JqR2@FY ??39/+339/99/103673#>7##7"&547(+i77N? %Rh718RwHXy10k&随KtD@LY ?3?9/+9106632#654#"#3J ur ^V5q4$4=/'*"R/R@ GY  ?3?9/+910!674&#"#33632> DA]+," 7#1NAHJuRzXv^%%/3@ ) LY) ) )&LYLY?+?+99//3+310!2!#3267#"47&&54733"3 $54&Q ^ThV|rm>/T9I."dJ*Y7%1.#) KtilQM/TT XHVV|PVʆNPjlQM32%!H^QJWja@3$(1JEDIcxs@VAѵg1+F$@ LY LY  ??3?+9/+10"'53267!#3!3t2oʋ56A13mV/ R"@GY FY?+??39/+10!3#"'53267!#^_<ˊdlrs'ZHfRD5=#RFm%@ LY   #LY?+???39/+10%3!#!#3!3܌ʋ56mV/{R%@ GY " GY ?+???39/+10!33##!#^_dHfRDf#RmJ)@LY#LY?+??39/+910!#3#"&5473326733VPvP uq ^Vm\{0&2>-.&*"JyR)@FY " FY ?+??39/+910326773##3667##"&546>z-R⃿!BRP/uyJx7$[=Dm&@  # LY?+??3?399310!##!3!3!#67#s95Cm^XϦG }}a'"B){R(@   "GY?+??3?393910#&'#!67!3##0c )_Ay9ѾLSZRZOsd?,y&$6yR &+5^'&D61 $$&+5o>&$jXR $$&+55^&Dj 66&+55%^fFy&(6LR &+5^'&H6 ''&+5L"&@KY LY LY ?+?+9/+10"5663 #"&54$!3654&267# kzhCaV-'F4&ևHX7f #&@HY GY HY?+?+9/+10%267#"2#"&54$!3754&#"566a"@ݛM4+pqFfala39o~$0.$L>&jR 88&+557&j 99&+55B>&jTR ''&+55T&jX QQ&+55j>&jR >>&+55 &j ;;&+55q(@LY KY?+?9/33+910!"&'532654&##7!7!VcJPT…%+<#? '(-7ihϨR1@IYGY FY?+?+99/+910#"'532654&##7!7!ѧǑɖśg#)!ѪL\}F&MR &+5o&XM/ &+5F>&jR %%&+55o&Xj //&+55>&2jR 11&+55^7&Rj 11&+55~^7d>&~jR 55&+55^7&j 44&+55>&jR 22&+55j&jS 11&+55 j&MdR &+5VR&\M &+5 j>&j9R ++&+55VR&\j --&+55 js&SR ((&+55V~!&\S **&+55J>&jR **&+55h&j 00&+55Fm @# LY LY?+?+?10!3##+ہV5/yR @"FYFY?+?+?103!!3#/)\{XR4F>&j;R --&+55u&j 88&+55)D}4@KY LY LY  LY?+?9/3+3++10"'53277##73!!!!3V773h郔++\>+TK!DmoNrDR8@ HY FY FY FY ?+?++9/3+310"'53277##73!!!!3Z247e b%e+\; '7F!DmŴD%(@  KY  LY ?3+?3+9910"'53277#!3!3V774g{JJ پL!DmP:DTR)@  FY   FY ?+??3+9910"'53277#!3!3Y473iq3F!Dm}9u%)@  LY ?3?39/3+39910!!#7!3!!J+ -+mPXTR)@  HY ?3?39/3+3991033!3##!#&u;#}N @ KYLY?+?9/+104$!33!"&#"33N=}uRJ҇^GR^(1@ LY % %LY ?3+3?9/+9/910#"&'#"&54!333267#"3267^d)־j%KeQ v} LBPa_V[QXuP!NGODR$EGlmS[e\^j#0.@ +FY$$FY ?3+3?+?999/1032673#"&'##"&5463236732654&#"JF[`;C,ѷ ڡZ,L U]V\VW?EPx~Ӿo[ҹcZX`d4Ȥ[n`-6@+KY++&KY+ LY?+?+9/+99/1032673#"&54654&##732654&#"'6!2;{nFLSaZd+ö }'h[^}%oOMj!̹#R3b[UWnf'6@ %HY GY  FY ?+?+9/+99/1032673#"&574&##732654#"'6327Z`?D)ĭYr'vw@²j?qt-ÒBQFNQwJT=mu'0@ KY '#KY$LY?+?+?9/+910!#654&##732654&#"'66323#bN}})i`[xcԸ $hS[byU[yRDT`sP{f$0@!HY"GYFY?+?+?9/+9103##654&##732654#"'632L}V; b['ss?IJV`o1b0(L=POwJTkg$'@ $$LY$LY?3+3?+9/1032673#"&547!#"'53266NTeZf*­чΰQ47-DXSjF]+m}#ʽMo?2 T`.+@**FY*!FY FY ?+?+?+9/1032673#"&547&#"#"'532667>32IDT^!;F+j%!H^QJWja@3$(1JEDIcxs 9GHd̹?<@VAѵg1+a5FP,@LY LY ?+??39/+9/1032673#"&5477!#3!3VcZd-տ%ʋ56?pz#ι?smVK/R,@GYFY?+??39/+9/10!#3!332673#"&5469Hf^_ LFV`;=4ܻ#RDJ:'EFnȥ5w&@LY LY LY?+?+9/+10!# $32&&#"3267!g.rZfU(,Z2$ȷ^f&@GY FY GY?+?+9/+10!#"&54$32&#"3267!w:.ّVr|j|ATJ|%@LY LY?+?+39/107!!32673#"&547--}IISc[d-տK AHh#ι?cZR%@ GY FY ?+?+39/1032673#"&547!7!!IDT^!32F!Y255e %!H^QJWja@3$(1JEDIcxsm@VAѵg1+yN&$g^yf&DgN&$fR &+5^&Df %%&+5&$wR &+55^^&Dw ++&+55q&$xR &+55^&Dx ++&+55`;&$yR &+55^ &Dy ++&+55b&$zR 00&+55^&Dz BB&+55ys&$'gKZR &+5^y!&D'gK --&+5&${R &+55^&D{ !!&+55&$|R &+55^&D| **&+55X&$}R ""&+55^&D} 44&+55b&$~R $$&+55^&D~ 66&+55yZ&$'NHRg &+5^y&D&Ng $$&+5Fy&(g^yf&HgF&(fR &+5^&Hf ((&+5FH&(RPR &+5^K&HR --&+5F&(wR &+55^A&Hw ..&+55F&(xR &+55^&Hx ..&+55FC;&(yR &+55^&Hy ..&+55Fb&(zR --&+55^d&Hz EE&+55Fys&('gK?R &+5^y!&H'gK 00&+5E&,fR &+5/&f &+5y?&,gyV&Lgdy&2gB^y7d&Rg&2fR  &+5^7&Rf  &+5'&2wqR &&&+55^N&Rw &&&+55&2xoR &&&+55^7&Rx &&&+55;&2yoR &&&+55^&Ry &&&+55b&2zoR ==&+55^q&Rz ==&+55ys&2'gBKR ((&+5^y7!&R'gK ((&+5s&_vR --&+5^!&`v? ,,&+5s&_CoR &&&+5^!&`C %%&+5&_fR ((&+5^&`f ((&+5H&_RR ..&+5^&`R --&+5y&_gB^y&`gy&8g%oyR&Xg&8ffR &+5o&Xf &+5#s&avR &&&+5m/!&bvb ((&+5#s&aC?R &+5m/!&bC !!&+5#&afhR !!&+5m/&bf $$&+5#H&aRR ''&+5m/&bR1 ))&+5y#&ag%my/&bgy&<gjVRR&\g&<fR  &+5VR&\f; &+5H&<RR &+5VR&\R !!&+5P&B3 ! /3210#&&'53#&&'53<"*Yl@ *Y=B+$7:R)MD"=@#  /?@H/3+]9///33]310".#"#63232673"&5332673%KFAHu2$LHB&,s:}WVWd"1 V"..Ab- /2102654'3#"'5?08ZstJ5,66\wsivD  /210"'532673-Y2423DFN!D^+{ @ MY&MY?+?+10"32654#"&54$32VSؓQ7f @   ??9/910!#7'3QV",Wkol,:w?{@ MY&NY?+9?+10!!76654&#"'6632!mr#|EHOWpu.Q9LODnQ|u~vf %@OY $??9/33+3910%##!7!3!667#ӼNN%ÿ^'1JXoso$y!+ifdi?Q&P98@"FY )66HY &2FY-?2+3?33+33?3+310"'5327#?6632&#"!76632&#"3##"'5327!LZ;@2,ٳ,s`=J>ES,u`>J=GQ'+_6<6(J(jL\Ƨ+VbV`Ũ+VbV㽲w 16@ )!!-&&'/##'*'?33/33]2/39910#"'53254&'&&54632&#"##33#7#=wzJj\u/VbL~kcj+WF-85LnFլ̑ds%/Z#/%,`G[p.n'*&%/!3YoT/y&7zN\%H&Wz'f -.@($)$FY$FYFY?+?+?+?9910%2654&#""'5326?##"&54632373S_XTVYT؊GTu1TZ`1@/ ahfejD(0qr@lZϴdV\'!&K 44&+5'&N 11&+5'&O# 77&+5'!&:{ 11&+5Fh ??1033F7JFvs&CR &+5Fs&vR  &+5Fis&K>R  &+5F`>&jIR &+55FH&RKR  &+5FM&MWR &+5FxZ&N.R &+5-h&QTFL&O^R  &+5Fh'-`A 'T?5FhF\>&jER &+55FhF\>&jER &+55FhFhF!&fR &+5yh&g{2I6$$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs) $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q  q q q           ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q   q   q    q q  q  !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) -&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq7$&q&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq$q$ q$&$*$- $2$4$7q$9$:$<$$$$$$$$$$$$$$$$$$$$$$q$&q$6$8$:$G$$$$$q$ q$_$I$K$M$O$Q$S$U$W$Y$[$]$_$o$q$s$q%%%$%7%9%:%;%<%=%%%%%%%%%%%$%&%6%8%:%;%=%?%C%%%%%%% %X%%%!%#%%%'%)%+%-%/%1%3%o%q%s%&&&*&2&4&&&&&&&&&&&&&&&&&&&&G&_&I&K&M&O&Q&S&U&W&Y&[&]&_'''$'7'9':';'<'='''''''''''$'&'6'8':';'='?'C''''''' 'X'''!'#'%''')'+'-'/'1'3'o'q's'(-{)))"))$))))))))))C)) )X)))!)#)%)')))+)-)/)1)3.&.*.2.4....................G._.I.K.M.O.Q.S.U.W.Y.[.]._/\/ \/&/*/2/4/7/8/9/:/</////////////////////////$/&/*/,/./0/2/4/6/8/:/G/////\/ \/_/a/I/K/M/O/Q/S/U/W/Y/[/]/_/a/c/e/g/i/k/m/o/q/s/222$27292:2;2<2=22222222222$2&26282:2;2=2?2C2222222 2X222!2#2%2'2)2+2-2/21232o2q2s2333$3;3=3333333333;3=3?3C33 3X333!3#3%3'3)3+3-3/3133444$47494:4;4<4=44444444444$4&46484:4;4=4?4C4444444 4X444!4#4%4'4)4+4-4/41434o4q4s47777")7$q7&7*727477)7D\7Fq7Gq7Hq7Jq7P7Q7Rq7S7Tq7U7V7X7Y7Z7[7\7]7q7q7q7q7q7q77777777q7\7\7\7\7\7\7q7q7q7q7q7q7q7q7q7q7q777777q7\7q7\7q7\77q77q77q77q7q7q7q7q7q7q7q77q77q77q77q7777 77q77q77q77q7777!7$)7&)7+7-7/717375777<7>7@7Cq7D\7F\7G7Hq7J7777777 7W7Xq7Y\7_7`q7b7q7\7q7 \7!q7"\7#q7%q7&\7'q7(\7)q7*\7+q7,\7-q7.\7/q70\71q72\73q74\76q78q7:q7<@<C<D<F<G<H<J<< <W<X<Y<_<`<b<<<< <!<"<#<%<&<'<(<)<*<+<,<-<.</<0<1<2<3<4<6<8<:<<<@<B<D<I<J<K<L<M<N<O<Q<R<S<T<U<V<W<X<Y<Z<[<\<]<^<_<`<b<d<f<h<j<l<n=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_>-DD DD EE EYEZE[E\E]EE7E<E>E@EEEE EpF)F )F)F )HH HYHZH[H\H]HH7H<H>H@HHHH HpI{I {I{I {KK KK NFNGNHNRNTNNNNNNNNNNNNNNNNNNNNNNNNNNNNHN`N6N8N:N<N@NBNDNJNLNNNRNTNVNXNZN\N^N`PP PP QQ QQ RR RYRZR[R\R]RR7R<R>R@RRRR RpSS SYSZS[S\S]SS7S<S>S@SSSS SpURU RUDUFUGUHUJURUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUDUFUHURU RUYU`UU U"U&U(U*U,U.U0U2U4U6U8U:U<U@UBUDUJULUNURUTUVUXUZU\U^U`W)W )W)W )YRY RYYY")YRYY RY ZRZ RZZZ")ZRZZ RZ [F[G[H[R[T[[[[[[[[[[[[[[[[[[[[[[[[[[[[H[`[6[8[:[<[@[B[D[J[L[N[R[T[V[X[Z[\[^[`\R\ R\\\")\R\\ R\ ^-q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsqq q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq-{&*24G_IKMOQSUWY[]_-{-{-{-{$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13$C X!#%')+-/13")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjln$;=;=?C X!#%')+-/13             YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p YZ[\]7<>@ p   YZ[\]7<>@ pR R")R R  YZ[\]7<>@ pR R")R R q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  &*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_&*24G_IKMOQSUWY[]_$79:;<=$&68:;=?C X!#%')+-/13oqsR R "@E=K=N=O=`={R R$79:;<=$&68:;=?C X!#%')+-/13oqs-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p-{ YZ[\]7<>@ p  &*24G_IKMOQSUWY[]_FGHRTH`68:<@BDJLNRTVXZ\^`FGHRTH`68:<@BDJLNRTVXZ\^`\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqsR R "@E=K=N=O=`=R R\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs\ \&*24789:<$&*,.02468:G\ \_aIKMOQSUWY[]_acegikmoqs  $79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs$79:;<=$&68:;=?C X!#%')+-/13oqs-{R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`R RDFGHJRTDFHR RY` "&(*,.02468:<@BDJLNRTVXZ\^`$$$$")$$q$&$*$2$4$7)$D\$Fq$Gq$Hq$Jq$P$Q$Rq$S$Tq$U$V$X$Y$Z$[$\$]$q$q$q$q$q$q$$$$$$$$q$\$\$\$\$\$\$q$q$q$q$q$q$q$q$q$q$q$$$$$$q$\$q$\$q$\$$q$$q$$q$$q$q$q$q$q$q$q$q$$q$$q$$q$$q$$$$ $$q$$q$$q$$q$$$$!$$)$&)$+$-$/$1$3$5$7$<$>$@$Cq$D\$F\$G$Hq$J$$$$$$$ $W$Xq$Y\$_$`q$b$q$\$q$ \$!q$"\$#q$%q$&\$'q$(\$)q$*\$+q$,\$-q$.\$/q$0\$1q$2\$3q$4\$6q$8q$:q$&@&Cq&D\&F\&G&Hq&J&&&&&&& &W&Xq&Y\&_&`q&b&q&\&q& \&!q&"\&#q&%q&&\&'q&(\&)q&*\&+q&,\&-q&.\&/q&0\&1q&2\&3q&4\&6q&8q&:q&(@(Cq(D\(F\(G(Hq(J((((((( (W(Xq(Y\(_(`q(b(q(\(q( \(!q("\(#q(%q(&\('q((\()q(*\(+q(,\(-q(.\(/q(0\(1q(2\(3q(4\(6q(8q(:q(8@8C8D8F8G8H8J88 8W8X8Y8_8`8b8888 8!8"8#8%8&8'8(8)8*8+8,8-8.8/808182838486888:8<8@8B8D8I8J8K8L8M8N8O8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8b8d8f8h8j8l8n9R9 R999")9R99 R9 :::"):$:&:*:2:4:D:F:G:H:J:P:Q:R:S:T:U:V:X:]:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::!:+:-:/:1:3:5:<:>:@:C:D:F:G:H:J:: :W:X:Y:_:`:b:::: :!:":#:%:&:':(:):*:+:,:-:.:/:0:1:2:3:4:6:8:::<:@:B:D:I:J:K:L:M:N:O:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:^:_:`:b:d:f:h:j:l:n;&;*;2;4;;;;;;;;;;;;;;;;;;;;G;_;I;K;M;O;Q;S;U;W;Y;[;];_=&=*=2=4====================G=_=I=K=M=O=Q=S=U=W=Y=[=]=_?&?*?2?4????????????????????G?_?I?K?M?O?Q?S?U?W?Y?[?]?_CqC qC&C*C- C2C4C7qC9C:C<CCCCCCCCCCCCCCCCCCCCC$qC&qC6C8C:CGCCCCCqC qC_CICKCMCOCQCSCUCWCYC[C]C_CoCqCsCqDD DD E-{GGG$G7G9G:G;G<G=GGGGGGGGGGG$G&G6G8G:G;G=G?GCGGGGGGG GXGGG!G#G%G'G)G+G-G/G1G3GoGqGsGVqV qVfVmVqqVrVsVuVxVqV qVT[[[V[_[b[d[i[p[q[r[t[u[x[[[ [T\\\V\_\b\f\i\m\s\v\y\z\{\|\}\~\\\\\\\\\\\\\\\\\\\\ \!]q]r]x]T^^ ^^ _q_ q_f_m_qq_r_s_u_x_q_ q_T```V`_`b`i`t`` aaaaV\a_\ab\afai\amasavayqaza{a|a}a~qaaaaaaaaaqaaqaqaaqaaaaaqaaaaaaa a!aSbqb qbfbmbqqbrbsbubxbqb qbTdfdmdsfffVf_fbfdfifpfqfrftfufxfff fThfhmhshhiqi qifimiqqirisiuixiqi qiTmmmVm_mbmdmimpmqmrmtmumxmmm mToooVo_obodoiotooo qqqqV\q_\qb\qfqi\qmqsqvqyqqzq{q|q}q~qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq q!qSrrrVr_rbrfrirmrsrvryrzr{r|r}r~rrrrrrrrrrrrrrrrrrrr r!sssVs_sbsdsispsqsrstsxsss sTtftmtsttuuuVu_ubufuiumuu vqvrvxvTxxxVx_xbxfxixmxsxvxyxzx{x|x}x~xxxxxxxxxxxxxxxxxxxx x!y){{ {{ || |||| ~) y~     y~ y~         y~       n| q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqql~    n|   n|   n| l|~  qff jlrqs~ffqqq q  q q qqq qn|q qq  r|  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq)l|~    l|~   rsz|  rsv  l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqqqff jlrqs~ffqqq q  q  rsz l|~  ))  n|   n|  rsz|  rsz|   ) js      j  )j       js   s  j        m  m         js    m  m  j   sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX !+-/135CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R ")$&*24DFGHJPQRSTUVX] !+-/135<>@CDFGHJ WXY_`b !"#%&'()*+,-./0123468:<@BDIJKLMNOQRSTUVWXYZ[\]^_`bdfhjlnR R")R R 7$&q7$&q7$&q$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)$q7)9):)<DFGHJPQRSTUVXqqqqqqqqq !$)&)+-/1356)8:CqDFHJVq_qbqiqyz{~qqqq)))WXqY`bjrqsq}qqqq q  q qqqq !q"#q%q&'q()q*+q,-q./q01q23q468:<@BDJLNRTVXZ\^`bdfhjlnoqs)&*247q89:<$q&q*,.02468:Gfmqqrsuxqqq\qT_al|\~qqq\\\\ qIKMOQSUWY[]_acegikmoqsq $q 7) 9) :) < D F G H J P Q R S T U V X q q q q q q                        q  q  q                             ! $) &) + - / 1 3 5 6) 8 : Cq D F H J Vq _q bq iq y z { ~              q    q  q       q ) ) )  W Xq Y ` b j rq sq }         q q  q  q         q    q    q    q q  q   !q " #q %q & 'q ( )q * +q , -q . /q 0 1q 2 3q 4 6 8 : < @ B D J L N R T V X Z \ ^ ` b d f h j l n o q s ) & * 2 4 7q 8 9 : <                         $q &q * , . 0 2 4 6 8 : G f m qq r s u x  q  q   q  \ q        T _ a l |\ ~        q    q    q  \  \    \     \        q  I K M O Q S U W Y [ ] _ a c e g i k m o q s q!q!r!x!TSSSS TTTVT_TbTfTiTmTsTvTyTzT{T|T}T~TTTTTTTTTTTTTTTTTTTT T!XqX qX&X*X- X2X4X7qX9X:X<XXXXXXXXXXXXXXXXXXXXX$qX&qX6X8X:XGXXXXXqX qX_XIXKXMXOXQXSXUXWXYX[X]X_XoXqXsXqYY YY ZZZVZ_ZbZdZiZpZqZrZtZuZxZZZ ZT`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`RbIfbWfbYfbZfb[fb\fbfb%fb'fb7fbfbfb4fb5fb]fb^fbpfbfbfjj jj llllllllllllllllllllll lrlslzl|lllllllllllllllllllllllllllll llllllmmmmmmm msmmmnn nnnnnnnnn n|nnnnnnnnnnnnnnn nnnoo ooooooooo omooooooooooooooooooooooooooopppppplp~ppppppppppppppppp p ppprqr qrrrqrrrrrrrqr qrnr|rrrrrrrrqrrrrrrrrrrrrrrrrrrr qrrqrrrsqs qssssssssssssqs qsjsms}sssssssssssssssssssssssssssss s ssssstqt qtttqtttttttqt qtnt|ttttttttqttttttttttttttttttt qttqtttuqu quuuuuuuuuuuuqu qujumu}uuuuuuuuuuuuuuuuuuuuuuuuuuuuu u uuuuuv vx xzzzz zzzzz z|q|q||||||||q| q|r|s|||||| | ||||}} }}}}}}}}} }}}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~ ~r~s~z~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~  qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  s s s rsz|    rsz|    rsz|  sl~  )    |   m rsv    )))))) jklqrsuwy}~)))))    ) js   f |   l{=}~j    )l{=}~j  l|~  j  l|~  j  l|~  j  )  )))))) jklqrsuwy}~)))))    ) js  \ \fH\ \|qqH HHq qq qmqq   l~  q)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )) jklqrsuwy}~))     s)) jklqrsuwy}~))     sl{=}~j  )  )    |         l|~  j   f m| )  )  )  q qqq qn|q qq  q qqq qn|q qq       rsz|    rsz|   l|~  j    )   rsz|    rsz|    rsz|    rsz|   qff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sqff jlrqs~ffqqq q  q  sq)qqqqqq jqklmqrqsuwy}~qqqqqqq)qqqqqqqqq q q q qqq js  )))))) jklqrsuwy}~)))))    ) js  l{=}~j  l|~  j          q             r v |       q                                                                           q             r v |       q                                      )   q rv|q    q rv|q    r    r|   )  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq  q q&*- 247q9:<$q&q68:Gq q_IKMOQSUWY[]_oqsq     !q! q!&!*!- !2!4!7q!9!:!<!!!!!!!!!!!!!!!!!!!!!$q!&q!6!8!:!G!!!!!q! q!_!I!K!M!O!Q!S!U!W!Y![!]!_!o!q!s!q"" "" #q# q#&#*#- #2#4#7q#9#:#<#####################$q#&q#6#8#:#G#####q# q#_#I#K#M#O#Q#S#U#W#Y#[#]#_#o#q#s#q$$ $$ %q% q%&%*%- %2%4%7q%9%:%<%%%%%%%%%%%%%%%%%%%%%$q%&q%6%8%:%G%%%%%q% q%_%I%K%M%O%Q%S%U%W%Y%[%]%_%o%q%s%q&& && 'q' q'&'*'- '2'4'7q'9':'<'''''''''''''''''''''$q'&q'6'8':'G'''''q' q'_'I'K'M'O'Q'S'U'W'Y'[']'_'o'q's'q(( (( )q) q)&)*)- )2)4)7q)9):)<)))))))))))))))))))))$q)&q)6)8):)G)))))q) q)_)I)K)M)O)Q)S)U)W)Y)[)])_)o)q)s)q** ** +q+ q+&+*+- +2+4+7q+9+:+<+++++++++++++++++++++$q+&q+6+8+:+G+++++q+ q+_+I+K+M+O+Q+S+U+W+Y+[+]+_+o+q+s+q,, ,, -q- q-&-*-- -2-4-7q-9-:-<---------------------$q-&q-6-8-:-G-----q- q-_-I-K-M-O-Q-S-U-W-Y-[-]-_-o-q-s-q.. .. /q/ q/&/*/- /2/4/7q/9/:/</////////////////////$q/&q/6/8/:/G/////q/ q/_/I/K/M/O/Q/S/U/W/Y/[/]/_/o/q/s/q00 00 1q1 q1&1*1- 121417q191:1<111111111111111111111$q1&q16181:1G11111q1 q1_1I1K1M1O1Q1S1U1W1Y1[1]1_1o1q1s1q22 22 3q3 q3&3*3- 323437q393:3<333333333333333333333$q3&q36383:3G33333q3 q3_3I3K3M3O3Q3S3U3W3Y3[3]3_3o3q3s3q44 44 5-{66 6Y6Z6[6\6]6676<6>6@6666 6p7-{88 8Y8Z8[8\8]8878<8>8@8888 8p9-{:: :Y:Z:[:\:]::7:<:>:@:::: :p;-{<< <Y<Z<[<\<]<<7<<<><@<<<< <p=-{>> >Y>Z>[>\>]>>7><>>>@>>>> >p?-{@@ @Y@Z@[@\@]@@7@<@>@@@@@@ @pA-{BB BYBZB[B\B]BB7B<B>B@BBBB BpC-{DD DYDZD[D\D]DD7D<D>D@DDDD DpIII$I7I9I:I;I<I=IIIIIIIIIII$I&I6I8I:I;I=I?ICIIIIIII IXIII!I#I%I'I)I+I-I/I1I3IoIqIsIJJ JYJZJ[J\J]JJ7J<J>J@JJJJ JpKKK$K7K9K:K;K<K=KKKKKKKKKKK$K&K6K8K:K;K=K?KCKKKKKKK KXKKK!K#K%K'K)K+K-K/K1K3KoKqKsKLL LYLZL[L\L]LL7L<L>L@LLLL LpMMM$M7M9M:M;M<M=MMMMMMMMMMM$M&M6M8M:M;M=M?MCMMMMMMM MXMMM!M#M%M'M)M+M-M/M1M3MoMqMsMOOO$O7O9O:O;O<O=OOOOOOOOOOO$O&O6O8O:O;O=O?OCOOOOOOO OXOOO!O#O%O'O)O+O-O/O1O3OoOqOsOQQQ$Q7Q9Q:Q;Q<Q=QQQQQQQQQQQ$Q&Q6Q8Q:Q;Q=Q?QCQQQQQQQ QXQQQ!Q#Q%Q'Q)Q+Q-Q/Q1Q3QoQqQsQSSS$S7S9S:S;S<S=SSSSSSSSSSS$S&S6S8S:S;S=S?SCSSSSSSS SXSSS!S#S%S'S)S+S-S/S1S3SoSqSsSUUU$U7U9U:U;U<U=UUUUUUUUUUU$U&U6U8U:U;U=U?UCUUUUUUU UXUUU!U#U%U'U)U+U-U/U1U3UoUqUsUXIRXWRXYfXZfX[fX\fXfX%RX'RX7fXfXfX4RX5RX]RX^RXpfXRXRZIRZWRZYfZZfZ[fZ\fZfZ%RZ'RZ7fZfZfZ4RZ5RZ]RZ^RZpfZRZR\IR\WR\Yf\Zf\[f\\f\f\%R\'R\7f\f\f\4R\5R\]R\^R\pf\R\R^IR^WR^Yf^Zf^[f^\f^f^%R^'R^7f^f^f^4R^5R^]R^^R^pf^R^R`IR`WR`Yf`Zf`[f`\f`f`%R`'R`7f`f`f`4R`5R`]R`^R`pf`R`Raaa$aaaaaaaaaaCaa aXaaa!a#a%a'a)a+a-a/a1a3fIffWffYffZff[ff\ffff%ff'ff7ffffff4ff5ff]ff^ffpfffffhIfhWfhYfhZfh[fh\fhfh%fh'fh7fhfhfh4fh5fh]fh^fhpfhfhfjIfjWfjYfjZfj[fj\fjfj%fj'fj7fjfjfj4fj5fj]fj^fjpfjfjflIflWflYflZfl[fl\flfl%fl'fl7flflfl4fl5fl]fl^flpflflfnIfnWfnYfnZfn[fn\fnfn%fn'fn7fnfnfn4fn5fn]fn^fnpfnfnfooo")o$o&o*o2o4oDoFoGoHoJoPoQoRoSoToUoVoXo]oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooo!o+o-o/o1o3o5o<o>o@oCoDoFoGoHoJoo oWoXoYo_o`oboooo o!o"o#o%o&o'o(o)o*o+o,o-o.o/o0o1o2o3o4o6o8o:o<o@oBoDoIoJoKoLoMoNoOoQoRoSoToUoVoWoXoYoZo[o\o]o^o_o`obodofohojolonpRp Rppp")pRpp Rp qqq")q$q&q*q2q4qDqFqGqHqJqPqQqRqSqTqUqVqXq]qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqq!q+q-q/q1q3q5q<q>q@qCqDqFqGqHqJqq qWqXqYq_q`qbqqqq q!q"q#q%q&q'q(q)q*q+q,q-q.q/q0q1q2q3q4q6q8q:q<q@qBqDqIqJqKqLqMqNqOqQqRqSqTqUqVqWqXqYqZq[q\q]q^q_q`qbqdqfqhqjqlqnrRr Rrrr")rRrr Rr sss")s$s&s*s2s4sDsFsGsHsJsPsQsRsSsTsUsVsXs]ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss ssssssssssss!s+s-s/s1s3s5s<s>s@sCsDsFsGsHsJss sWsXsYs_s`sbssss s!s"s#s%s&s's(s)s*s+s,s-s.s/s0s1s2s3s4s6s8s:s<s@sBsDsIsJsKsLsMsNsOsQsRsSsTsUsVsWsXsYsZs[s\s]s^s_s`sbsdsfshsjslsntRt Rttt")tRtt Rt { {{ {")$q&*247)D\FqGqHqJqPQRqSTqUVXYZ[\]qqqqqqq\\\\\\qqqqqqqqqqqq\q\q\qqqqqqqqqqqqqqq qqqq!$)&)+-/1357<>@CqD\F\GHqJ WXqY\_`qbq\q \!q"\#q%q&\'q(\)q*\+q,\-q.\/q0\1q2\3q4\6q8q:q?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~.notdefnullnonmarkingreturnspaceexclamquotedbl numbersigndollarpercent ampersand quotesingle parenleft parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon semicolonlessequalgreaterquestionatABCDEFGHI.altJKLMNOPQRSTUVWXYZ bracketleft backslash bracketright asciicircum underscoregraveabcdefghijklmnopqrstuvwxyz braceleftbar braceright asciitildenonbreakingspace exclamdowncentsterlingcurrencyyen brokenbarsectiondieresis copyright ordfeminine guillemotleft logicalnotuni00AD registered overscoredegree plusminus twosuperior threesuperioracutemu paragraphperiodcenteredcedilla onesuperior ordmasculineguillemotright onequarteronehalf threequarters questiondownAgraveAacute AcircumflexAtilde AdieresisAringAECcedillaEgraveEacute Ecircumflex Edieresis Igrave.alt Iacute.altIcircumflex.alt Idieresis.altEthNtildeOgraveOacute OcircumflexOtilde OdieresismultiplyOslashUgraveUacute Ucircumflex UdieresisYacuteThorn germandblsagraveaacute acircumflexatilde adieresisaringaeccedillaegraveeacute ecircumflex edieresisigraveiacute icircumflex idieresisethntildeograveoacute ocircumflexotilde odieresisdivideoslashugraveuacute ucircumflex udieresisyacutethorn ydieresisAmacronamacronAbreveabreveAogonekaogonekCacutecacute Ccircumflex ccircumflexCdotcdotCcaronccaronDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflexGbrevegbreveGdotgdot Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbar Itilde.altitilde Imacron.altimacron Ibreve.altibreve Iogonek.altiogonekIdotaccent.altdotlessiIJ.altij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotLslashlslashNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautOEoeRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexScedillascedillaScaronscaron Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflex YdieresisZacutezacute Zdotaccent zdotaccentZcaronzcaronlongsflorin Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccent circumflexcaronmacronbreve dotaccentringogonektilde hungarumlauttonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos.alt Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIota.altKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9Iotadieresis.altUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronpirhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055.alt afii10056.alt afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveendashemdash afii00208 underscoredbl quoteleft quoterightquotesinglbase quotereversed quotedblleft quotedblright quotedblbasedagger daggerdblbulletellipsis perthousandminutesecond guilsinglleftguilsinglright exclamdblfraction nsuperiorfranc afii08941pesetaEuro afii61248 afii61289 afii61352 trademarkOmega estimated oneeighth threeeighths fiveeighths seveneighths partialdiffDeltaproduct summationminusradicalinfinityintegral approxequalnotequal lessequal greaterequallozengeuniFB01uniFB02 cyrillicbrevedotlessjcaroncommaaccent commaaccentcommaaccentrotate zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperioruni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200BuniFEFFuniFFFCuniFFFDuni01F0uni02BCuni03D1uni03D2uni03D6uni1E3Euni1E3Funi1E00uni1E01uni1F4Duni02F3 dasiaoxiauniFB03uniFB04OhornohornUhornuhornuni0300uni0301uni0303hookdotbelowuni0400uni040Duni0450uni045Duni0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BF uni04C0.altuni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CE uni04CF.altuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7 uni1EC8.altuni1EC9 uni1ECA.altuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1uni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni20ABuni030Fcircumflexacutecombcircumflexgravecombcircumflexhookcombcircumflextildecombbreveacutecombbrevegravecomb brevehookcombbrevetildecombcyrillichookleftcyrillicbighookUCcyrillicbighookLCone.pnumzero.osone.ostwo.osthree.osfour.osfive.ossix.osseven.oseight.osnine.osffuni2120Tcedillatcedillag.altgcircumflex.alt gbreve.altgdot.altgcommaaccent.altIIgraveIacute Icircumflex IdieresisItildeImacronIbreveIogonek IdotaccentIJ IotatonosIota Iotadieresis afii10055 afii10056uni04C0uni04CFuni1EC8uni1ECA   46latnMOL ROM  nlatnMOL (ROM B      ligaligaligalnumlnumlnumloclloclonumonumonumpnumpnumpnumsalt saltsaltss01"ss01*ss012ss02:ss02@ss02Fss03Lss03Rss03Xtnum^tnumftnumn    &.6>FNV^Pz2HJJ.,ZgwEG      !$%IJ6 "(^IO]ILI5O4LI^V0R *H C0?1 0 +0a +7S0Q0, +7<<<Obsolete>>>0!0 +37yc 1:X;y]0z0b8%a&Z0  *H 0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0 070615000000Z 120614235959Z0\1 0 UUS10U VeriSign, Inc.1402U+VeriSign Time Stamping Services Signer - G200  *H 0ĵR`)J[/Kk5TX56^bMRQ4q{f*j 7٘tvJcEG.k NK+XJ,XB-uލǎlLgrIž`<cxi{-004+(0&0$+0http://ocsp.verisign.com0 U003U,0*0(&$"http://crl.verisign.com/tss-ca.crl0U% 0 +0U0U0010 UTSA1-20  *H PK$ $- 7 ,Za񑑳V@뒾89u6t:O7ʕBǠWdB5N3M'L8MxSݤ^ ⥾`߭(ǥKd[98"3/!?DA e$HDT\y>]r},CS}=*:Om ]^SWp`+nx'4[^I2300-GߍRFCmH 10  *H 01 0 UZA10U Western Cape10U Durbanville10 U Thawte10U Thawte Certification10UThawte Timestamping CA0 031204000000Z 131203235959Z0S1 0 UUS10U VeriSign, Inc.1+0)U"VeriSign Time Stamping Services CA0"0  *H 0 ʲ }uNgadڻ30X~k6xw~o< hlʽR-H=]_/kLR`@~ ?Ǵ߇_zj1.G 1s W-x43h/Š*Ë!fXWou<&]'x1"ijGC_^|}bM "Vͮv M٠h;004+(0&0$+0http://ocsp.verisign.com0U00AU:0806420http://crl.verisign.com/ThawteTimestampingCA.crl0U% 0 +0U0$U0010U TSA2048-1-530  *H JkXD1y+LͰXn)^ʓR G'/8ɓN"b?7!Op18UN$ҩ'NzaA*^ݻ+>W~ +;R8'?J00eeR&.Y)"\0  *H 0_1 0 UUS10U VeriSign, Inc.1705U .Class 3 Public Primary Certification Authority0 090521000000Z 190520235959Z01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0"0  *H 0 g`IoV|f^ q-!ќPL"5; .Z|=;%X{ ξ'tag'MjaXy'M4+G Df$fO8TrfujIh8y 0,`Hת809:|@T/ܨR>+!\ P4.M^%Ԍn|)]1ZՌgX5+!`x^{`W ]A cT`C!00U00pU i0g0e `HE0V0(+https://www.verisign.com/cps0*+0https://www.verisign.com/rpa0U0m+ a0_][0Y0W0U image/gif0!00+kπjH,{.0%#http://logo.verisign.com/vslogo.gif0U%0++04+(0&0$+0http://ocsp.verisign.com01U*0(0&$" http://crl.verisign.com/pca3.crl0)U"0 010UClass3CA2048-1-550Uk&pȡ?-50  *H ݔAaix0Ɛ<~B$s/DrPU nQj71ܥ-OM2NgUejzd8xEv1z`³]fvYI8VAwX00fgymPSo0  *H 01 0 UUS10U VeriSign, Inc.10U VeriSign Trust Network1;09U 2Terms of use at https://www.verisign.com/rpa (c)09100.U'VeriSign Class 3 Code Signing 2009-2 CA0 100729000000Z 120808235959Z01 0 UUS10U Massachusetts10 UWoburn10U Monotype Imaging Inc.1>0<U 5Digital ID Class 3 - Microsoft Software Validation v210U Type Operations10UMonotype Imaging Inc.00  *H 0Di|U 25L3^ L*8ט@I "SOCʋVnH9c;$5}rGWyˊJ@p-5cįפ {uePd"}KXEMYLM00 U00U0DU=0;09753http://csc3-2009-2-crl.verisign.com/CSC3-2009-2.crl0DU =0;09 `HE0*0(+https://www.verisign.com/rpa0U% 0 +0u+i0g0$+0http://ocsp.verisign.com0?+03http://csc3-2009-2-aia.verisign.com/CSC3-2009-2.cer0U#0k&pȡ?-50 `HB0 +700  *H N"gA~™cjrb<8=_G_[KI  VD 5< D`E*oL;4gpZ9\Zl5|eKmIp=b۴A~}n"w6MZ S1+(RzkwD ]%,͊0>KyʦN $ 񺐶\<'M0  *H Pj<1wPd%i9Zp&3ZFJŬ>PO'/ӁAZԯdb:8؛p.@am J.w1o{ƵѬd~M#, -~z (Psnek-1.1/doc/snek-book-theme.yml000066400000000000000000000033001353657467200166110ustar00rootroot00000000000000base: font_family: Open Sans Regular snek: green: 7ab306 heading: font_color: $snek_green font_size: 17 font: catalog: Open Sans Regular: normal: OpenSans-Regular.ttf italic: OpenSans-Italic.ttf bold: OpenSans-Semibold.ttf bold_italic: OpenSans-SemiboldItalic.ttf DejaVu Sans Mono: normal: DejaVuSansMono.ttf italic: DejaVuSansMono-Oblique.ttf bold: DejaVuSansMono-Bold.ttf bold_italic: DejaVuSansMono-BoldOblique.ttf title_page: align: right logo: top: 10% title: top: 70% font_size: 17 font_color: #000000 font_style: bold line_height: 2 subtitle: font_size: 12 font_style: italic line_height: 1 authors: margin_top: 19 font_size: 17 font_color: #000000 revision: margin_top: 17 font_size: 10 admonition_label: font_color: $snek_green font_style: bold font_size: $heading_h2_font_size page: background_color: ffffff layout: portrait margin: [0.75in, 0.75in, 0.75in, 0.75in] margin_inner: 0.75in margin_outer: 0.75in size: [5.5in, 8.5in] header: height: 0.6in border_color: $snek_green line_height: 2.0 vertical_align: bottom recto: left: content: '{chapter-refsig}    {chapter-number}' right: content: '{chapter-title}    {page-number}' verso: left: content: '{page-number}    {document-title}' right: content: $header_recto_left_content footer: height: 0.5in font_size: 8 recto: center: content: 'GNU General Public License Version 3 or later' verso: center: content: '© 2019 Keith Packard' literal: font_family: DejaVu Sans Mono code: font_family: DejaVu Sans Mono font_size: 11 snek-1.1/doc/snek-cover.svg000066400000000000000000005221721353657467200157100ustar00rootroot00000000000000 image/svg+xmlthe snek programming language Packard the snek programming language Keith Packard snek-1.1/doc/snek-label-nofont.svg000066400000000000000000000463671353657467200171610ustar00rootroot00000000000000 image/svg+xml snek-1.1/doc/snek-label.svg000066400000000000000000000412641353657467200156470ustar00rootroot00000000000000 image/svg+xml snek snek-1.1/doc/snek-theme.yml000066400000000000000000000033241353657467200156670ustar00rootroot00000000000000base: font_family: Open Sans Regular snek: green: 7ab306 heading: font_color: $snek_green font_size: 17 font: catalog: Open Sans Regular: normal: OpenSans-Regular.ttf italic: OpenSans-Italic.ttf bold: OpenSans-Semibold.ttf bold_italic: OpenSans-SemiboldItalic.ttf DejaVu Sans Mono: normal: DejaVuSansMono.ttf italic: DejaVuSansMono-Oblique.ttf bold: DejaVuSansMono-Bold.ttf bold_italic: DejaVuSansMono-BoldOblique.ttf title_page: align: right logo: top: 10% title: top: 70% font_size: 24 font_color: #000000 font_style: bold line_height: 2 subtitle: font_size: 14 font_style: italic line_height: 1 authors: margin_top: $base_font_size * 1.25 font_size: $base_font_size * 1.5 font_color: #000000 revision: margin_top: $base_font_size * 1.25 admonition_label: font_color: $snek_green font_style: bold font_size: $heading_h2_font_size page: background_color: ffffff layout: portrait margin: [1in, 1in, 1in, 1in] margin_inner: 1in margin_outer: 0.75in size: letter header: height: 0.75in border_color: $snek_green line_height: 2.0 vertical_align: bottom recto: left: content: '{chapter-refsig}    {chapter-number}' right: content: '{chapter-title}    {page-number}' verso: left: content: '{page-number}    {document-title}' right: content: $header_recto_left_content footer: height: 0.75in font_size: 8 recto: center: content: 'GNU General Public License Version 3 or later' verso: center: content: '© 2019 Keith Packard' literal: font_family: DejaVu Sans Mono code: font_family: DejaVu Sans Mono font_size: 11 snek-1.1/doc/snek.adoc000066400000000000000000002532451353657467200147050ustar00rootroot00000000000000= The Snek Programming Language: A Python-inspired Embedded Computing Language Keith Packard :title-logo-image: image:snek.svg[Snek] :version: 0.0 :revnumber: v{version} :revdate: 1 Jan 1970 :icons: :icontype: svg :copyright: Keith Packard 2019 :doctype: book :numbered: :stylesheet: snek.css :linkcss: :toc: :pdf-stylesdir: . :pdf-fontsdir: fonts :source-highlighter: coderay :media: prepress ifndef::backend-pdf[] [#logo] [link=https://keithp.com/snek] image::snek.svg[Snek] endif::[] [colophon] [%nonfacing] = License Copyright © 2019 {author} This document is released under the terms of the link:https://www.gnu.org/licenses/gpl-3.0.en.html[GNU General Public License, Version 3 or later] [dedication] [%nonfacing] == Acknowledgments Thanks to Jane Kenney-Norberg for building a science and technology education program using Lego. Jane taught my kids science in elementary school and Lego after school, and let me come and play too. I'm still there helping and teaching, even though my kids are nearly done with their undergraduate degrees. Thanks to Christopher Reekie and Henry Gillespie who are both students and student-teacher in Jane's program and who have helped teach Arduino programming using Lego robots. Christopher has also been helping design and test Snek. [verse] {author} {email} https://keithp.com == History and Motivations Teaching computer programming to students in the 10-14 age range offers some interesting challenges. Graphical languages that construct programs from elements dragged with a mouse or touch-pad can be frustratingly slow. Users of these languages don't develop portable skills necessary for more advanced languages. Sophisticated languages like C, Java and even Python are so large as to overwhelm the novice with rich semantics like “objects” and other higher level programming constructs. In days long past, beginning programmers were usually presented with microcomputers running very small languages: BASIC, Forth, Logo or the like. These languages were not restricted to aid the student, but because the hosts they ran on were small. Introductory programming is taught today in a huge range of environments, from embedded systems to cloud-based systems. Many of these are technological dead-ends — closed systems that offer no way even to extract source code, much less to reuse it in another environment. Some systems, such as Raspberry PI and Arduino, are open — they use standard languages so that skills learned with them are useful elsewhere. While the smallest of these machines are similar in memory and CPU size to those early microcomputers, these smaller machines are programmed as embedded computers using a full C++ compiler running on a separate desktop or laptop system. === Arduino in the Lego Program I brought Arduino systems into the classroom about five years ago. The hardware was fabulous and we built a number of fun robots. After a couple of years, I built some custom Arduino hardware for our needs. Our hardware has screw terminals for the inputs and outputs, a battery pack on the back and high-current motor controllers to animate the robots. Because these platforms are Arduino (with an ATmega 328P processor and a FTDI USB to serial converter) we can use the stock Arduino development tools. Students struggled with the complex syntax of Arduino C: they found it especially hard to type the obscure punctuation marks and to remember to insert semicolons. I often heard comments like “this takes too much typing” and “why is it so picky about semicolons?” The lack of an interactive mode made experimenting a bit slower than on our Logo systems. In spite of the difficulties, there have been students who have done interesting projects in Arduino robotics: * Chris Reekie, an 11th-grade student-teacher in the program, took the line follower robot design and re-wrote the Arduino firmware to include a PID controller algorithm. The results were spectacular, with the robot capable of smoothly following a line at high speed. * Henry Gillespie, another 11th-grade student-teacher, created a robot that automatically measured a person's height. This used an optical sensor to monitor movement of a beam as it lowered onto the person's head and showed measurements on an attached 7-segment display. We've shown this device at numerous local Lego shows. * Mark Fernandez, an eighth-grade student, built a solar energy system that automatically tracked the sun. Mark is now a mechanical engineering student at Washington University in St Louis. The hardware was just what we wanted, and a few students used skills learned in the program later on. However, the software was not aimed at young students just starting to write code. Instead of throwing out our existing systems and starting over, I wondered if we couldn't keep using the same (hand-made) hardware but improve the programming environment. === A New Language I searched for a tiny programming language that could run on Arduino and offer an experience more like Lego Logo. I wanted something that students could use as a foundation for further computer education and exploration, something very much like Python. There is a smaller version of Python, called MicroPython: it is still a fairly large language which takes a few hundred kB of ROM and a significant amount of RAM. The language is also large enough that we couldn't cover it in any detail in our class time. I finally decided to just try and write a small Python-inspired language that could fit on our existing Arduino Duemilanove compatible hardware. This machine has: * 32kB of Flash * 2kB of RAM * 1kB of EEPROM * 1 serial port hooked to a USB/serial converter * 1 SPI port * 6 Analog inputs * 14 Digital input/output pins I believe that shrinking the language to a small Python subset will let the language run on this hardware while also being simple enough to expose students to the whole language in a small amount of class time. === Introducing Snek The goals of the Snek language are: * *Text-based.* A text-based language offers a richer environment for people comfortable with using a keyboard. It is more representative of real-world programming than building software using icons and a mouse. * *Forward-looking.* Skills developed while learning Snek should be transferable to other development environments. * *Small.* This is not just to fit in smaller devices: the Snek language should be small enough to teach in a few hours to people with limited exposure to software. Snek is Python-inspired, but it is not Python. It is possible to write Snek programs that run under a full Python system, but most Python programs will not run under Snek. == A Gentle Snek Tutorial Before we get into the details of the language, let's pause and just explore the language a bit to get a flavor of how it works. We won't be covering anything in detail, nor will all the subtleties be explored. The hope is to provide a framework for those details. This tutorial shows what appears on the screen — both what the user types and what Snek displays. User input is shown *`in bold face, like this`* on the lines which start with `>` or `+`. Snek output is shown `in a lighter face, like this` on other lines. === Hello World A traditional exercise in any new language is to get it to print the words `hello, world` to the console. Because Snek offers an interactive command line, we can actually do this in several ways. The first way is to use Snek to echo back what you type at it. Start up Snek on your computer (perhaps by finding Snek in your system menu or by typing `snek` at the usual command prompt). When it first starts, Snek will introduce itself and then wait for you to type something. [subs="attributes+"] ---- Welcome to Snek version {revnumber} > ---- At this `> ` prompt, Snek will print anything you type to it: [source,subs="verbatim,quotes"] ---- > *'hello, world'* 'hello, world' ---- Here we see that Snek strings can be enclosed in single quotes. Strings can also be enclosed in double quotes, which can be useful if you want to include single quote marks in them. Snek always prints strings using single quotes, so the output here is the same as before. [source,subs="verbatim,quotes"] ---- > *"hello, world"* 'hello, world' ---- Snek is actually doing something a bit more complicated than echoing what you type. What you are typing is called an “expression”, and Snek takes the expression, computes the value that it represents and prints that out. In this case, the value of either *```'hello, world'```* or *```"hello, world"```* is `'hello, world'`. Stepping up a notch, instead of inputting *```'hello, world'```* directly, we can write a more complicated expression which computes it: [source,subs="verbatim,quotes"] ---- > *'hello,' + ' world'* 'hello, world' ---- At this point, we're using the feature of the interactive environment which prints out the value of expressions entered. Let's try using the print function instead:(((print))) [source,subs="verbatim,quotes"] ---- > *print('hello, world')* hello, world ---- This time, Snek printed the string without quote marks. That's because the print function displays exactly what it was given without quote marks while the command processor prints values in the same format as they would appear in a program (where you'd need the quote marks). **** You might wonder where the value from evaluating the expression *```print('hello, world')```* is printed. After all, Snek printed the value of other expressions. The answer is that the `print` function evaluates to “no value”, and when Snek sees “no value”, it doesn't print anything. We'll see this happen several more times during the tutorial. **** === Variables Variables are Snek's way of remembering things. Each variable has a name, like `moss` or `tree`, and each variable can hold one. You set (or “assign”) the value of a variable using the `=` operator, and you get the value by using the name elsewhere: [source,subs="verbatim,quotes"] ---- > *moss = 'hello, world'* > *moss* 'hello, world' ---- Snek creates a variable whenever you assign a value to it for the first time. === Functions Let's define a function which uses `print` to print `hello world` and call it. To define a new function in Snek, we use the `def` keyword like this:(((def))) [source,subs="verbatim,quotes"] ---- > *def hello():* + *print('hello, world')* + > *hello()* hello, world ---- There's lots of stuff going on here. First, we see how to declare a function by using the `def` keyword, followed by the name of the function, followed by the “arguments” in parentheses. We'll talk about arguments in the next section, <>. For now just type `()`. After the arguments there's a colon. Colons appear in several places in Snek and (outside of dictionaries) are used in the same way. After a colon, Snek expects to see a list of statements. The usual way of including a list of statements is to type them, one per line, indented from the line containing the colon by a few spaces. The number of spaces doesn't matter, but each line has to use the same indentation. When you're done with the list of statements, you enter a line with the old indentation level. While entering a list of statements, the command processor will prompt with `+` instead of `>` to let you know that it's still waiting for more input before it does anything. A blank line ends the list of statements for the `hello` function and gets you back to the regular command prompt. Finally, we call the new `hello` function and see the results. Snek normally ends each print operation by moving to the next line. That's because the print function has a named parameter called `end` which is set to a newline (`'\n'`) by default. You can change it to whatever you like, as in: [source,subs="verbatim,quotes"] ---- > *def hello():* + *print('hello', end=',')* + *print(' world', end='\n')* + > *hello()* hello, world ---- The first call appends a `,` to the output, while the second call explicitly appends a newline character, causing the output to move to the next line. There are a few characters that use this backslash notation; those are described in the section on <>. === Simple Arithmetic Let's write a function to convert from Fahrenheit temperatures to Celsius. If you recall, that's: ____ °C = (5/9)(°F - 32) ____ Snek can't use the ° sign in variable names, so we'll just use C and F:(((return))) [source,subs="verbatim,quotes"] ---- > *# Convert from Fahrenheit to Celsius* > *def f_to_c(F):* + *return (5/9) * (F - 32)* + > *f_to_c(38)* 3.333333 ---- The `#` character introduces a comment, which extends to the end of the line. Anything within a comment is ignored by Snek. The `f_to_c` function takes one “argument” called `F`. Inside the function, `F` is a variable which is set to the value you place inside the parentheses when you call `f_to_c`. In this example, we're calling `f_to_c` with the value 38. Snek gets the value 38 from `F` whenever Snek finds it in the function: [source,subs="verbatim,quotes"] ---- + *return (5/9) * (F - 32)* ⇒ return (5/9) * (38 - 32) ⇒ return 3.333333 ---- Snek requires an explicit multiplication operator, `*`, as it doesn't understand the mathematical convention that adjacent values should be multiplied. The return statement is how we tell Snek that this function computes a value that should be given back to the caller. [#for_range] === Loops, Ranges and Printing Two Values Now that we have a function to do this conversion, we can print a handy reference table for offline use:(((for)))(((in)))(((range))) [source,subs="verbatim,quotes"] ---- > *# Print a handy conversion table* > *def f_to_c_table():* + *for F in range(0, 100, 10):* + *C = f_to_c(F)* + *print('%f F = %f C' % (F, C))* + > *f_to_c_table()* 0.000000 F = -17.777779 C 10.000000 F = -12.222223 C 20.000000 F = -6.666667 C 30.000000 F = -1.111111 C 40.000000 F = 4.444445 C 50.000000 F = 10.000000 C 60.000000 F = 15.555556 C 70.000000 F = 21.111113 C 80.000000 F = 26.666668 C 90.000000 F = 32.222225 C ---- We see a new statement here: the `for` statement. This walks over a range of values, assigning the control variable (`F`, in this case) to each of the values in the range and then evaluating the list of statements within it. The `range` function creates the list of values for `F` by starting at the first value and stepping to just before the second value. If you give `range` only two arguments, Snek will step by 1. If you give `range` only one argument, Snek will use 0 as the starting point. We need to insert the numeric values into the string shown by print. Many languages use a special formatted-printing function to accomplish this. In Snek, there's a more general-purpose mechanism called “string interpolation”. String interpolation uses the `%` operator. Snek walks over the string on the left and inserts values from the list of values enclosed in parenthesis on the right wherever there is a `%` followed by a character. The result of string interpolation is another string which is then passed to print, which displays it. How the values are formatted depends on the character following the % mark; that's discussed in the <> section. How to make that set of values on the right is discussed in the next section, <> [#lists_and_tuples_tutorial] === Lists and Tuples Lists and Tuples in Snek are closely related data types. Both represent an ordered set of objects. The only difference is that Lists can be modified after creation while Tuples cannot. We call Lists “mutable” and Tuples “immutable”. Lists are input as objects separated by commas and enclosed in square brackets, Tuples are input as objects separated by commas and enclosed in parentheses:(((List)))(((Tuple))) [source,subs="verbatim,quotes"] ---- > *[ 'hello,', ' world' ]* ['hello,', ' world'] > *( 'hello,', ' world' )* ('hello,', ' world') ---- Let's assign these to variables so we can explore them in more detail: [source,subs="verbatim,quotes"] ---- > *l = [ 'hello,', ' world' ]* > *t = ( 'hello,', ' world' )* ---- As mentioned earlier, <> are ordered. That means that each element in a List or Tuple can be referenced by number. This number is called the index of the element, in Snek, indices start at 0: [source,subs="verbatim,quotes"] ---- > *l[0]* 'hello,' > *t[1]* ' world' ---- Lists can be modified, Tuples cannot: [source,subs="verbatim,quotes"] ---- > *l[0] = 'goodbye,'* > *l* ['goodbye,', ' world'] > *t[0] = 'beautiful'* :5 invalid type: ('hello,', ' world') ---- That last output is Snek telling us that the value ('hello', ' world') cannot be modified. [#for_list] We can use another form of the `for` statement to iterate over the values in a List or Tuple:(((for)))(((in))) [source,subs="verbatim,quotes"] ---- > *def print_list(list):* + *for e in list:* + *print(e)* + > *print_list(l)* goodbye, world > *print_list(t)* hello, world ---- Similar to the form described in the <> section, this `for` statement assigns the control variable (`e` in this case) to each of the elements of the list in turn and evaluates the statements within it. Lists and Tuples can be concatenated (joined into a single thing) with the `+` operator: [source,subs="verbatim,quotes"] ---- > *['hello,'] + [' world']* ['hello,', ' world'] ---- Tuples of one element have a slightly odd syntax, to distinguish them from expressions enclosed in parentheses: the value within the Tuple is followed by a comma: [source,subs="verbatim,quotes"] ---- > *( 'hello' , ) + ( 'world' , )* ('hello', 'world') ---- === Dictionaries Dictionaries are the fanciest data structure in Snek. Like Lists and Tuples, Dictionaries hold multiple values. Unlike Lists and Tuples, Dictionaries are not indexed by numbers. Instead, Dictionaries are indexed by another Snek value. The only requirement is that the index value be immutable, so that it can never change. Lists and Dictionaries are the only mutable data structures in Snek: anything else can be used as a Dictionary index.(((Dictionary))) The indexing value in a Dictionary is called the “key”, the indexed value is called the “value”. Dictionaries are input by enclosing key/value pairs, separated by commas, inside curly braces: [source,subs="verbatim,quotes"] ---- > *{ 1:2, 'hello,' : ' world' }* { 'hello,':' world', 1:2 } ---- Note that Snek re-ordered our dictionary. That's because Dictionaries are always stored in sorted order, and that sorting includes the type of the keys. Dictionaries can contain only one element with a given key: you're free to specify dictionaries with duplicate keys, but only the last value will occur in the resulting Dictionary. Let's assign our Dictionary to a variable and play with it a bit: [source,subs="verbatim,quotes"] ---- > *d = { 1:2, 'hello,' : ' world' }* > *d[1]* 2 > *d['hello,']* ' world' > *d[1] = 3* > *d['goodnight'] = 'moon'* > *d* { 'goodnight':'moon', 'hello,':' world', 1:3 } > *d[56]* :7 invalid value: 56 ---- This example shows creating the Dictionary and assigning it to `d`, then fetching elements of the dictionary and assigning new values. You can add elements to a dictionary by using an index that is not already present. When you ask for an element which isn't present, you get an error message. You can also iterate over the keys in a Dictionary using the same ``for`` <>. Let's try our print_list function on `d`: [source,subs="verbatim,quotes"] ---- > *print_list(d)* goodnight hello, 1 ---- You can test to see if an element is in a Dictionary using the `in` operator: [source,subs="verbatim,quotes"] ---- > *if 1 in d:* + *print('yup')* + *else:* + *print('nope')* + yup > *if 56 in d:* + *print('yup')* + *else:* + *print('nope')* + nope ---- === While The `for` statement is useful when iterating over a range of values. Sometimes we want to use more general control flow. We can rewrite our temperature conversion chart program using a while loop as follows:(((while))) [source,subs="verbatim,quotes"] ---- > *def f_to_c_table():* + *F = 0* + *while F < 100:* + *C = f_to_c(F)* + *print('%f F = %f C' % (F, C))* + *F = F + 10* + > *f_to_c_table()* 0.000000 F = -17.777779 C 10.000000 F = -12.222223 C 20.000000 F = -6.666667 C 30.000000 F = -1.111111 C 40.000000 F = 4.444445 C 50.000000 F = 10.000000 C 60.000000 F = 15.555556 C 70.000000 F = 21.111113 C 80.000000 F = 26.666668 C 90.000000 F = 32.222225 C ---- This does exactly what the for loop did in the <> section: it first assigns 0 to `F`, then iterates over the statements until `F` is no longer less than 100. === If "If" statements provide a way of selecting one of many paths of execution. Each block of statements is preceded by an expression: if the expression evaluates to `True`, then the following statements are executed. Otherwise, the next test is tried until the end of the `if` is reached. Here's a function which measures how many upper case letters, lower case letters and digits are in a string:(((if))) [source,subs="verbatim,quotes"] ---- > *def count_chars(s):* + *d = 0* + *l = 0* + *u = 0* + *o = 0* + *for c in s:* + *if '0' <= c and c <= '9':* + *d += 1* + *elif 'a' <= c and c <= 'z':* + *l += 1* + *elif 'A' <= c and c <= 'Z':* + *u += 1* + *else:* + *o += 1* + *print('digits %d" % d)* + *print('lower %d" % l)* + *print('upper %d" % u)* + *print('other %d" % o)* + > *count_chars('4 Score and 7 Years Ago')* digits 2 lower 13 upper 3 other 5 ---- The `elif` statements try other alternatives if previous `if` tests have not worked. The `else` statement is executed if all previous `if` and `elif` tests have not worked. This example also introduces the less-than-or-equal comparison operator ``\<=`` and demonstrates that ``for v in a`` also works on strings. === Controlling GPIOs General-purpose IO pins, or “GPIOs”, are pins on an embedded processor which can be controlled by a program running on that processor. When Snek runs on embedded devices like the Duemilanove or the Metro M0 Express, it provides functions to directly manipulate these GPIO pins. You can use either of these, or any other device which uses the standard Arduino pin numbers, for these examples.(((GPIO))) ==== Turning on the built-in LED Let's start by turning on the LED which is usually available on Digital pin 13:(((talkto)))(((on))) [source,subs="verbatim,quotes"] ---- > *talkto(D13)* > *on()* ---- Let's get a bit fancier and blink it:(((time.sleep))) [source,subs="verbatim,quotes"] ---- > *talkto(D13)* > *while True:* + *onfor(.5)* + *time.sleep(.5)* ---- ==== Hooking up a digital input Find a bit of wire to connect from Digital pin 1 to GND and let's control the LED with this primitive switch:(((read)))(((off))) [source,subs="verbatim,quotes"] ---- > *talkto(D13)* > *while True:* + *if read(D1):* + *on()* + *else:* + *off()* ---- When the wire is connected, the LED turns *off*, and when the wire is not, the LED turns *on*. That's how simple switches work on Arduino. Snek repeatedly reads the input and sets the LED as fast as it can. This happens thousands of times per second, giving the illusion that the LED changes the instant the switch changes. ==== Using an analog input If you've got a light sensor or potentiometer, you can hook that up to Analog pin 0 and make the LED track the sensor:(((read)))(((onfor))) [source,subs="verbatim,quotes"] ---- > *talkto(D13)* > *while True:* + *onfor(1-read(A0))* + *time.sleep(1-read(A0))* ---- ==== Controlling motors So far we've only talked about using one pin at a time. Arduino motor controllers take two pins: one for power and one for direction. Snek lets you tell it both pins at the same time and then provides separate functions to set the power and direction. If you have a motor controller hooked to your board with pin 3 as power and pin 2 as direction you can run the motor at half power and have it alternate directions with:(((setpower)))(((setleft)))(((setright))) [source,subs="verbatim,quotes"] ---- > *talkto((3,2))* > *setpower(0.5)* > *on()* > *while True:* + *setleft()* + *time.sleep(1)* + *setright()* + *time.sleep(1)* ---- = Snek Reference Manual The remainder of this book is a reference manual for the Snek language, including built-in functions and the Snek development environment. == Lexical Structure Snek programs are broken into a sequence of tokens by a lexer. The sequence of tokens is recognized by a parser. === Numbers Snek supports 32-bit floating point numbers and understands the usual floating point number format:(((Number))) ---- 123.456e+12 ---- integer:: A non-empty sequence of decimal digits fraction:: A decimal point (period) followed by a possibly empty sequence of decimal digits exponent:: The letter 'e' or 'E' followed by an optional sign and a non-empty sequence of digits indicating the exponent magnitude. All parts are optional, although the number must include at least one digit in either the integer part or the fraction. Floating point values (represented internally in IEEE 854 32-bit format) range from approximately `-1.70141e+38` to `1.70141e+38`. There is 1 sign bit, 8 bits of exponent and 23 stored/24 effective bits of significand (often referred to as the mantissa). There are two values of infinity (positive and negative) and a "Not a Number" (NaN) value indicating a failed computation. Computations using integer values will generate an error for values which cannot be represented as a 24-bit integer. That includes values that are too large and values with fractional components. === Names Names in Snek are used to refer to variables, both global and local to a particular function. Names consist of an initial letter or underscore, followed by a sequence of letters, digits, underscore and period. Here are some valid names:(((Name))) [source,subs="verbatim,quotes"] ---- hello _hello _h4 math.sqrt ---- And here are some invalid names: [source,subs="verbatim,quotes"] ---- .hello 4square ---- === Keywords Keywords look like regular Snek names, but they are handled specially by the language and thus cannot be used as names. Here is the list of Snek keywords:(((Keyword))) ---- and assert break continue def del elif else for global if import in is not or pass range return while ---- === Punctuation Snek uses many special characters to make programs more readable; separating out names and keywords from operators and other syntax. : ; , ( ) [ ] { } + - * ** / // % & | ~ ! ^ << >> = += -= *= **= /= //= %= &= |= ~= ^= <<= >>= > != < <= == >= > === White Space (Spaces and Newlines) Snek uses indentation to identify program structure. Snek does not permit tabs to be used for indentation; tabs are invalid characters in Snek programs. Statements in the same block (list of statements) are indented the same amount; statements in deeper blocks are indented more, statements in shallower blocks less. When typing Snek directly at the Snek prompt blank lines become significant, as Snek cannot know what you will type next. You can see this in the Tutorial, where Snek finishes an indented block at the blank line. When loading Snek from a file, blank lines (and lines which contain only a comment) are entirely ignored; indentation of those lines doesn't affect the block indentation level. Only lines with Snek tokens matter in this case. Spaces in the middle of the line are only significant if they are necessary to separate tokens; you can insert as many or as few as you like in other places. === String Constants String constants in Snek are enclosed in either single or double quotes. Use single quotes to easily include double quotes in the string, and vice-versa. Strings cannot span multiple lines, but you can input multiple strings adjacent to one another and they will be merged into a single string constant in the program.(((String))) \n:: Newline. Advance to the first column of the next line. \r:: Carriage Return. Move to the first column on the current line. \t:: Tab. Advance to the next 'tab stop' in the output. This is usually the next multiple-of-8 column in the current line. \xdd:: Hex value. Use two hex digits to represent any character. \\:: Backslash. Use two backslashes in the input to get one backslash in the string constant. Anything else following the backslash is just that character. In particular: \":: Literal double-quote. Useful inside double-quoted strings. \':: Literal single-quote. Useful inside single-quoted strings. === List and Tuple Constants List and Tuple constants in Snek are values separated by commas and enclosed in brackets: square brackets for Lists, parentheses for Tuples. Here are some valid Lists: [source,subs="verbatim,quotes"] ---- [1, 2, 3] ['hello', 'world'] [12] ---- Here are some valid Tuples: [source,subs="verbatim,quotes"] ---- (1, 2, 3) ('hello', 'world') (12,) ---- Note the last case — to distinguish between a value in parentheses and Tuple with one value, the Tuple needs to have a trailing comma. Only single-valued Tuples are represented with a trailing comma. === Dictionary Constants Dictionaries in Snek are key/value pairs separated by commas and enclosed in curly braces. Keys are separated from values with a colon.(((Dictionary))) Here are some valid Dictionaries: [source,subs="verbatim,quotes"] ---- { 1:2, 3:4 } { 'pi' : 3.14, 'e' : 2.72 } { 1: 'one' } ---- You can include entries with duplicate keys: the resulting Dictionary will contain only the last entry. The order of the entries does not matter otherwise: the resulting dictionary will always be the same: [source,subs="verbatim,quotes"] ---- > *{ 1:2, 3:4 } == { 3:4, 1:2 }* 1 ---- When Snek prints dictionaries, they are always printed in the same order, so two equal dictionaries will have the same string representation. == Data Types Like Python, Snek does not have type declarations. Instead, each value has an intrinsic representation — any variable may hold a value with any representation. To keep things reasonably simple, Snek has only a handful of representation types: Numbers:: Instead of having integers and floating point values, Snek represents numbers in floating point as described earlier. Integer values of less than 24 bits can be represented exactly in these floating point values: programs requiring precise integer behavior can still work as long as the values can be held in 24-bits.(((Number))) Strings:: Strings are just lists of bytes. Snek does not have any intrinsic support for encodings. Because they are just lists of bytes, you can store UTF-8 values in them comfortably. Just don't expect indexing to return Unicode code points.(((String))) Lists:: Lists are ordered collections of values. You can change the contents of a list by adding or removing elements. In other languages, these are often called arrays or vectors. Lists are “mutable” values.(((List))) Tuples:: Tuples are immutable lists of values. You can't change a tuple itself once it is created. If any _element_ of the tuple _is_ mutable, you can modify that element and see the changed results in the tuple.(((Tuple))) Dictionaries:: A dictionary is a mapping between *keys* and *values*. They work somewhat like Lists in that you can store and retrieve values in them. The index into a Dictionary may be any immutable value, which is any value other than a List or Dictionary or Tuple containing a List or Dictionary. Dictionaries are “mutable” values.(((Dictionary))) Functions:: Functions are values in Snek. You can store them in variables or lists, and then fetch them later.(((Function))) Boolean:: Like Python, Snek doesn't have an explicit Boolean type. Instead, a variety of values work in Boolean contexts as True or False values. All non-zero Numbers, non-empty Strings/Lists/Tuples/Dictionaries and all Functions are True. Zero, empty Strings/Lists/Tuples/Dictionaries are False. The name True is just another way of typing the number one. Similarly, the name False is just another way of typing the number zero.(((Boolean))) [#lists_and_tuples_reference] === Lists and Tuples The ``+=`` operator works a bit different on Lists than any other type — it appends to the existing list rather than creating a new list. This can be seen in the following example:(((+=))) [source,subs="verbatim,quotes"] ---- > *a = [1,2]* > *b = a* > *a += [3]* > *b* [1, 2, 3] ---- Compare this with Tuples, which (as they are immutable) cannot be appended to. In this example, ``b`` retains the original Tuple value. ``a`` gets a new Tuple consisting of ``(3,)`` appended to the original value. [source,subs="verbatim,quotes"] ---- > *a = (1,2)* > *b = a* > *a += (3,)* > *b* (1, 2) > *a* (1, 2, 3) ---- == Operators Operators are things like ``+`` or ``–``. They are part of the grammar of the language and serve to make programs more readable than they would be if everything was a function call. Like Python, the behavior of Snek operators often depends on the values they are operating on. Snek includes most of the Python operators. Some numeric operations work on floating point values, others work on integer values. Operators which work only on integer values convert floating point values to integers, and then take the integer result and convert back to a floating point value. _value_ ``+`` _value_:: The Plus operator performs addition on numbers or concatenation on strings, lists and tuples.(((+))) _value_ ``–`` _value_:: The Minus operator performs subtraction on numbers.(((-))) _value_ *** _value_:: The Multiplication operator performs multiplication on numbers. If you multiply a string, 's', by a number, 'n', you get 'n' copies of 's' concatenated together.(((*))) _value_ ``/`` _value_:: The Divide operator performs division on numbers.(((/))) _value_ ``//`` _value_:: The Div operator performs "integer division" on numbers, producing a result such that `x // y == floor(x / y)` for all numbers `x` and `y`.(((//))) _value_ ``%`` _value_:: The Modulus operator gives the "remainder after division" of its arguments, such that `x == y * (x // y) + x % y` for all numbers `x` and `y`. If the left operand is a string, it performs “interpolation” with either a single value or a list/tuple of values and is used to generate formatted output. See the <> section for details.(((%))) _value_ **** _value_:: The Power operator performs exponentiation on numbers.(((**))) _value_ ``&`` _value_:: The Logical And operator performs bit-wise AND on integers.(((&))) _value_ ``|`` _value_:: The Logical Or operator performs bit-wise OR on integers.(((|))) _value_ ``^`` _value_:: The Logical Xor operator performs bit-wise XOR on integers.(((^))) _value_ ``<<`` _value_:: The Left Shift operator does bit-wise left shift on integers.(((<<))) _value_ ``>>`` _value_:: The Right Shift operator does bit-wise left shift on integers.(((>>))) ``!`` _value_:: The Not operator performs a Boolean negation operation on its right operand. That is, if the operand is one of the True values, then Not returns `False` (which is 0), and if the operand is a `False` value, then Not returns `True` (which is 1).(((!))) ``~`` _value_:: The Logical Not operator performs a bit-wise NOT operation on its integer operand.(((~))) ``–`` _value_:: When used as a unary prefix operator, the Unary Minus operator performs negation on numbers.(((–))) ``+`` _value_:: When used as a unary prefix operator, the Unary Plus operator does nothing at all to a number.(((+))) _value_ ``[`` _index_ ``]``:: The Index operator selects the _index_-th member of strings, lists, tuples and dictionaries.((([ ]))) ``[`` _value_ _[_ ``,`` _value_ … _]_ ``]``:: The List operator creates a new List with the provided members. Note that a List of one value does not have any comma after the value and is distinguished from the Index operator solely by how it appears in the input.((("[value, …]"))) ``(`` _value_ ``)``:: Parenthesis serve to control the evaluation order within expressions. Values inside the parenthesis are computed before they are used as values for other operators.((("( )"))) ``(`` _value_ ``,`` ``)`` or ``(`` _value_ _[_ ``,`` _value_ … _]_ ``)``:: The Tuple operator creates a new Tuple with the provided members. A Tuple of one value needs a trailing comma so that it can be distinguished from an expression inside of parenthesis. ``{`` _key_ ``:`` _value_ _[_ ``,`` _key_ ``:`` _value_ … _]_ ``}``:: The Dictionary operator creates a new Dictionary with the provided key/value pairs. All of the _keys_ must be immutable.((("(value, …)"))) === Slices The Slice operator, _value_ ``[`` _base_ ``:`` _bound_ ``:`` _stride_ ``]``, extracts a sequence of values from Strings, Lists and Tuples. It creates a new object with the specified subset of values from the original. The new object matches the type of the original.(((slice))) _base_:: The first element of _value_ selected for the slice. If _base_ is negative, then it counts from the end of _value_ instead the beginning. _bound_:: The first element of _value_ beyond the range selected for the slice. _stride_:: The spacing between selected elements. _Stride_ may be negative, in which case elements are selected in reverse order, starting towards the end of _value_ and working towards the beginning. It is an error for _stride_ to be zero. All three values are optional. The default value for _stride_ is one. If _stride_ is positive, the default value for _base_ is 0 and the default for _bound_ is the length of the array. If _stride_ is negative, the default value for _base_ is the index of the last element in _value_ (which is ``len(``_value_``) – 1``) and the default value for _bound_ is ``–1``. A slice with a single colon is taken as indicating _base_ and _bound_. Here are some examples: [source,subs="verbatim,quotes"] ---- > *# initialize a to a* > *# Tuple of characters* > *a = ('a', 'b', 'c', 'd', 'e', 'f')* > *# With all default values, a[:] looks* > *# the same as a* > *a[:]* ('a', 'b', 'c', 'd', 'e', 'f') > *# Reverse the Tuple* > *a[::-1]* ('f', 'e', 'd', 'c', 'b', 'a') > *# Select the end of the Tuple starting* > *# at index 3* > *a[3:]* ('d', 'e', 'f') > *# Select the beginning of the Tuple,* > *# ending before index 3* > *a[:3]* ('a', 'b', 'c') ---- === String Interpolation String interpolation in Snek can be confused with formatted printing in other languages. In Snek, the ``print`` function prints any arguments as they are given, separating them with spaces on the line. String interpolation produces a new String from a format specification String and a List or Tuple of parameters: this new String can be used for printing or for anything else one might want a String for.(((%)))(((string interpolation))) If only a single value is needed, it need not be enclosed in a List or Tuple. Beware that if this single value is itself a Tuple or List, then String interpolation will get the wrong answer. Within the format specification String are conversion specifiers which indicate where to insert values from the parameters. These are indicated with a ``%`` sign followed by a single character: this character is the format indicator and specifies how to format the value. The first conversion specifier uses the first element from the parameters, etc. The format indicator characters are: ``%d``:: ``%i``:: ``%o``:: ``%x``:: ``%X``:: Format a number as a whole number, discarding any fractional part and without any exponent. ``%d`` and ``%i`` present the value in base 10. ``%o`` uses base 8 (octal) and ``%x`` and ``%X`` use base 16 (hexadecimal), with ``%x`` using lower case letters (a-f) and ``%X`` using upper case letters (A-F). ``%e``:: ``%E``:: ``%f``:: ``%F``:: ``%g``:: ``%G``:: Format a number as floating point. The upper case variants use ``E`` for the exponent separator, lower case uses ``e`` and are otherwise identical. ``%e`` always uses exponent notation, ``%f`` never uses exponent notation. ``%g`` uses whichever notation makes the output smaller. ``%c``:: Output a single character. If the parameter value is a number, it is converted to the character. If the parameter is a string, the first character from the string is used. ``%s``:: Output a string. This does not insert quote marks or backslashes. ``%r``:: Generate a printable representation of any value, similar to how the value would be represented in a Snek program. If the parameter value doesn't match the format indicator requirements, or if any other character is used as a format indicator, then ``%r`` will be used instead. Here are some examples of String interpolation: [source,subs="verbatim,quotes"] ---- > *print('hello %s' % 'world')* hello world > *print('hello %r' % 'world')* hello 'world' > *print('pi = %d' % 3.1415)* pi = 3 > *print('pi = %f' % 3.1415)* pi = 3.141500 > *print('pi = %e' % 3.1415)* pi = 3.141500e+00 > *print('pi = %g' % 3.1415)* pi = 3.1415 > *print('star is %c' % 42)* star is * > *print('%d %d %d' % (1, 2, 3))* 1 2 3 ---- And here are a couple of examples showing why a single value may need to be enclosed in a Tuple: [source,subs="verbatim,quotes"] ---- > *a = (1,2,3)* > *print('a is %r' % a)* a is 1 > *print('a is %r' % (a,))* a is (1, 2, 3) ---- In the first case, String interpolation is using the first element of ``a`` as the value instead of using all of ``a``. == Expression and Assignment Statements _value_:: An Expression statement simply evaluates _value_. This can be useful if _value_ has a side-effect, like a function call that sets some global state. At the top-level, _value_ is printed, otherwise it is discarded. _location_ ``=`` _value_:: The Assignment statement takes the value on the right operand and stores it in the location indicated by the left operand. The left operand may be a variable, a list location or a dictionary location.(((assignment)))(((=))) _location_ ``+=``, ``–=``, ``*=``, ``/=``, ``//=``, ``%=``, ``**=``, ``&=``, ``|=``, ``^=``, ``<\<=``, ``>>=`` _value_:: The Operation Assignment statements take the value of the left operand and the value of the right operand and performs the operation indicated by the operator. Then it stores the result back in the location indicated by the left operand. There are some subtleties about this which are discussed in the <> section of the <> chapter. (((+=)))(((–=)))(((*=)))(((/=)))(((//=)))(((%=)))(((**=)))(((&=)))(((|=)))(((^=)))(((<\<=)))(((>>=))) == Control Flow Snek has a subset of the Python control flow operations, including trailing ``else:`` blocks for loops. === `if` ____ `if` _value_ `:` block _[_ `elif` _value_ `:` … _] [_ `else:` block _]_ ____ An If statement contains an initial `if` block, any number of `elif` blocks and then (optionally) an `else` block in the following structure:(((if)))(((elif)))(((else))) [source,subs="verbatim,quotes"] ---- if if_value : if statements elif elif_value : elif_statements … else: else_statements ---- If _if_value_ is true, then _if_statements_ are executed. Otherwise, if _elif_value_ is true, then _elif_statements_ are executed. If none of the if or elif values are true, then the _else_statements_ are executed. === `while` ____ `while` _value_ `:` block _[_ `else:` block _]_ ____ A While statements consists of a `while` block followed by an optional `else` block:(((while)))(((else))) [source,subs="normal+"] ---- while _while_value_ : block else: block ---- _While_value_ is evaluated and if it evaluates as `True`, the while block is executed. Then the system evaluates _while_value_ again, and if it evaluates as `True` again, the while block is again executed. This continues until the _while_value_ evaluates as `False`. When the _while_value_ evaluates as `False`, the `else:` block is executed. If a `break` statement is executed as a part of the while statements, then the program immediately jumps past the else statements. If a `continue` statement is executed as a part of the `while` statements, execution jumps back to the evaluation of _while_value_. The `else:` portion (with else statements) is optional.(((break))) === `for` ____ `for` _name_ `in` _value_ `:` block _[_ `else:` block _]_ ____ For each value `v` in the list of _values_, the `for` statement assigns `v` to _name_ and then executes a block of statements. _Value_ can be specified in two different ways: as a List, Tuple, Dictionary or String values, or as a range expression involving numbers:(((for)))(((else))) [source,subs="verbatim,quotes"] ---- for _name_ in _value_: for statements else: else statements ---- In this case, the _value_ must be a List, Tuple, Dictionary or String. For Lists and Tuples, the values are the elements of the object. For Strings, the values are strings made from each separate (ASCII) character in the string. For Dictionaries, the values are the keys in the dictionary. [source,subs="verbatim,quotes"] ---- for name in range ( _[_ start , _]_ stop _[_ , step _]_ ): for statements else: else statements ---- In this form, the `for` statement assigns a range of numeric values to _name_. Starting with _start_, and going while not beyond _stop_, _name_ gets _step_ added at each iteration. _Start_ is optional; if not present, 0 will be used. _Step_ is also optional; if not present, 1 will be used. [source,subs="verbatim,quotes"] ---- > *for x in (1,2,3):* + *print(x)* + 1 2 3 > *for c in 'hi':* + *print(c)* + h i > *a = { 1:2, 3:4 }* > *for k in a:* + *print('key is %r value is %r' % (k, a[k]))* + key is 1 value is 2 key is 3 value is 4 > *for i in range(3):* + *print(i)* + 0 1 2 > *for i in range(2, 10, 2):* + *print(i)* + 2 4 6 8 ---- If a `break` statement is executed as a part of the `for` statements, then the program immediately jumps past the else statements. If a `continue` statement is executed as a part of the `for` statements, execution jumps back to the assignment of the next value to _name_. In both forms, the `else:` portion (with else statements) is optional.(((break))) === `return` _value_ The Return statement causes the currently executing function immediately evaluate to _value_ in the enclosing context.(((return))) [source,subs="verbatim,quotes"] ---- > *def r():* + *return 1* + *print('hello')* + > *r()* 1 ---- In this case, the `print` statement did not execute because the `return` happened before it. === `break` The Break statement causes the closest enclosing `while` or `for` statement to terminate. Any optional `else:` clause associated with the `while` or `for` statement is skipped when the `break` is executed.(((break))) [source,subs="verbatim,quotes"] ---- > *for x in (1,2):* + *if x == 2:* + *break* + *print(x)* + *else:* + *print('else')* + 1 ---- [source,subs="verbatim,quotes"] ---- > *for x in (1,2):* + *if x == 3:* + *break* + *print(x)* + *else:* + *print('else')* + 1 2 else ---- In this case, the first example does not print `else` due to the `break` statement execution rules. The second example prints `else` because the `break` statement is never executed. === `continue` The `continue` statement causes the closest enclosing `while` or `for` statement to jump back to the portion of the loop which evaluates the termination condition. In `while` statements, that is where the _while_value_ is evaluated. In `for` statements, that is where the next value in the sequence is computed.(((continue))) [source,subs="verbatim,quotes"] ---- > *vowels = 0* > *other = 0* > *for a in 'hello, world':* + *if a in 'aeiou':* + *vowels += 1* + *continue* + *other += 1* + > *vowels* 3 > *other* 9 ---- The `continue` statement skips the execution of `other += 1`, otherwise `other` would be `12`. === `pass` The `pass` statement is a place-holder that does nothing and can be used any place a statement is needed when no execution is desired.(((pass))) [source,subs="verbatim,quotes"] ---- > *if 1 != 2:* + *pass* + *else:* + *print('equal')* + ---- This example ends up doing nothing as the condition directs execution through the `pass` statement. == Other Statements === `import` _name_ The Import statement is ignored and is part of Snek so that Snek programs can be run using Python.(((import))) [source,subs="verbatim,quotes"] ---- > *import curses* ---- === `global` _name_ _[_ `,` _name_ … _]_ The Global statement marks the names as non-local; assignment to them will not cause a new variable to be created.(((global))) [source,subs="verbatim,quotes"] ---- > *g = 0* > *def set_local(v):* + *g = v* + > *def set_global(v):* + *global g* + *g = v* + > *set_local(12)* > *g* 0 > *set_global(12)* > *g* 12 > ---- Because `set_local` does not include `global g`, the assignment to `g` creates a new local variable, which is then discarded when the function returns. `set_global` does include the `global g` statement, so the assignment to `g` references the global variable and the change is visible after that function finishes. === `del` _location_ The Del statement deletes either variables or elements within a List or Dictionary.(((del))) === `assert` _value_ If _value_ is `False`, the program will print `AssertionError` and then stop. Otherwise, the program will continue executing. This is useful to add checks inside your program to help catch problems earlier. == Functions Functions in Snek (as in any language) provide a way to encapsulate a sequence of operations. They can be used to help document what a program does, to shorten the overall length of a program or to hide the details of an operation from other parts of the program. Functions take a list of “positional” parameters, then a list of “named” parameters. Positional parameters are all required, and are passed in the caller in the same order they appear in the declaration. Named parameters are optional; they will be set to the provided default value if not passed by the caller. They can appear in any order in the call. Each of these parameters is assigned to a variable in a new scope; variables in this new scope will hide global variables and variables from other functions with the same name. When the function returns, all variables in this new scope are discarded. Additional variables in this new scope are created when they are assigned to, unless they are included in a `global` statement.(((def))) === `def` `def` _fname_ `(` _pos1 [_ `,` _posn … ] [_ `,` _namen_ `=` _defaultn … ]_ `) :` block A `def` statement declares (or re-declares) a function. The positional and named parameters are all visible as local variables while the function is executing. Here's an example of a function with two parameters: [source,subs="verbatim,quotes"] ---- > *def subtract(a,b):* + *return a - b* + > *subtract(3,2)* 1 ---- And here's a function with one positional parameter and two named parameters: [source,subs="verbatim,quotes"] ---- > *def step(value, times=1, plus=0):* + *return value * times + plus* + > *step(12)* 12 > *step(12, times=2)* 24 > *step(12, plus=1)* 13 > *step(12, times=2, plus=1)* 25 ---- == Standard Built-in Functions Snek includes a small set of standard built-in functions, but it may be extended with a number of system-dependent functions as well. This chapter describes the set of builtin functions which are considered a “standard” part of the Snek language and are provided in all Snek implementations. === `len(value)` Len returns the number of characters for a String or the number of elements in a Tuple, List or Dictionary(((len))) [source,subs="verbatim,quotes"] ---- > *len('hello, world')* 12 > *len((1,2,3))* 3 > *len([1,2,3])* 3 > *len({ 1:2, 3:4, 5:6, 7:8 })* 4 ---- === `print(` _value1_ `, `_value2_`, …, `end='\n')` Print writes all of its positional parameters to the console separated by spaces (`' '`) followed by the `end` named parameter (default: `'\n'`).(((print))) [source,subs="verbatim,quotes"] ---- > *print('hello world', end='.')* hello world.> > *print('hello', 'world')* hello world > ---- === `sys.stdout.flush()` Flush output to the console, in case there is buffering somewhere. (((sys.stdout.flush))) === `ord(` _string_ `)` Converts the first character in a string to its ASCII value.(((ord))) [source,subs="verbatim,quotes"] ---- >ord('A') 65 ---- === `chr(` _number_ `)` Converts an ASCII value to a one character string.(((chr))) [source,subs="verbatim,quotes"] ---- > *chr(65)* 'A' ---- === `math.sqrt(` _number_ `)` Compute the square root of its numeric argument.(((math.sqrt))) [source,subs="verbatim,quotes"] ---- > *math.sqrt(2)* 1.414214 ---- == Common System Functions These functions are system-dependent, but are generally available. If they are available, they will work as described here. === `exit(` _value_ `)` Terminate Snek and return _value_ to the operating system. How that value is interpreted depends on the operating system. On Posix-compatible systems, _value_ should be a number which forms the exit code for the Snek process with zero indicating success and non-zero indicating failure.(((exit))) === `time.sleep(` _seconds_ `)` Pause for the specified amount of time (which can include a fractional part).(((time.sleep))) [source,subs="verbatim,quotes"] ---- > *time.sleep(1)* > ---- === `time.monotonic()` Return the time (in seconds) since some unspecified reference point in the system history. This time always increases, even if the system clock is adjusted (hence the name). Because Snek uses single-precision floating point values for all numbers, the reference point will be close to the starting time of the Snek system, so values may be quite small.(((time.monotonic))) [source,subs="verbatim,quotes"] ---- > *time.monotonic()* 6.859814 ---- === `random.seed(` _seed_ `)` Re-seeds the random number generator with `seed`. The random number generator will always generate the same sequence of numbers if started with the same `seed`.(((random.seed))) [source,subs="verbatim,quotes"] ---- > *random.seed(time.monotonic())* > ---- === `random.randrange(` _max_ `)` Generates a random integer between 0 and max-1 inclusive.(((random.randrange))) [source,subs="verbatim,quotes"] ---- > *random.randrange(10)* 3 ---- == Math Functions The Snek math functions offer the same functions as the Python math package, although at single precision instead of double precision. These functions are optional, but if any are provided, all are provided and follow the definitions here. === Number-theoretic and representation functions math.ceil(x):: Return the ceiling of x, the smallest integer greater than or equal to x.(((math.ceil))) math.copysign(x,y):: Return a number with the magnitude (absolute value) of x but the sign of y.(((math.copysign))) math.fabs(x):: Return the absolute value of x.(((math.fabs))) math.factorial(x):: Return the factorial of x.(((math.factorial))) math.floor(x):: Return the floor of x, the largest integer less than or equal to x.(((math.floor))) math.fmod(x,y):: Return the modulus of x and y: x - trunc(x/y) * y.(((math.fmod))) math.frexp(x):: Returns the normalized fraction and exponent in a tuple (frac, exp). 0.5 ≤ abs(frac) < 1, and x = frac * pow(2,exp).(((math.frexp))) math.fsum(l):: Returns the sum of the numbers in l, which must be a list or tuple.(((math.fsum))) math.gcd(x,y):: Return the greatest common divisor of x and y.(((math.gcd))) math.isclose(x,y,rel_val=1e-6,abs_val=0.0):: Returns a boolean indicating whether x and y are 'close' together. This is defined as abs(x-y) ≤ max(rel_tol * max(abs(a), abs(b)), abs_tol).(((math.isclose))) math.isfinite(x):: Returns True if x is finite else False.(((math.isfinite))) math.isinf:: Returns True if x is infinite else False.(((math.isinf))) math.isnan:: Returns True if x is not a number else False.(((math.isnan))) math.ldexp(x,y):: Returns x * pow(2,y).(((math.ldexp))) math.modf(x):: Returns (x - trunc(x), trunc(x)).(((math.modf))) math.remainder(x,y):: Returns the remainder of x and y: x - round(x/y) * y.(((math.remainder))) math.trunc:: Returns the truncation of x, the integer closest to x which is no further from zero than x.(((math.trunc))) round(x):: Returns the integer nearest x, with values midway between two integers rounding away from zero.(((round))) === Power and logarithmic functions math.exp(x):: Returns pow(e,x).(((math.exp))) math.expm1(x):: Returns exp(x)-1.(((math.expm1))) math.exp2(x):: Returns pow(2,x).(((math.exp2))) math.log(x):: Returns the natural logarithm of x.(((math.log))) math.log1p(x):: Returns log(x+1).(((math.log1p))) math.log2(x):: Returns the log base 2 of x.(((math.log2))) math.log10(x):: Returns the log base 10 of x.(((math.log10))) math.pow(x,y):: Returns x raised to the y^th^ power.(((math.pow))) === Trigonometric functions math.acos(x):: Returns the arc cosine of x in the range of 0 ≤ acos(x) ≤ π.(((math.acos))) math.asin(x):: Returns the arc sine of x in the range of -π/2 ≤ asin(x) ≤ π/2.(((math.asin))) math.atan(x):: Returns the arc tangent of x in the range of -π/2 ≤ atan(x) ≤ π/2.(((math.atan))) math.atan2(y,x):: Returns the arc tangent of y/x in the range of -π ≤ atan2(y,x) ≤ π.(((math.atan2))) math.cos(x):: Returns the cosine of x.(((math.cos))) math.hypot(x,y):: Returns sqrt(x*x + y*y).(((math.hypot))) math.sin(x):: Returns the sine of x.(((math.sin))) math.tan(x):: Returns the tangent of x.(((math.tan))) === Angular conversion math.degrees(x):: Returns x * 180/π.(((math.degrees))) math.radians(x):: Returns x * π/180.(((math.radians))) === Hyperbolic functions math.acosh(x):: Returns the inverse hyperbolic cosine of x.(((math.acosh))) math.asinh(x):: Returns the inverse hyperbolic sine of x.(((math.asinh))) math.atanh(x):: Returns the inverse hyperbolic tangent of x.(((math.atanh))) math.cosh(x):: Returns the hyperbolic cosine of x: (exp(x) + exp(-x)) / 2.(((math.cosh))) math.sinh(x):: Returns the hyperbolic sine of x: (exp(x) - exp(-x)) / 2.(((math.sinh))) math.tanh(x):: Returns the hyperbolic tangent of x: sinh(x) / cosh(x).(((math.tanh))) === Special functions math.erf(x):: Returns the error function at x.(((math.erf))) math.erfc(x):: Returns the complement of the error function at x. This is 1 - erf(x).(((math.erfc))) math.gamma(x):: Returns the gamma function at x.(((math.gamma))) math.lgamma(x):: Returns log(gamma(x)).(((math.lgamma))) === Mathematical constants math.pi:: The mathematical constant π, to available precision.(((math.pi)))(((π))) math.e:: The mathematical constant e, to available precision.(((math.e)))(((e))) math.tau:: The mathematical constant τ, which is 2π, to available precision.(((math.tau)))(((τ))) math.inf:: The floating point value which represents ∞.(((math.inf)))(((∞))) math.nan:: The floating point value which represents Not a Number.(((math.nan)))(((NaN))) == GPIO Functions On embedded devices, Snek has a range of functions designed to make manipulating the GPIO pins convenient. Snek keeps track of two pins for output and one pin for input. The two output pins are called Power and Direction. Each output function specifies which pins it operates on. All input and output values range between 0 and 1. Digital pins use only 0 or 1, analog pins support the full range of values from 0 to 1.(((GPIO))) Input pins can be set so that they read as 0 or 1 when nothing is connected by using `pulldown` or `pullup`. Using `pullnone` makes the pin “float” to provide accurate analog readings. Digital pins are to `pullup` by default, Analog pins are set to `pullnone`. Output pins are either *on* or *off*. A pin which is *on* has its value set to the current power for that pin; changes to the current power for the pin are effective immediately. A pin which is *off* has its output set to zero, but Snek remembers the `setpower` level and will restore the pin to that level when it is turned *on*. === `talkto(` _pin_ `)` Set the current output pins. If _pin_ is a number, this sets both the Power and Direction pins. If _pin_ is a List or Tuple, then the first element sets the Power pin and the second sets the Direction pin.(((talkto))) === `setpower(` _power_ `)` Sets the power level on the current Power pin to _power_. If the Power pin is currently *on*, then this is effective immediately. Otherwise, Snek remembers the desired power level and will use it when the pin is turned *on*. Values less than zero set the power to zero, values greater than one set the power to one.(((setpower))) === `setleft()` Turns the current Direction pin *on*.(((setleft))) === `setright()` Turns the current Direction pin *off*.(((setright))) === `on()` Turns the current Power pin *on*.(((on))) === `off()` Turns the current Power pin *off*.(((off))) === `onfor(` _seconds_ `)` Turns the current Power pin *on*, delays for _seconds_ and then turns the current Power pin *off*.(((onfor))) === `read(` _pin_ `)` Returns the value of _pin_. If this is an analog pin, then `read` returns a value from `0 to 1` (inclusive). If this a digital pin, then `read` returns either `0` or `1`.(((read))) === `pullnone(` _pin_ `)` Removes any `pullup` or `pulldown` settings for _pin_, leaving the value floating when nothing is connected. Use this setting on analog pins to get continuous values rather than just 0 or 1. This is the default setting for Analog pins. === `pullup(` _pin_ `)` Assigns a `pullup` setting for _pin_, so that the `read` will return 1 when nothing is connected. When in this mode, analog pins will return only 0 or 1. This is the default setting for Digital pins. === `pulldown(` _pin_ `)` Assigns a `pullup` setting for _pin_, so that the `read` will return 0 when nothing is connected. When in this mode, analog pins will return only 0 or 1. Note that some boards do not support this mode, in which case this function will not be available. === `stopall()` Turns all pins off.(((stopall))) === `neopixel(` _pixels_ `)` Programs either a set of neopixel devices connected to the current Power pin (when Power and Direction are the same) or a set of APA102 devices connected to the current Power (used for APA102 Data) and Direction (used for APA102 Clock) pins (when Power and Direction are different). _pixels_ is a list or tuple, each element of which is a list or tuple of three numbers ranging from 0 to 1 for the desired red, green and blue intensity of the target neopixel.(((neopixel))) [source,subs="verbatim,quotes"] ---- > *talkto(NEOPIXEL)* > *pixels = [(0.33, 0, 0), (0, 0.66, 0), (0, 0, 1)]* > *neopixel(pixels)* ---- This example programs three NeoPixel devices, the first one is set to one third intensity red, the second to two thirds intensity green and the last to full intensity blue. If there are additional neopixel devices connected, they will not be modified. If there are fewer devices connected than the data provided, the extra values will be ignored. == EEPROM built-in functions Snek on embedded devices may include persistent storage for source code. This code is read at boot time, allowing boards with Snek loaded to run stand-alone. These functions are used by Snekde to get and put programs to the device.(((eeprom))) === `eeprom.write()` Reads characters from the console and writes them to eeprom until a `^D` character is read.(((eeprom.write))) === `eeprom.show()` Dumps the current contents of eeprom out to the console. If a parameter is passed to this function then a `^B` character is sent before the text, and a `^C` is sent afterwards. Snekde uses this feature to accurately capture the program text when the Get command is invoked.(((eeprom.show))) === `eeprom.load()` Re-parses the current eeprom contents, just as Snek does at boot time.(((eeprom.load))) === `eeprom.erase()` Erase the eeprom.(((eeprom.erase))) === `reset()` Restart the Snek system, erasing all RAM contents. As part of the restart process, Snek will re-read any source code stored in eeprom.(((reset))) == Temperature Conversion Function This function is included in devices that have a built-in temperature sensor. === `temperature(` _sensorvalue_ `)` The conversion function is pre-set with the parameters needed to convert from the temperature sensor value to degrees Celsius. == Curses built-in functions Curses provides a simple mechanism for displaying text on the console. The API is designed to be reasonably compatible with the Python curses module, although it is much less flexible. Snek only supports ANSI terminals, and doesn't have any idea what the dimensions of the console are. Not all Snek implementations provide the curses functions.(((curses))) === `curses.initscr()` Puts the console into “visual” mode. Disables echo. Makes `stdscr.getch()` stop waiting for newline.(((curses.initscr))) === `curses.endwin()` Resets the console back to “normal” mode. Enables echo. Makes `stdscr.getch()` wait for newlines.(((curses.endwin))) === `curses.noecho()`, `curses.echo()`, `curses.cbreak()`, `curses.nocbreak()` All four of these functions are no-ops and are part of the API solely to make it more compatible with Python curses.(((curses.noecho)))(((curses.echo)))(((curses.cbreak)))(((curses.nocbreak))) === `stdscr.nodelay(` _nodelay_ `)` If _nodelay_ is True, then `stdscr.getch()` will return -1 if there is no character waiting. If _nodelay_ is False, the `stdscr.getch()` will block waiting for a character to return.(((stdscr.nodelay))) === `stdscr.erase()` Erase the screen.(((stdscr.erase))) === `stdscr.addstr(` _row_ `,` _column_ `,` _string_ `)` Displays _string_ at _row_, _column_. _Row_ `0` is the top row of the screen. _Column_ `0` is the left column. The cursor is left at the end of the string.(((stdscr.addstr))) === `stdscr.move(` _row_ `,` _column_ `)` Moves the cursor to _row_, _column_ without displaying anything there.(((stdscr.move))) === `stdscr.refresh()` Flushes any pending screen updates.(((stdscr.refresh))) === `stdscr.getch()` Reads a character from the console input. Returns a number indicating the character read, which can be converted to a string using `chr(c)`. If `stdscr.nodelay(nodelay)` was most recently called with _nodelay_ `= True`, then `stdscr.getch()` will immediately return -1 if no characters are pending.(((stdscr.getch))) == Snek Development Environment The Snek Development Environment, Snekde, is a Python program which runs on Linux, Mac OS X and Windows to work with small devices running Snek, such as the Duemilanove and Metro M0 Express boards.(((snekde))) === Starting Snekde On Windows and Linux, launch `snekde` from your application menu. On Mac OS X, Snekde is installed along with the other Snek files in the Snek folder inside your personal Applications folder, which is inside your Home folder. Double click on the Snekde icon to launch. Snekde runs inside a console or terminal window and doesn't use the mouse at all, instead it is controlled entirely using keyboard commands. Snekde splits the window into two panes. The upper pane is the ”editor pane” that holds your Snek program. The lower pane is the “console pane” and handles communications with the Snek device. === Basic Navigation Across the top of the window you'll see a list of commands which are bound to function keys. Those are there to remind you how to control Snekde. If your function keys don't work, you can use the Esc key along with a number key instead. Press and release the Esc key, then press and release a number key. For instance, to invoke the F1 command, press and release Esc, then press and release '1'. Between the two panes is a separator line. At the end of that line is the name of the currently connected Snek device, such as `/dev/ttyUSB0` on Linux or `COM12` on Windows. If there isn't a device connected, it will say "". The cursor shows which pane you are currently working with. To switch between the editor and console panes, use the F7 key. If you don't have one of these, or if it doesn't work, you can also use Esc-7 or Ctrl-o (press and hold the Ctrl key, press the `o` key and then release both). You can move around the current pane with the arrow, home, end and page-up/page-down keys. Cut/paste/copy use Ctrl-x, Ctrl-v and Ctrl-c or Esc-x, Esc-v and Esc-c respectively. To mark a section of text for a Cut or Paste command, press Esc-space or Ctrl-space then use regular movement commands. The selected region of text will be highlighted. === Connecting to a Device To connect to a device running Snek, press the F1 key (usually right next to the ESC key on your keyboard). That will display a dialog box in the middle of the screen listing all of the devices which might be running Snek (if you've got a serial modem or other similar device, that will also be listed here). Select the target device and press the ENTER key. Don't expect anything to happen in the lower pane just yet; you'll have to get the attention of the device first. Switch to the Console pane (F7) and press Ctrl-c to interrupt any currently running Snek program. You should see the Snek prompt (“> ”) appear in the pane. === Getting and Putting Programs to a Device The Snek device holds one program in non-volatile memory. When it starts up, it will run that program automatically. This lets you set up the device so that it will perform some action when it is turned on without needing to communicate with it first. The Get command fetches the current program from the connected device and puts it into the Editor pane. The Put command writes the Editor pane contents into non-volatile memory in the target device and then restarts the target device to have it reload the program. Both of these commands will interrupt any running Snek program before doing any work. === Loading and Saving Programs to the Host You can also save and load programs to the host file system. Both of these commands prompt for a filename using a file dialog. At the top of the dialog is the filename to use. The rest of the dialog contains directories and files within the same directory as the filename. Directories are enclosed in `[` `]`. Using the arrow keys replaces the filename with the highlighted name. You can also edit the filename using backspace and entering a new name. Select a filename by pressing enter. If the name is a directory, then the contents of that directory will replace the list of directories and files in the dialog. If the name is a file, then that will be used for the load or save operation. To quit from the dialog and skip loading or saving a file, press Escape. [%nonfacing] [appendix] = Snek on snekboard Snek for the snekboard includes the Common System, Math, GPIO (including the `neopixel` function) and EEPROM fountain's. Snek for the snekboard provides pre-defined variables for the eight analog I/O pins as well as the four 9V motor controllers:(((snekboard))) A1-A8:: Analog input and output pins. When used as output pins, you can use setpower to control the drive power. When used as input pins, Snek will return a value from 0-1 indicating the ratio of the pin voltage to 3.3V. By default, when used as input pins, Snek does not apply either a pull-up or pull-down resistor to the pin so that a disconnected pin will read an indeterminate value. Change this using `pullnone`, `pullup` or `pulldown` functions. M1-M4:: Bi-directional 9V DC motor control, 2.5A max current. These are tuples with two values each. `M1[0]`, `M2[0]`, `M3[0]` and `M4[0]` are the power pins. `M1[1]`, `M2[1]`, `M3[1]` and `M4[1]` are the direction pins. Note that there's a bit of firmware behind these pins that keeps the outputs from changing power too rapidly. NEOPIXEL:: The two APA102 devices on the board, which can be driven using the `neopixel` function. Snekboard includes a boot loader which presents as a USB mass storage device with a FAT file system. You can get the board into this mode by connecting the board to your computer over USB and then pressing the blue reset button twice in quick succession. Then, find the `snek-board-`{version}`.uf2` file included in the Snek package for your machine and copy it to the `CURRENT.UF2` file to the snekboard file system. [%nonfacing] [appendix] = Snek on Arduino Duemilanove Snek for the Duemilanove includes the Common System, EEPROM, and GPIO functions. It does not include the Math functions, nor the `pulldown` function. Snek for the Duemilanove provides pre-defined variables for all of the GPIO pins:(((Duemilanove)))(((Arduino))) D0 - D13:: Digital input and output pins. By default, when used as input pins, Snek applies a pull-up resistor to the pin so that a disconnected pin will read as 1. Change this using `pullnone` or `pullup` functions. A0 - A5:: Analog input and Digital output pins. When used as input pins, Snek will return a value from 0-1 indicating the ratio of the pin voltage to 5V. By default, when used as input pins, Snek does not apply either a pull-up or pull-down resistor to the pin so that a disconnected pin will read an indeterminate value. Change this using `pullnone` or `pullup` functions. Snek fills the ATMega 328P flash completely leaving no space for the usual serial boot loader, so installing Snek requires a programming puck, such as the USBTiny device. On Linux, the Snek installation includes a shell script, snek-duemilanove-install, to install the binary using 'avrdude'. Read the snek-duemilanove-install manual (also included in the installation) for more information. On other hosts, you'll need to install 'avrdude'. Once you've done that, there are two steps to getting Snek installed on the device. 1. Set the 'fuses' on the target device. This sets the start address back to the beginning of memory instead of the boot loader, and then has the device leave the eeprom contents alone when re-flashing. That means you won't lose your Snek program when updating the firmware. + [source] $ avrdude -F -V -c usbtiny -p ATMEGA328P -U lfuse:w:0xff:m -U hfuse:w:0xd7:m -U efuse:w:0xfd:m + 2. Install the Snek binary. + [source,subs="attributes+"] $ avrdude -F -V -c usbtiny -p ATMEGA328P -U flash:w:snek-duemilanove-{version}.hex [%nonfacing] [appendix] = Snek on Adafruit ItsyBitsy (both 3v and 5v boards) Snek for the Adafruit ItsyBitsy includes the Common System, GPIO (without the `neopixel` function), and EEPROM functions. Snek for the itsybitsy provides pre-defined variables for all of the the GPIO pins:(((ItsyBitsy))) D0 - D13:: Digital input and output pins. By default, when used as input pins, Snek applies a pull-up resistor to the pin so that a disconnected pin will read as 1. Change this using `pullnone`, `pullup` or `pulldown` functions. A0 - A5:: Analog input and Digital output pins. When used as input pins, Snek will return a value from 0-1 indicating the ratio of the pin voltage to either 3.3V (on the 3v device) or 5V (on the 5V device). By default, when used as input pins, Snek does not apply either a pull-up or pull-down resistor to the pin so that a disconnected pin will read an indeterminate value. Change this using `pullnone`, `pullup` or `pulldown` functions. MISO, MOSI, SCK:: Additional digital input and output pins. These work just like D0-D13. Snek fills the ATMega 32u4 flash completely leaving no space for the usual USB boot loader, so installing Snek requires a programming puck, such as the USBTiny device. On Linux, the Snek installation includes a shell script, snek-itsybitsy-install, to install the binary using 'avrdude'. Read the snek-itsybitsy-install manual (also included in the installation) for more information. On other hosts, you'll need to install 'avrdude'. Once you've done that, there are two steps to getting Snek installed on the device. 1. Set the 'fuses' on the target device. This sets the start address back to the beginning of memory instead of the boot loader, and then has the device leave the eeprom contents alone when re-flashing. That means you won't lose your Snek program when updating the firmware. + [source] $ avrdude -F -V -c usbtiny -p m32u4 -U lfuse:w:0xff:m -U hfuse:w:0x91:m -U efuse:w:0xfd:m + 2. Install the Snek binary. Pick the right voltage for your board as that also sets the right clock speed. For 5v boards, install the 5v binary: + [source,subs="attributes+"] $ avrdude -F -V -c usbtiny -p m32u4 -U flash:w:snek-itsybitsy5v-{version}.hex + for 3v boards, use the 3v binary. + [source,subs="attributes+"] $ avrdude -F -V -c usbtiny -p m32u4 -U flash:w:snek-itsybitsy3v-{version}.hex [%nonfacing] [appendix] = Snek on Adafruit ItsyBitsy M0 Snek for the Adafruit ItsyBitsy includes the Common System, Math, GPIO (including the `neopixel` function), and EEPROM functions. Snek for the itsybitsy m0 provides pre-defined variables for all of the the GPIO pins:(((ItsyBitsy M0))) D0 - D13:: Digital input and output pins. By default, when used as input pins, Snek applies a pull-up resistor to the pin so that a disconnected pin will read as 1. Change this using `pullnone`, `pullup` or `pulldown` functions. D5 on the ItsyBitsy M0 is hooked to a 3.3V to 5V converter so that it can drive 5V devices. This means it cannot be used as an input pin. A0 - A5:: Analog input and Digital output pins. When used as input pins, Snek will return a value from 0-1 indicating the ratio of the pin voltage to 3.3V. By default, when used as input pins, Snek does not apply either a pull-up or pull-down resistor to the pin so that a disconnected pin will read an indeterminate value. Change this using `pullnone`, `pullup` or `pulldown` functions. SDA, SCL, MISO, MOSI, SCK:: Additional digital input and output pins. These work just like D0-D13. NEOPIXEL:: The APA102 device on the board, which can be driven using the `neopixel` function. The Adafruit ItsyBitsy M0 board includes a boot loader which presents as a USB mass storage device with a FAT file system. You can get the board into this mode by connecting the board to your computer over USB and then pressing the reset button twice in succession. In boot loader mode, the red LED on D13 will pulse rapidly for a few seconds, then more slowly. At that point, the APA102 device will turn green. Once the ItsyBitsy M0 is in boot loader mode and has been mounted, find the `snek-itsybitsym0-`{version}`.uf2` file included in the Snek package for your machine and copy it to the `CURRENT.UF2` file on the ItsyBitsy M0 file system. [%nonfacing] [appendix] = Snek on Arduino Mega Snek for the Mega includes the Common System, EEPROM, GPIO (not including the `pulldown` function) and math functions. Snek for the Mega provides pre-defined variables for all of the GPIO pins:(((Arduino Mega))) D0-D53:: Digital input and output pins. By default, when used as input pins, Snek applies a pull-up resistor to the pin so that a disconnected pin will read as 1. Change this using `pullnone` or `pullup` functions. A0-A15:: Analog input and Digital output pins. When used as input pins, Snek will return a value from 0-1 indicating the ratio of the pin voltage to 5V. By default, when used as input pins, Snek does not apply either a pull-up or pull-down resistor to the pin so that a disconnected pin will read an indeterminate value. Change this using `pullnone` or `pullup` functions. Snek fits comfortably in the ATmega2560 flash, leaving plenty of space for the serial boot loader, so re-installing Snek can be done over USB. However, the default firmware loaded on the ATMega16u2 that acts as USB to serial converter doesn't do any XON/XOFF flow control and so that should be replaced before installing Snek as Snekde will not get or put source code successfully without it. On Linux, the Snek installation includes a shell script, snek-mega-install, to install the binary using 'avrdude'. Read the snek-mega-install manual (also included in the installation) for more information. On other hosts, you'll need to install 'avrdude'. Once you've done that, you can use it to get Snek installed on the device. Because the EEPROM fuse bit can't be set this way, when you do this any Snek program stored on the device will be erased. Find out what port the Mega is connected to, use that as the value for `` and then run 'avrdude' as follows: [source,subs="attributes+"] $ avrdude -patmega2560 -cwiring -P -b115200 -D -U flash:w:snek-mega-{version}.hex:i [%nonfacing] [appendix] = Snek on Metro M0 Express Snek for the Metro M0 Express includes the Common System, Math, GPIO (including the `neopixel` function), and EEPROM functions. Snek for the metro m0 provides pre-defined variables for all of the GPIO pins:(((Metro M0 Express)))(((Arduino))) D0 - D13:: Digital input and output pins. By default, when used as input pins, Snek applies a pull-up resistor to the pin so that a disconnected pin will read as 1. Change this using `pullnone`, `pullup` or `pulldown` functions. A0 - A5:: Analog input and Digital output pins. When used as input pins, Snek will return a value from 0-1 indicating the ratio of the pin voltage to 3.3V. By default, when used as input pins, Snek does not apply either a pull-up or pull-down resistor to the pin so that a disconnected pin will read an indeterminate value. Change this using `pullnone`, `pullup` or `pulldown` functions. SDA, SCL:: Additional Digital input and output pins. These work just like D0-D13. NEOPIXEL:: The NeoPixel device installed on the board. The Adafruit Metro M0 Express board includes a boot loader which presents as a USB mass storage device with a FAT file system. You can get the board into this mode by connecting the board to your computer over USB and then pressing the reset button twice in quick succession. Then, find the `snek-metrom0-`{version}`.uf2` file included in the Snek package for your machine and copy it to the `CURRENT.UF2` file on the Metro M0 file system. [%nonfacing] [appendix] = Snek on Feather M0 Express Snek for the Feather M0 Express includes the Common System, Math, GPIO (including the `neopixel` function), and EEPROM functions. Snek for the feather provides pre-defined variables for all of the GPIO pins:(((Feather M0 Express)))(((Arduino))) D0 - D13:: Digital input and output pins. By default, when used as input pins, Snek applies a pull-up resistor to the pin so that a disconnected pin will read as 1. Change this using `pullnone`, `pullup` or `pulldown` functions. A0 - A5:: Analog input and Digital output pins. When used as input pins, Snek will return a value from 0-1 indicating the ratio of the pin voltage to 3.3V. By default, when used as input pins, Snek does not apply either a pull-up or pull-down resistor to the pin so that a disconnected pin will read an indeterminate value. Change this using `pullnone`, `pullup` or `pulldown` functions. SDA, SCL, SCK, MOSI, MISO:: Additional Digital input and output pins. These work just like D0-D13. NEOPIXEL:: The NeoPixel device installed on the board, which is connected to D8. RX, TX:: RX is D0, TX is D1. The Adafruit Feather M0 Express board includes a boot loader which presents as a USB mass storage device with a FAT file system. You can get the board into this mode by connecting the board to your computer over USB and then pressing the reset button twice in quick succession. Then, find the `snek-feather-`{version}`.uf2` file included in the Snek package for your machine and copy it to the `CURRENT.UF2` file on the Feather M0 file system. [%nonfacing] [appendix] = Snek on Adafruit Crickit Snek for the Crickit includes the Common System, Math, GPIO (including the `neopixel` function), and EEPROM functions. Snek for the Crickit provides names for all of the GPIO pins:(((Crickit))) DRIVE1 - DRIVE4:: High current “Darlington” 500mA drive outputs. MOTOR1, MOTOR2:: Bi-directional DC motor control, 1A max current. These are tuples with two values each. `MOTOR1[0]` and `MOTOR2[0]` are the power pins. `MOTOR1[1]` and `MOTOR2[1]` are the direction pins. Note that there's a bit of firmware behind these pins as the TI DRV8833 chip has a slightly funky control mechanism. SERVO1 - SERVO4:: Digital pins with PWM output CAP1 - CAP4:: Digital pins labeled “Capacitive Touch” on the Crickit board. SIGNAL1 - SIGNAL8:: The Signal pins. These provide digital output and analog input. SIGNAL5 - SIGNAL8 also provide PWM output NEOPIXEL:: The single NeoPixel device installed on the board. NEOPIXEL1:: The external NeoPixel connector. The Adafruit Crickit board includes a boot loader which presents as a USB mass storage device with a FAT file system. You can get the board into this mode by connecting the board to your computer over USB and then pressing the reset button twice in quick succession. Then, find the `snek-crickit-`{version}`.uf2` file included in the Snek package for your machine and copy it to the `CURRENT.UF2` file on the Crickit file system. [%nonfacing] [appendix] = Snek on Adafruit Circuit Playground Express Snek for the Circuit Playground Express includes the Common System, Math, GPIO (including the `neopixel` function), Temperature and EEPROM functions. Snek for the Playground provides names for all of the external connections as well as the built-in devices: A0 - A7:: External GPIO connections, labeled around the perimeter of the board. A8 or LIGHT:: Internal ambient light sensor. Returns a value indicating how much light is shining on the sensor. A9 or TEMP:: Internal temperature sensor. Use the builtin `temperature` function to convert values read from this pin to degrees Celsius. D4 or BUTTONA:: Connected to the momentary button labeled 'A'. 0 if not pressed, 1 if pressed. D5 or BUTTONB:: Connected to the momentary button labeled 'B'. 0 if not pressed, 1 if pressed. D7 or SWITCH:: Connected to the slide switch. 0 if slid right (towards the microphone), 1 if slid left (towards the speaker). D13 or LED:: The red LED near the USB connector. D8 or NEOPIXEL:: The string of 10 NeoPixel devices on the board. The Adafruit Circuit Playground Express board includes a boot loader which presents as a USB mass storage device with a FAT file system. You can get the board into this mode by connecting the board to your computer over USB, sliding the switch to the right (towards the microphone) and then pressing the reset button twice in quick succession.(((Playground))) Then, find the `snek-playground-`{version}`.uf2` file included in the Snek package for your machine and copy it to the `CURRENT.UF2` file on the Circuit Playground Express file system. ifdef::backend-pdf[] [index] = Index endif::[] snek-1.1/doc/snek.css000066400000000000000000000135511353657467200145610ustar00rootroot00000000000000/* CSS stylesheet for XHTML produced by DocBook XSL stylesheets. */ @font-face { font-family: 'Open Sans'; src: url('fonts/OpenSans-Regular.ttf'); font-weight: normal; font-style: normal; } @font-face { font-family: 'Open Sans'; src: url('fonts/OpenSans-Italic.ttf'); font-weight: normal; font-style: italic; } @font-face { font-family: 'Open Sans'; src: url('fonts/OpenSans-Semibold.ttf'); font-weight: bold; font-style: normal; } @font-face { font-family: 'Open Sans'; src: url('fonts/OpenSans-SemiboldItalic.ttf'); font-weight: bold; font-style: italic; } @font-face { font-family: 'DejaVu Sans Mono'; src: url('fonts/DejaVuSansMono.ttf'); font-weight: normal; font-style: normal; } @font-face { font-family: 'DejaVu Sans Mono'; src: url('fonts/DejaVuSansMono-Oblique.ttf'); font-weight: normal; font-style: oblique; } @font-face { font-family: 'DejaVu Sans Mono'; src: url('fonts/DejaVuSansMono-Bold.ttf'); font-weight: bold; font-style: normal; } @font-face { font-family: 'DejaVu Sans Mono'; src: url('fonts/DejaVuSansMono-BoldOblique.ttf'); font-weight: bold; font-style: oblique; } body { font-family: "Open Sans",sans-serif; font-size: 12pt; margin: 0; } code, pre { font-family: "DejaVu Sans Mono", monospace; } span.strong { font-weight: bold; } body blockquote { margin-top: .75em; line-height: 1.5; margin-bottom: .75em; } a:link { color: #55cf1f; } a:visited { color: #55cf1f; } h1, h2, h3, h4, h5, h6 { color: #55cf1f; font-family: "Open Sans",sans-serif; } div#content, div#header, div#footer { margin-left: 330px; margin-right: 2em; margin-top: 2em; margin-bottom: 2em; } div.toc { position: fixed; left: 0px; top: 240px; bottom: 0; width: 300px; margin-right: 0; margin-left: 0; margin-top: 2px; padding-left: 10px; padding-right: 10px; float: left; border-right: 2px solid #808080; border-collapse: collapse; overflow: auto; } div#logo img { position: fixed; left: 0px; top: 0px; width: 320px; height: 240px; margin-top: 0px; margin-bottom: 0px; border-right: 2px solid #808080; border-bottom: 2px solid #808080; } td.icon { width: 4em; height: 3em; } td.icon img { height: 100%; width: 100% } div.toc a:link { text-decoration: none; } div.toc a:visited { text-decoration: none; } div.toc a:hover { text-decoration: underline; } div.toc a:active { text-decoration: underline; } div.details { padding-top: 1em; padding-left: 3em; } span.author { font-weight: bold; color: #55cf1f; } span.email { font-size: 10pt; } span#revnumber { font-size: 8pt; } span#revdate { font-size: 8pt; } span#revremark { font-size: 8pt; } div#footer { border-top: 2px solid #808080; } body h1 { margin: .0em 0 0 -4%; line-height: 1.3; border-bottom: 2px solid #808080; } body h2 { margin: 0.5em 0 0 -4%; line-height: 1.3; border-bottom: 2px solid #808080; } body h3 { margin: .8em 0 0 -3%; line-height: 1.3; } body h4 { margin: .8em 0 0 -3%; line-height: 1.3; } body h5 { margin: .8em 0 0 -2%; line-height: 1.3; } body h6 { margin: .8em 0 0 -1%; line-height: 1.3; } body hr { border: none; /* Broken on IE6 */ } body td { line-height: 1.2 } body th { line-height: 1.2; } ol { line-height: 1.2; } ul, body dir, body menu { line-height: 1.2; } body h1, body h2, body h3, body h4, body h5, body h6 { margin-left: 0 } body pre { margin: 0.5em 10% 0.5em 1em; line-height: 1.2; } tt.literal, code.literal { } .programlisting, .screen { border: 1px solid #808080; background: #f4f4f4; margin: 0.5em 10% 0.5em 0; padding: 0.5em 1em; } div.sidebar { background: #ffffee; margin: 1.0em 10% 0.5em 0; padding: 0.5em 1em; border: 1px solid #808080; } div.sidebar * { padding: 0; } div.sidebar div { margin: 0; } div.sidebar p.title { margin-top: 0.5em; margin-bottom: 0.2em; } div.bibliomixed { margin: 0.5em 5% 0.5em 1em; } div.glossary dt { font-weight: bold; } div.glossary dd p { margin-top: 0.2em; } dl { margin: .8em 0; line-height: 1.2; } dt { margin-top: 0.5em; } dt span.term { font-weight: bold; } div.variablelist dd p { margin-top: 0; } div.itemizedlist li, div.orderedlist li { margin-left: -0.8em; margin-top: 0.5em; } ul, ol { list-style-position: outside; } div.sidebar ul, div.sidebar ol { margin-left: 2.8em; } div.itemizedlist p.title, div.orderedlist p.title, div.variablelist p.title { margin-bottom: -0.8em; } div.revhistory { border-style: none; } div.revhistory table, div.revhistory th, div.revhistory td { border-collapse: collapse; border: 1px solid #808080; padding: 0.25em; } div.revhistory th { color: black; } /* Keep TOC and index lines close together. */ div.toc dl, div.toc dt { line-height: normal; margin-top: 0; margin-bottom: 0; } div.admonitionblock { margin-top: 2em; margin-bottom: 2em; margin-left: 2em; margin-right: 2em; } div.admonitionblock div { margin-left: 0em; margin-right: 1em; } div.admonitionblock div.title { color: #c70909; font-style: bold; font-size: 24pt; } div#content table.tableblock { border-style: solid; border-width: 1px; border-collapse: collapse; } div#content table.tableblock td,th { border-right-style: solid; border-right-width: 1px; } div#content table.tableblock tbody p { margin-top: 0.25em; margin-bottom: 0.25em; margin-left: 0.25em; margin-right: 0.25em; } div#content table.tableblock tbody tr:nth-child(odd) { background: #cccccc; } div.imageblock{ margin-top: 1em; margin-bottom: 1em; } div.imageblock img { margin-bottom: 0.5em; } @media print { div.navheader, div.navfooter { display: none; } } snek-1.1/examples/000077500000000000000000000000001353657467200141535ustar00rootroot00000000000000snek-1.1/examples/Makefile000066400000000000000000000016321353657467200156150ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_NO_BUILD_TARGETS = 1 SNEK_ROOT = .. include $(SNEK_ROOT)/snek-install.defs all: echo all done EXAMPLES = \ blink.py \ hanoi.py \ morse.py \ snek-bsd.py \ snek.py \ track-light.py \ badshuffle.py \ goodshuffle.py install: install -d "$(DESTDIR)$(EXAMPLEDIR)" for example in $(EXAMPLES); do install -m 0644 "$$example" "$(DESTDIR)$(EXAMPLEDIR)"; done snek-1.1/examples/badshuffle.py000066400000000000000000000007141353657467200166320ustar00rootroot00000000000000#!/usr/bin/python3 import random import time random.seed(time.monotonic()) # "Shuffle" a list, but *wrong*. narray = 16 a = [0] * narray h = [0] * narray for _ in range(100000): for i in range(narray): a[i] = i for i in range(narray): j = random.randrange(narray) tmp = a[j] a[j] = a[i] a[i] = tmp for i in range(narray): if a[i] == narray - 1: h[i] += 1 break print(h) snek-1.1/examples/blink.py000066400000000000000000000012661353657467200156310ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # led = D13 def blink(): talkto(led) while True: on() time.sleep(0.5) off() time.sleep(0.5) blink() snek-1.1/examples/goodshuffle.py000066400000000000000000000007241353657467200170350ustar00rootroot00000000000000#!/usr/bin/python3 import random import time random.seed(time.monotonic()) # "Shuffle" a list, but *wrong*. narray = 16 a = [0] * narray h = [0] * narray for _ in range(100000): for i in range(narray): a[i] = i for i in range(narray): j = i + random.randrange(narray - i) tmp = a[j] a[j] = a[i] a[i] = tmp for i in range(narray): if a[i] == narray - 1: h[i] += 1 break print(h) snek-1.1/examples/hanoi.py000066400000000000000000000072651353657467200156350ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # import time import sys def clear(): print("\x1b[2J", end='') def display_string(x, y, str): print("\x1b[%d;%dH%s" % (y, x, str), end='') # A piece for position 'num' is num + 1 + num stars centered in a # field of max * 2 + 1 characters with spaces on either side. This # way, every piece is the same number of characters def bar(n): b = "" for i in range(n): b += "█" return b def make_string(n, c): s = "" for i in range(n): s += c return s def make_piece(num,max): return make_string(max - num - 1, ' ') + bar(2*num + 1) + make_string(max - num - 1, ' ') def make_pieces(max): pieces = [] for n in range(max): pieces += [make_piece(n, max)] return pieces towers=[] # Left edge of the towers left_x=4 # Position of the bottom of the stacks, set at runtime bottom_y=0 # delay between moves in seconds move_delay=0.0250 # Distance between columns on the screen col_spacing=25 def tower_x(col): return col * col_spacing + left_x # Position of the top of the tower on the screen Shorter # towers start further down the screen def tower_y(tower): return bottom_y - len(tower) def clear_above(x, tower): display_string(x, tower_y(tower) - 1, " ") # Display a piece from a tower def display_one(x, y, tower): display_string(x, tower_y(tower) + y, tower[y]) # Display a tower def display_tower(x, tower): for y in range(len(tower)): display_one(x, y, tower) # Display all of the towers. def display_towers(x, towers): for i in range(len(towers)): display_tower(x + i * col_spacing, towers[i]) def display_flush(): display_string(1, bottom_y + 1, "") sys.stdout.flush() time.sleep(move_delay) return True # Display all of the towers, then move the cursor out of the way and # flush the output def display_hanoi(): display_towers(left_x, towers) display_flush() # Reset towers to the starting state, with all of the pieces in the # first tower and the other two empty def reset_towers(len): global towers global bottom_y towers = [make_pieces(len), [], []] bottom_y = len + 3 def remove_top(tower): piece = towers[tower][0] new_tower = [] for i in range(1,len(towers[tower])): new_tower += [towers[tower][i]] towers[tower] = new_tower return piece def add_top(tower, piece): new_tower = [piece] for i in range(0, len(towers[tower])): new_tower += [towers[tower][i]] towers[tower] = new_tower # Move a piece from the top of one tower to the top of another def move_piece(frm, to): piece = remove_top(frm) add_top(to, piece) # The implementation of the game def _hanoi(n, frm, to, use): if n == 1: move_piece(frm, to) clear_above(tower_x(frm), towers[frm]) display_one(tower_x(to), 0, towers[to]) display_flush() else: _hanoi(n-1, frm, use, to) _hanoi(1, frm, to, use) _hanoi(n-1, use, to, frm) # A pretty interface which # resets the state of the game, # clears the screen and runs # the program def hanoi(len): reset_towers(len) clear() display_hanoi() _hanoi(len, 0, 1, 2) hanoi(8) snek-1.1/examples/morse.py000066400000000000000000000014151353657467200156530ustar00rootroot00000000000000# # Morse code example # T = 1.2 / 12 a=('.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '..', '.---', '-.-', '.-..', '--', '-.', '---', '.--.', '--.-', '.-.', '...', '-', '..-', '...-', '.--', '-..-', '-.--', '--..') n=('-----', '.----', '..---', '...--', '....-', '.....', '-....', '--...', '---..', '----.') def d(l): l = ord(l) if 97 <= l and l <= 122: return a[l-97] return n[l-48] def l(c): es = d(c) for e in es: if e == '.': onfor(T) else: onfor(3*T) time.sleep(T) time.sleep(3*T) def m(t): for c in t: if c == ' ': time.sleep(6*T) else: l(c) def cq(): talkto(D13) while True: m("cq cq de kd7sqg ") cq() snek-1.1/examples/neopixel.py000066400000000000000000000022441353657467200163520ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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, write to the Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. # bright = 0.1 def rainbow(pos): if pos < 1: r = pos g = 1 - r b = 0 elif pos < 2: b = pos - 1 r = 1 - b g = 0 else: g = pos - 2 r = 0 b = 1 - g neopixel(((bright*r,bright*g,bright*b),)) def blink(): talkto(NEOPIXEL) while True: for pos in range(0,3,0.01): rainbow(pos) time.sleep(0.003) blink() snek-1.1/examples/neopixels.py000066400000000000000000000036121353657467200165350ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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, write to the Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. # # # Rotate a rainbow through a set of pixels # DOWN=BUTTONA UP=BUTTONB num_pixels = 10 bright = 0.05 pixels = [0] * num_pixels for i in range(num_pixels): pixels[i] = [0,0,0] def wheel(i, pos): global bright if pos < 0 or pos > 255: r = 0 g = 0 b = 0 elif pos < 85: r = pos/85 g = 1 - r b = 0 elif pos < 170: b = (pos - 85) / 85 r = 1 - b g = 0 else: g = (pos - 170) / 85 r = 0 b = 1 - g pixels[i][0] = r * bright pixels[i][1] = g * bright pixels[i][2] = b * bright def rainbow_cycle(wait): global bright for j in range(255): for i in range(num_pixels): pixel_index = (i * 256 // num_pixels) + j wheel(i, pixel_index & 255) neopixel(pixels) if read(DOWN): if bright > 0.02: bright -= 0.01 print(bright) elif read(UP): if bright < 0.99: bright += 0.01 print(bright) time.sleep(wait) def cycles(): talkto(NEOPIXEL) while True: rainbow_cycle(0.001) cycles() snek-1.1/examples/servo-car.py000066400000000000000000000014201353657467200164230ustar00rootroot00000000000000servo = M4 motor = M1 front = A1 back = A2 def see(sensor): return read(sensor) > 0.1 def setservo(v): talkto(servo) if v < 0: setleft() v = -v else: setright() setpower(v) on() def go(t, d): talkto(motor) s = front if d: setright() s = front else: setleft() s = back setpower(1) onfor(t) def straight(t, d): setservo(0) go(t, d) def left(t, d): setservo(1) go(t, d) def right(t, d): setservo(-1) go(t, d) def bounce(): straight(random.randrange(10) / 10 + 1, True) right(random.randrange(10) / 10 + 1, False) left(random.randrange(10) / 10 + 1, True) straight(random.randrange(10) / 10 + 1, False) while True: bounce() snek-1.1/examples/snek-bsd.py000066400000000000000000000377051353657467200162470ustar00rootroot00000000000000# # Copyright (c) 1980, 1993 # The Regents of the University of California. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # # snake - crt hack game. # # You move around the screen with arrow keys trying to pick up money # without getting eaten by the snake. hjkl work as in vi in place of # arrow keys. You can leave at the exit any time. # import time import sys import random import curses import math def cashvalue(): global loot global penalty return chunk*(loot-penalty)/25 def _x(p): return p % 256 - 128 def _y(p): return p // 256 - 128 def _p(x,y): return (x + 128) + (y + 128) * 256 PENALTY = 10 # % penalty for invoking spacewarp ME = 'I' SNAKEHEAD = 'S' SNAKETAIL = 's' TREASURE = '$' GOAL = '#' LINES = 0 COLS = 0 def MIN(a,b): if a < b: return a return b stdscr = 0 def erase(): stdscr.erase() def refresh(): stdscr.refresh() def getch(): return stdscr.getch() def move(x,y): stdscr.move(x,y) def mvaddstr(y, x, str): stdscr.addstr(y, x, str) def pchar(s, str): stdscr.addstr(_y(s) + 1, _x(s) + 1, str) refresh() def endwin(): curses.nocbreak() curses.echo() curses.endwin() def delay(t): time.sleep(t * 0.05) you = _p(0,0) money = _p(0,0) finish = _p(0,0) snake = [_p(0,0)] * 6 loot = 0 penalty = 0 moves = 0 fast = 1 lcnt = 25 ccnt = 80 chunk = 0 def error(s): print(s) exit(1) def main(): global penalty, loot, finish, you, money, snake, chunk random.seed(time.monotonic()) penalty = 0 loot = 0 initscr() i = MIN(lcnt, ccnt) if i < 4: error("screen too small for a fair game.") # # chunk is the amount of money the user gets for each $. # The formula below tries to be fair for various screen sizes. # We only pay attention to the smaller of the 2 edges, since # that seems to be the bottleneck. # This formula is a hyperbola which includes the following points: # (24, $25) (original scoring algorithm) # (12, $40) (experimentally derived by the "feel") # (48, $15) (a guess) # This will give a 4x4 screen $99/shot. We don't allow anything # smaller than 4x4 because there is a 3x3 game where you can win # an infinite amount of money. # if i < 12: i = 12 # otherwise it isn't fair # # Compensate for border. This really changes the game since # the screen is two squares smaller but we want the default # to be $25, and the high scores on small screens were a bit # much anyway. # / i += 2 chunk = (675.0 / (i + 6)) + 2.5 # min screen edge finish = snrand() you = snrand() money = snrand() snake[0] = snrand() for i in range(1,6): if i < 6: snake[i] = chase(snake[i-1]) setup() mainloop() exit(0) # Main command loop def mainloop(): global moves, money, loot, you repeat = 1 lastc = 0 while True: # Highlight you, not left & above move(_y(you) + 1, _x(you) + 1) refresh() c = getch() if c <= ord('9') and c >= ord('0'): repeat = c - ord('0') while True: c = getch() if c < ord('0') or ord('9') < c: break repeat = 10 * repeat + ord(c) - ord('0') elif c != ord('.'): repeat = 1 if c == ord('.'): c = lastc lastc = c if c == ord('x'): endwin() length(moves) exit(0) elif c == ord('p') or c == ord('d'): snap() continue elif c == ord('w'): spacewarp(0) continue elif c == ord('A'): repeat = _x(you) c = ord('h') elif c == ord('H') or c == ord('S'): repeat = _x(you) - _x(money) c = ord('h') elif c == ord('T'): repeat = _y(you) c = ord('k') elif c == ord('K') or c == ord('E'): repeat = _y(you) - _y(money) c = ord('k') elif c == ord('P'): repeat = ccnt - 1 - _y(you) c = ord('l') elif c == ord('L') or c == ord('F'): repeat = _x(money) - _x(you) c = ord('l') elif c == ord('B'): repeat = lcnt - 1 - _y(you) c = ord('j') elif c == ord('J') or c == ord('C'): repeat = _y(money) - _y(you) c = ord('j') for k in range(1, repeat + 1): moves += 1 if c == ord('s') or c == ord('h') or c == ord('\b'): if _x(you) > 0: pchar(you, ' ') you = _p(_x(you) - 1, _y(you)) pchar(you, ME) elif c == ord('f') or c == ord('l') or c == ord(' '): if _x(you) < ccnt - 1: pchar(you, ' ') you = _p(_x(you) + 1, _y(you)) pchar(you, ME) elif c == ord('e') or c == ord('k') or c == ord('i'): if _y(you) > 0: pchar(you, ' ') you = _p(_x(you), _y(you) - 1) pchar(you, ME) elif c == ord('c') or c == ord('j') or c == ord('\n') or c == ord('m'): if _y(you) + 1 < lcnt: pchar(you, ' ') you = _p(_x(you), _y(you) + 1) pchar(you, ME) if you == money: loot += 25 if k < repeat: pchar(you, ' ') while True: money = snrand() if money == finish: continue if money == you: continue if _x(money) < 5 and _y(money) == 0: continue break pchar(money, TREASURE) winnings(cashvalue()) continue if you == finish: win(finish) endwin() print("You have won with $%d." % cashvalue()) length(moves) exit(0) if pushsnake(): print("pushsnake true") break def initscr(): global stdscr, lcnt, ccnt stdscr = curses.initscr() curses.noecho() curses.cbreak() COLS = 80 LINES = 25 lcnt = LINES - 2 ccnt = COLS - 2 erase() # # setup the board # def setup(): pchar(you, ME) pchar(finish, GOAL) pchar(money, TREASURE) for i in range(1,6): pchar(snake[i], SNAKETAIL) pchar(snake[0], SNAKEHEAD) drawbox() def drawbox(): for i in range(1,ccnt+1): mvaddstr(0, i, '-') mvaddstr(lcnt + 1, i, '-') for i in range(0, lcnt+2): mvaddstr(i, 0, '|') mvaddstr(i, ccnt + 1, '|') def snrand(): while True: p = _p(random.randrange(ccnt), random.randrange(lcnt)) # make sure it's not on top of something else if _y(p) == 0 and _x(p) < 5: continue if p == you: continue if p == money: continue if p == finish: continue for i in range(6): if p == snake[i]: break else: break return p dirs = ("N ", "NE", "E ", "SE", "S ", "SW", "W ", "NW") mx = (0, 1, 1, 1, 0, -1, -1, -1) my = (-1, -1, 0, 1, 1, 1, 0, -1) absv = (1, 1.4, 1, 1.4, 1, 1.4, 1, 1.4) oldw = 0 def chase(sp): global oldw, loot # this algorithm has bugs; otherwise the snake would get too good d =_p(_x(you) - _x(sp), _y(you) - _y(sp)) v1 = math.sqrt(_x(d) **2 + _y(d) ** 2) w = 0 max = 0 wt = [0] * 8 for i in range(8): vp = _x(d) * mx[i] + _y(d) * my[i] v2 = absv[i] if v1 > 0: vp = vp / (v1 * v2) else: vp = 1 if vp > max: max = vp w = i for i in range(8): d = _p(_x(sp) + mx[i], _y(sp) + my[i]) wt[i] = 0 if _x(d) < 0 or _x(d) >= ccnt or _y(d) < 0 or _y(d) >= lcnt: continue # # Change to allow snake to eat you if you're on the money, # otherwise, you can just crouch there until the snake goes # away. Not positive it's right. # # if d[1] == 0 and d[0] < 5: continue # if d == money: continue if d == finish: continue if i == w: wt[i] = loot // 10 else: wt[i] = 1 if i == oldw: wt[i] += loot // 20 w = 0 for i in range(8): w += wt[i] vp = random.randrange(w) vpo = vp for i in range(8): if vp < wt[i]: break else: vp -= wt[i] else: printw("failure\n") i = 0 while wt[i] == 0: i += 1 refresh() w = i oldw = w return _p(_x(sp) + mx[w], _y(sp) + my[w]) def spacewarp(w): global loot you = snrand() p = _p(COLS / 2 - 8, LINES / 2 - 1) if _x(p) < 0: p = _p(0, _y(p)) if _y(p) < 0: p = _p(_x(p), 0) if w: str = "BONUS!!!" loot = loot - penalty penalty = 0 else: str = "SPACE WARP!!!" penalty += loot / PENALTY for j in range(3): erase() refresh() delay(5) pchar(_p(_x(p)+1, _y(p)+1), str) refresh() delay(10) setup() winnings(cashvalue()) def snap(): if not stretch(money): if not stretch(finish): pchar(you, '?') refresh() delay(10) pchar(you, ME) refresh() def abs(x): if x < 0: return -x return x def stretch(ps): p = you if abs(_x(ps) - _x(you)) < (ccnt / 12) and (_y(you) != _y(ps)): if _y(you) < _y(ps): for l in range (_y(you) + 1, _y(ps) + 1): p = _p(_x(p), l) pchar(p, 'v') refresh() delay(10) while _y(p) > _y(you): chk(p) p = _p(_x(p), _y(p)-1) else: p = _p(_x(p), _y(you)-1) while _y(p) >= _y(ps): pchar(p, '^') p = _p(_x(p), _y(p) - 1) refresh() delay(10) while _y(p) < _y(you): chk(p) p = _p(_x(p), _y(p) + 1) return 1 else: if abs(_y(ps) - _y(you)) < lcnt/7 and _x(you) != _x(ps): p = _p(_x(p), _y(you)) if _x(you) < _x(ps): p = _p(_x(you) + 1, _y(p)) while _x(p) <= _x(ps): pchar(p, '>') p = _p(_x(p) + 1, _y(p)) refresh() delay(10) while _x(p) > _x(you): chk(p) p = _p(_x(p) - 1, _y(p)) else: p = _p(_x(you) - 1, _y(p)) while _x(p) >= _x(ps): pchar(p, '<') p = _p(_x(p) - 1, _y(p)) refresh() delay(10) while _x(p) < _x(you): chk(p) p = _p(_x(p) + 1, _y(p)) return 1 return 0 def surround(ps): if _x(ps) == 0: ps = _p(_x(ps) + 1, _y(ps)) if _y(ps) == 0: ps = _p(_x(ps), _y(ps) + 1) if _y(ps) == LINES - 1: ps = _p(_x(ps), _y(ps) - 1) if _x(ps) == COLS - 1: ps = _p(_x(ps) - 1, _y(ps)) mvaddstr(_y(ps), _x(ps), "/*\\") mvaddstr(_y(ps) + 1, _x(ps), "* *") mvaddstr(_y(ps) + 2, _x(ps), "\\*/") for j in range(20): pchar(ps, '@') refresh() delay(1) pchar(ps, ' ') refresh() delay(1) mvaddstr(_y(ps), _x(ps), " ") mvaddstr(_y(ps) + 1, _x(ps), "o.o") mvaddstr(_y(ps) + 2, _x(ps), "\\_/") refresh() delay(6) mvaddstr(_y(ps), _x(ps), " ") mvaddstr(_y(ps) + 1, _x(ps), "o.-") mvaddstr(_y(ps) + 2, _x(ps), "\\_/") refresh() delay(6) mvaddstr(_y(ps), _x(ps), " ") mvaddstr(_y(ps) + 1, _x(ps), "o.o") mvaddstr(_y(ps) + 2, _x(ps), "\\_/") refresh() delay(6) def win(ps): boxsize = 10 x = ps for j in range(1, boxsize): for k in range(j): pchar(x, '#') x = _p(_x(x), _y(x) - 1) for k in range(j): pchar(x, '#') x = _p(_x(x)+1, _y(x)) j += 1 for k in range(j): pchar(x, '#') x = _p(_x(x), _y(x) + 1) for k in range(j): pchar(x, '#') x = _p(_x(x) - 1, _y(x)) refresh() delay(1) def pushsnake(): global loot # # My manual says times doesn't return a value. Furthermore, the # snake should get his turn every time no matter if the user is # on a fast terminal with typematic keys or not. # So I have taken the call to times out. # issame = 0 for i in range(4,-1,-1): if snake[i] == snake[5]: issame += 1 if issame == 0: pchar(snake[5], ' ') # Need the following to catch you if you step on the snake's tail tmp = snake[5] for i in range(4,-1,-1): snake[i + 1] = snake[i] snake[0] = chase(snake[1]) pchar(snake[1], SNAKETAIL) pchar(snake[0], SNAKEHEAD) for i in range(6): if snake[i] == you or tmp == you: surround(you) i = (cashvalue()) % 10 bonus = random.randrange(10) mvaddstr(lcnt + 1, 0, "%d" % bonus) refresh() delay(30) if bonus == i: spacewarp(1) return 1 endwin() if loot >= penalty: print("\nYou and your $%d have been eaten\n" % cashvalue()) else: print("\nThe snake ate you. You owe $%d.\n" % -cashvalue()) length(moves) exit(0) return 0 def chk(sp): if sp == money: pchar(sp, TREASURE) return 2 if sp == finish: pchar(sp, GOAL) return 3 if sp == snake[0]: pchar(sp, SNAKEHEAD) return 4 for j in range(1,6): if sp == snake[j]: pchar(sp, SNAKETAIL) return 4 if _x(sp) < 4 and _y(sp) == 0: winnings(cashvalue()) if _y(you) == 0 and _x(you) < 4: pchar(you, ME) return 5 if sp == you: pchar(sp, ME) return 1 pchar(sp, ' ') return 0 def winnings(won): if won > 0: pchar(_p(0,0), "$%d" % won) def length(num): print("You made %d moves.\n" % num) main() snek-1.1/examples/snek-car.py000066400000000000000000000046401353657467200162340ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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, write to the Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. # # This program is for the Crickit FeatherWing board # Motor 1 is on the right side of the car mr = (MOTOR1A, MOTOR1B) # Motor 2 is on the left side of the car ml = (MOTOR2A, MOTOR2B) # SIGNAL1 is wired to a Phototransistor in the front of the car pf = SIGNAL1 # SIGNAL2 is wired to a Phototransistor in the rear of the car pr = SIGNAL2 # Pick some speeds f_speed = 0.5 r_speed = 0.5 t_speed_f = 0.6 t_speed_s = 0.2 # Move straight forward def forw(): talkto(mr) setpower(f_speed) setright() on() talkto(ml) setpower(f_speed) setleft() on() # Move straight back def back(): talkto(mr) setpower(r_speed) setleft() on() talkto(ml) setpower(r_speed) setright() on() # Rotate left def left(): talkto(mr) setpower(t_speed_f) setright() on() talkto(ml) setpower(t_speed_f) setright() on() # Rotate right def right(): talkto(mr) setpower(t_speed_f) setleft() on() talkto(ml) setpower(t_speed_f) setleft() on() # Stop def stop(): talkto(ml) setpower(0) off() talkto(mr) setpower(0) off() # Move forward until we approach something def go_forw(): forw() while read(pf) < .25: pass stop() # Move backwards until we approach something def go_back(): back() while read(pr) < .25: pass stop() # Hook the functions together in a simple # way to demonstrate how they work def bumper(): while True: go_forw() back() time.sleep(0.5) stop() left() time.sleep(0.25) stop() go_forw() go_back() go_forw() bumper() snek-1.1/examples/snek.py000077500000000000000000000067161353657467200155020ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # import random import curses import time stdscr = 0 snek = [] grow = 0 snak = 0 lines = 25 cols = 40 dx = 0 dy = 0 HEAD = '@' TAIL = '+' SNAK = '$' def _x(p): return p % cols def _y(p): return p // cols def _p(x,y): return x + y * cols def put_snak(): global snek, snak while True: snak = _p(random.randrange(cols-2)+1, random.randrange(lines-2)+1) for s in snek: if snak == s: break else: break showp(snak, SNAK) def showxy(x, y, str): stdscr.addstr(y, x, str) def showp(pos, str): showxy(_x(pos), _y(pos), str) miss = 0 hit_wall = 1 hit_snek = 2 hit_snak = 3 def move_snek(): global snek, grow global dx, dy if dx or dy: old = snek[len(snek)-1] sp = snek[0] nx = _x(sp) + dx ny = _y(sp) + dy if nx < 1 or nx >= cols-1 or ny < 1 or ny >= lines-1: return hit_wall new = _p(nx, ny) if grow > 0: tail = snek showxy(0,0,"Score %d---" % (len(snek) + 1)) grow -= 1 else: tail = snek[:-1] for t in tail: if new == t: return hit_snek snek = [new] + tail showp(old, ' ') if tail: showp(tail[0], TAIL) showp(new, HEAD) if new == snak: return hit_snak return miss def done(msg): stdscr.move(lines-1, 0) stdscr.refresh() stdscr.nodelay(False) curses.nocbreak() curses.echo() curses.endwin() print("You %s. Score %d" % (msg, len(snek))) exit(0) def getch(): return chr(stdscr.getch()) def main(): global snek, dx, dy, snak, grow global stdscr, lines, cols stdscr = curses.initscr() curses.noecho() curses.cbreak() stdscr.nodelay(True) stdscr.erase() random.seed(time.monotonic()) snek = [_p(1,1)] put_snak() for x in range(1,cols-1): showxy(x, 0, '-') showxy(x, lines-1, '-') for y in range(1,lines-1): showxy(0, y, '|') showxy(cols-1, y, '|') showp(snek[0], HEAD) while True: stdscr.move(_y(snek[0]), _x(snek[0])) stdscr.refresh() time.sleep(.1) c = getch() ndx = dx ndy = dy if c == 'h': ndx = -1 ndy = 0 elif c == 'j': ndx = 0 ndy = 1 elif c == 'k': ndx = 0 ndy = -1 elif c == 'l': ndx = 1 ndy = 0 elif c == 'q' or c == 'x': done("quit") elif c == 'p': while getch() != 'p': time.sleep(.1) if ndx != -dx or ndy != -dy: dx = ndx dy = ndy hit = move_snek() if hit == hit_wall: done("hit the wall") elif hit == hit_snek: done("hit yourself") if hit == hit_snak: grow = 5 put_snak() main() snek-1.1/examples/track-light.py000066400000000000000000000013361353657467200167410ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # led = D3 dial = A0 def track(): talkto(led) setpower(0) on() while True: p = read(dial) if p == 1: break setpower(p) off() snek-1.1/hosts/000077500000000000000000000000001353657467200134755ustar00rootroot00000000000000snek-1.1/hosts/linux/000077500000000000000000000000001353657467200146345ustar00rootroot00000000000000snek-1.1/hosts/linux/.gitignore000066400000000000000000000000511353657467200166200ustar00rootroot00000000000000snek*.sh snek*.bz2 linux linux-install.shsnek-1.1/hosts/linux/Makefile000066400000000000000000000035041353657467200162760ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_ROOT=../.. SNEK_NO_BUILD_TARGETS = 1 include $(SNEK_ROOT)/snek-install.defs LINUX_DIST=snek-linux-$(SNEK_VERSION).tar.bz2 LINUX_SH=snek-linux-$(SNEK_VERSION).sh DESKTOP_FILES=$(SNEK_PORTS)/posix/snek.desktop.in $(SNEK_ROOT)/snekde/snekde.desktop.in PROGS= \ $(SNEK_PORTS)/posix/snek \ $(SNEK_ROOT)/snekde/snekde \ $(SNEK_PORTS)/duemilanove/snek-duemilanove-install.in \ $(SNEK_PORTS)/itsybitsy5v/snek-itsybitsy-install.in \ $(SNEK_PORTS)/mega/snek-mega-install.in EXAMPLES=$(SNEK_ROOT)/examples ICONS=$(SNEK_ROOT)/snek.svg DOC= \ $(SNEK_ROOT)/doc/snek.pdf \ $(SNEK_ROOT)/snekde/snekde.1 \ $(SNEK_ROOT)/COPYING \ $(SNEK_PORTS)/duemilanove/snek-duemilanove-install.1 \ $(SNEK_PORTS)/itsybitsy5v/snek-itsybitsy-install.1 \ $(SNEK_PORTS)/mega/snek-mega-install.1 LINUX_FILES=$(PROGS) $(DESKTOP_FILES) $(FIRMWARE) $(USBFIRMWARE) $(ICONS) $(DOC) $(EXAMPLES) all: $(LINUX_SH) $(LINUX_SH): $(LINUX_DIST) linux-install.sh cat linux-install.sh $(LINUX_DIST) > $@ chmod +x $@ linux-install.sh: linux-install.sh.in $(SNEK_SED) $^ > $@ $(LINUX_DIST): $(LINUX_FILES) $(LINUX_EXTRA) -rm -f $@ -rm -rf linux mkdir -p linux/Snek cp -a $(LINUX_FILES) linux/Snek tar cjf $@ -C linux Snek upload: $(LINUX_SH) rsync -avz $(LINUX_SH) $(SNEKDIST) clean: rm -f snek-*.sh *.bz2 rm -rf linux snek-1.1/hosts/linux/linux-install.sh.in000066400000000000000000000111131353657467200203750ustar00rootroot00000000000000#!/bin/sh can_ask=y finish() { if [ "$can_ask" = "y" ]; then echo "" echo -n "Press enter to continue..." read foo fi exit $1 } # # Make sure we have a terminal to talk to # if tty -s; then : else case "$DISPLAY" in "") echo 'No user input available' can_ask=n ;; *) GUESS_XTERMS="x-terminal-emulator xterm rxvt roxterm gnome-terminal dtterm eterm Eterm kvt konsole aterm" for a in $GUESS_XTERMS; do if type $a >/dev/null 2>&1; then XTERM=$a break fi done case "$XTERM" in "") echo 'No terminal emulator available' can_ask=n ;; *) exec "$XTERM" -e "sh '$0'" ;; esac ;; esac fi # # Make sure we can run python3 # echo -n "Checking for python3..." if python3 --version > /dev/null 2>&1; then echo " found it." else echo " python3 isn't working." echo "" echo "You'll need to install lsusb and python3 with pyserial and curses" echo "on this computer before Snek will work properly." finish 1 fi echo -n "Checking for pyserial..." if python3 -m serial.tools.list_ports > /dev/null 2>&1; then echo " found it." else echo " pyserial isn't working." echo "" echo "You'll need to install lsusb and python3 with pyserial and curses" echo "on this computer before Snek will work properly." finish 1 fi echo -n "Checking for python curses..." if python3 -c 'import curses' > /dev/null 2>&1; then echo " found it." else echo " python curses isn't working." echo "" echo "You'll need to install lsusb and python3 with pyserial and curses" echo "on this computer before Snek will work properly." finish 1 fi # # Pick an installation target # if [ '(' -d /opt -a -w /opt ')' -o '(' -d /opt/Snek -a -w /opt/Snek ')' ]; then target_default=/opt else target_default="$HOME" fi case "$#" in 0) echo -n "Installation location [default: $target_default] " if [ "$can_ask" = "y" ]; then read target else echo "" target="" fi case "$target" in "") target="$target_default" ;; esac ;; *) target="$1" ;; esac target_snek="$target"/Snek echo -n "Installing to $target..." # # Make sure the target exists # mkdir -p "$target_snek" if [ ! -d "$target_snek" ]; then echo "$target_snek does not exist and cannot be created" finish 1 fi if [ ! -w "$target_snek" ]; then echo "$target_snek cannot be written" finish 1 fi # # Unpack the tar archive appended to the end of this script # archive_line=`awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }' "$0"` tail -n+$archive_line "$0" | tar xjf - -C "$target" case $? in 0) echo " done." ;; *) echo "Install failed." finish 1 ;; esac # # Create custom files by editing the paths # case "$target" in /*) target_abs="$target" ;; *) target_abs=`pwd`/$target ;; esac BIN="$target_abs"/Snek for infile in "$target"/Snek/*.in; do desktop=`basename "$infile" .in` # pre-pend a vendor to .desktop filenames case "$desktop" in *.desktop) desktop="keithp.com-$desktop" ;; esac desktop="$target"/Snek/"$desktop" rm -f "$desktop" sed -e "s;@"SHAREDIR"@;$BIN;g" -e "s;@"BINDIR"@;$BIN;g" -e "s;@"ICONDIR"@;$BIN;g" -e "s;@"SNEK_VERSION"@;@SNEK_VERSION@;g" "$infile" > "$desktop" chmod +x "$desktop" done # # Install the .desktop files # for desktop in "$target"/Snek/*.desktop; do case `id -u` in 0) xdg-desktop-menu install --mode system "$desktop" ;; *) xdg-desktop-menu install --mode user "$desktop" ;; esac done # # Install icons # for icon_dir in /usr/share/icons/hicolor/scalable/mimetypes "$HOME/.icons" "$HOME/.kde/share/icons"; do if [ -w "$icon_dir" ]; then cp "$target"/Snek/*.svg "$icon_dir" update-icon-caches "$icon_dir" fi done # # Install icon to desktop if desired # if [ -d $HOME/Desktop ]; then default_desktop=n if [ "$can_ask" = "y" ]; then : else default_desktop=y fi answered=n while [ "$answered" = "n" ]; do echo -n "Install icons to desktop? [default: $default_desktop] " if [ "$can_ask" = "y" ]; then read do_desktop else echo do_desktop="" fi case "$do_desktop" in "") do_desktop=$default_desktop ;; esac case "$do_desktop" in [yYnN]*) answered=y ;; esac done case "$do_desktop" in [yY]*) echo -n "Installing desktop icons..." for d in "$target"/Snek/*.desktop; do base=`basename $d` cp --remove-destination "$d" "$HOME/Desktop/" done ;; esac echo " done." fi finish 0 __ARCHIVE_BELOW__ snek-1.1/hosts/macosx/000077500000000000000000000000001353657467200147675ustar00rootroot00000000000000snek-1.1/hosts/macosx/.gitignore000066400000000000000000000000701353657467200167540ustar00rootroot00000000000000*-Info.plist macosx serial snek-*.png snek *.dmg *.icns snek-1.1/hosts/macosx/Info.plist.in000066400000000000000000000021211353657467200173400ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleDisplayName SnekDE CFBundleExecutable snekde CFBundleIconFile snek.icns CFBundleIdentifier com.keithp.snekde CFBundleInfoDictionaryVersion 6.0 CFBundleName snekde CFBundlePackageType APPL CFBundleShortVersionString @SNEK_VERSION@ CFBundleSignature Snek CFBundleVersion @SNEK_VERSION@ LSHasLocalizedDisplayName NSAppleScriptEnabled NSHumanReadableCopyright Copyright © 2019 Keith Packard CFBundleGetInfoString Snek DE version @SNEK_VERSION@ snek-1.1/hosts/macosx/Makefile000066400000000000000000000064271353657467200164400ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_NO_BUILD_TARGETS = 1 SNEK_ROOT=../.. include $(SNEK_ROOT)/snek-install.defs MACOSX_RES=16 32 128 256 512 MACOSX_ICON_PNGS = $(shell for i in $(MACOSX_RES); do echo snek-$$i.png; done) MACOSX_ICON = snek.icns MACOSX_DIST = snek-mac-$(SNEK_VERSION).dmg SNEKDE = $(SNEK_ROOT)/snekde/snekde.py SNEKDE_SCRIPTS = runsnekde snekde-script SNEKDE_FILES = $(SNEKDE_SCRIPTS) snekde-Info.plist $(SNEKDE) ifneq ($(strip $(SNEKMAC)),) SNEK = snek SNEK_SCRIPTS = runsnek snek-script SNEK_FILES = $(SNEK_SCRIPTS) snek-Info.plist $(SNEK) endif MACOSX_INSTALL = install-macosx MACOSX_DOCS = $(SNEK_ROOT)/doc/snek.pdf $(SNEK_ROOT)/COPYING ReadMe-Mac.rtf MACOSX_FILES=$(SNEKDE_FILES) $(SNEK_FILES) serial $(MACOSX_ICON) $(MACOSX_SCRIPTS) $(MACOSX_INSTALL) $(MACOSX_DOCS) $(SNEK_ROOT)/examples/*.py all: $(MACOSX_DIST) $(MACOSX_ICON): $(SNEK_ROOT)/snek.svg for i in $(MACOSX_RES); do rsvg-convert -w $$i -h $$i -o snek-$$i.png $^; done png2icns $@ $(MACOSX_ICON_PNGS) macosx: $(MACOSX_FILES) rm -rf macosx mkdir -p macosx/examples ifeq ($(strip $(SNEKMAC)),) snek-bits: echo 'no snek app' else snek-bits: $(SNEK_FILES) macosx # # snek # mkdir -p macosx/snek.app/Contents/Resources macosx/snek.app/Contents/MacOS echo 'APPLSN.O' > macosx/snek.app/Contents/PkgInfo cp -p snek-Info.plist macosx/snek.app/Contents/Info.plist cp -p $(MACOSX_ICON) macosx/snek.app/Contents/Resources cp -a $(SNEK) macosx/snek.app/Contents/Resources cp -p $(SNEK_SCRIPTS) macosx/snek.app/Contents/MacOS/ endif $(MACOSX_DIST): $(MACOSX_FILES) macosx rm -f $@ cp -a $(MACOSX_DOCS) macosx cp -a $(MACOSX_INSTALL) macosx cp -a $(FIRMWARE) macosx cp -a $(USBFIRMWARE) macosx cp -a $(SNEK_ROOT)/examples/* macosx/examples # # snekde # mkdir -p macosx/snekde.app/Contents/Resources macosx/snekde.app/Contents/MacOS echo 'APPLSN.O' > macosx/snekde.app/Contents/PkgInfo cp -p snekde-Info.plist macosx/snekde.app/Contents/Info.plist cp -p $(MACOSX_ICON) macosx/snekde.app/Contents/Resources cp -a $(SNEKDE) macosx/snekde.app/Contents/Resources cp -a serial macosx/snekde.app/Contents/Resources cp -p $(SNEKDE_SCRIPTS) macosx/snekde.app/Contents/MacOS/ # # generate iso image # genisoimage -D -V Snek-$(SNEK_VERSION) -no-pad -r -apple -o $@ macosx serial: always rsync -a --delete --delete-excluded --exclude '__pycache__' --exclude '*.pyc' /usr/lib/python3/dist-packages/serial/ serial always: snekde-Info.plist: snekde-Info.plist.in $(SNEK_SED) $^ > $@ snek-Info.plist: snek-Info.plist.in $(SNEK_SED) $^ > $@ $(SNEK): FORCE ./build-mac $(SNEKMAC) $@ FORCE: install: echo install done upload: $(MACOSX_DIST) rsync -avz $(MACOSX_DIST) $(SNEKDIST) clean: rm -rf serial rm -rf snek rm -f $(MACOSX_ICON) $(MACOSX_ICON_PNGS) rm -f snekde-Info.plist snek-Info.plist rm -rf macosx *.dmg snek-1.1/hosts/macosx/ReadMe-Mac.rtf000066400000000000000000000175211353657467200173450ustar00rootroot00000000000000{\rtf1\ansi\deff3\adeflang1025 {\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\froman\fprq2\fcharset0 Arial;}{\f5\froman\fprq2\fcharset0 Helvetica LT Std;}{\f6\froman\fprq2\fcharset0 Helvetica{\*\falt Arial};}{\f7\fnil\fprq2\fcharset0 Helvetica LT Std;}{\f8\fnil\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f9\fnil\fprq2\fcharset0 Helvetica{\*\falt Arial};}} {\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;} {\stylesheet{\s0\snext0\ql\nowidctlpar\hyphpar0\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033 Normal;} {\*\cs15\snext15 Numbering Symbols;} {\s16\sbasedon0\snext17\ql\nowidctlpar\hyphpar0\sb240\sa120\keepn\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\loch\f4\fs28\lang1033 Heading;} {\s17\sbasedon0\snext17\sl276\slmult1\ql\nowidctlpar\hyphpar0\sb0\sa140\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\loch\f3\fs24\lang1033 Text Body;} {\s18\sbasedon17\snext18\sl276\slmult1\ql\nowidctlpar\hyphpar0\sb0\sa120\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\loch\f3\fs24\lang1033 List;} {\s19\sbasedon0\snext19\ql\nowidctlpar\hyphpar0\sb120\sa120\ltrpar\cf0\i\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\loch\f3\fs24\lang1033 Caption;} {\s20\sbasedon0\snext20\ql\nowidctlpar\hyphpar0\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\loch\f3\fs24\lang1033 Index;} {\s21\sbasedon0\snext21\ql\nowidctlpar\hyphpar0\sb0\sa120\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\loch\f3\fs24\lang1033 Text body;} }{\*\listtable{\list\listtemplateid1 {\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'00);}{\levelnumbers\'01;}\fi-360\li720} {\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'01);}{\levelnumbers\'01;}\fi-360\li1080} {\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'02);}{\levelnumbers\'01;}\fi-360\li1440} {\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'03);}{\levelnumbers\'01;}\fi-360\li1800} {\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'04);}{\levelnumbers\'01;}\fi-360\li2160} {\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'05);}{\levelnumbers\'01;}\fi-360\li2520} {\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'06);}{\levelnumbers\'01;}\fi-360\li2880} {\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'07);}{\levelnumbers\'01;}\fi-360\li3240} {\listlevel\levelnfc0\leveljc0\levelstartat1\levelfollow0{\leveltext \'02\'08);}{\levelnumbers\'01;}\fi-360\li3600}\listid1} {\list\listtemplateid2 {\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} {\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} {\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} {\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} {\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} {\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} {\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} {\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0} {\listlevel\levelnfc255\leveljc0\levelstartat1\levelfollow2{\leveltext \'00;}{\levelnumbers;}\fi0\li0}\listid2} }{\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}}{\*\generator LibreOffice/6.1.5.2$Linux_X86_64 LibreOffice_project/10$Build-2}{\info{\creatim\yr2013\mo1\dy6\hr13\min7}{\revtim\yr2019\mo4\dy17\hr13\min33}{\printim\yr0\mo0\dy0\hr0\min0}}{\*\userprops}\deftab709 \hyphauto0\viewscale150 {\*\pgdsctbl {\pgdsc0\pgdscuse451\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Default Style;}} \formshade{\*\pgdscno0}\paperh15840\paperw12240\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\sectunlocked1\pgndec\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc {\*\ftnsep\chftnsep}\pgndec\pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033{\dbch\af7\dbch\af7\rtlch \ltrch\loch\loch\f5\hich\af5 Installing Snek software for Mac OS X Computers} \par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\dbch\af9\dbch\af9\rtlch \ltrch\loch\loch\f6\hich\af6 \par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033{\dbch\af7\dbch\af7\rtlch \ltrch\loch\loch\f5\hich\af5 The Snek distribution for Mac OS X consists of:} \par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\dbch\af7\dbch\af7\rtlch \ltrch\loch\loch\f5\hich\af5 \par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033{\listtext\pard\plain 1)\tab}\ilvl0\ls1 \li1440\ri0\lin1440\rin0\fi-360\li720\ri0\lin720\rin0\fi-360{\dbch\af7\dbch\af7\rtlch \ltrch\loch\loch\f5\hich\af5 The SnekDE application} \par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033{\listtext\pard\plain 2)\tab}\ilvl0\ls1 \li1440\ri0\lin1440\rin0\fi-360\li720\ri0\lin720\rin0\fi-360{\dbch\af7\dbch\af7\rtlch \ltrch\loch\loch\f5\hich\af5 The Snek interpreter, compiled for Mac OS X} \par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033{\listtext\pard\plain 3)\tab}\ilvl0\ls1 \li1440\ri0\lin1440\rin0\fi-360\li720\ri0\lin720\rin0\fi-360{\dbch\af7\dbch\af7\rtlch \ltrch\loch\loch\f5\hich\af5 Snek firmware for embedded computers} \par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\li720\ri0\lin720\rin0\fi0\dbch\af7\dbch\af7\rtlch \ltrch\loch\loch\f5\hich\af5 \par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033{\dbch\af7\dbch\af7\rtlch \ltrch\loch\loch\f5\hich\af5 Install }{\dbch\af7\dbch\af7\rtlch \ltrch\loch\loch\f5\hich\af5 Snek}{\dbch\af7\dbch\af7\rtlch \ltrch\loch\loch\f5\hich\af5 by control-clicking the install-macosx script and selecting \u8220\'93Open\u8221\'94 from the menu. This will display a dialog asking if you are sure you want to open it. Select \u8220\'93Open\u8221\'94 from the dialog to execute the script. This will install the software, documentation and firmware in your home Applications folder. You can move it afterwards if you choose.} \par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\dbch\af7\dbch\af7\rtlch \ltrch\loch\loch\f5\hich\af5 \par \pard\plain \s0\ql\nowidctlpar\hyphpar0\ltrpar\cf0\kerning1\dbch\af8\langfe1081\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\sl240\slmult1\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\dbch\af9\dbch\af9\rtlch \ltrch\loch\loch\f6\hich\af6 Have fun with Snek!} \par }snek-1.1/hosts/macosx/build-mac000077500000000000000000000016751353657467200165630ustar00rootroot00000000000000#!/bin/bash # # Copyright © 2019 Keith Packard # # 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. # curdir=`pwd` dir=`dirname $0` cd "$dir/../.." case $# in 2) ;; *) echo "usage: $0 " 1>&2 exit 1 ;; esac build="$1" builddir=`echo $build | sed 's/^[^:]*://'` echo builddir "$builddir" target="$2" rsync -Ravz --delete `git ls-files` "$build" ssh imac-remote "cd '$builddir'/ports/posix && make" rsync -avz "$build"/ports/posix/snek "$curdir"/"$target" snek-1.1/hosts/macosx/install-macosx000077500000000000000000000020551353657467200176550ustar00rootroot00000000000000#!/bin/bash echo -e '\033[34mInstalling Snek\033[39m' dir=`dirname "$0"` cd "$dir" echo -e '\033[34mPreparing Snek directory\033[39m' mkdir -p ~/Applications/Snek find ~/Applications/Snek -type d -print0 | xargs -0 chmod +w echo -e '\033[34mCopying Snek files ... \033[39m' cp -f -a * ~/Applications/Snek case $? in 0) echo -e '\033[32mSuccess\033[39m' ;; *) echo -e '\033[31mFailed\033[39m' ;; esac echo -e '\033[34mAdjusting installed files ... \033[39m' find ~/Applications/Snek -print0 | xargs -0 chmod +w case $? in 0) echo -e '\033[32mchmod success ... \033[39m' ;; *) echo -e '\033[31mchmod failed ... \033[39m' ;; esac find ~/Applications/Snek -print0 | xargs -0 xattr -c case $? in 0) echo -e '\033[32mxattr -c success\033[39m' ;; *) echo -e '\033[31mxattr -c failed\033[39m' ;; esac echo -e '\033[34mCopying Snek to /usr/local/bin ... \033[39m' sudo cp -f -a ~/Applications/Snek/snek.app/Contents/Resources/snek /usr/local/bin/snek echo -e '\033[32mAll done\033[39m' echo -e '\033[34mYou can close this window now\033[39m' snek-1.1/hosts/macosx/runsnek000077500000000000000000000002331353657467200164000ustar00rootroot00000000000000#!/bin/bash echo -n -e "\033]0;Snek\007" ME=`dirname $0` "$ME"/../Resources/snek osascript -e 'tell application "Terminal" to close front window' & exit 0 snek-1.1/hosts/macosx/runsnekde000077500000000000000000000003351353657467200167140ustar00rootroot00000000000000#!/bin/bash echo -n -e "\033]0;SnekDE\007" ME=`dirname $0` export PYTHONPATH="$ME"/../Resources/lib/python3.7 python3 "$ME"/../Resources/snekde.py osascript -e 'tell application "Terminal" to close front window' & exit 0 snek-1.1/hosts/macosx/snek-Info.plist.in000066400000000000000000000021151353657467200203010ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleDisplayName Snek CFBundleExecutable snek-script CFBundleIconFile snek.icns CFBundleIdentifier com.keithp.snek CFBundleInfoDictionaryVersion 6.0 CFBundleName snek CFBundlePackageType APPL CFBundleShortVersionString @SNEK_VERSION@ CFBundleSignature Snek CFBundleVersion @SNEK_VERSION@ LSHasLocalizedDisplayName NSAppleScriptEnabled NSHumanReadableCopyright Copyright © 2019 Keith Packard CFBundleGetInfoString Snek version @SNEK_VERSION@ snek-1.1/hosts/macosx/snek-script000077500000000000000000000000711353657467200171550ustar00rootroot00000000000000#!/bin/bash ME=`dirname $0` open -a Terminal $ME/runsnek snek-1.1/hosts/macosx/snekde-Info.plist.in000066400000000000000000000021301353657467200206070ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleDisplayName SnekDE CFBundleExecutable snekde-script CFBundleIconFile snek.icns CFBundleIdentifier com.keithp.snekde CFBundleInfoDictionaryVersion 6.0 CFBundleName snekde CFBundlePackageType APPL CFBundleShortVersionString @SNEK_VERSION@ CFBundleSignature Snek CFBundleVersion @SNEK_VERSION@ LSHasLocalizedDisplayName NSAppleScriptEnabled NSHumanReadableCopyright Copyright © 2019 Keith Packard CFBundleGetInfoString Snek DE version @SNEK_VERSION@ snek-1.1/hosts/macosx/snekde-script000077500000000000000000000000721353657467200174670ustar00rootroot00000000000000#!/bin/bash ME=`dirname $0` open -a Terminal $ME/runsnekdesnek-1.1/hosts/windows/000077500000000000000000000000001353657467200151675ustar00rootroot00000000000000snek-1.1/hosts/windows/.gitignore000066400000000000000000000000661353657467200171610ustar00rootroot00000000000000snek-*.png snek.exe snek.ico snekde.py build snek.cfg snek-1.1/hosts/windows/Instdrv/000077500000000000000000000000001353657467200166205ustar00rootroot00000000000000snek-1.1/hosts/windows/Instdrv/NSIS/000077500000000000000000000000001353657467200173745ustar00rootroot00000000000000snek-1.1/hosts/windows/Instdrv/NSIS/Contrib/000077500000000000000000000000001353657467200207745ustar00rootroot00000000000000snek-1.1/hosts/windows/Instdrv/NSIS/Contrib/InstDrv/000077500000000000000000000000001353657467200223655ustar00rootroot00000000000000snek-1.1/hosts/windows/Instdrv/NSIS/Contrib/InstDrv/Example.nsi000066400000000000000000000035451353657467200245020ustar00rootroot00000000000000# # InstDrv Example, (c) 2003 Jan Kiszka (Jan Kiszka@web.de) # Name "InstDrv.dll test" OutFile "InstDrv-Test.exe" ShowInstDetails show ComponentText "InstDrv Plugin Usage Example" Page components Page instfiles Section "Install a Driver" InstDriver InstDrv::InitDriverSetup /NOUNLOAD "{4d36e978-e325-11ce-bfc1-08002be10318}" "IrCOMM2k" Pop $0 DetailPrint "InitDriverSetup: $0" InstDrv::DeleteOemInfFiles /NOUNLOAD Pop $0 DetailPrint "DeleteOemInfFiles: $0" StrCmp $0 "00000000" PrintInfNames ContInst1 PrintInfNames: Pop $0 DetailPrint "Deleted $0" Pop $0 DetailPrint "Deleted $0" ContInst1: InstDrv::CreateDevice /NOUNLOAD Pop $0 DetailPrint "CreateDevice: $0" SetOutPath $TEMP File "ircomm2k.inf" File "ircomm2k.sys" InstDrv::InstallDriver /NOUNLOAD "$TEMP\ircomm2k.inf" Pop $0 DetailPrint "InstallDriver: $0" StrCmp $0 "00000000" PrintReboot ContInst2 PrintReboot: Pop $0 DetailPrint "Reboot: $0" ContInst2: InstDrv::CountDevices Pop $0 DetailPrint "CountDevices: $0" SectionEnd Section "Uninstall the driver again" UninstDriver InstDrv::InitDriverSetup /NOUNLOAD "{4d36e978-e325-11ce-bfc1-08002be10318}" "IrCOMM2k" Pop $0 DetailPrint "InitDriverSetup: $0" InstDrv::DeleteOemInfFiles /NOUNLOAD Pop $0 DetailPrint "DeleteOemInfFiles: $0" StrCmp $0 "00000000" PrintInfNames ContUninst1 PrintInfNames: Pop $0 DetailPrint "Deleted $0" Pop $0 DetailPrint "Deleted $0" ContUninst1: InstDrv::RemoveAllDevices Pop $0 DetailPrint "RemoveAllDevices: $0" StrCmp $0 "00000000" PrintReboot ContUninst2 PrintReboot: Pop $0 DetailPrint "Reboot: $0" ContUninst2: Delete "$SYSDIR\system32\ircomm2k.sys" SectionEndsnek-1.1/hosts/windows/Instdrv/NSIS/Contrib/InstDrv/InstDrv-Test.exe000066400000000000000000001451671353657467200254140ustar00rootroot00000000000000MZ@ !L!This program cannot be run in DOS mode. $u,uk ¢1RichPEL)t> \9*>p@ :r:p.text[\ `.rdatap`@@.dataw9r@.rsrc:v@@Vt$F<t9<uV?7@9Fu(~u"F ~ |Vet~t 3jX^UESVWHP7pM HMHUP MH UG] ~}t>UNEM9}8 ]ш] E;utu9}u}UEM빋8 j^E9}z;Uu#8 j^E9}W;UtUG8 8 EU33FUH MPUHMp_X^PH [UlS]VWjd7Y}K3!j^$$@SEVPC 3}u Cj}1c,SEVPC XC, EC,SEVPC5C, EC,SEVPCC, EC,o= de6SEjPC|}Eu Ƅ66E}|ăeE6E}|e;SEjPCz}uEEƄ6E}|E}}E6teރ636t6 66@=|ۋ6tuESEjPC}|Q}KSEjPCi}|-!EPSEjPCF9Et#EE;E|jXjd7Yu_^[EM^S7EU9U}e329}~3L;E|;׉}~;;^S7ɍtvEMNu; 7}GU;}}|ŃezSEjPC9EuEM̃}:}0SEjPCN9EuEMiE7EE;E|EE9E}SEjPC`!EЃe}3j ;^U~+Ei7E;~;}E9}|MEiiWR7VQ7Q77QPEL7EE;Eu6M@E E3EEMD0E}~jX 7EUш6NMyNH}ՃeESPSEuCP,E؋MԃU;~)AMSEjPCE E܉EËU+ESEjPCqE E܉E؃}&MԋU; U+ =MEE;Ect  MEt/t0 7EċM66ED0MMeȃuEEčESPkuSEuCPE؋MԃMU;~)AMSEjPC_E E܉EËU+=ME)E;EM8 EMă}M;MHs8 7 6Mv6L HuE6 76E;1~6TN;1~ 1O66uM 7068u2j 7Yj_NO66yVIu܋ES6D0EM68 EEPSEuCP$E[E0C,3;v;Emc3BsC0E,L,0E@=E~9uu~8M8 E08 E0EE;E|ȋC,8 sC 8 SC k C3@@ @,@O@@@x@@@@@~@3@g@r@@;@@D$ SVW|$9x(})PtEp$@( p$p(AJ;P|׋p(P$+3ۋCωp(D$K#Ӊ33@_^[ D$x ui@P;P|3@dL$@ 2 7PLL7PPPLi 7PTPLi 7P\PLi 7HXHPH H@3US]Vu3;uW"39E ~<;u}A@;E |B;U~ދU jY339M ~DA;M |3A|8A|}jY3!E M;-}++}Ap]>+8} } e OI<uuF;EML1t6+44@;E~_^[]U } t+} FEu H zHPuu uLr@SVWh@uPr@E EPuTr@}3; zz™}E}z׋z™}3ҊE RHp@^ESEuVjPXr@uEPu \r@uLp@;u]3=zh@VVVVjVVjhVVVj(Pp@;tiEE@hWu`r@ju Tp@5zu Xp@5`p@Su ։EEh PjWu dr@uu SLp@h@uhr@_^3[=4@Vu-3j^Ѐҁ 3Nu0@A|ՋT$D$v#L$ W9340@3AJu_^ Vt$sƋ 4y=zjr@u4HjPEt!t @L@ L@ @j0hز@P=jL}3@Pp@lj5z r@5zr@PMEzA8y5 r@tuP֡Pyt#uPjuPp@uz3j}uVt!j<V5@dH5@p@j<=r@V׀>tf8:\up.f>\\uj[ t V׋<\uVKu t V׋<\uu&uPup@@zFu>j'PR=zEjj߉EuЦ@VGSGu}G}=p@h@VSVSup@t Vj;}uzSuCVjjjEPWSVp@t$E;v&8t!Vqt,PuF z'}+SWWp@jMQWhjPjp@z'Wjh@h y|p@j1W}AWК@tWEF5@W7FPGAPp@WHТ@}uWxp@t@PWp@}u/WEt @ QPtp@3ɅM3}@Ph@W{BEuc}uJVSEWVEjhО@DSVEjhО@ @UHWj9uj9}uj93VVuuZ}u}t@ PVPupp@ulp@;puujPh@Wr@jPWDjWj"К@VWDW?|PVhp@؃|uePWh@Vr@|t PVp@Vp@t Vj8$}tzVj8jVAz|PS q@uS$q@yj1buP>[Mс;o;Cij'VCPVr@8\uV>uV\>V,jPCPWBjjj'}EtPIC};~EPW%C} WCy3ہr$;ij Rj1IPV(q@unE j.}hWPt,q@uz 0q@ jj;|~jj;sEvEjjȋE wh$q7@]+Y΋RtFƙE A#=3953u3"tt3Ft ƙ3zVUj.jPVWr@ $E5Ю@tIH6uК@VWAЮ@PVsAЮ@WPdA}t%FPWGAVЮ@8q@h;uFPX@Ю@5Ю@yjAj8}"Ejuj(jEEt j0Et j!EEt"MQPjuSuV r@@z=uSuVHr@*j#ȊQ#PuS$r@E}uj}P(r@RE] j_PjWP,r@hWj>P`r@c9Et uHp@PjjP0r@PLp@5u5z,r@EPV4r@EU+Űj#QM+M3#PWWPW8r@SjV0r@PLp@SWhrVHr@jHjZ5zh@Dp@Sj PjP r@)jj j"E uЦ@Wh@Vr@Vj2u5@#Pu#P5zdq@!j Vj25@VB8E}trjdPWVP0>uu8q@3EWP5zSuq@S8q@WWujulp@;}uj(hО@p@uj:=خ@Vhخ@j;=(y \y4E|4Vun2+t j]EuWh5zHr@EۉfFPWh5zjjP_-_^[a!@p@@@@@26@ @? @e @ @B!@T!@0 @i!@!@c"@"@"@G$@%@B%@%@%@&@;&@u&@&@&@;'@\'@(@(@(@(@)@)@K)@)@<*@W*@*@y+@+@<,@-@g.@.@/@/@/@60@0@S1@1@P2@e2@2@2@3@3@3@ 4@I4@5@26@26@26@26@26@26@26@5@&@&@&@&@&@&@&@&@'@ '@'@ '@VP@Vt$ hp@t P$q@3^U SVEWP3jSu up@;uM5p@9]uBSPuuWPSuօtup@u up@_^[ up@3@D$ @4P0P0Vt$W}؋@ȃ4 К@P/}W\2_^D$u)xᆳu xInstux softuxNullu@3U VWEjPbEPu*3PWh@h y@ |p@WhjWWhPp@@u`@AjWMu[y+MVWDj[y;EtV8q@@_^á[y5@yE[yt LyNL\y I ȉ $yFkj5zq@=G@t)p@;D$vhx@h=@Sjo5y|q@D$h@@țx @I5@țx+t2L$SQVP5@q@tW;t$uQ5@9@9@u99\$t3[y+ @L$$SSP5@q@jjX9\$t t$r@3_^][UVu E jPVu5zq@t 9u u3@3^]t$jt$ 5zq@U} Vujhjuq@Eu [y9u uB5zjd5z q@Pay5[yVr@ Vuq@Vhuw%3^] SUVWp@5@D$ ,p@h yWp@Wp@P5@\q@>"uF-r@ :t VՋuVՋ؉\$SՋ؀; t;/uKC;SuC < u8jy;NCRCuC < u9jyf;D=urcS5@*ز@h@hy *jp@Wy5@Pp@jh5@&zu![y@SՋ؊ < uD5@$j5zp@z<@jy;vWh[y=zuch[y z;Ɖ z [yt8jy=9jyt ]yp;vA==8jyu4=0byubp@;D$vh̑@h=@jjo5y|q@0by;5z}Wh[y5ay|ay=z+ >Ulr@3jPPPU@r@u뵡0by[y@ Pr@0by3;tPr@95zu[y@=]yt'V5zD$jPUt̡ay;D$uV5zl;ƣ[y39Lyt_8tF>u;>_u ~?u~=tN;s;fVO#V5@z'V5@n'@yxBu 8jyHBb=@ujv {G-q@ry@@k @@y;Hujp0>@y=4y @;HvhSjS,r@jjhD$05zHr@jt$(q@$Pjt$,0r@FPt$( r@FPt$(j5ryՋFP5`jyhyWA vW> PlWSq@jjh 5ryHr@jvPu=z35ryr@39>=yW@S@5y|q@;ǣrytgD$PhS,r@P4r@D$PSq@jWWt$ t$ W5ryq@Wvj5ry r@WWh5ryHr@9=yu)5ryq@5ryr@5hjySq@3t$(GujWWWWS5pryq@l$,uHP5pry r@ u 5ryr@|$(u%5`jyq@Ӆu}5ryӅtq3t$(E9t$(uduVnu9=@~IjZj[;u;9=ry@yWtp4hjyp8suhjyjxt$0Ut$0\_^][|$xu 4yD$jPh@5zHr@t$ PD$ Pt$ 9 U}8VuN5q@juփu(jq@Vu 5ryHr@hjPjjjVh@udq@hjPV8q@u~ u hjPׁ~[u~ u~ u j^3@ Vuu _^U} u+jjuajjuU5@huuuu T]U8} Sq@VWuh5@Vu5@} u.5@}VW1jjWjjWjjW} ^E;uMfE =3ejY3}h}PVWӍhPhWӍ}̉EԍE؍EPEQ@}EApq@PWlq@EPhq@EtWPQEPQ@yptW;rl@8tfPPE+Px;v!WPr@8\uuW(q@tuPLPp@PVu} t } uhe5@Vu5@5@pjyEV=qjy:u %sjy4f=pjy\\u)@Shrjyt@SPt VEPEPEPEPVp@tESEuP q@;v (y~\y@tUIuDytPjPVPuPhutjPVPWPhز@SuU}t#;}}u@yju@3P5ryq@uuu _^[|$u.VryhVht$ q@Vjhft$Hr@^3UQeSVuWEG}2EK} EMp@yE+EPEPj _RVh@u E Pr@E _^[VWq@tryjV tryt$jxryq@Vjht$Hr@D$ _^USV5,r@W}hWhWE֋Hr@3} Eryu;Ɖ=ztP8q@(yPjmry5yq@jjujjujjuh\@ju0r@ryry;tP4p@Vjj!jj(p@hWPry0p@5ryjh uWLp@@y9pPu Vu r@k5 yC3@y yDP;tP7PVWu y= y|С@ytj PVWuV5ryhNu395(yu Y!u!u\yM< yt(9ryt GuW ryt $GM PjMEE uG3AE yE tjYt Mt ME0t;M@3G }tM EPjhuӋ ry}ryE att?\tWV;t 8\uF_^[D$f8\\t8t Pr@8:t33@@ySVt$ @C3ЃWf>\\u:VPVr@8\tC<\uCVr@ujY+&>t!Vr@f8:\u@@u t<\t3C_^[Vt$WVt$+t*+T$| L$:uA u9tFBOu3_^UMVu~E +ANuE^] 3PPt$Pjt$t$p@ d$SUVWh@Dq@|$$t/ht@VHq@t jWt$(ЉD$VLq@|$p@ytjjWvPlp@VUW yNULVyVt$(VUhl@hyr@؉\$ hVp@h\@Vp@3PhjPPhVp@|$3VWp@VD+ PVjVWp@;ƉD$VVVjPp@;hP@S5;u+hP@P U hL@Pt?+W^WVPD$0FWD$$t$(P5t$$8q@+|$33t$ hyP Sl$$p@D$t$lp@VVUWq@Wp@Wlp@D$_^][ USEVu3PhSu up@u8E E PEVPSuup@u}tup@^[]ht$ PPt$ \q@t$h@t$ r@ UQMSVW39-} 9uAG90uA0| 77xtXuAA0| ;0<u#߃A|F uuċE_^[t%q@%q@SUVW yz޹+;wBT$}FUu FBB%#j@$j@5zV$  yP%ْ@Vhԓ@h@h">h@,@Uh@%3#zْ@\@uVP3h@P>ut3h yVuBh@Vp@Vxp@tu.h yQVp@QVq@ hخ@V~VkVw yT$x&_^][i@i@i@i@fj@mj@wj@j@UQeSVuW=r@V׋> t>t(~t~t >\\?\u>t V`tFFu)EPh@u V+PVS8VS׋؊Eu΀#K9]w < t<\tE_^[%|r@%xr@%tr@<J^p,&vv:v~~~~~~~~~wwwxx.xBxPxdxxxxxxxxxxxyy(ywHyZyjyyyyyyyyyzz(z8zNzfzrz~z\vfvxvvvwwwwlwv^wHw2w"wwwvvv~R~d~(|||{{{{{{{{|{l{^{V{F{"{{{zzzzzzz2{z`N:NULFF FsNv(pszhptr~|qs"~R~d~(|||{{{{{{{{|{l{^{V{F{"{{{zzzzzzz2{z`N:4ImageList_AddMasked7ImageList_Create8ImageList_DestroyCOMCTL32.dlljMulDivSetFilePointerReadFileWriteFileGetPrivateProfileStringAWritePrivateProfileStringAExitProcess:GetCurrentProcesskMultiByteToWideCharFreeLibraryGetProcAddressHLoadLibraryARGetExitCodeProcessWaitForSingleObjectGlobalFreeExpandEnvironmentStringsAPGetEnvironmentVariableAlstrcmpiAFindCloseFindNextFileA|DeleteFileAFindFirstFileA.CloseHandleSetFileTime3CompareFileTimeVGetFileAttributesAGetTempFileNameASearchPathAGetShortPathNameAaGetFullPathNameAdMoveFileAlstrcatAECreateDirectoryASetCurrentDirectoryA SetFileAttributesAGSleepMCreateFileAGetTickCount=CopyFileA[GetFileSizeuGetModuleFileNameAwGetModuleHandleAlstrcpynAGetCommandLineAGetTempPathAGetUserDefaultLangIDEGetDiskFreeSpaceAGetVersionGlobalUnlockGlobalLockGlobalAllociCreateThread`CreateProcessARemoveDirectoryASetEndOfFilecUnmapViewOfFile^MapViewOfFileNCreateFileMappingAGetWindowsDirectoryAlstrcpyAlstrlenAGetSystemDirectoryAKERNEL32.dllEndPaintDrawTextAwGetWindowTextAFillRectlSetRectGetClientRect BeginPaintDefWindowProcA;SendMessageAExitWindowsExDispatchMessageAPeekMessageA GetDCLoadImageAtGetWindowRectSetWindowLongAGetDlgItemIsWindowFindWindowExA>SendMessageTimeoutA-CharPrevAwsprintfA*CharNextAWSetForegroundWindowShowWindowPostQuitMessageDestroyWindowUCreateDialogParamAnGetWindowLongASetWindowTextAzSetTimerDialogBoxParamAGetClassInfoA`CreateWindowExASystemParametersInfoARegisterClassAIsWindowEnabledEndDialogVSetFocusSetWindowPos1ScreenToClientEnableWindowGSetClassLongAZGetSysColorLoadCursorAMSetCursorGetDlgItemTextAMapWindowPoints<GetMessagePosLoadBitmapACallWindowProcABCloseClipboardJSetClipboardDataEmptyClipboardOpenClipboardTrackPopupMenuAppendMenuA^CreatePopupMenu]GetSystemMetricsSSetDlgItemTextAMessageBoxAUSER32.dllSelectObject<SetTextColorSetBkMode9CreateFontADeleteObjectPCreateSolidBrush:CreateFontIndirectAkGetDeviceCapsGetStockObjectSetBkColorGDI32.dllRegEnumValueARegEnumKeyARegQueryValueExARegSetValueExARegCreateKeyARegCloseKeyRegDeleteValueARegOpenKeyExARegDeleteKeyAADVAPI32.dllSHFileOperationAShellExecuteASHGetMallocSHGetPathFromIDListAySHBrowseForFolderASHELL32.dllCoCreateInstanceOleUninitializeOleInitializeole32.dll VerQueryValueAGetFileVersionInfoAGetFileVersionInfoSizeAVERSION.dllGaramond@!N~SeShutdownPrivilegeAdjustTokenPrivilegesLookupPrivilegeValueAOpenProcessTokenadvapi32.dll\%s %s%s\%s%s%snst->Installer corrupted or incomplete. This could be the result of a failed download or corruption from a virus. If desperate, try the /NCRC command line switch (NOT recommended)Error writing temp fileunpacking data: %d%%@A~NSISu_.exeError launching installer _?=" verifying installer: %d%%NSIS ERRORRichEd20.dllRichEdit20AfK@hR@gN@j^@kM@pny_Nb.exeopen%d.%d%cB%c y y y y ySoftware\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders@@8@0@$@@Common AppDataStart MenuDesktopStartupPrograms [[Rename] \wininit.ini%s=%s MoveFileExAkernel32.dll%d\Microsoft\Internet Explorer\Quick LaunchC:\Program FilesProgramFilesDir*?|<>/":0H`mhijo g8 P ` p    :h(::<P:P:\:`:(`ݍwwwwww}wwwwww}wwwwww}wwwwww}wwwwww}}}}}} } } }wwwwp}wwwwp} } } }}wwwwp}wwwp} } } w}wwwwp}xwwp} } } ww}}wwwwp}wp} } } ww}wwwwp}xwp} } } ww}}wwwwp}wp} } } w}wwwwp}wwxp} } } w}wwwwp}wwwp} } } }wwwwp}wwwxp} } } }wwwwp}wwwwp}}}}}}؈}؈}؈}؈}؈}( @wxݐxݙpٙxx٘xwوxxxxp xwxxxxpxx{xxpxwݏx{݈p}݈wwpwwpwwpwwwwwwwxpwwpwwwwpwwwwpwwpwwwwwwwwp ??`?`???H@ MS Shell Dlg!PrfPgP(lA Pl PooPPr'ZSysTreeView32ʀMS Shell Dlg@2P2P2P @ X;lH@ MS Shell Dlg@ msctls_progress32@ msctls_progress32 P@@ hSysListView32PgP<MS Shell DlgP ᆳNullsoftInstwF1& ^pdH:K^9)scL+۹o^vt;}34'lfu͸ ٕ^[u{13p:zH"JWXΏZֹwJt u׷ Of3QRժgskbxh#Dh45S0&?)b4b3`~?OBDhjd=h4lIh4 @&4 $0y&yM$.sY\o^]Ō4V ?5TP8bKY1_f"0-&@(wו{((0='yS}-v!Jt${SDSDD~ -&or"Ml}~q,]ƳG Wr()Y~x{$ǐyed 1xذ?668<3u|I^y-$^ nj>{hYOg*&z3 Ė1[vg< )p6Idb[Lx}h&.yH$(䆡I,6l|}a7]gSeScccmv, XTvRV˨xP=`]K2$d>MG;}L }i2,e  礌??E3-_B0;߯&a7}…eһX8f=DM@ '`-;/t6îN= Zzp笍V9L`e1岬DqCU/?Y}b)gC恫EHxc٧*D1>#CT ʉ]388X26bbcR}pkAWxli}ơz72ہ踌  F.Za"ZZh& /nI5N;G1W "vavn5d"p)L)I>p{fxqmLZ7"YwtgehQ]0vLDPX 5$Lk ;4i?i$ֵ?$oo{,˶|᠁Fh!qbpq5HH9!7W1͎s1jZLM4GP=keMY@Gpbnsn\5.mAsCKxtJxsҤ ֭577t5u^.y^=De`'^AE%$UzhɟqJN{>RxkKtE7Mo9vE37q3M{]\ODȣ q|Ě;m6 m4&&Č PHM¸b0DH66R(m14`7Ȋ!m6LCciа 1M4-#mCCi0LC6`lA2HmI!q6ĺPOs)cg"`lcica|ZX46/:O2kC'7U[ṉVp^Ӂ%CGث4TZ؂6خ׀jڀDclccM8dhcm }A|" @:B XL?y+};@ߒ+mz%?~@0Q{{װq@VzESmG9]Jk^Ap Q VVpX Foݱ1N??RI(`Lz]=;2 y;J RXA@4s m?#b[kV\߲h;2e _#Mۢ1{Om@461t6y}h/o4mA;_(uy>F]WygȐ 3s3|NWY*:55az'Ȫ`iv}J:4L> s»{a(,u;nVő\u-9Cp/RfB#[q,2mzxVz^gssn4[߽nKOh+ux)0Zd~YN0>$o!vc=ϾGu~\MnIwVwY^V uozrasyAآ I˳g;Ë6Z3x)&!,˂zv"Nkt'֚e&O.@I }O*P"RqM ҐP]e@ԞTQ@jr@ND ̂ 0íg3Z G[%_ tpȪ 2옡4+5mͨ^)t"\KOʟ|̧D\=IdG%PDO3kJGoas =3vd>sǮYժ_w%W+M7.Rz9+j6 B%-Q}ƛj?[ 俯qrpCt;&"֒b07ubnC i,~GCgB)%?@1 rY8H#qgD 6ӇU\|FjIQ6D4.`xb=H8^穨7r"_C: /E,OXQrpZs,!!.fo*!\rFQUkH0d% ((^QL&u}11:6( 5O iqS)y9*S0 LK!P$К>oRUr2_w?SlKëZ @; 3xL 96 }ԉdcjZa1SS%Tٜ1/Yk(^S\g=^Cud,2ar6ږP.^!A*hS.""js Y&5Izy# b,y F=]^sV_5M2&en@Z7ÁM2bL*bم%GN=ux+_,Wk +]=~_EG& H8`C( H2Y1^>P _ z>>7@"TJ0bW+WLo2)p%R'dR"~gL_5Y0j4 xA?/J=]Z%r) D+vV(,:w `&VYVy@O.4q]. ҤL|"fIhc .~N)=,F`HsVT0CPr)l*d$F9YpS"FkW FPeVuaMERf2/ z iMg\zl/o+Llm]zwTG'@6G9Ґ @ҿ ֜y1մe嗻5;NYgpcm.Ӧ 6JLBcD@@ Ȗb^ ]g5[@#1Y((J4gxnEOmWپbX'%7H`}: jؔ}BDDgyN`W\ q еƣUEva*IsC ,zyW5TScM!F.EAxQ47~PYB"Ə 6J/ ύҭ FsxKٳJvtɓ*`W%oO?; 1B&M$wƇW&gNWK5](h+ jձ'rg_\<>l 0f&Ԥ(,UTkwWUS:sYjJnsznjͣP N[rLI; w .EL &Z M՛{|L L$?ۢ v=>׷P,DQɎC=~UP<)-pH664ԂZ {Z5 P`kmUɐ)Q(!FEh9hV2\*D%pZ\pAIN .lx6 `,6d$ڄ ɫe,bh(4(t@hj TđluN! A!?vE7|kn)DZ3k 0ɻW уPS-@C S{==!47`4DdOM%pgzk4KS13f7cx~A= hĕY*hXЦuP +\ަЩ4ųdx\ee90%Š?;p Zzɍb1=nO9Vo.%]X>>Tjݠ:͇3b(!EGN\ŭdlӏ840R G5)q$\ %80$<`Xz<`c/@1X 6h&1I$1 G0;7 ,!6[FI. ֵ'=+.5=#d f|4A׍Fg336~~eB|]fkQ|i$oWEukU,h?14&m! J'~ǁot5'x" ̅_ԲMZ{FsSTm>l((Xri  cȔ-ϩȫCvlyf;{K CaU/&&}uݦe M+ %je̬PU(.,ۄ(}'MVz6hh[|8~Jb1+]H0`Rb,V]]esdUGQsS|fISP_mE9K[=zIﴏ\n5ߓ/b_EUe7=P9T؜L?Ui lq1ȸ^˷6|Hyu"PNYs*\p3;6LS-^96%TLuw?6&Kj2zHwZ[mVu{ѝyO2YsDB{cg'/,2ʩjZ 20&^0ﱑn< uxn5W̉n8DWõj@>Ti] zmU{PRⷒfTm2z1q\-J#1==yc }z82܆mhݺ[gǮi4fg[wބ3(mY Eӽ0 zGrH:esFg)f%vi\@|>w~'&e'큵ߏOZXu:zO/WsWȈ 6!6i0!@SW KY?~Fo676~,d[}^y>#_wgC5XSpiZ={8j2 /;XJ:@3cM}'P2AY~?MOW>F~_iuaxd>>e{Sǁ񉯜ZQͥcgrV_,PC\`m]-Os{W[=q#k9D88R({BLl36W#)8+]MkXZ͍g|͞ ¬gwngƗI8{MOpRH'wLID@WFwXP(DGo)XHʙ1{ s)g}fLlC0HI4ln=Aӷqgx8sοjd`Q^p>&iٙo{4%kdGug:5v ><W3bPlwmy3[X2N"( a^ot7͙SZSGmv!t _fEfKiT$`L#P4OȚx.Jԉ1v1Gx(IB-YǕA[FMğ [ZTG ܡ ?"@yvBedqd\=d Hmt+Ƽ|`Lÿz&uf@uC˕pkX$# qik֛\;2Ch8lЄ͑ AcJVN}A׃h7N#C(?HqyH :&4dވ XpF:ҿbə jALd+FڅE^Rܐ{&"T )& )W`fBS9aej2+]2eЬ@BQ4biBmaY;4[Ȥ Ek&wWlP i9 d2` VyvȸQ5/n $W/՜FΌṍ=34l!EۉU67p7ds%jDH8N[c $Wu6BR*%V'ŀMd,yS3ysmJԨKcH.EE-$w,η g"6ۆۙ~fw֟ŎgfUOW[6`J9gv˛`;L?rbn <,c1t/ 8#r EfSSir`<Đ"UVDJCό ' V9G;Op:LmxLYNsJ@c@|*G9ޏGJ*oygOA\ކ$ieS5}ײܖCդIŶ,<;ٱrW#tFiHd욁Ŝ 1m|q3%eezjE@cVٺ}2̌3s qn! hdͺpxޥ88݉>ǂ%jz{yJIqtCE Ĺ6<'CDo6c:!$<Ŝ@C07;`*#DT*ԝYq"ĀaB]kh ǡιA͂U.ʻh4r/V^nȈD^tH !ՌU*臤*$vL"[B $V^O1ѿgM]Q"耊(s*F1IƐ6?444fpi>LB5 z8rw64!x 1Yh&0KP5lCFJ|@ 04:Td- lkɐz6Tf V7MG1~f+P>Pwi2/sIUkV˜XC~on g'LK#! d ֔ɳ`#0En&iZ5ہ$Lÿ 9e]o; 8F]Ln+E2% T~Ƨ^tջ|?%9;m^d}b~jlj<5!.Bh#n  [뷑趛-r3$DURVY[&o1ABV]nt֚ź?800 N uų,> MdWk WA\%㣅DOr 6"޳7cyfM=!VNBS|_HF#AaCiT1>%Fvl.{:J\]euobZ)*Z{+6H NRQ@%nX;S8^ΥBͬeTK alqcevZ׶S4ï>_qpF(cD){bj f)ƀcW; R!Jl'­ψXL Ȉя= ڝ9%drOQˀoxsx4TCC"IxjEZ1 rk`] oQ/.|8Y6OUc(ਬ9NttPL!AT<D+=1Z@udIh$_8̜*NmxJV-S:M%bb^M4}Uu⦻*V1te]z-IeRB :'fF H`xǽ<#N~}Shv!k/ dHm4< fGnqN}ꎕ H Q:ӳs38Ÿ|i8B(P\+Qg8g򦃘q2r6}C6'~A=璩:3A$kF (-@.ODf(x&/X6.ǯt&5ZX_idCXGUh 8]B !NY *z4F049`\7GDSଗA,C5띔Я`MqW9 IbE.v|ūIiFXdm1#YvjM\W_ahq&OurZ"D uAim%$F2g/- Xj-BBu-$gϞ|b 0l/+Ϙ|T߆͒$7hDeR"Uxx4 Z<w-Kg~+ 8 H #ݟ$4hm -!2|Ҭy2JgݫKbXM6S 7UiR7Lj"*YI\P5h ,o!lFJ`Y.% EԫTl[Ke6)5FDwgkm]]-/^h|R8JZt&CF8r%R5XB-cvMCh&i  [8Qdi䣣=Ȓ9,u=K~."s)s_KUJuCRDtU8BF2@W]xע(2*:lJL_}lXB8i>Ejdр2S,\De˧ºcܔz7^Ն<9a⼼UBP F5֔t5q*eZt4[3IӀ0#6Zl7#zblU@/Kj͌\!P&\"~;=t# F:4Ş[x;?HyL=wPP|jЀtKQJ`A mPtkP$Nq6r]#}GIxre4br6x0 躏YC`lEhH%_J40 :6Sn{n_k40!j">+@6>=ֳx!F-@d0^x<>uCSBl;'O 2sB* xL.>h{w!#gb²iiX`z3JhcIjALmSy_he+, /*tF>`mtwg֢LY`10U&Czy( "Py3R\VܡH<_ՑPwJcL`Bc݃DeC]},V)+Fn @`![:cEŹ?'&=){ x& itŽŸpÇ_'Rs0xc>dXkm`zkF0v!H/?[@(ؑꡔ~TҚ {pPt5?Kej1F'q[;'"C8$guuXJuoI\PʡнƦO.VK4^Cm8vRգɘt7K{17y},E*=d`҇W\9c ^lm})C&)U49ۘ&Ajys yGjbTT,е dSHdzFlwa2間]ɜPR R"vҭ;zxO M- K-B3ݘ\vBb줩kWߧ.Z{ϡ`!#\''I_ŃxE_U)Eك-2i(YCa3&-Ff1&3j| ^kw9aMH:vyBJ =]&C Ot85cC}U6O/Ylüݚ͒Ir8WN\ 1Q9{W\ |\0?WaKk}*j:n(f&KKFm}]]W_h2woŔW{Io45&G7\xi1` ,ڌ :quB !5ZؿR,Ŕ jX$<ƨf"9w,=W1fE2k[w-g\3[v-˩$w\ǁ&F9;Wm( q⟹14眒M+90Ѭ| нε#q !!F8͡͹-cmÿA}?V=lC㘩8%f` Aqi+ZCKI"豃Y$mo'g* ƇT:Л(~)V$XP6f 3$,7!T`Ql<;^C£ؿ0 7|X5vN:p"&ЀGgF8rL(Afdw[~Vdbڣpgn-۩qYI3扦/9 ֌|׼~b+Ľ6Lf~NzZTG`'΍ D«? Ch='hm+ G3Zq1*t:FD>O71q7Ď6En= Hb:~'T%R"*kaT. <$!ZƢvV^&ӣZCA95 5ܕTdTc>҈\8L9xBA9zGPEp@mǬQܸ#}iH.+1;LrWGV'D߂qJXywz9ʿI %}A;a"GU 0#L2!P"A|da?["u{,Xs|]鯏Xn' `DQP;|b'-7kX rkŃXDK?3_gGKw;M; $ȱŨŽzs\#QqGO&eO`h peT kB1YU9dav2nj4=nWO :xGqjz~ E4C>l#2znW^AC5=}$#r3$@c$/PWޘL-N;^o}jw.#HvC?>WUcyB~n/zX0c@`a1SAwxVS%e1f! L2Qrb1> c]GA&S.t෽vCroo:VN ؽ5-rO11"_Gk5E -']HGip2:~-l$Z|ַ>2ɷ7|zz 6g0_Q\fg2gNHF20rbhK@a`.$?kN[dQ)ya4G`R1GH&,5D,q:1M8>Ae ?@ BEB5|f1G`2l,:s\ DBDӞpBXMenܧMT ɕ+ש4M\P$DDp.u2Rs P0Y)صАH6H7up_y}Ly`t*},PK0\*TZc{Q@Hŵ;?y?FJݫR/[7`i;xHr ^&ר6-΁~==ZL^0,*. ڲ<`㏯s` זo**e s3>΂.6cXU/hjww[>f w#zU`$Fh߰,.Xn1(iw͓{{sUA4.ON(As3C9*<)g:ub{&*ĸ!eu,'e1jرӺl')i5K'KNLw} :HY%Ԟ!^r~ۻ݄ &t؅GCF!. C*m( D( G!fsӑ+Aca~\*H~F5'Ȓ(F!z(m*"DJ epw|Kab`?2._-݄F){(V @%h`/3V ._2X)C5 |#}!v۾sGuZ1~cuy/p"NbEؙ )pu3'@-h ҡgtޚkpj~~nhjQIkKPEVz\H..H};lM9 DU_~L~̭o|p>%l2iF+ҠU )FƗ# $x~o|a"_w価AjSl-83V.⇜Os LR޲.%VmJQI@ixvk M40DP`&ORI$0*rЙW:dE5$"nK˖-Uпtrd l9ӊ@ –gobʵQϭr}+k H wY10.5Heu6QaC"^J_dB49Zf/(>GуZo=4.Gmͱ',LB ˛yua?Gr}>+7A`#dٲh%A 7oC[Wu=K·s)x ?\FMKsnek-1.1/hosts/windows/Instdrv/NSIS/Contrib/InstDrv/InstDrv.c000066400000000000000000000412001353657467200241170ustar00rootroot00000000000000/* InstDrv.dll - Installs or Removes Device Drivers Copyright 2003 Jan Kiszka (Jan.Kiszka@web.de) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any distribution. */ #include #include #include #include "../exdll/exdll.h" char paramBuf[1024]; GUID devClass; char hwIdBuf[1024]; int initialized = 0; void* memset(void* dst, int val, unsigned int len) { while (len-- > 0) *((char *)dst)++ = val; return NULL; } void* memcpy(void* dst, const void* src, unsigned int len) { while (len-- > 0) *((char *)dst)++ = *((char *)src)++; return NULL; } int HexCharToInt(char c) { if ((c >= '0') && (c <= '9')) return c - '0'; else if ((c >= 'a') && (c <= 'f')) return c - 'a' + 10; else if ((c >= 'A') && (c <= 'F')) return c - 'A' + 10; else return -1; } BOOLEAN HexStringToUInt(char* str, int width, void* valBuf) { int i, val; for (i = width - 4; i >= 0; i -= 4) { val = HexCharToInt(*str++); if (val < 0) return FALSE; *(unsigned int *)valBuf += val << i; } return TRUE; } BOOLEAN StringToGUID(char* guidStr, GUID* pGuid) { int i; memset(pGuid, 0, sizeof(GUID)); if (*guidStr++ != '{') return FALSE; if (!HexStringToUInt(guidStr, 32, &pGuid->Data1)) return FALSE; guidStr += 8; if (*guidStr++ != '-') return FALSE; if (!HexStringToUInt(guidStr, 16, &pGuid->Data2)) return FALSE; guidStr += 4; if (*guidStr++ != '-') return FALSE; if (!HexStringToUInt(guidStr, 16, &pGuid->Data3)) return FALSE; guidStr += 4; if (*guidStr++ != '-') return FALSE; for (i = 0; i < 2; i++) { if (!HexStringToUInt(guidStr, 8, &pGuid->Data4[i])) return FALSE; guidStr += 2; } if (*guidStr++ != '-') return FALSE; for (i = 2; i < 8; i++) { if (!HexStringToUInt(guidStr, 8, &pGuid->Data4[i])) return FALSE; guidStr += 2; } if (*guidStr++ != '}') return FALSE; return TRUE; } DWORD FindNextDevice(HDEVINFO devInfoSet, SP_DEVINFO_DATA* pDevInfoData, DWORD* pIndex) { DWORD buffersize = 0; LPTSTR buffer = NULL; DWORD dataType; DWORD result; while (1) { if (!SetupDiEnumDeviceInfo(devInfoSet, (*pIndex)++, pDevInfoData)) { result = GetLastError(); break; } GetDeviceRegistryProperty: if (!SetupDiGetDeviceRegistryProperty(devInfoSet, pDevInfoData, SPDRP_HARDWAREID, &dataType, (PBYTE)buffer, buffersize, &buffersize)) { result = GetLastError(); if (result == ERROR_INSUFFICIENT_BUFFER) { if (buffer != NULL) LocalFree(buffer); buffer = (LPTSTR)LocalAlloc(LPTR, buffersize); if (buffer == NULL) break; goto GetDeviceRegistryProperty; } else if (result == ERROR_INVALID_DATA) continue; // ignore invalid entries else break; // break on other errors } if (lstrcmpi(buffer, hwIdBuf) == 0) { result = 0; break; } } if (buffer != NULL) LocalFree(buffer); return result; } DWORD FindFirstDevice(HWND hwndParent, const GUID* pDevClass, const LPTSTR hwId, HDEVINFO* pDevInfoSet, SP_DEVINFO_DATA* pDevInfoData, DWORD *pIndex, DWORD flags) { DWORD result; *pDevInfoSet = SetupDiGetClassDevs((GUID*)pDevClass, NULL, hwndParent, flags); if (*pDevInfoSet == INVALID_HANDLE_VALUE) return GetLastError(); pDevInfoData->cbSize = sizeof(SP_DEVINFO_DATA); *pIndex = 0; result = FindNextDevice(*pDevInfoSet, pDevInfoData, pIndex); if (result != 0) SetupDiDestroyDeviceInfoList(*pDevInfoSet); return result; } /* * InstDrv::InitDriverSetup devClass drvHWID * * devClass - GUID of the driver's device setup class * drvHWID - Hardware ID of the supported device * * Return: * result - error message, empty on success */ void __declspec(dllexport) InitDriverSetup(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) { EXDLL_INIT(); /* convert class GUID */ popstring(paramBuf); if (!StringToGUID(paramBuf, &devClass)) { popstring(paramBuf); pushstring("Invalid GUID!"); return; } /* get hardware ID */ memset(hwIdBuf, 0, sizeof(hwIdBuf)); popstring(hwIdBuf); initialized = 1; pushstring(""); } /* * InstDrv::CountDevices * * Return: * result - Number of installed devices the driver supports */ void __declspec(dllexport) CountDevices(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) { HDEVINFO devInfoSet; SP_DEVINFO_DATA devInfoData; int count = 0; char countBuf[16]; DWORD index; DWORD result; EXDLL_INIT(); if (!initialized) { pushstring("Fatal error!"); return; } result = FindFirstDevice(hwndParent, &devClass, hwIdBuf, &devInfoSet, &devInfoData, &index, DIGCF_PRESENT); if (result != 0) { pushstring("0"); return; } do { count++; } while (FindNextDevice(devInfoSet, &devInfoData, &index) == 0); SetupDiDestroyDeviceInfoList(devInfoSet); wsprintf(countBuf, "%d", count); pushstring(countBuf); } /* * InstDrv::CreateDevice * * Return: * result - Windows error code */ void __declspec(dllexport) CreateDevice(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) { HDEVINFO devInfoSet; SP_DEVINFO_DATA devInfoData; DWORD result = 0; char resultBuf[16]; EXDLL_INIT(); if (!initialized) { pushstring("Fatal error!"); return; } devInfoSet = SetupDiCreateDeviceInfoList(&devClass, hwndParent); if (devInfoSet == INVALID_HANDLE_VALUE) { wsprintf(resultBuf, "%08X", GetLastError()); pushstring(resultBuf); return; } devInfoData.cbSize = sizeof(SP_DEVINFO_DATA); if (!SetupDiCreateDeviceInfo(devInfoSet, hwIdBuf, &devClass, NULL, hwndParent, DICD_GENERATE_ID, &devInfoData)) { result = GetLastError(); goto InstallCleanup; } if (!SetupDiSetDeviceRegistryProperty(devInfoSet, &devInfoData, SPDRP_HARDWAREID, hwIdBuf, (lstrlen(hwIdBuf)+2)*sizeof(TCHAR))) { result = GetLastError(); goto InstallCleanup; } if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE, devInfoSet, &devInfoData)) result = GetLastError(); InstallCleanup: SetupDiDestroyDeviceInfoList(devInfoSet); wsprintf(resultBuf, "%08X", result); pushstring(resultBuf); } /* * InstDrv::InstallDriver infPath * * Return: * result - Windows error code * reboot - non-zero if reboot is required */ void __declspec(dllexport) InstallDriver(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) { char resultBuf[16]; BOOL reboot; EXDLL_INIT(); popstring(paramBuf); if (!initialized) { pushstring("Fatal error!"); return; } if (!UpdateDriverForPlugAndPlayDevices(hwndParent, hwIdBuf, paramBuf, INSTALLFLAG_FORCE, &reboot)) { wsprintf(resultBuf, "%08X", GetLastError()); pushstring(resultBuf); } else { wsprintf(resultBuf, "%d", reboot); pushstring(resultBuf); pushstring("00000000"); } } /* * InstDrv::DeleteOemInfFiles * * Return: * result - Windows error code * oeminf - Path of the deleted devices setup file (oemXX.inf) * oempnf - Path of the deleted devices setup file (oemXX.pnf) */ void __declspec(dllexport) DeleteOemInfFiles(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) { HDEVINFO devInfo; SP_DEVINFO_DATA devInfoData; SP_DRVINFO_DATA drvInfoData; SP_DRVINFO_DETAIL_DATA drvInfoDetail; DWORD index; DWORD result; char resultBuf[16]; if (!initialized) { pushstring("Fatal error!"); return; } result = FindFirstDevice(NULL, &devClass, hwIdBuf, &devInfo, &devInfoData, &index, 0); if (result != 0) goto Cleanup1; if (!SetupDiBuildDriverInfoList(devInfo, &devInfoData, SPDIT_COMPATDRIVER)) { result = GetLastError(); goto Cleanup2; } drvInfoData.cbSize = sizeof(SP_DRVINFO_DATA); drvInfoDetail.cbSize = sizeof(SP_DRVINFO_DETAIL_DATA); if (!SetupDiEnumDriverInfo(devInfo, &devInfoData, SPDIT_COMPATDRIVER, 0, &drvInfoData)) { result = GetLastError(); goto Cleanup3; } if (!SetupDiGetDriverInfoDetail(devInfo, &devInfoData, &drvInfoData, &drvInfoDetail, sizeof(drvInfoDetail), NULL)) { result = GetLastError(); if (result != ERROR_INSUFFICIENT_BUFFER) goto Cleanup3; result = 0; } pushstring(drvInfoDetail.InfFileName); if (!DeleteFile(drvInfoDetail.InfFileName)) result = GetLastError(); else { index = lstrlen(drvInfoDetail.InfFileName); if (index > 3) { lstrcpy(drvInfoDetail.InfFileName+index-3, "pnf"); pushstring(drvInfoDetail.InfFileName); if (!DeleteFile(drvInfoDetail.InfFileName)) result = GetLastError(); } } Cleanup3: SetupDiDestroyDriverInfoList(devInfo, &devInfoData, SPDIT_COMPATDRIVER); Cleanup2: SetupDiDestroyDeviceInfoList(devInfo); Cleanup1: wsprintf(resultBuf, "%08X", result); pushstring(resultBuf); } /* * InstDrv::RemoveAllDevices * * Return: * result - Windows error code * reboot - non-zero if reboot is required */ void __declspec(dllexport) RemoveAllDevices(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) { HDEVINFO devInfo; SP_DEVINFO_DATA devInfoData; DWORD index; DWORD result; char resultBuf[16]; BOOL reboot = FALSE; SP_DEVINSTALL_PARAMS instParams; EXDLL_INIT(); if (!initialized) { pushstring("Fatal error!"); return; } result = FindFirstDevice(NULL, &devClass, hwIdBuf, &devInfo, &devInfoData, &index, 0); if (result != 0) goto Cleanup1; do { if (!SetupDiCallClassInstaller(DIF_REMOVE, devInfo, &devInfoData)) { result = GetLastError(); break; } instParams.cbSize = sizeof(instParams); if (!reboot && SetupDiGetDeviceInstallParams(devInfo, &devInfoData, &instParams) && ((instParams.Flags & (DI_NEEDRESTART|DI_NEEDREBOOT)) != 0)) { reboot = TRUE; } result = FindNextDevice(devInfo, &devInfoData, &index); } while (result == 0); SetupDiDestroyDeviceInfoList(devInfo); Cleanup1: if ((result == 0) || (result == ERROR_NO_MORE_ITEMS)) { wsprintf(resultBuf, "%d", reboot); pushstring(resultBuf); pushstring("00000000"); } else { wsprintf(resultBuf, "%08X", result); pushstring(resultBuf); } } /* * InstDrv::StartSystemService serviceName * * Return: * result - Windows error code */ void __declspec(dllexport) StartSystemService(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) { SC_HANDLE managerHndl; SC_HANDLE svcHndl; SERVICE_STATUS svcStatus; DWORD oldCheckPoint; DWORD result; char resultBuf[16]; EXDLL_INIT(); popstring(paramBuf); managerHndl = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (managerHndl == NULL) { result = GetLastError(); goto Cleanup1; } svcHndl = OpenService(managerHndl, paramBuf, SERVICE_START | SERVICE_QUERY_STATUS); if (svcHndl == NULL) { result = GetLastError(); goto Cleanup2; } if (!StartService(svcHndl, 0, NULL) || !QueryServiceStatus(svcHndl, &svcStatus)) { result = GetLastError(); goto Cleanup3; } while (svcStatus.dwCurrentState == SERVICE_START_PENDING) { oldCheckPoint = svcStatus.dwCheckPoint; Sleep(svcStatus.dwWaitHint); if (!QueryServiceStatus(svcHndl, &svcStatus)) { result = GetLastError(); break; } if (oldCheckPoint >= svcStatus.dwCheckPoint) { if ((svcStatus.dwCurrentState == SERVICE_STOPPED) && (svcStatus.dwWin32ExitCode != 0)) result = svcStatus.dwWin32ExitCode; else result = ERROR_SERVICE_REQUEST_TIMEOUT; } } if (svcStatus.dwCurrentState == SERVICE_RUNNING) result = 0; Cleanup3: CloseServiceHandle(svcHndl); Cleanup2: CloseServiceHandle(managerHndl); Cleanup1: wsprintf(resultBuf, "%08X", result); pushstring(resultBuf); } /* * InstDrv::StopSystemService serviceName * * Return: * result - Windows error code */ void __declspec(dllexport) StopSystemService(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) { SC_HANDLE managerHndl; SC_HANDLE svcHndl; SERVICE_STATUS svcStatus; DWORD oldCheckPoint; DWORD result; char resultBuf[16]; EXDLL_INIT(); popstring(paramBuf); managerHndl = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (managerHndl == NULL) { result = GetLastError(); goto Cleanup1; } svcHndl = OpenService(managerHndl, paramBuf, SERVICE_STOP | SERVICE_QUERY_STATUS); if (svcHndl == NULL) { result = GetLastError(); goto Cleanup2; } if (!ControlService(svcHndl, SERVICE_CONTROL_STOP, &svcStatus)) { result = GetLastError(); goto Cleanup3; } while (svcStatus.dwCurrentState == SERVICE_STOP_PENDING) { oldCheckPoint = svcStatus.dwCheckPoint; Sleep(svcStatus.dwWaitHint); if (!QueryServiceStatus(svcHndl, &svcStatus)) { result = GetLastError(); break; } if (oldCheckPoint >= svcStatus.dwCheckPoint) { result = ERROR_SERVICE_REQUEST_TIMEOUT; break; } } if (svcStatus.dwCurrentState == SERVICE_STOPPED) result = 0; Cleanup3: CloseServiceHandle(svcHndl); Cleanup2: CloseServiceHandle(managerHndl); Cleanup1: wsprintf(resultBuf, "%08X", result); pushstring(resultBuf); } BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { return TRUE; } snek-1.1/hosts/windows/Instdrv/NSIS/Contrib/InstDrv/InstDrv.dsp000066400000000000000000000105301353657467200244650ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="InstDrv" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=InstDrv - Win32 Debug !MESSAGE Dies ist kein gltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und fhren Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "InstDrv.mak". !MESSAGE !MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "InstDrv.mak" CFG="InstDrv - Win32 Debug" !MESSAGE !MESSAGE Fr die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "InstDrv - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library") !MESSAGE "InstDrv - Win32 Debug" (basierend auf "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "InstDrv - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 1 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "INSTDRV_EXPORTS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O1 /I "C:\Programme\WINDDK\3790\inc\ddk\w2k" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "INSTDRV_EXPORTS" /FD /c # SUBTRACT CPP /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib setupapi.lib newdev.lib /nologo /entry:"_DllMainCRTStartup" /dll /machine:I386 /nodefaultlib /out:"../../Plugins/InstDrv.dll" /libpath:"C:\Programme\WINDDK\3790\lib\w2k\i386" /opt:nowin98 # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "InstDrv - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "INSTDRV_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "INSTDRV_EXPORTS" /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /entry:"_DllMainCRTStartup" /dll /debug /machine:I386 /pdbtype:sept # SUBTRACT LINK32 /nodefaultlib !ENDIF # Begin Target # Name "InstDrv - Win32 Release" # Name "InstDrv - Win32 Debug" # Begin Group "Quellcodedateien" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\InstDrv.c # End Source File # End Group # Begin Group "Header-Dateien" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Ressourcendateien" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project snek-1.1/hosts/windows/Instdrv/NSIS/Contrib/InstDrv/InstDrv.dsw000066400000000000000000000010651353657467200244770ustar00rootroot00000000000000Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELSCHT WERDEN! ############################################################################### Project: "InstDrv"=.\InstDrv.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### snek-1.1/hosts/windows/Instdrv/NSIS/Contrib/InstDrv/Readme.txt000066400000000000000000000111021353657467200243160ustar00rootroot00000000000000InstDrv.dll version 0.2 - Installs or Removes Device Drivers ------------------------------------------------------------ The plugin helps you to create NSIS scripts for installing device drivers or removing them again. It can count installed device instances, create new ones or delete all supported device. InstDrv works on Windows 2000 or later. InstDrv::InitDriverSetup devClass drvHWID Return: result To start processing a driver, first call this function. devClass is the GUID of the device class the driver supports, drvHWID is the device hardware ID. If you don't know what these terms mean, you may want to take a look at the Windows DDK. This function returns an empty string on success, otherwise an error message. InitDriverSetup has to be called every time after the plugin dll has been (re-)loaded, or if you want to switch to a different driver. InstDrv::CountDevices Return: number This call returns the number of installed and supported devices of the driver. InstDrv::CreateDevice Return: result To create a new deviced node which the driver has to support, use this function. You may even call it multiple times for more than one instance. The return value is the Windows error code (in hex). Use CreateDevice before installing or updating the driver itself. InstDrv::InstallDriver infPath Return: result reboot InstallDriver installs or updates a device driver as specified in the .inf setup script. It returns a Windows error code (in hex) and, on success, a flag signalling if a system reboot is required. InstDrv::DeleteOemInfFiles Return: result oeminf oempnf DeleteOemInfFiles tries to clean up the Windows inf directory by deleting the oemXX.inf and oemXX.pnf files associated with the drivers. It returns a Windows error code (in hex) and, on success, the names of the deleted files. This functions requires that at least one device instance is still present. So, call it before you remove the devices itself. You should also call it before updating a driver. This avoids that the inf directory gets slowly messed up with useless old setup scripts (which does NOT really accelerate Windows). The error code which comes up when no device is installed is "00000103". InstDrv::RemoveAllDevices Return: result reboot This functions deletes all devices instances the driver supported. It returns a Windows error code (in hex) and, on success, a flag signalling if the system needs to be rebooted. You additionally have to remove the driver binaries from the system paths. InstDrv::StartSystemService serviceName Return: result Call this function to start the provided system service. The function blocks until the service is started or the system reported a timeout. The return value is the Windows error code (in hex). InstDrv::StopSystemService serviceName Return: result This function tries to stop the provided system service. It blocks until the service has been shut down or the system reported a timeout. The return value is the Windows error code (in hex). Example.nsi The example script installs or removes the virtual COM port driver of IrCOMM2k (2.0.0-alpha8, see www.ircomm2k.de/english). The driver and its setup script are only included for demonstration purposes, they do not work without the rest of IrCOMM2k (but they also do not cause any harm). Building the Source Code To build the plugin from the source code, some include files and libraries which come with the Windows DDK are required. History 0.2 - fixed bug when calling InitDriverSetup the second time - added StartSystemService and StopSystemService 0.1 - first release License Copyright © 2003 Jan Kiszka (Jan.Kiszka@web.de) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any distribution. snek-1.1/hosts/windows/Instdrv/NSIS/Contrib/InstDrv/ircomm2k.inf000066400000000000000000000067661353657467200246250ustar00rootroot00000000000000; IrCOMM2k.inf ; ; Installation file for the Virtual Infrared-COM-Port ; ; (c) Copyright 2001, 2002 Jan Kiszka ; [Version] Signature="$Windows NT$" Provider=%JK% Class=Ports ClassGUID={4d36e978-e325-11ce-bfc1-08002be10318} ;DriverVer=03/26/2002,1.2.1.0 [DestinationDirs] IrCOMM2k.Copy2Drivers = 12 IrCOMM2k.Copy2Winnt = 10 IrCOMM2k.Copy2System32 = 11 IrCOMM2k.Copy2Help = 18 ; ; Driver information ; [Manufacturer] %JK% = JK.Mfg [JK.Mfg] %JK.DeviceDescIrCOMM% = IrCOMM2k_inst,IrCOMM2k ; ; General installation section ; [IrCOMM2k_inst] CopyFiles = IrCOMM2k.Copy2Drivers ;,IrCOMM2k.Copy2System32,IrCOMM2k.Copy2Help,IrCOMM2k.Copy2Winnt ;AddReg = IrCOMM2k_inst_AddReg ; ; File sections ; [IrCOMM2k.Copy2Drivers] ircomm2k.sys,,,2 ;[IrCOMM2k.Copy2System32] ;ircomm2k.exe,,,2 ;ircomm2k.dll,,,2 ;[IrCOMM2k.Copy2Help] ;ircomm2k.hlp,,,2 ;[IrCOMM2k.Copy2Winnt] ;IrCOMM2k-Setup.exe,Setup.exe,,2 ; ; Service Installation ; [IrCOMM2k_inst.Services] AddService = IrCOMM2k,0x00000002,IrCOMM2k_DriverService_Inst,IrCOMM2k_DriverEventLog_Inst ;AddService = IrCOMM2kSvc,,IrCOMM2k_Service_Inst [IrCOMM2k_DriverService_Inst] DisplayName = %IrCOMM2k.DrvName% ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ; SERVICE_DEMAND_START ErrorControl = 0 ; SERVICE_ERROR_IGNORE ServiceBinary = %12%\ircomm2k.sys ;[IrCOMM2k_Service_Inst] ;DisplayName = %IrCOMM2k.SvcName% ;Description = %IrCOMM2k.SvcDesc% ;ServiceType = 0x00000120 ; SERVICE_WIN32_SHARE_PROCESS, SERVICE_INTERACTIVE_PROCESS ;StartType = 2 ; SERVICE_AUTO_START ;ErrorControl = 0 ; SERVICE_ERROR_IGNORE ;ServiceBinary = %11%\ircomm2k.exe ;Dependencies = IrCOMM2k ;AddReg = IrCOMM2kSvcAddReg [IrCOMM2k_inst.nt.HW] AddReg=IrCOMM2kHwAddReg [IrCOMM2kHwAddReg] HKR,,PortSubClass,REG_BINARY,0x00000001 ;HKR,,TimeoutScaling,REG_DWORD,0x00000001 ;HKR,,StatusLines,REG_DWORD,0x00000000 ;[IrCOMM2k_inst_AddReg] ;HKR,,EnumPropPages32,,"ircomm2k.dll,IrCOMM2kPropPageProvider" ;HKLM,%UNINSTALL_KEY%,DisplayIcon,0x00020000,"%windir%\IrCOMM2k-Setup.exe" ;HKLM,%UNINSTALL_KEY%,DisplayName,,"IrCOMM2k 1.2.1 " ;HKLM,%UNINSTALL_KEY%,DisplayVersion,,"1.2.1" ;HKLM,%UNINSTALL_KEY%,HelpLink,,"http://www.ircomm2k.de" ;HKLM,%UNINSTALL_KEY%,Publisher,,%JK% ;HKLM,%UNINSTALL_KEY%,UninstallString,0x00020000,"%windir%\IrCOMM2k-Setup.exe" ;[IrCOMM2kSvcAddReg] ;HKR,Parameters,ActiveConnectOnly,REG_DWORD,0x00000000 [IrCOMM2k_DriverEventLog_Inst] AddReg = IrCOMM2k_DriverEventLog_AddReg [IrCOMM2k_DriverEventLog_AddReg] HKR,,EventMessageFile,REG_EXPAND_SZ,"%SystemRoot%\System32\IoLogMsg.dll;%SystemRoot%\System32\drivers\ircomm2k.sys" HKR,,TypesSupported,REG_DWORD,7 [Strings] ; ; Non-Localizable Strings ; REG_SZ = 0x00000000 REG_MULTI_SZ = 0x00010000 REG_EXPAND_SZ = 0x00020000 REG_BINARY = 0x00000001 REG_DWORD = 0x00010001 SERVICEROOT = "System\CurrentControlSet\Services" UNINSTALL_KEY = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\IrCOMM2k" ; ; Localizable Strings ; JK = "Jan Kiszka" JK.DeviceDescIrCOMM = "Virtueller Infrarot-Kommunikationsanschluss" IrCOMM2k.DrvName = "Virtueller Infrarot-Kommunikationsanschluss" ;IrCOMM2k.SvcName = "Virtueller Infrarot-Kommunikationsanschlu, Dienstprogramm" ;IrCOMM2k.SvcDesc = "Bildet ber Infarot einen Kommunikationsanschlu nach." snek-1.1/hosts/windows/Instdrv/NSIS/Contrib/InstDrv/ircomm2k.sys000066400000000000000000000734001353657467200246540ustar00rootroot00000000000000MZ@X !L!This program cannot be run in DOS mode. $)mmmmX4hkllRichmPEL1?  e awg<mq8`.textb h.rdata#@H.datad@PAGENOLK `PAGELOCK//0/ `INIT __ .rsrcmm@B.relocqq@BDispatchCleanup, Channels = 0x%08X Irp = 0x%08X, Status = 0x%08X UHEEMMU MhEE@tAU˜@RuM@E@M@E@M0At@E@PȅuU0AM0AU0AM0AUBE}tcM83E}tLMA UUEHMUEBXMUQ\EXMUXEPMAU`R8 E}tBE@ MM؋U؋BE܋MU؉QXEM܉H\UXE܉MXU؉J}uEǀp@Mǁt@UBlMhUE QM@EMAt@E8APȅuUAMAUAMAUBE}tcM83E}tLMA UUЋEЋHMԋUEЉBXMUԉQ\EXMԉUXEЉPMAUx@R E}tBE@ MMȋUȋBE̋MUȉQXEM̉H\UXẺMXUȉJ}uEǀ@M@UM M@EU@E}tfM83E}tOMA UUEHMċUEBXMUĉQ\EXMĉUXEPMǁ@M@UU Rh' EM;tVUUEMUBEMUEMHUXUEHQURh$ 2ҋM렋]UQEH(MhURE @2ҋM 3]ControlIndicationHandler U E EMMh : EUt EEMt UUEt MMUt E EMQUR68] UjjEP,] UE E}tgjjjjh M}t5UBEMMUB EMQj0REMjh] U !M`QE}u3UB`EMQURjEHQUR8M Mt7U@M@U@REPMQU˜@R@E Et7M0AE0AMAQUREPM@Q@ET} uDUBEEMQUEMHXUEB\MXU EXMAE] UEHHtUBHMAHUBHMAH2]UPE EЋMUԋEHMUBuuMMUUMЃhEۋEЋHM}UЋ@tAMЁ@QЅuEЋ@UЉ@EЋ@UЉ@EH`M܋U܋EJ+HMU;U?EPMQUB MAP UBEMAEUREPMyRE܋HQUR6uDM Mt7UЋ@MЉ@UЁ@REPMQUЁ˜@R@E@MMUBEċMUQXEMĉH\UXEĉMXUJEЋ0AtAUЁ@RuMЋ0AEЉ0AMЋ0AEЉ0AEMQUREH UJQ EHMUJEEEԋM+MMUBEEMQUEMHXUEB\MXU EXMAUЋ0AtAMЁ@QЅuEЋ0AUЉ0AEЋ0AUЉ0AE}uEPMQURE}v }MEЋMHUREPMQMЃhUUE;t>MMUEMQUEMUEBMXM2ҋM븋UЁzl33%PMQ^2] UQ}@vjh/h hEMt@;p@Et@M@Ut@ME;p@v)MUt@+p@@+ȉMh^U@+t@EMQU REt@UD pP Mǁt@UBlEMAlU UU E+EE9Mt@UE;p@v"MUp@+t@EhMQU REt@UD pP Mt@UEt@MQlUEPl] UEEEMQUE MHXU EB\M XU E XMAM 8UU B$t[M 83E}t,M QXUE H\MUEMUQE E H`QE H`QU B`HU B`HE] UE;MtUUEMEMBEMUEMHUXUM83E}tE3]UVWEE PMQ UUhDdk EPjE}t`MQUREPjMQURDE}|1EM;HrUJu }ȃE#MQE_^]UEx@PE}u3cMQ`UEPMUA+BPMQ\@U Ut5EAUAE`APMQURE8AP@E]U E EM@EUBE}uwMQ`UEH UJMEMP+QUEEPMQR@PMQUEP}tMQUREP6BYM@UjMQ`-] %%<tl`llhhhhhhii2iRidi|iiiiiiijj,jJjTjvhjjjjjjk$k0s@@@IrCOMM2k: Read Buffer Overflow! length <= READ_BUF_SIZEd:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\read.cRSDS&KtID:\Projekte\IrCOMM2k\ircomm2k-v2\ircomm2k\objchk_w2K_x86\i386\ircomm2k.pdbEX: Pageable code called at IRQL %d d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\drvmain.cFALSEDispatchCreate, Status = 0x%08X Legende: STATUS_PENDING = 0x%08X STATUS_CANCELLED = 0x%08X UEH(MЃ~7PhtjhhhU BE H`Qt EjjjjEPMQtjEPE"Mǁ@Uǂ@PEMAt EEMAt EEEMQUBP 8Q}uUBEMAjUREPhhhth h0bM UQ2ҋM E]EX: Pageable code called at IRQL %d d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\drvmain.cFALSECommDispatchSystemControl, MinorFunction = 0x%08X, Status = ? (0x%08X) UEH(MU B`Eȃ~7Rh LtjhhHh|M QREHQh U B#M A#U B`$M A`U EH<]EX: Pageable code called at IRQL %d d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\drvmain.cFALSEDispatchQueryInformation, Status = 0x%08X UE H`MЃ~7PhtjhhhU BEHM}t }tlUzs E#SE H MUBEPEHP MAUBE@M AEEUzs E#*E H MUBE @EE MQhU EB2ҋM E]EX: Pageable code called at IRQL %d d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\drvmain.cFALSEDispatchSetInformation, Status = 0x%08X U E H`MЃ~7Php%tjhFhhU BEHM}|}~ EE URhE MH2ҋM E]EX: Pageable code called at IRQL %d d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\drvmain.cFALSEU~7Qhtjhbhh \PT XL TL PQT LLHRT DL @L <L 8L4PT 0L]EX: Pageable code called at IRQL %d d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\pnp.cFALSEPortMode\Device\IrcommPortName\DosDevices\SERIALCOMMUhW~4Qh!=tjjh8!hh!EPhjM QE}}EjURhp!EP}EPEjjjjh M}t#UE;BsMQUEM3҉UUfEhDdk hjE}ujhE@3}fh!EPjMQ fE(UĉUEPj MQUREPMQjjjURhAEPE}}jhMQUB(EMUQEEMUEMUEBMUQEMUUEPj 0QjhUEBDMJHhDdk hjE}u EULUEf@hDdk hjMAUzu EhEPh!MQE}}m@3Uzfh!EPMQUREPMQE}}#UBEPLQURjEPh!jE}}MA\UTRjh|E PPE}}MAXjUTRE}}EPMQUEB MQ EPMU Q@E PMQUBEEMUEHMUEMUQEXE2ҋM븋]IrCOMM: Pageable code called at IRQL %d without lock d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\read.cFALSEIrCOMM2k: CancelQueuedReadIrp, Irp = 0x%08X UEH(MЃ~@=u7PhI\tjhhHIh|IU B%PMhEM QXUE H\MUEMUQMhUE PhIM A 2ҋM ]IrCOMM: Pageable code called at IRQL %d without lock d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\read.cFALSEIrCOMM2k: Read Timout, IRP = 0x%08X UQ~@=u7QhJtjhhJh KEHQhKUztAEH83E}uMhU jM QhUR"MhU ]IrCOMM: Pageable code called at IRQL %d without lock d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\read.cFALSEUE Eȃ~@=u7RhLtjhhHLh|LMhEM@QhЅtMhU\E0AtAU@RuM0AE0AM0AE0AMQUR]IrCOMM: Pageable code called at IRQL %d without lock d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\read.cFALSEUE Eȃ~@=u7RhMtjhhMhMMhEM@QЅtMhU\E@tAU˜@RuM@E@M@E@MQURD]IrCOMM: Pageable code called at IRQL %d without lock d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\read.cFALSEUQ~@=u7QhOtjh^hHOh|OEp@M@raU@+p@EMQUp@MTpRE P Mǁp@UBl+EMAlU UU E+EEMQUp@MTpRE P Mp@UEp@MQl+UEPl] IrCOMM: Pageable code called at IRQL %d without lock d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\read.cFALSEU0EH(M܋U B`Eȃ~@=u7RhPtjhhPhQM AUzu E/M܃hEE܃xM܋U QEHMU܋Bl;EM QEPlM QU܋BlPM Q REPuEM 8FM Q$tEM 83E}tE E@M Q`BM Q`BEPMQU zPMQREPȅU Ut5E܋@U܉@E@PMQURE@P@M Mt7U܋0AM܉0AU܁AREPMQU܁@R@E H`QE H`Q@M 83E}uU B`HU B`HEMA4U BEM AURE H QUREE@hIM QU܃`REM܃hU}tE MH2ҋM E]IrCOMM: Pageable code called at IRQL %d without lock d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\write.cFALSEU(V~==u4QhTtjjhHTh|TMhEjEAPMQ jUœAREP MhUEM M3jhRP MQU؃8u E܃u2^] IrCOMM: Pageable code called at IRQL %d without lock d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\write.cFALSEIrCOMM2k: CancelCurrentWriteIrp, Irp = 0x%08X UEH(MЃ~==u4PhUtjjQhUhUU B%PM QhU豾M@EURh EP]IrCOMM: Pageable code called at IRQL %d without lock d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\write.cFALSEUEHMUB`Eȃ~==u4RhV賽tjjehWhLWMAt@E8APȅuUAMAUAMAUEJ+HU@+M@UR趻MAM@UUE B2ҋM] IrCOMM: Pageable code called at IRQL %d without lock d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\write.cFALSECancelQueuedWriteIrp, Irp = 0x%08X UEH(MU B`Eȃ~@=u7RhpXtjhhXhXM Q%RM@EE HXMU B\EMUEMHUE@+HU􉊄@M@UE PhXfM A 2ҋM ]IrCOMM: Pageable code called at IRQL %d without lock d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\write.cFALSEIrCOMM2k: Write Timout, IRP = 0x%08X U E Eȃ~@=u7RhZotjhhHZh|ZM@EM8AQEЅtM@UqEHQhZUztBEH83E}uM@UMQhURM@U]IrCOMM: Pageable code called at IRQL %d without lock d:\projekte\ircomm2k\ircomm2k-v2\ircomm2k\write.cFALSEU4EH(M̋U B`Eȃ~@=u7Rh[Ӹtjhh[h,\M AḾ@EŨzE̋M HM 80VU B$tdM 83EЃ}tE MA5EU B`HU B`HM̋@EPM̉@U B E؋MQUEEPM̋QR@PM QUE PMMԁ}UREM P+QREPEM MuUu}toE Et7M̋AẺAḾ`AQUREPḾ8AQ@U B`HU B`HM+MU@Ẻ@M UBAEMA UBjh XRH\=\u E3 XL TLPPT LL HQT DL @L <L 8L4RT 0LEċ]dgRlTgltl`llhhhhhhii2iRidi|iiiiiiijj,jJjTjvhjjjjjjk$k ProductVersion2.0.0-alpha8DVarFileInfo$TranslationPv55536737S77u8889&9y999:::::::;;;;<<%==>|>>X??)0u0z000'111@2Y2!3Y3s333m4444A5X5^5q9999999:.:5:::@:::::::;;;<<#<)<=U>??(?E?J?P??? @50C0L0i0n0t0y000000000000000000000011122*2/252J2f222222223(343P3^3{33333344)4b444444455?5I5p55555!6T6d6t6}666666667,77778 88$8*8[8b8i8o8888888899\:j:s::::::::;(;-;3;I;;;;;&<<<<<<<<<<====> >>(>H>~>???????000#0(0.040;0J0O0l0a1o1x1111111,2322244-4]4x4444 55955555 66!6I6666(7K7777x8~888:::;|====}>>2?????@00 000000#0'0+0/030700000000q11111111112222222333i333{44444446677.73797F7O7c7!8/888A8^8c8i88889999:::&:2:g:p::F;T;];f;;;;;;;;<<<<<<<<=:=>,>5>>>[>`>f>r>>>???????P"0r0J1X1a1j11111)2/2H22)3O33334444444455-5A6O6X6a6{666666z77777777N8b8*989A9J9g9l9r99999::::::;;;@;N;p;;;Zx>>>`1112!242G2Z2a2o2}222222222222222333*373D3N3X3^3b3g3l3s3y33333333)4/4s4y4445 5"5'5.53595~555555555?6E6W6]6d6i6o66666666666666666666677snek-1.1/hosts/windows/Instdrv/NSIS/Includes/000077500000000000000000000000001353657467200211425ustar00rootroot00000000000000snek-1.1/hosts/windows/Instdrv/NSIS/Includes/java.nsh000066400000000000000000000050701353657467200225770ustar00rootroot00000000000000!include WordFunc.nsh ; Definitions for Java Detection !define JAVA_VERSION "6.0" Function GetFileVersion !define GetFileVersion `!insertmacro GetFileVersionCall` !macro GetFileVersionCall _FILE _RESULT Push `${_FILE}` Call GetFileVersion Pop ${_RESULT} !macroend Exch $0 Push $1 Push $2 Push $3 Push $4 Push $5 Push $6 ClearErrors GetDllVersion '$0' $1 $2 IfErrors error IntOp $3 $1 >> 16 IntOp $3 $3 & 0x0000FFFF IntOp $4 $1 & 0x0000FFFF IntOp $5 $2 >> 16 IntOp $5 $5 & 0x0000FFFF IntOp $6 $2 & 0x0000FFFF StrCpy $0 '$3.$4.$5.$6' goto end error: SetErrors StrCpy $0 '' end: Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 FunctionEnd Function openLinkNewWindow Push $3 Exch Push $2 Exch Push $1 Exch Push $0 Exch ReadRegStr $1 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.html\UserChoice" "Progid" IfErrors iexplore Goto foundbrowser iexplore: StrCpy $1 "IE.AssocFile.HTM" foundbrowser: StrCpy $2 "\shell\open\command" StrCpy $3 $1$2 ReadRegStr $0 HKCR $3 "" # Get browser path DetailPrint $0 StrCpy $2 '"' StrCpy $1 $0 1 StrCmp $1 $2 +2 # if path is not enclosed in " look for space as final char StrCpy $2 ' ' StrCpy $3 1 loop: StrCpy $1 $0 1 $3 DetailPrint $1 StrCmp $1 $2 found StrCmp $1 "" found IntOp $3 $3 + 1 Goto loop found: StrCpy $1 $0 $3 StrCmp $2 " " +2 StrCpy $1 '$1"' Pop $0 Exec '$1 $0' Pop $0 Pop $1 Pop $2 Pop $3 FunctionEnd !macro _OpenURL URL Push "${URL}" Call openLinkNewWindow !macroend !define OpenURL '!insertmacro "_OpenURL"' Function DoDetectJRE DetailPrint "Desired Java version ${JAVA_VERSION}" SearchPath $0 javaw.exe IfErrors no DetailPrint "Detected java in $0" ${GetFileVersion} "$0" $1 IfErrors no DetailPrint "Java version $1" ${VersionCompare} $1 ${JAVA_VERSION} $2 IntCmp $2 1 yes yes old yes: StrCpy $0 2 Goto done old: StrCpy $0 1 Goto done no: StrCpy $0 0 Goto done done: FunctionEnd var dialog var hwnd var null var install var quit var skip Function GetJRE ${OpenURL} "java.com" MessageBox MB_OK "Click OK to continue after completing the Java Install." FunctionEnd Function DetectJRE Call DoDetectJRE IntCmp $0 1 ask_old ask_no yes ask_no: StrCpy $0 "Cannot find Java. Download and install?" Goto ask ask_old: StrCpy $0 "Java version appears to be too old. Download and install?" Goto ask ask: MessageBox MB_YESNOCANCEL $0 IDYES do_java IDNO skip_java do_java: Call GetJRE skip_java: yes: FunctionEnd snek-1.1/hosts/windows/Instdrv/NSIS/Includes/refresh-sh.nsh000066400000000000000000000007471353657467200237320ustar00rootroot00000000000000!define SHCNE_ASSOCCHANGED 0x08000000 !define SHCNF_IDLIST 0 Function RefreshShellIcons ; By jerome tremblay - april 2003 ${DisableX64FSRedirection} System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (${SHCNE_ASSOCCHANGED}, ${SHCNF_IDLIST}, 0, 0)' FunctionEnd Function un.RefreshShellIcons ; By jerome tremblay - april 2003 ${DisableX64FSRedirection} System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (${SHCNE_ASSOCCHANGED}, ${SHCNF_IDLIST}, 0, 0)' FunctionEnd snek-1.1/hosts/windows/Instdrv/NSIS/Plugins/000077500000000000000000000000001353657467200210155ustar00rootroot00000000000000snek-1.1/hosts/windows/Instdrv/NSIS/Plugins/InstDrv.dll000066400000000000000000000150001353657467200230770ustar00rootroot00000000000000MZ@ !L!This program cannot be run in DOS mode. $or+!+!+!+! !r! !-!*!Ԥ!*!Rich+!PELDV^?!  t P$ x@$ .text   `.rdata @@.data0@.relocv@@BD$ Hv)HD$S؊ыW|$ fʃ_[3ÊD$<0| <90}_^[]UQQSV5X 3W}]u PHuT t_EPEuSPju uօu34 zEutS8 uj@< ؅t5뺃 u#h4SD t 4 EetS8 E_^[UVu uju ` uu4 -EMWQ!P6 t6\ _^]ËD$V@0D$D0D$0H0VY$`0VYYuV@$0lY^h4jVVhP0L0=^áD0Vt)0t#FPt$ ,  D0V0 3^jX^Ã=D0t9@0VPj@ 5@0t$ FP$ D0D00^U,E V@0E3D0E95L0H0uh0,EjPEPE Ph4h`0u^t h0\Y=EFPEPu tu \ VEh0P EP^U,E S@0E3ۣD0E9L0VWH0uh0Yu`0VL u 4 P`EEPjuSV4VWl t-V @@PVEjPWh tEPWjd u4 W\ SEh(0P EPG_^[UE V@0ED0E0H0V=L0Yu h0YdE PjVh4u'u$4 PEh(0P EP(u Eh0P EPh00^U`W39=L0uh0yYUSEWPEPEPh4h`0WF؃; EjPup u 4 VPWEjPuDž | u 4 WVPPEPux 54 u ֋؃zuh3ۍP=@ YPׅtBP Ev1h<0P, PfYPׅu֋؍EjPut ^u\ SEh(0P EP"[_UXE S@0E3ۣD0E9L0V]H0uh0YESPEPE Ph4h`0S;EW=d Pu jׅt]9]Dž(u*PEPu P tftEEPEPu ;uEPu j4 u \ ;_t&tVEh(0P EP(uEh0P EPh00^[U,E V@0ED0E0WVH0s3$?WW ;ljEu4 E SjVP ;u 4 E {WWS t^5 EPSօtM}u;u}( EPSօt;}rރ}uEu$E 4 E }ue 4 E S u [u Eh(0P EP_^U,E V@0ED0E0H0V`$?jj E u 4 SWj$VP  u 4 bEPjW u 4 D}u3uu( EPW t;us 4  u }u3Wu _[VEh(0P EP^jX % "~"h"R"""! "!$"!!!!!"!#4$"" #,#D#`##$###:"d$(!," !F" !" X!V$L !$ "~"h"R"""! "!$"!!!!!"!#4$"" #,#D#`##$###:"d$/lstrcmpiALocalAllocLocalFree0GetLastErrorGlobalFree2lstrcpyA5lstrcpynAGlobalAlloc8lstrlenA_DeleteFileASleepKERNEL32.dllwsprintfAUSER32.dll:CloseServiceHandleQueryServiceStatusStartServiceAoOpenServiceAmOpenSCManagerA=ControlServiceADVAPI32.dll=SetupDiEnumDeviceInfo^SetupDiGetDeviceRegistryPropertyA:SetupDiDestroyDeviceInfoListJSetupDiGetClassDevsASetupDiCallClassInstallerSetupDiSetDeviceRegistryPropertyA,SetupDiCreateDeviceInfoA-SetupDiCreateDeviceInfoList;SetupDiDestroyDriverInfoList`SetupDiGetDriverInfoDetailA?SetupDiEnumDriverInfoASetupDiBuildDriverInfoListWSetupDiGetDeviceInstallParamsASETUPAPI.dll UpdateDriverForPlugAndPlayDevicesAnewdev.dllDV^?%$$%$"g{$%1%>%P%`%n%%%InstDrv.dllCountDevicesCreateDeviceDeleteOemInfFilesInitDriverSetupInstallDriverRemoveAllDevicesStartSystemServiceStopSystemServiceInvalid GUID!%d0Fatal error!%08X00000000pnf$11111122"2?2O2{222222222233%303?3G3T3Z3j3o3x3333333334 44/494B4I4P4c4j4w4444444444 5555*535G5Y5b5i555555556 6>6H6j6p66666667707:7C7L7S7p7u7778 8"8)8B8I8W8r8z8888888889,9A9K9T9`9g999999999999: :1:Z:a:|:snek-1.1/hosts/windows/Makefile000066400000000000000000000040321353657467200166260ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_ROOT=../.. SNEK_LOCAL_SRC = \ snek-windows.c \ $(SNEK_ROOT)/snek-math.c SNEK_LOCAL_INC = snek-windows.h SNEK_LOCAL_BUILTINS = snek-windows.builtin $(SNEK_ROOT)/snek-math.builtin INF=altusmetrum.inf WINDOWS_FILES=snek.exe snek.ico snekde.py $(SNEK_ROOT)/doc/snek.pdf $(SNEK_ROOT)/examples $(SNEK_ROOT)/COPYING $(FIRMWARE) $(USBFIRMWARE) $(INF) include $(SNEK_ROOT)/snek-install.defs WINDOWS_INSTALL=build/nsis/snek-windows-$(SNEK_VERSION_DASH).exe CC=i686-w64-mingw32-gcc MINGFLAGS=-Wall -Wextra -mconsole OPT=-O0 CFLAGS=$(OPT) -g -I. $(SNEK_CFLAGS) $(MINGFLAGS) LIBS=-lm all: $(WINDOWS_INSTALL) $(WINDOWS_INSTALL): $(WINDOWS_FILES) snek.cfg pynsist snek.cfg snek.cfg: snek.cfg.in $(SNEK_ROOT)/snek-install.defs $(SNEK_ROOT)/snek.defs for i in $(FIRMWARE); do echo " $$i"; done | sed '/@SNEK_FIRMWARE@/r /dev/stdin' snek.cfg.in | sed '/@SNEK_FIRMWARE/d' | $(SNEK_SED) > $@ snek.exe: $(SNEK_OBJ) $(CC) $(CFLAGS) -o $@ $(SNEK_OBJ) $(LIBS) vpath %.svg $(SNEK_ROOT) snekde.py: $(SNEK_ROOT)/snekde/snekde.py cp $^ $@ .SUFFIXES: .svg .build .icns .ico .rc .o .exe .svg.build: for i in $(RES); do rsvg-convert -w $$i -h $$i -o $*-$$i.png $^; done && touch $@ .build.ico: icotool -c -o $@ $(shell for i in $(RES); do echo $*-$$i.png; done) .ico.rc: ./make-rc "$*" $(VERSION) > $@ RES=16 24 32 48 64 72 96 128 180 256 install: echo install done upload: $(WINDOWS_INSTALL) rsync -avz $(WINDOWS_INSTALL) $(SNEKDIST) clean:: rm -f snek.exe snek.ico snekde.py snek.cfg snek-*.png rm -rf build snek-1.1/hosts/windows/altusmetrum.cat000066400000000000000000000200621353657467200202420ustar00rootroot000000000000000 . *H  0 1 0 +0 +7 00  +7 7N62 140617065241Z0 +7 00RC06E5581C4444EBEBEF02BEE1917E11E2AFA02C11/0> +7 100. OSAttr2:6.1,2:6.20B +7 1402File altusmetrum.inf0E +717050 +70!0 +nUDN+*0b +7 1T0RL{DE351A42-8E59-11D0-8C47-00C04FC295EE}00F +7 806OS(7X86,7X64,8X86,8X640R +7 D0B HWID21,usb\vid_fffe&pid_002c0R +7 D0B HWID20,usb\vid_fffe&pid_002b0R +7 D0B HWID19,usb\vid_fffe&pid_002a0R +7 D0B HWID18,usb\vid_fffe&pid_00290R +7 D0B HWID17,usb\vid_fffe&pid_00280R +7 D0B HWID16,usb\vid_fffe&pid_00270R +7 D0B HWID15,usb\vid_fffe&pid_00260R +7 D0B HWID14,usb\vid_fffe&pid_00250R +7 D0B HWID13,usb\vid_fffe&pid_00240R +7 D0B HWID12,usb\vid_fffe&pid_00230R +7 D0B HWID11,usb\vid_fffe&pid_00130R +7 D0B HWID10,usb\vid_fffe&pid_00120P +7 B0@ HWID9,usb\vid_fffe&pid_00110P +7 B0@ HWID8,usb\vid_fffe&pid_00100P +7 B0@ HWID7,usb\vid_fffe&pid_000f0P +7 B0@ HWID6,usb\vid_fffe&pid_000e0P +7 B0@ HWID5,usb\vid_fffe&pid_000d0P +7 B0@ HWID4,usb\vid_fffe&pid_000c0P +7 B0@ HWID3,usb\vid_fffe&pid_000b0H +7 :08 HWID2$altusmetrumserial0P +7 B0@ HWID1,usb\vid_fffe&pid_000a00W~|NYKw;0  *H 01 0 UZA10U Western Cape10U Durbanville10 U Thawte10U Thawte Certification10UThawte Timestamping CA0 121221000000Z 201230235959Z0^1 0 UUS10U Symantec Corporation100.U'Symantec Time Stamping Services CA - G20"0  *H 0 ITK %y"W*oܸ&Csk¿.PZvC%CE{t"״MD$k_E;DCsi+˙r&Mq1QaSI,xE/W?=ƒJ{3y uAQlie)`; tޒ"t|'JÞ-'}aqPK],e ؖ|NHDD h]jxdE`F~T|yq00U_n\t}?L.02+&0$0"+0http://ocsp.thawte.com0U00?U8060420.http://crl.thawte.com/ThawteTimestampingCA.crl0U% 0 +0U0(U!0010UTimeStamp-2048-10  *H  yY0h O]7_R DnmX|0i#s oG9*ÎY M1\*zzWLey@b%n7j!AW?wI*^8j"Q~0085njP0  *H 0^1 0 UUS10U Symantec Corporation100.U'Symantec Time Stamping Services CA - G20 121018000000Z 201229235959Z0b1 0 UUS10U Symantec Corporation1402U+Symantec Time Stamping Services Signer - G40"0  *H 0 c 9D#DIa Sۭ,Jn"hcSit<üu00ϠpOT0`u0  *H 01 0 UUS1 0 UUT10USalt Lake City10U The USERTRUST Network1!0U http://www.usertrust.com10UUTN-USERFirst-Object0 110824000000Z 200530104838Z0{1 0 UGB10UGreater Manchester10USalford10U COMODO CA Limited1!0UCOMODO Code Signing CA 20"0  *H 0 (@h7?7GLnGuDM-G0  *H 0{1 0 UGB10UGreater Manchester10USalford10U COMODO CA Limited1!0UCOMODO Code Signing CA 20 140617000000Z 150617235959Z01 0 UUS10 U 809081 0 U CO10U Black Forest10U 4390 Darr Circle10U Altus Metrum, LLC10U Altus Metrum, LLC0"0  *H 0 q|rAA0Ng!GWg^}LOlE{<>z98PInnWH.{^i?X Sv]b;At^RXBWuAv}DS2EV!TX&U8\@8j2rIۛD|âč"IY\ ,!}IAWu!6"$/dD*ym)\Qش%_nyXYI76L 9%300U#0ű,}h|% ?0Use(2;$(mX0U0 U00U% 0 +0 `HB0FU ?0=0; +10+0)+https://secure.comodo.net/CPS0AU:0806420http://crl.comodoca.com/COMODOCodeSigningCA2.crl0r+f0d0<+00http://crt.comodoca.com/COMODOCodeSigningCA2.crt0$+0http://ocsp.comodoca.com0U0keithp@keithp.com0  *H kd>Lse;Ct#9?TS9xV׹TPQƣF#SH J꙰R>򮇍X6tLc1Ne$VZ4]y^ϴ6/=W,X*7.Q*ϲ"@ ؾG(Jig x v[S1.n5趰] uWԨ"oOӈRJv4⥪%OAL&f180400{1 0 UGB10UGreater Manchester10USalford10U COMODO CA Limited1!0UCOMODO Code Signing CA 2ߴF>-G0 +o0 +7 100 *H  1  +7 0 +7 10  +70# *H  1_aey@9MT:0  *H V#.[L-Lҍztsn( ^>'DoB6'rDV٭MroL3:v O rRrG:n!PxۺͩD &鑰w7ucw)!beU;PDRwUA;T}h0Cri?5qy^\N9\gq@$L }[1U 27Q 0 *H  100r0^1 0 UUS10U Symantec Corporation100.U'Symantec Time Stamping Services CA - G285njP0 +]0 *H  1  *H 0 *H  1 140617065519Z0# *H  1r= E.YVSR0  *H <oiVMp޾3I%t¦ RcۭoB@)><K̖@ӜȽNzK` X%MRܺĦ(?r9"Fx/ X|PRȆ ,b` 柑nu$E[ŏE锒"Qu(K9{Rjġӣ13/,u(|rS';VG0z[2s@A@y zbsnek-1.1/hosts/windows/altusmetrum.inf000077500000000000000000000221121353657467200202500ustar00rootroot00000000000000; ; Copyright © 2019 Keith Packard ; ; 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, write to the Free Software Foundation, Inc., ; 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. ; [Version] Signature = "$Windows NT$" Class = Modem ClassGUID = {4D36E96D-E325-11CE-BFC1-08002BE10318} Provider = %Mfg% DriverVer = 06/15/2014,7.1.1.0 PnpLockDown = 0 DriverPackageDisplayName = %DriverName% CatalogFile = altusmetrum.cat [DestinationDirs] FakeModemCopyFileSection = 12 DefaultDestDir = 12 [ControlFlags] [Manufacturer] %Mfg% = Models, NTx86, NTamd64, NTia64 [Models] %AltusMetrum% = AltusMetrum.Install, USB\VID_FFFE&PID_000A, AltusMetrumSerial %TeleMetrum% = AltusMetrum.Install, USB\VID_FFFE&PID_000B, AltusMetrumSerial %TeleDongle% = AltusMetrum.Install, USB\VID_FFFE&PID_000C, AltusMetrumSerial %TeleTerra% = AltusMetrum.Install, USB\VID_FFFE&PID_000D, AltusMetrumSerial %TeleBT% = AltusMetrum.Install, USB\VID_FFFE&PID_000e, AltusMetrumSerial %TeleLaunch% = AltusMetrum.Install, USB\VID_FFFE&PID_000f, AltusMetrumSerial %TeleLCO% = AltusMetrum.Install, USB\VID_FFFE&PID_0010, AltusMetrumSerial %TeleScience% = AltusMetrum.Install, USB\VID_FFFE&PID_0011, AltusMetrumSerial %TelePyro% = AltusMetrum.Install, USB\VID_FFFE&PID_0012, AltusMetrumSerial %TeleShield% = AltusMetrum.Install, USB\VID_FFFE&PID_0013, AltusMetrumSerial %TeleMega% = AltusMetrum.Install, USB\VID_FFFE&PID_0023, AltusMetrumSerial %MegaDongle = AltusMetrum.Install, USB\VID_FFFE&PID_0024, AltusMetrumSerial %TeleGPS% = AltusMetrum.Install, USB\VID_FFFE&PID_0025, AltusMetrumSerial %EasyMini% = AltusMetrum.Install, USB\VID_FFFE&PID_0026, AltusMetrumSerial %TeleMini% = AltusMetrum.Install, USB\VID_FFFE&PID_0027, AltusMetrumSerial %AltusMetrum28% = AltusMetrum.Install, USB\VID_FFFE&PID_0028, AltusMetrumSerial %AltusMetrum29% = AltusMetrum.Install, USB\VID_FFFE&PID_0029, AltusMetrumSerial %AltusMetrum2a% = AltusMetrum.Install, USB\VID_FFFE&PID_002a, AltusMetrumSerial %AltusMetrum2b% = AltusMetrum.Install, USB\VID_FFFE&PID_002b, AltusMetrumSerial %AltusMetrum2c% = AltusMetrum.Install, USB\VID_FFFE&PID_002c, AltusMetrumSerial [Models.NTx86] %AltusMetrum% = AltusMetrum.Install, USB\VID_FFFE&PID_000A, AltusMetrumSerial %TeleMetrum% = AltusMetrum.Install, USB\VID_FFFE&PID_000B, AltusMetrumSerial %TeleDongle% = AltusMetrum.Install, USB\VID_FFFE&PID_000C, AltusMetrumSerial %TeleTerra% = AltusMetrum.Install, USB\VID_FFFE&PID_000D, AltusMetrumSerial %TeleBT% = AltusMetrum.Install, USB\VID_FFFE&PID_000e, AltusMetrumSerial %TeleLaunch% = AltusMetrum.Install, USB\VID_FFFE&PID_000f, AltusMetrumSerial %TeleLCO% = AltusMetrum.Install, USB\VID_FFFE&PID_0010, AltusMetrumSerial %TeleScience% = AltusMetrum.Install, USB\VID_FFFE&PID_0011, AltusMetrumSerial %TelePyro% = AltusMetrum.Install, USB\VID_FFFE&PID_0012, AltusMetrumSerial %TeleShield% = AltusMetrum.Install, USB\VID_FFFE&PID_0013, AltusMetrumSerial %TeleMega% = AltusMetrum.Install, USB\VID_FFFE&PID_0023, AltusMetrumSerial %MegaDongle = AltusMetrum.Install, USB\VID_FFFE&PID_0024, AltusMetrumSerial %TeleGPS% = AltusMetrum.Install, USB\VID_FFFE&PID_0025, AltusMetrumSerial %EasyMini% = AltusMetrum.Install, USB\VID_FFFE&PID_0026, AltusMetrumSerial %TeleMini% = AltusMetrum.Install, USB\VID_FFFE&PID_0027, AltusMetrumSerial %AltusMetrum28% = AltusMetrum.Install, USB\VID_FFFE&PID_0028, AltusMetrumSerial %AltusMetrum29% = AltusMetrum.Install, USB\VID_FFFE&PID_0029, AltusMetrumSerial %AltusMetrum2a% = AltusMetrum.Install, USB\VID_FFFE&PID_002a, AltusMetrumSerial %AltusMetrum2b% = AltusMetrum.Install, USB\VID_FFFE&PID_002b, AltusMetrumSerial %AltusMetrum2c% = AltusMetrum.Install, USB\VID_FFFE&PID_002c, AltusMetrumSerial [Models.NTamd64] %AltusMetrum% = AltusMetrum.Install, USB\VID_FFFE&PID_000A, AltusMetrumSerial %TeleMetrum% = AltusMetrum.Install, USB\VID_FFFE&PID_000B, AltusMetrumSerial %TeleDongle% = AltusMetrum.Install, USB\VID_FFFE&PID_000C, AltusMetrumSerial %TeleTerra% = AltusMetrum.Install, USB\VID_FFFE&PID_000D, AltusMetrumSerial %TeleBT% = AltusMetrum.Install, USB\VID_FFFE&PID_000e, AltusMetrumSerial %TeleLaunch% = AltusMetrum.Install, USB\VID_FFFE&PID_000f, AltusMetrumSerial %TeleLCO% = AltusMetrum.Install, USB\VID_FFFE&PID_0010, AltusMetrumSerial %TeleScience% = AltusMetrum.Install, USB\VID_FFFE&PID_0011, AltusMetrumSerial %TelePyro% = AltusMetrum.Install, USB\VID_FFFE&PID_0012, AltusMetrumSerial %TeleShield% = AltusMetrum.Install, USB\VID_FFFE&PID_0013, AltusMetrumSerial %TeleMega% = AltusMetrum.Install, USB\VID_FFFE&PID_0023, AltusMetrumSerial %MegaDongle = AltusMetrum.Install, USB\VID_FFFE&PID_0024, AltusMetrumSerial %TeleGPS% = AltusMetrum.Install, USB\VID_FFFE&PID_0025, AltusMetrumSerial %EasyMini% = AltusMetrum.Install, USB\VID_FFFE&PID_0026, AltusMetrumSerial %TeleMini% = AltusMetrum.Install, USB\VID_FFFE&PID_0027, AltusMetrumSerial %AltusMetrum28% = AltusMetrum.Install, USB\VID_FFFE&PID_0028, AltusMetrumSerial %AltusMetrum29% = AltusMetrum.Install, USB\VID_FFFE&PID_0029, AltusMetrumSerial %AltusMetrum2a% = AltusMetrum.Install, USB\VID_FFFE&PID_002a, AltusMetrumSerial %AltusMetrum2b% = AltusMetrum.Install, USB\VID_FFFE&PID_002b, AltusMetrumSerial %AltusMetrum2c% = AltusMetrum.Install, USB\VID_FFFE&PID_002c, AltusMetrumSerial [Models.NTia64] %AltusMetrum% = AltusMetrum.Install, USB\VID_FFFE&PID_000A, AltusMetrumSerial %TeleMetrum% = AltusMetrum.Install, USB\VID_FFFE&PID_000B, AltusMetrumSerial %TeleDongle% = AltusMetrum.Install, USB\VID_FFFE&PID_000C, AltusMetrumSerial %TeleTerra% = AltusMetrum.Install, USB\VID_FFFE&PID_000D, AltusMetrumSerial %TeleBT% = AltusMetrum.Install, USB\VID_FFFE&PID_000e, AltusMetrumSerial %TeleLaunch% = AltusMetrum.Install, USB\VID_FFFE&PID_000f, AltusMetrumSerial %TeleLCO% = AltusMetrum.Install, USB\VID_FFFE&PID_0010, AltusMetrumSerial %TeleScience% = AltusMetrum.Install, USB\VID_FFFE&PID_0011, AltusMetrumSerial %TelePyro% = AltusMetrum.Install, USB\VID_FFFE&PID_0012, AltusMetrumSerial %TeleShield% = AltusMetrum.Install, USB\VID_FFFE&PID_0013, AltusMetrumSerial %TeleMega% = AltusMetrum.Install, USB\VID_FFFE&PID_0023, AltusMetrumSerial %MegaDongle = AltusMetrum.Install, USB\VID_FFFE&PID_0024, AltusMetrumSerial %TeleGPS% = AltusMetrum.Install, USB\VID_FFFE&PID_0025, AltusMetrumSerial %EasyMini% = AltusMetrum.Install, USB\VID_FFFE&PID_0026, AltusMetrumSerial %TeleMini% = AltusMetrum.Install, USB\VID_FFFE&PID_0027, AltusMetrumSerial %AltusMetrum28% = AltusMetrum.Install, USB\VID_FFFE&PID_0028, AltusMetrumSerial %AltusMetrum29% = AltusMetrum.Install, USB\VID_FFFE&PID_0029, AltusMetrumSerial %AltusMetrum2a% = AltusMetrum.Install, USB\VID_FFFE&PID_002a, AltusMetrumSerial %AltusMetrum2b% = AltusMetrum.Install, USB\VID_FFFE&PID_002b, AltusMetrumSerial %AltusMetrum2c% = AltusMetrum.Install, USB\VID_FFFE&PID_002c, AltusMetrumSerial ;---------------------------------------------------------------------------- ; Installation sections ;---------------------------------------------------------------------------- [AltusMetrum.Install.NT] include = mdmcpq.inf CopyFiles = FakeModemCopyFileSection AddReg = All.AddReg, Modem.AddReg, Uninstall.AddReg [AltusMetrum.Install.NT.Services] include = mdmcpq.inf AddService = usbser, 0x00000000, LowerFilter_Service_Inst [AltusMetrum.Install.NT.HW] include = mdmcpq.inf AddReg = LowerFilterAddReg ;---------------------------------------------------------------------------- ; AddReg sections ;---------------------------------------------------------------------------- [All.AddReg] HKR,,FriendlyDriver,, Unimodem.vxd HKR,,DevLoader,, *vcomm HKR,,ConfigDialog,, modemui.dll HKR,,EnumPropPages,, "modemui.dll,EnumPropPages" HKR,,PortSubClass, 1, 02 HKR,,DeviceType, 1, 01 [Modem.AddReg] HKR,, Properties, 1, C0,01,00,00, 00,00,00,00, FF,00,00,00, 07,00,00,00, 0F,00,00,00, F7,0F,00,00, 00,84,03,00, C0,DA,00,00 [Uninstall.AddReg] HKLM,Software\Microsoft\Windows\CurrentVersion\Uninstall\%AltusMetrum%,DisplayName,,"%AltusMetrum%" [Strings] Mfg = "altusmetrum.org" AltusMetrum = "AltusMetrum" TeleMetrum = "TeleMetrum" TeleDongle = "TeleDongle" TeleTerra = "TeleTerra" TeleBT = "TeleBT" TeleLaunch = "TeleLaunch" TeleLCO = "TeleLCO" TeleScience = "TeleScience" TelePyro = "TelePyro" TeleShield = "TeleShield" TeleMega = "TeleMega" MegaDongle = "MegaDongle" TeleGPS = "TeleGPS" EasyMini = "EasyMini" TeleMini = "TeleMini" AltusMetrum28 = "AltusMetrum28" AltusMetrum29 = "AltusMetrum29" AltusMetrum2a = "AltusMetrum2a" AltusMetrum2b = "AltusMetrum2b" AltusMetrum2c = "AltusMetrum2c" DriverName = "Altus Metrum Device Driver" snek-1.1/hosts/windows/pyapp_snek.nsi000066400000000000000000000013471353657467200200600ustar00rootroot00000000000000[% extends "pyapp_msvcrt.nsi" %] [% block ui_pages %] !addplugindir ../../Instdrv/NSIS/Plugins !addincludedir ../../Instdrv/NSIS/Includes !include x64.nsh [[ super() ]] [% endblock %] [% block install_files %] [[ super() ]] ; Install driver bits InstDrv::InitDriverSetup /NOUNLOAD {4D36E96D-E325-11CE-BFC1-08002BE10318} AltusMetrumSerial InstDrv::DeleteOemInfFiles /NOUNLOAD InstDrv::CreateDevice /NOUNLOAD ${DisableX64FSRedirection} IfFileExists $WINDIR\System32\PnPutil.exe 0 nopnp ${DisableX64FSRedirection} nsExec::ExecToLog '"$WINDIR\System32\PnPutil.exe" -i -a "$INSTDIR\altusmetrum.inf"' Goto donedrv nopnp: InstDrv::InstallDriver /NOUNLOAD "$INSTDIR\altusmetrum.inf" donedrv: [% endblock %] snek-1.1/hosts/windows/snek-windows.builtin000066400000000000000000000012151353657467200212060ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # exit, 1 time.sleep, 1 time.monotonic, 0 random.seed, 0 random.randrange, 1 #include "snek-windows.h" snek-1.1/hosts/windows/snek-windows.c000066400000000000000000000054771353657467200200000ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include "snek.h" #include "snek-windows.h" #include #include FILE *snek_windows_input; static const struct option options[] = { { .name = "version", .has_arg = 0, .val = 'v' }, { .name = "help", .has_arg = 0, .val = '?' }, { 0 }, }; static void usage (char *program, int val) { fprintf(stderr, "usage: %s [--version] [--help] \n", program); exit(val); } #define MAX_LINE 4096 static int snek_getc_interactive(void) { static bool midline; int c; if (!midline) { char *prompt = "> "; if (snek_parse_middle) prompt = "+ "; fputs(prompt, stdout); midline = true; } c = getchar(); if (c == '\n') midline = false; return c; } int snek_getc(FILE *input) { if (snek_interactive) return snek_getc_interactive(); return getc(input); } int main (int argc, char **argv) { int c; while ((c = getopt_long(argc, argv, "v?", options, NULL)) != -1) { switch (c) { case 'v': printf("%s version %s\n", argv[0], SNEK_VERSION); exit(0); break; case '?': usage(argv[0], 0); break; default: usage(argv[0], 1); break; } } if (argv[optind]) { snek_file = argv[optind]; snek_windows_input = fopen(snek_file, "r"); if (!snek_windows_input) { perror(snek_file); exit(1); } } else { snek_windows_input = stdin; snek_interactive = true; printf("Welcome to Snek version %s\n", SNEK_VERSION); } snek_init(); bool ret = snek_parse() == snek_parse_success; if (snek_windows_input == stdin) printf("\n"); return ret ? 0 : 1; } snek_poly_t snek_builtin_exit(snek_poly_t a) { int ret; switch (snek_poly_type(a)) { case snek_float: ret = (int) snek_poly_to_float(a); break; default: ret = snek_poly_true(a) ? 0 : 1; break; } exit(ret); } snek_poly_t snek_builtin_time_sleep(snek_poly_t a) { if (snek_poly_type(a) == snek_float) { float delay = snek_poly_to_float(a); float ms = floorf(delay * 1000 + 0.5); Sleep((DWORD) ms); } return SNEK_NULL; } snek_poly_t snek_builtin_time_monotonic(void) { return snek_float_to_poly(GetTickCount() / 1000.0f); } snek_poly_t snek_builtin_random_seed(void) { srand(GetTickCount()); return SNEK_NULL; } snek_poly_t snek_builtin_random_randrange(snek_poly_t a) { return snek_float_to_poly(rand() % (long int) snek_poly_get_float(a)); } snek-1.1/hosts/windows/snek-windows.h000066400000000000000000000014311353657467200177670ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #ifndef _SNEK_WINDOWS_H_ #define _SNEK_WINDOWS_H_ extern FILE *snek_windows_input; int snek_getc(FILE *input); #define SNEK_GETC() snek_getc(snek_windows_input) #define isnanf(x) __isnanf(x) #endif /* _SNEK_WINDOWS_H_ */ snek-1.1/hosts/windows/snek.cfg.in000066400000000000000000000007551353657467200172240ustar00rootroot00000000000000[Application] name=Snek Development Environment version=@SNEK_VERSION@ script=snekde.py icon=snek.ico console=true [Shortcut Snek] target=$INSTDIR\snek.exe console=true icon=snek.ico [Python] version=3.7.0 [Include] pypi_wheels=windows-curses==1.0 packages=serial files =@SNEK_ROOT@/COPYING @SNEK_ROOT@/doc/snek.pdf @SNEK_FIRMWARE@ @SNEK_ROOT@/examples snek.exe altusmetrum.inf altusmetrum.cat [Build] installer_name=snek-windows-@SNEK_VERSION_DASH@.exe nsi_template=pyapp_snek.nsi snek-1.1/ports/000077500000000000000000000000001353657467200135045ustar00rootroot00000000000000snek-1.1/ports/crickit/000077500000000000000000000000001353657467200151345ustar00rootroot00000000000000snek-1.1/ports/crickit/.gitignore000066400000000000000000000000511353657467200171200ustar00rootroot00000000000000*.bin *.map *.uf2 *.elf *.o ao-product.h snek-1.1/ports/crickit/Makefile000066400000000000000000000023751353657467200166030ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_ROOT = ../.. SNEK_SAMD21 = $(SNEK_ROOT)/chips/samd21 PROGNAME=snek-crickit PRODUCT_NAME=SnekCrickit IDPRODUCT=0x002c IDVENDOR=0xfffe include $(SNEK_SAMD21)/snek-samd21.defs SNEK_LOCAL_SRC = \ $(SNEK_SAMD21_SRC) SNEK_LOCAL_INC = \ $(SNEK_SAMD21_INC) SNEK_LOCAL_BUILTINS = \ $(SNEK_SAMD21_BUILTINS) \ snek-crickit.builtin include $(SNEK_ROOT)/snek-install.defs SRC=$(SNEK_SRC) OBJ=$(SRC:.c=.o) all: $(ELF) $(BIN) $(UF2) $(PROG): Makefile $(OBJ) $(call quiet,CC) $(LDFLAGS) -Wl,-M=$(MAP) -o $@ $(OBJ) $(LIBS) $(OBJ): $(SNEK_INC) distclean: clean clean:: rm -f *.o *.elf *.bin *.uf2 *.map ao-product.h install: install -d $(DESTDIR)$(SHAREDIR) install -m 0644 $(UF2) $(DESTDIR)$(SHAREDIR) uninstall: snek-1.1/ports/crickit/ao-pins.h000066400000000000000000000175321353657467200166630ustar00rootroot00000000000000/* * Copyright © 2012 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _AO_PINS_H_ #define _AO_PINS_H_ /* Run dffl48m clock at 48MHz */ #define AO_DFLL48M 48000000 #define AO_AHB_PRESCALER 1 #define AO_APBA_PRESCALER 1 #define HAS_SERIAL_0 1 #define USE_SERIAL_0_STDIN 0 #define SERIAL_0_PA10_PA11 1 #define HAS_USB 1 #define AO_USB_OUT_HOOK 1 #define USE_USB_FIFO 1 #define HAS_BEEP 0 #define AO_SNEK_TIMER_FUNC_E 0 #define AO_SNEK_TIMER_FUNC_F 0x80 #define AO_SNEK_TIMER_FUNC_MASK 0x80 #define AO_SNEK_TIMER_DEV_TCC 0 #define AO_SNEK_TIMER_DEV_TC 0x40 #define AO_SNEK_TIMER_DEV_MASK 0x40 #define AO_SNEK_TIMER_CH_MASK 0x0f #define AO_SNEK_TIMER_CH(ch,func,dev) ((ch) | (func) | (dev)) /* * Name Pin E F * * 0 DRIVE1 PB10 TC5.0 * 1 DRIVE2 PB11 TC5.1 * 2 DRIVE3 PA12 TCC2.0 * 3 DRIVE4 PA13 TCC2.1 * 4 MOTOR1A PA22 TC4.0 * 5 MOTOR1B PA23 TC4.1 * 6 MOTOR2A PA19 TC3.1 * 7 MOTOR2B PA18 TC3.0 * 8 SERVO1 PA17 TCC0.7 * 9 SERVO2 PA16 TCC0.6 * 10 SERVO3 PA15 TCC0.5 * 11 SERVO4 PA14 TCC0.4 * 12 CAP1 PA04 * 13 CAP2 PA05 * 14 CAP3 PA06 * 15 CAP4 PA07 * 16 SIGNAL1 PA02 * 17 SIGNAL2 PA03 * 18 SIGNAL3 PB08 * 19 SIGNAL4 PB09 * 20 SIGNAL5 PA11 TCC1.1 * 21 SIGNAL6 PA10 TCC1.0 * 22 SIGNAL7 PA09 TCC1.3 * 23 SIGNAL8 PA08 TCC1.2 * LED PB22 * NEO PA27 * IRQ PA28 */ #define AO_SNEK_ADC_0 0xff #define AO_SNEK_ADC_1 0xff #define AO_SNEK_ADC_2 0xff #define AO_SNEK_ADC_3 0xff #define AO_SNEK_ADC_4 0xff #define AO_SNEK_ADC_5 0xff #define AO_SNEK_ADC_6 0xff #define AO_SNEK_ADC_7 0xff #define AO_SNEK_ADC_8 0xff #define AO_SNEK_ADC_9 0xff #define AO_SNEK_ADC_10 0xff #define AO_SNEK_ADC_11 0xff #define AO_SNEK_ADC_12 0xff #define AO_SNEK_ADC_13 0xff #define AO_SNEK_ADC_14 0xff #define AO_SNEK_ADC_15 0xff /* DRIVE1 */ #define AO_SNEK_GPIO_0 (&samd21_port_b) #define AO_SNEK_PIN_0 10 #define AO_SNEK_TIMER_0 (&samd21_tc5) #define AO_SNEK_CHANNEL_0 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) /* DRIVE2 */ #define AO_SNEK_GPIO_1 (&samd21_port_b) #define AO_SNEK_PIN_1 11 #define AO_SNEK_TIMER_1 (&samd21_tc5) #define AO_SNEK_CHANNEL_1 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) /* DRIVE3 */ #define AO_SNEK_GPIO_2 (&samd21_port_a) #define AO_SNEK_PIN_2 12 #define AO_SNEK_TIMER_2 (&samd21_tcc2) #define AO_SNEK_CHANNEL_2 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) /* DRIVE4 */ #define AO_SNEK_GPIO_3 (&samd21_port_a) #define AO_SNEK_PIN_3 13 #define AO_SNEK_TIMER_3 (&samd21_tcc2) #define AO_SNEK_CHANNEL_3 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define SNEK_DRV8833 #define IS_DRV8833_PWM(p) ((p) == 4 || (p) == 6) #define DRV8833_FIND_PWM(dir) ((dir) - 1) #define IS_DRV8833_DIR(p) ((p) == 5 || (p) == 7) #define DRV8833_FIND_DIR(pwm) ((pwm) + 1) /* MOTOR1A */ #define AO_SNEK_GPIO_4 (&samd21_port_a) #define AO_SNEK_PIN_4 22 #define AO_SNEK_TIMER_4 (&samd21_tc4) #define AO_SNEK_CHANNEL_4 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) /* MOTOR1B */ #define AO_SNEK_GPIO_5 (&samd21_port_a) #define AO_SNEK_PIN_5 23 #define AO_SNEK_TIMER_5 (&samd21_tc4) #define AO_SNEK_CHANNEL_5 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) /* MOTOR2A */ #define AO_SNEK_GPIO_6 (&samd21_port_a) #define AO_SNEK_PIN_6 19 #define AO_SNEK_TIMER_6 (&samd21_tc3) #define AO_SNEK_CHANNEL_6 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) /* MOTOR2B */ #define AO_SNEK_GPIO_7 (&samd21_port_a) #define AO_SNEK_PIN_7 18 #define AO_SNEK_TIMER_7 (&samd21_tc3) #define AO_SNEK_CHANNEL_7 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) /* SERVO1 */ #define AO_SNEK_GPIO_8 (&samd21_port_a) #define AO_SNEK_PIN_8 17 #define AO_SNEK_TIMER_8 (&samd21_tcc0) #define AO_SNEK_CHANNEL_8 AO_SNEK_TIMER_CH(7 & 3, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) /* SERVO2 */ #define AO_SNEK_GPIO_9 (&samd21_port_a) #define AO_SNEK_PIN_9 16 #define AO_SNEK_TIMER_9 (&samd21_tcc0) #define AO_SNEK_CHANNEL_9 AO_SNEK_TIMER_CH(6 & 3, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) /* SERVO3 */ #define AO_SNEK_GPIO_10 (&samd21_port_a) #define AO_SNEK_PIN_10 15 #define AO_SNEK_TIMER_10 (&samd21_tcc0) #define AO_SNEK_CHANNEL_10 AO_SNEK_TIMER_CH(5 & 3, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) /* SERVO4 */ #define AO_SNEK_GPIO_11 (&samd21_port_a) #define AO_SNEK_PIN_11 14 #define AO_SNEK_TIMER_11 (&samd21_tcc0) #define AO_SNEK_CHANNEL_11 AO_SNEK_TIMER_CH(4 & 3, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) /* CAP1 */ #define AO_SNEK_GPIO_12 (&samd21_port_a) #define AO_SNEK_PIN_12 4 #define AO_SNEK_TIMER_12 NULL #define AO_SNEK_CHANNEL_12 0 /* CAP2 */ #define AO_SNEK_GPIO_13 (&samd21_port_a) #define AO_SNEK_PIN_13 5 #define AO_SNEK_TIMER_13 NULL #define AO_SNEK_CHANNEL_13 0 /* CAP3 */ #define AO_SNEK_GPIO_14 (&samd21_port_a) #define AO_SNEK_PIN_14 6 #define AO_SNEK_TIMER_14 NULL #define AO_SNEK_CHANNEL_14 0 /* CAP4 */ #define AO_SNEK_GPIO_15 (&samd21_port_a) #define AO_SNEK_PIN_15 6 #define AO_SNEK_TIMER_15 NULL #define AO_SNEK_CHANNEL_15 0 /* SIGNAL1 */ #define AO_SNEK_GPIO_16 (&samd21_port_a) #define AO_SNEK_PIN_16 2 #define AO_SNEK_TIMER_16 NULL #define AO_SNEK_CHANNEL_16 0 #define AO_SNEK_ADC_16 0 /* SIGNAL2 */ #define AO_SNEK_GPIO_17 (&samd21_port_a) #define AO_SNEK_PIN_17 3 #define AO_SNEK_TIMER_17 NULL #define AO_SNEK_CHANNEL_17 0 #define AO_SNEK_ADC_17 1 /* SIGNAL3 */ #define AO_SNEK_GPIO_18 (&samd21_port_b) #define AO_SNEK_PIN_18 8 #define AO_SNEK_TIMER_18 NULL #define AO_SNEK_CHANNEL_18 0 #define AO_SNEK_ADC_18 2 /* SIGNAL4 */ #define AO_SNEK_GPIO_19 (&samd21_port_b) #define AO_SNEK_PIN_19 9 #define AO_SNEK_TIMER_19 NULL #define AO_SNEK_CHANNEL_19 0 #define AO_SNEK_ADC_19 3 /* SIGNAL5 */ #define AO_SNEK_GPIO_20 (&samd21_port_a) #define AO_SNEK_PIN_20 11 #define AO_SNEK_TIMER_20 (&samd21_tcc1) #define AO_SNEK_CHANNEL_20 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_20 19 /* SIGNAL6 */ #define AO_SNEK_GPIO_21 (&samd21_port_a) #define AO_SNEK_PIN_21 10 #define AO_SNEK_TIMER_21 (&samd21_tcc1) #define AO_SNEK_CHANNEL_21 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_21 18 /* SIGNAL7 */ #define AO_SNEK_GPIO_22 (&samd21_port_a) #define AO_SNEK_PIN_22 9 #define AO_SNEK_TIMER_22 (&samd21_tcc1) #define AO_SNEK_CHANNEL_22 AO_SNEK_TIMER_CH(3, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_22 17 /* SIGNAL8 */ #define AO_SNEK_GPIO_23 (&samd21_port_a) #define AO_SNEK_PIN_23 8 #define AO_SNEK_TIMER_23 (&samd21_tcc1) #define AO_SNEK_CHANNEL_23 AO_SNEK_TIMER_CH(2, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_23 16 /* on-board neopixel */ #define AO_SNEK_GPIO_24 (&samd21_port_a) #define AO_SNEK_PIN_24 27 #define AO_SNEK_TIMER_24 NULL #define AO_SNEK_CHANNEL_24 0 #define AO_SNEK_ADC_24 0xff /* off-board neopixel */ #define AO_SNEK_GPIO_25 (&samd21_port_a) #define AO_SNEK_PIN_25 20 #define AO_SNEK_TIMER_25 NULL #define AO_SNEK_CHANNEL_25 0 #define AO_SNEK_ADC_25 0xff #define AO_SNEK_NUM_PIN 26 #define LED_0_PORT (&samd21_port_b) #define LED_0_PIN 22 #define LED_PIN_TX 0 #define AO_LED_TX (1 << LED_PIN_TX) #define AO_LED_PANIC AO_LED_TX #define LEDS_AVAILABLE (AO_LED_TX) #endif /* _AO_PINS_H_ */ snek-1.1/ports/crickit/snek-crickit.builtin000066400000000000000000000020611353657467200211110ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # DRIVE1, -2, 0 DRIVE2, -2, 1 DRIVE3, -2, 2 DRIVE4, -2, 3 # MOTOR1, -2, = snek_list_build(snek_list_tuple, 2, snek_float_to_poly(4), snek_float_to_poly(5)) MOTOR2, -2, = snek_list_build(snek_list_tuple, 2, snek_float_to_poly(6), snek_float_to_poly(7)) # SERVO1, -2, 8 SERVO2, -2, 9 SERVO3, -2, 10 SERVO4, -2, 11 # CAP1, -2, 12 CAP2, -2, 13 CAP3, -2, 14 CAP4, -2, 15 # SIGNAL1,-2, 16 SIGNAL2,-2, 17 SIGNAL3,-2, 18 SIGNAL4,-2, 19 SIGNAL5,-2, 20 SIGNAL6,-2, 21 SIGNAL7,-2, 22 SIGNAL8,-2, 23 NEOPIXEL, -2, 24 NEOPIXEL1, -2, 25 snek-1.1/ports/duemilanove/000077500000000000000000000000001353657467200160145ustar00rootroot00000000000000snek-1.1/ports/duemilanove/.gitignore000066400000000000000000000001311353657467200177770ustar00rootroot00000000000000snek-duemilanove-* snek-duemilanove-*.hex snek-duemilanove-*.map snek-duemilanove-installsnek-1.1/ports/duemilanove/Makefile000066400000000000000000000061171353657467200174610ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_ROOT = ../.. SNEK_ATMEGA = $(SNEK_ROOT)/chips/atmega SNEK_ASSERT = 0 include $(SNEK_ATMEGA)/snek-atmega.defs SNEK_LOCAL_VPATH = $(SNEK_ATMEGA) SNEK_LOCAL_SRC = \ snek-duemilanove.c \ $(SNEK_ATMEGA_SRC) SNEK_LOCAL_INC = \ $(SNEK_ATMEGA_INC) SNEK_LOCAL_BUILTINS = \ $(SNEK_ATMEGA_BUILTINS) \ snek-duemilanove.builtin include $(SNEK_ROOT)/snek-install.defs SNEK_CFLAGS = $(SNEK_MOST_WARNINGS) $(SNEK_BASE_CFLAGS) BASE=snek-duemilanove-$(SNEK_VERSION) ELF=$(BASE).elf HEX=$(BASE).hex MAP=$(BASE).map CC=avr-gcc OPT=-Os -frename-registers -funsigned-char -fno-jump-tables -mcall-prologues CFLAGS=$(OPT) -DF_CPU=16000000UL -mmcu=atmega328p -I. -I$(SNEK_LOCAL_VPATH) -g $(SNEK_CFLAGS) -Waddr-space-convert LDFLAGS=-Wl,-uvfprintf -lprintf_flt -lm \ -Wl,--defsym -Wl,__TEXT_REGION_LENGTH__=0x8000 \ -Wl,--defsym -Wl,__DATA_REGION_LENGTH__=0x7a0 \ -Wl,--defsym -Wl,__EEPROM_REGION_LENGTH__=0x400 \ -Wl,-Map=$(MAP) ISP = usbtiny #ISP = avrisp2 # # lfuse: 0xff # CKDIV8: 1 no divide by 8 # CKOUT: 1 no clock output # SUT1: 1 crystal osc, slow startup # SUT0: 1 crystal osc, slow startup # CKSEL3: 1 low swing osc, 8-16MHz # CKSEL2: 1 low swing osc, 8-16MHz # CKSEL1: 1 low swing osc, 8-16MHz # CKSEL0: 1 crystal osc # hfuse: # RSTDISBL: 1 reset enabled # DWEN: 1 debug wire disabled # SPIEN: 0 SPI program enabled # WDTON: 1 watch dog disabled # EESAVE: 0 EEPROM saved across chip erase # BOOTSZ1: 1 256 words # BOOTSZ0: 1 256 words # BOOTRST: 1 boot to address 0 # efuse: # BODLEVEL2 1 brown out 2.5-2.9V # BODLEVEL1 0 brown out 2.5-2.9V # BODLEVEL0 1 brown out 2.5-2.9V all: $(HEX) snek-duemilanove-install $(HEX): $(ELF) avr-objcopy -O ihex -R .eeprom $^ $@ $(ELF): $(SNEK_OBJ) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) @awk '/__data_load_end/{printf("ROM used: %d bytes\n", strtonum($$1)); }' $(MAP) snek-duemilanove-install: snek-duemilanove-install.in $(SNEK_SED) $^ > $@ chmod +x $@ set-fuse: avrdude -F -V -c $(ISP) -p ATMEGA328P -U lfuse:w:0xff:m avrdude -F -V -c $(ISP) -p ATMEGA328P -U hfuse:w:0xd7:m avrdude -F -V -c $(ISP) -p ATMEGA328P -U efuse:w:0xfd:m load: $(HEX) snek-duemilanove-install ./snek-duemilanove-install -isp $(ISP) -hex $(HEX) load install: snek-duemilanove-install $(HEX) snek-duemilanove-install.1 install -d $(DESTDIR)$(BINDIR) install snek-duemilanove-install $(DESTDIR)$(BINDIR) install -d $(DESTDIR)$(SHAREDIR) install -m 0644 $(HEX) $(DESTDIR)$(SHAREDIR) install -d $(DESTDIR)$(MANDIR)/man1 install -m 0644 snek-duemilanove-install.1 $(DESTDIR)$(MANDIR)/man1 clean:: rm -f *.elf *.hex *.map snek-duemilanove-install snek-1.1/ports/duemilanove/snek-duemilanove-install.1000066400000000000000000000033341353657467200230130ustar00rootroot00000000000000.\" .\" Copyright © 2019 Keith Packard .\" .\" 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. .\" .TH SNEK-DUEMILANOVE-INSTALL 1 "snek-duemilanove-install" "" .SH NAME snek-duemilanove-instal \- Install Snek to Duemilanove .SH SYNOPSIS .B "snek-duemilanove-install" [OPTION]... [COMMAND] .SH DESCRIPTION .I snek-duemilanove-install installs the Snek programming language on an ATmega328P Arduemilanove Duemilanove board. .SH OPTIONS .TP \-isp Specifies the programmer to use, common options are 'usbtiny' and 'avrisp2'. The default is 'usbtiny'. .TP \-hex Specifies the hex file to load to the board. The default is the currently installed version of Snek. .SH COMMANDS .TP fuseload Sets the target fuse bits for Snek usage and then loads Snek to the device. This is the default command .TP load Loads Snek to the device without first setting the fuse bits. Snek will not work correctly if the fuse bits are not set correctly, so only do this if the target has already had the fuse bits set correctly. .TP fuse Sets the target fuse bits suitable for Snek usage. You must do this before Snek will work on the target device, although you may do it before or after loading the Snek system. You only need to do this once per board. .SH AUTHOR Keith Packard snek-1.1/ports/duemilanove/snek-duemilanove-install.in000066400000000000000000000016311353657467200232570ustar00rootroot00000000000000#!/bin/sh SHAREDIR="@SHAREDIR@" SNEKDUINO="$SHAREDIR/snek-duemilanove-@SNEK_VERSION@.hex" action="fuseload" ISP=usbtiny mode=arg for i in "$@"; do case "$mode" in arg) case "$i" in fuse|load|fuseload) action="$i" ;; -isp|--isp) mode=isp ;; -hex|--hex) mode=hex ;; *) echo "Usage: $0 {-isp usbtiny} {-isp avrisp2} {-hex snek-duemilanove.hex} {fuseload|load|fuse}" 1>&2 exit 1 ;; esac ;; isp) ISP="$i" mode=arg ;; hex) SNEKDUINO="$i" mode=arg ;; esac done FUSES="-U lfuse:w:0xff:m -U hfuse:w:0xd7:m -U efuse:w:0xfd:m" case "$action" in fuse) avrdude -V -c $ISP -p ATMEGA328P -u $FUSES ;; fuseload) avrdude -V -c $ISP -p ATMEGA328P -u $FUSES && avrdude -c $ISP -p ATMEGA328P -U flash:w:"${SNEKDUINO}" ;; load) avrdude -c $ISP -p ATMEGA328P -U flash:w:"${SNEKDUINO}" ;; esac snek-1.1/ports/duemilanove/snek-duemilanove.builtin000066400000000000000000000014561353657467200226600ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # D0, -2, 0 D1, -2, 1 D2, -2, 2 D3, -2, 3 D4, -2, 4 D5, -2, 5 D6, -2, 6 D7, -2, 7 D8, -2, 8 D9, -2, 9 D10, -2, 10 D11, -2, 11 D12, -2, 12 D13, -2, 13 A0, -2, 14 A1, -2, 15 A2, -2, 16 A3, -2, 17 A4, -2, 18 A5, -2, 19 #include #define SNEK_POOL 1024 snek-1.1/ports/duemilanove/snek-duemilanove.c000066400000000000000000000203411353657467200214260ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include "snek.h" #define NUM_PIN 21 static uint8_t power_pin; static uint8_t dir_pin; static uint8_t power[NUM_PIN]; static uint32_t on_pins; #define SNEK_PULL_NONE 0 #define SNEK_PULL_UP 1 /* digital pins all use PULL_UP by default */ static uint32_t pull_pins = 0x03fff; #define clockCyclesPerMicrosecond (F_CPU / 1000000L) #define clockCyclesToMicroseconds(a) ((a) / clockCyclesPerMicrosecond) // the prescaler is set so that timer0 ticks every 64 clock cycles, and the // the overflow handler is called every 256 ticks. #define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256)) // the whole number of milliseconds per timer0 overflow #define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000) // the fractional number of milliseconds per timer0 overflow. we shift right // by three to fit these numbers into a byte. (for the clock speeds we care // about - 8 and 16 MHz - this doesn't lose precision.) #define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3) #define FRACT_MAX (1000 >> 3) volatile uint32_t timer0_millis = 0; static uint8_t timer0_fract = 0; ISR(TIMER0_OVF_vect) { // copy these to local variables so they can be stored in registers // (volatile variables must be read from memory on every access) uint32_t m = timer0_millis; uint8_t f = timer0_fract; m += MILLIS_INC; f += FRACT_INC; if (f >= FRACT_MAX) { f -= FRACT_MAX; m += 1; } timer0_fract = f; timer0_millis = m; } static void port_init(void) { /* Enable ADC */ ADCSRA = ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0) | (1 << ADEN)); /* Timer 0 */ TCCR0A = ((1 << WGM01) | (1 << WGM00)); /* / 64 */ TCCR0B = ((0 << CS02) | (1 << CS01) | (1 << CS00)); /* enable interrupt */ TIMSK0 = (1 << TOIE0); /* Timer 1 */ TCCR1B = ((0 << CS12) | (1 << CS11) | (1 << CS10)); TCCR1A = ((0 << WGM12) | (0 << WGM11) | (1 << WGM10)); OCR1AH = 0; OCR1BH = 0; /* Timer 2 */ TCCR2B = ((1 << CS22) | (0 << CS21) | (0 << CS20)); TCCR2A = ((1 << WGM20)); memset(power, 0xff, NUM_PIN); } FILE snek_duino_file = FDEV_SETUP_STREAM(snek_uart_putchar, snek_eeprom_getchar, _FDEV_SETUP_RW); #include int __attribute__((OS_main)) main (void) { MCUSR = 0; wdt_disable(); stderr = stdout = stdin = &snek_duino_file; snek_uart_init(); port_init(); snek_init(); for (;;) snek_parse(); } snek_poly_t snek_builtin_reset(void) { wdt_enable(WDTO_15MS); for(;;); return SNEK_NULL; } static volatile uint8_t * ddr_reg(uint8_t pin) { if (pin < 8) return &DDRD; if (pin < 14) return &DDRB; return &DDRC; } static volatile uint8_t * pin_reg(uint8_t pin) { if (pin < 8) return &PIND; return &PINB; } static volatile uint8_t * port_reg(uint8_t pin) { if (pin < 8) return &PORTD; if (pin < 14) return &PORTB; return &PORTC; } static uint8_t bit(uint8_t pin) { if (pin < 8) ; else if (pin < 14) pin = pin - 8; else pin = pin - 14; return 1 << pin; } static bool is_pull(uint8_t pin) { return (pull_pins >> pin) & 1; } static bool has_pwm(uint8_t p) { return ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11); } static volatile uint8_t * const PROGMEM ocr_reg_addrs[] = { [3] = &OCR2B, [5] = &OCR0B, [6] = &OCR0A, [9] = &OCR1AL, [10] = &OCR1BL, [11] = &OCR2A }; static volatile uint8_t * ocr_reg(uint8_t pin) { return (volatile uint8_t *) pgm_read_word(&ocr_reg_addrs[pin]); } static volatile uint8_t * const PROGMEM tcc_reg_addrs[] = { [3] = &TCCR2A, [5] = &TCCR0A, [6] = &TCCR0A, [9] = &TCCR1A, [10] = &TCCR1A, [11] = &TCCR2A, }; static volatile uint8_t * tcc_reg(uint8_t pin) { return (volatile uint8_t *) pgm_read_word(&tcc_reg_addrs[pin]); } static uint8_t const PROGMEM tcc_val_addrs[] = { [3] = 1 << COM2B1, [5] = 1 << COM0B1, [6] = 1 << COM0A1, [9] = 1 << COM1A1, [10] = 1 << COM1B1, [11] = 1 << COM2A1, }; static uint8_t tcc_val(uint8_t pin) { return (uint8_t) pgm_read_byte(&tcc_val_addrs[pin]); } static void set_dir(uint8_t pin, uint8_t d) { volatile uint8_t *r = ddr_reg(pin); volatile uint8_t *p = port_reg(pin); uint8_t b = bit(pin); if (d) { *r |= b; } else { *r &= ~b; if (is_pull(pin)) *p |= b; else *p &= ~b; } } static uint8_t snek_poly_get_pin(snek_poly_t a) { snek_soffset_t p = snek_poly_get_soffset(a); if (p < 0 || NUM_PIN <= p) snek_error_value(a); return p; } snek_poly_t snek_builtin_talkto(snek_poly_t a) { snek_list_t *l; uint8_t p, d; if (snek_poly_type(a) == snek_list) { l = snek_poly_to_list(a); p = snek_poly_get_pin(snek_list_get(l, SNEK_ZERO, true)); d = snek_poly_get_pin(snek_list_get(l, SNEK_ONE, true)); } else { p = d = snek_poly_get_pin(a); } if (!snek_abort) { set_dir(p, 1); set_dir(d, 1); power_pin = p; dir_pin = d; } return SNEK_NULL; } static bool is_on(uint8_t pin) { return (on_pins >> pin) & 1; } static void set_on(uint8_t pin) { on_pins |= ((uint32_t) 1) << pin; } static void set_off(uint8_t pin) { on_pins &= ~(((uint32_t) 1) << pin); } static snek_poly_t set_out(uint8_t pin) { uint8_t p = 0; if (is_on(pin)) p = power[pin]; if (has_pwm(pin)) { if (0 < p && p < 255) { *ocr_reg(pin) = p; *tcc_reg(pin) |= tcc_val(pin); return SNEK_NULL; } *tcc_reg(pin) &= ~tcc_val(pin); } if (p) *port_reg(pin) |= bit(pin); else *port_reg(pin) &= ~bit(pin); return SNEK_NULL; } snek_poly_t snek_builtin_setpower(snek_poly_t a) { float p = snek_poly_get_float(a); if (p < 0.0f) p = 0.0f; if (p > 1.0f) p = 1.0f; power[power_pin] = (uint8_t) (p * 255.0f + 0.5f); return set_out(power_pin); } snek_poly_t snek_builtin_setleft(void) { set_on(dir_pin); return set_out(dir_pin); } snek_poly_t snek_builtin_setright(void) { set_off(dir_pin); return set_out(dir_pin); } snek_poly_t snek_builtin_on(void) { set_on(power_pin); return set_out(power_pin); } snek_poly_t snek_builtin_off(void) { set_off(power_pin); return set_out(power_pin); } snek_poly_t snek_builtin_onfor(snek_poly_t a) { snek_builtin_on(); snek_builtin_time_sleep(a); return snek_builtin_off(); } snek_poly_t snek_builtin_pullnone(snek_poly_t a) { uint8_t p = snek_poly_get_pin(a); if (!snek_abort) pull_pins &= ~(1 << p); return SNEK_NULL; } snek_poly_t snek_builtin_pullup(snek_poly_t a) { uint8_t p = snek_poly_get_pin(a); if (!snek_abort) pull_pins |= 1 << p; return SNEK_NULL; } #define analog_reference 1 snek_poly_t snek_builtin_read(snek_poly_t a) { uint8_t p = snek_poly_get_pin(a); if (snek_abort) return SNEK_NULL; set_dir(p, 0); if (p >= 14 && !is_pull(p)) { uint8_t pin = p - 14; ADMUX = (analog_reference << REFS0) | (pin & 7); ADCSRA |= (1 << ADSC); while (ADCSRA & (1 << ADSC)) ; uint8_t low = ADCL; uint8_t high = ADCH; float value = ((uint16_t) high << 8 | low) / 1023.0; return snek_float_to_poly(value); } else { return snek_bool_to_poly(*pin_reg(p) & bit(p)); } } snek_poly_t snek_builtin_stopall(void) { uint8_t p; for (p = 0; p < NUM_PIN; p++) if (on_pins & ((uint32_t) 1 << p)) { set_off(p); set_out(p); } return SNEK_NULL; } static uint32_t snek_millis(void) { uint32_t millis; cli(); millis = timer0_millis; sei(); return millis; } snek_poly_t snek_builtin_time_sleep(snek_poly_t a) { uint32_t expire = snek_millis() + (snek_poly_get_float(a) * 1000.0f + 0.5f); while (!snek_abort && (int32_t) (expire - snek_millis()) > 0) ; return SNEK_NULL; } snek_poly_t snek_builtin_time_monotonic(void) { return snek_float_to_poly(snek_millis() / 1000.0f); } static uint32_t random_next; snek_poly_t snek_builtin_random_seed(snek_poly_t a) { random_next = a.u; return SNEK_NULL; } snek_poly_t snek_builtin_random_randrange(snek_poly_t a) { random_next = random_next * 1103515245L + 12345L; return snek_float_to_poly(random_next % snek_poly_get_soffset(a)); } snek-1.1/ports/feather/000077500000000000000000000000001353657467200151225ustar00rootroot00000000000000snek-1.1/ports/feather/.gitignore000066400000000000000000000000511353657467200171060ustar00rootroot00000000000000*.bin *.map *.uf2 *.elf *.o ao-product.h snek-1.1/ports/feather/Makefile000066400000000000000000000023751353657467200165710ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_ROOT = ../.. SNEK_SAMD21 = $(SNEK_ROOT)/chips/samd21 PROGNAME=snek-feather PRODUCT_NAME=SnekFeather IDPRODUCT=0x8022 IDVENDOR=0x239A include $(SNEK_SAMD21)/snek-samd21.defs SNEK_LOCAL_SRC = \ $(SNEK_SAMD21_SRC) SNEK_LOCAL_INC = \ $(SNEK_SAMD21_INC) SNEK_LOCAL_BUILTINS = \ $(SNEK_SAMD21_BUILTINS) \ snek-feather.builtin include $(SNEK_ROOT)/snek-install.defs SRC=$(SNEK_SRC) OBJ=$(SRC:.c=.o) all: $(ELF) $(BIN) $(UF2) $(PROG): Makefile $(OBJ) $(call quiet,CC) $(LDFLAGS) -Wl,-M=$(MAP) -o $@ $(OBJ) $(LIBS) $(OBJ): $(SNEK_INC) distclean: clean clean:: rm -f *.o *.elf *.bin *.uf2 *.map ao-product.h install: install -d $(DESTDIR)$(SHAREDIR) install -m 0644 $(UF2) $(DESTDIR)$(SHAREDIR) uninstall: snek-1.1/ports/feather/ao-pins.h000066400000000000000000000175211353657467200166470ustar00rootroot00000000000000/* * Copyright © 2012 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _AO_PINS_H_ #define _AO_PINS_H_ /* Run dffl48m clock at 48MHz */ #define AO_DFLL48M 48000000 /* Reference clock is 32.768kHz */ #define AO_XOSC32K 32768 #define AO_AHB_PRESCALER 1 #define AO_APBA_PRESCALER 1 #define HAS_SERIAL_0 1 #define USE_SERIAL_0_STDIN 0 #define SERIAL_0_PA10_PA11 1 #define HAS_USB 1 #define AO_USB_OUT_HOOK 1 #define USE_USB_FIFO 1 #define HAS_BEEP 0 #define AO_SNEK_TIMER_FUNC_E 0 #define AO_SNEK_TIMER_FUNC_F 0x80 #define AO_SNEK_TIMER_FUNC_MASK 0x80 #define AO_SNEK_TIMER_DEV_TCC 0 #define AO_SNEK_TIMER_DEV_TC 0x40 #define AO_SNEK_TIMER_DEV_MASK 0x40 #define AO_SNEK_TIMER_CH_MASK 0x0f #define AO_SNEK_TIMER_CH(ch,func,dev) ((ch) | (func) | (dev)) /* * * Name Pin E F tcc0 tcc1 tcc2 tc3 tc4 tc5 * 0 1 2 3 0 1 0 1 0 1 0 1 0 1 * * * * * * * * * * * * D2 PA14 TC3_0 TCC0_4 - * D3 PA9 TCC0_1 TCC1_3 1 TCC0_1 * D4 PA8 TCC0_0 TCC1_2 0 TCC0_0 * D5 PA15 TC3_1 TCC0_5 1 TC3_1 * D6 PA20 TCC0_6 6 TCC0_6 * D7 PA21 TCC0_7 7 TCC0_7 * D8 PA6 TCC1_0 0 TCC1_0 * D9 PA7 TCC1_1 1 TCC1_1 * D10 PA18 TC3_0 TCC0_2 0 TC3_0 * D11 PA16 TCC2_0 TCC0_6 0 TCC2_0 * D12 PA19 TC3_1 TCC0_3 - * D13 PA17 TCC2_1 TCC0_7 1 TCC2_1 * tcc0 * 0 D4 E * 1 D3 E * 2 * 3 * 4 * 5 * 6 D6 F * 7 D7 F * tcc1 * 0 D8 E * 1 D9 E * tcc2 * 0 D11 E * 1 D13 E * tcc3 * doesn't appear to exist in this chip * tc3 * 0 D10 E D5 E * 1 D12 E D2 E * tc4 * 0 * 1 * tc5 * 0 * 1 * tc6 * 0 * 1 * tc7 * 0 pin 6 E * 1 pin 7 E * */ #define AO_SNEK_ADC_0 0xff #define AO_SNEK_ADC_1 0xff #define AO_SNEK_ADC_2 0xff #define AO_SNEK_ADC_3 0xff #define AO_SNEK_ADC_4 0xff #define AO_SNEK_ADC_5 0xff #define AO_SNEK_ADC_6 0xff #define AO_SNEK_ADC_7 0xff #define AO_SNEK_ADC_8 0xff #define AO_SNEK_ADC_9 0xff #define AO_SNEK_ADC_10 0xff #define AO_SNEK_ADC_11 0xff #define AO_SNEK_ADC_12 0xff #define AO_SNEK_ADC_13 0xff #define AO_SNEK_GPIO_0 (&samd21_port_a) #define AO_SNEK_PIN_0 11 #define AO_SNEK_TIMER_0 NULL #define AO_SNEK_CHANNEL_0 0 #define AO_SNEK_GPIO_1 (&samd21_port_a) #define AO_SNEK_PIN_1 10 #define AO_SNEK_TIMER_1 NULL #define AO_SNEK_CHANNEL_1 0 #define AO_SNEK_GPIO_2 (&samd21_port_a) /* arduino D4 */ #define AO_SNEK_PIN_2 14 #define AO_SNEK_TIMER_2 NULL #define AO_SNEK_CHANNEL_2 0 #define AO_SNEK_GPIO_3 (&samd21_port_a) /* arduino D3 */ #define AO_SNEK_PIN_3 9 #define AO_SNEK_TIMER_3 (&samd21_tcc0) #define AO_SNEK_CHANNEL_3 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_4 (&samd21_port_a) /* arduino D2 */ #define AO_SNEK_PIN_4 8 #define AO_SNEK_TIMER_4 (&samd21_tcc0) #define AO_SNEK_CHANNEL_4 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_5 (&samd21_port_a) /* arduino D5 */ #define AO_SNEK_PIN_5 15 #define AO_SNEK_TIMER_5 (&samd21_tc3) #define AO_SNEK_CHANNEL_5 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) #define AO_SNEK_GPIO_6 (&samd21_port_a) /* arduino D6 */ #define AO_SNEK_PIN_6 20 #define AO_SNEK_TIMER_6 (&samd21_tcc0) #define AO_SNEK_CHANNEL_6 AO_SNEK_TIMER_CH(6 & 3, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_7 (&samd21_port_a) /* arduino D7 */ #define AO_SNEK_PIN_7 21 #define AO_SNEK_TIMER_7 (&samd21_tcc0) #define AO_SNEK_CHANNEL_7 AO_SNEK_TIMER_CH(7 & 3, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_8 (&samd21_port_a) /* arduino D8 */ #define AO_SNEK_PIN_8 6 #define AO_SNEK_TIMER_8 (&samd21_tcc1) #define AO_SNEK_CHANNEL_8 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_9 (&samd21_port_a) /* arduino D9 */ #define AO_SNEK_PIN_9 7 #define AO_SNEK_TIMER_9 (&samd21_tcc1) #define AO_SNEK_CHANNEL_9 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_10 (&samd21_port_a) /* arduino D10 */ #define AO_SNEK_PIN_10 18 #define AO_SNEK_TIMER_10 (&samd21_tc3) #define AO_SNEK_CHANNEL_10 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) #define AO_SNEK_GPIO_11 (&samd21_port_a) /* ardunio D11 */ #define AO_SNEK_PIN_11 16 #define AO_SNEK_TIMER_11 (&samd21_tcc2) #define AO_SNEK_CHANNEL_11 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_12 (&samd21_port_a) /* arduino D12 */ #define AO_SNEK_PIN_12 19 #define AO_SNEK_TIMER_12 NULL #define AO_SNEK_CHANNEL_12 0 #define AO_SNEK_GPIO_13 (&samd21_port_a) /* arduino D13 */ #define AO_SNEK_PIN_13 17 #define AO_SNEK_TIMER_13 (&samd21_tcc2) #define AO_SNEK_CHANNEL_13 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) /* analog */ #define AO_SNEK_GPIO_14 (&samd21_port_a) #define AO_SNEK_PIN_14 2 #define AO_SNEK_TIMER_14 NULL #define AO_SNEK_CHANNEL_14 0 #define AO_SNEK_ADC_14 0 #define AO_SNEK_GPIO_15 (&samd21_port_b) #define AO_SNEK_PIN_15 8 #define AO_SNEK_TIMER_15 NULL #define AO_SNEK_CHANNEL_15 0 #define AO_SNEK_ADC_15 2 #define AO_SNEK_GPIO_16 (&samd21_port_b) #define AO_SNEK_PIN_16 9 #define AO_SNEK_TIMER_16 NULL #define AO_SNEK_CHANNEL_16 0 #define AO_SNEK_ADC_16 3 #define AO_SNEK_GPIO_17 (&samd21_port_a) #define AO_SNEK_PIN_17 4 #define AO_SNEK_TIMER_17 NULL #define AO_SNEK_CHANNEL_17 0 #define AO_SNEK_ADC_17 4 #define AO_SNEK_GPIO_18 (&samd21_port_a) #define AO_SNEK_PIN_18 5 #define AO_SNEK_TIMER_18 NULL #define AO_SNEK_CHANNEL_18 0 #define AO_SNEK_ADC_18 5 #define AO_SNEK_GPIO_19 (&samd21_port_b) #define AO_SNEK_PIN_19 2 #define AO_SNEK_TIMER_19 NULL #define AO_SNEK_CHANNEL_19 0 #define AO_SNEK_ADC_19 10 /* SDA */ #define AO_SNEK_GPIO_20 (&samd21_port_a) #define AO_SNEK_PIN_20 22 #define AO_SNEK_TIMER_20 NULL #define AO_SNEK_CHANNEL_20 0 #define AO_SNEK_ADC_20 0xff /* SCL */ #define AO_SNEK_GPIO_21 (&samd21_port_a) #define AO_SNEK_PIN_21 23 #define AO_SNEK_TIMER_21 NULL #define AO_SNEK_CHANNEL_21 0 #define AO_SNEK_ADC_21 0xff /* SCK */ #define AO_SNEK_GPIO_22 (&samd21_port_b) #define AO_SNEK_PIN_22 11 #define AO_SNEK_TIMER_22 NULL #define AO_SNEK_CHANNEL_22 0 #define AO_SNEK_ADC_22 0xff /* MOSI */ #define AO_SNEK_GPIO_23 (&samd21_port_b) #define AO_SNEK_PIN_23 10 #define AO_SNEK_TIMER_23 NULL #define AO_SNEK_CHANNEL_23 0 #define AO_SNEK_ADC_23 0xff /* MISO */ #define AO_SNEK_GPIO_24 (&samd21_port_a) #define AO_SNEK_PIN_24 12 #define AO_SNEK_TIMER_24 NULL #define AO_SNEK_CHANNEL_24 0 #define AO_SNEK_ADC_24 0xff #define AO_SNEK_NUM_PIN 25 #define LED_0_PORT (&samd21_port_a) #define LED_0_PIN 27 #define LED_PIN_TX 0 #define AO_LED_TX (1 << LED_PIN_TX) #define AO_LED_PANIC AO_LED_TX #define LEDS_AVAILABLE (AO_LED_TX) #endif /* _AO_PINS_H_ */ snek-1.1/ports/feather/snek-feather.builtin000066400000000000000000000015401353657467200210660ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # D0, -2, 0 RX, -2, 0 D1, -2, 1 TX, -2, 1 D2, -2, 2 D3, -2, 3 D4, -2, 4 D5, -2, 5 D6, -2, 6 D7, -2, 7 D8, -2, 8 NEOPIXEL, -2, 8 D9, -2, 9 D10, -2, 10 D11, -2, 11 D12, -2, 12 D13, -2, 13 A0, -2, 14 A1, -2, 15 A2, -2, 16 A3, -2, 17 A4, -2, 18 A5, -2, 19 SDA, -2, 20 SCL, -2, 21 SCK, -2, 22 MOSI, -2, 23 MISO, -2, 24 snek-1.1/ports/itsybitsy3v/000077500000000000000000000000001353657467200160205ustar00rootroot00000000000000snek-1.1/ports/itsybitsy3v/.gitignore000066400000000000000000000001511353657467200200050ustar00rootroot00000000000000snek-itsybitsy3v-*.elf snek-itsybitsy3v-*.hex snek-itsybitsy3v-*.map snek-itsybitsy-install ao-product.h snek-1.1/ports/itsybitsy3v/Makefile000066400000000000000000000026521353657467200174650ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_ROOT = ../.. SNEK_AVR = $(SNEK_ROOT)/chips/avr PROGNAME=snek-itsybitsy3v PRODUCT_NAME=SnekItsyBitsy3v AVR_CLOCK=8000000UL SNEK_ASSERT = 0 include $(SNEK_AVR)/snek-avr.defs SNEK_LOCAL_SRC = \ $(SNEK_AVR_SRC) SNEK_LOCAL_INC = \ $(SNEK_AVR_INC) SNEK_LOCAL_BUILTINS = \ $(SNEK_AVR_BUILTINS) \ snek-itsybitsy3v.builtin include $(SNEK_ROOT)/snek-install.defs all: $(ELF) $(HEX) $(PROG): Makefile $(SNEK_OBJ) $(CC) $(CFLAGS) -o $@ $(SNEK_OBJ) $(LDFLAGS) @awk '/__data_load_end/{printf("ROM used: %d bytes\n", strtonum($$1)); }' $(MAP) $(SNEK_OBJ): $(SNEK_INC) distclean: clean clean:: rm -f *.hex *.elf *.map rm -f ao-product.h install: $(HEX) install -d $(DESTDIR)$(SHAREDIR) install -m 0644 $(HEX) $(DESTDIR)$(SHAREDIR) uninstall: ISP=avrisp2 load: $(HEX) ../itsybitsy5v/snek-itsybitsy-install ../itsybitsy5v/snek-itsybitsy-install -quick -isp $(ISP) -hex $(HEX) load snek-1.1/ports/itsybitsy3v/ao-pins.h000066400000000000000000000053711353657467200175450ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _AO_PINS_H_ #define _AO_PINS_H_ #define HAS_USB 1 #define HAS_BEEP 0 #define AO_FIFO_SIZE 64 #define AVR_VCC_5V 0 #define AVR_VCC_3V3 1 #define SNEK_IO_GETC(file) ao_usb_getc() #define SNEK_GETC() (snek_avr_file.get(stdin)) #define fflush(x) ao_usb_flush(x) #define PIN_MAP { \ [0] = MAKE_MAP(PD, 2), \ [1] = MAKE_MAP(PD, 3), \ [2] = MAKE_MAP(PD, 1), \ [3] = MAKE_MAP(PD, 0), \ [4] = MAKE_MAP(PD, 4), \ [5] = MAKE_MAP(PC, 6), \ [6] = MAKE_MAP(PD, 7), \ [7] = MAKE_MAP(PE, 6), \ [8] = MAKE_MAP(PB, 4), \ [9] = MAKE_MAP(PB, 5), \ [10] = MAKE_MAP(PB, 6), \ [11] = MAKE_MAP(PB, 7), \ [12] = MAKE_MAP(PD, 6), \ [13] = MAKE_MAP(PC, 7), \ [14] = MAKE_MAP(PF, 7), \ [15] = MAKE_MAP(PF, 6), \ [16] = MAKE_MAP(PF, 5), \ [17] = MAKE_MAP(PF, 4), \ [18] = MAKE_MAP(PF, 1), \ [19] = MAKE_MAP(PF, 0), \ [20] = MAKE_MAP(PB, 3), \ [21] = MAKE_MAP(PB, 2), \ [22] = MAKE_MAP(PB, 1), \ } #define ADC_MAP { \ [14 - FIRST_ADC] = 7, \ [15 - FIRST_ADC] = 6, \ [16 - FIRST_ADC] = 5, \ [17 - FIRST_ADC] = 4, \ [18 - FIRST_ADC] = 1, \ [19 - FIRST_ADC] = 0, \ } #define OCR_REG_ADDRS { \ [3] = (uint8_t) (uintptr_t) &OCR0B, \ [5] = (uint8_t) (uintptr_t) &OCR3AL, \ [6] = (uint8_t) (uintptr_t) &OCR4D, \ [9] = (uint8_t) (uintptr_t) &OCR1AL, \ [10] = (uint8_t) (uintptr_t) &OCR1BL, \ [11] = (uint8_t) (uintptr_t) &OCR0A, \ [13] = (uint8_t) (uintptr_t) &OCR4A, \ } #define TCC_REG_ADDRS { \ [3] = (uint8_t) (uintptr_t) &TCCR0A, \ [5] = (uint8_t) (uintptr_t) &TCCR3A, \ [6] = (uint8_t) (uintptr_t) &TCCR4A, \ [9] = (uint8_t) (uintptr_t) &TCCR1A, \ [10] = (uint8_t) (uintptr_t) &TCCR1A, \ [11] = (uint8_t) (uintptr_t) &TCCR0A, \ [13] = (uint8_t) (uintptr_t) &TCCR4A, \ } #define TCC_REG_VALS { \ [3] = 1 << COM0B1, \ [5] = 1 << COM3A1, \ [6] = 1 << COM4D1, \ [9] = 1 << COM1A1, \ [10] = 1 << COM1B1, \ [11] = 1 << COM0A1, \ [13] = 1 << COM4A1, \ } #endif /* _AO_PINS_H_ */ snek-1.1/ports/itsybitsy3v/snek-itsybitsy3v.builtin000066400000000000000000000015411353657467200226630ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # D0, -2, 0 D1, -2, 1 D2, -2, 2 D3, -2, 3 D4, -2, 4 D5, -2, 5 D6, -2, 6 D7, -2, 7 D8, -2, 8 D9, -2, 9 D10, -2, 10 D11, -2, 11 D12, -2, 12 D13, -2, 13 A0, -2, 14 A1, -2, 15 A2, -2, 16 A3, -2, 17 A4, -2, 18 A5, -2, 19 MISO, -2, 20 MOSI, -2, 21 SCK, -2, 22 #include #include #define SNEK_POOL 1024 snek-1.1/ports/itsybitsy5v/000077500000000000000000000000001353657467200160225ustar00rootroot00000000000000snek-1.1/ports/itsybitsy5v/.gitignore000066400000000000000000000001511353657467200200070ustar00rootroot00000000000000snek-itsybitsy5v-*.elf snek-itsybitsy5v-*.hex snek-itsybitsy5v-*.map snek-itsybitsy-install ao-product.h snek-1.1/ports/itsybitsy5v/Makefile000066400000000000000000000033451353657467200174670ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_ROOT = ../.. SNEK_AVR = $(SNEK_ROOT)/chips/avr PROGNAME=snek-itsybitsy5v PRODUCT_NAME=SnekItsyBitsy5v AVR_CLOCK=16000000UL SNEK_ASSERT = 0 include $(SNEK_AVR)/snek-avr.defs SNEK_LOCAL_SRC = \ $(SNEK_AVR_SRC) SNEK_LOCAL_INC = \ $(SNEK_AVR_INC) SNEK_LOCAL_BUILTINS = \ $(SNEK_AVR_BUILTINS) \ snek-itsybitsy5v.builtin include $(SNEK_ROOT)/snek-install.defs all: $(ELF) $(HEX) snek-itsybitsy-install $(PROG): Makefile $(SNEK_OBJ) $(CC) $(CFLAGS) -o $@ $(SNEK_OBJ) $(LDFLAGS) @awk '/__data_load_end/{printf("ROM used: %d bytes\n", strtonum($$1)); }' $(MAP) snek-itsybitsy-install: snek-itsybitsy-install.in $(SNEK_SED) $^ > $@ chmod +x $@ install:: $(HEX) install -d $(DESTDIR)$(SHAREDIR) install -m 0644 $(HEX) $(DESTDIR)$(SHAREDIR) install:: snek-itsybitsy-install snek-itsybitsy-install.1 install -d $(DESTDIR)$(BINDIR) install snek-itsybitsy-install $(DESTDIR)$(BINDIR) install -d $(DESTDIR)$(MANDIR)/man1 install -m 0644 snek-itsybitsy-install.1 $(DESTDIR)$(MANDIR)/man1 clean:: rm -f snek-itsybitsy-install rm -f *.hex *.elf *.map rm -f ao-product.h uninstall:: ISP=avrisp2 load: $(HEX) snek-itsybitsy-install ./snek-itsybitsy-install -quick -isp $(ISP) -hex $(HEX) load snek-1.1/ports/itsybitsy5v/ao-pins.h000066400000000000000000000053711353657467200175470ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _AO_PINS_H_ #define _AO_PINS_H_ #define HAS_USB 1 #define HAS_BEEP 0 #define AO_FIFO_SIZE 64 #define AVR_VCC_5V 1 #define AVR_VCC_3V3 0 #define SNEK_IO_GETC(file) ao_usb_getc() #define SNEK_GETC() (snek_avr_file.get(stdin)) #define fflush(x) ao_usb_flush(x) #define PIN_MAP { \ [0] = MAKE_MAP(PD, 2), \ [1] = MAKE_MAP(PD, 3), \ [2] = MAKE_MAP(PD, 1), \ [3] = MAKE_MAP(PD, 0), \ [4] = MAKE_MAP(PD, 4), \ [5] = MAKE_MAP(PC, 6), \ [6] = MAKE_MAP(PD, 7), \ [7] = MAKE_MAP(PE, 6), \ [8] = MAKE_MAP(PB, 4), \ [9] = MAKE_MAP(PB, 5), \ [10] = MAKE_MAP(PB, 6), \ [11] = MAKE_MAP(PB, 7), \ [12] = MAKE_MAP(PD, 6), \ [13] = MAKE_MAP(PC, 7), \ [14] = MAKE_MAP(PF, 7), \ [15] = MAKE_MAP(PF, 6), \ [16] = MAKE_MAP(PF, 5), \ [17] = MAKE_MAP(PF, 4), \ [18] = MAKE_MAP(PF, 1), \ [19] = MAKE_MAP(PF, 0), \ [20] = MAKE_MAP(PB, 3), \ [21] = MAKE_MAP(PB, 2), \ [22] = MAKE_MAP(PB, 1), \ } #define ADC_MAP { \ [14 - FIRST_ADC] = 7, \ [15 - FIRST_ADC] = 6, \ [16 - FIRST_ADC] = 5, \ [17 - FIRST_ADC] = 4, \ [18 - FIRST_ADC] = 1, \ [19 - FIRST_ADC] = 0, \ } #define OCR_REG_ADDRS { \ [3] = (uint8_t) (uintptr_t) &OCR0B, \ [5] = (uint8_t) (uintptr_t) &OCR3AL, \ [6] = (uint8_t) (uintptr_t) &OCR4D, \ [9] = (uint8_t) (uintptr_t) &OCR1AL, \ [10] = (uint8_t) (uintptr_t) &OCR1BL, \ [11] = (uint8_t) (uintptr_t) &OCR0A, \ [13] = (uint8_t) (uintptr_t) &OCR4A, \ } #define TCC_REG_ADDRS { \ [3] = (uint8_t) (uintptr_t) &TCCR0A, \ [5] = (uint8_t) (uintptr_t) &TCCR3A, \ [6] = (uint8_t) (uintptr_t) &TCCR4A, \ [9] = (uint8_t) (uintptr_t) &TCCR1A, \ [10] = (uint8_t) (uintptr_t) &TCCR1A, \ [11] = (uint8_t) (uintptr_t) &TCCR0A, \ [13] = (uint8_t) (uintptr_t) &TCCR4A, \ } #define TCC_REG_VALS { \ [3] = 1 << COM0B1, \ [5] = 1 << COM3A1, \ [6] = 1 << COM4D1, \ [9] = 1 << COM1A1, \ [10] = 1 << COM1B1, \ [11] = 1 << COM0A1, \ [13] = 1 << COM4A1, \ } #endif /* _AO_PINS_H_ */ snek-1.1/ports/itsybitsy5v/snek-itsybitsy-install.1000066400000000000000000000034361353657467200225570ustar00rootroot00000000000000.\" .\" Copyright © 2019 Keith Packard .\" .\" 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. .\" .TH SNEK-ITSYBITSY-INSTALL 1 "snek-itsybitsy-install" "" .SH NAME snek-itsybitsy-install \- Install Snek to Adafruit ItsyBitsy board .SH SYNOPSIS .B "snek-itsybitsy-install" [OPTION]... [COMMAND] .SH DESCRIPTION .I snek-itsybitsy-install installs the Snek programming language on an Adafruit ItsyBitsy board with an ATmega32u4. .SH OPTIONS .TP \-isp Specifies the programmer to use, common options are 'usbtiny' and 'avrisp2'. The default is 'usbtiny'. .TP \-hex Specifies the hex file to load to the board. The default is the currently installed version of Snek. .TP \-3v Use the 3v binary instead of the default 5v binary. .SH COMMANDS .TP fuseload Sets the target fuse bits for Snek usage and then loads Snek to the device. This is the default command .TP load Loads Snek to the device without first setting the fuse bits. Snek will not work correctly if the fuse bits are not set correctly, so only do this if the target has already had the fuse bits set correctly. .TP fuse Sets the target fuse bits suitable for Snek usage. You must do this before Snek will work on the target device, although you may do it before or after loading the Snek system. You only need to do this once per board. .SH AUTHOR Keith Packard snek-1.1/ports/itsybitsy5v/snek-itsybitsy-install.in000066400000000000000000000024041353657467200230170ustar00rootroot00000000000000#!/bin/sh SHAREDIR="@SHAREDIR@" SNEKITSYBITSYBASE5V="$SHAREDIR/snek-itsybitsy5v" SNEKITSYBITSYBASE3V="$SHAREDIR/snek-itsybitsy3v" SNEKITSYBITSYREST="-@SNEK_VERSION@.hex" SNEKITSYBITSY="$SNEKITSYBITSYBASE5V""$SNEKITSYBITSYREST" action="fuseload" ISP=usbtiny mode=arg verify="" for i in "$@"; do case "$mode" in arg) case "$i" in fuse|load|fuseload) action="$i" ;; -isp|--isp) mode=isp ;; -3v) SNEKITSYBITSY="$SNEKITSYBITSYBASE3V""$SNEKITSYBITSYREST" ;; -5v) SNEKITSYBITSY="$SNEKITSYBITSYBASE5V""$SNEKITSYBITSYREST" ;; -hex|--hex) mode=hex ;; -quick) verify="-V" ;; *) echo "Usage: $0 {-isp usbtiny} {-isp avrisp2} {-3v} {-5v} {-hex snek-itsybitsy5v.hex} {fuseload|load|fuse}" 1>&2 exit 1 ;; esac ;; isp) ISP="$i" mode=arg ;; hex) SNEKITSYBITSY="$i" mode=arg ;; esac done FUSES="-U lfuse:w:0xff:m -U hfuse:w:0x91:m -U efuse:w:0xfd:m" case "$action" in fuse) avrdude -V -c $ISP -p m32u4 -u $FUSES ;; fuseload) avrdude -V -c $ISP -p m32u4 -u $FUSES && avrdude $verify -c $ISP -p m32u4 -U flash:w:"${SNEKITSYBITSY}" ;; load) avrdude $verify -c $ISP -p m32u4 -U flash:w:"${SNEKITSYBITSY}" ;; esac snek-1.1/ports/itsybitsy5v/snek-itsybitsy5v.builtin000066400000000000000000000015411353657467200226670ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # D0, -2, 0 D1, -2, 1 D2, -2, 2 D3, -2, 3 D4, -2, 4 D5, -2, 5 D6, -2, 6 D7, -2, 7 D8, -2, 8 D9, -2, 9 D10, -2, 10 D11, -2, 11 D12, -2, 12 D13, -2, 13 A0, -2, 14 A1, -2, 15 A2, -2, 16 A3, -2, 17 A4, -2, 18 A5, -2, 19 MISO, -2, 20 MOSI, -2, 21 SCK, -2, 22 #include #include #define SNEK_POOL 1024 snek-1.1/ports/itsybitsym0/000077500000000000000000000000001353657467200160045ustar00rootroot00000000000000snek-1.1/ports/itsybitsym0/.gitignore000066400000000000000000000000511353657467200177700ustar00rootroot00000000000000*.bin *.map *.uf2 *.elf *.o ao-product.h snek-1.1/ports/itsybitsym0/Makefile000066400000000000000000000024111353657467200174420ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_ROOT = ../.. SNEK_SAMD21 = $(SNEK_ROOT)/chips/samd21 PROGNAME=snek-itsybitsym0 PRODUCT_NAME=SnekItsyBitsyM0 IDPRODUCT=0x8011 IDVENDOR=0x239A include $(SNEK_SAMD21)/snek-samd21.defs SNEK_LOCAL_SRC = \ $(SNEK_SAMD21_SRC) SNEK_LOCAL_INC = \ $(SNEK_SAMD21_INC) SNEK_LOCAL_BUILTINS = \ $(SNEK_SAMD21_BUILTINS) \ snek-itsybitsym0.builtin include $(SNEK_ROOT)/snek-install.defs SRC=$(SNEK_SRC) OBJ=$(SRC:.c=.o) all: $(ELF) $(BIN) $(UF2) $(PROG): Makefile $(OBJ) $(call quiet,CC) $(LDFLAGS) -Wl,-M=$(MAP) -o $@ $(OBJ) $(LIBS) $(OBJ): $(SNEK_INC) distclean: clean clean:: rm -f *.o *.elf *.bin *.uf2 *.map ao-product.h install: install -d $(DESTDIR)$(SHAREDIR) install -m 0644 $(UF2) $(DESTDIR)$(SHAREDIR) uninstall: snek-1.1/ports/itsybitsym0/ao-pins.h000066400000000000000000000155601353657467200175320ustar00rootroot00000000000000/* * Copyright © 2012 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _AO_PINS_H_ #define _AO_PINS_H_ /* Run dffl48m clock at 48MHz */ #define AO_DFLL48M 48000000 #define AO_AHB_PRESCALER 1 #define AO_APBA_PRESCALER 1 #define HAS_SERIAL_0 1 #define USE_SERIAL_0_STDIN 0 #define SERIAL_0_PA10_PA11 1 #define HAS_USB 1 #define AO_USB_OUT_HOOK 1 #define USE_USB_FIFO 1 #define HAS_BEEP 0 #define AO_SNEK_TIMER_FUNC_E 0 #define AO_SNEK_TIMER_FUNC_F 0x80 #define AO_SNEK_TIMER_FUNC_MASK 0x80 #define AO_SNEK_TIMER_DEV_TCC 0 #define AO_SNEK_TIMER_DEV_TC 0x40 #define AO_SNEK_TIMER_DEV_MASK 0x40 #define AO_SNEK_TIMER_CH_MASK 0x0f #define AO_SNEK_TIMER_CH(ch,func,dev) ((ch) | (func) | (dev)) /* * D0 PA11 * D1 PA10 * D2 PA14 * D3 PA09 * D4 PA08 * D5_5V PA15 * D6 PA20 NC * D7 PA21 * D8 PA06 NC * D9 PA07 * D10 PA18 * D11 PA16 * D12 PA19 * D13 PA17 * A0 PA02 * A1 PB08 * A2 PB09 * A3 PA04 * A4 PA05 * A5 PB02 * SDA PA22 * SCL PA23 * SCK PB11 * MOSI PB10 * MISO PA12 * DI PA01 * CI PA00 */ #define AO_SNEK_ADC_0 0xff #define AO_SNEK_ADC_1 0xff #define AO_SNEK_ADC_2 0xff #define AO_SNEK_ADC_3 0xff #define AO_SNEK_ADC_4 0xff #define AO_SNEK_ADC_5 0xff #define AO_SNEK_ADC_6 0xff #define AO_SNEK_ADC_7 0xff #define AO_SNEK_ADC_8 0xff #define AO_SNEK_ADC_9 0xff #define AO_SNEK_ADC_10 0xff #define AO_SNEK_ADC_11 0xff #define AO_SNEK_ADC_12 0xff #define AO_SNEK_ADC_13 0xff #define AO_SNEK_GPIO_0 (&samd21_port_a) #define AO_SNEK_PIN_0 11 #define AO_SNEK_TIMER_0 NULL #define AO_SNEK_CHANNEL_0 0 #define AO_SNEK_GPIO_1 (&samd21_port_a) #define AO_SNEK_PIN_1 10 #define AO_SNEK_TIMER_1 NULL #define AO_SNEK_CHANNEL_1 0 #define AO_SNEK_GPIO_2 (&samd21_port_a) /* arduino D4 */ #define AO_SNEK_PIN_2 14 #define AO_SNEK_TIMER_2 NULL #define AO_SNEK_CHANNEL_2 0 #define AO_SNEK_GPIO_3 (&samd21_port_a) /* arduino D3 */ #define AO_SNEK_PIN_3 9 #define AO_SNEK_TIMER_3 (&samd21_tcc0) #define AO_SNEK_CHANNEL_3 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_4 (&samd21_port_a) /* arduino D2 */ #define AO_SNEK_PIN_4 8 #define AO_SNEK_TIMER_4 (&samd21_tcc0) #define AO_SNEK_CHANNEL_4 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_5 (&samd21_port_a) /* arduino D5 */ #define AO_SNEK_PIN_5 15 #define AO_SNEK_TIMER_5 (&samd21_tc3) #define AO_SNEK_CHANNEL_5 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) #define AO_SNEK_GPIO_6 (&samd21_port_a) /* arduino D6 */ #define AO_SNEK_PIN_6 20 #define AO_SNEK_TIMER_6 (&samd21_tcc0) #define AO_SNEK_CHANNEL_6 AO_SNEK_TIMER_CH(6 & 3, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_7 (&samd21_port_a) /* arduino D7 */ #define AO_SNEK_PIN_7 21 #define AO_SNEK_TIMER_7 (&samd21_tcc0) #define AO_SNEK_CHANNEL_7 AO_SNEK_TIMER_CH(7 & 3, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_8 (&samd21_port_a) /* arduino D8 */ #define AO_SNEK_PIN_8 6 #define AO_SNEK_TIMER_8 (&samd21_tcc1) #define AO_SNEK_CHANNEL_8 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_9 (&samd21_port_a) /* arduino D9 */ #define AO_SNEK_PIN_9 7 #define AO_SNEK_TIMER_9 (&samd21_tcc1) #define AO_SNEK_CHANNEL_9 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_10 (&samd21_port_a) /* arduino D10 */ #define AO_SNEK_PIN_10 18 #define AO_SNEK_TIMER_10 (&samd21_tc3) #define AO_SNEK_CHANNEL_10 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) #define AO_SNEK_GPIO_11 (&samd21_port_a) /* ardunio D11 */ #define AO_SNEK_PIN_11 16 #define AO_SNEK_TIMER_11 (&samd21_tcc2) #define AO_SNEK_CHANNEL_11 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_12 (&samd21_port_a) /* arduino D12 */ #define AO_SNEK_PIN_12 19 #define AO_SNEK_TIMER_12 NULL #define AO_SNEK_CHANNEL_12 0 #define AO_SNEK_GPIO_13 (&samd21_port_a) /* arduino D13 */ #define AO_SNEK_PIN_13 17 #define AO_SNEK_TIMER_13 (&samd21_tcc2) #define AO_SNEK_CHANNEL_13 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) /* analog */ #define AO_SNEK_GPIO_14 (&samd21_port_a) #define AO_SNEK_PIN_14 2 #define AO_SNEK_TIMER_14 NULL #define AO_SNEK_CHANNEL_14 0 #define AO_SNEK_ADC_14 0 #define AO_SNEK_GPIO_15 (&samd21_port_b) #define AO_SNEK_PIN_15 8 #define AO_SNEK_TIMER_15 NULL #define AO_SNEK_CHANNEL_15 0 #define AO_SNEK_ADC_15 2 #define AO_SNEK_GPIO_16 (&samd21_port_b) #define AO_SNEK_PIN_16 9 #define AO_SNEK_TIMER_16 NULL #define AO_SNEK_CHANNEL_16 0 #define AO_SNEK_ADC_16 3 #define AO_SNEK_GPIO_17 (&samd21_port_a) #define AO_SNEK_PIN_17 4 #define AO_SNEK_TIMER_17 NULL #define AO_SNEK_CHANNEL_17 0 #define AO_SNEK_ADC_17 4 #define AO_SNEK_GPIO_18 (&samd21_port_a) #define AO_SNEK_PIN_18 5 #define AO_SNEK_TIMER_18 NULL #define AO_SNEK_CHANNEL_18 0 #define AO_SNEK_ADC_18 5 #define AO_SNEK_GPIO_19 (&samd21_port_b) #define AO_SNEK_PIN_19 2 #define AO_SNEK_TIMER_19 NULL #define AO_SNEK_CHANNEL_19 0 #define AO_SNEK_ADC_19 10 /* SDA */ #define AO_SNEK_GPIO_20 (&samd21_port_a) #define AO_SNEK_PIN_20 22 #define AO_SNEK_TIMER_20 NULL #define AO_SNEK_CHANNEL_20 0 #define AO_SNEK_ADC_20 0xff /* SCL */ #define AO_SNEK_GPIO_21 (&samd21_port_a) #define AO_SNEK_PIN_21 23 #define AO_SNEK_TIMER_21 NULL #define AO_SNEK_CHANNEL_21 0 #define AO_SNEK_ADC_21 0xff /* SCK */ #define AO_SNEK_GPIO_22 (&samd21_port_b) #define AO_SNEK_PIN_22 11 #define AO_SNEK_TIMER_22 NULL #define AO_SNEK_CHANNEL_22 0 #define AO_SNEK_ADC_22 0xff /* MOSI */ #define AO_SNEK_GPIO_23 (&samd21_port_b) #define AO_SNEK_PIN_23 10 #define AO_SNEK_TIMER_23 NULL #define AO_SNEK_CHANNEL_23 0 #define AO_SNEK_ADC_23 0xff /* MISO */ #define AO_SNEK_GPIO_24 (&samd21_port_a) #define AO_SNEK_PIN_24 12 #define AO_SNEK_TIMER_24 NULL #define AO_SNEK_CHANNEL_24 0 #define AO_SNEK_ADC_24 0xff /* DI */ #define AO_SNEK_GPIO_25 (&samd21_port_a) #define AO_SNEK_PIN_25 01 #define AO_SNEK_TIMER_25 NULL #define AO_SNEK_CHANNEL_25 0 #define AO_SNEK_ADC_25 0xff /* CI */ #define AO_SNEK_GPIO_26 (&samd21_port_a) #define AO_SNEK_PIN_26 00 #define AO_SNEK_TIMER_26 NULL #define AO_SNEK_CHANNEL_26 0 #define AO_SNEK_ADC_26 0xff #define AO_SNEK_NUM_PIN 27 #endif /* _AO_PINS_H_ */ snek-1.1/ports/itsybitsym0/snek-itsybitsym0.builtin000066400000000000000000000016371353657467200226410ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # D0, -2, 0 D1, -2, 1 D2, -2, 2 D3, -2, 3 D4, -2, 4 D5, -2, 5 D6, -2, 6 D7, -2, 7 D8, -2, 8 D9, -2, 9 D10, -2, 10 D11, -2, 11 D12, -2, 12 D13, -2, 13 A0, -2, 14 A1, -2, 15 A2, -2, 16 A3, -2, 17 A4, -2, 18 A5, -2, 19 SDA, -2, 20 SCL, -2, 21 SCK, -2, 22 MOSI, -2, 23 MISO, -2, 24 NEOPIXEL, -2, = snek_list_build(snek_list_tuple, 2, snek_float_to_poly(25), snek_float_to_poly(26))snek-1.1/ports/mega/000077500000000000000000000000001353657467200144155ustar00rootroot00000000000000snek-1.1/ports/mega/.gitignore000066400000000000000000000001011353657467200163750ustar00rootroot00000000000000snek-mega-*.elf snek-mega-*.hex snek-mega-*.map snek-mega-installsnek-1.1/ports/mega/Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex000066400000000000000000000264671353657467200244050ustar00rootroot00000000000000:100000009AC00000B3C00000B1C00000AFC0000043 :10001000ADC00000ABC00000A9C00000A7C0000038 :10002000A5C00000A3C00000A1C000003CC40000A7 :10003000E1C400009BC0000099C0000097C0000010 :1000400095C0000093C0000091C000008FC0000068 :100050008DC000008BC0000089C0000005C20000F8 :1000600085C0000083C0000081C000007FC0000088 :100070007DC000005E058005720680057206C5051C :10008000E20572063506470624034100720064004B :10009000750069006E006F0020004D00650067006C :1000A00061002000320035003600300000003203CD :1000B000410072006400750069006E006F0020004E :1000C00028007700770077002E006100720064003E :1000D000750069006E006F002E0063006300290048 :1000E00000000403090409023E00020100C03209B5 :1000F0000400000102020100052400011004240292 :10010000060524060001070582030800FF09040113 :1001100000020A00000007050402400001070583F1 :10012000024000011201100102000008EB034B2005 :1001300001000102DC0111241FBECFEFD2E0DEBFBF :10014000CDBF11E0A0E0B1E0E2EFFFE002C005901A :100150000D92A631B107D9F722E0A6E1B1E001C0C6 :100160001D92A233B207E1F767D041C749CFFC0126 :10017000E058FF4FA081B1816C93A081B1819D01B6 :100180002F5F3F4F318320832E173F0721F41296B4 :100190009C938E9311972FB7F894FC01EC57FF4F67 :1001A00080818F5F80832FBF0895DC01AE57BF4FE2 :1001B000ED91FC91119721911196FC93EE93AC0176 :1001C00040585F4FE417F50711F48D939C933FB7A8 :1001D000F894FC01EC57FF4F9081915090833FBF02 :1001E000822F089584B7877F84BF0FB6F894A895AF :1001F00080916000886180936000109260000FBE63 :1002000087E690E09093CD008093CC0086E08093C9 :10021000CA001092C80088E18093C900539A5A9A84 :100220008AB180638AB98BB180638BB931D384E0A2 :1002300085BD5F9A579A0895D5DF2FB7F89481EA64 :1002400091E0909322028093210290932402809364 :1002500023022FBF2FB7F8948CE191E090939D017A :1002600080939C0190939F0180939E012FBF78946F :10027000D3E013E101E081E1F82E9FB7F89480917B :1002800025029FBF803849F080E091E05DD697FD60 :1002900004C0682F81EA91E06ADF8FB7F894C091BB :1002A000A0018FBFA89902C0C13658F1A89A8091C9 :1002B000A001882319F05D98D0931901CC2349F04F :1002C0008CE191E072DF682F80E091E0DED5C150D3 :1002D000F5CF80911901882341F080911901815057 :1002E00080931901811101C05D9A80911A018823C0 :1002F00041F080911A01815080931A01811101C04F :100300005C9A809118018823F9F0909116018091F0 :1003100001018093E9008091E800992359F085FF5D :1003200013C08091C80085FFFCCFF092CE001092E0 :1003300016010AC085FD08C08091C80085FFFCCF6A :100340001093CE00009316019FB7F8948091250278 :100350009FBF882381F08091170181110CC081EA31 :1003600091E023DF9091C80095FFFCCF8093CE00F1 :100370005C98D0931A0180E091E0D8D5C0D47DCFAD :1003800080E091E038C580E091E0CBC40F931F93EB :10039000CF938C01FC018489813021F0823021F4DB :1003A000C0E203C0C0E301C0C0E0F801838982302D :1003B00009F4C860F8018589873031F0883031F060 :1003C000863029F4C26003C0C46001C0C6601092C8 :1003D000C9001092C8001092CA00F8012785308920 :1003E0004189528981E02115F1EE3F074105510510 :1003F00008F080E080931801109217011092160106 :10040000211581EE38074105510581F0DA01C90156 :10041000B695A79597958795BC01CD0160587B4708 :10042000814E9F4FBCD52150310902C020E130E000 :100430003093CD002093CC00C093CA00F80187858B :100440009089A189B2898115914EA105B10511F05C :1004500082E001C080E08093C80088E98093C900F1 :10046000CF911F910F9108951F920F920FB60F9287 :1004700011242F933F934F935F936F937F938F93A9 :100480009F93AF93BF93EF93FF936091CE008091C2 :100490001801882359F0613131F0633139F481E07A :1004A0008093170109C01092170106C08EB38430E3 :1004B00019F48CE191E05BDEFF91EF91BF91AF9178 :1004C0009F918F917F916F915F914F913F912F916C :1004D0000F900FBE0F901F901895FC01858580FF2F :1004E00002C05F9808955F9A0895292F332722301C :1004F000310559F02330310569F021303105E9F437 :1005000082E190E024E231E01CC08EE390E026EE30 :1005100030E017C099278130910549F028F0029703 :1005200061F4E8E8F0E005C0E2EEF0E002C0EEEAD7 :10053000F0E0849190E09F0104C080E090E020E032 :1005400030E0FA01318320830895AC0128E030E0E7 :1005500080E02417350720F48F5F220F331FF9CF77 :100560008295807F08958093E900EBEEF0E0808132 :1005700081608083EDEEF0E010826093EC004083B8 :100580008091EE00881F8827881F08951092F4003C :1005900080E08093E9001092F0001092E800109241 :1005A000ED009091EB009E7F9093EB008F5F853084 :1005B00081F7089580912A0287FF0FC08091E8009B :1005C00082FD04C08EB38111F9CF10C08091E80084 :1005D0008B770AC08EB3882349F08091E80080FFB2 :1005E000F9CF8091E8008E778093E800089585E642 :1005F0009091EC0090FF05C09091E80090FF05C03D :100600001BC09091E80092FD17C09EB39923B1F0F2 :100610009EB39530A9F09091EB0095FD13C0909199 :10062000E10092FFE5CF9091E1009B7F9093E10084 :100630008150F1F684E0089580E0089582E0089505 :1006400083E0089581E008952091300230913102D5 :100650002617370748F06115710539F42091E80035 :100660002E772093E80001C0B90130E061157105D3 :1006700061F12091E80023FD37C02091E80022FDC0 :100680002DC02EB3222391F12EB3253089F1209174 :10069000E80020FFEBCF2091F200FC01CF016115B3 :1006A000710549F0283038F481918093F100615050 :1006B00071092F5FF3CF31E0283009F030E020914D :1006C000E8002E772093E800D1CF3111D2CF06C0B9 :1006D0008EB3882359F08EB3853051F08091E800B5 :1006E00082FFF6CF80E0089581E0089582E00895CA :1006F00083E00895209130023091310226173707A8 :1007000048F06115710539F42091E8002E772093A7 :10071000E80001C0B90130E06115710569F120916F :10072000E80023FD38C02091E80022FD2EC02EB342 :10073000222399F12EB3253091F12091E80020FF7A :10074000EBCF2091F200FC01CF016115710551F052 :10075000283040F484918093F100615071092F5F3B :100760003196F2CF31E0283009F030E02091E800F6 :100770002E772093E800D0CF3111D1CF06C08EB3B1 :10078000882359F08EB3853051F08091E80082FFC4 :10079000F6CF80E0089581E0089582E0089583E037 :1007A00008956115710529F42091E8002B772093B5 :1007B000E8006115710511F12091E80023FD24C0C6 :1007C0002EB3222319F12EB3253011F12091E80028 :1007D00022FFEFCF2091F200222331F301962091E6 :1007E000F100FC01319720836150710999F7DCCF4A :1007F0008EB3882359F08EB3853051F08091E80094 :1008000080FFF6CF80E0089581E0089582E00895AA :1008100083E0089542D044D01EBA1092280210926C :1008200027021092260284E089BD89B5826089BDC5 :1008300009B400FEFDCF8091D800982F9F77909348 :10084000D80080688093D800809163008E7F809369 :1008500063008091D8008F7D8093D8008091E00064 :100860008E7F8093E0008091E1008E7F8093E10095 :100870008091E20081608093E2008091E100877FB7 :100880008093E1008091E20088608093E200089507 :10089000C1DF81E08093290208951092E20008955B :1008A0001092E10008951F920F920FB60F9211243B :1008B0002F933F934F935F936F937F938F939F9368 :1008C000AF93BF93EF93FF938091E10080FF1BC034 :1008D0008091E20080FF17C08091E1008E7F8093BD :1008E000E1008091E2008E7F8093E2008091E2003F :1008F00080618093E2008091D80080628093D8006C :1009000019BC1EBAFBD18091E10084FF29C08091FF :10091000E20084FF25C084E089BD89B5826089BD7D :1009200009B400FEFDCF8091D8008F7D8093D80060 :100930008091E1008F7E8093E1008091E2008F7EC4 :100940008093E2008091E20081608093E2008091D8 :100950002802811102C081E001C084E08EBBCED1AB :100960008091E10083FF27C08091E20083FF23C0D4 :100970008091E100877F8093E10082E08EBB10923E :1009800028028091E1008E7F8093E1008091E20057 :100990008E7F8093E2008091E20080618093E2008C :1009A000F5DD42E060E080E0DEDD8091F00088600F :1009B0008093F000A3D18091E10082FF0AC0809172 :1009C000E20082FF06C08091E1008B7F8093E1000E :1009D00095D1FF91EF91BF91AF919F918F917F91B1 :1009E0006F915F914F913F912F910F900FBE0F909C :1009F0001F9018951F920F920FB60F921124FF921D :100A00000F931F932F933F934F935F936F937F9316 :100A10008F939F93AF93BF93CF93DF93EF93FF9306 :100A2000C9EED0E088818770F82E188200EF10E0C0 :100A3000F8018081877F808378941DD0F894188294 :100A4000F801808188608083F882FF91EF91DF91C7 :100A5000CF91BF91AF919F918F917F916F915F9156 :100A60004F913F912F911F910F91FF900F900FBECB :100A70000F901F9018951F93CF93DF93CDB7DEB7DC :100A8000AA970FB6F894DEBF0FBECDBFEAE2F2E040 :100A900082E392E02091F10021938E179F07D1F716 :100AA00080912A0290912B02492F50E04A30510543 :100AB00008F018C1FA01E65CFF4F93C2803881F05C :100AC000823809F00FC180912E0287708093E9006F :100AD0008091EB0085FB882780F91092E90006C021 :100AE0008091260290912702911182609091E800F6 :100AF000977F9093E8008093F1001092F100C0C0BE :100B0000282F2D7F09F0EEC0882319F0823061F084 :100B1000DAC080912C02813009F0D5C0933009F001 :100B200080E0809327022BC080912C02811127C086 :100B300080912E02877009F4C6C08093E90020914D :100B4000EB0020FFC0C0933021F48091EB00806265 :100B500014C09091EB0090619093EB0021E030E0A5 :100B6000A90102C0440F551F8A95E2F74093EA009D :100B70001092EA008091EB0088608093EB00109265 :100B8000E9008091E800877F7EC08111ABC01091A1 :100B90002C028091E800877F8093E8000BDD809134 :100BA000E80080FD04C08EB38111F9CF8CC0812F85 :100BB0008F7711F492E001C093E09EBB8068809330 :100BC000E30081C08058823008F08CC080912C02F4 :100BD00090912D028C3D53E0950779F583E08A834F :100BE0008AE289833FB7F894DE01139690E02EE005 :100BF00041E2E22FF0E040935700E49190FF03C000 :100C0000E295EF702F5FEF7080E38E0F8A3310F064 :100C1000E95C01C0E82FF0E0ED93FD939F5F943114 :100C200041F73FBF8091E800877F8093E8006AE248 :100C300070E0CE01019608DD12C0AE014F5F5F4F3C :100C400060912E0252DCBC01892B09F43CC09091CA :100C5000E800977F9093E80089819A814BDD80912D :100C6000E8008B778093E8002EC08038D9F580911A :100C7000E800877F8093E800809128028093F1004C :100C80008091E8008E778093E80094DC1CC081118D :100C900029C080912C0290912D02992702979CF4F3 :100CA0008091E800877F8093E80080912C028093F8 :100CB000280280DC80912802811102C083E001C0FB :100CC00084E08EBB5DDB8091E80083FF0DC08091E6 :100CD000EB0080628093EB008091E800877F809337 :100CE000E80002C050DBEFCFAA960FB6F894DEBF43 :100CF0000FBECDBFDF91CF911F9108950895CF937F :100D00008EB3882359F0C091E900C7701092E900B2 :100D10008091E80083FDAFDEC093E900CF91089594 :100D20000895CF93DF932091E80023FF61C0FC0179 :100D3000208130E040912E0250912F02421753073C :100D400009F056C0EC0180912B02813249F018F471 :100D50008032C9F04DC0823261F18332C9F148C09E :100D600080912A02813A09F043C08091E800877F90 :100D70008093E80067E070E0CF010F9665DC80911A :100D8000E8008B7713C080912A02813289F5809127 :100D9000E800877F8093E80067E070E0CF010F965E :100DA00000DDCE01F3DA8091E8008E778093E800D1 :100DB0001FC080912A028132D9F48091E800877F98 :100DC0008093E80080912C028587CF0186DB0DC0DF :100DD00080912A02813261F48091E800877F8093BC :100DE000E80060912C02CF019BDFDF91CF91E2CB35 :100DF000DF91CF9108950F931F93CF93DF93EC0171 :100E0000FC013D9689E0DF011D928A95E9F78A8110 :100E10009B812C81211102C010E001C014E00981E6 :100E200094DB812B482F426061E8802F9CDB882374 :100E300031F18E819F812885211102C010E001C00F :100E400014E00D8182DB812B482F426060E8802F07 :100E50008ADB8823A1F08A859B852C85211102C01D :100E600010E001C014E0C98570DB812B482F42607F :100E700061EC8C2FDF91CF911F910F9174CB80E0AB :100E8000DF91CF911F910F9108950F931F93CF93EF :100E90002EB32430F1F4FC010785108921893289B1 :100EA000012B022B032BA9F0C62F81818093E9002F :100EB0008091E80085FF04C0C093F10080E00AC083 :100EC0008091E8008E778093E80091DB8823A1F37E :100ED00001C082E0CF911F910F9108952EB324306D :100EE00019F5FC014785508961897289452B462B8C :100EF000472BD1F081818093E9008091F200882313 :100F000089F09091E8008091E8008E778093E80066 :100F100095FD08C06CDB811108C08091E8008E77D8 :100F20008093E80080E0089582E008952EB3243095 :100F300051F4FC014785508961897289452B462B04 :100F4000472B09F0CBCF08952EB3243019F08FEF43 :100F50009FEF0895FC014785508961897289452B6F :100F6000462B472BA1F385818093E9008091E8000F :100F700082FFEDCF8091F200882321F02091F100D3 :100F800030E002C02FEF3FEF8091F200811105C0E9 :100F90008091E8008B778093E800C9010895A1E271 :100FA0001A2EAA1BBB1BFD010DC0AA1FBB1FEE1FE3 :100FB000FF1FA217B307E407F50720F0A21BB30B2E :100FC000E40BF50B661F771F881F991F1A9469F7AA :100FD00060957095809590959B01AC01BD01CF0106 :100FE0000895EE0FFF1F0590F491E02D0994F894F9 :020FF000FFCF31 :100FF200000340000004400000020800000000005E :06100200000000000000E8 :00000001FF snek-1.1/ports/mega/Makefile000066400000000000000000000046741353657467200160700ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_ROOT = ../.. SNEK_ATMEGA = $(SNEK_ROOT)/chips/atmega include $(SNEK_ATMEGA)/snek-atmega.defs SNEK_LOCAL_VPATH = $(SNEK_ATMEGA) SNEK_LOCAL_SRC = \ $(SNEK_ATMEGA_SRC) \ $(SNEK_ATMEGA_MATH_SRC) \ snek-mega.c \ SNEK_LOCAL_INC = \ $(SNEK_ATMEGA_INC) \ $(SNEK_ATMEGA_MATH_INC) SNEK_LOCAL_BUILTINS = \ $(SNEK_ATMEGA_BUILTINS) \ $(SNEK_ATMEGA_MATH_BUILTINS) \ snek-math.builtin \ snek-mega.builtin include $(SNEK_ROOT)/snek-install.defs SNEK_CFLAGS = $(SNEK_MOST_WARNINGS) $(SNEK_BASE_CFLAGS) USBSERIAL_HEX=Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex BASE=snek-mega-$(SNEK_VERSION) ELF=$(BASE).elf HEX=$(BASE).hex MAP=$(BASE).map CC=avr-gcc CFLAGS=-Os -DF_CPU=16000000UL -mmcu=atmega2560 -I. -I$(SNEK_LOCAL_VPATH) -g -fno-jump-tables $(SNEK_CFLAGS) -mcall-prologues -Waddr-space-convert LDFLAGS=-Wl,-uvfprintf -lprintf_flt -lm \ -Wl,--defsym -Wl,__TEXT_REGION_LENGTH__=0x3e000 \ -Wl,--defsym -Wl,__DATA_REGION_LENGTH__=0x1e00 \ -Wl,--defsym -Wl,__EEPROM_REGION_LENGTH__=0x1000 \ -Wl,-Map=$(MAP) PORT=/dev/ttyACM0 all: $(HEX) snek-mega-install $(HEX): $(ELF) avr-objcopy -O ihex -R .eeprom $^ $@ $(ELF): $(SNEK_OBJ) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) @awk '/__data_load_end/{printf("ROM used: %d bytes\n", strtonum($$1)); }' $(MAP) snek-mega-install: snek-mega-install.in $(SNEK_SED) $^ > $@ chmod +x $@ load: $(HEX) snek-mega-install ./snek-mega-install -port $(PORT) -hex $(HEX) install: snek-mega-install $(HEX) snek-mega-install.1 install -d $(DESTDIR)$(BINDIR) install snek-mega-install $(DESTDIR)$(BINDIR) install -d $(DESTDIR)$(SHAREDIR) install -m 0644 $(HEX) $(DESTDIR)$(SHAREDIR) install -m 0644 $(USBSERIAL_HEX) $(DESTDIR)$(SHAREDIR) install -d $(DESTDIR)$(MANDIR)/man1 install -m 0644 snek-mega-install.1 $(DESTDIR)$(MANDIR)/man1 clean:: rm -f *.elf snek*.hex *.map snek-mega-install load-direct: $(HEX) avrdude -patmega2560 -cwiring -P/dev/ttyACM0 -b115200 -D -Uflash:w:$(HEX):i snek-1.1/ports/mega/machine/000077500000000000000000000000001353657467200160215ustar00rootroot00000000000000snek-1.1/ports/mega/machine/ieeefp.h000066400000000000000000000231221353657467200174270ustar00rootroot00000000000000#ifndef __IEEE_BIG_ENDIAN #ifndef __IEEE_LITTLE_ENDIAN /* This file can define macros to choose variations of the IEEE float format: _FLT_LARGEST_EXPONENT_IS_NORMAL Defined if the float format uses the largest exponent for finite numbers rather than NaN and infinity representations. Such a format cannot represent NaNs or infinities at all, but it's FLT_MAX is twice the IEEE value. _FLT_NO_DENORMALS Defined if the float format does not support IEEE denormals. Every float with a zero exponent is taken to be a zero representation. ??? At the moment, there are no equivalent macros above for doubles and the macros are not fully supported by --enable-newlib-hw-fp. __IEEE_BIG_ENDIAN Defined if the float format is big endian. This is mutually exclusive with __IEEE_LITTLE_ENDIAN. __IEEE_LITTLE_ENDIAN Defined if the float format is little endian. This is mutually exclusive with __IEEE_BIG_ENDIAN. Note that one of __IEEE_BIG_ENDIAN or __IEEE_LITTLE_ENDIAN must be specified for a platform or error will occur. __IEEE_BYTES_LITTLE_ENDIAN This flag is used in conjunction with __IEEE_BIG_ENDIAN to describe a situation whereby multiple words of an IEEE floating point are in big endian order, but the words themselves are little endian with respect to the bytes. _DOUBLE_IS_32BITS This is used on platforms that support double by using the 32-bit IEEE float type. _FLOAT_ARG This represents what type a float arg is passed as. It is used when the type is not promoted to double. __OBSOLETE_MATH_DEFAULT Default value for __OBSOLETE_MATH if that's not set by the user. It should be set here based on predefined feature macros. __OBSOLETE_MATH If set to 1 then some new math code will be disabled and older libm code will be used instead. This is necessary because the new math code does not support all targets, it assumes that the toolchain has ISO C99 support (hexfloat literals, standard fenv semantics), the target has IEEE-754 conforming binary32 float and binary64 double (not mixed endian) representation, standard SNaN representation, double and single precision arithmetics has similar latency and it has no legacy SVID matherr support, only POSIX errno and fenv exception based error handling. */ #if (defined(__arm__) || defined(__thumb__)) && !defined(__MAVERICK__) /* ARM traditionally used big-endian words; and within those words the byte ordering was big or little endian depending upon the target. Modern floating-point formats are naturally ordered; in this case __VFP_FP__ will be defined, even if soft-float. */ #ifdef __VFP_FP__ # ifdef __ARMEL__ # define __IEEE_LITTLE_ENDIAN # else # define __IEEE_BIG_ENDIAN # endif # if __ARM_FP & 0x8 # define __OBSOLETE_MATH_DEFAULT 0 # endif #else # define __IEEE_BIG_ENDIAN # ifdef __ARMEL__ # define __IEEE_BYTES_LITTLE_ENDIAN # endif #endif #endif #if defined (__aarch64__) #if defined (__AARCH64EL__) #define __IEEE_LITTLE_ENDIAN #else #define __IEEE_BIG_ENDIAN #endif #define __OBSOLETE_MATH_DEFAULT 0 #endif #ifdef __epiphany__ #define __IEEE_LITTLE_ENDIAN #define Sudden_Underflow 1 #endif #ifdef __hppa__ #define __IEEE_BIG_ENDIAN #endif #ifdef __nds32__ #ifdef __big_endian__ #define __IEEE_BIG_ENDIAN #else #define __IEEE_LITTLE_ENDIAN #endif #endif #ifdef __SPU__ #define __IEEE_BIG_ENDIAN #define isfinite(__y) \ (__extension__ ({int __cy; \ (sizeof (__y) == sizeof (float)) ? (1) : \ (__cy = fpclassify(__y)) != FP_INFINITE && __cy != FP_NAN;})) #define isinf(__x) ((sizeof (__x) == sizeof (float)) ? (0) : __isinfd(__x)) #define isnan(__x) ((sizeof (__x) == sizeof (float)) ? (0) : __isnand(__x)) /* * Macros for use in ieeefp.h. We can't just define the real ones here * (like those above) as we have name space issues when this is *not* * included via generic the ieeefp.h. */ #define __ieeefp_isnanf(x) 0 #define __ieeefp_isinff(x) 0 #define __ieeefp_finitef(x) 1 #endif #ifdef __sparc__ #ifdef __LITTLE_ENDIAN_DATA__ #define __IEEE_LITTLE_ENDIAN #else #define __IEEE_BIG_ENDIAN #endif #endif #if defined(__m68k__) || defined(__mc68000__) #define __IEEE_BIG_ENDIAN #endif #if defined(__mc68hc11__) || defined(__mc68hc12__) || defined(__mc68hc1x__) #define __IEEE_BIG_ENDIAN #ifdef __HAVE_SHORT_DOUBLE__ # define _DOUBLE_IS_32BITS #endif #endif #if defined (__H8300__) || defined (__H8300H__) || defined (__H8300S__) || defined (__H8500__) || defined (__H8300SX__) #define __IEEE_BIG_ENDIAN #define _FLOAT_ARG float #define _DOUBLE_IS_32BITS #endif #if defined (__xc16x__) || defined (__xc16xL__) || defined (__xc16xS__) #define __IEEE_LITTLE_ENDIAN #define _FLOAT_ARG float #define _DOUBLE_IS_32BITS #endif #ifdef __sh__ #ifdef __LITTLE_ENDIAN__ #define __IEEE_LITTLE_ENDIAN #else #define __IEEE_BIG_ENDIAN #endif #if defined(__SH2E__) || defined(__SH3E__) || defined(__SH4_SINGLE_ONLY__) || defined(__SH2A_SINGLE_ONLY__) #define _DOUBLE_IS_32BITS #endif #endif #ifdef _AM29K #define __IEEE_BIG_ENDIAN #endif #ifdef _WIN32 #define __IEEE_LITTLE_ENDIAN #endif #ifdef __i386__ #define __IEEE_LITTLE_ENDIAN #endif #ifdef __riscv #define __IEEE_LITTLE_ENDIAN #endif #ifdef __i960__ #define __IEEE_LITTLE_ENDIAN #endif #ifdef __lm32__ #define __IEEE_BIG_ENDIAN #endif #ifdef __M32R__ #define __IEEE_BIG_ENDIAN #endif #ifdef __nvptx__ #define __IEEE_LITTLE_ENDIAN #endif #if defined(_C4x) || defined(_C3x) #define __IEEE_BIG_ENDIAN #define _DOUBLE_IS_32BITS #endif #ifdef __TMS320C6X__ #ifdef _BIG_ENDIAN #define __IEEE_BIG_ENDIAN #else #define __IEEE_LITTLE_ENDIAN #endif #endif #ifdef __TIC80__ #define __IEEE_LITTLE_ENDIAN #endif #ifdef __MIPSEL__ #define __IEEE_LITTLE_ENDIAN #endif #ifdef __MIPSEB__ #define __IEEE_BIG_ENDIAN #endif #ifdef __MMIX__ #define __IEEE_BIG_ENDIAN #endif #ifdef __D30V__ #define __IEEE_BIG_ENDIAN #endif /* necv70 was __IEEE_LITTLE_ENDIAN. */ #ifdef __W65__ #define __IEEE_LITTLE_ENDIAN #define _DOUBLE_IS_32BITS #endif #if defined(__Z8001__) || defined(__Z8002__) #define __IEEE_BIG_ENDIAN #endif #ifdef __m88k__ #define __IEEE_BIG_ENDIAN #endif #ifdef __mn10300__ #define __IEEE_LITTLE_ENDIAN #endif #ifdef __mn10200__ #define __IEEE_LITTLE_ENDIAN #define _DOUBLE_IS_32BITS #endif #ifdef __v800 #define __IEEE_LITTLE_ENDIAN #endif #ifdef __v850 #define __IEEE_LITTLE_ENDIAN #endif #ifdef __D10V__ #define __IEEE_BIG_ENDIAN #if __DOUBLE__ == 32 #define _DOUBLE_IS_32BITS #endif #endif #ifdef __PPC__ #if (defined(_BIG_ENDIAN) && _BIG_ENDIAN) || (defined(_AIX) && _AIX) #define __IEEE_BIG_ENDIAN #else #if (defined(_LITTLE_ENDIAN) && _LITTLE_ENDIAN) || (defined(__sun__) && __sun__) || (defined(_WIN32) && _WIN32) #define __IEEE_LITTLE_ENDIAN #endif #endif #endif #ifdef __xstormy16__ #define __IEEE_LITTLE_ENDIAN #endif #ifdef __arc__ #ifdef __big_endian__ #define __IEEE_BIG_ENDIAN #else #define __IEEE_LITTLE_ENDIAN #endif #endif #ifdef __CRX__ #define __IEEE_LITTLE_ENDIAN #endif #ifdef __fr30__ #define __IEEE_BIG_ENDIAN #endif #ifdef __FT32__ #define __IEEE_LITTLE_ENDIAN #endif #ifdef __mcore__ #define __IEEE_BIG_ENDIAN #endif #ifdef __mt__ #define __IEEE_BIG_ENDIAN #endif #ifdef __frv__ #define __IEEE_BIG_ENDIAN #endif #ifdef __moxie__ #ifdef __MOXIE_BIG_ENDIAN__ #define __IEEE_BIG_ENDIAN #else #define __IEEE_LITTLE_ENDIAN #endif #endif #ifdef __ia64__ #ifdef __BIG_ENDIAN__ #define __IEEE_BIG_ENDIAN #else #define __IEEE_LITTLE_ENDIAN #endif #endif #ifdef __AVR__ #define __IEEE_LITTLE_ENDIAN #define _DOUBLE_IS_32BITS #endif #if defined(__or1k__) || defined(__OR1K__) || defined(__OR1KND__) #define __IEEE_BIG_ENDIAN #endif #ifdef __IP2K__ #define __IEEE_BIG_ENDIAN #define __SMALL_BITFIELDS #define _DOUBLE_IS_32BITS #endif #ifdef __iq2000__ #define __IEEE_BIG_ENDIAN #endif #ifdef __MAVERICK__ #ifdef __ARMEL__ # define __IEEE_LITTLE_ENDIAN #else /* must be __ARMEB__ */ # define __IEEE_BIG_ENDIAN #endif /* __ARMEL__ */ #endif /* __MAVERICK__ */ #ifdef __m32c__ #define __IEEE_LITTLE_ENDIAN #define __SMALL_BITFIELDS #endif #ifdef __CRIS__ #define __IEEE_LITTLE_ENDIAN #endif #ifdef __BFIN__ #define __IEEE_LITTLE_ENDIAN #endif #ifdef __x86_64__ #define __IEEE_LITTLE_ENDIAN #endif #ifdef __mep__ #ifdef __LITTLE_ENDIAN__ #define __IEEE_LITTLE_ENDIAN #else #define __IEEE_BIG_ENDIAN #endif #endif #ifdef __MICROBLAZE__ #ifndef __MICROBLAZEEL__ #define __IEEE_BIG_ENDIAN #else #define __IEEE_LITTLE_ENDIAN #endif #endif #ifdef __MSP430__ #define __IEEE_LITTLE_ENDIAN #define __SMALL_BITFIELDS /* 16 Bit INT */ #endif #ifdef __RL78__ #define __IEEE_LITTLE_ENDIAN #define __SMALL_BITFIELDS /* 16 Bit INT */ #ifndef __RL78_64BIT_DOUBLES__ #define _DOUBLE_IS_32BITS #endif #endif #ifdef __RX__ #ifdef __RX_BIG_ENDIAN__ #define __IEEE_BIG_ENDIAN #else #define __IEEE_LITTLE_ENDIAN #endif #ifndef __RX_64BIT_DOUBLES__ #define _DOUBLE_IS_32BITS #endif #ifdef __RX_16BIT_INTS__ #define __SMALL_BITFIELDS #endif #endif #if (defined(__CR16__) || defined(__CR16C__) ||defined(__CR16CP__)) #define __IEEE_LITTLE_ENDIAN #define __SMALL_BITFIELDS /* 16 Bit INT */ #endif #ifdef __NIOS2__ # ifdef __nios2_big_endian__ # define __IEEE_BIG_ENDIAN # else # define __IEEE_LITTLE_ENDIAN # endif #endif #ifdef __VISIUM__ #define __IEEE_BIG_ENDIAN #endif #ifdef __CYGWIN__ #define __OBSOLETE_MATH_DEFAULT 0 #endif #ifndef __OBSOLETE_MATH_DEFAULT /* Use old math code by default. */ #define __OBSOLETE_MATH_DEFAULT 0 #endif #ifndef __OBSOLETE_MATH #define __OBSOLETE_MATH __OBSOLETE_MATH_DEFAULT #endif #ifndef __IEEE_BIG_ENDIAN #ifndef __IEEE_LITTLE_ENDIAN #error Endianess not declared!! #endif /* not __IEEE_LITTLE_ENDIAN */ #endif /* not __IEEE_BIG_ENDIAN */ #endif /* not __IEEE_LITTLE_ENDIAN */ #endif /* not __IEEE_BIG_ENDIAN */ snek-1.1/ports/mega/snek-mega-install.1000066400000000000000000000040311353657467200200100ustar00rootroot00000000000000.\" .\" Copyright © 2019 Keith Packard .\" .\" 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. .\" .TH SNEK-MEGA-INSTALL 1 "snek-mega-install" "" .SH NAME snek-mega-install \- Install Snek to Arduino Mega .SH SYNOPSIS .B "snek-mega-install" [OPTION]... [COMMAND] .SH DESCRIPTION .I snek-mega-install installs the Snek programming language on an ATmega2560 Arduino Mega board, including the ability to re-program the ATmega16u2 chip used as a usbserial converter. .SH OPTIONS .TP \-port Specifies the serial port to use when programning the ATmega2560 chip, the default is '/dev/ttyACM0'. .TP \-isp Specifies the programmer to use when programming the ATmega16u2 chip used as a usb to serial converter, common options are 'usbtiny' and 'avrisp2'. The default is 'usbtiny'. .TP \-hex Specifies the hex file to load to the board. The default is the currently installed version of Snek when programming the ATmega2560, and the currently installed version of the usbserial program when programming the ATmega16u2. .SH COMMANDS .TP snek Loads Snek to the target device. This is the default command. Note that snekde will not be able to get/put programs to the device without also reprogramming the ATmega16u2 device used as a usb to serial converter on the Arduino Mega board. .TP usbserial Loads the updated usbserial converter firmware to the ATmega16u2 device on the Arduino Mega board. This version supports the XON/XOFF flow control required for SnekDE to be able to successfully communicate with Snek running on the ATmega2560 processor. .SH AUTHOR Keith Packard snek-1.1/ports/mega/snek-mega-install.in000066400000000000000000000022251353657467200202610ustar00rootroot00000000000000#!/bin/sh SHAREDIR="@SHAREDIR@" SNEKMEGA="$SHAREDIR/snek-mega-@SNEK_VERSION@.hex" USBSERIAL="$SHAREDIR/Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex" PORT=/dev/ttyACM0 ISP=usbtiny HEX=default action="snek" mode=arg for i in "$@"; do case "$mode" in arg) case "$i" in snek|usbserial) action="$i" ;; -port|--port) mode=port ;; -isp|--isp) mode=isp ;; -hex|--hex) mode=hex ;; *) echo "Usage: $0 {-port /dev/ttyACM0} {-isp avrisp2} {-hex snek-mega.hex} {snek|usbserial}" 1>&2 exit 1 ;; esac ;; isp) ISP="$i" mode=arg ;; port) PORT="$i" mode=arg ;; hex) HEX="$i" mode=arg ;; esac done case "$HEX" in default) case "$action" in snek) HEX="${SNEKMEGA}" ;; usbserial) HEX="${USBSERIAL}" ;; esac ;; esac case "$action" in snek) avrdude -patmega2560 -cwiring -P$PORT -b115200 -D -U flash:w:"${HEX}":i ;; usbserial) avrdude -pm16u2 -c$ISP -U flash:w:"${HEX}":i ;; *) echo "Usage: $0 {-port /dev/ttyACM0} {-isp avrisp2} {-hex snek-mega.hex} {snek|usbserial}" 1>&2 exit 1 ;; esac snek-1.1/ports/mega/snek-mega-math.builtin000066400000000000000000000025501353657467200206050ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # # # Number-theoretic and representation functions # math.ceil, 1 math.copysign, 2 math.fabs, 1 math.factorial, 1 math.floor, 1 math.fmod, 2 math.frexp, 1 math.fsum, 1 math.gcd, 2 math.isclose, -1 rel_tol,-2 abs_tol,-2 math.isfinite, 1 math.isinf, 1 math.isnan, 1 math.ldexp, 2 math.modf, 1 math.trunc, 1 round, 1 # # Power and logarithmic functions # math.exp, 1 math.log, 1 math.log10, 1 math.pow, 2 # # Trigonometric functions # math.acos, 1 math.asin, 1 math.atan, 1 math.atan2, 2 math.cos, 1 math.hypot, 2 math.sin, 1 math.tan, 1 # # Angular conversion # math.degrees, 1 math.radians, 1 # # Hyperbolic functions # math.cosh, 1 math.sinh, 1 math.tanh, 1 # # Special functions # # # constants # math.pi, -2, 3.141592653589793 math.e, -2, 2.718281828459045 math.tau, -2, 6.283185307179586 math.inf, -2, INFINITY math.nan, -2, NAN snek-1.1/ports/mega/snek-mega.builtin000066400000000000000000000026401353657467200176560ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # D0, -2, 0 D1, -2, 1 D2, -2, 2 D3, -2, 3 D4, -2, 4 D5, -2, 5 D6, -2, 6 D7, -2, 7 D8, -2, 8 D9, -2, 9 D10, -2, 10 D11, -2, 11 D12, -2, 12 D13, -2, 13 D14, -2, 14 D15, -2, 15 D16, -2, 16 D17, -2, 17 D18, -2, 18 D19, -2, 19 D20, -2, 20 D21, -2, 21 D22, -2, 22 D23, -2, 23 D24, -2, 24 D25, -2, 25 D26, -2, 26 D27, -2, 27 D28, -2, 28 D29, -2, 29 D30, -2, 30 D31, -2, 31 D32, -2, 32 D33, -2, 33 D34, -2, 34 D35, -2, 35 D36, -2, 36 D37, -2, 37 D38, -2, 38 D39, -2, 39 D40, -2, 40 D41, -2, 41 D42, -2, 42 D43, -2, 43 D44, -2, 44 D45, -2, 45 D46, -2, 46 D47, -2, 47 D48, -2, 48 D49, -2, 49 D50, -2, 50 D51, -2, 51 D52, -2, 52 D53, -2, 53 A0, -2, 54 A1, -2, 55 A2, -2, 56 A3, -2, 57 A4, -2, 58 A5, -2, 59 A6, -2, 60 A7, -2, 61 A8, -2, 62 A9, -2, 63 A10, -2, 64 A11, -2, 65 A12, -2, 66 A13, -2, 67 A14, -2, 68 A15, -2, 69 #include #include #define SNEK_POOL 6144 snek-1.1/ports/mega/snek-mega.c000066400000000000000000000356511353657467200164420ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include "snek.h" #define NUM_PIN 70 #define A0 54 static uint8_t power_pin; static uint8_t dir_pin; static uint8_t power[NUM_PIN]; static uint8_t on_pins[(NUM_PIN + 7) >> 3]; static uint8_t pull_pins[(NUM_PIN + 7) >> 3]; static inline uint8_t pin_byte(uint8_t p) { return p >> 3; } static inline uint8_t pin_bit(uint8_t p) { return (p & 7); } #define clockCyclesPerMicrosecond (F_CPU / 1000000L) #define clockCyclesToMicroseconds(a) ((a) / clockCyclesPerMicrosecond) // the prescaler is set so that timer0 ticks every 64 clock cycles, and the // the overflow handler is called every 256 ticks. #define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256)) // the whole number of milliseconds per timer0 overflow #define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000) // the fractional number of milliseconds per timer0 overflow. we shift right // by three to fit these numbers into a byte. (for the clock speeds we care // about - 8 and 16 MHz - this doesn't lose precision.) #define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3) #define FRACT_MAX (1000 >> 3) volatile uint32_t timer0_millis = 0; static uint8_t timer0_fract = 0; ISR(TIMER0_OVF_vect) { // copy these to local variables so they can be stored in registers // (volatile variables must be read from memory on every access) uint32_t m = timer0_millis; uint8_t f = timer0_fract; m += MILLIS_INC; f += FRACT_INC; if (f >= FRACT_MAX) { f -= FRACT_MAX; m += 1; } timer0_fract = f; timer0_millis = m; } static void port_init(void) { uint8_t p; /* Enable ADC */ ADCSRA = ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0) | (1 << ADEN)); /* Timer 0 */ TCCR0A = ((1 << WGM01) | (1 << WGM00)); /* / 64 */ TCCR0B = ((0 << CS02) | (1 << CS01) | (1 << CS00) | (0 << WGM02)); /* enable interrupt */ TIMSK0 = (1 << TOIE0); /* Timer 1 */ TCCR1B = ((0 << CS12) | (1 << CS11) | (1 << CS10)); TCCR1A = ((0 << WGM12) | (0 << WGM11) | (1 << WGM10)); OCR1AH = 0; OCR1BH = 0; /* Timer 2 */ TCCR2B = ((1 << CS22) | (0 << CS21) | (0 << CS20)); TCCR2A = ((1 << WGM20)); /* Timer 3 */ TCCR3B = ((0 << CS12) | (1 << CS11) | (1 << CS10)); TCCR3A = ((0 << WGM12) | (0 << WGM11) | (1 << WGM10)); OCR3AH = 0; OCR3BH = 0; /* Timer 4 */ TCCR4B = ((0 << CS12) | (1 << CS11) | (1 << CS10)); TCCR4A = ((0 << WGM12) | (0 << WGM11) | (1 << WGM10)); OCR4AH = 0; OCR4BH = 0; /* Timer 5 */ TCCR5B = ((0 << CS12) | (1 << CS11) | (1 << CS10)); TCCR5A = ((0 << WGM12) | (0 << WGM11) | (1 << WGM10)); OCR5AH = 0; OCR5BH = 0; memset(power, 0xff, NUM_PIN); memset(pull_pins, 0x00, NUM_PIN); for (p = 0; p < A0; p++) pull_pins[pin_byte(p)] |= (1 << pin_bit(p)); } FILE snek_duino_file = FDEV_SETUP_STREAM(snek_uart_putchar, snek_eeprom_getchar, _FDEV_SETUP_RW); #include int __attribute__((OS_main)) main (void) { MCUSR = 0; wdt_disable(); stderr = stdout = stdin = &snek_duino_file; snek_uart_init(); port_init(); snek_init(); for (;;) snek_parse(); } snek_poly_t snek_builtin_reset(void) { wdt_enable(WDTO_15MS); for(;;); return SNEK_NULL; } #define PA 1 #define PB 2 #define PC 3 #define PD 4 #define PE 5 #define PF 6 #define PG 7 #define PH 8 #define PJ 10 #define PK 11 #define PL 12 #define NOT_A_PIN 0 #define NOT_A_PORT 0 typedef volatile uint8_t vuint8_t; static vuint8_t * PROGMEM const port_to_mode_PGM[] = { NOT_A_PORT, &DDRA, &DDRB, &DDRC, &DDRD, &DDRE, &DDRF, &DDRG, &DDRH, NOT_A_PORT, &DDRJ, &DDRK, &DDRL, }; static vuint8_t * PROGMEM const port_to_output_PGM[] = { NOT_A_PORT, &PORTA, &PORTB, &PORTC, &PORTD, &PORTE, &PORTF, &PORTG, &PORTH, NOT_A_PORT, &PORTJ, &PORTK, &PORTL, }; static vuint8_t * PROGMEM const port_to_input_PGM[] = { NOT_A_PIN, &PINA, &PINB, &PINC, &PIND, &PINE, &PINF, &PING, &PINH, NOT_A_PIN, &PINJ, &PINK, &PINL, }; const uint8_t PROGMEM digital_pin_to_port_PGM[] = { // PORTLIST // ------------------------------------------- PE , // PE 0 ** 0 ** USART0_RX PE , // PE 1 ** 1 ** USART0_TX PE , // PE 4 ** 2 ** PWM2 PE , // PE 5 ** 3 ** PWM3 PG , // PG 5 ** 4 ** PWM4 PE , // PE 3 ** 5 ** PWM5 PH , // PH 3 ** 6 ** PWM6 PH , // PH 4 ** 7 ** PWM7 PH , // PH 5 ** 8 ** PWM8 PH , // PH 6 ** 9 ** PWM9 PB , // PB 4 ** 10 ** PWM10 PB , // PB 5 ** 11 ** PWM11 PB , // PB 6 ** 12 ** PWM12 PB , // PB 7 ** 13 ** PWM13 PJ , // PJ 1 ** 14 ** USART3_TX PJ , // PJ 0 ** 15 ** USART3_RX PH , // PH 1 ** 16 ** USART2_TX PH , // PH 0 ** 17 ** USART2_RX PD , // PD 3 ** 18 ** USART1_TX PD , // PD 2 ** 19 ** USART1_RX PD , // PD 1 ** 20 ** I2C_SDA PD , // PD 0 ** 21 ** I2C_SCL PA , // PA 0 ** 22 ** D22 PA , // PA 1 ** 23 ** D23 PA , // PA 2 ** 24 ** D24 PA , // PA 3 ** 25 ** D25 PA , // PA 4 ** 26 ** D26 PA , // PA 5 ** 27 ** D27 PA , // PA 6 ** 28 ** D28 PA , // PA 7 ** 29 ** D29 PC , // PC 7 ** 30 ** D30 PC , // PC 6 ** 31 ** D31 PC , // PC 5 ** 32 ** D32 PC , // PC 4 ** 33 ** D33 PC , // PC 3 ** 34 ** D34 PC , // PC 2 ** 35 ** D35 PC , // PC 1 ** 36 ** D36 PC , // PC 0 ** 37 ** D37 PD , // PD 7 ** 38 ** D38 PG , // PG 2 ** 39 ** D39 PG , // PG 1 ** 40 ** D40 PG , // PG 0 ** 41 ** D41 PL , // PL 7 ** 42 ** D42 PL , // PL 6 ** 43 ** D43 PL , // PL 5 ** 44 ** D44 PL , // PL 4 ** 45 ** D45 PL , // PL 3 ** 46 ** D46 PL , // PL 2 ** 47 ** D47 PL , // PL 1 ** 48 ** D48 PL , // PL 0 ** 49 ** D49 PB , // PB 3 ** 50 ** SPI_MISO PB , // PB 2 ** 51 ** SPI_MOSI PB , // PB 1 ** 52 ** SPI_SCK PB , // PB 0 ** 53 ** SPI_SS PF , // PF 0 ** 54 ** A0 PF , // PF 1 ** 55 ** A1 PF , // PF 2 ** 56 ** A2 PF , // PF 3 ** 57 ** A3 PF , // PF 4 ** 58 ** A4 PF , // PF 5 ** 59 ** A5 PF , // PF 6 ** 60 ** A6 PF , // PF 7 ** 61 ** A7 PK , // PK 0 ** 62 ** A8 PK , // PK 1 ** 63 ** A9 PK , // PK 2 ** 64 ** A10 PK , // PK 3 ** 65 ** A11 PK , // PK 4 ** 66 ** A12 PK , // PK 5 ** 67 ** A13 PK , // PK 6 ** 68 ** A14 PK , // PK 7 ** 69 ** A15 }; const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { // PIN IN PORT // ------------------------------------------- _BV( 0 ) , // PE 0 ** 0 ** USART0_RX _BV( 1 ) , // PE 1 ** 1 ** USART0_TX _BV( 4 ) , // PE 4 ** 2 ** PWM2 _BV( 5 ) , // PE 5 ** 3 ** PWM3 _BV( 5 ) , // PG 5 ** 4 ** PWM4 _BV( 3 ) , // PE 3 ** 5 ** PWM5 _BV( 3 ) , // PH 3 ** 6 ** PWM6 _BV( 4 ) , // PH 4 ** 7 ** PWM7 _BV( 5 ) , // PH 5 ** 8 ** PWM8 _BV( 6 ) , // PH 6 ** 9 ** PWM9 _BV( 4 ) , // PB 4 ** 10 ** PWM10 _BV( 5 ) , // PB 5 ** 11 ** PWM11 _BV( 6 ) , // PB 6 ** 12 ** PWM12 _BV( 7 ) , // PB 7 ** 13 ** PWM13 _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX _BV( 1 ) , // PH 1 ** 16 ** USART2_TX _BV( 0 ) , // PH 0 ** 17 ** USART2_RX _BV( 3 ) , // PD 3 ** 18 ** USART1_TX _BV( 2 ) , // PD 2 ** 19 ** USART1_RX _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL _BV( 0 ) , // PA 0 ** 22 ** D22 _BV( 1 ) , // PA 1 ** 23 ** D23 _BV( 2 ) , // PA 2 ** 24 ** D24 _BV( 3 ) , // PA 3 ** 25 ** D25 _BV( 4 ) , // PA 4 ** 26 ** D26 _BV( 5 ) , // PA 5 ** 27 ** D27 _BV( 6 ) , // PA 6 ** 28 ** D28 _BV( 7 ) , // PA 7 ** 29 ** D29 _BV( 7 ) , // PC 7 ** 30 ** D30 _BV( 6 ) , // PC 6 ** 31 ** D31 _BV( 5 ) , // PC 5 ** 32 ** D32 _BV( 4 ) , // PC 4 ** 33 ** D33 _BV( 3 ) , // PC 3 ** 34 ** D34 _BV( 2 ) , // PC 2 ** 35 ** D35 _BV( 1 ) , // PC 1 ** 36 ** D36 _BV( 0 ) , // PC 0 ** 37 ** D37 _BV( 7 ) , // PD 7 ** 38 ** D38 _BV( 2 ) , // PG 2 ** 39 ** D39 _BV( 1 ) , // PG 1 ** 40 ** D40 _BV( 0 ) , // PG 0 ** 41 ** D41 _BV( 7 ) , // PL 7 ** 42 ** D42 _BV( 6 ) , // PL 6 ** 43 ** D43 _BV( 5 ) , // PL 5 ** 44 ** D44 _BV( 4 ) , // PL 4 ** 45 ** D45 _BV( 3 ) , // PL 3 ** 46 ** D46 _BV( 2 ) , // PL 2 ** 47 ** D47 _BV( 1 ) , // PL 1 ** 48 ** D48 _BV( 0 ) , // PL 0 ** 49 ** D49 _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK _BV( 0 ) , // PB 0 ** 53 ** SPI_SS _BV( 0 ) , // PF 0 ** 54 ** A0 _BV( 1 ) , // PF 1 ** 55 ** A1 _BV( 2 ) , // PF 2 ** 56 ** A2 _BV( 3 ) , // PF 3 ** 57 ** A3 _BV( 4 ) , // PF 4 ** 58 ** A4 _BV( 5 ) , // PF 5 ** 59 ** A5 _BV( 6 ) , // PF 6 ** 60 ** A6 _BV( 7 ) , // PF 7 ** 61 ** A7 _BV( 0 ) , // PK 0 ** 62 ** A8 _BV( 1 ) , // PK 1 ** 63 ** A9 _BV( 2 ) , // PK 2 ** 64 ** A10 _BV( 3 ) , // PK 3 ** 65 ** A11 _BV( 4 ) , // PK 4 ** 66 ** A12 _BV( 5 ) , // PK 5 ** 67 ** A13 _BV( 6 ) , // PK 6 ** 68 ** A14 _BV( 7 ) , // PK 7 ** 69 ** A15 }; static volatile uint8_t * ddr_reg(uint8_t pin) { return pgm_read_ptr(&port_to_mode_PGM[pgm_read_byte(&digital_pin_to_port_PGM[pin])]); } static volatile uint8_t * pin_reg(uint8_t pin) { return pgm_read_ptr(&port_to_input_PGM[pgm_read_byte(&digital_pin_to_port_PGM[pin])]); } static volatile uint8_t * port_reg(uint8_t pin) { return pgm_read_ptr(&port_to_output_PGM[pgm_read_byte(&digital_pin_to_port_PGM[pin])]); } static uint8_t bit(uint8_t pin) { return pgm_read_byte(&digital_pin_to_bit_mask_PGM[pin]); } static volatile uint8_t * const PROGMEM ocr_reg_addrs[NUM_PIN] = { [2] = &OCR3BL, [3] = &OCR3CL, [4] = &OCR0B, [5] = &OCR3AL, [6] = &OCR4AL, [7] = &OCR4BL, [8] = &OCR4CL, [9] = &OCR2B, [10] = &OCR2A, [11] = &OCR1AL, [12] = &OCR1BL, [13] = &OCR0A, [44] = &OCR5CL, [45] = &OCR5BL, [46] = &OCR5AL, }; static volatile uint8_t * ocr_reg(uint8_t pin) { return (volatile uint8_t *) pgm_read_ptr(&ocr_reg_addrs[pin]); } static bool has_pwm(uint8_t p) { return ocr_reg(p) != NULL; } static volatile uint8_t * const PROGMEM tcc_reg_addrs[] = { [2] = &TCCR3A, [3] = &TCCR3A, [4] = &TCCR0A, [5] = &TCCR3A, [6] = &TCCR4A, [7] = &TCCR4A, [8] = &TCCR4A, [9] = &TCCR2A, [10] = &TCCR2A, [11] = &TCCR1A, [12] = &TCCR1A, [13] = &TCCR0A, [44] = &TCCR5A, [45] = &TCCR5A, [46] = &TCCR5A, }; static volatile uint8_t * tcc_reg(uint8_t pin) { return (volatile uint8_t *) pgm_read_ptr(&tcc_reg_addrs[pin]); } static uint8_t const PROGMEM tcc_vals[] = { [2] = (0 << COM3B0) | (1 << COM3B1), [3] = (0 << COM3C0) | (1 << COM3C1), [4] = (0 << COM0B0) | (1 << COM0B1), [5] = (0 << COM3A0) | (1 << COM3A1), [6] = (0 << COM4A0) | (1 << COM4A1), [7] = (0 << COM4B0) | (1 << COM4B1), [8] = (0 << COM4C0) | (1 << COM4C1), [9] = (0 << COM2B0) | (1 << COM2B1), [10] = (0 << COM2A0) | (1 << COM2A1), [11] = (0 << COM1A0) | (1 << COM1A1), [12] = (0 << COM1B0) | (1 << COM1B1), [13] = (0 << COM0A0) | (1 << COM0A1), [44] = (0 << COM5C0) | (1 << COM5C1), [45] = (0 << COM5B0) | (1 << COM5B1), [46] = (0 << COM5A0) | (1 << COM5A1), }; static uint8_t tcc_val(uint8_t pin) { return (uint8_t) pgm_read_byte(&tcc_vals[pin]); } static bool is_pull(uint8_t pin) { return (pull_pins[pin_byte(pin)] >> pin_bit(pin)) & 1; } static void set_dir(uint8_t pin, uint8_t d) { volatile uint8_t *r = ddr_reg(pin); volatile uint8_t *p = port_reg(pin); uint8_t b = bit(pin); if (d) { *r |= b; } else { *r &= ~b; if (is_pull(pin)) *p |= b; else *p &= ~b; } } static uint8_t snek_poly_get_pin(snek_poly_t a) { snek_soffset_t p = snek_poly_get_soffset(a); if (p < 0 || NUM_PIN <= p) snek_error_value(a); return p; } snek_poly_t snek_builtin_talkto(snek_poly_t a) { snek_list_t *l; uint8_t p, d; if (snek_poly_type(a) == snek_list) { l = snek_poly_to_list(a); p = snek_poly_get_pin(snek_list_get(l, SNEK_ZERO, true)); d = snek_poly_get_pin(snek_list_get(l, SNEK_ONE, true)); } else { p = d = snek_poly_get_pin(a); } if (!snek_abort) { set_dir(p, 1); set_dir(d, 1); power_pin = p; dir_pin = d; } return SNEK_NULL; } static bool is_on(uint8_t pin) { return (on_pins[pin_byte(pin)] >> pin_bit(pin)) & 1; } static void set_on(uint8_t pin) { on_pins[pin_byte(pin)] |= 1 << pin_bit(pin); } static void set_off(uint8_t pin) { on_pins[pin_byte(pin)] &= ~(1 << pin_bit(pin)); } static snek_poly_t set_out(uint8_t pin) { uint8_t p = 0; if (is_on(pin)) p = power[pin]; if (has_pwm(pin)) { if (0 < p && p < 255) { *ocr_reg(pin) = p; *tcc_reg(pin) |= tcc_val(pin); return SNEK_NULL; } *tcc_reg(pin) &= ~tcc_val(pin); } if (p) *port_reg(pin) |= bit(pin); else *port_reg(pin) &= ~bit(pin); return SNEK_NULL; } snek_poly_t snek_builtin_setpower(snek_poly_t a) { float p = snek_poly_get_float(a); if (p < 0.0f) p = 0.0f; if (p > 1.0f) p = 1.0f; power[power_pin] = (uint8_t) (p * 255.0f + 0.5f); return set_out(power_pin); } snek_poly_t snek_builtin_setleft(void) { set_on(dir_pin); return set_out(dir_pin); } snek_poly_t snek_builtin_setright(void) { set_off(dir_pin); return set_out(dir_pin); } snek_poly_t snek_builtin_on(void) { set_on(power_pin); return set_out(power_pin); } snek_poly_t snek_builtin_off(void) { set_off(power_pin); return set_out(power_pin); } snek_poly_t snek_builtin_onfor(snek_poly_t a) { snek_builtin_on(); snek_builtin_time_sleep(a); return snek_builtin_off(); } snek_poly_t snek_builtin_pullnone(snek_poly_t a) { uint8_t p = snek_poly_get_pin(a); if (!snek_abort) pull_pins[pin_byte(p)] &= ~(1 << pin_bit(p)); return SNEK_NULL; } snek_poly_t snek_builtin_pullup(snek_poly_t a) { uint8_t p = snek_poly_get_pin(a); if (!snek_abort) pull_pins[pin_byte(p)] |= (1 << pin_bit(p)); return SNEK_NULL; } #define analog_reference 1 snek_poly_t snek_builtin_read(snek_poly_t a) { uint8_t p = snek_poly_get_pin(a); if (snek_abort) return SNEK_NULL; set_dir(p, 0); if (p >= A0) { uint8_t pin = p - A0; ADMUX = (analog_reference << REFS0) | (pin & 15); ADCSRA |= (1 << ADSC); while (ADCSRA & (1 << ADSC)) ; uint8_t low = ADCL; uint8_t high = ADCH; float value = ((uint16_t) high << 8 | low) / 1023.0; return snek_float_to_poly(value); } else { return snek_bool_to_poly(*pin_reg(p) & bit(p)); } } snek_poly_t snek_builtin_stopall(void) { uint8_t p; for (p = 0; p < NUM_PIN; p++) if (is_on(p)) { set_off(p); set_out(p); } return SNEK_NULL; } static uint32_t snek_millis(void) { uint32_t millis; cli(); millis = timer0_millis; sei(); return millis; } snek_poly_t snek_builtin_time_sleep(snek_poly_t a) { uint32_t expire = snek_millis() + (snek_poly_get_float(a) * 1000.0f + 0.5f); while (!snek_abort && (int32_t) (expire - snek_millis()) > 0) ; return SNEK_NULL; } snek_poly_t snek_builtin_time_monotonic(void) { return snek_float_to_poly(snek_millis() / 1000.0f); } static uint32_t random_next; snek_poly_t snek_builtin_random_seed(snek_poly_t a) { random_next = a.u; return SNEK_NULL; } snek_poly_t snek_builtin_random_randrange(snek_poly_t a) { random_next = random_next * 1103515245L + 12345L; return snek_float_to_poly(random_next % snek_poly_get_soffset(a)); } snek-1.1/ports/metrom0/000077500000000000000000000000001353657467200150675ustar00rootroot00000000000000snek-1.1/ports/metrom0/.gitignore000066400000000000000000000000511353657467200170530ustar00rootroot00000000000000*.bin *.map *.uf2 *.elf *.o ao-product.h snek-1.1/ports/metrom0/Makefile000066400000000000000000000023751353657467200165360ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_ROOT = ../.. SNEK_SAMD21 = $(SNEK_ROOT)/chips/samd21 PROGNAME=snek-metrom0 PRODUCT_NAME=SnekMetroM0 IDPRODUCT=0x8013 IDVENDOR=0x239A include $(SNEK_SAMD21)/snek-samd21.defs SNEK_LOCAL_SRC = \ $(SNEK_SAMD21_SRC) SNEK_LOCAL_INC = \ $(SNEK_SAMD21_INC) SNEK_LOCAL_BUILTINS = \ $(SNEK_SAMD21_BUILTINS) \ snek-metrom0.builtin include $(SNEK_ROOT)/snek-install.defs SRC=$(SNEK_SRC) OBJ=$(SRC:.c=.o) all: $(ELF) $(BIN) $(UF2) $(PROG): Makefile $(OBJ) $(call quiet,CC) $(LDFLAGS) -Wl,-M=$(MAP) -o $@ $(OBJ) $(LIBS) $(OBJ): $(SNEK_INC) distclean: clean clean:: rm -f *.o *.elf *.bin *.uf2 *.map ao-product.h install: install -d $(DESTDIR)$(SHAREDIR) install -m 0644 $(UF2) $(DESTDIR)$(SHAREDIR) uninstall: snek-1.1/ports/metrom0/ao-pins.h000066400000000000000000000170321353657467200166110ustar00rootroot00000000000000/* * Copyright © 2012 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _AO_PINS_H_ #define _AO_PINS_H_ /* Run dffl48m clock at 48MHz */ #define AO_DFLL48M 48000000 /* Reference clock is 32.768kHz */ #define AO_XOSC32K 32768 #define AO_AHB_PRESCALER 1 #define AO_APBA_PRESCALER 1 #define HAS_SERIAL_0 1 #define USE_SERIAL_0_STDIN 0 #define SERIAL_0_PA10_PA11 1 #define HAS_USB 1 #define AO_USB_OUT_HOOK 1 #define USE_USB_FIFO 1 #define HAS_BEEP 0 #define AO_SNEK_TIMER_FUNC_E 0 #define AO_SNEK_TIMER_FUNC_F 0x80 #define AO_SNEK_TIMER_FUNC_MASK 0x80 #define AO_SNEK_TIMER_DEV_TCC 0 #define AO_SNEK_TIMER_DEV_TC 0x40 #define AO_SNEK_TIMER_DEV_MASK 0x40 #define AO_SNEK_TIMER_CH_MASK 0x0f #define AO_SNEK_TIMER_CH(ch,func,dev) ((ch) | (func) | (dev)) /* * * Name Pin E F tcc0 tcc1 tcc2 tc3 tc4 tc5 * 0 1 2 3 0 1 0 1 0 1 0 1 0 1 * * * * * * * * * * * * D2 PA14 TC3_0 TCC0_4 - * D3 PA9 TCC0_1 TCC1_3 1 TCC0_1 * D4 PA8 TCC0_0 TCC1_2 0 TCC0_0 * D5 PA15 TC3_1 TCC0_5 1 TC3_1 * D6 PA20 TCC0_6 6 TCC0_6 * D7 PA21 TCC0_7 7 TCC0_7 * D8 PA6 TCC1_0 0 TCC1_0 * D9 PA7 TCC1_1 1 TCC1_1 * D10 PA18 TC3_0 TCC0_2 0 TC3_0 * D11 PA16 TCC2_0 TCC0_6 0 TCC2_0 * D12 PA19 TC3_1 TCC0_3 - * D13 PA17 TCC2_1 TCC0_7 1 TCC2_1 * tcc0 * 0 D4 E * 1 D3 E * 2 * 3 * 4 * 5 * 6 D6 F * 7 D7 F * tcc1 * 0 D8 E * 1 D9 E * tcc2 * 0 D11 E * 1 D13 E * tcc3 * doesn't appear to exist in this chip * tc3 * 0 D10 E D5 E * 1 D12 E D2 E * tc4 * 0 * 1 * tc5 * 0 * 1 * tc6 * 0 * 1 * tc7 * 0 pin 6 E * 1 pin 7 E * */ #define AO_SNEK_ADC_0 0xff #define AO_SNEK_ADC_1 0xff #define AO_SNEK_ADC_2 0xff #define AO_SNEK_ADC_3 0xff #define AO_SNEK_ADC_4 0xff #define AO_SNEK_ADC_5 0xff #define AO_SNEK_ADC_6 0xff #define AO_SNEK_ADC_7 0xff #define AO_SNEK_ADC_8 0xff #define AO_SNEK_ADC_9 0xff #define AO_SNEK_ADC_10 0xff #define AO_SNEK_ADC_11 0xff #define AO_SNEK_ADC_12 0xff #define AO_SNEK_ADC_13 0xff #define AO_SNEK_GPIO_0 (&samd21_port_a) #define AO_SNEK_PIN_0 11 #define AO_SNEK_TIMER_0 NULL #define AO_SNEK_CHANNEL_0 0 #define AO_SNEK_GPIO_1 (&samd21_port_a) #define AO_SNEK_PIN_1 10 #define AO_SNEK_TIMER_1 NULL #define AO_SNEK_CHANNEL_1 0 #define AO_SNEK_GPIO_2 (&samd21_port_a) /* arduino D4 */ #define AO_SNEK_PIN_2 14 #define AO_SNEK_TIMER_2 NULL #define AO_SNEK_CHANNEL_2 0 #define AO_SNEK_GPIO_3 (&samd21_port_a) /* arduino D3 */ #define AO_SNEK_PIN_3 9 #define AO_SNEK_TIMER_3 (&samd21_tcc0) #define AO_SNEK_CHANNEL_3 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_4 (&samd21_port_a) /* arduino D2 */ #define AO_SNEK_PIN_4 8 #define AO_SNEK_TIMER_4 (&samd21_tcc0) #define AO_SNEK_CHANNEL_4 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_5 (&samd21_port_a) /* arduino D5 */ #define AO_SNEK_PIN_5 15 #define AO_SNEK_TIMER_5 (&samd21_tc3) #define AO_SNEK_CHANNEL_5 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) #define AO_SNEK_GPIO_6 (&samd21_port_a) /* arduino D6 */ #define AO_SNEK_PIN_6 20 #define AO_SNEK_TIMER_6 (&samd21_tcc0) #define AO_SNEK_CHANNEL_6 AO_SNEK_TIMER_CH(6 & 3, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_7 (&samd21_port_a) /* arduino D7 */ #define AO_SNEK_PIN_7 21 #define AO_SNEK_TIMER_7 (&samd21_tcc0) #define AO_SNEK_CHANNEL_7 AO_SNEK_TIMER_CH(7 & 3, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_8 (&samd21_port_a) /* arduino D8 */ #define AO_SNEK_PIN_8 6 #define AO_SNEK_TIMER_8 (&samd21_tcc1) #define AO_SNEK_CHANNEL_8 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_9 (&samd21_port_a) /* arduino D9 */ #define AO_SNEK_PIN_9 7 #define AO_SNEK_TIMER_9 (&samd21_tcc1) #define AO_SNEK_CHANNEL_9 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_10 (&samd21_port_a) /* arduino D10 */ #define AO_SNEK_PIN_10 18 #define AO_SNEK_TIMER_10 (&samd21_tc3) #define AO_SNEK_CHANNEL_10 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) #define AO_SNEK_GPIO_11 (&samd21_port_a) /* ardunio D11 */ #define AO_SNEK_PIN_11 16 #define AO_SNEK_TIMER_11 (&samd21_tcc2) #define AO_SNEK_CHANNEL_11 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_GPIO_12 (&samd21_port_a) /* arduino D12 */ #define AO_SNEK_PIN_12 19 #define AO_SNEK_TIMER_12 NULL #define AO_SNEK_CHANNEL_12 0 #define AO_SNEK_GPIO_13 (&samd21_port_a) /* arduino D13 */ #define AO_SNEK_PIN_13 17 #define AO_SNEK_TIMER_13 (&samd21_tcc2) #define AO_SNEK_CHANNEL_13 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) /* analog */ #define AO_SNEK_GPIO_14 (&samd21_port_a) #define AO_SNEK_PIN_14 2 #define AO_SNEK_TIMER_14 NULL #define AO_SNEK_CHANNEL_14 0 #define AO_SNEK_ADC_14 0 #define AO_SNEK_GPIO_15 (&samd21_port_b) #define AO_SNEK_PIN_15 8 #define AO_SNEK_TIMER_15 NULL #define AO_SNEK_CHANNEL_15 0 #define AO_SNEK_ADC_15 2 #define AO_SNEK_GPIO_16 (&samd21_port_b) #define AO_SNEK_PIN_16 9 #define AO_SNEK_TIMER_16 NULL #define AO_SNEK_CHANNEL_16 0 #define AO_SNEK_ADC_16 3 #define AO_SNEK_GPIO_17 (&samd21_port_a) #define AO_SNEK_PIN_17 4 #define AO_SNEK_TIMER_17 NULL #define AO_SNEK_CHANNEL_17 0 #define AO_SNEK_ADC_17 4 #define AO_SNEK_GPIO_18 (&samd21_port_a) #define AO_SNEK_PIN_18 5 #define AO_SNEK_TIMER_18 NULL #define AO_SNEK_CHANNEL_18 0 #define AO_SNEK_ADC_18 5 #define AO_SNEK_GPIO_19 (&samd21_port_b) #define AO_SNEK_PIN_19 2 #define AO_SNEK_TIMER_19 NULL #define AO_SNEK_CHANNEL_19 0 #define AO_SNEK_ADC_19 10 /* SDA */ #define AO_SNEK_GPIO_20 (&samd21_port_a) #define AO_SNEK_PIN_20 22 #define AO_SNEK_TIMER_20 NULL #define AO_SNEK_CHANNEL_20 0 #define AO_SNEK_ADC_20 0xff /* SCL */ #define AO_SNEK_GPIO_21 (&samd21_port_a) #define AO_SNEK_PIN_21 23 #define AO_SNEK_TIMER_21 NULL #define AO_SNEK_CHANNEL_21 0 #define AO_SNEK_ADC_21 0xff /* NEOPIX */ #define AO_SNEK_GPIO_22 (&samd21_port_a) #define AO_SNEK_PIN_22 30 #define AO_SNEK_TIMER_22 NULL #define AO_SNEK_CHANNEL_22 0 #define AO_SNEK_ADC_22 0xff #define AO_SNEK_NUM_PIN 23 #define LED_0_PORT (&samd21_port_a) #define LED_0_PIN 27 #define LED_0_INVERT 1 #define LED_PIN_TX 0 #define AO_LED_TX (1 << LED_PIN_TX) #define AO_LED_PANIC AO_LED_TX #define LEDS_AVAILABLE (AO_LED_TX) #endif /* _AO_PINS_H_ */ snek-1.1/ports/metrom0/snek-metrom0.builtin000066400000000000000000000014471353657467200210060ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # D0, -2, 0 D1, -2, 1 D2, -2, 2 D3, -2, 3 D4, -2, 4 D5, -2, 5 D6, -2, 6 D7, -2, 7 D8, -2, 8 D9, -2, 9 D10, -2, 10 D11, -2, 11 D12, -2, 12 D13, -2, 13 A0, -2, 14 A1, -2, 15 A2, -2, 16 A3, -2, 17 A4, -2, 18 A5, -2, 19 SDA, -2, 20 SCL, -2, 21 NEOPIXEL, -2, 22 snek-1.1/ports/playground/000077500000000000000000000000001353657467200156705ustar00rootroot00000000000000snek-1.1/ports/playground/.gitignore000066400000000000000000000000511353657467200176540ustar00rootroot00000000000000*.bin *.map *.uf2 *.elf *.o ao-product.h snek-1.1/ports/playground/Makefile000066400000000000000000000024701353657467200173330ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_ROOT = ../.. SNEK_SAMD21 = $(SNEK_ROOT)/chips/samd21 PROGNAME=snek-playground PRODUCT_NAME=SnekPlayground IDPRODUCT=0x8018 IDVENDOR=0x239A include $(SNEK_SAMD21)/snek-samd21.defs SNEK_LOCAL_SRC = \ snek-temperature.c \ $(SNEK_SAMD21_SRC) SNEK_LOCAL_INC = \ $(SNEK_SAMD21_INC) SNEK_LOCAL_BUILTINS = \ $(SNEK_SAMD21_BUILTINS) \ snek-temperature.builtin \ snek-playground.builtin include $(SNEK_ROOT)/snek-install.defs SRC=$(SNEK_SRC) OBJ=$(SRC:.c=.o) all: $(ELF) $(BIN) $(UF2) $(PROG): Makefile $(OBJ) $(call quiet,CC) $(LDFLAGS) -Wl,-M=$(MAP) -o $@ $(OBJ) $(LIBS) $(OBJ): $(SNEK_INC) distclean: clean clean:: rm -f *.o *.elf *.bin *.uf2 *.map ao-product.h install: install -d $(DESTDIR)$(SHAREDIR) install -m 0644 $(UF2) $(DESTDIR)$(SHAREDIR) uninstall: snek-1.1/ports/playground/ao-pins.h000066400000000000000000000203131353657467200174060ustar00rootroot00000000000000/* * Copyright © 2012 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _AO_PINS_H_ #define _AO_PINS_H_ /* Run dffl48m clock at 48MHz */ #define AO_DFLL48M 48000000 #define AO_AHB_PRESCALER 1 #define AO_APBA_PRESCALER 1 #define HAS_SERIAL_0 1 #define USE_SERIAL_0_STDIN 0 #define SERIAL_0_PA10_PA11 1 #define HAS_USB 1 #define AO_USB_OUT_HOOK 1 #define USE_USB_FIFO 1 #define HAS_BEEP 0 #define AO_SNEK_TIMER_FUNC_E 0 #define AO_SNEK_TIMER_FUNC_F 0x80 #define AO_SNEK_TIMER_FUNC_MASK 0x80 #define AO_SNEK_TIMER_DEV_TCC 0 #define AO_SNEK_TIMER_DEV_TC 0x40 #define AO_SNEK_TIMER_DEV_MASK 0x40 #define AO_SNEK_TIMER_CH_MASK 0x0f #define AO_SNEK_TIMER_CH(ch,func,dev) ((ch) | (func) | (dev)) /* * Available: * * tcc0, tcc3 0-7 (4-7 overlay 0-3) * tcc1 0-3 (2-3 overlay 0-1) * tcc2 0-1 * TC6-7 not available * * * Names Pin E F Arduino Snek * * A0/SPEAKER PA02 TCC2.0 none TCC2.0 F * A1/D6 PA05 TCC0.1 TCC3.3 TCC0.1 TCC0.1 E * A2/D9 PA06 TCC1.0 TCC3.4 TCC1.0 TCC1.0 E * A3/D10 PA07 TCC1.1 TCC3.5 TCC1.1 TCC1.1 E * A4/D3/SCL PB03 TC6.1 TCC3.3 none TCC3.3 F * A5/D2/SDA PB02 TC6.0 TCC3.2 none TCC3.2 F * A6/D0/RX PB09 TC4.1 TCC3.7 TC4.1 TC4.1 E * A7/D1/TX PB08 TC4.0 TCC3.6 TC4.0 TC4.0 E * A8/LIGHT PA11 TCC1.1 TCC0.3 none none * A9/TEMPSENSE PA09 TCC0.1 TCC1.3 none TCC1.3 F * D4/BUTTONA PA28 TCC3.7 none none * D5/BUTTONB PA14 TC3.0 TCC0.4 none none * D7/SWITCH PA15 TC3.1 TCC0.5 TC3.1 none * D8/NEOPIXEL PB23 none none * D11/REMOTEOUT PA23 TC4.1 TCC0.5 TC4.1 none * D12/REMOTEIN PA12 none none * D13/LED PA17 TCC2.1 TCC0.7 none TCC0.7 F * D27/LISIRQ PA13 TCC2.1 TCC0.7 none none * D32/FLASHMISO PA16 TCC2.0 TCC0.6 none none * D33/FLASHSCK PA21 TCC0.7 none none * D34/FLASHMOSI PA20 TCC0.6 TCC0.6 none * D35/FLASHCS PB22 TCC3.0 none none * I2SCK PA10 TCC1.0 TCC0.3 none none * I2SDO PA08 TCC0.0 TCC1.2 TCC0.0 none * LISSDA PA00 none none * LISSCL PA01 none none * * Use this as the 'busy' indicator * TXLED PA27 */ /* A0/SPEAKER */ #define AO_SNEK_GPIO_0 (&samd21_port_a) #define AO_SNEK_PIN_0 2 #define AO_SNEK_TIMER_0 (&samd21_tcc2) #define AO_SNEK_CHANNEL_0 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_0 0 /* A1/D6 */ #define AO_SNEK_GPIO_1 (&samd21_port_a) #define AO_SNEK_PIN_1 5 #define AO_SNEK_TIMER_1 (&samd21_tcc0) #define AO_SNEK_CHANNEL_1 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_1 5 /* A2 */ #define AO_SNEK_GPIO_2 (&samd21_port_a) #define AO_SNEK_PIN_2 6 #define AO_SNEK_TIMER_2 (&samd21_tcc1) #define AO_SNEK_CHANNEL_2 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_2 6 /* A3 */ #define AO_SNEK_GPIO_3 (&samd21_port_a) #define AO_SNEK_PIN_3 7 #define AO_SNEK_TIMER_3 (&samd21_tcc1) #define AO_SNEK_CHANNEL_3 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_3 7 /* A4 */ #define AO_SNEK_GPIO_4 (&samd21_port_b) #define AO_SNEK_PIN_4 3 #define AO_SNEK_TIMER_4 (&samd21_tc6) #define AO_SNEK_CHANNEL_4 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) #define AO_SNEK_ADC_4 11 /* A5 */ #define AO_SNEK_GPIO_5 (&samd21_port_b) #define AO_SNEK_PIN_5 2 #define AO_SNEK_TIMER_5 (&samd21_tc6) #define AO_SNEK_CHANNEL_5 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) #define AO_SNEK_ADC_5 10 /* A6 */ #define AO_SNEK_GPIO_6 (&samd21_port_b) #define AO_SNEK_PIN_6 9 #define AO_SNEK_TIMER_6 (&samd21_tc4) #define AO_SNEK_CHANNEL_6 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) #define AO_SNEK_ADC_6 3 /* A7 */ #define AO_SNEK_GPIO_7 (&samd21_port_b) #define AO_SNEK_PIN_7 8 #define AO_SNEK_TIMER_7 (&samd21_tc4) #define AO_SNEK_CHANNEL_7 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) #define AO_SNEK_ADC_7 2 /* A8 */ #define AO_SNEK_GPIO_8 (&samd21_port_a) #define AO_SNEK_PIN_8 11 #define AO_SNEK_TIMER_8 (&samd21_tcc1) #define AO_SNEK_CHANNEL_8 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_8 19 /* A9/TEMP */ #define AO_SNEK_GPIO_9 (&samd21_port_a) #define AO_SNEK_PIN_9 9 #define AO_SNEK_TIMER_9 (&samd21_tcc0) #define AO_SNEK_CHANNEL_9 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_9 17 #define SNEK_THERM_R_DIVIDE 10000.0f #define SNEK_THERM_R_NOMINAL 10000.0f #define SNEK_THERM_T_NOMINAL 25.0f #define SNEK_THERM_B_COEFF 3950.0f #define SNEK_THERM_HIGH_SIDE 1 /* BUTTONA */ #define AO_SNEK_GPIO_10 (&samd21_port_a) #define AO_SNEK_PIN_10 28 #define AO_SNEK_TIMER_10 NULL #define AO_SNEK_CHANNEL_10 0 #define AO_SNEK_ADC_10 0xff #define AO_SNEK_FLAGS_10 SNEK_PIN_PULL_DOWN /* BUTTONB */ #define AO_SNEK_GPIO_11 (&samd21_port_a) #define AO_SNEK_PIN_11 14 #define AO_SNEK_TIMER_11 NULL #define AO_SNEK_CHANNEL_11 0 #define AO_SNEK_ADC_11 0xff #define AO_SNEK_FLAGS_11 SNEK_PIN_PULL_DOWN /* SWITCH */ #define AO_SNEK_GPIO_12 (&samd21_port_a) #define AO_SNEK_PIN_12 15 #define AO_SNEK_TIMER_12 NULL #define AO_SNEK_CHANNEL_12 0 #define AO_SNEK_ADC_12 0xff /* LED */ #define AO_SNEK_GPIO_13 (&samd21_port_a) #define AO_SNEK_PIN_13 17 #define AO_SNEK_TIMER_13 (&samd21_tcc0) #define AO_SNEK_CHANNEL_13 AO_SNEK_TIMER_CH(7 & 3, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_13 0xff /* REMOTEOUT */ #define AO_SNEK_GPIO_14 (&samd21_port_a) #define AO_SNEK_PIN_14 23 #define AO_SNEK_TIMER_14 NULL #define AO_SNEK_CHANNEL_14 0 #define AO_SNEK_ADC_14 0xff /* REMOTEIN */ #define AO_SNEK_GPIO_15 (&samd21_port_a) #define AO_SNEK_PIN_15 12 #define AO_SNEK_TIMER_15 NULL #define AO_SNEK_CHANNEL_15 0 #define AO_SNEK_ADC_15 0xff /* NEOPIXEL */ #define AO_SNEK_GPIO_16 (&samd21_port_b) #define AO_SNEK_PIN_16 23 #define AO_SNEK_TIMER_16 NULL #define AO_SNEK_CHANNEL_16 0 #define AO_SNEK_ADC_16 0xff /* LISIRQ */ #define AO_SNEK_GPIO_17 (&samd21_port_a) #define AO_SNEK_PIN_17 13 #define AO_SNEK_TIMER_17 NULL #define AO_SNEK_CHANNEL_17 0 #define AO_SNEK_ADC_17 0xff /* FLASHMISO */ #define AO_SNEK_GPIO_18 (&samd21_port_a) #define AO_SNEK_PIN_18 16 #define AO_SNEK_TIMER_18 NULL #define AO_SNEK_CHANNEL_18 0 #define AO_SNEK_ADC_18 0xff /* FLASHSCK */ #define AO_SNEK_GPIO_19 (&samd21_port_a) #define AO_SNEK_PIN_19 21 #define AO_SNEK_TIMER_19 NULL #define AO_SNEK_CHANNEL_19 0 #define AO_SNEK_ADC_19 0xff /* FLASHMOSI */ #define AO_SNEK_GPIO_20 (&samd21_port_a) #define AO_SNEK_PIN_20 20 #define AO_SNEK_TIMER_20 NULL #define AO_SNEK_CHANNEL_20 0 #define AO_SNEK_ADC_20 0xff /* FLASHCS */ #define AO_SNEK_GPIO_21 (&samd21_port_b) #define AO_SNEK_PIN_21 22 #define AO_SNEK_TIMER_21 NULL #define AO_SNEK_CHANNEL_21 0 #define AO_SNEK_ADC_21 0xff /* I2SCK */ #define AO_SNEK_GPIO_22 (&samd21_port_a) #define AO_SNEK_PIN_22 10 #define AO_SNEK_TIMER_22 NULL #define AO_SNEK_CHANNEL_22 0 #define AO_SNEK_ADC_22 0xff /* I2SDO */ #define AO_SNEK_GPIO_23 (&samd21_port_a) #define AO_SNEK_PIN_23 8 #define AO_SNEK_TIMER_23 NULL #define AO_SNEK_CHANNEL_23 0 #define AO_SNEK_ADC_23 0xff /* LISSDA */ #define AO_SNEK_GPIO_24 (&samd21_port_a) #define AO_SNEK_PIN_24 0 #define AO_SNEK_TIMER_24 NULL #define AO_SNEK_CHANNEL_24 0 #define AO_SNEK_ADC_24 0xff /* LISSCL */ #define AO_SNEK_GPIO_25 (&samd21_port_a) #define AO_SNEK_PIN_25 1 #define AO_SNEK_TIMER_25 NULL #define AO_SNEK_CHANNEL_25 0 #define AO_SNEK_ADC_25 0xff #define AO_SNEK_NUM_PIN 26 #define LED_0_PORT (&samd21_port_a) #define LED_0_PIN 27 #define LED_PIN_TX 0 #define AO_LED_TX (1 << LED_PIN_TX) #define AO_LED_PANIC AO_LED_TX #define LEDS_AVAILABLE (AO_LED_TX) #endif /* _AO_PINS_H_ */ snek-1.1/ports/playground/snek-playground.builtin000066400000000000000000000017671353657467200224150ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # A0, -2, 0 A1, -2, 1 A2, -2, 2 A3, -2, 3 A4, -2, 4 A5, -2, 5 A6, -2, 6 A7, -2, 7 A8, -2, 8 LIGHT, -2, 8 A9, -2, 9 TEMP, -2, 9 BUTTONA, -2, 10 D4, -2, 10 BUTTONB, -2, 11 D5, -2, 11 SWITCH, -2, 12 D7, -2, 12 LED, -2, 13 D13, -2, 13 REMOTEOUT, -2, 14 REMOTEIN, -2, 15 NEOPIXEL, -2, 16 D8, -2, 16 LISIRQ, -2, 17 FLASHMISO, -2, 18 FLASHSCK, -2, 19 FLASHMOSI, -2, 20 FLASHCS, -2, 21 I2SCK, -2, 22 I2SDO, -2, 23 LISSDA, -2, 24 LISSCL, -2, 25 snek-1.1/ports/posix/000077500000000000000000000000001353657467200146465ustar00rootroot00000000000000snek-1.1/ports/posix/.gitignore000066400000000000000000000000221353657467200166300ustar00rootroot00000000000000snek snek.desktop snek-1.1/ports/posix/Makefile000066400000000000000000000024631353657467200163130ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_ROOT=../.. SNEK_LOCAL_SRC = \ snek-main.c \ snek-posix.c \ snek-math.c \ snek-curses.c SNEK_LOCAL_INC = snek-posix.h SNEK_LOCAL_BUILTINS = snek-posix.builtin $(SNEK_ROOT)/snek-math.builtin include $(SNEK_ROOT)/snek-install.defs OPT?=-O99 CFLAGS+=-DSNEK_MEM_INCLUDE_NAME $(OPT) -g -I. $(SNEK_CFLAGS) -Werror $(CPPFLAGS) LIBS=-lreadline -lm all: snek snek.desktop snek: $(SNEK_OBJ) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(SNEK_OBJ) $(LIBS) install: snek snek.1 install -d $(DESTDIR)$(BINDIR) install snek $(DESTDIR)$(BINDIR) install -d $(DESTDIR)$(APPDIR) install snek.desktop $(DESTDIR)$(APPDIR) install -d $(DESTDIR)$(MANDIR)/man1 install snek.1 $(DESTDIR)$(MANDIR)/man1 snek.desktop: snek.desktop.in $(SNEK_SED) $^ > $@ clean:: rm -f snek snek.desktop snek-1.1/ports/posix/snek-curses.c000066400000000000000000000051061353657467200172560ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include "snek.h" #include #include #include #include static struct termios termios_save; snek_poly_t snek_builtin_curses_initscr(void) { struct termios termios; if (tcgetattr(0, &termios) < 0) { perror("tcgetattr"); exit(1); } termios_save = termios; termios.c_lflag &= ~(ICANON|ECHO); termios.c_cc[VMIN] = 1; termios.c_cc[VTIME] = 0; if (tcsetattr(0, TCSAFLUSH, &termios) < 0) { perror("tcsetattr"); exit(1); } printf("\033[?47h"); return SNEK_NULL; } snek_poly_t snek_builtin_curses_noecho(void) { return SNEK_NULL; } snek_poly_t snek_builtin_curses_echo(void) { return SNEK_NULL; } snek_poly_t snek_builtin_curses_cbreak(void) { return SNEK_NULL; } snek_poly_t snek_builtin_curses_nocbreak(void) { return SNEK_NULL; } snek_poly_t snek_builtin_curses_endwin(void) { printf("\033[?47l"); tcsetattr(0, TCSAFLUSH, &termios_save); return SNEK_NULL; } static bool stdscr_nodelay; snek_poly_t snek_builtin_stdscr_nodelay(snek_poly_t a) { stdscr_nodelay = snek_poly_true(a); return a; } snek_poly_t snek_builtin_stdscr_erase(void) { printf("\033[2J"); return SNEK_NULL; } snek_poly_t snek_builtin_stdscr_addstr(snek_poly_t y, snek_poly_t x, snek_poly_t str) { snek_builtin_stdscr_move(y, x); if (snek_poly_type(str) == snek_string) printf("%s", snek_poly_to_string(str)); return SNEK_NULL; } snek_poly_t snek_builtin_stdscr_move(snek_poly_t y, snek_poly_t x) { printf("\033[%d;%dH", snek_poly_get_soffset(y)+1, snek_poly_get_soffset(x)+1); return SNEK_NULL; } snek_poly_t snek_builtin_stdscr_refresh(void) { fflush(stdout); return SNEK_NULL; } snek_poly_t snek_builtin_stdscr_getch(void) { struct pollfd pollfd = { .fd = 0, .events = POLLIN, .revents = 0 }; int timeout = -1; if (stdscr_nodelay) timeout = 0; int ret = poll(&pollfd, 1, timeout); if (ret > 0 && (pollfd.revents & POLLIN)) { int val; char c; val = read(0, &c, 1); if (val == 1) { return snek_float_to_poly(c); } } if (ret < 0) perror("poll"); return snek_float_to_poly(-1); } snek-1.1/ports/posix/snek-main.c000066400000000000000000000047521353657467200167040ustar00rootroot00000000000000/* * Copyright © 2018 Keith Packard * * 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. */ #include "snek.h" #include #include #include FILE *snek_posix_input; static const struct option options[] = { { .name = "version", .has_arg = 0, .val = 'v' }, { .name = "file", .has_arg = 1, .val = 'f' }, { .name = "help", .has_arg = 0, .val = '?' }, { .name = NULL, .has_arg = 0, .val = 0 }, }; static void usage (char *program, int val) { fprintf(stderr, "usage: %s [--version] [--help] [--file ] \n", program); exit(val); } static int snek_getc_interactive(void) { static char *line, *line_base; int c; if (!line) { char *prompt = "> "; if (snek_parse_middle) prompt = "+ "; line_base = readline (prompt); line = line_base; if (!line) return EOF; add_history (line_base); } c = (*line++) & 0xff; if (!c) { c = '\n'; free (line_base); line = 0; } return c; } int snek_getc(FILE *input) { if (snek_interactive) return snek_getc_interactive(); return getc(input); } int main (int argc, char **argv) { int c; char *file = NULL; while ((c = getopt_long(argc, argv, "v?f:", options, NULL)) != -1) { switch (c) { case 'v': printf("%s version %s\n", argv[0], SNEK_VERSION); exit(0); break; case 'f': file = optarg; break; case '?': usage(argv[0], 0); break; default: usage(argv[0], 1); break; } } snek_init(); if (file) { snek_file = file; snek_posix_input = fopen(snek_file, "r"); if (!snek_posix_input) { perror(snek_file); exit(1); } snek_parse(); } if (argv[optind]) { snek_file = argv[optind]; snek_posix_input = fopen(snek_file, "r"); if (!snek_posix_input) { perror(snek_file); exit(1); } } else { snek_file = ""; snek_posix_input = stdin; snek_interactive = true; printf("Welcome to Snek version %s\n", SNEK_VERSION); } bool ret = snek_parse() == snek_parse_success; if (snek_posix_input == stdin) printf("\n"); return ret ? 0 : 1; } snek-1.1/ports/posix/snek-posix.builtin000066400000000000000000000015261353657467200203420ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # exit, 1 time.sleep, 1 time.monotonic, 0 curses.initscr, 0 curses.noecho, 0 curses.echo, 0 curses.cbreak, 0 curses.nocbreak, 0 curses.endwin, 0 stdscr.nodelay, 1 stdscr.erase, 0 stdscr.addstr, 3 stdscr.move, 2 stdscr.refresh, 0 stdscr.getch, 0 random.seed, 1 random.randrange, 1 #include snek-1.1/ports/posix/snek-posix.c000066400000000000000000000032611353657467200171140ustar00rootroot00000000000000/* * Copyright © 2018 Keith Packard * * 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. */ #include "snek.h" #include #include #include #include snek_poly_t snek_builtin_exit(snek_poly_t a) { int ret; switch (snek_poly_type(a)) { case snek_float: ret = (int) snek_poly_to_float(a); break; default: ret = snek_poly_true(a) ? 0 : 1; break; } exit(ret); } snek_poly_t snek_builtin_time_sleep(snek_poly_t a) { if (snek_poly_type(a) == snek_float) { float delay = snek_poly_to_float(a); float secs = floorf(delay); float ns = floorf((delay - secs) * 1e9 + 0.5); struct timespec ts = { .tv_sec = (time_t) secs, .tv_nsec = ns }; nanosleep(&ts, NULL); } return SNEK_NULL; } snek_poly_t snek_builtin_time_monotonic(void) { struct timespec t; static time_t start_sec; clock_gettime(CLOCK_MONOTONIC, &t); if (!start_sec) start_sec = t.tv_sec; return snek_float_to_poly((float) (t.tv_sec - start_sec) + (float) t.tv_nsec / 1e9f); } snek_poly_t snek_builtin_random_seed(snek_poly_t a) { srandom(a.u); return SNEK_NULL; } snek_poly_t snek_builtin_random_randrange(snek_poly_t a) { return snek_float_to_poly(random() % (long int) snek_poly_get_float(a)); } snek-1.1/ports/posix/snek-posix.h000066400000000000000000000014641353657467200171240ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #ifndef _SNEK_POSIX_H_ #define _SNEK_POSIX_H_ extern FILE *snek_posix_input; int snek_getc(FILE *input); #ifdef __APPLE__ #define isnanf isnan #endif #define SNEK_GETC() snek_getc(snek_posix_input) #define SNEK_DEBUG 1 #endif /* _SNEK_POSIX_H_ */ snek-1.1/ports/posix/snek.1000066400000000000000000000020031353657467200156630ustar00rootroot00000000000000.\" .\" Copyright © 2019 Keith Packard .\" .\" 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. .\" .TH SNEK 1 "snek" "" .SH NAME snek \- Snek Programming Language .SH SYNOPSIS .B "snek" {program.py} .SH DESCRIPTION .I snek is a small Python-derivative suitable for embedded computers. This host version is largely designed to help test the Snek system and applications on larger machines .SH USAGE If you specify a program file on the command line, snek will load and execute this instead of reading from the command line. .SH AUTHOR Keith Packard snek-1.1/ports/posix/snek.desktop.in000066400000000000000000000003631353657467200176100ustar00rootroot00000000000000[Desktop Entry] Type=Application Version=1.0 Name=Snek GenericName=Programming Language Comment=Snek Programming Language Icon=@ICONDIR@/snek.svg Exec=@BINDIR@/snek Terminal=true Categories=Education;Electronics; Keywords=Arduino;Snek;Python; snek-1.1/ports/snekboard/000077500000000000000000000000001353657467200154545ustar00rootroot00000000000000snek-1.1/ports/snekboard/.gitignore000066400000000000000000000001441353657467200174430ustar00rootroot00000000000000snek-board*.bin snek-board*.map snek-board*.uf2 snek-board*.elf *.o ao-product.h snek-board-install snek-1.1/ports/snekboard/Makefile000066400000000000000000000034001353657467200171110ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_ROOT = ../.. SNEK_SAMD21 = $(SNEK_ROOT)/chips/samd21 PROGNAME=snek-board PRODUCT_NAME=snekboard IDPRODUCT=0x804D IDVENDOR=0x239A BOOTLOADER_BIN=bootloader-snekboard-v3.7.0.bin include $(SNEK_SAMD21)/snek-samd21.defs SNEK_LOCAL_SRC = \ $(SNEK_SAMD21_SRC) SNEK_LOCAL_INC = \ $(SNEK_SAMD21_INC) SNEK_LOCAL_BUILTINS = \ $(SNEK_SAMD21_BUILTINS) \ snek-board.builtin include $(SNEK_ROOT)/snek-install.defs SRC=$(SNEK_SRC) OBJ=$(SRC:.c=.o) all: $(PROG) $(BIN) $(UF2) snek-board-install $(PROG): Makefile $(OBJ) $(call quiet,CC) $(LDFLAGS) -Wl,-M=$(MAP) -o $@ $(OBJ) $(LIBS) $(OBJ): $(SNEK_INC) distclean: clean clean:: rm -f *.o $(PROGNAME)*.elf $(PROGNAME)*.bin $(PROGNAME)*.uf2 $(PROGNAME)*.map ao-product.h rm -f snek-board-install snek-board-install: snek-board-install.in $(SNEK_SED) $^ > $@ chmod +x $@ echo: echo PROG is $(PROG) install: $(PROG) $(UF2) $(BOOTLOADER_BIN) snek-board-install snek-board-install.1 install -d $(DESTDIR)$(SHAREDIR) install -m 0644 $(PROG) $(DESTDIR)$(SHAREDIR) install -m 0644 $(UF2) $(DESTDIR)$(SHAREDIR) install -m 0644 $(BOOTLOADER_BIN) $(DESTDIR)$(SHAREDIR) install -d $(DESTDIR)$(MANDIR)/man1 install -m 0644 snek-board-install.1 $(DESTDIR)$(MANDIR)/man1 uninstall: snek-1.1/ports/snekboard/ao-pins.h000066400000000000000000000167561353657467200172120ustar00rootroot00000000000000/* * Copyright © 2012 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _AO_PINS_H_ #define _AO_PINS_H_ /* Run dfll48m from USB so that USB is happy */ #define AO_DFLL48M 48000000 /* Run fdpll96m clock from a 16MHz clock divided to 1MHz, multiplied to 48MHz */ #define AO_XOSC 1 #define AO_XOSC_FREQ 16000000 #define AO_XOSC_DIV 16 #define AO_XOSC_MUL 48 #define AO_AHB_PRESCALER 1 #define AO_APBA_PRESCALER 1 #define HAS_SERIAL_0 0 #define USE_SERIAL_0_STDIN 0 #define SERIAL_0_PA10_PA11 0 #define HAS_USB 1 #define AO_USB_OUT_HOOK 1 #define USE_USB_FIFO 1 #define HAS_BEEP 0 #define AO_SNEK_TIMER_FUNC_E 0 #define AO_SNEK_TIMER_FUNC_F 0x80 #define AO_SNEK_TIMER_FUNC_MASK 0x80 #define AO_SNEK_TIMER_DEV_TCC 0 #define AO_SNEK_TIMER_DEV_TC 0x40 #define AO_SNEK_TIMER_DEV_MASK 0x40 #define AO_SNEK_TIMER_CH_MASK 0x0f #define AO_SNEK_TIMER_CH(ch,func,dev) ((ch) | (func) | (dev)) /* * Available timers: * * TCC0.[0-7] 0-3 overlap 4-7 0,1,2,3 * TCC1.[0-3] 0-1 overlap 2-3 0,1 * TCC2.[0-1] 0,1 * TC3.[0-1] 0,1 * TC4.[0-1] 0,1 * TC5.[0-1] * * 1 PA00 * 2 PA01 * 3 PA02 AIN0 * 4 PA03 AIN1 * 9 PA04 AIN4 TCC0.0/E * 10 PA05 AIN5 TCC0.1/E * 11 PA06 AIN6 TCC1.0/E ANALOG3 TCC1.0/E * 12 PA07 AIN7 TCC1.1/E ANALOG4 TCC1.0/E * 13 PA08 AIN16 TCC0.0/E TCC1.2/F ANALOG5 TCC0.0/E * 14 PA09 AIN17 TCC0.1/E TCC1.3/F ANALOG6 TCC0.1/E * 15 PA10 AIN18 TCC1.0/E TCC0.2/F ANALOG7 TCC0.2/F * 16 PA11 AIN19 TCC1.1/E TCC0.3/F ANALOG8 TCC0.3/F * 21 PA12 TCC2.0/E TCC0.6/F M1_PWR TCC2.0/E * 22 PA13 TCC2.1/E TCC0.7/F M2_PWR TCC2.1/E * 23 PA14 XOSC * 24 PA15 XOSC * 25 PA16 TCC2.0/E TCC0.6/F M1_DIR * 26 PA17 TCC2.1/E TCC0.7/F M2_DIR * 27 PA18 TC3.0/E TCC0.2/F M3_PWR TC3.0/E * 28 PA19 TC3.1/E TCC0.3/F M4_PWR TC3.1/E * 29 PA20 M3_DIR * 30 PA21 M4_DIR * 31 PA22 DIGITAL1 * 32 PA23 DIGITAL2 * 33 PA24 TC5.0 DATA- * 34 PA25 TC5.1 DATA+ * 39 PA27 DIGITAL3 * 41 PA28 DIGITAL4 * 45 PA30 DIGITAL5 * 46 PA31 DIGITAL6 * none AIN8 * none AIN9 * 47 PB02 AIN10 DIGITAL7 * 48 PB03 AIN11 DIGITAL8 * 7 PB08 AIN2 TC4.0/E ANALOG1 TC4.0/E * 8 PB09 AIN3 TC4.1/E ANALOG2 TC4.1/E * 19 PB10 TC5.0 * 20 PB11 TC5.1 * 37 PB22 * 38 PB23 * ANALOG1 PB08 AIN2 TC4.0/E 0 * ANALOG2 PB09 AIN3 TC4.1/E 1 * ANALOG3 PA06 AIN6 TCC1.0/E 2 * ANALOG4 PA07 AIN7 TCC1.1/E 3 * ANALOG5 PA08 AIN16 TCC0.0/E 4 * ANALOG6 PA09 AIN17 TCC0.1/E 5 * ANALOG7 PA10 AIN18 TCC0.2/F 6 * ANALOG8 PA11 AIN19 TCC0.3/F 7 * * M1_PWR PA12 TCC2.0/E 8 * M1_DIR PA16 9 * M2_PWR PA13 TCC2.1/E 10 * M2_DIR PA17 11 * M3_PWR PA18 TC3.0/E 12 * M3_DIR PA20 13 * M4_PWR PA19 TC3.1/E 14 * M4_DIR PA21 15 * * NEOPIXEL PB11 16 * * LED PA02 */ #define AO_SNEK_PWM_RAMP_STEP 512 /* ANALOG1 */ #define AO_SNEK_GPIO_0 (&samd21_port_b) #define AO_SNEK_PIN_0 8 #define AO_SNEK_TIMER_0 (&samd21_tc4) #define AO_SNEK_CHANNEL_0 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) #define AO_SNEK_ADC_0 2 /* ANALOG2 */ #define AO_SNEK_GPIO_1 (&samd21_port_b) #define AO_SNEK_PIN_1 9 #define AO_SNEK_TIMER_1 (&samd21_tc4) #define AO_SNEK_CHANNEL_1 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) #define AO_SNEK_ADC_1 3 /* ANALOG3 */ #define AO_SNEK_GPIO_2 (&samd21_port_a) #define AO_SNEK_PIN_2 6 #define AO_SNEK_TIMER_2 (&samd21_tcc1) #define AO_SNEK_CHANNEL_2 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_2 6 /* ANALOG4 */ #define AO_SNEK_GPIO_3 (&samd21_port_a) #define AO_SNEK_PIN_3 7 #define AO_SNEK_TIMER_3 (&samd21_tcc1) #define AO_SNEK_CHANNEL_3 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_3 7 /* ANALOG5 */ #define AO_SNEK_GPIO_4 (&samd21_port_a) #define AO_SNEK_PIN_4 8 #define AO_SNEK_TIMER_4 (&samd21_tcc0) #define AO_SNEK_CHANNEL_4 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_4 16 /* ANALOG6 */ #define AO_SNEK_GPIO_5 (&samd21_port_a) #define AO_SNEK_PIN_5 9 #define AO_SNEK_TIMER_5 (&samd21_tcc0) #define AO_SNEK_CHANNEL_5 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_5 17 /* ANALOG7 */ #define AO_SNEK_GPIO_6 (&samd21_port_a) #define AO_SNEK_PIN_6 10 #define AO_SNEK_TIMER_6 (&samd21_tcc0) #define AO_SNEK_CHANNEL_6 AO_SNEK_TIMER_CH(2, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_6 18 /* ANALOG8 */ #define AO_SNEK_GPIO_7 (&samd21_port_a) #define AO_SNEK_PIN_7 11 #define AO_SNEK_TIMER_7 (&samd21_tcc0) #define AO_SNEK_CHANNEL_7 AO_SNEK_TIMER_CH(3, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_7 19 /* MOTOR1_POWER */ #define AO_SNEK_GPIO_8 (&samd21_port_a) #define AO_SNEK_PIN_8 12 #define AO_SNEK_TIMER_8 (&samd21_tcc2) #define AO_SNEK_CHANNEL_8 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_8 0xff #define AO_SNEK_FLAGS_8 SNEK_PIN_RAMP_PWM /* MOTOR1_DIR */ #define AO_SNEK_GPIO_9 (&samd21_port_a) #define AO_SNEK_PIN_9 16 #define AO_SNEK_TIMER_9 NULL #define AO_SNEK_CHANNEL_9 0 #define AO_SNEK_ADC_9 0xff /* MOTOR2_POWER */ #define AO_SNEK_GPIO_10 (&samd21_port_a) #define AO_SNEK_PIN_10 13 #define AO_SNEK_TIMER_10 (&samd21_tcc2) #define AO_SNEK_CHANNEL_10 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC) #define AO_SNEK_ADC_10 0xff #define AO_SNEK_FLAGS_10 SNEK_PIN_RAMP_PWM /* MOTOR2_DIR */ #define AO_SNEK_GPIO_11 (&samd21_port_a) #define AO_SNEK_PIN_11 17 #define AO_SNEK_TIMER_11 NULL #define AO_SNEK_CHANNEL_11 0 #define AO_SNEK_ADC_11 0xff /* MOTOR3_POWER */ #define AO_SNEK_GPIO_12 (&samd21_port_a) #define AO_SNEK_PIN_12 18 #define AO_SNEK_TIMER_12 (&samd21_tc3) #define AO_SNEK_CHANNEL_12 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) #define AO_SNEK_ADC_12 0xff #define AO_SNEK_FLAGS_12 SNEK_PIN_RAMP_PWM /* MOTOR3_DIR */ #define AO_SNEK_GPIO_13 (&samd21_port_a) #define AO_SNEK_PIN_13 20 #define AO_SNEK_TIMER_13 NULL #define AO_SNEK_CHANNEL_13 0 #define AO_SNEK_ADC_13 0xff /* MOTOR4_POWER */ #define AO_SNEK_GPIO_14 (&samd21_port_a) #define AO_SNEK_PIN_14 19 #define AO_SNEK_TIMER_14 (&samd21_tc3) #define AO_SNEK_CHANNEL_14 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC) #define AO_SNEK_ADC_14 0xff #define AO_SNEK_FLAGS_14 SNEK_PIN_RAMP_PWM /* MOTOR4_DIR */ #define AO_SNEK_GPIO_15 (&samd21_port_a) #define AO_SNEK_PIN_15 21 #define AO_SNEK_TIMER_15 NULL #define AO_SNEK_CHANNEL_15 0 #define AO_SNEK_ADC_15 0xff /* NEOPIXEL */ #define AO_SNEK_GPIO_16 (&samd21_port_b) #define AO_SNEK_PIN_16 11 #define AO_SNEK_TIMER_16 NULL #define AO_SNEK_CHANNEL_16 0 #define AO_SNEK_ADC_16 0xff #define AO_SNEK_NUM_PIN 17 #define LED_0_PORT (&samd21_port_a) #define LED_0_PIN 2 #define LED_PIN_TX 0 #define AO_LED_TX (1 << LED_PIN_TX) #define AO_LED_PANIC AO_LED_TX #define LEDS_AVAILABLE (AO_LED_TX) #endif /* _AO_PINS_H_ */ snek-1.1/ports/snekboard/bootloader-snekboard-v3.7.0.bin000077500000000000000000000200001353657467200230720ustar00rootroot00000000000000- }K} !1I@a}pG@AKB 44#0B0 Y3Q%KN\hOC\`**$}դF$ YQ4dE }F@AD"p# RXXB3Bp @") JSx[+pG @#IhBpG@!&%J%LSh%MC3CS``#Kc` Kh?+ ;&'JCJbbK;C?"cC"CgcCc`Kc`!JKHS`j  Cb#``@A @@$` $ H!Ip#B3!KJB3"K!CJ %`"$0&KHZbxCCpxC#CpK{C 0Cs{CCs{CCs#JQh CS`vX3` LBF  pAPAHA@A Ns+$FgFU/ JU@<,\2S"3RB X@@0Z H@F !#BpGF3p$ & @3@* +, ( <#p +73+T003KJ`OKJ`OF i& Jh+ I` I h2 ` Ih(ЂB `;`F   KJ`OKJ`OF iJIh3` h* HB$HaB# `H۲x+! Ka 9ɲ K)xIBpxpB"KZa  DA KJhhB![`"KZapG  DA"K`apGFDApG #p5J i Ca"3I xC p2KxCp!x!Cp/I x"C px@p`"x Cp+K+JZZx *K2x Cpx &I hR @B"#M@,@"C h @*:$"@CC  h @B"@H@ C!xH @p"x C !pXbC 9C"!Rqp@XDAh @C>`&vUKO67`&D'vU6UU FD`Fh@C` FD`Fh@C`& vU6UU4 h3@C `h@ C`5JB;4JB63J23JB02JB1JB!/H#[E!-H#Eљ!)H+|+H"! cp+B3#pKc!x PAPAL P ?    !  ` ! ! ! !"! @ 2RK##%/h`OJXh"5?-%IKJJUJKyX00@ ps]j+QcT+9!@Hn!+ !>Hh"+y!!;Ha!\#@*i2A3RB2Ky/KycF+U3@S+O2'KR3 #SqQPqOcF+@3@S+:R3IKR !yB9Qqz*B4@"3r>:Zq.IKRyB&Pqz "B 3r:#! 0  PAPA"Kp#Jx Cp PA "Y  "R p g B") pp X(#"!( p0 %B0 x,1p3p" ! - >"MI V#U"[TJKT~-%k>+?;+EN[[B0BUQa 2B"! "p 1bBp27M-3-1I "+1 (#~=r /0N;X 4+1 cw5 w wv 9wv " g"M#RB"tct"vcv-Ѡ+;+ Jh(w) K=)BىKJ#`Kc`#[P#a#h"C ` KRea`"aa 0F@UF2 0o WQ]+hp h.K BQ-KJhBM"R+KXBGыh)JiB@Ԁ#"i[B hò+"K#JB! 1-+Уi+()hJBГB)#[B+`ciB!"@@zҲ Bhh C0rh`jh+hB. Kh3 J`p. Kh-33UF2 WQ]0o +hc  9Mh+6Kh6K#B4K4Jh4L5KB1x4J!hB*2K"`h1J23`_bV@ k #&+M+p*L( #x۲+р $J`X.p&p#x+#x #"#`KZa#h`0G!hJB#`!hKB "`@l#x+3F;+Ѿ | 8@i&   DAiL"! ##p;q; $hB!x3h#[";h4p  !^#B+"!0U#p" !HF  H IByyCyCyC qJq qqF  p" LB#"#sKp"pqZqqsZs##scz!z Cz  Cz CI !rcr rrpF ; pL"! HJ-!#}1?&R|2@*вBJ 3 "۲pBɲ- ;# p|!#;#p   $+KY|p|p|Qp}p}rp}3p3B" KsX(M/)@!"(ZJ4Qzz CzCz CI[ rQr rr!;("K:)   P 𵅰 $pr_KJ"K`pGFPAǰD"!8"! #!pxbx @pch @#'Nbp +s" h%H 9 bx# !(%x:0($shk`h`#+s{+*+Ѳ}p}9p^ ` hv`bx# !(KB5LFSBSU$L#`hEhG#hF "hF!hFz#"LI"` p~M@!(|K`+T(^yK`yK`xHuKhhBtM)h x+6sN#+гlKxS+33h21`)`BlM h*`gH)hheJ;`hK`cKdMh)pɲBY hSFXKp[K`XJh3`WJh3`R+1h h'O+3h"hpH+3h"hW+ NK"hBMH#h2h`o+! hh+!#h3`0w+#h!h3`G+ 0hC=Kx+!;HT+N+V+*!8HX+0h!5HY+ 2h h3K*`!1HhZ+7h&%hB !*H0!(H(x150:Ѳ )3hC3`pA:*2h7;a:*2hW;,+3h#`JpF x p t | l @@ | G3x@! ( #%y#pk+?' /@H0a:?#C-# ?%B%/@7;+Cp1*XkF@!y#+vdG3x1H0#(A#H3l"8Z(a#'%*G>7/N0# 1L0*) #d3#e#ce#[e#K!e9!i ! mKB!T1!bmX1 m em!mL0*&'memBi!;77ZxBsL3R6"ZF+hH"G3p|H"G3pu x G"!RhFUG#kDphF_qFII \IDpGF*8 C 6'F=- .6D'hfh`^`hh``34cE$5-I@E,#XP3.#<4- @#\T3B*"FT*Bβ%<;Sp+B,-" @C*C,'?? >F6fD`U```2B"7?@,&FgD ºB"6@,ɲp3BF x+#"x+0BhKIC B0h KC B0hKC B0x+ F @DH@#B &u@ @  keithp.comSnekBoard$ ?)BBSNEKBOOTFAT16 INFO_UF2TXTINDEX HTM~CURRENT UF2UF2 Bootloader v3.7.0 SFHWRO Model: SnekBoard Board-ID: SAMD21G18A-SnekBoard-v0 >v1.1 [Arduino:XYZ] Jun 27 2019 20:27:49 X Y Z# 984 Gve`؉ELed   $$$$  @@ P@@  !"!@@ *@@  WINUSB*DeviceInterfaceGUIDsP{92CE6462-9C77-46FE-933B-31CB9C5BB3B9}SBSU 1.00snek-1.1/ports/snekboard/snek-board-install.1000066400000000000000000000026401353657467200212310ustar00rootroot00000000000000.\" .\" Copyright © 2019 Keith Packard .\" .\" 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. .\" .TH SNEK-BOARD-INSTALL 1 "snek-board-install" "" .SH NAME snek-board-install \- Install Snek to Snek Board .SH SYNOPSIS .B "snek-board-install" [OPTION]... [COMMAND] .SH DESCRIPTION .I snek-board-install installs the Snek programming language on a Snek Board which is an ATMEL SAMD21D based board designed to work with Lego Power Functions components. This requires a connection to the board through a SWD debug device. .SH OPTIONS .TP \-elf Specifies the elf file containing the snek executable to load to the board. The default is the currently installed version of Snek. .TP \-boot Specifies the bin file containing the boot loader for the board. The default is the boot loader provided with the installed version of Snek. .SH USAGE Connect the snek-board to a STLinkv2 board, then run snek-board-install. .SH AUTHOR Keith Packard snek-1.1/ports/snekboard/snek-board-install.in000066400000000000000000000016371353657467200215040ustar00rootroot00000000000000#!/bin/sh SHAREDIR="@SHAREDIR@" BOOT_VERSION=3.7.0 BOOT_FILE=$SHAREDIR/bootloader-snekboard-v${BOOT_VERSION}.bin SNEK_FILE=$SHAREDIR/snek-board-@SNEK_VERSION@.elf mode=arg for i in "$@"; do case "$mode" in arg) case "$i" in -elf) mode=elf ;; -boot) mode=boot ;; *) echo "Usage: $0 {-elf snek-board-@SNEK_VERSION@.elf} {-boot bootloader-snekboard-v${BOOT_VERSION}.bin" 1>&2 exit 1 ;; esac ;; elf) SNEK_FILE="$i" mode=arg ;; boot) BOOT_FILE="$i" mode=arg ;; esac done openocd -f interface/stlink.cfg \ -c 'transport select hla_swd' \ -c 'set CHIPNAME at91samd21g18' \ -c 'set CPUTAPID 0x0bc11477' \ -f target/at91samdXX.cfg \ -c init \ -c 'reset halt' \ -c "flash write_image erase unlock $BOOT_FILE" \ -c "flash write_image erase unlock $SNEK_FILE" \ -c 'reset init' \ -c 'reset run' \ -c 'shutdown' snek-1.1/ports/snekboard/snek-board.builtin000066400000000000000000000017771353657467200211050ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # A1, -2, 0 A2, -2, 1 A3, -2, 2 A4, -2, 3 A5, -2, 4 A6, -2, 5 A7, -2, 6 A8, -2, 7 M1, -2, = snek_list_build(snek_list_tuple, 2, snek_float_to_poly(8), snek_float_to_poly(9)) M2, -2, = snek_list_build(snek_list_tuple, 2, snek_float_to_poly(10), snek_float_to_poly(11)) M3, -2, = snek_list_build(snek_list_tuple, 2, snek_float_to_poly(12), snek_float_to_poly(13)) M4, -2, = snek_list_build(snek_list_tuple, 2, snek_float_to_poly(14), snek_float_to_poly(15)) NEOPIXEL, -2, 16 snek-1.1/snek-base.builtin000066400000000000000000000012351353657467200155760ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # len, 1 print, -1 sys.stdout.flush, 0 end, -2 False, -2, 0 True, -2, 1 ord, 1 chr, 1 math.sqrt, 1 None, -2, SNEK_NULL snek-1.1/snek-builtin.c000066400000000000000000000033011353657467200151020ustar00rootroot00000000000000/* * Copyright © 2018 Keith Packard * * 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. */ #include "snek.h" #include snek_poly_t snek_builtin_len(snek_poly_t a) { return snek_soffset_to_poly(snek_poly_len(a)); } snek_poly_t snek_builtin_print(uint8_t nposition, uint8_t nnamed, snek_poly_t *args) { while (nposition--) { snek_poly_t arg = *args++; snek_poly_print(stdout, arg, 's'); if (nposition) putc(' ', stdout); } snek_poly_t end = SNEK_NULL; while (nnamed--) { snek_id_t id = (snek_id_t) ((*args++).f); snek_poly_t value = *args++; if (id == SNEK_BUILTIN_end) end = value; } if (!snek_is_null(end)) snek_poly_print(stdout, end, 's'); else putc('\n', stdout); return SNEK_NULL; } snek_poly_t snek_builtin_sys_stdout_flush(void) { fflush(stdout); return SNEK_NULL; } snek_poly_t snek_builtin_ord(snek_poly_t a) { if (snek_poly_type(a) != snek_string) return snek_error_type_1(a); return snek_soffset_to_poly(snek_poly_to_string(a)[0]); } snek_poly_t snek_builtin_chr(snek_poly_t a) { snek_soffset_t s = snek_poly_get_soffset(a); return snek_string_to_poly(snek_string_make(s)); } snek_poly_t snek_builtin_math_sqrt(snek_poly_t a) { return snek_float_to_poly(sqrtf(snek_poly_get_float(a))); } snek-1.1/snek-builtin.py000066400000000000000000000237431353657467200153240ustar00rootroot00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # # Copyright © 2019 Keith Packard # # 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. # import sys import argparse def fprint(msg="", end="\n", file=sys.stdout): file.write(msg) file.write(end) builtin_id = 1 class SnekBuiltin: def __init__(self, name, param, value, condition=None): self.name = name self.value = None self.init = None self.condition = condition if value and value[0] == "=": self.init = value[1:] else: self.value = value self.id = -1 if param[0].isalpha(): self.keyword = param self.nformal = -3 else: self.keyword = False self.nformal = int(param) def __eq__(self, other): return self.name == other.name def is_name(self): return self.nformal == -2 and self.value is None def is_value(self): return self.nformal == -2 and self.value is not None def is_init(self): return self.nformal == -2 and self.init is not None def is_func(self): return self.nformal >= -1 def kind_order(self): if self.is_func(): return 0 elif self.keyword: return 2 else: return 1 def value_order(self, other): if self.value is None and other.value is not None: return 1 if other.value is None and self.value is not None: return -1 return 0 def __lt__(self, other): o = self.kind_order() - other.kind_order() if o < 0: return True elif o > 0: return False o = self.value_order(other) if o != 0: return o < 0 return self.name < other.name def snek_name(self): return self.name def cpp_name(self): return "SNEK_BUILTIN_%s" % (self.name.replace(".", "_")) def func_name(self): if self.is_value(): if self.value[0].isdigit(): return "(snek_poly_t)(float)%s" % self.value return self.value return "snek_builtin_%s" % (self.name.replace(".", "_")) def func_field(self): if self.is_value(): return ".value" elif self.nformal == -1: return ".funcv" return ".func%d" % self.nformal def set_id(self): global builtin_id if not self.keyword and self.id == -1: self.id = builtin_id builtin_id += 1 headers = [] builtins = [] def add_builtin(name, id, value, condition): global builtins builtins += [SnekBuiltin(name, id, value, condition)] def load_builtins(filename): global headers current_condition = None f = open(filename) for line in f.readlines(): line = line.rstrip() if len(line) == 0: pass elif line.startswith("#ifdef"): current_condition = line.split(" ")[1].strip() elif line.startswith("#endif"): current_condition = None elif line[0] == "#": if len(line) > 1 and line[1] != " ": headers += [line] else: bits = line.split(",") value = None if len(bits) > 2: value = ",".join(bits[2:]).strip() add_builtin(bits[0].strip(), bits[1].strip(), value, current_condition) def dump_headers(fp): for line in headers: fprint("%s" % line, file=fp) def dump_init(fp): use_list_build = False fprint("#define snek_init() {\\", file=fp) for name in sorted(builtins): if name.is_init(): if "snek_list_build" in name.init: use_list_build = True fprint(" {\\", file=fp) fprint(" snek_stack_push((%s));\\" % name.init, file=fp) fprint( " *snek_id_ref(%s, true) = snek_stack_pop();\\" % name.cpp_name(), file=fp, ) fprint(" }\\", file=fp) fprint("}", file=fp) if use_list_build: fprint("#define SNEK_LIST_BUILD", file=fp) def dump_max_len(fp): max_len = 0 for name in builtins: if len(name.name) > max_len: max_len = len(name.name) fprint("#define SNEK_BUILTIN_NAMES_MAX_LEN %d" % max_len, file=fp) fprint("#define SNEK_BUILTIN_NAMES_MAX_ARGS %d" % max_args(), file=fp) def set_ids(): for name in sorted(builtins): name.set_id() def dump_names(fp): fprint( "static const uint8_t SNEK_BUILTIN_NAMES_DECLARE(snek_builtin_names)[] = {", file=fp, ) total = 0 for name in sorted(builtins): if name.condition: fprint("#ifdef %s" % name.condition, file=fp) if name.keyword: fprint("\t%s, " % name.keyword, end="", file=fp) total += 1 else: fprint("\t", end="", file=fp) for c in name.name: fprint("'%c', " % c, end="", file=fp) total += 1 fprint("0,", file=fp) if name.condition: fprint("#endif", file=fp) total += 1 fprint("};", file=fp) fprint("#define SNEK_BUILTIN_NAMES_SIZE %d" % total, file=fp) def trim_mu(n): if n.find(".") >= 0: return n[: n.find(".")] return n mu_skip = ["len", "print", "end", "False", "True", "ord", "chr", "None"] def dump_mu(fp): all_names = {} for name in sorted(builtins): if not name.keyword and not name.name in mu_skip: all_names[trim_mu(name.name)] = True for name in sorted(all_names.keys()): fprint(" '%s'," % name, file=fp) def max_args(): max = 0 for name in sorted(builtins): if name.keyword or not name.is_func(): continue if name.nformal > max: max = name.nformal return max def dump_decls(fp): for name in sorted(builtins): if not name.is_func(): continue fprint("extern snek_poly_t", file=fp) fprint("%s(" % name.func_name(), file=fp, end="") if name.nformal == -1: fprint( "uint8_t nposition, uint8_t nnamed, snek_poly_t *args", end="", file=fp ) elif name.nformal == 0: fprint("void", end="", file=fp) else: for a in range(name.nformal): fprint("snek_poly_t a%d" % a, end="", file=fp) if a < name.nformal - 1: fprint(", ", end="", file=fp) fprint(");", file=fp) fprint(file=fp) def dump_builtins(fp): fprint("const snek_builtin_t SNEK_BUILTIN_DECLARE(snek_builtins)[] = {", file=fp) for name in sorted(builtins): if name.keyword: continue if name.is_name(): continue fprint("\t[%s - 1] = {" % name.cpp_name(), file=fp) if name.is_func(): fprint("\t\t.nformal=%d," % name.nformal, file=fp) fprint("\t\t%s = %s," % (name.func_field(), name.func_name()), file=fp) fprint("\t},", file=fp) fprint("};", file=fp) def dump_cpp(fp): marked_funcs = False marked_values = False for name in sorted(builtins): if name.keyword: continue if name.is_value() and not marked_funcs: fprint("#define SNEK_BUILTIN_MAX_FUNC %d" % name.id, file=fp) marked_funcs = True if name.is_name() and not marked_values: fprint("#define SNEK_BUILTIN_MAX_BUILTIN %d" % name.id, file=fp) marked_values = True fprint("#define %s %d" % (name.cpp_name(), name.id), file=fp) fprint("#define SNEK_BUILTIN_END %d" % (builtin_id), file=fp) def builtin_main(): parser = argparse.ArgumentParser(description="Construct Snek builtin data.") parser.add_argument( "builtins", metavar="F", nargs="+", help="input files describing builtins" ) parser.add_argument("-o", "--output", dest="output", help="output file") parser.add_argument( "-m", "--mu", action="store_true", help="output just non-keyword constants" ) args = parser.parse_args() for b in args.builtins: load_builtins(b) fp = sys.stdout if args.output: fp = open(args.output, mode="w") if args.mu: dump_mu(fp) return fprint("#ifdef SNEK_BUILTIN_DATA", file=fp) fprint("#undef SNEK_BUILTIN_DATA", file=fp) fprint("#ifndef SNEK_BUILTIN_NAMES_DECLARE", file=fp) fprint("#define SNEK_BUILTIN_NAMES_DECLARE(n) n", file=fp) fprint("#endif", file=fp) set_ids() dump_names(fp) fprint(file=fp) max_formals = max_args() fprint("#ifndef SNEK_BUILTIN_DECLARE", file=fp) fprint("#define SNEK_BUILTIN_DECLARE(n) n", file=fp) fprint("#endif", file=fp) dump_builtins(fp) fprint(file=fp) fprint("#else /* SNEK_BUILTIN_DATA */", file=fp) fprint("#ifdef SNEK_BUILTIN_DECLS", file=fp) fprint("#undef SNEK_BUILTIN_DECLS", file=fp) dump_decls(fp) fprint("#else /* SNEK_BUILTIN_DECLS */", file=fp) dump_max_len(fp) dump_headers(fp) dump_init(fp) fprint("#ifndef SNEK_BUILTIN_NFORMAL", file=fp) fprint("#define SNEK_BUILTIN_NFORMAL(b) ((b)->nformal)", file=fp) fprint("#define SNEK_BUILTIN_FUNCV(b) ((b)->funcv)", file=fp) for f in range(max_formals + 1): fprint("#define SNEK_BUILTIN_FUNC%d(b) ((b)->func%d)" % (f, f), file=fp) fprint("#define SNEK_BUILTIN_VALUE(b) ((b)->value)", file=fp) fprint("#endif", file=fp) dump_cpp(fp) fprint("#endif /* SNEK_BUILTIN_DECLS */", file=fp) fprint("#endif /* SNEK_BUILTIN_DATA */", file=fp) builtin_main() snek-1.1/snek-code.c000066400000000000000000000754161353657467200143660ustar00rootroot00000000000000/* * Copyright © 2018 Keith Packard * * 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. */ #include "snek.h" static uint8_t snek_op_extra_size(snek_op_t op) { switch (op) { case snek_op_num: return sizeof (float); case snek_op_int: return sizeof (int8_t); case snek_op_string: case snek_op_list: case snek_op_tuple: return sizeof (snek_offset_t); case snek_op_id: case snek_op_global: case snek_op_assign: case snek_op_assign_named: case snek_op_assign_plus: case snek_op_assign_minus: case snek_op_assign_times: case snek_op_assign_divide: case snek_op_assign_div: case snek_op_assign_mod: case snek_op_assign_pow: case snek_op_assign_land: case snek_op_assign_lor: case snek_op_assign_lxor: case snek_op_assign_lshift: case snek_op_assign_rshift: return sizeof (snek_id_t); case snek_op_call: return sizeof (snek_offset_t); case snek_op_slice: return 1; case snek_op_branch: case snek_op_branch_true: case snek_op_branch_false: case snek_op_forward: case snek_op_line: return sizeof (snek_offset_t); case snek_op_range_start: case snek_op_range_step: case snek_op_in_step: return sizeof (snek_offset_t) + sizeof (uint8_t) + sizeof (snek_id_t); default: return 0; } } //#define DEBUG_COMPILE //#define DEBUG_EXEC #define dbg(a, args...) fprintf(stderr, a, ##args) #define stddbg stderr #if defined(DEBUG_COMPILE) || defined(DEBUG_EXEC) const char * const snek_op_names[] = { [snek_op_plus] = "plus", [snek_op_minus] = "minus", [snek_op_times] = "times", [snek_op_divide] = "divide", [snek_op_div] = "div", [snek_op_mod] = "mod", [snek_op_pow] = "pow", [snek_op_land] = "land", [snek_op_lor] = "lor", [snek_op_lxor] = "lxor", [snek_op_lshift] = "lshift", [snek_op_rshift] = "rshift", [snek_op_assign_plus] = "assign_plus", [snek_op_assign_minus] = "assign_minus", [snek_op_assign_times] = "assign_times", [snek_op_assign_divide] = "assign_divide", [snek_op_assign_div] = "assign_div", [snek_op_assign_mod] = "assign_mod", [snek_op_assign_pow] = "assign_pow", [snek_op_assign_land] = "assign_land", [snek_op_assign_lor] = "assign_lor", [snek_op_assign_lxor] = "assign_lxor", [snek_op_assign_lshift] = "assign_lshift", [snek_op_assign_rshift] = "assign_rshift", [snek_op_num] = "num", [snek_op_int] = "int", [snek_op_string] = "string", [snek_op_list] = "list", [snek_op_tuple] = "tuple", [snek_op_id] = "id", [snek_op_not] = "not", [snek_op_eq] = "eq", [snek_op_ne] = "ne", [snek_op_gt] = "gt", [snek_op_lt] = "lt", [snek_op_ge] = "ge", [snek_op_le] = "le", [snek_op_is] = "is", [snek_op_is_not] = "is_not", [snek_op_in] = "in", [snek_op_not_in] = "not_in", [snek_op_uminus] = "uminus", [snek_op_lnot] = "lnot", [snek_op_call] = "call", [snek_op_array] = "array", [snek_op_slice] = "slice", [snek_op_assign] = "assign", [snek_op_assign_named] = "assign_named", [snek_op_global] = "global", [snek_op_del] = "del", #ifdef SNEK_ASSERT [snek_op_assert] = "assert", #endif [snek_op_branch] = "branch", [snek_op_branch_true] = "branch_true", [snek_op_branch_false] = "branch_false", [snek_op_forward] = "forward", [snek_op_range_start] = "range_start", [snek_op_range_step] = "range_step", [snek_op_in_step] = "in_step", [snek_op_null] = "null", [snek_op_nop] = "nop", [snek_op_line] = "line", }; static snek_offset_t snek_code_dump_instruction(snek_code_t *code, snek_offset_t ip) { float f; snek_id_t id; snek_offset_t o; int8_t i8; uint8_t u8; dbg("%6d: ", ip); snek_op_t op = code->code[ip++]; bool push = (op & snek_op_push) != 0; op &= ~snek_op_push; dbg("%-12s %c ", snek_op_names[op], push ? '^' : ' '); switch(op) { case snek_op_num: memcpy(&f, &code->code[ip], sizeof(float)); dbg("%.7g\n", f); break; case snek_op_int: memcpy(&i8, &code->code[ip], sizeof(int8_t)); dbg("%d\n", i8); break; case snek_op_string: memcpy(&o, &code->code[ip], sizeof(snek_offset_t)); dbg("%s\n", (char *) snek_pool_addr(o)); break; case snek_op_list: case snek_op_tuple: memcpy(&o, &code->code[ip], sizeof(snek_offset_t)); dbg("%u\n", o); break; case snek_op_id: case snek_op_global: case snek_op_assign: case snek_op_assign_named: case snek_op_assign_plus: case snek_op_assign_minus: case snek_op_assign_times: case snek_op_assign_divide: case snek_op_assign_div: case snek_op_assign_mod: case snek_op_assign_pow: case snek_op_assign_land: case snek_op_assign_lor: case snek_op_assign_lxor: case snek_op_assign_lshift: case snek_op_assign_rshift: memcpy(&id, &code->code[ip], sizeof(snek_id_t)); dbg("(%5d) ", id); if (id) { const char *name = snek_name_string(id); if (!name) dbg("\n", id); else dbg("%s\n", name); } else dbg("\n"); break; case snek_op_call: memcpy(&o, &code->code[ip], sizeof(snek_offset_t)); dbg("%d position %d named\n", o & 0xff, o >> 8); break; case snek_op_slice: if (code->code[ip] & SNEK_OP_SLICE_START) dbg(" start"); if (code->code[ip] & SNEK_OP_SLICE_END) dbg(" end"); if (code->code[ip] & SNEK_OP_SLICE_STRIDE) dbg(" stride"); break; case snek_op_branch: case snek_op_branch_true: case snek_op_branch_false: case snek_op_forward: case snek_op_line: memcpy(&o, &code->code[ip], sizeof (snek_offset_t)); dbg("%d\n", o); break; case snek_op_range_start: case snek_op_in_step: case snek_op_range_step: memcpy(&o, &code->code[ip], sizeof (snek_offset_t)); memcpy(&u8, &code->code[ip + sizeof (snek_offset_t)], sizeof(uint8_t)); memcpy(&id, &code->code[ip + sizeof (snek_offset_t) + sizeof(uint8_t)], sizeof(snek_id_t)); dbg("%d %d %s\n", o, u8, snek_name_string(id)); break; default: dbg("\n"); break; } return ip + snek_op_extra_size(op); } #endif #ifdef DEBUG_COMPILE static void snek_code_dump(snek_code_t *code) { snek_offset_t ip = 0; while (ip < code->size) { ip = snek_code_dump_instruction(code, ip); } } #endif uint8_t *snek_compile; snek_offset_t snek_compile_size; snek_offset_t snek_compile_prev, snek_compile_prev_prev; static snek_offset_t compile_alloc; #define COMPILE_INC 32 static void compile_extend(snek_offset_t n, void *data) { if (snek_compile_size + n > compile_alloc) { uint8_t *new_compile = snek_alloc(compile_alloc + COMPILE_INC); if (!new_compile) return; memcpy(new_compile, snek_compile, snek_compile_size); compile_alloc += COMPILE_INC; snek_compile = new_compile; } if (data) memcpy(snek_compile + snek_compile_size, data, n); snek_compile_size += n; } void snek_code_delete_prev(void) { snek_compile_size = snek_compile_prev; snek_compile_prev = snek_compile_prev_prev; } void snek_code_add_op(snek_op_t op) { snek_compile_prev_prev = snek_compile_prev; snek_compile_prev = snek_compile_size; compile_extend(1, &op); } void snek_code_add_number(float number) { int8_t i8 = (int8_t) number; if ((float) i8 == number) { snek_code_add_op(snek_op_int); compile_extend(sizeof(int8_t), &i8); } else { snek_code_add_op(snek_op_num); compile_extend(sizeof(float), &number); } } void snek_code_add_string(char *string) { snek_offset_t s; snek_offset_t strpos; snek_stack_push_string(string); snek_code_add_op(snek_op_string); strpos = snek_compile_size; compile_extend(sizeof (snek_offset_t), NULL); s = snek_pool_offset(snek_stack_pop_string(string)); memcpy(snek_compile + strpos, &s, sizeof (snek_offset_t)); } void snek_code_add_op_offset(snek_op_t op, snek_offset_t o) { snek_code_add_op(op); compile_extend(sizeof (snek_offset_t), &o); } void snek_code_add_forward(snek_forward_t forward) { snek_code_add_op_offset(snek_op_forward, (snek_offset_t) forward); } void snek_code_add_slice(uint8_t param) { snek_code_add_op(snek_op_slice); compile_extend(1, ¶m); } static snek_id_t snek_for_tmp(uint8_t for_depth, uint8_t i) { return SNEK_OFFSET_NONE - 1 - (for_depth * 2 + i); } void snek_code_add_in_range(snek_id_t id, snek_offset_t nactual, uint8_t for_depth) { snek_code_add_op(snek_op_range_start); compile_extend(sizeof (snek_offset_t), &nactual); compile_extend(sizeof(uint8_t), &for_depth); compile_extend(sizeof (snek_id_t), &id); snek_code_add_op(snek_op_range_step); compile_extend(sizeof(snek_offset_t), NULL); compile_extend(sizeof(uint8_t), &for_depth); compile_extend(sizeof (snek_id_t), &id); } void snek_code_add_in_enum(snek_id_t id, uint8_t for_depth) { snek_id_t list; snek_id_t i; list = snek_for_tmp(for_depth, 0); i = snek_for_tmp(for_depth, 1); snek_code_add_op_id(snek_op_assign, list); snek_code_add_number(0.0f); snek_code_add_op_id(snek_op_assign, i); snek_code_add_op(snek_op_in_step); compile_extend(sizeof(snek_offset_t), NULL); compile_extend(sizeof(uint8_t), &for_depth); compile_extend(sizeof(snek_id_t), &id); } void snek_code_patch_branch(snek_offset_t branch, snek_offset_t target) { memcpy(snek_compile + branch + 1, &target, sizeof (snek_offset_t)); } void snek_code_patch_forward(snek_offset_t start, snek_offset_t stop, snek_forward_t forward, snek_offset_t target) { snek_offset_t ip = start; while (ip < stop) { snek_op_t op = snek_compile[ip++]; snek_op_t push = op & snek_op_push; op &= ~snek_op_push; snek_offset_t f; switch (op) { case snek_op_forward: memcpy(&f, &snek_compile[ip], sizeof (snek_offset_t)); if ((snek_forward_t) f == forward) { snek_compile[ip-1] = snek_op_branch | push; memcpy(&snek_compile[ip], &target, sizeof(snek_offset_t)); } break; default: break; } ip += snek_op_extra_size(op); } } void snek_code_reset(void) { snek_compile_size = 0; compile_alloc = 0; snek_compile = NULL; } snek_code_t * snek_code_finish(void) { if (snek_compile_size == 0) return NULL; snek_code_patch_forward(0, snek_compile_size, snek_forward_return, snek_code_current()); snek_code_t *code = snek_alloc(sizeof (snek_code_t) + snek_compile_size); if (code) { memcpy(&code->code, snek_compile, snek_compile_size); code->size = snek_compile_size; #ifdef DEBUG_COMPILE snek_code_dump(code); #endif } snek_code_reset(); return code; } snek_offset_t snek_code_line(snek_code_t *code) { snek_offset_t ip; snek_offset_t line = 0; snek_op_t op; for (ip = 0; ip < code->size; ip += snek_op_extra_size(op)) { op = code->code[ip++]; if (op == snek_op_line) { memcpy(&line, &code->code[ip], sizeof (snek_offset_t)); break; } } return line; } snek_offset_t snek_line; snek_poly_t snek_stack[SNEK_STACK]; snek_offset_t snek_stackp; snek_poly_t snek_a = SNEK_NULL; snek_code_t *snek_code; float snek_poly_get_float(snek_poly_t a) { if (snek_poly_type(a) == snek_float) return snek_poly_to_float(a); snek_error_type_1(a); return 0.0f; } snek_soffset_t snek_poly_get_soffset(snek_poly_t a) { return (snek_soffset_t) snek_poly_get_float(a); } void snek_stack_push(snek_poly_t p) { if (snek_stackp == SNEK_STACK) { snek_error_0("stack overflow"); return; } snek_stack[snek_stackp++] = p; } snek_poly_t snek_stack_pop(void) { #if SNEK_DEBUG if (!snek_stackp) snek_panic("stack underflow"); #endif return snek_stack[--snek_stackp]; } snek_poly_t snek_stack_pick(snek_offset_t off) { #if SNEK_DEBUG if (off >= snek_stackp) snek_panic("stack underflow"); #endif return snek_stack[snek_stackp - off - 1]; } void snek_stack_drop(snek_offset_t off) { #if SNEK_DEBUG if (off > snek_stackp) snek_panic("stack underflow"); #endif snek_stackp -= off; } float snek_stack_pop_float(void) { return snek_poly_get_float(snek_stack_pop()); } snek_soffset_t snek_stack_pop_soffset(void) { return (snek_soffset_t) snek_stack_pop_float(); } static void snek_range_start(snek_offset_t ip) { /* Fetch params from instruction */ snek_offset_t nactual; snek_id_t id; uint8_t for_depth; memcpy(&nactual, &snek_code->code[ip], sizeof(snek_offset_t)); memcpy(&id, &snek_code->code[ip + sizeof(snek_offset_t) + sizeof (uint8_t)], sizeof (snek_id_t)); memcpy(&for_depth, &snek_code->code[ip + sizeof(snek_offset_t)], sizeof (uint8_t)); float current = 0.0f; float limit = 0.0f; float step = 1.0f; switch (nactual) { case 1: limit = snek_stack_pop_float(); break; case 2: limit = snek_stack_pop_float(); current = snek_stack_pop_float(); break; case 3: step = snek_stack_pop_float(); limit = snek_stack_pop_float(); current = snek_stack_pop_float(); if (step == 0) { snek_error_step(); return; } break; default: snek_stack_drop(nactual); snek_error_args(3, nactual); return; } /* Assign initial value (current - step) */ snek_poly_t *id_ref = snek_id_ref(id, true); if(!id_ref) return; *id_ref = snek_float_to_poly(current - step); /* Save limit */ snek_poly_t *limit_ref = snek_id_ref(snek_for_tmp(for_depth, 0), true); if (!limit_ref) return; *limit_ref = snek_float_to_poly(limit); /* Save step */ snek_poly_t *step_ref = snek_id_ref(snek_for_tmp(for_depth, 1), true); if (!step_ref) return; *step_ref = snek_float_to_poly(step); return; } static bool snek_range_step(snek_offset_t ip) { uint8_t for_depth; snek_id_t id; memcpy(&for_depth, &snek_code->code[ip + sizeof(snek_offset_t)], sizeof (uint8_t)); memcpy(&id, &snek_code->code[ip + sizeof(snek_offset_t) + sizeof (uint8_t)], sizeof (snek_id_t)); snek_poly_t *id_ref = snek_id_ref(id, false); snek_poly_t *limit_ref = snek_id_ref(snek_for_tmp(for_depth, 0), false); snek_poly_t *step_ref = snek_id_ref(snek_for_tmp(for_depth, 1), false); if (!id_ref || !limit_ref || !step_ref) return false; float step = snek_poly_get_float(*step_ref); float value = snek_poly_get_float(*id_ref) + step; *id_ref = snek_float_to_poly(value); float limit = snek_poly_get_float(*limit_ref); if (step > 0 ? value >= limit : value <= limit) return false; return true; } static bool snek_in_step(snek_offset_t ip) { uint8_t for_depth; snek_id_t id; snek_poly_t *ref; memcpy(&for_depth, &snek_code->code[ip + sizeof(snek_offset_t)], sizeof(uint8_t)); /* Get current index, save next index */ snek_poly_t *i_ref = snek_id_ref(snek_for_tmp(for_depth, 1), false); snek_soffset_t i = snek_poly_get_soffset(*i_ref); *i_ref = snek_soffset_to_poly(i + 1); /* Fetch iterable */ snek_poly_t array = *snek_id_ref(snek_for_tmp(for_depth, 0), false); /* Compute current value */ snek_poly_t value = SNEK_NULL; snek_list_t *list; switch (snek_poly_type(array)) { case snek_list: list = snek_poly_to_list(array); if (snek_list_type(list) == snek_list_dict) i *= 2; if ((snek_offset_t) i < list->size) value = snek_list_data(list)[(snek_offset_t) i]; break; case snek_string: value = snek_string_get(snek_poly_to_string(array), snek_soffset_to_poly(i), false); break; default: snek_error_type_1(array); return true; } /* End of iteration */ if (snek_is_null(value)) return false; /* Update value */ memcpy(&id, &snek_code->code[ip + sizeof(snek_offset_t) + sizeof (uint8_t)], sizeof (snek_id_t)); snek_stack_push(value); ref = snek_id_ref(id, true); value = snek_stack_pop(); if (!ref) return false; *ref = value; return true; } static int32_t __attribute__((noinline)) snek_float_to_int(float f) { int32_t i = (int32_t) f; if (i != f) snek_error_value(snek_float_to_poly(f)); return i; } static snek_poly_t snek_binary(snek_poly_t a, snek_op_t op, snek_poly_t b, bool inplace) { snek_list_t *al; snek_list_t *bl; float af; float bf; bool found; snek_poly_t ret = SNEK_NULL; if (op <= snek_op_is_not) { int8_t cmp = snek_poly_cmp(a, b, op >= snek_op_is); bool v; switch (op) { case snek_op_eq: case snek_op_is: v = cmp == 0; break; case snek_op_ne: case snek_op_is_not: v = cmp != 0; break; case snek_op_gt: v = cmp > 0; break; case snek_op_lt: v = cmp < 0; break; case snek_op_ge: v = cmp >= 0; break; case snek_op_le: default: v = cmp <= 0; break; } return snek_bool_to_poly(v); } snek_type_t at = snek_poly_type(a); snek_type_t bt = snek_poly_type(b); if (op == snek_op_array) { switch (at) { case snek_list: ret = snek_list_get(snek_poly_to_list(a), b, true); break; case snek_string: ret = snek_string_get(snek_poly_to_string(a), b, true); break; default: break; } } else if (at == snek_float && bt == snek_float) { af = snek_poly_to_float(a); bf = snek_poly_to_float(b); switch (op) { case snek_op_plus: af = af + bf; break; case snek_op_minus: af = af - bf; break; case snek_op_times: af = af * bf; break; case snek_op_divide: af = af / bf; break; case snek_op_div: af = floorf(af / bf); break; case snek_op_mod: af = af - floorf(af/bf) * bf; break; case snek_op_pow: af = powf(af, bf); break; case snek_op_land: af = (float) (snek_float_to_int(af) & snek_float_to_int(bf)); break; case snek_op_lor: af = (float) (snek_float_to_int(af) | snek_float_to_int(bf)); break; case snek_op_lxor: af = (float) (snek_float_to_int(af) ^ snek_float_to_int(bf)); break; case snek_op_lshift: af = (float) (snek_float_to_int(af) << snek_float_to_int(bf)); break; case snek_op_rshift: af = (float) (snek_float_to_int(af) >> snek_float_to_int(bf)); break; default: break; } ret = snek_float_to_poly(af); } else { switch (op) { case snek_op_in: case snek_op_not_in: if (bt == snek_list) { bl = snek_poly_to_list(b); snek_offset_t o, step = snek_list_type(bl) == snek_list_dict ? 2 : 1; found = false; for (o = 0; o < bl->size; o += step) { if (snek_poly_cmp(a, snek_list_data(bl)[o], false) == 0) { found = true; break; } } ret = snek_bool_to_poly(found == (op == snek_op_in)); } if (at == snek_string && bt == snek_string) { found = strstr(snek_poly_to_string(b), snek_poly_to_string(a)) != NULL; ret = snek_bool_to_poly(found == (op == snek_op_in)); } break; case snek_op_plus: if (at == snek_string && bt == snek_string) { ret = snek_string_cat(snek_poly_to_string(a), snek_poly_to_string(b)); } else if (at == snek_list && bt == snek_list) { al = snek_poly_to_list(a); bl = snek_poly_to_list(b); if (snek_list_type(al) == snek_list_type(bl)) { if (snek_list_type(al) != snek_list_dict) { if (inplace && !snek_list_readonly(al)) al = snek_list_append(al, bl); else al = snek_list_plus(al, bl); ret = snek_list_to_poly(al); } } } break; case snek_op_times: if (bt == snek_float) { snek_soffset_t bo = snek_poly_get_soffset(b); if (bo < 0) ret = SNEK_NULL; else { if (at == snek_list) { al = snek_poly_to_list(a); if (snek_list_type(al) != snek_list_dict) { ret = snek_list_to_poly(snek_list_times(al, bo)); } } else if (at == snek_string) { ret = snek_string_times(snek_poly_to_string(a), bo); } } } break; case snek_op_mod: if (at == snek_string) ret = snek_string_to_poly(snek_string_interpolate(snek_poly_to_string(a), b)); break; default: break; } } if (snek_is_null(ret)) return snek_error_type_2(a, b); return ret; } static inline snek_soffset_t soffset_sgn(snek_soffset_t s) { return (s > 0) - (s < 0); } static void snek_slice(uint8_t bits) { snek_soffset_t start = SNEK_SOFFSET_NONE; snek_soffset_t end = SNEK_SOFFSET_NONE; snek_soffset_t stride = 1; snek_soffset_t len; if (bits & SNEK_OP_SLICE_STRIDE) stride = snek_stack_pop_soffset(); if (bits & SNEK_OP_SLICE_END) end = snek_stack_pop_soffset(); if (bits & SNEK_OP_SLICE_START) start = snek_stack_pop_soffset(); snek_a = snek_stack_pop(); len = snek_poly_len(snek_a); if (stride == 0) { snek_error_step(); return; } /* Negative positions are relative to end */ if (start < 0) start = len + start; if (end < 0) end = len + end; if (stride > 0) { /* Use zero by default, or if negative */ if (start == SNEK_SOFFSET_NONE || start < 0) start = 0; /* use len by default or if too big */ if (end == SNEK_SOFFSET_NONE || end > len) end = len; } else { /* Use len-1 by default, or if too big */ if (start == SNEK_SOFFSET_NONE || start >= len) start = len - 1; /* Use -1 by default or if too small */ if (end == SNEK_SOFFSET_NONE || end < -1) end = -1; } snek_slice_t slice; slice.pos = start; slice.stride = stride; snek_soffset_t count = (end + stride - soffset_sgn(stride) - start) / stride; if (count < 0) count = 0; slice.count = count; slice.identity = start == 0 && count == len && stride == 1; switch (snek_poly_type(snek_a)) { case snek_string: snek_a = snek_string_to_poly(snek_string_slice(snek_poly_to_string(snek_a), &slice)); break; case snek_list: snek_a = snek_list_to_poly(snek_list_slice(snek_poly_to_list(snek_a), &slice)); break; default: break; } } void snek_undefined(snek_id_t id) { snek_error("undefined: %s", snek_name_string(id)); } static void snek_assign(snek_id_t id, snek_op_t op) { snek_poly_t *ref; if (op == snek_op_assign_named) { if (snek_id_is_local(id)) return; op = snek_op_assign; } for (;;) { bool is_pure_assign = op == snek_op_assign; if (id != SNEK_ID_NONE) { if (!is_pure_assign && snek_frame && !snek_id_is_local(id)) ref = NULL; else ref = snek_id_ref(id, is_pure_assign); if (!ref) { snek_undefined(id); return; } } else { snek_poly_t ip = snek_stack_pop(); snek_poly_t lp = snek_stack_pop(); snek_list_t *l; if (snek_poly_type(lp) != snek_list || snek_list_readonly(l = snek_poly_to_list(lp))) { snek_error_type_1(lp); return; } ref = snek_list_ref(l, ip, true); if (!ref) return; } if (is_pure_assign) break; /* Recover the two values popped from the stack so * that they will be popped again */ if (id == SNEK_ID_NONE) snek_stackp += 2; snek_a = snek_binary(*ref, op - (snek_op_assign_plus - snek_op_plus), snek_a, true); op = snek_op_assign; } *ref = snek_a; } static void snek_call_builtin(const snek_builtin_t *builtin, uint8_t nposition, uint8_t nnamed) { snek_poly_t *actuals = &snek_stack[snek_stackp - (nposition + (nnamed << 1))]; snek_soffset_t nformal = SNEK_BUILTIN_NFORMAL(builtin); if (nformal < 0) { snek_a = SNEK_BUILTIN_FUNCV(builtin)(nposition, nnamed, actuals); } else if (nposition != nformal || nnamed) { snek_error_args(nformal, nposition); } else { switch (nformal) { case 0: snek_a = SNEK_BUILTIN_FUNC0(builtin)(); break; case 1: snek_a = SNEK_BUILTIN_FUNC1(builtin)(actuals[0]); break; #if SNEK_BUILTIN_NAMES_MAX_ARGS >= 2 case 2: snek_a = SNEK_BUILTIN_FUNC2(builtin)(actuals[0], actuals[1]); break; #endif #if SNEK_BUILTIN_NAMES_MAX_ARGS >= 3 case 3: snek_a = SNEK_BUILTIN_FUNC3(builtin)(actuals[0], actuals[1], actuals[2]); break; #endif #if SNEK_BUILTIN_NAMES_MAX_ARGS >= 4 #error Need more builtin calls #endif } } } snek_poly_t snek_code_run(snek_code_t *code_in) { snek_code = code_in; snek_poly_t *ref = NULL; snek_id_t id; snek_offset_t ip = 0; snek_offset_t o; while (snek_code) { while (ip < snek_code->size) { #ifdef DEBUG_EXEC snek_code_dump_instruction(snek_code, ip); #endif snek_op_t op = snek_code->code[ip++]; bool push = (op & snek_op_push) != 0; op &= ~snek_op_push; switch(op) { case snek_op_eq: case snek_op_ne: case snek_op_gt: case snek_op_lt: case snek_op_ge: case snek_op_le: case snek_op_is: case snek_op_is_not: case snek_op_in: case snek_op_not_in: case snek_op_array: case snek_op_plus: case snek_op_minus: case snek_op_times: case snek_op_divide: case snek_op_div: case snek_op_mod: case snek_op_pow: case snek_op_land: case snek_op_lor: case snek_op_lxor: case snek_op_lshift: case snek_op_rshift: snek_a = snek_binary(snek_stack_pick(0), op, snek_a, false); snek_stack_drop(1); break; case snek_op_assign_plus: case snek_op_assign_minus: case snek_op_assign_times: case snek_op_assign_divide: case snek_op_assign_div: case snek_op_assign_mod: case snek_op_assign_pow: case snek_op_assign_land: case snek_op_assign_lor: case snek_op_assign_lxor: case snek_op_assign_lshift: case snek_op_assign_rshift: case snek_op_assign: case snek_op_assign_named: memcpy(&id, &snek_code->code[ip], sizeof (snek_id_t)); ip += sizeof (snek_id_t); snek_assign(id, op); break; case snek_op_num: memcpy(&snek_a.f, &snek_code->code[ip], sizeof(float)); ip += sizeof(float); break; case snek_op_int: snek_a.f = (int8_t) snek_code->code[ip]; ip += 1; break; case snek_op_string: memcpy(&o, &snek_code->code[ip], sizeof(snek_offset_t)); ip += sizeof (snek_offset_t); snek_a = snek_offset_to_poly(o, snek_string); break; case snek_op_list: case snek_op_tuple: case snek_op_dict: memcpy(&o, &snek_code->code[ip], sizeof(snek_offset_t)); ip += sizeof (snek_offset_t); snek_a = snek_list_imm(o, op - snek_op_list); break; case snek_op_id: memcpy(&id, &snek_code->code[ip], sizeof(snek_id_t)); ip += sizeof (snek_id_t); ref = snek_id_ref(id, false); if (ref) { snek_a = *ref; break; } if (id < SNEK_BUILTIN_MAX_BUILTIN) { snek_a = snek_builtin_id_to_poly(id); break; } snek_undefined(id); break; case snek_op_not: snek_a = snek_bool_to_poly(!snek_poly_true(snek_a)); break; case snek_op_uminus: snek_a = snek_float_to_poly(-snek_poly_get_float(snek_a)); break; case snek_op_lnot: snek_a = snek_float_to_poly(~(uint32_t) snek_float_to_int(snek_poly_get_float(snek_a))); break; case snek_op_call: memcpy(&o, &snek_code->code[ip], sizeof (snek_offset_t)); snek_offset_t nposition = (o & 0xff); snek_offset_t nnamed = (o >> 8); snek_offset_t nstack = nposition + (nnamed<<1); snek_a = snek_stack_pick(nstack); switch (snek_poly_type(snek_a)) { case snek_func: if (!snek_func_push(nposition, nnamed, ip - 1)) break; snek_a = snek_stack_pop(); /* get function back */ snek_code = snek_pool_addr(snek_poly_to_func(snek_a)->code); ip = 0; push = false; /* will pick up push on return */ goto done_func; case snek_builtin: snek_call_builtin(snek_poly_to_builtin(snek_a), nposition, nnamed); break; default: snek_error_type_1(snek_a); break; } ip += sizeof (snek_offset_t); snek_stack_drop(nstack + 1); done_func: break; case snek_op_slice: snek_slice(snek_code->code[ip]); ip++; break; case snek_op_global: memcpy(&id, &snek_code->code[ip], sizeof (snek_id_t)); ip += sizeof (snek_id_t); snek_frame_mark_global(id); break; case snek_op_del: memcpy(&id, &snek_code->code[ip], sizeof (snek_id_t)); ip += sizeof (snek_id_t); if (id == SNEK_ID_NONE) { snek_poly_t lp = snek_stack_pop(); if (snek_poly_type(lp) != snek_list) { snek_error_type_1(lp); } else { snek_list_del(lp, snek_a); snek_a = SNEK_NULL; } } else { snek_id_del(id); } break; #ifdef SNEK_ASSERT case snek_op_assert: if (!snek_poly_true(snek_a)) { snek_error_0("AssertionError"); } snek_a = SNEK_NULL; break; #endif case snek_op_branch: memcpy(&ip, &snek_code->code[ip], sizeof (snek_offset_t)); break; case snek_op_branch_true: if (snek_poly_true(snek_a)) memcpy(&ip, &snek_code->code[ip], sizeof (snek_offset_t)); else ip += sizeof (snek_offset_t); break; case snek_op_branch_false: if (!snek_poly_true(snek_a)) memcpy(&ip, &snek_code->code[ip], sizeof (snek_offset_t)); else ip += sizeof (snek_offset_t); break; case snek_op_forward: snek_error_0("not in loop"); break; case snek_op_range_start: snek_range_start(ip); ip += sizeof (snek_offset_t) + sizeof (uint8_t) + sizeof(snek_id_t); break; case snek_op_range_step: if (!snek_range_step(ip)) memcpy(&ip, &snek_code->code[ip], sizeof (snek_offset_t)); else ip += sizeof (snek_offset_t) + sizeof (uint8_t) + sizeof(snek_id_t); break; case snek_op_in_step: if (!snek_in_step(ip)) memcpy(&ip, &snek_code->code[ip], sizeof (snek_offset_t)); else ip += sizeof (snek_offset_t) + sizeof (uint8_t) + sizeof (snek_id_t); break; case snek_op_line: memcpy(&o, &snek_code->code[ip], sizeof (snek_offset_t)); ip += sizeof (snek_offset_t); snek_line = o; break; case snek_op_null: snek_a = SNEK_NULL; break; case snek_op_nop: case snek_op_push: break; } if (snek_abort) goto abort; if (push) snek_stack_push(snek_a); #ifdef DEBUG_EXEC dbg("\t\ta= "); snek_poly_print(stddbg, snek_a, 'r'); for (o = snek_stackp; o;) { dbg(", [%d]= ", snek_stackp - o); snek_poly_print(stddbg, snek_stack[--o], 'r'); } dbg("\n"); #endif } ip = snek_frame_pop(); if (snek_code) { snek_op_t op = snek_code->code[ip]; ip += sizeof (snek_offset_t) + 1; if ((op & snek_op_push) != 0) snek_stack_push(snek_a); } } abort: /* Clear references to run objects */ snek_code = NULL; snek_frame = NULL; snek_stackp = 0; snek_poly_t ret = snek_a; snek_a = SNEK_NULL; return ret; } static snek_offset_t snek_code_size(void *addr) { snek_code_t *code = addr; return (snek_offset_t) sizeof (snek_code_t) + code->size; } static void code_mark(uint8_t *code, snek_offset_t size) { snek_offset_t ip = 0; while (ip < size) { snek_op_t op = code[ip++] & ~snek_op_push; snek_offset_t o; switch (op) { case snek_op_string: memcpy(&o, &code[ip], sizeof (snek_offset_t)); snek_mark_offset(snek_mems(snek_string), o); break; default: break; } ip += snek_op_extra_size(op); } } static void code_move(uint8_t *code, snek_offset_t size) { snek_offset_t ip = 0; while (ip < size) { snek_op_t op = code[ip++] & ~snek_op_push; switch (op) { case snek_op_string: snek_move_block_offset(&code[ip]); break; default: break; } ip += snek_op_extra_size(op); } } static void snek_code_mark(void *addr) { snek_code_t *code = addr; code_mark(code->code, code->size); } static void snek_code_move(void *addr) { snek_code_t *code = addr; code_move(code->code, code->size); } const snek_mem_t SNEK_MEM_DECLARE(snek_code_mem) = { .size = snek_code_size, .mark = snek_code_mark, .move = snek_code_move, SNEK_MEM_DECLARE_NAME("code") }; static snek_offset_t _snek_compile_size(void *addr) { (void) addr; return compile_alloc; } static void snek_compile_mark(void *addr) { code_mark(addr, snek_compile_size); } static void snek_compile_move(void *addr) { code_move(addr, snek_compile_size); } const snek_mem_t SNEK_MEM_DECLARE(snek_compile_mem) = { .size = _snek_compile_size, .mark = snek_compile_mark, .move = snek_compile_move, SNEK_MEM_DECLARE_NAME("compile") }; snek-1.1/snek-eeprom.builtin000066400000000000000000000011301353657467200161450ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # eeprom.write, 0 eeprom.show, -1 eeprom.erase, 0 snek-1.1/snek-error.c000066400000000000000000000050661353657467200145770ustar00rootroot00000000000000/* * Copyright © 2018 Keith Packard * * 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. */ #include "snek.h" bool snek_abort; #ifndef ERROR_FETCH_FORMAT_CHAR #define ERROR_FETCH_FORMAT_CHAR(a) (*(a)) #endif static void puts_clean(char *s) { unsigned char c; while ((c = (unsigned char) *s++)) { if (c < ' ') { putc('\\', stderr); switch (c) { case '\n': putc('n', stderr); break; default: fprintf(stderr, "x%02x", c); break; } } else putc(c, stderr); } } snek_poly_t snek_error_name(const char *format, ...) { va_list args; char c; if (snek_abort) return SNEK_NULL; snek_abort = true; va_start(args, format); fprintf(stderr, "%s:%d ", snek_file, snek_line); while ((c = ERROR_FETCH_FORMAT_CHAR(format++))) { if (c == '%') { switch ((c = ERROR_FETCH_FORMAT_CHAR(format++))) { case 'd': fprintf(stderr, "%d", va_arg(args, int)); break; case 's': puts_clean(va_arg(args, char *)); break; case 'p': snek_poly_print(stderr, va_arg(args, snek_poly_t), 'r'); break; #if SNEK_DEBUG default: snek_panic("bad snek_error format"); break; #endif } } else putc(c, stderr); } putc('\n', stderr); va_end(args); return SNEK_NULL; } snek_poly_t snek_error_0_name(const char *string) { return snek_error_name(string); } snek_poly_t snek_error_value(snek_poly_t p) { return snek_error("invalid value: %p", p); } snek_poly_t snek_error_type_2(snek_poly_t a, snek_poly_t b) { return snek_error("type mismatch: %p %p", a, b); } snek_poly_t snek_error_type_1(snek_poly_t a) { return snek_error("invalid type: %p", a); } snek_poly_t snek_error_step(void) { return snek_error_0("zero step"); } snek_poly_t snek_error_args(snek_soffset_t want, snek_soffset_t got) { return snek_error("bad args. wanted %d got %d", want, got); } snek_poly_t snek_error_arg(snek_id_t bad) { return snek_error("bad arg \"%s\"", snek_name_string(bad)); } snek_poly_t snek_error_syntax(char *where) { return snek_error("Syntax error at \"%s\".", where); } #if SNEK_DEBUG void snek_panic(const char *message) { snek_error(message); abort(); } #endif snek-1.1/snek-frame.c000066400000000000000000000124641353657467200145400ustar00rootroot00000000000000/* * Copyright © 2018 Keith Packard * * 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. */ #include "snek.h" snek_frame_t *snek_globals; snek_frame_t *snek_frame; static snek_frame_t *snek_pick_frame(bool globals) { if (globals) { if (!snek_globals) { snek_globals = snek_alloc(sizeof (snek_frame_t)); snek_globals->prev = SNEK_OFFSET_NONE; snek_globals->code = SNEK_OFFSET_NONE; } return snek_globals; } return snek_frame; } static snek_frame_t * snek_frame_prev(snek_frame_t *frame) { return snek_pool_addr(frame->prev); } static snek_frame_t * snek_frame_realloc(bool globals, snek_offset_t nvariables) { snek_frame_t *frame = snek_alloc(sizeof (snek_frame_t) + nvariables * sizeof (snek_variable_t)); if (!frame) return NULL; snek_frame_t *old_frame = snek_pick_frame(globals); *frame = *old_frame; frame->nvariables = nvariables; return frame; } static snek_variable_t * snek_variable_insert(bool globals) { snek_frame_t *old_frame = snek_pick_frame(globals); snek_frame_t *frame; snek_offset_t nvariables = old_frame->nvariables + 1; frame = snek_frame_realloc(globals, old_frame->nvariables + 1); if (!frame) return NULL; old_frame = snek_pick_frame(globals); memcpy(frame->variables, old_frame->variables, old_frame->nvariables * sizeof (snek_variable_t)); if (globals) snek_globals = frame; else snek_frame = frame; return &frame->variables[nvariables-1]; } static void snek_variable_delete(snek_offset_t i) { snek_frame_t *frame; frame = snek_frame_realloc(true, snek_globals->nvariables - 1); memcpy(&frame->variables[0], &snek_globals->variables[0], i * sizeof (snek_variable_t)); memcpy(&frame->variables[i], &snek_globals->variables[i+1], snek_globals->nvariables - i - 1); snek_globals = frame; } static snek_variable_t * snek_variable_lookup(bool globals, snek_id_t id, bool insert) { snek_offset_t i; snek_frame_t *frame; frame = snek_pick_frame(globals); if (!frame) return NULL; for (i = 0; i < frame->nvariables; i++) { if (frame->variables[i].id == id) return &frame->variables[i]; } if (!insert) return NULL; snek_variable_t *v = snek_variable_insert(globals); if (!v) return NULL; v->id = id; return v; } static snek_variable_t * snek_frame_lookup(snek_id_t id, bool insert) { snek_variable_t *v = NULL; if ((v = snek_variable_lookup(false, id, insert))) { if (!snek_is_global(v->value)) return v; } return snek_variable_lookup(true, id, insert); } void snek_frame_mark_global(snek_id_t id) { if (snek_frame) { snek_variable_t *v; v = snek_variable_lookup(false, id, true); if (v) v->value = SNEK_GLOBAL; } } bool snek_frame_push(snek_offset_t ip, snek_offset_t nformal) { snek_frame_t *f; f = snek_alloc(sizeof (snek_frame_t) + nformal * sizeof (snek_variable_t)); if (!f) return false; f->nvariables = nformal; f->code = snek_pool_offset(snek_code); f->ip = ip; f->prev = snek_pool_offset(snek_frame); snek_frame = f; return true; } snek_offset_t snek_frame_pop(void) { if (!snek_frame) { snek_code = NULL; return 0; } snek_offset_t ip = snek_frame->ip; snek_code = snek_pool_addr(snek_frame->code); snek_frame = snek_frame_prev(snek_frame); return ip; } snek_poly_t * snek_id_ref(snek_id_t id, bool insert) { snek_variable_t *v = snek_frame_lookup(id, insert); if (!v) return NULL; return &v->value; } bool snek_id_is_local(snek_id_t id) { return snek_variable_lookup(false, id, false) != NULL; } bool snek_id_del(snek_id_t id) { snek_offset_t i; for (i = 0; i < snek_globals->nvariables; i++) if (snek_globals->variables[i].id == id) { snek_variable_delete(i); return true; } return false; } static snek_offset_t snek_frame_size(void *addr) { snek_frame_t *frame = addr; return sizeof (snek_frame_t) + frame->nvariables * sizeof (snek_variable_t); } static void snek_frame_mark(void *addr) { snek_frame_t *f = addr; for (;;) { debug_memory("\t\tframe mark %d code %d prev %d\n", snek_pool_offset(f), f->code, f->prev); snek_offset_t i; for (i = 0; i < f->nvariables; i++) { snek_poly_t v = f->variables[i].value; if (!snek_is_global(v)) snek_poly_mark(v); } snek_mark_offset(&snek_code_mem, f->code); f = snek_frame_prev(f); if (!f || snek_mark_block_addr(&snek_frame_mem, f)) break; } } static void snek_frame_move(void *addr) { snek_frame_t *f = addr; for (;;) { debug_memory("\t\tframe move %d code %d prev %d\n", snek_pool_offset(f), f->code, f->prev); snek_offset_t i; for (i = 0; i < f->nvariables; i++) snek_poly_move(&f->variables[i].value); snek_move_offset(&snek_code_mem, &f->code); if (snek_move_block_offset(&f->prev)) break; f = snek_frame_prev(f); } } const snek_mem_t SNEK_MEM_DECLARE(snek_frame_mem) = { .size = snek_frame_size, .mark = snek_frame_mark, .move = snek_frame_move, SNEK_MEM_DECLARE_NAME("frame") }; snek-1.1/snek-func.c000066400000000000000000000062011353657467200143710ustar00rootroot00000000000000/* * Copyright © 2018 Keith Packard * * 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. */ #include "snek.h" snek_code_t *snek_stash_code; snek_func_t * snek_func_alloc(snek_code_t *code) { snek_func_t *func; snek_stash_code = code; func = snek_alloc(sizeof (snek_func_t) + snek_parse_nformal * sizeof (snek_id_t)); code = snek_stash_code; snek_stash_code = NULL; if (!func) return NULL; func->code = snek_pool_offset(code); func->nformal = snek_parse_nformal; func->nrequired = snek_parse_nformal - snek_parse_nnamed; memcpy(func->formals, snek_parse_formals, snek_parse_nformal * sizeof (snek_id_t)); return func; } static bool __attribute__((noinline)) snek_func_actual(snek_id_t id, snek_poly_t value, uint8_t pos) { snek_variable_t *existing = &snek_frame->variables[snek_frame->nvariables-1]; snek_variable_t *insert = &snek_frame->variables[pos]; while (existing > insert) { if (existing->id == id) return false; existing--; } existing->id = id; existing->value = value; return true; } static bool snek_func_check_formal(snek_id_t id, snek_func_t *func) { for (uint8_t f = 0; f < func->nformal; f++) if (func->formals[f] == id) return true; return false; } bool snek_func_push(uint8_t nposition, uint8_t nnamed, snek_offset_t ip) { uint8_t nparam = nposition + nnamed; if (!snek_frame_push(ip, nparam)) return false; snek_func_t *func = snek_poly_to_func(snek_a); if (nposition > func->nformal) { snek_error_args(func->nformal, nposition); return false; } uint8_t pos = nparam; snek_offset_t save_stackp = snek_stackp; snek_poly_t value; snek_id_t id; /* Pop the named actuals off the stack, assigning by name */ while (pos > nposition) { pos--; value = snek_stack_pop(); id = snek_stack_pop_soffset(); if (!snek_func_check_formal(id, func)) goto fail; if (!snek_func_actual(id, value, pos)) goto fail; } /* Pop the positional actuals off the stack, assigning in reverse order */ while (pos) { pos--; value = snek_stack_pop(); id = func->formals[pos]; if (!snek_func_actual(id, value, pos)) goto fail; } for (pos = 0; pos < func->nrequired; pos++) if (!snek_frame->variables[pos].id) { id = func->formals[pos]; goto fail; } return true; fail: snek_stackp = save_stackp; snek_error_arg(id); return false; } snek_offset_t snek_func_size(void *addr) { snek_func_t *func = addr; return (snek_offset_t) sizeof (snek_func_t) + func->nformal * (snek_offset_t) sizeof (snek_id_t); } void snek_func_mark(void *addr) { snek_func_t *func = addr; snek_mark_offset(&snek_code_mem, func->code); } void snek_func_move(void *addr) { snek_func_t *func = addr; snek_move_offset(&snek_code_mem, &func->code); } snek-1.1/snek-gpio.builtin000066400000000000000000000015451353657467200156260ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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, write to the Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. # talkto, 1 setpower, 1 setleft, 0 setright, 0 onfor, 1 on, 0 off, 0 read, 1 stopall, 0 pullnone, 1 pullup, 1 snek-1.1/snek-gram.ll000066400000000000000000000335061353657467200145610ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # start : command @{ snek_parse_middle = false; }@ start | ; command : @{ snek_print_val = snek_interactive; }@ stat @{ snek_code_t *code = snek_code_finish(); SNEK_CODE_HOOK_START snek_poly_t p = snek_code_run(code); SNEK_CODE_HOOK_STOP if (snek_abort) return parse_return_error; if (snek_print_val && !snek_is_null(p)) { snek_poly_print(stdout, p, 'r'); putchar('\n'); } }@ | DEF @{ snek_parse_nformal = 0; snek_parse_nnamed = 0; }@ NAME @{ value_push_id(snek_token_val.id); }@ OP opt-formals CP COLON suite @{ if (snek_compile[snek_compile_prev] == snek_op_forward) snek_code_delete_prev(); else snek_code_add_op(snek_op_null); snek_code_t *code = snek_code_finish(); if (!code) break; snek_func_t *func = snek_func_alloc(code); if (!func) break; snek_poly_t poly = snek_func_to_poly(func); snek_id_t id = value_pop().id; snek_stack_push(poly); snek_poly_t *ref = snek_id_ref(id, true); poly = snek_stack_pop(); if (ref) *ref = poly; }@ | IMPORT NAME ; opt-formals : formals | ; formals : formal formals-p ; formals-p : COMMA formal formals-p | ; formal : NAME @{ snek_parse_formals[snek_parse_nformal++] = snek_token_val.id; }@ opt-named-p ; opt-named-p : ASSIGN expr @{ snek_parse_nnamed++; snek_code_add_op_id(snek_op_assign_named, snek_parse_formals[snek_parse_nformal-1]); }@ | @{ if (snek_parse_nnamed) return parse_return_syntax; }@ ; opt-stats : stat opt-stats | ; stat : simple-stat | @{ snek_print_val = false; snek_code_add_op_offset(snek_op_line, snek_lex_line); }@ compound-stat | NL ; simple-stat : @{ snek_code_add_op_offset(snek_op_line, snek_lex_line); }@ small-stat small-stats-p NL ; small-stats-p : SEMI small-stat small-stats-p | ; small-stat : assign-expr | RETURN ret-expr @{ snek_code_add_forward(snek_forward_return); }@ | BREAK @{ snek_code_add_forward(snek_forward_break); }@ | CONTINUE @{ snek_code_add_forward(snek_forward_continue); }@ | PASS | GLOBAL globals | DEL del dels-p {SNEK_ASSERT | ASSERT assert } ; {SNEK_ASSERT assert : expr @{ snek_code_add_op(snek_op_assert); }@ ; } dels-p : COMMA del dels-p | ; del : expr-array @{ snek_token_val.op = snek_op_del; goto extract_lvalue; }@ @{ goto add_op_lvalue; }@ ; ret-expr : expr | @{ snek_code_add_op(snek_op_null); }@ ; assign-expr : expr assign-expr-p ; assign-expr-p : ASSIGN @{ extract_lvalue: snek_print_val = false; snek_offset_t prev_offset = snek_code_prev_insn(); uint8_t *prev = snek_code_at(prev_offset); snek_id_t id; /* look at the previous instruction to figure out what * it was -- an id or an array. All others are illegal */ switch (*prev) { case snek_op_id: memcpy(&id, prev + 1, sizeof (snek_id_t)); break; case snek_op_array: if (snek_token_val.op != snek_op_del) snek_code_set_push(snek_code_prev_prev_insn()); id = SNEK_ID_NONE; break; default: return parse_return_syntax; } value_push_id(id); value_push_offset(snek_token_val.op); /* eliminate the previous instruction having * extracted the useful information from it */ snek_code_delete_prev(); }@ expr @{ add_op_lvalue:; snek_op_t op = value_pop().offset; snek_id_t id = value_pop().id; /* add the assignment operator */ snek_code_add_op_id(op, id); }@ | ; globals : global globals-p | ; globals-p : COMMA global globals-p | ; global : NAME @{ snek_code_add_op_id(snek_op_global, snek_token_val.id); }@ ; compound-stat : if-stat | while-stat | for-stat ; if-stat : IF if-expr suite elif-stats @{ snek_offset_t elif_stats_off = value_pop().offset; snek_offset_t if_expr_off = value_pop().offset; snek_code_patch_branch(if_expr_off, elif_stats_off); snek_code_patch_forward(if_expr_off, snek_compile_size, snek_forward_if, snek_code_current()); }@ ; elif-stats : ELIF @{ snek_code_add_op_offset(snek_op_line, snek_lex_line); else_branch: snek_code_add_forward(snek_forward_if); value_push_offset(snek_code_current()); }@ if-expr suite elif-stats @{ snek_offset_t elif_stats_off = value_pop().offset; snek_offset_t if_expr_off = value_pop().offset; snek_code_patch_branch(if_expr_off, elif_stats_off); }@ | ELSE COLON @ goto else_branch; @ suite | @{ /* push 1 - elif_stats_off */ value_push_offset(snek_code_current()); }@ ; if-expr : expr COLON @{ snek_code_add_op_offset(snek_op_branch_false, 0); /* push 0 - if_expr_off */ value_push_offset(snek_compile_prev); }@ ; while-stat : @{ /* push 0 - top_off */ value_push_offset(snek_code_current()); }@ WHILE expr COLON @{ snek_code_add_op_offset(snek_op_branch_false, 0); /* push 1 - while_off */ value_push_offset(snek_compile_prev); }@ suite @{ /* push 2 - loop_end_off */ snek_code_add_op_offset(snek_op_branch, 0); value_push_offset(snek_compile_prev); /* push 3 - while_else_stat_off */ value_push_offset(snek_code_current()); }@ while-else-stat @{ patch_loop:; snek_offset_t while_else_stat_off = value_pop().offset; snek_offset_t loop_end_off = value_pop().offset; snek_offset_t while_off = value_pop().offset; snek_offset_t top_off = value_pop().offset; snek_code_patch_branch(while_off, while_else_stat_off); snek_code_patch_branch(loop_end_off, top_off); snek_code_patch_forward(while_off, loop_end_off, snek_forward_continue, top_off); snek_code_patch_forward(while_off, loop_end_off, snek_forward_break, snek_code_current()); }@ ; while-else-stat : ELSE COLON suite | ; for-stat : FOR NAME @{ value_push_id(snek_token_val.id); }@ IN for-params suite @{ snek_code_add_op_offset(snek_op_branch, 0); /* push 2 - loop_end_off */ value_push_offset(snek_compile_prev); /* push 3 - while_else_stat_off */ value_push_offset(snek_code_current()); for_depth--; }@ while-else-stat @ goto patch_loop; @ ; for-params : RANGE OP opt-actuals CP COLON @{ snek_offset_t num = value_pop().offset; if (num >= 256) return parse_return_syntax; snek_id_t id = value_pop().id; snek_code_add_in_range(id, num, for_depth); for_push_prevs: /* push 0 - for_off */ value_push_offset(snek_compile_prev); /* push 1 - top_off */ value_push_offset(snek_compile_prev); for_depth++; }@ | expr COLON @{ snek_id_t id = value_pop().id; snek_code_add_in_enum(id, for_depth); goto for_push_prevs; }@ ; suite : simple-stat | NL INDENT @{ value_push_indent(snek_token_val.indent); }@ stat opt-stats EXDENT @{ uint8_t indent = value_pop().indent; uint8_t exdent = snek_token_val.indent; snek_current_indent = indent; if (exdent > snek_current_indent) { snek_error("mismatching indentation indent %d exdent %d", indent, exdent); return parse_return_syntax; } }@ ; expr : expr-and expr-or-p ; expr-or-p : OR @{ snek_code_add_op_offset(snek_op_branch_true, 0); value_push_offset(snek_compile_prev); }@ expr-and @{ short_second: snek_code_patch_branch(value_pop().offset, snek_code_current()); snek_code_add_op(snek_op_nop); }@ expr-or-p | ; expr-and : expr-not expr-and-p ; expr-and-p : AND @{ snek_code_add_op_offset(snek_op_branch_false, 0); value_push_offset(snek_compile_prev); }@ expr-not @ goto short_second; @ expr-and-p | ; expr-not : expr-cmp | NOT @{ unop_first: value_push_op(snek_token_val.op); }@ expr-not @{ unop_second: snek_code_add_op(value_pop().op); }@ ; expr-cmp : expr-lor expr-cmp-p ; expr-cmp-p : cmpop @{ binop_first: snek_code_set_push(snek_code_prev_insn()); value_push_op(snek_token_val.op); }@ expr-lor @{ binop_second: snek_code_add_op(value_pop().op); }@ expr-cmp-p | IS @ goto binop_first; @ expr-lor @ goto binop_second; @ expr-cmp-p | ; cmpop : CMPOP | IN ; expr-lor : expr-land expr-lor-p ; expr-lor-p : LOR @ goto binop_first; @ expr-land @ goto binop_second; @ expr-lor-p | ; expr-land : expr-lxor expr-land-p ; expr-land-p : LAND @ goto binop_first; @ expr-lxor @ goto binop_second; @ expr-land-p | ; expr-lxor : expr-shift expr-lxor-p ; expr-lxor-p : LXOR @ goto binop_first; @ expr-shift @ goto binop_second; @ expr-lxor-p | ; expr-shift : expr-add expr-shift-p ; expr-shift-p : SHIFT @ goto binop_first; @ expr-add @ goto binop_second; @ expr-shift-p | ; expr-add : expr-mul expr-add-p ; expr-add-p : PLUS @ goto binop_first; @ expr-mul @ goto binop_second; @ expr-add-p | MINUS @ goto binop_first; @ expr-mul @ goto binop_second; @ expr-add-p | ; expr-mul : expr-unary expr-mul-p ; expr-mul-p : MULOP @ goto binop_first; @ expr-unary @ goto binop_second; @ expr-mul-p | ; expr-unary : LNOT @ goto unop_first; @ expr-unary @ goto unop_second; @ | MINUS @{ value_push_op(snek_op_uminus); }@ expr-unary @ goto unop_second; @ | PLUS expr-unary | expr-pow ; # this needs to be right associative instead of left associative... expr-pow : expr-array expr-pow-p ; expr-pow-p : POW @ goto binop_first; @ expr-array expr-pow-p @ goto binop_second; @ | ; expr-array : expr-prim expr-array-p ; expr-array-p : OS @{ snek_code_set_push(snek_code_prev_insn()); }@ array-index CS @{ bool slice = value_pop().bools; if (slice) { snek_code_set_push(snek_code_prev_insn()); uint8_t stride = value_pop().bools * SNEK_OP_SLICE_STRIDE; uint8_t end = value_pop().bools * SNEK_OP_SLICE_END; uint8_t start = value_pop().bools * SNEK_OP_SLICE_START; snek_code_add_slice(start | end | stride); } else { snek_code_add_op(snek_op_array); } }@ expr-array-p | OP @{ snek_code_set_push(snek_code_prev_insn()); }@ opt-actuals CP @{ snek_code_add_op_offset(snek_op_call, value_pop().offset); }@ expr-array-p | ; array-index : expr opt-slice | @{ value_push_bool(false); }@ slice ; opt-slice : @{ value_push_bool(true); }@ slice | @{ value_push_bool(false); }@ ; slice : COLON opt-expr slice-p @{ value_push_bool(true); }@ ; slice-p : COLON opt-expr | @{ value_push_bool(false); }@ ; opt-expr : @{ snek_code_set_push(snek_code_prev_insn()); value_push_bool(true); }@ expr | @{ value_push_bool(false); }@ ; expr-prim : OP opt-tuple CP @{ bool tuple = value_pop().bools; if (tuple) { snek_offset_t num = value_pop().offset; snek_code_add_op_offset(snek_op_tuple, num); } }@ | OS opt-actuals CS @{ snek_offset_t num = value_pop().offset; if (num >= 256) return parse_return_syntax; snek_code_add_op_offset(snek_op_list, num); }@ | OC @{ value_push_offset(0); }@ opt-dict-ents CC @{ snek_offset_t num = value_pop().offset; snek_code_add_op_offset(snek_op_dict, num); }@ | NAME @{ snek_code_add_op_id(snek_op_id, snek_token_val.id); }@ | NUMBER @{ snek_code_add_number(snek_token_val.number); }@ | STRING @{ snek_code_add_string(snek_token_val.string); }@ strings-p ; strings-p : STRING @{ snek_code_set_push(snek_code_prev_insn()); snek_code_add_string(snek_token_val.string); snek_code_add_op(snek_op_plus); }@ strings-p | ; opt-tuple : expr opt-tuple-p | @{ value_push_offset(0); value_push_bool(true); }@ ; opt-tuple-p : COMMA @{ snek_code_set_push(snek_code_prev_insn()); }@ opt-actuals @{ snek_offset_t num = value_pop().offset; if (num >= 256) return parse_return_syntax; value_push_offset(num + 1); value_push_bool(true); }@ | @{ value_push_bool(false); }@ ; opt-actuals : actuals | @{ value_push_offset(0); }@ ; actuals : @{ value_push_offset(0); }@ expr actual-p actuals-p ; actual-p : ASSIGN @{ snek_offset_t prev_offset = snek_code_prev_insn(); uint8_t *prev = snek_code_at(prev_offset); snek_id_t id; /* look at the previous instruction to figure out * if it's an id. */ if (*prev != snek_op_id) return parse_return_syntax; memcpy(&id, prev + 1, sizeof (snek_id_t)); snek_code_delete_prev(); snek_code_add_number(id); snek_code_set_push(snek_code_prev_insn()); }@ expr @{ snek_code_set_push(snek_code_prev_insn()); value_push_offset(value_pop().offset + 256); }@ | @{ snek_offset_t offset = value_pop().offset; if (offset >= 256) return parse_return_syntax; value_push_offset(offset + 1); snek_code_set_push(snek_code_prev_insn()); }@ ; actuals-p : COMMA expr actual-p actuals-p | ; opt-dict-ents : dict-ent dict-ents-p | ; dict-ents-p : COMMA dict-ent dict-ents-p | ; dict-ent : expr @{ snek_code_set_push(snek_code_prev_insn()); value_push_offset(value_pop().offset + 1); }@ dict-ent-p ; dict-ent-p : COLON expr @{ snek_code_set_push(snek_code_prev_insn()); value_push_offset(value_pop().offset + 1); }@ ; snek-1.1/snek-install.defs000066400000000000000000000024201353657467200156020ustar00rootroot00000000000000DESTDIR = PREFIX ?= /usr/local LIBDIR ?= $(PREFIX)/lib BINDIR ?= $(PREFIX)/bin SHAREDIR ?= $(PREFIX)/share/snek DOCDIR ?= $(PREFIX)/share/doc/snek EXAMPLEDIR ?= $(PREFIX)/share/doc/snek/examples PKGCONFIG ?= $(LIBDIR)/pkgconfig APPDIR ?= $(PREFIX)/share/applications ICONDIR ?= $(PREFIX)/share/icons/hicolor/scalable/apps MANDIR ?= $(PREFIX)/share/man SNEKLIB ?= $(PREFIX)/share/snek SNEKDIST ?= keithp.com:/var/www/snek/dist SNEKDOC ?= keithp.com:/var/www/snek #SNEKMAC ?= imac-remote:build/snek FIRMWARE ?= \ $(SNEK_PORTS)/crickit/snek-crickit-$(SNEK_VERSION).uf2 \ $(SNEK_PORTS)/duemilanove/snek-duemilanove-$(SNEK_VERSION).hex \ $(SNEK_PORTS)/feather/snek-feather-$(SNEK_VERSION).uf2 \ $(SNEK_PORTS)/itsybitsy3v/snek-itsybitsy3v-$(SNEK_VERSION).hex \ $(SNEK_PORTS)/itsybitsy5v/snek-itsybitsy5v-$(SNEK_VERSION).hex \ $(SNEK_PORTS)/itsybitsym0/snek-itsybitsym0-$(SNEK_VERSION).uf2 \ $(SNEK_PORTS)/mega/snek-mega-$(SNEK_VERSION).hex \ $(SNEK_PORTS)/metrom0/snek-metrom0-$(SNEK_VERSION).uf2 \ $(SNEK_PORTS)/playground/snek-playground-$(SNEK_VERSION).uf2 \ $(SNEK_PORTS)/snekboard/snek-board-$(SNEK_VERSION).uf2 USBFIRMWARE ?= \ $(SNEK_PORTS)/mega/Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex \ $(SNEK_PORTS)/snekboard/bootloader-snekboard-v3.7.0.bin include $(SNEK_ROOT)/snek.defs snek-1.1/snek-io.c000066400000000000000000000041721353657467200140520ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include "snek.h" #include "snek-io.h" #ifndef SNEK_IO_PUTS #define SNEK_IO_PUTS(s) fputs(s, stdout) #endif #ifndef SNEK_IO_PUTC #define SNEK_IO_PUTC(c) putchar(c) #endif #ifndef SNEK_IO_WAITING #define SNEK_IO_WAITING(s) false #endif #ifndef SNEK_IO_LINEBUF #define SNEK_IO_LINEBUF 132 #endif static bool raw_mode; static char buf[SNEK_IO_LINEBUF]; static uint8_t used, avail; static void snek_io_backspace(void) { avail--; if (!raw_mode) SNEK_IO_PUTS("\b \b"); } static void snek_io_addc(char c) { buf[avail++] = c; if (!raw_mode) SNEK_IO_PUTC(c); } int snek_io_getc(FILE *stream) { (void) stream; if (used == avail) { restart_cooked: if (snek_parse_middle) SNEK_IO_PUTC('+'); else SNEK_IO_PUTC('>'); SNEK_IO_PUTC(' '); restart_raw: used = avail = 0; for (;;) { if (!SNEK_IO_WAITING(stream)) fflush(stdout); uint8_t c = SNEK_IO_GETC(stream); switch (c) { case '\r': case '\n': snek_io_addc('\n'); break; case 'n' & 0x1f: raw_mode = true; continue; case 'o' & 0x1f: raw_mode = false; continue; case 'c' & 0x1f: snek_abort = false; if (raw_mode) goto restart_raw; SNEK_IO_PUTS("^C\n"); goto restart_cooked; case 'h' & 0x1f: case 0x7f: if (avail) snek_io_backspace(); continue; case 'u' & 0x1f: while (avail) snek_io_backspace(); continue; case '\t': c = ' '; /* fall through ... */ default: if (c >= (uint8_t)' ') { if (avail < SNEK_IO_LINEBUF-1) snek_io_addc(c); } continue; } break; } } return buf[used++]; } snek-1.1/snek-io.h000066400000000000000000000012561353657467200140570ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #ifndef _SNEK_IO_H_ #define _SNEK_IO_H_ #include int snek_io_getc(FILE *stream); #endif /* _SNEK_IO_H_ */ snek-1.1/snek-keyword.builtin000066400000000000000000000014501353657467200163470ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # def, DEF del, DEL global, GLOBAL #ifdef SNEK_ASSERT assert, ASSERT #endif if, IF else, ELSE elif, ELIF for, FOR while, WHILE continue, CONTINUE pass, PASS break, BREAK return, RETURN import, IMPORT range, RANGE or, OR and, AND is, IS in, IN not, NOT snek-1.1/snek-lex.c000066400000000000000000000227771353657467200142460ustar00rootroot00000000000000/* * Copyright © 2018 Keith Packard * * 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. */ #include "snek.h" snek_offset_t snek_lex_line = 1; char *snek_file = ""; uint8_t snek_current_indent; uint8_t snek_lex_indent; uint8_t snek_ignore_nl; bool snek_lex_midline; bool snek_lex_exdent; #define SNEK_MAX_TOKEN 63 char snek_lex_text[SNEK_MAX_TOKEN + 1]; static uint8_t snek_lex_len; //#define DEBUG #ifdef DEBUG #define RETURN(token) do { printf("token %s\n", #token); return (token); } while (0) #else #define RETURN(token) return(token) #endif #define RETURN_OP(_op, ret) do { snek_token_val.op = (_op); RETURN (ret); } while(0) static char ungetbuf[5]; static uint8_t ungetcount; #ifndef SNEK_GETC #define SNEK_GETC() getchar() #endif #define SNEK_EOF 0x00 static char lexchar(void) { char ch; if (ungetcount) ch = ungetbuf[--ungetcount]; else { int c = SNEK_GETC(); if (c == EOF) ch = SNEK_EOF; else ch = c; } if (ch == '\n') ++snek_lex_line; return ch; } static void unlexchar(char c) { if (c == '\n') --snek_lex_line; ungetbuf[ungetcount++] = c; } static token_t check_equal(token_t plain_token, snek_op_t plain_op, snek_op_t assign_op) { char n = lexchar(); if (n != '=') { unlexchar(n); RETURN_OP(plain_op, plain_token); } RETURN_OP(assign_op, ASSIGN); snek_token_val.op = assign_op; RETURN(ASSIGN); } static bool is_name(char c, bool first) { if ('A' <= c && c <= 'Z') return true; if ('a' <= c && c <= 'z') return true; if (c == '_') return true; if (c & 0x80) return true; if (!first) { if (c == '.') return true; if ('0' <= c && c <= '9') return true; } return false; } static int8_t __attribute__ ((noinline)) hex(char c) { if ('0' <= c && c <= '9') return c - '0'; c |= ('a' - 'A'); if ('a' <= c && c <= 'f') return c - ('a' - 10); return -1; } static bool comment(void) { char c; while ((c = lexchar() != '\n')) if (c == SNEK_EOF) return false; return true; } static void __attribute__((noinline)) start_token(void) { snek_lex_len = 0; snek_lex_text[0] = '\0'; } static bool add_token(char c) { if (snek_lex_len == SNEK_MAX_TOKEN) return false; snek_lex_text[snek_lex_len++] = c; snek_lex_text[snek_lex_len] = '\0'; return true; } typedef enum nstate { n_int, n_frac, n_expsign, n_exp } __attribute__((packed)) nstate_t; typedef enum nclass { c_digit, c_dot, c_e, c_sign, c_other, } __attribute__((packed)) nclass_t; static nclass_t cclass(char c) { if ('0' <= c && c <= '9') return c_digit; if (c == '.') return c_dot; if (c == 'e' || c == 'E') return c_e; if (c == '-' || c == '+') return c_sign; return c_other; } static token_t number(char c) { nstate_t n = n_int; nclass_t t; start_token(); for (;;) { if (!add_token(c)) RETURN(TOKEN_NONE); c = lexchar(); t = cclass(c); switch (n) { case n_int: switch (t) { case c_digit: continue; case c_dot: n = n_frac; continue; case c_e: n = n_expsign; continue; default: break; } break; case n_frac: switch (t) { case c_digit: continue; case c_e: n = n_expsign; continue; default: break; } break; case n_expsign: switch (t) { case c_sign: n = n_exp; continue; case c_digit: n = n_exp; continue; default: break; } break; case n_exp: switch (t) { case c_digit: continue; default: break; } break; } break; } unlexchar(c); snek_token_val.number = strtof(snek_lex_text, NULL); RETURN(NUMBER); } static token_t string(char q) { char c; int8_t t; start_token(); for (;;) { c = lexchar(); if (c == q) { char *ret = snek_alloc(snek_lex_len + 1); if (!ret) RETURN(TOKEN_NONE); strcpy(ret, snek_lex_text); snek_token_val.string = ret; RETURN(STRING); } if (c == '\n') { unlexchar(c); RETURN(FIRST_NON_TERMINAL); } if (c == '\\') { c = lexchar(); switch (c) { case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'x': t = hex(lexchar()) << 4; t |= hex(lexchar()); if (t < 0) RETURN(TOKEN_NONE); c = t; break; default: break; } } if (!add_token(c)) RETURN(TOKEN_NONE); } } static token_t trailing(char *next, snek_op_t without_op, token_t without, snek_op_t with_op, token_t with) { char c; uint8_t len = snek_lex_len; char *n = next; /* skip spaces between words */ while ((c = lexchar()) == ' ') add_token(c); /* match trailing word if present */ for (;;) { if (c != *n) { unlexchar(c); while (n > next) unlexchar(*--n); snek_lex_len = len; snek_lex_text[len] = '\0'; RETURN_OP(without_op, without); } if (*++n == '\0') { RETURN_OP(with_op, with); } c = lexchar(); } } static token_t __attribute__((noinline)) snek_lex_close(token_t t) { if (snek_ignore_nl) snek_ignore_nl--; return t; } token_t snek_lex(void) { char c, n; for (;;) { /* At begining of line, deal with indent changes */ if (!snek_lex_midline) { /* Find a non-comment line */ for (;;) { snek_lex_indent = 0; while ((c = lexchar()) == ' ') snek_lex_indent++; if (c == SNEK_EOF) { snek_lex_indent = 0; break; } if (!snek_interactive && c == '\n') { ; } else if (c == '#') { if (!comment()) RETURN(END); } else { break; } } snek_lex_midline = true; unlexchar(c); if (!snek_ignore_nl) { if (snek_lex_indent > snek_current_indent) { snek_token_val.indent = snek_current_indent; snek_current_indent = snek_lex_indent; RETURN(INDENT); } if (snek_lex_indent < snek_current_indent) snek_lex_exdent = true; } } /* Generate EXDENT tokens until snek_current_indent is no * bigger than the indent for this line */ if (snek_lex_exdent && !snek_ignore_nl) { if (snek_lex_indent < snek_current_indent) { snek_token_val.indent = snek_lex_indent; RETURN(EXDENT); } snek_lex_exdent = false; } c = lexchar(); start_token(); add_token(c); switch (c) { case SNEK_EOF: RETURN(END); case '\n': snek_lex_midline = false; if (snek_ignore_nl) continue; RETURN(NL); case ':': RETURN(COLON); case ';': RETURN(SEMI); case ',': RETURN(COMMA); case '(': ++snek_ignore_nl; RETURN(OP); case ')': return snek_lex_close(CP); case '[': ++snek_ignore_nl; RETURN(OS); case ']': return snek_lex_close(CS); case '{': ++snek_ignore_nl; RETURN(OC); case '}': return snek_lex_close(CC); case '+': return check_equal(PLUS, snek_op_plus, snek_op_assign_plus); case '-': return check_equal(MINUS, snek_op_minus, snek_op_assign_minus); case '*': n = lexchar(); if (n == '*') { add_token(n); return check_equal(POW, snek_op_pow, snek_op_assign_pow); } unlexchar(n); return check_equal(MULOP, snek_op_times, snek_op_assign_times); case '/': n = lexchar(); if (n == '/') { add_token(n); return check_equal(MULOP, snek_op_div, snek_op_assign_div); } unlexchar(n); return check_equal(MULOP, snek_op_divide, snek_op_assign_divide); case '%': return check_equal(MULOP, snek_op_mod, snek_op_assign_mod); case '&': return check_equal(LAND, snek_op_land, snek_op_assign_land); case '|': return check_equal(LOR, snek_op_lor, snek_op_assign_lor); case '~': RETURN_OP(snek_op_lnot, LNOT); case '^': return check_equal(LXOR, snek_op_lxor, snek_op_assign_lxor); case '<': n = lexchar(); if (n == '<') { add_token(n); return check_equal(SHIFT, snek_op_lshift, snek_op_assign_lshift); } if (n == '=') { add_token(n); RETURN_OP(snek_op_le, CMPOP); } unlexchar(n); RETURN_OP(snek_op_lt, CMPOP); case '=': n = lexchar(); if (n == '=') { add_token(n); RETURN_OP(snek_op_eq, CMPOP); } unlexchar(n); RETURN_OP(snek_op_assign, ASSIGN); case '>': n = lexchar(); if (n == '>') { add_token(n); return check_equal(SHIFT, snek_op_rshift, snek_op_assign_rshift); } if (n == '=') { add_token(n); RETURN_OP(snek_op_ge, CMPOP); } unlexchar(n); RETURN_OP(snek_op_gt, CMPOP); case '!': n = lexchar(); if (n == '=') { add_token(n); RETURN_OP(snek_op_ne, CMPOP); } unlexchar(n); break; case '"': case '\'': return string(c); case '#': if (!comment()) RETURN(END); unlexchar('\n'); continue; case ' ': continue; } if (('0' <= c && c <= '9') || c == '.') return number(c); if (!is_name(c, true)) RETURN(TOKEN_NONE); start_token(); do { if (!add_token(c)) RETURN(TOKEN_NONE); c = lexchar(); } while (is_name(c, false)); unlexchar(c); bool keyword; snek_id_t id = snek_name_id(snek_lex_text, &keyword); if (keyword) { snek_token_val.line = snek_lex_line; switch (id) { case IS: return trailing("not", snek_op_is, CMPOP, snek_op_is_not, CMPOP); case NOT: return trailing("in", snek_op_not, NOT, snek_op_not_in, CMPOP); case IN: snek_token_val.op = snek_op_in; break; } return id; } snek_token_val.id = id; RETURN(NAME); } } snek-1.1/snek-list.c000066400000000000000000000204271353657467200144170ustar00rootroot00000000000000/* * Copyright © 2018 Keith Packard * * 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. */ #include "snek.h" static snek_offset_t snek_list_alloc(snek_offset_t size) { return size + (size >> 3) + (size < 9 ? 3 : 6); } snek_poly_t * snek_list_data(snek_list_t *list) { return snek_pool_addr(list->data); } snek_list_t * snek_list_resize(snek_list_t *list, snek_offset_t size) { if (list->alloc >= size) { list->size = size; return list; } snek_offset_t alloc = snek_list_readonly(list) ? size : snek_list_alloc(size); snek_stack_push_list(list); snek_poly_t *data = snek_alloc(alloc * sizeof (snek_poly_t)); list = snek_stack_pop_list(); if (!data) return false; snek_offset_t to_copy = size; if (to_copy > list->size) to_copy = list->size; memcpy(data, snek_list_data(list), to_copy * sizeof (snek_poly_t)); list->data = snek_pool_offset(data); list->size = size; list->alloc = alloc; return list; } snek_list_t *snek_empty_tuple; static snek_list_t * snek_list_head_alloc(snek_list_type_t type) { snek_list_t *list = snek_alloc(sizeof(snek_list_t)); if (list) snek_list_set_type(list, type); return list; } snek_list_t * snek_list_make(snek_offset_t size, snek_list_type_t type) { if (size == 0 && type == snek_list_tuple) { if (!snek_empty_tuple) return snek_empty_tuple = snek_list_head_alloc(type); return snek_empty_tuple; } snek_list_t *list = snek_list_head_alloc(type); if (list) list = snek_list_resize(list, size); return list; } snek_list_t * snek_list_append(snek_list_t *list, snek_list_t *append) { snek_offset_t oldsize = list->size; snek_offset_t append_size = append->size; if (append == list) append = NULL; else snek_stack_push_list(append); list = snek_list_resize(list, list->size + append_size); if (append) append = snek_stack_pop_list(); else append = list; if (list) memcpy((snek_poly_t *) snek_list_data(list) + oldsize, snek_list_data(append), append_size * sizeof(snek_poly_t)); return list; } snek_list_t * snek_list_plus(snek_list_t *a, snek_list_t *b) { snek_stack_push_list(a); snek_stack_push_list(b); snek_list_t *n = snek_list_make(a->size + b->size, snek_list_type(a)); b = snek_stack_pop_list(); a = snek_stack_pop_list(); if (!n) return NULL; snek_poly_t *ndata = snek_list_data(n); snek_poly_t *adata = snek_list_data(a); memcpy(ndata, adata, a->size * sizeof(snek_poly_t)); snek_poly_t *bdata = snek_list_data(b); memcpy(ndata + a->size, bdata, b->size * sizeof(snek_poly_t)); return n; } snek_list_t * snek_list_times(snek_list_t *a, snek_soffset_t count) { if (count < 0) count = 0; snek_stack_push_list(a); snek_offset_t size = a->size; snek_list_t *n = snek_list_make(size * count, snek_list_type(a)); a = snek_stack_pop_list(); if (!n) return NULL; snek_poly_t *src = snek_list_data(a); snek_poly_t *dst = snek_list_data(n); while (count--) { memcpy(dst, src, size * sizeof (snek_poly_t)); dst += size; } return n; } static bool snek_mutable(snek_poly_t p) { if (snek_poly_type(p) != snek_list) return false; snek_list_t *l = snek_poly_to_list(p); if (!snek_list_readonly(l)) return true; snek_offset_t o; snek_poly_t *ldata = snek_list_data(l); for (o = 0; o < l->size; o++) if (snek_mutable(ldata[o])) return true; return false; } static snek_poly_t * _snek_list_ref(snek_list_t *list, snek_poly_t p, bool report_error, bool add) { snek_offset_t o; snek_poly_t *data = snek_list_data(list); if (snek_list_type(list) == snek_list_dict) { snek_offset_t l = 0, r = list->size; while (l < r) { o = ((l + r) >> 1) & ~1; snek_poly_t i = data[o]; if (snek_poly_cmp(i, p, false) < 0) l = o + 2; else r = o; } o = l; if (o >= list->size || snek_poly_cmp(p, data[o], false) != 0) { if (!add) goto fail; if (snek_mutable(p)) goto fail; snek_stack_push(p); list = snek_list_resize(list, list->size + 2); p = snek_stack_pop(); if (!list) return NULL; data = snek_list_data(list); memmove(data + o + 2, data + o, (list->size - o - 2) * sizeof (snek_poly_t)); data[o] = p; } o++; } else { snek_soffset_t so = snek_poly_get_soffset(p); o = so; if (so < 0) o = list->size + so; if (list->size <= o) goto fail; } return &data[o]; fail: if (report_error) snek_error_value(p); return NULL; } snek_poly_t * snek_list_ref(snek_list_t *list, snek_poly_t p, bool report_error) { return _snek_list_ref(list, p, report_error, true); } snek_poly_t snek_list_get(snek_list_t *list, snek_poly_t p, bool report_error) { snek_poly_t *r = _snek_list_ref(list, p, report_error, false); if (r) return *r; return SNEK_NULL; } void snek_list_del(snek_poly_t lp, snek_poly_t p) { snek_list_t *list = snek_poly_to_list(lp); snek_poly_t *r = snek_list_ref(list, p, true); if (!r) return; snek_offset_t num = 1; switch (snek_list_type(list)) { case snek_list_dict: r--; num = 2; break; case snek_list_tuple: snek_error_value(lp); return; default: break; } snek_offset_t remain = snek_list_data(list) + list->size - r; memmove(r, r + num, (remain - num) * sizeof (snek_poly_t)); list->size -= num; } int8_t snek_list_cmp(snek_list_t *a, snek_list_t *b) { int8_t diff = snek_list_type(a) - snek_list_type(b); if (diff) return diff; snek_poly_t *adata = snek_list_data(a); snek_poly_t *bdata = snek_list_data(b); snek_offset_t o; for (o = 0; o < a->size; o++) { if (o >= b->size) return 1; diff = snek_poly_cmp(adata[o], bdata[o], false); if (diff) return diff; } return b->size > o; } snek_poly_t snek_list_imm(snek_offset_t size, snek_list_type_t type) { snek_list_t *list = snek_list_make(size, type); if (!list) { snek_stack_drop(size); return SNEK_NULL; } snek_poly_t *data = snek_list_data(list); if (type == snek_list_dict) { list->size = 0; snek_offset_t s = size; while (s) { s -= 2; snek_poly_t key = snek_stack_pick(s+1); snek_poly_t value = snek_stack_pick(s); snek_poly_t *ref = _snek_list_ref(list, key, false, true); if (ref) *ref = value; } snek_stack_drop(size); } else { while (size--) data[size] = snek_stack_pop(); } return snek_list_to_poly(list); } #ifdef SNEK_LIST_BUILD snek_poly_t snek_list_build(snek_list_type_t type, snek_offset_t size, ...) { va_list args; va_start(args, size); snek_offset_t s = size; while (s--) snek_stack_push(va_arg(args, snek_poly_t)); return snek_list_imm(size, type); } #endif snek_list_t * snek_list_slice(snek_list_t *list, snek_slice_t *slice) { bool readonly = snek_list_readonly(list); if (readonly && slice->identity) return list; snek_stack_push_list(list); snek_list_t *n = snek_list_make(slice->count, readonly); list = snek_stack_pop_list(); if (!n) return NULL; snek_offset_t i = 0; snek_poly_t *data = snek_list_data(list); snek_poly_t *ndata = snek_list_data(n); for (; snek_slice_test(slice); snek_slice_step(slice)) ndata[i++] = data[slice->pos]; return n; } void snek_stack_push_list(snek_list_t *l) { snek_stack_push(snek_list_to_poly(l)); } snek_list_t * snek_stack_pop_list(void) { return snek_poly_to_list(snek_stack_pop()); } snek_offset_t snek_list_size(void *addr) { (void) addr; return sizeof (snek_list_t); } void snek_list_mark(void *addr) { snek_list_t *list = addr; debug_memory("\t\tmark list size %d alloc %d data %d\n", list->size, list->alloc, list->data); if (list->alloc) { snek_poly_t *data = snek_list_data(list); snek_mark_blob(data, list->alloc * sizeof (snek_poly_t)); for (snek_offset_t i = 0; i < list->size; i++) snek_poly_mark_ref(&data[i]); } } void snek_list_move(void *addr) { snek_list_t *list = addr; debug_memory("\t\tmove list size %d alloc %d data %d\n", list->size, list->alloc, list->data); if (list->alloc) { snek_move_block_offset(&list->data); snek_poly_t *data = snek_list_data(list); for (snek_offset_t i = 0; i < list->size; i++) snek_poly_move(&data[i]); } } snek-1.1/snek-math.builtin000066400000000000000000000030701353657467200156140ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # # # Number-theoretic and representation functions # math.ceil, 1 math.copysign, 2 math.fabs, 1 math.factorial, 1 math.floor, 1 math.fmod, 2 math.frexp, 1 math.fsum, 1 math.gcd, 2 math.isclose, -1 rel_tol,-2 abs_tol,-2 math.isfinite, 1 math.isinf, 1 math.isnan, 1 math.ldexp, 2 math.modf, 1 math.remainder, 2 math.trunc, 1 round, 1 # # Power and logarithmic functions # math.exp, 1 math.expm1, 1 math.exp2, 1 math.log, 1 math.log1p, 1 math.log2, 1 math.log10, 1 math.pow, 2 # # Trigonometric functions # math.acos, 1 math.asin, 1 math.atan, 1 math.atan2, 2 math.cos, 1 math.hypot, 2 math.sin, 1 math.tan, 1 # # Angular conversion # math.degrees, 1 math.radians, 1 # # Hyperbolic functions # math.acosh, 1 math.asinh, 1 math.atanh, 1 math.cosh, 1 math.sinh, 1 math.tanh, 1 # # Special functions # math.erf, 1 math.erfc, 1 math.gamma, 1 math.lgamma, 1 # # constants # math.pi, -2, 3.141592653589793 math.e, -2, 2.718281828459045 math.tau, -2, 6.283185307179586 math.inf, -2, (snek_poly_t)(float)INFINITY math.nan, -2, (snek_poly_t)(float)NAN snek-1.1/snek-math.c000066400000000000000000000133001353657467200143650ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include "snek.h" #include #define make_builtin(name) snek_builtin_ ## name #define m1(name,func) snek_poly_t make_builtin(name)(snek_poly_t a) { return snek_float_to_poly(func(snek_poly_to_float(a))); } #define m2(name,func) snek_poly_t make_builtin(name)(snek_poly_t a, snek_poly_t b) { return snek_float_to_poly(func(snek_poly_to_float(a), snek_poly_to_float(b))); } static snek_poly_t make_tuple(float a, float b) { snek_list_t *tuple = snek_list_make(2, snek_list_tuple); if (!tuple) return SNEK_NULL; snek_poly_t *data = snek_list_data(tuple); data[0] = snek_float_to_poly(a); data[1] = snek_float_to_poly(b); return snek_list_to_poly(tuple); } m1(math_ceil, ceilf) m2(math_copysign, copysignf) m1(math_fabs, fabsf) static float factorialf(float f) { float result = 1; if (f > 35) return (float) INFINITY; for (float x = 2; x <= f; x++) result *= x; return result; } m1(math_factorial, factorialf) m1(math_floor, floorf) m2(math_fmod, fmodf) snek_poly_t snek_builtin_math_frexp(snek_poly_t a) { int exp; float f = frexpf(snek_poly_to_float(a), &exp); return make_tuple(f, exp); } static float getf(snek_list_t *partials, snek_offset_t o) { return snek_poly_to_float(snek_list_data(partials)[o]); } static void putf(snek_list_t *partials, snek_offset_t o, float v) { snek_list_data(partials)[o] = snek_float_to_poly(v); } /* * Borrowed from the python3 implementation, this keeps a * full-precision sum by storing partial sums in an array. Note the * use of 'volatile' to ensure that the compiler doesn't optimize away * some operations. */ snek_poly_t snek_builtin_math_fsum(snek_poly_t a) { snek_list_t *l = snek_poly_to_list(a); if (!l) return SNEK_NULL; snek_offset_t size = l->size; snek_offset_t o = 0; snek_offset_t s = 1; if (snek_list_type(l) == snek_list_dict) { o++; s = 2; } float t, x, y; float sum = 0.0f; snek_offset_t i, j, n, m; n = 0; m = 4; snek_stack_push_list(l); snek_list_t *partials = snek_list_make(m, snek_list_list); l = snek_stack_pop_list(); if (!partials) return SNEK_NULL; volatile float hi, yr, lo; for (o = 0; o < size; o += s) { x = getf(l, o); i = 0; for (j = 0; j < n; j++) { y = getf(partials, j); if (fabsf(x) < fabsf(y)) { t = x; x = y; y = t; } hi = x + y; yr = hi - x; lo = y - yr; if (lo != 0.0f) putf(partials, i++, lo); x = hi; } n = i; if (x != 0.0f) { if (n >= m) { snek_stack_push_list(l); partials = snek_list_resize(partials, (m = n + 1)); l = snek_stack_pop_list(); if (!partials) return SNEK_NULL; } putf(partials, n++, x); } } hi = 0.0f; if (n > 0) { hi = getf(partials, --n); while (n > 0) { x = hi; y = getf(partials, --n); hi = x + y; yr = hi - x; lo = y - yr; if (lo != 0.0f) break; } if (n > 0 && ((lo < 0.0f && getf(partials, n-1) < 0.0f) || (lo > 0.0f && getf(partials, n-1) > 0.0))) { y = lo * 2.0f; x = hi + y; yr = x - hi; if (y == yr) hi = x; } } sum = hi; return snek_float_to_poly(sum); } static float gcdf(float af, float bf) { int a = fabsf(af); int b = fabsf(bf); if (a == 0 || b == 0) return 0.0f; while (a > 1 && b > 1) { int r = a % b; a = b; b = r; } return (float) a; } m2(math_gcd, gcdf) snek_poly_t snek_builtin_math_isclose(uint8_t nposition, uint8_t nnamed, snek_poly_t *args) { if (nposition != 2) return snek_error_args(2, nposition); float af = snek_poly_to_float(*args++); float bf = snek_poly_to_float(*args++); float rel_tol = 1e-6f; float abs_tol = 0.0f; while (nnamed--) { snek_id_t id = (snek_id_t) ((*args++).f); float v = snek_poly_to_float(*args++); switch (id) { case SNEK_BUILTIN_rel_tol: rel_tol = v; break; case SNEK_BUILTIN_abs_tol: abs_tol = v; break; } } float dist = fabsf(af - bf); float tol = fmaxf(rel_tol * fmaxf(fabsf(af), fabsf(bf)), abs_tol); return snek_bool_to_poly(dist <= tol); } m1(math_isfinite, isfinite) #if defined(WIN32) || defined(__APPLE__) m1(math_isinf, isinf) #else m1(math_isinf, isinff) #endif m1(math_isnan, isnanf) m2(math_ldexp, ldexpf) snek_poly_t snek_builtin_math_modf(snek_poly_t a) { float i; float f = modff(snek_poly_to_float(a), &i); return make_tuple(f, i); } m2(math_remainder, remainderf) m1(math_trunc, truncf) m1(round, roundf) m1(math_exp, expf) m1(math_expm1, expm1f) m1(math_exp2, exp2f) m1(math_log, logf) m1(math_log1p, log1pf) m1(math_log2, log2f) m1(math_log10, log10f) m2(math_pow, powf) m1(math_acos, acosf) m1(math_asin, asinf) m1(math_atan, atanf) m2(math_atan2, atan2f) m1(math_cos, cosf) m2(math_hypot, hypotf) m1(math_sin, sinf) m1(math_tan, tanf) static float degreesf(float x) { return x * 180.0f / M_PI; } static float radiansf(float x) { return x * M_PI / 180.0f; } m1(math_degrees, degreesf) m1(math_radians, radiansf) m1(math_acosh, acoshf); m1(math_asinh, asinhf); m1(math_atanh, atanhf); m1(math_cosh, coshf); m1(math_sinh, sinhf); m1(math_tanh, tanhf); m1(math_erf, erff); m1(math_erfc, erfcf); m1(math_gamma, tgammaf); #if defined(WIN32) || defined(__APPLE__) m1(math_lgamma, lgammaf); #else static float _lgammaf(float f) { int sgn; return lgammaf_r(f, &sgn); } m1(math_lgamma, _lgammaf); #endif snek-1.1/snek-memory.c000066400000000000000000000376461353657467200147670ustar00rootroot00000000000000/* * Copyright © 2018 Keith Packard * * 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. */ #include "snek.h" #ifdef SNEK_DYNAMIC uint8_t *snek_pool __attribute__((aligned(SNEK_ALLOC_ROUND))); uint32_t snek_pool_size; #else uint8_t snek_pool[SNEK_POOL] __attribute__((aligned(SNEK_ALLOC_ROUND))); #endif struct snek_root { const snek_mem_t *type; void **addr; }; #ifndef SNEK_ROOT_DECLARE #define SNEK_ROOT_DECLARE(n) n #define SNEK_ROOT_TYPE(n) ((n)->type) #define SNEK_ROOT_ADDR(n) ((n)->addr) #endif static const struct snek_root SNEK_ROOT_DECLARE(snek_root)[] = { { .type = &snek_name_mem, .addr = (void **) (void *) &snek_names, }, { .type = &snek_frame_mem, .addr = (void **) (void *) &snek_globals, }, { .type = &snek_frame_mem, .addr = (void **) (void *) &snek_frame, }, { .type = &snek_code_mem, .addr = (void **) (void *) &snek_stash_code, }, { .type = &snek_code_mem, .addr = (void **) (void *) &snek_code, }, { .type = &_snek_mems[snek_list - 1], .addr = (void **) (void *) &snek_empty_tuple, }, { .type = NULL, .addr = (void **) (void *) &snek_a, }, { .type = &snek_compile_mem, .addr = (void **) (void *) &snek_compile, }, }; #ifdef SNEK_MEM_CACHE_NUM static const void ** const snek_mem_cache[] = { (const void **) &SNEK_MEM_CACHE_0, #if SNEK_MEM_CACHE_NUM > 1 (const void **) &SNEK_MEM_CACHE_1, #endif }; #endif #define SNEK_ROOT (sizeof (snek_root) / sizeof (snek_root[0])) #define SNEK_BUSY_SIZE ((SNEK_POOL + 31) / 32) #define SNEK_NCHUNK_EST(pool) ((pool) / 64) struct snek_chunk { snek_offset_t old_offset; union { snek_offset_t size; snek_offset_t new_offset; }; }; #ifdef SNEK_DYNAMIC static uint8_t *snek_busy; static struct snek_chunk *snek_chunk; static snek_offset_t SNEK_NCHUNK; typedef snek_soffset_t snek_chunk_t; bool snek_mem_alloc(snek_poly_t pool_size) { snek_poly_t busy_size = (pool_size + 31) / 32; snek_pool = malloc(pool_size + busy_size + busy_size + busy_size + SNEK_NCHUNK_EST(pool_size) * sizeof (struct snek_chunk)); if (!snek_pool) return false; snek_busy = snek_pool + pool_size; snek_chunk = (struct snek_chunk *) (((uintptr_t)(snek_busy + busy_size) + 7) & ~7); snek_pool_size = pool_size; SNEK_NCHUNK = SNEK_NCHUNK_EST(pool_size); return true; } #else #define SNEK_NCHUNK SNEK_NCHUNK_EST(SNEK_POOL) static uint8_t snek_busy[SNEK_BUSY_SIZE]; static struct snek_chunk snek_chunk[SNEK_NCHUNK]; #if SNEK_NCHUNK < 255 typedef uint8_t snek_chunk_t; #else typedef snek_offset_t snek_chunk_t; #endif #endif static snek_offset_t snek_note_list = SNEK_OFFSET_NONE; static snek_offset_t snek_top; /* Offset of an address within the pool. */ static snek_offset_t pool_offset(const void *addr) { #if SNEK_DEBUG if (addr == NULL) snek_panic("null in pool_offset"); if ((uint8_t *) addr < snek_pool || &snek_pool[SNEK_POOL] <= (uint8_t *) addr) snek_panic("out of bounds in pool_offset"); if (((uintptr_t) addr & (SNEK_ALLOC_ROUND-1)) != 0) snek_panic("unaligned addr in pool_offset"); #endif return ((uint8_t *) addr) - snek_pool; } /* Address of an offset within the pool */ static void *pool_addr(snek_offset_t offset) { #if SNEK_DEBUG if (snek_offset_is_none(offset)) snek_panic("none in pool_addr"); if (offset >= SNEK_POOL) snek_panic("out of bounds in pool_addr"); if ((offset & (SNEK_ALLOC_ROUND-1)) != 0) snek_panic("unaligned offset in pool_addr"); #endif #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Warray-bounds" return snek_pool + offset; #pragma GCC diagnostic pop } static snek_offset_t tag_byte(snek_offset_t offset) { return offset >> (SNEK_ALLOC_SHIFT + 3); } static uint8_t tag_bit(snek_offset_t offset) { return (offset >> SNEK_ALLOC_SHIFT) & 7; } static void mark(snek_offset_t offset) { snek_busy[tag_byte(offset)] |= (1 << tag_bit(offset)); } static bool busy(snek_offset_t offset) { return (snek_busy[tag_byte(offset)] >> tag_bit(offset)) & 1; } bool snek_is_pool_addr(const void *addr) { const uint8_t *a = addr; return (snek_pool <= a) && (a < snek_pool + SNEK_POOL); } static snek_offset_t snek_size_round(snek_offset_t size) { return (size + (SNEK_ALLOC_ROUND - 1)) & ~(SNEK_ALLOC_ROUND - 1); } static snek_offset_t snek_size(const snek_mem_t *mem, void *addr) { return snek_size_round(SNEK_MEM_SIZE(mem)(addr)); } static void note_list(snek_list_t *list_old, snek_list_t *list_new) { debug_memory("\tnote list %d -> %d\n", pool_offset(list_old), pool_offset(list_new)); snek_list_set_note_next(list_new, snek_note_list); snek_note_list = pool_offset(list_old); } static snek_offset_t chunk_low, chunk_high; static snek_chunk_t chunk_first, chunk_last; static snek_chunk_t find_chunk(snek_offset_t offset) { snek_chunk_t l, r; /* Binary search for the location */ l = chunk_first; r = chunk_last; while (l < r) { snek_chunk_t m = (l + r) >> 1; if (snek_chunk[m].old_offset < offset) l = m + 1; else r = m; } return l; } static void note_chunk(snek_offset_t offset, snek_offset_t size) { snek_chunk_t chunk; snek_offset_t end; if (offset < chunk_low || chunk_high <= offset) return; chunk = find_chunk(offset); #if SNEK_DEBUG if (chunk >= SNEK_NCHUNK) snek_error_0("note chunk failed"); #endif /* * The correct location is always in 'l', with r = l-1 being * the entry before the right one */ /* Shuffle existing entries right */ end = chunk_last + 1; if (end > SNEK_NCHUNK) end = SNEK_NCHUNK; memmove(&snek_chunk[chunk+1], &snek_chunk[chunk], (end - (chunk+1)) * sizeof (struct snek_chunk)); /* Add new entry */ snek_chunk[chunk].old_offset = offset; snek_chunk[chunk].size = size; /* Increment the number of elements up to the size of the array */ if (chunk_last < SNEK_NCHUNK) chunk_last++; debug_memory("add chunk %d offset %d size %d chunk_last %d\n", chunk, offset, size, chunk_last); /* Set the top address if the array is full */ if (chunk_last == SNEK_NCHUNK) { chunk_high = snek_chunk[SNEK_NCHUNK-1].old_offset + snek_chunk[SNEK_NCHUNK-1].size; debug_memory("reset chunk_high to %d\n", chunk_high); } } static void reset_chunks(void) { chunk_high = snek_top; chunk_last = 0; chunk_first = 0; } /* * Walk all referenced objects calling functions on each one */ static void walk(bool (*visit_addr)(const struct snek_mem *type, void **addr), bool (*visit_poly)(snek_poly_t *p)) { snek_offset_t i; memset(snek_busy, '\0', SNEK_BUSY_SIZE); for (i = 0; i < snek_stackp; i++) visit_poly(&snek_stack[i]); for (i = 0; i < (snek_offset_t) SNEK_ROOT; i++) { const snek_mem_t *mem = SNEK_ROOT_TYPE(&snek_root[i]); if (mem) { void **a = SNEK_ROOT_ADDR(&snek_root[i]), *v; if (a == NULL || (v = *a) != NULL) { visit_addr(mem, a); } } else { snek_poly_t *a = (snek_poly_t *) SNEK_ROOT_ADDR(&snek_root[i]), p; if (a && !snek_is_null(p = *a)) { visit_poly(a); } } } while (!snek_offset_is_none(snek_note_list)) { snek_offset_t note = snek_note_list; snek_note_list = SNEK_OFFSET_NONE; debug_memory("processing list %d\n", note); while (!snek_offset_is_none(note)) { snek_list_t *list = pool_addr(note); debug_memory("\tprocess list %d\n", pool_offset(list)); visit_addr(snek_mems(snek_list), (void **) &list); note = snek_list_note_next(list); debug_memory("\t\tprocessed, list is now %d next now %d\n", pool_offset(list), note); snek_list_set_note_next(list, 0); } debug_memory("done procesing list\n"); } } static bool snek_mark_ref(const struct snek_mem *type, void **ref) { return snek_mark_addr(type, *ref); } bool snek_poly_mark_ref(snek_poly_t *p) { return snek_poly_mark(*p); } snek_offset_t snek_last_top; uint8_t snek_collect_counts; #ifdef DEBUG_MEMORY static void dump_busy(void) { snek_offset_t i; for (i = 0; i < snek_top; i += 4) if (busy(i)) debug_memory("\tBusy %d\n", i); } #else #define dump_busy() #endif snek_offset_t snek_collect(uint8_t style) { snek_soffset_t c; snek_offset_t top; debug_memory("Collect...\n"); /* The first time through, we're doing a full collect */ if (snek_last_top == 0) style = SNEK_COLLECT_FULL; /* One in a while, just do a full collect */ if (snek_collect_counts >= 128) style = SNEK_COLLECT_FULL; if (style == SNEK_COLLECT_FULL) snek_collect_counts = 0; #if SNEK_MEM_CACHE_NUM for (c = 0; c < SNEK_MEM_CACHE_NUM; c++) *snek_mem_cache[c] = NULL; #endif if (style == SNEK_COLLECT_FULL) { chunk_low = top = 0; } else { chunk_low = top = snek_last_top; } for (;;) { /* Find the sizes of the first chunk of objects to move */ reset_chunks(); debug_memory("mark\n"); walk(snek_mark_ref, snek_poly_mark_ref); dump_busy(); debug_memory("done\n"); debug_memory("chunk_last %d\n", chunk_last); /* Find the first moving object */ for (c = 0; c < chunk_last; c++) { snek_offset_t size = snek_chunk[c].size; debug_memory("size %d old_offset %d top %d\n", size, snek_chunk[c].old_offset, top); if (snek_chunk[c].old_offset > top) break; top += size; } /* Short-circuit the rest of the loop when all of the * found objects aren't moving. This isn't strictly * necessary as the rest of the loop is structured to * work in this case, but GCC 7.2.0 with optimization * greater than 2 generates incorrect code for this... */ if (c == SNEK_NCHUNK) { chunk_low = chunk_high; continue; } /* * Limit amount of chunk array used in mapping moves * to the active region */ chunk_first = c; chunk_low = snek_chunk[c].old_offset; /* Copy all of the objects */ for (; c < chunk_last; c++) { snek_offset_t size = snek_chunk[c].size; debug_memory(" moving %d -> %d (%d)\n", snek_chunk[c].old_offset, top, size); snek_chunk[c].new_offset = top; memmove(&snek_pool[top], &snek_pool[snek_chunk[c].old_offset], size); top += size; } if (chunk_first < chunk_last) { /* Relocate all references to the objects */ debug_memory("move\n"); walk(snek_move_addr, snek_poly_move); debug_memory("done\n"); } /* If we ran into the end of the heap, then * there's no need to keep walking */ if (chunk_last != SNEK_NCHUNK) break; /* Next loop starts right above this loop */ chunk_low = chunk_high; } snek_top = top; if (style == SNEK_COLLECT_FULL) snek_last_top = top; debug_memory("%d free\n", SNEK_POOL - snek_top); return SNEK_POOL - snek_top; } /* * Mark interfaces for objects */ /* * Note a reference to memory and collect information about a few * object sizes at a time */ bool snek_mark_blob(void *addr, snek_offset_t size) { snek_offset_t offset; #if SNEK_DEBUG if (!snek_is_pool_addr(addr)) return true; #endif offset = pool_offset(addr); if (busy(offset)) return true; debug_memory("\tmark %d size %d\n", offset, size); mark(offset); note_chunk(offset, size); return false; } #ifdef DEBUG_MEMORY static const char * type_name(const struct snek_mem *type) { if (type == &snek_code_mem) return "code"; if (type == &snek_compile_mem) return "compile"; if (type == &snek_frame_mem) return "frame"; if (type == &snek_name_mem) return "name"; snek_type_t t = (type - _snek_mems) + 1; switch (t) { case snek_list: return "list"; case snek_string: return "string"; case snek_func: return "func"; default: snek_panic("invalid mem type\n"); return NULL; } } #endif bool snek_mark_block_addr(const struct snek_mem *type, void *addr) { bool ret; ret = snek_mark_blob(addr, snek_size(type, addr)); if (!ret) { debug_memory("\tmark %s %d %d\n", type_name(type), pool_offset(addr), snek_size(type, addr)); } return ret; } /* * Mark an object and all that it refereces */ bool snek_mark_addr(const struct snek_mem *type, void *addr) { bool ret; ret = snek_mark_block_addr(type, addr); if (!ret) SNEK_MEM_MARK(type)(addr); return ret; } bool snek_mark_offset(const struct snek_mem *type, snek_offset_t offset) { if (snek_offset_is_none(offset)) return true; return snek_mark_addr(type, pool_addr(offset)); } const struct snek_mem SNEK_MEMS_DECLARE(_snek_mems)[] = { [snek_list-1] = { .size = snek_list_size, .mark = snek_list_mark, .move = snek_list_move, }, [snek_string-1] = { .size = snek_string_size, .mark = snek_string_mark_move, .move = snek_string_mark_move, }, [snek_func-1] = { .size = snek_func_size, .mark = snek_func_mark, .move = snek_func_move, }, }; /* * Mark an object, unless it is a list. In that case, just set a bit * in the list note array; those will be marked in a separate pass to * avoid deep recursion in the collector */ bool snek_poly_mark(snek_poly_t p) { snek_type_t type; void *addr; bool ret; if (snek_is_null(p)) return true; type = snek_poly_type(p); if (type == snek_float || type == snek_builtin) return true; addr = snek_ref(p); if (type == snek_list) { debug_memory("\tmark list %d\n", pool_offset(addr)); } #if SNEK_DEBUG if (!snek_is_pool_addr(addr)) snek_panic("non-pool addr in heap"); #endif ret = snek_mark_addr(snek_mems(type), addr); if (!ret && type == snek_list) note_list(addr, addr); return ret; } /* * Find the current location of an object * based on the original location. For unmoved * objects, this is simple. For moved objects, * go search for it */ static snek_offset_t move_map(snek_offset_t offset) { snek_chunk_t chunk; if (offset < chunk_low || chunk_high <= offset) return offset; chunk = find_chunk(offset); return snek_chunk[chunk].new_offset; } bool snek_move_block_offset(void *ref) { snek_offset_t offset; memcpy(&offset, ref, sizeof (snek_offset_t)); if (snek_offset_is_none(offset)) return true; offset = move_map(offset); memcpy(ref, &offset, sizeof (snek_offset_t)); if (busy(offset)) return true; mark(offset); return false; } bool snek_move_block_addr(void **ref) { void *addr = *ref; snek_offset_t offset; bool ret; #if SNEK_DEBUG if (!snek_is_pool_addr(addr)) snek_panic("non-pool address"); #endif offset = pool_offset(addr); ret = snek_move_block_offset(&offset); *ref = pool_addr(offset); return ret; } bool snek_move_addr(const struct snek_mem *type, void **ref) { bool ret; ret = snek_move_block_addr(ref); if (!ret) SNEK_MEM_MOVE(type)(*ref); return ret; } bool snek_move_offset(const struct snek_mem *type, snek_offset_t *ref) { bool ret; ret = snek_move_block_offset(ref); if (!ret) SNEK_MEM_MOVE(type)(pool_addr(*ref)); return ret; } bool snek_poly_move(snek_poly_t *ref) { snek_poly_t p = *ref; snek_type_t type = snek_poly_type(p); void *orig_addr, *addr; if (type == snek_float || type == snek_builtin) return true; orig_addr = addr = snek_ref(p); if (type == snek_list) { debug_memory("\tmove list %d\n", pool_offset(addr)); } #if SNEK_DEBUG if (!snek_is_pool_addr(addr)) snek_panic("non-pool address"); #endif bool ret = snek_move_addr(snek_mems(type), &addr); if (!ret && type == snek_list) note_list(orig_addr, addr); /* Re-write the poly value */ *ref = snek_poly(addr, snek_poly_type(p)); return ret; } void * snek_alloc(snek_offset_t size) { void *addr; size = snek_size_round(size); if (SNEK_POOL - snek_top < size && snek_collect(SNEK_COLLECT_INCREMENTAL) < size && snek_collect(SNEK_COLLECT_FULL) < size) { snek_error_0("out of memory"); return NULL; } addr = pool_addr(snek_top); memset(addr, '\0', size); debug_memory("Alloc %d size %d\n", snek_top, size); snek_top += size; return addr; } void * snek_pool_addr(snek_offset_t offset) { if (snek_offset_is_none(offset)) return NULL; return pool_addr(offset); } snek_offset_t snek_pool_offset(const void *addr) { if (addr == NULL) return SNEK_OFFSET_NONE; return pool_offset(addr); } snek-1.1/snek-name.c000066400000000000000000000070671353657467200143710ustar00rootroot00000000000000/* * Copyright © 2018 Keith Packard * * 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. */ #include "snek.h" snek_name_t *snek_names; snek_id_t snek_id = SNEK_BUILTIN_END; #define SNEK_BUILTIN_DATA #include "snek-builtin.h" #ifndef SNEK_BUILTIN_NAMES #define SNEK_BUILTIN_NAMES(a) (snek_builtin_names[a]) #endif #ifndef SNEK_BUILTIN_NAMES_CMP #define SNEK_BUILTIN_NAMES_CMP(a,b) strcmp(a,b) #endif #ifndef snek_builtin_names_return #define snek_builtin_names_return(a) ((const char *) (a)) #endif #ifndef snek_builtin_names_len #define snek_builtin_names_len(a) strlen((const char *) (a)) #endif #if SNEK_BUILTIN_NAMES_SIZE < 256 typedef uint8_t snek_bi_index_t; #else #if SNEK_BUILTIN_NAMES_SIZE < 65536 typedef uint16_t snek_bi_index_t; #else tyepdef uint32_t snek_bi_index_t; #endif #endif #define SNEK_BUILTIN_ID(i) SNEK_BUILTIN_NAMES(i) static snek_id_t snek_name_id_builtin(char *name, bool *keyword) { snek_bi_index_t i; snek_bi_index_t k = 0; snek_id_t id = 1; for (i = 0; i < sizeof (snek_builtin_names); i += snek_builtin_names_len((const char *) &snek_builtin_names[i+k]) + 1 + k) { if (SNEK_BUILTIN_NAMES_CMP(name, (const char *) &snek_builtin_names[i+k]) == 0) { if (id >= SNEK_BUILTIN_END) { id = SNEK_BUILTIN_ID(i); *keyword = true; } else { *keyword = false; } return id; } if (++id == SNEK_BUILTIN_END) k = 1; } return 0; } static const char * snek_name_string_builtin(snek_id_t id) { if (id >= SNEK_BUILTIN_END) return NULL; snek_bi_index_t i; for (i = 0; --id; i += snek_builtin_names_len((const char *) &snek_builtin_names[i]) + 1) ; return snek_builtin_names_return(&snek_builtin_names[i]); } snek_id_t snek_name_id(char *name, bool *keyword) { snek_name_t *n; snek_id_t id; if ((id = snek_name_id_builtin(name, keyword))) return id; *keyword = false; id = snek_id; for (n = snek_names; n; n = snek_pool_addr(n->next)) { if (!strcmp(n->name, name)) return id; id--; } n = snek_alloc(sizeof (snek_name_t) + strlen(name) + 1); if (!n) return SNEK_ID_NONE; strcpy(n->name, name); n->next = snek_pool_offset(snek_names); snek_id++; snek_names = n; return snek_id; } const char * snek_name_string(snek_id_t match_id) { const char *b; if ((b = snek_name_string_builtin(match_id))) return b; snek_name_t *n; snek_id_t id = snek_id; for (n = snek_names; n; n = snek_pool_addr(n->next)) { if (id == match_id) return n->name; id--; } return NULL; } static snek_offset_t snek_name_size(void *addr) { snek_name_t *n = addr; return (snek_offset_t) sizeof (snek_name_t) + (snek_offset_t) strlen(n->name) + 1; } static void snek_name_mark(void *addr) { snek_name_t *n = addr; for (;;) { n = snek_pool_addr(n->next); if (!n) break; snek_mark_block_addr(&snek_name_mem, n); } } static void snek_name_move(void *addr) { snek_name_t *n = addr; for (;;) { if (snek_move_block_offset(&n->next)) break; n = snek_pool_addr(n->next); } } const snek_mem_t SNEK_MEM_DECLARE(snek_name_mem) = { .size = snek_name_size, .mark = snek_name_mark, .move = snek_name_move, SNEK_MEM_DECLARE_NAME("name") }; snek-1.1/snek-parse.c000066400000000000000000000123641353657467200145570ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include "snek.h" #include bool snek_interactive; bool snek_parse_middle; static uint8_t for_depth; static bool snek_print_val; uint8_t snek_parse_nformal; uint8_t snek_parse_nnamed; snek_id_t snek_parse_formals[SNEK_MAX_FORMALS]; snek_token_val_t snek_token_val; #define GRAMMAR_TABLE #include "snek-gram.h" #ifndef VALUE_STACK_SIZE #define VALUE_STACK_SIZE 127 #endif #if VALUE_STACK_SIZE < 128 typedef int8_t snek_value_stack_p_t; #else typedef int16_t snek_value_stack_p_t; #endif typedef union { bool bools; uint8_t indent; snek_op_t op; snek_id_t id; snek_offset_t offset; } snek_parse_val_t; static snek_parse_val_t value_stack[VALUE_STACK_SIZE]; static snek_value_stack_p_t value_stack_p = 0; //#define VALUE_DEBUG static snek_parse_val_t _value_pop(const char *file, int line) { (void) file; (void) line; #ifdef VALUE_DEBUG printf("value pop %d from %s:%d\n", value_stack_p - 1, file, line); #endif #if SNEK_DEBUG if (value_stack_p == 0) { snek_error_0("value stack underflow"); return (snek_parse_val_t) { .offset = 0 }; } #endif return value_stack[--value_stack_p]; } static bool _value_push(snek_parse_val_t value, const char *file, int line) { (void) file; (void) line; if (value_stack_p >= VALUE_STACK_SIZE) return false; #ifdef VALUE_DEBUG printf("\tpush %d from %s:%d\n", value_stack_p, file, line); #endif value_stack[value_stack_p++] = value; return true; } static bool _value_push_offset(snek_offset_t value, const char *file, int line) { (void) file; (void) line; #ifdef VALUE_DEBUG printf("value push offset %u\n", (unsigned) value); #endif return _value_push((snek_parse_val_t) { .offset = value }, file, line); } static bool _value_push_bool(bool value, const char *file, int line) { (void) file; (void) line; #ifdef VALUE_DEBUG printf("value push bool %d\n", value); #endif return _value_push((snek_parse_val_t) { .bools = value }, file, line); } static bool _value_push_indent(uint8_t value, const char *file, int line) { (void) file; (void) line; #ifdef VALUE_DEBUG printf("value push indent %d\n", value); #endif return _value_push((snek_parse_val_t) { .indent = value }, file, line); } static bool _value_push_op(snek_op_t op, const char *file, int line) { (void) file; (void) line; #ifdef VALUE_DEBUG printf("value push op %d\n", op); #endif return _value_push((snek_parse_val_t) { .op = op }, file, line); } static bool _value_push_id(snek_id_t id, const char *file, int line) { (void) file; (void) line; #ifdef VALUE_DEBUG printf("value push id %s\n", snek_name_string(id)); #endif return _value_push((snek_parse_val_t) { .id = id }, file, line); } #define value_pop() _value_pop(__FILE__, __LINE__) #define value_push_int(i) _value_push_int(i, __FILE__, __LINE__) #define value_push_bool(b) _value_push_bool(b, __FILE__, __LINE__) #define value_push_indent(i) _value_push_indent(i, __FILE__, __LINE__) #define value_push_op(o) _value_push_op(o, __FILE__, __LINE__) #define value_push_offset(o) _value_push_offset(o, __FILE__, __LINE__) #define value_push_id(o) _value_push_id(o, __FILE__, __LINE__) #ifndef PARSE_STACK_SIZE #define PARSE_STACK_SIZE 128 #endif #define lex(context) ({ (void) context; token_t __token__ = snek_lex(); snek_line = snek_lex_line; snek_parse_middle = true; __token__; }) #define PARSE_ACTION_BOTTOM do { \ if (snek_abort) \ return parse_return_error; \ } while (0) #define PARSE_CODE #include "snek-gram.h" snek_parse_ret_t snek_parse(void) { for (;;) { /* Reset lex state */ snek_current_indent = 0; snek_lex_indent = 0; snek_ignore_nl = 0; snek_lex_midline = false; snek_lex_exdent = false; /* Reset parse state */ snek_parse_middle = false; value_stack_p = 0; for_depth = 0; /* Reset codegen state */ snek_code_reset(); /* Reset error state */ snek_abort = false; parse_return_t ret = parse(NULL); switch (ret) { case parse_return_success: return snek_parse_success; case parse_return_end: snek_error_syntax("EOF"); return snek_parse_error; case parse_return_error: if (snek_interactive) break; return snek_parse_error; case parse_return_oom: break; case parse_return_syntax: default: snek_error_syntax(snek_lex_text); if (!snek_interactive) return snek_parse_error; { /* Skip input until we get back to * zero indent */ token_t token; for (;;) { snek_ignore_nl = 0; token = snek_lex(); switch(token) { case END: return snek_parse_success; case NL: if (snek_current_indent == 0) break; continue; case EXDENT: snek_current_indent = snek_token_val.indent; continue; default: continue; } snek_parse_middle = false; break; } } break; } } } snek-1.1/snek-poly.c000066400000000000000000000053551353657467200144320ustar00rootroot00000000000000/* * Copyright © 2018 Keith Packard * * 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. */ #include "snek.h" void * snek_ref(snek_poly_t poly) { if (snek_is_null(poly)) return NULL; return snek_pool + snek_poly_to_offset(poly); } snek_poly_t snek_poly(const void *addr, snek_type_t type) { if (addr == NULL) return SNEK_NULL; return snek_offset_to_poly((const uint8_t *) addr - snek_pool, type); } snek_poly_t snek_float_to_poly(float f) { if (isnanf(f)) return SNEK_NAN; return (snek_poly_t) { .f = f }; } snek_poly_t snek_soffset_to_poly(snek_soffset_t s) { return snek_float_to_poly(s); } static bool snek_is_float(snek_poly_t v) { if ((v.u & SNEK_EXPONENT_MASK) != SNEK_EXPONENT_MASK || v.u == SNEK_NINF) return true; return false; } snek_poly_t snek_bool_to_poly(bool b) { return b ? SNEK_ONE : SNEK_ZERO; } snek_type_t snek_poly_type(snek_poly_t v) { return snek_is_float(v) ? snek_float : (v.u & 3); } void snek_poly_print(FILE *file, snek_poly_t poly, char format) { snek_buf_t buf = { .put_c = (int(*) (int, void *)) fputc, .put_s = (int(*) (const char *, void *)) fputs, .closure = file }; snek_poly_format(&buf, poly, format); } int8_t snek_poly_cmp(snek_poly_t a, snek_poly_t b, bool is) { snek_type_t atype = snek_poly_type(a); snek_type_t btype = snek_poly_type(b); int8_t tdiff = atype - btype; if (tdiff) return tdiff; switch (atype) { case snek_float: return (b.f < a.f) - (a.f < b.f); case snek_string: return strcmp(snek_poly_to_string(a), snek_poly_to_string(b)); case snek_list: if (!is) return snek_list_cmp(snek_poly_to_list(a), snek_poly_to_list(b)); /* fall through */ default: return (b.u < a.u) - (a.u < b.u); } } bool snek_poly_true(snek_poly_t a) { switch (snek_poly_type(a)) { case snek_float: return snek_poly_to_float(a) != 0.0f; case snek_list: return snek_poly_to_list(a)->size != 0; case snek_string: return strlen(snek_poly_to_string(a)) != 0; default: return false; } } snek_offset_t snek_poly_len(snek_poly_t a) { snek_offset_t len; snek_list_t *al; switch (snek_poly_type(a)) { case snek_string: return strlen(snek_poly_to_string(a)); case snek_list: al = snek_poly_to_list(a); len = al->size; if (snek_list_type(al) == snek_list_dict) len /= 2; return len; default: return 0; } } snek-1.1/snek-print.c000066400000000000000000000064441353657467200146030ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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. */ #include "snek.h" static snek_offset_t snek_func_line(snek_func_t *func) { snek_code_t *code = snek_pool_addr(func->code); if (code) return snek_code_line(code); return 0; } static inline char snek_list_open(snek_list_type_t type) { switch(type) { case snek_list_list: return '['; case snek_list_tuple: return '('; default: return '{'; } } static inline char snek_list_close(snek_list_type_t type) { switch(type) { case snek_list_list: return ']'; case snek_list_tuple: return ')'; default: return '}'; } } void snek_poly_format(snek_buf_t *buf, snek_poly_t a, char format) { void *closure = buf->closure; static char tmp[32]; static char format_string[3] = "%."; snek_type_t atype = snek_poly_type(a); int i; format_string[1] = format; switch (format) { case 'd': case 'i': case 'o': case 'x': case 'X': if (atype != snek_float) break; print_float: i = (int) snek_poly_to_float(a); print_int: sprintf(tmp, format_string, i); buf->put_s(tmp, closure); return; case 'e': case 'E': case 'f': case 'F': case 'g': case 'G': if (atype != snek_float) break; sprintf(tmp, format_string, snek_poly_to_float(a)); buf->put_s(tmp, closure); return; case 'c': switch (atype) { case snek_float: goto print_float; case snek_string: i = snek_poly_to_string(a)[0]; goto print_int; default: break; } break; case 's': if (atype == snek_string) { buf->put_s(snek_poly_to_string(a), closure); return; } break; default: break; } if (snek_is_null(a)) buf->put_s("None", closure); else switch (atype) { case snek_float: sprintf_const(tmp, "%.7g", snek_poly_to_float(a)); buf->put_s(tmp, closure); break; case snek_string: buf->put_c('\'', closure); buf->put_s(snek_poly_to_string(a), closure); buf->put_c('\'', closure); break; case snek_func: sprintf_const(tmp, "", snek_func_line(snek_poly_to_func(a))); buf->put_s(tmp, closure); break; case snek_builtin: sprintf_const(tmp, "", snek_name_string(snek_poly_to_builtin_id(a))); buf->put_s(tmp, closure); break; case snek_list: { snek_list_t *list = snek_poly_to_list(a); snek_list_type_t type = snek_list_type(list); buf->put_c(snek_list_open(type), closure); snek_poly_t *data = snek_list_data(list); for (snek_offset_t o = 0; o < list->size; o++) { if ((type == snek_list_dict) ? !(o & 1) : o) buf->put_c(' ', closure); snek_poly_format(buf, data[o], format); if (o < list->size - 1 || (list->size == 1 && type == snek_list_tuple)) buf->put_c((type == snek_list_dict && !(o&1)) ? ':' : ',', closure); } if (type == snek_list_dict && list->size) buf->put_c(' ', closure); buf->put_c(snek_list_close(type), closure); break; } } } snek-1.1/snek-string.c000066400000000000000000000111521353657467200147450ustar00rootroot00000000000000/* * Copyright © 2018 Keith Packard * * 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. */ #include "snek.h" char * snek_string_make(char c) { char *new = snek_alloc(2); if (new) new[0] = c; return new; } snek_poly_t snek_string_get(char *string, snek_poly_t p, bool report_error) { snek_soffset_t o = snek_poly_get_soffset(p); if (o < 0 || strlen(string) <= (snek_offset_t) o) { if (report_error) snek_error_value(p); return SNEK_NULL; } return snek_string_to_poly(snek_string_make(string[o])); } static char * snek_string_catn(char *a, snek_offset_t aoff, snek_offset_t alen, char *b, snek_offset_t boff, snek_offset_t blen) { char *new; snek_stack_push_string(a); snek_stack_push_string(b); new = snek_alloc(alen + blen + 1); b = snek_stack_pop_string(b); a = snek_stack_pop_string(a); if (new) { memcpy(new, a + aoff, alen); memcpy(new + alen, b + boff, blen); new[alen+blen] = '\0'; } return new; } snek_poly_t snek_string_cat(char *a, char *b) { return snek_string_to_poly(snek_string_catn(a, 0, strlen(a), b, 0, strlen(b))); } char * snek_string_slice(char *a, snek_slice_t *slice) { if (slice->identity) return a; snek_stack_push_string(a); char *r = snek_alloc(slice->count + 1); a = snek_stack_pop_string(a); if (!r) return NULL; snek_offset_t i = 0; for (; snek_slice_test(slice); snek_slice_step(slice)) r[i++] = a[slice->pos]; r[i] = '\0'; return r; } snek_poly_t snek_string_times(char *a, snek_soffset_t b) { snek_offset_t alen = strlen(a); char *s = snek_alloc(alen * b + 1); if (s) { char *t = s; while (b--) { memcpy(t, a, alen); t += alen; } *t = '\0'; } return snek_string_to_poly(s); } static uint8_t snek_next_format(char *a) { char *percent = strchr(a, '%'); if (percent) return percent - a; return strlen(a); } static char * snek_buf_realloc(char **str_p, snek_offset_t add) { char *old = *str_p; char *new; snek_offset_t len = old ? strlen(old) : 0; snek_stack_push_string(old); new = snek_alloc(len + add + 1); old = snek_stack_pop_string(old); if (!new) return NULL; memcpy(new, old, len); new[len+add] = '\0'; *str_p = new; return new + len; } static int snek_buf_sprintc(int c, void *closure) { char **str_p = closure; char *new; if ((new = snek_buf_realloc(str_p, 1)) != NULL) *new = c; return 0; } static int snek_buf_sprints(const char *s, void *closure) { char **str_p = closure; char *new; int len = strlen(s); snek_stack_push_string(s); new = snek_buf_realloc(str_p, len); s = snek_stack_pop_string(s); if (new) memcpy(new, s, len); return 0; } char * snek_string_interpolate(char *a, snek_poly_t poly) { uint8_t percent = 0; char *result = NULL; snek_offset_t o = 0; snek_buf_t buf = { .put_c = snek_buf_sprintc, .put_s = snek_buf_sprints, .closure = &result }; while (a[percent]) { uint8_t next = snek_next_format(a + percent) + percent; snek_stack_push(poly); snek_stack_push_string(a); result = snek_string_catn(result, 0, result ? strlen(result) : 0, a, percent, next-percent); a = snek_stack_pop_string(a); poly = snek_stack_pop(); percent = next; if (a[percent] == '%') { percent++; char format = a[percent]; if (format) percent++; if (format == '%') snek_buf_sprintc('%', &buf); else { snek_poly_t *data = &poly; snek_offset_t size = 1; if (snek_poly_type(poly) == snek_list) { snek_list_t *list = snek_poly_to_list(poly); data = snek_list_data(list); size = list->size; } snek_poly_t v = SNEK_ZERO; if (o < size) v = data[o++]; snek_stack_push(poly); snek_stack_push_string(a); snek_poly_format(&buf, v, format); a = snek_stack_pop_string(a); poly = snek_stack_pop(); } } } return result; } void snek_stack_push_string(const char *s) { if (snek_is_pool_addr(s)) snek_stack_push(snek_string_to_poly((char *) s)); } char * snek_stack_pop_string(const char *s) { if (snek_is_pool_addr(s)) return snek_poly_to_string(snek_stack_pop()); return (char *) s; } snek_offset_t snek_string_size(void *addr) { char *string = addr; return (snek_offset_t) strlen(string) + 1; } void snek_string_mark_move(void *addr) { (void) addr; } snek-1.1/snek-temperature.builtin000066400000000000000000000010661353657467200172230ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # temperature, 1snek-1.1/snek-temperature.c000066400000000000000000000027501353657467200160000ustar00rootroot00000000000000/* * Copyright © 2019 Keith Packard * * 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, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #define C_TO_K(c) ((c) + 273.15f) #define K_TO_C(k) ((k) - 273.15f) snek_poly_t snek_builtin_temperature(snek_poly_t adc) { float f = snek_poly_get_float(adc); float r; if (f == 0) r = INFINITY; else { #if SNEK_THERM_HIGH_SIDE /* Thermistor is connected from Vcc to analog input with r_divide to ground */ r = SNEK_THERM_R_DIVIDE / f - SNEK_THERM_R_DIVIDE; #else /* Thermistor is connected from ground to analog input with r_divide to Vcc */ r = SNEK_THERM_R_DIVIDE / (1.0f / f - 1); #endif } float k = 1/(logf(r / SNEK_THERM_R_NOMINAL) / SNEK_THERM_B_COEFF + 1.0f / C_TO_K(SNEK_THERM_T_NOMINAL)); return snek_float_to_poly(K_TO_C(k)); } snek-1.1/snek.defs000066400000000000000000000050331353657467200141410ustar00rootroot00000000000000SNEK_LOCAL_VPATH ?= . vpath %.c $(SNEK_LOCAL_VPATH):$(SNEK_ROOT) vpath %.h $(SNEK_LOCAL_VPATH):$(SNEK_ROOT) vpath %.ll $(SNEK_LOCAL_VPATH):$(SNEK_ROOT) vpath %.py $(SNEK_LOCAL_VPATH):$(SNEK_ROOT) vpath %.builtin $(SNEK_LOCAL_VPATH):$(SNEK_ROOT) SNEK_VERSION = 1.1 SNEK_DATE = 2019-09-12 SNEK_VERSION_DASH = $(shell echo $(SNEK_VERSION) | sed 's/\./-/g') SNEK_PORTS = $(SNEK_ROOT)/ports SNEK_HOSTS = $(SNEK_ROOT)/hosts SNEK_SRC = \ snek-builtin.c \ snek-code.c \ snek-error.c \ snek-frame.c \ snek-func.c \ snek-lex.c \ snek-list.c \ snek-memory.c \ snek-name.c \ snek-parse.c \ snek-poly.c \ snek-print.c \ snek-string.c \ $(SNEK_LOCAL_SRC) SNEK_EXT_SRC = \ snek-io.c \ snek-math.c \ snek-temperature.c SNEK_OBJ=$(SNEK_SRC:.c=.o) SNEK_RAW_INC = \ $(SNEK_ROOT)/snek.h SNEK_BUILT_INC = \ snek-gram.h \ snek-builtin.h SNEK_INC = \ $(SNEK_RAW_INC) \ $(SNEK_BUILT_INC) \ $(SNEK_LOCAL_INC) SNEK_EXT_INC = \ $(SNEK_ROOT)/snek-io.h SNEK_BUILTINS = \ $(SNEK_ROOT)/snek-keyword.builtin \ $(SNEK_ROOT)/snek-base.builtin \ $(SNEK_LOCAL_BUILTINS) SNEK_EXT_BUILTINS = \ $(SNEK_ROOT)/snek-math.builtin \ $(SNEK_ROOT)/snek-temperature.builtin SNEK_MOST_WARNINGS = \ -Wall \ -Wextra \ -Wpointer-arith \ -Wstrict-prototypes \ -Wmissing-prototypes \ -Wmissing-declarations \ -Wnested-externs \ -Warray-bounds \ -Wshadow SNEK_WARNINGS = \ $(SNEK_MOST_WARNINGS) \ -Wimplicit-fallthrough SNEK_ASSERT ?= 1 SNEK_BASE_CFLAGS = \ -D_DEFAULT_SOURCE \ -I$(SNEK_ROOT) \ -DSNEK_VERSION='"$(SNEK_VERSION)"' ifeq ($(SNEK_ASSERT),1) SNEK_BASE_CFLAGS += -DSNEK_ASSERT=$(SNEK_ASSERT) endif SNEK_CFLAGS ?= $(SNEK_WARNINGS) $(SNEK_BASE_CFLAGS) SNEK_SED = sed \ -e 's;@ICONDIR@;$(ICONDIR);g' \ -e 's;@BINDIR@;$(BINDIR);g' \ -e 's;@SNEKLIB@;$(SNEKLIB);' \ -e 's;@SHAREDIR@;$(SHAREDIR);' \ -e 's/@SNEK_VERSION@/$(SNEK_VERSION)/' \ -e 's/@SNEK_VERSION_DASH@/$(SNEK_VERSION_DASH)/' \ -e 's;@SNEK_ROOT@;$(SNEK_ROOT);' \ -e 's/@SNEK_DATE@/$(SNEK_DATE)/' .DEFAULT_GOAL = all ifndef SNEK_NO_BUILD_TARGETS LOLA_FLAGS = ifeq ($(SNEK_ASSERT),1) LOLA_FLAGS = -DSNEK_ASSERT endif snek-gram.h: $(SNEK_ROOT)/snek-gram.ll lola $(LOLA_FLAGS) -o $@ $^ snek-builtin.h: $(SNEK_ROOT)/snek-builtin.py $(SNEK_BUILTINS) python3 $^ -o $@ clean:: rm -f snek-gram.h snek-builtin.h $(SNEK_OBJ) $(SNEK_OBJ): $(SNEK_INC) ifndef quiet V?=0 # The user has explicitly enabled quiet compilation. ifeq ($(V),0) quiet = @printf " $1 $2 $@\n"; $($1) endif # Otherwise, print the full command line. quiet ?= $($1) .c.o: $(call quiet,CC) -c $(CFLAGS) -o $@ $< endif endif snek-1.1/snek.h000066400000000000000000000465351353657467200134630ustar00rootroot00000000000000/* * Copyright © 2018 Keith Packard * * 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. */ #pragma once #include #include #include #include #include #include #include #include #include "snek-builtin.h" // #define DEBUG_MEMORY #ifdef DEBUG_MEMORY #define debug_memory(fmt, args...) printf(fmt, ## args) #else #define debug_memory(fmt, args...) #endif #ifndef SNEK_POOL #define SNEK_POOL (32 * 1024) #endif #define SNEK_ALLOC_SHIFT 2 #define SNEK_ALLOC_ROUND (1 << SNEK_ALLOC_SHIFT) /* * Offsets are encoded in floats as NaN values with the sign bit * set. That means the top 9 bits of the value are all one. There is * one other value with that value, -inf, which is encoded as negative * sign, all exponent bits one and a zero mantissa. * * This leaves us 23 bits for offsets. The bottom two bits of offsets * are used as tags; allocations within the heap are rounded to a * multiple of four bytes so that offsets will always have the bottom * two bits clear. */ #define SNEK_OFFSET_MASK 0x007ffffcu #define SNEK_EXPONENT_MASK 0xff800000u #define SNEK_NINF 0xff800000u #if SNEK_POOL <= 65536 typedef uint16_t snek_offset_t; typedef int16_t snek_soffset_t; #define SNEK_OFFSET_NONE 0xfffcu #define SNEK_SOFFSET_NONE 0x7ffc #else typedef uint32_t snek_offset_t; typedef int32_t snek_soffset_t; #define SNEK_OFFSET_NONE 0xfffffffcu #define SNEK_SOFFSET_NONE 0x7ffffffc #endif typedef snek_offset_t snek_id_t; #define SNEK_ID_NONE 0 typedef union { uint32_t u; float f; } snek_poly_t; typedef enum { snek_op_eq = 0, snek_op_ne = 1, snek_op_gt = 2, snek_op_lt = 3, snek_op_ge = 4, snek_op_le = 5, snek_op_is = 6, snek_op_is_not = 7, snek_op_in = 8, snek_op_not_in = 9, snek_op_array = 10, snek_op_plus = 11, snek_op_minus = 12, snek_op_times = 13, snek_op_divide = 14, snek_op_div = 15, snek_op_mod = 16, snek_op_pow = 17, snek_op_land = 18, snek_op_lor = 19, snek_op_lxor = 20, snek_op_lshift = 21, snek_op_rshift = 22, snek_op_assign_plus = 23, snek_op_assign_minus = 24, snek_op_assign_times = 25, snek_op_assign_divide = 26, snek_op_assign_div = 27, snek_op_assign_mod = 28, snek_op_assign_pow = 29, snek_op_assign_land = 30, snek_op_assign_lor = 31, snek_op_assign_lxor = 32, snek_op_assign_lshift = 33, snek_op_assign_rshift = 34, snek_op_assign = 35, snek_op_assign_named = 36, snek_op_num, snek_op_int, snek_op_string, snek_op_list, snek_op_tuple, snek_op_dict, snek_op_id, snek_op_not, snek_op_uminus, snek_op_lnot, snek_op_call, snek_op_slice, snek_op_global, snek_op_del, #ifdef SNEK_ASSERT snek_op_assert, #endif snek_op_branch, snek_op_branch_true, snek_op_branch_false, snek_op_forward, snek_op_range_start, snek_op_range_step, snek_op_in_step, snek_op_line, snek_op_null, snek_op_nop, snek_op_push = 0x80, } __attribute__((packed)) snek_op_t; typedef enum { snek_forward_return, snek_forward_break, snek_forward_continue, snek_forward_if, } __attribute__((packed)) snek_forward_t; typedef enum { snek_builtin = 0, snek_list = 1, snek_string = 2, snek_func = 3, snek_float = 4, } __attribute__((packed)) snek_type_t; typedef struct snek_mem { snek_offset_t (*size)(void *addr); void (*mark)(void *addr); void (*move)(void *addr); #ifdef SNEK_MEM_INCLUDE_NAME char name[16]; #endif } snek_mem_t; #ifndef SNEK_MEM_DECLARE #define SNEK_MEM_DECLARE(n) n #define SNEK_MEM_SIZE(m) ((m)->size) #define SNEK_MEM_MARK(m) ((m)->mark) #define SNEK_MEM_MOVE(m) ((m)->move) #endif #ifndef SNEK_MEMS_DECLARE #define SNEK_MEMS_DECLARE(n) n #endif #ifdef SNEK_MEM_INCLUDE_NAME #define SNEK_MEM_DECLARE_NAME(_name) .name = _name, #else #define SNEK_MEM_DECLARE_NAME(_name) #endif typedef enum { snek_list_list, snek_list_tuple, snek_list_dict } __attribute__((packed)) snek_list_type_t; typedef struct snek_list { snek_offset_t size; snek_offset_t alloc; snek_offset_t note_next_and_type; snek_offset_t data; } snek_list_t; typedef struct snek_code { snek_offset_t size; uint8_t code[0]; } snek_code_t; typedef struct snek_range { snek_offset_t prev; snek_id_t id; float current; float limit; float step; } snek_range_t; typedef struct snek_in { snek_offset_t prev; snek_id_t id; snek_poly_t array; snek_offset_t i; } snek_in_t; typedef struct snek_func { uint8_t nformal; uint8_t nrequired; snek_offset_t code; snek_id_t formals[0]; } snek_func_t; #define SNEK_FUNC_VARARGS SNEK_SOFFSET_NONE typedef struct snek_name { snek_offset_t next; char name[0]; } snek_name_t; typedef struct snek_variable { snek_id_t id; snek_poly_t value; } snek_variable_t; typedef struct snek_frame { snek_offset_t prev; snek_offset_t code; snek_offset_t ip; snek_offset_t nvariables; snek_variable_t variables[0]; } snek_frame_t; typedef struct snek_slice { /* number of outputs */ snek_offset_t count; /* position of current object */ snek_offset_t pos; /* stride between inputs */ snek_soffset_t stride; /* slice is identity */ bool identity; } snek_slice_t; #define SNEK_SLICE_DEFAULT SNEK_SOFFSET_NONE /* empty value provided [1:] */ typedef struct snek_builtin { union { struct { int8_t nformal; union { snek_poly_t (*funcv)(uint8_t nposition, uint8_t nnamed, snek_poly_t *args); snek_poly_t (*func0)(void); snek_poly_t (*func1)(snek_poly_t a0); snek_poly_t (*func2)(snek_poly_t a0, snek_poly_t a1); snek_poly_t (*func3)(snek_poly_t a0, snek_poly_t a1, snek_poly_t a2); snek_poly_t (*func4)(snek_poly_t a0, snek_poly_t a1, snek_poly_t a2, snek_poly_t a3); }; }; snek_poly_t value; }; } snek_builtin_t; typedef struct snek_buf { int (*put_c)(int c, void *closure); int (*put_s)(const char *s, void *closure); void *closure; } snek_buf_t; extern const snek_builtin_t snek_builtins[]; #define SNEK_BUILTIN_FLOAT -2 #define SNEK_BUILTIN_VARARGS -1 #define SNEK_NAN_U 0x7fffffffu #define SNEK_NAN ((snek_poly_t) { .u = SNEK_NAN_U }) #define SNEK_NULL_U 0xfffffffcu #define SNEK_NULL ((snek_poly_t) { .u = SNEK_NULL_U }) #define SNEK_GLOBAL_U 0xfffffff8u #define SNEK_GLOBAL ((snek_poly_t) { .u = SNEK_GLOBAL_U }) #define SNEK_ZERO ((snek_poly_t) { .f = 0.0f }) #define SNEK_ONE ((snek_poly_t) { .f = 1.0f }) #ifndef SNEK_STACK #define SNEK_STACK 256 #endif extern snek_poly_t snek_stack[SNEK_STACK]; extern snek_offset_t snek_stackp; extern snek_poly_t snek_a; extern snek_code_t *snek_code; static inline bool snek_is_nan(snek_poly_t p) { return p.u == SNEK_NAN_U; } static inline bool snek_is_null(snek_poly_t p) { return p.u == SNEK_NULL_U; } static inline bool snek_is_global(snek_poly_t p) { return p.u == SNEK_GLOBAL_U; } #ifdef SNEK_DYNAMIC extern uint8_t *snek_pool __attribute__((aligned(SNEK_ALLOC_ROUND))); extern uint32_t snek_pool_size; #else extern uint8_t snek_pool[SNEK_POOL] __attribute__((aligned(SNEK_ALLOC_ROUND))); #endif #ifndef SNEK_CODE_HOOK_START #define SNEK_CODE_HOOK_START #endif #ifndef SNEK_CODE_HOOK_STOP #define SNEK_CODE_HOOK_STOP #endif #include "snek-gram.h" typedef union { bool bools; int16_t _ints; uint8_t indent; snek_offset_t line; snek_op_t op; snek_offset_t offset; snek_soffset_t soffset; snek_id_t id; float number; char *string; } snek_token_val_t; extern snek_token_val_t snek_token_val; /* snek-builtin.c */ #define SNEK_BUILTIN_DECLS #include "snek-builtin.h" /* snek-code.c */ extern const char * const snek_op_names[]; extern uint8_t *snek_compile; extern snek_offset_t snek_compile_size; extern snek_offset_t snek_compile_prev, snek_compile_prev_prev; #define SNEK_OP_SLICE_START 1 #define SNEK_OP_SLICE_END 2 #define SNEK_OP_SLICE_STRIDE 4 void snek_code_delete_prev(void); void snek_code_add_op(snek_op_t op); void snek_code_add_op_array(snek_op_t op); void snek_code_add_number(float number); void snek_code_add_string(char *string); void snek_code_add_op_offset(snek_op_t op, snek_offset_t offset); static inline void snek_code_add_op_id(snek_op_t op, snek_id_t id) { snek_code_add_op_offset(op, id); } void snek_code_add_op_branch(snek_op_t op); void snek_code_add_forward(snek_forward_t forward); void snek_code_patch_forward(snek_offset_t start, snek_offset_t stop, snek_forward_t forward, snek_offset_t target); void snek_code_add_slice(uint8_t param); void snek_code_add_in_range(snek_id_t id, snek_offset_t nactual, uint8_t for_depth); void snek_code_add_in_enum(snek_id_t id, uint8_t for_depth); void snek_code_patch_branch(snek_offset_t branch, snek_offset_t target); void snek_code_reset(void); snek_code_t * snek_code_finish(void); snek_offset_t snek_code_line(snek_code_t *code); float snek_poly_get_float(snek_poly_t a); snek_soffset_t snek_poly_get_soffset(snek_poly_t a); snek_soffset_t snek_stack_pop_soffset(void); float snek_stack_pop_float(void); void snek_stack_push(snek_poly_t p); snek_poly_t snek_stack_pop(void); snek_poly_t snek_stack_pick(snek_offset_t off); void snek_stack_drop(snek_offset_t off); void snek_run_mark(void); void snek_run_move(void); snek_poly_t snek_code_run(snek_code_t *code); void snek_undefined(snek_id_t id); extern const snek_mem_t snek_code_mem; extern const snek_mem_t snek_compile_mem; /* snek-error.c */ #ifndef snek_error_name #define snek_error_name snek_error #define snek_error_0_name snek_error_0 #endif snek_poly_t snek_error_name(const char *format, ...); snek_poly_t snek_error_0_name(const char *string); snek_poly_t snek_error_step(void); snek_poly_t snek_error_value(snek_poly_t p); snek_poly_t snek_error_type_2(snek_poly_t a, snek_poly_t b); snek_poly_t snek_error_type_1(snek_poly_t a); snek_poly_t snek_error_args(snek_soffset_t want, snek_soffset_t got); snek_poly_t snek_error_arg(snek_id_t bad); snek_poly_t snek_error_syntax(char *where); #if defined(SNEK_DEBUG) || defined(DEBUG_MEMORY) void snek_panic(const char *message); #endif #ifndef sprintf_const #define sprintf_const sprintf #endif extern bool snek_abort; /* snek-frame.c */ extern snek_frame_t *snek_globals; extern snek_frame_t *snek_frame; void snek_frame_mark_global(snek_offset_t name); bool snek_frame_push(snek_offset_t ip, snek_offset_t nformal); snek_offset_t snek_frame_pop(void); snek_poly_t * snek_id_ref(snek_id_t id, bool insert); bool snek_id_is_local(snek_id_t id); bool snek_id_del(snek_id_t id); extern const snek_mem_t snek_frame_mem; /* snek-func.c */ extern snek_code_t *snek_stash_code; snek_func_t * snek_func_alloc(snek_code_t *code); bool snek_func_push(uint8_t nposition, uint8_t nnamed, snek_offset_t ip); snek_code_t * snek_func_pop(snek_offset_t *ip); snek_offset_t snek_func_size(void *addr); void snek_func_mark(void *addr); void snek_func_move(void *addr); /* snek-lex.c */ extern snek_offset_t snek_line; extern snek_offset_t snek_lex_line; extern char *snek_file; extern uint8_t snek_current_indent; extern uint8_t snek_lex_indent; extern uint8_t snek_ignore_nl; extern bool snek_lex_midline; extern bool snek_lex_exdent; extern char snek_lex_text[]; token_t snek_lex(void); /* snek-list.c */ extern snek_list_t *snek_empty_tuple; snek_list_t * snek_list_resize(snek_list_t *list, snek_offset_t size); snek_list_t * snek_list_make(snek_offset_t size, snek_list_type_t type); snek_list_t * snek_list_append(snek_list_t *list, snek_list_t *append); snek_list_t * snek_list_plus(snek_list_t *a, snek_list_t *b); snek_list_t * snek_list_times(snek_list_t *a, snek_soffset_t count); snek_poly_t * snek_list_ref(snek_list_t *list, snek_poly_t p, bool report_error); snek_poly_t snek_list_get(snek_list_t *list, snek_poly_t p, bool report_error); snek_poly_t * snek_list_data(snek_list_t *list); void snek_list_del(snek_poly_t lp, snek_poly_t p); int8_t snek_list_cmp(snek_list_t *a, snek_list_t *b); snek_poly_t snek_list_imm(snek_offset_t size, snek_list_type_t type); snek_list_t * snek_list_slice(snek_list_t *list, snek_slice_t *slice); snek_offset_t snek_list_size(void *addr); void snek_list_mark(void *addr); void snek_list_move(void *addr); #ifdef SNEK_LIST_BUILD snek_poly_t snek_list_build(snek_list_type_t type, snek_offset_t size, ...); #endif /* snek-memory.c */ #define SNEK_COLLECT_FULL 0 #define SNEK_COLLECT_INCREMENTAL 1 bool snek_is_pool_addr(const void *addr); bool snek_poly_mark(snek_poly_t p); bool snek_poly_mark_ref(snek_poly_t *p); snek_offset_t snek_collect(uint8_t style); bool snek_mark_blob(void *addr, snek_offset_t size); bool snek_mark_block_addr(const struct snek_mem *type, void *addr); bool snek_mark_addr(const struct snek_mem *type, void *addr); bool snek_mark_offset(const struct snek_mem *type, snek_offset_t offset); bool snek_move_block_offset(void *ref); bool snek_move_block_addr(void **ref); bool snek_poly_move(snek_poly_t *ref); bool snek_move_addr(const struct snek_mem *type, void **ref); bool snek_move_offset(const struct snek_mem *type, snek_offset_t *ref); void * snek_alloc(snek_offset_t size); void snek_stack_push_string(const char *s); char * snek_stack_pop_string(const char *s); void snek_stack_push_list(snek_list_t *list); snek_list_t * snek_stack_pop_list(void); void * snek_pool_addr(snek_offset_t offset); snek_offset_t snek_pool_offset(const void *addr); extern const struct snek_mem SNEK_MEMS_DECLARE(_snek_mems)[]; static inline const struct snek_mem *snek_mems(snek_type_t type) { /* Oddly, the compiler complains about this particular array * operation. However, this lets us declare _snek_mems with * one fewer entry, without causing any increase in code size */ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Warray-bounds" return &((&_snek_mems[-1])[type]); #pragma GCC diagnostic pop } /* snek-name.c */ snek_id_t snek_name_id(char *name, bool *keyword); const char * snek_name_string(snek_id_t id); extern const snek_mem_t snek_name_mem; extern snek_name_t *snek_names; /* snek-parse.c */ extern bool snek_parse_middle; extern bool snek_interactive; #define SNEK_MAX_FORMALS 10 extern uint8_t snek_parse_nformal; extern uint8_t snek_parse_nnamed; extern snek_id_t snek_parse_formals[SNEK_MAX_FORMALS]; typedef enum { snek_parse_success, snek_parse_error, } __attribute__((packed)) snek_parse_ret_t; snek_parse_ret_t snek_parse(void); /* snek-poly.c */ void * snek_ref(snek_poly_t poly); snek_poly_t snek_poly_offset(snek_offset_t offset, snek_type_t type); snek_poly_t snek_poly(const void *addr, snek_type_t type); snek_poly_t snek_float_to_poly(float f); snek_poly_t snek_soffset_to_poly(snek_soffset_t s); snek_type_t snek_poly_type(snek_poly_t v); void snek_poly_print(FILE *file, snek_poly_t poly, char format); int8_t snek_poly_cmp(snek_poly_t a, snek_poly_t b, bool is); bool snek_poly_true(snek_poly_t a); snek_offset_t snek_poly_len(snek_poly_t a); void snek_poly_format(snek_buf_t *buf, snek_poly_t a, char format); /* snek-print.c */ void snek_print(snek_buf_t *buf, snek_poly_t poly); /* snek-string.c */ char * snek_string_make(char c); snek_poly_t snek_string_get(char *string, snek_poly_t p, bool report_error); snek_poly_t snek_string_cat(char *a, char *b); snek_poly_t snek_string_times(char *a, snek_soffset_t b); char * snek_string_slice(char *a, snek_slice_t *slice); char * snek_string_interpolate(char *a, snek_poly_t poly); snek_offset_t snek_string_size(void *addr); void snek_string_mark_move(void *addr); /* inlines */ static inline bool snek_slice_test(snek_slice_t *slice) { return slice->count != 0; } static inline void snek_slice_step(snek_slice_t *slice) { slice->count--; slice->pos += slice->stride; } static inline snek_poly_t snek_offset_to_poly(snek_offset_t offset, snek_type_t type) { return (snek_poly_t) { .u = SNEK_EXPONENT_MASK | offset | type }; } static inline snek_offset_t snek_poly_to_offset(snek_poly_t v) { return v.u & SNEK_OFFSET_MASK; } static inline float snek_poly_to_float(snek_poly_t v) { return v.f; } static inline snek_poly_t snek_list_to_poly(snek_list_t *list) { return snek_poly(list, snek_list); } static inline snek_list_t * snek_poly_to_list(snek_poly_t poly) { return snek_ref(poly); } static inline snek_poly_t snek_string_to_poly(char *string) { return snek_poly(string, snek_string); } static inline char * snek_poly_to_string(snek_poly_t poly) { return snek_ref(poly); } static inline snek_func_t * snek_poly_to_func(snek_poly_t poly) { return snek_ref(poly); } static inline snek_poly_t snek_func_to_poly(snek_func_t *func) { return snek_poly(func, snek_func); } static inline snek_poly_t snek_builtin_id_to_poly(snek_id_t id) { if (id < SNEK_BUILTIN_MAX_FUNC) return snek_offset_to_poly(id << SNEK_ALLOC_SHIFT, snek_builtin); return SNEK_BUILTIN_VALUE(&snek_builtins[id-1]); } static inline snek_id_t snek_poly_to_builtin_id(snek_poly_t a) { return snek_poly_to_offset(a) >> SNEK_ALLOC_SHIFT; } static inline const snek_builtin_t * snek_poly_to_builtin(snek_poly_t a) { return snek_builtins + (snek_poly_to_builtin_id(a) - 1); } static inline bool snek_offset_is_none(snek_offset_t offset) { return offset == SNEK_OFFSET_NONE; } snek_poly_t snek_bool_to_poly(bool b); static inline snek_offset_t snek_offset_value(snek_offset_t offset) { offset = offset & ~3; return offset; } static inline bool snek_offset_flag_0(snek_offset_t offset) { return offset & 1; } static inline bool snek_offset_flag_1(snek_offset_t offset) { return !!(offset & 2); } static inline uint8_t snek_offset_flags(snek_offset_t offset) { return offset & 3; } static inline snek_offset_t snek_offset_set_flag_0(snek_offset_t offset, bool flag) { return (offset & ~1) | (flag ? 1 : 0); } static inline snek_offset_t snek_offset_set_flag_1(snek_offset_t offset, bool flag) { return (offset & ~2) | (flag ? 2 : 0); } static inline snek_offset_t snek_offset_set_flags(snek_offset_t offset, uint8_t flags) { return offset | flags; } static inline snek_offset_t snek_offset_set_value(snek_offset_t offset, snek_offset_t value) { #if SNEK_DEBUG if (value & 3) snek_panic("note_next bad alignment"); #endif return value | (offset & 3); } static inline bool snek_list_readonly(snek_list_t *list) { return snek_offset_flags(list->note_next_and_type) == snek_list_tuple; } static inline snek_list_type_t snek_list_type(snek_list_t *list) { return snek_offset_flags(list->note_next_and_type); } static inline snek_offset_t snek_list_note_next(snek_list_t *list) { return snek_offset_value(list->note_next_and_type); } static inline void snek_list_set_type(snek_list_t *list, uint8_t type) { list->note_next_and_type = snek_offset_set_flags(list->note_next_and_type, type); } static inline void snek_list_set_note_next(snek_list_t *list, snek_offset_t note_next) { list->note_next_and_type = snek_offset_set_value(list->note_next_and_type, note_next); } static inline snek_offset_t snek_code_current(void) { return snek_compile_size; } static inline snek_offset_t snek_code_prev_insn(void) { return snek_compile_prev; } static inline snek_offset_t snek_code_prev_prev_insn(void) { return snek_compile_prev_prev; } static inline uint8_t * snek_code_at(snek_offset_t offset) { return snek_compile + offset; } static inline void snek_code_set_push(snek_offset_t offset) { snek_compile[offset] |= snek_op_push; } snek-1.1/snek.pc.in000066400000000000000000000001731353657467200142270ustar00rootroot00000000000000sneklib=@SNEKLIB@ Name: snek Description: Snek. A tiny python-esque language Version: @SNEK_VERSION@ Cflags: -I${sneklib} snek-1.1/snek.svg000066400000000000000000000376471353657467200140370ustar00rootroot00000000000000 image/svg+xml snek-1.1/snekde/000077500000000000000000000000001353657467200136065ustar00rootroot00000000000000snek-1.1/snekde/.gitignore000066400000000000000000000000261353657467200155740ustar00rootroot00000000000000snekde snekde.desktop snek-1.1/snekde/Makefile000066400000000000000000000022121353657467200152430ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_NO_BUILD_TARGETS = 1 SNEK_ROOT=.. include $(SNEK_ROOT)/snek-install.defs all: snekde snekde.desktop %: @echo done $@ install: snekde snekde.desktop snekde.1 install -d $(DESTDIR)$(BINDIR) install snekde $(DESTDIR)$(BINDIR) install -d $(DESTDIR)$(APPDIR) install snekde.desktop $(DESTDIR)$(APPDIR) install -d $(DESTDIR)$(ICONDIR) install -m 644 ../snek.svg $(DESTDIR)$(ICONDIR) install -d $(DESTDIR)$(MANDIR)/man1 install snekde.1 $(DESTDIR)$(MANDIR)/man1 snekde.desktop: snekde.desktop.in $(SNEK_SED) $^ > $@ snekde: snekde.py cp $^ $@ chmod +x $@ clean:: rm -f snekde snekde.desktop snek-1.1/snekde/snekde.1000066400000000000000000000040611353657467200151420ustar00rootroot00000000000000.\" .\" Copyright © 2019 Keith Packard .\" .\" 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. .\" .TH SNEKDE 1 "snekde" "" .SH NAME snekde \- Snek Development Environment .SH SYNOPSIS .B "snekde" [OPTION]... .SH OPTIONS .TP \--port Specifies the serial port to use to communicate with the target device. .SH DESCRIPTION .I snekde is an integrated development environment for Snek on embedded computers. It runs in a terminal and displays two panes. The upper pane is the editor pane and is designed to edit Snek source code. The lower pan is the interaction pane and displays output from the target device and sends commands to the target device. .SH KEY BINDINGS .I snekde is entirely keyboard operated; it does not use the mouse at all. For the most part, both panes accept the same commands. Normal characters are inserted into the current pane. .TP Page-Up/Page-Down These change the current pane, moving from edit pane to interaction pane and back. .TP Ctrl-X/Ctrl-C/Ctrl-V These are the bindings for Cut/Copy/Paste operations. .TP Ctrl-C In the interaction pane, Ctrl-C does not copy text, instead it interrupts execution in the target device. .TP Function keys The function keys F1-F6 perform various global operations. These operations are displayed at the top of the screen. F1 selects a new target device. F2/F3 get and put the contents of the edit pane to the target device program storage. F5/F6 load and save the edit pane contents to files on the local computer. .TP Movement The usual cursor keys, along with Home and End move the cursor within the current pane. .SH AUTHOR Keith Packard snek-1.1/snekde/snekde.desktop.in000066400000000000000000000004511353657467200170570ustar00rootroot00000000000000[Desktop Entry] Type=Application Version=1.0 Name=Snek Development Environment GenericName=Integrated Development Environment Comment=Edit and test Snek programs for Arduino Icon=@ICONDIR@/snek.svg Exec=@BINDIR@/snekde Terminal=true Categories=Education;Electronics; Keywords=Arduino;Snek;Python; snek-1.1/snekde/snekde.py000077500000000000000000001210111353657467200154300ustar00rootroot00000000000000#!/usr/bin/python3 # # Copyright © 2019 Keith Packard # # 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. # import sys import argparse import time import curses import threading import serial import serial.tools.list_ports from pathlib import Path, PurePath from curses import ascii stdscr = 0 snek_lock = threading.Lock() snek_lock.acquire() snek_current_window = 0 snek_edit_win = 0 snek_repl_win = 0 snek_cols = 0 snek_lines = 0 snek_monitor = False snek_device = False snek_dialog_waiting = False snek_cur_path = None #snek_debug_file = open('log', 'w') #def snek_debug(message): # snek_debug_file.write(message + '\n') # snek_debug_file.flush() # # Read a character from the keyboard, releasing the # global lock while blocked so that serial input can arrive # def my_getch(edit_win): global snek_lock, snek_current_window, snek_dialog_waiting while True: edit_win.set_cursor() snek_lock.release() c = edit_win.window.getch() if c == ord('\r'): c = ord('\n') snek_lock.acquire() if not snek_dialog_waiting: break if c == ord('\n'): snek_dialog_waiting.close() snek_dialog_waiting = False # # Check for resize # if c == curses.KEY_RESIZE: screen_resize() return c class SnekPort: """Emulate new pySerial from old pySerial""" name = None description = None device = None def __init__(self, port): if type(port) is tuple: self.device = port[0] if len(port[1]) > 20: self.name = self.device if '/' in self.name: self.name = self.name[self.name.rfind('/')+1:] else: self.name = port[1] self.description = port[2] else: self.device = port.device if port.name: self.name = port.name else: self.name = self.device self.description = port.description if self.name and '/' in self.name: self.name = self.name[self.name.rfind('/')+1:] # A special hack for pre-3.5 pySerial # # That code is missing a call to 'str' to convert the check_output # result to a string. if 'list_ports_posix' in serial.tools.__dict__: if hasattr(serial.tools.list_ports_posix, 'popen'): del serial.tools.list_ports_posix.popen try: import subprocess except ImportError: def popen(argv): try: si, so = os.popen4(' '.join(argv)) return so.read().strip() except: raise IOError('lsusb failed') else: def popen(argv): try: return str(subprocess.check_output(argv, stderr=subprocess.STDOUT)).strip() except: raise IOError('lsusb failed') serial.tools.list_ports_posix.popen = popen def snek_list_ports(): ports = [] for port in serial.tools.list_ports.comports(): ports += [SnekPort(port)] return ports class SnekDevice: """Link to snek device""" serial = False reader_thread = False writer_thread = False alive = False _reader_alive = False interface = False write_queue = False device = "" interrupt_pending = False # # The interface needs to have a condition variable (cv) that is # signaled when data are available to write and function (receive) # that gets data that are read # def __init__(self, device, interface): self.interface = interface self.device = device self.serial = serial.Serial(port=device, baudrate=38400, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, xonxoff=True, rtscts=False, dsrdtr=False) def start(self): """start worker threads""" self.alive = True self._reader_alive = True # start threads self.receiver_thread = threading.Thread(target=self.reader, name='rx') self.receiver_thread.daemon = True self.receiver_thread.start() self.transmitter_thread = threading.Thread(target=self.writer, name='tx') self.transmitter_thread.daemon = True self.transmitter_thread.start() def stop_reader(self): if self.receiver_thread and threading.current_thread() != self.receiver_thread: self.serial.cancel_read() self.interface.cv.release() self.receiver_thread.join() self.interface.cv.acquire() def stop_writer(self): """set flag to stop worker threads""" if self.transmitter_thread and threading.current_thread() != self.transmitter_thread: self.interface.cv.notify() self.interface.cv.release() self.transmitter_thread.join() self.interface.cv.acquire() def close(self): self.alive = False self.stop_reader() self.stop_writer() try: self.serial.write_timeout = 1 self.serial.write(b'\x0f') self.serial.reset_output_buffer() self.serial.xonxoff = False self.serial.close() except serial.SerialException: pass def reader(self): """loop and copy serial->""" try: while self.alive and self._reader_alive: # read all that is there or wait for one byte data = self.serial.read(1) if data: self.interface.receive(str(data, encoding='utf-8', errors='ignore')) except serial.SerialException as e: self.interface.failed(self.device) finally: self.receiver_thread = False def writer(self): """Copy queued data to the serial port.""" try: while self.alive: send_data = "" interrupt = False with self.interface.cv: while not self.write_queue and not self.interrupt_pending and self.alive: self.interface.cv.wait() if not self.alive: return send_data = self.write_queue interrupt = self.interrupt_pending self.write_queue = False self.interrupt_pending = False if interrupt: self.serial.reset_output_buffer() self.serial.xonxoff = False self.serial.write(b'\x0f\x03\x0e') self.serial.xonxoff = True if send_data: self.serial.write(send_data.encode('utf-8')) except (serial.SerialException, termios.error): self.interface.failed(self.device) finally: self.transmitter_thread = False def interrupt(self): self.interrupt_pending = True self.interface.cv.notify() def write(self, data): if self.write_queue: self.write_queue += data else: self.write_queue = data self.interface.cv.notify() def command(self, data, intr='\x03'): self.write("\x0e" + intr + data) class EditWin: """Editable text object""" window = 0 lines = 0 cols = 0 y = 0 point = 0 top_line = 0 tab_width = 4 text = "" cut = "" mark = -1 changed = False undo = [] def __init__(self, lines, cols, y, x): self.lines = lines self.cols = cols self.y = y self.window = curses.newwin(lines, cols, y, x) self.window.keypad(True) self.window.notimeout(False) # Set contents, resetting state back to start def set_text(self, text): self.text = text self.point = 0 self.mark = -1 self.top_line = 0 self.changed = False # Convert text index to x/y coord def point_to_cursor(self, point): line = -1 col = 0 for s in self.text[:point].split('\n'): line += 1 col = len(s) return(col, line) # Convert x/y coord to text index def cursor_to_point(self, cursor): (cur_col, cur_line) = cursor if cur_line < 0: cur_line = 0 elif cur_line >= len(self.text.split('\n')): cur_line = len(self.text.split('\n')) - 1 bol = 0 line = 0 point = 0 for s in self.text.split('\n'): point = bol + min(cursor[0], len(s)) if line == cur_line: break line += 1 bol += len(s) + 1 return point # Make sure current point is visible in the window def scroll_to_point(self): while self.point_to_cursor(self.point)[1] < self.top_line: self.top_line -= 1 while self.point_to_cursor(self.point)[1] >= self.top_line + self.lines: self.top_line += 1 def addstr(self, line, col, text, attrib=None): if col < self.cols: if line == self.lines - 1: text = text[:self.cols - col - 1] else: text = text[:self.cols - col] if attrib: self.window.addstr(line, col, text, attrib) else: self.window.addstr(line, col, text) # Repaint the window def repaint(self): self.window.erase() self.scroll_to_point() selection = self.get_selection() if selection: start_selection = self.point_to_cursor(selection[0]) end_selection = self.point_to_cursor(selection[1]) line = 0 for s in self.text.split('\n'): if self.top_line <= line and line < self.top_line + self.lines: # Paint the marked region in reverse video if selection and start_selection[1] <= line and line <= end_selection[1]: if line == start_selection[1]: before = s[:start_selection[0]] middle = s[start_selection[0]:] else: before = "" middle = s if line == end_selection[1]: after = middle[end_selection[0]:] middle = middle[:end_selection[0]] else: after = "" self.addstr(line - self.top_line, 0, before) self.addstr(line - self.top_line, len(before), middle, curses.A_REVERSE) self.addstr(line - self.top_line, len(before) + len(middle), after) else: self.addstr(line - self.top_line, 0, s) line += 1 self.window.refresh() # Set window size def resize(self, lines, cols, y, x): self.lines = lines self.cols = cols self.window.resize(lines, cols) self.window.mvwin(y, x) self.repaint() # This window is the input window, set the cursor position # to the current point def set_cursor(self): p = self.point_to_cursor(self.point) col = min(self.cols - 1, p[0]) self.window.move(p[1] - self.top_line, col) self.window.refresh() # Find the indent of the specified line def indent_at(self, line): bol = self.cursor_to_point((0, line)) point = bol while point < len(self.text) and self.text[point] == " ": point += 1 return point - bol # Return the last character on the specified line def last_ch(self, line): eol = self.cursor_to_point((65536, line)) point = eol - 1 while point > 0 and self.text[point] == " ": point -= 1 return self.text[point] # Is 'point' in the indentation of its line? def in_indent(self, point): cursor = self.point_to_cursor(point) if cursor[0] > 0 and self.indent_at(cursor[1]) >= cursor[0]: return True return False # Move left def left(self): if self.point > 0: self.point -= 1 # Move up def up(self): pos = self.point_to_cursor(self.point) point = self.cursor_to_point((pos[0], pos[1]-1)) if point == self.point: point = self.cursor_to_point((0, pos[1])) self.point = point # Move right def right(self): if self.point < len(self.text): self.point += 1 # Move down def down(self): pos = self.point_to_cursor(self.point) point = self.cursor_to_point((pos[0], pos[1]+1)) if point == self.point: point = self.cursor_to_point((65536, pos[1])) self.point = point # Move to beginning of line def bol(self): pos = self.point_to_cursor(self.point) self.point = self.cursor_to_point((0, pos[1])) # Move to end of line def eol(self): pos = self.point_to_cursor(self.point) self.point = self.cursor_to_point((65536, pos[1])) # Move to beginning of buffer def bob(self): self.point = 0 # Move to end of buffer def eob(self): self.point = len(self.text) # Move to previous page. That means moving up by self.lines-1 and # then placing that line at the bottom of the screen def prev_page(self): pos = self.point_to_cursor(self.point) self.point = self.cursor_to_point((pos[0], pos[1] - (self.lines)-1)) new_line = self.point_to_cursor(self.point)[1] top_line = new_line - (self.lines-1) top_pos = self.cursor_to_point((0, top_line)) self.top_line = self.point_to_cursor(top_pos)[1] # Move to next page. This means moving down by self.lines-1 and # then placing that line at the top of the screen def next_page(self): pos = self.point_to_cursor(self.point) self.point = self.cursor_to_point((pos[0], pos[1] + (self.lines)-1)) self.top_line = self.point_to_cursor(self.point)[1] # Check whether in the last line of the buffer def in_last_line(self): end = self.point_to_cursor(len(self.text)) return self.point >= self.cursor_to_point((0, end[1])) def push_undo(self, point, operation): self.undo.append((point, operation, self.point, self.mark)) def pop_undo(self): if not self.undo: return False (point, operation, self_point, self_mark) = self.undo.pop() if isinstance(operation, str): # Replace deleted text self.text = self.text[:point] + operation + self.text[point:] else: # Delete inserted text self.text = self.text[:point] + self.text[point+operation:] self.point = self_point self.mark = self_mark self.changed = True return True # Insert some text, adjusting self.point and self.mark if the text # is before them def insert(self, point, text): self.push_undo(point, len(text)) self.text = self.text[:point] + text + self.text[point:] if point < self.point: self.point += len(text) if point < self.mark: self.mark += len(text) self.changed = True def insert_at_point(self, text): self.insert(self.point, text) self.point += len(text) # Delete some text, adjusting self.point if the delete starts # before it def _adjust_delete_position(self, delete_point, delete_count, moving_point, is_mark): if delete_point <= moving_point and moving_point < delete_point + delete_count: if is_mark: return -1 moving_point = delete_point elif delete_point + delete_count <= moving_point: moving_point -= delete_count return moving_point def delete(self, point, count): self.push_undo(point, self.text[point:point+count]) self.text = self.text[:point] + self.text[point + count:] self.point = self._adjust_delete_position(point, count, self.point, False) if self.mark >= 0: self.mark = self._adjust_delete_position(point, count, self.mark, True) self.changed = True def delete_at_point(self, count): self.delete(self.point, count) # Delete back to the previous tab stop def backtab(self): pos = self.point_to_cursor(self.point) if pos[0] == 0: return to_remove = pos[0] % self.tab_width if to_remove == 0: to_remove = self.tab_width self.point -= to_remove self.delete_at_point(to_remove) # Delete something. If there's a mark, delete that. otherwise, # delete backwards, if in indent of the line, backtab def backspace(self): selection = self.get_selection() if selection: self.delete(selection[0], selection[1] - selection[0]) self.mark = -1 elif self.point > 0: if self.in_indent(self.point): self.backtab() else: self.left() self.delete_at_point(1) # Set or clear the 'mark', which defines # the other end of the current selection def toggle_mark(self): if self.mark >= 0: self.mark = -1 else: self.mark = self.point # Return the extent of the current selection, False if none def get_selection(self): if self.mark >= 0: return (min(self.mark, self.point), max(self.mark, self.point)) else: return False # Copy from mark to point and place in cut buffer # delete from text if requested def copy(self, delete=False): selection = self.get_selection() if selection: (start, end) = selection self.cut = self.text[start:end] if delete: self.delete(start, end - start) self.mark = -1 # Paste any cut buffer at point def paste(self): if self.cut: self.insert_at_point(self.cut) # Set indent of current line to 'want'. Leave point # at the end of the indent def indent(self, want): self.bol() have = 0 while self.point < len(self.text) and self.text[self.point] == " ": self.right() have += 1 if have < want: self.insert_at_point(" " * (want - have)) elif have > want: self.delete_at_point(have - want) # Automatically indent the current line, # using the previous line as a guide def auto_indent(self): cursor = self.point_to_cursor(self.point) want = 0 if cursor[1] > 0: want = self.indent_at(cursor[1] - 1) if self.last_ch(cursor[1] - 1) == ":": want += self.tab_width self.indent(want) # Delete to end of line, or delete newline if at end of line def delete_to_eol(self): current = self.point_to_cursor(self.point) eol = self.cursor_to_point((65536, current[1])) if self.point == eol: self.delete_at_point(1) else: self.delete_at_point(eol - self.point) # Read a character for this window def getch(self): self.repaint() return my_getch(self) # Return the contents of the previous line def cur_line(self): pos = self.point_to_cursor(self.point) start = self.cursor_to_point((0, pos[1])) end = self.cursor_to_point((65536, pos[1])) return self.text[start:end] def dispatch(self, ch): if ch == 0 or ch == ord(' ') + 0x80: self.toggle_mark() elif ch == ord('c') & 0x1f or ch == ord('c') + 0x80: self.copy(delete=False) elif ch == ord('x') & 0x1f or ch == ord('x') + 0x80: self.copy(delete=True) elif ch == ord('v') & 0x1f or ch == ord('v') + 0x80: self.paste() elif ch == ord('k') & 0x1f: self.delete_to_eol() elif ch == ord('z') & 0x1f: self.pop_undo() elif ch == curses.KEY_LEFT or ch == ord('b') & 0x1f: self.left() elif ch == curses.KEY_RIGHT or ch == ord('f') & 0x1f: self.right() elif ch == curses.KEY_UP or ch == ord('p') & 0x1f: self.up() elif ch == curses.KEY_DOWN or ch == ord('n') & 0x1f: self.down() elif ch == curses.KEY_HOME or ch == ord('a') & 0x1f: self.bol() elif ch == curses.KEY_PPAGE: self.prev_page() elif ch == curses.KEY_NPAGE: self.next_page() elif ch == curses.KEY_END or ch == ord('e') & 0x1f: self.eol() elif ch == ord('\t'): self.auto_indent() elif ch in (curses.ascii.BS, curses.KEY_BACKSPACE, curses.ascii.DEL): self.backspace() elif curses.ascii.isprint(ch) or ch == ord('\n'): self.insert_at_point(chr(ch)) class ErrorWin: """Show an error message""" label = "" x = 0 y = 0 nlines = 5 ncols = 40 inputthread = True window = False def __init__(self, label, inputthread=True): self.label = label self.inputthread = inputthread self.ncols = min(snek_cols, max(40, len(label) + 2)) self.x = (snek_cols - self.ncols) // 2 self.y = (snek_lines - self.nlines) // 2 self.window = curses.newwin(self.nlines, self.ncols, self.y, self.x) self.window.keypad(True) self.window.notimeout(False) self.run_dialog() def repaint(self): self.window.border() l = len(self.label) if l > self.ncols: l = self.ncols self.window.addstr(1, (self.ncols - l) // 2, self.label) self.window.addstr(3, 2, "OK") def close(self): del self.window screen_repaint() def run_dialog(self): global snek_dialog_waiting self.repaint() self.window.move(3, 4) self.window.refresh() if self.inputthread: self.window.getstr() self.close() else: snek_dialog_waiting = self class GetTextWin: """Prompt for line of text""" label = "" prompt = "" x = 0 y = 0 nlines = 5 ncols = 40 window = False def __init__(self, label, prompt="File:"): self.label = label self.prompt = prompt self.x = (snek_cols - self.ncols) // 2 self.y = (snek_lines - self.nlines) // 2 self.window = curses.newwin(self.nlines, self.ncols, self.y, self.x) self.window.keypad(True) self.window.notimeout(False) def repaint(self): self.window.border() self.window.addstr(1, (self.ncols - len(self.label)) // 2, self.label) self.window.addstr(3, 2, self.prompt) def run_dialog(self): self.repaint() self.window.move(3, 8) curses.echo() name = self.window.getstr() curses.noecho() del self.window screen_repaint() return str(name, encoding='utf-8', errors='ignore') class GetFileWin: """Prompt for a filename""" label = "" dir = "" x = 0 y = 0 nlines = 20 ncols = 60 new = False window = False cur_ent = 1 file = "" full_file = "" def __init__(self, label, path, new=False): self.label = label self.new = new self.nlines = snek_lines - 2 self.ncols = snek_cols - 10 self.cur_ent = 1 self.top_ent = 0 self.x = (snek_cols - self.ncols) // 2 self.y = (snek_lines - self.nlines) // 2 self.window = curses.newwin(self.nlines, self.ncols, self.y, self.x) self.window.keypad(True) self.window.notimeout(False) if path: self.dir = path.parent else: self.dir = Path().resolve() self.get_files() if path: for i in range(len(self.files)): if self.files[i] == path.name: self.set_ent(i) break def get_files(self): files = [] dirs = [] for f in self.dir.glob('*'): if f.is_dir(): dirs += [f.name] else: files += [f.name] dirs.sort() files.sort() self.files = ['..'] + dirs + files self.file_offset = 0 self.cur_ent = 1 self.file = self.files[1] def set_dir(self, dir): self.dir = self.path.resolve() self.get_files() def ent_line(self, i): return 4 + i def ents(self): return self.nlines - 5 def set_ent(self, ent): if 0 <= ent and ent < len(self.files): self.cur_ent = ent self.file = self.files[self.cur_ent] if ent < self.file_offset: self.file_offset = ent elif ent >= self.file_offset + self.ents(): self.file_offset = ent - self.ents() + 1 def repaint(self): self.window.border() self.window.addstr(1, (self.ncols - len(self.label)) // 2, self.label) self.path = self.dir / PurePath(self.file) if self.file == '': self.full_file = str(self.dir / PurePath('x'))[:-1] else: self.full_file = str(self.path) self.window.addstr(2, 2, ' ' * (self.ncols - 3)) left = max(0, len(self.full_file) - 2 - self.ncols) self.window.addstr(2, 2, self.full_file[left:]) for i in range(0,self.ents()): f = self.file_offset + i self.window.addstr(self.ent_line(i), 2, ' ' * (self.ncols - 3)) if f < len(self.files): text = self.files[f] if (self.dir / PurePath(text)).is_dir(): text = '[' + text + ']' text = text[0:self.ncols-3] if f == self.cur_ent: self.window.addstr(self.ent_line(i), 2, text, curses.A_REVERSE) else: self.window.addstr(self.ent_line(i), 2, text) def set_cursor(self): self.window.move(2, min(2 + len(self.full_file), self.ncols - 2)) self.window.refresh() def run_dialog(self): while True: self.repaint() self.window.refresh() ch = my_getch(self) if ch == ord('\n'): if not self.path.is_dir(): break; self.set_dir(self.path.resolve()) elif ch == curses.ascii.ESC or ch == curses.KEY_F4: self.path = None break elif ch == curses.KEY_UP or ch == ord('p') & 0x1f: self.set_ent(self.cur_ent - 1) elif ch == curses.KEY_DOWN or ch == ord('n') & 0x1f: self.set_ent(self.cur_ent + 1) else: if not self.new: curses.beep() elif ch in (curses.ascii.BS, curses.KEY_BACKSPACE, curses.ascii.DEL): if len(self.file) > 0: self.file = self.file[0:-1] elif curses.ascii.isprint(ch): self.file = self.file + chr(ch) else: curses.beep() del self.window screen_repaint() return self.path class GetPortWin: """Prompt for serial port""" ports = False x = 0 y = 0 nlines = 0 ncols = 40 curline = 1 fakeport = None title = None def label(self, port): l = "%-15.15s %s" % (port.name, port.description) return l[:snek_cols-3] def make_fake(self, description): return SnekPort(("Cancel", "Cancel", description)) def __init__(self, title="Select Port"): self.title = title self.ports = snek_list_ports() if len(self.ports) == 0: self.fakeport = self.make_fake("No ports available") else: self.fakeport = self.make_fake("") maxlen = len(self.title) for port in self.ports: maxlen = max(maxlen, len(self.label(port))) maxlen = max(maxlen, len(self.label(self.fakeport))) self.ncols = maxlen + 3 self.nlines = 2 + 1 + len(self.ports) + 1 self.curline = 0 self.x = (snek_cols - self.ncols) // 2 self.y = (snek_lines - self.nlines) // 2 self.window = curses.newwin(self.nlines, self.ncols, self.y, self.x) self.window.keypad(True) self.window.notimeout(False) def paint_port(self, line, port): if line == self.curline: self.window.addstr(line+2, 1, " " * (self.ncols - 3), curses.A_REVERSE) self.window.addstr(line+2, 1, self.label(port), curses.A_REVERSE) else: self.window.addstr(line+2, 1, " " * (self.ncols - 3)) self.window.addstr(line+2, 1, self.label(port)) def repaint(self): self.window.border() self.window.addstr(1, (self.ncols - len(self.title)) // 2, self.title) line = 0 for port in self.ports: self.paint_port(line, port) line += 1 self.paint_port(line, self.fakeport) def set_cursor(self): self.window.move(self.curline + 2,self.ncols-2) def run_dialog(self): while True: self.repaint() ch = my_getch(self) if ch == ord('\n'): del self.window screen_repaint() if self.curline >= len(self.ports): return None return self.ports[self.curline].device elif ch == curses.KEY_UP or ch == ord('p') & 0x1f: self.curline = max(0, self.curline-1) elif ch == curses.KEY_DOWN or ch == ord('n') & 0x1f: self.curline = min(len(self.ports), self.curline+1) def screen_get_sizes(): global snek_lines, snek_cols, stdscr snek_lines, snek_cols = stdscr.getmaxyx() repl_lines = snek_lines // 3 edit_lines = snek_lines - repl_lines - 2 edit_y = 1 repl_y = edit_y + edit_lines + 1 return (edit_lines, edit_y, repl_lines, repl_y) help_text = ( ("F1", "Device"), ("F2", "Get"), ("F3", "Put"), ("F4", "Quit"), ("F5", "Load"), ("F6", "Save"), ("F7", "Switch") ) # Paint the function key help text and the separator line def screen_paint(): global stdscr, snek_device, snek_edit_win help_col = 0 help_cols = min(snek_cols // len(help_text), 13) stdscr.addstr(0, 0, " " * snek_cols) for (f, t) in help_text: stdscr.addstr(0, help_col, " %2s: %-6s " % (f, t), curses.A_REVERSE) help_col += help_cols device_name = "" if snek_device: device_name = snek_device.device device_col = snek_cols - len(device_name) if device_col < 0: device_col = 0 mid_y = snek_edit_win.y + snek_edit_win.lines stdscr.addstr(mid_y, device_col, device_name, curses.A_REVERSE) if device_col >= 6: stdscr.addstr(mid_y, device_col - 6, " ", curses.A_REVERSE) for col in range(0,device_col - 6,5): stdscr.addstr(mid_y, col, "snek ", curses.A_REVERSE) stdscr.refresh() # Repaint everything, as when a dialog goes away def screen_repaint(): global snek_edit_win, snek_repl_win stdscr.clear() snek_edit_win.repaint() snek_repl_win.repaint() screen_paint() if snek_current_window: snek_current_window.set_cursor() # Handle screen resize def screen_resize(): global snek_edit_win, snek_repl_win # # Update desired window sizes # (edit_lines, edit_y, repl_lines, repl_y) = screen_get_sizes() stdscr.clear() snek_edit_win.resize(edit_lines, snek_cols, edit_y, 0) snek_repl_win.resize(repl_lines, snek_cols, repl_y, 0) screen_paint() def screen_init(text): global stdscr, snek_edit_win, snek_repl_win stdscr = curses.initscr() curses.noecho() curses.raw() stdscr.keypad(True) stdscr.notimeout(False) (edit_lines, edit_y, repl_lines, repl_y) = screen_get_sizes() snek_edit_win = EditWin(edit_lines, snek_cols, edit_y, 0) if text: snek_edit_win.set_text(text) snek_repl_win = EditWin(repl_lines, snek_cols, repl_y, 0) screen_paint() def screen_fini(): global stdscr stdscr.keypad(False) curses.noraw() curses.echo() curses.endwin() def snekde_open_device(): global snek_device, snek_monitor dialog = GetPortWin() name = dialog.run_dialog() if not name: return try: device = SnekDevice(name, snek_monitor) device.start() if snek_device: snek_device.close() del snek_device snek_device = device screen_paint() except OSError as e: message = e.strerror if not message: message = "failed" ErrorWin("%s: %s" % (name, message)) def snekde_get_text(): global snek_edit_win, snek_device snek_edit_win.set_text("") snek_device.command("eeprom.show(1)\n") def snekde_put_text(): global snek_edit_win, snek_device if len(snek_edit_win.text.strip()) == 0: ErrorWin("No program to put") return snek_device.command("eeprom.write()\n") snek_device.write(snek_edit_win.text + '\x04') snek_device.command("reset()\n", intr='') snek_edit_win.changed = False # # Load a path into the edit buffer # def load_file(path): global snek_cur_path with open(path, 'r') as myfile: data = myfile.read() snek_edit_win.set_text(data) snek_cur_path = path snek_edit_win.changed = False # # Save the edit buffer to a path # def save_file(path): global snek_cur_path with open(path, 'w') as myfile: myfile.write(snek_edit_win.text) snek_cur_path = path snek_edit_win.changed = False # # Display a dialog box requesting a file name, # then load that file # def snekde_load_file(): global snek_edit_win, snek_cur_path dialog = GetFileWin("Load File", snek_cur_path, new=False) path = dialog.run_dialog() if not path: return try: load_file(path) except OSError as e: ErrorWin("%s: %s" % (e.filename, e.strerror)) # # Display a dialog box requesting a file name, # then save to that file # def snekde_save_file(): global snek_edit_win, snek_cur_path dialog = GetFileWin("Save File", snek_cur_path, new=True) path = dialog.run_dialog() if not path: return if path != snek_cur_path and path.exists(): ErrorWin("%s: already exists" % str(path)) try: save_file(path) except OSError as e: ErrorWin("%s: %s" % (e.filename, e.strerror)) def run(): global snek_current_window, snek_edit_win, snek_repl_win, snek_device snek_current_window = snek_edit_win prev_exit = False while True: ch = snek_current_window.getch() if ch == curses.ascii.ESC: ch = snek_current_window.getch() | 0x80 if ch == 3: if snek_device: snek_device.interrupt() elif ch == curses.KEY_F1 or ch == ord('1') | 0x80: snekde_open_device() elif ch == curses.KEY_F2 or ch == ord('2') | 0x80: if snek_device: snekde_get_text() else: ErrorWin("No device") elif ch == curses.KEY_F3 or ch == ord('3') | 0x80: if snek_device: snekde_put_text() else: ErrorWin("No device") elif ch == curses.KEY_F4 or ch == ord('4') | 0x80: if snek_edit_win.changed and not prev_exit: ErrorWin("Unsaved changes, quit again to abandon them") prev_exit = True continue sys.exit(0) elif ch == curses.KEY_F5 or ch == ord('5') | 0x80: snekde_load_file() elif ch == curses.KEY_F6 or ch == ord('6') | 0x80: snekde_save_file() elif ch == curses.KEY_F7 or ch == ord('7') | 0x80 or ch == ord('o') & 0x1f: if snek_current_window is snek_edit_win: snek_current_window = snek_repl_win else: snek_current_window = snek_edit_win elif ch == ord('\n'): if snek_current_window is snek_edit_win: snek_current_window.dispatch(ch) snek_current_window.auto_indent() elif snek_device: data = snek_repl_win.cur_line() # # Trim off snek prompts # while True: if data[:2] == "> " or data[:2] == "+ ": data = data[2:] elif data[:1] == ">" or data[:1] == "+": data = data[1:] else: break # # If we're not at the end of the buffer, copy # the line to the end # if not snek_repl_win.in_last_line(): snek_repl_win.eob() snek_repl_win.insert_at_point(data) snek_repl_win.eob() snek_current_window.dispatch(ch) data += '\n' snek_device.command(data,intr='') else: snek_current_window.dispatch(ch) prev_exit = False # Class to monitor the serial device for data and # place in approprite buffer. Will be used as # parameter to SnekDevice, and so it must expose # 'cv' as a condition variable and 'receive' as a # function to get data class SnekMonitor: def __init__(self): global snek_lock self.cv = threading.Condition(snek_lock) # Reading text to snek_edit_win instead of snek_repl_win getting_text = False def add_to(self, window, data): global snek_current_window, snek_repl_win follow = window == snek_repl_win and window.point == len(window.text) window.text += data if follow: window.point += len(data) window.repaint() if snek_current_window: snek_current_window.set_cursor() def receive(self, data): global snek_edit_win, snek_repl_win, snek_lock data_edit = "" data_repl = "" for c in data: if c == '\x02': self.getting_text = True elif c == '\x03': self.getting_text = False elif c == '\x00': continue elif c == '\r': continue else: if self.getting_text: data_edit += c else: data_repl += c with snek_lock: if data_edit: self.add_to(snek_edit_win, data_edit) if data_repl: self.add_to(snek_repl_win, data_repl) def failed(self, device): global snek_device, snek_lock with snek_lock: if snek_device: snek_device.close() del snek_device snek_device = False ErrorWin("Device %s failed" % device, inputthread=False) def main(): global snek_device, snek_edit_win, snek_monitor snek_monitor = SnekMonitor() arg_parser = argparse.ArgumentParser() arg_parser.add_argument("--list", action='store_true', help="List available serial devices") arg_parser.add_argument("--port", help="Serial device") arg_parser.add_argument("file", nargs="*", help="Read file into edit window") args = arg_parser.parse_args() snek_device = False if args.list: for port in snek_list_ports(): print("%-30.30s %s" % (port.name, port.description)) sys.exit(0) if args.port: try: snek_device = SnekDevice(args.port, snek_monitor) except OSError as e: print(e.strerror, file=sys.stderr) sys.exit(1) text = "" if args.file: try: with open(args.file[0], 'r') as myfile: text = myfile.read() except OSError as e: print("%s: %s", (e.filename, e.strerror), file=sys.stderr) sys.exit(1) try: screen_init(text) if snek_device: snek_device.start() run() finally: screen_fini() main() snek-1.1/test/000077500000000000000000000000001353657467200133145ustar00rootroot00000000000000snek-1.1/test/Makefile000066400000000000000000000040371353657467200147600ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # SNEK_ROOT=.. include $(SNEK_ROOT)/snek.defs SNEK?=$(SNEK_PORTS)/posix/snek SUCCESS_TESTS = \ andor.py \ list.py \ dict.py \ equal_is.py \ float.py \ for-array.py \ for-range.py \ for-string.py \ for-break.py \ for-nested.py \ global.py \ if.py \ math.py \ op.py \ range.py \ slice.py \ while.py \ while-break.py \ while-else.py \ scoping-global.py \ scoping-local.py \ none.py \ args.py \ assert-success.py FAIL_TESTS = \ scoping-no-decl.py \ list-named.py \ tuple-named.py \ range-named.py \ formal-named-first.py \ actual-named-first.py \ args-missing.py \ arg-dup1.py \ arg-dup2.py \ arg-unknown.py \ assert-fail.py check: @exit=0; \ for TEST in $(SUCCESS_TESTS); do \ echo "Running test $$TEST."; \ if python3 $$TEST; then \ echo " python pass"; \ else \ echo " ***************** python fail *********************"; \ exit=1; \ fi; \ if $(SNEK) $$TEST; then \ echo " snek pass"; \ else \ echo " ***************** snek fail ***********************"; \ exit=1; \ fi; \ done; \ for TEST in $(FAIL_TESTS); do \ echo "Running test $$TEST."; \ python3 $$TEST 2>/dev/null; \ if [ $$? -eq 1 ]; then \ echo " python pass"; \ else \ echo " ***************** python fail *********************"; \ exit=1; \ fi; \ $(SNEK) $$TEST 2>/dev/null; \ if [ $$? -eq 1 ]; then \ echo " snek pass"; \ else \ echo " ***************** snek fail ***********************"; \ exit=1; \ fi; \ done; \ exit $$exit snek-1.1/test/actual-named-first.py000066400000000000000000000011361353657467200173470ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # def foo(x,y=1): return x+y print(foo(y=1,12)) exit(0) snek-1.1/test/andor.py000066400000000000000000000017101353657467200147700ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # # # Check short-circuiting and/or # or00 = (0 or 0) + 0 or10 = (1 or 0) + 0 or01 = (0 or 1) + 0 or11 = (1 or 1) + 0 and00 = (0 and 0) + 0 and10 = (1 and 0) + 0 and01 = (0 and 1) + 0 and11 = (1 and 1) + 0 if or00 != False: exit(1) if or10 != True: exit(1) if or01 != True: exit(1) if or11 != True: exit(1) if and00 != False: exit(1) if and10 != False: exit(1) if and01 != False: exit(1) if and11 != True: exit(1) snek-1.1/test/arg-dup1.py000066400000000000000000000011221353657467200153020ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # def req(x): return x req(1,x=2) exit(0) snek-1.1/test/arg-dup2.py000066400000000000000000000011241353657467200153050ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # def req(x): return x req(x=1,x=2) exit(0) snek-1.1/test/arg-unknown.py000066400000000000000000000011211353657467200161270ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # def req(x): return x req(y=10) exit(0) snek-1.1/test/args-missing.py000066400000000000000000000011151353657467200162670ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # def req(x): return x req() exit(0) snek-1.1/test/args.py000066400000000000000000000043631353657467200146300ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # def check(want, got, mess): if got != want: print("fail: %s (want %r got %r)" % (mess, want, got)) exit(1) def req(x): return x def default(x=0): return x def req_req(x,y): return x-y def req_default(x,y=42): return x-y def default_default(x=63,y=42): return x-y def many_args(x,y,z,a=7,b=11,c=13): return x * y * z * a * b * c check(1,req(1),"pos req") check(2,req(x=2),"named req") check(3,default(3),"pos default") check(4,default(x=4),"named default") check(5,req_req(6,1), "pos_pos req_req") check(6,req_req(8,y=2), "pos_named req_req") check(7,req_req(x=10,y=3), "named1_named2 req_req") check(8,req_req(y=4,x=12), "named2_named1 req_req") check(9,req_default(13,4), "pos_pos req_default") check(10,req_default(14,y=4), "pos_named req_default") check(11,req_default(x=16,y=5), "named1_named2 req_default") check(12,req_default(y=6,x=18), "named2_named1 req_default") check(13,req_default(55), "pos_default req_default") check(14,req_default(x=56), "named1_default req_default") check(15,default_default(22,7), "pos_pos default_default") check(16,default_default(24,y=8), "pos_named default_default") check(17,default_default(x=26,y=9), "named1_named2 default_default") check(18,default_default(y=10,x=28), "named2_named1 default_default") check(19,default_default(61), "pos_default default_default") check(20,default_default(x=62), "named1_default default_default") check(21,default_default(), "default_default default_default") check(2*3*5*7*11*13,many_args(2,3,5), "many_args ()") check(2*3*5*17*11*13,many_args(2,3,5,a=17), "many_args (a=17)") check(2*3*5*17*19*13,many_args(2,3,5,a=17,b=19), "many_args (a=17,b=19)") check(2*3*5*17*19*23,many_args(2,3,5,a=17,b=19,c=23), "many_args (a=17,b=19,c=23)") snek-1.1/test/assert-fail.py000066400000000000000000000011341353657467200160770ustar00rootroot00000000000000# # Copyright © 2019 Paulo Henrique Silva # # 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. # # # Check assert failure # assert 42 == 41 snek-1.1/test/assert-success.py000066400000000000000000000012741353657467200166410ustar00rootroot00000000000000# # Copyright © 2019 Paulo Henrique Silva # # 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. # # # Check assert success # assert 42 == 42 assert True assert 1 assert [42] assert "true" assert "false" # string s is True if len(s) > 0 snek-1.1/test/dict.py000066400000000000000000000034071353657467200146150ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # def fail(which): print("fail %s" % which) exit(1) def check(expect,got,which): if expect != got: fail("%s: %r != %r" % (which, got, expect)) a = { 1:2, 3:4 } b = { "a":"b", "c":"d" } c = { 1:2, 1:3 } check({3:4, 1:2}, a, "a == {3:4, 1:2}") check({1:3}, c, "c == {1:3}") check({"c":"d", "a":"b"}, b, 'b = {"c":"d", "a":"b"}') check(True, 1 in a, "1 in a") check(False, 2 in a, "2 not in a") check(True, 3 in a, "3 in a") check(False, 4 in a, "4 not in a") check(True, "a" in b, "'a' in b") check(False, "b" in b, "'b' not in b") check(True, "c" in b, "'c' in b") check(False, "d" in b, "'d' not in b") sum_a_0 = 0 sum_a_1 = 0 for i in a: sum_a_0 += i sum_a_1 += a[i] check(4, sum_a_0, "sum a indices == 4") check(6, sum_a_1, "sum a values == 6") sum_b_0 = "" sum_b_1 = "" for i in b: sum_b_0 += i sum_b_1 += b[i] check("ac", sum_b_0, "sum b indices == 'ac'") check("bd", sum_b_1, "sum b values == 'bd'") a[1] = 5 b["a"] = "e" check(5, a[1], "a[1] == 5") check("e", b["a"], "b['a'] == 'e'") a[6] = 7 b["f"] = "g" check(7, a[6], "a[6] == 7") check("g", b["f"], "b['f'] == 'g'") del a[1] del b['c'] check({3:4, 6:7}, a, "a = {3:4, 6:7}") check({'a': 'e', 'f': 'g'}, b, "b = {'a': 'e', 'f': 'g'}") snek-1.1/test/equal_is.py000066400000000000000000000030621353657467200154710ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # # Foil the python3 compiler into creating separate tuples def twople(a,b): return (a,b) def cat(a,b): a + b al = [1,2] adl = [[1,2],[3,4]] bl = [1,2] bdl = [[1,2],[3,4]] at = twople(1,2) adt = (twople(1,2),twople(3,4)) bt = twople(1,2) bdt = (twople(1,2),twople(3,4)) astr = cat("h", "ello") bstr = cat("he", "llo") def fail(which): print("fail %s" % which) exit(1) # == tests elements of lists and tuples and strings if not (al == bl): fail("al == bl") if not (adl == bdl): fail("adl == bdl") if not (at == bt): fail("at == bt") if not (adt == bdt): fail("adt == bdt") if not (astr == bstr): fail("astr == bstr") # is tests for same lists/tuples, but matching string contents if (al is bl): fail("al is bl") if (adl is bdl): fail("adl is bdl") if (at is bt): fail("at is bt") if (adt is bdt): fail("adt is bdt") if not (astr is bstr): fail("astr is bstr") # in uses ==, not is if not (al in adl): exit (1) if not (bl in bdl): exit (1) if not (at in adt): exit (1) if not (bt in bdt): exit (1) snek-1.1/test/float.py000066400000000000000000000020401353657467200147670ustar00rootroot00000000000000#!/usr/bin/python3 # # Copyright © 2019 Keith Packard # # 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. # def fail(which): print("fail %s" % which) exit(1) def check(a,b,which): if a > b or a < b: fail(which) # 1.701412e38 is 0x7f000001. Make sure both of these values look like # numbers check (-1.701412e38, 2 * -8.50706e37, "-1.701412e38") check ( 1.701412e38, 2 * 8.50706e37, " 1.701412e38") # in 32-bit floats, these should be +/- inf check (2 * -1.701412e38, 4 * -8.50706e37, "2 * -1.701412e38") check (2 * 1.701412e38, 4 * 8.50706e37, "2 * 1.701412e38") snek-1.1/test/for-array.py000066400000000000000000000011431353657467200155670ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # sum=0 for i in [1,2,3]: sum += i if sum != 6: exit(1) snek-1.1/test/for-break.py000066400000000000000000000014711353657467200155410ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # #!/usr/bin/python3 def test(): val = 5 tries = 0 while tries < 10: tries += 1 for x in range(10): if x == val: val = 20 break else: break return tries if test() != 2: exit(1) snek-1.1/test/for-nested.py000066400000000000000000000014411353657467200157340ustar00rootroot00000000000000#!/usr/bin/python3 # # Copyright © 2019 Keith Packard # # 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. # def test(): matches = 0 for y in range(2): for x in range(10): if x == y: matches += 1 break else: break return matches if test() != 2: exit(1) snek-1.1/test/for-range.py000066400000000000000000000011731353657467200155500ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # product=1 for i in range(1,10,1): product *= i if product != 362880: exit(1) snek-1.1/test/for-string.py000066400000000000000000000011641353657467200157620ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # result="" for c in "abc": result = c + result if result != "cba": exit(1) snek-1.1/test/formal-named-first.py000066400000000000000000000011131353657467200173510ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # def foo(x=1,y): return x+y exit(0) snek-1.1/test/global.py000066400000000000000000000012151353657467200151250ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # n = 0 m = 3 def g(): global n n = 1 m = 2 g() if not (n == 1 and m == 3): exit(1) snek-1.1/test/if.py000066400000000000000000000014421353657467200142650ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # def g(i): if i == 0: return 100 elif i == 1: return 101 elif i == 2: return 102 else: return 103 if not (g(0) == 100 and g(1) == 101 and g(2) == 102 and g(3) == 103 and g("hello") == 103): exit(1) snek-1.1/test/list-named.py000066400000000000000000000010661353657467200157260ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # [x=1] exit(0) snek-1.1/test/list.py000066400000000000000000000017321353657467200146440ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # # # tuples don't have in-place operation, # so += makes a new tuple # a = () b = a a += (1,2) if a != (1,2): exit(1) if b != (): exit(1) # # lists have in-place operation, # so += does not make a new list # while a + b does make a new list # a = [] b = a c = a + [1,2] a += [1,2] if a != [1,2]: exit(1) if b != [1,2]: exit(1) if c != [1,2]: exit(1) a[0] = 3 if a != [3,2]: exit(1) if b != [3,2]: exit(1) if c != [1,2]: exit(1) snek-1.1/test/math.py000066400000000000000000000161501353657467200146220ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # # # Test math builtins # import math def fail(which): print("fail %s" % which) exit(1) # # Number-theoretic and representation functions # if not math.ceil(0.5) == 1: fail("math.ceil(0.5) == 1") if not math.ceil(-0.5) == 0: fail("math.ceil(-0.5) == 0") if not math.copysign(1.1, -2) == -1.1: fail("math.copysign(1.1, -2) == -1.1") if not math.copysign(-1.1, -2) == -1.1: fail("math.copysign(-1.1, -2) == -1.1") if not math.copysign(1.1, 2) == 1.1: fail("math.copysign(1.1, 2) == 1.1") if not math.copysign(-1.1, 2) == 1.1: fail("math.copysign(-1.1, 2) == 1.1") if not math.fabs(-1.1) == 1.1: fail("math.fabs(-1.1) == 1.1") if not math.fabs(1.1) == 1.1: fail("math.fabs(1.1) == 1.1") if not math.factorial(9) == 362880: fail("math.factorial(9) == 362880") if not math.floor(0.5) == 0: fail("math.floor(0.5) == 0") if not math.floor(-0.5) == -1: fail("math.floor(-0.5) == -1") if not math.frexp(12.5) == (0.78125, 4): fail("math.frexp(12.5) == (0.78125, 4)") if not math.isclose(math.fsum([0.001] * 1000), 1): fail("math.isclose(math.fsum([0.01] * 100), 1)") if not math.gcd(21,14) == 7: fail("math.gcd(21,14) == 7") big = 10.1 for i in range(40): big *= big if not math.isclose(1,1): fail("math.isclose(1,1)") if not not math.isclose(1.1,1): fail("not math.isclose(1.1,1)") if not math.isclose(1.1,1,rel_tol=.2): fail("math.isclose(1.1,1,rel_tol=.2)") if not math.isfinite(math.factorial(33)): fail("math.isfinite(math.factorial(33))") if not not math.isfinite(big): fail("not math.isfinite(big)") if not not math.isfinite(math.inf): fail("not math.isfinite(math.inf)") if not math.isinf(math.inf): fail("math.isinf(math.inf)") if not math.isinf(big): fail("math.isinf(math.inf)") if not not math.isinf(math.factorial(33)): fail("not math.isinf(math.factorial(33))") if not math.isnan(math.nan): fail("math.isnan(math.nan)") if not math.isnan(math.inf - math.inf): fail("math.isnan(math.inf - math.inf)") if not not math.isnan(big): fail("not math.isnan(math.inf)") if not not math.isnan(1.0): fail("not math.isnan(1.0)") if not math.ldexp(1,2) == 4: fail("math.ldexp(1,2) == 4") if not math.ldexp(1,-2) == 1/4: fail("math.ldexp(1,-2) == 1/4") if not math.modf(1.25) == (0.25, 1.0): fail("math.modf(1.25) == (0.25, 1.0)") if not math.remainder(5,2) == 1: fail("math.remainder(5,2) == 1") if not math.remainder(2.25,.5) == .25: fail("math.remainder(2.25,.5) == .25") if not math.trunc(3.1) == 3: fail("math.trunc(3.1) == 3") if not math.trunc(-3.1) == -3: fail("math.trunc(-3.1) == -3") if not round(3.4) == 3: fail("round(3.4) == 3") if not round(3.6) == 4: fail("round(3.6) == 4") if not round(-3.4) == -3: fail("round(-3.4) == -3") if not round(-3.6) == -4: fail("round(-3.6) == -4") # # Power and logarithmic functions # if not math.exp(0) == 1: fail("math.exp(0) == 1") if not math.isclose(math.exp(1), math.e): fail("isclose(math.exp(1), math.e)") if not math.isclose(math.exp(1) - 1, math.expm1(1)): fail("isclose(math.exp(1) - 1, math.expm1(1))") if not math.isclose(math.log(1), 0): fail("math.isclose(math.log(1), 0)") if not math.isclose(math.log(math.e), 1): fail("math.isclose(math.log(math.e), 1)") if not math.isclose(math.log1p(1),math.log(2)): fail("math.isclose(math.log1p(1),math.log(2))") if not math.isclose(math.log2(5.5),math.log(5.5)/math.log(2)): fail("math.isclose(math.log2(5.5),math.log(5.5)/math.log(2))") if not math.isclose(math.log10(5.5),math.log(5.5)/math.log(10)): fail("math.isclose(math.log10(5.5),math.log(5.5)/math.log(10))") if not math.isclose(math.pow(2.2,3.3),math.exp(math.log(2.2) * 3.3)): fail("math.isclose(pow(2.2,3.3),math.exp(math.log(2.2) * 3.3))") if not math.sqrt(4) == 2: fail("math.sqrt(4) == 2") if not math.isclose(math.sqrt(2) * math.sqrt(2), 2): fail("isclose(math.sqrt(2) * math.sqrt(2), 2)") # # Trigonometric functions # if not math.isclose(math.acos(0), math.pi/2): fail("math.isclose(math.acos(0), math.pi/2)") if not math.isclose(math.acos(1), 0): fail("math.isclose(math.acos(1), 0)") if not math.isclose(math.asin(0), 0): fail("math.isclose(math.asin(0), 0)") if not math.isclose(math.asin(1), math.pi/2): fail("math.isclose(math.asin(1), math.pi/2)") if not math.isclose(math.atan(0), 0): fail("math.isclose(math.atan(0), 0)") if not math.isclose(math.atan(1), math.pi/4): fail("math.isclose(math.atan(1), math.pi/4)") if not math.isclose(math.atan2(0,1), 0): fail("math.isclose(math.atan2(0,1), 0)") if not math.isclose(math.atan2(2,2), math.pi/4): fail("math.isclose(math.atan2(2,2), math.pi/4)") if not math.isclose(math.cos(math.pi/2), 0,abs_tol=1e-6): fail("math.isclose(math.cos(0), math.pi/2)") if not math.isclose(math.cos(0), 1): fail("math.isclose(math.cos(1), 0)") if not math.isclose(math.hypot(3,4), 5): fail("math.isclose(math.hypot(3,4), 5)") if not math.isclose(math.sin(0), 0): fail("math.isclose(math.sin(0), 0)") if not math.isclose(math.sin(math.pi/2), 1): fail("math.isclose(math.sin(1), math.pi/2)") if not math.isclose(math.tan(0), 0): fail("math.isclose(math.tan(0), 0)") if not math.isclose(math.tan(math.pi/4), 1): fail("math.isclose(math.tan(1), math.pi/4)") # # Angular conversion # if not math.isclose(math.degrees(0),0): fail("math.isclose(math.degrees(0),0)") if not math.isclose(math.degrees(math.pi),180): fail("math.isclose(math.degrees(math.pi),180)") if not math.isclose(math.radians(0),0): fail("math.isclose(math.radians(0),0)") if not math.isclose(math.radians(180), math.pi): fail("math.isclose(math.radians(180), math.pi)") # # Hyperbolic functions # if not math.isclose(math.sinh(1), (math.e - 1/math.e) / 2): fail("math.isclose(math.sinh(1), (math.e - 1/math.e) / 2)") if not math.isclose(math.cosh(1), (math.e + 1/math.e) / 2): fail("math.isclose(math.cosh(1), (math.e + 1/math.e) / 2)") if not math.isclose(math.tanh(1), math.sinh(1)/math.cosh(1)): fail("math.isclose(math.tanh(1), math.sinh(1)/math.cosh(1))") if not math.isclose(math.asinh(math.sinh(1)), 1): fail("math.isclose(math.asinh(math.sinh(1)), 1)") if not math.isclose(math.acosh(math.cosh(1)), 1): fail("math.isclose(math.acosh(math.cosh(1)), 1)") if not math.isclose(math.atanh(math.tanh(1)), 1): fail("math.isclose(math.atanh(math.tanh(1)), 1)") # # Special functions # if not math.isclose(math.erf(1), 0.8427007929497149): fail("math.isclose(math.erf(1), 0.8427007929497149)") if not math.isclose(math.erfc(1), 1-math.erf(1)): fail("math.isclose(math.erfc(1), 1-math.erf(1))") if not math.isclose(math.gamma(10), math.factorial(9)): fail("math.isclose(math.gamma(10), math.factorial(9))") if not math.isclose(math.lgamma(10), math.log(math.factorial(9))): fail("math.isclose(math.lgamma(10), math.log(math.factorial(9)))") # # Constants # if not math.isclose(math.pi * 2, math.tau): fail("math.isclose(math.pi * 2, math.tau)") snek-1.1/test/none.py000066400000000000000000000012131353657467200146220ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # a = None if a is not None: exit(1) def foo(): pass b = foo() if b is not None: exit(1) exit(0) snek-1.1/test/op.py000066400000000000000000000021331353657467200143030ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # # # Test arithmetic operations # import math if 2 + 3 != 5: exit(1) if 3 + 2 != 5: exit(1) if 2 - 3 != -1: exit(1) if 3 - 2 != +1: exit(1) if 2 * 3 != 6: exit(1) if 2 * (3 + 4) != 14: exit(1) if (2 * 3) + 4 != 10: exit(1) if 2 * 3 + 4 != 10: exit(1) if 2 ** 3 ** 4 == 4096: exit(1) if (2 ** 3) ** 4 != 4096: exit(1) if 7.8 // 2.2 != 3.0: exit(1) if 8.7 // 2.2 != 3.0: exit(1) if 8.8 // 2.2 != 4.0: exit(1) if -6.7 // 2.2 != -4.0: exit(1) if -6.6 // 2.2 != -3.0: exit(1) if not math.isclose(7.8 % 2.2, 1.2): exit(1) if not math.isclose(-7.8 % 2.2, 1.0): exit(1) snek-1.1/test/range-named.py000066400000000000000000000011231353657467200160410ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # for x in range(y=12): print(x) exit(0) snek-1.1/test/range.py000066400000000000000000000032361353657467200147660ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # expected = 0 times = 0 def start(init, final, interval): global expected, times times = 0 expected = (final - init) // interval if expected < 0: expected = 0 def iter(): global times times += 1 def check(which): global times, expected if times != expected: print("fail %s. times %d expected %d" % (which, times, expected)) exit(1) start(0,10,1) for i in range(10): iter() check("range(10)") start(0,10,1) for i in range(0,10): iter() check("range(0,10)") start(0,10,1) for i in range(0,10,1): iter() check("range(0,10,1)") start(1,10,1) for i in range(1,10): iter() check("range(1,10)") start(1,10,1) for i in range(1,10,1): iter() check("range(1,10,1)") start(0,10,-1) for i in range(0,10,-1): iter() check("range(0,10,-1)") start(1,10,-1) for i in range(1,10,-1): iter() check("range(1,10,-1)") start(10,0,1) for i in range(10,0): iter() check("range(10,0)") start(10,0,1) for i in range(10,0,1): iter() check("range(10,0,1)") start(10,0,-1) for i in range(10,0,-1): iter() check("range(10,0,-1)") start(10,1,-1) for i in range(10,1,-1): iter() check("range(10,1,-1)") snek-1.1/test/scoping-global.py000066400000000000000000000017651353657467200165770ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # # Test scoping for op= expressions. # In this case, there must be a local declaration of # the variable before the operation, either a plain assignment # or a global declaration # # a plain assignment will use the local variable # a global declaration will use the global variable # i = 1 def fail(which): print("fail %s" % which) exit(1) def global_decl(): global i i += 1 return i if not global_decl() == 2: fail("global_decl() == 2") snek-1.1/test/scoping-local.py000066400000000000000000000017571353657467200164320ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # # Test scoping for op= expressions. # In this case, there must be a local declaration of # the variable before the operation, either a plain assignment # or a global declaration # # a plain assignment will use the local variable # a global declaration will use the global variable # i = 1 def fail(which): print("fail %s" % which) exit(1) def local_decl(): i = 0 i += 1 return i if not local_decl() == 1: fail("local_decl() == 1") snek-1.1/test/scoping-no-decl.py000066400000000000000000000016051353657467200166510ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # # Test scoping for op= expressions. # In this case, there must be a local declaration of # the variable before the operation, either a plain assignment # or a global declaration # # a plain assignment will use the local variable # a global declaration will use the global variable # i = 1 def no_decl(): i += 1 return i no_decl() exit(0) snek-1.1/test/slice.py000066400000000000000000000111301353657467200147610ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # def slice_model(start, end, step, len): indices = [] if step == (): step = 1 ret = [] if step > 0: # default start is 0 if start == (): start = 0 # start < 0 is from end elif start < 0: start = len + start # default end is len if end == (): end = len # end < 0 is from end elif end < 0: end = len + end # bounds check start if start < 0: start = 0 val = start while val < end: if 0 <= val and val < len: ret += [val] val += step else: # default start is len - 1 if start == (): start = len - 1 elif start < 0: start = len + start # default end is -1 if end == (): end = -1 elif end < 0: end = len + end if start >= len: start = len - 1 val = start while val > end: if 0 <= val and val < len: ret += [val] val += step return ret def slice_string(value, start, end, step): indices = slice_model(start, end, step, len(value)) ret = "" for i in indices: ret += value[i] return ret def slice_list(value, start, end, step): indices = slice_model(start, end, step, len(value)) ret = [] for i in indices: ret += [value[i]] return ret def slice_tuple(value, start, end, step): indices = slice_model(start, end, step, len(value)) ret = () for i in indices: ret += (value[i],) return ret s = "hello" l = [1,2,3,4,5] t = (1,2,3,4,5) def check(model, impl, mess): if model != impl: print("fail: %s (model %r impl %r)" % (mess, model, impl)) exit(1) # Test lots of combinations of ranges for start in range(-10,10): for end in range(-10, 10): for step in range(-10,10): if step == 0: continue check (slice_string(s, (), (), ()), s[::], "[::]") check (slice_string(s, start, (), ()), s[start::], "[%d::]" % (start)) check (slice_string(s, (), end, ()), s[:end:], "[:%d:]" % (end)) check (slice_string(s, start, end, ()), s[start:end:], "[%d:%d:]" % (start, end)) check (slice_string(s, (), (), step), s[::step], "[::%d]" % (step)) check (slice_string(s, start, (), step), s[start::step], "[%d::%d]" % (start, step)) check (slice_string(s, (), end, step), s[:end:step], "[:%d:%d]" % (end, step)) check (slice_string(s, start, end, step), s[start:end:step], "[%d:%d:%d]" % (start, end, step)) check (slice_list(l, (), (), ()), l[::], "[::]") check (slice_list(l, start, (), ()), l[start::], "[%d::]" % (start)) check (slice_list(l, (), end, ()), l[:end:], "[:%d:]" % (end)) check (slice_list(l, start, end, ()), l[start:end:], "[%d:%d:]" % (start, end)) check (slice_list(l, (), (), step), l[::step], "[::%d]" % (step)) check (slice_list(l, start, (), step), l[start::step], "[%d::%d]" % (start, step)) check (slice_list(l, (), end, step), l[:end:step], "[:%d:%d]" % (end, step)) check (slice_list(l, start, end, step), l[start:end:step], "[%d:%d:%d]" % (start, end, step)) check (slice_tuple(t, (), (), ()), t[::], "[::]") check (slice_tuple(t, start, (), ()), t[start::], "[%d::]" % (start)) check (slice_tuple(t, (), end, ()), t[:end:], "[:%d:]" % (end)) check (slice_tuple(t, start, end, ()), t[start:end:], "[%d:%d:]" % (start, end)) check (slice_tuple(t, (), (), step), t[::step], "[::%d]" % (step)) check (slice_tuple(t, start, (), step), t[start::step], "[%d::%d]" % (start, step)) check (slice_tuple(t, (), end, step), t[:end:step], "[:%d:%d]" % (end, step)) check (slice_tuple(t, start, end, step), t[start:end:step], "[%d:%d:%d]" % (start, end, step)) snek-1.1/test/tuple-named.py000066400000000000000000000010701353657467200160770ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # (1,y=1) exit(0) snek-1.1/test/while-break.py000066400000000000000000000011731353657467200160620ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # i = 0 j = 0 while i < 10: i = i + 1 if i == 5: break j = j + 1 j == 4 snek-1.1/test/while-else.py000066400000000000000000000011661353657467200157300ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # i = 0 j = 0 while i < 10: i = i + 1 j = j + 1 else: j = 0 j == 0 snek-1.1/test/while.py000066400000000000000000000011471353657467200150010ustar00rootroot00000000000000# # Copyright © 2019 Keith Packard # # 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. # i = 0 j = 0 while i < 10: i = i + 1 j = j + 1 j == 10