pax_global_header00006660000000000000000000000064145725716610014530gustar00rootroot0000000000000052 comment=33bebfca37d4d8482c15b1d49e3af1142c5292e1 fangfrisch-1.9.0/000077500000000000000000000000001457257166100136515ustar00rootroot00000000000000fangfrisch-1.9.0/.github/000077500000000000000000000000001457257166100152115ustar00rootroot00000000000000fangfrisch-1.9.0/.github/workflows/000077500000000000000000000000001457257166100172465ustar00rootroot00000000000000fangfrisch-1.9.0/.github/workflows/pythonpackage.yml000066400000000000000000000030761457257166100226340ustar00rootroot00000000000000name: Python package on: [push] jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12'] steps: - uses: actions/checkout@v4 - name: Set up SQLite run: | sudo apt-get install sqlite3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | sudo apt-get install sqlite3 python -m pip install -U pip pip install -r requirements.txt - name: Lint with 'flake8' run: | pip install flake8 # Stop the build if there are Python syntax errors or undefined names flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with 'unittest' run: | mkdir -p /tmp/fangfrisch/unittest sqlite3 /tmp/fangfrisch/unittest/db.sqlite < tests/tests.sql PYTHONPATH=. python -m unittest discover tests/ -v env: NETWORK_TESTS: 0 - name: Build Python artifacts run: python -m build --no-isolation --skip-dependency-check - name: Store Python artifacts uses: actions/upload-artifact@v4 with: name: fangfrisch-Python-${{ matrix.python-version }} path: dist/*fangfrisch-1.9.0/.gitignore000066400000000000000000000001051457257166100156350ustar00rootroot00000000000000*.egg-info/ .coverage .venv* .vscode/ build/ dist/ gchamon/ htmlcov/ fangfrisch-1.9.0/CHANGELOG.rst000066400000000000000000000071261457257166100157000ustar00rootroot00000000000000========= Changelog ========= Release 1.9.0 (2024-03-08) - The logic for on_update* has been largely rewritten. As a user-visible side effect, detailed debugging information about 'on_update_*' tasks is now available. - For improved flexibility, configuration sections may now override global 'on_update_exec' and 'on_update_timeout'. Eearlier Fangfrisch versions only examined the DEFAULTS section. - Add internal default configurations for providers InterServer (https://www.interserver.net/) and Fangfrisch News (https://rseichter.github.io/fangfrisch/#ffnews). As per usual, these new providers are disabled by default. Release 1.8.1 (2024-02-21) - Python unit tests requiring network connections are now disabled by default to facilitate sandboxed testing. Set environment variable `NETWORK_TESTS=1` to enable these tests. Release 1.8.0 (2024-02-14) - Sanesecurity (https://sanesecurity.com) provider default configuration overhaul. Switch to a less congested mirror site, add/remove several signature URLs. - Modernise Python build re PEP 517 (https://peps.python.org/pep-0517/). Release 1.7.0 (2024-02-03) - Support user-defined connection timeouts. Release 1.6.1 (2023-02-21) - Require SQLAlchemy version 1.4 or higher. Version 1.3 is no longer maintained by the SQLAlchemy developers. Release 1.6.0 (2023-02-18) - Use Python context management protocol to improve SQLAlchemy session handling, in particular to more reliably release resources like database connections. Release 1.5.0 (2021-10-12) - When running external commands, Fangfrisch now catches all types of exceptions, not only those in the subprocess exception hierarchy. This allows refresh operations to continue if one of them raised an exception. Previous versions exited whenever one of the external commands failed. Release 1.4.0 (2021-02-12) - Allow the use of `url_xyz = disabled` in addition to empty values to disable URLs. - Remove `url_doppelstern*` and `url_crdfam_clamav` from Sanesecurity's provider section because the related signatures are no longer maintained and/or no longer distributed by Sanesecurity. Release 1.3.0 (2020-11-14) - URL configuration entries can be individually disabled by setting them to an empty value. - Disable discontinued "scamnailer" URL (see http://www.scamnailer.info for more information). Release 1.2.0 (2020-03-29) - In addition to console (i.e. stdout/stderr) logging, Fangfrisch now supports syslog. See the documentation for configuration options `log_method` et al for details. Release 1.1.0 (2020-03-23) If you are upgrading from a previous release, you need to either delete all existing database tables or create a new DB, followed by running `fangfrisch initdb`. - Clean up previously downloaded files when their local path changes. This can happen when `filename_xyz` entries are added or modified. Suggested by @amishmm. - When a provider section is disabled, clean up associated virus signature files. This feature can optionally be disabled using the new `cleanup` configuration parameter. Suggested by @amishmm. - Running `fangfrisch --force initdb` will attempt to drop existing tables. - Introduce the *dumpmappings* action. This allows passing URL-to-filepath mappings recorded in the database to utilities like `awk` without accessing the DB directly. Release 1.0.1 (2020-02-27) - Add two disabled data sources which are only available with a paid subscription to SecuriteInfo default configuration. Suggested by Arnaud Jacques. - Reduce default SecuriteInfo interval to one hour. Suggested by Arnaud Jacques. Release 1.0.0 (2020-02-21) - First stable release. fangfrisch-1.9.0/LICENSE000066400000000000000000001045151457257166100146640ustar00rootroot00000000000000 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 . fangfrisch-1.9.0/MANIFEST.in000066400000000000000000000000131457257166100154010ustar00rootroot00000000000000graft docs fangfrisch-1.9.0/Makefile000066400000000000000000000017111457257166100153110ustar00rootroot00000000000000# vim:ts=4:noet package = contrib/package.sh unittest = contrib/unittest.sh subdirs = docs define usage The following make targets are available: clean Cleanup build directories. dist Build distribution files. help Show this text. push Push to all configured Git remotes. pypi Upload distribution files to PyPI. schk Shell script check. stest Run sandboxed Python tests (disables network tests). test Run all Python tests and generate coverage report. endef .PHONY: subdirs $(subdirs) clean dist help pypi stest test subdirs: $(subdirs) $(subdirs): make -C $@ help: $(info $(usage)) @exit 0 clean: find tmp -type f -delete $(package) clean dist: $(package) dist pypi: @echo "# Run this command to upload:\n$(package) pypi" stest: env NETWORK_TESTS=0 $(unittest) test: env NETWORK_TESTS=1 $(unittest) coverage push: for _r in $(shell git remote); do git push $$_r; done; unset _r schk: shellcheck -x contrib/*.sh fangfrisch-1.9.0/README.rst000066400000000000000000000013021457257166100153340ustar00rootroot00000000000000========== Fangfrisch ========== Copyright © 2020-2024 Ralph Seichter Fangfrisch (German for "freshly caught") is a sibling of the `Clam Anti-Virus`_ freshclam utility. It allows downloading virus definition files that are not official ClamAV canon, e.g. from Sanesecurity_, URLhaus_ and others. Fangfrisch was designed with security in mind, to be run by an unprivileged user only. Detailed documentation_ is available online. .. image:: https://github.com/rseichter/fangfrisch/workflows/Python%20package/badge.svg .. _documentation: https://rseichter.github.io/fangfrisch/ .. _Clam Anti-Virus: https://www.clamav.net .. _Sanesecurity: https://sanesecurity.com .. _URLhaus: https://urlhaus.abuse.ch fangfrisch-1.9.0/contrib/000077500000000000000000000000001457257166100153115ustar00rootroot00000000000000fangfrisch-1.9.0/contrib/fangfrisch-has-news.sh000077500000000000000000000032071457257166100215070ustar00rootroot00000000000000#!/usr/bin/env bash # vim: ts=4 sw=4 noet ft=sh # # Example script to process Fangfrisch News. declare -r MAILFROM="noreply" declare -r MAILTO="alice@example.com" declare -r SUBJECT="Fangfrisch News are available" # Option 1: Mutt #declare -r MAILAPP="mutt" #declare -r MAILAPP_OPT=( "-s" "$SUBJECT" "$MAILTO" ) # Option 2: sendmail #declare -r MAILAPP="sendmail" #declare -r MAILAPP_OPT=( "-t" ) #export PATH="$PATH:/usr/sbin" # Option 3: swaks declare -r MAILAPP="swaks" declare -r MAILAPP_OPT=( "-d" "-" "-f" "$MAILFROM" "-t" "$MAILTO" ) ### No changes required below this line ### set -euo pipefail die() { echo >&2 "$@" exit 1 } usage() { die "Usage: $(basename "$0") {directory}" } gen_header() { cat < To: $MAILTO Subject: $SUBJECT EOT # Mail header must end with an empty line! } declare -a NEWSITEMS=() report_news() { local dir=$1 ni [ -d "$dir" ] || die "$dir is not a directory" while IFS= read -r -d '' ni; do if [ ${#NEWSITEMS[*]} -eq 0 ] && [ "$MAILAPP" != mutt ]; then # Mutt does not need the header, others do. gen_header fi NEWSITEMS+=( "$ni" ) echo -e "\n### $(basename "$ni"):\n" cat "$ni" done < <(find "$dir" -maxdepth 1 -type f -name "fangfrisch*.txt" -print0) } main() { local t if tty -s; then # Running in a terminal session t=$(mktemp) # shellcheck disable=SC2064 trap "rm $t" EXIT report_news "$@" | tee "$t" || exit 1 [ ! -s "$t" ] || "$MAILAPP" "${MAILAPP_OPT[@]}" >/dev/null <"$t" else report_news "$@" 2>&1 | "$MAILAPP" "${MAILAPP_OPT[@]}" >/dev/null [ ${#NEWSITEMS[*]} -eq 0 ] || rm -v "${NEWSITEMS[@]}" fi } [ $# -ge 1 ] || usage main "$@" fangfrisch-1.9.0/contrib/initdb.sql000066400000000000000000000002211457257166100172760ustar00rootroot00000000000000PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; CREATE TABLE refreshlog ( url VARCHAR(255) PRIMARY KEY, digest VARCHAR(255), updated TIME ); COMMIT; fangfrisch-1.9.0/contrib/package.sh000077500000000000000000000021241457257166100172420ustar00rootroot00000000000000#!/usr/bin/env bash # vim: ts=4 sw=4 noet # # Script to package fangfrisch for distribution and to handle PyPI uploads. # You need Python modules 'wheel' and 'twine' to publish to PyPI, and # Ruby Gems 'asciidoctor' and 'asciidoctor-pdf' to generate HTML/PDF # documentation. set -euo pipefail function usage() { local bn bn="$(basename "$0")" echo "Usage: ${bn} {clean | dist | pypi}" >&2 echo " ${bn} setver {version}" >&2 exit 1 } function do_clean() { /bin/rm -r build/* dist/* || true } function do_dist() { python -m build --no-isolation --skip-dependency-check } function do_pypi() { twine upload dist/* } function do_setver() { [ $# -gt 0 ] || usage local sed="/usr/bin/sed -E" ${sed} -i "" -e "s/^v[^ ]+ {docdate}$/v${1}, {docdate}/" docs/fangfrisch.adoc ${sed} -i "" -e "s/^__version.+/__version__ = '${1}'/" fangfrisch/__init__.py ${sed} -i "" -e "s/^version.+/version = ${1}/" setup.cfg } [ $# -gt 0 ] || usage arg="${1}" shift case "${arg}" in clean) do_"${arg}" ;; dist|setver|pypi) . .venv/bin/activate do_"${arg}" "$@" ;; *) usage ;; esac unset arg fangfrisch-1.9.0/contrib/unittest.sh000077500000000000000000000017441457257166100175350ustar00rootroot00000000000000#!/usr/bin/env bash # vim:ts=4:noet # # Runs unittests for Fangfrisch. Example usage: # # (1) unittest.sh # Run all unittests without collecting coverage data. # # (2) unittest.sh coverage # Run all unittests and collect coverage data. This will also # generate a HTML-based coverage report. set -euo pipefail source .venv/bin/activate DIR='/tmp/fangfrisch/unittest' DB="$DIR/db.sqlite" if [ -d $DIR ]; then rm -r $DIR fi mkdir -p $DIR sqlite3 $DB < tests/tests.sql CONF='tests/tests.conf' sed -i'' -e "s,^db_url.*,db_url = sqlite:///${DB}," $CONF function usage() { echo "Usage: $(basename "$0") [coverage]" >&2 exit 1 } function run_tests() { local cmd="$1" shift PYTHONPATH=. ${cmd} -m unittest discover tests/ -v "$@" } function run_coverage() { run_tests 'coverage run --source fangfrisch --omit fangfrisch/__main__.py' coverage html --rcfile=tests/coverage.rc } if [ $# -gt 0 ]; then if [ "$1" = "coverage" ]; then run_coverage else usage fi else run_tests python fi fangfrisch-1.9.0/docs/000077500000000000000000000000001457257166100146015ustar00rootroot00000000000000fangfrisch-1.9.0/docs/Makefile000066400000000000000000000013401457257166100162370ustar00rootroot00000000000000# vim: ts=4 sw=4 noet adoc_opts = -o $@ cf_combined = combined.conf cf_example = example.conf cf_internal = internal.conf fangfrisch = ../local/fangfrisch out_html = index.html out_pdf = fangfrisch.pdf sources = fangfrisch.adoc $(cf_combined) $(cf_example) $(cf_internal) ../contrib/fangfrisch-has-news.sh usage.txt .PHONY: all clean force all: $(out_html) $(out_pdf) $(cf_combined): $(cf_example) $(fangfrisch) -c $< dumpconf > $@ $(cf_internal): $(fangfrisch) -c /dev/null dumpconf > $@ $(out_html): $(sources) asciidoctor -a toc=right $(adoc_opts) $< $(out_pdf): $(sources) asciidoctor-pdf -a toc=preamble $(adoc_opts) $< clean: /bin/rm $(out_html) $(out_pdf) || true force: rm -f $(cf_combined) $(cf_internal) make fangfrisch-1.9.0/docs/combined.conf000066400000000000000000000104371457257166100172350ustar00rootroot00000000000000[DEFAULT] cleanup = automatic enabled = false integrity_check = sha256 log_level = WARNING log_method = console max_size = 5MB db_url = sqlite:////var/lib/fangfrisch/db.sqlite local_directory = /var/lib/clamav on_update_exec = clamdscan --reload on_update_timeout = 42 [fangfrischnews] interval = 12h local_directory = /tmp max_size = 100KB script = /path/to/fangfrisch-has-news.sh on_update_exec = [ ! -x ${script} ] || ${script} ${local_directory} prefix = https://www.seichter.de/fangfrisch/ url_alerts = ${prefix}fangfrisch_alerts.txt url_news = ${prefix}fangfrisch_news.txt [interserver] interval = 1h integrity_check = disabled max_size = 5MB prefix = http://sigs.interserver.net/ !url_shell_hdb = ${prefix}shell.hdb !url_shellb_db = ${prefix}shellb.db url_interserver256 = ${prefix}interserver256.hdb url_shell_ldb = ${prefix}shell.ldb filename_shell_ldb = interservershell.ldb url_topline = ${prefix}interservertopline.db url_whitelist_fp = ${prefix}whitelist.fp filename_whitelist_fp = interserverwhitelist.fp enabled = yes [malwarepatrol] interval = 1d integrity_check = disabled product = 8 receipt = abcd1234 prefix = https://lists.malwarepatrol.net/cgi/getfile?product=${product}&receipt=${receipt}&list= url_clamav_basic = ${prefix}clamav_basic filename_clamav_basic = malwarepatrol.db enabled = yes [sanesecurity] interval = 1h prefix = https://mirror.rollernet.us/sanesecurity/ !url_foxhole_all_cdb = ${prefix}foxhole_all.cdb !url_foxhole_all_ndb = ${prefix}foxhole_all.ndb !url_foxhole_links = ${prefix}foxhole_links.ldb !url_foxhole_mail = ${prefix}foxhole_mail.cdb !url_winnow_phish_complete = ${prefix}winnow_phish_complete.ndb url_badmacro = ${prefix}badmacro.ndb url_blurl = ${prefix}blurl.ndb url_bofhland_cracked_url = ${prefix}bofhland_cracked_URL.ndb url_bofhland_malware_attach = ${prefix}bofhland_malware_attach.hdb url_bofhland_malware_url = ${prefix}bofhland_malware_URL.ndb url_bofhland_phishing_url = ${prefix}bofhland_phishing_URL.ndb url_foxhole_filename = ${prefix}foxhole_filename.cdb url_foxhole_generic = ${prefix}foxhole_generic.cdb url_foxhole_js_cdb = ${prefix}foxhole_js.cdb url_foxhole_js_ndb = ${prefix}foxhole_js.ndb url_hackingteam = ${prefix}hackingteam.hsb url_junk = ${prefix}junk.ndb url_jurlbl = ${prefix}jurlbl.ndb url_jurlbla = ${prefix}jurlbla.ndb url_lott = ${prefix}lott.ndb url_malwareexpert_fp = ${prefix}malware.expert.fp url_malwareexpert_hdb = ${prefix}malware.expert.hdb url_malwareexpert_ldb = ${prefix}malware.expert.ldb url_malwareexpert_ndb = ${prefix}malware.expert.ndb url_malwarehash = ${prefix}malwarehash.hsb url_phish = ${prefix}phish.ndb url_phishtank = ${prefix}phishtank.ndb url_porcupine = ${prefix}porcupine.ndb url_rogue = ${prefix}rogue.hdb url_scam = ${prefix}scam.ndb url_shelter = ${prefix}shelter.ldb url_sigwhitelist = ${prefix}sigwhitelist.ign2 url_spamattach = ${prefix}spamattach.hdb url_spamimg = ${prefix}spamimg.hdb url_spear = ${prefix}spear.ndb url_spearl = ${prefix}spearl.ndb url_ssftm = ${prefix}sanesecurity.ftm url_winnow_attachments = ${prefix}winnow.attachments.hdb url_winnow_bad_cw = ${prefix}winnow_bad_cw.hdb url_winnow_extended_malware = ${prefix}winnow_extended_malware.hdb url_winnow_extended_malware_links = ${prefix}winnow_extended_malware_links.ndb url_winnow_malware = ${prefix}winnow_malware.hdb url_winnow_malware_links = ${prefix}winnow_malware_links.ndb url_winnow_phish_complete_url = ${prefix}winnow_phish_complete_url.ndb url_winnow_spam_complete = ${prefix}winnow_spam_complete.ndb enabled = yes [securiteinfo] customer_id = abcdef123456 interval = 1h max_size = 20MB prefix = https://www.securiteinfo.com/get/signatures/${customer_id}/ !url_0hour = ${prefix}securiteinfo0hour.hdb !url_old = ${prefix}securiteinfoold.hdb !url_securiteinfo_mdb = ${prefix}securiteinfo.mdb !url_securiteinfo_pdb = ${prefix}securiteinfo.pdb !url_securiteinfo_yara = ${prefix}securiteinfo.yara url_android = ${prefix}securiteinfoandroid.hdb url_ascii = ${prefix}securiteinfoascii.hdb url_html = ${prefix}securiteinfohtml.hdb url_javascript = ${prefix}javascript.ndb url_pdf = ${prefix}securiteinfopdf.hdb url_securiteinfo = ${prefix}securiteinfo.hdb url_securiteinfo_ign2 = ${prefix}securiteinfo.ign2 url_spam_marketing = ${prefix}spam_marketing.ndb enabled = yes [urlhaus] interval = 10m url_urlhaus = https://urlhaus.abuse.ch/downloads/urlhaus.ndb enabled = yes max_size = 2MB fangfrisch-1.9.0/docs/example.conf000066400000000000000000000012721457257166100171050ustar00rootroot00000000000000# Example configuration [DEFAULT] db_url = sqlite:////var/lib/fangfrisch/db.sqlite # The following settings are optional. Other sections inherit # values from DEFAULT and may also overwrite values. local_directory = /var/lib/clamav max_size = 5MB on_update_exec = clamdscan --reload on_update_timeout = 42 [interserver] enabled = yes [malwarepatrol] enabled = yes # Replace with your personal Malwarepatrol receipt receipt = abcd1234 [sanesecurity] enabled = yes # Use a non-default mirror prefix = https://mirror.rollernet.us/sanesecurity/ [securiteinfo] enabled = yes # Replace with your personal SecuriteInfo customer ID customer_id = abcdef123456 [urlhaus] enabled = yes max_size = 2MB fangfrisch-1.9.0/docs/fangfrisch.adoc000066400000000000000000000445701457257166100175550ustar00rootroot00000000000000# Fangfrisch Ralph Seichter v1.9.0, {docdate} :copyright: © 2020-2024 Ralph Seichter :encoding: UTF-8 :hyphens: en :lang: en :keywords: antivirus, clamav, fangfrisch, freshclam, refresh, update :media: screen :!pagenums: :pdf-version: 1.7 :sectanchors: :sectnums: :subject: Update and verify unofficial Clam Anti-Virus signatures :xrefstyle: short Fangfrisch (German for "freshly caught") is a sibling of the https://www.clamav.net[Clam Anti-Virus] freshclam utility. It allows downloading virus definition files that are not official ClamAV canon, e.g. from https://sanesecurity.com[Sanesecurity] and https://urlhaus.abuse.ch[URLhaus]. Fangfrisch was designed with security in mind, to be run by an unprivileged user only. For those curious about the development history, a https://github.com/rseichter/fangfrisch/blob/master/CHANGELOG.rst[changelog] is available online. == License Copyright {copyright} This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . == Update strategy Fangfrisch is expected to run periodically, e.g. using https://en.wikipedia.org/wiki/Cron[cron]. Fangfrisch will attempt to download digests first (if available upstream), and only retrieve corresponding signature files when their recorded digest changes, minimising transfer volumes. I recommend running Fangfrisch at 10 minute intervals. There is no need to worry about overburdening your machine, the network or remote signature providers. Each individual download is recorded in the database, and whenever Fangfrisch is run, it checks those recorded timestamps against the preconfigured provider intervals. No network connections are made for downloaded signature files which are considered "too young to update". Imagine a provider interval setting of 45 minutes. Even if launched every 10 minutes, Fangfrisch will not attempt to download related signature files before 45 minutes have passed since the last recorded successful download. Provider intervals are set to reasonable defaults internally, but you can override them if necessary. == Installation Fangfrisch requires Python 3.7 or newer. Python 3.6 security support, i.e. its final lifecycle stage, was terminated in 2021 by the Python authors. Please do not ask me to modify Fangfrisch in order to support ancient Python versions, which pose a potential security risk to you. The recommended installation method is using the https://packaging.python.org/tutorials/installing-packages/[pip command] in a virtual Python environment. Here is an example listing of commands for BASH, to be executed as root, assuming that you will be running Fangfrisch as an unprivileged user who is member of the *clamav* group: === Create home directory ---- mkdir -m 0770 -p /var/lib/fangfrisch chgrp clamav /var/lib/fangfrisch ---- This will grant group members the necessary write access to create the database (see <>). === Prepare and activate venv ---- cd /var/lib/fangfrisch python3 -m venv venv source venv/bin/activate ---- === Install via https://pypi.org/project/fangfrisch/[PyPI] ---- pip install fangfrisch ---- This step will also create an executable launcher script `venv/bin/fangfrisch`. == Installation packages As an alternative to pip-based installation, there are packages available for the following Linux distributions: * Arch Linux: https://aur.archlinux.org/packages/python-fangfrisch/[packages/python-fangfrisch]. Support contact: Arch package maintainer. * Clear Linux: https://github.com/clearlinux-pkgs/fangfrisch[clearlinux-pkgs/fangfrisch]. Support contact: Clear Linux package maintainers. * Debian Linux: https://packages.debian.org/sid/fangfrisch[fangfrisch (utils)]. Support contact: Debian package maintainers. * Gentoo Linux: https://packages.gentoo.org/packages/app-antivirus/fangfrisch[app-antivirus/fangfrisch]. Support contact: Gentoo package maintainers. == Configuration A configuration file is mandatory, uses an INI-File-like structure and must contain a `db_url` entry. All other settings are optional. However, unless you enable one signature file provider section, Fangfrisch naturally won't do much. Use the `--conf` command line argument (see <>) to specify the path to your configuration file. Note that there is no default location. ---- # Minimal example configuration, meant for testing. [DEFAULT] db_url = sqlite:////var/lib/fangfrisch/db.sqlite local_directory = /var/lib/clamav [urlhaus] enabled = yes ---- * *cleanup*: Cleanup method used for provider sections. Default: `automatic`, alternative: `disabled`. In automatic mode, Fangfrisch will attempt to delete obsolete virus definition files whenever you disable a provider section. Should you disable this option, orphaned files will be left behind, and you need to ensure cleanup by different means. * *connection_timeout*: Timeout in seconds, used when establishing network connections to download signature files. Default: `30`. Be aware that longer timeouts increase the risk of multiple Fangfrisch instances running concurrently. This could, in turn, cause database access problems, and network socket congestion. If your Internet connection is fast, I even suggest testing timeout values lower than the default 30 seconds. * *db_url*: Database URL in https://docs.sqlalchemy.org/en/13/core/engines.html#supported-databases[SQLAlchemy syntax]. Mandatory, no default. Typically, a local https://www.sqlite.org[SQLite] database will suffice. * *enabled*: Scan this section for URLs? Default: `false`. * *integrity_check*: Mechanism for integrity checks. Default: `sha256`. You can use `disabled` if the signature file provider offers no checksums. * *interval*: Interval between downloads. Defaults are provider-dependent. Values can be expressed in human-readable form (e.g. `12h` or `45m`). Please respect the limits set by each provider. * *local_directory*: Downloaded files are stored here. No default, so the current working directory of the Python process is used. As this can vary depending on how you launch Fangfrisch, it is highly recommended to define an absolute path like `/var/lib/clamav` instead. You can override this option in provider sections to separate downloads based on origin. * *log_format*: See https://docs.python.org/3/library/logging.html#logging.Formatter[Formatter class] documentation for details. Fangfrisch uses sensible defaults depending on the selected log method. * *log_level*: Choose one of `DEBUG`, `INFO`, `WARNING` (default), `ERROR` or `FATAL`. * *log_method*: Either `console` (default, meaning stdout/stderr) or `syslog`. For the latter, you can also specify a *log_target*. * *log_target*: The https://tools.ietf.org/html/rfc5424[syslog] target address. Typical values are `/dev/log` (local Linux domain socket), `localhost` or `host.domain.tld:udpport`. If no target is specified, `localhost` is assumed. The UDP port number defaults to 514. * *max_size*: Maximum expected file size. The default is `10MB`, but all predefined providers have individual size limits (see <>). Values are can be expressed in human-readable form (e.g. `250KB` or `3MB`). Fangfrisch attempts to inspect the content length before downloading virus signature files so as not to download files larger than the defined limit. If providers don't respond with content length information, Fangfrisch will log a warning but download the data anyway. * *on_update_exec*: If any files were downloaded during a pass, a command can be executed in after the pass finishes. No default. A typical value is `clamdscan --reload`. Starting with Fangfrisch 1.9.0, this option may be overridden in individual sections, permitting per-provider actions. * *on_update_timeout*: Timeout for the `on_update_exec` command, in seconds. Default: 30. This option may also be overridden in individual sections. See https://docs.python.org/3.7/library/configparser.html[here] for details about the configuration parser and extended interpolation. <> provides additional information on how configuration options are interpreted. === Default providers Fangfrisch contains internal defaults for the following providers, listed in alphabetical order: * http://sigs.interserver.net/[InterServer] * https://www.malwarepatrol.net[Malwarepatrol] * https://sanesecurity.com[Sanesecurity] * https://www.securiteinfo.com/services/anti-spam-anti-virus/improve-detection-rate-of-zero-day-malwares-for-clamav.shtml[SecuriteInfo] * https://urlhaus.abuse.ch[URLhaus] I have also included "Fangfrisch News" (see <>). Providers can be enabled by specifiying `enabled = yes` in the desired configuration file sections. IMPORTANT: Please make sure to examine the respective settings for yourself before enabling providers. The defaults may not suit your personal preferences, and some providers require additional configuration, e.g. an access token. ---- include::example.conf[] ---- === User-defined providers Fangfrisch is of course not limited to the internal defaults. You can define as many additional virus definition providers as you like. The following defines a fictional provider: ---- [fictionalprovider] enabled = yes integrity_check = md5 interval = 90m prefix = http://fictional-provider.tld/clamav-unofficial/ # Reference the defined prefix in URL definitions. Values in # other sections can be referenced using ${section:option}. url_eggs = ${prefix}eggs.ndb url_spam = ${prefix}spam.hdb # Override local file name for url_spam filename_spam = spam_spam_spam_lovely_spam.db # Execute command after each fresh download from url_eggs on_update_eggs = echo Fresh eggs in {path} ---- === Semantics Fangfrisch will scan enabled sections for lines prefixed with `url_` to determine download sources for virus definition files. * The value of `integrity_check` determines both the expected filename suffix for digests and the hashing mechanism used for verification. * Local file names will be determined by parsing URLs, but can be manually overridden. To change the file name for `url_xyz`, set `filename_xyz` to the desired value. * To launch a command after data was downloaded for `url_xyz`, define `on_update_xyz`. The command string may contain a `{path}` placeholder, which will be substituted with the full path of the downloaded file. You can disable refresh operations for selected URLs by assigning either an empty value or setting it to `url_xyz = disabled`. Note that disabling URLs in this manner does _not_ delete any previously downloaded files. === Proxy support Fangfrisch relies on the _requests_ library to download files, which supports environment variables like `HTTPS_PROXY`. Please refer to https://requests.readthedocs.io/en/latest/user/advanced/#proxies[section Advanced Usage, subsection Proxies] in the _requests_ online documentation for details. [[dbsetup]] == Preparing the database After completing the configuration, make sure to create the database structure by running the `initdb` command in a root shell as shown below. Running `--force initdb` will drop existing database tables. For SQLite, deleting the database file is a viable alternative. ---- sudo -u clamav -- fangfrisch --conf /etc/fangfrisch.conf initdb ---- IMPORTANT: Fangfrisch need never be run as root. Choose an unprivileged user instead (typically *clamav*). [[usage]] == Usage You can display command line arguments as follows: ---- $ fangfrisch --help include::usage.txt[] ---- You can choose among following actions: * *dumpconf*: Dump the effective configuration to stdout, combining both internal defaults and your own settings. The effective configuration for the example shown in <> is available in <>. * *dumpmappings*: Dump URL-to-filepath mappings, as recorded in the database refresh log, to stdout. See <> for details. * *initdb*: Create the database structure. This needs to be run only once, before the first refresh. Using the `--force` option will drop existing tables from the database. * *refresh*: Refresh the configured URLs. The `--force` option can be used to override download interval settings. As stated before, Fangfrisch is typically run using cron. Depending on your host OS, you may use a systemd timer as an alternative. An example crontab looks like this: ---- HOME=/var/lib/fangfrisch LOG_LEVEL=INFO # minute hour day-of-month month day-of-week user command */10 * * * * clamav sleep $((RANDOM \% 42)); venv/bin/fangfrisch --conf /etc/fangfrisch.conf refresh ---- == Support The project is hosted on https://github.com/rseichter/fangfrisch[GitHub]. Before opening tickets or contacting the author, _always_ check https://github.com/rseichter/fangfrisch/issues[existing issues] first, including closed ones. This is not meant to discourage you; it just saves time and effort for all involved. Please contact the author mailto:{email}[{author}] only after having done your "research". Thank you. === Reporting possible problems If you experience problems, please start by trying to figure out underlying issues on your own. Running with DEBUG level logging helps with that. Should your efforts fail, consider filing a GitHub issue. Each issue needs to answer the questions listed below. If you answer question number 1, 2 or 3 with "no", do not file an issue. Please answer all other questions as detailed as you can, within reason. 1. Have you checked the documentation? 2. Have you checked all existing issues, including closed ones? 3. Have you done your personal best to resolve the issue on your own? 4. What exactly did you do? 5. What did you expect to happen? 6. What happened instead? 7. What was your exact setup (operating system, Python core version, Python module versions)? === Offering suggestions The list of questions is shorter, but important nonetheless: 1. Have you checked the documentation? 2. Have you checked all existing issues, including closed ones? 3. Do you consider the suggested feature helpful for more people than just yourself? If you answered "yes" for all questions, please explain your idea in a sufficiently thorough manner. Use examples, graphics, and whatever else you think would help others to understand your suggestion. === Discussion precedes contribution I do not accept any code or documentation contributions which have not been previously agreed upon. This means the order of steps is as follows: 1. Open an issue or discussion topic first. 2. Have a conversation about the matter at hand. 3. Reach a consensus about both form and content of the contribution. 4. Wait for a yay/nay signal from me. Please do _not_ submit any pull requests before I ask for them, as they will be closed. This outlined, proven practice will save time for all involved. See Heather McNamee's blog https://about.gitlab.com/blog/2016/03/03/start-with-an-issue/[Always start with an issue] for more information. [[internalconf]] [appendix] == Default configuration Fangfrisch contains the following internal configuration settings as defaults. As a safety measure, all sections are disabled by default. Entries with the `!url_` prefix are included for reference only. These represent data sources which are not recommended for general use. Possible reasons: Some sources have an elevated risk of false positives, are not free to use, or contain legacy data. Enabling a section will not enable these specially prefixed entries. ---- include::internal.conf[] ---- [[sampleeff]] [appendix] == Effective configuration The following effective configuration is the result of combining internal defaults (see <>) with the example settings shown in <>. ---- include::combined.conf[] ---- [[ffnews]] [appendix] == Fangfrisch News This pseudo provider does not offer antivirus signature files. It is only meant for me to pass news about Fangfrisch to you, the user, in lieu of a mailing list. Don't expect this to happen on a regular basis. I am only thinking about release notifications at this point in time. Still, I kindly ask you to please enable this service by adding the following to your configuration file: ---- [fangfrischnews] enabled = yes # Uncomment/adapt the following to trigger a script in case of news. # script = /path/to/script/fangfrisch-has-news.sh ---- This will only enable Fangfrisch to occasionally download small text files, nothing more. You will not need to read the content, nor will anything else happen, unless you modify the `script` option. Here is an example script which you could use to have downloaded news items mailed to you. It needs to be readable for the user account running Fangfrisch, and the sender/recipient addresses obviously have to be adapted. For your convenience, the latest version of the script can be https://raw.githubusercontent.com/rseichter/fangfrisch/master/contrib/fangfrisch-has-news.sh[downloaded here]. ---- include::../contrib/fangfrisch-has-news.sh[] ---- [[dbstructure]] [appendix] == Database structure While users can technically access the Fangfrisch backend database directly, its structure and content are considered *private*. They may change at any time, without notice. === Accessing mappings In contrast to direct database access, the *dumpmappings* action allows accessing selected parts of database entries in a stable manner. Specifically, it returns 3-tuples (provider name, URL, local file path). Elements are separated by horizontal tabulators to facilitate piping the output into `awk` or similar utilities. If specified, the `provider` option is interpreted as a regular expression, and only DB records with matching provider column are returned. That means if you have providers _foo_ and _foobar_, you need to use anchoring (e.g. `^foo$`) if you only wish to match entries for the former provider. Make sure to use quoting as required by your shell. Example usage: ---- # Print all recorded mappings for the [example] provider section. fangfrisch --conf /etc/fangfrisch.conf --provider '^example$' dumpmappings ---- ---- # Delete all files that were downloaded by Fangfrisch. # DON'T EXECUTE THIS UNLESS YOU REALLY MEAN IT! fangfrisch --conf /etc/fangfrisch.conf dumpmappings | awk '{print $3}' | xargs /bin/rm ---- fangfrisch-1.9.0/docs/fangfrisch.pdf000066400000000000000000010176601457257166100174210ustar00rootroot00000000000000%PDF-1.7 % 1 0 obj << /Title (Fangfrisch) /Author (Ralph Seichter) /Subject (Update and verify unofficial Clam Anti-Virus signatures) /Keywords (antivirus, clamav, fangfrisch, freshclam, refresh, update) /Creator (Asciidoctor PDF 2.3.11, based on Prawn 2.4.0) /Producer (Ralph Seichter) /ModDate (D:20240308121407+01'00') /CreationDate (D:20240308121411+01'00') >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R /Names 15 0 R /Outlines 158 0 R /PageLabels 184 0 R /PageMode /UseOutlines /OpenAction [7 0 R /FitH 841.89] /ViewerPreferences << /DisplayDocTitle true >> >> endobj 3 0 obj << /Type /Pages /Count 17 /Kids [7 0 R 18 0 R 28 0 R 40 0 R 49 0 R 58 0 R 63 0 R 72 0 R 80 0 R 86 0 R 88 0 R 92 0 R 95 0 R 97 0 R 103 0 R 105 0 R 109 0 R] >> endobj 4 0 obj << /Length 2 >> stream q endstream endobj 5 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 4 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] >> >> endobj 6 0 obj << /Length 21724 >> stream q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 225.19953 777.054 Td /F2.0 27 Tf [<46> 40.03906 <616e67667269736368>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.36377 Tw BT 48.24 743.55743 Td /F1.0 13 Tf [<46> 40.03906 <616e6766726973636820284765726d616e20666f72202266726573686c792063617567687422292069732061207369626c696e67206f662074686520>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 3.36377 Tw BT 445.29223 743.55743 Td /F1.0 13 Tf <436c616d20416e74692d5669727573> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.36377 Tw BT 547.04 743.55743 Td ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.23882 Tw BT 48.24 724.02029 Td /F1.0 13 Tf [<6672657368636c616d207574696c697479> 89.84375 <2e20497420616c6c6f777320646f776e6c6f6164696e6720766972757320646566696e6974696f6e2066696c6573207468617420617265206e6f74206f6666696369616c>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.31739 Tw BT 48.24 704.48314 Td /F1.0 13 Tf [<436c616d41> 80.07812 <562063616e6f6e2c20652e672e2066726f6d20>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 2.31739 Tw BT 211.80555 704.48314 Td /F1.0 13 Tf <53616e657365637572697479> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.31739 Tw BT 291.14455 704.48314 Td /F1.0 13 Tf <20616e6420> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 2.31739 Tw BT 326.17333 704.48314 Td /F1.0 13 Tf <55524c68617573> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.31739 Tw BT 381.74833 704.48314 Td /F1.0 13 Tf [<2e2046> 40.03906 <616e67667269736368207761732064657369676e6564>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.60462 Tw BT 48.24 684.946 Td /F1.0 13 Tf [<7769746820736563757269747920696e206d696e642c20746f2062652072756e2062> 20.01953 <7920616e20756e70726976696c656765642075736572206f6e6c79> 89.84375 <2e2046> 40.03906 <6f722074686f736520637572696f7573>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 665.40886 Td /F1.0 13 Tf [<61626f75742074686520646576656c6f706d656e7420686973746f7279> 89.84375 <2c206120>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 254.70803 665.40886 Td /F1.0 13 Tf <6368616e67656c6f67> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 317.51103 665.40886 Td /F1.0 13 Tf <20697320617661696c61626c65206f6e6c696e652e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 137.82829 Td /F2.0 22 Tf <312e204c6963656e7365> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 108.64029 Td /F1.0 10.5 Tf [<436f70> 20.01953 <79726967687420a920323032302d323032342052616c7068205365696368746572>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 80.86029 Td /F1.0 10.5 Tf [<546869732066696c652069732070617274206f66202246> 40.03906 <616e67667269736368> 40.03906 <222e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.5309 Tw BT 48.24 53.08029 Td /F1.0 10.5 Tf [<46> 40.03906 <616e67667269736368206973206672656520736f6674776172653a20796f752063616e2072656469737472696275746520697420616e642f6f72206d6f6469667920697420756e64657220746865207465726d73206f662074686520474e55>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 620.38829 Td /F2.0 22 Tf [<54> 29.78516 <61626c65206f6620436f6e74656e7473>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 48.24 589.85029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 589.85029 Td /F1.0 10.5 Tf <312e204c6963656e7365> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 102.24162 589.85029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 589.85029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 589.85029 Td /F1.0 10.5 Tf <31> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 48.24 571.37029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 571.37029 Td /F1.0 10.5 Tf [<322e2055706461746520737472> 20.01953 <6174656779>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 139.65312 571.37029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 571.37029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 571.37029 Td /F1.0 10.5 Tf <32> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 48.24 552.89029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 552.89029 Td /F1.0 10.5 Tf <332e20496e7374616c6c6174696f6e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 118.27512 552.89029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 552.89029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 552.89029 Td /F1.0 10.5 Tf <32> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 60.24 534.41029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 534.41029 Td /F1.0 10.5 Tf <332e312e2043726561746520686f6d65206469726563746f7279> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 193.09812 534.41029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 534.41029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 534.41029 Td /F1.0 10.5 Tf <32> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 60.24 515.93029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 515.93029 Td /F1.0 10.5 Tf <332e322e205072657061726520616e642061637469766174652076656e76> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 214.47612 515.93029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 515.93029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 515.93029 Td /F1.0 10.5 Tf <33> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 60.24 497.45029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 497.45029 Td /F1.0 10.5 Tf <332e332e20496e7374616c6c2076696120> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 132.186 497.45029 Td /F1.0 10.5 Tf <50795049> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 155.68662 497.45029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 497.45029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 497.45029 Td /F1.0 10.5 Tf <33> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 48.24 478.97029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 478.97029 Td /F1.0 10.5 Tf <342e20496e7374616c6c6174696f6e207061636b61676573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 166.37562 478.97029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 478.97029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 478.97029 Td /F1.0 10.5 Tf <33> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 48.24 460.49029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 460.49029 Td /F1.0 10.5 Tf [<352e20436f6e6669677572> 20.01953 <6174696f6e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 128.96412 460.49029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 460.49029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 460.49029 Td /F1.0 10.5 Tf <33> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 60.24 442.01029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 442.01029 Td /F1.0 10.5 Tf <352e312e2044656661756c742070726f766964657273> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 171.72012 442.01029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 442.01029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 442.01029 Td /F1.0 10.5 Tf <35> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 60.24 423.53029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 423.53029 Td /F1.0 10.5 Tf <352e322e20557365722d646566696e65642070726f766964657273> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 198.44262 423.53029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 423.53029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 423.53029 Td /F1.0 10.5 Tf <36> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 60.24 405.05029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 405.05029 Td /F1.0 10.5 Tf <352e332e2053656d616e74696373> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 134.30862 405.05029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 405.05029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 405.05029 Td /F1.0 10.5 Tf <36> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 60.24 386.57029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 386.57029 Td /F1.0 10.5 Tf <352e342e2050726f787920737570706f7274> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 155.68662 386.57029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 386.57029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 386.57029 Td /F1.0 10.5 Tf <37> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 48.24 368.09029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 368.09029 Td /F1.0 10.5 Tf <362e20507265706172696e6720746865206461746162617365> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 177.06462 368.09029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 368.09029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 368.09029 Td /F1.0 10.5 Tf <37> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 48.24 349.61029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 349.61029 Td /F1.0 10.5 Tf <372e205573616765> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 91.55262 349.61029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 349.61029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 349.61029 Td /F1.0 10.5 Tf <37> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 48.24 331.13029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 331.13029 Td /F1.0 10.5 Tf <382e20537570706f7274> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 102.24162 331.13029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 331.13029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 331.13029 Td /F1.0 10.5 Tf <38> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 60.24 312.65029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 312.65029 Td /F1.0 10.5 Tf <382e312e205265706f7274696e6720706f737369626c652070726f626c656d73> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 225.16512 312.65029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 312.65029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 312.65029 Td /F1.0 10.5 Tf <38> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 60.24 294.17029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 294.17029 Td /F1.0 10.5 Tf <382e322e204f66666572696e672073756767657374696f6e73> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 182.40912 294.17029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 294.17029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 294.17029 Td /F1.0 10.5 Tf <38> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 60.24 275.69029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 275.69029 Td /F1.0 10.5 Tf <382e332e2044697363757373696f6e20707265636564657320636f6e747269627574696f6e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 246.54312 275.69029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 275.69029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 275.69029 Td /F1.0 10.5 Tf <39> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 48.24 257.21029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 257.21029 Td /F1.0 10.5 Tf [<417070656e64697820413a2044656661756c7420636f6e6669677572> 20.01953 <6174696f6e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 225.16512 257.21029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 540.49062 257.21029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 541.1705 257.21029 Td /F1.0 10.5 Tf <39> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 48.24 238.73029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 238.73029 Td /F1.0 10.5 Tf [<417070656e64697820423a2045666665637469766520636f6e6669677572> 20.01953 <6174696f6e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 229.98462 238.73029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 534.62112 238.73029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 535.301 238.73029 Td /F1.0 10.5 Tf <3131> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 48.24 220.25029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 220.25029 Td /F1.0 10.5 Tf [<417070656e64697820433a2046> 40.03906 <616e67667269736368204e657773>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 197.91762 220.25029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 534.62112 220.25029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 535.301 220.25029 Td /F1.0 10.5 Tf <3134> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 48.24 201.77029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 201.77029 Td /F1.0 10.5 Tf <417070656e64697820443a20446174616261736520737472756374757265> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 208.60662 201.77029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 534.62112 201.77029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 535.301 201.77029 Td /F1.0 10.5 Tf <3136> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 60.24 183.29029 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 183.29029 Td /F1.0 10.5 Tf [<442e312e2041> 20.01953 <6363657373696e67206d617070696e6773>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.66275 0.66275 0.66275 scn 0.66275 0.66275 0.66275 SCN BT 187.22862 183.29029 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 534.62112 183.29029 Td /F1.0 2.625 Tf Tj ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 535.301 183.29029 Td /F1.0 10.5 Tf <3136> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp1 Do Q Q endstream endobj 7 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 6 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F2.0 8 0 R /F1.0 9 0 R >> /XObject << /Stamp1 186 0 R >> >> /Annots [10 0 R 11 0 R 12 0 R 13 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 150 0 R 151 0 R 152 0 R 153 0 R 154 0 R 155 0 R 156 0 R 157 0 R] >> endobj 8 0 obj << /Type /Font /BaseFont /fe4f2b+NotoSerif-Bold /Subtype /TrueType /FontDescriptor 189 0 R /FirstChar 32 /LastChar 255 /Widths 191 0 R /ToUnicode 190 0 R >> endobj 9 0 obj << /Type /Font /BaseFont /ff2762+NotoSerif /Subtype /TrueType /FontDescriptor 193 0 R /FirstChar 32 /LastChar 255 /Widths 195 0 R /ToUnicode 194 0 R >> endobj 10 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.clamav.net) >> /Subtype /Link /Rect [445.29223 739.76143 547.04 757.44143] /Type /Annot >> endobj 11 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://sanesecurity.com) >> /Subtype /Link /Rect [211.80555 700.68714 291.14455 718.36714] /Type /Annot >> endobj 12 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://urlhaus.abuse.ch) >> /Subtype /Link /Rect [326.17333 700.68714 381.74833 718.36714] /Type /Annot >> endobj 13 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rseichter/fangfrisch/blob/master/CHANGELOG.rst) >> /Subtype /Link /Rect [254.70803 661.61286 317.51103 679.29286] /Type /Annot >> endobj 14 0 obj [7 0 R /XYZ 0 166.12429 null] endobj 15 0 obj << /Type /Names /Dests 16 0 R >> endobj 16 0 obj << /Kids [99 0 R 100 0 R] >> endobj 17 0 obj << /Length 10660 >> stream q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN 2.67813 Tw BT 48.24 793.926 Td /F1.0 10.5 Tf [<47656e6572> 20.01953 <616c205075626c6963204c6963656e7365206173207075626c69736865642062> 20.01953 <7920746865204672656520536f6674776172652046> 40.03906 <6f756e646174696f6e2c206569746865722076657273696f6e2033206f6620746865>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 778.146 Td /F1.0 10.5 Tf [<4c6963656e73652c206f722028617420796f7572206f7074696f6e2920616e> 20.01953 <79206c617465722076657273696f6e2e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.4913 Tw BT 48.24 750.366 Td /F1.0 10.5 Tf [<46> 40.03906 <616e6766726973636820697320646973747269627574656420696e2074686520686f706520746861742069742077696c6c2062652075736566756c2c2062757420574954484f555420414e592057> 60.05859 <415252414e54593b20776974686f7574>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.4251 Tw BT 48.24 734.586 Td /F1.0 10.5 Tf [<6576656e2074686520696d706c6965642077617272> 20.01953 <616e7479206f66204d4552> 20.01953 <4348414e54> 60.05859 <4142494c495459206f72204649544e45535320464f5220412050> 49.80469 <4152> 20.01953 <544943554c415220505552504f53452e20536565>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 718.806 Td /F1.0 10.5 Tf [<74686520474e552047656e6572> 20.01953 <616c205075626c6963204c6963656e736520666f72206d6f72652064657461696c732e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.036 Tw BT 48.24 691.026 Td /F1.0 10.5 Tf [<59> 69.82422 <6f752073686f756c642068617665207265636569766564206120636f70> 20.01953 <79206f662074686520474e552047656e6572> 20.01953 <616c205075626c6963204c6963656e736520616c6f6e6720776974682046> 40.03906 <616e676672697363682e204966206e6f742c>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 675.246 Td /F1.0 10.5 Tf <73656520> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 66.93 675.246 Td /F1.0 10.5 Tf [<68747470733a2f2f777777> 69.82422 <2e676e752e6f72672f6c6963656e7365732f>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 213.86885 675.246 Td /F1.0 10.5 Tf <2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 631.134 Td /F2.0 22 Tf [<322e2055706461746520737472> 20.01953 <6174656779>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.21201 Tw BT 48.24 601.946 Td /F1.0 10.5 Tf [<46> 40.03906 <616e6766726973636820697320657870656374656420746f2072756e20706572696f646963616c6c79> 89.84375 <2c20652e672e207573696e6720>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 2.21201 Tw BT 326.43184 601.946 Td /F1.0 10.5 Tf <63726f6e> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.21201 Tw BT 349.37434 601.946 Td /F1.0 10.5 Tf [<2e2046> 40.03906 <616e676672697363682077696c6c20617474656d707420746f20646f776e6c6f6164>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.18292 Tw BT 48.24 586.166 Td /F1.0 10.5 Tf <646967657374732066697273742028696620617661696c61626c6520757073747265616d292c20616e64206f6e6c7920726574726965766520636f72726573706f6e64696e67207369676e61747572652066696c6573207768656e207468656972> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 570.386 Td /F1.0 10.5 Tf [<7265636f7264656420646967657374206368616e6765732c206d696e696d6973696e67207472> 20.01953 <616e7366657220766f6c756d65732e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.88185 Tw BT 48.24 542.606 Td /F1.0 10.5 Tf [<49207265636f6d6d656e642072756e6e696e672046> 40.03906 <616e67667269736368206174203130206d696e75746520696e74657276616c732e205468657265206973206e6f206e65656420746f20776f7272792061626f7574>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 4.7195 Tw BT 48.24 526.826 Td /F1.0 10.5 Tf <6f76657262757264656e696e6720796f7572206d616368696e652c20746865206e6574776f726b206f722072656d6f7465207369676e61747572652070726f7669646572732e204561636820696e646976696475616c> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.4466 Tw BT 48.24 511.046 Td /F1.0 10.5 Tf [<646f776e6c6f6164206973207265636f7264656420696e207468652064617461626173652c20616e64207768656e657665722046> 40.03906 <616e676672697363682069732072756e2c20697420636865636b732074686f7365207265636f72646564>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.89455 Tw BT 48.24 495.266 Td /F1.0 10.5 Tf <74696d657374616d707320616761696e73742074686520707265636f6e666967757265642070726f766964657220696e74657276616c732e204e6f206e6574776f726b20636f6e6e656374696f6e7320617265206d61646520666f72> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 479.486 Td /F1.0 10.5 Tf <646f776e6c6f61646564207369676e61747572652066696c65732077686963682061726520636f6e736964657265642022746f6f20796f756e6720746f20757064617465222e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.2096 Tw BT 48.24 451.706 Td /F1.0 10.5 Tf [<496d6167696e6520612070726f766964657220696e74657276616c2073657474696e67206f66203435206d696e757465732e204576656e206966206c61756e63686564206576657279203130206d696e757465732c2046> 40.03906 <616e67667269736368>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.19613 Tw BT 48.24 435.926 Td /F1.0 10.5 Tf <77696c6c206e6f7420617474656d707420746f20646f776e6c6f61642072656c61746564207369676e61747572652066696c6573206265666f7265203435206d696e757465732068617665207061737365642073696e636520746865206c617374> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.61303 Tw BT 48.24 420.146 Td /F1.0 10.5 Tf [<7265636f72646564207375636365737366756c20646f776e6c6f61642e2050726f766964657220696e74657276616c73206172652073657420746f20726561736f6e61626c652064656661756c747320696e7465726e616c6c79> 89.84375 <2c2062757420796f75>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 404.366 Td /F1.0 10.5 Tf [<63616e206f76657272696465207468656d206966206e6563657373617279> 89.84375 <2e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 360.254 Td /F2.0 22 Tf <332e20496e7374616c6c6174696f6e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.4346 Tw BT 48.24 331.066 Td /F1.0 10.5 Tf [<46> 40.03906 <616e6766726973636820726571756972657320507974686f6e20332e37206f72206e657765722e20507974686f6e20332e3620736563757269747920737570706f72742c20692e652e206974732066696e616c206c6966656379636c652073746167652c>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.55701 Tw BT 48.24 315.286 Td /F1.0 10.5 Tf [<776173207465726d696e6174656420696e20323032312062> 20.01953 <792074686520507974686f6e20617574686f72732e20506c6561736520646f206e6f742061736b206d6520746f206d6f646966792046> 40.03906 <616e6766726973636820696e206f72646572>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 299.506 Td /F1.0 10.5 Tf <746f20737570706f727420616e6369656e7420507974686f6e2076657273696f6e732c20776869636820706f7365206120706f74656e7469616c207365637572697479207269736b20746f20796f752e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.45858 Tw BT 48.24 271.726 Td /F1.0 10.5 Tf <546865207265636f6d6d656e64656420696e7374616c6c6174696f6e206d6574686f64206973207573696e672074686520> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 0.45858 Tw BT 308.01754 271.726 Td /F1.0 10.5 Tf <70697020636f6d6d616e64> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.45858 Tw BT 377.57662 271.726 Td /F1.0 10.5 Tf <20696e2061207669727475616c20507974686f6e20656e7669726f6e6d656e742e> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.14571 Tw BT 48.24 255.946 Td /F1.0 10.5 Tf [<4865726520697320616e206578616d706c65206c697374696e67206f6620636f6d6d616e647320666f722042> 20.01953 <4153482c20746f20626520657865637574656420617320726f6f742c20617373756d696e67207468617420796f752077696c6c206265>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 240.166 Td /F1.0 10.5 Tf [<72756e6e696e672046> 40.03906 <616e6766726973636820617320616e20756e70726976696c6567656420757365722077686f206973206d656d626572206f662074686520>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 379.50409 240.166 Td /F2.0 10.5 Tf <636c616d6176> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 417.99709 240.166 Td /F1.0 10.5 Tf <2067726f75703a> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 200.326 Td /F2.0 18 Tf <332e312e2043726561746520686f6d65206469726563746f7279> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.96078 0.96078 0.96078 scn 52.24 184.27 m 543.04 184.27 l 545.24914 184.27 547.04 182.47914 547.04 180.27 c 547.04 136.79 l 547.04 134.58086 545.24914 132.79 543.04 132.79 c 52.24 132.79 l 50.03086 132.79 48.24 134.58086 48.24 136.79 c 48.24 180.27 l 48.24 182.47914 50.03086 184.27 52.24 184.27 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 184.27 m 543.04 184.27 l 545.24914 184.27 547.04 182.47914 547.04 180.27 c 547.04 136.79 l 547.04 134.58086 545.24914 132.79 543.04 132.79 c 52.24 132.79 l 50.03086 132.79 48.24 134.58086 48.24 136.79 c 48.24 180.27 l 48.24 182.47914 50.03086 184.27 52.24 184.27 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 161.445 Td /F3.0 11 Tf <6d6b646972202d6d2030373730202d70202f7661722f6c69622f66616e67667269736368> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 146.705 Td /F3.0 11 Tf <636867727020636c616d6176202f7661722f6c69622f66616e67667269736368> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 108.826 Td /F1.0 10.5 Tf [<546869732077696c6c206772> 20.01953 <616e742067726f7570206d656d6265727320746865206e65636573736172792077726974652061636365737320746f2063726561746520746865206461746162617365202873656520>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 474.30879 108.826 Td /F1.0 10.5 Tf <53656374696f6e2036> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 519.25929 108.826 Td /F1.0 10.5 Tf <292e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp2 Do Q Q endstream endobj 18 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 17 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 9 0 R /F2.0 8 0 R /F3.0 25 0 R >> /XObject << /Stamp2 187 0 R >> >> /Annots [19 0 R 21 0 R 23 0 R 26 0 R] >> endobj 19 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.gnu.org/licenses/) >> /Subtype /Link /Rect [66.93 672.18 213.86885 686.46] /Type /Annot >> endobj 20 0 obj [18 0 R /XYZ 0 659.43 null] endobj 21 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://en.wikipedia.org/wiki/Cron) >> /Subtype /Link /Rect [326.43184 598.88 349.37434 613.16] /Type /Annot >> endobj 22 0 obj [18 0 R /XYZ 0 388.55 null] endobj 23 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://packaging.python.org/tutorials/installing-packages/) >> /Subtype /Link /Rect [308.01754 268.66 377.57662 282.94] /Type /Annot >> endobj 24 0 obj [18 0 R /XYZ 0 224.35 null] endobj 25 0 obj << /Type /Font /BaseFont /59b470+mplus1mn-regular /Subtype /TrueType /FontDescriptor 197 0 R /FirstChar 32 /LastChar 255 /Widths 199 0 R /ToUnicode 198 0 R >> endobj 26 0 obj << /Border [0 0 0] /Dest (dbsetup) /Subtype /Link /Rect [474.30879 105.76 519.25929 120.04] /Type /Annot >> endobj 27 0 obj << /Length 11882 >> stream q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 48.24 786.666 Td /F2.0 18 Tf <332e322e205072657061726520616e642061637469766174652076656e76> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.96078 0.96078 0.96078 scn 52.24 770.61 m 543.04 770.61 l 545.24914 770.61 547.04 768.81914 547.04 766.61 c 547.04 708.39 l 547.04 706.18086 545.24914 704.39 543.04 704.39 c 52.24 704.39 l 50.03086 704.39 48.24 706.18086 48.24 708.39 c 48.24 766.61 l 48.24 768.81914 50.03086 770.61 52.24 770.61 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 770.61 m 543.04 770.61 l 545.24914 770.61 547.04 768.81914 547.04 766.61 c 547.04 708.39 l 547.04 706.18086 545.24914 704.39 543.04 704.39 c 52.24 704.39 l 50.03086 704.39 48.24 706.18086 48.24 708.39 c 48.24 766.61 l 48.24 768.81914 50.03086 770.61 52.24 770.61 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 747.785 Td /F3.0 11 Tf <6364202f7661722f6c69622f66616e67667269736368> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 733.045 Td /F3.0 11 Tf <707974686f6e33202d6d2076656e762076656e76> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 718.305 Td /F3.0 11 Tf <736f757263652076656e762f62696e2f6163746976617465> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 668.366 Td /F2.0 18 Tf <332e332e20496e7374616c6c2076696120> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 179.586 668.366 Td /F2.0 18 Tf <50795049> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.96078 0.96078 0.96078 scn 52.24 652.31 m 543.04 652.31 l 545.24914 652.31 547.04 650.51914 547.04 648.31 c 547.04 619.57 l 547.04 617.36086 545.24914 615.57 543.04 615.57 c 52.24 615.57 l 50.03086 615.57 48.24 617.36086 48.24 619.57 c 48.24 648.31 l 48.24 650.51914 50.03086 652.31 52.24 652.31 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 652.31 m 543.04 652.31 l 545.24914 652.31 547.04 650.51914 547.04 648.31 c 547.04 619.57 l 547.04 617.36086 545.24914 615.57 543.04 615.57 c 52.24 615.57 l 50.03086 615.57 48.24 617.36086 48.24 619.57 c 48.24 648.31 l 48.24 650.51914 50.03086 652.31 52.24 652.31 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 629.485 Td /F3.0 11 Tf <70697020696e7374616c6c2066616e67667269736368> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 591.606 Td /F1.0 10.5 Tf <5468697320737465702077696c6c20616c736f2063726561746520616e2065786563757461626c65206c61756e636865722073637269707420> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN BT 324.1695 591.606 Td /F3.0 10.5 Tf <76656e762f62696e2f66616e67667269736368> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 423.9195 591.606 Td /F1.0 10.5 Tf <2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 547.494 Td /F2.0 22 Tf <342e20496e7374616c6c6174696f6e207061636b61676573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.86881 Tw BT 48.24 518.306 Td /F1.0 10.5 Tf <417320616e20616c7465726e617469766520746f207069702d626173656420696e7374616c6c6174696f6e2c20746865726520617265207061636b6167657320617661696c61626c6520666f722074686520666f6c6c6f77696e67204c696e7578> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 502.526 Td /F1.0 10.5 Tf <646973747269627574696f6e733a> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 474.746 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 474.746 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 474.746 Td /F1.0 10.5 Tf <41726368204c696e75783a20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 128.2425 474.746 Td /F1.0 10.5 Tf [<7061636b616765732f70> 20.01953 <7974686f6e2d66616e67667269736368>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 266.31729 474.746 Td /F1.0 10.5 Tf <2e20537570706f727420636f6e746163743a2041726368207061636b616765206d61696e7461696e65722e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 452.966 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 452.966 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 452.966 Td /F1.0 10.5 Tf <436c656172204c696e75783a20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 130.227 452.966 Td /F1.0 10.5 Tf [<636c6561726c696e75782d706b> 20.01953 <67732f66616e67667269736368>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 261.16179 452.966 Td /F1.0 10.5 Tf <2e20537570706f727420636f6e746163743a20436c656172204c696e7578207061636b616765206d61696e7461696e6572732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 431.186 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 431.186 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 431.186 Td /F1.0 10.5 Tf <44656269616e204c696e75783a20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 139.782 431.186 Td /F1.0 10.5 Tf <66616e6766726973636820287574696c7329> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 222.3855 431.186 Td /F1.0 10.5 Tf <2e20537570706f727420636f6e746163743a2044656269616e207061636b616765206d61696e7461696e6572732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 409.406 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 409.406 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 409.406 Td /F1.0 10.5 Tf <47656e746f6f204c696e75783a20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 139.761 409.406 Td /F1.0 10.5 Tf <6170702d616e746976697275732f66616e67667269736368> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 261.225 409.406 Td /F1.0 10.5 Tf <2e20537570706f727420636f6e746163743a2047656e746f6f207061636b616765206d61696e7461696e6572732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 365.294 Td /F2.0 22 Tf [<352e20436f6e6669677572> 20.01953 <6174696f6e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.00454 Tw BT 48.24 336.106 Td /F1.0 10.5 Tf [<4120636f6e6669677572> 20.01953 <6174696f6e2066696c65206973206d616e6461746f7279> 89.84375 <2c207573657320616e20494e492d46696c652d6c696b> 20.01953 <652073747275637475726520616e64206d75737420636f6e7461696e206120>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 0.00454 Tw BT 467.54428 336.106 Td /F3.0 10.5 Tf <64625f75726c> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.00454 Tw BT 499.04428 336.106 Td /F1.0 10.5 Tf [<20656e747279> 89.84375 <2e20416c6c>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.68792 Tw BT 48.24 320.326 Td /F1.0 10.5 Tf <6f746865722073657474696e677320617265206f7074696f6e616c2e20486f77657665722c20756e6c65737320796f7520656e61626c65206f6e65207369676e61747572652066696c652070726f76696465722073656374696f6e2c> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 304.546 Td /F1.0 10.5 Tf [<46> 40.03906 <616e67667269736368206e61747572> 20.01953 <616c6c7920776f6ed57420646f206d7563682e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.15998 Tw BT 48.24 276.766 Td /F1.0 10.5 Tf <5573652074686520> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 0.15998 Tw BT 87.84046 276.766 Td /F3.0 10.5 Tf <2d2d636f6e66> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.15998 Tw BT 119.34046 276.766 Td /F1.0 10.5 Tf <20636f6d6d616e64206c696e6520617267756d656e74202873656520> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 0.15998 Tw BT 271.64487 276.766 Td /F1.0 10.5 Tf <53656374696f6e2037> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.15998 Tw BT 316.75535 276.766 Td /F1.0 10.5 Tf [<2920746f207370656369667920746865207061746820746f20796f757220636f6e6669677572> 20.01953 <6174696f6e2066696c652e>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 260.986 Td /F1.0 10.5 Tf <4e6f74652074686174207468657265206973206e6f2064656661756c74206c6f636174696f6e2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.96078 0.96078 0.96078 scn 52.24 245.17 m 543.04 245.17 l 545.24914 245.17 547.04 243.37914 547.04 241.17 c 547.04 109.25 l 547.04 107.04086 545.24914 105.25 543.04 105.25 c 52.24 105.25 l 50.03086 105.25 48.24 107.04086 48.24 109.25 c 48.24 241.17 l 48.24 243.37914 50.03086 245.17 52.24 245.17 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 245.17 m 543.04 245.17 l 545.24914 245.17 547.04 243.37914 547.04 241.17 c 547.04 109.25 l 547.04 107.04086 545.24914 105.25 543.04 105.25 c 52.24 105.25 l 50.03086 105.25 48.24 107.04086 48.24 109.25 c 48.24 241.17 l 48.24 243.37914 50.03086 245.17 52.24 245.17 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 222.345 Td /F3.0 11 Tf <23204d696e696d616c206578616d706c6520636f6e66696775726174696f6e2c206d65616e7420666f722074657374696e672e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 192.865 Td /F3.0 11 Tf <5b44454641554c545d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 178.125 Td /F3.0 11 Tf <64625f75726c203d2073716c6974653a2f2f2f2f7661722f6c69622f66616e676672697363682f64622e73716c697465> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 163.385 Td /F3.0 11 Tf <6c6f63616c5f6469726563746f7279203d202f7661722f6c69622f636c616d6176> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 133.905 Td /F3.0 11 Tf <5b75726c686175735d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 119.165 Td /F3.0 11 Tf <656e61626c6564203d20796573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 81.286 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 1.1975 Tw BT 66.24 81.286 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.1975 Tw BT 66.24 81.286 Td /F2.0 10.5 Tf <636c65616e7570> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.1975 Tw BT 108.492 81.286 Td /F1.0 10.5 Tf <3a20436c65616e7570206d6574686f64207573656420666f722070726f76696465722073656374696f6e732e2044656661756c743a20> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.1975 Tw BT 386.872 81.286 Td /F3.0 10.5 Tf <6175746f6d61746963> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.1975 Tw BT 434.122 81.286 Td /F1.0 10.5 Tf <2c20616c7465726e61746976653a20> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.1975 Tw BT 502.415 81.286 Td /F3.0 10.5 Tf <64697361626c6564> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.1975 Tw BT 544.415 81.286 Td /F1.0 10.5 Tf <2e> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 1.51595 Tw BT 66.24 65.506 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.51595 Tw BT 66.24 65.506 Td /F1.0 10.5 Tf [<496e206175746f6d61746963206d6f64652c2046> 40.03906 <616e676672697363682077696c6c20617474656d707420746f2064656c657465206f62736f6c65746520766972757320646566696e6974696f6e2066696c6573207768656e65766572>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp1 Do Q Q endstream endobj 28 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 27 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F2.0 8 0 R /F3.0 25 0 R /F1.0 9 0 R >> /XObject << /Stamp1 186 0 R >> >> /Annots [31 0 R 33 0 R 34 0 R 35 0 R 36 0 R 38 0 R] >> endobj 29 0 obj [28 0 R /XYZ 0 841.89 null] endobj 30 0 obj [28 0 R /XYZ 0 692.39 null] endobj 31 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://pypi.org/project/fangfrisch/) >> /Subtype /Link /Rect [179.586 663.11 220.176 687.59] /Type /Annot >> endobj 32 0 obj [28 0 R /XYZ 0 575.79 null] endobj 33 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://aur.archlinux.org/packages/python-fangfrisch/) >> /Subtype /Link /Rect [128.2425 471.68 266.31729 485.96] /Type /Annot >> endobj 34 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/clearlinux-pkgs/fangfrisch) >> /Subtype /Link /Rect [130.227 449.9 261.16179 464.18] /Type /Annot >> endobj 35 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://packages.debian.org/sid/fangfrisch) >> /Subtype /Link /Rect [139.782 428.12 222.3855 442.4] /Type /Annot >> endobj 36 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://packages.gentoo.org/packages/app-antivirus/fangfrisch) >> /Subtype /Link /Rect [139.761 406.34 261.225 420.62] /Type /Annot >> endobj 37 0 obj [28 0 R /XYZ 0 393.59 null] endobj 38 0 obj << /Border [0 0 0] /Dest (usage) /Subtype /Link /Rect [271.64487 273.7 316.75535 287.98] /Type /Annot >> endobj 39 0 obj << /Length 24835 >> stream q 0.02203 Tw BT 66.24 793.926 Td ET 0.0 Tw /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN 0.02203 Tw BT 66.24 793.926 Td /F1.0 10.5 Tf <796f752064697361626c6520612070726f76696465722073656374696f6e2e2053686f756c6420796f752064697361626c652074686973206f7074696f6e2c206f727068616e65642066696c65732077696c6c206265206c65667420626568696e642c> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 778.146 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 778.146 Td /F1.0 10.5 Tf [<616e6420796f75206e65656420746f20656e7375726520636c65616e75702062> 20.01953 <7920646966666572656e74206d65616e732e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 756.366 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 3.32556 Tw BT 66.24 756.366 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.32556 Tw BT 66.24 756.366 Td /F2.0 10.5 Tf <636f6e6e656374696f6e5f74696d656f7574> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.32556 Tw BT 171.7755 756.366 Td /F1.0 10.5 Tf <3a2054696d656f757420696e207365636f6e64732c2075736564207768656e2065737461626c697368696e67206e6574776f726b20636f6e6e656374696f6e7320746f> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.00186 Tw BT 66.24 740.586 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.00186 Tw BT 66.24 740.586 Td /F1.0 10.5 Tf <646f776e6c6f6164207369676e61747572652066696c65732e2044656661756c743a20> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 0.00186 Tw BT 237.50243 740.586 Td /F3.0 10.5 Tf <3330> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.00186 Tw BT 248.00243 740.586 Td /F1.0 10.5 Tf <2e2042652061776172652074686174206c6f6e6765722074696d656f75747320696e63726561736520746865207269736b206f66206d756c7469706c65> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.32012 Tw BT 66.24 724.806 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.32012 Tw BT 66.24 724.806 Td /F1.0 10.5 Tf [<46> 40.03906 <616e6766726973636820696e7374616e6365732072756e6e696e6720636f6e63757272656e746c79> 89.84375 <2e205468697320636f756c642c20696e207475726e2c206361757365206461746162617365206163636573732070726f626c656d732c>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 3.19644 Tw BT 66.24 709.026 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.19644 Tw BT 66.24 709.026 Td /F1.0 10.5 Tf [<616e64206e6574776f726b20736f636b> 20.01953 <657420636f6e67657374696f6e2e20496620796f757220496e7465726e657420636f6e6e656374696f6e20697320666173742c2049206576656e20737567676573742074657374696e67>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 693.246 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 693.246 Td /F1.0 10.5 Tf <74696d656f75742076616c756573206c6f776572207468616e207468652064656661756c74203330207365636f6e64732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 671.466 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 1.36777 Tw BT 66.24 671.466 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.36777 Tw BT 66.24 671.466 Td /F2.0 10.5 Tf <64625f75726c> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.36777 Tw BT 100.827 671.466 Td /F1.0 10.5 Tf <3a2044617461626173652055524c20696e20> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 1.36777 Tw BT 197.06007 671.466 Td /F1.0 10.5 Tf <53514c416c6368656d792073796e746178> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.36777 Tw BT 298.20934 671.466 Td /F1.0 10.5 Tf [<2e204d616e6461746f7279> 89.84375 <2c206e6f2064656661756c742e205479706963616c6c79> 89.84375 <2c2061206c6f63616c20>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 1.36777 Tw BT 514.343 671.466 Td /F1.0 10.5 Tf <53514c697465> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.36777 Tw BT 547.04 671.466 Td ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 655.686 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 655.686 Td /F1.0 10.5 Tf <64617461626173652077696c6c20737566666963652e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 633.906 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 633.906 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 633.906 Td /F2.0 10.5 Tf <656e61626c6564> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 108.7965 633.906 Td /F1.0 10.5 Tf <3a205363616e20746869732073656374696f6e20666f722055524c733f2044656661756c743a20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN BT 293.649 633.906 Td /F3.0 10.5 Tf <66616c7365> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 319.899 633.906 Td /F1.0 10.5 Tf <2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 612.126 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 1.59014 Tw BT 66.24 612.126 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.59014 Tw BT 66.24 612.126 Td /F2.0 10.5 Tf <696e746567726974795f636865636b> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.59014 Tw BT 148.0455 612.126 Td /F1.0 10.5 Tf <3a204d656368616e69736d20666f7220696e7465677269747920636865636b732e2044656661756c743a20> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.59014 Tw BT 368.46833 612.126 Td /F3.0 10.5 Tf <736861323536> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.59014 Tw BT 399.96833 612.126 Td /F1.0 10.5 Tf [<2e2059> 69.82422 <6f752063616e2075736520>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.59014 Tw BT 473.22622 612.126 Td /F3.0 10.5 Tf <64697361626c6564> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.59014 Tw BT 515.22622 612.126 Td /F1.0 10.5 Tf <20696620746865> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 596.346 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 596.346 Td /F1.0 10.5 Tf <7369676e61747572652066696c652070726f7669646572206f6666657273206e6f20636865636b73756d732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 574.566 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 5.20629 Tw BT 66.24 574.566 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 5.20629 Tw BT 66.24 574.566 Td /F2.0 10.5 Tf <696e74657276616c> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 5.20629 Tw BT 108.975 574.566 Td /F1.0 10.5 Tf [<3a20496e74657276616c206265747765656e20646f776e6c6f6164732e2044656661756c7473206172652070726f76696465722d646570656e64656e742e2056> 60.05859 <616c7565732063616e206265>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 3.13837 Tw BT 66.24 558.786 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.13837 Tw BT 66.24 558.786 Td /F1.0 10.5 Tf <65787072657373656420696e2068756d616e2d7265616461626c6520666f726d2028652e672e20> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 3.13837 Tw BT 284.06736 558.786 Td /F3.0 10.5 Tf <313268> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.13837 Tw BT 299.81736 558.786 Td /F1.0 10.5 Tf <206f7220> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 3.13837 Tw BT 322.5371 558.786 Td /F3.0 10.5 Tf <34356d> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.13837 Tw BT 338.2871 558.786 Td /F1.0 10.5 Tf [<292e20506c65617365207265737065637420746865206c696d697473207365742062> 20.01953 <792065616368>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 543.006 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 543.006 Td /F1.0 10.5 Tf <70726f76696465722e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 521.226 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 0.23054 Tw BT 66.24 521.226 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.23054 Tw BT 66.24 521.226 Td /F2.0 10.5 Tf <6c6f63616c5f6469726563746f7279> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.23054 Tw BT 146.397 521.226 Td /F1.0 10.5 Tf <3a20446f776e6c6f616465642066696c6573206172652073746f72656420686572652e204e6f2064656661756c742c20736f207468652063757272656e7420776f726b696e67206469726563746f7279> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 1.10652 Tw BT 66.24 505.446 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.10652 Tw BT 66.24 505.446 Td /F1.0 10.5 Tf [<6f662074686520507974686f6e2070726f6365737320697320757365642e20417320746869732063616e207661727920646570656e64696e67206f6e20686f7720796f75206c61756e63682046> 40.03906 <616e676672697363682c206974206973>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.79828 Tw BT 66.24 489.666 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.79828 Tw BT 66.24 489.666 Td /F1.0 10.5 Tf [<686967686c79207265636f6d6d656e64656420746f20646566696e6520616e206162736f6c7574652070617468206c696b> 20.01953 <6520>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 0.79828 Tw BT 335.65103 489.666 Td /F3.0 10.5 Tf <2f7661722f6c69622f636c616d6176> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.79828 Tw BT 414.40103 489.666 Td /F1.0 10.5 Tf [<20696e73746561642e2059> 69.82422 <6f752063616e206f76657272696465>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 473.886 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 473.886 Td /F1.0 10.5 Tf [<74686973206f7074696f6e20696e2070726f76696465722073656374696f6e7320746f207365706172> 20.01953 <61746520646f776e6c6f616473206261736564206f6e206f726967696e2e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 452.106 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 1.96303 Tw BT 66.24 452.106 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.96303 Tw BT 66.24 452.106 Td /F2.0 10.5 Tf <6c6f675f666f726d6174> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.96303 Tw BT 124.1055 452.106 Td /F1.0 10.5 Tf <3a2053656520> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 1.96303 Tw BT 153.41006 452.106 Td /F1.0 10.5 Tf [<46> 40.03906 <6f726d617474657220636c617373>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.96303 Tw BT 232.42169 452.106 Td /F1.0 10.5 Tf [<20646f63756d656e746174696f6e20666f722064657461696c732e2046> 40.03906 <616e6766726973636820757365732073656e7369626c652064656661756c7473>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 436.326 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 436.326 Td /F1.0 10.5 Tf <646570656e64696e67206f6e207468652073656c6563746564206c6f67206d6574686f642e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 414.546 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 414.546 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 414.546 Td /F2.0 10.5 Tf <6c6f675f6c6576656c> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 112.7655 414.546 Td /F1.0 10.5 Tf <3a2043686f6f7365206f6e65206f6620> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN BT 190.5915 414.546 Td /F3.0 10.5 Tf <4445425547> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 216.8415 414.546 Td /F1.0 10.5 Tf <2c20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN BT 222.186 414.546 Td /F3.0 10.5 Tf <494e464f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 243.186 414.546 Td /F1.0 10.5 Tf <2c20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN BT 248.5305 414.546 Td /F3.0 10.5 Tf <5741524e494e47> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 285.2805 414.546 Td /F1.0 10.5 Tf <202864656661756c74292c20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN BT 336.048 414.546 Td /F3.0 10.5 Tf <4552524f52> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 362.298 414.546 Td /F1.0 10.5 Tf <206f7220> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN BT 378.741 414.546 Td /F3.0 10.5 Tf <464154414c> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 404.991 414.546 Td /F1.0 10.5 Tf <2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 392.766 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 1.49495 Tw BT 66.24 392.766 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.49495 Tw BT 66.24 392.766 Td /F2.0 10.5 Tf <6c6f675f6d6574686f64> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.49495 Tw BT 127.8435 392.766 Td /F1.0 10.5 Tf <3a2045697468657220> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.49495 Tw BT 170.0824 392.766 Td /F3.0 10.5 Tf <636f6e736f6c65> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.49495 Tw BT 206.8324 392.766 Td /F1.0 10.5 Tf <202864656661756c742c206d65616e696e67207374646f75742f73746465727229206f7220> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.49495 Tw BT 392.89116 392.766 Td /F3.0 10.5 Tf <7379736c6f67> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.49495 Tw BT 424.39116 392.766 Td /F1.0 10.5 Tf [<2e2046> 40.03906 <6f7220746865206c61747465722c20796f752063616e>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 376.986 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 376.986 Td /F1.0 10.5 Tf <616c736f2073706563696679206120> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 135.351 376.986 Td /F2.0 10.5 Tf <6c6f675f746172676574> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 188.2815 376.986 Td /F1.0 10.5 Tf <2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 355.206 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 1.04431 Tw BT 66.24 355.206 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.04431 Tw BT 66.24 355.206 Td /F2.0 10.5 Tf <6c6f675f746172676574> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.04431 Tw BT 119.1705 355.206 Td /F1.0 10.5 Tf <3a2054686520> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 1.04431 Tw BT 148.40162 355.206 Td /F1.0 10.5 Tf <7379736c6f67> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.04431 Tw BT 178.75712 355.206 Td /F1.0 10.5 Tf <2074617267657420616464726573732e205479706963616c2076616c7565732061726520> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.04431 Tw BT 357.44347 355.206 Td /F3.0 10.5 Tf <2f6465762f6c6f67> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.04431 Tw BT 399.44347 355.206 Td /F1.0 10.5 Tf [<20286c6f63616c204c696e757820646f6d61696e20736f636b> 20.01953 <6574292c>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 1.58592 Tw BT 66.24 339.426 Td ET 0.0 Tw 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.58592 Tw BT 66.24 339.426 Td /F3.0 10.5 Tf <6c6f63616c686f7374> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.58592 Tw BT 113.49 339.426 Td /F1.0 10.5 Tf <206f7220> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.58592 Tw BT 133.10483 339.426 Td /F3.0 10.5 Tf <686f73742e646f6d61696e2e746c643a756470706f7274> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.58592 Tw BT 253.85483 339.426 Td /F1.0 10.5 Tf <2e204966206e6f20746172676574206973207370656369666965642c20> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.58592 Tw BT 387.66933 339.426 Td /F3.0 10.5 Tf <6c6f63616c686f7374> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.58592 Tw BT 434.91933 339.426 Td /F1.0 10.5 Tf <20697320617373756d65642e2054686520554450> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 323.646 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 323.646 Td /F1.0 10.5 Tf <706f7274206e756d6265722064656661756c747320746f203531342e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 301.866 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 1.29188 Tw BT 66.24 301.866 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.29188 Tw BT 66.24 301.866 Td /F2.0 10.5 Tf <6d61785f73697a65> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.29188 Tw BT 114.792 301.866 Td /F1.0 10.5 Tf <3a204d6178696d756d2065787065637465642066696c652073697a652e205468652064656661756c7420697320> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.29188 Tw BT 346.19408 301.866 Td /F3.0 10.5 Tf <31304d42> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.29188 Tw BT 367.19408 301.866 Td /F1.0 10.5 Tf <2c2062757420616c6c20707265646566696e65642070726f7669646572732068617665> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 1.33474 Tw BT 66.24 286.086 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.33474 Tw BT 66.24 286.086 Td /F1.0 10.5 Tf <696e646976696475616c2073697a65206c696d697473202873656520> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 1.33474 Tw BT 201.01246 286.086 Td /F1.0 10.5 Tf <417070656e6469782041> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.33474 Tw BT 260.9897 286.086 Td /F1.0 10.5 Tf [<292e2056> 60.05859 <616c756573206172652063616e2062652065787072657373656420696e2068756d616e2d7265616461626c6520666f726d>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 1.11988 Tw BT 66.24 270.306 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.11988 Tw BT 66.24 270.306 Td /F1.0 10.5 Tf <28652e672e20> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.11988 Tw BT 90.22888 270.306 Td /F3.0 10.5 Tf <3235304b42> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.11988 Tw BT 116.47888 270.306 Td /F1.0 10.5 Tf <206f7220> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.11988 Tw BT 135.16163 270.306 Td /F3.0 10.5 Tf <334d42> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.11988 Tw BT 150.91163 270.306 Td /F1.0 10.5 Tf [<292e2046> 40.03906 <616e6766726973636820617474656d70747320746f20696e73706563742074686520636f6e74656e74206c656e677468206265666f726520646f776e6c6f6164696e67207669727573>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 2.52173 Tw BT 66.24 254.526 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.52173 Tw BT 66.24 254.526 Td /F1.0 10.5 Tf <7369676e61747572652066696c657320736f206173206e6f7420746f20646f776e6c6f61642066696c6573206c6172676572207468616e2074686520646566696e6564206c696d69742e2049662070726f76696465727320646f6ed574> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.71522 Tw BT 66.24 238.746 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.71522 Tw BT 66.24 238.746 Td /F1.0 10.5 Tf [<726573706f6e64207769746820636f6e74656e74206c656e67746820696e666f726d6174696f6e2c2046> 40.03906 <616e676672697363682077696c6c206c6f672061207761726e696e672062757420646f776e6c6f6164207468652064617461>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 222.966 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 222.966 Td /F1.0 10.5 Tf [<616e> 20.01953 <797761> 20.01953 <79> 89.84375 <2e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 201.186 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 1.14712 Tw BT 66.24 201.186 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.14712 Tw BT 66.24 201.186 Td /F2.0 10.5 Tf <6f6e5f7570646174655f65786563> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.14712 Tw BT 150.6285 201.186 Td /F1.0 10.5 Tf [<3a20496620616e> 20.01953 <792066696c6573207765726520646f776e6c6f6164656420647572696e67206120706173732c206120636f6d6d616e642063616e20626520657865637574656420696e>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.04764 Tw BT 66.24 185.406 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.04764 Tw BT 66.24 185.406 Td /F1.0 10.5 Tf <61667465722074686520706173732066696e69736865732e204e6f2064656661756c742e2041207479706963616c2076616c756520697320> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 0.04764 Tw BT 326.29736 185.406 Td /F3.0 10.5 Tf <636c616d647363616e202d2d72656c6f6164> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.04764 Tw BT 420.845 185.406 Td /F1.0 10.5 Tf [<2e205374617274696e6720776974682046> 40.03906 <616e67667269736368>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 169.626 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 169.626 Td /F1.0 10.5 Tf [<312e392e302c2074686973206f7074696f6e206d61> 20.01953 <79206265206f76657272696464656e20696e20696e646976696475616c2073656374696f6e732c207065726d697474696e67207065722d70726f766964657220616374696f6e732e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 147.846 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 2.2265 Tw BT 66.24 147.846 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.2265 Tw BT 66.24 147.846 Td /F2.0 10.5 Tf <6f6e5f7570646174655f74696d656f7574> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.2265 Tw BT 168.2895 147.846 Td /F1.0 10.5 Tf <3a2054696d656f757420666f722074686520> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 2.2265 Tw BT 263.642 147.846 Td /F3.0 10.5 Tf <6f6e5f7570646174655f65786563> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.2265 Tw BT 337.142 147.846 Td /F1.0 10.5 Tf <20636f6d6d616e642c20696e207365636f6e64732e2044656661756c743a2033302e2054686973> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 132.066 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 132.066 Td /F1.0 10.5 Tf [<6f7074696f6e206d61> 20.01953 <7920616c736f206265206f76657272696464656e20696e20696e646976696475616c2073656374696f6e732e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.16702 Tw BT 48.24 104.286 Td /F1.0 10.5 Tf <53656520> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 0.16702 Tw BT 68.06302 104.286 Td /F1.0 10.5 Tf <68657265> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.16702 Tw BT 90.90052 104.286 Td /F1.0 10.5 Tf [<20666f722064657461696c732061626f75742074686520636f6e6669677572> 20.01953 <6174696f6e2070617273657220616e6420657874656e64656420696e746572706f6c6174696f6e2e20>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 0.16702 Tw BT 446.88247 104.286 Td /F1.0 10.5 Tf <53656374696f6e20352e33> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.16702 Tw BT 500.49448 104.286 Td /F1.0 10.5 Tf <2070726f7669646573> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 88.506 Td /F1.0 10.5 Tf [<6164646974696f6e616c20696e666f726d6174696f6e206f6e20686f7720636f6e6669677572> 20.01953 <6174696f6e206f7074696f6e732061726520696e7465727072657465642e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp2 Do Q Q endstream endobj 40 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 39 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 9 0 R /F2.0 8 0 R /F3.0 25 0 R >> /XObject << /Stamp2 187 0 R >> >> /Annots [41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R] >> endobj 41 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.sqlalchemy.org/en/13/core/engines.html#supported-databases) >> /Subtype /Link /Rect [197.06007 668.4 298.20934 682.68] /Type /Annot >> endobj 42 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.sqlite.org) >> /Subtype /Link /Rect [514.343 668.4 547.04 682.68] /Type /Annot >> endobj 43 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.python.org/3/library/logging.html#logging.Formatter) >> /Subtype /Link /Rect [153.41006 449.04 232.42169 463.32] /Type /Annot >> endobj 44 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://tools.ietf.org/html/rfc5424) >> /Subtype /Link /Rect [148.40162 352.14 178.75712 366.42] /Type /Annot >> endobj 45 0 obj << /Border [0 0 0] /Dest (internalconf) /Subtype /Link /Rect [201.01246 283.02 260.9897 297.3] /Type /Annot >> endobj 46 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.python.org/3.7/library/configparser.html) >> /Subtype /Link /Rect [68.06302 101.22 90.90052 115.5] /Type /Annot >> endobj 47 0 obj << /Border [0 0 0] /Dest (_semantics) /Subtype /Link /Rect [446.88247 101.22 500.49448 115.5] /Type /Annot >> endobj 48 0 obj << /Length 8704 >> stream q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 48.24 786.666 Td /F2.0 18 Tf <352e312e2044656661756c742070726f766964657273> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 758.646 Td /F1.0 10.5 Tf [<46> 40.03906 <616e6766726973636820636f6e7461696e7320696e7465726e616c2064656661756c747320666f722074686520666f6c6c6f77696e672070726f7669646572732c206c697374656420696e20616c7068616265746963616c206f726465723a>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 730.866 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 730.866 Td ET 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 66.24 730.866 Td /F1.0 10.5 Tf <496e746572536572766572> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 709.086 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 709.086 Td ET 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 66.24 709.086 Td /F1.0 10.5 Tf <4d616c77617265706174726f6c> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 687.306 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 687.306 Td ET 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 66.24 687.306 Td /F1.0 10.5 Tf <53616e657365637572697479> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 665.526 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 665.526 Td ET 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 66.24 665.526 Td /F1.0 10.5 Tf <5365637572697465496e666f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 643.746 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 643.746 Td ET 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 66.24 643.746 Td /F1.0 10.5 Tf <55524c68617573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.04012 Tw BT 48.24 615.966 Td /F1.0 10.5 Tf [<49206861766520616c736f20696e636c75646564202246> 40.03906 <616e67667269736368204e65777322202873656520>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 1.04012 Tw BT 274.6974 615.966 Td /F1.0 10.5 Tf <417070656e6469782043> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.04012 Tw BT 333.41401 615.966 Td /F1.0 10.5 Tf [<292e2050726f7669646572732063616e20626520656e61626c65642062> 20.01953 <79207370656369666979696e67>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN BT 48.24 600.186 Td /F3.0 10.5 Tf <656e61626c6564203d20796573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 116.49 600.186 Td /F1.0 10.5 Tf [<20696e20746865206465736972656420636f6e6669677572> 20.01953 <6174696f6e2066696c652073656374696f6e732e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.5 w 0.93333 0.93333 0.93333 SCN 137.84318 584.37 m 137.84318 544.81 l S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 560.516 Td /F2.0 10.5 Tf [<494d504f52> 20.01953 <54> 60.05859 <414e54>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.0255 Tw BT 149.84318 568.406 Td /F1.0 10.5 Tf [<506c65617365206d616b> 20.01953 <65207375726520746f206578616d696e652074686520726573706563746976652073657474696e677320666f7220796f757273656c66206265666f7265>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 149.84318 552.626 Td /F1.0 10.5 Tf <656e61626c696e672070726f7669646572732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.23031 Tw BT 48.24 520.846 Td /F1.0 10.5 Tf [<5468652064656661756c7473206d61> 20.01953 <79206e6f74207375697420796f757220706572736f6e616c20707265666572656e6365732c20616e6420736f6d652070726f7669646572732072657175697265206164646974696f6e616c>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 505.066 Td /F1.0 10.5 Tf [<636f6e6669677572> 20.01953 <6174696f6e2c20652e672e20616e2061636365737320746f6b> 20.01953 <656e2e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.96078 0.96078 0.96078 scn 52.24 489.25 m 543.04 489.25 l 545.24914 489.25 547.04 487.45914 547.04 485.25 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 485.25 l 48.24 487.45914 50.03086 489.25 52.24 489.25 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 489.25 m 543.04 489.25 l 545.24914 489.25 547.04 487.45914 547.04 485.25 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 485.25 l 48.24 487.45914 50.03086 489.25 52.24 489.25 c h S Q q 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 48.24 m 542.29 48.24 l S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 466.425 Td /F3.0 11 Tf <23204578616d706c6520636f6e66696775726174696f6e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 436.945 Td /F3.0 11 Tf <5b44454641554c545d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 422.205 Td /F3.0 11 Tf <64625f75726c203d2073716c6974653a2f2f2f2f7661722f6c69622f66616e676672697363682f64622e73716c697465> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 392.725 Td /F3.0 11 Tf <232054686520666f6c6c6f77696e672073657474696e677320617265206f7074696f6e616c2e204f746865722073656374696f6e7320696e6865726974> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 377.985 Td /F3.0 11 Tf <232076616c7565732066726f6d2044454641554c5420616e64206d617920616c736f206f76657277726974652076616c7565732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 348.505 Td /F3.0 11 Tf <6c6f63616c5f6469726563746f7279203d202f7661722f6c69622f636c616d6176> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 333.765 Td /F3.0 11 Tf <6d61785f73697a65203d20354d42> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 319.025 Td /F3.0 11 Tf <6f6e5f7570646174655f65786563203d20636c616d647363616e202d2d72656c6f6164> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 304.285 Td /F3.0 11 Tf <6f6e5f7570646174655f74696d656f7574203d203432> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 274.805 Td /F3.0 11 Tf <5b696e7465727365727665725d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 260.065 Td /F3.0 11 Tf <656e61626c6564203d20796573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 230.585 Td /F3.0 11 Tf <5b6d616c77617265706174726f6c5d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 215.845 Td /F3.0 11 Tf <656e61626c6564203d20796573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 201.105 Td /F3.0 11 Tf <23205265706c616365207769746820796f757220706572736f6e616c204d616c77617265706174726f6c2072656365697074> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 186.365 Td /F3.0 11 Tf <72656365697074203d206162636431323334> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 156.885 Td /F3.0 11 Tf <5b73616e6573656375726974795d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 142.145 Td /F3.0 11 Tf <656e61626c6564203d20796573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 127.405 Td /F3.0 11 Tf <23205573652061206e6f6e2d64656661756c74206d6972726f72> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 112.665 Td /F3.0 11 Tf <707265666978203d2068747470733a2f2f6d6972726f722e726f6c6c65726e65742e75732f73616e6573656375726974792f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 83.185 Td /F3.0 11 Tf <5b7365637572697465696e666f5d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 68.445 Td /F3.0 11 Tf <656e61626c6564203d20796573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 53.705 Td /F3.0 11 Tf <23205265706c616365207769746820796f757220706572736f6e616c205365637572697465496e666f20637573746f6d6572204944> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp1 Do Q Q endstream endobj 49 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 48 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F2.0 8 0 R /F1.0 9 0 R /F3.0 25 0 R >> /XObject << /Stamp1 186 0 R >> >> /Annots [51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R] >> endobj 50 0 obj [49 0 R /XYZ 0 841.89 null] endobj 51 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://sigs.interserver.net/) >> /Subtype /Link /Rect [66.24 727.8 124.032 742.08] /Type /Annot >> endobj 52 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.malwarepatrol.net) >> /Subtype /Link /Rect [66.24 706.02 141.0315 720.3] /Type /Annot >> endobj 53 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://sanesecurity.com) >> /Subtype /Link /Rect [66.24 684.24 130.3215 698.52] /Type /Annot >> endobj 54 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.securiteinfo.com/services/anti-spam-anti-virus/improve-detection-rate-of-zero-day-malwares-for-clamav.shtml) >> /Subtype /Link /Rect [66.24 662.46 127.5495 676.74] /Type /Annot >> endobj 55 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://urlhaus.abuse.ch) >> /Subtype /Link /Rect [66.24 640.68 111.1275 654.96] /Type /Annot >> endobj 56 0 obj << /Border [0 0 0] /Dest (ffnews) /Subtype /Link /Rect [274.6974 612.9 333.41401 627.18] /Type /Annot >> endobj 57 0 obj << /Length 11713 >> stream q q /DeviceRGB cs 0.96078 0.96078 0.96078 scn 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 725.19 l 547.04 722.98086 545.24914 721.19 543.04 721.19 c 52.24 721.19 l 50.03086 721.19 48.24 722.98086 48.24 725.19 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h f /DeviceRGB CS 0.8 0.8 0.8 SCN 0.75 w 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 725.19 l 547.04 722.98086 545.24914 721.19 543.04 721.19 c 52.24 721.19 l 50.03086 721.19 48.24 722.98086 48.24 725.19 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h S Q q /DeviceRGB CS 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 805.89 m 542.29 805.89 l S Q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 59.24 794.065 Td /F3.0 11 Tf <637573746f6d65725f6964203d20616263646566313233343536> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 764.585 Td /F3.0 11 Tf <5b75726c686175735d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 749.845 Td /F3.0 11 Tf <656e61626c6564203d20796573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 735.105 Td /F3.0 11 Tf <6d61785f73697a65203d20324d42> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 685.166 Td /F2.0 18 Tf <352e322e20557365722d646566696e65642070726f766964657273> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.39942 Tw BT 48.24 657.146 Td /F1.0 10.5 Tf [<46> 40.03906 <616e67667269736368206973206f6620636f75727365206e6f74206c696d6974656420746f2074686520696e7465726e616c2064656661756c74732e2059> 69.82422 <6f752063616e20646566696e65206173206d616e> 20.01953 <79206164646974696f6e616c207669727573>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 641.366 Td /F1.0 10.5 Tf [<646566696e6974696f6e2070726f76696465727320617320796f75206c696b> 20.01953 <652e2054686520666f6c6c6f77696e6720646566696e657320612066696374696f6e616c2070726f76696465723a>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.96078 0.96078 0.96078 scn 52.24 625.55 m 543.04 625.55 l 545.24914 625.55 547.04 623.75914 547.04 621.55 c 547.04 371.71 l 547.04 369.50086 545.24914 367.71 543.04 367.71 c 52.24 367.71 l 50.03086 367.71 48.24 369.50086 48.24 371.71 c 48.24 621.55 l 48.24 623.75914 50.03086 625.55 52.24 625.55 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 625.55 m 543.04 625.55 l 545.24914 625.55 547.04 623.75914 547.04 621.55 c 547.04 371.71 l 547.04 369.50086 545.24914 367.71 543.04 367.71 c 52.24 367.71 l 50.03086 367.71 48.24 369.50086 48.24 371.71 c 48.24 621.55 l 48.24 623.75914 50.03086 625.55 52.24 625.55 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 602.725 Td /F3.0 11 Tf <5b66696374696f6e616c70726f76696465725d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 587.985 Td /F3.0 11 Tf <656e61626c6564203d20796573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 573.245 Td /F3.0 11 Tf <696e746567726974795f636865636b203d206d6435> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 558.505 Td /F3.0 11 Tf <696e74657276616c203d2039306d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 543.765 Td /F3.0 11 Tf <707265666978203d20687474703a2f2f66696374696f6e616c2d70726f76696465722e746c642f636c616d61762d756e6f6666696369616c2f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 514.285 Td /F3.0 11 Tf <23205265666572656e63652074686520646566696e65642070726566697820696e2055524c20646566696e6974696f6e732e2056616c75657320696e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 499.545 Td /F3.0 11 Tf <23206f746865722073656374696f6e732063616e206265207265666572656e636564207573696e6720247b73656374696f6e3a6f7074696f6e7d2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 484.805 Td /F3.0 11 Tf <75726c5f65676773203d20247b7072656669787d656767732e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 470.065 Td /F3.0 11 Tf <75726c5f7370616d203d20247b7072656669787d7370616d2e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 440.585 Td /F3.0 11 Tf <23204f76657272696465206c6f63616c2066696c65206e616d6520666f722075726c5f7370616d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 425.845 Td /F3.0 11 Tf <66696c656e616d655f7370616d203d207370616d5f7370616d5f7370616d5f6c6f76656c795f7370616d2e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 396.365 Td /F3.0 11 Tf <23204578656375746520636f6d6d616e64206166746572206561636820667265736820646f776e6c6f61642066726f6d2075726c5f65676773> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 381.625 Td /F3.0 11 Tf <6f6e5f7570646174655f65676773203d206563686f204672657368206567677320696e207b706174687d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 331.686 Td /F2.0 18 Tf <352e332e2053656d616e74696373> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.13061 Tw BT 48.24 303.666 Td /F1.0 10.5 Tf [<46> 40.03906 <616e676672697363682077696c6c207363616e20656e61626c65642073656374696f6e7320666f72206c696e6573207072656669786564207769746820>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.13061 Tw BT 361.04607 303.666 Td /F3.0 10.5 Tf <75726c5f> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.13061 Tw BT 382.04607 303.666 Td /F1.0 10.5 Tf <20746f2064657465726d696e6520646f776e6c6f616420736f7572636573> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 287.886 Td /F1.0 10.5 Tf <666f7220766972757320646566696e6974696f6e2066696c65732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 260.106 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 1.02615 Tw BT 66.24 260.106 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.02615 Tw BT 66.24 260.106 Td /F1.0 10.5 Tf <5468652076616c7565206f6620> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.02615 Tw BT 133.62046 260.106 Td /F3.0 10.5 Tf <696e746567726974795f636865636b> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.02615 Tw BT 212.37046 260.106 Td /F1.0 10.5 Tf <2064657465726d696e657320626f7468207468652065787065637465642066696c656e616d652073756666697820666f72206469676573747320616e6420746865> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 244.326 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 244.326 Td /F1.0 10.5 Tf <68617368696e67206d656368616e69736d207573656420666f7220766572696669636174696f6e2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 222.546 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 2.41896 Tw BT 66.24 222.546 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.41896 Tw BT 66.24 222.546 Td /F1.0 10.5 Tf [<4c6f63616c2066696c65206e616d65732077696c6c2062652064657465726d696e65642062> 20.01953 <792070617273696e672055524c732c206275742063616e206265206d616e75616c6c79206f76657272696464656e2e2054> 29.78516 <6f>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 206.766 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 206.766 Td /F1.0 10.5 Tf <6368616e6765207468652066696c65206e616d6520666f7220> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN BT 190.749 206.766 Td /F3.0 10.5 Tf <75726c5f78797a> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 227.499 206.766 Td /F1.0 10.5 Tf <2c2073657420> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN BT 249.612 206.766 Td /F3.0 10.5 Tf <66696c656e616d655f78797a> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 312.612 206.766 Td /F1.0 10.5 Tf <20746f2074686520646573697265642076616c75652e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 184.986 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 3.53085 Tw BT 66.24 184.986 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.53085 Tw BT 66.24 184.986 Td /F1.0 10.5 Tf [<54> 29.78516 <6f206c61756e6368206120636f6d6d616e6420616674657220646174612077617320646f776e6c6f6164656420666f7220>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 3.53085 Tw BT 367.67044 184.986 Td /F3.0 10.5 Tf <75726c5f78797a> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.53085 Tw BT 404.42044 184.986 Td /F1.0 10.5 Tf <2c20646566696e6520> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 3.53085 Tw BT 451.21415 184.986 Td /F3.0 10.5 Tf <6f6e5f7570646174655f78797a> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.53085 Tw BT 519.46415 184.986 Td /F1.0 10.5 Tf <2e20546865> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.63037 Tw BT 66.24 169.206 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.63037 Tw BT 66.24 169.206 Td /F1.0 10.5 Tf [<636f6d6d616e6420737472696e67206d61> 20.01953 <7920636f6e7461696e206120>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 0.63037 Tw BT 227.43765 169.206 Td /F3.0 10.5 Tf <7b706174687d> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.63037 Tw BT 258.93765 169.206 Td /F1.0 10.5 Tf <20706c616365686f6c6465722c2077686963682077696c6c2062652073756273746974757465642077697468207468652066756c6c2070617468> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 153.426 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 153.426 Td /F1.0 10.5 Tf <6f662074686520646f776e6c6f616465642066696c652e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.02797 Tw BT 48.24 125.646 Td /F1.0 10.5 Tf [<59> 69.82422 <6f752063616e2064697361626c652072656672657368206f706572> 20.01953 <6174696f6e7320666f722073656c65637465642055524c732062> 20.01953 <792061737369676e696e672065697468657220616e20656d7074792076616c7565206f722073657474696e67206974>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.16565 Tw BT 48.24 109.866 Td /F1.0 10.5 Tf <746f20> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 2.16565 Tw BT 62.87965 109.866 Td /F3.0 10.5 Tf <75726c5f78797a203d2064697361626c6564> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.16565 Tw BT 161.71094 109.866 Td /F1.0 10.5 Tf <2e204e6f746520746861742064697361626c696e672055524c7320696e2074686973206d616e6e657220646f657320> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.16565 Tw BT 414.52226 109.866 Td /F4.0 10.5 Tf <6e6f74> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.16565 Tw BT 430.70276 109.866 Td /F1.0 10.5 Tf [<2064656c65746520616e> 20.01953 <792070726576696f75736c79>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 94.086 Td /F1.0 10.5 Tf <646f776e6c6f616465642066696c65732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp2 Do Q Q endstream endobj 58 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 57 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F3.0 25 0 R /F2.0 8 0 R /F1.0 9 0 R /F4.0 61 0 R >> /XObject << /Stamp2 187 0 R >> >> >> endobj 59 0 obj [58 0 R /XYZ 0 709.19 null] endobj 60 0 obj [58 0 R /XYZ 0 355.71 null] endobj 61 0 obj << /Type /Font /BaseFont /e8f2e8+NotoSerif-Italic /Subtype /TrueType /FontDescriptor 201 0 R /FirstChar 32 /LastChar 255 /Widths 203 0 R /ToUnicode 202 0 R >> endobj 62 0 obj << /Length 11766 >> stream q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 48.24 786.666 Td /F2.0 18 Tf <352e342e2050726f787920737570706f7274> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.99297 Tw BT 48.24 758.646 Td /F1.0 10.5 Tf [<46> 40.03906 <616e676672697363682072656c696573206f6e2074686520>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.99297 Tw BT 172.22646 758.646 Td /F4.0 10.5 Tf <7265717565737473> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.99297 Tw BT 213.23946 758.646 Td /F1.0 10.5 Tf [<206c696272> 20.01953 <61727920746f20646f776e6c6f61642066696c65732c20776869636820737570706f72747320656e7669726f6e6d656e74207661726961626c6573>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.95292 Tw BT 48.24 742.866 Td /F1.0 10.5 Tf [<6c696b> 20.01953 <6520>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 0.95292 Tw BT 70.05621 742.866 Td /F3.0 10.5 Tf <48545450535f50524f5859> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.95292 Tw BT 127.80621 742.866 Td /F1.0 10.5 Tf <2e20506c6561736520726566657220746f20> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 0.95292 Tw BT 211.34438 742.866 Td /F1.0 10.5 Tf [<73656374696f6e2041> 20.01953 <6476616e6365642055736167652c2073756273656374696f6e2050726f78696573>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.95292 Tw BT 433.41934 742.866 Td /F1.0 10.5 Tf <20696e2074686520> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.95292 Tw BT 470.52908 742.866 Td /F4.0 10.5 Tf <7265717565737473> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.95292 Tw BT 511.54208 742.866 Td /F1.0 10.5 Tf <206f6e6c696e65> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 727.086 Td /F1.0 10.5 Tf <646f63756d656e746174696f6e20666f722064657461696c732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 682.974 Td /F2.0 22 Tf <362e20507265706172696e6720746865206461746162617365> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.27755 Tw BT 48.24 653.786 Td /F1.0 10.5 Tf [<416674657220636f6d706c6574696e672074686520636f6e6669677572> 20.01953 <6174696f6e2c206d616b> 20.01953 <65207375726520746f2063726561746520746865206461746162617365207374727563747572652062> 20.01953 <792072756e6e696e6720746865>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 3.35144 Tw BT 48.24 638.006 Td /F3.0 10.5 Tf <696e69746462> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.35144 Tw BT 79.74 638.006 Td /F1.0 10.5 Tf [<20636f6d6d616e6420696e206120726f6f74207368656c6c2061732073686f776e2062656c6f77> 69.82422 <2e2052756e6e696e6720>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 3.35144 Tw BT 369.96024 638.006 Td /F3.0 10.5 Tf <2d2d666f72636520696e69746462> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.35144 Tw BT 446.81168 638.006 Td /F1.0 10.5 Tf <2077696c6c2064726f70206578697374696e67> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 622.226 Td /F1.0 10.5 Tf [<6461746162617365207461626c65732e2046> 40.03906 <6f722053514c6974652c2064656c6574696e67207468652064617461626173652066696c65206973206120766961626c6520616c7465726e61746976652e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.96078 0.96078 0.96078 scn 52.24 606.41 m 543.04 606.41 l 545.24914 606.41 547.04 604.61914 547.04 602.41 c 547.04 573.67 l 547.04 571.46086 545.24914 569.67 543.04 569.67 c 52.24 569.67 l 50.03086 569.67 48.24 571.46086 48.24 573.67 c 48.24 602.41 l 48.24 604.61914 50.03086 606.41 52.24 606.41 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 606.41 m 543.04 606.41 l 545.24914 606.41 547.04 604.61914 547.04 602.41 c 547.04 573.67 l 547.04 571.46086 545.24914 569.67 543.04 569.67 c 52.24 569.67 l 50.03086 569.67 48.24 571.46086 48.24 573.67 c 48.24 602.41 l 48.24 604.61914 50.03086 606.41 52.24 606.41 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 583.585 Td /F3.0 11 Tf <7375646f202d7520636c616d6176202d2d2066616e67667269736368202d2d636f6e66202f6574632f66616e676672697363682e636f6e6620696e69746462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.5 w 0.93333 0.93333 0.93333 SCN 137.84318 557.67 m 137.84318 518.11 l S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 533.816 Td /F2.0 10.5 Tf [<494d504f52> 20.01953 <54> 60.05859 <414e54>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.24325 Tw BT 149.84318 541.706 Td /F1.0 10.5 Tf [<46> 40.03906 <616e67667269736368206e656564206e657665722062652072756e20617320726f6f742e2043686f6f736520616e20756e70726976696c65676564207573657220696e7374656164>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 149.84318 525.926 Td /F1.0 10.5 Tf <287479706963616c6c7920> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 199.09868 525.926 Td /F2.0 10.5 Tf <636c616d6176> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 237.59168 525.926 Td /F1.0 10.5 Tf <292e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 477.814 Td /F2.0 22 Tf <372e205573616765> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 448.626 Td /F1.0 10.5 Tf [<59> 69.82422 <6f752063616e20646973706c61> 20.01953 <7920636f6d6d616e64206c696e6520617267756d656e747320617320666f6c6c6f77733a>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.96078 0.96078 0.96078 scn 52.24 432.81 m 543.04 432.81 l 545.24914 432.81 547.04 431.01914 547.04 428.81 c 547.04 178.97 l 547.04 176.76086 545.24914 174.97 543.04 174.97 c 52.24 174.97 l 50.03086 174.97 48.24 176.76086 48.24 178.97 c 48.24 428.81 l 48.24 431.01914 50.03086 432.81 52.24 432.81 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 432.81 m 543.04 432.81 l 545.24914 432.81 547.04 431.01914 547.04 428.81 c 547.04 178.97 l 547.04 176.76086 545.24914 174.97 543.04 174.97 c 52.24 174.97 l 50.03086 174.97 48.24 176.76086 48.24 178.97 c 48.24 428.81 l 48.24 431.01914 50.03086 432.81 52.24 432.81 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 409.985 Td /F3.0 11 Tf <242066616e67667269736368202d2d68656c70> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 380.505 Td /F3.0 11 Tf <75736167653a2066616e67667269736368205b2d685d205b2d6320434f4e465d205b2d665d205b2d702050524f56494445525d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 365.765 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 336.285 Td /F3.0 11 Tf <55706461746520616e642076657269667920756e6f6666696369616c20436c616d4156207369676e6174757265732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 306.805 Td /F3.0 11 Tf <706f736974696f6e616c20617267756d656e74733a> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 292.065 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 262.585 Td /F3.0 11 Tf <6f7074696f6e733a> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 247.845 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 233.105 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 218.365 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 203.625 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 188.885 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 151.006 Td /F1.0 10.5 Tf [<59> 69.82422 <6f752063616e2063686f6f736520616d6f6e6720666f6c6c6f77696e6720616374696f6e733a>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 123.226 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 1.51343 Tw BT 66.24 123.226 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.51343 Tw BT 66.24 123.226 Td /F2.0 10.5 Tf <64756d70636f6e66> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.51343 Tw BT 120.3675 123.226 Td /F1.0 10.5 Tf [<3a2044756d70207468652065666665637469766520636f6e6669677572> 20.01953 <6174696f6e20746f207374646f75742c20636f6d62696e696e6720626f746820696e7465726e616c2064656661756c747320616e64>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.05775 Tw BT 66.24 107.446 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.05775 Tw BT 66.24 107.446 Td /F1.0 10.5 Tf [<796f7572206f776e2073657474696e67732e205468652065666665637469766520636f6e6669677572> 20.01953 <6174696f6e20666f7220746865206578616d706c652073686f776e20696e20>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 0.05775 Tw BT 429.79701 107.446 Td /F1.0 10.5 Tf <53656374696f6e2035> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.05775 Tw BT 474.80526 107.446 Td /F1.0 10.5 Tf <20697320617661696c61626c6520696e> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 91.666 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 91.666 Td ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 66.24 91.666 Td /F1.0 10.5 Tf <417070656e6469782042> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 124.3365 91.666 Td /F1.0 10.5 Tf <2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 69.886 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 1.48668 Tw BT 66.24 69.886 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.48668 Tw BT 66.24 69.886 Td /F2.0 10.5 Tf <64756d706d617070696e6773> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.48668 Tw BT 149.0115 69.886 Td /F1.0 10.5 Tf <3a2044756d702055524c2d746f2d66696c6570617468206d617070696e67732c206173207265636f7264656420696e207468652064617461626173652072656672657368206c6f672c20746f> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 54.106 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 54.106 Td /F1.0 10.5 Tf <7374646f75742e2053656520> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 122.52 54.106 Td /F1.0 10.5 Tf <417070656e6469782044> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 181.3935 54.106 Td /F1.0 10.5 Tf <20666f722064657461696c732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp1 Do Q Q endstream endobj 63 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 62 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F2.0 8 0 R /F1.0 9 0 R /F4.0 61 0 R /F3.0 25 0 R >> /XObject << /Stamp1 186 0 R >> >> /Annots [65 0 R 68 0 R 69 0 R 70 0 R] >> endobj 64 0 obj [63 0 R /XYZ 0 841.89 null] endobj 65 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://requests.readthedocs.io/en/latest/user/advanced/#proxies) >> /Subtype /Link /Rect [211.34438 739.8 433.41934 754.08] /Type /Annot >> endobj 66 0 obj [63 0 R /XYZ 0 711.27 null] endobj 67 0 obj [63 0 R /XYZ 0 506.11 null] endobj 68 0 obj << /Border [0 0 0] /Dest (_configuration) /Subtype /Link /Rect [429.79701 104.38 474.80526 118.66] /Type /Annot >> endobj 69 0 obj << /Border [0 0 0] /Dest (sampleeff) /Subtype /Link /Rect [66.24 88.6 124.3365 102.88] /Type /Annot >> endobj 70 0 obj << /Border [0 0 0] /Dest (dbstructure) /Subtype /Link /Rect [122.52 51.04 181.3935 65.32] /Type /Annot >> endobj 71 0 obj << /Length 11809 >> stream q -0.5 Tc 0.0 Tc -0.5 Tc /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 56.8805 793.926 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 1.08673 Tw BT 66.24 793.926 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.08673 Tw BT 66.24 793.926 Td /F2.0 10.5 Tf <696e69746462> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.08673 Tw BT 98.475 793.926 Td /F1.0 10.5 Tf <3a2043726561746520746865206461746162617365207374727563747572652e2054686973206e6565647320746f2062652072756e206f6e6c79206f6e63652c206265666f72652074686520666972737420726566726573682e> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 778.146 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 778.146 Td /F1.0 10.5 Tf <5573696e672074686520> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN BT 115.674 778.146 Td /F3.0 10.5 Tf <2d2d666f726365> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 152.424 778.146 Td /F1.0 10.5 Tf <206f7074696f6e2077696c6c2064726f70206578697374696e67207461626c65732066726f6d207468652064617461626173652e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 56.8805 756.366 Td /F1.0 10.5 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc 1.69896 Tw BT 66.24 756.366 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.69896 Tw BT 66.24 756.366 Td /F2.0 10.5 Tf <72656672657368> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.69896 Tw BT 105.552 756.366 Td /F1.0 10.5 Tf <3a20526566726573682074686520636f6e666967757265642055524c732e2054686520> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.69896 Tw BT 290.88577 756.366 Td /F3.0 10.5 Tf <2d2d666f726365> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.69896 Tw BT 327.63577 756.366 Td /F1.0 10.5 Tf <206f7074696f6e2063616e206265207573656420746f206f7665727269646520646f776e6c6f6164> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 66.24 740.586 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 740.586 Td /F1.0 10.5 Tf <696e74657276616c2073657474696e67732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.5428 Tw BT 48.24 712.806 Td /F1.0 10.5 Tf [<417320737461746564206265666f72652c2046> 40.03906 <616e67667269736368206973207479706963616c6c792072756e207573696e672063726f6e2e20446570656e64696e67206f6e20796f757220686f7374204f532c20796f75206d61> 20.01953 <79207573652061>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 697.026 Td /F1.0 10.5 Tf [<73797374656d642074696d657220617320616e20616c7465726e61746976652e20416e206578616d706c652063726f6e746162206c6f6f6b73206c696b> 20.01953 <6520746869733a>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.96078 0.96078 0.96078 scn 52.24 681.21 m 543.04 681.21 l 545.24914 681.21 547.04 679.41914 547.04 677.21 c 547.04 589.51 l 547.04 587.30086 545.24914 585.51 543.04 585.51 c 52.24 585.51 l 50.03086 585.51 48.24 587.30086 48.24 589.51 c 48.24 677.21 l 48.24 679.41914 50.03086 681.21 52.24 681.21 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 681.21 m 543.04 681.21 l 545.24914 681.21 547.04 679.41914 547.04 677.21 c 547.04 589.51 l 547.04 587.30086 545.24914 585.51 543.04 585.51 c 52.24 585.51 l 50.03086 585.51 48.24 587.30086 48.24 589.51 c 48.24 677.21 l 48.24 679.41914 50.03086 681.21 52.24 681.21 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 658.385 Td /F3.0 11 Tf <484f4d453d2f7661722f6c69622f66616e67667269736368> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 643.645 Td /F3.0 11 Tf <4c4f475f4c4556454c3d494e464f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 628.905 Td /F3.0 11 Tf <23206d696e75746520686f7572206461792d6f662d6d6f6e7468206d6f6e7468206461792d6f662d7765656b207573657220636f6d6d616e64> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 614.165 Td /F3.0 11 Tf <2a2f3130202a202a202a202a20636c616d617620736c6565702024282852414e444f4d205c2520343229293b2076656e762f62696e2f66616e67667269736368202d2d636f6e66> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 599.425 Td /F3.0 11 Tf <2f6574632f66616e676672697363682e636f6e662072656672657368> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 545.214 Td /F2.0 22 Tf <382e20537570706f7274> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.1336 Tw BT 48.24 516.026 Td /F1.0 10.5 Tf <5468652070726f6a65637420697320686f73746564206f6e20> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 2.1336 Tw BT 180.3825 516.026 Td /F1.0 10.5 Tf <476974487562> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.1336 Tw BT 216.324 516.026 Td /F1.0 10.5 Tf [<2e204265666f7265206f70656e696e67207469636b> 20.01953 <657473206f7220636f6e74616374696e672074686520617574686f722c20>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.1336 Tw BT 479.3236 516.026 Td /F4.0 10.5 Tf [<616c7761> 20.01953 <7973>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.1336 Tw BT 513.4484 516.026 Td /F1.0 10.5 Tf <20636865636b> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 1.26314 Tw BT 48.24 500.246 Td /F1.0 10.5 Tf <6578697374696e6720697373756573> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.26314 Tw BT 121.29164 500.246 Td /F1.0 10.5 Tf [<2066697273742c20696e636c7564696e6720636c6f736564206f6e65732e2054686973206973206e6f74206d65616e7420746f20646973636f7572> 20.01953 <61676520796f753b206974206a7573742073617665732074696d65>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.37743 Tw BT 48.24 484.466 Td /F1.0 10.5 Tf <616e64206566666f727420666f7220616c6c20696e766f6c7665642e20506c6561736520636f6e746163742074686520617574686f7220> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 1.37743 Tw BT 323.6619 484.466 Td /F1.0 10.5 Tf <52616c7068205365696368746572> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.37743 Tw BT 397.63633 484.466 Td /F1.0 10.5 Tf <206f6e6c7920616674657220686176696e6720646f6e6520796f7572> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 468.686 Td /F1.0 10.5 Tf [<227265736561726368> 40.03906 <222e205468616e6b20796f752e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 428.846 Td /F2.0 18 Tf <382e312e205265706f7274696e6720706f737369626c652070726f626c656d73> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.80095 Tw BT 48.24 400.826 Td /F1.0 10.5 Tf [<496620796f7520657870657269656e63652070726f626c656d732c20706c656173652073746172742062> 20.01953 <7920747279696e6720746f20666967757265206f757420756e6465726c79696e6720697373756573206f6e20796f7572206f776e2e>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.18813 Tw BT 48.24 385.046 Td /F1.0 10.5 Tf <52756e6e696e672077697468204445425547206c6576656c206c6f6767696e672068656c7073207769746820746861742e2053686f756c6420796f7572206566666f727473206661696c2c20636f6e73696465722066696c696e67206120476974487562> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 369.266 Td /F1.0 10.5 Tf [<69737375652e2045616368206973737565206e6565647320746f20616e7377657220746865207175657374696f6e73206c69737465642062656c6f77> 69.82422 <2e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.51076 Tw BT 48.24 341.486 Td /F1.0 10.5 Tf <496620796f7520616e73776572207175657374696f6e206e756d62657220312c2032206f722033207769746820226e6f222c20646f206e6f742066696c6520616e2069737375652e20506c6561736520616e7377657220616c6c206f74686572> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 325.706 Td /F1.0 10.5 Tf <7175657374696f6e732061732064657461696c656420617320796f752063616e2c2077697468696e20726561736f6e2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 52.6765 297.926 Td /F1.0 10.5 Tf <312e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 297.926 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 297.926 Td /F1.0 10.5 Tf [<4861766520796f7520636865636b> 20.01953 <65642074686520646f63756d656e746174696f6e3f>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 52.6765 276.146 Td /F1.0 10.5 Tf <322e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 276.146 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 276.146 Td /F1.0 10.5 Tf [<4861766520796f7520636865636b> 20.01953 <656420616c6c206578697374696e67206973737565732c20696e636c7564696e6720636c6f736564206f6e65733f>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 52.6765 254.366 Td /F1.0 10.5 Tf <332e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 254.366 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 254.366 Td /F1.0 10.5 Tf <4861766520796f7520646f6e6520796f757220706572736f6e616c206265737420746f207265736f6c766520746865206973737565206f6e20796f7572206f776e3f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 52.6765 232.586 Td /F1.0 10.5 Tf <342e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 232.586 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 232.586 Td /F1.0 10.5 Tf <576861742065786163746c792064696420796f7520646f3f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 52.6765 210.806 Td /F1.0 10.5 Tf <352e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 210.806 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 210.806 Td /F1.0 10.5 Tf <576861742064696420796f752065787065637420746f2068617070656e3f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 52.6765 189.026 Td /F1.0 10.5 Tf <362e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 189.026 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 189.026 Td /F1.0 10.5 Tf <576861742068617070656e656420696e73746561643f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 52.6765 167.246 Td /F1.0 10.5 Tf <372e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 167.246 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 167.246 Td /F1.0 10.5 Tf [<576861742077617320796f757220657861637420736574757020286f706572> 20.01953 <6174696e672073797374656d2c20507974686f6e20636f72652076657273696f6e2c20507974686f6e206d6f64756c652076657273696f6e73293f>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 127.406 Td /F2.0 18 Tf <382e322e204f66666572696e672073756767657374696f6e73> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 99.386 Td /F1.0 10.5 Tf <546865206c697374206f66207175657374696f6e732069732073686f727465722c2062757420696d706f7274616e74206e6f6e657468656c6573733a> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 52.6765 71.606 Td /F1.0 10.5 Tf <312e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 71.606 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 71.606 Td /F1.0 10.5 Tf [<4861766520796f7520636865636b> 20.01953 <65642074686520646f63756d656e746174696f6e3f>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp2 Do Q Q endstream endobj 72 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 71 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 9 0 R /F2.0 8 0 R /F3.0 25 0 R /F4.0 61 0 R >> /XObject << /Stamp2 187 0 R >> >> /Annots [74 0 R 75 0 R 76 0 R] >> endobj 73 0 obj [72 0 R /XYZ 0 573.51 null] endobj 74 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rseichter/fangfrisch) >> /Subtype /Link /Rect [180.3825 512.96 216.324 527.24] /Type /Annot >> endobj 75 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rseichter/fangfrisch/issues) >> /Subtype /Link /Rect [48.24 497.18 121.29164 511.46] /Type /Annot >> endobj 76 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (mailto:fangfrisch@seichter.de) >> /Subtype /Link /Rect [323.6619 481.4 397.63633 495.68] /Type /Annot >> endobj 77 0 obj [72 0 R /XYZ 0 452.87 null] endobj 78 0 obj [72 0 R /XYZ 0 151.43 null] endobj 79 0 obj << /Length 10726 >> stream q -0.5 Tc 0.0 Tc -0.5 Tc /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 52.6765 793.926 Td /F1.0 10.5 Tf <322e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 793.926 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 793.926 Td /F1.0 10.5 Tf [<4861766520796f7520636865636b> 20.01953 <656420616c6c206578697374696e67206973737565732c20696e636c7564696e6720636c6f736564206f6e65733f>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 52.6765 772.146 Td /F1.0 10.5 Tf <332e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 772.146 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 772.146 Td /F1.0 10.5 Tf <446f20796f7520636f6e7369646572207468652073756767657374656420666561747572652068656c7066756c20666f72206d6f72652070656f706c65207468616e206a75737420796f757273656c663f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.31273 Tw BT 48.24 744.366 Td /F1.0 10.5 Tf <496620796f7520616e73776572656420227965732220666f7220616c6c207175657374696f6e732c20706c65617365206578706c61696e20796f7572206964656120696e20612073756666696369656e746c792074686f726f756768206d616e6e65722e> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.27582 Tw BT 48.24 728.586 Td /F1.0 10.5 Tf [<557365206578616d706c65732c206772> 20.01953 <6170686963732c20616e6420776861746576657220656c736520796f75207468696e6b20776f756c642068656c70206f746865727320746f20756e6465727374616e6420796f7572>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 712.806 Td /F1.0 10.5 Tf <73756767657374696f6e2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 672.966 Td /F2.0 18 Tf <382e332e2044697363757373696f6e20707265636564657320636f6e747269627574696f6e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.14959 Tw BT 48.24 644.946 Td /F1.0 10.5 Tf [<4920646f206e6f742061636365707420616e> 20.01953 <7920636f6465206f7220646f63756d656e746174696f6e20636f6e747269627574696f6e732077686963682068617665206e6f74206265656e2070726576696f75736c7920616772656564>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 629.166 Td /F1.0 10.5 Tf <75706f6e2e2054686973206d65616e7320746865206f72646572206f6620737465707320697320617320666f6c6c6f77733a> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 52.6765 601.386 Td /F1.0 10.5 Tf <312e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 601.386 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 601.386 Td /F1.0 10.5 Tf <4f70656e20616e206973737565206f722064697363757373696f6e20746f7069632066697273742e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 52.6765 579.606 Td /F1.0 10.5 Tf <322e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 579.606 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 579.606 Td /F1.0 10.5 Tf <48617665206120636f6e766572736174696f6e2061626f757420746865206d61747465722061742068616e642e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 52.6765 557.826 Td /F1.0 10.5 Tf <332e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 557.826 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 557.826 Td /F1.0 10.5 Tf <5265616368206120636f6e73656e7375732061626f757420626f746820666f726d20616e6420636f6e74656e74206f662074686520636f6e747269627574696f6e2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn -0.5 Tc 0.0 Tc -0.5 Tc 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 52.6765 536.046 Td /F1.0 10.5 Tf <342e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.0 Tc BT 66.24 536.046 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 536.046 Td /F1.0 10.5 Tf [<57> 49.80469 <61697420666f722061207961> 20.01953 <792f6e61> 20.01953 <79207369676e616c2066726f6d206d652e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.82879 Tw BT 48.24 508.266 Td /F1.0 10.5 Tf <506c6561736520646f20> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.82879 Tw BT 99.30008 508.266 Td /F4.0 10.5 Tf <6e6f74> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.82879 Tw BT 115.48058 508.266 Td /F1.0 10.5 Tf [<207375626d697420616e> 20.01953 <792070756c6c207265717565737473206265666f726520492061736b20666f72207468656d2c20617320746865792077696c6c20626520636c6f7365642e2054686973206f75746c696e65642c>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.91406 Tw BT 48.24 492.486 Td /F1.0 10.5 Tf [<70726f76656e207072> 20.01953 <6163746963652077696c6c20736176652074696d6520666f7220616c6c20696e766f6c7665642e205365652048656174686572204d634e616d6565d57320626c6f6720>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 0.91406 Tw BT 441.70252 492.486 Td /F1.0 10.5 Tf [<416c7761> 20.01953 <7973207374617274207769746820616e>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 48.24 476.706 Td /F1.0 10.5 Tf <6973737565> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 73.335 476.706 Td /F1.0 10.5 Tf <20666f72206d6f726520696e666f726d6174696f6e2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 432.594 Td /F2.0 22 Tf [<417070656e64697820413a2044656661756c7420636f6e6669677572> 20.01953 <6174696f6e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.14872 Tw BT 48.24 403.406 Td /F1.0 10.5 Tf [<46> 40.03906 <616e6766726973636820636f6e7461696e732074686520666f6c6c6f77696e6720696e7465726e616c20636f6e6669677572> 20.01953 <6174696f6e2073657474696e67732061732064656661756c74732e204173206120736166657479206d6561737572652c>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.25414 Tw BT 48.24 387.626 Td /F1.0 10.5 Tf [<616c6c2073656374696f6e73206172652064697361626c65642062> 20.01953 <792064656661756c742e20456e747269657320776974682074686520>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.25414 Tw BT 319.75903 387.626 Td /F3.0 10.5 Tf <2175726c5f> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.25414 Tw BT 346.00903 387.626 Td /F1.0 10.5 Tf [<207072656669782061726520696e636c7564656420666f72207265666572656e6365206f6e6c79> 89.84375 <2e>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.6274 Tw BT 48.24 371.846 Td /F1.0 10.5 Tf [<546865736520726570726573656e74206461746120736f757263657320776869636820617265206e6f74207265636f6d6d656e64656420666f722067656e6572> 20.01953 <616c207573652e20506f737369626c6520726561736f6e733a20536f6d65>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.26112 Tw BT 48.24 356.066 Td /F1.0 10.5 Tf <736f7572636573206861766520616e20656c657661746564207269736b206f662066616c736520706f736974697665732c20617265206e6f74206672656520746f207573652c206f7220636f6e7461696e206c656761637920646174612e20456e61626c696e67> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 340.286 Td /F1.0 10.5 Tf <612073656374696f6e2077696c6c206e6f7420656e61626c65207468657365207370656369616c6c7920707265666978656420656e74726965732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.96078 0.96078 0.96078 scn 52.24 324.47 m 543.04 324.47 l 545.24914 324.47 547.04 322.67914 547.04 320.47 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 320.47 l 48.24 322.67914 50.03086 324.47 52.24 324.47 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 324.47 m 543.04 324.47 l 545.24914 324.47 547.04 322.67914 547.04 320.47 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 320.47 l 48.24 322.67914 50.03086 324.47 52.24 324.47 c h S Q q 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 48.24 m 542.29 48.24 l S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 301.645 Td /F3.0 11 Tf <5b44454641554c545d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 286.905 Td /F3.0 11 Tf <636c65616e7570203d206175746f6d61746963> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 272.165 Td /F3.0 11 Tf <656e61626c6564203d2066616c7365> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 257.425 Td /F3.0 11 Tf <696e746567726974795f636865636b203d20736861323536> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 242.685 Td /F3.0 11 Tf <6c6f675f6c6576656c203d205741524e494e47> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 227.945 Td /F3.0 11 Tf <6c6f675f6d6574686f64203d20636f6e736f6c65> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 213.205 Td /F3.0 11 Tf <6d61785f73697a65203d2031304d42> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 183.725 Td /F3.0 11 Tf <5b66616e676672697363686e6577735d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 168.985 Td /F3.0 11 Tf <696e74657276616c203d20313268> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 154.245 Td /F3.0 11 Tf <6c6f63616c5f6469726563746f7279203d202f746d70> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 139.505 Td /F3.0 11 Tf <6d61785f73697a65203d203130304b42> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 124.765 Td /F3.0 11 Tf <736372697074203d202f706174682f746f2f66616e676672697363682d6861732d6e6577732e7368> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 110.025 Td /F3.0 11 Tf <6f6e5f7570646174655f65786563203d205b2021202d7820247b7363726970747d205d207c7c20247b7363726970747d20247b6c6f63616c5f6469726563746f72797d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 95.285 Td /F3.0 11 Tf <707265666978203d2068747470733a2f2f7777772e73656963687465722e64652f66616e676672697363682f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 80.545 Td /F3.0 11 Tf <75726c5f616c65727473203d20247b7072656669787d66616e676672697363685f616c657274732e747874> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 65.805 Td /F3.0 11 Tf <75726c5f6e657773203d20247b7072656669787d66616e676672697363685f6e6577732e747874> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp1 Do Q Q endstream endobj 80 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 79 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 9 0 R /F2.0 8 0 R /F4.0 61 0 R /F3.0 25 0 R >> /XObject << /Stamp1 186 0 R >> >> /Annots [82 0 R 83 0 R] >> endobj 81 0 obj [80 0 R /XYZ 0 696.99 null] endobj 82 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://about.gitlab.com/blog/2016/03/03/start-with-an-issue/) >> /Subtype /Link /Rect [441.70252 489.42 547.04 503.7] /Type /Annot >> endobj 83 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://about.gitlab.com/blog/2016/03/03/start-with-an-issue/) >> /Subtype /Link /Rect [48.24 473.64 73.335 487.92] /Type /Annot >> endobj 84 0 obj [80 0 R /XYZ 0 460.89 null] endobj 85 0 obj << /Length 9889 >> stream q q /DeviceRGB cs 0.96078 0.96078 0.96078 scn 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h f /DeviceRGB CS 0.8 0.8 0.8 SCN 0.75 w 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h S Q q /DeviceRGB CS 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 805.89 m 542.29 805.89 l S Q q /DeviceRGB CS 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 48.24 m 542.29 48.24 l S Q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 59.24 794.065 Td /F3.0 11 Tf <5b696e7465727365727665725d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 779.325 Td /F3.0 11 Tf <696e74657276616c203d203168> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 764.585 Td /F3.0 11 Tf <696e746567726974795f636865636b203d2064697361626c6564> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 749.845 Td /F3.0 11 Tf <6d61785f73697a65203d20354d42> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 735.105 Td /F3.0 11 Tf <707265666978203d20687474703a2f2f736967732e696e7465727365727665722e6e65742f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 720.365 Td /F3.0 11 Tf <2175726c5f7368656c6c5f686462203d20247b7072656669787d7368656c6c2e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 705.625 Td /F3.0 11 Tf <2175726c5f7368656c6c625f6462203d20247b7072656669787d7368656c6c622e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 690.885 Td /F3.0 11 Tf <75726c5f696e746572736572766572323536203d20247b7072656669787d696e7465727365727665723235362e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 676.145 Td /F3.0 11 Tf <75726c5f7368656c6c5f6c6462203d20247b7072656669787d7368656c6c2e6c6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 661.405 Td /F3.0 11 Tf <66696c656e616d655f7368656c6c5f6c6462203d20696e7465727365727665727368656c6c2e6c6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 646.665 Td /F3.0 11 Tf <75726c5f746f706c696e65203d20247b7072656669787d696e746572736572766572746f706c696e652e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 631.925 Td /F3.0 11 Tf <75726c5f77686974656c6973745f6670203d20247b7072656669787d77686974656c6973742e6670> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 617.185 Td /F3.0 11 Tf <66696c656e616d655f77686974656c6973745f6670203d20696e74657273657276657277686974656c6973742e6670> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 587.705 Td /F3.0 11 Tf <5b6d616c77617265706174726f6c5d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 572.965 Td /F3.0 11 Tf <696e74657276616c203d203164> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 558.225 Td /F3.0 11 Tf <696e746567726974795f636865636b203d2064697361626c6564> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 543.485 Td /F3.0 11 Tf <70726f64756374203d2038> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 528.745 Td /F3.0 11 Tf <72656365697074203d20796f755f666f72676f745f746f5f636f6e6669677572655f72656365697074> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 514.005 Td /F3.0 11 Tf <707265666978203d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 499.265 Td /F3.0 11 Tf <68747470733a2f2f6c697374732e6d616c77617265706174726f6c2e6e65742f6367692f67657466696c653f70726f647563743d247b70726f647563747d26726563656970743d247b726563656970747d266c697374> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 484.525 Td /F3.0 11 Tf <3d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 469.785 Td /F3.0 11 Tf <75726c5f636c616d61765f6261736963203d20247b7072656669787d636c616d61765f6261736963> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 455.045 Td /F3.0 11 Tf <66696c656e616d655f636c616d61765f6261736963203d206d616c77617265706174726f6c2e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 425.565 Td /F3.0 11 Tf <5b73616e6573656375726974795d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 410.825 Td /F3.0 11 Tf <696e74657276616c203d203168> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 396.085 Td /F3.0 11 Tf <707265666978203d20687474703a2f2f6d6972726f722e73656e74726965732e6f72672f73616e6573656375726974792f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 381.345 Td /F3.0 11 Tf <2175726c5f666f78686f6c655f616c6c5f636462203d20247b7072656669787d666f78686f6c655f616c6c2e636462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 366.605 Td /F3.0 11 Tf <2175726c5f666f78686f6c655f616c6c5f6e6462203d20247b7072656669787d666f78686f6c655f616c6c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 351.865 Td /F3.0 11 Tf <2175726c5f666f78686f6c655f6c696e6b73203d20247b7072656669787d666f78686f6c655f6c696e6b732e6c6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 337.125 Td /F3.0 11 Tf <2175726c5f666f78686f6c655f6d61696c203d20247b7072656669787d666f78686f6c655f6d61696c2e636462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 322.385 Td /F3.0 11 Tf <2175726c5f77696e6e6f775f70686973685f636f6d706c657465203d20247b7072656669787d77696e6e6f775f70686973685f636f6d706c6574652e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 307.645 Td /F3.0 11 Tf <75726c5f6261646d6163726f203d20247b7072656669787d6261646d6163726f2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 292.905 Td /F3.0 11 Tf <75726c5f626c75726c203d20247b7072656669787d626c75726c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 278.165 Td /F3.0 11 Tf <75726c5f626f66686c616e645f637261636b65645f75726c203d20247b7072656669787d626f66686c616e645f637261636b65645f55524c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 263.425 Td /F3.0 11 Tf <75726c5f626f66686c616e645f6d616c776172655f617474616368203d20247b7072656669787d626f66686c616e645f6d616c776172655f6174746163682e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 248.685 Td /F3.0 11 Tf <75726c5f626f66686c616e645f6d616c776172655f75726c203d20247b7072656669787d626f66686c616e645f6d616c776172655f55524c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 233.945 Td /F3.0 11 Tf <75726c5f626f66686c616e645f7068697368696e675f75726c203d20247b7072656669787d626f66686c616e645f7068697368696e675f55524c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 219.205 Td /F3.0 11 Tf <75726c5f666f78686f6c655f66696c656e616d65203d20247b7072656669787d666f78686f6c655f66696c656e616d652e636462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 204.465 Td /F3.0 11 Tf <75726c5f666f78686f6c655f67656e65726963203d20247b7072656669787d666f78686f6c655f67656e657269632e636462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 189.725 Td /F3.0 11 Tf <75726c5f666f78686f6c655f6a735f636462203d20247b7072656669787d666f78686f6c655f6a732e636462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 174.985 Td /F3.0 11 Tf <75726c5f666f78686f6c655f6a735f6e6462203d20247b7072656669787d666f78686f6c655f6a732e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 160.245 Td /F3.0 11 Tf <75726c5f6861636b696e677465616d203d20247b7072656669787d6861636b696e677465616d2e687362> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 145.505 Td /F3.0 11 Tf <75726c5f6a756e6b203d20247b7072656669787d6a756e6b2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 130.765 Td /F3.0 11 Tf <75726c5f6a75726c626c203d20247b7072656669787d6a75726c626c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 116.025 Td /F3.0 11 Tf <75726c5f6a75726c626c61203d20247b7072656669787d6a75726c626c612e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 101.285 Td /F3.0 11 Tf <75726c5f6c6f7474203d20247b7072656669787d6c6f74742e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 86.545 Td /F3.0 11 Tf <75726c5f6d616c776172656578706572745f6670203d20247b7072656669787d6d616c776172652e6578706572742e6670> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 71.805 Td /F3.0 11 Tf <75726c5f6d616c776172656578706572745f686462203d20247b7072656669787d6d616c776172652e6578706572742e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 57.065 Td /F3.0 11 Tf <75726c5f6d616c776172656578706572745f6c6462203d20247b7072656669787d6d616c776172652e6578706572742e6c6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp2 Do Q Q endstream endobj 86 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 85 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F3.0 25 0 R >> /XObject << /Stamp2 187 0 R >> >> >> endobj 87 0 obj << /Length 9890 >> stream q q /DeviceRGB cs 0.96078 0.96078 0.96078 scn 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 135.59 l 547.04 133.38086 545.24914 131.59 543.04 131.59 c 52.24 131.59 l 50.03086 131.59 48.24 133.38086 48.24 135.59 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h f /DeviceRGB CS 0.8 0.8 0.8 SCN 0.75 w 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 135.59 l 547.04 133.38086 545.24914 131.59 543.04 131.59 c 52.24 131.59 l 50.03086 131.59 48.24 133.38086 48.24 135.59 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h S Q q /DeviceRGB CS 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 805.89 m 542.29 805.89 l S Q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 59.24 794.065 Td /F3.0 11 Tf <75726c5f6d616c776172656578706572745f6e6462203d20247b7072656669787d6d616c776172652e6578706572742e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 779.325 Td /F3.0 11 Tf <75726c5f6d616c7761726568617368203d20247b7072656669787d6d616c77617265686173682e687362> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 764.585 Td /F3.0 11 Tf <75726c5f7068697368203d20247b7072656669787d70686973682e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 749.845 Td /F3.0 11 Tf <75726c5f706869736874616e6b203d20247b7072656669787d706869736874616e6b2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 735.105 Td /F3.0 11 Tf <75726c5f706f72637570696e65203d20247b7072656669787d706f72637570696e652e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 720.365 Td /F3.0 11 Tf <75726c5f726f677565203d20247b7072656669787d726f6775652e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 705.625 Td /F3.0 11 Tf <75726c5f7363616d203d20247b7072656669787d7363616d2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 690.885 Td /F3.0 11 Tf <75726c5f7368656c746572203d20247b7072656669787d7368656c7465722e6c6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 676.145 Td /F3.0 11 Tf <75726c5f73696777686974656c697374203d20247b7072656669787d73696777686974656c6973742e69676e32> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 661.405 Td /F3.0 11 Tf <75726c5f7370616d617474616368203d20247b7072656669787d7370616d6174746163682e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 646.665 Td /F3.0 11 Tf <75726c5f7370616d696d67203d20247b7072656669787d7370616d696d672e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 631.925 Td /F3.0 11 Tf <75726c5f7370656172203d20247b7072656669787d73706561722e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 617.185 Td /F3.0 11 Tf <75726c5f73706561726c203d20247b7072656669787d73706561726c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 602.445 Td /F3.0 11 Tf <75726c5f737366746d203d20247b7072656669787d73616e6573656375726974792e66746d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 587.705 Td /F3.0 11 Tf <75726c5f77696e6e6f775f6174746163686d656e7473203d20247b7072656669787d77696e6e6f772e6174746163686d656e74732e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 572.965 Td /F3.0 11 Tf <75726c5f77696e6e6f775f6261645f6377203d20247b7072656669787d77696e6e6f775f6261645f63772e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 558.225 Td /F3.0 11 Tf <75726c5f77696e6e6f775f657874656e6465645f6d616c77617265203d20247b7072656669787d77696e6e6f775f657874656e6465645f6d616c776172652e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 543.485 Td /F3.0 11 Tf <75726c5f77696e6e6f775f657874656e6465645f6d616c776172655f6c696e6b73203d20247b7072656669787d77696e6e6f775f657874656e6465645f6d616c776172655f6c696e6b732e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 528.745 Td /F3.0 11 Tf <75726c5f77696e6e6f775f6d616c77617265203d20247b7072656669787d77696e6e6f775f6d616c776172652e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 514.005 Td /F3.0 11 Tf <75726c5f77696e6e6f775f6d616c776172655f6c696e6b73203d20247b7072656669787d77696e6e6f775f6d616c776172655f6c696e6b732e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 499.265 Td /F3.0 11 Tf <75726c5f77696e6e6f775f70686973685f636f6d706c6574655f75726c203d20247b7072656669787d77696e6e6f775f70686973685f636f6d706c6574655f75726c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 484.525 Td /F3.0 11 Tf <75726c5f77696e6e6f775f7370616d5f636f6d706c657465203d20247b7072656669787d77696e6e6f775f7370616d5f636f6d706c6574652e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 455.045 Td /F3.0 11 Tf <5b7365637572697465696e666f5d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 440.305 Td /F3.0 11 Tf <637573746f6d65725f6964203d20796f755f666f72676f745f746f5f636f6e6669677572655f637573746f6d65725f6964> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 425.565 Td /F3.0 11 Tf <696e74657276616c203d203168> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 410.825 Td /F3.0 11 Tf <6d61785f73697a65203d2032304d42> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 396.085 Td /F3.0 11 Tf <707265666978203d2068747470733a2f2f7777772e7365637572697465696e666f2e636f6d2f6765742f7369676e6174757265732f247b637573746f6d65725f69647d2f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 381.345 Td /F3.0 11 Tf <2175726c5f30686f7572203d20247b7072656669787d7365637572697465696e666f30686f75722e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 366.605 Td /F3.0 11 Tf <2175726c5f6f6c64203d20247b7072656669787d7365637572697465696e666f6f6c642e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 351.865 Td /F3.0 11 Tf <2175726c5f7365637572697465696e666f5f6d6462203d20247b7072656669787d7365637572697465696e666f2e6d6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 337.125 Td /F3.0 11 Tf <2175726c5f7365637572697465696e666f5f706462203d20247b7072656669787d7365637572697465696e666f2e706462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 322.385 Td /F3.0 11 Tf <2175726c5f7365637572697465696e666f5f79617261203d20247b7072656669787d7365637572697465696e666f2e79617261> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 307.645 Td /F3.0 11 Tf <75726c5f616e64726f6964203d20247b7072656669787d7365637572697465696e666f616e64726f69642e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 292.905 Td /F3.0 11 Tf <75726c5f6173636969203d20247b7072656669787d7365637572697465696e666f61736369692e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 278.165 Td /F3.0 11 Tf <75726c5f68746d6c203d20247b7072656669787d7365637572697465696e666f68746d6c2e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 263.425 Td /F3.0 11 Tf <75726c5f6a617661736372697074203d20247b7072656669787d6a6176617363726970742e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 248.685 Td /F3.0 11 Tf <75726c5f706466203d20247b7072656669787d7365637572697465696e666f7064662e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 233.945 Td /F3.0 11 Tf <75726c5f7365637572697465696e666f203d20247b7072656669787d7365637572697465696e666f2e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 219.205 Td /F3.0 11 Tf <75726c5f7365637572697465696e666f5f69676e32203d20247b7072656669787d7365637572697465696e666f2e69676e32> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 204.465 Td /F3.0 11 Tf <75726c5f7370616d5f6d61726b6574696e67203d20247b7072656669787d7370616d5f6d61726b6574696e672e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 174.985 Td /F3.0 11 Tf <5b75726c686175735d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 160.245 Td /F3.0 11 Tf <696e74657276616c203d2031306d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 145.505 Td /F3.0 11 Tf <75726c5f75726c68617573203d2068747470733a2f2f75726c686175732e61627573652e63682f646f776e6c6f6164732f75726c686175732e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 91.294 Td /F2.0 22 Tf [<417070656e64697820423a2045666665637469766520636f6e6669677572> 20.01953 <6174696f6e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.80752 Tw BT 48.24 62.106 Td /F1.0 10.5 Tf [<54686520666f6c6c6f77696e672065666665637469766520636f6e6669677572> 20.01953 <6174696f6e2069732074686520726573756c74206f6620636f6d62696e696e6720696e7465726e616c2064656661756c7473202873656520>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN 0.80752 Tw BT 483.95698 62.106 Td /F1.0 10.5 Tf <417070656e6469782041> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.80752 Tw BT 543.407 62.106 Td /F1.0 10.5 Tf <29> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp1 Do Q Q endstream endobj 88 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 87 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F3.0 25 0 R /F2.0 8 0 R /F1.0 9 0 R >> /XObject << /Stamp1 186 0 R >> >> /Annots [90 0 R] >> endobj 89 0 obj [88 0 R /XYZ 0 119.59 null] endobj 90 0 obj << /Border [0 0 0] /Dest (internalconf) /Subtype /Link /Rect [483.95698 59.04 543.407 73.32] /Type /Annot >> endobj 91 0 obj << /Length 8583 >> stream q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 48.24 793.926 Td /F1.0 10.5 Tf <7769746820746865206578616d706c652073657474696e67732073686f776e20696e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 227.7165 793.926 Td /F1.0 10.5 Tf <53656374696f6e2035> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 272.667 793.926 Td /F1.0 10.5 Tf <2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.96078 0.96078 0.96078 scn 52.24 778.11 m 543.04 778.11 l 545.24914 778.11 547.04 776.31914 547.04 774.11 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 774.11 l 48.24 776.31914 50.03086 778.11 52.24 778.11 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 778.11 m 543.04 778.11 l 545.24914 778.11 547.04 776.31914 547.04 774.11 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 774.11 l 48.24 776.31914 50.03086 778.11 52.24 778.11 c h S Q q 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 48.24 m 542.29 48.24 l S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 755.285 Td /F3.0 11 Tf <5b44454641554c545d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 740.545 Td /F3.0 11 Tf <636c65616e7570203d206175746f6d61746963> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 725.805 Td /F3.0 11 Tf <656e61626c6564203d2066616c7365> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 711.065 Td /F3.0 11 Tf <696e746567726974795f636865636b203d20736861323536> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 696.325 Td /F3.0 11 Tf <6c6f675f6c6576656c203d205741524e494e47> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 681.585 Td /F3.0 11 Tf <6c6f675f6d6574686f64203d20636f6e736f6c65> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 666.845 Td /F3.0 11 Tf <6d61785f73697a65203d20354d42> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 652.105 Td /F3.0 11 Tf <64625f75726c203d2073716c6974653a2f2f2f2f7661722f6c69622f66616e676672697363682f64622e73716c697465> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 637.365 Td /F3.0 11 Tf <6c6f63616c5f6469726563746f7279203d202f7661722f6c69622f636c616d6176> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 622.625 Td /F3.0 11 Tf <6f6e5f7570646174655f65786563203d20636c616d647363616e202d2d72656c6f6164> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 607.885 Td /F3.0 11 Tf <6f6e5f7570646174655f74696d656f7574203d203432> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 578.405 Td /F3.0 11 Tf <5b66616e676672697363686e6577735d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 563.665 Td /F3.0 11 Tf <696e74657276616c203d20313268> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 548.925 Td /F3.0 11 Tf <6c6f63616c5f6469726563746f7279203d202f746d70> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 534.185 Td /F3.0 11 Tf <6d61785f73697a65203d203130304b42> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 519.445 Td /F3.0 11 Tf <736372697074203d202f706174682f746f2f66616e676672697363682d6861732d6e6577732e7368> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 504.705 Td /F3.0 11 Tf <6f6e5f7570646174655f65786563203d205b2021202d7820247b7363726970747d205d207c7c20247b7363726970747d20247b6c6f63616c5f6469726563746f72797d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 489.965 Td /F3.0 11 Tf <707265666978203d2068747470733a2f2f7777772e73656963687465722e64652f66616e676672697363682f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 475.225 Td /F3.0 11 Tf <75726c5f616c65727473203d20247b7072656669787d66616e676672697363685f616c657274732e747874> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 460.485 Td /F3.0 11 Tf <75726c5f6e657773203d20247b7072656669787d66616e676672697363685f6e6577732e747874> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 431.005 Td /F3.0 11 Tf <5b696e7465727365727665725d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 416.265 Td /F3.0 11 Tf <696e74657276616c203d203168> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 401.525 Td /F3.0 11 Tf <696e746567726974795f636865636b203d2064697361626c6564> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 386.785 Td /F3.0 11 Tf <6d61785f73697a65203d20354d42> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 372.045 Td /F3.0 11 Tf <707265666978203d20687474703a2f2f736967732e696e7465727365727665722e6e65742f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 357.305 Td /F3.0 11 Tf <2175726c5f7368656c6c5f686462203d20247b7072656669787d7368656c6c2e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 342.565 Td /F3.0 11 Tf <2175726c5f7368656c6c625f6462203d20247b7072656669787d7368656c6c622e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 327.825 Td /F3.0 11 Tf <75726c5f696e746572736572766572323536203d20247b7072656669787d696e7465727365727665723235362e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 313.085 Td /F3.0 11 Tf <75726c5f7368656c6c5f6c6462203d20247b7072656669787d7368656c6c2e6c6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 298.345 Td /F3.0 11 Tf <66696c656e616d655f7368656c6c5f6c6462203d20696e7465727365727665727368656c6c2e6c6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 283.605 Td /F3.0 11 Tf <75726c5f746f706c696e65203d20247b7072656669787d696e746572736572766572746f706c696e652e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 268.865 Td /F3.0 11 Tf <75726c5f77686974656c6973745f6670203d20247b7072656669787d77686974656c6973742e6670> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 254.125 Td /F3.0 11 Tf <66696c656e616d655f77686974656c6973745f6670203d20696e74657273657276657277686974656c6973742e6670> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 239.385 Td /F3.0 11 Tf <656e61626c6564203d20796573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 209.905 Td /F3.0 11 Tf <5b6d616c77617265706174726f6c5d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 195.165 Td /F3.0 11 Tf <696e74657276616c203d203164> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 180.425 Td /F3.0 11 Tf <696e746567726974795f636865636b203d2064697361626c6564> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 165.685 Td /F3.0 11 Tf <70726f64756374203d2038> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 150.945 Td /F3.0 11 Tf <72656365697074203d206162636431323334> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 136.205 Td /F3.0 11 Tf <707265666978203d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 121.465 Td /F3.0 11 Tf <68747470733a2f2f6c697374732e6d616c77617265706174726f6c2e6e65742f6367692f67657466696c653f70726f647563743d247b70726f647563747d26726563656970743d247b726563656970747d266c697374> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 106.725 Td /F3.0 11 Tf <3d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 91.985 Td /F3.0 11 Tf <75726c5f636c616d61765f6261736963203d20247b7072656669787d636c616d61765f6261736963> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 77.245 Td /F3.0 11 Tf <66696c656e616d655f636c616d61765f6261736963203d206d616c77617265706174726f6c2e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 62.505 Td /F3.0 11 Tf <656e61626c6564203d20796573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp2 Do Q Q endstream endobj 92 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 91 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 9 0 R /F3.0 25 0 R >> /XObject << /Stamp2 187 0 R >> >> /Annots [93 0 R] >> endobj 93 0 obj << /Border [0 0 0] /Dest (_configuration) /Subtype /Link /Rect [227.7165 790.86 272.667 805.14] /Type /Annot >> endobj 94 0 obj << /Length 10488 >> stream q q /DeviceRGB cs 0.96078 0.96078 0.96078 scn 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h f /DeviceRGB CS 0.8 0.8 0.8 SCN 0.75 w 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h S Q q /DeviceRGB CS 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 805.89 m 542.29 805.89 l S Q q /DeviceRGB CS 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 48.24 m 542.29 48.24 l S Q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 59.24 779.325 Td /F3.0 11 Tf <5b73616e6573656375726974795d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 764.585 Td /F3.0 11 Tf <696e74657276616c203d203168> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 749.845 Td /F3.0 11 Tf <707265666978203d2068747470733a2f2f6d6972726f722e726f6c6c65726e65742e75732f73616e6573656375726974792f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 735.105 Td /F3.0 11 Tf <2175726c5f666f78686f6c655f616c6c5f636462203d20247b7072656669787d666f78686f6c655f616c6c2e636462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 720.365 Td /F3.0 11 Tf <2175726c5f666f78686f6c655f616c6c5f6e6462203d20247b7072656669787d666f78686f6c655f616c6c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 705.625 Td /F3.0 11 Tf <2175726c5f666f78686f6c655f6c696e6b73203d20247b7072656669787d666f78686f6c655f6c696e6b732e6c6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 690.885 Td /F3.0 11 Tf <2175726c5f666f78686f6c655f6d61696c203d20247b7072656669787d666f78686f6c655f6d61696c2e636462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 676.145 Td /F3.0 11 Tf <2175726c5f77696e6e6f775f70686973685f636f6d706c657465203d20247b7072656669787d77696e6e6f775f70686973685f636f6d706c6574652e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 661.405 Td /F3.0 11 Tf <75726c5f6261646d6163726f203d20247b7072656669787d6261646d6163726f2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 646.665 Td /F3.0 11 Tf <75726c5f626c75726c203d20247b7072656669787d626c75726c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 631.925 Td /F3.0 11 Tf <75726c5f626f66686c616e645f637261636b65645f75726c203d20247b7072656669787d626f66686c616e645f637261636b65645f55524c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 617.185 Td /F3.0 11 Tf <75726c5f626f66686c616e645f6d616c776172655f617474616368203d20247b7072656669787d626f66686c616e645f6d616c776172655f6174746163682e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 602.445 Td /F3.0 11 Tf <75726c5f626f66686c616e645f6d616c776172655f75726c203d20247b7072656669787d626f66686c616e645f6d616c776172655f55524c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 587.705 Td /F3.0 11 Tf <75726c5f626f66686c616e645f7068697368696e675f75726c203d20247b7072656669787d626f66686c616e645f7068697368696e675f55524c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 572.965 Td /F3.0 11 Tf <75726c5f666f78686f6c655f66696c656e616d65203d20247b7072656669787d666f78686f6c655f66696c656e616d652e636462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 558.225 Td /F3.0 11 Tf <75726c5f666f78686f6c655f67656e65726963203d20247b7072656669787d666f78686f6c655f67656e657269632e636462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 543.485 Td /F3.0 11 Tf <75726c5f666f78686f6c655f6a735f636462203d20247b7072656669787d666f78686f6c655f6a732e636462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 528.745 Td /F3.0 11 Tf <75726c5f666f78686f6c655f6a735f6e6462203d20247b7072656669787d666f78686f6c655f6a732e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 514.005 Td /F3.0 11 Tf <75726c5f6861636b696e677465616d203d20247b7072656669787d6861636b696e677465616d2e687362> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 499.265 Td /F3.0 11 Tf <75726c5f6a756e6b203d20247b7072656669787d6a756e6b2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 484.525 Td /F3.0 11 Tf <75726c5f6a75726c626c203d20247b7072656669787d6a75726c626c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 469.785 Td /F3.0 11 Tf <75726c5f6a75726c626c61203d20247b7072656669787d6a75726c626c612e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 455.045 Td /F3.0 11 Tf <75726c5f6c6f7474203d20247b7072656669787d6c6f74742e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 440.305 Td /F3.0 11 Tf <75726c5f6d616c776172656578706572745f6670203d20247b7072656669787d6d616c776172652e6578706572742e6670> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 425.565 Td /F3.0 11 Tf <75726c5f6d616c776172656578706572745f686462203d20247b7072656669787d6d616c776172652e6578706572742e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 410.825 Td /F3.0 11 Tf <75726c5f6d616c776172656578706572745f6c6462203d20247b7072656669787d6d616c776172652e6578706572742e6c6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 396.085 Td /F3.0 11 Tf <75726c5f6d616c776172656578706572745f6e6462203d20247b7072656669787d6d616c776172652e6578706572742e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 381.345 Td /F3.0 11 Tf <75726c5f6d616c7761726568617368203d20247b7072656669787d6d616c77617265686173682e687362> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 366.605 Td /F3.0 11 Tf <75726c5f7068697368203d20247b7072656669787d70686973682e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 351.865 Td /F3.0 11 Tf <75726c5f706869736874616e6b203d20247b7072656669787d706869736874616e6b2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 337.125 Td /F3.0 11 Tf <75726c5f706f72637570696e65203d20247b7072656669787d706f72637570696e652e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 322.385 Td /F3.0 11 Tf <75726c5f726f677565203d20247b7072656669787d726f6775652e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 307.645 Td /F3.0 11 Tf <75726c5f7363616d203d20247b7072656669787d7363616d2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 292.905 Td /F3.0 11 Tf <75726c5f7368656c746572203d20247b7072656669787d7368656c7465722e6c6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 278.165 Td /F3.0 11 Tf <75726c5f73696777686974656c697374203d20247b7072656669787d73696777686974656c6973742e69676e32> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 263.425 Td /F3.0 11 Tf <75726c5f7370616d617474616368203d20247b7072656669787d7370616d6174746163682e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 248.685 Td /F3.0 11 Tf <75726c5f7370616d696d67203d20247b7072656669787d7370616d696d672e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 233.945 Td /F3.0 11 Tf <75726c5f7370656172203d20247b7072656669787d73706561722e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 219.205 Td /F3.0 11 Tf <75726c5f73706561726c203d20247b7072656669787d73706561726c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 204.465 Td /F3.0 11 Tf <75726c5f737366746d203d20247b7072656669787d73616e6573656375726974792e66746d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 189.725 Td /F3.0 11 Tf <75726c5f77696e6e6f775f6174746163686d656e7473203d20247b7072656669787d77696e6e6f772e6174746163686d656e74732e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 174.985 Td /F3.0 11 Tf <75726c5f77696e6e6f775f6261645f6377203d20247b7072656669787d77696e6e6f775f6261645f63772e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 160.245 Td /F3.0 11 Tf <75726c5f77696e6e6f775f657874656e6465645f6d616c77617265203d20247b7072656669787d77696e6e6f775f657874656e6465645f6d616c776172652e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 145.505 Td /F3.0 11 Tf <75726c5f77696e6e6f775f657874656e6465645f6d616c776172655f6c696e6b73203d20247b7072656669787d77696e6e6f775f657874656e6465645f6d616c776172655f6c696e6b732e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 130.765 Td /F3.0 11 Tf <75726c5f77696e6e6f775f6d616c77617265203d20247b7072656669787d77696e6e6f775f6d616c776172652e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 116.025 Td /F3.0 11 Tf <75726c5f77696e6e6f775f6d616c776172655f6c696e6b73203d20247b7072656669787d77696e6e6f775f6d616c776172655f6c696e6b732e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 101.285 Td /F3.0 11 Tf <75726c5f77696e6e6f775f70686973685f636f6d706c6574655f75726c203d20247b7072656669787d77696e6e6f775f70686973685f636f6d706c6574655f75726c2e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 86.545 Td /F3.0 11 Tf <75726c5f77696e6e6f775f7370616d5f636f6d706c657465203d20247b7072656669787d77696e6e6f775f7370616d5f636f6d706c6574652e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 71.805 Td /F3.0 11 Tf <656e61626c6564203d20796573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp1 Do Q Q endstream endobj 95 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 94 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F3.0 25 0 R >> /XObject << /Stamp1 186 0 R >> >> >> endobj 96 0 obj << /Length 11091 >> stream q q /DeviceRGB cs 0.96078 0.96078 0.96078 scn 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 430.39 l 547.04 428.18086 545.24914 426.39 543.04 426.39 c 52.24 426.39 l 50.03086 426.39 48.24 428.18086 48.24 430.39 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h f /DeviceRGB CS 0.8 0.8 0.8 SCN 0.75 w 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 430.39 l 547.04 428.18086 545.24914 426.39 543.04 426.39 c 52.24 426.39 l 50.03086 426.39 48.24 428.18086 48.24 430.39 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h S Q q /DeviceRGB CS 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 805.89 m 542.29 805.89 l S Q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 59.24 794.065 Td /F3.0 11 Tf <5b7365637572697465696e666f5d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 779.325 Td /F3.0 11 Tf <637573746f6d65725f6964203d20616263646566313233343536> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 764.585 Td /F3.0 11 Tf <696e74657276616c203d203168> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 749.845 Td /F3.0 11 Tf <6d61785f73697a65203d2032304d42> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 735.105 Td /F3.0 11 Tf <707265666978203d2068747470733a2f2f7777772e7365637572697465696e666f2e636f6d2f6765742f7369676e6174757265732f247b637573746f6d65725f69647d2f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 720.365 Td /F3.0 11 Tf <2175726c5f30686f7572203d20247b7072656669787d7365637572697465696e666f30686f75722e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 705.625 Td /F3.0 11 Tf <2175726c5f6f6c64203d20247b7072656669787d7365637572697465696e666f6f6c642e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 690.885 Td /F3.0 11 Tf <2175726c5f7365637572697465696e666f5f6d6462203d20247b7072656669787d7365637572697465696e666f2e6d6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 676.145 Td /F3.0 11 Tf <2175726c5f7365637572697465696e666f5f706462203d20247b7072656669787d7365637572697465696e666f2e706462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 661.405 Td /F3.0 11 Tf <2175726c5f7365637572697465696e666f5f79617261203d20247b7072656669787d7365637572697465696e666f2e79617261> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 646.665 Td /F3.0 11 Tf <75726c5f616e64726f6964203d20247b7072656669787d7365637572697465696e666f616e64726f69642e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 631.925 Td /F3.0 11 Tf <75726c5f6173636969203d20247b7072656669787d7365637572697465696e666f61736369692e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 617.185 Td /F3.0 11 Tf <75726c5f68746d6c203d20247b7072656669787d7365637572697465696e666f68746d6c2e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 602.445 Td /F3.0 11 Tf <75726c5f6a617661736372697074203d20247b7072656669787d6a6176617363726970742e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 587.705 Td /F3.0 11 Tf <75726c5f706466203d20247b7072656669787d7365637572697465696e666f7064662e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 572.965 Td /F3.0 11 Tf <75726c5f7365637572697465696e666f203d20247b7072656669787d7365637572697465696e666f2e686462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 558.225 Td /F3.0 11 Tf <75726c5f7365637572697465696e666f5f69676e32203d20247b7072656669787d7365637572697465696e666f2e69676e32> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 543.485 Td /F3.0 11 Tf <75726c5f7370616d5f6d61726b6574696e67203d20247b7072656669787d7370616d5f6d61726b6574696e672e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 528.745 Td /F3.0 11 Tf <656e61626c6564203d20796573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 499.265 Td /F3.0 11 Tf <5b75726c686175735d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 484.525 Td /F3.0 11 Tf <696e74657276616c203d2031306d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 469.785 Td /F3.0 11 Tf <75726c5f75726c68617573203d2068747470733a2f2f75726c686175732e61627573652e63682f646f776e6c6f6164732f75726c686175732e6e6462> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 455.045 Td /F3.0 11 Tf <656e61626c6564203d20796573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 440.305 Td /F3.0 11 Tf <6d61785f73697a65203d20324d42> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 386.094 Td /F2.0 22 Tf [<417070656e64697820433a2046> 40.03906 <616e67667269736368204e657773>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.81762 Tw BT 48.24 356.906 Td /F1.0 10.5 Tf <546869732070736575646f2070726f766964657220646f6573206e6f74206f6666657220616e74697669727573207369676e61747572652066696c65732e204974206973206f6e6c79206d65616e7420666f72206d6520746f2070617373206e657773> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.6426 Tw BT 48.24 341.126 Td /F1.0 10.5 Tf [<61626f75742046> 40.03906 <616e6766726973636820746f20796f752c2074686520757365722c20696e206c696575206f662061206d61696c696e67206c6973742e20446f6ed57420657870656374207468697320746f2068617070656e206f6e206120726567756c6172>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.02011 Tw BT 48.24 325.346 Td /F1.0 10.5 Tf <62617369732e204920616d206f6e6c79207468696e6b696e672061626f75742072656c65617365206e6f74696669636174696f6e73206174207468697320706f696e7420696e2074696d652e205374696c6c2c2049206b696e646c792061736b20796f7520746f> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 309.566 Td /F1.0 10.5 Tf [<706c6561736520656e61626c65207468697320736572766963652062> 20.01953 <7920616464696e672074686520666f6c6c6f77696e6720746f20796f757220636f6e6669677572> 20.01953 <6174696f6e2066696c653a>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.96078 0.96078 0.96078 scn 52.24 293.75 m 543.04 293.75 l 545.24914 293.75 547.04 291.95914 547.04 289.75 c 547.04 216.79 l 547.04 214.58086 545.24914 212.79 543.04 212.79 c 52.24 212.79 l 50.03086 212.79 48.24 214.58086 48.24 216.79 c 48.24 289.75 l 48.24 291.95914 50.03086 293.75 52.24 293.75 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 293.75 m 543.04 293.75 l 545.24914 293.75 547.04 291.95914 547.04 289.75 c 547.04 216.79 l 547.04 214.58086 545.24914 212.79 543.04 212.79 c 52.24 212.79 l 50.03086 212.79 48.24 214.58086 48.24 216.79 c 48.24 289.75 l 48.24 291.95914 50.03086 293.75 52.24 293.75 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 270.925 Td /F3.0 11 Tf <5b66616e676672697363686e6577735d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 256.185 Td /F3.0 11 Tf <656e61626c6564203d20796573> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 241.445 Td /F3.0 11 Tf <2320556e636f6d6d656e742f61646170742074686520666f6c6c6f77696e6720746f207472696767657220612073637269707420696e2063617365206f66206e6577732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 226.705 Td /F3.0 11 Tf <2320736372697074203d202f706174682f746f2f7363726970742f66616e676672697363682d6861732d6e6577732e7368> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.13072 Tw BT 48.24 188.826 Td /F1.0 10.5 Tf [<546869732077696c6c206f6e6c7920656e61626c652046> 40.03906 <616e6766726973636820746f206f63636173696f6e616c6c7920646f776e6c6f616420736d616c6c20746578742066696c65732c206e6f7468696e67206d6f72652e2059> 69.82422 <6f752077696c6c>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.99998 Tw BT 48.24 173.046 Td /F1.0 10.5 Tf [<6e6f74206e65656420746f20726561642074686520636f6e74656e742c206e6f722077696c6c20616e> 20.01953 <797468696e6720656c73652068617070656e2c20756e6c65737320796f75206d6f646966792074686520>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 0.99998 Tw BT 476.82402 173.046 Td /F3.0 10.5 Tf <736372697074> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.99998 Tw BT 508.32402 173.046 Td /F1.0 10.5 Tf <206f7074696f6e2e> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.14991 Tw BT 48.24 157.266 Td /F1.0 10.5 Tf <4865726520697320616e206578616d706c652073637269707420776869636820796f7520636f756c642075736520746f206861766520646f776e6c6f61646564206e657773206974656d73206d61696c656420746f20796f752e204974> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.03288 Tw BT 48.24 141.486 Td /F1.0 10.5 Tf [<6e6565647320746f206265207265616461626c6520666f72207468652075736572206163636f756e742072756e6e696e672046> 40.03906 <616e676672697363682c20616e64207468652073656e6465722f726563697069656e7420616464726573736573>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 3.32136 Tw BT 48.24 125.706 Td /F1.0 10.5 Tf [<6f6276696f75736c79206861766520746f20626520616461707465642e2046> 40.03906 <6f7220796f757220636f6e76656e69656e63652c20746865206c61746573742076657273696f6e206f6620746865207363726970742063616e206265>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 48.24 109.926 Td /F1.0 10.5 Tf <646f776e6c6f616465642068657265> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 135.81 109.926 Td /F1.0 10.5 Tf <2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.96078 0.96078 0.96078 scn 52.24 94.11 m 543.04 94.11 l 545.24914 94.11 547.04 92.31914 547.04 90.11 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 90.11 l 48.24 92.31914 50.03086 94.11 52.24 94.11 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 94.11 m 543.04 94.11 l 545.24914 94.11 547.04 92.31914 547.04 90.11 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 90.11 l 48.24 92.31914 50.03086 94.11 52.24 94.11 c h S Q q 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 48.24 m 542.29 48.24 l S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 71.285 Td /F3.0 11 Tf <23212f7573722f62696e2f656e762062617368> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 56.545 Td /F3.0 11 Tf <232076696d3a2074733d342073773d34206e6f65742066743d7368> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp2 Do Q Q endstream endobj 97 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 96 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F3.0 25 0 R /F2.0 8 0 R /F1.0 9 0 R >> /XObject << /Stamp2 187 0 R >> >> /Annots [101 0 R] >> endobj 98 0 obj [97 0 R /XYZ 0 414.39 null] endobj 99 0 obj << /Limits [(__anchor-top) (_prepare_and_activate_venv)] /Names [(__anchor-top) 185 0 R (_accessing_mappings) 107 0 R (_configuration) 37 0 R (_create_home_directory) 24 0 R (_default_providers) 50 0 R (_discussion_precedes_contribution) 81 0 R (_install_via_pypi) 30 0 R (_installation) 22 0 R (_installation_packages) 32 0 R (_license) 14 0 R (_offering_suggestions) 78 0 R (_prepare_and_activate_venv) 29 0 R] >> endobj 100 0 obj << /Limits [(_proxy_support) (usage)] /Names [(_proxy_support) 64 0 R (_reporting_possible_problems) 77 0 R (_semantics) 60 0 R (_support) 73 0 R (_update_strategy) 20 0 R (_user_defined_providers) 59 0 R (dbsetup) 66 0 R (dbstructure) 106 0 R (ffnews) 98 0 R (internalconf) 84 0 R (sampleeff) 89 0 R (usage) 67 0 R] >> endobj 101 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://raw.githubusercontent.com/rseichter/fangfrisch/master/contrib/fangfrisch-has-news.sh) >> /Subtype /Link /Rect [48.24 106.86 135.81 121.14] /Type /Annot >> endobj 102 0 obj << /Length 7171 >> stream q q /DeviceRGB cs 0.96078 0.96078 0.96078 scn 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h f /DeviceRGB CS 0.8 0.8 0.8 SCN 0.75 w 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h S Q q /DeviceRGB CS 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 805.89 m 542.29 805.89 l S Q q /DeviceRGB CS 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 48.24 m 542.29 48.24 l S Q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 59.24 794.065 Td /F3.0 11 Tf <23> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 779.325 Td /F3.0 11 Tf <23204578616d706c652073637269707420746f2070726f636573732046616e67667269736368204e6577732e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 749.845 Td /F3.0 11 Tf <6465636c617265202d72204d41494c46524f4d3d226e6f7265706c7922> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 735.105 Td /F3.0 11 Tf <6465636c617265202d72204d41494c544f3d22616c696365406578616d706c652e636f6d22> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 720.365 Td /F3.0 11 Tf <6465636c617265202d72205355424a4543543d2246616e67667269736368204e6577732061726520617661696c61626c6522> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 690.885 Td /F3.0 11 Tf <23204f7074696f6e20313a204d757474> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 676.145 Td /F3.0 11 Tf <236465636c617265202d72204d41494c4150503d226d75747422> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 661.405 Td /F3.0 11 Tf <236465636c617265202d72204d41494c4150505f4f50543d2820222d73222022245355424a454354222022244d41494c544f222029> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 631.925 Td /F3.0 11 Tf <23204f7074696f6e20323a2073656e646d61696c> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 617.185 Td /F3.0 11 Tf <236465636c617265202d72204d41494c4150503d2273656e646d61696c22> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 602.445 Td /F3.0 11 Tf <236465636c617265202d72204d41494c4150505f4f50543d2820222d74222029> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 587.705 Td /F3.0 11 Tf <236578706f727420504154483d2224504154483a2f7573722f7362696e22> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 558.225 Td /F3.0 11 Tf <23204f7074696f6e20333a207377616b73> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 543.485 Td /F3.0 11 Tf <6465636c617265202d72204d41494c4150503d227377616b7322> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 528.745 Td /F3.0 11 Tf <6465636c617265202d72204d41494c4150505f4f50543d2820222d642220222d2220222d66222022244d41494c46524f4d2220222d74222022244d41494c544f222029> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 499.265 Td /F3.0 11 Tf <232323204e6f206368616e6765732072657175697265642062656c6f772074686973206c696e6520232323> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 469.785 Td /F3.0 11 Tf <736574202d65756f20706970656661696c> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 440.305 Td /F3.0 11 Tf <6469652829207b> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 425.565 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 410.825 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 396.085 Td /F3.0 11 Tf <7d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 366.605 Td /F3.0 11 Tf <75736167652829207b> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 351.865 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 337.125 Td /F3.0 11 Tf <7d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 307.645 Td /F3.0 11 Tf <67656e5f6865616465722829207b> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 292.905 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 278.165 Td /F3.0 11 Tf <46726f6d3a2046616e67667269736368204e657773203c244d41494c46524f4d3e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 263.425 Td /F3.0 11 Tf <546f3a20244d41494c544f> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 248.685 Td /F3.0 11 Tf <5375626a6563743a20245355424a454354> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 219.205 Td /F3.0 11 Tf <454f54> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 204.465 Td /F3.0 11 Tf <23204d61696c20686561646572206d75737420656e64207769746820616e20656d707479206c696e6521> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 189.725 Td /F3.0 11 Tf <7d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 160.245 Td /F3.0 11 Tf <6465636c617265202d61204e4557534954454d533d2829> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 130.765 Td /F3.0 11 Tf <7265706f72745f6e6577732829207b> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 116.025 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 101.285 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 86.545 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 71.805 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 57.065 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp1 Do Q Q endstream endobj 103 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 102 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F3.0 25 0 R >> /XObject << /Stamp1 186 0 R >> >> >> endobj 104 0 obj << /Length 11814 >> stream q q /DeviceRGB cs 0.96078 0.96078 0.96078 scn 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 430.39 l 547.04 428.18086 545.24914 426.39 543.04 426.39 c 52.24 426.39 l 50.03086 426.39 48.24 428.18086 48.24 430.39 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h f /DeviceRGB CS 0.8 0.8 0.8 SCN 0.75 w 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 430.39 l 547.04 428.18086 545.24914 426.39 543.04 426.39 c 52.24 426.39 l 50.03086 426.39 48.24 428.18086 48.24 430.39 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h S Q q /DeviceRGB CS 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 805.89 m 542.29 805.89 l S Q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 59.24 794.065 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 779.325 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 764.585 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 749.845 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 735.105 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 720.365 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 705.625 Td /F3.0 11 Tf <7d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 676.145 Td /F3.0 11 Tf <6d61696e2829207b> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 661.405 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 646.665 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 631.925 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 617.185 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 602.445 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 587.705 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 572.965 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 558.225 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 543.485 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 528.745 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 514.005 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 499.265 Td /F3.0 11 Tf Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 484.525 Td /F3.0 11 Tf <7d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 455.045 Td /F3.0 11 Tf <5b202423202d67652031205d207c7c207573616765> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 440.305 Td /F3.0 11 Tf <6d61696e2022244022> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 386.094 Td /F2.0 22 Tf <417070656e64697820443a20446174616261736520737472756374757265> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 2.74633 Tw BT 48.24 356.906 Td /F1.0 10.5 Tf [<5768696c652075736572732063616e20746563686e6963616c6c7920616363657373207468652046> 40.03906 <616e67667269736368206261636b> 20.01953 <656e64206461746162617365206469726563746c79> 89.84375 <2c206974732073747275637475726520616e64>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 341.126 Td /F1.0 10.5 Tf <636f6e74656e742061726520636f6e7369646572656420> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 165.777 341.126 Td /F2.0 10.5 Tf <70726976617465> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 204.5955 341.126 Td /F1.0 10.5 Tf [<2e2054686579206d61> 20.01953 <79206368616e676520617420616e> 20.01953 <792074696d652c20776974686f7574206e6f746963652e>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 301.286 Td /F2.0 18 Tf [<442e312e2041> 20.01953 <6363657373696e67206d617070696e6773>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.74694 Tw BT 48.24 273.266 Td /F1.0 10.5 Tf [<496e20636f6e7472> 20.01953 <61737420746f20646972656374206461746162617365206163636573732c2074686520>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.74694 Tw BT 257.39937 273.266 Td /F2.0 10.5 Tf <64756d706d617070696e6773> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.74694 Tw BT 340.17087 273.266 Td /F1.0 10.5 Tf <20616374696f6e20616c6c6f777320616363657373696e672073656c6563746564207061727473206f66> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.6372 Tw BT 48.24 257.486 Td /F1.0 10.5 Tf [<646174616261736520656e747269657320696e206120737461626c65206d616e6e65722e205370656369666963616c6c79> 89.84375 <2c2069742072657475726e7320332d7475706c6573202870726f7669646572206e616d652c2055524c2c206c6f63616c2066696c65>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.66035 Tw BT 48.24 241.706 Td /F1.0 10.5 Tf [<70617468292e20456c656d656e747320617265207365706172> 20.01953 <617465642062> 20.01953 <7920686f72697a6f6e74616c20746162756c61746f727320746f20666163696c697461746520706970696e6720746865206f757470757420696e746f20>] TJ ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.66035 Tw BT 515.90615 241.706 Td /F3.0 10.5 Tf <61776b> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.66035 Tw BT 531.65615 241.706 Td /F1.0 10.5 Tf <206f72> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.37713 Tw BT 48.24 225.926 Td /F1.0 10.5 Tf <73696d696c6172207574696c69746965732e204966207370656369666965642c2074686520> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 0.37713 Tw BT 210.40817 225.926 Td /F3.0 10.5 Tf <70726f7669646572> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.37713 Tw BT 252.40817 225.926 Td /F1.0 10.5 Tf <206f7074696f6e20697320696e746572707265746564206173206120726567756c61722065787072657373696f6e2c20616e64206f6e6c79204442> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.33407 Tw BT 48.24 210.146 Td /F1.0 10.5 Tf <7265636f7264732077697468206d61746368696e672070726f766964657220636f6c756d6e206172652072657475726e65642e2054686174206d65616e7320696620796f7520686176652070726f76696465727320> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.33407 Tw BT 508.49393 210.146 Td /F4.0 10.5 Tf <666f6f> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.33407 Tw BT 523.87643 210.146 Td /F1.0 10.5 Tf <20616e64> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.93247 Tw BT 48.24 194.366 Td /F4.0 10.5 Tf <666f6f626172> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.93247 Tw BT 80.5065 194.366 Td /F1.0 10.5 Tf <2c20796f75206e65656420746f2075736520616e63686f72696e672028652e672e20> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.69412 0.12941 0.27451 scn 0.69412 0.12941 0.27451 SCN 1.93247 Tw BT 256.96229 194.366 Td /F3.0 10.5 Tf <5e666f6f24> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 1.93247 Tw BT 283.21229 194.366 Td /F1.0 10.5 Tf <2920696620796f75206f6e6c79207769736820746f206d6174636820656e747269657320666f722074686520666f726d6572> Tj ET 0.0 Tw 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 178.586 Td /F1.0 10.5 Tf [<70726f76696465722e204d616b> 20.01953 <65207375726520746f207573652071756f74696e672061732072657175697265642062> 20.01953 <7920796f7572207368656c6c2e204578616d706c652075736167653a>] TJ ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.96078 0.96078 0.96078 scn 52.24 162.77 m 543.04 162.77 l 545.24914 162.77 547.04 160.97914 547.04 158.77 c 547.04 115.29 l 547.04 113.08086 545.24914 111.29 543.04 111.29 c 52.24 111.29 l 50.03086 111.29 48.24 113.08086 48.24 115.29 c 48.24 158.77 l 48.24 160.97914 50.03086 162.77 52.24 162.77 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 162.77 m 543.04 162.77 l 545.24914 162.77 547.04 160.97914 547.04 158.77 c 547.04 115.29 l 547.04 113.08086 545.24914 111.29 543.04 111.29 c 52.24 111.29 l 50.03086 111.29 48.24 113.08086 48.24 115.29 c 48.24 158.77 l 48.24 160.97914 50.03086 162.77 52.24 162.77 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 139.945 Td /F3.0 11 Tf <23205072696e7420616c6c207265636f72646564206d617070696e677320666f7220746865205b6578616d706c655d2070726f76696465722073656374696f6e2e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 125.205 Td /F3.0 11 Tf <66616e67667269736368202d2d636f6e66202f6574632f66616e676672697363682e636f6e66202d2d70726f766964657220275e6578616d706c6524272064756d706d617070696e6773> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.96078 0.96078 0.96078 scn 52.24 99.29 m 543.04 99.29 l 545.24914 99.29 547.04 97.49914 547.04 95.29 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 95.29 l 48.24 97.49914 50.03086 99.29 52.24 99.29 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 99.29 m 543.04 99.29 l 545.24914 99.29 547.04 97.49914 547.04 95.29 c 547.04 52.24 l 547.04 50.03086 545.24914 48.24 543.04 48.24 c 52.24 48.24 l 50.03086 48.24 48.24 50.03086 48.24 52.24 c 48.24 95.29 l 48.24 97.49914 50.03086 99.29 52.24 99.29 c h S Q q 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 48.24 m 542.29 48.24 l S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 76.465 Td /F3.0 11 Tf <232044656c65746520616c6c2066696c65732074686174207765726520646f776e6c6f616465642062792046616e676672697363682e> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 61.725 Td /F3.0 11 Tf <2320444f4e27542045584543555445205448495320554e4c45535320594f55205245414c4c59204d45414e20495421> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp2 Do Q Q endstream endobj 105 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 104 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F3.0 25 0 R /F2.0 8 0 R /F1.0 9 0 R /F4.0 61 0 R >> /XObject << /Stamp2 187 0 R >> >> >> endobj 106 0 obj [105 0 R /XYZ 0 414.39 null] endobj 107 0 obj [105 0 R /XYZ 0 325.31 null] endobj 108 0 obj << /Length 1126 >> stream q q /DeviceRGB cs 0.96078 0.96078 0.96078 scn 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 784.15 l 547.04 781.94086 545.24914 780.15 543.04 780.15 c 52.24 780.15 l 50.03086 780.15 48.24 781.94086 48.24 784.15 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h f /DeviceRGB CS 0.8 0.8 0.8 SCN 0.75 w 52.24 805.89 m 543.04 805.89 l 545.24914 805.89 547.04 804.09914 547.04 801.89 c 547.04 784.15 l 547.04 781.94086 545.24914 780.15 543.04 780.15 c 52.24 780.15 l 50.03086 780.15 48.24 781.94086 48.24 784.15 c 48.24 801.89 l 48.24 804.09914 50.03086 805.89 52.24 805.89 c h S Q q /DeviceRGB CS 0.96078 0.96078 0.96078 SCN 0.8999999999999999 w [3.6 3.6] 0.0 d 52.99 805.89 m 542.29 805.89 l S Q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 59.24 794.065 Td /F3.0 11 Tf <66616e67667269736368202d2d636f6e66202f6574632f66616e676672697363682e636f6e662064756d706d617070696e6773207c2061776b20277b7072696e742024337d27207c207861726773202f62696e2f726d> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn q 0.0 0.0 0.0 scn 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d /Stamp1 Do Q Q endstream endobj 109 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /CropBox [0 0 595.28 841.89] /BleedBox [0 0 595.28 841.89] /TrimBox [0 0 595.28 841.89] /ArtBox [0 0 595.28 841.89] /Contents 108 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F3.0 25 0 R >> /XObject << /Stamp1 186 0 R >> >> >> endobj 110 0 obj << /Border [0 0 0] /Dest (_license) /Subtype /Link /Rect [48.24 586.78429 97.254 601.06429] /Type /Annot >> endobj 111 0 obj << /Border [0 0 0] /Dest (_license) /Subtype /Link /Rect [541.1705 586.78429 547.04 601.06429] /Type /Annot >> endobj 112 0 obj << /Border [0 0 0] /Dest (_update_strategy) /Subtype /Link /Rect [48.24 568.30429 137.73129 582.58429] /Type /Annot >> endobj 113 0 obj << /Border [0 0 0] /Dest (_update_strategy) /Subtype /Link /Rect [541.1705 568.30429 547.04 582.58429] /Type /Annot >> endobj 114 0 obj << /Border [0 0 0] /Dest (_installation) /Subtype /Link /Rect [48.24 549.82429 116.7 564.10429] /Type /Annot >> endobj 115 0 obj << /Border [0 0 0] /Dest (_installation) /Subtype /Link /Rect [541.1705 549.82429 547.04 564.10429] /Type /Annot >> endobj 116 0 obj << /Border [0 0 0] /Dest (_create_home_directory) /Subtype /Link /Rect [60.24 531.34429 191.9835 545.62429] /Type /Annot >> endobj 117 0 obj << /Border [0 0 0] /Dest (_create_home_directory) /Subtype /Link /Rect [541.1705 531.34429 547.04 545.62429] /Type /Annot >> endobj 118 0 obj << /Border [0 0 0] /Dest (_prepare_and_activate_venv) /Subtype /Link /Rect [60.24 512.86429 210.978 527.14429] /Type /Annot >> endobj 119 0 obj << /Border [0 0 0] /Dest (_prepare_and_activate_venv) /Subtype /Link /Rect [541.1705 512.86429 547.04 527.14429] /Type /Annot >> endobj 120 0 obj << /Border [0 0 0] /Dest (_install_via_pypi) /Subtype /Link /Rect [60.24 494.38429 132.186 508.66429] /Type /Annot >> endobj 121 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://pypi.org/project/fangfrisch/) >> /Subtype /Link /Rect [132.186 494.38429 154.6455 508.66429] /Type /Annot >> endobj 122 0 obj << /Border [0 0 0] /Dest (_install_via_pypi) /Subtype /Link /Rect [132.186 494.38429 154.6455 508.66429] /Type /Annot >> endobj 123 0 obj << /Border [0 0 0] /Dest (_install_via_pypi) /Subtype /Link /Rect [541.1705 494.38429 547.04 508.66429] /Type /Annot >> endobj 124 0 obj << /Border [0 0 0] /Dest (_installation_packages) /Subtype /Link /Rect [48.24 475.90429 164.958 490.18429] /Type /Annot >> endobj 125 0 obj << /Border [0 0 0] /Dest (_installation_packages) /Subtype /Link /Rect [541.1705 475.90429 547.04 490.18429] /Type /Annot >> endobj 126 0 obj << /Border [0 0 0] /Dest (_configuration) /Subtype /Link /Rect [48.24 457.42429 128.76429 471.70429] /Type /Annot >> endobj 127 0 obj << /Border [0 0 0] /Dest (_configuration) /Subtype /Link /Rect [541.1705 457.42429 547.04 471.70429] /Type /Annot >> endobj 128 0 obj << /Border [0 0 0] /Dest (_default_providers) /Subtype /Link /Rect [60.24 438.94429 167.907 453.22429] /Type /Annot >> endobj 129 0 obj << /Border [0 0 0] /Dest (_default_providers) /Subtype /Link /Rect [541.1705 438.94429 547.04 453.22429] /Type /Annot >> endobj 130 0 obj << /Border [0 0 0] /Dest (_user_defined_providers) /Subtype /Link /Rect [60.24 420.46429 195.4485 434.74429] /Type /Annot >> endobj 131 0 obj << /Border [0 0 0] /Dest (_user_defined_providers) /Subtype /Link /Rect [541.1705 420.46429 547.04 434.74429] /Type /Annot >> endobj 132 0 obj << /Border [0 0 0] /Dest (_semantics) /Subtype /Link /Rect [60.24 401.98429 130.8 416.26429] /Type /Annot >> endobj 133 0 obj << /Border [0 0 0] /Dest (_semantics) /Subtype /Link /Rect [541.1705 401.98429 547.04 416.26429] /Type /Annot >> endobj 134 0 obj << /Border [0 0 0] /Dest (_proxy_support) /Subtype /Link /Rect [60.24 383.50429 150.9705 397.78429] /Type /Annot >> endobj 135 0 obj << /Border [0 0 0] /Dest (_proxy_support) /Subtype /Link /Rect [541.1705 383.50429 547.04 397.78429] /Type /Annot >> endobj 136 0 obj << /Border [0 0 0] /Dest (dbsetup) /Subtype /Link /Rect [48.24 365.02429 175.4475 379.30429] /Type /Annot >> endobj 137 0 obj << /Border [0 0 0] /Dest (dbsetup) /Subtype /Link /Rect [541.1705 365.02429 547.04 379.30429] /Type /Annot >> endobj 138 0 obj << /Border [0 0 0] /Dest (usage) /Subtype /Link /Rect [48.24 346.54429 88.875 360.82429] /Type /Annot >> endobj 139 0 obj << /Border [0 0 0] /Dest (usage) /Subtype /Link /Rect [541.1705 346.54429 547.04 360.82429] /Type /Annot >> endobj 140 0 obj << /Border [0 0 0] /Dest (_support) /Subtype /Link /Rect [48.24 328.06429 99.3855 342.34429] /Type /Annot >> endobj 141 0 obj << /Border [0 0 0] /Dest (_support) /Subtype /Link /Rect [541.1705 328.06429 547.04 342.34429] /Type /Annot >> endobj 142 0 obj << /Border [0 0 0] /Dest (_reporting_possible_problems) /Subtype /Link /Rect [60.24 309.58429 222.8115 323.86429] /Type /Annot >> endobj 143 0 obj << /Border [0 0 0] /Dest (_reporting_possible_problems) /Subtype /Link /Rect [541.1705 309.58429 547.04 323.86429] /Type /Annot >> endobj 144 0 obj << /Border [0 0 0] /Dest (_offering_suggestions) /Subtype /Link /Rect [60.24 291.10429 182.1975 305.38429] /Type /Annot >> endobj 145 0 obj << /Border [0 0 0] /Dest (_offering_suggestions) /Subtype /Link /Rect [541.1705 291.10429 547.04 305.38429] /Type /Annot >> endobj 146 0 obj << /Border [0 0 0] /Dest (_discussion_precedes_contribution) /Subtype /Link /Rect [60.24 272.62429 246.111 286.90429] /Type /Annot >> endobj 147 0 obj << /Border [0 0 0] /Dest (_discussion_precedes_contribution) /Subtype /Link /Rect [541.1705 272.62429 547.04 286.90429] /Type /Annot >> endobj 148 0 obj << /Border [0 0 0] /Dest (internalconf) /Subtype /Link /Rect [48.24 254.14429 219.99879 268.42429] /Type /Annot >> endobj 149 0 obj << /Border [0 0 0] /Dest (internalconf) /Subtype /Link /Rect [541.1705 254.14429 547.04 268.42429] /Type /Annot >> endobj 150 0 obj << /Border [0 0 0] /Dest (sampleeff) /Subtype /Link /Rect [48.24 235.66429 226.63479 249.94429] /Type /Annot >> endobj 151 0 obj << /Border [0 0 0] /Dest (sampleeff) /Subtype /Link /Rect [535.301 235.66429 547.04 249.94429] /Type /Annot >> endobj 152 0 obj << /Border [0 0 0] /Dest (ffnews) /Subtype /Link /Rect [48.24 217.18429 194.57809 231.46429] /Type /Annot >> endobj 153 0 obj << /Border [0 0 0] /Dest (ffnews) /Subtype /Link /Rect [535.301 217.18429 547.04 231.46429] /Type /Annot >> endobj 154 0 obj << /Border [0 0 0] /Dest (dbstructure) /Subtype /Link /Rect [48.24 198.70429 207.4935 212.98429] /Type /Annot >> endobj 155 0 obj << /Border [0 0 0] /Dest (dbstructure) /Subtype /Link /Rect [535.301 198.70429 547.04 212.98429] /Type /Annot >> endobj 156 0 obj << /Border [0 0 0] /Dest (_accessing_mappings) /Subtype /Link /Rect [60.24 180.22429 182.00829 194.50429] /Type /Annot >> endobj 157 0 obj << /Border [0 0 0] /Dest (_accessing_mappings) /Subtype /Link /Rect [535.301 180.22429 547.04 194.50429] /Type /Annot >> endobj 158 0 obj << /Type /Outlines /Count 25 /First 159 0 R /Last 182 0 R >> endobj 159 0 obj << /Title /Parent 158 0 R /Count 0 /Next 160 0 R /Dest [7 0 R /XYZ 0 841.89 null] >> endobj 160 0 obj << /Title /Parent 158 0 R /Count 0 /Next 161 0 R /Prev 159 0 R /Dest [7 0 R /XYZ 0 841.89 null] >> endobj 161 0 obj << /Title /Parent 158 0 R /Count 0 /Next 162 0 R /Prev 160 0 R /Dest [7 0 R /XYZ 0 166.12429 null] >> endobj 162 0 obj << /Title /Parent 158 0 R /Count 0 /Next 163 0 R /Prev 161 0 R /Dest [18 0 R /XYZ 0 659.43 null] >> endobj 163 0 obj << /Title /Parent 158 0 R /Count 3 /First 164 0 R /Last 166 0 R /Next 167 0 R /Prev 162 0 R /Dest [18 0 R /XYZ 0 388.55 null] >> endobj 164 0 obj << /Title /Parent 163 0 R /Count 0 /Next 165 0 R /Dest [18 0 R /XYZ 0 224.35 null] >> endobj 165 0 obj << /Title /Parent 163 0 R /Count 0 /Next 166 0 R /Prev 164 0 R /Dest [28 0 R /XYZ 0 841.89 null] >> endobj 166 0 obj << /Title /Parent 163 0 R /Count 0 /Prev 165 0 R /Dest [28 0 R /XYZ 0 692.39 null] >> endobj 167 0 obj << /Title /Parent 158 0 R /Count 0 /Next 168 0 R /Prev 163 0 R /Dest [28 0 R /XYZ 0 575.79 null] >> endobj 168 0 obj << /Title /Parent 158 0 R /Count 4 /First 169 0 R /Last 172 0 R /Next 173 0 R /Prev 167 0 R /Dest [28 0 R /XYZ 0 393.59 null] >> endobj 169 0 obj << /Title /Parent 168 0 R /Count 0 /Next 170 0 R /Dest [49 0 R /XYZ 0 841.89 null] >> endobj 170 0 obj << /Title /Parent 168 0 R /Count 0 /Next 171 0 R /Prev 169 0 R /Dest [58 0 R /XYZ 0 709.19 null] >> endobj 171 0 obj << /Title /Parent 168 0 R /Count 0 /Next 172 0 R /Prev 170 0 R /Dest [58 0 R /XYZ 0 355.71 null] >> endobj 172 0 obj << /Title /Parent 168 0 R /Count 0 /Prev 171 0 R /Dest [63 0 R /XYZ 0 841.89 null] >> endobj 173 0 obj << /Title /Parent 158 0 R /Count 0 /Next 174 0 R /Prev 168 0 R /Dest [63 0 R /XYZ 0 711.27 null] >> endobj 174 0 obj << /Title /Parent 158 0 R /Count 0 /Next 175 0 R /Prev 173 0 R /Dest [63 0 R /XYZ 0 506.11 null] >> endobj 175 0 obj << /Title /Parent 158 0 R /Count 3 /First 176 0 R /Last 178 0 R /Next 179 0 R /Prev 174 0 R /Dest [72 0 R /XYZ 0 573.51 null] >> endobj 176 0 obj << /Title /Parent 175 0 R /Count 0 /Next 177 0 R /Dest [72 0 R /XYZ 0 452.87 null] >> endobj 177 0 obj << /Title /Parent 175 0 R /Count 0 /Next 178 0 R /Prev 176 0 R /Dest [72 0 R /XYZ 0 151.43 null] >> endobj 178 0 obj << /Title /Parent 175 0 R /Count 0 /Prev 177 0 R /Dest [80 0 R /XYZ 0 696.99 null] >> endobj 179 0 obj << /Title /Parent 158 0 R /Count 0 /Next 180 0 R /Prev 175 0 R /Dest [80 0 R /XYZ 0 460.89 null] >> endobj 180 0 obj << /Title /Parent 158 0 R /Count 0 /Next 181 0 R /Prev 179 0 R /Dest [88 0 R /XYZ 0 119.59 null] >> endobj 181 0 obj << /Title /Parent 158 0 R /Count 0 /Next 182 0 R /Prev 180 0 R /Dest [97 0 R /XYZ 0 414.39 null] >> endobj 182 0 obj << /Title /Parent 158 0 R /Count 1 /First 183 0 R /Last 183 0 R /Prev 181 0 R /Dest [105 0 R /XYZ 0 414.39 null] >> endobj 183 0 obj << /Title /Parent 182 0 R /Count 0 /Dest [105 0 R /XYZ 0 325.31 null] >> endobj 184 0 obj << /Nums [0 << /P (1) >> 1 << /P (2) >> 2 << /P (3) >> 3 << /P (4) >> 4 << /P (5) >> 5 << /P (6) >> 6 << /P (7) >> 7 << /P (8) >> 8 << /P (9) >> 9 << /P (10) >> 10 << /P (11) >> 11 << /P (12) >> 12 << /P (13) >> 13 << /P (14) >> 14 << /P (15) >> 15 << /P (16) >> 16 << /P (17) >>] >> endobj 185 0 obj [7 0 R /XYZ 0 841.89 null] endobj 186 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 595.28 841.89] /Length 165 >> stream q /DeviceRGB cs 0.0 0.0 0.0 scn /DeviceRGB CS 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d q /DeviceRGB CS 0.86667 0.86667 0.86667 SCN 0.25 w 48.24 30.0 m 547.04 30.0 l S Q Q endstream endobj 187 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 595.28 841.89] /Length 165 >> stream q /DeviceRGB cs 0.0 0.0 0.0 scn /DeviceRGB CS 0.0 0.0 0.0 SCN 1 w 0 J 0 j [] 0 d q /DeviceRGB CS 0.86667 0.86667 0.86667 SCN 0.25 w 48.24 30.0 m 547.04 30.0 l S Q Q endstream endobj 188 0 obj << /Length1 14240 /Length 9109 /Filter [/FlateDecode] >> stream xz T[׵9^ I ]" H 3&X`# 8cg<&ƩMu絿i:&/}y {%l N׿ҹw}gg+!JB|-*£ Sѭ25D M+ g>q 'o<lDH|_CйG!.wsF;G7_O_ٟA}P"C{= 0E~P}jr&;^ MMv+B"I v86&ⅈ^:Qx}Dgy@+D^Oxp),r_vcG"1zBES> '&Ɵ"jgTRhAxұ6j-< @/Rj;h7 uCRE J^($:#!χJx^h2T"x 4-<%0:)R^BC9ԃGV#=QnSDߡ7oLf5VXՃ\oWgG{[kKƵ uwMuYYQ^VZR[-f1W0*M*''%Ƌ>" Gu0cMl¿ Ӏ]I}ë(]QJ J,QH{:/6/Lq0*PQIua=ڭs05ɈΈ(L\O aä y=nZc267ׄj8a~MXX~ŹhgHb}0釾sgnnoXb1pޝOF X7i9$btO>^0|sĂ޹Z/,`h13w&!anF^ua_+õzb(.M1ڶ&0u2bZҳDe_pwyu ("&|lˋK-.eRˍ> Sچ!:Ě(\.p4H04Fy:P Z<2'*IWO0NB0aBt|rEӍOu۵m>]k__5]%־Y3>(t-bu\T=#χ;yR],>;w܋稧UɧU-ɓ%|d:xqw?~Iq|8㖣Σ>~ыG֣"@{qNJO]T EőGHku3\CC/9Kt`ԳAT.i Qv :#G=333!wag4HUBPB3%a}ٺ P9 ffg9niK 5ÉDfyyoZ(Fh=-GQ%vGo/g |믷En")í7ZiX݇jRK|J8OZF=x牵H_NOy|i`QRϗDPP$p\$#o5lÅD'!^Zܲ81>9ȍB$yTܫ"J-88~:g ) N$*N+IIX@nx+ɾHUK(/ Ϗ_[;J}M+D=qhQjZf#dwމ^ ~,IGa%a+&d$јJFSaV*Ҕqԉ:\HtlnCR#d+TE$]TI:M"&ʰ2t zBnSUu^ۑ?)omz6dB[t.H+y?ALD%cu"\I _Ǝ,uɑ7egOd[|1l6qѕL==5^{㌴8ev;ɭCM&J?dp-f[h& 8:qV$B-S dз62NF[}[qڼvpݝ.i\SW[;k*ץ6wBvDfe%3m Cߛ'OM|ocwƺ9یRcɺpVɤ>?9H{ExX'c&U-øP/]D^Z Nm?;tYX02u-f| dy>d=%@ΝVTy_ۄC_?껷M[v}{/*5 [Z4tuE:˚*"ݮ3<[i}u{Gv}զ JFsK:=%4vU1E.[; 1C_RQK~xuFv@8Yؘ|9I+q6y b] H5AP"Pt/9]i3)8;Y7iZtqxB!ƥ) c7tiv*,u:w}D ƥf͒7̺֖iw 'ȨFfTKB c-LB$4XzWXZ7exB)dD7}n_2@sƒ4eϳv SD) w4B#v-3~5͍9;C?oYߴD#G cW=g[Crqϓ!N5lJ{=PW)/vNfk5 aӧ k}ʪmر6evŐ Pz (y O E=,u+tbqNM< N`;fgNmWGQ]7s&rYk?'v_5}ƅQjV M.SC>2ҩ g"z.r§1o}۵7tOGqXgW7o?я|x2h3|& ,ueבNצdv7\~߽_дF,ig].\-"{ڷdA+hUTns`#=,ɹLV-a N 5#?0KXH#VBAm,I,'/_%yJdL׸yܣ6u> iayVD"k¤E_aZvZG{M{.oyrsʹѩ(([3;ႢzԻǤ)oy9nx)s*4kа;q[9٥ 6+eE\iBg'͕T*i.=L+O~v٩:֮ىFfvjZ)7]*KXVX]Oe;^޳筇I2/2 SukĜxk'+lSg&o?u֩$adD.ٳj|1ryRN5]h/H"SWK\(ie&P=E5KKK[Lj5Wo0>{ߛ?K7U0ɶL}kU|Q ~Qi6~^`ȴT gJRe|Cpl:1Xz[c,0Ib\#Ɵ,\h˗J*l &yKq(xjM%f:z݃tCyNĮώ۲Ɩ!eIgà5U:5/PsǨfa5{9<^csF&*eE~OʹPZkrMv%y.֡M߽}';]*< \:b:UF㓄2wn}>;$2 mhm8<01OJs4Euڌ<<^sZWh0^SAk__Q;{%Uk ȭ7<5;jɒz_FJN͝"94SjH2iؐ4ܽ,2|Zmgd0T~^R8y.Oo6V̾T6K]u$W>8˚eu1ZE9e(-3 S礤_[n'8TtIz*=E oh Wb \+0O5ӖC$ a#bD@ĪNQ٠bΔ52ұhdS[sTNГAtK}Q 9_ 6eW:7[v ?q6Eбag4HICm "XxRwm{_@n.O s+{U.r_D??JX, r%s'G1Ra0lm_yaAܳ@NE>/`5Ψ=Α驒oN8_B1Տ ~z4b"g%5a.H.%6ֳdZ[V~P'l&}쑡ه<6ّ@E;+Fܯ>V[3jw4ZLn`#q⥟|2-fCJL |VxͽYx{ϔQDXHj68>+0GHuEWȎ 2{̊55c&GfRO> rTy>ȣ[w'OeJh]~Zzcz3Ġ_wjC¤Lwwg:eӧ9.BLMŔUձ~g[.^S?EL[huŚVӗ@^)eY,MjvMrZh{לU9U`~xnaJHn{/qxPS@žۺ"ȡj-R'݊8dE`"D S,i)zrN)$K˵g%YNA*&ᵋ'b:!0U16S0*'M A0>];S$%(R1T.PPԪ;",MClVikEdr(Ĕ"UYr;|5tU4WE?YIgX}}i[1,*̞G-vQ\%z5$vFQ-\? 1Ox&Q8ǩ2.Q΅'׎2e:l(ZY0 ԂBIMbUDhVg؂MDgCr] 岒^ƅHַ-Woh\G &1%_ }{Y޶$$fl?(RffY·F@nEm8[T,.ah>苼( SrNrSڱ&7y$nւ jQ@*$@v)ؗ6`J@1d,1X318Ik1XTXx߻Xq#$AI0F~` L"7)M`J#`<D6ǡ\*!PUQ%$C*~y j&Mk~]7992&t86큙y24Iwdž'LJMNLM}?261B4KVpp`Rpc3MAfzrxX_s;ӣc!; CQGCRo7p'@ēeXw`&4;469 "NN; 9;1Cn LDFZ ̈́fa64P'hMUС::Nz}U{{UsgnikZ -P{Ɔf8t =9MXUu_.+=<T`plxlOG`S ;?8km,p0%; NMf3cKKmAh mCh QB4dVȨ I`º!ÇF7zp<k+܇zppc C9 }:xNp@( 1@ViF!c)Y[u0˭-8 .,2PAn.JVčյ p 15wXuzYNqq6Ov#jˉkqsIG9dmi(e %B9™<ֆj!ԃւ}-OttxhCŲ4!"*, endstream endobj 189 0 obj << /Type /FontDescriptor /FontName /fe4f2b+NotoSerif-Bold /FontFile2 188 0 R /FontBBox [-212 -250 1306 1058] /Flags 6 /StemV 0 /ItalicAngle 0 /Ascent 1068 /Descent -292 /CapHeight 1462 /XHeight 1098 >> endobj 190 0 obj << /Length 1278 /Filter [/FlateDecode] >> stream xenFὮBtHs&@nu{stԒ + }ik/y_!}t~]snVyg쾝+|<.÷}v)[eO/_q9_ɯ}ഏOmt_LLv͵LJ1w9)e6=n?[i(JKiU:JSz2QeL*EJ̔Ye,*+eU(NU-уk5x5F^ky ^#k5x5F^ky ^#kxZV^kZy-^+kxZV^kZy-^+uxu:N^:y^'uxu:N^:y^'xz^^zy=^/xz^^zy=^/o xo7 Aހ7y o xo7 Aހ7y oxo7jo$JI$$*I$ITH$$QI"IDD%$JI$$*I$ITD$$III$$u>M&Iބ7ɛ&y$o›Mx o7M&Iބ7ɛ&yUoa[5joSor4ۂsޮ>,x/x;Â31x; JJ특xxx+!ÊwBxbx+ށr;2kΜJYeY7+|x oS7+[ƛețךyޢoV浖 -㭌"RW*4XqC^J[(^1»y]k}YM-x e#e_y+h܊7k:/Z5dUluz5n[eB&Si|y(%q& %+S%*ABijPU6\h,(+L,4G5sh>:OVRP*#i|e0U,*oU/*[U,Nmlx:&\}M)L2\%CHF7էʻBL)jƻJ1:%H߯:=S۳zrmkO媳7 endstream endobj 191 0 obj [259 600 600 600 600 600 600 600 600 600 600 600 600 310 293 600 600 559 559 559 559 559 559 559 559 600 304 600 600 600 600 600 600 752 671 667 767 652 621 600 600 400 600 600 653 952 788 787 638 600 707 585 652 747 600 600 600 600 600 600 600 600 600 458 600 599 648 526 648 570 407 560 666 352 600 636 352 985 666 612 645 600 522 487 404 666 605 855 645 579 528 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj 192 0 obj << /Length1 16988 /Length 10620 /Filter [/FlateDecode] >> stream x| Xו3#!Ki K H-#@XyvnQp?JGgǦ~1 Bac., nQc/+B~)n ,@u;SG${8'g]ݕMCAtfʵozӮ)KJ O̿t2PՃ{ӍZ"K+?;b+"E=W R\O"j@U(?`BnQ+)h!Y|-P2S 3 9r1şPP(ffTV,Ex8I9@(xHJRWY 웨CT+YDpsνprp p6]sp:r-ކ2P+]:Q+X ;Z2<;PH!%DsN1h7)*aZN A*Qc$ ; r6<_FQ-8FjcD"o\@Q$b-~pKצ_{QPn DQ1qQRrJT.GH*3LU:;'k:}AX\RdTUZ>a#:կqYn{WgG{[kKsScC}Z[S]e4*˶ :&?[28.6&:2"\&04Q ެA/kHsmenƞ9ӲDZBZ9f-^}N(zYr _fJ4TJZSkY/d^۞%`-Qո#4jD$#fl3 T*DфVY]#VTj1\-߄jx^a7GN jkK_CCyQ#܈]0v.-9\7goR`no>WkMktIb@DZKA0On*/m ޥ%ږ\Vqlt5*ji FNum2^o8. LMR*;䔥27ا2U*O\!xw8u ɞG]^$-[I`A\2 2>{ITyc>)x1Me +`)dR_ dm!xu0ox `5V}}ǮS+ nRFZ,\1Z Q' tXr {CpބD#, '!imU>|cb4'  ,-8o  $KB_Ѫb57p ,'˕c:},|n t/zUqT0|x<e}L~,v=,{dÏ0 ḇƃ>LYPc;N?w_Nu9uyzԩ{BkbNLL -)ݩ 0fU!6V_?mSunJ?b0Bp` KoҴ'1ŦwXov ).BS:fu'8; T7COľKUƾ{3As&b@_^w5] [8־݋E}۝W1~ɓ:[6yG`!PK{=|`O!O  _XtFp .#90gyRP4Y$^ETI)VɎ*'=Dw/;(Z@w.vÏo_qZzAckvK_@~͠+m~` 6Et}/2L:SKj'Bͨ`FH+D\ؚ,@Yԃ7!}=]Ȏ**՛y4v#-:/d@t %Nt|&@ %D?R3a°Z3y -V=CHPOSVw ~+PI A~S ??ԝԏh'?`r;7i!y/aaφ}$*$<7|0#l#>| 򿣲vFDF_ULqL̏c屎o^@,Pk'~4ρE䩈Ab(]W"x!@C 4ǟ<૆E)тsn~TTrEf\C?8TVv''Z?z@w嗱⿞(|'\Հ=HKr*>QB0\wq䛖'w}{t;<.:> &!$ XeEņB9Ofvw$ede$lcKSUǻdB"K(ɚ~|}?PQhsxsGV?GNB%Ef Oz\:$t2KLtR6111[]LU s Eӽ տ!.V -xHPh(PLzzqtC|EV94Z)U,iԻ_}8駱;_go>ͳg?}#܎-x F82@ 8qΤm\S2XZ[Bڲx<8cc-S{FƁ#-5Uף;K*&N$~-e)QTU}g}%nj4zכXU|>kLJ,9`K`hB~nIMۋ{U^dz\Ԥe%7[eP6W^yEo"Y:h񙗏6_-Θ6HĖkT'i*̱U?5s3 FD?Фx\KWfDf)y$}21& 1N ȉE<&8˟mdt<wϿ w.|p[)DD_.lzp ΉJ>Q`J1bn(0ie$'2Lr^w%9}i%#>9IFt.-,HUIz8w 4_zix_>GXQQzQV/$l~=*7jJ\{P D2<(/K1妺/|Fy3!&be52Lcd}7]ϊF×}Czr$-܁G~ybnlܫ%kнKǥ(0o ʅ^"!F_y;M۾!Ǯ&ADgΏlrw7nꜺ縋d~><^,* D5>x>yTq{z#Nd[9ݙy{8쉿!%hW%A m`X[T!1whJ>xa||7pk žc;;1eM_/PsF灾x]vNOlyR$>ؿS lGC{aCNGNJZhehclbߎ5.24&;dM{N$ilW|`F\QeTh*M鎦LU`Iɺ 1>7oaŦ[[GƤN`"!0!Ie~kGF<W;At1׎B]a#9~ê}[by -[_7zfl.TLhXIU1(9!KUb~(DwŕdCFaMG]uwB 91ݽe{ (- &3#qge!US:c.Ie?6Ҍ7(]q~|@5*W. %H~t\&'ÄaŒ[ʓ3}HDL^%5VY+oeɪvu0\_#Wg_?lqs]1bq̮K۶>59uq89'uI$o8gZ|e94j)*QvW R i,"pTZwFC?1ſq1Pޕc|okojLhE:<3+} d[5`AbV(צe U-VYdI#sI?`R՛ bc 3y򅔊S üʬ=Åp7HRRG8"E*  ?Yg+M"R$qVUUo/֙fzrfc/BIooۼ!c2mf&9o+LRy+: ?W3^h򵓌ɟ[<,d##a3`j&\lnjJ"!A!:D8 K^%g=:ZI5EO$O7Hj3u|b^el\3xE^JJ[^ҺT=_0˸d\b&O6ضМU2@OlsVK]"HPj;2v>,t田u9kNV媚]5Ɇ,UZ36_ަפeTYud'6OYkb@ߐ*A v_D>7J*3:[=pnH' (;g:\DJ-aPAcL ߷5 ;rh:I,2׺*'x>'V;tvWъx}F|Y_ NqENbmI }LBRI$:*a銘5T;E }3{MҤv>E6ā.[??B_?db8GXz3J"ók ~Q*`kK|z)Ϛ.3#I q'KajWjƍrMط>|ϫV},Z:U.s'ÄL +-# ±nL k]?Fӑ%[q@/O9~*\QfRTrL|n 94"54*\ZQw]Gmd"(6avrCnŃR#\^{3Qy ~mu1GH[ΥgR}Gc<B),LB#`CBoƹ̓!6G\WGTs1hG'3} L*E|k:EBX#bT"eb$gҴ&B'}wb9G9!G:P[͙HNHYPcnnPiH}sU.mrm7u  ;oɻnV;/%^3%9 yGL|5}TnD-G 3'&l\R!=6$mI_Z.vkPq׾;>׎g] \t^z`KKʗzIOd+}WF.IVI%~ޫ72-??zS~Yh>w0_JCkC >ן.PPdg2ґ%PfE@Y'PC@YSr8WE(GBX^09Ѹ yAR3$*Pe$rL:.PQ-$Гr8E(AOHHdfQy!P01(ޚŹyP_P̌Mنa-[59v&G33l{nb=0k_!S1VîY/9si@/-,).#&_ܳ 5<8c> ECZ^'Ч Z>3-:}uPwC_] =:"w;?"e<`!vaPs#l] fT7`nހ! [@/ g#}!j>f:eUuR#|@k;Wwµ ʏm ok½ ZH \3dxK<(pЪ:qɕlЉ3̯:ғ4]E>gyxY5 o$)~.d%;Ï^[][yX_V7pL4;{.-$ǠH9h!Q(r1|Y JER$Ci1>2 e!5F9Ez>YwFR%2TZu`= @ xiݷvV vރ`}h;<:1z)lazB27VW endstream endobj 193 0 obj << /Type /FontDescriptor /FontName /ff2762+NotoSerif /FontFile2 192 0 R /FontBBox [-212 -250 1246 1047] /Flags 6 /StemV 0 /ItalicAngle 0 /Ascent 1068 /Descent -292 /CapHeight 1462 /XHeight 1098 >> endobj 194 0 obj << /Length 1278 /Filter [/FlateDecode] >> stream xenFὮBtHs&@nu{stԒ + }ik/y_!}t~]snVyg쾝+|<.÷}v)[eO/_q9_ɯ}ഏOmt_LLv͵LJ1w9)e6=n?[i(JKiU:JSz2QeL*EJ̔Ye,*+eU(NU-уk5x5F^ky ^#k5x5F^ky ^#kxZV^kZy-^+kxZV^kZy-^+uxu:N^:y^'uxu:N^:y^'xz^^zy=^/xz^^zy=^/o xo7 Aހ7y o xo7 Aހ7y oxo7jo$JI$$*I$ITH$$QI"IDD%$JI$$*I$ITD$$III$$u>M&Iބ7ɛ&y$o›Mx o7M&Iބ7ɛ&yUoa[5joSor4ۂsޮ>,x/x;Â31x; JJ특xxx+!ÊwBxbx+ށr;2kΜJYeY7+|x oS7+[ƛețךyޢoV浖 -㭌"RW*4XqC^J[(^1»y]k}YM-x e#e_y+h܊7k:/Z5dUluz5n[eB&Si|y(%q& %+S%*ABijPU6\h,(+L,4G5sh>:OVRP*#i|e0U,*oU/*[U,Nmlx:&\}M)L2\%CHF7էʻBL)jƻJ1:%H߯:=S۳zrmkO媳7 endstream endobj 195 0 obj [259 500 408 500 500 500 500 500 346 346 500 500 250 310 250 288 559 559 559 559 559 559 559 559 559 559 286 286 500 500 500 500 500 705 653 613 727 623 589 713 792 367 500 500 623 937 763 742 604 742 655 543 612 716 674 1046 500 625 500 500 500 500 500 500 500 562 613 492 613 535 369 538 634 319 299 584 310 944 645 577 613 613 471 451 352 634 579 861 578 564 511 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 361 500 500 500 845 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 259 500 500 500 500 500 500 500 500 500 500 250 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500] endobj 196 0 obj << /Length1 9468 /Length 6474 /Filter [/FlateDecode] >> stream x: T[ו= ̀`!!U; $[8v/v$l͸:bM2͸niL&k̜r}w B# Zܒc0t6BmBe%B<؋X`HrH B+p98>4}295{r|n(ԯ#_FCiDaae`aDX F%)GjU☧MϣŻ⽔W6ԋo83,嚿ӰWyYUY֢a#a*[&iL$*:FT',]<1i:Ѥi􌕫2uY9\d0̖TXT\bE2{yEeUuMm]}CcSc.U` bKe%޽ Vf/ bs)$zgG%۩ JtKѡ :REհMEg"u&~ٙj!Ag' - t/]p;'1\r*e[ *`^aZ JuAN:Oh:SX bc4@1B|cr̞f/pKp53TOWifc) A>ypJ.,h Ӡ@nZE4h-"ɓ|| 5{ޣw\;J.%N_AЛBƦhMy T) b` Vhl2Zۋ Mau]t̄f;=h&=]Q;5յV)81 o $A+c1F  D{ܭ?AE1r֊cFA&MCчϐ/DX O[- Fy~C]vi3?>M{ /nTݳ$,0xx 9:rd^_lxfuhT b]Z1m#x2e7iq pጺ+gf->vPf1~;Yɥo9v' 5QElgJuJR ҥ ᕰ;d%WU˼ӆwړͺ cT8 C`M;cb m,fe;J縵=hDBF߱yWTМ $gS#ʺ̤ m;S75Ep#^/UmxzP13@UUO(m+5@c$Pڷz.\,ݞSqGE7_[i! \ClqT;EwemOPһPE)1w,bIZuWCkڡr;ͯ=wymLj)O?$8?bwܦuVRwe?/̾C8P|WilN-n].=OWnTozv"_Ku≽M6Қȓf|puz',gy(BkT+TMսݾ5MNgکio(IUۛN.+[)WʊJrB9:OBYz9~i9ťX>5tCm>𹨮< %֕ChUecSE)hd<ܹ^24%-{p7{@LΩVխ#ɢyb){,}}k_=W%HA~9ϓqRMw9زd _1忉b&_U†2LC5ݮf{eUQw]wgcm>hjԫٌtbyuaE,a[8HI}aQ~a2q>'3{c&|A[4f2UMl,w:wM'!/c3p1+/ ;mމ1?7ݦ<>st|dj&b@`0'ʓcqox; }Ox``{›ʹGG^3 ƘIta<Ó 36ǦgxpxB: N GF6Q`V6㪩mj`RZ`´׺j[]L{Y" G!Cp1(e³ 5&B-0w 'P%\4 ) N9r*=^n6PfPeS1 #By0_ &$:c̀y,:9=> endobj 198 0 obj << /Length 1278 /Filter [/FlateDecode] >> stream xenFὮBtHs&@nu{stԒ + }ik/y_!}t~]snVyg쾝+|<.÷}v)[eO/_q9_ɯ}ഏOmt_LLv͵LJ1w9)e6=n?[i(JKiU:JSz2QeL*EJ̔Ye,*+eU(NU-уk5x5F^ky ^#k5x5F^ky ^#kxZV^kZy-^+kxZV^kZy-^+uxu:N^:y^'uxu:N^:y^'xz^^zy=^/xz^^zy=^/o xo7 Aހ7y o xo7 Aހ7y oxo7jo$JI$$*I$ITH$$QI"IDD%$JI$$*I$ITD$$III$$u>M&Iބ7ɛ&y$o›Mx o7M&Iބ7ɛ&yUoa[5joSor4ۂsޮ>,x/x;Â31x; JJ특xxx+!ÊwBxbx+ށr;2kΜJYeY7+|x oS7+[ƛețךyޢoV浖 -㭌"RW*4XqC^J[(^1»y]k}YM-x e#e_y+h܊7k:/Z5dUluz5n[eB&Si|y(%q& %+S%*ABijPU6\h,(+L,4G5sh>:OVRP*#i|e0U,*oU/*[U,Nmlx:&\}M)L2\%CHF7էʻBL)jƻJ1:%H߯:=S۳zrmkO媳7 endstream endobj 199 0 obj [500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 364 500 500 500 500 500 500 500 500 364 500 500 500 500 500 364 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 500 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364 364] endobj 200 0 obj << /Length1 7884 /Length 4817 /Filter [/FlateDecode] >> stream x8 T[U}/ h (ml _K %@ PmyTHbj5-V3=oNm:vF{ܞq::Xg8$ݛ ~ {E完O/R]#F!i;#t+;nH FoH x @vB~`)ܟ64<6An^nY<.XE{˼#gI_F<p N/qڈ͈S{D~a3Od #ߍ`H&-HAπJ2.NȻ=sHŰ9O;{.fyt+@d%O=Gc:x f?z[y0h9ֳkքU|gZA4pճc0!y\pRi>2ЫpZ085{F ػBhD.p'a<`飺qhӬ=ǣ$\iC[rPI0/%5m>bW1[{wWgG[&\qCukԬ^tyqQ2 ?/אO_0?5e^rNVE").Ep)IMsebt%4'$3DOkZ%j$Dx"Qo氦#ԚPUiZ]7(5)e0`*Br)8Ao$[M*bQ:V1?Ԧ,,\kTJc:Qz*zpR4qou*FEk4_(QVHeͿeTX{ND%0铋s)n+ lFMm~DZZ4h CwM_8`T)zSmnUs*BauRc~FߴL緱Le_3S7sEI"4'893]V*BGb}O;X)$1_ffе}\W6*"L ;m9rbĈ22Z 0=VRvzsQ-+UKq*f fZ# va|^>B *a-[mQ/)uRa0uY.0]R&YTA 4b_YNϠ2z R1_1a$ 3jZ8ר$LziLS S0}(GmB@jYI*LơDŽs*kՆZ$FF7*[T9Qe6_ŶMi4YjGrIUM5F~yxD0Ycldwri|1leB+ii(+ŗYÄD0;['e{g@FWC29OPTQ!!LS7"\x s5I;y4oJKDlG)ۑAzS/( ?L']K?~)]gh1rL{&z%%IqKN!w*v6(;pl9A}CÒVT\KZfC@d"p?$\0AB U #% \Œ a&p$݆Ĵø0)ݎ3mo aTչeW!O85jb(D U!raIeL5 uRAuUVT 0rW32xa?3AZڛm5~ )٭Ax֣&I"JHMK2e*sщW]om 陇2m)\9;ݗ}[5_zcUGI??{?6҅K{gb.b6INA7-šRP֛*r53O?o|24>o7_}3$;eu?_( ػ1NYVD*(hVdIuB&(1$|+?]!T2* igrɆnj5/2-x ح1?~Q`s,{3%+bq$}gY,{ߣ=G2~Wܐb`MlRtAX9 d::QţidWsoV7qK.5k%wo,F lڈ۶q,C=XuIec0YX}=;O^}zuٗMbb.~FY_}u̠i^:g$g6Ym }ʕiYH[_k_e%cb@<"“$F)uo?oڌ#;E/)g¾݋u)bat?gtV6 Xk z?:qۚ]pqhf/`;~&W5}ǞR/L~ښ,S)IJw {~ ۪XE#m6oڻIWS;FO7r6JϬ2]լ;$jӖd i<ϲVx뭛*<״L=†=(MՆ=ՖbEkP,'&<+8wK1&,[ODNj: א*]2I=Tɂtf O~CmX 9ON&O} JݹmC_OyrĝoOm_/^K1ބɬ̅&ȨXy $ (y4s^r%MG=laG^USCD X[bo-$o%ǯ !@ b XUaOC k TX iQa} 'NyB-5NrxOS!g~[J}OZf^ٯym0Wae*,BR5P ޤZpXi=we5TS`YSaQNZ{*<__T@UsX7ʕ*@`hX6@9݌rX=Hoq6Xw|!ZFЄr( 5JyM "eM#!Gq}EGvX7t_?Fg=  {#ຊo|+T ɑ Tb۹^=@]n #, G#h+SveB-!PJ$fU9fe_8b4%~ZPo6{mZ[Os^[]ciG7mhzl5>jkRه|S0$4ఏ.+ $" ߠoC!"(F|aG|wCr5 QԄe|-:B`$\ BCMmЈ xCÛ5JX p  (G)øv sLUF];qd;`tmHqnڌG%} ͞㻣vI "17xϹFuo왣9j.Պ:|WSRW"+G_([B߼{*W46hX|׋e6ZX:$&TXsa"e6\;Ums4"z`3_#ѫ_BxBv)4pȁkfځ+t܎ |oR(Z&~ ۡV0[F q&LwBq exةOy~$Q~&rGx.+VQ?ca' N?sƐ6}U}JW0z*r0,!̷{c=?Yͼn]Xw/Vۉwm+x-7+ endstream endobj 201 0 obj << /Type /FontDescriptor /FontName /e8f2e8+NotoSerif-Italic /FontFile2 200 0 R /FontBBox [-254 -250 1238 1047] /Flags 70 /StemV 0 /ItalicAngle -12 /Ascent 1068 /Descent -292 /CapHeight 1462 /XHeight 1098 >> endobj 202 0 obj << /Length 1278 /Filter [/FlateDecode] >> stream xenFὮBtHs&@nu{stԒ + }ik/y_!}t~]snVyg쾝+|<.÷}v)[eO/_q9_ɯ}ഏOmt_LLv͵LJ1w9)e6=n?[i(JKiU:JSz2QeL*EJ̔Ye,*+eU(NU-уk5x5F^ky ^#k5x5F^ky ^#kxZV^kZy-^+kxZV^kZy-^+uxu:N^:y^'uxu:N^:y^'xz^^zy=^/xz^^zy=^/o xo7 Aހ7y o xo7 Aހ7y oxo7jo$JI$$*I$ITH$$QI"IDD%$JI$$*I$ITD$$III$$u>M&Iބ7ɛ&y$o›Mx o7M&Iބ7ɛ&yUoa[5joSor4ۂsޮ>,x/x;Â31x; JJ특xxx+!ÊwBxbx+ށr;2kΜJYeY7+|x oS7+[ƛețךyޢoV浖 -㭌"RW*4XqC^J[(^1»y]k}YM-x e#e_y+h܊7k:/Z5dUluz5n[eB&Si|y(%q& %+S%*ABijPU6\h,(+L,4G5sh>:OVRP*#i|e0U,*oU/*[U,Nmlx:&\}M)L2\%CHF7էʻBL)jƻJ1:%H߯:=S۳zrmkO媳7 endstream endobj 203 0 obj [259 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 579 562 600 600 493 317 600 600 600 600 600 304 600 599 574 600 560 467 463 368 599 600 818 600 527 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj xref 0 204 0000000000 65535 f 0000000015 00000 n 0000000376 00000 n 0000000580 00000 n 0000000753 00000 n 0000000804 00000 n 0000001076 00000 n 0000022853 00000 n 0000023614 00000 n 0000023786 00000 n 0000023953 00000 n 0000024125 00000 n 0000024302 00000 n 0000024479 00000 n 0000024697 00000 n 0000024743 00000 n 0000024792 00000 n 0000024837 00000 n 0000035551 00000 n 0000035943 00000 n 0000036115 00000 n 0000036159 00000 n 0000036340 00000 n 0000036384 00000 n 0000036590 00000 n 0000036634 00000 n 0000036809 00000 n 0000036933 00000 n 0000048869 00000 n 0000049275 00000 n 0000049319 00000 n 0000049363 00000 n 0000049542 00000 n 0000049586 00000 n 0000049785 00000 n 0000049974 00000 n 0000050159 00000 n 0000050363 00000 n 0000050407 00000 n 0000050528 00000 n 0000075417 00000 n 0000075830 00000 n 0000076047 00000 n 0000076210 00000 n 0000076421 00000 n 0000076603 00000 n 0000076730 00000 n 0000076927 00000 n 0000077053 00000 n 0000085810 00000 n 0000086216 00000 n 0000086260 00000 n 0000086428 00000 n 0000086598 00000 n 0000086764 00000 n 0000087025 00000 n 0000087191 00000 n 0000087312 00000 n 0000099079 00000 n 0000099446 00000 n 0000099490 00000 n 0000099534 00000 n 0000099709 00000 n 0000111529 00000 n 0000111934 00000 n 0000111978 00000 n 0000112188 00000 n 0000112232 00000 n 0000112276 00000 n 0000112407 00000 n 0000112526 00000 n 0000112648 00000 n 0000124511 00000 n 0000124909 00000 n 0000124953 00000 n 0000125136 00000 n 0000125325 00000 n 0000125499 00000 n 0000125543 00000 n 0000125587 00000 n 0000136367 00000 n 0000136758 00000 n 0000136802 00000 n 0000137006 00000 n 0000137207 00000 n 0000137251 00000 n 0000147193 00000 n 0000147523 00000 n 0000157466 00000 n 0000157837 00000 n 0000157881 00000 n 0000158006 00000 n 0000166642 00000 n 0000167001 00000 n 0000167129 00000 n 0000177671 00000 n 0000178001 00000 n 0000189146 00000 n 0000189518 00000 n 0000189562 00000 n 0000189994 00000 n 0000190331 00000 n 0000190564 00000 n 0000197789 00000 n 0000198121 00000 n 0000209990 00000 n 0000210359 00000 n 0000210405 00000 n 0000210451 00000 n 0000211631 00000 n 0000211963 00000 n 0000212088 00000 n 0000212216 00000 n 0000212352 00000 n 0000212488 00000 n 0000212617 00000 n 0000212750 00000 n 0000212891 00000 n 0000213033 00000 n 0000213177 00000 n 0000213323 00000 n 0000213458 00000 n 0000213645 00000 n 0000213783 00000 n 0000213920 00000 n 0000214060 00000 n 0000214202 00000 n 0000214336 00000 n 0000214470 00000 n 0000214606 00000 n 0000214744 00000 n 0000214886 00000 n 0000215029 00000 n 0000215155 00000 n 0000215285 00000 n 0000215418 00000 n 0000215552 00000 n 0000215678 00000 n 0000215805 00000 n 0000215927 00000 n 0000216052 00000 n 0000216178 00000 n 0000216306 00000 n 0000216453 00000 n 0000216601 00000 n 0000216741 00000 n 0000216882 00000 n 0000217033 00000 n 0000217186 00000 n 0000217318 00000 n 0000217450 00000 n 0000217579 00000 n 0000217707 00000 n 0000217833 00000 n 0000217958 00000 n 0000218088 00000 n 0000218218 00000 n 0000218357 00000 n 0000218495 00000 n 0000218573 00000 n 0000218722 00000 n 0000218913 00000 n 0000219079 00000 n 0000219275 00000 n 0000219488 00000 n 0000219702 00000 n 0000219946 00000 n 0000220140 00000 n 0000220360 00000 n 0000220577 00000 n 0000220775 00000 n 0000221007 00000 n 0000221187 00000 n 0000221369 00000 n 0000221593 00000 n 0000221749 00000 n 0000221942 00000 n 0000222180 00000 n 0000222404 00000 n 0000222662 00000 n 0000222918 00000 n 0000223182 00000 n 0000223414 00000 n 0000223674 00000 n 0000223863 00000 n 0000224164 00000 n 0000224208 00000 n 0000224482 00000 n 0000224756 00000 n 0000233957 00000 n 0000234176 00000 n 0000235531 00000 n 0000236446 00000 n 0000247159 00000 n 0000247373 00000 n 0000248728 00000 n 0000249644 00000 n 0000256209 00000 n 0000256422 00000 n 0000257777 00000 n 0000258692 00000 n 0000263600 00000 n 0000263824 00000 n 0000265179 00000 n trailer << /Size 204 /Root 2 0 R /Info 1 0 R >> startxref 266094 %%EOF fangfrisch-1.9.0/docs/index.html000066400000000000000000002104101457257166100165740ustar00rootroot00000000000000 Fangfrisch

Fangfrisch (German for "freshly caught") is a sibling of the Clam Anti-Virus freshclam utility. It allows downloading virus definition files that are not official ClamAV canon, e.g. from Sanesecurity and URLhaus. Fangfrisch was designed with security in mind, to be run by an unprivileged user only. For those curious about the development history, a changelog is available online.

1. License

Copyright © 2020-2024 Ralph Seichter

This file is part of "Fangfrisch".

Fangfrisch 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.

Fangfrisch 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 Fangfrisch. If not, see https://www.gnu.org/licenses/.

2. Update strategy

Fangfrisch is expected to run periodically, e.g. using cron. Fangfrisch will attempt to download digests first (if available upstream), and only retrieve corresponding signature files when their recorded digest changes, minimising transfer volumes.

I recommend running Fangfrisch at 10 minute intervals. There is no need to worry about overburdening your machine, the network or remote signature providers. Each individual download is recorded in the database, and whenever Fangfrisch is run, it checks those recorded timestamps against the preconfigured provider intervals. No network connections are made for downloaded signature files which are considered "too young to update".

Imagine a provider interval setting of 45 minutes. Even if launched every 10 minutes, Fangfrisch will not attempt to download related signature files before 45 minutes have passed since the last recorded successful download. Provider intervals are set to reasonable defaults internally, but you can override them if necessary.

3. Installation

Fangfrisch requires Python 3.7 or newer. Python 3.6 security support, i.e. its final lifecycle stage, was terminated in 2021 by the Python authors. Please do not ask me to modify Fangfrisch in order to support ancient Python versions, which pose a potential security risk to you.

The recommended installation method is using the pip command in a virtual Python environment. Here is an example listing of commands for BASH, to be executed as root, assuming that you will be running Fangfrisch as an unprivileged user who is member of the clamav group:

3.1. Create home directory

mkdir -m 0770 -p /var/lib/fangfrisch
chgrp clamav /var/lib/fangfrisch

This will grant group members the necessary write access to create the database (see Section 6).

3.2. Prepare and activate venv

cd /var/lib/fangfrisch
python3 -m venv venv
source venv/bin/activate

3.3. Install via PyPI

pip install fangfrisch

This step will also create an executable launcher script venv/bin/fangfrisch.

4. Installation packages

As an alternative to pip-based installation, there are packages available for the following Linux distributions:

5. Configuration

A configuration file is mandatory, uses an INI-File-like structure and must contain a db_url entry. All other settings are optional. However, unless you enable one signature file provider section, Fangfrisch naturally won’t do much.

Use the --conf command line argument (see Section 7) to specify the path to your configuration file. Note that there is no default location.

# Minimal example configuration, meant for testing.

[DEFAULT]
db_url = sqlite:////var/lib/fangfrisch/db.sqlite
local_directory = /var/lib/clamav

[urlhaus]
enabled = yes
  • cleanup: Cleanup method used for provider sections. Default: automatic, alternative: disabled. In automatic mode, Fangfrisch will attempt to delete obsolete virus definition files whenever you disable a provider section. Should you disable this option, orphaned files will be left behind, and you need to ensure cleanup by different means.

  • connection_timeout: Timeout in seconds, used when establishing network connections to download signature files. Default: 30. Be aware that longer timeouts increase the risk of multiple Fangfrisch instances running concurrently. This could, in turn, cause database access problems, and network socket congestion. If your Internet connection is fast, I even suggest testing timeout values lower than the default 30 seconds.

  • db_url: Database URL in SQLAlchemy syntax. Mandatory, no default. Typically, a local SQLite database will suffice.

  • enabled: Scan this section for URLs? Default: false.

  • integrity_check: Mechanism for integrity checks. Default: sha256. You can use disabled if the signature file provider offers no checksums.

  • interval: Interval between downloads. Defaults are provider-dependent. Values can be expressed in human-readable form (e.g. 12h or 45m). Please respect the limits set by each provider.

  • local_directory: Downloaded files are stored here. No default, so the current working directory of the Python process is used. As this can vary depending on how you launch Fangfrisch, it is highly recommended to define an absolute path like /var/lib/clamav instead. You can override this option in provider sections to separate downloads based on origin.

  • log_format: See Formatter class documentation for details. Fangfrisch uses sensible defaults depending on the selected log method.

  • log_level: Choose one of DEBUG, INFO, WARNING (default), ERROR or FATAL.

  • log_method: Either console (default, meaning stdout/stderr) or syslog. For the latter, you can also specify a log_target.

  • log_target: The syslog target address. Typical values are /dev/log (local Linux domain socket), localhost or host.domain.tld:udpport. If no target is specified, localhost is assumed. The UDP port number defaults to 514.

  • max_size: Maximum expected file size. The default is 10MB, but all predefined providers have individual size limits (see Appendix A). Values are can be expressed in human-readable form (e.g. 250KB or 3MB). Fangfrisch attempts to inspect the content length before downloading virus signature files so as not to download files larger than the defined limit. If providers don’t respond with content length information, Fangfrisch will log a warning but download the data anyway.

  • on_update_exec: If any files were downloaded during a pass, a command can be executed in after the pass finishes. No default. A typical value is clamdscan --reload. Starting with Fangfrisch 1.9.0, this option may be overridden in individual sections, permitting per-provider actions.

  • on_update_timeout: Timeout for the on_update_exec command, in seconds. Default: 30. This option may also be overridden in individual sections.

See here for details about the configuration parser and extended interpolation. Section 5.3 provides additional information on how configuration options are interpreted.

5.1. Default providers

Fangfrisch contains internal defaults for the following providers, listed in alphabetical order:

I have also included "Fangfrisch News" (see Appendix C). Providers can be enabled by specifiying enabled = yes in the desired configuration file sections.

Important
Please make sure to examine the respective settings for yourself before enabling providers.

The defaults may not suit your personal preferences, and some providers require additional configuration, e.g. an access token.

# Example configuration

[DEFAULT]
db_url = sqlite:////var/lib/fangfrisch/db.sqlite

# The following settings are optional. Other sections inherit
# values from DEFAULT and may also overwrite values.

local_directory = /var/lib/clamav
max_size = 5MB
on_update_exec = clamdscan --reload
on_update_timeout = 42

[interserver]
enabled = yes

[malwarepatrol]
enabled = yes
# Replace with your personal Malwarepatrol receipt
receipt = abcd1234

[sanesecurity]
enabled = yes
# Use a non-default mirror
prefix = https://mirror.rollernet.us/sanesecurity/

[securiteinfo]
enabled = yes
# Replace with your personal SecuriteInfo customer ID
customer_id = abcdef123456

[urlhaus]
enabled = yes
max_size = 2MB

5.2. User-defined providers

Fangfrisch is of course not limited to the internal defaults. You can define as many additional virus definition providers as you like. The following defines a fictional provider:

[fictionalprovider]
enabled = yes
integrity_check = md5
interval = 90m
prefix = http://fictional-provider.tld/clamav-unofficial/

# Reference the defined prefix in URL definitions. Values in
# other sections can be referenced using ${section:option}.
url_eggs = ${prefix}eggs.ndb
url_spam = ${prefix}spam.hdb

# Override local file name for url_spam
filename_spam = spam_spam_spam_lovely_spam.db

# Execute command after each fresh download from url_eggs
on_update_eggs = echo Fresh eggs in {path}

5.3. Semantics

Fangfrisch will scan enabled sections for lines prefixed with url_ to determine download sources for virus definition files.

  • The value of integrity_check determines both the expected filename suffix for digests and the hashing mechanism used for verification.

  • Local file names will be determined by parsing URLs, but can be manually overridden. To change the file name for url_xyz, set filename_xyz to the desired value.

  • To launch a command after data was downloaded for url_xyz, define on_update_xyz. The command string may contain a {path} placeholder, which will be substituted with the full path of the downloaded file.

You can disable refresh operations for selected URLs by assigning either an empty value or setting it to url_xyz = disabled. Note that disabling URLs in this manner does not delete any previously downloaded files.

5.4. Proxy support

Fangfrisch relies on the requests library to download files, which supports environment variables like HTTPS_PROXY. Please refer to section Advanced Usage, subsection Proxies in the requests online documentation for details.

6. Preparing the database

After completing the configuration, make sure to create the database structure by running the initdb command in a root shell as shown below. Running --force initdb will drop existing database tables. For SQLite, deleting the database file is a viable alternative.

sudo -u clamav -- fangfrisch --conf /etc/fangfrisch.conf initdb
Important
Fangfrisch need never be run as root. Choose an unprivileged user instead (typically clamav).

7. Usage

You can display command line arguments as follows:

$ fangfrisch --help

usage: fangfrisch [-h] [-c CONF] [-f] [-p PROVIDER]
                  {dumpconf,dumpmappings,initdb,refresh}

Update and verify unofficial ClamAV signatures.

positional arguments:
  {dumpconf,dumpmappings,initdb,refresh}

options:
  -h, --help            show this help message and exit
  -c CONF, --conf CONF  configuration file
  -f, --force           force action (default: False)
  -p PROVIDER, --provider PROVIDER
                        provider name filter (regular expression)

You can choose among following actions:

  • dumpconf: Dump the effective configuration to stdout, combining both internal defaults and your own settings. The effective configuration for the example shown in Section 5 is available in Appendix B.

  • dumpmappings: Dump URL-to-filepath mappings, as recorded in the database refresh log, to stdout. See Appendix D for details.

  • initdb: Create the database structure. This needs to be run only once, before the first refresh. Using the --force option will drop existing tables from the database.

  • refresh: Refresh the configured URLs. The --force option can be used to override download interval settings.

As stated before, Fangfrisch is typically run using cron. Depending on your host OS, you may use a systemd timer as an alternative. An example crontab looks like this:

HOME=/var/lib/fangfrisch
LOG_LEVEL=INFO
# minute hour day-of-month month day-of-week user command
*/10 * * * * clamav sleep $((RANDOM \% 42)); venv/bin/fangfrisch --conf /etc/fangfrisch.conf refresh

8. Support

The project is hosted on GitHub. Before opening tickets or contacting the author, always check existing issues first, including closed ones. This is not meant to discourage you; it just saves time and effort for all involved. Please contact the author Ralph Seichter only after having done your "research". Thank you.

8.1. Reporting possible problems

If you experience problems, please start by trying to figure out underlying issues on your own. Running with DEBUG level logging helps with that. Should your efforts fail, consider filing a GitHub issue. Each issue needs to answer the questions listed below.

If you answer question number 1, 2 or 3 with "no", do not file an issue. Please answer all other questions as detailed as you can, within reason.

  1. Have you checked the documentation?

  2. Have you checked all existing issues, including closed ones?

  3. Have you done your personal best to resolve the issue on your own?

  4. What exactly did you do?

  5. What did you expect to happen?

  6. What happened instead?

  7. What was your exact setup (operating system, Python core version, Python module versions)?

8.2. Offering suggestions

The list of questions is shorter, but important nonetheless:

  1. Have you checked the documentation?

  2. Have you checked all existing issues, including closed ones?

  3. Do you consider the suggested feature helpful for more people than just yourself?

If you answered "yes" for all questions, please explain your idea in a sufficiently thorough manner. Use examples, graphics, and whatever else you think would help others to understand your suggestion.

8.3. Discussion precedes contribution

I do not accept any code or documentation contributions which have not been previously agreed upon. This means the order of steps is as follows:

  1. Open an issue or discussion topic first.

  2. Have a conversation about the matter at hand.

  3. Reach a consensus about both form and content of the contribution.

  4. Wait for a yay/nay signal from me.

Please do not submit any pull requests before I ask for them, as they will be closed. This outlined, proven practice will save time for all involved. See Heather McNamee’s blog Always start with an issue for more information.

Appendix A: Default configuration

Fangfrisch contains the following internal configuration settings as defaults. As a safety measure, all sections are disabled by default. Entries with the !url_ prefix are included for reference only. These represent data sources which are not recommended for general use. Possible reasons: Some sources have an elevated risk of false positives, are not free to use, or contain legacy data. Enabling a section will not enable these specially prefixed entries.

[DEFAULT]
cleanup = automatic
enabled = false
integrity_check = sha256
log_level = WARNING
log_method = console
max_size = 10MB

[fangfrischnews]
interval = 12h
local_directory = /tmp
max_size = 100KB
script = /path/to/fangfrisch-has-news.sh
on_update_exec = [ ! -x ${script} ] || ${script} ${local_directory}
prefix = https://www.seichter.de/fangfrisch/
url_alerts = ${prefix}fangfrisch_alerts.txt
url_news = ${prefix}fangfrisch_news.txt

[interserver]
interval = 1h
integrity_check = disabled
max_size = 5MB
prefix = http://sigs.interserver.net/
!url_shell_hdb = ${prefix}shell.hdb
!url_shellb_db = ${prefix}shellb.db
url_interserver256 = ${prefix}interserver256.hdb
url_shell_ldb = ${prefix}shell.ldb
filename_shell_ldb = interservershell.ldb
url_topline = ${prefix}interservertopline.db
url_whitelist_fp = ${prefix}whitelist.fp
filename_whitelist_fp = interserverwhitelist.fp

[malwarepatrol]
interval = 1d
integrity_check = disabled
product = 8
receipt = you_forgot_to_configure_receipt
prefix = https://lists.malwarepatrol.net/cgi/getfile?product=${product}&receipt=${receipt}&list=
url_clamav_basic = ${prefix}clamav_basic
filename_clamav_basic = malwarepatrol.db

[sanesecurity]
interval = 1h
prefix = http://mirror.sentries.org/sanesecurity/
!url_foxhole_all_cdb = ${prefix}foxhole_all.cdb
!url_foxhole_all_ndb = ${prefix}foxhole_all.ndb
!url_foxhole_links = ${prefix}foxhole_links.ldb
!url_foxhole_mail = ${prefix}foxhole_mail.cdb
!url_winnow_phish_complete = ${prefix}winnow_phish_complete.ndb
url_badmacro = ${prefix}badmacro.ndb
url_blurl = ${prefix}blurl.ndb
url_bofhland_cracked_url = ${prefix}bofhland_cracked_URL.ndb
url_bofhland_malware_attach = ${prefix}bofhland_malware_attach.hdb
url_bofhland_malware_url = ${prefix}bofhland_malware_URL.ndb
url_bofhland_phishing_url = ${prefix}bofhland_phishing_URL.ndb
url_foxhole_filename = ${prefix}foxhole_filename.cdb
url_foxhole_generic = ${prefix}foxhole_generic.cdb
url_foxhole_js_cdb = ${prefix}foxhole_js.cdb
url_foxhole_js_ndb = ${prefix}foxhole_js.ndb
url_hackingteam = ${prefix}hackingteam.hsb
url_junk = ${prefix}junk.ndb
url_jurlbl = ${prefix}jurlbl.ndb
url_jurlbla = ${prefix}jurlbla.ndb
url_lott = ${prefix}lott.ndb
url_malwareexpert_fp = ${prefix}malware.expert.fp
url_malwareexpert_hdb = ${prefix}malware.expert.hdb
url_malwareexpert_ldb = ${prefix}malware.expert.ldb
url_malwareexpert_ndb = ${prefix}malware.expert.ndb
url_malwarehash = ${prefix}malwarehash.hsb
url_phish = ${prefix}phish.ndb
url_phishtank = ${prefix}phishtank.ndb
url_porcupine = ${prefix}porcupine.ndb
url_rogue = ${prefix}rogue.hdb
url_scam = ${prefix}scam.ndb
url_shelter = ${prefix}shelter.ldb
url_sigwhitelist = ${prefix}sigwhitelist.ign2
url_spamattach = ${prefix}spamattach.hdb
url_spamimg = ${prefix}spamimg.hdb
url_spear = ${prefix}spear.ndb
url_spearl = ${prefix}spearl.ndb
url_ssftm = ${prefix}sanesecurity.ftm
url_winnow_attachments = ${prefix}winnow.attachments.hdb
url_winnow_bad_cw = ${prefix}winnow_bad_cw.hdb
url_winnow_extended_malware = ${prefix}winnow_extended_malware.hdb
url_winnow_extended_malware_links = ${prefix}winnow_extended_malware_links.ndb
url_winnow_malware = ${prefix}winnow_malware.hdb
url_winnow_malware_links = ${prefix}winnow_malware_links.ndb
url_winnow_phish_complete_url = ${prefix}winnow_phish_complete_url.ndb
url_winnow_spam_complete = ${prefix}winnow_spam_complete.ndb

[securiteinfo]
customer_id = you_forgot_to_configure_customer_id
interval = 1h
max_size = 20MB
prefix = https://www.securiteinfo.com/get/signatures/${customer_id}/
!url_0hour = ${prefix}securiteinfo0hour.hdb
!url_old = ${prefix}securiteinfoold.hdb
!url_securiteinfo_mdb = ${prefix}securiteinfo.mdb
!url_securiteinfo_pdb = ${prefix}securiteinfo.pdb
!url_securiteinfo_yara = ${prefix}securiteinfo.yara
url_android = ${prefix}securiteinfoandroid.hdb
url_ascii = ${prefix}securiteinfoascii.hdb
url_html = ${prefix}securiteinfohtml.hdb
url_javascript = ${prefix}javascript.ndb
url_pdf = ${prefix}securiteinfopdf.hdb
url_securiteinfo = ${prefix}securiteinfo.hdb
url_securiteinfo_ign2 = ${prefix}securiteinfo.ign2
url_spam_marketing = ${prefix}spam_marketing.ndb

[urlhaus]
interval = 10m
url_urlhaus = https://urlhaus.abuse.ch/downloads/urlhaus.ndb

Appendix B: Effective configuration

The following effective configuration is the result of combining internal defaults (see Appendix A) with the example settings shown in Section 5.

[DEFAULT]
cleanup = automatic
enabled = false
integrity_check = sha256
log_level = WARNING
log_method = console
max_size = 5MB
db_url = sqlite:////var/lib/fangfrisch/db.sqlite
local_directory = /var/lib/clamav
on_update_exec = clamdscan --reload
on_update_timeout = 42

[fangfrischnews]
interval = 12h
local_directory = /tmp
max_size = 100KB
script = /path/to/fangfrisch-has-news.sh
on_update_exec = [ ! -x ${script} ] || ${script} ${local_directory}
prefix = https://www.seichter.de/fangfrisch/
url_alerts = ${prefix}fangfrisch_alerts.txt
url_news = ${prefix}fangfrisch_news.txt

[interserver]
interval = 1h
integrity_check = disabled
max_size = 5MB
prefix = http://sigs.interserver.net/
!url_shell_hdb = ${prefix}shell.hdb
!url_shellb_db = ${prefix}shellb.db
url_interserver256 = ${prefix}interserver256.hdb
url_shell_ldb = ${prefix}shell.ldb
filename_shell_ldb = interservershell.ldb
url_topline = ${prefix}interservertopline.db
url_whitelist_fp = ${prefix}whitelist.fp
filename_whitelist_fp = interserverwhitelist.fp
enabled = yes

[malwarepatrol]
interval = 1d
integrity_check = disabled
product = 8
receipt = abcd1234
prefix = https://lists.malwarepatrol.net/cgi/getfile?product=${product}&receipt=${receipt}&list=
url_clamav_basic = ${prefix}clamav_basic
filename_clamav_basic = malwarepatrol.db
enabled = yes

[sanesecurity]
interval = 1h
prefix = https://mirror.rollernet.us/sanesecurity/
!url_foxhole_all_cdb = ${prefix}foxhole_all.cdb
!url_foxhole_all_ndb = ${prefix}foxhole_all.ndb
!url_foxhole_links = ${prefix}foxhole_links.ldb
!url_foxhole_mail = ${prefix}foxhole_mail.cdb
!url_winnow_phish_complete = ${prefix}winnow_phish_complete.ndb
url_badmacro = ${prefix}badmacro.ndb
url_blurl = ${prefix}blurl.ndb
url_bofhland_cracked_url = ${prefix}bofhland_cracked_URL.ndb
url_bofhland_malware_attach = ${prefix}bofhland_malware_attach.hdb
url_bofhland_malware_url = ${prefix}bofhland_malware_URL.ndb
url_bofhland_phishing_url = ${prefix}bofhland_phishing_URL.ndb
url_foxhole_filename = ${prefix}foxhole_filename.cdb
url_foxhole_generic = ${prefix}foxhole_generic.cdb
url_foxhole_js_cdb = ${prefix}foxhole_js.cdb
url_foxhole_js_ndb = ${prefix}foxhole_js.ndb
url_hackingteam = ${prefix}hackingteam.hsb
url_junk = ${prefix}junk.ndb
url_jurlbl = ${prefix}jurlbl.ndb
url_jurlbla = ${prefix}jurlbla.ndb
url_lott = ${prefix}lott.ndb
url_malwareexpert_fp = ${prefix}malware.expert.fp
url_malwareexpert_hdb = ${prefix}malware.expert.hdb
url_malwareexpert_ldb = ${prefix}malware.expert.ldb
url_malwareexpert_ndb = ${prefix}malware.expert.ndb
url_malwarehash = ${prefix}malwarehash.hsb
url_phish = ${prefix}phish.ndb
url_phishtank = ${prefix}phishtank.ndb
url_porcupine = ${prefix}porcupine.ndb
url_rogue = ${prefix}rogue.hdb
url_scam = ${prefix}scam.ndb
url_shelter = ${prefix}shelter.ldb
url_sigwhitelist = ${prefix}sigwhitelist.ign2
url_spamattach = ${prefix}spamattach.hdb
url_spamimg = ${prefix}spamimg.hdb
url_spear = ${prefix}spear.ndb
url_spearl = ${prefix}spearl.ndb
url_ssftm = ${prefix}sanesecurity.ftm
url_winnow_attachments = ${prefix}winnow.attachments.hdb
url_winnow_bad_cw = ${prefix}winnow_bad_cw.hdb
url_winnow_extended_malware = ${prefix}winnow_extended_malware.hdb
url_winnow_extended_malware_links = ${prefix}winnow_extended_malware_links.ndb
url_winnow_malware = ${prefix}winnow_malware.hdb
url_winnow_malware_links = ${prefix}winnow_malware_links.ndb
url_winnow_phish_complete_url = ${prefix}winnow_phish_complete_url.ndb
url_winnow_spam_complete = ${prefix}winnow_spam_complete.ndb
enabled = yes

[securiteinfo]
customer_id = abcdef123456
interval = 1h
max_size = 20MB
prefix = https://www.securiteinfo.com/get/signatures/${customer_id}/
!url_0hour = ${prefix}securiteinfo0hour.hdb
!url_old = ${prefix}securiteinfoold.hdb
!url_securiteinfo_mdb = ${prefix}securiteinfo.mdb
!url_securiteinfo_pdb = ${prefix}securiteinfo.pdb
!url_securiteinfo_yara = ${prefix}securiteinfo.yara
url_android = ${prefix}securiteinfoandroid.hdb
url_ascii = ${prefix}securiteinfoascii.hdb
url_html = ${prefix}securiteinfohtml.hdb
url_javascript = ${prefix}javascript.ndb
url_pdf = ${prefix}securiteinfopdf.hdb
url_securiteinfo = ${prefix}securiteinfo.hdb
url_securiteinfo_ign2 = ${prefix}securiteinfo.ign2
url_spam_marketing = ${prefix}spam_marketing.ndb
enabled = yes

[urlhaus]
interval = 10m
url_urlhaus = https://urlhaus.abuse.ch/downloads/urlhaus.ndb
enabled = yes
max_size = 2MB

Appendix C: Fangfrisch News

This pseudo provider does not offer antivirus signature files. It is only meant for me to pass news about Fangfrisch to you, the user, in lieu of a mailing list. Don’t expect this to happen on a regular basis. I am only thinking about release notifications at this point in time. Still, I kindly ask you to please enable this service by adding the following to your configuration file:

[fangfrischnews]
enabled = yes
# Uncomment/adapt the following to trigger a script in case of news.
# script = /path/to/script/fangfrisch-has-news.sh

This will only enable Fangfrisch to occasionally download small text files, nothing more. You will not need to read the content, nor will anything else happen, unless you modify the script option. Here is an example script which you could use to have downloaded news items mailed to you. It needs to be readable for the user account running Fangfrisch, and the sender/recipient addresses obviously have to be adapted. For your convenience, the latest version of the script can be downloaded here.

#!/usr/bin/env bash
# vim: ts=4 sw=4 noet ft=sh
#
# Example script to process Fangfrisch News.

declare -r MAILFROM="noreply"
declare -r MAILTO="alice@example.com"
declare -r SUBJECT="Fangfrisch News are available"

# Option 1: Mutt
#declare -r MAILAPP="mutt"
#declare -r MAILAPP_OPT=( "-s" "$SUBJECT" "$MAILTO" )

# Option 2: sendmail
#declare -r MAILAPP="sendmail"
#declare -r MAILAPP_OPT=( "-t" )
#export PATH="$PATH:/usr/sbin"

# Option 3: swaks
declare -r MAILAPP="swaks"
declare -r MAILAPP_OPT=( "-d" "-" "-f" "$MAILFROM" "-t" "$MAILTO" )

### No changes required below this line ###

set -euo pipefail

die() {
	echo >&2 "$@"
	exit 1
}

usage() {
	die "Usage: $(basename "$0") {directory}"
}

gen_header() {
	cat <<EOT
From: Fangfrisch News <$MAILFROM>
To: $MAILTO
Subject: $SUBJECT

EOT
# Mail header must end with an empty line!
}

declare -a NEWSITEMS=()

report_news() {
	local dir=$1 ni
	[ -d "$dir" ] || die "$dir is not a directory"
	while IFS= read -r -d '' ni; do
		if [ ${#NEWSITEMS[*]} -eq 0 ] && [ "$MAILAPP" != mutt ]; then
			# Mutt does not need the header, others do.
			gen_header
		fi
		NEWSITEMS+=( "$ni" )
		echo -e "\n### $(basename "$ni"):\n"
		cat "$ni"
	done < <(find "$dir" -maxdepth 1 -type f -name "fangfrisch*.txt" -print0)
}

main() {
	local t
	if tty -s; then
		# Running in a terminal session
		t=$(mktemp)
		# shellcheck disable=SC2064
		trap "rm $t" EXIT
		report_news "$@" | tee "$t" || exit 1
		[ ! -s "$t" ] || "$MAILAPP" "${MAILAPP_OPT[@]}" >/dev/null <"$t"
	else
		report_news "$@" 2>&1 | "$MAILAPP" "${MAILAPP_OPT[@]}" >/dev/null
		[ ${#NEWSITEMS[*]} -eq 0 ] || rm -v "${NEWSITEMS[@]}"
	fi
}

[ $# -ge 1 ] || usage
main "$@"

Appendix D: Database structure

While users can technically access the Fangfrisch backend database directly, its structure and content are considered private. They may change at any time, without notice.

D.1. Accessing mappings

In contrast to direct database access, the dumpmappings action allows accessing selected parts of database entries in a stable manner. Specifically, it returns 3-tuples (provider name, URL, local file path). Elements are separated by horizontal tabulators to facilitate piping the output into awk or similar utilities. If specified, the provider option is interpreted as a regular expression, and only DB records with matching provider column are returned. That means if you have providers foo and foobar, you need to use anchoring (e.g. ^foo$) if you only wish to match entries for the former provider. Make sure to use quoting as required by your shell. Example usage:

# Print all recorded mappings for the [example] provider section.
fangfrisch --conf /etc/fangfrisch.conf --provider '^example$' dumpmappings
# Delete all files that were downloaded by Fangfrisch.
# DON'T EXECUTE THIS UNLESS YOU REALLY MEAN IT!
fangfrisch --conf /etc/fangfrisch.conf dumpmappings | awk '{print $3}' | xargs /bin/rm
fangfrisch-1.9.0/docs/internal.conf000066400000000000000000000101521457257166100172630ustar00rootroot00000000000000[DEFAULT] cleanup = automatic enabled = false integrity_check = sha256 log_level = WARNING log_method = console max_size = 10MB [fangfrischnews] interval = 12h local_directory = /tmp max_size = 100KB script = /path/to/fangfrisch-has-news.sh on_update_exec = [ ! -x ${script} ] || ${script} ${local_directory} prefix = https://www.seichter.de/fangfrisch/ url_alerts = ${prefix}fangfrisch_alerts.txt url_news = ${prefix}fangfrisch_news.txt [interserver] interval = 1h integrity_check = disabled max_size = 5MB prefix = http://sigs.interserver.net/ !url_shell_hdb = ${prefix}shell.hdb !url_shellb_db = ${prefix}shellb.db url_interserver256 = ${prefix}interserver256.hdb url_shell_ldb = ${prefix}shell.ldb filename_shell_ldb = interservershell.ldb url_topline = ${prefix}interservertopline.db url_whitelist_fp = ${prefix}whitelist.fp filename_whitelist_fp = interserverwhitelist.fp [malwarepatrol] interval = 1d integrity_check = disabled product = 8 receipt = you_forgot_to_configure_receipt prefix = https://lists.malwarepatrol.net/cgi/getfile?product=${product}&receipt=${receipt}&list= url_clamav_basic = ${prefix}clamav_basic filename_clamav_basic = malwarepatrol.db [sanesecurity] interval = 1h prefix = http://mirror.sentries.org/sanesecurity/ !url_foxhole_all_cdb = ${prefix}foxhole_all.cdb !url_foxhole_all_ndb = ${prefix}foxhole_all.ndb !url_foxhole_links = ${prefix}foxhole_links.ldb !url_foxhole_mail = ${prefix}foxhole_mail.cdb !url_winnow_phish_complete = ${prefix}winnow_phish_complete.ndb url_badmacro = ${prefix}badmacro.ndb url_blurl = ${prefix}blurl.ndb url_bofhland_cracked_url = ${prefix}bofhland_cracked_URL.ndb url_bofhland_malware_attach = ${prefix}bofhland_malware_attach.hdb url_bofhland_malware_url = ${prefix}bofhland_malware_URL.ndb url_bofhland_phishing_url = ${prefix}bofhland_phishing_URL.ndb url_foxhole_filename = ${prefix}foxhole_filename.cdb url_foxhole_generic = ${prefix}foxhole_generic.cdb url_foxhole_js_cdb = ${prefix}foxhole_js.cdb url_foxhole_js_ndb = ${prefix}foxhole_js.ndb url_hackingteam = ${prefix}hackingteam.hsb url_junk = ${prefix}junk.ndb url_jurlbl = ${prefix}jurlbl.ndb url_jurlbla = ${prefix}jurlbla.ndb url_lott = ${prefix}lott.ndb url_malwareexpert_fp = ${prefix}malware.expert.fp url_malwareexpert_hdb = ${prefix}malware.expert.hdb url_malwareexpert_ldb = ${prefix}malware.expert.ldb url_malwareexpert_ndb = ${prefix}malware.expert.ndb url_malwarehash = ${prefix}malwarehash.hsb url_phish = ${prefix}phish.ndb url_phishtank = ${prefix}phishtank.ndb url_porcupine = ${prefix}porcupine.ndb url_rogue = ${prefix}rogue.hdb url_scam = ${prefix}scam.ndb url_shelter = ${prefix}shelter.ldb url_sigwhitelist = ${prefix}sigwhitelist.ign2 url_spamattach = ${prefix}spamattach.hdb url_spamimg = ${prefix}spamimg.hdb url_spear = ${prefix}spear.ndb url_spearl = ${prefix}spearl.ndb url_ssftm = ${prefix}sanesecurity.ftm url_winnow_attachments = ${prefix}winnow.attachments.hdb url_winnow_bad_cw = ${prefix}winnow_bad_cw.hdb url_winnow_extended_malware = ${prefix}winnow_extended_malware.hdb url_winnow_extended_malware_links = ${prefix}winnow_extended_malware_links.ndb url_winnow_malware = ${prefix}winnow_malware.hdb url_winnow_malware_links = ${prefix}winnow_malware_links.ndb url_winnow_phish_complete_url = ${prefix}winnow_phish_complete_url.ndb url_winnow_spam_complete = ${prefix}winnow_spam_complete.ndb [securiteinfo] customer_id = you_forgot_to_configure_customer_id interval = 1h max_size = 20MB prefix = https://www.securiteinfo.com/get/signatures/${customer_id}/ !url_0hour = ${prefix}securiteinfo0hour.hdb !url_old = ${prefix}securiteinfoold.hdb !url_securiteinfo_mdb = ${prefix}securiteinfo.mdb !url_securiteinfo_pdb = ${prefix}securiteinfo.pdb !url_securiteinfo_yara = ${prefix}securiteinfo.yara url_android = ${prefix}securiteinfoandroid.hdb url_ascii = ${prefix}securiteinfoascii.hdb url_html = ${prefix}securiteinfohtml.hdb url_javascript = ${prefix}javascript.ndb url_pdf = ${prefix}securiteinfopdf.hdb url_securiteinfo = ${prefix}securiteinfo.hdb url_securiteinfo_ign2 = ${prefix}securiteinfo.ign2 url_spam_marketing = ${prefix}spam_marketing.ndb [urlhaus] interval = 10m url_urlhaus = https://urlhaus.abuse.ch/downloads/urlhaus.ndb fangfrisch-1.9.0/docs/usage.txt000066400000000000000000000007461457257166100164550ustar00rootroot00000000000000usage: fangfrisch [-h] [-c CONF] [-f] [-p PROVIDER] {dumpconf,dumpmappings,initdb,refresh} Update and verify unofficial ClamAV signatures. positional arguments: {dumpconf,dumpmappings,initdb,refresh} options: -h, --help show this help message and exit -c CONF, --conf CONF configuration file -f, --force force action (default: False) -p PROVIDER, --provider PROVIDER provider name filter (regular expression) fangfrisch-1.9.0/fangfrisch/000077500000000000000000000000001457257166100157635ustar00rootroot00000000000000fangfrisch-1.9.0/fangfrisch/__init__.py000066400000000000000000000022411457257166100200730ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ __version__ = '1.9.0' class ClamavItem: def __init__(self, section, option, url, check, path, interval, max_size, on_update, connection_timeout, stem) -> None: self.check = check self.connection_timeout = connection_timeout self.interval = interval self.max_size = max_size self.on_update = on_update self.option = option self.path = path self.section = section self.stem = stem self.url = url fangfrisch-1.9.0/fangfrisch/__main__.py000066400000000000000000000053721457257166100200640ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import argparse import sys from fangfrisch import __version__ from fangfrisch.config import LOG_METHOD_CONSOLE from fangfrisch.config import LOG_METHOD_SYSLOG from fangfrisch.config.config import config from fangfrisch.db import DbMeta from fangfrisch.dump import DumpDbEntries from fangfrisch.log import LogHandlerType from fangfrisch.log import eprint from fangfrisch.log import init_logger from fangfrisch.refresh import ClamavRefresh def main() -> int: dumpconf = 'dumpconf' dumpmappings = 'dumpmappings' initdb = 'initdb' parser = argparse.ArgumentParser(prog='fangfrisch', description='Update and verify unofficial ClamAV signatures.', epilog=f'Fangfrisch version {__version__}. Copyright © 2020-2024 Ralph Seichter.') parser.add_argument('action', choices=[dumpconf, dumpmappings, initdb, 'refresh']) parser.add_argument('-c', '--conf', default=None, help='configuration file') parser.add_argument('-f', '--force', default=False, action='store_true', help='force action (default: False)') parser.add_argument('-p', '--provider', default='.', help='provider name filter (regular expression)') args = parser.parse_args() if not config.init(args.conf): eprint(f'Cannot parse configuration file: {args.conf}') sys.exit(1) format_ = config.log_format() level = config.log_level() method = config.log_method() if method == LOG_METHOD_CONSOLE: init_logger(LogHandlerType.CONSOLE, level, format_) elif method == LOG_METHOD_SYSLOG: init_logger(LogHandlerType.SYSLOG, level, format_, address=config.log_target()) else: eprint(f'Unsupported log method: {method}') sys.exit(1) if dumpconf == args.action: config.write(sys.stdout) elif dumpmappings == args.action: DumpDbEntries(args).print_url_path_mappings(sys.stdout) elif initdb == args.action: DbMeta().create_metadata(args.force) else: DbMeta.assert_version_match() ClamavRefresh(args).refresh_all() return 0 if __name__ == '__main__': sys.exit(main()) fangfrisch-1.9.0/fangfrisch/config/000077500000000000000000000000001457257166100172305ustar00rootroot00000000000000fangfrisch-1.9.0/fangfrisch/config/__init__.py000066400000000000000000000020561457257166100213440ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ CLEANUP = 'cleanup' DB_URL = 'db_url' ENABLED = 'enabled' INTEGRITY_CHECK = 'integrity_check' INTERVAL = 'interval' LOCAL_DIR = 'local_directory' LOG_FORMAT = 'log_format' LOG_LEVEL = 'log_level' LOG_METHOD = 'log_method' LOG_METHOD_CONSOLE = 'console' LOG_METHOD_SYSLOG = 'syslog' LOG_TARGET = 'log_target' MAX_SIZE = 'max_size' ON_UPDATE_EXEC = 'on_update_exec' PREFIX = 'prefix' fangfrisch-1.9.0/fangfrisch/config/config.py000066400000000000000000000124641457257166100210560ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import configparser from configparser import ConfigParser from configparser import ExtendedInterpolation from typing import Optional from fangfrisch.config import CLEANUP from fangfrisch.config import DB_URL from fangfrisch.config import ENABLED from fangfrisch.config import INTEGRITY_CHECK from fangfrisch.config import INTERVAL from fangfrisch.config import LOCAL_DIR from fangfrisch.config import LOG_FORMAT from fangfrisch.config import LOG_LEVEL from fangfrisch.config import LOG_METHOD from fangfrisch.config import LOG_TARGET from fangfrisch.config import MAX_SIZE from fangfrisch.config.fangfrischnews import fangfrischnews from fangfrisch.config.interserver import interserver from fangfrisch.config.malwarepatrol import malwarepatrol from fangfrisch.config.sanesecurity import sanesecurity from fangfrisch.config.securiteinfo import securiteinfo from fangfrisch.config.urlhaus import urlhaus from fangfrisch.util import parse_hr_bytes from fangfrisch.util import parse_hr_time def means_automatic(s: Optional[str]) -> bool: return s and s.lower() in ['auto', 'automatic', 'default'] def means_disabled(s: Optional[str]) -> bool: return s and s.lower() in ['disabled', 'false', 'no', 'off'] class Configuration: parser: configparser.ConfigParser = None def init(self, filename: str = None) -> bool: defaults = { CLEANUP: 'automatic', ENABLED: 'false', INTEGRITY_CHECK: 'sha256', LOG_LEVEL: 'WARNING', LOG_METHOD: 'console', MAX_SIZE: '10MB', } self.parser = ConfigParser(defaults=defaults, interpolation=ExtendedInterpolation()) for dict_ in [ fangfrischnews, interserver, malwarepatrol, sanesecurity, securiteinfo, urlhaus, ]: self.parser.read_dict(dict_) if filename: parsed = self.parser.read([filename]) return len(parsed) == 1 return True def write(self, file_descriptor) -> bool: self.parser.write(file_descriptor) return True # Not reached in case of exceptions def get(self, section: str, option: str, fallback=None) -> Optional[str]: return self.parser.get(section, option, fallback=fallback) def auto_cleanup(self, section: str) -> bool: # Default: see init() method return means_automatic(self.parser.get(section, CLEANUP)) def connection_timeout(self, fallback=30) -> int: return self.parser.getint(configparser.DEFAULTSECT, 'connection_timeout', fallback=fallback) def db_url(self) -> Optional[str]: # No default return self.parser.get(configparser.DEFAULTSECT, DB_URL) def on_update_exec(self, section: str = configparser.DEFAULTSECT, fallback='') -> str: return self.parser.get(section, 'on_update_exec', fallback=fallback) def on_update_timeout(self, section: str = configparser.DEFAULTSECT, fallback=30) -> int: return self.parser.getint(section, 'on_update_timeout', fallback=fallback) def is_enabled(self, section: str, fallback=False) -> bool: # Default: see init() method return self.parser.getboolean(section, ENABLED, fallback=fallback) def interval(self, section: str, fallback='') -> int: age = self.parser.get(section, INTERVAL, fallback=fallback) return parse_hr_time(age) def max_size(self, section: str) -> int: # Default: see init() method return parse_hr_bytes(self.parser.get(section, MAX_SIZE)) def integrity_check(self, section: str) -> Optional[str]: # Default: see init() method check: str = self.parser.get(section, INTEGRITY_CHECK) if means_disabled(check): return None return check def local_dir(self, section: str, fallback='') -> str: return self.parser.get(section, LOCAL_DIR, fallback=fallback) def log_format(self, fallback=None) -> Optional[str]: return self.parser.get(configparser.DEFAULTSECT, LOG_FORMAT, fallback=fallback) def log_level(self) -> str: # Default: see init() method return self.parser.get(configparser.DEFAULTSECT, LOG_LEVEL).upper() def log_method(self) -> str: # Default: see init() method return self.parser.get(configparser.DEFAULTSECT, LOG_METHOD) def log_target(self, fallback='localhost') -> str: return self.parser.get(configparser.DEFAULTSECT, LOG_TARGET, fallback=fallback) def options(self, section: str): return self.parser.options(section) def sections(self): return self.parser.sections() config = Configuration() # Application-level configuration object fangfrisch-1.9.0/fangfrisch/config/fangfrischnews.py000066400000000000000000000024571457257166100226210ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ from fangfrisch.config import INTERVAL from fangfrisch.config import LOCAL_DIR from fangfrisch.config import MAX_SIZE from fangfrisch.config import ON_UPDATE_EXEC from fangfrisch.config import PREFIX fangfrischnews = { 'fangfrischnews': { INTERVAL: '12h', LOCAL_DIR: '/tmp', MAX_SIZE: '100KB', 'script': '/path/to/fangfrisch-has-news.sh', ON_UPDATE_EXEC: f'[ ! -x ${{script}} ] || ${{script}} ${{{LOCAL_DIR}}}', PREFIX: r'https://www.seichter.de/fangfrisch/', 'url_alerts': f'${{{PREFIX}}}fangfrisch_alerts.txt', 'url_news': f'${{{PREFIX}}}fangfrisch_news.txt', } } fangfrisch-1.9.0/fangfrisch/config/interserver.py000066400000000000000000000027201457257166100221530ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ from fangfrisch.config import INTEGRITY_CHECK from fangfrisch.config import INTERVAL from fangfrisch.config import MAX_SIZE from fangfrisch.config import PREFIX interserver = { 'interserver': { INTERVAL: '1h', INTEGRITY_CHECK: 'disabled', MAX_SIZE: '5MB', PREFIX: r'http://sigs.interserver.net/', '!url_shell_hdb': f'${{{PREFIX}}}shell.hdb', '!url_shellb_db': f'${{{PREFIX}}}shellb.db', 'url_interserver256': f'${{{PREFIX}}}interserver256.hdb', 'url_shell_ldb': f'${{{PREFIX}}}shell.ldb', 'filename_shell_ldb': 'interservershell.ldb', 'url_topline': f'${{{PREFIX}}}interservertopline.db', 'url_whitelist_fp': f'${{{PREFIX}}}whitelist.fp', 'filename_whitelist_fp': 'interserverwhitelist.fp', } } fangfrisch-1.9.0/fangfrisch/config/malwarepatrol.py000066400000000000000000000023021457257166100224510ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ from fangfrisch.config import INTEGRITY_CHECK from fangfrisch.config import INTERVAL from fangfrisch.config import PREFIX malwarepatrol = { 'malwarepatrol': { INTERVAL: '1d', INTEGRITY_CHECK: 'disabled', 'product': '8', 'receipt': 'you_forgot_to_configure_receipt', PREFIX: r'https://lists.malwarepatrol.net/cgi/getfile?product=${product}&receipt=${receipt}&list=', 'url_clamav_basic': f'${{{PREFIX}}}clamav_basic', 'filename_clamav_basic': 'malwarepatrol.db', } } fangfrisch-1.9.0/fangfrisch/config/sanesecurity.py000066400000000000000000000073551457257166100223320ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ from fangfrisch.config import INTERVAL from fangfrisch.config import PREFIX sanesecurity = { # See https://sanesecurity.com/usage/signatures/ 'sanesecurity': { INTERVAL: '1h', PREFIX: r'http://mirror.sentries.org/sanesecurity/', '!url_foxhole_all_cdb': f'${{{PREFIX}}}foxhole_all.cdb', '!url_foxhole_all_ndb': f'${{{PREFIX}}}foxhole_all.ndb', '!url_foxhole_links': f'${{{PREFIX}}}foxhole_links.ldb', '!url_foxhole_mail': f'${{{PREFIX}}}foxhole_mail.cdb', '!url_winnow_phish_complete': f'${{{PREFIX}}}winnow_phish_complete.ndb', 'url_badmacro': f'${{{PREFIX}}}badmacro.ndb', 'url_blurl': f'${{{PREFIX}}}blurl.ndb', 'url_bofhland_cracked_url': f'${{{PREFIX}}}bofhland_cracked_URL.ndb', 'url_bofhland_malware_attach': f'${{{PREFIX}}}bofhland_malware_attach.hdb', 'url_bofhland_malware_url': f'${{{PREFIX}}}bofhland_malware_URL.ndb', 'url_bofhland_phishing_url': f'${{{PREFIX}}}bofhland_phishing_URL.ndb', 'url_foxhole_filename': f'${{{PREFIX}}}foxhole_filename.cdb', 'url_foxhole_generic': f'${{{PREFIX}}}foxhole_generic.cdb', 'url_foxhole_js_cdb': f'${{{PREFIX}}}foxhole_js.cdb', 'url_foxhole_js_ndb': f'${{{PREFIX}}}foxhole_js.ndb', 'url_hackingteam': f'${{{PREFIX}}}hackingteam.hsb', 'url_junk': f'${{{PREFIX}}}junk.ndb', 'url_jurlbl': f'${{{PREFIX}}}jurlbl.ndb', 'url_jurlbla': f'${{{PREFIX}}}jurlbla.ndb', 'url_lott': f'${{{PREFIX}}}lott.ndb', 'url_malwareexpert_fp': f'${{{PREFIX}}}malware.expert.fp', 'url_malwareexpert_hdb': f'${{{PREFIX}}}malware.expert.hdb', 'url_malwareexpert_ldb': f'${{{PREFIX}}}malware.expert.ldb', 'url_malwareexpert_ndb': f'${{{PREFIX}}}malware.expert.ndb', 'url_malwarehash': f'${{{PREFIX}}}malwarehash.hsb', 'url_phish': f'${{{PREFIX}}}phish.ndb', 'url_phishtank': f'${{{PREFIX}}}phishtank.ndb', 'url_porcupine': f'${{{PREFIX}}}porcupine.ndb', 'url_rogue': f'${{{PREFIX}}}rogue.hdb', 'url_scam': f'${{{PREFIX}}}scam.ndb', 'url_shelter': f'${{{PREFIX}}}shelter.ldb', 'url_sigwhitelist': f'${{{PREFIX}}}sigwhitelist.ign2', 'url_spamattach': f'${{{PREFIX}}}spamattach.hdb', 'url_spamimg': f'${{{PREFIX}}}spamimg.hdb', 'url_spear': f'${{{PREFIX}}}spear.ndb', 'url_spearl': f'${{{PREFIX}}}spearl.ndb', 'url_ssftm': f'${{{PREFIX}}}sanesecurity.ftm', 'url_winnow_attachments': f'${{{PREFIX}}}winnow.attachments.hdb', 'url_winnow_bad_cw': f'${{{PREFIX}}}winnow_bad_cw.hdb', 'url_winnow_extended_malware': f'${{{PREFIX}}}winnow_extended_malware.hdb', 'url_winnow_extended_malware_links': f'${{{PREFIX}}}winnow_extended_malware_links.ndb', 'url_winnow_malware': f'${{{PREFIX}}}winnow_malware.hdb', 'url_winnow_malware_links': f'${{{PREFIX}}}winnow_malware_links.ndb', 'url_winnow_phish_complete_url': f'${{{PREFIX}}}winnow_phish_complete_url.ndb', 'url_winnow_spam_complete': f'${{{PREFIX}}}winnow_spam_complete.ndb', } } fangfrisch-1.9.0/fangfrisch/config/securiteinfo.py000066400000000000000000000035001457257166100222770ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ from fangfrisch.config import INTERVAL from fangfrisch.config import MAX_SIZE from fangfrisch.config import PREFIX securiteinfo = { 'securiteinfo': { 'customer_id': 'you_forgot_to_configure_customer_id', INTERVAL: '1h', MAX_SIZE: '20MB', PREFIX: r'https://www.securiteinfo.com/get/signatures/${customer_id}/', '!url_0hour': f'${{{PREFIX}}}securiteinfo0hour.hdb', '!url_old': f'${{{PREFIX}}}securiteinfoold.hdb', '!url_securiteinfo_mdb': f'${{{PREFIX}}}securiteinfo.mdb', '!url_securiteinfo_pdb': f'${{{PREFIX}}}securiteinfo.pdb', '!url_securiteinfo_yara': f'${{{PREFIX}}}securiteinfo.yara', 'url_android': f'${{{PREFIX}}}securiteinfoandroid.hdb', 'url_ascii': f'${{{PREFIX}}}securiteinfoascii.hdb', 'url_html': f'${{{PREFIX}}}securiteinfohtml.hdb', 'url_javascript': f'${{{PREFIX}}}javascript.ndb', 'url_pdf': f'${{{PREFIX}}}securiteinfopdf.hdb', 'url_securiteinfo': f'${{{PREFIX}}}securiteinfo.hdb', 'url_securiteinfo_ign2': f'${{{PREFIX}}}securiteinfo.ign2', 'url_spam_marketing': f'${{{PREFIX}}}spam_marketing.ndb', } } fangfrisch-1.9.0/fangfrisch/config/urlhaus.py000066400000000000000000000015401457257166100212650ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ from fangfrisch.config import INTERVAL urlhaus = { 'urlhaus': { INTERVAL: '10m', 'url_urlhaus': r'https://urlhaus.abuse.ch/downloads/urlhaus.ndb', } } fangfrisch-1.9.0/fangfrisch/db.py000066400000000000000000000177711457257166100167370ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import re import sys from datetime import datetime from datetime import timedelta from typing import List from typing import Optional from sqlalchemy import Column from sqlalchemy import DateTime from sqlalchemy import Integer from sqlalchemy import String from sqlalchemy import create_engine from sqlalchemy.exc import DatabaseError from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from fangfrisch import ClamavItem from fangfrisch.config.config import config from fangfrisch.log import log_debug from fangfrisch.log import log_exception from fangfrisch.log import log_fatal from fangfrisch.util import remove_if_exists DB_VERSION = 2 Base = declarative_base() class DbMeta(Base): __tablename__ = 'automx2' db_version = Column(Integer, nullable=False, primary_key=True) _engine = None _session = None def __init__(self) -> None: self.db_version = DB_VERSION @classmethod def init(cls, create_all=False, drop_all=False): """Initialise database session. :param create_all: Create DB structure? :param drop_all: Drop existing DB structure? """ if not cls._session: db_url = config.db_url() if not db_url: # pragma: no cover log_fatal('Database URL is undefined, exiting.') sys.exit(1) cls._engine = create_engine(db_url, echo=False) cls._session = sessionmaker(bind=cls._engine) if drop_all: cls.metadata.drop_all(cls._engine) if create_all: cls.metadata.create_all(cls._engine) return cls._session @staticmethod def assert_version_match() -> Optional[bool]: try: DbMeta.init(False) session = DbMeta._session() dm: DbMeta = session.query(DbMeta).one() if dm.db_version == DB_VERSION: return True log_fatal(f'Unexpected database version (expected {DB_VERSION}, got {dm.db_version})') except DatabaseError as e: log_exception(e) log_fatal('Please try running "initdb"') sys.exit(1) def create_metadata(self, force=False) -> Optional[bool]: try: DbMeta.init(create_all=True, drop_all=force) with DbMeta._session() as session, session.begin(): # Unless exceptions occur, the inner context calls session.commit() # and the outer context calls session.close(). dm: DbMeta = session.query(DbMeta).first() if dm is None: session.add(self) return True log_fatal(f'Database table {self.__tablename__} is not empty') except DatabaseError as e: # pragma: no cover log_exception(e) sys.exit(1) class RefreshLog(Base): __tablename__ = 'refreshlog' url = Column(String, nullable=False, primary_key=True) digest = Column(String, nullable=True) path = Column(String, nullable=False) provider = Column(String, nullable=True) updated = Column(DateTime, nullable=True) _session = None def __init__(self, ci: ClamavItem, digest: str): self.digest = digest self.path = ci.path self.provider = ci.section self.updated = datetime.utcnow() self.url = ci.url @classmethod def init(cls): """Initialise database session. """ if not cls._session: db_url = config.db_url() if not db_url: # pragma: no cover log_fatal('Database URL is undefined, exiting.') sys.exit(1) engine = create_engine(db_url, echo=False) cls._session = sessionmaker(bind=engine) return cls._session @staticmethod def is_outdated(url: str, interval: int) -> bool: """Check if local data for a given URL is outdated. :param url: Log database key. :param interval: Maximum permitted age of local data. :return: True if outdated, False otherwise. """ threshold = datetime.utcnow() - timedelta(minutes=interval) RefreshLog.init() with RefreshLog._session() as session: entry: RefreshLog = _query_url(url, session) return (entry is None) or entry.updated < threshold @staticmethod def digest_matches(url: str, digest: str) -> bool: """Check if locally recorded digest matches the provided value. :param url: Log database key. :param digest: Expected digest. :return: True if digests match, False otherwise. """ RefreshLog.init() with RefreshLog._session() as session: entry: RefreshLog = _query_url(url, session) return (entry is not None) and entry.digest == digest @staticmethod def last_logged_path(url: str) -> Optional[str]: """Return previously recorded file path for the given URL. :param url: Log database key. :return: Recorded file path if available, None otherwise. """ RefreshLog.init() with RefreshLog._session() as session: entry: RefreshLog = _query_url(url, session) if entry is None: return None return entry.path @staticmethod def url_path_mappings(provider_re: str): """Return URL-to-localpath mappings for providers. :param provider_re: Provider name filter (regular expression) """ RefreshLog.init() with RefreshLog._session() as session: return _query_provider_re(provider_re, session) @staticmethod def update(ci: ClamavItem, digest: str) -> None: """Update digest and update timestamp for a given URL. :param ci: Source data structure. :param digest: New digest. """ RefreshLog.init() with RefreshLog._session() as session, session.begin(): entry: RefreshLog = _query_url(ci.url, session) if entry: entry.digest = digest entry.path = ci.path entry.provider = ci.section entry.updated = datetime.utcnow() else: entry = RefreshLog(ci, digest) session.add(entry) @staticmethod def cleanup_provider(provider: str) -> int: """Cleanup local files associated with a given provider. :param provider: Provider filter (exact match) """ count = 0 RefreshLog.init() with RefreshLog._session() as session, session.begin(): entries = _query_provider(provider, session) for entry in entries: remove_if_exists(entry.path, log_debug) session.delete(entry) count += 1 return count def _query_provider(provider: str, session) -> List[RefreshLog]: entries = list() r: RefreshLog for r in session.query(RefreshLog).filter(RefreshLog.provider == provider).all(): entries.append(r) return entries def _query_provider_re(regex: str, session) -> List[RefreshLog]: _re = re.compile(regex) entries = list() r: RefreshLog for r in session.query(RefreshLog).all(): if _re.search(r.provider): entries.append(r) return entries def _query_url(url: str, session): return session.query(RefreshLog).filter(RefreshLog.url == url).first() fangfrisch-1.9.0/fangfrisch/download.py000066400000000000000000000063241457257166100201510ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import requests from requests import Response from fangfrisch import ClamavItem from fangfrisch import __version__ from fangfrisch.log import log_error from fangfrisch.log import log_warning from fangfrisch.util import StatusDataPair CONTENT_LENGTH = 'Content-Length' _session = requests.Session() _session.headers['User-Agent'] = f'fangfrisch/{__version__}' def _has_valid_length(response: Response, max_length: int) -> StatusDataPair: """Check if content length in response is below a given limit. :param response: Response object. :param max_length: Maximum permitted content length. :return: True if length is permitted, False otherwise. """ if CONTENT_LENGTH not in response.headers: # pragma: no cover log_warning(f'{response.url} content length unknown') return StatusDataPair(True, -1) length = int(response.headers[CONTENT_LENGTH]) if length > max_length: log_error(f'{response.url} size exceeds defined limit ({length}/{max_length} bytes)') return StatusDataPair(False, length) return StatusDataPair(True, length) def _download(url, max_size: int, timeout: int) -> StatusDataPair: """Download from specified URL if content length is below a given limit. :param url: Source URL. :param max_size: Maximum permitted content length. :param timeout: Connection timeout in seconds. :return: True/Data for successfull downloads, False/None otherwise. """ if timeout > 30: log_warning(f'{timeout} second connection timeout exceeds recommended limit') response = _session.get(url, stream=True, timeout=timeout) if response.status_code != requests.codes.ok: log_error(f'{url} download failed: {response.status_code} {response.reason}') return StatusDataPair(False) check = _has_valid_length(response, max_size) if not check.ok: return StatusDataPair(False) return StatusDataPair(True, response) def get_digest(ci: ClamavItem, max_size: int = 1024) -> StatusDataPair: if not ci.check: return StatusDataPair(True) download = _download(f'{ci.url}.{ci.check}', max_size, ci.connection_timeout) if not download.ok: return StatusDataPair(False) digest = download.data.text.split(' ')[0] # Returns original text if no space is found return StatusDataPair(True, digest) def get_payload(ci: ClamavItem) -> StatusDataPair: download = _download(ci.url, ci.max_size, ci.connection_timeout) if not download.ok: return StatusDataPair(False) return StatusDataPair(True, download.data.content) fangfrisch-1.9.0/fangfrisch/dump.py000066400000000000000000000020011457257166100172730ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ from fangfrisch.db import RefreshLog class DumpDbEntries: def __init__(self, args) -> None: self.args = args def print_url_path_mappings(self, outfile) -> None: r: RefreshLog for r in RefreshLog.url_path_mappings(self.args.provider): print(f'{r.provider}\t{r.url}\t{r.path}', file=outfile) fangfrisch-1.9.0/fangfrisch/log.py000066400000000000000000000055561457257166100171310ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import logging import logging.handlers import sys from enum import Enum from enum import unique from logging import Handler from logging import Logger @unique class LogHandlerType(Enum): CONSOLE = 1 SYSLOG = 2 # noinspection PyTypeChecker _handler: Handler = None # noinspection PyTypeChecker _logger: Logger = None def parse_syslog_target(address: str): if address.find('/') >= 0: return address s = address.split(':') host = s[0] if len(s) > 1: port = int(s[1]) else: port = logging.handlers.SYSLOG_UDP_PORT tuple_ = (host, port) return tuple_ def _create_handler(type_: LogHandlerType, log_format: str, syslog_target: str): if type_ == LogHandlerType.SYSLOG: a = parse_syslog_target(syslog_target) handler = logging.handlers.SysLogHandler(address=a) default_format = r'fangfrisch[%(process)d]: %(message)s' else: handler = logging.StreamHandler() default_format = r'%(levelname)s: %(message)s' if log_format: f = log_format else: f = default_format handler.setFormatter(logging.Formatter(f)) return handler def init_logger(type_: LogHandlerType, level: str, format_: str, address: str = 'localhost') -> Logger: global _handler, _logger if _handler is None: _handler = _create_handler(type_, format_, address) _logger = logging.getLogger('fangfrisch') _logger.addHandler(_handler) _handler.setLevel(level) _logger.setLevel(level) return _logger def eprint(*args, **kwargs) -> None: # pragma: no cover print(*args, file=sys.stderr, **kwargs) def log_debug(*args, **kwargs) -> None: global _logger _logger.debug(*args, **kwargs) def log_error(*args, **kwargs) -> None: global _logger _logger.error(*args, **kwargs) def log_fatal(*args, **kwargs) -> None: global _logger _logger.fatal(*args, **kwargs) def log_exception(*args, **kwargs) -> None: global _logger _logger.exception(*args, **kwargs) def log_info(*args, **kwargs) -> None: global _logger _logger.info(*args, **kwargs) def log_warning(*args, **kwargs) -> None: global _logger _logger.warning(*args, **kwargs) fangfrisch-1.9.0/fangfrisch/refresh.py000066400000000000000000000151271457257166100200010ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import os from typing import List from typing import Set from urllib.parse import urlparse from fangfrisch import ClamavItem from fangfrisch.config.config import config from fangfrisch.db import RefreshLog from fangfrisch.download import get_digest from fangfrisch.download import get_payload from fangfrisch.log import log_debug from fangfrisch.log import log_error from fangfrisch.log import log_exception from fangfrisch.log import log_info from fangfrisch.log import log_warning from fangfrisch.task import Task from fangfrisch.task import add_task from fangfrisch.util import check_integrity from fangfrisch.util import remove_if_exists from fangfrisch.util import run_command def _is_url_disabled(url: str) -> bool: if not url: return True u = url.strip().lower() return u == '' or u.startswith('disabled') def _clamav_items() -> List[ClamavItem]: item_list = [] for section in config.sections(): if not config.is_enabled(section): continue for option in config.options(section): max_size = config.max_size(section) if max_size < 1: log_error(f"Cannot parse max size for section '{section}'") continue local_dir = config.local_dir(section) if local_dir: os.makedirs(local_dir, exist_ok=True) if option.startswith('url_'): url = config.get(section, option) if _is_url_disabled(url): continue stem = option[4:] filename = config.get(section, f'filename_{stem}') if not filename: url_path: str = urlparse(url).path slash_pos = url_path.rfind('/') # returns -1 if not found filename = url_path[slash_pos + 1:] if local_dir: filename = os.path.join(local_dir, filename) item_list.append(ClamavItem( check=config.integrity_check(section), connection_timeout=config.connection_timeout(), interval=config.interval(section), max_size=max_size, on_update=config.get(section, f'on_update_{stem}'), option=option, path=filename, section=section, stem=stem, url=url, )) return item_list class ClamavRefresh: def __init__(self, args) -> None: self.args = args @staticmethod def cleanup_providers() -> int: count = 0 for section in config.sections(): if config.auto_cleanup(section) and not config.is_enabled(section): count += RefreshLog.cleanup_provider(section) return count @staticmethod def print_url_path_mappings(output_file) -> None: for ci in _clamav_items(): print(f'{ci.section}\t{ci.url}\t{ci.path}', file=output_file) def refresh(self, ci: ClamavItem) -> bool: """Refresh a single ClamAV item. :param ci: Item to refresh. :return: True if new payload data was written, False otherwise. """ try: if not ci.url: # pragma: no cover log_debug('Empty URL') return False if self.args.force: log_debug(f'{ci.url} refresh forced') elif not RefreshLog.is_outdated(ci.url, ci.interval): log_debug(f'{ci.url} below max age') return False digest = get_digest(ci) if not digest.ok: return False if digest.data and RefreshLog.digest_matches(ci.url, digest.data): log_debug(f'{ci.url} unchanged') RefreshLog.update(ci, digest.data) return False payload = get_payload(ci) if not payload.ok: return False integrity = check_integrity(payload.data, ci.check, digest.data) if not integrity.ok: log_warning(f'{ci.url} {integrity.data}') return False path = RefreshLog.last_logged_path(ci.url) remove_if_exists(path, log_debug) with open(ci.path, 'wb') as f: size = f.write(payload.data) log_info(f'{ci.path} updated ({size} bytes)') RefreshLog.update(ci, digest.data) except OSError as e: # pragma: no cover log_exception(e) return True def refresh_all(self) -> int: steps = self.cleanup_providers() trigger_sections: Set[str] = set() for ci in _clamav_items(): if self.refresh(ci): if ci.on_update: # Run individual command for the item, if defined. log_debug(f'[{ci.section}] on_update_{ci.stem}: "{ci.on_update}"') run_command( command=ci.on_update, timeout=config.on_update_timeout(section=ci.section), callback_stdout=log_info, callback_stderr=log_error, callback_exception=log_exception, path=ci.path ) else: # If no individual command is defined, remember the section name instead. log_debug(f'[{ci.section}] caused updates') trigger_sections.add(ci.section) steps += 1 # Compose a task list tasks: List[Task] = list() for section in trigger_sections: add_task( tasks=tasks, command=config.on_update_exec(section), timeout=config.on_update_timeout(section) ) # Process tasks completed = 0 for task in tasks: task.complete() completed += 1 return steps, completed fangfrisch-1.9.0/fangfrisch/task.py000066400000000000000000000034731457257166100173060ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ from typing import List from typing import Optional from fangfrisch.log import log_debug from fangfrisch.log import log_error from fangfrisch.log import log_exception from fangfrisch.log import log_info from fangfrisch.util import run_command class Task: def __init__(self, command: str, timeout: int) -> None: self.command = command self.timeout = timeout def __str__(self): # pragma: no cover return f'Task(command={{{self.command}}}, timeout={self.timeout})' def complete(self) -> int: rc = run_command( command=self.command, timeout=self.timeout, callback_stdout=log_info, callback_stderr=log_error, callback_exception=log_exception ) log_debug(f'{self} returned code {rc}') return rc def add_task(tasks: List[Task], command: str, timeout: int) -> Optional[Task]: for task in tasks: if task.command == command: log_debug(f"Ignoring duplicate: {command}") return None task = Task(command=command, timeout=timeout) tasks.append(task) log_debug(f'{task} added') return task fangfrisch-1.9.0/fangfrisch/util.py000066400000000000000000000073321457257166100173170ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import hashlib import os import re from string import Formatter from subprocess import CompletedProcess from subprocess import run from typing import Optional _byte_multipliers = {'K': 10 ** 3, 'KB': 2 ** 10, 'M': 10 ** 6, 'MB': 2 ** 20} _byte_pattern = re.compile(r'(\d+)([KM]B?)?', re.IGNORECASE) _minute_multipliers = {'d': 24 * 60, 'h': 60, 'm': 1} _minute_pattern = re.compile(r'(\d+)([dhm])', re.IGNORECASE) class StatusDataPair: def __init__(self, ok: bool, data=None) -> None: self.data = data self.ok = ok def check_integrity(content, algorithm: str, expected: str) -> StatusDataPair: """Check integrity of a content object. :param content: Object to verify. :param algorithm: Mechanism used to calculate a digest. :param expected: Expected digest. :return: True/None if calculated and expected digests match, False/Message otherwise. """ if algorithm: _hash = hashlib.new(algorithm) _hash.update(content) digest = _hash.hexdigest() if digest != expected: message = f'{algorithm} digest mismatch (expected {expected}, got {digest})' return StatusDataPair(False, message) return StatusDataPair(True) def parse_hr_bytes(s: str) -> int: """Parse human-readable bytes representation (e.g. 5MB, 250K) :param s: String to parse. :return: Number of bytes or -1 for parsing errors. """ m = _byte_pattern.fullmatch(s) if m: if m[2]: multiplier = _byte_multipliers[m[2].upper()] else: multiplier = 1 return int(m[1]) * multiplier return -1 def parse_hr_time(s: str) -> int: """Parse human-readable time representation (e.g. 2d, 3h, 20m) :param s: String to parse. :return: Number of minutes or -1 for parsing errors. """ m = _minute_pattern.fullmatch(s) if m: multiplier = _minute_multipliers[m[2].lower()] return int(m[1]) * multiplier return -1 def run_command(command: str, timeout: int, callback_stdout, callback_stderr, callback_exception, *args, **kwargs) -> Optional[int]: """Execute a command in a subprocess. :param command: Command string. :param timeout: Command timeout in seconds. :param callback_stdout: Callback to process subcommand stdout. :param callback_stderr: Callback to process subcommand stderr. :param callback_exception: Call if the subcommand raises an exception. """ # noinspection PyTypeChecker p: CompletedProcess = None try: command = Formatter().vformat(command, args, kwargs) p = run(command, capture_output=True, encoding='utf-8', shell=True, timeout=timeout) if p.stdout: callback_stdout(p.stdout) if p.stderr: callback_stderr(p.stderr) except Exception as e: callback_exception(e) if p is not None: return p.returncode def remove_if_exists(path: str, log_callback) -> None: if path and os.path.exists(path): log_callback(f'Removing file {path}') os.remove(path) fangfrisch-1.9.0/pyproject.toml000066400000000000000000000001321457257166100165610ustar00rootroot00000000000000[build-system] requires = ["setuptools", "wheel"] build-backend = "setuptools.build_meta" fangfrisch-1.9.0/requirements.txt000066400000000000000000000001261457257166100171340ustar00rootroot00000000000000# Development build setuptools wheel # Runtime requests >= 2.22.0 SQLAlchemy >= 1.4.0 fangfrisch-1.9.0/setup.cfg000066400000000000000000000034421457257166100154750ustar00rootroot00000000000000# vim: ts=4 sw=4 noet # # Copyright © 2020-2024 Ralph Seichter # # This file is part of "Fangfrisch". # # Fangfrisch 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. # # Fangfrisch 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 Fangfrisch. If not, see . [metadata] author = Ralph Seichter author_email = fangfrisch@seichter.de classifiers = Development Status :: 5 - Production/Stable Intended Audience :: System Administrators License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+) Operating System :: OS Independent Programming Language :: Python :: 3.7 Topic :: System :: Systems Administration Topic :: Utilities description = Update and verify unofficial Clam Anti-Virus signatures keywords = antivirus clamav freshclam refresh update long_description = file: README.rst long_description_content_type = text/x-rst name = fangfrisch project_urls = Documentation = https://rseichter.github.io/fangfrisch/ Source = https://github.com/rseichter/fangfrisch Tracker = https://github.com/rseichter/fangfrisch/issues url = https://github.com/rseichter/fangfrisch version = 1.9.0 [options] install_requires = requests>=2.22.0 SQLAlchemy>=1.4.0 packages = find: python_requires = >=3.7 [options.entry_points] console_scripts = fangfrisch = fangfrisch.__main__:main [options.package_data] tests = *.conf *.sql fangfrisch-1.9.0/tests/000077500000000000000000000000001457257166100150135ustar00rootroot00000000000000fangfrisch-1.9.0/tests/.gitignore000066400000000000000000000000111457257166100167730ustar00rootroot00000000000000*.sqlite fangfrisch-1.9.0/tests/__init__.py000066400000000000000000000047471457257166100171400ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import os import unittest import uuid import fangfrisch.log from fangfrisch import ClamavItem from fangfrisch.config.config import config from fangfrisch.db import DbMeta from fangfrisch.log import LogHandlerType from fangfrisch.log import init_logger DIGEST_DUMMY = 'digest_dummy' DIGEST_MD5 = '6087a61850f22a132f8522f35779c04d' MAX_SIZE = 1024 * 1024 PATH_DUMMY = 'path_dummy' URL_BAD_SHA256 = 'https://seichter.de/favicon.ico' URL_MD5 = 'https://seichter.de/favicon-32x32.png' URL_MISSING = 'https://seichter.de/index.html' URL_SHA256 = 'https://seichter.de/favicon-16x16.png' def env_var(name: str, default: object = None): if name in os.environ: return os.environ[name] return default NETWORK_TESTS = env_var('NETWORK_TESTS') == '1' class _ClamavTestItem(ClamavItem): def __init__(self, section, option, url, check=None, path=None, interval=0, max_size=MAX_SIZE, on_update=None, connection_timeout=10, stem='test_item') -> None: super().__init__( check=check, connection_timeout=connection_timeout, interval=interval, max_size=max_size, on_update=on_update, option=option, path=path, section=section, stem=stem, url=url, ) class FangfrischTest(unittest.TestCase): CONF = 'tests/tests.conf' TMPDIR = '/tmp/fangfrisch/unittest' UNITTEST = 'unittest' UNKNOWN = uuid.uuid4().hex @classmethod def setUpClass(cls) -> None: config.init(FangfrischTest.CONF) os.makedirs(FangfrischTest.TMPDIR, exist_ok=True) if fangfrisch.log._handler is not None: fangfrisch.log._handler.close() fangfrisch.log._handler = None init_logger(LogHandlerType.CONSOLE, 'FATAL', '') DbMeta.init(True) fangfrisch-1.9.0/tests/coverage.rc000066400000000000000000000002021457257166100171260ustar00rootroot00000000000000[report] exclude_lines = def __repr__ log[_\.](debug|error|except|fatal|info|warn) pragma: no cover raise NotImplementedError fangfrisch-1.9.0/tests/test_config.py000066400000000000000000000074601457257166100177000ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import tempfile import unittest from fangfrisch.config import LOG_METHOD_CONSOLE from fangfrisch.config import PREFIX from fangfrisch.config.config import Configuration from fangfrisch.config.config import means_disabled from tests import FangfrischTest from tests.test_log import FORMAT from tests.test_log import LEVEL SECTION = 'sanesecurity' class ConfigTests(FangfrischTest): c: Configuration = None def setUp(self) -> None: self.c = Configuration() def test_dump(self): self.c.init() file = tempfile.TemporaryFile(mode='w+t') self.assertTrue(self.c.write(file)) file.close() def test_sanesec_base_url(self): self.c.init() self.assertIsNotNone(self.c.get(SECTION, PREFIX)) def test_sanesec_unknown(self): self.c.init() self.assertIsNone(self.c.get(SECTION, self.UNKNOWN)) def test_unknown_section(self): self.c.init() self.assertIsNone(self.c.get(self.UNKNOWN, PREFIX)) def test_missing_file(self): self.assertFalse(self.c.init(self.UNKNOWN)) def test_local_dir(self): self.c.init(self.CONF) self.assertEqual(self.TMPDIR, self.c.local_dir(self.UNITTEST)) def test_integrity_check(self): self.c.init(self.CONF) self.assertEqual('sha256', self.c.integrity_check(self.UNITTEST)) def test_sections(self): self.c.init(self.CONF) s = self.c.sections() self.assertIn(self.UNITTEST, s) def test_timeout(self): self.c.init(self.CONF) self.assertEqual(5, self.c.on_update_timeout(self.UNITTEST)) def test_interval(self): self.c.init(self.CONF) self.assertEqual(60, self.c.interval(SECTION)) def test_disabled_none(self): self.assertFalse(means_disabled(None)) def test_disabled_yes(self): self.assertFalse(means_disabled('yes')) def test_disabled_no(self): self.assertTrue(means_disabled('no')) def test_log_format(self): self.c.init(self.CONF) self.assertEqual(FORMAT, self.c.log_format()) def test_log_level(self): self.c.init(self.CONF) self.assertEqual(LEVEL, self.c.log_level()) def test_log_method(self): self.c.init(self.CONF) self.assertEqual(LOG_METHOD_CONSOLE, self.c.log_method()) def test_on_update_exec(self): self.c.init(self.CONF) self.assertEqual('echo on_update_exec', self.c.on_update_exec()) def test_on_update_exec2(self): self.c.init(self.CONF) self.assertEqual('echo overridden', self.c.on_update_exec(section='unittest2')) def test_on_update_timeout(self): self.c.init(self.CONF) self.assertEqual(5, self.c.on_update_timeout()) def test_on_update_timeout2(self): self.c.init(self.CONF) self.assertEqual(6, self.c.on_update_timeout(section='unittest2')) def test_log_target(self): self.c.init(self.CONF) self.assertEqual(self.UNITTEST, self.c.log_target()) def test_conn_timeout1(self): self.c.init(self.CONF) self.assertEqual(9, self.c.connection_timeout()) if __name__ == '__main__': unittest.main() fangfrisch-1.9.0/tests/test_db.py000066400000000000000000000076031457257166100170170ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import tempfile import unittest import uuid from sqlalchemy.exc import IntegrityError from sqlalchemy.orm.exc import NoResultFound from fangfrisch.db import DbMeta from fangfrisch.db import RefreshLog from tests import DIGEST_DUMMY from tests import FangfrischTest from tests import _ClamavTestItem URL1 = 'https://u1' URL2 = 'https://u2' class DbTests(FangfrischTest): s = None def setUp(self) -> None: super().setUp() self.ci = _ClamavTestItem(url=URL1, section=self.UNITTEST, option='option', path='path') RefreshLog.init() self.s = RefreshLog._session() self.s.query(RefreshLog).delete() self.s.add(RefreshLog(self.ci, DIGEST_DUMMY)) self.s.commit() def test_version_match(self): self.assertTrue(DbMeta.assert_version_match()) def test_version_mismatch(self): session = DbMeta._session() dm: DbMeta = session.query(DbMeta).one() dm.db_version = -1 session.add(dm) session.commit() with self.assertRaises(SystemExit): DbMeta.assert_version_match() def test_version_missing(self): session = DbMeta._session() session.query(DbMeta).delete() session.commit() with self.assertRaises(NoResultFound): DbMeta.assert_version_match() def test_create_metadata1(self): session = DbMeta._session() session.query(DbMeta).delete() session.commit() self.assertTrue(DbMeta().create_metadata(False)) def test_create_metadata2(self): with self.assertRaises(SystemExit): DbMeta().create_metadata(False) def test_create_metadata3(self): self.assertTrue(DbMeta().create_metadata(True)) def test_duplicate(self): self.s.add(RefreshLog(self.ci, DIGEST_DUMMY)) with self.assertRaises(IntegrityError): self.s.commit() def test_missing_path(self): self.ci.path = None self.s.add(RefreshLog(self.ci, DIGEST_DUMMY)) with self.assertRaises(IntegrityError): self.s.commit() def test_insert(self): self.ci.url = URL2 self.s.add(RefreshLog(self.ci, DIGEST_DUMMY)) self.s.commit() self.assertTrue(True) # Must not raise an exception def test_refresh_required(self): self.assertTrue(RefreshLog.is_outdated(URL1, 0)) def test_stamp1(self): RefreshLog.update(self.ci, DIGEST_DUMMY) # Must not raise an exception self.assertTrue(True) def test_stamp2(self): self.ci.url = URL2 RefreshLog.update(self.ci, DIGEST_DUMMY) # Must not raise an exception self.assertTrue(True) def test_cleanup1(self): self.assertEqual(0, RefreshLog.cleanup_provider(self.UNKNOWN)) def test_cleanup2(self): file = tempfile.NamedTemporaryFile(mode='w+t', encoding='utf-8', delete=False) file.write(self.UNITTEST) file.close() provider = uuid.uuid4().hex self.ci.section = provider self.ci.path = file.name self.ci.url = URL2 self.s.add(RefreshLog(self.ci, DIGEST_DUMMY)) self.s.commit() self.assertEqual(1, RefreshLog.cleanup_provider(provider)) if __name__ == '__main__': unittest.main() fangfrisch-1.9.0/tests/test_download.py000066400000000000000000000023571457257166100202420ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import unittest # noinspection PyProtectedMember from fangfrisch.download import _download from tests import FangfrischTest from tests import MAX_SIZE from tests import NETWORK_TESTS from tests import URL_SHA256 @unittest.skipUnless(NETWORK_TESTS, 'network tests disabled') class DownloadTests(FangfrischTest): def test_get_ok(self): d = _download(URL_SHA256, MAX_SIZE, 10) self.assertTrue(d.ok) def test_get_oversized(self): d = _download(URL_SHA256, 1, 10) self.assertFalse(d.ok) if __name__ == '__main__': unittest.main() fangfrisch-1.9.0/tests/test_dump.py000066400000000000000000000041471457257166100173770ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import tempfile import unittest from argparse import Namespace from fangfrisch.db import RefreshLog from fangfrisch.dump import DumpDbEntries from fangfrisch.refresh import ClamavRefresh from tests import FangfrischTest from tests import _ClamavTestItem class DumpDbTests(FangfrischTest): ref = ClamavRefresh(Namespace(force=False)) def setUp(self) -> None: super().setUp() RefreshLog.init() self.s = RefreshLog._session() self.s.query(RefreshLog).delete() cia = _ClamavTestItem('spam', 'option', 'a', path='a') cib = _ClamavTestItem('spamalot', 'option', 'b', path='b') self.s.add(RefreshLog(cia, 'dummy')) self.s.add(RefreshLog(cib, 'dummy')) self.s.commit() self.s.commit() def test_dump_all(self): file = tempfile.TemporaryFile(mode='w+t') dump = DumpDbEntries(Namespace(provider='.')) dump.print_url_path_mappings(file) file.seek(0) data = file.read() file.close() self.assertTrue(data.startswith('spam')) def test_match_two(self): x = RefreshLog.url_path_mappings('spam') self.assertEqual(2, len(x)) def test_match_one(self): x = RefreshLog.url_path_mappings('^spam$') self.assertEqual(1, len(x)) def test_match_none(self): x = RefreshLog.url_path_mappings('ham') self.assertEqual(0, len(x)) if __name__ == '__main__': unittest.main() fangfrisch-1.9.0/tests/test_log.py000066400000000000000000000042141457257166100172060ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import logging import unittest import fangfrisch.log from fangfrisch.log import LogHandlerType # noinspection PyProtectedMember from fangfrisch.log import _create_handler from fangfrisch.log import init_logger from fangfrisch.log import parse_syslog_target FORMAT = r'%(message)s' LEVEL = 'FATAL' class LogTests(unittest.TestCase): def setUp(self) -> None: super().setUp() fangfrisch.log._handler = None fangfrisch.log._logger = None def test_init_console_handler(self): x = _create_handler(LogHandlerType.CONSOLE, FORMAT, '') self.assertTrue(isinstance(x, logging.Handler)) def test_init_syslog_handler(self): x = _create_handler(LogHandlerType.SYSLOG, FORMAT, 'localhost') self.assertTrue(isinstance(x, logging.Handler)) x.close() def test_init_syslog_handler_port(self): x = _create_handler(LogHandlerType.SYSLOG, FORMAT, '127.0.0.1:514') self.assertTrue(isinstance(x, logging.Handler)) x.close() def test_init_logger(self): x = init_logger(LogHandlerType.CONSOLE, LEVEL, FORMAT) self.assertTrue(isinstance(x, logging.Logger)) def test_parse_dgram(self): a = '/dev/log' self.assertEqual(a, parse_syslog_target(a)) def test_parse_inet(self): h = '127.0.0.1' p = 101 a, b = parse_syslog_target(f'{h}:{p}') self.assertEqual(h, a) self.assertEqual(p, b) if __name__ == '__main__': unittest.main() fangfrisch-1.9.0/tests/test_refresh.py000066400000000000000000000121261457257166100200640ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import tempfile import unittest from argparse import Namespace from datetime import timedelta from fangfrisch.db import RefreshLog from fangfrisch.refresh import ClamavRefresh from fangfrisch.refresh import _is_url_disabled from tests import DIGEST_DUMMY from tests import DIGEST_MD5 from tests import FangfrischTest from tests import NETWORK_TESTS from tests import URL_BAD_SHA256 from tests import URL_MD5 from tests import URL_MISSING from tests import URL_SHA256 from tests import _ClamavTestItem class RefreshTests(FangfrischTest): ref = ClamavRefresh(Namespace(force=False)) def setUp(self) -> None: super().setUp() RefreshLog.init() self.s = RefreshLog._session() self.s.query(RefreshLog).delete() self.s.commit() @unittest.skipUnless(NETWORK_TESTS, 'network tests disabled') def test_404(self): ci = _ClamavTestItem(self.UNITTEST, 'x', URL_BAD_SHA256 + 'BAD') self.assertFalse(self.ref.refresh(ci)) @unittest.skipUnless(NETWORK_TESTS, 'network tests disabled') def test_bad_sha256(self): ci = _ClamavTestItem(self.UNITTEST, 'x', URL_BAD_SHA256, 'sha256') self.assertFalse(self.ref.refresh(ci)) @unittest.skipUnless(NETWORK_TESTS, 'network tests disabled') def test_good_sha256(self): ci = _ClamavTestItem(self.UNITTEST, 'x', URL_SHA256, 'sha256', f'{self.TMPDIR}/x') self.assertTrue(self.ref.refresh(ci)) @unittest.skipUnless(NETWORK_TESTS, 'network tests disabled') def test_good_md5(self): ci = _ClamavTestItem(self.UNITTEST, 'x', URL_MD5, 'md5', f'{self.TMPDIR}/x') self.assertTrue(self.ref.refresh(ci)) @unittest.skipUnless(NETWORK_TESTS, 'network tests disabled') def test_missing_checksum(self): ci = _ClamavTestItem(self.UNITTEST, 'x', URL_MISSING, 'sha256') self.assertFalse(self.ref.refresh(ci)) @unittest.skipUnless(NETWORK_TESTS, 'network tests disabled') def test_missing_path(self): ci = _ClamavTestItem(self.UNITTEST, 'x', URL_MD5, 'md5') with self.assertRaises(TypeError): self.assertTrue(self.ref.refresh(ci)) @unittest.skipUnless(NETWORK_TESTS, 'network tests disabled') def test_unknown_check(self): ci = _ClamavTestItem(self.UNITTEST, 'x', URL_BAD_SHA256, 'BAD') self.assertFalse(self.ref.refresh(ci)) @unittest.skipUnless(NETWORK_TESTS, 'network tests disabled') def test_refresh_force(self): cr = ClamavRefresh(Namespace(force=True)) (n, t) = cr.refresh_all() self.assertEqual(3, n) self.assertEqual(2, t) @unittest.skipUnless(NETWORK_TESTS, 'network tests disabled') def test_refresh_age(self): ci = _ClamavTestItem(self.UNITTEST, 'x', URL_SHA256, 'sha256', f'{self.TMPDIR}/x') r = RefreshLog(ci, DIGEST_DUMMY) r.updated += timedelta(minutes=10) self.s.add(r) self.s.commit() self.assertFalse(self.ref.refresh(ci)) @unittest.skipUnless(NETWORK_TESTS, 'network tests disabled') def test_refresh_digest_match(self): ci = _ClamavTestItem(self.UNITTEST, 'x', URL_MD5, 'md5', f'{self.TMPDIR}/x') r = RefreshLog(ci, DIGEST_MD5) self.s.add(r) self.s.commit() self.assertFalse(self.ref.refresh(ci)) @unittest.skipUnless(NETWORK_TESTS, 'network tests disabled') def test_refresh(self): ci = _ClamavTestItem(self.UNITTEST, 'x', URL_MD5, 'md5', f'{self.TMPDIR}/x') self.s.add(RefreshLog(ci, DIGEST_DUMMY)) self.s.commit() (n, t) = self.ref.refresh_all() self.assertEqual(3, n) self.assertEqual(2, t) @unittest.skipUnless(NETWORK_TESTS, 'network tests disabled') def test_url_blank(self): ci = _ClamavTestItem('unittest4', 'url_blank', '', 'md5', f'{self.TMPDIR}/blank') self.s.add(RefreshLog(ci, DIGEST_DUMMY)) self.s.commit() (n, t) = self.ref.refresh_all() self.assertEqual(3, n) self.assertEqual(3, n) def test_url_disabled(self): self.assertTrue(_is_url_disabled(None)) self.assertTrue(_is_url_disabled(' ')) self.assertTrue(_is_url_disabled('Disabled')) def test_print_mappings(self): file = tempfile.TemporaryFile(mode='w+t') ClamavRefresh.print_url_path_mappings(file) file.seek(0) data = file.read() self.assertTrue(data.startswith('unittest\t')) file.close() if __name__ == '__main__': unittest.main() fangfrisch-1.9.0/tests/test_task.py000066400000000000000000000031341457257166100173670ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import unittest from typing import List from fangfrisch.task import Task from fangfrisch.task import add_task from tests import FangfrischTest class TaskTests(FangfrischTest): FIRST_COMMAND = '/invalid/command/path' def setUp(self) -> None: super().setUpClass() self.tasks: List[Task] = list() self.tasks.append(Task(command=self.FIRST_COMMAND, timeout=1)) def test_add_task1(self): t = add_task(self.tasks, 'c2', timeout=2) self.assertTrue(isinstance(t, Task)) def test_add_task2(self): t = add_task(tasks=self.tasks, command=self.FIRST_COMMAND, timeout=3) self.assertIsNone(t) def test_complete1(self): for t in self.tasks: self.assertNotEqual(0, t.complete()) def test_complete2(self): t = add_task(self.tasks, 'echo', timeout=3) self.assertEqual(0, t.complete()) if __name__ == '__main__': unittest.main() fangfrisch-1.9.0/tests/test_util.py000066400000000000000000000060761457257166100174120ustar00rootroot00000000000000""" Copyright © 2020-2024 Ralph Seichter This file is part of "Fangfrisch". Fangfrisch 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. Fangfrisch 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 Fangfrisch. If not, see . """ import os import unittest from fangfrisch.log import log_error from fangfrisch.log import log_exception from fangfrisch.log import log_info from fangfrisch.util import check_integrity from fangfrisch.util import parse_hr_bytes from fangfrisch.util import parse_hr_time from fangfrisch.util import run_command from tests import FangfrischTest SAMPLE_DATA = 'fangfrisch'.encode('utf-8') SAMPLE_MD5 = '5e46abab8a827e1534af3a64a3d91f00' SAMPLE_SHA256 = '64ab093d2f42fe686ee229ab50f650752a74975347141f2e8e947a9d059b891a' class UtilTests(FangfrischTest): def test_md5_fail(self): i = check_integrity(SAMPLE_DATA, 'md5', 'a b') self.assertFalse(i.ok) self.assertIsNotNone(i.data) def test_md5_ok(self): i = check_integrity(SAMPLE_DATA, 'md5', SAMPLE_MD5) self.assertTrue(i.ok) self.assertIsNone(i.data) def test_sha256_fail(self): i = check_integrity(SAMPLE_DATA, 'sha256', 'b c') self.assertFalse(i.ok) def test_sha256_ok(self): i = check_integrity(SAMPLE_DATA, 'sha256', SAMPLE_SHA256) self.assertTrue(i.ok) def test_unknown(self): with self.assertRaises(ValueError): i = check_integrity(SAMPLE_DATA, 'UNKNOWN_ALGO', '') self.assertFalse(i.ok) def test_parse_bytes(self): self.assertEqual(123, parse_hr_bytes('123')) def test_parse_bytes_bad(self): self.assertTrue(parse_hr_bytes('BAD') < 0) def test_parse_bytes_k(self): self.assertEqual(30000, parse_hr_bytes('30k')) def test_parse_bytes_mb(self): self.assertEqual(2 * 1024 * 1024, parse_hr_bytes('2MB')) def test_parse_time(self): self.assertEqual(123, parse_hr_time('123m')) def test_parse_time_bad(self): self.assertTrue(parse_hr_time('321') < 0) def test_parse_time_d(self): self.assertEqual(24 * 60 * 3, parse_hr_time('3d')) def test_parse_time_h(self): self.assertEqual(48 * 60, parse_hr_time('48h')) def test_run_echo(self): self.assertEqual(0, run_command('echo > {path}', 3, log_info, log_error, log_exception, path=os.devnull)) def test_run_unknown(self): self.assertTrue(0 < run_command(self.UNKNOWN, 3, log_info, log_error, log_exception)) def test_run_timeout(self): self.assertNotEqual(0, run_command('sleep 3', 1, log_info, log_error, log_exception)) if __name__ == '__main__': unittest.main() fangfrisch-1.9.0/tests/tests.conf000066400000000000000000000015001457257166100170200ustar00rootroot00000000000000[DEFAULT] connection_timeout = 9 db_url = sqlite:////tmp/fangfrisch/unittest/db.sqlite local_directory = /tmp/fangfrisch/unittest log_format = %(message)s log_level = FATAL log_target = unittest on_update_exec = echo on_update_exec on_update_timeout = 5 [unittest] enabled = yes integrity_check = sha256 max_age = 0m prefix = https://seichter.de/ url_index = ${prefix}favicon-16x16.png [unittest2] enabled = yes integrity_check = md5 max_age = 52560000 on_update_exec = echo overridden on_update_timeout = 6 prefix = https://seichter.de/ url_index = ${prefix}favicon-32x32.png [unittest3] enabled = yes integrity_check = disabled max_age = 0m prefix = https://seichter.de/ url_blank = url_disabled = disabled url_index = ${prefix}favicon-32x32.png on_update_index = echo {path} [unittest4] enabled = yes max_size = not_a_number fangfrisch-1.9.0/tests/tests.sql000066400000000000000000000005011457257166100166720ustar00rootroot00000000000000PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; CREATE TABLE automx2 ( db_version INTEGER NOT NULL, PRIMARY KEY (db_version) ); INSERT INTO automx2 VALUES(2); CREATE TABLE refreshlog ( url VARCHAR NOT NULL, digest VARCHAR, path VARCHAR NOT NULL, provider VARCHAR, updated DATETIME, PRIMARY KEY (url) ); COMMIT;