pax_global_header00006660000000000000000000000064145654012530014517gustar00rootroot0000000000000052 comment=3c488101de525bf649604cc9cfb8e37739220fe7 fangfrisch-1.8.1/000077500000000000000000000000001456540125300136405ustar00rootroot00000000000000fangfrisch-1.8.1/.github/000077500000000000000000000000001456540125300152005ustar00rootroot00000000000000fangfrisch-1.8.1/.github/workflows/000077500000000000000000000000001456540125300172355ustar00rootroot00000000000000fangfrisch-1.8.1/.github/workflows/pythonpackage.yml000066400000000000000000000030761456540125300226230ustar00rootroot00000000000000name: 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.8.1/.gitignore000066400000000000000000000001051456540125300156240ustar00rootroot00000000000000*.egg-info/ .coverage .venv* .vscode/ build/ dist/ gchamon/ htmlcov/ fangfrisch-1.8.1/CHANGELOG.rst000066400000000000000000000057701456540125300156720ustar00rootroot00000000000000========= Changelog ========= 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.8.1/LICENSE000066400000000000000000001045151456540125300146530ustar00rootroot00000000000000 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.8.1/MANIFEST.in000066400000000000000000000000131456540125300153700ustar00rootroot00000000000000graft docs fangfrisch-1.8.1/Makefile000066400000000000000000000016611456540125300153040ustar00rootroot00000000000000# 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 "$(package) upload 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.8.1/README.rst000066400000000000000000000013021456540125300153230ustar00rootroot00000000000000========== 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.8.1/contrib/000077500000000000000000000000001456540125300153005ustar00rootroot00000000000000fangfrisch-1.8.1/contrib/initdb.sql000066400000000000000000000002211456540125300172650ustar00rootroot00000000000000PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; CREATE TABLE refreshlog ( url VARCHAR(255) PRIMARY KEY, digest VARCHAR(255), updated TIME ); COMMIT; fangfrisch-1.8.1/contrib/package.sh000077500000000000000000000021241456540125300172310ustar00rootroot00000000000000#!/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.8.1/contrib/unittest.sh000077500000000000000000000017441456540125300175240ustar00rootroot00000000000000#!/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.8.1/docs/000077500000000000000000000000001456540125300145705ustar00rootroot00000000000000fangfrisch-1.8.1/docs/Makefile000066400000000000000000000012671456540125300162360ustar00rootroot00000000000000# vim:ts=4:noet asciidoctor_opts = -o $@ -v ff = ../local/fangfrisch cf_combined = combined.conf cf_example = example.conf cf_internal = internal.conf out_html = index.html out_pdf = fangfrisch.pdf sources = fangfrisch.adoc $(cf_combined) $(cf_example) $(cf_internal) usage.txt .PHONY: all clean force all: $(out_html) $(out_pdf) $(cf_combined): $(cf_example) $(ff) -c $< dumpconf > $@ $(cf_internal): $(ff) -c /dev/null dumpconf > $@ $(out_html): $(sources) asciidoctor -a toc=right $(asciidoctor_opts) $< $(out_pdf): $(sources) asciidoctor-pdf -a toc=preamble $(asciidoctor_opts) $< clean: /bin/rm $(out_html) $(out_pdf) || true force: rm -f $(cf_combined) $(cf_internal) make fangfrisch-1.8.1/docs/combined.conf000066400000000000000000000066741456540125300172340ustar00rootroot00000000000000[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 [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_spam_marketing = ${prefix}spam_marketing.ndb 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 enabled = yes [urlhaus] interval = 10m url_urlhaus = https://urlhaus.abuse.ch/downloads/urlhaus.ndb enabled = yes max_size = 2MB fangfrisch-1.8.1/docs/example.conf000066400000000000000000000012351456540125300170730ustar00rootroot00000000000000# 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 [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.8.1/docs/fangfrisch.adoc000066400000000000000000000410751456540125300175410ustar00rootroot00000000000000# Fangfrisch Ralph Seichter v1.8.1, {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. == 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`. * *on_update_timeout*: Timeout for the `on_update_exec` command, in seconds. Default: 30. 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 (in alphabetical order): * 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] The internal default values for providers can be used by specifiying `enabled = yes` in the desired sections. Some providers require additional configuration as shown in the following example. ---- 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 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. All sections are disabled, and entries with the `!url_` prefix are included for reference only. These represent data sources which either have a high risk of false positives or are not free to use. 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[] ---- [[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. Related complaints will be filed under https://en.wikipedia.org/wiki/Somebody_else%27s_problem[SEP]. === 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.8.1/docs/fangfrisch.pdf000066400000000000000000007130261456540125300174060ustar00rootroot00000000000000%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:20240221143738+01'00') /CreationDate (D:20240221143754+01'00') >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R /Names 14 0 R /Outlines 144 0 R /PageLabels 169 0 R /PageMode /UseOutlines /OpenAction [7 0 R /FitH 841.89] /ViewerPreferences << /DisplayDocTitle true >> >> endobj 3 0 obj << /Type /Pages /Count 13 /Kids [7 0 R 17 0 R 28 0 R 39 0 R 52 0 R 56 0 R 63 0 R 72 0 R 79 0 R 83 0 R 85 0 R 90 0 R 92 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 20966 >> 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 BT 48.24 684.946 Td /F1.0 13 Tf [<7769746820736563757269747920696e206d696e642c20746f2062652072756e2062> 20.01953 <7920616e20756e70726976696c656765642075736572206f6e6c79> 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 175.84543 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 146.65743 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 118.87743 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 91.09743 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 2.67813 Tw BT 48.24 75.31743 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 59.53743 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 BT 48.24 639.92543 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 609.38743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 609.38743 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 609.38743 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 609.38743 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 609.38743 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 590.90743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 590.90743 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 590.90743 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 590.90743 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 590.90743 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 572.42743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 572.42743 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 572.42743 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 572.42743 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 572.42743 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 553.94743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 553.94743 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 553.94743 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 553.94743 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 553.94743 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 535.46743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 535.46743 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 535.46743 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 535.46743 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 535.46743 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 516.98743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 516.98743 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 516.98743 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 516.98743 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 516.98743 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 516.98743 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 498.50743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 498.50743 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 498.50743 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 498.50743 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 498.50743 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 480.02743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 480.02743 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 480.02743 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 480.02743 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 480.02743 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 461.54743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 461.54743 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 461.54743 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 461.54743 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 461.54743 Td /F1.0 10.5 Tf <34> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 60.24 443.06743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 443.06743 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 443.06743 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 443.06743 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 443.06743 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 424.58743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 424.58743 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 424.58743 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 424.58743 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 424.58743 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 406.10743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 406.10743 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 406.10743 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 406.10743 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 406.10743 Td /F1.0 10.5 Tf <36> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 48.24 387.62743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 387.62743 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 387.62743 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 387.62743 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 387.62743 Td /F1.0 10.5 Tf <36> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 48.24 369.14743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 369.14743 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 369.14743 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 369.14743 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 369.14743 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 350.66743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 350.66743 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 350.66743 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 350.66743 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 350.66743 Td /F1.0 10.5 Tf <37> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 60.24 332.18743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 332.18743 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 332.18743 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 332.18743 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 332.18743 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 313.70743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 313.70743 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 313.70743 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 313.70743 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 313.70743 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 295.22743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 295.22743 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 295.22743 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 295.22743 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 295.22743 Td /F1.0 10.5 Tf <38> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 48.24 276.74743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 276.74743 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 276.74743 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 276.74743 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 276.74743 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 258.26743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 258.26743 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 258.26743 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 258.26743 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 258.26743 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 239.78743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 239.78743 Td /F1.0 10.5 Tf <417070656e64697820433a20446174616261736520737472756374757265> 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 239.78743 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 239.78743 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 239.78743 Td /F1.0 10.5 Tf <3133> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 60.24 221.30743 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 60.24 221.30743 Td /F1.0 10.5 Tf [<432e312e2041> 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 181.88412 221.30743 Td /F1.0 10.5 Tf <2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn BT 534.62112 221.30743 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 221.30743 Td /F1.0 10.5 Tf <3133> 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 171 0 R >> >> /Annots [10 0 R 11 0 R 12 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 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] >> endobj 8 0 obj << /Type /Font /BaseFont /0404b5+NotoSerif-Bold /Subtype /TrueType /FontDescriptor 174 0 R /FirstChar 32 /LastChar 255 /Widths 176 0 R /ToUnicode 175 0 R >> endobj 9 0 obj << /Type /Font /BaseFont /ff2762+NotoSerif /Subtype /TrueType /FontDescriptor 178 0 R /FirstChar 32 /LastChar 255 /Widths 180 0 R /ToUnicode 179 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 [7 0 R /XYZ 0 204.14143 null] endobj 14 0 obj << /Type /Names /Dests 15 0 R >> endobj 15 0 obj << /Kids [94 0 R 95 0 R] >> endobj 16 0 obj << /Length 11226 >> stream q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN 0.4913 Tw BT 48.24 793.926 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 778.146 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 762.366 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 734.586 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 718.806 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 718.806 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 718.806 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 674.694 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 645.506 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 645.506 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 645.506 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 629.726 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 613.946 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 586.166 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 570.386 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 554.606 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 538.826 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 523.046 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 495.266 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 479.486 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 463.706 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 447.926 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 403.814 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 374.626 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 358.846 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 343.066 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 315.286 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 315.286 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 315.286 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 299.506 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 283.726 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 283.726 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 283.726 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 243.886 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 227.83 m 543.04 227.83 l 545.24914 227.83 547.04 226.03914 547.04 223.83 c 547.04 180.35 l 547.04 178.14086 545.24914 176.35 543.04 176.35 c 52.24 176.35 l 50.03086 176.35 48.24 178.14086 48.24 180.35 c 48.24 223.83 l 48.24 226.03914 50.03086 227.83 52.24 227.83 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 227.83 m 543.04 227.83 l 545.24914 227.83 547.04 226.03914 547.04 223.83 c 547.04 180.35 l 547.04 178.14086 545.24914 176.35 543.04 176.35 c 52.24 176.35 l 50.03086 176.35 48.24 178.14086 48.24 180.35 c 48.24 223.83 l 48.24 226.03914 50.03086 227.83 52.24 227.83 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 205.005 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 190.265 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 152.386 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 152.386 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 152.386 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 112.546 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 96.49 m 543.04 96.49 l 545.24914 96.49 547.04 94.69914 547.04 92.49 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 92.49 l 48.24 94.69914 50.03086 96.49 52.24 96.49 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 96.49 m 543.04 96.49 l 545.24914 96.49 547.04 94.69914 547.04 92.49 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 92.49 l 48.24 94.69914 50.03086 96.49 52.24 96.49 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 73.665 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 58.925 Td /F3.0 11 Tf <707974686f6e33202d6d2076656e762076656e76> 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 17 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 16 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 9 0 R /F2.0 8 0 R /F3.0 24 0 R >> /XObject << /Stamp2 172 0 R >> >> /Annots [18 0 R 20 0 R 22 0 R 25 0 R] >> endobj 18 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.gnu.org/licenses/) >> /Subtype /Link /Rect [66.93 715.74 213.86885 730.02] /Type /Annot >> endobj 19 0 obj [17 0 R /XYZ 0 702.99 null] endobj 20 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://en.wikipedia.org/wiki/Cron) >> /Subtype /Link /Rect [326.43184 642.44 349.37434 656.72] /Type /Annot >> endobj 21 0 obj [17 0 R /XYZ 0 432.11 null] endobj 22 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://packaging.python.org/tutorials/installing-packages/) >> /Subtype /Link /Rect [308.01754 312.22 377.57662 326.5] /Type /Annot >> endobj 23 0 obj [17 0 R /XYZ 0 267.91 null] endobj 24 0 obj << /Type /Font /BaseFont /c141e6+mplus1mn-regular /Subtype /TrueType /FontDescriptor 182 0 R /FirstChar 32 /LastChar 255 /Widths 184 0 R /ToUnicode 183 0 R >> endobj 25 0 obj << /Border [0 0 0] /Dest (dbsetup) /Subtype /Link /Rect [474.30879 149.32 519.25929 163.6] /Type /Annot >> endobj 26 0 obj [17 0 R /XYZ 0 136.57 null] endobj 27 0 obj << /Length 13854 >> 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 <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 744.126 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 744.126 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 728.07 m 543.04 728.07 l 545.24914 728.07 547.04 726.27914 547.04 724.07 c 547.04 695.33 l 547.04 693.12086 545.24914 691.33 543.04 691.33 c 52.24 691.33 l 50.03086 691.33 48.24 693.12086 48.24 695.33 c 48.24 724.07 l 48.24 726.27914 50.03086 728.07 52.24 728.07 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 728.07 m 543.04 728.07 l 545.24914 728.07 547.04 726.27914 547.04 724.07 c 547.04 695.33 l 547.04 693.12086 545.24914 691.33 543.04 691.33 c 52.24 691.33 l 50.03086 691.33 48.24 693.12086 48.24 695.33 c 48.24 724.07 l 48.24 726.27914 50.03086 728.07 52.24 728.07 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 705.245 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 667.366 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 667.366 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 667.366 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 623.254 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 594.066 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 578.286 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 550.506 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 550.506 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 550.506 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 550.506 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 550.506 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 528.726 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 528.726 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 528.726 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 528.726 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 528.726 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 506.946 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 506.946 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 506.946 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 506.946 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 506.946 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 485.166 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 485.166 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 485.166 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 485.166 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 485.166 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 441.054 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 411.866 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 411.866 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 411.866 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 396.086 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 380.306 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 352.526 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 352.526 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 352.526 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 352.526 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 352.526 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 336.746 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 320.93 m 543.04 320.93 l 545.24914 320.93 547.04 319.13914 547.04 316.93 c 547.04 185.01 l 547.04 182.80086 545.24914 181.01 543.04 181.01 c 52.24 181.01 l 50.03086 181.01 48.24 182.80086 48.24 185.01 c 48.24 316.93 l 48.24 319.13914 50.03086 320.93 52.24 320.93 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 320.93 m 543.04 320.93 l 545.24914 320.93 547.04 319.13914 547.04 316.93 c 547.04 185.01 l 547.04 182.80086 545.24914 181.01 543.04 181.01 c 52.24 181.01 l 50.03086 181.01 48.24 182.80086 48.24 185.01 c 48.24 316.93 l 48.24 319.13914 50.03086 320.93 52.24 320.93 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 298.105 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 268.625 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 253.885 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 239.145 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 209.665 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 194.925 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 157.046 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 157.046 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 157.046 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 157.046 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 157.046 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 157.046 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 157.046 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 157.046 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 141.266 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 141.266 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 0.02203 Tw BT 66.24 125.486 Td ET 0.0 Tw 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN 0.02203 Tw BT 66.24 125.486 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 109.706 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 109.706 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 87.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 3.32556 Tw BT 66.24 87.926 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 87.926 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 87.926 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 72.146 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 72.146 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 72.146 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 72.146 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 56.366 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 56.366 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 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 << /F3.0 24 0 R /F2.0 8 0 R /F1.0 9 0 R >> /XObject << /Stamp1 171 0 R >> >> /Annots [30 0 R 32 0 R 33 0 R 34 0 R 35 0 R 37 0 R] >> endobj 29 0 obj [28 0 R /XYZ 0 768.15 null] endobj 30 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://pypi.org/project/fangfrisch/) >> /Subtype /Link /Rect [179.586 738.87 220.176 763.35] /Type /Annot >> endobj 31 0 obj [28 0 R /XYZ 0 651.55 null] endobj 32 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://aur.archlinux.org/packages/python-fangfrisch/) >> /Subtype /Link /Rect [128.2425 547.44 266.31729 561.72] /Type /Annot >> endobj 33 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/clearlinux-pkgs/fangfrisch) >> /Subtype /Link /Rect [130.227 525.66 261.16179 539.94] /Type /Annot >> endobj 34 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://packages.debian.org/sid/fangfrisch) >> /Subtype /Link /Rect [139.782 503.88 222.3855 518.16] /Type /Annot >> endobj 35 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 482.1 261.225 496.38] /Type /Annot >> endobj 36 0 obj [28 0 R /XYZ 0 469.35 null] endobj 37 0 obj << /Border [0 0 0] /Dest (usage) /Subtype /Link /Rect [271.64487 349.46 316.75535 363.74] /Type /Annot >> endobj 38 0 obj << /Length 23135 >> stream q 3.19644 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 3.19644 Tw BT 66.24 793.926 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 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 <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 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.36777 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.36777 Tw BT 66.24 756.366 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 756.366 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 756.366 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 756.366 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 756.366 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 756.366 Td 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 <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 718.806 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 718.806 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 718.806 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 718.806 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 718.806 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 718.806 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 697.026 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 697.026 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 697.026 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 697.026 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 697.026 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 697.026 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 697.026 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 697.026 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 681.246 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 681.246 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 659.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 5.20629 Tw BT 66.24 659.466 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 659.466 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 659.466 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 643.686 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 643.686 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 643.686 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 643.686 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 643.686 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 643.686 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 627.906 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 627.906 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 606.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 0.23054 Tw BT 66.24 606.126 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 606.126 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 606.126 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 590.346 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 590.346 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 574.566 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 574.566 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 574.566 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 574.566 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 558.786 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 558.786 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 537.006 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 537.006 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 537.006 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 537.006 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 537.006 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 537.006 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 521.226 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 521.226 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 499.446 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 499.446 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 499.446 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 499.446 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 499.446 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 499.446 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 499.446 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 499.446 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 499.446 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 499.446 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 499.446 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 499.446 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 499.446 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 499.446 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 477.666 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 477.666 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 477.666 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 477.666 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 477.666 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 477.666 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 477.666 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 477.666 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 461.886 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 461.886 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 461.886 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 461.886 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 440.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.04431 Tw BT 66.24 440.106 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 440.106 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 440.106 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 440.106 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 440.106 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 440.106 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 440.106 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 424.326 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 424.326 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 424.326 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 424.326 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 424.326 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 424.326 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 424.326 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 408.546 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 408.546 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 386.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.29188 Tw BT 66.24 386.766 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 386.766 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 386.766 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 386.766 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 386.766 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 370.986 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 370.986 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 370.986 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 370.986 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 355.206 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 355.206 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 355.206 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 355.206 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 355.206 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 355.206 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 339.426 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 339.426 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 323.646 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 323.646 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 307.866 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 307.866 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 286.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 1.14712 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.14712 Tw BT 66.24 286.086 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 286.086 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 BT 66.24 270.306 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 270.306 Td /F1.0 10.5 Tf <61667465722074686520706173732066696e69736865732e204e6f2064656661756c742e2041207479706963616c2076616c756520697320> 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 325.821 270.306 Td /F3.0 10.5 Tf <636c616d647363616e202d2d72656c6f6164> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 420.321 270.306 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 248.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 248.526 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 248.526 Td /F2.0 10.5 Tf <6f6e5f7570646174655f74696d656f7574> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 168.2895 248.526 Td /F1.0 10.5 Tf <3a2054696d656f757420666f722074686520> 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 254.736 248.526 Td /F3.0 10.5 Tf <6f6e5f7570646174655f65786563> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 328.236 248.526 Td /F1.0 10.5 Tf <20636f6d6d616e642c20696e207365636f6e64732e2044656661756c743a2033302e> Tj ET 0.0 0.0 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 220.746 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 220.746 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 220.746 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 220.746 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 220.746 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 204.966 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 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 165.126 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 137.106 Td /F1.0 10.5 Tf [<46> 40.03906 <616e6766726973636820636f6e7461696e7320696e7465726e616c2064656661756c747320666f722074686520666f6c6c6f77696e672070726f7669646572732028696e20616c7068616265746963616c206f72646572293a>] 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 109.326 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 109.326 Td ET 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 66.24 109.326 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 87.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 87.546 Td ET 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 66.24 87.546 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 65.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 BT 66.24 65.766 Td ET 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 66.24 65.766 Td /F1.0 10.5 Tf <5365637572697465496e666f> 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 39 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 38 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 9 0 R /F2.0 8 0 R /F3.0 24 0 R >> /XObject << /Stamp2 172 0 R >> >> /Annots [40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 48 0 R 49 0 R 50 0 R] >> endobj 40 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 753.3 298.20934 767.58] /Type /Annot >> endobj 41 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.sqlite.org) >> /Subtype /Link /Rect [514.343 753.3 547.04 767.58] /Type /Annot >> endobj 42 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 533.94 232.42169 548.22] /Type /Annot >> endobj 43 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://tools.ietf.org/html/rfc5424) >> /Subtype /Link /Rect [148.40162 437.04 178.75712 451.32] /Type /Annot >> endobj 44 0 obj << /Border [0 0 0] /Dest (internalconf) /Subtype /Link /Rect [201.01246 367.92 260.9897 382.2] /Type /Annot >> endobj 45 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 217.68 90.90052 231.96] /Type /Annot >> endobj 46 0 obj << /Border [0 0 0] /Dest (_semantics) /Subtype /Link /Rect [446.88247 217.68 500.49448 231.96] /Type /Annot >> endobj 47 0 obj [39 0 R /XYZ 0 189.15 null] endobj 48 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.malwarepatrol.net) >> /Subtype /Link /Rect [66.24 106.26 141.0315 120.54] /Type /Annot >> endobj 49 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://sanesecurity.com) >> /Subtype /Link /Rect [66.24 84.48 130.3215 98.76] /Type /Annot >> endobj 50 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 62.7 127.5495 76.98] /Type /Annot >> endobj 51 0 obj << /Length 8075 >> 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 BT 66.24 793.926 Td ET 0.25882 0.5451 0.79216 scn 0.25882 0.5451 0.79216 SCN BT 66.24 793.926 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.20998 Tw BT 48.24 766.146 Td /F1.0 10.5 Tf [<54686520696e7465726e616c2064656661756c742076616c75657320666f722070726f7669646572732063616e20626520757365642062> 20.01953 <79207370656369666979696e6720>] 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.20998 Tw BT 401.35059 766.146 Td /F3.0 10.5 Tf <656e61626c6564203d20796573> 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.20998 Tw BT 472.02056 766.146 Td /F1.0 10.5 Tf <20696e207468652064657369726564> 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 750.366 Td /F1.0 10.5 Tf [<73656374696f6e732e20536f6d652070726f7669646572732072657175697265206164646974696f6e616c20636f6e6669677572> 20.01953 <6174696f6e2061732073686f776e20696e2074686520666f6c6c6f77696e67206578616d706c652e>] 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 734.55 m 543.04 734.55 l 545.24914 734.55 547.04 732.75914 547.04 730.55 c 547.04 259.61 l 547.04 257.40086 545.24914 255.61 543.04 255.61 c 52.24 255.61 l 50.03086 255.61 48.24 257.40086 48.24 259.61 c 48.24 730.55 l 48.24 732.75914 50.03086 734.55 52.24 734.55 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 734.55 m 543.04 734.55 l 545.24914 734.55 547.04 732.75914 547.04 730.55 c 547.04 259.61 l 547.04 257.40086 545.24914 255.61 543.04 255.61 c 52.24 255.61 l 50.03086 255.61 48.24 257.40086 48.24 259.61 c 48.24 730.55 l 48.24 732.75914 50.03086 734.55 52.24 734.55 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 711.725 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 682.245 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 667.505 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 638.025 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 623.285 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 593.805 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 579.065 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 564.325 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 549.585 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 520.105 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 505.365 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 490.625 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 475.885 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 446.405 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 431.665 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 416.925 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 402.185 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 372.705 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 357.965 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 343.225 Td /F3.0 11 Tf <23205265706c616365207769746820796f757220706572736f6e616c205365637572697465496e666f20637573746f6d6572204944> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 328.485 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 299.005 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 284.265 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 269.525 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 219.586 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 191.566 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 175.786 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 159.97 m 543.04 159.97 l 545.24914 159.97 547.04 158.17914 547.04 155.97 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 155.97 l 48.24 158.17914 50.03086 159.97 52.24 159.97 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 159.97 m 543.04 159.97 l 545.24914 159.97 547.04 158.17914 547.04 155.97 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 155.97 l 48.24 158.17914 50.03086 159.97 52.24 159.97 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 137.145 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 122.405 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 107.665 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 92.925 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 78.185 Td /F3.0 11 Tf <707265666978203d20687474703a2f2f66696374696f6e616c2d70726f76696465722e746c642f636c616d61762d756e6f6666696369616c2f> 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 52 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 51 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 9 0 R /F3.0 24 0 R /F2.0 8 0 R >> /XObject << /Stamp1 171 0 R >> >> /Annots [53 0 R] >> endobj 53 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://urlhaus.abuse.ch) >> /Subtype /Link /Rect [66.24 790.86 111.1275 805.14] /Type /Annot >> endobj 54 0 obj [52 0 R /XYZ 0 243.61 null] endobj 55 0 obj << /Length 14438 >> 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 651.49 l 547.04 649.28086 545.24914 647.49 543.04 647.49 c 52.24 647.49 l 50.03086 647.49 48.24 649.28086 48.24 651.49 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 651.49 l 547.04 649.28086 545.24914 647.49 543.04 647.49 c 52.24 647.49 l 50.03086 647.49 48.24 649.28086 48.24 651.49 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 <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 779.325 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 764.585 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 749.845 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 720.365 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 705.625 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 676.145 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 661.405 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 611.466 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 583.446 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 583.446 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 583.446 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 567.666 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 539.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.02615 Tw BT 66.24 539.886 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 539.886 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 539.886 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 539.886 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 524.106 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 524.106 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 502.326 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 502.326 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 502.326 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 486.546 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 486.546 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 486.546 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 486.546 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 486.546 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 486.546 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 464.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 3.53085 Tw BT 66.24 464.766 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 464.766 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 464.766 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 464.766 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 464.766 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 464.766 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 448.986 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 448.986 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 448.986 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 448.986 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 433.206 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 433.206 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 405.426 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 389.646 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 389.646 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 389.646 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 389.646 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 389.646 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 373.866 Td /F1.0 10.5 Tf <646f776e6c6f616465642066696c65732e> Tj ET 0.0 0.0 0.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 334.026 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 306.006 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 306.006 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 306.006 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 290.226 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 290.226 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 290.226 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 290.226 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 290.226 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 290.226 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 290.226 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 274.446 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 230.334 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 201.146 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 185.366 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 185.366 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 185.366 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 185.366 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 169.586 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 153.77 m 543.04 153.77 l 545.24914 153.77 547.04 151.97914 547.04 149.77 c 547.04 121.03 l 547.04 118.82086 545.24914 117.03 543.04 117.03 c 52.24 117.03 l 50.03086 117.03 48.24 118.82086 48.24 121.03 c 48.24 149.77 l 48.24 151.97914 50.03086 153.77 52.24 153.77 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 153.77 m 543.04 153.77 l 545.24914 153.77 547.04 151.97914 547.04 149.77 c 547.04 121.03 l 547.04 118.82086 545.24914 117.03 543.04 117.03 c 52.24 117.03 l 50.03086 117.03 48.24 118.82086 48.24 121.03 c 48.24 149.77 l 48.24 151.97914 50.03086 153.77 52.24 153.77 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 130.945 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 105.03 m 137.84318 65.47 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 81.176 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 89.066 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 73.286 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 73.286 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 73.286 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 56 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 55 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F3.0 24 0 R /F2.0 8 0 R /F1.0 9 0 R /F4.0 58 0 R >> /XObject << /Stamp2 172 0 R >> >> /Annots [60 0 R] >> endobj 57 0 obj [56 0 R /XYZ 0 635.49 null] endobj 58 0 obj << /Type /Font /BaseFont /e8f2e8+NotoSerif-Italic /Subtype /TrueType /FontDescriptor 186 0 R /FirstChar 32 /LastChar 255 /Widths 188 0 R /ToUnicode 187 0 R >> endobj 59 0 obj [56 0 R /XYZ 0 358.05 null] endobj 60 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 287.16 433.41934 301.44] /Type /Annot >> endobj 61 0 obj [56 0 R /XYZ 0 258.63 null] endobj 62 0 obj << /Length 12065 >> stream q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 48.24 782.394 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 753.206 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 737.39 m 543.04 737.39 l 545.24914 737.39 547.04 735.59914 547.04 733.39 c 547.04 483.55 l 547.04 481.34086 545.24914 479.55 543.04 479.55 c 52.24 479.55 l 50.03086 479.55 48.24 481.34086 48.24 483.55 c 48.24 733.39 l 48.24 735.59914 50.03086 737.39 52.24 737.39 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 737.39 m 543.04 737.39 l 545.24914 737.39 547.04 735.59914 547.04 733.39 c 547.04 483.55 l 547.04 481.34086 545.24914 479.55 543.04 479.55 c 52.24 479.55 l 50.03086 479.55 48.24 481.34086 48.24 483.55 c 48.24 733.39 l 48.24 735.59914 50.03086 737.39 52.24 737.39 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 714.565 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 685.085 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 670.345 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 640.865 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 611.385 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 596.645 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 567.165 Td /F3.0 11 Tf <6f7074696f6e616c20617267756d656e74733a> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 552.425 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 537.685 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 522.945 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 508.205 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 493.465 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 455.586 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 427.806 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 427.806 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 427.806 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 427.806 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 412.026 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 412.026 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 412.026 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 412.026 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 396.246 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 396.246 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 396.246 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 396.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.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 374.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.48668 Tw BT 66.24 374.466 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 374.466 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 374.466 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 358.686 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 358.686 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 358.686 Td /F1.0 10.5 Tf <417070656e6469782043> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 180.1965 358.686 Td /F1.0 10.5 Tf <20666f722064657461696c732e> 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 336.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 1.08673 Tw BT 66.24 336.906 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 336.906 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 336.906 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 321.126 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 321.126 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 321.126 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 321.126 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 299.346 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 299.346 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 299.346 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 299.346 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 299.346 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 299.346 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 283.566 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 283.566 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 255.786 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 240.006 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 224.19 m 543.04 224.19 l 545.24914 224.19 547.04 222.39914 547.04 220.19 c 547.04 147.23 l 547.04 145.02086 545.24914 143.23 543.04 143.23 c 52.24 143.23 l 50.03086 143.23 48.24 145.02086 48.24 147.23 c 48.24 220.19 l 48.24 222.39914 50.03086 224.19 52.24 224.19 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 224.19 m 543.04 224.19 l 545.24914 224.19 547.04 222.39914 547.04 220.19 c 547.04 147.23 l 547.04 145.02086 545.24914 143.23 543.04 143.23 c 52.24 143.23 l 50.03086 143.23 48.24 145.02086 48.24 147.23 c 48.24 220.19 l 48.24 222.39914 50.03086 224.19 52.24 224.19 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 201.365 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 186.625 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 171.885 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 157.145 Td /F3.0 11 Tf <2a2f3130202a202a202a202a20636c616d61762076656e762f62696e2f66616e67667269736368202d2d636f6e66202f6574632f66616e676672697363682e636f6e662072656672657368> Tj ET 0.0 0.0 0.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 102.934 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 73.746 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 73.746 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 73.746 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 73.746 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 73.746 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 57.966 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 57.966 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 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 /F3.0 24 0 R /F4.0 58 0 R >> /XObject << /Stamp1 171 0 R >> >> /Annots [65 0 R 66 0 R 67 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] /Dest (_configuration) /Subtype /Link /Rect [429.79701 408.96 474.80526 423.24] /Type /Annot >> endobj 66 0 obj << /Border [0 0 0] /Dest (sampleeff) /Subtype /Link /Rect [66.24 393.18 124.3365 407.46] /Type /Annot >> endobj 67 0 obj << /Border [0 0 0] /Dest (dbstructure) /Subtype /Link /Rect [122.52 355.62 180.1965 369.9] /Type /Annot >> endobj 68 0 obj [63 0 R /XYZ 0 131.23 null] endobj 69 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rseichter/fangfrisch) >> /Subtype /Link /Rect [180.3825 70.68 216.324 84.96] /Type /Annot >> endobj 70 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rseichter/fangfrisch/issues) >> /Subtype /Link /Rect [48.24 54.9 121.29164 69.18] /Type /Annot >> endobj 71 0 obj << /Length 10916 >> stream q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN 1.37743 Tw BT 48.24 793.926 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 793.926 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 793.926 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 778.146 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 738.306 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 710.286 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 694.506 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 678.726 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 650.946 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 635.166 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 607.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 607.386 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 607.386 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 585.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 585.606 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 585.606 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 563.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 563.826 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 563.826 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 542.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 542.046 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 542.046 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 520.266 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 520.266 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 520.266 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 498.486 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 498.486 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 498.486 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 476.706 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 476.706 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 476.706 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 436.866 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 408.846 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 381.066 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 381.066 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 381.066 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 359.286 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 359.286 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 359.286 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 337.506 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 337.506 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 337.506 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 309.726 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 293.946 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 278.166 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 238.326 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 210.306 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 194.526 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 166.746 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 166.746 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 166.746 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 144.966 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 144.966 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 144.966 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 123.186 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 123.186 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 123.186 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 101.406 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 101.406 Td ET 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 66.24 101.406 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 73.626 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 73.626 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 73.626 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 57.846 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 57.846 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 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 /F4.0 58 0 R >> /XObject << /Stamp2 172 0 R >> >> /Annots [73 0 R 77 0 R] >> endobj 73 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (mailto:fangfrisch@seichter.de) >> /Subtype /Link /Rect [323.6619 790.86 397.63633 805.14] /Type /Annot >> endobj 74 0 obj [72 0 R /XYZ 0 762.33 null] endobj 75 0 obj [72 0 R /XYZ 0 460.89 null] endobj 76 0 obj [72 0 R /XYZ 0 262.35 null] endobj 77 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 54.78 547.04 69.06] /Type /Annot >> endobj 78 0 obj << /Length 9504 >> stream q /DeviceRGB cs 0.25882 0.5451 0.79216 scn /DeviceRGB CS 0.25882 0.5451 0.79216 SCN BT 48.24 793.926 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 793.926 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 749.814 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 3.61756 Tw BT 48.24 720.626 Td /F1.0 10.5 Tf [<46> 40.03906 <616e6766726973636820636f6e7461696e732074686520666f6c6c6f77696e6720696e7465726e616c20636f6e6669677572> 20.01953 <6174696f6e2073657474696e67732061732064656661756c74732e20416c6c2073656374696f6e7320617265>] 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.46895 Tw BT 48.24 704.846 Td /F1.0 10.5 Tf <64697361626c65642c20616e6420656e747269657320776974682074686520> 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.46895 Tw BT 206.53277 704.846 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.46895 Tw BT 232.78277 704.846 Td /F1.0 10.5 Tf [<207072656669782061726520696e636c7564656420666f72207265666572656e6365206f6e6c79> 89.84375 <2e20546865736520726570726573656e742064617461>] 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.06011 Tw BT 48.24 689.066 Td /F1.0 10.5 Tf <736f757263657320776869636820656974686572206861766520612068696768207269736b206f662066616c736520706f73697469766573206f7220617265206e6f74206672656520746f207573652e20456e61626c696e6720612073656374696f6e2077696c6c> 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 673.286 Td /F1.0 10.5 Tf <6e6f7420656e61626c65207468657365207370656369616c6c7920707265666978656420656e74726965732e> 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 657.47 m 543.04 657.47 l 545.24914 657.47 547.04 655.67914 547.04 653.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 653.47 l 48.24 655.67914 50.03086 657.47 52.24 657.47 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 657.47 m 543.04 657.47 l 545.24914 657.47 547.04 655.67914 547.04 653.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 653.47 l 48.24 655.67914 50.03086 657.47 52.24 657.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 634.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 619.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 605.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 590.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 575.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 560.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 546.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 516.725 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 501.985 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 487.245 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 472.505 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 457.765 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 443.025 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 428.285 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 413.545 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 398.805 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 384.065 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 354.585 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 339.845 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 325.105 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 310.365 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 295.625 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 280.885 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 266.145 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 251.405 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 236.665 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 221.925 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 207.185 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 192.445 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 177.705 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 162.965 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 148.225 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 133.485 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 118.745 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 104.005 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 89.265 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 74.525 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 59.785 Td /F3.0 11 Tf <75726c5f6a75726c626c203d20247b7072656669787d6a75726c626c2e6e6462> 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 79 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 78 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 9 0 R /F2.0 8 0 R /F3.0 24 0 R >> /XObject << /Stamp1 171 0 R >> >> /Annots [80 0 R] >> endobj 80 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 790.86 73.335 805.14] /Type /Annot >> endobj 81 0 obj [79 0 R /XYZ 0 778.11 null] endobj 82 0 obj << /Length 9609 >> 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 91.37 l 547.04 89.16086 545.24914 87.37 543.04 87.37 c 52.24 87.37 l 50.03086 87.37 48.24 89.16086 48.24 91.37 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 91.37 l 547.04 89.16086 545.24914 87.37 543.04 87.37 c 52.24 87.37 l 50.03086 87.37 48.24 89.16086 48.24 91.37 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 <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 779.325 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 764.585 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 749.845 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 735.105 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 720.365 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 705.625 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 690.885 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 676.145 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 661.405 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 646.665 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 631.925 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 617.185 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 602.445 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 587.705 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 572.965 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 558.225 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 543.485 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 528.745 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 514.005 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 499.265 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 484.525 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 469.785 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 455.045 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 440.305 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 425.565 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 410.825 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 381.345 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 366.605 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 351.865 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 337.125 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 322.385 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 307.645 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 292.905 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 278.165 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 263.425 Td /F3.0 11 Tf <2175726c5f7370616d5f6d61726b6574696e67203d20247b7072656669787d7370616d5f6d61726b6574696e672e6e6462> Tj ET 0.0 0.0 0.0 SCN 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 <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 233.945 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 219.205 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 204.465 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 189.725 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 174.985 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 160.245 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 130.765 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 116.025 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 101.285 Td /F3.0 11 Tf <75726c5f75726c68617573203d2068747470733a2f2f75726c686175732e61627573652e63682f646f776e6c6f6164732f75726c686175732e6e6462> 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 83 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 82 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F3.0 24 0 R >> /XObject << /Stamp2 172 0 R >> >> >> endobj 84 0 obj << /Length 9568 >> stream q /DeviceRGB cs 0.2 0.2 0.2 scn /DeviceRGB CS 0.2 0.2 0.2 SCN BT 48.24 782.394 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 753.206 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 753.206 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 753.206 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 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 48.24 737.426 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 737.426 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 737.426 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 721.61 m 543.04 721.61 l 545.24914 721.61 547.04 719.81914 547.04 717.61 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 717.61 l 48.24 719.81914 50.03086 721.61 52.24 721.61 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 721.61 m 543.04 721.61 l 545.24914 721.61 547.04 719.81914 547.04 717.61 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 717.61 l 48.24 719.81914 50.03086 721.61 52.24 721.61 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 698.785 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 684.045 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 669.305 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 654.565 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 639.825 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 625.085 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 610.345 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 595.605 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 580.865 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 566.125 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 551.385 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 521.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 507.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 492.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 477.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 462.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 448.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 433.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 418.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 403.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 389.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 374.505 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 345.025 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 330.285 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 315.545 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 300.805 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 286.065 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 271.325 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 256.585 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 241.845 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 227.105 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 212.365 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 197.625 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 182.885 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 168.145 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 153.405 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 138.665 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 123.925 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 109.185 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 94.445 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 79.705 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 64.965 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 50.225 Td /F3.0 11 Tf <75726c5f6a75726c626c203d20247b7072656669787d6a75726c626c2e6e6462> 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 85 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 84 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F2.0 8 0 R /F1.0 9 0 R /F3.0 24 0 R >> /XObject << /Stamp1 171 0 R >> >> /Annots [87 0 R 88 0 R] >> endobj 86 0 obj [85 0 R /XYZ 0 841.89 null] endobj 87 0 obj << /Border [0 0 0] /Dest (internalconf) /Subtype /Link /Rect [483.95698 750.14 543.407 764.42] /Type /Annot >> endobj 88 0 obj << /Border [0 0 0] /Dest (_configuration) /Subtype /Link /Rect [227.7165 734.36 272.667 748.64] /Type /Annot >> endobj 89 0 obj << /Length 10073 >> 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 <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 779.325 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 764.585 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 749.845 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 735.105 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 720.365 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 705.625 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 690.885 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 676.145 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 661.405 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 646.665 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 631.925 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 617.185 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 602.445 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 587.705 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 572.965 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 558.225 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 543.485 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 528.745 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 514.005 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 499.265 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 484.525 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 469.785 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 455.045 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 440.305 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 425.565 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 410.825 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 396.085 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 366.605 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 351.865 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 337.125 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 322.385 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 307.645 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 292.905 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 278.165 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 263.425 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 248.685 Td /F3.0 11 Tf <2175726c5f7370616d5f6d61726b6574696e67203d20247b7072656669787d7370616d5f6d61726b6574696e672e6e6462> Tj ET 0.0 0.0 0.0 SCN 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 <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 219.205 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 204.465 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 189.725 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 174.985 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 160.245 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 145.505 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 130.765 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 101.285 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 86.545 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 71.805 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 57.065 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 90 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 89 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F3.0 24 0 R >> /XObject << /Stamp2 172 0 R >> >> >> endobj 91 0 obj << /Length 8903 >> 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 <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 739.854 Td /F2.0 22 Tf <417070656e64697820433a20446174616261736520737472756374757265> Tj ET 0.0 0.0 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 710.666 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 0.95453 Tw BT 48.24 694.886 Td /F1.0 10.5 Tf <636f6e74656e742061726520636f6e7369646572656420> 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.95453 Tw BT 168.64059 694.886 Td /F2.0 10.5 Tf <70726976617465> 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.95453 Tw BT 207.45909 694.886 Td /F1.0 10.5 Tf [<2e2054686579206d61> 20.01953 <79206368616e676520617420616e> 20.01953 <792074696d652c20776974686f7574206e6f746963652e2052656c6174656420636f6d706c61696e7473>] 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 679.106 Td /F1.0 10.5 Tf <77696c6c2062652066696c656420756e64657220> 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 143.034 679.106 Td /F1.0 10.5 Tf <534550> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 161.619 679.106 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 639.266 Td /F2.0 18 Tf [<432e312e2041> 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 611.246 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 611.246 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 611.246 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 595.466 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 579.686 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 579.686 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 579.686 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 563.906 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 563.906 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 563.906 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 548.126 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 548.126 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 548.126 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 532.346 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 532.346 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 532.346 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 532.346 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 516.566 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 500.75 m 543.04 500.75 l 545.24914 500.75 547.04 498.95914 547.04 496.75 c 547.04 453.27 l 547.04 451.06086 545.24914 449.27 543.04 449.27 c 52.24 449.27 l 50.03086 449.27 48.24 451.06086 48.24 453.27 c 48.24 496.75 l 48.24 498.95914 50.03086 500.75 52.24 500.75 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 500.75 m 543.04 500.75 l 545.24914 500.75 547.04 498.95914 547.04 496.75 c 547.04 453.27 l 547.04 451.06086 545.24914 449.27 543.04 449.27 c 52.24 449.27 l 50.03086 449.27 48.24 451.06086 48.24 453.27 c 48.24 496.75 l 48.24 498.95914 50.03086 500.75 52.24 500.75 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 477.925 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 463.185 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 437.27 m 543.04 437.27 l 545.24914 437.27 547.04 435.47914 547.04 433.27 c 547.04 375.05 l 547.04 372.84086 545.24914 371.05 543.04 371.05 c 52.24 371.05 l 50.03086 371.05 48.24 372.84086 48.24 375.05 c 48.24 433.27 l 48.24 435.47914 50.03086 437.27 52.24 437.27 c h f 0.8 0.8 0.8 SCN 0.75 w 52.24 437.27 m 543.04 437.27 l 545.24914 437.27 547.04 435.47914 547.04 433.27 c 547.04 375.05 l 547.04 372.84086 545.24914 371.05 543.04 371.05 c 52.24 371.05 l 50.03086 371.05 48.24 372.84086 48.24 375.05 c 48.24 433.27 l 48.24 435.47914 50.03086 437.27 52.24 437.27 c h S Q 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 414.445 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 399.705 Td /F3.0 11 Tf <2320444f4e27542045584543555445205448495320554e4c45535320594f55205245414c4c59204d45414e20495421> Tj ET 0.0 0.0 0.0 SCN 0.0 0.0 0.0 scn 0.2 0.2 0.2 scn 0.2 0.2 0.2 SCN BT 59.24 384.965 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 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 << /F3.0 24 0 R /F2.0 8 0 R /F1.0 9 0 R /F4.0 58 0 R >> /XObject << /Stamp1 171 0 R >> >> /Annots [96 0 R] >> endobj 93 0 obj [92 0 R /XYZ 0 768.15 null] endobj 94 0 obj << /Limits [(__anchor-top) (_prepare_and_activate_venv)] /Names [(__anchor-top) 170 0 R (_accessing_mappings) 97 0 R (_configuration) 36 0 R (_create_home_directory) 23 0 R (_default_providers) 47 0 R (_discussion_precedes_contribution) 76 0 R (_install_via_pypi) 29 0 R (_installation) 21 0 R (_installation_packages) 31 0 R (_license) 13 0 R (_offering_suggestions) 75 0 R (_prepare_and_activate_venv) 26 0 R] >> endobj 95 0 obj << /Limits [(_proxy_support) (usage)] /Names [(_proxy_support) 59 0 R (_reporting_possible_problems) 74 0 R (_semantics) 57 0 R (_support) 68 0 R (_update_strategy) 19 0 R (_user_defined_providers) 54 0 R (dbsetup) 61 0 R (dbstructure) 93 0 R (internalconf) 81 0 R (sampleeff) 86 0 R (usage) 64 0 R] >> endobj 96 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://en.wikipedia.org/wiki/Somebody_else%27s_problem) >> /Subtype /Link /Rect [143.034 676.04 161.619 690.32] /Type /Annot >> endobj 97 0 obj [92 0 R /XYZ 0 663.29 null] endobj 98 0 obj << /Border [0 0 0] /Dest (_license) /Subtype /Link /Rect [48.24 606.32143 97.254 620.60143] /Type /Annot >> endobj 99 0 obj << /Border [0 0 0] /Dest (_license) /Subtype /Link /Rect [541.1705 606.32143 547.04 620.60143] /Type /Annot >> endobj 100 0 obj << /Border [0 0 0] /Dest (_update_strategy) /Subtype /Link /Rect [48.24 587.84143 137.73129 602.12143] /Type /Annot >> endobj 101 0 obj << /Border [0 0 0] /Dest (_update_strategy) /Subtype /Link /Rect [541.1705 587.84143 547.04 602.12143] /Type /Annot >> endobj 102 0 obj << /Border [0 0 0] /Dest (_installation) /Subtype /Link /Rect [48.24 569.36143 116.7 583.64143] /Type /Annot >> endobj 103 0 obj << /Border [0 0 0] /Dest (_installation) /Subtype /Link /Rect [541.1705 569.36143 547.04 583.64143] /Type /Annot >> endobj 104 0 obj << /Border [0 0 0] /Dest (_create_home_directory) /Subtype /Link /Rect [60.24 550.88143 191.9835 565.16143] /Type /Annot >> endobj 105 0 obj << /Border [0 0 0] /Dest (_create_home_directory) /Subtype /Link /Rect [541.1705 550.88143 547.04 565.16143] /Type /Annot >> endobj 106 0 obj << /Border [0 0 0] /Dest (_prepare_and_activate_venv) /Subtype /Link /Rect [60.24 532.40143 210.978 546.68143] /Type /Annot >> endobj 107 0 obj << /Border [0 0 0] /Dest (_prepare_and_activate_venv) /Subtype /Link /Rect [541.1705 532.40143 547.04 546.68143] /Type /Annot >> endobj 108 0 obj << /Border [0 0 0] /Dest (_install_via_pypi) /Subtype /Link /Rect [60.24 513.92143 132.186 528.20143] /Type /Annot >> endobj 109 0 obj << /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://pypi.org/project/fangfrisch/) >> /Subtype /Link /Rect [132.186 513.92143 154.6455 528.20143] /Type /Annot >> endobj 110 0 obj << /Border [0 0 0] /Dest (_install_via_pypi) /Subtype /Link /Rect [132.186 513.92143 154.6455 528.20143] /Type /Annot >> endobj 111 0 obj << /Border [0 0 0] /Dest (_install_via_pypi) /Subtype /Link /Rect [541.1705 513.92143 547.04 528.20143] /Type /Annot >> endobj 112 0 obj << /Border [0 0 0] /Dest (_installation_packages) /Subtype /Link /Rect [48.24 495.44143 164.958 509.72143] /Type /Annot >> endobj 113 0 obj << /Border [0 0 0] /Dest (_installation_packages) /Subtype /Link /Rect [541.1705 495.44143 547.04 509.72143] /Type /Annot >> endobj 114 0 obj << /Border [0 0 0] /Dest (_configuration) /Subtype /Link /Rect [48.24 476.96143 128.76429 491.24143] /Type /Annot >> endobj 115 0 obj << /Border [0 0 0] /Dest (_configuration) /Subtype /Link /Rect [541.1705 476.96143 547.04 491.24143] /Type /Annot >> endobj 116 0 obj << /Border [0 0 0] /Dest (_default_providers) /Subtype /Link /Rect [60.24 458.48143 167.907 472.76143] /Type /Annot >> endobj 117 0 obj << /Border [0 0 0] /Dest (_default_providers) /Subtype /Link /Rect [541.1705 458.48143 547.04 472.76143] /Type /Annot >> endobj 118 0 obj << /Border [0 0 0] /Dest (_user_defined_providers) /Subtype /Link /Rect [60.24 440.00143 195.4485 454.28143] /Type /Annot >> endobj 119 0 obj << /Border [0 0 0] /Dest (_user_defined_providers) /Subtype /Link /Rect [541.1705 440.00143 547.04 454.28143] /Type /Annot >> endobj 120 0 obj << /Border [0 0 0] /Dest (_semantics) /Subtype /Link /Rect [60.24 421.52143 130.8 435.80143] /Type /Annot >> endobj 121 0 obj << /Border [0 0 0] /Dest (_semantics) /Subtype /Link /Rect [541.1705 421.52143 547.04 435.80143] /Type /Annot >> endobj 122 0 obj << /Border [0 0 0] /Dest (_proxy_support) /Subtype /Link /Rect [60.24 403.04143 150.9705 417.32143] /Type /Annot >> endobj 123 0 obj << /Border [0 0 0] /Dest (_proxy_support) /Subtype /Link /Rect [541.1705 403.04143 547.04 417.32143] /Type /Annot >> endobj 124 0 obj << /Border [0 0 0] /Dest (dbsetup) /Subtype /Link /Rect [48.24 384.56143 175.4475 398.84143] /Type /Annot >> endobj 125 0 obj << /Border [0 0 0] /Dest (dbsetup) /Subtype /Link /Rect [541.1705 384.56143 547.04 398.84143] /Type /Annot >> endobj 126 0 obj << /Border [0 0 0] /Dest (usage) /Subtype /Link /Rect [48.24 366.08143 88.875 380.36143] /Type /Annot >> endobj 127 0 obj << /Border [0 0 0] /Dest (usage) /Subtype /Link /Rect [541.1705 366.08143 547.04 380.36143] /Type /Annot >> endobj 128 0 obj << /Border [0 0 0] /Dest (_support) /Subtype /Link /Rect [48.24 347.60143 99.3855 361.88143] /Type /Annot >> endobj 129 0 obj << /Border [0 0 0] /Dest (_support) /Subtype /Link /Rect [541.1705 347.60143 547.04 361.88143] /Type /Annot >> endobj 130 0 obj << /Border [0 0 0] /Dest (_reporting_possible_problems) /Subtype /Link /Rect [60.24 329.12143 222.8115 343.40143] /Type /Annot >> endobj 131 0 obj << /Border [0 0 0] /Dest (_reporting_possible_problems) /Subtype /Link /Rect [541.1705 329.12143 547.04 343.40143] /Type /Annot >> endobj 132 0 obj << /Border [0 0 0] /Dest (_offering_suggestions) /Subtype /Link /Rect [60.24 310.64143 182.1975 324.92143] /Type /Annot >> endobj 133 0 obj << /Border [0 0 0] /Dest (_offering_suggestions) /Subtype /Link /Rect [541.1705 310.64143 547.04 324.92143] /Type /Annot >> endobj 134 0 obj << /Border [0 0 0] /Dest (_discussion_precedes_contribution) /Subtype /Link /Rect [60.24 292.16143 246.111 306.44143] /Type /Annot >> endobj 135 0 obj << /Border [0 0 0] /Dest (_discussion_precedes_contribution) /Subtype /Link /Rect [541.1705 292.16143 547.04 306.44143] /Type /Annot >> endobj 136 0 obj << /Border [0 0 0] /Dest (internalconf) /Subtype /Link /Rect [48.24 273.68143 219.99879 287.96143] /Type /Annot >> endobj 137 0 obj << /Border [0 0 0] /Dest (internalconf) /Subtype /Link /Rect [541.1705 273.68143 547.04 287.96143] /Type /Annot >> endobj 138 0 obj << /Border [0 0 0] /Dest (sampleeff) /Subtype /Link /Rect [48.24 255.20143 226.63479 269.48143] /Type /Annot >> endobj 139 0 obj << /Border [0 0 0] /Dest (sampleeff) /Subtype /Link /Rect [535.301 255.20143 547.04 269.48143] /Type /Annot >> endobj 140 0 obj << /Border [0 0 0] /Dest (dbstructure) /Subtype /Link /Rect [48.24 236.72143 206.2965 251.00143] /Type /Annot >> endobj 141 0 obj << /Border [0 0 0] /Dest (dbstructure) /Subtype /Link /Rect [535.301 236.72143 547.04 251.00143] /Type /Annot >> endobj 142 0 obj << /Border [0 0 0] /Dest (_accessing_mappings) /Subtype /Link /Rect [60.24 218.24143 180.81129 232.52143] /Type /Annot >> endobj 143 0 obj << /Border [0 0 0] /Dest (_accessing_mappings) /Subtype /Link /Rect [535.301 218.24143 547.04 232.52143] /Type /Annot >> endobj 144 0 obj << /Type /Outlines /Count 24 /First 145 0 R /Last 167 0 R >> endobj 145 0 obj << /Title /Parent 144 0 R /Count 0 /Next 146 0 R /Dest [7 0 R /XYZ 0 841.89 null] >> endobj 146 0 obj << /Title /Parent 144 0 R /Count 0 /Next 147 0 R /Prev 145 0 R /Dest [7 0 R /XYZ 0 841.89 null] >> endobj 147 0 obj << /Title /Parent 144 0 R /Count 0 /Next 148 0 R /Prev 146 0 R /Dest [7 0 R /XYZ 0 204.14143 null] >> endobj 148 0 obj << /Title /Parent 144 0 R /Count 0 /Next 149 0 R /Prev 147 0 R /Dest [17 0 R /XYZ 0 702.99 null] >> endobj 149 0 obj << /Title /Parent 144 0 R /Count 3 /First 150 0 R /Last 152 0 R /Next 153 0 R /Prev 148 0 R /Dest [17 0 R /XYZ 0 432.11 null] >> endobj 150 0 obj << /Title /Parent 149 0 R /Count 0 /Next 151 0 R /Dest [17 0 R /XYZ 0 267.91 null] >> endobj 151 0 obj << /Title /Parent 149 0 R /Count 0 /Next 152 0 R /Prev 150 0 R /Dest [17 0 R /XYZ 0 136.57 null] >> endobj 152 0 obj << /Title /Parent 149 0 R /Count 0 /Prev 151 0 R /Dest [28 0 R /XYZ 0 768.15 null] >> endobj 153 0 obj << /Title /Parent 144 0 R /Count 0 /Next 154 0 R /Prev 149 0 R /Dest [28 0 R /XYZ 0 651.55 null] >> endobj 154 0 obj << /Title /Parent 144 0 R /Count 4 /First 155 0 R /Last 158 0 R /Next 159 0 R /Prev 153 0 R /Dest [28 0 R /XYZ 0 469.35 null] >> endobj 155 0 obj << /Title /Parent 154 0 R /Count 0 /Next 156 0 R /Dest [39 0 R /XYZ 0 189.15 null] >> endobj 156 0 obj << /Title /Parent 154 0 R /Count 0 /Next 157 0 R /Prev 155 0 R /Dest [52 0 R /XYZ 0 243.61 null] >> endobj 157 0 obj << /Title /Parent 154 0 R /Count 0 /Next 158 0 R /Prev 156 0 R /Dest [56 0 R /XYZ 0 635.49 null] >> endobj 158 0 obj << /Title /Parent 154 0 R /Count 0 /Prev 157 0 R /Dest [56 0 R /XYZ 0 358.05 null] >> endobj 159 0 obj << /Title /Parent 144 0 R /Count 0 /Next 160 0 R /Prev 154 0 R /Dest [56 0 R /XYZ 0 258.63 null] >> endobj 160 0 obj << /Title /Parent 144 0 R /Count 0 /Next 161 0 R /Prev 159 0 R /Dest [63 0 R /XYZ 0 841.89 null] >> endobj 161 0 obj << /Title /Parent 144 0 R /Count 3 /First 162 0 R /Last 164 0 R /Next 165 0 R /Prev 160 0 R /Dest [63 0 R /XYZ 0 131.23 null] >> endobj 162 0 obj << /Title /Parent 161 0 R /Count 0 /Next 163 0 R /Dest [72 0 R /XYZ 0 762.33 null] >> endobj 163 0 obj << /Title /Parent 161 0 R /Count 0 /Next 164 0 R /Prev 162 0 R /Dest [72 0 R /XYZ 0 460.89 null] >> endobj 164 0 obj << /Title /Parent 161 0 R /Count 0 /Prev 163 0 R /Dest [72 0 R /XYZ 0 262.35 null] >> endobj 165 0 obj << /Title /Parent 144 0 R /Count 0 /Next 166 0 R /Prev 161 0 R /Dest [79 0 R /XYZ 0 778.11 null] >> endobj 166 0 obj << /Title /Parent 144 0 R /Count 0 /Next 167 0 R /Prev 165 0 R /Dest [85 0 R /XYZ 0 841.89 null] >> endobj 167 0 obj << /Title /Parent 144 0 R /Count 1 /First 168 0 R /Last 168 0 R /Prev 166 0 R /Dest [92 0 R /XYZ 0 768.15 null] >> endobj 168 0 obj << /Title /Parent 167 0 R /Count 0 /Dest [92 0 R /XYZ 0 663.29 null] >> endobj 169 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) >>] >> endobj 170 0 obj [7 0 R /XYZ 0 841.89 null] endobj 171 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 172 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 173 0 obj << /Length1 14044 /Length 8958 /Filter [/FlateDecode] >> stream xz T[׵9^ I@t@H &  6H 6 ‰8v1m:O$틅:k_'M7OMtI^m+aqν>>\ aPڍHm0[yTw bFRСpeC?y!2p75A7"$O/>b޹P~8P7|t|{?hwqvc`䧿@ȐPmb|*3'&!A~'웒+ⅈ^:U|}yE$@+D^OxhnB@'$D3BQA[Z {2:F]d5%BC@b=CmGPء(C酲J%1H";σxځ:Vˑ]󛡬A[y =aT t "p1"*A^xQ /YtDC\A O} ~OhA&'*JzGr)O9pj+5kYa(e^ITHetȺ#(ih./&s!*_.ҼvMƆ:騪(/جfPjrJ.I''%Ƌ>" LkaJ44:o U&L{92z9(WP:[XLW Cf.׷y>bz)-WIJ=hwc/mq{]o6^TD4+0p310yY aä[/hř/lb&=Y#K[XR3+lrؑi [%w%?3 Vlbbtl}Sz l6(T=e( =H D CzOgJ{ ag"1epٵsYm@MH͋V:br\VaEsb3=#d:fXL!S4n;!wj?tb a:< NvN=X 7u 2Y'~cbH'0Qͅ6wiW8,bY$[ ˩*B^]'BVCpKq8"KD'^8'c/R0bgx8Ø%0U'EL&԰xwD|/2l(gFfn=ZKPr= iI9ctcppp7A 9(@cT.t,^] dyy\moř`4)p8ڒPNg<\}7oƧ7^pCXfu<?f{8˹ɮsW*%t}a G_ ]]")_^8z 3ʳ||ˏ'O^>Iơ'. ''>9ptO`n98vؓ|h=_;{$f$^{gZPA]`4:[Ij;? _YRx0 fL"?!uu{{w7ЅQ9ѹeQt,Ү%$wAՅJdɄ#r'8څΡO[y>:١7],V-h5ٶ>8ob|gϡC&)\Qv Ξ0ShjBQ$*i()MDФl]ςp Ez(}St$EpiE˳Vj5DGZ`}KIu 狮 ;؀"k5a[$.YهiRC|BH^B=xH__LO+|I)gQϗWDP` .O7b}#J爗.~ǻ6wc'O.rS|_'RKgRYT; S^o75~^y@$\\ ,n"U%}_?ӄԄ ~H'MmRƗ@fx*ɾHSJD6ν0Llǻxc0!7ud )EiVBH+m۳)~gɒ*RCH%I6{2 UҨP+L!ɡJbw !RTEXSHt`K$(ןf&JeNSz,G'ϧḺ(\敪rUf1]N a0IUE6Kk5_ʎu7UGOjRltO]VWpgϭO<;1u .z{툴>2=s2ڒRs_TG8\ic =N&%Khj6mo۶v׾~'Y&ힱO>;<9Y[uf_z̺|Iu*5)ۥo϶~϶>Vw-/ϳnI!|$10 i*NJ TXVD ܩ0T3LA1#ߎ PTPdL|;w˔`P,3I~yxΞH vUYR4U3 [hbOe;=:,&i1/AJgDIOŖZ]/oƩ3~COڽnI~|@C9N͖c|+ >=;c|wSM/Y6-@ 6+20Zoa̤"կKmuY]/t26rcYUvS"f*L-=%OǾ@CǷ0b{imʲLc,&vǢ>li#*5?3i*)jv~ye;V~yX0rZX%F|dy.d=% @ΝW`ŇFXa@~rSYhmuZ2dEYޒtZ)+GVF/jd-E88M#C|9`!oUAL4K?(3U0T}k{[ qD\.ƥ+ 7 IN,UpsޮJ rƔ7֖\YdT!#*%!c!*%T4?XzWTV?eh\u8kvy+e}6^jh,N:6㲊 ȷ-Ynȩmnoݙepu#|%98j\-lKWޢMӽLqq#ž8mBejom-?})S'e7eϞŒ4uEjh?u-Lm-,bTUDRybSX4| |{[np"g߹2=5rfLO6q=c ιY? 0.Q辶l`6hbv b)eN-fYZy7UxD$pD?d}AaFa⬸>_Sk@1ٹ;-)K}#8"Mʓ횗DegLʁ+#>v`tFE"`, Zʙ46=Fv.+2 dQ,ʚۓcBޱ oVw?c^, 7ܳɻ]ihwol?^+9,}u˖o'?<ώ'?߬r~lF:hȒXG]ul]jNt'x;}g\}Ek6*ܭk# 3RLR@oݢ,0bF6mv#E9egqgg k{50꙯$M k|ݶG~Z0)_ri65Qf{wg!M[#,h@d\7; VUVըWu߽zݚF>Xw.9I"kQcPW܎܂5}u йUL@Wiި_ظJ~hG׷pK@fM4~iۛˊDSIgJOtiTL<5'ڟL验Ov٩zƦޅEvm 7 ] %cˬ{î/֣kS5R2uĜy'+-ɷܟf"Wɋ YRxyqI}1OQrkBMIdڊsɢYb%kz|ޢ,]YęS-,ZyPpug\h\S|RUIܧ*o3W55{VBr(2/-cg7[-Ujy%pe+a+Vp/ ,l<1SWJ6,-#;K *! c!c#UjH핁8Ti;唚(#"?-NTyૃVyP+{5r'n\cOH7NJ_Z *9m뇟͟f*dK:t(]PmϿm4r\/nKB0Gg*S4yZok[JJ6(T&M(LXaP* %¶JKAnT# YUcʨ=;C_k/rⶮd Gol]YA* *cmy=PdʼOUf<^>~ޚys8KRKgޗe[0֖WoiL/v4%=;]xJU?Ym˃&&ly6Ut' F6I,fҩjZ:j)yt|`[WV9zJk4pw vTUʢy_FO9 W~T[2}zvE Jw:s})bO~wAW^ڊk 3| |w&6* hkX>yVX*zLgR[M-{bDMʖ@uBWJx (}'d+ƒشf+H]ZFMڪɹz4=ϖWE9)X.JD|}To(VsO,`}Ի >vI;J!`KҸ@ B/U)sR#D>u5[IЈxQ)/WE¹K8k sJꇊӝE"x=K!9;HnOB #N7q؈o}$2%.M1ToaEG멚"%&"}IA<$` "YƤ/]AѤٖH$rya0XNs(T3`bN6*,A<8,Ax RN"$@HlTQS/㑕zJiM{+fڌȑuhp'Suub$QH II>J'$Ʈo kЧUFVS>9,zb#"EVfl$1rˣ@c?kϱRL|+q EsDomZ!OؑA:0DuU% cџ5q?J1A- BL"5dYQ)P|$E`B88EȈދHu187aw NBQSl#p'1@B2+E` 1ɽ1X4O`8q(J"KxTE-ʐ*D$OPLɑ]d.,LJFt؀٦)=0CtG`rdf|Կv|l<}胾!@&Y]h4~ GhAz|pXs;#c!;-b8Phd뮻C`Ɓi(2iIs0֝# MG;A1>7`0:21I:4;-((A}[-F#Sɑi 1Z]A7vƎz]cgCKW'Aӵ-ͮƖf=tSc8t=>I'FGXUu_,+=8D``dpd M`;ߘ B\}h|[`r5Iz8YC&G&BSƩQ䐩n EhmGh aB4dSfLqa!‡FzMq<k@ CPhC_?Z 1};HD>7!܉}npSeGaNFmINnPOam8:r鿘+U'|'0#rzG~E߁PPh ]TgfYǁКbsos4꽓 :>يlܲ(<>y;i s5lF[y2rZ=CT|Q>Uٽ` 9Y;89ԉ@.xjX/poz#rs}[CÚlѶ:n5x6A KTQLrA3'Lq2NrW+&/g[,%kK5'aEb®nZ]70)ZCUW)njld8p9w- ;]V.WKPY[:@HQ.rZCyp+k>6TgƩiDk-OttxP/* endstream endobj 174 0 obj << /Type /FontDescriptor /FontName /0404b5+NotoSerif-Bold /FontFile2 173 0 R /FontBBox [-212 -250 1306 1058] /Flags 6 /StemV 0 /ItalicAngle 0 /Ascent 1068 /Descent -292 /CapHeight 1462 /XHeight 1098 >> endobj 175 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 176 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 600 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 177 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 178 0 obj << /Type /FontDescriptor /FontName /ff2762+NotoSerif /FontFile2 177 0 R /FontBBox [-212 -250 1246 1047] /Flags 6 /StemV 0 /ItalicAngle 0 /Ascent 1068 /Descent -292 /CapHeight 1462 /XHeight 1098 >> endobj 179 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 180 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 181 0 obj << /Length1 8860 /Length 6081 /Filter [/FlateDecode] >> stream x: T[ו= I,b6>XB`,Xĉ4Bl'n\iuu4ɤNxҌu3N'$ɤn̜r}w F; mhm3y&!< cމ+O!$MA kCHG N Ŝ{!y:B?䝚J(FHRB BZf)Y8 e6A|wOQX 9:>=>ނc-xY=w7 )'ƧUd"|Ĥ"y:QYq,sf}1@a]jRP [Y$Ŀ(-q ;nԅJa$Gap4Co|c 'a῿U ]Q܄+S!{9ZSVbti,JgfFk 9y\>2"SYE%eJ{UuMm]}Cչi⅐!4'Ը3"S)=\ aMnRN18\SFPӣ Utcuy~d%3Յ²=MAg' 3, ) /=p;'9BU2ĩPy^:aB !g &t3%"wɱ:i`ĉ20y!evaZFEnffZ/;̰u,%Hn*t8Metd v7c`,q%B353,30z)B_9Xj8[M`X K%1(CS*h gP۱\,@“{a{֞ /A.i[UӘ 1 !#$#GHj5BhZLvtx:CloA6UHG~͢wut G5c7~ !Il"%JB+m]ݒGyG>)'%%a)aMa {5z*BE£إ8LUڕ1+OT *ʩ NG)\3|4#_J Ayc 9RISgԬܠx僄$cfS[gL\{D,{*faR #kC{Yj*js`}/oO^ly?rWNZedb&t6JY]LrtVk?"GWdM4!*ˢh?C5Z`y,X8{`>mLc7u t7e.f*Ygf ]hh u_ ae2Siʹ&fV|6w<Н)=hyI˃uszDb5)ծے (n1GpVTU!Ex.Q3쬰7. ,Ưgp3z`lslS6ր(5z(6T+qEUaOWO\y.=j = u+JդFϻno`/q:sMS1ⵊgpv}o@|[q(J8B1&P׆8W9}6FO)'n.YS٭նX5k9i?+K~Z!!{UpMC|8x"5k լ,{ٟގOģ,%S('U]<<(w^aEJkc cx얈X%B)'!42Z_"umݽl+[`6u3Ɖ{7[/5ιcM=TxYGdl{w//u[˶ڊѱⵑ%Es$跺-K$ݩ]b^-NQ%iʊ2X&2KNx%mrqc~~Q㦇Pxpw~\ON6N{^9-$E2lٲh^9.> F)?v@h <@c,j#@9VFz8u̪ )+SSYg)++{\9̪Ԭ66,|9!`eD(,Y{,U}wCvFX?n7'%Rg40D[ZljԧuǾcv6Tfge#PaF%״ 2w4(1+CsD}7jAh0Z"1W\Dkq|;EDuH~0Ut?jHJr+Bb4Z]c^nS[UUȂ>H$sg'iՖP 7u?CHZNOX@R3n\o}ZAjcub Ad|ϓ6vDŶJGYi*97I-$"w$WK0$t`(|oxYvݻc>( HVNjOcUYnszUӘ{ߑH|ҫiNlf."],U%>_^$bX޷._^߷5?)B]XE.j4I" nqϺkzƲ޵֦Zrl'Jl>e=M}NBn*v\|zy{:e9D-G+9:= LΈ.hp>w?6m2fnDn'Ӄq7Q8?*:LYN[mp~_{| € A8˖6843F< _O{q>x33%\0{t9;wZHx3ܾM.MaF#I}rd,U'-E# i!ygZO~/cď+,q1H)Q*ʻ?ҋZ\:n]SYA^6u]啫uUʒ|K#B.1#x1FC:W^uoaFz^i9?`*zSs;:1ޅ>$ < #mMsKudtܹI644m~ZzX Af^56miԩ.R{>E-+W[Md5_=|rPh2#~aW{]NSE~$%yɢ}>:jW.7. \flooǩw>Xt8x5^0ȴ.S.GװsۮNB脙aj^x]w9Bh#HT}'xQ{\H\*_7Jz8%lҟհ,P@^f]SЂ/0}*6+;Ӡ^QW\]L\V aUET5Wh:$f:g8 eKT|BV}?mlźXrLf}| G}GWxCS%k+H֕DŽ>K|w=wJoVZ2iOou<صl8xЃ-w;ヒX.󩐊 *3aDk>21.^&|k̬?%b7 16:ATHvAuexfaOrt6csCMvٜ]lp)V[Zg%%:~Y%!UF`K䊯n#nA|Fŋ.ˌM&rpcBKoJ??#a8>K`7Of4N+KH6&͗wѬ4E <,H@[UiiQ~Q*e i.GQ$QJHT@ʥ24EQx5jҜ|*)'N V3F.ifj[[mXSuXN֎C~Ƙ1Ōx) ;ɩYLށ|%{lbtz s&EbDq^3rǧ|܍)0=3SI. }̄rldJ&gf$30ހL'G~f$h`6I=>d}## 20~Oؘr`;:Krw}C(APUGCuM5V4f]ͬt*[ܝZ$QGh+2=QpF &"5lx֢VԂܨ NU#|t )4E^Y @'a/ *^,b;FdB9Ka:$^|pAB''iAS=OrFp00zN l$&v `a{oc]EjCp苰A8e tN(O ؠ Bmf0 c\0ch%(_ 18d倀6ܨ5~#V+հWtu0S<)NKk/soq03t>q>{v冸Npvn/{_q|(vq{k0ѵz: p7=a=[{{Y`s > | sM 4:asZ=S '\7P 2GakEIV% @>UCN!$D[5JA+CӣLh \o !FC AdEnŨ"բ:%P\`B7Sunԃ֣^ԇ6`p\%'VyDm( endstream endobj 182 0 obj << /Type /FontDescriptor /FontName /c141e6+mplus1mn-regular /FontFile2 181 0 R /FontBBox [0 -270 1000 1025] /Flags 4 /StemV 0 /ItalicAngle 0 /Ascent 860 /Descent -140 /CapHeight 860 /XHeight 0 >> endobj 183 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 184 0 obj [500 500 364 500 500 364 500 500 500 500 500 364 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 364 364 500 364 500 364 500 500 500 500 500 500 500 500 500 364 500 500 500 500 500 500 364 500 500 500 500 500 500 500 500 364 500 364 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 185 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 186 0 obj << /Type /FontDescriptor /FontName /e8f2e8+NotoSerif-Italic /FontFile2 185 0 R /FontBBox [-254 -250 1238 1047] /Flags 70 /StemV 0 /ItalicAngle -12 /Ascent 1068 /Descent -292 /CapHeight 1462 /XHeight 1098 >> endobj 187 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 188 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 189 0000000000 65535 f 0000000015 00000 n 0000000376 00000 n 0000000580 00000 n 0000000722 00000 n 0000000773 00000 n 0000001045 00000 n 0000022064 00000 n 0000022800 00000 n 0000022972 00000 n 0000023139 00000 n 0000023311 00000 n 0000023488 00000 n 0000023665 00000 n 0000023711 00000 n 0000023760 00000 n 0000023804 00000 n 0000035084 00000 n 0000035476 00000 n 0000035648 00000 n 0000035692 00000 n 0000035873 00000 n 0000035917 00000 n 0000036122 00000 n 0000036166 00000 n 0000036341 00000 n 0000036464 00000 n 0000036508 00000 n 0000050416 00000 n 0000050822 00000 n 0000050866 00000 n 0000051045 00000 n 0000051089 00000 n 0000051288 00000 n 0000051478 00000 n 0000051664 00000 n 0000051867 00000 n 0000051911 00000 n 0000052033 00000 n 0000075222 00000 n 0000075656 00000 n 0000075873 00000 n 0000076036 00000 n 0000076247 00000 n 0000076429 00000 n 0000076556 00000 n 0000076754 00000 n 0000076881 00000 n 0000076925 00000 n 0000077096 00000 n 0000077260 00000 n 0000077518 00000 n 0000085646 00000 n 0000086017 00000 n 0000086183 00000 n 0000086227 00000 n 0000100719 00000 n 0000101103 00000 n 0000101147 00000 n 0000101322 00000 n 0000101366 00000 n 0000101577 00000 n 0000101621 00000 n 0000113740 00000 n 0000114152 00000 n 0000114196 00000 n 0000114327 00000 n 0000114448 00000 n 0000114571 00000 n 0000114615 00000 n 0000114796 00000 n 0000114982 00000 n 0000125952 00000 n 0000126330 00000 n 0000126505 00000 n 0000126549 00000 n 0000126593 00000 n 0000126637 00000 n 0000126840 00000 n 0000136397 00000 n 0000136768 00000 n 0000136969 00000 n 0000137013 00000 n 0000146675 00000 n 0000147005 00000 n 0000156626 00000 n 0000157004 00000 n 0000157048 00000 n 0000157175 00000 n 0000157303 00000 n 0000167430 00000 n 0000167760 00000 n 0000176716 00000 n 0000177100 00000 n 0000177144 00000 n 0000177575 00000 n 0000177894 00000 n 0000178092 00000 n 0000178136 00000 n 0000178260 00000 n 0000178387 00000 n 0000178523 00000 n 0000178659 00000 n 0000178788 00000 n 0000178921 00000 n 0000179062 00000 n 0000179204 00000 n 0000179348 00000 n 0000179494 00000 n 0000179629 00000 n 0000179816 00000 n 0000179954 00000 n 0000180091 00000 n 0000180231 00000 n 0000180373 00000 n 0000180507 00000 n 0000180641 00000 n 0000180777 00000 n 0000180915 00000 n 0000181057 00000 n 0000181200 00000 n 0000181326 00000 n 0000181456 00000 n 0000181589 00000 n 0000181723 00000 n 0000181849 00000 n 0000181976 00000 n 0000182098 00000 n 0000182223 00000 n 0000182349 00000 n 0000182477 00000 n 0000182624 00000 n 0000182772 00000 n 0000182912 00000 n 0000183053 00000 n 0000183204 00000 n 0000183357 00000 n 0000183489 00000 n 0000183621 00000 n 0000183750 00000 n 0000183878 00000 n 0000184008 00000 n 0000184138 00000 n 0000184277 00000 n 0000184415 00000 n 0000184493 00000 n 0000184642 00000 n 0000184833 00000 n 0000184999 00000 n 0000185195 00000 n 0000185408 00000 n 0000185622 00000 n 0000185866 00000 n 0000186060 00000 n 0000186280 00000 n 0000186497 00000 n 0000186695 00000 n 0000186927 00000 n 0000187107 00000 n 0000187289 00000 n 0000187513 00000 n 0000187669 00000 n 0000187862 00000 n 0000188100 00000 n 0000188324 00000 n 0000188582 00000 n 0000188838 00000 n 0000189102 00000 n 0000189361 00000 n 0000189549 00000 n 0000189782 00000 n 0000189826 00000 n 0000190100 00000 n 0000190374 00000 n 0000199424 00000 n 0000199643 00000 n 0000200998 00000 n 0000201913 00000 n 0000212626 00000 n 0000212840 00000 n 0000214195 00000 n 0000215111 00000 n 0000221283 00000 n 0000221496 00000 n 0000222851 00000 n 0000223766 00000 n 0000228674 00000 n 0000228898 00000 n 0000230253 00000 n trailer << /Size 189 /Root 2 0 R /Info 1 0 R >> startxref 231168 %%EOF fangfrisch-1.8.1/docs/index.html000066400000000000000000001747771456540125300166140ustar00rootroot00000000000000 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.

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.

  • on_update_timeout: Timeout for the on_update_exec command, in seconds. Default: 30.

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 (in alphabetical order):

The internal default values for providers can be used by specifiying enabled = yes in the desired sections. Some providers require additional configuration as shown in the following example.

# 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

[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}

optional arguments:
  -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 C 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 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. All sections are disabled, and entries with the !url_ prefix are included for reference only. These represent data sources which either have a high risk of false positives or are not free to use. 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

[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_spam_marketing = ${prefix}spam_marketing.ndb
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

[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

[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_spam_marketing = ${prefix}spam_marketing.ndb
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
enabled = yes

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

Appendix C: 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. Related complaints will be filed under SEP.

C.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.8.1/docs/internal.conf000066400000000000000000000064251456540125300172620ustar00rootroot00000000000000[DEFAULT] cleanup = automatic enabled = false integrity_check = sha256 log_level = WARNING log_method = console max_size = 10MB [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_spam_marketing = ${prefix}spam_marketing.ndb 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 [urlhaus] interval = 10m url_urlhaus = https://urlhaus.abuse.ch/downloads/urlhaus.ndb fangfrisch-1.8.1/docs/usage.txt000066400000000000000000000007611456540125300164410ustar00rootroot00000000000000usage: fangfrisch [-h] [-c CONF] [-f] [-p PROVIDER] {dumpconf,dumpmappings,initdb,refresh} Update and verify unofficial ClamAV signatures. positional arguments: {dumpconf,dumpmappings,initdb,refresh} optional arguments: -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.8.1/fangfrisch/000077500000000000000000000000001456540125300157525ustar00rootroot00000000000000fangfrisch-1.8.1/fangfrisch/__init__.py000066400000000000000000000021611456540125300200630ustar00rootroot00000000000000""" 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.8.1' class ClamavItem: def __init__(self, section, option, url, check, path, interval, max_size, on_update, connection_timeout) -> 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.url = url fangfrisch-1.8.1/fangfrisch/__main__.py000066400000000000000000000053721456540125300200530ustar00rootroot00000000000000""" 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.8.1/fangfrisch/config/000077500000000000000000000000001456540125300172175ustar00rootroot00000000000000fangfrisch-1.8.1/fangfrisch/config/__init__.py000066400000000000000000000020141456540125300213250ustar00rootroot00000000000000""" 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' PREFIX = 'prefix' fangfrisch-1.8.1/fangfrisch/config/config.py000066400000000000000000000120421456540125300210350ustar00rootroot00000000000000""" 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.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 [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, fallback='') -> str: return self.parser.get(configparser.DEFAULTSECT, 'on_update_exec', fallback=fallback) def on_update_timeout(self, fallback=30) -> int: return self.parser.getint(configparser.DEFAULTSECT, '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.8.1/fangfrisch/config/malwarepatrol.py000066400000000000000000000023021456540125300224400ustar00rootroot00000000000000""" 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.8.1/fangfrisch/config/sanesecurity.py000066400000000000000000000073551456540125300223210ustar00rootroot00000000000000""" 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.8.1/fangfrisch/config/securiteinfo.py000066400000000000000000000032711456540125300222730ustar00rootroot00000000000000""" 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_spam_marketing': f'${{{PREFIX}}}spam_marketing.ndb', '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', } } fangfrisch-1.8.1/fangfrisch/config/urlhaus.py000066400000000000000000000015401456540125300212540ustar00rootroot00000000000000""" 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.8.1/fangfrisch/db.py000066400000000000000000000177711456540125300167260ustar00rootroot00000000000000""" 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.8.1/fangfrisch/download.py000066400000000000000000000063241456540125300201400ustar00rootroot00000000000000""" 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.8.1/fangfrisch/dump.py000066400000000000000000000020011456540125300172620ustar00rootroot00000000000000""" 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.8.1/fangfrisch/log.py000066400000000000000000000055561456540125300171200ustar00rootroot00000000000000""" 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.8.1/fangfrisch/refresh.py000066400000000000000000000132101456540125300177570ustar00rootroot00000000000000""" 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 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.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( section=section, option=option, url=url, check=config.integrity_check(section), path=filename, interval=config.interval(section), max_size=max_size, on_update=config.get(section, f'on_update_{stem}'), connection_timeout=config.connection_timeout() )) 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: count = self.cleanup_providers() for ci in _clamav_items(): if self.refresh(ci): command = ci.on_update if command: run_command(command, config.on_update_timeout(), log_info, log_error, log_exception, path=ci.path) count += 1 command = config.on_update_exec() if count > 0 and command: run_command(command, config.on_update_timeout(), log_info, log_error, log_exception) return count fangfrisch-1.8.1/fangfrisch/util.py000066400000000000000000000073321456540125300173060ustar00rootroot00000000000000""" 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.8.1/pyproject.toml000066400000000000000000000001321456540125300165500ustar00rootroot00000000000000[build-system] requires = ["setuptools", "wheel"] build-backend = "setuptools.build_meta" fangfrisch-1.8.1/requirements.txt000066400000000000000000000001261456540125300171230ustar00rootroot00000000000000# Development build setuptools wheel # Runtime requests >= 2.22.0 SQLAlchemy >= 1.4.0 fangfrisch-1.8.1/setup.cfg000066400000000000000000000035371456540125300154710ustar00rootroot00000000000000# 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.8.1 [options] install_requires = requests>=2.22.0 SQLAlchemy>=1.4.0 # TODO: Use 'packages = find:' instead? packages = fangfrisch fangfrisch.config python_requires = >=3.7 #[options.packages.find] #exclude = tests* [options.entry_points] console_scripts = fangfrisch = fangfrisch.__main__:main fangfrisch-1.8.1/tests/000077500000000000000000000000001456540125300150025ustar00rootroot00000000000000fangfrisch-1.8.1/tests/.gitignore000066400000000000000000000000111456540125300167620ustar00rootroot00000000000000*.sqlite fangfrisch-1.8.1/tests/__init__.py000066400000000000000000000043721456540125300171210ustar00rootroot00000000000000""" 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) -> None: super().__init__(section, option, url, check, path, interval, max_size, on_update, connection_timeout) 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.8.1/tests/coverage.rc000066400000000000000000000002021456540125300171150ustar00rootroot00000000000000[report] exclude_lines = def __repr__ log[_\.](debug|error|except|fatal|info|warn) pragma: no cover raise NotImplementedError fangfrisch-1.8.1/tests/test_config.py000066400000000000000000000063701456540125300176660ustar00rootroot00000000000000""" 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_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.8.1/tests/test_db.py000066400000000000000000000076031456540125300170060ustar00rootroot00000000000000""" 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.8.1/tests/test_download.py000066400000000000000000000023571456540125300202310ustar00rootroot00000000000000""" 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.8.1/tests/test_dump.py000066400000000000000000000041471456540125300173660ustar00rootroot00000000000000""" 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.8.1/tests/test_log.py000066400000000000000000000042141456540125300171750ustar00rootroot00000000000000""" 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.8.1/tests/test_refresh.py000066400000000000000000000117341456540125300200570ustar00rootroot00000000000000""" 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)) self.assertEqual(3, cr.refresh_all()) @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 = self.ref.refresh_all() self.assertEqual(3, n) @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 = self.ref.refresh_all() 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.8.1/tests/test_util.py000066400000000000000000000060761456540125300174010ustar00rootroot00000000000000""" 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.8.1/tests/tests.conf000066400000000000000000000014031456540125300170110ustar00rootroot00000000000000[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 unittest 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 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.8.1/tests/tests.sql000066400000000000000000000005011456540125300166610ustar00rootroot00000000000000PRAGMA 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;