Repository: persepolisdm/persepolis Branch: master Commit: 109e95261fa2 Files: 124 Total size: 2.9 MB Directory structure: gitextract_m5nz38oz/ ├── .github/ │ ├── ISSUE_TEMPLATE │ └── contributing.md ├── .gitignore ├── .pep8 ├── .travis.yml ├── .tx/ │ └── config ├── LICENSE ├── README.md ├── check_dependencies.py ├── clear.py ├── man/ │ ├── meson.build │ └── persepolis.1 ├── meson.build ├── persepolis/ │ ├── .pep8 │ ├── Persepolis Download Manager.py │ ├── __init__.py │ ├── __main__.py │ ├── constants/ │ │ ├── Browser.py │ │ ├── Os.py │ │ ├── Version.py │ │ └── __init__.py │ ├── gui/ │ │ ├── .pep8 │ │ ├── __init__.py │ │ ├── about_ui.py │ │ ├── addlink_ui.py │ │ ├── after_download_ui.py │ │ ├── customized_widgets.py │ │ ├── log_window_ui.py │ │ ├── mainwindow_ui.py │ │ ├── progress_ui.py │ │ ├── resources.py │ │ ├── setting_ui.py │ │ ├── text_queue_ui.py │ │ └── video_finder_progress_ui.py │ ├── meson.build │ ├── persepolis.py │ └── scripts/ │ ├── .pep8 │ ├── __init__.py │ ├── about.py │ ├── addlink.py │ ├── after_download.py │ ├── browser_integration.py │ ├── browser_plugin_queue.py │ ├── bubble.py │ ├── check_proxy.py │ ├── compatibility.py │ ├── data_base.py │ ├── download_link.py │ ├── error_window.py │ ├── initialization.py │ ├── log_window.py │ ├── logger.py │ ├── mainwindow.py │ ├── newopen.py │ ├── osCommands.py │ ├── persepolis.py │ ├── persepolis_lib_prime.py │ ├── play.py │ ├── progress.py │ ├── properties.py │ ├── queue.py │ ├── queue_prime.py │ ├── setting.py │ ├── shutdown.py │ ├── spider.py │ ├── startup.py │ ├── text_queue.py │ ├── useful_tools.py │ ├── video_finder.py │ ├── video_finder_addlink.py │ ├── video_finder_progress.py │ └── ytdlp_downloader.py ├── requirements.md ├── requirements.txt ├── resources/ │ ├── PersepolisBI.py │ ├── dark_style.qss │ ├── light_style.qss │ ├── locales/ │ │ ├── ui.qm │ │ ├── ui.ts │ │ ├── ui_ar.qm │ │ ├── ui_ar.ts │ │ ├── ui_de.qm │ │ ├── ui_de.ts │ │ ├── ui_es_ES.qm │ │ ├── ui_es_ES.ts │ │ ├── ui_fa_IR.qm │ │ ├── ui_fa_IR.ts │ │ ├── ui_fr_FR.qm │ │ ├── ui_fr_FR.ts │ │ ├── ui_hu.qm │ │ ├── ui_hu.ts │ │ ├── ui_ko.qm │ │ ├── ui_ko.ts │ │ ├── ui_nl_NL.qm │ │ ├── ui_nl_NL.ts │ │ ├── ui_pl_PL.qm │ │ ├── ui_pl_PL.ts │ │ ├── ui_pt.qm │ │ ├── ui_pt.ts │ │ ├── ui_pt_BR.qm │ │ ├── ui_pt_BR.ts │ │ ├── ui_ru.qm │ │ ├── ui_ru.ts │ │ ├── ui_sv.qm │ │ ├── ui_sv.ts │ │ ├── ui_tr.qm │ │ ├── ui_tr.ts │ │ ├── ui_tr_TR.qm │ │ ├── ui_tr_TR.ts │ │ ├── ui_zh_CN.qm │ │ ├── ui_zh_CN.ts │ │ ├── ui_zh_TW.qm │ │ └── ui_zh_TW.ts │ ├── meson.build │ ├── resources.qrc │ ├── resources_generator.sh │ ├── translation_files.pro │ └── translators.txt ├── test/ │ ├── .pep8 │ └── test.py ├── uninstall.py └── xdg/ ├── com.github.persepolisdm.persepolis.appdata.xml ├── com.github.persepolisdm.persepolis.desktop.in └── meson.build ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/ISSUE_TEMPLATE ================================================ **System Details:** * Operating System: ? * Distro(For GNU/Linux and BSD users): ? * Desktop Environment(For GNU/Linux and BSD users): ? * Persepolis Version: ? * How do you install Persepolis? (Repositories, source, ...) * _Please attach log files if crash or paste error message_ **Issue Description and steps to reproduce:** #### Write in English language please, Thanks :) #### Feel free to edit or delete lines in this template if it is necessary. #### Please report only one Issue (Bug or feature request or ...) in one issue! and open new Issue for another one :) ================================================ FILE: .github/contributing.md ================================================ Please read our [contribution instruction](https://github.com/persepolisdm/persepolis/wiki/Home-en#contributers-guide). ================================================ FILE: .gitignore ================================================ __pycache__/ *.pyc .env *.orig root/ build/ builddir/ persepolis.egg-info/ man/persepolis.1.gz .idea/ .mypy_cache persepolis_wenv/ test/ffmpeg resources/ffmpeg dist/ *.spec venv_dir/ test/ffmpeg.exe Persepolis\ Download\ Manager.build/ Persepolis\ Download\ Manager.dist/ Persepolis\ Download\ Manager.onefile-build/ ================================================ FILE: .pep8 ================================================ [pycodestyle] max_line_length = 120 ignore = E501,E722,W503 ================================================ FILE: .travis.yml ================================================ language: python dist: bionic sudo: required python: - "3.6" virtualenv: system_site_packages: true addons: apt: update: true packages: python3 aria2 sound-theme-freedesktop libnotify-bin libqt5svg5 python3-pyqt5.qtsvg python3-setuptools python3-pip python3-pyqt5 pulseaudio python3-psutil ffmpeg before_install: - sudo pip3 install youtube-dl requests setproctitle install: true script: - sudo python3 setup.py install - persepolis --version after_success: - pip3 install transifex-client==0.12.5 - sudo echo $'[https://www.transifex.com]\napi_hostname = https://api.transifex.com\nhostname = https://www.transifex.com\nusername = '"$TRANSIFEX_USER"$'\npassword = '"$TRANSIFEX_PASSWORD"$'\n' > ~/.transifexrc - tx push -s ================================================ FILE: .tx/config ================================================ [main] host = https://www.transifex.com [persepolis-translations.ui] file_filter = resources/locales/ui_.ts minimum_perc = 0 source_file = resources/locales/ui.ts source_lang = en type = QT ================================================ FILE: LICENSE ================================================ 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. {one line to give the program's name and a brief idea of what it does.} Copyright (C) {year} {name of author} 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: {project} Copyright (C) {year} {fullname} 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 . ================================================ FILE: README.md ================================================

Persepolis Download Manager

[![Latest stable release](https://img.shields.io/github/release/persepolisdm/persepolis.svg?maxAge=3600)](https://github.com/persepolisdm/persepolis/releases) [![Total downloads](https://img.shields.io/github/downloads/persepolisdm/persepolis/total.svg)](https://github.com/persepolisdm/persepolis) [![GitHub license](https://img.shields.io/github/license/persepolisdm/persepolis.svg)](https://github.com/persepolisdm/persepolis/blob/master/LICENSE) [![Build Status](https://travis-ci.org/persepolisdm/persepolis.svg?branch=master)](https://travis-ci.org/persepolisdm/persepolis) [![GitHub last commit](https://img.shields.io/github/last-commit/persepolisdm/persepolis.svg)](https://github.com/persepolisdm/persepolis/commits/master) [![GitHub contributors](https://img.shields.io/github/contributors/persepolisdm/persepolis.svg)](https://github.com/persepolisdm/persepolis/graphs/contributors) [![GitHub commit activity the past week, 4 weeks, year](https://img.shields.io/github/commit-activity/y/persepolisdm/persepolis.svg)](https://github.com/persepolisdm/persepolis/commits/master) [![AUR](https://img.shields.io/aur/version/persepolis-git.svg)](https://aur.archlinux.org/packages/persepolis-git) [![Twitter Follow](https://img.shields.io/twitter/follow/persepolisdm.svg?style=social&label=Follow)](https://twitter.com/persepolisdm) > **Content** > - [About](https://github.com/persepolisdm/persepolis#about) > - [How to install PersepolisDM](https://github.com/persepolisdm/persepolis/wiki) > - [FAQ](https://github.com/persepolisdm/persepolis#faq) > - [Screenshots](https://github.com/persepolisdm/persepolis#screenshots) > - [Credits](https://github.com/persepolisdm/persepolis#credits) ### **About** Persepolis is a download manager written in Python. Persepolis is a sample of free and open-source software. It's developed for GNU/Linux distributions, BSDs, macOS, and Microsoft Windows. ### **Features** - Multi-segment downloading (64 connections) - Scheduling downloads - Download queuing - Downloading videos from Youtube and ... - and many more! Demonstration clip: [![Demonstration video](https://img.youtube.com/vi/QHdMShFgzhQ/0.jpg)](https://www.youtube.com/watch?v=QHdMShFgzhQ) ### How to install PersepolisDM? > Please checkout the Persepolis [wiki](https://github.com/persepolisdm/persepolis/wiki) ### **FAQ** > **Where does the name come from?** > > [From Wikipedia:](https://en.wikipedia.org/wiki/Persepolis) Persepolis (Greek: Περσέπολις Persépolis; "the Persian city") or Parsa (Old Persian: 𐎱𐎠𐎼𐎿 Pārsa; "Persia"), also known as Takht-e-Jamshid (Persian: تخت جمشيد‎‎ Taxt e Jamšid; "Throne of Jamshid"), was the ceremonial capital of the Achaemenid Empire (ca. 550–330 BC). Persepolis is situated 60 km northeast of the city of Shiraz in Fars Province, Iran. The earliest remains of Persepolis date back to 515 BC. It exemplifies the Achaemenid style of architecture. UNESCO declared the ruins of Persepolis a World Heritage Site in 1979. > **How can I install Persepolis?** > > Read [our wiki](https://github.com/persepolisdm/persepolis/wiki) or check the [Persepolis website](https://persepolisdm.github.io) for more information. ### **Screenshots** |GNU/Linux|BSD| |:---:|:---:| |![](https://persepolisdm.github.io/img/screen/persepolis.png)|![](https://persepolisdm.github.io/img/screen/ghostbsd.png)| |Mac OSX|Windows| |:---:|:---:| |![](https://persepolisdm.github.io/img/screen/mac_401.png)|![](https://persepolisdm.github.io/img/screen/windows.png)| ### Credits **Alireza Amirsamimi:** Persepolis lead developer and manager [GitHub](https://github.com/alireza-amirsamimi) | [E-mail](mailto:alireza.amirsamimi@gmail.com) **Mohammadreza Abdollahzadeh:** Arch Linux and BSD support [GitHub](https://github.com/morealaz) | [E-mail](mailto:morealaz@gmail.com) **Mostafa Asadi:** Ubuntu, Debian and Windows support [GitHub](https://github.com/mostafaasadi) | [E-mail](mailto:mostafaasadi73@gmail.com) **Sadegh Alirezaie:** Persepolis website support [GitHub](https://github.com/Alirezaies) | [E-mail](mailto:alirezaie@sadegh.org) **Jafar Akhondali:** Browsers add-ons support [GitHub](https://github.com/JafarAkhondali) | [E-mail](mailto:jafar.akhondali@yahoo.com) **Kia Hamedi:** Mac OSX support [GitHub](https://github.com/Kiahamedi) | [E-mail](mailto:me@kiahamedi.com) **H Rostami:** UI translation, Fedora & OpenSuse support [GitHub](https://github.com/hayyan71) | [E-mail](mailto:hayyan71@yahoo.com) **Ehsan Titish:** Mac OSX support [GitHub](https://github.com/Maders) | [E-mail](mailto:me@maders.ir) **MohammadAmin Vahedinia:** Mac OSX support [GitHub](https://github.com/Mr0Null) | [E-mail](mailto:persepolisdm@vahedinia.me) [Persepolis website (En)](https://persepolisdm.github.io/) | [Persepolis website (Fa)](https://persepolisdm.github.io/fa) | [Twitter](https://twitter.com/persepolisdm) | [Telegram Channel](https://telegram.me/persepolisdm) ### Acknowledgments: [YT-DLP project](https://github.com/yt-dlp/yt-dlp) [FFmpeg project](https://github.com/FFmpeg/FFmpeg) [PySide project](https://wiki.qt.io/Qt_for_Python) [Python Requests project](https://github.com/psf/requests) --- _Are there any mistakes in README.md? Report it in the [issue tracker](https://github.com/persepolisdm/persepolis/issues) or correct it by yourself._ ================================================ FILE: check_dependencies.py ================================================ #!/usr/bin/env python3 # coding: utf-8 # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import os import platform # finding os platform os_type = platform.system() # Checking dependencies! not_installed = '' # PyQt5 or PySide6 try: import PySide6 print('python3-pyside6 is found') pyside6_is_installed = True except ImportError: pyside6_is_installed = False if not(pyside6_is_installed): try: import PyQt5 print('python3-pyqt5 is found') except ImportError: print('Error : python3-pyqt5 or pyside6 must be installed!') not_installed = not_installed + '(PyQt5 or PySide6) ' # python3-requests try: import requests print('python3-requests is found!') except ImportError: print('Error : requests is not installed!') not_installed = not_installed + 'python3-requests, ' # python3-urllib3 try: import urllib3 print('python3-urllib3 is found!') except ImportError: print('Error : urllib3 is not installed!') not_installed = not_installed + 'python3-urllib3, ' # python3-setproctitle try: import setproctitle print('python3-setproctitle is found!') except ImportError: print("Warning: setproctitle is not installed!") not_installed = not_installed + 'python3-setproctitle, ' # python3-PySocks try: import socks print('python3-pysocks is found!') except ImportError: print("Warning: python3-pysocks is not installed!") not_installed = not_installed + 'python3-pysocks, ' # psutil try: import psutil print('python3-psutil is found!') except ImportError: print("Warning: python3-psutil is not installed!") not_installed = not_installed + 'psutil, ' # yt_dlp try: import yt_dlp print('yt-dlp is found') except ImportError: print('Warning: yt-dlp is not installed!') not_installed = not_installed + 'yt-dlp, ' # ffmpeg answer = os.system('ffmpeg -version 1>/dev/null') if answer != 0: print("Warning: ffmpeg not installed!") not_installed = not_installed + 'ffmpeg, ' else: print('ffmpeg is found!') if os_type == 'Linux': try: from dasbus.connection import SessionMessageBus print('python3-dasbus is found!') except ImportError: print('python3-dasbus is not installed!') not_installed = not_installed + 'python3-dasbus,' if not_installed != '': print('########################') print('####### WARNING ########') print('########################') print('Some dependencies are not installed .It causes some problems for persepolis! : \n') print(not_installed + '\n\n') print('Read this link for more information: \n') print('https://github.com/persepolisdm/persepolis/wiki/git-installation-instruction\n\n') ================================================ FILE: clear.py ================================================ #!/usr/bin/env python3 # coding: utf-8 # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import os import warnings import sys import platform import shutil from persepolis.constants import OS # finding os platform os_type = platform.system() if os_type == 'Linux' or os_type == 'FreeBSD' or os_type == 'OpenBSD': print(os_type + " detected!") else: print('This script is only work for GNU/Linux or BSD!') sys.exit(1) # finding current directory cwd = os.path.abspath(__file__) setup_dir = os.path.dirname(cwd) # clearing __pycache__ src_pycache = os.path.join(setup_dir, 'persepolis', '__pycache__') gui_pycache = os.path.join(setup_dir, 'persepolis', 'gui', '__pycache__') scripts_pycache = os.path.join(setup_dir, 'persepolis', 'scripts', '__pycache__') constants_pycache = os.path.join(setup_dir, 'persepolis', 'constants', '__pycache__') for folder in [src_pycache, gui_pycache, scripts_pycache, constants_pycache]: if os.path.isdir(folder): shutil.rmtree(folder) print(str(folder) + ' is removed!') uid = os.getuid() if uid != 0: print('Run this script as root\n\ if you want to clean unwanted files that created by setup tools') sys.exit(1) # finding current directory cwd = os.path.abspath(__file__) setup_dir = os.path.dirname(cwd) # clearing __pycache__ src_pycache = os.path.join(setup_dir, 'persepolis', '__pycache__') gui_pycache = os.path.join(setup_dir, 'persepolis', 'gui', '__pycache__') scripts_pycache = os.path.join(setup_dir, 'persepolis', 'scripts', '__pycache__') constants_pycache = os.path.join(setup_dir, 'persepolis', 'constants', '__pycache__') for folder in [src_pycache, gui_pycache, scripts_pycache, constants_pycache]: if os.path.isdir(folder): shutil.rmtree(folder) print(str(folder) + ' is removed!') # clear unwanted files! for folder in ['build', 'dist', 'root', 'persepolis.egg-info']: if os.path.isdir(folder): shutil.rmtree(folder) print(str(folder) + ' is removed!') man_page = 'man/persepolis.1.gz' if os.path.isfile(man_page): os.remove('man/persepolis.1.gz') ================================================ FILE: man/meson.build ================================================ # creating man page file persepolis_man_page='persepolis.1' install_man(persepolis_man_page) ================================================ FILE: man/persepolis.1 ================================================ .TH "Persepolis" "1" "July 14, 2025" "5.2.0" "persepolis" .SH NAME persepolis \- Persepolis Download Manager . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .\" Man page generated from reStructuredText. . .SH SYNOPSIS .sp \fBpersepolis\fP --link [] [] .SH DESCRIPTION .sp Persepolis Download Manager is a feature-full utility for easier and faster downloads with aria2. It support HTTP(S) & FTP.Persepolis configures aria2 automatically for maximum speed and it has a GUI for the ease of use. You can adjust start time and end time for downloads.Persepolis can shutdown system after download. You can integrate persepolis with your browser(read persepolis wiki on github page). .SH OPTIONS .SS Basic Options .INDENT 0.0 .TP .B \--link Your Download link.(Use "" for links) $ persepolis --link "https://www.google.com/images/srpr/logo11w.png" .UNINDENT .INDENT 0.0 .TP .B \--referrer Set an http referrer (Referer). This affects all http/https downloads. If * is given, the download URI is also used as the referrer. .UNINDENT .INDENT 0.0 .TP .B \--load-cookies Set cookies file path. .UNINDENT .INDENT 0.0 .TP .B \--agent Set user agent for HTTP(S) downloads. Default: aria2/$VERSION, $VERSION is replaced by package version. .UNINDENT .INDENT 0.0 .TP .B \--headers Append HEADER to HTTP request header. .UNINDENT .INDENT 0.0 .TP .B \--name The file name of the downloaded file. .UNINDENT .INDENT 0.0 .TP .B \--default Restore default settings. .UNINDENT .INDENT 0.0 .TP .B \--clear Clear download list and user setting! .UNINDENT .INDENT 0.0 .TP .B \--tray Persepolis starts in tray icon. It's useful when you want to put persepolis in system's startup. .UNINDENT .INDENT 0.0 .TP .B \--version Showing persepolis version. .UNINDENT .INDENT 0.0 .TP .B \--help Persepolis help. .UNINDENT .INDENT 0.0 .TP .SH MORE HELP for configuration with firefox flashgot please see README.md file on github https://github.com/persepolisdm/persepolis .SH SEE ALSO aria2c(1) .SH AUTHOR .B AliReza AmirSamimi .UNINDENT .INDENT 0.0 .TP .B Github page https://github.com/persepolisdm/persepolis .UNINDENT .INDENT 0.0 .TP .B PersepolisDM Telegram Channel https://telegram.me/persepolisdm ================================================ FILE: meson.build ================================================ project('persepolis', version: '5.2.0', meson_version: '>=0.61.2') python = import('python') python3 = python.find_installation('python3') if not python3.found() error('No valid python3 installation found!') endif # run dependency check script meson.add_install_script('check_dependencies.py') prefix = get_option('prefix') bindir = join_paths(prefix, get_option('bindir')) datadir = join_paths(prefix, get_option('datadir')) pythondir = join_paths(prefix, python3.get_path('purelib')) pkgdatadir = join_paths(datadir, meson.project_name()) pkgappid = 'com.github.persepolisdm.persepolis' appdatadir = join_paths(datadir, 'metainfo') desktopdir = join_paths(datadir, 'applications') persepolisdir = python3.get_install_dir(subdir: 'persepolis') icondir = join_paths(datadir, 'icons', 'hicolor', 'scalable', 'apps') subdir('persepolis') subdir('man') subdir('xdg') subdir('resources') ================================================ FILE: persepolis/.pep8 ================================================ [pycodestyle] max_line_length = 120 ================================================ FILE: persepolis/Persepolis Download Manager.py ================================================ # -*- coding: utf-8 -*- # 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 . # this file is created for building persepolis with pyinstaller. from persepolis.scripts import persepolis persepolis.main() ================================================ FILE: persepolis/__init__.py ================================================ # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import sys # sys.path.insert(1, '.') ================================================ FILE: persepolis/__main__.py ================================================ # -*- coding: utf-8 -*- # 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 . from persepolis.scripts import persepolis persepolis.main() ================================================ FILE: persepolis/constants/Browser.py ================================================ # -*- coding: utf-8 -*- # 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 . # class BROWSER: CHROME = 'chrome' CHROMIUM = 'chromium' OPERA = 'opera' VIVALDI = 'vivaldi' FIREFOX = 'firefox' BRAVE = 'brave' LIBREWOLF = 'librewolf' CHROME_FAMILY = [CHROME, CHROMIUM, VIVALDI, OPERA, BRAVE] FIREFOX_FAMILY = [FIREFOX, LIBREWOLF] LIST = [CHROME, CHROMIUM, OPERA, VIVALDI, FIREFOX, BRAVE] ================================================ FILE: persepolis/constants/Os.py ================================================ # -*- coding: utf-8 -*- # 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 . # class OS: LINUX = 'Linux' WINDOWS = 'Windows' FREE_BSD = 'FreeBSD' OPEN_BSD = 'OpenBSD' OSX = DARWIN = 'Darwin' BSD_FAMILY = [FREE_BSD, OPEN_BSD] UNIX_LIKE = [FREE_BSD, OPEN_BSD, LINUX] LIST = [LINUX, WINDOWS, FREE_BSD, OPEN_BSD, OSX] ================================================ FILE: persepolis/constants/Version.py ================================================ # -*- coding: utf-8 -*- # 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 . # class VERSION: version_str = '5.2.0' ================================================ FILE: persepolis/constants/__init__.py ================================================ # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # import sys # sys.path.insert(1, '.') from .Os import OS from .Browser import BROWSER from .Version import VERSION ================================================ FILE: persepolis/gui/.pep8 ================================================ [pycodestyle] max_line_length = 120 ================================================ FILE: persepolis/gui/__init__.py ================================================ # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # import sys # sys.path.insert(1, '.') ================================================ FILE: persepolis/gui/about_ui.py ================================================ # -*- coding: utf-8 -*- """ 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 . """ try: from PySide6.QtWidgets import QWidget, QTabWidget, QHBoxLayout, QVBoxLayout, QLabel, QTextEdit, QPushButton from PySide6.QtCore import Qt, QSize, QTranslator, QCoreApplication, QLocale from PySide6.QtGui import QIcon, QFont pyside6_is_installed = True except ImportError: from PyQt5.QtWidgets import QWidget, QTabWidget, QHBoxLayout, QVBoxLayout, QLabel, QTextEdit, QPushButton from PyQt5.QtCore import Qt, QSize, QTranslator, QCoreApplication, QLocale from PyQt5.QtGui import QIcon, QFont pyside6_is_installed = False from persepolis.gui import resources from persepolis.constants import VERSION if pyside6_is_installed is True: try: from PySide6 import QtSvgWidgets qtsvg_available = True except ImportError: qtsvg_available = False else: try: from PyQt5 import QtSvg as QtSvgWidgets qtsvg_available = True except ImportError: qtsvg_available = False class AboutWindow_Ui(QWidget): def __init__(self, persepolis_setting): super().__init__() self.persepolis_setting = persepolis_setting # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) # set ui direction ui_direction = self.persepolis_setting.value('ui_direction') if ui_direction == 'rtl': self.setLayoutDirection(Qt.RightToLeft) elif ui_direction in 'ltr': self.setLayoutDirection(Qt.LeftToRight) icons = ':/' + \ str(self.persepolis_setting.value('settings/icons')) + '/' self.setMinimumSize(QSize(545, 375)) self.setWindowIcon(QIcon.fromTheme('persepolis', QIcon(':/com.github.persepolisdm.persepolis.svg'))) verticalLayout = QVBoxLayout(self) self.about_tabWidget = QTabWidget(self) # about tab self.about_tab = QWidget(self) about_tab_horizontalLayout = QHBoxLayout(self.about_tab) about_tab_verticalLayout = QVBoxLayout() # persepolis icon if qtsvg_available: persepolis_icon_verticalLayout = QVBoxLayout() self.persepolis_icon = QtSvgWidgets.QSvgWidget(':/com.github.persepolisdm.persepolis.svg') self.persepolis_icon.setFixedSize(QSize(64, 64)) persepolis_icon_verticalLayout.addWidget(self.persepolis_icon) persepolis_icon_verticalLayout.addStretch(1) about_tab_horizontalLayout.addLayout(persepolis_icon_verticalLayout) self.title_label = QLabel(self.about_tab) font = QFont() font.setBold(True) font.setWeight(QFont.Weight.Bold) self.title_label.setFont(font) self.title_label.setAlignment(Qt.AlignCenter) about_tab_verticalLayout.addWidget(self.title_label) self.version_label = QLabel(self.about_tab) self.version_label.setAlignment(Qt.AlignCenter) self.version_label.setFont(font) about_tab_verticalLayout.addWidget(self.version_label) self.site2_label = QLabel(self.about_tab) self.site2_label.setTextFormat(Qt.RichText) self.site2_label.setAlignment(Qt.AlignCenter) self.site2_label.setOpenExternalLinks(True) self.site2_label.setTextInteractionFlags( Qt.TextBrowserInteraction) about_tab_verticalLayout.addWidget(self.site2_label) self.telegram_label = QLabel(self.about_tab) self.telegram_label.setTextFormat(Qt.RichText) self.telegram_label.setAlignment(Qt.AlignCenter) self.telegram_label.setOpenExternalLinks(True) self.telegram_label.setTextInteractionFlags( Qt.TextBrowserInteraction) about_tab_verticalLayout.addWidget(self.telegram_label) self.twitter_label = QLabel(self.about_tab) self.twitter_label.setTextFormat(Qt.RichText) self.twitter_label.setAlignment(Qt.AlignCenter) self.twitter_label.setOpenExternalLinks(True) self.twitter_label.setTextInteractionFlags( Qt.TextBrowserInteraction) about_tab_verticalLayout.addWidget(self.twitter_label) about_tab_verticalLayout.addStretch(1) about_tab_horizontalLayout.addLayout(about_tab_verticalLayout) # developers_tab # developers self.developers_tab = QWidget(self) developers_verticalLayout = QVBoxLayout(self.developers_tab) self.developers_title_label = QLabel(self.developers_tab) font.setBold(True) font.setWeight(QFont.Weight.Bold) self.developers_title_label.setFont(font) self.developers_title_label.setAlignment(Qt.AlignCenter) developers_verticalLayout.addWidget(self.developers_title_label) self.name_label = QLabel(self.developers_tab) self.name_label.setAlignment(Qt.AlignCenter) developers_verticalLayout.addWidget(self.name_label) # contributors self.contributors_thank_label = QLabel(self.developers_tab) self.contributors_thank_label.setFont(font) self.contributors_thank_label.setAlignment(Qt.AlignCenter) developers_verticalLayout.addWidget(self.contributors_thank_label) self.contributors_link_label = QLabel(self.developers_tab) self.contributors_link_label.setTextFormat(Qt.RichText) self.contributors_link_label.setAlignment(Qt.AlignCenter) self.contributors_link_label.setOpenExternalLinks(True) self.contributors_link_label.setTextInteractionFlags( Qt.TextBrowserInteraction) developers_verticalLayout.addWidget(self.contributors_link_label) developers_verticalLayout.addStretch(1) # translators tab self.translators_tab = QWidget(self) translators_tab_verticalLayout = QVBoxLayout(self.translators_tab) # translators self.translators_textEdit = QTextEdit(self.translators_tab) self.translators_textEdit.setReadOnly(True) translators_tab_verticalLayout.addWidget(self.translators_textEdit) # License tab self.license_tab = QWidget(self) license_tab_verticalLayout = QVBoxLayout(self.license_tab) self.license_text = QTextEdit(self.license_tab) self.license_text.setReadOnly(True) license_tab_verticalLayout.addWidget(self.license_text) verticalLayout.addWidget(self.about_tabWidget) # Acknowledgments tab self.acknowledgments_tab = QWidget(self) acknowledgments_verticalLayout = QVBoxLayout(self.acknowledgments_tab) self.acknowledgments_title_label = QLabel(self.acknowledgments_tab) font.setBold(True) font.setWeight(QFont.Weight.Bold) self.acknowledgments_title_label.setFont(font) self.acknowledgments_title_label.setAlignment(Qt.AlignCenter) acknowledgments_verticalLayout.addWidget(self.acknowledgments_title_label) self.acknowledgments_ffmpeg_label = QLabel(self.acknowledgments_tab) self.acknowledgments_ffmpeg_label.setAlignment(Qt.AlignCenter) self.acknowledgments_ytdlp_label = QLabel(self.acknowledgments_tab) self.acknowledgments_ytdlp_label.setAlignment(Qt.AlignCenter) self.acknowledgments_pyton_requests_label = QLabel(self.acknowledgments_tab) self.acknowledgments_pyton_requests_label.setAlignment(Qt.AlignCenter) self.acknowledgments_pyside_label = QLabel(self.acknowledgments_tab) self.acknowledgments_pyside_label.setAlignment(Qt.AlignCenter) self.acknowledgments_ffmpeg_label.setFont(font) self.acknowledgments_ytdlp_label.setFont(font) self.acknowledgments_pyside_label.setFont(font) self.acknowledgments_pyton_requests_label.setFont(font) acknowledgments_verticalLayout.addWidget(self.acknowledgments_ytdlp_label) acknowledgments_verticalLayout.addWidget(self.acknowledgments_ffmpeg_label) acknowledgments_verticalLayout.addWidget(self.acknowledgments_pyton_requests_label) acknowledgments_verticalLayout.addWidget(self.acknowledgments_pyside_label) acknowledgments_verticalLayout.addStretch(1) # buttons button_horizontalLayout = QHBoxLayout() button_horizontalLayout.addStretch(1) self.pushButton = QPushButton(self) self.pushButton.setIcon(QIcon(icons + 'ok')) self.pushButton.clicked.connect(self.close) button_horizontalLayout.addWidget(self.pushButton) verticalLayout.addLayout(button_horizontalLayout) self.setWindowTitle(QCoreApplication.translate("about_ui_tr", "About Persepolis")) # about_tab self.title_label.setText(QCoreApplication.translate("about_ui_tr", "Persepolis Download Manager")) self.version_label.setText(QCoreApplication.translate("about_ui_tr", "Version " + VERSION.version_str, "TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART!")) self.site2_label.setText(QCoreApplication.translate("about_ui_tr", "https://persepolisdm.github.io", "TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART!")) self.telegram_label.setText(QCoreApplication.translate("about_ui_tr", "https://telegram.me/persepolisdm", "TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART!")) self.twitter_label.setText(QCoreApplication.translate("about_ui_tr", "https://twitter.com/persepolisdm", "TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART!")) # developers_tab self.developers_title_label.setText(QCoreApplication.translate('about_ui_tr', 'Developers')) self.name_label.setText(QCoreApplication.translate("about_ui_tr", "\nAliReza AmirSamimi\nMohammadreza Abdollahzadeh\nSadegh Alirezaie\nMostafa Asadi\nJafar Akhondali\nKia Hamedi\nH.Rostami\nEhsan Titish\nMohammadAmin Vahedinia", "TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART!")) self.contributors_thank_label.setText(QCoreApplication.translate('about_ui_tr', 'Special thanks to:')) self.contributors_link_label.setText( "our contributors") # Acknowledgments self.acknowledgments_title_label.setText(QCoreApplication.translate('about_ui_tr', 'Acknowledgments:')) self.acknowledgments_ytdlp_label.setText(QCoreApplication.translate("about_ui_tr", "YT-DLP project", "TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART!")) self.acknowledgments_ffmpeg_label.setText(QCoreApplication.translate("about_ui_tr", "FFmpeg project", "TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART!")) self.acknowledgments_pyside_label.setText(QCoreApplication.translate("about_ui_tr", "Pyside project", "TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART!")) self.acknowledgments_pyton_requests_label.setText(QCoreApplication.translate("about_ui_tr", "Requests project", "TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART!")) # License self.license_text.setPlainText(""" 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 http://www.gnu.org/licenses/. """) # tabs self.about_tabWidget.addTab(self.about_tab, QCoreApplication.translate("about_ui_tr", "About Persepolis")) self.about_tabWidget.addTab(self.developers_tab, QCoreApplication.translate("about_ui_tr", "Developers")) self.about_tabWidget.addTab(self.acknowledgments_tab, QCoreApplication.translate("about_ui_tr", "Acknowledgments")) self.about_tabWidget.addTab(self.translators_tab, QCoreApplication.translate("about_ui_tr", "Translators")) self.about_tabWidget.addTab(self.license_tab, QCoreApplication.translate("about_ui_tr", "License")) # button self.pushButton.setText(QCoreApplication.translate("about_ui_tr", "OK")) ================================================ FILE: persepolis/gui/addlink_ui.py ================================================ # -*- coding: utf-8 -*- """ 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 . """ try: from PySide6.QtWidgets import QTabWidget, QPushButton, QComboBox, QSpinBox, QVBoxLayout, QHBoxLayout, QLabel, QWidget, QGridLayout, QCheckBox, QFrame, QLineEdit, QRadioButton from PySide6.QtCore import Qt, QTranslator, QCoreApplication, QLocale from PySide6 import QtCore from PySide6.QtGui import QIcon except ImportError: from PyQt5.QtWidgets import QTabWidget, QPushButton, QComboBox, QSpinBox, QVBoxLayout, QHBoxLayout, QLabel, QWidget, QGridLayout, QCheckBox, QFrame, QLineEdit, QRadioButton from PyQt5.QtCore import Qt, QTranslator, QCoreApplication, QLocale from PyQt5 import QtCore from PyQt5.QtGui import QIcon from persepolis.gui import resources from persepolis.gui.customized_widgets import MyQDateTimeEdit class AddLinkWindow_Ui(QWidget): def __init__(self, persepolis_setting): super().__init__() self.persepolis_setting = persepolis_setting # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) # set ui direction ui_direction = self.persepolis_setting.value('ui_direction') if ui_direction == 'rtl': self.setLayoutDirection(Qt.RightToLeft) elif ui_direction in 'ltr': self.setLayoutDirection(Qt.LeftToRight) # get icons name icons = ':/' + \ str(self.persepolis_setting.value('settings/icons')) + '/' self.setMinimumSize(QtCore.QSize(520, 425)) self.setWindowIcon(QIcon.fromTheme('persepolis', QIcon(':/com.github.persepolisdm.persepolis.svg'))) # main layout window_verticalLayout = QVBoxLayout() # add link tab widget self.add_link_tabWidget = QTabWidget(self) window_verticalLayout.addWidget(self.add_link_tabWidget) # link tab self.link_tab = QWidget() link_tab_verticalLayout = QVBoxLayout(self.link_tab) link_tab_verticalLayout.setContentsMargins(21, 21, 21, 81) self.link_frame = QFrame(self.link_tab) self.link_frame.setFrameShape(QFrame.StyledPanel) self.link_frame.setFrameShadow(QFrame.Raised) horizontalLayout_2 = QHBoxLayout(self.link_frame) self.link_verticalLayout = QVBoxLayout() # link -> self.link_horizontalLayout = QHBoxLayout() self.link_label = QLabel(self.link_frame) self.link_horizontalLayout.addWidget(self.link_label) self.link_lineEdit = QLineEdit(self.link_frame) self.link_horizontalLayout.addWidget(self.link_lineEdit) self.link_verticalLayout.addLayout(self.link_horizontalLayout) horizontalLayout_2.addLayout(self.link_verticalLayout) link_tab_verticalLayout.addWidget(self.link_frame) # add change_name field -> self.change_name_horizontalLayout = QHBoxLayout() self.change_name_checkBox = QCheckBox(self.link_frame) self.change_name_horizontalLayout.addWidget(self.change_name_checkBox) self.change_name_lineEdit = QLineEdit(self.link_frame) self.change_name_horizontalLayout.addWidget(self.change_name_lineEdit) self.link_verticalLayout.addLayout(self.change_name_horizontalLayout) # add_category -> queue_horizontalLayout = QHBoxLayout() self.queue_frame = QFrame(self) self.queue_frame.setFrameShape(QFrame.StyledPanel) self.queue_frame.setFrameShadow(QFrame.Raised) add_queue_horizontalLayout = QHBoxLayout(self.queue_frame) self.add_queue_label = QLabel(self.queue_frame) add_queue_horizontalLayout.addWidget(self.add_queue_label) self.add_queue_comboBox = QComboBox(self.queue_frame) add_queue_horizontalLayout.addWidget(self.add_queue_comboBox) queue_horizontalLayout.addWidget(self.queue_frame) queue_horizontalLayout.addStretch(1) self.size_label = QLabel(self) queue_horizontalLayout.addWidget(self.size_label) link_tab_verticalLayout.addLayout(queue_horizontalLayout) link_tab_verticalLayout.addStretch(1) self.add_link_tabWidget.addTab(self.link_tab, '') # proxy tab self.proxy_tab = QWidget(self) proxy_verticalLayout = QVBoxLayout(self.proxy_tab) proxy_verticalLayout.setContentsMargins(21, 21, 21, 171) proxy_horizontalLayout = QHBoxLayout() self.proxy_checkBox = QCheckBox(self.proxy_tab) self.detect_proxy_pushButton = QPushButton(self.proxy_tab) self.detect_proxy_label = QLabel(self.proxy_tab) proxy_horizontalLayout.addWidget(self.proxy_checkBox) proxy_horizontalLayout.addWidget(self.detect_proxy_label) proxy_horizontalLayout.addWidget(self.detect_proxy_pushButton) proxy_verticalLayout.addLayout(proxy_horizontalLayout) self.proxy_frame = QFrame(self.proxy_tab) self.proxy_frame.setFrameShape(QFrame.StyledPanel) self.proxy_frame.setFrameShadow(QFrame.Raised) gridLayout = QGridLayout(self.proxy_frame) self.ip_label = QLabel(self.proxy_frame) gridLayout.addWidget(self.ip_label, 0, 0, 1, 1) self.ip_lineEdit = QLineEdit(self.proxy_frame) self.ip_lineEdit.setInputMethodHints(QtCore.Qt.ImhNone) gridLayout.addWidget(self.ip_lineEdit, 0, 1, 1, 1) self.port_label = QLabel(self.proxy_frame) gridLayout.addWidget(self.port_label, 0, 2, 1, 1) self.port_spinBox = QSpinBox(self.proxy_frame) self.port_spinBox.setMaximum(65535) self.port_spinBox.setSingleStep(1) gridLayout.addWidget(self.port_spinBox, 0, 3, 1, 1) self.proxy_user_label = QLabel(self.proxy_frame) gridLayout.addWidget(self.proxy_user_label, 2, 0, 1, 1) self.proxy_user_lineEdit = QLineEdit(self.proxy_frame) gridLayout.addWidget(self.proxy_user_lineEdit, 2, 1, 1, 1) self.proxy_pass_label = QLabel(self.proxy_frame) gridLayout.addWidget(self.proxy_pass_label, 2, 2, 1, 1) self.proxy_pass_lineEdit = QLineEdit(self.proxy_frame) self.proxy_pass_lineEdit.setEchoMode(QLineEdit.Password) gridLayout.addWidget(self.proxy_pass_lineEdit, 2, 3, 1, 1) proxy_verticalLayout.addWidget(self.proxy_frame) # type of proxy self.http_radioButton = QRadioButton(self.proxy_frame) gridLayout.addWidget(self.http_radioButton, 4, 0, 1, 1) self.https_radioButton = QRadioButton(self.proxy_frame) gridLayout.addWidget(self.https_radioButton, 5, 0, 1, 1) # hide this widget until https support self.https_radioButton.hide() self.socks5_radioButton = QRadioButton(self.proxy_frame) gridLayout.addWidget(self.socks5_radioButton, 6, 0, 1, 1) proxy_verticalLayout.addStretch(1) self.add_link_tabWidget.addTab(self.proxy_tab, '') # more options tab self.more_options_tab = QWidget(self) more_options_tab_verticalLayout = QVBoxLayout(self.more_options_tab) # download Username & Password -> download_horizontalLayout = QHBoxLayout() download_horizontalLayout.setContentsMargins(-1, 10, -1, -1) download_verticalLayout = QVBoxLayout() self.download_checkBox = QCheckBox(self.more_options_tab) download_verticalLayout.addWidget(self.download_checkBox) self.download_frame = QFrame(self.more_options_tab) self.download_frame.setFrameShape(QFrame.StyledPanel) self.download_frame.setFrameShadow(QFrame.Raised) gridLayout_2 = QGridLayout(self.download_frame) self.download_user_lineEdit = QLineEdit(self.download_frame) gridLayout_2.addWidget(self.download_user_lineEdit, 0, 1, 1, 1) self.download_user_label = QLabel(self.download_frame) gridLayout_2.addWidget(self.download_user_label, 0, 0, 1, 1) self.download_pass_label = QLabel(self.download_frame) gridLayout_2.addWidget(self.download_pass_label, 1, 0, 1, 1) self.download_pass_lineEdit = QLineEdit(self.download_frame) self.download_pass_lineEdit.setEchoMode(QLineEdit.Password) gridLayout_2.addWidget(self.download_pass_lineEdit, 1, 1, 1, 1) download_verticalLayout.addWidget(self.download_frame) download_horizontalLayout.addLayout(download_verticalLayout) # select folder -> self.folder_frame = QFrame(self.more_options_tab) self.folder_frame.setFrameShape(QFrame.StyledPanel) self.folder_frame.setFrameShadow(QFrame.Raised) gridLayout_3 = QGridLayout(self.folder_frame) self.download_folder_lineEdit = QLineEdit(self.folder_frame) gridLayout_3.addWidget(self.download_folder_lineEdit, 2, 0, 1, 1) self.folder_pushButton = QPushButton(self.folder_frame) gridLayout_3.addWidget(self.folder_pushButton, 3, 0, 1, 1) self.folder_pushButton.setIcon(QIcon(icons + 'folder')) self.folder_checkBox = QCheckBox(self.folder_frame) gridLayout_3.addWidget(self.folder_checkBox) self.folder_label = QLabel(self.folder_frame) self.folder_label.setAlignment(QtCore.Qt.AlignCenter) gridLayout_3.addWidget(self.folder_label, 1, 0, 1, 1) download_horizontalLayout.addWidget(self.folder_frame) more_options_tab_verticalLayout.addLayout(download_horizontalLayout) # start time -> time_limit_horizontalLayout = QHBoxLayout() time_limit_horizontalLayout.setContentsMargins(-1, 10, -1, -1) start_verticalLayout = QVBoxLayout() self.start_checkBox = QCheckBox(self.more_options_tab) start_verticalLayout.addWidget(self.start_checkBox) self.start_frame = QFrame(self.more_options_tab) self.start_frame.setFrameShape(QFrame.StyledPanel) self.start_frame.setFrameShadow(QFrame.Raised) horizontalLayout_5 = QHBoxLayout(self.start_frame) self.start_time_qDataTimeEdit = MyQDateTimeEdit(self.start_frame) self.start_time_qDataTimeEdit.setDisplayFormat('H:mm') horizontalLayout_5.addWidget(self.start_time_qDataTimeEdit) start_verticalLayout.addWidget(self.start_frame) time_limit_horizontalLayout.addLayout(start_verticalLayout) # end time -> end_verticalLayout = QVBoxLayout() self.end_checkBox = QCheckBox(self.more_options_tab) end_verticalLayout.addWidget(self.end_checkBox) self.end_frame = QFrame(self.more_options_tab) self.end_frame.setFrameShape(QFrame.StyledPanel) self.end_frame.setFrameShadow(QFrame.Raised) horizontalLayout_6 = QHBoxLayout(self.end_frame) self.end_time_qDateTimeEdit = MyQDateTimeEdit(self.end_frame) self.end_time_qDateTimeEdit.setDisplayFormat('H:mm') horizontalLayout_6.addWidget(self.end_time_qDateTimeEdit) end_verticalLayout.addWidget(self.end_frame) time_limit_horizontalLayout.addLayout(end_verticalLayout) # limit Speed -> limit_verticalLayout = QVBoxLayout() self.limit_frame = QFrame(self.more_options_tab) self.limit_frame.setFrameShape(QFrame.StyledPanel) self.limit_frame.setFrameShadow(QFrame.Raised) verticalLayout_4 = QVBoxLayout(self.limit_frame) limit_verticalLayout.addWidget(self.limit_frame) time_limit_horizontalLayout.addLayout(limit_verticalLayout) more_options_tab_verticalLayout.addLayout(time_limit_horizontalLayout) # number of connections -> connections_horizontalLayout = QHBoxLayout() connections_horizontalLayout.setContentsMargins(-1, 10, -1, -1) self.connections_frame = QFrame(self.more_options_tab) self.connections_frame.setFrameShape(QFrame.StyledPanel) self.connections_frame.setFrameShadow(QFrame.Raised) self.connections_label = QLabel(self.connections_frame) verticalLayout_4.addWidget(self.connections_label) self.connections_spinBox = QSpinBox(self.connections_frame) self.connections_spinBox.setMinimum(1) self.connections_spinBox.setMaximum(64) self.connections_spinBox.setProperty("value", 64) verticalLayout_4.addWidget(self.connections_spinBox) connections_horizontalLayout.addWidget(self.connections_frame) connections_horizontalLayout.addStretch(1) more_options_tab_verticalLayout.addLayout(connections_horizontalLayout) more_options_tab_verticalLayout.addStretch(1) self.add_link_tabWidget.addTab(self.more_options_tab, '') # advance options self.advance_options_tab = QWidget(self) advance_options_tab_verticalLayout = QVBoxLayout(self.advance_options_tab) # referer referer_horizontalLayout = QHBoxLayout() self.referer_label = QLabel(self.advance_options_tab) referer_horizontalLayout.addWidget(self.referer_label) self.referer_lineEdit = QLineEdit(self.advance_options_tab) referer_horizontalLayout.addWidget(self.referer_lineEdit) advance_options_tab_verticalLayout.addLayout(referer_horizontalLayout) # header header_horizontalLayout = QHBoxLayout() self.header_label = QLabel(self.advance_options_tab) header_horizontalLayout.addWidget(self.header_label) self.header_lineEdit = QLineEdit(self.advance_options_tab) header_horizontalLayout.addWidget(self.header_lineEdit) advance_options_tab_verticalLayout.addLayout(header_horizontalLayout) # user_agent user_agent_horizontalLayout = QHBoxLayout() self.user_agent_label = QLabel(self.advance_options_tab) user_agent_horizontalLayout.addWidget(self.user_agent_label) self.user_agent_lineEdit = QLineEdit(self.advance_options_tab) user_agent_horizontalLayout.addWidget(self.user_agent_lineEdit) advance_options_tab_verticalLayout.addLayout(user_agent_horizontalLayout) # load_cookies load_cookies_horizontalLayout = QHBoxLayout() self.load_cookies_label = QLabel(self.advance_options_tab) load_cookies_horizontalLayout.addWidget(self.load_cookies_label) self.load_cookies_lineEdit = QLineEdit(self.advance_options_tab) load_cookies_horizontalLayout.addWidget(self.load_cookies_lineEdit) advance_options_tab_verticalLayout.addLayout(load_cookies_horizontalLayout) advance_options_tab_verticalLayout.addStretch(1) self.add_link_tabWidget.addTab(self.advance_options_tab, '') # ok cancel download_later buttons -> buttons_horizontalLayout = QHBoxLayout() buttons_horizontalLayout.addStretch(1) self.download_later_pushButton = QPushButton(self) self.download_later_pushButton.setIcon(QIcon(icons + 'stop')) self.cancel_pushButton = QPushButton(self) self.cancel_pushButton.setIcon(QIcon(icons + 'remove')) self.ok_pushButton = QPushButton(self) self.ok_pushButton.setIcon(QIcon(icons + 'ok')) buttons_horizontalLayout.addWidget(self.download_later_pushButton) buttons_horizontalLayout.addWidget(self.cancel_pushButton) buttons_horizontalLayout.addWidget(self.ok_pushButton) window_verticalLayout.addLayout(buttons_horizontalLayout) self.setLayout(window_verticalLayout) # labels -> self.setWindowTitle(QCoreApplication.translate("addlink_ui_tr", "Add Download Link")) self.link_label.setText(QCoreApplication.translate("addlink_ui_tr", "Download link: ")) self.add_queue_label.setText(QCoreApplication.translate("addlink_ui_tr", "Add to category: ")) self.change_name_checkBox.setText(QCoreApplication.translate("addlink_ui_tr", "Change file name: ")) self.detect_proxy_pushButton.setText(QCoreApplication.translate("addlink_ui_tr", "Detect System Proxy Settings")) self.proxy_checkBox.setText(QCoreApplication.translate("addlink_ui_tr", "Proxy")) self.proxy_pass_label.setText(QCoreApplication.translate("addlink_ui_tr", "Proxy password: ")) self.ip_label.setText(QCoreApplication.translate("addlink_ui_tr", "IP: ")) self.proxy_user_label.setText(QCoreApplication.translate("addlink_ui_tr", "Proxy username: ")) self.port_label.setText(QCoreApplication.translate("addlink_ui_tr", "Port:")) self.http_radioButton.setText(QCoreApplication.translate("addlink_ui_tr", "HTTP")) self.https_radioButton.setText(QCoreApplication.translate("addlink_ui_tr", "HTTPS")) self.socks5_radioButton.setText(QCoreApplication.translate("addlink_ui_tr", "SOCKS5")) self.download_checkBox.setText(QCoreApplication.translate("addlink_ui_tr", "Download username and password")) self.download_user_label.setText(QCoreApplication.translate("addlink_ui_tr", "Download username: ")) self.download_pass_label.setText(QCoreApplication.translate("addlink_ui_tr", "Download password: ")) self.folder_pushButton.setText(QCoreApplication.translate("addlink_ui_tr", "Change Download Folder")) self.folder_checkBox.setText(QCoreApplication.translate("addlink_ui_tr", "Remember this path")) self.folder_label.setText(QCoreApplication.translate("addlink_ui_tr", "Download Folder: ")) self.start_checkBox.setText(QCoreApplication.translate("addlink_ui_tr", "Start time")) self.end_checkBox.setText(QCoreApplication.translate("addlink_ui_tr", "End time")) self.connections_label.setText(QCoreApplication.translate("addlink_ui_tr", "Number of connections:")) self.cancel_pushButton.setText(QCoreApplication.translate("addlink_ui_tr", "Cancel")) self.ok_pushButton.setText(QCoreApplication.translate("addlink_ui_tr", "OK")) self.download_later_pushButton.setText(QCoreApplication.translate("addlink_ui_tr", "Download Later")) self.add_link_tabWidget.setTabText(self.add_link_tabWidget.indexOf( self.link_tab), QCoreApplication.translate("addlink_ui_tr", "Link")) self.add_link_tabWidget.setTabText(self.add_link_tabWidget.indexOf( self.proxy_tab), QCoreApplication.translate("addlink_ui_tr", "Proxy")) self.add_link_tabWidget.setTabText(self.add_link_tabWidget.indexOf( self.more_options_tab), QCoreApplication.translate("addlink_ui_tr", "More Options")) self.add_link_tabWidget.setTabText(self.add_link_tabWidget.indexOf( self.advance_options_tab), QCoreApplication.translate("addlink_ui_tr", "Advanced Options")) self.referer_label.setText(QCoreApplication.translate("addlink_ui_tr", 'Referrer: ')) self.header_label.setText(QCoreApplication.translate("addlink_ui_tr", 'Header: ')) self.load_cookies_label.setText(QCoreApplication.translate("addlink_ui_tr", 'Load cookies: ')) self.user_agent_label.setText(QCoreApplication.translate("addlink_ui_tr", 'User agent: ')) ================================================ FILE: persepolis/gui/after_download_ui.py ================================================ # -*- coding: utf-8 -*- # 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 . try: from PySide6.QtWidgets import QCheckBox, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QLineEdit from PySide6.QtCore import Qt, QTranslator, QCoreApplication, QLocale from PySide6.QtGui import QIcon except ImportError: from PyQt5.QtWidgets import QCheckBox, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QLineEdit from PyQt5.QtCore import Qt, QTranslator, QCoreApplication, QLocale from PyQt5.QtGui import QIcon from persepolis.gui import resources class AfterDownloadWindow_Ui(QWidget): def __init__(self, persepolis_setting): super().__init__() self.persepolis_setting = persepolis_setting # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) # set ui direction ui_direction = self.persepolis_setting.value('ui_direction') if ui_direction == 'rtl': self.setLayoutDirection(Qt.RightToLeft) elif ui_direction in 'ltr': self.setLayoutDirection(Qt.LeftToRight) icons = ':/' + str(self.persepolis_setting.value('settings/icons')) + '/' self.setWindowIcon(QIcon.fromTheme('persepolis', QIcon(':/com.github.persepolisdm.persepolis.svg'))) self.setWindowTitle(QCoreApplication.translate("after_download_ui_tr", "Persepolis Download Manager")) # complete_label window_verticalLayout = QVBoxLayout() window_verticalLayout.setContentsMargins(21, 21, 21, 21) self.complete_label = QLabel() window_verticalLayout.addWidget(self.complete_label) # file_name_label self.file_name_label = QLabel() window_verticalLayout.addWidget(self.file_name_label) # size_label self.size_label = QLabel() window_verticalLayout.addWidget(self.size_label) # link self.link_label = QLabel() window_verticalLayout.addWidget(self.link_label) self.link_lineEdit = QLineEdit() window_verticalLayout.addWidget(self.link_lineEdit) # save_as self.save_as_label = QLabel() window_verticalLayout.addWidget(self.save_as_label) self.save_as_lineEdit = QLineEdit() window_verticalLayout.addWidget(self.save_as_lineEdit) # open_pushButtun button_horizontalLayout = QHBoxLayout() button_horizontalLayout.setContentsMargins(10, 10, 10, 10) button_horizontalLayout.addStretch(1) self.open_pushButtun = QPushButton() self.open_pushButtun.setIcon(QIcon(icons + 'file')) button_horizontalLayout.addWidget(self.open_pushButtun) # open_folder_pushButtun self.open_folder_pushButtun = QPushButton() self.open_folder_pushButtun.setIcon(QIcon(icons + 'folder')) button_horizontalLayout.addWidget(self.open_folder_pushButtun) # ok_pushButton self.ok_pushButton = QPushButton() self.ok_pushButton.setIcon(QIcon(icons + 'ok')) button_horizontalLayout.addWidget(self.ok_pushButton) window_verticalLayout.addLayout(button_horizontalLayout) # dont_show_checkBox self.dont_show_checkBox = QCheckBox() window_verticalLayout.addWidget(self.dont_show_checkBox) window_verticalLayout.addStretch(1) self.setLayout(window_verticalLayout) # labels self.open_pushButtun.setText(QCoreApplication.translate("after_download_ui_tr", " Open File ")) self.open_folder_pushButtun.setText(QCoreApplication.translate("after_download_ui_tr", "Open Download Folder")) self.ok_pushButton.setText(QCoreApplication.translate("after_download_ui_tr", " OK ")) self.dont_show_checkBox.setText(QCoreApplication.translate( "after_download_ui_tr", "Don't show this message again.")) self.complete_label.setText(QCoreApplication.translate("after_download_ui_tr", "Download Completed!")) self.save_as_label.setText(QCoreApplication.translate("after_download_ui_tr", "Save as: ")) self.link_label.setText(QCoreApplication.translate("after_download_ui_tr", "Link: ")) ================================================ FILE: persepolis/gui/customized_widgets.py ================================================ # -*- coding: utf-8 -*- """ 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 . """ try: from PySide6.QtWidgets import QDateTimeEdit from PySide6.QtCore import QSettings, Qt except ImportError: from PyQt5.QtWidgets import QDateTimeEdit from PyQt5.QtCore import QSettings, Qt # import persepolis_setting persepolis_setting = QSettings('persepolis_download_manager', 'persepolis') # check ui_direction RTL or LTR ui_direction = persepolis_setting.value('ui_direction') class MyQDateTimeEdit(QDateTimeEdit): def __init__(self, parent=None): super().__init__(parent) # change ui direction from rtl to ltr if ui_direction == 'rtl': self.setLayoutDirection(Qt.LeftToRight) ================================================ FILE: persepolis/gui/log_window_ui.py ================================================ # -*- coding: utf-8 -*- # 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 . # try: from PySide6.QtWidgets import QWidget, QTextEdit, QVBoxLayout, QHBoxLayout, QPushButton, QTabWidget from PySide6.QtCore import Qt, QTranslator, QCoreApplication, QLocale from PySide6.QtGui import QIcon from PySide6 import QtCore except ImportError: from PyQt5.QtWidgets import QWidget, QTextEdit, QVBoxLayout, QHBoxLayout, QPushButton, QTabWidget from PyQt5.QtCore import Qt, QTranslator, QCoreApplication, QLocale from PyQt5.QtGui import QIcon from PyQt5 import QtCore from persepolis.gui import resources class LogWindow_Ui(QWidget): def __init__(self, persepolis_setting): super().__init__() self.persepolis_setting = persepolis_setting # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) # set ui direction ui_direction = self.persepolis_setting.value('ui_direction') if ui_direction == 'rtl': self.setLayoutDirection(Qt.RightToLeft) elif ui_direction in 'ltr': self.setLayoutDirection(Qt.LeftToRight) icons = ':/' + \ str(self.persepolis_setting.value('settings/icons')) + '/' # finding windows_size self.setMinimumSize(QtCore.QSize(620, 300)) self.setWindowIcon(QIcon.fromTheme('persepolis', QIcon(':/com.github.persepolisdm.persepolis.svg'))) verticalLayout = QVBoxLayout(self) horizontalLayout = QHBoxLayout() horizontalLayout.addStretch(1) # Define tabwidget self.log_tabWidget = QTabWidget(self) verticalLayout.addWidget(self.log_tabWidget) # Initialization tab self.initialization_tab = QWidget() initialization_tab_verticalLayout = QVBoxLayout(self.initialization_tab) # text_edit self.initialization_text_edit = QTextEdit(self.initialization_tab) self.initialization_text_edit.setReadOnly(True) initialization_tab_verticalLayout.addWidget(self.initialization_text_edit) # downloads tab self.downloads_tab = QWidget() downloads_tab_verticalLayout = QVBoxLayout(self.downloads_tab) # text_edit self.downloads_text_edit = QTextEdit(self.downloads_tab) self.downloads_text_edit.setReadOnly(True) downloads_tab_verticalLayout.addWidget(self.downloads_text_edit) # errors tab self.errors_tab = QWidget() errors_tab_verticalLayout = QVBoxLayout(self.errors_tab) # text_edit self.errors_text_edit = QTextEdit(self.errors_tab) self.errors_text_edit.setReadOnly(True) errors_tab_verticalLayout.addWidget(self.errors_text_edit) self.log_tabWidget.addTab(self.initialization_tab, '') self.log_tabWidget.addTab(self.downloads_tab, '') self.log_tabWidget.addTab(self.errors_tab, '') # clear_log_pushButton self.clear_log_pushButton = QPushButton(self) horizontalLayout.addWidget(self.clear_log_pushButton) # refresh_log_pushButton self.refresh_log_pushButton = QPushButton(self) self.refresh_log_pushButton.setIcon(QIcon(icons + 'refresh')) horizontalLayout.addWidget(self.refresh_log_pushButton) # report_pushButton self.report_pushButton = QPushButton(self) self.report_pushButton.setIcon(QIcon(icons + 'about')) horizontalLayout.addWidget(self.report_pushButton) self.copy_log_pushButton = QPushButton(self) # copy_log_pushButton self.copy_log_pushButton.setIcon(QIcon(icons + 'clipboard')) horizontalLayout.addWidget(self.copy_log_pushButton) # close_pushButton self.close_pushButton = QPushButton(self) self.close_pushButton.setIcon(QIcon(icons + 'remove')) horizontalLayout.addWidget(self.close_pushButton) verticalLayout.addLayout(horizontalLayout) # set labels self.setWindowTitle(QCoreApplication.translate("log_window_ui_tr", 'Persepolis Log')) self.close_pushButton.setText(QCoreApplication.translate("log_window_ui_tr", 'Close')) self.copy_log_pushButton.setText(QCoreApplication.translate("log_window_ui_tr", 'Copy Selected to Clipboard')) self.report_pushButton.setText(QCoreApplication.translate("log_window_ui_tr", "Report Issue")) self.refresh_log_pushButton.setText(QCoreApplication.translate("log_window_ui_tr", 'Refresh Log Messages')) self.clear_log_pushButton.setText(QCoreApplication.translate("log_window_ui_tr", 'Clear Log Messages')) self.log_tabWidget.setTabText(self.log_tabWidget.indexOf( self.initialization_tab), QCoreApplication.translate("log_window_ui_tr", "Initialization and information")) self.log_tabWidget.setTabText(self.log_tabWidget.indexOf( self.downloads_tab), QCoreApplication.translate("log_window_ui_tr", "Downloads")) self.log_tabWidget.setTabText(self.log_tabWidget.indexOf( self.errors_tab), QCoreApplication.translate("log_window_ui_tr", "Errors and warnings")) ================================================ FILE: persepolis/gui/mainwindow_ui.py ================================================ # -*- coding: utf-8 -*- # 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 . try: from PySide6.QtWidgets import QDial, QHeaderView, QPushButton, QComboBox, QMenu, QTreeView, QSplitter, QHBoxLayout, QVBoxLayout, QTableWidgetItem, QAbstractItemView, QToolBar, QMenuBar, QStatusBar, QTableWidget, QMainWindow, QWidget, QFrame, QCheckBox, QLabel from PySide6.QtGui import QShortcut, QAction, QCursor, QIcon, QStandardItemModel from PySide6.QtCore import QCoreApplication, QRect, Qt, QTranslator, QLocale except ImportError: from PyQt5.QtWidgets import QDial, QHeaderView, QShortcut, QPushButton, QComboBox, QTreeView, QSplitter, QHBoxLayout, QVBoxLayout, QMenu, QTableWidgetItem, QAbstractItemView, QToolBar, QMenuBar, QStatusBar, QTableWidget, QAction, QMainWindow, QWidget, QFrame, QCheckBox, QLabel from PyQt5.QtGui import QCursor, QIcon, QStandardItemModel from PyQt5.QtCore import QCoreApplication, QRect, Qt, QTranslator, QLocale from persepolis.gui import resources from persepolis.gui.customized_widgets import MyQDateTimeEdit # align center for items in download table class QTableWidgetItem(QTableWidgetItem): def __init__(self, input): super().__init__(input) self.setTextAlignment(0x0004 | 0x0080) class MenuWidget(QPushButton): def __init__(self, parent): super().__init__() self.parent = parent icons = ':/' + \ str(self.parent.persepolis_setting.value('settings/icons')) + '/' # add support for other languages locale = str(self.parent.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) # set ui direction ui_direction = self.parent.persepolis_setting.value('ui_direction') if ui_direction == 'rtl': self.setLayoutDirection(Qt.RightToLeft) elif ui_direction in 'ltr': self.setLayoutDirection(Qt.LeftToRight) # creating context menu self.menubar = QMenu(self) self.setMenu(self.menubar) self.setIcon(QIcon(icons + 'menu')) self.setStyleSheet("""QPushButton{border: none; background-color: transparent; padding: 0px}""") fileMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", 'File')) editMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", 'Edit')) viewMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", 'View')) downloadMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", 'Download')) queueMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", 'Queue')) videoFinderMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", 'Video Finder')) helpMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", 'Help')) sortMenu = viewMenu.addMenu(QCoreApplication.translate("mainwindow_ui_tr", 'Sort by')) videoFinderMenu.addAction(self.parent.videoFinderAddLinkAction) downloadMenu.addAction(self.parent.stopAllAction) sortMenu.addAction(self.parent.sort_file_name_Action) sortMenu.addAction(self.parent.sort_file_size_Action) sortMenu.addAction(self.parent.sort_first_try_date_Action) sortMenu.addAction(self.parent.sort_last_try_date_Action) sortMenu.addAction(self.parent.sort_download_status_Action) viewMenu.addAction(self.parent.trayAction) viewMenu.addAction(self.parent.showMenuBarAction) viewMenu.addAction(self.parent.showSidePanelAction) viewMenu.addAction(self.parent.minimizeAction) fileMenu.addAction(self.parent.addlinkAction) fileMenu.addAction(self.parent.addtextfileAction) fileMenu.addAction(self.parent.addFromClipboardAction) downloadMenu.addAction(self.parent.resumeAction) downloadMenu.addAction(self.parent.pauseAction) downloadMenu.addAction(self.parent.stopAction) downloadMenu.addAction(self.parent.propertiesAction) downloadMenu.addAction(self.parent.progressAction) fileMenu.addAction(self.parent.openFileAction) fileMenu.addAction(self.parent.openDownloadFolderAction) fileMenu.addAction(self.parent.openDefaultDownloadFolderAction) fileMenu.addAction(self.parent.exitAction) editMenu.addAction(self.parent.clearAction) editMenu.addAction(self.parent.removeSelectedAction) editMenu.addAction(self.parent.deleteSelectedAction) queueMenu.addAction(self.parent.createQueueAction) queueMenu.addAction(self.parent.removeQueueAction) queueMenu.addAction(self.parent.startQueueAction) queueMenu.addAction(self.parent.stopQueueAction) queueMenu.addAction(self.parent.moveUpSelectedAction) queueMenu.addAction(self.parent.moveDownSelectedAction) editMenu.addAction(self.parent.preferencesAction) helpMenu.addAction(self.parent.aboutAction) helpMenu.addAction(self.parent.issueAction) helpMenu.addAction(self.parent.logAction) helpMenu.addAction(self.parent.helpAction) # viewMenu submenus # DownloadTableWidget Class adds QMenu to QTableWidget Class class DownloadTableWidget(QTableWidget): def __init__(self, parent): super().__init__() # set ui direction ui_direction = parent.persepolis_setting.value('ui_direction') if ui_direction == 'rtl': self.setLayoutDirection(Qt.RightToLeft) elif ui_direction in 'ltr': self.setLayoutDirection(Qt.LeftToRight) # creating context menu self.tablewidget_menu = QMenu(self) self.sendMenu = self.tablewidget_menu.addMenu('') # don't wrap items self.setWordWrap(False) def contextMenuEvent(self, event): self.tablewidget_menu.popup(QCursor.pos()) # CategoryTreeView Class adds QMenu to QTreeView class CategoryTreeView(QTreeView): def __init__(self, parent): super().__init__() # set ui direction ui_direction = parent.persepolis_setting.value('ui_direction') if ui_direction == 'rtl': self.setLayoutDirection(Qt.RightToLeft) elif ui_direction in 'ltr': self.setLayoutDirection(Qt.LeftToRight) # creating context menu self.category_tree_menu = QMenu(self) # connecting activation event self.activated.connect(parent.categoryTreeSelected) self.pressed.connect(parent.categoryTreeSelected) def contextMenuEvent(self, event): self.category_tree_menu.popup(QCursor.pos()) class MainWindow_Ui(QMainWindow): def __init__(self, persepolis_setting): super().__init__() # MainWindow self.persepolis_setting = persepolis_setting # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) # set ui direction ui_direction = self.persepolis_setting.value('ui_direction') if ui_direction == 'rtl': self.setLayoutDirection(Qt.RightToLeft) elif ui_direction in 'ltr': self.setLayoutDirection(Qt.LeftToRight) icons = ':/' + \ str(self.persepolis_setting.value('settings/icons')) + '/' self.setWindowTitle(QCoreApplication.translate("mainwindow_ui_tr", "Persepolis Download Manager")) self.setWindowIcon(QIcon.fromTheme('persepolis', QIcon(':/com.github.persepolisdm.persepolis.svg'))) self.centralwidget = QWidget(self) self.verticalLayout = QVBoxLayout(self.centralwidget) # enable drag and drop self.setAcceptDrops(True) # frame self.frame = QFrame(self.centralwidget) # download_table_horizontalLayout download_table_horizontalLayout = QHBoxLayout() horizontal_splitter = QSplitter(Qt.Horizontal) vertical_splitter = QSplitter(Qt.Vertical) # category_tree self.category_tree_qwidget = QWidget(self) category_tree_verticalLayout = QVBoxLayout() self.category_tree = CategoryTreeView(self) category_tree_verticalLayout.addWidget(self.category_tree) self.category_tree_model = QStandardItemModel() self.category_tree.setModel(self.category_tree_model) category_table_header = [QCoreApplication.translate("mainwindow_ui_tr", 'Category')] self.category_tree_model.setHorizontalHeaderLabels( category_table_header) self.category_tree.header().setStretchLastSection(True) self.category_tree.header().setDefaultAlignment(Qt.AlignCenter) # queue_panel self.queue_panel_widget = QWidget(self) queue_panel_verticalLayout_main = QVBoxLayout(self.queue_panel_widget) # queue_panel_show_button self.queue_panel_show_button = QPushButton(self) queue_panel_verticalLayout_main.addWidget(self.queue_panel_show_button) # queue_panel_widget_frame self.queue_panel_widget_frame = QFrame(self) self.queue_panel_widget_frame.setFrameShape(QFrame.StyledPanel) self.queue_panel_widget_frame.setFrameShadow(QFrame.Raised) queue_panel_verticalLayout_main.addWidget( self.queue_panel_widget_frame) queue_panel_verticalLayout = QVBoxLayout(self.queue_panel_widget_frame) queue_panel_verticalLayout_main.setContentsMargins(50, -1, 50, -1) # start_end_frame self.start_end_frame = QFrame(self) # start time start_verticalLayout = QVBoxLayout(self.start_end_frame) self.start_checkBox = QCheckBox(self) start_verticalLayout.addWidget(self.start_checkBox) self.start_frame = QFrame(self) self.start_frame.setFrameShape(QFrame.StyledPanel) self.start_frame.setFrameShadow(QFrame.Raised) start_frame_verticalLayout = QVBoxLayout(self.start_frame) self.start_time_qDataTimeEdit = MyQDateTimeEdit(self.start_frame) self.start_time_qDataTimeEdit.setDisplayFormat('H:mm') start_frame_verticalLayout.addWidget(self.start_time_qDataTimeEdit) start_verticalLayout.addWidget(self.start_frame) # end time self.end_checkBox = QCheckBox(self) start_verticalLayout.addWidget(self.end_checkBox) self.end_frame = QFrame(self) self.end_frame.setFrameShape(QFrame.StyledPanel) self.end_frame.setFrameShadow(QFrame.Raised) end_frame_verticalLayout = QVBoxLayout(self.end_frame) self.end_time_qDateTimeEdit = MyQDateTimeEdit(self.end_frame) self.end_time_qDateTimeEdit.setDisplayFormat('H:mm') end_frame_verticalLayout.addWidget(self.end_time_qDateTimeEdit) start_verticalLayout.addWidget(self.end_frame) self.reverse_checkBox = QCheckBox(self) start_verticalLayout.addWidget(self.reverse_checkBox) queue_panel_verticalLayout.addWidget(self.start_end_frame) # limit_after_frame self.limit_after_frame = QFrame(self) # limit_checkBox limit_verticalLayout = QVBoxLayout(self.limit_after_frame) # limit_frame self.limit_frame = QFrame(self) self.limit_frame.setFrameShape(QFrame.StyledPanel) self.limit_frame.setFrameShadow(QFrame.Raised) limit_verticalLayout.addWidget(self.limit_frame) limit_frame_verticalLayout = QVBoxLayout(self.limit_frame) # limit_dial and limit_label self.limit_dial = QDial(self.limit_frame) self.limit_dial.setNotchesVisible(True) self.limit_dial.setMaximum(10) self.limit_dial.setMinimum(0) limit_frame_verticalLayout.addWidget(self.limit_dial) self.limit_label = QLabel(self.limit_frame) limit_frame_verticalLayout.addWidget(self.limit_label) # after_checkBox self.after_checkBox = QCheckBox(self) limit_verticalLayout.addWidget(self.after_checkBox) # after_frame self.after_frame = QFrame(self) self.after_frame.setFrameShape(QFrame.StyledPanel) self.after_frame.setFrameShadow(QFrame.Raised) limit_verticalLayout.addWidget(self.after_frame) after_frame_verticalLayout = QVBoxLayout(self.after_frame) # after_comboBox self.after_comboBox = QComboBox(self) self.after_comboBox.addItem("") after_frame_verticalLayout.addWidget(self.after_comboBox) # after_pushButton self.after_pushButton = QPushButton(self) after_frame_verticalLayout.addWidget(self.after_pushButton) queue_panel_verticalLayout.addWidget(self.limit_after_frame) category_tree_verticalLayout.addWidget(self.queue_panel_widget) # keep_awake_checkBox self.keep_awake_checkBox = QCheckBox(self) queue_panel_verticalLayout.addWidget(self.keep_awake_checkBox) self.category_tree_qwidget.setLayout(category_tree_verticalLayout) horizontal_splitter.addWidget(self.category_tree_qwidget) # download table widget self.download_table_content_widget = QWidget(self) download_table_content_widget_verticalLayout = QVBoxLayout( self.download_table_content_widget) # download_table self.download_table = DownloadTableWidget(self) vertical_splitter.addWidget(self.download_table) horizontal_splitter.addWidget(self.download_table_content_widget) self.download_table.setColumnCount(13) self.download_table.setSelectionBehavior(QAbstractItemView.SelectRows) self.download_table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.download_table.verticalHeader().hide() # hide column of GID and column of link. self.download_table.setColumnHidden(8, True) self.download_table.setColumnHidden(9, True) download_table_header = [QCoreApplication.translate("mainwindow_ui_tr", 'File Name'), QCoreApplication.translate("mainwindow_ui_tr", 'Status'), QCoreApplication.translate("mainwindow_ui_tr", 'Size'), QCoreApplication.translate("mainwindow_ui_tr", 'Downloaded'), QCoreApplication.translate("mainwindow_ui_tr", 'Percentage'), QCoreApplication.translate("mainwindow_ui_tr", 'Connections'), QCoreApplication.translate("mainwindow_ui_tr", 'Transfer Rate'), QCoreApplication.translate("mainwindow_ui_tr", 'Estimated Time Left'), 'Gid', QCoreApplication.translate("mainwindow_ui_tr", 'Link'), QCoreApplication.translate("mainwindow_ui_tr", 'First Try Date'), QCoreApplication.translate("mainwindow_ui_tr", 'Last Try Date'), QCoreApplication.translate("mainwindow_ui_tr", 'Category')] self.download_table.setHorizontalHeaderLabels(download_table_header) # fixing the size of download_table when window is Maximized! self.download_table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Interactive) self.download_table.horizontalHeader().setStretchLastSection(True) horizontal_splitter.setStretchFactor(0, 3) # category_tree width horizontal_splitter.setStretchFactor(1, 10) # ratio of tables's width # video_finder_widget self.video_finder_widget = QWidget(self) video_finder_horizontalLayout = QHBoxLayout(self.video_finder_widget) self.muxing_pushButton = QPushButton(self) self.muxing_pushButton.setIcon(QIcon(icons + 'video_finder')) video_finder_horizontalLayout.addWidget(self.muxing_pushButton) video_finder_horizontalLayout.addSpacing(20) video_audio_verticalLayout = QVBoxLayout() self.video_label = QLabel(self) video_audio_verticalLayout.addWidget(self.video_label) self.audio_label = QLabel(self) video_audio_verticalLayout.addWidget(self.audio_label) video_finder_horizontalLayout.addLayout(video_audio_verticalLayout) status_muxing_verticalLayout = QVBoxLayout() self.video_finder_status_label = QLabel(self) status_muxing_verticalLayout.addWidget(self.video_finder_status_label) self.muxing_status_label = QLabel(self) status_muxing_verticalLayout.addWidget(self.muxing_status_label) video_finder_horizontalLayout.addLayout(status_muxing_verticalLayout) vertical_splitter.addWidget(self.video_finder_widget) download_table_content_widget_verticalLayout.addWidget(vertical_splitter) download_table_horizontalLayout.addWidget(horizontal_splitter) self.frame.setLayout(download_table_horizontalLayout) self.verticalLayout.addWidget(self.frame) self.setCentralWidget(self.centralwidget) # menubar self.menubar = QMenuBar(self) self.menubar.setGeometry(QRect(0, 0, 600, 24)) self.setMenuBar(self.menubar) fileMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", '&File')) editMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", '&Edit')) viewMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", '&View')) downloadMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", '&Download')) queueMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", '&Queue')) videoFinderMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", 'V&ideo Finder')) helpMenu = self.menubar.addMenu(QCoreApplication.translate("mainwindow_ui_tr", '&Help')) # viewMenu submenus sortMenu = viewMenu.addMenu(QCoreApplication.translate("mainwindow_ui_tr", 'Sort by')) # statusbar self.statusbar = QStatusBar(self) self.setStatusBar(self.statusbar) self.statusbar.showMessage(QCoreApplication.translate("mainwindow_ui_tr", "Persepolis Download Manager")) # toolBar self.toolBar2 = QToolBar(self) self.addToolBar(Qt.TopToolBarArea, self.toolBar2) # self.toolBar2.setWindowTitle(QCoreApplication.translate("mainwindow_ui_tr", 'Menu')) self.toolBar2.setFloatable(False) self.toolBar2.setMovable(False) self.toolBar = QToolBar(self) self.addToolBar(Qt.TopToolBarArea, self.toolBar) # self.toolBar.setWindowTitle(QCoreApplication.translate("mainwindow_ui_tr", 'Toolbar')) self.toolBar.setFloatable(False) self.toolBar.setMovable(False) # toolBar and menubar and actions self.persepolis_setting.beginGroup('settings/shortcuts') # videoFinderAddLinkAction self.videoFinderAddLinkAction = QAction(QIcon(icons + 'video_finder'), QCoreApplication.translate("mainwindow_ui_tr", 'Find Video Links...'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Download video or audio from Youtube, Vimeo, etc.'), triggered=self.showVideoFinderAddLinkWindow) self.videoFinderAddLinkAction_shortcut = QShortcut(self.persepolis_setting.value( 'video_finder_shortcut'), self, self.showVideoFinderAddLinkWindow) videoFinderMenu.addAction(self.videoFinderAddLinkAction) # stopAllAction self.stopAllAction = QAction(QIcon(icons + 'stop_all'), QCoreApplication.translate("mainwindow_ui_tr", 'Stop All Active Downloads'), self, statusTip='Stop All Active Downloads', triggered=self.stopAllDownloads) downloadMenu.addAction(self.stopAllAction) # sort_file_name_Action self.sort_file_name_Action = QAction( QCoreApplication.translate("mainwindow_ui_tr", 'File Name'), self, triggered=self.sortByName) sortMenu.addAction(self.sort_file_name_Action) # sort_file_size_Action self.sort_file_size_Action = QAction( QCoreApplication.translate("mainwindow_ui_tr", 'File Size'), self, triggered=self.sortBySize) sortMenu.addAction(self.sort_file_size_Action) # sort_first_try_date_Action self.sort_first_try_date_Action = QAction( QCoreApplication.translate("mainwindow_ui_tr", 'First Try Date'), self, triggered=self.sortByFirstTry) sortMenu.addAction(self.sort_first_try_date_Action) # sort_last_try_date_Action self.sort_last_try_date_Action = QAction( QCoreApplication.translate("mainwindow_ui_tr", 'Last Try Date'), self, triggered=self.sortByLastTry) sortMenu.addAction(self.sort_last_try_date_Action) # sort_download_status_Action self.sort_download_status_Action = QAction( QCoreApplication.translate("mainwindow_ui_tr", 'Download Status'), self, triggered=self.sortByStatus) sortMenu.addAction(self.sort_download_status_Action) # trayAction self.trayAction = QAction(QCoreApplication.translate("mainwindow_ui_tr", 'Show System Tray Icon'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Show/Hide system tray icon"), triggered=self.showTray) self.trayAction.setCheckable(True) viewMenu.addAction(self.trayAction) # showMenuBarAction self.showMenuBarAction = QAction( QCoreApplication.translate("mainwindow_ui_tr", 'Show Menubar'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Show Menubar'), triggered=self.showMenuBar) self.showMenuBarAction.setCheckable(True) viewMenu.addAction(self.showMenuBarAction) # showSidePanelAction self.showSidePanelAction = QAction( QCoreApplication.translate("mainwindow_ui_tr", 'Show Side Panel'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Show Side Panel'), triggered=self.showSidePanel) self.showSidePanelAction.setCheckable(True) viewMenu.addAction(self.showSidePanelAction) # minimizeAction self.minimizeAction = QAction(QIcon(icons + 'minimize'), QCoreApplication.translate("mainwindow_ui_tr", 'Minimize to System Tray'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Minimize to System Tray"), triggered=self.minMaxTray) self.minimizeAction_shortcut = QShortcut( self.persepolis_setting.value('hide_window_shortcut'), self, self.minMaxTray) viewMenu.addAction(self.minimizeAction) # addlinkAction self.addlinkAction = QAction(QIcon(icons + 'add'), QCoreApplication.translate("mainwindow_ui_tr", 'Add New Download Link...'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Add New Download Link"), triggered=self.addLinkButtonPressed) self.addlinkAction_shortcut = QShortcut(self.persepolis_setting.value( 'add_new_download_shortcut'), self, self.addLinkButtonPressed) fileMenu.addAction(self.addlinkAction) # importText self.addtextfileAction = QAction(QIcon(icons + 'file'), QCoreApplication.translate("mainwindow_ui_tr", 'Import Links from Text File...'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Create a text file and put links in it, line by line!'), triggered=self.importText) self.addtextfileAction_shortcut = QShortcut( self.persepolis_setting.value('import_text_shortcut'), self, self.importText) fileMenu.addAction(self.addtextfileAction) # importText From Clipboard self.addFromClipboardAction = QAction(QIcon(icons + 'clipboard'), QCoreApplication.translate("mainwindow_ui_tr", 'Import Links from Clipboard...'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Import Links From Clipboard'), triggered=self.importLinksFromClipboard) fileMenu.addAction(self.addFromClipboardAction) # resumeAction self.resumeAction = QAction(QIcon(icons + 'play'), QCoreApplication.translate("mainwindow_ui_tr", 'Resume Download'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Resume Download"), triggered=self.resumeButtonPressed) downloadMenu.addAction(self.resumeAction) # pauseAction self.pauseAction = QAction(QIcon(icons + 'pause'), QCoreApplication.translate("mainwindow_ui_tr", 'Pause Download'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Pause Download"), triggered=self.pauseButtonPressed) downloadMenu.addAction(self.pauseAction) # stopAction self.stopAction = QAction(QIcon(icons + 'stop'), QCoreApplication.translate("mainwindow_ui_tr", 'Stop Download'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Stop/Cancel Download"), triggered=self.stopButtonPressed) downloadMenu.addAction(self.stopAction) # propertiesAction self.propertiesAction = QAction(QIcon(icons + 'setting'), QCoreApplication.translate("mainwindow_ui_tr", 'Properties'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Properties"), triggered=self.propertiesButtonPressed) downloadMenu.addAction(self.propertiesAction) # progressAction self.progressAction = QAction(QIcon(icons + 'window'), QCoreApplication.translate("mainwindow_ui_tr", 'Progress'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Progress"), triggered=self.progressButtonPressed) downloadMenu.addAction(self.progressAction) # openFileAction self.openFileAction = QAction(QIcon( icons + 'file'), QCoreApplication.translate("mainwindow_ui_tr", 'Open File...'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Open File...'), triggered=self.openFile) fileMenu.addAction(self.openFileAction) # openDownloadFolderAction self.openDownloadFolderAction = QAction(QIcon( icons + 'folder'), QCoreApplication.translate("mainwindow_ui_tr", 'Open Download Folder'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Open Download Folder'), triggered=self.openDownloadFolder) fileMenu.addAction(self.openDownloadFolderAction) # openDefaultDownloadFolderAction self.openDefaultDownloadFolderAction = QAction(QIcon( icons + 'folder'), QCoreApplication.translate("mainwindow_ui_tr", 'Open Default Download Folder'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Open Default Download Folder'), triggered=self.openDefaultDownloadFolder) fileMenu.addAction(self.openDefaultDownloadFolderAction) # exitAction self.exitAction = QAction(QIcon(icons + 'exit'), QCoreApplication.translate("mainwindow_ui_tr", 'Exit'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Exit"), triggered=self.closeAction) self.exitAction_shortcut = QShortcut(self.persepolis_setting.value('quit_shortcut'), self, self.closeAction) fileMenu.addAction(self.exitAction) # clearAction self.clearAction = QAction(QIcon(icons + 'multi_remove'), QCoreApplication.translate("mainwindow_ui_tr", 'Clear Download List'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Clear all items in download list'), triggered=self.clearDownloadList) editMenu.addAction(self.clearAction) # removeSelectedAction self.removeSelectedAction = QAction(QIcon(icons + 'remove'), QCoreApplication.translate("mainwindow_ui_tr", 'Remove Selected Downloads from List'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Remove Selected Downloads from List'), triggered=self.removeSelected) self.removeSelectedAction_shortcut = QShortcut( self.persepolis_setting.value('remove_shortcut'), self, self.removeSelected) editMenu.addAction(self.removeSelectedAction) self.removeSelectedAction.setEnabled(False) # deleteSelectedAction self.deleteSelectedAction = QAction(QIcon(icons + 'trash'), QCoreApplication.translate("mainwindow_ui_tr", 'Delete Selected Download Files'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Delete Selected Download Files'), triggered=self.deleteSelected) self.deleteSelectedAction_shortcut = QShortcut( self.persepolis_setting.value('delete_shortcut'), self, self.deleteSelected) editMenu.addAction(self.deleteSelectedAction) self.deleteSelectedAction.setEnabled(False) # moveSelectedDownloadsAction self.moveSelectedDownloadsAction = QAction(QIcon(icons + 'folder'), QCoreApplication.translate("mainwindow_ui_tr", 'Move Selected Download Files to Another Folder...'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Move Selected Download Files to Another Folder'), triggered=self.moveSelectedDownloads) editMenu.addAction(self.moveSelectedDownloadsAction) self.moveSelectedDownloadsAction.setEnabled(False) # createQueueAction self.createQueueAction = QAction(QIcon(icons + 'add_queue'), QCoreApplication.translate("mainwindow_ui_tr", 'Create New Queue...'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Create new download queue'), triggered=self.createQueue) queueMenu.addAction(self.createQueueAction) # removeQueueAction self.removeQueueAction = QAction(QIcon(icons + 'remove_queue'), QCoreApplication.translate("mainwindow_ui_tr", 'Remove Queue'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Remove this queue'), triggered=self.removeQueue) queueMenu.addAction(self.removeQueueAction) # startQueueAction self.startQueueAction = QAction(QIcon( icons + 'start_queue'), QCoreApplication.translate("mainwindow_ui_tr", 'Start this queue'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Start Queue'), triggered=self.startQueue) queueMenu.addAction(self.startQueueAction) # stopQueueAction self.stopQueueAction = QAction(QIcon( icons + 'stop_queue'), QCoreApplication.translate("mainwindow_ui_tr", 'Stop this queue'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Stop Queue'), triggered=self.stopQueue) queueMenu.addAction(self.stopQueueAction) # moveUpSelectedAction self.moveUpSelectedAction = QAction(QIcon(icons + 'multi_up'), QCoreApplication.translate("mainwindow_ui_tr", 'Move Selected Items Up'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Move currently selected items up by one row'), triggered=self.moveUpSelected) self.moveUpSelectedAction_shortcut = QShortcut(self.persepolis_setting.value( 'move_up_selection_shortcut'), self, self.moveUpSelected) queueMenu.addAction(self.moveUpSelectedAction) # moveDownSelectedAction self.moveDownSelectedAction = QAction(QIcon(icons + 'multi_down'), QCoreApplication.translate("mainwindow_ui_tr", 'Move Selected Items Down'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Move currently selected items down by one row'), triggered=self.moveDownSelected) self.moveDownSelectedAction_shortcut = QShortcut(self.persepolis_setting.value( 'move_down_selection_shortcut'), self, self.moveDownSelected) queueMenu.addAction(self.moveDownSelectedAction) # preferencesAction self.preferencesAction = QAction(QIcon(icons + 'preferences'), QCoreApplication.translate("mainwindow_ui_tr", 'Preferences'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Preferences'), triggered=self.openPreferences, menuRole=QAction.MenuRole.PreferencesRole) editMenu.addAction(self.preferencesAction) # aboutAction self.aboutAction = QAction(QIcon( icons + 'about'), QCoreApplication.translate("mainwindow_ui_tr", 'About'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'About'), triggered=self.openAbout, menuRole=QAction.MenuRole.AboutRole) helpMenu.addAction(self.aboutAction) # issueAction self.issueAction = QAction(QIcon(icons + 'about'), QCoreApplication.translate("mainwindow_ui_tr", 'Report an Issue'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Report an issue'), triggered=self.reportIssue) helpMenu.addAction(self.issueAction) # logAction self.logAction = QAction(QIcon(icons + 'about'), QCoreApplication.translate("mainwindow_ui_tr", 'Show Log File'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Help'), triggered=self.showLog) helpMenu.addAction(self.logAction) # helpAction self.helpAction = QAction(QIcon(icons + 'about'), QCoreApplication.translate("mainwindow_ui_tr", 'Help'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Help'), triggered=self.persepolisHelp) helpMenu.addAction(self.helpAction) self.persepolis_setting.endGroup() self.qmenu = MenuWidget(self) self.toolBar2.addWidget(self.qmenu) # labels self.queue_panel_show_button.setText(QCoreApplication.translate("mainwindow_ui_tr", "Hide Options")) self.start_checkBox.setText(QCoreApplication.translate("mainwindow_ui_tr", "Start Time")) self.end_checkBox.setText(QCoreApplication.translate("mainwindow_ui_tr", "End Time")) self.reverse_checkBox.setText(QCoreApplication.translate( "mainwindow_ui_tr", "Download bottom of\n the list first")) self.after_checkBox.setText(QCoreApplication.translate("mainwindow_ui_tr", "After download")) self.after_comboBox.setItemText(0, QCoreApplication.translate("mainwindow_ui_tr", "Shut Down")) self.keep_awake_checkBox.setText(QCoreApplication.translate("mainwindow_ui_tr", "Keep System Awake!")) self.keep_awake_checkBox.setToolTip( QCoreApplication.translate("mainwindow_ui_tr", "

This option will prevent the system from going to sleep.\ It is necessary if your power manager is suspending the system automatically.

")) self.after_pushButton.setText(QCoreApplication.translate("mainwindow_ui_tr", "Apply")) self.muxing_pushButton.setText(QCoreApplication.translate("mainwindow_ui_tr", "Start Mixing")) self.video_label.setText(QCoreApplication.translate("mainwindow_ui_tr", "Video File Status: ")) self.audio_label.setText(QCoreApplication.translate("mainwindow_ui_tr", "Audio File Status: ")) self.video_finder_status_label.setText(QCoreApplication.translate("mainwindow_ui_tr", "Status: ")) self.muxing_status_label.setText(QCoreApplication.translate("mainwindow_ui_tr", "Mixing status: ")) ================================================ FILE: persepolis/gui/progress_ui.py ================================================ # -*- coding: utf-8 -*- # 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 . try: from PySide6.QtWidgets import QDial, QCheckBox, QProgressBar, QFrame, QComboBox, QWidget, QTabWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel from PySide6.QtCore import Qt, QTranslator, QCoreApplication, QLocale, QSize, QThread, Signal from PySide6.QtGui import QIcon except ImportError: from PyQt5.QtWidgets import QDial, QCheckBox, QProgressBar, QFrame, QComboBox, QWidget, QTabWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel from PyQt5.QtCore import Qt, QTranslator, QCoreApplication, QLocale, QSize, QThread from PyQt5.QtCore import pyqtSignal as Signal from PyQt5.QtGui import QIcon from persepolis.gui import resources import time class UpdateProgressBarThread(QThread): UPDATEPROGRESSBAR = Signal(int) def __init__(self, parent, new_value): QThread.__init__(self) self.new_value = new_value self.parent = parent def run(self): dif = self.new_value - self.parent.value() while self.parent.value() != self.new_value: if dif < 0: self.UPDATEPROGRESSBAR.emit((self.parent.value() - 1)) time.sleep(0.1 / (dif * -1)) elif dif > 0: self.UPDATEPROGRESSBAR.emit((self.parent.value() + 1)) time.sleep(0.1 / dif) self.parent.update_lock = False # This widget updated more smoothly than QProgressBar class MyProgressBar(QProgressBar): def __init__(self, main_window): super().__init__() self.setValue(0) self.setMaximum(100) self.update_lock = False self.main_window = main_window def showBusyIndicator(self): # Show busy indicator self.setMaximum(0) self.setMinimum(0) def setValueSmoothly(self, new_value): # Show busy indicator self.setMaximum(100) self.setMinimum(0) if new_value == 100: self.setValue(100) return if self.update_lock: return self.update_lock = True update_progress_bar = UpdateProgressBarThread(self, new_value) update_progress_bar.UPDATEPROGRESSBAR.connect(self.setValueSmoothly2) self.main_window.threadPool.append(update_progress_bar) self.main_window.threadPool[-1].start() def setValueSmoothly2(self, value): self.setValue(value) class ProgressWindow_Ui(QWidget): def __init__(self, persepolis_setting, parent): super().__init__() self.persepolis_setting = persepolis_setting icons = ':/' + str(persepolis_setting.value('settings/icons')) + '/' # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) # set ui direction ui_direction = self.persepolis_setting.value('ui_direction') if ui_direction == 'rtl': self.setLayoutDirection(Qt.RightToLeft) elif ui_direction in 'ltr': self.setLayoutDirection(Qt.LeftToRight) # window self.setMinimumSize(QSize(595, 284)) self.setWindowIcon(QIcon.fromTheme('persepolis', QIcon(':/com.github.persepolisdm.persepolis.svg'))) self.setWindowTitle(QCoreApplication.translate("progress_ui_tr", "Persepolis Download Manager")) verticalLayout = QVBoxLayout(self) # progress_tabWidget self.progress_tabWidget = QTabWidget(self) # information_tab self.information_tab = QWidget() information_verticalLayout = QVBoxLayout(self.information_tab) # link_label self.link_label = QLabel(self.information_tab) information_verticalLayout.addWidget(self.link_label) # status_label self.status_label = QLabel(self.information_tab) information_verticalLayout.addWidget(self.status_label) # downloaded_label self.downloaded_label = QLabel(self.information_tab) information_verticalLayout.addWidget(self.downloaded_label) # rate_label self.rate_label = QLabel(self.information_tab) information_verticalLayout.addWidget(self.rate_label) # time_label self.time_label = QLabel(self.information_tab) information_verticalLayout.addWidget(self.time_label) # connections_label self.connections_label = QLabel(self.information_tab) information_verticalLayout.addWidget(self.connections_label) information_verticalLayout.addStretch(1) # add information_tab to progress_tabWidget self.progress_tabWidget.addTab(self.information_tab, "") # options_tab self.options_tab = QWidget() options_tab_verticalLayout = QVBoxLayout(self.options_tab) options_tab_horizontalLayout = QHBoxLayout() # options_tab_horizontalLayout.setContentsMargins(11, 11, 11, 11) # limit speed limit_verticalLayout = QVBoxLayout() # limit_frame self.limit_frame = QFrame(self.options_tab) self.limit_frame.setFrameShape(QFrame.StyledPanel) self.limit_frame.setFrameShadow(QFrame.Raised) limit_frame_verticalLayout = QVBoxLayout(self.limit_frame) limit_frame_horizontalLayout = QHBoxLayout() # limit dial and label self.limit_dial = QDial(self.limit_frame) self.limit_dial.setNotchesVisible(True) self.limit_dial.setMaximum(10) self.limit_dial.setMinimum(0) self.limit_label = QLabel(self.limit_frame) limit_frame_verticalLayout.addWidget(self.limit_dial) limit_frame_verticalLayout.addWidget(self.limit_label) limit_frame_verticalLayout.addLayout(limit_frame_horizontalLayout) limit_verticalLayout.addWidget(self.limit_frame) limit_verticalLayout.setContentsMargins(11, 11, 11, 11) options_tab_horizontalLayout.addLayout(limit_verticalLayout) options_tab_verticalLayout.addLayout(options_tab_horizontalLayout) options_tab_verticalLayout.addStretch(1) # after_checkBox self.after_checkBox = QCheckBox(self.options_tab) after_verticalLayout = QVBoxLayout() after_verticalLayout.addWidget(self.after_checkBox) # after_frame self.after_frame = QFrame(self.options_tab) self.after_frame.setFrameShape(QFrame.StyledPanel) self.after_frame.setFrameShadow(QFrame.Raised) after_frame_verticalLayout = QVBoxLayout(self.after_frame) # after_comboBox self.after_comboBox = QComboBox(self.options_tab) self.after_comboBox.addItem("") after_frame_verticalLayout.addWidget(self.after_comboBox) # after_pushButton self.after_pushButton = QPushButton(self.options_tab) after_frame_verticalLayout.addWidget(self.after_pushButton) after_verticalLayout.addWidget(self.after_frame) after_verticalLayout.setContentsMargins(11, 11, 11, 11) options_tab_horizontalLayout.addLayout(after_verticalLayout) self.progress_tabWidget.addTab(self.options_tab, "") verticalLayout.addWidget(self.progress_tabWidget) # download_progressBar self.download_progressBar = MyProgressBar(parent) verticalLayout.addWidget(self.download_progressBar) self.download_progressBar.setTextVisible(True) # changing the alignment of progress bar self.download_progressBar.setAlignment(Qt.AlignCenter) self.download_progressBar.setFormat("%p%") # buttons button_horizontalLayout = QHBoxLayout() button_horizontalLayout.addStretch(1) # resume_pushButton self.resume_pushButton = QPushButton(self) self.resume_pushButton.setIcon(QIcon(icons + 'play')) button_horizontalLayout.addWidget(self.resume_pushButton) # pause_pushButton self.pause_pushButton = QPushButton(self) self.pause_pushButton.setIcon(QIcon(icons + 'pause')) button_horizontalLayout.addWidget(self.pause_pushButton) # stop_pushButton self.stop_pushButton = QPushButton(self) self.stop_pushButton.setIcon(QIcon(icons + 'stop')) button_horizontalLayout.addWidget(self.stop_pushButton) verticalLayout.addLayout(button_horizontalLayout) self.progress_tabWidget.setCurrentIndex(0) # labels self.link_label.setText(QCoreApplication.translate("progress_ui_tr", "Link: ")) self.status_label.setText(QCoreApplication.translate("progress_ui_tr", "Status: ")) self.downloaded_label.setText(QCoreApplication.translate("progress_ui_tr", "Downloaded:")) self.rate_label.setText(QCoreApplication.translate("progress_ui_tr", "Transfer rate: ")) self.time_label.setText(QCoreApplication.translate("progress_ui_tr", "Estimated time left:")) self.connections_label.setText(QCoreApplication.translate("progress_ui_tr", "Number of connections: ")) self.progress_tabWidget.setTabText(self.progress_tabWidget.indexOf( self.information_tab), QCoreApplication.translate("progress_ui_tr", "Download Information")) self.after_checkBox.setText(QCoreApplication.translate("progress_ui_tr", "After download")) self.after_comboBox.setItemText(0, QCoreApplication.translate("progress_ui_tr", "Shut Down")) self.progress_tabWidget.setTabText( self.progress_tabWidget.indexOf(self.options_tab), QCoreApplication.translate("progress_ui_tr", "Download Options")) self.resume_pushButton.setText(QCoreApplication.translate("progress_ui_tr", "Resume")) self.pause_pushButton.setText(QCoreApplication.translate("progress_ui_tr", "Pause")) self.stop_pushButton.setText(QCoreApplication.translate("progress_ui_tr", "Stop")) self.after_pushButton.setText(QCoreApplication.translate("progress_ui_tr", "Apply")) ================================================ FILE: persepolis/gui/resources.py ================================================ # Resource object code (Python 3) # Created by: object code # Created by: The Resource Compiler for Qt version 6.9.1 # WARNING! All changes made in this file will be lost! try: from PySide6 import QtCore except ImportError: from PyQt5 import QtCore qt_resource_data = b"\ \x00\x00\x0d*\ A\ rabic:\x0d\x0aMajdi So\ bain MajdiSobain\ \x0d\x0aSaleh Alanazi \ Sal7_one\x0d\x0arayanm\ \x0d\x0aRex_sa rex07\x0d\x0a\ Simo simonetwork\ ing\x0d\x0a\xe6\x98\x8e \xe5\xbc\xa0 zhu\ angsha19740612 \x0d\ \x0a\x0d\x0a\x0d\x0aChinese (Ch\ ina): \x0d\x0a0day 0 0\ day\x0d\x0azyppe 210hc\ l\x0d\x0a\xe5\x93\xa5\xe5\x93\xa5 \xe5\xa5\xbd 48\ 5250464\x0d\x0a\xe6\xb1\x9f \xe7\x8e\x8b\ 664766245\x0d\x0ax x \ 731515713\x0d\x0aCharl\ ey Yang CharleyY\ \x0d\x0aAlan Yee Choye\ e\x0d\x0aYonghui Chen \ ColoPaul\x0d\x0aSY C D\ arciaLee_066\x0d\x0aHi\ yool\x0d\x0aJ L JULIAN\ LEEEEE\x0d\x0aJack Su \ JackSu\x0d\x0a\xe5\xbf\xab\xe4\xb9\x90\xe7\x9a\ \x84\xe8\x80\x81\xe9\xbc\xa0\xe5\xae\x9d\xe5\xae\x9d La\ oShuBaby\x0d\x0ahaonan\ li Li_haonan\x0d\x0aL\ iro Liu Liro\x0d\x0a\xe6\x98\ \x8e\xe9\x98\xb3 \xe8\x92\x8b Lotumn\x0d\ \x0aAllure R Riseup\ \x0d\x0aVento Fang Ven\ to8866\x0d\x0a\xe5\xae\x89\xe5\xa1\x9e\xe6\x96\ \xaf\xe5\xa1\x94 \xe8\x96\x87\xe8\x96\x87\xe5\xae\x89 V\ ivianAncestor\x0d\x0aY\ e Wehchs WehchsY\ e\x0d\x0aK X X_K\x0d\x0aing \ YIn YIning\x0d\x0ayyy \ zzz ZZyyy\x0d\x0a\xe9\xb9\x8f \xe5\ \xbc\xa0 a5357663\x0d\x0ayon\ gkang yang acme9\ 69290422\x0d\x0aAliRez\ a AmirSamimi ali\ reza_amirsamimi\x0d\ \x0aaltria morgan a\ ltria066\x0d\x0aanakin\ micheal anakinl\ t\x0d\x0aarthur \xe9\x9f\xa9 ar\ thurh\x0d\x0aLeon Chen\ bioleon\x0d\x0aGabrie\ lle Chou canonla\ yido\x0d\x0a\xe7\xa6\x85\xe5\x92\x8c \xe6\x9d\x8e\ cc379\x0d\x0aSheng Ch\ eng cs54ysm\x0d\x0aDav\ in davinma\x0d\x0adrhe\ nk Dai drhenkdss\ \x0d\x0aZHAN Dr dts008\ 0\x0d\x0adan chin egg2\ 33\x0d\x0achen chen fa\ lse\x0d\x0ayining fan \ fan211210\x0d\x0akoish\ i a ghostxt0\x0d\x0aZA\ RK LEE godiamgui\ lty\x0d\x0ajiangsheng \ hong hongjiangsh\ eng\x0d\x0adp h huangd\ p\x0d\x0aJackson Hu hu\ ming2207\x0d\x0aW Z ic\ waos\x0d\x0axiang wang\ ifoanle\x0d\x0a\xe6\xb5\xb7\xe9\xbe\x99\ \xe6\xb1\x9f jianghailon\ g\x0d\x0ahaha ha jiang\ weiyang336\x0d\x0a\xe5\xae\xb6\xe4\ \xbf\x8a \xe9\xbb\x84 jiayezhan\ g22\x0d\x0aliu li kuli\ erhao\x0d\x0ak y kyalt\ \x0d\x0aleo xxx leoxxx\ \x0d\x0a\xe6\xb9\x96\xe5\xb9\xbf \xe5\xbb\x96 lia\ ohuguang\x0d\x0alei li\ lilei9587\x0d\x0a\xe6\x97\xad\xe9\ \xba\x92 \xe5\x88\x98 liuxuqi\x0d\x0a\ \xe6\x88\x88\xe6\x89\xac \xe8\xb5\xb5 luciu\ s.z\x0d\x0aqihao mao m\ aoqihao\x0d\x0amonowol\ f Lucas monowolf\ \x0d\x0au muguo muguou\ \x0d\x0aeo L nbnatcom\x0d\ \x0aOra Prinzing pr\ inzingora\x0d\x0as k q\ qwwee\x0d\x0a\xe6\x96\x8c \xe7\x86\x8a q\ w71111520\x0d\x0aJane \ Yang qwe866zxc\x0d\x0a\ Minagawa Hifumi \ reeealin\x0d\x0a354 65\ 48 richard954\x0d\x0ar\ ose tiffany rose\ _tiffany\x0d\x0aCUI SA\ N sanc163sa\x0d\x0a\xe4\xbd\xb3\ \xe4\xba\x8e sheena.ring\ o\x0d\x0aSin Qiu sino1\ 641\x0d\x0agiga d togi\ ga\x0d\x0a\xe6\x80\x9d\xe6\x95\x8f \xe9\xb2\x8d t\ ulipasky\x0d\x0a\xe5\x88\x98 \xe4\xbf\ \x8a\xe5\x90\x9b tusks\x0d\x0awang\ yuehu wangyuehu\ \x0d\x0axinpu wei weix\ inpu\x0d\x0amike willi\ ams williamsguo\x0d\ \x0aT W wt118265734\ 6\x0d\x0axiao wu wu121\ 38\x0d\x0awwj402\x0d\x0acq n\ xiaolu\x0d\x0ayin xia\ o xiaoyinge\x0d\x0a\xe4\xb8\x80\ \xe5\xbc\x98 \xe9\x83\x91 yihong20\ 18\x0d\x0ayoungcrazybo\ y\x0d\x0a\xe5\x8d\x93\xe7\x90\xaa \xe5\x88\x98 yo\ u\xe5\xbf\x97\xe8\x80\x85\x0d\x0aan mu z\ henlailu\x0d\x0along l\ ong zql00l\x0d\x0a\xe9\xaa\x8f\xe4\ \xb8\x80 \xe6\x88\x9a zsns1994\x0d\ \x0a\xe5\xbe\x90 \xe5\xa4\xa7\xe4\xbe\xa0 \xe4\xbc\x8f\xe5\ \x9f\x8e\x0d\x0a\xe4\xb9\xa6\xe7\xbd\x95 \xe5\x90\x91 \xe5\ \xa2\xa8\xe5\xa2\xa8\xe5\xa2\xa8\xe5\xa2\xa8\xe5\xa2\xa8\x0d\x0a\ chuantong xu \xe5\xbe\x90\ \xe4\xbc\xa0\xe7\xbb\x9f\x0d\x0a00 000 \xe6\ \x95\xb7\xe8\xa1\x8d\xe4\xbc\xa4\xe6\x83\x85\x0d\x0a\xe8\x8a\xb1\ \xe5\x8d\xb7 \xe6\x98\xa5 \xe6\x98\xa5\xe8\x8a\xb1\xe5\x8d\ \xb7 \x0d\x0a\x0d\x0a\x0d\x0aGerman (\ de):\x0d\x0aPatrick Me\ ier SonArc\x0d\x0aAndr\ eas Mueller anzb\ ert \x0d\x0a\x0d\x0a\x0d\x0aDutch \ (Netherlands): \x0d\ \x0aHeimen Stoffels\ Vistaus \x0d\x0a\x0d\x0a\x0d\x0aF\ rench (France):\x0d\ \x0aCwpute BipBoup \ cwpute \x0d\x0aSimon P\ orte sporte \x0d\x0a\x0d\x0a\ \x0d\x0aHungarian:\x0d\x0a- \ Totya Totya\x0d\x0a\x0d\x0a\x0d\ \x0aKorean:\x0d\x0aJungHe\ e Lee MarongHapp\ y\x0d\x0a\x0d\x0a\x0d\x0aPersian (\ Iran):\x0d\x0aAliReza \ AmirSamimi alire\ za_amirsamimi\x0d\x0ah\ _r 71 hayyan711\x0d\ \x0aMostafa Bodagh \ mosi2772\x0d\x0aMostaf\ a Asadi mostafaa\ sadi\x0d\x0a\x0d\x0a\x0d\x0aPolish\ (Poland): \x0d\x0aFad\ eMind\x0d\x0aMaurycy B\ \xc5\x82aszczak LuxF3r\ re\x0d\x0aArkadiusz Ro\ g\xc3\xb3\xc5\xbc arcio \x0d\x0a\x0d\x0a\ \x0d\x0aPortuguese:\x0d\x0aA\ ntonio Barbosa A\ lvoErrado2 \x0d\x0a\x0d\x0a\x0d\ \x0aPortuguese (Bra\ zil): \x0d\x0aCirnos G\ ersonzao \x0d\x0aCarlo\ s Henrique De Fr\ eitas Ferreira N\ eocazen\x0d\x0aThiago \ Schuch ThigSchuc\ h\x0d\x0aeltonfabricio\ 10\x0d\x0aMarli Masa m\ arlimasa \x0d\x0a\x0d\x0a\x0d\x0aR\ ussian:\x0d\x0aVictor \ ViktorOnlin\x0d\x0a\xd0\x9c\xd0\ \xb8\xd1\x85\xd0\xb0\xd0\xb8\xd0\xbb \xd0\xa1\xd0\xbe\xd0\xbc\ \xd0\xbe\xd0\xb2 belliric300\ \x0d\x0aNikita Paseka \ deadman1987\x0d\x0aPav\ el irbinix\x0d\x0aSerg\ ey Suhih linuxma\ sterclub \x0d\x0aAbdol\ reza Taslimijali\ labadi rezaxx \x0d\x0a\ \x0d\x0a\x0d\x0aSpanish (Spa\ in):\x0d\x0aEdgardo Ca\ stro Castro eddy\ 9305\x0d\x0aJose G. Ji\ menez S. josegji\ menez\x0d\x0aJuan Manu\ el ptero.4\x0d\x0aRub\xc3\ \xa9n Fern\xc3\xa1ndez ru\ benterco\x0d\x0aToni E\ st\xc3\xa9vez toniem \x0d\ \x0a\x0d\x0a\x0d\x0aTurkish (Tu\ rkey):\x0d\x0aO\xc4\x9fuzhan\ Aksoy OnePage\x0d\x0a\ abc Def abcmen\x0d\x0a\ Ya\xc5\x9far \xc3\x87iv yasa\ rciv67 \x0d\x0a\x0d\x0a\x0d\x0aTur\ kish:\x0d\x0aabc Def a\ bcmen\x0d\x0aKoray Bi\xc3\ \xa7er kbicer\x0d\x0aYa\xc5\x9f\ ar \xc3\x87iv yasarciv\ 67\x0d\x0a\x0d\x0a\x0d\x0aChinese \ (Taiwan):\x0d\x0aEnfen\ g Tsao 5iderealA\ rt\x0d\x0aSr R sr32960\ 01\x0d\x0aqge hao \xe9\xb8\x9f\xe8\ \xaf\xad\xe8\x8a\xb1\xe9\xa6\x99 \x0d\x0a\x0d\x0a\x0d\x0aP\ ortuguese:\x0d\x0aAnto\ nio Barbosa Alvo\ Errado2 \x0d\x0a\x0d\x0a\x0d\x0aSw\ edish:\x0d\x0aKristoff\ er Grundstr\xc3\xb6m U\ meaboy \x0d\x0a\ \x00\x00\x08\x86\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2224\ \x22 height=\x2224\x22 ve\ rsion=\x221\x22>\x0a \x0a \x0a \x0a \x0a \ \x0a \x0a \x0a \x0a \x0a \x0a \ \x0a \ \x0a \x0a \x0a \x0a \x0a \x0a\x0a\ \x00\x001U\ \x00\ \x00\xf8\xdax\xda\xed}ks\xdb8\xb2\xe8\xf7\xfc\x0a\ L\xf2a\x1e+\xc9o'\xa39{\xaa\x1c[I\x5c\ \xeb\xd8\x89\xa5L\xeeTj*\xa6$\xc8\xe2\x86\x225\ $\xe5\xc7l\xed\x7f\xbf\xfd\x00@\x90\x04\x1f\x92\x9d\xec\ \xec\xad\xeb\x9d\x99\xb5\x09\xa0\xd1\x00\x1a\x8dF\xa3\x1f[\ ?=\x11?\x09\xf12\x96\xf2Oy\xe2\xc5_D\x92\ \xde\x072\x99K\x99\xf6\xa0\x88J\xfb\xde*\x9dGq\ _\x1cG\x81\x1f\x8a\x93\xd5\x1f+\x99\x84\xd1=\x17\xca\ \xa9\x9fb\xe1Q \xef\xc4\x9bU\xf2\xa7w=\xe7\x92\ \xc0\x9f\xc80\x91}\xf1\xf6t\xd4\x11\x89\x94\xe2\xec\xf4\ xp>\x1c\xf4\x16S\x0d{4\xf7\x13\x01\xffD\xb1\ \x7f\xed\x87^\x10\xdc\x0bO\xcc\x22@$\x9a\x89\xf7\x88\ \xd1\x10\x11\x1a\x22B\x1d\xe1\x85S\xac<\xf6\x129\x15\ Q\xa8\xf0\xde*\x8ea\x12\x05Q,\x92\xc9\x5c.d\ G\x8cW)6\x02\xcc\xc3H\xdcz\xd0\xc1l\xe6\x07\ \xbe\x97\x02\x8c[?\x9d\x8b\x7f\x9c\x0c\xf4X\xbb\x8f\xf1\ \xa3\x06&q\xdc\xe2\x8c'A\xfc\x00\x7f\xfc\xa8z9\ \x8e\x96\xf70\xdey*~\x98\xfc(\xfegw{g\ \xaf\x0b\xff\xd9\xff_\xf1?\x85)\xfe_w\xf5\x03\xa8\ \xbe\xbb\x03\xd5\xedI\xff_\x05\xfd\x9d\x8c\x17~\x92\xf8\ 0?0\xec\xb9\x8c\xe5\xf8^\x5c\xc7^\x08\x03\xee\x88\ \x19L\x13\xce\xedd\xee\xc5\xd70;i\x04\xb3z/\ \x962N\xa0A4N=?\xf4\xc3k\x04\xe4\xc1D\ .\xef\xb1r\x8a\xab\x94D\xb3\xf4\xd6\x8b%\xad\x82\x97\ $\xd1\x84\xe7p\x1aMV\x0b\x19\xa6^\x8a]\xc2\xd4\ \xcaD\xfc\x90\xce%\x82x:T\x8d\x9e\xfeH]M\ \xa5\x17\xe0J@\xb1\xd0E\xb4\x08\x11,R,\x934\ \xf6'\x08\xa6\x03\x95&\xc1j\xaa0\xd15\x02\x7f\xe1\ \xab~\x10\x02MJ\x82pW\x09\x0c\x05\xb1\xed\x88E\ 4\xf5g\xf8\xff\x92\xc6\xb7\x5c\x8d\x03?\x99w\x10\xcc\ \xd4\xc7\x0e\x80\x1e\xe0{\x82\xdfii\x88\xac\xb6\x90`\ d\x10 \x10\x1f\x06@\x83\xcepd\xd2K#\x84\xb2\ \xc4\xf9M\xd5\x8cQ\xef\xb7\xf3h\x91\x1f\x12L\xd7l\ \x15\x87\xd0\xb1\x9c\xd2\xb8#\x98>\xea\xf4\x9fr\x92*\ @\xd8b\x16\x05At\x0b\xc3\x84\x8eC\xd8I0\xb4\ \xa4\xaf\x16\x12I\xc8\x1bG7\x92F\xc6\x14\x10F)\ `\xcd\xd8\xe0\xa2,\xb3\xc5VE\xc9\x1cv\x91\x18K\ 5\x83\xd0\xbf\x1f\xd2jZ\x83\x8b\x11\x93$\x05\x92\xf0\ a=\x96QL\xfd\x16\x07\xad7\xc5\xe8\xcd@\x0c/\ ^\x8d>\x1e]\x0e\xc4\xe9P\xbc\xbb\xbc\xf8\xf5\xf4d\ p\x22\x9e\x1e\x0d\xe1\xef\xa7\x1d\xf1\xf1t\xf4\xe6\xe2\xc3\ H@\x8d\xcb\xa3\xf3\xd1o\xe2\xe2\x958:\xffM\xfc\ \xe3\xf4\xfc\xa4#\x06\xff\xe7\xdd\xe5`8DP\x17\x97\ \xe2\xf4\xed\xbb\xb3\xd3\x01|>=?>\xfbprz\ \xfeZ\xbc\x84\xa6\xe7\x17\xb0WNa\x93\x00\xdc\xd1\x05\ \xf5\xa9\xa0\x9d\x0e\x86\x00\x0f[\xbf\x1d\x5c\x1e\xbf\x81/\ G/O\xcfNG\xbfu\xc4\xab\xd3\xd19@\x16\xaf\ \x00\xee\x91xwt9:=\xfepvt)\xde}\ \xb8|w1\x1c\x00\x12'\x00\xf9\xfc\xf4\xfc\xd5%t\ 4x;8\x1f\xe1\xa8\xa0o\xf8,\x06\xbf\xc2\xdfb\ \xf8\xe6\xe8\xec\x8c:<\xfa\x00\xc3\xb8\x1c\x22\x96\xc7\x17\ \xef~\xbb<}\xfdf$\xde\x5c\x9c\x9d\x0c\xe0\xe3\xcb\ \x01\xe0w\xf4\xf2l\xc0\xbd\x9d\xffF[\xf3\xec\xe8\xf4\ mG\x9c\x1c\xbd=z=\xa0\x86\x17\x00\xe8\x92j*\ \x1c?\xbe\x19\xd0'\xe8\xf2\x08\xfe9\x1e\x9d^\x9c\xe3\ \xfc\x1c_\x9c\x8f.\xe1O\xa2\xcc\xd1\xc5\xe5\xc8\xb4\xfe\ x:\x1ct\xc4\xd1\xe5\xe9\x10'\xe7\xd5\xe5\x05\xf4\x80\ \xb3\x0b\x8d.\x08\x0e4=\x1f0 \x9cy\xc4\x1d\x81\ \x985\x82Z8\x9c\x0f\xc3A\x86\xd1\xc9\xe0\xe8\x0c\xc0\ \x0d\xb1\xbd\xbd\xa0\xbd\xc7d{[O\x9el\xfd\xc4\x8c\ \xfd\xed\x11t4\x1c\xfdv6\x18\xbe\x19\x0cF\xf4\xcd\ \xd9\xe0\xfd(\x8a\x82\x91\xbf|\xf2\xaf'\x02~\xb6~\ \x12\xdb\xbd]\xe0j@\xdcH\x8c\xc9\x02\x08\x17\x18\x83\ \xb8\xf1\x82\x95\x84O^\xfa}\x82\xb4.\xfc\xeb0\x8a\ \xf9\x1c\xf8\xe8\x87\xd3\xe86\xe9!@\x042\x8e\xe2\xa9\ \x843i\xbb\xb7\xbd/\x17\xb0\xf5\x02\x7f*\x9e\xc9\xd9\ l{\xb6\xf3\x0b\xd7\xf0&_\xae\xe3h\x15N\xbb\xfe\ \xc2\xbb\x86C*\x8cBY*\xa3\x93\xa4/\x9e\xed\xed\ \xec\x1d\xee\x8d\xb9\xd8\x0bR\x19\x87\xc0\xfa\xba\x0d\x15\xf5\ 7\xbb\xdf\xa57E\xa6\x86\xa8\xed\xc8\x05\x7f\x8b\x96\xde\ \xc4O\xef\xfbbw{\xfb\x97'\xff\x86)\xf9\xe8O\ \xafe\xaaf\xc4\x05\xa6\xa1g\xe0d\x92\xf8\xa8\x0b\xc5\ \xf1\x8b\xbd\xdd\xbd\xddb\xc5\xa6^\x02\x7f\xd9W\xf3\xfa\ \x8b5\xc7\xf9\xd9\xd3+\xf8\xfe\x04\xf8Jt\xfdr\x95\ \xa6Q\xf82\x82\xc5\x9c \x7fQ\xab3\xa5\xc2\xee\xc4\ \x0b'2\xe8bQ_\xac\xe2\xe0\x87\xfe\xd6\x14O\xef\ \xd9\x0a\xd9\xd9\x16\xd7\xfa\xcc\xb5z\xc9\xcd\xf5\x8f\xbf\xe4\ Z\x07Q\x22\x1b\x1bc\xa5r\xdb\xe8KS\xc3\xe8\x8b\ \xa3\xd5R\x86\x8d\xed\xa0N\xb9%\x1cl2mjJ\ \x95\xcam\x13\xef\xa6q\x98X\xa7\xdc\xf2^&\x9b\x0c\ s.\x83eS;\xacSn\x19FM\xed\xc2\xa8\xdc\ \xca[.\x83\xfbM\x10\x85\xd3|\xe2\xc5\xd3\xa6\xa6\xaa\ \x9aj\xaf)\xf4\x15\x88)y\xaaD\xc1EAF\xba\ \xbf\xad\x03\x1d\xc8Y\xfa\xd9\x8b\xe3\xe8\xd6B\xcb\x02\x00\ \xcdR\x90\x88\x92\x1b_\xdeV\x02\xc1\xfa\x9f5\xa1\xaa\ \x06npS\x09R\x19\xfc\xd5\x1a\x9cn\xe0\x06'\xc3\ i+(P\xcf\x0d\xc0\x0fgQk\x5c\xb0\xb2\x1b\x0c\ \xc8eik0X\xd9\x0d&\x04\x08S?\x06>\x16\ \xc5\xd5\x84\x04\x82\x16\xb0+7\x84%\x08;a\xda\x02\ \xc8jY\xb7\xea P\xc5i\xab\xc1P\xcd\x1cE\xeb\ \x9e\x89cM\xdb\x8fb\x83\x81gM\xe0\xaa\xf1\xa5\xa1\ \xddg\xac\xe3l\x5c\xcb\x0eU\xe3\x02;\xc4)\xa8\x9d\ \x9fb\xddz\x04qB\x0b\xe8\x81 ^\xdd\x03\x16~\ 6\x03(0\x84\xf7oe\x92\xc0QV:\xad\x16\xfc\ }\x1c\xddu'1\x08\xe8\x13\xaf\xfa\xccRu?\xeb\ \x8a\x16f\x16\x18\xdc\x11\xf1\x82\xae1\x8d\x90\xac\xban\ `xQl\x05IWt\x83\x01v\x87\xd7\xbeF(\ \xaa^a\xf2\x8e\xa3\xc5\x12nUq~\xe6&\xeak\ %P]\xc1\xa6/\x99|I\xa3\x9a\x03\x88\xcb\xad\x16\ \x93\xba\x13 \x99|\x9e\xc6~\xfet\xbcY\xb3\xc1,\ \x88\x96\xcb\x9a\xfdE\xc5\xa5Vp\xbd\x06I/\xa9&\ _\xacPj\x15\xca\xf46\x8a\xab\x1b\xa9\xf2R\xbb4\ \xf6\x92ye+*-,\xd9\x11\xf2\xb1\xfcz\xad\x96\ \xc4\xdc\xd6\xe1~ u\x87\xf5\x8d\xb0F\xa9\x19\x9e\x9f\ \xf5\xcd\x9c',]\x81\xeb\xdbQ\x95R\xc3\x0d\x0f\xf4\ (\xaemT\xeeKO\xee\xc8O\x039\xf6\x0a\xfb!\ U_\x1bd\xd7[\xba\xcc\x94d\xd7\xac5\xca\x0aw\ i\xad\x9cV\x10\xd0L\xdb\x85w\xe7/\xfc?\xab;\ \xd7\x15\x9c\x8de\xb8\xaaa\x10\xe1\xca\xd9\xc8\x0f\x1bz\ T\x15\x5c\x8dC\xe4}\xd5\xec\x16\x15Fp\x05t\xb5\ L\xe6\xde\xb4\xbaO*u5[\x85\xf5\x0dUya\ \xb9/`1\x0ak=\x8d\x80\xe2\xe8\x16\xd7\xb0\xda\xc5\ e\xa6\xfb3\xfe\xc0}\xf9\x22Du\xe8\x0d\x88r\xde\ \x18\xc5\xd5P\xbcO\x0fY\x155\xf1V\x09jr\xb8\ \xe7$\x01\xe6\xde\x13C)\xc5\xb3\xc3\xdd\x9e\x01\x00\xa7\ \xa3D\xfd,\xe0 atc\xba\x8f\xd5\xa0\x02\x95>\ #mY\xf8\xe0\x80\xb2+i\x1fX\x1a\xe22-\xdc\ M\xf7\x0f\xf0\x7f\x8dwS\x04t<\x97\x93/p\xca\ *\x08\x09^~\xf9B\xbc\xbbgn\xc4\xab\x14Q\xb7\ /\xe5\xae\xfb\xe9\xc2\x8b\xaf}\xb8\xe3F0\xac\x05\xdd\ \xf6\x7f\xae\xbeS\xeb~\xab\x860\xde\xc6\xffq\xdd\xd7\ \x80\xfe2\xc3\x11\x96\xf8\x5c\xb2\x22o\xe1}\x91\x22Y\ \xc5\x92\x94\x138\xcc%\x1c\x9f\xb0\xdc2\x09\xbfO\xe9\ \xc8\x03\xaaL\xc4X\x06\xc0^\xb1\x0e\xd1\x96\xd1L\x00\ \xb5\xc3\x0d\x0b\x19G_\xec\xf4v5\xban\x85\xc5\xf3\ \xc3\xe7??\x9f\xe4\xae\xdb\xb17\xf5WI~\xac\x16\ \xc9\x90:\xfd\x1a\xce\x86D\xac\x12!\xc3hu=\xa7\ )\x96\xc2K\x19\x9dh\x89\xe3\x90!\x0d\xe2V\x02%\ \x85b\x81JFR\xd92\x18\xc2\x19\xab\x91\x1a1\xf1\ \xa7j\xb8+\xf8\x0d\x17&Q\xfaP\xf8\xa6\x14\x1a\x16\ x\x0d\x84\xbbH\xb0\x8f9\x5cP\x15\x1a\xc5\x891D\ f-(\x00\xc1\x11\x1e\xe8\x01\xaa>\xf8;\xa9M\xec\ E\xea\xcf\xa2\xc9*QK\xb5\xf1D\xe6 \xf6\x09\xb7\ l\xf5?J\x11j\x02\xc0\xa9\xda\xee\x1d\x02\xf0\xd5\xb2\ S\x17\xcd\xb7\xb0\x02\xec3\x0c\x04\xa2\x91\ *[\x90\xfe\x5ck\x92\xd8\xfc\xa2P\x04\x9d\xcd\x90\xb5\ V\xd5\xc7y\xad\x01g\xdeT\xb6\xf89{\xf6)\x96\ h@\xd9.W\x05q\x9e%\xe0(^\xc5\xdeB~\ \x9a\xe1\x7f\x87so)\xff\xfet\xf7\xe9\xef\x1d\xf2\x96\ \xa2\xa2~\xff\x9d\x17\xca@\xfc\xfd\xefb\xfbn{{\ {\x8f&\xb7\xdcj\xaf\xd0\x0a\xa6\xbe]\xc3\xfdB\xc3\ 7\xa8\xeb2\xad\xf6+Z\x1d\x14Z\xfd\x9akuP\ \xd1\xea\xf0\xe9\xef\xc2nEqG\xa6y<\x0f\xb1m\ n\xcb\x98m\x80;\xad\xa4a+n\xc9J\x0d\x9bS\ \x0b\xd9@\x1a%\x06`^\xe2`\x14\xef\xe2\xe8\x06m\ \x92\xe7\xb0\xaa\xa4\x08\xc2\xa77\xd4r\xd1\x90EDq\ (\xd8a\xde\xbd\xcc\xe6\x1cr.gM\xe9~m\xe9\ Am\xe9\xa1.\xad\xb5\xe6\xb6D>\x18\xe9I\x84z\ \xb2\xa5\x1a\xaf\x17\xea\xb7r\xe1\xcf\x8c\xe9\xb9'\xd8\x17\ \x83\xc2\x07\x88\xd4\xfb\x82\xf6\xf1K\xe6Ih\x95\xee\x9e\ \x87\xdfEI\x91\xec\xc6\xce\xa06\x0e`\xc9r\xac\xef\ \x9c\xf6(\xcc\ \x08{\x05P\xc7\x18K\x85;\xc7\x0a\xaa=\xd1m'\ \x0f\x02\xea\xd1\x1f\xe8\xc0\x8d\xef\x16\x18\x83\x84\xeb)=\ )>\x1f\xb2\x83\x01)2\x15\xef\xc5p\x0f\x99\x0d\xc0\ \x0c\xc4\x87\xee\xad\xe2\x8b\xe3(\x98\xaas\x98+\xd5\xdf\ \xf4\xdc\x9ax\xbby\xcd\x99\xdf\xdc\xb8Z\x13\xd7pZ\ \xce\xd1G@\xcd\xa6\xf5(Q\x84[D\xae\x01\xeaM\ \x03Ts\xd8l\x800\xb4m\x05y]\x94\xeb\xe0\x0a\ \xfe\xc5\xb6=s\x10C\xc3\x9dZm\xb8\xf5\x5c\x1d\x8c\ \xc1\x82\x03\x93\xf5\xd8\x8f\x13\x82\xdb\x88\xa8\xfa>\xbd\xc5\ \x91~\xb4}\x84v%\xf2C\x10q\xfc\x14\x18v\xb4\ \x10W\xae\x9e\xae\x80!D\x22\x90\xc8\xe1|l\xd0+\ \xd8N\xac1\x17FT\x039\x09c\x02\xc5+\x0c\xe3\ \x84\x9c\xc4\x83\x13\xd1\x0f$G\xf401\xc1NV\xe4\ \x1f\xc4,\x02Yk\xd2\xc1\xbd\x8e<6\xf6\x0d/[\ \xf8\xc0\x12@v\xa4(I^\xa0<\x7f\x16J\xf7\x0f\ \xd8\x80\xa0G\x0ep\xb1y\x0a`&\x93\xb9'\x11\xff\ V\x8eLz\x8a\x00-\xc3\xa0\xa6q\xb4\xec\xe2\xf5A\ \xa0\x07\xa2~\xbcYF\xcb\xd5R1\x1c\xc6\x5c\xb8f\ \xf0\x13\xd5{\x1bM\xe1\xec\xd9\x06\xa9\xa1u\xe5\x9d\xa7\ \xbf\xab\xf5-N\xf5N\xe5T\x1b\xb1\xaae\x1f\xbb\x1b\ \xf4aT.\xefV\xc9<\xb7\xb76\x88\x22\xd3\xfc\xf8\ W\xf7\x98\xe8\xba\x988\xcc\xd8\xf2\x0eq;e\xfc\xc9\ \x0f\xa9S\xfaR\xb7Q\xab\xfd\x82\xa2\xc58\xc2GW\ \x0cL\x90\x87\x89_\x1aE\xbb\x82\xb0\xe6\x04\xcd\x11\x1c\ \xf2\xc0\xf9\xdbC\xc0[\xc0\xda\x1b\x13m\xd4[\xad\xb4\ \x9a\xf3\xc4\xb3\x17\xbdloV.c\xf2\xdd\x91wN\ \xe25\xdf\xcb\xf4\xb3_|Q\xd6\xee\xa6EJ\xb1\xde\ \xc9]\x8f\xcfV\xd5F\xe3;\xe8\xc0\xdb\x9f9F\xdd\ \xb5\xf5\xc2\xc5aC\xe1\xf3\xfd\xba\xf7oM&\x0fu\ W\xac\xdc}\xd6+\xdf\xae\xb9\x88g\xd4\x89\xde\xc0H\ =\xcdz\x87\xc2\x84\x15\x0c]\xca\xed\xca\x9e\x80u\xc3\ jX\x9e\x06\xb5p3\x97\xaa\xb3\x9dt\x8f\xac\xa9\xcf\ \xe6\xf15\xf5i\x16\xc18\xa6\xe8\x0f\xda\xde\xc3\x18\x0d\ ,\xfd\xd0\xaeX\xfc\xae\xebk\xd3\x0fS\xd1|0^\ *J\xcf\x949\xa3\xe8\x0f\xbaFN\x1de\xaa\xe5\xbf\ \x16\xf1\xcb\xaeB\xb6\x7fC\xe9C\xb3c\xeezS\xa6\ wm\xff;M\xc6\x9d2\xd5X\xce<\xce\xe9\xb4\xca\ \xf3\xd3g{\x01\xe5\xa6\xc3*pL\x96\xa3\xbfl6\ \x5c\x9eE\xb9\x82v\x16\xa1\xc7Q\xb0Z\x84\x96%S\ \xdd\x81\xe7n\xb8\xb9\xb6\x8f\xaf\xd9\x03\x0fns\x13\x02\ \xa7\x85,\x8c\xdd\x84\xb6 ^\xf9\x9e\xcc\x17\xea\xacw\ Qe\x92U7\x90\xdc=\x9f\xc5\xceS\xb8\xde\x93\xbe\ \x0f\xa4\xc7D\xe2\x8d7L\xfc$\x95\xe1\xe4^\x8ce\ z+%\xc6H8 \x19\x92T\x85\xb7\xec\xb9\xad%\ N%W\x92\x1a\xe0Vj\xeb\x9a,\x08'\x80ZR\ \xfcM\xf2J\x07\x81\x84t\x97^\xd6O*\xae\x16\xde\ \x9d\x92X\xae\xf4L\xa0\xadnO\x1c\x85\xf7\xe9\x5cE\ ,\xd5?\xec\xee~E\xb6oW *c\x10N4\ \x9c\x11\x18P\x0f\xc8\xf2\x9ad\xf8D\xab&(\xc8\xa1\ \xdd\xde\xc6\x99\x03\x96\xc1\x8c\xe3\xf5 \xc0\xf0\xadJ3\ \x8a?\xbb\x8c\xaa\x16\x91\x0b\xed\x00?\x5c\xa9%\x08\xcb\ 2\x0e\xee\xa9\x1akC\xb9\xf5\x1e\xb7\xbe\xa2\xab\xc2\x95\ R\x09&\xdax\x08\xb5\x038\xa3|\xcai\xe1\x9e\xd4\ \xf5I\xc7\xc6\x16+]\x91|z\xa5\xdb\xe2\xa1O\xdf\ \xd9\x90*\x8f\x17\x83\xc8A\x80\x92\x02\x96\xd4\x9a\xae\x01\ \xa4\xafA\xf5\x15Rh/\x0b!\xcc\x1fr\xc4\xc0F\ NQ\xfc%A=\x90\xb1P\xbab\xbb\xea+\xeb\xe5\ \x82`\xe4\x16Uk9\xa0\xf2O\xfc(a\xd7\xc7\xba\ 8;W8\xa1\x09\x87In\xa0\xf5\x9cQ\xbc\xfb\xd4\ \x86\xee\xcb\x1a\xf5\x0c\xa9\x9c\xf5d}We\xe3\xce5\ -8-[P~=d\xb3{\xfd\xfb\x9a8\x18\xcb\ \xd5\xce:\x8d\xec\xb3\xb8\x95\x11(5\xb0\xbd\xf3j\xbb\ B\xa2l7E\xce\xc0@\x8f0C\x19\x06\xed'\xc8\ j\xd3j~2\xdc\x1d\xd3\xe3(`\x105\xdeQ\ \x96EF\xf1\x8en\xdb\xb8\x96\xea\x15\x06n^h[\ J\x11Y\xe0\xaf\xa2\x85v\x93\x7f\xcaA\xf3\xcb\x94\x0b\ \xaf~\x14v*JJ\x02\xb7]\xb8\x8e\xa7\xa73\x9a\ \xd9\x03\xc7R\x90R\xeb\x8e\x89M,\xa1\x1f\xf2\x90l\ ]&s\x17\xcc\x92\xc7\xadS\xd2v?\xa8:\xb4\xa8\ \xc5\xd6\xab\xa5\x0aU\xd5\xa9)k\xb8\xaf\x95<\xc06\ \xda\xa9\xcai\xc9\xda\xacn\xb5^+2p\x0d\x95\xe8\ \xb0r\xb0V\xe9\xb7\x1cnf\x1bX\xa9yl3X\ -\xb4\xbf\x5c]\x8b\x99\x7f\xa7\xf4\xc9 \x10\x87\xd7\x94\ 8\x00\x85\x22\xca\xcb\xf0^\x8dW&,\x91\xbe\xbc\x17\ S9\xf3VA\xda1\xe2+\x1b\x8f\x8fq\xcc\xd0t\ |/\xae\xac\xc9\xb9\xa2f$}\x1a\xfa`\xed8\x05\ \xc9\xd7*u\x98\xd9\x15\xa7\x98\x98\xcd(\x0c\xff\x5c\x99\ \xb6\x87\xd7\xbd\x5cB\x0a2\x7f\x9fG\xb7\x12\xa6\x5cW\ N\xd0\x10\x1e8\x05J\xc0\xaa\x91\x00\xa6\xa0\xc4\xfd\xf7\ \xf4\x5c\xdc;>\xfe\xacy\x8cv\xa0\xe3\xe6\x09&\xb3\ H\xe9\xb6\xa9\x8c\xe8'^\x08\x87\x9b\xb2\xd8\x17Z\x08\ `\x90Ye\xfd\xe6\xe7\xd3{\x1b\xde\xb5\xae\x83h\xec\ \x05\xfc\xd2\xd6\xcbPNpf00z\x98\xc0QK\ v0\xdaH_XX\xa9\xdb\x83'\x12\x98rtw\ `\xf9\x1dsd\xa4\xf3\x98\xb4\xeci\x8c\x0f\x00\xa4\x85\ \x07F\x17wx\x0e9\x83\xc6\xccS\xd36\xf1\x92L\ \x02?RC|\xb6\xbf]\xf4~P\x84l\xec\x7f:\ 5ev,\x84\xeaJ\xd1lV[\xfe\x1dT\xe8\x7f\ \xa7AU\xaaP\xac\x13\xa0\xbe\xb4\x16+\xfb\xf4q\xe3\ e\xd5pa\xe6\x92\xbd\x0b\xda\xb0\xb0\xb7\ \x96\xf2\xadb\x8d\xdb\xbbX\xde\x9c\xcb\xbb\x14\x10\xce\xbd\ \xfe\xe5|\x7f^8E\xb9\xec\x91\xf8\x0fV\xc0\xa4\x1c\ \xf3\x18M\x05\xa1\xd5\xf2\x0e\xffU\xca\xf3b/\xcf\xfe\ H?O\xd4\x1c}\x0e\xa1d\x01\xa2\xc5\xbc\x89\xe2r\ -,r\xab\x07\x0fw\xd5\x9b\xf5\xc0c\x0b?Z%\ \xb6>\xd3\x18&\x1a\xc3(z\xafF\xb8Dm\xf7\xd2\ \x8b\x91\x16\x96\x01\x5cM\xe9K\xe1\xd2j\x1b\xd9p3\ ^\xc3\x1e\x06\x8bdW=\xce\x9a\xc4\xc6\x132\xb87\ \xc7\xf1-\xfc\xe3\x85x\x08g\xb7Ie\xec\xc3\xfe\xbf\ y\x17D\x96>;b\x15\x06\xfe\x17V\x82q\x5c\x5c\ \xfb\xe1\xb8\x82PK&\x16-$\xc7\x07\xbdI\xb9\x1c\ \x89\x9dW\x99\xc2Kb\xd5\x93\xb6E\x96\x15/\xc5\xd5\ C^\xd3\x96\xa3\x06\x90\x15\x9d\xb0\xba\xd2Z\xf1\x06\xcenk\x13\xa2\x99H54\xa6\xda5\ \x8cL\xb2\x10R\x950q\xe2ZC\xcc\xd8Z%<\ \xdaR\xad\x01jfX\x80\x98Y\x12gR\xeb4\xf6\ n_z\x98xt\xdbF\xa6\xd6F-S\x8d\xdb\x01\ \xf8\xd9z;\xb5bF\xa0\xfa)&\xf3r\xd2e\xe1\ \xa3x\xea\x8du\x90\xf7S\x95\x9b\xce\x00\xd0\xb911\ \xf3\xa6\xc9\xd9\x98F\xd1\x17lN{\x16\x8d(c\xb4\ \x83D\x96\xd7\x13G)\x1at&\x19\x84\x9dm\xd8\xde\ \xab8\xe1\x17\xd01>p\xdfB9\x06#\x8f\xef\xd5\ Ko\xba\x8a\xe1(\x9e\xa9<\x9d\x88]\xc7\xc2\x80\x92\ \xe5M\x81\xd3P#R=E\x0bD*\x1f{\xbdt\ A)9\xb5\xf0t\xbb\xad:\xdcv\xb9V+\xb6\x81\ S\xba\xb9\xec}\xe8D\xa9\xe6\xc8Y\x07\xb8n\xe2\x8f\ 9\xf2<\x08S\xf8\xa6\x0bs\x0e\x123\xb7J\xf2\xe9\ \xfd\xd6uz\xab\xbe(\x14R0\xd4z\xf6\xb8\x86\xd3\ \xee\x82M-Jwk'\xbc\xbc(\xd9\x00QU\xce\ Yk\x8c.\xde\x89\xd1\xd1K\xc3\xa9\xa8\x0b Td\ 3\x9d\xd2\x97~\x00\x14\xe5\xf8\x8c\x8f\xe8\xdd\xc8\xf0\xb6\ \x16\xeen\x15\xb6\xd9\xae\xc8\xf05\xf7\x8a\x5cL\xf8\xea\ z:\x1c\xfd\xcfn{\xa2\x06\xbb\xb1&\xeb\xb9\x03\xba\ \xee\xb6\xf2\xb4\xd3\xefh\xf4\x22g\xaa\xb5zk\xcb\xb3\ \xb2l\xeag~\xdcfI\x0aN]E\xd6\xb8\xee\x0a\ \x17\x1f\xa9\xaa\xe1}\xb7Y\xa0\xbc\xdd\xc9\xde\xf6\xde\xfe\ \x06\xa4\xd3\x96&\x0a\x19\x02\xd6\xbb\xbc~\xb5\xd5D\x05\ G\xd7\x1d\xc2\xab&\x01By\xb2\xbe\x02jf!\x1b\ \x1e\x98\xe2\xeb\xb1\xf7\xc3\xee\xc1AGlw\xc4.\xfc\ \x0bg\xe6\x8f\xff\xb9\x19\xcd\xd0\xa6\x9d\xf2\x97F\x9e\x04\ \xc7\xd1\xe8\xe2\xad\x9b%s\xdb\x8e\xeb\xa3k\xdb\xaa\x92\ \xbf8o\xce\xc7\x1d\xfd\x0f\xb3g\xb4\x85\xa8]>\x87\ \xb1\x84\x8b\xf0\xd4\xa0\x5c\xbc\xd9\xbd*E\xf6\xfc\xa2\x06\ j\xeb\xa5.1\xe9:\xa8\xdf\x9aO;R\xc4<\x80\ \x8a\xbe\xdd\x9a>\x1a\x87~d\xbc\xbe\x09{\xfej8\ \x7fu\xde\xfc\x00\xcc\x81+\x9f\x0d^\x8d\xdc<\x19a\ v\xca\x9f\x5c\x9b\x94\xbe?67n\x12m\xd7\x14v\ \x1a\x99\xfb\x86\xbcX+r\xd6e\xc6\x8e\x15\xd9H\x12\ \xa0q\xb9\xd8\xb1kQ\xf2\xba#7\xd7\x5cg\x91\xcb\ \xd9\x0e\xaaA\xfe?\xcd\x86\x1fu5\xf5c]\x053\ \xb6\x07\xd6\x86\x15?*n\xdf\x8c\x19\x7f%\xac\xbf\x09\ ;~\x00\xee\xc0\x92/O_\xbf\xa9\xe0\xc9\xfc\x0c\xea\ \xf8\xe6\xda\xb0\x5c\xf0\x17g\xcb\xcd\xfb\xef\x1b\xf3\xe56\ w\x9cr\x9d\x22\xd5\xf1\xb0\x5cl\xd9\xb9*m\xf8\xf2\ z\xeb\xdc\x923s\xdb\xbf&kn{\x1d\xfbv\xeb\ \xf9\xc8\x8c\xf91Q\xfbk\x08\xc9\x1b#\xfd\x9f\x97\x92\ \xebP/F\x86\xa0\xa7{\xe5\xcb\x11\xfb^x\xbd\x0a\ \xc8D@\xbf\xee$\xda(\x15\x15\xf7\xfeu\x18)_\ /\x15\xa8\xcbK\xa1\xd5x\x95\xda9du\x912\xfa\ \xc2\x0c\xc4\xca\xc8\xcb\x18(\x8c\xf9)\xf3\xc6\xf7\xd85\ \xcb\x9e\xd0+\xaeLm\xf5#\x902\xb2\xc5\xf6\xc0!\ 1\xe6\x0e\x99\xdb\x22\x1c\x8e\xbe3\xcd\xf9\x8f\xc5\xca\xae\ 8\xc1\xb8?lj\xbc\xdd\xdd\xcb0\xb4F\x0al\x86\ +\xecw\x9f\xe7`(\x94L\xfc!mu\xac\x82\x8f\ \xa1C\x5c\x8e\x0c\x8c\xdb\x9b\xed\x88o>\xe6\xbcT\x9e\ X\x87\xe1\xa7$\x8b\xb3\x84p:\xc5\x82\x83\xaa\x82\xc3\ \xaa\x82\xe7U\x05\xba\x8f<\xe7-v\xe4.=\xac-\ }^[j\xfa\xd5\x8c\xbd\xba\xef\xca\x1a\x87\x8d5\x9e\ \x17k\x14\xd2={\x82\x1e[\x98\x121?\x0a\xac\x89\ \xf0\x82\xe5\xdc#\x1a\xc2\xc0`\xc68[[y\x13\xb1\ \xa09\x9b~\xabrF2]\xf3X\xcf\x18\xc8\xe6\x8b\ \xff\x90\xa5\xdc`9\xcav\x87\x07\xc6|\xf0\xa1T\xf9\ \x10\xca\xda\x9c*\xcarU\xf5\xb2d\xcc\xbdz\xa6\xaa\ \xab\x1c6Wy^\xaa\xb2\x99\xf4\x92s\xad\x9e\xc4\xd2\ Kd1QS\xb4$c\x18\xf4\xb1\x9dJ\xed\xfbK\ \x8e\xc8\x18\xd3\xe7&\xc2lK\xc4\xb0\x95C\xb3\xe1\x89\ /?\xbc\xee\xe7\x22\x1b\xb1;.\x1e\x1c\xe7Q\x9c\xce\ ;\xe2\xa3\x84\x15\x22\x1e;\x80\xb5\xe2\xfc\xf6p\xc2\x0d\ a\x9f\xcd\xd9\x07C{H`\xd3\x9e8\x0a\x02zm\ \xd7\xd69\x09}/\x1eEP\x83\xbdJ\xd2\xc3^\x05\ \xe3\xfc\x84u\x8e\x83\x88L}\xb5\x89K\xe5\x86\xaa\xae\ ]\x11\x9f\xe7\xc0\xbdi\x0f\xd7\x00\x95\xc9\xae\x15\xc0\x9e\ \xaf\x01\xcc\xce\xa7\xaeV\x1cO\x99\x0f\xa1\xf2\x7f\xb7\xe2\ *1\x03\xf3\xc6\xbd'\x5cg\x10\xae\x162&w\x1d\ \xf2M\xe7\xa3O\xad\x1f-\x94^F\xbd\x84\xe4\xc7N\ 'Z\x87 P\xfc*:+\x19\xe2\xf9\xc5h\xd0G\ _y\x8aM(\xe3\x8c<\xc89\x1e\xa8\xc8P\x184\ q\x1f{\xf6c\xb9{\x879\xac\x0d\xf2\xab\xd4\x05\x01\ j\xb7r\x9dj\x01X\xd62;/*W\xa7\x16\x84\ \xb6\xe0\xc9\xda\x9fD\x93/,@\xd5\xe5\x07)\x1a\xa8\ \x9c\xa6F\xcc(YP\xd8Q\x06Y\xc0\xe2\xcdk\x1a\ [}\x9a\xe3\x8d\x1a\x91Y\x09\xd9\xe4\x93u\x9c\x0e\x07\ \x90\xb7\x17\xb1\xd1\xd0YA<1f_/\xb4\xf6\xe4\ \xd0\x7f:)\x88J@\xa2\xe3ap&\x12v\xf7e\ \xfbu\x03\xecRR8\xc3\x89\xec\x8by\x9a.\x93\xfe\ \xd6V\x92\xc2d \x80Y\x10\xdd\xf6&\xd1b\xeb\x0f\ Eb\x01[{\xbb;\xfb\x07\xdb/\xb6\xb7\xfe\xc0\ \xb8\xb1\x1c\x8c\xac\x0b\xf5\xbc\xb4k/@\x97\x10`\x9b\ \x91$7\x10\xb2\xdd\x19{\xb1\xaa\x8e\x84\xd7\xde\xa8\xc4\ 4f\x93\xec5Z[\xac\x97CXfF\xb7\x04\xd4\ \xf2\xfc\xba\xf6o\xc8\xf5\xebV\xfa1L\xdd\xc2O\xc8\ I\x8cW\x95]\xdf8\x84d1\xbc#E\xd2\xe5)\ \xd1\x86\xbb\x5ce\xe1\xf9a\x01D& C1\xccU\ N@\x86=o\x96\x17\xf68\xa6\x14S\x11(\xf9:\ \xd0\xb1\x92\xd2\xe0\x140\x9bH`F\x02\xb4\x8az\xc2\ \x96HL\xa8\x8a.9<'\xda\xc3_\xd1\xa2`0\ \x8d$\x95\x1e\x05\x8f\xbb\xb2M|\xae:\x14\xde\xd7\x9f\ \xf1Q\xa0\x1a\xe5\xbd\x14\xa0\x8eL'l\x1eI\x87\x93\ \x15\xfdw\xee\x05<\x1dhQD0\xa0\x87h\x15\x8b\ \xa9L\xfc\xd8p6\x1d.\xcel\x8a\x12\x9f\xb1\x8b\x98\ \xc2r\x9b\xdbi\xc4Va^\xef\xbe\xae\xd5\xe5\xa3\x04\ \xa9\xf4\xadw\xe7/V\x0b5@4\x8fB\x8e]0\ \x8e\xc2\xc2nBN\x1b;\xfbZLi\x85\xf9\xa3\x19\ T\xc1\x00\xa0\xbf\x9c\x03\x91\xbb\xfb\x96n]\x04\xaeh\ 9\xa5\xc2&j[)\x9dbh\x1a\xf1\x9d\xeb\x1a#\ \x81\x00\xc3\xb1o\x90\x1e\xc8\x04H\xc2\xbd\xd2B\xe7\x90\ ji}\xe5F\xab\x92~\xbe\xceT\xdb\xb6ku\xbd\ ?\xc0D\xedQ'\xfa\x11\xcd\xdcLD%\x8a\xe4\x94\ \xa4vT\xa1z/\xf8:+\xdf,N\x93-|\xeb\ o\xb6D\xae\xfb\xec\xbb\xbe}\xe7\xd4\x925u\xd9\x1f\ \xc3\xeaO\xe6\xfd\xb9\x97t\xf1\x1c\x07\x16\xdd62\xc1\ \x0dj\x0b\xca\x14c9\x86(\x95\x0cw\x919\x1b\xe9\ \x95L\xd0\xb6\x9f\xc5\xe5\x22:\xdf5\xe2S2\xe9\xb7\ B\xea\xd7\x0d\xae\xefM\xff\x19\x01\xdf\xef\xda\xf9|\x1b\ F\xca`>/\xa2X:\x88!\x8f\xf4d\xee\x07S\ \xd8K\xf9!<\xa0W\x19N\xeb:\xad\xe9\xd3\xc4\x85\ ,5\xe2\x92|[\xc7\x8c7\xa1\xc6`\x1e\x84]9\ \x84[[\x1c\xdb\xf1\x97\x1c\xa6eS\xd8G\x99M\x0c\ \xe4Y\xd3r\xed\xe5.9\xff\xae=7\xed\xb0\xdc\x1c\ I\xdc\x09\xcdX6\xcc\xcb\xc6H6a\x87@\x1e\x80\ W5I\xd6c\xb7\x16A\x22\xa8\x129\x16\xce\x14`\ \xa0\xaf\xd1\xd9\x98\x02\xc6\xabH\x16r\xc1i\x0d1\x83\ 2\x9c\x8c\x14\xeb,R\xe1Bz\xaeD\xd6\xd6m1\ \x90Yh0\xfb\xe4\xd0\x1f\xb2\xf1\xba\x83\x87e\x1e\x0b\ \xae\xc0\x89\xce\xd69\xd7\x06\xd4p\xa6:\xf4\x5c.\x10\ =+Ft/\ lh&\x0cu\x10D\xd8\xc7\xc4DH\xc4P-\xfe\ L\x1d)~b\x88H_ \xaf\xe0\xf6\x8di\x0f\xaf\ \xf2\x8c\x9b\xfc\xdbW\xb2g\xe2ed\xf5\xa0h\xe6\x05\ \xb4\xfb\x025\xaeb'\xb0\xd92\x8c~\x8bV\xb4\xb6\ \xf4\xfcc\x0e\x01\xe8\xff\x9d\xea\xf0*\xbb\xd0\x9a`\xe7\ 0\x17jrp\xe2s\xf4\xc24B\x87J\xa2_\xb6\ \x9f\xed\xeev\xe0?/:H\xf7\xd9\xee\xda\xf4\xfa\xb1\ \xbb\xfbp\x10/\x1e\x0cb\xff9=m\x19\xa1\xe3C\ \xc2\x89\xf2n(\xca:\x11\xd6\x0c\x88\x87\xaf\x9f@\x0e\ \xfc\x94g\xd87.\x02\xbf\x003\xa1\xab\xe0ktv\ \xf26\xccE\xa2B\xa2]\x00]2\xaf\xb9\xb2B\x89\ \xd0j?\xb5\x82u\xe2F\xa1E\xa3\xaa\x8a>i\xdb\ \xff\x13\x01\xc0\xdf@f\x9a`L{M\xdc\xab\xa2\xfd\ \x82\xb6>\xa0\xe0\x94\xe2(\x008\x08B\x8f+Q\x11\ \x90h\xcf\xf2\x86\x9b)2FZ\x93w\x98\xc7\xce\x07\ \x89\x0a\xeb\x8d\xfd\xe9T\x86v\xce:cm\x90\x85I\ )`\xf6\xfb\xa7\xd2`\x7f\xff\x84cl\xca,U\x82\ \xb3V^\xaa\xba\xd6;\x0fj\x9d\xa5\xa0*Eb)\ \xdf\xa4\xdd\xe1c\x14\xd4\x87\xe4ria\xf7\x5c\xdd?\ [\xc5<\xa0\xfbb\x04\x08\x90\xe5\x8fJDE'\xb5\ \x9a\xe5*\xa2\xc2SUb\xe4\x8e^\x81\xa6\xb2%`\ d;\x0ds\xb9\x1eI9\xe3\xf7l\xdex\xe7!\x8d\ \x1d\xf4\xf4\xb8q\xe2\xf2t\xb0I2\xbfb\xc0\xb7\x07\ $\xf6\xab\x0f\xe5\x98\x8b\x98e\xe5>\xc8\xf7i\x05\xfd\ /\x14X\x11u\xed\xcf\xa5\xc8\xa6\xb6\xd2\xf7\x84\x85@\ }d\xf3\x05\x84t\x16[\xac\xea \xd6\x8f\x16\x1bJ\ J3-\xc9\x94\xc3\x92\xe8P3LQ\x11uh\xe5\ RDe\xd3\x94\xcd\xfaTL\xac\x00c\xdf\x80@\x02\ \x82\x8c\x16:\x16^\xc8Q\x99\xd5A\x84f\xd8\x983\ \xb0\x10\x9ef\x93\xe0]\x1c\xcf\xfa\x97\xf59X>\x1b\ E>\xba\xe7\x1a\xe94\x8a@\xad\x0c\x0e-a\x96\xf2\ O\x14A\x9a\x08\xb9-\x01:b\xfe\xba\xc9\xa7-@\ g\x80\xdc\xaa\x99,\xe4\xaek\x95\xda\xc3\x11\xfb\xb6b\ N\xdbB\xb7\x12c4\x00/E?~Ht\xe3\x8a\ yn\x0b\xba>\x1c\xf0_)\xc8\xa1#\xa6!\x9c\x9a\ ]\xe2\xd1\xe2o\xda\x81\xae\x90\xab\xd4\x15\xed\xd0\xe6]\ VZ'\xa5\xfdR7\x852kP\x99yHN\xb4\ ^\xad\xccM\xfc\xe8\x1fG\x1d\xddov1\xf1S\x9d\ \xd1T1\x96\xec\xe9\xca\xe42\xf6\xa6$\x98\xdaBg\ \x1a\xd1m\x0e/\xb1)\x88\xa4>\x88\x03\x0b\x9d\x8b\xca\ \x00\xc0X~\x8f\xc0\xcf\x1cQ\x08\xad|\xad\x8e\xfc*\ \xb9\x90\xb2\xa5L\xaet\xbf\xa4P\xb4\x1cf\x8b5\x8c\ \xf8\x9c\x8c!\xc2\x96\xde\x04\xe6j.\xf5\xcd\x9f\x8e\x80\ \xcc^w\xbd\xec\xaa\x98Q\xdcM\x97\xc5\xf5\xb7\x92\x98\ \xfew\xc5\x94t-Sy\x08.c0W\xae\x96\x83\ v\xa9Z\x0e\xac\x0d\xb6#\xefx<\xb4\xc7\xf6\xe1/\ 2\x0fd\xdb\xdf\xbf\x19\xc5\xd5\xdf\xc5.\x14a6\xde\ \x09\xa9\x7f\xbd1HI\x9a,\xd5|X1f\x9dR\ Y9\xf0l\xd5H\x1d+\xe7`\x0f\x1bN\xe3:I\ 1\xea\xc04\x85\xee-\x19c\xb6\x9e\x14\xfdH\xdcd\ \x06\x86\x85\xd7\xb1?\xb53\x13\xe5\xef&\xf5\xb9\x98\xb2\ \xd7\xe8\x82\xd3H\x907fke\x8e\xe6D\xba\xec\xd3\ X\x9b\xe6\xcce\x94\xe0nP9\xfb\x85\xbcMk@\ 4\x0f\xe9\xdfq\x84x\x07\xe8\x8aGt\xbe\xe0\xa1\x82\ \xc42\x88 5\xd9\x1f\xb84 C\xe24\xa02\xd1\ x\xbf\xac\xd0\xbdP[\xd8\x87J\x95\xdc\xcb\xa5\xc1\xa8\ B\xaf\x12\xbbBg?<\xd1Z\xd1\xbb\x1d\xda\xf5\x1d\ q\xcf\xbfd\x05\xbb\xba\x00~\xd9\xe9\x98\xef\x09_\x9c\ \xf4T\x16\x0bvt\x01}\xffq\xf3\x99v\xef\xc4\xaf\ 3\x92\x17;\xb3\x9d\x99k$T\xd04\x927\xd2\x83\ \xa5\xaa\xb7\x16\xad\xd1\x0a4\x1atW\x06\xaf-_8\ 2TP\x8fI\xafY\x8f\xa5(i\x93\xe9\xc9\x85\x98\ \xd0o\xfc\xe6W\xe5\xe8\x80/\x0ad\xe8\x94]\xab*\ \x86\xd0\xcf^\x84M\x14\x80\x86j\x05_\xbbfW\xf9\ \xc6\xae\x1d\x90J\xc7\x81\x13\x80\xf5\xee]\x8f\xbd]\xd1\ \x8d\x7f\x9d\x13\x7f\x8b\xfe]\xc0j\xc6\xf0)\x99G\xb7\ \xc3(NO\xb5\x84\x95\xf9\x84UC\x07n7\xc4\x94\ \x9a*t4\xcb\x0fv\x86O\xeblN8\x9di\xaf\ Bt\xb7RT\xbaF\x96\xcf \xad\xe9sF?\x95\ g\xdc\xe1\x8b\xdd\xe7\xbb\xcf5_\xb6\x1fn\xad\xbcN\ \xc6\x0b0\xb3K[\x85\xf4\xfa\x85\xa3\x98\x13.x'\ \x98\x04\xfe\xe4\x0b\xbd&!sv\xe1\xa8-\x1c\xdaQ\ F\xfb\xea\x9a>\xea[\x14\xb6M\xdb\xcay\xe0\xad\xd5\ ]\xed(\xe7\x01\x99r\xfe\xff\x0d\xaeMB\xb9V7\ \x90\xaai\xa4w\x13c\x0bB\x8a\xb5\xc4\xd8ch?\ \xde\xbc\xd7_iS\xf7U\xce\xb1+\xdbA\xf2\xaa\x90\ -9\xb7\x0c\xcc$|z_\x8f0\x146%w+\ \xf7i\x1c\x08\xc7\xf7Y\xf7\xa1\x80\x93$\xf6LNd\ \xadM\xc4\x14d\x05m\x22\xaa\x0d]\xe6{\xae\x8bX\ \xc9\xbb\xd3\xc1\x8b\xea\xe8|\xc3\x9cY\xdf\x9a\x106\x9a\ \x01#\xd0\x0b\xfe\xf58\x8aC\x19\xeb\x8b\xd0C\x04\x8f\ \x5c\xa4\x97\x9a\x10\xcd\x8f\x1b\xec&\xb3\xaa:\x8f\xec$\ H\xda\xd9\xbbz\xb05\x1c\xd29\x94\xd6\xb3\xb7\xfe\xe3\ @\xc5\xa5\x8a\xae\xa8ke\x01\xad\x8a\xbb\xce\x80l\x7f\ \xf0\xda\xd8\xac\xf6\x84\xe7\xe2\x96\xeeX.\xe8\x16\xcc\x9c\ \x7f\x94\xfd\xdd\x91\xd7\xae>\x1a,\x99\xe4-\x03?M\ 3\xa3\xc2\xda\xdc\xa19\xe3O\xeb\xae\xd1\xa5\x8d\xe2\xaa\ e\xe7\xd7vf\xd7.\x04\xbb\xd1\x81\xfcs\x0e\xd5h\ \xa0\x9cx\xa9\x9f`\x16\xc4(\xbe7Qc\x18\xcb\x84\ \x1fO\xb8\xfdL\xdcG\xab\xcc\xb8\xde$\xad\x1f\xa3q\ \xd4\xb5\x87\xd7>\xb2{\x0f\xf4\x89\xa4|\xae\xd9\xd8\x0d\ 1M:\x04\x02;E{\x96\xe4~\xb1\x90i\x8c'\ \xbe\x98\xacb`\xfb|\xa4-\xe3h\xbaB\xfb0/\ T\x8f\xe2\x98l\xd9\x0b2\xef^\xa5\xa8{\x17G\xd7\ H\xa3\x18\x7f&g\xefh\x17T\x9a:f\x02Y\xc9\ \xe0\x11W\xe7\xe7\xb6\xa6\xb7{\xd5\x97!7\x82%K\ \xdc]G0\xe0C\xd7-\xc5\x91\xb45\xd3J\xb7\x9a\x01gq\xbd\xac`\x08\x5c\x0f\ \x05}\x81gM\x80\x11\xc5B~\xf5\xf0q:\xd1D\ 03;}\xaf\x12\xee\x86\xc4\xab\x01i\x10uo\xd1\ t.\x8a\x8b\xc6\x9aP5T\x96\x97\xb963\xe4\xee\ <\x8b\x89vr\x22\x8a\x08\xfd\x09\xb3en\xffVB\ %a\xee\xd8h\x86\xb6BGk\x98<\x95o\xd8L\ \x99J)\x0c\xe4@\x01#x\x06r/1f}\x14\ )s\xff\xbc\x1e\xe3\xe8Ni\xbc\x93.\xde\x1c(r\ B\xd2'\x03=\x95w\x9e\xabw\x81x'\xb2:\x9a\ \x05\xd7\xfa\xcc\xb5,IX\xb7\xae\x0d\xa4\xa1\x1b\x17\xb2\ \xae\xa8\xb6\xd1\x97\xa6\x86\xd1\x17G\xab\xa5\x0c\x1b\xdbe\ \x8e\x88VK\xa0\x10\x9965\xa5J\xe5\xb6\x89\x9e\xc3\ \x9a\xa6X\xa7\xe2>\x0c\xc2k\xb2Z.\xe1>\x22\xee\ Uz>E\xe1\xb8\x99\xb1\xa1G\x99\xf1t&\x9f\xac\ S\xf8\xde\xa6_l\x9eu\xad/Q\x0a\xce\xbdL6\ \x99\xe9\xb9\x0c\x96M\xed\xb0N\xb9e\x185\xb5\x0b\xa3\ r+b0\x9b :\xf5\x93\x09l\x8e\xa6\xa6\xaaZ\ .\xdc\xc1P\xaat\xdfv\xacCz!U\xfb\x91\xdb\ \xda\x917J\xdc\xf1\xfd\xbbU276\x83\x19\x87\xb3\ \x0b\x1c\x91\xc5v2\x0b';vZE,F|\xf5\ e\xf40vW\xcag\x80\xc2QG\xa6\xc9\xd2\x8d\xb3\ C\x01*\xcb\x98\x0f\xc3\xe1\x81\x12\xaa\x16=\x91\x8f\x19\ \x9b\xd9+?\x19)\x00\xa4\x0a\xb8B\x1e\xa1\x13\xc7\xb1\ \xe9\xed\xa7\xac\x8ae\xb9VY\x06\x5c\xf9_k\x84#\ \xab\x1d\xa2\x0e\x18\xc9\xcf3\x9e\xe0\x00\x9772\x10\xb3\ \x18\x95\x99\x11\x9a\xe01\xcb\xb6\xbcZrS\xd08\xfc\ \x8f\xd4\xbc0x|1\xff\x1eX\xbb\xb1Y\x92Y|\ ,\x85\x14\x0b\xef\x1c\xf6j\xa7{\xa0T\xa6j\x07\x1b\xa1vPB\xed`\ -\xd44'9:\xf9\xf5\xe8\xfcxp\x22N.\x8e\ \xffqz\xfeZ\x0c\x7f\x1b\x8e\x06o\xc5p\xf4\xdb\xd9\ `\xf8f0\x18Q\xb5n\xe3O\xde\x88\x1e\xc5\xcbk\ \x19\xc2\xe6')8\x8e0\x17 \x0a\xf2\x89\xf2gR\ >L;\xc0\x801?_1`\x15&\xec\xcbd@\ \xf6Y\xc2\xf7d\xca\xf4\xc7l\x8e\xe2}Y\xfc\x92\xc2\ \xa7\xa1\xa2\x8bT\xacV\x00\xab\xbc_\x98\xf6FB\x95\ \xd4j\x81NY&\xf5\xf4\xd1\xc9\x90E\xd4\x226\xdc\ z\xb7'\x06Z\xe7\x9b{\x01gu|\xb9\x0b\xf3\x08\ \x8e^o\xb6\xab\x92v\x1a\x99\xfb\x18 \x81x\xad\xed\ \xe0\xa3\xdc\xbd\xf5\x9b\x8c\xf6\xe0\xda#]\xbe\xf2{\xba\ 0\xc0X\xdf\x8c:o>&\x0bxpx\xb4\x15\xe6\ 5\x0c\x13\x8cF\x14\xa6Y\x88\xac$\x0bm\x17-H\ I\xe7\xeb\xb9\xda\xefe!\x103U\x89\x92\xc9\xf1\x91\ \xe0\x8b\x94K[\x7f\xa3\xf4\xdeS\x5c\x01\xd4\xc3\x90>\ \x07\x139\x8a\x1fX\xd1\xf7c\xc7r\xceS3\xb3\x88\ n\xf4\x09\xa3\xdd\xde\x005\xa5.\xdc\xca\xa5pg\x02\ {\x96zc\x8c\xea(\xb5\xf4\xf0\x0c\xe3L\xe1\x1d5\ \xff\x15\xa3?\xa2\xa1uVM\xa6@\x83\xafa\xc5\x96\ \xe6\x1b\x05\xb6\x82\xfe\xe94\xce\xb7\xcf\x15Qh1\x98\ \xae\x9c`\x92\xa7\x91\xf6\xd1\xaa*C\x17\x1a\xeb\xa2\xdd\ \xa2\x8a{\xa7.\x99k\xe9%\xbd9\xe0\xfa\xbf\x9f8\ &\xa8y\xc4:\xf4o\x1a\xf1E\xd1\xc4:U\xc6o\ &\x1c\x06;\x9a\xae\xc2U\xc2r@\x00(\xca^\xc1\ \x8a*S\xc1\x17\xd6T\xbf\xec\xb9V\xd6\x94\xe5\xd1\xcf\ \x9a\x14W\xd9\x94T\xad\xb5\xbbB~\xfcv\xafvS\ \x1d\xaf\xd1\x8djVZ@\xd6jVB7+\xabD\ \xb8\xa2J\x01\xe5\x1a\xbb!Mt\xffn\xbf\x9d\xaa\x90\ iz\x10\xf2\xa6\xc9\xe7B\x14\xb6MV\xbb~\xf1Z\ #Q\x8cb\xb3\xe9z6-M{\x84Jq\xdb\x0a\ \xb4\xd2\x06\x12\xda\xea}V\xae\xe5Up\xdaO\x94\x05\ \xcd5]\x0e:^\x17j\xd3\x98+La\x8b\xb1\xd3\ \xca\x9b\xa7\x0d\x22\xdc\xc8\xea\xbb\x82c\xb4\x87U\x9a\xa5\ \xcaM\xbd.Lg\xf2\xdaWg\x17G#\x14\xd4H\ \xc3*N,\x0f`\xedo\xc8\xba<-Vp\x9cS\ \x90\x044\xd5\x12#\x86\xbe\xba\xdd\xe3W\xea\x13\xdfK\ \x89\x9c]9\xa3\x17\x8a\xb5\x9c\xaeu\xd0e\xedY\x01\ x\xbaN\xf4\xd7\x16\xc7Q=\xc1\xa9\x16\xed \xae\xb1\ =T\xbb\xd2\xaa\xb7\xe7\xc5\xed\xe0;\xd6^\xfb\xa7j\ \x89\xe9JW\x9e\xaa;\xc2U\x07\xef\xe6o\xcb_Q\ yF\x1e\xdd&\xc1\x04k\x89\x8d\x9b\x1eG \xc0\xab\ ?{.e.\xed\xba\x0f\xad\x17\xc7\xd2\x85\x1f\xd27\ \x02\xa2\xbfc\x1c\x0d\x8e\xa9@Z|\xb8\xa5\xf4z\x99\ \xba\x99\x1f\x08=\xd6\xee\x92\xa2\x17G\x81\x8aw\xb28\ 1\xe1\xb1PAa\xba\xc4\xbePI\x0dB\xa4\xd5\x95\ \x16\x051h\xa3J\x85\xc4\xd4\x9c\x85\xd2\x1c\x15^u\ 7\xcb\x97\xdc\x90l\xc8\xbee\xfd\xa5\xf2%;f\xe3\ \x13\x1b\xd3\xc2o\x9b8}\xb6L\xed\xf4\xf5\xb2\xa4\xd6\ \x99 8F+\xde\x9fyc\x19\xb4R\xa9\xb5\x9a\xac\ F\x80\x96H\xa5\xf7i\x01\xa5\x5c$r\xed\xd4\xad\xcc\ \x80(p\x1b\x06v\xee\xe7SmZ\xce\xe0\xfdr\x8a\ \xa1\xab\x8e\x0a$N;h\x1a{\xb7\xd6u\x8c\xb5\x82\ \xf8NtOQ\x1cz\xf9\x97{\x8e\xab\x80\xd7q~\ \x80c\x0b#_\x17\xe3s\x9c\xf4\x91cd{\xed\xe2\ \xd7\xc1\xe5\xd9\xd1o\xf9\xedv\x81^\xf2\xde\xfdq\x1c\ %\x89\xf3^D\xea\x8ac\xc7\xb3e\xbe\xdaK3\xa5\ \xc7\x8e\xe8r\xf9\xba\xba\xcfF\xa0Gh\x8at\xec0\ \xf5\xcdW\x1b\xce\xbd\xa9\xa9Wvh\xfe)\xd3\x91R\ \xd8\x14\xfd*\xa1\xfd\x89\xe8\xb5\x94\xc2\xf5\xd3c\x22\xa5\ \x0a\x90^\x8az\x02\xf5\xb6vt2\xe4\xe9w\x84(\ \xe0_\x81\xfd\xc5\xdbw\xaf\xe0g\xeb}\xda=\x9a\xde\ \xe0\xdb\xd1\xb4\x8b3\x8c\x8f\xd4Cz\x12\xdd\x1a\x07\xd1\ xk\xe1aD\xe1-8\xd4\xb7\xb0U\xf7z\x05W\ \xee\xdeb\xfa\x8c\xf0\xb0\xd1xR\xc1\x19?QMs\ <\xfc\xde\x10Jo\xe7EG\x1cn\xc3\xbf\x87\xe8\x06\ \xb0\x9b\xcf\xabTW\xf3\xe0\xc7R\x9e%\x87\xa7o\x0b\ \x04\xd5\xee\xeb\xb4\xaa[\x90\xe9\xdb\xba\xbf\x98\xc7j\xd4\ \x83}<=y=\x18\x89\xd1\xc5\xc5\xd9\xe8\xf4\xddz\ \xba0\xde/\xc6#\x80\xb1x\xf6G\xfa9\x0b\xc0\xcf\ \xb2\xff\xd8\xadL\xc0\xe8*#\x1f\xd8\xedS\x1a\xc5\xd3\ \xbc\x83\x81\x13\x1c\x89\x1e\x8d\xe0NH\xb2dx\xff\x17\ \xc9\xaf\x99\x9a\ \x00\x00\x02.\ \x00\ \x00\x07\x84x\xda\xbd\x95\xc9n\xdb@\x0c\x86\xefy\x0a\ bzi\x00i4\xe4\xec\xae\x9dK\xae\xe9\x0b\xf4f\ 8^\x04\xc8\x0bd!\xb6\xfb\xf4\xe5H^\x1b\xc7\x97\ \x00\x92\x04\x0dE\xf2\x9f\x8f\x1c\x10\xf6p\xfb1\x87\xfd\ \xb2ZmGb\xd14\x9bAQ\xecv;\xb9\xd3r\ ]\xcf\x0bRJ\x15\x9c!`W\xbe7\x8b\x91pF\ \xc0bZ\xce\x17Mg\x7fL\xebm\xb9^\x8d\x04\x8a\ \x97'\x18\xd6\xd3I\x03\xdb\xe6PMGb\xbd\x19O\ \xca\xe60P\x92\xcer\xeb.\xf2d\xefG\x22w(\ \xe0\x90V%\xa0f\x07\x05^\x0f\xdd\xda\xd4\xe3\xd5v\ \xb6\xae\x97#\xb1\x1c7u\xb9\xff\xa9\xb2\x1c\xd3\xa3\xd2\ \xfd,\x8a\xff\xa9\xb3\xb2\xaa\x06?\xa6c\x83\x06\x1fc\ \xd5w\xb1\xf3\xbb\x9d~\xd6R\xabJo|N\xa7\x04\ \xc3\xcd\xb8Y\xc0;'\x00\xda\x0c#L '\x89\x19\ \xc9\x009\xca\xe8\x83\x89!\xb3R\x91\xc6H)f3\ \x8e(\xe9\x95rd\xb2\x5cK\xb4\xce\x05\x97|\xfci\ \xe51)\x0fPA2\x94\xb4\xf0\xb7\xad\xf2\x1aF\xd4\ #\x0c\xb9]\xcd0\xe60\x0b!\x1e\x09\xd9\x89\x09H\ \x1c\xb0p\x06d'&\xe4Q\xf2qI6\x8e9\x15\ \xa8D\xa4;\xa4\xdf\x89\xe4\xe0\x95\xb7cR`\x12\x9e\ Q\xfe\x84\xe2\xce\x03k1\xc8`\xb4F\x931\xa0C\ \x1dU\xb1\xad\x17\xe1\x8d\xd7t\x00\x9c\xfc\xe73\x88X\ gU\xbat\x02\x1a\x96\x22J\x07\xe8\xcf\xcd\xa14G\ $\xefG\xe9\xb0\xef\xb4gO\xed\x85\xb6\xbb\xb7T\x85\ M\xe9\x1dsX\xcco\xe6\xab\x9b\xe9Y{\xdd\x0c\xd8\ v2\xae\xa6<_t=WwE\xbd\x0e\xdb\xd7\x15\ \xf45\x81\x0f\xce\xa0\x8f\xb1\xfc\x0a\xdf\xcf\xac>\xa0\xf7\ ;\xc0\xd7\xd5\x5c\xfdF\xfe\xbaS\x99&0\xa9\x22'\ M\x08l\x9a\x8b\xc9\xa1\xd7v\x91\x88\xdaX0R!\ RP6\xb9\x88\x0c{[\x9f\xb7>`\xf2im\xa3\ \x0eI$\xb5\x8bH\x1c\xe7\xfeX\x8b\x1c\xe7m=*\ O\x01\x92\x9e_\x9c\xe6%\x85H>}\xd9(\x9dV\ \xc1\xc7+\x09\xfbb Ct\xb3y\xeb\x0d\x9e\xae\xaa\ p\xeaReks\x1a\xaf\xa7N\xbc\xb4H]C\xa6\ \x9b\x97a\xfao}y\xfa\x07\x8a\xd4\xbaa\ \x00\x001\x8a\ \x00\ \x00\xfc`x\xda\xed}ks\x1b7\xb2\xe8w\xff\x0a\ \xc4\xfe\x90\xc7\x92\xd4\xdbN\x98\xb3[%K\xb4\xad\x8a\ ,\xd9\x22\x1d\xdf\x94+e\x0dIP\x9c\xd5p\x86\x99\ \x19\xea\x91\xad\xf3\xdfo?\x00\x0cf\x06\xf3 %{\ \x93[\xd7\x1b{\xa5\x01\xd0h\x00\x8dF\xa3\xd1\x8f\xad\ \x1f\x9e\x88\x1f\x84x\x19K\xf9\xa7<\xf6\xe2k\x91\xa4\ \xf7\x81L\xe6R\xa6=(\xa2\xd2\xbe\xb7J\xe7Q\xdc\ \x17GQ\xe0\x87\xe2x\xf5\xc7J&at\xcf\x85r\ \xea\xa7Xx\x18\xc8;\xf1f\x95\xfc\xe9]\xcd\xb9$\ \xf0'2Ld_\xbc=\x19uD\x22\xa58=9\ \x1a\x9c\x0d\x07\xbd\xc5T\xc3\x1e\xcd\xfdD\xc0\x7fQ\xec\ _\xf9\xa1\x17\x04\xf7\xc2\x13\xb3\x08\x10\x89f\xe2=b\ 4D\x84\x86\x88PGx\xe1\x14+\x8f\xbdDNE\ \x14*\xbc\xb7\x8ac\x98DA\x14\x8bd2\x97\x0b\xd9\ \x11\xe3U\x8a\x8d\x00\xf30\x12\xb7\x1et0\x9b\xf9\x81\ \xef\xa5\x00\xe3\xd6O\xe7\xe2\x97\xe3\x81\x1ek\xf71\xfe\ \xa8\x81I\x1c\xb78\xe5I\x10\xdf\xc1/\xdf\xab^\x8e\ \xa2\xe5=\x8cw\x9e\x8a\xef&\xdf\x8b\xff\xd9\xdd\xde\xd9\ \xeb\xc2?\xfb\xff\x12\xffS\x98\xe2\x7f\xb9\xab\x1f@\xf5\ \xdd\x1d\xa8nO\xfa\xbf\x14\xf4w2^\xf8I\xe2\xc3\ \xfc\xc0\xb0\xe72\x96\xe3{q\x15{!\x0c\xb8#f\ 0M8\xb7\x93\xb9\x17_\xc1\xec\xa4\x11\xcc\xea\xbdX\ \xca8\x81\x06\xd18\xf5\xfc\xd0\x0f\xaf\x10\x90\x07\x13\xb9\ \xbc\xc7\xca)\xaeR\x12\xcd\xd2[/\x96\xb4\x0a^\x92\ D\x13\x9e\xc3i4Y-d\x98z)v\x09S+\ \x13\xf1]:\x97\x08\xe2\xe9P5z\xfa=u5\x95\ ^\x80+\x01\xc5B\x17\xd1\x22D\xb0H\xb1L\xd2\xd8\ \x9f \x98\x0eT\x9a\x04\xab\xa9\xc2D\xd7\x08\xfc\x85\xaf\ \xfaA\x084)\x09\xc2]%0\x14\xc4\xb6#\x16\xd1\ \xd4\x9f\xe1\xffK\x1a\xdfr5\x0e\xfcd\xdeA0S\ \x1f;\x00z\x80\xef\x09~\xa7\xa5!\xb2\xdaB\x82\x91\ A\x80@|\x18\x00\x0d:\xc3\x91I/\x8d\x10\xca\x12\ \xe77U3F\xbd\xdf\xce\xa3E~H0]\xb3U\ \x1cB\xc7rJ\xe3\x8e`\xfa\xa8\xd3\x7f\xcbI\xaa\x00\ a\x8bY\x14\x04\xd1-\x0c\x13:\x0ea'\xc1\xd0\x92\ \xbeZH$!o\x1c\xddH\x1a\x19S@\x18\xa5\x80\ 5c\x83\x8b\xb2\xcc\x16[\x15%s\xd8Eb,\xd5\ \x0cB\xff~H\xabi\x0d.FL\x92\x14H\xc2\x87\ \xf5XF1\xf5[\x1c\xb4\xde\x14\xa37\x031<\x7f\ 5\xfaxx1\x10'C\xf1\xee\xe2\xfc\xd7\x93\xe3\xc1\ \xb1xz8\x84\xdf\x9fv\xc4\xc7\x93\xd1\x9b\xf3\x0f#\ \x015.\x0e\xcfF\xbf\x89\xf3W\xe2\xf0\xec7\xf1\xcb\ \xc9\xd9qG\x0c\xfe\xcf\xbb\x8b\xc1p\x88\xa0\xce/\xc4\ \xc9\xdbw\xa7'\x03\xf8|rvt\xfa\xe1\xf8\xe4\xec\ \xb5x\x09M\xcf\xcea\xaf\x9c\xc0&\x01\xb8\xa3s\xea\ SA;\x19\x0c\x01\x1e\xb6~;\xb88z\x03_\x0e\ _\x9e\x9c\x9e\x8c~\xeb\x88W'\xa33\x80,^\x01\ \xdcC\xf1\xee\xf0btr\xf4\xe1\xf4\xf0B\xbc\xfbp\ \xf1\xee|8\x00$\x8e\x01\xf2\xd9\xc9\xd9\xab\x0b\xe8h\ \xf0vp6\xc2QA\xdf\xf0Y\x0c~\x85\xdf\xc5\xf0\ \xcd\xe1\xe9)ux\xf8\x01\x86q1D,\x8f\xce\xdf\ \xfdvq\xf2\xfa\xcdH\xbc9?=\x1e\xc0\xc7\x97\x03\ \xc0\xef\xf0\xe5\xe9\x80{;\xfb\x8d\xb6\xe6\xe9\xe1\xc9\xdb\ \x8e8>|{\xf8z@\x0d\xcf\x01\xd0\x05\xd5T8\ ~|3\xa0O\xd0\xe5!\xfcw4:9?\xc3\xf9\ 9:?\x1b]\xc0\xafD\x99\xa3\xf3\x8b\x91i\xfd\xf1\ d8\xe8\x88\xc3\x8b\x93!N\xce\xab\x8bs\xe8\x01g\ \x17\x1a\x9d\x13\x1chz6`@8\xf3\x88;\x021\ k\x04\xb5p8\x1f\x86\x83\x0c\xa3\xe3\xc1\xe1)\x80\x1b\ b{{A{\x8f\xc9\xf6\xb6\x9e<\xd9\xfa\x81\x19\xfb\ \xdbC\xe8h8\xfa\xedt0|3\x18\x8c\xe8\x9b\xb3\ \xc1\xfbQ\x14\x05#\x7f\xf9\xe4?O\x04\xfc\xd9\xfaA\ l\xf7v\x81\xab\x01q#1&\x0b \x5c`\x0c\xe2\ \xc6\x0bV\x12>y\xe9\xb7\x09\xd2\xba\xf0\xaf\xc2(\xe6\ s\xe0\xa3\x1fN\xa3\xdb\xa4\x87\x00\x11\xc88\x8a\xa7\x12\ \xce\xa4\xed\xde\xf6\xbe\x5c\xc0\xd6\x0b\xfc\xa9x\xb6\xb7\xb3\ \xf7|o\xfc3\xd7\xf0&\xd7Wq\xb4\x0a\xa7]\x7f\ \xe1]\xc1!\x15F\xa1,\x95\xd1I\xd2\x17\xcf\xe4l\ \xb6=\xdb\xe1b/He\x1c\x02\xeb\xeb\xba*zr\ ,'\x5cQ\x7f\xb3\xfb]zSdj\x88\xda\x8e\x5c\ \xf0\xb7h\xe9M\xfc\xf4\xbe/v\xb7\xb7\x7f~\xf2\xbf\ 0%\x1f\xfd\xe9\x95L\xd5\x8c\xb8\xc04\xa0\x08\x9cL\ \x12\x1fu\xa0\x18_\x8d\xbd\xefvw\xf7:\xe2`\x97\ \xffn\xf7\x0e\xbe/\xb6k\xea4\xf0\x97}5\xcd?\ [S\x9e\x9fL\xbd\xa0\xef\x8f\x81\xcdDW/Wi\ \x1a\x85/#X\xdb\x09\xb2\x1b\xb5XS*\xecN\xbc\ p\x22\x83.\x16\xf5\xc5*\x0e\xbe\xebo\x05\xc4\xf2f\ +do[\x5c\xed3W\xeb%7W\x0ag\xdd<\ \x88\x12\xd9\xdc\x1ak\x95\x1bG\xd7\x8d-\xa3kG\xb3\ \xa5\x0c\x9b\x1bB\xa5rS8\xebd\xda\xd8\x96j\x95\ \x1b'\xdeM\xf3P\xb1R\xb9\xe9\xbdL6\x1a\xea\x5c\ \x06\xcb\xc6\x86X\xa9\xdc4\x8c\x1a\x1b\x86Q\xb9\x99\xb7\ \x5c\x06\xf7\x1b\xe1\x0a\xc7\xfc\xc4\x8b\xa7\x8dmU=\x05\ @\x13\xeb+\x10`\xf2\x04\x8a\x22\x8d\x02\x8d[\xe0\xb6\ \x16v g\xe9g/\x8e\xa3[\x0b1\x0b\x02\xb4K\ AXJn|y[\x0d\x05\x1b|\xd64\xabZ\xb8\ \xe1M%Hl\xf0[{x\xba\x85\x1b\x9e\x0c\xa7\xed\ \xc0@E7\x04?\x9cE\xed\xb1\xc1\xdan8 \xb6\ \xa5\xed\xe1`m7\x9c\x10@L\xfd\x18\x18[\x14\xd7\ \x10\x14Hb\xc0\xc0\xdc \x96 \x0d\x85i\x1b(\xab\ e\xdd\xe2\x83\xc8\x15\xa7\xed\xc6CUs\xb4\xad\xfb&\ \x1e6]c \x9b\x0c>k\x03\xf7\x91\xeb\xa6\x86\x9f\ \xb1\x92\xb3u=\x8bT\xad\x0b,\x12\xa7\xa1~\x92\x8a\ \x95\x1bp\xc4i-`\x08\x12{M\x1fX\xfa\xd9\x0c\ \xa2\xc0 \xde\xbf\x95I\x02\xa7\x5c\xe9 [\xf0\xf7q\ t\xd7\x9d\xc4 \xcaO\xbc\x9a\xe3LU\xfe\xackZ\ \xb8Yppw\xc4\x0b\xba\xf14\x83\xb2*\xbb\xa1\xe1\ \xa5\xb2\x1d(]\xd3\x0d\x078 \xde\x11\x9b\xc1\xa8\x8a\ \x85\x09<\x8a\x16K\xb8\x83\xc5\xf9\xd9\x9b\xa8\xaf\xd5P\ u\x0d\x9b\xd0dr\x9dFu'\x13W\xb0\x9aLj\ \x0f\x86d\xf2y\x1a\xfb\xf9\x93\xf3f\xdd\x16\xb3 Z\ .\xebv\x1b\x95\x97\x9a\xc1\x8d\x1c\x84\xc3\xa4\x86\x92\xb1\ F\xa9Y(\xd3\xdb(\xaei\xa5*\x94\x1a\xa6\xb1\x97\ \xcc\xab\x9bQqa\xe9\x0e\x91\xb7\xe5\xd7m\xb5$\x86\ \xb7\x16K\x04a=lh\x85UJ\xed\xf0pmh\ \xe7<\x7f\xe9\xee\xdc\xd0\x90\xea\x94Znz\xe0Gq\ }\xabroz\x8aG~\x1a\xc8\xb1W\xd8\x1d\xa9\xfa\ \xda$\xe7\xde\xd2M\xa8$\xe7f\xcdQ\x98\xb8K\xeb\ \xc5\xb9\x82\x1cg\x1a/\xbc;\x7f\xe1\xffY\xd3\xbd\xae\ \xe1l-\xc3U\x1d\xcb\x08W\xceV~\xd8\xd4\xa7\xaa\ \xe1j\x1d\x22C\xac\xe1\xc2\xa8r\x82K\xa4\xabi2\ \xf7\xa65\xbdR\xb1\xab\xdd*lh\xa9*\x14\x96\xfd\ \x1c\xd6\xa4\xb0\xe6\xd3\x08h\x8fn\x82M\xab^\x5cn\ \xba\x84\xe3\x1f\xb8t\x9f\x87\xa8S\xbd\x01\x91\xcf\x1b\xa3\ d\x1b\x8a\xf7\xe9s\xd6gM\xbcU\x82\xea \xee:\ I\x80\xe9\xf7\xc4PJ\xf1\xec\xf9n\xcf\x00\x80\x93S\ \xa2\x92\x17\x90\x900\xbe1\xdd\xe2\xeap\x81Z\x9f\x91\ \xc8,\x84pH\xd9\xc5\xb6\x0f\x5c\x0e\x91\x99\x16n\xb8\ \xe3}\xfc_\xe3\x0d\x17\x01\x1d\xcd\xe5\xe4\x1aN`\x05\ !\xc1+4_\xabw\xf7\xcc\xbdz\x95\x22\xee\xf6\xd5\ \xdeu\xad]x\xf1\x95\x0f7\xe5\x08\xc6\xb5 \x9d\xc1\ O\xd57s\xddo\xe5\x10\xbc\xf1O\xe3\x1f\xb9\xeek\ @\x7f\x99\xe1\x08\x8b|&Y\x1d\xb8\xf0\xae\xa5HV\ \xb1$\x15\x07\x0es\x09\xe7*,\xb8L\xc2oS:\ \x0a\x812\x131\x96\x01\xb0[\xacC\xe4e\xf4\x1b@\ \xf2p#\xc3Y\xef\x8b\x9d\xde\xaeF\xd7\xad\xf6\xd0(\ Y\xb7\xf4\xd8\x9b\xfa\xab$?V\x8bfH)\x7f\x05\ \x87E\x22V\x89\x90a\xb4\xba\x9a\xd3\x14K\xe1\xa5\x8c\ N\xb4\xc4q\xc8\x90\x06q+\x81\x94B\xb1@U%\ )~\x19\x0c\xe1\x8c\xd5H\x19\x99\xf8S5\xdc\x15\xfc\ \x84\x0b\x93(\xad*|Sj\x11\x0b\xbc\x06\xc2]$\ \xd8\xc7\x1cn\xb4\x0a\x8d\xe2\xc4\x18\x22\xb3\x16\x14\x80\xe0\ \x08\x0f\xf4\x00U\x1f\xfc\x9d\x94/\xf6\x22\xf5g\xd1d\ \x95\xa8\xa5\xdax\x22s\x10\xfb\x84[\xb6\xfa\x1f\xa5\x08\ 5\x01\xe0Tm\xf7\x9e\x03\xf0\xd5\xb27\xd5\xbasj\x07\ \xb2I\x98\xf0\xad\xcc\xbd.\x1a\xa1V\xb5\xad\xad_Y\ =\xb7\xf9\xfbp\xca\x82\xd0\x0eGG\xe7\xc9\xfbQ,\ \xe5\xafpO-|E\xee\xa0\xd8]\xae #\x0f\xf3\ U\xcd\x0f\xf0\xfat\xaeH\x93\xe4A\xbd\xc3\xcb\x94e\ \x9a\xf6W\xe1\x04\xb1\x92\xd3NC9\x13x\xc79\x8a\ \x1c\x94\xdar\x03\xc51\xea\x1c\x94\xdar\xc7f\xd3\x9a\ C\xd7\x89\x82\x8d\x80?~6\xed?k\xee\xab\x8e\x98\ 6\x93S?\xac9l\xc8\xb8\xb1\x16q\xe5\x16\xc3\xd3\ \xd0\xeake\xd0\xea\x17NC\xab\xaf\xa5\xa0\x158\x98\ \xa5\xd5^\x7f\x9a\xad\xd9u\xcdK\xfdb\xd7\x93\xa5*\ ]\x9b\x04\xd6\xc2\xacvU\xdbl\x8bv\xeb\xdef\xd5\ \xdbl\x9fvt\xd1\x86*\x8a\xbd\xd5\xd5y<\xbai\ \xb76\xf0\x93L\xf1\xd5\x12\x9fP*f\x22Wgm\ \x1a\xc9\xb5^\x07\x9bZZ\xc8\xd7\xac\xa3\xac|\xcdz\ \xdaq\xf7\xdf\x5c\xb3\x8e\xd6\x9c\xfd\x7f\xc5Y\xd4\xcc\xb9\ \x15z\x059zC\xfc\x5c\x07B\xdd\x86n@\xd1Q\ \xadn\x0bm<\x86\x9a\xe3\xac\xfe j\xc0\xdfY\xb1\ \xfe\xf8\xd8x\x0c\xb5\x87\xf2\x05\xc8\xc7\x11\xbf\xfb}\xb9\ \x9bZ\xa1\xa36W3\xbb\xfa\xfar\x98\xbbuN\xda\ h\xaa\xb2\x9e\x04\x84\xd7\x8c\xa8\xf5L\xd7K\x11\x8d\x15\ \x9b\x0e\x04\xc7b\xad;\x80f\xbc]\xf2\xc1\xe3 \xb1\ .\x0aM\x13Wc\x01\x00\x84S\xb9(\ \x81\xe9\xdb\x17DG\x83>[QdC\xaajY\xa9\ i\xa82\xd1(w\xd5\x82\xd5\xe5\x1b\x14\xc8o-\xeb\ \x90\x16,\xb9kk\x94\xb4v\xc0\xc5\xaf\x11\xab\x1a\xfb\ \x16\x06[n\x02\xa3\x98\x98\xa3$\xab\xc4'\x89U)\ [7|\xb4\x98N\x85\xbc\x83\xa97j&\xdb~\x90\ \x14,\xf8\x1b\xb5\x15\xa4\x92\xd7z\x16\xcbZ\x07\xbb\x10\ ;\xa8M\xca~\xd9s(\xde~2\xabX^\xeb&\ \x12r\xd3O;\xfb\x9f&\x9a)\xc0.\xed\xbbzu\ \xab\x05\xa1%\xc9U\x1e\xab\xdb\xbd\x1f\x8b\x07\xab\xf5\x09\ \x1f@\x22\xe1\xc1\x96\x0f\xd98\xd7Z\xf6\x8e\xb8\x9d\xfb\ \x93\xb9\x98{\x89\xf0\xf4*0\x11\xf4\x0a\xba?\xad,\ \xdas(\xc82\x05\x18+\xbf\xe8U\xc9\x89x\x1f8\ aW\xdeM\x02`=72cZ\x8f+#\xb5\xec\ \xb4\xc4V\xbeF\xef\x8fwMo\xd5\xcf\xe6cl\xee\ \xf0\x01\xeb\xd8\xf2\xcci\xe8m\xed\xc1=\xa8\xdb\x8d\x86\ \xb8\xce,>lTU=\x11K\xee\x12\x13\xae\xe0\xf2\ \xed:q>\xe6\x1a\x0etP\xc1\x81\x9cx\xac/\xa2\ d\x9d\xbb\xd6\xecp\x9c\x00\xf7\x9f\xa4'\xc0M\xf1\xe2\ \xa6\xc0\xd6\x9b\x95\xd6H,\x95\x07P\xdb\x07\x8b\x917\ V\x8a\xea\x92\xfe\xc3%\xd4\xeaoC\xe8\x03\xfat\xbd\ \x9b\xb0\x04\x89\xb0OA\xa2\x1cL\xfd\xb4\x9d0V8\ os\x98\x93cJ\x9f\x87\xf6\x08\xcf].\xb9O\xaf\ \xccp\x02\xe7Dp\x18K/\xbf\xe4.8-f\xbe\ 4\xe6\xe2\xe1\xafm\xa6\xb53\x0cJ#Y+#\xa0\ \xe0\x13\xa1\xf2\x9d`\x91\x8a\x9f9`(q(c\x82\ p;\x97!\x95\xceEB\x83\x18{1\x1c\x96\xe8\xb4\ 1I\xd1\xfa\x83l\xae\x1d\x03\xed\xf7\x15\x94\xffT?\ \x05Y\x98\x1ey\xf8N9\x8d\x08\x99_\x8e\x07\xec6\ \x84\x0e\x04\xb7\xe8p\xc2\x96\xdb\x1a\x018\xb0\xc3i@\ \xfe b,'\xd1B&\x827\x8c\x92\xc3\xf8\x86E\ \x8f\x81\x11\xbeV\xe3(\xb8 k\x88\xae,X\x8d\x1c\ N\x00\x80\x9f*X\xd4\xb5\xff'l13\x7fP\x80\ /\xdb\xdc!\xceE\x06\xcb\xbc8Z\xf3+o\xd0\xbc\ \x92f)\x85\xa9@^\x86-\xd3\x08\xb6\x04\x8cF\xcd\ \x19\xcf\x15J\xd2\xf3(\xf6\xff\x04a\xc2\x0b\xdaQu\ \xc6d\x9e\x1b\xc6\x93q\xb5\x9d=\x12)\x9f\xb3di\ \xfd\xe6$\xf2\xdc\xdb\x94\xddI\x89Dw^\xe8\xfd\xed\ \xc2\x9co\xb5\xd5\xf8O^\xc0\xff\x9e\x17\xdb\xf7y\x12\ \xdb\xcc\x80K\x1e\xfd\xf1\xfb5/=\xba\x01\xbew\x97\ \x99w\xab!\x97Qn\x18\xfa\xa3!^\xc0\x03X[\ \x97\xee\xd7\xa5\xc93\xb4`Q\x80\xf9\xb1\xe5\x81g\xd1\ \x85\xeb\xc0\xdb\xdf)\x9fx\xd97\xa7pL\xbc\xa5\xf2\ u\x99q.\x0d\x12j\xfe\xad\x06\xc9\xa2\xffzct\ ,\xa4\xd1\x115T3W\xd7\xbf\xf1z\xba\xc6\xea\xaa\ \xf6\xdf\x1c\xeb&\xcb\xbaZ*q/\x1bC~\x90h\ \x91X\xaa\xe28/3\xe1\xa7@\x0dK\x9c\x80*\xe8\ 8\x85\x85\x0a-a\xc3j\x90\x05q\xbb\xc3\xc8L\xab\ \xeb,*\x1fB\x8e\x0d\xfaHg\x91F\xfba'Q\ \xe3\xe0\x1f\xfd\x1c\xca\x88p\xb3\x83\xa8\xe5\xb8\xbf\xd41\ d\xb6ja\xe6\x8a\x02I\x8eM?\x88?\xbbv\xad\ csW\x99(m\xcc\x9e\xff\x16\x03dA~c\xb6\ \x9c'\xa6NC\xa5\x87\xb2\xe4\xff\xf6J\xd6\x1e\xb3\x7f\ \x89Qn\xb6\x9c\xe6\xe8\xd1c\xa8\xcct\x1c-\xc4\xa5\xab\xe3K`\x19\x91\ \x08$\xf2@\x1f\x1b\xf4\x0af k\xcc\x94\x91\xed@\ \xb0\xc2\x10K\xf1\x0a\xa3b!\xaf\xf1\xe0\x08\xf5\x03\xc9\ \x11QL\x88\xb5\xe3\x159J1\x13A\xe6\x9bt\x90\ \x1b \x17\x8e}\xc3\xed\x16>0\x0d\x106)\xe8\x94\ \x17(\x17\xa8\x85z\xad\x00l@2$W\xc0\xd8<\ ^0\x1b\xca\xfc\xb4\x88\xc3+\x8f.=E\x80\x96a\ a\xd38Zv\xf1\xc2!\xd0!S?7-\xa3\xe5\ j\xa9X\x12c.\x5c3\xf8\x89\xea\xbd\x8d\xa6pX\ m\x83\x98\xd1\xba\xf2\xce\xd3\xdf\xd5r\x17\xa7z\xa7r\ \xaa\x8d\x1c\xd6\xb2\x8f\xdd\x0d\xfa0j\x9cw\xabd\x9e\ \xdbym\x83\xf2X\xe1\x80\x9a\x9f+\xeb\x9e?]W\ \x19\x87\xc5^\xde3p\xa7\x8c?9duJ_\xea\ \xb6q\xb5?T\xb4\x18G\xf8L\x8c\x01\x1c\xf20\xf1\ K\xa3,X\x90\xee\x9c\xa09\xdaE\x1e8\x7f{\x08\ x\x0bX{C\xa8\x8dz\xab\x15os.\x89\xf6\xa2\ \x97M\xe7\xcaeL\xbe;\xf2\xceI\xbc\xe6{\x99~\ \xf6\x8bo\xe0\xda\xef\xb6H)\xd6\xcb\xbe\xeb\xb9\xdc\xaa\ \xdadV\xf8l,\xa73\xbd\x11r\xa3\xee\xda\x9a\xe8\ \xe2\xb0\xa1\xf0\xc5~\xdd\x8b\xbd&\x93\x87\xfamV\xee\ >\xeb\xe5q\xd7\xdc\xdc3\xeaD\xbfh\xa4\x9evV\ t6\x09\xe7\xcds\xaa\xd5\xde\xed\x86\xd5\xb0<\x0d*\ \xf6F.\xb5\x8eU\xa8{\xa0m\xb5\xfc\x8f\x86\x82Y\ \x22\xe3\xa9\xa3?h\xfb\x15c\x04\xb1\xf4C\xbbb\xf1\ \xbb\xae\xafMYLE\xf3\xc1\xb8\xed(\xbdU\xe6\x9d\ \xa3?\xe8\x1a9\xf5\x96\xa9\x96\xffZ\xc4/\xbbJ\xd9\ \xde\x1e\xa5\x0f\x8d\xfe\xcb\x0f\x9bA\xbd\xc5\xfb\xdfh\x9a\ \xef\x94I\xccrvr\xce\xaeU\x9e\x9fM\xdbK*\ 7;V\x81c\xee\x1c\xfde\x93\xe3\xf2\xbc\xca\x15\xb4\ \xdb\xb4GQ\xb0Z\x84\x96\xa1V\x9bW\xb0|\xc3\x07\ (\x13\xf9\xda>\xf0\xe0v8!xZ$\xc3\xc8X\ h\xeb\xe2\x95\xef\xdd|A\xcf\xba\x17U&g5#\ \xa9U#\xb0\xccz\x12\x0a\xd6.\x82\xe8\x99H\xbcP\ \x87\x89\x9f\xa42\x9c\xdc\x8b\xb1Lo\xa5\xc4P\x13\x07\ $\x80\x92b\xf2\x96\xfd\xdf\xb5\xb8\xaa\x84R\xd22\xdc\ JmL\x94\x05D\x05PK\x8a\x85J\xbe\xfd \xcd\ \x90\xa6\xd4\xcb\xfaI\xc5\xe5\xc2\xbbS\xe2\xce\xa5\x9e\x18\ 4R\xee\x89\xc3\xf0>\x9d\xab\xe8\xb1\xfa\x0f\x07\x0d\xb8\ $[\xbfK\x90\xb31 *\xda\x09\x09\x8cf\x08d\ zE\x17\x80Dk>(\xe0\xa4\xdd\xde\xc6\x99C\xc4\ \xc1\x02\xe0\xdd\x22\xc0P\xbaJ\x0f\x8b\x7fv\x19U-\ _\x17\xda\x01~\xb8pK\x90\xb4e\x1c\xdcS5\xd6\ \xbdr\xeb=n}I\xf7\x8cK\xa5\x80L\xb4\xad\x14\ *\x1fpF\xf9\x88\xd47\x03z\x1dH:6\xb6X\ \xe9\x92\x84\xdbK\xdd\x16%\x06\xfa\xcevcy\xbc\x18\ D\x0e\x02\x94\x14\xb0\xa4\xd6t\x87 u\x10*\xcb\x90\ `{Y8g\xfe\x90#\x06\xb6\xe9\x8a\xe2\xeb\x04\xd5\ L\xc6 \xeb\x92\x0d\xca/\xad\x87\x12\x82\x91[T\xad\ D\x81\xca?\xf0\x1b\x88]\x1f\xeb\xe2\xec\x5c\xe2\x84&\ \x1c\xb2\xba\x81\xf4s\xce\x01\xee#\x1f\xba/\xeb\xef3\ \xa4r\xd6\xa2\xf5]\x95\xadY\xd75Y\xb5\xac_\xf9\ \xc1\x92\xfd\x0f\xf4\xcfk\x22a\x8cu;\xeb4\xb2\x8f\ \xeevV\xaf\xd4\xc2vf\xac\xed\x0b\xc9\xb2\xe5$9\ \x83-=\xc2\x1ce(\xb4\x9f\x22\xabM\xbb\x19\xca\x90\ wL\x90\xf3\xac]O\xbc\xd4@*\xf9\xfd\x96\x0a\xed\ 2\xf7\x96p=3\xba\xcf\xe2\xa5\xdf\x0bn\xbd{T\ @\xccI\x85 4\x16\x187:\x8c\xd2\x9e\x0e\xb2\xfb\ \xd0\x18\xb4\xdb\xdb\x1d\xb1\x7f\xc0\x7f3QD]ju\ \xd5\xed\x86{pn\xf6\xfaf$\xda\xdb\xb4\xfc\x06\xab\ \xf6|C\x5c\x14\xcbZ\xaa`1S\x8cIbxE\ \x01Q*\xab|\xd1\xc0\xa0u\xbc\xc7,\xab\x91\xe2\x9d\ \xdf\xb6\xf2-\xd5+\x0c\xdc\xbc\x11\xb7\x154\xb2\x00k\ E#\xf5&g\x9d\x83\xe6\xb71\x17b\xfd(\xecT\ \x94\x94dt\xbbp-OYg\xd8\xb8\x07\x0e\xa6 \ \xca\xd6\x9d\x1d\x9bX\x83?\xe41\xdb\xba\x9e\xe6\xae\xac\ %\x97e\xa78\xee~\xd3m\xd6\xda\x16\x81\xad\x96*\ *X\xa7\xa6\xac\xe1\x06X\xf2\x96\xdbh\xeb*\x8f.\ k\xf7\xba\xf5\x86\xad\xa8\xc25T\xa2\xcb\xca\xc1Z\xa5\ _s\xb8\x99\xb9c\xa5j\xb3\xcd`\xb5`\xffru\ %f\xfe\x9dRX\x83\xd0\x1c^Q\xa2\x07\x14\x9c(\ \x8f\xc6{5^\x99\xb0\xd4\xfa\xf2^L\xe5\xcc[\x05\ i\xc7\x88\xb8lO?\xc61C\xd3\xf1\xbd\xb8\xb4&\ \xe7\x92\x9a\x91\x84j\xe8\x83\xd5\xef\x94\xd4@\xeb\xeca\ fW\x9c\x12d6\xa3\xb4\x09se\xed\x1f^\xf5r\ \x09D\xc8#`\x1e\xddJ\x98r]9A\xdf\x00\xe0\ \x1c(%\xabF\x02x\x84\xba\x12\xbc\xa7\x07\xec\xde\xd1\ \xd1g\xcds\xb4w!7O0\xf9HJ7T\xe5\ W0\xf1B8\xfc\x94\x13\x83\xd0R\x02\x83\xcc*\xeb\ gG\x9f\x9e\xfc\xf0zv\x15Dc/\xe0\xc7\xbe^\ \x86r\x823\x83\x81\xec\xc3\x04\x8eb2\xcd\xd1~\x0b\ \xc2\xc2J\xdd0<\x91\xc0\x94\xa3\x07\x08\xcb\xf8\x98\xd3\ $\x9d\xc7\xa4\xc6Oc|a 5?\xf0\xbd\xb8\xc3\ s\xc8\x19Of\x9e\x9a\xb6\x89\x97dR\xfa\xa1\x1a\xe2\ \xb3\xfd\xed\xa2C\x88\x22dc\x92\xd4\xa9)\xb3\x83K\ TW\x8af\xb3\xda\xf2o\xa0B\xff\x1b\x0d\xaaR\x0b\ c\x9d\x08\xf5\xa5\xb5X\xd9\xa7\x91\x1b/\xab\x86\x0b3\ \xe79\x94\xa9\xdf7\xe2)f.\x1a%\xc8B(\xd5\ Z`\xadW\xa7u\xafu\xcele\xc8\xeddb\x03\ \xbb(\x11\xd7,L#\xd0\x92\x10\xd0\x00p\x0d\x92Y\ \xa3\xefV\xd3\xd5\x8e\xdcZuW\x9c\xc1\xe3h\x05\x80\ \xf2B\x8b%/\xec\x17\xb8\xfe\xe5\xfb#/\x90\xe1\xd4\ \x8b\xd9\x19\xd0q\xe5\x91!\xa1v\x89Wm\xf6R\xa3\ \xd3\xacc\x9do\x04J}\xf5\xc8\xccL\xdd\x02TR\ &z\x02%W41\x05\x96\x99\xd8\xea\xac\xde\xe6x\ \xe8Yc\xa0Z\x0d\xd0\x12N\xcd\x93^}B\x8cM\ \xd2l\xb0B\xef#\xd9\xe1\xa0m\x0d{\xb5)\x1f4\ \xd6\xdc\xbd\x8b\xe5\xcd\x99\xbcK\x01\xff\xdc\x9bc\xce\x0b\ \xeaG\xa7\xb8\x97=M\xff\xc1\x9a\x9b\x94\xc3P\xa3I\ #\xb4Z\xde\xe1_\xa5\xa3/\xf6\xf2\xec\x8f\xf4\xf3D\ M\xd9\xe7\x10J\x16 o\xcc\x1b)0\xd7\xc4\x22\xbf\ z\xf8p\xc3\xbdY\x13>6\xf1\xa3UbkF\x8d\ \x05\xa5\xb1\xe0\xa2wr\x04L\xe4w/\xbd\x18\x89c\ \x19\xc0\x8d\x96\xbe\x14\xee\xba\xb6\xf9\x0f7\xe3E\xeda\ \xb4Nvj\xe4\xe4Wl\xd3!\x83{sJ\xdf\xc2\ \x7f^\x88gsv\xebTfH\xec,\x9dw\xd6d\ \xa1\xb4#Va\xe0_\xb3\xfe\x8c\xa3\x13\xdb\x0f\xd6\x15\ \x94[2\xfch!P>\xe8-\xcc\xe5t\xed\xbc\xf0\ \x14^0\xab\x9e\xd2-\xc2\xacx\xa1\xae\x1e\xf2\xc3,\ Lj\xe0Z\xb1!\xab+=$`J\xed\x8c5\xcd\ LUp\xac\x9c\xbf\xb0\x14E\xdc\x91\xa0I\x1a\x1d\xf9\ \x0b\x92H\xc9\xd2\x97,F\xfc\x85\xd6\xe6RkM\xdd\ \x92w\x895\xe8\x5c\xa0\x8dP\x99C\x8a\xd0[\xf0>\ \xb9\x84\x8d\x8c|6\x85\x1e\xa0\x03\xb3\xa9Y\x82\xcfl\ M\xb8\x03\xc0\xc0\xc3\xf0\xbdA\xd0H\xdc\xfd>\xc7\x08\ \xcf\xa2\xa5>\xab\xe8J\xac\x01\xa5Ad\xfb\x12\xba\x04\ \xfd\xb2\xfdB?\xc2\xf3}\xcc\x19\x1dG\xd1A\x17\xf6\ \xc2\xce\x83\xc2\xf9\xdal\xa6\x91\xf6y\x8e\x948\xfd\x80\ Y\xaeV9}\xd9\x19.]\xeb\xb3\x89}\x9c\xc9\xab\ :[h\xaf\xf0\x8d\xb5'^\xea\xb7\x0c\xfb\xe80o\ \x16X\x95w\x9a\xfa\x0e\xdb\xc2\x9aA\x15\xfe\x9a\xdeC\ \xc8C\x7f\x95F\xc0\x8c\xfd\x84]\xd9\xad\xf6\xdc\x9d\xb9\ \xe0\xe2\xb64VY\x98\xefP\xf2\xa3U$.\x8f%\ \x1ctr\xfa\x0eK.\x1b\xf7\xdb'\xec\xf2\x02{\xfc\ \xe7\xd34^\xc9\xa7\xbf\x17,\xb8\xaaT].\xe2*\ \x08\x9a\xd6s\xc9\x8e\xa5d\xb3\xf4U\xbd\xb2\x03b\x83\ \xf9~\x86G\x897n\xbb\xadc\xac[\xd7\xa97\x96\ A+cd\xf1\xf2\xfc\x82R\xfe\x91\x05\xae\x09\x8e\xd1\ _z\xa1\xac\x7f82A\xab\xf6\xcb\xb15\xa8y\x1f\ #\x9b\xb7\xb5U\xd1\x5c\xa4\x1a\x1aS\xed\x1a\xc6/Y\ \x94\xaeJ\x988q\xad!f|\xad\x12\x1em\xa9\xd6\ \x0057,@\xccl\xa03\xb9v\x1a{\xb7/=\ \xcc/\xbbm#Sk;\x97\xa9\xd8\xed\x14\x09lw\ \x9eZ\xd17Pk\x15\x93a<\xa9\xc0\xf0\xf9=\xf5\ \xc6:\x0a\xff\x89JAh\x00\xe8\x14\xa8\x98`\xd5\xa4\ \xe6L\xa3\xe8\x1a\x9b\xd3\x9eE\xe3\xce\x18\xed3\x91\xe5\ \xf5\xc4a\x8a\x86\xa6I\x06ag\x1b\xb6\xf7*N\xf8\ qu\x8co\xe7\xb7P\x8e\xd1\xe2\xe3{\xf5\x88\x9c\xae\ b8\x8cg*\x1d+b\xd7\xb10\xa0\x9c\x88S\xe0\ 4\xd4\x884V\xd1\x02\x91\xca\x07\xc7/\xddhJ\xde\ 9<\xddn{\x12\xb75\xb1\xd5\x8am\xf3\x94J/\ {v:V\x1a=\xf2:\x02\xae\x9b\xf8cN\x0d\x00\ \xd2\x15>\x17\xc3\x9c\x83D\xcd\xad\x92|\x16\xc7\xb5\xfd\ \xf7j\xae\x12\x854\x19\xb5NJ\xae\x01\xb5\xbc\x94S\ \x93\xd2}\xdc\x090/^6\x81T\xb5s\xb6!\xa3\ \xf3wbt\xf8\xd2p+\xea\x03\x88\x15YM\xa7\xf4\ \xa5\x1f\x00U9>\xe3\x1b}72\xfc\xad\x85\xf3^\ \x85U\xb9+Z\x7f\xcd\xdd#\x17\xa7\xbf\xba\x9e\xce\x19\ \xf0S+k\xa6M\xa2\x0cY'\xd3\x01\xdd\x91[\xb9\ \x11\xea':z\xec3\xd5Z=\xe3\xe5\xb9[\xb6\x12\ 3?n\xb3B\x05\x87\xb5\x22\xb7\x5cw\xc1\x8b\xaf_\ \xd5\xf0\xbe\xd9(<\xe1\xb3\xe9O\xd3\x1f\xa7/6\xa0\ \xa4\xb6$RH\xe2\xb0\xde}\xf7\x8b\xad&*E\xba\ \xee\x10i59*\xca\x93\xf5\x05P3\x0b\xd9*\x12\ \xc1\x01>\xd2w\xc4\xee6n\xb4\x9d\xef\xff{3\x9a\ \xa1M;\xe5/\x8d<\xc9\x92\xa3\xd1\xf9[7\x87\xe6\ \xb6\x1d\xd7G\xd7\xb6U%\x7fqV\x9d\x8f\xf6\xfa\xd7\ \xe2\xd6huQ\xbb\x9a\x0e\xb3\x0c\x17\x1d\xaa1\xbaX\ \xb5{\x91\x8a\xdc\xfa\xc7\x1a\xa8\xadW\xbe\xc4\xb3\xeb\xa0\ ~m\xb6]\xce\xf2\xf3\x10\xa2\xfazk\xfah\x0c\xfb\ \x91\xf1\xfa*\xdc\xfa\x8b\xe1\xfc\xc5Y\xf5\x030\x07&\ }:x5r\xb3h\x84\xd9)\x7frmR\xfa\xfe\ \xd8\xccyM\xc1wMQ\xa8\x91\xf5o\xc8\x9a\xb5\xe6\ g]\xde\xecX\xa0\x8d\xe4\x04\x1a\x97\x8b;\xbb\xd6(\ \xaflr3\xd1u\xd6\xbc\x9c\xa5\xa2\x1a\xe4\xff\xd3\x5c\ \xf9QWS\xbf\xfeU\xf0f{`m8\xf3\xa3\xe2\ \xf6\xd5x\xf3\x17\xc2\xfa\xabp\xe7\x07\xe0\x0e\x1c\xfa\xe2\ \xe4\xf5\x9b\x0a\x16\xcd\xef\xaa\x8eo\xae\x0d\xcb\x05\x7f/\ .\xdd\xbc\x1d\xbf2\x9bns!*\xd7)\x12!\x0f\ \xcb\xc5\xa5\x9d\x8b\xd4\x86M\xaf\xb7\xec-\x195\xb7\xfd\ kr\xea\xb6w\xb7\xaf\xb7\x9e\x8f\xcc\xa7\x1f\x13\xb5\xbf\ \x86\x08\xbd1\xd2\xff}\x19\xba\x0e\xf5b\xc4\x0bz\xfc\ W.&\xb1\xef\x85W\xab\x80\x8c\x0c\xf4\xebP\xa2m\ aQ\xf1\xef_\x85\x91rCS\x11\xcb\xbc\x14Z\x8d\ W\xa9\x9d$X\x17)+3L1\xad\xac\xca\x8c\x89\ \xc3\x98\x9fBo|\x8f\xbd\xc6\xec\x09\xbd\xe4\xca\xd4V\ ?\x22)\xdb^l\x0f\x1c\x12\xa3\x0d\x91\x95/\xc2\xe1\ \xb8C\xd3\x9ck[\xac\xcc\x99\x13\x8cx\xc4\x16\xce\xdb\ \xdd\xbd\x0cCk\xa4\xc0f\xb8\xc2~\xf7E\x0e\x86B\ \xc9D^\xd2\xc6\xce*\x0a\x1b\xfa\xea\xe5\xc8\xc0x\xe4\ \xd9\x01\x06\xcc\xc7\x9c\xb7\xcc\x13\xebl\xfc\x94d\x01\xa7\ \x10N\xa7XpPU\xf0\xbc\xaa\xe0EU\x81\xee#\ \xcfy\x8b\x1d\xb9K\x9f\xd7\x96\xbe\xa8-5\xfdj\xc6\ ^\xddwe\x8d\xe7\x8d5^\x14k\x14\xf2y{b\ \xea\xc5\xd7\x8a\x121g\x0d\xac\x89\xf0\x82\xe5\xdc#\x1a\ \xc2\x08i\xc6&\x5c\x1b\x97\x13\xb1\xa0\xbd\x9c~\xeb2\ \xe7\xc5lo\x7fo\x7f\xb3c=c \x9b/\xfeC\ \x96r\x83\xe5([6\x1e\x18\x03\xc5\x87R\xe5C(\ ks\xaa(\xcbU\xd5\xcb\x921\xf7\xea\x99\xaa\xae\xf2\ \xbc\xb9\xca\x8bR\x95\xcd\xa4\x97\x9c\xd7\xf7$\x96^\x22\ \x8b\xb9\xb4\xa2%\x19\xd3\xa0\xfb\xefTj\xb7d\xf2\x91\ \xc6XE7\x11&\xc4\x22\x86\xad|\xad\x0dO|\xf9\ \xe1u?\x17\xb1\x89=\x85\xf1\xe08\x8b\xe2t\xde\x11\ \x1f%\xac\x10\xf1\xd8\x01\xac\x159\xa0\xa4p\xc2\x0da\ \x9f\xcd\xd9\xf5C;f`\xd3\x9e8\x0c\x02z\xad\xd7\ \xd6=\x09}/\x1eEP\x83\x9dY\xd2\xe7\xbd\x0a\xc6\ \xf9\x09\xeb\x1c\x05\x11\xd9\x16k\x13\x99\xca\x0dU]\xbb\ \x22\xee\xd0\x81{\xd3>_\x03T&\xbbV\x00{\xb1\ \x060%\x9b\xd9\xee@x\xca|\x08\x95k\xbe\x15/\ \x8a\x19\x987\xee=\xe1:\x83p\xb5\x901y\x09\x91\ \xdb<\x1f}j\xfdh\xa1\xf42\xea%$\x17{:\ \xd1:\x04\x81\xe2r\xd1Y\xc9\x10\xcf\xceG\x83>\xba\ \xf1S\x90F8\xf6\x0dy\x90\xdf>P\x91\xa10h\ \xe2>\xf6\xec\x97v\xf7\x0esX+\xe4W\xa9\x0b\x02\ \xd4n\xe5:\xd5\x02\xb0\xacmv~\xac\x5c\x9dZ\x10\ \xda\x02(k\x7f\x1cM\xaeY\x80rfj\xb1\x02\xb9\ \xd8\x06.'\xa9\x113J\x16\x18v|E\x16\xb0x\ \xf3\x9a\xc6V\x9f\xe6x\xa3Fd\x96BN\x00d]\ \xa7#\x15\xe4\xedMl4t~\x16O\x8c\xd9\xc5\x0c\ \xedE9\xe8\xa1N\xcf\xa2R\xc1\xe8\xd0\x1d\x9c\x13\x86\ \xbd\x90\xd9B\xde\x00\xbb\x90\x14\xc8q\x22\xfbb\x9e\xa6\ \xcb\xa4\xbf\xb5\x95\xa40\x19\x08`\x16D\xb7\xbdI\xb4\ \xd8\xfa\x03H\x91X\xc0\xd6\xde\xee\xce\xfe\xc1\xf6\x8f\xdb\ [\x7f`\x00]\x0e\xb2\xd6\x85z^\xda\xb5\x17\xa0K\ \x08\xb0\xcdI\x92\x1b\x08\xd9\xfe\x8c\xbdXUG\xc2[\ \xc3(\xc5\xb4f\x9b\xefu\x9a[\xcc\x97\xc3wf\x86\ \xbb\x04\xd5r9\xbb\xf2o\xc8\xe7\xecV\xfa1L\xde\ \xc2O\xc8;\x8d\xd7\x95}\xee8|f1\xb4%\x05\ \x15\xe6I\xd1\xc6\xbf\x5ce\xe1\xf9a\x01D&\x22C\ 1\xccVND\x86]o\x16\x18v9fyS\xd1\ 7\xf9B\xd0\xb1\x12\x04\xe1\x1c0\xa3H`J\x02\xb4\ \xabz\xc2\xb6LL\xaa\x8a294)Z\xdc_\xd2\ \xb2`\xa4\x8f$\x95\x1e\x85\xc5\xbb\xb4\x8d\x84.;\x14\ \xe9\xd8\x9f\xf1a\xa0\x1a\xe5=!\xa0\x8eL'l`\ I\xc7\x93\x15\x08y\xee\x05<\x1dh\x93D0\xa0\x87\ h\x15\x8b\xa9L\xfc\xd8\xf06\x1d\x08\xcfl\x8b\x12\xa7\ \xb1\x8b\x98\xc6r\xdb\xdbi\x06Wa\xc0\xef\xbe\xb0\xd5\ \xa5\x14\x05\xb9\xf4\xadw\xe7/V\x0b5@4\xb0B\ \x9e]0\xaf\xc2\xc2nB\x8e!;\xfbZPi\x85\ \xf9#\x9ad\xc1\x10\xa0\xc7\x9c\xd7\x92\x1b\x81\xb6\xfed\ \x04\xafh{\xa5bBjk+\x9d\xf1i\x1a\xf1\xc5\ \xeb\x0a#\x95\x00\xd7\xb1\xaf\x91\x1e\x08\x06H\xc5\xbd\xd2\ Z\xe7\xb0jk\xbf\xe5\xc6\xab\x92\x86\xbe\xd4t\xdb\x16\ pu\xfd?\xc4\xd0\xedQ'\xfb1\x8d\xe5L\x18(\ \x0a?\x95\xa4v$\xa46Q\xff\xdc\xf6\xc2Yp)\ [\x0c\xd7\xdfl\xd9\x5c\xf7\xd9w}\xfb\xc6\xa9/k\ \xea\xb2?\x06\x02\x98\xcc\xfbs/\xe9\xe2\x89\x0e\xac\xba\ u\xa8\x84\x1bT\x1c\x94\xa9\xc6\xf22Q\xda\x19\xee#\ \xf3k\xd2k\x99\xa0\x9f\x00K\xceE|\xbeiD\xa8\ \xe4\x1e`\xe5\x19\xa8\x1b]\xdf\x9b\xfe;\x82\x03\xa0k\ \xe7fn\x1a*\xc3\xf9\xbc\x88b\xe9 \x87<\xd6\x93\ \xb9\x1fLaC\xe5\xc7\xf0\x90ne8\xad\xeb\xb5\xa6\ S\x13\xfc\xb2\xd4\x88K\xf2m\x1ds\xde\x88\x1b\xc3y\ \x10z\xe5Ptm\x91l\xc9er\xa8\x96\xcdj\x1f\ e>1^iM\xcb\xf5W\xbc\xe4\x7f\xbc\xf6\xec\xb4\ C\xf3\x01X\xe2vhF\xb3af6\xc6\xb2\x11=\ \x84\xf2\x00\xc4\xaa\xc9\xb2\x1e\xbd\xf5\x88\x12a\x95H\xb2\ p\xb8\x00#}\x8d\x0e\xcf\x14=_\xc5\xd4\x90\x0b\xce\ 9\x89\x89\xae\xe1\x8c\xa4\xc8l\x91\x0a\x5c\xd2s\xa5\x1f\ \xb7.\x90\x81\xcc\x02\x99\xd9G\x88\xfe\x90\x0d\xd8\x1d\xea\ ,s\x82p\x85}t\xb6\xceyK\xa0\xd23\xd5\x81\ \xf2rQ\xf9Y\x07\xcaJ\x95\x8e\xa0\x81&\xd9E\x92\ \x92\xack\xf0\xf6q\xa2\x83\xe3\xf3\xc5F\x85\x12I2\ \xe7\x06\x0fC\x90p:p\x9d\x07\x15\xbd\x9e\x02}U\ \x01Av\x16\xf8\xa8W\xa5: \xb1\xdb}.\xa4\xf8\ N\xdeM\xe4\x92\xaf\xaf|\xc5\xdc\x22\xf7\x86-\x13\xc6\ c\x99\xc8\xd54\x82\x0bd*\x93\xef\xf5%\xd3@\xd1\ \x013\xe0>\xb5\x92\xe2\xd9\xc1N\xfe\x8e\xdb =d\ NJ\xce%,\xbeK\x95\x96\xd4Q!\xbfH\x8f\xf1\ \xb2e#Y\xa5!,\xd1\x90+\x9d1\xa3$J\x99\ \x7f\xeb]H\x98\xc8,M\x01E:\xdcRnyZ\ \xf7C\x8e\xd7\xac=7A\xc9t\xb2\x8a\x08\xc9`\x22\ \xbd\x80\x15\xeb\x06\x94V\x0e\x5c\xc1\xda\xaf\xc6\xa4\x158\ \x0c\xe4\xdd|\x95\xfc\xe9]\xcd\xb7\xf8vJ\xd1`\x86\ s)\xd3d\x8b\x169\xd9z\xfeSn\x8d\xf3\xbeg\ \x94&\x88\xf3\x1f\x973\x1ftJe5\xa9\x15\xdcr\ f\xc9\xbbyg\x1b6\xd4\xce\xf6\x81\xfag\xbb\xf7\xa2\ \xe8-\xf9\xa2\xec-\xf9\xa2\xd2\x0fj\xef\xa00\x8aR\ \x12\x04\x0de\xb7P\xb10\x14\x1d\x1b\xb9qR\x0aY\ \xd8\xba\xfch\xa1\xb7D\xfd|\x19\xc7:\xdd,\xdf\x08\ \xa6\x12\xa8\xde\xbd\x00\xaa\xacn\x01\x9cO\xf4\xe5l\x17\ n\x7f\xb2\x9f\x1a\x91)e7\xda\xafh\xe2\x9eYG\ \xfd\x8a\x8c\xb6\x9d\xba\x1a\x85\xa4\xdd\xeed\x845\xe5\x8d\ \xd1\x85\xcd\xcbU=\xa6\xdf\x10 8\xa9\x1b\xfa\xcb\xd5\ k\xf4\xfdw\xee\x0e\x1b\x11GvM\xab\xf3R\x964\ '\x99\xd8/s\xcdtP\x91\xf0\xb3\x88OM\x8f\xf5\ \xfb\xbe\x1a\x05\xcc\xd2\x94\xf9\xf8\x22\xff\xd2\xeaC\xeb\xf3\ \xb7\x09k\xe0U\xc6\x9f\xe5*\x99k7\xe3P\x9d\xef\ cu O\xb3\xa49\xc1=\x87\x9f\xe2<;\xea\xf5\ G\x87\x89LI\xb1\xa7s\x8d\xa3\xa2\xe9;\x8f\x82l\ |/\xbc$\x89&>=\x0f\xd0\x11\xec\xa7\xbd\x5c\xc2\ \xf3\x04\xa4 /\xe08aV8\x0d\x8eI\xab_\x98\ 8h\xadRXZ\x083\xa8\x0f!\x08V\xe9*\xa4\ \x18\x1d\x1dF\x86\xbc4\xc5U\x14M\xcd\x83?\x0el\ *S\x19/\xf0\xed\x1d\xdd$Y\x15\xa8\xcb\xb5\xe6\x90\ &\x010\xbb|\xaf5\x11jP\x97\x1d\xed\x87\xdd\x81\ a|\x8b\xba\xce\x05\x8c?\xe2\xd0\xb8\xa8\x18\xf5\xf2\x16\ \x06\xe8\x5c\xaaR)9\xf2k\xd0\xdbU~\xfc\xe1\xbd\ \xd1\xc0\xff \xb2x\xc8\x99!\x80\xf1\xd1\xeeSe\xf8\ \xb5\xab\xfd\xc0\xf5k\x98\x1d1\x8d\xe7\x8d\xa7\xd2\x8aB\ \xc6\x11~\xe1\xe3\xe8~\x09\x90(Ho,\x97p\x1c\ \xab\x13\x96\x9fVt\xd5\xd4\x90\xce\x90cZjwY\ /X\x80\xdc\xa4\x82\x86jGtR<\x22\xc8\x0e\xa9\ \x7f\x94\xec\xc6\xe7\xb2\x06\x08\xbf\xf5\x95\xea\x9fh\xb00\ 5,\xcae/\xea\xba\xb5\xce\x14\x05\x87\xff\xbd\x89)\ m\xc52\xa6P\xd2\x94\xe5\xca\x9b\xda\x09Ut4\x16\ 3\xa1J\x99\x0d\x02E.\xc8\xf4\xc9L\x09\xaa\xd9\x16\ \xc2QZ\xce\xf9v\x8cd&a\xd8\xec\x09\xf9\x0c\xb3\ \x9aX\x8b+~xi%{\xb9\xec)}\x8aB(\ \x07\x86c*\xc3\x10\xd5\x84\xe1\x98\xaf\xe6H\xbe\xf4j\ \x0a}\xdc\xf8\xf4d\x93e\xb9\xc7e\xd6T\xa2\xff\x98\ 0|I\x84\xef\x01\xb74\x11\x8a\x16h\x99\x12?]\ Q\xf6\xa9$\x17\xae\xda1hCJ\x06\xb5\xfc\xc0\xcf\ \xe8!\x83\xf6\x1a\xbaL\x042I\x8c\x86Yy#\xab\ \x85\xc5\xe5\xcc\xfc\xa2s@`\x18\xb1\xfccE\xb3\x86\ \x17\xa3g\xfb/\xec\x5c\x87z\x22m\xb3\x89\x84\xd2W\ \xe6\xa0`\x22.~L\xf0\x8d\xf1\x8c\x89\xdaG\x12\xe3\ \xc2\xfb7^LH\xb2S\x84\x90\x83\xf0\xe1\x84\xa6L\ \x85\x91\xca\xf5=6\xc1\x0dsf<\x99H\x1a\xda\x9b\ \x8d\xf6\x0f\xde\xedp\x0f\xab\x07\x0e\xf3\x84E\x11\xc9u\ \xae2z'79\xccX\xc1\x09\xb4\xec\xa9\x10F\x18\ \x5cC1d\x1cTFF\x1d\x93\xabg\x12Pm\xa2\ \x0f\x0eF\x8e/>\x84\xc1T\xe8\x83\x05\x17h\xe1]\ \x139\xa6\x04_\x85\x7f\xf1\x83@^\x11E\xe9a}\ \x94&3\x5cR\xb6\xe2\xf2T0\xc5\x8e\x98\xde\x87\xde\ \xc2\x9f\xd8<\x95\x1fK\xa0\xcfX\x8f\xca\xe4_\x02@\ \x09?\xc2\x1764\x13\x86:\x08\x22\xeccb\xc2;\ b\xc8\x18\x7f\xa6\x8e\x14?1D\xa4\xef\x9c\x97pc\ \xc7,\x92\x97y\xc6M^\xf6+\xd93Q;\xb2z\ P4\xf3\x02\xda}\x81\x1aW\xb1\x13\xd8l\x19F\xbf\ E+Z[zB2\x87\x00\xf4\xffNux\x99\xdd\ \x81M4w\x98\x0b598\xf19za\x1a\xa1C\ %\xd1\xef\xe3\xcfvw;\xf0\xcf\x8f\x1d\xa4\xfblw\ mzc\xd9\xdd}8\x88\x1f\x1f\x0cb\xff\x05=\x8f\ \x19\xa1\xe3C\xc2\x89\x06o(\x8c<\x11\xd6\x0c\x88\x87\ o\xac@\x0e\xfc\x1ch\xd87.\x02\xbf#3\xa1\xab\ \x98qtv\xf26\xcc\xc5\xcbB\xa2]\x00]2\xaf\ \xb9\xb4\x02\x9a\xd0j?\xb5\x22\x8d\xe2F\xa1E\xa3\xaa\ \x8a>i\xdb\xff\x1b\x01\xc0\xef@f\x9a`L{M\ \xdc\xab\xa2\x15\x84\xb6a\xa0\xc8\x9a\xe20\x008\x08B\ \x8f+Q\x91\x98h\xcf\xf2\x86\x9b)2FZ\x93w\ \x98\x07\xd0\x07\x89\x0a\xeb\x8d\xfd\xe9T\x86v\xce?c\ \xb3\x90\x05k)`\xf6\xfb\xa7\xd2`\x7f\xff\x84cl\ \xca\xbbU\x82\xb3V\xd6\xae\xba\xd6;\x0fj\x9d%\xe8\ *\xc5\x83)_\xbe\xddAl\x14\xd45\x1fu\xd6\xb5\ \x9e\xae\xee\x9fmk\x1e\xd0}1\x0a\x05\xc8\xf2\x87%\ \xa2\xa2\x93Z\xcdr\x15Q\xe1\xa9*1~H\xaf@\ S\xd9\x120\xb2\x9d\x86\xb9\x5c\x8f\xa4\x9cQ\x846o\ \xbc\xf3\x90\xc6\x0ezz\xdchvy:x\x84D\x88\ \xc5\xb0t\x8f\x97\x14q\xad\xf8\x94\xb9(_V\x22\x88\ \xbb\xcb\xa7\xe6\xc8G0]'\xb9H\x11\xaa\x95\xcd\ \xa2-\xd0R2\x8e\x22L\x13\x0b\xb8-DG|c\ 7\x05\xb5\x86\xe8\x0c\x05\x5c5\x9b\x85T\x80\xedr\x9d\ 8\xa2\xfcV\xcckk\xf0V\xa2\x90\x06\xe8\xa5`\xcf\ \x0f\x0a\xe6\x5c1\xd7\xada\xd7\xc7>\xfeKEht\ \x04d\x84\xb3\xb6K\x9c]\xfcC\xfb\xf2\x15\xf2\xbf\xba\ B5\xdaL\xcc\xcav\xa5tf\xea~Q\xe6\x11*\ a\x11I\x97\xd6\xf3\x98\xb9\xbf\x1f\xfer\xd8\xd1\xfdf\ \xd7\x19?\xd5Yb\x15\x87\xc9\xde\xc8L\x06ioJ\ \xe2\xac-\xaa\xa6\x11\xdd\x01\xf1\xea\x9b\x82 \xeb\x83\x10\ \xb1\xd0)\xba\x0c\x00\x8cC\xf8\x08\x8c\xcd\x11A\xd1\xca\ \x81\xebH9\x93\x0b\x97[\xca\x8eK\xb7R\x0a\xb3\xcb\ !\xc2X/\x89/\xd7\x18\xdel\xe9M`\xae\xe6R\ \xeb\x0b\xe8,\xc8l\x85\xd7\xcbX\x8bi\xdd\xdd\x84Y\ \x5c\x7f+1\xec\xdf, \xa6k\x9d\xcacp\xd9\xa0\ \xb9\x12\xd6\x1c\xb4\xcbWs`\xed\xb0\x1dy\xc7\xe3\xa1\ M\xb6\x0f\xbf\x91e\x22\x1b\x1e\xff\xc3\xe8\xbb\xfe)v\ \xa1\x08S\x1cOHk\xec\x8dA\xb8\xd2t\xa9\xe6\xc3\ \x0a\x91\xeb\x14\xe6\xcaqs\xabF\xeaX:\x07\x7f\xd8\ p\x1a\xd7I\x04R\x07\xa6)\x10q\xc9\x0e\xb4\xf5\xa4\ \xe8\xe7\xe8&\xcb3,\xbc\x8a\xfd\xa9\x9d\x9e\xa9\xad\x1f\ r\xfe\xdd\xbb\xe0\xb1\x12\xe4\xed\xe7ZY\xc09\x91.\ ;T\xd6\xa6\x7fs\x99?\xb8\x1bT\xce~}.\xab\ 5:0/\xf8\xdfpx\xfc\xca\x9eJ\xaf\xf7|M\ D5\x8be\x89A\xca\xb6?p\xa5@\xb8\xc4YA\ \x95\xa4\xf1\xc4Y\xa1\xab\xa3\xb6\xf6\x0f\x95B\xba\x97\xcb\ \x04R\x85^%v\x85\xce\xbe{\xa2u\xabw;\xc4\ \x04:\xe2\x9e\x7f\xc8\x0avu\x01\xfc\xb0\xd31\xdf\x13\ \xbe~U\xccl\xb1\xdeNE=\xaa\xf6\x80upo\ \xdb/7\xce}\xb8\x8a\xbdP\x7f\xb7{\xcf+\xc7Y\ \xac\xd74\xce7\xd2\x83e\xde\xc0\xd6\xb5\xe4\xa4\xfds\ \xe5Nky\x8b\xc9PAM*\xbd\xa7=\x96\xaa\xa6\ M\xde,\x17bB\xdb!\x98\x1f\x95\xbf\x06\xbei\x90\ uVvW\xab\x18B?{\xb56\xd1\x0c\x1a\xaa\x15\ |\x06\x9b]\xfe\x1b\xbbv@*\x9d,N\x00\xd6\xdb\ |=\xf6vE7\xfeu\xc1\x08Z\xf4\xef\x02V3\ \x86O\xc9<\xba\x1dFqz\xa2\xa5\xb5\xcc\xb7\xad\x1a\ :p\xca!f-U!\xb4Y\x14\xb1\x93\xa8Z\xc7\ |\xc2\x19c{\x15\xd7\x00+\x0b\xa8kd\xf9\x0c\xdf\ \x9a>w_\xec\x8ewg\xd5\x0e\x97\x1e\xe6\xc1\xd6<\ \xdd~:\xb6\xd2b\x19o\xc6\xcc\x98n\x15\xd2\xfb\x1b\ \x8ebN\xb8\xe0\xfdb\x12\xf8\x93kz\xcfB\xc6\xee\ \xc2Q[a\xb4\xa3\x8c\xf6\xd55}\xd4\xb7(l\x9b\ \xb6\x95\xf3\xc07U\xb8\xb5#\xa4\x87$\x1d\xfa\xff\xb7\ \xc36\xf9\xf9Z]n\xaa\xa6\x91^r\x8cu\x0ai\ \xef\x12c!\xa2\xfd\x93\xf3\xde\x8c\xa5M\xdeW)\xdc\ .m\xc7\xcf\xcbB\x82\xea\xdc20\xd3\xf0\xe9\xc5?\ \xc2\x10\xe1\x94+\xaf\xdc\xa7q\x8c\x1c\xdfg\xdd\x87\x02\ N\x96\xd83i\xa8\xb5\xca\x123\xba\x15T\x96\xa8\x9b\ t\xd9 \xba\xeex%\xafU\x07o\xaa#\xf4MS\ \x90}mJ\xd8h\x0a\xcceA\xf0\x8fGQ\x1c\xca\ X_\xb2\x1e\x22\x89\xe4B\xd8\xd4\xc4\xad~\xdc(>\ \x99\xa1\xd7Yd\xe7\x8f\xd2^\xec\xd5\x83\xada\x99\xce\ \xa1\xb4\x9e\xbd\x07?PT\xdc\xdf\xe86\xbcV\xce\xd5\ \xaa\xf8\xf4\x0c\xc8\xf6{\xaf\x0bX\x9b\x9b\xff\x5c\xf4\xd6\ \x1d\xcb\xd5\xde\x82\x99\xf3\xfe\xb2\xbf;\xd2\x06\xae\x15\x22\ \x97\x8c\x0a\x97\x81\x9f\xa6\x99\x9dd]\xe2\xd6\xbc=\xab\ uq\xe9\xd26r\xd5\xb23\x9e;\xf3\x9d\x17b\xfc\ \xe8\xfc\x079?r4\xc2N\xbc\xd4O0\xe7d\x14\ \xdf\x9b`9\x8ce\xc2\x0f8\xdc~&\xee\xa3U\xe6\ @\xc0\x17QV\xed\x85\xf2\xca\xc3\x1b&\xd9\xf6\x07\xfa\ \xc0R\xae\xe6l\x9d\x87\x98&\x1d\x02\x81\x9d\xa2\x01N\ r\xbfX\xc84F\x01ALV1\x9c\x0a|\xe2-\ \xe3h\xbaB\x836/T\xaf\xf8\x98\xfa\xda\x0b2\x97\ f\xa5#|\x17GWH\xc1\x18v'g\xb1i\x17\ T\x1ak\xe6\x1e\xd5\x1aL6q\xb9~jk^\xbc\ W}\x99rc\x5c\xb26\xdeu\x84L~\xee\xba\xe5\ 8r\xe6fJ\xb0\xaa\xecU\xb9\xb2\x8a\xac-\xa50\ k\xbb\xee\x94\xcbJ\x9fW\x1c[\x95Y\xb43m\x96\ sd\xdc\xf3\xcf\xce\xc8\x0a\xe5\x91\xd9IR\x8aC3\ \x19F\xaa\x92FW\x0f:K'm\x0f\x0en\x09\xab\ \xf0\xba\x9a\xe2Ty#\xe19\xac\x935\x9d\xb5\xf0+\ 7\x07\xe5\x90l\xeb\x0ec\xe9u\xec_2\xeb\xf1\xec\ \x93\xf3$q\xa7\xd399:?\x1b\xe6\xec\x90\x91\x7f\ \x8cW~\x90vQ\xd6\xa5\xa7[\xb4\xb5\xa2'X8\ H\xd2\xf4\x1e\xc685\xe2\xf1}\x82\x1e%\xe4\xca\xc3\ \x964h\x10\x96\x89}\xecu\x04b\x1a\x1bx\xc2\xfe\ \xa7\xcf \x9a\xf5\xc4+tB\xba\xf3\x16\xcb\x808\x8a\ Tl\x80$>\x15\xb8\x89\xe0vXc\xe6\x09\x16v\ \xd0\x1e\x90\xec\xcc\xce\xaf/\xb5]4\xf4\x0a\xebr/\ 9\xfa\x18\xbe\x0f\x93Y\x5c\x88\xcai\x14\xde\xcc\x9b\x05\ \x8f\x91_\x1d\xf8\x98\xc4D\xbedw\x06\xdc\x87-~\ P\xb7-\x92\xd4\xc3\x0cJSc7\x89/ \xd6w\ \xcd\xee\xd0Z\xb4\x03b\x14f'N\xc4\xfb\xb7@\x1c\ \x9eQ\xceb\x8ae\xf0F\x1b$\x93\xed\xab1\x88\ \xd5\xf6x*\xdb\x9b\xea\x8b\xa7\x1b\x1d\xb3n5G\xce\ \xe2\x9bY!!\xb8\x1e^\x0c\x04\x1e>\x01FV\x0b\ \xf9\x05\xc6\xc7\xe9D#\xc7\xccp\xf6\xbd\xcaw\x1c\x12\ \xf3\x06\xa4A4\xbeE\xe3\xbf(.\x9a\x9bB\xd5P\ \xd9\x8e\xe6\xda\xcc\x90\xdd\xf3,&\xda\xb3\x8b(\x22\xf4\ '\xcc\xa7\xb9\xfd[\x09\x95\x84\xb9\xa3\xa3!\xdd\x0a\xfd\ \xcca\xf2T\xbag3e*\xa33\x90\x03\x85\xcd\xe0\ \x19\xc8\xbd\x0a\x99\xf5Q\xa4\xcc\xfd\xf3z\x8c\xa3;\xa5\ |O\xbax\xd3\xa0\xf8\x11I\x9fL\x0c\x7f~bU\ \xef\x02\xf1NdMP\x0f\xae\xf6\x99\xabY\x92\xb3n\ ^\x1fQD\xb7.d\xafQ\x8d\xa3\xeb\xc6\x96\xd1\xb5\ \xa3\xd9R\x86\xcd\x0d3\x17L\xab)P\x89L\x1b\xdb\ R\xadr\xe3DOd][\xacTq\x8b\x06\x897\ Y-\x97p\x8b\x11\xf7*\xdd\xa1\xa2s\xdc\xd2\xd8\xd0\ \xa3L\x83:/R\xd6+|o\xd51\xb6\xcf\xfa\xd6\ w/\x05\xe8^&\x1bM\xf7\x5c\x06\xcb\xc6\x86X\xa9\ \xdc4\x8c\x1a\x1b\x86Q\xb9\x19\xb1\x9a\x8dp\x9d\xfa\xc9\ \x04\xf6Ic[U/\x17\xf9a(U\xe6u;\xfe\ #\xbd\xdc\xaa\xbd\xc9m\xedX$%N\xf9\xfe\xdd*\ \x99\x1b\x0b\xc8\x8c\xdb\xd9\x05\x8ehk;\x99\xbd\x96\x1d\ O\xae\x22>%\xbeF3z\x18\xcf,\xe5\xf3@\xe1\ \xa8\x83\xf5d\x99\xdf\xd9=\x02\x15o\xcc\x93\xe1 A\ \xf1U\xcb\xa5\xc8\xd3\x8c\x05\xf0\xa5\x9f\x8c\x14\x00R#\ \x5c\x22\xbf\xd0\xc9\xf8\xd8\x90\xf8SV\xc5\xb2\xc3\xab,\ \x03\x0e\xfd\x9f5B\xb4\xd5\x0eQ\x07\xd1\xe4g\x22O\ p\xd0\xcf\x1b\x19\x88Y\x8c\x8a\xd1\x08\x0d\x0a\x99}[\ >:\xb9)h\x1c\xfeGj^\x18<\xbe\xe4\x7f\x0b\ l\xde\x18U\xc9,f\x98B\x8a%{\x0e\x05\xb6\xd3\ =P\xeaW\x9e\xb8W\x88\xdd'\x0d\xdb\x9a5. \ \xe4\x87\x18U\xeb\xf7R\xa5\xa2\x94\xb2\xbcs\x87\x9eE\ \x09\xc8\xdd\xcd'\x9e\x10*\xd4V\x89\xcd\xfd\x96Z\x15\ \x10\xd9Y\xde9\xefly\xf9lO\x87\xe6i\x83\xda\ \xeeF\xa8\xed\x96P\xdb}|\xd4\xf66Bm\xaf\x84\ \xda\xde\xe3\xa3\xb6\xbf\x11j\xfb%\xd4\xf6\x1f\x1f\xb5\x83\ \x8dP;(\xa1v\xb0\x16j\x9a\x93\x1c\x1e\xffzx\ v48\x16\xc7\xe7G\xbf\x9c\x9c\xbd\x16\xc3\xdf\x86\xa3\ \xc1[1\x1c\xfdv:\x18\xbe\x19\x0cFT\xad\xdb\xf8\ '\xef\x12\x80\xa2\xe6\x95\x0ca\xf3\x93D\x1cG\x98_\ \x11\x85\xfaDyg)\x8f\xac\x1d`\xc0\x98\xf3\xb0\x18\ \xc2\x0b\x93 f\xf2 {`\xe1\xbb6eOd6\ G\x11\xd0,~I!\xe5PGF\xeaY+\xa4W\ \xde\xcbM\xfbV\xa16k\xb5@\x173\x93\xee\xfb\xf0\ x\xc8\xe2j\x11\x1bn\xbd\xdb\x13\x03\xad/\xce\xbd\xc4\ \xb3*\xbf\xdc\x85y\x8cG\x1f>\xdb\xf1J\xbb\xc0\xcc\ }\x8c\x10A\xbc\xd6vWR\xfe\xee\xfa}G\xfb\xa3\ \xed\xd1;\x80\xf2\xe2:7\xc0XW\x8d\xfar>&\ \x0bxp\xc0\xb8\x15\xe6\x8a\x0c\x13\x0c\xcc\x14\xa6Y\xd0\ \xb0$\x0b\xf7\x17-H\xbf\xe7\xeb\xb9\xda\xefea!\ 3=\x8a\x92\xcf\xf1\x81\xe1Z\xca\xa5\xad\xdcQ:\xf3\ )\xae\x00*iH\xd9\x83\xc91\xc5w\xac#\xfc\xbe\ c\xb9\x1a\xaa\x99YD7\xfa\x84\xd1N|\x80\x9a\xd2\ 4nY\x8aO\x15\x92\xed\xc9\xb3\xd4\x1bc\xa4K\xa9\ \xa5\x87g\x18u\x0b\xef\xab\xf9\xaf\x18\x11\x13\xcd\xc6\xb3\ j2\x05\x1a|\x0d+\xb64\xdf(\xce\x17\xf4O\xa7\ q\xbe}\xae\x88\x82\xad\xc1t\xe5\x04\x93<\x8d\xac\x11\ \xbb\xab26\x80\xb1z\xda-\xaa\xc7w\xea2\xe4\x96\ \x9e\xe5\x9b\xa3\xd0\xff\xef\x13\xc7\x0c5\x0fY\xc7CN\ #\xbe5\x9a\x00\xb0\xca*\xcf\x04\x04a\xbf\xd9U\xb8\ JX\x10\x08\x00E\xd9+Xwe\xea\xfb\xc2\xa2\xea\ gB\xd7\xd2\x9a\xb2<\xfaY\x93\xe22\x9b\x92\xaa\xc5\ vW\xc8\x8f\xdf\xee\xd5n\xaa\x83X\xbaQ\xcdJ\x0b\ \xc8Z\xcdJ\xe8fe\x95\x08WT)\xa0\x5cm\xcf\ d\x9bl\xb5\xddOU\xc84\xbe&y\xd3\xe4s!\ &\xdd&\xcb]\xbfz\xed\xb1(F\xf2\xd9tE\x9b\ \x16g\x0d\x8cJQ\xec\x0a\xe4\xd2\x0a\x14\xda\x11~V\ \xde\xf2U\x80\xd6\x98+\x0b\x9ck\xc6\x1c\xc4\xbc6\xd8\ \xa6aWX\xea\x16c\xc9\x95\xb7P+L\xb8\x95\xd5\ y\x05\xe3X\x03Xi\xa2*7\xf7\xda@\x9di\x81\ _\x9d\x9e\x1f\x8ePd#\xbd\xab8\xb6<\x9b\xb5\x1f\ %k\xf8\xb4\x80\xc11`A&\xd0\xc4K\x1c\x19\xfa\ \xeav\x8f^\xa9O|C%\xaave\xe4^(\x1e\ s\xb2\xde\x91\x97\x01`\xbd\xe0\xc9Z\xb1q[\x9cL\ \x0dd\xa7\x9a\xb4\x03\xb9\xce6Q\x0dKK\xdf\x9e1\ \xb7\xec\xc0A\x00\xda\xf9V\x0bP\x97\xba\xf2T]\x19\ .;xU\x7f[\xfe\x8a\x1a5rW798X\ \x81l|\x109\xbc\x02j\x02\xd8\xd3*\xf3\xd7\xd7}\ h\x959\x96.\xfc\x90\xbe\x11\x10\xfd\x1d\x83\x84p\xc0\ \x08R\xf0\xc3\xa5\xa5\xd7\xcb4\xd1\xfc\x98\xe8\xb1\xe2\x97\ t\xc08\x0a\xd4\xc9\x93\xf1\x8a\x09\x17\x86\xfa\x0a\xd3%\ \xf6\x85\xfak\x90)\xad\xae\xb4d\x88\xc1,U\xf2(\ &\xe9,\xc8\xe8\xa8\xf0 \xbcQ:\xea&;h\xfb\ \xd2\xf5\x97\xca?\xed\x98\x8dOl\xe3\x0b?m\xe2\xd1\ \xbaY2\xac/\x97\x84\xb6\xce\xb6\xc11x\xf1\xfe\xd4\ \x1b\xcb\xa0\x95\xc2\xad\xd5\xdc5\x02\xb4\xe4-\xbdm\x0b\ (\xe5b\xb7k\x07ve`Dq\xed0\x10v?\ \x9f\xba\xd4r|\xef\x97\x932]vT\xe8u\xdaP\ \xd3\xd8\xbb\xb5.k\xac3\xc4\x17\xa5{\x8aX\xd1\xcb\ ?\xfas\x0c\x09\xbc\xac\xf3S\x1d\xdb.\xf9\xba\x18\x1f\ \xee\xa4\x8f\x0c$\xdbz\xe7\xbf\x0e.N\x0f\x7f\xcb\xef\ \xbes\x8c\x08\xe0\xdd\x1f\xc5Q\x928oM\xa4\xcc8\ \xaawW-\xb7zif\xf8\xc8A\xa3\xf9\xba\x1a\x85\ u\xfb8D\x0b\xa8#\x87\xc9q\xbe\xdap\xeeMM\ \xbd\xb2k\xf7\x0f\x99~\x95\x02\xc8\xe8w\x0d\xed#E\ \xaf\xae\x94\xfe\x808?\xa5^\x90^\x8a:\x06\xf5F\ wx<\xe4\xc5q\x04k\xe0\x1f\x81W\xc6\xdbw\xaf\ \xe0\xcf\xd6\xfb\xb4{8\xbd\xc1'\xa8i\x17\xe7\x1f\x1f\ \xbb\x87\xf4\xb4\xba5\x0e\xa2\xf1\xd6\xc2\xc3\xc0\xcc[ \ \x06la\xab\xee\xd5\x0a\xae\xeb\xbd\xc5\xf4\x19\xe1a\xa3\ \xf1\xa4\x82\x8d~\xa2\x9a\xe6,\xf9\xbd!\x0e\xe1\x1e\xcc\ \xf0\xf3=\xfe\x0b\xac0\xcf\x10\xeaj\x16x\x07\xaa\xb0\ \x9b\xbd\x9a[\xe0\xab\xb6j\xa7U\xdd\xc2\xdd\xa0\xad\x83\ \x8fy\x03G\x95\xda\xc7\x93\xe3\xd7\x83\x91\x18\x9d\x9f\x9f\ \x8eN\xde\xad\xa7V\xe3\xcde\xdc\x18\x18\x8bg\x7f\xa4\ \x9f\xb3\xfc\x06|\x85\x18\xbb\xf5\x12\x18vf\xe4\x03\xab\ ~J\xa3x\x9a\xf7\x8ap\x82#\xb9\xa5\x11\xdc1\x89\ \xa6\x0c\xef\xff\x02\x12\xa5\xba`\ \x00\x00\x01\xef\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \x0a \x0a\ \x0a\x0a\ \x00\x00\x02\x01\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \x0a\x0a\ \ \x00\x00\x00h\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\ \x0a\ \x00\x00\x02(\ <\ svg width=\x22240\x22 \ height=\x22360\x22>\x0a \ \x0a \x0a \x0a\ \x0a\ \x00\x00\x01\xf6\ <\ svg height=\x22100\x22\ width=\x22100\x22>\x0a \ \x0a \x0a \x0a \ \x0a \x0a \ \x0a \x0a\x0a\ \x00\x00\x03\xde\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x00\x1e\ <\ svg width=\x2264\x22 h\ eight=\x2264\x22/>\x0a\ \x00\x00\x02\x01\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \x0a\x0a\ \ \x00\x00\x01:\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \ \x0a\x0a\ \x00\x00\x00`\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00\xfd\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00\x9f\ <\ svg width=\x2216\x22 h\ eight=\x2232\x22>\x0a \ \x0a \x0a\x0a\ \x00\x00\x00a\ <\ svg width=\x2232\x22 h\ eight=\x2216\x22>\x0a \ \x0a\x0a\ \ \x00\x00\x01\xb9\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \x0a \ \x0a \ \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x03\xb7\ <\ svg width=\x22150\x22 \ height=\x22150\x22 >\x0a \ \x0a \x0a \x0a<\ /svg>\x0a\ \x00\x00\x02\x09\ <\ svg width=\x2260\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x01\xb2\ <\ svg height=\x2290\x22 \ width=\x2270\x22>\x0a \x0a \ \x0a \x0a \ \x0a \ \x0a \x0a \x0a\ \x0a\ \x00\x00\x07z\ <\ svg width=\x22125\x22 \ height=\x22100\x22>\x0a \ \x0a <\ path fill=\x22#c08c\ ff\x22 d=\x22M 52.0119\ 74,115.59881 H 1\ 56.06585 c 11.08\ ,0 20,8.92 20,20\ v 44.92065 c 0,\ 11.08 -8.92,20 -\ 20,20 h -13.0067\ 3 -13.00674 l -0\ .40043,21.04927 \ -25.61304,-21.04\ 927 H 91.032178 \ 78.025443 65.018\ 709 52.011974 c \ -11.08,0 -20,-8.\ 92 -20,-20 v -44\ .92065 c 0,-11.0\ 8 8.92,-20 20,-2\ 0 z\x22/>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x02G\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \x0a \x0a \x0a <\ g transform=\x22rot\ ate(130) transla\ te(-12.2, -22.8)\ \x22>\x0a \x0a <\ /g>\x0a \x0a \x0a<\ /svg>\x0a\ \x00\x00\x01\xb9\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \x0a \ \x0a \ \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x00`\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x02\x12\ <\ svg height=\x2218\x22 \ width=\x2224\x22 >\x0a <\ g fill=\x22none\x22 fi\ ll-rule=\x22evenodd\ \x22 stroke=\x22none\x22 \ stroke-width=\x221\x22\ >\x0a \x0a \x0a \ \x0a \ \x0a \x0a \x0a\ \x0a\ \x00\x00\x02<\ <\ svg height=\x22100\x22\ width=\x22100\x22>\x0a \ \x0a \ \x0a \x0a \ \x0a <\ /g>\x0a \x0a <\ /g>\x0a\x0a\ \x00\x00\x01\xcb\ <\ svg height=\x22100\x22\ width=\x2280\x22>\x0a <\ g stroke=\x22none\x22 \ stroke-width=\x221\x22\ transform=\x22scal\ e(5)\x22>\x0a \x0a \x0a \ \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x00\x95\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x01\x19\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \ \x0a\x0a\ \x00\x00\x00\xaf\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00\xc2\ <\ svg width=\x22405\x22 \ height=\x22290\x22>\x0a \ \x0a \ \x0a \x0a \x0a\ \x0a\ \x00\x00\x02*\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \x0a \x0a \x0a \x0a <\ line x1=\x2211\x22 y1=\ \x2219.5\x22 x2=\x2218\x22 y\ 2=\x2219.5\x22 style=\x22\ stroke:#31363b;s\ troke-width:1\x22 /\ >\x0a\x0a\ \x00\x00\x01\x13\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \x0a \ \x0a \x0a\x0a\ \x00\x00\x01\x9e\ <\ svg height=\x2280\x22 \ width=\x22100\x22>\x0a <\ g stroke=\x22none\x22 \ stroke-width=\x221\x22\ transform=\x22scal\ e(5)\x22>\x0a \ \x0a \x0a \ \x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x00X\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\ \x0a\ \x00\x00\x02\x09\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x00\xbb\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00\xac\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \ \x0a \x0a\x0a\ \x00\x00\x02\x0c\ <\ svg width=\x2260\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a <\ /g>\x0a\x0a\ \x00\x00\x00\xd9\ <\ svg width=\x22150\x22 \ height=\x22150\x22 >\x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x01\x01\ <\ svg width=\x22405\x22 \ height=\x22290\x22>\x0a \ \x0a \ \x0a \x0a\ \x0a \x0a\x0a\ \ \x00\x00\x00P\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00y\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \ \x0a\x0a\ \x00\x00\x00\x80\ <\ svg width=\x22405\x22 \ height=\x22290\x22>\x0a \ \x0a \ \x0a \x0a\x0a\ \x00\x00\x00\xf0\ <\ svg width=\x2265\x22 h\ eight=\x2260\x22>\x0a \x0a\ \x0a \x0a\ \x00\x00\x03\xb7\ <\ svg width=\x22150\x22 \ height=\x22150\x22 >\x0a \ \x0a \x0a \x0a<\ /svg>\x0a\ \x00\x00\x00\xb6\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x01\x92\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \x0a \x0a \ \x0a\ \x0a\ \x00\x00\x02\x09\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x00q\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \ \x00\x00\x00Y\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \ \x0a\x0a\ \x00\x00\x02\x1c\ <\ svg width=\x22240\x22 \ height=\x22360\x22>\x0a \ \x0a <\ path d=\x22m 0.9166\ 972,1.1894593 3.\ 310321,3.3105408\ -3.3117417,3.31\ 05408 c -0.15770\ 2,0.1577125 -0.1\ 57702,0.4134624 \ 0,0.5711749 0.15\ 7702,0.1577123 0\ .4134349,0.15771\ 23 0.5711369,0 l\ 3.5973102,-3.59\ 61283 0,0 0,0 c \ 0.1577019,-0.157\ 7124 0.1577019,-\ 0.4134624 0,-0.5\ 711748 L 1.48641\ 34,0.61828437 c \ -0.157702,-0.157\ 7124 -0.4134349,\ -0.1577124 -0.57\ 11369,0 -0.15628\ 13,0.1577125 -0.\ 1562813,0.413462\ 43 0.00142,0.571\ 17493 z\x22 fill=\x22#\ df3434\x22 fill-opa\ city=\x220.5\x22/>\x0a <\ /g>\x0a\x0a\ \x00\x00\x03\xb7\ <\ svg width=\x22150\x22 \ height=\x22150\x22 >\x0a \ \x0a \x0a \x0a<\ /svg>\x0a\ \x00\x00\x02\x01\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \x0a\x0a\ \ \x00\x00\x03\x83\ <\ svg height=\x2290\x22 \ width=\x2290\x22>\x0a \x0a \x0a \x0a \ \x0a \x0a \ \x0a \x0a \ \x0a \x0a\ \x0a <\ /g>\x0a \x0a\x0a\ \x00\x00\x00\x9f\ <\ svg width=\x2232\x22 h\ eight=\x2216\x22>\x0a \ \x0a \x0a\x0a\ \x00\x00\x01[\ <\ svg height=\x2215\x22 \ width=\x2218\x22 >\x0a <\ g fill=\x22none\x22 fi\ ll-rule=\x22evenodd\ \x22 id=\x22Page-1\x22 st\ roke=\x22none\x22 stro\ ke-width=\x221\x22>\x0a \ \x0a \x0a \ \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x01A\ <\ svg width=\x22150\x22 \ height=\x22150\x22 >\x0a \ \x0a \ \x0a \x0a\x0a\ \ \x00\x00\x01\xb9\ <\ svg height=\x22100\x22\ width=\x22100\x22>\x0a \ \x0a \ \x0a \x0a <\ path d=\x22M10,0 C4\ .5,0 0,4.5 0,10 \ C0,15.5 4.5,20 1\ 0,20 C15.5,20 20\ ,15.5 20,10 C20,\ 4.5 15.5,0 10,0 \ L10,0 Z M8,15 L3\ ,10 L4.4,8.6 L8,\ 12.2 L15.6,4.6 L\ 17,6 L8,15 L8,15\ Z\x22/>\x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x01\xf9\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x01\x99\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \x0a <\ /g>\x0a \x0a \ \ \x0a\x0a\ \x00\x00\x00S\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x02\x1c\ <\ svg width=\x22240\x22 \ height=\x22360\x22>\x0a \ \x0a <\ path d=\x22m 0.9166\ 972,1.1894593 3.\ 310321,3.3105408\ -3.3117417,3.31\ 05408 c -0.15770\ 2,0.1577125 -0.1\ 57702,0.4134624 \ 0,0.5711749 0.15\ 7702,0.1577123 0\ .4134349,0.15771\ 23 0.5711369,0 l\ 3.5973102,-3.59\ 61283 0,0 0,0 c \ 0.1577019,-0.157\ 7124 0.1577019,-\ 0.4134624 0,-0.5\ 711748 L 1.48641\ 34,0.61828437 c \ -0.157702,-0.157\ 7124 -0.4134349,\ -0.1577124 -0.57\ 11369,0 -0.15628\ 13,0.1577125 -0.\ 1562813,0.413462\ 43 0.00142,0.571\ 17493 z\x22 fill=\x22#\ 4b4b4b\x22 fill-opa\ city=\x221.0\x22/>\x0a <\ /g>\x0a\x0a\ \x00\x00\x01\xf6\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \x0a\x0a\ \x00\x00\x00\xcb\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x02t\ <\ svg height=\x22100\x22\ width=\x22100\x22>\x0a \ \ \x0a \ \x0a \x0a \ \x0a \x0a \ \x0a \x0a \ \x0a \x0a\x0a\ \x00\x00\x00j\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00_\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00\xcb\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x02\x01\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \x0a\x0a\ \ \x00\x00\x04w\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \x0a \x0a \x0a<\ /svg>\x0a\ \x00\x00\x01O\ <\ svg width=\x22100\x22 \ height=\x22100\x22 >\x0a \ \x0a \ \x0a \x0a\x0a\ \x00\x00\x00\x99\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \ \x0a\x0a\ \x00\x00\x01\xca\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00y\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \ \x0a\x0a\ \x00\x00\x02\x09\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x01/\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00\xac\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x02\x01\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \x0a\x0a\ \ \x00\x00\x032\ <\ svg width=\x22125\x22 \ height=\x22100\x22>\x0a \ \x0a <\ path fill=\x22#ffff\ 8c\x22 d=\x22M 52.0119\ 74,115.59881 H 1\ 56.06585 c 11.08\ ,0 20,8.92 20,20\ v 44.92065 c 0,\ 11.08 -8.92,20 -\ 20,20 h -13.0067\ 3 -13.00674 l -0\ .40043,21.04927 \ -25.61304,-21.04\ 927 H 91.032178 \ 78.025443 65.018\ 709 52.011974 c \ -11.08,0 -20,-8.\ 92 -20,-20 v -44\ .92065 c 0,-11.0\ 8 8.92,-20 20,-2\ 0 z\x22/>\x0a \x0a \ \x0a <\ path stroke=\x22#31\ 363b\x22 stroke-wid\ th=\x224\x22 fill=\x22non\ e\x22 d=\x22m -50.0000\ 02,-45.56575 -11\ .604722,20.15564\ 7 -11.604722,20.\ 1556473 -11.6529\ 42,-20.1278073 -\ 11.652941,-20.12\ 7808 23.257664,-\ 0.02784 z\x22 />\x0a \ \x0a \x0a \ \x0a\ \x0a\ \x00\x00\x02\x09\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x00\xac\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \ \x0a \x0a\x0a\ \x00\x00\x00\xa5\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x02\x09\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x00h\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\ \x0a\ \x00\x00\x01\x18\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \x0a <\ path fill=\x22#bab9\ b8\x22 d=\x22M22.1,102\ 2.1L-22.1,977.9l\ 1000-1000L1022.1\ ,22.1Zm220,30L19\ 7.9,1007.9l1000-\ 1000L1242.1,52.1\ Zm250,0L447.9,10\ 07.9l1000-1000L1\ 492.1,52.1Zm250,\ 0L697.9,1007.9l1\ 030-1030L1772.1,\ 22.1Z\x22/>\x0a \x0a\ \x0a\ \x00\x00\x01\x13\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \x0a \ \x0a \x0a\x0a\ \x00\x00\x00\xb8\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\ \x0a\ \x00\x00\x03\xde\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x02\x0c\ <\ svg width=\x2260\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a <\ /g>\x0a\x0a\ \x00\x00\x03\x0c\ <\ svg width=\x22109.5\ 805\x22 height=\x22107\ .97688\x22>\x0a \x0a \ \x0a \x0a \x0a \x0a \x0a <\ g transform=\x22tra\ nslate(-39.82316\ 2,-58.532028)\x22>\x0a\ \x0a <\ /g>\x0a\x0a\ \x00\x00\x02c\ <\ svg width=\x22125\x22 \ height=\x22100\x22>\x0a \ \x0a <\ path fill=\x22#8cd5\ ff\x22 d=\x22M 52.0119\ 74,115.59881 H 1\ 56.06585 c 11.08\ ,0 20,8.92 20,20\ v 44.92065 c 0,\ 11.08 -8.92,20 -\ 20,20 h -13.0067\ 3 -13.00674 l -0\ .40043,21.04927 \ -25.61304,-21.04\ 927 H 91.032178 \ 78.025443 65.018\ 709 52.011974 c \ -11.08,0 -20,-8.\ 92 -20,-20 v -44\ .92065 c 0,-11.0\ 8 8.92,-20 20,-2\ 0 z\x22/>\x0a \x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x02(\ <\ svg width=\x22240\x22 \ height=\x22360\x22>\x0a \ \x0a \x0a \x0a\ \x0a\ \x00\x00\x01O\ <\ svg width=\x22100\x22 \ height=\x22100\x22 >\x0a \ \x0a \ \x0a \x0a\x0a\ \x00\x00\x02\x09\ <\ svg width=\x2260\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x01\xef\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \ \x0a \x0a \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x00a\ <\ svg width=\x2216\x22 h\ eight=\x2232\x22>\x0a \ \x0a\x0a\ \ \x00\x00\x01\x84\ <\ svg height=\x2298\x22 \ width=\x2298\x22>\x0a \x0a \x0a\ \x0a <\ path d=\x22M14,1.4 \ L12.6,0 L7,5.6 L\ 1.4,0 L0,1.4 L5.\ 6,7 L0,12.6 L1.4\ ,14 L7,8.4 L12.6\ ,14 L14,12.6 L8.\ 4,7 L14,1.4 Z\x22/>\ \x0a \x0a \ \x0a \x0a\x0a\ \x00\x00\x02\xb9\ <\ svg width=\x22125\x22 \ height=\x22100\x22>\x0a \ \x0a <\ path fill=\x22#ff8c\ 9f\x22 d=\x22M 52.0119\ 74,115.59881 H 1\ 56.06585 c 11.08\ ,0 20,8.92 20,20\ v 44.92065 c 0,\ 11.08 -8.92,20 -\ 20,20 h -13.0067\ 3 -13.00674 l -0\ .40043,21.04927 \ -25.61304,-21.04\ 927 H 91.032178 \ 78.025443 65.018\ 709 52.011974 c \ -11.08,0 -20,-8.\ 92 -20,-20 v -44\ .92065 c 0,-11.0\ 8 8.92,-20 20,-2\ 0 z\x22/>\x0a \x0a \ \ \x0a\x0a\ \x00\x00\x00\xc5\ <\ svg width=\x22405\x22 \ height=\x22290\x22>\x0a \ \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x00\xde\ <\ svg width=\x22100\x22 \ height=\x22100\x22 >\x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x01A\ <\ svg width=\x22150\x22 \ height=\x22150\x22 >\x0a \ \x0a \ \x0a \x0a\x0a\ \ \x00\x00\x02\x0c\ <\ svg width=\x2260\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a <\ /g>\x0a\x0a\ \x00\x00\x02\x98\ <\ svg height=\x22100\x22\ width=\x22100\x22>\x0a \ \x0a \x0a \x0a \ \x0a \x0a\ \x0a \x0a\ \x0a\ \x00\x00\x00\xe3\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x01\xfb\ <\ svg height=\x2216\x22 \ width=\x2216\x22>\x0a \ \x0a \x0a \x0a\ \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x00\xca\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x03\xde\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x00\xb5\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \x0a\x0a\ \x00\x00\x01\xed\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \ \x0a \x0a \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x00\x80\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00g\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a<\ /svg>\x0a\ \x00\x00\x01\xdc\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \ \x0a \x0a\ \x0a <\ /g>\x0a\x0a\ \x00\x00\x03\x8e\ <\ svg width=\x22109.5\ 805\x22 height=\x22107\ .97688\x22>\x0a \x0a \ \x0a \x0a \x0a \x0a \x0a <\ g transform=\x22tra\ nslate(-39.82316\ 2,-58.532028)\x22>\x0a\ \x0a \x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x00\xb9\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \ \x0a\x0a\ \x00\x00\x00\xec\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x02\x0f\ <\ svg height=\x2290\x22 \ width=\x2290\x22>\x0a \x0a \ \x0a \x0a \ \x0a \ \x0a \x0a\ \x0a\x0a\ \x00\x00\x01\xcd\ <\ svg height=\x2215\x22 \ width=\x2226\x22>\x0a \ \x0a \x0a \x0a\ \x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x02\x0d\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x00\xc2\ <\ svg width=\x22405\x22 \ height=\x22290\x22>\x0a \ \x0a \ \x0a \x0a \x0a\ \x0a\ \x00\x00\x02\x09\ <\ svg width=\x2260\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x03`\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x01\x1b\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x03\x96\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \x0a\x0a\ \x00\x00\x02\xd9\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \ \x0a\x0a\ \x00\x00\x00\xaf\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x02$\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x02\xab\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x01%\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x02\x80\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x01\x81\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \ \x00\x00\x019\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \ \x0a\x0a\ \x00\x00\x00\xc6\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x022\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\ \x0a\ \x00\x00\x02R\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a \x0a\ \x0a\ \x00\x00\x02\x81\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \ \x00\x00\x02%\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \x0a\x0a\ \x00\x00\x02\xd0\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 ve\ rsion=\x221.1\x22>\x0a \x0a\x0a\ \x00\x00\x01\xb5\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \x0a\x0a\ \x00\x00\x05_\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \x0a\ \x0a\x0a\ \x00\x00\x01\xcd\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a \x0a \ .ColorScheme-T\ ext { color:#d3d\ ae3; } .ColorSch\ eme-Highlight { \ color:#5294e2; }\ \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x019\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \ \x0a\x0a\ \x00\x00\x00\xa4\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x00\xd1\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \ \x00\x00\x01I\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \ \x0a\x0a\ \x00\x00\x01Z\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x01\x7f\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \x0a\x0a\ \x00\x00\x02 \ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x02T\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x01\xaa\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x02\xd0\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x00\xa1\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \ \x00\x00\x03D\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x01\xe1\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 22 22\x22>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \ \x00\x00\x01\xae\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 16 16\x22>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x0a\x18\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ im\ age/svg+xml\x0a \ \x0a \ <\ /dc:title>\x0a \ \x0a \ \x0a \x0a \x0a \x0a \ \x0a .ColorSc\ heme-Text {\x0a \ color:#f2f2f\ 2;\x0a }\x0a \ \x0a \x0a \x0a \x0a \ \x0a \x0a\ \x0a\ \x00\x00\x09\xb8\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a <\ metadata\x0a id\ =\x22metadata10\x22>\x0a \ \x0a \ \x0a image/svg+\ xml\x0a\ \x0a \x0a \x0a \x0a \ \x0a \x0a \x0a \x0a \x0a \x0a \x0a <\ path\x0a d=\x22m 7\ .1186442,8.13559\ 32 23.9999998,0 \ 0,23.9999998 -23\ .9999998,0 z\x22\x0a \ id=\x22path4\x22\x0a \ inkscape:conn\ ector-curvature=\ \x220\x22\x0a style=\x22\ stroke:#000000;s\ troke-opacity:1;\ fill:#f2f2f2;fil\ l-opacity:1;stro\ ke-width:0.3;str\ oke-miterlimit:4\ ;stroke-dasharra\ y:none\x22 />\x0a \x0a \x0a\ \x0a\ \x00\x00\x02N\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 24 24\x22>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x01\xbd\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 16 16\x22>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x08\xfb\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ im\ age/svg+xml\x0a \ \x0a \ \x0a \ \x0a <\ /metadata>\x0a \x0a \x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x02\x04\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 24 24\x22>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x07p\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 16 16\x22>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x02[\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 16 16\x22>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x0a8\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ ima\ ge/svg+xml\x0a <\ dc:type\x0a \ rdf:resource=\ \x22http://purl.org\ /dc/dcmitype/Sti\ llImage\x22 />\x0a \ \x0a \ \x0a <\ /rdf:RDF>\x0a \x0a \x0a \x0a \ \x0a .ColorSc\ heme-Text {\x0a \ color:#f2f2f\ 2;\x0a }\x0a \ \x0a \x0a\ .ColorSche\ me-Text {\x0a \ color:#f2f2f2;\ \x0a }\x0a <\ /style>\x0a \x0a \x0a \x0a\ \x0a\ \x00\x00\x02y\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 24 24\x22>\x0a \x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x07_\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \ \x0a\ \x0a \ \x0a image/svg\ +xml\ \x0a \x0a \x0a \x0a \x0a \x0a \x0a \x0a \x0a \ .ColorScheme-T\ ext {\x0a co\ lor:#f2f2f2;\x0a \ }\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x0b\xc7\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ \ image/svg+xml\x0a \ \x0a \ \x0a \ \x0a \ \x0a <\ /metadata>\x0a \x0a \x0a .C\ olorScheme-Text \ {\x0a color:\ #f2f2f2;\x0a }\ \x0a \x0a\ \x0a \x0a \x0a \x0a \x0a<\ /svg>\x0a\ \x00\x00\x02d\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 16 16\x22>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x0aH\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\ \x0a \x0a \ \x0a \x0a <\ dc:format>image/\ svg+xml\x0a \x0a \ \x0a \x0a \x0a \x0a \x0a \ \x0a \x0a \ .ColorScheme\ -Text {\x0a \ color:#f2f2f2;\x0a \ }\x0a \x0a \x0a\ \x0a \ \x0a \x0a\ \x0a\ \x00\x00\x02\x81\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 32 32\x22>\x0a \x0a \x0a \ .ColorScheme-T\ ext {\x0a co\ lor:#f2f2f2;\x0a \ }\x0a \x0a \x0a \ \x0a\x0a\ \ \x00\x00\x09\xee\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ imag\ e/svg+xml\x0a \x0a \ \x0a <\ /cc:Work>\x0a \x0a \x0a \x0a \x0a \x0a \ .ColorScheme-Te\ xt {\x0a col\ or:#f2f2f2;\x0a \ }\x0a \x0a \x0a <\ path\x0a style=\ \x22color:#f2f2f2;f\ ill:currentColor\ ;fill-opacity:1;\ stroke:none\x22\x0a \ d=\x22m 8.1355932\ ,15.025424 -6,-6\ .2510003 0.719,-\ 0.749 4.125,4.29\ 80003 1.156,1.23\ 7 1.156,-1.237 4\ .1249998,-4.2980\ 003 0.719,0.749 \ -4.125,4.2980003\ z\x22\x0a class=\x22\ ColorScheme-Text\ \x22\x0a id=\x22path4\ \x22\x0a inkscape:\ connector-curvat\ ure=\x220\x22 />\x0a \x0a \x0a\x0a\ \x00\x00\x0bL\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ ima\ ge/svg+xml\x0a <\ dc:type\x0a \ rdf:resource=\ \x22http://purl.org\ /dc/dcmitype/Sti\ llImage\x22 />\x0a \ \ \x0a \x0a \ \x0a \x0a \ \x0a \x0a \x0a .C\ olorScheme-Text \ {\x0a color:\ #f2f2f2;\x0a }\ \x0a \x0a\ \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x03\xb9\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 22 22\x22>\x0a \x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x03l\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 22 22\x22>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x08?\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\ \x0a \x0a \ \x0a \x0a <\ dc:format>image/\ svg+xml\x0a \x0a <\ /cc:Work>\x0a \x0a \x0a \x0a \x0a \x0a \x0a \x0a \ .ColorScheme-Tex\ t {\x0a colo\ r:#4d4d4d;\x0a \ }\x0a .ColorS\ cheme-NegativeTe\ xt {\x0a col\ or:#da4453;\x0a \ }\x0a \x0a \x0a .\ ColorScheme-Text\ {\x0a color\ :#4d4d4d;\x0a \ }\x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x01\xb9\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 22 22\x22>\x0a \x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x03e\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 22 22\x22>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x01\xe6\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 32 32\x22>\x0a \x0a \x0a \ .ColorScheme-T\ ext {\x0a co\ lor:#f2f2f2;\x0a \ }\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x0a\x8d\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ image\ /svg+xml\x0a \x0a \ \x0a \x0a \x0a \x0a \x0a\ \x0a \ \x0a\ .ColorSche\ me-Text {\x0a \ color:#f2f2f2;\ \x0a }\x0a <\ /style>\x0a \x0a \ .ColorScheme\ -Text {\x0a \ color:#f2f2f2;\x0a \ }\x0a \x0a \x0a\ \x0a \x0a\x0a\ \x00\x00\x02>\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 24 24\x22>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x02z\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 32 32\x22>\x0a \x0a \x0a \ .ColorScheme-T\ ext {\x0a co\ lor:#f2f2f2;\x0a \ }\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x02\xd8\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 32 32\x22>\x0a \x0a \x0a \ \x0a \x0a\ \x0a\ \x00\x00\x07\xba\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\ \x0a \x0a \ \x0a \x0a <\ dc:format>image/\ svg+xml\x0a \x0a \ \x0a \x0a \x0a \x0a \x0a \ \x0a .ColorSc\ heme-Text {\x0a \ color:#f2f2f\ 2;\x0a }\x0a \ \x0a \x0a \x0a <\ path\x0a id=\x22pa\ th4\x22\x0a class=\ \x22ColorScheme-Tex\ t\x22\x0a d=\x22m 29.\ 872419,17.245072\ -4.86717,5.0309\ 69 -5.030969,-4.\ 86717 -0.69531,0\ .71871 5.030969,\ 4.86717 -4.86717\ ,5.030969 0.7187\ 1,0.69531 4.8671\ 7,-5.030969 5.03\ 0969,4.86717 0.6\ 9531,-0.71871 -5\ .030969,-4.86717\ 4.86717,-5.0309\ 69 z\x22\x0a style\ =\x22color:#f2f2f2;\ fill:#f2f2f2;fil\ l-opacity:1;stro\ ke:none\x22\x0a in\ kscape:connector\ -curvature=\x220\x22 /\ >\x0a\x0a\ \x00\x00\x01\xbe\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 16 16\x22>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x02\x1f\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 16 16\x22>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x07\x13\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \ \ \x0a \x0a \ \x0a image/sv\ g+xml\x0a \x0a \x0a \x0a \x0a \x0a \ \x0a \x0a \ .ColorScheme\ -Text {\x0a \ color:#f2f2f2;\x0a \ }\x0a \x0a \x0a\ \x0a\x0a\ \x00\x00\x06\xd7\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a <\ metadata\x0a id\ =\x22metadata10\x22>\x0a \ \x0a \ \x0a image/svg+\ xml\x0a\ \x0a \x0a \x0a \x0a \x0a \x0a \x0a .Co\ lorScheme-Text {\ \x0a color:#\ f2f2f2;\x0a }\x0a\ \x0a \ \x0a \x0a<\ /svg>\x0a\ \x00\x00\x0a\x0a\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ im\ age/svg+xml\x0a \ \x0a \ \x0a \x0a \x0a \x0a\ \x0a \x0a \x0a .\ ColorScheme-Text\ {\x0a color\ :#f2f2f2;\x0a \ }\x0a \ \x0a \x0a \x0a \x0a \ \x0a \x0a\x0a\ \x00\x00\x09\xb0\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a <\ metadata\x0a id\ =\x22metadata10\x22>\x0a \ \x0a \ \x0a image/svg+\ xml\x0a\ \x0a \x0a \ \x0a <\ /rdf:RDF>\x0a \x0a \ \x0a \x0a \ \x0a \ \x0a \x0a \x0a \x0a \x0a\ \x0a\x0a\ \x00\x00\x07|\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a <\ metadata\x0a id\ =\x22metadata10\x22>\x0a \ \x0a \ \x0a image/svg+\ xml\x0a\ \x0a \x0a \x0a \x0a \x0a \x0a \x0a \ .ColorScheme-T\ ext {\x0a co\ lor:#f2f2f2;\x0a \ }\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x06\xe6\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a <\ metadata\x0a id\ =\x22metadata10\x22>\x0a \ \x0a \ \x0a image/svg+\ xml\x0a\ \x0a \x0a \x0a \x0a \x0a \x0a \x0a .Co\ lorScheme-Text {\ \x0a color:#\ f2f2f2;\x0a }\x0a\ \x0a \ \x0a \x0a\x0a\ \x00\x00\x08\xfc\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ im\ age/svg+xml\x0a \ \x0a \ \x0a \ \x0a <\ /metadata>\x0a \x0a \x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x070\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \ \x0a \ \ \x0a image/svg+xm\ l\x0a \ \x0a \x0a \x0a \ \x0a \x0a \x0a \x0a \ .ColorScheme-Tex\ t {\x0a colo\ r:#f2f2f2;\x0a \ }\x0a \x0a \x0a \x0a\x0a\ \x00\x00\x07p\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 16 16\x22>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x07\x86\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \ \ \x0a \x0a \ \x0a image/sv\ g+xml\x0a \x0a \x0a \x0a \x0a \x0a \x0a \x0a .\ ColorScheme-Text\ {\x0a color\ :#f2f2f2;\x0a \ }\x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x0a$\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ ima\ ge/svg+xml\x0a <\ dc:type\x0a \ rdf:resource=\ \x22http://purl.org\ /dc/dcmitype/Sti\ llImage\x22 />\x0a \ \ \x0a \x0a \ \x0a \x0a \ \x0a \x0a \x0a .C\ olorScheme-Text \ {\x0a color:\ #f2f2f2;\x0a }\ \x0a \x0a\ \x0a .Col\ orScheme-Text {\x0a\ color:#f\ 2f2f2;\x0a }\x0a \ \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x07\xa8\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \ \x0a\ \x0a \ \x0a image/svg\ +xml\ \x0a \x0a \x0a \x0a \x0a \x0a <\ defs\x0a id=\x22de\ fs3051\x22>\x0a \x0a \ .ColorScheme-\ Text {\x0a c\ olor:#f2f2f2;\x0a \ }\x0a \x0a \x0a \ \x0a\ \x0a\ \x00\x00\x07P\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \ \x0a\ \x0a \ \x0a image/svg\ +xml\ \x0a \x0a \x0a \ \x0a \ \x0a \x0a \x0a \x0a \ \x0a .ColorSc\ heme-Text {\x0a \ color:#f2f2f\ 2;\x0a }\x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x0b\xc7\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ \ image/svg+xml\x0a \ \x0a \ \x0a \ \x0a \ \x0a <\ /metadata>\x0a \x0a \x0a .C\ olorScheme-Text \ {\x0a color:\ #f2f2f2;\x0a }\ \x0a \x0a\ \x0a \x0a \x0a \x0a \x0a<\ /svg>\x0a\ \x00\x00\x02d\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 16 16\x22>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x0a0\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\ \x0a \x0a \ \x0a \x0a <\ dc:format>image/\ svg+xml\x0a \x0a \ \x0a \ \x0a \ \x0a \ \x0a \x0a \ \x0a \x0a .Colo\ rScheme-Text {\x0a \ color:#f2\ f2f2;\x0a }\x0a \ \x0a <\ /defs>\x0a \x0a\ \x0a \x0a\x0a\ \x00\x00\x07\x91\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a <\ metadata\x0a id\ =\x22metadata10\x22>\x0a \ \x0a \ \x0a image/svg+\ xml\x0a\ \x0a \x0a \x0a \x0a \x0a \x0a \x0a .Co\ lorScheme-Text {\ \x0a color:#\ f2f2f2;\x0a }\x0a\ \x0a \ \x0a \x0a\x0a\ \ \x00\x00\x09\xd6\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ imag\ e/svg+xml\x0a \x0a \ \x0a\ \ \x0a \x0a\ \x0a \ \x0a \x0a \ \x0a .ColorSc\ heme-Text {\x0a \ color:#f2f2f\ 2;\x0a }\x0a \ \x0a \x0a \x0a <\ path\x0a style=\ \x22color:#f2f2f2;f\ ill:#4d4d4d;fill\ -opacity:1;strok\ e:none\x22\x0a d=\x22\ m 8.2033898,11.9\ 74577 -6,-6.2510\ 009 0.719,-0.749\ 4.125,4.2980005\ 1.156,1.2370004\ 1.156,-1.237000\ 4 4.1250002,-4.2\ 980005 0.719,0.7\ 49 -4.125,4.2980\ 009 z\x22\x0a clas\ s=\x22ColorScheme-T\ ext\x22\x0a id=\x22pa\ th4-3\x22\x0a inks\ cape:connector-c\ urvature=\x220\x22 />\x0a\ \x0a\x0a\ \x00\x00\x0b=\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ ima\ ge/svg+xml\x0a <\ dc:type\x0a \ rdf:resource=\ \x22http://purl.org\ /dc/dcmitype/Sti\ llImage\x22 />\x0a \ \ \x0a \x0a \ \x0a \x0a \ \x0a \x0a \x0a .C\ olorScheme-Text \ {\x0a color:\ #f2f2f2;\x0a }\ \x0a \x0a\ \x0a \x0a\ \x0a \x0a\x0a\ \x00\x00\x03\xb9\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 viewBox=\x22\ 0 0 22 22\x22>\x0a \x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x08\x9a\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ imag\ e/svg+xml\x0a \x0a \ \x0a \ \x0a \x0a \x0a \x0a \ \x0a .ColorSc\ heme-Text {\x0a \ color:#f2f2f\ 2;\x0a }\x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x08?\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\ \x0a \x0a \ \x0a \x0a <\ dc:format>image/\ svg+xml\x0a \x0a <\ /cc:Work>\x0a \x0a \x0a \x0a \x0a \x0a \x0a \x0a \ .ColorScheme-Tex\ t {\x0a colo\ r:#4d4d4d;\x0a \ }\x0a .ColorS\ cheme-NegativeTe\ xt {\x0a col\ or:#da4453;\x0a \ }\x0a \x0a \x0a .\ ColorScheme-Text\ {\x0a color\ :#4d4d4d;\x0a \ }\x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x06\xe2\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \ \x0a \ \x0a image/svg+x\ ml\x0a \ \x0a \x0a \x0a \x0a \x0a \x0a \x0a \ .ColorScheme-Te\ xt {\x0a col\ or:#f2f2f2;\x0a \ }\x0a \x0a \x0a <\ path\x0a style=\ \x22fill:#4d4d4d;fi\ ll-opacity:1;str\ oke:none\x22\x0a d\ =\x22M 10 4 L 10 11\ L 3 11 L 3 12 L\ 10 12 L 10 19 L\ 11 19 L 11 12 L\ 18 12 L 18 11 L\ 11 11 L 11 4 L \ 10 4 z \x22\x0a cl\ ass=\x22ColorScheme\ -Text\x22\x0a id=\x22\ path4\x22 />\x0a\ \x0a\ \x00\x00\x08\x94\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ ima\ ge/svg+xml\x0a <\ dc:type\x0a \ rdf:resource=\ \x22http://purl.org\ /dc/dcmitype/Sti\ llImage\x22 />\x0a \ \x0a \ \x0a \x0a \x0a \x0a \ \x0a .ColorS\ cheme-Text {\x0a \ color:#f2f2\ f2;\x0a }\x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x06\xe4\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a <\ metadata\x0a id\ =\x22metadata9\x22>\x0a \ \x0a \ \x0a image/svg+x\ ml\x0a \ \x0a \x0a \x0a \x0a \x0a \x0a \x0a .Col\ orScheme-Text {\x0a\ color:#f\ 2f2f2;\x0a }\x0a \ \x0a \ \x0a \x0a\x0a\ \x00\x00\x0ay\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ image\ /svg+xml\x0a \x0a \ \x0a \ \x0a\ \x0a \ \x0a <\ sodipodi:namedvi\ ew\x0a pagecolo\ r=\x22#ffffff\x22\x0a \ bordercolor=\x22#6\ 66666\x22\x0a bord\ eropacity=\x221\x22\x0a \ objecttoleran\ ce=\x2210\x22\x0a gri\ dtolerance=\x2210\x22\x0a\ guidetolera\ nce=\x2210\x22\x0a in\ kscape:pageopaci\ ty=\x220\x22\x0a inks\ cape:pageshadow=\ \x222\x22\x0a inkscap\ e:window-width=\x22\ 1366\x22\x0a inksc\ ape:window-heigh\ t=\x22736\x22\x0a id=\ \x22namedview8\x22\x0a \ showgrid=\x22fals\ e\x22\x0a inkscape\ :zoom=\x2210.727273\ \x22\x0a inkscape:\ cx=\x22-16.826271\x22\x0a\ inkscape:cy\ =\x2211\x22\x0a inksc\ ape:window-x=\x220\x22\ \x0a inkscape:w\ indow-y=\x2232\x22\x0a \ inkscape:windo\ w-maximized=\x221\x22\x0a\ inkscape:cu\ rrent-layer=\x22svg\ 6\x22 />\x0a \x0a \x0a .Col\ orScheme-Text {\x0a\ color:#f\ 2f2f2;\x0a }\x0a \ \x0a \ \x0a .Color\ Scheme-Text {\x0a \ color:#f2f\ 2f2;\x0a }\x0a \ \x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x07j\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \ \x0a \ \ \x0a image/svg+xm\ l\x0a \ \x0a \x0a \x0a \ \x0a \x0a \x0a \x0a \ .ColorScheme-Tex\ t {\x0a colo\ r:#f2f2f2;\x0a \ }\x0a \x0a \x0a \x0a\x0a\ \x00\x00\x08\x07\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \ \x0a \ \x0a \ \x0a image/svg+\ xml\x0a\ \x0a \x0a \x0a \x0a \x0a \x0a \x0a .Co\ lorScheme-Text {\ \x0a color:#\ f2f2f2;\x0a }\x0a\ \x0a \ \x0a .Colo\ rScheme-Text {\x0a \ color:#4d\ 4d4d;\x0a }\x0a \ \x0a <\ /defs>\x0a \x0a<\ /svg>\x0a\ \x00\x00\x08\x02\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a \x0a \x0a \x0a \ ima\ ge/svg+xml\x0a <\ dc:type\x0a \ rdf:resource=\ \x22http://purl.org\ /dc/dcmitype/Sti\ llImage\x22 />\x0a \ \x0a \ \x0a \x0a \x0a \ \x0a \x0a \ .ColorScheme\ -Text {\x0a \ color:#f2f2f2;\x0a \ }\x0a .Co\ lorScheme-Highli\ ght {\x0a co\ lor:#3daee9;\x0a \ }\x0a \x0a \x0a \ \x0a\ \x0a\ \x00\x00\x07\x9c\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\ \x0a \x0a \ \x0a \x0a <\ dc:format>image/\ svg+xml\x0a \x0a <\ /cc:Work>\x0a \x0a \x0a \x0a\ \x0a .Color\ Scheme-Text {\x0a \ color:#f2f\ 2f2;\x0a }\x0a \ \x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x06\xe5\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a <\ metadata\x0a id\ =\x22metadata10\x22>\x0a \ \x0a \ \x0a image/svg+\ xml\x0a\ \x0a \x0a \x0a \x0a \x0a \x0a \x0a .Co\ lorScheme-Text {\ \x0a color:#\ f2f2f2;\x0a }\x0a\ \x0a \ \x0a \x0a\x0a\ \x00\x00\x07J\ <\ ?xml version=\x221.\ 0\x22 encoding=\x22UTF\ -8\x22 standalone=\x22\ no\x22?>\x0a\x0a\ \x0a \x0a\ \x0a image/s\ vg+xml\x0a \x0a \x0a \x0a \x0a \x0a \x0a \x0a \ .ColorScheme-Tex\ t {\x0a colo\ r:#f2f2f2;\x0a \ }\x0a \x0a \x0a \x0a\x0a\ \x00\x00\x01N\ \x00\ \x00\x04\xb6x\xda\xc5T\xedn\x830\x0c\xfc\xdf\xa7\xb0\ \xb2\xdf\x09\xb1\x03!L\xa5\xefR\xd1\xd2 \xf5K-\ \x82\xadO\xbf\xb8M\x11\xac\x9b\xb4M\xda&\x84\x88c\ \x9f\xef|\x10\xe6\xe7n\x03/\xbb\xed\xfe\x5c\x0a\xdf\xb6\ \xc7\xe7$\xe9\xfb^\xf5F\x1dN\x9b\x84\xb4\xd6I\xa8\ \x10\xd07\xab\xd6\x97\xc2\x90\x00\xbfn6\xbe\xbd\xad\xbb\ \xf5\xe9\xdc\x1c\xf6\xa5@\xb1\x98\xc1\xfc\xb8l=\xd4\xcd\ v[\x8a\xa7\x8a\xf8\x12\xb0*\xc5\xaeP\x19`%\xb5\ \xc24/@\x87\x05\xb9\x1cA+M\xce\x85(%,\ 8\xb2.\x0d\x0f4\xd6\x86Mm(\x0f\x11\xe5\xc8%\ 1\xc7\x951\xba\xec$\x86\xbe\xa6\xc3Te\x95\x0eI\ g\xb8\xa7\xb5\x05p\x22\xde\x1e\x8b*\xa68\x94C\x01\ \xa3;\xc9`/\x89.\x22\x19&8\x1c\x97U\xd3\xbe\ \x96BE\xfd\x0e\xd0\x85b\xfc9\xcb\x1d9M\x5c\x91\ 2@e\xc4\xca\x01+c\xc9XWtve\xf8\xba\ )#\xc0_0 \x12Yc\xd7y$2\xdcLO\ \x84\xc2 \x94\xbbuLE\xd4q\x5ci9\x9a\xf6>\ \xca'\xe3\xd4u-F\x96\xe3\x97\xf9\xee,\xd3}\xf9\ 8\xf2\xd4\x93\xeb\xdb\xf8\x86\xbel\x19|\xc8\xdf}\xc8\ cQ\xd9/Y\xf0!\xd9\x9f:\xf0p\x10\x08(\xff\ \xcf\x830\xe7\xbf\xd1b\xf6\x06\x15a\x11<\ \x00\x00\x05\x11\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg16\ \x22 width=\x2232\x22 hei\ ght=\x2232\x22 version\ =\x221\x22>\x0a \x0a \x0a \x0a \x0a \x0a \x0a\x0a\ \ \x00\x00\x09\x0c\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg12\ \x22 width=\x2232\x22 hei\ ght=\x2232\x22 version\ =\x221\x22>\x0a \x0a \x0a \x0a <\ path style=\x22fill\ :#ffffff\x22 id=\x22pa\ th10\x22 d=\x22M 12.02\ 7815,10.000259 A\ 1.0046462,0.972\ 79894 0 0 0 11,1\ 0.973525 l 0,10.\ 053967 a 1.00464\ 62,0.97279894 0 \ 0 0 1.506798,0.8\ 42274 l 4.495642\ ,-2.512825 4.495\ 643,-2.514091 a \ 1.0046462,0.9727\ 9894 0 0 0 0,-1.\ 684483 l -4.4955\ 74,-2.514492 -4.\ 495574,-2.513158\ a 1.0046462,0.9\ 7279894 0 0 0 -0\ .479188,-0.13065\ 8 z\x22/>\x0a \x0a \x0a\ \x0a \x0a \x0a \x0a <\ /g>\x0a\x0a\ \x00\x00\x09\xab\ \x00\ \x0078x\xda\xed[Ks\xe3\xc6\x11\xbe\xfbW\xa0\ \x98J9\xa9\x22\xa1y?\xa8\x95\xab\xe2K.\xb2\x0f\ \xc9\xcd7\x88\x84$dAB\x01\xa1\xd5\xee\xfe\xfa|\ \xdd\x03\x80\xa0\x1e\x947\xa9\xd8k-\xa5\x830\x8d\x9e\ \xe9\x9e~\xcd\xd7\x00\xf4n\xf7\xe1&\xfb\xb8\xa9\xb7\xbb\ \x8b\xd9m\xd7\xdd-\xcf\xce\x1e\x1e\x1e\xf2\x07\x9d7\xed\ \xcd\x99\x12B\x9c\x81c\x96U\xeb\x8b\x19.\xa4\x9be\ \x0f\xd5\xba\xbb\xbd\x98i5\xcbn\xcb\xea\xe6\xb6K\xd7\ \x1f\xcavW5\xdb\x8b\x99\x9c\xfd\xf0]\xf6\xee\xae\xe8\ ny\x16]\x18\x19\xec,\xc3\xe0\xa7L\xca\x5cki\ \x83\x9c\xeb\x5c\xf0\x8f\xce\xfe\x96)\x10\xb5\xb5a\xce\x17\ F\x9a\x98\x09\xfe\x8d\xb9\x0b2\x98\xe0\xc0\xee\x821N\ \xc4\xec\x12\xec.(\x1f\x9c\x9eK\x81K-\xa2=\xb6\ \x88\x22IR\xe0\x8e\xc4-k\x5cVg\x22\x17AE\ \xa3\xe7\x11\xcc\xca+\x97\x15//\x00!^[g\xe7\ 2w2ZK\x0b\xb8&.H\xda\xf3w\xd2\x06wM]\xad\ \x9f\xdc;\xb4G]v]\xd9.vw\xc5\xaa\xda\xde\ \x0cJ?4\xed\xfa1\x8d\xd7\xe9Zl\xe1\x1a\x84$\ w]\xb5\xe5\x8a\x15\xac\xbb\xf6\xfc\xaanV\xef\x17w\ ms\xd3\x96;J\xf7ewu\xfe\xd0V\x1dVY\ l\x9au\xb9\xac\xdb\x05HW\xc5\xaedK\xedn\xab\ \xebn9\x0c{+lW\xb7\xd0/\x99\xe1\xe1\xb6\xea\ JVdt\xd7\xaa\xae\xee\x16\xed=\xfbo\xfb\xb9l\ \x1b(\xb1\xbb\xab\x8bO\xcbj\xcb\xab4\xa85\xd7u\ \xf3\xb0\xfcP\xed\xaa\xab\xba<\xe7\xbfU]u\x9fF\ RC[\xc3X\xe4\xea\xbc\x82\x99\x92\x91\x8b\xfb\xae9\ \xdfT\x1f\x17`\xd9\xae\x93\xc6\x83T2\x1a\xfc\x05[\ \xdd\x0d\xec\xbb\x7f\xfc\xfd\xc7\xe7n,\xae\xab\x1a\xc3\xdd\ \x92\xd4)Z\xe2bO<\xb2|\xa2\x0d\x9a\xc8s\xcc\ \xaa\xf7a\x8a\xc1\xa3{\x87\x9bF$6\xef{\xef\xa7\ \xeb\x05\x97\xde\xa5\xcb\x91=R\x0am\x06:\xa9\xb1*\ \xee\x96ms\xbf]O\x89\xffj\xaa\xed!u\x03s\ \xb7u\x85?\xcbq\xfa\xba\xd8\xdd\x16m\x0b\x03O\x85\ \x11\xb5\xb9\xbe\xde\x95\x14\xbe=m\xafo\xb2J\x0b+\ \x22\xd8\x11Bl\xd9jS\xdc\x94\x8f\x89X\xfb\xee\x09\ \x91\x03\xe1\x11\xad\xdc\x16p\xcb\xe2\xaaX\xbd\xbfa\x9d\ \x97\xc5ju\xbf\xb9\x87\xcd\xcb\xd9\xd9x\xa8\x9c\x92\xfe\ \x94\xf4\xaf$\xbd\xfc\xcaR~}\xa5W\xfa\x94\xf2_\ \x98\xf2{\xf8\xa8\xacx\x02\x1f\xd5\x97\xc1G\xf5,|\ \x8c\x09\xd0\x80\xff\xd7\xc1G\xf9\xbb\xc3\xc7\x01\xc9\x1d\xc2\ G\xf1[\xc1Gq\x00\x1f\xe5\x17\xc1\xc7\xbd\xb1\x81\xe6\ \x92\x02\xc1\x0e\x0a`\xcd\xdf\x1a>\x9e=\xd7\xa7\xf8}\ \xa09\x01_\xc7\xb9\xcb,\x01\xe54\xca,\x1c/\x84\ \xa7\x00\xc4\xee\xa3\xb1\x80\xee{^\xe5i3\xc2xr\ \x8e\x8e\xcazh\x172\xe5z\xf2d\x92\xf2iUo\ \x94\x9ap;(\x8c\x189X\xd5e\xbfd\x1b\xb8Q\ iAC\x0d\xef\x11\xf6\x16n.\x127\x05\x83\x99K\ \x9d\x07c\x11\x0f\x99\xd2\xa3<\x98\xc2:e3\x89m\ [\xa1#\xf4\xc6@\xf5\x9cse\x06\x85C.\xac\xe3\ E\xc79\x81\x97\xd4:\x06\xc3S\xb4\x8d\x1an\xcc~\ 9!\xef\xd3!\xfc-\x22\xefp\x02\xdc\xa7\x5c?\xe5\ \xfa\xd7\x0f\xb8\xaf\xf9\xe7\x94\xe9_\x88\xb3eP\x8f\xe1\ OF\xe0\xc2N\xc6\x97{\x08\x94`\x0b\xa3\x99\xcb\x09\ \xc7\x88v\x12FM\xc0\x06x\x87\x86\xee\x00\x1f\xf5S\ q\x8bg3\x14\x9a\xce\xb1#\x18\xba<\xd0\xe8s\xf6\ \xd3\x1e\x90d\x81\xee\x12\xbcQ\xda\x18\xc21\xe3\x1ce\ \xf6P\x87\x86\x03,J\xec\x04q.\xf7\xc0\x88\xb8/\ '\xfc{\xee\xcb=8\x9a\xce\x0cI\x07\x86G\x97\x07\ \xfa\xf4\xd8\xf2\x86-{\x03\xb3\xc6Y6f\xfc\xc5l\ Stm\xf5\xf1/\x22\xf7\xca\x06\xa1\xa2\x9d\x0b\xfa\xa5\ \xa1\xb7\xc1\x01\xb6\x02\xee\xca\x08d\x1d\x08\xc1\x92[`\ \xee\xbf\x8e\xa8\xeb\x85\xda\xfb\x5c\x9d\xa5\x9aj\xc4\xdd\xc7\ \x83\x8a*\x95\xfd\xf3K\xf5\xf4Q\x1d\xa3\xa9\x07E\x8c\ \x08\xd3\x13\xfe\xd8\xc9\xfabvI,\xf2(\xbf\xae\xee\ \xbb\xeeIzqF=I\x10z\xbf\xf0\x04\xb8G\xc9\ \x91\x0b\x98\x1cr\x15\x10\x08\xc0\xbe\x16m\x80u>f\ \xff\xcez\xf3\x8a\xe8\xa9;@\xa4\xa0/D;&\x0d\ \xc7\x19\x93\x84Ps2\xb67!\xf5\x1b\x08#\xb7\xa7\ \x88\x08\x16,\x17Y\x18L\xd2\x1d\xbdu`\ >i\x9cIsU\x80\xad\xd4!\xcdYLI[\xf4\ R\x18j\x01s\xe3\xd1\xedr\x12I\x18\xdeh\x22Q\ \x9a\xb2\xa2\xc8a\xac\x9dQ\xe7\xaaE\x9f_\x89\xd4{\ \x9aM\xed\xa3q~\xea\x17\x98\x81\xba\xcf=\x819\xc8\ Q\xc9\x8e5\xab\xef\x1c\x1aL\x04JP\x08\x15\x04\x01\ ;\x01;Jf\xf3\x085V\x9f4\xb5\xf3\xc1\x06\xc9\ \xe2\xb4\x0a\xb7\xab.\xda\x14\x90\xe8\xf6\x93\x1fG\x12\x87\ \x9a\x9b\x8bl4\xd0\x9c<\x0b\x87'\x0fy%e\x1c\ H\xee\x80\xc4\x96\xb5\x9c\x06\xfd\x84~]\xda\x81\xd3\xce\ \xab\x09A\x0aj\xc8)\x96\xd0Fs\xc0*\xe9\x04\x82\ \x9c&\x93%\x98GYM\xd6\x86\x04C\x01\xdaG*\ Q\xac\xa0\xa7\x0d\xa0X\xd8\x0a\xc56G\x8d\x13V\xcf\ \x07\xe6l\xd8\xef\xc8\xb2'\xf4\xb6\xfb\xfcZ\xb1;\x02\ 4\xaf\x9az\xfd\x0a\xcc\xf4\xb9E\x09\x9a\x96\xc0\xef\x7f\ n\xba&\xfb'\x0a\xe1\xf7\xe7\x00\x22\xefw+:Z\ \xd3\x8c\xbbrU]W\xab\x84W\xf6\x8c\xd9\x8f\x10\xf4\ \xfd\xb1\x0a\xc8\xc7\xc0\xd3R\xa5\xfbRE\x0f\x030B\ \xac\xe2\x5ctA\x19t\xf2\x14\xb5\x94^\x86\xe2p\xbe\ 0\x88N\x8ap.Hp\xb8Od\xd4\x12c0!\ 3\xb90*:\x8e\xda\xf9H=\xe4\x1e\xd6x\xd36\ \xb5\x83M\x03b]\x04z\x16\xc3\xe7\xb7t\xa9\xfc\xc3\ \xd4*\xea\x94\x15\x5c4\xe8\x01\xa2\xd1(i\x03\xc5S\ \x9ex\x14O)\xc9\x80!DG\xd5`B\xea\x9f\xbf\ \x88\xc9\xed\xc5\xfe\xfe\xb0\xees$\xc8\xb2\x8c\x98\xf8\x90\ \x80\xc7\x1d\xc5\xfc\xfe\xa6\x8e>RZ\xa0\x80\x04\xc3E\ \xd1\x0b\x14 \xca\x1d\xc8A\x12\x1e\x90\x80s\xa4F\xa1\ \xa1\xbb\xa8J\xc1\xcf'\xd5\xcfYk\xe5s\x94q\xbf\ \x9f\xb3M\xb6\x80q\x80\xb7<\xad\x92N\xc7\x00)\x92\ \xb4\xe2\xc3\xc9\x93\xc1,\xa4\x84\x81\xc2G!\xce4T\ j$\xb4\x0c\xc2\x1dP\x90\xc8\xceh\xd6\xa9\xbf$#\ \xe18Ti\xcfADz\x10\xb7\xe8\x97\x8dS\x1a=\ \xd2\xf3\xa67\xac\x80\x16*\xf0\xd2\xde;\xc3u\xcf\x18\ \xa5\xe3 MNH\xa3\x92o:\xb6}\x1f\xdb\x1a\x86\ 2\x9a\x0c\xaf\xe8Q\x1f\xa0\xa3\x1a\x10\x82K~\x1c\x90\ \x0d\x9faA\xbb\x98\x0eX\x0e\xbe,\x9d\xeb=%x\ 3%8Ah!\x95\x16\x9c\x94\x92\xb3\xa2/\xfft\ \x18\x85hcL4\x9c\x04|\xf4\xca\x88xb\xe7\x05\ \x1c\xe9jO\xe2\xb3\x10\x00I\xdbT\x96$M\xd7\xd6\ r\xe0\xa9\xdc:M\x10\x87\x00\x95\x89\xf4@\xbe\x8f?\ \x07,\xd6\x9f|\x0c\x9c(c\x15m\x91H:\xf0\x89\ \xc21\xa1\x19\x80Q\x04\x98=\x89\x85\x9a\x80\x1c\x91\xbd\ \xd0H\x95\xd1?.\xa8\x96\x9e\xe0\x0bA\x08\x00\x09\xa2\ \xc4`\xb8\xe8\x8dT)\xa7\x80\x1f\x0c\x037\x83\xc3\x93\ \xe1\x03p\xa3H\xf2\x19\x0b\x8e\x04\xa4\x22D\xfa7u\ \x5c\xbd;\xbbI\xbd\xcbW\xd2l\x1ck\xe8\xff_\x0d\ \x06'\x1f\xf5\xd1Fy\xf3\xdf\xb7nr\xdf\xba\xed\xf3\ \xfa\x8f\x15'\xcf\xda}\xfaf.\xaaS\xdfu\xea\xbb\ N}\xd7\x9b\xe9\xbb\xce\xden\xa92\xbfW\xdf\xf5\x86\ m\xeaN}\xd7\xb7\xddw\xbd\xe1\xd8\x0e\xa7\xbe\xeb\xab\ \xef\xbb&-\xcb\xe9e\xf5\xe9e\xf5\x1f\xf3\xc3\x94\xff\ \xf9u\xf57\xfe}(\xea\xd6\xf4\xfbP%\xe8\xfb\xba\ \xc9G\x89\xd9\xb3\xdf\x85\xf2\xfb\x5c\xfa\x164\xbd\xb6\xbd\ \x9c\x5c\xc7\xf1\xea\xc8\x22\x8a\xa5\xd9\xfe\xad8}%\x0a\ \xa4\x91\xbe\xae\x93(\xb5\xce\xbd\x0a \x0a \x0a \x0a <\ path style=\x22fill\ :#ffffff\x22 id=\x22pa\ th10\x22 d=\x22M 12.02\ 7815,10.000259 A\ 1.0046462,0.972\ 79894 0 0 0 11,1\ 0.973525 l 0,10.\ 053967 a 1.00464\ 62,0.97279894 0 \ 0 0 1.506798,0.8\ 42274 l 4.495642\ ,-2.512825 4.495\ 643,-2.514091 a \ 1.0046462,0.9727\ 9894 0 0 0 0,-1.\ 684483 l -4.4955\ 74,-2.514492 -4.\ 495574,-2.513158\ a 1.0046462,0.9\ 7279894 0 0 0 -0\ .479188,-0.13065\ 8 z\x22/>\x0a \x0a\x0a\ \x00\x00\x03%\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2232\ \x22 height=\x2232\x22 ve\ rsion=\x221\x22>\x0a \x0a \x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x03\xc7\ \x00\ \x00\x0dVx\xda\xddW\xcd\x92\xd30\x0c\xbe\xf3\x14\x9e\ p\x81\x996\xb5e;\x8e\xcb\x96K\xaf\xe5\x05\xb8u\ \xda\xee6\x90\xb6;i\xa0\xdb}z$\xd9I\x9c\xfd\ \x81a\xb8\x00\xddL,9\x92\xf5I\xfe\x22go\xce\ \xdf\xef\xc4\xc3\xa1>\x9e\x17\xd9\xbem\xef\xe7\xb3\xd9\xe5\ r\xc9/:?5w3\x90R\xce\xd0\x22\x13\xd5v\ \x91\xa1\x00\x90\x89K\xb5m\xf7\x8bL\xa3\xb8\xdfUw\ \xfb6\xc8\xdfw\xcd\xb9:\x1d\x17\x99\xca>\xbe\x117\ \xcdn\xd3\x8as{\xadw\x8b\xect\xbf\xdeT\xedu\ .s\xf8p[\xd5\xf5\xfc\xad\xe4\x1f+\xd3\xee\xa9\x0a\ Q\xc8\xd1(k\xfb@P\x0e\x81H~XdS\x8d\ \xc6W\x1ae&\x1a\x9cP\xb9A\xe1\x1a\x85\xb6Y\x1f\ \xcf\xb7\xa7\xe6\xb0\xc8\x0e\xeb\xb6\xa9\x1e\xde\xc9\xc9T\xd1\ %\xe9\xef}6\xeb\x11v\x11\xe1\xe7\xe1\xe4\x1f\x85\xeb\ \xea\xd0\xe5\xeem\xe9\x9e\xe6\xce\x90\xee\xd7\xed\xfe7\x8b\ \xf6\xe1\xdc6\xa7\xaf\xbb\xf9\xf1t\xdcEy\xca\x99\xcc\ M\xa7\xd6\xd5q\xb7Y\xdf\xcf\x9b\xd3\xb7\xe36\x9d\xfc\ r\xaa\x8e\xe3\xd9C\xd5\xee\x9a\xba\xc2ap\xdf\xae\xcf\ \xfbu\xd3\xac\xaf\xa3\x18Ov\x8d\x90\x1b\xe5QC\xe5\ \x93\xf0\xb9u\x00\x85-&\xa5X\x8a2W\xc6\x15\xde\ \x00jn\xe2;\x0de%\x83a!V\xa4\x19Q\x0b\ =\x91\x82\xea\x97[\xef\x0b\xe9\xd1]\xc9\x89Ry\x01\ \xc6y\x85J\x94pN\xe0\xb4\x91R\x07e%\x94\xe6\ I\x8daR\x00\x9f\xc5'\xa1<\x0a5.\xacE\xb7\ 2\xc6Y\x0aP\xb9v\x16PCO\x80$\x10)\x10\ \x97\xc7\xb5IM\xe0\xe9\xdc\x80s\xda\xd0\x126I\x09\ t^Z\xd0\x92\xe2\x02D#\x94W\x01\x01Aq\x13\ \x90tK\x96@\xcdD\xbf\xa4XP$i@\x11\x12\ \xc4\x91\xee:\xc9\x1d\x95eR\x17z&'\x18<$\ \xc6J_\xcd\x15\xab2\x80\xf8,\x0eBYN()\ 7f:8\x0f\xf5\xc1eAv\xa5C\x853\xc21\ \x14\xb5K&\x14\xb5/\x02\xa2\xc5\xf2\x0c\xc9\x91\xd2\xe7\ \xbdbUr@\x04\x93\xbc\x02C\x1f0\xf0\x8cQn\ \xc4(\x87\xa9\x94\x09\xa3z\xbb\xc0(\xfd*\xa3\xe4\x0b\ \x8c\x92)\xa3dd\x94\xa4\xbb\x1b\x01\x88\x8cr\xbf`\ \x14\xa76\x04\x0a\xf4\x1a1JS\x09\xc2}\x00\xce\x94\ *_\xa0\x94K(\xe5\xc2\x06\xb8H)\xe5iKa\ D)\xfd\x02\xa5lJ)\x1b)e\xf9\x0e)\xa5`\ L)\x88,J(%G\x94\xe2\xf8x{\x9dR\xea\ \x05JAJ)\x88\x94\x82_P\xcaF\x16%\x94\x82\ \x11\xa5\x10\x06\xd5\x16\xc1dO\x9b\xa9\x8a\xad\xf4\x96\x7f\ \x7f]+}v\x08\xfc\x0cmr@\x8cNN\x19\xdf\ \x18\x1d6\x93JD\x05\x0c{\xc9\x1a\x8c\xb4\xc1\x0e\xab\ 'L\xaf-\xf9Yo\xd7K:\xf1\xa06\x00e\xb7\ \xd1\xd4\x87\xc0w\xfb\x8cv2Y\x00\x15\x93D\xe2g\ C(T\x13L\xfd\x1a\x90\xacN\xfcHsz|\xd2\ 0\xe2\x11\xa49\xfd\x03\xbf\xba 6b\x8a\x0c\xb3D\ \x22:\x8fsc\x0a\x12\x142\x8c\xe7\x05O\xa1Ns\ \xb5(\xd0n#:\x0f<\xc3\x83\x07\x1d\xe6\xd4B\x82\ K\x98\xa4)>\xe5\xd1mJ~\x8fH}91\xff\ {\xc8\xec\x9f\xfb@y\xf5\xd3\xaa\xeb\x06^oa\xb3\ \xf9;?\xac\xc2K]\x9a\xf8R+:\xf8\xa97C\ \xd82\xdc\xd2\xd0\xb7I\x01\xba\x96a\xe4=\xec\xact\ \xbc\xa8\xc1\xd2\x886>\x18\xd0\xa1\xdeY\xb3D\xaf\xb0\ \xecW\x8cV\x8a\xfd\xc2'\x16\x8d\x8f\x22 \xb1\x09\x12\ \xcbqm\x8f\xa4\x88H\x8a\x11\x12\xc7~.\x22q\x09\ \x12\xc7q\x8b\x1eI\x11\x91\xd8\x11\x12\xcb~6\x22\xb1\ =\x12\x9f \xf1\x1c\xd7wH@\x06$ S$\xa0\ 8y\x15\x90\x80\x1a\x90\xa0L\x1f%\xb2C\xc2\xfe\x84\ \xc4\x8f\x90\xf8x\xadb|nG7\xf4\xdf\xd2\xc77\ ?\x00\xd7\xb3D'\ \x00\x00\x05\x1a\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg16\ \x22 width=\x2232\x22 hei\ ght=\x2232\x22 version\ =\x221\x22>\x0a \x0a \x0a \x0a \x0a \x0a <\ path style=\x22fill\ :#ffffff;fill-op\ acity:1;opacity:\ 0.1\x22 id=\x22rect416\ 7\x22 d=\x22M 16 2 C 8\ .244 2 2 8.244 2\ 16 C 2 16.16884\ 2 2.0195214 16.3\ 3264 2.0253906 1\ 6.5 C 2.2891326 \ 8.9794325 8.4128\ 418 3 16 3 C 23.\ 587158 3 29.7108\ 67 8.9794325 29.\ 974609 16.5 C 29\ .980479 16.33264\ 30 16.168842 30\ 16 C 30 8.244 2\ 3.756 2 16 2 z\x22/\ >\x0a\x0a\ \x00\x00\x04\xaa\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2232\x22 heig\ ht=\x2232\x22 version=\ \x221\x22>\x0a \x0a \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x03\xb2\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2232\ \x22 height=\x2232\x22 ve\ rsion=\x221\x22>\x0a \x0a\ \x0a \ \x0a \x0a \x0a \ \x0a\ \x0a\ \x00\x00\x08\x98\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg12\ \x22 width=\x2232\x22 hei\ ght=\x2232\x22 version\ =\x221\x22>\x0a \x0a \x0a \x0a <\ path style=\x22fill\ :#ffffff\x22 id=\x22pa\ th10\x22 d=\x22M 12.02\ 7815,10.000259 A\ 1.0046462,0.972\ 79894 0 0 0 11,1\ 0.973525 l 0,10.\ 053967 a 1.00464\ 62,0.97279894 0 \ 0 0 1.506798,0.8\ 42274 l 4.495642\ ,-2.512825 4.495\ 643,-2.514091 a \ 1.0046462,0.9727\ 9894 0 0 0 0,-1.\ 684483 l -4.4955\ 74,-2.514492 -4.\ 495574,-2.513158\ a 1.0046462,0.9\ 7279894 0 0 0 -0\ .479188,-0.13065\ 8 z\x22/>\x0a \x0a \x0a\ \x0a \x0a \x0a\ \x0a\ \x00\x00\x01\xe0\ \x00\ \x00\x06\xa7x\xda\xd5U\xcd\x8e\x9b0\x10\xbe\xefSX\ \xee\xa5\x95\x1a\xf0\xf8\x07\x0c\x09{\xd9s\x1f\x02%$\ \xb8%\x10\x19w\x09}\xfa\x8eaCX6\x8d\xb6\xea\ \xa1\xadA\x9a\xf1\xe7\xf1\xfc~\x88M\xfb| \xe7c\ U\xb7\x19-\x9d;\xa5a\xd8u]\xd0\x89\xa0\xb1\x87\ \x903\xc6B\xb4\xa0\xc4\xec2\x8a\x0apJ:\xb3s\ eF\x05\xaaea\x0e\xa5\x1b\xf5\xe7\xc2\xb6\xa6\xa93\ \x0a\xf4\xf1\x81ll\xb1u\xa4u}Ud\xb49\xe5\ [\xe3\xfa\x94\x05|\xbd7U\x95~`\xc3\x1a6\xab\ \xcb)\x8cQ\xfcE\x092\x9a\x02q}\x0d\xe4\xf5s\ FW\x02\x8d{/\x19%\x16\x01\x90(\xfbQ:\x9b\ \xd7\xed\xbe\xb1\xc7\x8c\x1esg\xcd\xf9#\xfb\xbc\x02\xff\ 2\xff|\xa2\xe1\x94\xdf%\x1e\xbf\x1f\x8c\xfdA\xb0K\ \x0f\xc6\xba\xf7JK\x80e\xddCB\xa7\xdc\x95\x0b\xe3\ a-\x8c\xd7\xb3f\xce\x1b\xa609\xdc|!\x10\x11\ N\x9e\x88\x0e\xb8\x94\xa8\xf1I\xc3\x83\xa7A\x04\x10i\ -\xf1(`\x90(\x0e\xd2cB\xf0Hz\x88+\x91\ \xb0\xc8C\xca\xdb\x07\x5c'\x80g\xe8&\x89\x13)\xb8\ BM\x02\xc7:4\x11\xde\xa9\xf0f\x22P:\x06\xe5\ !\x9e\x0410\x1d\xc5\xb3+\x88%\xb1\x8cX2\xf9\ E@3\x19'\xd7\xd8\x82\xcdr\x1b6h\x87\xf2%\ \x7f\x11\xc4*\x1a\xcb\xe0\xe4\xc7l\x88\xbfG\xb2u\xeb\ l\xf3\xadH\xeb\xa6.^\xf4\xd50\xfbT^\xb6\x95\ \xa9\x8bm~Jm\xf3\xbd\xde\xcd\xc1\xaf\x8d\xa9_\xa3\ G\xe3\x0a[\x19\x14\xd7\xeb\xbb\xbc-sk\xf3\xfeU\ \x8c\xdb,\x17\x13\xf1\xd4\x95w\xfe#\xf34\x1bi\x07\ 0\xb2\x8e\x8f\xa4\xe37\xe8+A\xc4\xefp\xc4\x16\x8e\ \x96\x9d\x83\xf5=\xde\xfd\xf5\xbe\xdd\xaa[\xaa{u\xc7\ \xb7\x1b\xf8\xdf1\xe6\x97\x5c\xff\xc7'6\x1f\x14\xbcc\ P\xec-\xd37\xfe\xf7\xf3\xf8\xf0\x13\xa1\x97\x0c0\ \x00\x00\x04l\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2232\ \x22 height=\x2232\x22 ve\ rsion=\x221\x22>\x0a \x0a \x0a \x0a \x0a \x0a \x0a <\ path opacity=\x22.2\ \x22 d=\x22m5 28.471v1\ c0 0.847 0.6543 \ 1.529 1.4668 1.5\ 29h19.066c0.813 \ 0 1.467-0.682 1.\ 467-1.529v-1c0 0\ .847-0.654 1.529\ -1.467 1.529h-19\ .066c-0.8127 0-1\ .467-0.682-1.467\ -1.529z\x22/>\x0a \x0a \x0a\ \x0a\x0a\ \x00\x00\x06l\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2232\x22 heig\ ht=\x2232\x22 version=\ \x221\x22>\x0a \x0a \x0a \x0a \x0a \ \x0a \x0a \x0a\ \x0a\x0a\ \x00\x00\x01[\ \x00\ \x00\x05\x90x\xda\xc5T\xedj\x830\x14\xfd\xdf\xa7\x08\ \xd9\x9f\x15\x9a\x98\x1b\xabk\x87\xe9\xbb\x88U#\xf3\x8b\ \x18\xb4\xed\xd3/\xb1j\xdd`\xb2\x95\x8e\x12\x827\x9e\ {\xce\xb97^\x0c\x9a6E\xa7\x22/\x1b\x81\xa5\xd6\ \xf5\xbb\xe3t]G;\x97V*u8c\xcc1\x19\ \x18u\xd9QK\x81]\x8e\x91\x8c\xb3T\xeak\xdc\xc6\ \xaa\xc9\xaaR`\xc0\x87\x15\x0aT\x1ci\xd4hU}\ \xc4\x02\xbf\x182\x1eNd\xe0\x1bJU\x87Q\xa6\xcf\ \x02S\xe6M\xba\xb0\xbf\xe9\xda\xf8\xd4\xa7\x9a$\xe2\x1a\ \x0de\x8e@M\xb6:\x0f\x81Va\xd9$\x95*\x04\ V\x95\x0eu\xfc\xbagk\xecL5\xdcL\xf8\xbfy\ <\xa8O\x80k\x11\x1c\xee)\x22\xc9\xf2\xdc\x94\x10q\ \xbb\x16m\xeel5\xfdz\x97\xb3\xcc>\xccm\xf2v\ C\xb6k;\x00(\xa8C-\xd1Q\xe0\x02\x18\x02h\ \x09H\xe0-\x5cz\xado\xe8v\x11}[B9\xb3\ \xe8n\x04\x03'\xfd\xeb\x97\x7f\xc8\xad\x1f]\xbb\x16m\ \xd8\x9d6}\xb7\x83M\x92$\xf3q2R\xfd5p\ \xea!\x88\x08\xa3;\x17\x10#F\x111\xea\xfb\xfb>\ 2\xbb\x85\x88\x8d\xe8\xfc\xbd}J\xf0\xa3\x01B\x13\x11\ \x8dD21\xc9\xc4\x1c\xb7$\xe0_~[\xa3k\x05\ \xd93k\x9c\x8f\xaf\xf7\xc3\xf8\x12o\xe3=}|\x03\ \xfb\x9f=\xac>\x01\x9a\x80}I\ \x00\x00\x05\xcf\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg16\ \x22 width=\x2232\x22 hei\ ght=\x2232\x22 version\ =\x221\x22>\x0a \x0a \x0a \x0a \ \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x03\xd9\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2232\ \x22 height=\x2232\x22 ve\ rsion=\x221\x22>\x0a \x0a \x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x05\xb7\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg16\ \x22 width=\x2232\x22 hei\ ght=\x2232\x22 version\ =\x221\x22>\x0a \x0a \x0a \x0a \x0a \x0a \x0a <\ path id=\x22path413\ 9\x22 d=\x22M 7.642578\ 1,9 16.169922,18\ 24.380859,9 20.\ 501953,9 16,13.7\ 65625 11.498047,\ 9 7.6425781,9 Z\x22\ style=\x22fill:#ff\ d242;fill-opacit\ y:1;stroke-width\ :1.85714281\x22/>\x0a<\ /svg>\x0a\ \x00\x00\x04l\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2232\ \x22 height=\x2232\x22 ve\ rsion=\x221\x22>\x0a \x0a \x0a \x0a \x0a \ \x0a \x0a \x0a \x0a \ \x0a \x0a\x0a\ \x00\x00\x11.\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2232\ \x22 height=\x2232\x22 ve\ rsion=\x221\x22>\x0a \x0a \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x07\xa1\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg12\ \x22 width=\x2232\x22 hei\ ght=\x2232\x22 version\ =\x221\x22>\x0a \x0a \x0a \x0a <\ path style=\x22fill\ :#ffffff\x22 id=\x22pa\ th10\x22 d=\x22M 12.02\ 7815,10.000259 A\ 1.0046462,0.972\ 79894 0 0 0 11,1\ 0.973525 l 0,10.\ 053967 a 1.00464\ 62,0.97279894 0 \ 0 0 1.506798,0.8\ 42274 l 4.495642\ ,-2.512825 4.495\ 643,-2.514091 a \ 1.0046462,0.9727\ 9894 0 0 0 0,-1.\ 684483 l -4.4955\ 74,-2.514492 -4.\ 495574,-2.513158\ a 1.0046462,0.9\ 7279894 0 0 0 -0\ .479188,-0.13065\ 8 z\x22/>\x0a \x0a \x0a\ \x0a \x0a\x0a\ \ \x00\x00\x03\x8d\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg16\ \x22 width=\x2232\x22 hei\ ght=\x2232\x22 version\ =\x221\x22>\x0a \x0a \x0a \x0a \ \x0a \x0a\x0a\ \x00\x00\x04\x0f\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg16\ \x22 width=\x2232\x22 hei\ ght=\x2232\x22 version\ =\x221\x22>\x0a \x0a \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x08\x06\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg12\ \x22 width=\x2232\x22 hei\ ght=\x2232\x22 version\ =\x221\x22>\x0a \x0a \x0a \x0a <\ path style=\x22fill\ :#ffffff\x22 id=\x22pa\ th10\x22 d=\x22M 12.02\ 7815,10.000259 A\ 1.0046462,0.972\ 79894 0 0 0 11,1\ 0.973525 l 0,10.\ 053967 a 1.00464\ 62,0.97279894 0 \ 0 0 1.506798,0.8\ 42274 l 4.495642\ ,-2.512825 4.495\ 643,-2.514091 a \ 1.0046462,0.9727\ 9894 0 0 0 0,-1.\ 684483 l -4.4955\ 74,-2.514492 -4.\ 495574,-2.513158\ a 1.0046462,0.9\ 7279894 0 0 0 -0\ .479188,-0.13065\ 8 z\x22/>\x0a \x0a \x0a\ \x0a \x0a\x0a\ \x00\x00\x02Y\ \x00\ \x00\x08qx\xda\xedV\xdb\x8e\xda0\x10}\xdf\xaf\x18\ \xb9/\xad\xd4\x18{\x1c\xdf*\xb2\xff\x82r!HY\ X\x85\x14\xb6\xfd\xfa\xce\xc4I\x00A\xab\xdd\xc7J+\ \xa4\x8c/\x87\xe33\xe3\x09\x87\xf5\xf1\xb4\x85\xb7\x97n\ \x7f,D;\x0c\xaf?V\xab\xf3\xf9,\xcfF\x1e\xfa\ \xed\x0a\x95R+B\x088\xef\xaa\xa1-\x84A\x01m\ \xbd\xdb\xb6C\x1a\x9f\xea\xfe\xb8;\xec\x0b\xa1\xc5\xf3\x13\ \xac_7C\x0b\xcd\xae\xeb\x0a\xf1%\xf7!V\x04\xa9\ \x0a\xf1b\x14\xa0\x93N\xebS\x86(\x11\xb1T\x99\x92\ \xdeEG\xc1a\x9eiiB\xa4\xe74j3\xb4\x12\ K\xc6x\xeb@\xf1\x0e\x10R\xc7|\x1c2(\xc4\xd3\ \xcc\x05\x8c\x83\x91)\xedE\x98Q\xb1\x1d\x99f\x22^\ \xcf\x12Q\x0e\xf3q!\xfe\x16+\x96\xbf\x85\xc3\xeb\xa6\ \xdc\x0d\xbf\x0a!I\xf9\xd0o\xf6\xc7\xe6\xd0\xbf\x14b\ \x1cv\x9b\xa1\xfe\xaa\xbe\xebo\x9c+\xa3\x1f\x022i\ \x95\xf1\x1a2\x941\xc6\x84\xbd\xaaL\xd6\xff\xec\xeaB\ \xd4\xa7z\x7f\xa8\xaaT\x1e\xadd4\x11\xe2FI\x1b\ \x82GX\xe2\xf8!\xc1y$\xf1\x12\x0d\xe6\x5c\x14\xe7\ \x8d\xa6ip\xe88\x01o\x03\xa0T\xe8\x1d\x9d\xa9\xf2\ \xdc\x81\x91\xca\x05\xd7q\xfd\xa2\xe3\xba\x1a\xe7G\xf2\xa8\ \x02,\x114\x93k\xa9\xb4gv\x1b\x89\xa9\xd3\x12\xbd\ \xb6\xc4\xa7}\xf4\x7f\x11Dr\xa3S\x91\xa22\x86\x8b\ \x1b\xd0[KL\x88\x9eK\xef]nHJ\xd0\xd6\x10\ \x91\xd5\xd1fF\xfa`\xf0\x1f\x09\x1a\xe4\x10\xad\x0f\xe9\ 2\xa8f}]\x0es\xe3isi<\xba\x9a7Z\ !f\x01tUZ\x0b\xe8y\x81\x02O\xd3\xd7\xd7\xab\ \xed\xbbn\x89/)\xe0|M\xef=\xd2=:\x12\xd6\ \xe5\xae/\xbb\x1aJ\xda\x0a\x0c-y\xd3\x13\xe8\x83\xb2\ >(\x07\xf5\xfb\xe5 \xde\xcb\x99\x9e\xdb\xf9\xd5m\x9a\ \xaa\xf2\xe6\xff\xea\xf2\x10R\x9b\xe3\xd4\xe7\x1e\x96\xf8\xd9\ \xe7\x9f}~\xdd\xe7c\x97\xde\xfc\xd2s{\xe2lQ\ \xfa\xc6P\xc2\xc5P\x94\xba\xf7\x94kKY\x0c%\x9e\ \xb2\x99d\xf47\x0b\x8b\xbf\xc1\xbd\xbfa\xf2\xb7\xc4q\ \xf1\xc0\xc9\x93\xae-\xb5i\x1aq/\xdc$e\xe6\xd6\ .yid\xc4\xecJz\xf0\x9c^\xf2^;%\x98\ <\xd0O\x19N\xb3K\x8a\x93k&2\xbd\x18+1\ e\xfa\x91\x8d\x07\xbf\xe4@4c\xa2c*k\xfe#\ \xf1\xfc\xf4\x07\x03\xd0\x00\x1d\ \x00\x00\x08\xd8\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg12\ \x22 width=\x2232\x22 hei\ ght=\x2232\x22 version\ =\x221\x22>\x0a \x0a \x0a \x0a <\ path style=\x22fill\ :#ffffff\x22 id=\x22pa\ th10\x22 d=\x22M 12.02\ 7815,10.000259 A\ 1.0046462,0.972\ 79894 0 0 0 11,1\ 0.973525 l 0,10.\ 053967 a 1.00464\ 62,0.97279894 0 \ 0 0 1.506798,0.8\ 42274 l 4.495642\ ,-2.512825 4.495\ 643,-2.514091 a \ 1.0046462,0.9727\ 9894 0 0 0 0,-1.\ 684483 l -4.4955\ 74,-2.514492 -4.\ 495574,-2.513158\ a 1.0046462,0.9\ 7279894 0 0 0 -0\ .479188,-0.13065\ 8 z\x22/>\x0a \x0a \x0a\ \x0a \x0a \x0a \ \x0a \x0a\ \x0a\ \x00\x00\x05J\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg16\ \x22 width=\x2232\x22 hei\ ght=\x2232\x22 version\ =\x221\x22>\x0a \x0a \x0a \x0a \x0a \x0a \ \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x02\xfe\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2232\ \x22 height=\x2232\x22 ve\ rsion=\x221\x22>\x0a \x0a <\ g opacity=\x22.2\x22 t\ ransform=\x22matrix\ (1.5,0,0,-1.5,-8\ 14,-502.5)\x22>\x0a <\ path d=\x22m552-353\ v8.6667h2v-8.666\ 7zm0 10.667v2h2v\ -2z\x22/>\x0a \x0a \x0a\ \x0a \ \x0a \x0a <\ path opacity=\x22.2\ \x22 d=\x22m2 28.5v1c0\ 0.831 0.669 1.5\ 1.5 1.5h25c0.83\ 1 0 1.5-0.669 1.\ 5-1.5v-1c0 0.831\ -0.669 1.5-1.5 1\ .5h-25c-0.831 0-\ 1.5-0.669-1.5-1.\ 5z\x22/>\x0a\x0a\ \x00\x00\x01i\ \x00\ \x00\x06\x9ex\xda\xcdU\xdb\x8e\x820\x10}\xf7+&\ \xf5e7\xd9\x96v*\x88\x1b\xf1_\x08\x82%Q1\ \xa5\x11\xdd\xaf\xdfv\xa1\x08\xeb\xe5Q\x0d4\x1d\xa6\x9c\ \x9e\xd3\xcei\xba\xac\x8f\x1b8\xed\xb6\xfb:!\xca\x98\ \xc3w\x104M\xc3\x1a\xc9*\xbd\x09\x90s\x1e\xd8?\ \x084\xe5\xda\xa8\x84H$\xa0\xf2r\xa3L\x1b\x1fs\ ]\x97\xd5>!\x82\xac&\xb0\xd4yf\xa0(\xb7\xdb\ \x84L\xf3\xc5,\x8dd\x8f\xc4\xf8\x82t\xf1)!T\ r\x02\xe7\xae\xd76!Xh\x83s\x17\x18\x9d\xee\xeb\ \xa2\xd2\xbb\x84\xecR\xa3\xcb\xd3\x07\xff\xa2\xc2\xbd\xdc=\ \x9f$p\x94\x87\xd4(OY\x14\x05\x81\xea\x90f\xa5\ \xb1\x930A`m\xb1\x92\x85\x80\x19\xe5,\x96\x028\ \xb5s\x03gQ\xb4\xf8\x8bl;\x8a\x8c\xfb\xd1a\xde\ \xf5\x0a\xc3\xac\x1b\x82\x1e\x08\x1eH{$\xed\x91\xbe)\ \x8a\xe1\xcf@\xe2E\x96le\xcd\xed$\xf1CY\x96\ \x1a\x06\xba<\xadk\xb5c\xe9\xb3\xb4\x15\x13\xdeWs\ [\x09\xb6J\x84]\xdb\x8c\x85)\xba\x8dr2\xdcb\ \x81\xfa\xcf\x1biz\x9d\x7f\x90\xc61\xff\xb0X\x9e^\ >\x8f\xfej\xf9\x08\x18\xb7.\xb8\xb7\xdb\xff\x5cp\xb5\ \xf1\x1e9\x1e\x80\xce\x05\xa3\x1a\x8fK\xf3\xd0 (\xdf\ \xc6!\x18\x81\x98\xbf\xce!\x8e>z\x85C\xbaJ\x88\ \xf0}\xcej\x0c(^xV-=\x7f\x02\xfd\xd2\xdd\ :\xab\xc9/U\xb6r*\ \x00\x00\x05\x0e\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg16\ \x22 width=\x2232\x22 hei\ ght=\x2232\x22 version\ =\x221\x22>\x0a \x0a \x0a \x0a \ \x0a \x0a\x0a\ \x00\x00\x04\xc3\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg12\ \x22 width=\x2232\x22 hei\ ght=\x2232\x22 version\ =\x221\x22>\x0a \x0a \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x12\x9c\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2232\ \x22 height=\x2232\x22 ve\ rsion=\x221\x22>\x0a \x0a \x0a \x0a\ \x0a \x0a\x0a\ \x00\x00\x01\xef\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \x0a \x0a\ \x0a\x0a\ \x00\x00\x02\x01\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \x0a\x0a\ \ \x00\x00\x00h\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\ \x0a\ \x00\x00\x02(\ <\ svg width=\x22240\x22 \ height=\x22360\x22>\x0a \ \x0a \x0a \x0a\ \x0a\ \x00\x00\x01\xf6\ <\ svg height=\x22100\x22\ width=\x22100\x22>\x0a \ \x0a \x0a \x0a \ \x0a \x0a \ \x0a \x0a\x0a\ \x00\x00\x03\xde\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x02\x01\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \x0a\x0a\ \ \x00\x00\x01:\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \ \x0a\x0a\ \x00\x00\x00`\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00\xfd\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00\x9f\ <\ svg width=\x2216\x22 h\ eight=\x2232\x22>\x0a \ \x0a \x0a\x0a\ \x00\x00\x00a\ <\ svg width=\x2232\x22 h\ eight=\x2216\x22>\x0a \ \x0a\x0a\ \ \x00\x00\x01\xb9\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \x0a \ \x0a \ \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x03\xb7\ <\ svg width=\x22150\x22 \ height=\x22150\x22 >\x0a \ \x0a \x0a \x0a<\ /svg>\x0a\ \x00\x00\x02\x09\ <\ svg width=\x2260\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x01\xb2\ <\ svg height=\x2290\x22 \ width=\x2270\x22>\x0a \x0a \ \x0a \x0a \ \x0a \ \x0a \x0a \x0a\ \x0a\ \x00\x00\x07z\ <\ svg width=\x22125\x22 \ height=\x22100\x22>\x0a \ \x0a <\ path fill=\x22#634d\ 80\x22 d=\x22M 52.0119\ 74,115.59881 H 1\ 56.06585 c 11.08\ ,0 20,8.92 20,20\ v 44.92065 c 0,\ 11.08 -8.92,20 -\ 20,20 h -13.0067\ 3 -13.00674 l -0\ .40043,21.04927 \ -25.61304,-21.04\ 927 H 91.032178 \ 78.025443 65.018\ 709 52.011974 c \ -11.08,0 -20,-8.\ 92 -20,-20 v -44\ .92065 c 0,-11.0\ 8 8.92,-20 20,-2\ 0 z\x22/>\x0a \x0a \ \x0a \x0a \x0a\x0a\ \x00\x00\x02G\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \x0a \x0a \x0a <\ g transform=\x22rot\ ate(130) transla\ te(-12.2, -22.8)\ \x22>\x0a \x0a <\ /g>\x0a \x0a \x0a<\ /svg>\x0a\ \x00\x00\x01\xb9\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \x0a \ \x0a \ \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x00`\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x02\x12\ <\ svg height=\x2218\x22 \ width=\x2224\x22 >\x0a <\ g fill=\x22none\x22 fi\ ll-rule=\x22evenodd\ \x22 stroke=\x22none\x22 \ stroke-width=\x221\x22\ >\x0a \x0a \x0a \ \x0a \ \x0a \x0a \x0a\ \x0a\ \x00\x00\x02<\ <\ svg height=\x22100\x22\ width=\x22100\x22>\x0a \ \x0a \ \x0a \x0a \ \x0a <\ /g>\x0a \x0a <\ /g>\x0a\x0a\ \x00\x00\x01\xcb\ <\ svg height=\x22100\x22\ width=\x2280\x22>\x0a <\ g stroke=\x22none\x22 \ stroke-width=\x221\x22\ transform=\x22scal\ e(5)\x22>\x0a \x0a \x0a \ \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x00\x95\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x01\x19\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \ \x0a\x0a\ \x00\x00\x00\xaf\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00\xc2\ <\ svg width=\x22405\x22 \ height=\x22290\x22>\x0a \ \x0a \ \x0a \x0a \x0a\ \x0a\ \x00\x00\x02*\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \x0a \x0a \x0a \x0a <\ line x1=\x2211\x22 y1=\ \x2219.5\x22 x2=\x2218\x22 y\ 2=\x2219.5\x22 style=\x22\ stroke:#eff0f1;s\ troke-width:1\x22 /\ >\x0a\x0a\ \x00\x00\x01\x13\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \x0a \ \x0a \x0a\x0a\ \x00\x00\x01\x9e\ <\ svg height=\x2280\x22 \ width=\x22100\x22>\x0a <\ g stroke=\x22none\x22 \ stroke-width=\x221\x22\ transform=\x22scal\ e(5)\x22>\x0a \ \x0a \x0a \ \x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x00X\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\ \x0a\ \x00\x00\x02\x09\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x00\xbb\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00\xac\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \ \x0a \x0a\x0a\ \x00\x00\x02\x0c\ <\ svg width=\x2260\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a <\ /g>\x0a\x0a\ \x00\x00\x01\x01\ <\ svg width=\x22405\x22 \ height=\x22290\x22>\x0a \ \x0a \ \x0a \x0a\ \x0a \x0a\x0a\ \ \x00\x00\x00P\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00y\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \ \x0a\x0a\ \x00\x00\x00\x80\ <\ svg width=\x22405\x22 \ height=\x22290\x22>\x0a \ \x0a \ \x0a \x0a\x0a\ \x00\x00\x00\xf0\ <\ svg width=\x2265\x22 h\ eight=\x2260\x22>\x0a \x0a\ \x0a \x0a\ \x00\x00\x00\xb6\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x01\x92\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \x0a \x0a \ \x0a\ \x0a\ \x00\x00\x02\x09\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x00q\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \ \x00\x00\x00Y\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \ \x0a\x0a\ \x00\x00\x02\x1c\ <\ svg width=\x22240\x22 \ height=\x22360\x22>\x0a \ \x0a <\ path d=\x22m 0.9166\ 972,1.1894593 3.\ 310321,3.3105408\ -3.3117417,3.31\ 05408 c -0.15770\ 2,0.1577125 -0.1\ 57702,0.4134624 \ 0,0.5711749 0.15\ 7702,0.1577123 0\ .4134349,0.15771\ 23 0.5711369,0 l\ 3.5973102,-3.59\ 61283 0,0 0,0 c \ 0.1577019,-0.157\ 7124 0.1577019,-\ 0.4134624 0,-0.5\ 711748 L 1.48641\ 34,0.61828437 c \ -0.157702,-0.157\ 7124 -0.4134349,\ -0.1577124 -0.57\ 11369,0 -0.15628\ 13,0.1577125 -0.\ 1562813,0.413462\ 43 0.00142,0.571\ 17493 z\x22 fill=\x22#\ b83232\x22 fill-opa\ city=\x221.0\x22/>\x0a <\ /g>\x0a\x0a\ \x00\x00\x03\xb7\ <\ svg width=\x22150\x22 \ height=\x22150\x22 >\x0a \ \x0a \x0a \x0a<\ /svg>\x0a\ \x00\x00\x02\x01\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \x0a\x0a\ \ \x00\x00\x03\x83\ <\ svg height=\x2290\x22 \ width=\x2290\x22>\x0a \x0a \x0a \x0a \ \x0a \x0a \ \x0a \x0a \ \x0a \x0a\ \x0a <\ /g>\x0a \x0a\x0a\ \x00\x00\x00\x9f\ <\ svg width=\x2232\x22 h\ eight=\x2216\x22>\x0a \ \x0a \x0a\x0a\ \x00\x00\x01[\ <\ svg height=\x2215\x22 \ width=\x2218\x22 >\x0a <\ g fill=\x22none\x22 fi\ ll-rule=\x22evenodd\ \x22 id=\x22Page-1\x22 st\ roke=\x22none\x22 stro\ ke-width=\x221\x22>\x0a \ \x0a \x0a \ \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x01A\ <\ svg width=\x22150\x22 \ height=\x22150\x22 >\x0a \ \x0a \ \x0a \x0a\x0a\ \ \x00\x00\x01\xb9\ <\ svg height=\x22100\x22\ width=\x22100\x22>\x0a \ \x0a \ \x0a \x0a <\ path d=\x22M10,0 C4\ .5,0 0,4.5 0,10 \ C0,15.5 4.5,20 1\ 0,20 C15.5,20 20\ ,15.5 20,10 C20,\ 4.5 15.5,0 10,0 \ L10,0 Z M8,15 L3\ ,10 L4.4,8.6 L8,\ 12.2 L15.6,4.6 L\ 17,6 L8,15 L8,15\ Z\x22/>\x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x01\xf9\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x01\x8a\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \x0a <\ /g>\x0a \x0a \ \x0a\x0a\ \x00\x00\x00S\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x02\x1c\ <\ svg width=\x22240\x22 \ height=\x22360\x22>\x0a \ \x0a <\ path d=\x22m 0.9166\ 972,1.1894593 3.\ 310321,3.3105408\ -3.3117417,3.31\ 05408 c -0.15770\ 2,0.1577125 -0.1\ 57702,0.4134624 \ 0,0.5711749 0.15\ 7702,0.1577123 0\ .4134349,0.15771\ 23 0.5711369,0 l\ 3.5973102,-3.59\ 61283 0,0 0,0 c \ 0.1577019,-0.157\ 7124 0.1577019,-\ 0.4134624 0,-0.5\ 711748 L 1.48641\ 34,0.61828437 c \ -0.157702,-0.157\ 7124 -0.4134349,\ -0.1577124 -0.57\ 11369,0 -0.15628\ 13,0.1577125 -0.\ 1562813,0.413462\ 43 0.00142,0.571\ 17493 z\x22 fill=\x22#\ afafaf\x22 fill-opa\ city=\x221.0\x22/>\x0a <\ /g>\x0a\x0a\ \x00\x00\x01\xf6\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \x0a\x0a\ \x00\x00\x00\xcb\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x02t\ <\ svg height=\x22100\x22\ width=\x22100\x22>\x0a \ \ \x0a \ \x0a \x0a \ \x0a \x0a \ \x0a \x0a \ \x0a \x0a\x0a\ \x00\x00\x00j\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00_\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00\xcb\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x02\x01\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \x0a\x0a\ \ \x00\x00\x04w\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \x0a \x0a \x0a<\ /svg>\x0a\ \x00\x00\x01O\ <\ svg width=\x22100\x22 \ height=\x22100\x22 >\x0a \ \x0a \ \x0a \x0a\x0a\ \x00\x00\x00\x99\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \ \x0a\x0a\ \x00\x00\x01\xca\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00y\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \ \x0a\x0a\ \x00\x00\x02\x09\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x01/\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00\xac\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x032\ <\ svg width=\x22125\x22 \ height=\x22100\x22>\x0a \ \x0a <\ path fill=\x22#9999\ 5C\x22 d=\x22M 52.0119\ 74,115.59881 H 1\ 56.06585 c 11.08\ ,0 20,8.92 20,20\ v 44.92065 c 0,\ 11.08 -8.92,20 -\ 20,20 h -13.0067\ 3 -13.00674 l -0\ .40043,21.04927 \ -25.61304,-21.04\ 927 H 91.032178 \ 78.025443 65.018\ 709 52.011974 c \ -11.08,0 -20,-8.\ 92 -20,-20 v -44\ .92065 c 0,-11.0\ 8 8.92,-20 20,-2\ 0 z\x22/>\x0a \x0a \ \x0a <\ path stroke=\x22#ef\ f0f1\x22 stroke-wid\ th=\x224\x22 fill=\x22non\ e\x22 d=\x22m -50.0000\ 02,-45.56575 -11\ .604722,20.15564\ 7 -11.604722,20.\ 1556473 -11.6529\ 42,-20.1278073 -\ 11.652941,-20.12\ 7808 23.257664,-\ 0.02784 z\x22 />\x0a \ \x0a \x0a \ \x0a\ \x0a\ \x00\x00\x02\x09\ <\ svg width=\x2290\x22 h\ eight=\x2260\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x00\xac\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \ \x0a \x0a\x0a\ \x00\x00\x00\xa5\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00h\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\ \x0a\ \x00\x00\x01\x18\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \x0a <\ path fill=\x22#b0b0\ b0\x22 d=\x22M22.1,102\ 2.1L-22.1,977.9l\ 1000-1000L1022.1\ ,22.1Zm220,30L19\ 7.9,1007.9l1000-\ 1000L1242.1,52.1\ Zm250,0L447.9,10\ 07.9l1000-1000L1\ 492.1,52.1Zm250,\ 0L697.9,1007.9l1\ 030-1030L1772.1,\ 22.1Z\x22/>\x0a \x0a\ \x0a\ \x00\x00\x01\x13\ <\ svg width=\x2290\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \x0a \ \x0a \x0a\x0a\ \x00\x00\x00\xb8\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\ \x0a\ \x00\x00\x03\xde\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x02\x0c\ <\ svg width=\x2260\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a <\ /g>\x0a\x0a\ \x00\x00\x03\x0c\ <\ svg width=\x22109.5\ 805\x22 height=\x22107\ .97688\x22>\x0a \x0a \ \x0a \x0a \x0a \x0a \x0a <\ g transform=\x22tra\ nslate(-39.82316\ 2,-58.532028)\x22>\x0a\ \x0a <\ /g>\x0a\x0a\ \x00\x00\x02c\ <\ svg width=\x22125\x22 \ height=\x22100\x22>\x0a \ \x0a <\ path fill=\x22#4068\ 80\x22 d=\x22M 52.0119\ 74,115.59881 H 1\ 56.06585 c 11.08\ ,0 20,8.92 20,20\ v 44.92065 c 0,\ 11.08 -8.92,20 -\ 20,20 h -13.0067\ 3 -13.00674 l -0\ .40043,21.04927 \ -25.61304,-21.04\ 927 H 91.032178 \ 78.025443 65.018\ 709 52.011974 c \ -11.08,0 -20,-8.\ 92 -20,-20 v -44\ .92065 c 0,-11.0\ 8 8.92,-20 20,-2\ 0 z\x22/>\x0a \x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x02(\ <\ svg width=\x22240\x22 \ height=\x22360\x22>\x0a \ \x0a \x0a \x0a\ \x0a\ \x00\x00\x01O\ <\ svg width=\x22100\x22 \ height=\x22100\x22 >\x0a \ \x0a \ \x0a \x0a\x0a\ \x00\x00\x02\x09\ <\ svg width=\x2260\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x01\xef\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \ \x0a \x0a \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x00a\ <\ svg width=\x2216\x22 h\ eight=\x2232\x22>\x0a \ \x0a\x0a\ \ \x00\x00\x01\x84\ <\ svg height=\x2298\x22 \ width=\x2298\x22>\x0a \x0a \x0a\ \x0a <\ path d=\x22M14,1.4 \ L12.6,0 L7,5.6 L\ 1.4,0 L0,1.4 L5.\ 6,7 L0,12.6 L1.4\ ,14 L7,8.4 L12.6\ ,14 L14,12.6 L8.\ 4,7 L14,1.4 Z\x22/>\ \x0a \x0a \ \x0a \x0a\x0a\ \x00\x00\x02\xb9\ <\ svg width=\x22125\x22 \ height=\x22100\x22>\x0a \ \x0a <\ path fill=\x22#8040\ 4a\x22 d=\x22M 52.0119\ 74,115.59881 H 1\ 56.06585 c 11.08\ ,0 20,8.92 20,20\ v 44.92065 c 0,\ 11.08 -8.92,20 -\ 20,20 h -13.0067\ 3 -13.00674 l -0\ .40043,21.04927 \ -25.61304,-21.04\ 927 H 91.032178 \ 78.025443 65.018\ 709 52.011974 c \ -11.08,0 -20,-8.\ 92 -20,-20 v -44\ .92065 c 0,-11.0\ 8 8.92,-20 20,-2\ 0 z\x22/>\x0a \x0a \ \ \x0a\x0a\ \x00\x00\x00\xc5\ <\ svg width=\x22405\x22 \ height=\x22290\x22>\x0a \ \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x01A\ <\ svg width=\x22150\x22 \ height=\x22150\x22 >\x0a \ \x0a \ \x0a \x0a\x0a\ \ \x00\x00\x02\x0c\ <\ svg width=\x2260\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a <\ /g>\x0a\x0a\ \x00\x00\x02\x98\ <\ svg height=\x22100\x22\ width=\x22100\x22>\x0a \ \x0a \x0a \x0a \ \x0a \x0a\ \x0a \x0a\ \x0a\ \x00\x00\x00\xe3\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x01\xfb\ <\ svg height=\x2216\x22 \ width=\x2216\x22>\x0a \ \x0a \x0a \x0a\ \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x00\xca\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x03\xde\ <\ svg width=\x22100\x22 \ height=\x22100\x22>\x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x00\xb5\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \x0a\x0a\ \x00\x00\x01\xed\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \ \x0a \x0a \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x00\x80\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x00g\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a<\ /svg>\x0a\ \x00\x00\x01\xdc\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \ \x0a \x0a\ \x0a <\ /g>\x0a\x0a\ \x00\x00\x03\x8e\ <\ svg width=\x22109.5\ 805\x22 height=\x22107\ .97688\x22>\x0a \x0a \ \x0a \x0a \x0a \x0a \x0a <\ g transform=\x22tra\ nslate(-39.82316\ 2,-58.532028)\x22>\x0a\ \x0a \x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x00\xb9\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \ \x0a\x0a\ \x00\x00\x00\xec\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a\x0a\ \x00\x00\x02\x0f\ <\ svg height=\x2290\x22 \ width=\x2290\x22>\x0a \x0a \ \x0a \x0a \ \x0a \ \x0a \x0a\ \x0a\x0a\ \x00\x00\x01\xcd\ <\ svg height=\x2215\x22 \ width=\x2226\x22>\x0a \ \x0a \x0a \x0a\ \x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x02\x0d\ <\ svg width=\x2224\x22 h\ eight=\x2224\x22>\x0a \x0a \ \x0a \x0a \ \x0a\x0a\ \x00\x00\x00\xc2\ <\ svg width=\x22405\x22 \ height=\x22290\x22>\x0a \ \x0a \ \x0a \x0a \x0a\ \x0a\ \x00\x00\x02\x09\ <\ svg width=\x2260\x22 h\ eight=\x2290\x22>\x0a \x0a \x0a \ \x0a\x0a\ \x00\x00\x03`\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x01\x1b\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x03\x96\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \x0a\x0a\ \x00\x00\x02\xd9\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \ \x0a\x0a\ \x00\x00\x00\xaf\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x02$\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x02\xab\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x01%\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x02\x80\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x01\x81\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \ \x00\x00\x019\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \ \x0a\x0a\ \x00\x00\x00\xc6\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x022\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\ \x0a\ \x00\x00\x02R\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a \x0a\ \x0a\ \x00\x00\x02\x81\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \ \x00\x00\x02%\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \x0a\x0a\ \x00\x00\x02\xd0\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 ve\ rsion=\x221.1\x22>\x0a \x0a\x0a\ \x00\x00\x01\xb5\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \x0a\x0a\ \x00\x00\x05_\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \x0a\ \x0a\x0a\ \x00\x00\x01\xcd\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a \x0a \ .ColorScheme-T\ ext { color:#313\ 63b; } .ColorSch\ eme-Highlight { \ color:#3daee9; }\ \x0a \x0a \x0a \x0a\x0a\ \x00\x00\x019\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \ \x0a\x0a\ \x00\x00\x00\xa4\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x00\xd1\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \ \x00\x00\x01I\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \ \x0a\x0a\ \x00\x00\x01Z\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x01\x7f\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 id=\x22svg2\x22\ width=\x2216\x22 heig\ ht=\x2216\x22 version=\ \x221.1\x22 viewBox=\x220\ 0 16 16\x22>\x0a \x0a\x0a\ \x00\x00\x02 \ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x02T\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x01\xaa\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x02\xd0\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00\x00\xa1\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \ \x00\x00\x03D\ <\ svg xmlns=\x22http:\ //www.w3.org/200\ 0/svg\x22 width=\x2216\ \x22 height=\x2216\x22 vi\ ewBox=\x220 0 16 16\ \x22>\x0a \x0a\x0a\ \x00\x00V\x82\ <\ \xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\xa7\ \x00\x00\x00\x05fa_IRB\x00\x00\x05\xd8\x00\x00\ \x05;\x00\x00\x07\xf4\x00\x00\x05;\x00\x00\x0e\xbb\x00\x00\ \x05;\x00\x00E-\x00\x00N:\x00\x00M\x03\x00\x04\ \xcf\x04\x00\x00$\xb0\x00\x04\xd9\x90\x00\x00\x0dZ\x00\x04\ \xe3\xc0\x00\x00\x0d\xb9\x00\x050K\x00\x00\x0d\xeb\x00\x05\ \xab`\x00\x00,\xaf\x002v\xee\x00\x00@\x9d\x00H\ w9\x00\x00#\xc4\x00Hw9\x00\x00)q\x00M\ \x99S\x00\x00\x0d\x88\x00O\xc5g\x00\x00G\x92\x00R\ \xd9$\x00\x00\x1dS\x00V\x8c\x95\x00\x00+m\x00W\ iz\x00\x00\x0e\xe9\x00Wiz\x00\x00M\xe6\x00W\ \x96\xf9\x00\x00\x0f\x1e\x00]6\xbe\x00\x00?k\x00\x97\ \xa2\x10\x00\x00\x09!\x00\xb7\xbb\x02\x00\x00\x0be\x00\xc2\ \xad\xd0\x00\x00\x17\xc5\x01\x18\xab\xd4\x00\x00#\xf8\x010\ \x8d\xae\x00\x000(\x01w&\x82\x00\x00=\x13\x01\x8b\ p\x0e\x00\x003J\x01\xe1\xc2\xec\x00\x00HI\x02/\ @\xf0\x00\x00<\x15\x02S\xd0\x00\x00\x00\x11\x92\x02\x8a\ \x0a#\x00\x00\x14\xcb\x02\x95c\x03\x00\x00$\xe1\x02\x9a\ \xf5p\x00\x00\x18%\x02\xaag'\x00\x00(I\x02\xf1\ \x09\xf0\x00\x00\x18\x96\x02\xf9\xc5\xc5\x00\x00\x07\xc1\x03\x0d\ 1^\x00\x00\x13E\x03\x1c\xc5*\x00\x00*I\x03<\ \x83\x03\x00\x00\x0e\x1b\x03KF\xe3\x00\x00)\xf6\x03K\ F\xe3\x00\x00>\xcc\x03\x92\xd2\xce\x00\x00AB\x03\x9a\ [4\x00\x00\x0cM\x03\x9a[4\x00\x00L:\x03\xdc\ \xdc%\x00\x00\x15\x94\x03\xdc\xf5\xc3\x00\x00>/\x04\x0d\ B\x0e\x00\x00\x1e0\x04\x19\x82N\x00\x00 (\x04\x22\ \x85.\x00\x00\x15!\x04E\xb2\xc0\x00\x00J\xb2\x04]\ I3\x00\x00E\x9a\x04e\xac\xf5\x00\x00$o\x04f\ \xd7n\x00\x00\x03S\x04g\xac\xf5\x00\x00\x0d\x1c\x04\x98\ I\xbc\x00\x00\x09\xc6\x04\x98I\xbc\x00\x00;\x22\x04\x9c\ (\xe1\x00\x00%.\x04\x9e\x84\xd5\x00\x00;P\x04\xcb\ Xj\x00\x00\x0eg\x04\xcbXj\x00\x00M1\x04\xcb\ \xfd\x9e\x00\x00\x01\xb6\x04\xd6W\xc0\x00\x00A\x10\x05\x13\ \xccT\x00\x00\x1d\xec\x050N\xc0\x00\x00*\xe2\x05O\ \xa2\x10\x00\x00\x0c\xc3\x05O\xa2\x10\x00\x00L\xad\x05_\ . \x00\x00\x1cH\x05_\xa8`\x00\x00\x19;\x05c\ \x9c>\x00\x00\x1f\x16\x05c\x9c>\x00\x00O0\x05i\ <\xfe\x00\x00\x1f\xd8\x05t\x96\x00\x00\x00\x0fQ\x05t\ \x96\x00\x00\x00N\x14\x05v\x1b\x9e\x00\x00\x15\xcf\x05\x83\ \x80e\x00\x00\x10]\x05\x8c\xac5\x00\x00,\x05\x05\xa1\ \x08\xc0\x00\x00H\x98\x05\xa3\x9c>\x00\x00\x1fw\x05\xa3\ \x9c>\x00\x00O\x9c\x05\xa8X\xf3\x00\x00\x06\xec\x05\xaa\ \x8b\xc3\x00\x00H\xd2\x05\xc63\xee\x00\x00\x02\x83\x05\xd0\ )\xae\x00\x004k\x06-B\x0e\x00\x00\x1e\xa3\x06-\ B\x0e\x00\x00N\xb4\x069\x82N\x00\x00 \x99\x069\ \x82N\x00\x00P\x08\x06:\xd1\xf2\x00\x00H\x03\x06<\ =\x10\x00\x00Jh\x06]1\xde\x00\x00\x05r\x06\x9a\ K\x00\x00\x00\x11\xcd\x06\x9a\xf5C\x00\x00F\xa8\x06\x9c\ (\x01\x00\x00CM\x06\xb6\xbe`\x00\x00\x0aN\x06\xc5\ )*\x00\x00*\x8d\x06\xcc\xd6\xa3\x00\x00&\xf5\x06\xdc\ S\xa3\x00\x00\x0a\xa6\x06\xef\xbcp\x00\x00\x0b\xf8\x06\xef\ \xbcp\x00\x00K\xe8\x07\x14*\x1e\x00\x00'\x80\x07\x1d\ \xe0`\x00\x00I\x8e\x076\xcd`\x00\x00?\x1e\x076\ \xcd`\x00\x00K\x9e\x076\xcf`\x00\x00\x0b\x18\x07[\ &u\x00\x00\x19\xe4\x07\x9b]0\x00\x00D\xce\x07\x9c\ 1\x03\x00\x00J\x06\x08 Hn\x00\x00\x06\x1f\x08g\ -\xa2\x00\x00\x13\xc0\x08\x95 \xa3\x00\x00\x07:\x08\xf6\ \x88`\x00\x00\x0f\xa1\x08\xf6\x88`\x00\x00Na\x09>\ \x0d$\x00\x00(\xcd\x09^\x89\xd3\x00\x00&\xbc\x09`\ \x06\xb5\x00\x00(\x8c\x09b\x06\xb5\x00\x00\x10\x91\x09g\ \x01\xd0\x00\x00I3\x09|\xf4.\x00\x009P\x09}\ R\xc0\x00\x00\x0b\xaf\x09\x8ct\xd3\x00\x00Fo\x09\x93\ \xd2\xfe\x00\x00)\xa3\x09\x96F0\x00\x00\x1a\xf1\x09\xb8\ \x7f\xb1\x00\x00\x00\x00\x0a\x06e~\x00\x00<\xba\x0a\x0c\ \x87\x0e\x00\x00.E\x0aErt\x00\x00F\xe3\x0a_\ \xd7\x0e\x00\x00\x12\x1b\x0a_\xf3\xfb\x00\x00#\x13\x0as\ >\xc3\x00\x00\x08\x85\x0a\x8b\xc3`\x00\x00,x\x0a\x97\ \x00\x80\x00\x00\x114\x0a\xa2Yp\x00\x00E\xfa\x0a\xc0\ (\x90\x00\x00I\x04\x0b`r`\x00\x00C\xe3\x0bn\ \xb1\xee\x00\x008\x07\x0bv\x04\xf0\x00\x00\x17^\x0b\x89\ w\x94\x00\x00#y\x0b\x89w\x94\x00\x00)(\x0b\xc8\ \xc7\x13\x00\x00=\xf9\x0b\xef\xd8N\x00\x00\x1c\xd1\x0b\xf9\ \x95\xb3\x00\x00\x1aF\x0c(\x19\x04\x00\x00'4\x0c2\ \xc0S\x00\x00\x07}\x0cP\xdb[\x00\x00\x08\xca\x0cX\ \xcd\xfe\x00\x001\xfc\x0ce\x0f.\x00\x00(\x05\x0ce\ \x0f.\x00\x00,8\x0c\x96q\xc0\x00\x00\x12\x94\x0c\x96\ q\xc0\x00\x00\x18\xeb\x0c\x99e\x80\x00\x00\x1b.\x0c\xb5\ \x86\x80\x00\x00+\x17\x0c\xb5\x86\x80\x00\x00Dy\x0c\xc2\ K\xd3\x00\x00;\x82\x0c\xdd\xc2\x03\x00\x00E[\x0c\xe0\ \x1a\xf3\x00\x00D2\x0c\xfb\xe0\x8a\x00\x00\x1bf\x0d\x1f\ .H\x00\x00\x0f\xf7\x0d\x1f\x9f\xd3\x00\x00@1\x0dq\ \x98\xde\x00\x00\x04 \x0d\x99\xf9B\x00\x00\x08 \x0d\x99\ \xf9B\x00\x00\x14\x1f\x0d\x99\xf9B\x00\x00&R\x0d\x99\ \xf9B\x00\x00+\x9d\x0d\x99\xf9B\x00\x00M\x82\x0d\xff\ u~\x00\x00/\x09\x0e i\x22\x00\x00\x1d\xa5\x0e.\ d\xa4\x00\x00&\x05\x0e7I\xc3\x00\x00\x09r\x0eS\ \x1c\xd3\x00\x00\x14\x8d\x0ex\xa8B\x00\x00\x09\xf4\x0ex\ \xa8B\x00\x00KG\x0e\xb2\xf0\x80\x00\x00C\xad\x0e\xc4\ J\xf0\x00\x00\x10\xcf\x0e\xca\xc0\x99\x00\x00%\x91\x0e\xda\ \xd4\xfe\x00\x00-\x1a\x0f6\xb6\x90\x00\x00\x19\x8d\x0fy\ \xa5^\x00\x00!\x0a\x0fy\xa5^\x00\x006\x01\x0f}\ \x11p\x00\x00\x12\xe4\x0f\x9e\x0b~\x00\x00B\x16\x0f\xa6\ V\x80\x00\x00A\xe3\x0f\xa7\xb6\x04\x00\x00\x1a\x9a\x0f\xac\ [\xee\x00\x00\x1b\xde\x0f\xd1?\x00\x00\x00,\xde\x0f\xd6\ \xe5\xde\x00\x001\x1a\x0f\xde{\xf0\x00\x00\x06~\x061\x06H\x06\x98\ \x06G\x00 \x00F\x00F\x00m\x00p\x00e\x00g\ \x00<\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\ \x00;FFmpe\ g project\x07\x00\x00\ \x00\x0babout_ui_tr\x01\x03\x00\ \x00\x00t\x00<\x00a\x00 \x00h\x00r\x00e\x00\ f\x00=\x00h\x00t\x00t\x00p\x00s\x00:\x00\ /\x00/\x00g\x00i\x00t\x00h\x00u\x00b\x00\ .\x00c\x00o\x00m\x00/\x00p\x00s\x00f\x00\ /\x00r\x00e\x00q\x00u\x00e\x00s\x00t\x00\ s\x00>\x06~\x061\x06H\x06\x98\x06G\x00 \x00\ R\x00e\x00q\x00u\x00e\x00s\x00t\x00s\x00\ <\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ <Request\ s project\x07\x00\x00\ \x00\x0babout_ui_tr\x01\x03\x00\ \x00\x00r\x00<\x00a\x00 \x00h\x00r\x00e\x00\ f\x00=\x00h\x00t\x00t\x00p\x00s\x00:\x00\ /\x00/\x00g\x00i\x00t\x00h\x00u\x00b\x00\ .\x00c\x00o\x00m\x00/\x00y\x00t\x00-\x00\ d\x00l\x00p\x00/\x00y\x00t\x00-\x00d\x00\ l\x00p\x00>\x06~\x061\x06H\x06\x98\x06G\x00\ \x00Y\x00T\x00-\x00D\x00L\x00P\x00<\x00\ /\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00;<\ a href=https://g\ ithub.com/yt-dlp\ /yt-dlp>YT-DLP p\ roject\x07\x00\x00\x00\x0ba\ bout_ui_tr\x01\x03\x00\x00\x00<\ \x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\ \x00p\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x00d\x00m\x00.\x00g\x00i\x00t\ \x00h\x00u\x00b\x00.\x00i\x00o\x08\x00\x00\x00\ \x00\x06\x00\x00\x00Ihtt\ ps://persepolisd\ m.github.io\x07\ \x00\x00\x00\x0babout_ui_tr\x01\ \x03\x00\x00\x00@\x00h\x00t\x00t\x00p\x00s\x00\ :\x00/\x00/\x00t\x00e\x00l\x00e\x00g\x00\ r\x00a\x00m\x00.\x00m\x00e\x00/\x00p\x00\ e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00\ s\x00d\x00m\x08\x00\x00\x00\x00\x06\x00\x00\x00M<\ a href=https://t\ elegram.me/perse\ polisdm>https://\ telegram.me/pers\ epolisdm\x07\x00\x00\x00\ \x0babout_ui_tr\x01\x03\x00\x00\ \x00@\x00h\x00t\x00t\x00p\x00s\x00:\x00/\ \x00/\x00t\x00w\x00i\x00t\x00t\x00e\x00r\ \x00.\x00c\x00o\x00m\x00/\x00p\x00e\x00r\ \x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00d\ \x00m\x08\x00\x00\x00\x00\x06\x00\x00\x00Mhttps://twi\ tter.com/persepo\ lisdm\x07\x00\x00\x00\x0bab\ out_ui_tr\x01\x03\x00\x00\x00r\x00\ <\x00a\x00 \x00h\x00r\x00e\x00f\x00=\x00\ h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00\ w\x00i\x00k\x00i\x00.\x00q\x00t\x00.\x00\ i\x00o\x00/\x00Q\x00t\x00_\x00f\x00o\x00\ r\x00_\x00P\x00y\x00t\x00h\x00o\x00n\x00\ >\x06~\x061\x06H\x06\x98\x06G\x00 \x00P\x00\ y\x00s\x00i\x00d\x00e\x00<\x00/\x00a\x00\ >\x08\x00\x00\x00\x00\x06\x00\x00\x00;Pyside proje\ ct\x07\x00\x00\x00\x0babout\ _ui_tr\x01\x03\x00\x00\x00\x1e\x06/\x061\ \x06(\x06'\x061\x06G\x00 \x06~\x061\x063\ \x06~\x06H\x06D\x06\xcc\x063\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x10About Persep\ olis\x07\x00\x00\x00\x0babout_u\ i_tr\x01\x03\x00\x00\x00\x14\x06B\x06/\x061\ \x06/\x06'\x06F\x06\xcc \x0c\x06G\x06'\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0fAcknowle\ dgments\x07\x00\x00\x00\x0babou\ t_ui_tr\x01\x03\x00\x00\x00\x1a\x06*\x06\ H\x063\x069\x06G\x00 \x06/\x06G\x06F\x06\ /\x06\xaf\x06'\x06F\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0aDevelopers\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ \x0c\x06~\x061\x06H\x06'\x06F\x06G\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x07License\x07\x00\ \x00\x00\x0babout_ui_tr\x01\x03\ \x00\x00\x00\x0a\x06*\x06'\x06\xcc\x06\xcc\x06/\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x02OK\x07\x00\x00\x00\x0ba\ bout_ui_tr\x01\x03\x00\x00\x00*\ \x06/\x06'\x06F\x06D\x06H\x06/\x00 \x06E\ \x06F\x06\xcc\x06,\x061\x00 \x06~\x061\x063\ \x06~\x06H\x06D\x06\xcc\x063\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1bPersepolis D\ ownload Manager\x07\ \x00\x00\x00\x0babout_ui_tr\x01\ \x03\x00\x00\x00\x1a\x06*\x061\x06,\x06E\x06G \ \x0c\x06\xa9\x06F\x06F\x06/\x06\xaf\x06'\x06F\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0bTransla\ tors\x07\x00\x00\x00\x0babout_u\ i_tr\x01\x03\x00\x00\x00$\x06'\x06A\x062\ \x06H\x06/\x06F\x00 \x06D\x06\xcc\x06F\x06\xa9\ \x00 \x06/\x06'\x06F\x06D\x06H\x06/\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x11Add Down\ load Link\x07\x00\x00\x00\x0dad\ dlink_ui_tr\x01\x03\x00\x00\x00\ \x1e\x06'\x06A\x062\x06H\x06/\x06F\x00 \x06\ (\x06G\x00 \x06/\x063\x06*\x06G\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x11Add to \ category: \x07\x00\x00\x00\x0da\ ddlink_ui_tr\x01\x03\x00\x00\ \x00\x22\x06\xaf\x062\x06\xcc\x06F\x06G \x0c\x06G\ \x06'\x06\xcc\x00 \x06~\x06\xcc\x064\x061\x06A\ \x06*\x06G\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Ad\ vanced Options\x07\x00\ \x00\x00\x0daddlink_ui_tr\ \x01\x03\x00\x00\x00\x06\x06D\x06:\x06H\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x06Cancel\x07\x00\x00\x00\ \x0daddlink_ui_tr\x01\x03\ \x00\x00\x00\x22\x06*\x06:\x06\xcc\x06\xcc\x061\x00 \ \x06~\x06H\x064\x06G\x00 \x06/\x06'\x06F\ \x06D\x06H\x06/\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16\ Change Download \ Folder\x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x00$\x06H\ \x06\xcc\x061\x06'\x06\xcc\x064\x00 \x06F\x06'\ \x06E\x00 \x06~\x061\x06H\x06F\x06/\x06G\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x12Chan\ ge file name: \x07\x00\ \x00\x00\x0daddlink_ui_tr\ \x01\x03\x00\x00\x004\x06*\x064\x06.\x06\xcc\x065\ \x00 \x06*\x06F\x068\x06\xcc\x06E\x06'\x06*\ \x00 \x06~\x061\x06'\x06\xa9\x063\x06\xcc\x00 \ \x063\x06\xcc\x063\x06*\x06E\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1cDetect Syste\ m Proxy Settings\ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x00\x1a\x06~\x06H\x064\x06G\ \x00 \x06/\x06'\x06F\x06D\x06H\x06/\x00:\ \x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Down\ load Folder: \x07\x00\x00\ \x00\x0daddlink_ui_tr\x01\ \x03\x00\x00\x00\x1a\x06(\x069\x06/\x06'\x00 \x06\ /\x06'\x06F\x06D\x06H\x06/\x06\xa9\x06F\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0eDownloa\ d Later\x07\x00\x00\x00\x0daddl\ ink_ui_tr\x01\x03\x00\x00\x00\x18\x06\ D\x06\xcc\x06F\x06\xa9\x00 \x06/\x06'\x06F\x06\ D\x06H\x06/\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0fDownload link: \ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x00 \x06\xaf\x060\x061\x06H\ \x06'\x06\x98\x06G\x00 \x06/\x06'\x06F\x06D\ \x06H\x06/\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x13Download passw\ ord: \x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x006\x06F\x06\ '\x06E \x0c\x06\xa9\x06'\x061\x06(\x061\x06\ \xcc\x00 \x06H\x00 \x06\xaf\x060\x061\x06H\x06\ '\x06\x98\x06G\x00 \x06/\x06'\x06F\x06D\x06\ H\x06/\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1eDow\ nload username a\ nd password\x07\x00\x00\x00\x0d\ addlink_ui_tr\x01\x03\x00\ \x00\x00$\x06F\x06'\x06E \x0c\x06\xa9\x06'\x06\ 1\x06(\x061\x06\xcc\x00 \x06/\x06'\x06F\x06\ D\x06H\x06/\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x13Download userna\ me: \x07\x00\x00\x00\x0daddlink\ _ui_tr\x01\x03\x00\x00\x00\x14\x062\x06E\ \x06'\x06F\x00 \x06~\x06'\x06\xcc\x06'\x06F\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x08End ti\ me\x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00\x08\x00H\x00T\x00T\ \x00P\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04HTTP\ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x00\x0a\x00H\x00T\x00T\x00P\ \x00S\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05HTTP\ S\x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00\x0c\x06\x22\x06\xcc \x0c\x06\ ~\x06\xcc\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04I\ P: \x07\x00\x00\x00\x0daddlink_\ ui_tr\x01\x03\x00\x00\x00\x0a\x06~\x06\xcc\x06\ H\x06F\x06/\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04L\ ink\x07\x00\x00\x00\x0daddlink_\ ui_tr\x01\x03\x00\x00\x00\x1e\x06\xaf\x062\x06\ \xcc\x06F\x06G \x0c\x06G\x06'\x06\xcc\x00 \x06\ (\x06\xcc\x064\x06*\x061\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0cMore Options\x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x00\x1c\x064\x06E\x06'\x061\x00\ \x06'\x06*\x065\x06'\x06D \x0c\x06G\x06\ '\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Num\ ber of connectio\ ns:\x07\x00\x00\x00\x0daddlink_\ ui_tr\x01\x03\x00\x00\x00\x0a\x06*\x06'\x06\ \xcc\x06\xcc\x06/\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02O\ K\x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00\x0e\x06~\x06H\x061\x06\ *\x00 \x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x05Port:\x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x00\x0c\x06~\ \x061\x06'\x06\xa9\x063\x06\xcc\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x05Proxy\x07\x00\x00\x00\x0dad\ dlink_ui_tr\x01\x03\x00\x00\x00\ \x1e\x06\xaf\x060\x061\x06H\x06'\x06\x98\x06G\x00\ \x06~\x061\x06'\x06\xa9\x063\x06\xcc\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x10Proxy p\ assword: \x07\x00\x00\x00\x0dad\ dlink_ui_tr\x01\x03\x00\x00\x00\ $\x06F\x06'\x06E\x00 \x06\xa9\x06'\x061\x06\ (\x061\x06\xcc\x00 \x06~\x061\x06'\x06\xa9\x06\ 3\x06\xcc\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10P\ roxy username: \x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x002\x06'\x06\xcc\x06F\x00 \x06\ E\x063\x06\xcc\x061\x00 \x061\x06'\x00 \x06\ (\x06G\x00 \x06.\x06'\x067\x061\x00 \x06\ (\x063\x06~\x06'\x061\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x12Remember this\ path\x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x00\x0c\x00S\x00\ O\x00C\x00K\x00S\x005\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x06SOCKS5\x07\x00\x00\x00\x0dad\ dlink_ui_tr\x01\x03\x00\x00\x00\ \x12\x062\x06E\x06'\x06F\x00 \x064\x061\x06\ H\x069\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aSta\ rt time\x07\x00\x00\x00\x0daddl\ ink_ui_tr\x01\x03\x00\x00\x00&\x00\ <\x00b\x00>\x06F\x06'\x06E\x00 \x06~\x06\ 1\x06H\x06F\x06/\x06G\x00<\x00/\x00b\x00\ >\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x12<\ b>File name:\ \x07\x00\x00\x00\x18after_down\ load_src_ui_tr\x01\x03\ \x00\x00\x00$\x00<\x00b\x00>\x06-\x06,\x06E\ \x00 \x06~\x061\x06H\x06F\x06/\x06G\x00<\ \x00/\x00b\x00>\x00:\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0dSize: \x07\ \x00\x00\x00\x18after_downlo\ ad_src_ui_tr\x01\x03\x00\x00\ \x00\x0a\x06*\x06'\x06\xcc\x06\xcc\x06/\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x08 OK \x07\x00\ \x00\x00\x14after_downloa\ d_ui_tr\x01\x03\x00\x00\x00\x18\x06\xaf\x06\ 4\x06H\x06/\x06F\x00 \x06~\x061\x06H\x06\ F\x06/\x06G\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d \ Open File \x07\x00\x00\x00\ \x14after_download_\ ui_tr\x01\x03\x00\x00\x006\x00<\x00b\x00\ >\x06/\x06'\x06F\x06D\x06H\x06/\x00 \x06\ (\x06G\x00 \x06~\x06'\x06\xcc\x06'\x06F\x00\ \x061\x063\x06\xcc\x06/\x00<\x00/\x00b\x00\ >\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aDo\ wnload Completed\ !\x07\x00\x00\x00\x14after_\ download_ui_tr\x01\x03\ \x00\x00\x00\x1a\x00<\x00b\x00>\x06~\x06\xcc\x06H\ \x06F\x06/\x00<\x00/\x00b\x00>\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0dLink<\ /b>: \x07\x00\x00\x00\x14after_\ download_ui_tr\x01\x03\ \x00\x00\x00(\x00<\x00b\x00>\x060\x06.\x06\xcc\ \x061\x06G\x00 \x064\x06/\x06G\x00 \x06/\ \x061\x00<\x00/\x00b\x00>\x00:\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x10Save as\ : \x07\x00\x00\x00\x14after\ _download_ui_tr\x01\ \x03\x00\x00\x004\x06'\x06\xcc\x06F\x00 \x06~\x06\ \xcc\x06'\x06E\x00 \x061\x06'\x00 \x06/\x06\ \xcc\x06\xaf\x061\x00 \x06F\x064\x06'\x06F\x00\ \x06F\x06/\x06G\x00.\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x1eDon't show th\ is message again\ .\x07\x00\x00\x00\x14after_down\ load_ui_tr\x01\x03\x00\x00\x00\x22\ \x06\xaf\x064\x06H\x06/\x06F\x00 \x06~\x06H\ \x064\x06G\x00 \x06/\x06'\x06F\x06D\x06H\ \x06/\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Open\ Download Folder\ \x07\x00\x00\x00\x14after_downl\ oad_ui_tr\x01\x03\x00\x00\x00*\x06\ /\x06'\x06F\x06D\x06H\x06/\x00 \x06E\x06\ F\x06\xcc\x06,\x061\x00 \x06~\x061\x063\x06\ ~\x06H\x06D\x06\xcc\x063\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x1bPersepolis Do\ wnload Manager\x07\x00\ \x00\x00\x14after_downloa\ d_ui_tr\x01\x03\x00\x00\x00\x10\x06/\x06\ '\x06F\x06D\x06H\x06/\x06G\x06'\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x09Downloads\ \x07\x00\x00\x00\x10log_window_\ ui_tr\x01\x03\x00\x00\x00\x1e\x06.\x067\x06\ '\x06G\x06'\x00 \x06H\x00 \x06G\x064\x06\ /\x06'\x061\x06G\x06'\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x13Errors and wa\ rnings\x07\x00\x00\x00\x10log_w\ indow_ui_tr\x01\x03\x00\x00\x00\ 0\x06'\x067\x06D\x06'\x069\x06'\x06*\x00\ \x06H\x00 \x06/\x06'\x06/\x06G \x0c\x06\ G\x06'\x06\xcc\x00 \x06'\x06H\x06D\x06\xcc\x06\ G\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1eIniti\ alization and in\ formation\x07\x00\x00\x00\x10lo\ g_window_ui_tr\x01\x03\ \x00\x00\x00\x0a\x06\xaf\x062\x06'\x061\x064\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0cReport I\ ssue\x07\x00\x00\x00\x10log_win\ dow_ui_tr\x01\x03\x00\x00\x00\xf4\x00\ <\x00b\x00>\x00<\x00c\x00e\x00n\x00t\x00\ e\x00r\x00>\x06'\x06\xcc\x06F\x00 \x06~\x06\ \xcc\x06H\x06F\x06/\x00 \x06B\x06(\x06D\x06\ '\x00 \x06'\x066\x06'\x06A\x06G\x00 \x06\ 4\x06/\x06G\x00 \x06'\x063\x06*\x00 \x00\ !\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\ \x00 \x00 \x00 \x00 \x00 \x00 \x06\x22\x06\ \xcc\x06'\x00 \x06E\x067\x06E\x06&\x06F\x06\ \xcc\x06/\x00 \x06E\x06\xcc \x0c\x06.\x06H\x06\ '\x06G\x06\xcc\x06/\x00 \x06/\x06H\x06(\x06\ '\x061\x06G\x00 \x06\x22\x06F\x00 \x061\x06\ '\x00 \x06(\x06\xcc\x06'\x06A\x062\x06'\x06\ \xcc\x06\xcc\x06/\x00 \x06\x1f\x00<\x00/\x00c\x00\ e\x00n\x00t\x00e\x00r\x00>\x00<\x00/\x00\ b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00r\
This lin\ k has been added\ before! \ Are \ you sure you wan\ t to add it agai\ n?
\x07\ \x00\x00\x00\x14mainwindow_s\ rc_ui_tr\x01\x03\x00\x00\x00*\x00<\ \x00b\x00>\x06*\x069\x06/\x06'\x06/\x00 \ \x06'\x06*\x065\x06'\x06D\x00 \x06G\x06'\ \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x14Connections\ : \x07\x00\x00\x00\x14mainw\ indow_src_ui_tr\x01\ \x03\x00\x00\x00$\x00<\x00b\x00>\x06/\x06'\x06\ F\x06D\x06H\x06/\x00 \x064\x06/\x06G\x00\ :\x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x13Downloaded\ : \x07\x00\x00\x00\x14mainw\ indow_src_ui_tr\x01\ \x03\x00\x00\x00,\x00<\x00b\x00>\x062\x06E\x06\ '\x06F\x00 \x06(\x06'\x06B\x06\xcc\x06E\x06\ '\x06F\x06/\x06G\x00:\x00<\x00/\x00b\x00\ >\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1cEs\ timated time lef\ t: \x07\x00\x00\x00\x14main\ window_src_ui_tr\ \x01\x03\x00\x00\x00\x1a\x00<\x00b\x00>\x06B\x067\ \x069\x06'\x06*\x00<\x00/\x00b\x00>\x00:\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x12Fra\ gments: \x07\x00\x00\x00\ \x14mainwindow_src_\ ui_tr\x01\x03\x00\x00\x00\x1a\x00<\x00b\x00\ >\x06~\x06\xcc\x06H\x06F\x06/\x00<\x00/\x00\ b\x00>\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d<\ b>Link
: \x07\x00\x00\x00\ \x14mainwindow_src_\ ui_tr\x01\x03\x00\x00\x00\x1a\x00<\x00b\x00\ >\x06H\x066\x069\x06\xcc\x06*\x00:\x00<\x00\ /\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0f<\ b>Status: \x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x00\x18\x00<\x00\ b\x00>\x063\x061\x069\x06*\x00:\x00<\x00\ /\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16<\ b>Transfer rate<\ /b>: \x07\x00\x00\x00\x14mainwi\ ndow_src_ui_tr\x01\x03\ \x00\x00\x00(\x06/\x06'\x06F\x06D\x06H\x06/\ \x00 \x06(\x06G\x00 \x06~\x06'\x06\xcc\x06'\ \x06F\x00 \x061\x063\x06\xcc\x06/\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x11Download C\ omplete\x07\x00\x00\x00\x14main\ window_src_ui_tr\ \x01\x03\x00\x00\x00\x1c\x06/\x06'\x06F\x06D\x06H\ \x06/\x00 \x06\x22\x06:\x06'\x062\x00 \x064\ \x06/\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fDown\ load Starts\x07\x00\x00\x00\x14\ mainwindow_src_u\ i_tr\x01\x03\x00\x00\x00\x1e\x06/\x06'\x06F\ \x06D\x06H\x06/\x00 \x06E\x06*\x06H\x06B\ \x06A\x00 \x064\x06/\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x10Download Stopp\ ed\x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ \x0c\x06.\x067\x06'\x00 \x00-\x00 \x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x08Error - \x07\ \x00\x00\x00\x14mainwindow_s\ rc_ui_tr\x01\x03\x00\x00\x00\x08\x06.\ \x067\x06'\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07\ Error: \x07\x00\x00\x00\x14main\ window_src_ui_tr\ \x01\x03\x00\x00\x006\x06A\x066\x06'\x06\xcc\x00 \ \x06.\x06'\x06D\x06\xcc\x00 \x06\xa9\x06'\x06A\ \x06\xcc\x00 \x06H\x06,\x06H\x06/\x00 \x06F\ \x06/\x06'\x061\x06/\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x19Not enough\ free space in:\x07\ \x00\x00\x00\x14mainwindow_s\ rc_ui_tr\x01\x03\x00\x00\x00$\x069\ \x06E\x06D\x06\xcc\x06'\x06*\x00 \x06F\x06'\ \x06E\x06H\x06A\x06B\x00 \x06(\x06H\x06/\ \x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1dOper\ ation was not su\ ccessful.\x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00:\x06D\x067\x06A\x06'\ \x00 \x06'\x06\xcc\x06F\x00 \x06/\x063\x06*\ \x06G\x00 \x061\x06'\x00 \x06'\x06/\x06'\ \x06E\x06G\x00 \x06/\x06G\x06\xcc\x06/\x00:\ \x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00&Plea\ se resume the fo\ llowing category\ : \x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ @\x06D\x067\x06A\x06'\x00 \x06~\x061\x06\ 3\x06~\x06H\x06D\x06\xcc\x063\x00 \x061\x06\ '\x00 \x06(\x061\x06H\x062\x061\x063\x06\ '\x06F\x06\xcc\x00 \x06\xa9\x06F\x06\xcc\x06/\x00\ .\x08\x00\x00\x00\x00\x06\x00\x00\x00\x19Pleas\ e update Persepo\ lis.\x07\x00\x00\x00\x14mainwin\ dow_src_ui_tr\x01\x03\x00\ \x00\x00\x18\x06.\x067\x06'\x06\xcc\x06\xcc\x00 \x06\ 1\x06.\x00 \x06/\x06'\x06/\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x11an error oc\ curred\x07\x00\x00\x00\x14mainw\ indow_src_ui_tr\x01\ \x03\x00\x00\x00\x12\x06.\x067\x06'\x06\xcc\x00 \x06\ E\x06\xcc\x06\xa9\x063\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0cmuxing error\x07\x00\x00\ \x00\x14mainwindow_src\ _ui_tr\x01\x03\x00\x00\x00\x14\x06(\x06'\ \x061\x06\xaf\x06\xcc\x061\x06\xcc\x00 \x064\x06/\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0b downl\ oaded\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x004\ \x00<\x00b\x00>\x06H\x066\x069\x06\xcc\x06*\ \x00 \x06~\x061\x06H\x06F\x06/\x06G\x00 \ \x065\x06/\x06'\x00:\x00 \x00<\x00/\x00b\ \x00>\x00,\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aAudio File Stat\ us: \x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x004\x00<\x00b\x00>\x06H\x066\x069\x06\ \xcc\x06*\x00 \x06~\x061\x06H\x06F\x06/\x06\ G\x00 \x065\x06/\x06'\x00:\x00 \x00<\x00\ /\x00b\x00>\x00,\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1aAudio file s\ tatus: \x07\x00\x00\x00\x10\ mainwindow_ui_tr\ \x01\x03\x00\x00\x00&\x00<\x00b\x00>\x06H\x066\ \x069\x06\xcc\x06*\x00 \x06E\x06\xcc\x06\xa9\x063\ \x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x16Mixing \ status: \x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00&\x00<\x00b\x00>\x06H\x06\ 6\x069\x06\xcc\x06*\x00 \x06E\x06\xcc\x06\xa9\x06\ 3\x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x16Muxing\ status: \x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00\x1c\x00<\x00b\x00>\x06H\ \x066\x069\x06\xcc\x06*\x00:\x00 \x00<\x00/\ \x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fStatus: \x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x002\x00<\x00b\x00>\x06H\ \x066\x069\x06\xcc\x06*\x00 \x06~\x061\x06H\ \x06F\x06/\x06G\x00 \x06H\x06\xcc\x06/\x06&\ \x06H\x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1aVideo Fil\ e Status: \x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x002\x00<\x00b\x00>\x06\ H\x066\x069\x06\xcc\x06*\x00 \x06~\x061\x06\ H\x06F\x06/\x06G\x00 \x06H\x06\xcc\x06/\x06\ &\x06H\x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x1aVideo fi\ le status: \x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x01*\x00<\x00h\x00t\ \x00m\x00l\x00>\x00<\x00h\x00e\x00a\x00d\ \x00/\x00>\x00<\x00b\x00o\x00d\x00y\x00>\ \x00<\x00p\x00>\x06'\x06\xcc\x06F\x00 \x06\xaf\ \x062\x06\xcc\x06F\x06G\x00 \x06'\x062\x00 \ \x06(\x06G\x00 \x06.\x06H\x06'\x06(\x00 \ \x061\x06A\x06*\x06F\x00 \x063\x06\xcc\x063\ \x06*\x06E\x00 \x06,\x06D\x06H\x06\xaf\x06\xcc\ \x061\x06\xcc\x00 \x06E\x06\xcc \x0c\x06\xa9\x06F\ \x06/\x00\x0a\x06'\x06\xcc\x06F\x00 \x06\xaf\x062\ \x06\xcc\x06F\x06G\x00 \x06'\x06\xaf\x061\x00 \ \x063\x06\xcc\x063\x06*\x06E\x00 \x064\x06E\ \x06'\x00 \x06(\x065\x06H\x061\x06*\x00 \ \x06.\x06H\x06/\x06\xa9\x06'\x061\x00 \x06(\ \x06G\x00 \x06.\x06H\x06'\x06(\x00 \x06E\ \x06\xcc\x00 \x061\x06H\x06/\x00 \x066\x061\ \x06H\x061\x06\xcc\x00 \x06'\x063\x06*\x00.\ \x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00o\ \x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\ \x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\xba

This option \ will prevent the\ system from goi\ ng to sleep. \ It is ne\ cessary if your \ power manager is\ suspending the \ system automatic\ ally.

\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00,\x06'\x06A\x062\x06H\x06/\x06F\x00\ \x06~\x06\xcc\x06H\x06F\x06/\x00 \x06/\x06\ '\x06F\x06D\x06H\x06/\x00 \x06F\x06H\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x15Add New\ Download Link\x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00\x18\x06~\x063\x00 \x06\ '\x062\x00 \x06/\x06'\x06F\x06D\x06H\x06\ /\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0eAfter\ download\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00\x0a\x06'\x069\x06E\x06'\x06D\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x05Apply\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x000\x06'\x06(\x06*\x06/\ \x06'\x06\xcc\x00 \x06A\x06G\x061\x063\x06*\ \x00 \x061\x06'\x00\x0a\x06/\x06'\x06F\x06D\ \x06H\x06/\x06\xa9\x06F\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x22Download botto\ m of\x0a the list f\ irst\x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00\x14\x06\ 2\x06E\x06'\x06F\x00 \x06~\x06'\x06\xcc\x06\ '\x06F\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08End\ Time\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00\x08\ \x06.\x061\x06H\x06,\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x04Exit\x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ \x1c\x06\xaf\x062\x06\xcc\x06F\x06G \x0c\x06G\x06\ '\x06\xcc\x00 \x06E\x06.\x06A\x06\xcc\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0cHide Opti\ ons\x07\x00\x00\x00\x10mainwind\ ow_ui_tr\x01\x03\x00\x00\x00,\x063\ \x06\xcc\x063\x06*\x06E\x00 \x061\x06'\x00 \ \x061\x06H\x064\x06F\x00 \x06F\x06\xaf\x06G\ \x0c\x06/\x06'\x061\x00!\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x12Keep System \ Awake!\x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ 8\x06A\x061\x063\x06*\x06'\x06/\x06F\x00\ \x06(\x061\x06F\x06'\x06E\x06G\x00 \x06\ (\x06G\x00 \x063\x06\xcc\x06F\x06\xcc\x00 \x06\ F\x06E\x06'\x06\xcc\x06G\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x17Minimize to S\ ystem Tray\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x00\x1a\x06E\x06\xa9\x06+\x00 \x06/\x06\ 1\x00 \x06/\x06'\x06F\x06D\x06H\x06/\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0ePause D\ ownload\x07\x00\x00\x00\x10main\ window_ui_tr\x01\x03\x00\x00\ \x00*\x06/\x06'\x06F\x06D\x06H\x06/\x00 \ \x06E\x06F\x06\xcc\x06,\x061\x00 \x06~\x061\ \x063\x06~\x06H\x06D\x06\xcc\x063\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x1bPersepolis\ Download Manage\ r\x07\x00\x00\x00\x10mainwindow\ _ui_tr\x01\x03\x00\x00\x00\x0c\x06~\x06\xcc\ \x064\x061\x06A\x06*\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x08Progress\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x00\x10\x06H\x06\xcc\x06\x98\x06\xaf\x06\xcc\x00\ \x06G\x06'\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aP\ roperties\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00\x18\x06'\x06/\x06'\x06E\x06G\x00 \ \x06/\x06'\x06F\x06D\x06H\x06/\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0fResume Dow\ nload\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00F\ \x06F\x06E\x06'\x06\xcc\x064\x00/\x069\x06/\ \x06E\x00 \x06F\x06E\x06'\x06\xcc\x064\x00 \ \x06F\x06E\x06'\x06\xcc\x06G\x00 \x06/\x061\ \x00 \x063\x06\xcc\x06F\x06\xcc\x00 \x063\x06\xcc\ \x063\x06*\x06E\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1a\ Show/Hide system\ tray icon\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x00\x16\x06.\x06'\x06E\x06H\x064\x00\ \x0c\x06\xa9\x061\x06/\x06F\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x09Shut Down\x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00\x12\x064\x061\x06H\x06\ 9\x00 \x06E\x06\xcc\x06\xa9\x063\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0cStart Mixin\ g\x07\x00\x00\x00\x10mainwindow\ _ui_tr\x01\x03\x00\x00\x00\x12\x062\x06E\ \x06'\x06F\x00 \x064\x061\x06H\x069\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0aStart Ti\ me\x07\x00\x00\x00\x10mainwindo\ w_ui_tr\x01\x03\x00\x00\x00\x22\x06*\x06\ H\x06B\x06A\x00 \x06H\x00 \x06D\x06:\x06\ H\x00 \x06/\x06'\x06F\x06D\x06H\x06/\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x14Stop/Ca\ ncel Download\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00\x18\x06~\x063\x00 \x06'\ \x062\x00 \x06/\x06'\x06F\x06D\x06H\x06/\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0eAfter \ download\x07\x00\x00\x00\x0epro\ gress_ui_tr\x01\x03\x00\x00\x00\ \x0a\x06'\x069\x06E\x06'\x06D\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x05Apply\x07\x00\x00\x00\x0ep\ rogress_ui_tr\x01\x03\x00\ \x00\x00\x1c\x06'\x067\x06D\x06'\x069\x06'\x06\ *\x00 \x06/\x06'\x06F\x06D\x06H\x06/\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x14Downloa\ d Information\x07\x00\x00\ \x00\x0eprogress_ui_tr\ \x01\x03\x00\x00\x00 \x06\xaf\x062\x06\xcc\x06F\x06G\ \x0c\x06G\x06'\x06\xcc\x00 \x06/\x06'\x06F\ \x06D\x06H\x06/\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10\ Download Options\ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00\x16\x06/\x06'\x06F\x06\ D\x06H\x06/\x00 \x064\x06/\x06G\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0bDownloa\ ded:\x07\x00\x00\x00\x0eprogres\ s_ui_tr\x01\x03\x00\x00\x00\x1e\x062\x06\ E\x06'\x06F\x00 \x06(\x06'\x06B\x06\xcc\x06\ E\x06'\x06F\x06/\x06G\x00:\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x14Estimated t\ ime left:\x07\x00\x00\x00\x0epr\ ogress_ui_tr\x01\x03\x00\x00\ \x00\x0c\x06~\x06\xcc\x06H\x06F\x06/\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x06Link: \x07\x00\ \x00\x00\x0eprogress_ui_t\ r\x01\x03\x00\x00\x00\x1c\x06*\x069\x06/\x06'\x06\ /\x00 \x06'\x06*\x065\x06'\x06D\x06'\x06\ *\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x17Num\ ber of connectio\ ns: \x07\x00\x00\x00\x0eprogres\ s_ui_tr\x01\x03\x00\x00\x00\x08\x06/\x06\ 1\x06F\x06\xaf\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05P\ ause\x07\x00\x00\x00\x0eprogres\ s_ui_tr\x01\x03\x00\x00\x00*\x06/\x06\ '\x06F\x06D\x06H\x06/\x00 \x06E\x06F\x06\ \xcc\x06,\x061\x00 \x06~\x061\x063\x06~\x06\ H\x06D\x06\xcc\x063\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1bPersepolis Down\ load Manager\x07\x00\x00\x00\ \x0eprogress_ui_tr\x01\ \x03\x00\x00\x00\x0a\x06'\x06/\x06'\x06E\x06G\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x06Resume\x07\ \x00\x00\x00\x0eprogress_ui_\ tr\x01\x03\x00\x00\x00\x14\x06.\x06'\x06E\x06H\ \x064\x00 \x06\xa9\x061\x06/\x06F\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x09Shut Down\x07\ \x00\x00\x00\x0eprogress_ui_\ tr\x01\x03\x00\x00\x00\x0c\x06H\x066\x069\x06\xcc\ \x06*\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08St\ atus: \x07\x00\x00\x00\x0eprogr\ ess_ui_tr\x01\x03\x00\x00\x00\x08\x06\ *\x06H\x06B\x06A\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x04Stop\x07\x00\x00\x00\x0eprogre\ ss_ui_tr\x01\x03\x00\x00\x00\x0a\x063\ \x061\x069\x06*\x00:\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0fTransfer rate:\ \x07\x00\x00\x00\x0eprogress_u\ i_tr\x01\x03\x00\x00\x00\xa6\x00<\x00b\x00>\ \x00<\x00c\x00e\x00n\x00t\x00e\x00r\x00>\ \x06'\x06\xcc\x06F\x00 \x06E\x06\xcc\x06'\x06F\ \x06(\x061\x00 \x06B\x06(\x06D\x06'\x00 \ \x06'\x063\x06*\x06A\x06'\x06/\x06G\x00 \ \x064\x06/\x06G\x00 \x06'\x063\x06*\x00!\ \x00 \x06E\x06\xcc\x06'\x06F\x06(\x061\x00 \ \x06/\x06\xcc\x06\xaf\x061\x06\xcc\x00 \x06'\x063\ \x06*\x06A\x06'\x06/\x06G\x00 \x06\xa9\x06F\ \x06\xcc\x06/\x00!\x00<\x00/\x00c\x00e\x00n\ \x00t\x00e\x00r\x00>\x00<\x00/\x00b\x00>\ \x08\x00\x00\x00\x00\x06\x00\x00\x00_This shortc\ ut has been used\ before! \ Use \ another one!\x07\x00\x00\x00\x11se\ tting_src_ui_tr\x01\ \x03\x00\x00\x00n\x00<\x00h\x00t\x00m\x00l\x00\ >\x00<\x00h\x00e\x00a\x00d\x00/\x00>\x00\ <\x00b\x00o\x00d\x00y\x00>\x00<\x00p\x00\ >\x06B\x06'\x06D\x06(\x00 \x063\x06'\x06\ 9\x06*\x00:\x06/\x06B\x06\xcc\x06B\x06G\x00\ <\x00/\x00p\x00>\x00<\x00/\x00b\x00o\x00\ d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\x00\ l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x004\

Format HH:MM<\ /p>\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\xac\x00<\x00h\x00t\x00\ m\x00l\x00>\x00<\x00h\x00e\x00a\x00d\x00\ /\x00>\x00<\x00b\x00o\x00d\x00y\x00>\x00\ <\x00p\x00>\x06*\x069\x06/\x06'\x06/\x00\ \x06*\x06D\x06'\x064 \x0c\x06G\x06'\x00\ \x06~\x063\x00 \x06'\x062\x00 \x06.\x06\ 7\x06'\x00 \x06/\x061\x00 \x06/\x06'\x06\ F\x06D\x06H\x06/\x00 \x061\x06'\x00 \x06\ E\x064\x06.\x065\x00 \x06\xa9\x06F\x06\xcc\x06\ /\x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00\ o\x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00\ m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00Q<\ html>

Set number \ of retries if do\ wnload failed.\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x80\x00<\x00h\x00t\x00m\ \x00l\x00>\x00<\x00h\x00e\x00a\x00d\x00/\ \x00>\x00<\x00b\x00o\x00d\x00y\x00>\x00<\ \x00p\x00>\x062\x06E\x06'\x06F\x00 \x06H\ \x06B\x06A\x06G\x00 \x061\x06'\x00 \x06E\ \x064\x06.\x065\x00 \x06\xa9\x06F\x06\xcc\x06/\ \x00.\x00 \x00<\x00/\x00p\x00>\x00<\x00/\ \x00b\x00o\x00d\x00y\x00>\x00<\x00/\x00h\ \x00t\x00m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\ \x00P<\ body>

Set the \ seconds to wait \ between retries.\

\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x80\x00<\x00h\x00t\ \x00m\x00l\x00>\x00<\x00h\x00e\x00a\x00d\ \x00/\x00>\x00<\x00b\x00o\x00d\x00y\x00>\ \x00<\x00p\x00>\x062\x06E\x06'\x06F\x00 \ \x06H\x06B\x06A\x06G\x00 \x061\x06'\x00 \ \x06E\x064\x06.\x065\x00 \x06\xa9\x06F\x06\xcc\ \x06/\x00.\x00 \x00<\x00/\x00p\x00>\x00<\ \x00/\x00b\x00o\x00d\x00y\x00>\x00<\x00/\ \x00h\x00t\x00m\x00l\x00>\x08\x00\x00\x00\x00\x06\ \x00\x00\x00@

Set ti\ meout in seconds\ .

\x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\xb4\x00<\x00h\ \x00t\x00m\x00l\x00>\x00<\x00h\x00e\x00a\ \x00d\x00/\x00>\x00<\x00b\x00o\x00d\x00y\ \x00>\x00<\x00p\x00>\x06(\x061\x06F\x06'\ \x06E\x06G\x00 \x06(\x065\x06H\x061\x06*\ \x00 \x06.\x06H\x06/\x06\xa9\x06'\x061\x00 \ \x06\xa9\x06D\x06\xcc\x06~ \x0c\x06(\x06H\x061\ \x06/\x00 \x061\x06'\x00 \x06(\x061\x06'\ \x06\xcc\x00 \x06~\x06\xcc\x06H\x06F\x06/\x06G\ \x06'\x06\xcc\x00 \x06\xa9\x06~\x06\xcc \x0c\x064\ \x06/\x06G\x00 \x06(\x061\x061\x063\x06\xcc\ \x00 \x06E\x06\xcc \x0c\x06\xa9\x06F\x06/\x00.\ \x08\x00\x00\x00\x00\x06\x00\x00\x00x\

\ The program will\ automatically c\ heck the clipboa\ rd for copied li\ nks. \

\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\xa4\x00<\x00h\x00t\ \x00m\x00l\x00>\x00<\x00h\x00e\x00a\x00d\ \x00/\x00>\x00<\x00b\x00o\x00d\x00y\x00>\ \x00<\x00p\x00>\x06'\x06\xcc\x06F\x00 \x06H\ \x06\xcc\x06\x98\x06\xaf\x06\xcc\x00 \x064\x06'\x06\xcc\ \x06/\x00 \x06/\x061\x00 \x063\x06\xcc\x063\ \x06*\x06E\x00 \x069\x06'\x06E\x06D\x00 \ \x064\x06E\x06'\x00 \x06\xa9\x06'\x061\x00 \ \x06F\x06\xa9\x06F\x06/\x00.\x00<\x00/\x00p\ \x00>\x00<\x00/\x00b\x00o\x00d\x00y\x00>\ \x00<\x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\ \x00\x00\x00\x06\x00\x00\x00[

Th\ is feature may n\ ot work in your \ operating system\ .

\x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x01\x02\x00<\x00h\x00\ t\x00m\x00l\x00>\x00<\x00h\x00e\x00a\x00\ d\x00/\x00>\x00<\x00b\x00o\x00d\x00y\x00\ >\x00<\x00p\x00>\x06'\x06\xcc\x06F\x00 \x06\ \xaf\x062\x06\xcc\x06F\x06G\x00 \x06'\x062\x00\ \x06G\x06F\x06/\x064\x06\xcc\x06\xa9\x00 \x06\ F\x06'\x06E\x06H\x06A\x06B\x00 \x00S\x00\ S\x00L\x00/\x00T\x00L\x00S\x00 \x06,\x06\ D\x06H\x06\xaf\x06\xcc\x061\x06\xcc\x00 \x06E\x06\ \xcc \x0c\x06\xa9\x06F\x06/\x06\x0c\x00 \x06'\x06\ E\x06'\x00 \x06(\x06'\x00 \x06E\x063\x06\ &\x06H\x06D\x06\xcc\x06*\x00 \x06.\x06H\x06\ /\x00 \x06'\x062\x00 \x06\x22\x06F\x00 \x06\ '\x063\x06*\x06A\x06'\x06/\x06G\x00 \x06\ \xa9\x06F\x06\xcc\x06/\x00 \x00<\x00/\x00p\x00\ >\x00<\x00/\x00b\x00o\x00d\x00y\x00>\x00\ <\x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00r

Thi\ s option avoids \ SSL/TLS handshak\ e failure. But u\ se it at your ow\ n risk!

\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x01\ *\x00<\x00h\x00t\x00m\x00l\x00>\x00<\x00\ h\x00e\x00a\x00d\x00/\x00>\x00<\x00b\x00\ o\x00d\x00y\x00>\x00<\x00p\x00>\x06'\x06\ \xcc\x06F\x00 \x06\xaf\x062\x06\xcc\x06F\x06G\x00\ \x06'\x062\x00 \x06(\x06G\x00 \x06.\x06\ H\x06'\x06(\x00 \x061\x06A\x06*\x06F\x00\ \x063\x06\xcc\x063\x06*\x06E\x00 \x06,\x06\ D\x06H\x06\xaf\x06\xcc\x061\x06\xcc\x00 \x06E\x06\ \xcc \x0c\x06\xa9\x06F\x06/\x00\x0a\x06'\x06\xcc\x06\ F\x00 \x06\xaf\x062\x06\xcc\x06F\x06G\x00 \x06\ '\x06\xaf\x061\x00 \x063\x06\xcc\x063\x06*\x06\ E\x00 \x064\x06E\x06'\x00 \x06(\x065\x06\ H\x061\x06*\x00 \x06.\x06H\x06/\x06\xa9\x06\ '\x061\x00 \x06(\x06G\x00 \x06.\x06H\x06\ '\x06(\x00 \x06E\x06\xcc\x00 \x061\x06H\x06\ /\x00 \x066\x061\x06H\x061\x06\xcc\x00 \x06\ '\x063\x06*\x00.\x00<\x00/\x00p\x00>\x00\ <\x00/\x00b\x00o\x00d\x00y\x00>\x00<\x00\ /\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\xba

This \ option will prev\ ent the system f\ rom going to sle\ ep. I\ t is necessary i\ f your power man\ ager is suspendi\ ng the system au\ tomatically. \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00\xc4\x00<\x00h\x00t\x00m\x00\ l\x00>\x00<\x00h\x00e\x00a\x00d\x00/\x00\ >\x00<\x00b\x00o\x00d\x00y\x00>\x00<\x00\ p\x00>\x06'\x063\x06*\x06A\x06'\x06/\x06\ G\x00 \x06'\x062\x00 \x06\x86\x06F\x06/\x00\ \x06'\x06*\x065\x06'\x06D\x00 \x06E\x06\ \xcc \x0c\x06*\x06H\x06'\x06F\x06/\x00 \x06\ (\x06G\x00 \x063\x061\x069\x06*\x00 \x06\ /\x06'\x06F\x06D\x06H\x06/\x00 \x064\x06\ E\x06'\x00 \x06\xa9\x06E\x06\xa9\x00 \x06\xa9\x06\ F\x06/\x00.\x00.\x00<\x00/\x00p\x00>\x00\ <\x00/\x00b\x00o\x00d\x00y\x00>\x00<\x00\ /\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\x00\x00\ \x06\x00\x00\x00c

Using\ multiple connec\ tions can help s\ peed up your dow\ nload.

\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x01\x04\ \x00<\x00h\x00t\x00m\x00l\x00>\x00<\x00h\ \x00e\x00a\x00d\x00/\x00>\x00<\x00b\x00o\ \x00d\x00y\x00>\x00<\x00p\x00>\x06~\x063\ \x00 \x06'\x062\x00 \x06'\x061\x063\x06'\ \x06D\x00 \x06/\x061\x06.\x06H\x06'\x063\ \x06*\x00 \x06/\x06'\x06F\x06D\x06H\x06/\ \x00 \x06'\x062\x00 \x06'\x06A\x062\x06H\ \x06F\x06G\x00 \x06E\x061\x06H\x061\x06\xaf\ \x061\x06\x0c\x00 \x06/\x06'\x06F\x06D\x06H\ \x06/\x00 \x06(\x06/\x06H\x06F\x00 \x06F\ \x06E\x06'\x06\xcc\x064\x00 \x06~\x06F\x06,\ \x061\x06G\x00 \x00A\x00d\x00d\x00 \x00L\ \x00i\x00n\x00k\x00 \x064\x061\x06H\x069\ \x00 \x06E\x06\xcc\x00 \x064\x06H\x06/\x00.\ \x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00o\ \x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\ \x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\xac

When a downl\ oad request is s\ ent from the bro\ wser extension, \ the download wil\ l start without \ showing the Add \ Link window. \

\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x06\x06D\x06:\x06H\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x06Cancel\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00\x0a\ \x06*\x06:\x06\xcc\x06\xcc\x061\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x06Change\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00J\x06(\x061\x061\x063\x06\xcc\x00 \x06\xa9\ \x06D\x06\xcc\x06~ \x0c\x06(\x06H\x061\x06/\ \x00 \x06(\x061\x06'\x06\xcc\x00 \x06~\x06\xcc\ \x06H\x06F\x06/\x06G\x06'\x06\xcc\x00 \x06\xa9\ \x06~\x06\xcc \x0c\x064\x06/\x06G\x08\x00\x00\x00\ \x00\x06\x00\x00\x00'Check syst\ em clipboard for\ copied links\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00.\x06'\x06F\x06/\x06'\x062\x06\ G\x00 \x06B\x067\x069\x06G\x00 \x00(\x06\ \xa9\x06\xcc\x06D\x06H\x06(\x06'\x06\xcc\x06*\x00\ )\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Chu\ nk size(KiB): \x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00\x14\x063\x06'\x06.\x06*\x06'\ \x061\x00 \x061\x06F\x06\xaf\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0eColor scheme\ : \x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x22\x064\x06.\x065\ \x06\xcc \x0c\x063\x06'\x062\x06\xcc\x00 \x063\ \x06*\x06H\x06F \x0c\x06G\x06'\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x15Columns Cu\ stomization\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x82\x06(\x061\x06'\x06\xcc\x00 \x06H\x06\ \xcc\x06/\x06&\x06H\x00 \x06\x0c\x00 \x06E\x06\ H\x063\x06\xcc\x06B\x06\xcc\x00 \x06H\x00.\x00\ .\x00.\x00 \x06/\x061\x00 \x06~\x06H\x06\ 4\x06G\x00 \x06~\x06\xcc\x064\x06A\x061\x06\ 6\x00 \x06/\x06'\x06F\x06D\x06H\x06/\x00\ \x06~\x06H\x064\x06G \x0c\x06G\x06'\x06\ \xcc\x00 \x06E\x06,\x062\x06'\x00 \x06(\x06\ 3\x06'\x062\x08\x00\x00\x00\x00\x06\x00\x00\x00BC\ reate subfolders\ for Music,Video\ s, ... in defaul\ t download folde\ r\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x0c\x06~\x06\xcc\x064\x06\ A\x061\x066\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08D\ efaults\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00R\x06\ '\x062\x00 \x06\xaf\x06H\x06'\x06G\x06\xcc\x00\ \x06(\x061\x06'\x06\xcc\x00 \x06*\x06#\x06\ \xcc\x06\xcc\x06/\x00 \x06G\x06E\x06*\x06'\x06\ \xcc\x06'\x06F\x00 \x06'\x063\x06*\x06A\x06\ '\x06/\x06G\x00 \x06F\x06\xa9\x06F\x06\xcc\x06\ /\x08\x00\x00\x00\x00\x06\x00\x00\x00)Don't\ use certificate\ to verify the p\ eers\x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00 \x06\xaf\x062\ \x06\xcc\x06F\x06G \x0c\x06G\x06'\x06\xcc\x00 \ \x06/\x06'\x06F\x06D\x06H\x06/\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x10Download O\ ptions\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x1a\x06~\ \x06H\x064\x06G\x00 \x06/\x06'\x06F\x06D\ \x06H\x06/\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x11Download folde\ r: \x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00d\x06/\x061\x06\ .\x06H\x06'\x063\x06*\x00 \x06G\x06'\x06\ \xcc\x00 \x06/\x06'\x06F\x06D\x06H\x06/\x00\ \x06'\x062\x00 \x06E\x061\x06H\x061\x06\ \xaf\x061\x00 \x06(\x06D\x06'\x06A\x06'\x06\ 5\x06D\x06G\x00 \x06'\x06,\x061\x06'\x00\ \x06E\x06\xcc\x00 \x064\x06H\x06/\x00.\x08\ \x00\x00\x00\x00\x06\x00\x00\x00@Downloa\ d requests from \ the browser will\ be executed imm\ ediately.\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ 0\x06A\x069\x06'\x06D\x00 \x06\xa9\x061\x06\ /\x06F\x00 \x065\x06/\x06'\x06\xcc\x00 \x06\ \x22\x06\xaf\x06'\x06G \x0c\x063\x06'\x062\x06\ \xcc\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aEnabl\ e Notification S\ ounds\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00:\x06A\x06\ 9\x06'\x06D\x00 \x06\xa9\x061\x06/\x06F\x00\ \x06F\x06E\x06'\x06\xcc\x06G\x00 \x06/\x06\ 1\x00 \x063\x06\xcc\x06F\x06\xcc\x00 \x06F\x06\ E\x06'\x06\xcc\x06G\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x17Enable system t\ ray icon\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00\x0a\ \x06A\x06H\x06F\x06*\x00:\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x06Font: \x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00V\x06E\x06.\x06A\x06\xcc\x00 \x06\xa9\x061\ \x06/\x06F\x00 \x06~\x06F\x06,\x061\x06G\ \x00 \x06'\x065\x06D\x06\xcc\x00 \x06G\x06F\ \x06\xaf\x06'\x06E\x00 \x06'\x06F\x06*\x06.\ \x06'\x06(\x00 \x06/\x06\xa9\x06E\x06G\x00 \ \x06(\x063\x06*\x06F\x08\x00\x00\x00\x00\x06\x00\x00\ \x00)Hide main wind\ ow if close butt\ on clicked.\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x0a\x06\x22\x06\xcc\x06\xa9\x06F\x00:\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x07Icons: \x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00\xb8\x06'\x06\xcc\x06F\x00 \x06'\ \x06F\x06/\x06'\x062\x06G\x00 \x06B\x067\ \x069\x06G\x00 \x06/\x061\x00 \x06\xa9\x06*\ \x06'\x06(\x06.\x06'\x06F\x06G\x00 \x00r\ \x00e\x00q\x00u\x00e\x00s\x00t\x00s\x00 \ \x06~\x06'\x06\xcc\x06*\x06H\x06F\x00 \x06'\ \x063\x06*\x00.\x00 \x06'\x06\xaf\x061\x00 \ \x06(\x06'\x00 \x06\x22\x06F\x00 \x06\x22\x064\ \x06F\x06'\x06\xcc\x06\xcc\x00 \x06F\x06/\x06'\ \x061\x06\xcc\x06/\x06\x0c\x00 \x06\x22\x06F\x00 \ \x061\x06'\x00 \x06*\x06:\x06\xcc\x06\xcc\x061\ \x00 \x06F\x06/\x06G\x06\xcc\x06/\x00.\x08\x00\ \x00\x00\x00\x06\x00\x00\x00]It is py\ thon requests li\ brary chunk size\ . Do not change \ this If you are \ not familiar wit\ h it.\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00,\x063\x06\ \xcc\x063\x06*\x06E\x00 \x061\x06'\x00 \x06\ 1\x06H\x064\x06F\x00 \x06F\x06\xaf\x06G \ \x0c\x06/\x06'\x061\x00!\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x12Keep system a\ wake!\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x0a\x062\x06\ (\x06'\x06F\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0aLanguage: \x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x1a\x06F\x06H\x069\x00 \x06\x22\x06\xaf\x06\ '\x06G \x0c\x063\x06'\x062\x06\xcc\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x13Notificat\ ion type: \x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x18\x06\x22\x06\xaf\x06'\x06G \x0c\x063\x06'\ \x062\x06\xcc\x00 \x06G\x06'\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0dNotification\ s\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x1c\x06*\x069\x06/\x06\ '\x06/\x00 \x06'\x06*\x065\x06'\x06D\x06\ '\x06*\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x17N\ umber of connect\ ions: \x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00,\x06*\ \x069\x06/\x06'\x06/\x00 \x06*\x06D\x06'\ \x064\x00 \x06G\x06'\x06\xcc\x00 \x06/\x06H\ \x06(\x06'\x061\x06G\x00:\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x11Number of tr\ ies: \x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x0a\x06*\x06\ '\x06\xcc\x06\xcc\x06/\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x02OK\x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00\x12\x064\x06.\x06\ 5\x06\xcc \x0c\x063\x06'\x062\x06\xcc\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0bPreferenc\ es\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x000\x06\xa9\x06D\x06\xcc\ \x06/\x06G\x06'\x06\xcc\x00 \x06,\x06/\x06\xcc\ \x06/\x06\xcc\x00 \x061\x06'\x00 \x06(\x06A\ \x064\x06'\x061\x06\xcc\x06/\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0ePress new ke\ ys\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00:\x06'\x06,\x061\ \x06'\x06\xcc\x00 \x06~\x061\x063\x06~\x06H\ \x06D\x06\xcc\x063\x00 \x06/\x061\x00 \x06'\ \x06(\x06*\x06/\x06'\x06\xcc\x00 \x06F\x064\ \x063\x06*\x08\x00\x00\x00\x00\x06\x00\x00\x00\x19Ru\ n Persepolis at \ startup\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x10\x06\ 0\x06.\x06\xcc\x061\x06G\x00 \x06/\x061\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x07Save As\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x10\x06E\x06\xcc\x06'\x06F\ \x06(\x061\x06G\x06'\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x09Shortcuts\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00V\x06F\x06E\x06'\x06\xcc\x064\x00 \x06\ ~\x06F\x06,\x061\x06G\x00 \x06~\x06'\x06\ \xcc\x06'\x06F\x00 \x06/\x06'\x06F\x06D\x06\ H\x06/\x00 \x06~\x063\x00 \x06'\x062\x00\ \x06'\x06*\x06E\x06'\x06E\x00 \x06/\x06\ '\x06F\x06D\x06H\x06/\x08\x00\x00\x00\x00\x06\x00\ \x00\x007Show download\ complete dialog\ when download i\ s finished\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x002\x06F\x06E\x06'\x06\xcc\x064\x00 \x06~\ \x06F\x06,\x061\x06G\x00 \x06~\x06\xcc\x064\ \x061\x06A\x06*\x00 \x06/\x06'\x06F\x06D\ \x06H\x06/\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1dSh\ ow download prog\ ress window\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x18\x06F\x06E\x06'\x06\xcc\x064\x00 \x06\ E\x06F\x06H\x06(\x06'\x061\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0cShow menuba\ r\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x1e\x06F\x06E\x06'\x06\ \xcc\x064\x00 \x06~\x06F\x06D\x00 \x06\xa9\x06\ F\x06'\x061\x06\xcc\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0fShow side panel\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x12\x06'\x06F\x06/\x06'\ \x062\x06G\x00 \x00: \x0c\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x06Size: \x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x0a\x06H\x066\x069\x06\xcc\x06*\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x06Status\x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x06\x063\x06(\x06\xa9\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x07Style: \x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00&\x06H\x06B\x06A\x06G\x00 \x062\x06\ E\x06'\x06F\x06\xcc\x00 \x00(\x06+\x06'\x06\ F\x06\xcc\x06G\x00)\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x13Timeout (seco\ nds): \x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00B\x06'\ \x06F\x06/\x06'\x062\x06G\x00 \x06F\x06E\ \x06'\x06\xcc\x06G \x0c\x06G\x06'\x00 \x06/\ \x061\x00 \x06F\x06H\x06'\x062\x00 \x06'\ \x06(\x062\x06'\x061\x00 \x00: \x0c\x00 \ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Toolba\ r icons size: \x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00,\x06\xaf\x062\x06\xcc\x06F\x06G\ \x0c\x06G\x06'\x06\xcc\x00 \x06\xcc\x06'\x06(\ \x06F\x06/\x06G\x00 \x06H\x06\xcc\x06/\x06&\ \x06H\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Vide\ o Finder Options\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00 \x06E\x06\xcc\x062\x06'\ \x06F\x00 \x06(\x06D\x06F\x06/\x06\xcc\x00 \ \x065\x06/\x06'\x00:\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x08Volume: \x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00L\x06/\x061\x06F\x06\xaf\x00 \x06/\x061\ \x00 \x06(\x06\xcc\x06F\x00 \x06*\x06D\x06'\ \x064\x00 \x06G\x06'\x06\xcc\x00 \x06/\x06H\ \x06(\x06'\x061\x06G\x00(\x06(\x06G\x00 \ \x06+\x06'\x06F\x06\xcc\x06G\x00)\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00'Wait per\ iod between retr\ ies (seconds): \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00\x22\x06*\x06:\x06\xcc\x06\xcc\x06\ 1\x00 \x06~\x06H\x064\x06G\x00 \x06/\x06\ '\x06F\x06D\x06H\x06/\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x16Change Downlo\ ad Folder\x07\x00\x00\x00\x0ate\ xt_ui_tr\x01\x03\x00\x00\x00\x1a\x06~\ \x06H\x064\x06G\x00 \x06/\x06'\x06F\x06D\ \x06H\x06/\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x11Download folde\ r: \x07\x00\x00\x00\x0atext_ui_\ tr\x01\x03\x00\x00\x00 \x06\xaf\x060\x061\x06H\ \x06'\x06\x98\x06G\x00 \x06/\x06'\x06F\x06D\ \x06H\x06/\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x13Download passw\ ord: \x07\x00\x00\x00\x0atext_u\ i_tr\x01\x03\x00\x00\x006\x06F\x06'\x06E\ \x0c\x06\xa9\x06'\x061\x06(\x061\x06\xcc\x00 \ \x06H\x00 \x06\xaf\x060\x061\x06H\x06'\x06\x98\ \x06G\x00 \x06/\x06'\x06F\x06D\x06H\x06/\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1eDownlo\ ad username and \ password\x07\x00\x00\x00\x0atex\ t_ui_tr\x01\x03\x00\x00\x00$\x06F\x06\ '\x06E \x0c\x06\xa9\x06'\x061\x06(\x061\x06\ \xcc\x00 \x06/\x06'\x06F\x06D\x06H\x06/\x00\ :\x08\x00\x00\x00\x00\x06\x00\x00\x00\x13Downl\ oad username: \x07\x00\ \x00\x00\x0atext_ui_tr\x01\x03\x00\ \x00\x00\x0c\x06\x22\x06\xcc \x0c\x06~\x06\xcc\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x03IP:\x07\x00\x00\x00\ \x0atext_ui_tr\x01\x03\x00\x00\x00\ \x1c\x064\x06E\x06'\x061\x00 \x06'\x06*\x06\ 5\x06'\x06D \x0c\x06G\x06'\x00:\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x16Number of\ connections:\x07\x00\x00\ \x00\x0atext_ui_tr\x01\x03\x00\x00\ \x00*\x06/\x06'\x06F\x06D\x06H\x06/\x00 \ \x06E\x06F\x06\xcc\x06,\x061\x00 \x06~\x061\ \x063\x06~\x06H\x06D\x06\xcc\x063\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x1bPersepolis\ Download Manage\ r\x07\x00\x00\x00\x0atext_ui_tr\ \x01\x03\x00\x00\x00\x0a\x06~\x06H\x061\x06*\x00:\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Port:\x07\ \x00\x00\x00\x0atext_ui_tr\x01\x03\ \x00\x00\x00\x1e\x06\xaf\x060\x061\x06H\x06'\x06\x98\ \x06G\x00 \x06~\x061\x06'\x06\xa9\x063\x06\xcc\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Prox\ y password: \x07\x00\x00\x00\ \x0atext_ui_tr\x01\x03\x00\x00\x00\ $\x06F\x06'\x06E\x00 \x06\xa9\x06'\x061\x06\ (\x061\x06\xcc\x00 \x06~\x061\x06'\x06\xa9\x06\ 3\x06\xcc\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10P\ roxy username: \x07\ \x00\x00\x00\x0atext_ui_tr\x01\x03\ \x00\x00\x002\x00<\x00b\x00>\x06H\x066\x069\ \x06\xcc\x06*\x00 \x06~\x061\x06H\x06F\x06/\ \x06G\x00 \x065\x06/\x06'\x00:\x00 \x00<\ \x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1a\ Audio file st\ atus: \x07\x00\x00\x00\x1bv\ ideo_finder_prog\ ress_ui_tr\x01\x03\x00\x00\x00&\ \x00<\x00b\x00>\x06H\x066\x069\x06\xcc\x06*\ \x00 \x06E\x06\xcc\x06\xa9\x063\x00:\x00 \x00<\ \x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16\ Mixing status\ : \x07\x00\x00\x00\x1bvideo\ _finder_progress\ _ui_tr\x01\x03\x00\x00\x00&\x00<\x00b\ \x00>\x06H\x066\x069\x06\xcc\x06*\x00 \x06E\ \x06\xcc\x06\xa9\x063\x00:\x00 \x00<\x00/\x00b\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16M\ uxing status: \x07\x00\x00\x00\x1bvideo_fin\ der_progress_ui_\ tr\x01\x03\x00\x00\x004\x00<\x00b\x00>\x06H\ \x066\x069\x06\xcc\x06*\x00 \x06~\x061\x06H\ \x06F\x06/\x00 \x06H\x06\xcc\x06/\x06&\x06H\ \x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x1aVideo f\ ile status: \ \x07\x00\x00\x00\x1bvideo_finde\ r_progress_ui_tr\ \x01\ \x00\x001\x94\ <\ \xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\xa7\ \x00\x00\x00\x02deB\x00\x00\x03\xa8\x00\x00\x05;\x00\ \x00\x03\xc8\x00\x00\x05;\x00\x00\x06\xfa\x00\x00\x05;\x00\ \x00(\x18\x00\x00N:\x00\x00+\xb0\x00\x04\xcf\x04\x00\ \x00\x16\xd5\x00\x04\xe3\xc0\x00\x00\x06V\x00\x050K\x00\ \x00\x06\x84\x00\x05\xab`\x00\x00\x1e\x0c\x00Hw9\x00\ \x00\x15\xc3\x00Hw9\x00\x00\x1a\xa7\x00V\x8c\x95\x00\ \x00\x1c\xa6\x00Wiz\x00\x00\x07\x22\x00Wiz\x00\ \x00,H\x00W\x96\xf9\x00\x00\x07S\x00\x97\xa2\x10\x00\ \x00\x04\x9e\x00\xc2\xad\xd0\x00\x00\x0d\x9f\x01\x18\xab\xd4\x00\ \x00\x15\xfd\x01\x8bp\x0e\x00\x00!*\x02S\xd0\x00\x00\ \x00\x08G\x02\x9a\xf5p\x00\x00\x0e\x0d\x02\xf9\xc5\xc5\x00\ \x00\x03\x95\x03\x0d1^\x00\x00\x09\xf2\x03\x1c\xc5*\x00\ \x00\x1b\x95\x03<\x83\x03\x00\x00\x06\xb2\x03KF\xe3\x00\ \x00\x1b@\x03KF\xe3\x00\x00$\x8c\x03\x92\xd2\xce\x00\ \x00%\x1e\x03\xdc\xdc%\x00\x00\x0bd\x04]I3\x00\ \x00(\x87\x04e\xac\xf5\x00\x00\x16\x8e\x04\x98I\xbc\x00\ \x00\x05e\x04\x98I\xbc\x00\x00#\xa2\x04\x9e\x84\xd5\x00\ \x00#\xd8\x04\xd6W\xc0\x00\x00$\xe0\x05\x13\xccT\x00\ \x00\x13C\x05_. \x00\x00\x12S\x05_\xa8`\x00\ \x00\x0e\xea\x05i<\xfe\x00\x00\x14K\x05v\x1b\x9e\x00\ \x00\x0b\xb7\x05\x8c\xac5\x00\x00\x1dL\x05\xa1\x08\xc0\x00\ \x00)\x9d\x05\xa3\x9c>\x00\x00\x13\xf4\x05\xa3\x9c>\x00\ \x00,\xec\x05\xa8X\xf3\x00\x00\x03\x09\x05\xaa\x8b\xc3\x00\ \x00)\xd1\x06-B\x0e\x00\x00\x13\x91\x06-B\x0e\x00\ \x00,v\x069\x82N\x00\x00\x14\x8d\x069\x82N\x00\ \x00-N\x06<=\x10\x00\x00+\x0f\x06]1\xde\x00\ \x00\x02\x02\x06\x9aK\x00\x00\x00\x08|\x06\x9a\xf5C\x00\ \x00)`\x06\x9c(\x01\x00\x00&(\x06\xc5)*\x00\ \x00\x1b\xe3\x06\xcc\xd6\xa3\x00\x00\x18 \x07\x14*\x1e\x00\ \x00\x18\xc3\x076\xcf`\x00\x00\x06\x03\x07[&u\x00\ \x00\x0f\xb1\x07\x9b]0\x00\x00'\xbd\x07\x9c1\x03\x00\ \x00*\xa9\x08g-\xa2\x00\x00\x0a\x81\x09>\x0d$\x00\ \x00\x19\xe7\x09^\x89\xd3\x00\x00\x17\xdd\x09`\x06\xb5\x00\ \x00\x19\xa6\x09g\x01\xd0\x00\x00*8\x09\x93\xd2\xfe\x00\ \x00\x1a\xe1\x09\x96F0\x00\x00\x10\xca\x0a\x0c\x87\x0e\x00\ \x00\x1f\xc2\x0a_\xd7\x0e\x00\x00\x08\xca\x0a_\xf3\xfb\x00\ \x00\x14\xf8\x0as>\xc3\x00\x00\x04_\x0a\x8b\xc3`\x00\ \x00\x1d\xd1\x0a\x97\x00\x80\x00\x00\x07\xe7\x0a\xa2Yp\x00\ \x00(\xe3\x0a\xc0(\x90\x00\x00*\x05\x0b`r`\x00\ \x00&\xa2\x0bn\xb1\xee\x00\x00\x229\x0bv\x04\xf0\x00\ \x00\x0d8\x0b\x89w\x94\x00\x00\x15n\x0b\x89w\x94\x00\ \x00\x1aT\x0b\xc8\xc7\x13\x00\x00$R\x0b\xf9\x95\xb3\x00\ \x00\x10\x17\x0c(\x19\x04\x00\x00\x18i\x0c2\xc0S\x00\ \x00\x03W\x0ce\x0f.\x00\x00\x19\x5c\x0ce\x0f.\x00\ \x00\x1d\x89\x0c\x96q\xc0\x00\x00\x09=\x0c\x96q\xc0\x00\ \x00\x0e\x9a\x0c\x99e\x80\x00\x00\x11\x0b\x0c\xb5\x86\x80\x00\ \x00\x1cR\x0c\xb5\x86\x80\x00\x00'T\x0c\xdd\xc2\x03\x00\ \x00(@\x0c\xe0\x1a\xf3\x00\x00'\x01\x0c\xfb\xe0\x8a\x00\ \x00\x11I\x0dq\x98\xde\x00\x00\x00\x00\x0d\x99\xf9B\x00\ \x00\x03\xee\x0d\x99\xf9B\x00\x00\x0a\xea\x0d\x99\xf9B\x00\ \x00\x17g\x0d\x99\xf9B\x00\x00\x1c\xd8\x0d\x99\xf9B\x00\ \x00+\xd8\x0e i\x22\x00\x00\x12\xf4\x0e.d\xa4\x00\ \x00\x17\x10\x0e7I\xc3\x00\x00\x05\x01\x0ex\xa8B\x00\ \x00\x05\x9b\x0ex\xa8B\x00\x00+O\x0e\xc4J\xf0\x00\ \x00\x07\x84\x0e\xda\xd4\xfe\x00\x00\x1e\xa5\x0f6\xb6\x90\x00\ \x00\x0f@\x0f}\x11p\x00\x00\x09\x8d\x0f\xa6V\x80\x00\ \x00%\xef\x0f\xa7\xb6\x04\x00\x00\x10o\x0f\xac[\xee\x00\ \x00\x11\xc9\x0f\xd1?\x00\x00\x00\x1e;\x0f\xd6\xe5\xde\x00\ \x00 8\x0f\xde{\xf0\x00\x00$\x0c\x0f\xf3\x03\x0e\x00\ \x00\x00\xfbi\x00\x00-\xc4\x03\x00\x00\x00\x92\x00<\x00\ a\x00 \x00h\x00r\x00e\x00f\x00=\x00h\x00\ t\x00t\x00p\x00s\x00:\x00/\x00/\x00p\x00\ e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00\ s\x00d\x00m\x00.\x00g\x00i\x00t\x00h\x00\ u\x00b\x00.\x00i\x00o\x00>\x00h\x00t\x00\ t\x00p\x00s\x00:\x00/\x00/\x00p\x00e\x00\ r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00\ d\x00m\x00.\x00g\x00i\x00t\x00h\x00u\x00\ b\x00.\x00i\x00o\x00<\x00/\x00a\x00>\x08\ \x00\x00\x00\x00\x06\x00\x00\x00I\ https://persepol\ isdm.github.io\x07\x00\x00\x00\x0babout_ui_\ tr\x01\x03\x00\x00\x00\x9a\x00<\x00a\x00 \x00h\ \x00r\x00e\x00f\x00=\x00h\x00t\x00t\x00p\ \x00s\x00:\x00/\x00/\x00t\x00e\x00l\x00e\ \x00g\x00r\x00a\x00m\x00.\x00m\x00e\x00/\ \x00p\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x00d\x00m\x00>\x00h\x00t\x00t\ \x00p\x00s\x00:\x00/\x00/\x00t\x00e\x00l\ \x00e\x00g\x00r\x00a\x00m\x00.\x00m\x00e\ \x00/\x00p\x00e\x00r\x00s\x00e\x00p\x00o\ \x00l\x00i\x00s\x00d\x00m\x00<\x00/\x00a\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00Mhttps://tel\ egram.me/persepo\ lisdm\x07\x00\x00\x00\x0bab\ out_ui_tr\x01\x03\x00\x00\x00\x9a\x00\ <\x00a\x00 \x00h\x00r\x00e\x00f\x00=\x00\ h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00\ t\x00w\x00i\x00t\x00t\x00e\x00r\x00.\x00\ c\x00o\x00m\x00/\x00p\x00e\x00r\x00s\x00\ e\x00p\x00o\x00l\x00i\x00s\x00d\x00m\x00\ >\x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00\ /\x00t\x00w\x00i\x00t\x00t\x00e\x00r\x00\ .\x00c\x00o\x00m\x00/\x00p\x00e\x00r\x00\ s\x00e\x00p\x00o\x00l\x00i\x00s\x00d\x00\ m\x00<\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00Mhttp\ s://twitter.com/\ persepolisdm\ \x07\x00\x00\x00\x0babout_ui_tr\ \x01\x03\x00\x00\x00\x1e\x00\xdc\x00b\x00e\x00r\x00 \ \x00P\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Ab\ out Persepolis\x07\x00\ \x00\x00\x0babout_ui_tr\x01\x03\ \x00\x00\x00\x14\x00E\x00n\x00t\x00w\x00i\x00c\ \x00k\x00l\x00e\x00r\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0aDevelopers\x07\x00\x00\x00\ \x0babout_ui_tr\x01\x03\x00\x00\ \x00\x0c\x00L\x00i\x00z\x00e\x00n\x00z\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x07License\x07\ \x00\x00\x00\x0babout_ui_tr\x01\ \x03\x00\x00\x00\x04\x00O\x00K\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x02OK\x07\x00\x00\x00\x0babout_\ ui_tr\x01\x03\x00\x00\x006\x00P\x00e\x00\ r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00\ \x00D\x00o\x00w\x00n\x00l\x00o\x00a\x00\ d\x00 \x00M\x00a\x00n\x00a\x00g\x00e\x00\ r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bPerse\ polis Download M\ anager\x07\x00\x00\x00\x0babout\ _ui_tr\x01\x03\x00\x00\x00\x14\x00\xdc\x00b\ \x00e\x00r\x00s\x00e\x00t\x00z\x00e\x00r\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0bTransl\ ators\x07\x00\x00\x00\x0babout_\ ui_tr\x01\x03\x00\x00\x000\x00Z\x00u\x00\ \x00K\x00a\x00t\x00e\x00g\x00o\x00r\x00\ i\x00e\x00 \x00h\x00i\x00n\x00z\x00u\x00\ f\x00\xfc\x00g\x00e\x00n\x00:\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x11Add to cate\ gory: \x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x002\x00F\ \x00o\x00r\x00t\x00g\x00e\x00s\x00c\x00h\ \x00r\x00i\x00t\x00t\x00e\x00n\x00e\x00 \ \x00O\x00p\x00t\x00i\x00o\x00n\x00e\x00n\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Advanc\ ed Options\x07\x00\x00\x00\x0da\ ddlink_ui_tr\x01\x03\x00\x00\ \x00\x0e\x00A\x00b\x00b\x00r\x00u\x00c\x00h\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Cancel\ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x000\x00D\x00o\x00w\x00n\ \x00l\x00o\x00a\x00d\x00 \x00O\x00r\x00d\ \x00n\x00e\x00r\x00 \x00w\x00e\x00c\x00h\ \x00s\x00e\x00l\x00n\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x16Change Downloa\ d Folder\x07\x00\x00\x00\x0dadd\ link_ui_tr\x01\x03\x00\x00\x00 \ \x00D\x00o\x00w\x00n\x00l\x00o\x00a\x00d\ \x00 \x00O\x00r\x00d\x00n\x00e\x00r\x00:\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Downlo\ ad Folder: \x07\x00\x00\x00\x0d\ addlink_ui_tr\x01\x03\x00\ \x00\x00\x08\x00I\x00P\x00:\x00 \x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x04IP: \x07\x00\x00\x00\x0dad\ dlink_ui_tr\x01\x03\x00\x00\x00\ \x08\x00L\x00i\x00n\x00k\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x04Link\x07\x00\x00\x00\x0daddl\ ink_ui_tr\x01\x03\x00\x00\x00\x1a\x00\ M\x00e\x00h\x00r\x00 \x00O\x00p\x00t\x00\ i\x00o\x00n\x00e\x00n\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0cMore Options\x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x00\x04\x00O\x00K\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x02OK\x07\x00\x00\x00\x0daddl\ ink_ui_tr\x01\x03\x00\x00\x00\x0a\x00\ P\x00o\x00r\x00t\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x05Port:\x07\x00\x00\x00\x0dadd\ link_ui_tr\x01\x03\x00\x00\x00\x0a\ \x00P\x00r\x00o\x00x\x00y\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x05Proxy\x07\x00\x00\x00\x0dad\ dlink_ui_tr\x01\x03\x00\x00\x00\ $\x00<\x00b\x00>\x00D\x00a\x00t\x00e\x00\ i\x00n\x00a\x00m\x00e\x00<\x00/\x00b\x00\ >\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x12<\ b>File name:\ \x07\x00\x00\x00\x18after_down\ load_src_ui_tr\x01\x03\ \x00\x00\x00&\x00<\x00b\x00>\x00D\x00a\x00t\ \x00e\x00i\x00g\x00r\x00\xf6\x00\xdf\x00e\x00<\ \x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0dSize:\ \x07\x00\x00\x00\x18after_down\ load_src_ui_tr\x01\x03\ \x00\x00\x00\x04\x00O\x00K\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x08 OK \x07\x00\x00\x00\x14a\ fter_download_ui\ _tr\x01\x03\x00\x00\x00\x18\x00D\x00a\x00t\x00\ e\x00i\x00 \x00\xf6\x00f\x00f\x00n\x00e\x00\ n\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d Ope\ n File \x07\x00\x00\x00\x14aft\ er_download_ui_t\ r\x01\x03\x00\x00\x000\x00<\x00b\x00>\x00D\x00\ o\x00w\x00n\x00l\x00o\x00a\x00d\x00 \x00\ b\x00e\x00e\x00n\x00d\x00e\x00t\x00!\x00\ <\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1aDownload Com\ pleted!\x07\x00\x00\x00\x14\ after_download_u\ i_tr\x01\x03\x00\x00\x00\x1a\x00<\x00b\x00>\ \x00L\x00i\x00n\x00k\x00<\x00/\x00b\x00>\ \x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dLink: \x07\x00\x00\x00\x14\ after_download_u\ i_tr\x01\x03\x00\x00\x00,\x00<\x00b\x00>\ \x00S\x00p\x00e\x00i\x00c\x00h\x00e\x00r\ \x00n\x00 \x00a\x00l\x00s\x00<\x00/\x00b\ \x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x10\ Save as: \ \x07\x00\x00\x00\x14after_downl\ oad_ui_tr\x01\x03\x00\x00\x00H\x00\ D\x00i\x00e\x00s\x00e\x00 \x00N\x00a\x00\ c\x00h\x00r\x00i\x00c\x00h\x00t\x00 \x00\ n\x00i\x00c\x00h\x00t\x00 \x00m\x00e\x00\ h\x00r\x00 \x00a\x00n\x00z\x00e\x00i\x00\ g\x00e\x00n\x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1eDon't show this\ message again.\x07\ \x00\x00\x00\x14after_downlo\ ad_ui_tr\x01\x03\x00\x00\x00,\x00D\ \x00o\x00w\x00n\x00l\x00o\x00a\x00d\x00 \ \x00O\x00r\x00d\x00n\x00e\x00r\x00 \x00\xf6\ \x00f\x00f\x00n\x00e\x00n\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x14Open Downloa\ d Folder\x07\x00\x00\x00\x14aft\ er_download_ui_t\ r\x01\x03\x00\x00\x006\x00P\x00e\x00r\x00s\x00\ e\x00p\x00o\x00l\x00i\x00s\x00 \x00D\x00\ o\x00w\x00n\x00l\x00o\x00a\x00d\x00 \x00\ M\x00a\x00n\x00a\x00g\x00e\x00r\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x1bPersepoli\ s Download Manag\ er\x07\x00\x00\x00\x14after_dow\ nload_ui_tr\x01\x03\x00\x00\x00\ \x22\x00P\x00r\x00o\x00b\x00l\x00e\x00m\x00\ \x00b\x00e\x00r\x00i\x00c\x00h\x00t\x00\ e\x00n\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0cRep\ ort Issue\x07\x00\x00\x00\x10lo\ g_window_ui_tr\x01\x03\ \x00\x00\x00\xe6\x00<\x00b\x00>\x00<\x00c\x00e\ \x00n\x00t\x00e\x00r\x00>\x00D\x00i\x00e\ \x00s\x00e\x00r\x00 \x00L\x00i\x00n\x00k\ \x00 \x00w\x00u\x00r\x00d\x00e\x00 \x00b\ \x00e\x00r\x00e\x00i\x00t\x00s\x00 \x00h\ \x00i\x00n\x00z\x00u\x00g\x00e\x00f\x00\xfc\ \x00g\x00t\x00!\x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00W\ \x00o\x00l\x00l\x00e\x00n\x00 \x00S\x00i\ \x00e\x00 \x00I\x00h\x00n\x00 \x00e\x00r\ \x00n\x00e\x00u\x00t\x00 \x00h\x00i\x00n\ \x00z\x00u\x00f\x00\xfc\x00g\x00e\x00n\x00?\ \x00<\x00/\x00c\x00e\x00n\x00t\x00e\x00r\ \x00>\x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\ \x00\x00\x00r
T\ his link has bee\ n added before! \ \ Are you sure \ you want to add \ it again?\x07\x00\x00\x00\x14mainw\ indow_src_ui_tr\x01\ \x03\x00\x00\x00*\x00<\x00b\x00>\x00V\x00e\x00\ r\x00b\x00i\x00n\x00d\x00u\x00n\x00g\x00\ e\x00n\x00<\x00/\x00b\x00>\x00:\x00 \x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x14Conn\ ections: \x07\x00\x00\ \x00\x14mainwindow_src\ _ui_tr\x01\x03\x00\x00\x002\x00<\x00b\ \x00>\x00H\x00e\x00r\x00t\x00u\x00n\x00t\ \x00e\x00r\x00g\x00e\x00l\x00a\x00d\x00e\ \x00n\x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x13Downl\ oaded: \x07\x00\x00\x00\x14\ mainwindow_src_u\ i_tr\x01\x03\x00\x00\x00H\x00<\x00b\x00>\ \x00G\x00e\x00s\x00c\x00h\x00\xe4\x00t\x00z\ \x00t\x00e\x00 \x00\xdc\x00b\x00e\x00r\x00t\ \x00r\x00a\x00g\x00u\x00n\x00g\x00s\x00z\ \x00e\x00i\x00t\x00<\x00/\x00b\x00>\x00:\ \x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1cE\ stimated time le\ ft: \x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x00\x1a\x00<\x00b\x00>\x00L\x00\ i\x00n\x00k\x00<\x00/\x00b\x00>\x00:\x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dLi\ nk: \x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x00\x1e\x00<\x00b\x00>\x00S\x00\ t\x00a\x00t\x00u\x00s\x00<\x00/\x00b\x00\ >\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0f<\ b>Status: \x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x002\x00<\x00\ b\x00>\x00\xdc\x00b\x00e\x00r\x00t\x00r\x00\ a\x00g\x00u\x00n\x00g\x00s\x00r\x00a\x00\ t\x00e\x00<\x00/\x00b\x00>\x00:\x00 \x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x16Tran\ sfer rate: \x07\ \x00\x00\x00\x14mainwindow_s\ rc_ui_tr\x01\x03\x00\x00\x00,\x00D\ \x00o\x00w\x00n\x00l\x00o\x00a\x00d\x00 \ \x00a\x00b\x00g\x00e\x00s\x00c\x00h\x00l\ \x00o\x00s\x00s\x00e\x00n\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x11Download Com\ plete\x07\x00\x00\x00\x14mainwi\ ndow_src_ui_tr\x01\x03\ \x00\x00\x00 \x00D\x00o\x00w\x00n\x00l\x00o\ \x00a\x00d\x00 \x00s\x00t\x00a\x00r\x00t\ \x00e\x00t\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fDo\ wnload Starts\x07\x00\x00\ \x00\x14mainwindow_src\ _ui_tr\x01\x03\x00\x00\x00\x22\x00D\x00o\ \x00w\x00n\x00l\x00o\x00a\x00d\x00 \x00g\ \x00e\x00s\x00t\x00o\x00p\x00p\x00t\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x10Download\ Stopped\x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x00\x10\x00F\x00e\x00h\x00l\x00\ e\x00r\x00 \x00-\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x08Error - \x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00\x0e\x00F\x00e\x00h\x00l\ \x00e\x00r\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07\ Error: \x07\x00\x00\x00\x14main\ window_src_ui_tr\ \x01\x03\x00\x00\x00>\x00N\x00i\x00c\x00h\x00t\ \x00 \x00g\x00e\x00n\x00u\x00g\x00 \x00f\ \x00r\x00e\x00i\x00e\x00r\x00 \x00S\x00p\ \x00e\x00i\x00c\x00h\x00e\x00r\x00 \x00i\ \x00n\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x19No\ t enough free sp\ ace in:\x07\x00\x00\x00\x14main\ window_src_ui_tr\ \x01\x03\x00\x00\x00D\x00D\x00e\x00r\x00 \x00V\ \x00o\x00r\x00g\x00a\x00n\x00g\x00 \x00w\ \x00a\x00r\x00 \x00n\x00i\x00c\x00h\x00t\ \x00 \x00e\x00r\x00f\x00o\x00l\x00g\x00r\ \x00e\x00i\x00c\x00h\x00.\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1dOperation wa\ s not successful\ .\x07\x00\x00\x00\x14mainwindow\ _src_ui_tr\x01\x03\x00\x00\x00R\ \x00B\x00i\x00t\x00t\x00e\x00 \x00m\x00i\ \x00t\x00 \x00f\x00o\x00l\x00g\x00e\x00n\ \x00d\x00e\x00r\x00 \x00K\x00a\x00t\x00e\ \x00g\x00o\x00r\x00i\x00e\x00 \x00f\x00o\ \x00r\x00t\x00f\x00a\x00h\x00r\x00e\x00n\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00&Plea\ se resume the fo\ llowing category\ : \x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ \x1a\x00M\x00u\x00x\x00i\x00n\x00g\x00-\x00\ F\x00e\x00h\x00l\x00e\x00r\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0cmuxing erro\ r\x07\x00\x00\x00\x14mainwindow\ _src_ui_tr\x01\x03\x00\x00\x00\x1e\ \x00h\x00e\x00r\x00u\x00n\x00t\x00e\x00r\ \x00g\x00e\x00l\x00a\x00d\x00e\x00n\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0b downloa\ ded\x07\x00\x00\x00\x10mainwind\ ow_ui_tr\x01\x03\x00\x00\x00$\x00A\ \x00u\x00d\x00i\x00o\x00d\x00a\x00t\x00e\ \x00i\x00 \x00S\x00t\x00a\x00t\x00u\x00s\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aA\ udio file status\ : \x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ \x1c\x00M\x00u\x00x\x00i\x00n\x00g\x00 \x00\ S\x00t\x00a\x00t\x00u\x00s\x00:\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x16Muxing\ status: \x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00\x0e\x00S\x00t\x00a\x00t\ \x00u\x00s\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0f\ Status: \x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00,\x00S\x00t\x00a\ \x00t\x00u\x00s\x00 \x00d\x00e\x00r\x00 \ \x00V\x00i\x00d\x00e\x00o\x00d\x00a\x00t\ \x00e\x00i\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1a\ Video file st\ atus: \x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x00<\x00N\x00e\x00u\x00e\x00n\x00\ \x00D\x00o\x00w\x00n\x00l\x00o\x00a\x00\ d\x00 \x00L\x00i\x00n\x00k\x00 \x00h\x00\ i\x00n\x00z\x00u\x00f\x00\xfc\x00g\x00e\x00\ n\x08\x00\x00\x00\x00\x06\x00\x00\x00\x15Add N\ ew Download Link\ \x07\x00\x00\x00\x10mainwindow_\ ui_tr\x01\x03\x00\x00\x00\x22\x00N\x00a\x00\ c\x00h\x00 \x00d\x00e\x00m\x00 \x00D\x00\ o\x00w\x00n\x00l\x00o\x00a\x00d\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0eAfter dow\ nload\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00\x10\ \x00A\x00n\x00w\x00e\x00n\x00d\x00e\x00n\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Apply\x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00J\x00E\x00n\x00d\ \x00e\x00 \x00d\x00e\x00r\x00 \x00L\x00i\ \x00s\x00t\x00e\x00 \x00\x0a\x00 \x00z\x00u\ \x00e\x00r\x00s\x00t\x00 \x00h\x00e\x00r\ \x00u\x00n\x00t\x00e\x00r\x00l\x00a\x00d\ \x00e\x00n\x08\x00\x00\x00\x00\x06\x00\x00\x00\x22Do\ wnload bottom of\ \x0a the list first\ \x07\x00\x00\x00\x10mainwindow_\ ui_tr\x01\x03\x00\x00\x00\x1a\x00A\x00b\x00\ s\x00c\x00h\x00l\x00u\x00s\x00s\x00z\x00\ e\x00i\x00t\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08E\ nd Time\x07\x00\x00\x00\x10main\ window_ui_tr\x01\x03\x00\x00\ \x00\x12\x00S\x00c\x00h\x00l\x00i\x00e\x00\xdf\ \x00e\x00n\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04Ex\ it\x07\x00\x00\x00\x10mainwindo\ w_ui_tr\x01\x03\x00\x00\x00$\x00D\x00\ o\x00w\x00n\x00l\x00o\x00a\x00d\x00 \x00\ p\x00a\x00u\x00s\x00i\x00e\x00r\x00e\x00\ n\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0ePause\ Download\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x006\x00P\x00e\x00r\x00s\x00e\x00p\ \x00o\x00l\x00i\x00s\x00 \x00D\x00o\x00w\ \x00n\x00l\x00o\x00a\x00d\x00 \x00M\x00a\ \x00n\x00a\x00g\x00e\x00r\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1bPersepolis D\ ownload Manager\x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00\x16\x00F\x00o\x00r\ \x00t\x00s\x00c\x00h\x00r\x00i\x00t\x00t\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x08Progre\ ss\x07\x00\x00\x00\x10mainwindo\ w_ui_tr\x01\x03\x00\x00\x00\x1a\x00E\x00\ i\x00g\x00e\x00n\x00s\x00c\x00h\x00a\x00\ f\x00t\x00e\x00n\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0aProperties\x07\x00\x00\x00\x10\ mainwindow_ui_tr\ \x01\x03\x00\x00\x00&\x00D\x00o\x00w\x00n\x00l\ \x00o\x00a\x00d\x00 \x00f\x00o\x00r\x00t\ \x00f\x00a\x00h\x00r\x00e\x00n\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0fResume Dow\ nload\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00Z\ \x00S\x00y\x00m\x00b\x00o\x00l\x00 \x00i\ \x00n\x00 \x00d\x00e\x00r\x00 \x00S\x00y\ \x00s\x00t\x00e\x00m\x00l\x00e\x00i\x00s\ \x00t\x00e\x00 \x00a\x00n\x00z\x00e\x00i\ \x00g\x00e\x00n\x00/\x00v\x00e\x00r\x00b\ \x00e\x00r\x00g\x00e\x00n\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1aShow/Hide sy\ stem tray icon\x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00\x1c\x00H\x00e\x00r\x00\ u\x00n\x00t\x00e\x00r\x00f\x00a\x00h\x00\ r\x00e\x00n\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09S\ hut Down\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00\x12\x00S\x00t\x00a\x00r\x00t\x00z\x00\ e\x00i\x00t\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aS\ tart Time\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x004\x00D\x00o\x00w\x00n\x00l\x00o\ \x00a\x00d\x00 \x00s\x00t\x00o\x00p\x00p\ \x00e\x00n\x00/\x00a\x00b\x00b\x00r\x00e\ \x00c\x00h\x00e\x00n\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x14Stop/Cancel Do\ wnload\x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ \x22\x00N\x00a\x00c\x00h\x00 \x00d\x00e\x00\ m\x00 \x00D\x00o\x00w\x00n\x00l\x00o\x00\ a\x00d\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0eAft\ er download\x07\x00\x00\x00\x0e\ progress_ui_tr\x01\x03\ \x00\x00\x00\x12\x00A\x00n\x00d\x00w\x00e\x00n\ \x00d\x00e\x00n\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05\ Apply\x07\x00\x00\x00\x0eprogre\ ss_ui_tr\x01\x03\x00\x00\x00(\x00D\ \x00o\x00w\x00n\x00l\x00o\x00a\x00d\x00 \ \x00I\x00n\x00f\x00o\x00r\x00m\x00a\x00t\ \x00i\x00o\x00n\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14\ Download Informa\ tion\x07\x00\x00\x00\x0eprogres\ s_ui_tr\x01\x03\x00\x00\x00\x22\x00D\x00\ o\x00w\x00n\x00l\x00o\x00a\x00d\x00 \x00\ O\x00p\x00t\x00i\x00o\x00n\x00e\x00n\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x10Downloa\ d Options\x07\x00\x00\x00\x0epr\ ogress_ui_tr\x01\x03\x00\x00\ \x00 \x00H\x00e\x00r\x00u\x00n\x00t\x00e\ \x00r\x00g\x00e\x00l\x00a\x00d\x00e\x00n\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0bDown\ loaded:\x07\x00\x00\x00\x0eprog\ ress_ui_tr\x01\x03\x00\x00\x008\ \x00G\x00e\x00s\x00c\x00h\x00\xe4\x00t\x00z\ \x00t\x00e\x00 \x00\xdc\x00b\x00e\x00r\x00t\ \x00r\x00a\x00g\x00u\x00n\x00g\x00s\x00z\ \x00e\x00i\x00t\x00:\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x14Estimated time\ left:\x07\x00\x00\x00\x0eprogr\ ess_ui_tr\x01\x03\x00\x00\x00\x1a\x00\ V\x00e\x00r\x00b\x00i\x00n\x00d\x00u\x00\ n\x00g\x00e\x00n\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x17Number of con\ nections: \x07\x00\x00\x00\x0ep\ rogress_ui_tr\x01\x03\x00\ \x00\x00\x0a\x00P\x00a\x00u\x00s\x00e\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x05Pause\x07\x00\x00\x00\ \x0eprogress_ui_tr\x01\ \x03\x00\x00\x006\x00P\x00e\x00r\x00s\x00e\x00\ p\x00o\x00l\x00i\x00s\x00 \x00D\x00o\x00\ w\x00n\x00l\x00o\x00a\x00d\x00 \x00M\x00\ a\x00n\x00a\x00g\x00e\x00r\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x1bPersepolis \ Download Manager\ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00\x14\x00F\x00o\x00r\x00\ t\x00f\x00a\x00h\x00r\x00e\x00n\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x06Resume\x07\x00\x00\ \x00\x0eprogress_ui_tr\ \x01\x03\x00\x00\x00\x1c\x00H\x00e\x00r\x00u\x00n\ \x00t\x00e\x00r\x00f\x00a\x00h\x00r\x00e\ \x00n\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09Shut\ Down\x07\x00\x00\x00\x0eprogre\ ss_ui_tr\x01\x03\x00\x00\x00\x10\x00S\ \x00t\x00a\x00t\x00u\x00s\x00:\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x08Status: \ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00\x08\x00S\x00t\x00o\x00\ p\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04Stop\x07\ \x00\x00\x00\x0eprogress_ui_\ tr\x01\x03\x00\x00\x008\x00\xdc\x00b\x00e\x00r\ \x00t\x00r\x00a\x00g\x00u\x00n\x00g\x00s\ \x00g\x00e\x00s\x00c\x00h\x00w\x00i\x00n\ \x00d\x00i\x00g\x00k\x00e\x00i\x00t\x00:\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fTransf\ er rate: \x07\x00\x00\x00\x0epr\ ogress_ui_tr\x01\x03\x00\x00\ \x00\x98\x00D\x00i\x00e\x00s\x00e\x00r\x00 \ \x00S\x00h\x00o\x00r\x00t\x00c\x00u\x00t\ \x00 \x00w\x00u\x00r\x00d\x00e\x00 \x00b\ \x00e\x00r\x00e\x00i\x00t\x00s\x00 \x00v\ \x00e\x00r\x00w\x00e\x00n\x00d\x00e\x00t\ \x00.\x00 \x00 \x00 \x00-\x00 \x00 \x00\xa0\ \x00B\x00i\x00t\x00t\x00e\x00 \x00v\x00e\ \x00r\x00w\x00e\x00n\x00d\x00e\x00 \x00e\ \x00i\x00n\x00e\x00n\x00 \x00a\x00n\x00d\ \x00e\x00r\x00e\x00n\x00.\x08\x00\x00\x00\x00\x06\ \x00\x00\x00_
T\ his shortcut has\ been used befor\ e! \ Use anothe\ r one!
<\ /b>\x07\x00\x00\x00\x11setting_\ src_ui_tr\x01\x03\x00\x00\x00 \x00\ Z\x00e\x00i\x00t\x00f\x00o\x00r\x00m\x00\ a\x00t\x00 \x00H\x00H\x00:\x00M\x00M\x08\ \x00\x00\x00\x00\x06\x00\x00\x004<\ head/>

F\ ormat HH:MM

<\ /body>\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x90\x00<\x00h\x00t\x00m\x00l\x00\ >\x00<\x00h\x00e\x00a\x00d\x00/\x00>\x00\ <\x00b\x00o\x00d\x00y\x00>\x00<\x00p\x00\ >\x00Z\x00e\x00i\x00t\x00\xfc\x00b\x00e\x00\ r\x00s\x00c\x00h\x00r\x00e\x00i\x00t\x00\ u\x00n\x00g\x00 \x00i\x00n\x00 \x00S\x00\ e\x00k\x00u\x00n\x00d\x00e\x00n\x00.\x00\ \x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00\ o\x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00\ m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00@<\ html>

Set timeout\ in seconds. \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00\x92\x00D\x00i\x00e\x00s\x00\ e\x00 \x00F\x00u\x00n\x00k\x00t\x00i\x00\ o\x00n\x00 \x00f\x00u\x00n\x00k\x00t\x00\ i\x00o\x00n\x00i\x00e\x00r\x00t\x00 \x00\ m\x00\xf6\x00g\x00l\x00i\x00c\x00h\x00e\x00\ r\x00w\x00e\x00i\x00s\x00e\x00 \x00n\x00\ i\x00c\x00h\x00t\x00 \x00i\x00n\x00 \x00\ I\x00h\x00r\x00e\x00m\x00 \x00B\x00e\x00\ t\x00r\x00i\x00e\x00b\x00s\x00s\x00y\x00\ s\x00t\x00e\x00m\x00.\x08\x00\x00\x00\x00\x06\x00\ \x00\x00[\

This fe\ ature may not wo\ rk in your opera\ ting system.

\ \x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00\xe4\x00<\x00h\x00t\x00m\x00l\ \x00>\x00<\x00h\x00e\x00a\x00d\x00/\x00>\ \x00<\x00b\x00o\x00d\x00y\x00>\x00<\x00p\ \x00>\x00M\x00e\x00h\x00r\x00f\x00a\x00c\ \x00h\x00e\x00 \x00g\x00l\x00e\x00i\x00c\ \x00h\x00z\x00e\x00i\x00t\x00i\x00g\x00e\ \x00 \x00V\x00e\x00r\x00b\x00i\x00n\x00d\ \x00u\x00n\x00g\x00e\x00n\x00 \x00k\x00\xf6\ \x00n\x00n\x00e\x00n\x00 \x00e\x00i\x00n\ \x00e\x00n\x00 \x00D\x00o\x00w\x00n\x00l\ \x00o\x00a\x00d\x00 \x00b\x00e\x00s\x00c\ \x00h\x00l\x00e\x00u\x00n\x00i\x00g\x00e\ \x00n\x00.\x00 \x00<\x00/\x00p\x00>\x00<\ \x00/\x00b\x00o\x00d\x00y\x00>\x00<\x00/\ \x00h\x00t\x00m\x00l\x00>\x08\x00\x00\x00\x00\x06\ \x00\x00\x00c

Using \ multiple connect\ ions can help sp\ eed up your down\ load.

\ \x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x0e\x00\ A\x00b\x00b\x00r\x00u\x00c\x00h\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x06Cancel\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x0c\x00\xc4\x00n\x00d\x00e\x00r\x00\ n\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Chang\ e\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x16\x00F\x00a\x00r\x00\ b\x00s\x00c\x00h\x00e\x00m\x00a\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0eColor s\ cheme: \x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x10\x00\ S\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x08Default\ s\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x22\x00D\x00o\x00w\x00\ n\x00l\x00o\x00a\x00d\x00 \x00O\x00p\x00\ t\x00i\x00o\x00n\x00e\x00n\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x10Download Op\ tions\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x16\x00S\x00\ c\x00h\x00r\x00i\x00f\x00t\x00a\x00r\x00\ t\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Fon\ t: \x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00\x86\x00V\x00e\x00\ r\x00s\x00t\x00e\x00c\x00k\x00e\x00 \x00\ d\x00a\x00s\x00 \x00H\x00a\x00u\x00p\x00\ t\x00f\x00e\x00n\x00s\x00t\x00e\x00r\x00\ \x00w\x00e\x00n\x00n\x00 \x00d\x00e\x00\ r\x00 \x00S\x00c\x00h\x00l\x00i\x00e\x00\ \xdf\x00e\x00n\x00-\x00K\x00n\x00o\x00p\x00\ f\x00 \x00g\x00e\x00k\x00l\x00i\x00c\x00\ k\x00t\x00 \x00w\x00u\x00r\x00d\x00e\x00\ .\x08\x00\x00\x00\x00\x06\x00\x00\x00)Hide \ main window if c\ lose button clic\ ked.\x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\x10\x00S\x00y\ \x00m\x00b\x00o\x00l\x00e\x00:\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x07Icons: \x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00F\x00R\x00u\x00h\x00e\x00z\x00\ u\x00s\x00t\x00a\x00n\x00d\x00 \x00d\x00\ e\x00s\x00 \x00S\x00y\x00s\x00t\x00e\x00\ m\x00s\x00 \x00v\x00e\x00r\x00h\x00i\x00\ n\x00d\x00e\x00r\x00n\x00!\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x12Keep system\ awake!\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00*\x00\ B\x00e\x00n\x00a\x00c\x00h\x00r\x00i\x00\ c\x00h\x00t\x00i\x00g\x00u\x00n\x00g\x00\ s\x00a\x00r\x00t\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x13Notification \ type: \x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00$\x00B\ \x00e\x00n\x00a\x00c\x00h\x00r\x00i\x00c\ \x00h\x00t\x00i\x00g\x00u\x00n\x00g\x00e\ \x00n\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dNoti\ fications\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ 0\x00A\x00n\x00z\x00a\x00h\x00l\x00 \x00\ d\x00e\x00r\x00 \x00V\x00e\x00r\x00b\x00\ i\x00n\x00d\x00u\x00n\x00g\x00e\x00n\x00\ :\x08\x00\x00\x00\x00\x06\x00\x00\x00\x17Numbe\ r of connections\ : \x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00(\x00A\x00n\x00z\ \x00a\x00h\x00l\x00 \x00d\x00e\x00r\x00 \ \x00V\x00e\x00r\x00s\x00u\x00c\x00h\x00e\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Numb\ er of tries: \x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x04\x00O\x00K\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x02OK\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x1a\x00E\x00\ i\x00n\x00s\x00t\x00e\x00l\x00l\x00u\x00\ n\x00g\x00e\x00n\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0bPreferences\x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00,\x00D\x00r\x00\xfc\x00c\x00k\x00e\ \x00 \x00e\x00i\x00n\x00e\x00 \x00n\x00e\ \x00u\x00e\x00 \x00T\x00a\x00s\x00t\x00e\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0ePress \ new keys\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00B\ \x00P\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x00 \x00b\x00e\x00i\x00m\x00 \ \x00S\x00y\x00s\x00t\x00e\x00m\x00s\x00t\ \x00a\x00r\x00t\x00 \x00l\x00a\x00d\x00e\ \x00n\x08\x00\x00\x00\x00\x06\x00\x00\x00\x19Run \ Persepolis at st\ artup\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x12\x00S\x00\ h\x00o\x00r\x00t\x00c\x00u\x00t\x00s\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x09Shortcu\ ts\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x0c\x00G\x00r\x00\xf6\ \x00\xdf\x00e\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06\ Size: \x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x0c\x00S\ \x00t\x00a\x00t\x00u\x00s\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x06Status\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x0a\x00S\x00t\x00i\x00l\x00:\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x07Style: \x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00<\x00Z\x00e\x00i\x00t\x00\xfc\x00\ b\x00e\x00r\x00s\x00c\x00h\x00r\x00e\x00\ i\x00t\x00u\x00n\x00g\x00 \x00(\x00S\x00\ e\x00k\x00u\x00n\x00d\x00e\x00n\x00)\x00\ :\x08\x00\x00\x00\x00\x06\x00\x00\x00\x13Timeo\ ut (seconds): \x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x000\x00O\x00p\x00t\x00i\x00o\ \x00n\x00e\x00n\x00 \x00z\x00u\x00r\x00 \ \x00V\x00i\x00d\x00e\x00o\x00 \x00S\x00u\ \x00c\x00h\x00e\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14\ Video Finder Opt\ ions\x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\x16\x00L\x00a\ \x00u\x00t\x00s\x00t\x00\xe4\x00r\x00k\x00e\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08Volu\ me: \x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00,\x00D\x00o\ \x00w\x00n\x00l\x00o\x00a\x00d\x00 \x00O\ \x00r\x00d\x00n\x00e\x00r\x00 \x00\xe4\x00n\ \x00d\x00e\x00r\x00n\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x16Change Downloa\ d Folder\x07\x00\x00\x00\x0atex\ t_ui_tr\x01\x03\x00\x00\x00\x06\x00I\x00\ P\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x03IP:\ \x07\x00\x00\x00\x0atext_ui_tr\x01\ \x03\x00\x00\x006\x00P\x00e\x00r\x00s\x00e\x00\ p\x00o\x00l\x00i\x00s\x00 \x00D\x00o\x00\ w\x00n\x00l\x00o\x00a\x00d\x00 \x00M\x00\ a\x00n\x00a\x00g\x00e\x00r\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x1bPersepolis \ Download Manager\ \x07\x00\x00\x00\x0atext_ui_tr\x01\ \x03\x00\x00\x00\x0a\x00P\x00o\x00r\x00t\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x05Port:\x07\x00\ \x00\x00\x0atext_ui_tr\x01\x03\x00\ \x00\x00,\x00S\x00t\x00a\x00t\x00u\x00s\x00\ \x00d\x00e\x00r\x00 \x00A\x00u\x00d\x00\ i\x00o\x00d\x00a\x00t\x00e\x00i\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x1aAudi\ o file status: <\ /b>\x07\x00\x00\x00\x1bvideo_fi\ nder_progress_ui\ _tr\x01\x03\x00\x00\x00\x1c\x00M\x00u\x00x\x00\ i\x00n\x00g\x00 \x00S\x00t\x00a\x00t\x00\ u\x00s\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16<\ b>Muxing status:\ \x07\x00\x00\x00\x1bvideo_\ finder_progress_\ ui_tr\x01\x03\x00\x00\x00,\x00S\x00t\x00\ a\x00t\x00u\x00s\x00 \x00d\x00e\x00r\x00\ \x00V\x00i\x00d\x00e\x00o\x00d\x00a\x00\ t\x00e\x00i\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1aVideo file s\ tatus: \x07\x00\x00\x00\x1b\ video_finder_pro\ gress_ui_tr\x01\x88\x00\x00\x00\ \x02\x01\x01\ \x00\x00\x12\xb8\ \x00\ \x00?*x\xda\xbd[\x0dp\x1c\xd5}\xff[\xba\xd3\ \xc7\xe9t'\xcbB\xc8\xc68OB\x91\x8dl\x9fl\ a\x1bP\x85\x1c\xf9CX\x18\xc9\xc2g\xcb\x90\x14\xc4\ \xea\xf6\xddi\xab\xbd\xdd\xf3\xee\x9ed\xd1\x92!\xa9'\ S\x02\xd3\xe6\x03\x9b@i\x1b\x93\xb60`\x9aI2\ !\x09I\xc0\x04\xbb\x99&t\xa0\xe9\xc4I\xa6\xc0@\ c1%\xc3\x14Z\x12R\x0f\xd3i\xff\xef\xed\xde\xee\ \xdei?$\xdb\xe31\xe2\xdd\xc7\xfe?\xde\xff\xeb\xfd\ \xde\xff\xbd\xeb\xff\xae\xd8\xf6\x93\xf7\x1e;\xf6\xcf\xed\xab\ _\xb8\xfb\xc4\x0f_\x7f\x02\x00\xaa\xf4\x99\x1d\x00\xd1\xdb\ \xf1\xef\x0f\x00\xaaO\x9bc\xedQs\xdc2k\x8e\xd7\ \x7f\x03`\xb4\x0f\xc7; \xf2\xfd\x08\xc0\xc7[ \xf2\ \x0a\x1bG \xf2\xea\xc7q<\x0a\x91_\x9f\x02\xa8y\ \x03\x22\xefn\xc2\xf7\x1f@t\xd3^\xe4\x133\xc7\xae\ .\x88\x9e\x88\x02t\xef0\xc7\xad\x0f@\xf4\xe9\xbb\x01\ 6u@\xf4\x95\x1f\x03l8\x0f\xdd\x8c/\xf9%t\ 3~\xed-\xd0\xcd\xf8\xb4\xdf\x02\xeb\xd9\xf7\xed\xdf\x80\ \x9b\x8f\xa3n\xed\xf3\xb0g\xf6F\x80\x8e\xb3\xe6\xb8\xf1\ ^HG\xafA\xbd>\x03\xe3\x0f\x1e\x03H=\x0f\x87\ \xa4{P\xeeIs\xbca?\x1c:~\x1e\xdf\xbfn\ \x8e7\xdc\x07\xb7\xff\xe0\xdb\x00\xebz\xe0\xe1\xc7\x9bp\ nU\xf0\xa3g^\x05h\xfc\xd5\xb2eo\xff\x0c\xf5\ \xf8\xe6\xb2\xc9?\xf9s\x80\xa6\xbf\xa8Z\xf1\xe5\xaf\x02\ \xd4\x8dU\xa5\xf1k\xa8\xdfW\x95\x19\xbe\x0d\x9fk\xae\ *6l\xc5\xf9}\xc7\x1c{\xef\xad:\x96A\xf9\xcd\ /V=\xfa\xbb\x02@\xe2\xc6\xaa\x93W\x0d\x02\xacz\ \xa2\xea\xbbLN\xfb}U\xff\xd6\x88v\xd9\xf6P\xd5\ \x7fmH\x00\xb4E\xab\xce\x9f9\x83v\xfebu\xec\ \xb6e8\xfftu\xe3\xe6\xbb\x00b\xefW\xaf>\xd3\ \x8d\xfa\xb7V\xf7\xffi5\xea{C\xf5\xde\xa1_\xe3\ \xfc\xbec\x8e\x9b\xdf\xaa\x9e\x18F\xbb\xad\xff\xbb\xea\xe7\ ^{\x11\xe0c\x1d\xd5\xaf\xbd\x86v\x8a\x9f\xa9\x9e\x7f\ \x06\xe5\xaf\xd6\xab\xdf\xfd\xe2}\xc8\xff\xa9\xc8\x83/\x1b\ \x007\x1e\x8c|e\xf8\x078\xbf\xef\x9b\xe3\xa6g\xcd\ q\xdb[\x91\xbf>\xfas\xe4\xd7\x199\x91G\xb9\xad\ \xbf\x8d\x9c=\x84\xfa\xf5>\x1b\xad\xff\x9c\x80|\x1f\x89\ n~\xf9\x00@\xe7\xbf\x98c\xef\xf6\xe8D\x8a\x00\x5c\ 9\x19\x9dx\x12\xfd\x95<\x1d}\xf0$\xce\xbb\xa7\x10\ =Q\x87t[_\x88>y\xfb\x078\x9f\xfa\xe8S\ \x0f\xbc\x84\xfa\xb5\x99\xe3\xd6\xdf\xd7\x5c5\xfb<\xda\xfb\ \xbd\x9a\xfe\x9b\xd0\xce\xdb\xee\xaa\x19\xd9\xde\x09\xb0\xe2\xd5\ \x9a;7\xbf\x81QWU\xf3\xe8^f\xd7\xa35/\ \x9f\xfd\x1a\xc0\xdawk\xe6?\x86\xfe%\xc7k\xe67\ \xe3\xd8\xf9\xa5\xda\x96\xee5\x00\xd7\xaa\xb5+\x1f*\xa2\ \xbf\xbeW\xbb\xed\x15\x94_\x93\xae\xfdT\x17\xbe_\xbe\ \xb6VT\x9e\x03\x88\xe4j\xff\xf2N\x8c\x93-]u\ \x91\x9f\xfe\x16\xe0\x9a}u\xb9\x8d\x8f\x034\xdc[\xf7\ \xf4\xbf\xd7\xe3\xfbfs\xdc\xf4\x9b\xba\x1f\xff\x0c\xed\xbd\ \xe6\x97\xf5\xeb\x93\x9f\x00\xb8\xa2\xb7~\xa0\x11\xf5Y\xff\ \xbf\xf5\x87~\x81\xf6Xwg\xfd]\xf7\xff+\xea\xf1\ \xf5\xfa\xfcO\xd0\x8fk\xfa\xeb?\x9d@\xbd\x08\xa9?\ >\x84\xfc\x9bG\xebO\xfd\xf4 \xc6\xf1Is\xdc\xf2\ 7\xf5\xa7\xf7}\x19\xed\xf7L\xfd\xe9\xdc\xff\x01\x5c\xf5\ jl\xe2\x17\xe8\xdf\xfa\x97c\x13\x1f|\x84\xf1\xb9\x22\ &e\xff\x09\xe0\xea\x829v\xcf\xc5\xf4\x01\xb4K\xe4\ \xc5\xd8\x03/\xe1\x84r>c\x8e\x1b\xbb\x1b\xbe\ \xf6Z\x1c\xed\xfd\x0f\x0do\x9eX\x81\xf3~\xc3\x1c7\ ?\xd6p\xfe\xd8\xb7\xd0^\xf7\xc7\x97\xbd\xfdY\x8c\xef\ \xa9\xf8\xaa\xef\xa1\xff\xba_\x88\xaf[\x89\xf9v\xed\xf2\ x\xef\xa94\xfa/\x1d\xa7\xc9\x14~^e\x8e=O\ \xc7\xf5&\x8c\xa3\xf5\xfb\xe2\xc7\x0f\xa3\x9fc7\x9bc\ \xe2T\xfc\x11\x8az7\xdf\x1f\xff\xabQ\xf4_]\x22\ \xfe\xd4\xc9Z\xd4\xb75\xfe\xed\xcf\xe1\xe7\xa9O\x9a\xe3\ u/\xc5_\xff\x11\xc6\xf1\xdais\xdc\xf2\xab\xf8\x9b\ \xab0N\xae\xfbt\xfc\xa37?\x0f\xd0\xb2\xba1\xf2\ R\x06\xe3\xe1\xf3\x8d\xcbw\xf6\xa0\xfd\xf65\xfe\xe1\xef\ (\xfa\xbd\xab\xf1\xf0W0>p\xa6\x8f\x9c\xc7\xbaT\ \xfd\x1bslx\xdb\x1c\xbb\xde1\xc7\xd4\xfb\xe6x\xfd\ \xd9\x04\x91:0n\x7f\x9eH\x89\x7f\x8b\xdf\x1fJ\x5c\ ?\x8cv\x8eN$&\x8e\xbe\x85y\xf8?\x89#O\ \xb2\xfa\xf6^\xe2\xf4-h\xbf\xbaG\x13\xf3\x9b\xdf\x04\ Xy(\xf1\x1f\xa7\x1eA\xf9\xcd\xc9\x18\xb3\xdb\xf5\xcd\ \xc9m\xcf\xa2\xfd\x9b\xda\x92\xdb5\x9c\xe7\xca\xffN\xde\ \xbb\x1c\xfd\x12;\x96\xfc\xecW\xb1\x1e$\x13\xc9\xc7\x1e\ \xbe\x12\xf3MN\xfe\xfd8\xce\xaf\xf7\xfd\xe4\x13\xcf\xa2\ \xfd\x96\xbf\x93<\xf9)\x94\xd3\xf2<\x8e\xff\x89\xf1p\ ]\xf2\x8d?F9\x9b\xc7\x93\x1fTc<\xc0G\x12\ &\xe3Sh\x01\xf8\x12\xf4\x83\x00\x04\xa6@\x03\x0aY\ \xb8\x09_\x19\xf8\xaf\x00:\xf4A\x0f\xfe+\xe0\xe7\x1a\ \xbe\xa3\xf8J\x05\x19$|-B\x1eR\x90\xc3\xd7\x06\ >_\x84I|'\xe1\xb7\x03\x17E\xdd\x8f\xcf\x0b0\ P\xc7\x0c]\x83\x7f\xc3\xfd\x02\x99\xd2h\xf6\xa6)\xc3\ (\xe8}==\x05\xaa\xe9\xb4\xa0\xca\x92.\xe6S9\ \xc9\x98*N\xa6$u \xf8\xeb\xfe\x1ea\x00c\x01\ \x1a\x84I\xb5hL\x14\xa5\x09C[\xc6\xa6\xfeh\xe8\ \xd4\x0d\xfc\x5c\xc6\xbf\x1c>!p\xa5\xf3\xf8\xce\x7fR\ \x03\x17\xcd\xa1\xd2\x04#\x95&0\xa8Ls\x9a\x90O\ \xe5i\xd9|\x07\xc2\x1e\xb8(3\xccr_\x19\x5c\xe9\ \x14dP\xe5\xfc\x12\xcd\xb04\x0e\xe1f\x98\x95\x0c\x83\ j\xa9\x8c\x9a\xf71\x83\xcf\x03\xbefX\x05\xfbP0\ \x81\xb1\x85*\xd9j4\x0d2\x222f\xf3\xf3\xe4\xd4\ \x02\x07q\xa23\xc8!\x03\xd3\xc8A`\x86\xb5y\xc4\ v\xd1\x19*\xabL'O\xea8\xdc\x8a23H\xad\ \xb8$\xd7\xde*e\xa8\xa2SO\x92\x08\xaa\xbe\xd7~\ \xb4j\xdf^\xcf\xa7v\xc0(\x9f\x1aSH\xc4\x7f\x0a\ \x8aQ00u\xf4\x96\x80\xafL\xdfpe\xf1]\xb0\ !\xaerL@v\xa9\xb3\x8a\xac\x0a\x22\x19\x11\x14!\ G5O\xe1\xeb \xcd\x9d\x9dA6,#d\x14G\ \xf0O\xe06b\xaf$\xfei\x9f-\xa29]\xa0\x19\ I\x90\x891%(\xd3:1\xd4>O\xce\xadp\x96\ \xdb\x9a\xa9z\x8e\x87X\xb9\xbd\x1b\x0eh\x82\xa2\xcb\x82\ \xa1\xfa\x18\xbc\x1b\x0d~\x0e\xed\x90s\xa9Ap$\xa8\ \x98\xc0\xad\x92\xc3\xf9k\xf8\x89\xa3\xdc\xf2AQD\x8d\ HF0hN\xd5\xe6\xfa\x08c\xdd(\x88\xa2,)\ \xd3e\xcc\x07Q;f\xde\x8ce^\x11G\x82\xa3l\ \x19\x5c\xe1B$\x98qE\x998#(\x19*\x92}\ \x05CR\x15\xdd\x87w\x9c\xf3\x9eD\x1es`\xd8\xd4\ 5;\x19\xad\xecC\xb3\x01N\xa3D\x91kB\xf0\x95\ w@\xe4\xf1\x93\x02\x14l\x9e\xad;\xd1\x079\xea\xb8\ zH\x95E\xd3\xd3\x1e2:|\x03\xcd\xe2\xeb6d\ \x05K_C\xc6a\x0f\xae\x143\xf8'\xba\xc8\xeb\xf6\ P!\x88\xaa\x06\x861\x8e\x9d\xe7#\xc3c\xbe\xcf\xd6\ \xf18P`\xday\xfaV|\xc2\xe7\xe950\xc4\x0b\ \xbb\x16\xe2\xcc\xf8\x88\xaa\xd1\x10Gz\xe6\xaf\xc7s1\ \x9c\x0b\x8bD\xc35\xa3\xe8\x98\xaa\x19}\x01\x04\x1a\x92\ \x1c\x819\x17\x81\xa6\x1e\x99\xf3!h\x85\xfd|\x0d\xa0\ \xbc\x0a\x94\xaa\x81#-\xb6\x9ff\xa9\xa6\x05X|5\ \x06\xa5\x82~:\xc7\xc3L\xe0\x15\x17\xc3\x7f\x87\xc5\x7f\x07\xe7\x7f\x0es^\xe1\xdc\ M\x10%\xda\x19K`\xde\xf2\x88\x8e\xe3\xbc\xe7\xf4V\ \xa3\xf4\xdd\xba!\xe5\x11N!\xae\x92\xf2\x94\xc84k\ ,F\x8d\x0b*<\xbe\xdc\xee\xb6\xb91O\xeb<\x1b\ \xdaq\x0a\xbb\xd0G&\x1eT\xca\xea\x86\xc1\xc3l\xd2\ \x0a;\xc2\xa7(\xd8+\x9f\x08\x1b\x91\xe6C\xce\xa3\xb2\ \xd2ndeK\xd5\xb4\xb9vr\x87ZD \xc9\xaa\ \x88F\xf3*V2\x91f\x85\xa2l\x90\xc3EZ\xa4\ N\xf1\xf5\xd5z\xb5k1c\xf8\xa3\x88z,\xb4C\ \x92I4\x04\xa3\xb8\xa8\xf0)\xad%%pm\xe6\xab\ \xbbj\xe8\xdc\xd19|\xcdj\xe3By\xad(\x8fc\ oD\x0cDC\xcf.F\xec\x102\xcaXp\x81\x89\ \x1d\xe0\xe5\xda\x84\xe4\x22wB\xd62\xb6\x83\xf6\xb7s\ \xe1eT\xb6\x12\xd7\xf6\xe3\xb6\x09\xcb\x11\x067\x99C\ ;\xcf\x0a\x8a\xc1\x81\xbb\xaa\x18\x92R\xa4\xdb\xfb{\xac\ \x07\xc2R\xd6\xbb\x80\x9a\xe52\xcb\x97\x0d\x91\x99\xc3\x03\ \xd9\x96\xd6\xd1\x0b\x93@\xb0\xaa\xcd\xa3i\x99\xf9\xff\x88\ \x99\xddq\xa8-\x01\xdd\xaa\x19z0\xff\x0d\x813(\ \x05\xae\x99\xc3\xce\xee\xa9\xc9%C-\x14\xa8\x18,$\ \x86\x0e\xa4\xdcY\x1b\x1d\x10\xb4[\xd3T\x8dl\x0c\xf1\ |\x9dE\xea\x04P-'\x0c\x8b\x98\xd5p3\xda&\ \x1f\x06\xc3\xf7H\x22%\xaa\x03\xc3\x83\x22\x7f\x84\x9bF\ \xe2(\xc0\x5cH\x9c}\xa1\x80\x19\xcdY\xf3~\x06\xe5\ \x81\xc8\xdc/\xbb\xb6`W\x8eH\x8a\x94G\xd4\xc8\x22\ M\x9f\xd3\x0d\x9a'\x86&\xcc\x05\xcbm\xe1;\x8a9\ \xabK\xc2\x9c\x82Ae\xf3\xac\x1fQg$%G\xa4\ \x10\xedW\xe1>I\xb2\x12\x83\x95z\xdd\xa9W\x0e\xaf\ Q\xd5@\xd8PT\xc4\xb0j\xb8\xcb\xc2=\xeeU\xd0\ ]\xfdL\xab\xb0\xf2o\xb6:X=0l\xfc\xc4\xe8\ 4K\x1b\xc2W9\xb6U\xcd\xf3oI\xd9~z%\ \xd3\x88*j17E\xb2\x1a\xa5D/\x08\x19J$\ \xa5/X\xc3\x14\x9cA\xae9+\xfdL\xab1\x1bf\ x\xad\xae\x98\xbfk\xd5\xbe\x1a!\x14\x96$\x0c\x06\xac\ \x08:QP\xba^\xccd\x10\xbae\x8br\xc8\xea\xfd\ \x05\x84\xf8\x05+2\x0c\xde\xb7T\xc2%\xe3\xebq\xbe\ B\xc96\x864\x93N\xe5\xb0E\xb00\xa8b!#\ \x99\xa7\xbab5\x0b*\xfb\x10\x8a\x8d\x9f\xf4\xb2]\xd5\ \x9e\xc0Y\x911\x99\x0a:\x9a\x16\x13\x19\xa1*%Y\ U\x96\xd5Y\x16T\xa56\x06\xc9J\x9an\x84e\xdc\ \x96\x0b0@jq\xa6O\x85\xa5H\x10\x5c\x8c\x95\xf7\ \xe5\xfc\xd9t{\xb1\xb1\xfcq\xceZ\xe1,8\xee\x89\ z\xf1?}\xaah\x18\xcct\x0c\xe6\x06K;\xe0\xe1\ \xf9\x12$*r\xef\x1bK\xf6\xbf\xe3\xf3.\xcb\xab\x1a\ \xd5\x8b\x08\x9b\xbc\xfd\x1a\xe6\xd1\xdbC\x83\xd3ooR\ \xe0\xfd\x85\x0c\xf7\xb6\xee\x9a\x80\x19\x9a\x8e\xd7;\xdd\xc1\ W\xda\x1a\x90\x82\xa6\xe6Pq\xdd\x8c\xbb\x10\xe7\x7f\xf2\ 2dP\xf7\xa5\xca\x91\xd1K\xaal\x9f\xb7\x1d/\xcc\ \xd9\x93\x17\xa1\x9a\x12\x08\x82\x96dO;\x08\x16e\xcf\ U\xb0\x97\x03\xe9\x05H\xc5U\xd4\x13\xb71\xbc\x5c\x02\ *!U|\x8d\x8bayW\x84\x85\xb2\xc3\xb4\xc9d\ \x9a\xb1{!\xc1l\x19\x08\x9f\xe6\xfd\xfbin\xca\x19\ \x8eJ\xc4\x80\x1c\x12\xf86\xd8ZJ\x9dFL\x9a*\ \x22\xd1\xa9\x8c;>\xdc\x12\x95\x8c\xc5\xda\xe0\xc1\x0a\xb4\ V(P\xc9\xb8\x963\x0e\xe3\xd2\xe9\xea\x92L\xd9}\ \xd7,\xb7\x98\xce\xd7q\xea\xc2;Mi\xd6\xfd`\xcc\ \xc8!\xce-\xcc\xf4\x0e\xf3@\xcc\xc6\xd9.\x0a\xb3\x8d\ {\xeeS\xcc\xb8\x14\xf0\x1bf\xfcy\xeb\x10\x8e`\xa4\ ObTS\x8e\xe4\x16\x87\x17\xd6\xa7U,\xae\x12\x02\ 9\x9d\x88\x92\xc8\xf6j\x86\xb5\xb5\xd1\xd0=\xce\x02&\ \xcf\xb5\x87\x05r\xba\xa2I\xc1\xfa\xadF\xd9ZS\x9b\ fm\x8a\xc9\x10\xbc\xf8\x09\xabyY\xcaZ\x81c\xb1\ \xb0@s\xb2\xd4\x99\xddJ\x962D\x90eW\x9c\xf1\ \xac\x0c\x99\xcbX\x85\x06\x97\xaen\x5c\x93\xbe\xd8\x82\xd1\ \xca\xf7\xa8\x84\xb7\x1cd\xde;VY\xc7\xd39\x16\x9a\ \xa4\xa4\x800\x047\x7f!\xb3\xdc\x86\x1af\x91\xbe\xc0\ K2\xb1:\x84\x0e\x0a\x96\xac\x9c0\xed_:\xe4q\ $\xb5e\xb3\xf9\x02e\xc8\x9d\x83\x1dI\xd1\x0d4u\ h%\x89\xd9g\x87\x0e\xab\xfa,n,\xf4\xa9P\xda\ VT\xb7\x08G\x5c\xebtE',_<\xc2LJ\ \xd9\x06+\x0c\xec\x896\x82\xd71St>\xeb\xbc\xb5\ -%\xd0\x0b\x9b\xf87,\x9b\x8a\x96\xbf\x9dH^\x89\ {n\xad\xb4\x05\xc2\xf2\xd0\xbb\x09k\x1a\xee\xbdE=\ \x0c\xe8\xb1^a\xa9eU\x89\xc5\xea\xbbJ\xbbR\xde\ \xc5sqq\xf7\xd4\xbb\xf8Y\x86h\xadr\xe8\x15\xe7\ \x08\xa4k\xb7(\x19\xfe\xb4q\xa4\x1dD\x8a\xe9\xb2r\ \x14\xedb=\xf8`\xaa=\x18\xf5l/XpQ\xed\ \xa1r\xc1\x9f\xaa\x06\xa9p%r\x8e\xef\xba\xf8\x82\xe3\ O\x10C\x02\xab~\xba\x84\x8cKt\xd6\x9f\x86\x9dJ\ \xe4\x9d\xa7\xf9)\xb6\xff\xd3[<\x0fD\xfd\x10\xa0\x5c\ qhv\x05;\x1a\x1d\xa5\xb3No\xb8t\x8a\xe6-\ \xad\x03v\x97\x0a\xa0\x9f\x14g\x85\x1fd\xade\xbb\x12\ \x04y\x7f\x9c3\x9a\xb60\xbd{\x05\x8c\x0e\x16\x0a\xf2\ \x9c?m\x13\xfa\xa3\x0c\x809\x9d\x8c\x9d\x16\xc4\xf2'\ \xbe\x85\x07\x9d\xe2Z\xddd\x8f%G\xf2\x99\xa9nm\ E8\xc2\xb1\xc5\x92\x9d\x08\xa24^\x9f\xcd\x15\x08\x13\ \xc9.\x86\xb8\x1f\x09pe\x9b_\x8f\xd9\xa9\x83\xae\xb6\ \xb2?\x9f\x14G\x15\x82\xbd\x19\x98\x0b\x08\x88iW4\ \xaf\xdc\xa9Q\xb4\x19Q0\x1el\x95\x0f\x07\x07xs\ @\xe6\xd7\x85'~\x8bW\xc7\xdbu\xfb\xc2nr\x07\ E\x80_\xe5\x88\x04\x17\x8e\x04?\x91/\x99\xdbMv\ $\x88,\xe6Qm\x22\xc1\xc5&Q~,\xea\x94F\ ~N8*\xe4\x03+\xc8\xc22\x15\x09\xaeR\x01g\ \xe3~Y=\x86\x9a\x15\xad<\x08\xc9\xea1\xa1\xa8;\ \x97\x0b\x82&=fo7\x15\x17\xfed\x1b\x7f\xd6\xc5\ \x15r\x01\xb3\xbe\x9cG`~\x91\xb9\xdb\x02=\xba\x95\ L\xee\xd0n\x18\xd3\xd8\xd9:U\x10I\x06\x85\xe6\x90\ u\x93,\x87\xcb\xaf\xdb\x8auc\xd6f\xfaB\x15\x88\ !\x83\x02\xd5\x10\x12\xe9A+\x89{\xb1\x8a\x86\xacU\ ]p\xa0\xe2\x80\xa4\x04\x11K\x07\xad\xfcx\xc4\xe9\x99\ \xef7\x0f@\xf8AjH\x99\xe8\xf49\xf3\xa3\x16X\ )G\x14\xad\x08\xd3\ Xifq\x95\xe17$\xd8%.\xc7\xe8\x89\x9d\xaa\ \xacjD\xcfL\xd1<\xb5n@.\xe4\xb2\xf4\xdd\x9b\ \x07\x93KX)<\xb87/(\x14\x86\xdf^\xcb\x83\ zq\xbb\x18O\xb1\x07\xd0\xf3\xec\xf7\x05\x8a\xd5\x9dr\ l[3\xa4\xda\xb7J\xbdD\x0e\xdbp\xcb]yj\ \x873v\xa5\xf1 \xeb\xb0\x04\x96\xda\xc9\x02\xc7a:\ gb\xda\xd3u\x97jT5\xa4\xac\x941\x0f9\x8d\ \xb9\x82\xbf\x87[y\x1c\x973r\xfb\xb7\xd1\xcd\xca\xcf\ \x07\x97\xba\xd0z\x88X\xb3@D\xa9k\xcb\xd6_\xd7\ un\x87\xad\xa1\xe1F\xc2\x97\xa1\xf7\x95g/w-\ j\xcb\xe7A\xb9\xb4\xdd\x96\x07\x83m\xfc\x84\xc8\xe7\x8e\ \x22?\xda1\xaf\xb9\x99u\x5c/\x95<\xa7\xf7\xb1\xbf\ \xa8\xb8\xca\x19\x11\x0c\xc2K\x5c\xb1\xe0;\xd7\x10 \xed\ Y\xd4\xcao0\xbb\xd2\x80Q\xf9\xda?\x14\xdez\x96\ \xc1\xb4\xd5\x0ft\xa5M\xda\x98\x93\x83\xc4\x8cs\x8b\xb1\ [\x1f\xae%g\x5c\x95\x8b\x01u\x8f\x04\xfc\x22\xe3\xc3\ \xb2\xe3\xd0\x84\xf5;\x0c\x8esM~1\x83\x1e1\x96\ \xb2TT\x12\xac\xe6\x04y\xee\xcdi{sb\xb5\xf2\ \x1c\x94\xb9\x8b\x9a\xa7sdP\xf6dS\xf9\xd3\x83\xea\ \xe1\xb1>o\xfdJW\x17\xdd\x89\x1fe\xed\x15\xdd\xeb\ y\xcf\xcc\xa9|\xe8r\xa2\x9cJ\xd9\xc1\xbfR\xf0z\ \xda\xff'\x0a\x95O\xb7\xc1H\x88_b\xe9@\xaf\xac\ \x83=h\xed\xbc\x95\xac\xa5\x8bJ\x12\xbe\xdb\xc8M\xc4\ n\x17\xa6\xd8?\xe7\x1a\xe3\x1052S\xec\xb4d\x84\ \x8a\x92@\x86\x95\xac\x9aJ\xf1\xbb\x0a+\xe6\x8c\xd2\xcf\ \x16\x16\x9ep\x9e\xe3G`\xee~\x043J\xbel\x85\ LZ\xca\x0a$\xabjy\xc1\xf0e\xfag\xcc\xd5\xcb\ \x96\xfd?\xa9\xcetQ\ \x00\x00L\xca\ <\ \xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\xa7\ \x00\x00\x00\x02koB\x00\x00\x05\xc0\x00\x00\x05;\x00\ \x00\x08\xfc\x00\x00\x05;\x00\x00\x0e\xcb\x00\x00\x05;\x00\ \x00=^\x00\x00N:\x00\x00C\xd0\x00\x04\xcf\x04\x00\ \x00!I\x00\x04\xd9\x90\x00\x00\x0d\x9a\x00\x04\xe3\xc0\x00\ \x00\x0d\xf9\x00\x050K\x00\x00\x0e'\x00\x05\xab`\x00\ \x00(2\x002v\xee\x00\x009\xd8\x00Hw9\x00\ \x00 u\x00Hw9\x00\x00%R\x00M\x99S\x00\ \x00\x0d\xc8\x00O\xc5g\x00\x00?[\x00R\xd9$\x00\ \x00\x1a\xc2\x00V\x8c\x95\x00\x00'\x02\x00Wiz\x00\ \x00\x0e\xf3\x00Wiz\x00\x00D\x97\x00W\x96\xf9\x00\ \x00\x0f \x00]6\xbe\x00\x008\xf4\x00\x97\xa2\x10\x00\ \x00\x09\xff\x00\xb7\xbb\x02\x00\x00\x0b\xe9\x00\xc2\xad\xd0\x00\ \x00\x15\xb6\x01\x18\xab\xd4\x00\x00 \xa7\x010\x8d\xae\x00\ \x00+w\x01w&\x82\x00\x007\x1a\x01\x8bp\x0e\x00\ \x00.\x83\x01\xe1\xc2\xec\x00\x00?\xfa\x02/@\xf0\x00\ \x006J\x02S\xd0\x00\x00\x00\x116\x02\x95c\x03\x00\ \x00!v\x02\x9a\xf5p\x00\x00\x16\x0e\x02\xaag'\x00\ \x00$J\x02\xf1\x09\xf0\x00\x00\x16u\x02\xf9\xc5\xc5\x00\ \x00\x08\xcd\x03\x0d1^\x00\x00\x12\xc3\x03\x1c\xc5*\x00\ \x00&\x08\x03<\x83\x03\x00\x00\x0eQ\x03KF\xe3\x00\ \x00%\xc7\x03KF\xe3\x00\x008o\x03\x92\xd2\xce\x00\ \x00:_\x03\x9a[4\x00\x00\x0c\xb7\x03\x9a[4\x00\ \x00C'\x03\xdc\xdc%\x00\x00\x13\xed\x03\xdc\xf5\xc3\x00\ \x007\xf4\x04\x0dB\x0e\x00\x00\x1b\x81\x04\x19\x82N\x00\ \x00\x1d?\x04E\xb2\xc0\x00\x00A\xe5\x04]I3\x00\ \x00=\xbb\x04e\xac\xf5\x00\x00!\x12\x04f\xd7n\x00\ \x00\x03{\x04g\xac\xf5\x00\x00\x0df\x04\x98I\xbc\x00\ \x00\x0a\x84\x04\x98I\xbc\x00\x005w\x04\x9c(\xe1\x00\ \x00!\xb3\x04\x9e\x84\xd5\x00\x005\xa3\x04\xcbXj\x00\ \x00\x0e\x89\x04\xcbXj\x00\x00C\xf8\x04\xcb\xfd\x9e\x00\ \x00\x01\xe2\x04\xd6W\xc0\x00\x00:/\x05\x13\xccT\x00\ \x00\x1bG\x050N\xc0\x00\x00&\x8b\x05O\xa2\x10\x00\ \x00\x0d\x19\x05O\xa2\x10\x00\x00C\x86\x05_. \x00\ \x00\x19\xe3\x05_\xa8`\x00\x00\x17\x12\x05c\x9c>\x00\ \x00\x1cG\x05c\x9c>\x00\x00E\xb7\x05i<\xfe\x00\ \x00\x1c\xf5\x05t\x96\x00\x00\x00\x0fM\x05t\x96\x00\x00\ \x00D\xc1\x05v\x1b\x9e\x00\x00\x14(\x05\x83\x80e\x00\ \x00\x10!\x05\x8c\xac5\x00\x00'\x96\x05\xa1\x08\xc0\x00\ \x00@?\x05\xa3\x9c>\x00\x00\x1c\x9e\x05\xa3\x9c>\x00\ \x00F\x19\x05\xa8X\xf3\x00\x00\x08\x1a\x05\xaa\x8b\xc3\x00\ \x00@o\x05\xc63\xee\x00\x00\x02\xad\x05\xd0)\xae\x00\ \x00/\x8a\x06-B\x0e\x00\x00\x1b\xe4\x06-B\x0e\x00\ \x00EI\x069\x82N\x00\x00\x1d\xa2\x069\x82N\x00\ \x00F{\x06:\xd1\xf2\x00\x00?\xb8\x06<=\x10\x00\ \x00A\xb3\x06]1\xde\x00\x00\x06H\x06\x9aK\x00\x00\ \x00\x11k\x06\x9a\xf5C\x00\x00>\x99\x06\x9c(\x01\x00\ \x00;\xe0\x06\xb6\xbe`\x00\x00\x0b\x00\x06\xc5)*\x00\ \x00&B\x06\xcc\xd6\xa3\x00\x00#6\x06\xdcS\xa3\x00\ \x00\x0bJ\x06\xef\xbcp\x00\x00\x0cl\x06\xef\xbcp\x00\ \x00B\xdf\x07\x14*\x1e\x00\x00#\xaf\x07\x1d\xe0`\x00\ \x00A\x19\x076\xcd`\x00\x008\xaf\x076\xcd`\x00\ \x00B\x9d\x076\xcf`\x00\x00\x0b\xa6\x07[&u\x00\ \x00\x17\xbb\x07\x9b]0\x00\x00=\x1d\x07\x9c1\x03\x00\ \x00Ag\x08 Hn\x00\x00\x07O\x08g-\xa2\x00\ \x00\x132\x08\x95 \xa3\x00\x00\x08d\x08\xf6\x88`\x00\ \x00\x0f\x93\x08\xf6\x88`\x00\x00E\x04\x09>\x0d$\x00\ \x00$\xc2\x09^\x89\xd3\x00\x00#\x03\x09`\x06\xb5\x00\ \x00$\x89\x09b\x06\xb5\x00\x00\x10U\x09g\x01\xd0\x00\ \x00@\xce\x09|\xf4.\x00\x003\xcd\x09}R\xc0\x00\ \x00\x0c)\x09\x8ct\xd3\x00\x00>\x5c\x09\x93\xd2\xfe\x00\ \x00%\x82\x09\x96F0\x00\x00\x18\xb0\x09\xb8\x7f\xb1\x00\ \x00\x00\x00\x0a\x06e~\x00\x006\xd3\x0a\x0c\x87\x0e\x00\ \x00)\xc8\x0aErt\x00\x00>\xca\x0a_\xd7\x0e\x00\ \x00\x11\xab\x0a_\xf3\xfb\x00\x00\x1f\xda\x0as>\xc3\x00\ \x00\x09\x83\x0a\x8b\xc3`\x00\x00'\xff\x0a\x97\x00\x80\x00\ \x00\x10\xe6\x0a\xa2Yp\x00\x00=\xf9\x0a\xc0(\x90\x00\ \x00@\x9b\x0b`r`\x00\x00\x00F\x00F\x00m\x00\ p\x00e\x00g\x00 \xd5\x04\xb8\x5c\xc8\x1d\xd2\xb8\x00\ <\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ ;FFmpeg\ project\x07\x00\x00\x00\ \x0babout_ui_tr\x01\x03\x00\x00\ \x00r\x00<\x00a\x00 \x00h\x00r\x00e\x00f\ \x00=\x00h\x00t\x00t\x00p\x00s\x00:\x00/\ \x00/\x00g\x00i\x00t\x00h\x00u\x00b\x00.\ \x00c\x00o\x00m\x00/\x00p\x00s\x00f\x00/\ \x00r\x00e\x00q\x00u\x00e\x00s\x00t\x00s\ \x00>\x00R\x00e\x00q\x00u\x00e\x00s\x00t\ \x00s\x00 \xd5\x04\xb8\x5c\xc8\x1d\xd2\xb8\x00<\x00/\ \x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00<Requests p\ roject\x07\x00\x00\x00\x0ba\ bout_ui_tr\x01\x03\x00\x00\x00p\ \x00<\x00a\x00 \x00h\x00r\x00e\x00f\x00=\ \x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\ \x00g\x00i\x00t\x00h\x00u\x00b\x00.\x00c\ \x00o\x00m\x00/\x00y\x00t\x00-\x00d\x00l\ \x00p\x00/\x00y\x00t\x00-\x00d\x00l\x00p\ \x00>\x00Y\x00T\x00-\x00D\x00L\x00P\x00 \ \xd5\x04\xb8\x5c\xc8\x1d\xd2\xb8\x00<\x00/\x00a\x00>\ \x08\x00\x00\x00\x00\x06\x00\x00\x00;YT-DLP projec\ t\x07\x00\x00\x00\x0babout_\ ui_tr\x01\x03\x00\x00\x00\x92\x00<\x00a\x00\ \x00h\x00r\x00e\x00f\x00=\x00h\x00t\x00\ t\x00p\x00s\x00:\x00/\x00/\x00p\x00e\x00\ r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00\ d\x00m\x00.\x00g\x00i\x00t\x00h\x00u\x00\ b\x00.\x00i\x00o\x00>\x00h\x00t\x00t\x00\ p\x00s\x00:\x00/\x00/\x00p\x00e\x00r\x00\ s\x00e\x00p\x00o\x00l\x00i\x00s\x00d\x00\ m\x00.\x00g\x00i\x00t\x00h\x00u\x00b\x00\ .\x00i\x00o\x00<\x00/\x00a\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00Iht\ tps://persepolis\ dm.github.io\ \x07\x00\x00\x00\x0babout_ui_tr\ \x01\x03\x00\x00\x00\x9a\x00<\x00a\x00 \x00h\x00r\ \x00e\x00f\x00=\x00h\x00t\x00t\x00p\x00s\ \x00:\x00/\x00/\x00t\x00e\x00l\x00e\x00g\ \x00r\x00a\x00m\x00.\x00m\x00e\x00/\x00p\ \x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\ \x00s\x00d\x00m\x00>\x00h\x00t\x00t\x00p\ \x00s\x00:\x00/\x00/\x00t\x00e\x00l\x00e\ \x00g\x00r\x00a\x00m\x00.\x00m\x00e\x00/\ \x00p\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x00d\x00m\x00<\x00/\x00a\x00>\ \x08\x00\x00\x00\x00\x06\x00\x00\x00Mhttps://teleg\ ram.me/persepoli\ sdm\x07\x00\x00\x00\x0babou\ t_ui_tr\x01\x03\x00\x00\x00\x9a\x00<\x00\ a\x00 \x00h\x00r\x00e\x00f\x00=\x00h\x00\ t\x00t\x00p\x00s\x00:\x00/\x00/\x00t\x00\ w\x00i\x00t\x00t\x00e\x00r\x00.\x00c\x00\ o\x00m\x00/\x00p\x00e\x00r\x00s\x00e\x00\ p\x00o\x00l\x00i\x00s\x00d\x00m\x00>\x00\ h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00\ t\x00w\x00i\x00t\x00t\x00e\x00r\x00.\x00\ c\x00o\x00m\x00/\x00p\x00e\x00r\x00s\x00\ e\x00p\x00o\x00l\x00i\x00s\x00d\x00m\x00\ <\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ Mhttps:\ //twitter.com/pe\ rsepolisdm\x07\x00\ \x00\x00\x0babout_ui_tr\x01\x03\ \x00\x00\x00p\x00<\x00a\x00 \x00h\x00r\x00e\ \x00f\x00=\x00h\x00t\x00t\x00p\x00s\x00:\ \x00/\x00/\x00w\x00i\x00k\x00i\x00.\x00q\ \x00t\x00.\x00i\x00o\x00/\x00Q\x00t\x00_\ \x00f\x00o\x00r\x00_\x00P\x00y\x00t\x00h\ \x00o\x00n\x00>\x00P\x00y\x00s\x00i\x00d\ \x00e\x00 \xd5\x04\xb8\x5c\xc8\x1d\xd2\xb8\x00<\x00/\ \x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00;Pyside pr\ oject\x07\x00\x00\x00\x0bab\ out_ui_tr\x01\x03\x00\x00\x00\x1a\x00\ P\x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00\ i\x00s\x00 \xc8\x15\xbc\xf4\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x10About Persepo\ lis\x07\x00\x00\x00\x0babout_ui\ _tr\x01\x03\x00\x00\x00\x0a\xac\x10\xc0\xac\xc7X\x00\ \xae\x00\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fAck\ nowledgments\x07\x00\x00\x00\ \x0babout_ui_tr\x01\x03\x00\x00\ \x00\x06\xac\x1c\xbc\x1c\xc7\x90\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0aDevelopers\x07\x00\x00\x00\ \x0babout_ui_tr\x01\x03\x00\x00\ \x00\x08\xb7|\xc7t\xc1 \xc2\xa4\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x07License\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ \x04\xd6U\xc7x\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02O\ K\x07\x00\x00\x00\x0babout_ui_t\ r\x01\x03\x00\x00\x00&\x00P\x00e\x00r\x00s\x00\ e\x00p\x00o\x00l\x00i\x00s\x00 \xb2\xe4\xc6\ \xb4\xb8\x5c\xb4\xdc\x00 \xad\x00\xb9\xac\xc7\x90\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x1bPersepoli\ s Download Manag\ er\x07\x00\x00\x00\x0babout_ui_\ tr\x01\x03\x00\x00\x00\x06\xbc\x88\xc5\xed\xc7\x90\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0bTranslat\ ors\x07\x00\x00\x00\x0babout_ui\ _tr\x01\x03\x00\x00\x00\x18\xb2\xe4\xc6\xb4\xb8\x5c\xb4\ \xdc\x00 \xb9\xc1\xd0l\x00 \xcd\x94\xac\x00\xd5X\xae\ 0\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Add D\ ownload Link\x07\x00\x00\x00\ \x0daddlink_ui_tr\x01\x03\ \x00\x00\x00\x16\xcet\xd1L\xac\xe0\xb9\xac\xc5\xd0\x00 \ \xcd\x94\xac\x00\xd5X\xae0\x00:\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x11Add to categ\ ory: \x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x00\x0a\xac\xe0\xae\ \x09\x00 \xc65\xc1X\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x10Advanced Option\ s\x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00\x04\xcd\xe8\xc1\x8c\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x06Cancel\x07\x00\x00\ \x00\x0daddlink_ui_tr\x01\ \x03\x00\x00\x00\x18\xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00 \xd3\ \xf4\xb3T\x00 \xbc\xc0\xac\xbd\xd5X\xae0\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x16Change Do\ wnload Folder\x07\x00\x00\ \x00\x0daddlink_ui_tr\x01\ \x03\x00\x00\x00\x16\xd3\x0c\xc7|\x00 \xc7t\xb9\x84\x00\ \xbc\xc0\xac\xbd\xd5X\xae0\x00:\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x12Change file\ name: \x07\x00\x00\x00\x0daddl\ ink_ui_tr\x01\x03\x00\x00\x00\x1e\xc2\ \xdc\xc2\xa4\xd1\x5c\x00 \xd5\x04\xb8]\xc2\xdc\x00 \xc1\ $\xc8\x15\x00 \xac\x10\xc9\xc0\xd5X\xae0\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x1cDetect Sy\ stem Proxy Setti\ ngs\x07\x00\x00\x00\x0daddlink_\ ui_tr\x01\x03\x00\x00\x00\x10\xb2\xe4\xc6\xb4\xb8\ \x5c\xb4\xdc\x00 \xd3\xf4\xb3T\x00:\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x11Download Fo\ lder: \x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x00\x10\xb0\x98\ \xc9\x11\xc5\xd0\x00 \xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0eDownload\ Later\x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x00\x12\xb2\xe4\ \xc6\xb4\xb8\x5c\xb4\xdc\x00 \xb9\xc1\xd0l\x00:\x00 \ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fDownlo\ ad link: \x07\x00\x00\x00\x0dad\ dlink_ui_tr\x01\x03\x00\x00\x00\ \x16\xbeD\xbc\x00\xbc\x88\xd68\x00 \xb2\xe4\xc6\xb4\xb8\ \x5c\xb4\xdc\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x13Download passwo\ rd: \x07\x00\x00\x00\x0daddlink\ _ui_tr\x01\x03\x00\x00\x00\x22\xc0\xac\xc6\xa9\ \xc7\x90\xc7t\xb9\x84\x00 \xbc\x0f\x00 \xbeD\xbc\x00\ \xbc\x88\xd68\x00 \xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1eDownload\ username and pa\ ssword\x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x00\x18\xc0\xac\ \xc6\xa9\xc7\x90\xc7t\xb9\x84\x00 \xb2\xe4\xc6\xb4\xb8\x5c\ \xb4\xdc\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x13\ Download usernam\ e: \x07\x00\x00\x00\x0daddlink_\ ui_tr\x01\x03\x00\x00\x00\x0a\xc8\x85\xb8\xcc\x00\ \xc2\xdc\xac\x04\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08E\ nd time\x07\x00\x00\x00\x0daddl\ ink_ui_tr\x01\x03\x00\x00\x00\x08\x00\ H\x00T\x00T\x00P\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x04HTTP\x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x00\x0a\x00H\x00\ T\x00T\x00P\x00S\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x05HTTPS\x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x00\x08\x00I\ \x00P\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x04\ IP: \x07\x00\x00\x00\x0daddlink\ _ui_tr\x01\x03\x00\x00\x00\x04\xb9\xc1\xd0l\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x04Link\x07\x00\ \x00\x00\x0daddlink_ui_tr\ \x01\x03\x00\x00\x00\x0a\xcd\x94\xac\x00\x00 \xc65\xc1X\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0cMore O\ ptions\x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x00\x0a\xc5\xf0\ \xac\xb0\x00 \xc2\x18\x00:\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x16Number of conn\ ections:\x07\x00\x00\x00\x0dadd\ link_ui_tr\x01\x03\x00\x00\x00\x04\ \xd6U\xc7x\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x00\x06\xd3\xec\xd2\xb8\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x05Port:\x07\x00\x00\ \x00\x0daddlink_ui_tr\x01\ \x03\x00\x00\x00\x06\xd5\x04\xb8]\xc2\xdc\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x05Proxy\x07\x00\x00\x00\x0da\ ddlink_ui_tr\x01\x03\x00\x00\ \x00\x14\xd5\x04\xb8]\xc2\xdc\x00 \xbeD\xbc\x00\xbc\x88\ \xd68\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x10\ Proxy password: \ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x00\x16\xd5\x04\xb8]\xc2\xdc\x00 \ \xc0\xac\xc6\xa9\xc7\x90\xc7t\xb9\x84\x00:\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x10Proxy us\ ername: \x07\x00\x00\x00\x0dadd\ link_ui_tr\x01\x03\x00\x00\x00\x12\ \xc7t\x00 \xac\xbd\xb8\x5c\x00 \xae0\xc5\xb5\xd5X\ \xae0\x08\x00\x00\x00\x00\x06\x00\x00\x00\x12Reme\ mber this path\x07\x00\ \x00\x00\x0daddlink_ui_tr\ \x01\x03\x00\x00\x00\x0c\x00S\x00O\x00C\x00K\x00S\ \x005\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06SOCK\ S5\x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00\x0a\xc2\xdc\xc7\x91\x00 \ \xc2\xdc\xac\x04\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aSt\ art time\x07\x00\x00\x00\x0dadd\ link_ui_tr\x01\x03\x00\x00\x00\x1c\ \x00<\x00b\x00>\xd3\x0c\xc7|\x00 \xc7t\xb9\x84\ \x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x12File na\ me: \x07\x00\x00\x00\x18aft\ er_download_src_\ ui_tr\x01\x03\x00\x00\x00\x16\x00<\x00b\x00\ >\xd0l\xae0\x00<\x00/\x00b\x00>\x00:\x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dSi\ ze: \x07\x00\x00\x00\x18aft\ er_download_src_\ ui_tr\x01\x03\x00\x00\x00\x04\xd6U\xc7x\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x08 OK \ \x07\x00\x00\x00\x14after_down\ load_ui_tr\x01\x03\x00\x00\x00\x0a\ \xd3\x0c\xc7|\x00 \xc5\xf4\xae0\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0d Open File \ \x07\x00\x00\x00\x14after_down\ load_ui_tr\x01\x03\x00\x00\x00*\ \x00<\x00b\x00>\xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\xac\x00\ \x00 \xc6D\xb8\xcc\xb4\x18\xc5\xc8\xc2\xb5\xb2\xc8\xb2\xe4\ \x00!\x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1aDownload \ Completed!\x07\x00\ \x00\x00\x14after_downloa\ d_ui_tr\x01\x03\x00\x00\x00\x16\x00<\x00\ b\x00>\xb9\xc1\xd0l\x00<\x00/\x00b\x00>\x00\ :\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d\ Link: \x07\x00\x00\x00\x14a\ fter_download_ui\ _tr\x01\x03\x00\x00\x00&\x00<\x00b\x00>\xb2\ \xe4\xb9x\x00 \xc7t\xb9\x84\xc7<\xb8\x5c\x00 \xc8\ \x00\xc7\xa5\x00<\x00/\x00b\x00>\x00:\x00 \x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x10Save\ as: \x07\x00\x00\x00\x14af\ ter_download_ui_\ tr\x01\x03\x00\x00\x00(\xc7t\x00 \xbaT\xc2\xdc\ \xc9\xc0\xb9|\x00 \xb2\xe4\xc2\xdc\x00 \xd4\x5c\xc2\xdc\ \xd5X\xc9\xc0\x00 \xc5J\xc2\xb5\xb2\xc8\xb2\xe4\x00.\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1eDon't \ show this messag\ e again.\x07\x00\x00\x00\x14aft\ er_download_ui_t\ r\x01\x03\x00\x00\x00\x14\xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00\ \xd3\xf4\xb3T\x00 \xc5\xf4\xae0\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x14Open Downlo\ ad Folder\x07\x00\x00\x00\x14af\ ter_download_ui_\ tr\x01\x03\x00\x00\x00&\x00P\x00e\x00r\x00s\ \x00e\x00p\x00o\x00l\x00i\x00s\x00 \xb2\xe4\ \xc6\xb4\xb8\x5c\xb4\xdc\x00 \xad\x00\xb9\xac\xc7\x90\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1bPersepol\ is Download Mana\ ger\x07\x00\x00\x00\x14after_do\ wnload_ui_tr\x01\x03\x00\x00\ \x00\x0a\xc7t\xc2\x88\x00 \xbc\xf4\xac\xe0\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0cReport Iss\ ue\x07\x00\x00\x00\x10log_windo\ w_ui_tr\x01\x03\x00\x00\x00\x9c\x00<\x00\ b\x00>\x00<\x00c\x00e\x00n\x00t\x00e\x00\ r\x00>\xc7t\x00 \xb9\xc1\xd0l\xb2\x94\x00 \xc7\ t\xc8\x04\xc5\xd0\x00 \xcd\x94\xac\x00\xb4\x1c\x00 \xc8\ \x01\xc7t\x00 \xc7\x88\xc2\xb5\xb2\xc8\xb2\xe4\x00!\x00\ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\ \x00 \x00 \x00 \xb2\xe4\xc2\xdc\x00 \xcd\x94\xac\ \x00\xd5X\xc2\xdc\xac\xa0\xc2\xb5\xb2\xc8\xaeL\x00?\x00\ <\x00/\x00c\x00e\x00n\x00t\x00e\x00r\x00\ >\x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00r
Th\ is link has been\ added before! \ \ Are you sure y\ ou want to add i\ t again?\x07\x00\x00\x00\x14mainwi\ ndow_src_ui_tr\x01\x03\ \x00\x00\x00\x1a\x00<\x00b\x00>\xc5\xf0\xac\xb0\x00 \ \xc2\x18\x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x14Conne\ ctions: \x07\x00\x00\x00\ \x14mainwindow_src_\ ui_tr\x01\x03\x00\x00\x00\x1c\x00<\x00b\x00\ >\xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\xb4(\x00<\x00/\x00\ b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x13Downloaded: \x07\x00\x00\x00\x14mainwin\ dow_src_ui_tr\x01\x03\x00\ \x00\x00\x22\x00<\x00b\x00>\xb0\xa8\xc7@\x00 \xc6\ \x08\xc0\xc1\x00 \xc2\xdc\xac\x04\x00<\x00/\x00b\x00\ >\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1c<\ b>Estimated time\ left: \x07\x00\x00\x00\x14\ mainwindow_src_u\ i_tr\x01\x03\x00\x00\x00\x16\x00<\x00b\x00>\ \xc8p\xac\x01\x00<\x00/\x00b\x00>\x00:\x00 \ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x12Fra\ gments: \x07\x00\x00\x00\ \x14mainwindow_src_\ ui_tr\x01\x03\x00\x00\x00\x16\x00<\x00b\x00\ >\xb9\xc1\xd0l\x00<\x00/\x00b\x00>\x00:\x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dLi\ nk: \x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x00\x16\x00<\x00b\x00>\xc0\xc1\xd0\ \xdc\x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0fStatus\ : \x07\x00\x00\x00\x14mainw\ indow_src_ui_tr\x01\ \x03\x00\x00\x00\x1c\x00<\x00b\x00>\xc8\x04\xc1\xa1\x00\ \xc1\x8d\xb3\xc4\x00<\x00/\x00b\x00>\x00:\x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Tr\ ansfer rate:\ \x07\x00\x00\x00\x14mainwindow\ _src_ui_tr\x01\x03\x00\x00\x00\x1a\ \xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\xb9|\x00 \xc6D\xb8\xcc\ \xd5X\xc6\x00\xc2\xb5\xb2\xc8\xb2\xe4\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x11Download Com\ plete\x07\x00\x00\x00\x14mainwi\ ndow_src_ui_tr\x01\x03\ \x00\x00\x00\x16\xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\xac\x00\x00 \ \xc2\xdc\xc7\x91\xb4)\xb2\xc8\xb2\xe4\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0fDownload Sta\ rts\x07\x00\x00\x00\x14mainwind\ ow_src_ui_tr\x01\x03\x00\x00\ \x00\x1a\xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\xac\x00\x00 \xc9\x11\ \xc9\xc0\xb4\x18\xc5\xc8\xc2\xb5\xb2\xc8\xb2\xe4\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x10Download S\ topped\x07\x00\x00\x00\x14mainw\ indow_src_ui_tr\x01\ \x03\x00\x00\x00\x0a\xc6$\xb9X\x00 \x00-\x00 \x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x08Error -\ \x07\x00\x00\x00\x14mainwindow\ _src_ui_tr\x01\x03\x00\x00\x00\x08\ \xc6$\xb9X\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x07Error: \x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00\x22\xc0\xac\xc6\xa9\x00 \xac\x00\ \xb2\xa5\xd5\x5c\x00 \xac\xf5\xac\x04\xc7t\x00 \xbd\x80\ \xc8q\xd5i\xb2\xc8\xb2\xe4\x00:\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x19Not enough f\ ree space in:\x07\x00\x00\ \x00\x14mainwindow_src\ _ui_tr\x01\x03\x00\x00\x00\x16\xc7\x91\xc5\xc5\ \xc5\xd0\x00 \xc2\xe4\xd3(\xd5\x88\xc2\xb5\xb2\xc8\xb2\xe4\ \x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1dOper\ ation was not su\ ccessful.\x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00\x22\xb2\xe4\xc7L\x00 \xcet\ \xd1L\xac\xe0\xb9\xac\xb9|\x00 \xc7\xac\xac\x1c\xd5t\ \x00 \xc8\xfc\xc18\xc6\x94\x00:\x08\x00\x00\x00\x00\x06\ \x00\x00\x00&Please resum\ e the following \ category: \x07\x00\x00\x00\x14m\ ainwindow_src_ui\ _tr\x01\x03\x00\x00\x00,\x00P\x00e\x00r\x00\ s\x00e\x00p\x00o\x00l\x00i\x00s\xb9|\x00\ \xc5\xc5\xb3p\xc7t\xd2\xb8\xd5t\x00 \xc8\xfc\xc1\ 8\xc6\x94\x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00\x19P\ lease update Per\ sepolis.\x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x00\x0c\xc6$\xb9X\x00 \xbc\x1c\xc0\ \xdd\xb4(\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11an \ error occurred\x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x00\x0a\xba9\xc2\ \xf1\x00 \xc6$\xb9X\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0cmuxing error\x07\x00\x00\ \x00\x14mainwindow_src\ _ui_tr\x01\x03\x00\x00\x00\x0a\xb2\xe4\xc6\xb4\ \xb8\x5c\xb4\xdc\xb4(\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0b\ downloaded\x07\x00\x00\x00\x10\ mainwindow_ui_tr\ \x01\x03\x00\x00\x00$\x00<\x00b\x00>\xc6$\xb5\x14\ \xc6$\x00 \xd3\x0c\xc7|\x00 \xc0\xc1\xd0\xdc\x00:\ \x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1aAudio Fil\ e Status: \x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00$\x00<\x00b\x00>\xc6\ $\xb5\x14\xc6$\x00 \xd3\x0c\xc7|\x00 \xc0\xc1\xd0\ \xdc\x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x1aAudio \ file status: \x07\x00\x00\x00\x10mainwindow\ _ui_tr\x01\x03\x00\x00\x00\x1c\x00<\x00b\ \x00>\xba9\xc2\xf1\x00 \xc0\xc1\xd0\xdc\x00:\x00 \ \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x16Mixing stat\ us: \x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00\x1c\x00<\x00b\x00>\xba9\xc2\xf1\x00 \xc0\ \xc1\xd0\xdc\x00:\x00 \x00<\x00/\x00b\x00>\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x16Muxi\ ng status: \x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00\x16\x00<\x00b\x00>\ \xc0\xc1\xd0\xdc\x00:\x00 \x00<\x00/\x00b\x00>\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fSta\ tus: \x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00$\x00<\x00b\x00>\xbeD\xb5\x14\xc6$\ \x00 \xd3\x0c\xc7|\x00 \xc0\xc1\xd0\xdc\x00:\x00 \ \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x1aVideo File \ Status: \x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00$\x00<\x00b\x00>\xbeD\xb5\ \x14\xc6$\x00 \xd3\x0c\xc7|\x00 \xc0\xc1\xd0\xdc\x00\ :\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x1aVideo fi\ le status: \x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00\xf6\x00<\x00h\x00t\ \x00m\x00l\x00>\x00<\x00h\x00e\x00a\x00d\ \x00/\x00>\x00<\x00b\x00o\x00d\x00y\x00>\ \x00<\x00p\x00>\xc7t\x00 \xc65\xc1X\xc7@\ \x00 \xc2\xdc\xc2\xa4\xd1\x5c\xc7t\x00 \xc8\x08\xc8\x04\ \x00 \xba\xa8\xb4\xdc\xb8\x5c\x00 \xc8\x04\xd6X\xb4\x18\ \xb2\x94\x00 \xac\x83\xc7D\x00 \xbc)\xc9\xc0\xd5i\ \xb2\xc8\xb2\xe4\x00.\x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \xc8\x04\ \xc6\xd0\x00 \xad\x00\xb9\xac\xc7\x90\xac\x00\x00 \xc2\xdc\ \xc2\xa4\xd1\x5c\xc7D\x00 \xc7\x90\xb3\xd9\xc7<\xb8\x5c\ \x00 \xc8\x08\xc8\x04\xba\xa8\xb4\xdc\xb8\x5c\x00 \xc8\x04\ \xd6X\xd5X\xb2\x94\x00 \xac\xbd\xc6\xb0\x00 \xd5D\ \xc6\x94\xd5i\xb2\xc8\xb2\xe4\x00.\x00 \x00<\x00/\ \x00p\x00>\x00<\x00/\x00b\x00o\x00d\x00y\ \x00>\x00<\x00/\x00h\x00t\x00m\x00l\x00>\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\xba\

\ This option will\ prevent the sys\ tem from going t\ o sleep. \ It is necess\ ary if your powe\ r manager is sus\ pending the syst\ em automatically\ .

\x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00\x1c\xc0\ \xc8\x00 \xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00 \xb9\xc1\xd0\ l\x00 \xcd\x94\xac\x00\xd5X\xae0\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x15Add New Dow\ nload Link\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x00\x12\xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00 \xc6\ D\xb8\xcc\x00 \xd6\xc4\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0eAfter download\x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00\x08\xc8\x01\xc6\xa9\xd5X\ \xae0\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Appl\ y\x07\x00\x00\x00\x10mainwindow\ _ui_tr\x01\x03\x00\x00\x00$\xba\xa9\xb8]\ \x00 \xd5X\xb2\xe8\xc5\xd0\xc1\x1c\x00\x0a\x00 \xba<\ \xc8\x00\x00 \xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\xd5X\xae0\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x22Downlo\ ad bottom of\x0a th\ e list first\x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00\x0a\xc8\x85\xb8\xcc\x00 \xc2\xdc\xac\ \x04\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08End T\ ime\x07\x00\x00\x00\x10mainwind\ ow_ui_tr\x01\x03\x00\x00\x00\x04\xc8\x85\ \xb8\xcc\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04Exit\ \x07\x00\x00\x00\x10mainwindow_\ ui_tr\x01\x03\x00\x00\x00\x0c\xc65\xc1X\x00\ \xc2(\xae0\xae0\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0cHide Options\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00\x1a\xc2\xdc\xc2\xa4\xd1\x5c\x00 \ \xc7\x91\xb3\xd9\x00 \xc0\xc1\xd0\xdc\x00 \xc7 \xc9\xc0\ \x00!\x08\x00\x00\x00\x00\x06\x00\x00\x00\x12Keep\ System Awake!\x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00\x18\xc2\xdc\xc2\xa4\xd1\x5c\x00\ \xd2\xb8\xb8\x08\xc7t\xb8\x5c\x00 \xcd\x5c\xc1\x8c\xd6\ T\x08\x00\x00\x00\x00\x06\x00\x00\x00\x17Minim\ ize to System Tr\ ay\x07\x00\x00\x00\x10mainwindo\ w_ui_tr\x01\x03\x00\x00\x00\x12\xb2\xe4\xc6\ \xb4\xb8\x5c\xb4\xdc\x00 \xc7|\xc2\xdc\xc8\x15\xc9\xc0\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0ePause D\ ownload\x07\x00\x00\x00\x10main\ window_ui_tr\x01\x03\x00\x00\ \x00&\x00P\x00e\x00r\x00s\x00e\x00p\x00o\ \x00l\x00i\x00s\x00 \xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\ \x00 \xad\x00\xb9\xac\xc7\x90\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x1bPersepolis Dow\ nload Manager\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00\x06\xc9\xc4\xd5\x89\xb9`\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x08Progress\ \x07\x00\x00\x00\x10mainwindow_\ ui_tr\x01\x03\x00\x00\x00\x04\xc1\x8d\xc11\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0aPropert\ ies\x07\x00\x00\x00\x10mainwind\ ow_ui_tr\x01\x03\x00\x00\x00\x12\xb2\xe4\ \xc6\xb4\xb8\x5c\xb4\xdc\x00 \xc7t\xc5\xb4\xbc\x1b\xae0\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fResume\ Download\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00\x22\xc2\xdc\xc2\xa4\xd1\x5c\x00 \xd2\xb8\xb8\x08\ \xc7t\x00 \xc5D\xc7t\xcfX\x00 \xd4\x5c\xc2\xdc\ \x00/\xc2(\xae@\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1a\ Show/Hide system\ tray icon\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x00\x0c\xce\xf4\xd4\xe8\xd10\x00 \xb0D\xae\ 0\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09Shut \ Down\x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00\x0e\xbb\ \xf9\xc2\xf1\x00 \xc2\xdc\xc7\x91\xd5X\xae0\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0cStart Mix\ ing\x07\x00\x00\x00\x10mainwind\ ow_ui_tr\x01\x03\x00\x00\x00\x0a\xc2\xdc\ \xc7\x91\x00 \xc2\xdc\xac\x04\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0aStart Time\x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00\x14\xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00\ \xc9\x11\xc9\xc0\x00/\xcd\xe8\xc1\x8c\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x14Stop/Cancel\ Download\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00\x12\xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00 \xc6D\ \xb8\xcc\x00 \xd6\xc4\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0e\ After download\x07\x00\ \x00\x00\x0eprogress_ui_t\ r\x01\x03\x00\x00\x00\x08\xc8\x01\xc6\xa9\xd5X\xae0\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x05Apply\x07\x00\ \x00\x00\x0eprogress_ui_t\ r\x01\x03\x00\x00\x00\x0e\xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00\ \xc8\x15\xbc\xf4\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14D\ ownload Informat\ ion\x07\x00\x00\x00\x0eprogress\ _ui_tr\x01\x03\x00\x00\x00\x0e\xb2\xe4\xc6\xb4\ \xb8\x5c\xb4\xdc\x00 \xc65\xc1X\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x10Download Opt\ ions\x07\x00\x00\x00\x0eprogres\ s_ui_tr\x01\x03\x00\x00\x00\x0c\xb2\xe4\xc6\ \xb4\xb8\x5c\xb4\xdc\xb4(\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0bDownloaded:\x07\x00\ \x00\x00\x0eprogress_ui_t\ r\x01\x03\x00\x00\x00\x12\xb0\xa8\xc7@\x00 \xc6\x08\xc0\ \xc1\x00 \xc2\xdc\xac\x04\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x14Estimated tim\ e left:\x07\x00\x00\x00\x0eprog\ ress_ui_tr\x01\x03\x00\x00\x00\x08\ \xb9\xc1\xd0l\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x06Link: \x07\x00\x00\x00\x0epro\ gress_ui_tr\x01\x03\x00\x00\x00\ \x0c\xc5\xf0\xac\xb0\x00 \xc2\x18\x00:\x00 \x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x17Number of\ connections: \x07\x00\ \x00\x00\x0eprogress_ui_t\ r\x01\x03\x00\x00\x00\x08\xc7|\xc2\xdc\xc8\x15\xc9\xc0\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x05Pause\x07\x00\ \x00\x00\x0eprogress_ui_t\ r\x01\x03\x00\x00\x00&\x00P\x00e\x00r\x00s\x00\ e\x00p\x00o\x00l\x00i\x00s\x00 \xb2\xe4\xc6\ \xb4\xb8\x5c\xb4\xdc\x00 \xad\x00\xb9\xac\xc7\x90\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x1bPersepoli\ s Download Manag\ er\x07\x00\x00\x00\x0eprogress_\ ui_tr\x01\x03\x00\x00\x00\x08\xc7t\xc5\xb4\xbc\ \x1b\xae0\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Res\ ume\x07\x00\x00\x00\x0eprogress\ _ui_tr\x01\x03\x00\x00\x00\x0c\xce\xf4\xd4\xe8\ \xd10\x00 \xb0D\xae0\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x09Shut Down\x07\x00\x00\x00\x0e\ progress_ui_tr\x01\x03\ \x00\x00\x00\x08\xc0\xc1\xd0\xdc\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x08Status: \x07\x00\ \x00\x00\x0eprogress_ui_t\ r\x01\x03\x00\x00\x00\x08\xc9\x11\xc9\xc0\xd5X\xae0\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x04Stop\x07\x00\x00\ \x00\x0eprogress_ui_tr\ \x01\x03\x00\x00\x00\x0e\xc8\x04\xc1\xa1\x00 \xc1\x8d\xb3\xc4\ \x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fTr\ ansfer rate: \x07\x00\x00\ \x00\x0eprogress_ui_tr\ \x01\x03\x00\x00\x00\xa2\x00<\x00b\x00>\x00<\x00c\ \x00e\x00n\x00t\x00e\x00r\x00>\xc7t\x00 \ \xb2\xe8\xcd\x95\xd0\xa4\xb2\x94\x00 \xc7t\xc8\x04\xc5\xd0\ \x00 \xc0\xac\xc6\xa9\xd5\x5c\x00 \xc8\x01\xc7t\x00 \ \xc7\x88\xc2\xb5\xb2\xc8\xb2\xe4\x00!\x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \xb2\xe4\xb9x\x00 \xb2\xe8\xcd\x95\xd0\xa4\xb9|\ \x00 \xc0\xac\xc6\xa9\xd5X\xc18\xc6\x94\x00!\x00<\ \x00/\x00c\x00e\x00n\x00t\x00e\x00r\x00>\ \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\ \x00_
Thi\ s shortcut has b\ een used before!\ \ Use another \ one!
\x07\x00\x00\x00\x11setting_sr\ c_ui_tr\x01\x03\x00\x00\x00`\x00<\x00\ h\x00t\x00m\x00l\x00>\x00<\x00h\x00e\x00\ a\x00d\x00/\x00>\x00<\x00b\x00o\x00d\x00\ y\x00>\x00<\x00p\x00>\xd6\x15\xc2\xdd\x00 \x00\ H\x00H\x00:\x00M\x00M\x00<\x00/\x00p\x00\ >\x00<\x00/\x00b\x00o\x00d\x00y\x00>\x00\ <\x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x004

For\ mat HH:MM

\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x86\x00<\x00h\x00t\x00m\x00l\x00>\x00\ <\x00h\x00e\x00a\x00d\x00/\x00>\x00<\x00\ b\x00o\x00d\x00y\x00>\x00<\x00p\x00>\xb2\ \xe4\xc6\xb4\xb8\x5c\xb4\xdc\xc5\xd0\x00 \xc2\xe4\xd3(\xd5\ `\x00 \xac\xbd\xc6\xb0\x00 \xc7\xac\xc2\xdc\xb3\xc4\x00\ \xd6\x9f\xc2\x18\xb9|\x00 \xc9\xc0\xc8\x15\xd5i\xb2\ \xc8\xb2\xe4\x00.\x00<\x00/\x00p\x00>\x00<\x00\ /\x00b\x00o\x00d\x00y\x00>\x00<\x00/\x00\ h\x00t\x00m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00Q\

Set num\ ber of retries i\ f download faile\ d.

\x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\x82\x00<\x00h\ \x00t\x00m\x00l\x00>\x00<\x00h\x00e\x00a\ \x00d\x00/\x00>\x00<\x00b\x00o\x00d\x00y\ \x00>\x00<\x00p\x00>\xc7\xac\xc2\xdc\xb3\xc4\x00 \ \xac\x04\x00 \xb3\x00\xae0\x00 \xc2\xdc\xac\x04\xc7D\ \x00 \xcd\x08\x00 \xb2\xe8\xc7\x04\xb8\x5c\x00 \xc9\xc0\ \xc8\x15\xd5i\xb2\xc8\xb2\xe4\x00.\x00<\x00/\x00p\ \x00>\x00<\x00/\x00b\x00o\x00d\x00y\x00>\ \x00<\x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\ \x00\x00\x00\x06\x00\x00\x00P

Se\ t the seconds to\ wait between re\ tries.

\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00v\ \x00<\x00h\x00t\x00m\x00l\x00>\x00<\x00h\ \x00e\x00a\x00d\x00/\x00>\x00<\x00b\x00o\ \x00d\x00y\x00>\x00<\x00p\x00>\xc2\xdc\xac\x04\ \xcd\x08\xac\xfc\xb9|\x00 \xcd\x08\x00 \xb2\xe8\xc7\x04\ \xb8\x5c\x00 \xc9\xc0\xc8\x15\xd5i\xb2\xc8\xb2\xe4\x00.\ \x00 \x00<\x00/\x00p\x00>\x00<\x00/\x00b\ \x00o\x00d\x00y\x00>\x00<\x00/\x00h\x00t\ \x00m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00@\

Set timeou\ t in seconds. \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\xa6\x00<\x00h\x00t\x00m\ \x00l\x00>\x00<\x00h\x00e\x00a\x00d\x00/\ \x00>\x00<\x00b\x00o\x00d\x00y\x00>\x00<\ \x00p\x00>\xd5\x04\xb8\x5c\xad\xf8\xb7\xa8\xc7@\x00 \ \xc7\x90\xb3\xd9\xc7<\xb8\x5c\x00 \xd0t\xb9\xbd\xbc\xf4\ \xb4\xdc\xc5\xd0\x00 \xbc\xf5\xc0\xac\xb4\x1c\x00 \xb9\xc1\ \xd0l\xb9|\x00 \xd6U\xc7x\xd5i\xb2\xc8\xb2\xe4\ \x00.\x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00<\x00/\x00p\ \x00>\x00<\x00/\x00b\x00o\x00d\x00y\x00>\ \x00<\x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\ \x00\x00\x00\x06\x00\x00\x00x

Th\ e program will a\ utomatically che\ ck the clipboard\ for copied link\ s. \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x8a\x00<\x00h\x00t\x00m\ \x00l\x00>\x00<\x00h\x00e\x00a\x00d\x00/\ \x00>\x00<\x00b\x00o\x00d\x00y\x00>\x00<\ \x00p\x00>\xc7t\x00 \xae0\xb2\xa5\xc7@\x00 \ \xc6\xb4\xc6\x01\x00 \xcc\xb4\xc8\x1c\xc5\xd0\xc1\x1c\x00 \ \xc7\x91\xb3\xd9\xd5X\xc9\xc0\x00 \xc5J\xc7D\x00 \ \xc2\x18\x00 \xc7\x88\xc2\xb5\xb2\xc8\xb2\xe4\x00.\x00<\ \x00/\x00p\x00>\x00<\x00/\x00b\x00o\x00d\ \x00y\x00>\x00<\x00/\x00h\x00t\x00m\x00l\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00[<\ p>This feature m\ ay not work in y\ our operating sy\ stem.

\ \x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\xc8\x00\ <\x00h\x00t\x00m\x00l\x00>\x00<\x00h\x00\ e\x00a\x00d\x00/\x00>\x00<\x00b\x00o\x00\ d\x00y\x00>\x00<\x00p\x00>\xc7t\x00 \xc6\ 5\xc1X\xc7@\x00 \x00S\x00S\x00L\x00/\x00\ T\x00L\x00S\x00 \xd5x\xb4\xdc\xc1p\xc7t\xd0\ l\x00 \xc2\xe4\xd3(\xb9|\x00 \xbc)\xc9\xc0\xd5\ i\xb2\xc8\xb2\xe4\x00.\x00 \xd5X\xc9\xc0\xb9\xcc\x00\ \xc0\xac\xc6\xa9\xc5\xd0\x00 \xb50\xb9x\x00 \xc7\ \x04\xd5\xd8\xc7@\x00 \xc0\xac\xc6\xa9\xc7\x90\x00 \xbc\ \xf8\xc7x\xc7X\x00 \xccE\xc7\x84\xc7\x85\xb2\xc8\xb2\ \xe4\x00!\x00<\x00/\x00p\x00>\x00<\x00/\x00\ b\x00o\x00d\x00y\x00>\x00<\x00/\x00h\x00\ t\x00m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ r

This opti\ on avoids SSL/TL\ S handshake fail\ ure. But use it \ at your own risk\ !

\x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00\xf6\x00<\x00h\x00\ t\x00m\x00l\x00>\x00<\x00h\x00e\x00a\x00\ d\x00/\x00>\x00<\x00b\x00o\x00d\x00y\x00\ >\x00<\x00p\x00>\xc7t\x00 \xc65\xc1X\xc7\ @\x00 \xc2\xdc\xc2\xa4\xd1\x5c\xc7t\x00 \xc8\x08\xc8\ \x04\x00 \xba\xa8\xb4\xdc\xb8\x5c\x00 \xc8\x04\xd6X\xb4\ \x18\xb2\x94\x00 \xac\x83\xc7D\x00 \xbc)\xc9\xc0\xd5\ i\xb2\xc8\xb2\xe4\x00.\x00 \x00 \x00 \x00 \x00\ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \xc8\ \x04\xc6\xd0\x00 \xad\x00\xb9\xac\xc7\x90\xac\x00\x00 \xc2\ \xdc\xc2\xa4\xd1\x5c\xc7D\x00 \xc7\x90\xb3\xd9\xc7<\xb8\ \x5c\x00 \xc8\x08\xc8\x04\xba\xa8\xb4\xdc\xb8\x5c\x00 \xc8\ \x04\xd6X\xd5X\xb2\x94\x00 \xac\xbd\xc6\xb0\x00 \xd5\ D\xc6\x94\xd5i\xb2\xc8\xb2\xe4\x00.\x00 \x00<\x00\ /\x00p\x00>\x00<\x00/\x00b\x00o\x00d\x00\ y\x00>\x00<\x00/\x00h\x00t\x00m\x00l\x00\ >\x08\x00\x00\x00\x00\x06\x00\x00\x00\xbaThis option wil\ l prevent the sy\ stem from going \ to sleep. \ It is neces\ sary if your pow\ er manager is su\ spending the sys\ tem automaticall\ y.

\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x90\x00<\x00\ h\x00t\x00m\x00l\x00>\x00<\x00h\x00e\x00\ a\x00d\x00/\x00>\x00<\x00b\x00o\x00d\x00\ y\x00>\x00<\x00p\x00>\xb2\xe4\xc9\x11\x00 \xc5\ \xf0\xac\xb0\xc7D\x00 \xc0\xac\xc6\xa9\xd5X\xbat\x00\ \xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00 \xc1\x8d\xb3\xc4\xb9\ |\x00 \xb1\x92\xc7|\x00 \xc2\x18\x00 \xc7\x88\xc2\ \xb5\xb2\xc8\xb2\xe4\x00.\x00.\x00<\x00/\x00p\x00\ >\x00<\x00/\x00b\x00o\x00d\x00y\x00>\x00\ <\x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00c

Usi\ ng multiple conn\ ections can help\ speed up your d\ ownload.

\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\xdc\x00<\x00h\x00t\x00m\x00l\x00>\x00<\ \x00h\x00e\x00a\x00d\x00/\x00>\x00<\x00b\ \x00o\x00d\x00y\x00>\x00<\x00p\x00>\xbe\x0c\ \xb7|\xc6\xb0\xc8\x00\x00 \xd6U\xc7\xa5\x00 \xd5\x04\ \xb8\x5c\xad\xf8\xb7\xa8\xc5\xd0\xc1\x1c\x00 \xb2\xe4\xc6\xb4\ \xb8\x5c\xb4\xdc\x00 \xc6\x94\xcc\xad\xc7t\x00 \xc8\x04\ \xc1\xa1\xb4\x18\xbat\x00 \xb9\xc1\xd0l\x00 \xcd\x94\ \xac\x00\x00 \xcc=\xc7t\x00 \xd4\x5c\xc2\xdc\xb4\x18\ \xc9\xc0\x00 \xc5J\xac\xe0\x00 \xb2\xe4\xc6\xb4\xb8\x5c\ \xb4\xdc\xac\x00\x00 \xc2\xdc\xc7\x91\xb4)\xb2\xc8\xb2\xe4\ \x00.\x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00<\x00/\x00p\ \x00>\x00<\x00/\x00b\x00o\x00d\x00y\x00>\ \x00<\x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\xac

Wh\ en a download re\ quest is sent fr\ om the browser e\ xtension, the do\ wnload will star\ t without showin\ g the Add Link w\ indow. \

\x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\x04\xcd\xe8\xc1\x8c\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Cancel\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x08\xbc\xc0\xac\xbd\xd5X\xae0\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Change\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00.\xbc\xf5\xc0\xac\xb4\x1c\x00 \ \xb9\xc1\xd0l\xac\x00\x00 \xc7\x88\xb2\x94\xc9\xc0\x00 \ \xc2\xdc\xc2\xa4\xd1\x5c\x00 \xd0t\xb9\xbd\xbc\xf4\xb4\xdc\ \x00 \xd6U\xc7x\x08\x00\x00\x00\x00\x06\x00\x00\x00'\ Check system cli\ pboard for copie\ d links\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x18\xbe\ \x14\xb8]\x00 \xd0l\xae0\x00(\x00K\x00i\x00\ B\x00)\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x11Chunk size(KiB)\ : \x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x0e\xc0\xc9\x00 \xadl\ \xc11\xd4\x5c\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0eColor scheme: \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x10\xc5\xf4\x00 \xc0\xac\xc6\xa9\ \xc7\x90\x00 \xc8\x15\xc7X\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x15Columns Custom\ ization\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00F\xae\ 0\xbc\xf8\x00 \xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00 \xd3\ \xf4\xb3T\xc5\xd0\x00 \xc7L\xc5E\x00,\x00 \xb3\ \xd9\xc6\x01\xc0\xc1\x00 \xb4\xf1\xc5\xd0\x00 \xb3\x00\xd5\ \x5c\x00 \xd5X\xc7\x04\x00 \xd3\xf4\xb3T\x00 \xb9\ \xcc\xb4\xe4\xae0\x08\x00\x00\x00\x00\x06\x00\x00\x00BC\ reate subfolders\ for Music,Video\ s, ... in defaul\ t download folde\ r\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x06\xae0\xbc\xf8\xac\x12\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x08Default\ s\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x000\xd5<\xc5\xb4\xb9|\x00\ \xd6U\xc7x\xd5X\xae0\x00 \xc7\x04\xd5t\x00\ \xc7x\xc9\x9d\xc1\x1c\xb9|\x00 \xc0\xac\xc6\xa9\xd5\ X\xc9\xc0\x00 \xc5J\xc7L\x08\x00\x00\x00\x00\x06\x00\ \x00\x00)Don't use cer\ tificate to veri\ fy the peers\x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x0e\xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00 \xc65\ \xc1X\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Down\ load Options\x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x12\xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00 \xd3\xf4\ \xb3T\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x11\ Download folder:\ \x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x002\xbe\x0c\xb7|\xc6\xb0\xc8\ \x00\xc5\xd0\xc1\x1c\x00 \xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00\ \xc6\x94\xcc\xad\xc7t\x00 \xc9\x89\xc2\xdc\x00 \xc2\ \xe4\xd5\x89\xb4)\xb2\xc8\xb2\xe4\x00.\x08\x00\x00\x00\x00\ \x06\x00\x00\x00@Download re\ quests from the \ browser will be \ executed immedia\ tely.\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x14\xc5L\xb9\ \xbc\x00 \xc0\xac\xc6\xb4\xb4\xdc\x00 \xd6\x5c\xc11\xd6\ T\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aEnabl\ e Notification S\ ounds\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x1e\xc2\xdc\xc2\ \xa4\xd1\x5c\x00 \xd2\xb8\xb8\x08\xc7t\x00 \xc5D\xc7\ t\xcfX\x00 \xd6\x5c\xc11\xd6T\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x17Enable syst\ em tray icon\x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x08\xae\x00\xaf4\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x06Font: \x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x000\xb2\xeb\xae0\x00 \xbc\x84\xd2\xbc\xc7D\ \x00 \xd0t\xb9\xad\xd5X\xbat\x00 \xae0\xbc\xf8\ \x00 \xcc=\xc7t\x00 \xc2(\xac\xa8\xc9\xd1\xb2\xc8\ \xb2\xe4\x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00)Hi\ de main window i\ f close button c\ licked.\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x0a\xc5\ D\xc7t\xcfX\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x07Icons: \x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00T\xd3\x0c\xc7t\xc3l\x00 \xc6\x94\xcc\xad\x00 \ \xb7|\xc7t\xbe\x0c\xb7\xec\xb9\xac\x00 \xbe\x14\xb8]\ \x00 \xd0l\xae0\xc7\x85\xb2\xc8\xb2\xe4\x00.\x00 \ \xc7u\xc2\x19\xd5X\xc9\xc0\x00 \xc5J\xb3T\xb7|\ \xb3\xc4\x00 \xbc\xc0\xac\xbd\xd5X\xc9\xc0\x00 \xb9\xc8\ \xc18\xc6\x94\x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00]\ It is python req\ uests library ch\ unk size. Do not\ change this If \ you are not fami\ liar with it.\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x1a\xc2\xdc\xc2\xa4\xd1\x5c\x00 \xc7\x91\xb3\ \xd9\x00 \xc0\xc1\xd0\xdc\x00 \xc7 \xc9\xc0\x00!\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x12Keep sy\ stem awake!\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x08\xc5\xb8\xc5\xb4\x00:\x00 \x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0aLanguage: \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00\x0e\xc5L\xb9\xbc\x00 \xc7 \xd6\ \x15\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x13N\ otification type\ : \x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x04\xc5L\xb9\xbc\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0dNotifica\ tions\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x0c\xc5\xf0\xac\ \xb0\x00 \xc2\x18\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x17Number of con\ nections: \x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x0e\xc2\xdc\xb3\xc4\x00 \xd6\x9f\xc2\x18\x00:\x00 \ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Number\ of tries: \x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x04\xd6U\xc7x\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x02OK\x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00\x08\xd6X\xac\xbd\xc1\ $\xc8\x15\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0bPre\ ferences\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00\x0e\ \xc0\xc8\x00 \xd0\xa4\x00 \xb2\x04\xb9t\xae0\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0ePress ne\ w keys\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00(\xc2\xdc\ \xc7\x91\x00 \xc2\xdc\x00 \x00P\x00e\x00r\x00s\ \x00e\x00p\x00o\x00l\x00i\x00s\x00 \xc2\xe4\ \xd5\x89\xd5X\xae0\x08\x00\x00\x00\x00\x06\x00\x00\x00\x19\ Run Persepolis a\ t startup\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ \x14\xb2\xe4\xb9x\x00 \xc7t\xb9\x84\xc7<\xb8\x5c\x00\ \xc8\x00\xc7\xa5\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07S\ ave As\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x06\xb2\xe8\ \xcd\x95\xd0\xa4\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09Sh\ ortcuts\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x008\xb2\ \xe4\xc6\xb4\xb8\x5c\xb4\xdc\xac\x00\x00 \xc6D\xb8\xcc\xb4\ \x18\xbat\x00 \xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00 \xc6\ D\xb8\xcc\x00 \xb3\x00\xd6T\xc0\xc1\xc7\x90\x00 \xd4\ \x5c\xc2\xdc\xd5X\xae0\x08\x00\x00\x00\x00\x06\x00\x00\x00\ 7Show download c\ omplete dialog w\ hen download is \ finished\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00\x1e\ \xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00 \xc9\xc4\xd5\x89\xb9`\ \x00 \xcc=\x00 \xd4\x5c\xc2\xdc\xd5X\xae0\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1dShow dow\ nload progress w\ indow\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x14\xbaT\xb2\ t\xd4\x5c\xc2\xdc\xc9\x04\x00 \xd4\x5c\xc2\xdc\xd5X\xae\ 0\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0cShow \ menubar\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x14\xce\ !\xbat\x00 \xd3(\xb1\x10\x00 \xd4\x5c\xc2\xdc\xd5\ X\xae0\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fSho\ w side panel\x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x08\xd0l\xae0\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x06Size: \x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x04\xc0\xc1\xd0\xdc\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x06Status\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00\x0a\ \xc2\xa4\xd0\xc0\xc7|\x00:\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x07Style: \x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x16\xc2\xdc\xac\x04\x00 \xcd\x08\xac\xfc\x00 \x00\ (\xcd\x08\x00)\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x13Timeout (seco\ nds): \x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x18\xb3\xc4\ \xadl\xba\xa8\xc7L\x00 \xc5D\xc7t\xcfX\x00 \ \xd0l\xae0\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14\ Toolbar icons si\ ze: \x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\x16\xbeD\xb5\x14\ \xc6$\x00 \xcc>\xae0\xb3\xc4\xadl\x00 \xc65\ \xc1X\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Vide\ o Finder Options\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x08\xc6\xa9\xb7\xc9\x00:\x00 \ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x08Volume\ : \x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x22\xc7\xac\xc2\xdc\xb3\xc4\ \x00 \xac\x04\x00 \xb3\x00\xae0\x00 \xc2\xdc\xac\x04\ \x00 \x00(\xcd\x08\x00)\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00'Wait perio\ d between retrie\ s (seconds): \x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x18\xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00 \xd3\ \xf4\xb3T\x00 \xbc\xc0\xac\xbd\xd5X\xae0\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x16Change Do\ wnload Folder\x07\x00\x00\ \x00\x0atext_ui_tr\x01\x03\x00\x00\ \x00\x12\xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00 \xd3\xf4\xb3T\ \x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Do\ wnload folder: \x07\ \x00\x00\x00\x0atext_ui_tr\x01\x03\ \x00\x00\x00\x16\xbeD\xbc\x00\xbc\x88\xd68\x00 \xb2\xe4\ \xc6\xb4\xb8\x5c\xb4\xdc\x00:\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x13Download pas\ sword: \x07\x00\x00\x00\x0atext\ _ui_tr\x01\x03\x00\x00\x00\x22\xc0\xac\xc6\xa9\ \xc7\x90\xc7t\xb9\x84\x00 \xbc\x0f\x00 \xbeD\xbc\x00\ \xbc\x88\xd68\x00 \xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1eDownload\ username and pa\ ssword\x07\x00\x00\x00\x0atext_\ ui_tr\x01\x03\x00\x00\x00\x18\xc0\xac\xc6\xa9\xc7\ \x90\xc7t\xb9\x84\x00 \xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00\ :\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x13Dow\ nload username: \ \x07\x00\x00\x00\x0atext_ui_tr\x01\ \x03\x00\x00\x00\x06\x00I\x00P\x00:\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x03IP:\x07\x00\x00\x00\x0atex\ t_ui_tr\x01\x03\x00\x00\x00\x0a\xc5\xf0\xac\ \xb0\x00 \xc2\x18\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x16Number of conne\ ctions:\x07\x00\x00\x00\x0atext\ _ui_tr\x01\x03\x00\x00\x00&\x00P\x00e\ \x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\ \x00 \xb2\xe4\xc6\xb4\xb8\x5c\xb4\xdc\x00 \xad\x00\xb9\xac\ \xc7\x90\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bPers\ epolis Download \ Manager\x07\x00\x00\x00\x0atext\ _ui_tr\x01\x03\x00\x00\x00\x06\xd3\xec\xd2\xb8\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Port\ :\x07\x00\x00\x00\x0atext_ui_tr\ \x01\x03\x00\x00\x00\x14\xd5\x04\xb8]\xc2\xdc\x00 \xbeD\ \xbc\x00\xbc\x88\xd68\x00:\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x10Proxy passwo\ rd: \x07\x00\x00\x00\x0atext_ui\ _tr\x01\x03\x00\x00\x00\x16\xd5\x04\xb8]\xc2\xdc\x00\ \xc0\xac\xc6\xa9\xc7\x90\xc7t\xb9\x84\x00:\x00 \x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x10Proxy u\ sername: \x07\x00\x00\x00\x0ate\ xt_ui_tr\x01\x03\x00\x00\x00$\x00<\ \x00b\x00>\xc6$\xb5\x14\xc6$\x00 \xd3\x0c\xc7|\ \x00 \xc0\xc1\xd0\xdc\x00:\x00 \x00<\x00/\x00b\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aA\ udio file status\ : \x07\x00\x00\x00\x1bvideo\ _finder_progress\ _ui_tr\x01\x03\x00\x00\x00\x1c\x00<\x00b\ \x00>\xbb\xf9\xc2\xf1\x00 \xc0\xc1\xd0\xdc\x00:\x00 \ \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x16Mixing stat\ us: \x07\x00\x00\x00\x1bvid\ eo_finder_progre\ ss_ui_tr\x01\x03\x00\x00\x00\x1c\x00<\ \x00b\x00>\xba9\xc2\xf1\x00 \xc0\xc1\xd0\xdc\x00:\ \x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x16Muxing st\ atus: \x07\x00\x00\x00\x1bv\ ideo_finder_prog\ ress_ui_tr\x01\x03\x00\x00\x00$\ \x00<\x00b\x00>\xbeD\xb5\x14\xc6$\x00 \xd3\x0c\ \xc7|\x00 \xc0\xc1\xd0\xdc\x00:\x00 \x00<\x00/\ \x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aVideo file stat\ us:
\x07\x00\x00\x00\x1bvid\ eo_finder_progre\ ss_ui_tr\x01\ \x00\x003\xb1\ <\ \xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\xa7\ \x00\x00\x00\x05es_ESB\x00\x00\x03\xa8\x00\x00\ \x05;\x00\x00\x03\xe2\x00\x00\x05;\x00\x00\x072\x00\x00\ \x05;\x00\x00)\x9a\x00\x00N:\x00\x00-H\x00\x04\ \xcf\x04\x00\x00\x17\xe3\x00\x04\xe3\xc0\x00\x00\x06\x8c\x00\x05\ 0K\x00\x00\x06\xba\x00\x05\xab`\x00\x00\x1f\x22\x00H\ w9\x00\x00\x16\xc3\x00Hw9\x00\x00\x1b\xbd\x00V\ \x8c\x95\x00\x00\x1d\xca\x00Wiz\x00\x00\x07d\x00W\ iz\x00\x00-\xfa\x00W\x96\xf9\x00\x00\x07\x99\x00\x97\ \xa2\x10\x00\x00\x04\xca\x00\xc2\xad\xd0\x00\x00\x0e'\x01\x18\ \xab\xd4\x00\x00\x16\xfb\x01\x8bp\x0e\x00\x00\x22v\x02S\ \xd0\x00\x00\x00\x08\x97\x02\x9a\xf5p\x00\x00\x0e\x85\x02\xf9\ \xc5\xc5\x00\x00\x03\xab\x03\x0d1^\x00\x00\x0aj\x03\x1c\ \xc5*\x00\x00\x1c\xb9\x03<\x83\x03\x00\x00\x06\xec\x03K\ F\xe3\x00\x00\x1c^\x03KF\xe3\x00\x00&.\x03\x92\ \xd2\xce\x00\x00&\xc6\x03\xdc\xdc%\x00\x00\x0b\xf4\x04]\ I3\x00\x00*\x11\x04e\xac\xf5\x00\x00\x17\x8e\x04\x98\ I\xbc\x00\x00\x05\x81\x04\x98I\xbc\x00\x00%\x1a\x04\x9e\ \x84\xd5\x00\x00%R\x04\xd6W\xc0\x00\x00&\x88\x05\x13\ \xccT\x00\x00\x13\xbd\x05_. \x00\x00\x12\xcd\x05_\ \xa8`\x00\x00\x0f`\x05i<\xfe\x00\x00\x15\x0d\x05v\ \x1b\x9e\x00\x00\x0cS\x05\x8c\xac5\x00\x00\x1ex\x05\xa1\ \x08\xc0\x00\x00+\x15\x05\xa3\x9c>\x00\x00\x14\x8a\x05\xa3\ \x9c>\x00\x00.\xbe\x05\xa8X\xf3\x00\x00\x03\x09\x05\xaa\ \x8b\xc3\x00\x00+K\x06-B\x0e\x00\x00\x14\x03\x06-\ B\x0e\x00\x00.,\x069\x82N\x00\x00\x15_\x069\ \x82N\x00\x00/L\x06<=\x10\x00\x00,\x9b\x06]\ 1\xde\x00\x00\x02\x02\x06\x9aK\x00\x00\x00\x08\xe2\x06\x9a\ \xf5C\x00\x00*\xde\x06\x9c(\x01\x00\x00'\xc8\x06\xc5\ )*\x00\x00\x1c\xfd\x06\xcc\xd6\xa3\x00\x00\x19&\x07\x14\ *\x1e\x00\x00\x19\xc7\x076\xcf`\x00\x00\x06/\x07[\ &u\x00\x00\x10/\x07\x9b]0\x00\x00)A\x07\x9c\ 1\x03\x00\x00,#\x08g-\xa2\x00\x00\x0a\xf7\x09>\ \x0d$\x00\x00\x1a\xef\x09^\x89\xd3\x00\x00\x18\xe9\x09`\ \x06\xb5\x00\x00\x1a\xa4\x09g\x01\xd0\x00\x00+\xb6\x09\x93\ \xd2\xfe\x00\x00\x1b\xf3\x09\x96F0\x00\x00\x11@\x0a\x0c\ \x87\x0e\x00\x00 \xae\x0a_\xd7\x0e\x00\x00\x098\x0a_\ \xf3\xfb\x00\x00\x15\xe6\x0as>\xc3\x00\x00\x04\x89\x0a\x8b\ \xc3`\x00\x00\x1e\xe9\x0a\x97\x00\x80\x00\x00\x08?\x0a\xa2\ Yp\x00\x00*i\x0a\xc0(\x90\x00\x00+\x7f\x0b`\ r`\x00\x00(4\x0bn\xb1\xee\x00\x00#\xd1\x0bv\ \x04\xf0\x00\x00\x0d\xc4\x0b\x89w\x94\x00\x00\x16d\x0b\x89\ w\x94\x00\x00\x1b`\x0b\xc8\xc7\x13\x00\x00%\xde\x0b\xf9\ \x95\xb3\x00\x00\x10\x8b\x0c(\x19\x04\x00\x00\x19k\x0c2\ \xc0S\x00\x00\x03a\x0ce\x0f.\x00\x00\x1aV\x0ce\ \x0f.\x00\x00\x1e\xb1\x0c\x96q\xc0\x00\x00\x09\xb3\x0c\x96\ q\xc0\x00\x00\x0f\x0c\x0c\x99e\x80\x00\x00\x11\x81\x0c\xb5\ \x86\x80\x00\x00\x1df\x0c\xb5\x86\x80\x00\x00(\xde\x0c\xdd\ \xc2\x03\x00\x00)\xcc\x0c\xe0\x1a\xf3\x00\x00(\x93\x0c\xfb\ \xe0\x8a\x00\x00\x11\xbf\x0dq\x98\xde\x00\x00\x00\x00\x0d\x99\ \xf9B\x00\x00\x04\x12\x0d\x99\xf9B\x00\x00\x0bt\x0d\x99\ \xf9B\x00\x00\x18m\x0d\x99\xf9B\x00\x00\x1d\xfe\x0d\x99\ \xf9B\x00\x00-\x84\x0e i\x22\x00\x00\x13Z\x0e.\ d\xa4\x00\x00\x18\x16\x0e7I\xc3\x00\x00\x05+\x0ex\ \xa8B\x00\x00\x05\xb9\x0ex\xa8B\x00\x00,\xd5\x0e\xc4\ J\xf0\x00\x00\x07\xca\x0e\xda\xd4\xfe\x00\x00\x1f\xb5\x0f6\ \xb6\x90\x00\x00\x0f\xb6\x0f}\x11p\x00\x00\x0a\x07\x0f\xa6\ V\x80\x00\x00'\x91\x0f\xa7\xb6\x04\x00\x00\x10\xe5\x0f\xac\ [\xee\x00\x00\x12Q\x0f\xd1?\x00\x00\x00\x1fW\x0f\xd6\ \xe5\xde\x00\x00!n\x0f\xde{\xf0\x00\x00%\x88\x0f\xf3\ \x03\x0e\x00\x00\x00\xfbi\x00\x00/\xde\x03\x00\x00\x00\x92\ \x00<\x00a\x00 \x00h\x00r\x00e\x00f\x00=\ \x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\ \x00p\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x00d\x00m\x00.\x00g\x00i\x00t\ \x00h\x00u\x00b\x00.\x00i\x00o\x00>\x00h\ \x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00p\ \x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\ \x00s\x00d\x00m\x00.\x00g\x00i\x00t\x00h\ \x00u\x00b\x00.\x00i\x00o\x00<\x00/\x00a\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00Ihttps://perse\ polisdm.github.i\ o\x07\x00\x00\x00\x0babout_\ ui_tr\x01\x03\x00\x00\x00\x9a\x00<\x00a\x00\ \x00h\x00r\x00e\x00f\x00=\x00h\x00t\x00\ t\x00p\x00s\x00:\x00/\x00/\x00t\x00e\x00\ l\x00e\x00g\x00r\x00a\x00m\x00.\x00m\x00\ e\x00/\x00p\x00e\x00r\x00s\x00e\x00p\x00\ o\x00l\x00i\x00s\x00d\x00m\x00>\x00h\x00\ t\x00t\x00p\x00s\x00:\x00/\x00/\x00t\x00\ e\x00l\x00e\x00g\x00r\x00a\x00m\x00.\x00\ m\x00e\x00/\x00p\x00e\x00r\x00s\x00e\x00\ p\x00o\x00l\x00i\x00s\x00d\x00m\x00<\x00\ /\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00M<\ a href=https://t\ elegram.me/perse\ polisdm>https://\ telegram.me/pers\ epolisdm\x07\x00\x00\x00\ \x0babout_ui_tr\x01\x03\x00\x00\ \x00\x9a\x00<\x00a\x00 \x00h\x00r\x00e\x00f\ \x00=\x00h\x00t\x00t\x00p\x00s\x00:\x00/\ \x00/\x00t\x00w\x00i\x00t\x00t\x00e\x00r\ \x00.\x00c\x00o\x00m\x00/\x00p\x00e\x00r\ \x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00d\ \x00m\x00>\x00h\x00t\x00t\x00p\x00s\x00:\ \x00/\x00/\x00t\x00w\x00i\x00t\x00t\x00e\ \x00r\x00.\x00c\x00o\x00m\x00/\x00p\x00e\ \x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\ \x00d\x00m\x00<\x00/\x00a\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00Mh\ ttps://twitter.c\ om/persepolisdm<\ /a>\x07\x00\x00\x00\x0babout_ui\ _tr\x01\x03\x00\x00\x00(\x00A\x00c\x00e\x00\ r\x00c\x00a\x00 \x00d\x00e\x00 \x00P\x00\ e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00\ s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10About\ Persepolis\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ \x00D\x00e\x00s\x00a\x00r\x00r\x00o\x00\ l\x00l\x00a\x00d\x00o\x00r\x00e\x00s\x00\ :\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aDevel\ opers\x07\x00\x00\x00\x0babout_\ ui_tr\x01\x03\x00\x00\x00\x10\x00L\x00i\x00\ c\x00e\x00n\x00c\x00i\x00a\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x07License\x07\x00\x00\x00\ \x0babout_ui_tr\x01\x03\x00\x00\ \x00\x0e\x00A\x00c\x00e\x00p\x00t\x00a\x00r\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\x07\x00\x00\x00\ \x0babout_ui_tr\x01\x03\x00\x00\ \x00<\x00G\x00e\x00s\x00t\x00o\x00r\x00 \ \x00d\x00e\x00 \x00d\x00e\x00s\x00c\x00a\ \x00r\x00g\x00a\x00s\x00 \x00P\x00e\x00r\ \x00s\x00e\x00p\x00o\x00l\x00i\x00s\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1bPersepol\ is Download Mana\ ger\x07\x00\x00\x00\x0babout_ui\ _tr\x01\x03\x00\x00\x00\x16\x00T\x00r\x00a\x00\ d\x00u\x00c\x00t\x00o\x00r\x00e\x00s\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0bTransla\ tors\x07\x00\x00\x00\x0babout_u\ i_tr\x01\x03\x00\x00\x00.\x00A\x00\xf1\x00a\ \x00d\x00i\x00r\x00 \x00a\x00 \x00u\x00n\ \x00a\x00 \x00c\x00a\x00t\x00e\x00g\x00o\ \x00r\x00\xed\x00a\x00:\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x11Add to categor\ y: \x07\x00\x00\x00\x0daddlink_\ ui_tr\x01\x03\x00\x00\x00$\x00O\x00p\x00\ c\x00i\x00o\x00n\x00e\x00s\x00 \x00a\x00\ v\x00a\x00n\x00z\x00a\x00d\x00a\x00s\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x10Advance\ d Options\x07\x00\x00\x00\x0dad\ dlink_ui_tr\x01\x03\x00\x00\x00\ \x10\x00C\x00a\x00n\x00c\x00e\x00l\x00a\x00\ r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Cance\ l\x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00>\x00C\x00a\x00m\x00\ b\x00i\x00a\x00r\x00 \x00l\x00a\x00 \x00\ c\x00a\x00r\x00p\x00e\x00t\x00a\x00 \x00\ d\x00e\x00 \x00d\x00e\x00s\x00c\x00a\x00\ r\x00g\x00a\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x16Change Download\ Folder\x07\x00\x00\x00\x0daddl\ ink_ui_tr\x01\x03\x00\x00\x00*\x00\ C\x00a\x00r\x00p\x00e\x00t\x00a\x00 \x00\ d\x00e\x00 \x00d\x00e\x00s\x00c\x00a\x00\ r\x00g\x00a\x00s\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x11Download Fold\ er: \x07\x00\x00\x00\x0daddlink\ _ui_tr\x01\x03\x00\x00\x00\x08\x00I\x00P\ \x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x04IP\ : \x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00\x0c\x00E\x00n\x00l\ \x00a\x00c\x00e\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04\ Link\x07\x00\x00\x00\x0daddlink\ _ui_tr\x01\x03\x00\x00\x00\x18\x00M\x00\xe1\ \x00s\x00 \x00o\x00p\x00c\x00i\x00o\x00n\ \x00e\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0cMo\ re Options\x07\x00\x00\x00\x0da\ ddlink_ui_tr\x01\x03\x00\x00\ \x00\x0e\x00A\x00c\x00e\x00p\x00t\x00a\x00r\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\x07\x00\x00\x00\ \x0daddlink_ui_tr\x01\x03\ \x00\x00\x00\x0e\x00P\x00u\x00e\x00r\x00t\x00o\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Port\ :\x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00\x0a\x00P\x00r\x00o\x00\ x\x00y\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Pro\ xy\x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x006\x00<\x00b\x00>\ \x00N\x00o\x00m\x00b\x00r\x00e\x00 \x00d\ \x00e\x00l\x00 \x00a\x00r\x00c\x00h\x00i\ \x00v\x00o\x00<\x00/\x00b\x00>\x00:\x00 \ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x12Fil\ e name: \x07\x00\x00\x00\ \x18after_download_\ src_ui_tr\x01\x03\x00\x00\x00\x1e\x00\ <\x00b\x00>\x00T\x00a\x00m\x00a\x00\xf1\x00\ o\x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0dSize: \x07\x00\x00\x00\x18after_d\ ownload_src_ui_t\ r\x01\x03\x00\x00\x00\x1a\x00 \x00 \x00 \x00A\x00\ c\x00e\x00p\x00t\x00a\x00r\x00 \x00 \x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x08 OK\ \x07\x00\x00\x00\x14after_do\ wnload_ui_tr\x01\x03\x00\x00\ \x00 \x00A\x00b\x00r\x00i\x00r\x00 \x00u\ \x00n\x00 \x00a\x00r\x00c\x00h\x00i\x00v\ \x00o\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d Op\ en File \x07\x00\x00\x00\x14af\ ter_download_ui_\ tr\x01\x03\x00\x00\x008\x00<\x00b\x00>\x00\xa1\ \x00D\x00e\x00s\x00c\x00a\x00r\x00g\x00a\ \x00 \x00c\x00o\x00m\x00p\x00l\x00e\x00t\ \x00a\x00d\x00a\x00!\x00<\x00/\x00b\x00>\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aDow\ nload Completed!\ \x07\x00\x00\x00\x14after_d\ ownload_ui_tr\x01\x03\x00\ \x00\x00\x1e\x00<\x00b\x00>\x00E\x00n\x00l\x00\ a\x00c\x00e\x00<\x00/\x00b\x00>\x00:\x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dLi\ nk: \x07\x00\x00\x00\x14aft\ er_download_ui_t\ r\x01\x03\x00\x00\x00*\x00<\x00b\x00>\x00G\x00\ u\x00a\x00r\x00d\x00a\x00r\x00 \x00c\x00\ o\x00m\x00o\x00<\x00/\x00b\x00>\x00:\x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Sa\ ve as: \x07\x00\x00\x00\x14\ after_download_u\ i_tr\x01\x03\x00\x00\x00F\x00N\x00o\x00 \ \x00m\x00o\x00s\x00t\x00r\x00a\x00r\x00 \ \x00e\x00s\x00t\x00e\x00 \x00m\x00e\x00n\ \x00s\x00a\x00j\x00e\x00 \x00n\x00u\x00e\ \x00v\x00a\x00m\x00e\x00n\x00t\x00e\x00.\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1eDon't \ show this messag\ e again.\x07\x00\x00\x00\x14aft\ er_download_ui_t\ r\x01\x03\x00\x00\x00@\x00A\x00b\x00r\x00i\x00\ r\x00 \x00l\x00a\x00 \x00c\x00a\x00r\x00\ p\x00e\x00t\x00a\x00 \x00d\x00e\x00 \x00\ d\x00e\x00 \x00d\x00e\x00s\x00c\x00a\x00\ r\x00g\x00a\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x14Open Download F\ older\x07\x00\x00\x00\x14after_\ download_ui_tr\x01\x03\ \x00\x00\x00<\x00G\x00e\x00s\x00t\x00o\x00r\ \x00 \x00d\x00e\x00 \x00d\x00e\x00s\x00c\ \x00a\x00r\x00g\x00a\x00s\x00 \x00P\x00e\ \x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bPersep\ olis Download Ma\ nager\x07\x00\x00\x00\x14after_\ download_ui_tr\x01\x03\ \x00\x00\x00.\x00I\x00n\x00f\x00o\x00r\x00m\ \x00a\x00r\x00 \x00d\x00e\x00 \x00u\x00n\ \x00 \x00p\x00r\x00o\x00b\x00l\x00e\x00m\ \x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0cRepo\ rt Issue\x07\x00\x00\x00\x10log\ _window_ui_tr\x01\x03\x00\ \x00\x00\xd6\x00<\x00b\x00>\x00<\x00c\x00e\x00\ n\x00t\x00e\x00r\x00>\x00E\x00s\x00t\x00\ e\x00 \x00e\x00n\x00l\x00a\x00c\x00e\x00\ \x00h\x00a\x00 \x00s\x00i\x00d\x00o\x00\ \x00a\x00\xf1\x00a\x00d\x00i\x00d\x00o\x00\ \x00a\x00n\x00t\x00e\x00r\x00i\x00o\x00\ r\x00m\x00e\x00n\x00t\x00e\x00.\x00 \x00\ \xbf\x00S\x00e\x00g\x00u\x00r\x00o\x00 \x00\ d\x00e\x00 \x00q\x00u\x00e\x00 \x00q\x00\ u\x00i\x00e\x00r\x00e\x00 \x00a\x00\xf1\x00\ a\x00d\x00i\x00r\x00l\x00o\x00 \x00d\x00\ e\x00 \x00n\x00u\x00e\x00v\x00o\x00?\x00\ <\x00/\x00c\x00e\x00n\x00t\x00e\x00r\x00\ >\x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00r
Th\ is link has been\ added before! \ \ Are you sure y\ ou want to add i\ t again?\x07\x00\x00\x00\x14mainwi\ ndow_src_ui_tr\x01\x03\ \x00\x00\x00&\x00<\x00b\x00>\x00C\x00o\x00n\ \x00e\x00x\x00i\x00o\x00n\x00e\x00s\x00<\ \x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x14Connectio\ ns: \x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x00\x22\x00<\x00b\x00>\x00D\x00\ e\x00s\x00c\x00a\x00r\x00g\x00a\x00d\x00\ o\x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x13Downloaded\ : \x07\x00\x00\x00\x14mainw\ indow_src_ui_tr\x01\ \x03\x00\x00\x00B\x00<\x00b\x00>\x00T\x00i\x00\ e\x00m\x00p\x00o\x00 \x00r\x00e\x00s\x00\ t\x00a\x00n\x00t\x00e\x00 \x00e\x00s\x00\ t\x00i\x00m\x00a\x00d\x00o\x00<\x00/\x00\ b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1cEstimated ti\ me left: \x07\x00\x00\ \x00\x14mainwindow_src\ _ui_tr\x01\x03\x00\x00\x00\x1e\x00<\x00b\ \x00>\x00E\x00n\x00l\x00a\x00c\x00e\x00<\ \x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0dLink:\ \x07\x00\x00\x00\x14mainwindow\ _src_ui_tr\x01\x03\x00\x00\x00\x1e\ \x00<\x00b\x00>\x00E\x00s\x00t\x00a\x00d\ \x00o\x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0fStatu\ s: \x07\x00\x00\x00\x14main\ window_src_ui_tr\ \x01\x03\x00\x00\x00:\x00<\x00b\x00>\x00T\x00a\ \x00s\x00a\x00 \x00d\x00e\x00 \x00t\x00r\ \x00a\x00n\x00s\x00f\x00e\x00r\x00e\x00n\ \x00c\x00i\x00a\x00<\x00/\x00b\x00>\x00:\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Tra\ nsfer rate: \ \x07\x00\x00\x00\x14mainwindow_\ src_ui_tr\x01\x03\x00\x00\x00\x22\x00\ D\x00e\x00s\x00c\x00a\x00r\x00g\x00a\x00\ \x00c\x00o\x00m\x00p\x00l\x00e\x00t\x00\ a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Downl\ oad Complete\x07\x00\x00\x00\ \x14mainwindow_src_\ ui_tr\x01\x03\x00\x00\x00\x22\x00D\x00e\x00\ s\x00c\x00a\x00r\x00g\x00a\x00 \x00i\x00\ n\x00i\x00c\x00i\x00a\x00d\x00a\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0fDownload \ Starts\x07\x00\x00\x00\x14mainw\ indow_src_ui_tr\x01\ \x03\x00\x00\x00\x22\x00D\x00e\x00s\x00c\x00a\x00\ r\x00g\x00a\x00 \x00d\x00e\x00t\x00e\x00\ n\x00i\x00d\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x10Download Stoppe\ d\x07\x00\x00\x00\x14mainwindow\ _src_ui_tr\x01\x03\x00\x00\x00\x10\ \x00E\x00r\x00r\x00o\x00r\x00 \x00-\x00 \ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x08Error \ - \x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ \x0e\x00E\x00r\x00r\x00o\x00r\x00:\x00 \x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x07Error: \ \x07\x00\x00\x00\x14mainwindow_\ src_ui_tr\x01\x03\x00\x00\x00P\x00\ N\x00o\x00 \x00h\x00a\x00y\x00 \x00s\x00\ u\x00f\x00i\x00c\x00i\x00e\x00n\x00t\x00\ e\x00 \x00e\x00s\x00p\x00a\x00c\x00i\x00\ o\x00 \x00d\x00i\x00s\x00p\x00o\x00n\x00\ i\x00b\x00l\x00e\x00 \x00e\x00n\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x19Not eno\ ugh free space i\ n:\x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ 6\x00L\x00a\x00 \x00o\x00p\x00e\x00r\x00\ a\x00c\x00i\x00\xf3\x00n\x00 \x00n\x00o\x00\ \x00t\x00u\x00v\x00o\x00 \x00\xe9\x00x\x00\ i\x00t\x00o\x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1dOperation was n\ ot successful.\x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x00>\x00R\x00\ e\x00a\x00n\x00u\x00d\x00e\x00 \x00l\x00\ a\x00 \x00c\x00a\x00t\x00e\x00g\x00o\x00\ r\x00\xed\x00a\x00 \x00s\x00i\x00g\x00u\x00\ i\x00e\x00n\x00t\x00e\x00:\x08\x00\x00\x00\x00\ \x06\x00\x00\x00&Please resu\ me the following\ category: \x07\x00\x00\x00\x14\ mainwindow_src_u\ i_tr\x01\x03\x00\x00\x00.\x00E\x00r\x00r\ \x00o\x00r\x00 \x00d\x00e\x00 \x00m\x00u\ \x00l\x00t\x00i\x00p\x00l\x00e\x00x\x00a\ \x00c\x00i\x00\xf3\x00n\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0cmuxing error\x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x00\x16\x00 \x00\ d\x00e\x00s\x00c\x00a\x00r\x00g\x00a\x00\ d\x00o\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0b do\ wnloaded\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00H\x00<\x00b\x00>\x00E\x00s\x00t\x00\ a\x00d\x00o\x00 \x00d\x00e\x00l\x00 \x00\ a\x00r\x00c\x00h\x00i\x00v\x00o\x00 \x00\ d\x00e\x00 \x00a\x00u\x00d\x00i\x00o\x00\ :\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x1aAudio fi\ le status: \x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00H\x00<\x00b\x00>\ \x00E\x00s\x00t\x00a\x00d\x00o\x00 \x00d\ \x00e\x00 \x00l\x00a\x00 \x00m\x00u\x00l\ \x00t\x00i\x00p\x00l\x00e\x00x\x00a\x00c\ \x00i\x00\xf3\x00n\x00:\x00 \x00<\x00/\x00b\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16M\ uxing status: \x07\x00\x00\x00\x10mainwindo\ w_ui_tr\x01\x03\x00\x00\x00\x1e\x00<\x00\ b\x00>\x00E\x00s\x00t\x00a\x00d\x00o\x00\ :\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0fStatus: \ \x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00H\x00\ <\x00b\x00>\x00E\x00s\x00t\x00a\x00d\x00\ o\x00 \x00d\x00e\x00l\x00 \x00a\x00r\x00\ c\x00h\x00i\x00v\x00o\x00 \x00d\x00e\x00\ \x00v\x00\xed\x00d\x00e\x00o\x00:\x00 \x00\ <\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1aVideo file s\ tatus: \x07\x00\x00\x00\x10\ mainwindow_ui_tr\ \x01\x03\x00\x00\x00D\x00A\x00\xf1\x00a\x00d\x00i\ \x00r\x00 \x00u\x00n\x00 \x00n\x00u\x00e\ \x00v\x00o\x00 \x00e\x00n\x00l\x00a\x00c\ \x00e\x00 \x00d\x00e\x00 \x00d\x00e\x00s\ \x00c\x00a\x00r\x00g\x00a\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x15Add New Down\ load Link\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00,\x00D\x00e\x00s\x00p\x00u\x00\xe9\ \x00s\x00 \x00d\x00e\x00 \x00l\x00a\x00 \ \x00d\x00e\x00s\x00c\x00a\x00r\x00g\x00a\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0eAfter \ download\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00\x0e\x00A\x00p\x00l\x00i\x00c\x00a\x00\ r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Apply\ \x07\x00\x00\x00\x10mainwindow_\ ui_tr\x01\x03\x00\x00\x00L\x00D\x00e\x00\ s\x00c\x00a\x00r\x00g\x00a\x00r\x00 \x00\ p\x00r\x00i\x00m\x00e\x00r\x00o\x00\x0a\x00\ e\x00l\x00 \x00f\x00i\x00n\x00a\x00l\x00\ \x00d\x00e\x00 \x00l\x00a\x00 \x00l\x00\ i\x00s\x00t\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x22Download bottom\ of\x0a the list fi\ rst\x07\x00\x00\x00\x10mainwind\ ow_ui_tr\x01\x03\x00\x00\x00(\x00H\ \x00o\x00r\x00a\x00 \x00d\x00e\x00 \x00f\ \x00i\x00n\x00a\x00l\x00i\x00z\x00a\x00c\ \x00i\x00\xf3\x00n\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08\ End Time\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00\x0a\x00S\x00a\x00l\x00i\x00r\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x04Exit\x07\x00\x00\x00\x10\ mainwindow_ui_tr\ \x01\x03\x00\x00\x00$\x00P\x00a\x00u\x00s\x00a\ \x00r\x00 \x00l\x00a\x00 \x00d\x00e\x00s\ \x00c\x00a\x00r\x00g\x00a\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0ePause Downlo\ ad\x07\x00\x00\x00\x10mainwindo\ w_ui_tr\x01\x03\x00\x00\x00<\x00G\x00\ e\x00s\x00t\x00o\x00r\x00 \x00d\x00e\x00\ \x00d\x00e\x00s\x00c\x00a\x00r\x00g\x00\ a\x00s\x00 \x00P\x00e\x00r\x00s\x00e\x00\ p\x00o\x00l\x00i\x00s\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x1bPersepolis Do\ wnload Manager\x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00\x10\x00P\x00r\x00o\x00\ g\x00r\x00e\x00s\x00o\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x08Progress\x07\x00\x00\x00\x10\ mainwindow_ui_tr\ \x01\x03\x00\x00\x00\x16\x00P\x00r\x00o\x00p\x00i\ \x00e\x00d\x00a\x00d\x00e\x00s\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0aProperties\ \x07\x00\x00\x00\x10mainwindow_\ ui_tr\x01\x03\x00\x00\x00(\x00R\x00e\x00\ a\x00n\x00u\x00d\x00a\x00r\x00 \x00l\x00\ a\x00 \x00d\x00e\x00s\x00c\x00a\x00r\x00\ g\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fRes\ ume Download\x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00P\x00M\x00o\x00s\x00t\x00\ r\x00a\x00r\x00/\x00o\x00c\x00u\x00l\x00\ t\x00a\x00r\x00 \x00e\x00l\x00 \x00i\x00\ c\x00o\x00n\x00o\x00 \x00d\x00e\x00 \x00\ n\x00o\x00t\x00i\x00f\x00i\x00c\x00a\x00\ c\x00i\x00\xf3\x00n\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1aShow/Hide syste\ m tray icon\x07\x00\x00\x00\x10\ mainwindow_ui_tr\ \x01\x03\x00\x00\x00 \x00A\x00p\x00a\x00g\x00a\ \x00r\x00 \x00e\x00l\x00 \x00e\x00q\x00u\ \x00i\x00p\x00o\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09\ Shut Down\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00\x1c\x00H\x00o\x00r\x00a\x00 \x00d\ \x00e\x00 \x00i\x00n\x00i\x00c\x00i\x00o\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aStart \ Time\x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x008\x00\ D\x00e\x00t\x00e\x00n\x00e\x00r\x00/\x00\ c\x00a\x00n\x00c\x00e\x00l\x00a\x00r\x00\ \x00l\x00a\x00 \x00d\x00e\x00s\x00c\x00\ a\x00r\x00g\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x14Stop/Cancel Dow\ nload\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00,\ \x00D\x00e\x00s\x00p\x00u\x00\xe9\x00s\x00 \ \x00d\x00e\x00 \x00l\x00a\x00 \x00d\x00e\ \x00s\x00c\x00a\x00r\x00g\x00a\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0eAfter down\ load\x07\x00\x00\x00\x0eprogres\ s_ui_tr\x01\x03\x00\x00\x00\x0e\x00A\x00\ p\x00l\x00i\x00c\x00a\x00r\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x05Apply\x07\x00\x00\x00\x0ep\ rogress_ui_tr\x01\x03\x00\ \x00\x004\x00I\x00n\x00f\x00o\x00r\x00m\x00\ a\x00c\x00i\x00\xf3\x00n\x00 \x00d\x00e\x00\ \x00l\x00a\x00 \x00d\x00e\x00s\x00c\x00\ a\x00r\x00g\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x14Download Inform\ ation\x07\x00\x00\x00\x0eprogre\ ss_ui_tr\x01\x03\x00\x00\x00(\x00O\ \x00p\x00c\x00i\x00o\x00n\x00e\x00s\x00 \ \x00d\x00e\x00 \x00d\x00e\x00s\x00c\x00a\ \x00r\x00g\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10\ Download Options\ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00\x16\x00D\x00e\x00s\x00\ c\x00a\x00r\x00g\x00a\x00d\x00o\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0bDownloa\ ded:\x07\x00\x00\x00\x0eprogres\ s_ui_tr\x01\x03\x00\x00\x002\x00T\x00\ i\x00e\x00m\x00p\x00o\x00 \x00r\x00e\x00\ s\x00t\x00a\x00n\x00t\x00e\x00 \x00e\x00\ s\x00t\x00i\x00m\x00a\x00d\x00o\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x14Estimat\ ed time left:\x07\x00\x00\ \x00\x0eprogress_ui_tr\ \x01\x03\x00\x00\x00*\x00N\x00\xfa\x00m\x00e\x00r\ \x00o\x00 \x00d\x00e\x00 \x00c\x00o\x00n\ \x00e\x00x\x00i\x00o\x00n\x00e\x00s\x00:\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x17Number\ of connections:\ \x07\x00\x00\x00\x0eprogress_u\ i_tr\x01\x03\x00\x00\x00\x0c\x00P\x00a\x00u\ \x00s\x00a\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05\ Pause\x07\x00\x00\x00\x0eprogre\ ss_ui_tr\x01\x03\x00\x00\x00<\x00G\ \x00e\x00s\x00t\x00o\x00r\x00 \x00d\x00e\ \x00 \x00d\x00e\x00s\x00c\x00a\x00r\x00g\ \x00a\x00s\x00 \x00P\x00e\x00r\x00s\x00e\ \x00p\x00o\x00l\x00i\x00s\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1bPersepolis D\ ownload Manager\x07\ \x00\x00\x00\x0eprogress_ui_\ tr\x01\x03\x00\x00\x00\x10\x00R\x00e\x00a\x00n\ \x00u\x00d\x00a\x00r\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x06Resume\x07\x00\x00\x00\x0epro\ gress_ui_tr\x01\x03\x00\x00\x00\ \x0c\x00A\x00p\x00a\x00g\x00a\x00r\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x09Shut Down\ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00\x0e\x00E\x00s\x00t\x00\ a\x00d\x00o\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x08Status: \x07\x00\x00\x00\x0epr\ ogress_ui_tr\x01\x03\x00\x00\ \x00\x0e\x00D\x00e\x00t\x00e\x00n\x00e\x00r\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x04Stop\x07\x00\ \x00\x00\x0eprogress_ui_t\ r\x01\x03\x00\x00\x00,\x00T\x00a\x00s\x00a\x00\ \x00d\x00e\x00 \x00t\x00r\x00a\x00n\x00\ s\x00f\x00e\x00r\x00e\x00n\x00c\x00i\x00\ a\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fTra\ nsfer rate: \x07\x00\x00\x00\ \x0eprogress_ui_tr\x01\ \x03\x00\x00\x00t\x00<\x00c\x00e\x00n\x00t\x00\ e\x00r\x00>\x00<\x00b\x00>\x00E\x00s\x00\ t\x00e\x00 \x00a\x00t\x00a\x00j\x00o\x00\ \x00y\x00a\x00 \x00s\x00e\x00 \x00h\x00\ a\x00 \x00u\x00s\x00a\x00d\x00o\x00 \x00\ a\x00n\x00t\x00e\x00s\x00.\x00 \x00\xa1\x00\ U\x00s\x00e\x00 \x00o\x00t\x00r\x00o\x00\ !\x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00_
Th\ is shortcut has \ been used before\ ! \ Use another\ one!
\x07\x00\x00\x00\x11setting_s\ rc_ui_tr\x01\x03\x00\x00\x00j\x00<\ \x00h\x00t\x00m\x00l\x00>\x00<\x00h\x00e\ \x00a\x00d\x00/\x00>\x00<\x00b\x00o\x00d\ \x00y\x00>\x00<\x00p\x00>\x00F\x00o\x00r\ \x00m\x00a\x00t\x00o\x00 \x00H\x00H\x00:\ \x00M\x00M\x00<\x00/\x00p\x00>\x00<\x00/\ \x00b\x00o\x00d\x00y\x00>\x00<\x00/\x00h\ \x00t\x00m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\ \x004<\ body>

Format H\ H:MM

<\ /html>\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\xa6\x00<\ \x00h\x00t\x00m\x00l\x00>\x00<\x00h\x00e\ \x00a\x00d\x00/\x00>\x00<\x00b\x00o\x00d\ \x00y\x00>\x00<\x00p\x00>\x00C\x00o\x00n\ \x00f\x00i\x00g\x00u\x00r\x00a\x00 \x00e\ \x00l\x00 \x00t\x00i\x00e\x00m\x00p\x00o\ \x00 \x00d\x00e\x00 \x00e\x00s\x00p\x00e\ \x00r\x00a\x00 \x00e\x00n\x00 \x00s\x00e\ \x00g\x00u\x00n\x00d\x00o\x00s\x00.\x00 \ \x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00o\ \x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\ \x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00@

Set timeout \ in seconds.

\ \x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00\xde\x00<\x00h\x00t\x00m\x00l\ \x00>\x00<\x00h\x00e\x00a\x00d\x00/\x00>\ \x00<\x00b\x00o\x00d\x00y\x00>\x00<\x00p\ \x00>\x00E\x00s\x00 \x00p\x00o\x00s\x00i\ \x00b\x00l\x00e\x00 \x00q\x00u\x00e\x00 \ \x00e\x00s\x00t\x00a\x00 \x00c\x00a\x00r\ \x00a\x00c\x00t\x00e\x00r\x00\xed\x00s\x00t\ \x00i\x00c\x00a\x00 \x00n\x00o\x00 \x00f\ \x00u\x00n\x00c\x00i\x00o\x00n\x00e\x00 \ \x00e\x00n\x00 \x00s\x00u\x00 \x00s\x00i\ \x00s\x00t\x00e\x00m\x00a\x00 \x00o\x00p\ \x00e\x00r\x00a\x00t\x00i\x00v\x00o\x00.\ \x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00o\ \x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\ \x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00[

This feature\ may not work in\ your operating \ system.

\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ \xc4\x00<\x00h\x00t\x00m\x00l\x00>\x00<\x00\ h\x00e\x00a\x00d\x00/\x00>\x00<\x00b\x00\ o\x00d\x00y\x00>\x00<\x00p\x00>\x00E\x00\ l\x00 \x00u\x00s\x00o\x00 \x00d\x00e\x00\ \x00c\x00o\x00n\x00e\x00x\x00i\x00o\x00\ n\x00e\x00s\x00 \x00m\x00\xfa\x00l\x00t\x00\ i\x00p\x00l\x00e\x00s\x00 \x00p\x00u\x00\ e\x00d\x00e\x00 \x00a\x00c\x00e\x00l\x00\ e\x00r\x00a\x00r\x00 \x00l\x00a\x00 \x00\ d\x00e\x00s\x00c\x00a\x00r\x00g\x00a\x00\ .\x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00\ o\x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00\ m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00c<\ html>

Using multi\ ple connections \ can help speed u\ p your download.\

\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x10\x00C\x00a\x00n\ \x00c\x00e\x00l\x00a\x00r\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x06Cancel\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x0e\x00C\x00a\x00m\x00b\x00i\x00a\x00r\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Change\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00&\x00E\x00s\x00q\x00u\ \x00e\x00m\x00a\x00 \x00d\x00e\x00 \x00c\ \x00o\x00l\x00o\x00r\x00e\x00s\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0eColor sc\ heme: \x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00&\x00V\ \x00a\x00l\x00o\x00r\x00e\x00s\x00 \x00p\ \x00o\x00r\x00 \x00d\x00e\x00f\x00e\x00c\ \x00t\x00o\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08De\ faults\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00(\x00O\ \x00p\x00c\x00i\x00o\x00n\x00e\x00s\x00 \ \x00d\x00e\x00 \x00d\x00e\x00s\x00c\x00a\ \x00r\x00g\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10\ Download Options\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x16\x00T\x00i\x00p\x00o\ \x00g\x00r\x00a\x00f\x00\xed\x00a\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x06Font: \x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00\x80\x00O\x00c\x00u\x00l\x00t\ \x00a\x00r\x00 \x00l\x00a\x00 \x00v\x00e\ \x00n\x00t\x00a\x00n\x00a\x00 \x00p\x00r\ \x00i\x00n\x00c\x00i\x00p\x00a\x00l\x00 \ \x00a\x00l\x00 \x00h\x00a\x00c\x00e\x00r\ \x00 \x00c\x00l\x00i\x00c\x00 \x00e\x00n\ \x00 \x00e\x00l\x00 \x00b\x00o\x00t\x00\xf3\ \x00n\x00 \x00d\x00e\x00 \x00c\x00e\x00r\ \x00r\x00a\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00)\ Hide main window\ if close button\ clicked.\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ \x0e\x00I\x00c\x00o\x00n\x00o\x00s\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x07Icons: \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x008\x00\xa1\x00M\x00a\x00n\ \x00t\x00e\x00n\x00g\x00a\x00 \x00e\x00l\ \x00 \x00s\x00i\x00s\x00t\x00e\x00m\x00a\ \x00 \x00a\x00c\x00t\x00i\x00v\x00o\x00!\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x12Keep s\ ystem awake!\x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00*\x00T\x00i\x00p\x00o\x00 \x00d\ \x00e\x00 \x00n\x00o\x00t\x00i\x00f\x00i\ \x00c\x00a\x00c\x00i\x00\xf3\x00n\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x13Notifica\ tion type: \x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x1c\x00N\x00o\x00t\x00i\x00f\x00i\x00\ c\x00a\x00c\x00i\x00o\x00n\x00e\x00s\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0dNotific\ ations\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00*\x00N\ \x00\xfa\x00m\x00e\x00r\x00o\x00 \x00d\x00e\ \x00 \x00c\x00o\x00n\x00e\x00x\x00i\x00o\ \x00n\x00e\x00s\x00:\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x17Number of conn\ ections: \x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ &\x00N\x00\xfa\x00m\x00e\x00r\x00o\x00 \x00\ d\x00e\x00 \x00i\x00n\x00t\x00e\x00n\x00\ t\x00o\x00s\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x11Number of tries\ : \x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x0e\x00A\x00c\x00e\ \x00p\x00t\x00a\x00r\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x02OK\x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\x18\x00P\x00r\ \x00e\x00f\x00e\x00r\x00e\x00n\x00c\x00i\ \x00a\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0bPr\ eferences\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ (\x00P\x00u\x00l\x00s\x00a\x00r\x00 \x00\ t\x00e\x00c\x00l\x00a\x00s\x00 \x00n\x00\ u\x00e\x00v\x00a\x00s\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0ePress new key\ s\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00:\x00E\x00j\x00e\x00\ c\x00u\x00t\x00a\x00r\x00 \x00P\x00e\x00\ r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00\ \x00a\x00l\x00 \x00i\x00n\x00i\x00c\x00\ i\x00o\x08\x00\x00\x00\x00\x06\x00\x00\x00\x19Run\ Persepolis at s\ tartup\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x0c\x00A\ \x00t\x00a\x00j\x00o\x00s\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x09Shortcuts\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x0e\x00T\x00a\x00m\x00a\x00\xf1\x00\ o\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Siz\ e: \x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00\x0c\x00E\x00s\x00\ t\x00a\x00d\x00o\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x06Status\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x0e\x00\ E\x00s\x00t\x00i\x00l\x00o\x00:\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x07Style: \x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x008\x00T\x00i\x00e\x00m\x00p\ \x00o\x00 \x00d\x00e\x00 \x00e\x00s\x00p\ \x00e\x00r\x00a\x00 \x00(\x00s\x00e\x00g\ \x00u\x00n\x00d\x00o\x00s\x00)\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x13Timeout \ (seconds): \x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00B\x00O\x00p\x00c\x00i\x00o\x00n\x00\ e\x00s\x00 \x00d\x00e\x00 \x00l\x00a\x00\ \x00b\x00\xfa\x00s\x00q\x00u\x00e\x00d\x00\ a\x00 \x00d\x00e\x00 \x00v\x00\xed\x00d\x00\ e\x00o\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14V\ ideo Finder Opti\ ons\x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00\x10\x00V\x00o\x00\ l\x00u\x00m\x00e\x00n\x00:\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x08Volume: \x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00>\x00C\x00a\x00m\x00b\x00i\x00\ a\x00r\x00 \x00l\x00a\x00 \x00c\x00a\x00\ r\x00p\x00e\x00t\x00a\x00 \x00d\x00e\x00\ \x00d\x00e\x00s\x00c\x00a\x00r\x00g\x00\ a\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Cha\ nge Download Fol\ der\x07\x00\x00\x00\x0atext_ui_\ tr\x01\x03\x00\x00\x00\x1a\x00D\x00i\x00r\x00e\ \x00c\x00c\x00i\x00\xf3\x00n\x00 \x00I\x00P\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x03IP:\x07\ \x00\x00\x00\x0atext_ui_tr\x01\x03\ \x00\x00\x00<\x00G\x00e\x00s\x00t\x00o\x00r\ \x00 \x00d\x00e\x00 \x00d\x00e\x00s\x00c\ \x00a\x00r\x00g\x00a\x00s\x00 \x00P\x00e\ \x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bPersep\ olis Download Ma\ nager\x07\x00\x00\x00\x0atext_u\ i_tr\x01\x03\x00\x00\x00\x0e\x00P\x00u\x00e\ \x00r\x00t\x00o\x00:\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x05Port:\x07\x00\x00\x00\x0atext\ _ui_tr\x01\x03\x00\x00\x00H\x00<\x00b\ \x00>\x00E\x00s\x00t\x00a\x00d\x00o\x00 \ \x00d\x00e\x00l\x00 \x00a\x00r\x00c\x00h\ \x00i\x00v\x00o\x00 \x00d\x00e\x00 \x00a\ \x00u\x00d\x00i\x00o\x00:\x00 \x00<\x00/\ \x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aAudio file stat\ us:
\x07\x00\x00\x00\x1bvid\ eo_finder_progre\ ss_ui_tr\x01\x03\x00\x00\x00H\x00<\ \x00b\x00>\x00E\x00s\x00t\x00a\x00d\x00o\ \x00 \x00d\x00e\x00 \x00l\x00a\x00 \x00m\ \x00u\x00l\x00t\x00i\x00p\x00l\x00e\x00x\ \x00a\x00c\x00i\x00\xf3\x00n\x00:\x00 \x00<\ \x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16\ Muxing status\ : \x07\x00\x00\x00\x1bvideo\ _finder_progress\ _ui_tr\x01\x03\x00\x00\x00H\x00<\x00b\ \x00>\x00E\x00s\x00t\x00a\x00d\x00o\x00 \ \x00d\x00e\x00l\x00 \x00a\x00r\x00c\x00h\ \x00i\x00v\x00o\x00 \x00d\x00e\x00 \x00v\ \x00\xed\x00d\x00e\x00o\x00:\x00 \x00<\x00/\ \x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aVideo file stat\ us:
\x07\x00\x00\x00\x1bvid\ eo_finder_progre\ ss_ui_tr\x01\x88\x00\x00\x00\x02\x01\x01\ \ \x00\x00&K\ <\ \xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\xa7\ \x00\x00\x00\x05zh_TWB\x00\x00\x03\xa0\x00\x00\ \x05;\x00\x00\x03\xb8\x00\x00\x05;\x00\x00\x06\x22\x00\x00\ \x05;\x00\x00\x1e\x05\x00\x00N:\x00\x00 \xa9\x00\x04\ \xcf\x04\x00\x00\x129\x00\x04\xe3\xc0\x00\x00\x05\x90\x00\x05\ 0K\x00\x00\x05\xc2\x00\x05\xab`\x00\x00\x17V\x00H\ w9\x00\x00\x11}\x00Hw9\x00\x00\x14\xdb\x00V\ \x8c\x95\x00\x00\x16>\x00Wiz\x00\x00\x06J\x00W\ iz\x00\x00!1\x00W\x96\xf9\x00\x00\x06y\x00\x97\ \xa2\x10\x00\x00\x04h\x00\xc2\xad\xd0\x00\x00\x0b_\x01\x18\ \xab\xd4\x00\x00\x11\xab\x01\x8bp\x0e\x00\x00\x19/\x02S\ \xd0\x00\x00\x00\x07K\x02\x9a\xf5p\x00\x00\x0b\xb3\x02\xf9\ \xc5\xc5\x00\x00\x03\x89\x03\x0d1^\x00\x00\x08\xb2\x03\x1c\ \xc5*\x00\x00\x15\x81\x03<\x83\x03\x00\x00\x05\xec\x03K\ F\xe3\x00\x00\x15F\x03KF\xe3\x00\x00\x1b\xcd\x03\x92\ \xd2\xce\x00\x00\x1c5\x03\xdc\xdc%\x00\x00\x09\xb6\x04]\ I3\x00\x00\x1e^\x04e\xac\xf5\x00\x00\x12\x04\x04\x98\ I\xbc\x00\x00\x04\xdf\x04\x98I\xbc\x00\x00\x1b\x11\x04\x9e\ \x84\xd5\x00\x00\x1b=\x04\xd6W\xc0\x00\x00\x1c\x07\x05\x13\ \xccT\x00\x00\x0fu\x05_. \x00\x00\x0e\xd9\x05_\ \xa8`\x00\x00\x0c`\x05i<\xfe\x00\x00\x10Y\x05v\ \x1b\x9e\x00\x00\x09\xef\x05\x8c\xac5\x00\x00\x16\xc8\x05\xa1\ \x08\xc0\x00\x00\x1f$\x05\xa3\x9c>\x00\x00\x10\x06\x05\xa3\ \x9c>\x00\x00!\xc3\x05\xa8X\xf3\x00\x00\x03\x09\x05\xaa\ \x8b\xc3\x00\x00\x1fR\x06-B\x0e\x00\x00\x0f\xab\x06-\ B\x0e\x00\x00!]\x069\x82N\x00\x00\x10\xa1\x069\ \x82N\x00\x00\x22!\x06<=\x10\x00\x00 6\x06]\ 1\xde\x00\x00\x02\x02\x06\x9aK\x00\x00\x00\x07\x80\x06\x9a\ \xf5C\x00\x00\x1e\xf3\x06\x9c(\x01\x00\x00\x1c\xcb\x06\xc5\ )*\x00\x00\x15\xb7\x06\xcc\xd6\xa3\x00\x00\x132\x07\x14\ *\x1e\x00\x00\x13\xa1\x076\xcf`\x00\x00\x05Q\x07[\ &u\x00\x00\x0d\x07\x07\x9b]0\x00\x00\x1d\xc8\x07\x9c\ 1\x03\x00\x00\x1f\xf0\x08g-\xa2\x00\x00\x09\x07\x09>\ \x0d$\x00\x00\x14]\x09^\x89\xd3\x00\x00\x13\x01\x09`\ \x06\xb5\x00\x00\x14&\x09g\x01\xd0\x00\x00\x1f\xad\x09\x93\ \xd2\xfe\x00\x00\x15\x07\x09\x96F0\x00\x00\x0d\xcc\x0a\x0c\ \x87\x0e\x00\x00\x17\xbd\x0a_\xd7\x0e\x00\x00\x07\xbe\x0a_\ \xf3\xfb\x00\x00\x10\xfc\x0as>\xc3\x00\x00\x049\x0a\x8b\ \xc3`\x00\x00\x17%\x0a\x97\x00\x80\x00\x00\x06\xfd\x0a\xa2\ Yp\x00\x00\x1e\x98\x0a\xc0(\x90\x00\x00\x1f~\x0b`\ r`\x00\x00\x1d\x15\x0bn\xb1\xee\x00\x00\x1a\x22\x0bv\ \x04\xf0\x00\x00\x0b\x0c\x0b\x89w\x94\x00\x00\x11D\x0b\x89\ w\x94\x00\x00\x14\xa4\x0b\xc8\xc7\x13\x00\x00\x1b\x9f\x0b\xf9\ \x95\xb3\x00\x00\x0dI\x0c(\x19\x04\x00\x00\x13e\x0c2\ \xc0S\x00\x00\x03Y\x0ce\x0f.\x00\x00\x13\xf4\x0ce\ \x0f.\x00\x00\x16\xf5\x0c\x96q\xc0\x00\x00\x08\x19\x0c\x96\ q\xc0\x00\x00\x0c\x16\x0c\x99e\x80\x00\x00\x0e\x07\x0c\xb5\ \x86\x80\x00\x00\x15\xfc\x0c\xb5\x86\x80\x00\x00\x1d\x87\x0c\xdd\ \xc2\x03\x00\x00\x1e-\x0c\xe0\x1a\xf3\x00\x00\x1dT\x0c\xfb\ \xe0\x8a\x00\x00\x0e=\x0dq\x98\xde\x00\x00\x00\x00\x0d\x99\ \xf9B\x00\x00\x03\xde\x0d\x99\xf9B\x00\x00\x09R\x0d\x99\ \xf9B\x00\x00\x12\xa1\x0d\x99\xf9B\x00\x00\x16j\x0d\x99\ \xf9B\x00\x00 \xd7\x0e i\x22\x00\x00\x0f8\x0e.\ d\xa4\x00\x00\x12f\x0e7I\xc3\x00\x00\x04\xa5\x0ex\ \xa8B\x00\x00\x05\x0b\x0ex\xa8B\x00\x00 f\x0e\xc4\ J\xf0\x00\x00\x06\xaa\x0f6\xb6\x90\x00\x00\x0c\xae\x0f}\ \x11p\x00\x00\x08c\x0f\xa6V\x80\x00\x00\x1c\x9c\x0f\xa7\ \xb6\x04\x00\x00\x0d\x89\x0f\xac[\xee\x00\x00\x0e\x89\x0f\xd1\ ?\x00\x00\x00\x17\x81\x0f\xd6\xe5\xde\x00\x00\x18o\x0f\xde\ {\xf0\x00\x00\x1bi\x0f\xf3\x03\x0e\x00\x00\x00\xfbi\x00\ \x00\x22\x87\x03\x00\x00\x00\x92\x00<\x00a\x00 \x00h\ \x00r\x00e\x00f\x00=\x00h\x00t\x00t\x00p\ \x00s\x00:\x00/\x00/\x00p\x00e\x00r\x00s\ \x00e\x00p\x00o\x00l\x00i\x00s\x00d\x00m\ \x00.\x00g\x00i\x00t\x00h\x00u\x00b\x00.\ \x00i\x00o\x00>\x00h\x00t\x00t\x00p\x00s\ \x00:\x00/\x00/\x00p\x00e\x00r\x00s\x00e\ \x00p\x00o\x00l\x00i\x00s\x00d\x00m\x00.\ \x00g\x00i\x00t\x00h\x00u\x00b\x00.\x00i\ \x00o\x00<\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\ \x00\x00\x00I
https\ ://persepolisdm.\ github.io\x07\x00\x00\ \x00\x0babout_ui_tr\x01\x03\x00\ \x00\x00\x9a\x00<\x00a\x00 \x00h\x00r\x00e\x00\ f\x00=\x00h\x00t\x00t\x00p\x00s\x00:\x00\ /\x00/\x00t\x00e\x00l\x00e\x00g\x00r\x00\ a\x00m\x00.\x00m\x00e\x00/\x00p\x00e\x00\ r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00\ d\x00m\x00>\x00h\x00t\x00t\x00p\x00s\x00\ :\x00/\x00/\x00t\x00e\x00l\x00e\x00g\x00\ r\x00a\x00m\x00.\x00m\x00e\x00/\x00p\x00\ e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00\ s\x00d\x00m\x00<\x00/\x00a\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00M\ https://telegram\ .me/persepolisdm\ \x07\x00\x00\x00\x0babout_u\ i_tr\x01\x03\x00\x00\x00\x9a\x00<\x00a\x00 \ \x00h\x00r\x00e\x00f\x00=\x00h\x00t\x00t\ \x00p\x00s\x00:\x00/\x00/\x00t\x00w\x00i\ \x00t\x00t\x00e\x00r\x00.\x00c\x00o\x00m\ \x00/\x00p\x00e\x00r\x00s\x00e\x00p\x00o\ \x00l\x00i\x00s\x00d\x00m\x00>\x00h\x00t\ \x00t\x00p\x00s\x00:\x00/\x00/\x00t\x00w\ \x00i\x00t\x00t\x00e\x00r\x00.\x00c\x00o\ \x00m\x00/\x00p\x00e\x00r\x00s\x00e\x00p\ \x00o\x00l\x00i\x00s\x00d\x00m\x00<\x00/\ \x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00Mhttps://t\ witter.com/perse\ polisdm\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ \x00A\x00b\x00o\x00u\x00t\x00 \x00P\x00\ e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00\ s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10About\ Persepolis\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ \x06\x95\x8bv|\x80\x05\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0aDevelopers\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ \x08c\x88k\x0ah\x9dk>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x07License\x07\x00\x00\x00\x0ba\ bout_ui_tr\x01\x03\x00\x00\x00\x04\ \x00O\x00K\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\ \x07\x00\x00\x00\x0babout_ui_tr\ \x01\x03\x00\x00\x00 \x00P\x00e\x00r\x00s\x00e\ \x00p\x00o\x00l\x00i\x00s\x00 N\x0b\x8f\x09\ {\xa1t\x06Vh\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1b\ Persepolis Downl\ oad Manager\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ \x04\x8bo\x80\x05\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0bT\ ranslators\x07\x00\x00\x00\x0ba\ bout_ui_tr\x01\x03\x00\x00\x00\x0a\ R\xa0Qe\x98^R%\xff\x1a\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x11Add to categ\ ory: \x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x00\x08\x902\x96\ \x8e\x90x\x98\x05\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10A\ dvanced Options\x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x00\x04S\xd6m\x88\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x06Cancel\x07\x00\x00\x00\x0d\ addlink_ui_tr\x01\x03\x00\ \x00\x00\x0ef\xf4e9N\x0b\x8f\x09\x8c\xc7e\x99Y\ >\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Chang\ e Download Folde\ r\x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00\x0cN\x0b\x8f\x09\x8c\xc7e\ \x99Y>\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11D\ ownload Folder: \ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x00\x0c\x00I\x00P\x00 OM\ W@\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04IP\ : \x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00\x04\x90#}P\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x04Link\x07\x00\x00\x00\ \x0daddlink_ui_tr\x01\x03\ \x00\x00\x00\x08f\xf4Y\x1a\x90x\x98\x05\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0cMore Optio\ ns\x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00\x04\x00O\x00K\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x02OK\x07\x00\x00\x00\x0da\ ddlink_ui_tr\x01\x03\x00\x00\ \x00\x08\x90#c\xa5W\xe0\xff\x1a\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x05Port:\x07\x00\x00\x00\x0dad\ dlink_ui_tr\x01\x03\x00\x00\x00\ \x0a\x00P\x00r\x00o\x00x\x00y\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x05Proxy\x07\x00\x00\x00\x0da\ ddlink_ui_tr\x01\x03\x00\x00\ \x00\x14\x00<\x00b\x00>j\x94T\x0d\x00<\x00/\ \x00b\x00>\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x12\ File name\ : \x07\x00\x00\x00\x18after_dow\ nload_src_ui_tr\x01\ \x03\x00\x00\x00\x14\x00<\x00b\x00>Y'\x5c\x0f\x00\ <\x00/\x00b\x00>\xff\x1a\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0dSize: \ \x07\x00\x00\x00\x18after_downl\ oad_src_ui_tr\x01\x03\x00\ \x00\x00\x04\x00O\x00K\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x08 OK \x07\x00\x00\x00\x14af\ ter_download_ui_\ tr\x01\x03\x00\x00\x00\x08\x95\x8bU_j\x94hH\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d Open\ File \x07\x00\x00\x00\x14afte\ r_download_ui_tr\ \x01\x03\x00\x00\x00\x18\x00<\x00b\x00>N\x0b\x8f\x09\ [\x8cb\x10\xff\x01\x00<\x00/\x00b\x00>\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1aDownl\ oad Completed!\x07\x00\x00\x00\x14after_dow\ nload_ui_tr\x01\x03\x00\x00\x00\ \x14\x00<\x00b\x00>\x90#}P\x00<\x00/\x00\ b\x00>\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d<\ b>Link: \x07\x00\x00\x00\ \x14after_download_\ ui_tr\x01\x03\x00\x00\x00\x16\x00<\x00b\x00\ >S\xe6[Xp\xba\x00<\x00/\x00b\x00>\xff\ \x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Sa\ ve as: \x07\x00\x00\x00\x14\ after_download_u\ i_tr\x01\x03\x00\x00\x00\x0eN\x0dQ\x8d\x98o\ y:kd\x8a\x0a`o\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x1eDon't show thi\ s message again.\ \x07\x00\x00\x00\x14after_downl\ oad_ui_tr\x01\x03\x00\x00\x00\x0e\x95\ \x8bU_N\x0b\x8f\x09\x8c\xc7e\x99Y>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x14Open Down\ load Folder\x07\x00\x00\x00\x14\ after_download_u\ i_tr\x01\x03\x00\x00\x00 \x00P\x00e\x00r\ \x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00 \ N\x0b\x8f\x09{\xa1t\x06Vh\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1bPersepolis D\ ownload Manager\x07\ \x00\x00\x00\x14after_downlo\ ad_ui_tr\x01\x03\x00\x00\x00\x08V\xde\ X1UO\x98L\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0c\ Report Issue\x07\x00\x00\x00\ \x10log_window_ui_t\ r\x01\x03\x00\x00\x00\x82\x00<\x00b\x00>\x00<\x00\ c\x00e\x00n\x00t\x00e\x00r\x00>]\xf2}\ \x93e\xb0X\x9e\x90Nkd\x90#}PN\x86\xff\ \x01\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\ \x00 \x00 \x00 \x00 `\xa8x\xba[\x9a\x89\ \x81Q\x8dR\xa0QeN\x00k!U\xce\xff\x1f\x00\ <\x00/\x00c\x00e\x00n\x00t\x00e\x00r\x00\ >\x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00r
Th\ is link has been\ added before! \ \ Are you sure y\ ou want to add i\ t again?\x07\x00\x00\x00\x14mainwi\ ndow_src_ui_tr\x01\x03\ \x00\x00\x00\x16\x00<\x00b\x00>\x90#c\xa5ex\ \x00<\x00/\x00b\x00>\xff\x1a\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x14Connectio\ ns: \x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x00\x18\x00<\x00b\x00>]\xf2N\ \x0b\x8f\x09\x00<\x00/\x00b\x00>\xff\x1a\x00 \x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x13Down\ loaded: \x07\x00\x00\x00\ \x14mainwindow_src_\ ui_tr\x01\x03\x00\x00\x00\x1e\x00<\x00b\x00\ >\x98\x10\x8a\x08Ri\x99\x18fB\x95\x93\x00<\x00\ /\x00b\x00>\xff\x1a\x00 \x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x1cEstimated \ time left: \x07\ \x00\x00\x00\x14mainwindow_s\ rc_ui_tr\x01\x03\x00\x00\x00\x14\x00<\ \x00b\x00>\x90#}P\x00<\x00/\x00b\x00>\ \xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dL\ ink: \x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00\x16\x00<\x00b\x00>r\xc0\ aK\x00<\x00/\x00b\x00>\xff\x1a\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0fStatu\ s: \x07\x00\x00\x00\x14main\ window_src_ui_tr\ \x01\x03\x00\x00\x00\x1a\x00<\x00b\x00>P\xb3\x8f8\ \x90\x1f^\xa6\x00<\x00/\x00b\x00>\xff\x1a\x00 \ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Tra\ nsfer rate: \ \x07\x00\x00\x00\x14mainwindow_\ src_ui_tr\x01\x03\x00\x00\x00\x08N\ \x0b\x8f\x09[\x8cb\x10\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x11Download Comple\ te\x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ \x08N\x0b\x8f\x09\x95\x8bY\xcb\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0fDownload Star\ ts\x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ \x0aN\x0b\x8f\x09]\xf2P\x5ckb\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x10Download St\ opped\x07\x00\x00\x00\x14mainwi\ ndow_src_ui_tr\x01\x03\ \x00\x00\x00\x0a\x93/\x8a\xa4\x00 \x00-\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x08Error - \ \x07\x00\x00\x00\x14mainwindow_\ src_ui_tr\x01\x03\x00\x00\x00\x06\x93\ /\x8a\xa4\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07E\ rror: \x07\x00\x00\x00\x14mainw\ indow_src_ui_tr\x01\ \x03\x00\x00\x00\x0azz\x95\x93N\x0d\x8d\xb3\xff\x1a\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x19Not eno\ ugh free space i\ n:\x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ \x0ad\xcdO\x5cY1eW0\x02\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x1dOperation w\ as not successfu\ l.\x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ \x10\x8a\xcb~|~\x8cN\xe5N\x0b\x98^R%\xff\ \x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00&Pleas\ e resume the fol\ lowing category:\ \x07\x00\x00\x00\x14mainwindow\ _src_ui_tr\x01\x03\x00\x00\x00\x08\ Y\x1a]\xe5\x93/\x8a\xa4\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0cmuxing error\x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x00\x06]\xf2N\ \x0b\x8f\x09\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0b do\ wnloaded\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00\x1c\x00<\x00b\x00>\x97\xf3\x8a\x0aj\x94h\ Hr\xc0aK\xff\x1a\x00<\x00/\x00b\x00>\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x1aAudi\ o file status: <\ /b>\x07\x00\x00\x00\x10mainwind\ ow_ui_tr\x01\x03\x00\x00\x00\x18\x00<\ \x00b\x00>Y\x1a]\xe5r\xc0aK\xff\x1a\x00<\ \x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16\ Muxing status\ : \x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ \x14\x00<\x00b\x00>r\xc0aK\xff\x1a\x00<\x00\ /\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0f<\ b>Status: \x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00\x1c\x00<\x00b\x00>\x89\ \x96\x8a\x0aj\x94hHr\xc0aK\xff\x1a\x00<\x00\ /\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1a<\ b>Video file sta\ tus: \x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00\x0eR\xa0Qee\xb0N\x0b\x8f\x09\x90#\ }P\x08\x00\x00\x00\x00\x06\x00\x00\x00\x15Add \ New Download Lin\ k\x07\x00\x00\x00\x10mainwindow\ _ui_tr\x01\x03\x00\x00\x00\x06N\x0b\x8f\x09\ _\x8c\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0eAfte\ r download\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x00\x04YWu(\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x05Apply\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00\x12\x7fn^\x95\x98\x05v\xeeQ*QH\x00\ \x0aN\x0b\x8f\x09\x08\x00\x00\x00\x00\x06\x00\x00\x00\x22D\ ownload bottom o\ f\x0a the list firs\ t\x07\x00\x00\x00\x10mainwindow\ _ui_tr\x01\x03\x00\x00\x00\x08}Pg_\ fB\x95\x93\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08En\ d Time\x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ \x04\x96\xe2\x95\x8b\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04E\ xit\x07\x00\x00\x00\x10mainwind\ ow_ui_tr\x01\x03\x00\x00\x00\x08f\xab\ P\x5cN\x0b\x8f\x09\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0e\ Pause Download\x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00 \x00P\x00e\x00r\x00\ s\x00e\x00p\x00o\x00l\x00i\x00s\x00 N\ \x0b\x8f\x09{\xa1t\x06Vh\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x1bPersepolis Do\ wnload Manager\x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00\x04\x902^\xa6\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x08Progress\x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00\x04\x5cl`'\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0aProperti\ es\x07\x00\x00\x00\x10mainwindo\ w_ui_tr\x01\x03\x00\x00\x00\x08~|~\ \x8cN\x0b\x8f\x09\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fR\ esume Download\x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00\x14\x98oy:\x00/\x96\ \xb1\x85\xcf|\xfb}qS#W\x16y:\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x1aShow/Hide\ system tray ico\ n\x07\x00\x00\x00\x10mainwindow\ _ui_tr\x01\x03\x00\x00\x00\x04\x95\xdcj_\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x09Shut D\ own\x07\x00\x00\x00\x10mainwind\ ow_ui_tr\x01\x03\x00\x00\x00\x08\x95\x8b\ Y\xcbfB\x95\x93\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0a\ Start Time\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x00\x0eP\x5ckb\x00/S\xd6m\x88N\ \x0b\x8f\x09\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Sto\ p/Cancel Downloa\ d\x07\x00\x00\x00\x10mainwindow\ _ui_tr\x01\x03\x00\x00\x00\x06N\x0b\x8f\x09\ _\x8c\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0eAfte\ r download\x07\x00\x00\x00\x0ep\ rogress_ui_tr\x01\x03\x00\ \x00\x00\x04YWu(\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x05Apply\x07\x00\x00\x00\x0eprogr\ ess_ui_tr\x01\x03\x00\x00\x00\x08N\ \x0b\x8f\x09\x8c\xc7\x8a\x0a\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x14Download Inform\ ation\x07\x00\x00\x00\x0eprogre\ ss_ui_tr\x01\x03\x00\x00\x00\x08N\x0b\ \x8f\x09\x90x\x98\x05\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10\ Download Options\ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00\x08]\xf2N\x0b\x8f\x09\xff\ \x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0bDownl\ oaded:\x07\x00\x00\x00\x0eprogr\ ess_ui_tr\x01\x03\x00\x00\x00\x0e\x98\ \x10\x8a\x08Ri\x99\x18fB\x95\x93\xff\x1a\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x14Estimated\ time left:\x07\x00\x00\x00\x0e\ progress_ui_tr\x01\x03\ \x00\x00\x00\x08\x90#c\xa5ex\xff\x1a\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x17Number of \ connections: \x07\x00\x00\ \x00\x0eprogress_ui_tr\ \x01\x03\x00\x00\x00\x04f\xabP\x5c\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x05Pause\x07\x00\x00\x00\x0epr\ ogress_ui_tr\x01\x03\x00\x00\ \x00 \x00P\x00e\x00r\x00s\x00e\x00p\x00o\ \x00l\x00i\x00s\x00 N\x0b\x8f\x09{\xa1t\x06\ Vh\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bPers\ epolis Download \ Manager\x07\x00\x00\x00\x0eprog\ ress_ui_tr\x01\x03\x00\x00\x00\x04\ ~|~\x8c\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Re\ sume\x07\x00\x00\x00\x0eprogres\ s_ui_tr\x01\x03\x00\x00\x00\x04\x95\xdcj\ _\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09Shut \ Down\x07\x00\x00\x00\x0eprogres\ s_ui_tr\x01\x03\x00\x00\x00\x06r\xc0a\ K\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08Sta\ tus: \x07\x00\x00\x00\x0eprogre\ ss_ui_tr\x01\x03\x00\x00\x00\x04P\x5c\ kb\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04Stop\ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00\x0aP\xb3\x8f8\x90\x1f^\ \xa6\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fTra\ nsfer rate: \x07\x00\x00\x00\ \x0eprogress_ui_tr\x01\ \x03\x00\x00\x00\x5c\x00<\x00h\x00t\x00m\x00l\x00\ >\x00<\x00h\x00e\x00a\x00d\x00/\x00>\x00\ <\x00b\x00o\x00d\x00y\x00>\x00<\x00p\x00\ >h<_\x0f\x00 R\x06\xff\x1ay\xd2\x00<\x00\ /\x00p\x00>\x00<\x00/\x00b\x00o\x00d\x00\ y\x00>\x00<\x00/\x00h\x00t\x00m\x00l\x00\ >\x08\x00\x00\x00\x00\x06\x00\x00\x004Format HH:MM\x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00^\x00<\x00h\x00t\x00m\x00\ l\x00>\x00<\x00h\x00e\x00a\x00d\x00/\x00\ >\x00<\x00b\x00o\x00d\x00y\x00>\x00<\x00\ p\x00>\x8a-\x7fn\x90>fBy\xd2ex0\ \x02\x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00\ o\x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00\ m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00@<\ html>

Set timeout\ in seconds. \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00v\x00<\x00h\x00t\x00m\x00\ l\x00>\x00<\x00h\x00e\x00a\x00d\x00/\x00\ >\x00<\x00b\x00o\x00d\x00y\x00>\x00<\x00\ p\x00>kdR\x9f\x80\xfdW(`\xa8v\x84O\ \x5cim|\xfb}qS\xef\x80\xfdq!l\xd5k\ c^8\x90KO\x5c0\x02\x00<\x00/\x00p\x00\ >\x00<\x00/\x00b\x00o\x00d\x00y\x00>\x00\ <\x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00[

Thi\ s feature may no\ t work in your o\ perating system.\

\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00j\x00<\x00h\x00t\ \x00m\x00l\x00>\x00<\x00h\x00e\x00a\x00d\ \x00/\x00>\x00<\x00b\x00o\x00d\x00y\x00>\ \x00<\x00p\x00>O\x7fu(Y\x1aP\x0b\x90#\ }\xdaS\xefN\xe5R\xa0\x90\x1fN\x0b\x8f\x090\x02\ \x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00o\ \x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\ \x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00c

Using multip\ le connections c\ an help speed up\ your download.<\ /p>\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x04S\xd6m\x88\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x06Cancel\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x04f\xf4e9\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x06Change\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ \x06\x91M\x82r\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0eColor scheme: \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00\x04\x98\x10\x8a-\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x08Defaults\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x08N\x0b\x8f\x09\x90x\x98\x05\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x10Download \ Options\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x06[\ WW\x8b\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06F\ ont: \x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x1c\x82\xe5\x9e\ \xded\xca\x95\xdc\x95\x89c\x09\x92\x15\xff\x0c\x5c\x07\x96\ \xb1\x85\xcf\x89\x96z\x970\x02\x08\x00\x00\x00\x00\x06\x00\ \x00\x00)Hide main win\ dow if close but\ ton clicked.\x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x06W\x16y:\xff\x1a\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x07Icons: \x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x16\x96;kb|\xfb}q\x902Qew\ aw j!_\x0f\xff\x01\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x12Keep system a\ wake!\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x0a\x90\x1aw\ \xe5\x98^W\x8b\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x13Notification ty\ pe: \x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\x04\x90\x1aw\xe5\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dNotifi\ cations\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x08\x90\ #c\xa5ex\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x17Number of conne\ ctions: \x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00\x0a\ V\x17\x8afk!ex\xff\x1a\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x11Number of tr\ ies: \x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x04\x00O\x00\ K\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x04\x90x\x98\x05\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0bPreferences\x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00\x0ac\x09N\x0be\xb0c\x09\x93u\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0ePress \ new keys\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00 \ \x95\x8bj_fBU_R\xd5\x00 \x00P\x00e\ \x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x19Run Pe\ rsepolis at star\ tup\x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00\x06_\xebcw\x93\ u\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09Short\ cuts\x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\x06Y'\x5c\x0f\ \xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Size\ : \x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x04r\xc0aK\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x06Status\x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00\x06j#_\x0f\xff\x1a\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x07Style: \x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x0e\x90>fB\x00 \x00(y\xd2\x00\ )\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x13Tim\ eout (seconds): \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x10_qrGd\x1c\x5c\x0b\ ]\xe5Qw\x90x\x98\x05\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x14Video Finder O\ ptions\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x06\x97\xf3\ \x91\xcf\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08Vo\ lume: \x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x0ef\xf4\ e9N\x0b\x8f\x09\x8c\xc7e\x99Y>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x16Change Dow\ nload Folder\x07\x00\x00\x00\ \x0atext_ui_tr\x01\x03\x00\x00\x00\ \x0c\x00I\x00P\x00 OMW@\xff\x1a\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x03IP:\x07\x00\x00\x00\x0at\ ext_ui_tr\x01\x03\x00\x00\x00 \x00\ P\x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00\ i\x00s\x00 N\x0b\x8f\x09{\xa1t\x06Vh\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x1bPersepo\ lis Download Man\ ager\x07\x00\x00\x00\x0atext_ui\ _tr\x01\x03\x00\x00\x00\x08\x90#c\xa5W\xe0\xff\ \x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Port:\ \x07\x00\x00\x00\x0atext_ui_tr\x01\ \x03\x00\x00\x00\x1c\x00<\x00b\x00>\x97\xf3\x8a\x0aj\ \x94hHr\xc0aK\xff\x1a\x00<\x00/\x00b\x00\ >\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aAu\ dio file status:\ \x07\x00\x00\x00\x1bvideo_\ finder_progress_\ ui_tr\x01\x03\x00\x00\x00\x18\x00<\x00b\x00\ >Y\x1a]\xe5r\xc0aK\xff\x1a\x00<\x00/\x00\ b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16\ Muxing status: <\ /b>\x07\x00\x00\x00\x1bvideo_fi\ nder_progress_ui\ _tr\x01\x03\x00\x00\x00\x1c\x00<\x00b\x00>\x89\ \x96\x8a\x0aj\x94hHr\xc0aK\xff\x1a\x00<\x00\ /\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1a<\ b>Video file sta\ tus: \x07\x00\x00\x00\x1bvi\ deo_finder_progr\ ess_ui_tr\x01\ \x00\x00\x1b%\ \x00\ \x00^\x91x\xda\xed\xda\ \xbc\x08\xc7vl\xe7\xd9\xa4\x8em\xacQ\xe2$\xc6\x11\ \x8a\x12Y\xb2\x22Y\x96-k\xe4%\xe4\x04\xe5\xcd\xcc\ \x9d\x99\xe7y\xcb\xe4\xbd7\x1aK-m\x0e)\x84\x00\ i{B\x13H\xc8\xa1ei\x13 p\x0a\x1cBH\ \x81\xa6\xa1\xa1=@\xc2\xd24la\x87\x1f,-\x04\ \x1a\x0e\x81n\xdf\xfd\xee}\xeb\xbc73\xf2\x92\xd3\x1f\ D'\xbe\xb3\xbc\xfb}\xf7~\xfbr\xef\x0c?\x9a\xdd\ \xf0\xb9\x9f?p\xcfS\xdb6\xff\xc3-\xef\xfa\xd4\xb7\ \x1e$\x84\xb4\xea\xea\xc2\x91\xc3\x07\xe0\xc5\xd7\xe0\xffW\ \x11\xd2\xb9\x9f\x8f\xab\xbf\xc3\xc7\xc33\x84\x1c\x19\x22d\ \xfeA\xd2\xf2\xc5\x16Bv\xee&-_\xff\x0bB\xfa\ N\x91\x96\x1f<\x0e\xe3\xc7I\xeb\xe5\xd30>OZ\ ?p\x0b!\x97?O\xf6.\xfe\x07!7\x0c\x90\xc9\ \xca5\x84\x5c\xb6\x93\x8f\x03G\xc9\xcc})x\xee\x0d\ \xe4\xe8\x93y\x80\xf9\x052\xf7\xf5K\x09\xb9\xe4yr\ \xe2-\xf7\x102x\x0f9\xa9,\x13\xb2\xa6\x93\x8f\xc7\ \x1f''\xef}\x11\xde\x0f\x93\x9b\xf7}\x9a\x90\x83_\ %o{\xf7jB\x12\x0a\xf9\xf8\xdf\xaf\x22\xa4\xa7\x9d\ <\xf1\xc1/\x11\xb2\xe9\x15M\x1b>\xf0\x0c\xe0\xc96\ ]~\xd7\x87\x08\xb9\xea\xef\x9a*;^G\xc8\x98\xd2\ \xf4\xe6R/!\xfb\x17\x9b\xbe\xf7\xc4\xcf\x089\xfa\x8e\ U\x83\xd7\xff\x82\x90\x037\xaeJ\xc14\xb2\xee\xa1U\ oJ\xbc\x9c\x90\xf5?]uO\xa6\x19\xf6EW\xdd\ \xffB\x09\xe0\xdd\xb5\xea\xfd\xf9\xcb\x08y\xc5\x8b\xab\x9e\ \xef\x84\xe7/^\xbf\xea\xc5'\x9f\x04\xba45\xf7\x5c\ \xf1\x1aB^\xb6\xd0\xbc\xf9\xc9\xdd\x84$\xafl\x1e\xbe\ \x1d\xe6\xad\xbe\xa4yz\xe2\x07\xb0\xbf\x1f\xf2\xf1\xe0p\ \xf3\xdd_y\x1a\xf6\xff\xb5\xe6\xfbo\xba\x8a\x90\xde5\ |L\xfdu\xf3s\xcf\xfd\x01!\x17}\xa5\xf9\xb9\x17\ >C\xc8\xf8]-=\x07`}\xd2\xcfZ6\xbe\xee\ \x08!/oi\xd9\xfe\xfa$|/\xb7\x1c\xfc\x08\xd0\ \xf5\xd8\xaf[n\x9e\xba\x12\xe8\xffh\x0b}\xf8\x05\xd8\ \xdf\xbf\xb7\xe4\xbe\xaa\x13\xd2|GK\x9e\xbd\xef\xdb\xda\ \xf2\xf6\xa9O\x12\xd2\xb5\x83\x8f\xa3\x13-\x0f\xec\xfc\x1e\ \xec\xe3\x91\x96w\xfe\xe9\xbf\xc1\xfb\xdbZ>\x7f\xea4\ \xac/\xc3\xc7\xf9o\xb6|\xfe\xbf\xdfIH\xd3\xf7[\ \x9e=\x09\xf0ox{\xeb\xba/\xcc\x03\xfe\x87Z/\ ?\x02\xef\x93\xdfo=\xca\xe8\xdb\xfb>>\xce_\xdd\ \xba\x90\x94\x08\xd9\xfa_\xad\x0b\x0f\x01_/\xfeLk\ \xe6\x81\x11B\xb6\xfd\x84\x8f'w\xb4*\xc3\xffC\xc8\ \xf6\x8f\xb4\xda\xf7\x02=\xd7h|<\xfe\xcb\xd6\xc5\x8b\ \x01\xcf\x86m\xad\xb7\xdfF\x09Yk\xb5\xbe\xe5\xe1\xab\ A.\xaem}W\x07\xe09\xfa\x93\xd6\xf7\xb0\xf9\xdb\ \xa7\xf9x\xf2\xee\xd6\x87N\xfd\x8a\x90\x8e\xdd\xad\xef\x7f\ 3\xd0e\xf6\xd2\xd6\xcf^\x09\xf2\xb3\xea\xa3\xad_\xda\ \x05\xfc\xbc\xe6cm\x03\x8cN\xdb\x8a|<\xf1@\xdb\ 5H\xaf\xdb\xf9x\xaa\xa5m\xe8\xcb\xbf\x04\xb8\xc7\xda\ \x86\xaf\x85u\x1f{\xac\xed\xe6+\xbeMH\xdb\xab\xdb\ \xee\x9ff|\xfeN\xdb\xfd/\x8c\x112\xf3D\xdb\x03\ ;\x9b\x089t\xbc\xed\x91O\xc3~\xba>\xd7\xf6\xe4\ .\xc6\xc7J\xdb\x17\x9e}\x0f!\xbb\xdf\xda\xf6\x5c\x0a\ \xc6\xee=m?\xff$\xc8A\xcf{\xf9\x98\xda\xd7\xde\ \xbf{+\xc8\xc3U\xed[\xbe\x0b\xf3f\x7f\xd9\xbe\xef\ )\x18\x0f\xbe\x89\x8fs?k\xdf\xf7E\x18\xbb\x1fk\ \xbfiG\x99\x90\xcd\xcb\xed\xef\xb8\xf9rB\xa6\x7f\xdb\ \xfe\xc0\x15 \x1f\xc7\xb2\x1d\xd2$\xf0\xad]\xee\xc8\x0f\ \xbc\x1b\xe4\xe7\x99\x8e{$\xc0\xd3q\xa6\xe3\xd7o\x84\ yk\xfe\x91\x8f'\xc6:Gz@\x1f\xf6\xdc\xd1\xf9\ \x9a;\xff\x15\xd63\xdfyK\xdb\xc7\xe0\xfdDg\x9a\ \x8dk\x1f\xec\xcc7\x81\xe0\xce\xfey\xe7\x1f\xfd'\xc8\ \xc9u\xdd\x9d\xaf\x9d\x03z\xf6\x9c\xec|\x8b\x0d\xcf\xcf\ \xdc\xde\xf9\xd6\xaf\x00?\x06\xee\xec\xbcw\x02\xf0o\xb9\ \xbd\xf3\xd1?\xf90\x10\x80$\xda\xe8\x1f\x83>\xf4'\ \xba\xef\x00\xfa\xed}_\xe2\xa0i\x83\xfe5'\x16\xbe\ \x0a\xef\xfb\xafI,\xfc\xeaw\x84\xec\xb81a\x8d\x00\ \xfd;\x9fJ\xbc\xf93L\x8f\x1fI\xbc\x8d\xdc\x06\xf4\ ;\x92x\xf7\x8d@\x87\x99\xad\x89\xc7w\x82\xde\xcf\x9e\ \xea\xba\xc5\x84\xef\x0f\xfd\xb8K\xff0\xf0\xe9\xda\x0fv\ -\xb6\x80\x9el|\xa4\xeb\xce\xca_\x02\x9c\xa7\xf8\xb8\ \xe77]\xff\xf2\xcf\xeb@\xce\xc7\xba~\xfe5\xe0\xd3\ %wt\xbdx\xcfG\x81>\xcfv\xef\xdc\x08vd\ \xf7s\xdd{\x1f\x07{\xd0\xf1\xa9\xee\xd9o\xde\x04\xab\ Lt\x9fz\x0a\xd6\xbf\xef\x87\xdd\xb4\x0f\xf6\xf7\x8aO\ \xf0\xf1\xf23\xdd\xf7\xde\x0a\xfb\xec\xff\x10\x1f/\xb6\xba\ \xef\xa3\xb0\xae-_\xea\xfe\xd8\x1b`\x1c\xbc\x88\x8f\xd3\ \xaf\xed~b\x1a\xe80\xfah\xf7\xb7\x9e\x00\xba\x1f\xae\ t\x7fw\x13\xc8\xd5\xf4p\xf7\xef\xbe\xfb&\x90\xe3\x0d\ =\x97$'\x81\x8e[z.\xf9+xn\xe2\x13=\ \xb7\xbe\x1d\xe4\xa4\xe5T\xcf}/\x82\xfd\xeb\xbc\x85\x8f\ \xeb\xaf\xe6\xe3\xae\xef\xf3q\xf0)>\x1e\x9f\xef\xf9\xdf\ 2\xd0\xf1J\xa5WR\xb6\x83\xde\xdc\xdc\x9b\xcc\xbe\x17\ \x9e\xbb\xab\xf7\x95S@\xb7\xc4\xd3\xbd\xa9\xcd\x00w\xfd\ \x07z\xcf<\x04\xcfw\xdd\xc2\xc7\xb9\xd7\xf7~\xe4\x17\ \xb0\xbeC\x1f\xed\xfd\xa7C@\xa7\xb5?\xea\xfd\xdc\xe3\ \xf7\xc1\xbc\x8bz\xbf\xf1\x0c\xec\xf7\x8a\xd3}\xfb\x1e\x01\ \xban\xde\xd8\xb7\xf47`_.]\xc5\xc7W\xdd\xd8\ \xf7\xda5@\xf7\xfe\xff\xe9{g\x17\xe0\x9d|\xba\xef\ oO\x00\x9c\xc9;\xfb\x1e|\x04\xe8\xb7ew\xdf\xc3\ 7\x01\xfd\xb7\xde\xdd\xf7\xe5\xeb\x80\xcbW\xec\xe8{\xf6\ G\xb0\x9f\xab\x7f\xd1\xf7\xed?dv\xee\xb3}\xbfj\ \x06\xfe\xb6\xa6\x14P\x92?\x03\x8a4\xed!\x092J\ T\xa2\x909B\xc92\x91\x89\x04\xef5xo\x92\x14\ \xbcc\xaf\xd8\xff\x092C\x0cR\xc0O4\xf87\x0b\ \xdf{\xcf\xa7\xe1\xbd\x01PTx_\xc0O\xb3\xf0m\ \x01f\xa5\xc4\xeb<\xbc\x93\x04&g\xa6\x02#\x87k\ \x11\x1b\xde\xe7\x044\x0b\xe70\x9c\x87\xc4\xa7&~^\ \x04\x18\x06\xd1\xe1;\x19\xe1$\xc84\xfc\xcb\xe6L\xe2\ \xba\xa8\x985I\x92\xb0\x1b\x07*_\xfdA\x98\xcb\xe0\ \xea\xf0\xf4<|b\xc3\xff\x16\xae0\xbc/\xbe{\xf6\ \xdc\x09\xdc\x0d\x87\xaa3L\x1dLu\xda\xe0\xff{\x13\ \xa3\xaa2G\x97eiTS\xcc\x94\xac)\x9a\x92\x98\ 1\x0a\xb2\xa6\xc9Y\x13?Og\x0dU\x95\x0b\xcbr\ \x96\x16\x12)\xf87_\x90`\x12\xfbR\xa1\xf0\xace\ \xcb9x\xcc\x92\xb3J\xe2\x10\xbc4\xa5\xd1b\xc1\xd0\ \xb3\xb2\xaa$\xa6\x15Y\x9a\x945\x0a_M&\xe7\xd8\ \xa3\x00\xfe`\xc1\x92ui^\xb1\x15\xab\xe0\xe2\x02\xf4\ \xbatB.\xc0\xa3\xba\x22\xb7\xc3\xd2\xba\xe4\xb4Q\xb6\ \x17\xca\xca\x82m6\x01\x87\xc9\x22\x19F\x1a\x15\x90\xee\ 9r-\xbc\xb2\xe1\xaf\x04\xfb\x1f\x22\x83\xf0\x97Gz\ \x14H\x19\xf8\x98$\x19\xa0\x87\x06\x9f\xe6\xe0O\x83\xa7\ \x18\xef\x82\xefF\xc8\x04\xfc9\xef\x06`4a\xcei\ x\x97\x018\xc3\xf0\xb4LF\x5cZ\xbdjX\x96\x0a\ &\xcd][\xb0\xed\x92548\x98W\xecB9\x9d\ \xcc\x18\xda`.\xa7\x95h^\x0c#\x13\x13l\x90J\ \xa6q\x9af\xec\xe1Ay$rCg\xcerC\xec\ \xfb\x1c\x8cl\xd6\xad\xf0\x1dE\x01\xb1`;s\xa1O\ \xeami\xb8\xc6\x96JVn\xd0\xa4\xb7\x96\xa9e[\ #s\xe2E\xdd=\x9d-\x93\x96\xe0\xb3\x01\x10P\x15\ \x9e\x0c\xbe\x1b!7\x82\xa0\x0f\x90qr\x98\xcc\x9e\x13\ \x93\x96\xec\x81\xacZ\x12\xc3\xc8\x8d\xf3\x03\xe3\x87g\xeb\ n\xe8\xee\xba\x1bb\xd2c\xc2;\x0a\xaf\x0c\xd4g\x0b\ \x96\xae\xc1\xe6\x82[U\xe0\xdb\x91s\x9a\x1d\xde\xecT\ x\xb3%jZ\xb4d\xa8\x8a\x95\xd5\x92b\xe7\x8a1\ R\xfb\xeb\xd8\xad\xdf_w\xeb6|\xae\xa2\xf2\x98h\ x\x92h\xbc\xe275r\xce\x10\xc2$\x98\x09\x93\xc0\ \xa6*\xcd\x9b\xb2\x96\xd4h`\xbf#\xf5\x1e8'2\ T\x90W6.\xda\xaf\xa8\x8d\x93ae\x10\xea\x93\xa1\ \xa2\xd865\xb9&G\x92!\xe6\x81X2\xe8u\xc9\ \xc0\xb6P\x84\xff\x93`\x83l!\xb2\x83\xe4\x18\xbc^\ \x80\xe7\x0d\x98\xb7\x00\x1a\xbc\x84B\xcd\xdc\xdf\x08\xbe\xb3\ \xe09\xe6XC\x9a\x1d\xaf\xd1\x15\xa5\xa8$o\xb5A\ r\x07\x8f\xd9\x0b9\xc3\x5c\x98]\xb2\xc1\xe3\x8c\xcc.\ YJ\x96\xd6\xd5\xe8\xad\xe4(\x98)\x8a\xbex\xb6\x9a\ \xbe.\xe2\xd5\xa3l\xa24\xeb\x12'\x12\xdaz\xf0\xc8\ &l\x9b\xc2\x86t\xf4\xafy\xf6\xda\x85\xd27\x9a)\ \xeaFE\xa5\xd9\xbcFu;\x1a\xc8&X\x92.\x84\ \xa0\x88\xc0X\x00\xc2\xc2\x05o9\x89q\xbaHU\x83\ \xf1*\x12\xc6j\xb0\x8f\x0aP\x8e\x22$\x08I\xdc\x99\ \xed\x87\x95\x0c\xd5-\x1a9\xad\x0dP\x17\xc9\x8f\xdd\x87\ W\x1d\x9d\x8e|no\x14\xad\xd0H\x1b\xb0l\x1d\xde\ \x1b\x18u\xa41^\xa2\xecY\x17\xe6\xc5\x1e\x0d\xa5q\ \xa3\xa2\xab\x86\x9c\x95fd]\xceS3\x12\xd9Z\x08\ Y\x182\x1b\x03$\x1a\xa0C\xd7\xbc)\xeb\x96*\xdb\ F\x0c!\xf6\x80\xab\x08\xaeIE\xbe\x14\x81\xdf6|\ B\x81\xfb\x06\x9a\x1c?\x9f\xd6\x8cf\xb3\xde\xe2\x0e+\ z\x91\x01\xef\x91\xb3Y\x15^\x07\x081\x1f\x06\x02\x80\ e\x11\x92e`\xb4\xf1s&\xef,0\x1c\x22R\x10\ \x89mH\x19\xd9\xa6y\xc3\x5c\x1a\x92b\x90\xec 7\ \xc0T\x19\x900\xb0\x19NOT\x13\x09\x00\x978\x83\ \x03\xb2\x9a]\x94\xf5\x0c\xcdJGK\xb6b\xe8V\x0c\ \xdc\xb5\x10\x1529-\x0b\xb2\xfa)\xd06\xc6 \xa8\ \xb1\xdb\x1e\xc5\x88\x95\xcf\x92\xaa\xf8\xceb\xce\x12|^\ \xc4\x95-\x07 \xaf\x1f+\xc8z\x9ez\xe4\x9d0\xd4\ ,g}\x04\xa6$9 \x02\x18\x191Z\xf0\xaf\x8c\ \xceAB\x059\x0d\xd0\x15Ax?q\xd7\x0a,9\ E\xa5\x92\x0eQg,ug\xe1\x8f\x99\x9a3`~\ \x06P6,\xe1\x88TO\x83\x01\xdb\xa2`\xaa\x85f\ \xcaF.\xb0U\xb0\xef\xd3\x00\xa1\x8c\xea\xea\xdf\xe9\xe6\ qj\x83\xed\x91RK\x96M5i\xd64\xce,I\ )j\xdb\x8a\x9e\x8f\xe3\xc9\xa6*y\xe5\xb4\x0c\x08N\ \x88t\xb1[\x93\xc0\x0a\xc8\xc2\x8dT3\xc9\xbf\xd4^\ O\xd8A\x1a\xe3\x98\xb19V\x99\xfc\xcb\xebsa\xb1\ \xe9\xb1\x8b\xdbON\x02\x88\x0c:\x8e\x0a\x803P\xa6\ %T%#n\xc1\x01D\xeb\x5cD%\xd9\xb2*\x86\ \x99\x8dEv\x0aU\xc8\xcf&3 J\x9c\xc5\x95\x95\ /\xc8]\xccVw1e\x8b\x9aL\xe2$Y\xf7V\ \x16\xb3\xae\xeb\xeb\xac\xebl\x88\xe1\xe0\x8f%\xc6j\xf0\ R\x0aj\x93\x8d\x1a\x94u\x81t\x1c\x84%\xdb\x8aF\ cfv@\x16\x8an\xde\x9d\xd129??\x1b\xf3\ t\xc2y\xdag\x9bZ\xd9\xf3\xa9\x98\x09\xfdd\x0a\x1e\ \x1ep\x13q+\xb0\xc3\x96\xa9\xd9\xd8-u\xa0\xbf\x03\ I\xf4\x9e\xaea\xb5\xd7CzL\x85VD\x19\xd0\xee\ \x19\xc3\xa4u\x8c\xe78\x98@\x19\xbd+\xf3J\xdc\x0c\ \xa8H\xce\xa2CVa\x98$\x11`\xa4\x05\xd1=\xa3\ 2\xe4\x19\xc5#e-MM\xc9\xc8I\x19C\xd7\xc1\ j0\xd4C1\xb8c\xdct\xc4\x93\xdd`\xdc\xb8\x04\ \xd9>l\xad\xb3\x86i\x0f\xc5r\xcd\xb5\x87\xbe\x09\xcc\ v\xc5L\xd8\xee3\xa0Q\x1a\xe4\xe7\xe1jn\x04\xeb\ \xea\xeb\xee\x80Q\xce\xd7\xd0\x91\xa10\xec\xba\xe2\xbf\x1d\ d\xc5\x10\xbeY\x11NT\x17qh9\xa4\xd5k\xe7\ \xa8F\x913v\x01\xe2\x95\x92l\x17b)\x9dB\xa8\ EX\xdb\xd5\x9e\x1bM\x1d\x1d\x9bN]\x1d\xeb\x80\x0f\ `t\xa0\x88(\xcd\xaf\x8a\x89\x94-\x9bv-e\xdc\ \x0d1x\x1a\xe2\xe68\x07\xc9\xd2\x02\xf6}\xc0-\x0e\ \xa7G&\x1c\x978<\x98\x1e\xe1T\xda \xe7\xc0\xea\ /d\x85\x09Y\xb0\xccL\xc0\x8dpD7 K\x0c\ \x91\x99D\x81\xef\x01\xf0)e\xb9a\xc8aA\xee\x90\ $\xe9\xe84\xfc\xc3\xa6\xf6\x87\xa6z\xd3.\x85%I\ \xa1}sMfZ\xc5m\xb9oQ\x00\xb3Du\x09\ \xf7]\x07\xf2^\xb1\xd5\xb0\x9f\x93\xb0d\x97G\xd9\xe3\ \xc5\xbam\x0e\x01\x5c<\x9b`\xf3\xae\x11\x1e3\xb4\x92\ \x0a\xee?\xbb\x8d\xd1\xa26\xd2M\x02\xa90a\xb1\x94\ e\x16\xcd\xa3l<\xbc\x9d\x02\xdeQL\xc7T7\x1c\ e\x86\xca\x8a\x84\xbe\x9a\xf1M^\x04\x97e5\x82\x80\ \x07e&f\x18L\xd7%Lv(\xbe\xd2\x5c\xcbj\ #\xa5B>R\xbf\xcc\x96\xac\x82Q\xe1\xfa\xa4Q\xcb\ \x82\xb8_\x92\xf3\xb2\xa2'\xeb1}<&\xca\xf41\ \xdeE\xd5\x8f,\x8f\x881k\xf1\xfe\xc2%5\xf1X\ \xd7Vm\xcb\xf3C\x9d\x0e(tB\xabU#\xbfP\ Qt\x00\xe2\x9b\xcf\xca\x96\xccn\xd9Hy5\xe0_\ \xfcq\x0d\xe6\x8f\xc8\xaf2\x06\xce\xe1\xd4t\xddA\xd3\ \x84$\x0a\x83\x96\x8al\xeaN\x8c\x1a\x8d5\x09\x9e\xda\ \x1f(\xfb\xb11\xd8<\xc3\xd7\x1c\x1b\xebI\xc0\x94\xae\ \xd8\x8a\xac*\xcb2\xf3p\x88M\xd1!m\xd7\xf0}\ <\xc2\xad\xc2!\xa4\x11\x19\x8f\xbc\x9d\x0d\xfb\xb7\xd1=\ \x07\x5c\x00\xbb9eYe\x1a\x0f\xee\xb7BE\x86\xdd\ \x1c\x99q~\x84\x1cB\x7fP@\x7fcc\xd4\xc5\xd3\ \x17\xc9\x976r\x7fo\xbb\x19\x9f\x93\xfb1\x9b 5\ \xf8w\x127\xc10\x9cF\xe8\x0cG\xd1\x8d\xd3e\xdf\ 7\xde\x0a\x98\x98s=c\x1c\xe4\xe9\x8f\x8aOV%\ \xb2\xe4:T\xf3\xe0\xde\xc2\xf6\xca\x04\xa5\x1f\xceP\x1d\ \x04sd\x9ei#\xf3/RA\xb6\xa44\x05\xdd\x01\ \x87\x03\x19d\x9a\x02s\xe86)\xe2\xbfQ\x88\x91\x96\ \x8c\xb2d\x95\xc5\x8b\x8a\xac\xdb,\xa1\x85\x99\x92bs\ \xa5\xbenxP\xa0p\xed\xa0\x06\x1f\x0b\x86\x04\xbd\xc1\ ~\xc1\x94``\x15\x17l\xa86\xe6K\ \xb1\x9b\xcb\xb1\xa9.)4\x0c1T\xc0\xc7\x92\xc6\xa4\ \x8be\x0bD/&\xf7\x90\x15\xb0\xc7:\xe0\xb4\xca\x99\ \x0cDK\xb9\xb2\x9a\xac\x8di\x1801Y[\x14n\ \xc4\xd9\x1f\xdbs\xde\xb7\xe3\xda\xc5\xc9\x1d\xb3*\x95-\ *\x99\xd4*\x83\x89\xb1\x0bT\xca\x19\xaaj\x00\xca|\ \xa8b\x19\xbf\x94\x9d\xe8\xe7L\xf4\x9aQ\xb1\x95\x84f\ \xfd\xb4o\xe3\x1b\x05\xdar)\x0b8|\xe5\xf6:\x9b\ \xde+|'\x87JE$\x92\x13B\xc3}g\x1e=\ \xae)\x8c\x9f\xaf\xd8+\xeb\x12E142\x99\xb2i\ \xd6\x93\xec\xf5\xc0\xb62d\xa6\x9c\x89\x03\x0e\x16/\x04\ \xd1\xcag\x18\x95\x10fmP\xfd\xb8\xa8\x90\xdb\xf1\x8a\ \xdbR\xd6u4\x18\xca\xf8\xe0\xf8KH\xd5\x86\xd2\xab\ V\xca\x98\xd2*\x189\xf9\xd3\xa5!\xcc\xea\xaa\x13\x98\ \xd1rV1x\xaa\xc4\xad\xea\x90\xe48\xee\x97\x0e=\ \x16m\xad\x86\xd0;\xee{\x06Y\x9e\x17(\xf82\xa2\ \x900\xa3>\xa3 \x7f\x1aC\xb0\xc7E\xe0\xe7yC\ h\xca+@\x13\xe5\xee\xa2\x00{\xee\xee\xdc\x18\xb3(\ \x1am\x8d2\xe6\x84\x92\xa5\xe7Q.\xce\x0e}\xe3r\ \xd1\xc4\x8eS\x14\xd0_\xa8\x18\xfa\x16\xb0\x83\x92\x05\xd0\ #\xb80\x03^/\xe1\xeb\x12\xa6\xfb\xfe \xdb)\x0b\ 9\xc5\xd7\x22\xf6_m_h^\x10\xc1{\xb8\x17\xa0\ `\xf1%# \xe40H\xe7E0\xd6\x02\x8dK\x06\ \xc6\xb1\xdb\xeb\x18/\x1d\xd7\xa6\xa0\x7f\xe0\x19\xbb$\xb2\ [\x13KE\xd4\x9f\x80\xbaiBx%2\x1a>\xc3\ M\xc1xX)\x893@\xdc\x03\x94\xf0\xa9el\xb7\ \xb2\x9d\xe7\x10\x0e\xaf\x17\x94\x02\xa5\x95e\xdco\x12Y\ SrS\x09\x8f\x86\x83\x1e\xad]\xb6=6\x5c\xb05\ ud\xb8@\xe5\xec\xe0\xc8p\xda\xc8.\x8d\x0c\x97x\ \xa6a\x94\xb8oSTU*\x99t\x91\xb2\xc4\x01\x5c\ \x8c\xc5;%9\xd3\xd0\xa4\xbc\xc1\xb4\x07\xd2\x09K\xa5\ \xb4\x94\xf4g\x1eS\xb6\x04@ \xcag\xe5\x03sI\ Rr,\xff0\xa5\x92Q\x81PM\xe3i7{\xc4\ *[%\xaag\x11\x90\x07^.\xdb\x06\xcb73\xb2\ \xaa.%A\x90J,9\xc1\xf5\x0d\xe2\x9a\xe3\xa5z\ \x88\x1cq3\xb0\xa8\xc6W#\xcd\xc5\x97\xb1\xbe\xdf\x11\ Z\xa9n0F\xe3\xdc\x09\x09Q\xc6\x15J\x1d\xfb\xee\ \x91\xdd\x00\xaf\x9b3\xca\xaa\x0d\xae\xf7\x88\x07\xbdV\xb4\ /\x99$X\xe8\x9c\xbde\xb6\x8e\x96J\xeaR\xfc\xdc\ \x03\x18K\xf1\x1e\xa0SaJ\xbb\xe5L^\x86K\x88\ ,\xdd\xae\xd3<\xd9\xee\x92\x22m\xd8\xc0\x1c\xc9\xc8%\ \x90c\xe0\xf9mP{\xd3\xb2\xe3\x17R\xa7\x9d1/\ *\xa8q\x14\x18\x05\xb9\xe71\x98\xc2\xb3!\xaf\x85p\ \xf0\x8cR\x03\xaf\x84\x056\xd1;\xf0%\xaa\x5cQ\x03\ E\x89Iv\x14\xc1\xd7O\x88\x06\xb8\x1b\x8ceX\x8b\ \xfd\xb6$\xb2@=\x0d\xca\xe1t\x18G+r\x91n\ \xab%\xbd3\xe2\xd0\x9f&\x0e\x1bZn6*\x89\xba\ \xb1YeL\x98\xcd\xf6\xfa*\x17\xcd(\xba\xa2)\xcb\ \x94\xa9\xa6\xc0\x0bYR\x0dA\x89J\x89<\xd3\x13l\ ;\xf7\xce\xcae\xcb\xeb\x0d\xc7\x03\xbd\x90\xc5\xba8I\ 9\xe1\xb6R\xf2(\xefyO\xd0fM#\x0f\xa1r\ \x0d\xe6nB)\xe5\x01\xb8\x93\xe3\x97x\xe1\xd2\xab\xf9\ \x03\x18\x08\xfcm\x85\xd6\x00ti\x049\x0b\xbe\x88?\ (\xc3}s<\x80\xafO\xd1\x89\x90\xf4!\xdba\x81\ \x0a\xca\xa0\xe1\x1e\xca\xf2\x15v\xc1\xee\xc7\x0b\xfd\xa6T\ \xc1\xa8\x0c\xa2\xe4\x0b\xbbk\x83\x98HJF\x94\xf9V\ \xac\x8e\x9d\xa9B\xd9\xc6\x8d\xc4\xcf\xdf\xec\x06\x82T4\ \xebEz\x1c\xd4G\xde[\xe1q`\xad\xc5\xd4m\xcf\ \xd46.\xfbc\x8a\x01i\x94\xfa\xa2 \xa1\x93js\ '\x1b\x5ci?\xcb\xb5\x07\xf9Y\x8c\x06x\xb8\xa31\ WQ\xcbQ\xf4\x96\x84(\xaf\xd8MD\xcd\xac\x16\xd6\ Z\xd5\xe1~W\x1b\xa7\x825\xe1(\xd0\xd5\xd5\x90\xc8\ \xb30.H\x9f\xf9\x8d\x02\xb7>\xb2\x02\xe8\xf9\xd4.\ \xaf\xe87\x14\x07\xe3\xaa\xb3\xa8\xf1y\x18\xfa#\xcaz\ \xb1\xa8\xba\xddB\x9b?ko;\xec\x9e\xb8\x88\x9at\ ~{\xd6\x17E\xf7\xacc\xb1\xaf\x06\x93\x1dm\xf5[\ \xd1\xea\xc7\xcd\xbb\x90\xa6>Z\xda'c\xcdi\x1b7\ \xa7\xf1S\x1b5_\xd1\x04\x0ae\x7f\x9e\x7fqr\xae\ \xb8\xa9\xbd8\xd5\xa8\xf2(-\xcc~\xc4\xaf6\x5c\x06\ \xf5\x98\xdb\x17\xa8|\xc6#~,\xa6\x91\xe2eT\x96\ \xc0\xc1\x03b\x1bC%/+\x92|\xa2\xe8\xb5\xf8\xed\ \x15\xb4R\xa6\xdd\x00\x8c\xba\xc7\xef\xbc\xb3i\xdb\x1ah\ \x84,\x84\x1b!V\xc10\xed\x0cp\xcbm\x86\x80x\ \xd6\xec\x85\x1c\xb7\xd8q\x1f\x03BV\xd0\x07\x9dn\xab\ \xeaz\xac\xb1\xf8\xb9\xafP\x01\xe8\xf4\x8a\xd2T\x16o\ j\x18\xa5\xa1\xda\x93\xe3\xf0\xc7b\xba\x99\x15%fW\ E'f\x13hp\xa5\xc9\xc9\xa1\x99\x99\xe8\x94\xa8\xc7\ \xd9\x83\xb7\xfegV\xb4\xfe\x94\xe8\x17:ih\x01E\ \x82W\x05d\xcc\x9a\xc2=.M\x08\x8d'2\x9c\xc5\ y\xb4\x05\xa6\xa8\x1fPqR\x8b;\ \x97\xc2/\x9f\x9cM\x16\xcb\x9c\x5c\xd9\xe7\xb8\x0a\xf1E\ j\x17\x8a\x93\xc8\xa8g\x11\x04d\xa2\xb9v\xdcb4\ \xd4\xca\xaa\xad\x94T\xeaO\xa3\xa5\x8c\xacK\x05\xaa\x96\ $ 5\xb8\xa5r\x89\xf3\xc2\x091\x1b7\xab\xea\x8a\ \xc8;\xea\xaa\x86\xe9\x0b\xa5\xc3d\xe1\x04Y\xc6\x88\xb2\ \x18\xca\xe7\x1cb1_Tv\xafP\xc8x\xcfH\xf1\ \x9dHHc$RqK\xd0g\xc4Y$\x0b\x95q\ \x8f0\x0b\xc1\x22^=F-\xbbQ\x9a\xe9{6\xd8\ \x8aY\x14Xl\xf7\x98*\x0d\xd44\xcfOl\xf2p\ 4\xc3O\x16\xd8\xc9:/Q\x10w\xaaQ\xa9\x98\xb6\ \xa2\x8a2\x9dJ\x9bF\xc5\x02m\xa3gl\xaa[ \ \x11{\xf0cw\x22\xea\xb8\x855\xc8\x8ab\x17X\x14\ \xc9\x8e\xd5:*\xc9ZL\xac\x16$\xf1\x12\xe1\xd9\xc5\ 3\x8d\xde\x0f\xab\x9e\xb9\x9a\x9c\x0c\xde\xcd\xf2\xcd\xc3{\ Y1\xf3N\x911q\x18\xdf\xc4B\x0f\x0dq\xb2:\ 2m0\xe2t\xf1_6\x86\xe1\x9f0Y\xf1\x11`\ \xcc\x02\x870\x07\xcf\xfb\x0e\xd0e\x85\x0d\xf2\x1f\x8d\xb7\ \xb0\xd2\xc7}\x02+O\x1c\x08\xd4\xf9\xd6\x8c\x15\xca\xc0\ \x19KY\xa6;\xa7\x95\x03\xbb\xc4E\x85jd[a\ \xb2\x8a\xf9\x9b\xe9k\x1bPt>\xfe\xeaP\xef\x98\xa1\ \xc2\xf2-\x88l\xddk\x0f\xd1\xd0\x0c\xd4\x17M\xf4\xeb\ \x9cr\xae\x12\xe8e\xbc\x0c\xa0\x955\xb0@ce\x0b\ \x0c\xba8\xa9\x1b\x03t\x11\x92)v%]\xf3\xba\x19\ x\xb4\x88-\xf8\xa7ngI\x894\x22\xce\xf1m\xef\ \x8e\x93\x86~SAf\xee\x09\x9c\x12\xb8\x0c\x96\xb9\x07\ \x0d\x92\x0d\xd0\xbd\xf3B\x07\xc6L\xca\x0e\x0aY\xe5t\ \x0e\x8fx[\xc8\xc9\x99\xb2\xa5d\xf6\xe0\xa1\x01k\x8f\ \x94L&Yx\x9a\xa59\x19,\xad/K\xf7.\x1e\ V\xefL\x12\xc58\xfe\xc3\x1c2\x8aT\xc5}\xe5\x17\ \xe9\x8eq\x0e8Nf\xb2\x18!:\x94\xe17Y\x15\ \x88\x0a\x14\xf7\x08\x96\x1eu\x8dPD\xad\x12R\x95\x9b\ T\xc7X-\x8a\xd3\xf7\x0c\xc6OC\x8a\xb9\x8b\x9f\xb1\ g\x91^\x86\xb5\x92r\x0a;\xad\xc5\x1c\xfe\x225\x95\ \xdc\x12\x9a\x07p)f\xdcr\xcf\xa1\xae\x1e\x01me\ \xf7\x19s\xfe\xfb\x8c\xd5\xc0n\xab\x02\x16tD\xc1\x8b\ \x9aQn&\x5c\xfc`\xc6FC)\xcb\xbaW>y\ \x9a\xc5\x9d\x95w\xbe\x9b\xcd\xf1\xe4\xee\xfa\xf1\x90\x05\xb7\ \xaaM7\x9a\xe84\x05\x13N3eV\xd5W4\xf6\ \xe3'\xc0\x0d\x08\x8fbv\xb8\x1f\xe3\x1b/\xbf\xb0D\ tS\x16\x9a\xe0h\x93\xd3A(\x8a_L\xf0\xb5\xdd\ \x0e\xear\x1ab\x89#\x86\xe0=\x8b\x08SFY\xcf\ \xc6\xb1h\xef\xca\x1b\x7f^\x0f@`\x8b\xea\xf0E\xa0\ \xda \xd26[\xa8\xc1\x12\x0aw\xa0\x831a\xe8v\ \xac\x00\xe4\xc8$\x1a\x8b\x9c`\xbd\xdf\x8fkuZ\xdb\ \xdc{8W\xea\xbdj\x85W\xad/b\x92P\xf2\xb1\ y\x17\xb6/Y\xabM8R\x16\x13gT\x03\x94+\ ]\xb6m\xa0,x\x90L\x91f\x93\xb1\xca4[E\ G\xad\xea\xeef\xfbT\xc6\xed\x9cDDp\x1dn*\ \xb3\x8c\xe2\xe9\x09\xb7\xd1\xa03ZFuQ\xdd#X\ \x96\x10m\xe7\x02GV\x98g\xe7\xaa)\xc5\x03\x9b\xde\ \x8f3\x0c`\x08\x9dF\xfa\x19\xf8)\xe5\x91\x9f\xb4!\ \xfc\xc33\xd2F\x8c\xa0f\x11\x8b\x84\x82\xecT\xf9U\ \xf2c\xf8\xf3_\x90w\xd6t\xda\xad{8\x15\xca\xe0\ \x15\x08^\xb9\xf4\xf8r3OUJ\xf8S\x0f\x9e\x0a\ \xaaJ\xdad\x89K\xc6u\xb0Ii\xdc\xc0\x1aE\x86\ _\x07\xc7[GS\x98\xd7H\xb2I\xf1\xab\x9c\xac)\ \xaa\x22\x9b\x18HAz\x1c\xc7\xcb\xb3?\x9e\xe1$H\ \xee\xf1\x8c\x08\xe8\x092\x8fdQ}\x91B\xe20,\ \xba\x0cYW\x0d\xa7\x9er\x0f%H\xe1\xc3\xd1\xfe[\ \x0b\x01s`/\x95\xe2A\xae\x0d\x99 \xffvz\xfc\ `\xe2\xec\xc9K\xd7e\x8ct\xdbA\xe4%T\xbc(\ \xc0k<\xc0Xm\x8e\x05\x19w\xdb\xb6\xfa\xc9~\xf7\ \x88H\xd1\x0b\xdb\xbc\x0e\xf2\xacIs\xd4\xa4\x107\xc7\ \x91n\x1f\x10\xcf\xc4\x86\x85c\x9d\xb2n\x8a[\xf1\xd9\ ;\xc9\xd7M\x0b\x1e\x9fa\xed9H\xe1+R\x91.\ Y\xb1\x82<\x1aS\xc60\xdc\x02E\xf8\xc8\xc4\xc6\xb9\ \xb2\xee;\x8e\xcdJH\x98}\x94K1H\xd6G_\ ?\xf4l\x1e\xde7\x1c\xb5b\xa7\xa7\xaa\xfa\x86\xa1n\ *\xef\xd1\xc5\x01(\xe1\xe1\x8dEa\x96\x14W\x08\xac\ \x88\x04\xd0p\xeb\x00\x8eA\xaa\x9df\xf2\x8aR\xdc\xb5\ \x8eW\xb2\x83/^\x94\x99\x11w;$p\xfd\xaa\x91\ \x97*,\x05t\xbfe\xe5TEW\xac\x02?\xe2\x1d\ \xb1\x91\x09\xfc\xf9\x93\xa0\xa7\x8b^\xdcb\xf8|R\xa4\ \xcb\xde\x12\x5c\x9e\xd3\xd3\x15\x0e.\xd6\x8f\xf1s5,\ \xd6g4*F\x82\xeeF\xd0\x1a\xd5\xcbi\xd9\x8c\xb5\ X\xafF\x1bP\xc2%R\xd1\x88\xa9\x86\xd5\x87\xb0\xf8\ o\xf8\xc8zl\xa6\xb96t+9\x10K\xb0\xab\xc8\ \xb1j\xdd\xed\xef\xb6\xfb\xe6`\xa7=f\x0eo\xb3\xb3\ \xe5\xabA\x07\x9e\xb2\x97\xd4xTI\xfcq\xbe`\x8b\ igLs\xc9\x9f)\xae\x9b\x17\x0d\xa2\x9d\xa2=\x14\ \x9f+\x0eG\x04\x1a\xc18\xc0\xb1(Nw\xc1ad\ \xe0\xfe\xdc\xbca\xa8\xc0;\x8c\xe1,\xf4\xa05,\xed\ \x097=\x1bpC\xf0\xa8\x5c\xa1\xdf9<\xaeCp\ _'_\xe0\xa7\xecXD\xa6qn\xfaOA\x9c`\ \x99i\xfc\x8a&\x90\xcc\xfc\xa0\x0d?Ca\x09\x85\x0d\ {\x81\xc6\xc8\x7f\xd9I\xd6\x94,A\xdadd\xc3\xbd\ \xc9\x06Xr\x81~$'a\xd33\xf6y\xc9\xb0\xc2\ \x90.\xdc/\xb2\x841\xfd\xbf\xf89\x96\xf0\xa2.\xfc\ o\xb1\x841\xae\xad\xfe\xbd\x13\x17F\xf3\xd4\xecP\xd4\ \x9c\x97\xecwG\xc2\x88/\xe41\xac0\xae^\xff\xcf\ \x96\xf8\x08\xeb\xfdpIx\xc69\xff\x08I\x18\xe0y\ \xfb\x05\x92j1{\x89.L]\xbc\xc8\xcc\xeeB\x0e\ \xcd\xeeB\xc4\xd9\xad\xf3xw\xaa.\xae\xf3~\x8d\xaa\ .\xc6\x97\xec\x02R\xcd\x95\xbc\x91%\x0cMM\xff\x07\ :\xe8[%\ \x00\x00\x16\xde\ \x00\ \x00S\xbcx\xda\xed\ B\x0e\x9c!u\xcf\xd5\x11r\xc9\xcd\xa4\xee\xe7g\x08\ i\xbd\x85\xd4\xef\x1c\x87\xf1\x07\xa4\xfe;\xd7\x13\x92\xdc\ O.\x9f\xfb\x0fB\xaeJ\x91\xd1\xf9+\x09\xf9\x88\xc9\ \xc7\x1d\x19r\xe8\x89,!C\x8bd\xfa\x1f.!\xe4\ \x82\x87\xc8\xe1\xdb\xee$\xa4\xfb1rD9\x0exN\ \xf3q\xfc%r\xe4\xe4\xbbp\xfd\x9f\xe4\xab\xf7\xad$\ \xa4\xb1\x93\xfc\xd9\x9f\xaf \xa4\xf9-\xf2\xf8\x9f\xfc\x98\ \x90\xf5\x9d5\x1b\xbf\xf3\x13\x80\xfb\xa75\xf3\x97\x9e \ \xe4\xca\xb7jn-\xb4\x13r\xd9k5\xaf>\xfeK\ B\xf6\xbf\xb3\x22\x05\x8f\x91\x95\xe2\x8a;\xa5Z\xa0\xf3\ \xcc\x8a{\xde.\xc0\xbc?X\xf1\xedl'!]g\ W\xbc\xfb\xc4\x13\xb0\xa6\x9bk\xdb.\xfb4!\xabw\ \xd5nyb\x07!\xbf5W\xdb\xff\x05x\xbe\xf5\xf5\ \xda\xf1\x91\x9f\xc3\xf5*>\xf6'jo\x7f\xe1o\x09\ \x19\xd8Z{\xcf\xb5\xbb\x08i\xf9\x08\x1f\xc7\xee\xad}\ \xf9\xe5\x8f\x12\xb2\xe6\x99\xda\x97\xdf\xfe!!\x9fH\xd5\ \xb5\xed\x03:\xb6\xf0igWb\xd8\xb0\xc0\x1e\x9a\ \x12\xb3/\xc1\xf5\xca_'f\xdfz\x8f\x90\x8b\xbf\x94\ 0\x07\x80\xbf\x0d7&n\xfd!\xb3\xa7\xc6\xc4W\xc9\ \xe7\xe1~c\xe2\xbeO\xc1z\xf75'\xcet}\x19\ \xf8\xffd\xcb\xf5\x06\xdc\xdfs\xbaE\xfb.\xd8\xdb\x15\ \x9fj\x99\xab\xfb\x15!\xeb\x1eo\xb9y\xfe+`\x1f\ \xab\xf9\xb8\xa3\xb1\xe5o~\xb4\x06\xf4s]\xcb\xbbw\ ~\x0f\xd6\x7fGk\xd7&\xb0\xdf\xce;Z/?\x93\ \x02;\xb8\xbau\xea\x9f\xae\x05|\x0f\xb7\xd2\x0e\xb0\xf1\ \xaeo\xf1\xb1\xe7\xd9\xd6\x937\xc2\xbaV\xd9|\xdc\xd0\ \xdez7\x05:6\xdd\xdf\xfa\xfd/\xc1\xd8}\x98\x8f\ {oh}\xe5q\xe0\xe3\xe0\xe1\xd6\xb3\x9bA?\xf6\ nk}\xef\xec-\xf0\xdc\xbf\xb6]\x94\x1c\x05~\xfe\ \xb2\xed\xa2\xaf\x03_\xfa_j\xbb\xf1.\x90{\xcd\xcf\ \xda\xee~\x97\xf9\x99\xd7\xf8\xb8f7\x1f/\xfd\x0c\x1f\ {V\xf0q|\xbc]P.\x06=\xbf\xb8=)\x7f\ \x0b\xee7\xb4_1\x06|i\xbc\xa5\xfd\xd8\x03p\xbf\ i5\x1fG'\xda\x1f\xfe\x15\xd0\xb1\xe7D\xfb_\x1f\ \x80\xf5w\xdc\xd5\xfe\xd4\x99\xbb\xc1\x8eN\xb4\xff\xe3O\ @\x0e\xc9\xe7;v?\x02\xfc\xda\xf0h\xc7\xc2\x1f\x81\ \xbd\x0b\x1b\xf8\xb8\xeb\xdf;>\xbb\x0a\xf8\xb9\xeaG\x1d\ \x7f|\x18\xe6\x0f\xfcs\xc7\xfd\x8f\x00_6\xbe\xdb\xf1\ \xe0\xb5\xc0\xcf\xcd\xd9\x8e\xe7\xf7\x80\xd4\x92\x0b\x1d/\xfe\ \x0b\xd0\xbd\xf3\x17\x1d?\xfd\x0c\xc0\xbf2\xd9\xf1V-\ \xc8k\xc5+\x0a8D\x05V^\xd3M\x12d\x90\xa8\ D!\xd3\x84\x92\xe3D$\x02\x5c\xe7\xe1\xda )\xb8\ b\xdf\xd8_\x82L\x12\x9d\xe4\xf0\x97<|\xcap\xdf\ \x7f>\x0d\xd7:@Q\xe1:\x87\xbf\xcap7\x07\xb3\ R\xce\xf7,\x5c\x09\x0e&w\xa6\x02#\x87k\x12\x0b\ \xae3\x0e4\x13\xe70\x9c\x07\x9c_\x0d\xfc\xfd(\xc0\ \xd0\x89\x06\xf7D\x84\x93 \xe3\xf0\xc9\xe6\x8c\x22]\xd4\ \x995J\x92\xb0\x1a\x17*\xa7~\x18\xe62\xb8\x1a<\ =\x03\xbfX\xf0g\x22\x85\xc5\xeb\xe2\xabg\xcf\x1d\xc6\ \xd5p\xa8\x1a\xc3\xd4\xc4L\xa1\x01\xfeN&\x06Ue\ \x9a\x1e\x17\x85\xc1\xbcb\xa4\xc4\xbc\x92W\x12\x93zN\ \xcc\xe7E\xd9\xc0\xdf\xd3\xb2\xae\xaab\xee\xb8(\xd3\x5c\ \x22\x05\x9f\xd9\x9c\x00\x93\xd8M\x85\xc2\xb3\xa6%f\xe0\ 1S\x94\x95\xc4\x01\xf8j\x08\x83Gs\xba&\x8b\xaa\ \x92\x18WDaT\xccS\xb85\x9a\x9cf\x8f\x02\xf8\ \xe1\x9c)j\xc2\x8cb)f\xce\xc3\x05\xe85\xe1\xb0\ \x98\x83G5El\x04\xd2Z\xc4\xb4n[\xb3\xb62\ k\x195 ar;\xe9G\x1e\xe5\x90\xef\x19r\x15\ |\xb3\xe0_\x01\xd6\xdfGz\xe1_\x01~7\xe0\x8a\ \xc27\x1d9k\xc2\x9a\xf3\xc0\xc5,r*Gl\x90\ p\x12\xbe\xebd\xe0}\xcd\xee\x87\xe7E2\xe0\xf1q\ \xac_\x14r\x06\xcd\x5c\x95\xb3\xac\x82\xd9\xd7\xdb[\xa0\ \x86I\x0b\xba\xaa\x98r>\x99U\xac\x9c\x9dN*\xfa\ @\xf9\xdb\xfd\xbd\xe2@\xe4\xd2\xef\xa9\xb8t\x0b~W\ Q=\x0dT\x81$\xaaQ\xfc\xa2\x06\xde7\x84b\x16\ L\x16\xb3\xc0\xa2*\xcd\x1ab>\x99\xa7\xa1\xf5\x0eT\ z\xe0}\xb1a\x1eee!\xd1I\x22\x01\xc9\xf9%\ \xb2ai\x10*\xb3a^\xb1,j$%=\x1f\xc3\ \x86\x98\x07b\xd9\xd0M\xce\x00\x13\x0a@\x8e\x8e\xc4\x98\ p\xc5\x5c\x93@\xa6J\x89\xf4\x08[9\xc8\xc0\x08S\ \x1e\x86H\xd8\x1b\xc9~\xb2H\xe6P\x17\x18t\xb6l\ \x9b\xc1\xf4\xe0$\xf6\xd39\xaa\xea\x8c\xd2H\x08\xedd\ \x02\xf0J0Oc\x9f\xde\xbc\xc6\x09E\xa2\x9aI#\ '\xd5\x91Cd\xdc{t\xc5\xa1\xf1\xc8\xa7\xa6\xc9\xd5\ \x00\xd6D\x9f\xc7\xfc\xa7\x86\xbe\xd7\xc0\xa5s\x06X@\ \xbc\x0a\x7f\x12zB\x03\x94\x99\xa2\x1akp\xa7<{\ .\xf0\x19#\xec\xd7\xe75U\x17eaR\xd4\xc4,\ 5\x22\x89Y\x0f\xee\xd7@Gk\x03:\xab\x84O-\ 3\x86\xa8\x99\xaah\xe91\x8c\xda\x07\x1e\xfa\x06\xa0\xc3\ vtM\x80o\xcc[\xab\x18O\xb4j\xd6\xe4![\ 5(\xcb>\xd9\x13\x8av\x94\xa1l\x13eY\x85\xef\ \x01\xa4;K\x90\x9eE\x94\xcc\xac$\xf8d\xc8\xb2p\ \xdf@\x22\x04\xd2\x17Fa\xe9\x82$Z4\xab\x1b\x0b\ }B\x0c\x0a\x01dY\xf0d\xc4\x94S\x04\x85\x12Q\ \x1d\x16\x99\xfc\x02*)\xcf\x89\x9aDe\xe1P\xc1R\ t\xcd\x8c\x81\xd8\x0eD3i\xdb\xe8\xa0\x0co~\xc3\ \x10\x9b\xad\xc6\xcc\x1a%C\xc81\x0d9f\xe02\xb9\ \xa60\x931q\x81\xc6\x92\xb8\xbc~('jY\xea\ 3zDWe\xae\x1e\x11\xf8w\xc7\xe0\xd7\xd0\xa3\xb8\ x3h,9\x8f\x1a\x9f\xe1\xab\x1dl\x19E\xa5\x82\ \x06Q4\x96\xe3Sh\xb4L\xa0\x92'V\x15-\x85\ \xb9\x09\xd1q\xe8\xaf\xc3=\xc3\xf9\xd5$\x0bhG\xaf\ \xe3\x1a]Z\xb8K9F\x16<\x1a\xb6\xec\xa7\x16\x95\ ,!\xb5`Z4/L\x19\xfa\xb1\x05!E-K\ \xd1\xb2f\xec\xba\xf7/\x95\xc3aE+bo\xec\xb2\ w\x80\x05\x96\x824p!*(\x8b\x89H\xd9\xef\xb2\ \x07\xbc\xdd7\x12\xd0c#\xd6J&\xaa7\xc2\x10\xf1\ \x1d\x1e|\x062\x96\xf4\xbd\x98\xadY\x01\xce\x8b\xc81\ .\x0b{\x09\x08\xd7x\x08\x0b\xa2i\xce\xeb\x86\x1c\x8b\ 4C\x0ez\xaa\xd7\x89\x1e@q\x02\x99\xe8\xf9/\x01\ F\x86 \x7f\xee\xe4y\xa4m\xf5H\xb3Mj0\x0d\ \x16D\xcd\xa73\x86\xca\x03UQy\xaeLr)\x89\ e\xd2F\xf0\x1b\x1c\x09\x0d\xd9\xa8\xe6\x01k\x1a\x86E\ XJ\x9e\xc6@H\x901\xb0H@O\x04oN\xdd\ \xd8T,\xc6&W\xd9\xfc\xa7\xcb8\xf0-\x00\xdbU\ n\xc6 =\xe8k=\x08\xad\x93\xbaA+x\xd5n\ \x87\xd1\xe9\xd0Z%'\xb2R\xf0\x03\xbe\x07\xf7Y\xb9\ \xfe\xa0\x9dOSC\xd03\x82\xa4k\x1a8\x07\x86\xa2\ /\x06Gd\x5c\x8fx\xae\x15V\xc5\x82NXl\xf5\ S\xbaa\xf5\xc5\xb2y\xaa\xc4]\xd5\xa3\x83\x8a\x99\x90\ \xachs\x9e\xff\x0bQ\xb1\x92{\xbd\x8a\xe6\xf5\xf1%\ (nYL\x15ut'T\xa3\x14\xbd8\x0b\xe4s\ \xa8\xf0J\xc0\xd3J\xceg\x0e\xcd!\xa8\xbb\xab\xa7i\ \x9e\xa2\xfc\xac\x1c$:\x05\xd1\xca\xc5\xeaY\xa9\x1d\xc8\ `ji\xb62?\x19LY\xa2a\x95\xb3\x86\x9d\x90\ !\xa7!\xcf>X&\xea\xb1\x1c\x9a=\x13\xb6\x99\xd5\ \xfd\xe9\x81\x117\xf6\xf5\xf7\xa6\x078?6\x8a\x19p\ \xdc\xb3\xb2c\xd1\xb3\xa6!\x85\x92\x0f\x8en\x06SC\ \x15\xc3`4\xf86\x00\x9fR\x8eW\x0dy%\xcc\x17\ 0\xb9\x19\xe7\xdf|\x87 \x08\xc2\xa1q\xf8`@\xd6\ \x16\x01\x09r\xf4\x10J\xcbpd\x15\xe2\x81O\x16\xc0\ *PM\xc0\x95W\x808\xe0-\xb6\x9c\x1b\xe4\x19\x01\ \xef\x05,\xc2\xf56\x97!\x1e\xce\xcd\xc0\x0a\xcfC\x0e\ \xe9\xf9\x82\x0aQ_\xde\xc68SiI\x9c\x007Z\ \xc6s\x9ay4\x9f\xd3\xf1\x10w9\x10\x87\x01\x9a\x81\ \xd5\xa8\x82\x89\x8a\xe1Dv\xae\xf2f\x0c\xa6\x95L\xa6\ \xe2\x1c\xc4\x19\xb3\x1ad\xccbi(]`]\x1aW\ .\x1c!\xb7\xa5<\xe6M\xcc\x92\x19o\x93\xc1\x10\xa7\ uZ\x82\x99\xd3\xe7\xb9E\xe5\xa9iB\xc9 \x88Y\ Q\xd1\x92\xe5\xd1\x8f\x14)\xc4\xfbMO\xd7\xa2\xe2D\ $\xa7\xf1$|\x98\x15Ul\xcb\xce\x93q]?\ \x13\xf1\xb8\xd1-\xdc\x07\xbctJ\xa5\xa2I\x05\x83\x9a\ 6x$+G\x85\x8c\xae\xaa:\x10\x9d-j\x0e\xc6\ /\xa6\x0f\xa39E7\x18T\x07\xee\x14\x19\x01\x9d\xde\ w\x1e\xf1e$\xc9\x0aD\xfcU\xa2&PT:]\ \x92l\xc3\xa8\xa4\xbd\xddE\xb8d'\xb3c\xe1\x95\x89\ \xb1\x80\xac;\xc6s\xf1\xf3\x9ci^bT\x96@\x0eS\xa8\x8c\xa5\xde\x88\xab\xf6YG\x14\ <\x89`wy\x92fz\xe7\x1a\xf9\xbe\x0d\x9bkz\ \xbe\xaaZ\xf6\x1b\x95;V\xe2\x9c\xae\xc8\xa6\x90JM\ \xf4\xceL\xa4\xc0\x9b\x81\x82\xe7\xa0l\x162\xa2\xa2\x82\ x\x92\xc2>P~VV\xb2\x1dr\xcb\x91\xce\xbc&\ \x18\x8ayt[\xd5R\xf9MW\xf37]\xcd\x0f\xa4\ \xab\x19\xe1t\x7f\xb6$]\x0b[f\xf0,\xb6\xe2\xbe\ !\x11\x99@\x0b\xce\x9b&\x16JD\xf1:Vg\xf1\ Z\xc2W\x07T\xb4]w\xb3\xc0\xd7\x95ri\xed\xd2\ \x1c\xac\x14-\xbdkL\xc6\xcb\xbc\xadZJA\xa5\xc1\ \x9c^\x90DM\xc8Q\xb5 \x00\xcb!a\xb1\x0b\x5c\ &n\x1dY\xb5\xa3\xad\xea\x1d\x87\xd2Y+\xf1L\xab\ \xec4*\xc2\xf3\xf0\xed\x81\x98y\x97\x803\xcd\x15\x99\ \xb5\xe4\x1d5*\xde\x9ao\x1f\xd2U\xdd\x10L)G\ \xbdS\xa9\xa50\xfb\xbc\x0a\x22\x18a\xcd\x92Z\xd7U\ \x00\xd5S\x02\xbf\xceX\x07\x98\xec<\xf0u\xc86A\ ]\x95\xe3^\x89\x1b\x81\xf04\xf8\x17\x03_)1\x02\ \xa0\xdd\x13\x82=E'\xe9\xcc@\xa0\x17\x80m\x5c'\ \xb9\xb5w\xe3K\x92\xee\xf6\x93\x89\xd7\xcc\x8fHh\xff\ \xc1^\xd19\x9d\xd0\xf3^\xc3\xe0\x1d\x95\x0c\xf79\xde\ \xa2\xf7\x0d\x19\x10\xbc\xc1P\xedt\x06\xcf\xecA4\x07\ vO\xda\xa6\x22u\xe3\x8e\x97\xd9-$\x93I\x16\xce\ e\x9a\x11A\x0f=\x05\x132\xfe+(\xa5\x1cZ\x8b\ \xa7%\xe2\xf06\xed\xe7\xc0\xcc\x98\xd9\xaaw<\x92\xa7\ Av\x89m\xfb\xc7\x8d\x8d\xa2nY\x98\xdbsN\xd4\ \xcdx<\x0b\xbe\x9e\xa2\x84\xde\x9b\xda\xce\x8fT\xb2\x18\ )\xb1\x0ecFa\x87\x0a\x98K\x9c\xa3\x86\x92Y@\ \x9f\x06\xc6f\xc4\x91\xbd\xec\x8d\x8f\x08\x1c\xcb\xf7\x8eK\ &\xf8\x8eK)\xa2\xbd\xe0\x16x\xe29W\xc49\xb3\ hy\x15;\x96\xc3\x9a\x98\x06\xefuPwx\xcab\ QJ\xb7!C\x89\xc1\xfd\xbb\x11\xb8\x97\xa5\x8b\x1a8\ @\xbb\xc1\xa1*\xaa\x89\x1a\xe9\xef\xa6\x9c\xde\x84Tt\ ,\xa5aD\xd7\xacX6\xce\x95\xec\xae\x88\x98\xd73\ \xc9\xbc\xe1\x05\x12\xde\xeb\xd60e)\xa0\xff\xf2\x93\x13\ w\x1bJw\xd2\x05\xcd\x99o\xa0|\x83gW$\xaf\ ;\xe8\x1f\x1d\xdb\x8e\x9db\xd6\xb1\x14x\xcb\x92Eo\ I\xd5A\xc9\xd3\xb6e\x81$$U\x91\x8eR9\x19\ \xbb\xf01\x8f\xef\xe1fS\xe3\x98\xe45\x97\x225u\ 9\xb6\x80\xdc\x1c\xc2\xdb\x02\x8a$q\xc2y\xdb\xcd.\ \x92Mb\x02B\x91\x0d\xe9I,\x95I\x88G\x0b\x98\ \x02TR\x9d\xa2\xa3\x99!m\xb6\x16\x0a\xf1(6c\ +/\x0a\xa4\xef{\xda\x82\xe0\xe2\xccb\xf9{\x82U\ #\xb1B\x19\xef\x5c\x89.\xac\xf2\x91X\x86B\xe3\xc1\ G\xbf\x97S\xfa\x1c\xdfHb\xa1c\xd1\xe9\xe3I\xa1\ x\xdd2e\xd0\x0c5(\xa4(f\x19\x0f\xc6Z\xe6\ 6\x08\xd8=\xc3\x1f<\x80\xe5o\x8d\xab\x9eo\xb3\xf0\ 7n\xaef`C\x8e\xb5\xc8 \x03\x9e\x17\x8e\xd2\x85\ 8|\xfd\x8e\x1aJ\x0e\xb6\x88\xb6\xa6\x93\xf5\xf3\xa8\xe8\ n\xa9\x847M6M\xdbZ\xe0]iV\xab\x99l\ \xe7\xc3.\xc4\xa0\x15*\xbd\xb2\xe0\x1b,\xbe\xa10h\ \xc6\xc6\xec\xe9\x92\xde\x9e\x19\xec\x80\xf2NY\xdc\xf4\x9b\ J\xb6\xc2\x04\xef\xac]\xb1\xbf\xe3\xa5\x94\x86\x22\xd0\xbc\ \x83\x93:\xb2\xcb=\x8a^\xdd\x0e\xaaY\xe6\xd8\xec\x15\ l\xab\xccOX$\xe7\xec\xac +\xa2\xaag\x85\xf9\ \x1c\xd5\xfc\xbb\xac\x93\xa1h\x8a\x99\xe3G\xe4\x22\xb3\x92\ \xd2\x05F\xbb\xf3\xe0K\xadE;\xa1\x81|\xb1\xdc\xd2\ |\xbe_\x18^\x84\xdb\xafu\xbcy\x0c\xa9\xbbbI\ M{\xfbx\xfe9D\x8a\xd9\x7f`\x8f\x1fQ\xe6\xa9\ f\xa7E#\xd6\xbbGap\x936\xee\x8f\xdc\x13'\ \xfc\x98'St\xd5oF#\x0e\x93\x05\xa7\x82\xa8\x95\ )3\x82\xefS\x85\xc2.{\x85*\xd6\xcd\xb4\x06\xbb\ \xf1\x819\xd8\x87\x8f-\x84\xd8\x9c\x85\x12L\x8d)k\ A\x8dG\xb5\xcb\xdbA\x8a\xeakv\x95\xf44\xb7\x87\ _\x10\x9dq\xfa\x92]NWr{,\xa2\xa9\x22^\ \xb8z\xa4\x84\xe2s\xf0\x84mX\xd8\x9dN\x0a\xe1\xf6\ \xa0\x02\xdbY3\xba\xae\x82\xac1\x01\x822\xbe\x1cg\ \xf7\x86\x92\xdc0>\x03\x97\xca\xd5\x81\x8f\xee}\xff\x88\ \x9d\xaffk\xddC}\x1a\xe4\xa1\x15\xd2\xde\xd5P%\ \xe9X\xcf\xe7\xdd\x83\x8f~5q\x98\x95n\xf1\x14\xa7\ C[|\xdc\xf5X^Ds\xbb3\xc1\x83\x1bfl\ \xc4\xab$\xce\xce#\xa2bA\x91`(:\xdbD\xb0\ \xe6\xd9\x8e\x82A1&V!\xe2\xf3\xfa\x7f\x0eHX\ \xf4\x98\xf5\x81\x97\x16\xc5X>\xf8\x17\xd0\x8b1\xfe?\ |\xfb\xbc\x98\xc4\xf3\xf9\xeay1\xee&\xf7\xadqo\ f\xed\xd8T_\xd4\x93\xcb\xfe\xdev1\x82\x0fs#\ \xb9\x98\x96J/\x86\x17?\xbf\xac/y\x17\x03\xff\x80\ \xde\xf0.Fs\x1e\x0f\xe0_0\xc7\x9c\xffl\x06\x9d\ \xffl\xc4.\xf4y9\x10_\x91\x8a\xf3x\x8c\xbc,\ -7\xb1b\xa9\xb6\xe6\xff\x00\x1c}\xd4\xea\ \x00\x00E\xab\ <\ \xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\xa7\ \x00\x00\x00\x05zh_CNB\x00\x00\x05\xc0\x00\x00\ \x05;\x00\x00\x08\xe8\x00\x00\x05;\x00\x00\x0e5\x00\x00\ \x05;\x00\x007,\x00\x00N:\x00\x00<\xe2\x00\x04\ \xcf\x04\x00\x00\x1eu\x00\x04\xd9\x90\x00\x00\x0d\x04\x00\x04\ \xe3\xc0\x00\x00\x0dc\x00\x050K\x00\x00\x0d\x95\x00\x05\ \xab`\x00\x00$\xca\x002v\xee\x00\x003\xfc\x00H\ w9\x00\x00\x1d\xb5\x00Hw9\x00\x00\x22 \x00M\ \x99S\x00\x00\x0d2\x00O\xc5g\x00\x008\xfb\x00R\ \xd9$\x00\x00\x18\xf4\x00V\x8c\x95\x00\x00#\xb2\x00W\ iz\x00\x00\x0e]\x00Wiz\x00\x00=\xa1\x00W\ \x96\xf9\x00\x00\x0e\x8a\x00]6\xbe\x00\x0030\x00\x97\ \xa2\x10\x00\x00\x09\xd7\x00\xb7\xbb\x02\x00\x00\x0b\x8f\x00\xc2\ \xad\xd0\x00\x00\x14h\x01\x18\xab\xd4\x00\x00\x1d\xe3\x010\ \x8d\xae\x00\x00'\x9d\x01w&\x82\x00\x001\x9a\x01\x8b\ p\x0e\x00\x00*I\x01\xe1\xc2\xec\x00\x009\x82\x02/\ @\xf0\x00\x000\xde\x02S\xd0\x00\x00\x00\x10x\x02\x95\ c\x03\x00\x00\x1e\xa2\x02\x9a\xf5p\x00\x00\x14\xba\x02\xaa\ g'\x00\x00!.\x02\xf1\x09\xf0\x00\x00\x15\x1b\x02\xf9\ \xc5\xc5\x00\x00\x08\xb9\x03\x0d1^\x00\x00\x11\xdf\x03\x1c\ \xc5*\x00\x00\x22\xc6\x03<\x83\x03\x00\x00\x0d\xbf\x03K\ F\xe3\x00\x00\x22\x8b\x03KF\xe3\x00\x002\xb7\x03\x92\ \xd2\xce\x00\x004s\x03\x9a[4\x00\x00\x0cA\x03\x9a\ [4\x00\x00\x00\x00\x1a_\x05c\x9c>\x00\x00>\xa5\x05i\ <\xfe\x00\x00\x1b\x07\x05t\x96\x00\x00\x00\x0e\xb5\x05t\ \x96\x00\x00\x00=\xcb\x05v\x1b\x9e\x00\x00\x13 \x05\x83\ \x80e\x00\x00\x0fm\x05\x8c\xac5\x00\x00$<\x05\xa1\ \x08\xc0\x00\x009\xbd\x05\xa3\x9c>\x00\x00\x1a\xb4\x05\xa3\ \x9c>\x00\x00?\x03\x05\xa8X\xf3\x00\x00\x08\x0a\x05\xaa\ \x8b\xc3\x00\x009\xeb\x05\xc63\xee\x00\x00\x02\xa9\x05\xd0\ )\xae\x00\x00+2\x06-B\x0e\x00\x00\x1a\x04\x06-\ B\x0e\x00\x00>?\x069\x82N\x00\x00\x1b\xaa\x069\ \x82N\x00\x00?a\x06:\xd1\xf2\x00\x009J\x06<\ =\x10\x00\x00;\x11\x06]1\xde\x00\x00\x06<\x06\x9a\ K\x00\x00\x00\x10\xad\x06\x9a\xf5C\x00\x008U\x06\x9c\ (\x01\x00\x005\xc8\x06\xb6\xbe`\x00\x00\x0a\xc2\x06\xc5\ )*\x00\x00\x22\xfc\x06\xcc\xd6\xa3\x00\x00 8\x06\xdc\ S\xa3\x00\x00\x0b\x02\x06\xef\xbcp\x00\x00\x0c\x02\x06\xef\ \xbcp\x00\x00<\x1b\x07\x14*\x1e\x00\x00 \xa7\x07\x1d\ \xe0`\x00\x00:\x89\x076\xcd`\x00\x002\xf1\x076\ \xcd`\x00\x00;\xdf\x076\xcf`\x00\x00\x0bP\x07[\ &u\x00\x00\x16W\x07\x9b]0\x00\x006\xef\x07\x9c\ 1\x03\x00\x00:\xcf\x08 Hn\x00\x00\x07C\x08g\ -\xa2\x00\x00\x128\x08\x95 \xa3\x00\x00\x08T\x08\xf6\ \x88`\x00\x00\x0e\xf1\x08\xf6\x88`\x00\x00>\x04\x09>\ \x0d$\x00\x00!\x9e\x09^\x89\xd3\x00\x00 \x07\x09`\ \x06\xb5\x00\x00!g\x09b\x06\xb5\x00\x00\x0f\xa1\x09g\ \x01\xd0\x00\x00:F\x09|\xf4.\x00\x00.\xc1\x09}\ R\xc0\x00\x00\x0b\xc7\x09\x8ct\xd3\x00\x008&\x09\x93\ \xd2\xfe\x00\x00\x22L\x09\x96F0\x00\x00\x17\x1c\x09\xb8\ \x7f\xb1\x00\x00\x00\x00\x0a\x06e~\x00\x001[\x0a\x0c\ \x87\x0e\x00\x00&\x0a\x0aErt\x00\x008\x86\x0a_\ \xd7\x0e\x00\x00\x10\xeb\x0a_\xf3\xfb\x00\x00\x1d2\x0as\ >\xc3\x00\x00\x09i\x0a\x8b\xc3`\x00\x00$\x99\x0a\x97\ \x00\x80\x00\x00\x10*\x0a\xa2Yp\x00\x007\xc9\x0a\xc0\ (\x90\x00\x00:\x17\x0b`r`\x00\x006<\x0bn\ \xb1\xee\x00\x00-\xd0\x0bv\x04\xf0\x00\x00\x14\x13\x0b\x89\ w\x94\x00\x00\x1dx\x0b\x89w\x94\x00\x00!\xe5\x0b\xc8\ \xc7\x13\x00\x002(\x0b\xef\xd8N\x00\x00\x18\x94\x0b\xf9\ \x95\xb3\x00\x00\x16\x99\x0c(\x19\x04\x00\x00 k\x0c2\ \xc0S\x00\x00\x08\x87\x0cP\xdb[\x00\x00\x09\x98\x0cX\ \xcd\xfe\x00\x00)9\x0ce\x0f.\x00\x00 \xfc\x0ce\ \x0f.\x00\x00$i\x0c\x96q\xc0\x00\x00\x11F\x0c\x96\ q\xc0\x00\x00\x15j\x0c\x99e\x80\x00\x00\x17W\x0c\xb5\ \x86\x80\x00\x00#p\x0c\xb5\x86\x80\x00\x006\xae\x0c\xc2\ K\xd3\x00\x000u\x0c\xdd\xc2\x03\x00\x007T\x0c\xe0\ \x1a\xf3\x00\x006{\x0c\xfb\xe0\x8a\x00\x00\x17\x91\x0d\x1f\ .H\x00\x00\x0f/\x0d\x1f\x9f\xd3\x00\x003\xb4\x0dq\ \x98\xde\x00\x00\x04:\x0d\x99\xf9B\x00\x00\x09\x0e\x0d\x99\ \xf9B\x00\x00\x12\x83\x0d\x99\xf9B\x00\x00\x1f\xa7\x0d\x99\ \xf9B\x00\x00#\xde\x0d\x99\xf9B\x00\x00=G\x0d\xff\ u~\x00\x00&\xc0\x0e i\x22\x00\x00\x196\x0e.\ d\xa4\x00\x00\x1fl\x0e7I\xc3\x00\x00\x0a\x16\x0ex\ \xa8B\x00\x00\x0a|\x0ex\xa8B\x00\x00;\x9c\x0e\xb2\ \xf0\x80\x00\x006\x0a\x0e\xc4J\xf0\x00\x00\x0f\xd5\x0e\xca\ \xc0\x99\x00\x00\x1f \x0e\xda\xd4\xfe\x00\x00%1\x0f6\ \xb6\x90\x00\x00\x16\x00\x0fy\xa5^\x00\x00\x1c\x05\x0fy\ \xa5^\x00\x00,P\x0f}\x11p\x00\x00\x11\x90\x0f\x9e\ \x0b~\x00\x005\x05\x0f\xa6V\x80\x00\x004\xd6\x0f\xa7\ \xb6\x04\x00\x00\x16\xd9\x0f\xac[\xee\x00\x00\x17\xe5\x0f\xd1\ ?\x00\x00\x00$\xf5\x0f\xd6\xe5\xde\x00\x00(y\x0f\xde\ {\xf0\x00\x001!\x0f\xf3\x03\x0e\x00\x00\x055i\x00\ \x00?\xc7\x03\x00\x00\x01,\x00\x0a\x00A\x00l\x00i\ \x00R\x00e\x00z\x00a\x00 \x00A\x00m\x00i\ \x00r\x00S\x00a\x00m\x00i\x00m\x00i\x00\x0a\ \x00M\x00o\x00h\x00a\x00m\x00m\x00a\x00d\ \x00r\x00e\x00z\x00a\x00 \x00A\x00b\x00d\ \x00o\x00l\x00l\x00a\x00h\x00z\x00a\x00d\ \x00e\x00h\x00\x0a\x00S\x00a\x00d\x00e\x00g\ \x00h\x00 \x00A\x00l\x00i\x00r\x00e\x00z\ \x00a\x00i\x00e\x00\x0a\x00M\x00o\x00s\x00t\ \x00a\x00f\x00a\x00 \x00A\x00s\x00a\x00d\ \x00i\x00\x0a\x00J\x00a\x00f\x00a\x00r\x00 \ \x00A\x00k\x00h\x00o\x00n\x00d\x00a\x00l\ \x00i\x00\x0a\x00K\x00i\x00a\x00 \x00H\x00a\ \x00m\x00e\x00d\x00i\x00\x0a\x00H\x00.\x00R\ \x00o\x00s\x00t\x00a\x00m\x00i\x00\x0a\x00E\ \x00h\x00s\x00a\x00n\x00 \x00T\x00i\x00t\ \x00i\x00s\x00h\x00\x0a\x00M\x00o\x00h\x00a\ \x00m\x00m\x00a\x00d\x00A\x00m\x00i\x00n\ \x00 \x00V\x00a\x00h\x00e\x00d\x00i\x00n\ \x00i\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x96\x0aA\ liReza AmirSamim\ i\x0aMohammadreza A\ bdollahzadeh\x0aSad\ egh Alirezaie\x0aMo\ stafa Asadi\x0aJafa\ r Akhondali\x0aKia \ Hamedi\x0aH.Rostami\ \x0aEhsan Titish\x0aMo\ hammadAmin Vahed\ inia\x07\x00\x00\x00\x0babout_u\ i_tr\x01\x03\x00\x00\x00l\x00<\x00a\x00 \ \x00h\x00r\x00e\x00f\x00=\x00h\x00t\x00t\ \x00p\x00s\x00:\x00/\x00/\x00g\x00i\x00t\ \x00h\x00u\x00b\x00.\x00c\x00o\x00m\x00/\ \x00f\x00f\x00m\x00p\x00e\x00g\x00/\x00f\ \x00f\x00m\x00p\x00e\x00g\x00>\x00F\x00F\ \x00m\x00p\x00e\x00g\x00 \x98yv\xee\x00<\ \x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00;\ FFmpeg \ project\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ n\x00<\x00a\x00 \x00h\x00r\x00e\x00f\x00\ =\x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00\ /\x00g\x00i\x00t\x00h\x00u\x00b\x00.\x00\ c\x00o\x00m\x00/\x00p\x00s\x00f\x00/\x00\ r\x00e\x00q\x00u\x00e\x00s\x00t\x00s\x00\ >\x00R\x00e\x00q\x00u\x00e\x00s\x00t\x00\ s\x00 \x98yv\xee\x00<\x00/\x00a\x00>\x08\ \x00\x00\x00\x00\x06\x00\x00\x00<Requests projec\ t\x07\x00\x00\x00\x0babout_\ ui_tr\x01\x03\x00\x00\x00l\x00<\x00a\x00\ \x00h\x00r\x00e\x00f\x00=\x00h\x00t\x00\ t\x00p\x00s\x00:\x00/\x00/\x00g\x00i\x00\ t\x00h\x00u\x00b\x00.\x00c\x00o\x00m\x00\ /\x00y\x00t\x00-\x00d\x00l\x00p\x00/\x00\ y\x00t\x00-\x00d\x00l\x00p\x00>\x00Y\x00\ T\x00-\x00D\x00L\x00P\x00 \x98yv\xee\x00\ <\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ ;YT-DLP\ project\x07\x00\x00\x00\ \x0babout_ui_tr\x01\x03\x00\x00\ \x00\x92\x00<\x00a\x00 \x00h\x00r\x00e\x00f\ \x00=\x00h\x00t\x00t\x00p\x00s\x00:\x00/\ \x00/\x00p\x00e\x00r\x00s\x00e\x00p\x00o\ \x00l\x00i\x00s\x00d\x00m\x00.\x00g\x00i\ \x00t\x00h\x00u\x00b\x00.\x00i\x00o\x00>\ \x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\ \x00p\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x00d\x00m\x00.\x00g\x00i\x00t\ \x00h\x00u\x00b\x00.\x00i\x00o\x00<\x00/\ \x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00Ihttps://per\ sepolisdm.github\ .io\x07\x00\x00\x00\x0babou\ t_ui_tr\x01\x03\x00\x00\x00\x9a\x00<\x00\ a\x00 \x00h\x00r\x00e\x00f\x00=\x00h\x00\ t\x00t\x00p\x00s\x00:\x00/\x00/\x00t\x00\ e\x00l\x00e\x00g\x00r\x00a\x00m\x00.\x00\ m\x00e\x00/\x00p\x00e\x00r\x00s\x00e\x00\ p\x00o\x00l\x00i\x00s\x00d\x00m\x00>\x00\ h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00\ t\x00e\x00l\x00e\x00g\x00r\x00a\x00m\x00\ .\x00m\x00e\x00/\x00p\x00e\x00r\x00s\x00\ e\x00p\x00o\x00l\x00i\x00s\x00d\x00m\x00\ <\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ Mhttps:\ //telegram.me/pe\ rsepolisdm\x07\x00\ \x00\x00\x0babout_ui_tr\x01\x03\ \x00\x00\x00\x9a\x00<\x00a\x00 \x00h\x00r\x00e\ \x00f\x00=\x00h\x00t\x00t\x00p\x00s\x00:\ \x00/\x00/\x00t\x00w\x00i\x00t\x00t\x00e\ \x00r\x00.\x00c\x00o\x00m\x00/\x00p\x00e\ \x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\ \x00d\x00m\x00>\x00h\x00t\x00t\x00p\x00s\ \x00:\x00/\x00/\x00t\x00w\x00i\x00t\x00t\ \x00e\x00r\x00.\x00c\x00o\x00m\x00/\x00p\ \x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\ \x00s\x00d\x00m\x00<\x00/\x00a\x00>\x08\x00\ \x00\x00\x00\x06\x00\x00\x00Mhttps://twitter\ .com/persepolisd\ m\x07\x00\x00\x00\x0babout_\ ui_tr\x01\x03\x00\x00\x00l\x00<\x00a\x00\ \x00h\x00r\x00e\x00f\x00=\x00h\x00t\x00\ t\x00p\x00s\x00:\x00/\x00/\x00w\x00i\x00\ k\x00i\x00.\x00q\x00t\x00.\x00i\x00o\x00\ /\x00Q\x00t\x00_\x00f\x00o\x00r\x00_\x00\ P\x00y\x00t\x00h\x00o\x00n\x00>\x00P\x00\ y\x00s\x00i\x00d\x00e\x00 \x98yv\xee\x00\ <\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ ;Pyside\ project\x07\x00\x00\x00\ \x0babout_ui_tr\x01\x03\x00\x00\ \x00\x1aQsN\x8e\x00 \x00P\x00e\x00r\x00s\ \x00e\x00p\x00o\x00l\x00i\x00s\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x10About Pers\ epolis\x07\x00\x00\x00\x0babout\ _ui_tr\x01\x03\x00\x00\x00\x04\x81\xf4\x8c\x22\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fAcknow\ ledgments\x07\x00\x00\x00\x0bab\ out_ui_tr\x01\x03\x00\x00\x00\x08_\ \x00S\xd1N\xbaTX\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0aDevelopers\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ \x08\x8b\xb8S\xefSO\x8b\xae\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x07License\x07\x00\x00\x00\x0ba\ bout_ui_tr\x01\x03\x00\x00\x00\x04\ xn[\x9a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\ \x07\x00\x00\x00\x0babout_ui_tr\ \x01\x03\x00\x00\x00 \x00P\x00e\x00r\x00s\x00e\ \x00p\x00o\x00l\x00i\x00s\x00 N\x0b\x8f}\ {\xa1t\x06Vh\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1b\ Persepolis Downl\ oad Manager\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ \x04\x8b\xd1\x80\x05\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0bT\ ranslators\x07\x00\x00\x00\x0ba\ bout_ui_tr\x01\x03\x00\x00\x00\x0c\ m\xfbR\xa0N\x0b\x8f}\x94\xfec\xa5\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x11Add Downlo\ ad Link\x07\x00\x00\x00\x0daddl\ ink_ui_tr\x01\x03\x00\x00\x00\x0cm\ \xfbR\xa0R0|{R+\xff\x1a\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x11Add to cate\ gory: \x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x00\x08\x9a\xd8\ ~\xa7\x90\x09\x98y\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10\ Advanced Options\ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x00\x04S\xd6m\x88\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x06Cancel\x07\x00\x00\x00\ \x0daddlink_ui_tr\x01\x03\ \x00\x00\x00\x0ef\xf4e9N\x0b\x8f}e\x87N\xf6\ Y9\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Chan\ ge Download Fold\ er\x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00\x0cf\xf4e9e\x87\ N\xf6T\x0d\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x12\ Change file name\ : \x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00\x10h\xc0mK|\xfb\ ~\xdfN\xe3t\x06\x8b\xbe\x7fn\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1cDetect Syste\ m Proxy Settings\ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x00\x0cN\x0b\x8f}e\x87N\xf6\ Y9\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Do\ wnload Folder: \x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x00\x08z\x0dT\x0eN\x0b\x8f}\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0eDownloa\ d Later\x07\x00\x00\x00\x0daddl\ ink_ui_tr\x01\x03\x00\x00\x00\x0aN\ \x0b\x8f}\x94\xfec\xa5\xff\x1a\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0fDownload link\ : \x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00\x0aN\x0b\x8f}[\xc6\ x\x01\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x13Do\ wnload password:\ \x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00\x10N\x0b\x8f}u(b\ 7T\x0dT\x8c[\xc6x\x01\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x1eDownload user\ name and passwor\ d\x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00\x0cN\x0b\x8f}u(b\ 7T\x0d\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x13D\ ownload username\ : \x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00\x08~\xd3g_e\xf6\ \x95\xf4\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08End \ time\x07\x00\x00\x00\x0daddlink\ _ui_tr\x01\x03\x00\x00\x00\x08\x00H\x00T\ \x00T\x00P\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04HT\ TP\x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00\x0a\x00H\x00T\x00T\ \x00P\x00S\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05HT\ TPS\x07\x00\x00\x00\x0daddlink_\ ui_tr\x01\x03\x00\x00\x00\x0c\x00I\x00P\x00\ W0W@\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x04IP: \x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x00\x04\x94\xfec\ \xa5\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04Link\x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x00\x08f\xf4Y\x1a\x90\x09\x98y\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0cMore Op\ tions\x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x00\x08\x8f\xdec\ \xa5ep\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16N\ umber of connect\ ions:\x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x00\x04xn[\ \x9a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\x07\x00\x00\ \x00\x0daddlink_ui_tr\x01\ \x03\x00\x00\x00\x06z\xefS\xe3\xff\x1a\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x05Port:\x07\x00\x00\x00\x0da\ ddlink_ui_tr\x01\x03\x00\x00\ \x00\x04N\xe3t\x06\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05\ Proxy\x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x00\x0aN\xe3t\ \x06[\xc6x\x01\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x10Proxy password:\ \x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00\x0cN\xe3t\x06u(b\ 7T\x0d\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10P\ roxy username: \x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x00\x0a\x8b\xb0OOkd\x8d\xef_\ \x84\x08\x00\x00\x00\x00\x06\x00\x00\x00\x12Remem\ ber this path\x07\x00\x00\ \x00\x0daddlink_ui_tr\x01\ \x03\x00\x00\x00\x0c\x00S\x00O\x00C\x00K\x00S\x00\ 5\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06SOCKS\ 5\x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00\x08_\x00Y\xcbe\xf6\x95\ \xf4\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aStart\ time\x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x00\x16\x00<\x00\ b\x00>e\x87N\xf6T\x0d\x00<\x00/\x00b\x00\ >\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x12\ File name: \x07\ \x00\x00\x00\x18after_downlo\ ad_src_ui_tr\x01\x03\x00\x00\ \x00\x14\x00<\x00b\x00>Y'\x5c\x0f\x00<\x00/\ \x00b\x00>\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d\ Size: \x07\x00\x00\ \x00\x18after_download\ _src_ui_tr\x01\x03\x00\x00\x00\x04\ xn[\x9a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08 \ OK \x07\x00\x00\x00\x14after\ _download_ui_tr\x01\ \x03\x00\x00\x00\x08bS_\x00e\x87N\xf6\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0d Open Fi\ le \x07\x00\x00\x00\x14after_d\ ownload_ui_tr\x01\x03\x00\ \x00\x00\x18\x00<\x00b\x00>N\x0b\x8f}[\x8cb\ \x10\xff\x01\x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x1aDownload\ Completed!\x07\ \x00\x00\x00\x14after_downlo\ ad_ui_tr\x01\x03\x00\x00\x00\x14\x00<\ \x00b\x00>\x94\xfec\xa5\x00<\x00/\x00b\x00>\ \xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dL\ ink: \x07\x00\x00\x00\x14af\ ter_download_ui_\ tr\x01\x03\x00\x00\x00\x16\x00<\x00b\x00>S\xe6\ [XN:\x00<\x00/\x00b\x00>\xff\x1a\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x10Save \ as: \x07\x00\x00\x00\x14aft\ er_download_ui_t\ r\x01\x03\x00\x00\x00\x12N\x0dQ\x8df>y:\x8f\ \xd9gaO\xe1`o0\x02\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x1eDon't show th\ is message again\ .\x07\x00\x00\x00\x14after_down\ load_ui_tr\x01\x03\x00\x00\x00\x0e\ bS_\x00N\x0b\x8f}e\x87N\xf6Y9\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x14Open Dow\ nload Folder\x07\x00\x00\x00\ \x14after_download_\ ui_tr\x01\x03\x00\x00\x00 \x00P\x00e\x00\ r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00\ N\x0b\x8f}{\xa1t\x06Vh\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x1bPersepolis \ Download Manager\ \x07\x00\x00\x00\x14after_downl\ oad_ui_tr\x01\x03\x00\x00\x00\x08N\ \x0ab\xa5\x95\xee\x98\x98\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0cReport Issue\x07\x00\x00\ \x00\x10log_window_ui_\ tr\x01\x03\x00\x00\x00X\x00<\x00b\x00>\x00<\ \x00c\x00e\x00n\x00t\x00e\x00r\x00>kd\ \x94\xfec\xa5NKRM]\xf2\x88\xabm\xfbR\xa0\ \xff\x01`\xa8xn[\x9a\x89\x81Q\x8dk!m\xfb\ R\xa0T\x17\xff\x1f\x00<\x00/\x00c\x00e\x00n\ \x00t\x00e\x00r\x00>\x00<\x00/\x00b\x00>\ \x08\x00\x00\x00\x00\x06\x00\x00\x00rThis link h\ as been added be\ fore! \ Are you\ sure you want t\ o add it again?<\ /center>\x07\x00\x00\x00\ \x14mainwindow_src_\ ui_tr\x01\x03\x00\x00\x00\x18\x00<\x00b\x00\ >\x8f\xdec\xa5ep\x00<\x00/\x00b\x00>\x00\ :\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x14\ Connections:\ \x07\x00\x00\x00\x14mainwindow\ _src_ui_tr\x01\x03\x00\x00\x00\x16\ \x00<\x00b\x00>]\xf2N\x0b\x8f}\x00<\x00/\ \x00b\x00>\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x13\ Downloaded: \x07\x00\x00\x00\x14mainwind\ ow_src_ui_tr\x01\x03\x00\x00\ \x00\x1c\x00<\x00b\x00>\x98\x84\x8b\xa1RiOY\ e\xf6\x95\xf4\x00<\x00/\x00b\x00>\xff\x1a\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1cEstim\ ated time left: \x07\x00\x00\x00\x14mainwin\ dow_src_ui_tr\x01\x03\x00\ \x00\x00\x14\x00<\x00b\x00>R\x06rG\x00<\x00\ /\x00b\x00>\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x12Fragments: \x07\x00\x00\x00\x14mainwind\ ow_src_ui_tr\x01\x03\x00\x00\ \x00\x14\x00<\x00b\x00>\x94\xfec\xa5\x00<\x00/\ \x00b\x00>\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d\ Link: \x07\x00\x00\ \x00\x14mainwindow_src\ _ui_tr\x01\x03\x00\x00\x00\x14\x00<\x00b\ \x00>r\xb6`\x01\x00<\x00/\x00b\x00>\xff\x1a\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fSta\ tus: \x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00\x18\x00<\x00b\x00>O \ \x8f\x93\x90\x1f^\xa6\x00<\x00/\x00b\x00>\xff\x1a\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Tra\ nsfer rate: \ \x07\x00\x00\x00\x14mainwindow_\ src_ui_tr\x01\x03\x00\x00\x00\x08N\ \x0b\x8f}[\x8cb\x10\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x11Download Comple\ te\x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ \x08N\x0b\x8f}r\xb6`\x01\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0fDownload Star\ ts\x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ \x0aN\x0b\x8f}]\xf2P\x5ckb\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x10Download St\ opped\x07\x00\x00\x00\x14mainwi\ ndow_src_ui_tr\x01\x03\ \x00\x00\x00\x0a\x95\x19\x8b\xef\x00 \x00-\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x08Error - \ \x07\x00\x00\x00\x14mainwindow_\ src_ui_tr\x01\x03\x00\x00\x00\x0a\x95\ \x19\x8b\xef\x00.\x00.\x00.\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x07Error: \x07\x00\x00\x00\x14m\ ainwindow_src_ui\ _tr\x01\x03\x00\x00\x00\x12kdY\x04RiO\ Yzz\x95\xf4N\x0d\x8d\xb3\xff\x1a\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x19Not enough \ free space in:\x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x00\x0ad\xcdO\ \x5cY1\x8d%0\x02\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1dOperation was n\ ot successful.\x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x00\x10\x8b\xf7~\ \xe7~\xedN\xe5N\x0b|{R+\xff\x1a\x08\x00\x00\ \x00\x00\x06\x00\x00\x00&Please re\ sume the followi\ ng category: \x07\x00\x00\ \x00\x14mainwindow_src\ _ui_tr\x01\x03\x00\x00\x00\x1e\x8b\xf7f\xf4\ e\xb0\x00 \x00P\x00e\x00r\x00s\x00e\x00p\ \x00o\x00l\x00i\x00s0\x02\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x19Please updat\ e Persepolis.\x07\x00\x00\ \x00\x14mainwindow_src\ _ui_tr\x01\x03\x00\x00\x00\x08S\xd1u\x1f\ \x95\x19\x8b\xef\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11an\ error occurred\x07\ \x00\x00\x00\x14mainwindow_s\ rc_ui_tr\x01\x03\x00\x00\x00\x08Y\x0d\ u(\x95\x19\x8b\xef\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0c\ muxing error\x07\x00\x00\x00\ \x14mainwindow_src_\ ui_tr\x01\x03\x00\x00\x00\x06]\xf2N\x0b\x8f\ }\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0b down\ loaded\x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ \x1c\x00<\x00b\x00>\x97\xf3\x98\x91e\x87N\xf6r\ \xb6`\x01\xff\x1a\x00<\x00/\x00b\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x1aAudio \ File Status: \x07\x00\x00\x00\x10mainwindow\ _ui_tr\x01\x03\x00\x00\x00\x1c\x00<\x00b\ \x00>\x97\xf3\x98\x91e\x87N\xf6r\xb6`\x01\xff\x1a\ \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x1aAudio file \ status: \x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00\x1a\x00<\x00b\x00>m\xf7T\ \x08r\xb6`\x01\xff\x1a\x00 \x00<\x00/\x00b\x00\ >\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Mi\ xing status: \x07\x00\x00\x00\x10mainwindow\ _ui_tr\x01\x03\x00\x00\x00\x18\x00<\x00b\ \x00>Y\x0du(r\xb6`\x01\xff\x1a\x00<\x00/\ \x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Muxing status: \ \x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00\x14\x00\ <\x00b\x00>r\xb6`\x01\xff\x1a\x00<\x00/\x00\ b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0f\ Status: \x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00\x1c\x00<\x00b\x00>\x89\xc6\x98\ \x91e\x87N\xf6r\xb6`\x01\xff\x1a\x00<\x00/\x00\ b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1a\ Video File Statu\ s: \x07\x00\x00\x00\x10main\ window_ui_tr\x01\x03\x00\x00\ \x00\x1c\x00<\x00b\x00>\x89\xc6\x98\x91e\x87N\xf6\ r\xb6`\x01\xff\x1a\x00<\x00/\x00b\x00>\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1aVideo\ file status: \x07\x00\x00\x00\x10mainwindo\ w_ui_tr\x01\x03\x00\x00\x00Nkd\x90\ \x09\x98y\x5c\x06\x96;kb|\xfb~\xdf\x8f\xdbQ\ ewaw r\xb6`\x010\x02\x00 Y\x82g\ \x9c`\xa8v\x84u5n\x90{\xa1t\x06Vh\x81\ \xeaR\xa8f\x82P\x5c|\xfb~\xdf\xff\x0c\x8b\xf7b\ S_\x00kd\x90\x09\x98y0\x02\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\xba

This \ option will prev\ ent the system f\ rom going to sle\ ep. I\ t is necessary i\ f your power man\ ager is suspendi\ ng the system au\ tomatically. \x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00\x0ce\xb0^\xfaN\x0b\ \x8f}\x94\xfec\xa5\x08\x00\x00\x00\x00\x06\x00\x00\x00\x15\ Add New Download\ Link\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00\x0a\ N\x0b\x8f}[\x8cb\x10T\x0e\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0eAfter downlo\ ad\x07\x00\x00\x00\x10mainwindo\ w_ui_tr\x01\x03\x00\x00\x00\x04^\x94u\ (\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Apply\ \x07\x00\x00\x00\x10mainwindow_\ ui_tr\x01\x03\x00\x00\x00\x16O\x18QHN\ \x0b\x8f}R\x17\x88h\x00\x0a^\x95\x90\xe8\x8dDn\ \x90\x08\x00\x00\x00\x00\x06\x00\x00\x00\x22Downl\ oad bottom of\x0a t\ he list first\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00\x08~\xd3g_e\xf6\x95\xf4\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x08End Ti\ me\x07\x00\x00\x00\x10mainwindo\ w_ui_tr\x01\x03\x00\x00\x00\x04\x90\x00Q\ \xfa\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04Exit\x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00\x08\x96\x90\x85\xcf\x90\x09\ \x98y\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0cHide\ Options\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00\x0e\x96;kb|\xfb~\xdfwaw \xff\ \x01\x08\x00\x00\x00\x00\x06\x00\x00\x00\x12Keep \ System Awake!\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00\x10g\x00\x5c\x0fS\x16R0\ |\xfb~\xdfbXv\xd8\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x17Minimize to Sy\ stem Tray\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00\x08f\x82P\x5cN\x0b\x8f}\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0ePause Down\ load\x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00 \x00\ P\x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00\ i\x00s\x00 N\x0b\x8f}{\xa1t\x06Vh\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x1bPersepo\ lis Download Man\ ager\x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00\x04\x8f\ \xdb^\xa6\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08Pro\ gress\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00\x04\ \x5c^`'\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aPr\ operties\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00\x08~\xe7~\xedN\x0b\x8f}\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0fResume Down\ load\x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00\x16f\ >y:\x00/\x96\x90\x85\xcf|\xfb~\xdfbXv\ \xd8V\xfeh\x07\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aS\ how/Hide system \ tray icon\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00\x04Qsg:\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x09Shut Down\x07\x00\x00\x00\x10\ mainwindow_ui_tr\ \x01\x03\x00\x00\x00\x08_\x00Y\xcbm\xf7T\x08\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0cStart Mi\ xing\x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00\x08_\ \x00Y\xcbe\xf6\x95\xf4\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0aStart Time\x07\x00\x00\x00\x10\ mainwindow_ui_tr\ \x01\x03\x00\x00\x00\x0e~\xc8kb\x00/S\xd6m\x88\ N\x0b\x8f}\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14St\ op/Cancel Downlo\ ad\x07\x00\x00\x00\x10mainwindo\ w_ui_tr\x01\x03\x00\x00\x00\x0aN\x0b\x8f\ }[\x8cb\x10T\x0e\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0eAfter download\x07\ \x00\x00\x00\x0eprogress_ui_\ tr\x01\x03\x00\x00\x00\x04^\x94u(\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x05Apply\x07\x00\x00\x00\x0e\ progress_ui_tr\x01\x03\ \x00\x00\x00\x08N\x0b\x8f}O\xe1`o\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x14Download I\ nformation\x07\x00\x00\x00\x0ep\ rogress_ui_tr\x01\x03\x00\ \x00\x00\x08N\x0b\x8f}\x90\x09\x98y\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x10Download Op\ tions\x07\x00\x00\x00\x0eprogre\ ss_ui_tr\x01\x03\x00\x00\x00\x08]\xf2\ N\x0b\x8f}\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0b\ Downloaded:\x07\x00\x00\x00\x0e\ progress_ui_tr\x01\x03\ \x00\x00\x00\x0e\x98\x84\x8b\xa1RiOYe\xf6\x95\xf4\ \xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Esti\ mated time left:\ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00\x06\x94\xfec\xa5\xff\x1a\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x06Link: \x07\ \x00\x00\x00\x0eprogress_ui_\ tr\x01\x03\x00\x00\x00\x08\x8f\xdec\xa5ep\xff\x1a\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x17Number\ of connections:\ \x07\x00\x00\x00\x0eprogress_u\ i_tr\x01\x03\x00\x00\x00\x04f\x82P\x5c\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x05Pause\x07\x00\x00\ \x00\x0eprogress_ui_tr\ \x01\x03\x00\x00\x00 \x00P\x00e\x00r\x00s\x00e\ \x00p\x00o\x00l\x00i\x00s\x00 N\x0b\x8f}\ {\xa1t\x06Vh\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1b\ Persepolis Downl\ oad Manager\x07\x00\x00\x00\x0e\ progress_ui_tr\x01\x03\ \x00\x00\x00\x04~\xe7~\xed\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x06Resume\x07\x00\x00\x00\x0epro\ gress_ui_tr\x01\x03\x00\x00\x00\ \x04Qs\x95\xed\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09S\ hut Down\x07\x00\x00\x00\x0epro\ gress_ui_tr\x01\x03\x00\x00\x00\ \x06r\xb6`\x01\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x08Status: \x07\x00\x00\x00\x0epr\ ogress_ui_tr\x01\x03\x00\x00\ \x00\x04~\xc8kb\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04\ Stop\x07\x00\x00\x00\x0eprogres\ s_ui_tr\x01\x03\x00\x00\x00\x0aO \x8f\ \x93\x90\x1f^\xa6\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0fTransfer rate: \ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00T\x00<\x00b\x00>\x00\ <\x00c\x00e\x00n\x00t\x00e\x00r\x00>k\ d_\xebcw\x95.]\xf2\x88\xabS`u(\xff\ \x0c\x8b\xf7O\x7fu(QvN\xd6_\xebcw\x95\ .\xff\x01\x00<\x00/\x00c\x00e\x00n\x00t\x00\ e\x00r\x00>\x00<\x00/\x00b\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00_This shortcut \ has been used be\ fore! \ Use ano\ ther one!\x07\x00\x00\x00\x11setti\ ng_src_ui_tr\x01\x03\x00\x00\ \x00`\x00<\x00h\x00t\x00m\x00l\x00>\x00<\ \x00h\x00e\x00a\x00d\x00/\x00>\x00<\x00b\ \x00o\x00d\x00y\x00>\x00<\x00p\x00>h<\ _\x0f\xff\x1a\x00H\x00H\x00:\x00M\x00M\x00<\ \x00/\x00p\x00>\x00<\x00/\x00b\x00o\x00d\ \x00y\x00>\x00<\x00/\x00h\x00t\x00m\x00l\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x004<\ p>Format HH:MM\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00j\x00<\x00h\x00t\x00m\ \x00l\x00>\x00<\x00h\x00e\x00a\x00d\x00/\ \x00>\x00<\x00b\x00o\x00d\x00y\x00>\x00<\ \x00p\x00>\x8b\xbe\x7fnN\x0b\x8f}Y1\x8d%\ T\x0ev\x84\x91\xcd\x8b\xd5k!ep0\x02\x00<\ \x00/\x00p\x00>\x00<\x00/\x00b\x00o\x00d\ \x00y\x00>\x00<\x00/\x00h\x00t\x00m\x00l\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00Q<\ p>Set number of \ retries if downl\ oad failed.

<\ /body>\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00j\x00<\x00h\x00t\x00m\x00l\x00\ >\x00<\x00h\x00e\x00a\x00d\x00/\x00>\x00\ <\x00b\x00o\x00d\x00y\x00>\x00<\x00p\x00\ >\x8b\xbe\x7fnk\xcfk!\x91\xcd\x8b\xd5\x95\xf4\x95\ \xf4\x96\x94v\x84y\xd2ep0\x02\x00<\x00/\x00\ p\x00>\x00<\x00/\x00b\x00o\x00d\x00y\x00\ >\x00<\x00/\x00h\x00t\x00m\x00l\x00>\x08\ \x00\x00\x00\x00\x06\x00\x00\x00P<\ head/>

S\ et the seconds t\ o wait between r\ etries.

\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ ^\x00<\x00h\x00t\x00m\x00l\x00>\x00<\x00\ h\x00e\x00a\x00d\x00/\x00>\x00<\x00b\x00\ o\x00d\x00y\x00>\x00<\x00p\x00>\x8b\xbe\x7f\ n\x8d\x85e\xf6y\xd2ep0\x02\x00<\x00/\x00\ p\x00>\x00<\x00/\x00b\x00o\x00d\x00y\x00\ >\x00<\x00/\x00h\x00t\x00m\x00l\x00>\x08\ \x00\x00\x00\x00\x06\x00\x00\x00@<\ head/>

S\ et timeout in se\ conds.

\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ v\x00<\x00h\x00t\x00m\x00l\x00>\x00<\x00\ h\x00e\x00a\x00d\x00/\x00>\x00<\x00b\x00\ o\x00d\x00y\x00>\x00<\x00p\x00>\x8b\xe5z\ \x0b^\x8f\x5c\x06\x81\xeaR\xa8h\xc0g\xe5Rj\x8d\ 4g\x7fN-Y\x0dR6v\x84\x94\xfec\xa50\ \x02\x00 \x00<\x00/\x00p\x00>\x00<\x00/\x00\ b\x00o\x00d\x00y\x00>\x00<\x00/\x00h\x00\ t\x00m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ x

The progr\ am will automati\ cally check the \ clipboard for co\ pied links. \

\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ l\x00<\x00h\x00t\x00m\x00l\x00>\x00<\x00\ h\x00e\x00a\x00d\x00/\x00>\x00<\x00b\x00\ o\x00d\x00y\x00>\x00<\x00p\x00>kdr\ y`'S\xef\x80\xfdN\x0de/c\x01_SR\ Md\xcdO\x5c|\xfb~\xdf\x00<\x00/\x00p\x00\ >\x00<\x00/\x00b\x00o\x00d\x00y\x00>\x00\ <\x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00[

Thi\ s feature may no\ t work in your o\ perating system.\

\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x8a\x00<\x00h\x00t\ \x00m\x00l\x00>\x00<\x00h\x00e\x00a\x00d\ \x00/\x00>\x00<\x00b\x00o\x00d\x00y\x00>\ \x00<\x00p\x00>kd\x90\x09\x98yS\xef\x90\x7f\ QM\x00 \x00S\x00S\x00L\x00/\x00T\x00L\ \x00S\x00 c\xe1bKY1\x8d%0\x02O\x7f\ u(e\xf6\x97\x00\x81\xeab\xc5\x98\xce\x96i\xff\x01\ \x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00o\ \x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\ \x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00r

This option \ avoids SSL/TLS h\ andshake failure\ . But use it at \ your own risk!\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\xa4\x00<\x00h\x00t\x00m\ \x00l\x00>\x00<\x00h\x00e\x00a\x00d\x00/\ \x00>\x00<\x00b\x00o\x00d\x00y\x00>\x00<\ \x00p\x00>kd\x90\x09\x98y\x5c\x06\x96;kb\ |\xfb~\xdf\x8f\xdbQewaw r\xb6`\x01\ 0\x02Y\x82g\x9c`\xa8v\x84u5n\x90{\xa1\ t\x06\x8b\xbe\x7fnO\x1a\x81\xeaR\xa8c\x02\x8dw\ |\xfb~\xdf\xff\x0cR\x19kd\x8b\xbe\x7fnf/\ _\xc5\x97\x00v\x840\x02\x00<\x00/\x00p\x00>\ \x00<\x00/\x00b\x00o\x00d\x00y\x00>\x00<\ \x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\xba

This\ option will pre\ vent the system \ from going to sl\ eep. \ It is necessary \ if your power ma\ nager is suspend\ ing the system a\ utomatically. \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00l\x00<\x00h\x00t\x00m\ \x00l\x00>\x00<\x00h\x00e\x00a\x00d\x00/\ \x00>\x00<\x00b\x00o\x00d\x00y\x00>\x00<\ \x00p\x00>O\x7fu(Y\x1a~\xbfz\x0bS\xef\ N\xe5c\xd0SGN\x0b\x8f}\x90\x1f^\xa60\x02\ \x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00o\ \x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\ \x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00c

Using multip\ le connections c\ an help speed up\ your download.<\ /p>\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x8e\x00<\x00h\x00t\x00\ m\x00l\x00>\x00<\x00h\x00e\x00a\x00d\x00\ /\x00>\x00<\x00b\x00o\x00d\x00y\x00>\x00\ <\x00p\x00>_SN\xcemO\x89\xc8Vhb\ i\x5cUS\xd1\x90\x01N\x0b\x8f}\x8b\xf7lBe\ \xf6\xff\x0cN\x0b\x8f}\x5c\x06_\x00Y\xcb\x80\x0cN\ \x0df>y:m\xfbR\xa0\x94\xfec\xa5z\x97S\ \xe30\x02\x00<\x00/\x00p\x00>\x00<\x00/\x00\ b\x00o\x00d\x00y\x00>\x00<\x00/\x00h\x00\ t\x00m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \xac

When a do\ wnload request i\ s sent from the \ browser extensio\ n, the download \ will start witho\ ut showing the A\ dd Link window. \

<\ /body>\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x04S\xd6m\x88\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x06Cancel\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ \x04f\xf4e9\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06C\ hange\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00 h\xc0g\ \xe5|\xfb~\xdfRj\x8d4g\x7fN-f/T\ &g\x09Y\x0dR6v\x84\x94\xfec\xa5\x08\x00\x00\ \x00\x00\x06\x00\x00\x00'Check sys\ tem clipboard fo\ r copied links\x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00\x10WWY'\x5c\x0f\xff\x08\x00K\ \x00B\xff\x09\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11\ Chunk size(KiB):\ \x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x0a\x91M\x82re\xb9h\ H\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0eCol\ or scheme: \x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x08\x81\xea[\x9aNIR\x17\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x15Columns Cus\ tomization\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00*W(\x9e\xd8\x8b\xa4N\x0b\x8f}e\x87N\xf6\ Y9N-R\x1b^\xfa\x97\xf3NP0\x01\x89\xc6\ \x98\x91{I[Pe\x87N\xf6Y9\x08\x00\x00\x00\ \x00\x06\x00\x00\x00BCreate sub\ folders for Musi\ c,Videos, ... in\ default downloa\ d folder\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00\x04\ \x9e\xd8\x8b\xa4\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08De\ faults\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x16N\x0d\ \x89\x81O\x7fu(\x8b\xc1Nfge\x9a\x8c\x8b\xc1\ \x82\x82p\xb9\x08\x00\x00\x00\x00\x06\x00\x00\x00)Do\ n't use certific\ ate to verify th\ e peers\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x08N\ \x0b\x8f}\x90\x09\x98y\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x10Download Option\ s\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x0cN\x0b\x8f}e\x87N\ \xf6Y9\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11D\ ownload folder: \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x22ge\x81\xeamO\x89\xc8\ Vhv\x84N\x0b\x8f}\x8b\xf7lB\x5c\x06\x88\xab\ z\xcbSsbg\x88L0\x02\x08\x00\x00\x00\x00\x06\ \x00\x00\x00@Download req\ uests from the b\ rowser will be e\ xecuted immediat\ ely.\x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\x0cbS_\x00\ \x90\x1aw\xe5\x97\xf3eH\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x1aEnable Notific\ ation Sounds\x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x10T/u(|\xfb~\xdfbXv\xd8\ V\xfeh\x07\x08\x00\x00\x00\x00\x06\x00\x00\x00\x17En\ able system tray\ icon\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x06[WO\ S\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Fon\ t: \x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00\x18p\xb9Q\xfbQ\ s\x95\xedc\x09\x94\xaee\xf6\x96\x90\x85\xcfN;z\ \x97S\xe3\x08\x00\x00\x00\x00\x06\x00\x00\x00)Hid\ e main window if\ close button cl\ icked.\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x06V\xfe\ h\x07\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07Ic\ ons: \x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00D\x8f\xd9f\ /\x00 \x00p\x00y\x00t\x00h\x00o\x00n\x00\ \x00r\x00e\x00q\x00u\x00e\x00s\x00t\x00\ ^\x93v\x84WWY'\x5c\x0f0\x02\x82\xe5N\ \x0dq\x9f`\x89\x8b\xf7N\x0d\x89\x81f\xf4e90\ \x02\x08\x00\x00\x00\x00\x06\x00\x00\x00]It is\ python requests\ library chunk s\ ize. Do not chan\ ge this If you a\ re not familiar \ with it.\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00\x0e\ \x962kb|\xfb~\xdfO\x11w \xff\x01\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x12Keep sys\ tem awake!\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x06\x8b\xed\x8a\x00\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0aLanguage: \x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x0a\x90\x1aw\xe5|{W\x8b\xff\x1a\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x13Notifica\ tion type: \x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x04\x90\x1aw\xe5\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0dNotifications\x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00\x08\x8f\xdec\xa5ep\xff\x1a\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x17Number o\ f connections: \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00\x0a\x5c\x1d\x8b\xd5k!ep\xff\ \x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Numbe\ r of tries: \x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x04xn[\x9a\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x02OK\x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\x06\x99\x96\x90\x09\ \x98y\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0bPref\ erences\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x12c\ \x09N\x0be\xb0v\x84_\xebcw\x95.~\xc4T\ \x08\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0ePress\ new keys\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ \x22_\x00g:\x81\xeaR\xa8\x8f\xd0\x88L\x00 \x00\ P\x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00\ i\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x19Run\ Persepolis at s\ tartup\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x06S\xe6\ [XN:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07Sa\ ve As\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x06_\xebc\ w\x95.\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09Sho\ rtcuts\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x1cN\x0b\ \x8f}[\x8cb\x10T\x0ef>y:N\x0b\x8f}\ [\x8cb\x10[\xf9\x8b\xddhF\x08\x00\x00\x00\x00\x06\ \x00\x00\x007Show downloa\ d complete dialo\ g when download \ is finished\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x10f>y:N\x0b\x8f}\x8f\xdb^\xa6z\ \x97S\xe3\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1dSho\ w download progr\ ess window\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x0af>y:\x83\xdcSUh\x0f\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0cShow menub\ ar\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x0af>y:O\xa7\ \x8f\xb9h\x0f\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fSh\ ow side panel\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x06Y'\x5c\x0f\xff\x1a\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x06Size: \x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x04r\xb6`\x01\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x06Status\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x06\x98\ \xceh<\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07S\ tyle: \x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x0e\x8d\x85\ e\xf6\x00 \x00(y\xd2\x00)\xff\x1a\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x13Timeout (s\ econds): \x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ \x10]\xe5Qwh\x0fV\xfeh\x07\x5c:[\xf8\xff\ \x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Toolb\ ar icons size: \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00\x0c\x89\xc6\x98\x91U\xc5c\xa2\x90\ \x09\x98y\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Vid\ eo Finder Option\ s\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x06\x97\xf3\x91\xcf\xff\x1a\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x08Volume:\ \x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x12\x91\xcd\x8b\xd5\x95\xf4\x96\ \x94\x00 \x00(y\xd2\x00)\xff\x1a\x08\x00\x00\x00\x00\ \x06\x00\x00\x00'Wait period\ between retries\ (seconds): \x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x0ef\xf4e9N\x0b\x8f}e\x87N\xf6\ Y9\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Chan\ ge Download Fold\ er\x07\x00\x00\x00\x0atext_ui_t\ r\x01\x03\x00\x00\x00\x0cN\x0b\x8f}e\x87N\xf6Y\ 9\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Dow\ nload folder: \x07\x00\ \x00\x00\x0atext_ui_tr\x01\x03\x00\ \x00\x00\x0aN\x0b\x8f}[\xc6x\x01\xff\x1a\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x13Download \ password: \x07\x00\x00\x00\x0at\ ext_ui_tr\x01\x03\x00\x00\x00\x10N\ \x0b\x8f}u(b7T\x0dT\x8c[\xc6x\x01\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x1eDownloa\ d username and p\ assword\x07\x00\x00\x00\x0atext\ _ui_tr\x01\x03\x00\x00\x00\x0cN\x0b\x8f}\ u(b7T\x0d\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x13Download usern\ ame: \x07\x00\x00\x00\x0atext_u\ i_tr\x01\x03\x00\x00\x00\x06\x00I\x00P\xff\x1a\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x03IP:\x07\x00\x00\ \x00\x0atext_ui_tr\x01\x03\x00\x00\ \x00\x08\x8f\xdec\xa5ep\xff\x1a\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x16Number of co\ nnections:\x07\x00\x00\x00\x0at\ ext_ui_tr\x01\x03\x00\x00\x00 \x00\ P\x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00\ i\x00s\x00 N\x0b\x8f}{\xa1t\x06Vh\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x1bPersepo\ lis Download Man\ ager\x07\x00\x00\x00\x0atext_ui\ _tr\x01\x03\x00\x00\x00\x06z\xefS\xe3\xff\x1a\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x05Port:\x07\x00\ \x00\x00\x0atext_ui_tr\x01\x03\x00\ \x00\x00\x0aN\xe3t\x06[\xc6x\x01\xff\x1a\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x10Proxy pas\ sword: \x07\x00\x00\x00\x0atext\ _ui_tr\x01\x03\x00\x00\x00\x0cN\xe3t\x06\ u(b7T\x0d\xff\x1a\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x10Proxy username\ : \x07\x00\x00\x00\x0atext_ui_t\ r\x01\x03\x00\x00\x00\x1c\x00<\x00b\x00>\x97\xf3\x98\ \x91e\x87N\xf6r\xb6`\x01\xff\x1a\x00<\x00/\x00\ b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1a\ Audio file statu\ s: \x07\x00\x00\x00\x1bvide\ o_finder_progres\ s_ui_tr\x01\x03\x00\x00\x00\x18\x00<\x00\ b\x00>m\xf7T\x08r\xb6`\x01\xff\x1a\x00<\x00\ /\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16<\ b>Mixing status:\
\x07\x00\x00\x00\x1bvideo_\ finder_progress_\ ui_tr\x01\x03\x00\x00\x00\x18\x00<\x00b\x00\ >Y\x0du(r\xb6`\x01\xff\x1a\x00<\x00/\x00\ b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16\ Muxing status: <\ /b>\x07\x00\x00\x00\x1bvideo_fi\ nder_progress_ui\ _tr\x01\x03\x00\x00\x00\x1c\x00<\x00b\x00>\x89\ \xc6\x98\x91e\x87N\xf6r\xb6`\x01\xff\x1a\x00<\x00\ /\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1a<\ b>Video file sta\ tus: \x07\x00\x00\x00\x1bvi\ deo_finder_progr\ ess_ui_tr\x01\ \x00\x00A|\ <\ \xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\xa7\ \x00\x00\x00\x02ruB\x00\x00\x04\xb0\x00\x00\x05;\x00\ \x00\x07R\x00\x00\x05;\x00\x00\x0e\xe9\x00\x00\x05;\x00\ \x004\xe7\x00\x00N:\x00\x009\xd2\x00\x04\xcf\x04\x00\ \x00!\xcb\x00\x04\xd9\x90\x00\x00\x0dt\x00\x04\xe3\xc0\x00\ \x00\x0d\xd3\x00\x050K\x00\x00\x0e\x01\x00\x05\xab`\x00\ \x00)D\x002v\xee\x00\x0016\x00Hw9\x00\ \x00 \xb5\x00Hw9\x00\x00%\xc6\x00M\x99S\x00\ \x00\x0d\xa2\x00R\xd9$\x00\x00\x1d\x0e\x00V\x8c\x95\x00\ \x00'\xe8\x00Wiz\x00\x00\x0f\x11\x00Wiz\x00\ \x00:\xd1\x00W\x96\xf9\x00\x00\x0fB\x00\x97\xa2\x10\x00\ \x00\x08\x9b\x00\xb7\xbb\x02\x00\x00\x0b;\x00\xc2\xad\xd0\x00\ \x00\x17\x02\x01\x18\xab\xd4\x00\x00 \xed\x01\x8bp\x0e\x00\ \x00,\xc0\x02S\xd0\x00\x00\x00\x11\xb4\x02\x95c\x03\x00\ \x00!\xfe\x02\x9a\xf5p\x00\x00\x17b\x02\xf1\x09\xf0\x00\ \x00\x17\xd7\x02\xf9\xc5\xc5\x00\x00\x07\x1b\x03\x0d1^\x00\ \x00\x13s\x03\x1c\xc5*\x00\x00&\xb2\x03<\x83\x03\x00\ \x00\x0e3\x03KF\xe3\x00\x00&[\x03KF\xe3\x00\ \x000p\x03\x92\xd2\xce\x00\x001\xe1\x03\x9a[4\x00\ \x00\x0c=\x03\xdc\xdc%\x00\x00\x14\xe3\x04]I3\x00\ \x005T\x04e\xac\xf5\x00\x00!\x80\x04f\xd7n\x00\ \x00\x01\xa1\x04g\xac\xf5\x00\x00\x0d,\x04\x98I\xbc\x00\ \x00\x09T\x04\x98I\xbc\x00\x00/^\x04\x9e\x84\xd5\x00\ \x00/\x96\x04\xcbXj\x00\x00\x0e\x83\x04\xcbXj\x00\ \x009\xfc\x04\xcb\xfd\x9e\x00\x00\x00\x00\x04\xd6W\xc0\x00\ \x001\xad\x05\x13\xccT\x00\x00\x1d\xd1\x050N\xc0\x00\ \x00'I\x05O\xa2\x10\x00\x00\x0c\xc3\x05_. \x00\ \x00\x1b\xe5\x05_\xa8`\x00\x00\x18\x88\x05i<\xfe\x00\ \x00\x1f\x13\x05t\x96\x00\x00\x00\x0fu\x05v\x1b\x9e\x00\ \x00\x15:\x05\x83\x80e\x00\x00\x10\x81\x05\x8c\xac5\x00\ \x00(\x90\x05\xa1\x08\xc0\x00\x007C\x05\xa3\x9c>\x00\ \x00\x1e\x8c\x05\xa3\x9c>\x00\x00;\x83\x05\xa8X\xf3\x00\ \x00\x06H\x05\xaa\x8b\xc3\x00\x007y\x05\xc63\xee\x00\ \x00\x00\xcf\x06-B\x0e\x00\x00\x1e\x13\x06-B\x0e\x00\ \x00:\xff\x069\x82N\x00\x00\x1fk\x069\x82N\x00\ \x00<\x15\x06<=\x10\x00\x009)\x06]1\xde\x00\ \x00\x04r\x06\x9aK\x00\x00\x00\x11\xf5\x06\x9a\xf5C\x00\ \x0067\x06\x9c(\x01\x00\x002\xcb\x06\xb6\xbe`\x00\ \x00\x09\xfa\x06\xc5)*\x00\x00&\xf2\x06\xcc\xd6\xa3\x00\ \x00#S\x06\xdcS\xa3\x00\x00\x0aV\x06\xef\xbcp\x00\ \x00\x0b\xe8\x07\x14*\x1e\x00\x00#\xee\x07\x1d\xe0`\x00\ \x008C\x076\xcf`\x00\x00\x0a\xe0\x07[&u\x00\ \x00\x19Q\x07\x9b]0\x00\x004\x8e\x07\x9c1\x03\x00\ \x008\xc7\x08 Hn\x00\x00\x05y\x08g-\xa2\x00\ \x00\x13\xfe\x08\x95 \xa3\x00\x00\x06\x90\x08\xf6\x88`\x00\ \x00\x0f\xc5\x09>\x0d$\x00\x00%\x0a\x09^\x89\xd3\x00\ \x00#\x16\x09`\x06\xb5\x00\x00$\xc3\x09b\x06\xb5\x00\ \x00\x10\xb5\x09g\x01\xd0\x00\x007\xe2\x09}R\xc0\x00\ \x00\x0b\x89\x09\x93\xd2\xfe\x00\x00%\xfc\x09\x96F0\x00\ \x00\x1aj\x0a\x0c\x87\x0e\x00\x00+\x10\x0aErt\x00\ \x006\x82\x0a_\xd7\x0e\x00\x00\x12C\x0a_\xf3\xfb\x00\ \x00\x1f\xe4\x0as>\xc3\x00\x00\x07\xeb\x0a\x8b\xc3`\x00\ \x00)\x0b\x0a\x97\x00\x80\x00\x00\x11\x5c\x0a\xa2Yp\x00\ \x005\xae\x0a\xc0(\x90\x00\x007\xad\x0b`r`\x00\ \x003\x8f\x0bn\xb1\xee\x00\x00.\x03\x0bv\x04\xf0\x00\ \x00\x16\x9f\x0b\x89w\x94\x00\x00 f\x0b\x89w\x94\x00\ \x00%{\x0b\xc8\xc7\x13\x00\x000\x1c\x0b\xef\xd8N\x00\ \x00\x1c\x8c\x0b\xf9\x95\xb3\x00\x00\x19\xaf\x0c(\x19\x04\x00\ \x00#\x92\x0c2\xc0S\x00\x00\x06\xd9\x0cP\xdb[\x00\ \x00\x08,\x0ce\x0f.\x00\x00$\x83\x0ce\x0f.\x00\ \x00(\xcd\x0c\x96q\xc0\x00\x00\x12\xba\x0c\x96q\xc0\x00\ \x00\x184\x0c\x99e\x80\x00\x00\x1a\xab\x0c\xb5\x86\x80\x00\ \x00'\x82\x0c\xb5\x86\x80\x00\x004)\x0c\xdd\xc2\x03\x00\ \x005\x0f\x0c\xe0\x1a\xf3\x00\x003\xe4\x0c\xfb\xe0\x8a\x00\ \x00\x1a\xe9\x0d\x1f.H\x00\x00\x10'\x0d\x1f\x9f\xd3\x00\ \x000\xc6\x0dq\x98\xde\x00\x00\x02p\x0d\x99\xf9B\x00\ \x00\x07x\x0d\x99\xf9B\x00\x00\x14g\x0d\x99\xf9B\x00\ \x00\x22\x9e\x0d\x99\xf9B\x00\x00(\x1a\x0d\x99\xf9B\x00\ \x00:_\x0e i\x22\x00\x00\x1dh\x0e.d\xa4\x00\ \x00\x22O\x0e7I\xc3\x00\x00\x08\xf8\x0ex\xa8B\x00\ \x00\x09\x8c\x0ex\xa8B\x00\x009g\x0e\xb2\xf0\x80\x00\ \x003W\x0e\xc4J\xf0\x00\x00\x10\xf9\x0e\xda\xd4\xfe\x00\ \x00)\xd5\x0f6\xb6\x90\x00\x00\x18\xde\x0f}\x11p\x00\ \x00\x13\x0e\x0f\xa6V\x80\x00\x002\x94\x0f\xa7\xb6\x04\x00\ \x00\x1a\x09\x0f\xac[\xee\x00\x00\x1bk\x0f\xd1?\x00\x00\ \x00)\x7f\x0f\xd6\xe5\xde\x00\x00+\xce\x0f\xde{\xf0\x00\ \x00/\xce\x0f\xf3\x03\x0e\x00\x00\x03ki\x00\x00<\x99\ \x03\x00\x00\x00t\x00<\x00a\x00 \x00h\x00r\x00\ e\x00f\x00=\x00h\x00t\x00t\x00p\x00s\x00\ :\x00/\x00/\x00g\x00i\x00t\x00h\x00u\x00\ b\x00.\x00c\x00o\x00m\x00/\x00f\x00f\x00\ m\x00p\x00e\x00g\x00/\x00f\x00f\x00m\x00\ p\x00e\x00g\x00>\x04\x1f\x04@\x04>\x045\x04\ :\x04B\x00 \x00F\x00F\x00m\x00p\x00e\x00\ g\x00<\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00;FFmp\ eg project\x07\x00\ \x00\x00\x0babout_ui_tr\x01\x03\ \x00\x00\x00v\x00<\x00a\x00 \x00h\x00r\x00e\ \x00f\x00=\x00h\x00t\x00t\x00p\x00s\x00:\ \x00/\x00/\x00g\x00i\x00t\x00h\x00u\x00b\ \x00.\x00c\x00o\x00m\x00/\x00p\x00s\x00f\ \x00/\x00r\x00e\x00q\x00u\x00e\x00s\x00t\ \x00s\x00>\x04\x17\x040\x04?\x04@\x04>\x04A\ \x04K\x00 \x04?\x04@\x04>\x045\x04:\x04B\ \x040\x00<\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\ \x00\x00\x00<Requ\ ests project\ \x07\x00\x00\x00\x0babout_ui_tr\ \x01\x03\x00\x00\x00t\x00<\x00a\x00 \x00h\x00r\ \x00e\x00f\x00=\x00h\x00t\x00t\x00p\x00s\ \x00:\x00/\x00/\x00g\x00i\x00t\x00h\x00u\ \x00b\x00.\x00c\x00o\x00m\x00/\x00y\x00t\ \x00-\x00d\x00l\x00p\x00/\x00y\x00t\x00-\ \x00d\x00l\x00p\x00>\x04\x1f\x04@\x04>\x045\ \x04:\x04B\x00 \x00Y\x00T\x00-\x00D\x00L\ \x00P\x00<\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\ \x00\x00\x00;YT-\ DLP project\x07\ \x00\x00\x00\x0babout_ui_tr\x01\ \x03\x00\x00\x00\x92\x00<\x00a\x00 \x00h\x00r\x00\ e\x00f\x00=\x00h\x00t\x00t\x00p\x00s\x00\ :\x00/\x00/\x00p\x00e\x00r\x00s\x00e\x00\ p\x00o\x00l\x00i\x00s\x00d\x00m\x00.\x00\ g\x00i\x00t\x00h\x00u\x00b\x00.\x00i\x00\ o\x00>\x00h\x00t\x00t\x00p\x00s\x00:\x00\ /\x00/\x00p\x00e\x00r\x00s\x00e\x00p\x00\ o\x00l\x00i\x00s\x00d\x00m\x00.\x00g\x00\ i\x00t\x00h\x00u\x00b\x00.\x00i\x00o\x00\ <\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ Ihttps://\ persepolisdm.git\ hub.io\x07\x00\x00\x00\x0ba\ bout_ui_tr\x01\x03\x00\x00\x00\x9a\ \x00<\x00a\x00 \x00h\x00r\x00e\x00f\x00=\ \x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\ \x00t\x00e\x00l\x00e\x00g\x00r\x00a\x00m\ \x00.\x00m\x00e\x00/\x00p\x00e\x00r\x00s\ \x00e\x00p\x00o\x00l\x00i\x00s\x00d\x00m\ \x00>\x00h\x00t\x00t\x00p\x00s\x00:\x00/\ \x00/\x00t\x00e\x00l\x00e\x00g\x00r\x00a\ \x00m\x00.\x00m\x00e\x00/\x00p\x00e\x00r\ \x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00d\ \x00m\x00<\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\ \x00\x00\x00Mhtt\ ps://telegram.me\ /persepolisdm\x07\x00\x00\x00\x0babout_ui_t\ r\x01\x03\x00\x00\x00\x9a\x00<\x00a\x00 \x00h\x00\ r\x00e\x00f\x00=\x00h\x00t\x00t\x00p\x00\ s\x00:\x00/\x00/\x00t\x00w\x00i\x00t\x00\ t\x00e\x00r\x00.\x00c\x00o\x00m\x00/\x00\ p\x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00\ i\x00s\x00d\x00m\x00>\x00h\x00t\x00t\x00\ p\x00s\x00:\x00/\x00/\x00t\x00w\x00i\x00\ t\x00t\x00e\x00r\x00.\x00c\x00o\x00m\x00\ /\x00p\x00e\x00r\x00s\x00e\x00p\x00o\x00\ l\x00i\x00s\x00d\x00m\x00<\x00/\x00a\x00\ >\x08\x00\x00\x00\x00\x06\x00\x00\x00Mhttps://twit\ ter.com/persepol\ isdm\x07\x00\x00\x00\x0babo\ ut_ui_tr\x01\x03\x00\x00\x00t\x00<\ \x00a\x00 \x00h\x00r\x00e\x00f\x00=\x00h\ \x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00w\ \x00i\x00k\x00i\x00.\x00q\x00t\x00.\x00i\ \x00o\x00/\x00Q\x00t\x00_\x00f\x00o\x00r\ \x00_\x00P\x00y\x00t\x00h\x00o\x00n\x00>\ \x04\x1f\x04@\x04>\x045\x04:\x04B\x00 \x00P\ \x00y\x00s\x00i\x00d\x00e\x00<\x00/\x00a\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00;Pyside proj\ ect\x07\x00\x00\x00\x0babou\ t_ui_tr\x01\x03\x00\x00\x00\x18\x04\x1e\x00\ \x00P\x00e\x00r\x00s\x00e\x00p\x00o\x00\ l\x00i\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10A\ bout Persepolis\x07\ \x00\x00\x00\x0babout_ui_tr\x01\ \x03\x00\x00\x00\x1a\x04\x11\x04;\x040\x043\x04>\x04\ 4\x040\x04@\x04=\x04>\x04A\x04B\x048\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0fAcknowl\ edgments\x07\x00\x00\x00\x0babo\ ut_ui_tr\x01\x03\x00\x00\x00\x18\x04 \ \x040\x047\x04@\x040\x041\x04>\x04B\x04G\ \x048\x04:\x048\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0a\ Developers\x07\x00\x00\x00\x0ba\ bout_ui_tr\x01\x03\x00\x00\x00\x10\ \x04\x1b\x048\x04F\x045\x04=\x047\x048\x04O\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x07Licens\ e\x07\x00\x00\x00\x0babout_ui_t\ r\x01\x03\x00\x00\x00\x04\x00O\x00K\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x02OK\x07\x00\x00\x00\x0babou\ t_ui_tr\x01\x03\x00\x00\x008\x04\x1c\x04\ 5\x04=\x045\x044\x046\x045\x04@\x00 \x04\ 7\x040\x043\x04@\x04C\x047\x04>\x04:\x00\ \x00P\x00e\x00r\x00s\x00e\x00p\x00o\x00\ l\x00i\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bP\ ersepolis Downlo\ ad Manager\x07\x00\x00\x00\x0ba\ bout_ui_tr\x01\x03\x00\x00\x00\x16\ \x04\x1f\x045\x04@\x045\x042\x04>\x044\x04G\ \x048\x04:\x048\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0b\ Translators\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ <\x04\x14\x04>\x041\x040\x042\x048\x04B\x04\ L\x00 \x04A\x04A\x04K\x04;\x04:\x04C\x00\ \x044\x04;\x04O\x00 \x04A\x04:\x040\x04\ G\x048\x042\x040\x04=\x048\x04O\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x11Add Downl\ oad Link\x07\x00\x00\x00\x0dadd\ link_ui_tr\x01\x03\x00\x00\x00*\ \x04\x14\x04>\x041\x040\x042\x048\x04B\x04L\ \x00 \x042\x00 \x04:\x040\x04B\x045\x043\ \x04>\x04@\x048\x04N\x00:\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x11Add to categ\ ory: \x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x00*\x04 \x04\ 0\x04A\x04H\x048\x04@\x045\x04=\x04=\x04\ K\x045\x00 \x04?\x040\x04@\x040\x04<\x04\ 5\x04B\x04@\x04K\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x10Advanced Option\ s\x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00\x10\x04\x1e\x04B\x04<\x04\ 5\x04=\x048\x04B\x04L\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x06Cancel\x07\x00\x00\x00\x0dad\ dlink_ui_tr\x01\x03\x00\x00\x00\ 6\x04\x18\x047\x04<\x045\x04=\x048\x04B\x04\ L\x00 \x04?\x040\x04?\x04:\x04C\x00 \x04\ 4\x04;\x04O\x00 \x047\x040\x043\x04@\x04\ C\x047\x04:\x048\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x16Change Download\ Folder\x07\x00\x00\x00\x0daddl\ ink_ui_tr\x01\x03\x00\x00\x00(\x04\ \x18\x047\x04<\x045\x04=\x048\x04B\x04L\x00\ \x048\x04<\x04O\x00 \x04D\x040\x049\x04\ ;\x040\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x12Change file nam\ e: \x07\x00\x00\x00\x0daddlink_\ ui_tr\x01\x03\x00\x00\x00L\x04\x1e\x04?\x04\ @\x045\x044\x045\x04;\x048\x04B\x04L\x00\ \x04=\x040\x04A\x04B\x04@\x04>\x049\x04\ :\x048\x00 \x04A\x048\x04A\x04B\x045\x04\ <\x04=\x04>\x043\x04>\x00 \x04?\x04@\x04\ >\x04:\x04A\x048\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1cDetect System P\ roxy Settings\x07\x00\x00\ \x00\x0daddlink_ui_tr\x01\ \x03\x00\x00\x00(\x04\x1f\x040\x04?\x04:\x040\x00\ \x044\x04;\x04O\x00 \x047\x040\x043\x04\ @\x04C\x047\x04:\x048\x00:\x00 \x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x11Download \ Folder: \x07\x00\x00\x00\x0dadd\ link_ui_tr\x01\x03\x00\x00\x00\x1e\ \x04\x17\x040\x043\x04@\x04C\x047\x048\x04B\ \x04L\x00 \x04?\x04>\x047\x046\x045\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0eDownload\ Later\x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x00.\x04!\ \x04A\x04K\x04;\x04:\x040\x00 \x044\x04;\ \x04O\x00 \x04A\x04:\x040\x04G\x048\x042\ \x040\x04=\x048\x04O\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0fDownload l\ ink: \x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x00 \x04\x17\x04\ 0\x043\x04@\x04C\x047\x048\x04B\x04L\x00\ \x04?\x040\x04@\x04>\x04;\x04L\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x13Download \ password: \x07\x00\x00\x00\x0da\ ddlink_ui_tr\x01\x03\x00\x00\ \x00F\x04\x17\x040\x043\x04@\x04C\x047\x048\ \x04B\x04L\x00 \x048\x04<\x04O\x00 \x04?\ \x04>\x04;\x04L\x047\x04>\x042\x040\x04B\ \x045\x04;\x04O\x00 \x048\x00 \x04?\x040\ \x04@\x04>\x04;\x04L\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x1eDownload usern\ ame and password\ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x004\x04\x17\x040\x043\x04@\ \x04C\x047\x048\x04B\x04L\x00 \x048\x04<\ \x04O\x00 \x04?\x04>\x04;\x04L\x047\x04>\ \x042\x040\x04B\x045\x04;\x04O\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x13Download u\ sername: \x07\x00\x00\x00\x0dad\ dlink_ui_tr\x01\x03\x00\x00\x00\ \x1e\x04\x12\x04@\x045\x04<\x04O\x00 \x04>\x04\ :\x04>\x04=\x04G\x040\x04=\x048\x04O\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x08End tim\ e\x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00\x08\x00H\x00T\x00T\x00\ P\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04HTTP\x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x00\x0a\x00H\x00T\x00T\x00P\x00\ S\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05HTTPS\ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x00\x08\x00I\x00P\x00:\x00 \ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x04IP: \x07\x00\ \x00\x00\x0daddlink_ui_tr\ \x01\x03\x00\x00\x00\x0c\x04!\x04A\x04K\x04;\x04:\ \x040\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04Link\ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x00\x22\x04\x11\x04>\x04;\x04L\ \x04H\x045\x00 \x04?\x040\x04@\x040\x04<\ \x045\x04B\x04@\x04>\x042\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0cMore Options\ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x00.\x04\x1a\x04>\x04;\x048\ \x04G\x045\x04A\x04B\x042\x04>\x00 \x04?\ \x04>\x044\x04:\x04;\x04N\x04G\x045\x04=\ \x048\x049\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16\ Number of connec\ tions:\x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x00\x04\x00O\ \x00K\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\x07\x00\ \x00\x00\x0daddlink_ui_tr\ \x01\x03\x00\x00\x00\x0a\x04\x1f\x04>\x04@\x04B\x00:\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Port:\x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x00\x0c\x04\x1f\x04@\x04>\x04:\x04\ A\x048\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Pro\ xy\x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00\x1e\x04\x1f\x040\x04@\ \x04>\x04;\x04L\x00 \x04?\x04@\x04>\x04:\ \x04A\x048\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x10Proxy password\ : \x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x000\x04\x18\x04<\x04O\ \x00 \x04?\x04>\x04;\x04L\x047\x04>\x042\ \x040\x04B\x045\x04;\x04O\x00 \x04?\x04@\ \x04>\x04:\x04A\x048\x00:\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x10Proxy userna\ me: \x07\x00\x00\x00\x0daddlink\ _ui_tr\x01\x03\x00\x00\x00&\x04\x17\x040\ \x04?\x04>\x04<\x04=\x048\x04B\x04L\x00 \ \x04M\x04B\x04>\x04B\x00 \x04?\x04C\x04B\ \x04L\x08\x00\x00\x00\x00\x06\x00\x00\x00\x12Reme\ mber this path\x07\x00\ \x00\x00\x0daddlink_ui_tr\ \x01\x03\x00\x00\x00\x0c\x00S\x00O\x00C\x00K\x00S\ \x005\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06SOCK\ S5\x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00\x18\x04\x12\x04@\x045\ \x04<\x04O\x00 \x04=\x040\x04G\x040\x04;\ \x040\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aStar\ t time\x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x00$\x00<\ \x00b\x00>\x04\x18\x04<\x04O\x00 \x04D\x040\ \x049\x04;\x040\x00<\x00/\x00b\x00>\x00:\ \x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x12F\ ile name: \x07\x00\ \x00\x00\x18after_downloa\ d_src_ui_tr\x01\x03\x00\x00\x00\ \x1e\x00<\x00b\x00>\x04 \x040\x047\x04<\x04\ 5\x04@\x00<\x00/\x00b\x00>\x00:\x00 \x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0dSize\ : \x07\x00\x00\x00\x18after\ _download_src_ui\ _tr\x01\x03\x00\x00\x00\x10\x00 \x00 \x00 \x00\ O\x00K\x00 \x00 \x00 \x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x08 OK \x07\x00\x00\x00\x14\ after_download_u\ i_tr\x01\x03\x00\x00\x00\x18\x04\x1e\x04B\x04:\ \x04@\x04K\x04B\x04L\x00 \x04D\x040\x049\ \x04;\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d Op\ en File \x07\x00\x00\x00\x14af\ ter_download_ui_\ tr\x01\x03\x00\x00\x004\x00<\x00b\x00>\x04\x17\ \x040\x043\x04@\x04C\x047\x04:\x040\x00 \ \x047\x040\x042\x045\x04@\x04H\x045\x04=\ \x040\x00!\x00<\x00/\x00b\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x1aDownloa\ d Completed!\ \x07\x00\x00\x00\x14after_downl\ oad_ui_tr\x01\x03\x00\x00\x00\x1e\x00\ <\x00b\x00>\x04!\x04A\x04K\x04;\x04:\x04\ 0\x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0dLink: \x07\x00\x00\x00\x14after_d\ ownload_ui_tr\x01\x03\x00\ \x00\x00,\x00<\x00b\x00>\x04!\x04>\x04E\x04\ @\x040\x04=\x048\x04B\x04L\x00 \x04:\x04\ 0\x04:\x00<\x00/\x00b\x00>\x00:\x00 \x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x10Save\ as: \x07\x00\x00\x00\x14af\ ter_download_ui_\ tr\x01\x03\x00\x00\x00D\x04\x1d\x045\x00 \x04?\ \x04>\x04:\x040\x047\x04K\x042\x040\x04B\ \x04L\x00 \x04M\x04B\x04>\x00 \x04A\x04>\ \x04>\x041\x04I\x045\x04=\x048\x045\x00 \ \x04A\x04=\x04>\x042\x040\x00.\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x1eDon't show\ this message ag\ ain.\x07\x00\x00\x00\x14after_d\ ownload_ui_tr\x01\x03\x00\ \x00\x00,\x04\x1e\x04B\x04:\x04@\x04K\x04B\x04\ L\x00 \x04?\x040\x04?\x04:\x04C\x00 \x04\ 7\x040\x043\x04@\x04C\x047\x04:\x048\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x14Open Do\ wnload Folder\x07\x00\x00\ \x00\x14after_download\ _ui_tr\x01\x03\x00\x00\x008\x04\x1c\x045\ \x04=\x045\x044\x046\x045\x04@\x00 \x047\ \x040\x043\x04@\x04C\x047\x04>\x04:\x00 \ \x00P\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bPe\ rsepolis Downloa\ d Manager\x07\x00\x00\x00\x14af\ ter_download_ui_\ tr\x01\x03\x00\x00\x00&\x04!\x04>\x04>\x041\ \x04I\x048\x04B\x04L\x00 \x04>\x00 \x04?\ \x04@\x04>\x041\x04;\x045\x04<\x045\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0cReport I\ ssue\x07\x00\x00\x00\x10log_win\ dow_ui_tr\x01\x03\x00\x00\x00\xca\x00\ <\x00b\x00>\x00<\x00c\x00e\x00n\x00t\x00\ e\x00r\x00>\x04-\x04B\x040\x00 \x04A\x04\ A\x04K\x04;\x04:\x040\x00 \x041\x04K\x04\ ;\x040\x00 \x044\x04>\x041\x040\x042\x04\ ;\x045\x04=\x040\x00 \x04@\x040\x04=\x04\ L\x04H\x045\x00!\x00 \x04\x12\x04K\x00 \x04\ C\x042\x045\x04@\x045\x04=\x04K\x00,\x00\ \x04G\x04B\x04>\x00 \x04E\x04>\x04B\x04\ 8\x04B\x045\x00 \x044\x04>\x041\x040\x04\ 2\x048\x04B\x04L\x00 \x045\x04Q\x00 \x04\ 5\x04I\x04Q\x00 \x04@\x040\x047\x00?\x00\ <\x00/\x00c\x00e\x00n\x00t\x00e\x00r\x00\ >\x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00r
Th\ is link has been\ added before! \ \ Are you sure y\ ou want to add i\ t again?\x07\x00\x00\x00\x14mainwi\ ndow_src_ui_tr\x01\x03\ \x00\x00\x00&\x00<\x00b\x00>\x04!\x04>\x045\ \x044\x048\x04=\x045\x04=\x048\x04O\x00<\ \x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x14Connectio\ ns: \x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x00$\x00<\x00b\x00>\x04\x17\x04\ 0\x043\x04@\x04C\x046\x045\x04=\x04>\x00\ <\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x13Download\ ed: \x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x000\x00<\x00b\x00>\x04\x1e\x04\ 6\x048\x044\x040\x045\x04<\x04>\x045\x00\ \x042\x04@\x045\x04<\x04O\x00<\x00/\x00\ b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1cEstimated ti\ me left: \x07\x00\x00\ \x00\x14mainwindow_src\ _ui_tr\x01\x03\x00\x00\x00\x22\x00<\x00b\ \x00>\x04$\x04@\x040\x043\x04<\x045\x04=\ \x04B\x04K\x00<\x00/\x00b\x00>\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x12Fragm\ ents: \x07\x00\x00\x00\x14m\ ainwindow_src_ui\ _tr\x01\x03\x00\x00\x00\x1e\x00<\x00b\x00>\x04\ !\x04A\x04K\x04;\x04:\x040\x00<\x00/\x00\ b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0dLink: \x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x00\x1e\x00<\x00\ b\x00>\x04!\x04B\x040\x04B\x04C\x04A\x00\ <\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0fStatus: \x07\x00\x00\x00\x14mainwin\ dow_src_ui_tr\x01\x03\x00\ \x00\x004\x00<\x00b\x00>\x04!\x04:\x04>\x04\ @\x04>\x04A\x04B\x04L\x00 \x04?\x045\x04\ @\x045\x044\x040\x04G\x048\x00<\x00/\x00\ b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x16Transfer rat\ e: \x07\x00\x00\x00\x14main\ window_src_ui_tr\ \x01\x03\x00\x00\x00$\x04\x17\x040\x043\x04@\x04C\ \x047\x04:\x040\x00 \x047\x040\x042\x045\ \x04@\x04H\x045\x04=\x040\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x11Download Com\ plete\x07\x00\x00\x00\x14mainwi\ ndow_src_ui_tr\x01\x03\ \x00\x00\x00\x22\x04\x17\x040\x043\x04@\x04C\x047\ \x04:\x040\x00 \x04=\x040\x04G\x040\x04;\ \x040\x04A\x04L\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0f\ Download Starts\x07\ \x00\x00\x00\x14mainwindow_s\ rc_ui_tr\x01\x03\x00\x00\x00(\x04\x17\ \x040\x043\x04@\x04C\x047\x04:\x040\x00 \ \x04>\x04A\x04B\x040\x04=\x04>\x042\x04;\ \x045\x04=\x040\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10\ Download Stopped\ \x07\x00\x00\x00\x14mainwindow_\ src_ui_tr\x01\x03\x00\x00\x00\x10\x04\ \x1e\x04H\x048\x041\x04:\x040\x00 \x00-\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x08Error -\ \x07\x00\x00\x00\x14mainwindow\ _src_ui_tr\x01\x03\x00\x00\x00\x0e\ \x04\x1e\x04H\x048\x041\x04:\x040\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x07Error: \x07\ \x00\x00\x00\x14mainwindow_s\ rc_ui_tr\x01\x03\x00\x00\x00@\x04\x1d\ \x045\x044\x04>\x04A\x04B\x040\x04B\x04>\ \x04G\x04=\x04>\x00 \x04A\x042\x04>\x041\ \x04>\x044\x04=\x04>\x043\x04>\x00 \x04<\ \x045\x04A\x04B\x040\x00 \x042\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x19Not enou\ gh free space in\ :\x07\x00\x00\x00\x14mainwindow\ _src_ui_tr\x01\x03\x00\x00\x004\ \x04\x1e\x04?\x045\x04@\x040\x04F\x048\x04O\ \x00 \x04=\x045\x00 \x041\x04K\x04;\x040\ \x00 \x04C\x04A\x04?\x045\x04H\x04=\x04>\ \x049\x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1dOp\ eration was not \ successful.\x07\x00\x00\x00\x14\ mainwindow_src_u\ i_tr\x01\x03\x00\x00\x00X\x04\x1f\x04>\x046\ \x040\x04;\x04C\x049\x04A\x04B\x040\x00,\ \x00 \x042\x04>\x047\x04>\x041\x04=\x04>\ \x042\x048\x04B\x045\x00 \x04A\x04;\x045\ \x044\x04C\x04N\x04I\x04C\x04N\x00 \x04:\ \x040\x04B\x045\x043\x04>\x04@\x048\x04N\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00&Plea\ se resume the fo\ llowing category\ : \x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ @\x04\x1f\x04>\x046\x040\x04;\x04C\x049\x04\ A\x04B\x040\x00,\x00 \x04>\x041\x04=\x04\ >\x042\x048\x04B\x045\x00 \x00P\x00e\x00\ r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00\ .\x08\x00\x00\x00\x00\x06\x00\x00\x00\x19Pleas\ e update Persepo\ lis.\x07\x00\x00\x00\x14mainwin\ dow_src_ui_tr\x01\x03\x00\ \x00\x00 \x04?\x04@\x04>\x048\x047\x04>\x04\ H\x04;\x040\x00 \x04>\x04H\x048\x041\x04\ :\x040\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11an \ error occurred\x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x004\x04>\x04\ H\x048\x041\x04:\x040\x00 \x04<\x04C\x04\ ;\x04L\x04B\x048\x04?\x04;\x045\x04:\x04\ A\x048\x04@\x04>\x042\x040\x04=\x048\x04\ O\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0cmuxin\ g error\x07\x00\x00\x00\x14main\ window_src_ui_tr\ \x01\x03\x00\x00\x00\x12\x047\x040\x043\x04@\x04C\ \x046\x045\x04=\x04>\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0b downloaded\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00:\x00<\x00b\x00>\x04!\ \x04>\x04A\x04B\x04>\x04O\x04=\x048\x045\ \x00 \x040\x04C\x044\x048\x04>\x04D\x040\ \x049\x04;\x040\x00:\x00 \x00<\x00/\x00b\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aA\ udio file status\ : \x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ L\x00<\x00b\x00>\x04!\x04>\x04A\x04B\x04\ >\x04O\x04=\x048\x045\x00 \x04<\x04C\x04\ ;\x04L\x04B\x048\x04?\x04;\x045\x04:\x04\ A\x048\x04@\x04>\x042\x040\x04=\x048\x04\ O\x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x16Muxing\ status: \x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00$\x00<\x00b\x00>\x04!\ \x04>\x04A\x04B\x04>\x04O\x04=\x048\x045\ \x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0fStatus:\ \x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00:\ \x00<\x00b\x00>\x04!\x04>\x04A\x04B\x04>\ \x04O\x04=\x048\x045\x00 \x042\x048\x044\ \x045\x04>\x04D\x040\x049\x04;\x040\x00:\ \x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1aVideo fil\ e status: \x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00H\x04\x14\x04>\x041\x04\ 0\x042\x048\x04B\x04L\x00 \x04=\x04>\x04\ 2\x04C\x04N\x00 \x04A\x04A\x04K\x04;\x04\ :\x04C\x00 \x044\x04;\x04O\x00 \x04A\x04\ :\x040\x04G\x048\x042\x040\x04=\x048\x04\ O\x08\x00\x00\x00\x00\x06\x00\x00\x00\x15Add N\ ew Download Link\ \x07\x00\x00\x00\x10mainwindow_\ ui_tr\x01\x03\x00\x00\x00\x1c\x04\x1f\x04>\x04\ A\x04;\x045\x00 \x047\x040\x043\x04@\x04\ C\x047\x04:\x048\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0eAfter download\x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00\x0e\x04\x1f\x04@\x048\ \x04=\x04O\x04B\x04L\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x05Apply\x07\x00\x00\x00\x10main\ window_ui_tr\x01\x03\x00\x00\ \x00L\x04!\x04=\x040\x04G\x040\x04;\x040\ \x00 \x047\x040\x043\x04@\x04C\x047\x048\ \x04B\x045\x00\x0a\x00 \x04=\x048\x046\x04=\ \x04N\x04N\x00 \x04G\x040\x04A\x04B\x04L\ \x00 \x04A\x04?\x048\x04A\x04:\x040\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x22Download\ bottom of\x0a the \ list first\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x00\x1e\x04\x12\x04@\x045\x04<\x04O\x00\ \x04>\x04:\x04>\x04=\x04G\x040\x04=\x04\ 8\x04O\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08End\ Time\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00\x0a\ \x04\x12\x04K\x04E\x04>\x044\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x04Exit\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00 \x04!\x04:\x04@\x04K\x04B\x04L\x00\ \x04?\x040\x04@\x040\x04<\x045\x04B\x04\ @\x04K\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0cHid\ e Options\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00\x1c\x04\x1f\x040\x04C\x047\x040\x00 \ \x047\x040\x043\x04@\x04C\x047\x04:\x048\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0ePause \ Download\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x008\x04\x1c\x045\x04=\x045\x044\x046\x04\ 5\x04@\x00 \x047\x040\x043\x04@\x04C\x04\ 7\x04>\x04:\x00 \x00P\x00e\x00r\x00s\x00\ e\x00p\x00o\x00l\x00i\x00s\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x1bPersepolis \ Download Manager\ \x07\x00\x00\x00\x10mainwindow_\ ui_tr\x01\x03\x00\x00\x00\x10\x04\x1f\x04@\x04\ >\x043\x04@\x045\x04A\x04A\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x08Progress\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00\x10\x04!\x042\x04>\x049\ \x04A\x04B\x042\x040\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0aProperties\x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00(\x04\x12\x04>\x047\x04>\x04\ 1\x04=\x04>\x042\x048\x04B\x04L\x00 \x04\ 7\x040\x043\x04@\x04C\x047\x04:\x04C\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0fResume \ Download\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00V\x04\x1f\x04>\x04:\x040\x047\x040\x04\ B\x04L\x00 \x00/\x00 \x04A\x04?\x04@\x04\ O\x04B\x040\x04B\x04L\x00 \x047\x04=\x04\ 0\x04G\x04>\x04:\x00 \x042\x00 \x04A\x04\ 8\x04A\x04B\x045\x04<\x04=\x04>\x04<\x00\ \x04B\x04@\x045\x045\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x1aShow/Hide sys\ tem tray icon\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00\x12\x04\x12\x04K\x04:\x04;\ \x04N\x04G\x048\x04B\x04L\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x09Shut Down\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00\x18\x04\x12\x04@\x045\x04<\ \x04O\x00 \x04=\x040\x04G\x040\x04;\x040\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aStart \ Time\x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x008\x04\ \x1e\x04A\x04B\x040\x04=\x04>\x042\x048\x04\ B\x04L\x00/\x04\x1e\x04B\x04<\x045\x04=\x04\ 8\x04B\x04L\x00 \x047\x040\x043\x04@\x04\ C\x047\x04:\x04C\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x14Stop/Cancel Dow\ nload\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00\x1a\ \x04\x1f\x04>\x04A\x04;\x045\x00 \x047\x040\ \x04:\x040\x04G\x04:\x048\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0eAfter downlo\ ad\x07\x00\x00\x00\x0eprogress_\ ui_tr\x01\x03\x00\x00\x00\x0e\x04\x1f\x04@\x04\ 8\x04=\x04O\x04B\x04L\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x05Apply\x07\x00\x00\x00\x0epro\ gress_ui_tr\x01\x03\x00\x00\x00\ (\x04\x18\x04=\x04D\x04>\x04@\x04<\x040\x04\ F\x048\x04O\x00 \x04>\x00 \x047\x040\x04\ :\x040\x04G\x04:\x045\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x14Download Info\ rmation\x07\x00\x00\x00\x0eprog\ ress_ui_tr\x01\x03\x00\x00\x00$\ \x04\x1f\x040\x04@\x040\x04<\x045\x04B\x04@\ \x04K\x00 \x047\x040\x043\x04@\x04C\x047\ \x04:\x048\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Do\ wnload Options\x07\x00\ \x00\x00\x0eprogress_ui_t\ r\x01\x03\x00\x00\x00\x12\x04\x17\x040\x04:\x040\x04\ G\x045\x04=\x04>\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0bDownloaded:\x07\x00\ \x00\x00\x0eprogress_ui_t\ r\x01\x03\x00\x00\x00 \x04\x1e\x046\x048\x044\x04\ 0\x045\x04<\x04>\x045\x00 \x042\x04@\x04\ 5\x04<\x04O\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x14Estimated time \ left:\x07\x00\x00\x00\x0eprogre\ ss_ui_tr\x01\x03\x00\x00\x00\x10\x04!\ \x04A\x04K\x04;\x04:\x040\x00:\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x06Link: \x07\x00\ \x00\x00\x0eprogress_ui_t\ r\x01\x03\x00\x00\x00,\x04\x1a\x04>\x04;\x048\x04\ G\x045\x04A\x04B\x042\x04>\x00 \x04A\x04\ >\x045\x044\x048\x04=\x045\x04=\x048\x04\ 9\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x17Num\ ber of connectio\ ns: \x07\x00\x00\x00\x0eprogres\ s_ui_tr\x01\x03\x00\x00\x00\x0a\x04\x1f\x04\ 0\x04C\x047\x040\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x05Pause\x07\x00\x00\x00\x0eprogr\ ess_ui_tr\x01\x03\x00\x00\x008\x04\ \x1c\x045\x04=\x045\x044\x046\x045\x04@\x00\ \x047\x040\x043\x04@\x04C\x047\x04>\x04\ :\x00 \x00P\x00e\x00r\x00s\x00e\x00p\x00\ o\x00l\x00i\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1bPersepolis Down\ load Manager\x07\x00\x00\x00\ \x0eprogress_ui_tr\x01\ \x03\x00\x00\x00\x14\x04\x1f\x04@\x04>\x044\x04>\x04\ ;\x046\x048\x04B\x04L\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x06Resume\x07\x00\x00\x00\x0epr\ ogress_ui_tr\x01\x03\x00\x00\ \x00\x12\x04\x12\x04K\x04:\x04;\x04N\x04G\x048\ \x04B\x04L\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09Sh\ ut Down\x07\x00\x00\x00\x0eprog\ ress_ui_tr\x01\x03\x00\x00\x00\x0e\ \x04!\x04B\x040\x04B\x04C\x04A\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x08Status: \ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00\x14\x04\x1e\x04A\x04B\x04\ 0\x04=\x04>\x042\x048\x04B\x04L\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x04Stop\x07\x00\x00\x00\x0e\ progress_ui_tr\x01\x03\ \x00\x00\x00$\x04!\x04:\x04>\x04@\x04>\x04A\ \x04B\x04L\x00 \x04?\x045\x04@\x045\x044\ \x040\x04G\x048\x00:\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0fTransfer rate:\ \x07\x00\x00\x00\x0eprogress_u\ i_tr\x01\x03\x00\x00\x00\xb6\x00<\x00b\x00>\ \x00<\x00c\x00e\x00n\x00t\x00e\x00r\x00>\ \x04-\x04B\x04>\x00 \x04A\x04>\x04G\x045\ \x04B\x040\x04=\x048\x045\x00 \x04C\x046\ \x045\x00 \x048\x04A\x04?\x04>\x04;\x04L\ \x047\x04C\x045\x04B\x04A\x04O\x00!\x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x04\x12\x04K\x041\x045\x04@\ \x048\x04B\x045\x00 \x044\x04@\x04C\x043\ \x04>\x045\x00!\x00<\x00/\x00c\x00e\x00n\ \x00t\x00e\x00r\x00>\x00<\x00/\x00b\x00>\ \x08\x00\x00\x00\x00\x06\x00\x00\x00_This shortc\ ut has been used\ before! \ Use \ another one!\x07\x00\x00\x00\x11se\ tting_src_ui_tr\x01\ \x03\x00\x00\x00h\x00<\x00h\x00t\x00m\x00l\x00\ >\x00<\x00h\x00e\x00a\x00d\x00/\x00>\x00\ <\x00b\x00o\x00d\x00y\x00>\x00<\x00p\x00\ >\x04$\x04>\x04@\x04<\x040\x04B\x00 \x00\ H\x00H\x00:\x00M\x00M\x00<\x00/\x00p\x00\ >\x00<\x00/\x00b\x00o\x00d\x00y\x00>\x00\ <\x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x004

For\ mat HH:MM

\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x90\x00<\x00h\x00t\x00m\x00l\x00>\x00\ <\x00h\x00e\x00a\x00d\x00/\x00>\x00<\x00\ b\x00o\x00d\x00y\x00>\x00<\x00p\x00>\x04\ #\x04A\x04B\x040\x04=\x04>\x042\x048\x04\ B\x045\x00 \x04B\x040\x049\x04<\x00-\x04\ 0\x04C\x04B\x00 \x042\x00 \x04A\x045\x04\ :\x04C\x04=\x044\x040\x04E\x00.\x00 \x00\ <\x00/\x00p\x00>\x00<\x00/\x00b\x00o\x00\ d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\x00\ l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00@\

Set timeout i\ n seconds.

<\ /body>\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\xc6\x00<\x00h\x00t\x00m\x00l\x00\ >\x00<\x00h\x00e\x00a\x00d\x00/\x00>\x00\ <\x00b\x00o\x00d\x00y\x00>\x00<\x00p\x00\ >\x04-\x04B\x040\x00 \x04D\x04C\x04=\x04\ :\x04F\x048\x04O\x00 \x04<\x04>\x046\x04\ 5\x04B\x00 \x04=\x045\x00 \x04@\x040\x04\ 1\x04>\x04B\x040\x04B\x04L\x00 \x042\x00\ \x042\x040\x04H\x045\x049\x00 \x04>\x04\ ?\x045\x04@\x040\x04F\x048\x04>\x04=\x04\ =\x04>\x049\x00 \x04A\x048\x04A\x04B\x04\ 5\x04<\x045\x00.\x00<\x00/\x00p\x00>\x00\ <\x00/\x00b\x00o\x00d\x00y\x00>\x00<\x00\ /\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\x00\x00\ \x06\x00\x00\x00[

This \ feature may not \ work in your ope\ rating system.\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\xd6\x00<\x00h\x00t\x00m\ \x00l\x00>\x00<\x00h\x00e\x00a\x00d\x00/\ \x00>\x00<\x00b\x00o\x00d\x00y\x00>\x00<\ \x00p\x00>\x04\x18\x04A\x04?\x04>\x04;\x04L\ \x047\x04>\x042\x040\x04=\x048\x045\x00 \ \x04=\x045\x04A\x04:\x04>\x04;\x04L\x04:\ \x048\x04E\x00 \x04A\x04>\x045\x044\x048\ \x04=\x045\x04=\x048\x049\x00 \x04<\x04>\ \x046\x045\x04B\x00 \x04?\x04>\x04<\x04>\ \x04G\x04L\x00 \x04C\x04A\x04:\x04>\x04@\ \x048\x04B\x04L\x00 \x047\x040\x043\x04@\ \x04C\x047\x04:\x04C\x00.\x00<\x00/\x00p\ \x00>\x00<\x00/\x00b\x00o\x00d\x00y\x00>\ \x00<\x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\ \x00\x00\x00\x06\x00\x00\x00c

Us\ ing multiple con\ nections can hel\ p speed up your \ download.

\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x10\x04\x1e\x04B\x04<\x045\x04=\x048\x04\ B\x04L\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Can\ cel\x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00\x10\x04\x18\x047\x04\ <\x045\x04=\x048\x04B\x04L\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x06Change\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x1e\x04&\x042\x045\x04B\x04>\x042\x04\ 0\x04O\x00 \x04A\x04E\x045\x04<\x040\x00\ :\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0eColor\ scheme: \x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ *\x04\x17\x04=\x040\x04G\x045\x04=\x048\x04\ O\x00 \x04?\x04>\x00 \x04C\x04<\x04>\x04\ ;\x04G\x040\x04=\x048\x04N\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x08Defaults\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00$\x04\x1f\x040\x04@\x040\x04<\x04\ 5\x04B\x04@\x04K\x00 \x047\x040\x043\x04\ @\x04C\x047\x04:\x048\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x10Download Opti\ ons\x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x004\x04\x12\x04:\x04\ ;\x04N\x04G\x048\x04B\x04L\x00 \x047\x04\ 2\x04C\x04:\x048\x00 \x04C\x042\x045\x04\ 4\x04>\x04<\x04;\x045\x04=\x048\x049\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x1aEnable \ Notification Sou\ nds\x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00>\x04\x12\x04:\x04\ ;\x04N\x04G\x048\x04B\x04L\x00 \x047\x04\ =\x040\x04G\x04>\x04:\x00 \x04=\x040\x00\ \x04?\x040\x04=\x045\x04;\x048\x00 \x04\ 7\x040\x044\x040\x04G\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x17Enable system\ tray icon\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x0c\x04(\x04@\x048\x04D\x04B\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x06Font: \x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00h\x04!\x04:\x04@\x04K\x042\ \x040\x04B\x04L\x00 \x043\x04;\x040\x042\ \x04=\x04>\x045\x00 \x04>\x04:\x04=\x04>\ \x00,\x00 \x045\x04A\x04;\x048\x00 \x04=\ \x040\x046\x040\x04B\x040\x00 \x04:\x04;\ \x040\x042\x048\x04H\x040\x00 \x047\x040\ \x04:\x04@\x04K\x04B\x048\x04O\x00.\x08\x00\ \x00\x00\x00\x06\x00\x00\x00)Hide mai\ n window if clos\ e button clicked\ .\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x0e\x04\x18\x04:\x04>\x04\ =\x04:\x048\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x07Icons: \x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00X\ \x04\x1d\x045\x00 \x04?\x04>\x047\x042\x04>\ \x04;\x04O\x04B\x04L\x00 \x04A\x048\x04A\ \x04B\x045\x04<\x045\x00 \x04?\x045\x04@\ \x045\x049\x04B\x048\x00 \x042\x00 \x046\ \x044\x04C\x04I\x048\x049\x00 \x04@\x045\ \x046\x048\x04<\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x12Keep system aw\ ake!\x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\x0c\x04/\x047\ \x04K\x04:\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0aLanguage: \x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00 \x04\x22\x048\x04?\x00 \x04C\x042\ \x045\x044\x04>\x04<\x04;\x045\x04=\x048\ \x049\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x13No\ tification type:\ \x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x16\x04#\x042\x045\x04\ 4\x04>\x04<\x04;\x045\x04=\x048\x04O\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0dNotific\ ations\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00,\x04\x1a\ \x04>\x04;\x048\x04G\x045\x04A\x04B\x042\ \x04>\x00 \x04A\x04>\x045\x044\x048\x04=\ \x045\x04=\x048\x049\x00:\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x17Number of co\ nnections: \x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00&\x04\x1a\x04>\x04;\x048\x04G\x045\x04\ A\x04B\x042\x04>\x00 \x04?\x04>\x04?\x04\ K\x04B\x04>\x04:\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x11Number of tri\ es: \x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\x04\x00O\x00K\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x18\x04\x1f\x04@\x045\x044\x04?\x04>\ \x04G\x04B\x045\x04=\x048\x04O\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0bPreference\ s\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00*\x04\x1d\x040\x046\x04\ <\x048\x04B\x045\x00 \x04=\x04>\x042\x04\ K\x045\x00 \x04:\x04;\x040\x042\x048\x04\ H\x048\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0ePre\ ss new keys\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00N\x04\x17\x040\x04?\x04C\x04A\x04:\x04\ 0\x04B\x04L\x00 \x00P\x00e\x00r\x00s\x00\ e\x00p\x00o\x00l\x00i\x00s\x00 \x04?\x04\ @\x048\x00 \x04A\x04B\x040\x04@\x04B\x04\ 5\x00 \x04A\x048\x04A\x04B\x045\x04<\x04\ K\x08\x00\x00\x00\x00\x06\x00\x00\x00\x19Run P\ ersepolis at sta\ rtup\x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00 \x04!\x04>\ \x04G\x045\x04B\x040\x04=\x048\x04O\x00 \ \x04:\x04;\x040\x042\x048\x04H\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x09Shortcuts\x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00h\x04\x1f\x04>\x04:\x040\x04\ 7\x04K\x042\x040\x04B\x04L\x00 \x044\x04\ 8\x040\x04;\x04>\x043\x04>\x042\x04>\x04\ 5\x00 \x04>\x04:\x04=\x04>\x00 \x04?\x04\ >\x04A\x04;\x045\x00 \x047\x040\x042\x04\ 5\x04@\x04H\x045\x04=\x048\x04O\x00 \x04\ 7\x040\x043\x04@\x04C\x047\x04:\x048\x08\ \x00\x00\x00\x00\x06\x00\x00\x007Show do\ wnload complete \ dialog when down\ load is finished\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x0e\x04 \x040\x047\x04<\ \x045\x04@\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06\ Size: \x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x0c\x04!\ \x04B\x040\x04B\x04C\x04A\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x06Status\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x0c\x04!\x04B\x048\x04;\x04L\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x07Style: \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00,\x04\x22\x040\x049\x04<\x00\ -\x040\x04C\x04B\x00 \x00(\x042\x00 \x04\ A\x045\x04:\x04C\x04=\x044\x040\x04E\x00\ )\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x13Tim\ eout (seconds): \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00N\x04 \x040\x047\x04<\ \x045\x04@\x00 \x047\x04=\x040\x04G\x04:\ \x04>\x042\x00 \x04=\x040\x00 \x04?\x040\ \x04=\x045\x04;\x048\x00 \x048\x04=\x04A\ \x04B\x04@\x04C\x04<\x045\x04=\x04B\x04>\ \x042\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x14\ Toolbar icons si\ ze: \x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00,\x04\x1f\x040\ \x04@\x040\x04<\x045\x04B\x04@\x04K\x00 \ \x00V\x00i\x00d\x00e\x00o\x00 \x00F\x00i\ \x00n\x00d\x00e\x00r\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x14Video Finder O\ ptions\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x14\x04\x13\ \x04@\x04>\x04<\x04:\x04>\x04A\x04B\x04L\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08Volu\ me: \x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x006\x04\x18\x047\ \x04<\x045\x04=\x048\x04B\x04L\x00 \x04?\ \x040\x04?\x04:\x04C\x00 \x044\x04;\x04O\ \x00 \x047\x040\x043\x04@\x04C\x047\x04:\ \x048\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Chan\ ge Download Fold\ er\x07\x00\x00\x00\x0atext_ui_t\ r\x01\x03\x00\x00\x00\x08\x00I\x00P\x00:\x00 \x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x03IP:\x07\x00\x00\x00\ \x0atext_ui_tr\x01\x03\x00\x00\x00\ .\x04\x1a\x04>\x04;\x048\x04G\x045\x04A\x04\ B\x042\x04>\x00 \x04?\x04>\x044\x04:\x04\ ;\x04N\x04G\x045\x04=\x048\x049\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x16Number \ of connections:\x07\ \x00\x00\x00\x0atext_ui_tr\x01\x03\ \x00\x00\x008\x04\x1c\x045\x04=\x045\x044\x046\ \x045\x04@\x00 \x047\x040\x043\x04@\x04C\ \x047\x04>\x04:\x00 \x00P\x00e\x00r\x00s\ \x00e\x00p\x00o\x00l\x00i\x00s\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x1bPersepolis\ Download Manage\ r\x07\x00\x00\x00\x0atext_ui_tr\ \x01\x03\x00\x00\x00\x0a\x04\x1f\x04>\x04@\x04B\x00:\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Port:\x07\ \x00\x00\x00\x0atext_ui_tr\x01\x03\ \x00\x00\x00:\x00<\x00b\x00>\x04!\x04>\x04A\ \x04B\x04>\x04O\x04=\x048\x045\x00 \x040\ \x04C\x044\x048\x04>\x04D\x040\x049\x04;\ \x040\x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1aAudio\ file status: \x07\x00\x00\x00\x1bvideo_fin\ der_progress_ui_\ tr\x01\x03\x00\x00\x00L\x00<\x00b\x00>\x04!\ \x04>\x04A\x04B\x04>\x04O\x04=\x048\x045\ \x00 \x04<\x04C\x04;\x04L\x04B\x048\x04?\ \x04;\x045\x04:\x04A\x048\x04@\x04>\x042\ \x040\x04=\x048\x04O\x00:\x00 \x00<\x00/\ \x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Muxing status: \ \x07\x00\x00\x00\x1bvideo_f\ inder_progress_u\ i_tr\x01\x03\x00\x00\x00:\x00<\x00b\x00>\ \x04!\x04>\x04A\x04B\x04>\x04O\x04=\x048\ \x045\x00 \x042\x048\x044\x045\x04>\x04D\ \x040\x049\x04;\x040\x00:\x00 \x00<\x00/\ \x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aVideo file stat\ us:
\x07\x00\x00\x00\x1bvid\ eo_finder_progre\ ss_ui_tr\x01\x88\x00\x00\x00\x0d\x11\x01\ \xfd)\x0b\xff\x14\x02\x04\xfd,\x0a\x13\ \x00\x001\xd2\ <\ \xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\xa7\ \x00\x00\x00\x05tr_TRB\x00\x00\x03\xa8\x00\x00\ \x05;\x00\x00\x03\xd8\x00\x00\x05;\x00\x00\x07\x0c\x00\x00\ \x05;\x00\x00((\x00\x00N:\x00\x00+\xa8\x00\x04\ \xcf\x04\x00\x00\x16\xef\x00\x04\xe3\xc0\x00\x00\x06V\x00\x05\ 0K\x00\x00\x06\x84\x00\x05\xab`\x00\x00\x1e\x0a\x00H\ w9\x00\x00\x15\xe7\x00Hw9\x00\x00\x1a\xaf\x00V\ \x8c\x95\x00\x00\x1c\x96\x00Wiz\x00\x00\x07:\x00W\ iz\x00\x00,D\x00W\x96\xf9\x00\x00\x07\x83\x00\x97\ \xa2\x10\x00\x00\x04\xba\x00\xc2\xad\xd0\x00\x00\x0d\xdd\x01\x18\ \xab\xd4\x00\x00\x16\x1d\x01\x8bp\x0e\x00\x00!r\x02S\ \xd0\x00\x00\x00\x08{\x02\x9a\xf5p\x00\x00\x0e=\x02\xf9\ \xc5\xc5\x00\x00\x03\xa5\x03\x0d1^\x00\x00\x0aD\x03\x1c\ \xc5*\x00\x00\x1b\x91\x03<\x83\x03\x00\x00\x06\xba\x03K\ F\xe3\x00\x00\x1b8\x03KF\xe3\x00\x00%\x02\x03\x92\ \xd2\xce\x00\x00%\x98\x03\xdc\xdc%\x00\x00\x0b\xa2\x04]\ I3\x00\x00(\x95\x04e\xac\xf5\x00\x00\x16\xaa\x04\x98\ I\xbc\x00\x00\x05g\x04\x98I\xbc\x00\x00$\x0a\x04\x9e\ \x84\xd5\x00\x00$<\x04\xd6W\xc0\x00\x00%Z\x05\x13\ \xccT\x00\x00\x133\x05_. \x00\x00\x12;\x05_\ \xa8`\x00\x00\x0f\x10\x05i<\xfe\x00\x00\x14W\x05v\ \x1b\x9e\x00\x00\x0b\xeb\x05\x8c\xac5\x00\x00\x1dD\x05\xa1\ \x08\xc0\x00\x00)\xa5\x05\xa3\x9c>\x00\x00\x13\xea\x05\xa3\ \x9c>\x00\x00-\x0a\x05\xa8X\xf3\x00\x00\x03\x09\x05\xaa\ \x8b\xc3\x00\x00)\xdb\x06-B\x0e\x00\x00\x13u\x06-\ B\x0e\x00\x00,\x8a\x069\x82N\x00\x00\x14\xa7\x069\ \x82N\x00\x00-\x82\x06<=\x10\x00\x00+\x09\x06]\ 1\xde\x00\x00\x02\x02\x06\x9aK\x00\x00\x00\x08\xc2\x06\x9a\ \xf5C\x00\x00)f\x06\x9c(\x01\x00\x00&\x80\x06\xc5\ )*\x00\x00\x1b\xd3\x06\xcc\xd6\xa3\x00\x00\x180\x07\x14\ *\x1e\x00\x00\x18\xe9\x076\xcf`\x00\x00\x06\x03\x07[\ &u\x00\x00\x0f\xcd\x07\x9b]0\x00\x00'\xd7\x07\x9c\ 1\x03\x00\x00*\xa3\x08g-\xa2\x00\x00\x0a\xc1\x09>\ \x0d$\x00\x00\x19\xf1\x09^\x89\xd3\x00\x00\x17\xf1\x09`\ \x06\xb5\x00\x00\x19\xa6\x09g\x01\xd0\x00\x00*B\x09\x93\ \xd2\xfe\x00\x00\x1a\xe3\x09\x96F0\x00\x00\x10\xde\x0a\x0c\ \x87\x0e\x00\x00\x1f\xbc\x0a_\xd7\x0e\x00\x00\x09\x10\x0a_\ \xf3\xfb\x00\x00\x15 \x0as>\xc3\x00\x00\x04y\x0a\x8b\ \xc3`\x00\x00\x1d\xd1\x0a\x97\x00\x80\x00\x00\x08%\x0a\xa2\ Yp\x00\x00(\xe9\x0a\xc0(\x90\x00\x00*\x0d\x0b`\ r`\x00\x00&\xda\x0bn\xb1\xee\x00\x00\x22\x9d\x0bv\ \x04\xf0\x00\x00\x0dx\x0b\x89w\x94\x00\x00\x15\x92\x0b\x89\ w\x94\x00\x00\x1a\x5c\x0b\xc8\xc7\x13\x00\x00$\xbe\x0b\xf9\ \x95\xb3\x00\x00\x10+\x0c(\x19\x04\x00\x00\x18s\x0c2\ \xc0S\x00\x00\x03_\x0ce\x0f.\x00\x00\x19n\x0ce\ \x0f.\x00\x00\x1d\x9b\x0c\x96q\xc0\x00\x00\x09\x87\x0c\x96\ q\xc0\x00\x00\x0e\xb8\x0c\x99e\x80\x00\x00\x11\x1d\x0c\xb5\ \x86\x80\x00\x00\x1c0\x0c\xb5\x86\x80\x00\x00'r\x0c\xdd\ \xc2\x03\x00\x00(V\x0c\xe0\x1a\xf3\x00\x00'-\x0c\xfb\ \xe0\x8a\x00\x00\x11Y\x0dq\x98\xde\x00\x00\x00\x00\x0d\x99\ \xf9B\x00\x00\x04\x04\x0d\x99\xf9B\x00\x00\x0b$\x0d\x99\ \xf9B\x00\x00\x17w\x0d\x99\xf9B\x00\x00\x1c\xcc\x0d\x99\ \xf9B\x00\x00+\xd0\x0e i\x22\x00\x00\x12\xde\x0e.\ d\xa4\x00\x00\x17\x22\x0e7I\xc3\x00\x00\x05\x0f\x0ex\ \xa8B\x00\x00\x05\x99\x0ex\xa8B\x00\x00+A\x0e\xc4\ J\xf0\x00\x00\x07\xc2\x0e\xda\xd4\xfe\x00\x00\x1e\x8b\x0f6\ \xb6\x90\x00\x00\x0fd\x0f}\x11p\x00\x00\x09\xdf\x0f\xa6\ V\x80\x00\x00&C\x0f\xa7\xb6\x04\x00\x00\x10\x81\x0f\xac\ [\xee\x00\x00\x11\xc3\x0f\xd1?\x00\x00\x00\x1e=\x0f\xd6\ \xe5\xde\x00\x00 x\x0f\xde{\xf0\x00\x00$t\x0f\xf3\ \x03\x0e\x00\x00\x00\xfbi\x00\x00.\x06\x03\x00\x00\x00\x92\ \x00<\x00a\x00 \x00h\x00r\x00e\x00f\x00=\ \x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\ \x00p\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x00d\x00m\x00.\x00g\x00i\x00t\ \x00h\x00u\x00b\x00.\x00i\x00o\x00>\x00h\ \x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00p\ \x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\ \x00s\x00d\x00m\x00.\x00g\x00i\x00t\x00h\ \x00u\x00b\x00.\x00i\x00o\x00<\x00/\x00a\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00Ihttps://perse\ polisdm.github.i\ o\x07\x00\x00\x00\x0babout_\ ui_tr\x01\x03\x00\x00\x00\x9a\x00<\x00a\x00\ \x00h\x00r\x00e\x00f\x00=\x00h\x00t\x00\ t\x00p\x00s\x00:\x00/\x00/\x00t\x00e\x00\ l\x00e\x00g\x00r\x00a\x00m\x00.\x00m\x00\ e\x00/\x00p\x00e\x00r\x00s\x00e\x00p\x00\ o\x00l\x00i\x00s\x00d\x00m\x00>\x00h\x00\ t\x00t\x00p\x00s\x00:\x00/\x00/\x00t\x00\ e\x00l\x00e\x00g\x00r\x00a\x00m\x00.\x00\ m\x00e\x00/\x00p\x00e\x00r\x00s\x00e\x00\ p\x00o\x00l\x00i\x00s\x00d\x00m\x00<\x00\ /\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00M<\ a href=https://t\ elegram.me/perse\ polisdm>https://\ telegram.me/pers\ epolisdm\x07\x00\x00\x00\ \x0babout_ui_tr\x01\x03\x00\x00\ \x00\x9a\x00<\x00a\x00 \x00h\x00r\x00e\x00f\ \x00=\x00h\x00t\x00t\x00p\x00s\x00:\x00/\ \x00/\x00t\x00w\x00i\x00t\x00t\x00e\x00r\ \x00.\x00c\x00o\x00m\x00/\x00p\x00e\x00r\ \x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00d\ \x00m\x00>\x00h\x00t\x00t\x00p\x00s\x00:\ \x00/\x00/\x00t\x00w\x00i\x00t\x00t\x00e\ \x00r\x00.\x00c\x00o\x00m\x00/\x00p\x00e\ \x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\ \x00d\x00m\x00<\x00/\x00a\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00Mh\ ttps://twitter.c\ om/persepolisdm<\ /a>\x07\x00\x00\x00\x0babout_ui\ _tr\x01\x03\x00\x00\x00&\x00P\x00e\x00r\x00\ s\x00e\x00p\x00o\x00l\x00i\x00s\x00 \x00\ H\x00a\x00k\x00k\x011\x00n\x00d\x00a\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x10About P\ ersepolis\x07\x00\x00\x00\x0bab\ out_ui_tr\x01\x03\x00\x00\x00\x1c\x00\ G\x00e\x00l\x00i\x01_\x00t\x00i\x00r\x00\ i\x00c\x00i\x00l\x00e\x00r\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0aDevelopers\x07\ \x00\x00\x00\x0babout_ui_tr\x01\ \x03\x00\x00\x00\x0c\x00L\x00i\x00s\x00a\x00n\x00\ s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07Licen\ se\x07\x00\x00\x00\x0babout_ui_\ tr\x01\x03\x00\x00\x00\x0a\x00T\x00a\x00m\x00a\ \x00m\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\x07\x00\ \x00\x00\x0babout_ui_tr\x01\x03\ \x00\x00\x00:\x00P\x00e\x00r\x00s\x00e\x00p\ \x00o\x00l\x00i\x00s\x00 \x010\x00n\x00d\ \x00i\x00r\x00m\x00e\x00 \x00Y\x00\xf6\x00n\ \x00e\x00t\x00i\x00c\x00i\x00s\x00i\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1bPersepol\ is Download Mana\ ger\x07\x00\x00\x00\x0babout_ui\ _tr\x01\x03\x00\x00\x00\x16\x00\xc7\x00e\x00v\x00\ i\x00r\x00m\x00e\x00n\x00l\x00e\x00r\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0bTransla\ tors\x07\x00\x00\x00\x0babout_u\ i_tr\x01\x03\x00\x00\x00\x22\x00K\x00a\x00t\ \x00e\x00g\x00o\x00r\x00i\x00y\x00e\x00 \ \x00e\x00k\x00l\x00e\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x11Add to cat\ egory: \x07\x00\x00\x00\x0daddl\ ink_ui_tr\x01\x03\x00\x00\x00&\x00\ G\x00e\x00l\x00i\x01_\x00m\x00i\x01_\x00\ \x00S\x00e\x00\xe7\x00e\x00n\x00e\x00k\x00\ l\x00e\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10A\ dvanced Options\x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x00\x0a\x010\x00p\x00t\x00a\x00\ l\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Cance\ l\x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x002\x010\x00n\x00d\x00\ i\x00r\x00m\x00e\x00 \x00D\x00i\x00z\x00\ i\x00n\x00i\x00n\x00i\x00 \x00D\x00e\x01\ \x1f\x00i\x01_\x00t\x00i\x00r\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x16Change Down\ load Folder\x07\x00\x00\x00\x0d\ addlink_ui_tr\x01\x03\x00\ \x00\x00 \x010\x00n\x00d\x00i\x00r\x00m\x00\ e\x00 \x00D\x00i\x00z\x00i\x00n\x00i\x00\ :\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Dow\ nload Folder: \x07\x00\ \x00\x00\x0daddlink_ui_tr\ \x01\x03\x00\x00\x00\x08\x00I\x00P\x00:\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x04IP: \x07\x00\x00\x00\ \x0daddlink_ui_tr\x01\x03\ \x00\x00\x00\x10\x00B\x00a\x01\x1f\x00l\x00a\x00n\ \x00t\x011\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04Li\ nk\x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00$\x00D\x00a\x00h\ \x00a\x00 \x00F\x00a\x00z\x00l\x00a\x00 \ \x00S\x00e\x00\xe7\x00e\x00n\x00e\x00k\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0cMore Opt\ ions\x07\x00\x00\x00\x0daddlink\ _ui_tr\x01\x03\x00\x00\x00\x0a\x00T\x00a\ \x00m\x00a\x00m\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02\ OK\x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00\x22\x00B\x00a\x01\x1f\ \x00l\x00a\x00n\x00t\x011\x00 \x00n\x00o\ \x00k\x00t\x00a\x00s\x011\x00:\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x05Port:\x07\x00\x00\x00\x0d\ addlink_ui_tr\x01\x03\x00\ \x00\x00\x18\x00A\x00r\x00a\x00c\x011\x00 \x00\ s\x00u\x00n\x00u\x00c\x00u\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x05Proxy\x07\x00\x00\x00\x0da\ ddlink_ui_tr\x01\x03\x00\x00\ \x00$\x00<\x00b\x00>\x00D\x00o\x00s\x00y\ \x00a\x00 \x00a\x00d\x011\x00<\x00/\x00b\ \x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x12\ File name\ : \x07\x00\x00\x00\x18after_dow\ nload_src_ui_tr\x01\ \x03\x00\x00\x00\x1c\x00<\x00b\x00>\x00B\x00o\x00\ y\x00u\x00t\x00<\x00/\x00b\x00>\x00:\x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dSi\ ze: \x07\x00\x00\x00\x18aft\ er_download_src_\ ui_tr\x01\x03\x00\x00\x00\x16\x00 \x00 \x00\ \x00T\x00a\x00m\x00a\x00m\x00 \x00 \x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x08 OK\ \x07\x00\x00\x00\x14after_do\ wnload_ui_tr\x01\x03\x00\x00\ \x00\x18\x00 \x00 \x00D\x00o\x00s\x00y\x00a\ \x00 \x00A\x00\xe7\x00 \x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0d Open File \ \x07\x00\x00\x00\x14after_down\ load_ui_tr\x01\x03\x00\x00\x004\ \x00<\x00b\x00>\x010\x00n\x00d\x00i\x00r\ \x00m\x00e\x00 \x00T\x00a\x00m\x00a\x00m\ \x00l\x00a\x00n\x00d\x011\x00!\x00<\x00/\ \x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aDownload Comple\ ted!
\x07\x00\x00\x00\x14aft\ er_download_ui_t\ r\x01\x03\x00\x00\x00\x22\x00<\x00b\x00>\x00B\x00\ a\x01\x1f\x00l\x00a\x00n\x00t\x011\x00<\x00\ /\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0dLink: \ \x07\x00\x00\x00\x14after_downl\ oad_ui_tr\x01\x03\x00\x00\x00,\x00\ <\x00b\x00>\x00F\x00a\x00r\x00k\x00l\x01\ 1\x00 \x00k\x00a\x00y\x00d\x00e\x00t\x00\ <\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x10Save as<\ /b>: \x07\x00\x00\x00\x14after_\ download_ui_tr\x01\x03\ \x00\x00\x006\x00B\x00u\x00 \x00i\x00l\x00e\ \x00t\x00i\x00y\x00i\x00 \x00t\x00e\x00k\ \x00r\x00a\x00r\x00 \x00g\x00\xf6\x00s\x00t\ \x00e\x00r\x00m\x00e\x00.\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1eDon't show t\ his message agai\ n.\x07\x00\x00\x00\x14after_dow\ nload_ui_tr\x01\x03\x00\x00\x00\ &\x010\x00n\x00d\x00i\x00r\x00m\x00e\x00\ \x00D\x00i\x00z\x00i\x00n\x00i\x00n\x00\ i\x00 \x00A\x00\xe7\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x14Open Download F\ older\x07\x00\x00\x00\x14after_\ download_ui_tr\x01\x03\ \x00\x00\x00:\x00P\x00e\x00r\x00s\x00e\x00p\ \x00o\x00l\x00i\x00s\x00 \x010\x00n\x00d\ \x00i\x00r\x00m\x00e\x00 \x00Y\x00\xf6\x00n\ \x00e\x00t\x00i\x00c\x00i\x00s\x00i\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1bPersepol\ is Download Mana\ ger\x07\x00\x00\x00\x14after_do\ wnload_ui_tr\x01\x03\x00\x00\ \x00\x18\x00S\x00o\x00r\x00u\x00n\x00 \x00B\ \x00i\x00l\x00d\x00i\x00r\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0cReport Issue\ \x07\x00\x00\x00\x10log_window_\ ui_tr\x01\x03\x00\x00\x00\xf2\x00<\x00b\x00\ >\x00<\x00c\x00e\x00n\x00t\x00e\x00r\x00\ >\x00B\x00u\x00 \x00b\x00a\x01\x1f\x00l\x00\ a\x00n\x00t\x011\x00 \x00d\x00a\x00h\x00\ a\x00 \x00\xf6\x00n\x00c\x00e\x00 \x00e\x00\ k\x00l\x00e\x00n\x00m\x00i\x01_\x00t\x00\ i\x00r\x00!\x00 \x00 \x00 \x00 \x00 \x00\ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\ \x00 \x00 \x00 \x00 \x00 \x00 \x00T\x00\ e\x00k\x00r\x00a\x00r\x00 \x00e\x00k\x00\ l\x00e\x00m\x00e\x00k\x00 \x00i\x00s\x00\ t\x00e\x00d\x00i\x01\x1f\x00i\x00n\x00i\x00\ z\x00d\x00e\x00n\x00 \x00e\x00m\x00i\x00\ n\x00 \x00m\x00i\x00s\x00i\x00n\x00i\x00\ z\x00?\x00<\x00/\x00c\x00e\x00n\x00t\x00\ e\x00r\x00>\x00<\x00/\x00b\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00rThis link has \ been added befor\ e! \ Are you su\ re you want to a\ dd it again?\x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00(\x00<\x00b\x00>\x00B\ \x00a\x01\x1f\x00l\x00a\x00n\x00t\x011\x00l\ \x00a\x00r\x00<\x00/\x00b\x00>\x00:\x00 \ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Con\ nections: \x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x00$\x00<\x00\ b\x00>\x010\x00n\x00d\x00i\x00r\x00i\x00\ l\x00d\x00i\x00<\x00/\x00b\x00>\x00:\x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x13Do\ wnloaded: \x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x006\x00<\x00\ b\x00>\x00T\x00a\x00h\x00m\x00i\x00n\x00\ i\x00 \x00k\x00a\x00l\x00a\x00n\x00 \x00\ s\x00\xfc\x00r\x00e\x00<\x00/\x00b\x00>\x00\ :\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1c\ Estimated time l\ eft: \x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00\x22\x00<\x00b\x00>\x00B\ \x00a\x01\x1f\x00l\x00a\x00n\x00t\x011\x00<\ \x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0dLink:\ \x07\x00\x00\x00\x14mainwindow\ _src_ui_tr\x01\x03\x00\x00\x00\x1c\ \x00<\x00b\x00>\x00D\x00u\x00r\x00u\x00m\ \x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0fStatus<\ /b>: \x07\x00\x00\x00\x14mainwi\ ndow_src_ui_tr\x01\x03\ \x00\x00\x00*\x00<\x00b\x00>\x00A\x00k\x00t\ \x00a\x00r\x011\x00m\x00 \x00h\x011\x00z\ \x011\x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x16Trans\ fer rate: \x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x00$\x010\x00\ n\x00d\x00i\x00r\x00m\x00e\x00 \x00T\x00\ a\x00m\x00a\x00m\x00l\x00a\x00n\x00d\x01\ 1\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Downl\ oad Complete\x07\x00\x00\x00\ \x14mainwindow_src_\ ui_tr\x01\x03\x00\x00\x00\x1e\x010\x00n\x00\ d\x00i\x00r\x00m\x00e\x00 \x00B\x00a\x01\ _\x00l\x00a\x00d\x011\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0fDownload Star\ ts\x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ $\x010\x00n\x00d\x00r\x00i\x00m\x00e\x00\ \x00D\x00u\x00r\x00d\x00u\x00r\x00u\x00\ l\x00d\x00u\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10D\ ownload Stopped\x07\ \x00\x00\x00\x14mainwindow_s\ rc_ui_tr\x01\x03\x00\x00\x00\x0e\x00H\ \x00a\x00t\x00a\x00 \x00-\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x08Error - \x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x00\x0c\x00H\x00\ a\x00t\x00a\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x07Error: \x07\x00\x00\x00\x14m\ ainwindow_src_ui\ _tr\x01\x03\x00\x00\x00(\x00Y\x00e\x00t\x00\ e\x00r\x00l\x00i\x00 \x00b\x00o\x01_\x00\ \x00a\x00l\x00a\x00n\x00 \x00y\x00o\x00\ k\x08\x00\x00\x00\x00\x06\x00\x00\x00\x19Not e\ nough free space\ in:\x07\x00\x00\x00\x14mainwin\ dow_src_ui_tr\x01\x03\x00\ \x00\x002\x010\x01_\x00l\x00e\x00y\x00i\x01\ _\x00 \x00b\x00a\x01_\x00a\x00r\x011\x00\ l\x011\x00 \x00d\x00e\x01\x1f\x00i\x00l\x00\ d\x00i\x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1dO\ peration was not\ successful.\x07\x00\x00\x00\ \x14mainwindow_src_\ ui_tr\x01\x03\x00\x00\x00T\x00L\x00\xfc\x00\ t\x00f\x00e\x00n\x00 \x00s\x011\x00r\x00\ a\x00d\x00a\x00k\x00i\x00 \x00k\x00a\x00\ t\x00e\x00g\x00o\x00r\x00i\x00y\x00i\x00\ \x00d\x00e\x00v\x00a\x00m\x00 \x00e\x00\ t\x00t\x00i\x00r\x00i\x00n\x00:\x00 \x08\ \x00\x00\x00\x00\x06\x00\x00\x00&Please \ resume the follo\ wing category: \x07\ \x00\x00\x00\x14mainwindow_s\ rc_ui_tr\x01\x03\x00\x00\x00 \x00\xc7\ \x00o\x01\x1f\x00u\x00l\x00l\x00a\x00m\x00a\ \x00 \x00h\x00a\x00t\x00a\x00s\x011\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0cmuxing e\ rror\x07\x00\x00\x00\x14mainwin\ dow_src_ui_tr\x01\x03\x00\ \x00\x00\x12\x00i\x00n\x00d\x00i\x00r\x00i\x00\ l\x00d\x00i\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0b \ downloaded\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x006\x00<\x00b\x00>\x00S\x00e\x00\ s\x00 \x00d\x00o\x00s\x00y\x00a\x00s\x01\ 1\x00 \x00d\x00u\x00r\x00u\x00m\x00u\x00\ :\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x1aAudio fi\ le status: \x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x002\x00<\x00b\x00>\ \x00\xc7\x00o\x01\x1f\x00u\x00l\x00l\x00a\x00m\ \x00a\x00 \x00d\x00u\x00r\x00u\x00m\x00u\ \x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x16Muxing \ status: \x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00\x1c\x00<\x00b\x00>\x00D\x00\ u\x00r\x00u\x00m\x00:\x00 \x00<\x00/\x00\ b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0f\ Status: \x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00:\x00<\x00b\x00>\x00V\x00\ i\x00d\x00e\x00o\x00 \x00d\x00o\x00s\x00\ y\x00a\x00s\x011\x00 \x00d\x00u\x00r\x00\ u\x00m\x00u\x00:\x00 \x00<\x00/\x00b\x00\ >\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aVi\ deo file status:\ \x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x008\ \x00Y\x00e\x00n\x00i\x00 \x010\x00n\x00d\ \x00i\x00r\x00m\x00e\x00 \x00B\x00a\x01\x1f\ \x00l\x00a\x00n\x00t\x011\x00s\x011\x00 \ \x00E\x00k\x00l\x00e\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x15Add New Downlo\ ad Link\x07\x00\x00\x00\x10main\ window_ui_tr\x01\x03\x00\x00\ \x00\x22\x010\x00n\x00d\x00i\x00r\x00d\x00i\ \x00k\x00t\x00e\x00n\x00 \x00s\x00o\x00n\ \x00r\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0eAf\ ter download\x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00\x0c\x00U\x00y\x00g\x00u\x00\ l\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05App\ ly\x07\x00\x00\x00\x10mainwindo\ w_ui_tr\x01\x03\x00\x00\x00F\x010\x00\ l\x00k\x00 \x00\xf6\x00n\x00c\x00e\x00 \x00\ l\x00i\x00s\x00t\x00e\x00n\x00i\x00n\x00\ \x0a\x00a\x00l\x00t\x011\x00n\x00d\x00a\x00\ k\x00i\x00n\x00i\x00 \x00i\x00n\x00d\x00\ i\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x22Dow\ nload bottom of\x0a\ the list first\x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00\x18\x00B\x00i\x00t\ \x00i\x01_\x00 \x00Z\x00a\x00m\x00a\x00n\ \x011\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08End \ Time\x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00\x0a\x00\ \xc7\x011\x00k\x011\x01_\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x04Exit\x07\x00\x00\x00\x10main\ window_ui_tr\x01\x03\x00\x00\ \x00\x22\x010\x00n\x00d\x00i\x00r\x00m\x00e\ \x00y\x00e\x00 \x00A\x00r\x00a\x00 \x00V\ \x00e\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0ePa\ use Download\x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00:\x00P\x00e\x00r\x00s\x00\ e\x00p\x00o\x00l\x00i\x00s\x00 \x010\x00\ n\x00d\x00i\x00r\x00m\x00e\x00 \x00Y\x00\ \xf6\x00n\x00e\x00t\x00i\x00c\x00i\x00s\x00\ i\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bPerse\ polis Download M\ anager\x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ \x12\x010\x00l\x00e\x00r\x00l\x00e\x00y\x00\ i\x01_\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08Pro\ gress\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00\x14\ \x00\xd6\x00z\x00e\x00l\x00l\x00i\x00k\x00l\ \x00e\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aPr\ operties\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00B\x010\x00n\x00d\x00i\x00r\x00m\x00\ e\x00y\x00e\x00 \x00K\x00a\x00l\x00d\x01\ 1\x01\x1f\x011\x00 \x00Y\x00e\x00r\x00d\x00\ e\x00n\x00 \x00D\x00e\x00v\x00a\x00m\x00\ \x00E\x00t\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fR\ esume Download\x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00F\x00G\x00\xf6\x00r\x00\ e\x00v\x00 \x00\xe7\x00u\x00b\x00u\x01\x1f\x00\ u\x00 \x00s\x00i\x00m\x00g\x00e\x00s\x00\ i\x00n\x00i\x00 \x00G\x00\xf6\x00s\x00t\x00\ e\x00r\x00/\x00G\x00i\x00z\x00l\x00e\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x1aShow/Hi\ de system tray i\ con\x07\x00\x00\x00\x10mainwind\ ow_ui_tr\x01\x03\x00\x00\x00\x0a\x00K\ \x00a\x00p\x00a\x00t\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x09Shut Down\x07\x00\x00\x00\x10\ mainwindow_ui_tr\ \x01\x03\x00\x00\x00\x1c\x00B\x00a\x01_\x00l\x00a\ \x00m\x00a\x00 \x00Z\x00a\x00m\x00a\x00n\ \x011\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aStar\ t Time\x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ 2\x010\x00n\x00d\x00i\x00r\x00m\x00e\x00\ y\x00i\x00 \x00D\x00u\x00r\x00d\x00u\x00\ r\x00/\x010\x00p\x00t\x00a\x00l\x00 \x00\ e\x00t\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Sto\ p/Cancel Downloa\ d\x07\x00\x00\x00\x10mainwindow\ _ui_tr\x01\x03\x00\x00\x00\x22\x010\x00n\ \x00d\x00i\x00r\x00d\x00i\x00k\x00t\x00e\ \x00n\x00 \x00s\x00o\x00n\x00r\x00a\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0eAfter do\ wnload\x07\x00\x00\x00\x0eprogr\ ess_ui_tr\x01\x03\x00\x00\x00\x0c\x00\ U\x00y\x00g\x00u\x00l\x00a\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x05Apply\x07\x00\x00\x00\x0ep\ rogress_ui_tr\x01\x03\x00\ \x00\x00\x1e\x010\x00n\x00d\x00i\x00r\x00m\x00\ e\x00 \x00B\x00i\x00l\x00g\x00i\x00s\x00\ i\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Downl\ oad Information\x07\ \x00\x00\x00\x0eprogress_ui_\ tr\x01\x03\x00\x00\x00&\x010\x00n\x00d\x00i\ \x00r\x00m\x00e\x00 \x00S\x00e\x00\xe7\x00e\ \x00n\x00e\x00k\x00l\x00e\x00r\x00i\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x10Download\ Options\x07\x00\x00\x00\x0epro\ gress_ui_tr\x01\x03\x00\x00\x00\ \x14\x010\x00n\x00d\x00i\x00r\x00i\x00l\x00\ d\x00i\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0bD\ ownloaded:\x07\x00\x00\x00\x0ep\ rogress_ui_tr\x01\x03\x00\ \x00\x00&\x00T\x00a\x00h\x00m\x00i\x00n\x00\ i\x00 \x00k\x00a\x00l\x00a\x00n\x00 \x00\ s\x00\xfc\x00r\x00e\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x14Estimated tim\ e left:\x07\x00\x00\x00\x0eprog\ ress_ui_tr\x01\x03\x00\x00\x00,\ \x00B\x00a\x01\x1f\x00l\x00a\x00n\x00t\x011\ \x00l\x00a\x00r\x011\x00n\x00 \x00S\x00a\ \x00y\x011\x00s\x011\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x17Number of \ connections: \x07\x00\x00\ \x00\x0eprogress_ui_tr\ \x01\x03\x00\x00\x00\x0e\x00A\x00r\x00a\x00 \x00v\ \x00e\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Pa\ use\x07\x00\x00\x00\x0eprogress\ _ui_tr\x01\x03\x00\x00\x00:\x00P\x00e\ \x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\ \x00 \x010\x00n\x00d\x00i\x00r\x00m\x00e\ \x00 \x00Y\x00\xf6\x00n\x00e\x00t\x00i\x00c\ \x00i\x00s\x00i\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1b\ Persepolis Downl\ oad Manager\x07\x00\x00\x00\x0e\ progress_ui_tr\x01\x03\ \x00\x00\x00.\x00K\x00a\x00l\x00d\x011\x01\x1f\ \x011\x00 \x00Y\x00e\x00r\x00d\x00e\x00n\ \x00 \x00D\x00e\x00v\x00a\x00m\x00 \x00E\ \x00t\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Resu\ me\x07\x00\x00\x00\x0eprogress_\ ui_tr\x01\x03\x00\x00\x00\x0a\x00K\x00a\x00\ p\x00a\x00t\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09S\ hut Down\x07\x00\x00\x00\x0epro\ gress_ui_tr\x01\x03\x00\x00\x00\ \x0e\x00D\x00u\x00r\x00u\x00m\x00:\x00 \x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x08Status:\ \x07\x00\x00\x00\x0eprogress_u\ i_tr\x01\x03\x00\x00\x00\x0c\x00D\x00u\x00r\ \x00d\x00u\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04\ Stop\x07\x00\x00\x00\x0eprogres\ s_ui_tr\x01\x03\x00\x00\x00\x1c\x00A\x00\ k\x00t\x00a\x00r\x011\x00m\x00 \x00h\x01\ 1\x00z\x011\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0fTransfer rate\ : \x07\x00\x00\x00\x0eprogress_\ ui_tr\x01\x03\x00\x00\x00\xac\x00<\x00b\x00\ >\x00<\x00c\x00e\x00n\x00t\x00e\x00r\x00\ >\x00B\x00u\x00 \x00k\x011\x00s\x00a\x00\ y\x00o\x00l\x00 \x00d\x00a\x00h\x00a\x00\ \x00\xf6\x00n\x00c\x00e\x00 \x00k\x00u\x00\ l\x00l\x00a\x00n\x011\x00l\x00m\x011\x01\ _\x00t\x011\x00r\x00!\x00 \x00 \x00 \x00\ \x00D\x00i\x01\x1f\x00e\x00r\x00 \x00b\x00\ i\x00r\x00i\x00n\x00i\x00 \x00k\x00u\x00\ l\x00l\x00a\x00n\x011\x00n\x00!\x00<\x00\ /\x00c\x00e\x00n\x00t\x00e\x00r\x00>\x00\ <\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ _
This\ shortcut has be\ en used before! \ \ Use another o\ ne!
\ \x07\x00\x00\x00\x11setting_src\ _ui_tr\x01\x03\x00\x00\x00f\x00<\x00h\ \x00t\x00m\x00l\x00>\x00<\x00h\x00e\x00a\ \x00d\x00/\x00>\x00<\x00b\x00o\x00d\x00y\ \x00>\x00<\x00p\x00>\x00B\x00i\x00\xe7\x00i\ \x00m\x00 \x00S\x00S\x00:\x00D\x00D\x00<\ \x00/\x00p\x00>\x00<\x00/\x00b\x00o\x00d\ \x00y\x00>\x00<\x00/\x00h\x00t\x00m\x00l\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x004<\ p>Format HH:MM\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x98\x00<\x00h\x00t\x00m\ \x00l\x00>\x00<\x00h\x00e\x00a\x00d\x00/\ \x00>\x00<\x00b\x00o\x00d\x00y\x00>\x00<\ \x00p\x00>\x00Z\x00a\x00m\x00a\x00n\x00 \ \x00a\x01_\x011\x00m\x011\x00n\x011\x00 \ \x00s\x00a\x00n\x00i\x00y\x00e\x00 \x00o\ \x00l\x00a\x00r\x00a\x00k\x00 \x00a\x00y\ \x00a\x00r\x00l\x00a\x00.\x00 \x00<\x00/\ \x00p\x00>\x00<\x00/\x00b\x00o\x00d\x00y\ \x00>\x00<\x00/\x00h\x00t\x00m\x00l\x00>\ \x08\x00\x00\x00\x00\x06\x00\x00\x00@\

\ Set timeout in s\ econds.

\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\xae\x00<\x00h\x00t\x00m\x00l\x00>\x00<\ \x00h\x00e\x00a\x00d\x00/\x00>\x00<\x00b\ \x00o\x00d\x00y\x00>\x00<\x00p\x00>\x00B\ \x00u\x00 \x00\xf6\x00z\x00e\x00l\x00l\x00i\ \x00k\x00 \x00i\x01_\x00l\x00e\x00t\x00i\ \x00m\x00 \x00s\x00i\x00s\x00t\x00e\x00m\ \x00i\x00n\x00i\x00z\x00d\x00e\x00 \x00\xe7\ \x00a\x00l\x011\x01_\x00m\x00a\x00y\x00a\ \x00b\x00i\x00l\x00i\x00r\x00.\x00<\x00/\ \x00p\x00>\x00<\x00/\x00b\x00o\x00d\x00y\ \x00>\x00<\x00/\x00h\x00t\x00m\x00l\x00>\ \x08\x00\x00\x00\x00\x06\x00\x00\x00[\

\ This feature may\ not work in you\ r operating syst\ em.

\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\xe8\x00<\x00\ h\x00t\x00m\x00l\x00>\x00<\x00h\x00e\x00\ a\x00d\x00/\x00>\x00<\x00b\x00o\x00d\x00\ y\x00>\x00<\x00p\x00>\x00B\x00i\x00r\x00\ d\x00e\x00n\x00 \x00f\x00a\x00z\x00l\x00\ a\x00 \x00b\x00a\x01\x1f\x00l\x00a\x00n\x00\ t\x011\x00 \x00k\x00u\x00l\x00l\x00a\x00\ n\x00m\x00a\x00k\x00,\x00 \x00i\x00n\x00\ d\x00i\x00r\x00m\x00e\x00n\x00i\x00z\x00\ i\x00 \x00h\x011\x00z\x00l\x00a\x00n\x00\ d\x011\x00r\x00m\x00a\x00y\x00a\x00 \x00\ y\x00a\x00r\x00d\x011\x00m\x00c\x011\x00\ \x00o\x00l\x00a\x00b\x00i\x00l\x00i\x00\ r\x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00\ o\x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00\ m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00c<\ html>

Using multi\ ple connections \ can help speed u\ p your download.\

\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x0a\x010\x00p\x00t\ \x00a\x00l\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Ca\ ncel\x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\x10\x00D\x00e\ \x01\x1f\x00i\x01_\x00t\x00i\x00r\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x06Change\x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x1a\x00R\x00e\x00n\x00k\x00 \x01_\ \x00e\x00m\x00a\x00s\x011\x00:\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0eColor sc\ heme: \x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x1a\x00V\ \x00a\x00r\x00s\x00a\x00y\x011\x00l\x00a\ \x00n\x00l\x00a\x00r\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x08Defaults\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00&\x010\x00n\x00d\x00i\x00r\x00m\x00e\ \x00 \x00S\x00e\x00\xe7\x00e\x00n\x00e\x00k\ \x00l\x00e\x00r\x00i\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x10Download Optio\ ns\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x16\x00Y\x00a\x00z\ \x011\x00 \x00t\x00i\x00p\x00i\x00:\x00 \ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Font: \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00`\x00K\x00a\x00p\x00a\ \x00t\x00 \x00d\x00\xfc\x01\x1f\x00m\x00e\x00s\ \x00i\x00 \x00t\x011\x00k\x00l\x00a\x00n\ \x00d\x011\x01\x1f\x011\x00n\x00d\x00a\x00 \ \x00a\x00n\x00a\x00 \x00p\x00e\x00n\x00c\ \x00e\x00r\x00e\x00y\x00i\x00 \x00g\x00i\ \x00z\x00l\x00e\x00.\x08\x00\x00\x00\x00\x06\x00\x00\ \x00)Hide main wind\ ow if close butt\ on clicked.\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x14\x00S\x00i\x00m\x00g\x00e\x00l\x00\ e\x00r\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x07Icons: \x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00&\ \x00S\x00i\x00s\x00t\x00e\x00m\x00i\x00 \ \x00u\x00y\x00a\x00n\x011\x00k\x00 \x00t\ \x00u\x00t\x00!\x08\x00\x00\x00\x00\x06\x00\x00\x00\x12\ Keep system awak\ e!\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x1e\x00B\x00i\x00l\ \x00d\x00i\x00r\x00i\x00m\x00 \x00t\x00\xfc\ \x00r\x00\xfc\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x13Notification t\ ype: \x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x16\x00B\x00\ i\x00l\x00d\x00i\x00r\x00i\x00m\x00l\x00\ e\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dNot\ ifications\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00,\x00B\x00a\x01\x1f\x00l\x00a\x00n\x00t\ \x011\x00l\x00a\x00r\x011\x00n\x00 \x00S\ \x00a\x00y\x011\x00s\x011\x00:\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x17Number o\ f connections: \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00\x1e\x00D\x00e\x00n\x00e\x00\ m\x00e\x00 \x00s\x00a\x00y\x011\x00s\x01\ 1\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x11N\ umber of tries: \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x0a\x00T\x00a\x00m\x00a\ \x00m\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00\x12\x00T\x00e\x00r\x00c\x00i\ \x00h\x00l\x00e\x00r\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0bPreferences\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00$\x00Y\x00e\x00n\x00i\x00 \x00\ t\x00u\x01_\x00l\x00a\x00r\x00a\x00 \x00\ b\x00a\x00s\x011\x00n\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0ePress new key\ s\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00B\x00B\x00a\x01_\x00\ l\x00a\x00n\x00g\x011\x00\xe7\x00t\x00a\x00\ \x00P\x00e\x00r\x00s\x00e\x00p\x00o\x00\ l\x00i\x00s\x00'\x00i\x00 \x00\xe7\x00a\x00\ l\x011\x01_\x00t\x011\x00r\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x19Run Persepo\ lis at startup\x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00\x14\x00K\x011\x00s\x00a\x00y\ \x00o\x00l\x00l\x00a\x00r\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x09Shortcuts\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x0e\x00B\x00o\x00y\x00u\x00t\x00\ :\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Siz\ e: \x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00\x0a\x00D\x00u\x00\ r\x00u\x00m\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06S\ tatus\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x0c\x00T\x00\ a\x00r\x00z\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x07Style: \x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00,\x00Z\x00a\x00m\x00a\x00n\x00 \x00a\ \x01_\x011\x00m\x011\x00 \x00(\x00s\x00a\ \x00n\x00i\x00y\x00e\x00)\x00:\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x13Timeout \ (seconds): \x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x000\x00V\x00i\x00d\x00e\x00o\x00 \x00\ B\x00u\x00l\x00u\x00c\x00u\x00 \x00S\x00\ e\x00\xe7\x00e\x00n\x00e\x00k\x00l\x00e\x00\ r\x00i\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Vid\ eo Finder Option\ s\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x0e\x00H\x00a\x00c\x00\ i\x00m\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x08Volume: \x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ 2\x010\x00n\x00d\x00i\x00r\x00m\x00e\x00\ \x00D\x00i\x00z\x00i\x00n\x00i\x00n\x00\ i\x00 \x00D\x00e\x01\x1f\x00i\x01_\x00t\x00\ i\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Cha\ nge Download Fol\ der\x07\x00\x00\x00\x0atext_ui_\ tr\x01\x03\x00\x00\x00\x06\x00I\x00P\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x03IP:\x07\x00\x00\x00\x0a\ text_ui_tr\x01\x03\x00\x00\x00:\ \x00P\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x00 \x010\x00n\x00d\x00i\x00r\ \x00m\x00e\x00 \x00Y\x00\xf6\x00n\x00e\x00t\ \x00i\x00c\x00i\x00s\x00i\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1bPersepolis D\ ownload Manager\x07\ \x00\x00\x00\x0atext_ui_tr\x01\x03\ \x00\x00\x00\x22\x00B\x00a\x01\x1f\x00l\x00a\x00n\ \x00t\x011\x00 \x00n\x00o\x00k\x00t\x00a\ \x00s\x011\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05\ Port:\x07\x00\x00\x00\x0atext_u\ i_tr\x01\x03\x00\x00\x006\x00<\x00b\x00>\ \x00S\x00e\x00s\x00 \x00d\x00o\x00s\x00y\ \x00a\x00s\x011\x00 \x00d\x00u\x00r\x00u\ \x00m\x00u\x00:\x00 \x00<\x00/\x00b\x00>\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aAud\ io file status: \ \x07\x00\x00\x00\x1bvideo_f\ inder_progress_u\ i_tr\x01\x03\x00\x00\x002\x00<\x00b\x00>\ \x00\xc7\x00o\x01\x1f\x00u\x00l\x00l\x00a\x00m\ \x00a\x00 \x00d\x00u\x00r\x00u\x00m\x00u\ \x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x16Muxing \ status: \x07\x00\x00\x00\ \x1bvideo_finder_pr\ ogress_ui_tr\x01\x03\x00\x00\ \x00:\x00<\x00b\x00>\x00V\x00i\x00d\x00e\ \x00o\x00 \x00d\x00o\x00s\x00y\x00a\x00s\ \x011\x00 \x00d\x00u\x00r\x00u\x00m\x00u\ \x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x1aVideo f\ ile status: \ \x07\x00\x00\x00\x1bvideo_finde\ r_progress_ui_tr\ \x01\ \x00\x001S\ <\ \xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\xa7\ \x00\x00\x00\x02arB\x00\x00\x03\xd8\x00\x00\x05;\x00\ \x00\x03\xc0\x00\x00\x05;\x00\x00\x086\x00\x00\x05;\x00\ \x00'\xb2\x00\x00N:\x00\x00+\x10\x00\x04\xcf\x04\x00\ \x00\x17[\x00\x04\xe3\xc0\x00\x00\x07z\x00\x050K\x00\ \x00\x07\xbc\x00\x05\xab`\x00\x00\x1d\xdc\x00Hw9\x00\ \x00\x16a\x00Hw9\x00\x00\x1a\xc5\x00V\x8c\x95\x00\ \x00\x1c\x80\x00Wiz\x00\x00\x08^\x00Wiz\x00\ \x00+\xb4\x00W\x96\xf9\x00\x00\x08\x93\x00\x97\xa2\x10\x00\ \x00\x04\xdd\x00\xc2\xad\xd0\x00\x00\x0f\x05\x01\x18\xab\xd4\x00\ \x00\x16\x95\x01\x8bp\x0e\x00\x00!H\x02S\xd0\x00\x00\ \x00\x0a-\x02\x9a\xf5p\x00\x00\x0f]\x02\xf9\xc5\xc5\x00\ \x00\x03\x8d\x03\x0d1^\x00\x00\x0b\xbe\x03\x1c\xc5*\x00\ \x00\x1b\x9b\x03<\x83\x03\x00\x00\x07\xee\x03KF\xe3\x00\ \x00\x1bL\x03KF\xe3\x00\x00$\xb2\x03\x92\xd2\xce\x00\ \x00%2\x03\xdc\xdc%\x00\x00\x0d\x0c\x04]I3\x00\ \x00(\x19\x04e\xac\xf5\x00\x00\x17\x16\x04\x98I\xbc\x00\ \x00\x05x\x04\x98I\xbc\x00\x00#\xc4\x04\x9e\x84\xd5\x00\ \x00#\xf6\x04\xd6W\xc0\x00\x00%\x00\x05\x13\xccT\x00\ \x00\x13\xeb\x05_. \x00\x00\x13\x1d\x05_\xa8`\x00\ \x00\x10\x1e\x05i<\xfe\x00\x00\x14\xf1\x05t\x96\x00\x00\ \x00\x08\xca\x05v\x1b\x9e\x00\x00\x0d]\x05\x8c\xac5\x00\ \x00\x1d&\x05\xa1\x08\xc0\x00\x00)!\x05\xa3\x9c>\x00\ \x00\x14\x90\x05\xa3\x9c>\x00\x00,^\x05\xa8X\xf3\x00\ \x00\x03\x09\x05\xaa\x8b\xc3\x00\x00)U\x06-B\x0e\x00\ \x00\x14#\x06-B\x0e\x00\x00+\xe6\x069\x82N\x00\ \x00\x15C\x069\x82N\x00\x00,\xca\x06<=\x10\x00\ \x00*\x81\x06]1\xde\x00\x00\x02\x02\x06\x9aK\x00\x00\ \x00\x0ab\x06\x9a\xf5C\x00\x00(\xe2\x06\x9c(\x01\x00\ \x00&\x1a\x06\xb6\xbe`\x00\x00\x06\x14\x06\xc5)*\x00\ \x00\x1b\xd7\x06\xcc\xd6\xa3\x00\x00\x18\x8c\x06\xdcS\xa3\x00\ \x00\x06h\x07\x14*\x1e\x00\x00\x19\x1b\x076\xcf`\x00\ \x00\x06\xe2\x07[&u\x00\x00\x10\xd5\x07\x9b]0\x00\ \x00'[\x07\x9c1\x03\x00\x00*#\x08g-\xa2\x00\ \x00\x0c?\x08\xf6\x88`\x00\x00\x09\x1e\x09>\x0d$\x00\ \x00\x1a\x1f\x09^\x89\xd3\x00\x00\x18S\x09`\x06\xb5\x00\ \x00\x19\xde\x09g\x01\xd0\x00\x00)\xbe\x09}R\xc0\x00\ \x00\x07/\x09\x93\xd2\xfe\x00\x00\x1a\xf7\x09\x96F0\x00\ \x00\x11\xc8\x0a\x0c\x87\x0e\x00\x00\x1f\x96\x0a_\xd7\x0e\x00\ \x00\x0a\xa6\x0a_\xf3\xfb\x00\x00\x15\xb4\x0as>\xc3\x00\ \x00\x04M\x0a\x8b\xc3`\x00\x00\x1d\xa3\x0a\x97\x00\x80\x00\ \x00\x09\xd9\x0a\xa2Yp\x00\x00(k\x0a\xc0(\x90\x00\ \x00)\x89\x0b`r`\x00\x00&t\x0bn\xb1\xee\x00\ \x00\x22u\x0bv\x04\xf0\x00\x00\x0e\xa6\x0b\x89w\x94\x00\ \x00\x16\x18\x0b\x89w\x94\x00\x00\x1a~\x0b\xc8\xc7\x13\x00\ \x00$r\x0b\xf9\x95\xb3\x00\x00\x11)\x0c(\x19\x04\x00\ \x00\x18\xc9\x0c2\xc0S\x00\x00\x03S\x0cP\xdb[\x00\ \x00\x04\x8a\x0ce\x0f.\x00\x00\x19\x96\x0ce\x0f.\x00\ \x00\x1d]\x0c\x96q\xc0\x00\x00\x0b\x13\x0c\x96q\xc0\x00\ \x00\x0f\xcc\x0c\x99e\x80\x00\x00\x12\x05\x0c\xb5\x86\x80\x00\ \x00\x1c*\x0c\xb5\x86\x80\x00\x00'\x06\x0c\xdd\xc2\x03\x00\ \x00'\xda\x0c\xe0\x1a\xf3\x00\x00&\xc5\x0c\xfb\xe0\x8a\x00\ \x00\x12=\x0dq\x98\xde\x00\x00\x00\x00\x0d\x99\xf9B\x00\ \x00\x03\xe6\x0d\x99\xf9B\x00\x00\x0c\x9c\x0d\x99\xf9B\x00\ \x00\x17\xe7\x0d\x99\xf9B\x00\x00\x1c\xbc\x0d\x99\xf9B\x00\ \x00+N\x0e i\x22\x00\x00\x13\xa2\x0e.d\xa4\x00\ \x00\x17\x8c\x0e7I\xc3\x00\x00\x05,\x0ex\xa8B\x00\ \x00\x05\xaa\x0ex\xa8B\x00\x00*\xb7\x0e\xc4J\xf0\x00\ \x00\x09x\x0e\xda\xd4\xfe\x00\x00\x1eU\x0f6\xb6\x90\x00\ \x00\x10r\x0f}\x11p\x00\x00\x0be\x0f\xa6V\x80\x00\ \x00%\xdd\x0f\xa7\xb6\x04\x00\x00\x11w\x0f\xac[\xee\x00\ \x00\x12\xad\x0f\xd1?\x00\x00\x00\x1e\x0d\x0f\xd6\xe5\xde\x00\ \x00 \x5c\x0f\xde{\xf0\x00\x00$(\x0f\xf3\x03\x0e\x00\ \x00\x00\xfbi\x00\x00-F\x03\x00\x00\x00\x92\x00<\x00\ a\x00 \x00h\x00r\x00e\x00f\x00=\x00h\x00\ t\x00t\x00p\x00s\x00:\x00/\x00/\x00p\x00\ e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00\ s\x00d\x00m\x00.\x00g\x00i\x00t\x00h\x00\ u\x00b\x00.\x00i\x00o\x00>\x00h\x00t\x00\ t\x00p\x00s\x00:\x00/\x00/\x00p\x00e\x00\ r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00\ d\x00m\x00.\x00g\x00i\x00t\x00h\x00u\x00\ b\x00.\x00i\x00o\x00<\x00/\x00a\x00>\x08\ \x00\x00\x00\x00\x06\x00\x00\x00I
\ https://persepol\ isdm.github.io\x07\x00\x00\x00\x0babout_ui_\ tr\x01\x03\x00\x00\x00\x9a\x00<\x00a\x00 \x00h\ \x00r\x00e\x00f\x00=\x00h\x00t\x00t\x00p\ \x00s\x00:\x00/\x00/\x00t\x00e\x00l\x00e\ \x00g\x00r\x00a\x00m\x00.\x00m\x00e\x00/\ \x00p\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x00d\x00m\x00>\x00h\x00t\x00t\ \x00p\x00s\x00:\x00/\x00/\x00t\x00e\x00l\ \x00e\x00g\x00r\x00a\x00m\x00.\x00m\x00e\ \x00/\x00p\x00e\x00r\x00s\x00e\x00p\x00o\ \x00l\x00i\x00s\x00d\x00m\x00<\x00/\x00a\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00Mhttps://tel\ egram.me/persepo\ lisdm\x07\x00\x00\x00\x0bab\ out_ui_tr\x01\x03\x00\x00\x00\x9a\x00\ <\x00a\x00 \x00h\x00r\x00e\x00f\x00=\x00\ h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00\ t\x00w\x00i\x00t\x00t\x00e\x00r\x00.\x00\ c\x00o\x00m\x00/\x00p\x00e\x00r\x00s\x00\ e\x00p\x00o\x00l\x00i\x00s\x00d\x00m\x00\ >\x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00\ /\x00t\x00w\x00i\x00t\x00t\x00e\x00r\x00\ .\x00c\x00o\x00m\x00/\x00p\x00e\x00r\x00\ s\x00e\x00p\x00o\x00l\x00i\x00s\x00d\x00\ m\x00<\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00Mhttp\ s://twitter.com/\ persepolisdm\ \x07\x00\x00\x00\x0babout_ui_tr\ \x01\x03\x00\x00\x00\x1a\x06-\x06H\x06D\x00 \x06(\ \x06J\x061\x063\x06J\x06(\x06H\x06D\x063\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x10About \ Persepolis\x07\x00\x00\x00\x0ba\ bout_ui_tr\x01\x03\x00\x00\x00\x10\ \x06'\x06D\x06E\x067\x06H\x061\x06H\x06F\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aDevelo\ pers\x07\x00\x00\x00\x0babout_u\ i_tr\x01\x03\x00\x00\x00\x0c\x06'\x06D\x061\ \x06.\x065\x06)\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07\ License\x07\x00\x00\x00\x0babou\ t_ui_tr\x01\x03\x00\x00\x00\x04\x06*\x06\ E\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\x07\x00\x00\ \x00\x0babout_ui_tr\x01\x03\x00\ \x00\x00,\x06E\x06/\x06J\x061\x00 \x06'\x06\ D\x06*\x06-\x06E\x06J\x06D\x00 \x06(\x06\ J\x061\x063\x06J\x06(\x06H\x06D\x063\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x1bPersepo\ lis Download Man\ ager\x07\x00\x00\x00\x0babout_u\ i_tr\x01\x03\x00\x00\x00\x12\x06'\x06D\x06E\ \x06*\x061\x06,\x06E\x06H\x06F\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0bTranslator\ s\x07\x00\x00\x00\x0babout_ui_t\ r\x01\x03\x00\x00\x00 \x06%\x066\x06'\x06A\x06\ )\x00 \x061\x06'\x06(\x067\x00 \x06*\x06\ -\x06E\x06J\x06D\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x11Add Download Li\ nk\x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00\x1c\x06%\x066\x06'\ \x06A\x06)\x00 \x06%\x06D\x06I\x00 \x06A\ \x06&\x06)\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11\ Add to category:\ \x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00\x1a\x06.\x06J\x06'\x06\ 1\x06'\x06*\x00 \x06E\x06*\x06B\x06/\x06\ E\x06)\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Adv\ anced Options\x07\x00\x00\ \x00\x0daddlink_ui_tr\x01\ \x03\x00\x00\x00\x0a\x06%\x06D\x06:\x06'\x06!\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x06Cancel\x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x002\x06*\x069\x06/\x06J\x06\ D\x00 \x06E\x06C\x06'\x06F\x00 \x06*\x06\ -\x06E\x06J\x06D\x00 \x06'\x06D\x06E\x06\ D\x06A\x06'\x06*\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x16Change Downlo\ ad Folder\x07\x00\x00\x00\x0dad\ dlink_ui_tr\x01\x03\x00\x00\x00\ \x06*\x069\x06/\x06J\x06D\x00 \x06'\x06\ 3\x06E\x00 \x06'\x06D\x06E\x06D\x06A\x00\ :\x08\x00\x00\x00\x00\x06\x00\x00\x00\x12Chang\ e file name: \x07\x00\x00\ \x00\x0daddlink_ui_tr\x01\ \x03\x00\x00\x00<\x06'\x06C\x06*\x064\x06'\x06\ A\x00 \x06%\x069\x06/\x06'\x06/\x06'\x06\ *\x00 \x06'\x06D\x06(\x061\x06H\x06C\x06\ 3\x06J\x00 \x06D\x06D\x06F\x068\x06'\x06\ E\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1cDetec\ t System Proxy S\ ettings\x07\x00\x00\x00\x0daddl\ ink_ui_tr\x01\x03\x00\x00\x00\x1a\x06\ E\x06,\x06D\x06/\x00 \x06'\x06D\x06*\x06\ -\x06E\x06J\x06D\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x11Download Fold\ er: \x07\x00\x00\x00\x0daddlink\ _ui_tr\x01\x03\x00\x00\x00\x1a\x061\x06'\ \x06(\x067\x00 \x06'\x06D\x06*\x06-\x06E\ \x06J\x06D\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0f\ Download link: \x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x00\x1c\x069\x06F\x06H\x06'\x06\ F\x00 \x06'\x06D\x06\x22\x06J\x00 \x06(\x06\ J\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04IP:\ \x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00\x0c\x06'\x06D\x061\x06\ '\x06(\x067\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04L\ ink\x07\x00\x00\x00\x0daddlink_\ ui_tr\x01\x03\x00\x00\x00\x1a\x06.\x06J\x06\ '\x061\x06'\x06*\x00 \x06%\x066\x06'\x06\ A\x06J\x06)\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0cM\ ore Options\x07\x00\x00\x00\x0d\ addlink_ui_tr\x01\x03\x00\ \x00\x00\x04\x06*\x06E\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x02OK\x07\x00\x00\x00\x0daddlink_\ ui_tr\x01\x03\x00\x00\x00\x0e\x06'\x06D\x06\ E\x06F\x06A\x060\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x05Port:\x07\x00\x00\x00\x0dadd\ link_ui_tr\x01\x03\x00\x00\x00\x10\ \x06'\x06D\x06(\x061\x06H\x06C\x063\x06J\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Proxy\x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x00\x22\x06C\x06D\x06E\x06)\x00\ \x063\x061\x00 \x06'\x06D\x06(\x061\x06\ H\x06C\x063\x06J\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x10Proxy passwor\ d: \x07\x00\x00\x00\x0daddlink_\ ui_tr\x01\x03\x00\x00\x00(\x06'\x063\x06\ E\x00 \x06E\x063\x06*\x06.\x06/\x06E\x00\ \x06D\x06D\x06(\x061\x06H\x06C\x063\x06\ J\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Pro\ xy username: \x07\x00\x00\ \x00\x0daddlink_ui_tr\x01\ \x03\x00\x00\x00\x22\x00<\x00b\x00>\x06'\x063\x06\ E\x00 \x06'\x06D\x06E\x06D\x06A\x00<\x00\ /\x00b\x00>\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x12File name: \x07\x00\x00\x00\x18after_do\ wnload_src_ui_tr\ \x01\x03\x00\x00\x00\x1a\x00<\x00b\x00>\x06'\x06D\ \x06-\x06,\x06E\x00<\x00/\x00b\x00>\x00:\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dSiz\ e: \x07\x00\x00\x00\x18afte\ r_download_src_u\ i_tr\x01\x03\x00\x00\x00\x04\x06*\x06E\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x08 OK \ \x07\x00\x00\x00\x14after_downl\ oad_ui_tr\x01\x03\x00\x00\x00\x0e\x06\ A\x06*\x06-\x00 \x06E\x06D\x06A\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0d Open Fi\ le \x07\x00\x00\x00\x14after_d\ ownload_ui_tr\x01\x03\x00\ \x00\x00*\x00<\x00b\x00>\x06'\x06C\x06*\x06\ E\x06D\x00 \x06'\x06D\x06*\x06-\x06E\x06\ J\x06D\x00!\x00<\x00/\x00b\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x1aDownlo\ ad Completed!\x07\x00\x00\x00\x14after_down\ load_ui_tr\x01\x03\x00\x00\x00\x1c\ \x00<\x00b\x00>\x06'\x06D\x061\x06'\x06(\ \x067\x00<\x00/\x00b\x00>\x00:\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0dLink: \x07\x00\x00\x00\x14after_do\ wnload_ui_tr\x01\x03\x00\x00\ \x00 \x00<\x00b\x00>\x06-\x06A\x068\x00 \ \x06(\x06'\x063\x06E\x00<\x00/\x00b\x00>\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10S\ ave as: \x07\x00\x00\x00\ \x14after_download_\ ui_tr\x01\x03\x00\x00\x00:\x06D\x06'\x00\ \x06*\x069\x061\x066\x00 \x06G\x060\x06\ G\x00 \x06'\x06D\x061\x063\x06'\x06D\x06\ )\x00 \x06E\x061\x06)\x00 \x06#\x06.\x06\ 1\x06I\x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1eD\ on't show this m\ essage again.\x07\x00\x00\ \x00\x14after_download\ _ui_tr\x01\x03\x00\x00\x00 \x06A\x06*\ \x06-\x00 \x06E\x06,\x06D\x06/\x00 \x06'\ \x06D\x06*\x06-\x06E\x06J\x06D\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x14Open Downl\ oad Folder\x07\x00\x00\x00\x14a\ fter_download_ui\ _tr\x01\x03\x00\x00\x00,\x06E\x06/\x06J\x06\ 1\x00 \x06'\x06D\x06*\x06-\x06E\x06J\x06\ D\x00 \x06(\x06J\x061\x063\x06J\x06(\x06\ H\x06D\x063\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bP\ ersepolis Downlo\ ad Manager\x07\x00\x00\x00\x14a\ fter_download_ui\ _tr\x01\x03\x00\x00\x00 \x06'\x06D\x06%\x06\ (\x06D\x06'\x06:\x00 \x069\x06F\x00 \x06\ E\x064\x06C\x06D\x06)\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0cReport Issue\x07\ \x00\x00\x00\x10log_window_u\ i_tr\x01\x03\x00\x00\x00\xae\x00<\x00b\x00>\ \x00<\x00c\x00e\x00n\x00t\x00e\x00r\x00>\ \x06D\x06B\x06/\x00 \x06*\x06E\x00 \x06%\ \x066\x06'\x06A\x06)\x00 \x06G\x060\x06'\ \x00 \x06'\x06D\x061\x06'\x06(\x067\x00 \ \x06E\x06F\x00 \x06B\x06(\x06D\x00!\x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x06G\ \x06D\x00 \x06*\x061\x06J\x06/\x00 \x06%\ \x066\x06'\x06A\x06*\x06G\x00 \x06E\x061\ \x06)\x00 \x06#\x06.\x061\x06I\x06\x1f\x00<\ \x00/\x00c\x00e\x00n\x00t\x00e\x00r\x00>\ \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\ \x00r
Thi\ s link has been \ added before! \ \ Are you sure yo\ u want to add it\ again?
\
\x07\x00\x00\x00\x14mainwin\ dow_src_ui_tr\x01\x03\x00\ \x00\x00\x22\x00<\x00b\x00>\x06'\x06D\x06'\x06\ *\x065\x06'\x06D\x06'\x06*\x00<\x00/\x00\ b\x00>\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14<\ b>Connections: \x07\x00\x00\x00\x14mainwind\ ow_src_ui_tr\x01\x03\x00\x00\ \x00\x1c\x00<\x00b\x00>\x06'\x06D\x06E\x06-\ \x06E\x06D\x00<\x00/\x00b\x00>\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x13Downl\ oaded: \x07\x00\x00\x00\x14\ mainwindow_src_u\ i_tr\x01\x03\x00\x00\x00*\x00<\x00b\x00>\ \x06'\x06D\x06H\x06B\x06*\x00 \x06'\x06D\ \x06E\x06*\x06(\x06B\x06J\x00<\x00/\x00b\ \x00>\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1cEstimated time \ left
: \x07\x00\x00\x00\x14m\ ainwindow_src_ui\ _tr\x01\x03\x00\x00\x00\x1c\x00<\x00b\x00>\x06\ '\x06D\x061\x06'\x06(\x067\x00<\x00/\x00\ b\x00>\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d<\ b>Link
: \x07\x00\x00\x00\ \x14mainwindow_src_\ ui_tr\x01\x03\x00\x00\x00\x1c\x00<\x00b\x00\ >\x06'\x06D\x06-\x06'\x06D\x06)\x00<\x00\ /\x00b\x00>\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0fStatus: \ \x07\x00\x00\x00\x14mainwindow_\ src_ui_tr\x01\x03\x00\x00\x00$\x00\ <\x00b\x00>\x06E\x069\x06/\x06D\x00 \x06\ '\x06D\x06F\x06B\x06D\x00<\x00/\x00b\x00\ >\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16\ Transfer rate: \x07\x00\x00\x00\x14mainwind\ ow_src_ui_tr\x01\x03\x00\x00\ \x00\x1a\x06'\x06C\x06*\x06E\x06D\x00 \x06'\ \x06D\x06*\x06-\x06E\x06J\x06D\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x11Download C\ omplete\x07\x00\x00\x00\x14main\ window_src_ui_tr\ \x01\x03\x00\x00\x00\x16\x06(\x06/\x06!\x00 \x06'\ \x06D\x06*\x06-\x06E\x06J\x06D\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0fDownload S\ tarts\x07\x00\x00\x00\x14mainwi\ ndow_src_ui_tr\x01\x03\ \x00\x00\x00\x18\x06*\x06H\x06B\x06A\x00 \x06'\ \x06D\x06*\x06-\x06E\x06J\x06D\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x10Download S\ topped\x07\x00\x00\x00\x14mainw\ indow_src_ui_tr\x01\ \x03\x00\x00\x00\x0c\x06.\x067\x06#\x00 \x00-\x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x08Error\ - \x07\x00\x00\x00\x14mainwind\ ow_src_ui_tr\x01\x03\x00\x00\ \x00\x08\x06.\x067\x06#\x00:\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x07Error: \x07\x00\x00\x00\x14\ mainwindow_src_u\ i_tr\x01\x03\x00\x00\x00.\x06D\x06'\x00 \ \x06J\x06H\x06,\x06/\x00 \x06E\x063\x06'\ \x06-\x06)\x00 \x06C\x06'\x06A\x06J\x06)\ \x00 \x06A\x06J\x00:\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x19Not enough fre\ e space in:\x07\x00\x00\x00\x14\ mainwindow_src_u\ i_tr\x01\x03\x00\x00\x00*\x06D\x06E\x00 \ \x06*\x06*\x06E\x00 \x06'\x06D\x069\x06E\ \x06D\x06J\x06)\x00 \x06(\x06F\x06,\x06'\ \x06-\x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1dOp\ eration was not \ successful.\x07\x00\x00\x00\x14\ mainwindow_src_u\ i_tr\x01\x03\x00\x00\x006\x06J\x061\x06,\ \x06I\x00 \x06'\x063\x06*\x06C\x06E\x06'\ \x06D\x00 \x06'\x06D\x06A\x06&\x06)\x00 \ \x06'\x06D\x06*\x06'\x06D\x06J\x06)\x00:\ \x08\x00\x00\x00\x00\x06\x00\x00\x00&Please\ resume the foll\ owing category: \ \x07\x00\x00\x00\x14mainwindow_\ src_ui_tr\x01\x03\x00\x00\x00\x14\x06\ .\x067\x06#\x00 \x06(\x06'\x06D\x06E\x06\ 2\x06,\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0cmux\ ing error\x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00\x08\x06*\x06-\x06E\x06D\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0b downl\ oaded\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00.\ \x00<\x00b\x00>\x06-\x06'\x06D\x06)\x00 \ \x06E\x06D\x06A\x00 \x06'\x06D\x065\x06H\ \x06*\x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1aAudio\ file status: \x07\x00\x00\x00\x10mainwindo\ w_ui_tr\x01\x03\x00\x00\x00&\x00<\x00\ b\x00>\x06-\x06'\x06D\x06)\x00 \x06'\x06\ D\x06E\x062\x06,\x00:\x00 \x00<\x00/\x00\ b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16\ Muxing status: <\ /b>\x07\x00\x00\x00\x10mainwind\ ow_ui_tr\x01\x03\x00\x00\x00\x1e\x00<\ \x00b\x00>\x06'\x06D\x06-\x06'\x06D\x06)\ \x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0fStatus:\ \x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x002\ \x00<\x00b\x00>\x06-\x06'\x06D\x06)\x00 \ \x06E\x06D\x06A\x00 \x06'\x06D\x06A\x06J\ \x06/\x06J\x06H\x00:\x00 \x00<\x00/\x00b\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aV\ ideo file status\ : \x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ *\x06%\x066\x06'\x06A\x06)\x00 \x061\x06\ '\x06(\x067\x00 \x06*\x06-\x06E\x06J\x06\ D\x00 \x06,\x06/\x06J\x06/\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x15Add New Dow\ nload Link\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x00\x16\x06(\x069\x06/\x00 \x06'\x06\ D\x06*\x06-\x06E\x06J\x06D\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0eAfter downl\ oad\x07\x00\x00\x00\x10mainwind\ ow_ui_tr\x01\x03\x00\x00\x00\x0a\x06*\ \x067\x06(\x06J\x06B\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x05Apply\x07\x00\x00\x00\x10main\ window_ui_tr\x01\x03\x00\x00\ \x00:\x06'\x06D\x06*\x06-\x06E\x06J\x06D\ \x00 \x06E\x06F\x00 \x06#\x063\x06A\x06D\ \x00\x0a\x06'\x06D\x06B\x06'\x06&\x06E\x06)\ \x00 \x06#\x06H\x06D\x06'\x06N\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x22Download b\ ottom of\x0a the li\ st first\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00\x18\x06H\x06B\x06*\x00 \x06'\x06D\x06\ '\x06F\x06*\x06G\x06'\x06!\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x08End Time\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00\x08\x06.\x061\x06H\x06,\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x04Exit\x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00(\x06%\x06J\x06B\x06\ '\x06A\x00 \x06'\x06D\x06*\x06-\x06E\x06\ J\x06D\x00 \x06E\x06$\x06B\x06*\x06'\x06\ N\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0ePause\ Download\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00,\x06E\x06/\x06J\x061\x00 \x06'\ \x06D\x06*\x06-\x06E\x06J\x06D\x00 \x06(\ \x06J\x061\x063\x06J\x06(\x06H\x06D\x063\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bPersep\ olis Download Ma\ nager\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00\x0c\ \x06'\x06D\x06*\x06B\x06/\x06E\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x08Progress\x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00\x0e\x06'\x06D\x06.\x06\ 5\x06'\x06&\x065\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0aProperties\x07\x00\x00\x00\x10\ mainwindow_ui_tr\ \x01\x03\x00\x00\x00\x1e\x06'\x063\x06*\x06&\x06F\ \x06'\x06A\x00 \x06'\x06D\x06*\x06-\x06E\ \x06J\x06D\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fRe\ sume Download\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00<\x06%\x068\x06G\x06'\ \x061\x00/\x06%\x06.\x06A\x06'\x06!\x00 \ \x06#\x06J\x06B\x06H\x06F\x06)\x00 \x069\ \x06D\x06(\x06)\x00 \x06'\x06D\x06F\x068\ \x06'\x06E\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aSh\ ow/Hide system t\ ray icon\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00\x1a\x06%\x06J\x06B\x06'\x06A\x00 \x06\ '\x06D\x06*\x064\x06:\x06J\x06D\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x09Shut Down\ \x07\x00\x00\x00\x10mainwindow_\ ui_tr\x01\x03\x00\x00\x00\x12\x06H\x06B\x06\ *\x00 \x06'\x06D\x06(\x06/\x06!\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0aStart Tim\ e\x07\x00\x00\x00\x10mainwindow\ _ui_tr\x01\x03\x00\x00\x00&\x06%\x06J\ \x06B\x06'\x06A\x00/\x06%\x06D\x06:\x06'\ \x06!\x00 \x06'\x06D\x06*\x06-\x06E\x06J\ \x06D\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Stop\ /Cancel Download\ \x07\x00\x00\x00\x10mainwindow_\ ui_tr\x01\x03\x00\x00\x00\x16\x06(\x069\x06\ /\x00 \x06'\x06D\x06*\x06-\x06E\x06J\x06\ D\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0eAfter\ download\x07\x00\x00\x00\x0epr\ ogress_ui_tr\x01\x03\x00\x00\ \x00\x0a\x06*\x067\x06(\x06J\x06B\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x05Apply\x07\x00\x00\x00\x0e\ progress_ui_tr\x01\x03\ \x00\x00\x00\x1e\x06E\x069\x06D\x06H\x06E\x06'\ \x06*\x00 \x06'\x06D\x06*\x06-\x06E\x06J\ \x06D\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Down\ load Information\ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00\x1c\x06.\x06J\x06'\x06\ 1\x06'\x06*\x00 \x06'\x06D\x06*\x06-\x06\ E\x06J\x06D\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10D\ ownload Options\x07\ \x00\x00\x00\x0eprogress_ui_\ tr\x01\x03\x00\x00\x00\x0e\x06'\x06D\x06E\x06-\ \x06E\x06D\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0b\ Downloaded:\x07\x00\x00\x00\x0e\ progress_ui_tr\x01\x03\ \x00\x00\x00\x1c\x06'\x06D\x06H\x06B\x06*\x00 \ \x06'\x06D\x06E\x06*\x06(\x06B\x06J\x00:\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Estima\ ted time left:\x07\x00\ \x00\x00\x0eprogress_ui_t\ r\x01\x03\x00\x00\x00\x1c\x069\x06/\x06/\x00 \x06\ '\x06D\x06'\x06*\x065\x06'\x06D\x06'\x06\ *\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x17Num\ ber of connectio\ ns: \x07\x00\x00\x00\x0eprogres\ s_ui_tr\x01\x03\x00\x00\x00\x14\x06%\x06\ J\x06B\x06'\x06A\x00 \x06E\x06$\x06B\x06\ *\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Pause\ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00,\x06E\x06/\x06J\x06\ 1\x00 \x06'\x06D\x06*\x06-\x06E\x06J\x06\ D\x00 \x06(\x06J\x061\x063\x06J\x06(\x06\ H\x06D\x063\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bP\ ersepolis Downlo\ ad Manager\x07\x00\x00\x00\x0ep\ rogress_ui_tr\x01\x03\x00\ \x00\x00\x0e\x06'\x063\x06*\x06&\x06F\x06'\x06\ A\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Resum\ e\x07\x00\x00\x00\x0eprogress_u\ i_tr\x01\x03\x00\x00\x00\x1a\x06%\x06J\x06B\ \x06'\x06A\x00 \x06'\x06D\x06*\x064\x06:\ \x06J\x06D\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09Sh\ ut Down\x07\x00\x00\x00\x0eprog\ ress_ui_tr\x01\x03\x00\x00\x00\x0e\ \x06'\x06D\x06-\x06'\x06D\x06)\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x08Status: \ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00\x0a\x06%\x06J\x06B\x06\ '\x06A\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04Sto\ p\x07\x00\x00\x00\x0eprogress_u\ i_tr\x01\x03\x00\x00\x00\x16\x06E\x069\x06/\ \x06D\x00 \x06'\x06D\x06F\x06B\x06D\x00:\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fTransf\ er rate: \x07\x00\x00\x00\x0epr\ ogress_ui_tr\x01\x03\x00\x00\ \x00\xbc\x00<\x00b\x00>\x00<\x00c\x00e\x00n\ \x00t\x00e\x00r\x00>\x06D\x06B\x06/\x00 \ \x06*\x06E\x00 \x06'\x063\x06*\x06.\x06/\ \x06'\x06E\x00 \x06G\x060\x06'\x00 \x06'\ \x06D\x06'\x06.\x06*\x065\x06'\x061\x00 \ \x06E\x063\x06(\x06B\x06'\x00!\x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x06'\x063\x06*\x06.\x06/\x06E\x00 \x06'\ \x06.\x06*\x065\x06'\x061\x00 \x06\x22\x06.\ \x061\x00!\x00<\x00/\x00c\x00e\x00n\x00t\ \x00e\x00r\x00>\x00<\x00/\x00b\x00>\x08\x00\ \x00\x00\x00\x06\x00\x00\x00_This shortcut\ has been used b\ efore! \ Use an\ other one!\x07\x00\x00\x00\x11sett\ ing_src_ui_tr\x01\x03\x00\ \x00\x00p\x00<\x00h\x00t\x00m\x00l\x00>\x00\ <\x00h\x00e\x00a\x00d\x00/\x00>\x00<\x00\ b\x00o\x00d\x00y\x00>\x00<\x00p\x00>\x00\ \x06'\x06D\x065\x06J\x06:\x06)\x00 \x06\ /\x00 \x06/\x00:\x063\x00 \x063\x00 \x00\ <\x00/\x00p\x00>\x00<\x00/\x00b\x00o\x00\ d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\x00\ l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x004\

Format HH:MM<\ /p>\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x8a\x00<\x00h\x00t\x00\ m\x00l\x00>\x00<\x00h\x00e\x00a\x00d\x00\ /\x00>\x00<\x00b\x00o\x00d\x00y\x00>\x00\ <\x00p\x00>\x00 \x06'\x066\x06(\x067\x00\ \x06H\x06B\x06*\x00 \x06'\x06D\x06'\x06\ F\x06*\x06G\x06'\x06!\x00 \x06(\x06'\x06\ D\x06+\x06H\x06'\x06F\x06J\x00.\x00 \x00\ <\x00/\x00p\x00>\x00<\x00/\x00b\x00o\x00\ d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\x00\ l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00@\

Set timeout i\ n seconds.

<\ /body>\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\xb0\x00<\x00h\x00t\x00m\x00l\x00\ >\x00<\x00h\x00e\x00a\x00d\x00/\x00>\x00\ <\x00b\x00o\x00d\x00y\x00>\x00<\x00p\x00\ >\x06B\x06/\x00 \x06D\x06'\x00 \x06*\x06\ 9\x06E\x06D\x00 \x06G\x060\x06G\x00 \x06\ '\x06D\x06.\x06'\x065\x06J\x06)\x00 \x06\ A\x06J\x00 \x06F\x068\x06'\x06E\x00 \x06\ '\x06D\x06*\x064\x06:\x06J\x06D\x00 \x06\ '\x06D\x06.\x06'\x065\x00 \x06(\x06C\x00\ .\x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00\ o\x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00\ m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00[<\ html>

This featur\ e may not work i\ n your operating\ system.

\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\xca\x00<\x00h\x00t\x00m\x00l\x00>\x00<\ \x00h\x00e\x00a\x00d\x00/\x00>\x00<\x00b\ \x00o\x00d\x00y\x00>\x00<\x00p\x00>\x00 \ \x06'\x063\x06*\x06.\x06/\x06'\x06E\x00 \ \x06'\x06*\x065\x06'\x06D\x06'\x06*\x00 \ \x06E\x06*\x069\x06/\x06/\x06)\x00 \x06J\ \x06E\x06C\x06F\x00 \x06#\x06F\x00 \x06J\ \x063\x06'\x069\x06/\x00 \x06A\x06J\x00 \ \x062\x06J\x06'\x06/\x06)\x00 \x063\x061\ \x069\x06)\x00 \x06'\x06D\x06*\x06-\x06E\ \x06J\x06D\x00.\x00 \x00<\x00/\x00p\x00>\ \x00<\x00/\x00b\x00o\x00d\x00y\x00>\x00<\ \x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00c

Usin\ g multiple conne\ ctions can help \ speed up your do\ wnload.

\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ \x0a\x06%\x06D\x06:\x06'\x06!\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x06Cancel\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x0a\x06*\x06:\x06J\x06J\x061\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x06Change\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x1a\x06E\x06.\x067\x067\x00 \x06\ '\x06D\x06#\x06D\x06H\x06'\x06F\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0eColor s\ cheme: \x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x16\x06\ '\x06D\x06'\x06A\x06*\x061\x06'\x066\x06\ J\x06'\x06*\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08D\ efaults\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x1c\x06\ .\x06J\x06'\x061\x06'\x06*\x00 \x06'\x06\ D\x06*\x06-\x06E\x06J\x06D\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x10Download Op\ tions\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x0a\x06'\x06\ D\x06.\x067\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x06Font: \x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00`\x06\ %\x06.\x06A\x06'\x06!\x00 \x06'\x06D\x06\ F\x06'\x06A\x060\x06)\x00 \x06'\x06D\x06\ 1\x06&\x06J\x063\x06J\x06)\x00 \x069\x06\ F\x06/\x00 \x06'\x06D\x06F\x06B\x061\x00\ \x069\x06D\x06I\x00 \x062\x061\x00 \x06\ '\x06D\x06%\x06:\x06D\x06'\x06B\x00.\x08\ \x00\x00\x00\x00\x06\x00\x00\x00)Hide ma\ in window if clo\ se button clicke\ d.\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x14\x06'\x06D\x06#\ \x06J\x06B\x06H\x06F\x06'\x06*\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x07Icons: \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00&\x06'\x06(\x06B\x06'\x06\ !\x00 \x06'\x06D\x06,\x06G\x06'\x062\x00\ \x06E\x06F\x06*\x06(\x06G\x00!\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x12Keep syst\ em awake!\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ \x1c\x06F\x06H\x069\x00 \x06'\x06D\x06*\x06\ F\x06(\x06J\x06G\x06'\x06*\x00:\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x13Notificat\ ion type: \x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x12\x06'\x06D\x06*\x06F\x06(\x06J\x06G\ \x06'\x06*\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dNo\ tifications\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x1c\x069\x06/\x06/\x00 \x06'\x06D\x06\ '\x06*\x065\x06'\x06D\x06'\x06*\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x17Number \ of connections: \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00$\x069\x06/\x06/\x00 \ \x06E\x061\x06'\x06*\x00 \x06'\x06D\x06E\ \x06-\x06'\x06H\x06D\x06)\x00:\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x11Number of \ tries: \x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x04\x06\ *\x06E\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00\x12\x06'\x06D\x06*\x06A\x06\ 6\x06J\x06D\x06'\x06*\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0bPreferences\x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00\x22\x06'\x066\x06:\x067\x00 \ \x06E\x06A\x06'\x06*\x06J\x06-\x00 \x06,\ \x06/\x06J\x06/\x06)\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0ePress new keys\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00<\x06*\x064\x06:\x06J\ \x06D\x00 \x06(\x06J\x061\x063\x06J\x06(\ \x06H\x06D\x063\x00 \x069\x06F\x06/\x00 \ \x06(\x06/\x06!\x00 \x06'\x06D\x06F\x068\ \x06'\x06E\x08\x00\x00\x00\x00\x06\x00\x00\x00\x19Ru\ n Persepolis at \ startup\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x14\x06\ '\x06D\x06'\x06.\x06*\x065\x06'\x061\x06\ '\x06*\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09Sho\ rtcuts\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x0c\x06'\ \x06D\x06-\x06,\x06E\x00:\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x06Size: \x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x0c\x06'\x06D\x06-\x06'\x06D\x06)\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x06Status\x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00\x0c\x06'\x06D\x06F\x06E\x067\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07Styl\ e: \x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x000\x06H\x06B\x06\ *\x00 \x06'\x06D\x06'\x06F\x06*\x06G\x06\ '\x06!\x00 \x00(\x06(\x06'\x06D\x06+\x06\ H\x06'\x06F\x06J\x00)\x00:\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x13Timeout (se\ conds): \x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00(\ \x06.\x06J\x06'\x061\x06'\x06*\x00 \x06E\ \x06D\x06*\x06B\x067\x00 \x06'\x06D\x06A\ \x06J\x06/\x06J\x06H\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x14Video Finder O\ ptions\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x0c\x06'\ \x06D\x06-\x06,\x06E\x00:\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x08Volume: \x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00$\x06*\x06:\x06J\x06J\x061\x00 \ \x06E\x06,\x06D\x06/\x00 \x06'\x06D\x06*\ \x06-\x06E\x06J\x06D\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x16Change Downloa\ d Folder\x07\x00\x00\x00\x0atex\ t_ui_tr\x01\x03\x00\x00\x00\x1c\x069\x06\ F\x06H\x06'\x06F\x00 \x06'\x06D\x06\x22\x06\ J\x00 \x06(\x06J\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x03IP:\x07\x00\x00\x00\x0atext_\ ui_tr\x01\x03\x00\x00\x00,\x06E\x06/\x06\ J\x061\x00 \x06'\x06D\x06*\x06-\x06E\x06\ J\x06D\x00 \x06(\x06J\x061\x063\x06J\x06\ (\x06H\x06D\x063\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1bPersepolis Down\ load Manager\x07\x00\x00\x00\ \x0atext_ui_tr\x01\x03\x00\x00\x00\ \x0e\x06'\x06D\x06E\x06F\x06A\x060\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x05Port:\x07\x00\ \x00\x00\x0atext_ui_tr\x01\x03\x00\ \x00\x00.\x00<\x00b\x00>\x06-\x06'\x06D\x06\ )\x00 \x06E\x06D\x06A\x00 \x06'\x06D\x06\ 5\x06H\x06*\x00:\x00 \x00<\x00/\x00b\x00\ >\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aAu\ dio file status:\ \x07\x00\x00\x00\x1bvideo_\ finder_progress_\ ui_tr\x01\x03\x00\x00\x00&\x00<\x00b\x00\ >\x06-\x06'\x06D\x06)\x00 \x06'\x06D\x06\ E\x062\x06,\x00:\x00 \x00<\x00/\x00b\x00\ >\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Mu\ xing status: \x07\x00\x00\x00\x1bvideo_find\ er_progress_ui_t\ r\x01\x03\x00\x00\x002\x00<\x00b\x00>\x06-\x06\ '\x06D\x06)\x00 \x06E\x06D\x06A\x00 \x06\ '\x06D\x06A\x06J\x06/\x06J\x06H\x00:\x00\ \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x1aVideo file\ status: \x07\x00\x00\ \x00\x1bvideo_finder_p\ rogress_ui_tr\x01\x88\x00\ \x00\x00\x0f\x01\x00\xff\x01\x01\xff\x01\x02\xff$\x03\x0a\xff\ *\x0b\ \x00\x001G\ <\ \xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\xa7\ \x00\x00\x00\x02huB\x00\x00\x03\xa8\x00\x00\x05;\x00\ \x00\x03\xd2\x00\x00\x05;\x00\x00\x06\xe8\x00\x00\x05;\x00\ \x00'\xa0\x00\x00N:\x00\x00+H\x00\x04\xcf\x04\x00\ \x00\x16Q\x00\x04\xe3\xc0\x00\x00\x06B\x00\x050K\x00\ \x00\x06p\x00\x05\xab`\x00\x00\x1d\x5c\x00Hw9\x00\ \x00\x15S\x00Hw9\x00\x00\x1a\x0f\x00V\x8c\x95\x00\ \x00\x1b\xee\x00Wiz\x00\x00\x07\x10\x00Wiz\x00\ \x00+\xe0\x00W\x96\xf9\x00\x00\x07A\x00\x97\xa2\x10\x00\ \x00\x04\xa4\x00\xc2\xad\xd0\x00\x00\x0d\x8b\x01\x18\xab\xd4\x00\ \x00\x15\x8b\x01\x8bp\x0e\x00\x00 \xf0\x02S\xd0\x00\x00\ \x00\x08)\x02\x9a\xf5p\x00\x00\x0d\xe9\x02\xf9\xc5\xc5\x00\ \x00\x03\x9d\x03\x0d1^\x00\x00\x09\xec\x03\x1c\xc5*\x00\ \x00\x1a\xfd\x03<\x83\x03\x00\x00\x06\x9e\x03KF\xe3\x00\ \x00\x1a\xa2\x03KF\xe3\x00\x00$\x80\x03\x92\xd2\xce\x00\ \x00%\x04\x03\xdc\xdc%\x00\x00\x0bf\x04]I3\x00\ \x00(\x0b\x04e\xac\xf5\x00\x00\x16\x12\x04\x98I\xbc\x00\ \x00\x05O\x04\x98I\xbc\x00\x00#\x8c\x04\x9e\x84\xd5\x00\ \x00#\xbe\x04\xd6W\xc0\x00\x00$\xd2\x05\x13\xccT\x00\ \x00\x12\xb3\x05_. \x00\x00\x11\xd9\x05_\xa8`\x00\ \x00\x0e\xaa\x05i<\xfe\x00\x00\x13\xcf\x05v\x1b\x9e\x00\ \x00\x0b\xaf\x05\x8c\xac5\x00\x00\x1c\xa4\x05\xa1\x08\xc0\x00\ \x00)M\x05\xa3\x9c>\x00\x00\x13f\x05\xa3\x9c>\x00\ \x00,\x8c\x05\xa8X\xf3\x00\x00\x03\x09\x05\xaa\x8b\xc3\x00\ \x00)\x81\x06-B\x0e\x00\x00\x12\xf3\x06-B\x0e\x00\ \x00,\x0e\x069\x82N\x00\x00\x14#\x069\x82N\x00\ \x00-\x00\x06<=\x10\x00\x00*\xa1\x06]1\xde\x00\ \x00\x02\x02\x06\x9aK\x00\x00\x00\x08j\x06\x9a\xf5C\x00\ \x00)\x08\x06\x9c(\x01\x00\x00%\xee\x06\xc5)*\x00\ \x00\x1b=\x06\xcc\xd6\xa3\x00\x00\x17\xa0\x07\x14*\x1e\x00\ \x00\x18C\x076\xcf`\x00\x00\x05\xf1\x07[&u\x00\ \x00\x0fm\x07\x9b]0\x00\x00'E\x07\x9c1\x03\x00\ \x00*G\x08g-\xa2\x00\x00\x0aw\x09>\x0d$\x00\ \x00\x19C\x09^\x89\xd3\x00\x00\x17c\x09`\x06\xb5\x00\ \x00\x19\x08\x09g\x01\xd0\x00\x00)\xee\x09\x93\xd2\xfe\x00\ \x00\x1aE\x09\x96F0\x00\x00\x10\x84\x0a\x0c\x87\x0e\x00\ \x00\x1f,\x0a_\xd7\x0e\x00\x00\x08\xbe\x0a_\xf3\xfb\x00\ \x00\x14\x96\x0as>\xc3\x00\x00\x04i\x0a\x8b\xc3`\x00\ \x00\x1d!\x0a\x97\x00\x80\x00\x00\x07\xd5\x0a\xa2Yp\x00\ \x00(s\x0a\xc0(\x90\x00\x00)\xb7\x0b`r`\x00\ \x00&L\x0bn\xb1\xee\x00\x00\x22K\x0bv\x04\xf0\x00\ \x00\x0d&\x0b\x89w\x94\x00\x00\x15\x06\x0b\x89w\x94\x00\ \x00\x19\xc4\x0b\xc8\xc7\x13\x00\x00$:\x0b\xf9\x95\xb3\x00\ \x00\x0f\xcb\x0c(\x19\x04\x00\x00\x17\xe5\x0c2\xc0S\x00\ \x00\x03c\x0ce\x0f.\x00\x00\x18\xc4\x0ce\x0f.\x00\ \x00\x1c\xdf\x0c\x96q\xc0\x00\x00\x095\x0c\x96q\xc0\x00\ \x00\x0eZ\x0c\x99e\x80\x00\x00\x10\xc1\x0c\xb5\x86\x80\x00\ \x00\x1b\x90\x0c\xb5\x86\x80\x00\x00&\xe8\x0c\xdd\xc2\x03\x00\ \x00'\xc8\x0c\xe0\x1a\xf3\x00\x00&\xa3\x0c\xfb\xe0\x8a\x00\ \x00\x10\xfb\x0dq\x98\xde\x00\x00\x00\x00\x0d\x99\xf9B\x00\ \x00\x03\xf8\x0d\x99\xf9B\x00\x00\x0a\xec\x0d\x99\xf9B\x00\ \x00\x16\xed\x0d\x99\xf9B\x00\x00\x1c0\x0d\x99\xf9B\x00\ \x00+p\x0e i\x22\x00\x00\x12h\x0e.d\xa4\x00\ \x00\x16\x88\x0e7I\xc3\x00\x00\x05\x03\x0ex\xa8B\x00\ \x00\x05\x81\x0ex\xa8B\x00\x00*\xdb\x0e\xc4J\xf0\x00\ \x00\x07r\x0e\xda\xd4\xfe\x00\x00\x1d\xd9\x0f6\xb6\x90\x00\ \x00\x0f\x02\x0f}\x11p\x00\x00\x09\x85\x0f\xa6V\x80\x00\ \x00%\xb7\x0f\xa7\xb6\x04\x00\x00\x10%\x0f\xac[\xee\x00\ \x00\x11e\x0f\xd1?\x00\x00\x00\x1d\x8b\x0f\xd6\xe5\xde\x00\ \x00\x1f\xf0\x0f\xde{\xf0\x00\x00#\xf8\x0f\xf3\x03\x0e\x00\ \x00\x00\xfbi\x00\x00-~\x03\x00\x00\x00\x92\x00<\x00\ a\x00 \x00h\x00r\x00e\x00f\x00=\x00h\x00\ t\x00t\x00p\x00s\x00:\x00/\x00/\x00p\x00\ e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00\ s\x00d\x00m\x00.\x00g\x00i\x00t\x00h\x00\ u\x00b\x00.\x00i\x00o\x00>\x00h\x00t\x00\ t\x00p\x00s\x00:\x00/\x00/\x00p\x00e\x00\ r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00\ d\x00m\x00.\x00g\x00i\x00t\x00h\x00u\x00\ b\x00.\x00i\x00o\x00<\x00/\x00a\x00>\x08\ \x00\x00\x00\x00\x06\x00\x00\x00I\ https://persepol\ isdm.github.io\x07\x00\x00\x00\x0babout_ui_\ tr\x01\x03\x00\x00\x00\x9a\x00<\x00a\x00 \x00h\ \x00r\x00e\x00f\x00=\x00h\x00t\x00t\x00p\ \x00s\x00:\x00/\x00/\x00t\x00e\x00l\x00e\ \x00g\x00r\x00a\x00m\x00.\x00m\x00e\x00/\ \x00p\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x00d\x00m\x00>\x00h\x00t\x00t\ \x00p\x00s\x00:\x00/\x00/\x00t\x00e\x00l\ \x00e\x00g\x00r\x00a\x00m\x00.\x00m\x00e\ \x00/\x00p\x00e\x00r\x00s\x00e\x00p\x00o\ \x00l\x00i\x00s\x00d\x00m\x00<\x00/\x00a\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00Mhttps://tel\ egram.me/persepo\ lisdm\x07\x00\x00\x00\x0bab\ out_ui_tr\x01\x03\x00\x00\x00\x9a\x00\ <\x00a\x00 \x00h\x00r\x00e\x00f\x00=\x00\ h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00\ t\x00w\x00i\x00t\x00t\x00e\x00r\x00.\x00\ c\x00o\x00m\x00/\x00p\x00e\x00r\x00s\x00\ e\x00p\x00o\x00l\x00i\x00s\x00d\x00m\x00\ >\x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00\ /\x00t\x00w\x00i\x00t\x00t\x00e\x00r\x00\ .\x00c\x00o\x00m\x00/\x00p\x00e\x00r\x00\ s\x00e\x00p\x00o\x00l\x00i\x00s\x00d\x00\ m\x00<\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00Mhttp\ s://twitter.com/\ persepolisdm\ \x07\x00\x00\x00\x0babout_ui_tr\ \x01\x03\x00\x00\x00*\x00A\x00 \x00P\x00e\x00r\ \x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00 \ \x00n\x00\xe9\x00v\x00j\x00e\x00g\x00y\x00e\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x10About \ Persepolis\x07\x00\x00\x00\x0ba\ bout_ui_tr\x01\x03\x00\x00\x00\x10\ \x00K\x00\xe9\x00s\x00z\x00\xed\x00t\x01Q\x00k\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aDevelo\ pers\x07\x00\x00\x00\x0babout_u\ i_tr\x01\x03\x00\x00\x00\x0e\x00L\x00i\x00c\ \x00e\x00n\x00s\x00z\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x07License\x07\x00\x00\x00\x0bab\ out_ui_tr\x01\x03\x00\x00\x00\x04\x00\ O\x00K\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\x07\ \x00\x00\x00\x0babout_ui_tr\x01\ \x03\x00\x00\x006\x00P\x00e\x00r\x00s\x00e\x00\ p\x00o\x00l\x00i\x00s\x00 \x00D\x00o\x00\ w\x00n\x00l\x00o\x00a\x00d\x00 \x00M\x00\ a\x00n\x00a\x00g\x00e\x00r\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x1bPersepolis \ Download Manager\ \x07\x00\x00\x00\x0babout_ui_tr\ \x01\x03\x00\x00\x00\x10\x00F\x00o\x00r\x00d\x00\xed\ \x00t\x00\xf3\x00k\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0b\ Translators\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ ,\x00H\x00o\x00z\x00\xe1\x00a\x00d\x00\xe1\x00\ s\x00 \x00k\x00a\x00t\x00e\x00g\x00\xf3\x00\ r\x00i\x00\xe1\x00h\x00o\x00z\x00:\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x11Add to ca\ tegory: \x07\x00\x00\x00\x0dadd\ link_ui_tr\x01\x03\x00\x00\x00\x1a\ \x00H\x00a\x00l\x00a\x00d\x00\xf3\x00 \x00o\ \x00p\x00c\x00i\x00\xf3\x00k\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x10Advanced Opt\ ions\x07\x00\x00\x00\x0daddlink\ _ui_tr\x01\x03\x00\x00\x00\x0a\x00M\x00\xe9\ \x00g\x00s\x00e\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06\ Cancel\x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x008\x00L\ \x00e\x00t\x00\xf6\x00l\x00t\x00\xe9\x00s\x00 \ \x00h\x00e\x00l\x00y\x00\xe9\x00n\x00e\x00k\ \x00 \x00m\x00\xf3\x00d\x00o\x00s\x00\xed\x00t\ \x00\xe1\x00s\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16\ Change Download \ Folder\x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x00\x1e\x00L\ \x00e\x00t\x00\xf6\x00l\x00t\x00\xe9\x00s\x00 \ \x00h\x00e\x00l\x00y\x00e\x00:\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x11Download F\ older: \x07\x00\x00\x00\x0daddl\ ink_ui_tr\x01\x03\x00\x00\x00\x08\x00\ I\x00P\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x04IP: \x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x00\x08\x00L\x00\ i\x00n\x00k\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04L\ ink\x07\x00\x00\x00\x0daddlink_\ ui_tr\x01\x03\x00\x00\x00\x1c\x00T\x00o\x00\ v\x00\xe1\x00b\x00b\x00i\x00 \x00o\x00p\x00\ c\x00i\x00\xf3\x00k\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0cMore Options\x07\x00\x00\ \x00\x0daddlink_ui_tr\x01\ \x03\x00\x00\x00\x04\x00O\x00K\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x02OK\x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x00\x0a\x00P\x00\ o\x00r\x00t\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x05Port:\x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x00\x0a\x00P\ \x00r\x00o\x00x\x00y\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x05Proxy\x07\x00\x00\x00\x0daddl\ ink_ui_tr\x01\x03\x00\x00\x00$\x00\ <\x00b\x00>\x00F\x00i\x00l\x00e\x00 \x00\ n\x00a\x00m\x00e\x00<\x00/\x00b\x00>\x00\ :\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x12\ File name: \x07\ \x00\x00\x00\x18after_downlo\ ad_src_ui_tr\x01\x03\x00\x00\ \x00\x1a\x00<\x00b\x00>\x00S\x00i\x00z\x00e\ \x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0dSize: \x07\x00\x00\x00\x18after_do\ wnload_src_ui_tr\ \x01\x03\x00\x00\x00\x10\x00 \x00 \x00 \x00O\x00K\ \x00 \x00 \x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x08\ OK \x07\x00\x00\x00\x14aft\ er_download_ui_t\ r\x01\x03\x00\x00\x00\x1e\x00F\x00\xe1\x00j\x00l\x00\ \x00m\x00e\x00g\x00n\x00y\x00i\x00t\x00\ \xe1\x00s\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d \ Open File \x07\x00\x00\x00\ \x14after_download_\ ui_tr\x01\x03\x00\x00\x004\x00<\x00b\x00\ >\x00L\x00e\x00t\x00\xf6\x00l\x00t\x00\xe9\x00\ s\x00 \x00e\x00l\x00k\x00\xe9\x00s\x00z\x00\ \xfc\x00l\x00t\x00!\x00<\x00/\x00b\x00>\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x1aDown\ load Completed!<\ /b>\x07\x00\x00\x00\x14after_do\ wnload_ui_tr\x01\x03\x00\x00\ \x00\x1a\x00<\x00b\x00>\x00L\x00i\x00n\x00k\ \x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0dLink: \x07\x00\x00\x00\x14after_do\ wnload_ui_tr\x01\x03\x00\x00\ \x00.\x00<\x00b\x00>\x00M\x00e\x00n\x00t\ \x00\xe9\x00s\x00 \x00m\x00\xe1\x00s\x00k\x00\xe9\ \x00n\x00t\x00<\x00/\x00b\x00>\x00:\x00 \ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Sav\ e as: \x07\x00\x00\x00\x14a\ fter_download_ui\ _tr\x01\x03\x00\x00\x00D\x00N\x00e\x00 \x00\ j\x00e\x00l\x00e\x00n\x00j\x00e\x00n\x00\ \x00m\x00e\x00g\x00 \x00\xfa\x00j\x00r\x00\ a\x00 \x00e\x00z\x00 \x00a\x00z\x00 \x00\ \xfc\x00z\x00e\x00n\x00e\x00t\x00.\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x1eDon't sho\ w this message a\ gain.\x07\x00\x00\x00\x14after_\ download_ui_tr\x01\x03\ \x00\x00\x008\x00L\x00e\x00t\x00\xf6\x00l\x00t\ \x00\xe9\x00s\x00 \x00h\x00e\x00l\x00y\x00\xe9\ \x00n\x00e\x00k\x00 \x00m\x00e\x00g\x00n\ \x00y\x00i\x00t\x00\xe1\x00s\x00a\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x14Open Downl\ oad Folder\x07\x00\x00\x00\x14a\ fter_download_ui\ _tr\x01\x03\x00\x00\x006\x00P\x00e\x00r\x00\ s\x00e\x00p\x00o\x00l\x00i\x00s\x00 \x00\ D\x00o\x00w\x00n\x00l\x00o\x00a\x00d\x00\ \x00M\x00a\x00n\x00a\x00g\x00e\x00r\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x1bPersepo\ lis Download Man\ ager\x07\x00\x00\x00\x14after_d\ ownload_ui_tr\x01\x03\x00\ \x00\x00\x18\x00H\x00i\x00b\x00a\x00j\x00e\x00\ l\x00e\x00n\x00t\x00\xe9\x00s\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0cReport Issu\ e\x07\x00\x00\x00\x10log_window\ _ui_tr\x01\x03\x00\x00\x00\xdc\x00<\x00b\ \x00>\x00<\x00c\x00e\x00n\x00t\x00e\x00r\ \x00>\x00E\x00z\x00t\x00 \x00a\x00 \x00l\ \x00i\x00n\x00k\x00e\x00t\x00 \x00k\x00o\ \x00r\x00\xe1\x00b\x00b\x00a\x00n\x00 \x00m\ \x00\xe1\x00r\x00 \x00h\x00o\x00z\x00z\x00\xe1\ \x00a\x00d\x00t\x00a\x00d\x00!\x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00B\x00i\x00z\x00t\x00o\x00s\ \x00,\x00 \x00h\x00o\x00g\x00y\x00 \x00i\ \x00s\x00m\x00\xe9\x00t\x00 \x00h\x00o\x00z\ \x00z\x00\xe1\x00a\x00d\x00o\x00d\x00?\x00<\ \x00/\x00c\x00e\x00n\x00t\x00e\x00r\x00>\ \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\ \x00r
Thi\ s link has been \ added before! \ \ Are you sure yo\ u want to add it\ again?
\
\x07\x00\x00\x00\x14mainwin\ dow_src_ui_tr\x01\x03\x00\ \x00\x00(\x00<\x00b\x00>\x00K\x00a\x00p\x00\ c\x00s\x00o\x00l\x00a\x00t\x00o\x00k\x00\ <\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x14Connecti\ ons: \x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00\x22\x00<\x00b\x00>\x00L\ \x00e\x00t\x00\xf6\x00l\x00t\x00v\x00e\x00<\ \x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x13Downloade\ d: \x07\x00\x00\x00\x14main\ window_src_ui_tr\ \x01\x03\x00\x00\x00,\x00<\x00b\x00>\x00H\x00\xe1\ \x00t\x00r\x00a\x00l\x00\xe9\x00v\x01Q\x00 \ \x00i\x00d\x01Q\x00<\x00/\x00b\x00>\x00:\ \x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1cE\ stimated time le\ ft: \x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x00\x1a\x00<\x00b\x00>\x00L\x00\ i\x00n\x00k\x00<\x00/\x00b\x00>\x00:\x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dLi\ nk: \x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x00 \x00<\x00b\x00>\x00\xc1\x00\ l\x00l\x00a\x00p\x00o\x00t\x00<\x00/\x00\ b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0fStatus: \ \x07\x00\x00\x00\x14mainwindow_\ src_ui_tr\x01\x03\x00\x00\x00,\x00\ <\x00b\x00>\x00\xc1\x00t\x00v\x00i\x00t\x00\ e\x00l\x00i\x00 \x00r\x00\xe1\x00t\x00a\x00\ <\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x16Transfer\ rate: \x07\x00\x00\x00\x14\ mainwindow_src_u\ i_tr\x01\x03\x00\x00\x00$\x00L\x00e\x00t\ \x00\xf6\x00l\x00t\x00\xe9\x00s\x00 \x00b\x00e\ \x00f\x00e\x00j\x00e\x00z\x00v\x00e\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x11Download\ Complete\x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00\x22\x00L\x00e\x00t\x00\xf6\ \x00l\x00t\x00\xe9\x00s\x00 \x00i\x00n\x00d\ \x00\xed\x00t\x00\xe1\x00s\x00a\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0fDownload Sta\ rts\x07\x00\x00\x00\x14mainwind\ ow_src_ui_tr\x01\x03\x00\x00\ \x00&\x00L\x00e\x00t\x00\xf6\x00l\x00t\x00\xe9\ \x00s\x00 \x00m\x00e\x00g\x00\xe1\x00l\x00l\ \x00\xed\x00t\x00v\x00a\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x10Download Stopp\ ed\x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ \x0c\x00H\x00i\x00b\x00a\x00 \x00-\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x08Error - \x07\ \x00\x00\x00\x14mainwindow_s\ rc_ui_tr\x01\x03\x00\x00\x00\x0a\x00H\ \x00i\x00b\x00a\x00:\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x07Error: \x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00(\x00N\x00i\x00n\x00c\ \x00s\x00 \x00e\x00l\x00\xe9\x00g\x00 \x00h\ \x00e\x00l\x00y\x00 \x00i\x00t\x00t\x00:\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x19Not en\ ough free space \ in:\x07\x00\x00\x00\x14mainwind\ ow_src_ui_tr\x01\x03\x00\x00\ \x00.\x00A\x00 \x00m\x01q\x00v\x00e\x00l\ \x00e\x00t\x00 \x00n\x00e\x00m\x00 \x00s\ \x00i\x00k\x00e\x00r\x00\xfc\x00l\x00t\x00.\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1dOperat\ ion was not succ\ essful.\x07\x00\x00\x00\x14main\ window_src_ui_tr\ \x01\x03\x00\x00\x00@\x00F\x00o\x00l\x00y\x00t\ \x00a\x00s\x00d\x00 \x00a\x00 \x00k\x00\xf6\ \x00v\x00e\x00t\x00k\x00e\x00z\x01Q\x00 \ \x00k\x00a\x00t\x00e\x00g\x00\xf3\x00r\x00i\ \x00\xe1\x00t\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00&\ Please resume th\ e following cate\ gory: \x07\x00\x00\x00\x14mainw\ indow_src_ui_tr\x01\ \x03\x00\x00\x00\x16\x00m\x00u\x00x\x00i\x00n\x00\ g\x00 \x00h\x00i\x00b\x00a\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0cmuxing erro\ r\x07\x00\x00\x00\x14mainwindow\ _src_ui_tr\x01\x03\x00\x00\x00\x10\ \x00l\x00e\x00t\x00\xf6\x00l\x00t\x00v\x00e\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0b downl\ oaded\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x004\ \x00<\x00b\x00>\x00A\x00u\x00d\x00i\x00\xf3\ \x00f\x00\xe1\x00j\x00l\x00 \x00\xe1\x00l\x00l\ \x00a\x00p\x00o\x00t\x00:\x00 \x00<\x00/\ \x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aAudio file stat\ us:
\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00.\x00<\x00b\x00>\x00M\x00u\x00x\x00\ i\x00n\x00g\x00 \x00\xe1\x00l\x00l\x00a\x00\ p\x00o\x00t\x00:\x00 \x00<\x00/\x00b\x00\ >\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Mu\ xing status: \x07\x00\x00\x00\x10mainwindow\ _ui_tr\x01\x03\x00\x00\x00 \x00<\x00b\ \x00>\x00\xc1\x00l\x00l\x00a\x00p\x00o\x00t\ \x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0fStatus:\ \x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x004\ \x00<\x00b\x00>\x00V\x00i\x00d\x00e\x00\xf3\ \x00f\x00\xe1\x00j\x00l\x00 \x00\xe1\x00l\x00l\ \x00a\x00p\x00o\x00t\x00:\x00 \x00<\x00/\ \x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aVideo file stat\ us: \x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x006\x00\xda\x00j\x00 \x00l\x00e\x00t\x00\ \xf6\x00l\x00t\x00\xe9\x00s\x00i\x00l\x00i\x00\ n\x00k\x00 \x00h\x00o\x00z\x00z\x00\xe1\x00\ a\x00d\x00\xe1\x00s\x00a\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x15Add New Downl\ oad Link\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00\x1a\x00L\x00e\x00t\x00\xf6\x00l\x00t\x00\ \xe9\x00s\x00 \x00u\x00t\x00\xe1\x00n\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0eAfter dow\ nload\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00\x0e\ \x00H\x00o\x00z\x00z\x00\xe1\x00a\x00d\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x05Apply\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00@\x00L\x00e\x00t\x00\xf6\ \x00l\x00t\x00\xe9\x00s\x00 \x00e\x00l\x01Q\ \x00s\x00z\x01Q\x00r\x00\x0a\x00a\x00 \x00l\ \x00i\x00s\x00t\x00a\x00 \x00a\x00l\x00j\ \x00\xe1\x00r\x00\xf3\x00l\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x22Download botto\ m of\x0a the list f\ irst\x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00\x12\x00\ B\x00e\x00f\x00e\x00j\x00e\x00z\x00\xe9\x00\ s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08End T\ ime\x07\x00\x00\x00\x10mainwind\ ow_ui_tr\x01\x03\x00\x00\x00\x0e\x00K\ \x00i\x00l\x00\xe9\x00p\x00\xe9\x00s\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x04Exit\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x002\x00A\x00 \x00l\x00e\x00t\x00\ \xf6\x00l\x00t\x00\xe9\x00s\x00 \x00f\x00e\x00\ l\x00f\x00\xfc\x00g\x00g\x00e\x00s\x00z\x00\ t\x00\xe9\x00s\x00e\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0ePause Download\x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x006\x00P\x00e\x00r\ \x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00 \ \x00D\x00o\x00w\x00n\x00l\x00o\x00a\x00d\ \x00 \x00M\x00a\x00n\x00a\x00g\x00e\x00r\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bPersep\ olis Download Ma\ nager\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00\x10\ \x00F\x00o\x00l\x00y\x00a\x00m\x00a\x00t\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x08Progre\ ss\x07\x00\x00\x00\x10mainwindo\ w_ui_tr\x01\x03\x00\x00\x00\x16\x00B\x00\ e\x00\xe1\x00l\x00l\x00\xed\x00t\x00\xe1\x00s\x00\ o\x00k\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aPro\ perties\x07\x00\x00\x00\x10main\ window_ui_tr\x01\x03\x00\x00\ \x00*\x00A\x00 \x00l\x00e\x00t\x00\xf6\x00l\ \x00t\x00\xe9\x00s\x00 \x00f\x00o\x00l\x00y\ \x00t\x00a\x00t\x00\xe1\x00s\x00a\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0fResume Dow\ nload\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00B\ \x00T\x00\xe1\x00l\x00c\x00a\x00i\x00k\x00o\ \x00n\x00 \x00m\x00e\x00g\x00j\x00e\x00l\ \x00e\x00n\x00\xed\x00t\x00\xe9\x00s\x00e\x00/\ \x00e\x00l\x00r\x00e\x00j\x00t\x00\xe9\x00s\ \x00e\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aShow\ /Hide system tra\ y icon\x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ \x16\x00K\x00i\x00k\x00a\x00p\x00c\x00s\x00\ o\x00l\x00\xe1\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x09Shut Down\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x00\x0c\x00K\x00e\x00z\x00d\x00\xe9\x00\ s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aStart\ Time\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00H\ \x00A\x00 \x00l\x00e\x00t\x00\xf6\x00l\x00t\ \x00\xe9\x00s\x00 \x00l\x00e\x00\xe1\x00l\x00l\ \x00\xed\x00t\x00\xe1\x00s\x00a\x00 \x00/\x00 \ \x00m\x00e\x00g\x00s\x00z\x00a\x00k\x00\xed\ \x00t\x00\xe1\x00s\x00a\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x14Stop/Cancel Do\ wnload\x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ \x1a\x00L\x00e\x00t\x00\xf6\x00l\x00t\x00\xe9\x00\ s\x00 \x00u\x00t\x00\xe1\x00n\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0eAfter downl\ oad\x07\x00\x00\x00\x0eprogress\ _ui_tr\x01\x03\x00\x00\x00\x0e\x00H\x00o\ \x00z\x00z\x00\xe1\x00a\x00d\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x05Apply\x07\x00\x00\x00\x0epr\ ogress_ui_tr\x01\x03\x00\x00\ \x00&\x00L\x00e\x00t\x00\xf6\x00l\x00t\x00\xe9\ \x00s\x00 \x00i\x00n\x00f\x00o\x00r\x00m\ \x00\xe1\x00c\x00i\x00\xf3\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x14Download Infor\ mation\x07\x00\x00\x00\x0eprogr\ ess_ui_tr\x01\x03\x00\x00\x00(\x00\ L\x00e\x00t\x00\xf6\x00l\x00t\x00\xe9\x00s\x00\ \x00i\x00n\x00f\x00o\x00r\x00m\x00\xe1\x00\ c\x00i\x00\xf3\x00k\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x10Download Option\ s\x07\x00\x00\x00\x0eprogress_u\ i_tr\x01\x03\x00\x00\x00\x12\x00L\x00e\x00t\ \x00\xf6\x00l\x00t\x00v\x00e\x00:\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0bDownloaded\ :\x07\x00\x00\x00\x0eprogress_u\ i_tr\x01\x03\x00\x00\x00\x1c\x00H\x00\xe1\x00t\ \x00r\x00a\x00l\x00\xe9\x00v\x01Q\x00 \x00i\ \x00d\x01Q\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14\ Estimated time l\ eft:\x07\x00\x00\x00\x0eprogres\ s_ui_tr\x01\x03\x00\x00\x00$\x00K\x00\ a\x00p\x00c\x00s\x00o\x00l\x00a\x00t\x00\ o\x00k\x00 \x00s\x00z\x00\xe1\x00m\x00a\x00\ :\x08\x00\x00\x00\x00\x06\x00\x00\x00\x17Numbe\ r of connections\ : \x07\x00\x00\x00\x0eprogress_\ ui_tr\x01\x03\x00\x00\x00\x1a\x00F\x00e\x00\ l\x00f\x00\xfc\x00g\x00g\x00e\x00s\x00z\x00\ t\x00\xe9\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05P\ ause\x07\x00\x00\x00\x0eprogres\ s_ui_tr\x01\x03\x00\x00\x006\x00P\x00\ e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00\ s\x00 \x00D\x00o\x00w\x00n\x00l\x00o\x00\ a\x00d\x00 \x00M\x00a\x00n\x00a\x00g\x00\ e\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bPer\ sepolis Download\ Manager\x07\x00\x00\x00\x0epro\ gress_ui_tr\x01\x03\x00\x00\x00\ \x12\x00F\x00o\x00l\x00y\x00t\x00a\x00t\x00\ \xe1\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Res\ ume\x07\x00\x00\x00\x0eprogress\ _ui_tr\x01\x03\x00\x00\x00\x16\x00K\x00i\ \x00k\x00a\x00p\x00c\x00s\x00o\x00l\x00\xe1\ \x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09Shut\ Down\x07\x00\x00\x00\x0eprogre\ ss_ui_tr\x01\x03\x00\x00\x00\x10\x00\xc1\ \x00l\x00l\x00a\x00p\x00o\x00t\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x08Status: \ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00\x08\x00S\x00t\x00o\x00\ p\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04Stop\x07\ \x00\x00\x00\x0eprogress_ui_\ tr\x01\x03\x00\x00\x00\x1c\x00\xc1\x00t\x00v\x00i\ \x00t\x00e\x00l\x00i\x00 \x00r\x00\xe1\x00t\ \x00a\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fTr\ ansfer rate: \x07\x00\x00\ \x00\x0eprogress_ui_tr\ \x01\x03\x00\x00\x00\xce\x00<\x00b\x00>\x00<\x00c\ \x00e\x00n\x00t\x00e\x00r\x00>\x00E\x00z\ \x00t\x00 \x00a\x00 \x00p\x00a\x00r\x00a\ \x00n\x00c\x00s\x00i\x00k\x00o\x00n\x00t\ \x00 \x00k\x00o\x00r\x00\xe1\x00b\x00b\x00a\ \x00n\x00 \x00m\x00\xe1\x00r\x00 \x00h\x00a\ \x00s\x00z\x00n\x00\xe1\x00l\x00t\x00a\x00d\ \x00!\x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00V\x00\xe1\x00l\ \x00a\x00s\x00s\x00z\x00 \x00m\x00\xe1\x00s\ \x00i\x00k\x00a\x00t\x00!\x00<\x00/\x00c\ \x00e\x00n\x00t\x00e\x00r\x00>\x00<\x00/\ \x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00_
This sh\ ortcut has been \ used before! \ \ Use another one!\
\x07\x00\x00\ \x00\x11setting_src_ui\ _tr\x01\x03\x00\x00\x00n\x00<\x00h\x00t\x00\ m\x00l\x00>\x00<\x00h\x00e\x00a\x00d\x00\ /\x00>\x00<\x00b\x00o\x00d\x00y\x00>\x00\ <\x00p\x00>\x00F\x00o\x00r\x00m\x00\xe1\x00\ t\x00u\x00m\x00:\x00 \x00\xd3\x00\xd3\x00:\x00\ P\x00P\x00<\x00/\x00p\x00>\x00<\x00/\x00\ b\x00o\x00d\x00y\x00>\x00<\x00/\x00h\x00\ t\x00m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ 4

Format HH\ :MM

\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x9e\x00<\x00\ h\x00t\x00m\x00l\x00>\x00<\x00h\x00e\x00\ a\x00d\x00/\x00>\x00<\x00b\x00o\x00d\x00\ y\x00>\x00<\x00p\x00>\x00I\x00d\x01Q\x00\ t\x00\xfa\x00l\x00l\x00\xe9\x00p\x00\xe9\x00s\x00\ \x00b\x00e\x00\xe1\x00l\x00l\x00\xed\x00t\x00\ \xe1\x00s\x00a\x00 \x00m\x00\xe1\x00s\x00o\x00\ d\x00p\x00e\x00r\x00c\x00e\x00k\x00b\x00\ e\x00n\x00.\x00 \x00<\x00/\x00p\x00>\x00\ <\x00/\x00b\x00o\x00d\x00y\x00>\x00<\x00\ /\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\x00\x00\ \x06\x00\x00\x00@

Set t\ imeout in second\ s.

\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\xde\x00<\x00\ h\x00t\x00m\x00l\x00>\x00<\x00h\x00e\x00\ a\x00d\x00/\x00>\x00<\x00b\x00o\x00d\x00\ y\x00>\x00<\x00p\x00>\x00L\x00e\x00h\x00\ e\x00t\x00,\x00 \x00h\x00o\x00g\x00y\x00\ \x00e\x00z\x00 \x00a\x00 \x00s\x00z\x00\ o\x00l\x00g\x00\xe1\x00l\x00t\x00a\x00t\x00\ \xe1\x00s\x00 \x00n\x00e\x00m\x00 \x00m\x01\ q\x00k\x00\xf6\x00d\x00i\x00k\x00 \x00e\x00\ z\x00e\x00n\x00 \x00a\x00z\x00 \x00o\x00\ p\x00e\x00r\x00\xe1\x00c\x00i\x00\xf3\x00s\x00\ \x00r\x00e\x00n\x00d\x00s\x00z\x00e\x00\ r\x00e\x00n\x00.\x00<\x00/\x00p\x00>\x00\ <\x00/\x00b\x00o\x00d\x00y\x00>\x00<\x00\ /\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\x00\x00\ \x06\x00\x00\x00[

This \ feature may not \ work in your ope\ rating system.\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\xbc\x00<\x00h\x00t\x00m\ \x00l\x00>\x00<\x00h\x00e\x00a\x00d\x00/\ \x00>\x00<\x00b\x00o\x00d\x00y\x00>\x00<\ \x00p\x00>\x00T\x00\xf6\x00b\x00b\x00 \x00k\ \x00a\x00p\x00c\x00s\x00o\x00l\x00a\x00t\ \x00 \x00h\x00a\x00s\x00z\x00n\x00\xe1\x00l\ \x00a\x00t\x00a\x00 \x00f\x00e\x00l\x00g\ \x00y\x00o\x00r\x00s\x00\xed\x00t\x00h\x00a\ \x00t\x00j\x00a\x00 \x00a\x00 \x00l\x00e\ \x00t\x00\xf6\x00l\x00t\x00\xe9\x00s\x00t\x00.\ \x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00o\ \x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\ \x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00c

Using multip\ le connections c\ an help speed up\ your download.<\ /p>\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x0a\x00M\x00\xe9\x00g\x00\ s\x00e\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Can\ cel\x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00\x12\x00V\x00\xe1\x00\ l\x00t\x00o\x00z\x00t\x00a\x00t\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x06Change\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x12\x00S\x00z\x00\xed\x00n\x00s\x00\ \xe9\x00m\x00a\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0eColor scheme: \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00\x1c\x00A\x00l\x00a\x00p\x00\ \xe9\x00r\x00t\x00e\x00l\x00m\x00e\x00z\x00\ \xe9\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08Def\ aults\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00 \x00L\x00\ e\x00t\x00\xf6\x00l\x00t\x00\xe9\x00s\x00i\x00\ \x00o\x00p\x00c\x00i\x00\xf3\x00k\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x10Download \ Options\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x0a\x00\ B\x00e\x00t\x01q\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x06Font: \x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ h\x00F\x01Q\x00a\x00b\x00l\x00a\x00k\x00\ \x00e\x00l\x00r\x00e\x00j\x00t\x00\xe9\x00\ s\x00e\x00 \x00a\x00 \x00B\x00e\x00z\x00\ \xe1\x00r\x00\xe1\x00s\x00 \x00g\x00o\x00m\x00\ b\x00r\x00a\x00 \x00v\x00a\x00l\x00\xf3\x00\ \x00k\x00a\x00t\x00t\x00i\x00n\x00t\x00\ \xe1\x00s\x00k\x00o\x00r\x08\x00\x00\x00\x00\x06\x00\ \x00\x00)Hide main win\ dow if close but\ ton clicked.\x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x0e\x00I\x00k\x00o\x00n\x00o\x00k\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07Icon\ s: \x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00*\x00R\x00e\x00\ n\x00d\x00s\x00z\x00e\x00r\x00 \x00\xe9\x00\ b\x00r\x00e\x00n\x00t\x00a\x00r\x00t\x00\ \xe1\x00s\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x12K\ eep system awake\ !\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x22\x00\xc9\x00r\x00t\x00\ e\x00s\x00\xed\x00t\x00\xe9\x00s\x00 \x00t\x00\ \xed\x00p\x00u\x00s\x00a\x00:\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x13Notificatio\ n type: \x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00\x16\ \x00\xc9\x00r\x00t\x00e\x00s\x00\xed\x00t\x00\xe9\ \x00s\x00e\x00k\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d\ Notifications\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00$\x00K\x00a\x00p\x00c\x00s\x00\ o\x00l\x00a\x00t\x00o\x00k\x00 \x00s\x00\ z\x00\xe1\x00m\x00a\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x17Number of con\ nections: \x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00(\x00P\x00r\x00\xf3\x00b\x00\xe1\x00l\x00k\ \x00o\x00z\x00\xe1\x00s\x00o\x00k\x00 \x00s\ \x00z\x00\xe1\x00m\x00a\x00:\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x11Number of tr\ ies: \x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x04\x00O\x00\ K\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x16\x00B\x00e\x00\xe1\x00l\x00l\x00\ \xed\x00t\x00\xe1\x00s\x00o\x00k\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0bPreferences\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x008\x00N\x00y\x00o\x00m\ \x00d\x00 \x00m\x00e\x00g\x00 \x00a\x00z\ \x00 \x00\xfa\x00j\x00 \x00b\x00i\x00l\x00l\ \x00e\x00n\x00t\x00y\x01q\x00k\x00e\x00t\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0ePress \ new keys\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00Z\ \x00P\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x00 \x00a\x00u\x00t\x00o\x00m\ \x00a\x00t\x00i\x00k\x00u\x00s\x00 \x00i\ \x00n\x00d\x00\xed\x00t\x00\xe1\x00s\x00a\x00 \ \x00a\x00 \x00r\x00e\x00n\x00d\x00s\x00z\ \x00e\x00r\x00r\x00e\x00l\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x19Run Persepol\ is at startup\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x1a\x00P\x00a\x00r\x00a\x00n\x00\ c\x00s\x00i\x00k\x00o\x00n\x00o\x00k\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x09Shortcu\ ts\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x0c\x00M\x00\xe9\x00r\ \x00e\x00t\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06\ Size: \x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x0e\x00\xc1\ \x00l\x00l\x00a\x00p\x00o\x00t\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x06Status\x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x0e\x00S\x00t\x00\xed\x00l\x00u\x00s\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07Styl\ e: \x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00$\x00I\x00d\x01\ Q\x00t\x00\xfa\x00l\x00l\x00\xe9\x00p\x00\xe9\x00\ s\x00 \x00(\x00s\x00e\x00c\x00)\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x13Timeout\ (seconds): \x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00$\x00V\x00i\x00d\x00e\x00\xf3\x00k\ \x00e\x00r\x00e\x00s\x01Q\x00 \x00o\x00p\ \x00c\x00i\x00\xf3\x00k\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x14Video Finder O\ ptions\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x10\x00H\ \x00a\x00n\x00g\x00e\x00r\x01Q\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x08Volume: \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x008\x00L\x00e\x00t\x00\xf6\ \x00l\x00t\x00\xe9\x00s\x00 \x00h\x00e\x00l\ \x00y\x00\xe9\x00n\x00e\x00k\x00 \x00m\x00\xf3\ \x00d\x00o\x00s\x00\xed\x00t\x00\xe1\x00s\x00a\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Change\ Download Folder\ \x07\x00\x00\x00\x0atext_ui_tr\x01\ \x03\x00\x00\x00\x06\x00I\x00P\x00:\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x03IP:\x07\x00\x00\x00\x0atex\ t_ui_tr\x01\x03\x00\x00\x006\x00P\x00\ e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00\ s\x00 \x00D\x00o\x00w\x00n\x00l\x00o\x00\ a\x00d\x00 \x00M\x00a\x00n\x00a\x00g\x00\ e\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bPer\ sepolis Download\ Manager\x07\x00\x00\x00\x0atex\ t_ui_tr\x01\x03\x00\x00\x00\x0a\x00P\x00\ o\x00r\x00t\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x05Port:\x07\x00\x00\x00\x0atext_\ ui_tr\x01\x03\x00\x00\x004\x00<\x00b\x00\ >\x00A\x00u\x00d\x00i\x00\xf3\x00f\x00\xe1\x00\ j\x00l\x00 \x00\xe1\x00l\x00l\x00a\x00p\x00\ o\x00t\x00:\x00 \x00<\x00/\x00b\x00>\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x1aAudi\ o file status: <\ /b>\x07\x00\x00\x00\x1bvideo_fi\ nder_progress_ui\ _tr\x01\x03\x00\x00\x00.\x00<\x00b\x00>\x00\ M\x00u\x00x\x00i\x00n\x00g\x00 \x00\xe1\x00\ l\x00l\x00a\x00p\x00o\x00t\x00:\x00 \x00\ <\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x16Muxing statu\ s: \x07\x00\x00\x00\x1bvide\ o_finder_progres\ s_ui_tr\x01\x03\x00\x00\x004\x00<\x00\ b\x00>\x00V\x00i\x00d\x00e\x00\xf3\x00f\x00\ \xe1\x00j\x00l\x00 \x00\xe1\x00l\x00l\x00a\x00\ p\x00o\x00t\x00:\x00 \x00<\x00/\x00b\x00\ >\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aVi\ deo file status:\ \x07\x00\x00\x00\x1bvideo_\ finder_progress_\ ui_tr\x01\ \x00\x000#\ <\ \xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\xa7\ \x00\x00\x00\x05pl_PLB\x00\x00\x03\xa8\x00\x00\ \x05;\x00\x00\x03\xc8\x00\x00\x05;\x00\x00\x06\xb8\x00\x00\ \x05;\x00\x00&\x98\x00\x00N:\x00\x00*\x06\x00\x04\ \xcf\x04\x00\x00\x167\x00\x04\xe3\xc0\x00\x00\x06\x18\x00\x05\ 0K\x00\x00\x06D\x00\x05\xab`\x00\x00\x1d\x02\x00H\ w9\x00\x00\x15\x1f\x00Hw9\x00\x00\x19\xdf\x00V\ \x8c\x95\x00\x00\x1b\xae\x00Wiz\x00\x00\x06\xe0\x00W\ iz\x00\x00*\xa8\x00W\x96\xf9\x00\x00\x07\x11\x00\x97\ \xa2\x10\x00\x00\x04\xa4\x00\xc2\xad\xd0\x00\x00\x0d)\x01\x18\ \xab\xd4\x00\x00\x15Y\x01\x8bp\x0e\x00\x00 J\x02S\ \xd0\x00\x00\x00\x07\xff\x02\x9a\xf5p\x00\x00\x0d\x83\x02\xf9\ \xc5\xc5\x00\x00\x03\x91\x03\x0d1^\x00\x00\x09\xac\x03\x1c\ \xc5*\x00\x00\x1a\xcb\x03<\x83\x03\x00\x00\x06r\x03K\ F\xe3\x00\x00\x1ax\x03KF\xe3\x00\x00#r\x03\x92\ \xd2\xce\x00\x00#\xfe\x03\xdc\xdc%\x00\x00\x0b.\x04]\ I3\x00\x00'\x03\x04e\xac\xf5\x00\x00\x15\xe4\x04\x98\ I\xbc\x00\x00\x05S\x04\x98I\xbc\x00\x00\x22\x82\x04\x9e\ \x84\xd5\x00\x00\x22\xb6\x04\xd6W\xc0\x00\x00#\xc4\x05\x13\ \xccT\x00\x00\x12\x85\x05_. \x00\x00\x11\xb3\x05_\ \xa8`\x00\x00\x0e:\x05i<\xfe\x00\x00\x13\x9f\x05v\ \x1b\x9e\x00\x00\x0by\x05\x8c\xac5\x00\x00\x1c^\x05\xa1\ \x08\xc0\x00\x00(\x1d\x05\xa3\x9c>\x00\x00\x138\x05\xa3\ \x9c>\x00\x00+V\x05\xa8X\xf3\x00\x00\x03\x09\x05\xaa\ \x8b\xc3\x00\x00(U\x06-B\x0e\x00\x00\x12\xc3\x06-\ B\x0e\x00\x00*\xd6\x069\x82N\x00\x00\x13\xf1\x069\ \x82N\x00\x00+\xc8\x06<=\x10\x00\x00)}\x06]\ 1\xde\x00\x00\x02\x02\x06\x9aK\x00\x00\x00\x084\x06\x9a\ \xf5C\x00\x00'\xe6\x06\x9c(\x01\x00\x00$\xe4\x06\xc5\ )*\x00\x00\x1b\x09\x06\xcc\xd6\xa3\x00\x00\x17\x80\x07\x14\ *\x1e\x00\x00\x18\x19\x076\xcf`\x00\x00\x05\xd7\x07[\ &u\x00\x00\x0f\x05\x07\x9b]0\x00\x00&;\x07\x9c\ 1\x03\x00\x00)\x17\x08g-\xa2\x00\x00\x0a=\x09>\ \x0d$\x00\x00\x19)\x09^\x89\xd3\x00\x00\x17G\x09`\ \x06\xb5\x00\x00\x18\xd4\x09g\x01\xd0\x00\x00(\xbc\x09\x93\ \xd2\xfe\x00\x00\x1a\x17\x09\x96F0\x00\x00\x10$\x0a\x0c\ \x87\x0e\x00\x00\x1e\xa4\x0a_\xd7\x0e\x00\x00\x08\x82\x0a_\ \xf3\xfb\x00\x00\x14f\x0as>\xc3\x00\x00\x04i\x0a\x8b\ \xc3`\x00\x00\x1c\xc9\x0a\x97\x00\x80\x00\x00\x07\xa7\x0a\xa2\ Yp\x00\x00']\x0a\xc0(\x90\x00\x00(\x89\x0b`\ r`\x00\x00%@\x0bn\xb1\xee\x00\x00!\x89\x0bv\ \x04\xf0\x00\x00\x0c\xc8\x0b\x89w\x94\x00\x00\x14\xd6\x0b\x89\ w\x94\x00\x00\x19\x98\x0b\xc8\xc7\x13\x00\x00#8\x0b\xf9\ \x95\xb3\x00\x00\x0fg\x0c(\x19\x04\x00\x00\x17\xc5\x0c2\ \xc0S\x00\x00\x03Q\x0ce\x0f.\x00\x00\x18\x9a\x0ce\ \x0f.\x00\x00\x1c\x91\x0c\x96q\xc0\x00\x00\x08\xff\x0c\x96\ q\xc0\x00\x00\x0d\xea\x0c\x99e\x80\x00\x00\x10a\x0c\xb5\ \x86\x80\x00\x00\x1bT\x0c\xb5\x86\x80\x00\x00%\xe2\x0c\xdd\ \xc2\x03\x00\x00&\xc0\x0c\xe0\x1a\xf3\x00\x00%\x99\x0c\xfb\ \xe0\x8a\x00\x00\x10\x9b\x0dq\x98\xde\x00\x00\x00\x00\x0d\x99\ \xf9B\x00\x00\x03\xee\x0d\x99\xf9B\x00\x00\x0a\xaa\x0d\x99\ \xf9B\x00\x00\x16\xc7\x0d\x99\xf9B\x00\x00\x1b\xe0\x0d\x99\ \xf9B\x00\x00*.\x0e i\x22\x00\x00\x12:\x0e.\ d\xa4\x00\x00\x16n\x0e7I\xc3\x00\x00\x04\xfd\x0ex\ \xa8B\x00\x00\x05\x87\x0ex\xa8B\x00\x00)\xb9\x0e\xc4\ J\xf0\x00\x00\x07B\x0e\xda\xd4\xfe\x00\x00\x1d\x8b\x0f6\ \xb6\x90\x00\x00\x0e\x90\x0f}\x11p\x00\x00\x09M\x0f\xa6\ V\x80\x00\x00$\xaf\x0f\xa7\xb6\x04\x00\x00\x0f\xc1\x0f\xac\ [\xee\x00\x00\x117\x0f\xd1?\x00\x00\x00\x1d1\x0f\xd6\ \xe5\xde\x00\x00\x1fb\x0f\xde{\xf0\x00\x00\x22\xe8\x0f\xf3\ \x03\x0e\x00\x00\x00\xfbi\x00\x00,H\x03\x00\x00\x00\x92\ \x00<\x00a\x00 \x00h\x00r\x00e\x00f\x00=\ \x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\ \x00p\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x00d\x00m\x00.\x00g\x00i\x00t\ \x00h\x00u\x00b\x00.\x00i\x00o\x00>\x00h\ \x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00p\ \x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\ \x00s\x00d\x00m\x00.\x00g\x00i\x00t\x00h\ \x00u\x00b\x00.\x00i\x00o\x00<\x00/\x00a\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00Ihttps://perse\ polisdm.github.i\ o\x07\x00\x00\x00\x0babout_\ ui_tr\x01\x03\x00\x00\x00\x9a\x00<\x00a\x00\ \x00h\x00r\x00e\x00f\x00=\x00h\x00t\x00\ t\x00p\x00s\x00:\x00/\x00/\x00t\x00e\x00\ l\x00e\x00g\x00r\x00a\x00m\x00.\x00m\x00\ e\x00/\x00p\x00e\x00r\x00s\x00e\x00p\x00\ o\x00l\x00i\x00s\x00d\x00m\x00>\x00h\x00\ t\x00t\x00p\x00s\x00:\x00/\x00/\x00t\x00\ e\x00l\x00e\x00g\x00r\x00a\x00m\x00.\x00\ m\x00e\x00/\x00p\x00e\x00r\x00s\x00e\x00\ p\x00o\x00l\x00i\x00s\x00d\x00m\x00<\x00\ /\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00M<\ a href=https://t\ elegram.me/perse\ polisdm>https://\ telegram.me/pers\ epolisdm\x07\x00\x00\x00\ \x0babout_ui_tr\x01\x03\x00\x00\ \x00\x9a\x00<\x00a\x00 \x00h\x00r\x00e\x00f\ \x00=\x00h\x00t\x00t\x00p\x00s\x00:\x00/\ \x00/\x00t\x00w\x00i\x00t\x00t\x00e\x00r\ \x00.\x00c\x00o\x00m\x00/\x00p\x00e\x00r\ \x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00d\ \x00m\x00>\x00h\x00t\x00t\x00p\x00s\x00:\ \x00/\x00/\x00t\x00w\x00i\x00t\x00t\x00e\ \x00r\x00.\x00c\x00o\x00m\x00/\x00p\x00e\ \x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\ \x00d\x00m\x00<\x00/\x00a\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00Mh\ ttps://twitter.c\ om/persepolisdm<\ /a>\x07\x00\x00\x00\x0babout_ui\ _tr\x01\x03\x00\x00\x00\x18\x00O\x00 \x00P\x00\ e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00\ s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10About\ Persepolis\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ \x16\x00D\x00e\x00w\x00e\x00l\x00o\x00p\x00\ e\x00r\x00z\x00y\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0aDevelopers\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ \x10\x00L\x00i\x00c\x00e\x00n\x00c\x00j\x00\ a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07Licen\ se\x07\x00\x00\x00\x0babout_ui_\ tr\x01\x03\x00\x00\x00\x04\x00O\x00K\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x02OK\x07\x00\x00\x00\x0babo\ ut_ui_tr\x01\x03\x00\x00\x00@\x00P\ \x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\ \x00s\x00 \x00-\x00 \x00m\x00e\x00n\x00a\ \x00d\x01|\x00e\x00r\x00 \x00p\x00o\x00b\ \x00i\x00e\x00r\x00a\x00n\x00i\x00a\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1bPersepol\ is Download Mana\ ger\x07\x00\x00\x00\x0babout_ui\ _tr\x01\x03\x00\x00\x00\x10\x00T\x01B\x00u\x00\ m\x00a\x00c\x00z\x00e\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0bTranslators\x07\x00\ \x00\x00\x0babout_ui_tr\x01\x03\ \x00\x00\x00&\x00D\x00o\x00d\x00a\x00j\x00 \ \x00d\x00o\x00 \x00k\x00a\x00t\x00e\x00g\ \x00o\x00r\x00i\x00i\x00:\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x11Add to categ\ ory: \x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x00$\x00O\x00\ p\x00c\x00j\x00e\x00 \x00z\x00a\x00a\x00\ w\x00a\x00n\x00s\x00o\x00w\x00a\x00n\x00\ e\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Advan\ ced Options\x07\x00\x00\x00\x0d\ addlink_ui_tr\x01\x03\x00\ \x00\x00\x0c\x00A\x00n\x00u\x00l\x00u\x00j\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x06Cancel\x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x00\x18\x00Z\x00m\x00i\x00e\x01\ D\x00 \x00f\x00o\x00l\x00d\x00e\x00r\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x16Change \ Download Folder\x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x00\x0e\x00F\x00o\x00l\x00d\x00\ e\x00r\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11D\ ownload Folder: \ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x00\x06\x00I\x00P\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x04IP: \x07\x00\x00\x00\ \x0daddlink_ui_tr\x01\x03\ \x00\x00\x00\x08\x00L\x00i\x00n\x00k\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x04Link\x07\x00\x00\x00\x0da\ ddlink_ui_tr\x01\x03\x00\x00\ \x00\x18\x00W\x00i\x01\x19\x00c\x00e\x00j\x00 \ \x00o\x00p\x00c\x00j\x00i\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0cMore Options\ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x00\x04\x00O\x00K\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x02OK\x07\x00\x00\x00\x0dadd\ link_ui_tr\x01\x03\x00\x00\x00\x0a\ \x00P\x00o\x00r\x00t\x00:\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x05Port:\x07\x00\x00\x00\x0dad\ dlink_ui_tr\x01\x03\x00\x00\x00\ \x0a\x00P\x00r\x00o\x00x\x00y\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x05Proxy\x07\x00\x00\x00\x0da\ ddlink_ui_tr\x01\x03\x00\x00\ \x00&\x00<\x00b\x00>\x00N\x00a\x00z\x00w\ \x00a\x00 \x00p\x00l\x00i\x00k\x00u\x00<\ \x00/\x00b\x00>\x00:\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x12File name: \x07\x00\x00\x00\x18after_d\ ownload_src_ui_t\ r\x01\x03\x00\x00\x00\x1e\x00<\x00b\x00>\x00R\x00\ o\x00z\x00m\x00i\x00a\x00r\x00<\x00/\x00\ b\x00>\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d<\ b>Size: \x07\x00\x00\x00\ \x18after_download_\ src_ui_tr\x01\x03\x00\x00\x00\x04\x00\ O\x00K\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08 \ OK \x07\x00\x00\x00\x14after_\ download_ui_tr\x01\x03\ \x00\x00\x00\x18\x00O\x00t\x00w\x00\xf3\x00r\x00z\ \x00 \x00p\x00l\x00i\x00k\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0d Open Fil\ e \x07\x00\x00\x00\x14after_do\ wnload_ui_tr\x01\x03\x00\x00\ \x00:\x00<\x00b\x00>\x00P\x00o\x00b\x00i\ \x00e\x00r\x00a\x00n\x00i\x00e\x00 \x00z\ \x00a\x00k\x00o\x01D\x00c\x00z\x00o\x00n\ \x00e\x00!\x00<\x00/\x00b\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x1aDownloa\ d Completed!\ \x07\x00\x00\x00\x14after_downl\ oad_ui_tr\x01\x03\x00\x00\x00\x18\x00\ <\x00b\x00>\x00L\x00i\x00n\x00k\x00<\x00\ /\x00b\x00>\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0dLink: \x07\x00\ \x00\x00\x14after_downloa\ d_ui_tr\x01\x03\x00\x00\x00&\x00<\x00\ b\x00>\x00Z\x00a\x00p\x00i\x00s\x00z\x00\ \x00j\x00a\x00k\x00o\x00<\x00/\x00b\x00\ >\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10\ Save as: \x07\x00\x00\ \x00\x14after_download\ _ui_tr\x01\x03\x00\x00\x00J\x00N\x00i\ \x00e\x00 \x00p\x00o\x00k\x00a\x00z\x00u\ \x00j\x00 \x00t\x00e\x00g\x00o\x00 \x00k\ \x00o\x00m\x00u\x00n\x00i\x00k\x00a\x00t\ \x00u\x00 \x00p\x00o\x00n\x00o\x00w\x00n\ \x00i\x00e\x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1e\ Don't show this \ message again.\x07\x00\ \x00\x00\x14after_downloa\ d_ui_tr\x01\x03\x00\x00\x000\x00O\x00\ t\x00w\x00\xf3\x00r\x00z\x00 \x00f\x00o\x00\ l\x00d\x00e\x00r\x00 \x00p\x00o\x00b\x00\ i\x00e\x00r\x00a\x00n\x00i\x00a\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x14Open Down\ load Folder\x07\x00\x00\x00\x14\ after_download_u\ i_tr\x01\x03\x00\x00\x00@\x00P\x00e\x00r\ \x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00 \ \x00-\x00 \x00m\x00e\x00n\x00a\x00d\x01|\ \x00e\x00r\x00 \x00p\x00o\x00b\x00i\x00e\ \x00r\x00a\x00n\x00i\x00a\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1bPersepolis D\ ownload Manager\x07\ \x00\x00\x00\x14after_downlo\ ad_ui_tr\x01\x03\x00\x00\x00\x1a\x00Z\ \x00g\x01B\x00o\x01[\x00 \x00p\x00r\x00o\ \x00b\x00l\x00e\x00m\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0cReport Issue\x07\x00\ \x00\x00\x10log_window_ui\ _tr\x01\x03\x00\x00\x00\xb4\x00<\x00b\x00>\x00\ <\x00c\x00e\x00n\x00t\x00e\x00r\x00>\x00\ T\x00e\x00n\x00 \x00l\x00i\x00n\x00k\x00\ \x00z\x00o\x00s\x00t\x00a\x01B\x00 \x00\ j\x00u\x01|\x00 \x00d\x00o\x00d\x00a\x00\ n\x00y\x00!\x00 \x00C\x00z\x00y\x00 \x00\ n\x00a\x00 \x00p\x00e\x00w\x00n\x00o\x00\ \x00c\x00h\x00c\x00e\x00s\x00z\x00 \x00\ g\x00o\x00 \x00d\x00o\x00d\x00a\x01\x07\x00\ \x00p\x00o\x00n\x00o\x00w\x00n\x00i\x00\ e\x00?\x00<\x00/\x00c\x00e\x00n\x00t\x00\ e\x00r\x00>\x00<\x00/\x00b\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00rThis link has \ been added befor\ e! \ Are you su\ re you want to a\ dd it again?\x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00$\x00<\x00b\x00>\x00P\ \x00o\x01B\x01\x05\x00c\x00z\x00e\x00n\x00i\ \x00a\x00<\x00/\x00b\x00>\x00:\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x14Connect\ ions: \x07\x00\x00\x00\x14m\ ainwindow_src_ui\ _tr\x01\x03\x00\x00\x00\x1e\x00<\x00b\x00>\x00\ P\x00o\x00b\x00r\x00a\x00n\x00o\x00<\x00\ /\x00b\x00>\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x13Downloaded: \x07\x00\x00\x00\x14mainwin\ dow_src_ui_tr\x01\x03\x00\ \x00\x00\x22\x00<\x00b\x00>\x00P\x00o\x00z\x00\ o\x00s\x00t\x00a\x01B\x00o\x00<\x00/\x00\ b\x00>\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1c<\ b>Estimated time\ left: \x07\x00\x00\x00\x14\ mainwindow_src_u\ i_tr\x01\x03\x00\x00\x00\x1a\x00<\x00b\x00>\ \x00L\x00i\x00n\x00k\x00<\x00/\x00b\x00>\ \x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dLink: \x07\x00\x00\x00\x14\ mainwindow_src_u\ i_tr\x01\x03\x00\x00\x00\x1e\x00<\x00b\x00>\ \x00S\x00t\x00a\x00t\x00u\x00s\x00<\x00/\ \x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0fStatus:\ \x07\x00\x00\x00\x14mainwindow\ _src_ui_tr\x01\x03\x00\x00\x006\ \x00<\x00b\x00>\x00S\x00z\x00y\x00b\x00k\ \x00o\x01[\x01\x07\x00 \x00p\x00o\x00b\x00i\ \x00e\x00r\x00a\x00n\x00i\x00a\x00<\x00/\ \x00b\x00>\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16\ Transfer rate\ : \x07\x00\x00\x00\x14mainw\ indow_src_ui_tr\x01\ \x03\x00\x00\x00(\x00P\x00o\x00b\x00i\x00e\x00\ r\x00a\x00n\x00i\x00e\x00 \x00u\x00k\x00\ o\x01D\x00c\x00z\x00o\x00n\x00e\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x11Download \ Complete\x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x00\x22\x00S\x00t\x00a\x00t\x00\ u\x00s\x00 \x00p\x00o\x00b\x00i\x00e\x00\ r\x00a\x00n\x00i\x00a\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0fDownload Star\ ts\x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ *\x00P\x00o\x00b\x00i\x00e\x00r\x00a\x00\ n\x00i\x00e\x00 \x00z\x00a\x00t\x00r\x00\ z\x00y\x00m\x00a\x00n\x00e\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x10Download St\ opped\x07\x00\x00\x00\x14mainwi\ ndow_src_ui_tr\x01\x03\ \x00\x00\x00\x0c\x00B\x01B\x01\x05\x00d\x00 \x00-\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x08Error \ - \x07\x00\x00\x00\x14mainwindo\ w_src_ui_tr\x01\x03\x00\x00\x00\ \x0a\x00B\x01B\x01\x05\x00d\x00:\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x07Error: \x07\x00\x00\x00\ \x14mainwindow_src_\ ui_tr\x01\x03\x00\x00\x00Z\x00B\x00r\x00\ a\x00k\x00 \x00w\x00y\x00s\x00t\x00a\x00\ r\x00c\x00z\x00a\x00j\x01\x05\x00c\x00e\x00\ j\x00 \x00i\x00l\x00o\x01[\x00c\x00i\x00\ \x00w\x00o\x00l\x00n\x00e\x00g\x00o\x00\ \x00m\x00i\x00e\x00j\x00s\x00c\x00a\x00\ \x00w\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x19N\ ot enough free s\ pace in:\x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x006\x00D\x00z\x00i\x00a\x01\ B\x00a\x00n\x00i\x00e\x00 \x00n\x00i\x00\ e\x00 \x00p\x00o\x00w\x00i\x00o\x00d\x01\ B\x00o\x00 \x00s\x00i\x01\x19\x00.\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x1dOperation\ was not success\ ful.\x07\x00\x00\x00\x14mainwin\ dow_src_ui_tr\x01\x03\x00\ \x00\x008\x00W\x00z\x00n\x00\xf3\x00w\x00 \x00\ n\x00a\x00s\x00t\x01\x19\x00p\x00u\x00j\x01\ \x05\x00c\x01\x05\x00 \x00k\x00a\x00t\x00e\x00\ g\x00o\x00r\x00i\x01\x19\x00:\x08\x00\x00\x00\x00\ \x06\x00\x00\x00&Please resu\ me the following\ category: \x07\x00\x00\x00\x14\ mainwindow_src_u\ i_tr\x01\x03\x00\x00\x00\x16\x00b\x01B\x01\x05\ \x00d\x00 \x00m\x00u\x00x\x00i\x00n\x00g\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0cmuxing\ error\x07\x00\x00\x00\x14mainw\ indow_src_ui_tr\x01\ \x03\x00\x00\x00\x0e\x00p\x00o\x00b\x00r\x00a\x00\ n\x00e\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0b do\ wnloaded\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x006\x00<\x00b\x00>\x00S\x00t\x00a\x00\ t\x00u\x00s\x00 \x00p\x00l\x00i\x00k\x00\ u\x00 \x00a\x00u\x00d\x00i\x00o\x00:\x00\ \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x1aAudio file\ status: \x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00,\x00<\x00b\x00>\x00S\ \x00t\x00a\x00t\x00u\x00s\x00 \x00m\x00u\ \x00x\x00i\x00n\x00g\x00:\x00 \x00<\x00/\ \x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Muxing status: \ \x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00\x1e\x00\ <\x00b\x00>\x00S\x00t\x00a\x00t\x00u\x00\ s\x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0fStatus\ : \x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ 6\x00<\x00b\x00>\x00S\x00t\x00a\x00t\x00\ u\x00s\x00 \x00p\x00l\x00i\x00k\x00u\x00\ \x00w\x00i\x00d\x00e\x00o\x00:\x00 \x00\ <\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1aVideo file s\ tatus: \x07\x00\x00\x00\x10\ mainwindow_ui_tr\ \x01\x03\x00\x00\x006\x00D\x00o\x00d\x00a\x00j\ \x00 \x00n\x00o\x00w\x00y\x00 \x00l\x00i\ \x00n\x00k\x00 \x00d\x00o\x00 \x00p\x00o\ \x00b\x00r\x00a\x00n\x00i\x00a\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x15Add New Do\ wnload Link\x07\x00\x00\x00\x10\ mainwindow_ui_tr\ \x01\x03\x00\x00\x00\x16\x00P\x00o\x00 \x00p\x00o\ \x00b\x00r\x00a\x00n\x00i\x00u\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0eAfter down\ load\x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00\x10\x00\ Z\x00a\x00s\x00t\x00o\x00s\x00u\x00j\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x05Apply\x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00D\x00D\x00o\x00w\x00\ n\x00l\x00o\x00a\x00d\x00 \x00b\x00o\x00\ t\x00t\x00o\x00m\x00 \x00o\x00f\x00\x0a\x00\ \x00t\x00h\x00e\x00 \x00l\x00i\x00s\x00\ t\x00 \x00f\x00i\x00r\x00s\x00t\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x22Download \ bottom of\x0a the l\ ist first\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00&\x00G\x00o\x00d\x00z\x00i\x00n\ \x00a\x00 \x00z\x00a\x00k\x00o\x01D\x00c\ \x00z\x00e\x00n\x00i\x00a\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x08End Time\x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00\x0e\x00W\x00y\x00j\x01[\x00\ c\x00i\x00e\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04E\ xit\x07\x00\x00\x00\x10mainwind\ ow_ui_tr\x01\x03\x00\x00\x00&\x00Z\ \x00a\x00p\x00a\x00u\x00z\x00u\x00j\x00 \ \x00p\x00o\x00b\x00i\x00e\x00r\x00a\x00n\ \x00i\x00e\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0ePa\ use Download\x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00@\x00P\x00e\x00r\x00s\x00\ e\x00p\x00o\x00l\x00i\x00s\x00 \x00-\x00\ \x00m\x00e\x00n\x00a\x00d\x01|\x00e\x00\ r\x00 \x00p\x00o\x00b\x00i\x00e\x00r\x00\ a\x00n\x00i\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1bPersepolis Down\ load Manager\x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00\x0c\x00P\x00o\x00s\x00t\x01\ \x19\x00p\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08Pro\ gress\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00\x16\ \x00W\x01B\x00a\x01[\x00c\x00i\x00w\x00o\ \x01[\x00c\x00i\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0a\ Properties\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x00 \x00W\x00z\x00n\x00\xf3\x00w\x00\ \x00p\x00o\x00b\x00i\x00e\x00r\x00a\x00\ n\x00i\x00e\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fR\ esume Download\x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00B\x00P\x00o\x00k\x00\ a\x00r\x00z\x00/\x00U\x00k\x00r\x00y\x00\ j\x00 \x00i\x00k\x00o\x00n\x01\x19\x00 \x00\ n\x00a\x00 \x00p\x00a\x00s\x00k\x00u\x00\ \x00z\x00a\x00d\x00a\x01D\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x1aShow/Hide s\ ystem tray icon\x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00\x0c\x00W\x00y\x01B\ \x01\x05\x00c\x00z\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09\ Shut Down\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00&\x00G\x00o\x00d\x00z\x00i\x00n\ \x00a\x00 \x00r\x00o\x00z\x00p\x00o\x00c\ \x00z\x01\x19\x00c\x00i\x00a\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0aStart Time\x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x006\x00Z\x00a\x00t\x00\ r\x00z\x00y\x00m\x00a\x00j\x00/\x00A\x00\ n\x00u\x00l\x00u\x00j\x00 \x00p\x00o\x00\ b\x00i\x00e\x00r\x00a\x00n\x00i\x00e\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x14Stop/Ca\ ncel Download\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00\x16\x00P\x00o\x00 \x00p\ \x00o\x00b\x00r\x00a\x00n\x00i\x00u\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0eAfter do\ wnload\x07\x00\x00\x00\x0eprogr\ ess_ui_tr\x01\x03\x00\x00\x00\x10\x00\ Z\x00a\x00s\x00t\x00o\x00s\x00u\x00j\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x05Apply\x07\x00\ \x00\x00\x0eprogress_ui_t\ r\x01\x03\x00\x00\x00*\x00I\x00n\x00f\x00o\x00\ r\x00m\x00a\x00c\x00j\x00e\x00 \x00o\x00\ \x00p\x00o\x00b\x00r\x00a\x00n\x00i\x00\ u\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Downl\ oad Information\x07\ \x00\x00\x00\x0eprogress_ui_\ tr\x01\x03\x00\x00\x00 \x00O\x00p\x00c\x00j\ \x00e\x00 \x00p\x00o\x00b\x00i\x00e\x00r\ \x00a\x00n\x00i\x00a\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x10Download Optio\ ns\x07\x00\x00\x00\x0eprogress_\ ui_tr\x01\x03\x00\x00\x00\x10\x00P\x00o\x00\ b\x00r\x00a\x00n\x00e\x00:\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0bDownloaded:\ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00\x14\x00P\x00o\x00z\x00\ o\x00s\x00t\x00a\x01B\x00o\x00:\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x14Estimated\ time left:\x07\x00\x00\x00\x0e\ progress_ui_tr\x01\x03\ \x00\x00\x00 \x00L\x00i\x00c\x00z\x00b\x00a\ \x00 \x00p\x00o\x01B\x01\x05\x00c\x00z\x00e\ \x01D\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x17Nu\ mber of connecti\ ons: \x07\x00\x00\x00\x0eprogre\ ss_ui_tr\x01\x03\x00\x00\x00\x0a\x00P\ \x00a\x00u\x00z\x00a\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x05Pause\x07\x00\x00\x00\x0eprog\ ress_ui_tr\x01\x03\x00\x00\x00@\ \x00P\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x00 \x00-\x00 \x00m\x00e\x00n\ \x00a\x00d\x01|\x00e\x00r\x00 \x00p\x00o\ \x00b\x00i\x00e\x00r\x00a\x00n\x00i\x00a\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bPersep\ olis Download Ma\ nager\x07\x00\x00\x00\x0eprogre\ ss_ui_tr\x01\x03\x00\x00\x00\x0a\x00W\ \x00z\x00n\x00\xf3\x00w\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x06Resume\x07\x00\x00\x00\x0epro\ gress_ui_tr\x01\x03\x00\x00\x00\ \x0c\x00W\x00y\x01B\x01\x05\x00c\x00z\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x09Shut Down\ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00\x0e\x00S\x00t\x00a\x00\ t\x00u\x00s\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x08Status: \x07\x00\x00\x00\x0epr\ ogress_ui_tr\x01\x03\x00\x00\ \x00\x08\x00S\x00t\x00o\x00p\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x04Stop\x07\x00\x00\x00\x0epro\ gress_ui_tr\x01\x03\x00\x00\x00\ (\x00S\x00z\x00y\x00b\x00k\x00o\x01[\x01\ \x07\x00 \x00p\x00o\x00b\x00i\x00e\x00r\x00\ a\x00n\x00i\x00a\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0fTransfer rate\ : \x07\x00\x00\x00\x0eprogress_\ ui_tr\x01\x03\x00\x00\x00\x94\x00<\x00b\x00\ >\x00<\x00c\x00e\x00n\x00t\x00e\x00r\x00\ >\x00T\x00a\x00 \x00k\x00o\x00m\x00b\x00\ i\x00n\x00a\x00c\x00j\x00a\x00 \x00z\x00\ o\x00s\x00t\x00a\x01B\x00a\x00 \x00j\x00\ e\x00s\x00t\x00 \x00j\x00u\x01|\x00 \x00\ z\x00a\x00j\x01\x19\x00t\x00a\x00.\x00 \x00\ U\x01|\x00y\x00j\x00 \x00i\x00n\x00n\x00\ e\x00j\x00 \x00<\x00/\x00c\x00e\x00n\x00\ t\x00e\x00r\x00>\x00<\x00/\x00b\x00>\x08\ \x00\x00\x00\x00\x06\x00\x00\x00_This shortcu\ t has been used \ before! \ Use a\ nother one!\x07\x00\x00\x00\x11set\ ting_src_ui_tr\x01\x03\ \x00\x00\x00h\x00<\x00h\x00t\x00m\x00l\x00>\ \x00<\x00h\x00e\x00a\x00d\x00/\x00>\x00<\ \x00b\x00o\x00d\x00y\x00>\x00<\x00p\x00>\ \x00F\x00o\x00r\x00m\x00a\x00t\x00 \x00H\ \x00H\x00:\x00M\x00M\x00<\x00/\x00p\x00>\ \x00<\x00/\x00b\x00o\x00d\x00y\x00>\x00<\ \x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x004

Form\ at HH:MM

\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x86\x00<\x00h\x00t\x00m\x00l\x00>\x00<\ \x00h\x00e\x00a\x00d\x00/\x00>\x00<\x00b\ \x00o\x00d\x00y\x00>\x00<\x00p\x00>\x00U\ \x00s\x00t\x00a\x00w\x00 \x00t\x00i\x00m\ \x00e\x00o\x00u\x00t\x00 \x00w\x00 \x00s\ \x00e\x00k\x00u\x00n\x00d\x00a\x00c\x00h\ \x00.\x00 \x00<\x00/\x00p\x00>\x00<\x00/\ \x00b\x00o\x00d\x00y\x00>\x00<\x00/\x00h\ \x00t\x00m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\ \x00@<\ body>

Set time\ out in seconds. \

\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\xc2\x00<\x00h\x00t\ \x00m\x00l\x00>\x00<\x00h\x00e\x00a\x00d\ \x00/\x00>\x00<\x00b\x00o\x00d\x00y\x00>\ \x00<\x00p\x00>\x00T\x00a\x00 \x00f\x00u\ \x00n\x00k\x00c\x00j\x00a\x00 \x00m\x00o\ \x01|\x00e\x00 \x00n\x00i\x00e\x00 \x00d\ \x00z\x00i\x00a\x01B\x00a\x01\x07\x00 \x00w\ \x00 \x00t\x00w\x00o\x00i\x00m\x00 \x00s\ \x00y\x00s\x00t\x00e\x00m\x00i\x00e\x00 \ \x00o\x00p\x00e\x00r\x00a\x00c\x00y\x00j\ \x00n\x00y\x00m\x00.\x00<\x00/\x00p\x00>\ \x00<\x00/\x00b\x00o\x00d\x00y\x00>\x00<\ \x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00[

This\ feature may not\ work in your op\ erating system.<\ /p>\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00t\x00K\x00o\x00r\x00\ z\x00y\x00s\x00t\x00a\x00n\x00i\x00e\x00\ \x00z\x00 \x00w\x00i\x00e\x00l\x00u\x00\ \x00p\x00o\x01B\x01\x05\x00c\x00z\x00e\x01\ D\x00 \x00m\x00o\x01|\x00e\x00 \x00p\x00\ r\x00z\x00y\x00s\x00p\x00i\x00e\x00s\x00\ z\x00y\x01\x07\x00 \x00p\x00o\x00b\x00i\x00\ e\x00r\x00a\x00n\x00i\x00e\x00.\x08\x00\x00\ \x00\x00\x06\x00\x00\x00c

Usi\ ng multiple conn\ ections can help\ speed up your d\ ownload.

\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x0c\x00A\x00n\x00u\x00l\x00u\x00j\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x06Cancel\x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00\x0a\x00Z\x00m\x00i\x00e\x01D\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Change\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00 \x00S\x00c\x00h\x00e\ \x00m\x00a\x00t\x00 \x00k\x00o\x00l\x00o\ \x00r\x00\xf3\x00w\x00:\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0eColor scheme: \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x10\x00D\x00o\x00m\x00y\ \x01[\x00l\x00n\x00e\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x08Defaults\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00 \x00O\x00p\x00c\x00j\x00e\x00 \x00p\ \x00o\x00b\x00i\x00e\x00r\x00a\x00n\x00i\ \x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Down\ load Options\x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x12\x00C\x00z\x00c\x00i\x00o\x00n\ \x00k\x00a\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06\ Font: \x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00f\x00S\ \x00c\x00h\x00o\x00w\x00a\x00j\x00 \x00o\ \x00k\x00n\x00o\x00 \x00g\x01B\x00\xf3\x00w\ \x00n\x00e\x00 \x00p\x00o\x00 \x00k\x00l\ \x00i\x00k\x00n\x00i\x01\x19\x00c\x00i\x00u\ \x00 \x00p\x00r\x00z\x00y\x00c\x00i\x00s\ \x00k\x00u\x00 \x00z\x00a\x00m\x00k\x00n\ \x00i\x00j\x08\x00\x00\x00\x00\x06\x00\x00\x00)Hi\ de main window i\ f close button c\ licked.\x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x0c\x00\ I\x00k\x00o\x00n\x00y\x00:\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x07Icons: \x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00(\x00N\x00i\x00e\x00 \x00u\x00s\ \x00y\x00p\x00i\x00a\x00j\x00 \x00s\x00y\ \x00s\x00t\x00e\x00m\x00u\x00!\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x12Keep syste\ m awake!\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00$\ \x00T\x00y\x00p\x00 \x00p\x00o\x00w\x00i\ \x00a\x00d\x00o\x00m\x00i\x00e\x00n\x00i\ \x00a\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x13No\ tification type:\ \x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x1a\x00P\x00o\x00w\x00\ i\x00a\x00d\x00o\x00m\x00i\x00e\x00n\x00\ i\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dNot\ ifications\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00 \x00L\x00i\x00c\x00z\x00b\x00a\x00 \ \x00p\x00o\x01B\x01\x05\x00c\x00z\x00e\x01D\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x17Numb\ er of connection\ s: \x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00*\x00L\x00i\x00\ c\x00z\x00b\x00a\x00 \x00p\x00r\x00\xf3\x00\ b\x00 \x00p\x00o\x00b\x00r\x00a\x00n\x00\ i\x00a\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x11N\ umber of tries: \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x04\x00O\x00K\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x02OK\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00\x16\ \x00P\x00r\x00e\x00f\x00e\x00r\x00e\x00n\ \x00c\x00j\x00e\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0b\ Preferences\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00*\x00W\x00c\x00i\x01[\x00n\x00i\x00\ j\x00 \x00n\x00o\x00w\x00e\x00 \x00k\x00\ l\x00a\x00w\x00i\x00s\x00z\x00e\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0ePress new\ keys\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00N\x00U\x00\ r\x00u\x00c\x00h\x00o\x00m\x00 \x00P\x00\ e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00\ s\x00 \x00p\x00r\x00z\x00y\x00 \x00s\x00\ t\x00a\x00r\x00c\x00i\x00e\x00 \x00s\x00\ y\x00s\x00t\x00e\x00m\x00u\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x19Run Persepo\ lis at startup\x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x00\x0c\x00S\x00k\x00r\x00\xf3\x00t\ \x00y\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09Shor\ tcuts\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x10\x00R\x00\ o\x00z\x00m\x00i\x00a\x00r\x00:\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x06Size: \x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x0c\x00S\x00t\x00a\x00t\x00u\x00\ s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Statu\ s\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x0a\x00S\x00t\x00y\x00\ l\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07Sty\ le: \x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00&\x00T\x00i\ \x00m\x00e\x00o\x00u\x00t\x00 \x00(\x00s\ \x00e\x00k\x00u\x00n\x00d\x00y\x00)\x00:\ \x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x13Time\ out (seconds): \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x000\x00O\x00p\x00c\x00j\x00\ e\x00 \x00w\x00y\x00s\x00z\x00u\x00k\x00\ i\x00w\x00a\x00r\x00k\x00i\x00 \x00w\x00\ i\x00d\x00e\x00o\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x14Video Finder Op\ tions\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x12\x00G\x01\ B\x00o\x01[\x00n\x00o\x01[\x01\x07\x00:\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x08Volume:\ \x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x18\x00Z\x00m\x00i\x00\ e\x01D\x00 \x00f\x00o\x00l\x00d\x00e\x00\ r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Chang\ e Download Folde\ r\x07\x00\x00\x00\x0atext_ui_tr\ \x01\x03\x00\x00\x00\x06\x00I\x00P\x00:\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x03IP:\x07\x00\x00\x00\x0ate\ xt_ui_tr\x01\x03\x00\x00\x00@\x00P\ \x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\ \x00s\x00 \x00-\x00 \x00m\x00e\x00n\x00a\ \x00d\x01|\x00e\x00r\x00 \x00p\x00o\x00b\ \x00i\x00e\x00r\x00a\x00n\x00i\x00a\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1bPersepol\ is Download Mana\ ger\x07\x00\x00\x00\x0atext_ui_\ tr\x01\x03\x00\x00\x00\x0a\x00P\x00o\x00r\x00t\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Port\ :\x07\x00\x00\x00\x0atext_ui_tr\ \x01\x03\x00\x00\x006\x00<\x00b\x00>\x00S\x00t\ \x00a\x00t\x00u\x00s\x00 \x00p\x00l\x00i\ \x00k\x00u\x00 \x00a\x00u\x00d\x00i\x00o\ \x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x1aAudio f\ ile status: \ \x07\x00\x00\x00\x1bvideo_finde\ r_progress_ui_tr\ \x01\x03\x00\x00\x00,\x00<\x00b\x00>\x00S\x00t\ \x00a\x00t\x00u\x00s\x00 \x00m\x00u\x00x\ \x00i\x00n\x00g\x00:\x00 \x00<\x00/\x00b\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16M\ uxing status: \x07\x00\x00\x00\x1bvideo_fin\ der_progress_ui_\ tr\x01\x03\x00\x00\x006\x00<\x00b\x00>\x00S\ \x00t\x00a\x00t\x00u\x00s\x00 \x00p\x00l\ \x00i\x00k\x00u\x00 \x00w\x00i\x00d\x00e\ \x00o\x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1aVideo\ file status: \x07\x00\x00\x00\x1bvideo_fin\ der_progress_ui_\ tr\x01\x88\x00\x00\x00\x0a\x01\x01\xff\x14\x02\x04\xfd,\ \x0a\x13\ \x00\x001i\ <\ \xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\xa7\ \x00\x00\x00\x02trB\x00\x00\x03\xa8\x00\x00\x05;\x00\ \x00\x03\xd8\x00\x00\x05;\x00\x00\x07\x0e\x00\x00\x05;\x00\ \x00'\xe0\x00\x00N:\x00\x00+`\x00\x04\xcf\x04\x00\ \x00\x16\xc5\x00\x04\xe3\xc0\x00\x00\x06X\x00\x050K\x00\ \x00\x06\x86\x00\x05\xab`\x00\x00\x1d\xaa\x00Hw9\x00\ \x00\x15\xc7\x00Hw9\x00\x00\x1ak\x00V\x8c\x95\x00\ \x00\x1cR\x00Wiz\x00\x00\x07<\x00Wiz\x00\ \x00+\xfc\x00W\x96\xf9\x00\x00\x07m\x00\x97\xa2\x10\x00\ \x00\x04\xba\x00\xc2\xad\xd0\x00\x00\x0d\xbb\x01\x18\xab\xd4\x00\ \x00\x15\xfd\x01\x8bp\x0e\x00\x00!:\x02S\xd0\x00\x00\ \x00\x08Y\x02\x9a\xf5p\x00\x00\x0e\x1b\x02\xf9\xc5\xc5\x00\ \x00\x03\xa5\x03\x0d1^\x00\x00\x0a\x22\x03\x1c\xc5*\x00\ \x00\x1bM\x03<\x83\x03\x00\x00\x06\xbc\x03KF\xe3\x00\ \x00\x1a\xf4\x03KF\xe3\x00\x00$\xc6\x03\x92\xd2\xce\x00\ \x00%\x5c\x03\xdc\xdc%\x00\x00\x0b~\x04]I3\x00\ \x00(M\x04e\xac\xf5\x00\x00\x16\x80\x04\x98I\xbc\x00\ \x00\x05g\x04\x98I\xbc\x00\x00#\xcc\x04\x9e\x84\xd5\x00\ \x00$\x00\x04\xd6W\xc0\x00\x00%\x1e\x05\x13\xccT\x00\ \x00\x13\x1b\x05_. \x00\x00\x12-\x05_\xa8`\x00\ \x00\x0e\xee\x05i<\xfe\x00\x00\x149\x05v\x1b\x9e\x00\ \x00\x0b\xc9\x05\x8c\xac5\x00\x00\x1d\x02\x05\xa1\x08\xc0\x00\ \x00)]\x05\xa3\x9c>\x00\x00\x13\xd2\x05\xa3\x9c>\x00\ \x00,\xaa\x05\xa8X\xf3\x00\x00\x03\x09\x05\xaa\x8b\xc3\x00\ \x00)\x93\x06-B\x0e\x00\x00\x13]\x06-B\x0e\x00\ \x00,*\x069\x82N\x00\x00\x14\x89\x069\x82N\x00\ \x00-\x1c\x06<=\x10\x00\x00*\xc1\x06]1\xde\x00\ \x00\x02\x02\x06\x9aK\x00\x00\x00\x08\xa0\x06\x9a\xf5C\x00\ \x00)\x1e\x06\x9c(\x01\x00\x00&>\x06\xc5)*\x00\ \x00\x1b\x8f\x06\xcc\xd6\xa3\x00\x00\x18\x08\x07\x14*\x1e\x00\ \x00\x18\xa3\x076\xcf`\x00\x00\x06\x05\x07[&u\x00\ \x00\x0f\xaf\x07\x9b]0\x00\x00'\x8f\x07\x9c1\x03\x00\ \x00*[\x08g-\xa2\x00\x00\x0a\x9d\x09>\x0d$\x00\ \x00\x19\xaf\x09^\x89\xd3\x00\x00\x17\xcb\x09`\x06\xb5\x00\ \x00\x19d\x09g\x01\xd0\x00\x00)\xfa\x09\x93\xd2\xfe\x00\ \x00\x1a\x9f\x09\x96F0\x00\x00\x10\xc0\x0a\x0c\x87\x0e\x00\ \x00\x1f~\x0a_\xd7\x0e\x00\x00\x08\xee\x0a_\xf3\xfb\x00\ \x00\x15\x02\x0as>\xc3\x00\x00\x04y\x0a\x8b\xc3`\x00\ \x00\x1dq\x0a\x97\x00\x80\x00\x00\x08\x03\x0a\xa2Yp\x00\ \x00(\xa1\x0a\xc0(\x90\x00\x00)\xc5\x0b`r`\x00\ \x00&\x98\x0bn\xb1\xee\x00\x00\x22e\x0bv\x04\xf0\x00\ \x00\x0dV\x0b\x89w\x94\x00\x00\x15t\x0b\x89w\x94\x00\ \x00\x1a\x1a\x0b\xc8\xc7\x13\x00\x00$\x82\x0b\xf9\x95\xb3\x00\ \x00\x10\x0d\x0c(\x19\x04\x00\x00\x18K\x0c2\xc0S\x00\ \x00\x03_\x0ce\x0f.\x00\x00\x19,\x0ce\x0f.\x00\ \x00\x1d;\x0c\x96q\xc0\x00\x00\x09e\x0c\x96q\xc0\x00\ \x00\x0e\x96\x0c\x99e\x80\x00\x00\x10\xff\x0c\xb5\x86\x80\x00\ \x00\x1b\xec\x0c\xb5\x86\x80\x00\x00'*\x0c\xdd\xc2\x03\x00\ \x00(\x0e\x0c\xe0\x1a\xf3\x00\x00&\xeb\x0c\xfb\xe0\x8a\x00\ \x00\x11;\x0dq\x98\xde\x00\x00\x00\x00\x0d\x99\xf9B\x00\ \x00\x04\x04\x0d\x99\xf9B\x00\x00\x0b\x00\x0d\x99\xf9B\x00\ \x00\x17Q\x0d\x99\xf9B\x00\x00\x1c\x8a\x0d\x99\xf9B\x00\ \x00+\x88\x0e i\x22\x00\x00\x12\xcc\x0e.d\xa4\x00\ \x00\x16\xf8\x0e7I\xc3\x00\x00\x05\x0f\x0ex\xa8B\x00\ \x00\x05\x9b\x0ex\xa8B\x00\x00*\xf9\x0e\xc4J\xf0\x00\ \x00\x07\xa0\x0e\xda\xd4\xfe\x00\x00\x1e/\x0f6\xb6\x90\x00\ \x00\x0fB\x0f}\x11p\x00\x00\x09\xbd\x0f\xa6V\x80\x00\ \x00&\x01\x0f\xa7\xb6\x04\x00\x00\x10c\x0f\xac[\xee\x00\ \x00\x11\xb9\x0f\xd1?\x00\x00\x00\x1d\xdd\x0f\xd6\xe5\xde\x00\ \x00 :\x0f\xde{\xf0\x00\x00$8\x0f\xf3\x03\x0e\x00\ \x00\x00\xfbi\x00\x00-\xa0\x03\x00\x00\x00\x92\x00<\x00\ a\x00 \x00h\x00r\x00e\x00f\x00=\x00h\x00\ t\x00t\x00p\x00s\x00:\x00/\x00/\x00p\x00\ e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00\ s\x00d\x00m\x00.\x00g\x00i\x00t\x00h\x00\ u\x00b\x00.\x00i\x00o\x00>\x00h\x00t\x00\ t\x00p\x00s\x00:\x00/\x00/\x00p\x00e\x00\ r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00\ d\x00m\x00.\x00g\x00i\x00t\x00h\x00u\x00\ b\x00.\x00i\x00o\x00<\x00/\x00a\x00>\x08\ \x00\x00\x00\x00\x06\x00\x00\x00I
\ https://persepol\ isdm.github.io\x07\x00\x00\x00\x0babout_ui_\ tr\x01\x03\x00\x00\x00\x9a\x00<\x00a\x00 \x00h\ \x00r\x00e\x00f\x00=\x00h\x00t\x00t\x00p\ \x00s\x00:\x00/\x00/\x00t\x00e\x00l\x00e\ \x00g\x00r\x00a\x00m\x00.\x00m\x00e\x00/\ \x00p\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x00d\x00m\x00>\x00h\x00t\x00t\ \x00p\x00s\x00:\x00/\x00/\x00t\x00e\x00l\ \x00e\x00g\x00r\x00a\x00m\x00.\x00m\x00e\ \x00/\x00p\x00e\x00r\x00s\x00e\x00p\x00o\ \x00l\x00i\x00s\x00d\x00m\x00<\x00/\x00a\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00Mhttps://tel\ egram.me/persepo\ lisdm\x07\x00\x00\x00\x0bab\ out_ui_tr\x01\x03\x00\x00\x00\x9a\x00\ <\x00a\x00 \x00h\x00r\x00e\x00f\x00=\x00\ h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00\ t\x00w\x00i\x00t\x00t\x00e\x00r\x00.\x00\ c\x00o\x00m\x00/\x00p\x00e\x00r\x00s\x00\ e\x00p\x00o\x00l\x00i\x00s\x00d\x00m\x00\ >\x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00\ /\x00t\x00w\x00i\x00t\x00t\x00e\x00r\x00\ .\x00c\x00o\x00m\x00/\x00p\x00e\x00r\x00\ s\x00e\x00p\x00o\x00l\x00i\x00s\x00d\x00\ m\x00<\x00/\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\ \x00\x00Mhttp\ s://twitter.com/\ persepolisdm\ \x07\x00\x00\x00\x0babout_ui_tr\ \x01\x03\x00\x00\x00&\x00P\x00e\x00r\x00s\x00e\ \x00p\x00o\x00l\x00i\x00s\x00 \x00H\x00a\ \x00k\x00k\x011\x00n\x00d\x00a\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x10About Pers\ epolis\x07\x00\x00\x00\x0babout\ _ui_tr\x01\x03\x00\x00\x00\x1c\x00G\x00e\ \x00l\x00i\x01_\x00t\x00i\x00r\x00i\x00c\ \x00i\x00l\x00e\x00r\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0aDevelopers\x07\x00\x00\x00\ \x0babout_ui_tr\x01\x03\x00\x00\ \x00\x0c\x00L\x00i\x00s\x00a\x00n\x00s\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x07License\x07\ \x00\x00\x00\x0babout_ui_tr\x01\ \x03\x00\x00\x00\x0a\x00T\x00a\x00m\x00a\x00m\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x02OK\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ :\x00P\x00e\x00r\x00s\x00e\x00p\x00o\x00\ l\x00i\x00s\x00 \x010\x00n\x00d\x00i\x00\ r\x00m\x00e\x00 \x00Y\x00\xf6\x00n\x00e\x00\ t\x00i\x00c\x00i\x00s\x00i\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x1bPersepolis \ Download Manager\ \x07\x00\x00\x00\x0babout_ui_tr\ \x01\x03\x00\x00\x00\x16\x00\xc7\x00e\x00v\x00i\x00r\ \x00m\x00e\x00n\x00l\x00e\x00r\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0bTranslator\ s\x07\x00\x00\x00\x0babout_ui_t\ r\x01\x03\x00\x00\x00\x22\x00K\x00a\x00t\x00e\x00\ g\x00o\x00r\x00i\x00y\x00e\x00 \x00e\x00\ k\x00l\x00e\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x11Add to catego\ ry: \x07\x00\x00\x00\x0daddlink\ _ui_tr\x01\x03\x00\x00\x00&\x00G\x00e\ \x00l\x00i\x01_\x00m\x00i\x01_\x00 \x00S\ \x00e\x00\xe7\x00e\x00n\x00e\x00k\x00l\x00e\ \x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Adva\ nced Options\x07\x00\x00\x00\ \x0daddlink_ui_tr\x01\x03\ \x00\x00\x00\x0c\x00V\x00a\x00z\x00g\x00e\x00\xe7\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Cancel\ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x002\x010\x00n\x00d\x00i\ \x00r\x00m\x00e\x00 \x00D\x00i\x00z\x00i\ \x00n\x00i\x00n\x00i\x00 \x00D\x00e\x01\x1f\ \x00i\x01_\x00t\x00i\x00r\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x16Change Downl\ oad Folder\x07\x00\x00\x00\x0da\ ddlink_ui_tr\x01\x03\x00\x00\ \x00 \x010\x00n\x00d\x00i\x00r\x00m\x00e\ \x00 \x00D\x00i\x00z\x00i\x00n\x00i\x00:\ \x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Down\ load Folder: \x07\x00\x00\ \x00\x0daddlink_ui_tr\x01\ \x03\x00\x00\x00\x08\x00I\x00P\x00:\x00 \x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x04IP: \x07\x00\x00\x00\x0d\ addlink_ui_tr\x01\x03\x00\ \x00\x00\x10\x00B\x00a\x01\x1f\x00l\x00a\x00n\x00\ t\x011\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04Lin\ k\x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00$\x00D\x00a\x00h\x00\ a\x00 \x00F\x00a\x00z\x00l\x00a\x00 \x00\ S\x00e\x00\xe7\x00e\x00n\x00e\x00k\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0cMore Opti\ ons\x07\x00\x00\x00\x0daddlink_\ ui_tr\x01\x03\x00\x00\x00\x0a\x00T\x00a\x00\ m\x00a\x00m\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02O\ K\x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00\x0a\x00P\x00o\x00r\x00\ t\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Por\ t:\x07\x00\x00\x00\x0daddlink_u\ i_tr\x01\x03\x00\x00\x00\x0c\x00P\x00r\x00o\ \x00k\x00s\x00i\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05\ Proxy\x07\x00\x00\x00\x0daddlin\ k_ui_tr\x01\x03\x00\x00\x00$\x00<\x00\ b\x00>\x00D\x00o\x00s\x00y\x00a\x00 \x00\ a\x00d\x011\x00<\x00/\x00b\x00>\x00:\x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x12Fi\ le name: \x07\x00\x00\ \x00\x18after_download\ _src_ui_tr\x01\x03\x00\x00\x00\x1c\ \x00<\x00b\x00>\x00B\x00o\x00y\x00u\x00t\ \x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0dSize
: \x07\x00\x00\x00\x18after_do\ wnload_src_ui_tr\ \x01\x03\x00\x00\x00\x16\x00 \x00 \x00 \x00T\x00a\ \x00m\x00a\x00m\x00 \x00 \x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x08 OK \x07\x00\ \x00\x00\x14after_downloa\ d_ui_tr\x01\x03\x00\x00\x00\x18\x00 \x00\ \x00D\x00o\x00s\x00y\x00a\x00 \x00A\x00\ \xe7\x00 \x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d \ Open File \x07\x00\x00\x00\ \x14after_download_\ ui_tr\x01\x03\x00\x00\x004\x00<\x00b\x00\ >\x010\x00n\x00d\x00i\x00r\x00m\x00e\x00\ \x00T\x00a\x00m\x00a\x00m\x00l\x00a\x00\ n\x00d\x011\x00!\x00<\x00/\x00b\x00>\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x1aDown\ load Completed!<\ /b>\x07\x00\x00\x00\x14after_do\ wnload_ui_tr\x01\x03\x00\x00\ \x00\x22\x00<\x00b\x00>\x00B\x00a\x01\x1f\x00l\ \x00a\x00n\x00t\x011\x00<\x00/\x00b\x00>\ \x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dLink: \x07\x00\x00\x00\x14\ after_download_u\ i_tr\x01\x03\x00\x00\x00,\x00<\x00b\x00>\ \x00F\x00a\x00r\x00k\x00l\x011\x00 \x00k\ \x00a\x00y\x00d\x00e\x00t\x00<\x00/\x00b\ \x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x10\ Save as: \ \x07\x00\x00\x00\x14after_downl\ oad_ui_tr\x01\x03\x00\x00\x004\x00\ B\x00u\x00 \x00m\x00e\x00s\x00a\x00j\x01\ 1\x00 \x00t\x00e\x00k\x00r\x00a\x00r\x00\ \x00g\x00\xf6\x00s\x00t\x00e\x00r\x00m\x00\ e\x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1eDon\ 't show this mes\ sage again.\x07\x00\x00\x00\x14\ after_download_u\ i_tr\x01\x03\x00\x00\x00&\x010\x00n\x00d\ \x00i\x00r\x00m\x00e\x00 \x00D\x00i\x00z\ \x00i\x00n\x00i\x00n\x00i\x00 \x00A\x00\xe7\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Open D\ ownload Folder\x07\x00\ \x00\x00\x14after_downloa\ d_ui_tr\x01\x03\x00\x00\x00:\x00P\x00\ e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00\ s\x00 \x010\x00n\x00d\x00i\x00r\x00m\x00\ e\x00 \x00Y\x00\xf6\x00n\x00e\x00t\x00i\x00\ c\x00i\x00s\x00i\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x1bPersepolis Down\ load Manager\x07\x00\x00\x00\ \x14after_download_\ ui_tr\x01\x03\x00\x00\x00\x1a\x00S\x00o\x00\ r\x00u\x00n\x00 \x00R\x00a\x00p\x00o\x00\ r\x00l\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0cR\ eport Issue\x07\x00\x00\x00\x10\ log_window_ui_tr\ \x01\x03\x00\x00\x00\xf2\x00<\x00b\x00>\x00<\x00c\ \x00e\x00n\x00t\x00e\x00r\x00>\x00B\x00u\ \x00 \x00b\x00a\x01\x1f\x00l\x00a\x00n\x00t\ \x011\x00 \x00d\x00a\x00h\x00a\x00 \x00\xf6\ \x00n\x00c\x00e\x00 \x00e\x00k\x00l\x00e\ \x00n\x00m\x00i\x01_\x00t\x00i\x00r\x00!\ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00T\x00e\x00k\x00r\ \x00a\x00r\x00 \x00e\x00k\x00l\x00e\x00m\ \x00e\x00k\x00 \x00i\x00s\x00t\x00e\x00d\ \x00i\x01\x1f\x00i\x00n\x00i\x00z\x00d\x00e\ \x00n\x00 \x00e\x00m\x00i\x00n\x00 \x00m\ \x00i\x00s\x00i\x00n\x00i\x00z\x00?\x00<\ \x00/\x00c\x00e\x00n\x00t\x00e\x00r\x00>\ \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\ \x00r
Thi\ s link has been \ added before! \ \ Are you sure yo\ u want to add it\ again?
\
\x07\x00\x00\x00\x14mainwin\ dow_src_ui_tr\x01\x03\x00\ \x00\x00(\x00<\x00b\x00>\x00B\x00a\x01\x1f\x00\ l\x00a\x00n\x00t\x011\x00l\x00a\x00r\x00\ <\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x14Connecti\ ons: \x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00$\x00<\x00b\x00>\x010\ \x00n\x00d\x00i\x00r\x00i\x00l\x00d\x00i\ \x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x13Downloa\ ded: \x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x006\x00<\x00b\x00>\x00T\ \x00a\x00h\x00m\x00i\x00n\x00i\x00 \x00k\ \x00a\x00l\x00a\x00n\x00 \x00s\x00\xfc\x00r\ \x00e\x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x1cEstim\ ated time left: \x07\x00\x00\x00\x14mainwin\ dow_src_ui_tr\x01\x03\x00\ \x00\x00\x22\x00<\x00b\x00>\x00B\x00a\x01\x1f\x00\ l\x00a\x00n\x00t\x011\x00<\x00/\x00b\x00\ >\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d<\ b>Link: \x07\x00\x00\x00\ \x14mainwindow_src_\ ui_tr\x01\x03\x00\x00\x00\x1c\x00<\x00b\x00\ >\x00D\x00u\x00r\x00u\x00m\x00<\x00/\x00\ b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0fStatus: \ \x07\x00\x00\x00\x14mainwindow_\ src_ui_tr\x01\x03\x00\x00\x00.\x00\ <\x00b\x00>\x00T\x00r\x00a\x00n\x00s\x00\ f\x00e\x00r\x00 \x00o\x00r\x00a\x00n\x01\ 1\x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x16Transf\ er rate: \x07\x00\x00\ \x00\x14mainwindow_src\ _ui_tr\x01\x03\x00\x00\x00$\x010\x00n\ \x00d\x00i\x00r\x00m\x00e\x00 \x00T\x00a\ \x00m\x00a\x00m\x00l\x00a\x00n\x00d\x011\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Downlo\ ad Complete\x07\x00\x00\x00\x14\ mainwindow_src_u\ i_tr\x01\x03\x00\x00\x00\x1e\x010\x00n\x00d\ \x00i\x00r\x00m\x00e\x00 \x00B\x00a\x01_\ \x00l\x00a\x00d\x011\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0fDownload Start\ s\x07\x00\x00\x00\x14mainwindow\ _src_ui_tr\x01\x03\x00\x00\x00$\ \x010\x00n\x00d\x00r\x00i\x00m\x00e\x00 \ \x00D\x00u\x00r\x00d\x00u\x00r\x00u\x00l\ \x00d\x00u\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Do\ wnload Stopped\x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x00\x0e\x00H\x00\ a\x00t\x00a\x00 \x00-\x00 \x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x08Error - \x07\x00\x00\ \x00\x14mainwindow_src\ _ui_tr\x01\x03\x00\x00\x00\x0c\x00H\x00a\ \x00t\x00a\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x07Error: \x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00<\x010\x00\xe7\x00i\x00n\ \x00d\x00e\x00 \x00y\x00e\x00t\x00e\x00r\ \x00i\x00n\x00c\x00e\x00 \x00b\x00o\x01_\ \x00 \x00a\x00l\x00a\x00n\x00 \x00y\x00o\ \x00k\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x19No\ t enough free sp\ ace in:\x07\x00\x00\x00\x14main\ window_src_ui_tr\ \x01\x03\x00\x00\x00.\x010\x01_\x00l\x00e\x00m\ \x00 \x00b\x00a\x01_\x00a\x00r\x011\x00l\ \x011\x00 \x00d\x00e\x01\x1f\x00i\x00l\x00d\ \x00i\x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1dOp\ eration was not \ successful.\x07\x00\x00\x00\x14\ mainwindow_src_u\ i_tr\x01\x03\x00\x00\x00P\x00L\x00\xfc\x00t\ \x00f\x00e\x00n\x00 \x00a\x01_\x00a\x01\x1f\ \x011\x00d\x00a\x00k\x00i\x00 \x00k\x00a\ \x00t\x00e\x00g\x00o\x00r\x00i\x00y\x00e\ \x00 \x00d\x00e\x00v\x00a\x00m\x00 \x00e\ \x00d\x00i\x00n\x00:\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00&Please resum\ e the following \ category: \x07\x00\x00\x00\x14m\ ainwindow_src_ui\ _tr\x01\x03\x00\x00\x00\x1a\x00m\x00u\x00x\x00\ i\x00n\x00g\x00 \x00h\x00a\x00t\x00a\x00\ s\x011\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0cmux\ ing error\x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00\x12\x00i\x00n\x00d\x00i\ \x00r\x00i\x00l\x00d\x00i\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0b downloaded\x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x006\x00<\x00b\x00>\ \x00S\x00e\x00s\x00 \x00d\x00o\x00s\x00y\ \x00a\x00s\x011\x00 \x00d\x00u\x00r\x00u\ \x00m\x00u\x00:\x00 \x00<\x00/\x00b\x00>\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aAud\ io file status: \ \x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00,\x00\ <\x00b\x00>\x00M\x00u\x00x\x00i\x00n\x00\ g\x00 \x00d\x00u\x00r\x00u\x00m\x00u\x00\ :\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x16Muxing s\ tatus: \x07\x00\x00\x00\x10\ mainwindow_ui_tr\ \x01\x03\x00\x00\x00\x1c\x00<\x00b\x00>\x00D\x00u\ \x00r\x00u\x00m\x00:\x00 \x00<\x00/\x00b\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fS\ tatus: \x07\x00\x00\x00\x10\ mainwindow_ui_tr\ \x01\x03\x00\x00\x00:\x00<\x00b\x00>\x00V\x00i\ \x00d\x00e\x00o\x00 \x00d\x00o\x00s\x00y\ \x00a\x00s\x011\x00 \x00d\x00u\x00r\x00u\ \x00m\x00u\x00:\x00 \x00<\x00/\x00b\x00>\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aVid\ eo file status: \ \x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x008\x00\ Y\x00e\x00n\x00i\x00 \x010\x00n\x00d\x00\ i\x00r\x00m\x00e\x00 \x00B\x00a\x01\x1f\x00\ l\x00a\x00n\x00t\x011\x00s\x011\x00 \x00\ E\x00k\x00l\x00e\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x15Add New Downloa\ d Link\x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ \x010\x00n\x00d\x00i\x00r\x00m\x00e\x00\ d\x00e\x00n\x00 \x00s\x00o\x00n\x00r\x00\ a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0eAfter\ download\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00\x0c\x00U\x00y\x00g\x00u\x00l\x00a\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Apply\x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00<\x010\x00l\x00k\ \x00 \x00\xf6\x00n\x00c\x00e\x00 \x00l\x00i\ \x00s\x00t\x00e\x00n\x00i\x00n\x00\x0a\x00a\ \x00l\x00t\x011\x00n\x011\x00 \x00i\x00n\ \x00d\x00i\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x22\ Download bottom \ of\x0a the list fir\ st\x07\x00\x00\x00\x10mainwindo\ w_ui_tr\x01\x03\x00\x00\x00\x18\x00B\x00\ i\x00t\x00i\x01_\x00 \x00Z\x00a\x00m\x00\ a\x00n\x011\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08E\ nd Time\x07\x00\x00\x00\x10main\ window_ui_tr\x01\x03\x00\x00\ \x00\x0a\x00\xc7\x011\x00k\x011\x01_\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x04Exit\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x00&\x010\x00n\x00d\x00i\x00r\x00\ m\x00e\x00y\x00i\x00 \x00D\x00D\x00u\x00\ r\x00a\x00k\x00l\x00a\x00t\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0ePause Downl\ oad\x07\x00\x00\x00\x10mainwind\ ow_ui_tr\x01\x03\x00\x00\x00:\x00P\ \x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\ \x00s\x00 \x010\x00n\x00d\x00i\x00r\x00m\ \x00e\x00 \x00Y\x00\xf6\x00n\x00e\x00t\x00i\ \x00c\x00i\x00s\x00i\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x1bPersepolis Dow\ nload Manager\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00\x10\x010\x00l\x00e\x00r\ \x00l\x00e\x00m\x00e\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x08Progress\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x00\x14\x00\xd6\x00z\x00e\x00l\x00l\x00\ i\x00k\x00l\x00e\x00r\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x0aProperties\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00$\x010\x00n\x00d\x00i\ \x00r\x00m\x00e\x00y\x00e\x00 \x00D\x00e\ \x00v\x00a\x00m\x00 \x00e\x00t\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0fResume Dow\ nload\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00J\ \x00S\x00i\x00s\x00t\x00e\x00m\x00 \x00t\ \x00e\x00p\x00s\x00i\x00s\x00i\x00 \x00s\ \x00i\x00m\x00g\x00e\x00s\x00i\x00n\x00i\ \x00 \x00G\x00\xf6\x00s\x00t\x00e\x00r\x00/\ \x00G\x00i\x00z\x00l\x00e\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1aShow/Hide sy\ stem tray icon\x07\x00\ \x00\x00\x10mainwindow_ui\ _tr\x01\x03\x00\x00\x00\x0a\x00K\x00a\x00p\x00\ a\x00t\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09Shu\ t Down\x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ \x1c\x00B\x00a\x01_\x00l\x00a\x00m\x00a\x00\ \x00Z\x00a\x00m\x00a\x00n\x011\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0aStart Tim\ e\x07\x00\x00\x00\x10mainwindow\ _ui_tr\x01\x03\x00\x00\x002\x010\x00n\ \x00d\x00i\x00r\x00m\x00e\x00y\x00i\x00 \ \x00D\x00u\x00r\x00d\x00u\x00r\x00/\x010\ \x00p\x00t\x00a\x00l\x00 \x00e\x00t\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x14Stop/Can\ cel Download\x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00 \x010\x00n\x00d\x00i\x00\ r\x00m\x00e\x00d\x00e\x00n\x00 \x00s\x00\ o\x00n\x00r\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0eAfter download\x07\ \x00\x00\x00\x0eprogress_ui_\ tr\x01\x03\x00\x00\x00\x0c\x00U\x00y\x00g\x00u\ \x00l\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Ap\ ply\x07\x00\x00\x00\x0eprogress\ _ui_tr\x01\x03\x00\x00\x00\x1e\x010\x00n\ \x00d\x00i\x00r\x00m\x00e\x00 \x00B\x00i\ \x00l\x00g\x00i\x00s\x00i\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x14Download Inf\ ormation\x07\x00\x00\x00\x0epro\ gress_ui_tr\x01\x03\x00\x00\x00\ &\x010\x00n\x00d\x00i\x00r\x00m\x00e\x00\ \x00S\x00e\x00\xe7\x00e\x00n\x00e\x00k\x00\ l\x00e\x00r\x00i\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x10Download Option\ s\x07\x00\x00\x00\x0eprogress_u\ i_tr\x01\x03\x00\x00\x00\x14\x010\x00n\x00d\ \x00i\x00r\x00i\x00l\x00d\x00i\x00:\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0bDownload\ ed:\x07\x00\x00\x00\x0eprogress\ _ui_tr\x01\x03\x00\x00\x00&\x00T\x00a\ \x00h\x00m\x00i\x00n\x00i\x00 \x00k\x00a\ \x00l\x00a\x00n\x00 \x00s\x00\xfc\x00r\x00e\ \x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Esti\ mated time left:\ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x00,\x00B\x00a\x01\x1f\x00\ l\x00a\x00n\x00t\x011\x00l\x00a\x00r\x01\ 1\x00n\x00 \x00S\x00a\x00y\x011\x00s\x01\ 1\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x17N\ umber of connect\ ions: \x07\x00\x00\x00\x0eprogr\ ess_ui_tr\x01\x03\x00\x00\x00\x10\x00\ D\x00u\x00r\x00a\x00k\x00l\x00a\x00t\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x05Pause\x07\x00\ \x00\x00\x0eprogress_ui_t\ r\x01\x03\x00\x00\x00:\x00P\x00e\x00r\x00s\x00\ e\x00p\x00o\x00l\x00i\x00s\x00 \x010\x00\ n\x00d\x00i\x00r\x00m\x00e\x00 \x00Y\x00\ \xf6\x00n\x00e\x00t\x00i\x00c\x00i\x00s\x00\ i\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bPerse\ polis Download M\ anager\x07\x00\x00\x00\x0eprogr\ ess_ui_tr\x01\x03\x00\x00\x00\x10\x00\ D\x00e\x00v\x00a\x00m\x00 \x00e\x00t\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x06Resume\x07\ \x00\x00\x00\x0eprogress_ui_\ tr\x01\x03\x00\x00\x00\x0a\x00K\x00a\x00p\x00a\ \x00t\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09Shut\ Down\x07\x00\x00\x00\x0eprogre\ ss_ui_tr\x01\x03\x00\x00\x00\x0e\x00D\ \x00u\x00r\x00u\x00m\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x08Status: \x07\x00\ \x00\x00\x0eprogress_ui_t\ r\x01\x03\x00\x00\x00\x0c\x00D\x00u\x00r\x00d\x00\ u\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04Sto\ p\x07\x00\x00\x00\x0eprogress_u\ i_tr\x01\x03\x00\x00\x00 \x00T\x00r\x00a\ \x00n\x00s\x00f\x00e\x00r\x00 \x00o\x00r\ \x00a\x00n\x011\x00:\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0fTransfer rat\ e: \x07\x00\x00\x00\x0eprogress\ _ui_tr\x01\x03\x00\x00\x00\xca\x00<\x00b\ \x00>\x00<\x00c\x00e\x00n\x00t\x00e\x00r\ \x00>\x00B\x00u\x00 \x00k\x011\x00s\x00a\ \x00y\x00o\x00l\x00 \x00d\x00a\x00h\x00a\ \x00 \x00\xf6\x00n\x00c\x00e\x00 \x00k\x00u\ \x00l\x00l\x00a\x00n\x011\x00l\x00m\x011\ \x01_\x00!\x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \ \x00 \x00 \x00 \x00 \x00 \x00 \x00B\x00a\ \x01_\x00k\x00a\x00 \x00b\x00i\x00r\x00 \ \x00t\x00a\x00n\x00e\x00 \x00k\x00u\x00l\ \x00l\x00a\x00n\x011\x00n\x00!\x00<\x00/\ \x00c\x00e\x00n\x00t\x00e\x00r\x00>\x00<\ \x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00_\
This \ shortcut has bee\ n used before! \ \ Use another on\ e!
\x07\ \x00\x00\x00\x11setting_src_\ ui_tr\x01\x03\x00\x00\x00f\x00<\x00h\x00\ t\x00m\x00l\x00>\x00<\x00h\x00e\x00a\x00\ d\x00/\x00>\x00<\x00b\x00o\x00d\x00y\x00\ >\x00<\x00p\x00>\x00B\x00i\x00\xe7\x00i\x00\ m\x00 \x00S\x00S\x00:\x00D\x00D\x00<\x00\ /\x00p\x00>\x00<\x00/\x00b\x00o\x00d\x00\ y\x00>\x00<\x00/\x00h\x00t\x00m\x00l\x00\ >\x08\x00\x00\x00\x00\x06\x00\x00\x004Format HH:MM\x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00\x9e\x00<\x00h\x00t\x00m\x00\ l\x00>\x00<\x00h\x00e\x00a\x00d\x00/\x00\ >\x00<\x00b\x00o\x00d\x00y\x00>\x00<\x00\ p\x00>\x00Z\x00a\x00m\x00a\x00n\x00 \x00\ a\x01_\x011\x00m\x011\x00n\x011\x00 \x00\ s\x00a\x00n\x00i\x00y\x00e\x00 \x00c\x00\ i\x00n\x00s\x00i\x00n\x00d\x00e\x00n\x00\ \x00a\x00y\x00a\x00r\x00l\x00a\x00.\x00\ \x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00\ o\x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00\ m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00@<\ html>

Set timeout\ in seconds. \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00\xae\x00<\x00h\x00t\x00m\x00\ l\x00>\x00<\x00h\x00e\x00a\x00d\x00/\x00\ >\x00<\x00b\x00o\x00d\x00y\x00>\x00<\x00\ p\x00>\x00B\x00u\x00 \x00\xf6\x00z\x00e\x00\ l\x00l\x00i\x00k\x00 \x00i\x01_\x00l\x00\ e\x00t\x00i\x00m\x00 \x00s\x00i\x00s\x00\ t\x00e\x00m\x00i\x00n\x00i\x00z\x00d\x00\ e\x00 \x00\xe7\x00a\x00l\x011\x01_\x00m\x00\ a\x00y\x00a\x00b\x00i\x00l\x00i\x00r\x00\ .\x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00\ o\x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00\ m\x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00[<\ html>

This featur\ e may not work i\ n your operating\ system.

\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\xe2\x00<\x00h\x00t\x00m\x00l\x00>\x00<\ \x00h\x00e\x00a\x00d\x00/\x00>\x00<\x00b\ \x00o\x00d\x00y\x00>\x00<\x00p\x00>\x00B\ \x00i\x00r\x00d\x00e\x00n\x00 \x00f\x00a\ \x00z\x00l\x00a\x00 \x00b\x00a\x01\x1f\x00l\ \x00a\x00n\x00t\x011\x00 \x00k\x00u\x00l\ \x00l\x00a\x00n\x00a\x00r\x00a\x00k\x00 \ \x00i\x00n\x00d\x00i\x00r\x00m\x00e\x00 \ \x00i\x01_\x00l\x00e\x00m\x00i\x00n\x00i\ \x00z\x00i\x00 \x00h\x011\x00z\x00l\x00a\ \x00n\x00d\x011\x00r\x00a\x00b\x00i\x00l\ \x00i\x00r\x00s\x00i\x00n\x00i\x00z\x00.\ \x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00o\ \x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\ \x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00c

Using multip\ le connections c\ an help speed up\ your download.<\ /p>\x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00\x0c\x00V\x00a\x00z\x00\ g\x00e\x00\xe7\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06C\ ancel\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x10\x00D\x00\ e\x01\x1f\x00i\x01_\x00t\x00i\x00r\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x06Change\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x1a\x00R\x00e\x00n\x00k\x00 \x01\ _\x00e\x00m\x00a\x00s\x011\x00:\x00 \x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x0eColor s\ cheme: \x07\x00\x00\x00\x0dsett\ ing_ui_tr\x01\x03\x00\x00\x00\x1a\x00\ V\x00a\x00r\x00s\x00a\x00y\x011\x00l\x00\ a\x00n\x00l\x00a\x00r\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x08Defaults\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00&\x010\x00n\x00d\x00i\x00r\x00m\x00\ e\x00 \x00S\x00e\x00\xe7\x00e\x00n\x00e\x00\ k\x00l\x00e\x00r\x00i\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x10Download Opti\ ons\x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00\x16\x00Y\x00a\x00\ z\x011\x00 \x00t\x00i\x00p\x00i\x00:\x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Font:\ \x07\x00\x00\x00\x0dsetting_ui\ _tr\x01\x03\x00\x00\x00Z\x00K\x00a\x00p\x00\ a\x00t\x00 \x00d\x00\xfc\x01\x1f\x00m\x00e\x00\ s\x00i\x00 \x00t\x011\x00k\x00l\x00a\x00\ n\x011\x00r\x00s\x00a\x00 \x00a\x00n\x00\ a\x00 \x00p\x00e\x00n\x00c\x00e\x00r\x00\ e\x00y\x00i\x00 \x00g\x00i\x00z\x00l\x00\ e\x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00)Hid\ e main window if\ close button cl\ icked.\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x14\x00S\ \x00i\x00m\x00g\x00e\x00l\x00e\x00r\x00:\ \x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x07Icon\ s: \x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00&\x00S\x00i\x00\ s\x00t\x00e\x00m\x00i\x00 \x00u\x00y\x00\ a\x00n\x011\x00k\x00 \x00t\x00u\x00t\x00\ !\x08\x00\x00\x00\x00\x06\x00\x00\x00\x12Keep \ system awake!\x07\x00\x00\ \x00\x0dsetting_ui_tr\x01\ \x03\x00\x00\x00\x1e\x00B\x00i\x00l\x00d\x00i\x00\ r\x00i\x00m\x00 \x00t\x00\xfc\x00r\x00\xfc\x00\ :\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x13Not\ ification type: \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00\x10\x00B\x00i\x00l\x00d\ \x00i\x00r\x00i\x00m\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0dNotifications\x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00,\x00B\x00a\x01\x1f\x00l\x00\ a\x00n\x00t\x011\x00l\x00a\x00r\x011\x00\ n\x00 \x00S\x00a\x00y\x011\x00s\x011\x00\ :\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x17Num\ ber of connectio\ ns: \x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\x1e\x00D\x00e\ \x00n\x00e\x00m\x00e\x00 \x00s\x00a\x00y\ \x011\x00s\x011\x00:\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x11Number of tr\ ies: \x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x0a\x00T\x00\ a\x00m\x00a\x00m\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x02OK\x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00\x12\x00T\x00e\x00\ r\x00c\x00i\x00h\x00l\x00e\x00r\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0bPreferenc\ es\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00$\x00Y\x00e\x00n\ \x00i\x00 \x00t\x00u\x01_\x00l\x00a\x00r\ \x00a\x00 \x00b\x00a\x00s\x011\x00n\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0ePress ne\ w keys\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00B\x00B\ \x00a\x01_\x00l\x00a\x00n\x00g\x011\x00\xe7\ \x00t\x00a\x00 \x00P\x00e\x00r\x00s\x00e\ \x00p\x00o\x00l\x00i\x00s\x00'\x00i\x00 \ \x00\xe7\x00a\x00l\x011\x01_\x00t\x011\x00r\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x19Run Pe\ rsepolis at star\ tup\x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00\x14\x00K\x011\x00\ s\x00a\x00y\x00o\x00l\x00l\x00a\x00r\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x09Shortcu\ ts\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x0e\x00B\x00o\x00y\ \x00u\x00t\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x06Size: \x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00\x0a\ \x00D\x00u\x00r\x00u\x00m\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x06Status\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x0c\x00T\x00a\x00r\x00z\x00:\x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x07Style: \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00,\x00Z\x00a\x00m\x00a\x00\ n\x00 \x00a\x01_\x011\x00m\x011\x00 \x00\ (\x00s\x00a\x00n\x00i\x00y\x00e\x00)\x00\ :\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x13Tim\ eout (seconds): \ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x000\x00V\x00i\x00d\x00e\ \x00o\x00 \x00B\x00u\x00l\x00u\x00c\x00u\ \x00 \x00S\x00e\x00\xe7\x00e\x00n\x00e\x00k\ \x00l\x00e\x00r\x00i\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x14Video Finder O\ ptions\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x0e\x00H\ \x00a\x00c\x00i\x00m\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x08Volume: \x07\x00\ \x00\x00\x0dsetting_ui_tr\ \x01\x03\x00\x00\x002\x010\x00n\x00d\x00i\x00r\ \x00m\x00e\x00 \x00D\x00i\x00z\x00i\x00n\ \x00i\x00n\x00i\x00 \x00D\x00e\x01\x1f\x00i\ \x01_\x00t\x00i\x00r\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x16Change Downloa\ d Folder\x07\x00\x00\x00\x0atex\ t_ui_tr\x01\x03\x00\x00\x00\x06\x00I\x00\ P\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x03IP:\ \x07\x00\x00\x00\x0atext_ui_tr\x01\ \x03\x00\x00\x00:\x00P\x00e\x00r\x00s\x00e\x00\ p\x00o\x00l\x00i\x00s\x00 \x010\x00n\x00\ d\x00i\x00r\x00m\x00e\x00 \x00Y\x00\xf6\x00\ n\x00e\x00t\x00i\x00c\x00i\x00s\x00i\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x1bPersepo\ lis Download Man\ ager\x07\x00\x00\x00\x0atext_ui\ _tr\x01\x03\x00\x00\x00\x0a\x00P\x00o\x00r\x00\ t\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Por\ t:\x07\x00\x00\x00\x0atext_ui_t\ r\x01\x03\x00\x00\x006\x00<\x00b\x00>\x00S\x00\ e\x00s\x00 \x00d\x00o\x00s\x00y\x00a\x00\ s\x011\x00 \x00d\x00u\x00r\x00u\x00m\x00\ u\x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x1aAudio \ file status: \x07\x00\x00\x00\x1bvideo_find\ er_progress_ui_t\ r\x01\x03\x00\x00\x00,\x00<\x00b\x00>\x00M\x00\ u\x00x\x00i\x00n\x00g\x00 \x00d\x00u\x00\ r\x00u\x00m\x00u\x00:\x00 \x00<\x00/\x00\ b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16\ Muxing status: <\ /b>\x07\x00\x00\x00\x1bvideo_fi\ nder_progress_ui\ _tr\x01\x03\x00\x00\x00:\x00<\x00b\x00>\x00\ V\x00i\x00d\x00e\x00o\x00 \x00d\x00o\x00\ s\x00y\x00a\x00s\x011\x00 \x00d\x00u\x00\ r\x00u\x00m\x00u\x00:\x00 \x00<\x00/\x00\ b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1a\ Video file statu\ s: \x07\x00\x00\x00\x1bvide\ o_finder_progres\ s_ui_tr\x01\ \x00\x002U\ <\ \xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\xa7\ \x00\x00\x00\x05pt_BRB\x00\x00\x03\xa8\x00\x00\ \x05;\x00\x00\x03\xd6\x00\x00\x05;\x00\x00\x06\xf2\x00\x00\ \x05;\x00\x00(`\x00\x00N:\x00\x00,\x04\x00\x04\ \xcf\x04\x00\x00\x173\x00\x04\xe3\xc0\x00\x00\x06R\x00\x05\ 0K\x00\x00\x06\x80\x00\x05\xab`\x00\x00\x1e$\x00H\ w9\x00\x00\x16/\x00Hw9\x00\x00\x1a\xc3\x00V\ \x8c\x95\x00\x00\x1c\xbc\x00Wiz\x00\x00\x07$\x00W\ iz\x00\x00,\xac\x00W\x96\xf9\x00\x00\x07W\x00\x97\ \xa2\x10\x00\x00\x04\xc6\x00\xc2\xad\xd0\x00\x00\x0d\xe7\x01\x18\ \xab\xd4\x00\x00\x16g\x01\x8bp\x0e\x00\x00!\xac\x02S\ \xd0\x00\x00\x00\x08Q\x02\x9a\xf5p\x00\x00\x0eC\x02\xf9\ \xc5\xc5\x00\x00\x03\xa1\x03\x0d1^\x00\x00\x0a\x1c\x03\x1c\ \xc5*\x00\x00\x1b\xb5\x03<\x83\x03\x00\x00\x06\xae\x03K\ F\xe3\x00\x00\x1bb\x03KF\xe3\x00\x00%8\x03\x92\ \xd2\xce\x00\x00%\xc4\x03\xdc\xdc%\x00\x00\x0b\x9e\x04]\ I3\x00\x00(\xd7\x04e\xac\xf5\x00\x00\x16\xf0\x04\x98\ I\xbc\x00\x00\x05y\x04\x98I\xbc\x00\x00$B\x04\x9e\ \x84\xd5\x00\x00$z\x04\xd6W\xc0\x00\x00%\x8e\x05\x13\ \xccT\x00\x00\x13M\x05_. \x00\x00\x12O\x05_\ \xa8`\x00\x00\x0e\xfe\x05i<\xfe\x00\x00\x14\x8f\x05v\ \x1b\x9e\x00\x00\x0b\xf7\x05\x8c\xac5\x00\x00\x1dt\x05\xa1\ \x08\xc0\x00\x00)\xf3\x05\xa3\x9c>\x00\x00\x14\x14\x05\xa3\ \x9c>\x00\x00-l\x05\xa8X\xf3\x00\x00\x03\x09\x05\xaa\ \x8b\xc3\x00\x00*-\x06-B\x0e\x00\x00\x13\x8b\x06-\ B\x0e\x00\x00,\xdc\x069\x82N\x00\x00\x14\xe1\x069\ \x82N\x00\x00-\xf2\x06<=\x10\x00\x00+m\x06]\ 1\xde\x00\x00\x02\x02\x06\x9aK\x00\x00\x00\x08\x9c\x06\x9a\ \xf5C\x00\x00)\xba\x06\x9c(\x01\x00\x00&\x9a\x06\xc5\ )*\x00\x00\x1b\xf3\x06\xcc\xd6\xa3\x00\x00\x18j\x07\x14\ *\x1e\x00\x00\x18\xf7\x076\xcf`\x00\x00\x06\x03\x07[\ &u\x00\x00\x0f\xb9\x07\x9b]0\x00\x00(\x01\x07\x9c\ 1\x03\x00\x00+\x01\x08g-\xa2\x00\x00\x0a\xa9\x09>\ \x0d$\x00\x00\x1a\x0b\x09^\x89\xd3\x00\x00\x18+\x09`\ \x06\xb5\x00\x00\x19\xc2\x09g\x01\xd0\x00\x00*\x9a\x09\x93\ \xd2\xfe\x00\x00\x1a\xf9\x09\x96F0\x00\x00\x10\xcc\x0a\x0c\ \x87\x0e\x00\x00\x1f\xf4\x0a_\xd7\x0e\x00\x00\x08\xf4\x0a_\ \xf3\xfb\x00\x00\x15j\x0as>\xc3\x00\x00\x04\x87\x0a\x8b\ \xc3`\x00\x00\x1d\xeb\x0a\x97\x00\x80\x00\x00\x07\xf7\x0a\xa2\ Yp\x00\x00)3\x0a\xc0(\x90\x00\x00*a\x0b`\ r`\x00\x00&\xfc\x0bn\xb1\xee\x00\x00\x22\xf1\x0bv\ \x04\xf0\x00\x00\x0d\x88\x0b\x89w\x94\x00\x00\x15\xe2\x0b\x89\ w\x94\x00\x00\x1ax\x0b\xc8\xc7\x13\x00\x00%\x00\x0b\xf9\ \x95\xb3\x00\x00\x10\x17\x0c(\x19\x04\x00\x00\x18\xb1\x0c2\ \xc0S\x00\x00\x03Y\x0ce\x0f.\x00\x00\x19\x84\x0ce\ \x0f.\x00\x00\x1d\xaf\x0c\x96q\xc0\x00\x00\x09k\x0c\x96\ q\xc0\x00\x00\x0e\xae\x0c\x99e\x80\x00\x00\x11\x0b\x0c\xb5\ \x86\x80\x00\x00\x1cZ\x0c\xb5\x86\x80\x00\x00'\xa0\x0c\xdd\ \xc2\x03\x00\x00(\x92\x0c\xe0\x1a\xf3\x00\x00'[\x0c\xfb\ \xe0\x8a\x00\x00\x11G\x0dq\x98\xde\x00\x00\x00\x00\x0d\x99\ \xf9B\x00\x00\x04\x06\x0d\x99\xf9B\x00\x00\x0b\x14\x0d\x99\ \xf9B\x00\x00\x17\xa5\x0d\x99\xf9B\x00\x00\x1c\xf0\x0d\x99\ \xf9B\x00\x00,,\x0e i\x22\x00\x00\x12\xf2\x0e.\ d\xa4\x00\x00\x17d\x0e7I\xc3\x00\x00\x05'\x0ex\ \xa8B\x00\x00\x05\xb1\x0ex\xa8B\x00\x00+\xa7\x0e\xc4\ J\xf0\x00\x00\x07\x88\x0e\xda\xd4\xfe\x00\x00\x1e\xb5\x0f6\ \xb6\x90\x00\x00\x0fT\x0f}\x11p\x00\x00\x09\xbb\x0f\xa6\ V\x80\x00\x00&a\x0f\xa7\xb6\x04\x00\x00\x10o\x0f\xac\ [\xee\x00\x00\x11\xcd\x0f\xd1?\x00\x00\x00\x1eU\x0f\xd6\ \xe5\xde\x00\x00 \xb4\x0f\xde{\xf0\x00\x00$\xb0\x0f\xf3\ \x03\x0e\x00\x00\x00\xfbi\x00\x00.\x82\x03\x00\x00\x00\x92\ \x00<\x00a\x00 \x00h\x00r\x00e\x00f\x00=\ \x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\ \x00p\x00e\x00r\x00s\x00e\x00p\x00o\x00l\ \x00i\x00s\x00d\x00m\x00.\x00g\x00i\x00t\ \x00h\x00u\x00b\x00.\x00i\x00o\x00>\x00h\ \x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00p\ \x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\ \x00s\x00d\x00m\x00.\x00g\x00i\x00t\x00h\ \x00u\x00b\x00.\x00i\x00o\x00<\x00/\x00a\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00Ihttps://perse\ polisdm.github.i\ o\x07\x00\x00\x00\x0babout_\ ui_tr\x01\x03\x00\x00\x00\x9a\x00<\x00a\x00\ \x00h\x00r\x00e\x00f\x00=\x00h\x00t\x00\ t\x00p\x00s\x00:\x00/\x00/\x00t\x00e\x00\ l\x00e\x00g\x00r\x00a\x00m\x00.\x00m\x00\ e\x00/\x00p\x00e\x00r\x00s\x00e\x00p\x00\ o\x00l\x00i\x00s\x00d\x00m\x00>\x00h\x00\ t\x00t\x00p\x00s\x00:\x00/\x00/\x00t\x00\ e\x00l\x00e\x00g\x00r\x00a\x00m\x00.\x00\ m\x00e\x00/\x00p\x00e\x00r\x00s\x00e\x00\ p\x00o\x00l\x00i\x00s\x00d\x00m\x00<\x00\ /\x00a\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00M<\ a href=https://t\ elegram.me/perse\ polisdm>https://\ telegram.me/pers\ epolisdm\x07\x00\x00\x00\ \x0babout_ui_tr\x01\x03\x00\x00\ \x00\x9a\x00<\x00a\x00 \x00h\x00r\x00e\x00f\ \x00=\x00h\x00t\x00t\x00p\x00s\x00:\x00/\ \x00/\x00t\x00w\x00i\x00t\x00t\x00e\x00r\ \x00.\x00c\x00o\x00m\x00/\x00p\x00e\x00r\ \x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00d\ \x00m\x00>\x00h\x00t\x00t\x00p\x00s\x00:\ \x00/\x00/\x00t\x00w\x00i\x00t\x00t\x00e\ \x00r\x00.\x00c\x00o\x00m\x00/\x00p\x00e\ \x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\ \x00d\x00m\x00<\x00/\x00a\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00Mh\ ttps://twitter.c\ om/persepolisdm<\ /a>\x07\x00\x00\x00\x0babout_ui\ _tr\x01\x03\x00\x00\x00 \x00S\x00o\x00b\x00\ r\x00e\x00 \x00P\x00e\x00r\x00s\x00\xe9\x00\ p\x00o\x00l\x00i\x00s\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x10About Persepo\ lis\x07\x00\x00\x00\x0babout_ui\ _tr\x01\x03\x00\x00\x00\x1e\x00D\x00e\x00s\x00\ e\x00n\x00v\x00o\x00l\x00v\x00e\x00d\x00\ o\x00r\x00e\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0aDevelopers\x07\x00\x00\x00\x0b\ about_ui_tr\x01\x03\x00\x00\x00\ \x0e\x00L\x00i\x00c\x00e\x00n\x00\xe7\x00a\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x07License\ \x07\x00\x00\x00\x0babout_ui_tr\ \x01\x03\x00\x00\x00\x0e\x00A\x00c\x00e\x00i\x00t\ \x00a\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\ \x07\x00\x00\x00\x0babout_ui_tr\ \x01\x03\x00\x00\x00F\x00G\x00e\x00r\x00e\x00n\ \x00c\x00i\x00a\x00d\x00o\x00r\x00 \x00d\ \x00e\x00 \x00D\x00o\x00w\x00n\x00l\x00o\ \x00a\x00d\x00s\x00 \x00P\x00e\x00r\x00s\ \x00\xe9\x00p\x00o\x00l\x00i\x00s\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x1bPersepolis\ Download Manage\ r\x07\x00\x00\x00\x0babout_ui_t\ r\x01\x03\x00\x00\x00\x14\x00T\x00r\x00a\x00d\x00\ u\x00t\x00o\x00r\x00e\x00s\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0bTranslators\ \x07\x00\x00\x00\x0babout_ui_tr\ \x01\x03\x00\x00\x00.\x00A\x00d\x00i\x00c\x00i\ \x00o\x00n\x00a\x00r\x00 \x00\xe0\x00 \x00c\ \x00a\x00t\x00e\x00g\x00o\x00r\x00i\x00a\ \x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x11Ad\ d to category: \x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x00 \x00O\x00p\x00\xe7\x00\xf5\x00\ e\x00s\x00 \x00A\x00v\x00a\x00n\x00\xe7\x00\ a\x00d\x00a\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x10Advanced Option\ s\x07\x00\x00\x00\x0daddlink_ui\ _tr\x01\x03\x00\x00\x00\x10\x00C\x00a\x00n\x00\ c\x00e\x00l\x00a\x00r\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x06Cancel\x07\x00\x00\x00\x0dad\ dlink_ui_tr\x01\x03\x00\x00\x00\ \x1a\x00A\x00l\x00t\x00e\x00r\x00a\x00r\x00\ \x00L\x00o\x00c\x00a\x00l\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x16Change Down\ load Folder\x07\x00\x00\x00\x0d\ addlink_ui_tr\x01\x03\x00\ \x00\x00\x1c\x00 \x00B\x00a\x00i\x00x\x00a\x00\ r\x00 \x00p\x00a\x00r\x00a\x00:\x00 \x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x11Downloa\ d Folder: \x07\x00\x00\x00\x0da\ ddlink_ui_tr\x01\x03\x00\x00\ \x00\x08\x00I\x00P\x00:\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x04IP: \x07\x00\x00\x00\x0dadd\ link_ui_tr\x01\x03\x00\x00\x00\x08\ \x00L\x00i\x00n\x00k\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x04Link\x07\x00\x00\x00\x0daddli\ nk_ui_tr\x01\x03\x00\x00\x00\x16\x00M\ \x00a\x00i\x00s\x00 \x00O\x00p\x00\xe7\x00\xf5\ \x00e\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0cMo\ re Options\x07\x00\x00\x00\x0da\ ddlink_ui_tr\x01\x03\x00\x00\ \x00\x0e\x00A\x00c\x00e\x00i\x00t\x00a\x00r\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x02OK\x07\x00\x00\x00\ \x0daddlink_ui_tr\x01\x03\ \x00\x00\x00\x0c\x00P\x00o\x00r\x00t\x00a\x00:\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Port:\x07\ \x00\x00\x00\x0daddlink_ui_t\ r\x01\x03\x00\x00\x00\x0a\x00P\x00r\x00o\x00x\x00\ y\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Proxy\ \x07\x00\x00\x00\x0daddlink_ui_\ tr\x01\x03\x00\x00\x000\x00<\x00b\x00>\x00N\ \x00o\x00m\x00e\x00 \x00d\x00o\x00 \x00A\ \x00r\x00q\x00u\x00i\x00v\x00o\x00<\x00/\ \x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x12File name: \x07\x00\x00\x00\x18after_d\ ownload_src_ui_t\ r\x01\x03\x00\x00\x00 \x00<\x00b\x00>\x00T\x00\ a\x00m\x00a\x00n\x00h\x00o\x00<\x00/\x00\ b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0dSize: \x07\x00\ \x00\x00\x18after_downloa\ d_src_ui_tr\x01\x03\x00\x00\x00\ \x1a\x00 \x00 \x00 \x00A\x00c\x00e\x00i\x00\ t\x00a\x00r\x00 \x00 \x00 \x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x08 OK \x07\x00\x00\ \x00\x14after_download\ _ui_tr\x01\x03\x00\x00\x00\x22\x00 \x00 \ \x00A\x00b\x00r\x00i\x00r\x00 \x00A\x00r\ \x00q\x00u\x00i\x00v\x00o\x00 \x00 \x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x0d Open F\ ile \x07\x00\x00\x00\x14after_\ download_ui_tr\x01\x03\ \x00\x00\x004\x00<\x00b\x00>\x00T\x00e\x00r\ \x00m\x00i\x00n\x00o\x00u\x00 \x00d\x00e\ \x00 \x00B\x00a\x00i\x00x\x00a\x00r\x00!\ \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x1aDownload Co\ mpleted!\x07\x00\x00\x00\ \x14after_download_\ ui_tr\x01\x03\x00\x00\x00\x1a\x00<\x00b\x00\ >\x00L\x00i\x00n\x00k\x00<\x00/\x00b\x00\ >\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0d<\ b>Link: \x07\x00\x00\x00\ \x14after_download_\ ui_tr\x01\x03\x00\x00\x00(\x00<\x00b\x00\ >\x00S\x00a\x00l\x00v\x00a\x00r\x00 \x00\ c\x00o\x00m\x00o\x00<\x00/\x00b\x00>\x00\ :\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x10\ Save as: \x07\x00\x00\ \x00\x14after_download\ _ui_tr\x01\x03\x00\x00\x00F\x00N\x00\xe3\ \x00o\x00 \x00e\x00x\x00i\x00b\x00i\x00r\ \x00 \x00e\x00s\x00s\x00a\x00 \x00m\x00e\ \x00n\x00s\x00a\x00g\x00e\x00m\x00 \x00n\ \x00o\x00v\x00a\x00m\x00e\x00n\x00t\x00e\ \x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1eDon'\ t show this mess\ age again.\x07\x00\x00\x00\x14a\ fter_download_ui\ _tr\x01\x03\x00\x00\x00.\x00A\x00b\x00r\x00\ i\x00r\x00 \x00P\x00a\x00s\x00t\x00a\x00\ \x00d\x00e\x00 \x00B\x00a\x00i\x00x\x00\ a\x00d\x00o\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x14Open Download F\ older\x07\x00\x00\x00\x14after_\ download_ui_tr\x01\x03\ \x00\x00\x00F\x00G\x00e\x00r\x00e\x00n\x00c\ \x00i\x00a\x00d\x00o\x00r\x00 \x00d\x00e\ \x00 \x00D\x00o\x00w\x00n\x00l\x00o\x00a\ \x00d\x00s\x00 \x00P\x00e\x00r\x00s\x00\xe9\ \x00p\x00o\x00l\x00i\x00s\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x1bPersepolis D\ ownload Manager\x07\ \x00\x00\x00\x14after_downlo\ ad_ui_tr\x01\x03\x00\x00\x00(\x00I\ \x00n\x00f\x00o\x00r\x00m\x00a\x00r\x00 \ \x00u\x00m\x00 \x00P\x00r\x00o\x00b\x00l\ \x00e\x00m\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0c\ Report Issue\x07\x00\x00\x00\ \x10log_window_ui_t\ r\x01\x03\x00\x00\x00\xf6\x00<\x00b\x00>\x00<\x00\ c\x00e\x00n\x00t\x00e\x00r\x00>\x00E\x00\ s\x00s\x00e\x00 \x00l\x00i\x00n\x00k\x00\ \x00j\x00\xe1\x00 \x00f\x00o\x00i\x00 \x00\ a\x00d\x00i\x00c\x00i\x00o\x00n\x00a\x00\ d\x00o\x00 \x00a\x00n\x00t\x00e\x00s\x00\ !\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\ \x00 \x00 \x00 \x00 \x00T\x00e\x00m\x00\ \x00c\x00e\x00r\x00t\x00e\x00z\x00a\x00\ \x00q\x00u\x00e\x00 \x00d\x00e\x00s\x00\ e\x00j\x00a\x00 \x00a\x00d\x00i\x00c\x00\ i\x00o\x00n\x00\xe1\x00-\x00l\x00o\x00 \x00\ n\x00o\x00v\x00a\x00m\x00e\x00n\x00t\x00\ e\x00?\x00<\x00/\x00c\x00e\x00n\x00t\x00\ e\x00r\x00>\x00<\x00/\x00b\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00rThis link has \ been added befor\ e! \ Are you su\ re you want to a\ dd it again?\x07\x00\x00\x00\x14ma\ inwindow_src_ui_\ tr\x01\x03\x00\x00\x00\x22\x00<\x00b\x00>\x00C\ \x00o\x00n\x00e\x00x\x00\xf5\x00e\x00s\x00<\ \x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x14Connectio\ ns: \x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x00 \x00<\x00b\x00>\x00B\x00\ a\x00i\x00x\x00a\x00d\x00o\x00<\x00/\x00\ b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x13Downloaded: \x07\x00\x00\x00\x14mainwin\ dow_src_ui_tr\x01\x03\x00\ \x00\x00&\x00<\x00b\x00>\x00T\x00e\x00r\x00\ m\x00i\x00n\x00a\x00 \x00e\x00m\x00<\x00\ /\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x1cEstimated \ time left: \x07\ \x00\x00\x00\x14mainwindow_s\ rc_ui_tr\x01\x03\x00\x00\x00\x1a\x00<\ \x00b\x00>\x00L\x00i\x00n\x00k\x00<\x00/\ \x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0dLink: \x07\ \x00\x00\x00\x14mainwindow_s\ rc_ui_tr\x01\x03\x00\x00\x00\x1e\x00<\ \x00b\x00>\x00E\x00s\x00t\x00a\x00d\x00o\ \x00<\x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0fStatus<\ /b>: \x07\x00\x00\x00\x14mainwi\ ndow_src_ui_tr\x01\x03\ \x00\x00\x00&\x00<\x00b\x00>\x00B\x00a\x00i\ \x00x\x00a\x00n\x00d\x00o\x00 \x00a\x00<\ \x00/\x00b\x00>\x00:\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x16Transfer \ rate: \x07\x00\x00\x00\x14m\ ainwindow_src_ui\ _tr\x01\x03\x00\x00\x00$\x00T\x00e\x00r\x00\ m\x00i\x00n\x00o\x00u\x00 \x00d\x00e\x00\ \x00B\x00a\x00i\x00x\x00a\x00r\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x11Download \ Complete\x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x00 \x00C\x00o\x00m\x00e\x00\ \xe7\x00o\x00u\x00 \x00a\x00 \x00B\x00a\x00\ i\x00x\x00a\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x0fDownload Starts\ \x07\x00\x00\x00\x14mainwindow_\ src_ui_tr\x01\x03\x00\x00\x00$\x00\ R\x00e\x00c\x00e\x00b\x00i\x00m\x00e\x00\ n\x00t\x00o\x00 \x00P\x00a\x00r\x00a\x00\ d\x00o\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Dow\ nload Stopped\x07\x00\x00\ \x00\x14mainwindow_src\ _ui_tr\x01\x03\x00\x00\x00\x0e\x00E\x00r\ \x00r\x00o\x00 \x00-\x00 \x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x08Error - \x07\x00\x00\x00\ \x14mainwindow_src_\ ui_tr\x01\x03\x00\x00\x00\x0c\x00E\x00r\x00\ r\x00o\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x07Error: \x07\x00\x00\x00\x14mai\ nwindow_src_ui_t\ r\x01\x03\x00\x00\x00D\x00N\x00\xe3\x00o\x00 \x00\ h\x00\xe1\x00 \x00e\x00s\x00p\x00a\x00\xe7\x00\ o\x00 \x00l\x00i\x00v\x00r\x00e\x00 \x00\ s\x00u\x00f\x00i\x00c\x00i\x00e\x00n\x00\ t\x00e\x00 \x00e\x00m\x00:\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x19Not enough \ free space in:\x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x00<\x00A\x00\ \x00o\x00p\x00e\x00r\x00a\x00\xe7\x00\xe3\x00\ o\x00 \x00n\x00\xe3\x00o\x00 \x00o\x00b\x00\ t\x00e\x00v\x00e\x00 \x00s\x00u\x00c\x00\ e\x00s\x00s\x00o\x00.\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x1dOperation was\ not successful.\ \x07\x00\x00\x00\x14mainwindow_\ src_ui_tr\x01\x03\x00\x00\x00T\x00\ P\x00o\x00r\x00 \x00f\x00a\x00v\x00o\x00\ r\x00,\x00 \x00c\x00o\x00n\x00t\x00i\x00\ n\x00u\x00e\x00 \x00a\x00 \x00s\x00e\x00\ g\x00u\x00i\x00n\x00t\x00e\x00 \x00c\x00\ a\x00t\x00e\x00g\x00o\x00r\x00i\x00a\x00\ :\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00&Ple\ ase resume the f\ ollowing categor\ y: \x07\x00\x00\x00\x14mainwind\ ow_src_ui_tr\x01\x03\x00\x00\ \x00&\x00E\x00r\x00r\x00o\x00 \x00a\x00o\ \x00 \x00m\x00u\x00l\x00t\x00i\x00p\x00l\ \x00e\x00x\x00a\x00r\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x0cmuxing error\x07\x00\ \x00\x00\x14mainwindow_sr\ c_ui_tr\x01\x03\x00\x00\x00\x0e\x00b\x00\ a\x00i\x00x\x00a\x00d\x00o\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x0b downloaded\ \x07\x00\x00\x00\x10mainwindow_\ ui_tr\x01\x03\x00\x00\x00J\x00<\x00b\x00\ >\x00E\x00s\x00t\x00a\x00d\x00o\x00 \x00\ d\x00o\x00s\x00 \x00a\x00r\x00q\x00u\x00\ i\x00v\x00o\x00s\x00 \x00d\x00e\x00 \x00\ \xe1\x00u\x00d\x00i\x00o\x00:\x00 \x00<\x00\ /\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1a<\ b>Audio file sta\ tus: \x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00@\x00<\x00b\x00>\x00E\x00s\x00t\ \x00a\x00d\x00o\x00 \x00d\x00a\x00 \x00m\ \x00u\x00l\x00t\x00i\x00p\x00l\x00e\x00x\ \x00a\x00\xe7\x00\xe3\x00o\x00:\x00 \x00<\x00/\ \x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x16Muxing status: \ \x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00\x1e\x00\ <\x00b\x00>\x00E\x00s\x00t\x00a\x00d\x00\ o\x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x0fStatus\ : \x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ J\x00<\x00b\x00>\x00E\x00s\x00t\x00a\x00\ d\x00o\x00 \x00d\x00o\x00s\x00 \x00a\x00\ r\x00q\x00u\x00i\x00v\x00o\x00s\x00 \x00\ d\x00e\x00 \x00v\x00\xed\x00d\x00e\x00o\x00\ :\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x1aVideo fi\ le status: \x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00>\x00A\x00d\x00i\ \x00c\x00i\x00o\x00n\x00a\x00r\x00 \x00N\ \x00o\x00v\x00o\x00 \x00L\x00i\x00n\x00k\ \x00 \x00p\x00a\x00r\x00a\x00 \x00B\x00a\ \x00i\x00x\x00a\x00r\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x15Add New Downlo\ ad Link\x07\x00\x00\x00\x10main\ window_ui_tr\x01\x03\x00\x00\ \x00\x1a\x00B\x00a\x00i\x00x\x00a\x00r\x00 \ \x00d\x00e\x00p\x00o\x00i\x00s\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0eAfter down\ load\x07\x00\x00\x00\x10mainwin\ dow_ui_tr\x01\x03\x00\x00\x00\x0e\x00\ A\x00p\x00l\x00i\x00c\x00a\x00r\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x05Apply\x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00B\x00B\x00a\x00i\x00x\x00\ a\x00r\x00 \x00o\x00 \x00f\x00i\x00n\x00\ a\x00l\x00 \x00d\x00a\x00\x0a\x00 \x00l\x00\ i\x00s\x00t\x00a\x00 \x00p\x00r\x00i\x00\ m\x00e\x00i\x00r\x00o\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x22Download bott\ om of\x0a the list \ first\x07\x00\x00\x00\x10mainwi\ ndow_ui_tr\x01\x03\x00\x00\x00\x16\ \x00T\x00e\x00m\x00p\x00o\x00 \x00F\x00i\ \x00n\x00a\x00l\x08\x00\x00\x00\x00\x06\x00\x00\x00\x08\ End Time\x07\x00\x00\x00\x10mai\ nwindow_ui_tr\x01\x03\x00\ \x00\x00\x08\x00S\x00a\x00i\x00r\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x04Exit\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00\x0e\x00P\x00a\x00u\x00s\x00a\x00r\ \x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0ePaus\ e Download\x07\x00\x00\x00\x10m\ ainwindow_ui_tr\x01\ \x03\x00\x00\x00F\x00G\x00e\x00r\x00e\x00n\x00\ c\x00i\x00a\x00d\x00o\x00r\x00 \x00d\x00\ e\x00 \x00D\x00o\x00w\x00n\x00l\x00o\x00\ a\x00d\x00s\x00 \x00P\x00e\x00r\x00s\x00\ \xe9\x00p\x00o\x00l\x00i\x00s\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x1bPersepolis \ Download Manager\ \x07\x00\x00\x00\x10mainwindow_\ ui_tr\x01\x03\x00\x00\x00\x12\x00P\x00r\x00\ o\x00g\x00r\x00e\x00s\x00s\x00o\x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x08Progress\x07\ \x00\x00\x00\x10mainwindow_u\ i_tr\x01\x03\x00\x00\x00\x18\x00P\x00r\x00o\ \x00p\x00r\x00i\x00e\x00d\x00a\x00d\x00e\ \x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0aProp\ erties\x07\x00\x00\x00\x10mainw\ indow_ui_tr\x01\x03\x00\x00\x00\ \x12\x00C\x00o\x00n\x00t\x00i\x00n\x00u\x00\ a\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fRes\ ume Download\x07\x00\x00\x00\ \x10mainwindow_ui_t\ r\x01\x03\x00\x00\x00N\x00E\x00x\x00i\x00b\x00\ i\x00r\x00/\x00O\x00c\x00u\x00l\x00t\x00\ a\x00r\x00 \x00p\x00a\x00r\x00a\x00 \x00\ \xe1\x00r\x00e\x00a\x00 \x00d\x00e\x00 \x00\ n\x00o\x00t\x00i\x00f\x00i\x00c\x00a\x00\ \xe7\x00\xe3\x00o\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aS\ how/Hide system \ tray icon\x07\x00\x00\x00\x10ma\ inwindow_ui_tr\x01\x03\ \x00\x00\x00\x10\x00D\x00e\x00s\x00l\x00i\x00g\ \x00a\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x09Sh\ ut Down\x07\x00\x00\x00\x10main\ window_ui_tr\x01\x03\x00\x00\ \x00\x1a\x00T\x00e\x00m\x00p\x00o\x00 \x00I\ \x00n\x00i\x00c\x00i\x00a\x00l\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x0aStart Time\ \x07\x00\x00\x00\x10mainwindow_\ ui_tr\x01\x03\x00\x00\x004\x00P\x00a\x00\ r\x00a\x00r\x00/\x00C\x00a\x00n\x00c\x00\ e\x00l\x00a\x00r\x00 \x00R\x00e\x00c\x00\ e\x00b\x00i\x00m\x00e\x00n\x00t\x00o\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x14Stop/Ca\ ncel Download\x07\x00\x00\ \x00\x10mainwindow_ui_\ tr\x01\x03\x00\x00\x00\x1a\x00B\x00a\x00i\x00x\ \x00a\x00r\x00 \x00d\x00e\x00p\x00o\x00i\ \x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0eAfte\ r download\x07\x00\x00\x00\x0ep\ rogress_ui_tr\x01\x03\x00\ \x00\x00\x0e\x00A\x00p\x00l\x00i\x00c\x00a\x00\ r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05Apply\ \x07\x00\x00\x00\x0eprogress_ui\ _tr\x01\x03\x00\x00\x002\x00I\x00n\x00f\x00\ o\x00r\x00m\x00a\x00\xe7\x00\xe3\x00o\x00 \x00\ d\x00e\x00 \x00R\x00e\x00c\x00e\x00b\x00\ i\x00m\x00e\x00n\x00t\x00o\x08\x00\x00\x00\x00\ \x06\x00\x00\x00\x14Download In\ formation\x07\x00\x00\x00\x0epr\ ogress_ui_tr\x01\x03\x00\x00\ \x00 \x00O\x00p\x00\xe7\x00\xf5\x00e\x00s\x00 \ \x00a\x00o\x00 \x00B\x00a\x00i\x00x\x00a\ \x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x10Down\ load Options\x07\x00\x00\x00\ \x0eprogress_ui_tr\x01\ \x03\x00\x00\x00\x10\x00B\x00a\x00i\x00x\x00a\x00\ d\x00o\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0bD\ ownloaded:\x07\x00\x00\x00\x0ep\ rogress_ui_tr\x01\x03\x00\ \x00\x000\x00T\x00e\x00m\x00p\x00o\x00 \x00\ r\x00e\x00s\x00t\x00a\x00n\x00t\x00e\x00\ \x00e\x00s\x00t\x00i\x00m\x00a\x00d\x00\ o\x00:\x08\x00\x00\x00\x00\x06\x00\x00\x00\x14Est\ imated time left\ :\x07\x00\x00\x00\x0eprogress_u\ i_tr\x01\x03\x00\x00\x00(\x00N\x00\xfa\x00m\ \x00e\x00r\x00o\x00 \x00d\x00e\x00 \x00C\ \x00o\x00n\x00e\x00x\x00\xf5\x00e\x00s\x00:\ \x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x17Numb\ er of connection\ s: \x07\x00\x00\x00\x0eprogress\ _ui_tr\x01\x03\x00\x00\x00\x0c\x00P\x00a\ \x00u\x00s\x00a\x00r\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x05Pause\x07\x00\x00\x00\x0eprog\ ress_ui_tr\x01\x03\x00\x00\x00F\ \x00G\x00e\x00r\x00e\x00n\x00c\x00i\x00a\ \x00d\x00o\x00r\x00 \x00d\x00e\x00 \x00D\ \x00o\x00w\x00n\x00l\x00o\x00a\x00d\x00s\ \x00 \x00P\x00e\x00r\x00s\x00\xe9\x00p\x00o\ \x00l\x00i\x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1b\ Persepolis Downl\ oad Manager\x07\x00\x00\x00\x0e\ progress_ui_tr\x01\x03\ \x00\x00\x00\x12\x00C\x00o\x00n\x00t\x00i\x00n\ \x00u\x00a\x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06\ Resume\x07\x00\x00\x00\x0eprogr\ ess_ui_tr\x01\x03\x00\x00\x00\x10\x00\ D\x00e\x00s\x00l\x00i\x00g\x00a\x00r\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x09Shut Do\ wn\x07\x00\x00\x00\x0eprogress_\ ui_tr\x01\x03\x00\x00\x00\x0e\x00E\x00s\x00\ t\x00a\x00d\x00o\x00:\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x08Status: \x07\x00\x00\x00\x0e\ progress_ui_tr\x01\x03\ \x00\x00\x00\x0a\x00P\x00a\x00r\x00a\x00r\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x04Stop\x07\x00\x00\x00\ \x0eprogress_ui_tr\x01\ \x03\x00\x00\x00.\x00T\x00a\x00x\x00a\x00 \x00\ d\x00e\x00 \x00t\x00r\x00a\x00n\x00s\x00\ f\x00e\x00r\x00\xea\x00n\x00c\x00i\x00a\x00\ :\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0fTra\ nsfer rate: \x07\x00\x00\x00\ \x0eprogress_ui_tr\x01\ \x03\x00\x00\x00\xba\x00<\x00b\x00>\x00<\x00c\x00\ e\x00n\x00t\x00e\x00r\x00>\x00E\x00s\x00\ t\x00e\x00 \x00a\x00t\x00a\x00l\x00h\x00\ o\x00 \x00j\x00\xe1\x00 \x00e\x00s\x00t\x00\ \xe1\x00 \x00s\x00e\x00n\x00d\x00o\x00 \x00\ u\x00s\x00a\x00d\x00o\x00!\x00 \x00 \x00\ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\ \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\ \x00 \x00T\x00e\x00n\x00t\x00e\x00 \x00\ u\x00s\x00a\x00r\x00 \x00o\x00u\x00t\x00\ r\x00o\x00!\x00<\x00/\x00c\x00e\x00n\x00\ t\x00e\x00r\x00>\x00<\x00/\x00b\x00>\x08\ \x00\x00\x00\x00\x06\x00\x00\x00_This shortcu\ t has been used \ before! \ Use a\ nother one!\x07\x00\x00\x00\x11set\ ting_src_ui_tr\x01\x03\ \x00\x00\x00j\x00<\x00h\x00t\x00m\x00l\x00>\ \x00<\x00h\x00e\x00a\x00d\x00/\x00>\x00<\ \x00b\x00o\x00d\x00y\x00>\x00<\x00p\x00>\ \x00F\x00o\x00r\x00m\x00a\x00t\x00o\x00 \ \x00H\x00H\x00:\x00M\x00M\x00<\x00/\x00p\ \x00>\x00<\x00/\x00b\x00o\x00d\x00y\x00>\ \x00<\x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\ \x00\x00\x00\x06\x00\x00\x004

Fo\ rmat HH:MM

\x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00\x96\x00<\x00h\x00t\x00m\x00l\x00>\ \x00<\x00h\x00e\x00a\x00d\x00/\x00>\x00<\ \x00b\x00o\x00d\x00y\x00>\x00<\x00p\x00>\ \x00D\x00e\x00f\x00i\x00n\x00e\x00 \x00o\ \x00 \x00t\x00e\x00m\x00p\x00o\x00 \x00l\ \x00i\x00m\x00i\x00t\x00e\x00 \x00e\x00m\ \x00 \x00s\x00e\x00g\x00u\x00n\x00d\x00o\ \x00s\x00.\x00 \x00<\x00/\x00p\x00>\x00<\ \x00/\x00b\x00o\x00d\x00y\x00>\x00<\x00/\ \x00h\x00t\x00m\x00l\x00>\x08\x00\x00\x00\x00\x06\ \x00\x00\x00@

Set ti\ meout in seconds\ .

\x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00\xc8\x00<\x00h\ \x00t\x00m\x00l\x00>\x00<\x00h\x00e\x00a\ \x00d\x00/\x00>\x00<\x00b\x00o\x00d\x00y\ \x00>\x00<\x00p\x00>\x00\xa0\x00E\x00s\x00t\ \x00e\x00 \x00r\x00e\x00c\x00u\x00r\x00s\ \x00o\x00 \x00p\x00o\x00d\x00e\x00 \x00n\ \x00\xe3\x00o\x00 \x00f\x00u\x00n\x00c\x00i\ \x00o\x00n\x00a\x00r\x00 \x00n\x00o\x00 \ \x00s\x00e\x00u\x00 \x00s\x00i\x00s\x00t\ \x00e\x00m\x00a\x00 \x00o\x00p\x00e\x00r\ \x00a\x00c\x00i\x00o\x00n\x00a\x00l\x00.\ \x00<\x00/\x00p\x00>\x00<\x00/\x00b\x00o\ \x00d\x00y\x00>\x00<\x00/\x00h\x00t\x00m\ \x00l\x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00[

This feature\ may not work in\ your operating \ system.

\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ \xcc\x00<\x00h\x00t\x00m\x00l\x00>\x00<\x00\ h\x00e\x00a\x00d\x00/\x00>\x00<\x00b\x00\ o\x00d\x00y\x00>\x00<\x00p\x00>\x00U\x00\ t\x00i\x00l\x00i\x00z\x00a\x00r\x00 \x00\ v\x00\xe1\x00r\x00i\x00a\x00s\x00 \x00c\x00\ o\x00n\x00e\x00x\x00\xf5\x00e\x00s\x00 \x00\ p\x00o\x00d\x00e\x00 \x00a\x00j\x00u\x00\ d\x00a\x00r\x00 \x00a\x00 \x00a\x00c\x00\ e\x00l\x00e\x00r\x00a\x00r\x00 \x00o\x00\ \x00r\x00e\x00c\x00e\x00b\x00i\x00m\x00\ e\x00n\x00t\x00o\x00.\x00<\x00/\x00p\x00\ >\x00<\x00/\x00b\x00o\x00d\x00y\x00>\x00\ <\x00/\x00h\x00t\x00m\x00l\x00>\x08\x00\x00\ \x00\x00\x06\x00\x00\x00c

Usi\ ng multiple conn\ ections can help\ speed up your d\ ownload.

\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x10\x00C\x00a\x00n\x00c\x00e\x00l\x00a\ \x00r\x08\x00\x00\x00\x00\x06\x00\x00\x00\x06Canc\ el\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x0e\x00A\x00l\x00t\ \x00e\x00r\x00a\x00r\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x06Change\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00 \ \x00E\x00s\x00q\x00u\x00e\x00m\x00a\x00 \ \x00d\x00e\x00 \x00c\x00o\x00r\x00:\x00 \ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x0eColor \ scheme: \x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00\x0e\ \x00P\x00a\x00d\x00r\x00\xf5\x00e\x00s\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x08Defaults\ \x07\x00\x00\x00\x0dsetting_ui_\ tr\x01\x03\x00\x00\x00$\x00O\x00p\x00\xe7\x00\xf5\ \x00e\x00s\x00 \x00P\x00a\x00r\x00a\x00 \ \x00B\x00a\x00i\x00x\x00a\x00r\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x10Download O\ ptions\x07\x00\x00\x00\x0dsetti\ ng_ui_tr\x01\x03\x00\x00\x00\x0e\x00F\ \x00o\x00n\x00t\x00e\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x06Font: \x07\x00\x00\x00\ \x0dsetting_ui_tr\x01\x03\ \x00\x00\x00R\x00O\x00c\x00u\x00l\x00t\x00a\ \x00r\x00 \x00j\x00a\x00n\x00e\x00l\x00a\ \x00 \x00a\x00o\x00 \x00c\x00l\x00i\x00c\ \x00a\x00r\x00 \x00n\x00o\x00 \x00b\x00o\ \x00t\x00\xe3\x00o\x00 \x00f\x00e\x00c\x00h\ \x00a\x00r\x00.\x08\x00\x00\x00\x00\x06\x00\x00\x00)\ Hide main window\ if close button\ clicked.\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ \x10\x00\xcd\x00c\x00o\x00n\x00e\x00s\x00:\x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x07Icons\ : \x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00.\x00M\x00a\x00n\ \x00t\x00e\x00r\x00 \x00o\x00 \x00s\x00i\ \x00s\x00t\x00e\x00m\x00a\x00 \x00a\x00t\ \x00i\x00v\x00o\x00!\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x12Keep system aw\ ake!\x07\x00\x00\x00\x0dsetting\ _ui_tr\x01\x03\x00\x00\x00*\x00T\x00i\ \x00p\x00o\x00 \x00d\x00e\x00 \x00n\x00o\ \x00t\x00i\x00f\x00i\x00c\x00a\x00\xe7\x00\xe3\ \x00o\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x13\ Notification typ\ e: \x07\x00\x00\x00\x0dsetting_\ ui_tr\x01\x03\x00\x00\x00\x16\x00N\x00o\x00\ t\x00i\x00f\x00i\x00c\x00a\x00\xe7\x00\xe3\x00\ o\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0dNotif\ ications\x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00(\ \x00N\x00\xfa\x00m\x00e\x00r\x00o\x00 \x00d\ \x00e\x00 \x00c\x00o\x00n\x00e\x00x\x00\xf5\ \x00e\x00s\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x17Number of conn\ ections: \x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ ,\x00N\x00\xfa\x00m\x00e\x00r\x00o\x00 \x00\ d\x00e\x00 \x00t\x00e\x00n\x00t\x00a\x00\ t\x00i\x00v\x00a\x00s\x00:\x00 \x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x11Number of\ tries: \x07\x00\x00\x00\x0dset\ ting_ui_tr\x01\x03\x00\x00\x00\x0e\ \x00A\x00c\x00e\x00i\x00t\x00a\x00r\x08\x00\ \x00\x00\x00\x06\x00\x00\x00\x02OK\x07\x00\x00\x00\x0ds\ etting_ui_tr\x01\x03\x00\x00\ \x00\x18\x00P\x00r\x00e\x00f\x00e\x00r\x00\xea\ \x00n\x00c\x00i\x00a\x00s\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x0bPreferences\x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00,\x00E\x00s\x00c\x00o\x00\ l\x00h\x00a\x00 \x00u\x00m\x00a\x00 \x00\ n\x00o\x00v\x00a\x00 \x00t\x00e\x00c\x00\ l\x00a\x08\x00\x00\x00\x00\x06\x00\x00\x00\x0ePre\ ss new keys\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00L\x00E\x00x\x00e\x00c\x00u\x00t\x00\ a\x00r\x00 \x00o\x00 \x00P\x00e\x00r\x00\ s\x00\xe9\x00p\x00o\x00l\x00i\x00s\x00 \x00\ n\x00a\x00 \x00i\x00n\x00i\x00c\x00i\x00\ a\x00l\x00i\x00z\x00a\x00\xe7\x00\xe3\x00o\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x19Run Per\ sepolis at start\ up\x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x00\x0e\x00A\x00t\x00a\ \x00l\x00h\x00o\x00s\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x09Shortcuts\x07\x00\x00\x00\x0d\ setting_ui_tr\x01\x03\x00\ \x00\x00\x12\x00T\x00a\x00m\x00a\x00n\x00h\x00\ o\x00:\x00 \x08\x00\x00\x00\x00\x06\x00\x00\x00\x06S\ ize: \x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x0c\x00S\x00\ t\x00a\x00t\x00u\x00s\x08\x00\x00\x00\x00\x06\x00\ \x00\x00\x06Status\x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ \x10\x00E\x00s\x00t\x00i\x00l\x00o\x00:\x00\ \x08\x00\x00\x00\x00\x06\x00\x00\x00\x07Style\ : \x07\x00\x00\x00\x0dsetting_u\ i_tr\x01\x03\x00\x00\x002\x00T\x00e\x00m\ \x00p\x00o\x00 \x00l\x00i\x00m\x00i\x00t\ \x00e\x00 \x00(\x00s\x00e\x00g\x00u\x00n\ \x00d\x00o\x00s\x00)\x00:\x00 \x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x13Timeout (s\ econds): \x07\x00\x00\x00\x0dse\ tting_ui_tr\x01\x03\x00\x00\x00\ 6\x00O\x00p\x00\xe7\x00\xf5\x00e\x00s\x00 \x00\ d\x00o\x00 \x00B\x00u\x00s\x00c\x00a\x00\ d\x00o\x00r\x00 \x00d\x00e\x00 \x00V\x00\ \xed\x00d\x00e\x00o\x08\x00\x00\x00\x00\x06\x00\x00\x00\ \x14Video Finder Op\ tions\x07\x00\x00\x00\x0dsettin\ g_ui_tr\x01\x03\x00\x00\x00\x10\x00V\x00\ o\x00l\x00u\x00m\x00e\x00:\x00 \x08\x00\x00\ \x00\x00\x06\x00\x00\x00\x08Volume: \x07\ \x00\x00\x00\x0dsetting_ui_t\ r\x01\x03\x00\x00\x00(\x00A\x00l\x00t\x00e\x00\ r\x00a\x00r\x00 \x00P\x00a\x00s\x00t\x00\ a\x00 \x00P\x00a\x00d\x00r\x00\xe3\x00o\x08\ \x00\x00\x00\x00\x06\x00\x00\x00\x16Change \ Download Folder\x07\ \x00\x00\x00\x0atext_ui_tr\x01\x03\ \x00\x00\x00\x06\x00I\x00P\x00:\x08\x00\x00\x00\x00\x06\ \x00\x00\x00\x03IP:\x07\x00\x00\x00\x0atext\ _ui_tr\x01\x03\x00\x00\x00F\x00G\x00e\ \x00r\x00e\x00n\x00c\x00i\x00a\x00d\x00o\ \x00r\x00 \x00d\x00e\x00 \x00D\x00o\x00w\ \x00n\x00l\x00o\x00a\x00d\x00s\x00 \x00P\ \x00e\x00r\x00s\x00\xe9\x00p\x00o\x00l\x00i\ \x00s\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1bPers\ epolis Download \ Manager\x07\x00\x00\x00\x0atext\ _ui_tr\x01\x03\x00\x00\x00\x0c\x00P\x00o\ \x00r\x00t\x00a\x00:\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x05Port:\x07\x00\x00\x00\x0atext\ _ui_tr\x01\x03\x00\x00\x00F\x00<\x00b\ \x00>\x00E\x00s\x00t\x00a\x00d\x00o\x00 \ \x00d\x00o\x00 \x00a\x00r\x00q\x00u\x00i\ \x00v\x00o\x00 \x00d\x00e\x00 \x00\xe1\x00u\ \x00d\x00i\x00o\x00:\x00 \x00<\x00/\x00b\ \x00>\x08\x00\x00\x00\x00\x06\x00\x00\x00\x1aA\ udio file status\ : \x07\x00\x00\x00\x1bvideo\ _finder_progress\ _ui_tr\x01\x03\x00\x00\x00@\x00<\x00b\ \x00>\x00E\x00s\x00t\x00a\x00d\x00o\x00 \ \x00d\x00a\x00 \x00M\x00u\x00l\x00t\x00i\ \x00p\x00l\x00e\x00x\x00a\x00\xe7\x00\xe3\x00o\ \x00:\x00 \x00<\x00/\x00b\x00>\x08\x00\x00\x00\ \x00\x06\x00\x00\x00\x16Muxing \ status: \x07\x00\x00\x00\ \x1bvideo_finder_pr\ ogress_ui_tr\x01\x03\x00\x00\ \x00F\x00<\x00b\x00>\x00E\x00s\x00t\x00a\ \x00d\x00o\x00 \x00d\x00o\x00 \x00a\x00r\ \x00q\x00u\x00i\x00v\x00o\x00 \x00d\x00e\ \x00 \x00v\x00\xed\x00d\x00e\x00o\x00:\x00 \ \x00<\x00/\x00b\x00>\x08\x00\x00\x00\x00\x06\x00\x00\ \x00\x1aVideo file \ status: \x07\x00\x00\x00\ \x1bvideo_finder_pr\ ogress_ui_tr\x01\x88\x00\x00\ \x00\x02\x03\x01\ \x00\x00\x17\x8b\ \x00\ \x00PBx\xda\xbd<\x09t\x5c\xd5uO\xd2\x8c\x96\ \xd1h\xb1-\xbc\xe1\x88/\xa1\x08y\x1b\xd9\x8em\x82\ 2\x1e[\xd6\x82\x84-YX\xc2\x06R\x22\xfe\xcc\x7f\ #}\xf8\xcb\xf8/Z M(!\x81\x1ch\x0e-\ \xc1\x04\xeap\x024\x85\x83\xe1\xe4\xb4Mh\x08)8\ \x04\x9f\xa4\x0d9P\xda\x906%\x94\xe5\xb06\xd0&\ \x0e=\x05zH\xef{\xef\xaf3\xff\xff\x19\x19\x0e\x08\ \xe9\xcd\xf2\xdf}\xf7\xdd\xfd\xdew\x9f\xd3\xdf\x17V\xff\ \xe3\x7f\x1d\xbb\xf5\xe7\x1d\xeb\x1e\xbb\xfc\xae\xbf\xff\xf5\xbd\ \x08\xa1\xea\x82\xb1\x17\xa1\xf8\xeb\xf0\xfb\x19\x84j~\xc5\ \xc6\xba\xbfa\xe3\xde\x95l\x1c\xfe\x01B\xe3}0\x0a\ (\xf6H\x0c\xa1\x9e\x93(\xf6\x14\x8c\xeb\xcfG\xb1\xa7\ ?\x09\xe3\x02\x8a\xbd|\x02\xe6\xb5\xa1\xd8o\xb6\xc0\xfb\ \xf7Q|\xcb>x\xbf\x87\x8d\x1bR(~W\x1c\xa1\ \xde\x1b\xd880\x82\xe2\xc7/Gh\xa7\x8c\xe2O\xfd\ \x04\xa1m_@\xed\x1b?\x80\xf7\xff\x876\x10\xf8g\ ?\x8d6\x10\xb8]\xf5h\x03\x81\xd7\xb5\x17m$\xcf\ u=\x88\xce?\xfa\x04\x8co\xa1\x91\xf9\xf3\x10\xfa\xe4\ \xdbl\xfcT\x02M\xc6\xcf\x06\xfcnB\x87n\xba\x15\ \xa1\x1d5\xe8\xb0x\x15\xac\xff+6\x9e\x7f\x19:|\ \xf4]\x84\xea\x9b\xd8x\xfe\x8d\xe8\xe2\x1f~\x0f\xa1\xcd\ \x7f\x8an\xbb\xbb\x15\xf6\xd8\x83\x1e\x7f\xf0i\x84V$\ \xaa\xaa^}\x06\xf0\xd9\xc1\xc6\xd1W\xabV\x1f\xff\x17\ \x84\xce\xf9mU\xf6\xf3_C\xe8\x8cg\xaaW\xdc\xf2\ -\x80\xf3\x95\xeaIx\x1c5|\xb3:7z!B\ MB\xb5\xd9\xb8\x03\xf6\xfd\x1d6fj\xabo\xcd\x01\ >\xabG\xab\xefx\xa7\x00p\xf3\xd5\x0f\x9c\xd9\x8f\xd0\ Yz\xf5\xf7\xc9\xba]\x0b\xd5\xff\xde\x04\xf4\x1aZW\ \xfd\xdbM\xcd\x08\xad\xfbE\xf5\xbb'O\x02\xfd\xbf]\ \x93\xb8\xb0\x0a\xa1O\x1f\xafi\xda\xfa9\x84\x1a\xa7j\ \xd6\x9d\xdc\x00\xfb\xfb\xa0&\xfd\xa5\x1a\xd8\x8fR\xb3o\ \xf8ex\x7f/\x1bw\xcd\xd5L\x8f\x02=\xb7n\xa9\ y\xee9\xa0WSS\xcd+\x0f\xc2\xba\x1d\xfbj~\ \xf3g\xd7 \xf4\x89\xebb\xf8\x81w\x80_\xef\xc5n\ z\xd2\x80\xfd\x5c\x1f\xfb\xc6\xe8\x0fa\xbf\xff\xc6\xc6t\ \x9c\x8dCf\xec\xce\xeb~\x01\xef\x17cw\xc9\xb0\xee\ \x99O\xc6\x9e=\x0c\xf8e\x0e\xc4\xde\x88\x1dGh\xe4\ \xed\xf8\xd6'\xa7\x00\xce\x0dl\xdc\xf5d|:\xc5\x01\ \xde\x9f\x8eO\xdf\x07|l{?>w\xe6\x9d\xb0\xfe\ \x89\xf8M\x0f\xc0\xfew<\x12\xbf\xab\x1e\xe6\x0f|>\ ~\xdf\xc5\xa7`_\x0d\xf1\xfbo\xfc1B[\xbe\xcd\ \xc6\x81\xef\xd6\x9e9\xff(\xc0\xcd\xd7\xa6w\x01\xfd\x07\ _\xaa\x1d\xdb\xdd\x85\xd0\x9a\xf6\xda\xcb\xb6>\x0fRY\ ]{\xf4\xb5\xbf\x84\xef\xabk\xef\xd8G\xe8\xfc|\xed\ \xb1\x1e\xa0K\xe6\x07\xb5'\xd7\x03=\xb6\xa7k\x9f|\ \xf6\x1e\xe0\xdfp\xed+g\x81<\x9c}s\xed+[\ a<\xe7\xbbu\x8d7\x83\x1c\xb5\x9e\xaak\xdb\xd0\x8e\ P\xead\xdd\x9a\xaf\x9b0\xae\xaa\xdb\xf9\x14\xe0Y\xfb\ \xc5\xba\xcfv\xc3\xfb\x95\xb3u\x82\x022\x1d\xfb\x93\xba\ \xbf\xb8\x0c\xe4\xab\xff\xef\xea\x8em\x05\xfa\x0e^S\xf7\ \xbf\xef\x02^\xbb\x07\xebc?\xfb=B\xdd3\xf53\ \x9b\xef\x06>\xbcX\x7f\xfc\xa5\x06x\xdf\xc3\xc6\xf4\xae\ \x86\x8d-{\x00\xdf\xdf5d\x9a\x00\xef\xad\xd76\x1c\ \xfe%\xd0o\xf3c\x0d\x9f\xfb\xea?\xc3X\xd7py\ -\xf0yKU\xc3L\x15\x08\xca\xe0Y\x0d_h\x06\ |\xcf^\xdbp\xcb3\x80\xdf\xa7\xf66\x1c\x1d\x86u\ W=\xddp\xe2g\x17!\xb4\xf1\xf7l\xdc\x9bix\ \xe2\xc0-@\xff/7<1\xf3\x07\x84\xb8c\x89\xe4\ \xf5 \x1f\xe7-Ot^z\x18\x9e\xabIL\xff\x12\ \xde'R\x89\xe9S\xef\x83\xfcw$\xc4\xfc? \xd4\ 9\xc1\xc6\xde\xc7\x12z\x06\xe8\x1b{#q\xe3\x8f\x89\ ~\xa5\x12\xb7!\x90\x83\x86\xa1\xc4\xdd\x97\x80\x1c\xee=\ \x998\xd1s3\xd0\xff\xf5\xc6M\xf7v\x80\x9c\x1ck\ \x1c>\xf26B-\x176^t\xe4G\x00\xe7h\xe3\ \xe5\x1a\xcc\xdb\xf3P\xa3\xf2\xd7\xf0y\xdf\xe3\x8ds\xb1\ \xffFh\xf9\xf1\xc6\xab~\x04\xfc\xae}\xb6\xf1\xab\xf3\ _\x87uog\xe3\xb6G\x1a\xefy.\x09\xfa\xf4p\ \xe3O\x7f\xb2\x02\xe4\x22\xd3\xf8\xc2]0\x9e\x83\xd8\xb8\ \xab\xaa\xf1\xdd[\xff\x16\xf6\xd9\xd1\xf8\xfe\xc3\xe7\x82\x1d\ \x98NV\xbdz-\xd0\xeb\x8d\xe4\xda\x87AN\xb6\x8c\ '{\xd6\x80\xbe\xa7\x8e$\xb7\x9d\x98\x049\xb9,\x89\ [R\xb0\x8f\x0b\xd8\xb8\xe3wI\xbd\x15\xe4v\xcbK\ \xc9\xa3G@\x9e\x12\xf7\xb0q\xc5\x7f&o\xc7\xb0\xaf\ \xd5-\xc9o\x8e\x83|\xd4g\x92\xf7?P\x07\xf4z\ )\xf9\xbd\xaf\xc0\xe7\xdb\xefac\xff\xa5\xc9_?\x0e\ |\xdd\xf4\x18\x1b\xf7^\x93|a-\xc8c\xff\x8a\xa6\ e\x03\xbd\xf0\xfc\xaa\xa6?z\x07\x03\xbe{\x9a\x8e|\ \x03\xe4\x0e$\xf8\xf6w\xc1\x1e\xc6\xac1\xb9\x9d\x8d\x9b\ \xcec\xe3\x8es\xd98\xfc\x1f\xcd)\x01\xe4s\xe3=\ \xcd\xe7\x8e\x02\xbd\xe3\xd77O_\xf7\x22\xe8\xf7\xe3\xcd\ \x0b\xf7\xc1\xf7\xb5\xcb\xd88t\x7f\xf3\x13\x17\x00\xfd\xea\ \xff\xb5\xf9\x95\xad/ \xd4\xbe\xb5\xf9\xf5\x13\xb7\x03\xde\ w\xb4$\x08\xdd\x86W\xb4\xec|\x08\xf8q\xc6\xe1\x96\ \xdd\x1a\xec\xab\xfd\xa7-W\xb7\xb7\x81|>\xd1\xf2\xc7\ \xcb\x80_\x89S-\xd7~\x0b\xecN\xdbgZ\x8e\xdd\ \xb6\x0a\xf0y\xb4\xe5\xaf\x0e\xc1\xbe2_j\xb9\xf7!\ \xa0\xdb\xaa\xc5\x96\x07>\x0b\xeb\xae\x91`\x04~\xad\xfd\ C\xcb?\xed\x86]\xec\xbc\xb3\xe5\xd9W`?\xe7=\ \xd3\xf2\xfc\xd5\xb0~\xfa;-\xa7j@n\xd0\xfb\x22\ B\x17l\x03J\xa0?Gi\xc4#\x0e\xcd\x22\x0da\ \x94G\xbb\xe0\x95\x01?\x05\xa4\xa3>\xd4\x0b?\x05\xf8\ \x5c\x83w\x18^\xa9HB\x22\xbc\x16\x90\x8cRh\x06\ ^\x1b\xf0\xbc\x89\xb2\xf0N\x84o3\x1fjv\x1a\x9e\ \xe7Q\xa6\x9e0\xa0\x16~G\xd3<7\xab\xe1\xfc\xae\ Y\xc3(\xe8}\xbd\xbd\x05\xac\xe9\xb8\xa0J\xa2.\xc8\ \xa9\x19\xd1\x985\xb3)Q\xcdD\x7f\x9d\xee\xe53 \ \x13\xa8\x91\xcf\xaa\xa61m\x8a\xd3\x86VE\xb6~G\ \xd9\xad\x1b\xf0\xb9\x04\xbf3\xf0\x04O\x91\x96\xe1]\xf8\ \xa62\x1f\x1aB1\x09\xc6\x8aI``\x09\xcfh\xbc\ \x9c\x92\xb1o\xbf\x99r\x0f|(2\xccS^\x19\x14\ \xe9\x14\xca\x01\xca\xf2\x12\xc9\xb04\x08\xe5\xc90/\x1a\ \x06\xd6R9U\x0e!C\xc8\x03\xa1d\xe8B\x93\x80\ B\x96\x12\x81\x83W\x1c\x9a(E\xceA\xa8\xb5\x9fL\ \xe7&\x1c\xc8\x810\xdb\xd1 \xcc&\x10\x144Ga\ \xcc\xc1k\x01^\x91U\x5ch\x89A<\x87%\x95\xe0\ \x19\x08\xa7\x19\xed\x87\xd5s\x14\xcek\x88w\xe6\xd5\xed\ \x17sX\xd1q\xe0\xa4\x18:\x80\xf69\x8fV\x1f\xd8\ \x17\xf8\xd40:\x9fn\x93\x80\xce\xc1\x22\xbc\x85\x1e\x07\ #!\xc4 \xbc\x9b\x87\xef$\x18\xc9wz\x19\xc2\x9c\ \xe9\x92\x84\x1bT\xe7\x15I\xe5\x05n\x8cW\xf8\x19\xac\ \x05\x22\xb0\x13\xf5[\xdaA\x16$(\xc8\x14\x19\x03@\ \x93\xc5\x08\xfd\x0a\xd67<\x15\x10\x0e\xc6>g\xc1\xe5\ \x93\x05\x9c\x13y\x893fy\xe5J\x9d3\xd4\xbe\xc0\ u\xda\xd0\x94\xb5\x8aIa\xfb9\xd08\xa5\xf1\x8a.\ \xf1\x86\x1a\xc2\x82M\x80\xa6@\x99@,\x95\x02\x804\ \x8a\x08\x07\x9f\xf0T\xaeg(P\xd1\x87\xdc\xb2~A\ \x00\x8c\xb8\x1co\xe0\x19U[\xec\xe3\x08\xf0&^\x10\ $Q\xb9\xd2\x03\x9e\x03f\x15\x80\xb7\xef\xd0\xfd\x12\xc0\ s\xf0K\xb9\x0d\xcb\xf2>\xc9\x13\xe6x%\x87\x05\xee\ @\xc1\x10UE\x0f\x81\xd8\x8a\x06(\x84\x1c\xb5@\x80\ \xae\x03\xa1v\x80\xcc\x97B\xe6\x11~H\x96\xa2\xb2M\ \x16\xc8\xfa\xf0\x09\xef\x08\x85P\x22\x14\xee\x96W\x0e\x00\ \x1ff\xb0\xcb\xfcaU\x12\x18\xef\x03V\xeb\x02a*\ \x0b\xdd%g\x11\xd0Pr\xb6\xd1\xcdg\x01\x1c!\xa0\ \x04\xf6H\xf5\xa0X?\x82\xf9\xa8\xd9\xb5h\x14\xd0r\ \x9f\x8f\x8dN\x84>[OUSAW\xbaO\xef\x87\ 'B\x9e^\x89\xc6\x1c!V]\x86;s\x93c\xaa\ \x86\xcb06P\xaf\x03\x9eK\xc2\x1e\x88D\x1a>\x89\ \x8cO\xa8\x9a\xd1\x172%\x01S4\x98\xb4\x80\x16=\ \x134ua1d\xc2:t\x90\xfa\x8c \x0b\xe2\xae\ \x998\x88\xf3X\xd3\x22(\xdeE\x8d\x00S{\xec\x08\ \x82\x09t2\xd1\x8bT\xab\xbc\xfcK^\xa4c\x8d\x03\ \x8b\xa2\x18\xa1\x10S\xe0C\xb2\xe0\x89\xc6\xa9\xa7\xb1\xc5\ \x8a\xa3\x22}\x04\xa0\x8a\xd4 \x13?C\x9e\xf2\x98\x93\ t63,J\x98Sx\x19\xa7{\xb3\x19\xb6\xc2j\ >\x0f\xdedZ\xb0\xe4oZ\xd7r>;\xcf\x16\x9b\ \xa2>\x9eh\xddl \xf0&\x00>)^U1\xdc\ V@\x98\xa3\xb6a\x1f{\xe5\x8a0\xc7q\x07\xf6\xc1\ \x1f\x02\xa4\xad\x08\x88\x0b`-\xd05K\xe9\xa7\x15\xef\ \xddE\x0a \x15\xb0\xc2\xd1]\x97\x81\xb7\xcd\xdah\xb1\ W\xe0,\x8f^\xa0\xc1\x0e1\xaf\x1d\xf6\xf6\x9du\xd6\ \xc2\xe6\x1d\xfd\x1dP\xe5\x82\x84\x0d,t\x10Z\x94\xdb\ \x04[\xd4R4\x97\xae\x1ez\x10\xca\x12\xbds)\x1b\ \x0e\xaf\xc7\x827IM\xc3\x9ce\xe5\xd8\x06\xd4@\xe8\ \xad\x84o\xfc\x1c\xe6x\xbd\x92\x05\x86A\xea^\xa6\xd2\ &S'fXA\x05v\x0c\x1dsq:\xbc&R\ /\xc3'\x0a<9G\xc5\xc7\xd6\x82\x94\xb3|\xfb\xa0\ \xaa\x9ccp\xfa\xac:\x0f^\x0e\x1c\xab\x8cu\x1d\xc4\ \x1fT\x80\x17\x95T42+}\x22\xe0\xd8r\x07x\ \x1be~\x80\xb5\x8e\xda\xdf\xc7\x1b3\x84c\xb2.\x08\ .\xac\xb6\x1f^\xcf8\xf0\x9b=\xf0\xf7\xab3\x04d\ \xab\xa4\xceL\xcf\x8b\x0a\xc0\xf4\x80\xeb\xa6\xe6L\xa2\x0e\ \x9dI\x85I\x99S\xa0V1K\x85[\xf6\xd0.y\ \x10\xa0j\x067\xaa\xeb&\x0e\x07\xdb\xee\x08U'\xba\ \x00\xec\x19\x91\x84\x05\x8a)\xe1s\x87\x03\xee\x0c\x22\x5c\ \x9d\x1c/i\xe0\x9f\x169\xbc \xea\x86\xdeA) \ \x03\xa3-\xb8~\x13\xf1?\x960\xa7\xad\xf0\x909\xee\ \x0c\x1a\xb2\xa0s\x94&Dm8\xb0\xd3*\xbc\xe6(\ O\xbc\x91\x8cm\x19\xd9l\x1dt\x97\xab\xf0g\xca\x92\ \xde\x1c]\x95\xcc\xbe\xca\xe3\xc8\x89\xad\xb1\xad9\xe1\xd0\ \x15\xf4;\xff\xea/\xa2\xcdTN\x824`7\xa5\x9b\ \x7f_\xc5VE\x03\xd5LC\x10\x0c\x02\x92\x99\x22\xba\ A\xfc\x007\xcb\xeb\x5c\x16\x83\x5c\x83c\x80H)\x8b\ \xf3\xe0W;\xb8\x80\xff\xfa\xc1\xdf.\xaa&\xa7\x9b\xd6\ \x8by^1H\xc8\x0639\xd1`*\xb6;\xddk\ -\xe1X\xabP\x86|\x10\xc9\x10\xder\xfc,\xbaz\ \xcd2\x13\x82\x95%2\xa9{\xb1b\xf2sV\x8c\xec\ wj\xe4\x93,\x0d3\x16,\xe6\xea\x16y9\xca\x06\ \x93\xaeH\xc4/G?\xd3\xd0[4\x19\x17\xa8\xf5\xcb\ Rl'\x00\xdf\x83\x10\xac\xf4\x83)\x1b\x82\xdf)\xf8\ ;\xe6\xbc\xea\xa8\x801W\x173\x86\xa47<\x09l\ \xb8yQ\x928\x01\x13\xfb\x1f\xc4\x12\xceVt\xe0\x5c\ \x1e\x9c\x92\xce\xe55U&\xcc\xd1\x80\xb1\x9a\xc0\x09\xa2\ ~e:\xabe&\x86\x0e\x8e\xf5\x8f\x0f\x8dO\xed\xbf\ \xa4\xa3r\x0eU%N\x83C\xa2\xc5\x17\x8d\x0a\xbcJ\ \xf38m\x09|\x22.\xd1\xe6\x04\xfb+\xd2u\x15\x8b\ 7\xaek\xc8\xc37\xc4\x02\xd9\x9c`\xaa\xd4\x09tW\ Y&@\xf9\xad[\x8a\xcdf\xe9\x11\xa6\xb7\xb3\x22n\ }\xb9\x0c\xb74,\xabs\xc1\xdc\xe2\x093m\xab-\ \x1aX\xd69Qa~\xea\x88\x89ML8E\x19\xd8\ \xd9\x0fO\xda\xf6]\xef\x04M\xd5\x8d%\xf0\x0dv\xc2\ \xf86@\x0d\x071\xa1,[\x0a\xf2\xd8m\xb0\x9f\x01\ UQp\x8e\x86\xd2\x1e\xaf\x1d\x0a\x9e\xb3\xc0\xef\xf5\xa9\ N\x10\xf0\x15\x9eH\x06\x0b\x95\xc0\xde\xe3\x04\x88\x98F\ I\xaa%J\x8c}v\xd4\xcb\xde\x8b4\x84\x0c[{\ \x1d\xac=\xa4\x1b\xa2\x0c\x19%\xa4\x96\xa2\x8c9\x09\xe7\ \x8dJ\x908\xcd8*\x14\xde\x15N0\x88\xa9-1\ A\xea\x88\xde\x10\xf7q\x08\xd0\xcf\xa17\xa9l3\x0d\ *P\xf9\xc5\x01:\xe4\x95z\x16\xa1\x08\xf0\xf9\xcb\x81\ A\xe4f\x12\x89\xa9\x9a\xb6\xd8\xc1]\x02\xc6:\xc7\x93\ \xc0\xc8\x12N\x01\xe7yS2\x98\xd4u\x94\x97\xa7.\ \x0b\x7f\x96\xf3\xccX\x0c\xd1C\x08\xdfBV6x\xc3\ \xacH\x98\xd2\x9e\x8c`\xc1\xe3\x12\x0djU\x88\xd6\xb3\ \xa4\xe9M'\x84\x0aZs%\xacI\x0b\x13\x90>q\ \xa0\x8e\xb8\x92\xa5\x07K\x0c\xdb\xa0\xcf\xff\xe6\xa8\xfa\x18\ T\x08L\xea:\x02\xfc\xac\x83\xc2z\xdb*\x0c\xaa>\ \xf7\x98S\x15CTL\xec\xba\xc6r\xca[6g\x08\ H\xf3\xed4a\xe9\xb0y+\x9f\x14\x98.\xb9\xf9\x9d\ \x03{27\x8b\x05S\xc2B9\xb30\x0a`D\x8b\ KZi}\xc2\x95\x10\x17\xb4\xc1k\x86\x1e\x0d\xb7=\ \x00\xe9\x02]\xc1\x8fp\xab\x07\xaaZ(\x94C\xb7\x19\ \xdc\x98F\x05\x9a\x83\xc8\xca\x930\x0ei\x9a\xaaq\x9b\ \xcb\x08O\xc2\x99\xeef\xadutj9\xb1[\x07Y\ *\xb3\x01v\xec\x1cX\xe0\x18\x11\x05\x0c\xce\xc5)p\ D\xc9\xf1\x18\x95Qb\x0fE\x1aWj\x1e\x12q\xb4\ .\x80=\xaaE\x02\x1c\x22\xd5y\xca,\xcbu;\x0b\ \xaf\x1a\x13\x15Q\x86\xdc\x9b\x08\xaf\xbe\xa8\x83\x9f\xe2\x0c\ \x8d_,\xb7);\x93c\xb9\x0e\xd3\x9cb\x165\x8c\ \xab\x06$N\xa6\x22\x94\xf3\x02\xfd\x81\xc1\x85m\x22\xed\ \xf8\xfa\x0b\x05i1|\xe6rz\xa2\xees\xe0\ nn9`9\xe9\xf0\xe9S\xb4\xea$[&\xbc|\ =\x94\xf7\xd57\xcb\xd1\x96\x1b\x00\xd7\xacQ\x1dw\x0a\ \x90\x8eO&e\xc6(\x8a\x14\x95\x13\xdd\x96\x10O\xfd\ 0|\xfeN\x98\xaf9\x1e\xca>\xc3\xf0\x16\xb4\xa2Q\ _3\xa0a\xa0\x1e\xa7\x80d8(\x1f\x89V\x83\xd6\ P\x0bQ_\xde@L8\x05N\xdb\xb3\xbfGsv\ \x91\xd6\xe4\x8a\xcf\x12\x1242\xf1\xf3\xa2\xc8 ;\x8b\ w:\x92\x9dU\x0dC\x9595\x9f\xa0\x81\x12\xe1\x00\ 3\xb9Qv\xcbWw\xf5\xb4F9\x85\xd6(\x13\x14\ d\xf2b\xd1\x16\x8f\xf3Uc\xed\xf2\x1c\xf1\x9b2U\ i\xd5S;\x810cJ\x94#XROO\x93E\ \xdf\xea\x0bb\xe4~\x83\xadm,\xda\xd8\xb6\xfb\x1a\x1a\ p\xe8\xa1~\x03=\xcd\x1f\xe7\xa3pN\x04\x98\xedX\ \xb4\xd5\x8e\xe8v\x09\x9ep\x90\xc6Dv\xa5\xd7\xab\xe3\ \xc1\xd1\xa3n\x9d\xb9\xf2\x8ee\x9d\xb5\x0e\x0d\xed\x13-\ w\x8f\x9b\xc7H\xd57gB\x88\xa2\x18\xd2\xa2\x1ba\ Zq\x0c\x08\x0e\x04\x1a\x9c\xaa@6\xa9\xceGi\xc4\ G\x85#\xeb^s\xa9\xb91\x1aC\xb3P\x11~\xed\ 4\x182i\xbb\x80Vz\xc6\xe39\xe6\xe6M\xddm\ \xbc\x8ar\xa3,W\xb2+\xbeV\x17\x82\xaf\xe0@\x8a\ \xba\xfcL\x84\xf4|\xdcM\x00\xc1X\xac\xa6\xd5{\x5c\ RM\xf7\x98\xf1\x09\x8dt\x1fa\x05\x22\xd8(\xf7V\ r\x0a\xe0\xaa\xff\x84\x95\xcc\x97CC\xb5L#\xb6\xaa\ \xce\xbe\x16O\x00R\xc0\x9a!FaQ_\x12\x12\xc5\ \xcbDD\x9d\xb4c\xc1{\x9aRr\x92\xe8\x96\xd5\x0f\ \xb2s\x12\xf7h.\x1c\xeeR;!Z\xacN\x08^\ \xe1D\xa7\x19\x22\xc4\xec\x1e\xa48\x9a\xd4\xccF\xc93\ \xc0\xa45\xa0\xf2\x02=\x5c\x94y\xf5\x96\xd4\xa2\x97V\ ,^Kr\xb4^Z\xaa\xf6\x94\x8a9\x11\xe2\xf7h\ \xaf\xec\xab\xb3\xb9\xc6xr\xd64\xe86\xa2\xfc\x81\xaf\ y\xcc\xb5\xaf\xa4_,J\x95+O\xb7\xc2\xacK\xa9\ \x1b\x14\x9d\x13\x0f\x8f#\xa6\x87\x1ae\xdc`g\xc9a\ I\xb88\xb62\x80\x95Hc\x94v\xd6\xb2C\xb9\xf0\ \xc9\xeb\xac\x5c2\xdax6\xd1,\xb1\xbc\xa8\xb5\xfb\xa0\ \x85\xef\xaee\x92\x95\x89\xcao.\xe5\x81\xd8[\xdc\xb4\ \x1b\x81q\x1bY\xa1\x97\xf5\xf2V\x80\xf8Z\xc8\x9c\xba\ iI\x00SN\x0fS.\x93w\xae\xb44\x1d\xea\x06\ \x99W\xb9a\x98\x1cmu\x0f\x95\x81\x94Mo>\xd8{\ p\xf1\xff\xda\x92\xf0\x1f\xa4r\xc4\x88\xaaY\xa1\x1f\x93\ \x879*\x85\xaaS\xef.\xaat\x03;\xb8%\xedq\ O\xf0\x1e'\xb1A}\x00\xb9N'*v\x91<\xc5\ U\xbc\xdfG\x97\xb4\xdf\x8b\x9c4z\xce\xbaY\xc2;\ '$^w\xe2mX\xe3\xed2\x89\xd3\xae\xc6[\x11\ \x1a\xf6\x1c\xf5\x04\x1c\x12/\x89>\xb9`\xfa\x5c\xa4\x13\ M\x91M\xc9\x10\x0b\x12\xf6z4\xd2\xfd\xc6\xcdb\xa9\ \xc0\xe9\x05\x0c\x9e\xd4,\xb0\x1eY;\xd0IUL\xc2\ \xca\xee\x8a\x95\xce\xab\xb8(\x1c0\xb7\xd9\x7f\xcf\xcc\xb3\ \x22\xb5\x1c!\xb3:i\x97.k,\x97=n!g\ \xdf\xe8\xf3\xb8\x81\xe6\x01UR5N\xcf\xcdb\xd9\xf2\ \x02!{\xaf\xac\x00\x1c\xb8\x89\x09\xab]\xd1?\xb5~\ \x90\xf5\x22\x86\xcd\xfb\x08\xc2\xb9@l*\xaa\xa1\x06\xcc\ <\xbd\xb2b\x00\xa0$5\x88\xcc\x84\xb8\x9c\xa8\x1dV\ \x9d\xabZAh\xff\xdcQ?/\xff\xeaFsN\xdc\ \x160\xed\x10\xc4\xdd2m\xdc\x11,\xdbU|N'\ XQ\xa8\xe29\x92e\xb6L\xb6\x8e\x1f\xd8\x89(\xbb\ `\xaa\x14\x9d\x89.\xdf\x87q\xc1\xce\xff\xf9y\xf0c\ \x1d!\x98\xbc^\x14\xa0\xca`Y\x16\x9c\x82\xba\xe0\xbb\ \x85\xa1{\x1a$4\xe7\xf6\x04\xf1\xde\x06`\xa29%\ \xc6>+V`VL\xa7;\x92\xa8\x85\xeb\xa1s\x99\ \xc5\xc9\xd2\x15\xe7-h\x9cu\xd1\x98\xf5\x82\xcc97\ \xe7\xf4\xa2\xf5\x19Fs\xe8-'\x85\x13\x9c\x16\x0d\xc1\ \x9aKnr\xac\xa7\x96\xca\xb3\xb6C\x9b\xd91~A\ \x94M\x99S\x9cP\x9b\xdc\xbb\xd0\xd9]\xd7\x82aj\ \xb8\x0fB\x020c\xba\xccKR\xa6g4\xcfe5\ u\x9e\xdc\xdb\xd31\xd8w\xd7\xa0\xcd\xd1D\x91\xcd\x06\ _\xc7Sg\xb0>\xdd\xcb&\x86P\xbc\x07\xe2B\xd1\ )Y\xf0a\x05\x1d\x8f0\xad\x18W\x0d1/\xe6X\ \x87\x96\xb1X\x08\xb7\x08\xab\xa92\xf8\x81\xf9\xd5\xbb\xc9\ \x0b,\x5c\xc7+H[*JZ\x02\x80o\xf2\x01\xd7\ }\x07\x18\xac\xa4kP\xd5\xe5}\x1a\xb5\xcc]\xc4\xd0\ D\x1c\x0e>\xf8\x8ei\xe9sK\xac$\x07\x12{\xa9\ \x05\xdc\x00 #\xc5\xa9{h\xb8\xceN\x16\xbd1\xa4\ ]v\xf0W\x00\xd7\x1c4\x15o\xcc\x0b\x92IcH\ \xb3\x10j\xc4\xca\xd4\xef\x02]\x8f\xff\xc2\xa8\xc7`\x92\ Y\xa1\xdcI\xa2I\x8b\xc5\xa6\x87N\x9eBX ~\ CV6.\xf9\x9b{'\x8dE\x09G\xc8\xd9h@\ @\xd8S\x12\x0c\xae\xf7_\x90\x98\xb2\x02\xba\x1e+\x9c\ [\x1f\xb1@\xb1'T\xe9\xf5\x81\xe8\xf2R\x9b\xb7\xbc\ T\xc6+\xb6\xd2\xcb\x08\x12\xcd\xae\xb0\x0f\xcd\xfaC\xaa\ d\xcaQ\x9b\x0f:\xfaw;\x90\xbd\xe7\xbc\x9e\xb0\xc3\ \xba\xf3O\xcb~\x0cv\xc2\xc0\x0b\xc6R\xe3\xad\xe2I\ \xdbO\xe7b~%\xd7\xf2\x8b\x17\xea\xb6\x0a\x04\xa5\xa7\ _\x1a=4U\x8bZ]\x92\x83\x98\x1dlq\xfdR\ \xe6\xc5\xf7\xe9kF'\xfa\x82\x9eK8WS\x5c\ \xe0qr\xbe\xa8\x07=\x1dh\xa3\x8a\x1f\x1a\x5cb\x9d\ \xe6\xc3UiJ7\xe4\x5c\xc1\x0f\xb8\x80\x1f\xf4t\xf8\ \xed\xfb\xe2\xa790\x02\x95\xf1'1\x19\xc9\x9dM\x10\ 5\x9a\xf4\x02\x0f\x03P\xdav!\xd3H\xc1o\x95[\ \x87\xb1\x91\x9b\xe5\xc6\xb0 \xf2\xdc~\xab\xc5b\xc5\xa2\ a\xdf\xc4/n\x1au\xd7P,\x1d\x17C\xaa\xa6\xba\ \xe7\x9fa\xe1}\xab\xa7\xc8\x8f+\xd1\x14\x03\x92\x1c1\ $H\x155\x95JE\xe2q0\xa4yU\xa4\xd1\x9f\ h\xe95;\xea*n\xec\xf1\xc6K$\xb6\x92X\x7f\ \x9d\x83\xcfYV\x7f(\xadc@\x1c3\xc7K\xa2\xe0\ \x09o\x22\x11\xeb)\xe1&v\x10\xc9{K\x0c\x9e\x03\ \x06\xc6U\x9ec\xc5\xe3H\xf0\xa7Q\xb0\x0f\x84u\x03\ \xd1\xb4\x9a\xaa\xff\x07\xa6\x10'\x15\ " qt_resource_name = b"\ \x00\x0c\ \x0d\xfc\x11\x13\ \x00t\ \x00r\x00a\x00n\x00s\x00l\x00a\x00t\x00i\x00o\x00n\x00s\ \x00\x0d\ \x0b,\xef4\ \x00P\ \x00a\x00p\x00i\x00r\x00u\x00s\x00-\x00L\x00i\x00g\x00h\x00t\ \x00\x0f\ \x06#\xe4\xb4\ \x00t\ \x00r\x00a\x00n\x00s\x00l\x00a\x00t\x00o\x00r\x00s\x00.\x00t\x00x\x00t\ \x00\x0b\ \x06\x09\x91\xfe\ \x00d\ \x00a\x00r\x00k\x00 \x00f\x00u\x00s\x00i\x00o\x00n\ \x00\x07\ \x06\x87\x09c\ \x00P\ \x00a\x00p\x00i\x00r\x00u\x00s\ \x00\x06\ \x04\x98\xbd\x05\ \x00B\ \x00r\x00e\x00e\x00z\x00e\ \x00\x0b\ \x01\x12\xbf+\ \x00B\ \x00r\x00e\x00e\x00z\x00e\x00-\x00D\x00a\x00r\x00k\ \x00\x13\ \x0f\xcfa\xc7\ \x00p\ \x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\x00s\x00-\x00t\x00r\x00a\x00y\x00.\x00s\ \x00v\x00g\ \x00\x0c\ \x06\xb1I\xab\ \x00P\ \x00a\x00p\x00i\x00r\x00u\x00s\x00-\x00D\x00a\x00r\x00k\ \x00\x0e\ \x01\x06\x97C\ \x00d\ \x00a\x00r\x00k\x00_\x00s\x00t\x00y\x00l\x00e\x00.\x00q\x00s\x00s\ \x00&\ \x0fy@G\ \x00c\ \x00o\x00m\x00.\x00g\x00i\x00t\x00h\x00u\x00b\x00.\x00p\x00e\x00r\x00s\x00e\x00p\ \x00o\x00l\x00i\x00s\x00d\x00m\x00.\x00p\x00e\x00r\x00s\x00e\x00p\x00o\x00l\x00i\ \x00s\x00.\x00s\x00v\x00g\ \x00\x0f\ \x07\xd5F#\ \x00l\ \x00i\x00g\x00h\x00t\x00_\x00s\x00t\x00y\x00l\x00e\x00.\x00q\x00s\x00s\ \x00\x0c\ \x08\x83\x22\x9e\ \x00l\ \x00i\x00g\x00h\x00t\x00 \x00f\x00u\x00s\x00i\x00o\x00n\ \x00\x0f\ \x0d\x17\x9b\x07\ \x00f\ \x00o\x00l\x00d\x00e\x00r\x00_\x00l\x00i\x00n\x00k\x00.\x00s\x00v\x00g\ \x00\x12\ \x01\x06\x86G\ \x00u\ \x00p\x00_\x00a\x00r\x00r\x00o\x00w\x00_\x00h\x00o\x00v\x00e\x00r\x00.\x00s\x00v\ \x00g\ \x00\x11\ \x02`\x9e\xe7\ \x00s\ \x00k\x00i\x00p\x00_\x00b\x00a\x00c\x00k\x00w\x00a\x00r\x00d\x00.\x00s\x00v\x00g\ \ \x00\x15\ \x00a\x01\xc7\ \x00b\ \x00r\x00a\x00n\x00c\x00h\x00_\x00o\x00p\x00e\x00n\x00_\x00h\x00o\x00v\x00e\x00r\ \x00.\x00s\x00v\x00g\ \x00\x11\ \x03\xbf\x8a\x87\ \x00d\ \x00i\x00a\x00l\x00o\x00g\x00_\x00c\x00a\x00n\x00c\x00e\x00l\x00.\x00s\x00v\x00g\ \ \x00\x11\ \x0e\xd0\x99\xe7\ \x00c\ \x00l\x00o\x00s\x00e\x00_\x00p\x00r\x00e\x00s\x00s\x00e\x00d\x00.\x00s\x00v\x00g\ \ \x00\x0f\ \x0c\xe2e\xe7\ \x00t\ \x00r\x00a\x00n\x00s\x00p\x00a\x00r\x00e\x00n\x00t\x00.\x00s\x00v\x00g\ \x00\x16\ \x06\x03\x88\xa7\ \x00a\ \x00d\x00s\x00_\x00m\x00a\x00x\x00i\x00m\x00i\x00z\x00e\x00_\x00h\x00o\x00v\x00e\ \x00r\x00.\x00s\x00v\x00g\ \x00\x14\ \x0aPJ\xe7\ \x00r\ \x00e\x00s\x00t\x00o\x00r\x00e\x00_\x00d\x00e\x00f\x00a\x00u\x00l\x00t\x00s\x00.\ \x00s\x00v\x00g\ \x00\x08\ \x02\x8cT'\ \x00p\ \x00l\x00a\x00y\x00.\x00s\x00v\x00g\ \x00\x0d\ \x02h\xefG\ \x00t\ \x00a\x00b\x00_\x00c\x00l\x00o\x00s\x00e\x00.\x00s\x00v\x00g\ \x00\x10\ \x01\x08\xc7'\ \x00h\ \x00m\x00o\x00v\x00e\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00.\x00s\x00v\x00g\ \x00\x0f\ \x00r\x98\xe7\ \x00v\ \x00s\x00e\x00p\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00.\x00s\x00v\x00g\ \x00#\ \x06\xf2\x17\xc7\ \x00c\ \x00h\x00e\x00c\x00k\x00b\x00o\x00x\x00_\x00i\x00n\x00d\x00e\x00t\x00e\x00r\x00m\ \x00i\x00n\x00a\x00t\x00e\x00_\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00s\ \x00v\x00g\ \x00\x13\ \x0f\x16\x8f\xe7\ \x00a\ \x00d\x00s\x00_\x00c\x00l\x00o\x00s\x00e\x00_\x00h\x00o\x00v\x00e\x00r\x00.\x00s\ \x00v\x00g\ \x00\x15\ \x09\xf5A\x87\ \x00r\ \x00i\x00g\x00h\x00t\x00_\x00a\x00r\x00r\x00o\x00w\x00_\x00h\x00o\x00v\x00e\x00r\ \x00.\x00s\x00v\x00g\ \x00\x12\ \x08\x8fD\xa7\ \x00d\ \x00i\x00a\x00l\x00o\x00g\x00_\x00d\x00i\x00s\x00c\x00a\x00r\x00d\x00.\x00s\x00v\ \x00g\ \x00\x14\ \x04\x13\x00\xa7\ \x00m\ \x00e\x00s\x00s\x00a\x00g\x00e\x00_\x00q\x00u\x00e\x00s\x00t\x00i\x00o\x00n\x00.\ \x00s\x00v\x00g\ \x00\x0e\ \x01\xd4\xf6G\ \x00h\ \x00a\x00r\x00d\x00_\x00d\x00r\x00i\x00v\x00e\x00.\x00s\x00v\x00g\ \x00\x1a\ \x01\x87\xa3\xe7\ \x00c\ \x00h\x00e\x00c\x00k\x00b\x00o\x00x\x00_\x00i\x00n\x00d\x00e\x00t\x00e\x00r\x00m\ \x00i\x00n\x00a\x00t\x00e\x00.\x00s\x00v\x00g\ \x00\x09\ \x0c\x98\xb7\xc7\ \x00p\ \x00a\x00u\x00s\x00e\x00.\x00s\x00v\x00g\ \x00\x0e\ \x09\x86M\x07\ \x00c\ \x00l\x00e\x00a\x00r\x00_\x00t\x00e\x00x\x00t\x00.\x00s\x00v\x00g\ \x00\x0d\ \x03\xa20\xc7\ \x00d\ \x00i\x00a\x00l\x00o\x00g\x00_\x00n\x00o\x00.\x00s\x00v\x00g\ \x00\x10\ \x0fg5G\ \x00d\ \x00i\x00a\x00l\x00o\x00g\x00_\x00r\x00e\x00s\x00e\x00t\x00.\x00s\x00v\x00g\ \x00\x12\ \x0bU\xc2\xe7\ \x00h\ \x00o\x00m\x00e\x00_\x00d\x00i\x00r\x00e\x00c\x00t\x00o\x00r\x00y\x00.\x00s\x00v\ \x00g\ \x00\x0a\ \x0c;\xf6\xa7\ \x00v\ \x00o\x00l\x00u\x00m\x00e\x00.\x00s\x00v\x00g\ \x00\x10\ \x00Uo\x87\ \x00w\ \x00i\x00n\x00d\x00o\x00w\x00_\x00c\x00l\x00o\x00s\x00e\x00.\x00s\x00v\x00g\ \x00\x0f\ \x06\x16(g\ \x00b\ \x00r\x00a\x00n\x00c\x00h\x00_\x00m\x00o\x00r\x00e\x00.\x00s\x00v\x00g\ \x00\x18\ \x04\x8f\x98\xa7\ \x00f\ \x00i\x00l\x00e\x00_\x00d\x00i\x00a\x00l\x00o\x00g\x00_\x00d\x00e\x00t\x00a\x00i\ \x00l\x00e\x00d\x00.\x00s\x00v\x00g\ \x00\x1d\ \x09\x07\x8c\x87\ \x00c\ \x00h\x00e\x00c\x00k\x00b\x00o\x00x\x00_\x00c\x00h\x00e\x00c\x00k\x00e\x00d\x00_\ \x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00s\x00v\x00g\ \x00\x0f\ \x06\xeb]\xe7\ \x00d\ \x00i\x00a\x00l\x00o\x00g\x00_\x00o\x00p\x00e\x00n\x00.\x00s\x00v\x00g\ \x00\x0b\ \x07`\xe9\x07\ \x00u\ \x00n\x00s\x00h\x00a\x00d\x00e\x00.\x00s\x00v\x00g\ \x00\x0e\ \x04\xa2\xf1'\ \x00d\ \x00o\x00w\x00n\x00_\x00a\x00r\x00r\x00o\x00w\x00.\x00s\x00v\x00g\ \x00\x0c\ \x07\x89\xd5G\ \x00c\ \x00o\x00m\x00p\x00u\x00t\x00e\x00r\x00.\x00s\x00v\x00g\ \x00\x11\ \x0a\xe5a\x87\ \x00r\ \x00a\x00d\x00i\x00o\x00_\x00c\x00h\x00e\x00c\x00k\x00e\x00d\x00.\x00s\x00v\x00g\ \ \x00\x0e\ \x0e\xde\xf7G\ \x00l\ \x00e\x00f\x00t\x00_\x00a\x00r\x00r\x00o\x00w\x00.\x00s\x00v\x00g\ \x00\x0e\ \x00\xb0\x1ag\ \x00a\ \x00d\x00s\x00_\x00d\x00e\x00t\x00a\x00c\x00h\x00.\x00s\x00v\x00g\ \x00\x15\ \x05\x5c\x0e\xa7\ \x00b\ \x00r\x00a\x00n\x00c\x00h\x00_\x00m\x00o\x00r\x00e\x00_\x00a\x00r\x00r\x00o\x00w\ \x00.\x00s\x00v\x00g\ \x00\x0c\ \x0f\x88\xfaG\ \x00m\ \x00i\x00n\x00i\x00m\x00i\x00z\x00e\x00.\x00s\x00v\x00g\ \x00\x1c\ \x01\xe0G\x87\ \x00r\ \x00a\x00d\x00i\x00o\x00_\x00u\x00n\x00c\x00h\x00e\x00c\x00k\x00e\x00d\x00_\x00d\ \x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00s\x00v\x00g\ \x00\x09\ \x00H\xa0\xa7\ \x00v\ \x00l\x00i\x00n\x00e\x00.\x00s\x00v\x00g\ \x00\x14\ \x04\x18\xac'\ \x00f\ \x00i\x00l\x00e\x00_\x00d\x00i\x00a\x00l\x00o\x00g\x00_\x00i\x00n\x00f\x00o\x00.\ \x00s\x00v\x00g\ \x00\x0d\ \x09\xe6\xef'\ \x00a\ \x00d\x00s\x00_\x00c\x00l\x00o\x00s\x00e\x00.\x00s\x00v\x00g\ \x00\x18\ \x0b\x88@G\ \x00h\ \x00o\x00r\x00i\x00z\x00o\x00n\x00t\x00a\x00l\x00_\x00e\x00x\x00t\x00e\x00n\x00s\ \x00i\x00o\x00n\x00.\x00s\x00v\x00g\ \x00\x14\ \x00a\xa3\xc7\ \x00f\ \x00i\x00l\x00e\x00_\x00d\x00i\x00a\x00l\x00o\x00g\x00_\x00l\x00i\x00s\x00t\x00.\ \x00s\x00v\x00g\ \x00\x14\ \x05\x8e\xb3\xc7\ \x00d\ \x00o\x00w\x00n\x00_\x00a\x00r\x00r\x00o\x00w\x00_\x00h\x00o\x00v\x00e\x00r\x00.\ \x00s\x00v\x00g\ \x00\x08\ \x0cXT\xa7\ \x00m\ \x00e\x00n\x00u\x00.\x00s\x00v\x00g\ \x00\x09\ \x07\xa8\xa9\x07\ \x00s\ \x00h\x00a\x00d\x00e\x00.\x00s\x00v\x00g\ \x00\x17\ \x0bk+\xe7\ \x00b\ \x00r\x00a\x00n\x00c\x00h\x00_\x00c\x00l\x00o\x00s\x00e\x00d\x00_\x00h\x00o\x00v\ \x00e\x00r\x00.\x00s\x00v\x00g\ \x00\x15\ \x0a\x13\xa4'\ \x00a\ \x00d\x00s\x00_\x00c\x00l\x00o\x00s\x00e\x00_\x00p\x00r\x00e\x00s\x00s\x00e\x00d\ \x00.\x00s\x00v\x00g\ \x00\x18\ \x0f\x14\xf6\x07\ \x00a\ \x00d\x00s\x00_\x00m\x00a\x00x\x00i\x00m\x00i\x00z\x00e\x00_\x00p\x00r\x00e\x00s\ \x00s\x00e\x00d\x00.\x00s\x00v\x00g\ \x00\x13\ \x02\xfe\x18g\ \x00d\ \x00i\x00a\x00l\x00o\x00g\x00_\x00s\x00a\x00v\x00e\x00_\x00a\x00l\x00l\x00.\x00s\ \x00v\x00g\ \x00\x10\ \x01\x0fG'\ \x00v\ \x00m\x00o\x00v\x00e\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00.\x00s\x00v\x00g\ \x00\x10\ \x01\x9cT'\ \x00d\ \x00i\x00a\x00l\x00o\x00g\x00_\x00a\x00p\x00p\x00l\x00y\x00.\x00s\x00v\x00g\ \x00\x14\ \x0d\xb7eG\ \x00a\ \x00d\x00s\x00_\x00d\x00e\x00t\x00a\x00c\x00h\x00_\x00h\x00o\x00v\x00e\x00r\x00.\ \x00s\x00v\x00g\ \x00\x0d\ \x03\xae0\xc7\ \x00d\ \x00i\x00a\x00l\x00o\x00g\x00_\x00o\x00k\x00.\x00s\x00v\x00g\ \x00\x15\ \x01&\x22\xc7\ \x00c\ \x00a\x00l\x00e\x00n\x00d\x00a\x00r\x00_\x00p\x00r\x00e\x00v\x00i\x00o\x00u\x00s\ \x00.\x00s\x00v\x00g\ \x00\x18\ \x03\x1bb'\ \x00f\ \x00i\x00l\x00e\x00_\x00d\x00i\x00a\x00l\x00o\x00g\x00_\x00c\x00o\x00n\x00t\x00e\ \x00n\x00t\x00s\x00.\x00s\x00v\x00g\ \x00\x0c\ \x06\xe6\xeb\xe7\ \x00u\ \x00p\x00_\x00a\x00r\x00r\x00o\x00w\x00.\x00s\x00v\x00g\ \x00\x08\ \x0bcU\x87\ \x00s\ \x00t\x00o\x00p\x00.\x00s\x00v\x00g\ \x00\x11\ \x0b\xda='\ \x00b\ \x00r\x00a\x00n\x00c\x00h\x00_\x00c\x00l\x00o\x00s\x00e\x00d\x00.\x00s\x00v\x00g\ \ \x00\x11\ \x04\x00]G\ \x00c\ \x00a\x00l\x00e\x00n\x00d\x00a\x00r\x00_\x00n\x00e\x00x\x00t\x00.\x00s\x00v\x00g\ \ \x00\x16\ \x01u\xc1\x07\ \x00c\ \x00h\x00e\x00c\x00k\x00b\x00o\x00x\x00_\x00u\x00n\x00c\x00h\x00e\x00c\x00k\x00e\ \x00d\x00.\x00s\x00v\x00g\ \x00\x11\ \x0c\x88F\xa7\ \x00d\ \x00i\x00a\x00l\x00o\x00g\x00_\x00i\x00g\x00n\x00o\x00r\x00e\x00.\x00s\x00v\x00g\ \ \x00\x10\ \x04#\x01g\ \x00s\ \x00k\x00i\x00p\x00_\x00f\x00o\x00r\x00w\x00a\x00r\x00d\x00.\x00s\x00v\x00g\ \x00\x0c\ \x0fy\xbaG\ \x00m\ \x00a\x00x\x00i\x00m\x00i\x00z\x00e\x00.\x00s\x00v\x00g\ \x00\x1f\ \x0a\xae*\xc7\ \x00c\ \x00h\x00e\x00c\x00k\x00b\x00o\x00x\x00_\x00u\x00n\x00c\x00h\x00e\x00c\x00k\x00e\ \x00d\x00_\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00s\x00v\x00g\ \x00\x15\ \x0f\xf3\xcd\x87\ \x00u\ \x00p\x00_\x00a\x00r\x00r\x00o\x00w\x00_\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\ \x00.\x00s\x00v\x00g\ \x00\x19\ \x01\x18\x8a\xa7\ \x00a\ \x00d\x00s\x00_\x00m\x00e\x00n\x00u\x00_\x00b\x00u\x00t\x00t\x00o\x00n\x00_\x00h\ \x00o\x00v\x00e\x00r\x00.\x00s\x00v\x00g\ \x00\x11\ \x0c9\xc2g\ \x00n\ \x00e\x00t\x00w\x00o\x00r\x00k\x00_\x00d\x00r\x00i\x00v\x00e\x00.\x00s\x00v\x00g\ \ \x00\x10\ \x07\x98\xf6\xc7\ \x00u\ \x00n\x00d\x00o\x00c\x00k\x00_\x00h\x00o\x00v\x00e\x00r\x00.\x00s\x00v\x00g\ \x00\x08\ \x00(Wg\ \x00f\ \x00i\x00l\x00e\x00.\x00s\x00v\x00g\ \x00\x10\ \x02\xddK\xa7\ \x00v\ \x00o\x00l\x00u\x00m\x00e\x00_\x00m\x00u\x00t\x00e\x00d\x00.\x00s\x00v\x00g\ \x00\x13\ \x08\xc8\x9bg\ \x00r\ \x00a\x00d\x00i\x00o\x00_\x00u\x00n\x00c\x00h\x00e\x00c\x00k\x00e\x00d\x00.\x00s\ \x00v\x00g\ \x00\x1b\ \x04\x16\xf8'\ \x00a\ \x00d\x00s\x00_\x00m\x00e\x00n\x00u\x00_\x00b\x00u\x00t\x00t\x00o\x00n\x00_\x00p\ \x00r\x00e\x00s\x00s\x00e\x00d\x00.\x00s\x00v\x00g\ \x00\x08\ \x0c3W\x07\ \x00h\ \x00e\x00l\x00p\x00.\x00s\x00v\x00g\ \x00\x0a\ \x0a\xc8\xf6\x87\ \x00f\ \x00o\x00l\x00d\x00e\x00r\x00.\x00s\x00v\x00g\ \x00\x10\ \x0dpl\x87\ \x00a\ \x00d\x00s\x00_\x00m\x00a\x00x\x00i\x00m\x00i\x00z\x00e\x00.\x00s\x00v\x00g\ \x00\x13\ \x09\xbb\x14\xa7\ \x00m\ \x00e\x00s\x00s\x00a\x00g\x00e\x00_\x00w\x00a\x00r\x00n\x00i\x00n\x00g\x00.\x00s\ \x00v\x00g\ \x00\x17\ \x0c\xab\x5c\x87\ \x00d\ \x00o\x00w\x00n\x00_\x00a\x00r\x00r\x00o\x00w\x00_\x00d\x00i\x00s\x00a\x00b\x00l\ \x00e\x00d\x00.\x00s\x00v\x00g\ \x00\x1a\ \x0e\xbc\xce\xe7\ \x00r\ \x00a\x00d\x00i\x00o\x00_\x00c\x00h\x00e\x00c\x00k\x00e\x00d\x00_\x00d\x00i\x00s\ \x00a\x00b\x00l\x00e\x00d\x00.\x00s\x00v\x00g\ \x00\x09\ \x08\x9b\xad\xc7\ \x00t\ \x00r\x00a\x00s\x00h\x00.\x00s\x00v\x00g\ \x00\x13\ \x0e\xef\xed\x87\ \x00a\ \x00d\x00s\x00_\x00m\x00e\x00n\x00u\x00_\x00b\x00u\x00t\x00t\x00o\x00n\x00.\x00s\ \x00v\x00g\ \x00\x11\ \x02mo'\ \x00s\ \x00e\x00e\x00k\x00_\x00b\x00a\x00c\x00k\x00w\x00a\x00r\x00d\x00.\x00s\x00v\x00g\ \ \x00\x0c\ \x06AM\x07\ \x00s\ \x00i\x00z\x00e\x00g\x00r\x00i\x00p\x00.\x00s\x00v\x00g\ \x00\x14\ \x07\xec\xdcG\ \x00c\ \x00h\x00e\x00c\x00k\x00b\x00o\x00x\x00_\x00c\x00h\x00e\x00c\x00k\x00e\x00d\x00.\ \x00s\x00v\x00g\ \x00\x16\ \x0e\x88\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x00~\x00\x02\x00\x00\x00 \x00\x00\x00\xd8\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\xec\x00\x02\x00\x00\x00 \x00\x00\x00\xb8\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01~\x00\x01\x00\x00\x00\x01\x00\x00IC\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x01\xa2\x00\x02\x00\x00\x00x\x00\x00\x00@\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x1e\x00\x02\x00\x00\x00 \x00\x00\x00 \ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x0e\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01,\x00\x01\x00\x00\x00\x01\x00\x00G\x11\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x00\xc0\x00\x00\x00\x00\x00\x01\x00\x00\x0d.\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17\xa4\x00\x02\x00\x00\x00\x11\x00\x00\x00\x0f\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x19\x00\x00\x00\x00\x00\x00\x01\x00\x07\x5c\x8d\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x18N\x00\x01\x00\x00\x00\x01\x00\x06\x0e\xdb\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17\xb8\x00\x00\x00\x00\x00\x01\x00\x04\xcd/\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x18\xb8\x00\x00\x00\x00\x00\x01\x00\x06\xc8\x15\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x18j\x00\x01\x00\x00\x00\x01\x00\x06*\x04\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x18\x16\x00\x00\x00\x00\x00\x01\x00\x05\xb4\xd7\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x192\x00\x00\x00\x00\x00\x01\x00\x07\xbe!\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x182\x00\x00\x00\x00\x00\x01\x00\x05\xe8\x8c\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x18\x86\x00\x00\x00\x00\x00\x01\x00\x06@\xe6\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x18\xd4\x00\x00\x00\x00\x00\x01\x00\x06\xf9\xeb\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17\xd4\x00\x00\x00\x00\x00\x01\x00\x05#\xb5\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x18\xea\x00\x00\x00\x00\x00\x01\x00\x07+B\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x18\x00\x00\x00\x00\x00\x00\x01\x00\x05h\x09\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x19N\x00\x01\x00\x00\x00\x01\x00\x07\xf0z\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x18\xa2\x00\x00\x00\x00\x00\x01\x00\x06\x86\x95\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17\xea\x00\x01\x00\x00\x00\x01\x00\x05UM\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x19\x1c\x00\x00\x00\x00\x00\x01\x00\x07\x8c\xb4\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d\x1a\x00\x00\x00\x00\x00\x01\x00\x04\x98Q\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15L\x00\x00\x00\x00\x00\x01\x00\x04\x9ay\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17\x88\x00\x00\x00\x00\x00\x01\x00\x04\xc9\xe7\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\x08\x00\x00\x00\x00\x00\x01\x00\x04\x91'\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\x80\x00\x00\x00\x00\x00\x01\x00\x04\xb7\x8b\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x03:\x00\x00\x00\x00\x00\x01\x00\x04\x97\x9e\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\xc0\x00\x00\x00\x00\x00\x01\x00\x04\xa6\x97\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17\x00\x00\x00\x00\x00\x00\x01\x00\x04\xbe\xc1\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\x9c\x00\x00\x00\x00\x00\x01\x00\x04\xa2Z\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x172\x00\x00\x00\x00\x00\x01\x00\x04\xc2h\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17n\x00\x00\x00\x00\x00\x01\x00\x04\xc6n\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x14\xf2\x00\x00\x00\x00\x00\x01\x00\x04\x90\x08\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17 \x00\x00\x00\x00\x00\x01\x00\x04\xc0D\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\xc8\x00\x00\x00\x00\x00\x01\x00\x04\xbbA\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15n\x00\x00\x00\x00\x00\x01\x00\x04\x9d(\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\x06\x00\x00\x00\x00\x00\x01\x00\x04\xabr\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0e\xae\x00\x00\x00\x00\x00\x01\x00\x04\xa4a\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\xa6\x00\x00\x00\x00\x00\x01\x00\x04\xb9\x5c\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d\xd4\x00\x00\x00\x00\x00\x01\x00\x04\xa0\xd5\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0b\x1c\x00\x00\x00\x00\x00\x01\x00\x04\xc9B\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x14\xd8\x00\x00\x00\x00\x00\x01\x00\x04\x8c\xa4\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15.\x00\x00\x00\x00\x00\x01\x00\x04\x94\xc1\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x09\x0a\x00\x00\x00\x00\x00\x01\x00\x04\xbdc\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\x80\x00\x00\x00\x00\x00\x01\x00\x04\x9eQ\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x05\x16\x00\x00\x00\x00\x00\x01\x00\x04\xa3\x97\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\xe6\x00\x00\x00\x00\x00\x01\x00\x04\xa8\xed\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\xdc\x00\x00\x00\x00\x00\x01\x00\x04\xbc\x16\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17J\x00\x00\x00\x00\x00\x01\x00\x04\xc4\xc0\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16:\x00\x00\x00\x00\x00\x01\x00\x04\xb0o\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16$\x00\x00\x00\x00\x00\x01\x00\x04\xad\x9b\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x07\xb6\x00\x00\x00\x00\x00\x01\x00\x04\xba\x99\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\x5c\x00\x00\x00\x00\x00\x01\x00\x04\xb2(\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d\x1a\x00\x00\x00\x00\x00\x01\x00\x00\xe8\x9c\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x11\x1a\x00\x00\x00\x00\x00\x01\x00\x01\x10\xca\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x08\x12\x00\x00\x00\x00\x00\x01\x00\x00\xb9\x0a\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x05\xda\x00\x00\x00\x00\x00\x01\x00\x00\xaa\x0f\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x026\x00\x00\x00\x00\x00\x01\x00\x00\x7f5\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x08\xae\x00\x00\x00\x00\x00\x01\x00\x00\xbe\xf7\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x10\xf6\x00\x00\x00\x00\x00\x01\x00\x01\x10e\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x03\x96\x00\x00\x00\x00\x00\x01\x00\x00\x8c\xaa\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x11@\x00\x00\x00\x00\x00\x01\x00\x01\x12R\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x07d\x00\x00\x00\x00\x00\x01\x00\x00\xb6W\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x13\xa6\x00\x00\x00\x00\x00\x01\x00\x01-L\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x01\xe4\x00\x00\x00\x00\x00\x01\x00\x00|\xc4\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x03p\x00\x00\x00\x00\x00\x01\x00\x00\x8c\x07\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x09\xfe\x00\x00\x00\x00\x00\x01\x00\x00\xce\xd3\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0c\x94\x00\x00\x00\x00\x00\x01\x00\x00\xb0\xcb\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0a\x98\x00\x00\x00\x00\x00\x01\x00\x00\xd3\xd7\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0b\x82\x00\x00\x00\x00\x00\x01\x00\x00\xdb\xe2\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0f\xb0\x00\x00\x00\x00\x00\x01\x00\x01\x01_\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x04\xdc\x00\x00\x00\x00\x00\x01\x00\x00\xa0\x13\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0a$\x00\x00\x00\x00\x00\x01\x00\x00\xcfv\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x04\xba\x00\x00\x00\x00\x00\x01\x00\x00\x9d\xc8\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x14\x16\x00\x00\x00\x00\x00\x01\x00\x011\x0c\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x07\xd4\x00\x00\x00\x00\x00\x01\x00\x00\xb8\x8d\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x12\xac\x00\x00\x00\x00\x00\x01\x00\x01 _\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x12@\x00\x00\x00\x00\x00\x01\x00\x01\x1c\xab\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x13z\x00\x00\x00\x00\x00\x01\x00\x01)\xba\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x10l\x00\x00\x00\x00\x00\x01\x00\x01\x0b\x12\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x02\x0e\x00\x00\x00\x00\x00\x01\x00\x00~\xc9\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x03P\x00\x00\x00\x00\x00\x01\x00\x00\x8b\x06\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0e\xf2\x00\x00\x00\x00\x00\x01\x00\x00\xfa\x22\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x03:\x00\x00\x00\x00\x00\x01\x00\x00\x8a\xa2\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x10\xa2\x00\x00\x00\x00\x00\x01\x00\x01\x0ce\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d0\x00\x00\x00\x00\x00\x01\x00\x00\xe99\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x09\xd2\x00\x00\x00\x00\x00\x01\x00\x00\xcbL\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0a\xc8\x00\x00\x00\x00\x00\x01\x00\x00\xd5\xd4\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x12\xec\x00\x00\x00\x00\x00\x01\x00\x01$\xfa\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x14\xa2\x00\x00\x00\x00\x00\x01\x00\x015\xb4\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x05P\x00\x00\x00\x00\x00\x01\x00\x00\xa4J\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0ax\x00\x00\x00\x00\x00\x01\x00\x00\xd2\x1a\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x02f\x00\x00\x00\x00\x00\x01\x00\x00\x81a\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x14t\x00\x00\x00\x00\x00\x01\x00\x014\xee\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0bZ\x00\x00\x00\x00\x00\x01\x00\x00\xd9\xe8\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x04\x8c\x00\x00\x00\x00\x00\x01\x00\x00\x96J\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d\x82\x00\x00\x00\x00\x00\x01\x00\x00\xeb\x84\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x12\x88\x00\x00\x00\x00\x00\x01\x00\x01\x1f\x91\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x08*\x00\x00\x00\x00\x00\x01\x00\x00\xb9\x8e\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0b\xdc\x00\x00\x00\x00\x00\x01\x00\x00\xdf)\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x06$\x00\x00\x00\x00\x00\x01\x00\x00\xab\x88\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x06\xda\x00\x00\x00\x00\x00\x01\x00\x00\xb0\xcb\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x10\xc6\x00\x00\x00\x00\x00\x01\x00\x01\x0er\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x11\xaa\x00\x00\x00\x00\x00\x01\x00\x01\x16\xba\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x07\x86\x00\x00\x00\x00\x00\x01\x00\x00\xb74\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x08\xdc\x00\x00\x00\x00\x00\x01\x00\x00\xc0\x8d\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x11\x90\x00\x00\x00\x00\x00\x01\x00\x01\x15\xd8\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x02\xda\x00\x00\x00\x00\x00\x01\x00\x00\x87_\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x06\x00\x00\x00\x00\x00\x00\x01\x00\x00\xaa\xc2\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0f\x1a\x00\x00\x00\x00\x00\x01\x00\x00\xfa\x8e\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x13Z\x00\x00\x00\x00\x00\x01\x00\x01'\xda\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x10H\x00\x00\x00\x00\x00\x01\x00\x01\x08\xe6\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x13\x18\x00\x00\x00\x00\x00\x01\x00\x01&\xeb\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0f\x98\x00\x00\x00\x00\x00\x01\x00\x00\xfd}\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0a\xfe\x00\x00\x00\x00\x00\x01\x00\x00\x87_\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x06\x9a\x00\x00\x00\x00\x00\x01\x00\x00\xae\xcd\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x03\xba\x00\x00\x00\x00\x00\x01\x00\x00\x8d\x0f\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x06\xbe\x00\x00\x00\x00\x00\x01\x00\x00\xb0o\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x06\xfc\x00\x00\x00\x00\x00\x01\x00\x00\xb2\xd8\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0c\xf4\x00\x00\x00\x00\x00\x01\x00\x00\xe7I\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x09 \x00\x00\x00\x00\x00\x01\x00\x00\xc3\x0f\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0f8\x00\x00\x00\x00\x00\x01\x00\x00\xfb\xaa\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x04b\x00\x00\x00\x00\x00\x01\x00\x00\x94\x94\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0e\xae\x00\x00\x00\x00\x00\x01\x00\x00\xf7l\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x13\xf2\x00\x00\x00\x00\x00\x01\x00\x01.\xf9\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0dV\x00\x00\x00\x00\x00\x01\x00\x00\xeb\x07\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x06Z\x00\x00\x00\x00\x00\x01\x00\x00\xad\xb6\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x05.\x00\x00\x00\x00\x00\x01\x00\x00\xa24\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0e\x14\x00\x00\x00\x00\x00\x01\x00\x00\xf1y\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x08X\x00\x00\x00\x00\x00\x01\x00\x00\xba\x82\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x042\x00\x00\x00\x00\x00\x01\x00\x00\x92\x87\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x09l\x00\x00\x00\x00\x00\x01\x00\x00\xc5\x8c\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x134\x00\x00\x00\x00\x00\x01\x00\x01'o\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x03\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x89d\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x10\x14\x00\x00\x00\x00\x00\x01\x00\x01\x06\x7f\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0c \x00\x00\x00\x00\x00\x01\x00\x00\xdf\xfa\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d\xd4\x00\x00\x00\x00\x00\x01\x00\x00\xee\xc4\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x07\x1a\x00\x00\x00\x00\x00\x01\x00\x00\xb3\x97\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x05\x96\x00\x00\x00\x00\x00\x01\x00\x00\xa8Y\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0b\x1c\x00\x00\x00\x00\x00\x01\x00\x00\xd7q\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x098\x00\x00\x00\x00\x00\x01\x00\x00\xc3l\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x08x\x00\x00\x00\x00\x00\x01\x00\x00\xbe=\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x12\xd0\x00\x00\x00\x00\x00\x01\x00\x01$A\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0b2\x00\x00\x00\x00\x00\x01\x00\x00\xd7\xc8\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d\xbe\x00\x00\x00\x00\x00\x01\x00\x00\xed\x91\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0c\xcc\x00\x00\x00\x00\x00\x01\x00\x00\xe2\xce\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x05\xc0\x00\x00\x00\x00\x00\x01\x00\x00\xa8\xf2\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x09\x0a\x00\x00\x00\x00\x00\x01\x00\x00\xc2\x9a\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x12\x1c\x00\x00\x00\x00\x00\x01\x00\x01\x1a\x0f\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x11\xe8\x00\x00\x00\x00\x00\x01\x00\x01\x17\xff\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0b\xb4\x00\x00\x00\x00\x00\x01\x00\x00\xdc\xb1\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x05\x16\x00\x00\x00\x00\x00\x01\x00\x00\xa1\xd0\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0e@\x00\x00\x00\x00\x00\x01\x00\x00\xf4\xaf\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x14F\x00\x00\x00\x00\x00\x01\x00\x012\xdd\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x02\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x87=\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x01\xc0\x00\x00\x00\x00\x00\x01\x00\x00z\xd1\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x12b\x00\x00\x00\x00\x00\x01\x00\x01\x1d\x92\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x11n\x00\x00\x00\x00\x00\x01\x00\x01\x15\x0f\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d\xee\x00\x00\x00\x00\x00\x01\x00\x00\xeft\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0aJ\x00\x00\x00\x00\x00\x01\x00\x00\xd0\xd5\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x13\xcc\x00\x00\x00\x00\x00\x01\x00\x01.\x09\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0ff\x00\x00\x00\x00\x00\x01\x00\x00\xfc\xc1\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0et\x00\x00\x00\x00\x00\x01\x00\x00\xf6\xbc\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x02\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x83[\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x07B\x00\x00\x00\x00\x00\x01\x00\x00\xb4G\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0e\xc6\x00\x00\x00\x00\x00\x01\x00\x00\xf8\x15\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x09\x9c\x00\x00\x00\x00\x00\x01\x00\x00\xc9G\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x04\x06\x00\x00\x00\x00\x00\x01\x00\x00\x8e\xcc\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0f\xde\x00\x00\x00\x00\x00\x01\x00\x01\x03o\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x05p\x00\x00\x00\x00\x00\x01\x00\x00\xa6\x8a\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0c\x02\x00\x00\x00\x00\x00\x01\x00\x00\xdf\x97\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x07\xb6\x00\x00\x00\x00\x00\x01\x00\x00\xb89\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0cd\x00\x00\x00\x00\x00\x01\x00\x00\xe0\xc9\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d\x1a\x00\x00\x00\x00\x00\x01\x00\x01Cn\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15L\x00\x00\x00\x00\x00\x01\x00\x01E\x96\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17\x88\x00\x00\x00\x00\x00\x01\x00\x01u\x04\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\x08\x00\x00\x00\x00\x00\x01\x00\x01\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x13\xf2\x00\x00\x00\x00\x00\x01\x00\x04\x83\xdc\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0dV\x00\x00\x00\x00\x00\x01\x00\x04D\xde\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x06Z\x00\x00\x00\x00\x00\x01\x00\x04\x0c4\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x05.\x00\x00\x00\x00\x00\x01\x00\x04\x00\xb2\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0e\x14\x00\x00\x00\x00\x00\x01\x00\x04IK\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x08X\x00\x00\x00\x00\x00\x01\x00\x00\xba\x82\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x042\x00\x00\x00\x00\x00\x01\x00\x03\xf1\x05\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x09l\x00\x00\x00\x00\x00\x01\x00\x04\x1fr\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x134\x00\x00\x00\x00\x00\x01\x00\x04|R\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x03\x0c\x00\x00\x00\x00\x00\x01\x00\x03\xe7\xe2\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x10\x14\x00\x00\x00\x00\x00\x01\x00\x04\x5cD\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0c \x00\x00\x00\x00\x00\x01\x00\x049\xd1\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d\xd4\x00\x00\x00\x00\x00\x01\x00\x04H\x9b\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x07\x1a\x00\x00\x00\x00\x00\x01\x00\x04\x12\x15\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x05\x96\x00\x00\x00\x00\x00\x01\x00\x04\x06\xd7\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0b\x1c\x00\x00\x00\x00\x00\x01\x00\x041H\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x098\x00\x00\x00\x00\x00\x01\x00\x04\x1dR\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x08x\x00\x00\x00\x00\x00\x01\x00\x04\x18#\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x12\xd0\x00\x00\x00\x00\x00\x01\x00\x04y$\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0b2\x00\x00\x00\x00\x00\x01\x00\x041\x9f\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d\xbe\x00\x00\x00\x00\x00\x01\x00\x04Gh\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0c\xcc\x00\x00\x00\x00\x00\x01\x00\x04<\xa5\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x05\xc0\x00\x00\x00\x00\x00\x01\x00\x04\x07p\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x09\x0a\x00\x00\x00\x00\x00\x01\x00\x04\x1c\x80\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x12\x1c\x00\x00\x00\x00\x00\x01\x00\x04n\xf2\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x11\xe8\x00\x00\x00\x00\x00\x01\x00\x04l\xe2\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0b\xb4\x00\x00\x00\x00\x00\x01\x00\x046\x88\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x05\x16\x00\x00\x00\x00\x00\x01\x00\x04\x00N\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0e@\x00\x00\x00\x00\x00\x01\x00\x04L\x81\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x14F\x00\x00\x00\x00\x00\x01\x00\x04\x87\xc0\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x02\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x87=\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x01\xc0\x00\x00\x00\x00\x00\x01\x00\x03\xd9q\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x12b\x00\x00\x00\x00\x00\x01\x00\x04ru\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x11n\x00\x00\x00\x00\x00\x01\x00\x04j\xd4\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d\xee\x00\x00\x00\x00\x00\x01\x00\x00\xeft\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0aJ\x00\x00\x00\x00\x00\x01\x00\x04*\xbb\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x13\xcc\x00\x00\x00\x00\x00\x01\x00\x04\x82\xec\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0ff\x00\x00\x00\x00\x00\x01\x00\x04R\x86\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0et\x00\x00\x00\x00\x00\x01\x00\x04N\x8e\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x02\x8e\x00\x00\x00\x00\x00\x01\x00\x03\xe1\xfb\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x07B\x00\x00\x00\x00\x00\x01\x00\x04\x12\xc5\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0e\xc6\x00\x00\x00\x00\x00\x01\x00\x00\xf8\x15\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x09\x9c\x00\x00\x00\x00\x00\x01\x00\x04#-\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x04\x06\x00\x00\x00\x00\x00\x01\x00\x03\xedJ\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0f\xde\x00\x00\x00\x00\x00\x01\x00\x04Y4\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x05p\x00\x00\x00\x00\x00\x01\x00\x04\x05\x08\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0c\x02\x00\x00\x00\x00\x00\x01\x00\x049n\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x07\xb6\x00\x00\x00\x00\x00\x01\x00\x04\x15\xda\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0cd\x00\x00\x00\x00\x00\x01\x00\x04:\xa0\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d\x1a\x00\x00\x00\x00\x00\x01\x00\x02J\x8e\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15L\x00\x00\x00\x00\x00\x01\x00\x02Qx\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17\x88\x00\x00\x00\x00\x00\x01\x00\x03\x1ar\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\x08\x00\x00\x00\x00\x00\x01\x00\x02/L\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\x80\x00\x00\x00\x00\x00\x01\x00\x02\xbe\xe9\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x03:\x00\x00\x00\x00\x00\x01\x00\x02C\x0e\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\xc0\x00\x00\x00\x00\x00\x01\x00\x02\x89\xd2\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17\x00\x00\x00\x00\x00\x00\x01\x00\x02\xe9\xed\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\x9c\x00\x00\x00\x00\x00\x01\x00\x02p\xaa\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x172\x00\x00\x00\x00\x00\x01\x00\x02\xfb\xd8\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17n\x00\x00\x00\x00\x00\x01\x00\x03\x0b\xe9\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x14\xf2\x00\x00\x00\x00\x00\x01\x00\x02(q\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17 \x00\x00\x00\x00\x00\x01\x00\x02\xf4j\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\xc8\x00\x00\x00\x00\x00\x01\x00\x02\xd3\x87\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15n\x00\x00\x00\x00\x00\x01\x00\x02Zx\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\x06\x00\x00\x00\x00\x00\x01\x00\x02\x98\x05\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0e\xae\x00\x00\x00\x00\x00\x01\x00\x02\x82~\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\xa6\x00\x00\x00\x00\x00\x01\x00\x02\xc2\xa6\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d\xd4\x00\x00\x00\x00\x00\x01\x00\x02i \ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0b\x1c\x00\x00\x00\x00\x00\x01\x00\x03\x13\x89\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x14\xd8\x00\x00\x00\x00\x00\x01\x00\x02!Z\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15.\x00\x00\x00\x00\x00\x01\x00\x029Z\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x09\x0a\x00\x00\x00\x00\x00\x01\x00\x02\xe3\x05\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\x80\x00\x00\x00\x00\x00\x01\x00\x02a\xac\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x05\x16\x00\x00\x00\x00\x00\x01\x00\x02z\xd2\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\xe6\x00\x00\x00\x00\x00\x01\x00\x02\x95\x9d\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\xdc\x00\x00\x00\x00\x00\x01\x00\x02\xdam\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17J\x00\x00\x00\x00\x00\x01\x00\x03\x03\xe3\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16:\x00\x00\x00\x00\x00\x01\x00\x02\xa9\xce\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16$\x00\x00\x00\x00\x00\x01\x00\x02\xa29\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x07\xb6\x00\x00\x00\x00\x00\x01\x00\x02\xcbD\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\x5c\x00\x00\x00\x00\x00\x01\x00\x02\xb3\xa8\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d\x1a\x00\x00\x00\x00\x00\x01\x00\x01\x92\x0d\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15L\x00\x00\x00\x00\x00\x01\x00\x01\x93\xce\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17\x88\x00\x00\x00\x00\x00\x01\x00\x02\x1f7\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\x08\x00\x00\x00\x00\x00\x01\x00\x01{\xe3\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\x80\x00\x00\x00\x00\x00\x01\x00\x01\xed\x0a\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x03:\x00\x00\x00\x00\x00\x01\x00\x01\x8f\xbb\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\xc0\x00\x00\x00\x00\x00\x01\x00\x01\xbc\xc4\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17\x00\x00\x00\x00\x00\x00\x01\x00\x02\x03\x8a\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\x9c\x00\x00\x00\x00\x00\x01\x00\x01\xa8\xa8\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x172\x00\x00\x00\x00\x00\x01\x00\x02\x10]\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17n\x00\x00\x00\x00\x00\x01\x00\x02\x15\xb7\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x14\xf2\x00\x00\x00\x00\x00\x01\x00\x01z1\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17 \x00\x00\x00\x00\x00\x01\x00\x02\x0e\x1b\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\xc8\x00\x00\x00\x00\x00\x01\x00\x01\xfcz\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15n\x00\x00\x00\x00\x00\x01\x00\x01\x9c\xcd\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\x06\x00\x00\x00\x00\x00\x01\x00\x01\xca\xf7\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0e\xae\x00\x00\x00\x00\x00\x01\x00\x01\xb5a\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\xa6\x00\x00\x00\x00\x00\x01\x00\x01\xf0\xc7\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0d\xd4\x00\x00\x00\x00\x00\x01\x00\x01\xa6I\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x0b\x1c\x00\x00\x00\x00\x00\x01\x00\x02\x1du\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x14\xd8\x00\x00\x00\x00\x00\x01\x00\x01xL\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15.\x00\x00\x00\x00\x00\x01\x00\x01\x85\xff\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x09\x0a\x00\x00\x00\x00\x00\x01\x00\x02\x01\xa0\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\x80\x00\x00\x00\x00\x00\x01\x00\x01\x9e\xd5\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x05\x16\x00\x00\x00\x00\x00\x01\x00\x01\xb2\xe4\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x15\xe6\x00\x00\x00\x00\x00\x01\x00\x01\xc8\x8f\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\xdc\x00\x00\x00\x00\x00\x01\x00\x01\xfe7\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x17J\x00\x00\x00\x00\x00\x01\x00\x02\x12\xdb\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16:\x00\x00\x00\x00\x00\x01\x00\x01\xd7\xc8\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16$\x00\x00\x00\x00\x00\x01\x00\x01\xd5C\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x07\xb6\x00\x00\x00\x00\x00\x01\x00\x01\xf47\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ \x00\x00\x16\x5c\x00\x00\x00\x00\x00\x01\x00\x01\xe1\xba\ \x00\x00\x01\x97\xfa\x81\xe7\xf8\ " def qInitResources(): QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) def qCleanupResources(): QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) qInitResources() ================================================ FILE: persepolis/gui/setting_ui.py ================================================ # -*- coding: utf-8 -*- # 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 . try: from PySide6.QtWidgets import QAbstractItemView, QTableWidget, QTableWidgetItem, QCheckBox, QVBoxLayout, QHBoxLayout, QFrame, QWidget, QLabel, QLineEdit, QTabWidget, QSpinBox, QPushButton, QDial, QComboBox, QFontComboBox from PySide6.QtCore import Qt, QTranslator, QCoreApplication, QLocale from PySide6.QtGui import QIcon except ImportError: from PyQt5.QtWidgets import QAbstractItemView, QTableWidget, QTableWidgetItem, QCheckBox, QVBoxLayout, QHBoxLayout, QFrame, QWidget, QLabel, QLineEdit, QTabWidget, QSpinBox, QPushButton, QDial, QComboBox, QFontComboBox from PyQt5.QtCore import Qt, QTranslator, QCoreApplication, QLocale from PyQt5.QtGui import QIcon from persepolis.gui.customized_widgets import MyQDateTimeEdit from persepolis.gui import resources class KeyCapturingWindow_Ui(QWidget): def __init__(self, persepolis_setting): super().__init__() self.persepolis_setting = persepolis_setting # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) self.setWindowIcon(QIcon.fromTheme('persepolis', QIcon(':/com.github.persepolisdm.persepolis.svg'))) self.setWindowTitle(QCoreApplication.translate("setting_ui_tr", 'Preferences')) # set ui direction ui_direction = self.persepolis_setting.value('ui_direction') if ui_direction == 'rtl': self.setLayoutDirection(Qt.RightToLeft) elif ui_direction in 'ltr': self.setLayoutDirection(Qt.LeftToRight) global icons icons = ':/' + str(self.persepolis_setting.value('settings/icons')) + '/' window_verticalLayout = QVBoxLayout(self) self.pressKeyLabel = QLabel(self) window_verticalLayout.addWidget(self.pressKeyLabel) self.capturedKeyLabel = QLabel(self) window_verticalLayout.addWidget(self.capturedKeyLabel) # window buttons buttons_horizontalLayout = QHBoxLayout() buttons_horizontalLayout.addStretch(1) self.cancel_pushButton = QPushButton(self) self.cancel_pushButton.setIcon(QIcon(icons + 'remove')) buttons_horizontalLayout.addWidget(self.cancel_pushButton) self.ok_pushButton = QPushButton(self) self.ok_pushButton.setIcon(QIcon(icons + 'ok')) buttons_horizontalLayout.addWidget(self.ok_pushButton) window_verticalLayout.addLayout(buttons_horizontalLayout) # labels self.pressKeyLabel.setText(QCoreApplication.translate("setting_ui_tr", "Press new keys")) self.cancel_pushButton.setText(QCoreApplication.translate("setting_ui_tr", "Cancel")) self.ok_pushButton.setText(QCoreApplication.translate("setting_ui_tr", "OK")) class Setting_Ui(QWidget): def __init__(self, persepolis_setting): super().__init__() self.persepolis_setting = persepolis_setting # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) self.setWindowIcon(QIcon.fromTheme('persepolis', QIcon(':/com.github.persepolisdm.persepolis.svg'))) self.setWindowTitle(QCoreApplication.translate("setting_ui_tr", 'Preferences')) # set ui direction ui_direction = self.persepolis_setting.value('ui_direction') if ui_direction == 'rtl': self.setLayoutDirection(Qt.RightToLeft) elif ui_direction in 'ltr': self.setLayoutDirection(Qt.LeftToRight) global icons icons = ':/' + str(self.persepolis_setting.value('settings/icons')) + '/' # main layout window_verticalLayout = QVBoxLayout(self) # setting_tabWidget self.setting_tabWidget = QTabWidget(self) # download_options_tab self.download_options_tab = QWidget() download_options_tab_verticalLayout = QVBoxLayout(self.download_options_tab) download_options_tab_verticalLayout.setContentsMargins(21, 21, 0, 0) # tries tries_horizontalLayout = QHBoxLayout() self.tries_label = QLabel(self.download_options_tab) tries_horizontalLayout.addWidget(self.tries_label) self.tries_spinBox = QSpinBox(self.download_options_tab) self.tries_spinBox.setMinimum(1) tries_horizontalLayout.addWidget(self.tries_spinBox) download_options_tab_verticalLayout.addLayout(tries_horizontalLayout) # wait wait_horizontalLayout = QHBoxLayout() self.wait_label = QLabel(self.download_options_tab) wait_horizontalLayout.addWidget(self.wait_label) self.wait_spinBox = QSpinBox(self.download_options_tab) wait_horizontalLayout.addWidget(self.wait_spinBox) download_options_tab_verticalLayout.addLayout(wait_horizontalLayout) # time_out time_out_horizontalLayout = QHBoxLayout() self.time_out_label = QLabel(self.download_options_tab) time_out_horizontalLayout.addWidget(self.time_out_label) self.time_out_spinBox = QSpinBox(self.download_options_tab) self.time_out_spinBox.setMinimum(1) time_out_horizontalLayout.addWidget(self.time_out_spinBox) download_options_tab_verticalLayout.addLayout(time_out_horizontalLayout) # connections connections_horizontalLayout = QHBoxLayout() self.connections_label = QLabel(self.download_options_tab) connections_horizontalLayout.addWidget(self.connections_label) self.connections_spinBox = QSpinBox(self.download_options_tab) self.connections_spinBox.setMinimum(1) self.connections_spinBox.setMaximum(64) connections_horizontalLayout.addWidget(self.connections_spinBox) download_options_tab_verticalLayout.addLayout(connections_horizontalLayout) # chunk_size chunk_size_horizontalLayout = QHBoxLayout() self.chunk_size_label = QLabel(self.download_options_tab) chunk_size_horizontalLayout.addWidget(self.chunk_size_label) self.chunk_size_spinBox = QSpinBox(self.download_options_tab) self.chunk_size_spinBox.setMinimum(1) self.chunk_size_spinBox.setMaximum(1024) chunk_size_horizontalLayout.addWidget(self.chunk_size_spinBox) download_options_tab_verticalLayout.addLayout(chunk_size_horizontalLayout) # wait_queue wait_queue_horizontalLayout = QHBoxLayout() self.wait_queue_label = QLabel(self.download_options_tab) wait_queue_horizontalLayout.addWidget(self.wait_queue_label) self.wait_queue_time = MyQDateTimeEdit(self.download_options_tab) self.wait_queue_time.setDisplayFormat('H:mm') wait_queue_horizontalLayout.addWidget(self.wait_queue_time) download_options_tab_verticalLayout.addLayout( wait_queue_horizontalLayout) # don't check certificate checkBox self.dont_check_certificate_checkBox = QCheckBox(self.download_options_tab) download_options_tab_verticalLayout.addWidget(self.dont_check_certificate_checkBox) download_options_tab_verticalLayout.addStretch(1) self.setting_tabWidget.addTab(self.download_options_tab, "") # save_as_tab self.save_as_tab = QWidget() save_as_tab_verticalLayout = QVBoxLayout(self.save_as_tab) save_as_tab_verticalLayout.setContentsMargins(20, 30, 0, 0) # download_folder self.download_folder_horizontalLayout = QHBoxLayout() self.download_folder_label = QLabel(self.save_as_tab) self.download_folder_horizontalLayout.addWidget( self.download_folder_label) self.download_folder_lineEdit = QLineEdit(self.save_as_tab) self.download_folder_horizontalLayout.addWidget(self.download_folder_lineEdit) self.download_folder_pushButton = QPushButton(self.save_as_tab) self.download_folder_horizontalLayout.addWidget(self.download_folder_pushButton) save_as_tab_verticalLayout.addLayout(self.download_folder_horizontalLayout) # create subfolder self.subfolder_checkBox = QCheckBox(self.save_as_tab) save_as_tab_verticalLayout.addWidget(self.subfolder_checkBox) save_as_tab_verticalLayout.addStretch(1) self.setting_tabWidget.addTab(self.save_as_tab, "") # notifications_tab self.notifications_tab = QWidget() notification_tab_verticalLayout = QVBoxLayout(self.notifications_tab) notification_tab_verticalLayout.setContentsMargins(21, 21, 0, 0) self.enable_notifications_checkBox = QCheckBox(self.notifications_tab) notification_tab_verticalLayout.addWidget(self.enable_notifications_checkBox) self.sound_frame = QFrame(self.notifications_tab) self.sound_frame.setFrameShape(QFrame.StyledPanel) self.sound_frame.setFrameShadow(QFrame.Raised) verticalLayout = QVBoxLayout(self.sound_frame) self.volume_label = QLabel(self.sound_frame) verticalLayout.addWidget(self.volume_label) self.volume_dial = QDial(self.sound_frame) self.volume_dial.setProperty("value", 100) verticalLayout.addWidget(self.volume_dial) notification_tab_verticalLayout.addWidget(self.sound_frame) # message_notification message_notification_horizontalLayout = QHBoxLayout() self.notification_label = QLabel(self.notifications_tab) message_notification_horizontalLayout.addWidget(self.notification_label) self.notification_comboBox = QComboBox(self.notifications_tab) message_notification_horizontalLayout.addWidget(self.notification_comboBox) notification_tab_verticalLayout.addLayout(message_notification_horizontalLayout) notification_tab_verticalLayout.addStretch(1) self.setting_tabWidget.addTab(self.notifications_tab, "") # style_tab self.style_tab = QWidget() style_tab_verticalLayout = QVBoxLayout(self.style_tab) style_tab_verticalLayout.setContentsMargins(21, 21, 0, 0) # style style_horizontalLayout = QHBoxLayout() self.style_label = QLabel(self.style_tab) style_horizontalLayout.addWidget(self.style_label) self.style_comboBox = QComboBox(self.style_tab) style_horizontalLayout.addWidget(self.style_comboBox) style_tab_verticalLayout.addLayout(style_horizontalLayout) # language language_horizontalLayout = QHBoxLayout() self.lang_label = QLabel(self.style_tab) language_horizontalLayout.addWidget(self.lang_label) self.lang_comboBox = QComboBox(self.style_tab) language_horizontalLayout.addWidget(self.lang_comboBox) style_tab_verticalLayout.addLayout(language_horizontalLayout) language_horizontalLayout = QHBoxLayout() self.lang_label.setText(QCoreApplication.translate("setting_ui_tr", "Language: ")) # color scheme self.color_label = QLabel(self.style_tab) language_horizontalLayout.addWidget(self.color_label) self.color_comboBox = QComboBox(self.style_tab) language_horizontalLayout.addWidget(self.color_comboBox) style_tab_verticalLayout.addLayout(language_horizontalLayout) # icons icons_horizontalLayout = QHBoxLayout() self.icon_label = QLabel(self.style_tab) icons_horizontalLayout.addWidget(self.icon_label) self.icon_comboBox = QComboBox(self.style_tab) icons_horizontalLayout.addWidget(self.icon_comboBox) style_tab_verticalLayout.addLayout(icons_horizontalLayout) self.icons_size_horizontalLayout = QHBoxLayout() self.icons_size_label = QLabel(self.style_tab) self.icons_size_horizontalLayout.addWidget(self.icons_size_label) self.icons_size_comboBox = QComboBox(self.style_tab) self.icons_size_horizontalLayout.addWidget(self.icons_size_comboBox) style_tab_verticalLayout.addLayout(self.icons_size_horizontalLayout) # font font_horizontalLayout = QHBoxLayout() self.font_checkBox = QCheckBox(self.style_tab) font_horizontalLayout.addWidget(self.font_checkBox) self.fontComboBox = QFontComboBox(self.style_tab) font_horizontalLayout.addWidget(self.fontComboBox) self.font_size_label = QLabel(self.style_tab) font_horizontalLayout.addWidget(self.font_size_label) self.font_size_spinBox = QSpinBox(self.style_tab) self.font_size_spinBox.setMinimum(1) font_horizontalLayout.addWidget(self.font_size_spinBox) style_tab_verticalLayout.addLayout(font_horizontalLayout) self.setting_tabWidget.addTab(self.style_tab, "") window_verticalLayout.addWidget(self.setting_tabWidget) # start persepolis in system tray if browser executed self.start_persepolis_if_browser_executed_checkBox = QCheckBox(self.style_tab) style_tab_verticalLayout.addWidget(self.start_persepolis_if_browser_executed_checkBox) # hide window if close button clicked self.hide_window_checkBox = QCheckBox(self.style_tab) style_tab_verticalLayout.addWidget(self.hide_window_checkBox) # Enable system tray icon self.enable_system_tray_checkBox = QCheckBox(self.style_tab) style_tab_verticalLayout.addWidget(self.enable_system_tray_checkBox) # after_download dialog self.after_download_checkBox = QCheckBox() style_tab_verticalLayout.addWidget(self.after_download_checkBox) # show_menubar_checkbox self.show_menubar_checkbox = QCheckBox() style_tab_verticalLayout.addWidget(self.show_menubar_checkbox) # show_sidepanel_checkbox self.show_sidepanel_checkbox = QCheckBox() style_tab_verticalLayout.addWidget(self.show_sidepanel_checkbox) # hide progress window self.show_progress_window_checkbox = QCheckBox() style_tab_verticalLayout.addWidget(self.show_progress_window_checkbox) # add persepolis to startup self.startup_checkbox = QCheckBox() style_tab_verticalLayout.addWidget(self.startup_checkbox) # keep system awake self.keep_awake_checkBox = QCheckBox() style_tab_verticalLayout.addWidget(self.keep_awake_checkBox) # check clipboard self.check_clipboard_checkBox = QCheckBox() style_tab_verticalLayout.addWidget(self.check_clipboard_checkBox) # Don't show the add link window when the download request is # sent by the browser extension. self.dont_show_add_link_window_checkBox = QCheckBox() style_tab_verticalLayout.addWidget(self.dont_show_add_link_window_checkBox) style_tab_verticalLayout.addStretch(1) # browser_integration_tab self.browser_integration_tab = QWidget() browser_integration_layout = QVBoxLayout(self.browser_integration_tab) # Checkboxes for known browsers self.browser_checkboxes = { "firefox": QCheckBox(), "brave": QCheckBox(), "librewolf": QCheckBox(), "chrome": QCheckBox(), "chromium": QCheckBox(), "opera": QCheckBox(), "vivaldi": QCheckBox() } for checkbox in self.browser_checkboxes.values(): browser_integration_layout.addWidget(checkbox) browser_integration_layout.addStretch(1) self.setting_tabWidget.addTab( self.browser_integration_tab, QCoreApplication.translate("setting_ui_tr", "Browser Integration") ) # columns_tab self.columns_tab = QWidget() columns_tab_verticalLayout = QVBoxLayout(self.columns_tab) columns_tab_verticalLayout.setContentsMargins(21, 21, 0, 0) # creating checkBox for columns self.show_column_label = QLabel() self.column0_checkBox = QCheckBox() self.column1_checkBox = QCheckBox() self.column2_checkBox = QCheckBox() self.column3_checkBox = QCheckBox() self.column4_checkBox = QCheckBox() self.column5_checkBox = QCheckBox() self.column6_checkBox = QCheckBox() self.column7_checkBox = QCheckBox() self.column10_checkBox = QCheckBox() self.column11_checkBox = QCheckBox() self.column12_checkBox = QCheckBox() columns_tab_verticalLayout.addWidget(self.show_column_label) columns_tab_verticalLayout.addWidget(self.column0_checkBox) columns_tab_verticalLayout.addWidget(self.column1_checkBox) columns_tab_verticalLayout.addWidget(self.column2_checkBox) columns_tab_verticalLayout.addWidget(self.column3_checkBox) columns_tab_verticalLayout.addWidget(self.column4_checkBox) columns_tab_verticalLayout.addWidget(self.column5_checkBox) columns_tab_verticalLayout.addWidget(self.column6_checkBox) columns_tab_verticalLayout.addWidget(self.column7_checkBox) columns_tab_verticalLayout.addWidget(self.column10_checkBox) columns_tab_verticalLayout.addWidget(self.column11_checkBox) columns_tab_verticalLayout.addWidget(self.column12_checkBox) columns_tab_verticalLayout.addStretch(1) self.setting_tabWidget.addTab(self.columns_tab, '') # video_finder_tab self.video_finder_tab = QWidget() video_finder_layout = QVBoxLayout(self.video_finder_tab) video_finder_layout.setContentsMargins(21, 21, 0, 0) video_finder_tab_verticalLayout = QVBoxLayout() max_links_horizontalLayout = QHBoxLayout() # max_links_label self.max_links_label = QLabel(self.video_finder_tab) max_links_horizontalLayout.addWidget(self.max_links_label) # max_links_spinBox self.max_links_spinBox = QSpinBox(self.video_finder_tab) self.max_links_spinBox.setMinimum(1) self.max_links_spinBox.setMaximum(16) max_links_horizontalLayout.addWidget(self.max_links_spinBox) video_finder_tab_verticalLayout.addLayout(max_links_horizontalLayout) self.video_finder_dl_path_horizontalLayout = QHBoxLayout() self.video_finder_frame = QFrame(self.video_finder_tab) self.video_finder_frame.setLayout(video_finder_tab_verticalLayout) video_finder_tab_verticalLayout.addStretch(1) video_finder_layout.addWidget(self.video_finder_frame) self.setting_tabWidget.addTab(self.video_finder_tab, "") # shortcut tab self.shortcut_tab = QWidget() shortcut_tab_verticalLayout = QVBoxLayout(self.shortcut_tab) shortcut_tab_verticalLayout.setContentsMargins(21, 21, 0, 0) # shortcut_table self.shortcut_table = QTableWidget(self) self.shortcut_table.setColumnCount(2) self.shortcut_table.setSelectionBehavior(QAbstractItemView.SelectRows) self.shortcut_table.setSelectionMode(QAbstractItemView.SingleSelection) self.shortcut_table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.shortcut_table.verticalHeader().hide() shortcut_table_header = [QCoreApplication.translate("setting_ui_tr", 'Action'), QCoreApplication.translate("setting_ui_tr", 'Shortcut')] self.shortcut_table.setHorizontalHeaderLabels(shortcut_table_header) shortcut_tab_verticalLayout.addWidget(self.shortcut_table) self.setting_tabWidget.addTab(self.shortcut_tab, QCoreApplication.translate("setting_ui_tr", "Shortcuts")) # Actions actions_list = [QCoreApplication.translate('setting_ui_tr', 'Quit'), QCoreApplication.translate('setting_ui_tr', 'Minimize to System Tray'), QCoreApplication.translate('setting_ui_tr', 'Remove Download Items'), QCoreApplication.translate('setting_ui_tr', 'Delete Download Items'), QCoreApplication.translate('setting_ui_tr', 'Move Selected Items Up'), QCoreApplication.translate('setting_ui_tr', 'Move Selected Items Down'), QCoreApplication.translate('setting_ui_tr', 'Add New Download Link'), QCoreApplication.translate('setting_ui_tr', 'Add New Video Link'), QCoreApplication.translate('setting_ui_tr', 'Import Links from Text File')] # add actions to the shortcut_table j = 0 for action in actions_list: item = QTableWidgetItem(str(action)) # align center item.setTextAlignment(0x0004 | 0x0080) # insert item in shortcut_table self.shortcut_table.insertRow(j) self.shortcut_table.setItem(j, 0, item) j = j + 1 self.shortcut_table.resizeColumnsToContents() # window buttons buttons_horizontalLayout = QHBoxLayout() buttons_horizontalLayout.addStretch(1) self.defaults_pushButton = QPushButton(self) buttons_horizontalLayout.addWidget(self.defaults_pushButton) self.cancel_pushButton = QPushButton(self) self.cancel_pushButton.setIcon(QIcon(icons + 'remove')) buttons_horizontalLayout.addWidget(self.cancel_pushButton) self.ok_pushButton = QPushButton(self) self.ok_pushButton.setIcon(QIcon(icons + 'ok')) buttons_horizontalLayout.addWidget(self.ok_pushButton) window_verticalLayout.addLayout(buttons_horizontalLayout) # set style_tab for default self.setting_tabWidget.setCurrentIndex(3) # labels and translations self.setWindowTitle(QCoreApplication.translate("setting_ui_tr", "Preferences")) self.tries_label.setToolTip( QCoreApplication.translate("setting_ui_tr", "

Set number of retries if download failed.

")) self.tries_label.setText(QCoreApplication.translate("setting_ui_tr", "Number of tries: ")) self.tries_spinBox.setToolTip( QCoreApplication.translate("setting_ui_tr", "

Set number of retries if download failed.

")) self.wait_label.setToolTip( QCoreApplication.translate("setting_ui_tr", "

Set the seconds to wait between retries.

")) self.wait_label.setText(QCoreApplication.translate("setting_ui_tr", "Wait period between retries (seconds): ")) self.wait_spinBox.setToolTip( QCoreApplication.translate("setting_ui_tr", "

Set the seconds to wait between retries.

")) self.time_out_label.setToolTip( QCoreApplication.translate("setting_ui_tr", "

Set timeout in seconds.

")) self.time_out_label.setText(QCoreApplication.translate("setting_ui_tr", "Timeout (seconds): ")) self.time_out_spinBox.setToolTip( QCoreApplication.translate("setting_ui_tr", "

Set timeout in seconds.

")) self.connections_label.setToolTip( QCoreApplication.translate("setting_ui_tr", "

Using multiple connections can help speed up your download.

")) self.connections_label.setText(QCoreApplication.translate("setting_ui_tr", "Number of connections: ")) self.connections_spinBox.setToolTip( QCoreApplication.translate("setting_ui_tr", "

Using multiple connections can help speed up your download.

")) self.chunk_size_label.setText(QCoreApplication.translate("setting_ui_tr", "Chunk size(KiB): ")) self.chunk_size_label.setToolTip( QCoreApplication.translate("setting_ui_tr", "It is python requests library chunk size. Do not change this If you are not familiar with it.")) self.wait_queue_label.setText(QCoreApplication.translate( "setting_ui_tr", 'Wait period between each download in queue:')) self.dont_check_certificate_checkBox.setText(QCoreApplication.translate("setting_ui_tr", "Don't use certificate to verify the peers")) self.dont_check_certificate_checkBox.setToolTip( QCoreApplication.translate("setting_ui_tr", "

This option avoids SSL/TLS handshake failure. But use it at your own risk!

")) self.setting_tabWidget.setTabText(self.setting_tabWidget.indexOf( self.download_options_tab), QCoreApplication.translate("setting_ui_tr", "Download Options")) self.download_folder_label.setText(QCoreApplication.translate("setting_ui_tr", "Download folder: ")) self.download_folder_pushButton.setText(QCoreApplication.translate("setting_ui_tr", "Change")) self.subfolder_checkBox.setText(QCoreApplication.translate( "setting_ui_tr", "Create subfolders for Music,Videos, ... in default download folder")) self.setting_tabWidget.setTabText( self.setting_tabWidget.indexOf(self.save_as_tab), QCoreApplication.translate("setting_ui_tr", "Save As")) self.enable_notifications_checkBox.setText( QCoreApplication.translate("setting_ui_tr", "Enable Notification Sounds")) self.volume_label.setText(QCoreApplication.translate("setting_ui_tr", "Volume: ")) self.setting_tabWidget.setTabText(self.setting_tabWidget.indexOf( self.notifications_tab), QCoreApplication.translate("setting_ui_tr", "Notifications")) self.style_label.setText(QCoreApplication.translate("setting_ui_tr", "Style: ")) self.color_label.setText(QCoreApplication.translate("setting_ui_tr", "Color scheme: ")) self.icon_label.setText(QCoreApplication.translate("setting_ui_tr", "Icons: ")) self.icons_size_label.setText(QCoreApplication.translate("setting_ui_tr", "Toolbar icons size: ")) self.notification_label.setText(QCoreApplication.translate("setting_ui_tr", "Notification type: ")) self.font_checkBox.setText(QCoreApplication.translate("setting_ui_tr", "Font: ")) self.font_size_label.setText(QCoreApplication.translate("setting_ui_tr", "Size: ")) self.hide_window_checkBox.setText(QCoreApplication.translate( "setting_ui_tr", "Hide main window if close button clicked.")) self.hide_window_checkBox.setToolTip( QCoreApplication.translate("setting_ui_tr", "

This feature may not work in your operating system.

")) self.start_persepolis_if_browser_executed_checkBox.setText( QCoreApplication.translate('setting_ui_tr', 'If browser is opened, start Persepolis in system tray')) self.enable_system_tray_checkBox.setText( QCoreApplication.translate("setting_ui_tr", "Enable system tray icon")) self.after_download_checkBox.setText( QCoreApplication.translate("setting_ui_tr", "Show download complete dialog when download is finished")) self.show_menubar_checkbox.setText(QCoreApplication.translate("setting_ui_tr", "Show menubar")) self.show_sidepanel_checkbox.setText(QCoreApplication.translate("setting_ui_tr", "Show side panel")) self.show_progress_window_checkbox.setText( QCoreApplication.translate("setting_ui_tr", "Show download progress window")) self.startup_checkbox.setText(QCoreApplication.translate("setting_ui_tr", "Run Persepolis at startup")) self.keep_awake_checkBox.setText(QCoreApplication.translate("setting_ui_tr", "Keep system awake!")) self.keep_awake_checkBox.setToolTip( QCoreApplication.translate("setting_ui_tr", "

This option will prevent the system from going to sleep.\ It is necessary if your power manager is suspending the system automatically.

")) self.check_clipboard_checkBox.setText(QCoreApplication.translate("setting_ui_tr", "Check system clipboard for copied links")) self.check_clipboard_checkBox.setToolTip( QCoreApplication.translate("setting_ui_tr", "

The program will automatically check the clipboard for copied links.\

")) self.dont_show_add_link_window_checkBox.setText(QCoreApplication.translate("setting_ui_tr", "Download requests from the browser will be executed immediately.")) self.dont_show_add_link_window_checkBox.setToolTip( QCoreApplication.translate("setting_ui_tr", "

When a download request is sent from the browser extension, the download will start without showing the Add Link window.\

")) self.wait_queue_time.setToolTip( QCoreApplication.translate("setting_ui_tr", "

Format HH:MM

")) self.setting_tabWidget.setTabText( self.setting_tabWidget.indexOf(self.style_tab), QCoreApplication.translate("setting_ui_tr", "Preferences")) # columns_tab self.show_column_label.setText(QCoreApplication.translate("setting_ui_tr", 'Show these columns:')) self.column0_checkBox.setText(QCoreApplication.translate("setting_ui_tr", 'File Name')) self.column1_checkBox.setText(QCoreApplication.translate("setting_ui_tr", 'Status')) self.column2_checkBox.setText(QCoreApplication.translate("setting_ui_tr", 'Size')) self.column3_checkBox.setText(QCoreApplication.translate("setting_ui_tr", 'Downloaded')) self.column4_checkBox.setText(QCoreApplication.translate("setting_ui_tr", 'Percentage')) self.column5_checkBox.setText(QCoreApplication.translate("setting_ui_tr", 'Connections')) self.column6_checkBox.setText(QCoreApplication.translate("setting_ui_tr", 'Transfer Rate')) self.column7_checkBox.setText(QCoreApplication.translate("setting_ui_tr", 'Estimated Time Left')) self.column10_checkBox.setText(QCoreApplication.translate("setting_ui_tr", 'First Try Date')) self.column11_checkBox.setText(QCoreApplication.translate("setting_ui_tr", 'Last Try Date')) self.column12_checkBox.setText(QCoreApplication.translate("setting_ui_tr", 'Category')) self.setting_tabWidget.setTabText( self.setting_tabWidget.indexOf(self.columns_tab), QCoreApplication.translate("setting_ui_tr", "Columns Customization")) # Video Finder options tab self.setting_tabWidget.setTabText(self.setting_tabWidget.indexOf( self.video_finder_tab), QCoreApplication.translate("setting_ui_tr", "Video Finder Options")) self.max_links_label.setText(QCoreApplication.translate("setting_ui_tr", 'Maximum number of links to capture:
' '(If browser sends multiple video links at a time)')) # browser_integration_tab for key, checkbox in self.browser_checkboxes.items(): checkbox.setText(QCoreApplication.translate("setting_ui_tr", key.capitalize())) # window buttons self.defaults_pushButton.setText(QCoreApplication.translate("setting_ui_tr", "Defaults")) self.cancel_pushButton.setText(QCoreApplication.translate("setting_ui_tr", "Cancel")) self.ok_pushButton.setText(QCoreApplication.translate("setting_ui_tr", "OK")) ================================================ FILE: persepolis/gui/text_queue_ui.py ================================================ # -*- coding: utf-8 -*- # 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 . try: from PySide6.QtWidgets import QHeaderView, QPushButton, QWidget, QTabWidget, QVBoxLayout, QTableWidget, QAbstractItemView, QLabel, QLineEdit, QHBoxLayout, QSpinBox, QComboBox, QFrame, QCheckBox, QGridLayout, QRadioButton from PySide6.QtCore import Qt, QTranslator, QCoreApplication, QLocale from PySide6.QtGui import QIcon except ImportError: from PyQt5.QtWidgets import QHeaderView, QPushButton, QWidget, QTabWidget, QVBoxLayout, QTableWidget, QAbstractItemView, QLabel, QLineEdit, QHBoxLayout, QSpinBox, QComboBox, QFrame, QCheckBox, QGridLayout, QRadioButton from PyQt5.QtCore import Qt, QTranslator, QCoreApplication, QLocale from PyQt5.QtGui import QIcon from persepolis.gui import resources class TextQueue_Ui(QWidget): def __init__(self, persepolis_setting): super().__init__() self.persepolis_setting = persepolis_setting icons = ':/' + \ str(self.persepolis_setting.value('settings/icons')) + '/' # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) # set ui direction ui_direction = self.persepolis_setting.value('ui_direction') if ui_direction == 'rtl': self.setLayoutDirection(Qt.RightToLeft) elif ui_direction in 'ltr': self.setLayoutDirection(Qt.LeftToRight) self.setWindowIcon(QIcon.fromTheme('persepolis', QIcon(':/com.github.persepolisdm.persepolis.svg'))) window_verticalLayout = QVBoxLayout() self.setLayout(window_verticalLayout) # queue_tabWidget self.queue_tabWidget = QTabWidget(self) window_verticalLayout.addWidget(self.queue_tabWidget) # links_tab self.links_tab = QWidget() links_tab_verticalLayout = QVBoxLayout(self.links_tab) # link table self.links_table = QTableWidget(self.links_tab) self.links_table.setSizeAdjustPolicy(QAbstractItemView.AdjustToContents) links_tab_verticalLayout.addWidget(self.links_table) self.links_table.setSelectionBehavior(QAbstractItemView.SelectRows) self.links_table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.links_table.verticalHeader().hide() self.links_table.setColumnCount(3) links_table_header_labels = [ 'File Name', 'Download Link', 'dictionary'] self.links_table.setHorizontalHeaderLabels(links_table_header_labels) self.links_table.setColumnHidden(2, True) self.links_table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch) self.links_table.horizontalHeader().setStretchLastSection(True) # add_queue add_queue_horizontalLayout = QHBoxLayout() self.select_all_pushButton = QPushButton(self.links_tab) add_queue_horizontalLayout.addWidget(self.select_all_pushButton) self.deselect_all_pushButton = QPushButton(self.links_tab) add_queue_horizontalLayout.addWidget(self.deselect_all_pushButton) add_queue_horizontalLayout.addStretch(1) self.add_queue_label = QLabel(self.links_tab) add_queue_horizontalLayout.addWidget(self.add_queue_label) self.add_queue_comboBox = QComboBox(self.links_tab) add_queue_horizontalLayout.addWidget(self.add_queue_comboBox) links_tab_verticalLayout.addLayout(add_queue_horizontalLayout) links_tab_verticalLayout.addStretch(1) self.queue_tabWidget.addTab(self.links_tab, "") # options_tab self.options_tab = QWidget() options_tab_verticalLayout = QVBoxLayout(self.options_tab) # proxy proxy_verticalLayout = QVBoxLayout() self.proxy_checkBox = QCheckBox(self.options_tab) proxy_verticalLayout.addWidget(self.proxy_checkBox) self.proxy_frame = QFrame(self.options_tab) self.proxy_frame.setFrameShape(QFrame.StyledPanel) self.proxy_frame.setFrameShadow(QFrame.Raised) proxy_gridLayout = QGridLayout(self.proxy_frame) self.ip_lineEdit = QLineEdit(self.proxy_frame) self.ip_lineEdit.setInputMethodHints(Qt.ImhNone) proxy_gridLayout.addWidget(self.ip_lineEdit, 0, 1, 1, 1) self.proxy_pass_label = QLabel(self.proxy_frame) proxy_gridLayout.addWidget(self.proxy_pass_label, 2, 2, 1, 1) self.proxy_pass_lineEdit = QLineEdit(self.proxy_frame) self.proxy_pass_lineEdit.setEchoMode(QLineEdit.Password) proxy_gridLayout.addWidget(self.proxy_pass_lineEdit, 2, 3, 1, 1) self.ip_label = QLabel(self.proxy_frame) proxy_gridLayout.addWidget(self.ip_label, 0, 0, 1, 1) self.proxy_user_lineEdit = QLineEdit(self.proxy_frame) proxy_gridLayout.addWidget(self.proxy_user_lineEdit, 0, 3, 1, 1) self.proxy_user_label = QLabel(self.proxy_frame) proxy_gridLayout.addWidget(self.proxy_user_label, 0, 2, 1, 1) self.port_label = QLabel(self.proxy_frame) proxy_gridLayout.addWidget(self.port_label, 2, 0, 1, 1) self.port_spinBox = QSpinBox(self.proxy_frame) self.port_spinBox.setMaximum(9999) self.port_spinBox.setSingleStep(1) proxy_gridLayout.addWidget(self.port_spinBox, 2, 1, 1, 1) proxy_verticalLayout.addWidget(self.proxy_frame) # type of proxy self.http_radioButton = QRadioButton(self.proxy_frame) proxy_gridLayout.addWidget(self.http_radioButton, 4, 0, 1, 1) self.https_radioButton = QRadioButton(self.proxy_frame) proxy_gridLayout.addWidget(self.https_radioButton, 5, 0, 1, 1) # hide this widget until https support self.https_radioButton.hide() self.socks5_radioButton = QRadioButton(self.proxy_frame) proxy_gridLayout.addWidget(self.socks5_radioButton, 6, 0, 1, 1) options_tab_verticalLayout.addLayout(proxy_verticalLayout) # download Username & Password download_horizontalLayout = QHBoxLayout() download_horizontalLayout.setContentsMargins(-1, 10, -1, -1) download_verticalLayout = QVBoxLayout() self.download_checkBox = QCheckBox(self.options_tab) download_verticalLayout.addWidget(self.download_checkBox) self.download_frame = QFrame(self.options_tab) self.download_frame.setFrameShape(QFrame.StyledPanel) self.download_frame.setFrameShadow(QFrame.Raised) download_gridLayout = QGridLayout(self.download_frame) self.download_user_lineEdit = QLineEdit(self.download_frame) download_gridLayout.addWidget(self.download_user_lineEdit, 0, 1, 1, 1) self.download_user_label = QLabel(self.download_frame) download_gridLayout.addWidget(self.download_user_label, 0, 0, 1, 1) self.download_pass_label = QLabel(self.download_frame) download_gridLayout.addWidget(self.download_pass_label, 1, 0, 1, 1) self.download_pass_lineEdit = QLineEdit(self.download_frame) self.download_pass_lineEdit.setEchoMode(QLineEdit.Password) download_gridLayout.addWidget(self.download_pass_lineEdit, 1, 1, 1, 1) download_verticalLayout.addWidget(self.download_frame) download_horizontalLayout.addLayout(download_verticalLayout) # select folder self.folder_frame = QFrame(self.options_tab) self.folder_frame.setFrameShape(QFrame.StyledPanel) self.folder_frame.setFrameShadow(QFrame.Raised) folder_gridLayout = QGridLayout(self.folder_frame) self.download_folder_lineEdit = QLineEdit(self.folder_frame) folder_gridLayout.addWidget(self.download_folder_lineEdit, 2, 0, 1, 1) self.folder_pushButton = QPushButton(self.folder_frame) folder_gridLayout.addWidget(self.folder_pushButton, 3, 0, 1, 1) self.folder_pushButton.setIcon(QIcon(icons + 'folder')) self.folder_checkBox = QCheckBox(self.folder_frame) folder_gridLayout.addWidget(self.folder_checkBox) self.folder_label = QLabel(self.folder_frame) self.folder_label.setAlignment(Qt.AlignCenter) folder_gridLayout.addWidget(self.folder_label, 1, 0, 1, 1) download_horizontalLayout.addWidget(self.folder_frame) options_tab_verticalLayout.addLayout(download_horizontalLayout) self.queue_tabWidget.addTab(self.options_tab, '') # limit Speed limit_verticalLayout = QVBoxLayout() self.limit_frame = QFrame(self.options_tab) self.limit_frame.setFrameShape(QFrame.StyledPanel) self.limit_frame.setFrameShadow(QFrame.Raised) connections_verticaLayout = QVBoxLayout(self.limit_frame) limit_verticalLayout.addWidget(self.limit_frame) limit_connections_horizontalLayout = QHBoxLayout() limit_connections_horizontalLayout.addLayout(limit_verticalLayout) # number of connections connections_horizontalLayout = QHBoxLayout() connections_horizontalLayout.setContentsMargins(-1, 10, -1, -1) self.connections_frame = QFrame(self.options_tab) self.connections_frame.setFrameShape(QFrame.StyledPanel) self.connections_frame.setFrameShadow(QFrame.Raised) self.connections_label = QLabel(self.connections_frame) connections_verticaLayout.addWidget(self.connections_label) self.connections_spinBox = QSpinBox(self.connections_frame) self.connections_spinBox.setMinimum(1) self.connections_spinBox.setMaximum(64) self.connections_spinBox.setProperty("value", 64) connections_verticaLayout.addWidget(self.connections_spinBox) connections_horizontalLayout.addWidget(self.connections_frame) limit_connections_horizontalLayout.addLayout(connections_horizontalLayout) options_tab_verticalLayout.addLayout(limit_connections_horizontalLayout) options_tab_verticalLayout.addStretch(1) # buttons buttons_horizontalLayout = QHBoxLayout() buttons_horizontalLayout.addStretch(1) # ok_pushButton self.ok_pushButton = QPushButton(self) self.ok_pushButton.setIcon(QIcon(icons + 'ok')) buttons_horizontalLayout.addWidget(self.ok_pushButton) # cancel_pushButton self.cancel_pushButton = QPushButton(self) self.cancel_pushButton.setIcon(QIcon(icons + 'remove')) buttons_horizontalLayout.addWidget(self.cancel_pushButton) window_verticalLayout.addLayout(buttons_horizontalLayout) # labels self.setWindowTitle(QCoreApplication.translate("text_ui_tr", "Persepolis Download Manager")) self.queue_tabWidget.setTabText( self.queue_tabWidget.indexOf(self.links_tab), QCoreApplication.translate("text_ui_tr", 'Links')) self.queue_tabWidget.setTabText( self.queue_tabWidget.indexOf(self.options_tab), QCoreApplication.translate("text_ui_tr", 'Download Options')) self.select_all_pushButton.setText(QCoreApplication.translate("text_ui_tr", 'Select All')) self.deselect_all_pushButton.setText(QCoreApplication.translate("text_ui_tr", 'Deselect All')) self.add_queue_label.setText(QCoreApplication.translate("text_ui_tr", 'Add to queue: ')) self.proxy_checkBox.setText(QCoreApplication.translate("text_ui_tr", 'Proxy')) self.proxy_pass_label.setText(QCoreApplication.translate("text_ui_tr", "Proxy password: ")) self.ip_label.setText(QCoreApplication.translate("text_ui_tr", "IP:")) self.proxy_user_label.setText(QCoreApplication.translate("text_ui_tr", "Proxy username: ")) self.port_label.setText(QCoreApplication.translate("text_ui_tr", "Port:")) self.http_radioButton.setText(QCoreApplication.translate("addlink_ui_tr", "HTTP")) self.https_radioButton.setText(QCoreApplication.translate("addlink_ui_tr", "HTTPS")) self.socks5_radioButton.setText(QCoreApplication.translate("addlink_ui_tr", "SOCKS5")) self.download_checkBox.setText(QCoreApplication.translate("text_ui_tr", "Download username and password")) self.download_user_label.setText(QCoreApplication.translate("text_ui_tr", "Download username: ")) self.download_pass_label.setText(QCoreApplication.translate("text_ui_tr", "Download password: ")) self.folder_pushButton.setText(QCoreApplication.translate("text_ui_tr", "Change Download Folder")) self.folder_checkBox.setText(QCoreApplication.translate("addlink_ui_tr", "Remember this path")) self.folder_label.setText(QCoreApplication.translate("text_ui_tr", "Download folder: ")) self.connections_label.setText(QCoreApplication.translate("text_ui_tr", "Number of connections:")) self.ok_pushButton.setText(QCoreApplication.translate("text_ui_tr", 'OK')) self.cancel_pushButton.setText(QCoreApplication.translate("text_ui_tr", 'Cancel')) ================================================ FILE: persepolis/gui/video_finder_progress_ui.py ================================================ # -*- coding: utf-8 -*- # 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 . from persepolis.gui.progress_ui import ProgressWindow_Ui try: from PySide6.QtWidgets import QWidget, QVBoxLayout, QLabel from PySide6.QtCore import QCoreApplication except ImportError: from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel from PyQt5.QtCore import QCoreApplication class VideoFinderProgressWindow_Ui(ProgressWindow_Ui): def __init__(self, persepolis_setting, parent): super().__init__(persepolis_setting, parent) # status_tab self.status_tab = QWidget() status_tab_verticalLayout = QVBoxLayout(self.status_tab) # video_status_label self.video_status_label = QLabel(self.status_tab) status_tab_verticalLayout.addWidget(self.video_status_label) # audio_status_label self.audio_status_label = QLabel(self.status_tab) status_tab_verticalLayout.addWidget(self.audio_status_label) # muxing_status_label self.muxing_status_label = QLabel(self.status_tab) status_tab_verticalLayout.addWidget(self.muxing_status_label) self.progress_tabWidget.addTab(self.status_tab, "") # set status_tab as default tab self.progress_tabWidget.setCurrentIndex(2) # hide limit speed self.limit_frame.setVisible(False) # hide pause_pushButton self.pause_pushButton.setVisible(False) # hide resume_pushButton self.resume_pushButton.setVisible(False) # labels self.video_status_label.setText(QCoreApplication.translate( "video_finder_progress_ui_tr", "Video file status: ")) self.audio_status_label.setText(QCoreApplication.translate( "video_finder_progress_ui_tr", "Audio file status: ")) self.muxing_status_label.setText(QCoreApplication.translate( "video_finder_progress_ui_tr", "Mixing status: ")) self.progress_tabWidget.setTabText(self.progress_tabWidget.indexOf( self.status_tab), QCoreApplication.translate("setting_ui_tr", "Status")) ================================================ FILE: persepolis/meson.build ================================================ shell_sources = [ '__init__.py', '__main__.py' ] constants_sources = [ 'constants/Browser.py', 'constants/__init__.py', 'constants/Os.py', 'constants/Version.py' ] gui_sources = [ 'gui/__init__.py', 'gui/about_ui.py', 'gui/after_download_ui.py', 'gui/mainwindow_ui.py', 'gui/progress_ui.py', 'gui/resources.py', 'gui/text_queue_ui.py', 'gui/addlink_ui.py', 'gui/customized_widgets.py', 'gui/log_window_ui.py', 'gui/setting_ui.py', 'gui/video_finder_progress_ui.py' ] scripts_sources = [ 'scripts/about.py', 'scripts/bubble.py', 'scripts/download_link.py', 'scripts/error_window.py', 'scripts/play.py', 'scripts/shutdown.py', 'scripts/useful_tools.py', 'scripts/addlink.py', 'scripts/check_proxy.py', 'scripts/initialization.py', 'scripts/mainwindow.py', 'scripts/progress.py', 'scripts/spider.py', 'scripts/video_finder_addlink.py', 'scripts/after_download.py', 'scripts/compatibility.py', 'scripts/__init__.py', 'scripts/newopen.py', 'scripts/properties.py', 'scripts/startup.py', 'scripts/video_finder_progress.py', 'scripts/browser_integration.py', 'scripts/data_base.py', 'scripts/logger.py', 'scripts/osCommands.py', 'scripts/queue.py', 'scripts/text_queue.py', 'scripts/browser_plugin_queue.py', 'scripts/persepolis_lib_prime.py', 'scripts/log_window.py', 'scripts/persepolis.py', 'scripts/setting.py', 'scripts/video_finder.py', 'scripts/ytdlp_downloader.py', ] python3.install_sources(shell_sources, subdir: 'persepolis') python3.install_sources(gui_sources, subdir: join_paths('persepolis', 'gui')) python3.install_sources(scripts_sources, subdir: join_paths('persepolis', 'scripts')) python3.install_sources(constants_sources, subdir: join_paths('persepolis', 'constants')) python = import('python') conf = configuration_data() conf.set('PYTHON', python.find_installation('python3').full_path()) conf.set('pythonsitepackagedir', python3.get_install_dir()) configure_file( input: 'persepolis.py', output: 'persepolis', configuration: conf, install: true, install_dir: get_option('bindir'), install_mode: 'r-xr-xr-x' ) ================================================ FILE: persepolis/persepolis.py ================================================ #!@PYTHON@ # -*- coding: utf-8 -*- # 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 . # this file is created for running persepolis from /usr/bin/ or /usr/local/bin/. import sys pythonsitepackagedir = '@pythonsitepackagedir@' if __name__ == '__main__': sys.path.append(pythonsitepackagedir) from persepolis.scripts import persepolis persepolis.main() ================================================ FILE: persepolis/scripts/.pep8 ================================================ [pycodestyle] max_line_length = 120 ================================================ FILE: persepolis/scripts/__init__.py ================================================ """ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ # import sys # sys.path.insert(1, '.') ================================================ FILE: persepolis/scripts/about.py ================================================ # -*- coding: utf-8 -*- """ 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 . """ try: from PySide6.QtCore import Qt, QSize, QPoint, QFile, QIODevice, QTextStream from PySide6.QtGui import QIcon except ImportError: from PyQt5.QtCore import Qt, QSize, QPoint, QFile, QIODevice, QTextStream from PyQt5.QtGui import QIcon from persepolis.gui.about_ui import AboutWindow_Ui from persepolis.gui import resources class AboutWindow(AboutWindow_Ui): def __init__(self, persepolis_setting): super().__init__(persepolis_setting) self.persepolis_setting = persepolis_setting # setting window size and position size = self.persepolis_setting.value( 'AboutWindow/size', QSize(545, 375)) position = self.persepolis_setting.value( 'AboutWindow/position', QPoint(300, 300)) # read translators.txt files. # this file contains all translators. f = QFile(':/translators.txt') f.open(QIODevice.ReadOnly | QFile.Text) f_text = QTextStream(f).readAll() f.close() self.translators_textEdit.insertPlainText(f_text) self.resize(size) self.move(position) def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.close() def changeIcon(self, icons): icons = ':/' + str(icons) + '/' self.pushButton.setIcon(QIcon(icons + 'ok')) def closeEvent(self, event): # saving window size and position self.persepolis_setting.setValue('AboutWindow/size', self.size()) self.persepolis_setting.setValue('AboutWindow/position', self.pos()) self.persepolis_setting.sync() event.accept() ================================================ FILE: persepolis/scripts/addlink.py ================================================ # -*- coding: utf-8 -*- """ 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 . """ try: from PySide6.QtWidgets import QApplication, QFileDialog from PySide6.QtCore import Qt, QPoint, QSize, QDir, QThread, Signal from PySide6.QtGui import QIcon except ImportError: from PyQt5.QtWidgets import QApplication, QFileDialog from PyQt5.QtCore import Qt, QPoint, QSize, QDir, QThread from PyQt5.QtGui import QIcon from PyQt5.QtCore import pyqtSignal as Signal from persepolis.gui.addlink_ui import AddLinkWindow_Ui from persepolis.scripts.check_proxy import getProxy from persepolis.scripts import spider from persepolis.scripts import logger from functools import partial import os # find file name and file size class AddLinkSpiderThread(QThread): ADDLINKSPIDERSIGNAL = Signal(dict) def __init__(self, add_link_dictionary): QThread.__init__(self) self.add_link_dictionary = add_link_dictionary def run(self): try: # get file name and file size file_name, file_size = spider.addLinkSpider(self.add_link_dictionary) spider_dict = {'file_size': file_size, 'file_name': file_name} # emit results self.ADDLINKSPIDERSIGNAL.emit(spider_dict) # write an ERROR in log, If spider couldn't find file_name or file_size. if not (file_name): logger.sendToLog( "Spider couldn't find file name", "ERROR") if not (file_size): logger.sendToLog( "Spider couldn't find file size", "ERROR") except Exception as e: logger.sendToLog( "Spider couldn't find download information", "ERROR") logger.sendToLog( str(e), "ERROR") class AddLinkWindow(AddLinkWindow_Ui): def __init__(self, parent, callback, persepolis_setting, plugin_add_link_dictionary={}): super().__init__(persepolis_setting) self.callback = callback self.plugin_add_link_dictionary = plugin_add_link_dictionary self.persepolis_setting = persepolis_setting self.parent = parent # entry initialization # read values from persepolis_setting # connections connections = int( self.persepolis_setting.value('settings/connections')) self.connections_spinBox.setValue(connections) # download_path download_path = str( self.persepolis_setting.value('settings/download_path')) self.download_folder_lineEdit.setText(download_path) self.download_folder_lineEdit.setEnabled(False) # enable ok button only if link_lineEdit is not empty! # see linkLineChanged method. self.ok_pushButton.setEnabled(False) self.download_later_pushButton.setEnabled(False) self.link_lineEdit.textChanged.connect(self.linkLineChanged) # if browsers plugin didn't send any links # then check clipboard for link! if ('link' in self.plugin_add_link_dictionary.keys()): # check plugin_add_link_dictionary for link! # "link" key-value must be checked self.link_lineEdit.setText( str(self.plugin_add_link_dictionary['link'])) else: # check clipboard clipboard = QApplication.clipboard() text = clipboard.text() if (("tp:/" in text[2:6]) or ("tps:/" in text[2:7])): self.link_lineEdit.setText(str(text)) # detect_proxy_pushButton self.detect_proxy_pushButton.clicked.connect( self.detectProxy) # ip_lineEdit initialization -> settings_ip = self.persepolis_setting.value( 'add_link_initialization/ip', None) if (settings_ip): self.ip_lineEdit.setText(str(settings_ip)) # proxy user lineEdit initialization -> settings_proxy_user = self.persepolis_setting.value( 'add_link_initialization/proxy_user', None) if (settings_proxy_user): self.proxy_user_lineEdit.setText(str(settings_proxy_user)) # port_spinBox initialization -> settings_port = self.persepolis_setting.value( 'add_link_initialization/port', 0) self.port_spinBox.setValue(int(int(settings_port))) # download UserName initialization -> settings_download_user = self.persepolis_setting.value( 'add_link_initialization/download_user', None) if (settings_download_user): self.download_user_lineEdit.setText(str(settings_download_user)) # http or socks5 initialization settings_proxy_type = self.persepolis_setting.value( 'add_link_initialization/proxy_type', None) if settings_proxy_type == 'socks5': self.socks5_radioButton.setChecked(True) elif settings_proxy_type == 'https': self.https_radioButton.setChecked(True) else: self.http_radioButton.setChecked(True) # get categories name and add them to add_queue_comboBox categories_list = self.parent.persepolis_db.categoriesList() for queue in categories_list: if queue != 'All Downloads': self.add_queue_comboBox.addItem(queue) self.add_queue_comboBox.setCurrentIndex(0) # add_queue_comboBox event self.add_queue_comboBox.currentIndexChanged.connect(self.queueChanged) # connect folder_pushButton self.folder_pushButton.clicked.connect(self.changeFolder) # connect OK and cancel download_later button -> self.cancel_pushButton.clicked.connect(self.close) self.ok_pushButton.clicked.connect(partial( self.okButtonPressed, download_later=False)) self.download_later_pushButton.clicked.connect( partial(self.okButtonPressed, download_later=True)) # frames and checkBoxes -> self.proxy_frame.setEnabled(False) self.proxy_checkBox.toggled.connect(self.proxyFrame) self.download_frame.setEnabled(False) self.download_checkBox.toggled.connect(self.downloadFrame) self.start_frame.setEnabled(False) self.start_checkBox.toggled.connect(self.startFrame) self.end_frame.setEnabled(False) self.end_checkBox.toggled.connect(self.endFrame) self.change_name_lineEdit.setEnabled(False) self.change_name_checkBox.toggled.connect(self.changeName) self.add_link_tabWidget.currentChanged.connect(self.currentTabChanged) # set focus to ok button self.ok_pushButton.setFocus() # check plugin_add_link_dictionary for finding file name # perhaps plugin sended file name in plugin_add_link_dictionary # for finding file name "out" key must be checked if ('out' in self.plugin_add_link_dictionary.keys()): if self.plugin_add_link_dictionary['out']: self.change_name_lineEdit.setText( str(self.plugin_add_link_dictionary['out'])) self.change_name_checkBox.setChecked(True) # get referer and header and user_agent and load_cookies in plugin_add_link_dictionary if exits. if ('referer' in self.plugin_add_link_dictionary): self.referer_lineEdit.setText(str(self.plugin_add_link_dictionary['referer'])) if ('header' in self.plugin_add_link_dictionary): if str(self.plugin_add_link_dictionary['header']) != 'None': self.header_lineEdit.setText(str(self.plugin_add_link_dictionary['header'])) if ('user_agent' in self.plugin_add_link_dictionary): self.user_agent_lineEdit.setText(str(self.plugin_add_link_dictionary['user_agent'])) if ('load_cookies' in self.plugin_add_link_dictionary): self.load_cookies_lineEdit.setText((self.plugin_add_link_dictionary['load_cookies'])) # set window size and position size = self.persepolis_setting.value( 'AddLinkWindow/size', QSize(652, 480)) position = self.persepolis_setting.value( 'AddLinkWindow/position', QPoint(300, 300)) self.resize(size) self.move(position) # if user clicked on link_tab so send spider again # perhaps proxy or user password , ... set! def currentTabChanged(self, index): if index == 0: self.linkLineChanged(index) # detect system proxy setting, and set ip_lineEdit and port_spinBox def detectProxy(self, button): # get system proxy information system_proxy_dict = getProxy() enable_proxy_frame = False # ip if 'http_proxy_ip' in system_proxy_dict.keys(): self.ip_lineEdit.setText(str(system_proxy_dict['http_proxy_ip'])) enable_proxy_frame = True # port if 'http_proxy_port' in system_proxy_dict.keys(): self.port_spinBox.setValue(int(system_proxy_dict['http_proxy_port'])) enable_proxy_frame = True # enable proxy frame if http_proxy_ip or http_proxy_port is valid. if enable_proxy_frame: self.proxy_checkBox.setChecked(True) self.detect_proxy_label.setText('') else: self.proxy_checkBox.setChecked(False) self.detect_proxy_label.setText('No proxy detected!') # active frames if checkBoxes are checked def proxyFrame(self, checkBox): if self.proxy_checkBox.isChecked() is True: self.proxy_frame.setEnabled(True) else: self.proxy_frame.setEnabled(False) def downloadFrame(self, checkBox): if self.download_checkBox.isChecked() is True: self.download_frame.setEnabled(True) else: self.download_frame.setEnabled(False) def startFrame(self, checkBox): if self.start_checkBox.isChecked() is True: self.start_frame.setEnabled(True) else: self.start_frame.setEnabled(False) def endFrame(self, checkBox): if self.end_checkBox.isChecked() is True: self.end_frame.setEnabled(True) else: self.end_frame.setEnabled(False) def changeFolder(self, button): # get download_path from lineEdit download_path = self.download_folder_lineEdit.text() # open select folder dialog fname = QFileDialog.getExistingDirectory( self, 'Select a directory', download_path) if fname: # Returns pathName with the '/' separators converted to separators that are appropriate for the underlying operating system. # On Windows, toNativeSeparators("c:/winnt/system32") returns # "c:\winnt\system32". fname = QDir.toNativeSeparators(fname) if os.path.isdir(fname): self.download_folder_lineEdit.setText(fname) # enable when link_lineEdit is not empty and find size of file. def linkLineChanged(self, lineEdit): if str(self.link_lineEdit.text()) == '': self.ok_pushButton.setEnabled(False) self.download_later_pushButton.setEnabled(False) else: # find file size # get proxy information ip, port, proxy_user, proxy_passwd, proxy_type = self.getProxyInformation() # get download username and password information download_user, download_passwd = self.getUserPass() # get additinal information referer, header, user_agent, load_cookies = self.getAdditionalInformation() dict = {'link': str(self.link_lineEdit.text()), 'ip': ip, 'port': port, 'proxy_user': proxy_user, 'proxy_passwd': proxy_passwd, 'proxy_type': proxy_type, 'download_user': download_user, 'download_passwd': download_passwd, 'referer': referer, 'header': header, 'user_agent': user_agent, 'load_cookies': load_cookies} # spider is finding file size new_spider = AddLinkSpiderThread(dict) self.parent.threadPool.append(new_spider) self.parent.threadPool[-1].start() self.parent.threadPool[-1].ADDLINKSPIDERSIGNAL.connect( partial(self.parent.addLinkSpiderCallBack, child=self)) self.ok_pushButton.setEnabled(True) self.download_later_pushButton.setEnabled(True) # enable change_name_lineEdit if change_name_checkBox is checked. def changeName(self, checkBoxes): if self.change_name_checkBox.isChecked() is True: self.change_name_lineEdit.setEnabled(True) else: self.change_name_lineEdit.setEnabled(False) def queueChanged(self, combo): # if one of the queues selected by user , start time and end time must # be deactivated if self.add_queue_comboBox.currentIndex() != 0: self.start_checkBox.setCheckState(Qt.Unchecked) self.start_checkBox.setEnabled(False) self.end_checkBox.setCheckState(Qt.Unchecked) self.end_checkBox.setEnabled(False) else: self.start_checkBox.setEnabled(True) self.end_checkBox.setEnabled(True) # this method returns proxy information. def getProxyInformation(self): # http, https or socks5 proxy if self.http_radioButton.isChecked() is True: proxy_type = 'http' elif self.https_radioButton.isChecked() is True: proxy_type = 'https' else: proxy_type = 'socks5' # get proxy information if not (self.proxy_checkBox.isChecked()): ip = None port = None proxy_user = None proxy_passwd = None proxy_type = None else: ip = self.ip_lineEdit.text() if not (ip): ip = None port = self.port_spinBox.value() if not (port): port = None proxy_user = self.proxy_user_lineEdit.text() if not (proxy_user): proxy_user = None proxy_passwd = self.proxy_pass_lineEdit.text() if not (proxy_passwd): proxy_passwd = None return ip, port, proxy_user, proxy_passwd, proxy_type def getUserPass(self): # get download username and password information if not (self.download_checkBox.isChecked()): download_user = None download_passwd = None else: download_user = self.download_user_lineEdit.text() if not (download_user): download_user = None download_passwd = self.download_pass_lineEdit.text() if not (download_passwd): download_passwd = None return download_user, download_passwd def getAdditionalInformation(self): # referer if self.referer_lineEdit.text() != '': referer = self.referer_lineEdit.text() else: referer = None # header if self.header_lineEdit.text() != '': header = self.header_lineEdit.text() else: header = None # user_agent if self.user_agent_lineEdit.text() != '': user_agent = self.user_agent_lineEdit.text() else: user_agent = None # load_cookies if self.load_cookies_lineEdit.text() != '': load_cookies = self.load_cookies_lineEdit.text() else: load_cookies = None return referer, header, user_agent, load_cookies def okButtonPressed(self, download_later, button=None): # user submitted information by pressing ok_pushButton, so get information # from AddLinkWindow and return them to the mainwindow with callback! # write user's new inputs in persepolis_setting for next time :) self.persepolis_setting.setValue( 'add_link_initialization/ip', self.ip_lineEdit.text()) self.persepolis_setting.setValue( 'add_link_initialization/port', self.port_spinBox.value()) self.persepolis_setting.setValue( 'add_link_initialization/proxy_user', self.proxy_user_lineEdit.text()) self.persepolis_setting.setValue( 'add_link_initialization/download_user', self.download_user_lineEdit.text()) # get proxy information ip, port, proxy_user, proxy_passwd, proxy_type = self.getProxyInformation() if proxy_type is not None: self.persepolis_setting.setValue('add_link_initialization/proxy_type', proxy_type) # get download username and password information download_user, download_passwd = self.getUserPass() # get start time for download if user set that. if not (self.start_checkBox.isChecked()): start_time = None else: start_time = self.start_time_qDataTimeEdit.text() # get end time for download if user set that. if not (self.end_checkBox.isChecked()): end_time = None else: end_time = self.end_time_qDateTimeEdit.text() # check that if user set new name for download file. if self.change_name_checkBox.isChecked(): out = str(self.change_name_lineEdit.text()) self.plugin_add_link_dictionary['out'] = out else: out = None # get download link link = self.link_lineEdit.text() # get number of connections connections = self.connections_spinBox.value() # get download_path download_path = self.download_folder_lineEdit.text() # get additinal information referer, header, user_agent, load_cookies = self.getAdditionalInformation() # save information in a dictionary(add_link_dictionary). self.add_link_dictionary = {'referer': referer, 'header': header, 'user_agent': user_agent, 'load_cookies': load_cookies, 'out': out, 'start_time': start_time, 'end_time': end_time, 'link': link, 'ip': ip, 'port': port, 'proxy_user': proxy_user, 'proxy_passwd': proxy_passwd, 'proxy_type': proxy_type, 'download_user': download_user, 'download_passwd': download_passwd, 'connections': connections, 'limit_value': 10, 'download_path': download_path} # get category of download category = str(self.add_queue_comboBox.currentText()) del self.plugin_add_link_dictionary # return information to mainwindow self.callback(self.add_link_dictionary, download_later, category) # close window self.close() # close window with ESC key def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.close() # save size and position of window, when user closes the window. def closeEvent(self, event): self.persepolis_setting.setValue('AddLinkWindow/size', self.size()) self.persepolis_setting.setValue('AddLinkWindow/position', self.pos()) self.persepolis_setting.sync() event.accept() def changeIcon(self, icons): icons = ':/' + str(icons) + '/' self.folder_pushButton.setIcon(QIcon(icons + 'folder')) self.download_later_pushButton.setIcon(QIcon(icons + 'stop')) self.cancel_pushButton.setIcon(QIcon(icons + 'remove')) self.ok_pushButton.setIcon(QIcon(icons + 'ok')) ================================================ FILE: persepolis/scripts/after_download.py ================================================ # -*- coding: utf-8 -*- # 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 . try: from PySide6.QtCore import Qt, QSize, QPoint, QTranslator, QCoreApplication, QLocale from PySide6.QtGui import QIcon except ImportError: from PyQt5.QtCore import Qt, QSize, QPoint, QTranslator, QCoreApplication, QLocale from PyQt5.QtGui import QIcon from persepolis.gui.after_download_ui import AfterDownloadWindow_Ui from persepolis.scripts import osCommands import os import time class AfterDownloadWindow(AfterDownloadWindow_Ui): def __init__(self, parent, dict, persepolis_setting): super().__init__(persepolis_setting) self.persepolis_setting = persepolis_setting self.dict = dict self.parent = parent # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) # connecting buttons self.open_pushButtun.clicked.connect(self.openFile) self.open_folder_pushButtun.clicked.connect(self.openFolder) self.ok_pushButton.clicked.connect(self.okButtonPressed) # labels # find gid gid = self.dict['gid'] # If file path not valid, Wait a little and try again. # The file transfer and database update process may # not be finished after the download is finished. while True: self.add_link_dict = self.parent.persepolis_db.searchGidInAddLinkTable(gid) file_path = self.add_link_dict['download_path'] if os.path.isfile(file_path): break else: # Wait a little and try again! time.sleep(0.1) # save_as self.save_as_lineEdit.setText(file_path) self.save_as_lineEdit.setToolTip(file_path) # link link = str(self.dict['link']) self.link_lineEdit.setText(link) self.link_lineEdit.setToolTip(link) # file_name window_title = str(self.dict['file_name']) file_name = QCoreApplication.translate("after_download_src_ui_tr", "File name: ") + \ window_title self.setWindowTitle(window_title) self.file_name_label.setText(file_name) # size size = QCoreApplication.translate("after_download_src_ui_tr", "Size: ") + str(self.dict['size']) self.size_label.setText(size) # disable link_lineEdit and save_as_lineEdit self.link_lineEdit.setEnabled(False) self.save_as_lineEdit.setEnabled(False) # set window size and position size = self.persepolis_setting.value( 'AfterDownloadWindow/size', QSize(659, 300)) position = self.persepolis_setting.value( 'AfterDownloadWindow/position', QPoint(300, 300)) self.resize(size) self.move(position) def openFile(self): # execute file file_path = self.add_link_dict['download_path'] if os.path.isfile(file_path): osCommands.xdgOpen(file_path) # close window self.close() def openFolder(self): # open download folder download_path = self.add_link_dict['download_path'] # file_name = os.path.basename(file_path) # file_path_split = file_path.split(file_name) # del file_path_split[-1] # download_path = file_name.join(file_path_split) if os.path.isfile(download_path): osCommands.xdgOpen(download_path, 'folder', 'file') # close window self.close() def okButtonPressed(self): if self.dont_show_checkBox.isChecked(): self.persepolis_setting.setValue('settings/after-dialog', 'no') self.persepolis_setting.sync() # close window self.close() # close window with ESC key def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.close() def closeEvent(self, event): # saving window size and position self.persepolis_setting.setValue( 'AfterDownloadWindow/size', self.size()) self.persepolis_setting.setValue( 'AfterDownloadWindow/position', self.pos()) self.persepolis_setting.sync() event.accept() def changeIcon(self, icons): icons = ':/' + str(icons) + '/' self.ok_pushButton.setIcon(QIcon(icons + 'ok')) self.open_folder_pushButtun.setIcon(QIcon(icons + 'folder')) self.open_pushButtun.setIcon(QIcon(icons + 'file')) ================================================ FILE: persepolis/scripts/browser_integration.py ================================================ # -*- coding: utf-8 -*- # 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 . # from persepolis.scripts.useful_tools import determineConfigFolder, getExecPath, findExternalAppPath from persepolis.scripts import osCommands from persepolis.constants import OS, BROWSER import os import platform import subprocess import sys if sys.platform == "win32": import winreg os_type = platform.system() home_address = str(os.path.expanduser("~")) # download manager config folder . config_folder = determineConfigFolder() def removeRegistryKey(browser): logg_message = 'trying to remove registry kry for ' + str(browser) + ': ' if browser == BROWSER.CHROME or browser == BROWSER.CHROMIUM: try: # Open the parent key with winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"SOFTWARE\Google\Chrome\NativeMessagingHosts", 0, winreg.KEY_ALL_ACCESS) as parent_key: # Delete the pdmchromewrapper key winreg.DeleteKey(parent_key, "com.persepolis.pdmchromewrapper") logg_message = logg_message + 'Key deleted successfully.' except FileNotFoundError: logg_message = logg_message + 'The specified key does not exist.' except WindowsError as e: logg_message = logg_message + f'An error occurred: {e}' elif browser == BROWSER.FIREFOX: try: # Open the parent key with winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"SOFTWARE\Mozilla\NativeMessagingHosts", 0, winreg.KEY_ALL_ACCESS) as parent_key: # Delete the pdmchromewrapper key winreg.DeleteKey(parent_key, "com.persepolis.pdmchromewrapper") logg_message = logg_message + 'Key deleted successfully.' except FileNotFoundError: logg_message = logg_message + 'The specified key does not exist.' except WindowsError as e: logg_message = logg_message + f'An error occurred: {e}' else: logg_message = logg_message + 'No need to remove registry key.' return logg_message def installIntermidiary(intermediary): intermediary_done = None exec_dictionary = getExecPath() exec_path = exec_dictionary['modified_exec_file_path'] # create persepolis_run_shell(intermediry script) file for gnu/linux and BSD and Mac # firefox and chromium and ... call persepolis with Native Messaging system. # json file calls persepolis_run_shell file. if os_type in OS.UNIX_LIKE or os_type == OS.OSX: # find available shell shell_list = ['/bin/bash', '/usr/local/bin/bash', '/bin/sh', '/usr/local/bin/sh', '/bin/ksh', '/bin/tcsh'] for shell in shell_list: if os.path.isfile(shell): # define shebang shebang = '#!' + shell break persepolis_run_shell_contents = shebang + '\n' + exec_path + "\t$@" f = open(intermediary, 'w') f.writelines(persepolis_run_shell_contents) f.close() # make persepolis_run_shell executable pipe_native = subprocess.Popen(['chmod', '+x', intermediary], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False) if pipe_native.wait() == 0: intermediary_done = True else: intermediary_done = False else: # for M.S.Windows intermediary_done = True return intermediary_done def uninstallNativeMessageHost(browser, native_message_folder): # native message host path native_message_file = os.path.join( native_message_folder, 'com.persepolis.pdmchromewrapper.json') # remove file answer = osCommands.remove(native_message_file) if answer == 'ok': logg_message = 'Native message file for ' + str(browser) + ' has been deleted!' elif answer == 'cant': logg_message = 'Persepolis can not delete native message host file for ' + str(browser) + '.' return logg_message def installNativeMessageHost(browser, native_message_folder, webextension_json_connector): json_done = None # native message host path native_message_file = os.path.join( native_message_folder, 'com.persepolis.pdmchromewrapper.json') osCommands.makeDirs(native_message_folder) # Write native message host file f = open(native_message_file, 'w') f.write(str(webextension_json_connector).replace("'", "\"")) f.close() if os_type != OS.WINDOWS: pipe_json = subprocess.Popen(['chmod', '+x', str(native_message_file)], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False) if pipe_json.wait() == 0: json_done = True else: json_done = False else: import winreg # add the key to the windows registry if browser in BROWSER.CHROME_FAMILY: try: # create pdmchromewrapper key under NativeMessagingHosts winreg.CreateKey(winreg.HKEY_CURRENT_USER, r"SOFTWARE\Google\Chrome\NativeMessagingHosts\com.persepolis.pdmchromewrapper") # open a connection to pdmchromewrapper key gintKey = winreg.OpenKey( winreg.HKEY_CURRENT_USER, r"SOFTWARE\Google\Chrome\NativeMessagingHosts\com.persepolis.pdmchromewrapper", 0, winreg.KEY_ALL_ACCESS) # set native_message_file as key value winreg.SetValueEx(gintKey, '', 0, winreg.REG_SZ, native_message_file) # close connection to pdmchromewrapper winreg.CloseKey(gintKey) json_done = True except WindowsError: json_done = False elif browser == BROWSER.FIREFOX_FAMILY: try: # create pdmchromewrapper key under NativeMessagingHosts for firefox winreg.CreateKey(winreg.HKEY_CURRENT_USER, r"SOFTWARE\Mozilla\NativeMessagingHosts\com.persepolis.pdmchromewrapper") # open a connection to pdmchromewrapper key for firefox fintKey = winreg.OpenKey( winreg.HKEY_CURRENT_USER, r"SOFTWARE\Mozilla\NativeMessagingHosts\com.persepolis.pdmchromewrapper", 0, winreg.KEY_ALL_ACCESS) # set native_message_file as key value winreg.SetValueEx(fintKey, '', 0, winreg.REG_SZ, native_message_file) # close connection to pdmchromewrapper winreg.CloseKey(fintKey) json_done = True except WindowsError: json_done = False return json_done def nativeMessageHostFile(browser, intermediary): # WebExtension native hosts file prototype webextension_json_connector = { "name": "com.persepolis.pdmchromewrapper", "type": "stdio", "path": str(intermediary), "description": "Integrate Persepolis with %s using WebExtensions" % (browser) } # Add chrom* keys if browser in BROWSER.CHROME_FAMILY: webextension_json_connector["allowed_origins"] = ["chrome-extension://legimlagjjoghkoedakdjhocbeomojao/"] # Add firefox keys elif browser == BROWSER.FIREFOX_FAMILY: webextension_json_connector["allowed_extensions"] = [ "com.persepolis.pdmchromewrapper@persepolisdm.github.io", "com.persepolis.pdmchromewrapper.offline@persepolisdm.github.io" ] return webextension_json_connector def getIntermediaryPath(): if os_type in OS.UNIX_LIKE or os_type == OS.OSX: intermediary = os.path.join(config_folder, 'persepolis_run_shell') logg_message = str(intermediary) elif os_type == OS.WINDOWS: intermediary, logg_message = findExternalAppPath('PersepolisBI') logg_message = "Persepolis intermediary path: " + logg_message return intermediary, logg_message def getNativeMessageFolder(browser): if os_type in OS.UNIX_LIKE: if browser == BROWSER.CHROMIUM: return os.path.join(home_address, '.config/chromium/NativeMessagingHosts') elif browser == BROWSER.CHROME: return os.path.join(home_address, '.config/google-chrome/NativeMessagingHosts') elif browser == BROWSER.FIREFOX: return os.path.join(home_address, '.mozilla/native-messaging-hosts') elif browser == BROWSER.VIVALDI: return os.path.join(home_address, '.config/vivaldi/NativeMessagingHosts') elif browser == BROWSER.OPERA: return os.path.join(home_address, '.config/opera/NativeMessagingHosts') elif browser == BROWSER.BRAVE: return os.path.join(home_address, '.config/BraveSoftware/Brave-Browser/NativeMessagingHosts') elif browser == BROWSER.LIBREWOLF: return os.path.join(home_address, '.librewolf/native-messaging-hosts') elif os_type == OS.OSX: if browser == BROWSER.CHROMIUM: return os.path.join(home_address, 'Library/Application Support/Chromium/NativeMessagingHosts') elif browser == BROWSER.CHROME: return os.path.join(home_address, 'Library/Application Support/Google/Chrome/NativeMessagingHosts') elif browser == BROWSER.FIREFOX: return os.path.join(home_address, 'Library/Application Support/Mozilla/NativeMessagingHosts') elif browser == BROWSER.VIVALDI: return os.path.join(home_address, 'Library/Application Support/Vivaldi/NativeMessagingHosts') elif browser == BROWSER.OPERA: return os.path.join(home_address, 'Library/Application Support/Opera/NativeMessagingHosts') elif browser == BROWSER.BRAVE: return os.path.join(home_address, 'Library/Application Support/BraveSoftware/Brave-Browser/NativeMessagingHosts') elif browser == BROWSER.LIBREWOLF: return os.path.join(home_address, 'Library/LibreWolf/NativeMessagingHosts') elif os_type == OS.WINDOWS: if browser in BROWSER.CHROME_FAMILY: return os.path.join(home_address, 'AppData', 'Local', 'persepolis_download_manager', 'chrome') elif browser in BROWSER.FIREFOX_FAMILY: return os.path.join(home_address, 'AppData', 'Local', 'persepolis_download_manager', 'firefox') else: return None def browserIntegration(browser): native_message_folder = getNativeMessageFolder(browser) intermediary, logg_message = getIntermediaryPath() webextension_json_connector = nativeMessageHostFile(browser, intermediary) json_done = installNativeMessageHost(browser, native_message_folder, webextension_json_connector) intermediary_done = installIntermidiary(intermediary) return json_done, intermediary_done, logg_message def browserIsolation(browser): native_message_folder = getNativeMessageFolder(browser) logg_message = uninstallNativeMessageHost(browser, native_message_folder) if os_type == OS.WINDOWS: logg_message2 = removeRegistryKey(browser) else: logg_message2 = '' return logg_message, logg_message2 ================================================ FILE: persepolis/scripts/browser_plugin_queue.py ================================================ # -*- coding: utf-8 -*- # 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 . try: from PySide6.QtCore import Qt, QPoint, QSize, QThread, Signal, QDir from PySide6.QtWidgets import QTableWidgetItem, QFileDialog from PySide6.QtGui import QIcon except ImportError: from PyQt5.QtCore import Qt, QPoint, QSize, QThread, QDir from PyQt5.QtWidgets import QTableWidgetItem, QFileDialog from PyQt5.QtCore import pyqtSignal as Signal from PyQt5.QtGui import QIcon from persepolis.gui.text_queue_ui import TextQueue_Ui from persepolis.scripts import logger from persepolis.scripts import spider from functools import partial from copy import deepcopy import os # This thread finds filename class QueueSpiderThread(QThread): QUEUESPIDERRETURNEDFILENAME = Signal(str) def __init__(self, dict_): QThread.__init__(self) self.dict_ = dict_ def run(self): try: filename = spider.queueSpider(self.dict_) if filename: self.QUEUESPIDERRETURNEDFILENAME.emit(filename) else: logger.logObj.error( "Spider couldn't find download information", exc_info=True) except Exception as e: logger.logObj.error( "Spider couldn't find download information", exc_info=True) logger.logObj.error( str(e), exc_info=True) class BrowserPluginQueue(TextQueue_Ui): def __init__(self, parent, list_of_links, callback, persepolis_setting): super().__init__(persepolis_setting) self.persepolis_setting = persepolis_setting self.callback = callback self.parent = parent self.list_of_links = list_of_links global icons icons = ':/' + \ str(self.persepolis_setting.value('settings/icons')) + '/' self.list_of_links.reverse() k = 1 for dict_ in self.list_of_links: # add row to the links_table self.links_table.insertRow(0) # file_name if 'out' in dict_.keys(): if dict_['out']: file_name = dict_['out'] else: file_name = '***' else: file_name = '***' if file_name == '***': # spider finds file name new_spider = QueueSpiderThread(dict_) self.parent.threadPool.append(new_spider) self.parent.threadPool[-1].start() self.parent.threadPool[-1].QUEUESPIDERRETURNEDFILENAME.connect( partial(self.parent.queueSpiderCallBack, child=self, row_number=len(self.list_of_links) - k)) k = k + 1 item = QTableWidgetItem(file_name) # add checkbox to the item item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) item.setCheckState(Qt.Checked) # insert file_name self.links_table.setItem(0, 0, item) # find link link = dict_['link'] item = QTableWidgetItem(str(link)) # insert link self.links_table.setItem(0, 1, item) # get categories name and add them to add_queue_comboBox categories_list = self.parent.persepolis_db.categoriesList() for queue in categories_list: if queue != 'All Downloads': self.add_queue_comboBox.addItem(queue) self.add_queue_comboBox.addItem( QIcon(icons + 'add_queue'), 'Create new queue') # entry initialization global connections connections = int( self.persepolis_setting.value('settings/connections')) global download_path download_path = str( self.persepolis_setting.value('settings/download_path')) # initialization self.connections_spinBox.setValue(connections) self.download_folder_lineEdit.setText(download_path) self.download_folder_lineEdit.setEnabled(False) # ip_lineEdit initialization settings_ip = self.persepolis_setting.value( 'add_link_initialization/ip', None) if settings_ip: self.ip_lineEdit.setText(str(settings_ip)) # proxy user lineEdit initialization settings_proxy_user = self.persepolis_setting.value( 'add_link_initialization/proxy_user', None) if settings_proxy_user: self.proxy_user_lineEdit.setText(str(settings_proxy_user)) # port_spinBox initialization settings_port = self.persepolis_setting.value( 'add_link_initialization/port', 0) self.port_spinBox.setValue(int(int(settings_port))) # download UserName initialization settings_download_user = self.persepolis_setting.value( 'add_link_initialization/download_user', None) if settings_download_user: self.download_user_lineEdit.setText(str(settings_download_user)) # http or socks5 initialization settings_proxy_type = self.persepolis_setting.value( 'add_link_initialization/proxy_type', None) # default is http if settings_proxy_type == 'socks5': self.socks5_radioButton.setChecked(True) elif settings_proxy_type == 'https': self.https_radioButton.setChecked(True) else: self.http_radioButton.setChecked(True) # connect folder_pushButton self.folder_pushButton.clicked.connect(self.changeFolder) # connect OK and cancel button self.cancel_pushButton.clicked.connect(self.close) self.ok_pushButton.clicked.connect(self.okButtonPressed) # connect select_all_pushButton deselect_all_pushButton self.select_all_pushButton.clicked.connect(self.selectAll) self.deselect_all_pushButton.clicked.connect(self.deselectAll) # frames and checkBoxes self.proxy_frame.setEnabled(False) self.proxy_checkBox.toggled.connect(self.proxyFrame) self.download_frame.setEnabled(False) self.download_checkBox.toggled.connect(self.downloadFrame) self.queue_tabWidget.currentChanged.connect(self.currentTabChanged) # set focus to ok button self.ok_pushButton.setFocus() # add_queue_comboBox event self.add_queue_comboBox.currentIndexChanged.connect(self.queueChanged) # set window size and position size = self.persepolis_setting.value('TextQueue/size', QSize(700, 500)) position = self.persepolis_setting.value( 'TextQueue/position', QPoint(300, 300)) self.resize(size) self.move(position) # if user clicked on link_tab so send spider again # perhaps proxy or user password , ... set! def currentTabChanged(self, index): if index == 0: # get proxy information ip, port, proxy_user, proxy_passwd, proxy_type = self.getProxyInformation() # get download username and password information download_user, download_passwd = self.getUserPass() k = 1 for dict_ in self.list_of_links: # file_name if 'out' in dict_.keys(): if dict_['out']: file_name = dict_['out'] else: file_name = '***' else: file_name = '***' if file_name == '***': dict_['ip'] = ip dict_['port'] = port dict_['proxy_user'] = proxy_user dict_['proxy_passwd'] = proxy_passwd dict_['proxy_type'] = proxy_type dict_['download_user'] = download_user dict_['download_passwd'] = download_passwd # spider finds file name new_spider = QueueSpiderThread(dict_) self.parent.threadPool.append(new_spider) self.parent.threadPool[-1].start() self.parent.threadPool[-1].QUEUESPIDERRETURNEDFILENAME.connect( partial(self.parent.queueSpiderCallBack, child=self, row_number=len(self.list_of_links) - k)) k = k + 1 # this method selects all links in links_table def selectAll(self, button): for i in range(self.links_table.rowCount()): item = self.links_table.item(i, 0) item.setCheckState(Qt.Checked) # this method unchecks all check boxes def deselectAll(self, button): for i in range(self.links_table.rowCount()): item = self.links_table.item(i, 0) item.setCheckState(Qt.Unchecked) # this method is called, when user changes add_queue_comboBox def queueChanged(self, combo): if str(self.add_queue_comboBox.currentText()) == 'Create new queue': # if user want to create new queue, then call createQueue method from mainwindow(parent) new_queue = self.parent.createQueue(combo) if new_queue: # clear comboBox self.add_queue_comboBox.clear() # load queue list again! queues_list = self.parent.persepolis_db.categoriesList() for queue in queues_list: if queue != 'All Downloads': self.add_queue_comboBox.addItem(queue) self.add_queue_comboBox.addItem( QIcon(icons + 'add_queue'), 'Create new queue') # finding index of new_queue and setting comboBox for it index = self.add_queue_comboBox.findText(str(new_queue)) self.add_queue_comboBox.setCurrentIndex(index) else: self.add_queue_comboBox.setCurrentIndex(0) # activate frames if checkBoxes checked def proxyFrame(self, checkBox): if self.proxy_checkBox.isChecked(): self.proxy_frame.setEnabled(True) else: self.proxy_frame.setEnabled(False) def downloadFrame(self, checkBox): if self.download_checkBox.isChecked(): self.download_frame.setEnabled(True) else: self.download_frame.setEnabled(False) def changeFolder(self, button): fname = QFileDialog.getExistingDirectory( self, 'Select a directory', download_path) if fname: # Returns pathName with the '/' separators converted to separators that are appropriate for the underlying operating system. # On Windows, toNativeSeparators("c:/winnt/system32") returns # "c:\winnt\system32". fname = QDir.toNativeSeparators(fname) if os.path.isdir(fname): self.download_folder_lineEdit.setText(fname) # this method returns proxy information. def getProxyInformation(self): # http, https or socks5 proxy if self.http_radioButton.isChecked() is True: proxy_type = 'http' elif self.https_radioButton.isChecked() is True: proxy_type = 'https' else: proxy_type = 'socks5' # get proxy information if not (self.proxy_checkBox.isChecked()): ip = None port = None proxy_user = None proxy_passwd = None proxy_type = None else: ip = self.ip_lineEdit.text() if not (ip): ip = None port = self.port_spinBox.value() if not (port): port = None proxy_user = self.proxy_user_lineEdit.text() if not (proxy_user): proxy_user = None proxy_passwd = self.proxy_pass_lineEdit.text() if not (proxy_passwd): proxy_passwd = None return ip, port, proxy_user, proxy_passwd, proxy_type def getUserPass(self): # get download username and password information if not (self.download_checkBox.isChecked()): download_user = None download_passwd = None else: download_user = self.download_user_lineEdit.text() if not (download_user): download_user = None download_passwd = self.download_pass_lineEdit.text() if not (download_passwd): download_passwd = None return download_user, download_passwd def okButtonPressed(self, button): # write user's input data to init file self.persepolis_setting.setValue( 'add_link_initialization/ip', self.ip_lineEdit.text()) self.persepolis_setting.setValue( 'add_link_initialization/port', self.port_spinBox.value()) self.persepolis_setting.setValue( 'add_link_initialization/proxy_user', self.proxy_user_lineEdit.text()) self.persepolis_setting.setValue( 'add_link_initialization/download_user', self.download_user_lineEdit.text()) # get proxy information ip, port, proxy_user, proxy_passwd, proxy_type = self.getProxyInformation() if proxy_type is not None: self.persepolis_setting.setValue('add_link_initialization/proxy_type', proxy_type) # get download username and password information download_user, download_passwd = self.getUserPass() category = str(self.add_queue_comboBox.currentText()) connections = self.connections_spinBox.value() download_path = self.download_folder_lineEdit.text() dict_ = {'out': None, 'start_time': None, 'end_time': None, 'link': None, 'ip': ip, 'port': port, 'proxy_user': proxy_user, 'proxy_passwd': proxy_passwd, 'proxy_type': proxy_type, 'download_user': download_user, 'download_passwd': download_passwd, 'connections': connections, 'limit_value': 10, 'download_path': download_path, 'referer': None, 'load_cookies': None, 'user_agent': None, 'header': None, 'after_download': None } # find checked links in links_table self.list_of_links.reverse() self.add_link_dictionary_list = [] i = 0 for row in range(self.links_table.rowCount()): item = self.links_table.item(row, 0) # if item is checked if (item.checkState() == Qt.Checked): # Create a copy from dict_ and add it to add_link_dictionary_list self.add_link_dictionary_list.append( deepcopy(dict_)) # get link and add it to dict_ link = self.links_table.item(row, 1).text() self.add_link_dictionary_list[i]['link'] = str(link) # add file name to the dict_ self.add_link_dictionary_list[i]['out'] = self.links_table.item( row, 0).text() input_dict = self.list_of_links[row] keys_list = ['referer', 'header', 'user-agent', 'load_cookies'] for key in keys_list: if key in input_dict: self.add_link_dictionary_list[i][key] = dict_[key] i = i + 1 # reverse list self.add_link_dictionary_list.reverse() # Create callback for mainwindow self.callback(self.add_link_dictionary_list, category) # close window self.close() # close window with ESC key def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.close() def closeEvent(self, event): self.persepolis_setting.setValue('TextQueue/size', self.size()) self.persepolis_setting.setValue('TextQueue/position', self.pos()) self.persepolis_setting.sync() event.accept() def changeIcon(self, icons): icons = ':/' + str(icons) + '/' self.folder_pushButton.setIcon(QIcon(icons + 'folder')) self.ok_pushButton.setIcon(QIcon(icons + 'ok')) self.cancel_pushButton.setIcon(QIcon(icons + 'remove')) ================================================ FILE: persepolis/scripts/bubble.py ================================================ # -*- coding: utf-8 -*- # 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 . from persepolis.scripts.play import playNotification from persepolis.scripts.osCommands import makeDirs from persepolis.gui import resources from persepolis.constants import OS import platform import os from persepolis.scripts import logger from persepolis.scripts.download_link import DownloadSingleLink try: from PySide6.QtCore import QSettings from PySide6.QtGui import QIcon except ImportError: from PyQt5.QtCore import QSettings from PyQt5.QtGui import QIcon # platform os_type = platform.system() global dasbus_is_installed if os_type in OS.LINUX: try: from dasbus.connection import SessionMessageBus dasbus_is_installed = True except ImportError: dasbus_is_installed = False logger.sendToLog('python3-dasbus is not installed', 'ERROR') # notifySend use notify-send program in user's system for sending notifications # and use playNotification function in play.py file for playing sound # notifications # user home address home_address = os.path.expanduser("~") # When Persepolis is running on Linux, BSD, and MacOSX operating systems, # the program will check for the presence of notification sound files, # and if there are no files, it will download them from GitHub. # The Windows operating system uses its own notification sounds, # so there is no need for notification sound files in Windows. def checkNotificationSounds(): if os_type in OS.UNIX_LIKE: # for linux and bsd # ~/.local/share/persepolis_download_manager/sounds notification_directory = os.path.join(home_address, '.local/share/persepolis_download_manager/sounds') elif os_type in OS.OSX: # for mac # ~/Library/Application Support//sounds/ notification_directory = os.path.join(home_address, 'Library/Application Support/persepolis_download_manager/sounds/') else: # windows return True notification_sounds = ['ok.wav', 'fail.wav', 'warning.wav', 'queue.wav'] file_availability = 0 for file in notification_sounds: file_path = os.path.join(home_address, notification_directory, file) if os.path.exists(file_path): file_availability += 1 if file_availability == 4: return True else: logger.sendToLog('Notification sounds are not available', 'ERROR') return False # this function downloads notification sounds from github for Linux, BSD and MacOSX def createNotificationSounds(main_window): # create a directory for sounds in: if os_type in OS.UNIX_LIKE: # for linux and bsd # ~/.local/share/persepolis_download_manager/sounds sounds_directory = os.path.join(home_address, '.local/share/persepolis_download_manager/sounds') elif os_type in OS.OSX: # for mac # ~/Library/Application Support//sounds/ sounds_directory = os.path.join(home_address, 'Library/Application Support/persepolis_download_manager/sounds/') # create directory makeDirs(sounds_directory) # file names notification_sounds = ['ok.wav', 'fail.wav', 'warning.wav', 'queue.wav'] # download links file_links = ['https://raw.githubusercontent.com/persepolisdm/persepolis/refs/heads/master/resources/notification%20sounds/ok.wav', 'https://raw.githubusercontent.com/persepolisdm/persepolis/refs/heads/master/resources/notification%20sounds/fail.wav', 'https://raw.githubusercontent.com/persepolisdm/persepolis/refs/heads/master/resources/notification%20sounds/warning.wav', 'https://raw.githubusercontent.com/persepolisdm/persepolis/refs/heads/master/resources/notification%20sounds/queue.wav'] # download notification sound files from github. # The result will be written to the log. for i in range(4): new_download = DownloadSingleLink(file_links[i], os.path.join(sounds_directory, notification_sounds[i])) main_window.threadPool.append(new_download) main_window.threadPool[-1].start() return True def getSoundPath(name): # create a directory for sounds in: if os_type in OS.UNIX_LIKE: # for linux and bsd # ~/.local/share/persepolis_download_manager/sounds sounds_directory = os.path.join(home_address, '.local/share/persepolis_download_manager/sounds') elif os_type in OS.OSX: # for mac # ~/Library/Application Support//sounds/ sounds_directory = os.path.join(home_address, 'Library/Application Support/persepolis_download_manager/sounds/') # Windows else: return None file_name = name + '.wav' file_path = os.path.join(sounds_directory, file_name) # return file_path if it exists. if os.path.exists(file_path): return file_path else: return None def notifySend(message1, message2, time, sound, parent=None): file = getSoundPath(sound) if file is not None: playNotification(file) # load settings persepolis_setting = QSettings('persepolis_download_manager', 'persepolis') enable_notification = persepolis_setting.value('settings/notification') time = str(time) message1 = str(message1) message2 = str(message2) # using Qt notification or Native system notification if enable_notification == 'QT notification': parent.system_tray_icon.showMessage(message1, message2, QIcon.fromTheme('persepolis-tray', QIcon(':/persepolis-tray.svg')), 10000) else: if os_type in OS.LINUX and dasbus_is_installed: bus = SessionMessageBus() proxy = bus.get_proxy( "org.freedesktop.Notifications", "/org/freedesktop/Notifications" ) proxy.Notify( "Persepolis", 0, QIcon.fromTheme('persepolis-tray', QIcon(':/persepolis-tray.svg')).name(), message1, message2, [], {}, 10000) else: parent.system_tray_icon.showMessage(message1, message2, QIcon.fromTheme('persepolis-tray', QIcon(':/persepolis-tray.svg')), 10000) ================================================ FILE: persepolis/scripts/check_proxy.py ================================================ # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import re import subprocess import urllib import os from persepolis.scripts.useful_tools import osAndDesktopEnvironment from persepolis.scripts import logger from persepolis.constants import OS # get proxy function def getProxy(): socks_proxy = False # find os and desktop environment os_type, desktop = osAndDesktopEnvironment() # destop == 'ubuntu:GNOME' to destop == 'GNOME' try: tmp = re.search(r'.*:(.*)', desktop) if tmp is not None: desktop = tmp.group(1) except Exception: pass # write in log platform = 'platform : ' + os_type logger.sendToLog(platform, "INITIALIZATION") proxy = {} if os_type in OS.UNIX_LIKE: if desktop is None: desktop_env_type = 'Desktop Environment not detected!' else: desktop_env_type = 'Desktop environment: ' + str(desktop) logger.sendToLog(desktop_env_type, "INITIALIZATION") # check if it is KDE if desktop == 'kde': # creat empty list for proxies proxysource = {} # user home directory path home_address = os.path.expanduser("~") # get proxy file content try: plasma_proxy_config_file_path = os.path.join( home_address, '.config', 'kioslaverc' ) except Exception: logger.sendToLog('no proxy file detected', 'INITIALIZATION') # check if proxy file exists if os.path.isfile(plasma_proxy_config_file_path): # read kde plasma proxy config file try: with open(plasma_proxy_config_file_path) as proxyfile: for line in proxyfile: name, var = line.partition("=")[::2] proxysource[name.strip()] = str(var) except (OSError, InterruptedError, ValueError): logger.sendToLog('no proxy file detected', 'INITIALIZATION') # check proxy enabled as manually if proxysource['ProxyType'].split('\n')[0] == '1': # get ftp proxy try: proxy['ftp_proxy_port'] = proxysource['ftpProxy'].split(' ')[1].replace("/", "").replace("\n", "") proxy['ftp_proxy_ip'] = proxysource['ftpProxy'].split(' ')[0].split('//')[1] except Exception: logger.sendToLog('no manual ftp proxy detected', 'INITIALIZATION') # get http proxy try: proxy['http_proxy_port'] = proxysource['httpProxy'].split(' ')[1].replace("/", "").replace("\n", "") proxy['http_proxy_ip'] = proxysource['httpProxy'].split(' ')[0].split('//')[1] except Exception: logger.sendToLog('no manual http proxy detected', 'INITIALIZATION') # get https proxy try: proxy['https_proxy_port'] = proxysource['httpsProxy'].split( ' ')[1].replace("/", "").replace("\n", "") proxy['https_proxy_ip'] = proxysource['httpsProxy'].split(' ')[0].split('//')[1] except Exception: logger.sendToLog('no manual https proxy detected', 'INITIALIZATION') # get socks proxy try: socks_proxy = proxysource['socksProxy'].split(' ')[0].split('//')[1] except Exception: socks_proxy = False # proxy disabled else: logger.sendToLog('no manual proxy detected', 'INITIALIZATION') # proxy file not exists else: logger.sendToLog('no proxy file detected', 'INITIALIZATION') # Detect proxy from GNOME Desktop elif desktop == 'gnome': process = subprocess.run(['gsettings', 'get', 'org.gnome.system.proxy', 'mode'], stdout=subprocess.PIPE) mode = re.search(r'manual', process.stdout.decode('utf-8')) if mode is not None: try: process = subprocess.run(['gsettings', 'get', 'org.gnome.system.proxy.http', 'host'], stdout=subprocess.PIPE) proxy['http_proxy_ip'] = re.search(r"\'([\w0-9\.]+)\'", process.stdout.decode('utf-8')).group(1) process = subprocess.run(['gsettings', 'get', 'org.gnome.system.proxy.http', 'port'], stdout=subprocess.PIPE) proxy['http_proxy_port'] = process.stdout.decode('utf-8') except Exception: logger.sendToLog('no http proxy detected', 'INITIALIZATION') try: process = subprocess.run(['gsettings', 'get', 'org.gnome.system.proxy.https', 'host'], stdout=subprocess.PIPE) proxy['https_proxy_ip'] = re.search(r"\'([\w0-9\.]+)\'", process.stdout.decode('utf-8')).group(1) process = subprocess.run(['gsettings', 'get', 'org.gnome.system.proxy.https', 'port'], stdout=subprocess.PIPE) proxy['https_proxy_port'] = process.stdout.decode('utf-8') except Exception: logger.sendToLog('no https proxy detected', 'INITIALIZATION') try: process = subprocess.run(['gsettings', 'get', 'org.gnome.system.proxy.ftp', 'host'], stdout=subprocess.PIPE) proxy['ftp_proxy_ip'] = re.search(r"\'([\w0-9\.]+)\'", process.stdout.decode('utf-8')).group(1) process = subprocess.run(['gsettings', 'get', 'org.gnome.system.proxy.ftp', 'port'], stdout=subprocess.PIPE) proxy['ftp_proxy_port'] = process.stdout.decode('utf-8') except Exception: logger.sendToLog('no ftp proxy detected', 'INITIALIZATION') try: process = subprocess.run(['gsettings', 'get', 'org.gnome.system.proxy.socks', 'host'], stdout=subprocess.PIPE) # value = re.search(r"\'([\w0-9\.]+)\'", process.stdout.decode('utf-8')).group(1) socks_proxy = True except Exception: socks_proxy = False else: logger.sendToLog('no manual proxy detected', 'INITIALIZATION') # if it is windows,mac and other linux desktop else: # get proxies proxysource = urllib.request.getproxies() # get http proxy try: proxy['http_proxy_ip'] = proxysource['http'].split(':')[1].replace('//', '') proxy['http_proxy_port'] = proxysource['http'].split(':')[2].replace("/", "").replace("\n", "") except Exception: logger.sendToLog('no http proxy detected', 'INITIALIZATION') # get https proxy try: proxy['https_proxy_ip'] = proxysource['https'].split(':')[1].replace('//', '') proxy['https_proxy_port'] = proxysource['https'].split(':')[2].replace("/", "").replace("\n", "") except Exception: logger.sendToLog('no https proxy detected', 'INITIALIZATION') # get ftp proxy try: proxy['ftp_proxy_ip'] = proxysource['ftp'].split(':')[1].replace('//', '') proxy['ftp_proxy_port'] = proxysource['ftp'].split(':')[2].replace("/", "").replace("\n", "") except Exception: logger.sendToLog('no ftp proxy detected', 'INITIALIZATION') # get socks proxy try: # if it is unity if desktop == 'unity7': socks_proxy = proxysource['all'].split(':')[1].replace('//', '') # if it is Mac OS elif os_type == OS.OSX: validKeys = ['SOCKSEnable'] # get proxies list using scutil command and parse it in tmp list mac_tmp_proxies_list = {} proxyList = subprocess.run(['scutil', '--proxy'], stdout=subprocess.PIPE) for line in proxyList.stdout.decode('utf-8').split('\n'): words = line.split() if len(words) == 3 and words[0] in validKeys: mac_tmp_proxies_list[words[0]] = words[2] if mac_tmp_proxies_list['SOCKSEnable'] == '1': socks_proxy = True else: socks_proxy = False # others except KDE,Mac OS,gnome,unity7 else: socks_proxy = proxysource['socks'].split(':')[1].replace('//', '') except Exception: socks_proxy = False # check if just socks proxy exists key_is_available = False key_list = ['http_proxy_ip', 'https_proxy_ip', 'ftp_proxy_ip'] for key in key_list: if key in proxy.keys(): key_is_available = True if not key_is_available and socks_proxy: # all print just for debugging socks_message = "persepolis and aria2 don't support socks\n\ you must convert socks proxy to http proxy.\n\ Please read this for more help:\n\ https://github.com/persepolisdm/persepolis/wiki/Privoxy" logger.sendToLog(socks_message, 'ERROR') # return results proxy_log_message = 'proxy: ' + str(proxy) logger.sendToLog(proxy_log_message, 'INITIALIZATION') return proxy ================================================ FILE: persepolis/scripts/compatibility.py ================================================ # -*- coding: utf-8 -*- # 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 . from persepolis.scripts.useful_tools import determineConfigFolder from persepolis.scripts.osCommands import remove, removeDir from persepolis.scripts.data_base import PersepolisDB from persepolis.scripts.newopen import readList import os # config_folder config_folder = determineConfigFolder() download_info_folder = os.path.join(config_folder, "download_info") # download_list_file contains GID of all downloads download_list_file = os.path.join(config_folder, "download_list_file") # download_list_file_active for active downloads download_list_file_active = os.path.join( config_folder, "download_list_file_active") # queues_list contains queues name queues_list_file = os.path.join(config_folder, 'queues_list') # category_folder contains some file , and every files named with queues . # every file contains gid of downloads for that queue category_folder = os.path.join(config_folder, 'category_folder') # queue_info_folder is contains queues information(start time,end # time,limit speed , ...) queue_info_folder = os.path.join(config_folder, "queue_info") # single_downloads_list_file contains gid of non categorized downloads single_downloads_list_file = os.path.join(category_folder, "Single Downloads") # this script for compatibility between Version 2 and 3 def compatibility(): if os.path.isfile(queues_list_file): persepolis_db = PersepolisDB() # add categories to category_db_table in data_base f = open(queues_list_file) queues_list = f.readlines() f.close() # remove queues_list_file remove(queues_list_file) else: return category_list = ['All Downloads', 'Single Downloads'] for line in queues_list: queue_name = line.strip() category_list.append(queue_name) for category in category_list: gid_list = [] if category == 'All Downloads': category_info_file = download_list_file else: category_info_file = os.path.join(category_folder, category) f = open(category_info_file) category_info_file_list = f.readlines() f.close() for item in category_info_file_list: gid = item.strip() gid_list.append(gid) category_dict = {'category': category, 'start_time_enable': 'no', 'start_time': '0:0', 'end_time_enable': 'no', 'end_time': '0:0', 'reverse': 'no', 'limit_enable': 'no', 'limit_value': '0K', 'after_download': 'no', 'gid_list': str(gid_list) } # add category to data_base if category == 'All Downloads' or category == 'Single Downloads': persepolis_db.updateCategoryTable([category_dict]) else: persepolis_db.insertInCategoryTable(category_dict) # add items to download_db_table in data base f_download_list_file = open(download_list_file) download_list_file_lines = f_download_list_file.readlines() f_download_list_file.close() for line in download_list_file_lines: gid = line.strip() download_info_file = os.path.join(download_info_folder, gid) download_info_file_list = readList(download_info_file) add_link_dictionary = download_info_file_list[9] dict = {'file_name': download_info_file_list[0], 'status': download_info_file_list[1], 'size': download_info_file_list[2], 'downloaded_size': download_info_file_list[3], 'percent': download_info_file_list[4], 'connections': download_info_file_list[5], 'rate': download_info_file_list[6], 'estimate_time_left': download_info_file_list[7], 'gid': download_info_file_list[8], 'link': add_link_dictionary['link'], 'first_try_date': download_info_file_list[10], 'last_try_date': download_info_file_list[11], 'category': download_info_file_list[12]} add_link_dictionary['gid'] = download_info_file_list[8] if 'user-agent' in add_link_dictionary.keys(): add_link_dictionary['user_agent'] = add_link_dictionary.pop('user-agent') if 'load-cookies' in add_link_dictionary.keys(): add_link_dictionary['load_cookies'] = add_link_dictionary.pop('load-cookies') add_link_dictionary['limit_value'] = 0 keys_list = ['gid', 'out', 'start_time', 'end_time', 'link', 'ip', 'port', 'proxy_user', 'proxy_passwd', 'download_user', 'download_passwd', 'connections', 'limit_value', 'download_path', 'referer', 'load_cookies', 'user_agent', 'header', 'after_download'] for key in keys_list: # if a key is missed in dict, # then add this key to the dict and assign None value for the key. if key not in add_link_dictionary.keys(): add_link_dictionary[key] = None # write information in data_base persepolis_db.insertInDownloadTable([dict]) persepolis_db.insertInAddLinkTable([add_link_dictionary]) # close connections persepolis_db.closeConnections() # remove unwanted files and folders for file in [download_list_file, download_list_file_active]: remove(file) for folder in [category_folder, queue_info_folder]: removeDir(folder) ================================================ FILE: persepolis/scripts/data_base.py ================================================ # -*- coding: utf-8 -*- """ 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 . """ from persepolis.scripts.useful_tools import determineConfigFolder from time import sleep import sqlite3 import random import ast import os # download manager config folder . config_folder = determineConfigFolder() # persepolis tmp folder path persepolis_tmp = os.path.join(config_folder, 'persepolis_tmp') # This class manages TempDB # TempDB contains gid of active downloads in every session. class TempDB(): def __init__(self): # temp_db saves in RAM # temp_db_connection self.temp_db_connection = sqlite3.connect(':memory:', check_same_thread=False) # temp_db_cursor self.temp_db_cursor = self.temp_db_connection.cursor() # create a lock for data base self.lock = False # this method locks data base. # this is pervent accessing data base simultaneously. def lockCursor(self): while self.lock: rand_float = random.uniform(0, 0.5) sleep(rand_float) self.lock = True # temp_db_table contains gid of active downloads. def createTables(self): # lock data base self.lockCursor() self.temp_db_cursor.execute("""CREATE TABLE IF NOT EXISTS single_db_table( ID INTEGER, gid TEXT PRIMARY KEY, status TEXT, shutdown TEXT )""") self.temp_db_cursor.execute("""CREATE TABLE IF NOT EXISTS queue_db_table( ID INTEGER, category TEXT PRIMARY KEY, shutdown TEXT )""") self.temp_db_connection.commit() self.lock = False # insert new item in single_db_table def insertInSingleTable(self, gid): # lock data base self.lockCursor() self.temp_db_cursor.execute("""INSERT INTO single_db_table VALUES( NULL, '{}', 'active', NULL)""".format(gid)) self.temp_db_connection.commit() self.lock = False # insert new item in queue_db_table def insertInQueueTable(self, category): # lock data base self.lockCursor() self.temp_db_cursor.execute("""INSERT INTO queue_db_table VALUES( NULL, '{}', NULL)""".format(category)) self.temp_db_connection.commit() self.lock = False # this method updates single_db_table def updateSingleTable(self, dict_): # lock data base self.lockCursor() keys_list = ['gid', 'shutdown', 'status' ] for key in keys_list: # if a key is missed in dict_, # then add this key to the dict_ and assign None value for the key. if key not in dict_.keys(): dict_[key] = None # update data base if value for the keys is not None self.temp_db_cursor.execute("""UPDATE single_db_table SET shutdown = coalesce(:shutdown, shutdown), status = coalesce(:status, status) WHERE gid = :gid""", dict_) self.temp_db_connection.commit() self.lock = False # this method updates queue_db_table def updateQueueTable(self, dict_): # lock data base self.lockCursor() keys_list = ['category', 'shutdown'] for key in keys_list: # if a key is missed in dict_, # then add this key to the dict_ and assign None value for the key. if key not in dict_.keys(): dict_[key] = None # update data base if value for the keys is not None self.temp_db_cursor.execute("""UPDATE queue_db_table SET shutdown = coalesce(:shutdown, shutdown) WHERE category = :category""", dict_) self.temp_db_connection.commit() self.lock = False # this method returns gid of active downloads def returnActiveGids(self): # lock data base self.lockCursor() self.temp_db_cursor.execute("""SELECT gid FROM single_db_table WHERE status = 'active'""") list_ = self.temp_db_cursor.fetchall() self.lock = False gid_list = [] for tuple_ in list_: gid = tuple_[0] gid_list.append(gid) return gid_list # this method returns shutdown value for specific gid def returnGid(self, gid): # lock data base self.lockCursor() self.temp_db_cursor.execute("""SELECT shutdown, status FROM single_db_table WHERE gid = '{}'""".format(gid)) list_ = self.temp_db_cursor.fetchall() self.lock = False tuple_ = list_[0] dict_ = {'shutdown': str(tuple_[0]), 'status': tuple_[1]} return dict_ # This method returns values of columns for specific category def returnCategory(self, category): # lock data base self.lockCursor() self.temp_db_cursor.execute("""SELECT shutdown FROM queue_db_table WHERE category = '{}'""".format(category)) list_ = self.temp_db_cursor.fetchall() self.lock = False tuple_ = list_[0] dict_ = {'shutdown': tuple_[0]} return dict_ def resetDataBase(self): # lock data base self.lockCursor() # delete all items self.temp_db_cursor.execute("""DELETE FROM single_db_table""") self.temp_db_cursor.execute("""DELETE FROM queue_db_table""") # release lock self.lock = False # close connections def closeConnections(self): # lock data base self.lockCursor() self.temp_db_cursor.close() self.temp_db_connection.close() self.lock = False # plugins.db is store links, when browser plugins are send new links. # This class is managing plugin.db class PluginsDB(): def __init__(self): # plugins.db file path plugins_db_path = os.path.join(persepolis_tmp, 'plugins.db') # plugins_db_connection self.plugins_db_connection = sqlite3.connect(plugins_db_path, check_same_thread=False) # plugins_db_cursor self.plugins_db_cursor = self.plugins_db_connection.cursor() # create a lock for data base self.lock = False # this method locks data base. # this is pervent accessing data base simultaneously. def lockCursor(self): while self.lock: rand_float = random.uniform(0, 0.5) sleep(rand_float) self.lock = True # plugins_db_table contains links that sends by browser plugins. def createTables(self): # lock data base self.lockCursor() self.plugins_db_cursor.execute("""CREATE TABLE IF NOT EXISTS plugins_db_table( ID INTEGER PRIMARY KEY, link TEXT, referer TEXT, load_cookies TEXT, user_agent TEXT, header TEXT, out TEXT, status TEXT )""") self.plugins_db_connection.commit() # release lock self.lock = False # insert new items in plugins_db_table def insertInPluginsTable(self, list_): # lock data base self.lockCursor() for dict_ in list_: self.plugins_db_cursor.execute("""INSERT INTO plugins_db_table VALUES( NULL, :link, :referer, :load_cookies, :user_agent, :header, :out, 'new' )""", dict_) self.plugins_db_connection.commit() # release lock self.lock = False # this method returns all new links in plugins_db_table def returnNewLinks(self): # lock data base self.lockCursor() self.plugins_db_cursor.execute("""SELECT link, referer, load_cookies, user_agent, header, out FROM plugins_db_table WHERE status = 'new'""") list_ = self.plugins_db_cursor.fetchall() # chang all rows status to 'old' self.plugins_db_cursor.execute("""UPDATE plugins_db_table SET status = 'old' WHERE status = 'new'""") # commit changes self.plugins_db_connection.commit() # release lock self.lock = False # create new_list new_list = [] # put the information in tuple_s in dictionary format and add it to new_list for tuple_ in list_: dict_ = {'link': tuple_[0], 'referer': tuple_[1], 'load_cookies': tuple_[2], 'user_agent': tuple_[3], 'header': tuple_[4], 'out': tuple_[5] } new_list.append(dict_) # return results in list format! # every member of this list is a dictionary. # every dictionary contains download information return new_list # delete old links from data base def deleteOldLinks(self): # lock data base self.lockCursor() self.plugins_db_cursor.execute("""DELETE FROM plugins_db_table WHERE status = 'old'""") # commit changes self.plugins_db_connection.commit() # release lock self.lock = False # close connections def closeConnections(self): # lock data base self.lockCursor() self.plugins_db_cursor.close() self.plugins_db_connection.close() # release lock self.lock = False # persepolis main data base contains downloads information # This class is managing persepolis.db class PersepolisDB(): def __init__(self): # persepolis.db file path persepolis_db_path = os.path.join(config_folder, 'persepolis.db') # persepolis_db_connection self.persepolis_db_connection = sqlite3.connect(persepolis_db_path, check_same_thread=False) # turn FOREIGN KEY Support on! self.persepolis_db_connection.execute('pragma foreign_keys=ON') # persepolis_db_cursor self.persepolis_db_cursor = self.persepolis_db_connection.cursor() # Create a lock for data base self.lock = False # this method locks data base. # this is pervent accessing data base simultaneously. def lockCursor(self): while self.lock: rand_float = random.uniform(0, 0.5) sleep(rand_float) self.lock = True # queues_list contains name of categories and category settings def createTables(self): # lock data base self.lockCursor() # Create category_db_table and add 'All Downloads' and 'Single Downloads' to it self.persepolis_db_cursor.execute("""CREATE TABLE IF NOT EXISTS category_db_table( category TEXT PRIMARY KEY, start_time_enable TEXT, start_time TEXT, end_time_enable TEXT, end_time TEXT, reverse TEXT, limit_enable TEXT, limit_value TEXT, after_download TEXT, gid_list TEXT )""") # download table contains download table download items information self.persepolis_db_cursor.execute("""CREATE TABLE IF NOT EXISTS download_db_table( file_name TEXT, status TEXT, size TEXT, downloaded_size TEXT, percent TEXT, connections TEXT, rate TEXT, estimate_time_left TEXT, gid TEXT PRIMARY KEY, link TEXT, first_try_date TEXT, last_try_date TEXT, category TEXT, FOREIGN KEY(category) REFERENCES category_db_table(category) ON UPDATE CASCADE ON DELETE CASCADE )""") # addlink_db_table contains addlink window download information self.persepolis_db_cursor.execute("""CREATE TABLE IF NOT EXISTS addlink_db_table( ID INTEGER PRIMARY KEY, gid TEXT, out TEXT, start_time TEXT, end_time TEXT, link TEXT, ip TEXT, port TEXT, proxy_user TEXT, proxy_passwd TEXT, download_user TEXT, download_passwd TEXT, connections TEXT, limit_value TEXT, download_path TEXT, referer TEXT, load_cookies TEXT, user_agent TEXT, header TEXT, after_download TEXT, proxy_type TEXT, FOREIGN KEY(gid) REFERENCES download_db_table(gid) ON UPDATE CASCADE ON DELETE CASCADE )""") # video_finder_db_table contains addlink window download information self.persepolis_db_cursor.execute("""CREATE TABLE IF NOT EXISTS video_finder_db_table( ID INTEGER PRIMARY KEY, video_gid TEXT, audio_gid TEXT, video_completed TEXT, audio_completed TEXT, muxing_status TEXT, checking TEXT, download_path TEXT, FOREIGN KEY(video_gid) REFERENCES download_db_table(gid) ON DELETE CASCADE, FOREIGN KEY(audio_gid) REFERENCES download_db_table(gid) ON DELETE CASCADE )""") self.persepolis_db_connection.execute("""CREATE TABLE IF NOT EXISTS video_finder_db_table2( ID INTEGER PRIMARY KEY, gid TEXT, download_status TEXT, file_name TEXT, eta TEXT, download_speed_str TEXT, downloaded_size REAL, file_size REAL, download_percent INT, fragments TEXT, error_message TEXT, FOREIGN KEY(gid) REFERENCES download_db_table(gid) ON DELETE CASCADE ON UPDATE CASCADE )""") self.persepolis_db_connection.commit() # job is done! open the lock self.lock = False # add 'All Downloads' and 'Single Downloads' to the category_db_table if they wasn't added. answer = self.searchCategoryInCategoryTable('All Downloads') if not (answer): all_downloads_dict = {'category': 'All Downloads', 'start_time_enable': 'no', 'start_time': '0:0', 'end_time_enable': 'no', 'end_time': '0:0', 'reverse': 'no', 'limit_enable': 'no', 'limit_value': '0K', 'after_download': 'no', 'gid_list': '[]' } single_downloads_dict = {'category': 'Single Downloads', 'start_time_enable': 'no', 'start_time': '0:0', 'end_time_enable': 'no', 'end_time': '0:0', 'reverse': 'no', 'limit_enable': 'no', 'limit_value': '0K', 'after_download': 'no', 'gid_list': '[]' } self.insertInCategoryTable(all_downloads_dict) self.insertInCategoryTable(single_downloads_dict) # add default queue with the name 'Scheduled Downloads' answer = self.searchCategoryInCategoryTable('Scheduled Downloads') if not (answer): scheduled_downloads_dict = {'category': 'Scheduled Downloads', 'start_time_enable': 'no', 'start_time': '0:0', 'end_time_enable': 'no', 'end_time': '0:0', 'reverse': 'no', 'limit_enable': 'no', 'limit_value': '0K', 'after_download': 'no', 'gid_list': '[]' } self.insertInCategoryTable(scheduled_downloads_dict) # insert new category in category_db_table def insertInCategoryTable(self, dict_): # lock data base self.lockCursor() self.persepolis_db_cursor.execute("""INSERT INTO category_db_table VALUES( :category, :start_time_enable, :start_time, :end_time_enable, :end_time, :reverse, :limit_enable, :limit_value, :after_download, :gid_list )""", dict_) self.persepolis_db_connection.commit() # job is done! open the lock self.lock = False # insert in to download_db_table in persepolis.db def insertInDownloadTable(self, list_): # lock data base self.lockCursor() for dict_ in list_: self.persepolis_db_cursor.execute("""INSERT INTO download_db_table VALUES( :file_name, :status, :size, :downloaded_size, :percent, :connections, :rate, :estimate_time_left, :gid, :link, :first_try_date, :last_try_date, :category )""", dict_) # commit changes self.persepolis_db_connection.commit() # job is done! open the lock self.lock = False if len(list_) != 0: # item must be inserted to gid_list of 'All Downloads' and gid_list of category # find download category and gid category = dict_['category'] # get category_dict from data base category_dict = self.searchCategoryInCategoryTable(category) # get all_downloads_dict from data base all_downloads_dict = self.searchCategoryInCategoryTable('All Downloads') # get gid_list category_gid_list = category_dict['gid_list'] all_downloads_gid_list = all_downloads_dict['gid_list'] for dict_ in list_: gid = dict_['gid'] # add gid of item to gid_list category_gid_list.append(gid) all_downloads_gid_list.append(gid) # update category_db_table self.updateCategoryTable([all_downloads_dict]) self.updateCategoryTable([category_dict]) # insert in addlink table in persepolis.db def insertInAddLinkTable(self, list_): # lock data base self.lockCursor() for dict_ in list_: # first column and after_download column is NULL self.persepolis_db_cursor.execute("""INSERT INTO addlink_db_table VALUES(NULL, :gid, :out, :start_time, :end_time, :link, :ip, :port, :proxy_user, :proxy_passwd, :download_user, :download_passwd, :connections, :limit_value, :download_path, :referer, :load_cookies, :user_agent, :header, NULL, :proxy_type )""", dict_) self.persepolis_db_connection.commit() # job is done! open the lock self.lock = False def insertInVideoFinderTable(self, list_): # lock data base self.lockCursor() for dictionary in list_: # first column is NULL self.persepolis_db_cursor.execute("""INSERT INTO video_finder_db_table VALUES(NULL, :video_gid, :audio_gid, :video_completed, :audio_completed, :muxing_status, :checking, :download_path )""", dictionary) self.persepolis_db_connection.commit() # job is done! open the lock self.lock = False def searchGidInVideoFinderTable(self, gid): # lock data base self.lockCursor() self.persepolis_db_cursor.execute( """SELECT * FROM video_finder_db_table WHERE audio_gid = '{}' OR video_gid = '{}'""".format(str(gid), str(gid))) result_list = self.persepolis_db_cursor.fetchall() # job is done self.lock = False if result_list: tuple_ = result_list[0] else: return None dictionary = {'video_gid': tuple_[1], 'audio_gid': tuple_[2], 'video_completed': tuple_[3], 'audio_completed': tuple_[4], 'muxing_status': tuple_[5], 'checking': tuple_[6], 'download_path': tuple_[7]} # return the results return dictionary def insertInVideoFinderTable2(self, list_): self.lockCursor() for dictionary in list_: self.persepolis_db_cursor.execute("""INSERT INTO video_finder_db_table2 VALUES(NULL, :gid, :download_status, :file_name, :eta, :download_speed_str, :downloaded_size, :file_size, :download_percent, :fragments, :error_message )""", dictionary) self.persepolis_db_connection.commit() self.lock = False def searchGidInVideoFinderTable2(self, gid): # lock data base self.lockCursor() self.persepolis_db_cursor.execute( """SELECT * FROM video_finder_db_table2 WHERE gid = '{}'""".format(str(gid))) result_list = self.persepolis_db_cursor.fetchall() # job is done self.lock = False if result_list: tuple_ = result_list[0] else: return None dictionary = {'gid': tuple_[1], 'download_status': tuple_[2], 'file_name': tuple_[3], 'eta': tuple_[4], 'download_speed_str': tuple_[5], 'downloaded_size': tuple_[6], 'file_size': tuple_[7], 'download_percent': tuple_[8], 'fragments': tuple_[9], 'error_message': tuple_[10]} # return the results return dictionary # return download information in download_db_table with special gid. def searchGidInDownloadTable(self, gid): # lock data base self.lockCursor() self.persepolis_db_cursor.execute("""SELECT * FROM download_db_table WHERE gid = '{}'""".format(str(gid))) list_ = self.persepolis_db_cursor.fetchall() # job is done! open the lock self.lock = False if list_: tuple_ = list_[0] else: return None dict_ = {'file_name': tuple_[0], 'status': tuple_[1], 'size': tuple_[2], 'downloaded_size': tuple_[3], 'percent': tuple_[4], 'connections': tuple_[5], 'rate': tuple_[6], 'estimate_time_left': tuple_[7], 'gid': tuple_[8], 'link': tuple_[9], 'first_try_date': tuple_[10], 'last_try_date': tuple_[11], 'category': tuple_[12] } # return results return dict_ # return all items in download_db_table # '*' for category, cause that method returns all items. def returnItemsInDownloadTable(self, category=None): # lock data base self.lockCursor() if category: self.persepolis_db_cursor.execute( """SELECT * FROM download_db_table WHERE category = '{}'""".format(category)) else: self.persepolis_db_cursor.execute("""SELECT * FROM download_db_table""") rows = self.persepolis_db_cursor.fetchall() # job is done! open the lock self.lock = False downloads_dict = {} for tuple_ in rows: # change format of tuple_ to dictionary dict_ = {'file_name': tuple_[0], 'status': tuple_[1], 'size': tuple_[2], 'downloaded_size': tuple_[3], 'percent': tuple_[4], 'connections': tuple_[5], 'rate': tuple_[6], 'estimate_time_left': tuple_[7], 'gid': tuple_[8], 'link': tuple_[9], 'first_try_date': tuple_[10], 'last_try_date': tuple_[11], 'category': tuple_[12] } # add dict to the downloads_dict # gid is key and dict_ is value downloads_dict[tuple_[8]] = dict_ return downloads_dict # this method checks existence of a link in addlink_db_table def searchLinkInAddLinkTable(self, link): # lock data base self.lockCursor() self.persepolis_db_cursor.execute("""SELECT * FROM addlink_db_table WHERE link = (?)""", (link,)) list_ = self.persepolis_db_cursor.fetchall() # job is done! open the lock self.lock = False if list_: return True else: return False # return download information in addlink_db_table with special gid. def searchGidInAddLinkTable(self, gid): # lock data base self.lockCursor() self.persepolis_db_cursor.execute("""SELECT * FROM addlink_db_table WHERE gid = '{}'""".format(str(gid))) list_ = self.persepolis_db_cursor.fetchall() # job is done! open the lock self.lock = False if list_: tuple_ = list_[0] else: return None dict_ = {'gid': tuple_[1], 'out': tuple_[2], 'start_time': tuple_[3], 'end_time': tuple_[4], 'link': tuple_[5], 'ip': tuple_[6], 'port': tuple_[7], 'proxy_user': tuple_[8], 'proxy_passwd': tuple_[9], 'download_user': tuple_[10], 'download_passwd': tuple_[11], 'connections': tuple_[12], 'limit_value': tuple_[13], 'download_path': tuple_[14], 'referer': tuple_[15], 'load_cookies': tuple_[16], 'user_agent': tuple_[17], 'header': tuple_[18], 'after_download': tuple_[19], 'proxy_type': tuple_[20] } return dict_ # return items in addlink_db_table # '*' for category, cause that method returns all items. def returnItemsInAddLinkTable(self, category=None): # lock data base self.lockCursor() if category: self.persepolis_db_cursor.execute( """SELECT * FROM addlink_db_table WHERE category = '{}'""".format(category)) else: self.persepolis_db_cursor.execute("""SELECT * FROM addlink_db_table""") rows = self.persepolis_db_cursor.fetchall() # job is done! open the lock self.lock = False addlink_dict = {} for tuple_ in rows: # change format of tuple_ to dictionary dict_ = {'gid': tuple_[1], 'out': tuple_[2], 'start_time': tuple_[3], 'end_time': tuple_[4], 'link': tuple_[5], 'ip': tuple_[6], 'port': tuple_[7], 'proxy_user': tuple_[8], 'proxy_passwd': tuple_[9], 'download_user': tuple_[10], 'download_passwd': tuple_[11], 'connections': tuple_[12], 'limit_value': tuple_[13], 'download_path': tuple_[14], 'referer': tuple_[15], 'load_cookies': tuple_[16], 'user_agent': tuple_[17], 'header': tuple_[18], 'after_download': tuple_[19], 'proxy_type': tuple_[20] } # add dict_ to the addlink_dict # gid as key and dict_ as value addlink_dict[tuple_[1]] = dict_ return addlink_dict # this method updates download_db_table def updateDownloadTable(self, list_): # lock data base self.lockCursor() keys_list = ['file_name', 'status', 'size', 'downloaded_size', 'percent', 'connections', 'rate', 'estimate_time_left', 'gid', 'link', 'first_try_date', 'last_try_date', 'category' ] for dict_ in list_: for key in keys_list: # if a key is missed in dict_, # then add this key to the dict_ and assign None value for the key. if key not in dict_.keys(): dict_[key] = None # update data base if value for the keys is not None self.persepolis_db_cursor.execute("""UPDATE download_db_table SET file_name = coalesce(:file_name, file_name), status = coalesce(:status, status), size = coalesce(:size, size), downloaded_size = coalesce(:downloaded_size, downloaded_size), percent = coalesce(:percent, percent), connections = coalesce(:connections, connections), rate = coalesce(:rate, rate), estimate_time_left = coalesce(:estimate_time_left, estimate_time_left), link = coalesce(:link, link), first_try_date = coalesce(:first_try_date, first_try_date), last_try_date = coalesce(:last_try_date, last_try_date), category = coalesce(:category, category) WHERE gid = :gid""", dict_) # commit the changes self.persepolis_db_connection.commit() # job is done! open the lock self.lock = False # this method updates category_db_table def updateCategoryTable(self, list_): # lock data base self.lockCursor() keys_list = ['category', 'start_time_enable', 'start_time', 'end_time_enable', 'end_time', 'reverse', 'limit_enable', 'limit_value', 'after_download', 'gid_list'] for dict_ in list_: # format of gid_list is list and must be converted to string for sqlite3 if 'gid_list' in dict_.keys(): dict_['gid_list'] = str(dict_['gid_list']) for key in keys_list: # if a key is missed in dict_, # then add this key to the dict_ and assign None value for the key. if key not in dict_.keys(): dict_[key] = None # update data base if value for the keys is not None self.persepolis_db_cursor.execute("""UPDATE category_db_table SET start_time_enable = coalesce(:start_time_enable, start_time_enable), start_time = coalesce(:start_time, start_time), end_time_enable = coalesce(:end_time_enable, end_time_enable), end_time = coalesce(:end_time, end_time), reverse = coalesce(:reverse, reverse), limit_enable = coalesce(:limit_enable, limit_enable), limit_value = coalesce(:limit_value, limit_value), after_download = coalesce(:after_download, after_download), gid_list = coalesce(:gid_list, gid_list) WHERE category = :category""", dict_) # commit changes self.persepolis_db_connection.commit() # job is done! open the lock self.lock = False # this method updates addlink_db_table def updateAddLinkTable(self, list_): # lock data base self.lockCursor() keys_list = ['gid', 'out', 'start_time', 'end_time', 'link', 'ip', 'port', 'proxy_user', 'proxy_passwd', 'download_user', 'download_passwd', 'connections', 'limit_value', 'download_path', 'referer', 'load_cookies', 'user_agent', 'header', 'after_download', 'proxy_type'] for dict_ in list_: update_query_set_statements_list = [] for key in keys_list: if key in dict_.keys(): update_query_set_statements_list.append(f"{key} = :{key}") update_query_set_statements = ' ,\n '.join(update_query_set_statements_list) update_query = f"""UPDATE addlink_db_table SET {update_query_set_statements} WHERE gid = :gid """ if len(update_query_set_statements_list) > 0: self.persepolis_db_cursor.execute(update_query, dict_) # commit the changes! self.persepolis_db_connection.commit() # job is done! open the lock self.lock = False def updateVideoFinderTable(self, list_): # lock data base self.lockCursor() keys_list = ['video_gid', 'audio_gid', 'video_completed', 'audio_completed', 'muxing_status', 'checking'] for dictionary in list_: for key in keys_list: # if a key is missed in dict_, # then add this key to the dict_ and assign None value for the key. if key not in dictionary.keys(): dictionary[key] = None if dictionary['video_gid']: # update data base if value for the keys is not None self.persepolis_db_cursor.execute("""UPDATE video_finder_db_table SET video_completed = coalesce(:video_completed, video_completed), audio_completed = coalesce(:audio_completed, audio_completed), muxing_status = coalesce(:muxing_status, muxing_status), checking = coalesce(:checking, checking), download_path = coalesce(:download_path, download_path) WHERE video_gid = :video_gid""", dictionary) elif dictionary['audio_gid']: # update data base if value for the keys is not None self.persepolis_db_cursor.execute("""UPDATE video_finder_db_table SET video_completed = coalesce(:video_completed, video_completed), audio_completed = coalesce(:audio_completed, audio_completed), muxing_status = coalesce(:muxing_status, muxing_status), checking = coalesce(:checking, checking), download_path = coalesce(:download_path, download_path) WHERE audio_gid = :audio_gid""", dictionary) # commit the changes! self.persepolis_db_connection.commit() # job is done! open the lock self.lock = False def updateVideoFinderTable2(self, dict_): # lock data base self.lockCursor() keys_list = ['gid', 'download_status', 'file_name', 'eta', 'download_speed_str', 'downloaded_size', 'file_size', 'download_percent', 'fragments', 'error_message'] for key in keys_list: if key not in dict_.keys(): dict_[key] = None self.persepolis_db_cursor.execute("""UPDATE video_finder_db_table2 SET download_status = coalesce(:download_status, download_status), file_name = coalesce(:file_name, file_name), eta = coalesce(:eta, eta), download_speed_str = coalesce(:download_speed_str, download_speed_str), downloaded_size = coalesce(:downloaded_size, downloaded_size), file_size = coalesce(:file_size, file_size), download_percent = coalesce(:download_percent, download_percent), fragments = coalesce(:fragments, fragments), error_message = coalesce(:error_message, error_message) WHERE gid = :gid""", dict_) self.persepolis_db_connection.commit() self.lock = False def setDefaultGidInAddlinkTable(self, gid, start_time=False, end_time=False, after_download=False): # lock data base self.lockCursor() # change value of start_time and end_time and after_download for special gid to NULL value if start_time: self.persepolis_db_cursor.execute("""UPDATE addlink_db_table SET start_time = NULL WHERE gid = '{}' """.format(gid)) if end_time: self.persepolis_db_cursor.execute("""UPDATE addlink_db_table SET end_time = NULL WHERE gid = '{}' """.format(gid)) if after_download: self.persepolis_db_cursor.execute("""UPDATE addlink_db_table SET after_download = NULL WHERE gid = '{}' """.format(gid)) self.persepolis_db_connection.commit() # job is done! open the lock self.lock = False # return category information in category_db_table def searchCategoryInCategoryTable(self, category): # lock data base self.lockCursor() self.persepolis_db_cursor.execute( """SELECT * FROM category_db_table WHERE category = '{}'""".format(str(category))) list_ = self.persepolis_db_cursor.fetchall() # job is done! open the lock self.lock = False if list_: tuple_ = list_[0] else: return None # convert string to list gid_list = ast.literal_eval(tuple_[9]) # create a dictionary from results dict_ = {'category': tuple_[0], 'start_time_enable': tuple_[1], 'start_time': tuple_[2], 'end_time_enable': tuple_[3], 'end_time': tuple_[4], 'reverse': tuple_[5], 'limit_enable': tuple_[6], 'limit_value': tuple_[7], 'after_download': tuple_[8], 'gid_list': gid_list } # return dictionary return dict_ # return categories name def categoriesList(self): # lock data base self.lockCursor() self.persepolis_db_cursor.execute("""SELECT category FROM category_db_table ORDER BY ROWID""") rows = self.persepolis_db_cursor.fetchall() # create a list from categories name queues_list = [] for tuple_ in rows: queues_list.append(tuple_[0]) # job is done! open the lock self.lock = False # return the list return queues_list def setDBTablesToDefaultValue(self): # lock data base self.lockCursor() # change start_time_enable , end_time_enable , reverse , # limit_enable , after_download value to default value ! self.persepolis_db_cursor.execute("""UPDATE category_db_table SET start_time_enable = 'no', end_time_enable = 'no', reverse = 'no', limit_enable = 'no', after_download = 'no'""") # change checking value to no in video_finder_db_table self.persepolis_db_cursor.execute("""UPDATE video_finder_db_table SET checking = 'no'""") # change status of download to 'stopped' if status isn't 'complete' or 'error' self.persepolis_db_cursor.execute("""UPDATE download_db_table SET status = 'stopped' WHERE status NOT IN ('complete', 'error')""") # change start_time and end_time and # after_download value to None in addlink_db_table! self.persepolis_db_cursor.execute("""UPDATE addlink_db_table SET start_time = NULL, end_time = NULL, after_download = NULL """) self.persepolis_db_connection.commit() # job is done! open the lock self.lock = False def findActiveDownloads(self, category=None): # lock data base self.lockCursor() # find download items is download_db_table with status = "downloading" or "waiting" or paused or scheduled if category: self.persepolis_db_cursor.execute("""SELECT gid FROM download_db_table WHERE (category = '{}') AND (status = 'downloading' OR status = 'waiting' OR status = 'scheduled' OR status = 'paused' OR status = 'creating download file')""".format(str(category))) else: self.persepolis_db_cursor.execute("""SELECT gid FROM download_db_table WHERE (status = 'downloading' OR status = 'waiting' OR status = 'scheduled' OR status = 'paused' OR status = 'creating download file')""") # create a list for returning answer result = self.persepolis_db_cursor.fetchall() gid_list = [] for result_tuple in result: gid_list.append(result_tuple[0]) # job is done! open the lock self.lock = False return gid_list # this method returns items with 'downloading' or 'waiting' or 'creating download file' status def returnDownloadingItems(self): # lock data base self.lockCursor() # find download items is download_db_table with status = "downloading" or "waiting" or paused or scheduled self.persepolis_db_cursor.execute( """SELECT gid FROM download_db_table WHERE (status = 'downloading' OR status = 'waiting' OR status = 'creating download file')""") # create a list for returning answer result = self.persepolis_db_cursor.fetchall() gid_list = [] for result_tuple in result: gid_list.append(result_tuple[0]) # job is done! open the lock self.lock = False return gid_list # this method returns items with 'paused' status. def returnPausedItems(self): # lock data base self.lockCursor() # find download items is download_db_table with status = "downloading" or "waiting" or paused or scheduled self.persepolis_db_cursor.execute("""SELECT gid FROM download_db_table WHERE (status = 'paused')""") # create a list for returning answer result = self.persepolis_db_cursor.fetchall() gid_list = [] for result_tuple in result: gid_list.append(result_tuple[0]) # job is done! open the lock self.lock = False return gid_list # return all video_gids and audio_gids in video_finder_db_table def returnVideoFinderGids(self): # lock data base self.lockCursor() self.persepolis_db_cursor.execute("""SELECT video_gid, audio_gid FROM video_finder_db_table""") # create a list for result result = self.persepolis_db_cursor.fetchall() # job is done! open the lock self.lock = False gid_list = [] video_gid_list = [] audio_gid_list = [] for result_tuple in result: gid_list.append(result_tuple[0]) video_gid_list.append(result_tuple[0]) gid_list.append(result_tuple[1]) audio_gid_list.append(result_tuple[1]) # job is done return gid_list, video_gid_list, audio_gid_list # This method deletes a category from category_db_table def deleteCategory(self, category): # delete gids of this category from gid_list of 'All Downloads' category_dict = self.searchCategoryInCategoryTable(category) all_downloads_dict = self.searchCategoryInCategoryTable('All Downloads') # get gid_list category_gid_list = category_dict['gid_list'] all_downloads_gid_list = all_downloads_dict['gid_list'] for gid in category_gid_list: # delete item from all_downloads_gid_list all_downloads_gid_list.remove(gid) # update category_db_table self.updateCategoryTable([all_downloads_dict]) # delete category from data_base # lock data base self.lockCursor() self.persepolis_db_cursor.execute( """DELETE FROM category_db_table WHERE category = '{}'""".format(str(category))) # commit changes self.persepolis_db_connection.commit() # job is done! open the lock self.lock = False # this method deletes all items in data_base def resetDataBase(self): # update gid_list in categories with empty gid_list all_downloads_dict = {'category': 'All Downloads', 'gid_list': []} single_downloads_dict = {'category': 'Single Downloads', 'gid_list': []} scheduled_downloads_dict = {'category': 'Scheduled Downloads', 'gid_list': []} self.updateCategoryTable([all_downloads_dict, single_downloads_dict, scheduled_downloads_dict]) # lock data base self.lockCursor() # delete all items in category_db_table, except 'All Downloads' and 'Single Downloads' self.persepolis_db_cursor.execute( """DELETE FROM category_db_table WHERE category NOT IN ('All Downloads', 'Single Downloads', 'Scheduled Downloads')""") self.persepolis_db_cursor.execute("""DELETE FROM download_db_table""") self.persepolis_db_cursor.execute("""DELETE FROM addlink_db_table""") # commit self.persepolis_db_connection.commit() # release lock self.lock = False # This method deletes a download item from download_db_table def deleteItemInDownloadTable(self, gid, category): # lock data base self.lockCursor() self.persepolis_db_cursor.execute("""DELETE FROM download_db_table WHERE gid = '{}'""".format(str(gid))) # commit changes self.persepolis_db_connection.commit() # job is done! open the lock self.lock = False # delete item from gid_list in category and All Downloads for category_name in category, 'All Downloads': category_dict = self.searchCategoryInCategoryTable(category_name) # get gid_list gid_list = category_dict['gid_list'] # delete item if gid in gid_list: gid_list.remove(gid) # if gid is in video_finder_db_table, both of video_gid and audio_gid must be deleted from gid_list video_finder_dictionary = self.searchGidInVideoFinderTable(gid) if video_finder_dictionary: video_gid = video_finder_dictionary['video_gid'] audio_gid = video_finder_dictionary['audio_gid'] if gid == video_gid: gid_list.remove(audio_gid) else: gid_list.remove(video_gid) # update category_db_table self.updateCategoryTable([category_dict]) # this method replaces: # GB >> GiB # MB >> MiB # KB >> KiB # Read this link for more information: # https://en.wikipedia.org/wiki/Orders_of_magnitude_(data) def correctDataBase(self): # lock data base self.lockCursor() for units in [['KB', 'KiB'], ['MB', 'MiB'], ['GB', 'GiB']]: dict_ = {'old_unit': units[0], 'new_unit': units[1]} self.persepolis_db_cursor.execute("""UPDATE download_db_table SET size = replace(size, :old_unit, :new_unit)""", dict_) self.persepolis_db_cursor.execute("""UPDATE download_db_table SET rate = replace(rate, :old_unit, :new_unit)""", dict_) self.persepolis_db_cursor.execute("""UPDATE download_db_table SET downloaded_size = replace(downloaded_size, :old_unit, :new_unit)""", dict_) self.persepolis_db_connection.commit() # job is done! open the lock self.lock = False def correctDataBaseForVersion410(self): # lock data base self.lockCursor() # set all proxy_type to http # first check for proxy_type's column is exist or not. try: self.persepolis_db_cursor.execute("""SELECT proxy_type FROM addlink_db_table""") except sqlite3.OperationalError: # create proxy_type column in addlink_db_table self.persepolis_db_cursor.execute("""ALTER TABLE addlink_db_table ADD proxy_type NULL""") # set "http" value for pervious downloads that use proxy self.persepolis_db_cursor.execute("""UPDATE addlink_db_table SET proxy_type = 'http' WHERE ip IS NOT NULL""") self.persepolis_db_connection.commit() # job is done! open the lock self.lock = False # close connections def correctDataBaseForVersion411(self): # lock data base self.lockCursor() # find gid of all unfinished downloads in download_db_table self.persepolis_db_cursor.execute("""SELECT gid FROM download_db_table WHERE status IS NOT 'complete'""") result = self.persepolis_db_cursor.fetchall() gid_list = [] for result_tuple in result: gid_list.append(result_tuple[0]) # correct download path for gid in gid_list: # find download_path self.persepolis_db_cursor.execute("""SELECT download_path FROM addlink_db_table WHERE gid = '{}'""".format(str(gid))) tuple_ = self.persepolis_db_cursor.fetchone() download_path = tuple_[0] import platform os_type = platform.system() home_address = os.path.expanduser("~") try: if os.lstat(download_path).st_dev == os.lstat(home_address).st_dev: if os_type != 'Windows': download_path_temp = os.path.join(home_address, '.persepolis') else: download_path_temp = os.path.join( home_address, 'AppData', 'Local', 'persepolis') else: from persepolis.scripts.osCommands import findMountPoint # Find mount point mount_point = findMountPoint(download_path) # find download_path_temp if os_type == 'Windows': download_path_temp = os.path.join(mount_point, 'persepolis') else: download_path_temp = os.path.join(mount_point, '.persepolis') # set download_path_temp as download_path self.persepolis_db_cursor.execute("""UPDATE addlink_db_table SET download_path = '{}' WHERE gid = '{}' """.format(download_path_temp, gid)) self.persepolis_db_connection.commit() except Exception: pass # job is done! open the lock self.lock = False def closeConnections(self): # lock data base self.lockCursor() self.persepolis_db_cursor.close() self.persepolis_db_connection.close() # job is done! open the lock self.lock = False ================================================ FILE: persepolis/scripts/download_link.py ================================================ # -*- coding: utf-8 -*- """ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import requests try: from PySide6.QtCore import QThread, Signal except ImportError: from PyQt5.QtCore import QThread from PyQt5.QtCore import pyqtSignal as Signal from persepolis.scripts import logger # this thread starts download. class DownloadLink(QThread): def __init__(self, gid, download_session, main_window): QThread.__init__(self) self.gid = gid self.download_session = download_session self.main_window = main_window def run(self): # add gid of download to the active gids in temp_db # or update data base , if it was existed before try: self.main_window.temp_db.insertInSingleTable(self.gid) except Exception: # release lock self.main_window.temp_db.lock = False dictionary = {'gid': self.gid, 'status': 'active'} self.main_window.temp_db.updateSingleTable(dictionary) self.download_session.start() class DownloadSingleLink(QThread): DOWNLOADSTATUSSIGNAL = Signal(bool) def __init__(self, download_link, file_path): QThread.__init__(self) self.download_link = download_link self.file_path = file_path def run(self): try: # download link response = requests.get(self.download_link) # write it to file with open(self.file_path, 'wb') as f: f.write(response.content) if response.ok: log_message = 'Download complete! ' + str(self.file_path) logger.sendToLog(log_message, "INFO") self.DOWNLOADSTATUSSIGNAL.emit(True) except Exception as e: error_message = 'Download was unsuccessful:\n' + str(self.file_path) + '\n' + str(e) logger.sendToLog(error_message, "ERROR") self.DOWNLOADSTATUSSIGNAL.emit(False) ================================================ FILE: persepolis/scripts/error_window.py ================================================ # -*- coding: utf-8 -*- # 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 . # try: from PySide6.QtWidgets import QWidget, QTextEdit, QVBoxLayout, QHBoxLayout, QPushButton, QLabel from PySide6.QtGui import QIcon from PySide6.QtCore import Qt, QSize, QSettings except ImportError: from PyQt5.QtWidgets import QWidget, QTextEdit, QVBoxLayout, QHBoxLayout, QPushButton, QLabel from PyQt5.QtCore import Qt, QSize, QSettings from PyQt5.QtGui import QIcon from persepolis.scripts.data_base import PersepolisDB from persepolis.scripts import osCommands from persepolis.gui import resources class ErrorWindow(QWidget): def __init__(self, text): super().__init__() # finding windows_size self.setMinimumSize(QSize(363, 300)) self.setWindowIcon(QIcon.fromTheme('persepolis', QIcon(':/com.github.persepolisdm.persepolis.svg'))) self.setWindowTitle('Persepolis Download Manager') verticalLayout = QVBoxLayout(self) horizontalLayout = QHBoxLayout() horizontalLayout.addStretch(1) self.text_edit = QTextEdit(self) self.text_edit.setReadOnly(True) self.text_edit.insertPlainText(text) verticalLayout.addWidget(self.text_edit) self.label2 = QLabel(self) self.label2.setText('Reseting persepolis may solving problem.\nDo not panic!If you add your download links again,\npersepolis will resume your downloads\nPlease copy this error message and press "Report Issue" button\nand open a new issue in Github for it.\nWe answer you as soon as possible. \nreporting this issue help us to improve persepolis.\nThank you!') verticalLayout.addWidget(self.label2) self.report_pushButton = QPushButton(self) self.report_pushButton.setText("Report Issue") horizontalLayout.addWidget(self.report_pushButton) self.reset_persepolis_pushButton = QPushButton(self) self.reset_persepolis_pushButton.clicked.connect( self.resetPushButtonPressed) self.reset_persepolis_pushButton.setText('Reset Persepolis') horizontalLayout.addWidget(self.reset_persepolis_pushButton) self.close_pushButton = QPushButton(self) self.close_pushButton.setText('close') horizontalLayout.addWidget(self.close_pushButton) verticalLayout.addLayout(horizontalLayout) self.report_pushButton.clicked.connect(self.reportPushButtonPressed) self.close_pushButton.clicked.connect(self.closePushButtonPressed) def reportPushButtonPressed(self, button): osCommands.xdgOpen('https://github.com/persepolisdm/persepolis/issues') # close window with ESC key def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.close() def closePushButtonPressed(self, button): self.close() def resetPushButtonPressed(self, button): # create an object for PersepolisDB persepolis_db = PersepolisDB() # Reset data base persepolis_db.resetDataBase() # close connections persepolis_db.closeConnections() # Reset persepolis_setting persepolis_setting = QSettings('persepolis_download_manager', 'persepolis') persepolis_setting.clear() persepolis_setting.sync() ================================================ FILE: persepolis/scripts/initialization.py ================================================ # -*- coding: utf-8 -*- # 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 . # THIS FILE CONTAINING SOME VARIABLES , ... THAT USING FOR INITIALIZING PERSEPOLIS from persepolis.scripts.data_base import PersepolisDB, PluginsDB from persepolis.scripts import logger from persepolis.scripts.useful_tools import determineConfigFolder, returnDefaultSettings, osAndDesktopEnvironment, getExecPath from persepolis.scripts.browser_integration import browserIntegration from persepolis.scripts import osCommands from persepolis.constants import OS import time import os import sys try: from PySide6.QtCore import QSettings except ImportError: from PyQt5.QtCore import QSettings # initialization # download manager config folder . config_folder = determineConfigFolder() # persepolis tmp folder path persepolis_tmp = os.path.join(config_folder, 'persepolis_tmp') # create folders for folder in [config_folder, persepolis_tmp]: osCommands.makeDirs(folder) # persepolisdm.log file contains persepolis log. # refresh logs! # log files address initialization_log_file = os.path.join(str(config_folder), 'initialization_log_file.log') downloads_log_file = os.path.join(str(config_folder), 'downloads_log_file.log') errors_log_file = os.path.join(str(config_folder), 'errors_log_file.log') log_files_list = [initialization_log_file, downloads_log_file, errors_log_file] # get current time current_time = time.strftime('%Y/%m/%d %H:%M:%S') # find number of lines in log_file. for log_file in log_files_list: with open(log_file) as f: lines = sum(1 for _ in f) # if number of lines in log_file is more than 300, then keep last 200 lines in log_file. if lines < 300: f = open(log_file, 'a') f.writelines('===================================================\n' + 'Persepolis Download Manager, ' + current_time + '\n') f.close() else: # keep last 200 lines line_num = lines - 200 f = open(log_file, 'r') f_lines = f.readlines() f.close() line_counter = 1 f = open(log_file, 'w') for line in f_lines: if line_counter > line_num: f.writelines(str(line)) line_counter = line_counter + 1 f.close() f = open(log_file, 'a') f.writelines('Persepolis Download Manager, ' + current_time + '\n') f.close() # create an object for PersepolisDB persepolis_db = PersepolisDB() # create tables persepolis_db.createTables() # close connections persepolis_db.closeConnections() # create an object for PluginsDB plugins_db = PluginsDB() # create tables plugins_db.createTables() # delete old links plugins_db.deleteOldLinks() # close connections plugins_db.closeConnections() # import persepolis_setting # persepolis is using QSettings for saving windows size and windows # position and program settings. persepolis_setting = QSettings('persepolis_download_manager', 'persepolis') persepolis_setting.beginGroup('settings') default_setting_dict = returnDefaultSettings() # this loop is checking values in persepolis_setting . if value is not # valid then value replaced by default_setting_dict value for key in default_setting_dict.keys(): setting_value = persepolis_setting.value(key, default_setting_dict[key]) persepolis_setting.setValue(key, setting_value) # set default dwonload path if not (os.path.exists(persepolis_setting.value('download_path'))): persepolis_setting.setValue('download_path', default_setting_dict['download_path']) persepolis_setting.sync() # Create downloads folder and subfolders. # download sub folders if they did not existed. download_path = persepolis_setting.value('download_path') folder_list = [download_path] # add subfolders to folder_list if user checked subfolders check box in setting window. if persepolis_setting.value('subfolder') == 'yes': for folder in ['Audios', 'Videos', 'Others', 'Documents', 'Compressed']: folder_list.append(os.path.join(download_path, folder)) # create folders in folder_list for folder in folder_list: osCommands.makeDirs(folder) persepolis_setting.endGroup() # Browser integration for Firefox and chromium and google chrome persepolis_setting.beginGroup('settings/native_messaging') for browser in ['chrome', 'chromium', 'opera', 'vivaldi', 'firefox', 'brave', 'librewolf']: if persepolis_setting.value(browser) == 'true': json_done, intermediary_done, logg_message2 = browserIntegration(browser) logg_message = browser if json_done is True: logg_message = logg_message + ': ' + 'Json file is created successfully.\n' else: logg_message = logg_message + ': ' + 'Json ERROR!\n' if intermediary_done is True: logg_message = logg_message + 'persepolis intermediary file is created successfully.\n' elif intermediary_done is False: logg_message = logg_message + ': ' + 'persepolis executer file ERROR!\n' logger.sendToLog(logg_message, 'INITIALIZATION') logger.sendToLog(logg_message2, 'INITIALIZATION') persepolis_setting.endGroup() # get locale and set ui direction locale = str(persepolis_setting.value('settings/locale')) # right to left languages rtl_locale_list = ['fa_IR', 'ar'] # left to right languages ltr_locale_list = ['en_US', 'zh_CN', 'fr_FR', 'pl_PL', 'nl_NL', 'pt_BR', 'es_ES', 'hu', 'tr', 'tr_TR'] if locale in rtl_locale_list: persepolis_setting.setValue('ui_direction', 'rtl') else: persepolis_setting.setValue('ui_direction', 'ltr') # check the existance of .desktop and icons file for # Linux and BSD bundle and create it if it's necessary. # check if persepolis run as bundle first # find os platform os_type, desktop_env = osAndDesktopEnvironment() if os_type in OS.UNIX_LIKE: exec_dictionary = getExecPath() is_bundle = exec_dictionary['bundle'] if is_bundle: # user home address home_address = os.path.expanduser("~") bundle_path = os.path.dirname(sys.executable) # check existance of .desktop file dot_desktop_path = os.path.join(home_address, '.local/share/applications/com.github.persepolisdm.persepolis.desktop') icon_desktop_path = os.path.join(home_address, '.local/share/icons/hicolor/scalable/apps/com.github.persepolisdm.persepolis.svg') icon_tray_path = os.path.join(home_address, '.local/share/icons/hicolor/scalable/apps/persepolis-tray.svg') local_share_file_path = [dot_desktop_path, icon_desktop_path, icon_tray_path] dot_desktop_bundle = os.path.join(bundle_path, 'com.github.persepolisdm.persepolis.desktop.in') icon_desktop_bundle = os.path.join(bundle_path, 'com.github.persepolisdm.persepolis.svg') icon_tray_bundle = os.path.join(bundle_path, 'persepolis-tray.svg') in_bundle_file_path = [dot_desktop_bundle, icon_desktop_bundle, icon_tray_bundle] for i in range(3): # rewrite .desktop file every time if not (os.path.exists(local_share_file_path[i])) or i == 0: osCommands.copyFile(in_bundle_file_path[i], local_share_file_path[i]) # rewrite Exec path in .desktop file. # perhaps user changed the place of the bundle. # get exec path # modify lines # Because of space in file name and file path, # Exec path in .desktop file must be in "". exec_path = '"' + exec_dictionary['modified_exec_file_path'] + '"' # get .desktop content with open(dot_desktop_path, 'r') as file: content = file.read() # replace @persepolisbin@ by new exec path new_content = content.replace('@persepolisbin@', exec_path) # write it to file with open(dot_desktop_path, 'w') as file: file.write(new_content) # compatibility persepolis_version = float(persepolis_setting.value('version/version', 2.5)) if persepolis_version < 2.6: from persepolis.scripts.compatibility import compatibility try: compatibility() except Exception as e: # create an object for PersepolisDB persepolis_db = PersepolisDB() # create tables persepolis_db.resetDataBase() # close connections persepolis_db.closeConnections() # write error in log logger.sendToLog( "compatibility ERROR!", "ERROR") logger.sendToLog( str(e), "ERROR") persepolis_version = 2.6 if persepolis_version < 3.1: # create an object for PersepolisDB persepolis_db = PersepolisDB() # correct data base persepolis_db.correctDataBase() # close connections persepolis_db.closeConnections() persepolis_version = 3.1 if persepolis_version < 4.0: persepolis_setting.beginGroup('settings') for key in default_setting_dict.keys(): setting_value = default_setting_dict[key] persepolis_setting.setValue(key, setting_value) persepolis_setting.endGroup() if persepolis_version < 4.1: # create an object for PersepolisDB persepolis_db = PersepolisDB() # correct data base persepolis_db.correctDataBaseForVersion410() # close connections persepolis_db.closeConnections() persepolis_setting.setValue('version/version', 4.1) if persepolis_version < 4.11: # create an object for PersepolisDB persepolis_db = PersepolisDB() # correct data base persepolis_db.correctDataBaseForVersion411() # close connections persepolis_db.closeConnections() persepolis_setting.setValue('version/version', 4.11) if persepolis_version < 5.2: persepolis_setting.beginGroup('settings') for key in default_setting_dict.keys(): setting_value = default_setting_dict[key] persepolis_setting.setValue(key, setting_value) persepolis_setting.endGroup() persepolis_setting.setValue('version/version', 5.2) persepolis_setting.sync() ================================================ FILE: persepolis/scripts/log_window.py ================================================ # -*- coding: utf-8 -*- # 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 . # from persepolis.scripts.useful_tools import determineConfigFolder from persepolis.gui.log_window_ui import LogWindow_Ui from persepolis.scripts import osCommands import os try: from PySide6.QtCore import Qt, QPoint, QSize from PySide6.QtGui import QIcon from PySide6 import QtWidgets except ImportError: from PyQt5.QtCore import Qt, QPoint, QSize from PyQt5.QtGui import QIcon from PyQt5 import QtWidgets # config_folder config_folder = determineConfigFolder() class LogWindow(LogWindow_Ui): def __init__(self, persepolis_setting): super().__init__(persepolis_setting) self.persepolis_setting = persepolis_setting self.copy_log_pushButton.setEnabled(False) # log files address self.initialization_log_file = os.path.join(str(config_folder), 'initialization_log_file.log') self.downloads_log_file = os.path.join(str(config_folder), 'downloads_log_file.log') self.errors_log_file = os.path.join(str(config_folder), 'errors_log_file.log') # lists self.log_files_list = [self.initialization_log_file, self.downloads_log_file, self.errors_log_file] self.text_widgets_list = [self.initialization_text_edit, self.downloads_text_edit, self.errors_text_edit] self.tabs_list = [self.initialization_tab, self.downloads_tab, self.errors_tab] # Set downloads_tab for current tab self.log_tabWidget.setCurrentWidget(self.downloads_tab) # read logs for index, file in enumerate(self.log_files_list): text = '' f = open(file, 'r') f_lines = f.readlines() f.close() for line in f_lines: text = text + str(line) + '\n' self.text_widgets_list[index].insertPlainText(text) self.text_widgets_list[index].copyAvailable.connect( self.copyAvailableSignalHandler) # signals and slots self.copy_log_pushButton.clicked.connect( self.copyPushButtonPressed) self.report_pushButton.clicked.connect( self.reportPushButtonPressed) self.close_pushButton.clicked.connect( self.closePushButtonPressed) self.refresh_log_pushButton.clicked.connect( self.refreshLogPushButtonPressed) self.clear_log_pushButton.clicked.connect( self.clearLogPushButtonPressed) # setting window size and position size = self.persepolis_setting.value( 'LogWindow/size', QSize(720, 300)) position = self.persepolis_setting.value( 'LogWindow/position', QPoint(300, 300)) self.resize(size) self.move(position) self.minimum_height = self.height() def clearLogPushButtonPressed(self, button): # Empty log files for index, file in enumerate(self.log_files_list): # erase files f = open(file, 'w') f.close() # clear text editors self.text_widgets_list[index].clear() def reportPushButtonPressed(self, button): osCommands.xdgOpen('https://github.com/persepolisdm/persepolis/issues') def closePushButtonPressed(self, button): self.close() def copyAvailableSignalHandler(self, signal): if signal: self.copy_log_pushButton.setEnabled(True) else: self.copy_log_pushButton.setEnabled(False) def copyPushButtonPressed(self, button): # find current active tab index = self.log_tabWidget.currentIndex() for tab_index, tab in enumerate(self.tabs_list): if self.log_tabWidget.indexOf(tab) == index: # copy text self.text_widgets_list[tab_index].copy() # this method is refresh log messages in text_edit def refreshLogPushButtonPressed(self, button): # read logs for index, file in enumerate(self.log_files_list): f = open(file, 'r') f_lines = f.readlines() f.close() text = 'Log file:\n' for line in f_lines: text = text + str(line) + '\n' self.text_widgets_list[index].clear() self.text_widgets_list[index].insertPlainText(text) # close window with ESC key def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.close() def closeEvent(self, event): self.layout().setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint) self.setMinimumSize(QSize(self.width(), self.minimum_height)) self.resize(QSize(self.width(), self.minimum_height)) self.persepolis_setting.setValue('LogWindow/size', self.size()) self.persepolis_setting.setValue('LogWindow/position', self.pos()) self.persepolis_setting.sync() event.accept() def changeIcon(self, icons): icons = ':/' + str(icons) + '/' self.close_pushButton.setIcon(QIcon(icons + 'remove')) self.copy_log_pushButton.setIcon(QIcon(icons + 'clipboard')) self.report_pushButton.setIcon(QIcon(icons + 'about')) self.refresh_log_pushButton.setIcon(QIcon(icons + 'refresh')) ================================================ FILE: persepolis/scripts/logger.py ================================================ # -*- coding: utf-8 -*- # 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 . # from persepolis.scripts.useful_tools import determineConfigFolder from persepolis.scripts.osCommands import touch import logging import os def setUpLogger(logger_name, log_file, level): # define logging object logObj = logging.getLogger(logger_name) logObj.setLevel(level) # don't show log in console logObj.propagate = False # create a file handler handler = logging.FileHandler(log_file) handler.setLevel(logging.INFO) # create a logging format formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) # add the handlers to the logger logObj.addHandler(handler) return logObj # config_folder config_folder = determineConfigFolder() # create a directory if it does not exist if not os.path.exists(config_folder): os.makedirs(config_folder) # log files address initialization_log_file = os.path.join(str(config_folder), 'initialization_log_file.log') downloads_log_file = os.path.join(str(config_folder), 'downloads_log_file.log') errors_log_file = os.path.join(str(config_folder), 'errors_log_file.log') for file in [initialization_log_file, downloads_log_file, errors_log_file]: if not os.path.isfile(file): touch(file) initialization_logger = setUpLogger('initialization', initialization_log_file, logging.INFO) downloads_logger = setUpLogger('downloads', downloads_log_file, logging.INFO) errors_logger = setUpLogger('errors', errors_log_file, logging.ERROR) def sendToLog(text="", type="INFO"): if type == "INITIALIZATION": initialization_logger.info(text) elif type == "ERROR": errors_logger.error(text) elif type == 'DOWNLOADS': downloads_logger.info(text) elif type == 'DOWNLOAD ERROR': downloads_logger.error(text) errors_logger.error(text) else: initialization_logger.info(text) ================================================ FILE: persepolis/scripts/mainwindow.py ================================================ # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import os import ast import sys import glob import random import requests import tempfile import subprocess import urllib.parse from time import sleep from copy import deepcopy from functools import partial from persepolis.constants import OS from persepolis.gui import resources from persepolis.scripts import spider from persepolis.scripts import logger from persepolis.scripts import osCommands from persepolis.scripts.about import AboutWindow from persepolis.scripts.shutdown import shutDown from persepolis.scripts.log_window import LogWindow from persepolis.scripts.text_queue import TextQueue from persepolis.scripts import persepolis_lib_prime from persepolis.scripts.addlink import AddLinkWindow from persepolis.scripts.progress import ProgressWindow from persepolis.scripts.video_finder import VideoFinder from persepolis.scripts.queue import Queue from persepolis.scripts.setting import PreferencesWindow from persepolis.scripts.download_link import DownloadLink from persepolis.scripts.properties import PropertiesWindow from persepolis.scripts.after_download import AfterDownloadWindow from persepolis.scripts.browser_plugin_queue import BrowserPluginQueue from persepolis.scripts.data_base import PluginsDB, PersepolisDB, TempDB from persepolis.gui.mainwindow_ui import MainWindow_Ui, QTableWidgetItem from persepolis.scripts.video_finder_progress import VideoFinderProgressWindow from persepolis.scripts.bubble import notifySend, checkNotificationSounds, createNotificationSounds from persepolis.scripts.useful_tools import nowDate, freeSpace, determineConfigFolder, osAndDesktopEnvironment, getExecPath, ffmpegVersion, findExternalAppPath global pyside6_is_installed try: from PySide6.QtWidgets import QCheckBox, QLineEdit, QAbstractItemView, QFileDialog, QSystemTrayIcon, QMenu, QApplication, QInputDialog, QMessageBox from PySide6.QtCore import QDir, QTime, QCoreApplication, QSize, QPoint, QThread, Signal, Qt, QTranslator, QLocale from PySide6.QtGui import QFont, QIcon, QStandardItem, QCursor, QAction from PySide6 import __version__ as PYQT_VERSION_STR from PySide6.QtCore import __version__ as QT_VERSION_STR pyside6_is_installed = True except ImportError: from PyQt5.QtWidgets import QCheckBox, QLineEdit, QAbstractItemView, QAction, QFileDialog, QSystemTrayIcon, QMenu, QApplication, QInputDialog, QMessageBox from PyQt5.QtCore import QDir, QTime, QCoreApplication, QSize, QPoint, QThread, Qt, QTranslator, QLocale, QT_VERSION_STR from PyQt5.QtGui import QFont, QIcon, QStandardItem, QCursor from PyQt5.Qt import PYQT_VERSION_STR from PyQt5.QtCore import pyqtSignal as Signal pyside6_is_installed = False global youtube_dl_is_installed try: from persepolis.scripts.video_finder_addlink import VideoFinderAddLink from persepolis.scripts import ytdlp_downloader youtube_dl_is_installed = True except ModuleNotFoundError: # if youtube_dl module is not installed: logger.sendToLog( "yt-dlp is not installed.", "ERROR") youtube_dl_is_installed = False # InitializationThread thread can change this variables. global ffmpeg_is_installed ffmpeg_is_installed = False # check if notification sounds are available or not global notification_sounds_are_available notification_sounds_are_available = False # shutdown_notification = 0 >> persepolis is running # 1 >> persepolis is ready for closing(closeEvent is called) # 2 >> OK, let's close application! global shutdown_notification shutdown_notification = 0 # checking_flag : 0 >> normal situation ; # 1 >> remove button or delete button pressed or sorting form viewMenu or ... toggled by user ; # 2 >> check_download_info function is stopping until remove operation done ; # 3 >> deleteFileAction is done it's job and It is called removeButtonPressed. global checking_flag checking_flag = 0 global button_pressed_counter button_pressed_counter = 0 global plugin_links_checked plugin_links_checked = False # find os platform os_type, desktop_env = osAndDesktopEnvironment() # config_folder config_folder = determineConfigFolder() download_info_folder = os.path.join(config_folder, "download_info") # persepolis tmp folder path persepolis_tmp = os.path.join(config_folder, 'persepolis_tmp') # see persepolis.py file for show_window_file and plugin_ready plugin_ready = os.path.join(persepolis_tmp, 'persepolis-plugin-ready') show_window_file = os.path.join(persepolis_tmp, 'show-window') # delete things that are no longer needed class DeleteThingsThatAreNoLongerNeededThread(QThread): NOTIFYSENDSIGNAL = Signal(list) def __init__(self, gid, file_name, status, category, delete_download_file, main_window, video_finder_link): QThread.__init__(self) self.gid = gid self.file_name = file_name self.status = status self.category = category self.delete_download_file = delete_download_file self.main_window = main_window self.video_finder_link = video_finder_link def run(self): # find download_path dictionary = self.main_window.persepolis_db.searchGidInAddLinkTable(self.gid) if dictionary: download_path = dictionary['download_path'] # remove file of download from download folder if self.file_name != '***' and self.status != 'complete': file_name_path = os.path.join( download_path, str(self.file_name)) if self.video_finder_link: # remove all yt-dlp file yt_dlp_files_pattern = file_name_path + '*' for file in glob.glob(yt_dlp_files_pattern): osCommands.remove(file) else: osCommands.remove(file_name_path) # remove file json_control_file = file_name_path + str('.persepolis') osCommands.remove(json_control_file) # remove file.persepolis # remove downloaded file, if download is completed elif self.status == 'complete' and self.delete_download_file: # download is complete. so download_path == file_name_path remove_answer = osCommands.remove(download_path) # if file not existed, notify user if remove_answer == 'no': self.NOTIFYSENDSIGNAL.emit([str(self.file_name), QCoreApplication.translate("mainwindow_src_ui_tr", 'Not Found'), 5000, 'fail']) # remove download item from data base self.main_window.persepolis_db.deleteItemInDownloadTable(self.gid, self.category) # this thread checks: # ffmpeg availability # ffmpeg and python and pyqt and qt versions and write them in log file. # writes os type and desktop env. in log file. # checks notification sounds existance. class InitializationThread(QThread): def __init__(self, parent): QThread.__init__(self) self.parent = parent def run(self): global ffmpeg_is_installed global notification_sounds_are_available # check ffmpeg version ffmpeg_is_installed, ffmpeg_output, ffmpeg_command_log_list = ffmpegVersion() logger.sendToLog(ffmpeg_command_log_list[0], ffmpeg_command_log_list[1]) logger.sendToLog(ffmpeg_output, "INFO") # write ffmpeg path to log ffmpeg_command, log_list = findExternalAppPath('ffmpeg') ffmpeg_command_is = 'ffmpeg command is: ' + str(ffmpeg_command) logger.sendToLog(ffmpeg_command_is, "INFO") # check notification sound files existance and create them if it's necessary. notification_sounds_are_available = checkNotificationSounds() if not (notification_sounds_are_available): notification_sounds_are_available = createNotificationSounds(self.parent) # log python version logger.sendToLog('python version: ' + str(sys.version)) # log qt version logger.sendToLog('QT version: ' + str(QT_VERSION_STR)) # log pyqt version if pyside6_is_installed: madule_str = 'PySide version: ' else: madule_str = 'PyQt version: ' logger.sendToLog(madule_str + str(PYQT_VERSION_STR)) # log os and desktop env. logger.sendToLog('Operating system: ' + os_type) # windows and mac haven't desktop_env if desktop_env: logger.sendToLog('Desktop env.: ' + str(desktop_env)) # check clipboard class CheckClipBoardThread(QThread): CHECKCLIPBOARDSIGNAL = Signal() def __init__(self, parent): QThread.__init__(self) def run(self): # shutdown_notification = 0 >> persepolis is running # 1 >> persepolis is ready for closing(closeEvent called) # 2 >> OK, let's close application! while shutdown_notification == 0: sleep(1) clipboard = QApplication.clipboard() old_clipboard = "" while shutdown_notification == 0: sleep(0.5) new_clipboard = clipboard.text() if (new_clipboard != old_clipboard) and (new_clipboard != ""): self.CHECKCLIPBOARDSIGNAL.emit() old_clipboard = new_clipboard # check if any thing in clipboard or not class CheckClipboardStateThread(QThread): WINDOWISACTIVESIGNAL = Signal() def __init__(self): QThread.__init__(self) def run(self): while (QApplication.clipboard().text() == ""): sleep(0.1) self.WINDOWISACTIVESIGNAL.emit() # check for newer version of Persepolis class CheckNewerVersionThread(QThread): NEWVERSIONISAVAILABLESIGNAL = Signal(str) def __init__(self, parent): QThread.__init__(self) # get current_version from QSettings self.current_version = parent.persepolis_setting.value('version/version') def run(self): try: # get information dictionary from github updatesource = requests.get('https://persepolisdm.github.io/version', timeout=5) updatesource_text = updatesource.text updatesource_dict = ast.literal_eval(updatesource_text) # get latest stable version server_version = updatesource_dict['version'] # Comparison if float(server_version) > float(self.current_version): self.NEWVERSIONISAVAILABLESIGNAL.emit(str(server_version)) except Exception as e: logger.sendToLog("An error occurred while checking for a new release:", 'ERROR') logger.sendToLog("{}".format(str(e)), 'ERROR') # This thread checking that which row in download_table highlighted by user class CheckSelectedRowThread(QThread): CHECKSELECTEDROWSIGNAL = Signal() def __init__(self): QThread.__init__(self) def run(self): while shutdown_notification == 0: sleep(0.2) self.CHECKSELECTEDROWSIGNAL.emit() # This thread is getting download information and updating database class CheckDownloadInfoThread(QThread): DOWNLOAD_INFO_SIGNAL = Signal(list) def __init__(self, parent): QThread.__init__(self) self.main_window = parent def run(self): global checking_flag global shutdown_notification while True: # shutdown_notification = 0 >> persepolis is running # 1 >> persepolis is ready for closing(closeEvent called) # 2 >> OK, let's close application! # checking_flag : 0 >> normal situation ; # 1 >> remove button or delete button pressed or sorting form viewMenu selected by user ; # 2 >> check_download_info function is stopping until remove operation done ; # 3 >> deleteFileAction is done it's job and It is called removeButtonPressed. # data base is updated one time in five times. update_data_base_counter = 0 while shutdown_notification != 1: sleep(0.2) # if checking_flag is equal to 1, it means that user pressed # remove or delete button . so checking download information # must stop until removing is done! It avoids possibility of crashing! if checking_flag == 1: # Ok loop is stopped! checking_flag = 2 # check that when job is done! while checking_flag != 0: sleep(0.2) download_status_list = [] # get download information and append it to download_sessions_list write_it = 0 for download_session_dict in self.main_window.download_sessions_list: # get information returned_dict = download_session_dict['download_session'].tellStatus() if download_session_dict['download_session'].write_it_to_the_database is False: download_session_dict['download_session'].write_it_to_the_database = True write_it += 1 # add gid to download_session_dict download_status_list.append(returned_dict) # now we have a list that contains download information (download_status_list) # lets update download table in main window and update data base! # first emit a signal for updating MainWindow. self.DOWNLOAD_INFO_SIGNAL.emit(download_status_list) # data base is updated 1 time in 5 times. if update_data_base_counter == 4 or write_it != 0: self.main_window.persepolis_db.updateDownloadTable(download_status_list) # data base is updated 1 time in 5 times. update_data_base_counter = -1 else: update_data_base_counter = update_data_base_counter + 1 # Ok exit loop! get ready for shutting down! shutdown_notification = 2 break # SpiderThread calls spider in spider.py . # spider finds file size and file name of download file . # spider works similar to spider in wget. class SpiderThread(QThread): SPIDERSIGNAL = Signal(dict) def __init__(self, add_link_dictionary, parent): QThread.__init__(self) self.add_link_dictionary = add_link_dictionary self.parent = parent def run(self): try: # get file_name and file size with spider file_name, size = spider.spider(self.add_link_dictionary) # update data base dictionary = {'file_name': file_name, 'size': size, 'gid': self.add_link_dictionary['gid']} self.parent.persepolis_db.updateDownloadTable([dictionary]) # update table in MainWindow self.SPIDERSIGNAL.emit(dictionary) except Exception: # write ERROR message logger.sendToLog( "Spider couldn't find download information", "ERROR") # CheckingThread have 2 duty! # 1-this class is checking that if user add a link with browsers plugin. # 2-assume that user executed program before . # if user is clicking on persepolis icon in menu this tread emits SHOWMAINWINDOWSIGNAL class CheckingThread(QThread): CHECKPLUGINDBSIGNAL = Signal() SHOWMAINWINDOWSIGNAL = Signal() def __init__(self): QThread.__init__(self) def run(self): global plugin_links_checked # shutdown_notification = 0 >> persepolis is running # 1 >> persepolis is ready for closing(closeEvent called) # 2 >> OK, let's close application! while shutdown_notification == 0: sleep(0.2) # it means , user clicked on persepolis icon and persepolis is # still running. see persepolis file for more details. if os.path.isfile(show_window_file): # OK! we catch notification! remove show_window_file now! osCommands.remove(show_window_file) # emit a signal to notify MainWindow for showing itself! self.SHOWMAINWINDOWSIGNAL.emit() # It means new browser plugin call is available! if os.path.isfile(plugin_ready): # OK! We received notification! remove plugin_ready file osCommands.remove(plugin_ready) # When checkPluginCall method considered request , then # plugin_links_checked is changed to True plugin_links_checked = False self.CHECKPLUGINDBSIGNAL.emit() # notifying that we have browser_plugin request while plugin_links_checked is not True: # wait for persepolis consideration! sleep(0.5) # if checking_flag is equal to 1, it means that user pressed remove or delete button or ... . # so checking download information must be stopped until job is done! # this thread checks checking_flag and when checking_flag changes to 2 # QTABLEREADY signal is emitted class WaitThread(QThread): QTABLEREADY = Signal() def __init__(self): QThread.__init__(self) def run(self): global checking_flag checking_flag = 1 while checking_flag != 2: sleep(0.05) self.QTABLEREADY.emit() # button_pressed_counter changed if user pressed move up and move down and ... actions # this thread is changing checking_flag to zero if button_pressed_counter # don't change for 2 seconds class ButtonPressedThread(QThread): def __init__(self): QThread.__init__(self) def run(self): global checking_flag current_button_pressed_value = deepcopy(button_pressed_counter) + 1 while current_button_pressed_value != button_pressed_counter: current_button_pressed_value = deepcopy(button_pressed_counter) sleep(2) # job is done! checking_flag = 0 class ShutDownThread(QThread): def __init__(self, parent, category, password=None): QThread.__init__(self) self.category = category self.password = password self.parent = parent self.crash = False def run(self): shutDown(self.parent, category=self.category, password=self.password) # this thread is keeping system awake! because if system sleeps , then internet connection is disconnected! # strategy is simple! a loop is checking mouse position every 20 seconds. # if mouse position didn't change, cursor is moved by QCursor.setPos() (see keepAwake method) ! so this is keeping system awake! # class KeepAwakeThread(QThread): KEEPSYSTEMAWAKESIGNAL = Signal(bool) def __init__(self): QThread.__init__(self) def run(self): while shutdown_notification == 0: old_cursor_array = [0, 0] add = True while shutdown_notification == 0: # sleep 20 if persepolis not exited. for i in range(1, 20): if shutdown_notification == 0: sleep(1) else: break # finding cursor position cursor_position = QCursor.pos() new_cursor_array = [int(cursor_position.x()), int(cursor_position.y())] if new_cursor_array == old_cursor_array: # So cursor position didn't change for 20 second. if add: # Moving mouse position one time +10 pixel and one time -10 pixel! self.KEEPSYSTEMAWAKESIGNAL.emit(add) add = False else: self.KEEPSYSTEMAWAKESIGNAL.emit(add) add = True old_cursor_array = new_cursor_array # This thread moves files to another destination. # see moveSelectedDownloads method for more information. class MoveThread(QThread): NOTIFYSENDSIGNAL = Signal(list) def __init__(self, parent, gid_list, new_folder_path): QThread.__init__(self) self.new_folder_path = new_folder_path self.parent = parent self.gid_list = gid_list def run(self): add_link_dict_list = [] # move selected downloads # find row number for specific gid for gid in self.gid_list: # find download path dictionary = self.parent.persepolis_db.searchGidInAddLinkTable(gid) self.old_file_path = dictionary['download_path'] # find file_name self.file_name = os.path.basename(self.old_file_path) self.move = osCommands.moveFile(self.old_file_path, self.new_folder_path) # if moving is not successful, notify user. if not (self.move): self.NOTIFYSENDSIGNAL.emit([str(self.file_name), QCoreApplication.translate("mainwindow_src_ui_tr", 'Operation was not successful!'), 5000, 'fail']) else: new_file_path = os.path.join(self.new_folder_path, self.file_name) add_link_dict = {'gid': gid, 'download_path': new_file_path} # add add_link_dict to add_link_dict_list add_link_dict_list.append(add_link_dict) # notify user that job is done! self.NOTIFYSENDSIGNAL.emit([QCoreApplication.translate("mainwindow_src_ui_tr", "Moving is"), QCoreApplication.translate("mainwindow_src_ui_tr", 'finished!'), 5000, 'warning']) # update data base self.parent.persepolis_db.updateAddLinkTable(add_link_dict_list) class MainWindow(MainWindow_Ui): def __init__(self, start_in_tray, persepolis_main, persepolis_setting): super().__init__(persepolis_setting) self.persepolis_setting = persepolis_setting self.persepolis_main = persepolis_main global icons icons = ':/' + \ str(self.persepolis_setting.value('settings/icons')) + '/' # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) # this variable is changed to True, # if user highlights multiple items in download_table self.multi_items_selected = False # this variable is changed to False when # user clicks on 'hide options' button in # side panel. # see showQueuePanelOptions method for more information. self.show_queue_panel = True # system_tray_icon self.system_tray_icon = QSystemTrayIcon() self.system_tray_icon.setIcon( QIcon.fromTheme('persepolis-tray', QIcon(':/persepolis-tray.svg'))) # menu of system tray icon system_tray_menu = QMenu() system_tray_menu.addAction(self.addlinkAction) system_tray_menu.addAction(self.videoFinderAddLinkAction) system_tray_menu.addAction(self.stopAllAction) system_tray_menu.addAction(self.addFromClipboardAction) system_tray_menu.addAction(self.minimizeAction) system_tray_menu.addAction(self.exitAction) self.system_tray_icon.setContextMenu(system_tray_menu) # if system tray icon pressed: self.system_tray_icon.activated.connect(self.systemTrayPressed) # show system_tray_icon self.system_tray_icon.show() # check trayAction self.trayAction.setChecked(True) # check user preference for showing or hiding system_tray_icon if self.persepolis_setting.value('settings/tray-icon') != 'yes' and start_in_tray is False: self.minimizeAction.setEnabled(False) self.trayAction.setChecked(False) self.system_tray_icon.hide() # hide MainWindow if start_in_tray is equal to "yes" if start_in_tray: self.minimizeAction.setText(QCoreApplication.translate("mainwindow_src_ui_tr", 'Show main Window')) self.minimizeAction.setIcon(QIcon(icons + 'window')) # check user preference for showing or hiding menubar. # (It's not for mac osx or DE that have global menu like kde plasma) if self.persepolis_setting.value('settings/show-menubar') == 'yes': self.menubar.show() self.showMenuBarAction.setChecked(True) self.toolBar2.hide() else: self.menubar.hide() self.showMenuBarAction.setChecked(False) self.toolBar2.show() # In macosx hamburger menu shoud be hidden. if os_type == OS.OSX: self.showMenuBarAction.setEnabled(False) self.toolBar2.hide() # check user preferences for showing or hiding sidepanel. if self.persepolis_setting.value('settings/show-sidepanel') == 'yes': self.category_tree_qwidget.show() self.showSidePanelAction.setChecked(True) else: self.category_tree_qwidget.hide() self.showSidePanelAction.setChecked(False) self.checkSelectedRow() # list of threads self.threadPool = [] # get execution path information self.exec_dictionary = getExecPath() self.exec_file_path = self.exec_dictionary['exec_file_path'] logger.sendToLog("Persepolis path is:\n\t" + self.exec_file_path, "INFO") if self.exec_dictionary['bundle']: # Persepolis is run as a bundle. self.is_bundle = True logger.sendToLog("Persepolis is run as a bundle.", "INFO") else: self.is_bundle = False if self.exec_dictionary['test']: # Persepolis is run from test directory. self.is_test = True logger.sendToLog("Persepolis is run from test directory.", "INFO") else: self.is_test = False if not (self.is_bundle) and not (self.is_test): self.is_test = False logger.sendToLog("Persepolis is run as installed python madule.", "INFO") # initializing # create an object for PluginsDB self.plugins_db = PluginsDB() # create an object for PersepolisDB self.persepolis_db = PersepolisDB() # create an object fo TempDB self.temp_db = TempDB() # create tables self.temp_db.createTables() # check tables in data_base, and change required values to default value. # see data_base.py for more information. self.persepolis_db.setDBTablesToDefaultValue() # get queues name from data base queues_list = self.persepolis_db.categoriesList() # add queues to category_tree(left side panel) for category_name in queues_list: new_queue_category = QStandardItem(category_name) font = QFont() font.setBold(True) new_queue_category.setFont(font) new_queue_category.setEditable(False) self.category_tree_model.appendRow(new_queue_category) # read from data base # add download items to the download_table # read download items from data base download_table_dict = self.persepolis_db.returnItemsInDownloadTable() # read gid_list from date base category_dict = self.persepolis_db.searchCategoryInCategoryTable('All Downloads') gid_list = category_dict['gid_list'] keys_list = ['file_name', 'status', 'size', 'downloaded_size', 'percent', 'connections', 'rate', 'estimate_time_left', 'gid', 'link', 'first_try_date', 'last_try_date', 'category' ] # insert items in download_table for gid in gid_list: # create new row self.download_table.insertRow(0) dict = download_table_dict[gid] i = 0 for key in keys_list: item = QTableWidgetItem(str(dict[key])) self.download_table.setItem(0, i, item) i = i + 1 # get video_finder gids self.all_video_finder_gid_list, self.all_video_finder_video_gid_list, self.all_video_finder_audio_gid_list = self.persepolis_db.returnVideoFinderGids() # defining some lists and dictionaries for running addlinkwindows and # propertieswindows and propertieswindows , ... self.addlinkwindows_list = [] self.propertieswindows_list = [] self.progress_window_list = [] self.afterdownload_list = [] self.text_queue_window_list = [] self.about_window_list = [] self.plugin_queue_window_list = [] self.logwindow_list = [] self.progress_window_list_dict = {} self.capturekeywindows_list = [] # download_sessions_list contains some dictionaries. # every dictionary contains GID and session of that download process. self.download_sessions_list = [] # queue_list_dict contains queue threads >> queue_list_dict[name of queue] self.queue_list_dict = {} # this dictionary contains VideoFinder threads # key = video_gid and value = VideoFinder thread self.video_finder_threads_dict = {} # This list contains single video link gids self.single_video_link_gid_list = [] # CheckDownloadInfoThread check_download_info = CheckDownloadInfoThread(self) self.threadPool.append(check_download_info) self.threadPool[0].start() self.threadPool[0].DOWNLOAD_INFO_SIGNAL.connect(self.checkDownloadInfo) # CheckSelectedRowThread check_selected_row = CheckSelectedRowThread() self.threadPool.append(check_selected_row) self.threadPool[1].start() self.threadPool[1].CHECKSELECTEDROWSIGNAL.connect( self.checkSelectedRow) # CheckingThread check_browser_plugin = CheckingThread() self.threadPool.append(check_browser_plugin) self.threadPool[2].start() self.threadPool[2].CHECKPLUGINDBSIGNAL.connect(self.checkPluginCall) self.threadPool[2].SHOWMAINWINDOWSIGNAL.connect(self.showMainWindow) # Checking clipboard if str(self.persepolis_setting.value('settings/check-clipboard')) == 'yes': # QApplication.clipboard().dataChanged.connect(self.importLinksFromClipboard) check_clipboard_thread = CheckClipBoardThread(self) self.threadPool.append(check_clipboard_thread) self.threadPool[-1].start() self.threadPool[-1].CHECKCLIPBOARDSIGNAL.connect( self.importLinksFromClipboard) # keepawake self.ongoing_downloads = 0 keep_awake = KeepAwakeThread() self.threadPool.append(keep_awake) self.threadPool[-1].start() self.threadPool[-1].KEEPSYSTEMAWAKESIGNAL.connect(self.keepAwake) # this thread checks ffmpeg availability. # this thread checks ffmpeg and python and pyqt and qt versions and write them in log file. # this thread writes os type and desktop env. in log file. check_version_thread = InitializationThread(self) self.threadPool.append(check_version_thread) self.threadPool[-1].start() # finding number or row that user selected! self.download_table.itemSelectionChanged.connect(self.selectedRow) # if user doubleclicks on an item in download_table , then openFile # function executes self.download_table.itemDoubleClicked.connect(self.openFile) # connecting queue_panel_show_button to showQueuePanelOptions self.queue_panel_show_button.clicked.connect( self.showQueuePanelOptions) # connecting start_checkBox to startFrame self.start_checkBox.toggled.connect(self.startFrame) self.start_checkBox.setChecked(False) # connecting end_checkBox to endFrame self.end_checkBox.toggled.connect(self.endFrame) self.end_checkBox.setChecked(False) # connecting after_checkBox to afterFrame self.after_checkBox.toggled.connect(self.afterFrame) self.after_checkBox.setChecked(False) # speed limit self.limit_dial.setValue(10) self.limit_dial.sliderReleased.connect(self.limitDialIsReleased) self.limit_dial.valueChanged.connect(self.limitDialIsChanged) self.limit_label.setText('Speed : Maximum') # connecting after_pushButton to afterPushButtonPressed self.after_pushButton.clicked.connect(self.afterPushButtonPressed) # setting index of all downloads for category_tree global current_category_tree_index current_category_tree_index = self.category_tree_model.index(0, 0) self.category_tree.setCurrentIndex(current_category_tree_index) # this line set toolBar And Context Menu Items self.toolBarAndContextMenuItems('All Downloads') self.category_tree_qwidget.setEnabled(True) # keep_awake_checkBox if str(self.persepolis_setting.value('settings/awake')) == 'yes': self.keep_awake_checkBox.setChecked(True) else: self.keep_awake_checkBox.setChecked(False) self.keep_awake_checkBox.toggled.connect(self.keepAwakeCheckBoxToggled) self.muxing_pushButton.clicked.connect(self.muxingPushButtonPressed) # finding windows_size size = self.persepolis_setting.value( 'MainWindow/size', QSize(930, 554)) position = self.persepolis_setting.value( 'MainWindow/position', QPoint(300, 300)) # setting window size self.resize(size) self.move(position) # download_table column size # column 0 size = self.persepolis_setting.value( 'MainWindow/column0', '169') self.download_table.setColumnWidth(0, int(size)) # column 1 size = self.persepolis_setting.value( 'MainWindow/column1', '100') self.download_table.setColumnWidth(1, int(size)) # column 2 size = self.persepolis_setting.value( 'MainWindow/column2', '200') self.download_table.setColumnWidth(2, int(size)) # column 3 size = self.persepolis_setting.value( 'MainWindow/column3', '200') self.download_table.setColumnWidth(3, int(size)) # column 4 size = self.persepolis_setting.value( 'MainWindow/column4', '200') self.download_table.setColumnWidth(4, int(size)) # column 5 size = self.persepolis_setting.value( 'MainWindow/column5', '100') self.download_table.setColumnWidth(5, int(size)) # column 6 size = self.persepolis_setting.value( 'MainWindow/column6', '119') self.download_table.setColumnWidth(6, int(size)) # column 7 size = self.persepolis_setting.value( 'MainWindow/column7', '109') self.download_table.setColumnWidth(7, int(size)) # column 10 size = self.persepolis_setting.value( 'MainWindow/column10', '120') self.download_table.setColumnWidth(10, int(size)) # column 11 size = self.persepolis_setting.value( 'MainWindow/column11', '134') self.download_table.setColumnWidth(11, int(size)) # column 12 size = self.persepolis_setting.value( 'MainWindow/column11', '185') self.download_table.setColumnWidth(12, int(size)) # check maximizing situation in persepolis_setting if str(self.persepolis_setting.value('MainWindow/maximized')) == 'yes': self.showMaximized() # get columns visibility situation from persepolis_setting if str(self.persepolis_setting.value('settings/column0')) == 'yes': self.download_table.setColumnHidden(0, False) else: self.download_table.setColumnHidden(0, True) if str(self.persepolis_setting.value('settings/column1')) == 'yes': self.download_table.setColumnHidden(1, False) else: self.download_table.setColumnHidden(1, True) if str(self.persepolis_setting.value('settings/column2')) == 'yes': self.download_table.setColumnHidden(2, False) else: self.download_table.setColumnHidden(2, True) if str(self.persepolis_setting.value('settings/column3')) == 'yes': self.download_table.setColumnHidden(3, False) else: self.download_table.setColumnHidden(3, True) if str(self.persepolis_setting.value('settings/column4')) == 'yes': self.download_table.setColumnHidden(4, False) else: self.download_table.setColumnHidden(4, True) if str(self.persepolis_setting.value('settings/column5')) == 'yes': self.download_table.setColumnHidden(5, False) else: self.download_table.setColumnHidden(5, True) if str(self.persepolis_setting.value('settings/column6')) == 'yes': self.download_table.setColumnHidden(6, False) else: self.download_table.setColumnHidden(6, True) if str(self.persepolis_setting.value('settings/column7')) == 'yes': self.download_table.setColumnHidden(7, False) else: self.download_table.setColumnHidden(7, True) if str(self.persepolis_setting.value('settings/column10')) == 'yes': self.download_table.setColumnHidden(10, False) else: self.download_table.setColumnHidden(10, True) if str(self.persepolis_setting.value('settings/column11')) == 'yes': self.download_table.setColumnHidden(11, False) else: self.download_table.setColumnHidden(11, True) if str(self.persepolis_setting.value('settings/column12')) == 'yes': self.download_table.setColumnHidden(12, False) else: self.download_table.setColumnHidden(12, True) icons_size = int(self.persepolis_setting.value('settings/toolbar_icon_size')) self.toolBar.setIconSize(QSize(icons_size, icons_size)) self.toolBar2.setIconSize(QSize(icons_size, icons_size)) # check reverse_checkBox self.reverse_checkBox.setChecked(False) # this method used by shutdown script for changing shutdown_notification value def changeShutdownValue(self, value): global shutdown_notification shutdown_notification = value # this method used by shutdown script def returnShutDownValue(self): return shutdown_notification # notifySend function uses QSoundEffect for playing notification sounds. # QSoundEffect plays sound by executing a QThread. # We can't run a QThread from another QThread in PyQt and PySide. # So if a QThread want to send a notification, # it will emit a signal to this method. def notifySendFromThread(self, signal_list): notifySend(signal_list[0], signal_list[1], signal_list[2], signal_list[3], parent=self) # read KeepAwakeThread for more information def keepAwake(self, add): # finding cursor position cursor_position = QCursor.pos() cursor_array = [int(cursor_position.x()), int(cursor_position.y())] # check user selected option. # don't do anything if we haven't any active downloads if self.persepolis_setting.value('settings/awake') == 'yes' and self.ongoing_downloads != 0: if add is True and self.keep_awake_checkBox.isChecked() is True: # Moving mouse position one time +1 pixel and one time -1 pixel! QCursor.setPos(cursor_array[0] + 1, cursor_array[1] + 1) else: QCursor.setPos(cursor_array[0] - 1, cursor_array[1] - 1) # This method notifies user about newer version of Persepolis def newVersionIsAvailable(self, message): new_version = str(message) new_version = new_version[0:-1] + '.' + new_version[-1] # notify user about newer version notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Version {} is available!".format(new_version)), QCoreApplication.translate("mainwindow_src_ui_tr", "Please update Persepolis."), 10000, '', parent=self) # if keep_awake_checkBox toggled by user , this method is called. def keepAwakeCheckBoxToggled(self, checkbox): if self.keep_awake_checkBox.isChecked(): self.persepolis_setting.setValue('settings/awake', 'yes') self.keep_awake_checkBox.setChecked(True) else: self.persepolis_setting.setValue('settings/awake', 'no') self.keep_awake_checkBox.setChecked(False) self.persepolis_setting.sync() # this method updates download_table in MainWindow # # download_table_header = ['File Name', 'Status', 'Size', 'Downloaded', 'Percentage', 'Connections', # 'Transfer rate', 'Estimated time left', 'Gid', 'Link', 'First try date', 'Last try date', 'Category'] def checkDownloadInfo(self, list): # number of ongoing downloads. # this variable helps keepAwake method. self.ongoing_downloads = len(list) systemtray_tooltip_text = 'Persepolis Download Manager' for download_status_dict in list: gid = download_status_dict['gid'] status = download_status_dict['status'] if status == 'complete' or status == 'error' or status == 'stopped': # eliminate gid from active_downloads in data base temp_dict = {'gid': gid, 'status': 'deactive'} self.temp_db.updateSingleTable(temp_dict) # add download percent to the tooltip text for persepolis system tray icon try: if status == 'downloading' and download_status_dict['percent'] != '0%': system_tray_file_name = download_status_dict['file_name'] if len(system_tray_file_name) > 20: system_tray_file_name = system_tray_file_name[0:19] + '...' systemtray_tooltip_text = systemtray_tooltip_text + '\n'\ + system_tray_file_name + ': '\ + download_status_dict['percent'] except Exception: pass # Is the link related to VideoFinder? video_finder_link = False if gid in self.all_video_finder_gid_list: video_finder_dictionary = self.persepolis_db.searchGidInVideoFinderTable(gid) video_finder_link = True if video_finder_dictionary['video_gid'] in self.video_finder_threads_dict.keys(): video_finder_thread = self.video_finder_threads_dict[video_finder_dictionary['video_gid']] # is gid related to video? or audio if gid == video_finder_dictionary['video_gid']: video_finder_video_gid = True else: video_finder_video_gid = False # if download is completed update video finder data base if status == 'complete': if video_finder_video_gid: video_finder_dictionary['video_completed'] = 'yes' video_finder_thread.video_completed = 'yes' else: video_finder_dictionary['audio_completed'] = 'yes' video_finder_thread.audio_completed = 'yes' # update data base self.persepolis_db.updateVideoFinderTable([video_finder_dictionary]) # if download stopped, VideoFinder must be notified. so update data base. if video_finder_dictionary['checking'] == 'yes' and (status == 'error' or status == 'stopped'): video_finder_dictionary['checking'] = 'no' video_finder_thread.checking = 'no' # update data base self.persepolis_db.updateVideoFinderTable([video_finder_dictionary]) else: video_finder_link = False # If link is single_video_link if gid in self.single_video_link_gid_list: single_video_link = True else: single_video_link = False if status == 'error': # check free space in download_folder # perhaps insufficient space in hard disk caused this error! # find free space in KiB # find download path dictionary = self.persepolis_db.searchGidInAddLinkTable(gid) download_path = dictionary['download_path'] free_space = freeSpace(download_path) # find file size file_size = download_status_dict['size'] if file_size is not None: if file_size[-2:] != ' B': unit = file_size[-3:] try: if unit == 'TiB' or unit == 'GiB': size_value = float(file_size[:-4]) else: size_value = int(file_size[:-4]) except ValueError: size_value = None else: unit = None try: size_value = int(file_size) except ValueError: size_value = None if free_space is not None and size_value is not None: if unit == 'TiB': free_space = free_space / (1073741824 * 1024) free_space = round(free_space, 2) elif unit == 'GiB': free_space = free_space / 1073741824 free_space = round(free_space, 2) elif unit == 'MiB': free_space = int(free_space / 1048576) elif unit == 'KiB': free_space = int(free_space / 1024) else: free_space = int(free_space) if free_space < size_value: error = 'Insufficient disk space!' # write error_message in log file error_message = 'Download failed - GID : '\ + str(gid)\ + '- Message : '\ + error logger.sendToLog(error_message, 'DOWNLOAD ERROR') # show notification notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Error: ") + error, QCoreApplication.translate("mainwindow_src_ui_tr", 'There is not enough disk space available at the download folder! Please choose another one or clear some space.'), 10000, 'fail', parent=self) # find row of this gid in download_table! row = None for i in range(self.download_table.rowCount()): row_gid = self.download_table.item(i, 8).text() if gid == row_gid: row = i break # update download_table items if row is not None: update_list = [download_status_dict['file_name'], download_status_dict['status'], download_status_dict['size'], download_status_dict['downloaded_size'], download_status_dict['percent'], download_status_dict['connections'], download_status_dict['rate'], download_status_dict['estimate_time_left'], download_status_dict['gid'], None, None, None, None] for i in range(12): # update download_table cell if update_list item in not None if update_list[i]: text = update_list[i] else: text = self.download_table.item(row, i).text() # create a QTableWidgetItem item = QTableWidgetItem(text) # set item try: self.download_table.setItem(row, i, item) except Exception as problem: logger.sendToLog( "Error occurred while updating download table", "ERROR") logger.sendToLog(problem, "ERROR") # update download_table (refreshing!) self.download_table.viewport().update() # update progresswindow labels # check that any progress_window is available for this gid or not! if gid in self.progress_window_list_dict.keys(): # find progress_window for this gid member_number = self.progress_window_list_dict[gid] progress_window = self.progress_window_list[member_number] # if link is related to video finder if video_finder_link: # download percent value = download_status_dict['percent'] if not (value): value = '0%' if video_finder_dictionary['video_completed'] == 'yes': video_status = 'Completed' elif video_finder_video_gid: video_status = value + ' downloaded' else: video_status = 'Not completed' video_status = QCoreApplication.translate("video_finder_progress_ui_tr", "Video file status: ")\ + video_status progress_window.video_status_label.setText(video_status) if video_finder_dictionary['audio_completed'] == 'yes': audio_status = 'Completed' elif not (video_finder_video_gid): audio_status = value + ' downloaded' else: audio_status = 'Not completed' audio_status = QCoreApplication.translate("video_finder_progress_ui_tr", "Audio file status: ")\ + audio_status progress_window.audio_status_label.setText(audio_status) if video_finder_dictionary['video_completed'] == 'yes' and video_finder_dictionary['audio_completed'] == 'yes': muxing_status = 'Started!' else: muxing_status = 'Not started!' muxing_status = QCoreApplication.translate("video_finder_progress_ui_tr", "Muxing status: ")\ + muxing_status progress_window.muxing_status_label.setText(muxing_status) # tell to progress_window what gid is in progress progress_window.gid = gid # link link = QCoreApplication.translate("mainwindow_src_ui_tr", "Link: ") + str(download_status_dict['link']) progress_window.link_label.setText(link) progress_window.link_label.setToolTip(link) # downloaded downloaded_size = download_status_dict['downloaded_size'] if downloaded_size is None: downloaded_size = 'None' file_size = download_status_dict['size'] if file_size is None: file_size = 'None' if file_size != ' ': if video_finder_link or single_video_link: downloaded = QCoreApplication.translate("mainwindow_src_ui_tr", "Downloaded/Est. file size: ") \ + str(downloaded_size) \ + "/" \ + str(file_size) else: downloaded = QCoreApplication.translate("mainwindow_src_ui_tr", "Downloaded: ") \ + str(downloaded_size) \ + "/" \ + str(file_size) else: downloaded = QCoreApplication.translate("mainwindow_src_ui_tr", "Downloaded: ") \ + str(downloaded_size) \ progress_window.downloaded_label.setText(downloaded) # Transfer rate rate = QCoreApplication.translate("mainwindow_src_ui_tr", "Transfer rate: ") \ + str(download_status_dict['rate']) progress_window.rate_label.setText(rate) # Estimate time left estimate_time_left = QCoreApplication.translate("mainwindow_src_ui_tr", "Estimated time left: ") \ + str(download_status_dict['estimate_time_left']) progress_window.time_label.setText(estimate_time_left) # Connections if video_finder_link or single_video_link: connections = QCoreApplication.translate("mainwindow_src_ui_tr", "Fragments: ") \ + str(download_status_dict['connections']) else: connections = QCoreApplication.translate("mainwindow_src_ui_tr", "Connections: ") \ + str(download_status_dict['connections']) progress_window.connections_label.setText(connections) # progressbar value = download_status_dict['percent'] file_name = str(download_status_dict['file_name']) try: value = int(value[:-1]) except ValueError: value = 0 if value == 0 and downloaded_size != 0: # show busy indicator progress_window.download_progressBar.showBusyIndicator() if file_name != "***": windows_title = str(file_name) progress_window.setWindowTitle(windows_title) else: progress_window.download_progressBar.setValueSmoothly(value) if file_name != "***": windows_title = '(' + str(value) + '%)' + str(file_name) progress_window.setWindowTitle(windows_title) # status progress_window.status = str(download_status_dict['status']) status = QCoreApplication.translate("mainwindow_src_ui_tr", "Status: ") + progress_window.status progress_window.status_label.setText(status) # activate/deactivate progress_window buttons according to status if progress_window.status == "downloading": progress_window.resume_pushButton.setEnabled(False) progress_window.stop_pushButton.setEnabled(True) progress_window.pause_pushButton.setEnabled(True) elif progress_window.status == "paused": progress_window.resume_pushButton.setEnabled(True) progress_window.stop_pushButton.setEnabled(True) progress_window.pause_pushButton.setEnabled(False) elif progress_window.status == "waiting": progress_window.resume_pushButton.setEnabled(False) progress_window.stop_pushButton.setEnabled(True) progress_window.pause_pushButton.setEnabled(False) elif progress_window.status == "scheduled": progress_window.resume_pushButton.setEnabled(False) progress_window.stop_pushButton.setEnabled(True) progress_window.pause_pushButton.setEnabled(False) # if download stopped: elif progress_window.status == "stopped": # write message in log stop_message = 'Download stopped - GID : '\ + str(gid) logger.sendToLog(stop_message, 'DOWNLOADS') # show notification notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Download Stopped"), str(download_status_dict['file_name']), 10000, 'no', parent=self) # close progress_window progress_window.close() # eliminate window information from progress_window_list_dict del self.progress_window_list_dict[gid] # if download status is error! elif progress_window.status == "error": # get error message from dict if 'error' in download_status_dict.keys(): error = download_status_dict['error'] else: error = 'Error' # write error_message in log file error_message = 'Download failed - GID : '\ + str(gid)\ + '- Message : '\ + error logger.sendToLog(error_message, 'DOWNLOAD ERROR') # show notification notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Error - ") + error, str(download_status_dict['file_name']), 10000, 'fail', parent=self) # close progress_window progress_window.close() # eliminate window information from progress_window_list_dict del self.progress_window_list_dict[gid] elif progress_window.status == "complete": # close progress_window if download status is stopped or # completed or error # if window is related to video finder and download is completed, don't close window if (video_finder_link is True): # disable stop and pause and push buttons progress_window.resume_pushButton.setEnabled(False) progress_window.stop_pushButton.setEnabled(False) progress_window.pause_pushButton.setEnabled(False) else: progress_window.close() # eliminate window information from progress_window_list_dict del self.progress_window_list_dict[gid] # write message in log file complete_message = 'Download complete - GID : '\ + str(gid) logger.sendToLog(complete_message, 'DOWNLOADS') # play notification notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Download Complete"), download_status_dict['file_name'], 10000, 'ok', parent=self) # sync persepolis_setting before checking! self.persepolis_setting.sync() # check user's Preferences if self.persepolis_setting.value('settings/after-dialog') == 'yes': # show download complete dialog afterdownloadwindow = AfterDownloadWindow( self, download_status_dict, self.persepolis_setting) self.afterdownload_list.append(afterdownloadwindow) self.afterdownload_list[-1].show() # bringing AfterDownloadWindow on top self.afterdownload_list[-1].raise_() self.afterdownload_list[-1].activateWindow() # it means download has finished! # lets do finishing jobs! if progress_window.status == "stopped" or progress_window.status == "error" or progress_window.status == "complete": # set "None" for start_time and end_time and after_download value # in data_base, because download has finished self.persepolis_db.setDefaultGidInAddlinkTable( gid=gid, start_time=True, end_time=True, after_download=True) # THIS PART IS NOT RELATED TO VIDEO FINDER LINKS # if user selects shutdown option for after download progress # value of 'shutdown' in data base will changed to 'wait' for this category # (see ShutDownThread and shutdown.py for more information) # shutDown method will check that value in a loop. # when "wait" changes to "shutdown" then shutdown.py script # will shut down the system shutdown_dict = self.temp_db.returnGid(gid) # get shutdown value for this gid from data base shutdown_status = shutdown_dict['shutdown'] # if status is complete or error, and user selected "shutdown after download" option: if shutdown_status == 'wait': # send notification notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", 'Persepolis is shutting down'), QCoreApplication.translate("mainwindow_src_ui_tr", 'your system in a minute'), 15000, '', parent=self) # write "shutdown" message in data base for this gid >> Shutdown system! shutdown_dict = {'gid': gid, 'shutdown': 'shutdown'} self.temp_db.updateSingleTable(shutdown_dict) # set tooltip for system_tray_icon self.system_tray_icon.setToolTip(systemtray_tooltip_text) # drag and drop for links def dragEnterEvent(self, droplink): text = str(droplink.mimeData().text()) if ("tp:/" in text[2:6]) or ("tps:/" in text[2:7]): droplink.accept() else: droplink.ignore() def dropEvent(self, droplink): link_clipboard = QApplication.clipboard() link_clipboard.clear(mode=link_clipboard.Clipboard) link_string = droplink.mimeData().text() link_clipboard.setText(str(link_string), mode=link_clipboard.Clipboard) self.addLinkButtonPressed(button=link_clipboard) # persepolis identifies each download by the ID called GID. # The GID must be hex string of 16 characters, # thus [0-9a-zA-Z] are allowed and leading zeros must # not be stripped. The GID all 0 is reserved and must # not be used. The GID must be unique, otherwise error # is reported and the download is not added. # gidGenerator generates GID for downloads def gidGenerator(self): # this loop repeats until we have a unique GID while True: # generate a random hex value between 1152921504606846976 and 18446744073709551615 # for download GID my_gid = hex(random.randint(1152921504606846976, 18446744073709551615)) my_gid = my_gid[2:18] my_gid = str(my_gid) # check my_gid used before or not! category_dict = self.persepolis_db.searchCategoryInCategoryTable('All Downloads') gid_list = category_dict['gid_list'] if not (my_gid in gid_list): break return my_gid # this method returns index of all selected rows in list format def userSelectedRows(self): try: # Find selected rows rows_list = [] rows_index = self.download_table.selectionModel().selectedRows() for index in rows_index: rows_list.append(index.row()) # sort list by number rows_list.sort() except Exception: rows_list = [] return rows_list # this method returns number of selected row # if user selected one row! def selectedRow(self): rows_list = self.userSelectedRows() if len(rows_list) == 0: return None else: return rows_list[0] # this method activates/deactivates QActions according to selected row! def checkSelectedRow(self): rows_list = self.userSelectedRows() # check if user selected multiple items if len(rows_list) <= 1: multi_items_selected = False else: multi_items_selected = True # if any thing changed ... if (multi_items_selected and not (self.multi_items_selected)) or (not (multi_items_selected) and self.multi_items_selected): if multi_items_selected: self.multi_items_selected = True else: self.multi_items_selected = False self.selectDownloads() if len(rows_list) != 0: selected_row_return = rows_list[0] status = self.download_table.item(selected_row_return, 1).text() category = self.download_table.item(selected_row_return, 12).text() link = self.download_table.item(selected_row_return, 9).text() self.statusbar.showMessage(str(link)) self.removeSelectedAction.setEnabled(True) self.deleteSelectedAction.setEnabled(True) if category == 'Single Downloads': if status == "scheduled": self.resumeAction.setEnabled(False) self.pauseAction.setEnabled(False) self.stopAction.setEnabled(True) self.propertiesAction.setEnabled(False) self.progressAction.setEnabled(True) self.openDownloadFolderAction.setEnabled(False) self.openFileAction.setEnabled(False) self.moveSelectedDownloadsAction.setEnabled(False) elif status == "stopped" or status == "error": self.stopAction.setEnabled(False) self.pauseAction.setEnabled(False) self.resumeAction.setEnabled(True) self.propertiesAction.setEnabled(True) self.progressAction.setEnabled(False) self.openDownloadFolderAction.setEnabled(False) self.openFileAction.setEnabled(False) self.moveSelectedDownloadsAction.setEnabled(False) elif status == "downloading": self.resumeAction.setEnabled(False) self.pauseAction.setEnabled(True) self.stopAction.setEnabled(True) self.propertiesAction.setEnabled(False) self.progressAction.setEnabled(True) self.openDownloadFolderAction.setEnabled(False) self.openFileAction.setEnabled(False) self.moveSelectedDownloadsAction.setEnabled(False) elif status == "waiting": self.stopAction.setEnabled(True) self.resumeAction.setEnabled(False) self.pauseAction.setEnabled(False) self.propertiesAction.setEnabled(False) self.progressAction.setEnabled(True) self.openDownloadFolderAction.setEnabled(False) self.openFileAction.setEnabled(False) self.moveSelectedDownloadsAction.setEnabled(False) elif status == "complete": self.stopAction.setEnabled(False) self.resumeAction.setEnabled(False) self.pauseAction.setEnabled(False) self.propertiesAction.setEnabled(True) self.progressAction.setEnabled(False) self.openDownloadFolderAction.setEnabled(True) self.openFileAction.setEnabled(True) self.moveSelectedDownloadsAction.setEnabled(True) elif status == "paused": self.stopAction.setEnabled(True) self.resumeAction.setEnabled(True) self.pauseAction.setEnabled(False) self.propertiesAction.setEnabled(False) self.progressAction.setEnabled(True) self.openDownloadFolderAction.setEnabled(False) self.openFileAction.setEnabled(False) self.moveSelectedDownloadsAction.setEnabled(False) else: self.progressAction.setEnabled(False) self.resumeAction.setEnabled(False) self.stopAction.setEnabled(False) self.pauseAction.setEnabled(False) self.propertiesAction.setEnabled(False) self.openDownloadFolderAction.setEnabled(False) self.openFileAction.setEnabled(False) self.moveSelectedDownloadsAction.setEnabled(False) else: self.resumeAction.setEnabled(True) self.pauseAction.setEnabled(True) self.stopAction.setEnabled(True) if status == 'complete': self.propertiesAction.setEnabled(True) self.progressAction.setEnabled(False) self.openDownloadFolderAction.setEnabled(True) self.openFileAction.setEnabled(True) self.moveSelectedDownloadsAction.setEnabled(True) elif status == "stopped" or status == "error": self.propertiesAction.setEnabled(True) self.progressAction.setEnabled(False) self.openDownloadFolderAction.setEnabled(False) self.openFileAction.setEnabled(False) self.moveSelectedDownloadsAction.setEnabled(False) elif status == "scheduled" or status == "downloading" or status == "paused" or status == "waiting": self.propertiesAction.setEnabled(False) self.progressAction.setEnabled(False) self.openDownloadFolderAction.setEnabled(False) self.openFileAction.setEnabled(False) self.moveSelectedDownloadsAction.setEnabled(False) # video_finder_widget # hide video_finder_widget if selected item is not related to video finder # disable pauseAction for video finder links if not (self.multi_items_selected): gid = self.download_table.item(selected_row_return, 8).text() if gid in self.all_video_finder_gid_list: # show widget self.video_finder_widget.show() # disable pauseAction self.pauseAction.setEnabled(False) # gid is related to audio or video?! if gid in self.all_video_finder_video_gid_list: video_gid = gid # set video_label # get video download's percentage self.video_label.setText( QCoreApplication.translate("mainwindow_ui_tr", "Video file status: ") + self.download_table.item(selected_row_return, 4).text() + QCoreApplication.translate("mainwindow_ui_tr", " downloaded")) # find audio information # find row of audio_gid in download_table! audio_gid = self.all_video_finder_audio_gid_list[self.all_video_finder_video_gid_list.index( gid)] row = None for i in range(self.download_table.rowCount()): row_gid = self.download_table.item(i, 8).text() if audio_gid == row_gid: row = i break # set audio_label # get audio download's percentage self.audio_label.setText( QCoreApplication.translate("mainwindow_ui_tr", "Audio file status: ") + self.download_table.item(row, 4).text() + QCoreApplication.translate("mainwindow_ui_tr", " downloaded")) else: # set audio_label # get audio download's percentage self.audio_label.setText( QCoreApplication.translate("mainwindow_ui_tr", "Audio file status: ") + self.download_table.item(selected_row_return, 4).text() + QCoreApplication.translate("mainwindow_ui_tr", " downloaded")) # find video information video_gid = self.all_video_finder_video_gid_list[self.all_video_finder_audio_gid_list.index( gid)] # find video row row = None for i in range(self.download_table.rowCount()): row_gid = self.download_table.item(i, 8).text() if video_gid == row_gid: row = i break # set video_label # get video download's percentage self.video_label.setText( QCoreApplication.translate("mainwindow_ui_tr", "Video file status: ") + self.download_table.item(row, 4).text() + QCoreApplication.translate("mainwindow_ui_tr", " downloaded")) # set activity status and muxing status # show/hide muxing_pushButton if video_gid in self.video_finder_threads_dict.keys(): # find thread video_finder_thread = self.video_finder_threads_dict[video_gid] # check activity if video_finder_thread.active == 'yes': video_finder_status = QCoreApplication.translate('mainwindow_ui_tr', 'Active') # hide muxing_pushButton self.muxing_pushButton.hide() else: video_finder_status = QCoreApplication.translate('mainwindow_ui_tr', 'Not Active') if video_finder_thread.video_completed == 'yes' and video_finder_thread.audio_completed == 'yes': # show muxing_pushButton self.muxing_pushButton.show() # check muxing status muxing = video_finder_thread.muxing if muxing == 'no': muxing_status = QCoreApplication.translate('mainwindow_ui_tr', 'Not Active') elif muxing == 'started': muxing_status = QCoreApplication.translate('mainwindow_ui_tr', 'Started') elif muxing == 'error': muxing_status = QCoreApplication.translate('mainwindow_ui_tr', 'Error') elif muxing == 'complete': muxing_status = QCoreApplication.translate('mainwindow_ui_tr', 'Complete') else: video_finder_status = QCoreApplication.translate('mainwindow_ui_tr', 'Not Active') muxing_status = QCoreApplication.translate('mainwindow_ui_tr', 'Not Active') if self.download_table.item(selected_row_return, 1).text() == 'complete' and self.download_table.item(row, 1).text() == 'complete': # show muxing_pushButton self.muxing_pushButton.show() else: # hide muxing_pushButton self.muxing_pushButton.hide() # set labels self.video_finder_status_label.setText( QCoreApplication.translate("mainwindow_ui_tr", "Status: ") + video_finder_status) self.muxing_status_label.setText( QCoreApplication.translate("mainwindow_ui_tr", "Muxing status: ") + muxing_status) else: # hide video_finder_widget self.video_finder_widget.hide() else: # hide video_finder_widget self.video_finder_widget.hide() else: self.progressAction.setEnabled(False) self.resumeAction.setEnabled(False) self.stopAction.setEnabled(False) self.pauseAction.setEnabled(False) self.propertiesAction.setEnabled(False) self.openDownloadFolderAction.setEnabled(False) self.openFileAction.setEnabled(False) self.moveSelectedDownloadsAction.setEnabled(False) # hide video_finder_widget self.video_finder_widget.hide() # Check if this link is related to video finder or not def checkVideoFinderSupportedSites(self, link): # add your favorite site in this list # please don't add porn sites! supported_sites_list = [ 'youtube.com/watch', 'aparat.com/v/', 'vimeo.com/', 'dailymotion.com/video', 'https://soundcloud.com/' ] video_finder_supported = False for supported_site in supported_sites_list: if supported_site in link: video_finder_supported = True break return video_finder_supported # when user requests calls persepolis with browser plugin, # this method is called by CheckingThread. def checkPluginCall(self): global plugin_links_checked # get new links from plugins_db list_of_links = self.plugins_db.returnNewLinks() # notify that job is done!and new links can be received form plugins_db plugin_links_checked = True not_video_finder_links = [] # Store non-video_finder links to process normally. # get maximum of youtube,... link from persepolis_setting max_links = int(self.persepolis_setting.value('settings/video_finder/max_links', 3)) for link in list_of_links: video_finder_supported = self.checkVideoFinderSupportedSites(link['link']) # if link is on of supported_sites_list member, the open video_finder_addlink_window if max_links and video_finder_supported: max_links = max_links - 1 self.showVideoFinderAddLinkWindow(input_dict=link) else: # if link is not on of supported_sites_list then add it to not_video_finder_links not_video_finder_links.append(link) # video_finder links also will stay here, those coming after specified max. list_of_links = not_video_finder_links # It means we have only one link in list_of_links if len(list_of_links) == 1: # this line calls pluginAddLink method and send a dictionary that contains # link information if str(self.persepolis_setting.value('settings/dont-show-addlinkwindow')) == 'yes': # When a download request is sent from the browser extension, # the download will start without showing the Add Link window. # add default values to add_link_dictionary for key in ['start_time', 'end_time', 'ip', 'port', 'proxy_user', 'proxy_passwd', 'proxy_type', 'download_user', 'download_passwd']: list_of_links[0][key] = None list_of_links[0]['connections'] = int(self.persepolis_setting.value('settings/connections')) list_of_links[0]['limit_value'] = 0 list_of_links[0]['download_path'] = str(self.persepolis_setting.value('settings/download_path')) # Call callBack methods instead of pluginAddLink method. # In this case, the download will start without showing the add link window. self.callBack(list_of_links[0], False, 'Single Downloads') else: self.pluginAddLink(list_of_links[0]) elif len(list_of_links): # we have queue request from browser plugin # Length non-zero self.pluginQueue(list_of_links) # this method creates an addlinkwindow when user calls Persepolis with # browsers plugin (Single Download) def pluginAddLink(self, add_link_dictionary): # create an object for AddLinkWindow and add it to addlinkwindows_list. addlinkwindow = AddLinkWindow(self, self.callBack, self.persepolis_setting, add_link_dictionary) self.addlinkwindows_list.append(addlinkwindow) self.addlinkwindows_list[-1].show() # bring addlinkwindow on top self.addlinkwindows_list[-1].raise_() self.addlinkwindows_list[-1].activateWindow() # This method creates addlinkwindow when user presses plus button in MainWindow def addLinkButtonPressed(self, button=None): addlinkwindow = AddLinkWindow(self, self.callBack, self.persepolis_setting, plugin_add_link_dictionary={}) self.addlinkwindows_list.append(addlinkwindow) self.addlinkwindows_list[-1].show() # callback of AddLinkWindow def callBack(self, add_link_dictionary, download_later, category, single_video_link=False): exists = self.persepolis_db.searchLinkInAddLinkTable(add_link_dictionary['link']) if exists: self.msgBox = QMessageBox() self.msgBox.setText(QCoreApplication.translate("mainwindow_src_ui_tr", "
This link has been added before!\ Are you sure you want to add it again?
")) self.msgBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No) self.msgBox.setIcon(QMessageBox.Warning) reply = self.msgBox.exec_() # do nothing if user clicks NO if reply != QMessageBox.Yes: return category = str(category) # Persepolis identifies each download by the ID called GID. The GID must be # hex string of 16 characters. # if user presses ok button on add link window , a gid generates for download. gid = self.gidGenerator() # add gid to add_link_dictionary add_link_dictionary['gid'] = gid # download_info_file_list is a list that contains ['file_name' , # 'status' , 'size' , 'downloaded size' ,'download percentage' , # 'number of connections' ,'Transfer rate' , 'estimate_time_left' , # 'gid' , 'link' , 'first_try_date' , 'last_try_date', 'category'] # if user or browser_plugin defined filename then file_name is valid in # add_link_dictionary['out'] if add_link_dictionary['out']: file_name = add_link_dictionary['out'] # if file extension is m3u8 so it's single_video_link file_name_split = file_name.split('.') file_extension = file_name_split[-1] # convert extension letters to lower case # for example "JPG" will be converted in "jpg" file_extension = file_extension.lower() if file_extension == 'm3u8': single_video_link = True else: file_name = '***' # If user selected a queue in add_link window , then download must be # added to queue and and download must be started with queue so >> # download_later = True if str(category) != 'Single Downloads': download_later = True if not (download_later): status = 'waiting' else: status = 'stopped' # get now time and date date = nowDate() download_table_dict = {'file_name': file_name, 'status': status, 'size': '***', 'downloaded_size': '***', 'percent': '***', 'connections': '***', 'rate': '***', 'estimate_time_left': '***', 'gid': gid, 'link': add_link_dictionary['link'], 'first_try_date': date, 'last_try_date': date, 'category': category} # write information in data_base self.persepolis_db.insertInDownloadTable([download_table_dict]) self.persepolis_db.insertInAddLinkTable([add_link_dictionary]) # find selected category in left side panel for i in range(self.category_tree_model.rowCount()): category_tree_item_text = str( self.category_tree_model.index(i, 0).data()) if category_tree_item_text == category: category_index = i break # highlight selected category in category_tree category_tree_model_index = self.category_tree_model.index( category_index, 0) current_category_tree_text = current_category_tree_index.data() self.category_tree.setCurrentIndex(category_tree_model_index) if current_category_tree_text != category: self.categoryTreeSelected(category_tree_model_index) else: # create a row in download_table for new download download_table_list = [file_name, status, '***', '***', '***', '***', '***', '***', gid, add_link_dictionary['link'], date, date, category] self.download_table.insertRow(0) j = 0 # add item in list to the row for i in download_table_list: item = QTableWidgetItem(i) self.download_table.setItem(0, j, item) j = j + 1 if single_video_link: # create an item in data_base # this item will updated by yt-dlp # and contains download information. video_Finder2_data_base = {'gid': gid, 'download_status': status, 'file_name': file_name, 'eta': '0', 'download_speed_str': '0', 'downloaded_size': 0, 'file_size': 0, 'download_percent': 0, 'fragments': '0/0', 'error_message': ''} # write it in data_base self.persepolis_db.insertInVideoFinderTable2([video_Finder2_data_base]) # if user didn't press download_later_pushButton in add_link window # then create new qthread for new download! if not (download_later): if not (single_video_link): # create download_session download_session = persepolis_lib_prime.Download(add_link_dictionary, self, gid) # add download_session and gid to download_session_dict download_session_dict = {'gid': gid, 'download_session': download_session} # append download_session_dict to download_sessions_list self.download_sessions_list.append(download_session_dict) # strat download in thread new_download = DownloadLink(gid, download_session, self) self.threadPool.append(new_download) self.threadPool[-1].start() else: # start video downloading # get add_link_dictionary for video add_link_dictionary = self.persepolis_db.searchGidInAddLinkTable(gid) # create download_session video_download_session = ytdlp_downloader.Ytdp_Download(add_link_dictionary, self, gid, single_video_link=True) # add gid to single_video_link_gid_list self.single_video_link_gid_list.append(gid) # add download_session and gid to download_session_dict download_session_dict = {'gid': gid, 'download_session': video_download_session} # append download_session_dict to download_sessions_list self.download_sessions_list.append(download_session_dict) # strat download in thread new_download = DownloadLink(gid, video_download_session, self) self.threadPool.append(new_download) self.threadPool[-1].start() # open progress window for download. self.progressBarOpen(gid) # notify user # check that download scheduled or not if not (add_link_dictionary['start_time']): message = QCoreApplication.translate("mainwindow_src_ui_tr", "Download Starts") else: # get download information with spider. new_spider = SpiderThread(add_link_dictionary, self) self.threadPool.append(new_spider) self.threadPool[-1].start() self.threadPool[-1].SPIDERSIGNAL.connect(self.spiderUpdate) message = QCoreApplication.translate("mainwindow_src_ui_tr", "Download Scheduled") notifySend(message, '', 10000, 'no', parent=self) else: # get download information with spider. new_spider = SpiderThread(add_link_dictionary, self) self.threadPool.append(new_spider) self.threadPool[-1].start() self.threadPool[-1].SPIDERSIGNAL.connect(self.spiderUpdate) # when user presses resume button this method is called def resumeButtonPressed(self, button=None): # disable the button self.resumeAction.setEnabled(False) # find user's selected row selected_row_return = self.selectedRow() if selected_row_return is not None: # find download category category = self.download_table.item(selected_row_return, 12).text() # if category is not "single downloads" , then send notification for error if category != "Single Downloads": notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Operation was not successful."), QCoreApplication.translate("mainwindow_src_ui_tr", "Please resume the following category: ") + category, 10000, 'fail', parent=self) return # find download gid gid = self.download_table.item(selected_row_return, 8).text() download_status = self.download_table.item( selected_row_return, 1).text() # this 'if' checks status of download before resuming! If download status # is 'paused' then download must be resumed and if status isn't 'paused' new # download thread must be created ! if download_status == "paused": # search gid in download_sessions_list for download_session_dict in self.download_sessions_list: if download_session_dict['gid'] == gid: # unpause download download_session_dict['download_session'].downloadUnpause() break else: # check if the gid is related to video finder if gid in self.all_video_finder_gid_list: result_dictionary = self.persepolis_db.searchGidInVideoFinderTable(gid) if result_dictionary['checking'] == 'no': # create new thread for this download # see VideoFinder thread for more information new_download = VideoFinder(result_dictionary, self) self.threadPool.append(new_download) self.threadPool[-1].start() self.threadPool[-1].VIDEOFINDERCOMPLETED.connect(self.videoFinderCompleted) # add thread to video_finder_threads_dict self.video_finder_threads_dict[result_dictionary['video_gid']] = new_download else: # we already have an active tread for this download... notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Download is in progress by video finder!"), QCoreApplication.translate("mainwindow_src_ui_tr", "be patient!"), 10000, 'warning', parent=self) # show the download progress window if gid in self.progress_window_list_dict.keys(): # find progress_window for this gid and show it to user member_number = self.progress_window_list_dict[gid] progress_window = self.progress_window_list[member_number] progress_window.show() progress_window.raise_() progress_window.activateWindow() else: # check if last session of this gid is finished or not! for download_session_dict in self.download_sessions_list: if download_session_dict['gid'] == gid: # we already have an active tread for this download... notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Please retry in a minute!"), QCoreApplication.translate("mainwindow_src_ui_tr", "be patient!"), 10000, 'warning', parent=self) return # check if gid is related to single video download link or not. result_dictionary = self.persepolis_db.searchGidInVideoFinderTable2(gid) # get information from data_base add_link_dictionary = self.persepolis_db.searchGidInAddLinkTable(gid) # create download_session if result_dictionary is None: download_session = persepolis_lib_prime.Download(add_link_dictionary, self, gid) else: # single video link download_session = ytdlp_downloader.Ytdp_Download(add_link_dictionary, self, gid, single_video_link=True) # add gid to single_video_link_gid_list self.single_video_link_gid_list.append(gid) # add download_session and gid to download_session_dict download_session_dict = {'gid': gid, 'download_session': download_session} # append download_session_dict to download_sessions_list self.download_sessions_list.append(download_session_dict) # strat download in thread new_download = DownloadLink(gid, download_session, self) self.threadPool.append(new_download) self.threadPool[-1].start() # create new progress_window self.progressBarOpen(gid) # this method called if user presses stop button in MainWindow def stopButtonPressed(self, button=None): # disable stop button self.stopAction.setEnabled(False) # finding user's selected row selected_row_return = self.selectedRow() if selected_row_return is not None: # find download category category = self.download_table.item(selected_row_return, 12).text() # if category is not "single downloads" , then send notification for error if category != "Single Downloads": notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Operation was not successful."), QCoreApplication.translate("mainwindow_src_ui_tr", "Please stop the following category: ") + category, 10000, 'fail', parent=self) return gid = self.download_table.item(selected_row_return, 8).text() # check if this gid is related to video finder if gid in self.all_video_finder_gid_list: result_dictionary = self.persepolis_db.searchGidInVideoFinderTable(gid) video_finder_plus_gid = 'video_finder_' + str(result_dictionary['video_gid']) # cancel shut down progress dictionary = {'category': video_finder_plus_gid, 'shutdown': 'canceled'} self.temp_db.updateQueueTable(dictionary) else: # change status of shutdown in temp_db dictionary = {'gid': gid, 'shutdown': 'canceled'} self.temp_db.updateSingleTable(dictionary) # search gid in download_sessions_list for download_session_dict in self.download_sessions_list: if download_session_dict['gid'] == gid: # stop download download_session_dict['download_session'].downloadStop() break # this method called if user presses pause button in MainWindow def pauseButtonPressed(self, button=None): self.pauseAction.setEnabled(False) # find selected row selected_row_return = self.selectedRow() if selected_row_return is not None: # find download category category = self.download_table.item(selected_row_return, 12).text() # if category is not "single downloads" , then send notification for error if category != "Single Downloads": notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Operation was not successful."), QCoreApplication.translate("mainwindow_src_ui_tr", "Please stop the following category: ") + category, 10000, 'fail', parent=self) return # find download gid gid = self.download_table.item(selected_row_return, 8).text() # search gid in download_sessions_list for download_session_dict in self.download_sessions_list: if download_session_dict['gid'] == gid: # stop download download_session_dict['download_session'].downloadUnpause() break # This method called if properties button pressed by user in MainWindow def propertiesButtonPressed(self, button=None): result_dictionary = None self.propertiesAction.setEnabled(False) selected_row_return = self.selectedRow() # finding user's selected row if selected_row_return is not None: # find gid of download gid = self.download_table.item(selected_row_return, 8).text() # check if the gid is related to video finder if gid in self.all_video_finder_gid_list: result_dictionary = self.persepolis_db.searchGidInVideoFinderTable(gid) if result_dictionary['checking'] == 'yes': # this link is in downloading queue by video finder notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Download is in progress by video finder!"), QCoreApplication.translate("mainwindow_src_ui_tr", "be patient!"), 10000, 'warning', parent=self) # show the download progress window if gid in self.progress_window_list_dict.keys(): # find progress_window for this gid and show it to user member_number = self.progress_window_list_dict[gid] progress_window = self.progress_window_list[member_number] progress_window.show() progress_window.raise_() progress_window.activateWindow() return # create propertieswindow propertieswindow = PropertiesWindow( self, self.propertiesCallback, gid, self.persepolis_setting, result_dictionary) self.propertieswindows_list.append(propertieswindow) self.propertieswindows_list[-1].show() # callBack of PropertiesWindow def propertiesCallback(self, add_link_dictionary, gid, category, video_finder_dictionary=None): # if checking_flag is equal to 1, it means that user pressed remove or # delete button or ... . so checking download information must be # stopped until job is done! if checking_flag != 2: wait_check = WaitThread() self.threadPool.append(wait_check) self.threadPool[-1].start() self.threadPool[-1].QTABLEREADY.connect( partial(self.propertiesCallback2, add_link_dictionary, gid, category, video_finder_dictionary)) else: self.propertiesCallback2(add_link_dictionary, gid, category, video_finder_dictionary) def propertiesCallback2(self, add_link_dictionary, gid, category, video_finder_dictionary=None): # highlight category of this download item # find selected category in left side panel for i in range(self.category_tree_model.rowCount()): category_tree_item_text = str( self.category_tree_model.index(i, 0).data()) if category_tree_item_text == category: category_index = i break # highlight selected category in category_tree category_tree_model_index = self.category_tree_model.index( category_index, 0) current_category_tree_text = current_category_tree_index.data() self.category_tree.setCurrentIndex(category_tree_model_index) if current_category_tree_text != category: self.categoryTreeSelected(category_tree_model_index) # tell the CheckDownloadInfoThread that job is done! global checking_flag checking_flag = 0 # This method is called if user presses "show/hide progress window" button in # MainWindow def progressButtonPressed(self, button=None): # find user's selected row selected_row_return = self.selectedRow() if selected_row_return is not None: gid = self.download_table.item(selected_row_return, 8).text() # if gid is in self.progress_window_list_dict , it means that progress # window for this gid (for this download) is created before and it's # available! See progressBarOpen method for more information. if gid in self.progress_window_list_dict: # find member_number of window in progress_window_list_dict member_number = self.progress_window_list_dict[gid] # if window is visible >> hide it , # and if window is hide >> make it visible! if self.progress_window_list[member_number].isVisible(): self.progress_window_list[member_number].hide() else: self.progress_window_list[member_number].show() else: # if window is not availabile in progress_window_list_dict # so let's create it! self.progressBarOpen(gid) # This method creates new ProgressWindow def progressBarOpen(self, gid): dictionary = None # check if it's related to video finder or not if gid in self.all_video_finder_gid_list: dictionary = self.persepolis_db.searchGidInVideoFinderTable(gid) # it's related to video finder. so make a gid list for video and audio link! gid_list = [dictionary['video_gid'], dictionary['audio_gid']] # create a video finder progress window. progress_window = VideoFinderProgressWindow(self, gid_list, self.persepolis_setting) else: # create an ordinary progress_window # check if it's single_video_link or not answer_dictionary = self.persepolis_db.searchGidInVideoFinderTable2(gid) if answer_dictionary is not None: single_video_link = True else: single_video_link = False progress_window = ProgressWindow( parent=self, gid=gid, persepolis_setting=self.persepolis_setting, single_video_link=single_video_link) # add progress window to progress_window_list self.progress_window_list.append(progress_window) member_number = len(self.progress_window_list) - 1 # in progress_window_list_dict , key is gid and value is member's # rank(number) in progress_window_list if dictionary: self.progress_window_list_dict[dictionary['video_gid']] = member_number self.progress_window_list_dict[dictionary['audio_gid']] = member_number else: self.progress_window_list_dict[gid] = member_number # check user preferences # user can hide progress window in settings window. if str(self.persepolis_setting.value('settings/show-progress')) == 'yes': # show progress window self.progress_window_list[member_number].show() else: # hide progress window self.progress_window_list[member_number].hide() # close window with ESC key def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.close() def cleanTempFolder(self): temp_files_pattern = os.path.join(persepolis_tmp, '.*') # delete all unwanted files for filename in glob.glob(temp_files_pattern): osCommands.remove(filename) # close event # when user closes application then this method is called def closeEvent(self, event=None): if str(self.persepolis_setting.value('settings/hide-window')) == 'yes': # set close event just for minimizing to tray self.minimizeAction.setText(QCoreApplication.translate("mainwindow_src_ui_tr", 'Show main Window')) self.minimizeAction.setIcon(QIcon(icons + 'window')) else: # close window and exit application self.closeAction(event) # close application actions is in this method (to close program completely this method must call) def closeAction(self, event=None): # make sure we have no active downloads # get active download list from data base active_gid_list = self.persepolis_db.findActiveDownloads() if active_gid_list: # notify user self.msgBox = QMessageBox() self.msgBox.setText(QCoreApplication.translate("mainwindow_src_ui_tr", "
A download or downloads are in progress.\ Stop them before closing the app!
")) self.msgBox.setIcon(QMessageBox.Warning) self.msgBox.exec_() return print('Persepolis will be closing soon. Please wait a moment.') # save window size and position self.persepolis_setting.setValue('MainWindow/size', self.size()) self.persepolis_setting.setValue('MainWindow/position', self.pos()) # save columns size self.persepolis_setting.setValue('MainWindow/column0', self.download_table.columnWidth(0)) self.persepolis_setting.setValue('MainWindow/column1', self.download_table.columnWidth(1)) self.persepolis_setting.setValue('MainWindow/column2', self.download_table.columnWidth(2)) self.persepolis_setting.setValue('MainWindow/column3', self.download_table.columnWidth(3)) self.persepolis_setting.setValue('MainWindow/column4', self.download_table.columnWidth(4)) self.persepolis_setting.setValue('MainWindow/column5', self.download_table.columnWidth(5)) self.persepolis_setting.setValue('MainWindow/column6', self.download_table.columnWidth(6)) self.persepolis_setting.setValue('MainWindow/column7', self.download_table.columnWidth(7)) self.persepolis_setting.setValue('MainWindow/column10', self.download_table.columnWidth(10)) self.persepolis_setting.setValue('MainWindow/column11', self.download_table.columnWidth(11)) self.persepolis_setting.setValue('MainWindow/column12', self.download_table.columnWidth(12)) # save maximizing situation if self.isMaximized(): self.persepolis_setting.setValue('MainWindow/maximized', 'yes') else: self.persepolis_setting.setValue('MainWindow/maximized', 'no') # sync persepolis_setting # make sure all settings is saved. self.persepolis_setting.sync() # hide MainWindow self.hide() # hide system_tray_icon self.system_tray_icon.hide() # Make sure all sessions have ended. while self.download_sessions_list: sleep(0.5) global shutdown_notification # see start of this script and see inherited QThreads # shutdown_notification = 0 >> persepolis running , 1 >> persepolis is # ready for close(closeEvent called) , 2 >> OK, let's close application! shutdown_notification = 1 while shutdown_notification != 2: sleep(0.1) # close data bases connections for db in self.persepolis_db, self.plugins_db, self.temp_db: db.closeConnections() for i in self.threadPool: i.quit() i.wait() self.cleanTempFolder() QCoreApplication.instance().quit logger.sendToLog("Persepolis closed!", "INFO") sys.exit(0) # showTray method shows/hides persepolis's icon in system tray icon def showTray(self, menu=None): # check if user checked trayAction in menu or not if self.trayAction.isChecked(): # show system_tray_icon self.system_tray_icon.show() # enable minimizeAction in menu self.minimizeAction.setEnabled(True) tray_icon = 'yes' else: # hide system_tray_icon self.system_tray_icon.hide() # disabaling minimizeAction in menu self.minimizeAction.setEnabled(False) tray_icon = 'no' # write changes in persepolis_setting self.persepolis_setting.setValue('settings/tray-icon', tray_icon) self.persepolis_setting.sync() # this method shows/hides menubar and # it's called when user toggles showMenuBarAction in view menu def showMenuBar(self, menu=None): # persepolis has 2 menu bar # 1. menubar in main window # 2. qmenu(see mainwindow_ui.py file for more information) # qmenu is in toolBar2 # user can toggle between viewing menu1 or menu2 with showMenuBarAction # check if showMenuBarAction is checked or unchecked if self.showMenuBarAction.isChecked(): # show menubar and hide toolBar2 self.menubar.show() self.toolBar2.hide() show_menubar = 'yes' else: # hide menubar and show toolBar2 self.menubar.hide() self.toolBar2.show() show_menubar = 'no' # writing changes to persepolis_setting self.persepolis_setting.setValue('settings/show-menubar', show_menubar) self.persepolis_setting.sync() # this method shows/hides left side panel # this method is called if user toggles showSidePanelAction in view menu def showSidePanel(self, menu=None): if self.showSidePanelAction.isChecked(): self.category_tree_qwidget.show() show_sidepanel = 'yes' else: self.category_tree_qwidget.hide() show_sidepanel = 'no' # write changes to persepolis_setting self.persepolis_setting.setValue( 'settings/show-sidepanel', show_sidepanel) self.persepolis_setting.sync() # when user left clicks on persepolis's system tray icon,then # this method is called def systemTrayPressed(self, click): if click == QSystemTrayIcon.Trigger: self.minMaxTray(click) # when minMaxTray method called ,this method shows/hides main window def minMaxTray(self, menu=None): # hide MainWindow if it's visible # Show MainWindow if it's hided if self.isVisible(): self.minimizeAction.setText(QCoreApplication.translate("mainwindow_src_ui_tr", 'Show main Window')) self.minimizeAction.setIcon(QIcon(icons + 'window')) self.hide() else: self.show() self.minimizeAction.setText(QCoreApplication.translate("mainwindow_src_ui_tr", 'Minimize to system tray')) self.minimizeAction.setIcon(QIcon(icons + 'minimize')) # showMainWindow shows main window in normal mode , see CheckingThread def showMainWindow(self): self.showNormal() self.minimizeAction.setText(QCoreApplication.translate("mainwindow_src_ui_tr", 'Minimize to system tray')) self.minimizeAction.setIcon(QIcon(icons + 'minimize')) # stopAllDownloads stops all downloads def stopAllDownloads(self, menu=None): # stop all queues for queue in self.queue_list_dict.values(): queue.stop = True queue.start = False # stop single downloads # get active download list from data base active_gid_list = self.persepolis_db.findActiveDownloads('Single Downloads') for gid in active_gid_list: # search gid in download_sessions_list for download_session_dict in self.download_sessions_list: if download_session_dict['gid'] == gid: # stop download download_session_dict['download_session'].downloadStop() break # this method creates Preferences window def openPreferences(self, menu=None): self.preferenceswindow = PreferencesWindow( self, self.persepolis_setting) # show Preferences Window self.preferenceswindow.show() # this method is creating AboutWindow def openAbout(self, menu=None): about_window = AboutWindow(self.persepolis_setting) self.about_window_list.append(about_window) self.about_window_list[-1].show() # This method opens user's default download folder def openDefaultDownloadFolder(self, menu=None): # find user's default download folder from persepolis_setting self.persepolis_setting.sync() download_path = self.persepolis_setting.value('settings/download_path') # check that if download folder is availabile or not if os.path.isdir(download_path): # open folder osCommands.xdgOpen(download_path, 'folder', 'folder') else: # show error message if folder didn't existed notifySend(str(download_path), QCoreApplication.translate("mainwindow_src_ui_tr", 'Not Found'), 5000, 'warning', parent=self) # this method opens download folder , if download was finished def openDownloadFolder(self, menu=None): # find user's selected row selected_row_return = self.selectedRow() if selected_row_return is not None: # find gid gid = self.download_table.item( selected_row_return, 8).text() # find status download_status = self.download_table.item( selected_row_return, 1).text() if download_status == 'complete': # check if this link is related to video finder # don't open download folder, if download progress for video and audio aren't completed yet. video_finder_dictionary = self.persepolis_db.searchGidInVideoFinderTable(gid) if video_finder_dictionary: notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Download is in progress by video finder!"), QCoreApplication.translate("mainwindow_src_ui_tr", "be patient!"), 10000, 'warning', parent=self) return # find download path dictionary = self.persepolis_db.searchGidInAddLinkTable(gid) download_path = dictionary['download_path'] # check that if download_path existed if os.path.isfile(download_path): # open file osCommands.xdgOpen(download_path, 'folder', 'file') else: # showing error message , if folder didn't existed notifySend(str(download_path), QCoreApplication.translate("mainwindow_src_ui_tr", 'Not Found'), 5000, 'warning', parent=self) # this method executes(opens) download file if download's progress was finished def openFile(self, menu=None): # find user's selected row selected_row_return = self.selectedRow() if selected_row_return is not None: # find gid gid = self.download_table.item( selected_row_return, 8).text() # find status download_status = self.download_table.item( selected_row_return, 1).text() if download_status == 'complete': # check if this link is related to video finder # don't open download folder, if download progress for video and audio aren't completed yet. video_finder_dictionary = self.persepolis_db.searchGidInVideoFinderTable(gid) if video_finder_dictionary: notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Download is in progress by video finder!"), QCoreApplication.translate("mainwindow_src_ui_tr", "be patient!"), 10000, 'warning', parent=self) return # find download path dictionary = self.persepolis_db.searchGidInAddLinkTable(gid) file_path = dictionary['download_path'] if os.path.isfile(file_path): # open file osCommands.xdgOpen(file_path) else: # show error message , if file was deleted or moved notifySend(str(file_path), QCoreApplication.translate("mainwindow_src_ui_tr", 'Not Found'), 5000, 'warning', parent=self) # this method is called when multiple items is selected by user! def selectDownloads(self): # find highlighted item in category_tree current_category_tree_text = str(current_category_tree_index.data()) self.toolBarAndContextMenuItems(current_category_tree_text) # change actions icon if self.multi_items_selected: self.removeSelectedAction.setIcon(QIcon(icons + 'multi_remove')) self.deleteSelectedAction.setIcon(QIcon(icons + 'multi_trash')) self.moveUpSelectedAction.setIcon(QIcon(icons + 'multi_up')) self.moveDownSelectedAction.setIcon(QIcon(icons + 'multi_down')) self.propertiesAction.setVisible(False) else: self.removeSelectedAction.setIcon(QIcon(icons + 'remove')) self.deleteSelectedAction.setIcon(QIcon(icons + 'trash')) self.moveUpSelectedAction.setIcon(QIcon(icons + 'up')) self.moveDownSelectedAction.setIcon(QIcon(icons + 'down')) self.propertiesAction.setVisible(True) # this method is called when user presses 'remove selected items' button def removeSelected(self, menu=None): # if checking_flag is equal to 1, it means that user pressed remove or # delete button or ... . so checking download information must be # stopped until job is done! if checking_flag != 2: wait_check = WaitThread() self.threadPool.append(wait_check) self.threadPool[-1].start() self.threadPool[-1].QTABLEREADY.connect(self.removeSelected2) else: self.removeSelected2() def removeSelected2(self): # find selected rows! gid_list = [] for row in self.userSelectedRows(): # get download status status = self.download_table.item(row, 1).text() # find category category = self.download_table.item(row, 12).text() if category != "Single Downloads": # check queue condition! # queue must be stopped first if str(category) in self.queue_list_dict.keys(): queue_status = self.queue_list_dict[str(category)].start else: queue_status = False if queue_status: # if queue was started # show error message notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Operation was not successful!"), QCoreApplication.translate( "mainwindow_src_ui_tr", "Operation was not successful! Please stop the following category first: ") + category, 5000, 'fail', parent=self) continue # find gid gid = self.download_table.item(row, 8).text() # check if this link is related to video finder video_finder_link = False if gid in self.all_video_finder_gid_list: video_finder_dictionary = self.persepolis_db.searchGidInVideoFinderTable(gid) video_finder_link = True if gid in self.video_finder_threads_dict.keys(): # check the Video Finder tread status video_finder_thread = self.video_finder_threads_dict[video_finder_dictionary['video_gid']] if video_finder_thread.active == 'yes': notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Download is in progress by video finder!"), QCoreApplication.translate("mainwindow_src_ui_tr", "be patient!"), 10000, 'warning', parent=self) continue # if Video Finder thread is not active so remove both of video and audio link. else: gid_list.append(video_finder_dictionary['video_gid']) gid_list.append(video_finder_dictionary['audio_gid']) continue # if Video Finder thread is not active so remove both of video and audio link. else: gid_list.append(video_finder_dictionary['video_gid']) gid_list.append(video_finder_dictionary['audio_gid']) continue # only download items with "complete", "error" and "stopped" can be removed if (status == 'complete' or status == 'error' or status == 'stopped'): if not (video_finder_link): # check if gid is related to a single_video_link or not answer_dictionary = self.persepolis_db.searchGidInVideoFinderTable2(gid) if answer_dictionary: video_finder_link = True # add gid to gid_list gid_list.append(gid) else: # find filename file_name = self.download_table.item(row, 0).text() # show error message notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Operation was not successful!"), QCoreApplication.translate("mainwindow_src_ui_tr", "Please stop the following download first: ") + file_name, 5000, 'fail', parent=self) # remove duplicate items gid_list = set(gid_list) for gid in gid_list: # find row number for specific gid for i in range(self.download_table.rowCount()): row_gid = self.download_table.item(i, 8).text() if gid == row_gid: row = i break # find status status = self.download_table.item(row, 1).text() # find filename file_name = self.download_table.item(row, 0).text() # find category category = self.download_table.item(row, 12).text() # remove row from download_table self.download_table.removeRow(row) # remove download files, remove from data_base and remove from download_sessions_list delete_download_file = False delete_things_that_are_no_longer_needed_thread = DeleteThingsThatAreNoLongerNeededThread(gid, file_name, status, category, delete_download_file, self, video_finder_link) self.threadPool.append(delete_things_that_are_no_longer_needed_thread) self.threadPool[-1].start() self.threadPool[-1].NOTIFYSENDSIGNAL.connect(self.notifySendFromThread) # tell the CheckDownloadInfoThread that job is done! global checking_flag checking_flag = 0 # this method is called when user presses 'delete selected items' def deleteSelected(self, menu=None): # showing Warning message to the user. # checking persepolis_setting first! # perhaps user was checking "do not show this message again" delete_warning_message = self.persepolis_setting.value( 'MainWindow/delete-warning', 'yes') if delete_warning_message == 'yes': self.msgBox = QMessageBox() self.msgBox.setText(QCoreApplication.translate("mainwindow_src_ui_tr", "
This operation will delete \ downloaded files from your hard disk
PERMANENTLY!
")) self.msgBox.setInformativeText(QCoreApplication.translate( "mainwindow_src_ui_tr", "
Do you want to continue?
")) self.msgBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No) self.msgBox.setIcon(QMessageBox.Warning) dont_show_checkBox = QCheckBox("don't show this message again") self.msgBox.setCheckBox(dont_show_checkBox) reply = self.msgBox.exec_() # if user checks "do not show this message again!", change persepolis_setting! if self.msgBox.checkBox().isChecked(): self.persepolis_setting.setValue( 'MainWindow/delete-warning', 'no') # do nothing if user clicks NO if reply != QMessageBox.Yes: return # if checking_flag is equal to 1, it means that user pressed remove or # delete button or ... . so checking download information must be # stopped until job is done! if checking_flag != 2: wait_check = WaitThread() self.threadPool.append(wait_check) self.threadPool[-1].start() self.threadPool[-1].QTABLEREADY.connect(self.deleteSelected2) else: self.deleteSelected2() def deleteSelected2(self): gid_list = [] # find selected rows! for row in self.userSelectedRows(): # get download status status = self.download_table.item(row, 1).text() # find category category = self.download_table.item(row, 12).text() if category != "Single Downloads": # check queue condition! # queue must be stopped first if str(category) in self.queue_list_dict.keys(): queue_status = self.queue_list_dict[str(category)].start else: queue_status = False if queue_status: # if queue was started # show error message notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Operation was not successful!"), QCoreApplication.translate("mainwindow_src_ui_tr", "Please stop the following category first: ") + category, 5000, 'fail', parent=self) continue # find gid gid = self.download_table.item(row, 8).text() # check if this link is related to video finder video_finder_link = False if gid in self.all_video_finder_gid_list: video_finder_dictionary = self.persepolis_db.searchGidInVideoFinderTable(gid) video_finder_link = True if gid in self.video_finder_threads_dict.keys(): # check the Video Finder tread status video_finder_thread = self.video_finder_threads_dict[video_finder_dictionary['video_gid']] if video_finder_thread.active == 'yes': notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Download is in progress by video finder!"), QCoreApplication.translate("mainwindow_src_ui_tr", "be patient!"), 10000, 'warning', parent=self) continue # if Video Finder thread is not active so remove both of video and audio link. else: gid_list.append(video_finder_dictionary['video_gid']) gid_list.append(video_finder_dictionary['audio_gid']) continue else: gid_list.append(video_finder_dictionary['video_gid']) gid_list.append(video_finder_dictionary['audio_gid']) continue # only download items with "complete", "error" and "stopped" can be removed if (status == 'complete' or status == 'error' or status == 'stopped'): if not (video_finder_link): # check if gid is related to a single_video_link or not answer_dictionary = self.persepolis_db.searchGidInVideoFinderTable2(gid) if answer_dictionary: video_finder_link = True # add gid to gid_list gid_list.append(gid) else: # find filename file_name = self.download_table.item(row, 0).text() # show error message notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Operation was not successful!"), QCoreApplication.translate("mainwindow_src_ui_tr", "Stop the following download first: ") + file_name, 5000, 'fail', parent=self) # remove selected rows # remove duplicate items gid_list = set(gid_list) for gid in gid_list: # find row number for specific gid for i in range(self.download_table.rowCount()): row_gid = self.download_table.item(i, 8).text() if gid == row_gid: row = i break # find file_name file_name = self.download_table.item(row, 0).text() # find category category = self.download_table.item(row, 12).text() # find status status = self.download_table.item(row, 1).text() # remove row from download_table self.download_table.removeRow(row) # remove download files, remove from data_base and remove from download_sessions_list delete_download_file = True delete_things_that_are_no_longer_needed_thread = DeleteThingsThatAreNoLongerNeededThread(gid, file_name, status, category, delete_download_file, self, video_finder_link) self.threadPool.append(delete_things_that_are_no_longer_needed_thread) self.threadPool[-1].start() self.threadPool[-1].NOTIFYSENDSIGNAL.connect(self.notifySendFromThread) # telling the CheckDownloadInfoThread that job is done! global checking_flag checking_flag = 0 # this method sorts download table by name def sortByName(self, menu=None): # if checking_flag is equal to 1, it means that user pressed remove or # delete button or ... . so checking download information must be # stopped until job is done! if checking_flag != 2: wait_check = WaitThread() self.threadPool.append(wait_check) self.threadPool[-1].start() self.threadPool[-1].QTABLEREADY.connect(self.sortByName2) else: self.sortByName2() def sortByName2(self): # find names and gid of downloads and save them in name_gid_dict # gid is key and name is value. gid_name_dict = {} for row in range(self.download_table.rowCount()): name = self.download_table.item(row, 0).text() gid = self.download_table.item(row, 8).text() gid_name_dict[gid] = name # sort names gid_sorted_list = sorted(gid_name_dict, key=gid_name_dict.get) # clear download_table and add sorted items self.download_table.clearContents() # find name of selected category current_category_tree_text = str(current_category_tree_index.data()) # get download information from data base if current_category_tree_text == 'All Downloads': downloads_dict = self.persepolis_db.returnItemsInDownloadTable() else: downloads_dict = self.persepolis_db.returnItemsInDownloadTable(current_category_tree_text) j = 0 for gid in gid_sorted_list: # enter download rows according to gid_sorted_list download_info = downloads_dict[gid] keys_list = ['file_name', 'status', 'size', 'downloaded_size', 'percent', 'connections', 'rate', 'estimate_time_left', 'gid', 'link', 'first_try_date', 'last_try_date', 'category' ] i = 0 for key in keys_list: item = QTableWidgetItem(download_info[key]) # insert item in download_table self.download_table.setItem(j, i, item) i = i + 1 j = j + 1 # save sorted list (gid_sorted_list) in data base category_dict = {'category': current_category_tree_text} # update gid_list gid_sorted_list.reverse() category_dict['gid_list'] = gid_sorted_list # update category_db_table self.persepolis_db.updateCategoryTable([category_dict]) # tell the CheckDownloadInfoThread that job is done! global checking_flag checking_flag = 0 # this method sorts items in download_table by size def sortBySize(self, menu=None): # if checking_flag is equal to 1, it means that user pressed remove or # delete button or ... . so checking download information must be # stopped until job is done! if checking_flag != 2: wait_check = WaitThread() self.threadPool.append(wait_check) self.threadPool[-1].start() self.threadPool[-1].QTABLEREADY.connect(self.sortBySize2) else: self.sortBySize2() def sortBySize2(self): # find name of selected category current_category_tree_text = str(current_category_tree_index.data()) # find gid and size of downloads gid_size_dict = {} for row in range(self.download_table.rowCount()): size_str = self.download_table.item(row, 2).text() gid = self.download_table.item(row, 8).text() # convert file size to the Byte try: size_int = float(size_str[:-3]) size_symbol = str(size_str[-2]) if size_symbol == 'G': size = size_int * 1073741824 elif size_symbol == 'M': size = size_int * 1048576 elif size_symbol == 'K': size = size_int * 1024 else: # Byte size = size_int except ValueError: size = 0 # create a dictionary from gid and size of files in Bytes # gid as key and size as value gid_size_dict[gid] = size # sort gid_size_dict gid_sorted_list = sorted( gid_size_dict, key=gid_size_dict.get, reverse=True) # clear download_table by size self.download_table.clearContents() # get download information from data base if current_category_tree_text == 'All Downloads': downloads_dict = self.persepolis_db.returnItemsInDownloadTable() else: downloads_dict = self.persepolis_db.returnItemsInDownloadTable(current_category_tree_text) j = 0 for gid in gid_sorted_list: # enter download rows according to gid_sorted_list download_info = downloads_dict[gid] keys_list = ['file_name', 'status', 'size', 'downloaded_size', 'percent', 'connections', 'rate', 'estimate_time_left', 'gid', 'link', 'first_try_date', 'last_try_date', 'category' ] i = 0 for key in keys_list: item = QTableWidgetItem(download_info[key]) # insert item in download_table self.download_table.setItem(j, i, item) i = i + 1 j = j + 1 # save sorted list (gid_sorted_list) in data base category_dict = {'category': current_category_tree_text} # update gid_list gid_sorted_list.reverse() category_dict['gid_list'] = gid_sorted_list # update category_db_table self.persepolis_db.updateCategoryTable([category_dict]) # tell the CheckDownloadInfoThread that job is done! global checking_flag checking_flag = 0 # this method sorts download_table items with status def sortByStatus(self, menu=None): # if checking_flag is equal to 1, it means that user pressed remove or # delete button or ... . so checking download information must be # stopped until job is done! if checking_flag != 2: wait_check = WaitThread() self.threadPool.append(wait_check) self.threadPool[-1].start() self.threadPool[-1].QTABLEREADY.connect(self.sortByStatus2) else: self.sortByStatus2() def sortByStatus2(self): # find name of selected category current_category_tree_text = str(current_category_tree_index.data()) # find gid and status of downloads gid_status_dict = {} for row in range(self.download_table.rowCount()): status = self.download_table.item(row, 1).text() gid = self.download_table.item(row, 8).text() # assign a number to every status if status == 'complete': status_int = 1 elif status == 'stopped': status_int = 2 elif status == 'error': status_int = 3 elif status == 'downloading': status_int = 4 elif status == 'waiting': status_int = 5 else: status_int = 6 # create a dictionary from gid and size_int of files in Bytes gid_status_dict[gid] = status_int # sort gid_status_dict gid_sorted_list = sorted(gid_status_dict, key=gid_status_dict.get) # get download information from data base if current_category_tree_text == 'All Downloads': downloads_dict = self.persepolis_db.returnItemsInDownloadTable() else: downloads_dict = self.persepolis_db.returnItemsInDownloadTable(current_category_tree_text) # clear download_table self.download_table.clearContents() j = 0 for gid in gid_sorted_list: # enter download rows according to gid_sorted_list download_info = downloads_dict[gid] keys_list = ['file_name', 'status', 'size', 'downloaded_size', 'percent', 'connections', 'rate', 'estimate_time_left', 'gid', 'link', 'first_try_date', 'last_try_date', 'category' ] i = 0 for key in keys_list: item = QTableWidgetItem(download_info[key]) # insert item in download_table self.download_table.setItem(j, i, item) i = i + 1 j = j + 1 # save sorted list (gid_sorted_list) in data base category_dict = {'category': current_category_tree_text} # update gid_list gid_sorted_list.reverse() category_dict['gid_list'] = gid_sorted_list # update category_db_table self.persepolis_db.updateCategoryTable([category_dict]) # tell the CheckDownloadInfoThread that job is done! global checking_flag checking_flag = 0 # this method sorts download table with date added information def sortByFirstTry(self, menu=None): # if checking_flag is equal to 1, it means that user pressed remove or # delete button or ... . so checking download information must be # stopped until job is done! if checking_flag != 2: wait_check = WaitThread() self.threadPool.append(wait_check) self.threadPool[-1].start() self.threadPool[-1].QTABLEREADY.connect(self.sortByFirstTry2) else: self.sortByFirstTry2() def sortByFirstTry2(self): # find gid and first try date gid_try_dict = {} for row in range(self.download_table.rowCount()): first_try_date = self.download_table.item(row, 10).text() gid = self.download_table.item(row, 8).text() # convert date and hour in first_try_date to a number # for example , first_try_date = '2016/11/05 , 07:45:38' # must be converted to 20161105074538 first_try_date_splited = first_try_date.split(' , ') date_list = first_try_date_splited[0].split('/') hour_list = first_try_date_splited[1].split(':') date_joind = "".join(date_list) hour_joind = "".join(hour_list) date_hour_str = date_joind + hour_joind date_hour = int(date_hour_str) # create a dictionary # gid as key and date_hour as value gid_try_dict[gid] = date_hour # sort gid_sorted_list = sorted( gid_try_dict, key=gid_try_dict.get, reverse=True) # clear download_table self.download_table.clearContents() # find name of selected category current_category_tree_text = str(current_category_tree_index.data()) # get download information from data base if current_category_tree_text == 'All Downloads': downloads_dict = self.persepolis_db.returnItemsInDownloadTable() else: downloads_dict = self.persepolis_db.returnItemsInDownloadTable(current_category_tree_text) j = 0 for gid in gid_sorted_list: # enter download rows according to gid_sorted_list download_info = downloads_dict[gid] keys_list = ['file_name', 'status', 'size', 'downloaded_size', 'percent', 'connections', 'rate', 'estimate_time_left', 'gid', 'link', 'first_try_date', 'last_try_date', 'category' ] i = 0 for key in keys_list: item = QTableWidgetItem(download_info[key]) # insert item in download_table self.download_table.setItem(j, i, item) i = i + 1 j = j + 1 # save sorted list (gid_list) in data base category_dict = {'category': current_category_tree_text} # update gid_sorted_list gid_sorted_list.reverse() category_dict['gid_list'] = gid_sorted_list # update category_db_table self.persepolis_db.updateCategoryTable([category_dict]) # tell the CheckDownloadInfoThread that job is done! global checking_flag checking_flag = 0 # this method sorts download_table with order of last modify date def sortByLastTry(self, menu=None): # if checking_flag is equal to 1, it means that user pressed remove or # delete button or ... . so checking download information must be # stopped until job is done! if checking_flag != 2: wait_check = WaitThread() self.threadPool.append(wait_check) self.threadPool[-1].start() self.threadPool[-1].QTABLEREADY.connect(self.sortByLastTry2) else: self.sortByLastTry2() def sortByLastTry2(self): # create a dictionary # gid as key and date_hour as value gid_try_dict = {} # find gid and last try date for download items in download_table for row in range(self.download_table.rowCount()): last_try_date = self.download_table.item(row, 11).text() gid = self.download_table.item(row, 8).text() # convert date and hour in last_try_date to a number # for example , last_try_date = '2016/11/05 , 07:45:38' # must be converted to 20161105074538 last_try_date_splited = last_try_date.split(' , ') date_list = last_try_date_splited[0].split('/') hour_list = last_try_date_splited[1].split(':') date_joind = "".join(date_list) hour_joind = "".join(hour_list) date_hour_str = date_joind + hour_joind date_hour = int(date_hour_str) # add gid and date_hour to gid_try_dict gid_try_dict[gid] = date_hour # sort gid_sorted_list = sorted( gid_try_dict, key=gid_try_dict.get, reverse=True) # clear download_table self.download_table.clearContents() # find name of selected category current_category_tree_text = str(current_category_tree_index.data()) # get download information from data base if current_category_tree_text == 'All Downloads': downloads_dict = self.persepolis_db.returnItemsInDownloadTable() else: downloads_dict = self.persepolis_db.returnItemsInDownloadTable(current_category_tree_text) j = 0 for gid in gid_sorted_list: # enter download rows according to gid_sorted_list download_info = downloads_dict[gid] keys_list = ['file_name', 'status', 'size', 'downloaded_size', 'percent', 'connections', 'rate', 'estimate_time_left', 'gid', 'link', 'first_try_date', 'last_try_date', 'category' ] i = 0 for key in keys_list: item = QTableWidgetItem(download_info[key]) # insert item in download_table self.download_table.setItem(j, i, item) i = i + 1 j = j + 1 # save sorted list (gid_list) in data base category_dict = {'category': current_category_tree_text} # update gid_sorted_list gid_sorted_list.reverse() category_dict['gid_list'] = gid_sorted_list # update category_db_table self.persepolis_db.updateCategoryTable([category_dict]) # tell the CheckDownloadInfoThread that job is done! global checking_flag checking_flag = 0 # this method called , when user clicks on 'create new queue' button in # main window. def createQueue(self, menu=None): text, ok = QInputDialog.getText( self, 'Queue', 'Enter queue name:', text='queue') if not (ok): return None queue_name = str(text) if ok and queue_name != '' and queue_name != 'Single Downloads': # check queue_name if exists! answer = self.persepolis_db.searchCategoryInCategoryTable(queue_name) # show Error window if queue before if answer: error_messageBox = QMessageBox() error_messageBox.setText( '"' + queue_name + QCoreApplication.translate("mainwindow_src_ui_tr", '" already exists!')) error_messageBox.setWindowTitle('Error!') error_messageBox.exec_() return None # insert new item in category_tree new_queue_category = QStandardItem(queue_name) font = QFont() font.setBold(True) new_queue_category.setFont(font) new_queue_category.setEditable(False) self.category_tree_model.appendRow(new_queue_category) dict = {'category': queue_name, 'start_time_enable': 'no', 'start_time': '0:0', 'end_time_enable': 'no', 'end_time': '0:0', 'reverse': 'no', 'limit_enable': 'no', 'limit_value': '0K', 'after_download': 'no', 'gid_list': '[]' } # insert new category in data base self.persepolis_db.insertInCategoryTable(dict) # highlight new category in category_tree # find item for i in range(self.category_tree_model.rowCount()): category_tree_item_text = str( self.category_tree_model.index(i, 0).data()) if category_tree_item_text == queue_name: category_index = i break # highlighting category_tree_model_index = self.category_tree_model.index( category_index, 0) self.category_tree.setCurrentIndex(category_tree_model_index) self.categoryTreeSelected(category_tree_model_index) # return queue_name return queue_name # this method creates a BrowserPluginQueue window for list of links. def pluginQueue(self, list_of_links): # create window plugin_queue_window = BrowserPluginQueue( self, list_of_links, self.queueCallback, self.persepolis_setting) self.plugin_queue_window_list.append(plugin_queue_window) self.plugin_queue_window_list[-1].show() # bring plugin_queue_window on top self.plugin_queue_window_list[-1].raise_() self.plugin_queue_window_list[-1].activateWindow() # this method is importing a text file for creating queue . # text file must contain links . 1 link per line! def importText(self, menu=None): # get file path f_path, filters = QFileDialog.getOpenFileName( self, 'Select the text file that contains links') # if path is correct: if os.path.isfile(str(f_path)): # create a text_queue_window for getting information. text_queue_window = TextQueue( self, f_path, self.queueCallback, self.persepolis_setting) self.text_queue_window_list.append(text_queue_window) self.text_queue_window_list[-1].show() # this method is importing download links from clipboard. # clipboard must contain links. def importLinksFromClipboard(self, menu=None): # show main window self.showMainWindow() check_main_window_state_thread = CheckClipboardStateThread() self.threadPool.append(check_main_window_state_thread) self.threadPool[-1].start() self.threadPool[-1].WINDOWISACTIVESIGNAL.connect( self.importLinksFromClipboard2) def importLinksFromClipboard2(self): # get links from clipboard clipboard = QApplication.clipboard().text() # create a list from links links_list = clipboard.splitlines() for item in links_list: if (("tp:/" in item[2:6]) or ("tps:/" in item[2:7])): continue else: links_list.remove(item) # create temp file to save links if len(links_list) == 1: video_finder_supported = self.checkVideoFinderSupportedSites(links_list[0]) if video_finder_supported is True: self.showVideoFinderAddLinkWindow() else: self.addLinkButtonPressed(button=None) elif len(links_list) > 1: temp = tempfile.NamedTemporaryFile(mode="w+", prefix="persepolis") temp.write(clipboard) temp.flush() temp_file_path = temp.name # create a text_queue_window for getting information. text_queue_window = TextQueue( self, temp_file_path, self.queueCallback, self.persepolis_setting) self.text_queue_window_list.append(text_queue_window) self.text_queue_window_list[-1].show() # close temp file (delete file) temp.close() # callback of text_queue_window and plugin_queue_window.AboutWindow # See importText and pluginQueue method for more information. def queueCallback(self, add_link_dictionary_list, category): download_table_dict_list = [] video_finder_2_dict_list = [] # defining path of category_file selected_category = str(category) # highlight selected category in category_tree # first of all find category_index of item! for i in range(self.category_tree_model.rowCount()): category_tree_item_text = str( self.category_tree_model.index(i, 0).data()) if category_tree_item_text == selected_category: category_index = i break # second: find category_tree_model_index category_tree_model_index = self.category_tree_model.index( category_index, 0) # third: highlight item self.category_tree.setCurrentIndex(category_tree_model_index) self.categoryTreeSelected(category_tree_model_index) download_table_list = [] # get now time and date date = nowDate() # add dictionary of downloads to data base for add_link_dictionary in add_link_dictionary_list: single_video_link = False # persepolis identifies each download by the ID called GID. The GID must # be hex string of 16 characters. gid = self.gidGenerator() add_link_dictionary['gid'] = gid # download_info_file_list is a list that contains ['file_name' , # 'status' , 'size' , 'downloaded size' ,'download percentage' , # 'number of connections' ,'Transfer rate' , 'estimate_time_left' , # 'gid' , 'link' , 'first_try_date' , 'last_try_date', 'category'] # if user or browser_plugin defined filename then file_name is valid in # add_link_dictionary['out'] if add_link_dictionary['out']: file_name = add_link_dictionary['out'] # if file extension is m3u8 so it's single_video_link file_name_split = file_name.split('.') file_extension = file_name_split[-1] # convert extension letters to lower case # for example "JPG" will be converted in "jpg" file_extension = file_extension.lower() if file_extension == 'm3u8': single_video_link = True else: file_name = '***' download_table_list = [file_name, 'stopped', '***', '***', '***', '***', '***', '***', gid, add_link_dictionary['link'], date, date, category] dictionary = {'file_name': file_name, 'status': 'stopped', 'size': '***', 'downloaded_size': '***', 'percent': '***', 'connections': '***', 'rate': '***', 'estimate_time_left': '***', 'gid': gid, 'link': add_link_dictionary['link'], 'first_try_date': date, 'last_try_date': date, 'category': category} download_table_dict_list.append(dictionary) # create a row in download_table self.download_table.insertRow(0) j = 0 for i in download_table_list: item = QTableWidgetItem(i) self.download_table.setItem(0, j, item) j = j + 1 if single_video_link: # create an item in data_base # this item will updated by yt-dlp # and contains download information. video_Finder2_data_base = {'gid': gid, 'download_status': 'stopped', 'file_name': file_name, 'eta': '0', 'download_speed_str': '0', 'downloaded_size': 0, 'file_size': 0, 'download_percent': 0, 'fragments': '0/0', 'error_message': ''} video_finder_2_dict_list.append(video_Finder2_data_base) # spider is finding file size and file name new_spider = SpiderThread(add_link_dictionary, self) self.threadPool.append(new_spider) self.threadPool[-1].start() self.threadPool[-1].SPIDERSIGNAL.connect(self.spiderUpdate) # write information in data_base self.persepolis_db.insertInDownloadTable(download_table_dict_list) self.persepolis_db.insertInAddLinkTable(add_link_dictionary_list) self.persepolis_db.insertInVideoFinderTable2(video_finder_2_dict_list) # this method is called , when user clicks on an item in # category_tree (left side panel) def categoryTreeSelected(self, item): new_selection = item if current_category_tree_index != new_selection: # if checking_flag is equal to 1, it means that user pressed remove # or delete button or ... . so checking download information must # be stopped until job is done! if checking_flag != 2: wait_check = WaitThread() self.threadPool.append(wait_check) self.threadPool[-1].start() self.threadPool[-1].QTABLEREADY.connect( partial(self.categoryTreeSelected2, new_selection)) else: self.categoryTreeSelected2(new_selection) def categoryTreeSelected2(self, new_selection): global current_category_tree_index # clear download_table self.download_table.setRowCount(0) # old_selection_index old_selection_index = current_category_tree_index # finding name of old_selection_index old_category_tree_item_text = str(old_selection_index.data()) queue_dict = {'category': old_category_tree_item_text} # start_checkBox if self.start_checkBox.isChecked(): queue_dict['start_time_enable'] = 'yes' else: queue_dict['start_time_enable'] = 'no' # end_checkBox if self.end_checkBox.isChecked(): queue_dict['end_time_enable'] = 'yes' else: queue_dict['end_time_enable'] = 'no' # start_time_qDataTimeEdit start_time = self.start_time_qDataTimeEdit.text() queue_dict['start_time'] = str(start_time) # end_time_qDateTimeEdit end_time = self.end_time_qDateTimeEdit.text() queue_dict['end_time'] = str(end_time) # reverse_checkBox if self.reverse_checkBox.isChecked(): queue_dict['reverse'] = 'yes' else: queue_dict['reverse'] = 'no' # after_checkBox if self.after_checkBox.isChecked(): queue_dict['after_download'] = 'yes' else: queue_dict['after_download'] = 'no' # if old_selection_index.data() is equal to None >> It means queue is # deleted! and no text (data) available for it if old_selection_index.data(): # update data base self.persepolis_db.updateCategoryTable([queue_dict]) # update download_table current_category_tree_index = new_selection # find category current_category_tree_text = str( self.category_tree.currentIndex().data()) # read download items from data base if current_category_tree_text == 'All Downloads': download_table_dict = self.persepolis_db.returnItemsInDownloadTable() else: download_table_dict = self.persepolis_db.returnItemsInDownloadTable(current_category_tree_text) # get gid_list category_dict = self.persepolis_db.searchCategoryInCategoryTable(current_category_tree_text) gid_list = category_dict['gid_list'] keys_list = ['file_name', 'status', 'size', 'downloaded_size', 'percent', 'connections', 'rate', 'estimate_time_left', 'gid', 'link', 'first_try_date', 'last_try_date', 'category' ] # insert items in download_table for gid in gid_list: # create new row self.download_table.insertRow(0) dictionary = download_table_dict[gid] i = 0 for key in keys_list: item = QTableWidgetItem(str(dictionary[key])) self.download_table.setItem(0, i, item) i = i + 1 # tell the CheckDownloadInfoThread that job is done! global checking_flag checking_flag = 0 # update toolBar and tablewidget_menu items self.toolBarAndContextMenuItems(str(current_category_tree_text)) # this method changes toolabr and context menu items when new item # highlighted by user in category_tree def toolBarAndContextMenuItems(self, category): # clear toolBar and context menus. # it makes them ready for adding # new items that suitable with new selected category. # clear toolBar self.toolBar.clear() # clear context menu of download_table self.download_table.tablewidget_menu.clear() # clear context menu of category_tree self.category_tree.category_tree_menu.clear() queueAction = QAction(QIcon(icons + 'add'), 'Single Downloads', self, statusTip="Add to Single Downloads", triggered=partial(self.addToQueue, 'Single Downloads')) # check if user checked selection mode if self.multi_items_selected: self.download_table.sendMenu = self.download_table.tablewidget_menu.addMenu( QCoreApplication.translate("mainwindow_src_ui_tr", 'Send selected downloads to')) else: self.download_table.sendMenu = self.download_table.tablewidget_menu.addMenu( QCoreApplication.translate("mainwindow_src_ui_tr", 'Send to')) # get categories list from data base categories_list = self.persepolis_db.categoriesList() # add categories name to sendMenu for category_name in categories_list: if category_name != category and category_name != 'All Downloads': queueAction = QAction(QIcon(icons + 'add_queue'), category_name, self, statusTip="Add to" + category_name, triggered=partial(self.addToQueue, category_name)) self.download_table.sendMenu.addAction(queueAction) if category == 'All Downloads': # hide queue_panel_widget(lef side down panel) self.queue_panel_widget.hide() # update toolBar list = [self.addlinkAction, self.videoFinderAddLinkAction, self.resumeAction, self.pauseAction, self.stopAction, self.removeSelectedAction, self.deleteSelectedAction, self.propertiesAction, self.progressAction, self.minimizeAction, self.exitAction] for i in list: self.toolBar.addAction(i) self.toolBar.insertSeparator(self.resumeAction) self.toolBar.insertSeparator(self.removeSelectedAction) self.toolBar.insertSeparator(self.propertiesAction) self.toolBar.insertSeparator(self.minimizeAction) self.toolBar.addSeparator() # add actions to download_table's context menu list = [self.openFileAction, self.openDownloadFolderAction, self.resumeAction, self.pauseAction, self.stopAction, self.removeSelectedAction, self.deleteSelectedAction, self.propertiesAction, self.progressAction, self.moveSelectedDownloadsAction] for action in list: self.download_table.tablewidget_menu.addAction(action) elif category == 'Single Downloads': # hide queue_panel_widget self.queue_panel_widget.hide() self.queuePanelWidget(category) # update toolBar list = [self.addlinkAction, self.videoFinderAddLinkAction, self.resumeAction, self.pauseAction, self.stopAction, self.removeSelectedAction, self.deleteSelectedAction, self.propertiesAction, self.progressAction, self.minimizeAction, self.exitAction] for i in list: self.toolBar.addAction(i) self.toolBar.insertSeparator(self.resumeAction) self.toolBar.insertSeparator(self.removeSelectedAction) self.toolBar.insertSeparator(self.propertiesAction) self.toolBar.insertSeparator(self.minimizeAction) self.toolBar.addSeparator() # add actions to download_table's context menu list = [self.openFileAction, self.openDownloadFolderAction, self.resumeAction, self.pauseAction, self.stopAction, self.removeSelectedAction, self.deleteSelectedAction, self.propertiesAction, self.progressAction, self.moveSelectedDownloadsAction] for action in list: self.download_table.tablewidget_menu.addAction(action) elif (category != 'All Downloads' and category != 'Single Downloads'): # show queue_panel_widget self.queue_panel_widget.show() self.queuePanelWidget(category) # update toolBar list = [self.addlinkAction, self.videoFinderAddLinkAction, self.removeSelectedAction, self.deleteSelectedAction, self.propertiesAction, self.startQueueAction, self.stopQueueAction, self.removeQueueAction, self.moveUpSelectedAction, self.moveDownSelectedAction, self.minimizeAction, self.exitAction] for i in list: self.toolBar.addAction(i) self.toolBar.insertSeparator(self.removeSelectedAction) self.toolBar.insertSeparator(self.propertiesAction) self.toolBar.insertSeparator(self.startQueueAction) self.toolBar.insertSeparator(self.minimizeAction) self.toolBar.addSeparator() # add actions to download_table's context menu for action in [self.openFileAction, self.openDownloadFolderAction, self.removeSelectedAction, self.deleteSelectedAction, self.propertiesAction, self.moveSelectedDownloadsAction]: self.download_table.tablewidget_menu.addAction(action) # update category_tree_menu(right click menu for category_tree items) for i in self.startQueueAction, self.stopQueueAction, self.removeQueueAction: self.category_tree.category_tree_menu.addAction(i) # check queue condition if category != 'All Downloads' and category != 'Single Downloads': if str(category) in self.queue_list_dict.keys(): queue_status = self.queue_list_dict[str(category)].start else: queue_status = False if queue_status: # if queue started before self.stopQueueAction.setEnabled(True) self.startQueueAction.setEnabled(False) self.removeQueueAction.setEnabled(False) self.moveUpSelectedAction.setEnabled(False) self.moveDownSelectedAction.setEnabled(False) else: # if queue didn't start self.stopQueueAction.setEnabled(False) self.startQueueAction.setEnabled(True) self.removeQueueAction.setEnabled(True) self.moveUpSelectedAction.setEnabled(True) self.moveDownSelectedAction.setEnabled(True) else: # if category is All Downloads or Single Downloads self.stopQueueAction.setEnabled(False) self.startQueueAction.setEnabled(False) self.removeQueueAction.setEnabled(False) self.moveUpSelectedAction.setEnabled(False) self.moveDownSelectedAction.setEnabled(False) # add sortMenu to download_table context menu sortMenu = self.download_table.tablewidget_menu.addMenu( QCoreApplication.translate("mainwindow_src_ui_tr", 'Sort by')) sortMenu.addAction(self.sort_file_name_Action) sortMenu.addAction(self.sort_file_size_Action) sortMenu.addAction(self.sort_first_try_date_Action) sortMenu.addAction(self.sort_last_try_date_Action) sortMenu.addAction(self.sort_download_status_Action) # this method removes the queue that is selected in category_tree def removeQueue(self, menu=None): # show Warning message to user. # checks persepolis_setting first! # perhaps user was checking "do not show this message again" remove_warning_message = self.persepolis_setting.value( 'MainWindow/remove-queue-warning', 'yes') if remove_warning_message == 'yes': self.remove_queue_msgBox = QMessageBox() self.remove_queue_msgBox.setText(QCoreApplication.translate("mainwindow_src_ui_tr", '
This operation will remove \ all download items in this queue
from "All Downloads" list!
')) self.remove_queue_msgBox.setInformativeText(QCoreApplication.translate( "mainwindow_src_ui_tr", "
Do you want to continue?
")) self.remove_queue_msgBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No) self.remove_queue_msgBox.setIcon(QMessageBox.Warning) dont_show_checkBox = QCheckBox("don't show this message again") self.remove_queue_msgBox.setCheckBox(dont_show_checkBox) reply = self.remove_queue_msgBox.exec_() # if user checks "do not show this message again!", change persepolis_setting! if self.remove_queue_msgBox.checkBox().isChecked(): self.persepolis_setting.setValue( 'MainWindow/remove-queue-warning', 'no') # do nothing if user clicks NO if reply != QMessageBox.Yes: return # find name of queue current_category_tree_text = str(current_category_tree_index.data()) if current_category_tree_text == 'Scheduled Downloads': error_messageBox = QMessageBox() error_messageBox.setText( QCoreApplication.translate("mainwindow_src_ui_tr", "Sorry! You can't remove default queue!")) error_messageBox.setWindowTitle('Error!') error_messageBox.exec_() return if current_category_tree_text != 'All Downloads' and current_category_tree_text != 'Single Downloads': # remove queue from category_tree row_number = current_category_tree_index.row() self.category_tree_model.removeRow(row_number) # delete category from data base self.persepolis_db.deleteCategory(current_category_tree_text) # highlight "All Downloads" in category_tree all_download_index = self.category_tree_model.index(0, 0) self.category_tree.setCurrentIndex(all_download_index) self.categoryTreeSelected(all_download_index) # this method starts the queue that is selected in category_tree def startQueue(self, menu=None): self.startQueueAction.setEnabled(False) # current_category_tree_text is the name of queue that is selected by user current_category_tree_text = str(current_category_tree_index.data()) # create an item for this category in temp_db if not exists! try: self.temp_db.insertInQueueTable(current_category_tree_text) except Exception: # release lock self.temp_db.lock = False queue_info_dict = {'category': current_category_tree_text} # check that if user checks start_checkBox or not. if self.start_checkBox.isChecked(): queue_info_dict['start_time_enable'] = 'yes' # read start_time value start_time = self.start_time_qDataTimeEdit.text() else: queue_info_dict['start_time_enable'] = 'no' start_time = None # check that if user checked end_checkBox or not. if self.end_checkBox.isChecked(): queue_info_dict['end_time_enable'] = 'yes' # read end_time value end_time = self.end_time_qDateTimeEdit.text() else: queue_info_dict['end_time_enable'] = 'no' end_time = None # reverse_checkBox if self.reverse_checkBox.isChecked(): queue_info_dict['reverse'] = 'yes' else: queue_info_dict['reverse'] = 'no' # update data base self.persepolis_db.updateCategoryTable([queue_info_dict]) # create new Queue thread new_queue = Queue(current_category_tree_text, start_time, end_time, self) self.queue_list_dict[current_category_tree_text] = new_queue self.queue_list_dict[current_category_tree_text].start() self.queue_list_dict[current_category_tree_text].REFRESHTOOLBARSIGNAL.connect( self.toolBarAndContextMenuItems) self.queue_list_dict[current_category_tree_text].NOTIFYSENDSIGNAL.connect(self.notifySendFromThread) self.toolBarAndContextMenuItems(current_category_tree_text) # this method stops the queue that is selected # by user in the left side panel def stopQueue(self, menu=None): self.stopQueueAction.setEnabled(False) # current_category_tree_text is the name of queue that is selected by user current_category_tree_text = str(current_category_tree_index.data()) queue = self.queue_list_dict[current_category_tree_text] queue.start = False queue.stop = True self.startQueueAction.setEnabled(True) # this method is called , when user want to add a download to a queue with # context menu. see also toolBarAndContextMenuItems() method def addToQueue(self, data, menu=None): # if checking_flag is equal to 1, it means that user pressed remove or # delete button or ... . so checking download information must be # stopped until job is done! if checking_flag != 2: wait_check = WaitThread() self.threadPool.append(wait_check) self.threadPool[-1].start() self.threadPool[-1].QTABLEREADY.connect(partial(self.addToQueue2, data)) else: self.addToQueue2(data) def addToQueue2(self, data): send_message = False # new selected category new_category = str(data) gid_list = [] # find selected rows! for row in self.userSelectedRows(): status = self.download_table.item(row, 1).text() category = self.download_table.item(row, 12).text() # check status of old category if category in self.queue_list_dict.keys(): if self.queue_list_dict[category].start: # It means queue is in download progress status = 'downloading' # download must be in stopped situation. if (status == 'error' or status == 'stopped' or status == 'complete'): # find gid gid = self.download_table.item(row, 8).text() # check if this gid is related to video finder if gid in self.all_video_finder_gid_list: video_finder_dictionary = self.persepolis_db.searchGidInVideoFinderTable(gid) # check the Video Finder tread status if video_finder_dictionary['video_gid'] in self.video_finder_threads_dict: video_finder_thread = self.video_finder_threads_dict[video_finder_dictionary['video_gid']] if video_finder_thread.active == 'no': # add both of video and audio links gid_list.append(video_finder_dictionary['video_gid']) gid_list.append(video_finder_dictionary['audio_gid']) continue else: send_message = True continue else: # add both of video and audio links gid_list.append(video_finder_dictionary['video_gid']) gid_list.append(video_finder_dictionary['audio_gid']) continue # append gid to gid_list gid_list.append(gid) else: send_message = True # remove duplicate items gid_list = set(gid_list) # find row number for specific gid for gid in gid_list: for i in range(self.download_table.rowCount()): row_gid = self.download_table.item(i, 8).text() if gid == row_gid: row = i break # current_category = former selected category current_category = self.download_table.item(row, 12).text() if current_category != new_category: # write changes in data base dict = {'gid': gid, 'category': new_category} self.persepolis_db.updateDownloadTable([dict]) self.persepolis_db.setDefaultGidInAddlinkTable(gid, start_time=True, end_time=True, after_download=True) # delete item from gid_list in current_category current_category_dict = self.persepolis_db.searchCategoryInCategoryTable(current_category) # get gid_list current_category_gid_list = current_category_dict['gid_list'] # delete item current_category_gid_list = current_category_gid_list.remove(gid) # update category_db_table self.persepolis_db.updateCategoryTable([current_category_dict]) # add item to gid_list of new_category # get category_dict from data base new_category_dict = self.persepolis_db.searchCategoryInCategoryTable(new_category) # get gid_list new_category_gid_list = new_category_dict['gid_list'] # add gid of item to gid_list new_category_gid_list = new_category_gid_list.append(gid) # update category_db_table self.persepolis_db.updateCategoryTable([new_category_dict]) # update category in download_table current_category_tree_text = str(current_category_tree_index.data()) if current_category_tree_text == 'All Downloads': item = QTableWidgetItem(new_category) self.download_table.setItem(row, 12, item) else: self.download_table.removeRow(row) if send_message: # notify user that transfer was unsuccessful notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Some items didn't transferred successfully!"), QCoreApplication.translate("mainwindow_src_ui_tr", "Please stop download progress first."), 5000, 'no', parent=self) global checking_flag checking_flag = 0 # this method activates or deactivates start_frame according to situation def startFrame(self, checkBox): if self.start_checkBox.isChecked(): self.start_frame.setEnabled(True) else: self.start_frame.setEnabled(False) # this method activates or deactivates end_frame according to situation def endFrame(self, checkBox): if self.end_checkBox.isChecked(): self.end_frame.setEnabled(True) else: self.end_frame.setEnabled(False) # this method showing/hiding queue_panel_widget according to # queue_panel_show_button text def showQueuePanelOptions(self, button): if not (self.show_queue_panel): self.show_queue_panel = True self.queue_panel_widget_frame.show() self.queue_panel_show_button.setText(QCoreApplication.translate("mainwindow_src_ui_tr", 'Hide options')) else: self.show_queue_panel = False self.queue_panel_widget_frame.hide() self.queue_panel_show_button.setText(QCoreApplication.translate("mainwindow_src_ui_tr", 'Show options')) def limitDialIsReleased(self): # current_category_tree_text is the name of queue that selected by user current_category_tree_text = str(current_category_tree_index.data()) # informing queue about changes self.queue_list_dict[current_category_tree_text].limit_changed = True def limitDialIsChanged(self, button): if self.limit_dial.value() == 10: self.limit_label.setText('Speed : Maximum') elif self.limit_dial.value() == 0: self.limit_label.setText('Speed : Minimum') else: self.limit_label.setText('Speed') # this method handles user's shutdown request def afterPushButtonPressed(self, button): # current_category_tree_text is the name of queue that selected by user current_category_tree_text = str(current_category_tree_index.data()) self.after_pushButton.setEnabled(False) if os_type != OS.WINDOWS: # For Linux and Mac OSX # get root password from user passwd, ok = QInputDialog.getText( self, 'PassWord', 'Please enter root password:', QLineEdit.Password) if ok: pipe = subprocess.Popen(['sudo', '-S', 'echo', 'hello'], stdout=subprocess.DEVNULL, stdin=subprocess.PIPE, stderr=subprocess.DEVNULL, shell=False) pipe.communicate(passwd.encode()) answer = pipe.wait() while answer != 0: # ask password again! passwd, ok = QInputDialog.getText( self, 'PassWord', 'Wrong Password!\nPlease try again.', QLineEdit.Password) if ok: # checking password pipe = subprocess.Popen(['sudo', '-S', 'echo', 'hello'], stdout=subprocess.DEVNULL, stdin=subprocess.PIPE, stderr=subprocess.DEVNULL, shell=False) pipe.communicate(passwd.encode()) answer = pipe.wait() else: ok = False self.after_pushButton.setEnabled(True) break if ok: self.queue_list_dict[current_category_tree_text].after = True # send password and queue name to ShutDownThread shutdown_enable = ShutDownThread( self, current_category_tree_text, passwd) self.threadPool.append(shutdown_enable) self.threadPool[-1].start() else: self.after_checkBox.setChecked(False) self.queue_list_dict[current_category_tree_text].after = False else: self.after_checkBox.setChecked(False) self.queue_list_dict[current_category_tree_text].after = False else: # for windows shutdown_enable = ShutDownThread(self, current_category_tree_text) self.threadPool.append(shutdown_enable) self.threadPool[-1].start() # this method activates or deactivates after_frame according to # after_checkBox situation def afterFrame(self, checkBox): # current_category_tree_text is the name of queue that selected by user current_category_tree_text = str(current_category_tree_index.data()) if self.after_checkBox.isChecked(): # enable after_frame self.after_frame.setEnabled(True) self.after_pushButton.setEnabled(True) else: self.after_frame.setEnabled(False) # disable after_frame # write 'canceled' for this category in temp_db . # see shutdown.py for more information if current_category_tree_text in self.queue_list_dict.keys(): if self.queue_list_dict[current_category_tree_text].after: shutdown_dict = {'category': current_category_tree_text, 'shutdown': 'canceled'} self.temp_db.updateQueueTable(shutdown_dict) self.queue_list_dict[current_category_tree_text].after = False # this method checks that queue started or not, # and it shows or hides widgets in queue_panel_widget # according to situation and set widgets in panel. def queuePanelWidget(self, category): # update queue panel widget items # read queue_info_dict from data base queue_info_dict = self.persepolis_db.searchCategoryInCategoryTable(category) # check queue condition if str(category) in self.queue_list_dict.keys(): queue_status = self.queue_list_dict[str(category)].start else: queue_status = False if queue_status: # queue started self.start_end_frame.hide() self.limit_after_frame.show() # check that if user selected 'shutdown after download' after_status = self.queue_list_dict[str(category)].after # if after_status is True, # it means that user was selected # shutdown option, after queue completed. if after_status: self.after_checkBox.setChecked(True) else: self.after_checkBox.setChecked(False) else: # so queue is stopped self.start_end_frame.show() self.limit_after_frame.hide() # start time # start_checkBox if queue_info_dict['start_time_enable'] == 'yes': self.start_checkBox.setChecked(True) else: self.start_checkBox.setChecked(False) hour, minute = queue_info_dict['start_time'].split(':') q_time = QTime(int(hour), int(minute)) self.start_time_qDataTimeEdit.setTime(q_time) # end time # end_checkBox if queue_info_dict['end_time_enable'] == 'yes': self.end_checkBox.setChecked(True) else: self.end_checkBox.setChecked(False) hour, minute = queue_info_dict['end_time'].split(':') # set time q_time = QTime(int(hour), int(minute)) self.end_time_qDateTimeEdit.setTime(q_time) # reverse_checkBox if queue_info_dict['reverse'] == 'yes': self.reverse_checkBox.setChecked(True) else: self.reverse_checkBox.setChecked(False) self.afterFrame(category) self.startFrame(category) self.endFrame(category) # this method opens issues page in github def reportIssue(self, menu=None): osCommands.xdgOpen('https://github.com/persepolisdm/persepolis/issues') # this method opens persepolis wiki page in github def persepolisHelp(self, menu=None): osCommands.xdgOpen('https://github.com/persepolisdm/persepolis/wiki') # this method opens LogWindow def showLog(self, menu=None): logwindow = LogWindow( self.persepolis_setting) self.logwindow_list.append(logwindow) self.logwindow_list[-1].show() # this method is called when user pressed moveUpSelectedAction # this method subtituts selected items with upper one def moveUpSelected(self, menu=None): global button_pressed_counter button_pressed_counter = button_pressed_counter + 1 # if checking_flag is equal to 1, it means that user pressed remove or # delete button or ... . so checking download information must be stopped # until job is done! if checking_flag != 2: button_pressed_thread = ButtonPressedThread() self.threadPool.append(button_pressed_thread) self.threadPool[-1].start() wait_check = WaitThread() self.threadPool.append(wait_check) self.threadPool[-1].start() self.threadPool[-1].QTABLEREADY.connect(self.moveUpSelected2) else: self.moveUpSelected2() def moveUpSelected2(self): # current_category_tree_text is the name of queue that selected by user current_category_tree_text = str(current_category_tree_index.data()) # get gid_list from data base category_dict = self.persepolis_db.searchCategoryInCategoryTable(current_category_tree_text) gid_list = category_dict['gid_list'] # find selected rows rows_list = self.userSelectedRows() new_rows_list = [] # move up selected rows for old_row in rows_list: new_row = int(old_row) - 1 old_row_items_list = [] new_row_items_list = [] if new_row >= 0: new_rows_list.append(new_row) # old index and new index of item in gid_list old_index = len(gid_list) - old_row - 1 new_index = old_index + 1 # subtitute items in gid_list gid_list[old_index], gid_list[new_index] = gid_list[new_index], gid_list[old_index] # subtitute items in download_table # read current items in download_table for i in range(13): old_row_items_list.append( self.download_table.item(old_row, i).text()) new_row_items_list.append( self.download_table.item(new_row, i).text()) # substituting for i in range(13): # old row item = QTableWidgetItem(new_row_items_list[i]) self.download_table.setItem(old_row, i, item) # new row item = QTableWidgetItem(old_row_items_list[i]) self.download_table.setItem(new_row, i, item) # remove highlight from old rows self.download_table.clearSelection() # Visit this link for more information # doc.qt.io/qt-5/qabstractitemview.html self.download_table.setSelectionMode(QAbstractItemView.MultiSelection) # Highlight newer rows for row in new_rows_list: self.download_table.selectRow(row) # change selection mode to the normal situation self.download_table.setSelectionMode(QAbstractItemView.ExtendedSelection) # update data base self.persepolis_db.updateCategoryTable([category_dict]) # this method is called if user pressed moveDownSelected action # this method is substituting selected download item with lower download item def moveDownSelected(self, menu=None): global button_pressed_counter button_pressed_counter = button_pressed_counter + 1 # if checking_flag is equal to 1, it means that user pressed remove or # delete button or ... . so checking download information must be stopped # until job is done! if checking_flag != 2: button_pressed_thread = ButtonPressedThread() self.threadPool.append(button_pressed_thread) self.threadPool[-1].start() wait_check = WaitThread() self.threadPool.append(wait_check) self.threadPool[-1].start() self.threadPool[-1].QTABLEREADY.connect(self.moveDownSelected2) else: self.moveDownSelected2() def moveDownSelected2(self): # an old row and new row must be substituted by each other # find selected rows rows_list = self.userSelectedRows() # current_category_tree_text is the name of queue that selected by user current_category_tree_text = str(current_category_tree_index.data()) # get gid_list from data base category_dict = self.persepolis_db.searchCategoryInCategoryTable( current_category_tree_text) gid_list = category_dict['gid_list'] rows_list.reverse() new_rows_list = [] # move up selected rows for old_row in rows_list: new_row = int(old_row) + 1 if new_row < self.download_table.rowCount(): new_rows_list.append(new_row) # old index and new index in gid_list old_index = len(gid_list) - old_row - 1 new_index = old_index - 1 # subtitute gids in gid_list gid_list[old_index], gid_list[new_index] = gid_list[new_index], gid_list[old_index] # subtitute items in download_table old_row_items_list = [] new_row_items_list = [] # read current items in download_table for i in range(13): old_row_items_list.append( self.download_table.item(old_row, i).text()) new_row_items_list.append( self.download_table.item(new_row, i).text()) # substituting for i in range(13): # old row item = QTableWidgetItem(new_row_items_list[i]) self.download_table.setItem(old_row, i, item) # new_row item = QTableWidgetItem(old_row_items_list[i]) self.download_table.setItem(new_row, i, item) # remove highlight from old rows self.download_table.clearSelection() # Visit this link for more information # doc.qt.io/qt-5/qabstractitemview.html self.download_table.setSelectionMode(QAbstractItemView.MultiSelection) # Highlight newer rows for row in new_rows_list: self.download_table.selectRow(row) # change selection mode to the normal situation self.download_table.setSelectionMode(QAbstractItemView.ExtendedSelection) # update data base self.persepolis_db.updateCategoryTable([category_dict]) # this method is called if user pressed moveSelectedDownloads action # this method moves download files to another destination. def moveSelectedDownloads(self, menu=None): # initialize the path. initializing_path = self.persepolis_setting.value( 'MainWindow/moving_path', None) # if initializing_path is not available, so use default download_path. if not (initializing_path): initializing_path = str( self.persepolis_setting.value('settings/download_path')) # open file manager and get new download path fname = QFileDialog.getExistingDirectory( self, 'Select a directory', initializing_path) if fname: # Returns pathName with the '/' separators converted to separators that are appropriate for the underlying operating system. # On Windows, toNativeSeparators("c:/winnt/system32") returns # "c:\winnt\system32". new_folder_path = QDir.toNativeSeparators(fname) # save new_folder_path as initializing_path self.persepolis_setting.setValue( 'MainWindow/moving_path', new_folder_path) else: return gid_list = [] # find selected rows! for row in self.userSelectedRows(): # get download status status = self.download_table.item(row, 1).text() # only download items with "complete" can be moved. if (status == 'complete'): # find gid gid = self.download_table.item(row, 8).text() # add gid to gid_list gid_list.append(gid) else: # find filename file_name = self.download_table.item(row, 0).text() # show error message # TODO: no value for message2 notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", message1='Operation was not successful! Following download must be completed first: '), message2=file_name, time=5000, sound='fail', parent=self) # move files with MoveThread # MoveThread is created to pervent UI freezing. move_thread = MoveThread(self, gid_list, new_folder_path) self.threadPool.append(move_thread) self.threadPool[-1].start() self.threadPool[-1].NOTIFYSENDSIGNAL.connect(self.notifySendFromThread) # see browser_plugin_queue.py file def queueSpiderCallBack(self, filename, child, row_number): item = QTableWidgetItem(str(filename)) # add checkbox to the item item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) if child.links_table.item(int(row_number), 0).checkState() == Qt.Checked: item.setCheckState(Qt.Checked) else: item.setCheckState(Qt.Unchecked) child.links_table.setItem(int(row_number), 0, item) # see addlink.py file def addLinkSpiderCallBack(self, spider_dict, child): # get file_name and file_size file_name = spider_dict['file_name'] file_size = spider_dict['file_size'] if file_size: file_size = 'Size: ' + str(file_size) if child.size_label.text() == 'None' or child.size_label.text() == '': child.size_label.setText(file_size) else: # It's updated before! dont change it. return if file_name and not (child.change_name_checkBox.isChecked()): child.change_name_lineEdit.setText(file_name) child.change_name_checkBox.setChecked(True) def spiderUpdate(self, dict): gid = dict['gid'] row = None for i in range(self.download_table.rowCount()): row_gid = self.download_table.item(i, 8).text() if gid == row_gid: row = i break # update download_table items if row is not None: update_list = [dict['file_name'], dict['status'], dict['size'], dict['downloaded_size'], dict['percent'], dict['connections'], dict['rate'], dict['estimate_time_left'], dict['gid'], None, None, None, None] for i in range(12): # update download_table cell if update_list item in not None if update_list[i]: text = update_list[i] else: text = self.download_table.item(row, i).text() # create a QTableWidgetItem item = QTableWidgetItem(text) # set item try: self.download_table.setItem(row, i, item) except Exception as problem: logger.sendToLog( "Error occurred while updating download table", "ERROR") logger.sendToLog(problem, "ERROR") # this method deletes all items in data base def clearDownloadList(self, item): # if checking_flag is equal to 1, it means that user pressed remove or # delete button or ... . so checking download information must be # stopped until job is done! if checking_flag != 2: wait_check = WaitThread() self.threadPool.append(wait_check) self.threadPool[-1].start() self.threadPool[-1].QTABLEREADY.connect(self.clearDownloadList2) else: self.clearDownloadList2() def clearDownloadList2(self): # all Downloads must be stopped by user gid_list = self.persepolis_db.findActiveDownloads() if len(gid_list) != 0: error_messageBox = QMessageBox() error_messageBox.setText( QCoreApplication.translate("mainwindow_src_ui_tr", 'Stop all downloads first!')) error_messageBox.setWindowTitle('Error!') error_messageBox.exec_() return # reset data base self.persepolis_db.resetDataBase() self.temp_db.resetDataBase() # highlight "All Downloads" in category_tree all_download_index = self.category_tree_model.index(0, 0) self.category_tree.setCurrentIndex(all_download_index) self.categoryTreeSelected(all_download_index) # clear download_table self.download_table.setRowCount(0) # tell the CheckDownloadInfoThread that job is done! global checking_flag checking_flag = 0 def showVideoFinderAddLinkWindow(self, input_dict=None, menu=None): # first check youtube_dl_is_installed and ffmpeg_is_installed value! # if youtube_dl or ffmpeg is not installed show an error message. if youtube_dl_is_installed and ffmpeg_is_installed: if not (input_dict): input_dict = {} video_finder_addlink_window = VideoFinderAddLink( parent=self, receiver_slot=self.videoFinderCallBack, settings=self.persepolis_setting, video_dict=input_dict) self.addlinkwindows_list.append(video_finder_addlink_window) video_finder_addlink_window.show() video_finder_addlink_window.raise_() video_finder_addlink_window.activateWindow() else: error_message = '' if not (youtube_dl_is_installed): error_message = QCoreApplication.translate("mainwindow_src_ui_tr", 'yt-dlp is not installed!') error_message = error_message + '\n' if not (ffmpeg_is_installed): error_message = error_message + \ QCoreApplication.translate("mainwindow_src_ui_tr", 'ffmpeg is not installed!') error_messageBox = QMessageBox() error_messageBox.setText(error_message) error_messageBox.setWindowTitle('Error!') error_messageBox.exec_() return # call back of VideoFinderAddLink window. def videoFinderCallBack(self, add_link_dictionary_list, download_later, category): # if we have only one link so we can download it as a single_video_link. # but if we have seperated video and audio, then we must use VideoFinder thread and ... if len(add_link_dictionary_list) == 1: self.callBack(add_link_dictionary=add_link_dictionary_list[0], download_later=download_later, category=category, single_video_link=True) return category = str(category) for add_link_dictionary in add_link_dictionary_list: # persepolis identifies each download by the ID called GID. The GID must be # hex string of 16 characters. # if user presses ok button on add link window , a gid generates for download. gid = self.gidGenerator() # add gid to add_link_dictionary add_link_dictionary['gid'] = gid # download_info_file_list is a list that contains ['file_name' , # 'status' , 'size' , 'downloaded size' ,'download percentage' , # 'number of connections' ,'Transfer rate' , 'estimate_time_left' , # 'gid' , 'link' , 'first_try_date' , 'last_try_date', 'category'] # if user or browser_plugin defined filename then file_name is valid in # add_link_dictionary['out'] if add_link_dictionary['out']: file_name = add_link_dictionary['out'] else: file_name = '***' # If user selected a queue in add_link window , then download must be # added to queue and and download must be started with queue so >> # download_later = True if str(category) != 'Single Downloads': download_later = True # change video status to waiting if not (download_later) and gid == add_link_dictionary_list[0]['gid']: status = 'waiting' else: status = 'stopped' # get now time and date date = nowDate() dictionary = {'file_name': file_name, 'status': status, 'size': '***', 'downloaded_size': '***', 'percent': '***', 'connections': '***', 'rate': '***', 'estimate_time_left': '***', 'gid': gid, 'link': add_link_dictionary['link'], 'first_try_date': date, 'last_try_date': date, 'category': category} # write information in data_base self.persepolis_db.insertInDownloadTable([dictionary]) self.persepolis_db.insertInAddLinkTable([add_link_dictionary]) # find selected category in left side panel for i in range(self.category_tree_model.rowCount()): category_tree_item_text = str( self.category_tree_model.index(i, 0).data()) if category_tree_item_text == category: category_index = i break # highlight selected category in category_tree category_tree_model_index = self.category_tree_model.index( category_index, 0) current_category_tree_text = current_category_tree_index.data() self.category_tree.setCurrentIndex(category_tree_model_index) if current_category_tree_text != category: self.categoryTreeSelected(category_tree_model_index) else: # create a row in download_table for new download list = [file_name, status, '***', '***', '***', '***', '***', '***', gid, add_link_dictionary['link'], date, date, category] self.download_table.insertRow(0) j = 0 # add item in list to the row for i in list: item = QTableWidgetItem(i) self.download_table.setItem(0, j, item) j = j + 1 # create an item in data_base # this item will updated by yt-dlp # and contains download information. video_Finder2_data_base = {'gid': gid, 'download_status': status, 'file_name': file_name, 'eta': '0', 'download_speed_str': '0', 'downloaded_size': 0, 'file_size': 0, 'download_percent': 0, 'fragments': '0/0', 'error_message': ''} # write it in data_base self.persepolis_db.insertInVideoFinderTable2([video_Finder2_data_base]) # add video_gid and audio_gid to data base dictionary = {'video_gid': add_link_dictionary_list[0]['gid'], 'audio_gid': add_link_dictionary_list[1]['gid'], 'video_completed': 'no', 'audio_completed': 'no', 'muxing_status': 'no', 'checking': 'no', 'download_path': add_link_dictionary_list[0]['download_path']} self.persepolis_db.insertInVideoFinderTable([dictionary]) # add video_gid and audio_gid to all_video_finder_gid_list self.all_video_finder_gid_list.append(dictionary['video_gid']) self.all_video_finder_video_gid_list.append(dictionary['video_gid']) self.all_video_finder_gid_list.append(dictionary['audio_gid']) self.all_video_finder_audio_gid_list.append(dictionary['audio_gid']) # if user didn't press download_later_pushButton in add_link window # then create new qthread for new download! if not (download_later): new_download = VideoFinder(dictionary, self) self.threadPool.append(new_download) self.threadPool[-1].start() self.threadPool[-1].VIDEOFINDERCOMPLETED.connect(self.videoFinderCompleted) # add thread to video_finder_threads_dict self.video_finder_threads_dict[dictionary['video_gid']] = new_download # open progress window for download. self.progressBarOpen(dictionary['video_gid']) # notify user if not (add_link_dictionary_list[0]['start_time']): message = QCoreApplication.translate("mainwindow_src_ui_tr", "Download Starts") notifySend(message, '', 10000, 'no', parent=self) else: # write name and size of download files in download's table for add_link_dictionary in add_link_dictionary_list: new_spider = SpiderThread(add_link_dictionary, self) self.threadPool.append(new_spider) self.threadPool[-1].start() self.threadPool[-1].SPIDERSIGNAL.connect(self.spiderUpdate) else: # write name and size of download files in download's table for add_link_dictionary in add_link_dictionary_list: new_spider = SpiderThread(add_link_dictionary, self) self.threadPool.append(new_spider) self.threadPool[-1].start() self.threadPool[-1].SPIDERSIGNAL.connect(self.spiderUpdate) # this method is called by VideoFinder thread # this method handles error_message # if video finder done it's job successfully, # then this method shows AfterDownloadWindow def videoFinderCompleted(self, complete_dictionary): # if checking_flag is equal to 1, it means that user pressed remove or # delete button or ... . so checking download information must be # stopped until job is done! if checking_flag != 2: wait_check = WaitThread() self.threadPool.append(wait_check) self.threadPool[-1].start() self.threadPool[-1].QTABLEREADY.connect( partial(self.videoFinderCompleted2, complete_dictionary)) else: self.videoFinderCompleted2(complete_dictionary) def videoFinderCompleted2(self, complete_dictionary): # remove item from video_finder_threads_dict del self.video_finder_threads_dict[complete_dictionary['video_gid']] error_message = complete_dictionary['error'] # close progress window if complete_dictionary['video_gid'] in self.progress_window_list_dict.keys(): # find progress_window for this gid member_number = self.progress_window_list_dict[complete_dictionary['video_gid']] progress_window = self.progress_window_list[member_number] # close progress window progress_window.close() # download was successful if error_message == 'no error': # delete gids from all_video_finder_gid_list self.all_video_finder_gid_list.remove(complete_dictionary['video_gid']) self.all_video_finder_video_gid_list.remove(complete_dictionary['video_gid']) self.all_video_finder_gid_list.remove(complete_dictionary['audio_gid']) self.all_video_finder_audio_gid_list.remove(complete_dictionary['audio_gid']) # delete audio file # find row row = None for i in range(self.download_table.rowCount()): row_gid = self.download_table.item(i, 8).text() if complete_dictionary['audio_gid'] == row_gid: row = i break # muxing is complete # so remove unused files # find download path audio_add_link_dictionary = self.persepolis_db.searchGidInAddLinkTable(complete_dictionary['audio_gid']) video_add_link_dictionary = self.persepolis_db.searchGidInAddLinkTable(complete_dictionary['video_gid']) audio_file_path = audio_add_link_dictionary['download_path'] video_file_path = video_add_link_dictionary['download_path'] osCommands.remove(audio_file_path) osCommands.remove(video_file_path) # remove audio row from download_table if row is not None: self.download_table.removeRow(row) # remove download item from data base self.persepolis_db.deleteItemInDownloadTable( complete_dictionary['audio_gid'], complete_dictionary['category']) # file name and file size and downloaded size and download path must be changed for video video_add_link_dictionary['download_path'] = complete_dictionary['final_path'] # update data base self.persepolis_db.updateAddLinkTable([video_add_link_dictionary]) # get download_table_dict for video_gid video_download_table_dict = self.persepolis_db.searchGidInDownloadTable(complete_dictionary['video_gid']) video_download_table_dict['size'] = complete_dictionary['final_size'] video_download_table_dict['status'] = 'complete' video_download_table_dict['percent'] = '100%' video_download_table_dict['downloaded_size'] = complete_dictionary['final_size'] video_download_table_dict['file_name'] = urllib.parse.unquote( os.path.basename(complete_dictionary['final_path'])) # update data base self.persepolis_db.updateDownloadTable([video_download_table_dict]) # update download_table # find row row = None for i in range(self.download_table.rowCount()): row_gid = self.download_table.item(i, 8).text() if complete_dictionary['video_gid'] == row_gid: row = i break if row is not None: # create a QTableWidgetItem item = QTableWidgetItem(str(video_download_table_dict['file_name'])) # set item self.download_table.setItem(row, 0, item) # create a QTableWidgetItem item = QTableWidgetItem(str(video_download_table_dict['size'])) # set item self.download_table.setItem(row, 2, item) # create a QTableWidgetItem item = QTableWidgetItem(str(video_download_table_dict['downloaded_size'])) # set item self.download_table.setItem(row, 3, item) # update download_table (refreshing!) self.download_table.viewport().update() if complete_dictionary['category'] == 'Single Downloads': # show download complete dialog afterdownloadwindow = AfterDownloadWindow( self, video_download_table_dict, self.persepolis_setting) self.afterdownload_list.append(afterdownloadwindow) self.afterdownload_list[-1].show() # bringing AfterDownloadWindow on top self.afterdownload_list[-1].raise_() self.afterdownload_list[-1].activateWindow() elif error_message == 'not enough free space': # show error message notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Not enough free space in:"), complete_dictionary['download_path'], 10000, 'fail', parent=self) elif error_message == 'ffmpeg error': # show error message notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "an error occurred"), QCoreApplication.translate("mainwindow_src_ui_tr", "muxing error"), 10000, 'fail', parent=self) # telling the CheckDownloadInfoThread that job is done! global checking_flag checking_flag = 0 # this method is called, if user clicks on muxing_pushButton def muxingPushButtonPressed(self, button): # find user's selected row selected_row_return = self.selectedRow() if selected_row_return is not None: # find download category category = self.download_table.item(selected_row_return, 12).text() # if category is not "single downloads" , then send notification for error if category != "Single Downloads": notifySend(QCoreApplication.translate("mainwindow_src_ui_tr", "Operation was not successful."), QCoreApplication.translate("mainwindow_src_ui_tr", "Please resume the following category: ") + category, 10000, 'fail', parent=self) return # find download gid gid = self.download_table.item(selected_row_return, 8).text() # read data from data base result_dictionary = self.persepolis_db.searchGidInVideoFinderTable(gid) # create new thread for this download # see VideoFinder thread for more information new_download = VideoFinder(result_dictionary, self) self.threadPool.append(new_download) self.threadPool[-1].start() self.threadPool[-1].VIDEOFINDERCOMPLETED.connect(self.videoFinderCompleted) # add thread to video_finder_threads_dict self.video_finder_threads_dict[result_dictionary['video_gid']] = new_download # create new progress_window self.progressBarOpen(gid) def changeIcon(self, new_icons): global icons icons = ':/' + str(new_icons) + '/' action_icon_dict = {self.stopAllAction: 'stop_all', self.minimizeAction: 'minimize', self.addlinkAction: 'add', self.addtextfileAction: 'file', self.addFromClipboardAction: 'clipboard', self.resumeAction: 'play', self.pauseAction: 'pause', self.stopAction: 'stop', self.propertiesAction: 'setting', self.progressAction: 'window', self.openFileAction: 'file', self.openDownloadFolderAction: 'folder', self.openDefaultDownloadFolderAction: 'folder', self.exitAction: 'exit', self.createQueueAction: 'add_queue', self.removeQueueAction: 'remove_queue', self.startQueueAction: 'start_queue', self.stopQueueAction: 'stop_queue', self.preferencesAction: 'preferences', self.aboutAction: 'about', self.issueAction: 'about', self.videoFinderAddLinkAction: 'video_finder', self.qmenu: 'menu'} for key in action_icon_dict.keys(): key.setIcon(QIcon(icons + str(action_icon_dict[key]))) self.selectDownloads() ================================================ FILE: persepolis/scripts/newopen.py ================================================ # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import ast # This function is writting a list in file_path in dictionary format def writeList(file_path, list): dictionary = {'list': list} f = open(file_path, 'w') f.writelines(str(dictionary)) f.close() # This function is reading file_path and return content of file in list format def readList(file_path, mode='dictionary'): f = open(file_path, 'r') f_string = f.readline() f.close() dictionary = ast.literal_eval(f_string.strip()) list = dictionary['list'] if mode == 'string': list[9] = str(list[9]) return list # this function is reading a file that contains dictionary , and extracts # dictionary from it. def readDict(file_path): f = open(file_path) f_lines = f.readlines() f.close() dict_str = str(f_lines[0].strip()) return_dict = ast.literal_eval(dict_str) return return_dict ================================================ FILE: persepolis/scripts/osCommands.py ================================================ # -*- coding: utf-8 -*- # 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 . from persepolis.constants import OS import subprocess import platform import shutil import os os_type = platform.system() home_address = os.path.expanduser("~") # this method finds file manager in linux def findFileManager(): pipe = subprocess.check_output(['xdg-mime', 'query', 'default', 'inode/directory'], shell=False) file_manager = pipe.decode('utf-8').strip().lower() return file_manager def touch(file_path): if not (os.path.isfile(file_path)): f = open(file_path, 'w') f.close() # xdgOpen opens files or folders def xdgOpen(file_path, f_type='file', path='file'): # we have a file path and we want to open it's directory. # highlit(select) file in file manager after opening. # it's help to find file easier :) if f_type == 'folder' and path == 'file': highlight = True else: highlight = False # for linux and bsd if os_type in OS.UNIX_LIKE: try: file_manager = findFileManager() file_manager_found = True except Exception as e: file_manager_found = False from persepolis.scripts import logger logger.sendToLog(str(e), "ERROR") # check default file manager. # some file managers wouldn't support highlighting. if highlight and file_manager_found: # dolphin is kde plasma file manager if 'dolphin' in file_manager: subprocess.Popen(['dolphin', '--select', file_path], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False) # dde-file-manager is deepin file manager elif 'dde-file-manager' in file_manager: subprocess.Popen(['dde-file-manager', '--show-item', file_path], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False) # if file manager is nautilus or nemo or pantheon-file-manager elif file_manager in ['org.gnome.nautilus.desktop', 'nemo.desktop', 'io.elementary.files.desktop', 'thunar.desktop']: # nautilus is gnome file manager. if 'nautilus' in file_manager: file_manager = 'nautilus' # pantheon-files is pantheon file manager(elementary OS). elif 'elementary' in file_manager: file_manager = 'io.elementary.files' # nemo is cinnamon's file manager. elif 'nemo' in file_manager: file_manager = 'nemo' # thunar is xfce file manager elif 'thunar' in file_manager: file_manager = 'thunar' subprocess.Popen([file_manager, file_path], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False) # caja is mate file manager elif 'caja' in file_manager: subprocess.Popen(['caja', '--select', file_path], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False) else: # find folder path file_name = os.path.basename(str(file_path)) file_path_split = file_path.split(file_name) del file_path_split[-1] folder_path = file_name.join(file_path_split) subprocess.Popen(['xdg-open', folder_path], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False) else: if highlight: # find folder path file_name = os.path.basename(str(file_path)) file_path_split = file_path.split(file_name) del file_path_split[-1] folder_path = file_name.join(file_path_split) subprocess.Popen(['xdg-open', folder_path], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False) else: subprocess.Popen(['xdg-open', file_path], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False) # for Mac OS X elif os_type == OS.OSX: if highlight: subprocess.Popen(['open', '-R', file_path], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False) else: subprocess.Popen(['open', file_path], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False) # for MS Windows elif os_type == OS.WINDOWS: CREATE_NO_WINDOW = 0x08000000 if highlight: subprocess.Popen(['explorer.exe', '/select,', file_path], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False, creationflags=CREATE_NO_WINDOW) else: subprocess.Popen(['cmd', '/C', 'start', file_path, file_path], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False, creationflags=CREATE_NO_WINDOW) # remove file with path of file_path def remove(file_path): if os.path.isfile(file_path): try: # function returns ok, if operation was successful os.remove(file_path) return 'ok' except FileNotFoundError: # function returns this, if operation was not successful return 'cant' else: # function returns this , if file is not existed return 'no' # removeDir removes folder : folder_path def removeDir(folder_path): # check folder_path existence if os.path.isdir(folder_path): try: # remove folder shutil.rmtree(folder_path) return 'ok' except FileNotFoundError: # return 'cant' if removing was not successful return 'cant' else: # return 'no' if file didn't existed return 'no' # make directory def makeDirs(folder_path, hidden=False): if hidden: # create hidden attribute directory. if os_type == OS.WINDOWS: os.makedirs(folder_path, exist_ok=True) # in MS Windows "attrib +h" command hidden directory. CREATE_NO_WINDOW = 0x08000000 subprocess.Popen(['attrib', '+h', folder_path], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False, creationflags=CREATE_NO_WINDOW) else: # In linux and bsd a dot character must be added in the start of the directory's name dir_name = os.path.basename(folder_path) dir_name = '.' + dir_name folder_path = os.path.join(os.path.dirname(folder_path), dir_name) os.makedirs(folder_path, exist_ok=True) else: os.makedirs(folder_path, exist_ok=True) return folder_path # this function returns mount point def findMountPoint(path): while not os.path.ismount(path): path = os.path.dirname(path) return path # move downloaded file to another destination. def moveFile(old_file_path, new_path, new_path_type='folder'): # new_path_type can be file or folder # if it's folder so we have folder path # else we have new file path that includes file name if os.path.isfile(old_file_path): if new_path_type == 'folder': # check availability of directory check_path = os.path.isdir(new_path) else: check_path = True if check_path: try: # move file to new_path shutil.move(old_file_path, new_path) return True except FileNotFoundError: return False else: return False else: return False # copy a file to another destination # Warining! new_path must be a complete file path not only a directory def copyFile(old_path, new_path): # make new directory if it's necessary dir_path = os.path.dirname(new_path) makeDirs(dir_path) try: shutil.copy(old_path, new_path) return new_path except FileNotFoundError: return False ================================================ FILE: persepolis/scripts/persepolis.py ================================================ # -*- coding: utf-8 -*- # 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 . try: from PySide6 import QtWidgets, QtCore from PySide6.QtCore import __version__ as QT_VERSION_STR from PySide6.QtGui import QFont from PySide6.QtCore import QFile, QTextStream, QSettings, Qt except ImportError: from PyQt5 import QtWidgets, QtCore from PyQt5.QtGui import QFont from PyQt5.QtCore import QFile, QTextStream, QSettings, Qt, QT_VERSION_STR from persepolis.gui import resources import traceback from persepolis.scripts.error_window import ErrorWindow import json import struct import argparse from persepolis.scripts import osCommands from persepolis.scripts.useful_tools import osAndDesktopEnvironment, determineConfigFolder from persepolis.constants import OS from persepolis.constants import VERSION from copy import deepcopy import sys import os # finding os platform os_type, desktop_env = osAndDesktopEnvironment() # Don't run persepolis as root! if os_type in (OS.UNIX_LIKE + [OS.OSX]): uid = os.getuid() if uid == 0: print('Do not run persepolis as root.') sys.exit(1) # initialization # find home address home_address = os.path.expanduser("~") # persepolis config_folder config_folder = determineConfigFolder() # persepolis tmp folder path persepolis_tmp = os.path.join(config_folder, 'persepolis_tmp') # if lock_file_validation == True >> not another instance running, # else >> another instance of persepolis is running now. global lock_file_validation if os_type != OS.WINDOWS: import fcntl user_name_split = home_address.split('/') user_name = user_name_split[2] # persepolis lock file lock_file = '/tmp/persepolis_exec_' + user_name + '.lock' # create lock file fp = open(lock_file, 'w') try: fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB) lock_file_validation = True # Lock file created successfully! except IOError: lock_file_validation = False # creating lock_file was unsuccessful! So persepolis is still running else: # for windows # pypiwin32 must be installed by pip from win32event import CreateMutex from win32api import GetLastError from winerror import ERROR_ALREADY_EXISTS handle = CreateMutex(None, 1, 'persepolis_download_manager') if GetLastError() == ERROR_ALREADY_EXISTS: lock_file_validation = False else: lock_file_validation = True # run persepolis mainwindow if lock_file_validation: # execute initialization script from persepolis.scripts import initialization from persepolis.scripts.mainwindow import MainWindow # set "persepolis" name for this process in linux and bsd if os_type in OS.UNIX_LIKE: try: from setproctitle import setproctitle setproctitle("persepolisdm") except ImportError: from persepolis.scripts import logger logger.sendToLog('setproctitle is not installed!', "ERROR") # load persepolis_settings persepolis_setting = QSettings('persepolis_download_manager', 'persepolis') class PersepolisApplication(QtWidgets.QApplication): def __init__(self, argv): super().__init__(argv) # set style def setPersepolisStyle(self, style): self.persepolis_style = style self.setStyle(style) # font and font_size def setPersepolisFont(self, font, font_size, custom_font): self.persepolis_font = font self.persepolis_font_size = font_size if custom_font == 'yes': self.setFont(QFont(font, font_size)) # color_scheme def setPersepolisColorScheme(self, color_scheme): self.persepolis_color_scheme = color_scheme if color_scheme == 'Dark Fusion': file = QFile(":/dark_style.qss") file.open(QFile.ReadOnly | QFile.Text) stream = QTextStream(file) self.setStyleSheet(stream.readAll()) elif color_scheme == 'Light Fusion': file = QFile(":/light_style.qss") file.open(QFile.ReadOnly | QFile.Text) stream = QTextStream(file) self.setStyleSheet(stream.readAll()) # create terminal arguments parser = argparse.ArgumentParser(description='Persepolis Download Manager') # parser.add_argument('chromium', nargs = '?', default = 'no', help='this switch is used for chrome native messaging in Linux and Mac') parser.add_argument('--link', action='store', nargs=1, help='Download link.(Use "" for links)') parser.add_argument('--referer', action='store', nargs=1, help='Set an http referrer (Referer). This affects all http/https downloads. If * is given, the download URI is also used as the referrer.') parser.add_argument('--load-cookies', action='store', nargs=1, help='Set cookies file path.') parser.add_argument('--agent', action='store', nargs=1, help='Set user agent for HTTP(S) downloads. Default: aria2/$VERSION, $VERSION is replaced by package version.') parser.add_argument('--headers', action='store', nargs=1, help='Append HEADER to HTTP request header. ') parser.add_argument('--name', action='store', nargs=1, help='The file name of the downloaded file. ') parser.add_argument('--default', action='store_true', help='restore default setting') parser.add_argument('--clear', action='store_true', help='Clear download list and user setting!') parser.add_argument('--tray', action='store_true', help="Persepolis is starting in tray icon. It's useful when you want to put persepolis in system's startup.") parser.add_argument('--parent-window', action='store', nargs=1, help='this switch is used for chrome native messaging in Windows') parser.add_argument('--version', action='version', version='Persepolis Download Manager ' + VERSION.version_str) # Clears unwanted args ( like args from Browers via NHM ) # unknown arguments (may sent by browser) will save in unknownargs. args, unknownargs = parser.parse_known_args() # if --execute >> yes >>> persepolis main window will start. # if --execute >> no >>> persepolis started before! browser_url = True add_link_dictionary = {} plugin_list = [] browser_plugin_dict = {'link': None, 'referer': None, 'load_cookies': None, 'user_agent': None, 'header': None, 'out': None } # This dirty trick will show Persepolis version when there are unknown args # Unknown args are sent by Browsers for NHM if args.parent_window or unknownargs: # Platform specific configuration if os_type == OS.WINDOWS: # Set the default I/O mode to O_BINARY in windows import msvcrt msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY) msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) # Send message to browsers plugin message = '{"enable": true, "version": "1.85"}'.encode('utf-8') sys.stdout.buffer.write((struct.pack('i', len(message)))) sys.stdout.buffer.write(message) sys.stdout.flush() text_length_bytes = sys.stdin.buffer.read(4) # Unpack message length as 4 byte integer. text_length = struct.unpack('@I', text_length_bytes)[0] # Read the text (JSON object) of the message. text = sys.stdin.buffer.read(text_length).decode("utf-8") if text: new_dict = json.loads(text) if 'url_links' in new_dict: # new_dict is sended by persepolis browser add-on. # new_dict['url_links'] contains some lists. # every list contains link information. for item in new_dict['url_links']: copy_dict = deepcopy(browser_plugin_dict) if 'url' in item.keys(): copy_dict['link'] = str(item['url']) if 'header' in item.keys() and item['header'] != '': copy_dict['header'] = item['header'] if 'referrer' in item.keys() and item['referrer'] != '': copy_dict['referer'] = item['referrer'] if 'filename' in item.keys() and item['filename'] != '': copy_dict['out'] = os.path.basename(str(item['filename'])) if 'useragent' in item.keys() and item['useragent'] != '': copy_dict['user_agent'] = item['useragent'] if 'load_cookies' in item.keys() and item['load_cookies'] != '': copy_dict['load_cookies'] = item['load_cookies'] plugin_list.append(copy_dict) else: browser_url = False # persepolis --clear >> remove config_folder if args.clear: # get config_folder address config_folder = determineConfigFolder() # remove config_folder osCommands.removeDir(config_folder) # exit sys.exit(0) # persepolis --default >> remove persepolis setting. if args.default: persepolis_setting.clear() persepolis_setting.sync() print('Persepolis restored default') sys.exit(0) if args.link: add_link_dictionary['link'] = "".join(args.link) # if plugins call persepolis, then just start persepolis in system tray args.tray = True if args.referer: add_link_dictionary['referer'] = "".join(args.referer) else: add_link_dictionary['referer'] = None if args.load_cookies: add_link_dictionary['load_cookies'] = "".join(args.load_cookies) else: add_link_dictionary['load_cookies'] = None if args.agent: add_link_dictionary['user_agent'] = "".join(args.agent) else: add_link_dictionary['user_agent'] = None if args.headers: add_link_dictionary['header'] = "".join(args.headers) else: add_link_dictionary['header'] = None if args.name: add_link_dictionary['out'] = "".join(args.name) else: add_link_dictionary['out'] = None if args.tray: start_in_tray = True else: start_in_tray = False # when browsers plugin calls persepolis or user runs persepolis by terminal arguments, # then persepolis creates a request file in persepolis_tmp folder and link information added to # plugins_db.db file(see data_base.py for more information). # persepolis mainwindow checks persepolis_tmp for plugins request file every 2 seconds (see CheckingThread class in mainwindow.py) # when request received in CheckingThread, a popup window (AddLinkWindow) comes up and window gets additional download information # from user (port , proxy , ...) and download starts and request file deleted if ('link' in add_link_dictionary.keys()): plugin_dict = {'link': add_link_dictionary['link'], 'referer': add_link_dictionary['referer'], 'load_cookies': add_link_dictionary['load_cookies'], 'user_agent': add_link_dictionary['user_agent'], 'header': add_link_dictionary['header'], 'out': add_link_dictionary['out'] } plugin_list.append(plugin_dict) if len(plugin_list) != 0: # import PluginsDB from persepolis.scripts.data_base import PluginsDB # create an object for PluginsDB plugins_db = PluginsDB() # add plugin_list to plugins_table in plugins.db file. plugins_db.insertInPluginsTable(plugin_list) # Job is done! close connections. plugins_db.closeConnections() # notify that a link is added! plugin_ready = os.path.join(persepolis_tmp, 'persepolis-plugin-ready') osCommands.touch(plugin_ready) # start persepolis in system tray start_in_tray = True # start persepolis in system tray if browser executed # and if user select this option in preferences window. if str(persepolis_setting.value('settings/browser-persepolis')) == 'yes' and (args.parent_window or unknownargs): start_persepolis_if_browser_executed = True start_in_tray = True else: start_persepolis_if_browser_executed = False def main(): # if lock_file is existed , it means persepolis is still running! if lock_file_validation and (not ((args.parent_window or unknownargs) and browser_url is False) or ((args.parent_window or unknownargs) and start_persepolis_if_browser_executed)): QAPP = QtWidgets.QApplication.instance() if QAPP is None: # We do not have an already instantiated QApplication # let's add some sane defaults # hidpi handling qtVersionCompare = tuple(map(int, QT_VERSION_STR.split("."))) if qtVersionCompare > (6, 0): # Qt6 seems to support hidpi without needing to do anything so continue pass elif qtVersionCompare > (5, 14): try: os.environ["QT_ENABLE_HIGHDPI_SCALING"] = "1" QtWidgets.QApplication.setHighDpiScaleFactorRoundingPolicy( QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough ) except Exception as error_message: from persepolis.scripts import logger logger.sendToLog(str(error_message), "ERROR") else: # qt 5.12 and 5.13 try: QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling) QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps) except Exception as error_message: from persepolis.scripts import logger logger.sendToLog(str(error_message), "ERROR") # set QT_AUTO_SCREEN_SCALE_FACTOR to 1 for "high DPI displays" # os.environ['QT_AUTO_SCREEN_SCALE_FACTOR'] = '1' # run mainwindow # set color_scheme and style # see palettes.py and setting.py # create QApplication persepolis_download_manager = PersepolisApplication(sys.argv) # setQuitOnLastWindowClosed(False) is needed to prevent persepolis exiting, # when it's minimized in system tray. persepolis_download_manager.setQuitOnLastWindowClosed(False) # # Enable High DPI display # try: # if hasattr(QStyleFactory, 'AA_UseHighDpiPixmaps'): # persepolis_download_manager.setAttribute(Qt.AA_UseHighDpiPixmaps) # except: # from persepolis.scripts import logger # # write error_message in log file. # logger.sendToLog('Qt.AA_UseHighDpiPixmaps is not available!', "ERROR") # this line is added fot fixing persepolis view in HighDpi displays # more information at: https://doc.qt.io/qt-5/highdpi.html # try: # persepolis_download_manager.setAttribute(Qt.AA_EnableHighDpiScaling) # except: # from persepolis.scripts import logger # # write error_message in log file. # logger.sendToLog('Qt.AA_EnableHighDpiScaling is not available!', "ERROR") # set organization name and domain and application name persepolis_download_manager.setOrganizationName('com.github.persepolisdm.persepolis') persepolis_download_manager.setApplicationName('PersepolisDM') persepolis_download_manager.setDesktopFileName('com.github.persepolisdm.persepolis') persepolis_download_manager.setApplicationVersion(VERSION.version_str) # Persepolis setting persepolis_download_manager.setting = QSettings('persepolis_download_manager', 'persepolis') # get user's desired font and style , ... from setting custom_font = persepolis_download_manager.setting.value('settings/custom-font') font = persepolis_download_manager.setting.value('settings/font') font_size = int(persepolis_download_manager.setting.value('settings/font-size')) style = persepolis_download_manager.setting.value('settings/style') color_scheme = persepolis_download_manager.setting.value('settings/color-scheme') ui_direction = persepolis_download_manager.setting.value('ui_direction') # set style # check available style first available_styles = QtWidgets.QStyleFactory.keys() # add system style available_styles.append('System') # if user selected style not available, set 'Fusion' for style if style not in available_styles: style = 'Fusion' color_scheme = 'Dark Fusion' persepolis_download_manager.setPersepolisStyle(style) # set font persepolis_download_manager.setPersepolisFont(font, font_size, custom_font) # set color_scheme persepolis_download_manager.setPersepolisColorScheme(color_scheme) # set ui direction if ui_direction == 'rtl': persepolis_download_manager.setLayoutDirection(Qt.RightToLeft) elif ui_direction in 'ltr': persepolis_download_manager.setLayoutDirection(Qt.LeftToRight) # run mainwindow try: mainwindow = MainWindow(start_in_tray, persepolis_download_manager, persepolis_download_manager.setting) if start_in_tray: mainwindow.hide() else: mainwindow.show() except Exception: from persepolis.scripts import logger error_message = str(traceback.format_exc()) # write error_message in log file. logger.sendToLog(error_message, "ERROR") # Reset persepolis error_window = ErrorWindow(error_message) error_window.show() sys.exit(persepolis_download_manager.exec_()) elif not ((args.parent_window or unknownargs)): # this section warns user that program is still running and no need to run it again # and creating a file to notify mainwindow for showing itself! # (see CheckingThread in mainwindow.py for more information) if len(plugin_list) == 0: show_window_file = os.path.join(persepolis_tmp, 'show-window') f = open(show_window_file, 'w') f.close() sys.exit(0) ================================================ FILE: persepolis/scripts/persepolis_lib_prime.py ================================================ # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import requests import time import random import threading import os import errno from persepolis.scripts.useful_tools import convertTime, humanReadableSize, freeSpace, headerToDict, readCookieJar, getFileNameFromLink, returnNewFileName from persepolis.scripts.osCommands import makeDirs, moveFile from persepolis.scripts import logger from persepolis.constants import VERSION import json from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry class Download(): def __init__(self, add_link_dictionary, main_window, gid): self.downloaded_size = 0 self.finished_threads = 0 self.eta = "0" self.resume = False self.main_window = main_window self.download_speed_str = "0" self.gid = gid # download_status can be in waiting, downloading, stop, error, paused, creating download file self.download_status = 'waiting' self.link = add_link_dictionary['link'] self.name = add_link_dictionary['out'] self.download_path = add_link_dictionary['download_path'] self.ip = add_link_dictionary['ip'] self.port = add_link_dictionary['port'] self.proxy_user = add_link_dictionary['proxy_user'] self.proxy_passwd = add_link_dictionary['proxy_passwd'] self.proxy_type = add_link_dictionary['proxy_type'] self.download_user = add_link_dictionary['download_user'] self.download_passwd = add_link_dictionary['download_passwd'] self.header = add_link_dictionary['header'] self.user_agent = add_link_dictionary['user_agent'] self.load_cookies = add_link_dictionary['load_cookies'] self.referer = add_link_dictionary['referer'] self.start_time = add_link_dictionary['start_time'] self.end_time = add_link_dictionary['end_time'] self.number_of_parts = 0 self.file_name = None self.file_size = None self.timeout = int(main_window.persepolis_setting.value('settings/timeout')) self.retry = int(main_window.persepolis_setting.value('settings/max-tries')) self.retry_wait = int(main_window.persepolis_setting.value('settings/retry-wait')) self.python_request_chunk_size = int(main_window.persepolis_setting.value('settings/chunk-size')) self.lock = False self.sleep_for_speed_limiting = 0 self.not_converted_download_speed = 0 self.download_percent = 0 self.error_message = '' # this flag notify that download finished(stopped, complete or error) # in this situation download status must be written to the database # None means, Download not finished yet. # False meanse, Download has been finished, but download status must be written to the database # True meanse, Download status has been written to the database self.write_it_to_the_database = None # check certificate if str(main_window.persepolis_setting.value('settings/dont-check-certificate')) == 'yes': self.check_certificate = False else: self.check_certificate = True # number_of_threads can't be more that 64 self.number_of_threads = int(add_link_dictionary['connections']) self.number_of_active_connections = self.number_of_threads self.thread_list = [] # this dictionary contains information about each part is downloaded by which thread. self.part_thread_dict = {} # create requests session def createSession(self): # define a requests session self.requests_session = requests.Session() # check if user set proxy if self.ip: ip_port = '://' + str(self.ip) + ":" + str(self.port) if self.proxy_user: ip_port = ('://' + self.proxy_user + ':' + self.proxy_passwd + '@' + ip_port) if self.proxy_type == 'socks5': ip_port = 'socks5' + ip_port else: ip_port = 'http' + ip_port proxies = {'http': ip_port, 'https': ip_port} # set proxy to the session self.requests_session.proxies.update(proxies) # check if download session needs authenthication if self.download_user: # set download user pass to the session self.requests_session.auth = (self.download_user, self.download_passwd) # set cookies if self.load_cookies: jar = readCookieJar(self.load_cookies) if jar: self.requests_session.cookies = jar # set referer if self.referer: # setting referer to the session self.requests_session.headers.update({'referer': self.referer}) # set user_agent if self.user_agent: # setting user_agent to the session self.requests_session.headers.update( {'user-agent': self.user_agent}) else: self.user_agent = 'PersepolisDM/' + str(VERSION.version_str) # setting user_agent to the session self.requests_session.headers.update( {'user-agent': self.user_agent}) if self.header is not None: # convert header to dictionary dict_ = headerToDict(self.header) # update headers self.requests_session.headers.update(dict_) def setRetry(self): # set retry numbers. # backoff_factor will help to apply delays between attempts to avoid failing again retry_strategy = Retry( total=self.retry, backoff_factor=self.retry_wait, status_forcelist=[429, 500, 502, 503, 504], allowed_methods=["HEAD", "GET", "OPTIONS"] ) adapter = HTTPAdapter(max_retries=retry_strategy) self.requests_session.mount('http://', adapter) self.requests_session.mount('https://', adapter) # get file size # if file size is not available, then download link is invalid def getFileSize(self): error_message = None error_message2 = None # find file size try: self.file_header = {} response = self.requests_session.head(self.link, allow_redirects=True, timeout=self.timeout, verify=self.check_certificate) # response.raise_for_status() self.file_header = response.headers self.file_size = int(self.file_header['content-length']) except requests.exceptions.HTTPError as error: error_message = 'HTTP error' error_message2 = str(error) except requests.exceptions.ConnectionError as error: error_message = 'Connection error' error_message2 = str(error) except requests.exceptions.Timeout as error: error_message = 'Timeout error' error_message2 = str(error) except requests.exceptions.RequestException as error: error_message = 'Request error' error_message2 = str(error) except Exception as error: error_message = 'Error' error_message2 = str(error) if error_message: logger.sendToLog(error_message + ' - ' + error_message2 + ' - GID: ' + self.gid, 'DOWNLOAD ERROR') self.error_message = error_message self.file_size = None return self.file_header # get file name if available # if file name is not available, then set a file name def getFileName(self): # set default file name # get file_name from link self.file_name = getFileNameFromLink(self.link) # check if user set file name or not if self.name: self.file_name = self.name # check if filename is available in header elif 'Content-Disposition' in self.file_header.keys(): content_disposition = self.file_header['Content-Disposition'] if content_disposition.find('filename') != -1: # so file name is available in header filename_splited = content_disposition.split('filename=') filename_splited = filename_splited[-1] # getting file name in desired format self.file_name = filename_splited.strip() # this method gives etag from header # ETag is an HTTP response header field that helps with caching behavior by making # it easy to check whether a resource has changed, without having to re-download it. def getFileTag(self): if 'ETag' in self.file_header.keys(): self.etag = self.file_header['ETag'] else: self.etag = None # Check if server supports multi threading and resuming or not def resumingSupport(self): self.resuming_suppurt = False if 'Accept-Ranges' in self.file_header.keys(): if self.file_header['Accept-Ranges'] == 'bytes': logger.sendToLog('Server supports multi thread downloading and resuming download!' + ' - GID: ' + self.gid, 'DOWNLOADS') self.resuming_suppurt = True else: logger.sendToLog('Server dosn\'t support multi thread downloading and resuming download!' + ' - GID: ' + self.gid, 'DOWNLOAD ERROR') else: logger.sendToLog('Server dosn\'t support multi thread downloading and resuming download!' + ' - GID: ' + self.gid, 'DOWNLOAD ERROR') def createControlFile(self): # find file_path and control_json_file_path # If the file is partially downloaded, the download information is available in the control file. # The format of this file is Jason. the control file extension is .persepolis. # the control file name is same as download file name. # control file path is same as download file path. # If the file_path is set to default path, the the control file path will be created in "Download" directory. control_json_file = self.file_name + '.persepolis' # Create download_path if not existed makeDirs(self.download_path) # if user set download path self.file_path = os.path.join(self.download_path, self.file_name) self.control_json_file_path = os.path.join( self.download_path, control_json_file) # If we have diffrent files but with same name, So # this fle must be renamed. rename = False # create json control file if not created before try: with open(self.control_json_file_path, 'x') as f: f.write("") except OSError as e: # it means control_json_file_path characters is more than 256 byte if e.errno == errno.ENAMETOOLONG: # reduce file_name lenght reduce_bytes = len(self.control_json_file_path.encode('utf-8')) - 255 # seperate extension from file_name split_file_name = self.file_name.split('.') # check we have extension or not extension = "" if len(split_file_name) > 1: # remove extension extension = split_file_name.pop(-1) # join file_name without extension file_name_without_extension = ''.join(split_file_name) if len(file_name_without_extension.encode('utf-8')) > reduce_bytes: # Calculate how many characters must be removed for i in range(len(file_name_without_extension)): string_ = file_name_without_extension[(-1 * i):] string_size = len(string_.encode('utf-8')) if string_size >= reduce_bytes: # reduce characters file_name_without_extension = file_name_without_extension[:(-1 * i)] break # create new file_name and file_path and control_json_file self.file_name = file_name_without_extension + extension self.file_path = os.path.join(self.download_path, self.file_name) control_json_file = self.file_name + '.persepolis' self.control_json_file_path = os.path.join( self.download_path, control_json_file) # try again with open(self.control_json_file_path, 'x') as f: f.write("") else: # so the control file is already exists # read control file with open(self.control_json_file_path, "r") as f: try: # save json file information in dictionary format data_dict = json.load(f) # check if the download is duplicated # If download item is duplicated, so resume download # check ETag. Else rename file if 'ETag' in data_dict: if data_dict['ETag'] == self.etag: self.resume = True else: self.resume = False rename = True # if ETag is not available, then check file size elif 'file_size' in data_dict: if data_dict['file_size'] == self.file_size: self.resume = True else: self.resume = False rename = True else: self.resume = False rename = True # control file is corrupted. except Exception as e: logger.sendToLog(str(e) + ' - GID: ' + self.gid, 'DOWNLOAD ERROR') self.resume = False if self.resuming_suppurt is False: self.resume = False # check if uncomplete download file exists if os.path.isfile(self.file_path): download_file_existance = True else: download_file_existance = False # If download file not exists so we can rewrite .persepolis file # Else download file name and json file name must be renamed. if rename and download_file_existance: download_file_existance = False # create new file name self.file_name = returnNewFileName(self.download_path, self.file_name) # create new name for json file control_json_file = self.file_name + '.persepolis' # create new file path self.file_path = os.path.join(self.download_path, self.file_name) # create new control file path self.control_json_file_path = os.path.join( self.download_path, control_json_file) # create json control file try: with open(self.control_json_file_path, 'x') as f: f.write("") except Exception as e: logger.sendToLog(str(e) + ' - GID: ' + self.gid, 'DOWNLOAD ERROR') self.resume = False if self.resume and not (download_file_existance): self.resume = False create_download_file = True elif self.resume and download_file_existance: create_download_file = False else: create_download_file = True # create an empty file if create_download_file: fp = open(self.file_path, "wb") # if file_size is specified, create an empty file with file_size if self.file_size: # check for free space free_space = freeSpace(self.download_path) if free_space is not None: # compare free disk space and file_size if free_space >= self.file_size: # sets the size of each chunk to 1MiB CHUNK_SIZE = (1024 ** 2) # creates a byte string of zeroes with a size of 1MiB. # These bytes will be used for writing to the file later. zero_chunk = b'\0' * CHUNK_SIZE # This variable indicates how many bytes still need to be written. remaining = self.file_size # continue the loop until writing ends. while remaining > 0 and self.download_status != 'stopped': # determines how much data should be written in this iteration. # This value can be equal to CHUNK_SIZE, # but if remaining is less than CHUNK_SIZE, only the remaining amount will be written. to_write = min(CHUNK_SIZE, remaining) # writes the zero data up to the calculated amount (to_write) to the file. fp.write(zero_chunk[:to_write]) # updates the remaining amount to indicate how much of the file still needs to be written. remaining -= to_write if self.download_status != 'stopped': logger.sendToLog('Empty file has been created!' + ' - GID: ' + self.gid, 'DOWNLOADS') fp.close() return True else: # Download canceled by user! Delete unfinished empty file. fp.close() os.remove(self.file_path) return False else: fp.close() return False else: fp.close() return False else: fp.close() return True else: return True def definePartSizes(self): # download_infromation_list contains 64 lists. # Every list contains: # [start byte number for this part, downloaded size, download status for this part, number of retryingfor this part] # Status can be stopped, pending, downloading, error, complete # All part statuses start with a lowercase letter. # Retry number is -1, because askForNewPart method add 1 to it in the first call. if self.resume: # read control file with open(self.control_json_file_path, "r") as f: data_dict = json.load(f) # read number of threads self.download_infromation_list = data_dict['download_infromation_list'] # number_of_parts self.number_of_parts = data_dict['number_of_parts'] # set pending status for uncomplete parts for i in range(0, self.number_of_parts): if self.download_infromation_list[i][2] != 'complete': self.download_infromation_list[i] = [self.download_infromation_list[i][0], self.download_infromation_list[i][1], 'pending', -1] # Calculate downloded size self.downloaded_size = self.downloaded_size + self.download_infromation_list[i][1] else: if self.file_size: part_size = int(self.file_size // 64) # create new list. self.download_infromation_list = [[]] * 64 # if part_size greater than 1 MiB if part_size >= 1024**2: self.number_of_parts = 64 for i in range(0, 64): self.download_infromation_list[i] = [i * part_size, 0, 'pending', -1] else: # Calculate how many parts of one MiB we need. self.number_of_parts = int((self.file_size - 1) // (1024**2)) + 1 self.number_of_threads = self.number_of_parts for i in range(0, self.number_of_parts): self.download_infromation_list[i] = [i * 1024 * 1024, 0, 'pending', -1] # Set the starting byte number of the remaining parts equal to the size of the file. # The size of the file is equal to the last byte of the file. # The status of these parts is complete. Because we have nothing to download. # The starting bit number of the file is 0 and the ending bit number of the file # is equal to the file size minus one. for i in range(self.number_of_parts, 64): self.download_infromation_list[i] = [self.file_size - 1, 0, 'complete', -1] else: # create new list. self.download_infromation_list = [[]] * 64 self.number_of_parts = 1 self.number_of_threads = 1 self.download_infromation_list[0] = [0, 0, 'pending', -1] # Set the starting byte number of the remaining parts equal to the size of the file. # The size of the file is equal to the last byte of the file. # The status of these parts is complete. Because we have nothing to download. for i in range(self.number_of_parts, 64): self.download_infromation_list[i] = [0, 0, 'complete', -1] for i in range(0, self.number_of_parts): # self.part_thread_dict[part_number] = thread_number self.part_thread_dict[i] = None # this method calculates download rate and ETA every second def downloadSpeed(self): # Calculate the difference between downloaded volume and elapsed time # and divide them to get the download speed. last_download_value = self.downloaded_size end_time = time.perf_counter() # this loop repeated every 0.5 second. while self.download_status == 'downloading' or self.download_status == 'paused': diffrence_time = time.perf_counter() - end_time diffrence_size = self.downloaded_size - last_download_value diffrence_size_converted, speed_unit = humanReadableSize(diffrence_size, 'speed') download_speed = round(float(diffrence_size_converted) / diffrence_time, 2) self.download_speed_str = (str(download_speed) + " " + speed_unit + "/s") not_converted_download_speed = diffrence_size / diffrence_time try: # estimated time the download will be completed. eta_second = (self.file_size - self.downloaded_size) / not_converted_download_speed except Exception: eta_second = 0 self.eta = convertTime(eta_second) end_time = time.perf_counter() last_download_value = self.downloaded_size time.sleep(2) # this method runs progress bar and speed calculator def runProgressBar(self): # run a thread for calculating download speed. calculate_speed_thread = threading.Thread( target=self.downloadSpeed) calculate_speed_thread.setDaemon(True) calculate_speed_thread.start() self.thread_list.append(calculate_speed_thread) # threadHandler asks new part for download from this method. def askForNewPart(self): self.lock = True for i in range(0, self.number_of_parts): # Check that this part is not being downloaded or it is not complete. # Check that the number of retries of this part has not reached the set limit. if (self.download_infromation_list[i][2] not in ['complete', 'downloading']) and (self.download_infromation_list[i][3] != self.retry): # set 'downloding' status for this part self.download_infromation_list[i][2] = 'downloading' # add 1 to retry number for this part self.download_infromation_list[i][3] += 1 # number of retries can't be less than 0 if self.download_infromation_list[i][3] < 0: self.download_infromation_list[i][3] = 0 self.lock = False return i self.lock = False return None # The below code is used for each chunk of file handled # by each thread for downloading the content from specified # location to storage def threadHandler(self, thread_number): while self.download_status in ['downloading', 'paused']: is_break = False # Wait for the lock to be released. while self.lock is True: # Random sleep prevents two threads from downloading the same part at the same time. # sleep random time time.sleep(random.uniform(1, 3)) part_number = self.askForNewPart() # If part_number is None, no part is available for download. So exit the loop. if part_number is None: is_break = True break error_message = None error_message2 = None self.part_thread_dict[part_number] = thread_number try: if self.file_size: # Calculate part size # If it's not the last part: if part_number != (self.number_of_parts - 1): part_size = self.download_infromation_list[part_number + 1][0] - self.download_infromation_list[part_number][0] else: # for last part part_size = self.file_size - 1 - self.download_infromation_list[part_number][0] # get start byte number of this part and add it to downloaded size. download resume from this byte number downloaded_part = self.download_infromation_list[part_number][1] start = self.download_infromation_list[part_number][0] + downloaded_part # end of part is equal to start of the next part # The starting bit number of the file is 0 and the ending bit number of the file # is equal to the file size minus one. if part_number != (self.number_of_parts - 1): end = self.download_infromation_list[part_number + 1][0] - 1 else: end = self.file_size - 1 # download from begining! if self.resuming_suppurt is False: start = 0 # specify the start and end of the part for request header. chunk_headers = {'Range': 'bytes=%d-%d' % (start, end)} # request the specified part and get into variable # When stream=True is set on the request, this avoids # reading the content at once into memory for large responses self.requests_session.headers.update(chunk_headers) response = self.requests_session.get( self.link, allow_redirects=True, stream=True, timeout=self.timeout, verify=self.check_certificate) # open the file and write the content of the html page # into file. # r+b mode is open the binary file in read or write mode. with open(self.file_path, "r+b") as fp: # The seek() method sets the current file position in a file stream. fp.seek(start) # The Python File tell() method is used to find the current position of # the file cursor (or pointer) within the file. fp.tell() # why we use iter_content # Iterates over the response data. When stream=True is set on # the request, this avoids reading the content at once into # memory for large responses. The chunk size is the number # of bytes it should read into memory. This is not necessarily # the length of each item returned as decoding can take place. # so we divide our chunk to smaller chunks. default is 100 Kib python_request_chunk_size = (1024 * self.python_request_chunk_size) for data in response.iter_content( chunk_size=python_request_chunk_size): if self.download_status in ['downloading', 'paused']: fp.write(data) # if this part is downloaded by another thread then exit thread if self.part_thread_dict[part_number] != thread_number: # This loop does not end due to an error in the request. # Therefore, no number should be added to the number of retries. self.download_infromation_list[part_number][3] -= 1 is_break = True break # maybe the last chunk is less than default chunk size if (part_size - downloaded_part) >= python_request_chunk_size: update_size = python_request_chunk_size # if update_size is not equal with actual data length, # then redownload this chunk. # exit this "for loop" for redownloading this chunk. if update_size != len(data): # This loop does not end due to an error in the request. # Therefore, no number should be added to the number of retries. self.download_infromation_list[part_number][3] -= 1 break else: # so the last small chunk is equal to : update_size = (part_size - downloaded_part) # some times last chunks are smaller if len(data) < update_size: update_size = len(data) # update downloaded_part downloaded_part = (downloaded_part + update_size) # save value to downloaded_size_list self.download_infromation_list[part_number][1] = downloaded_part # this variable saves amount of total downloaded size # update downloaded_size self.downloaded_size = (self.downloaded_size + update_size) # perhaps user set limitation for download rate. # downloadrate limitation # "Speed limit" is whole number. The more it is, the more sleep time is given to the data # receiving loop, which reduces the download speed. time.sleep(self.sleep_for_speed_limiting) if self.download_status == 'paused': # wait for unpausing while self.download_status == 'paused': time.sleep(0.2) else: self.download_infromation_list[part_number][2] = 'stopped' is_break = True break # If file_size is unspecified. else: download_finished_successfully = False # get start byte number of this part and add it to downloaded size. download resume from this byte number start = self.download_infromation_list[part_number][1] downloaded_part = start # download from begining! if self.resuming_suppurt is False: start = 0 # specify the start and end of the part for request header. chunk_headers = {'Range': 'bytes=%d-' % (start)} # request the specified part and get into variable # When stream=True is set on the request, this avoids # reading the content at once into memory for large responses self.requests_session.headers.update(chunk_headers) response = self.requests_session.get( self.link, allow_redirects=True, stream=True, timeout=self.timeout, verify=self.check_certificate) # open the file and write the content of the html page # into file. # r+b mode is open the binary file in read or write mode. with open(self.file_path, "r+b") as fp: # The seek() method sets the current file position in a file stream. fp.seek(start) # The Python File tell() method is used to find the current position of # the file cursor (or pointer) within the file. fp.tell() # why we use iter_content # Iterates over the response data. When stream=True is set on # the request, this avoids reading the content at once into # memory for large responses. The chunk size is the number # of bytes it should read into memory. This is not necessarily # the length of each item returned as decoding can take place. # so we divide our chunk to smaller chunks. default is 100 Kib python_request_chunk_size = (1024 * self.python_request_chunk_size) for data in response.iter_content( chunk_size=python_request_chunk_size): if self.download_status in ['downloading', 'paused']: fp.write(data) update_size = len(data) # update downloaded_part downloaded_part = (downloaded_part + update_size) # save value to downloaded_size_list self.download_infromation_list[part_number][1] = downloaded_part # this variable saves amount of total downloaded size # update downloaded_size self.downloaded_size = (self.downloaded_size + update_size) # perhaps user set limitation for download rate. # downloadrate limitation # "Speed limit" is whole number. The more it is, the more sleep time is given to the data # receiving loop, which reduces the download speed. time.sleep(self.sleep_for_speed_limiting) if self.download_status == 'paused': # wait for unpausing while self.download_status == 'paused': time.sleep(0.2) else: self.download_infromation_list[part_number][2] = 'stopped' is_break = True break download_finished_successfully = True except requests.exceptions.HTTPError as error: error_message = 'HTTP error' error_message2 = str(error) self.download_infromation_list[part_number][2] = 'error' except requests.exceptions.ConnectionError as error: error_message = 'Connection error' error_message2 = str(error) self.download_infromation_list[part_number][2] = 'error' except requests.exceptions.Timeout as error: error_message = 'Timeout error' error_message2 = str(error) self.download_infromation_list[part_number][2] = 'error' except requests.exceptions.RequestException as error: error_message = 'Request error' error_message2 = str(error) self.download_infromation_list[part_number][2] = 'error' except Exception as error: error_message = 'Error' error_message2 = str(error) self.download_infromation_list[part_number][2] = 'error' if error_message: self.error_message = error_message logger.sendToLog(error_message + ' - ' + error_message2 + ' - GID: ' + self.gid, 'ERROR') # so it's complete successfully. if self.file_size: if (downloaded_part == part_size): self.download_infromation_list[part_number][2] = 'complete' self.part_thread_dict[part_number] = None elif not (is_break): self.download_infromation_list[part_number][2] = 'error' self.part_thread_dict[part_number] = None else: if download_finished_successfully: self.file_size = self.downloaded_size self.download_infromation_list[part_number][2] = 'complete' self.part_thread_dict[part_number] = None elif not (is_break): self.download_infromation_list[part_number][2] = 'error' self.part_thread_dict[part_number] = None # This thread is finished. self.finished_threads = self.finished_threads + 1 # this method save download information in json format every 1 second def saveInfo(self): while self.download_status == 'downloading' or self.download_status == 'paused': control_dict = { 'ETag': self.etag, 'file_name': self.file_name, 'file_size': self.file_size, 'number_of_parts': self.number_of_parts, 'download_infromation_list': self.download_infromation_list} # write control_dict in json file with open(self.control_json_file_path, "w") as outfile: json.dump(control_dict, outfile, indent=2) time.sleep(1) # this method runs download threads def runDownloadThreads(self): # check if server supports multithread downloading or not! if self.resuming_suppurt is False: self.thread_number = 1 for i in range(0, self.number_of_threads): # sleep between starting new thread. # it solves "Connection refused" error. time.sleep(0.1) # create threads t = threading.Thread( target=self.threadHandler, kwargs={'thread_number': i}) t.setDaemon(True) t.start() self.thread_list.append(t) # run saveInfo thread for updating control file save_control_thread = threading.Thread( target=self.saveInfo) save_control_thread.setDaemon(True) save_control_thread.start() self.thread_list.append(save_control_thread) # this method checks and manages download progress. def checkDownloadProgress(self): logger.sendToLog("Download starts! - GID:" + self.gid, "DOWNLOADS") # Run this loop until the download is finished. while (self.download_status == 'downloading' or self.download_status == 'paused') and \ (self.finished_threads != self.number_of_threads): # Calculate download percent if self.file_size: self.download_percent = int((self.downloaded_size / self.file_size) * 100) else: self.download_percent = 0 # Calculate number of active threads self.number_of_active_connections = self.number_of_threads - self.finished_threads time.sleep(1) # Check if all parts downloaded completely. number_of_completed_parts = 0 for i in range(0, self.number_of_parts): if self.download_infromation_list[i][2] == 'complete': number_of_completed_parts += 1 if number_of_completed_parts == self.number_of_parts: # Download complete! self.download_status = 'complete' # Calculate download percent if self.file_size: self.download_percent = int((self.downloaded_size / self.file_size) * 100) else: self.download_percent = 0 self.number_of_active_connections = 0 # If the downloaded size is the same as the file size, then the download has been completed successfully. if self.download_status == 'complete': logger.sendToLog('Download complete. - GID: ' + self.gid, 'DOWNLOADS') self.download_percent = 100 self.eta = '0s' # If the download is not complete and the user has not stopped the download, then the download has encountered an error. elif self.download_status != 'stopped': self.download_status = 'error' logger.sendToLog('Download Error - GID: ' + self.gid, 'DOWNLOADS') elif self.download_status == 'stopped': logger.sendToLog('Download stopped. - GID: ' + self.gid, 'DOWNLOADS') # This method returns data and time in string format # for example >> 2017/09/09 , 13:12:26 def nowDate(self): date = time.strftime("%Y/%m/%d , %H:%M:%S") return date def sigmaTime(self, time): hour, minute = time.split(":") return (int(hour) * 60 + int(minute)) # nowTime returns now time in HH:MM format! def nowTime(self): now_time = time.strftime("%H:%M") return self.sigmaTime(now_time) # this method creates sleep time,if user sets "start time" for download. def startTime(self): # write some messages logger.sendToLog("Download starts at " + self.start_time + ' - GID: ' + self.gid, "DOWNLOADS") # start_time that specified by user sigma_start = self.sigmaTime(self.start_time) # get current time sigma_now = self.nowTime() # this loop is continuing until download time arrival! while sigma_start != sigma_now and self.download_status == 'scheduled': time.sleep(2.1) sigma_now = self.nowTime() # This method will stop the download when the end_time is reached. def endTime(self): logger.sendToLog("End time is activated: " + self.end_time + ' - GID: ' + self.gid, "DOWNLOADS") sigma_end = self.sigmaTime(self.end_time) # get current time sigma_now = self.nowTime() # while current time is not equal to end_time, continue the loop while sigma_end != sigma_now and (self.download_status not in ['stopped', 'error']): # get current time sigma_now = self.nowTime() time.sleep(2.1) # Time is up! if self.download_status not in ['stopped', 'error']: logger.sendToLog("Time is up! - GID:" + self.gid, "DOWNLOADS") # stop download self.downloadStop() # job is done so change end_time value to None in data_base self.main_window.persepolis_db.setDefaultGidInAddlinkTable(self.gid, end_time=True) # this method runs endTime in a thread. def runEndTimeThread(self): end_time_thread = threading.Thread( target=self.endTime) end_time_thread.setDaemon(True) end_time_thread.start() self.thread_list.append(end_time_thread) # this method starts download def start(self): # create new download session. self.createSession() # update status and last_try_date in data_base if self.start_time: self.download_status = "scheduled" else: self.download_status = "waiting" # get last_try_date now_date = self.nowDate() # update data_base dict_ = {'gid': self.gid, 'status': self.download_status, 'last_try_date': now_date} self.main_window.persepolis_db.updateDownloadTable([dict_]) # call startTime if start_time is available # startTime creates sleep loop if user set start_time # see startTime method for more information. if self.start_time: self.startTime() # now startTime work is done! update data_base # if download stopped by user don't update data_base if self.download_status == "scheduled": # set start_time value to None in data_base! self.main_window.persepolis_db.setDefaultGidInAddlinkTable(self.gid, start_time=True) if self.download_status != 'stopped': self.download_status = 'creating download file' # start download headers = self.getFileSize() if headers != {}: self.setRetry() # if user set end_time if self.end_time: self.runEndTimeThread() self.resumingSupport() self.getFileName() self.getFileTag() enough_free_space = self.createControlFile() if self.download_status != 'stopped': self.download_status = 'downloading' if enough_free_space: self.definePartSizes() self.runProgressBar() self.runDownloadThreads() self.checkDownloadProgress() else: self.download_status = 'error' self.close() else: # headers is missing self.download_status = 'error' logger.sendToLog('Download Error - GID: ' + self.gid, 'DOWNLOADS') self.close() else: # if start_time_status is "stopped" it means download Canceled by user logger.sendToLog("Download Canceled", "DOWNLOADS") def downloadPause(self): self.download_status = 'paused' def downloadUnpause(self): self.download_status = 'downloading' def downloadStop(self): self.download_status = 'stopped' # self.exit_event.set() def close(self): # if download complete, so delete control file if self.download_status == 'complete': os.remove(self.control_json_file_path) # move file to download folder self.main_window.persepolis_setting.sync() # if user specified download_path is equal to persepolis_setting download_path, # then subfolder must added to download path. if self.main_window.persepolis_setting.value('settings/download_path') == self.download_path: # return new download_path according to file extension. new_download_path = self.findDownloadPath( self.file_name, self.download_path, self.main_window.persepolis_setting.value('settings/subfolder')) file_path = self.downloadCompleteAction(new_download_path) else: # keep user specified download_path file_path = self.file_path # update download_path in addlink_db_table # find user preferred download_path from addlink_db_table in data_base add_link_dictionary = self.main_window.persepolis_db.searchGidInAddLinkTable(self.gid) add_link_dictionary['download_path'] = file_path self.main_window.persepolis_db.updateAddLinkTable([add_link_dictionary]) # close requests session self.requests_session.close() # ask threads for exiting. for thread in self.thread_list: thread.join() self.write_it_to_the_database = False logger.sendToLog("persepolis_lib is closed!", 'DOWNLOADS') # remove it from download_sessions_list when download status has been written to the database. for download_session_dict in self.main_window.download_sessions_list: if download_session_dict['gid'] == self.gid: # Wait until the information is written to the database. while self.write_it_to_the_database is False: time.sleep(0.1) # remove item self.main_window.download_sessions_list.remove(download_session_dict) # This method returns download status def tellStatus(self): downloaded_size, downloaded_size_unit = humanReadableSize(self.downloaded_size) if self.file_size: file_size, file_size_unit = humanReadableSize(self.file_size) else: file_size = '' file_size_unit = '' if self.eta == '0s': self.eta = '' # return information in dictionary format download_info = { 'gid': self.gid, 'file_name': self.file_name, 'status': self.download_status, 'size': str(file_size) + ' ' + file_size_unit, 'downloaded_size': str(downloaded_size) + ' ' + downloaded_size_unit, 'percent': str(self.download_percent) + '%', 'connections': str(self.number_of_active_connections), 'rate': self.download_speed_str, 'estimate_time_left': self.eta, 'link': self.link, 'error': self.error_message } return download_info # This method limits download speed def limitSpeed(self, limit_value): # Calculate sleep time between data receiving. It's reduce download speed. self.sleep_for_speed_limiting = (10 - limit_value) * 0.005 * (self.number_of_active_connections) # download complete actions! # this method is returning file_path of file in the user's download folder # and move downloaded file after download completion. def downloadCompleteAction(self, new_download_path): # rename file if file already existed self.file_name = returnNewFileName(new_download_path, self.file_name) new_file_path = os.path.join(new_download_path, self.file_name) # move the file to the download folder move_answer = moveFile(str(self.file_path), str(new_file_path), 'file') if not (move_answer): # write error message in log logger.sendToLog('Persepolis can not move file' + ' - GID: ' + self.gid, "ERROR") new_file_path = self.file_path return str(new_file_path) # this function returns folder of download according to file extension def findDownloadPath(self, file_name, download_path, subfolder): file_name_split = file_name.split('.') file_extension = file_name_split[-1] # convert extension letters to lower case # for example "JPG" will be converted in "jpg" file_extension = file_extension.lower() # remove query from file_extension if existed # if '?' in file_extension, then file_name contains query components. if '?' in file_extension: file_extension = file_extension.split('?')[0] # audio formats audio = ['act', 'aiff', 'aac', 'amr', 'ape', 'au', 'awb', 'dct', 'dss', 'dvf', 'flac', 'gsm', 'iklax', 'ivs', 'm4a', 'm4p', 'mmf', 'mp3', 'mpc', 'msv', 'ogg', 'oga', 'opus', 'ra', 'raw', 'sln', 'tta', 'vox', 'wav', 'wma', 'wv'] # video formats video = ['3g2', '3gp', 'asf', 'avi', 'drc', 'flv', 'm4v', 'mkv', 'mng', 'mov', 'qt', 'mp4', 'm4p', 'mpg', 'mp2', 'mpeg', 'mpe', 'mpv', 'm2v', 'mxf', 'nsv', 'ogv', 'rmvb', 'roq', 'svi', 'vob', 'webm', 'wmv', 'yuv', 'rm'] # document formats document = ['doc', 'docx', 'html', 'htm', 'fb2', 'odt', 'sxw', 'pdf', 'ps', 'rtf', 'tex', 'txt', 'epub', 'pub' 'mobi', 'azw', 'azw3', 'azw4', 'kf8', 'chm', 'cbt', 'cbr', 'cbz', 'cb7', 'cba', 'ibooks', 'djvu', 'md'] # compressed formats compressed = ['a', 'ar', 'cpio', 'shar', 'LBR', 'iso', 'lbr', 'mar', 'tar', 'bz2', 'F', 'gz', 'lz', 'lzma', 'lzo', 'rz', 'sfark', 'sz', 'xz', 'Z', 'z', 'infl', '7z', 's7z', 'ace', 'afa', 'alz', 'apk', 'arc', 'arj', 'b1', 'ba', 'bh', 'cab', 'cfs', 'cpt', 'dar', 'dd', 'dgc', 'dmg', 'ear', 'gca', 'ha', 'hki', 'ice', 'jar', 'kgb', 'lzh', 'lha', 'lzx', 'pac', 'partimg', 'paq6', 'paq7', 'paq8', 'pea', 'pim', 'pit', 'qda', 'rar', 'rk', 'sda', 'sea', 'sen', 'sfx', 'sit', 'sitx', 'sqx', 'tar.gz', 'tgz', 'tar.Z', 'tar.bz2', 'tbz2', 'tar.lzma', 'tlz', 'uc', 'uc0', 'uc2', 'ucn', 'ur2', 'ue2', 'uca', 'uha', 'war', 'wim', 'xar', 'xp3', 'yz1', 'zip', 'zipx', 'zoo', 'zpaq', 'zz', 'ecc', 'par', 'par2'] # return download_path if str(subfolder) == 'yes': if file_extension in audio: return os.path.join(download_path, 'Audios') # aria2c downloads youtube links file_name with 'videoplayback' name?! elif (file_extension in video) or (file_name == 'videoplayback'): return os.path.join(download_path, 'Videos') elif file_extension in document: return os.path.join(download_path, 'Documents') elif file_extension in compressed: return os.path.join(download_path, 'Compressed') else: return os.path.join(download_path, 'Others') else: return download_path ================================================ FILE: persepolis/scripts/play.py ================================================ # 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 . try: from PySide6.QtCore import QUrl, QSettings from PySide6.QtMultimedia import QSoundEffect except ImportError: from PyQt5.QtCore import QUrl, QSettings from PyQt5.QtMultimedia import QSoundEffect from persepolis.scripts import logger from persepolis.constants import OS import platform os_type = platform.system() # It's weird! but effect must be global variable # See this issue: # https://stackoverflow.com/questions/64794912/ global effect def playNotification(file): # getting user setting from persepolis_setting persepolis_setting = QSettings('persepolis_download_manager', 'persepolis') # enabling or disabling notification sound in persepolis_setting enable_notification = str(persepolis_setting.value('settings/sound')) # volume of notification in persepolis_setting(an integer between 0 to 100) volume_percent = int(persepolis_setting.value('settings/sound-volume')) global effect if enable_notification == 'yes': if os_type in OS.UNIX_LIKE: try: effect = QSoundEffect() effect.setSource(QUrl.fromLocalFile(file)) effect.setLoopCount(1) effect.setVolume(volume_percent / 100) effect.play() except Exception as error: logger.sendToLog( str(error), "ERROR") elif os_type == OS.OSX: try: effect = QSoundEffect() effect.setSource(QUrl.fromLocalFile(file)) effect.setLoopCount(1) effect.setVolume(volume_percent / 100) effect.play() except Exception as error: logger.sendToLog( str(error), "ERROR") ================================================ FILE: persepolis/scripts/progress.py ================================================ # -*- coding: utf-8 -*- # 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 . try: from PySide6.QtCore import Qt, QSize, QPoint, QThread, QTranslator, QCoreApplication, QLocale from PySide6.QtWidgets import QLineEdit, QInputDialog from PySide6.QtGui import QIcon except ImportError: from PyQt5.QtCore import Qt, QSize, QPoint, QThread, QTranslator, QCoreApplication, QLocale from PyQt5.QtWidgets import QLineEdit, QInputDialog from PyQt5.QtGui import QIcon from persepolis.gui.progress_ui import ProgressWindow_Ui from persepolis.scripts.shutdown import shutDown from persepolis.constants import OS import subprocess import platform os_type = platform.system() class ShutDownThread(QThread): def __init__(self, parent, gid, password=None): QThread.__init__(self) self.gid = gid self.password = password self.main_window = parent def run(self): shutDown(self.main_window, gid=self.gid, password=self.password) class ProgressWindow(ProgressWindow_Ui): def __init__(self, parent, gid, persepolis_setting, single_video_link=False): super().__init__(persepolis_setting, parent) self.persepolis_setting = persepolis_setting self.main_window = parent self.gid = gid self.status = None self.single_video_link = single_video_link self.resume_pushButton.clicked.connect(self.resumePushButtonPressed) self.stop_pushButton.clicked.connect(self.stopPushButtonPressed) self.pause_pushButton.clicked.connect(self.pausePushButtonPressed) self.download_progressBar.setValue(0) self.after_frame.setEnabled(False) self.after_checkBox.toggled.connect(self.afterCheckBoxToggled) self.after_pushButton.clicked.connect(self.afterPushButtonPressed) # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) # speed limit self.limit_dial.setValue(10) self.limit_dial.sliderReleased.connect(self.limitDialIsReleased) self.limit_dial.valueChanged.connect(self.limitDialIsChanged) self.limit_label.setText('Speed : Maximum') self.after_comboBox.currentIndexChanged.connect(self.afterComboBoxChanged) if self.single_video_link: # hide pause and resume button # hide limit speed frame self.pause_pushButton.hide() self.resume_pushButton.hide() self.limit_frame.hide() # set window size and position size = self.persepolis_setting.value( 'ProgressWindow/size', QSize(617, 304)) position = self.persepolis_setting.value( 'ProgressWindow/position', QPoint(300, 300)) self.resize(size) self.move(position) # close window with ESC key def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.close() def closeEvent(self, event): # save window size and position self.persepolis_setting.setValue('ProgressWindow/size', self.size()) self.persepolis_setting.setValue('ProgressWindow/position', self.pos()) self.persepolis_setting.sync() self.hide() def resumePushButtonPressed(self, button): if self.status == "paused": # search gid in download_sessions_list for download_session_dict in self.main_window.download_sessions_list: if download_session_dict['gid'] == self.gid: # unpause download download_session_dict['download_session'].downloadUnpause() break def pausePushButtonPressed(self, button): if self.status == "downloading": # search gid in download_sessions_list for download_session_dict in self.main_window.download_sessions_list: if download_session_dict['gid'] == self.gid: # unpause download download_session_dict['download_session'].downloadPause() break def stopPushButtonPressed(self, button): dict = {'gid': self.gid, 'shutdown': 'canceled'} self.main_window.temp_db.updateSingleTable(dict) if self.status != "stopped": # search gid in download_sessions_list for download_session_dict in self.main_window.download_sessions_list: if download_session_dict['gid'] == self.gid: # stop download download_session_dict['download_session'].downloadStop() break def afterComboBoxChanged(self, connect): self.after_pushButton.setEnabled(True) def afterCheckBoxToggled(self, checkBoxes): if self.after_checkBox.isChecked(): self.after_frame.setEnabled(True) self.after_pushButton.setEnabled(True) else: # so user canceled shutdown after download # write cancel value in data_base for this gid self.after_frame.setEnabled(False) dict = {'gid': self.gid, 'shutdown': 'canceled'} self.main_window.temp_db.updateSingleTable(dict) def afterPushButtonPressed(self, button): self.after_pushButton.setEnabled(False) if os_type != OS.WINDOWS: # For Linux and Mac OSX and BSD # get root password passwd, ok = QInputDialog.getText( self, 'PassWord', 'Please enter root password:', QLineEdit.Password) if ok: # check password is true or not! pipe = subprocess.Popen(['sudo', '-S', 'echo', 'hello'], stdout=subprocess.DEVNULL, stdin=subprocess.PIPE, stderr=subprocess.DEVNULL, shell=False) pipe.communicate(passwd.encode()) answer = pipe.wait() # Wrong password while answer != 0: passwd, ok = QInputDialog.getText( self, 'PassWord', 'Wrong Password!\nPlease try again.', QLineEdit.Password) if ok: # checking password pipe = subprocess.Popen(['sudo', '-S', 'echo', 'hello'], stdout=subprocess.DEVNULL, stdin=subprocess.PIPE, stderr=subprocess.DEVNULL, shell=False) pipe.communicate(passwd.encode()) answer = pipe.wait() else: ok = False self.after_pushButton.setEnabled(True) break if ok is not False: # if user selects shutdown option after download progress, # value of 'shutdown' will changed in temp_db for this gid # and "wait" word will be written for this value. # (see ShutDownThread and shutdown.py for more information) # shutDown method will check that value in a loop . # when "wait" changes to "shutdown" then shutdown.py script # will shut down the system. shutdown_enable = ShutDownThread(self.main_window, self.gid, passwd) self.main_window.threadPool.append(shutdown_enable) self.main_window.threadPool[-1].start() else: self.after_checkBox.setChecked(False) else: self.after_checkBox.setChecked(False) else: # for Windows shutdown_enable = ShutDownThread(self.main_window, self.gid) self.main_window.threadPool.append(shutdown_enable) self.main_window.threadPool[-1].start() def limitDialIsReleased(self): limit_value = self.limit_dial.value() # set speed limit value for download_session_dict in self.main_window.download_sessions_list: if download_session_dict['gid'] == self.gid: # limit download speed download_session_dict['download_session'].limitSpeed(limit_value) break def limitDialIsChanged(self, button): if self.limit_dial.value() == 10: self.limit_label.setText('Speed : Maximum') elif self.limit_dial.value() == 0: self.limit_label.setText('Speed : Minimum') else: self.limit_label.setText('Speed') def changeIcon(self, icons): icons = ':/' + str(icons) + '/' self.resume_pushButton.setIcon(QIcon(icons + 'play')) self.pause_pushButton.setIcon(QIcon(icons + 'pause')) self.stop_pushButton.setIcon(QIcon(icons + 'stop')) ================================================ FILE: persepolis/scripts/properties.py ================================================ # -*- coding: utf-8 -*- # 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 . try: from PySide6.QtCore import Qt, QSize, QPoint, QDir, QTime, QCoreApplication from PySide6.QtWidgets import QLabel, QLineEdit, QFileDialog from PySide6.QtGui import QIcon except ImportError: from PyQt5.QtCore import Qt, QSize, QPoint, QDir, QTime, QCoreApplication from PyQt5.QtWidgets import QLabel, QLineEdit, QFileDialog from PyQt5.QtGui import QIcon from persepolis.gui.addlink_ui import AddLinkWindow_Ui from persepolis.scripts.check_proxy import getProxy import os class PropertiesWindow(AddLinkWindow_Ui): def __init__(self, parent, callback, gid, persepolis_setting, video_finder_dictionary=None): super().__init__(persepolis_setting) self.parent = parent self.persepolis_setting = persepolis_setting self.video_finder_dictionary = video_finder_dictionary self.download_later_pushButton.hide() # hide download_later_pushButton self.change_name_checkBox.hide() # hide change_name_checkBox self.change_name_lineEdit.hide() # hide change_name_lineEdit # add new QLineEdit and QLineEdit for audio link if we have video finder links if self.video_finder_dictionary: self.link_label_2 = QLabel(self.link_frame) self.link_horizontalLayout.addWidget(self.link_label_2) self.link_lineEdit_2 = QLineEdit(self.link_frame) self.link_horizontalLayout.addWidget(self.link_lineEdit_2) self.link_lineEdit_2.textChanged.connect(self.linkLineChanged) self.link_label.setText(QCoreApplication.translate("addlink_ui_tr", "Video Link: ")) self.link_label_2.setText(QCoreApplication.translate("addlink_ui_tr", "Audio Link: ")) # gid_1 >> video_gid , gid_2 >> audio_gid self.gid_1 = self.video_finder_dictionary['video_gid'] self.gid_2 = self.video_finder_dictionary['audio_gid'] else: self.gid_1 = gid self.callback = callback # detect_proxy_pushButton self.detect_proxy_pushButton.clicked.connect( self.detectProxy) # connect folder_pushButton self.folder_pushButton.clicked.connect(self.changeFolder) self.download_folder_lineEdit.setEnabled(False) self.ok_pushButton.setEnabled(False) self.link_lineEdit.textChanged.connect(self.linkLineChanged) # connect OK and cancel button self.cancel_pushButton.clicked.connect(self.close) self.ok_pushButton.clicked.connect(self.okButtonPressed) # frames and checkBoxes self.proxy_frame.setEnabled(False) self.proxy_checkBox.toggled.connect(self.proxyFrame) self.download_frame.setEnabled(False) self.download_checkBox.toggled.connect(self.downloadFrame) self.start_frame.setEnabled(False) self.start_checkBox.toggled.connect(self.startFrame) self.end_frame.setEnabled(False) self.end_checkBox.toggled.connect(self.endFrame) # get information from data base self.add_link_dictionary_1 = self.parent.persepolis_db.searchGidInAddLinkTable(self.gid_1) self.download_table_dict_1 = self.parent.persepolis_db.searchGidInDownloadTable(self.gid_1) if video_finder_dictionary: self.add_link_dictionary_2 = self.parent.persepolis_db.searchGidInAddLinkTable(self.gid_2) self.download_table_dict_2 = self.parent.persepolis_db.searchGidInDownloadTable(self.gid_2) # create a copy from add_link_dictionary for checking changes finally! self.add_link_dictionary_1_backup = {} for key in self.add_link_dictionary_1.keys(): self.add_link_dictionary_1_backup[key] = self.add_link_dictionary_1[key] if video_finder_dictionary: self.add_link_dictionary_2_backup = {} for key in self.add_link_dictionary_2.keys(): self.add_link_dictionary_2_backup[key] = self.add_link_dictionary_2[key] # initialization # disable folder_frame when download is complete if self.video_finder_dictionary: if self.video_finder_dictionary['video_completed'] == 'yes' or self.video_finder_dictionary['audio_completed'] == 'yes': self.folder_frame.setEnabled(False) else: if self.download_table_dict_1['status'] == 'complete': self.folder_frame.setEnabled(False) # link self.link_lineEdit.setText(self.add_link_dictionary_1['link']) if self.video_finder_dictionary: self.link_lineEdit_2.setText(self.add_link_dictionary_2['link']) # ip_lineEdit initialization if self.add_link_dictionary_1['ip']: self.proxy_checkBox.setChecked(True) self.ip_lineEdit.setText(self.add_link_dictionary_1['ip']) # port_spinBox initialization try: self.port_spinBox.setValue( int(self.add_link_dictionary_1['port'])) except Exception: pass # proxy user lineEdit initialization try: self.proxy_user_lineEdit.setText( self.add_link_dictionary_1['proxy_user']) except Exception: pass # proxy pass lineEdit initialization try: self.proxy_pass_lineEdit.setText( self.add_link_dictionary_1['proxy_passwd']) except Exception: pass # proxy type proxy_type = self.add_link_dictionary_1['proxy_type'] # default is http if proxy_type == 'socks5': self.socks5_radioButton.setChecked(True) elif proxy_type == 'https': self.https_radioButton.setChecked(True) else: self.http_radioButton.setChecked(True) # download UserName initialization if self.add_link_dictionary_1['download_user']: self.download_checkBox.setChecked(True) self.download_user_lineEdit.setText( self.add_link_dictionary_1['download_user']) # download PassWord initialization try: self.download_pass_lineEdit.setText( self.add_link_dictionary_1['download_passwd']) except Exception: pass # folder_path try: self.download_folder_lineEdit.setText( self.add_link_dictionary_1['download_path']) except Exception: pass # connections try: self.connections_spinBox.setValue( int(self.add_link_dictionary_1['connections'])) except Exception: pass # get categories name and add them to add_queue_comboBox categories_list = self.parent.persepolis_db.categoriesList() for queue in categories_list: if queue != 'All Downloads': self.add_queue_comboBox.addItem(queue) # finding current queue and setting it! self.current_category = self.download_table_dict_1['category'] current_category_index = self.add_queue_comboBox.findText( self.current_category) self.add_queue_comboBox.setCurrentIndex(current_category_index) # add_queue_comboBox event self.add_queue_comboBox.currentIndexChanged.connect(self.queueChanged) # start_time if self.add_link_dictionary_1['start_time']: # get hour and minute hour, minute = self.add_link_dictionary_1['start_time'].split(':') # set time q_time = QTime(int(hour), int(minute)) self.start_time_qDataTimeEdit.setTime(q_time) self.start_checkBox.setChecked(True) # end_time if self.add_link_dictionary_1['end_time']: # get hour and minute hour, minute = self.add_link_dictionary_1['end_time'].split(':') # set time q_time = QTime(int(hour), int(minute)) self.end_time_qDateTimeEdit.setTime(q_time) self.end_checkBox.setChecked(True) # referer if self.add_link_dictionary_1['referer']: self.referer_lineEdit.setText(str(self.add_link_dictionary_1['referer'])) if self.add_link_dictionary_1['header']: self.header_lineEdit.setText(str(self.add_link_dictionary_1['header'])) if self.add_link_dictionary_1['user_agent']: self.user_agent_lineEdit.setText(str(self.add_link_dictionary_1['user_agent'])) if self.add_link_dictionary_1['load_cookies']: self.load_cookies_lineEdit.setText((self.add_link_dictionary_1['load_cookies'])) # set window size and position size = self.persepolis_setting.value( 'PropertiesWindow/size', QSize(520, 425)) position = self.persepolis_setting.value( 'PropertiesWindow/position', QPoint(300, 300)) self.resize(size) self.move(position) # detect system proxy setting, and set ip_lineEdit and port_spinBox def detectProxy(self, button): # get system proxy information system_proxy_dict = getProxy() enable_proxy_frame = False # ip if 'http_proxy_ip' in system_proxy_dict.keys(): self.ip_lineEdit.setText(str(system_proxy_dict['http_proxy_ip'])) enable_proxy_frame = True # port if 'http_proxy_port' in system_proxy_dict.keys(): self.port_spinBox.setValue(int(system_proxy_dict['http_proxy_port'])) enable_proxy_frame = True # enable proxy frame if http_proxy_ip or http_proxy_port is valid. if enable_proxy_frame: self.proxy_checkBox.setChecked(True) self.detect_proxy_label.setText('') else: self.proxy_checkBox.setChecked(False) self.detect_proxy_label.setText('No proxy detected!') # activate frames if checkBoxes checked def proxyFrame(self, checkBox): if self.proxy_checkBox.isChecked(): self.proxy_frame.setEnabled(True) else: self.proxy_frame.setEnabled(False) def downloadFrame(self, checkBox): if self.download_checkBox.isChecked(): self.download_frame.setEnabled(True) else: self.download_frame.setEnabled(False) def startFrame(self, checkBox): if self.start_checkBox.isChecked(): self.start_frame.setEnabled(True) else: self.start_frame.setEnabled(False) def endFrame(self, checkBox): if self.end_checkBox.isChecked(): self.end_frame.setEnabled(True) else: self.end_frame.setEnabled(False) def changeFolder(self, button): fname = QFileDialog.getExistingDirectory(self, 'Open f', '/home') if fname: # Returns pathName with the '/' separators converted to separators that are appropriate for the underlying operating system. # On Windows, toNativeSeparators("c:/winnt/system32") returns # "c:\winnt\system32". fname = QDir.toNativeSeparators(fname) if os.path.isdir(fname): self.download_folder_lineEdit.setText(fname) def linkLineChanged(self, lineEdit): if str(self.link_lineEdit.text()) == '': self.ok_pushButton.setEnabled(False) else: self.ok_pushButton.setEnabled(True) def queueChanged(self, combo): # if one of the queues selected by user , start time and end time must # be deactivated if self.add_queue_comboBox.currentIndex() != 0: self.start_checkBox.setCheckState(Qt.Unchecked) self.start_checkBox.setEnabled(False) self.end_checkBox.setCheckState(Qt.Unchecked) self.end_checkBox.setEnabled(False) else: self.start_checkBox.setEnabled(True) self.end_checkBox.setEnabled(True) # this method returns proxy information. def getProxyInformation(self): # http, https or socks5 proxy if self.http_radioButton.isChecked() is True: proxy_type = 'http' elif self.https_radioButton.isChecked() is True: proxy_type = 'https' else: proxy_type = 'socks5' # get proxy information if not (self.proxy_checkBox.isChecked()): ip = None port = None proxy_user = None proxy_passwd = None proxy_type = None else: ip = self.ip_lineEdit.text() if not (ip): ip = None port = self.port_spinBox.value() if not (port): port = None proxy_user = self.proxy_user_lineEdit.text() if not (proxy_user): proxy_user = None proxy_passwd = self.proxy_pass_lineEdit.text() if not (proxy_passwd): proxy_passwd = None return ip, port, proxy_user, proxy_passwd, proxy_type def getUserPass(self): # get download username and password information if not (self.download_checkBox.isChecked()): download_user = None download_passwd = None else: download_user = self.download_user_lineEdit.text() if not (download_user): download_user = None download_passwd = self.download_pass_lineEdit.text() if not (download_passwd): download_passwd = None return download_user, download_passwd def getAdditionalInformation(self): # referer if self.referer_lineEdit.text() != '': referer = self.referer_lineEdit.text() else: referer = None # header if self.header_lineEdit.text() != '': header = self.header_lineEdit.text() else: header = None # user_agent if self.user_agent_lineEdit.text() != '': user_agent = self.user_agent_lineEdit.text() else: user_agent = None # load_cookies if self.load_cookies_lineEdit.text() != '': load_cookies = self.load_cookies_lineEdit.text() else: load_cookies = None return referer, header, user_agent, load_cookies def okButtonPressed(self, button): # write user's new inputs in persepolis_setting for next time if needed if self.folder_checkBox.isChecked() is True: self.persepolis_setting.setValue( 'settings/download_path', self.download_folder_lineEdit.text()) # get proxy information ip, port, proxy_user, proxy_passwd, proxy_type = self.getProxyInformation() if proxy_type is not None: self.persepolis_setting.setValue('add_link_initialization/proxy_type', proxy_type) # get download username and password information download_user, download_passwd = self.getUserPass() if not (self.start_checkBox.isChecked()): start_time = None else: start_time = self.start_time_qDataTimeEdit.text() if not (self.end_checkBox.isChecked()): end_time = None else: end_time = self.end_time_qDateTimeEdit.text() connections = self.connections_spinBox.value() download_path = self.download_folder_lineEdit.text() # get additinal information referer, header, user_agent, load_cookies = self.getAdditionalInformation() self.add_link_dictionary_1['start_time'] = start_time self.add_link_dictionary_1['end_time'] = end_time self.add_link_dictionary_1['link'] = self.link_lineEdit.text() self.add_link_dictionary_1['ip'] = ip self.add_link_dictionary_1['port'] = port self.add_link_dictionary_1['proxy_user'] = proxy_user self.add_link_dictionary_1['proxy_passwd'] = proxy_passwd self.add_link_dictionary_1['proxy_type'] = proxy_type self.add_link_dictionary_1['download_user'] = download_user self.add_link_dictionary_1['download_passwd'] = download_passwd self.add_link_dictionary_1['download_path'] = download_path self.add_link_dictionary_1['connections'] = connections self.add_link_dictionary_1['referer'] = referer self.add_link_dictionary_1['header'] = header self.add_link_dictionary_1['user_agent'] = user_agent self.add_link_dictionary_1['load_cookies'] = load_cookies if self.video_finder_dictionary: self.add_link_dictionary_2['start_time'] = start_time self.add_link_dictionary_2['end_time'] = end_time self.add_link_dictionary_2['link'] = self.link_lineEdit_2.text() self.add_link_dictionary_2['ip'] = ip self.add_link_dictionary_2['port'] = port self.add_link_dictionary_2['proxy_user'] = proxy_user self.add_link_dictionary_2['proxy_passwd'] = proxy_passwd self.add_link_dictionary_2['proxy_type'] = proxy_type self.add_link_dictionary_2['download_user'] = download_user self.add_link_dictionary_2['download_passwd'] = download_passwd self.add_link_dictionary_2['download_path'] = download_path self.add_link_dictionary_2['connections'] = connections self.add_link_dictionary_2['referer'] = referer self.add_link_dictionary_2['header'] = header self.add_link_dictionary_2['user_agent'] = user_agent self.add_link_dictionary_2['load_cookies'] = load_cookies new_category = str(self.add_queue_comboBox.currentText()) # it means category changed and data base must be updated. if new_category != self.current_category: self.download_table_dict_1['category'] = new_category # update data base self.parent.persepolis_db.updateDownloadTable([self.download_table_dict_1]) # update category_db_table # remove download item from old category old_category_dict = self.parent.persepolis_db.searchCategoryInCategoryTable(self.current_category) old_category_gid_list = old_category_dict['gid_list'] old_category_gid_list.remove(self.gid_1) self.parent.persepolis_db.updateCategoryTable([old_category_dict]) # add download item to new category new_category_dict = self.parent.persepolis_db.searchCategoryInCategoryTable(new_category) new_category_gid_list = new_category_dict['gid_list'] new_category_gid_list.append(self.gid_1) self.parent.persepolis_db.updateCategoryTable([new_category_dict]) if self.video_finder_dictionary: # category for audio and video must be same as each other self.download_table_dict_2['category'] = new_category self.parent.persepolis_db.updateDownloadTable([self.download_table_dict_2]) # update category_db_table # remove download item from old category old_category_dict = self.parent.persepolis_db.searchCategoryInCategoryTable(self.current_category) old_category_gid_list = old_category_dict['gid_list'] old_category_gid_list.remove(self.gid_2) self.parent.persepolis_db.updateCategoryTable([old_category_dict]) # add download item to new category new_category_dict = self.parent.persepolis_db.searchCategoryInCategoryTable(new_category) new_category_gid_list = new_category_dict['gid_list'] new_category_gid_list.append(self.gid_2) self.parent.persepolis_db.updateCategoryTable([new_category_dict]) # if any thing in add_link_dictionary_1 is changed,then update data base! for key in self.add_link_dictionary_1.keys(): if self.add_link_dictionary_1[key] != self.add_link_dictionary_1_backup[key]: # update data base self.parent.persepolis_db.updateAddLinkTable([self.add_link_dictionary_1]) # break the loop break # if link changed, then update download_db_table in data base if self.add_link_dictionary_1['link'] != self.add_link_dictionary_1_backup['link']: dictionary = {'gid': self.gid_1, 'link': self.add_link_dictionary_1['link']} self.parent.persepolis_db.updateDownloadTable([dictionary]) # if any thing in add_link_dictionary_2 is changed,then update data base! if self.video_finder_dictionary: for key in self.add_link_dictionary_2.keys(): if self.add_link_dictionary_2[key] != self.add_link_dictionary_2_backup[key]: # update data base self.parent.persepolis_db.updateAddLinkTable([self.add_link_dictionary_2]) # break the loop break # if link changed, then update download_db_table in data base if self.add_link_dictionary_2['link'] != self.add_link_dictionary_2_backup['link']: dictionary = {'gid': self.gid_2, 'link': self.add_link_dictionary_2['link']} self.parent.persepolis_db.updateDownloadTable([dictionary]) # if download_path was changed, then update video_finder_db_table in data base if self.add_link_dictionary_1['download_path'] != self.add_link_dictionary_1_backup['download_path']: dictionary = {'video_gid': self.gid_1, 'download_path': download_path} self.parent.persepolis_db.updateVideoFinderTable[dictionary] # callback to mainwindow self.callback(self.add_link_dictionary_1, self.gid_1, new_category, self.video_finder_dictionary) # close window self.close() # close window with ESC key def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.close() def closeEvent(self, event): # save window size and position self.persepolis_setting.setValue('PropertiesWindow/size', self.size()) self.persepolis_setting.setValue( 'PropertiesWindow/position', self.pos()) self.persepolis_setting.sync() event.accept() def changeIcon(self, icons): icons = ':/' + str(icons) + '/' self.folder_pushButton.setIcon(QIcon(icons + 'folder')) self.download_later_pushButton.setIcon(QIcon(icons + 'stop')) self.cancel_pushButton.setIcon(QIcon(icons + 'remove')) self.ok_pushButton.setIcon(QIcon(icons + 'ok')) ================================================ FILE: persepolis/scripts/queue.py ================================================ # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import time from time import sleep from persepolis.scripts import logger from persepolis.scripts import persepolis_lib_prime from persepolis.scripts.video_finder import VideoFinder from persepolis.scripts.download_link import DownloadLink try: from PySide6.QtCore import QThread, Signal, QCoreApplication except ImportError: from PyQt5.QtCore import QThread, QCoreApplication from PyQt5.QtCore import pyqtSignal as Signal try: from persepolis.scripts import ytdlp_downloader except ModuleNotFoundError: # if youtube_dl module is not installed: logger.sendToLog( "yt-dlp is not installed.", "ERROR") # this thread is managing queue class Queue(QThread): # this signal emitted when download status of queue changes to stop REFRESHTOOLBARSIGNAL = Signal(str) NOTIFYSENDSIGNAL = Signal(list) def __init__(self, category, start_time, end_time, parent): QThread.__init__(self) self.category = str(category) self.main_window = parent self.start_time = start_time self.end_time = end_time def run(self): self.start = True self.stop = False self.limit_changed = False self.after = False self.break_for_loop = False queue_counter = 0 # this list contains gid_list of all active video finder in queue. video_finder_list = [] # queue repeats 5 times! # and every time loads queue list again! # It is helps for checking new downloads in queue # and retrying for failed downloads. for counter in range(5): # read downloads information from data base download_table_dict = self.main_window.persepolis_db.returnItemsInDownloadTable(self.category) category_table_dict = self.main_window.persepolis_db.searchCategoryInCategoryTable(self.category) gid_list = category_table_dict['gid_list'] # sort downloads top to the bottom of the list OR bottom to the top if not (self.main_window.reverse_checkBox.isChecked()): gid_list.reverse() # check that if user set start time if self.start_time and counter == 0: # find first download # set start time for first download in queue # status of first download must not be complete for gid in gid_list: # get download information dictionary dictionary = download_table_dict[gid] # find status of download status = dictionary['status'] if status != 'complete': # We find first item! GREAT! add_link_dict = {'gid': gid} # set start_time for this download add_link_dict['start_time'] = self.start_time # write changes in data base self.main_window.persepolis_db.updateAddLinkTable([add_link_dict]) # delete add_link_dict del add_link_dict # job is done! break the loop break for gid in gid_list: # if gid is related to video finder, so start Video Finder thread for checking status # check video_finder_threads_dict, perhaps a thread started before for this gid if (gid in self.main_window.all_video_finder_gid_list): video_finder_link = True video_finder_dictionary = self.main_window.persepolis_db.searchGidInVideoFinderTable(gid) if video_finder_dictionary['video_gid'] not in self.main_window.video_finder_threads_dict.keys(): # start new video finder thread video_finder_gid_list = [video_finder_dictionary['video_gid'], video_finder_dictionary['audio_gid']] new_video_finder = VideoFinder(video_finder_dictionary, self.main_window) self.main_window.threadPool.append(new_video_finder) self.main_window.threadPool[-1].start() self.main_window.threadPool[-1].VIDEOFINDERCOMPLETED.connect(self.main_window.videoFinderCompleted) # add thread to video_finder_threads_dict self.main_window.video_finder_threads_dict[video_finder_dictionary['video_gid']] = new_video_finder video_finder_list.append(video_finder_gid_list) else: video_finder_link = False add_link_dict = {'gid': gid} # find download information dictionary = download_table_dict[gid] # if download was completed, continue the loop # with the next iteration of the loop! # We don't want to download it two times :) if dictionary['status'] == 'complete': continue queue_counter = queue_counter + 1 # change status of download to waiting status = 'waiting' dictionary['status'] = status if self.end_time: # it means user was set end time for download # set end_hour and end_minute add_link_dict['end_time'] = self.end_time # user can set sleep time between download items in queue. # see preferences window! # find wait_queue value wait_queue_list = self.main_window.persepolis_setting.value('settings/wait-queue') wait_queue_hour = int(wait_queue_list[0]) wait_queue_minute = int(wait_queue_list[1]) # check if user set sleep time between downloads in queue in setting window. # if queue_counter is 1 , it means we are in the first download item in queue. # and no need to wait for first item. if (wait_queue_hour != 0 or wait_queue_minute != 0) and queue_counter != 1: now_time_hour = int(time.strftime("%H")) now_time_minute = int(time.strftime("%M")) now_time_second = int(time.strftime("%S")) # add extra minute if we are in second half of minute if now_time_second > 30: now_time_minute = now_time_minute + 1 # hour value can not be more than 23 and minute value can not be more than 59. sigma_minute = wait_queue_minute + now_time_minute sigma_hour = wait_queue_hour + now_time_hour if sigma_minute > 59: sigma_minute = sigma_minute - 60 sigma_hour = sigma_hour + 1 if sigma_hour > 23: sigma_hour = sigma_hour - 24 # setting sigma_hour and sigma_minute for download's start time! add_link_dict['start_time'] = str(sigma_hour) + ':' + str(sigma_minute) # write changes in data base self.main_window.persepolis_db.updateAddLinkTable([add_link_dict]) add_link_dict = self.main_window.persepolis_db.searchGidInAddLinkTable(gid) if video_finder_link: # create video download_session download_session = ytdlp_downloader.Ytdp_Download(add_link_dict, self.main_window, gid) else: # create download_session # check if it's single_video_link or not answer_dictionary = self.main_window.persepolis_db.searchGidInVideoFinderTable2(gid) if answer_dictionary is not None: single_video_link = True else: single_video_link = False if not (single_video_link): download_session = persepolis_lib_prime.Download(add_link_dict, self.main_window, gid) # check limit speed value download_session.limitSpeed(self.main_window.limit_dial.value()) else: download_session = ytdlp_downloader.Ytdp_Download(add_link_dict, self.main_window, gid, single_video_link=True) # add gid to single_video_link_gid_list self.main_window.single_video_link_gid_list.append(gid) # add download_session and gid to download_session_dict download_session_dict = {'gid': gid, 'download_session': download_session} # append download_session_dict to download_sessions_list self.main_window.download_sessions_list.append(download_session_dict) # strat download in thread new_download = DownloadLink(gid, download_session, self.main_window) self.main_window.threadPool.append(new_download) self.main_window.threadPool[-1].start() # delete add_link_dict del add_link_dict sleep(3) # continue loop until download has finished while status == 'downloading' or status == 'waiting' or status == 'paused' or status == 'scheduled': sleep(1) dictionary = self.main_window.persepolis_db.searchGidInDownloadTable(gid) status = dictionary['status'] if status == 'error': error = 'error' # write error_message in log file error_message = 'Download failed - GID : '\ + str(gid)\ + '- Message : '\ + error logger.sendToLog(error_message, 'DOWNLOAD ERROR') elif status == 'complete': complete_message = 'Download complete - GID : '\ + str(gid) # write in log the complete_message logger.sendToLog(complete_message, 'DOWNLOADS') # check that is this related to video finder thread or not. if gid in self.main_window.all_video_finder_gid_list: # find related thread for list in video_finder_list: if gid in list: video_gid = list[0] if video_gid in self.main_window.video_finder_threads_dict: video_finder_thread = self.main_window.video_finder_threads_dict[video_gid] # check the video and audio and muxing_status if video_finder_thread.video_completed == 'yes' and video_finder_thread.audio_completed == 'yes': # wait until end of muxing while video_finder_thread.active == 'yes': sleep(0.5) break if self.stop: # it means user stopped queue # search gid in download_sessions_list for download_session_dict in self.main_window.download_sessions_list: if download_session_dict['gid'] == gid: # stop download download_session_dict['download_session'].downloadStop() break if status == 'downloading' and self.limit_changed: # It means user want to limit download speed # get limitation value limit_value = self.main_window.limit_dial.value() # apply limitation for download_session_dict in self.main_window.download_sessions_list: if download_session_dict['gid'] == gid: download_session_dict['download_session'].limitSpeed(limit_value) break # done! self.limit_changed = False # it means queue stopped at end time or user stopped queue if status == 'stopped': for video_finder_gid_list in video_finder_list: video_gid = video_finder_gid_list[0] video_finder_dictionary = self.main_window.persepolis_db.searchGidInVideoFinderTable(video_gid) if video_finder_dictionary: # tell video finder thread to stop checking if video_finder_dictionary['video_completed'] == 'no' or video_finder_dictionary['audio_completed'] == 'no': video_finder_dictionary['checking'] = 'no' self.main_window.persepolis_db.updateVideoFinderTable([video_finder_dictionary]) video_finder_thread = self.main_window.video_finder_threads_dict[video_gid] video_finder_thread.checking = 'no' elif not (self.stop) and self.after and video_finder_dictionary['muxing_status'] == 'started': # downloads were completed and video finder started Muxing # wait until the end of muxing # don't turn of the computer. # video finder will be deleted from data base when muxing ended. # so check data base every second video_finder_thread = self.main_window.video_finder_threads_dict[video_finder_dictionary['video_gid']] while video_finder_thread.active == 'yes': sleep(1) if self.stop and self.after: # It means user activated shutdown before and now user # stopped queue . so after download must be canceled self.main_window.after_checkBox.setChecked(False) self.stop = True self.limit_changed = False # it means that break outer "for" loop self.break_for_loop = True if str(self.main_window.category_tree.currentIndex().data()) == str(self.category): self.REFRESHTOOLBARSIGNAL.emit(self.category) # show notification self.NOTIFYSENDSIGNAL.emit([QCoreApplication.translate("mainwindow_src_ui_tr", "Persepolis"), QCoreApplication.translate("mainwindow_src_ui_tr", "Queue Stopped!"), 10000, 'no']) # write message in log logger.sendToLog('Queue stopped', 'DOWNLOADS') break if self.break_for_loop: break if self.start: # if queue finished : self.start = False # this section is sending shutdown signal to the shutdown script(if user # select shutdown for after download) if self.after: # write 'shutdown' value for this category in temp_db shutdown_dict = {'category': self.category, 'shutdown': 'shutdown'} self.main_window.temp_db.updateQueueTable(shutdown_dict) # show a notification about system is shutting down now! self.NOTIFYSENDSIGNAL.emit([QCoreApplication.translate("mainwindow_src_ui_tr", 'Persepolis is shutting down'), QCoreApplication.translate("mainwindow_src_ui_tr", 'your system in 20 seconds'), 15000, 'warning']) # show notification for queue completion self.NOTIFYSENDSIGNAL.emit([QCoreApplication.translate("mainwindow_src_ui_tr", "Persepolis"), QCoreApplication.translate("mainwindow_src_ui_tr", 'Queue completed!'), 10000, 'queue']) # write a message in log logger.sendToLog('Queue completed', 'DOWNLOADS') self.stop = True self.limit_changed = False self.after = False if str(self.main_window.category_tree.currentIndex().data()) == str(self.category): self.REFRESHTOOLBARSIGNAL.emit(self.category) ================================================ FILE: persepolis/scripts/queue_prime.py ================================================ # -*- coding: utf-8 -*- # 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 . from time import sleep from persepolis.scripts import logger from persepolis.scripts.bubble import notifySend from persepolis.scripts import persepolis_lib_prime from persepolis.scripts.video_finder import VideoFinder from persepolis.scripts.download_link import DownloadLink try: from PySide6.QtCore import QThread, Signal, QCoreApplication except ImportError: from PyQt5.QtCore import QThread, QCoreApplication from PyQt5.QtCore import pyqtSignal as Signal try: from persepolis.scripts import ytdlp_downloader except ModuleNotFoundError: # if youtube_dl module is not installed: logger.sendToLog( "yt-dlp is not installed.", "ERROR") class Queue(): def __init__(self, queue_dict, main_window): self.queue_name = queue_dict['category'] self.start_time_enable = queue_dict['start_time_enable'] self.start_time = queue_dict['start_time'] self.end_time_enable = queue_dict['end_time_enable'] self.end_time = queue_dict['end_time'] self.reverse = queue_dict['reverse'] self.limit_enable = queue_dict['limit_enable'] self.limit_value = queue_dict['limit_value'] self.after_download = queue_dict['after_download'] self.gid_list = queue_dict['gid_list'] self.main_window = main_window def start(self):... ================================================ FILE: persepolis/scripts/setting.py ================================================ # -*- coding: utf-8 -*- # 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 . try: from PySide6.QtCore import Qt, QEvent, QTime, QSize, QPoint, QDir, QTranslator, QCoreApplication, QLocale from PySide6.QtWidgets import QFileDialog, QStyleFactory, QMessageBox, QTableWidgetItem from PySide6.QtGui import QFont, QKeySequence except ImportError: from PyQt5.QtCore import Qt, QEvent, QTime, QSize, QPoint, QDir, QTranslator, QCoreApplication, QLocale from PyQt5.QtWidgets import QFileDialog, QStyleFactory, QMessageBox, QTableWidgetItem from PyQt5.QtGui import QFont, QKeySequence from persepolis.constants import OS from persepolis.gui.setting_ui import Setting_Ui, KeyCapturingWindow_Ui from persepolis.scripts.useful_tools import returnDefaultSettings, getExecPath from persepolis.scripts.browser_integration import browserIntegration, browserIsolation from persepolis.scripts import osCommands from persepolis.scripts import startup from persepolis.scripts import logger import platform import os home_address = os.path.expanduser("~") os_type = platform.system() class KeyCapturingWindow(KeyCapturingWindow_Ui): def __init__(self, callback, persepolis_setting): super().__init__(persepolis_setting) self.persepolis_setting = persepolis_setting self.callback = callback self.ok_pushButton.clicked.connect(self.okPushButtonPressed) self.cancel_pushButton.clicked.connect(self.close) self.installEventFilter(self) def eventFilter(self, source, event): if event.type() == QEvent.KeyPress: if event.key(): # show new keys in window self.capturedKeyLabel.setText(str(QKeySequence(event.modifiers() | event.key()).toString())) return super(KeyCapturingWindow, self).eventFilter(source, event) def okPushButtonPressed(self, button): # return new keys self.callback(self.capturedKeyLabel.text()) self.close() def closeEvent(self, event): event.accept() class PreferencesWindow(Setting_Ui): def __init__(self, parent, persepolis_setting): super().__init__(persepolis_setting) self.persepolis_setting = persepolis_setting self.parent = parent self.grandparent = parent.persepolis_main self.persepolis_setting.beginGroup('settings') # initialization self.tries_spinBox.setValue( int(self.persepolis_setting.value('max-tries'))) self.chunk_size_spinBox.setValue( int(self.persepolis_setting.value('chunk-size'))) self.wait_spinBox.setValue( int(self.persepolis_setting.value('retry-wait'))) self.time_out_spinBox.setValue( int(self.persepolis_setting.value('timeout'))) self.connections_spinBox.setValue( int(self.persepolis_setting.value('connections'))) # check certificate if str(self.persepolis_setting.value('dont-check-certificate')) == 'yes': self.dont_check_certificate_checkBox.setChecked(True) else: self.dont_check_certificate_checkBox.setChecked(False) # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) # wait_queue wait_queue_list = self.persepolis_setting.value('wait-queue') try: q_time = QTime(int(wait_queue_list[0]), int(wait_queue_list[1])) except Exception: q_time = QTime(0, 0) self.wait_queue_time.setTime(q_time) # save_as_tab self.download_folder_lineEdit.setText( str(self.persepolis_setting.value('download_path'))) # subfolder if str(self.persepolis_setting.value('subfolder')) == 'yes': self.subfolder_checkBox.setChecked(True) else: self.subfolder_checkBox.setChecked(False) # notifications_tab self.volume_label.setText( 'Volume : ' + str(self.persepolis_setting.value('sound-volume'))) self.volume_dial.setValue( int(self.persepolis_setting.value('sound-volume'))) # set style # find available styles(It's depends on operating system and desktop environments). available_styles = QStyleFactory.keys() for style in available_styles: # 'bb10dark', 'GTK', 'gtk' styles may cause to crashing! Eliminate them! style_black_list = ['bb10dark', 'bb10bright', 'GTK', 'gtk', 'gtk2'] if style not in style_black_list: self.style_comboBox.addItem(style) # System >> for system default style # when user select System for style section, the default system style is using. self.style_comboBox.addItem('System') current_style_index = self.style_comboBox.findText( str(self.persepolis_setting.value('style'))) # If style not found, set style to Fusion if current_style_index == -1: current_style_index = self.style_comboBox.findText('Fusion') self.style_comboBox.setCurrentIndex(current_style_index) # available language available_language = ['en_US', 'fa_IR', 'ar', 'es_ES', 'fr_FR', 'ko', 'pl_PL', 'pt', 'ru', 'tr', 'zh_CN', 'de', 'hu', 'nl_NL', 'pt_BR', 'sv', 'tr_TR', 'zh_TW'] for lang in available_language: self.lang_comboBox.addItem(str(QLocale(lang).nativeLanguageName()), lang) current_locale = self.lang_comboBox.findData( str(self.persepolis_setting.value('locale'))) self.lang_comboBox.setCurrentIndex(current_locale) self.current_icon = self.persepolis_setting.value('icons') # icon size size = ['128', '64', '48', '32', '24', '16'] self.icons_size_comboBox.addItems(size) current_icons_size_index = self.icons_size_comboBox.findText( str(self.persepolis_setting.value('toolbar_icon_size'))) self.icons_size_comboBox.setCurrentIndex(current_icons_size_index) # call setDarkLightIcon if index is changed self.icons_size_comboBox.currentIndexChanged.connect(self.setDarkLightIcon) # set notification notifications = ['Native notification', 'QT notification'] self.notification_comboBox.addItems(notifications) exec_dict = getExecPath() is_bundle = exec_dict['bundle'] # If Persepolis does not run as a bundle on Linux(Only Linux), it can use the native notification system. if (os_type not in OS.UNIX_LIKE) or (os_type in OS.UNIX_LIKE and is_bundle): self.notification_comboBox.hide() self.notification_label.hide() current_notification_index = self.notification_comboBox.findText('QT notification') else: current_notification_index = self.notification_comboBox.findText( str(self.persepolis_setting.value('notification'))) self.notification_comboBox.setCurrentIndex(current_notification_index) # set font font_setting = QFont() font_setting.setFamily(str(self.persepolis_setting.value('font'))) self.fontComboBox.setCurrentFont(font_setting) self.font_size_spinBox.setValue( int(self.persepolis_setting.value('font-size'))) # sound frame self.sound_frame.setEnabled(False) self.enable_notifications_checkBox.toggled.connect(self.soundFrame) if str(self.persepolis_setting.value('sound')) == 'yes': self.enable_notifications_checkBox.setChecked(True) else: self.enable_notifications_checkBox.setChecked(False) # connect folder buttons self.download_folder_lineEdit.setEnabled(False) self.download_folder_pushButton.clicked.connect( self.downloadFolderPushButtonClicked) # dial self.volume_dial.setNotchesVisible(True) self.volume_dial.valueChanged.connect(self.dialChanged) # start_persepolis_if_browser_executed_checkBox if str(self.persepolis_setting.value('browser-persepolis')) == 'yes': self.start_persepolis_if_browser_executed_checkBox.setChecked(True) else: self.start_persepolis_if_browser_executed_checkBox.setChecked(False) # hide window if str(self.persepolis_setting.value('hide-window')) == 'yes': self.hide_window_checkBox.setChecked(True) else: self.hide_window_checkBox.setChecked(False) # tray icon if str(self.persepolis_setting.value('tray-icon')) == 'yes': self.enable_system_tray_checkBox.setChecked(True) else: self.enable_notifications_checkBox.setChecked(False) # show_menubar if str(self.persepolis_setting.value('show-menubar')) == 'yes': self.show_menubar_checkbox.setChecked(True) else: self.show_menubar_checkbox.setChecked(False) if platform.system() == 'Darwin': self.show_menubar_checkbox.setChecked(True) self.show_menubar_checkbox.hide() # show_sidepanel if str(self.persepolis_setting.value('show-sidepanel')) == 'yes': self.show_sidepanel_checkbox.setChecked(True) else: self.show_sidepanel_checkbox.setChecked(False) # show ProgressWindow if str(self.persepolis_setting.value('show-progress')) == 'yes': self.show_progress_window_checkbox.setChecked(True) else: self.show_progress_window_checkbox.setChecked(False) # after download dialog if str(self.persepolis_setting.value('after-dialog')) == 'yes': self.after_download_checkBox.setChecked(True) else: self.after_download_checkBox.setChecked(False) # run persepolis at startup checkBox if str(self.persepolis_setting.value('startup')) == 'yes': self.startup_checkbox.setChecked(True) else: self.startup_checkbox.setChecked(False) # font_checkBox if str(self.persepolis_setting.value('custom-font')) == 'yes': self.font_checkBox.setChecked(True) else: self.font_checkBox.setChecked(False) self.fontCheckBoxState(self.font_checkBox) # keep_awake_checkBox if str(self.persepolis_setting.value('awake')) == 'yes': self.keep_awake_checkBox.setChecked(True) else: self.keep_awake_checkBox.setChecked(False) # check_clipboard_checkBox if str(self.persepolis_setting.value('check-clipboard')) == 'yes': self.check_clipboard_checkBox.setChecked(True) else: self.check_clipboard_checkBox.setChecked(False) # When a download request is sent from the browser extension, # the download will start without showing the Add Link window. if str(self.persepolis_setting.value('dont-show-addlinkwindow')) == 'yes': self.dont_show_add_link_window_checkBox.setChecked(True) else: self.dont_show_add_link_window_checkBox.setChecked(False) # columns_tab if str(self.persepolis_setting.value('column0')) == 'yes': self.column0_checkBox.setChecked(True) else: self.column0_checkBox.setChecked(False) if str(self.persepolis_setting.value('column1')) == 'yes': self.column1_checkBox.setChecked(True) else: self.column1_checkBox.setChecked(False) if str(self.persepolis_setting.value('column2')) == 'yes': self.column2_checkBox.setChecked(True) else: self.column2_checkBox.setChecked(False) if str(self.persepolis_setting.value('column3')) == 'yes': self.column3_checkBox.setChecked(True) else: self.column3_checkBox.setChecked(False) if str(self.persepolis_setting.value('column4')) == 'yes': self.column4_checkBox.setChecked(True) else: self.column4_checkBox.setChecked(False) if str(self.persepolis_setting.value('column5')) == 'yes': self.column5_checkBox.setChecked(True) else: self.column5_checkBox.setChecked(False) if str(self.persepolis_setting.value('column6')) == 'yes': self.column6_checkBox.setChecked(True) else: self.column6_checkBox.setChecked(False) if str(self.persepolis_setting.value('column7')) == 'yes': self.column7_checkBox.setChecked(True) else: self.column7_checkBox.setChecked(False) if str(self.persepolis_setting.value('column10')) == 'yes': self.column10_checkBox.setChecked(True) else: self.column10_checkBox.setChecked(False) if str(self.persepolis_setting.value('column11')) == 'yes': self.column11_checkBox.setChecked(True) else: self.column11_checkBox.setChecked(False) if str(self.persepolis_setting.value('column12')) == 'yes': self.column12_checkBox.setChecked(True) else: self.column12_checkBox.setChecked(False) # video_finder try: # Integer casting may raise exception. self.max_links_spinBox.setValue(int(persepolis_setting.value('video_finder/max_links', 3))) except ValueError: pass # shortcuts self.qshortcuts_list = [self.parent.exitAction_shortcut, self.parent.minimizeAction_shortcut, self.parent.removeSelectedAction_shortcut, self.parent.deleteSelectedAction_shortcut, self.parent.moveUpSelectedAction_shortcut, self.parent.moveDownSelectedAction_shortcut, self.parent.addlinkAction_shortcut, self.parent.videoFinderAddLinkAction_shortcut, self.parent.addtextfileAction_shortcut] self.shortcuts_list = [self.parent.exitAction_shortcut.key().toString(), self.parent.minimizeAction_shortcut.key().toString(), self.parent.removeSelectedAction_shortcut.key().toString(), self.parent.deleteSelectedAction_shortcut.key().toString(), self.parent.moveUpSelectedAction_shortcut.key().toString(), self.parent.moveDownSelectedAction_shortcut.key().toString(), self.parent.addlinkAction_shortcut.key().toString(), self.parent.videoFinderAddLinkAction_shortcut.key().toString(), self.parent.addtextfileAction_shortcut.key().toString()] # add shortcuts to the shortcut_table j = 0 for shortcut in self.shortcuts_list: item = QTableWidgetItem(shortcut) # align center item.setTextAlignment(0x0004 | 0x0080) # insert item in shortcut_table self.shortcut_table.setItem(j, 1, item) j = j + 1 # If user doubleclicks on a row, then run showCaptureKeyboardWindow method self.shortcut_table.itemDoubleClicked.connect(self.showCaptureKeyboardWindow) # ok cancel default button self.cancel_pushButton.clicked.connect(self.close) self.defaults_pushButton.clicked.connect( self.defaultsPushButtonPressed) self.ok_pushButton.clicked.connect(self.okPushButtonPressed) # font_checkBox connect self.font_checkBox.stateChanged.connect(self.fontCheckBoxState) # saving initial value of self.persepolis_setting in self.first_key_value_dict # at the end! in the okPushButtonPressed method, first_key_value_dict will compared with second_key_value_dict. # if any thing changed , then a message box notify user about "some changes take effect after restarting persepolis". self.first_key_value_dict = {} for member in self.persepolis_setting.allKeys(): self.first_key_value_dict[member] = str(self.persepolis_setting.value(member)) # if style_comboBox is changed, self.styleComboBoxChanged is called. self.style_comboBox.currentIndexChanged.connect(self.styleComboBoxChanged) self.styleComboBoxChanged() self.color_comboBox.currentIndexChanged.connect(self.setDarkLightIcon) self.persepolis_setting.endGroup() # browser_integration_tab # Load checkbox states from settings self.persepolis_setting.beginGroup('settings/native_messaging') for browser, checkbox in self.browser_checkboxes.items(): value = self.persepolis_setting.value(browser) if value == 'true': checkbox.setChecked(True) else: checkbox.setChecked(False) self.persepolis_setting.endGroup() # setting window size and position size = self.persepolis_setting.value( 'PreferencesWindow/size', QSize(578, 597)) position = self.persepolis_setting.value( 'PreferencesWindow/position', QPoint(300, 300)) self.resize(size) self.move(position) # run this method if user doubleclicks on an item in shortcut_table def showCaptureKeyboardWindow(self): # show KeyCapturingWindow keyboard_capture_window = KeyCapturingWindow(self.callBack, self.persepolis_setting) self.parent.capturekeywindows_list.append(keyboard_capture_window) self.parent.capturekeywindows_list[-1].show() def callBack(self, keys): # do nothing if keys is empty if not (keys): return # check that if shortcut used before. if keys in self.shortcuts_list: self.msgBox = QMessageBox() self.msgBox.setText(QCoreApplication.translate("setting_src_ui_tr", "
This shortcut has been used before!\ Use another one!
")) self.msgBox.setIcon(QMessageBox.Warning) # set new shortcut else: selected_row = self.shortcut_table.selectionModel().selectedRows()[0].row() item = QTableWidgetItem(keys) # align center item.setTextAlignment(0x0004 | 0x0080) # insert item in shortcut_table self.shortcut_table.setItem(selected_row, 1, item) # set keys in shortcuts_list self.shortcuts_list[selected_row] = keys # active color_comboBox only when user is select "Fusion" style. def styleComboBoxChanged(self, index=None): # clear color_comboBox self.color_comboBox.clear() # get current style selected_style = self.style_comboBox.currentText() if selected_style != 'Fusion': # color_comboBox item color_scheme = ['System'] # add item self.color_comboBox.addItems(color_scheme) # set 'System' for color_scheme current_color_index = self.color_comboBox.findText('System') self.color_comboBox.setCurrentIndex(current_color_index) # disable color_comboBox self.color_comboBox.setEnabled(False) else: # enable color_comboBox self.color_comboBox.setEnabled(True) # color_comboBox items color_scheme = ['Dark Fusion', 'Light Fusion'] # add items self.color_comboBox.addItems(color_scheme) current_color_index = self.color_comboBox.findText( str(self.persepolis_setting.value('color-scheme'))) # it means user's preferred color_scheme is not valid in color_comboBox. if current_color_index == -1: current_color_index = 0 self.color_comboBox.setCurrentIndex(current_color_index) self.setDarkLightIcon() # this method sets dark icons for dark color schemes # and light icons for light color schemes. def setDarkLightIcon(self, index=None): dark_theme = None # find selected style selected_style = self.style_comboBox.currentText() # clear icon_comboBox self.icon_comboBox.clear() # Papirus icons can be used with small sizes(smaller than 48) # get user's selected icons size selected_size = int(self.icons_size_comboBox.currentText()) if selected_style == 'Fusion': if self.color_comboBox.currentText() == 'Dark Fusion': dark_theme = True else: dark_theme = False elif selected_style == 'Adwaita-Dark': dark_theme = True elif selected_style == 'Adwaita': dark_theme = False if dark_theme is True: self.icon_comboBox.clear() if selected_size < 48: icons = ['Breeze-Dark', 'Papirus-Dark', 'Papirus'] else: icons = ['Breeze-Dark'] self.icon_comboBox.addItems(icons) # current_icons_index is -1, if findText couldn't find icon index. current_icons_index = self.icon_comboBox.findText( str(self.persepolis_setting.value('icons', self.current_icon))) if current_icons_index == -1: current_icons_index = 0 self.icon_comboBox.setCurrentIndex(current_icons_index) elif dark_theme is False: if selected_size < 48: icons = ['Breeze', 'Papirus', 'Papirus-Light'] else: icons = ['Breeze', 'Papirus'] self.icon_comboBox.addItems(icons) # current_icons_index is -1, if findText couldn't find icon index. current_icons_index = self.icon_comboBox.findText( str(self.persepolis_setting.value('icons', self.current_icon))) if current_icons_index == -1: current_icons_index = 0 self.icon_comboBox.setCurrentIndex(current_icons_index) else: if selected_size < 48: icons = ['Breeze', 'Breeze-Dark', 'Papirus', 'Papirus-Dark', 'Papirus-Light'] else: icons = ['Breeze', 'Breeze-Dark', 'Papirus'] self.icon_comboBox.addItems(icons) # current_icons_index is -1, if findText couldn't find icon index. current_icons_index = self.icon_comboBox.findText( str(self.persepolis_setting.value('icons', self.current_icon))) if current_icons_index == -1: current_icons_index = 0 self.icon_comboBox.setCurrentIndex(current_icons_index) def fontCheckBoxState(self, checkBox): # deactivate fontComboBox and font_size_spinBox if font_checkBox not checked! if self.font_checkBox.isChecked(): self.fontComboBox.setEnabled(True) self.font_size_spinBox.setEnabled(True) else: self.fontComboBox.setEnabled(False) self.font_size_spinBox.setEnabled(False) # close window with ESC key def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.close() def closeEvent(self, event): # saving window size and position self.persepolis_setting.setValue('PreferencesWindow/size', self.size()) self.persepolis_setting.setValue( 'PreferencesWindow/position', self.pos()) self.persepolis_setting.sync() event.accept() if self.parent.isVisible() is False: self.parent.minMaxTray(event) def browserIntegrationSettings(self): # native messaging # The group is already 'settings' from the caller (okPushButtonPressed), # so we just need to enter the 'native_messaging' subgroup. # Using an absolute path here would be wrong and cause nesting issues. self.persepolis_setting.beginGroup("native_messaging") previous_enabled = [] for key in self.persepolis_setting.childKeys(): if self.persepolis_setting.value(key) == 'true': previous_enabled.append(key) enabled_browsers = [b for b, cb in self.browser_checkboxes.items() if cb.isChecked()] # Save checkbox states for browser, cb in self.browser_checkboxes.items(): self.persepolis_setting.setValue(browser, 'true' if cb.isChecked() else 'false') self.persepolis_setting.endGroup() # Remove unselected manifests removed_browsers = set(previous_enabled) - set(enabled_browsers) for browser in removed_browsers: logg_message, logg_message2 = browserIsolation(browser) logger.sendToLog(logg_message) logger.sendToLog(logg_message2) # Install newly enabled manifests for browser in enabled_browsers: json_done, intermediary_done, logg_message2 = browserIntegration(browser) logg_message = browser if json_done is True: logg_message = logg_message + ': ' + 'Json file is created successfully.\n' else: logg_message = logg_message + ': ' + 'Json ERROR!\n' if intermediary_done is True: logg_message = logg_message + 'persepolis intermediary file is created successfully.\n' elif intermediary_done is False: logg_message = logg_message + ': ' + 'persepolis executer file ERROR!\n' logger.sendToLog(logg_message) logger.sendToLog(logg_message2) def soundFrame(self, checkBox): if self.enable_notifications_checkBox.isChecked(): self.sound_frame.setEnabled(True) else: self.sound_frame.setEnabled(False) def downloadFolderPushButtonClicked(self, button): download_path = str( self.persepolis_setting.value('settings/download_path')) fname = QFileDialog.getExistingDirectory( self, 'Select a directory', download_path) if fname: # Returns pathName with the '/' separators converted to separators that are appropriate for the underlying operating system. # On Windows, toNativeSeparators("c:/winnt/system32") returns # "c:\winnt\system32". fname = QDir.toNativeSeparators(fname) self.download_folder_lineEdit.setText(fname) self.persepolis_setting.setValue( 'settings/download_path', str(fname)) def dialChanged(self, dial): self.volume_label.setText('Volume : ' + str(self.volume_dial.value())) def defaultsPushButtonPressed(self, button): self.persepolis_setting.beginGroup('settings') self.setting_dict = returnDefaultSettings() self.tries_spinBox.setValue(int(self.setting_dict['max-tries'])) self.chunk_size_spinBox.setValue(int(self.setting_dict['chunk-size'])) self.wait_spinBox.setValue(int(self.setting_dict['retry-wait'])) self.time_out_spinBox.setValue(int(self.setting_dict['timeout'])) self.connections_spinBox.setValue( int(self.setting_dict['connections'])) # wait-queue wait_queue_list = self.setting_dict['wait-queue'] q_time = QTime(wait_queue_list[0], wait_queue_list[1]) self.wait_queue_time.setTime(q_time) # dont_check_certificate_checkBox self.dont_check_certificate_checkBox.setChecked(False) # save_as_tab self.download_folder_lineEdit.setText( str(self.setting_dict['download_path'])) self.subfolder_checkBox.setChecked(True) # notifications_tab self.volume_label.setText( 'Volume : ' + str(self.setting_dict['sound-volume'])) self.volume_dial.setValue(int(self.setting_dict['sound-volume'])) # set style current_style_index = self.style_comboBox.findText( str(self.setting_dict['style'])) self.style_comboBox.setCurrentIndex(current_style_index) # set language current_locale = self.lang_comboBox.findData( str(self.setting_dict['locale'])) self.lang_comboBox.setCurrentIndex(current_locale) # set color_scheme current_color_index = self.color_comboBox.findText( str(self.setting_dict['color-scheme'])) self.color_comboBox.setCurrentIndex(current_color_index) # set icons current_icons_index = self.icon_comboBox.findText( str(self.setting_dict['icons'])) self.icon_comboBox.setCurrentIndex(current_icons_index) # set icons size current_icons_size_index = self.icons_size_comboBox.findText( str(self.setting_dict['toolbar_icon_size'])) self.icons_size_comboBox.setCurrentIndex(current_icons_size_index) # set notification current_notification_index = self.notification_comboBox.findText( str(self.setting_dict['notification'])) self.notification_comboBox.setCurrentIndex(current_notification_index) # set font self.font_checkBox.setChecked(False) font_setting = QFont() font_setting.setFamily(str(self.setting_dict['font'])) self.fontComboBox.setCurrentFont(font_setting) self.font_size_spinBox.setValue(int(self.setting_dict['font-size'])) # sound frame self.enable_notifications_checkBox.setChecked(True) # start_persepolis_if_browser_executed_checkBox self.start_persepolis_if_browser_executed_checkBox.setChecked(True) # hide window self.hide_window_checkBox.setChecked(True) # tray icon self.enable_system_tray_checkBox.setChecked(True) # after_download_checkBox self.after_download_checkBox.setChecked(True) # hide menubar for linux if platform.system == 'Darwin': self.show_menubar_checkbox.setChecked(True) else: self.show_menubar_checkbox.setChecked(False) # show side panel self.show_sidepanel_checkbox.setChecked(True) # show progress window self.show_progress_window_checkbox.setChecked(True) # run persepolis at startup checkBox self.startup_checkbox.setChecked(False) # keep_awake_checkBox self.keep_awake_checkBox.setChecked(False) # check clipboard self.check_clipboard_checkBox.setChecked(False) # don't show addlinkwindows self.dont_show_add_link_window_checkBox.setChecked(False) # columns_tab self.column0_checkBox.setChecked(True) self.column1_checkBox.setChecked(True) self.column2_checkBox.setChecked(True) self.column3_checkBox.setChecked(True) self.column4_checkBox.setChecked(True) self.column5_checkBox.setChecked(True) self.column6_checkBox.setChecked(True) self.column7_checkBox.setChecked(True) self.column10_checkBox.setChecked(True) self.column11_checkBox.setChecked(True) self.column12_checkBox.setChecked(True) # video finder self.max_links_spinBox.setValue(3) # shortcuts self.shortcuts_list = [self.setting_dict['shortcuts/quit_shortcut'], self.setting_dict['shortcuts/hide_window_shortcut'], self.setting_dict['shortcuts/remove_shortcut'], self.setting_dict['shortcuts/delete_shortcut'], self.setting_dict['shortcuts/move_up_selection_shortcut'], self.setting_dict['shortcuts/move_down_selection_shortcut'], self.setting_dict['shortcuts/add_new_download_shortcut'], self.setting_dict['shortcuts/video_finder_shortcut'], self.setting_dict['shortcuts/import_text_shortcut']] # add shortcuts to the shortcut_table j = 0 for shortcut in self.shortcuts_list: item = QTableWidgetItem(shortcut) # align center item.setTextAlignment(0x0004 | 0x0080) # insert item in shortcut_table self.shortcut_table.setItem(j, 1, item) j = j + 1 self.persepolis_setting.endGroup() def okPushButtonPressed(self, button): self.persepolis_setting.beginGroup('settings') # Save browser integration settings self.browserIntegrationSettings() self.persepolis_setting.setValue( 'max-tries', self.tries_spinBox.value()) self.persepolis_setting.setValue( 'chunk-size', self.chunk_size_spinBox.value()) self.persepolis_setting.setValue( 'retry-wait', self.wait_spinBox.value()) self.persepolis_setting.setValue( 'timeout', self.time_out_spinBox.value()) self.persepolis_setting.setValue( 'connections', self.connections_spinBox.value()) self.persepolis_setting.setValue( 'download_path', self.download_folder_lineEdit.text()) self.persepolis_setting.setValue( 'sound-volume', self.volume_dial.value()) self.persepolis_setting.setValue( 'notification', self.notification_comboBox.currentText()) self.persepolis_setting.setValue( 'wait-queue', self.wait_queue_time.text().split(':')) # don't check certificate if self.dont_check_certificate_checkBox.isChecked(): self.persepolis_setting.setValue('dont-check-certificate', 'yes') else: self.persepolis_setting.setValue('dont-check-certificate', 'no') # don't show addlinkwindows if self.dont_show_add_link_window_checkBox.isChecked(): self.persepolis_setting.setValue('dont-show-addlinkwindow', 'yes') else: self.persepolis_setting.setValue('dont-show-addlinkwindow', 'no') # changing icons icons = self.icon_comboBox.currentText() self.persepolis_setting.setValue('icons', icons) if icons != self.current_icon: # it means icons changed for windows_list in [self.parent.logwindow_list, self.parent.about_window_list, self.parent.addlinkwindows_list, self.parent.propertieswindows_list, self.parent.afterdownload_list, self.parent.text_queue_window_list, self.parent.progress_window_list, self.parent.plugin_queue_window_list]: for window in windows_list: window.changeIcon(icons) self.parent.changeIcon(icons) # icons size icons_size = self.icons_size_comboBox.currentText() self.persepolis_setting.setValue('toolbar_icon_size', icons_size) icons_size = int(icons_size) self.parent.toolBar.setIconSize(QSize(icons_size, icons_size)) self.parent.toolBar2.setIconSize(QSize(icons_size, icons_size)) # style style = str(self.style_comboBox.currentText()) self.persepolis_setting.setValue('style', style) # language locale = str(self.lang_comboBox.itemData(self.lang_comboBox.currentIndex())) self.persepolis_setting.setValue('locale', locale) # color_scheme color_scheme = self.color_comboBox.currentText() self.persepolis_setting.setValue('color-scheme', color_scheme) # font and font size current_font = self.fontComboBox.currentFont() current_font = current_font.key() current_font = current_font.split(',') font = str(current_font[0]) self.persepolis_setting.setValue('font', font) font_size = self.font_size_spinBox.value() self.persepolis_setting.setValue('font-size', font_size) if self.font_checkBox.isChecked(): custom_font = 'yes' else: custom_font = 'no' self.persepolis_setting.setValue('custom-font', custom_font) # if user select qt notification >> enable_system_tray icon if self.persepolis_setting.value('notification') == 'QT notification': self.enable_system_tray_checkBox.setChecked(True) # start_persepolis_if_browser_executed_checkBox if self.start_persepolis_if_browser_executed_checkBox.isChecked(): self.persepolis_setting.setValue('browser-persepolis', 'yes') else: self.persepolis_setting.setValue('browser-persepolis', 'no') # hide_window_checkBox if self.hide_window_checkBox.isChecked(): self.persepolis_setting.setValue('hide-window', 'yes') else: self.persepolis_setting.setValue('hide-window', 'no') # enable_system_tray_checkBox if self.enable_system_tray_checkBox.isChecked(): self.persepolis_setting.setValue('tray-icon', 'yes') self.parent.system_tray_icon.show() self.parent.minimizeAction.setEnabled(True) self.parent.trayAction.setChecked(True) else: self.persepolis_setting.setValue('tray-icon', 'no') self.parent.system_tray_icon.hide() self.parent.minimizeAction.setEnabled(False) self.parent.trayAction.setChecked(False) # after_download_checkBox if self.after_download_checkBox.isChecked(): self.persepolis_setting.setValue('after-dialog', 'yes') else: self.persepolis_setting.setValue('after-dialog', 'no') # show_menubar_checkbox if self.show_menubar_checkbox.isChecked(): self.persepolis_setting.setValue('show-menubar', 'yes') self.parent.menubar.show() self.parent.toolBar2.hide() self.parent.showMenuBarAction.setChecked(True) else: self.persepolis_setting.setValue('show-menubar', 'no') self.parent.menubar.hide() self.parent.toolBar2.show() self.parent.showMenuBarAction.setChecked(False) # show_sidepanel_checkbox if self.show_sidepanel_checkbox.isChecked(): self.persepolis_setting.setValue('show-sidepanel', 'yes') self.parent.category_tree_qwidget.show() else: self.persepolis_setting.setValue('show-sidepanel', 'no') self.parent.category_tree_qwidget.hide() # show_progress_window_checkbox if self.show_progress_window_checkbox.isChecked(): self.persepolis_setting.setValue('show-progress', 'yes') else: self.persepolis_setting.setValue('show-progress', 'no') if self.startup_checkbox.isChecked(): self.persepolis_setting.setValue('startup', 'yes') if not (startup.checkStartUp()): # checking existence of Persepolis in system's startup startup.addStartUp(self.parent) # adding Persepolis to system's startup else: self.persepolis_setting.setValue('startup', 'no') if startup.checkStartUp(): # checking existence of Persepolis in system's startup startup.removeStartUp() # removing Persepolis from system's startup # keep_awake_checkBox if self.keep_awake_checkBox.isChecked(): self.persepolis_setting.setValue('awake', 'yes') self.parent.keep_awake_checkBox.setChecked(True) else: self.persepolis_setting.setValue('awake', 'no') self.parent.keep_awake_checkBox.setChecked(False) # check_clipboard_checkBox if self.check_clipboard_checkBox.isChecked(): self.persepolis_setting.setValue('check-clipboard', 'yes') else: self.persepolis_setting.setValue('check-clipboard', 'no') # this section creates download folder and # download sub folders if they did not existed. download_path = self.persepolis_setting.value('download_path') folder_list = [download_path] if self.subfolder_checkBox.isChecked(): self.persepolis_setting.setValue('subfolder', 'yes') for folder in ['Audios', 'Videos', 'Others', 'Documents', 'Compressed']: folder_list.append(os.path.join(download_path, folder)) else: self.persepolis_setting.setValue('subfolder', 'no') for folder in folder_list: osCommands.makeDirs(folder) if self.enable_notifications_checkBox.isChecked(): self.persepolis_setting.setValue('sound', 'yes') else: self.persepolis_setting.setValue('sound', 'no') # columns_tab if self.column0_checkBox.isChecked(): self.persepolis_setting.setValue('column0', 'yes') self.parent.download_table.setColumnHidden(0, False) if self.parent.download_table.isColumnHidden(0): self.parent.download_table.setColumnWidth(0, 100) else: self.persepolis_setting.setValue('column0', 'no') self.parent.download_table.setColumnHidden(0, True) if self.column1_checkBox.isChecked(): self.persepolis_setting.setValue('column1', 'yes') self.parent.download_table.setColumnHidden(1, False) if self.parent.download_table.isColumnHidden(1): self.parent.download_table.setColumnWidth(1, 100) else: self.persepolis_setting.setValue('column1', 'no') self.parent.download_table.setColumnHidden(1, True) if self.column2_checkBox.isChecked(): self.persepolis_setting.setValue('column2', 'yes') self.parent.download_table.setColumnHidden(2, False) if self.parent.download_table.isColumnHidden(2): self.parent.download_table.setColumnWidth(2, 100) else: self.persepolis_setting.setValue('column2', 'no') self.parent.download_table.setColumnHidden(2, True) if self.column3_checkBox.isChecked(): self.persepolis_setting.setValue('column3', 'yes') self.parent.download_table.setColumnHidden(3, False) if self.parent.download_table.isColumnHidden(3): self.parent.download_table.setColumnWidth(3, 100) else: self.persepolis_setting.setValue('column3', 'no') self.parent.download_table.setColumnHidden(3, True) if self.column4_checkBox.isChecked(): self.persepolis_setting.setValue('column4', 'yes') self.parent.download_table.setColumnHidden(4, False) if self.parent.download_table.isColumnHidden(4): self.parent.download_table.setColumnWidth(4, 100) else: self.persepolis_setting.setValue('column4', 'no') self.parent.download_table.setColumnHidden(4, True) if self.column5_checkBox.isChecked(): self.persepolis_setting.setValue('column5', 'yes') self.parent.download_table.setColumnHidden(5, False) if self.parent.download_table.isColumnHidden(5): self.parent.download_table.setColumnWidth(5, 100) else: self.persepolis_setting.setValue('column5', 'no') self.parent.download_table.setColumnHidden(5, True) if self.column6_checkBox.isChecked(): self.persepolis_setting.setValue('column6', 'yes') self.parent.download_table.setColumnHidden(6, False) if self.parent.download_table.isColumnHidden(6): self.parent.download_table.setColumnWidth(6, 100) else: self.persepolis_setting.setValue('column6', 'no') self.parent.download_table.setColumnHidden(6, True) if self.column7_checkBox.isChecked(): self.persepolis_setting.setValue('column7', 'yes') self.parent.download_table.setColumnHidden(7, False) if self.parent.download_table.isColumnHidden(7): self.parent.download_table.setColumnWidth(7, 100) else: self.persepolis_setting.setValue('column7', 'no') self.parent.download_table.setColumnHidden(7, True) if self.column10_checkBox.isChecked(): self.persepolis_setting.setValue('column10', 'yes') self.parent.download_table.setColumnHidden(10, False) if self.parent.download_table.isColumnHidden(10): self.parent.download_table.setColumnWidth(10, 100) else: self.persepolis_setting.setValue('column10', 'no') self.parent.download_table.setColumnHidden(10, True) if self.column11_checkBox.isChecked(): self.persepolis_setting.setValue('column11', 'yes') self.parent.download_table.setColumnHidden(11, False) if self.parent.download_table.isColumnHidden(11): self.parent.download_table.setColumnWidth(11, 100) else: self.persepolis_setting.setValue('column11', 'no') self.parent.download_table.setColumnHidden(11, True) if self.column12_checkBox.isChecked(): self.persepolis_setting.setValue('column12', 'yes') self.parent.download_table.setColumnHidden(12, False) if self.parent.download_table.isColumnHidden(12): self.parent.download_table.setColumnWidth(12, 100) else: self.persepolis_setting.setValue('column12', 'no') self.parent.download_table.setColumnHidden(12, True) # shortcuts # set new shortcuts i = 0 for qshortcut in self.qshortcuts_list: # set keys for QShortcut qshortcut.setKey(self.shortcuts_list[i]) i = i + 1 # video_finder self.persepolis_setting.setValue('video_finder/max_links', self.max_links_spinBox.value()) # saving value of persepolis_setting in second_key_value_dict. self.second_key_value_dict = {} for member in self.persepolis_setting.allKeys(): self.second_key_value_dict[member] = str(self.persepolis_setting.value(member)) # comparing first_key_value_dict with second_key_value_dict show_message_box = False for key in self.first_key_value_dict.keys(): if self.first_key_value_dict[key] != self.second_key_value_dict[key]: if key in ['locale', 'download_path', 'custom-font', 'max-tries', 'chunk-size', 'retry-wait', 'timeout', 'connections', 'style', 'font', 'font-size', 'color-scheme', 'check-clipboard']: show_message_box = True # if any thing changed that needs restarting, then notify user about "Some changes take effect after restarting persepolis" if show_message_box: restart_messageBox = QMessageBox() restart_messageBox.setText(QCoreApplication.translate( "setting_src_ui_tr", '
Restart Persepolis Please!

Some changes take effect after restarting Persepolis
')) restart_messageBox.setWindowTitle(QCoreApplication.translate("setting_src_ui_tr", 'Restart Persepolis!')) restart_messageBox.exec_() # applying changes self.persepolis_setting.endGroup() self.persepolis_setting.sync() self.close() ================================================ FILE: persepolis/scripts/shutdown.py ================================================ # -*- coding: utf-8 -*- # 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 . from persepolis.scripts import logger from persepolis.constants import OS from time import sleep import subprocess import platform os_type = platform.system() def shutDown(parent, gid=None, category=None, password=None): # for queue >> gid = None # for single downloads >> category = None # change value of shutdown in data base if category is not None: dict = {'category': category, 'shutdown': 'wait'} # update data base parent.temp_db.updateQueueTable(dict) else: # so we have single download dict = {'gid': gid, 'shutdown': 'wait'} # update data base parent.temp_db.updateSingleTable(dict) shutdown_status = "wait" while shutdown_status == "wait": sleep(5) # get shutdown status from data_base if category is not None: dict = parent.temp_db.returnCategory(category) else: dict = parent.temp_db.returnGid(gid) shutdown_status = dict['shutdown'] if shutdown_status == "shutdown": logger.sendToLog("Shutting down in a minute", "INFO") # Make sure all download progresses are stopped. parent.stopAllDownloads() sleep(20) # Make sure all sessions have ended. while parent.download_sessions_list: sleep(0.5) # shutdown_notification = 0 >> persepolis running , 1 >> persepolis is # ready for close(closeEvent called) , 2 >> OK, let's close application! parent.changeShutdownValue(1) while parent.returnShutDownValue() != 2: sleep(0.1) # close data bases connections for db in parent.persepolis_db, parent.plugins_db, parent.temp_db: db.closeConnections() for i in parent.threadPool: i.quit() i.wait() parent.cleanTempFolder() if os_type == OS.LINUX: pipe = subprocess.Popen(['sudo', '-S', 'poweroff'], stdout=subprocess.DEVNULL, stdin=subprocess.PIPE, stderr=subprocess.DEVNULL, shell=False) pipe.communicate(password.encode()) elif os_type == OS.DARWIN: pipe = subprocess.Popen(['sudo', '-S', 'shutdown', '-h', 'now'], stdout=subprocess.DEVNULL, stdin=subprocess.PIPE, stderr=subprocess.DEVNULL, shell=False) pipe.communicate(password.encode()) elif os_type == OS.WINDOWS: CREATE_NO_WINDOW = 0x08000000 subprocess.Popen(['shutdown', '-S'], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False, creationflags=CREATE_NO_WINDOW) elif os_type in OS.BSD_FAMILY: pipe = subprocess.Popen(['sudo', '-S', 'shutdown', '-p', 'now'], stdout=subprocess.DEVNULL, stdin=subprocess.PIPE, stderr=subprocess.DEVNULL, shell=False) pipe.communicate(password.encode()) ================================================ FILE: persepolis/scripts/spider.py ================================================ # -*- coding: utf-8 -*- # 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 . from persepolis.scripts.useful_tools import humanReadableSize, headerToDict, readCookieJar, getFileNameFromLink from persepolis.constants import VERSION import requests try: from PySide6.QtCore import QSettings except ImportError: from PyQt5.QtCore import QSettings # for more information about "requests" library , please see # http://docs.python-requests.org/en/master/ # load persepolis_settings persepolis_setting = QSettings('persepolis_download_manager', 'persepolis') # check certificate if str(persepolis_setting.value('settings/dont-check-certificate')) == 'yes': check_certificate = False else: check_certificate = True timeout = int(persepolis_setting.value('settings/timeout')) # spider function finds name of file and file size from header def spider(add_link_dictionary): # get user's download request from add_link_dictionary link = add_link_dictionary['link'] ip = add_link_dictionary['ip'] port = add_link_dictionary['port'] proxy_user = add_link_dictionary['proxy_user'] proxy_passwd = add_link_dictionary['proxy_passwd'] proxy_type = add_link_dictionary['proxy_type'] download_user = add_link_dictionary['download_user'] download_passwd = add_link_dictionary['download_passwd'] header = add_link_dictionary['header'] out = add_link_dictionary['out'] user_agent = add_link_dictionary['user_agent'] load_cookies = add_link_dictionary['load_cookies'] referer = add_link_dictionary['referer'] # define a requests session requests_session = requests.Session() # check if user set proxy if ip: ip_port = '://' + str(ip) + ":" + str(port) if proxy_user: ip_port = ('://' + proxy_user + ':' + proxy_passwd + '@' + ip_port) if proxy_type == 'socks5': ip_port = 'socks5' + ip_port else: ip_port = 'http' + ip_port proxies = {'http': ip_port, 'https': ip_port} # set proxy to the session requests_session.proxies.update(proxies) if download_user: # set download user pass to the session requests_session.auth = (download_user, download_passwd) # set cookies if load_cookies: jar = readCookieJar(load_cookies) if jar: requests_session.cookies = jar if header is not None: # convert header to dictionary dict_ = headerToDict(header) # update headers requests_session.headers.update(dict_) # set referer if referer: requests_session.headers.update({'referer': referer}) # setting referer to the session # set user_agent if user_agent: requests_session.headers.update({'user-agent': user_agent}) # setting user_agent to the session else: user_agent = 'PersepolisDM/' + str(VERSION.version_str) # setting user_agent to the session requests_session.headers.update( {'user-agent': user_agent}) # find headers try: response = requests_session.head(link, allow_redirects=True, timeout=timeout, verify=check_certificate) header = response.headers except Exception: header = {} filename = None file_size = None # check if filename is available in header if 'Content-Disposition' in header.keys(): content_disposition = header['Content-Disposition'] if content_disposition.find('filename') != -1: # so file name is available in header filename_splited = content_disposition.split('filename=') filename_splited = filename_splited[-1] # getting file name in desired format # remove "" from file namme(some times it's happend for github files). filename = filename_splited.strip('"') # remove any leading and trailing whitespace. filename = filename.strip() if not (filename): filename = getFileNameFromLink(link) # if user set file name before in add_link_dictionary['out'], # then set "out" for filename if out: filename = out # check if file_size is available if 'Content-Length' in header.keys(): try: file_size = int(header['Content-Length']) # converting file_size to KiB or MiB or GiB file_size, unit = humanReadableSize(file_size) file_size_with_unit = str(file_size) + ' ' + unit except Exception: file_size_with_unit = 'None' else: file_size_with_unit = 'None' requests_session.close() # return results return filename, file_size_with_unit # this function finds and returns file name for links. def queueSpider(add_link_dictionary): filename = addLinkSpider(add_link_dictionary)[0] return filename def addLinkSpider(add_link_dictionary): # get user's download information from add_link_dictionary for i in ['link', 'ip', 'port', 'proxy_user', 'proxy_passwd', 'download_user', 'download_passwd', 'header', 'out', 'user_agent', 'proxy_type', 'load_cookies', 'referer']: if not (i in add_link_dictionary): add_link_dictionary[i] = None return spider(add_link_dictionary) ================================================ FILE: persepolis/scripts/startup.py ================================================ # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import platform import sys import os from persepolis.constants import OS home_address = os.path.expanduser("~") # finding os_type os_type = platform.system() if os_type == OS.WINDOWS: import winreg # check startup def checkStartUp(): # check if it is linux if os_type in OS.UNIX_LIKE: # check if the startup exists if os.path.exists(home_address + "/.config/autostart/persepolis.desktop"): return True else: return False # check if it is mac elif os_type == OS.OSX: # OS X if os.path.exists(home_address + "/Library/LaunchAgents/com.persepolisdm.plist"): return True else: return False # check if it is Windows elif os_type == OS.WINDOWS: # try to open startup key and check persepolis value try: aKey = winreg.OpenKey( winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, winreg.KEY_ALL_ACCESS) startupvalue = winreg.QueryValueEx(aKey, 'persepolis') startup = True except WindowsError: startup = False # Close the connection winreg.CloseKey(aKey) # if the startup enabled or disabled if startup: return True if not startup: return False # add startup file def addStartUp(parent): # check if it is linux if os_type in OS.UNIX_LIKE: entry = ''' [Desktop Entry] Name=Persepolis Download Manager Name[fa]=پرسپولیس Comment=Download Manager GenericName=Download Manager GenericName[fa]=نرم افزار مدیریت بارگیری Keywords=Internet;WWW;Web; Terminal=false Type=Application Categories=Qt;Network; StartupNotify=true Exec={} --tray Icon=com.github.persepolisdm.persepolis StartupWMClass=persepolis-download-Manager '''.format(parent.exec_dictionary['modified_exec_file_path']) # check if the autostart directory exists & create entry if not os.path.exists(home_address + "/.config/autostart"): os.makedirs(home_address + "/.config/autostart", 0o755) startupfile = open( home_address + "/.config/autostart/persepolis.desktop", 'w+') startupfile.write(entry) os.chmod(home_address + "/.config/autostart/persepolis.desktop", 0o644) # check if it is mac elif os_type == OS.OSX: # OS X cwd = sys.argv[0] cwd = os.path.dirname(cwd) entry = ''' Label com.persepolisdm.persepolis Program {} ProgramArguments --tray RunAtLoad \n '''.format(parent.exec_dictionary['exec_file_path']) startupfile = open( home_address + '/Library/LaunchAgents/com.persepolisdm.plist', 'w+') startupfile.write(entry) os.system('launchctl load ' + home_address + "/Library/LaunchAgents/com.persepolisdm.plist") # check if it is Windows elif os_type == OS.WINDOWS: # Connect to the startup path in Registry key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, winreg.KEY_ALL_ACCESS) # find current persepolis exe path persepolisexetray = '"{}" --tray'.format(parent.exec_dictionary['exec_file_path']) # add persepolis to startup winreg.SetValueEx(key, 'persepolis', 0, winreg.REG_SZ, persepolisexetray) # Close connection winreg.CloseKey(key) # remove startup file def removeStartUp(): # check if it is linux if os_type in OS.UNIX_LIKE: # remove it os.remove(home_address + "/.config/autostart/persepolis.desktop") # check if it is mac OS elif os_type == OS.OSX: # OS X if checkStartUp(): os.system('launchctl unload ' + home_address + "/Library/LaunchAgents/com.persepolisdm.plist") os.remove(home_address + "/Library/LaunchAgents/com.persepolisdm.plist") # check if it is Windows elif os_type == OS.WINDOWS: if checkStartUp(): # Connect to the startup path in Registry key = winreg.OpenKey( winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, winreg.KEY_ALL_ACCESS) # remove persepolis from startup winreg.DeleteValue(key, 'persepolis') # Close connection winreg.CloseKey(key) ================================================ FILE: persepolis/scripts/text_queue.py ================================================ # -*- coding: utf-8 -*- # 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 . try: from PySide6.QtCore import Qt, QDir, QPoint, QSize, QThread, Signal from PySide6.QtWidgets import QTableWidgetItem, QFileDialog from PySide6.QtGui import QIcon except ImportError: from PyQt5.QtCore import Qt, QDir, QPoint, QSize, QThread from PyQt5.QtWidgets import QTableWidgetItem, QFileDialog from PyQt5.QtCore import pyqtSignal as Signal from PyQt5.QtGui import QIcon from persepolis.gui.text_queue_ui import TextQueue_Ui from persepolis.scripts import logger from persepolis.scripts import spider from functools import partial import os # This thread finds filename class QueueSpiderThread(QThread): QUEUESPIDERRETURNEDFILENAME = Signal(str) def __init__(self, dict_): QThread.__init__(self) self.dict_ = dict_ def run(self): try: filename = spider.queueSpider(self.dict_) if filename: self.QUEUESPIDERRETURNEDFILENAME.emit(filename) else: logger.logObj.error( "Spider couldn't find download information", exc_info=True) except Exception as e: # write error in log logger.logObj.error( "Spider couldn't find download information", exc_info=True) logger.logObj.error( str(e), exc_info=True) class TextQueue(TextQueue_Ui): def __init__(self, parent, file_path, callback, persepolis_setting): super().__init__(persepolis_setting) self.persepolis_setting = persepolis_setting self.callback = callback self.file_path = file_path self.parent = parent global icons icons = ':/' + \ str(self.persepolis_setting.value('settings/icons')) + '/' # read text file lines and put links in list format. f = open(self.file_path) f_links_list = f.readlines() f.close() f_links_list.reverse() # check links! links must be started with http or https or ftp self.link_list = [] for link in f_links_list: text = link.strip() if ("tp:/" in text[2:6]) or ("tps:/" in text[2:7]): self.link_list.append(text) k = 1 for link in self.link_list: self.links_table.insertRow(0) # file_name file_name = '***' dict_ = {'link': link} # spider finds file name new_spider = QueueSpiderThread(dict_) self.parent.threadPool.append(new_spider) self.parent.threadPool[-1].start() self.parent.threadPool[-1].QUEUESPIDERRETURNEDFILENAME.connect( partial(self.parent.queueSpiderCallBack, child=self, row_number=len(self.link_list) - k)) k = k + 1 item = QTableWidgetItem(file_name) # add checkbox to the item item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) item.setCheckState(Qt.Checked) # insert file_name self.links_table.setItem(0, 0, item) # insert link item = QTableWidgetItem(str(link)) self.links_table.setItem(0, 1, item) # get categories name and add them to add_queue_comboBox categories_list = self.parent.persepolis_db.categoriesList() for queue in categories_list: if queue != 'All Downloads': self.add_queue_comboBox.addItem(queue) self.add_queue_comboBox.addItem( QIcon(icons + 'add_queue'), 'Create new queue') # entry initialization # get values from persepolis_setting global connections connections = int( self.persepolis_setting.value('settings/connections')) global download_path download_path = str( self.persepolis_setting.value('settings/download_path')) self.connections_spinBox.setValue(connections) self.download_folder_lineEdit.setText(download_path) self.download_folder_lineEdit.setEnabled(False) # ip_lineEdit initialization settings_ip = self.persepolis_setting.value( 'add_link_initialization/ip', None) if settings_ip: self.ip_lineEdit.setText(str(settings_ip)) # proxy user lineEdit initialization settings_proxy_user = self.persepolis_setting.value( 'add_link_initialization/proxy_user', None) if settings_proxy_user: self.proxy_user_lineEdit.setText(str(settings_proxy_user)) # port_spinBox initialization settings_port = self.persepolis_setting.value( 'add_link_initialization/port', 0) self.port_spinBox.setValue(int(int(settings_port))) # http or socks5 initialization settings_proxy_type = self.persepolis_setting.value( 'add_link_initialization/proxy_type', None) # default is http if settings_proxy_type == 'socks5': self.socks5_radioButton.setChecked(True) elif settings_proxy_type == 'https': self.https_radioButton.setChecked(True) else: self.http_radioButton.setChecked(True) # download UserName initialization settings_download_user = self.persepolis_setting.value( 'add_link_initialization/download_user', None) if settings_download_user: self.download_user_lineEdit.setText(str(settings_download_user)) # connect folder_pushButton self.folder_pushButton.clicked.connect(self.changeFolder) # connect OK and cancel button self.cancel_pushButton.clicked.connect(self.close) self.ok_pushButton.clicked.connect(self.okButtonPressed) # connect select_all_pushButton deselect_all_pushButton self.select_all_pushButton.clicked.connect(self.selectAll) self.deselect_all_pushButton.clicked.connect(self.deselectAll) # frames and checkBoxes self.proxy_frame.setEnabled(False) self.proxy_checkBox.toggled.connect(self.proxyFrame) self.download_frame.setEnabled(False) self.download_checkBox.toggled.connect(self.downloadFrame) self.queue_tabWidget.currentChanged.connect(self.currentTabChanged) # set focus to ok button self.ok_pushButton.setFocus() # add_queue_comboBox event self.add_queue_comboBox.currentIndexChanged.connect(self.queueChanged) # setting window size and position size = self.persepolis_setting.value('TextQueue/size', QSize(700, 500)) position = self.persepolis_setting.value( 'TextQueue/position', QPoint(300, 300)) self.resize(size) self.move(position) # if user clicked on link_tab so send spider again # perhaps proxy or user password , ... set! def currentTabChanged(self, index): if index == 0: # get proxy information ip, port, proxy_user, proxy_passwd, proxy_type = self.getProxyInformation() # get download username and password information download_user, download_passwd = self.getUserPass() dict_ = {'link': None, 'ip': ip, 'port': port, 'proxy_user': proxy_user, 'proxy_passwd': proxy_passwd, 'proxy_type': proxy_type, 'download_user': download_user, 'download_passwd': download_passwd, 'referer': None, 'header': None, 'user_agent': None, 'load_cookies': None} k = 1 for link in self.link_list: dict_['link'] = link # spider finds file name new_spider = QueueSpiderThread(dict_) self.parent.threadPool.append(new_spider) self.parent.threadPool[-1].start() self.parent.threadPool[-1].QUEUESPIDERRETURNEDFILENAME.connect( partial(self.parent.queueSpiderCallBack, child=self, row_number=len(self.link_list) - k)) k = k + 1 # this method checks all check boxes def selectAll(self, button): for i in range(self.links_table.rowCount()): item = self.links_table.item(i, 0) item.setCheckState(Qt.Checked) # this method deselect all check boxes def deselectAll(self, button): for i in range(self.links_table.rowCount()): item = self.links_table.item(i, 0) item.setCheckState(Qt.Unchecked) # this method is called, when user changes add_queue_comboBox def queueChanged(self, combo): if str(self.add_queue_comboBox.currentText()) == 'Create new queue': # if user want to create new queue, then callback # createQueue method from mainwindow(parent) new_queue = self.parent.createQueue(combo) if new_queue: # clear comboBox self.add_queue_comboBox.clear() # load queue list again! queues_list = self.parent.persepolis_db.categoriesList() for queue in queues_list: if queue != 'All Downloads': self.add_queue_comboBox.addItem(queue) self.add_queue_comboBox.addItem( QIcon(icons + 'add_queue'), 'Create new queue') # finding index of new_queue and setting comboBox for it index = self.add_queue_comboBox.findText(str(new_queue)) self.add_queue_comboBox.setCurrentIndex(index) else: self.add_queue_comboBox.setCurrentIndex(0) # activate frames if checkBoxes checked def proxyFrame(self, checkBox): if self.proxy_checkBox.isChecked(): self.proxy_frame.setEnabled(True) else: self.proxy_frame.setEnabled(False) def downloadFrame(self, checkBox): if self.download_checkBox.isChecked(): self.download_frame.setEnabled(True) else: self.download_frame.setEnabled(False) def changeFolder(self, button): fname = QFileDialog.getExistingDirectory( self, 'Select a directory', download_path) if fname: # Returns pathName with the '/' separators converted to # separators that are appropriate for the underlying # operating system. # On Windows, toNativeSeparators("c:/winnt/system32") returns # "c:\winnt\system32". fname = QDir.toNativeSeparators(fname) if os.path.isdir(fname): self.download_folder_lineEdit.setText(fname) # this method returns proxy information. def getProxyInformation(self): # http, https or socks5 proxy if self.http_radioButton.isChecked() is True: proxy_type = 'http' elif self.https_radioButton.isChecked() is True: proxy_type = 'https' else: proxy_type = 'socks5' # get proxy information if not (self.proxy_checkBox.isChecked()): ip = None port = None proxy_user = None proxy_passwd = None proxy_type = None else: ip = self.ip_lineEdit.text() if not (ip): ip = None port = self.port_spinBox.value() if not (port): port = None proxy_user = self.proxy_user_lineEdit.text() if not (proxy_user): proxy_user = None proxy_passwd = self.proxy_pass_lineEdit.text() if not (proxy_passwd): proxy_passwd = None return ip, port, proxy_user, proxy_passwd, proxy_type def getUserPass(self): # get download username and password information if not (self.download_checkBox.isChecked()): download_user = None download_passwd = None else: download_user = self.download_user_lineEdit.text() if not (download_user): download_user = None download_passwd = self.download_pass_lineEdit.text() if not (download_passwd): download_passwd = None return download_user, download_passwd def okButtonPressed(self, button): # write user's input data to init file self.persepolis_setting.setValue( 'add_link_initialization/ip', self.ip_lineEdit.text()) self.persepolis_setting.setValue( 'add_link_initialization/port', self.port_spinBox.value()) self.persepolis_setting.setValue( 'add_link_initialization/proxy_user', self.proxy_user_lineEdit.text()) self.persepolis_setting.setValue( 'add_link_initialization/download_user', self.download_user_lineEdit.text()) # get proxy information ip, port, proxy_user, proxy_passwd, proxy_type = self.getProxyInformation() if proxy_type is not None: self.persepolis_setting.setValue('add_link_initialization/proxy_type', proxy_type) # get download username and password information download_user, download_passwd = self.getUserPass() category = str(self.add_queue_comboBox.currentText()) connections = self.connections_spinBox.value() download_path = self.download_folder_lineEdit.text() dict_ = {'out': None, 'start_time': None, 'end_time': None, 'link': None, 'ip': ip, 'port': port, 'proxy_user': proxy_user, 'proxy_passwd': proxy_passwd, 'download_user': download_user, 'download_passwd': download_passwd, 'proxy_type': proxy_type, 'connections': connections, 'limit_value': 10, 'download_path': download_path, 'referer': None, 'load_cookies': None, 'user_agent': None, 'header': None, 'after_download': None } # find checked links in links_table self.add_link_dictionary_list = [] i = 0 for row in range(self.links_table.rowCount()): item = self.links_table.item(row, 0) # if item is checked if (item.checkState() == Qt.Checked): # Create a copy from dict_ and add it # to add_link_dictionary_list self.add_link_dictionary_list.append( dict_.copy()) # get link and add it to dict_ link = self.links_table.item(row, 1).text() self.add_link_dictionary_list[i]['link'] = str(link) # add file name to the dict_ self.add_link_dictionary_list[i]['out'] = self.links_table.item( row, 0).text() i = i + 1 # reverse list self.add_link_dictionary_list.reverse() # Create callback for mainwindow self.callback(self.add_link_dictionary_list, category) # close window self.close() # close window with ESC key def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.close() def closeEvent(self, event): self.persepolis_setting.setValue('TextQueue/size', self.size()) self.persepolis_setting.setValue('TextQueue/position', self.pos()) self.persepolis_setting.sync() event.accept() def changeIcon(self, icons): icons = ':/' + str(icons) + '/' self.folder_pushButton.setIcon(QIcon(icons + 'folder')) self.ok_pushButton.setIcon(QIcon(icons + 'ok')) self.cancel_pushButton.setIcon(QIcon(icons + 'remove')) ================================================ FILE: persepolis/scripts/useful_tools.py ================================================ # -*- coding: utf-8 -*- # 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 . from persepolis.constants.Os import OS from pathlib import Path import urllib.parse import subprocess import requests import platform import textwrap import time import sys import os try: from PySide6.QtCore import QThread, Signal, QProcess from PySide6.QtWidgets import QStyleFactory except ImportError: from PyQt5.QtWidgets import QStyleFactory from PyQt5.QtCore import QThread, QProcess from PyQt5.QtCore import pyqtSignal as Signal try: from persepolis.scripts import logger logger_availability = True except ImportError: logger_availability = False # find operating system # os_type >> Linux or Darwin(Mac osx) or Windows(Microsoft Windows) or # FreeBSD or OpenBSD os_type = platform.system() # user home address home_address = os.path.expanduser("~") # runApplication in a thread. class RunApplicationThread(QThread): RUNAPPCALLBACKSIGNAL = Signal(list) def __init__(self, command_argument, call_back=False): QThread.__init__(self) self.command_argument = command_argument self.call_back = call_back def run(self): pipe = runApplication(self.command_argument) if self.call_back: self.RUNAPPCALLBACKSIGNAL.emit([pipe]) # determine the config folder path based on the operating system def determineConfigFolder(): if os_type in OS.UNIX_LIKE: config_folder = os.path.join( home_address, ".config/persepolis_download_manager") elif os_type == OS.OSX: config_folder = os.path.join( home_address, "Library/Application Support/persepolis_download_manager") elif os_type == OS.WINDOWS: config_folder = os.path.join( home_address, 'AppData', 'Local', 'persepolis_download_manager') return config_folder # this function returns operating system and desktop environment(for linux and bsd). def osAndDesktopEnvironment(): desktop_env = None if os_type in OS.UNIX_LIKE: # find desktop environment('KDE', 'GNOME', ...) xdg_desktop = os.environ.get("XDG_CURRENT_DESKTOP") if xdg_desktop is not None: desktop_env = xdg_desktop.lower() else: desktop_env = "unknown" if logger_availability: logger.sendToLog( "XDG_CURRENT_DESKTOP environment variable not found.", "WARNING" ) return os_type, desktop_env # this function converts file_size to KiB or MiB or GiB def humanReadableSize(size, input_type='file_size'): labels = ['KiB', 'MiB', 'GiB', 'TiB'] i = -1 if size < 1024: return str(size), 'B' while size >= 1024: i += 1 size = size / 1024 if i > 1: return round(size, 2), labels[i] elif i == 1 and input_type == 'speed': return round(size, 1), labels[i] else: return round(size, None), labels[i] # this function converts second to hour and minute def convertTime(time): minutes = int(time // 60) if minutes == 0: return str(int(time)) + 's' elif minutes < 60: return str(minutes) + 'm' else: hours = minutes // 60 minutes = minutes - (hours * 60) return str(hours) + 'h ' + str(minutes) + 'm' # this function converts human readable size to byte def convertToByte(file_size): # if unit is not in Byte if file_size[-2:] != ' B': unit = file_size[-3:] # persepolis uses float type for GiB and TiB if unit == 'GiB' or unit == 'TiB': size_value = float(file_size[:-4]) else: size_value = int(float(file_size[:-4])) else: unit = None size_value = int(float(file_size[:-3])) # covert them in byte if not (unit): in_byte_value = size_value elif unit == 'KiB': in_byte_value = size_value * 1024 elif unit == 'MiB': in_byte_value = size_value * 1024 * 1024 elif unit == 'GiB': in_byte_value = size_value * 1024 * 1024 * 1024 elif unit == 'TiB': in_byte_value = size_value * 1024 * 1024 * 1024 * 1024 return int(in_byte_value) # this function checks free space in hard disk. def freeSpace(dir): try: import psutil except ImportError: if logger_availability: logger.sendToLog("psutil in not installed!", "ERROR") return None try: dir_space = psutil.disk_usage(dir) free_space = dir_space.free return int(free_space) except Exception as e: # log in to the log file if logger_availability: logger.sendToLog("persepolis couldn't find free space value:\n" + str(e), "ERROR") return None def returnDefaultSettings(): os_type, desktop_env = osAndDesktopEnvironment() # user download folder path download_path = os.path.join(home_address, 'Downloads', 'Persepolis') # set dark fusion for default style settings. style = 'Fusion' color_scheme = 'Dark Fusion' icons = 'Papirus' style = 'Fusion' # find available styles(It's depends on operating system and desktop environments). available_styles = QStyleFactory.keys() if os_type in OS.UNIX_LIKE: if desktop_env in ['kde', 'lxqt', 'paperde', 'plainde', 'thedesk', 'lumina']: style = 'System' color_scheme = 'System' else: if 'Breeze' in available_styles: style = 'Breeze' color_scheme = 'System' elif 'Adwaita' in available_styles: style = 'Adwaita' color_scheme = 'System' else: style = 'Fusion' color_scheme = 'Dark Fusion' elif os_type == OS.OSX: if 'macOS' in available_styles: style = 'macOS' color_scheme = 'System' elif os_type == OS.WINDOWS: if 'windows11' in available_styles: style = 'windows11' color_scheme = 'System' # keyboard shortcuts delete_shortcut = "Ctrl+D" remove_shortcut = "Ctrl+R" add_new_download_shortcut = "Ctrl+N" import_text_shortcut = "Ctrl+O" video_finder_shortcut = "Ctrl+V" quit_shortcut = "Ctrl+Q" hide_window_shortcut = "Ctrl+W" move_up_selection_shortcut = "Ctrl+Up" move_down_selection_shortcut = "Ctrl+Down" # Persepolis default setting default_setting_dict = {'locale': 'en_US', 'toolbar_icon_size': 32, 'wait-queue': [0, 0], 'awake': 'no', 'custom-font': 'no', 'column0': 'yes', 'column1': 'yes', 'column2': 'yes', 'column3': 'yes', 'column4': 'yes', 'column5': 'yes', 'column6': 'yes', 'column7': 'yes', 'column10': 'yes', 'column11': 'yes', 'column12': 'yes', 'subfolder': 'yes', 'startup': 'no', 'show-progress': 'yes', 'show-menubar': 'no', 'show-sidepanel': 'yes', 'notification': 'QT notification', 'after-dialog': 'yes', 'tray-icon': 'yes', 'browser-persepolis': 'yes', 'hide-window': 'yes', 'max-tries': 5, 'retry-wait': 5, 'timeout': 10, 'connections': 64, 'download_path': download_path, 'sound': 'yes', 'sound-volume': 100, 'chunk-size': 100, 'style': style, 'color-scheme': color_scheme, 'icons': icons, 'font': 'Ubuntu', 'font-size': 9, 'video_finder/max_links': '3', 'shortcuts/delete_shortcut': delete_shortcut, 'shortcuts/remove_shortcut': remove_shortcut, 'shortcuts/add_new_download_shortcut': add_new_download_shortcut, 'shortcuts/import_text_shortcut': import_text_shortcut, 'shortcuts/video_finder_shortcut': video_finder_shortcut, 'shortcuts/quit_shortcut': quit_shortcut, 'shortcuts/hide_window_shortcut': hide_window_shortcut, 'shortcuts/move_up_selection_shortcut': move_up_selection_shortcut, 'shortcuts/move_down_selection_shortcut': move_down_selection_shortcut, 'dont-check-certificate': 'no', 'native_messaging/chrome': 'true', 'native_messaging/chromium': 'true', 'native_messaging/firefox': 'true', 'native_messaging/brave': 'false', 'native_messaging/librewolf': 'false', 'native_messaging/opera': 'false', 'native_messaging/vivaldi': 'false'} return default_setting_dict # mix video and audio that downloads by video finder def muxer(parent, video_finder_dictionary): result_dictionary = {'error': 'no_error', 'ffmpeg_error_message': None, 'final_path': None, 'final_size': None} # find file path video_file_dictionary = parent.persepolis_db.searchGidInAddLinkTable(video_finder_dictionary['video_gid']) audio_file_dictionary = parent.persepolis_db.searchGidInAddLinkTable(video_finder_dictionary['audio_gid']) # find inputs and output file path for ffmpeg video_file_path = video_file_dictionary['download_path'] audio_file_path = audio_file_dictionary['download_path'] final_path = video_finder_dictionary['download_path'] # calculate final file size video_file_size = parent.persepolis_db.searchGidInDownloadTable(video_finder_dictionary['video_gid'])['size'] audio_file_size = parent.persepolis_db.searchGidInDownloadTable(video_finder_dictionary['audio_gid'])['size'] # convert size to byte video_file_size = convertToByte(video_file_size) audio_file_size = convertToByte(audio_file_size) final_file_size = video_file_size + audio_file_size # check free space free_space = freeSpace(final_path) if free_space: if final_file_size > free_space: result_dictionary['error'] = 'not enough free space' else: # find final file's name final_file_name = urllib.parse.unquote(os.path.basename(video_file_path)) # if video's extension is 'mp4' then the final output file's extension is 'mp4' # if video's extension is 'webm' then the final output file's extension is 'mkv' file_name_split = final_file_name.split('.') video_extension = file_name_split[-1] if video_extension == 'webm': extension_length = len(file_name_split[-1]) + 1 final_file_name = final_file_name[0:-extension_length] + '.mkv' if parent.persepolis_setting.value('settings/download_path') == final_path: if parent.persepolis_setting.value('settings/subfolder') == 'yes': final_path = os.path.join(final_path, 'Videos') # rename file if file already existed i = 1 final_path_plus_name = os.path.join(final_path, final_file_name) while os.path.isfile(final_path_plus_name): extension_length = len(file_name_split[-1]) + 1 new_name = final_file_name[0:-extension_length] + \ '_' + str(i) + final_file_name[-extension_length:] final_path_plus_name = os.path.join(final_path, new_name) i = i + 1 # start muxing # find ffmpeg path ffmpeg_command, log_list = findExternalAppPath('ffmpeg') # run ffmpeg command_argument = ['ffmpeg', '-i', video_file_path, '-i', audio_file_path, '-c', 'copy', '-shortest', '-map', '0:v:0', '-map', '1:a:0', '-loglevel', 'error', '-strict', '-2', final_path_plus_name] pipe = runApplication(command_argument) if pipe.wait() == 0: # muxing was finished successfully. result_dictionary['error'] = 'no error' result_dictionary['final_path'] = final_path_plus_name file_size, file_size_unit = humanReadableSize(final_file_size) result_dictionary['final_size'] = str(file_size) + ' ' + str(file_size_unit) else: result_dictionary['error'] = 'ffmpeg error' out, ffmpeg_error_message = pipe.communicate() result_dictionary['ffmpeg_error_message'] = ffmpeg_error_message.decode('utf-8', 'ignore') return result_dictionary # return version of ffmpeg def ffmpegVersion(): # find ffmpeg path ffmpeg_command, log_list = findExternalAppPath('ffmpeg') # Try to test ffmpeg command_argument = [ffmpeg_command, '-version'] try: pipe = runApplication(command_argument) if pipe.wait() == 0: ffmpeg_is_installed = True ffmpeg_output, error = pipe.communicate() ffmpeg_output = ffmpeg_output.decode('utf-8') else: ffmpeg_is_installed = False ffmpeg_output = 'ffmpeg is not installed' except Exception: ffmpeg_is_installed = False ffmpeg_output = 'ffmpeg is not installed' # wrap ffmpeg_output with width=70 wrapper = textwrap.TextWrapper() ffmpeg_output = wrapper.fill(ffmpeg_output) ffmpeg_output = '\n**********\n'\ + str(ffmpeg_output)\ + '\n**********\n' return ffmpeg_is_installed, ffmpeg_output, log_list # run apllication with qprocess def qRunApplication(command: str, command_argument: list, parent=None): process = QProcess(parent=parent) process.start(command, command_argument) return process # run an application def runApplication(command_argument): if os_type == OS.WINDOWS: # NO_WINDOW option avoids opening additional CMD in MS Windows. NO_WINDOW = 0x08000000 pipe = subprocess.Popen(command_argument, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=False, creationflags=NO_WINDOW) else: pipe = subprocess.Popen( command_argument, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, shell=False) return pipe # find exeternal application execution path def findExternalAppPath(app_name): # get Persepolis type information first. persepolis_path_infromation = getExecPath() is_bundle = persepolis_path_infromation['bundle'] is_test = persepolis_path_infromation['test'] if os_type == OS.WINDOWS: app_name = app_name + '.exe' # If Persepolis run as a bundle. if is_bundle: # alongside of the bundle path cwd = sys.argv[0] current_directory = os.path.dirname(cwd) app_alongside = os.path.join(current_directory, app_name) # inside of the bundle path. if os_type in OS.UNIX_LIKE: # we use nuikita for creating bundle bundle_path = os.path.dirname(sys.executable) app_inside = os.path.join(bundle_path, app_name) else: # we use pyinstaller for creating bundle base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) app_inside = os.path.join(base_path, app_name) if os_type in OS.UNIX_LIKE: # Check outside of the bundle first. if os.path.exists(app_alongside): app_command = app_alongside log_list = ["{}'s file is detected alongside of bundle.".format(app_name), "INFO"] # Check inside of the bundle. elif os.path.exists(app_inside): # get executable pathAdd commentMore actions app_command = app_inside log_list = ["{}'s file is detected inside of bundle.".format(app_name), "INFO"] else: # use app that installed on user's system app_command = app_name log_list = ["Persepolis will use {} that installed on user's system.".format(app_name), "INFO"] else: # for Mac OSX and MicroSoft Windows app_command = app_alongside log_list = ["{}'s file is detected alongside of bundle.".format(app_name), "INFO"] # I Persepolis run from test directory. if is_test: # Check inside of test directory. cwd = sys.argv[0] current_directory = os.path.dirname(cwd) app_alongside = os.path.join(current_directory, app_name) if os.path.exists(app_alongside): app_command = app_alongside log_list = ["{}'s file is detected inside of test directory.".format(app_name), "INFO"] else: # use app that installed on user's system app_command = app_name log_list = ["Persepolis will use {} that installed on user's system.".format(app_name), "INFO"] if not (is_bundle) and not (is_test): app_command = app_name log_list = ["Persepolis will use {} that installed on user's system.".format(app_name), "INFO"] return app_command, log_list # This function returns persepolis's execution path. def getExecPath(): exec_dictionary = {'bundle': None, 'test': False, 'exec_file_path': None, 'modified_exec_file_path': None} # check if persepolis is run as a bundle. # On Windows and Mac we use pyinstaller to build the bundle, # and on Linux and BSD we use nuitka. # the output of this code for pyinstaller bundle is True # getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS') # But this code doesn't work for nuitka! # So we have to use a workaround to identify nuitka bundle. # We check the inside of the bundle and look for the # com.github.persepolisdm.persepolis.svg file(icon). # file that we placed. If it was, then the bundle file # generated with nuitka is running. if os_type in OS.UNIX_LIKE: bundle_path = os.path.dirname(sys.executable) icon_file_path = os.path.join(bundle_path, 'com.github.persepolisdm.persepolis.svg') # check availability of com.github.persepolisdm.persepolis.svg if os.path.exists(icon_file_path): exec_dictionary['bundle'] = True # for nuitka # get executable path bundle_path = os.path.abspath(sys.argv[0]) exec_file_path = bundle_path # for windows and osx(pyinstaller bundle) else: # check pyinstaller bundle if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'): exec_dictionary['bundle'] = True # get executable path bundle_path = os.path.dirname(sys.executable) # get bundle name bundle_name = os.path.basename(sys.executable) exec_file_path = os.path.join(bundle_path, bundle_name) if exec_dictionary['bundle'] is not True: # persepolis is run from python script exec_dictionary['bundle'] = False # get execution path script_path = os.path.dirname(os.path.abspath(sys.modules['__main__'].__file__)) script_name = os.path.basename(sys.argv[0]) if script_name == 'test.py': # persepolis is run from test directory exec_dictionary['test'] = True exec_file_path = os.path.join(script_path, script_name) # replace space with \+space for UNIX_LIKE and OSX if os_type in OS.UNIX_LIKE or os_type == OS.OSX: modified_exec_file_path = exec_file_path.replace(" ", r"\ ") elif os_type == OS.WINDOWS: modified_exec_file_path = exec_file_path.replace('\\', r'\\') # write it in dictionary exec_dictionary['exec_file_path'] = exec_file_path exec_dictionary['modified_exec_file_path'] = modified_exec_file_path # return ressults return exec_dictionary # This method returns data and time in string format # for example >> 2017/09/09 , 13:12:26 def nowDate(): date = time.strftime("%Y/%m/%d , %H:%M:%S") return date def fold(header): line = "%s: %s" % (header[0], header[1]) if len(line) < 998: return line # fold else: lines = [line] while len(lines[-1]) > 998: split_this = lines[-1] # find last space in longest chunk admissible split_here = split_this[:998].rfind(" ") del lines[-1] lines = lines + [split_this[:split_here], split_this[split_here:]] # this may still be too long # hence the while on lines[-1] return "\n".join(lines) def dictToHeader(data): return "\n".join((fold(header) for header in data.items())) # this method get http header as string and convert it to dictionary def headerToDict(headers): dic = {} for line in headers.split("\n"): if line.startswith(("GET", "POST")): continue point_index = line.find(":") dic[line[:point_index].strip()] = line[point_index + 1:].strip() return dic def readCookieJar(load_cookies): jar = None if os.path.isfile(load_cookies): # Open cookie file cookies_txt = open(load_cookies, 'r') # Initialize RequestsCookieJar jar = requests.cookies.RequestsCookieJar() for line in cookies_txt.readlines(): words = line.split() # Filter out lines that don't contain cookies if (len(words) == 7) and (words[0] != "#"): # Split cookies into the appropriate parameters jar.set(words[5], words[6], domain=words[0], path=words[2]) return jar # get file name from link string def getFileNameFromLink(link): link = requests.utils.unquote(link) parsed_linkd = urllib.parse.urlparse(link) file_name = Path(parsed_linkd.path).name return file_name # Return a new name for the file, if a file with the current name exists. def returnNewFileName(folder_path, file_name): i = 1 file_path = os.path.join(folder_path, file_name) # If file is already exists. while os.path.isfile(file_path): # split file name to file_name + extension file_name_split = list(os.path.splitext(file_name)) # add _i to the end of file name if file_name_split[0][-2] == '_': try: # check the last character of file_name. # If it's integer, add 1 to it. j = file_name_split[0][-1] j = int(j) j += 1 file_name = file_name_split[0][:-1] + str(j) + file_name_split[-1] except Exception: file_name = file_name_split[0] + '_' + str(i) + file_name_split[-1] i += 1 else: file_name = file_name_split[0] + '_' + str(i) + file_name_split[-1] i += 1 # create new file_path file_path = os.path.join(folder_path, file_name) return file_name ================================================ FILE: persepolis/scripts/video_finder.py ================================================ # -*- coding: utf-8 -*- """ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import os from time import sleep from persepolis.scripts import logger from persepolis.scripts.download_link import DownloadLink from persepolis.scripts.useful_tools import muxer try: from PySide6.QtCore import QThread, Signal except ImportError: from PyQt5.QtCore import QThread from PyQt5.QtCore import pyqtSignal as Signal try: from persepolis.scripts import ytdlp_downloader except ModuleNotFoundError: # if youtube_dl module is not installed: logger.sendToLog( "yt-dlp is not installed.", "ERROR") # Persepolis download audio and video separately and the muxing them :) # VideoFinder do this job for Persepolis. # see data_base.py for understanding the code # we have video_finder_db_table in data base. it's contains some items that helps # VideoFinder for managing the situation. # video_gid >> GID of video link # audio_gid >> GID of audio link # video_completed >> Is video downloaded completely? # audio_completed >> Is audio downloaded completely? # checking >> VideoFinder must checking or not! class VideoFinder(QThread): VIDEOFINDERCOMPLETED = Signal(dict) def __init__(self, video_finder_dictionary, main_window): QThread.__init__(self) self.main_window = main_window self.video_finder_dictionary = video_finder_dictionary # First: Download video # Second: Download audio # Third: Mux video and audio def run(self): self.video_completed = self.video_finder_dictionary['video_completed'] self.audio_completed = self.video_finder_dictionary['audio_completed'] self.muxing = 'no' self.checking = 'no' self.active = 'yes' video_gid = self.video_finder_dictionary['video_gid'] audio_gid = self.video_finder_dictionary['audio_gid'] # find category dictionary = self.main_window.persepolis_db.searchGidInDownloadTable(video_gid) category = dictionary['category'] # VideoFinder handles downloads by itself, if category is "Single Downloads" if category == 'Single Downloads': # create an item for this thread in temp_db if not exists! try: video_finder_plus_gid = 'video_finder_' + str(video_gid) self.main_window.temp_db.insertInQueueTable(video_finder_plus_gid) except Exception: # release lock self.main_window.temp_db.lock = False # check start time and end time add_link_dictionary = self.main_window.persepolis_db.searchGidInAddLinkTable(video_gid) start_time = add_link_dictionary['start_time'] if self.video_completed == 'no' and start_time: # set start time only for video and cancel start time for audio. # because video will downloaded first and start time must be set for first link! not second one self.main_window.persepolis_db.setDefaultGidInAddlinkTable(audio_gid, start_time=True) # update checking status in data base for starting the job! self.checking = 'yes' self.video_finder_dictionary['checking'] = 'yes' self.main_window.persepolis_db.updateVideoFinderTable([self.video_finder_dictionary]) # if category "Single Downloads" >> manage download yourself. # if category is not "Single Download" >> just check the status time to time and wait until download ends! if self.video_completed == 'no': if category == "Single Downloads": # start video downloading # get add_link_dictionary for video add_link_dictionary = self.main_window.persepolis_db.searchGidInAddLinkTable(video_gid) # create download_session video_download_session = ytdlp_downloader.Ytdp_Download(add_link_dictionary, self.main_window, video_gid) # add download_session and gid to download_session_dict download_session_dict = {'gid': video_gid, 'download_session': video_download_session} # append download_session_dict to download_sessions_list self.main_window.download_sessions_list.append(download_session_dict) # strat download in thread new_download = DownloadLink(video_gid, video_download_session, self.main_window) self.main_window.threadPool.append(new_download) self.main_window.threadPool[-1].start() # check the download status # continue loop and check the download status # if checking == 'no' >> problem has been occurred and download has been canceled. while self.video_completed != 'yes' and self.checking == 'yes': sleep(1) if self.video_completed == 'yes': if self.video_finder_dictionary['video_completed'] == 'no': # update data base self.video_finder_dictionary['video_completed'] = 'yes' self.main_window.persepolis_db.updateVideoFinderTable([self.video_finder_dictionary]) # video is downloaded completely! # let's start audio downloading if self.audio_completed == 'no': # if category "Single Downloads" >> start download yourself. # if category is not "Single Download" >> just check the status time to time if category == "Single Downloads": # get add_link_dictionary for video add_link_dictionary = self.main_window.persepolis_db.searchGidInAddLinkTable(audio_gid) # create download_session audio_download_session = ytdlp_downloader.Ytdp_Download(add_link_dictionary, self.main_window, audio_gid) # add download_session and gid to download_session_dict download_session_dict = {'gid': audio_gid, 'download_session': audio_download_session} # append download_session_dict to download_sessions_list self.main_window.download_sessions_list.append(download_session_dict) # set speed limitation of video_download_session for audio_download_session # audio_download_session.sleep_for_speed_limiting = video_download_session.sleep_for_speed_limiting # strat download in thread new_download = DownloadLink(audio_gid, audio_download_session, self.main_window) self.main_window.threadPool.append(new_download) self.main_window.threadPool[-1].start() # check the download status # continue loop and check the download status # if checking == 'no' >> problem occurred and downloading canceled. while self.audio_completed != 'yes' and self.checking == 'yes': sleep(1) self.checking = 'no' # lets start muxing! if self.video_completed == 'yes' and self.audio_completed == 'yes': audio_file_exists = False video_file_exists = False # wait until the data_base is updated while not (audio_file_exists) or not (video_file_exists): sleep(0.5) # checking for file existance # find file path video_file_dictionary = self.main_window.persepolis_db.searchGidInAddLinkTable(video_gid) audio_file_dictionary = self.main_window.persepolis_db.searchGidInAddLinkTable(audio_gid) # find inputs and output file path for ffmpeg video_file_path = video_file_dictionary['download_path'] audio_file_path = audio_file_dictionary['download_path'] video_file_exists = os.path.isfile(video_file_path) audio_file_exists = os.path.isfile(audio_file_path) self.video_finder_dictionary['audio_completed'] = 'yes' self.video_finder_dictionary['checking'] = 'no' self.video_finder_dictionary['muxing_status'] = 'started' self.muxing = 'started' # update data base self.main_window.persepolis_db.updateVideoFinderTable([self.video_finder_dictionary]) # audio and video files are downloaded completely. # lets start muxing result_dictionary = muxer(self.main_window, self.video_finder_dictionary) error_message = result_dictionary['error'] ffmpeg_error_message = result_dictionary['ffmpeg_error_message'] if ffmpeg_error_message: logger.sendToLog('ffmpeg error: ' + str(ffmpeg_error_message), 'DOWNLOAD ERROR') if error_message == 'no error': self.video_finder_dictionary['muxing_status'] = 'complete' self.muxing = 'complete' else: self.video_finder_dictionary['muxing_status'] = 'error' self.muxing = 'error' # update data base self.main_window.persepolis_db.updateVideoFinderTable([self.video_finder_dictionary]) complete_dictionary = {'error': error_message, 'final_path': result_dictionary['final_path'], 'final_size': result_dictionary['final_size'], 'video_gid': self.video_finder_dictionary['video_gid'], 'audio_gid': self.video_finder_dictionary['audio_gid'], 'download_path': self.video_finder_dictionary['download_path'], 'category': category} # emit error_message self.VIDEOFINDERCOMPLETED.emit(complete_dictionary) self.active = 'no' if category == 'Single Downloads': # check if user selected shutdown after download in progress window. shutdown_dict = self.main_window.temp_db.returnCategory(video_finder_plus_gid) shutdown_status = shutdown_dict['shutdown'] if shutdown_status == 'wait': # it means user want to persepolis shutdown system after download. # write 'shutdown' value for this category in temp_db shutdown_dict = {'category': video_finder_plus_gid, 'shutdown': 'shutdown'} self.main_window.temp_db.updateQueueTable(shutdown_dict) ================================================ FILE: persepolis/scripts/video_finder_addlink.py ================================================ # -*- coding: utf-8 -*- """ 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 . """ try: from PySide6.QtWidgets import QCheckBox, QPushButton, QTextEdit, QFrame, QLabel, QComboBox, QHBoxLayout, QApplication from PySide6.QtCore import QThread, Signal, QCoreApplication, QTranslator, QLocale, QPoint, QSize from PySide6.QtGui import QPixmap except ImportError: from PyQt5.QtWidgets import QCheckBox, QPushButton, QTextEdit, QFrame, QLabel, QComboBox, QHBoxLayout, QApplication from PyQt5.QtCore import QThread, QCoreApplication, QTranslator, QLocale, QPoint, QSize from PyQt5.QtGui import QPixmap from PyQt5.QtCore import pyqtSignal as Signal from persepolis.scripts.useful_tools import determineConfigFolder, dictToHeader from persepolis.scripts.addlink import AddLinkWindow from persepolis.scripts import logger, osCommands from persepolis.scripts.spider import spider from persepolis.constants import VERSION, OS from functools import partial from time import time from random import random, randint from copy import deepcopy import yt_dlp as youtube_dl import urllib import re import os import glob import platform # write youtube_dl version in log logger.sendToLog('yt-dlp version: ' + str(youtube_dl.version.__version__), 'INITIALIZATION') # download manager config folder . config_folder = determineConfigFolder() # persepolis tmp folder path persepolis_tmp = os.path.join(config_folder, 'persepolis_tmp') os_type = platform.system() home_address = os.path.expanduser("~") if os_type is OS.WINDOWS: tmp_folder_system = os.path.join(home_address, "AppData", "Local", "Temp") # make tmp folder if not exists osCommands.makeDirs(tmp_folder_system) else: tmp_folder_system = '/tmp' class MediaListFetcherThread(QThread): RESULT = Signal(dict) cookies = '# HTTP cookie file.\n' # We shall write it in a file when thread starts. LOADCOOKIEFILESIGNAL = Signal(str) THUMBNAILSIGNAL = Signal(str) def __init__(self, receiver_slot, video_dict, main_window): super().__init__() self.RESULT.connect(receiver_slot) self.video_dict = video_dict self.cookie_path = os.path.join(persepolis_tmp, '.{}{}'.format(time(), random())) # check certificate if str(main_window.persepolis_setting.value('settings/dont-check-certificate')) == 'yes': self.dont_check_certificate = True else: self.dont_check_certificate = False # youtube options must be added to youtube_dl_options_dict in dictionary format self.youtube_dl_options_dict = {'dump_single_json': True, 'quiet': True, 'noplaylist': True, 'no_warnings': True, 'no-check-certificates': self.dont_check_certificate } # create random name for thumbnail self.thumbnail_file_name = str(randint(0, 1500)) # file must be downloaded in temp folder of system self.thumbnail_path = os.path.join(tmp_folder_system, self.thumbnail_file_name) self.youtube_dl_options_dict_thumbnails = {'skip_download': True, 'quiet': True, 'writethumbnail': True, 'outtmpl': self.thumbnail_path, } # cookies self.youtube_dl_options_dict['cookies'] = str(self.cookie_path) self.youtube_dl_options_dict_thumbnails['cookies'] = str(self.cookie_path) # referer if 'referer' in video_dict.keys() and video_dict['referer']: self.youtube_dl_options_dict['referer'] = str(video_dict['referer']) self.youtube_dl_options_dict_thumbnails['referer'] = str(video_dict['referer']) # user_agent if 'user_agent' in video_dict.keys() and video_dict['user_agent']: self.youtube_dl_options_dict['user-agent'] = str(video_dict['user_agent']) self.youtube_dl_options_dict_thumbnails['user-agent'] = str(video_dict['user_agent']) else: # set PersepolisDM user agent video_dict['user_agent'] = 'PersepolisDM/' + str(VERSION.version_str) self.youtube_dl_options_dict['user-agent'] = 'PersepolisDM/' + str(VERSION.version_str) self.youtube_dl_options_dict_thumbnails['user-agent'] = 'PersepolisDM/' + str(VERSION.version_str) # load_cookies if 'load_cookies' in video_dict.keys() and video_dict['load_cookies']: # We need to convert raw cookies to http cookie file to use with youtube-dl. self.cookies = self.makeHttpCookie(video_dict['load_cookies']) # Proxy if video_dict['ip']: # ip + port ip_port = '{}:{}'.format(video_dict['ip'], str(video_dict['port'])) if video_dict['proxy_user']: proxy_argument = '{}://{}:{}@{}'.format(video_dict['proxy_type'], video_dict['proxy_user'], video_dict['proxy_passwd'], ip_port) else: proxy_argument = '{}://{}'.format(video_dict['proxy_type'], ip_port) self.youtube_dl_options_dict['proxy'] = str(proxy_argument) self.youtube_dl_options_dict_thumbnails['proxy'] = str(proxy_argument) if video_dict['download_user']: self.youtube_dl_options_dict['username'] = str(video_dict['download_user']) self.youtube_dl_options_dict['password'] = str(video_dict['download_passwd']) self.youtube_dl_options_dict_thumbnails['username'] = str(video_dict['download_user']) self.youtube_dl_options_dict_thumbnails['password'] = str(video_dict['download_passwd']) if video_dict['link']: self.youtube_link = str(video_dict['link']) def run(self): ret_val = {} try: # Create cookie file cookie_file = open(self.cookie_path, 'w') cookie_file.write(self.cookies) cookie_file.close() ydl = youtube_dl.YoutubeDL(self.youtube_dl_options_dict) with ydl: result = ydl.extract_info( self.youtube_link, download=False ) # write new cookies to cookie file ydl.cookiejar.save(filename=self.cookie_path) error = "error" # Or comment out this line to show full stderr. if result: ret_val = result else: ret_val = {'error': str(error)} try: osCommands.remove(self.cookie_path) except Exception as ex: logger.sendToLog(ex, "DOWNLOAD ERROR") except Exception as ex: ret_val = {'error': str(ex)} try: osCommands.remove(self.cookie_path) except Exception as ex: logger.sendToLog(ex, "DOWNLOAD ERROR") try: # get video thumbnail ydl_thumbnail = youtube_dl.YoutubeDL(self.youtube_dl_options_dict_thumbnails) with ydl_thumbnail: result = ydl_thumbnail.download( self.youtube_link ) # find thumbnail name with file extension # we know the file name but we don't know file extension. # create pattern file_pattern = self.thumbnail_path + '*' # search for pattern and return first item in the list files_list = glob.glob(file_pattern) self.THUMBNAILSIGNAL.emit(files_list[0]) except Exception as ex: ex = 'Thumbnail error:' + str(ex) logger.sendToLog(ex, "DOWNLOAD ERROR") self.LOADCOOKIEFILESIGNAL.emit(self.cookie_path) self.RESULT.emit(ret_val) def makeHttpCookie(self, raw_cookie, host_name='.youtube.com'): cookies = '# HTTP cookie file.\n' if raw_cookie: try: raw_cookies = re.split(';\\s*', str(raw_cookie)) # Format all cookie values as netscape cookie. for c in raw_cookies: key, val = c.split('=', 1) cookies = cookies + '{}\tTRUE\t/\tFALSE\t{}\t{}\t{}\n'. \ format(host_name, int(time()) + 259200, key, val) # Expires after 3 days. except Exception: pass return cookies class FileSizeFetcherThread(QThread): FOUND = Signal(dict) def __init__(self, dictionary, text, combobox_type, index): super().__init__() self.dictionary = dictionary self.text = text self.combobox_type = combobox_type self.index = index def run(self): spider_file_size = spider(self.dictionary)[1] self.FOUND.emit({'text': self.text, 'file_size': spider_file_size, 'combobox_type': self.combobox_type, 'index': self.index}) class VideoFinderAddLink(AddLinkWindow): running_thread = None threadPool = {} def __init__(self, parent, receiver_slot, settings, video_dict={}): super().__init__(parent, receiver_slot, settings, video_dict) self.setWindowTitle(QCoreApplication.translate("ytaddlink_src_ui_tr", 'Video Finder')) self.size_label.hide() # empty lists for no_audio and no_video and video_audio files self.no_audio_list = [] self.no_video_list = [] self.video_audio_list = [] self.cookie_path = None self.thumbnail_path = '' self.media_title = '' # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) # extension_label self.extension_label = QLabel(self.link_frame) self.change_name_horizontalLayout.addWidget(self.extension_label) # Fetch Button self.url_submit_pushButtontton = QPushButton(self.link_frame) self.link_horizontalLayout.addWidget(self.url_submit_pushButtontton) # Status Box self.status_box_textEdit = QTextEdit(self.link_frame) self.status_box_textEdit.setMaximumHeight(150) self.link_verticalLayout.addWidget(self.status_box_textEdit) # Select format horizontal layout select_format_horizontalLayout = QHBoxLayout() # Selection Label self.select_format_label = QLabel(self.link_frame) select_format_horizontalLayout.addWidget(self.select_format_label) # Selection combobox self.media_comboBox = QComboBox(self.link_frame) self.media_comboBox.setMinimumWidth(200) select_format_horizontalLayout.addWidget(self.media_comboBox) # Duration label self.duration_label = QLabel(self.link_frame) select_format_horizontalLayout.addWidget(self.duration_label) self.format_selection_frame = QFrame(self) self.format_selection_frame.setLayout(select_format_horizontalLayout) self.link_verticalLayout.addWidget(self.format_selection_frame) # advanced_format_selection_checkBox self.advanced_format_selection_checkBox = QCheckBox(self) self.link_verticalLayout.addWidget(self.advanced_format_selection_checkBox) # advanced_format_selection_frame self.advanced_format_selection_frame = QFrame(self) self.link_verticalLayout.addWidget(self.advanced_format_selection_frame) advanced_format_selection_horizontalLayout = QHBoxLayout(self.advanced_format_selection_frame) # video_format_selection self.video_format_selection_label = QLabel(self.advanced_format_selection_frame) self.video_format_selection_comboBox = QComboBox(self.advanced_format_selection_frame) # audio_format_selection self.audio_format_selection_label = QLabel(self.advanced_format_selection_frame) self.audio_format_selection_comboBox = QComboBox(self.advanced_format_selection_frame) for widget in [self.video_format_selection_label, self.video_format_selection_comboBox, self.audio_format_selection_label, self.audio_format_selection_comboBox]: advanced_format_selection_horizontalLayout.addWidget(widget) # thumbnail picture self.thumbnail_label = QLabel(self.link_frame) self.change_name_horizontalLayout.addWidget(self.thumbnail_label) # Set Texts self.url_submit_pushButtontton.setText(QCoreApplication.translate("ytaddlink_src_ui_tr", 'Fetch Media List')) self.select_format_label.setText(QCoreApplication.translate("ytaddlink_src_ui_tr", 'Select a format')) self.video_format_selection_label.setText(QCoreApplication.translate("ytaddlink_src_ui_tr", 'Video format:')) self.audio_format_selection_label.setText(QCoreApplication.translate("ytaddlink_src_ui_tr", 'Audio format:')) self.advanced_format_selection_checkBox.setText( QCoreApplication.translate("ytaddlink_src_ui_tr", 'Advanced options')) # Add Slot Connections self.url_submit_pushButtontton.setEnabled(False) self.change_name_lineEdit.setEnabled(False) self.ok_pushButton.setEnabled(False) self.download_later_pushButton.setEnabled(False) self.format_selection_frame.setEnabled(True) self.advanced_format_selection_frame.setEnabled(False) self.advanced_format_selection_checkBox.toggled.connect(self.advancedFormatFrame) self.url_submit_pushButtontton.clicked.connect(self.submitClicked) self.media_comboBox.activated.connect( partial(self.mediaSelectionChanged, 'video_audio')) self.video_format_selection_comboBox.activated.connect( partial(self.mediaSelectionChanged, 'video')) self.audio_format_selection_comboBox.activated.connect( partial(self.mediaSelectionChanged, 'audio')) self.link_lineEdit.textChanged.disconnect(super().linkLineChanged) # Should be disconnected. self.link_lineEdit.textChanged.connect(self.linkLineChangedHere) self.setMinimumSize(650, 480) # set window size and position size = self.persepolis_setting.value( 'VideoFinderAddLinkWindow/size', QSize(652, 480)) position = self.persepolis_setting.value( 'VideoFinderAddLinkWindow/position', QPoint(300, 300)) self.resize(size) self.move(position) self.status_box_textEdit.hide() self.format_selection_frame.hide() self.advanced_format_selection_frame.hide() self.advanced_format_selection_checkBox.hide() if 'link' in video_dict.keys() and video_dict['link']: self.link_lineEdit.setText(video_dict['link']) self.url_submit_pushButtontton.setEnabled(True) else: # check clipboard clipboard = QApplication.clipboard() text = clipboard.text() if (("tp:/" in text[2:6]) or ("tps:/" in text[2:7])): self.link_lineEdit.setText(str(text)) self.url_submit_pushButtontton.setEnabled(True) def advancedFormatFrame(self, button): if self.advanced_format_selection_checkBox.isChecked(): self.advanced_format_selection_frame.setEnabled(True) self.format_selection_frame.setEnabled(False) self.mediaSelectionChanged('video', int(self.video_format_selection_comboBox.currentIndex())) else: self.advanced_format_selection_frame.setEnabled(False) self.format_selection_frame.setEnabled(True) self.mediaSelectionChanged('video_audio', int(self.media_comboBox.currentIndex())) def getReadableSize(self, size): try: return '{:1.2f} MB'.format(int(size) / 1048576) except Exception: return str(size) def getReadableDuration(self, seconds): try: seconds = int(seconds) hours = seconds // 3600 seconds = seconds % 3600 minutes = seconds // 60 seconds = seconds % 60 return '{:02d}:{:02d}:{:02d}'.format(hours, minutes, seconds) except Exception: return str(seconds) # Define native slots def urlChanged(self, value): if ' ' in value or value == '': self.url_submit_pushButtontton.setEnabled(False) self.url_submit_pushButtontton.setToolTip(QCoreApplication.translate( "ytaddlink_src_ui_tr", 'Please enter a valid video link')) else: self.url_submit_pushButtontton.setEnabled(True) self.url_submit_pushButtontton.setToolTip('') def submitClicked(self, button=None): # Clear media list self.media_comboBox.clear() self.format_selection_frame.hide() self.advanced_format_selection_checkBox.hide() self.advanced_format_selection_frame.hide() self.video_format_selection_comboBox.clear() self.audio_format_selection_comboBox.clear() self.change_name_lineEdit.clear() self.threadPool.clear() self.change_name_checkBox.setChecked(False) self.video_audio_list.clear() self.no_video_list.clear() self.no_audio_list.clear() self.url_submit_pushButtontton.setEnabled(False) self.status_box_textEdit.setText(QCoreApplication.translate("ytaddlink_src_ui_tr", 'Fetching Media Info...')) self.status_box_textEdit.show() self.ok_pushButton.setEnabled(False) self.download_later_pushButton.setEnabled(False) dictionary_to_send = deepcopy(self.plugin_add_link_dictionary) # More options more_options = self.collectMoreOptions() for k in more_options.keys(): dictionary_to_send[k] = more_options[k] dictionary_to_send['link'] = self.link_lineEdit.text() dictionary_to_send['socket-timeout'] = '5' fetcher_thread = MediaListFetcherThread(self.fetchedResult, dictionary_to_send, self.parent) self.parent.threadPool.append(fetcher_thread) self.parent.threadPool[-1].start() self.parent.threadPool[-1].LOADCOOKIEFILESIGNAL.connect(self.setLoadCookie) self.parent.threadPool[-1].THUMBNAILSIGNAL.connect(self.showThumbnail) # Thumbnail is available! So show it! def showThumbnail(self, thumbnail_path): self.thumbnail_path = thumbnail_path pixmap = QPixmap(self.thumbnail_path) # Thumbnail height must be 1/5 height of window. height_of_window = self.height() self.thumbnail_label.setPixmap(pixmap.scaledToHeight(height_of_window // 5)) def setLoadCookie(self, str): if os.path.isfile(str): self.cookie_path = str self.load_cookies_lineEdit.setText(str) def fileNameChanged(self, value): if value.strip() == '': self.ok_pushButton.setEnabled(False) def mediaSelectionChanged(self, combobox, index): try: if combobox == 'video_audio': if self.media_comboBox.currentText() == 'Best quality': self.change_name_lineEdit.setText(self.media_title) self.extension_label.setText('.' + self.no_audio_list[-1]['ext']) else: self.change_name_lineEdit.setText(self.media_title) self.extension_label.setText('.' + self.video_audio_list[index]['ext']) self.change_name_checkBox.setChecked(True) elif combobox == 'video': if self.video_format_selection_comboBox.currentText() != 'No video': self.change_name_lineEdit.setText(self.media_title) self.extension_label.setText('.' + self.no_audio_list[index - 1]['ext']) self.change_name_checkBox.setChecked(True) else: if self.audio_format_selection_comboBox.currentText() != 'No audio': self.change_name_lineEdit.setText(self.media_title) self.extension_label.setText('.' + self.no_video_list[int(self.audio_format_selection_comboBox.currentIndex()) - 1]['ext']) self.change_name_checkBox.setChecked(True) else: self.change_name_lineEdit.setChecked(False) elif combobox == 'audio': if self.audio_format_selection_comboBox.currentText() != 'No audio' and self.video_format_selection_comboBox.currentText() == 'No video': self.change_name_lineEdit.setText(self.media_title) self.extension_label.setText('.' + self.no_video_list[index - 1]['ext']) self.change_name_checkBox.setChecked(True) elif (self.audio_format_selection_comboBox.currentText() == 'No audio' and self.video_format_selection_comboBox.currentText() != 'No video') or (self.audio_format_selection_comboBox.currentText() != 'No audio' and self.video_format_selection_comboBox.currentText() != 'No video'): self.change_name_lineEdit.setText(self.media_title) self.extension_label.setText('.' + self.no_audio_list[int(self.video_format_selection_comboBox.currentIndex()) - 1]['ext']) self.change_name_checkBox.setChecked(True) elif self.audio_format_selection_comboBox.currentText() == 'No audio' and self.video_format_selection_comboBox.currentText() == 'No video': self.change_name_checkBox.setChecked(False) except Exception as ex: logger.sendToLog(ex, "DOWNLOAD ERROR") # Return the filename extension from url, or ''. def getFileExtension(self, url): parsed = urllib.parse.urlparse(url) root, ext = os.path.splitext(parsed.path) return ext[1:] def fetchedResult(self, media_dict): if 'error' in media_dict.keys(): self.status_box_textEdit.setText('' + str(media_dict['error']) + '') self.status_box_textEdit.show() # enable fetch media button again self.url_submit_pushButtontton.setEnabled(True) else: # Show the media list # add no audio and no video options to the comboboxes self.video_format_selection_comboBox.addItem('No video') self.audio_format_selection_comboBox.addItem('No audio') # set first 20 characters of media_title for file name if 'title' in media_dict.keys(): if len(media_dict['title']) > 20: self.media_title = media_dict['title'][0:20] else: self.media_title = 'Video finder' if 'formats' not in media_dict.keys() and 'entries' in media_dict.keys(): formats = media_dict['entries'] formats = formats[0] media_dict['formats'] = formats['formats'] elif 'formats' not in media_dict.keys() and 'format' in media_dict.keys(): media_dict['formats'] = [media_dict.copy()] try: i = 0 media_dict_lenght = len(media_dict['formats']) for f in media_dict['formats']: url_ext = self.getFileExtension(f['url']) no_audio = False no_video = False text = '' # set http_headers if 'http_headers' in f.keys(): header_dict = f['http_headers'] if 'User-Agent' in header_dict.keys(): self.user_agent_lineEdit.setText(header_dict['User-Agent']) self.plugin_add_link_dictionary['user-agent'] = header_dict['User-Agent'] header_dict.pop('User-Agent') if 'Referer' in header_dict.keys(): self.referer_lineEdit.setText(header_dict['Referer']) self.plugin_add_link_dictionary['referer'] = header_dict['Referer'] header_dict.pop('Referer') self.plugin_add_link_dictionary['header'] = dictToHeader(header_dict) self.header_lineEdit.setText(self.plugin_add_link_dictionary['header']) if 'acodec' in f.keys(): # only video, no audio if f['acodec'] == 'none': no_audio = True # resolution if 'height' in f.keys(): text = text + ' ' + '{}p'.format(f['height']) if 'vcodec' in f.keys(): # if f['vcodec'] == 'none' and f['acodec'] != 'none': # continue # No video, show audio bit rate if f['vcodec'] == 'none': text = text + '{}kbps'.format(f['abr']) no_video = True if 'ext' in f.keys(): text = text + ' ' + '.{}'.format(f['ext']) if 'filesize' in f.keys() and f['filesize']: # Youtube api does not supply file size for some formats, so check it. text = text + ' ' + '{}'.format(self.getReadableSize(f['filesize'])) size_available = True else: # Start spider to find file size size_available = False input_dict = deepcopy(self.plugin_add_link_dictionary) input_dict['link'] = f['url'] more_options = self.collectMoreOptions() for key in more_options.keys(): input_dict[key] = more_options[key] if url_ext == 'm3u8': text = text + ' m3u8' # Add current format to the related comboboxes if no_audio: combobox_type = 'video' self.no_audio_list.append(f) self.video_format_selection_comboBox.addItem(text) index = self.video_format_selection_comboBox.count() - 1 elif no_video: combobox_type = 'audio' self.no_video_list.append(f) self.audio_format_selection_comboBox.addItem(text) index = self.audio_format_selection_comboBox.count() - 1 else: if i == 0 and (media_dict_lenght > 1): text = 'Worst quality: ' + text elif i == (media_dict_lenght - 1): text = 'Best quality: ' + text combobox_type = 'media' self.video_audio_list.append(f) self.media_comboBox.addItem(text) index = self.media_comboBox.count() - 1 # we can't get size of file from m3u8 format. if not (size_available) and url_ext != 'm3u8': size_fetcher = FileSizeFetcherThread(input_dict, text, combobox_type, index) self.threadPool[str(i)] = {'thread': size_fetcher, 'item_id': i} self.parent.threadPool.append(size_fetcher) self.parent.threadPool[-1].start() self.parent.threadPool[-1].FOUND.connect(self.findFileSize) i = i + 1 self.status_box_textEdit.hide() if 'duration' in media_dict.keys(): self.duration_label.setText('Duration ' + self.getReadableDuration(media_dict['duration'])) self.format_selection_frame.show() self.advanced_format_selection_checkBox.show() self.advanced_format_selection_frame.show() self.ok_pushButton.setEnabled(True) self.download_later_pushButton.setEnabled(True) # if we have no options for separate audio and video, then hide advanced_format_selection... if len(self.no_audio_list) == 0 and len(self.no_video_list) == 0: self.advanced_format_selection_checkBox.hide() self.advanced_format_selection_frame.hide() # set index of comboboxes on best available quality. # we have both audio and video if len(self.no_audio_list) != 0 and len(self.no_video_list) != 0: self.media_comboBox.addItem('Best quality') self.media_comboBox.setCurrentIndex(len(self.video_audio_list)) self.change_name_lineEdit.setText(self.media_title) self.extension_label.setText('.' + self.no_audio_list[-1]['ext']) self.change_name_checkBox.setChecked(True) # video and audio are not separate elif len(self.video_audio_list) != 0: self.media_comboBox.setCurrentIndex(len(self.video_audio_list) - 1) self.mediaSelectionChanged('video_audio', int(self.media_comboBox.currentIndex())) if len(self.no_audio_list) != 0: self.video_format_selection_comboBox.setCurrentIndex(len(self.no_audio_list)) if len(self.no_video_list) != 0: self.audio_format_selection_comboBox.setCurrentIndex(len(self.no_video_list)) # if we have only audio or we have only video then hide media_comboBox if len(self.video_audio_list) == 0: self.media_comboBox.hide() self.select_format_label.hide() # only video if len(self.no_video_list) != 0 and len(self.no_audio_list) == 0: self.mediaSelectionChanged('video', int(self.video_format_selection_comboBox.currentIndex())) self.advanced_format_selection_checkBox.setChecked(True) self.advanced_format_selection_checkBox.hide() # only audio elif len(self.no_video_list) == 0 and len(self.no_audio_list) != 0: self.mediaSelectionChanged('audio', int(self.audio_format_selection_comboBox.currentIndex())) self.advanced_format_selection_checkBox.setChecked(True) self.advanced_format_selection_checkBox.hide() # audio and video else: self.mediaSelectionChanged('video_audio', int(self.media_comboBox.currentIndex())) except Exception as ex: logger.sendToLog(ex, "DOWNLOAD ERROR") def findFileSize(self, result): try: index = result['index'] text = result['text'] if result['file_size'] and result['file_size'] != '0': if result['combobox_type'] == 'audio': self.audio_format_selection_comboBox.setItemText(index, '{} - {}'.format(text, result['file_size'])) elif result['combobox_type'] == 'video': self.video_format_selection_comboBox.setItemText(index, '{} - {}'.format(text, result['file_size'])) else: self.media_comboBox.setItemText(index, '{} - {}'.format(text, result['file_size'])) self.video_audio_list[index]['file_size'] = result['file_size'] except Exception as ex: logger.sendToLog(ex, "DOWNLOAD ERROR") def linkLineChangedHere(self, lineEdit): if str(lineEdit) == '': self.url_submit_pushButtontton.setEnabled(False) else: self.url_submit_pushButtontton.setEnabled(True) def closeEvent(self, event): self.persepolis_setting.setValue('VideoFinderAddLinkWindow/size', self.size()) self.persepolis_setting.setValue('VideoFinderAddLinkWindow/position', self.pos()) self.persepolis_setting.sync() osCommands.remove(self.thumbnail_path) event.accept() # This method collects additional information like proxy ip, user, password etc. def collectMoreOptions(self): options = {'ip': None, 'port': None, 'proxy_user': None, 'proxy_passwd': None, 'download_user': None, 'download_passwd': None, 'proxy_type': None, 'load_cookies': None} if self.proxy_checkBox.isChecked(): options['ip'] = self.ip_lineEdit.text() options['port'] = self.port_spinBox.value() options['proxy_user'] = self.proxy_user_lineEdit.text() options['proxy_passwd'] = self.proxy_pass_lineEdit.text() # http, https or socks5 proxy if self.http_radioButton.isChecked() is True: options['proxy_type'] = 'http' elif self.https_radioButton.isChecked() is True: options['proxy_type'] = 'https' else: options['proxy_type'] = 'socks5' if self.download_checkBox.isChecked(): options['download_user'] = self.download_user_lineEdit.text() options['download_passwd'] = self.download_pass_lineEdit.text() if self.load_cookies_lineEdit.text() != '': options['load_cookies'] = self.load_cookies_lineEdit.text() # These info (keys) are required for spider to find file size, because spider() does not check if key exists. additional_info = ['header', 'user_agent', 'referer', 'out'] for i in additional_info: if i not in self.plugin_add_link_dictionary.keys(): options[i] = None return options # user submitted information by pressing ok_pushButton, so get information # from VideoFinderAddLink window and return them to the mainwindow with callback! def okButtonPressed(self, download_later, button=None): # noqa link_list = [] # separate audio format and video format is selected. if self.advanced_format_selection_checkBox.isChecked(): if self.video_format_selection_comboBox.currentText() == 'No video' and self.audio_format_selection_comboBox.currentText() != 'No audio': # only audio link must be added to the link_list audio_link = self.no_video_list[self.audio_format_selection_comboBox.currentIndex() - 1]['url'] link_list.append(audio_link) elif self.video_format_selection_comboBox.currentText() != 'No video' and self.audio_format_selection_comboBox.currentText() == 'No audio': # only video link must be added to the link_list video_link = self.no_audio_list[self.video_format_selection_comboBox.currentIndex() - 1]['url'] link_list.append(video_link) elif self.video_format_selection_comboBox.currentText() != 'No video' and self.audio_format_selection_comboBox.currentText() != 'No audio': # video and audio links must be added to the link_list audio_link = self.no_video_list[self.audio_format_selection_comboBox.currentIndex() - 1]['url'] video_link = self.no_audio_list[self.video_format_selection_comboBox.currentIndex() - 1]['url'] link_list = [video_link, audio_link] elif self.video_format_selection_comboBox.currentText() == 'No video' and self.audio_format_selection_comboBox.currentText() == 'No audio': # no video and audio is selected! REALLY?!. user is DRUNK! close the window! :)) self.close() else: if self.media_comboBox.currentText() == 'Best quality': # the last item in no_video_list and no_audio_list are the best. video_link = self.no_audio_list[-1]['url'] audio_link = self.no_video_list[-1]['url'] link_list = [video_link, audio_link] else: audio_and_video_link = self.video_audio_list[self.media_comboBox.currentIndex()]['url'] link_list.append(audio_and_video_link) # write user's new inputs in persepolis_setting for next time :) self.persepolis_setting.setValue( 'add_link_initialization/ip', self.ip_lineEdit.text()) self.persepolis_setting.setValue( 'add_link_initialization/port', self.port_spinBox.value()) self.persepolis_setting.setValue( 'add_link_initialization/proxy_user', self.proxy_user_lineEdit.text()) self.persepolis_setting.setValue( 'add_link_initialization/download_user', self.download_user_lineEdit.text()) # http, https or socks5 proxy if self.http_radioButton.isChecked() is True: proxy_type = 'http' self.persepolis_setting.setValue( 'add_link_initialization/proxy_type', 'http') elif self.https_radioButton.isChecked() is True: proxy_type = 'https' self.persepolis_setting.setValue( 'add_link_initialization/proxy_type', 'https') else: proxy_type = 'socks5' self.persepolis_setting.setValue( 'add_link_initialization/proxy_type', 'socks5') # get proxy information if not (self.proxy_checkBox.isChecked()): ip = None port = None proxy_user = None proxy_passwd = None proxy_type = None else: ip = self.ip_lineEdit.text() if not (ip): ip = None port = self.port_spinBox.value() if not (port): port = None proxy_user = self.proxy_user_lineEdit.text() if not (proxy_user): proxy_user = None proxy_passwd = self.proxy_pass_lineEdit.text() if not (proxy_passwd): proxy_passwd = None # get download username and password information if not (self.download_checkBox.isChecked()): download_user = None download_passwd = None else: download_user = self.download_user_lineEdit.text() if not (download_user): download_user = None download_passwd = self.download_pass_lineEdit.text() if not (download_passwd): download_passwd = None # get start time for download if user set that. if not (self.start_checkBox.isChecked()): start_time = None else: start_time = self.start_time_qDataTimeEdit.text() # get end time for download if user set that. if not (self.end_checkBox.isChecked()): end_time = None else: end_time = self.end_time_qDateTimeEdit.text() # set name for file(s) if self.change_name_checkBox.isChecked(): name = str(self.change_name_lineEdit.text()) if name == '': name = 'video_finder_file' else: name = 'video_finder_file' # video finder always finds extension # but if it can't find file extension # use mp4 for extension. if str(self.extension_label.text()) == '': extension = '.mp4' else: extension = str(self.extension_label.text()) # did user select separate audio and video? if len(link_list) == 2: video_name = name + "_video" + extension audio_name = name + "_audio" + '.' + \ str(self.no_video_list[self.audio_format_selection_comboBox.currentIndex() - 1]['ext']) name_list = [video_name, audio_name] else: name_list = [name + extension] # get number of connections connections = self.connections_spinBox.value() # get download_path download_path = self.download_folder_lineEdit.text() # referer if self.referer_lineEdit.text() != '': referer = self.referer_lineEdit.text() else: referer = self.link_lineEdit.text() # header if self.header_lineEdit.text() != '': header = self.header_lineEdit.text() else: header = None # user_agent if self.user_agent_lineEdit.text() != '': user_agent = self.user_agent_lineEdit.text() else: user_agent = None # load_cookies if self.load_cookies_lineEdit.text() != '': load_cookies = self.load_cookies_lineEdit.text() else: load_cookies = None add_link_dictionary_list = [] if len(link_list) == 1: # save information in a dictionary(add_link_dictionary). add_link_dictionary = {'referer': referer, 'header': header, 'user_agent': user_agent, 'load_cookies': load_cookies, 'out': name_list[0], 'start_time': start_time, 'end_time': end_time, 'link': link_list[0], 'ip': ip, 'port': port, 'proxy_user': proxy_user, 'proxy_passwd': proxy_passwd, 'proxy_type': proxy_type, 'download_user': download_user, 'download_passwd': download_passwd, 'connections': connections, 'limit_value': 10, 'download_path': download_path} add_link_dictionary_list.append(add_link_dictionary) else: video_add_link_dictionary = {'referer': referer, 'header': header, 'user_agent': user_agent, 'load_cookies': load_cookies, 'out': name_list[0], 'start_time': start_time, 'end_time': end_time, 'link': link_list[0], 'ip': ip, 'port': port, 'proxy_user': proxy_user, 'proxy_passwd': proxy_passwd, 'proxy_type': proxy_type, 'download_user': download_user, 'download_passwd': download_passwd, 'connections': connections, 'limit_value': 10, 'download_path': download_path} audio_add_link_dictionary = {'referer': referer, 'header': header, 'user_agent': user_agent, 'load_cookies': load_cookies, 'out': name_list[1], 'start_time': None, 'end_time': end_time, 'link': link_list[1], 'ip': ip, 'port': port, 'proxy_user': proxy_user, 'proxy_passwd': proxy_passwd, 'proxy_type': proxy_type, 'download_user': download_user, 'download_passwd': download_passwd, 'connections': connections, 'limit_value': 10, 'download_path': download_path} add_link_dictionary_list = [video_add_link_dictionary, audio_add_link_dictionary] # get category of download category = str(self.add_queue_comboBox.currentText()) del self.plugin_add_link_dictionary # return information to mainwindow self.callback(add_link_dictionary_list, download_later, category) # close window self.close() ================================================ FILE: persepolis/scripts/video_finder_progress.py ================================================ # -*- coding: utf-8 -*- # 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 . try: from PySide6.QtCore import Qt, QSize, QPoint, QThread, QTranslator, QCoreApplication, QLocale from PySide6.QtWidgets import QLineEdit, QInputDialog from PySide6.QtGui import QIcon except ImportError: from PyQt5.QtCore import Qt, QSize, QPoint, QThread, QTranslator, QCoreApplication, QLocale from PyQt5.QtWidgets import QLineEdit, QInputDialog from PyQt5.QtGui import QIcon from persepolis.constants import OS from persepolis.gui.video_finder_progress_ui import VideoFinderProgressWindow_Ui from persepolis.scripts.shutdown import shutDown import subprocess import platform os_type = platform.system() class ShutDownThread(QThread): def __init__(self, parent, category, password=None): QThread.__init__(self) self.category = category self.password = password self.main_window = parent def run(self): shutDown(self.main_window, category=self.category, password=self.password) class VideoFinderProgressWindow(VideoFinderProgressWindow_Ui): def __init__(self, parent, gid_list, persepolis_setting): super().__init__(persepolis_setting, parent) self.persepolis_setting = persepolis_setting self.main_window = parent # first item in the gid_list is related to video's link and second item is related to audio's link. self.gid_list = gid_list # this variable can be changed by checkDownloadInfo method in mainwindow.py # self.gid defines that which gid is downloaded. self.gid = gid_list[0] # this variable used as category name in ShutDownThread self.video_finder_plus_gid = 'video_finder_' + str(gid_list[0]) # connect signals and sluts self.resume_pushButton.clicked.connect(self.resumePushButtonPressed) self.stop_pushButton.clicked.connect(self.stopPushButtonPressed) self.pause_pushButton.clicked.connect(self.pausePushButtonPressed) self.download_progressBar.setValue(0) self.after_frame.setEnabled(False) self.after_checkBox.toggled.connect(self.afterCheckBoxToggled) self.after_pushButton.clicked.connect(self.afterPushButtonPressed) # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) self.after_comboBox.currentIndexChanged.connect(self.afterComboBoxChanged) # speed limit self.limit_dial.setValue(10) self.limit_dial.sliderReleased.connect(self.limitDialIsReleased) self.limit_dial.valueChanged.connect(self.limitDialIsChanged) self.limit_label.setText('Speed : Maximum') # set window size and position size = self.persepolis_setting.value( 'ProgressWindow/size', QSize(595, 274)) position = self.persepolis_setting.value( 'ProgressWindow/position', QPoint(300, 300)) self.resize(size) self.move(position) # close window with ESC key def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.close() def closeEvent(self, event): # save window size and position self.persepolis_setting.setValue('ProgressWindow/size', self.size()) self.persepolis_setting.setValue('ProgressWindow/position', self.pos()) self.persepolis_setting.sync() self.hide() def resumePushButtonPressed(self, button): if self.status == "paused": # search gid in download_sessions_list for download_session_dict in self.main_window.download_sessions_list: if download_session_dict['gid'] == self.gid: # unpause download download_session_dict['download_session'].downloadUnpause() break def pausePushButtonPressed(self, button): if self.status == "downloading": # search gid in download_sessions_list for download_session_dict in self.main_window.download_sessions_list: if download_session_dict['gid'] == self.gid: # unpause download download_session_dict['download_session'].downloadPause() break def stopPushButtonPressed(self, button): # cancel shut down progress dictionary = {'category': self.video_finder_plus_gid, 'shutdown': 'canceled'} self.main_window.temp_db.updateQueueTable(dictionary) if self.status == "downloading": # search gid in download_sessions_list for download_session_dict in self.main_window.download_sessions_list: if download_session_dict['gid'] == self.gid: # unpause download download_session_dict['download_session'].downloadStop() break def afterComboBoxChanged(self, connect): self.after_pushButton.setEnabled(True) def afterCheckBoxToggled(self, checkBoxes): if self.after_checkBox.isChecked(): self.after_frame.setEnabled(True) self.after_pushButton.setEnabled(True) else: # so user canceled shutdown after download # write cancel value in data_base for this gid dictionary = {'category': self.video_finder_plus_gid, 'shutdown': 'canceled'} self.main_window.temp_db.updateQueueTable(dictionary) def afterPushButtonPressed(self, button): self.after_pushButton.setEnabled(False) # For Linux and Mac OSX and FreeBSD and OpenBSD if os_type != OS.WINDOWS: # get root password passwd, ok = QInputDialog.getText( self, 'PassWord', 'Please enter root password:', QLineEdit.Password) if ok: # check password is true or not! pipe = subprocess.Popen(['sudo', '-S', 'echo', 'hello'], stdout=subprocess.DEVNULL, stdin=subprocess.PIPE, stderr=subprocess.DEVNULL, shell=False) pipe.communicate(passwd.encode()) answer = pipe.wait() # Wrong password while answer != 0: passwd, ok = QInputDialog.getText( self, 'PassWord', 'Wrong Password!\nPlease try again.', QLineEdit.Password) if ok: pipe = subprocess.Popen(['sudo', '-S', 'echo', 'hello'], stdout=subprocess.DEVNULL, stdin=subprocess.PIPE, stderr=subprocess.DEVNULL, shell=False) pipe.communicate(passwd.encode()) answer = pipe.wait() else: ok = False self.after_pushButton.setEnabled(True) break if ok is not False: # if user selects shutdown option after download progress, # value of 'shutdown' will changed in temp_db for this progress # and "wait" word will be written for this value. # (see ShutDownThread and shutdown.py for more information) # shutDown method will check that value in a loop . # when "wait" changes to "shutdown" then shutdown.py script # will shut down the system. shutdown_enable = ShutDownThread(self.main_window, self.video_finder_plus_gid, passwd) self.main_window.threadPool.append(shutdown_enable) self.main_window.threadPool[-1].start() else: self.after_checkBox.setChecked(False) else: self.after_checkBox.setChecked(False) else: # for Windows for gid in self.gid_list: shutdown_enable = ShutDownThread(self.main_window, self.video_finder_plus_gid) self.main_window.threadPool.append(shutdown_enable) self.main_window.threadPool[-1].start() def limitDialIsReleased(self): limit_value = self.limit_dial.value() # set speed limit value for download_session_dict in self.main_window.download_sessions_list: if download_session_dict['gid'] == self.gid: # limit download speed download_session_dict['download_session'].limitSpeed(limit_value) break def limitDialIsChanged(self, button): if self.limit_dial.value() == 10: self.limit_label.setText('Speed : Maximum') elif self.limit_dial.value() == 0: self.limit_label.setText('Speed : Minimum') else: self.limit_label.setText('Speed') def changeIcon(self, icons): icons = ':/' + str(icons) + '/' self.resume_pushButton.setIcon(QIcon(icons + 'play')) self.pause_pushButton.setIcon(QIcon(icons + 'pause')) self.stop_pushButton.setIcon(QIcon(icons + 'stop')) ================================================ FILE: persepolis/scripts/ytdlp_downloader.py ================================================ # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import yt_dlp import time import threading from persepolis.constants import VERSION from persepolis.scripts import logger from persepolis.scripts.useful_tools import humanReadableSize, convertTime, returnNewFileName from persepolis.scripts.osCommands import makeDirs, moveFile from urllib.parse import urlparse, unquote from pathlib import Path import os # This class gets yt-dlp log messages. # see yt-dlp man page for more information. class Ytdp_Logger(): def debug(self, msg): # For compatibility with youtube-dl, both debug and info are passed into debug # You can distinguish them by the prefix '[debug] ' if msg.startswith('[debug] '): logger.sendToLog(msg, type="DEBUG") else: self.info(msg) # Normally, It's not necessary! def info(self, msg): pass def warning(self, msg): logger.sendToLog(msg, type="WARNING") def error(self, msg): logger.sendToLog(msg, type="ERROR") # This class downloads m3u8 format files. class Ytdp_Download(): def __init__(self, add_link_dictionary, main_window, gid, single_video_link=False): self.downloaded_size = 0 self.finished_threads = 0 self.eta = "0" self.resume = False self.main_window = main_window self.download_speed_str = "0" self.gid = gid self.link = add_link_dictionary['link'] self.name = add_link_dictionary['out'] self.download_path = add_link_dictionary['download_path'] self.ip = add_link_dictionary['ip'] self.port = add_link_dictionary['port'] self.proxy_user = add_link_dictionary['proxy_user'] self.proxy_passwd = add_link_dictionary['proxy_passwd'] self.proxy_type = add_link_dictionary['proxy_type'] self.download_user = add_link_dictionary['download_user'] self.download_passwd = add_link_dictionary['download_passwd'] self.header = add_link_dictionary['header'] self.user_agent = add_link_dictionary['user_agent'] self.load_cookies = add_link_dictionary['load_cookies'] self.referer = add_link_dictionary['referer'] self.start_time = add_link_dictionary['start_time'] self.end_time = add_link_dictionary['end_time'] self.number_of_parts = 0 self.process = None self.file_name = None self.file_size = None self.timeout = int(main_window.persepolis_setting.value('settings/timeout')) self.retry = int(main_window.persepolis_setting.value('settings/max-tries')) self.retry_wait = int(main_window.persepolis_setting.value('settings/retry-wait')) self.python_request_chunk_size = int(main_window.persepolis_setting.value('settings/chunk-size')) self.lock = False self.sleep_for_speed_limiting = 0 self.not_converted_download_speed = 0 self.download_percent = 0 self.error_message = '' self.single_video_link = single_video_link self.yt_dlp_exited = False # this flag notify that download finished(stopped, complete or error) # in this situation download status must be written to the database # None means, Download not finished yet. # False meanse, Download has been finished, but download status must be written to the database # True meanse, Download status has been written to the database self.write_it_to_the_database = None # check certificate if str(main_window.persepolis_setting.value('settings/dont-check-certificate')) == 'yes': self.dont_check_certificate = True else: self.dont_check_certificate = False # number_of_threads can't be more that 64 self.number_of_threads = int(add_link_dictionary['connections']) self.fragments = '0/0' self.thread_list = [] # download_status can be in waiting, downloading, stop, error, eaused self.download_status = 'waiting' # update data_base dict_ = {'gid': self.gid, 'download_status': self.download_status} self.main_window.persepolis_db.updateVideoFinderTable2(dict_) # get file name if available # if file name is not available, then set a file name def getFileName(self): # set default file name parsed_linkd = urlparse(self.link) self.file_name = Path(parsed_linkd.path).name # URL might contain percent-encoded characters # for example farsi characters in link if self.file_name.find('%'): self.file_name = unquote(self.file_name) # check if user set file name or not if self.name: self.file_name = self.name # create yt-dlp session def createSession(self): self.getFileName() self.file_path = os.path.join(self.download_path, self.file_name) # youtube options must be added to youtube_dl_options_dict in dictionary format self.youtube_dl_options_dict = {'dump_single_json': True, 'logger': Ytdp_Logger(), 'quiet': True, 'noplaylist': True, 'no_warnings': True, 'no-check-certificates': self.dont_check_certificate, 'retries': self.retry, 'socket_timeout': self.timeout, 'outtmpl': self.file_path, 'continue_dl': True } # cookies self.youtube_dl_options_dict['cookies'] = str(self.load_cookies) # referer if self.referer: self.youtube_dl_options_dict['referer'] = self.referer # user_agent if self.user_agent: self.youtube_dl_options_dict['user-agent'] = self.user_agent else: # set PersepolisDM user agent self.youtube_dl_options_dict['user-agent'] = 'PersepolisDM/' + str(VERSION.version_str) # load_cookies if self.load_cookies: # We need to convert raw cookies to http cookie file to use with youtube-dl. self.youtube_dl_options_dict['cookies'] = self.load_cookies # Proxy if self.ip: # ip + port ip_port = '{}:{}'.format(self.ip, str(self.port)) if self.proxy_user: proxy_argument = '{}://{}:{}@{}'.format(self.proxy_type, self.proxy_user, self.proxy_passwd, ip_port) else: proxy_argument = '{}://{}'.format(self.proxy_type, ip_port) self.youtube_dl_options_dict['proxy'] = str(proxy_argument) if self.download_user: self.youtube_dl_options_dict['username'] = str(self.download_user) self.youtube_dl_options_dict['password'] = str(self.download_passwd) self.youtube_dl_options_dict['progress_hooks'] = [self.getStatus] # crete yt_dlp session self.ytdl_session = yt_dlp.YoutubeDL(self.youtube_dl_options_dict) # This method returns data and time in string format # for example >> 2017/09/09 , 13:12:26 def nowDate(self): date = time.strftime("%Y/%m/%d , %H:%M:%S") return date def sigmaTime(self, time): hour, minute = time.split(":") return (int(hour) * 60 + int(minute)) # nowTime returns now time in HH:MM format! def nowTime(self): now_time = time.strftime("%H:%M") return self.sigmaTime(now_time) # this method creates sleep time,if user sets "start time" for download. def startTime(self): # write some messages logger.sendToLog("Download starts at " + self.start_time + ' - GID: ' + self.gid, "DOWNLOADS") # start_time that specified by user sigma_start = self.sigmaTime(self.start_time) # get current time sigma_now = self.nowTime() # this loop is continuing until download time arrival! while sigma_start != sigma_now and self.download_status == 'scheduled': time.sleep(2.1) sigma_now = self.nowTime() # This method will stop the download when the end_time is reached. def endTime(self): logger.sendToLog("End time is activated: " + self.end_time + ' - GID: ' + self.gid, "DOWNLOADS") sigma_end = self.sigmaTime(self.end_time) # get current time sigma_now = self.nowTime() # while current time is not equal to end_time, continue the loop while sigma_end != sigma_now and (self.download_status == 'downloading' or self.download_status == 'paused'): # get current time sigma_now = self.nowTime() time.sleep(2.1) # Time is up! if (self.download_status == 'downloading' or self.download_status == 'paused'): logger.sendToLog("Time is up! - GID:" + self.gid, "DOWNLOADS") # stop download self.downloadStop() # job is done so change end_time value to None in data_base self.main_window.persepolis_db.setDefaultGidInAddlinkTable(self.gid, end_time=True) # this method runs endTime in a thread. def runEndTimeThread(self): end_time_thread = threading.Thread( target=self.endTime) end_time_thread.setDaemon(True) end_time_thread.start() self.thread_list.append(end_time_thread) def getStatus(self, data): # Download stopped by user! # raise and exception for stopping download! if self.download_status == 'stopped': raise Exception('Download stopped') return if 'filename' in data.keys(): download_path_pluse_name = data['filename'] self.file_name = Path(download_path_pluse_name).name if 'eta' in data.keys(): if data['eta']: self.eta = convertTime(float(data['eta'])) if 'speed' in data.keys(): if data['speed']: download_speed, speed_unit = humanReadableSize(float(data['speed']), 'speed') self.download_speed_str = (str(download_speed) + " " + speed_unit + "/s") if 'downloaded_bytes' in data.keys(): if data['downloaded_bytes']: self.downloaded_size = float(data['downloaded_bytes']) if 'total_bytes_estimate' in data.keys(): if data['total_bytes_estimate']: self.file_size = float(data['total_bytes_estimate']) # some times file_size is not available elif 'downloaded_bytes' in data.keys(): self.file_size = self.downloaded_size try: if 'total_bytes_estimate' in data.keys(): # Calculate download percent self.download_percent = int((self.downloaded_size / self.file_size) * 100) else: self.download_percent = 0 except Exception: pass if ('fragment_index' in data.keys()) and ('fragment_count' in data.keys()): try: self.fragments = str(data['fragment_index']) + '/' + str(data['fragment_count']) except Exception: self.fragments = 0 if 'status' in data.keys(): # download complete if data['status'] == 'finished': self.download_status = 'complete' # some times file_size is not available self.file_size = self.downloaded_size self.fragments = 0 self.download_percent = 100 elif data['status'] == 'downloading': self.download_status = 'downloading' download_info_dict = {'gid': self.gid, 'download_status': self.download_status, 'file_name': self.file_name, 'eta': self.eta, 'download_speed_str': self.download_speed_str, 'downloaded_size': self.downloaded_size, 'file_size': self.file_size, 'download_percent': self.download_percent, 'fragments': self.fragments} # update data_base self.main_window.persepolis_db.updateVideoFinderTable2(download_info_dict) def tellStatus(self): # read from data_base download_info_dict = self.main_window.persepolis_db.searchGidInVideoFinderTable2(self.gid) if download_info_dict is None: download_info_dict = {'gid': self.gid, 'download_status': self.download_status, 'file_name': self.file_name, 'eta': self.eta, 'download_speed_str': self.download_speed_str, 'downloaded_size': self.downloaded_size, 'file_size': self.file_size, 'download_percent': self.download_percent, 'fragments': self.fragments, 'error_message': self.error_message} else: self.file_size = download_info_dict['file_size'] self.file_name = download_info_dict['file_name'] self.file_path = os.path.join(self.download_path, self.file_name) self.download_status = download_info_dict['download_status'] self.eta = download_info_dict['eta'] self.download_speed_str = download_info_dict['download_speed_str'] self.downloaded_size = download_info_dict['downloaded_size'] self.download_percent = download_info_dict['download_percent'] self.fragments = download_info_dict['fragments'] self.error_message = download_info_dict['error_message'] downloaded_size, downloaded_size_unit = humanReadableSize(download_info_dict['downloaded_size']) if self.file_size: file_size, file_size_unit = humanReadableSize(self.file_size) else: file_size = '' file_size_unit = '' # return information in dictionary format download_info = { 'gid': self.gid, 'file_name': self.file_name, 'status': self.download_status, 'size': str(file_size) + ' ' + file_size_unit, 'downloaded_size': str(downloaded_size) + ' ' + downloaded_size_unit, 'percent': str(self.download_percent) + '%', 'connections': self.fragments, 'rate': self.download_speed_str, 'estimate_time_left': self.eta, 'link': self.link, 'error': self.error_message } return download_info # this method checks and manages download progress. def checkDownloadProgress(self): logger.sendToLog("Download starts! - GID:" + self.gid, "DOWNLOADS") # Run this loop until the download is finished. while (self.download_status == 'downloading'): time.sleep(1) # If the downloaded size is the same as the file size, then the download has been completed successfully. if self.download_status == 'complete': logger.sendToLog('Download complete. - GID: ' + self.gid, 'DOWNLOADS') # If the download is not complete and the user has not stopped the download, then the download has encountered an error. elif self.download_status != 'stopped': self.download_status = 'error' logger.sendToLog('Download Error - GID: ' + self.gid, 'DOWNLOAD ERROR') elif self.download_status == 'stopped': logger.sendToLog('Download stopped. - GID: ' + self.gid, 'DOWNLOADS') def download(self): try: self.ytdl_session.download([self.link]) except Exception as e: if self.download_status != 'stopped': # So download didn't stop by user! self.error_message = str(e) self.download_status = 'error' # update data_base dict_ = {'gid': self.gid, 'download_status': self.download_status, 'error_message': self.error_message} self.main_window.persepolis_db.updateVideoFinderTable2(dict_) self.yt_dlp_exited = True def start(self): # Create download_path if not existed try: makeDirs(self.download_path) except Exception: pass self.createSession() # update status and last_try_date in data_base if self.start_time: self.download_status = "scheduled" else: self.download_status = "waiting" # update data_base dict_ = {'gid': self.gid, 'download_status': self.download_status} self.main_window.persepolis_db.updateVideoFinderTable2(dict_) # get last_try_date now_date = self.nowDate() # update data_base dict_ = {'gid': self.gid, 'status': self.download_status, 'last_try_date': now_date} self.main_window.persepolis_db.updateDownloadTable([dict_]) # call startTime if start_time is available # startTime creates sleep loop if user set start_time # see startTime method for more information. if self.start_time: self.startTime() # now startTime work is done! update data_base # if download stopped by user don't update data_base if self.download_status == "scheduled": # set start_time value to None in data_base! self.main_window.persepolis_db.setDefaultGidInAddlinkTable(self.gid, start_time=True) if self.download_status != 'stopped': self.download_status = 'downloading' # update data_base dict_ = {'gid': self.gid, 'download_status': self.download_status} self.main_window.persepolis_db.updateVideoFinderTable2(dict_) # if user set end_time if self.end_time: self.runEndTimeThread() # Start the download thread download_thread = threading.Thread(target=self.download) download_thread.setDaemon(True) download_thread.start() self.checkDownloadProgress() self.close() else: # if start_time_status is "stopped" it means download Canceled by user logger.sendToLog("Download Canceled", "DOWNLOADS") def close(self): # if download complete, so delete control file if self.download_status == 'complete': # if user specified download_path is equal to persepolis_setting download_path, # then subfolder must added to download path. if self.main_window.persepolis_setting.value('settings/download_path') == self.download_path and self.single_video_link: # return new download_path if self.main_window.persepolis_setting.value('settings/subfolder') == 'yes': new_download_path = os.path.join(self.download_path, 'Videos') file_path = self.downloadCompleteAction(new_download_path) else: # keep user specified download_path file_path = self.file_path # update download_path in addlink_db_table add_link_dictionary = self.main_window.persepolis_db.searchGidInAddLinkTable(self.gid) add_link_dictionary['download_path'] = file_path self.main_window.persepolis_db.updateAddLinkTable([add_link_dictionary]) # ask threads for exiting. for thread in self.thread_list: thread.join() self.write_it_to_the_database = False logger.sendToLog("ytdlp_downloader is closed!", 'DOWNLOADS') # remove it from download_sessions_list when download status has been written to the database. for download_session_dict in self.main_window.download_sessions_list: if download_session_dict['gid'] == self.gid: # Wait until the information is written to the database. while self.write_it_to_the_database is False: time.sleep(0.1) # remove item self.main_window.download_sessions_list.remove(download_session_dict) # remove gid from single_video_link_gid_list if self.gid in self.main_window.single_video_link_gid_list: self.main_window.single_video_link_gid_list.remove(self.gid) def downloadCompleteAction(self, new_download_path): # rename file if file already existed self.file_name = returnNewFileName(new_download_path, self.file_name) new_file_path = os.path.join(new_download_path, self.file_name) # move the file to the download folder but first make sure yt-dlp has finished. while not (self.yt_dlp_exited): time.sleep(0.1) move_answer = moveFile(str(self.file_path), str(new_file_path), 'file') if not (move_answer): # write error message in log logger.sendToLog('Persepolis can not move file' + ' - GID: ' + self.gid, "ERROR") new_file_path = self.file_path return str(new_file_path) def downloadPause(self): pass def downloadUnpause(self): pass def downloadStop(self): # Change download status to stopped and infrom self.getStatus method self.download_status = 'stopped' # update data_base dict_ = {'gid': self.gid, 'download_status': self.download_status} self.main_window.persepolis_db.updateVideoFinderTable2(dict_) # This method limits download speed def limitSpeed(self, limit_value): pass ================================================ FILE: requirements.md ================================================ ## You can find requirements and installation instructions in [Persepolis Wiki](https://github.com/persepolisdm/persepolis/wiki/git-installation-instruction) ================================================ FILE: requirements.txt ================================================ PySide6_Essentials; requests; urllib3; setproctitle; psutil; yt-dlp; ================================================ FILE: resources/PersepolisBI.py ================================================ # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import logging import json import subprocess from subprocess import CREATE_NO_WINDOW, DETACHED_PROCESS, CREATE_NEW_PROCESS_GROUP, CREATE_BREAKAWAY_FROM_JOB import platform import os import sys import struct import argparse import random import sqlite3 from copy import deepcopy from time import sleep from PySide6.QtCore import QSettings # a "PersepolisBI.exe" file must be created from this script. # "PersepolisBI.exe" and "Persepolis Download Manager.exe" must be in same directory. # "PersepolisBI.exe" act as intermediary between browser(FireFox, Chrome, ...) and "Persepolis Download Manager.exe" # find operating system os_type = platform.system() # user home address home_address = os.path.expanduser("~") # persepolis config folder in M.S Windows config_folder = os.path.join( home_address, 'AppData', 'Local', 'persepolis_download_manager') # create folder if it's not exist. os.makedirs(config_folder, exist_ok=True) # persepolis tmp folder path persepolis_tmp = os.path.join(config_folder, 'persepolis_tmp') # load persepolis_settings persepolis_setting = QSettings('persepolis_download_manager', 'persepolis') # plugins.db is store links, when browser plugins are send new links. # This class is managing plugin.db class PluginsDB(): def __init__(self): # plugins.db file path plugins_db_path = os.path.join(persepolis_tmp, 'plugins.db') # plugins_db_connection self.plugins_db_connection = sqlite3.connect(plugins_db_path, check_same_thread=False) # plugins_db_cursor self.plugins_db_cursor = self.plugins_db_connection.cursor() # create a lock for data base self.lock = False # this method locks data base. # this is pervent accessing data base simultaneously. def lockCursor(self): while self.lock: rand_float = random.uniform(0, 0.5) sleep(rand_float) self.lock = True # plugins_db_table contains links that sends by browser plugins. # insert new items in plugins_db_table def insertInPluginsTable(self, list_): # lock data base self.lockCursor() for dict_ in list_: self.plugins_db_cursor.execute("""INSERT INTO plugins_db_table VALUES( NULL, :link, :referer, :load_cookies, :user_agent, :header, :out, 'new' )""", dict_) self.plugins_db_connection.commit() # release lock self.lock = False # close connections def closeConnections(self): # lock data base self.lockCursor() self.plugins_db_cursor.close() self.plugins_db_connection.close() # release lock self.lock = False # log file address log_file = os.path.join(str(config_folder), 'persepolisbi.log') # create log file if it's not exist. if not os.path.isfile(log_file): f = open(log_file, 'w') f.close() # define logging object logObj = logging.getLogger("Persepolis") logObj.setLevel(logging.INFO) # don't show log in console logObj.propagate = False # create a file handler handler = logging.FileHandler(log_file) handler.setLevel(logging.INFO) # create a logging format formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) # add the handlers to the logger logObj.addHandler(handler) def sendToLog(text="", type="INFO"): if type == "INFO": logObj.info(text) elif type == "ERROR": logObj.error(text) else: logObj.warning(text) # find exeternal application execution path def findExternalAppPath(app_name): # alongside of the bundle path cwd = sys.argv[0] current_directory = os.path.dirname(cwd) app_alongside = os.path.join(current_directory, app_name) # for Mac OSX and MicroSoft Windows app_command = app_alongside log_list = ["{}'s file is detected alongside of bundle.".format(app_name), "INFO"] return app_command, log_list # create terminal arguments parser = argparse.ArgumentParser(description='PersepolisBI') parser.add_argument('--tray', action='store_true', help="Persepolis is starting in tray icon. It's useful when you want to put persepolis in system's startup.") parser.add_argument('--parent-window', action='store', nargs=1, help='this switch is used for chrome native messaging in Windows') parser.add_argument('--version', action='version', version='PersepolisBI 1.0.0') # Clears unwanted args ( like args from Browers via NHM ) # unknown arguments (may sent by browser) will save in unknownargs. args, unknownargs = parser.parse_known_args() browser_url = True plugin_list = [] browser_plugin_dict = {'link': None, 'referer': None, 'load_cookies': None, 'user_agent': None, 'header': None, 'out': None } # This dirty trick will show Persepolis version when there are unknown args # Unknown args are sent by Browsers for NHM if args.parent_window or unknownargs: # Platform specific configuration if os_type == 'Windows': # Set the default I/O mode to O_BINARY in windows import msvcrt msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY) msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) # Send message to browsers plugin message = '{"enable": true, "version": "1.85"}'.encode('utf-8') sys.stdout.buffer.write((struct.pack('i', len(message)))) sys.stdout.buffer.write(message) sys.stdout.flush() text_length_bytes = sys.stdin.buffer.read(4) # Unpack message length as 4 byte integer. text_length = struct.unpack('@I', text_length_bytes)[0] # Read the text (JSON object) of the message. text = sys.stdin.buffer.read(text_length).decode("utf-8") if text: new_dict = json.loads(text) if 'url_links' in new_dict: # new_dict is sended by persepolis browser add-on. # new_dict['url_links'] contains some lists. # every list contains link information. for item in new_dict['url_links']: copy_dict = deepcopy(browser_plugin_dict) if 'url' in item.keys(): copy_dict['link'] = str(item['url']) if 'header' in item.keys() and item['header'] != '': copy_dict['header'] = item['header'] if 'referrer' in item.keys() and item['referrer'] != '': copy_dict['referer'] = item['referrer'] if 'filename' in item.keys() and item['filename'] != '': copy_dict['out'] = os.path.basename(str(item['filename'])) if 'useragent' in item.keys() and item['useragent'] != '': copy_dict['user_agent'] = item['useragent'] if 'cookies' in item.keys() and item['cookies'] != '': copy_dict['load_cookies'] = item['cookies'] plugin_list.append(copy_dict) else: browser_url = False # when browsers plugin calls persepolis or user runs persepolis by terminal arguments, # then persepolis creates a request file in persepolis_tmp folder and link information added to # plugins_db.db file(see data_base.py for more information). # persepolis mainwindow checks persepolis_tmp for plugins request file every 2 seconds (see CheckingThread class in mainwindow.py) # when request received in CheckingThread, a popup window (AddLinkWindow) comes up and window gets additional download information # from user (port , proxy , ...) and download starts and request file deleted if len(plugin_list) != 0: # create an object for PluginsDB plugins_db = PluginsDB() # add plugin_list to plugins_table in plugins.db file. plugins_db.insertInPluginsTable(plugin_list) # Job is done! close connections. plugins_db.closeConnections() # notify that a link is added! plugin_ready = os.path.join(persepolis_tmp, 'persepolis-plugin-ready') f = open(plugin_ready, 'w') f.close() # start persepolis in system tray if browser executed # and if user select this option in preferences window. if str(persepolis_setting.value('settings/browser-persepolis')) == 'yes' and (args.parent_window or unknownargs): start_persepolis_if_browser_executed = True else: start_persepolis_if_browser_executed = False # find "Persepolis Download Manager.exe" file path app_command, log_list = findExternalAppPath('Persepolis Download Manager.exe') sendToLog(log_list[0], log_list[1]) # call persepolis try: creationflags = DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP | CREATE_BREAKAWAY_FROM_JOB | CREATE_NO_WINDOW if browser_url: subprocess.Popen([app_command], creationflags=creationflags, shell=False) sendToLog("Download link(s) is sended to persepolis", "INFO") elif start_persepolis_if_browser_executed: subprocess.Popen([app_command, '--tray'], creationflags=creationflags, shell=False) sendToLog("Browser is executed and persepolis called by browser.") except Exception as e: sendToLog(str(e), "ERROR") ================================================ FILE: resources/dark_style.qss ================================================ /* * BreezeDark stylesheet. * * :author: Colin Duquesnoy * :editor: Alex Huszagh * :license: MIT, see LICENSE.md * * This is originally a fork of QDarkStyleSheet, and is based on Breeze/ * BreezeDark color scheme, but is in no way affiliated with KDE. * * --------------------------------------------------------------------- * The MIT License (MIT) * * Copyright (c) <2013-2014> * Copyright (c) <2015-2021> * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * --------------------------------------------------------------------- */ /** * MAIN STYLESHEET * --------------- */ QToolTip { /* 0.2ex is the smallest value that's not ignored on Windows. */ border: 0.04em solid #eff0f1; background-image: none; background-color: #31363b; alternate-background-color: #31363b; color: #eff0f1; padding: 0.1em; opacity: 200; } QWidget { color: #eff0f1; background-color: #31363b; selection-background-color: #b83232; selection-color: #eff0f1; background-clip: border; border-image: none; /* QDialogButtonBox icons */ dialog-cancel-icon: url(:/dark fusion/dialog_cancel.svg); dialog-close-icon: url(:/dark fusion/dialog_close.svg); dialog-ok-icon: url(:/dark fusion/dialog_ok.svg); dialog-open-icon: url(:/dark fusion/dialog_open.svg); dialog-reset-icon: url(:/dark fusion/dialog_reset.svg); dialog-save-icon: url(:/dark fusion/dialog_save.svg); dialog-yes-icon: url(:/dark fusion/dialog_ok.svg); dialog-help-icon: url(:/dark fusion/dialog_help.svg); dialog-no-icon: url(:/dark fusion/dialog_no.svg); dialog-apply-icon: url(:/dark fusion/dialog_ok.svg); dialog-discard-icon: url(:/dark fusion/dialog_discard.svg); /* File icons */ filedialog-backward-icon: url(:/dark fusion/left_arrow.svg); filedialog-contentsview-icon: url(:/dark fusion/file_dialog_contents.svg); filedialog-detailedview-icon: url(:/dark fusion/file_dialog_detailed.svg); filedialog-end-icon: url(:/dark fusion/file_dialog_end.svg); filedialog-infoview-icon: url(:/dark fusion/file_dialog_info.svg); filedialog-listview-icon: url(:/dark fusion/file_dialog_list.svg); filedialog-new-directory-icon: url(:/dark fusion/folder.svg); filedialog-parent-directory-icon: url(:/dark fusion/up_arrow.svg); filedialog-start-icon: url(:/dark fusion/file_dialog_start.svg); directory-closed-icon: url(:/dark fusion/folder.svg); directory-icon: url(:/dark fusion/folder.svg); directory-link-icon: url(:/dark fusion/folder_link.svg); directory-open-icon: url(:/dark fusion/folder_open.svg); file-icon: url(:/dark fusion/file.svg); file-link-icon: url(:/dark fusion/file_link.svg); home-icon: url(:/dark fusion/home_directory.svg); /* QMessageBox icons */ messagebox-critical-icon: url(:/dark fusion/message_critical.svg); messagebox-information-icon: url(:/dark fusion/message_information.svg); messagebox-question-icon: url(:/dark fusion/message_question.svg); messagebox-warning-icon: url(:/dark fusion/message_warning.svg); /* Computer icons */ computer-icon: url(:/dark fusion/computer.svg); desktop-icon: url(:/dark fusion/desktop.svg); cd-icon: url(:/dark fusion/disc_drive.svg); dvd-icon: url(:/dark fusion/disc_drive.svg); floppy-icon: url(:/dark fusion/floppy_drive.svg); harddisk-icon: url(:/dark fusion/hard_drive.svg); network-icon: url(:/dark fusion/network_drive.svg); trash-icon: url(:/dark fusion/trash.svg); /* Arrow icons */ uparrow-icon: url(:/dark fusion/up_arrow.svg); downarrow-icon: url(:/dark fusion/down_arrow.svg); leftarrow-icon: url(:/dark fusion/left_arrow.svg); rightarrow-icon: url(:/dark fusion/right_arrow.svg); backward-icon: url(:/dark fusion/left_arrow.svg); forward-icon: url(:/dark fusion/right_arrow.svg); /* Titlebar icons */ titlebar-close-icon: url(:/dark fusion/window_close.svg); titlebar-contexthelp-icon: url(:/dark fusion/help.svg); titlebar-maximize-icon: url(:/dark fusion/maximize.svg); titlebar-menu-icon: url(:/dark fusion/menu.svg); titlebar-minimize-icon: url(:/dark fusion/minimize.svg); titlebar-normal-icon: url(:/dark fusion/restore.svg); titlebar-shade-icon: url(:/dark fusion/shade.svg); titlebar-unshade-icon: url(:/dark fusion/unshade.svg); /* Other icons */ dockwidget-close-icon: url(:/dark fusion/close.svg); /** * Only available in Qt6, and causes other issues. See #62. * lineedit-clear-button-icon: url(:/dark fusion/clear_text.svg); */ } QWidget:disabled { color: #454545; background-color: #31363b; } QCheckBox { spacing: 0.23em; outline: none; color: #eff0f1; margin-bottom: 0.09em; opacity: 200; } QCheckBox:disabled { color: #b0b0b0; } QGroupBox { /* Need to make sure the groupbox doesn't compress below the title. */ min-height: 1.2em; border: 0.04em solid #76797c; border-radius: 0.09em; /** * This gives us enough space at the top to ensure we can move the * title to be inside the guidelines, and the padding at the top * ensures we have space below the title. */ margin-top: 0.5em; padding-top: 1em; } QGroupBox:focus { border: 0.04em solid #76797c; border-radius: 0.09em; } QGroupBox::title { /* We need to move 0.6em up to be inside the lines, +1em for padding. */ top: -1.6em; subcontrol-origin: content; subcontrol-position: top center; background: #31363b; padding-left: 0.2em; padding-right: 0.2em; } QGroupBox:flat { border-top: 0.04em solid #626568; border-left: 0.04em transparent #76797c; border-right: 0.04em transparent #76797c; border-bottom: 0.04em transparent #76797c; } QCheckBox::indicator, QTreeView::indicator, QTableWidget::indicator, QGroupBox::indicator { width: 1em; height: 1em; } QGroupBox::indicator:unchecked, QGroupBox::indicator:unchecked:focus, QCheckBox::indicator:unchecked, QCheckBox::indicator:unchecked:focus, QTreeView::indicator:unchecked, QTreeView::indicator:unchecked:focus { border-image: url(:/dark fusion/checkbox_unchecked_disabled.svg); } QGroupBox::indicator:unchecked, QCheckBox::indicator:unchecked:hover, QCheckBox::indicator:unchecked:pressed, QTreeView::indicator:unchecked:hover, QTreeView::indicator:unchecked:pressed, QGroupBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:pressed { border: none; border-image: url(:/dark fusion/checkbox_unchecked.svg); } QCheckBox::indicator:checked, QTreeView::indicator:checked, QGroupBox::indicator:checked { border-image: url(:/dark fusion/checkbox_checked.svg); } QCheckBox::indicator:checked:hover, QCheckBox::indicator:checked:focus, QCheckBox::indicator:checked:pressed, QTreeView::indicator:checked:hover, QTreeView::indicator:checked:focus, QTreeView::indicator:checked:pressed, QGroupBox::indicator:checked:hover, QGroupBox::indicator:checked:focus, QGroupBox::indicator:checked:pressed { border: none; border-image: url(:/dark fusion/checkbox_checked.svg); } QCheckBox::indicator:indeterminate, QTreeView::indicator:indeterminate { border-image: url(:/dark fusion/checkbox_indeterminate.svg); } QCheckBox::indicator:indeterminate:focus, QCheckBox::indicator:indeterminate:hover, QCheckBox::indicator:indeterminate:pressed, QTreeView::indicator:indeterminate:focus, QTreeView::indicator:indeterminate:hover, QTreeView::indicator:indeterminate:pressed { border-image: url(:/dark fusion/checkbox_indeterminate.svg); } QCheckBox::indicator:indeterminate:disabled, QTreeView::indicator:indeterminate:disabled { border-image: url(:/dark fusion/checkbox_indeterminate_disabled.svg); } QCheckBox::indicator:checked:disabled, QTreeView::indicator:checked:disabled, QGroupBox::indicator:checked:disabled { border-image: url(:/dark fusion/checkbox_checked_disabled.svg); } QCheckBox::indicator:unchecked:disabled, QTreeView::indicator:unchecked:disabled, QGroupBox::indicator:unchecked:disabled { border-image: url(:/dark fusion/checkbox_unchecked_disabled.svg); } QRadioButton { spacing: 0.23em; outline: none; color: #eff0f1; margin-bottom: 0.09em; } QRadioButton:disabled { color: #76797c; } QRadioButton::indicator { width: 1em; height: 1em; } QRadioButton::indicator:unchecked, QRadioButton::indicator:unchecked:focus { border-image: url(:/dark fusion/radio_unchecked_disabled.svg); } QRadioButton::indicator:unchecked:hover, QRadioButton::indicator:unchecked:pressed { border: none; outline: none; border-image: url(:/dark fusion/radio_unchecked.svg); } QRadioButton::indicator:checked { border: none; outline: none; border-image: url(:/dark fusion/radio_checked.svg); } QRadioButton::indicator:checked:hover, QRadioButton::indicator:checked:focus, QRadioButton::indicator:checked:pressed { border: none; outline: none; border-image: url(:/dark fusion/radio_checked.svg); } QRadioButton::indicator:checked:disabled { outline: none; border-image: url(:/dark fusion/radio_checked_disabled.svg); } QRadioButton::indicator:unchecked:disabled { border-image: url(:/dark fusion/radio_unchecked_disabled.svg); } QMenuBar { background-color: #31363b; color: #eff0f1; } QMenuBar::item { background: transparent; } QMenuBar::item:selected { background: transparent; border: 0.04em solid #b83232; } QMenuBar::item:disabled { color: #76797c; } QMenuBar::item:pressed { background-color: #b83232; color: #eff0f1; margin-bottom: -0.09em; padding-bottom: 0.09em; } QMenu { color: #eff0f1; margin: 0.09em; } QMenu::icon { margin: 0.23em; } QMenu::item { /* Add extra padding on the right for the QMenu arrow */ padding: 0.23em 1.5em 0.23em 1.3em; border: 0.09em solid transparent; background: transparent; } QMenu::item:selected { color: #eff0f1; background-color: #b83232; } QMenu::item:selected:disabled { background-color: #31363b; } QMenu::item:disabled { color: #76797c; } QMenu::indicator { width: 0.8em; height: 0.8em; /* To align with QMenu::icon, which has a 0.23em margin. */ margin-left: 0.3em; subcontrol-position: center left; } QMenu::indicator:non-exclusive:unchecked { border-image: url(:/dark fusion/checkbox_unchecked_disabled.svg); } QMenu::indicator:non-exclusive:unchecked:selected { border-image: url(:/dark fusion/checkbox_unchecked_disabled.svg); } QMenu::indicator:non-exclusive:checked { border-image: url(:/dark fusion/checkbox_checked.svg); } QMenu::indicator:non-exclusive:checked:selected { border-image: url(:/dark fusion/checkbox_checked.svg); } QMenu::indicator:exclusive:unchecked { border-image: url(:/dark fusion/radio_unchecked_disabled.svg); } QMenu::indicator:exclusive:unchecked:selected { border-image: url(:/dark fusion/radio_unchecked_disabled.svg); } QMenu::indicator:exclusive:checked { border-image: url(:/dark fusion/radio_checked.svg); } QMenu::indicator:exclusive:checked:selected { border-image: url(:/dark fusion/radio_checked.svg); } QMenu::right-arrow { margin: 0.23em; border-image: url(:/dark fusion/right_arrow.svg); width: 0.5em; height: 0.8em; } QMenu::right-arrow:disabled { border-image: url(:/dark fusion/right_arrow_disabled.svg); } QAbstractItemView { alternate-background-color: #31363b; color: #eff0f1; border: 0.09em solid #31363b; border-radius: 0.09em; } QTabWidget:focus, QCheckBox:focus, QRadioButton:focus, QSlider:focus { border: none; } QLineEdit { background-color: #1d2023; padding: 0.23em; border-style: solid; border: 0.04em solid #76797c; border-radius: 0.09em; color: #eff0f1; } QAbstractScrollArea { border-radius: 0.09em; border: 0.09em solid #76797c; background-color: transparent; } /** * This is the background for the box in the bottom-right corner * whene both scrollbars are active. */ QAbstractScrollArea::corner { background: #31363b; } /** * Can't do the KDE style of where the scrollbar handle * becomes light on the hover, and only when the handle * is hovered does it become stylized. This is because * both the handle and the background events are treated * together. */ QScrollBar:horizontal { background-color: #1d2023; height: 0.65em; margin: 0.13em 0.65em 0.13em 0.65em; border: 0.04em transparent #1d2023; border-radius: 0.17em; } QScrollBar:horizontal:hover { background-color: #76797c; } QScrollBar::handle:horizontal { background-color: #b83232; border: 0.04em solid #b83232; min-width: 0.5em; border-radius: 0.17em; } QScrollBar::handle:horizontal:hover { background-color: #b83232; border: 0.04em solid #b83232; } QScrollBar::add-line:horizontal { margin: 0em 0.13em 0em 0.13em; border-image: url(:/dark fusion/transparent.svg); width: 0.41em; height: 0.41em; subcontrol-position: right; subcontrol-origin: margin; } QScrollBar::sub-line:horizontal { margin: 0em 0.13em 0em 0.13em; border-image: url(:/dark fusion/transparent.svg); width: 0.41em; height: 0.41em; subcontrol-position: left; subcontrol-origin: margin; } QScrollBar::add-line:horizontal:hover, QScrollBar::add-line:horizontal:on { border-image: url(:/dark fusion/transparent.svg); width: 0.41em; height: 0.41em; subcontrol-position: right; subcontrol-origin: margin; } QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on { border-image: url(:/dark fusion/transparent.svg); width: 0.41em; height: 0.41em; subcontrol-position: left; subcontrol-origin: margin; } QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal { background: none; } QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { background: none; } QScrollBar:vertical { background-color: #1d2023; width: 0.65em; margin: 0.65em 0.13em 0.65em 0.13em; border: 0.04em transparent #1d2023; border-radius: 0.17em; } QScrollBar:vertical:hover { background-color: #76797c; } QScrollBar::handle:vertical { background-color: #b83232; border: 0.04em solid #b83232; min-height: 0.5em; border-radius: 0.17em; } QScrollBar::handle:vertical:hover { background-color: #b83232; border: 0.04em solid #b83232; } QScrollBar::sub-line:vertical { margin: 0.13em 0em 0.13em 0em; border-image: url(:/dark fusion/transparent.svg); height: 0.41em; width: 0.41em; subcontrol-position: top; subcontrol-origin: margin; } QScrollBar::add-line:vertical { margin: 0.13em 0em 0.13em 0em; border-image: url(:/dark fusion/transparent.svg); height: 0.41em; width: 0.41em; subcontrol-position: bottom; subcontrol-origin: margin; } QScrollBar::sub-line:vertical:hover, QScrollBar::sub-line:vertical:on { border-image: url(:/dark fusion/transparent.svg); height: 0.41em; width: 0.41em; subcontrol-position: top; subcontrol-origin: margin; } QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on { border-image: url(:/dark fusion/transparent.svg); height: 0.41em; width: 0.41em; subcontrol-position: bottom; subcontrol-origin: margin; } QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { background: none; } QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { background: none; } QTextEdit { background-color: #1d2023; color: #eff0f1; border: 0.04em solid #76797c; } QPlainTextEdit { background-color: #1d2023; color: #eff0f1; border-radius: 0.09em; border: 0.04em solid #76797c; } QSizeGrip { border-image: url(:/dark fusion/sizegrip.svg); width: 0.5em; height: 0.5em; } /** * Set the separator to be transparent, since the dock has a border. * On PyQt6, neither the border nor the background seem to be respected. */ QMainWindow::separator { border: 0.09em transparent #76797c; background: transparent; } QMenu::separator { height: 0.09em; background-color: #76797c; padding-left: 0.2em; margin-top: 0.2em; margin-bottom: 0.2em; margin-left: 0.41em; margin-right: 0.41em; } QFrame[frameShape="2"], /* QFrame::Panel == 0x0003 */ QFrame[frameShape="3"], /* QFrame::WinPanel == 0x0003 */ QFrame[frameShape="4"], /* QFrame::HLine == 0x0004 */ QFrame[frameShape="5"], /* QFrame::VLine == 0x0005 */ QFrame[frameShape="6"] /* QFrame::StyledPanel == 0x0006 */ { border-width: 0.04em; padding: 0.09em; border-style: solid; border-color: #31363b; background-color: #76797c; border-radius: 0.23em; } /* Provide highlighting for frame objects. */ QFrame[frameShape="2"]:hover, QFrame[frameShape="3"]:hover, QFrame[frameShape="4"]:hover, QFrame[frameShape="5"]:hover, QFrame[frameShape="6"]:hover { border: 0.04em solid #b83232; } /* Don't provide an outline if we have a widget that takes up the space. */ QFrame[frameShape] QAbstractItemView:hover { border: 0em solid black; } /** * Note: I can't really change the background of the toolbars * independently, since KDE Breeze has different colors for the * window bar and the rest of the UI. The top toolbar uses * the window style, and the rest use the application style, * which we can't do. */ QToolBar { font-weight: bold; } QToolBar:horizontal { background: 0.09em solid #31363b; } QToolBar:vertical { background: 0.09em solid #31363b; } QToolBar::handle:horizontal { border-image: url(:/dark fusion/hmovetoolbar.svg); } QToolBar::handle:vertical { border-image: url(:/dark fusion/vmovetoolbar.svg); } QToolBar::separator:horizontal { border-image: url(:/dark fusion/hseptoolbar.svg); } QToolBar::separator:vertical { border-image: url(:/dark fusion/vseptoolbar.svg); } QToolBar QToolButton { font-weight: bold; border: 0.04em transparent black; padding-left: 0.2em; padding-right: 0.3em; } QToolBar QToolButton:hover { border: 0.04em solid #b83232; } QToolBar QToolButton:pressed { border: 0.04em solid #b83232; /* The padding doesn't inherit from `QToolBar QToolButton`, so leave it in. */ padding-left: 0.2em; padding-right: 0.3em; } /** * Special rules for a QFileDialog. * * Due to the widgets, we get rid of the min sizes to allow them * to pack closer together, and ensure we have enough padding for * the drop-down menu in the popup. */ QDialog QToolBar QToolButton[popupMode="0"], QDialog QToolBar QToolButton[popupMode="1"] { padding-left: 0.1em; padding-right: 0.1em; } QDialog QToolBar QToolButton[popupMode="2"] { padding-left: 0.1em; padding-right: 0.7em; } QPushButton { color: #eff0f1; background-color: #31363b; border: 0.04em solid #76797c; padding: 0.23em; border-radius: 0.09em; outline: none; min-height: 1.1em; } QPushButton:flat, QPushButton:flat:hover { border: 0.04em transparent #76797c; } QComboBox:open, QPushButton:open { border-width: 0.04em; border-color: #76797c; } QComboBox:closed, QPushButton:closed { border-width: 0.04em; border-color: #76797c; } QPushButton:disabled { background-color: #31363b; border-width: 0.04em; border-color: #76797c; border-style: solid; padding-top: 0.23em; padding-bottom: 0.23em; padding-left: 1ex; padding-right: 1ex; border-radius: 0.04em; color: #454545; } QPushButton:focus { color: #eff0f1; } QPushButton:pressed { background-color: #454a4f; padding-top: -0.65em; padding-bottom: -0.74em; color: #eff0f1; } QComboBox { border: 0.04em solid #76797c; border-radius: 0.09em; padding: 0.23em; min-width: 2.5em; } QComboBox:editable { background-color: #1d2023; } QPushButton:checked { background-color: #626568; border: 0.04em solid #76797c; color: #eff0f1; } QPushButton:hover { background-color: #31363b; border: 0.04em solid #b83232; color: #eff0f1; } QPushButton:checked:hover { background-color: #626568; border: 0.04em solid #b83232; color: #eff0f1; } QComboBox:hover, QComboBox:focus, QAbstractSpinBox:hover, QAbstractSpinBox:focus, QLineEdit:hover, QLineEdit:focus, QTextEdit:hover, QTextEdit:focus, QPlainTextEdit:hover, QPlainTextEdit:focus, QAbstractView:hover, QTreeView:hover, QTreeView:focus { border: 0.04em solid #b83232; color: #eff0f1; } QComboBox:hover:pressed:!editable, QPushButton:hover:pressed, QAbstractSpinBox:hover:pressed, QLineEdit:hover:pressed, QTextEdit:hover:pressed, QPlainTextEdit:hover:pressed, QAbstractView:hover:pressed, QTreeView:hover:pressed { background-color: #31363b; } QColumnView { border: 0.04em transparent #31363b; } QColumnViewGrip { border-image: url(:/dark fusion/sizegrip.svg); } /* Each column in the view is a QAbstractItemView. */ QColumnView QAbstractItemView { border: 0.04em transparent #b83232; } /** * In order to set consistency between Qt5 and Qt6, we need * to ensure that we do the following steps: * 1. Set a consistent `max-height` in the item. Anything * below `0.8em` will cause clipping, so set that value * to ensure the icon isn't larger. * 2. Set padding to ensure the item is properly padded. * 3. Set `0.2em` margins on the top and bottom of the arrows, * and `0.1em` on the left and right to ensure the arrows * are properly padded and have the same size. * * The size consistency only works if both the `::item` subcontrol * `max-height` and the `::*-arrow` subcontrol `margin` is set. */ QColumnView QAbstractItemView::item { padding: 0.23em; max-width: 0.5em; max-height: 0.8em; } QColumnView QAbstractItemView::right-arrow { image: url(:/dark fusion/right_arrow.svg); margin: 0.2em 0.1em 0.2em 0.1em; } QColumnView QAbstractItemView::right-arrow:selected, QColumnView QAbstractItemView::right-arrow:hover { image: url(:/dark fusion/right_arrow_hover.svg); } QColumnView QAbstractItemView::left-arrow { image: url(:/dark fusion/left_arrow.svg); margin: 0.2em 0.1em 0.2em 0.1em; } QColumnView QAbstractItemView::left-arrow:selected, QColumnView QAbstractItemView::left-arrow:hover { image: url(:/dark fusion/left_arrow_hover.svg); } QComboBox:hover:pressed:editable { background-color: #1d2023; } QComboBox QAbstractItemView { /* This happens for the drop-down menu always, whether editable or not.*/ background-color: #1d2023; selection-background-color: #972b2b; outline-color: 0em; border-radius: 0.09em; } QComboBox::drop-down { subcontrol-origin: padding; subcontrol-position: top right; width: 0.65em; border-left-width: 0em; border-left-style: solid; border-top-right-radius: 0.13em; border-bottom-right-radius: 0.13em; } QComboBox::down-arrow { border-image: url(:/dark fusion/down_arrow_disabled.svg); width: 0.8em; height: 0.5em; margin-right: 0.41em; } QComboBox::down-arrow:on, QComboBox::down-arrow:hover, QComboBox::down-arrow:focus { border-image: url(:/dark fusion/down_arrow.svg); width: 0.8em; height: 0.5em; margin-right: 0.41em; } QAbstractSpinBox { padding: 0.23em; border: 0.09em solid #76797c; background-color: #1d2023; color: #eff0f1; border-radius: 0.09em; min-width: 3em; min-height: 1em; } QAbstractSpinBox:hover { border: 0.09em solid #b83232; } QAbstractSpinBox:up-button, QAbstractSpinBox:up-button:hover { background-color: transparent; subcontrol-origin: padding; subcontrol-position: center right; padding-right: 0.1em; width: 0.8em; height: 0.5em; } QAbstractSpinBox:down-button, QAbstractSpinBox:down-button:hover { background-color: transparent; subcontrol-origin: padding; subcontrol-position: center left; padding-left: 0.1em; width: 0.8em; height: 0.5em; } /** * Bug fixes for elongated items in QSpinBoxes. * By default, the items are bounded by `down-button` * and `up-button`, so this doesn't actually affect the styling. * * This does however affect some custom styling using * QStyle.CC_ComboBox, which affects QDateEdit. This cannot * be selected using QDateEdit, since it uses a global style. * This sounds nonsensical, because CC_ComboBox isn't a spin box, * but through trial and error, this is in fact the case. * * Affects #40. */ QAbstractSpinBox::up-arrow, QAbstractSpinBox::up-arrow:disabled, QAbstractSpinBox::up-arrow:off, QAbstractSpinBox::up-arrow:!off:!disabled:hover, QAbstractSpinBox::down-arrow, QAbstractSpinBox::down-arrow:disabled, QAbstractSpinBox::down-arrow:off, QAbstractSpinBox::down-arrow:!off:!disabled:hover { border-image: none; width: 0.8em; height: 0.5em; } QAbstractSpinBox::up-arrow { image: url(:/dark fusion/up_arrow.svg); } QAbstractSpinBox::up-arrow:disabled, QAbstractSpinBox::up-arrow:off { image: url(:/dark fusion/up_arrow_disabled.svg); } QAbstractSpinBox::up-arrow:hover { image: url(:/dark fusion/up_arrow_hover.svg); } QAbstractSpinBox::down-arrow { image: url(:/dark fusion/down_arrow.svg); } QAbstractSpinBox::down-arrow:disabled, QAbstractSpinBox::down-arrow:off { image: url(:/dark fusion/down_arrow_disabled.svg); } QAbstractSpinBox::down-arrow:!off:!disabled:hover { image: url(:/dark fusion/down_arrow_hover.svg); } QDoubleSpinBox { min-width: 4em; } /** * `QCalendarWidget QAbstractItemView:enabled` sets the color, background * color, and selection color for active dates in the view. * `QCalendarWidget QAbstractItemView:enabled` sets the disabled dates. */ QCalendarWidget QAbstractItemView:enabled { color: #eff0f1; selection-color: #eff0f1; selection-background-color: #b83232; } /* Won't take hover events. */ QPrevNextCalButton { min-width: 0.8em; min-height: 1.2em; qproperty-iconSize: 0px 0px; } QPrevNextCalButton#qt_calendar_nextmonth { image: url(:/dark fusion/calendar_next.svg); } QPrevNextCalButton#qt_calendar_prevmonth { image: url(:/dark fusion/calendar_previous.svg); } /** * Setting for the month and year displays and drop-down menu for the * month select. We style this separately because we want a drop-down * indicator in the bottom right, unlike the normal QToolButton. */ QCalendarWidget QToolButton { background-color: transparent; border: 0.04em solid #76797c; border-radius: 0.09em; margin: 0.23em; padding: 0.23em; padding-top: 0.1em; padding-right: 1.2em; min-height: 1.1em; } QCalendarWidget QToolButton:hover { border: 0.04em solid #b83232; } QCalendarWidget QToolButton:checked, QCalendarWidget QToolButton:pressed { background-color: #b83232; padding: 0.23em; padding-right: 1.2em; min-height: 1.3em; outline: none; } /** * The QCalendarWidget for QDateTimeEdit seems to improperly * style the year QToolButton, which has an object name * `qt_datetimedit_calendar`, so ensure we style it as well. */ QCalendarWidget QToolButton::menu-indicator, #qt_datetimedit_calendar QCalendarWidget QToolButton::menu-indicator { border-image: none; image: url(:/dark fusion/down_arrow.svg); width: 0.8em; height: 0.5em; top: -0.7ex; left: -0.09em; padding-right: -1.11em; subcontrol-origin: content; subcontrol-position: bottom right; } QCalendarWidget QToolButton::menu-arrow, #qt_datetimedit_calendar QCalendarWidget QToolButton::menu-arrow { border-image: none; image: url(:/dark fusion/down_arrow.svg); width: 0.8em; height: 0.5em; padding-right: 0.09em; subcontrol-origin: content; subcontrol-position: bottom right; } /** * Setting for the year button. Both the month select and the year * select are QToolButtons, and both are auto-raised. The year * button however has the popup mode set to `DelayedPopup`. */ QCalendarWidget QToolButton[autoRaise="true"][popupMode="0"] { padding: 0.23em; } QCalendarWidget QSpinBox { max-height: 1.5em; min-width: 3.5em; margin: 0em; margin-top: 0.2em; padding: 0em; outline: 0em; padding-left: 0.5em; } QLabel { border: 0em solid black; } /* BORDERS */ QTabWidget::pane { padding: 0.23em; margin: 0.04em; } QTabWidget::pane:top { border: 0.04em solid #76797c; top: -0.04em; } QTabWidget::pane:bottom { border: 0.04em solid #76797c; bottom: -0.04em; } QTabWidget::pane:left { border: 0.04em solid #76797c; left: -0.04em; } QTabWidget::pane:right { border: 0.04em solid #76797c; right: -0.04em; } QTabBar { qproperty-drawBase: 0; left: 0.23em; border-radius: 0.13em; /** * Note: this is the underline for each tab title. It's not * documented, and this took forever to track down. At least * 10 hours have been wasted trying to turn off this line, * do not deleted this comment. */ selection-color: transparent; } QTabBar:focus { border: 0em transparent black; } QTabBar::close-button { /* Doesn't seem possible to resize these buttons */ border-image: url(:/dark fusion/transparent.svg); image: url(:/dark fusion/close.svg); background: transparent; } QTabBar::close-button:hover { image: url(:/dark fusion/close_hover.svg); } QTabBar::close-button:pressed { image: url(:/dark fusion/close_pressed.svg); } /* TOP TABS */ QTabBar::tab:top, QTabBar::tab:top:last, QTabBar::tab:top:only-one { color: #eff0f1; border: 0.04em transparent black; border-left: 0.04em solid #76797c; border-right: 0.04em solid #76797c; border-top: 0.09em solid #b83232; background-color: #31363b; padding: 0.23em; min-width: 50px; border-radius: 0.09em; border-bottom-left-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:top:first, QTabBar::tab:top:only-one { margin-left: 0.04em; } QTabBar::tab:top:last, QTabBar::tab:top:only-one { margin-right: 0.04em; } QTabBar::tab:top:!selected { color: #eff0f1; background-color: #2c3034; border: 0.04em transparent black; border-right: 0.04em solid #76797c; border-bottom: 0.04em solid #76797c; border-radius: 0.09em; border-bottom-left-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:top:next-selected { border-right: 0.04em transparent #2c3034; border-bottom-left-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:top:!selected:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-bottom-left-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:top:!selected:first:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-bottom-left-radius: 0em; border-bottom-right-radius: 0em; } /* BOTTOM TABS */ QTabBar::tab:bottom, QTabBar::tab:bottom:last, QTabBar::tab:bottom:only-one { color: #eff0f1; border: 0.04em transparent black; border-left: 0.04em solid #76797c; border-right: 0.04em solid #76797c; border-bottom: 0.09em solid #b83232; background-color: #31363b; padding: 0.23em; min-width: 50px; border-radius: 0.09em; border-top-left-radius: 0em; border-top-right-radius: 0em; } QTabBar::tab:bottom:first, QTabBar::tab:bottom:only-one { margin-left: 0.08em; } QTabBar::tab:bottom:last, QTabBar::tab:bottom:only-one { margin-right: 0.08em; } QTabBar::tab:bottom:!selected { color: #eff0f1; background-color: #2c3034; border: 0.04em transparent black; border-top: 0.04em solid #76797c; border-right: 0.04em solid #76797c; border-radius: 0.09em; border-top-left-radius: 0em; border-top-right-radius: 0em; } QTabBar::tab:bottom:next-selected { border-right: 0.04em transparent #2c3034; border-top-left-radius: 0em; border-top-right-radius: 0em; } QTabBar::tab:bottom:!selected:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-top-left-radius: 0em; border-top-right-radius: 0em; } QTabBar::tab:bottom:!selected:first:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-top-left-radius: 0em; border-top-right-radius: 0em; } /* LEFT TABS */ QTabBar::tab:left, QTabBar::tab:left:last, QTabBar::tab:left:only-one { color: #eff0f1; border: 0.04em transparent black; border-top: 0.09em solid #b83232; border-bottom: 0.04em solid #76797c; border-left: 0.04em solid #76797c; background-color: #31363b; padding: 0.23em; min-height: 50px; border-radius: 0.09em; border-top-right-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:left:first, QTabBar::tab:left:only-one { margin-top: 0.08em; } QTabBar::tab:left:last, QTabBar::tab:left:only-one { margin-bottom: 0.08em; } QTabBar::tab:left:!selected { color: #eff0f1; background-color: #2c3034; border: 0.04em transparent black; border-top: 0.04em solid #76797c; border-right: 0.04em solid #76797c; border-radius: 0.09em; border-top-right-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:left:previous-selected { border-top: 0.04em transparent #2c3034; border-top-right-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:left:!selected:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-top-right-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:left:!selected:first:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-top-right-radius: 0em; border-bottom-right-radius: 0em; } /* RIGHT TABS */ QTabBar::tab:right, QTabBar::tab:right:last, QTabBar::tab:right:only-one { color: #eff0f1; border: 0.04em transparent black; border-top: 0.09em solid #b83232; border-bottom: 0.04em solid #76797c; border-right: 0.04em solid #76797c; background-color: #31363b; padding: 0.23em; min-height: 50px; border-radius: 0.09em; border-top-left-radius: 0em; border-bottom-left-radius: 0em; } QTabBar::tab:right:first, QTabBar::tab:right:only-one { margin-top: 0.08em; } QTabBar::tab:right:last, QTabBar::tab:right:only-one { margin-bottom: 0.08em; } QTabBar::tab:right:!selected { color: #eff0f1; background-color: #2c3034; border: 0.04em transparent black; border-top: 0.04em solid #76797c; border-left: 0.04em solid #76797c; border-radius: 0.09em; border-top-left-radius: 0em; border-bottom-left-radius: 0em; } QTabBar::tab:right:previous-selected { border-top: 0.04em transparent #2c3034; border-top-left-radius: 0em; border-bottom-left-radius: 0em; } QTabBar::tab:right:!selected:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-top-left-radius: 0em; border-bottom-left-radius: 0em; } QTabBar::tab:right:!selected:first:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-top-left-radius: 0em; border-bottom-left-radius: 0em; } /** * Special styles for triangular QTabWidgets. * These ignore the border attributes, and the border and * text color seems to be set via the `QTabBar::tab` color * property. This seemingly cannot be changed. * * The rounded shapes are 0-3, and the triangular ones are 4-7. * * The QTabBar outline doesn't respect on QTabBar::tab: * border-color * outline-color */ QTabBar[shape="4"]::tab, QTabBar[shape="5"]::tab, QTabBar[shape="6"]::tab, QTabBar[shape="7"]::tab, QTabBar[shape="4"]::tab:last, QTabBar[shape="5"]::tab:last, QTabBar[shape="6"]::tab:last, QTabBar[shape="7"]::tab:last, QTabBar[shape="4"]::tab:only-one, QTabBar[shape="5"]::tab:only-one, QTabBar[shape="6"]::tab:only-one, QTabBar[shape="7"]::tab:only-one { /* Need a dark color without alpha channel since it affects the text. */ color: #b83232; background-color: #31363b; padding: 0.23em; } QTabBar[shape="4"]::tab, QTabBar[shape="5"]::tab, QTabBar[shape="4"]::tab:last, QTabBar[shape="5"]::tab:last, QTabBar[shape="4"]::tab:only-one, QTabBar[shape="5"]::tab:only-one { min-width: 50px; } QTabBar[shape="6"]::tab, QTabBar[shape="7"]::tab, QTabBar[shape="6"]::tab:last, QTabBar[shape="7"]::tab:last, QTabBar[shape="6"]::tab:only-one, QTabBar[shape="7"]::tab:only-one { min-height: 50px; } QTabBar[shape="4"]::tab:!selected, QTabBar[shape="5"]::tab:!selected, QTabBar[shape="6"]::tab:!selected, QTabBar[shape="7"]::tab:!selected { color: #eff0f1; background-color: #2c3034; } /** * Increase padding on the opposite side of the icon to avoid text clipping. * * BUG: The padding works for North, West, and East in Qt5, South does not * work. All tab positions work for triangular tabs in Qt6. */ QTabBar[shape="4"][tabsClosable="true"]::tab, QTabBar[shape="5"][tabsClosable="true"]::tab { padding-left: 0.5em; } QTabBar[shape="6"][tabsClosable="true"]::tab { padding-bottom: 0.5em; } QTabBar[shape="7"][tabsClosable="true"]::tab { padding-top: 0.5em; } /** * Undo the padding for the tab. * * Enumerated values are North, South, West, East in that order, * from 4-7. * * NOTE: Any higher padding will clip the icon. */ QTabBar[shape="4"]::close-button, QTabBar[shape="5"]::close-button { padding-left: -0.12em; } QTabBar[shape="6"]::close-button { padding-bottom: -0.18em; } QTabBar[shape="7"]::close-button { padding-top: -0.18em; } QDockWidget { background: #31363b; /** * It doesn't seem possible to change the border of the * QDockWidget without changing the content margins. */ /** * This is a bug fix so we can handle hover, pressed, and other events. * Reference: https://stackoverflow.com/questions/32145080/qdockwidget-float-close-button-hover-images */ titlebar-close-icon: url(:/dark fusion/transparent.svg); titlebar-normal-icon: url(:/dark fusion/transparent.svg); } /** * Don't style the title, since it gives a weird, missing border * around the rest of the dock widget, which the remaining border * cannot be removed. * * There is a bug in non-Breeze styles, where the icons are small. It * doesn't change if we use `image` instead of `border-image`, nor if * we use `qproperty-icon`, etc. The icon seem to be half the size * of our desired values. */ QDockWidget::close-button, QDockWidget::float-button { border: 0.04em solid transparent; border-radius: 0.09em; background: transparent; /* Maximum icon size for buttons */ icon-size: 14px; } QDockWidget::float-button { border-image: url(:/dark fusion/transparent.svg); image: url(:/dark fusion/undock.svg); } QDockWidget::float-button:hover { image: url(:/dark fusion/undock_hover.svg); } /* The :pressed events don't register, seems to be a Qt bug. */ QDockWidget::float-button:pressed { image: url(:/dark fusion/undock_hover.svg); } QDockWidget::close-button { border-image: url(:/dark fusion/transparent.svg); image: url(:/dark fusion/close.svg); } QDockWidget::close-button:hover { image: url(:/dark fusion/close_hover.svg); } /* The :pressed events don't register, seems to be a Qt bug. */ QDockWidget::close-button:pressed { image: url(:/dark fusion/close_pressed.svg); } QTreeView, QListView { background-color: #1d2023; border: 0em solid black; } QTreeView:selected, QTreeView:!selected, QListView:selected, QListView:!selected { border: 0em solid black; } QTreeView::branch:has-siblings { border-image: url(:/dark fusion/vline.svg); image: none; } /* These branch indicators don't scale */ QTreeView::branch:!has-siblings { border-image: none; image: none; } QTreeView::branch:has-siblings:adjoins-item { border-image: url(:/dark fusion/branch_more.svg); } QTreeView::branch:!has-children:!has-siblings:adjoins-item { border-image: url(:/dark fusion/branch_end.svg); } QTreeView::branch:has-children:!has-siblings:closed, QTreeView::branch:closed:has-children:has-siblings { image: url(:/dark fusion/branch_closed.svg); } QTreeView::branch:has-children:!has-siblings:closed:hover, QTreeView::branch:closed:has-children:has-siblings:hover { image: url(:/dark fusion/branch_closed_hover.svg); } QTreeView::branch:has-children:!has-siblings:closed, QTreeView::branch:open:has-children:!has-siblings { border-image: url(:/dark fusion/branch_end_arrow.svg); } QTreeView::branch:closed:has-children:has-siblings, QTreeView::branch:open:has-children:has-siblings { border-image: url(:/dark fusion/branch_more_arrow.svg); } QTreeView::branch:open:has-children:!has-siblings, QTreeView::branch:open:has-children:has-siblings { image: url(:/dark fusion/branch_open.svg); } QTreeView::branch:open:has-children:!has-siblings:hover, QTreeView::branch:open:has-children:has-siblings:hover { image: url(:/dark fusion/branch_open_hover.svg); } QListView { /* Give space for elements aligned left or right. */ padding: 0.2em; } QTableView::item, QListView::item, QTreeView::item { padding: 0.13em; color: #eff0f1; } QTreeView::item { /** * Need to set the background color in Qt6, or else * the QTreeView indicators use the style defaults, * along with the box model, which conflicts with our * theme (except with hover/focus/selected pseudostates). * * Affects issue #51. */ background-color: #1d2023; outline: 0; } QTableView::item:!selected:hover, QListView::item:!selected:hover, QTreeView::item:!selected:hover { background-color: rgba(255, 0, 20, 0.1); outline: 0; color: #eff0f1; padding: 0.13em; } QAbstractItemView::item QLineEdit { border: 0em transparent black; /* * The top/bottom padding causes the editable widget to conceal text. * https://github.com/Alexhuszagh/BreezeStyleSheets/issues/69 */ padding: 0em; } QSlider::handle:horizontal, QSlider::handle:vertical { background: #1d2023; border: 0.04em solid #626568; width: 0.7em; height: 0.7em; border-radius: 0.35em; } QSlider:horizontal { height: 2em; } QSlider:vertical { width: 2em; } QSlider::handle:horizontal { margin: -0.23em 0; } QSlider::handle:vertical { margin: 0 -0.23em; } QSlider::groove:horizontal, QSlider::groove:vertical { background: #2c3034; border: 0em solid #31363b; border-radius: 0.19em; } QSlider::groove:horizontal { height: 0.4em; } QSlider::groove:vertical { width: 0.4em; } QSlider::handle:horizontal:hover, QSlider::handle:horizontal:focus, QSlider::handle:vertical:hover, QSlider::handle:vertical:focus { border: 0.04em solid #b83232; } QSlider::handle:horizontal:!focus:!hover, QSlider::handle:vertical:!focus:!hover { border: 0.04em solid #626568; } QSlider::sub-page:horizontal, QSlider::add-page:vertical { background: #b83232; border-radius: 0.19em; } QSlider::add-page:horizontal, QSlider::sub-page:vertical { background: #626568; border-radius: 0.19em; } /* QToolButton */ /** * QToolButton's that have a push button need to be styled differently, * depending on whether there are actions (a menu) associated with it. * This is signaled by a drop-down arrow on the right of the push button. * Unfortunately, there's no good property to determine this. The property * we need is `QWidget::actions`, however, it's a method and not a * property.Note that the drop-down menu is not signaled by any of the * following: * popupMode: any pop-up mode does not affect the right arrow style. * arrowType: only replaces the icon. * toolButtonStyle: this is almost always set to icon only, even with text. * text: can have a drop-down menu with or without text. * * Notably, we need to ensure we don't pad the widgets in the following * cases: * 1. If the QToolButton is auto-raised. * This adds undesired padding in`QFileDialog`. These widgets * have text, even though no text is visible. This is not the * default, so it won't affect most situations. * 2. If the QToolButton does not have text. * Normally, text-less buttons do not have a menu, and this * is required for #47, since the padding affects the scroll * bar icons in QTabBar. This causes major issues in the * UI, so disable the padding by default. * * The padding can affect the placement of icons and other things * inside the toolbutton: near the menu-button in QFileDialog, * the clear text icon is misplaced vertically, making it nearly * illegible. * * We provide special styles for a custom, dynamic property to * override the padding decisions with or without a menu. * To force styling as if there is a menu, set the `hasMenu` property * to true. Setting `hasMenu` to false will style as if there is no menu. * You can use `QWidget::setProperty` to set this property dynamically. * * The affected issues are #22, #28, #47. * https://github.com/Alexhuszagh/BreezeStyleSheets/issues/22 * https://github.com/Alexhuszagh/BreezeStyleSheets/issues/28 * https://github.com/Alexhuszagh/BreezeStyleSheets/issues/47 */ /** * Use an overly specific selector here to ensure no margins, * or for the default QToolButton. We must have `autoRaise="false"` * and `text` to have padding, so just add a `hasMenu="false"` to * undo the padding in that case. Also add selectors for QDialog * if a menu is explicitly forbidden. */ QToolButton, QToolButton[hasMenu="false"][autoRaise="false"][text], QDialog QToolBar QToolButton[hasMenu="false"][popupMode="0"], QDialog QToolBar QToolButton[hasMenu="false"][popupMode="1"], QDialog QToolBar QToolButton[hasMenu="false"][popupMode="2"] { margin: 0em; padding: 0em; } QToolButton[autoRaise="false"] { background-color: #31363b; border: 0.04em solid #76797c; border-radius: 0.09em; } QToolButton[autoRaise="true"] { background-color: #31363b; border: 0.04em solid transparent; } /* Add selectors for the QDialog if a menu is explicitly requested. */ QToolButton[hasMenu="true"], QToolButton[autoRaise="false"][text], QDialog QToolBar QToolButton[hasMenu="true"][popupMode="0"], QDialog QToolBar QToolButton[hasMenu="true"][popupMode="1"], QDialog QToolBar QToolButton[hasMenu="true"][popupMode="2"] { margin: 0.23em; padding: 0.23em; padding-top: 0.1em; padding-right: 1.2em; } QToolButton:hover { border: 0.04em solid #b83232; } QToolButton:checked, QToolButton:pressed { border: 0.04em solid #b83232; background-color: #b83232; } QToolButton::right-arrow, QToolButton::left-arrow, QToolButton::up-arrow, QToolButton::down-arrow { /** * Do not set the arrow width/height here. It causes * small icons in Qt6, and doesn't affect the styling * in Qt5. Both look ideal without manually specified sizes. */ subcontrol-origin: content; subcontrol-position: center; margin: 0em; padding: 0em; } QToolButton::right-arrow:enabled { image: url(:/dark fusion/right_arrow.svg); } QToolButton::left-arrow:enabled { image: url(:/dark fusion/left_arrow.svg); } QToolButton::up-arrow:enabled { image: url(:/dark fusion/up_arrow.svg); } QToolButton::down-arrow:enabled { image: url(:/dark fusion/down_arrow.svg); } QToolButton::right-arrow:disabled { image: url(:/dark fusion/right_arrow_disabled.svg); } QToolButton::left-arrow:disabled { image: url(:/dark fusion/left_arrow_disabled.svg); } QToolButton::up-arrow:disabled { image: url(:/dark fusion/up_arrow_disabled.svg); } QToolButton::down-arrow:disabled { image: url(:/dark fusion/down_arrow_disabled.svg); } QToolButton::menu-indicator { border-image: none; image: url(:/dark fusion/down_arrow.svg); width: 0.8em; height: 0.5em; left: -0.09em; /* -1.2em + 0.09em */ padding-right: -1.11em; /** * Qt5 and Qt6 differ if the subcontrol-origin is set to * the default, AKA, padding. Setting it to the content, * which we adjust the padding to, makes it uniform between * both. */ subcontrol-origin: content; subcontrol-position: right; } /** * Special rule for the drop-down indicator in a QFileDialog. * We want these to be more compact, hence the smaller padding. */ QDialog QToolBar QToolButton[popupMode="2"]::menu-indicator { padding-right: -0.7em; } QToolButton::menu-arrow { border-image: none; image: url(:/dark fusion/down_arrow.svg); width: 0.8em; height: 0.5em; padding-right: 0.09em; subcontrol-position: right; } QToolButton::menu-button { border-top-right-radius: 0.5em; border-bottom-right-radius: 0.5em; /* 1ex width + 0.4ex for border + no text = 2ex allocated above */ width: 1.3em; padding: 0.23em; outline: none; } QToolButton::menu-button::menu-arrow { left: -0.09em; subcontrol-position: right; } QToolButton::menu-button:hover { background-color: transparent; } QToolButton::menu-button:pressed { background-color: transparent; padding: 0.23em; outline: none; } QTableView { border: 0em solid black; gridline-color: #31363b; background-color: #1d2023; } QTableView:!selected, QTableView:selected { border: 0em solid black; } QTableView { border-radius: 0em; } QAbstractItemView::item { color: #eff0f1; } QAbstractItemView::item:pressed { background: #972b2b; color: #eff0f1; } QAbstractItemView::item:selected:!active { background: rgba(255, 0, 20, 0.1); } /* Use background with qlineargradient to avoid ugly border on widget. */ QAbstractItemView::item:selected:active { background: qlineargradient( x1: 0.5, y1: 0.5 x2: 0.5, y2: 1, stop: 0 #972b2b, stop: 1 #972b2b ); color: #eff0f1; } QAbstractItemView::item:selected:hover { background: qlineargradient( x1: 0.5, y1: 0.5 x2: 0.5, y2: 1, stop: 0 #981f1f, stop: 1 #981f1f ); color: #eff0f1; } QHeaderView { background-color: #31363b; border: 0.04em transparent; border-radius: 0em; margin: 0em; padding: 0em; } QHeaderView::section { background-color: #31363b; border: 0.04em solid #76797c; color: #eff0f1; border-radius: 0em; padding: 0em 0.23em 0em 0.23em; text-align: center; } QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one { border-top: 0.04em solid #76797c; } QHeaderView::section::vertical { border-top: transparent; } QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one { border-left: 0.04em solid #76797c; } QHeaderView::section::horizontal { border-left: transparent; } QHeaderView[showSortIndicator="true"]::section::horizontal { /* Same as the width of the arrow subcontrols below. */ padding-right: 0.8em; } QHeaderView::section:checked { color: #ffffff; background-color: #682727; } /* Note that this doesn't work for QTreeView unless the header is clickable */ QHeaderView::section:hover, QHeaderView::section::horizontal::first:hover, QHeaderView::section::horizontal::only-one:hover, QHeaderView::section::vertical::first:hover, QHeaderView::section::vertical::only-one:hover { border: 0.04em solid #b83232; } QHeaderView[showSortIndicator="true"]::down-arrow { image: url(:/dark fusion/down_arrow.svg); /** * Qt5 and Qt6 differ if the subcontrol-origin is set to * the default, AKA, padding. Setting it to the content, * which we adjust the padding to, makes it uniform between * both. */ subcontrol-origin: content; subcontrol-position: center right; width: 0.8em; height: 0.5em; /** * Qt5 and Qt6 have different ideas of the padding of the * arrow subcontrols: using `padding-left` to ensure that * the width is undone fixes the padding of the content by * an extra `0.8em` in Qt6, but doesn't affect Qt5. */ padding-right: 0.09em; padding-left: -0.8em; } QHeaderView[showSortIndicator="true"]::up-arrow { image: url(:/dark fusion/up_arrow.svg); subcontrol-origin: content; subcontrol-position: center right; width: 0.8em; height: 0.5em; padding-right: 0.09em; padding-left: -0.8em; } QTableView QTableCornerButton::section { background-color: #31363b; border: 0.04em transparent #76797c; border-top: 0.04em solid #76797c; border-left: 0.04em solid #76797c; border-radius: 0em; } /* No hover event */ QTableView QTableCornerButton:hover { border: 0.04em transparent #76797c; } QTableView QTableCornerButton::section:pressed { border: 0.04em solid #b83232; border-radius: 0em; } QToolBox { padding: 0.23em; border: 0.09em transparent black; } QToolBox::tab { border-bottom: 0.09em solid #76797c; margin-left: 1.5em; } QToolBox::tab:selected, QToolBox::tab:hover { border-bottom: 0.09em solid #b83232; } QSplitter::handle { border: 0.09em solid #2c3034; background: -0.5em solid #2c3034; max-width: 0em; max-height: 0em; } /** * It's not possible to get satisfactory rounded borders here. * If you set the border to be negative, while adjusting the * widths, you get an asymmetrical curve which produces an * unappealing border. */ QProgressBar:horizontal, QProgressBar:vertical { background-color: #626568; border: 0.9em solid #31363b; border-radius: 0.13em; padding: 0em; } QProgressBar:horizontal { height: 0.2em; min-width: 6em; text-align: right; padding-left: -0.03em; padding-right: -0.03em; margin-top: 0.2em; margin-bottom: 0.2em; margin-right: 1.3em; } QProgressBar:vertical { width: 0.2em; min-height: 6em; text-align: bottom; padding-top: -0.03em; padding-bottom: -0.03em; margin-left: 0.2em; margin-right: 0.2em; margin-bottom: 0.41em; } QProgressBar::chunk:horizontal, QProgressBar::chunk:vertical { background-color: #b83232; border: 0.9em transparent; border-radius: 0.08em; } QScrollArea, QScrollArea:focus, QScrollArea:hover { border: 0em solid black; } /* ICONS */ /** * Qt's built-in icons can look pretty bad if the system theme * is a different color than the current one. For example, when * using a dark theme, with a light UI, the `Ok` button is greyed * out for an about dialog. * * QDialogButtonBox will apply for all standard buttons in all standard * widgets, such as QMessageBox, etc. However, we do need to override * standard icons elsewhere. * * The rest of the icons make little sense to implement: * Qt uses native window decorations. * Qt normally uses native file dialogs, which look nicer. * Media controls are used in custom widgets, which aren't standard. */ QDialogButtonBox { dialogbuttonbox-buttons-have-icons: true; dialog-cancel-icon: url(:/dark fusion/dialog_cancel.svg); dialog-close-icon: url(:/dark fusion/dialog_close.svg); dialog-ok-icon: url(:/dark fusion/dialog_ok.svg); dialog-open-icon: url(:/dark fusion/dialog_open.svg); dialog-reset-icon: url(:/dark fusion/dialog_reset.svg); dialog-save-icon: url(:/dark fusion/dialog_save.svg); /** * No support yet for overriding saveall. * dialog-saveall-icon: url(:/dark fusion/dialog_saveall.svg); */ dialog-yes-icon: url(:/dark fusion/dialog_ok.svg); dialog-help-icon: url(:/dark fusion/dialog_help.svg); dialog-no-icon: url(:/dark fusion/dialog_no.svg); dialog-apply-icon: url(:/dark fusion/dialog_ok.svg); dialog-discard-icon: url(:/dark fusion/dialog_discard.svg); } /* Set some styles for these custom dialog buttons */ QDialogButtonBox QPushButton, QMessageBox QPushButton { min-height: 1.1em; min-width: 5em; } /** * Special rules for creating a custom titlebar. This can only work * when setting the Qt property `isTitlebar` to `true`. */ QWidget[isTitlebar="true"], QWidget[isTitlebar="true"] * { background-color: #2c3034; } /** * Special rules for creating a border around a top-level frame of a window. * This can only work when setting the Qt property `isWindow` to `true`. * We've manually enumerated border widths from 1-5 below. */ QFrame[isWindow="true"], QFrame[frameShape][isWindow="true"] { border: 0px transparent #2c3034; } QFrame[isWindow="true"][windowFrame="1"], QFrame[frameShape][isWindow="true"][windowFrame="1"] { border: 1px solid #2c3034; border-radius: 3px; } QFrame[isWindow="true"][windowFrame="2"], QFrame[frameShape][isWindow="true"][windowFrame="2"] { border: 2px solid #2c3034; border-radius: 3px; } QFrame[isWindow="true"][windowFrame="3"], QFrame[frameShape][isWindow="true"][windowFrame="3"] { border: 3px solid #2c3034; border-radius: 3px; } QFrame[isWindow="true"][windowFrame="4"], QFrame[frameShape][isWindow="true"][windowFrame="4"] { border: 4px solid #2c3034; border-radius: 3px; } QFrame[isWindow="true"][windowFrame="5"], QFrame[frameShape][isWindow="true"][windowFrame="5"] { border: 5px solid #2c3034; border-radius: 3px; } /** * ADVANCED DOCKING SYSTEM STYLESHEET * ---------------------------------- */ /** * The general approach is as follows: * 1. Turn `qproperty-icon` off. * This avoids having a weird background, preventing our desired icon. * This is presumably because ADS uses `qproperty-icon`. * 2. Ensure the background is set. * This is to avoid any QToolButton styling hints when the * widget is clicked. * 3. Set the QTOolButton width and height. * This gives us consistent icon sizes without compression. * 4. Undo the border. * Must keep the border width identical to before (0.04em), * to avoid moving the widgets on pressed/hover events. */ #tabCloseButton, #dockAreaCloseButton, #tabsMenuButton, #detachGroupButton, #floatingTitleCloseButton, #floatingTitleMaximizeButton { qproperty-icon: url(:/dark fusion/transparent.svg); background: #31363b; width: 1.2em; height: 1.2em; padding: 0em; margin: 0em; border: 0.04em transparent black; } #tabsMenuButton, #floatingTitleMaximizeButton { /* Need to make the icon smaller, or else it's unusually large. */ width: 0.8em; } #tabCloseButton:hover, #dockAreaCloseButton:hover, #tabsMenuButton:hover, #detachGroupButton:hover, #floatingTitleCloseButton:hover, #floatingTitleMaximizeButton:hover, #tabCloseButton:pressed, #dockAreaCloseButton:pressed, #tabsMenuButton:pressed, #detachGroupButton:pressed, #floatingTitleCloseButton:pressed, #floatingTitleMaximizeButton:pressed { background: #31363b; } #tabCloseButton, #dockAreaCloseButton, #floatingTitleCloseButton { image: url(:/dark fusion/ads_close.svg); } #tabCloseButton:hover, #dockAreaCloseButton:hover, #floatingTitleCloseButton:hover { image: url(:/dark fusion/ads_close_hover.svg); } #tabCloseButton:pressed, #dockAreaCloseButton:pressed, #floatingTitleCloseButton:pressed { image: url(:/dark fusion/ads_close_pressed.svg); } #tabsMenuButton { image: url(:/dark fusion/ads_menu_button.svg); } #tabsMenuButton:hover { image: url(:/dark fusion/ads_menu_button_hover.svg); } #tabsMenuButton:pressed { image: url(:/dark fusion/ads_menu_button_pressed.svg); } #tabsMenuButton::menu-indicator { image: none; } #detachGroupButton { image: url(:/dark fusion/ads_detach.svg); } #detachGroupButton:hover { image: url(:/dark fusion/ads_detach_hover.svg); } #detachGroupButton:pressed { image: url(:/dark fusion/ads_detach_hover_pressed.svg); } /* FLOATING */ /* Disable the default icons when the dock is floating. */ ads--CFloatingWidgetTitleBar { qproperty-maximizeIcon: url(:/dark fusion/transparent.svg); qproperty-normalIcon: url(:/dark fusion/transparent.svg); } #floatingTitleMaximizeButton { image: url(:/dark fusion/ads_maximize.svg); } #floatingTitleMaximizeButton:hover { image: url(:/dark fusion/ads_maximize_hover.svg); } #floatingTitleMaximizeButton:pressed { image: url(:/dark fusion/ads_maximize_pressed.svg); } /** * Using the `maximized="true"`, `isMaximized="true"`, or other attribute * selectors don't work, and since the maximize button and minimize * button are always the same... * * To get a nicer looking UI, just use the same maximize and restore * buttons. */ /* TABS */ ads--CDockWidgetTab { border: 0.04em solid #76797c; border-top: 0.09em solid #76797c; background-color: #2c3034; padding: 0.23em; min-width: 50px; border-radius: 0.09em; border-bottom-left-radius: 0em; border-bottom-right-radius: 0em; } ads--CDockWidgetTab[activeTab="true"] { background-color: #31363b; border-top: 0.09em solid #b83232; border-left: 0.04em solid #76797c; border-right: 0.04em solid #76797c; border-bottom: 0.04em transparent #76797c; } ads--CDockWidgetTab QLabel { background-color: #2c3034; } ads--CDockWidgetTab[activeTab="true"] QLabel { background-color: #31363b; } /** * CDockWidgetTab doesn't seem to have the concept of `::next-selected` * and `::previous-selected`, so we just draw the borders for everything. * It's not nearly as pretty, but it's not bad either. */ /* OVERLAY */ ads--CDockOverlayCross { qproperty-iconFrameColor: #b83232; qproperty-iconBackgroundColor: #1d2023; qproperty-iconOverlayColor: #b83232; qproperty-iconArrowColor: #eff0f1; qproperty-iconShadowColor: transparent; } /** * This adds support for the focus highlighting feature of the ADS. * https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/blob/master/doc/user-guide.md#focushighlighting */ ads--CDockWidgetTab[focused="true"] { background-color: rgba(218, 60, 66, 0.2); border-color: rgba(218, 60, 66, 0.25); border-top-color: #b83232; } ads--CDockWidgetTab[focused="true"] QLabel, ads--CDockWidgetTab[focused="true"] #tabCloseButton { background-color: transparent; } /** * QDOCKWIDGET TOOLTIP STYLESHEET * ------------------------------ */ QAbstractButton#qt_dockwidget_closebutton { qproperty-toolTip: "Close"; } QAbstractButton#qt_dockwidget_floatbutton { qproperty-toolTip: "Detach"; } ================================================ FILE: resources/light_style.qss ================================================ /* * BreezeDark stylesheet. * * :author: Colin Duquesnoy * :editor: Alex Huszagh * :license: MIT, see LICENSE.md * * This is originally a fork of QDarkStyleSheet, and is based on Breeze/ * BreezeDark color scheme, but is in no way affiliated with KDE. * * --------------------------------------------------------------------- * The MIT License (MIT) * * Copyright (c) <2013-2014> * Copyright (c) <2015-2021> * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * --------------------------------------------------------------------- */ /** * MAIN STYLESHEET * --------------- */ QToolTip { /* 0.2ex is the smallest value that's not ignored on Windows. */ border: 0.04em solid #31363b; background-image: none; background-color: #eff0f1; alternate-background-color: #eaebec; color: #31363b; padding: 0.1em; opacity: 200; } QWidget { color: #31363b; background-color: #eff0f1; selection-background-color: rgba(223, 52, 52, 0.5); selection-color: #31363b; background-clip: border; border-image: none; /* QDialogButtonBox icons */ dialog-cancel-icon: url(:/light fusion/dialog_cancel.svg); dialog-close-icon: url(:/light fusion/dialog_close.svg); dialog-ok-icon: url(:/light fusion/dialog_ok.svg); dialog-open-icon: url(:/light fusion/dialog_open.svg); dialog-reset-icon: url(:/light fusion/dialog_reset.svg); dialog-save-icon: url(:/light fusion/dialog_save.svg); dialog-yes-icon: url(:/light fusion/dialog_ok.svg); dialog-help-icon: url(:/light fusion/dialog_help.svg); dialog-no-icon: url(:/light fusion/dialog_no.svg); dialog-apply-icon: url(:/light fusion/dialog_ok.svg); dialog-discard-icon: url(:/light fusion/dialog_discard.svg); /* File icons */ filedialog-backward-icon: url(:/light fusion/left_arrow.svg); filedialog-contentsview-icon: url(:/light fusion/file_dialog_contents.svg); filedialog-detailedview-icon: url(:/light fusion/file_dialog_detailed.svg); filedialog-end-icon: url(:/light fusion/file_dialog_end.svg); filedialog-infoview-icon: url(:/light fusion/file_dialog_info.svg); filedialog-listview-icon: url(:/light fusion/file_dialog_list.svg); filedialog-new-directory-icon: url(:/light fusion/folder.svg); filedialog-parent-directory-icon: url(:/light fusion/up_arrow.svg); filedialog-start-icon: url(:/light fusion/file_dialog_start.svg); directory-closed-icon: url(:/light fusion/folder.svg); directory-icon: url(:/light fusion/folder.svg); directory-link-icon: url(:/light fusion/folder_link.svg); directory-open-icon: url(:/light fusion/folder_open.svg); file-icon: url(:/light fusion/file.svg); file-link-icon: url(:/light fusion/file_link.svg); home-icon: url(:/light fusion/home_directory.svg); /* QMessageBox icons */ messagebox-critical-icon: url(:/light fusion/message_critical.svg); messagebox-information-icon: url(:/light fusion/message_information.svg); messagebox-question-icon: url(:/light fusion/message_question.svg); messagebox-warning-icon: url(:/light fusion/message_warning.svg); /* Computer icons */ computer-icon: url(:/light fusion/computer.svg); desktop-icon: url(:/light fusion/desktop.svg); cd-icon: url(:/light fusion/disc_drive.svg); dvd-icon: url(:/light fusion/disc_drive.svg); floppy-icon: url(:/light fusion/floppy_drive.svg); harddisk-icon: url(:/light fusion/hard_drive.svg); network-icon: url(:/light fusion/network_drive.svg); trash-icon: url(:/light fusion/trash.svg); /* Arrow icons */ uparrow-icon: url(:/light fusion/up_arrow.svg); downarrow-icon: url(:/light fusion/down_arrow.svg); leftarrow-icon: url(:/light fusion/left_arrow.svg); rightarrow-icon: url(:/light fusion/right_arrow.svg); backward-icon: url(:/light fusion/left_arrow.svg); forward-icon: url(:/light fusion/right_arrow.svg); /* Titlebar icons */ titlebar-close-icon: url(:/light fusion/window_close.svg); titlebar-contexthelp-icon: url(:/light fusion/help.svg); titlebar-maximize-icon: url(:/light fusion/maximize.svg); titlebar-menu-icon: url(:/light fusion/menu.svg); titlebar-minimize-icon: url(:/light fusion/minimize.svg); titlebar-normal-icon: url(:/light fusion/restore.svg); titlebar-shade-icon: url(:/light fusion/shade.svg); titlebar-unshade-icon: url(:/light fusion/unshade.svg); /* Other icons */ dockwidget-close-icon: url(:/light fusion/close.svg); /** * Only available in Qt6, and causes other issues. See #62. * lineedit-clear-button-icon: url(:/light fusion/clear_text.svg); */ } QWidget:disabled { color: #b4b4b4; background-color: #eff0f1; } QCheckBox { spacing: 0.23em; outline: none; color: #31363b; margin-bottom: 0.09em; opacity: 200; } QCheckBox:disabled { color: #bab9b8; } QGroupBox { /* Need to make sure the groupbox doesn't compress below the title. */ min-height: 1.2em; border: 0.04em solid #bab9b8; border-radius: 0.09em; /** * This gives us enough space at the top to ensure we can move the * title to be inside the guidelines, and the padding at the top * ensures we have space below the title. */ margin-top: 0.5em; padding-top: 1em; } QGroupBox:focus { border: 0.04em solid #bab9b8; border-radius: 0.09em; } QGroupBox::title { /* We need to move 0.6em up to be inside the lines, +1em for padding. */ top: -1.6em; subcontrol-origin: content; subcontrol-position: top center; background: #eff0f1; padding-left: 0.2em; padding-right: 0.2em; } QGroupBox:flat { border-top: 0.04em solid rgba(106, 105, 105, 0.7); border-left: 0.04em transparent #bab9b8; border-right: 0.04em transparent #bab9b8; border-bottom: 0.04em transparent #bab9b8; } QCheckBox::indicator, QTreeView::indicator, QTableWidget::indicator, QGroupBox::indicator { width: 1em; height: 1em; } QGroupBox::indicator:unchecked, QGroupBox::indicator:unchecked:focus, QCheckBox::indicator:unchecked, QCheckBox::indicator:unchecked:focus, QTreeView::indicator:unchecked, QTreeView::indicator:unchecked:focus { border-image: url(:/light fusion/checkbox_unchecked_disabled.svg); } QGroupBox::indicator:unchecked, QCheckBox::indicator:unchecked:hover, QCheckBox::indicator:unchecked:pressed, QTreeView::indicator:unchecked:hover, QTreeView::indicator:unchecked:pressed, QGroupBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:pressed { border: none; border-image: url(:/light fusion/checkbox_unchecked.svg); } QCheckBox::indicator:checked, QTreeView::indicator:checked, QGroupBox::indicator:checked { border-image: url(:/light fusion/checkbox_checked.svg); } QCheckBox::indicator:checked:hover, QCheckBox::indicator:checked:focus, QCheckBox::indicator:checked:pressed, QTreeView::indicator:checked:hover, QTreeView::indicator:checked:focus, QTreeView::indicator:checked:pressed, QGroupBox::indicator:checked:hover, QGroupBox::indicator:checked:focus, QGroupBox::indicator:checked:pressed { border: none; border-image: url(:/light fusion/checkbox_checked.svg); } QCheckBox::indicator:indeterminate, QTreeView::indicator:indeterminate { border-image: url(:/light fusion/checkbox_indeterminate.svg); } QCheckBox::indicator:indeterminate:focus, QCheckBox::indicator:indeterminate:hover, QCheckBox::indicator:indeterminate:pressed, QTreeView::indicator:indeterminate:focus, QTreeView::indicator:indeterminate:hover, QTreeView::indicator:indeterminate:pressed { border-image: url(:/light fusion/checkbox_indeterminate.svg); } QCheckBox::indicator:indeterminate:disabled, QTreeView::indicator:indeterminate:disabled { border-image: url(:/light fusion/checkbox_indeterminate_disabled.svg); } QCheckBox::indicator:checked:disabled, QTreeView::indicator:checked:disabled, QGroupBox::indicator:checked:disabled { border-image: url(:/light fusion/checkbox_checked_disabled.svg); } QCheckBox::indicator:unchecked:disabled, QTreeView::indicator:unchecked:disabled, QGroupBox::indicator:unchecked:disabled { border-image: url(:/light fusion/checkbox_unchecked_disabled.svg); } QRadioButton { spacing: 0.23em; outline: none; color: #31363b; margin-bottom: 0.09em; } QRadioButton:disabled { color: #bab9b8; } QRadioButton::indicator { width: 1em; height: 1em; } QRadioButton::indicator:unchecked, QRadioButton::indicator:unchecked:focus { border-image: url(:/light fusion/radio_unchecked_disabled.svg); } QRadioButton::indicator:unchecked:hover, QRadioButton::indicator:unchecked:pressed { border: none; outline: none; border-image: url(:/light fusion/radio_unchecked.svg); } QRadioButton::indicator:checked { border: none; outline: none; border-image: url(:/light fusion/radio_checked.svg); } QRadioButton::indicator:checked:hover, QRadioButton::indicator:checked:focus, QRadioButton::indicator:checked:pressed { border: none; outline: none; border-image: url(:/light fusion/radio_checked.svg); } QRadioButton::indicator:checked:disabled { outline: none; border-image: url(:/light fusion/radio_checked_disabled.svg); } QRadioButton::indicator:unchecked:disabled { border-image: url(:/light fusion/radio_unchecked_disabled.svg); } QMenuBar { background-color: #eff0f1; color: #31363b; } QMenuBar::item { background: transparent; } QMenuBar::item:selected { background: transparent; border: 0.04em solid rgba(223, 52, 52, 0.5); } QMenuBar::item:disabled { color: #bab9b8; } QMenuBar::item:pressed { background-color: rgba(223, 52, 52, 0.5); color: #31363b; margin-bottom: -0.09em; padding-bottom: 0.09em; } QMenu { color: #31363b; margin: 0.09em; } QMenu::icon { margin: 0.23em; } QMenu::item { /* Add extra padding on the right for the QMenu arrow */ padding: 0.23em 1.5em 0.23em 1.3em; border: 0.09em solid transparent; background: transparent; } QMenu::item:selected { color: #31363b; background-color: rgba(223, 52, 52, 0.5); } QMenu::item:selected:disabled { background-color: #eff0f1; } QMenu::item:disabled { color: #bab9b8; } QMenu::indicator { width: 0.8em; height: 0.8em; /* To align with QMenu::icon, which has a 0.23em margin. */ margin-left: 0.3em; subcontrol-position: center left; } QMenu::indicator:non-exclusive:unchecked { border-image: url(:/light fusion/checkbox_unchecked_disabled.svg); } QMenu::indicator:non-exclusive:unchecked:selected { border-image: url(:/light fusion/checkbox_unchecked_disabled.svg); } QMenu::indicator:non-exclusive:checked { border-image: url(:/light fusion/checkbox_checked.svg); } QMenu::indicator:non-exclusive:checked:selected { border-image: url(:/light fusion/checkbox_checked.svg); } QMenu::indicator:exclusive:unchecked { border-image: url(:/light fusion/radio_unchecked_disabled.svg); } QMenu::indicator:exclusive:unchecked:selected { border-image: url(:/light fusion/radio_unchecked_disabled.svg); } QMenu::indicator:exclusive:checked { border-image: url(:/light fusion/radio_checked.svg); } QMenu::indicator:exclusive:checked:selected { border-image: url(:/light fusion/radio_checked.svg); } QMenu::right-arrow { margin: 0.23em; border-image: url(:/light fusion/right_arrow.svg); width: 0.5em; height: 0.8em; } QMenu::right-arrow:disabled { border-image: url(:/light fusion/right_arrow_disabled.svg); } QAbstractItemView { alternate-background-color: #eff0f1; color: #31363b; border: 0.09em solid #bab9b8; border-radius: 0.09em; } QTabWidget:focus, QCheckBox:focus, QRadioButton:focus, QSlider:focus { border: none; } QLineEdit { background-color: #eff0f1; padding: 0.23em; border-style: solid; border: 0.04em solid #bab9b8; border-radius: 0.09em; color: #31363b; } QAbstractScrollArea { border-radius: 0.09em; border: 0.09em solid #bab9b8; background-color: transparent; } /** * This is the background for the box in the bottom-right corner * whene both scrollbars are active. */ QAbstractScrollArea::corner { background: #eff0f1; } /** * Can't do the KDE style of where the scrollbar handle * becomes light on the hover, and only when the handle * is hovered does it become stylized. This is because * both the handle and the background events are treated * together. */ QScrollBar:horizontal { background-color: #eff0f1; height: 0.65em; margin: 0.13em 0.65em 0.13em 0.65em; border: 0.04em transparent #eff0f1; border-radius: 0.17em; } QScrollBar:horizontal:hover { background-color: #c7c7c6; } QScrollBar::handle:horizontal { background-color: rgba(223, 52, 52, 0.8); border: 0.04em solid rgba(223, 52, 52, 0.8); min-width: 0.5em; border-radius: 0.17em; } QScrollBar::handle:horizontal:hover { background-color: rgba(223, 52, 52, 0.8); border: 0.04em solid rgba(223, 52, 52, 0.8); } QScrollBar::add-line:horizontal { margin: 0em 0.13em 0em 0.13em; border-image: url(:/light fusion/transparent.svg); width: 0.41em; height: 0.41em; subcontrol-position: right; subcontrol-origin: margin; } QScrollBar::sub-line:horizontal { margin: 0em 0.13em 0em 0.13em; border-image: url(:/light fusion/transparent.svg); width: 0.41em; height: 0.41em; subcontrol-position: left; subcontrol-origin: margin; } QScrollBar::add-line:horizontal:hover, QScrollBar::add-line:horizontal:on { border-image: url(:/light fusion/transparent.svg); width: 0.41em; height: 0.41em; subcontrol-position: right; subcontrol-origin: margin; } QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on { border-image: url(:/light fusion/transparent.svg); width: 0.41em; height: 0.41em; subcontrol-position: left; subcontrol-origin: margin; } QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal { background: none; } QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { background: none; } QScrollBar:vertical { background-color: #eff0f1; width: 0.65em; margin: 0.65em 0.13em 0.65em 0.13em; border: 0.04em transparent #eff0f1; border-radius: 0.17em; } QScrollBar:vertical:hover { background-color: #c7c7c6; } QScrollBar::handle:vertical { background-color: rgba(223, 52, 52, 0.8); border: 0.04em solid rgba(223, 52, 52, 0.8); min-height: 0.5em; border-radius: 0.17em; } QScrollBar::handle:vertical:hover { background-color: rgba(223, 52, 52, 0.8); border: 0.04em solid rgba(223, 52, 52, 0.8); } QScrollBar::sub-line:vertical { margin: 0.13em 0em 0.13em 0em; border-image: url(:/light fusion/transparent.svg); height: 0.41em; width: 0.41em; subcontrol-position: top; subcontrol-origin: margin; } QScrollBar::add-line:vertical { margin: 0.13em 0em 0.13em 0em; border-image: url(:/light fusion/transparent.svg); height: 0.41em; width: 0.41em; subcontrol-position: bottom; subcontrol-origin: margin; } QScrollBar::sub-line:vertical:hover, QScrollBar::sub-line:vertical:on { border-image: url(:/light fusion/transparent.svg); height: 0.41em; width: 0.41em; subcontrol-position: top; subcontrol-origin: margin; } QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on { border-image: url(:/light fusion/transparent.svg); height: 0.41em; width: 0.41em; subcontrol-position: bottom; subcontrol-origin: margin; } QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { background: none; } QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { background: none; } QTextEdit { background-color: #eff0f1; color: #31363b; border: 0.04em solid #bab9b8; } QPlainTextEdit { background-color: #eff0f1; color: #31363b; border-radius: 0.09em; border: 0.04em solid #bab9b8; } QSizeGrip { border-image: url(:/light fusion/sizegrip.svg); width: 0.5em; height: 0.5em; } /** * Set the separator to be transparent, since the dock has a border. * On PyQt6, neither the border nor the background seem to be respected. */ QMainWindow::separator { border: 0.09em transparent #bab9b8; background: transparent; } QMenu::separator { height: 0.09em; background-color: #bab9b8; padding-left: 0.2em; margin-top: 0.2em; margin-bottom: 0.2em; margin-left: 0.41em; margin-right: 0.41em; } QFrame[frameShape="2"], /* QFrame::Panel == 0x0003 */ QFrame[frameShape="3"], /* QFrame::WinPanel == 0x0003 */ QFrame[frameShape="4"], /* QFrame::HLine == 0x0004 */ QFrame[frameShape="5"], /* QFrame::VLine == 0x0005 */ QFrame[frameShape="6"] /* QFrame::StyledPanel == 0x0006 */ { border-width: 0.04em; padding: 0.09em; border-style: solid; border-color: #eff0f1; background-color: #bab9b8; border-radius: 0.23em; } /* Provide highlighting for frame objects. */ QFrame[frameShape="2"]:hover, QFrame[frameShape="3"]:hover, QFrame[frameShape="4"]:hover, QFrame[frameShape="5"]:hover, QFrame[frameShape="6"]:hover { border: 0.04em solid rgba(223, 52, 52, 0.5); } /* Don't provide an outline if we have a widget that takes up the space. */ QFrame[frameShape] QAbstractItemView:hover { border: 0em solid black; } /** * Note: I can't really change the background of the toolbars * independently, since KDE Breeze has different colors for the * window bar and the rest of the UI. The top toolbar uses * the window style, and the rest use the application style, * which we can't do. */ QToolBar { font-weight: bold; } QToolBar:horizontal { background: 0.09em solid #eff0f1; } QToolBar:vertical { background: 0.09em solid #eff0f1; } QToolBar::handle:horizontal { border-image: url(:/light fusion/hmovetoolbar.svg); } QToolBar::handle:vertical { border-image: url(:/light fusion/vmovetoolbar.svg); } QToolBar::separator:horizontal { border-image: url(:/light fusion/hseptoolbar.svg); } QToolBar::separator:vertical { border-image: url(:/light fusion/vseptoolbar.svg); } QToolBar QToolButton { font-weight: bold; border: 0.04em transparent black; padding-left: 0.2em; padding-right: 0.3em; } QToolBar QToolButton:hover { border: 0.04em solid rgba(223, 52, 52, 0.5); } QToolBar QToolButton:pressed { border: 0.04em solid rgba(223, 52, 52, 0.5); /* The padding doesn't inherit from `QToolBar QToolButton`, so leave it in. */ padding-left: 0.2em; padding-right: 0.3em; } /** * Special rules for a QFileDialog. * * Due to the widgets, we get rid of the min sizes to allow them * to pack closer together, and ensure we have enough padding for * the drop-down menu in the popup. */ QDialog QToolBar QToolButton[popupMode="0"], QDialog QToolBar QToolButton[popupMode="1"] { padding-left: 0.1em; padding-right: 0.1em; } QDialog QToolBar QToolButton[popupMode="2"] { padding-left: 0.1em; padding-right: 0.7em; } QPushButton { color: #31363b; background-color: #eaebec; border: 0.04em solid #bab9b8; padding: 0.23em; border-radius: 0.09em; outline: none; min-height: 1.1em; } QPushButton:flat, QPushButton:flat:hover { border: 0.04em transparent #bab9b8; } QComboBox:open, QPushButton:open { border-width: 0.04em; border-color: #bab9b8; } QComboBox:closed, QPushButton:closed { border-width: 0.04em; border-color: #bab9b8; } QPushButton:disabled { background-color: #eff0f1; border-width: 0.04em; border-color: #bab9b8; border-style: solid; padding-top: 0.23em; padding-bottom: 0.23em; padding-left: 1ex; padding-right: 1ex; border-radius: 0.04em; color: #b4b4b4; } QPushButton:focus { color: #31363b; } QPushButton:pressed { background-color: #bedfec; padding-top: -0.65em; padding-bottom: -0.74em; color: #31363b; } QComboBox { border: 0.04em solid #bab9b8; border-radius: 0.09em; padding: 0.23em; min-width: 2.5em; } QComboBox:editable { background-color: #eff0f1; } QPushButton:checked { background-color: #c7c7c6; border: 0.04em solid #bab9b8; color: #31363b; } QPushButton:hover { background-color: #eaebec; border: 0.04em solid rgba(223, 52, 52, 0.5); color: #31363b; } QPushButton:checked:hover { background-color: #c7c7c6; border: 0.04em solid rgba(223, 52, 52, 0.5); color: #31363b; } QComboBox:hover, QComboBox:focus, QAbstractSpinBox:hover, QAbstractSpinBox:focus, QLineEdit:hover, QLineEdit:focus, QTextEdit:hover, QTextEdit:focus, QPlainTextEdit:hover, QPlainTextEdit:focus, QAbstractView:hover, QTreeView:hover, QTreeView:focus { border: 0.04em solid rgba(223, 52, 52, 0.5); color: #31363b; } QComboBox:hover:pressed:!editable, QPushButton:hover:pressed, QAbstractSpinBox:hover:pressed, QLineEdit:hover:pressed, QTextEdit:hover:pressed, QPlainTextEdit:hover:pressed, QAbstractView:hover:pressed, QTreeView:hover:pressed { background-color: #eff0f1; } QColumnView { border: 0.04em transparent #eff0f1; } QColumnViewGrip { border-image: url(:/light fusion/sizegrip.svg); } /* Each column in the view is a QAbstractItemView. */ QColumnView QAbstractItemView { border: 0.04em transparent rgba(223, 52, 52, 0.5); } /** * In order to set consistency between Qt5 and Qt6, we need * to ensure that we do the following steps: * 1. Set a consistent `max-height` in the item. Anything * below `0.8em` will cause clipping, so set that value * to ensure the icon isn't larger. * 2. Set padding to ensure the item is properly padded. * 3. Set `0.2em` margins on the top and bottom of the arrows, * and `0.1em` on the left and right to ensure the arrows * are properly padded and have the same size. * * The size consistency only works if both the `::item` subcontrol * `max-height` and the `::*-arrow` subcontrol `margin` is set. */ QColumnView QAbstractItemView::item { padding: 0.23em; max-width: 0.5em; max-height: 0.8em; } QColumnView QAbstractItemView::right-arrow { image: url(:/light fusion/right_arrow.svg); margin: 0.2em 0.1em 0.2em 0.1em; } QColumnView QAbstractItemView::right-arrow:selected, QColumnView QAbstractItemView::right-arrow:hover { image: url(:/light fusion/right_arrow_hover.svg); } QColumnView QAbstractItemView::left-arrow { image: url(:/light fusion/left_arrow.svg); margin: 0.2em 0.1em 0.2em 0.1em; } QColumnView QAbstractItemView::left-arrow:selected, QColumnView QAbstractItemView::left-arrow:hover { image: url(:/light fusion/left_arrow_hover.svg); } QComboBox:hover:pressed:editable { background-color: #eff0f1; } QComboBox QAbstractItemView { /* This happens for the drop-down menu always, whether editable or not.*/ background-color: #eff0f1; selection-background-color: rgba(200, 45, 45, 0.5); outline-color: 0em; border-radius: 0.09em; } QComboBox::drop-down { subcontrol-origin: padding; subcontrol-position: top right; width: 0.65em; border-left-width: 0em; border-left-style: solid; border-top-right-radius: 0.13em; border-bottom-right-radius: 0.13em; } QComboBox::down-arrow { border-image: url(:/light fusion/down_arrow_disabled.svg); width: 0.8em; height: 0.5em; margin-right: 0.41em; } QComboBox::down-arrow:on, QComboBox::down-arrow:hover, QComboBox::down-arrow:focus { border-image: url(:/light fusion/down_arrow.svg); width: 0.8em; height: 0.5em; margin-right: 0.41em; } QAbstractSpinBox { padding: 0.23em; border: 0.09em solid #bab9b8; background-color: #eff0f1; color: #31363b; border-radius: 0.09em; min-width: 3em; min-height: 1em; } QAbstractSpinBox:hover { border: 0.09em solid rgba(223, 52, 52, 0.5); } QAbstractSpinBox:up-button, QAbstractSpinBox:up-button:hover { background-color: transparent; subcontrol-origin: padding; subcontrol-position: center right; padding-right: 0.1em; width: 0.8em; height: 0.5em; } QAbstractSpinBox:down-button, QAbstractSpinBox:down-button:hover { background-color: transparent; subcontrol-origin: padding; subcontrol-position: center left; padding-left: 0.1em; width: 0.8em; height: 0.5em; } /** * Bug fixes for elongated items in QSpinBoxes. * By default, the items are bounded by `down-button` * and `up-button`, so this doesn't actually affect the styling. * * This does however affect some custom styling using * QStyle.CC_ComboBox, which affects QDateEdit. This cannot * be selected using QDateEdit, since it uses a global style. * This sounds nonsensical, because CC_ComboBox isn't a spin box, * but through trial and error, this is in fact the case. * * Affects #40. */ QAbstractSpinBox::up-arrow, QAbstractSpinBox::up-arrow:disabled, QAbstractSpinBox::up-arrow:off, QAbstractSpinBox::up-arrow:!off:!disabled:hover, QAbstractSpinBox::down-arrow, QAbstractSpinBox::down-arrow:disabled, QAbstractSpinBox::down-arrow:off, QAbstractSpinBox::down-arrow:!off:!disabled:hover { border-image: none; width: 0.8em; height: 0.5em; } QAbstractSpinBox::up-arrow { image: url(:/light fusion/up_arrow.svg); } QAbstractSpinBox::up-arrow:disabled, QAbstractSpinBox::up-arrow:off { image: url(:/light fusion/up_arrow_disabled.svg); } QAbstractSpinBox::up-arrow:hover { image: url(:/light fusion/up_arrow_hover.svg); } QAbstractSpinBox::down-arrow { image: url(:/light fusion/down_arrow.svg); } QAbstractSpinBox::down-arrow:disabled, QAbstractSpinBox::down-arrow:off { image: url(:/light fusion/down_arrow_disabled.svg); } QAbstractSpinBox::down-arrow:!off:!disabled:hover { image: url(:/light fusion/down_arrow_hover.svg); } QDoubleSpinBox { min-width: 4em; } /** * `QCalendarWidget QAbstractItemView:enabled` sets the color, background * color, and selection color for active dates in the view. * `QCalendarWidget QAbstractItemView:enabled` sets the disabled dates. */ QCalendarWidget QAbstractItemView:enabled { color: #31363b; selection-color: #31363b; selection-background-color: rgba(223, 52, 52, 0.5); } /* Won't take hover events. */ QPrevNextCalButton { min-width: 0.8em; min-height: 1.2em; qproperty-iconSize: 0px 0px; } QPrevNextCalButton#qt_calendar_nextmonth { image: url(:/light fusion/calendar_next.svg); } QPrevNextCalButton#qt_calendar_prevmonth { image: url(:/light fusion/calendar_previous.svg); } /** * Setting for the month and year displays and drop-down menu for the * month select. We style this separately because we want a drop-down * indicator in the bottom right, unlike the normal QToolButton. */ QCalendarWidget QToolButton { background-color: transparent; border: 0.04em solid #bab9b8; border-radius: 0.09em; margin: 0.23em; padding: 0.23em; padding-top: 0.1em; padding-right: 1.2em; min-height: 1.1em; } QCalendarWidget QToolButton:hover { border: 0.04em solid rgba(223, 52, 52, 0.5); } QCalendarWidget QToolButton:checked, QCalendarWidget QToolButton:pressed { background-color: rgba(223, 52, 52, 0.5); padding: 0.23em; padding-right: 1.2em; min-height: 1.3em; outline: none; } /** * The QCalendarWidget for QDateTimeEdit seems to improperly * style the year QToolButton, which has an object name * `qt_datetimedit_calendar`, so ensure we style it as well. */ QCalendarWidget QToolButton::menu-indicator, #qt_datetimedit_calendar QCalendarWidget QToolButton::menu-indicator { border-image: none; image: url(:/light fusion/down_arrow.svg); width: 0.8em; height: 0.5em; top: -0.7ex; left: -0.09em; padding-right: -1.11em; subcontrol-origin: content; subcontrol-position: bottom right; } QCalendarWidget QToolButton::menu-arrow, #qt_datetimedit_calendar QCalendarWidget QToolButton::menu-arrow { border-image: none; image: url(:/light fusion/down_arrow.svg); width: 0.8em; height: 0.5em; padding-right: 0.09em; subcontrol-origin: content; subcontrol-position: bottom right; } /** * Setting for the year button. Both the month select and the year * select are QToolButtons, and both are auto-raised. The year * button however has the popup mode set to `DelayedPopup`. */ QCalendarWidget QToolButton[autoRaise="true"][popupMode="0"] { padding: 0.23em; } QCalendarWidget QSpinBox { max-height: 1.5em; min-width: 3.5em; margin: 0em; margin-top: 0.2em; padding: 0em; outline: 0em; padding-left: 0.5em; } QLabel { border: 0em solid black; } /* BORDERS */ QTabWidget::pane { padding: 0.23em; margin: 0.04em; } QTabWidget::pane:top { border: 0.04em solid #bab9b8; top: -0.04em; } QTabWidget::pane:bottom { border: 0.04em solid #bab9b8; bottom: -0.04em; } QTabWidget::pane:left { border: 0.04em solid #bab9b8; left: -0.04em; } QTabWidget::pane:right { border: 0.04em solid #bab9b8; right: -0.04em; } QTabBar { qproperty-drawBase: 0; left: 0.23em; border-radius: 0.13em; /** * Note: this is the underline for each tab title. It's not * documented, and this took forever to track down. At least * 10 hours have been wasted trying to turn off this line, * do not deleted this comment. */ selection-color: transparent; } QTabBar:focus { border: 0em transparent black; } QTabBar::close-button { /* Doesn't seem possible to resize these buttons */ border-image: url(:/light fusion/transparent.svg); image: url(:/light fusion/close.svg); background: transparent; } QTabBar::close-button:hover { image: url(:/light fusion/close_hover.svg); } QTabBar::close-button:pressed { image: url(:/light fusion/close_pressed.svg); } /* TOP TABS */ QTabBar::tab:top, QTabBar::tab:top:last, QTabBar::tab:top:only-one { color: #31363b; border: 0.04em transparent black; border-left: 0.04em solid #bab9b8; border-right: 0.04em solid #bab9b8; border-top: 0.09em solid rgba(223, 52, 52, 0.5); background-color: #eff0f1; padding: 0.23em; min-width: 50px; border-radius: 0.09em; border-bottom-left-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:top:first, QTabBar::tab:top:only-one { margin-left: 0.04em; } QTabBar::tab:top:last, QTabBar::tab:top:only-one { margin-right: 0.04em; } QTabBar::tab:top:!selected { color: #31363b; background-color: #d9d8d7; border: 0.04em transparent black; border-right: 0.04em solid #bab9b8; border-bottom: 0.04em solid #bab9b8; border-radius: 0.09em; border-bottom-left-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:top:next-selected { border-right: 0.04em transparent #d9d8d7; border-bottom-left-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:top:!selected:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-bottom-left-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:top:!selected:first:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-bottom-left-radius: 0em; border-bottom-right-radius: 0em; } /* BOTTOM TABS */ QTabBar::tab:bottom, QTabBar::tab:bottom:last, QTabBar::tab:bottom:only-one { color: #31363b; border: 0.04em transparent black; border-left: 0.04em solid #bab9b8; border-right: 0.04em solid #bab9b8; border-bottom: 0.09em solid rgba(223, 52, 52, 0.5); background-color: #eff0f1; padding: 0.23em; min-width: 50px; border-radius: 0.09em; border-top-left-radius: 0em; border-top-right-radius: 0em; } QTabBar::tab:bottom:first, QTabBar::tab:bottom:only-one { margin-left: 0.08em; } QTabBar::tab:bottom:last, QTabBar::tab:bottom:only-one { margin-right: 0.08em; } QTabBar::tab:bottom:!selected { color: #31363b; background-color: #d9d8d7; border: 0.04em transparent black; border-top: 0.04em solid #bab9b8; border-right: 0.04em solid #bab9b8; border-radius: 0.09em; border-top-left-radius: 0em; border-top-right-radius: 0em; } QTabBar::tab:bottom:next-selected { border-right: 0.04em transparent #d9d8d7; border-top-left-radius: 0em; border-top-right-radius: 0em; } QTabBar::tab:bottom:!selected:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-top-left-radius: 0em; border-top-right-radius: 0em; } QTabBar::tab:bottom:!selected:first:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-top-left-radius: 0em; border-top-right-radius: 0em; } /* LEFT TABS */ QTabBar::tab:left, QTabBar::tab:left:last, QTabBar::tab:left:only-one { color: #31363b; border: 0.04em transparent black; border-top: 0.09em solid rgba(223, 52, 52, 0.5); border-bottom: 0.04em solid #bab9b8; border-left: 0.04em solid #bab9b8; background-color: #eff0f1; padding: 0.23em; min-height: 50px; border-radius: 0.09em; border-top-right-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:left:first, QTabBar::tab:left:only-one { margin-top: 0.08em; } QTabBar::tab:left:last, QTabBar::tab:left:only-one { margin-bottom: 0.08em; } QTabBar::tab:left:!selected { color: #31363b; background-color: #d9d8d7; border: 0.04em transparent black; border-top: 0.04em solid #bab9b8; border-right: 0.04em solid #bab9b8; border-radius: 0.09em; border-top-right-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:left:previous-selected { border-top: 0.04em transparent #d9d8d7; border-top-right-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:left:!selected:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-top-right-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:left:!selected:first:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-top-right-radius: 0em; border-bottom-right-radius: 0em; } /* RIGHT TABS */ QTabBar::tab:right, QTabBar::tab:right:last, QTabBar::tab:right:only-one { color: #31363b; border: 0.04em transparent black; border-top: 0.09em solid rgba(223, 52, 52, 0.5); border-bottom: 0.04em solid #bab9b8; border-right: 0.04em solid #bab9b8; background-color: #eff0f1; padding: 0.23em; min-height: 50px; border-radius: 0.09em; border-top-left-radius: 0em; border-bottom-left-radius: 0em; } QTabBar::tab:right:first, QTabBar::tab:right:only-one { margin-top: 0.08em; } QTabBar::tab:right:last, QTabBar::tab:right:only-one { margin-bottom: 0.08em; } QTabBar::tab:right:!selected { color: #31363b; background-color: #d9d8d7; border: 0.04em transparent black; border-top: 0.04em solid #bab9b8; border-left: 0.04em solid #bab9b8; border-radius: 0.09em; border-top-left-radius: 0em; border-bottom-left-radius: 0em; } QTabBar::tab:right:previous-selected { border-top: 0.04em transparent #d9d8d7; border-top-left-radius: 0em; border-bottom-left-radius: 0em; } QTabBar::tab:right:!selected:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-top-left-radius: 0em; border-bottom-left-radius: 0em; } QTabBar::tab:right:!selected:first:hover { background-color: rgba(255, 0, 20, 0.1); border-radius: 0.09em; border-top-left-radius: 0em; border-bottom-left-radius: 0em; } /** * Special styles for triangular QTabWidgets. * These ignore the border attributes, and the border and * text color seems to be set via the `QTabBar::tab` color * property. This seemingly cannot be changed. * * The rounded shapes are 0-3, and the triangular ones are 4-7. * * The QTabBar outline doesn't respect on QTabBar::tab: * border-color * outline-color */ QTabBar[shape="4"]::tab, QTabBar[shape="5"]::tab, QTabBar[shape="6"]::tab, QTabBar[shape="7"]::tab, QTabBar[shape="4"]::tab:last, QTabBar[shape="5"]::tab:last, QTabBar[shape="6"]::tab:last, QTabBar[shape="7"]::tab:last, QTabBar[shape="4"]::tab:only-one, QTabBar[shape="5"]::tab:only-one, QTabBar[shape="6"]::tab:only-one, QTabBar[shape="7"]::tab:only-one { /* Need a dark color without alpha channel since it affects the text. */ color: #df3434; background-color: #eff0f1; padding: 0.23em; } QTabBar[shape="4"]::tab, QTabBar[shape="5"]::tab, QTabBar[shape="4"]::tab:last, QTabBar[shape="5"]::tab:last, QTabBar[shape="4"]::tab:only-one, QTabBar[shape="5"]::tab:only-one { min-width: 50px; } QTabBar[shape="6"]::tab, QTabBar[shape="7"]::tab, QTabBar[shape="6"]::tab:last, QTabBar[shape="7"]::tab:last, QTabBar[shape="6"]::tab:only-one, QTabBar[shape="7"]::tab:only-one { min-height: 50px; } QTabBar[shape="4"]::tab:!selected, QTabBar[shape="5"]::tab:!selected, QTabBar[shape="6"]::tab:!selected, QTabBar[shape="7"]::tab:!selected { color: #31363b; background-color: #d9d8d7; } /** * Increase padding on the opposite side of the icon to avoid text clipping. * * BUG: The padding works for North, West, and East in Qt5, South does not * work. All tab positions work for triangular tabs in Qt6. */ QTabBar[shape="4"][tabsClosable="true"]::tab, QTabBar[shape="5"][tabsClosable="true"]::tab { padding-left: 0.5em; } QTabBar[shape="6"][tabsClosable="true"]::tab { padding-bottom: 0.5em; } QTabBar[shape="7"][tabsClosable="true"]::tab { padding-top: 0.5em; } /** * Undo the padding for the tab. * * Enumerated values are North, South, West, East in that order, * from 4-7. * * NOTE: Any higher padding will clip the icon. */ QTabBar[shape="4"]::close-button, QTabBar[shape="5"]::close-button { padding-left: -0.12em; } QTabBar[shape="6"]::close-button { padding-bottom: -0.18em; } QTabBar[shape="7"]::close-button { padding-top: -0.18em; } QDockWidget { background: #eaebec; /** * It doesn't seem possible to change the border of the * QDockWidget without changing the content margins. */ /** * This is a bug fix so we can handle hover, pressed, and other events. * Reference: https://stackoverflow.com/questions/32145080/qdockwidget-float-close-button-hover-images */ titlebar-close-icon: url(:/light fusion/transparent.svg); titlebar-normal-icon: url(:/light fusion/transparent.svg); } /** * Don't style the title, since it gives a weird, missing border * around the rest of the dock widget, which the remaining border * cannot be removed. * * There is a bug in non-Breeze styles, where the icons are small. It * doesn't change if we use `image` instead of `border-image`, nor if * we use `qproperty-icon`, etc. The icon seem to be half the size * of our desired values. */ QDockWidget::close-button, QDockWidget::float-button { border: 0.04em solid transparent; border-radius: 0.09em; background: transparent; /* Maximum icon size for buttons */ icon-size: 14px; } QDockWidget::float-button { border-image: url(:/light fusion/transparent.svg); image: url(:/light fusion/undock.svg); } QDockWidget::float-button:hover { image: url(:/light fusion/undock_hover.svg); } /* The :pressed events don't register, seems to be a Qt bug. */ QDockWidget::float-button:pressed { image: url(:/light fusion/undock_hover.svg); } QDockWidget::close-button { border-image: url(:/light fusion/transparent.svg); image: url(:/light fusion/close.svg); } QDockWidget::close-button:hover { image: url(:/light fusion/close_hover.svg); } /* The :pressed events don't register, seems to be a Qt bug. */ QDockWidget::close-button:pressed { image: url(:/light fusion/close_pressed.svg); } QTreeView, QListView { background-color: #eff0f1; border: 0em solid black; } QTreeView:selected, QTreeView:!selected, QListView:selected, QListView:!selected { border: 0em solid black; } QTreeView::branch:has-siblings { border-image: url(:/light fusion/vline.svg); image: none; } /* These branch indicators don't scale */ QTreeView::branch:!has-siblings { border-image: none; image: none; } QTreeView::branch:has-siblings:adjoins-item { border-image: url(:/light fusion/branch_more.svg); } QTreeView::branch:!has-children:!has-siblings:adjoins-item { border-image: url(:/light fusion/branch_end.svg); } QTreeView::branch:has-children:!has-siblings:closed, QTreeView::branch:closed:has-children:has-siblings { image: url(:/light fusion/branch_closed.svg); } QTreeView::branch:has-children:!has-siblings:closed:hover, QTreeView::branch:closed:has-children:has-siblings:hover { image: url(:/light fusion/branch_closed_hover.svg); } QTreeView::branch:has-children:!has-siblings:closed, QTreeView::branch:open:has-children:!has-siblings { border-image: url(:/light fusion/branch_end_arrow.svg); } QTreeView::branch:closed:has-children:has-siblings, QTreeView::branch:open:has-children:has-siblings { border-image: url(:/light fusion/branch_more_arrow.svg); } QTreeView::branch:open:has-children:!has-siblings, QTreeView::branch:open:has-children:has-siblings { image: url(:/light fusion/branch_open.svg); } QTreeView::branch:open:has-children:!has-siblings:hover, QTreeView::branch:open:has-children:has-siblings:hover { image: url(:/light fusion/branch_open_hover.svg); } QListView { /* Give space for elements aligned left or right. */ padding: 0.2em; } QTableView::item, QListView::item, QTreeView::item { padding: 0.13em; color: #31363b; } QTreeView::item { /** * Need to set the background color in Qt6, or else * the QTreeView indicators use the style defaults, * along with the box model, which conflicts with our * theme (except with hover/focus/selected pseudostates). * * Affects issue #51. */ background-color: #eff0f1; outline: 0; } QTableView::item:!selected:hover, QListView::item:!selected:hover, QTreeView::item:!selected:hover { background-color: rgba(255, 0, 20, 0.1); outline: 0; color: #31363b; padding: 0.13em; } QAbstractItemView::item QLineEdit { border: 0em transparent black; /* * The top/bottom padding causes the editable widget to conceal text. * https://github.com/Alexhuszagh/BreezeStyleSheets/issues/69 */ padding: 0em; } QSlider::handle:horizontal, QSlider::handle:vertical { background: #eff0f1; border: 0.04em solid rgba(106, 105, 105, 0.7); width: 0.7em; height: 0.7em; border-radius: 0.35em; } QSlider:horizontal { height: 2em; } QSlider:vertical { width: 2em; } QSlider::handle:horizontal { margin: -0.23em 0; } QSlider::handle:vertical { margin: 0 -0.23em; } QSlider::groove:horizontal, QSlider::groove:vertical { background: #d9d8d7; border: 0em solid #eff0f1; border-radius: 0.19em; } QSlider::groove:horizontal { height: 0.4em; } QSlider::groove:vertical { width: 0.4em; } QSlider::handle:horizontal:hover, QSlider::handle:horizontal:focus, QSlider::handle:vertical:hover, QSlider::handle:vertical:focus { border: 0.04em solid #df3434; } QSlider::handle:horizontal:!focus:!hover, QSlider::handle:vertical:!focus:!hover { border: 0.04em solid rgba(106, 105, 105, 0.7); } QSlider::sub-page:horizontal, QSlider::add-page:vertical { background: #df3434; border-radius: 0.19em; } QSlider::add-page:horizontal, QSlider::sub-page:vertical { background: rgba(106, 105, 105, 0.7); border-radius: 0.19em; } /* QToolButton */ /** * QToolButton's that have a push button need to be styled differently, * depending on whether there are actions (a menu) associated with it. * This is signaled by a drop-down arrow on the right of the push button. * Unfortunately, there's no good property to determine this. The property * we need is `QWidget::actions`, however, it's a method and not a * property.Note that the drop-down menu is not signaled by any of the * following: * popupMode: any pop-up mode does not affect the right arrow style. * arrowType: only replaces the icon. * toolButtonStyle: this is almost always set to icon only, even with text. * text: can have a drop-down menu with or without text. * * Notably, we need to ensure we don't pad the widgets in the following * cases: * 1. If the QToolButton is auto-raised. * This adds undesired padding in`QFileDialog`. These widgets * have text, even though no text is visible. This is not the * default, so it won't affect most situations. * 2. If the QToolButton does not have text. * Normally, text-less buttons do not have a menu, and this * is required for #47, since the padding affects the scroll * bar icons in QTabBar. This causes major issues in the * UI, so disable the padding by default. * * The padding can affect the placement of icons and other things * inside the toolbutton: near the menu-button in QFileDialog, * the clear text icon is misplaced vertically, making it nearly * illegible. * * We provide special styles for a custom, dynamic property to * override the padding decisions with or without a menu. * To force styling as if there is a menu, set the `hasMenu` property * to true. Setting `hasMenu` to false will style as if there is no menu. * You can use `QWidget::setProperty` to set this property dynamically. * * The affected issues are #22, #28, #47. * https://github.com/Alexhuszagh/BreezeStyleSheets/issues/22 * https://github.com/Alexhuszagh/BreezeStyleSheets/issues/28 * https://github.com/Alexhuszagh/BreezeStyleSheets/issues/47 */ /** * Use an overly specific selector here to ensure no margins, * or for the default QToolButton. We must have `autoRaise="false"` * and `text` to have padding, so just add a `hasMenu="false"` to * undo the padding in that case. Also add selectors for QDialog * if a menu is explicitly forbidden. */ QToolButton, QToolButton[hasMenu="false"][autoRaise="false"][text], QDialog QToolBar QToolButton[hasMenu="false"][popupMode="0"], QDialog QToolBar QToolButton[hasMenu="false"][popupMode="1"], QDialog QToolBar QToolButton[hasMenu="false"][popupMode="2"] { margin: 0em; padding: 0em; } QToolButton[autoRaise="false"] { background-color: #eff0f1; border: 0.04em solid #bab9b8; border-radius: 0.09em; } QToolButton[autoRaise="true"] { background-color: #eff0f1; border: 0.04em solid transparent; } /* Add selectors for the QDialog if a menu is explicitly requested. */ QToolButton[hasMenu="true"], QToolButton[autoRaise="false"][text], QDialog QToolBar QToolButton[hasMenu="true"][popupMode="0"], QDialog QToolBar QToolButton[hasMenu="true"][popupMode="1"], QDialog QToolBar QToolButton[hasMenu="true"][popupMode="2"] { margin: 0.23em; padding: 0.23em; padding-top: 0.1em; padding-right: 1.2em; } QToolButton:hover { border: 0.04em solid rgba(223, 52, 52, 0.5); } QToolButton:checked, QToolButton:pressed { border: 0.04em solid rgba(223, 52, 52, 0.5); background-color: rgba(223, 52, 52, 0.5); } QToolButton::right-arrow, QToolButton::left-arrow, QToolButton::up-arrow, QToolButton::down-arrow { /** * Do not set the arrow width/height here. It causes * small icons in Qt6, and doesn't affect the styling * in Qt5. Both look ideal without manually specified sizes. */ subcontrol-origin: content; subcontrol-position: center; margin: 0em; padding: 0em; } QToolButton::right-arrow:enabled { image: url(:/light fusion/right_arrow.svg); } QToolButton::left-arrow:enabled { image: url(:/light fusion/left_arrow.svg); } QToolButton::up-arrow:enabled { image: url(:/light fusion/up_arrow.svg); } QToolButton::down-arrow:enabled { image: url(:/light fusion/down_arrow.svg); } QToolButton::right-arrow:disabled { image: url(:/light fusion/right_arrow_disabled.svg); } QToolButton::left-arrow:disabled { image: url(:/light fusion/left_arrow_disabled.svg); } QToolButton::up-arrow:disabled { image: url(:/light fusion/up_arrow_disabled.svg); } QToolButton::down-arrow:disabled { image: url(:/light fusion/down_arrow_disabled.svg); } QToolButton::menu-indicator { border-image: none; image: url(:/light fusion/down_arrow.svg); width: 0.8em; height: 0.5em; left: -0.09em; /* -1.2em + 0.09em */ padding-right: -1.11em; /** * Qt5 and Qt6 differ if the subcontrol-origin is set to * the default, AKA, padding. Setting it to the content, * which we adjust the padding to, makes it uniform between * both. */ subcontrol-origin: content; subcontrol-position: right; } /** * Special rule for the drop-down indicator in a QFileDialog. * We want these to be more compact, hence the smaller padding. */ QDialog QToolBar QToolButton[popupMode="2"]::menu-indicator { padding-right: -0.7em; } QToolButton::menu-arrow { border-image: none; image: url(:/light fusion/down_arrow.svg); width: 0.8em; height: 0.5em; padding-right: 0.09em; subcontrol-position: right; } QToolButton::menu-button { border-top-right-radius: 0.5em; border-bottom-right-radius: 0.5em; /* 1ex width + 0.4ex for border + no text = 2ex allocated above */ width: 1.3em; padding: 0.23em; outline: none; } QToolButton::menu-button::menu-arrow { left: -0.09em; subcontrol-position: right; } QToolButton::menu-button:hover { background-color: transparent; } QToolButton::menu-button:pressed { background-color: transparent; padding: 0.23em; outline: none; } QTableView { border: 0em solid black; gridline-color: #bab9b8; background-color: #eff0f1; } QTableView:!selected, QTableView:selected { border: 0em solid black; } QTableView { border-radius: 0em; } QAbstractItemView::item { color: #31363b; } QAbstractItemView::item:pressed { background: rgba(200, 45, 45, 0.5); color: #31363b; } QAbstractItemView::item:selected:!active { background: rgba(255, 0, 20, 0.1); } /* Use background with qlineargradient to avoid ugly border on widget. */ QAbstractItemView::item:selected:active { background: qlineargradient( x1: 0.5, y1: 0.5 x2: 0.5, y2: 1, stop: 0 rgba(200, 45, 45, 0.5), stop: 1 rgba(200, 45, 45, 0.5) ); color: #31363b; } QAbstractItemView::item:selected:hover { background: qlineargradient( x1: 0.5, y1: 0.5 x2: 0.5, y2: 1, stop: 0 rgba(243, 73, 73, 0.6), stop: 1 rgba(243, 73, 73, 0.6) ); color: #31363b; } QHeaderView { background-color: #eff0f1; border: 0.04em transparent; border-radius: 0em; margin: 0em; padding: 0em; } QHeaderView::section { background-color: #eff0f1; border: 0.04em solid #bab9b8; color: #31363b; border-radius: 0em; padding: 0em 0.23em 0em 0.23em; text-align: center; } QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one { border-top: 0.04em solid #bab9b8; } QHeaderView::section::vertical { border-top: transparent; } QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one { border-left: 0.04em solid #bab9b8; } QHeaderView::section::horizontal { border-left: transparent; } QHeaderView[showSortIndicator="true"]::section::horizontal { /* Same as the width of the arrow subcontrols below. */ padding-right: 0.8em; } QHeaderView::section:checked { color: #272b2f; background-color: #da7c7c; } /* Note that this doesn't work for QTreeView unless the header is clickable */ QHeaderView::section:hover, QHeaderView::section::horizontal::first:hover, QHeaderView::section::horizontal::only-one:hover, QHeaderView::section::vertical::first:hover, QHeaderView::section::vertical::only-one:hover { border: 0.04em solid rgba(223, 52, 52, 0.5); } QHeaderView[showSortIndicator="true"]::down-arrow { image: url(:/light fusion/down_arrow.svg); /** * Qt5 and Qt6 differ if the subcontrol-origin is set to * the default, AKA, padding. Setting it to the content, * which we adjust the padding to, makes it uniform between * both. */ subcontrol-origin: content; subcontrol-position: center right; width: 0.8em; height: 0.5em; /** * Qt5 and Qt6 have different ideas of the padding of the * arrow subcontrols: using `padding-left` to ensure that * the width is undone fixes the padding of the content by * an extra `0.8em` in Qt6, but doesn't affect Qt5. */ padding-right: 0.09em; padding-left: -0.8em; } QHeaderView[showSortIndicator="true"]::up-arrow { image: url(:/light fusion/up_arrow.svg); subcontrol-origin: content; subcontrol-position: center right; width: 0.8em; height: 0.5em; padding-right: 0.09em; padding-left: -0.8em; } QTableView QTableCornerButton::section { background-color: #eff0f1; border: 0.04em transparent #bab9b8; border-top: 0.04em solid #bab9b8; border-left: 0.04em solid #bab9b8; border-radius: 0em; } /* No hover event */ QTableView QTableCornerButton:hover { border: 0.04em transparent #bab9b8; } QTableView QTableCornerButton::section:pressed { border: 0.04em solid rgba(223, 52, 52, 0.5); border-radius: 0em; } QToolBox { padding: 0.23em; border: 0.09em transparent black; } QToolBox::tab { border-bottom: 0.09em solid #bab9b8; margin-left: 1.5em; } QToolBox::tab:selected, QToolBox::tab:hover { border-bottom: 0.09em solid rgba(223, 52, 52, 0.5); } QSplitter::handle { border: 0.09em solid #d9d8d7; background: -0.5em solid #d9d8d7; max-width: 0em; max-height: 0em; } /** * It's not possible to get satisfactory rounded borders here. * If you set the border to be negative, while adjusting the * widths, you get an asymmetrical curve which produces an * unappealing border. */ QProgressBar:horizontal, QProgressBar:vertical { background-color: rgba(106, 105, 105, 0.7); border: 0.9em solid #eff0f1; border-radius: 0.13em; padding: 0em; } QProgressBar:horizontal { height: 0.2em; min-width: 6em; text-align: right; padding-left: -0.03em; padding-right: -0.03em; margin-top: 0.2em; margin-bottom: 0.2em; margin-right: 1.3em; } QProgressBar:vertical { width: 0.2em; min-height: 6em; text-align: bottom; padding-top: -0.03em; padding-bottom: -0.03em; margin-left: 0.2em; margin-right: 0.2em; margin-bottom: 0.41em; } QProgressBar::chunk:horizontal, QProgressBar::chunk:vertical { background-color: #df3434; border: 0.9em transparent; border-radius: 0.08em; } QScrollArea, QScrollArea:focus, QScrollArea:hover { border: 0em solid black; } /* ICONS */ /** * Qt's built-in icons can look pretty bad if the system theme * is a different color than the current one. For example, when * using a dark theme, with a light UI, the `Ok` button is greyed * out for an about dialog. * * QDialogButtonBox will apply for all standard buttons in all standard * widgets, such as QMessageBox, etc. However, we do need to override * standard icons elsewhere. * * The rest of the icons make little sense to implement: * Qt uses native window decorations. * Qt normally uses native file dialogs, which look nicer. * Media controls are used in custom widgets, which aren't standard. */ QDialogButtonBox { dialogbuttonbox-buttons-have-icons: true; dialog-cancel-icon: url(:/light fusion/dialog_cancel.svg); dialog-close-icon: url(:/light fusion/dialog_close.svg); dialog-ok-icon: url(:/light fusion/dialog_ok.svg); dialog-open-icon: url(:/light fusion/dialog_open.svg); dialog-reset-icon: url(:/light fusion/dialog_reset.svg); dialog-save-icon: url(:/light fusion/dialog_save.svg); /** * No support yet for overriding saveall. * dialog-saveall-icon: url(:/light fusion/dialog_saveall.svg); */ dialog-yes-icon: url(:/light fusion/dialog_ok.svg); dialog-help-icon: url(:/light fusion/dialog_help.svg); dialog-no-icon: url(:/light fusion/dialog_no.svg); dialog-apply-icon: url(:/light fusion/dialog_ok.svg); dialog-discard-icon: url(:/light fusion/dialog_discard.svg); } /* Set some styles for these custom dialog buttons */ QDialogButtonBox QPushButton, QMessageBox QPushButton { min-height: 1.1em; min-width: 5em; } /** * Special rules for creating a custom titlebar. This can only work * when setting the Qt property `isTitlebar` to `true`. */ QWidget[isTitlebar="true"], QWidget[isTitlebar="true"] * { background-color: #d9d8d7; } /** * Special rules for creating a border around a top-level frame of a window. * This can only work when setting the Qt property `isWindow` to `true`. * We've manually enumerated border widths from 1-5 below. */ QFrame[isWindow="true"], QFrame[frameShape][isWindow="true"] { border: 0px transparent #d9d8d7; } QFrame[isWindow="true"][windowFrame="1"], QFrame[frameShape][isWindow="true"][windowFrame="1"] { border: 1px solid #d9d8d7; border-radius: 3px; } QFrame[isWindow="true"][windowFrame="2"], QFrame[frameShape][isWindow="true"][windowFrame="2"] { border: 2px solid #d9d8d7; border-radius: 3px; } QFrame[isWindow="true"][windowFrame="3"], QFrame[frameShape][isWindow="true"][windowFrame="3"] { border: 3px solid #d9d8d7; border-radius: 3px; } QFrame[isWindow="true"][windowFrame="4"], QFrame[frameShape][isWindow="true"][windowFrame="4"] { border: 4px solid #d9d8d7; border-radius: 3px; } QFrame[isWindow="true"][windowFrame="5"], QFrame[frameShape][isWindow="true"][windowFrame="5"] { border: 5px solid #d9d8d7; border-radius: 3px; } /** * ADVANCED DOCKING SYSTEM STYLESHEET * ---------------------------------- */ /** * The general approach is as follows: * 1. Turn `qproperty-icon` off. * This avoids having a weird background, preventing our desired icon. * This is presumably because ADS uses `qproperty-icon`. * 2. Ensure the background is set. * This is to avoid any QToolButton styling hints when the * widget is clicked. * 3. Set the QTOolButton width and height. * This gives us consistent icon sizes without compression. * 4. Undo the border. * Must keep the border width identical to before (0.04em), * to avoid moving the widgets on pressed/hover events. */ #tabCloseButton, #dockAreaCloseButton, #tabsMenuButton, #detachGroupButton, #floatingTitleCloseButton, #floatingTitleMaximizeButton { qproperty-icon: url(:/light fusion/transparent.svg); background: #eff0f1; width: 1.2em; height: 1.2em; padding: 0em; margin: 0em; border: 0.04em transparent black; } #tabsMenuButton, #floatingTitleMaximizeButton { /* Need to make the icon smaller, or else it's unusually large. */ width: 0.8em; } #tabCloseButton:hover, #dockAreaCloseButton:hover, #tabsMenuButton:hover, #detachGroupButton:hover, #floatingTitleCloseButton:hover, #floatingTitleMaximizeButton:hover, #tabCloseButton:pressed, #dockAreaCloseButton:pressed, #tabsMenuButton:pressed, #detachGroupButton:pressed, #floatingTitleCloseButton:pressed, #floatingTitleMaximizeButton:pressed { background: #eff0f1; } #tabCloseButton, #dockAreaCloseButton, #floatingTitleCloseButton { image: url(:/light fusion/ads_close.svg); } #tabCloseButton:hover, #dockAreaCloseButton:hover, #floatingTitleCloseButton:hover { image: url(:/light fusion/ads_close_hover.svg); } #tabCloseButton:pressed, #dockAreaCloseButton:pressed, #floatingTitleCloseButton:pressed { image: url(:/light fusion/ads_close_pressed.svg); } #tabsMenuButton { image: url(:/light fusion/ads_menu_button.svg); } #tabsMenuButton:hover { image: url(:/light fusion/ads_menu_button_hover.svg); } #tabsMenuButton:pressed { image: url(:/light fusion/ads_menu_button_pressed.svg); } #tabsMenuButton::menu-indicator { image: none; } #detachGroupButton { image: url(:/light fusion/ads_detach.svg); } #detachGroupButton:hover { image: url(:/light fusion/ads_detach_hover.svg); } #detachGroupButton:pressed { image: url(:/light fusion/ads_detach_hover_pressed.svg); } /* FLOATING */ /* Disable the default icons when the dock is floating. */ ads--CFloatingWidgetTitleBar { qproperty-maximizeIcon: url(:/light fusion/transparent.svg); qproperty-normalIcon: url(:/light fusion/transparent.svg); } #floatingTitleMaximizeButton { image: url(:/light fusion/ads_maximize.svg); } #floatingTitleMaximizeButton:hover { image: url(:/light fusion/ads_maximize_hover.svg); } #floatingTitleMaximizeButton:pressed { image: url(:/light fusion/ads_maximize_pressed.svg); } /** * Using the `maximized="true"`, `isMaximized="true"`, or other attribute * selectors don't work, and since the maximize button and minimize * button are always the same... * * To get a nicer looking UI, just use the same maximize and restore * buttons. */ /* TABS */ ads--CDockWidgetTab { border: 0.04em solid #bab9b8; border-top: 0.09em solid #bab9b8; background-color: #d9d8d7; padding: 0.23em; min-width: 50px; border-radius: 0.09em; border-bottom-left-radius: 0em; border-bottom-right-radius: 0em; } ads--CDockWidgetTab[activeTab="true"] { background-color: #eff0f1; border-top: 0.09em solid rgba(223, 52, 52, 0.5); border-left: 0.04em solid #bab9b8; border-right: 0.04em solid #bab9b8; border-bottom: 0.04em transparent #bab9b8; } ads--CDockWidgetTab QLabel { background-color: #d9d8d7; } ads--CDockWidgetTab[activeTab="true"] QLabel { background-color: #eff0f1; } /** * CDockWidgetTab doesn't seem to have the concept of `::next-selected` * and `::previous-selected`, so we just draw the borders for everything. * It's not nearly as pretty, but it's not bad either. */ /* OVERLAY */ ads--CDockOverlayCross { qproperty-iconFrameColor: rgba(223, 52, 52, 0.5); qproperty-iconBackgroundColor: #eff0f1; qproperty-iconOverlayColor: rgba(223, 52, 52, 0.5); qproperty-iconArrowColor: #31363b; qproperty-iconShadowColor: transparent; } /** * This adds support for the focus highlighting feature of the ADS. * https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/blob/master/doc/user-guide.md#focushighlighting */ ads--CDockWidgetTab[focused="true"] { background-color: rgba(232, 63, 63, 0.2); border-color: rgba(232, 63, 63, 0.25); border-top-color: rgba(223, 52, 52, 0.5); } ads--CDockWidgetTab[focused="true"] QLabel, ads--CDockWidgetTab[focused="true"] #tabCloseButton { background-color: transparent; } /** * QDOCKWIDGET TOOLTIP STYLESHEET * ------------------------------ */ QAbstractButton#qt_dockwidget_closebutton { qproperty-toolTip: "Close"; } QAbstractButton#qt_dockwidget_floatbutton { qproperty-toolTip: "Detach"; } ================================================ FILE: resources/locales/ui.qm ================================================ about_ui_tr About Persepolis Persepolis Download Manager <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! Developers Translators License OK AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! Acknowledgments <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! addlink_ui_tr Add to category: Proxy IP: Port: Change Download Folder Download Folder: Cancel OK Link More Options Advanced Options Add Download Link Download link: Change file name: Detect System Proxy Settings Proxy password: Proxy username: Download username and password Download username: Download password: Remember this path Start time End time Number of connections: Download Later HTTP HTTPS SOCKS5 after_download_src_ui_tr <b>File name</b>: <b>Size</b>: after_download_ui_tr Persepolis Download Manager Open File Open Download Folder OK Don't show this message again. <b>Download Completed!</b> <b>Save as</b>: <b>Link</b>: log_window_ui_tr Report Issue Initialization and information Downloads Errors and warnings mainwindow_src_ui_tr Error: <b>Link</b>: <b>Downloaded</b>: <b>Transfer rate</b>: <b>Estimated time left</b>: <b>Connections</b>: <b>Status</b>: Download Stopped Error - Download Complete <b><center>This link has been added before! Are you sure you want to add it again?</center></b> Download Starts Operation was not successful. Please resume the following category: Not enough free space in: muxing error an error occurred Please update Persepolis. <b>Fragments</b>: mainwindow_ui_tr Persepolis Download Manager Show/Hide system tray icon Add New Download Link Resume Download Pause Download Stop/Cancel Download Properties Progress Exit Start Time End Time Download bottom of the list first Apply After download Shut Down <b>Video file status: </b> <b>Audio file status: </b> <b>Status: </b> <b>Muxing status: </b> downloaded Minimize to System Tray Hide Options Keep System Awake! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Start Mixing <b>Video File Status: </b> <b>Audio File Status: </b> <b>Mixing status: </b> progress_ui_tr Persepolis Download Manager Status: Downloaded: Transfer rate: Estimated time left: Number of connections: Download Information After download Apply Shut Down Download Options Resume Pause Stop Link: setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> setting_ui_tr Preferences Number of tries: <html><head/><body><p>Set timeout in seconds. </p></body></html> Timeout (seconds): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> Number of connections: Change Download Options Volume: Notifications Style: Color scheme: Icons: Notification type: Font: Size: Run Persepolis at startup Keep system awake! <html><head/><body><p>Format HH:MM</p></body></html> Status Video Finder Options Defaults Cancel OK Press new keys Shortcuts Hide main window if close button clicked. <html><head/><body><p>This feature may not work in your operating system.</p></body></html> Language: Wait period between retries (seconds): Don't use certificate to verify the peers <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> Download folder: Create subfolders for Music,Videos, ... in default download folder Save As Enable Notification Sounds Toolbar icons size: Enable system tray icon Show download complete dialog when download is finished Show menubar Show side panel Show download progress window <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Columns Customization Check system clipboard for copied links <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> Download requests from the browser will be executed immediately. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> Chunk size(KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. text_ui_tr Persepolis Download Manager IP: Port: Change Download Folder Proxy password: Proxy username: Download username and password Download username: Download password: Download folder: Number of connections: video_finder_progress_ui_tr <b>Video file status: </b> <b>Audio file status: </b> <b>Muxing status: </b> <b>Mixing status: </b> ================================================ FILE: resources/locales/ui_ar.ts ================================================ about_ui_tr About Persepolis حول بيرسيبولس Persepolis Download Manager مدير التحميل بيرسيبولس <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers المطورون Translators المترجمون License الرخصة OK تم AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! Acknowledgments <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! addlink_ui_tr Add to category: إضافة إلى فئة: Proxy البروكسي IP: عنوان الآي بي: Port: المنفذ: Change Download Folder تعديل مكان تحميل الملفات: Download Folder: مجلد التحميل: Cancel إلغاء OK تم Link الرابط More Options خيارات إضافية Advanced Options خيارات متقدمة Add Download Link إضافة رابط تحميل Download link: رابط التحميل: Change file name: تعديل اسم الملف: Detect System Proxy Settings اكتشاف إعدادات البروكسي للنظام Proxy password: كلمة سر البروكسي: Proxy username: اسم مستخدم للبروكسي: Download username and password Download username: Download password: Remember this path Start time End time Number of connections: Download Later HTTP HTTPS SOCKS5 after_download_src_ui_tr <b>File name</b>: <b>اسم الملف</b>: <b>Size</b>: <b>الحجم</b>: after_download_ui_tr Persepolis Download Manager مدير التحميل بيرسيبولس Open File فتح ملف Open Download Folder فتح مجلد التحميل OK تم Don't show this message again. لا تعرض هذه الرسالة مرة أخرى. <b>Download Completed!</b> <b>اكتمل التحميل!</b> <b>Save as</b>: <b>حفظ باسم</b>: <b>Link</b>: <b>الرابط</b>: log_window_ui_tr Report Issue الإبلاغ عن مشكلة Initialization and information Downloads Errors and warnings mainwindow_src_ui_tr Error: خطأ: <b>Link</b>: <b>الرابط</b>: <b>Downloaded</b>: <b>المحمل</b>: <b>Transfer rate</b>: <b>معدل النقل</b>: <b>Estimated time left</b>: <b>الوقت المتبقي</b>: <b>Connections</b>: <b>الاتصالات</b>: <b>Status</b>: <b>الحالة</b>: Download Stopped توقف التحميل Error - خطأ - Download Complete اكتمل التحميل <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>لقد تم إضافة هذا الرابط من قبل! هل تريد إضافته مرة أخرى؟</center></b> Download Starts بدء التحميل Operation was not successful. لم تتم العملية بنجاح. Please resume the following category: يرجى استكمال الفئة التالية: Not enough free space in: لا يوجد مساحة كافية في: muxing error خطأ بالمزج an error occurred Please update Persepolis. <b>Fragments</b>: mainwindow_ui_tr Persepolis Download Manager مدير التحميل بيرسيبولس Show/Hide system tray icon إظهار/إخفاء أيقونة علبة النظام Add New Download Link إضافة رابط تحميل جديد Resume Download استئناف التحميل Pause Download إيقاف التحميل مؤقتاَ Stop/Cancel Download إيقاف/إلغاء التحميل Properties الخصائص Progress التقدم Exit خروج Start Time وقت البدء End Time وقت الانتهاء Download bottom of the list first التحميل من أسفل القائمة أولاَ Apply تطبيق After download بعد التحميل Shut Down إيقاف التشغيل <b>Video file status: </b> <b>حالة ملف الفيديو: </b> <b>Audio file status: </b> <b>حالة ملف الصوت: </b> <b>Status: </b> <b>الحالة: </b> <b>Muxing status: </b> <b>حالة المزج: </b> downloaded تحمل Minimize to System Tray Hide Options Keep System Awake! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Start Mixing <b>Video File Status: </b> <b>Audio File Status: </b> <b>Mixing status: </b> progress_ui_tr Persepolis Download Manager مدير التحميل بيرسيبولس Status: الحالة: Downloaded: المحمل: Transfer rate: معدل النقل: Estimated time left: الوقت المتبقي: Number of connections: عدد الاتصالات: Download Information معلومات التحميل After download بعد التحميل Apply تطبيق Shut Down إيقاف التشغيل Download Options خيارات التحميل Resume استئناف Pause إيقاف مؤقت Stop إيقاف Link: setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> <b><center>لقد تم استخدام هذا الاختصار مسبقا! استخدم اختصار آخر!</center></b> setting_ui_tr Preferences التفضيلات Number of tries: عدد مرات المحاولة: <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p> اضبط وقت الانتهاء بالثواني. </p></body></html> Timeout (seconds): وقت الانتهاء (بالثواني): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> <html><head/><body><p> استخدام اتصالات متعددة يمكن أن يساعد في زيادة سرعة التحميل. </p></body></html> Number of connections: عدد الاتصالات: Change تغيير Download Options خيارات التحميل Volume: الحجم: Notifications التنبيهات Style: النمط: Color scheme: مخطط الألوان: Icons: الأيقونات: Notification type: نوع التنبيهات: Font: الخط: Size: الحجم: Run Persepolis at startup تشغيل بيرسيبولس عند بدء النظام Keep system awake! ابقاء الجهاز منتبه! <html><head/><body><p>Format HH:MM</p></body></html> <html><head/><body><p> الصيغة د د:س س </p></body></html> Status الحالة Video Finder Options خيارات ملتقط الفيديو Defaults الافتراضيات Cancel إلغاء OK تم Press new keys اضغط مفاتيح جديدة Shortcuts الاختصارات Hide main window if close button clicked. إخفاء النافذة الرئيسية عند النقر على زر الإغلاق. <html><head/><body><p>This feature may not work in your operating system.</p></body></html> <html><head/><body><p>قد لا تعمل هذه الخاصية في نظام التشغيل الخاص بك.</p></body></html> Language: Wait period between retries (seconds): Don't use certificate to verify the peers <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> Download folder: Create subfolders for Music,Videos, ... in default download folder Save As Enable Notification Sounds Toolbar icons size: Enable system tray icon Show download complete dialog when download is finished Show menubar Show side panel Show download progress window <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Columns Customization Check system clipboard for copied links <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> Download requests from the browser will be executed immediately. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> Chunk size(KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. text_ui_tr Persepolis Download Manager مدير التحميل بيرسيبولس IP: عنوان الآي بي: Port: المنفذ: Change Download Folder تغيير مجلد التحميل Proxy password: Proxy username: Download username and password Download username: Download password: Download folder: Number of connections: video_finder_progress_ui_tr <b>Video file status: </b> <b>حالة ملف الفيديو: </b> <b>Audio file status: </b> <b>حالة ملف الصوت: </b> <b>Muxing status: </b> <b>حالة المزج: </b> <b>Mixing status: </b> ================================================ FILE: resources/locales/ui_de.ts ================================================ about_ui_tr About Persepolis Über Persepolis Persepolis Download Manager Persepolis Download Manager <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers Entwickler Translators Übersetzer License Lizenz OK OK AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! Acknowledgments <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! addlink_ui_tr Add to category: Zu Kategorie hinzufügen: Proxy Proxy IP: IP: Port: Port: Change Download Folder Download Ordner wechseln Download Folder: Download Ordner: Cancel Abbruch OK OK Link Link More Options Mehr Optionen Advanced Options Fortgeschrittene Optionen Add Download Link Download link: Change file name: Detect System Proxy Settings Proxy password: Proxy username: Download username and password Download username: Download password: Remember this path Start time End time Number of connections: Download Later HTTP HTTPS SOCKS5 after_download_src_ui_tr <b>File name</b>: <b>Dateiname</b>: <b>Size</b>: <b>Dateigröße</b>: after_download_ui_tr Persepolis Download Manager Persepolis Download Manager Open File Datei öffnen Open Download Folder Download Ordner öffnen OK OK Don't show this message again. Diese Nachricht nicht mehr anzeigen. <b>Download Completed!</b> <b>Download beendet!</b> <b>Save as</b>: <b>Speichern als</b>: <b>Link</b>: <b>Link</b>: log_window_ui_tr Report Issue Problem berichten Initialization and information Downloads Errors and warnings mainwindow_src_ui_tr Error: Fehler: <b>Link</b>: <b>Link</b>: <b>Downloaded</b>: <b>Hertuntergeladen</b>: <b>Transfer rate</b>: <b>Übertragungsrate</b>: <b>Estimated time left</b>: <b>Geschätzte Übertragungszeit</b>: <b>Connections</b>: <b>Verbindungen</b>: <b>Status</b>: <b>Status</b>: Download Stopped Download gestoppt Error - Fehler - Download Complete Download abgeschlossen <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>Dieser Link wurde bereits hinzugefügt! Wollen Sie Ihn erneut hinzufügen?</center></b> Download Starts Download startet Operation was not successful. Der Vorgang war nicht erfolgreich. Please resume the following category: Bitte mit folgender Kategorie fortfahren: Not enough free space in: Nicht genug freier Speicher in: muxing error Muxing-Fehler an error occurred Please update Persepolis. <b>Fragments</b>: mainwindow_ui_tr Persepolis Download Manager Persepolis Download Manager Show/Hide system tray icon Symbol in der Systemleiste anzeigen/verbergen Add New Download Link Neuen Download Link hinzufügen Resume Download Download fortfahren Pause Download Download pausieren Stop/Cancel Download Download stoppen/abbrechen Properties Eigenschaften Progress Fortschritt Exit Schließen Start Time Startzeit End Time Abschlusszeit Download bottom of the list first Ende der Liste zuerst herunterladen Apply Anwenden After download Nach dem Download Shut Down Herunterfahren <b>Video file status: </b> Status der Videodatei: <b>Audio file status: </b> Audiodatei Status: <b>Status: </b> Status: <b>Muxing status: </b> Muxing Status: downloaded heruntergeladen Minimize to System Tray Hide Options Keep System Awake! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Start Mixing <b>Video File Status: </b> <b>Audio File Status: </b> <b>Mixing status: </b> progress_ui_tr Persepolis Download Manager Persepolis Download Manager Status: Status: Downloaded: Heruntergeladen: Transfer rate: Übertragungsgeschwindigkeit: Estimated time left: Geschätzte Übertragungszeit: Number of connections: Verbindungen: Download Information Download Information After download Nach dem Download Apply Andwenden Shut Down Herunterfahren Download Options Download Optionen Resume Fortfahren Pause Pause Stop Stop Link: setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> Dieser Shortcut wurde bereits verwendet. -  Bitte verwende einen anderen. setting_ui_tr Preferences Einstellungen Number of tries: Anzahl der Versuche: <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p>Zeitüberschreitung in Sekunden. </p></body></html> Timeout (seconds): Zeitüberschreitung (Sekunden): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> <html><head/><body><p>Mehrfache gleichzeitige Verbindungen können einen Download beschleunigen. </p></body></html> Number of connections: Anzahl der Verbindungen: Change Ändern Download Options Download Optionen Volume: Lautstärke: Notifications Benachrichtigungen Style: Stil: Color scheme: Farbschema: Icons: Symbole: Notification type: Benachrichtigungsart: Font: Schriftart: Size: Größe: Run Persepolis at startup Persepolis beim Systemstart laden Keep system awake! Ruhezustand des Systems verhindern! <html><head/><body><p>Format HH:MM</p></body></html> Zeitformat HH:MM Status Status Video Finder Options Optionen zur Video Suche Defaults Standard Cancel Abbruch OK OK Press new keys Drücke eine neue Taste Shortcuts Shortcuts Hide main window if close button clicked. Verstecke das Hauptfenster wenn der Schließen-Knopf geklickt wurde. <html><head/><body><p>This feature may not work in your operating system.</p></body></html> Diese Funktion funktioniert möglicherweise nicht in Ihrem Betriebssystem. Language: Wait period between retries (seconds): Don't use certificate to verify the peers <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> Download folder: Create subfolders for Music,Videos, ... in default download folder Save As Enable Notification Sounds Toolbar icons size: Enable system tray icon Show download complete dialog when download is finished Show menubar Show side panel Show download progress window <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Columns Customization Check system clipboard for copied links <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> Download requests from the browser will be executed immediately. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> Chunk size(KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. text_ui_tr Persepolis Download Manager Persepolis Download Manager IP: IP: Port: Port: Change Download Folder Download Ordner ändern Proxy password: Proxy username: Download username and password Download username: Download password: Download folder: Number of connections: video_finder_progress_ui_tr <b>Video file status: </b> Status der Videodatei: <b>Audio file status: </b> Status der Audiodatei: <b>Muxing status: </b> Muxing Status: <b>Mixing status: </b> ================================================ FILE: resources/locales/ui_es_ES.ts ================================================ about_ui_tr About Persepolis Acerca de Persepolis Persepolis Download Manager Gestor de descargas Persepolis <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers Desarrolladores: Translators Traductores License Licencia OK Aceptar AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! Acknowledgments <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! addlink_ui_tr Add to category: Añadir a una categoría: Proxy Proxy IP: IP: Port: Puerto: Change Download Folder Cambiar la carpeta de descargas Download Folder: Carpeta de descargas: Cancel Cancelar OK Aceptar Link Enlace More Options Más opciones Advanced Options Opciones avanzadas Add Download Link Download link: Change file name: Detect System Proxy Settings Proxy password: Proxy username: Download username and password Download username: Download password: Remember this path Start time End time Number of connections: Download Later HTTP HTTPS SOCKS5 after_download_src_ui_tr <b>File name</b>: <b>Nombre del archivo</b>: <b>Size</b>: <b>Tamaño</b>: after_download_ui_tr Persepolis Download Manager Gestor de descargas Persepolis Open File Abrir un archivo Open Download Folder Abrir la carpeta de de descargas OK Aceptar Don't show this message again. No mostrar este mensaje nuevamente. <b>Download Completed!</b> <b>¡Descarga completada!</b> <b>Save as</b>: <b>Guardar como</b>: <b>Link</b>: <b>Enlace</b>: log_window_ui_tr Report Issue Informar de un problema Initialization and information Downloads Errors and warnings mainwindow_src_ui_tr Error: Error: <b>Link</b>: <b>Enlace</b>: <b>Downloaded</b>: <b>Descargado</b> <b>Transfer rate</b>: <b>Tasa de transferencia</b>: <b>Estimated time left</b>: <b>Tiempo restante estimado</b>: <b>Connections</b>: <b>Conexiones</b>: <b>Status</b>: <b>Estado</b>: Download Stopped Descarga detenida Error - Error - Download Complete Descarga completa <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>Este enlace ha sido añadido anteriormente. ¿Seguro de que quiere añadirlo de nuevo?</center></b> Download Starts Descarga iniciada Operation was not successful. La operación no tuvo éxito. Please resume the following category: Reanude la categoría siguiente: Not enough free space in: No hay suficiente espacio disponible en: muxing error Error de multiplexación an error occurred Please update Persepolis. <b>Fragments</b>: mainwindow_ui_tr Persepolis Download Manager Gestor de descargas Persepolis Show/Hide system tray icon Mostrar/ocultar el icono de notificación Add New Download Link Añadir un nuevo enlace de descarga Resume Download Reanudar la descarga Pause Download Pausar la descarga Stop/Cancel Download Detener/cancelar la descarga Properties Propiedades Progress Progreso Exit Salir Start Time Hora de inicio End Time Hora de finalización Download bottom of the list first Descargar primero el final de la lista Apply Aplicar After download Después de la descarga Shut Down Apagar el equipo <b>Video file status: </b> <b>Estado del archivo de vídeo: </b> <b>Audio file status: </b> <b>Estado del archivo de audio: </b> <b>Status: </b> <b>Estado: </b> <b>Muxing status: </b> <b>Estado de la multiplexación: </b> downloaded descargado Minimize to System Tray Hide Options Keep System Awake! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Start Mixing <b>Video File Status: </b> <b>Audio File Status: </b> <b>Mixing status: </b> progress_ui_tr Persepolis Download Manager Gestor de descargas Persepolis Status: Estado: Downloaded: Descargado: Transfer rate: Tasa de transferencia: Estimated time left: Tiempo restante estimado: Number of connections: Número de conexiones: Download Information Información de la descarga After download Después de la descarga Apply Aplicar Shut Down Apagar Download Options Opciones de descarga Resume Reanudar Pause Pausar Stop Detener Link: setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> <center><b>Este atajo ya se ha usado antes. ¡Use otro!</b> setting_ui_tr Preferences Preferencias Number of tries: Número de intentos: <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p>Configura el tiempo de espera en segundos. </p></body></html> Timeout (seconds): Tiempo de espera (segundos): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> <html><head/><body><p>El uso de conexiones múltiples puede acelerar la descarga.</p></body></html> Number of connections: Número de conexiones: Change Cambiar Download Options Opciones de descarga Volume: Volumen: Notifications Notificaciones Style: Estilo: Color scheme: Esquema de colores: Icons: Iconos: Notification type: Tipo de notificación: Font: Tipografía: Size: Tamaño: Run Persepolis at startup Ejecutar Persepolis al inicio Keep system awake! ¡Mantenga el sistema activo! <html><head/><body><p>Format HH:MM</p></body></html> <html><head/><body><p>Formato HH:MM</p></body></html> Status Estado Video Finder Options Opciones de la búsqueda de vídeos Defaults Valores por defecto Cancel Cancelar OK Aceptar Press new keys Pulsar teclas nuevas Shortcuts Atajos Hide main window if close button clicked. Ocultar la ventana principal al hacer clic en el botón de cerrar <html><head/><body><p>This feature may not work in your operating system.</p></body></html> <html><head/><body><p>Es posible que esta característica no funcione en su sistema operativo.</p></body></html> Language: Wait period between retries (seconds): Don't use certificate to verify the peers <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> Download folder: Create subfolders for Music,Videos, ... in default download folder Save As Enable Notification Sounds Toolbar icons size: Enable system tray icon Show download complete dialog when download is finished Show menubar Show side panel Show download progress window <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Columns Customization Check system clipboard for copied links <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> Download requests from the browser will be executed immediately. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> Chunk size(KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. text_ui_tr Persepolis Download Manager Gestor de descargas Persepolis IP: Dirección IP: Port: Puerto: Change Download Folder Cambiar la carpeta de descargas Proxy password: Proxy username: Download username and password Download username: Download password: Download folder: Number of connections: video_finder_progress_ui_tr <b>Video file status: </b> <b>Estado del archivo de vídeo: </b> <b>Audio file status: </b> <b>Estado del archivo de audio: </b> <b>Muxing status: </b> <b>Estado de la multiplexación: </b> <b>Mixing status: </b> ================================================ FILE: resources/locales/ui_fa_IR.ts ================================================ about_ui_tr About Persepolis درباره پرسپولیس Persepolis Download Manager دانلود منیجر پرسپولیس <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! https://persepolisdm.github.io <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! https://telegram.me/persepolisdm <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! https://twitter.com/persepolisdm Developers توسعه دهندگان Translators ترجمه‌کنندگان License پروانه OK تایید AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! علیرضا امیرصمیمی محمدرضا عبدالله‌زاده صادق علیرضایی مصطفی اسدی جعفر آخوندعلی کیا حامدی ح. رستمی احسان تی‌تیش محمدامین واحدی‌نیا Acknowledgments قدردانی‌ها <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/yt-dlp/yt-dlp>پروژه YT-DLP</a> <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>پروژه FFmpeg</a> <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>پروژه Pyside</a> <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>پروژه Requests</a> addlink_ui_tr Add to category: افزودن به دسته: Proxy پراکسی IP: آی‌پی: Port: پورت : Change Download Folder تغییر پوشه دانلود Download Folder: پوشه دانلود: Cancel لغو OK تایید Link پیوند More Options گزینه‌های بیشتر Advanced Options گزینه‌های پیشرفته Add Download Link افزودن لینک دانلود Download link: لینک دانلود: Change file name: ویرایش نام پرونده: Detect System Proxy Settings تشخیص تنظیمات پراکسی سیستم Proxy password: گذرواژه پراکسی: Proxy username: نام کاربری پراکسی: Download username and password نام‌کاربری و گذرواژه دانلود Download username: نام‌کاربری دانلود: Download password: گذرواژه دانلود: Remember this path این مسیر را به خاطر بسپار Start time زمان شروع End time زمان پایان Number of connections: شمار اتصال‌ها: Download Later بعدا دانلودکن HTTP HTTP HTTPS HTTPS SOCKS5 SOCKS5 after_download_src_ui_tr <b>File name</b>: <b>نام پرونده</b>: <b>Size</b>: <b>حجم پرونده</b>: after_download_ui_tr Persepolis Download Manager دانلود منیجر پرسپولیس Open File گشودن پرونده Open Download Folder گشودن پوشه دانلود OK تایید Don't show this message again. این پیام را دیگر نشان نده. <b>Download Completed!</b> <b>دانلود به پایان رسید</b> <b>Save as</b>: <b>ذخیره شده در</b>: <b>Link</b>: <b>پیوند</b>: log_window_ui_tr Report Issue گزارش Initialization and information اطلاعات و داده‌های اولیه Downloads دانلودها Errors and warnings خطاها و هشدارها mainwindow_src_ui_tr Error: خطا: <b>Link</b>: <b>پیوند</b>: <b>Downloaded</b>: <b>دانلود شده:</b> <b>Transfer rate</b>: <b>سرعت:</b> <b>Estimated time left</b>: <b>زمان باقیمانده:</b> <b>Connections</b>: <b>تعداد اتصال ها</b> <b>Status</b>: <b>وضعیت:</b> Download Stopped دانلود متوقف شد Error - خطا - Download Complete دانلود به پایان رسید <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>این پیوند قبلا اضافه شده است ! آیا مطمئنید می‌خواهید دوباره آن را بیافزایید ؟</center></b> Download Starts دانلود آغاز شد Operation was not successful. عملیات ناموفق بود. Please resume the following category: لطفا این دسته را ادامه دهید: Not enough free space in: فضای خالی کافی وجود ندارد: muxing error خطای میکس an error occurred خطایی رخ داد Please update Persepolis. لطفا پرسپولیس را بروزرسانی کنید. <b>Fragments</b>: <b>قطعات</b>: mainwindow_ui_tr Persepolis Download Manager دانلود منیجر پرسپولیس Show/Hide system tray icon نمایش/عدم نمایش نمایه در سینی سیستم Add New Download Link افزودن پیوند دانلود نو Resume Download ادامه دانلود Pause Download مکث در دانلود Stop/Cancel Download توقف و لغو دانلود Properties ویژگی ها Progress پیشرفت Exit خروج Start Time زمان شروع End Time زمان پایان Download bottom of the list first ابتدای فهرست را دانلودکن Apply اعمال After download پس از دانلود Shut Down خاموش ‌کردن <b>Video file status: </b> <b>وضعیت پرونده ویدئو</b> <b>Audio file status: </b> <b>وضعیت پرونده صدا: </b>, <b>Status: </b> <b>وضعیت: </b> <b>Muxing status: </b> <b>وضعیت میکس: </b> downloaded بارگیری شد Minimize to System Tray فرستادن برنامه به سینی نمایه Hide Options گزینه‌های مخفی Keep System Awake! سیستم را روشن نگه‌دار! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> <html><head/><body><p>این گزینه از به خواب رفتن سیستم جلوگیری می‌کند این گزینه اگر سیستم شما بصورت خودکار به خواب می رود ضروری است.</p></body></html> Start Mixing شروع میکس <b>Video File Status: </b> <b>وضعیت پرونده ویدئو</b> <b>Audio File Status: </b> <b>وضعیت پرونده صدا: </b>, <b>Mixing status: </b> <b>وضعیت میکس: </b> progress_ui_tr Persepolis Download Manager دانلود منیجر پرسپولیس Status: وضعیت: Downloaded: دانلود شده: Transfer rate: سرعت: Estimated time left: زمان باقیمانده: Number of connections: تعداد اتصالات: Download Information اطلاعات دانلود After download پس از دانلود Apply اعمال Shut Down خاموش کردن Download Options گزینه‌های دانلود Resume ادامه Pause درنگ Stop توقف Link: پیوند: setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> <b><center>این میانبر قبلا استفاده شده است! میانبر دیگری استفاده کنید!</center></b> setting_ui_tr Preferences شخصی‌سازی Number of tries: تعداد تلاش های دوباره: <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p>زمان وقفه را مشخص کنید. </p></body></html> Timeout (seconds): وقفه زمانی (ثانیه): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> <html><head/><body><p>استفاده از چند اتصال می‌تواند به سرعت دانلود شما کمک کند..</p></body></html> Number of connections: تعداد اتصالات: Change تغییر Download Options گزینه‌های دانلود Volume: میزان بلندی صدا: Notifications آگاه‌سازی ها Style: سبک Color scheme: ساختار رنگ Icons: آیکن: Notification type: نوع آگاه‌سازی Font: فونت: Size: اندازه :‌ Run Persepolis at startup اجرای پرسپولیس در ابتدای نشست Keep system awake! سیستم را روشن نگه‌دار! <html><head/><body><p>Format HH:MM</p></body></html> <html><head/><body><p>قالب ساعت:دقیقه</p></body></html> Status وضعیت Video Finder Options گزینه‌های یابنده ویدئو Defaults پیشفرض Cancel لغو OK تایید Press new keys کلیدهای جدیدی را بفشارید Shortcuts میانبرها Hide main window if close button clicked. مخفی کردن پنجره اصلی هنگام انتخاب دکمه بستن <html><head/><body><p>This feature may not work in your operating system.</p></body></html> <html><head/><body><p>این ویژگی شاید در سیستم عامل شما کار نکند.</p></body></html> Language: زبان: Wait period between retries (seconds): درنگ در بین تلاش های دوباره(به ثانیه): Don't use certificate to verify the peers از گواهی برای تأیید همتایان استفاده نکنید <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> <html><head/><body><p>این گزینه از هندشیک ناموفق SSL/TLS جلوگیری می‌کند، اما با مسئولیت خود از آن استفاده کنید </p></body></html> Download folder: پوشه دانلود: Create subfolders for Music,Videos, ... in default download folder برای ویدئو ، موسیقی و... در پوشه پیشفرض دانلود پوشه‌های مجزا بساز Save As ذخیره در Enable Notification Sounds فعال کردن صدای آگاه‌سازی Toolbar icons size: اندازه نمایه‌ها در نواز ابزار :‌ Enable system tray icon فعال کردن نمایه در سینی نمایه Show download complete dialog when download is finished نمایش پنجره پایان دانلود پس از اتمام دانلود Show menubar نمایش منوبار Show side panel نمایش پنل کناری Show download progress window نمایش پنجره پیشرفت دانلود <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> <html><head/><body><p>این گزینه از به خواب رفتن سیستم جلوگیری می‌کند این گزینه اگر سیستم شما بصورت خودکار به خواب می رود ضروری است.</p></body></html> Columns Customization شخصی‌سازی ستون‌ها Check system clipboard for copied links بررسی کلیپ‌بورد برای پیوندهای کپی‌شده <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> <html><head/><body><p>برنامه بصورت خودکار کلیپ‌بورد را برای پیوندهای کپی‌شده بررسی می‌کند. Download requests from the browser will be executed immediately. درخواست های دانلود از مرورگر بلافاصله اجرا می شود. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>پس از ارسال درخواست دانلود از افزونه مرورگر، دانلود بدون نمایش پنجره Add Link شروع می شود.</p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>تعداد تلاش‌ها پس از خطا در دانلود را مشخص کنید</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> <html><head/><body><p>زمان وقفه را مشخص کنید. </p></body></html> Chunk size(KiB): اندازه قطعه (کیلوبایت): It is python requests library chunk size. Do not change this If you are not familiar with it. این اندازه قطعه در کتابخانه requests پایتون است. اگر با آن آشنایی ندارید، آن را تغییر ندهید. text_ui_tr Persepolis Download Manager دانلود منیجر پرسپولیس IP: آی‌پی: Port: پورت: Change Download Folder تغییر پوشه دانلود Proxy password: گذرواژه پراکسی: Proxy username: نام کاربری پراکسی: Download username and password نام‌کاربری و گذرواژه دانلود Download username: نام‌کاربری دانلود: Download password: گذرواژه دانلود: Download folder: پوشه دانلود: Number of connections: شمار اتصال‌ها: video_finder_progress_ui_tr <b>Video file status: </b> <b>وضعیت پروند ویدئو: </b> <b>Audio file status: </b> <b>وضعیت پرونده صدا: </b> <b>Muxing status: </b> <b>وضعیت میکس: </b> <b>Mixing status: </b> <b>وضعیت میکس: </b> ================================================ FILE: resources/locales/ui_fr_FR.ts ================================================ about_ui_tr About Persepolis À propos de Persepolis Persepolis Download Manager Gestionnaire de téléchargement Persepolis <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers Développeurs Translators Traducteurs License Licence OK OK AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia Acknowledgments <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! addlink_ui_tr Add to category: Ajouter à la catégorie : Proxy Proxy IP: IP : Port: Port : Change Download Folder Changer le dossier de téléchargement Download Folder: Dossier de téléchargement : Cancel Annuler OK OK Link Lien More Options Plus d'options Advanced Options Options avancées Add Download Link Ajouter un lien de téléchargement Download link: Lien de téléchargement : Change file name: Changer le nom de fichier : Detect System Proxy Settings Détecter les paramètres système de proxy Proxy password: Mot de passe du proxy : Proxy username: Nom d'utilisateur du proxy : Download username and password Nom d'utilisateur et mot de passe du téléchargement Download username: Nom d'utilisateur du téléchargement : Download password: Mot de passe du téléchargement : Remember this path Se souvenir de ce chemin Start time Heure de début End time Heure de fin Number of connections: Nombre de connexions : Download Later Télécharger plus tard HTTP HTTPS SOCKS5 after_download_src_ui_tr <b>File name</b>: <b>Nom de fichier</b> : <b>Size</b>: <b>Taille</b> : after_download_ui_tr Persepolis Download Manager Gestionnaire de téléchargement Persepolis Open File Ouvrir fichier Open Download Folder Ouvrir le dossier de téléchargement OK OK Don't show this message again. Ne plus afficher ce message. <b>Download Completed!</b> <b>Téléchargement terminé !</b> <b>Save as</b>: <b>Enregistrer sous</b> : <b>Link</b>: <b>Lien</b> : log_window_ui_tr Report Issue Rapporter un problème Initialization and information Downloads Errors and warnings mainwindow_src_ui_tr Error: Erreur : <b>Link</b>: <b>Lien</b> : <b>Downloaded</b>: <b>Téléchargés</b> : <b>Transfer rate</b>: <b>Taux de transfert</b> : <b>Estimated time left</b>: <b>Temps restant estimé</b> : <b>Connections</b>: <b>Connexions</b> : <b>Status</b>: <b>Statut</b> : Download Stopped Téléchargement interrompu Error - Erreur - Download Complete Téléchargement terminé <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>Ce lien a été ajouté auparavant ! Êtes-vous sûr que vous voulez l'ajouter à nouveau ?</center></b> Download Starts Début du téléchargement Operation was not successful. L'opération n'a pas réussi Please resume the following category: Veuillez reprendre le téléchargement de la catégorie suivante : Not enough free space in: Pas assez d'espace libre dans : muxing error erreur de multiplexage an error occurred une erreur est s'est produite Please update Persepolis. <b>Fragments</b>: mainwindow_ui_tr Persepolis Download Manager Gestionnaire de téléchargement Persepolis Show/Hide system tray icon Afficher/cacher l'icône dans la zone de notification Add New Download Link Ajouter un nouveau lien de téléchargement Resume Download Reprendre le téléchargement Pause Download Mettre le téléchargement en pause Stop/Cancel Download Arrêter/Annuler le téléchargement Properties Propriétés Progress Progression Exit Quitter Start Time Heure de début End Time Heure de fin Download bottom of the list first Télécharger d'abord le bas de la liste Apply Appliquer After download Après le téléchargement Shut Down Arrêter <b>Video file status: </b> <b>Statut du fichier vidéo : </b> <b>Audio file status: </b> <b>Statut du fichier audio : </b> <b>Status: </b> <b>Statut : </b> <b>Muxing status: </b> <b>Statut du multiplexage : </b> downloaded téléchargés Minimize to System Tray Réduire dans la zone de notification Hide Options Cacher les options Keep System Awake! Garder le système éveillé ! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> <html><head/><body><p>Cette option empêchera votre système de se mettre en veille. Ceci est nécessaire si votre gestionnaire d'alimentation met le système en veille automatiquement. </p></body></html> Start Mixing Démarrer le multiplexage <b>Video File Status: </b> <b>Statut du fichier vidéo : </b> <b>Audio File Status: </b> <b>Statut du fichier audio : </b> <b>Mixing status: </b> <b>Statut du multiplexage : </b> progress_ui_tr Persepolis Download Manager Gestionnaire de téléchargement Persepolis Status: Statut : Downloaded: Téléchargés : Transfer rate: Taux de transfert : Estimated time left: Temps restant estimé : Number of connections: Nombre de connexions : Download Information Information de téléchargement After download Après le téléchargement Apply Appliquer Shut Down Arrêter Download Options Options de téléchargement Resume Reprendre Pause Mettre en pause Stop Arrêter Link: Lien : setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> <b><center>Ce raccourci a été utilisé auparavant ! Utilisez-en un autre !</center></b> setting_ui_tr Preferences Préférences Number of tries: Nombre de tentatives : <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p>Définir la temporisation en secondes. </p></body></html> Timeout (seconds): Temporisation (secondes) : <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> <html><head/><body><p>Utiliser plusieurs connexion peut aider à accélérer votre téléchargement.</p></body></html> Number of connections: Nombre de connexions : Change Modifier Download Options Options de téléchargement Volume: Volume : Notifications Notifications Style: Style : Color scheme: Thème de couleur : Icons: Icônes : Notification type: Type de notification : Font: Police : Size: Taille : Run Persepolis at startup Lancer Persepolis au démarrage Keep system awake! Garder le système éveillé ! <html><head/><body><p>Format HH:MM</p></body></html> <html><head/><body><p>Format HH:MM</p></body></html> Status Statut Video Finder Options Option de la recherche de vidéos Defaults Par défaut Cancel Annuler OK OK Press new keys Appuyer sur de nouvelles touches Shortcuts Raccourcis Hide main window if close button clicked. Cacher la fenêtre principale si le bouton fermer est cliqué <html><head/><body><p>This feature may not work in your operating system.</p></body></html> <html><head/><body><p>Cette fonctionnalité pourrait ne pas fonctionner dans votre système d'exploitation.</p></body></html> Language: Langue : Wait period between retries (seconds): Temps d'attente entre les tentatives (secondes) : Don't use certificate to verify the peers Ne pas utiliser de certificats pour vérifier les pairs <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> <html><head/><body><p>Cette option évite les échecs de handshake SSL/TLS. Utilisez-la à vos risques et périls !</p></body></html> Download folder: Dossier de téléchargement : Create subfolders for Music,Videos, ... in default download folder Créer des sous-dossiers pour Musique, Vidéos, etc. dans le dossier de téléchargement par défaut Save As Enregistrer sous Enable Notification Sounds Activer les sons de notification Toolbar icons size: Taille des icônes de la barre d'outils : Enable system tray icon Activer l'icône dans la zone de notification. Show download complete dialog when download is finished Afficher une fenêtre d'annonce lorsque le téléchargement est terminé Show menubar Afficher la barre de menus Show side panel Afficher le panneau latéral Show download progress window Afficher la fenêtre de progression des téléchargements <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> <html><head/><body><p>Cette option empêchera votre système de se mettre en veille. Ceci est nécessaire si votre gestionnaire d'alimentation met le système en veille automatiquement. </p></body></html> Columns Customization Personnalisation des colonnes Check system clipboard for copied links <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> Download requests from the browser will be executed immediately. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> Chunk size(KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. text_ui_tr Persepolis Download Manager Gestionnaire de téléchargement Persepolis IP: IP : Port: Port : Change Download Folder Changer le dossier de téléchargement Proxy password: Mot de passe du proxy : Proxy username: Nom d'utilisateur du proxy : Download username and password Nom d'utilisateur et mot de passe du téléchargement Download username: Nom d'utilisateur du téléchargement : Download password: Mot de passe du téléchargement : Download folder: Dossier de téléchargement : Number of connections: Nombre de connexions : video_finder_progress_ui_tr <b>Video file status: </b> <b>Statut du fichier vidéo : </b> <b>Audio file status: </b> <b>Statut du fichier audio : </b> <b>Muxing status: </b> <b>Statut du multiplexage : </b> <b>Mixing status: </b> ================================================ FILE: resources/locales/ui_hu.ts ================================================ about_ui_tr About Persepolis A Persepolis névjegye Persepolis Download Manager Persepolis Download Manager <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers Készítők Translators Fordítók License Licensz OK OK AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! Acknowledgments <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! addlink_ui_tr Add to category: Hozáadás kategóriához: Proxy Proxy IP: IP: Port: Port: Change Download Folder Letöltés helyének módosítása Download Folder: Letöltés helye: Cancel Mégse OK OK Link Link More Options További opciók Advanced Options Haladó opciók Add Download Link Download link: Change file name: Detect System Proxy Settings Proxy password: Proxy username: Download username and password Download username: Download password: Remember this path Start time End time Number of connections: Download Later HTTP HTTPS SOCKS5 after_download_src_ui_tr <b>File name</b>: <b>File name</b>: <b>Size</b>: <b>Size</b>: after_download_ui_tr Persepolis Download Manager Persepolis Download Manager Open File Fájl megnyitása Open Download Folder Letöltés helyének megnyitása OK OK Don't show this message again. Ne jelenjen meg újra ez az üzenet. <b>Download Completed!</b> <b>Letöltés elkészült!</b> <b>Save as</b>: <b>Mentés másként</b>: <b>Link</b>: <b>Link</b>: log_window_ui_tr Report Issue Hibajelentés Initialization and information Downloads Errors and warnings mainwindow_src_ui_tr Error: Hiba: <b>Link</b>: <b>Link</b>: <b>Downloaded</b>: <b>Letöltve</b>: <b>Transfer rate</b>: <b>Átviteli ráta</b>: <b>Estimated time left</b>: <b>Hátralévő idő</b>: <b>Connections</b>: <b>Kapcsolatok</b>: <b>Status</b>: <b>Állapot</b>: Download Stopped Letöltés megállítva Error - Hiba - Download Complete Letöltés befejezve <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>Ezt a linket korábban már hozzáadtad! Biztos, hogy ismét hozzáadod?</center></b> Download Starts Letöltés indítása Operation was not successful. A művelet nem sikerült. Please resume the following category: Folytasd a következő kategóriát: Not enough free space in: Nincs elég hely itt: muxing error muxing hiba an error occurred Please update Persepolis. <b>Fragments</b>: mainwindow_ui_tr Persepolis Download Manager Persepolis Download Manager Show/Hide system tray icon Tálcaikon megjelenítése/elrejtése Add New Download Link Új letöltésilink hozzáadása Resume Download A letöltés folytatása Pause Download A letöltés felfüggesztése Stop/Cancel Download A letöltés leállítása / megszakítása Properties Beállítások Progress Folyamat Exit Kilépés Start Time Kezdés End Time Befejezés Download bottom of the list first Letöltés előszőr a lista aljáról Apply Hozzáad After download Letöltés után Shut Down Kikapcsolás <b>Video file status: </b> <b>Videófájl állapot: </b> <b>Audio file status: </b> <b>Audiófájl állapot: </b> <b>Status: </b> <b>Állapot: </b> <b>Muxing status: </b> <b>Muxing állapot: </b> downloaded letöltve Minimize to System Tray Hide Options Keep System Awake! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Start Mixing <b>Video File Status: </b> <b>Audio File Status: </b> <b>Mixing status: </b> progress_ui_tr Persepolis Download Manager Persepolis Download Manager Status: Állapot: Downloaded: Letöltve: Transfer rate: Átviteli ráta: Estimated time left: Hátralévő idő: Number of connections: Kapcsolatok száma: Download Information Letöltés információ After download Letöltés után Apply Hozzáad Shut Down Kikapcsolás Download Options Letöltés információk Resume Folytatás Pause Felfüggesztés Stop Stop Link: setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> <b><center>Ezt a parancsikont korábban már használtad! Válassz másikat!</center></b> setting_ui_tr Preferences Beállítások Number of tries: Próbálkozások száma: <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p>Időtúllépés beállítása másodpercekben. </p></body></html> Timeout (seconds): Időtúllépés (sec): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> <html><head/><body><p>Több kapcsolat használata felgyorsíthatja a letöltést.</p></body></html> Number of connections: Kapcsolatok száma: Change Változtat Download Options Letöltési opciók Volume: Hangerő: Notifications Értesítések Style: Stílus: Color scheme: Színséma: Icons: Ikonok: Notification type: Értesítés típusa: Font: Betű: Size: Méret: Run Persepolis at startup Persepolis automatikus indítása a rendszerrel Keep system awake! Rendszer ébrentartása <html><head/><body><p>Format HH:MM</p></body></html> <html><head/><body><p>Formátum: ÓÓ:PP</p></body></html> Status Állapot Video Finder Options Videókereső opciók Defaults Alapértelmezés Cancel Mégse OK OK Press new keys Nyomd meg az új billentyűket Shortcuts Parancsikonok Hide main window if close button clicked. Főablak elrejtése a Bezárás gombra való kattintáskor <html><head/><body><p>This feature may not work in your operating system.</p></body></html> <html><head/><body><p>Lehet, hogy ez a szolgáltatás nem működik ezen az operációs rendszeren.</p></body></html> Language: Wait period between retries (seconds): Don't use certificate to verify the peers <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> Download folder: Create subfolders for Music,Videos, ... in default download folder Save As Enable Notification Sounds Toolbar icons size: Enable system tray icon Show download complete dialog when download is finished Show menubar Show side panel Show download progress window <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Columns Customization Check system clipboard for copied links <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> Download requests from the browser will be executed immediately. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> Chunk size(KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. text_ui_tr Persepolis Download Manager Persepolis Download Manager IP: IP: Port: Port: Change Download Folder Letöltés helyének módosítása Proxy password: Proxy username: Download username and password Download username: Download password: Download folder: Number of connections: video_finder_progress_ui_tr <b>Video file status: </b> <b>Videófájl állapot: </b> <b>Audio file status: </b> <b>Audiófájl állapot: </b> <b>Muxing status: </b> <b>Muxing állapot: </b> <b>Mixing status: </b> ================================================ FILE: resources/locales/ui_ko.ts ================================================ about_ui_tr About Persepolis Persepolis 정보 Persepolis Download Manager Persepolis 다운로드 관리자 <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers 개발자 Translators 번역자 License 라이선스 OK 확인 AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia Acknowledgments 감사의 글 <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP 프로젝트</a> <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg 프로젝트</a> <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>Pyside 프로젝트</a> <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>Requests 프로젝트</a> addlink_ui_tr Add to category: 카테고리에 추가하기: Proxy 프록시 IP: IP: Port: 포트: Change Download Folder 다운로드 폴더 변경하기 Download Folder: 다운로드 폴더: Cancel 취소 OK 확인 Link 링크 More Options 추가 옵션 Advanced Options 고급 옵션 Add Download Link 다운로드 링크 추가하기 Download link: 다운로드 링크: Change file name: 파일 이름 변경하기: Detect System Proxy Settings 시스템 프록시 설정 감지하기 Proxy password: 프록시 비밀번호: Proxy username: 프록시 사용자이름: Download username and password 사용자이름 및 비밀번호 다운로드 Download username: 사용자이름 다운로드: Download password: 비밀번호 다운로드: Remember this path 이 경로 기억하기 Start time 시작 시간 End time 종료 시간 Number of connections: 연결 수: Download Later 나중에 다운로드 HTTP HTTP HTTPS HTTPS SOCKS5 SOCKS5 after_download_src_ui_tr <b>File name</b>: <b>파일 이름</b>: <b>Size</b>: <b>크기</b>: after_download_ui_tr Persepolis Download Manager Persepolis 다운로드 관리자 Open File 파일 열기 Open Download Folder 다운로드 폴더 열기 OK 확인 Don't show this message again. 이 메시지를 다시 표시하지 않습니다. <b>Download Completed!</b> <b>다운로드가 완료되었습니다!</b> <b>Save as</b>: <b>다른 이름으로 저장</b>: <b>Link</b>: <b>링크</b>: log_window_ui_tr Report Issue 이슈 보고 Initialization and information Downloads Errors and warnings mainwindow_src_ui_tr Error: 오류: <b>Link</b>: <b>링크</b>: <b>Downloaded</b>: <b>다운로드됨</b>: <b>Transfer rate</b>: <b>전송 속도</b>: <b>Estimated time left</b>: <b>남은 예상 시간</b>: <b>Connections</b>: <b>연결 수</b>: <b>Status</b>: <b>상태</b>: Download Stopped 다운로드가 중지되었습니다 Error - 오류 - Download Complete 다운로드를 완료하였습니다 <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>이 링크는 이전에 추가된 적이 있습니다! 다시 추가하시겠습니까?</center></b> Download Starts 다운로드가 시작됩니다 Operation was not successful. 작업에 실패했습니다. Please resume the following category: 다음 카테고리를 재개해 주세요: Not enough free space in: 사용 가능한 공간이 부족합니다: muxing error 먹싱 오류 an error occurred 오류 발생됨 Please update Persepolis. Persepolis를 업데이트해 주세요. <b>Fragments</b>: <b>조각</b>: mainwindow_ui_tr Persepolis Download Manager Persepolis 다운로드 관리자 Show/Hide system tray icon 시스템 트레이 아이콘 표시/숨김 Add New Download Link 새 다운로드 링크 추가하기 Resume Download 다운로드 이어받기 Pause Download 다운로드 일시정지 Stop/Cancel Download 다운로드 중지/취소 Properties 속성 Progress 진행률 Exit 종료 Start Time 시작 시간 End Time 종료 시간 Download bottom of the list first 목록 하단에서 먼저 다운로드하기 Apply 적용하기 After download 다운로드 완료 후 Shut Down 컴퓨터 끄기 <b>Video file status: </b> <b>비디오 파일 상태: </b> <b>Audio file status: </b> <b>오디오 파일 상태: </b> <b>Status: </b> <b>상태: </b> <b>Muxing status: </b> <b>먹싱 상태: </b> downloaded 다운로드됨 Minimize to System Tray 시스템 트레이로 최소화 Hide Options 옵션 숨기기 Keep System Awake! 시스템 작동 상태 유지! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> <html><head/><body><p>이 옵션은 시스템이 절전 모드로 전환되는 것을 방지합니다. 전원 관리자가 시스템을 자동으로 절전모드로 전환하는 경우 필요합니다. </p></body></html> Start Mixing 믹싱 시작하기 <b>Video File Status: </b> <b>비디오 파일 상태: </b> <b>Audio File Status: </b> <b>오디오 파일 상태: </b> <b>Mixing status: </b> <b>먹싱 상태: </b> progress_ui_tr Persepolis Download Manager Persepolis 다운로드 관리자 Status: 상태: Downloaded: 다운로드됨: Transfer rate: 전송 속도: Estimated time left: 남은 예상 시간: Number of connections: 연결 수: Download Information 다운로드 정보 After download 다운로드 완료 후 Apply 적용하기 Shut Down 컴퓨터 끄기 Download Options 다운로드 옵션 Resume 이어받기 Pause 일시정지 Stop 중지하기 Link: 링크: setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> <b><center>이 단축키는 이전에 사용한 적이 있습니다! 다른 단축키를 사용하세요!</center></b> setting_ui_tr Preferences 환경설정 Number of tries: 시도 횟수: <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p>시간초과를 초 단위로 지정합니다. </p></body></html> Timeout (seconds): 시간 초과 (초): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> <html><head/><body><p>다중 연결을 사용하면 다운로드 속도를 높일 수 있습니다..</p></body></html> Number of connections: 연결 수: Change 변경하기 Download Options 다운로드 옵션 Volume: 용량: Notifications 알림 Style: 스타일: Color scheme: 색 구성표: Icons: 아이콘: Notification type: 알림 유형: Font: 글꼴: Size: 크기: Run Persepolis at startup 시작 시 Persepolis 실행하기 Keep system awake! 시스템 작동 상태 유지! <html><head/><body><p>Format HH:MM</p></body></html> <html><head/><body><p>형식 HH:MM</p></body></html> Status 상태 Video Finder Options 비디오 찾기도구 옵션 Defaults 기본값 Cancel 취소 OK 확인 Press new keys 새 키 누르기 Shortcuts 단축키 Hide main window if close button clicked. 닫기 버튼을 클릭하면 기본 창이 숨겨집니다. <html><head/><body><p>This feature may not work in your operating system.</p></body></html> <html><head/><body><p>이 기능은 운영 체제에서 작동하지 않을 수 있습니다.</p></body></html> Language: 언어: Wait period between retries (seconds): 재시도 간 대기 시간 (초): Don't use certificate to verify the peers 피어를 확인하기 위해 인증서를 사용하지 않음 <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> <html><head/><body><p>이 옵션은 SSL/TLS 핸드셰이크 실패를 방지합니다. 하지만 사용에 따른 위험은 사용자 본인의 책임입니다!</p></body></html> Download folder: 다운로드 폴더: Create subfolders for Music,Videos, ... in default download folder 기본 다운로드 폴더에 음악, 동영상 등에 대한 하위 폴더 만들기 Save As 다른 이름으로 저장 Enable Notification Sounds 알림 사운드 활성화 Toolbar icons size: 도구모음 아이콘 크기: Enable system tray icon 시스템 트레이 아이콘 활성화 Show download complete dialog when download is finished 다운로드가 완료되면 다운로드 완료 대화상자 표시하기 Show menubar 메뉴표시줄 표시하기 Show side panel 측면 패널 표시하기 Show download progress window 다운로드 진행률 창 표시하기 <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> <html><head/><body><p>이 옵션은 시스템이 절전 모드로 전환되는 것을 방지합니다. 전원 관리자가 시스템을 자동으로 절전모드로 전환하는 경우 필요합니다. </p></body></html> Columns Customization 열 사용자 정의 Check system clipboard for copied links 복사된 링크가 있는지 시스템 클립보드 확인 <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> <html><head/><body><p>프로그램은 자동으로 클립보드에 복사된 링크를 확인합니다. </p></body></html> Download requests from the browser will be executed immediately. 브라우저에서 다운로드 요청이 즉시 실행됩니다. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>브라우저 확장 프로그램에서 다운로드 요청이 전송되면 링크 추가 창이 표시되지 않고 다운로드가 시작됩니다. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>다운로드에 실패할 경우 재시도 횟수를 지정합니다.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> <html><head/><body><p>재시도 간 대기 시간을 초 단위로 지정합니다.</p></body></html> Chunk size(KiB): 블록 크기(KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. 파이썬 요청 라이브러리 블록 크기입니다. 익숙하지 않더라도 변경하지 마세요. text_ui_tr Persepolis Download Manager Persepolis 다운로드 관리자 IP: IP: Port: 포트: Change Download Folder 다운로드 폴더 변경하기 Proxy password: 프록시 비밀번호: Proxy username: 프록시 사용자이름: Download username and password 사용자이름 및 비밀번호 다운로드 Download username: 사용자이름 다운로드: Download password: 비밀번호 다운로드: Download folder: 다운로드 폴더: Number of connections: 연결 수: video_finder_progress_ui_tr <b>Video file status: </b> <b>비디오 파일 상태: </b> <b>Audio file status: </b> <b>오디오 파일 상태: </b> <b>Muxing status: </b> <b>먹싱 상태: </b> <b>Mixing status: </b> <b>믹싱 상태: </b> ================================================ FILE: resources/locales/ui_nl_NL.ts ================================================ about_ui_tr About Persepolis Over Persepolis Persepolis Download Manager Persepolis-downloadbeheer <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers Ontwikkelaars Translators Vertalers License Licentie OK Oké AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia Acknowledgments Erkenningen <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP-project</a> <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg-project</a> <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>Pyside-project <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>Requests-project</a> addlink_ui_tr Add to category: Toevoegen aan categorie: Proxy Proxy IP: Ip-adres: Port: Poort: Change Download Folder Andere downloadmap kiezen Download Folder: Downloadmap: Cancel Annuleren OK Oké Link Link More Options Meer opties Advanced Options Geavanceerde opties Add Download Link Downloadlink toevoegen Download link: Downloadlink: Change file name: Bestandsnaam wijzigen: Detect System Proxy Settings Proxy-instellingen van systeem gebruiken Proxy password: Proxywachtwoord: Proxy username: Proxy-gebruikersnaam: Download username and password Gebruikersnaam en wachtwoord voor downloaden Download username: Gebruikersnaam voor downloaden: Download password: Wachtwoord voor downloaden: Remember this path Locatie onthouden Start time Begintijd End time Eindtijd Number of connections: Aantal gelijktijdige verbindingen: Download Later Later downloaden HTTP Http HTTPS Https SOCKS5 Socks5 after_download_src_ui_tr <b>File name</b>: <b>Bestandsnaam</b>: <b>Size</b>: <b>Grootte</b>: after_download_ui_tr Persepolis Download Manager Persepolis-downloadbeheer Open File Bestand openen Open Download Folder Downloadmap openen OK Oké Don't show this message again. Bericht niet meer tonen <b>Download Completed!</b> <b>Download afgerond!</b> <b>Save as</b>: <b>Opslaan als</b>: <b>Link</b>: <b>Link</b>: log_window_ui_tr Report Issue Probleem melden Initialization and information Instellen en informatie Downloads Downloads Errors and warnings Foutmeldingen en waarschuwingen mainwindow_src_ui_tr Error: Foutmelding: <b>Link</b>: <b>Link</b>: <b>Downloaded</b>: <b>Gedownload</b>: <b>Transfer rate</b>: <b>Snelheid</b>: <b>Estimated time left</b>: <b>Resterende tijd (geschat)</b>: <b>Connections</b>: <b>Aantal verbindingen</b>: <b>Status</b>: <b>Status</b>: Download Stopped Download gestopt Error - Foutmelding - Download Complete Download afgerond <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>Je hebt deze link al toegevoegd! Weet je zeker dat je deze opnieuw wilt toevoegen?</center></b> Download Starts Download start Operation was not successful. Handeling mislukt. Please resume the following category: Hervat de volgende categorie: Not enough free space in: Onvoldoende vrije ruimte in: muxing error muxing-fout an error occurred er is een fout opgetreden Please update Persepolis. Werk Persepolis bij. <b>Fragments</b>: <b>Gedeelten</b>: mainwindow_ui_tr Persepolis Download Manager Persepolis-downloadbeheer Show/Hide system tray icon Systeemvakpictogram tonen/verbergen Add New Download Link Nieuwe downloadlink toevoegen Resume Download Download hervatten Pause Download Download pauzeren Stop/Cancel Download Download afbreken/stopzetten Properties Eigenschappen Progress Voortgang Exit Afsluiten Start Time Begintijd End Time Eindtijd Download bottom of the list first Onderaan beginnen met downloaden Apply Toepassen After download Actie na downloaden: Shut Down Afsluiten <b>Video file status: </b> <b>Status van videobestand: </b> <b>Audio file status: </b> <b>Status van audiobestand: </b> <b>Status: </b> <b>Status: </b> <b>Muxing status: </b> <b>Muxing-status: </b> downloaded gedownload Minimize to System Tray Minimaliseren naar systeemvak Hide Options Opties verbergen Keep System Awake! Systeem actief houden <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> <html><head/><body><p>Deze optie voorkomt dat het systeem inactief wordt. Dit is nodig als energiebeheer je systeem automatisch in de pauze- of slaapstand zet.</p></body></html> Start Mixing Mengen starten <b>Video File Status: </b> <b>Status van videobestand: </b> <b>Audio File Status: </b> <b>Status van audiobestand: </b> <b>Mixing status: </b> <b>Mengstatus: </b> progress_ui_tr Persepolis Download Manager Persepolis-downloadbeheer Status: Status: Downloaded: Gedownload: Transfer rate: Snelheid: Estimated time left: Resterende tijd (geschat): Number of connections: Aantal gelijktijdige verbindingen: Download Information Downloadinformatie After download Actie na downloaden Apply Toepassen Shut Down Afsluiten Download Options Downloadopties Resume Hervatten Pause Pauzeren Stop Stoppen Link: Link: setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> <b><center>Deze sneltoets wordt al gebruikt! Kies een andere!</center></b> setting_ui_tr Preferences Voorkeuren Number of tries: Aantal pogingen: <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p>Stel de time-out in, in seconden.</p></body></html> Timeout (seconds): Time-out (in seconden): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> <html><head/><body><p>Meerdere gelijktijdige verbindingen kunnen het downloaden versnellen.</p></body></html> Number of connections: Aantal gelijktijdige verbindingen: Change Wijzigen Download Options Downloadopties Volume: Volume: Notifications Meldingen Style: Stijl: Color scheme: Kleurenschema: Icons: Pictogrammen: Notification type: Soort melding: Font: Lettertype: Size: Grootte: Run Persepolis at startup Automatisch opstarten Keep system awake! Systeem actief houden <html><head/><body><p>Format HH:MM</p></body></html> <html><head/><body><p>Opmaak: UU:MM</p></body></html> Status Status Video Finder Options Video-zoekopties Defaults Standaardwaarden Cancel Annuleren OK Oké Press new keys Druk op de gewenste toetsen Shortcuts Sneltoetsen Hide main window if close button clicked. Hoofdvenster minimaliseren na klikken op sluitknop. <html><head/><body><p>This feature may not work in your operating system.</p></body></html> <html><head/><body><p>Deze functie werkt mogelijk niet op je besturingssysteem.</p></body></html> Language: Taal: Wait period between retries (seconds): Tijd tussen pogingen (in seconden): Don't use certificate to verify the peers Geen certificaten gebruiken om peers te verifiëren <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> <html><head/><body><p>Let op: met deze optie omzeil je de ssl-/tls-overdrachtsfoutmelding. Gebruik is op eigen risico!</p></body></html> Download folder: Downloadmap: Create subfolders for Music,Videos, ... in default download folder Submappen creëren in downloadmap voor muziek, video's, etc. Save As Opslaan als Enable Notification Sounds Meldingsgeluiden inschakelen Toolbar icons size: Pictogramgrootte op werkbalk: Enable system tray icon Systeemvakpictogram tonen Show download complete dialog when download is finished Bevestigingsvenster tonen als het downloaden is afgerond Show menubar Menubalk tonen Show side panel Zijpaneel tonen Show download progress window Venster met downloadvoortgang tonen <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> <html><head/><body><p>Deze optie voorkomt dat het systeem inactief wordt. Dit is nodig als energiebeheer je systeem automatisch in de pauze- of slaapstand zet.</p></body></html> Columns Customization Kolomaanpassing Check system clipboard for copied links Controleer het klembord op gekopieerde links <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> <html><head/><body><p>Het programma zal het klembord automatisch scannen op gekopieerde links. </p></body></html> Download requests from the browser will be executed immediately. Downloadverzoeken van de browser worden onmiddellijk uitgevoerd. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>Als er een downloadverzoek wordt verstuurd vanuit de browserextensie, dan start het downloaden zonder het toevoegvenster te tonen. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>Stel in hoe vaak opnieuw moet worden geprobeerd na een mislukking.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> <html><head/><body><p>Stel in na hoelang opnieuw moet worden geprobeerd, in seconden.</p></body></html> Chunk size(KiB): Opgedeelde groottes (in KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. Dit zijn de opgedeelde groottes zoals vastgesteld door de Python-bibliotheek ‘requests’. Pas dit alléén aan als je weet wat je doet. text_ui_tr Persepolis Download Manager Persepolis-downloadbeheer IP: Ip-adres: Port: Poort: Change Download Folder Andere downloadmap kiezen Proxy password: Proxywachtwoord: Proxy username: Proxy-gebruikersnaam: Download username and password Gebruikersnaam en wachtwoord voor downloaden Download username: Gebruikersnaam voor downloaden: Download password: Wachtwoord voor downloaden: Download folder: Downloadmap: Number of connections: Aantal gelijktijdige verbindingen: video_finder_progress_ui_tr <b>Video file status: </b> <b>Status van videobestand: </b> <b>Audio file status: </b> <b>Status van audiobestand: </b> <b>Muxing status: </b> <b>Muxing-status: </b> <b>Mixing status: </b> <b>Mengstatus: </b> ================================================ FILE: resources/locales/ui_pl_PL.ts ================================================ about_ui_tr About Persepolis O Persepolis Persepolis Download Manager Persepolis - menadżer pobierania <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers Deweloperzy Translators Tłumacze License Licencja OK OK AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! Acknowledgments <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! addlink_ui_tr Add to category: Dodaj do kategorii: Proxy Proxy IP: IP: Port: Port: Change Download Folder Zmień folder Download Folder: Folder: Cancel Anuluj OK OK Link Link More Options Więcej opcji Advanced Options Opcje zaawansowane Add Download Link Download link: Change file name: Detect System Proxy Settings Proxy password: Proxy username: Download username and password Download username: Download password: Remember this path Start time End time Number of connections: Download Later HTTP HTTPS SOCKS5 after_download_src_ui_tr <b>File name</b>: <b>Nazwa pliku</b>: <b>Size</b>: <b>Rozmiar</b>: after_download_ui_tr Persepolis Download Manager Persepolis - menadżer pobierania Open File Otwórz plik Open Download Folder Otwórz folder pobierania OK OK Don't show this message again. Nie pokazuj tego komunikatu ponownie. <b>Download Completed!</b> <b>Pobieranie zakończone!</b> <b>Save as</b>: <b>Zapisz jako</b>: <b>Link</b>: <b>Link</b>: log_window_ui_tr Report Issue Zgłoś problem Initialization and information Downloads Errors and warnings mainwindow_src_ui_tr Error: Błąd: <b>Link</b>: <b>Link</b>: <b>Downloaded</b>: <b>Pobrano</b>: <b>Transfer rate</b>: <b>Szybkość pobierania</b>: <b>Estimated time left</b>: <b>Pozostało</b>: <b>Connections</b>: <b>Połączenia</b>: <b>Status</b>: <b>Status</b>: Download Stopped Pobieranie zatrzymane Error - Błąd - Download Complete Pobieranie ukończone <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>Ten link został już dodany! Czy na pewno chcesz go dodać ponownie?</center></b> Download Starts Status pobierania Operation was not successful. Działanie nie powiodło się. Please resume the following category: Wznów następującą kategorię: Not enough free space in: Brak wystarczającej ilości wolnego miejsca w: muxing error błąd muxing an error occurred Please update Persepolis. <b>Fragments</b>: mainwindow_ui_tr Persepolis Download Manager Persepolis - menadżer pobierania Show/Hide system tray icon Pokarz/Ukryj ikonę na pasku zadań Add New Download Link Dodaj nowy link do pobrania Resume Download Wznów pobieranie Pause Download Zapauzuj pobieranie Stop/Cancel Download Zatrzymaj/Anuluj pobieranie Properties Właściwości Progress Postęp Exit Wyjście Start Time Godzina rozpoczęcia End Time Godzina zakończenia Download bottom of the list first Download bottom of the list first Apply Zastosuj After download Po pobraniu Shut Down Wyłącz <b>Video file status: </b> <b>Status pliku wideo: </b> <b>Audio file status: </b> <b>Status pliku audio: </b> <b>Status: </b> <b>Status: </b> <b>Muxing status: </b> <b>Status muxing: </b> downloaded pobrane Minimize to System Tray Hide Options Keep System Awake! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Start Mixing <b>Video File Status: </b> <b>Audio File Status: </b> <b>Mixing status: </b> progress_ui_tr Persepolis Download Manager Persepolis - menadżer pobierania Status: Status: Downloaded: Pobrane: Transfer rate: Szybkość pobierania: Estimated time left: Pozostało: Number of connections: Liczba połączeń: Download Information Informacje o pobraniu After download Po pobraniu Apply Zastosuj Shut Down Wyłącz Download Options Opcje pobierania Resume Wznów Pause Pauza Stop Stop Link: setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> <b><center>Ta kombinacja została jest już zajęta. Użyj innej </center></b> setting_ui_tr Preferences Preferencje Number of tries: Liczba prób pobrania: <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p>Ustaw timeout w sekundach. </p></body></html> Timeout (seconds): Timeout (sekundy): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> Korzystanie z wielu połączeń może przyspieszyć pobieranie. Number of connections: Liczba połączeń: Change Zmień Download Options Opcje pobierania Volume: Głośność: Notifications Powiadomienia Style: Styl: Color scheme: Schemat kolorów: Icons: Ikony: Notification type: Typ powiadomienia: Font: Czcionka: Size: Rozmiar: Run Persepolis at startup Uruchom Persepolis przy starcie systemu Keep system awake! Nie usypiaj systemu! <html><head/><body><p>Format HH:MM</p></body></html> <html><head/><body><p>Format HH:MM</p></body></html> Status Status Video Finder Options Opcje wyszukiwarki wideo Defaults Domyślne Cancel Anuluj OK OK Press new keys Wciśnij nowe klawisze Shortcuts Skróty Hide main window if close button clicked. Schowaj okno główne po kliknięciu przycisku zamknij <html><head/><body><p>This feature may not work in your operating system.</p></body></html> <html><head/><body><p>Ta funkcja może nie działać w twoim systemie operacyjnym.</p></body></html> Language: Wait period between retries (seconds): Don't use certificate to verify the peers <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> Download folder: Create subfolders for Music,Videos, ... in default download folder Save As Enable Notification Sounds Toolbar icons size: Enable system tray icon Show download complete dialog when download is finished Show menubar Show side panel Show download progress window <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Columns Customization Check system clipboard for copied links <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> Download requests from the browser will be executed immediately. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> Chunk size(KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. text_ui_tr Persepolis Download Manager Persepolis - menadżer pobierania IP: IP: Port: Port: Change Download Folder Zmień folder Proxy password: Proxy username: Download username and password Download username: Download password: Download folder: Number of connections: video_finder_progress_ui_tr <b>Video file status: </b> <b>Status pliku wideo: </b> <b>Audio file status: </b> <b>Status pliku audio: </b> <b>Muxing status: </b> <b>Status muxing: </b> <b>Mixing status: </b> ================================================ FILE: resources/locales/ui_pt.ts ================================================ about_ui_tr About Persepolis Sobre o Persepolis Persepolis Download Manager Gerenciador de Downloads Persepolis <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers Desenvolvedores Translators Tradutores License Licença OK OK Special thanks to: Agradecimentos especiais a: AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! Acknowledgments: <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> Acknowledgments Version 4.3.0 TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! addlink_ui_tr Add to category: Adicionar a categoria: Proxy Proxy IP: IP: Port: Porta: Change Download Folder Alterar pasta de downloads: Download Folder: Pasta de downloads Cancel Cancelar OK OK Link Link More Options Mais opções Advanced Options Opções avançadas Referrer: Referenciador: Header: Cabeçalho: User agent: Agente de usuário: Add Download Link Download link: Change file name: Detect System Proxy Settings Proxy password: Proxy username: Download username and password Download username: Download password: Remember this path Start time End time Number of connections: Download Later HTTP HTTPS SOCKS5 Cookies: after_download_src_ui_tr <b>File name</b>: <b>Nome do arquivo</b>: <b>Size</b>: <b>Tamanho</b>: after_download_ui_tr Persepolis Download Manager Gerenciador de Downloads Persepolis Open File Abrir arquivo Open Download Folder Abrir pasta OK OK Don't show this message again. Não mostre esta mensagem novamente. <b>Download Completed!</b> <b>Download completo!</b> <b>Save as</b>: <b>Salvar como</b>: <b>Link</b>: <b>Link</b>: log_window_ui_tr Persepolis Log Persepolis Log Report Issue Relatar um problema Close Copy Selected to Clipboard Refresh Log Messages Clear Log Messages mainwindow_src_ui_tr Persepolis Persepolis Queue Stopped! Fila parada! Persepolis is shutting down Persepolis desligará your system in 20 seconds seu sistema em 20 segundos Queue completed! Fila completa! Show main Window Mostrar janela principal Error: Erro: <b>Link</b>: <b>Link</b>: <b>Downloaded</b>: <b>Baixado</b>: <b>Transfer rate</b>: <b>Taxa de transferência</b>: <b>Estimated time left</b>: <b>Tempo restante estimado</b>: <b>Connections</b>: <b>Conexões</b>: <b>Status</b>: <b>Progresso</b>: Download Stopped Download parado Error - Erro - Download Complete Download completo <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>Este link foi adicionado antes! Tem certeza de que deseja adicioná-lo novamente?</center></b> Download Starts Iniciar download Download Scheduled Download agendado Operation was not successful. A operação não foi bem sucedida. Please resume the following category: Por favor, retome a seguinte categoria: Please stop the following category: Por favor, pare a seguinte categoria: Minimize to system tray Minimizar para área de notificação Not Found Não encontrado Operation was not successful! A operação não foi bem sucedida. Operation was not successful! Please stop the following category first: A operação não foi bem sucedida! Por favor pare a seguinte categoria primeiro: Please stop the following download first: Por favor pare o seguinte download primeiro: <b><center>This operation will delete downloaded files from your hard disk<br>PERMANENTLY!</center></b> <b><center>Esta operação deletará os arquivos baixados no seu disco rígido<br>PERMANENTEMENTE!</center></b> <center>Do you want to continue?</center> <center>Deseja continuar?</center> Please stop the following category first: Por favor pare a seguinte categoria primeiro: </b>" already exists! </b>"Já existe! Send selected downloads to Envie o download selecionado para Send to Enviar para Sort by Ordenar por <b><center>This operation will remove all download items in this queue<br>from "All Downloads" list!</center></b> <b><center>Esta operação irá remover todos os itens nesta fila<br>de "Todas as listas de Downloads"!</center></b> <b>Sorry! You can't remove default queue!</b> <b>Desculpe! Você não pode remover a fila padrão!</b> Some items didn't transferred successfully! Alguns itens não foram transferidos com sucesso! Please stop download progress first. Por favor, primeiro pare o progresso do download. Hide options Ocultar opções Show options Mostrar opções Stop all downloads first! Pare primeiro todos os downloads! Moving is finished! Download is in progress by video finder! be patient! Stop the following download first: ffmpeg is not installed! Not enough free space in: muxing error an error occurred Please update Persepolis. There is not enough disk space available at the download folder! Please choose another one or clear some space. yt-dlp is not installed! mainwindow_ui_tr File Arquivo Edit Editar View Visualizar Download Download Queue Fila Video Finder Video Finder Help Ajuda Sort by Ordenar por Persepolis Download Manager Gerenciador de Downloads Persepolis Category Categoria File Name Nome de arquivo Status Progresso Size Tamanho Downloaded Baixado Percentage Porcentagem Connections Conexões Link Link &File &Arquivo &Edit &Editar &View &Visualizar &Download &Download &Queue &Fila &Help &Ajuda Show/Hide system tray icon Mostrar/Ocultar área de notificação Add New Download Link Adicionar novo link de download Resume Download Resumir Download Pause Download Pausar Download Stop Download Parar Download Stop/Cancel Download Parar/Cancelar Download Properties Propriedades Progress Progresso Exit Sair Clear all items in download list Limpar todos os itens na lista de download Create new download queue Criar nova fila de download Remove this queue Remover esta fila Start this queue Iniciar esta fila Stop this queue Parar esta fila Move currently selected items up by one row Mover itens selecionados uma linha acima Move currently selected items down by one row Mover itens selecionados uma linha abaixo Preferences Preferências About Sobre Report an issue Relatar um problema Start Time Tempo de inicio End Time Tempo de termino Download bottom of the list first Baixe o último arquivo da lista primeiro Apply Executar After download Depois o download Shut Down Desligar V&ideo Finder V&ideo Finder <b>Video file status: </b> <b>Audio file status: </b> <b>Status: </b> <b>Muxing status: </b> downloaded Active Not Active Started Error Complete Transfer Rate Estimated Time Left First Try Date Last Try Date Find Video Links... Download video or audio from Youtube, Vimeo, etc. Stop All Active Downloads File Size Download Status Show System Tray Icon Show Menubar Show Side Panel Minimize to System Tray Add New Download Link... Import Links from Text File... Create a text file and put links in it, line by line! Open File... Open Download Folder Open Default Download Folder Clear Download List Remove Selected Downloads from List Delete Selected Download Files Move Selected Download Files to Another Folder... Move Selected Download Files to Another Folder Create New Queue... Remove Queue Start Queue Stop Queue Move Selected Items Up Move Selected Items Down Report an Issue Show Log File Hide Options Keep System Awake! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Start Mixing <b>Video File Status: </b> <b>Audio File Status: </b> <b>Mixing status: </b> Import Links from Clipboard... Import Links From Clipboard progress_ui_tr Persepolis Download Manager Gerenciador de Downloads Persepolis Status: Progresso: Downloaded: Baixado: Transfer rate: Taxa de transferência: Estimated time left: Tempo restante estimado: Number of connections: Número de conexões: Download Information Informações de Download After download Após o download Apply Executar Shut Down Desligar Download Options Opções de Download Resume Resumir Pause Pausar Stop Parar Link: setting_src_ui_tr <b><center>Restart Persepolis Please!</center></b><br><center>Some changes take effect after restarting Persepolis</center> <b><center>Reinicie o Persepolis por favor!</center></b><br><center>Algumas alterações só têm efeito após reiniciar o software</center> Restart Persepolis! Reiniciar o Persepolis! <b><center>This shortcut has been used before! Use another one!</center></b> setting_ui_tr Preferences Preferências Number of tries: Números de tentativas: <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p>Definir intervalo em segundos. </p></body></html> Timeout (seconds): Intervalo (segundos): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> <html><head/><body><p>Usar várias conexões pode ajudar a acelerar o download.</p></body></html> Number of connections: Número de conexões Change Alterar Download Options Opções de Download Volume: Volume: Notifications Notificações Style: Estilo: Color scheme: Esquema de cores: Icons: Ícones: Notification type: Tipo da notificação: Font: Fonte: Size: Tamanho: Run Persepolis at startup Executar Persepolis na inicialização Keep system awake! Impedir sistema de entrar em modo suspenso! <html><head/><body><p>Format HH:MM</p></body></html> <html><head/><body><p>Formato HH:MM</p></body></html> File Name Nome de arquivo Status Status Size Tamanho Downloaded Baixado Percentage Porcentagem Connections Conexões Category Categoria Video Finder Options Opções do Video Finder Maximum number of links to capture:<br/><small>(If browser sends multiple video links at a time)</small> Número máximo de links a serem capturados:<br/><small>(se o browser envia vários links de vídeo de cada vez)</small> Defaults Padrões Cancel Cancelar OK OK Press new keys Action Shortcut Shortcuts Quit Hide main window if close button clicked. <html><head/><body><p>This feature may not work in your operating system.</p></body></html> Language: Minimize to System Tray Remove Download Items Delete Download Items Move Selected Items Up Move Selected Items Down Add New Download Link Add New Video Link Import Links from Text File Wait period between retries (seconds): Wait period between each download in queue: Don't use certificate to verify the peers <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> Download folder: Create subfolders for Music,Videos, ... in default download folder Save As Enable Notification Sounds Toolbar icons size: If browser is opened, start Persepolis in system tray Enable system tray icon Show download complete dialog when download is finished Show menubar Show side panel Show download progress window <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Show these columns: Transfer Rate Estimated Time Left First Try Date Last Try Date Columns Customization Check system clipboard for copied links <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> Download requests from the browser will be executed immediately. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> Chunk size(KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. text_ui_tr Persepolis Download Manager Gerenciador de Download Persepolis Links Links Select All Selecionar Todos Deselect All Desselecionar Todos Add to queue: Adicionar para a fila: Proxy Proxy IP: IP: Port: Porta Change Download Folder Alterar pasta de downloads OK OK Cancel Cancelar Download Options Proxy password: Proxy username: Download username and password Download username: Download password: Download folder: Number of connections: video_finder_progress_ui_tr <b>Video file status: </b> <b>Audio file status: </b> <b>Muxing status: </b> <b>Mixing status: </b> ytaddlink_src_ui_tr Video Finder Video Finder Fetch Media List Buscar lista de mídias Select a format Selecione um formato Please enter a valid video link Por favor, insira um link de vídeo válido Fetching Media Info... Buscando informações sobre a mídia... Video format: Audio format: Advanced options ================================================ FILE: resources/locales/ui_pt_BR.ts ================================================ about_ui_tr About Persepolis Sobre Persépolis Persepolis Download Manager Gerenciador de Downloads Persépolis <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers Desenvolvedores Translators Tradutores License Licença OK Aceitar AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! Acknowledgments <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! addlink_ui_tr Add to category: Adicionar à categoria: Proxy Proxy IP: IP: Port: Porta: Change Download Folder Alterar Local Download Folder: Baixar para: Cancel Cancelar OK Aceitar Link Link More Options Mais Opções Advanced Options Opções Avançadas Add Download Link Download link: Change file name: Detect System Proxy Settings Proxy password: Proxy username: Download username and password Download username: Download password: Remember this path Start time End time Number of connections: Download Later HTTP HTTPS SOCKS5 after_download_src_ui_tr <b>File name</b>: <b>Nome do Arquivo</b>: <b>Size</b>: <b>Tamanho</b>: after_download_ui_tr Persepolis Download Manager Gerenciador de Downloads Persépolis Open File Abrir Arquivo Open Download Folder Abrir Pasta de Baixados OK Aceitar Don't show this message again. Não exibir essa mensagem novamente. <b>Download Completed!</b> <b>Terminou de Baixar!</b> <b>Save as</b>: <b>Salvar como</b>: <b>Link</b>: <b>Link</b>: log_window_ui_tr Report Issue Informar um Problema Initialization and information Downloads Errors and warnings mainwindow_src_ui_tr Error: Erro: <b>Link</b>: <b>Link</b>: <b>Downloaded</b>: <b>Baixado</b>: <b>Transfer rate</b>: <b>Baixando a</b>: <b>Estimated time left</b>: <b>Termina em</b>: <b>Connections</b>: <b>Conexões</b>: <b>Status</b>: <b>Estado</b>: Download Stopped Recebimento Parado Error - Erro - Download Complete Terminou de Baixar <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>Esse link já foi adicionado antes! Tem certeza que deseja adicioná-lo novamente?</center></b> Download Starts Começou a Baixar Operation was not successful. A operação não obteve sucesso. Please resume the following category: Por favor, continue a seguinte categoria: Not enough free space in: Não há espaço livre suficiente em: muxing error Erro ao multiplexar an error occurred Please update Persepolis. <b>Fragments</b>: mainwindow_ui_tr Persepolis Download Manager Gerenciador de Downloads Persépolis Show/Hide system tray icon Exibir/Ocultar para área de notificação Add New Download Link Adicionar Novo Link para Baixar Resume Download Continuar Pause Download Pausar Stop/Cancel Download Parar/Cancelar Recebimento Properties Propriedades Progress Progresso Exit Sair Start Time Tempo Inicial End Time Tempo Final Download bottom of the list first Baixar o final da lista primeiro Apply Aplicar After download Baixar depois Shut Down Desligar <b>Video file status: </b> <b>Estado dos arquivos de vídeo: </b> <b>Audio file status: </b> <b>Estado dos arquivos de áudio: </b> <b>Status: </b> <b>Estado: </b> <b>Muxing status: </b> <b>Estado da multiplexação: </b> downloaded baixado Minimize to System Tray Hide Options Keep System Awake! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Start Mixing <b>Video File Status: </b> <b>Audio File Status: </b> <b>Mixing status: </b> progress_ui_tr Persepolis Download Manager Gerenciador de Downloads Persépolis Status: Estado: Downloaded: Baixado: Transfer rate: Taxa de transferência: Estimated time left: Tempo restante estimado: Number of connections: Número de Conexões: Download Information Informação de Recebimento After download Baixar depois Apply Aplicar Shut Down Desligar Download Options Opções ao Baixar Resume Continuar Pause Pausar Stop Parar Link: setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> <b><center>Este atalho já está sendo usado! Tente usar outro!</center></b> setting_ui_tr Preferences Preferências Number of tries: Número de tentativas: <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p>Define o tempo limite em segundos. </p></body></html> Timeout (seconds): Tempo limite (segundos): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> <html><head/><body><p>Utilizar várias conexões pode ajudar a acelerar o recebimento.</p></body></html> Number of connections: Número de conexões: Change Alterar Download Options Opções Para Baixar Volume: Volume: Notifications Notificação Style: Estilo: Color scheme: Esquema de cor: Icons: Ícones: Notification type: Tipo de notificação: Font: Fonte: Size: Tamanho: Run Persepolis at startup Executar o Persépolis na inicialização Keep system awake! Manter o sistema ativo! <html><head/><body><p>Format HH:MM</p></body></html> <html><head/><body><p>Formato HH:MM</p></body></html> Status Status Video Finder Options Opções do Buscador de Vídeo Defaults Padrões Cancel Cancelar OK Aceitar Press new keys Escolha uma nova tecla Shortcuts Atalhos Hide main window if close button clicked. Ocultar janela ao clicar no botão fechar. <html><head/><body><p>This feature may not work in your operating system.</p></body></html> <html><head/><body><p> Este recurso pode não funcionar no seu sistema operacional.</p></body></html> Language: Wait period between retries (seconds): Don't use certificate to verify the peers <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> Download folder: Create subfolders for Music,Videos, ... in default download folder Save As Enable Notification Sounds Toolbar icons size: Enable system tray icon Show download complete dialog when download is finished Show menubar Show side panel Show download progress window <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Columns Customization Check system clipboard for copied links <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> Download requests from the browser will be executed immediately. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> Chunk size(KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. text_ui_tr Persepolis Download Manager Gerenciador de Downloads Persépolis IP: IP: Port: Porta: Change Download Folder Alterar Pasta Padrão Proxy password: Proxy username: Download username and password Download username: Download password: Download folder: Number of connections: video_finder_progress_ui_tr <b>Video file status: </b> <b>Estado do arquivo de vídeo: </b> <b>Audio file status: </b> <b>Estado do arquivo de áudio: </b> <b>Muxing status: </b> <b>Estado da Multiplexação: </b> <b>Mixing status: </b> ================================================ FILE: resources/locales/ui_ru.ts ================================================ about_ui_tr About Persepolis О Persepolis Persepolis Download Manager Менеджер загрузок Persepolis <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers Разработчики Translators Переводчики License Лицензия OK OK AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! Acknowledgments Благодарности <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/yt-dlp/yt-dlp>Проект YT-DLP</a> <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>Проект FFmpeg</a> <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>Проект Pyside</a> <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>Запросы проекта</a> addlink_ui_tr Add to category: Добавить в категорию: Proxy Прокси IP: IP: Port: Порт: Change Download Folder Изменить папку для загрузки Download Folder: Папка для загрузки: Cancel Отменить OK OK Link Ссылка More Options Больше параметров Advanced Options Расширенные параметры Add Download Link Добавить ссылку для скачивания Download link: Ссылка для скачивания: Change file name: Изменить имя файла: Detect System Proxy Settings Определить настройки системного прокси Proxy password: Пароль прокси: Proxy username: Имя пользователя прокси: Download username and password Загрузить имя пользователя и пароль Download username: Загрузить имя пользователя Download password: Загрузить пароль Remember this path Запомнить этот путь Start time Время начала End time Время окончания Number of connections: Количество подключений: Download Later Загрузить позже HTTP HTTP HTTPS HTTPS SOCKS5 SOCKS5 after_download_src_ui_tr <b>File name</b>: <b>Имя файла</b>: <b>Size</b>: <b>Размер</b>: after_download_ui_tr Persepolis Download Manager Менеджер загрузок Persepolis Open File Открыть файл Open Download Folder Открыть папку загрузки OK OK Don't show this message again. Не показывать это сообщение снова. <b>Download Completed!</b> <b>Загрузка завершена!</b> <b>Save as</b>: <b>Сохранить как</b>: <b>Link</b>: <b>Ссылка</b>: log_window_ui_tr Report Issue Сообщить о проблеме Initialization and information Downloads Errors and warnings mainwindow_src_ui_tr Error: Ошибка: <b>Link</b>: <b>Ссылка</b>: <b>Downloaded</b>: <b>Загружено</b>: <b>Transfer rate</b>: <b>Скорость передачи</b>: <b>Estimated time left</b>: <b>Ожидаемое время</b>: <b>Connections</b>: <b>Соединения</b>: <b>Status</b>: <b>Статус</b>: Download Stopped Загрузка остановлена Error - Ошибка - Download Complete Загрузка завершена <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>Эта ссылка была добавлена раньше! Вы уверены, что хотите добавить её ещё раз?</center></b> Download Starts Загрузка началась Operation was not successful. Операция не была успешной. Please resume the following category: Пожалуйста, возобновите следующую категорию: Not enough free space in: Недостаточно свободного места в: muxing error ошибка мультиплексирования an error occurred произошла ошибка Please update Persepolis. Пожалуйста, обновите Persepolis. <b>Fragments</b>: <b>Фрагменты</b>: mainwindow_ui_tr Persepolis Download Manager Менеджер загрузок Persepolis Show/Hide system tray icon Показать / спрятать значок в системном трее Add New Download Link Добавить новую ссылку для скачивания Resume Download Возобновить загрузку Pause Download Пауза загрузки Stop/Cancel Download Остановить/Отменить загрузку Properties Свойства Progress Прогресс Exit Выход Start Time Время начала End Time Время окончания Download bottom of the list first Сначала загрузите нижнюю часть списка Apply Принять After download После загрузки Shut Down Выключить <b>Video file status: </b> <b>Состояние видеофайла: </b> <b>Audio file status: </b> <b>Состояние аудиофайла: </b> <b>Status: </b> <b>Состояние: </b> <b>Muxing status: </b> <b>Состояние мультиплексирования: </b> downloaded загружено Minimize to System Tray Hide Options Скрыть параметры Keep System Awake! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Start Mixing <b>Video File Status: </b> <b>Audio File Status: </b> <b>Mixing status: </b> progress_ui_tr Persepolis Download Manager Менеджер загрузок Persepolis Status: Статус: Downloaded: Закачено: Transfer rate: Скорость передачи: Estimated time left: Ожидаемое время: Number of connections: Количество соединений: Download Information Информация о закачке After download После закачки Apply Принять Shut Down Выключить Download Options Параметры загрузки Resume Продолжить Pause Пауза Stop Остановить Link: Ссылка: setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> <b><center>Это сочетание уже используется! Выберите другое!</center></b> setting_ui_tr Preferences Предпочтения Number of tries: Количество попыток: <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p>Установите тайм-аут в секундах. </p></body></html> Timeout (seconds): Тайм-аут (в секундах): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> <html><head/><body><p>Использование нескольких соединений может помочь ускорить загрузку.</p></body></html> Number of connections: Количество соединений: Change Изменить Download Options Параметры загрузки Volume: Громкость: Notifications Уведомления Style: Стиль: Color scheme: Цветовая схема: Icons: Иконки: Notification type: Тип уведомлений: Font: Шрифт: Size: Размер: Run Persepolis at startup Запускать Persepolis при старте системы Keep system awake! Не позволять системе перейти в ждущий режим <html><head/><body><p>Format HH:MM</p></body></html> <html><head/><body><p>Формат HH:MM</p></body></html> Status Статус Video Finder Options Параметры Video Finder Defaults Значения по умолчанию Cancel Отменить OK OK Press new keys Нажмите новые клавиши Shortcuts Сочетания клавиш Hide main window if close button clicked. Скрывать главное окно, если нажата клавиша закрытия. <html><head/><body><p>This feature may not work in your operating system.</p></body></html> <html><head/><body><p>Эта функция может не работать в вашей операционной системе.</p></body></html> Language: Язык: Wait period between retries (seconds): Don't use certificate to verify the peers <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> Download folder: Create subfolders for Music,Videos, ... in default download folder Save As Enable Notification Sounds Включить звуки уведомлений Toolbar icons size: Размер значков на панели инструментов: Enable system tray icon Включить значок на панели задач Show download complete dialog when download is finished Показывать диалоговое окно после завершения загрузки Show menubar Show side panel Show download progress window <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Columns Customization Check system clipboard for copied links <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> Download requests from the browser will be executed immediately. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> Chunk size(KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. text_ui_tr Persepolis Download Manager Менеджер загрузок Persepolis IP: IP: Port: Порт: Change Download Folder Изменить папку для загрузки Proxy password: Proxy username: Download username and password Download username: Download password: Download folder: Number of connections: Количество подключений: video_finder_progress_ui_tr <b>Video file status: </b> <b>Состояние видеофайла: </b> <b>Audio file status: </b> <b>Состояние аудиофайла: </b> <b>Muxing status: </b> <b>Состояние мультиплексирования: </b> <b>Mixing status: </b> ================================================ FILE: resources/locales/ui_sv.ts ================================================ about_ui_tr About Persepolis Om Persepolis Persepolis Download Manager Nerladdningshanteraren Persepolis <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers Utvecklare Translators Översättare License Licens OK OK Special thanks to: Speciellt tack till: AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! Acknowledgments: <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> Acknowledgments Version 4.3.0 TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! addlink_ui_tr Add to category: Lägg till i kategori: Proxy Proxy IP: IP: Port: Port: Change Download Folder Ändra nerladdningsmapp Download Folder: Nerladdningsmapp: Cancel Avbryt OK OK Link Länk More Options Fler alternativ Advanced Options Avancerade alternativ Referrer: Refererare: Header: Huvud: User agent: Användaragent: Add Download Link Download link: Change file name: Detect System Proxy Settings Proxy password: Proxy username: Download username and password Download username: Download password: Remember this path Start time End time Number of connections: Download Later HTTP HTTPS SOCKS5 Cookies: after_download_src_ui_tr <b>File name</b>: <b>Filnamn</b>: <b>Size</b>: <b>Storlek</b>: after_download_ui_tr Persepolis Download Manager Nerladdningshanteraren Persepolis Open File Öppna fil Open Download Folder Öppna nerladdningsmapp OK OK Don't show this message again. Visa inte det här meddelandet igen. <b>Download Completed!</b> <b>Nerladdning slutförd!</b> <b>Save as</b>: <b>Spara som</b>: <b>Link</b>: <b>Länk</b>: log_window_ui_tr Persepolis Log Logg för Persepolis Report Issue Rapportera fel Close Copy Selected to Clipboard Refresh Log Messages Clear Log Messages mainwindow_src_ui_tr Persepolis Persepolis Queue Stopped! Kön stannade! Persepolis is shutting down Persepolis stängs ner your system in 20 seconds ditt system på 20 sekunder Queue completed! Kön slutfördes! Show main Window Visa huvudfönstret Error: Fel: <b>Link</b>: <b>Länk</b>: <b>Downloaded</b>: <b>Nerladdade</b>: <b>Transfer rate</b>: <b>Överföringshastighet</b>: <b>Estimated time left</b>: <b>Beräknad tid som återstår</b>: <b>Connections</b>: <b>Anslutningar</b>: <b>Status</b>: <b>Status</b>: Download Stopped Nerladdningen stannade Error - Fel - Download Complete Nerladdningen färdig <b><center>This link has been added before! Are you sure you want to add it again?</center></b> Download Starts Nerladdning påbörjas Download Scheduled Operation was not successful. Operationen lyckades inte. Please resume the following category: Vänligen återuppta den följande kategorin: Please stop the following category: Vänligen stoppa den följande kategorin: Minimize to system tray Minimera till aktivitetsfält Not Found Hittades inte Operation was not successful! Åtgärden lyckades inte! Operation was not successful! Please stop the following category first: Operationen lyckades inte! Vänligen stoppa den följande kategorin först: Please stop the following download first: Vänligen stoppa den följande nerladdningen först: <b><center>This operation will delete downloaded files from your hard disk<br>PERMANENTLY!</center></b> <center>Do you want to continue?</center> <center>Vill du fortsätta?</center> Please stop the following category first: Vänligen stoppa den följande kategorin först: </b>" already exists! </b>" finns redan! Send selected downloads to Skicka valda nerladdningar till Send to Skicka till Sort by Sortera efter <b><center>This operation will remove all download items in this queue<br>from "All Downloads" list!</center></b> <b>Sorry! You can't remove default queue!</b> <b>Ledsen! Du kan inte ta bort standard-kön!</b> Some items didn't transferred successfully! Överföringen av några objekt lyckades inte! Please stop download progress first. Vänligen stoppa nerladdningsprocessen först. Hide options Göm alternativ Show options Visa alternativ Stop all downloads first! Stoppa alla nerladdningar först! Moving is Flytten är finished! klar! Download is in progress by video finder! be patient! ha tålamod! Stop the following download first: Stoppa den följande nerladdningen först: ffmpeg is not installed! ffmpeg är inte installerad! Not enough free space in: Det finns inte tillräckligt med fritt utrymme i: muxing error muxningsfel an error occurred Please update Persepolis. There is not enough disk space available at the download folder! Please choose another one or clear some space. yt-dlp is not installed! mainwindow_ui_tr File Arkiv Edit Redigera View Visa Download Ladda ner Queue Video Finder Videosökare Help Hjälp Sort by Sortera efter Persepolis Download Manager Nerladdningshanteraren Persepolis Category Kategori File Name Filnamn Status Status Size Storlek Downloaded Nerladdade Percentage Procent Connections Anslutningar Link Länk &File &Arkiv &Edit &Redigera &View &Visa &Download &Ladda ner &Queue &Kö &Help &Hjälp Show/Hide system tray icon Visa/Göm ikonen i systemets aktivitetsfält Add New Download Link Lägg till nerladdningslänk Resume Download Återuppta nerladdning Pause Download Pausa nerladdning Stop Download Stoppa nerladdning Stop/Cancel Download Stoppa/Avbryt nerladdning Properties Egenskaper Progress Framgång Exit Avsluta Clear all items in download list Rensa alla objekt i nerladdninslistan Create new download queue Skapa ny nerladdningskö Remove this queue Ta bort den här kön Start this queue Starta den här kön Stop this queue Stoppa den här kön Move currently selected items up by one row Move currently selected items down by one row Preferences Egenskaper About Om Report an issue Rapportera ett fel Start Time End Time Download bottom of the list first Apply Verkställ After download Efter nerladdning Shut Down Stäng ner V&ideo Finder V&ideosökare <b>Video file status: </b> <b>Audio file status: </b> <b>Status: </b> <b>Muxing status: </b> downloaded Active Not Active Started Error Complete Transfer Rate Estimated Time Left First Try Date Last Try Date Find Video Links... Download video or audio from Youtube, Vimeo, etc. Stop All Active Downloads File Size Download Status Show System Tray Icon Show Menubar Show Side Panel Minimize to System Tray Add New Download Link... Import Links from Text File... Create a text file and put links in it, line by line! Open File... Open Download Folder Open Default Download Folder Clear Download List Remove Selected Downloads from List Delete Selected Download Files Move Selected Download Files to Another Folder... Move Selected Download Files to Another Folder Create New Queue... Remove Queue Start Queue Stop Queue Move Selected Items Up Move Selected Items Down Report an Issue Show Log File Hide Options Keep System Awake! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Start Mixing <b>Video File Status: </b> <b>Audio File Status: </b> <b>Mixing status: </b> Import Links from Clipboard... Import Links From Clipboard progress_ui_tr Persepolis Download Manager Nerladdningshanteraren Persepolis Status: Status: Downloaded: Nerladdade: Transfer rate: Estimated time left: Number of connections: Antalet anslutningar: Download Information After download Efter nerladdning Apply Verkställ Shut Down Stäng ner Download Options Nerladdningsalternativ Resume Återuppta Pause Pausa Stop Stopp Link: setting_src_ui_tr <b><center>Restart Persepolis Please!</center></b><br><center>Some changes take effect after restarting Persepolis</center> Restart Persepolis! Starta om Persepolis! <b><center>This shortcut has been used before! Use another one!</center></b> setting_ui_tr Preferences Egenskaper Number of tries: Antalet försök: <html><head/><body><p>Set timeout in seconds. </p></body></html> Timeout (seconds): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> Number of connections: Antalet anslutningar: Change Ändra Download Options Nerladdningsalternativ Volume: Volym: Notifications Aviseringar Style: Stil: Color scheme: Färgschema: Icons: Ikoner: Notification type: Typ av avisering: Font: Typsnitt: Size: Storlek: Run Persepolis at startup Kör Persepolis vid uppstart Keep system awake! <html><head/><body><p>Format HH:MM</p></body></html> File Name Filnamn Status Status Size Storlek Downloaded Nerladdat Percentage Procent Connections Anslutningar Category Kategori Video Finder Options Maximum number of links to capture:<br/><small>(If browser sends multiple video links at a time)</small> Defaults Cancel Avbryt OK OK Press new keys Action Shortcut Shortcuts Quit Hide main window if close button clicked. <html><head/><body><p>This feature may not work in your operating system.</p></body></html> Language: Minimize to System Tray Remove Download Items Delete Download Items Move Selected Items Up Move Selected Items Down Add New Download Link Add New Video Link Import Links from Text File Wait period between retries (seconds): Wait period between each download in queue: Don't use certificate to verify the peers <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> Download folder: Create subfolders for Music,Videos, ... in default download folder Save As Enable Notification Sounds Toolbar icons size: If browser is opened, start Persepolis in system tray Enable system tray icon Show download complete dialog when download is finished Show menubar Show side panel Show download progress window <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Show these columns: Transfer Rate Estimated Time Left First Try Date Last Try Date Columns Customization Check system clipboard for copied links <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> Download requests from the browser will be executed immediately. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> Chunk size(KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. text_ui_tr Persepolis Download Manager Nerladdningshanteraren Persepolis Links Länkar Select All Markera alla Deselect All Avmarkera alla Add to queue: Lägg till i kön: Proxy Proxy IP: IP: Port: Port: Change Download Folder OK OK Cancel Avbryt Download Options Proxy password: Proxy username: Download username and password Download username: Download password: Download folder: Number of connections: video_finder_progress_ui_tr <b>Video file status: </b> <b>Audio file status: </b> <b>Muxing status: </b> <b>Mixing status: </b> ytaddlink_src_ui_tr Video Finder Fetch Media List Select a format Välj ett format Please enter a valid video link Fetching Media Info... Hämtar media-info... Video format: Audio format: Advanced options ================================================ FILE: resources/locales/ui_tr.ts ================================================ about_ui_tr About Persepolis Persepolis Hakkında Persepolis Download Manager Persepolis İndirme Yöneticisi <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers Geliştiriciler Translators Çevirmenler License Lisans OK Tamam AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! Acknowledgments <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! addlink_ui_tr Add to category: Kategoriye ekle: Proxy Proksi IP: IP: Port: Port: Change Download Folder İndirme Dizinini Değiştir Download Folder: İndirme Dizini: Cancel Vazgeç OK Tamam Link Bağlantı More Options Daha Fazla Seçenek Advanced Options Gelişmiş Seçenekler Add Download Link Download link: Change file name: Detect System Proxy Settings Proxy password: Proxy username: Download username and password Download username: Download password: Remember this path Start time End time Number of connections: Download Later HTTP HTTPS SOCKS5 after_download_src_ui_tr <b>File name</b>: <b>Dosya adı</b>: <b>Size</b>: <b>Boyut</b>: after_download_ui_tr Persepolis Download Manager Persepolis İndirme Yöneticisi Open File Dosya Aç Open Download Folder İndirme Dizinini Aç OK Tamam Don't show this message again. Bu mesajı tekrar gösterme. <b>Download Completed!</b> <b>İndirme Tamamlandı!</b> <b>Save as</b>: <b>Farklı kaydet</b>: <b>Link</b>: <b>Bağlantı</b>: log_window_ui_tr Report Issue Sorun Raporla Initialization and information Downloads Errors and warnings mainwindow_src_ui_tr Error: Hata: <b>Link</b>: <b>Bağlantı</b>: <b>Downloaded</b>: <b>İndirildi</b>: <b>Transfer rate</b>: <b>Transfer oranı</b>: <b>Estimated time left</b>: <b>Tahmini kalan süre</b>: <b>Connections</b>: <b>Bağlantılar</b>: <b>Status</b>: <b>Durum</b>: Download Stopped İndrime Durduruldu Error - Hata - Download Complete İndirme Tamamlandı <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>Bu bağlantı daha önce eklenmiştir! Tekrar eklemek istediğinizden emin misiniz?</center></b> Download Starts İndirme Başladı Operation was not successful. İşlem başarılı değildi. Please resume the following category: Lütfen aşağıdaki kategoriye devam edin: Not enough free space in: İçinde yeterince boş alan yok: muxing error muxing hatası an error occurred Please update Persepolis. <b>Fragments</b>: mainwindow_ui_tr Persepolis Download Manager Persepolis İndirme Yöneticisi Show/Hide system tray icon Sistem tepsisi simgesini Göster/Gizle Add New Download Link Yeni İndirme Bağlantısı Ekle Resume Download İndirmeye Devam et Pause Download İndirmeyi DDuraklat Stop/Cancel Download İndirmeyi Durdur/İptal et Properties Özellikler Progress İlerleme Exit Çıkış Start Time Başlama Zamanı End Time Bitiş Zamanı Download bottom of the list first İlk önce listenin altını indir Apply Uygula After download İndirmeden sonra Shut Down Kapat <b>Video file status: </b> <b>Video dosyası durumu: </b> <b>Audio file status: </b> <b>Ses dosyası durumu: </b> <b>Status: </b> <b>Durum: </b> <b>Muxing status: </b> <b>Muxing durumu: </b> downloaded indirildi Minimize to System Tray Hide Options Keep System Awake! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Start Mixing <b>Video File Status: </b> <b>Audio File Status: </b> <b>Mixing status: </b> progress_ui_tr Persepolis Download Manager Persepolis İndirme Yöneticisi Status: Durum: Downloaded: İndirildi: Transfer rate: Transfer oranı: Estimated time left: Tahmini kalan süre: Number of connections: Bağlantıların Sayısı: Download Information İndirme Bilgisi After download İndirmeden sonra Apply Uygula Shut Down Kapat Download Options İndirme Seçenekleri Resume Devam et Pause Duraklat Stop Durdur Link: setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> <b><center>Bu kısayol daha önce kullanılmış! Başka bir tane kullanın!</center></b> setting_ui_tr Preferences Tercihler Number of tries: Deneme sayısı: <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p>Zaman aşımını saniye cinsinden ayarla. </p></body></html> Timeout (seconds): Zaman aşımı (saniye): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> <html><head/><body><p>Birden fazla bağlantı kullanarak indirme işleminizi hızlandırabilirsiniz.</p></body></html> Number of connections: Bağlantıların Sayısı: Change Değiştir Download Options İndirme Seçenekleri Volume: Hacim: Notifications Bildirim Style: Tarz: Color scheme: Renk şeması: Icons: Simgeler: Notification type: Bildirim türü: Font: Yazı tipi: Size: Boyut: Run Persepolis at startup Başlangıçta Persepolis'i çalıştır Keep system awake! Sistemi uyanık tut! <html><head/><body><p>Format HH:MM</p></body></html> <html><head/><body><p>Biçim SS:DD</p></body></html> Status Durum Video Finder Options Video Bulucu Seçenekleri Defaults Varsayılanlar Cancel Vazgeç OK Tamam Press new keys Yeni tuşlara basın Shortcuts Kısayollar Hide main window if close button clicked. Kapat düğmesi tıklanırsa ana pencereyi gizle. <html><head/><body><p>This feature may not work in your operating system.</p></body></html> <html><head/><body><p>Bu özellik işletim sisteminizde çalışmayabilir.</p></body></html> Language: Wait period between retries (seconds): Don't use certificate to verify the peers <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> Download folder: Create subfolders for Music,Videos, ... in default download folder Save As Enable Notification Sounds Toolbar icons size: Enable system tray icon Show download complete dialog when download is finished Show menubar Show side panel Show download progress window <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Columns Customization Check system clipboard for copied links <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> Download requests from the browser will be executed immediately. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> Chunk size(KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. text_ui_tr Persepolis Download Manager Persepolis İndirme Yöneticisi IP: IP: Port: Port: Change Download Folder İndirme Dizinini Değiştir Proxy password: Proxy username: Download username and password Download username: Download password: Download folder: Number of connections: video_finder_progress_ui_tr <b>Video file status: </b> <b>Video dosyası durumu: </b> <b>Audio file status: </b> <b>Ses dosyası durumu: </b> <b>Muxing status: </b> <b>Muxing durumu: </b> <b>Mixing status: </b> ================================================ FILE: resources/locales/ui_tr_TR.ts ================================================ about_ui_tr About Persepolis Persepolis Hakkında Persepolis Download Manager Persepolis İndirme Yöneticisi <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers Geliştiriciler Translators Çevirmenler License Lisans OK Tamam AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! Acknowledgments <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! addlink_ui_tr Add to category: Kategoriye ekle: Proxy Aracı sunucu IP: IP: Port: Bağlantı noktası: Change Download Folder İndirme Dizinini Değiştir Download Folder: İndirme Dizini: Cancel İptal OK Tamam Link Bağlantı More Options Daha Fazla Seçenek Advanced Options Gelişmiş Seçenekler Add Download Link Download link: Change file name: Detect System Proxy Settings Proxy password: Proxy username: Download username and password Download username: Download password: Remember this path Start time End time Number of connections: Download Later HTTP HTTPS SOCKS5 after_download_src_ui_tr <b>File name</b>: <b>Dosya adı</b>: <b>Size</b>: <b>Boyut</b>: after_download_ui_tr Persepolis Download Manager Persepolis İndirme Yöneticisi Open File Dosya Aç Open Download Folder İndirme Dizinini Aç OK Tamam Don't show this message again. Bu iletiyi tekrar gösterme. <b>Download Completed!</b> <b>İndirme Tamamlandı!</b> <b>Save as</b>: <b>Farklı kaydet</b>: <b>Link</b>: <b>Bağlantı</b>: log_window_ui_tr Report Issue Sorun Bildir Initialization and information Downloads Errors and warnings mainwindow_src_ui_tr Error: Hata: <b>Link</b>: <b>Bağlantı</b>: <b>Downloaded</b>: <b>İndirildi</b>: <b>Transfer rate</b>: <b>Aktarım hızı</b>: <b>Estimated time left</b>: <b>Tahmini kalan süre</b>: <b>Connections</b>: <b>Bağlantılar</b>: <b>Status</b>: <b>Durum</b>: Download Stopped İndrime Durduruldu Error - Hata - Download Complete İndirme Tamamlandı <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>Bu bağlantı daha önce eklenmiştir! Tekrar eklemek istediğinizden emin misiniz?</center></b> Download Starts İndirme Başladı Operation was not successful. İşleyiş başarılı değildi. Please resume the following category: Lütfen sıradaki kategoriyi devam ettirin: Not enough free space in: Yeterli boş alan yok muxing error Çoğullama hatası an error occurred Please update Persepolis. <b>Fragments</b>: mainwindow_ui_tr Persepolis Download Manager Persepolis İndirme Yöneticisi Show/Hide system tray icon Görev çubuğu simgesini Göster/Gizle Add New Download Link Yeni İndirme Bağlantısı Ekle Resume Download İndirmeye Kaldığı Yerden Devam Et Pause Download İndirmeye Ara Ver Stop/Cancel Download İndirmeyi Durdur/İptal et Properties Özellikler Progress İlerleyiş Exit Çıkış Start Time Başlama Zamanı End Time Bitiş Zamanı Download bottom of the list first İlk önce listenin altındakini indir Apply Uygula After download İndirdikten sonra Shut Down Kapat <b>Video file status: </b> <b>Video dosyası durumu: </b> <b>Audio file status: </b> <b>Ses dosyası durumu: </b> <b>Status: </b> <b>Durum: </b> <b>Muxing status: </b> <b>Çoğullama durumu: </b> downloaded indirildi Minimize to System Tray Hide Options Keep System Awake! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Start Mixing <b>Video File Status: </b> <b>Audio File Status: </b> <b>Mixing status: </b> progress_ui_tr Persepolis Download Manager Persepolis İndirme Yöneticisi Status: Durum: Downloaded: İndirildi: Transfer rate: Aktarım hızı: Estimated time left: Tahmini kalan süre: Number of connections: Bağlantıların Sayısı: Download Information İndirme Bilgisi After download İndirdikten sonra Apply Uygula Shut Down Kapat Download Options İndirme Seçenekleri Resume Kaldığı Yerden Devam Et Pause Ara ver Stop Durdur Link: setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> <b><center>Bu kısayol daha önce kullanılmıştır! Diğer birini kullanın!</center></b> setting_ui_tr Preferences Tercihler Number of tries: Deneme sayısı: <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p>Zaman aşımını saniye olarak ayarla. </p></body></html> Timeout (seconds): Zaman aşımı (saniye): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> <html><head/><body><p>Birden fazla bağlantı kullanmak, indirmenizi hızlandırmaya yardımcı olabilir</p></body></html> Number of connections: Bağlantıların Sayısı: Change Değiştir Download Options İndirme Seçenekleri Volume: Hacim: Notifications Bildirimler Style: Tarz: Color scheme: Renk şeması: Icons: Simgeler: Notification type: Bildirim türü: Font: Yazı tipi: Size: Boyut: Run Persepolis at startup Başlangıçta Persepolis'i çalıştır Keep system awake! Sistemi uyanık tut! <html><head/><body><p>Format HH:MM</p></body></html> <html><head/><body><p>Biçim SS:DD</p></body></html> Status Durum Video Finder Options Video Bulucu Seçenekleri Defaults Varsayılanlar Cancel İptal OK Tamam Press new keys Yeni tuşlara basın Shortcuts Kısayollar Hide main window if close button clicked. Kapat düğmesi tıklandığında ana pencereyi gizle. <html><head/><body><p>This feature may not work in your operating system.</p></body></html> <html><head/><body><p>Bu özellik işletim sisteminizde çalışmayabilir.</p></body></html> Language: Wait period between retries (seconds): Don't use certificate to verify the peers <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> Download folder: Create subfolders for Music,Videos, ... in default download folder Save As Enable Notification Sounds Toolbar icons size: Enable system tray icon Show download complete dialog when download is finished Show menubar Show side panel Show download progress window <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Columns Customization Check system clipboard for copied links <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> Download requests from the browser will be executed immediately. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> Chunk size(KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. text_ui_tr Persepolis Download Manager Persepolis İndirme Yöneticisi IP: IP: Port: Bağlantı noktası: Change Download Folder İndirme Dizinini Değiştir Proxy password: Proxy username: Download username and password Download username: Download password: Download folder: Number of connections: video_finder_progress_ui_tr <b>Video file status: </b> <b>Video dosyası durumu: </b> <b>Audio file status: </b> <b>Ses dosyası durumu: </b> <b>Muxing status: </b> <b>Çoğullama durumu: </b> <b>Mixing status: </b> ================================================ FILE: resources/locales/ui_zh_CN.ts ================================================ about_ui_tr About Persepolis 关于 Persepolis Persepolis Download Manager Persepolis 下载管理器 <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers 开发人员 Translators 译者 License 许可协议 OK 确定 AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia Acknowledgments 致谢 <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP 项目</a> <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg 项目</a> <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>Pyside 项目</a> <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>Requests 项目</a> addlink_ui_tr Add to category: 添加到类别: Proxy 代理 IP: IP 地址: Port: 端口: Change Download Folder 更改下载文件夹 Download Folder: 下载文件夹: Cancel 取消 OK 确定 Link 链接 More Options 更多选项 Advanced Options 高级选项 Add Download Link 添加下载链接 Download link: 下载链接: Change file name: 更改文件名: Detect System Proxy Settings 检测系统代理设置 Proxy password: 代理密码: Proxy username: 代理用户名: Download username and password 下载用户名和密码 Download username: 下载用户名: Download password: 下载密码: Remember this path 记住此路径 Start time 开始时间 End time 结束时间 Number of connections: 连接数: Download Later 稍后下载 HTTP HTTP HTTPS HTTPS SOCKS5 SOCKS5 after_download_src_ui_tr <b>File name</b>: <b>文件名</b>: <b>Size</b>: <b>大小</b>: after_download_ui_tr Persepolis Download Manager Persepolis 下载管理器 Open File 打开文件 Open Download Folder 打开下载文件夹 OK 确定 Don't show this message again. 不再显示这条信息。 <b>Download Completed!</b> <b>下载完成!</b> <b>Save as</b>: <b>另存为</b>: <b>Link</b>: <b>链接</b>: log_window_ui_tr Report Issue 上报问题 Initialization and information Downloads Errors and warnings mainwindow_src_ui_tr Error: 错误... <b>Link</b>: <b>链接</b>: <b>Downloaded</b>: <b>已下载</b>: <b>Transfer rate</b>: <b>传输速度</b>: <b>Estimated time left</b>: <b>预计剩余时间</b>: <b>Connections</b>: <b>连接数</b>: <b>Status</b>: <b>状态</b>: Download Stopped 下载已停止 Error - 错误 - Download Complete 下载完成 <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>此链接之前已被添加!您确定要再次添加吗?</center></b> Download Starts 下载状态 Operation was not successful. 操作失败。 Please resume the following category: 请继续以下类别: Not enough free space in: 此处剩余空间不足: muxing error 复用错误 an error occurred 发生错误 Please update Persepolis. 请更新 Persepolis。 <b>Fragments</b>: <b>分片</b>: mainwindow_ui_tr Persepolis Download Manager Persepolis 下载管理器 Show/Hide system tray icon 显示/隐藏系统托盘图标 Add New Download Link 新建下载链接 Resume Download 继续下载 Pause Download 暂停下载 Stop/Cancel Download 终止/取消下载 Properties 属性 Progress 进度 Exit 退出 Start Time 开始时间 End Time 结束时间 Download bottom of the list first 优先下载列表 底部资源 Apply 应用 After download 下载完成后 Shut Down 关机 <b>Video file status: </b> <b>视频文件状态:</b> <b>Audio file status: </b> <b>音频文件状态:</b> <b>Status: </b> <b>状态:</b> <b>Muxing status: </b> <b>复用状态:</b> downloaded 已下载 Minimize to System Tray 最小化到系统托盘 Hide Options 隐藏选项 Keep System Awake! 阻止系统睡眠! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> 此选项将阻止系统进入睡眠状态。 如果您的电源管理器自动暂停系统,请打开此选项。 Start Mixing 开始混合 <b>Video File Status: </b> <b>视频文件状态:</b> <b>Audio File Status: </b> <b>音频文件状态:</b> <b>Mixing status: </b> <b>混合状态: </b> progress_ui_tr Persepolis Download Manager Persepolis 下载管理器 Status: 状态: Downloaded: 已下载: Transfer rate: 传输速度: Estimated time left: 预计剩余时间: Number of connections: 连接数: Download Information 下载信息 After download 下载完成后 Apply 应用 Shut Down 关闭 Download Options 下载选项 Resume 继续 Pause 暂停 Stop 终止 Link: 链接: setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> <b><center>此快捷键已被占用,请使用其他快捷键!</center></b> setting_ui_tr Preferences 首选项 Number of tries: 尝试次数: <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p>设置超时秒数。</p></body></html> Timeout (seconds): 超时 (秒): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> <html><head/><body><p>使用多线程可以提升下载速度。</p></body></html> Number of connections: 连接数: Change 更改 Download Options 下载选项 Volume: 音量: Notifications 通知 Style: 风格: Color scheme: 配色方案: Icons: 图标: Notification type: 通知类型: Font: 字体: Size: 大小: Run Persepolis at startup 开机自动运行 Persepolis Keep system awake! 防止系统休眠! <html><head/><body><p>Format HH:MM</p></body></html> <html><head/><body><p>格式:HH:MM</p></body></html> Status 状态 Video Finder Options 视频嗅探选项 Defaults 默认 Cancel 取消 OK 确定 Press new keys 按下新的快捷键组合 Shortcuts 快捷键 Hide main window if close button clicked. 点击关闭按钮时隐藏主窗口 <html><head/><body><p>This feature may not work in your operating system.</p></body></html> <html><head/><body><p>此特性可能不支持当前操作系统</p></body></html> Language: 语言: Wait period between retries (seconds): 重试间隔 (秒): Don't use certificate to verify the peers 不要使用证书来验证节点 <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> <html><head/><body><p>此选项可避免 SSL/TLS 握手失败。使用时需自担风险!</p></body></html> Download folder: 下载文件夹: Create subfolders for Music,Videos, ... in default download folder 在默认下载文件夹中创建音乐、视频等子文件夹 Save As 另存为 Enable Notification Sounds 打开通知音效 Toolbar icons size: 工具栏图标尺寸: Enable system tray icon 启用系统托盘图标 Show download complete dialog when download is finished 下载完成后显示下载完成对话框 Show menubar 显示菜单栏 Show side panel 显示侧边栏 Show download progress window 显示下载进度窗口 <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> <html><head/><body><p>此选项将阻止系统进入睡眠状态。如果您的电源管理设置会自动挂起系统,则此设置是必需的。</p></body></html> Columns Customization 自定义列 Check system clipboard for copied links 检查系统剪贴板中是否有复制的链接 <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> <html><head/><body><p>该程序将自动检查剪贴板中复制的链接。 </p></body></html> Download requests from the browser will be executed immediately. 来自浏览器的下载请求将被立即执行。 <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>当从浏览器扩展发送下载请求时,下载将开始而不显示添加链接窗口。</p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>设置下载失败后的重试次数。</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> <html><head/><body><p>设置每次重试间间隔的秒数。</p></body></html> Chunk size(KiB): 块大小(KB): It is python requests library chunk size. Do not change this If you are not familiar with it. 这是 python request 库的块大小。若不熟悉请不要更改。 text_ui_tr Persepolis Download Manager Persepolis 下载管理器 IP: IP: Port: 端口: Change Download Folder 更改下载文件夹 Proxy password: 代理密码: Proxy username: 代理用户名: Download username and password 下载用户名和密码 Download username: 下载用户名: Download password: 下载密码: Download folder: 下载文件夹: Number of connections: 连接数: video_finder_progress_ui_tr <b>Video file status: </b> <b>视频文件状态:</b> <b>Audio file status: </b> <b>音频文件状态:</b> <b>Muxing status: </b> <b>复用状态:</b> <b>Mixing status: </b> <b>混合状态:</b> ================================================ FILE: resources/locales/ui_zh_TW.ts ================================================ about_ui_tr About Persepolis About Persepolis Persepolis Download Manager Persepolis 下載管理器 <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://persepolisdm.github.io>https://persepolisdm.github.io</a> <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://telegram.me/persepolisdm>https://telegram.me/persepolisdm</a> <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://twitter.com/persepolisdm>https://twitter.com/persepolisdm</a> Developers 開發者 Translators 譯者 License 授權條款 OK OK AliReza AmirSamimi Mohammadreza Abdollahzadeh Sadegh Alirezaie Mostafa Asadi Jafar Akhondali Kia Hamedi H.Rostami Ehsan Titish MohammadAmin Vahedinia TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! Acknowledgments <a href=https://github.com/yt-dlp/yt-dlp>YT-DLP project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/ffmpeg/ffmpeg>FFmpeg project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://wiki.qt.io/Qt_for_Python>Pyside project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! <a href=https://github.com/psf/requests>Requests project</a> TRANSLATORS NOTE: YOU REALLY DON'T NEED TO TRANSLATE THIS PART! addlink_ui_tr Add to category: 加入類別: Proxy Proxy IP: IP 位址: Port: 連接埠: Change Download Folder 更改下載資料夾 Download Folder: 下載資料夾: Cancel 取消 OK OK Link 連結 More Options 更多選項 Advanced Options 進階選項 Add Download Link Download link: Change file name: Detect System Proxy Settings Proxy password: Proxy username: Download username and password Download username: Download password: Remember this path Start time End time Number of connections: Download Later HTTP HTTPS SOCKS5 after_download_src_ui_tr <b>File name</b>: <b>檔名</b>: <b>Size</b>: <b>大小</b>: after_download_ui_tr Persepolis Download Manager Persepolis 下載管理器 Open File 開啟檔案 Open Download Folder 開啟下載資料夾 OK OK Don't show this message again. 不再顯示此訊息 <b>Download Completed!</b> <b>下載完成!</b> <b>Save as</b>: <b>另存為</b>: <b>Link</b>: <b>連結</b>: log_window_ui_tr Report Issue 回報問題 Initialization and information Downloads Errors and warnings mainwindow_src_ui_tr Error: 錯誤: <b>Link</b>: <b>連結</b>: <b>Downloaded</b>: <b>已下載</b>: <b>Transfer rate</b>: <b>傳輸速度</b>: <b>Estimated time left</b>: <b>預計剩餘時間</b>: <b>Connections</b>: <b>連接數</b>: <b>Status</b>: <b>狀態</b>: Download Stopped 下載已停止 Error - 錯誤 - Download Complete 下載完成 <b><center>This link has been added before! Are you sure you want to add it again?</center></b> <b><center>已經新增過此連結了! 您確定要再加入一次嗎?</center></b> Download Starts 下載開始 Operation was not successful. 操作失敗。 Please resume the following category: 請繼續以下類別: Not enough free space in: 空間不足: muxing error 多工錯誤 an error occurred Please update Persepolis. <b>Fragments</b>: mainwindow_ui_tr Persepolis Download Manager Persepolis 下載管理器 Show/Hide system tray icon 顯示/隱藏系統匣圖示 Add New Download Link 加入新下載連結 Resume Download 繼續下載 Pause Download 暫停下載 Stop/Cancel Download 停止/取消下載 Properties 屬性 Progress 進度 Exit 離開 Start Time 開始時間 End Time 結束時間 Download bottom of the list first 置底項目優先 下載 Apply 套用 After download 下載後 Shut Down 關機 <b>Video file status: </b> <b>視訊檔案狀態:</b> <b>Audio file status: </b> <b>音訊檔案狀態:</b> <b>Status: </b> <b>狀態:</b> <b>Muxing status: </b> <b>多工狀態:</b> downloaded 已下載 Minimize to System Tray Hide Options Keep System Awake! <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Start Mixing <b>Video File Status: </b> <b>Audio File Status: </b> <b>Mixing status: </b> progress_ui_tr Persepolis Download Manager Persepolis 下載管理器 Status: 狀態: Downloaded: 已下載: Transfer rate: 傳輸速度: Estimated time left: 預計剩餘時間: Number of connections: 連接數: Download Information 下載資訊 After download 下載後 Apply 套用 Shut Down 關機 Download Options 下載選項 Resume 繼續 Pause 暫停 Stop 停止 Link: setting_src_ui_tr <b><center>This shortcut has been used before! Use another one!</center></b> setting_ui_tr Preferences 選項 Number of tries: 嘗試次數: <html><head/><body><p>Set timeout in seconds. </p></body></html> <html><head/><body><p>設置逾時秒數。</p></body></html> Timeout (seconds): 逾時 (秒): <html><head/><body><p>Using multiple connections can help speed up your download.</p></body></html> <html><head/><body><p>使用多個連線可以加速下載。</p></body></html> Number of connections: 連接數: Change 更改 Download Options 下載選項 Volume: 音量: Notifications 通知 Style: 樣式: Color scheme: 配色: Icons: 圖示: Notification type: 通知類型: Font: 字型: Size: 大小: Run Persepolis at startup 開機時啟動 Persepolis Keep system awake! 阻止系統進入睡眠模式! <html><head/><body><p>Format HH:MM</p></body></html> <html><head/><body><p>格式 分:秒</p></body></html> Status 狀態 Video Finder Options 影片搜尋工具選項 Defaults 預設 Cancel 取消 OK OK Press new keys 按下新按鍵 Shortcuts 快捷鍵 Hide main window if close button clicked. 若點擊關閉按鈕,將隱藏視窗。 <html><head/><body><p>This feature may not work in your operating system.</p></body></html> <html><head/><body><p>此功能在您的作業系統可能無法正常運作。</p></body></html> Language: Wait period between retries (seconds): Don't use certificate to verify the peers <html><head/><body><p>This option avoids SSL/TLS handshake failure. But use it at your own risk!</p></body></html> Download folder: Create subfolders for Music,Videos, ... in default download folder Save As Enable Notification Sounds Toolbar icons size: Enable system tray icon Show download complete dialog when download is finished Show menubar Show side panel Show download progress window <html><head/><body><p>This option will prevent the system from going to sleep. It is necessary if your power manager is suspending the system automatically. </p></body></html> Columns Customization Check system clipboard for copied links <html><head/><body><p>The program will automatically check the clipboard for copied links. </p></body></html> Download requests from the browser will be executed immediately. <html><head/><body><p>When a download request is sent from the browser extension, the download will start without showing the Add Link window. </p></body></html> <html><head/><body><p>Set number of retries if download failed.</p></body></html> <html><head/><body><p>Set the seconds to wait between retries.</p></body></html> Chunk size(KiB): It is python requests library chunk size. Do not change this If you are not familiar with it. text_ui_tr Persepolis Download Manager Persepolis 下載管理器 IP: IP 位址: Port: 連接埠: Change Download Folder 更改下載資料夾 Proxy password: Proxy username: Download username and password Download username: Download password: Download folder: Number of connections: video_finder_progress_ui_tr <b>Video file status: </b> <b>視訊檔案狀態:</b> <b>Audio file status: </b> <b>音訊檔案狀態:</b> <b>Muxing status: </b> <b>多工狀態:</b> <b>Mixing status: </b> ================================================ FILE: resources/meson.build ================================================ icon_files = [ 'com.github.persepolisdm.persepolis.svg', 'persepolis-tray.svg'] install_data(icon_files, install_dir: icondir) ================================================ FILE: resources/resources.qrc ================================================ translators.txt com.github.persepolisdm.persepolis.svg persepolis-tray.svg Breeze/about.svg Breeze/add.svg Breeze/exit.svg Breeze/folder.svg Breeze/minimize.svg Breeze/ok.svg Breeze/pause.svg Breeze/play.svg Breeze/preferences.svg Breeze/remove.svg Breeze/setting.svg Breeze/stop.svg Breeze/stop_all.svg Breeze/trash.svg Breeze/window.svg Breeze/file.svg Breeze/multi_remove.svg Breeze/multi_trash.svg Breeze/select_all.svg Breeze/add_queue.svg Breeze/start_queue.svg Breeze/stop_queue.svg Breeze/pause_queue.svg Breeze/remove_queue.svg Breeze/menu.svg Breeze/up.svg Breeze/down.svg Breeze/multi_up.svg Breeze/multi_down.svg Breeze/clipboard.svg Breeze/refresh.svg Breeze/video_finder.svg Breeze-Dark/about.svg Breeze-Dark/add.svg Breeze-Dark/exit.svg Breeze-Dark/folder.svg Breeze-Dark/minimize.svg Breeze-Dark/ok.svg Breeze-Dark/pause.svg Breeze-Dark/play.svg Breeze-Dark/preferences.svg Breeze-Dark/remove.svg Breeze-Dark/setting.svg Breeze-Dark/stop.svg Breeze-Dark/stop_all.svg Breeze-Dark/trash.svg Breeze-Dark/window.svg Breeze-Dark/file.svg Breeze-Dark/multi_remove.svg Breeze-Dark/multi_trash.svg Breeze-Dark/select_all.svg Breeze-Dark/add_queue.svg Breeze-Dark/start_queue.svg Breeze-Dark/stop_queue.svg Breeze-Dark/pause_queue.svg Breeze-Dark/remove_queue.svg Breeze-Dark/menu.svg Breeze-Dark/up.svg Breeze-Dark/down.svg Breeze-Dark/multi_up.svg Breeze-Dark/multi_down.svg Breeze-Dark/clipboard.svg Breeze-Dark/refresh.svg Breeze-Dark/video_finder.svg Papirus/about.svg Papirus/add.svg Papirus/exit.svg Papirus/folder.svg Papirus/minimize.svg Papirus/ok.svg Papirus/pause.svg Papirus/play.svg Papirus/preferences.svg Papirus/remove.svg Papirus/setting.svg Papirus/stop.svg Papirus/stop_all.svg Papirus/trash.svg Papirus/window.svg Papirus/file.svg Papirus/multi_remove.svg Papirus/multi_trash.svg Papirus/select_all.svg Papirus/add_queue.svg Papirus/start_queue.svg Papirus/stop_queue.svg Papirus/pause_queue.svg Papirus/remove_queue.svg Papirus/menu.svg Papirus/up.svg Papirus/down.svg Papirus/multi_up.svg Papirus/multi_down.svg Papirus/clipboard.svg Papirus/refresh.svg Papirus/video_finder.svg Papirus-Dark/about.svg Papirus-Dark/add.svg Papirus-Dark/exit.svg Papirus-Dark/folder.svg Papirus-Dark/minimize.svg Papirus-Dark/ok.svg Papirus-Dark/pause.svg Papirus-Dark/play.svg Papirus-Dark/preferences.svg Papirus-Dark/remove.svg Papirus-Dark/setting.svg Papirus-Dark/stop.svg Papirus-Dark/stop_all.svg Papirus-Dark/trash.svg Papirus-Dark/window.svg Papirus-Dark/file.svg Papirus-Dark/multi_remove.svg Papirus-Dark/multi_trash.svg Papirus-Dark/select_all.svg Papirus-Dark/add_queue.svg Papirus-Dark/start_queue.svg Papirus-Dark/stop_queue.svg Papirus-Dark/pause_queue.svg Papirus-Dark/remove_queue.svg Papirus-Dark/menu.svg Papirus-Dark/up.svg Papirus-Dark/down.svg Papirus-Dark/multi_up.svg Papirus-Dark/multi_down.svg Papirus-Dark/clipboard.svg Papirus-Dark/refresh.svg Papirus-Dark/video_finder.svg Papirus-Light/about.svg Papirus-Light/add.svg Papirus-Light/exit.svg Papirus-Light/folder.svg Papirus-Light/minimize.svg Papirus-Light/ok.svg Papirus-Light/pause.svg Papirus-Light/play.svg Papirus-Light/preferences.svg Papirus-Light/remove.svg Papirus-Light/setting.svg Papirus-Light/stop.svg Papirus-Light/stop_all.svg Papirus-Light/trash.svg Papirus-Light/window.svg Papirus-Light/file.svg Papirus-Light/multi_remove.svg Papirus-Light/multi_trash.svg Papirus-Light/select_all.svg Papirus-Light/add_queue.svg Papirus-Light/start_queue.svg Papirus-Light/stop_queue.svg Papirus-Light/pause_queue.svg Papirus-Light/remove_queue.svg Papirus-Light/menu.svg Papirus-Light/up.svg Papirus-Light/down.svg Papirus-Light/multi_up.svg Papirus-Light/multi_down.svg Papirus-Light/clipboard.svg Papirus-Light/refresh.svg Papirus-Light/video_finder.svg light_style.qss light fusion/ads_close.svg light fusion/ads_close_hover.svg light fusion/ads_close_pressed.svg light fusion/ads_detach.svg light fusion/ads_detach_hover.svg light fusion/ads_detach_hover_pressed.svg light fusion/ads_maximize.svg light fusion/ads_maximize_hover.svg light fusion/ads_maximize_pressed.svg light fusion/ads_menu_button.svg light fusion/ads_menu_button_hover.svg light fusion/ads_menu_button_pressed.svg light fusion/branch_closed.svg light fusion/branch_closed_hover.svg light fusion/branch_end.svg light fusion/branch_end_arrow.svg light fusion/branch_more.svg light fusion/branch_more_arrow.svg light fusion/branch_open.svg light fusion/branch_open_hover.svg light fusion/browser_refresh.svg light fusion/browser_refresh_stop.svg light fusion/calendar_next.svg light fusion/calendar_previous.svg light fusion/checkbox_checked.svg light fusion/checkbox_checked_disabled.svg light fusion/checkbox_indeterminate.svg light fusion/checkbox_indeterminate_disabled.svg light fusion/checkbox_unchecked.svg light fusion/checkbox_unchecked_disabled.svg light fusion/clear_text.svg light fusion/close.svg light fusion/close_hover.svg light fusion/close_pressed.svg light fusion/computer.svg light fusion/desktop.svg light fusion/dialog_apply.svg light fusion/dialog_cancel.svg light fusion/dialog_close.svg light fusion/dialog_discard.svg light fusion/dialog_help.svg light fusion/dialog_ignore.svg light fusion/dialog_no.svg light fusion/dialog_ok.svg light fusion/dialog_open.svg light fusion/dialog_reset.svg light fusion/dialog_retry.svg light fusion/dialog_save.svg light fusion/dialog_save_all.svg light fusion/dialog_yes_to_all.svg light fusion/disc_drive.svg light fusion/down_arrow.svg light fusion/down_arrow_disabled.svg light fusion/down_arrow_hover.svg light fusion/file.svg light fusion/file_dialog_contents.svg light fusion/file_dialog_detailed.svg light fusion/file_dialog_end.svg light fusion/file_dialog_info.svg light fusion/file_dialog_list.svg light fusion/file_dialog_start.svg light fusion/file_link.svg light fusion/floppy_drive.svg light fusion/folder.svg light fusion/folder_link.svg light fusion/folder_open.svg light fusion/folder_open_link.svg light fusion/hard_drive.svg light fusion/help.svg light fusion/hmovetoolbar.svg light fusion/home_directory.svg light fusion/horizontal_extension.svg light fusion/hseptoolbar.svg light fusion/left_arrow.svg light fusion/left_arrow_disabled.svg light fusion/left_arrow_hover.svg light fusion/maximize.svg light fusion/menu.svg light fusion/message_critical.svg light fusion/message_information.svg light fusion/message_question.svg light fusion/message_warning.svg light fusion/minimize.svg light fusion/network_drive.svg light fusion/pause.svg light fusion/play.svg light fusion/radio_checked.svg light fusion/radio_checked_disabled.svg light fusion/radio_unchecked.svg light fusion/radio_unchecked_disabled.svg light fusion/restore.svg light fusion/restore_defaults.svg light fusion/right_arrow.svg light fusion/right_arrow_disabled.svg light fusion/right_arrow_hover.svg light fusion/seek_backward.svg light fusion/seek_forward.svg light fusion/shade.svg light fusion/sizegrip.svg light fusion/skip_backward.svg light fusion/skip_forward.svg light fusion/stop.svg light fusion/tab_close.svg light fusion/transparent.svg light fusion/trash.svg light fusion/undock.svg light fusion/undock_hover.svg light fusion/undock_hover_pressed.svg light fusion/unshade.svg light fusion/up_arrow.svg light fusion/up_arrow_disabled.svg light fusion/up_arrow_hover.svg light fusion/vertical_extension.svg light fusion/vista_shield.svg light fusion/vline.svg light fusion/vmovetoolbar.svg light fusion/volume.svg light fusion/volume_muted.svg light fusion/vseptoolbar.svg light fusion/window_close.svg dark_style.qss dark fusion/ads_close.svg dark fusion/ads_close_hover.svg dark fusion/ads_close_pressed.svg dark fusion/ads_detach.svg dark fusion/ads_detach_hover.svg dark fusion/ads_detach_hover_pressed.svg dark fusion/ads_maximize.svg dark fusion/ads_maximize_hover.svg dark fusion/ads_maximize_pressed.svg dark fusion/ads_menu_button.svg dark fusion/ads_menu_button_hover.svg dark fusion/ads_menu_button_pressed.svg dark fusion/branch_closed.svg dark fusion/branch_closed_hover.svg dark fusion/branch_end.svg dark fusion/branch_end_arrow.svg dark fusion/branch_more.svg dark fusion/branch_more_arrow.svg dark fusion/branch_open.svg dark fusion/branch_open_hover.svg dark fusion/browser_refresh.svg dark fusion/browser_refresh_stop.svg dark fusion/calendar_next.svg dark fusion/calendar_previous.svg dark fusion/checkbox_checked.svg dark fusion/checkbox_checked_disabled.svg dark fusion/checkbox_indeterminate.svg dark fusion/checkbox_indeterminate_disabled.svg dark fusion/checkbox_unchecked.svg dark fusion/checkbox_unchecked_disabled.svg dark fusion/clear_text.svg dark fusion/close.svg dark fusion/close_hover.svg dark fusion/close_pressed.svg dark fusion/computer.svg dark fusion/desktop.svg dark fusion/dialog_apply.svg dark fusion/dialog_cancel.svg dark fusion/dialog_close.svg dark fusion/dialog_discard.svg dark fusion/dialog_help.svg dark fusion/dialog_ignore.svg dark fusion/dialog_no.svg dark fusion/dialog_ok.svg dark fusion/dialog_open.svg dark fusion/dialog_reset.svg dark fusion/dialog_retry.svg dark fusion/dialog_save.svg dark fusion/dialog_save_all.svg dark fusion/dialog_yes_to_all.svg dark fusion/disc_drive.svg dark fusion/down_arrow.svg dark fusion/down_arrow_disabled.svg dark fusion/down_arrow_hover.svg dark fusion/file.svg dark fusion/file_dialog_contents.svg dark fusion/file_dialog_detailed.svg dark fusion/file_dialog_end.svg dark fusion/file_dialog_info.svg dark fusion/file_dialog_list.svg dark fusion/file_dialog_start.svg dark fusion/file_link.svg dark fusion/floppy_drive.svg dark fusion/folder.svg dark fusion/folder_link.svg dark fusion/folder_open.svg dark fusion/folder_open_link.svg dark fusion/hard_drive.svg dark fusion/help.svg dark fusion/hmovetoolbar.svg dark fusion/home_directory.svg dark fusion/horizontal_extension.svg dark fusion/hseptoolbar.svg dark fusion/left_arrow.svg dark fusion/left_arrow_disabled.svg dark fusion/left_arrow_hover.svg dark fusion/maximize.svg dark fusion/menu.svg dark fusion/message_critical.svg dark fusion/message_information.svg dark fusion/message_question.svg dark fusion/message_warning.svg dark fusion/minimize.svg dark fusion/network_drive.svg dark fusion/pause.svg dark fusion/play.svg dark fusion/radio_checked.svg dark fusion/radio_checked_disabled.svg dark fusion/radio_unchecked.svg dark fusion/radio_unchecked_disabled.svg dark fusion/restore.svg dark fusion/restore_defaults.svg dark fusion/right_arrow.svg dark fusion/right_arrow_disabled.svg dark fusion/right_arrow_hover.svg dark fusion/seek_backward.svg dark fusion/seek_forward.svg dark fusion/shade.svg dark fusion/sizegrip.svg dark fusion/skip_backward.svg dark fusion/skip_forward.svg dark fusion/stop.svg dark fusion/tab_close.svg dark fusion/transparent.svg dark fusion/trash.svg dark fusion/undock.svg dark fusion/undock_hover.svg dark fusion/undock_hover_pressed.svg dark fusion/unshade.svg dark fusion/up_arrow.svg dark fusion/up_arrow_disabled.svg dark fusion/up_arrow_hover.svg dark fusion/vertical_extension.svg dark fusion/vista_shield.svg dark fusion/vline.svg dark fusion/vmovetoolbar.svg dark fusion/volume.svg dark fusion/volume_muted.svg dark fusion/vseptoolbar.svg dark fusion/window_close.svg locales/ui_ar.qm locales/ui_es_ES.qm locales/ui_fr_FR.qm locales/ui_ko.qm locales/ui_pl_PL.qm locales/ui_pt.qm locales/ui_ru.qm locales/ui_tr.qm locales/ui_zh_CN.qm locales/ui_de.qm locales/ui_fa_IR.qm locales/ui_hu.qm locales/ui_nl_NL.qm locales/ui_pt_BR.qm locales/ui_sv.qm locales/ui_tr_TR.qm locales/ui_zh_TW.qm ================================================ FILE: resources/resources_generator.sh ================================================ #!/bin/bash while getopts "trqh" arg;do case $arg in t) translate="1";; r) resources="1";; q) create_qm_files="1";; *) echo "-t updates ui.ts file." echo "-r updates resources.py file." echo "-q create qm files from ts files." esac done # finding parent directory dir=`pwd` parent_dir=`dirname $dir` if [ "$translate" == "1" ];then # generate ui.ts file lupdate "$dir/translation_files.pro" echo "$dir/locales/ui.ts is generated!" fi if [ "$resources" == "1" ];then # generate resource.py file # for pyqt5 # pyrcc5 resources.qrc -o "$parent_dir/persepolis/gui/resources.py" # for pysside2 # rcc -g python -o "$parent_dir/persepolis/gui/resources.py" resources.qrc pyside6-rcc resources.qrc -o "$parent_dir/persepolis/gui/resources.py" #add some line to file sed -i '/PySide6/d' "$parent_dir/persepolis/gui/resources.py" sed -i '6i try:' "$parent_dir/persepolis/gui/resources.py" sed -i '7i\ from PySide6 import QtCore' "$parent_dir/persepolis/gui/resources.py" sed -i '8i except ImportError:' "$parent_dir/persepolis/gui/resources.py" sed -i '9i\ from PyQt5 import QtCore' "$parent_dir/persepolis/gui/resources.py" # sed -i '11i try:' "$parent_dir/persepolis/gui/resources.py" # sed -i '12i\ import lzma' "$parent_dir/persepolis/gui/resources.py" # sed -i '13i except:' "$parent_dir/persepolis/gui/resources.py" # sed -i '14i\ print(\"lzma\ is\ not\ installed!\")' "$parent_dir/persepolis/gui/resources.py" # echo "$parent_dir/persepolis/gui/resource.py is generated!" fi if [ "$create_qm_files" == "1" ];then for file in $dir/locales/* ;do # generate qm files from ts files pyside6-lrelease "$file" done fi ================================================ FILE: resources/translation_files.pro ================================================ TEMPLATE = app TARGET = ts INCLUDEPATH += persepolis # Input SOURCES += ../persepolis/gui/about_ui.py \ ../persepolis/gui/addlink_ui.py \ ../persepolis/gui/after_download_ui.py \ ../persepolis/gui/log_window_ui.py \ ../persepolis/gui/mainwindow_ui.py \ ../persepolis/gui/progress_ui.py \ ../persepolis/gui/setting_ui.py \ ../persepolis/gui/text_queue_ui.py \ ../persepolis/gui/video_finder_progress_ui.py\ ../persepolis/scripts/after_download.py \ ../persepolis/scripts/mainwindow.py \ ../persepolis/scripts/progress.py \ ../persepolis/scripts/setting.py \ ../persepolis/scripts/video_finder_addlink.py TRANSLATIONS += locales/ui.ts ================================================ FILE: resources/translators.txt ================================================ Arabic: Majdi Sobain MajdiSobain Saleh Alanazi Sal7_one rayanm Rex_sa rex07 Simo simonetworking 明 张 zhuangsha19740612 Chinese (China): 0day 0 0day zyppe 210hcl 哥哥 好 485250464 江 王 664766245 x x 731515713 Charley Yang CharleyY Alan Yee Choyee Yonghui Chen ColoPaul SY C DarciaLee_066 Hiyool J L JULIANLEEEEE Jack Su JackSu 快乐的老鼠宝宝 LaoShuBaby haonan li Li_haonan Liro Liu Liro 明阳 蒋 Lotumn Allure R Riseup Vento Fang Vento8866 安塞斯塔 薇薇安 VivianAncestor Ye Wehchs WehchsYe K X X_K ing YIn YIning yyy zzz ZZyyy 鹏 张 a5357663 yongkang yang acme969290422 AliReza AmirSamimi alireza_amirsamimi altria morgan altria066 anakin micheal anakinlt arthur 韩 arthurh Leon Chen bioleon Gabrielle Chou canonlayido 禅和 李 cc379 Sheng Cheng cs54ysm Davin davinma drhenk Dai drhenkdss ZHAN Dr dts0080 dan chin egg233 chen chen false yining fan fan211210 koishi a ghostxt0 ZARK LEE godiamguilty jiangsheng hong hongjiangsheng dp h huangdp Jackson Hu huming2207 W Z icwaos xiang wang ifoanle 海龙 江 jianghailong haha ha jiangweiyang336 家俊 黄 jiayezhang22 liu li kulierhao k y kyalt leo xxx leoxxx 湖广 廖 liaohuguang lei li lilei9587 旭麒 刘 liuxuqi 戈扬 赵 lucius.z qihao mao maoqihao monowolf Lucas monowolf u muguo muguou eo L nbnatcom Ora Prinzing prinzingora s k qqwwee 斌 熊 qw71111520 Jane Yang qwe866zxc Minagawa Hifumi reeealin 354 6548 richard954 rose tiffany rose_tiffany CUI SAN sanc163sa 佳 于 sheena.ringo Sin Qiu sino1641 giga d togiga 思敏 鲍 tulipasky 刘 俊君 tusks wang yuehu wangyuehu xinpu wei weixinpu mike williams williamsguo T W wt1182657346 xiao wu wu12138 wwj402 cq n xiaolu yin xiao xiaoyinge 一弘 郑 yihong2018 youngcrazyboy 卓琪 刘 you志者 an mu zhenlailu long long zql00l 骏一 戚 zsns1994 徐 大侠 伏城 书罕 向 墨墨墨墨墨 chuantong xu 徐传统 00 000 敷衍伤情 花卷 春 春花卷 German (de): Patrick Meier SonArc Andreas Mueller anzbert Dutch (Netherlands): Heimen Stoffels Vistaus French (France): Cwpute BipBoup cwpute Simon Porte sporte Hungarian: - Totya Totya Korean: JungHee Lee MarongHappy Persian (Iran): AliReza AmirSamimi alireza_amirsamimi h_r 71 hayyan711 Mostafa Bodagh mosi2772 Mostafa Asadi mostafaasadi Polish (Poland): FadeMind Maurycy Błaszczak LuxF3rre Arkadiusz Rogóż arcio Portuguese: Antonio Barbosa AlvoErrado2 Portuguese (Brazil): Cirnos Gersonzao Carlos Henrique De Freitas Ferreira Neocazen Thiago Schuch ThigSchuch eltonfabricio10 Marli Masa marlimasa Russian: Victor ViktorOnlin Михаил Сомов belliric300 Nikita Paseka deadman1987 Pavel irbinix Sergey Suhih linuxmasterclub Abdolreza Taslimijalilabadi rezaxx Spanish (Spain): Edgardo Castro Castro eddy9305 Jose G. Jimenez S. josegjimenez Juan Manuel ptero.4 Rubén Fernández rubenterco Toni Estévez toniem Turkish (Turkey): Oğuzhan Aksoy OnePage abc Def abcmen Yaşar Çiv yasarciv67 Turkish: abc Def abcmen Koray Biçer kbicer Yaşar Çiv yasarciv67 Chinese (Taiwan): Enfeng Tsao 5iderealArt Sr R sr3296001 qge hao 鸟语花香 Portuguese: Antonio Barbosa AlvoErrado2 Swedish: Kristoffer Grundström Umeaboy ================================================ FILE: test/.pep8 ================================================ [pycodestyle] max_line_length = 120 ================================================ FILE: test/test.py ================================================ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys import os import platform # finding os platform os_type = platform.system() # Don't run persepolis as root! if os_type == 'Linux' or os_type == 'FreeBSD' or os_type == 'OpenBSD' or os_type == 'Darwin': uid = os.getuid() if uid == 0: print('Do not run persepolis as root.') sys.exit(1) cwd = os.path.abspath(__file__) run_dir = os.path.dirname(cwd) # if persepolis run in test folder print('persepolis is running from test folder') parent_dir = os.path.dirname(run_dir) sys.path.insert(0, parent_dir) from persepolis import __main__ ================================================ FILE: uninstall.py ================================================ #!/usr/bin/env python3 # coding: utf-8 # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import platform import glob import os import shutil import sys os_type = platform.system() if os_type == 'Linux': path_list = ['/usr/share/man/man1/persepolis.1.gz', '/usr/share/pixmaps/com.github.persepolisdm.persepolis.svg', '/usr/share/pixmaps/persepolis-tray.svg', '/usr/share/applications/com.github.persepolisdm.persepolis.desktop', '/usr/share/metainfo/com.github.persepolisdm.persepolis.appdata.xml', '/usr/bin/persepolis', '/usr/local/share/man/man1/persepolis.1.gz', '/usr/local/share/pixmaps/com.github.persepolisdm.persepolis.svg', '/usr/local/share/pixmaps/persepolis-tray.svg', '/usr/local/share/applications/com.github.persepolisdm.persepolis.desktop', '/usr/local/share/metainfo/com.github.persepolisdm.persepolis.appdata.xml', '/usr/local/bin/persepolis'] elif os_type in ('FreeBSD', 'OpenBSD'): path_list = ['/usr/local/share/man/man1/persepolis.1.gz', '/usr/local/share/pixmaps/com.github.persepolisdm.persepolis.svg', '/usr/local/share/pixmaps/persepolis-tray.svg', '/usr/local/share/applications/com.github.persepolisdm.persepolis.desktop', '/usr/local/share/metainfo/com.github.persepolisdm.persepolis.appdata.xml', '/usr/local/bin/persepolis'] else: print('This script is for Linux and BSD') sys.exit(1) # finding persepolis directories in /usr/lib/python3.6/site-packages/ python_version_list = ['python3.5', 'python3.6', 'python3.7', 'python3.8', 'python3.9', 'python3.10', 'python3.11', 'python3.12', 'python3.13'] for python_version in python_version_list: # for BSD if os_type == 'Linux': pattern = '/usr/lib/' + python_version + '/site-packages/persepolis*' for folder in glob.glob(pattern): path_list.append(folder) pattern2 = '/usr/local/lib/' + python_version + '/site-packages/persepolis*' for folder in glob.glob(pattern2): path_list.append(folder) elif os_type == 'FreeBSD' or os_type == 'OpenBSD': pattern = '/usr/local/lib/' + python_version + '/site-packages/persepolis*' for folder in glob.glob(pattern): path_list.append(folder) print(path_list) uid = os.getuid() if uid != 0: print('run this script as root.') sys.exit(1) for path in path_list: if os.path.exists(path): if os.path.isfile(path): # if path is for file os.remove(path) # removing file else: shutil.rmtree(path) # removing folder print(str(path) + ' is removed!') print('uninstallation is complete!') ================================================ FILE: xdg/com.github.persepolisdm.persepolis.appdata.xml ================================================ com.github.persepolisdm.persepolis FSFAP GPL-3.0 Persepolis Download Manager Download manager

Persepolis is easy to use graphical download manager that speed up your downloads!

Persepolis features:

  • Multi segment downloading.
  • Scheduling downloads.
  • Download queue.
  • Downloading video from Youtube and more.
  • Persepolis has browser extension for Firefox and Chromium.

com.github.persepolisdm.persepolis.desktop Persepolis Download Manaer https://persepolisdm.github.io/img/screen/persepolis.png https://persepolisdm.github.io/ https://github.com/persepolisdm/persepolis/issues https://github.com/persepolisdm/persepolis/wiki https://www.transifex.com/persepolis/persepolis-translations/ AliReza AmirSamimi
================================================ FILE: xdg/com.github.persepolisdm.persepolis.desktop.in ================================================ [Desktop Entry] Actions=Open;Tray; Categories=Qt;Network; Comment[en_US]=A download manager written in Python Comment=A download manager written in Python Comment[fa]=نرم افزار مدیریت بارگیری نوشته شده با پایتون Comment[ko]=Python으로 작성된 다운로드 관리자 Exec=@persepolisbin@ GenericName[en_US]=Download Manager GenericName=Download Manager GenericName[bn]=ডাউনলোড মেনেজার GenericName[fa]=نرم افزار مدیریت بارگیری GenericName[it]=Download Manager GenericName[ko]=다운로드 관리자 Icon=com.github.persepolisdm.persepolis Keywords=Internet;WWW;Web; Name[en_US]=Persepolis Download Manager Name=Persepolis Download Manager Name[bn]=পার্সেপোলিস Name[fa]=پرسپولیس Name[it]=Download Manager Persepolis StartupNotify=true StartupWMClass=com.github.persepolisdm.persepolis Terminal=false Type=Application X-KDE-SubstituteUID=false [Desktop Action Open] Exec=@persepolisbin@ Name=Start Persepolis Name[bn]=পার্সেপোলিস শুরু করুন Name[fa]=اجرای برنامه Name[it]=Avvia Persepolis Name[ko]=Persepolis 시작 [Desktop Action Tray] Exec=@persepolisbin@ --tray Name=Start in System Tray Name[bn]=সিস্টেম-ট্রে-তে শুরু করুন Name[fa]=اجرای برنامه در سینی نمایه Name[it]=Avvia nella barra delle applicazioni Name[ko]=시스템 트레이에서 시작 ================================================ FILE: xdg/meson.build ================================================ desktop_file='com.github.persepolisdm.persepolis.desktop' xml_file='com.github.persepolisdm.persepolis.appdata.xml' conf = configuration_data() conf.set('persepolisbin', join_paths(bindir, 'persepolis')) configure_file( input: 'com.github.persepolisdm.persepolis.desktop.in', output: 'com.github.persepolisdm.persepolis.desktop', configuration: conf, install: true, install_dir: desktopdir, ) install_data(xml_file, install_dir: appdatadir)