pax_global_header00006660000000000000000000000064136204521500014510gustar00rootroot0000000000000052 comment=055ffbb5146b41669d3ea867c2164d37d960a023 vokoscreenNG-3.0.2/000077500000000000000000000000001362045215000141155ustar00rootroot00000000000000vokoscreenNG-3.0.2/.gitignore000066400000000000000000000005101362045215000161010ustar00rootroot00000000000000# Compiled Object files *.slo *.lo *.o # Compiled Dynamic libraries *.so *.so.* *.dylib *.dll # Compiled Static libraries *.lai *.la *.a # Libraries *.lib # Executables *.exe *.out *.app # Qt *.pro.user *.pro.user.* moc_*.cpp qrc_*.cpp Makefile *build* ui_*.h *.qm vokoscreen main.ts # Linux/Unixes .* !.tx !.gitignore *~ vokoscreenNG-3.0.2/.tx/000077500000000000000000000000001362045215000146265ustar00rootroot00000000000000vokoscreenNG-3.0.2/.tx/config000066400000000000000000000005051362045215000160160ustar00rootroot00000000000000[main] host = https://www.transifex.com # Die Prozente müßen hier angegeben werden. Per CLI funktioniert es nicht. minimum_perc = 100 # Die Resource muß übereinstimmen mit dem Slug Name [vokoscreen.vokoscreen-version-3] file_filter = language/.ts source_lang = en # Für den Downlad genügt dann ein # tx pull -a vokoscreenNG-3.0.2/COPYING000066400000000000000000000431001362045215000151460ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. END OF TERMS AND CONDITIONS Appendix: 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 convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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 Library General Public License instead of this License. vokoscreenNG-3.0.2/INSTALL000066400000000000000000000017141362045215000151510ustar00rootroot00000000000000Requires: - Qt5 >= 5.9.4 - gstreamer >= 1.12.5 - gstreamer-plugins-bas --> Audio:vorbis,opus - gstreamer-plugins-good --> Format:mkv,avi,webm,mp4 Video:vp8 Audio:flac - gstreamer-plugins-bad --> Video:x265,av1,camera - gstreamer-plugins-ugly --> Video:x264 Audio:mp3lame - gstreamer-plugins-libav --> Player:x264 - gstreamer-plugins-vaapi --> Intel Hardwareenconding - intel-vaapi-driver --> Intel Hardwareenconding - pulseaudio BuildRequires: - pkgconfig - libqt5-devel - libqt5-linguist - gstreamer-devel Compile: - get sources - extract vokoscren-.tar.gz or - clone git repository: "git clone https://github.com/vkohaupt/vokoscreenNG.git" - change into the vokoscreenNG- directory - cd src - qmake - make vokoscreenNG-3.0.2/README.md000066400000000000000000000057461362045215000154100ustar00rootroot00000000000000# vokoscreenNG (New Generation) * For **Linux** and **Windows** * vokoscreenNG is based of Qt and GStreamer and was rewritten from scratch. * The old vokoscreen 2.5.0 https://github.com/vkohaupt/vokoscreen is the last version with ffmpeg and will receive no further updates. ## Translate Only **100% translated** languages will be added to vokoscreenNG. You can translate to anytime, your translation will be included in the next bugfix release. Please translate only at Transifex, it is very easy. https://www.transifex.com/vkohaupt/vokoscreen/ ## Code Contributions If you want to contribute code, you are free to do so. Your source code must be in separate files and published under the MIT-License. Every file must include the License-header. The License-header can be found here: https://github.com/vkohaupt/vokoscreenNG/blob/3.0/Third-Party-License/MIT-License ## Windows 10 ### Requirements: * The vokoscreenNG Player needs a codec pack. * I test with this codec pack: - windows.10.codec.pack.v2.1.5.setup.exe - https://www.windows10codecpack.com/ ### BuildRequires * https://download.qt.io/official_releases/qt/5.9/5.9.4/qt-opensource-windows-x86-5.9.4.exe * https://gstreamer.freedesktop.org/pkg/windows/1.14.4/gstreamer-1.0-x86-1.14.4.msi * https://gstreamer.freedesktop.org/pkg/windows/1.14.4/gstreamer-1.0-devel-x86-1.14.4.msi ### Environment * GST_PLUGIN_PATH=C:\gstreamer\1.0\x86\lib\gstreamer-1.0 * GSTREAMER_1_0_ROOT_X86=C:\gstreamer\1.0\x86\ ## Linux ### Requirements: * Qt5 >= 5.9.4 * pulseaudio * gstreamer >= 1.12.5 * gstreamer-plugins-bas - Audio: vorbis, opus * gstreamer-plugins-good - Format: mkv, avi, webm, mp4, mov - Video: vp8 - Audio: flac * gstreamer-plugins-bad - Video: camera * gstreamer-plugins-bad-orig-addon (openSUSE Packman) - Video: openh264 * gstreamer-plugins-ugly - Video: x264 - Audio: mp3lame * gstreamer-plugins-ugly-orig-addon (openSUSE Packman) - Video: x264 * gstreamer-plugins-libav - Player: x264 * gstreamer-plugins-vaapi and intel-vaapi-driver - Intel Hardwareenconding H.264 and MPEG2 ### BuildRequires: * pkgconfig * libqt5-devel * libqt5-linguist * libX11-devel * gstreamer-devel ## Packaging status * [Fedora](https://src.fedoraproject.org/rpms/vokoscreenNG): `sudo dnf install vokoscreenNG` * [openSUSE](https://software.opensuse.org/package/vokoscreenNG) (Tumbleweed and Leap 15.2): `sudo zypper install vokoscreenNG` ![Picture](https://vokoscreen.volkoh.de/3.0/picture/screencast-0.png) ![Picture](https://vokoscreen.volkoh.de/3.0/picture/screencast-1.png) ![Picture](https://vokoscreen.volkoh.de/3.0/picture/screencast-2.png) ![Picture](https://vokoscreen.volkoh.de/3.0/picture/screencast-3.png) ![Picture](https://vokoscreen.volkoh.de/3.0/picture/screencast-4.png) ![Picture](https://vokoscreen.volkoh.de/3.0/picture/screencast-5.png) ![Picture](https://vokoscreen.volkoh.de/3.0/picture/screencast-6.png) ![Picture](https://vokoscreen.volkoh.de/3.0/picture/screencast-7.png) ![Picture](https://vokoscreen.volkoh.de/3.0/picture/screencast-8.png) vokoscreenNG-3.0.2/Testing-language.txt000066400000000000000000000003541362045215000200560ustar00rootroot00000000000000 Testing language in vokoscreenNG Step 1: Switch to language vk@cvolker:~> export LANG=en_GB.UTF-8 Step 2: Check if language is set vk@cvolker:~> locale Step 3: start vokoscreenNG vk@cvolker:~> vokoscreenNG Step 4: Check all words vokoscreenNG-3.0.2/Third-Party-License/000077500000000000000000000000001362045215000176445ustar00rootroot00000000000000vokoscreenNG-3.0.2/Third-Party-License/LGPL-2.1000066400000000000000000000636421362045215000206360ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! vokoscreenNG-3.0.2/Third-Party-License/LGPL-3.0000066400000000000000000000167271362045215000206400ustar00rootroot00000000000000 GNU LESSER 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. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser 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 Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. vokoscreenNG-3.0.2/Third-Party-License/MIT-License000066400000000000000000000020511362045215000215760ustar00rootroot00000000000000Copyright (c) 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. vokoscreenNG-3.0.2/Third-Party-License/Third-Party-License000066400000000000000000000006611362045215000233210ustar00rootroot000000000000003rd party licenses used in vokoscreenNG Qt: License --> LGPL-2.1 LGPL-3.0 File --> LGPL-2.1 LGPL-3.0 URL --> https://www.qt.io/ GStreamer: License --> LGPL File --> LGPL URL --> https://gstreamer.freedesktop.org/ Global QGlobalShortcut: Licence --> LGPL File --> LGPL URL --> https://github.com/Legotckoi/QGlobalShortcut Fallback icons: Licence --> Public Domain URL --> http://tango.freedesktop.org vokoscreenNG-3.0.2/ToDo.txt000066400000000000000000000067401362045215000155320ustar00rootroot00000000000000 The ToDo list is only for the main developer and serves me as a reminder and can change daily. Release 3.0.1: --Eine oder zwei Wochen nach dem Release die https Weiterleitung aktivieren --Nach der https Weiterleitung wird die 3.0.0 nicht mehr auf die Onlinehilfe zugreifen können. Windows Installer: --Installationsordner sollte unter "Programme" abgelegt werden. Erledigt aber nochmal gründlich testen. Windows: --Player: Schrift in Tooltip kann man nicht lesen, Weise Schrift auf Weißem Grund. Player: --Im Player sollten ebenfalls die tango icons benutzt werden. Windows Systray: --Icon für "Weiter" ist sehr schlecht zu erkennen. Linux: --Bei dunklen Themes ist das Icon auf Tab Timer schlecht sichtbar Update Meldung: --Notification over Systray --Realisierbar mit QSystemTrayIcon::showMessage Linux: --Installer erstellen Homepage: --Einen Menüpunkt Features erstellen Allgemein: --Temporäre Ordner in /tmp sollten nach gebrauch entfernt werden nicht erst beim schließen von vokoscreeenNG. --Betrifft nur die Hilfe. Windows: --Für den User wird eine sehr einfache Update Funktion benötigt. Ein Klick und das update muß installiert werden. Für ein zukünftige Release muß zuvor folgendes abgearbeitet werden ================================================================== --Onlinehilfe Deutsch --Onlinehilfe Englisch --Mit Transifex abgleichen --In Global.cpp Version ändern. --Auf dem Server Inhalt der Datei Version ändern Bugs, Features und Hinweise aber nicht wirklich wichtig ======================================================= Timer: ----AM/PM Interface: --Schnittstelle für Erweiterungen nochmals testen Player: --Skaliert das Video nicht im Vollbildmodus, wenn eine Aufnahme von einer hohe Auflösung zu einer kleine Auflösung skaliert wurde. Beispiel: Aufnahme 1920x1050 --> 1280x1024 Abspielen im Player im Vollbildmodus. Skalieren: --In der Combobox fehlt Benutzerdefiniert. Übersetzung: ui->radioButtonScreencastFullscreen->setText( tr("Fullscreen") ); // QT Creator sets an ampersand, translation now here ui->radioButtonScreencastWindow->setText( tr("Window") ); // QT Creator sets an ampersand, translation now here Mediainfo: --https://mediaarea.net/en/MediaInfo zum Beispiel zum auslesen der FPS und weiteren Infos. Player: --Tonregler ist nicht mit Pulseaudio-Regler z.b in KDE verbunden. --als seperates Fenster --Einstellungen in dem vorhanden Tab KDE Area: --Monitor ungerade skalieren auf 1.1, 1.3 1.5 etc. Buttons haben transparente Linien. --Der Fehler tritt auch in anderen Programmen auf wie zum Beispiel in Kate. --Dies ist ein KDE Problem nicht von vokoscreenNG Screencast FPS: Mindest FPS wurde in der GUI auf 10 erhöht. Folgendes könnte noch in betracht gezogen werden. --Mit h264 und 1FPS erscheinen Fehlfarben. --Abstand zum nächsten I-Frame verkleinern? Bei einem 1FPS wäre jeder Frame ein I-FRame. --Abstand der I-Frames den FPS gleichstellen? --Buffer einbauen? Systray: --Menüanzeige ändern auf Linksklick. --KDE Icon wird erst angezeigt wenn von Automatisch auf Angezeigt umgeschaltet wird. --API anschauen ob es evtl. durch eine Messsage möglich ist das Icon grundsätzlich anzuzeigen. Suse Leap 15.0 Gnome: --Camerafenster wandert beim entfernen und hinzufügen des Rahmen nach oben. --Keine Lösung in Sicht. Tumbelweed Kamera: --Beim einstecken einer UVC Kamera werden immer zwei Geräte /dev/video0 und /dev/video1 angelegt. --Dies ist ein Problem von Tumbelwwed nicht von vokoscreenNG Spezialslider: --Mauscursor nicht stimmig mit Handle. vokoscreenNG-3.0.2/Videos-to-test-the-player/000077500000000000000000000000001362045215000210135ustar00rootroot00000000000000vokoscreenNG-3.0.2/Videos-to-test-the-player/scaled-450x800-to-1280x720.mkv000066400000000000000000006361311362045215000253560ustar00rootroot00000000000000EߣBmatroskaBBSg<-MtMSIfSMSTkSSCpSMSSkS;(STgSIfss)T_?NҽA*ױB@D@LMGStreamer matroskamux version 1.12.5WAvokoscreenNG_2.9.9_BetaDaG!>Tkׁsň5u#ツbZSnVideoTT㆐V_MPEG4/ISO/AVCc"g(  @@@P(`hﱒCua H "g(  @@@P(`hﱒEH, #x264 - core 155 - H.264/MPEG-4 AVC codec - Copyleft 2003-2018 - http://www.videolan.org/x264.html - options: cabac=1 ref=1 deblock=1:0:0 analyse=0x1:0x1 me=dia subme=1 psy=1 psy_rd=1,00:0,00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=6 threads=4 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=1 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=0 rc=cbr mbtree=0 bitrate=2048 ratetol=1,0 qcomp=0,60 qpmin=23 qpmax=23 qpstep=4 vbv_maxrate=2048 vbv_bufsize=1228 nal_hrd=none filler=0 ip_ratio=1,40 pb_ratio=1,30 aq=1:1,00Demw?v;Όd4Xpg^#j14мT`"\5Ӂa3;ZBv+Cd D%z"f}. +@O F&u y 6ݳx.5IaPO>SVf_!ӼqxxSb1%qчP0-xå__a'8Z_M@NAnP7dnPY%Y)Eʥ/c7:]A.}sQ>O a>Nw U^fVL]9Vj)n- oEV~Wѱ,|V|"ihV|銃MxR _n _O$1=Z,ULx<)wn\3>@p   j\"+fFl먕 94_W ecIɗ8aܟ_!n{R^LF;-i:~!(4jIAeg oZRW>"XHޡ 2mi?Qgz>Ė;;t&ڂ|#ےouBj9u_ cƸ:|34&$ g!(;4Q8uQQmhy}f0bVD.CxR$4C>'$]^@Zst'p3 iZW/g]`L:[P,*u5'Kvx`êԻaUI4} 9N5u;q% bDEbsXP}5c6I} ͟,hdzp'R{%c:ftB{ `VY\WRl4.E3^+*S <*jWe#} B;U{IZFоX TnQڲTa>P#N*n#孆_Q採)⺚ OYs๔( P/ɚ9HF558듘'7m2#s#@9ܙvKǮI{8]Su]"y-YA&5a!_-cˊ7t\cC4,w׭4[uÆ\s.q 1A!-!ű*x%n{IZ.1G3xq7qUlCy/yfg@†}! 7Zf:OwtQwDғ"VE@hىFO3v\67D.LblIa:vQxz-]kB=u͚Dq/UumWS dARWg v'y *y{?tiRHo3ɻ{u[|\N5`si )&ԫȬqQO#?J Nf5C0R):I1{=߅#Ou׹7"OI4gL1v6č;[.=-sPNM8zCܲ޾lZt͔]#%m>L!+ 3 W6VƲ/]lyGn|SX2.4aA\~!qX:+}cݬRȫj!@oda6wQD 7Nb{*Kρx{VUL5l&r-07܏tzq QvZ. #5VM5jE * [L!C"fؔ=I^qT,:o] qKl(3`x:3b}'v>ES埓VDÁ&s,o4g$80S&pI gxC]*0h^K4Ets{Nv˓J)/4}y\. FT'PY=1r]ǃA,273ѐSXdY٬֒k*M ֤]|t۔VGV.ƔTQgZ\0eG=Px: jPa%{c>90 X¸[]. W1h^ xD}(Jp?ஓ,bK/|c՜NԹ,<90Z`^|3752?! Q?b’Klf3dfs XXns(Iѫ̿;3Ic)ZeW)PJ?BKcEp"~e5Ty4y7 5tJni4 I 8/AҪ0NJB06:Fkc:[\XF bWjzS?:s8\!)LtgC/p TOv&@v`Pj)H5j굧c -K,@&nP,RvX/zНWUB!}F b*PM >0G^B( 3mFS[7S%js.u]L79W^~/猐V\Bg*tԗmvuwB%k wGKD^PCrTLrQqٱzUl_ڏZ4b(ǾD|2cL7d"G4ݷ~P$N@(ZyFO J_*μv{W:~PQ3ߐϱaS=""o;Zv;d5wy,EIAtw'Υ"/nXyVwۮ%nJ2@SBA,h]?Y4ZwLDouޢ!#6DR^ l;VMHgE?2!6^I.*D-^zI_dBgU-RFW }j9ëǧQVM>H~[D* 'йc`dv}1w> U1l/48A=Zv15i= y4J{?,<2rie|(&J2YCt=sX{Sc=:D&~@4ղAdLssذ,^Mpa2 N2=?F쾐t"ZF3& Jʒe[̘5NbF1GQcФ6 `8tNK\dtk} u\D <kIċfGZաQ)f@׎*nީH3vb]f#dH s;gPRx?>ƥNB4Ae!i|'L^ Rܿd2xEȤ!^o#|B!݉V]kixcqY)NL?r## \vٝ@ÅH!@!2%Z f*u\]d-6Š%!̯dj[; ((@"TF>Ӫ(eئxi,դ u?~=D&E((.B#]`.ի aUO # AHtGa0nȱ?NaM7MctVӃɹ e(Z:/! F%\3^ ^/V?/%)H;FBƅ@g-"k6ouC>gfxo6XblO2پo][eV`"Ӣ1 \L/ר@T{LH~8PGpݲ5܊Y^,EdECО{p01:7QE3@Fr: _b2Y{Ux # 2Mgf4 MebiW@ ľ$//'px(Bmy3m|&_[_}U*}O"S_6es3:{zGʐc\_ڟ*o%dE/1(J䱐k(F$Z=֏/Pnhcy wbfr oߣ.vWWvmO,˻=VJ+i]^{ypf w߫a Q2KndI}NV6yowⴎopMjzƀ@ !  ax` <\29)lV֑nnI^."ܭ|MvpT˘sf/&a®UK5侀$opsc*aKjopj}&IKB<Pި!Ok MLD5f}P|=UDqovoV]˅,-lttX|4u2Zl 6 ֘]^גa!s>vXLߡf"&r<©\D ,p6EUIƂ3" 0+J,4aU{4(T**Am;!=kpMxV&(Ä4@7VQ9Xjc+*jBΟuZy3pE S6I m2ҟAWC7H"DTr~x sNBWR3r ! 媐K{"oSBG5AmvƄ֐ؑ/Н+eQ[@q+ګ_h=3q,?QM8,ir18e'mJH}PNRڞR`ɥUCsڐ=fiAJ@":LՖ_=7"3\ MT})EHY(k#k/dJyn[#íFk- X5߬)n[-X,gC+86}4:;bPUv|{ˁmg8WdŪv_9&`$+%@^ <3 ̢JȯiĴߒ]FR:A%;Vb:;h6|%A [wiu;Rp9~,hKH}N[SH2"{++9bN Vd`rڛ^1؞6YJs< Ֆ˧LʟN!ϩܵ.Y D R--ލmc >?ڤD k 8./:rRTxPO08/IO׋{d𜤲{NΩ!w_yH"%e.XKA2ѹB1ݷ?Vx}N9=Ja TϪhI%߁Eb]A]1`}h=hXolmf)X[8iUFy7VZ>T3tQaׅȈN(*dsC=,X7> TjsԠZEx#clפ-dv7Ot4^Dv6Iey=U1xϒCu@%XG,. 0& GVbcCa(y!&}$%Qb]h\&$f=˜}T-R;7}&2=oݨ'hgy*O`>tݰڹqk SlxB@mӾӭ2a!DgOR8q򗃼DQ8zqZ4w967t Eg$ u)DI)iO-9~np}):7Be+cc&[Hiw ;>la_dg?WX;=:.m_CԟSd֑^Dl䯧6ɟĖ7+!Z/r^+)J 8g j| lOg*{ u`h ?);7 ʡt /, :B 7ecU=5|Яw:zv;u>/d3ZAhrWU!֊(L6uRUZ-0\6aE< L1,'sSdžT$lI wu@*Fλ1lc"pkX{ՓOGf6 ?01˱FQu!c~ɻA"Z,]zӵ^ l-1s g9.\DV ;YRc%/>;JV$I xL1~d+&5R3gݢ ]܂wTU?tΤ%>RhN2Х%"#WLo}$+H@u!Dg2[l @B*Ԩ hܔYDgځȉC.%Z(ρc-7]C p#pz0EddGK Qn'23QdAǞ7؀Ӡ픱H+صO(K[YY TȚkFнRcCPYGtyW..ٱnSsUR/QnPOf%Ru_+54iH:DNIg*Er,](:6t>'jgV[#:8}MA{fbO0ϖl [O"33{%g؎D"xcsB2SsNd+x y{ӕ(:KK_qKtA, .-.4oQKuqe;˃L:QxP[}dzڲ%̝5 qo![$˚ ] D3oK Ѧ = jyKfVHo5;&R 9vd/ͧwfL|q EcVWME9C Y6২u w wMbZo)_l鷾{`>;u}0 U<ׯDVbe"݊0huY ^wqtAZ?8s o~?16aK 8Ywޕ= $ 4ܭ0wX<8imQp\kU"[pk w^F(m>%-Y7F}5D2{$ś yZGsg}JnG,F58'yKlQ 'FnjsEn/V lݺvZ0O'X9,FEèV oXJEpq@re%V"d9$RyDUBmϭbk+bTk34U?zC&{5ZEPd*]뼰y3VB}"J/B͌E~3xq1@ne-_$1<lm#>[4˕g(YO-ddqŠ[`M^bj+ ygJDq̸w}QaلIVWߛFXk:pR4ָ<7 ?J='P1$w޶lΔ^m(X}8!:ܰ Pmc{)WV t`Ղ%S|n0"yjQ`9'|=tAP,=LFV{f mR= )4ʮʺs~jBy 10nҢ(PϕԒTQyw/kGxt)VAq$;12jWaH:n0T~.TXx}D078nξ_B>_k$\ n$gE?MR U I5bKBx(7h8fm~,窱hC8d@j۞ ƕXL"h;!,IVc$W;'#Alye;"i H k21(҉` C*mDP-ŹnK>HlK{)rMn˂W0-1Z t^۱ߥLŸa RCX :Љ>k[:rsl4@1> 0rՈ ͡ʨ HloGikc̒lM8e?gT;-4K]^[Ȥ8iZT\[M׀vA_[D܌!\ ]Q䋋X+XkddObhFn:% FyGoTYfqIrUuo+z !D?QHGm'rs>| hbCP;lnnN:xjPfk83LBUÛۉ86 6o}y:^e kb_e$No[mEޝ\Tמc'D-gPQ3)8cy6|6/G JYB874!ښfP|sկNtD;%7R#K]]/nК5sΚSpl0X|6yobEҝf= tN-f^%qN}y4%4:Vd8V: j@~TM.P3et ru Qp8&)W=Ol*)! ƁKyn2Hõp|EKAV":}2>tcŷ mn~~ ij>u#oo",5~ դѹ|a3wJt+,HL_*GB~g!bLl/Ʋ6-@0-vtlluեJ\܅D9mv*ځn`uM1i/|Y sS4>sz?aVk$?ߜOud<Deؾ!#$UZp!GgTy ITQ*uk."tHFjDݐI߷HO >M"ca%@"ܑ;` +6"^(899 i$HJ`25F'ak0ǚ=1?&w NgF$_鎔I aj [ _V&x? ˜5iZAdKD( Oy%ukN㓨(Y[b;]7um'J<$IqY=% 2BkAW ʯ2RB1{oU՞D)1thF䋡MƵ ?:(]ZN,/ '#{SgI' % j*/ô`@/\R*){:$51r uHj߿[zg{_EʇjA^7Ta_"2#Q]hg@_) ^o%F;~AY_1k2:ehłॽ@PU]orXR"P6\n!XOROM(J;}RuYاx?36 *";(?!htp59 gH? /7%2Wj< ʷsQ_VG.HxHDJTΠ ÇRȘS; *z*ȨШqXs\8@r=p.]"8ne (@P3/Ӡ-tXU߻{Qwj_iL^HZmG"o2p<&Sv4Hk*0 `X}B>pCT?JZRUKMq·#ӏ'0lRoUe1soچagdu 5'S1;a tgqH3x~+ԕN3 è8}b0p3p`&1$ZT+Oqz[<栺W2daڬxV,$Nq-|@[}WJ!= t' //?V .ؖuF]Ak-Xb4|mxp\>^Qs*JW0zl +@g>d&G*LJ_΄mu;Ș[^žGiFb7J:t`4բZ"neD)zƯoI_gjLΥ; ?+_`N闺aw*QLH!Sla*{pPN]J~:9z{i .SԨe.6fd'$.d!KYʈ\tr}N9)эeĈۋ2J]xkWzcYc`H݄ngsQ9h:]7JWqKӘW3$=P+U(qyo6=hOYD +\)Gq{ ~8h̯O$>O˳J\EF+sц[2u Bz# oq(Ӯ;BQ(:c+vVZ%ݢN8hT)E[m8Y 2^:Poi ݑ+ԍ1#]ȝVT5(fFuE+}^GtF1?3R;wC(,cN"iU@r_0L:7(hfbڪx$y6"lSEd[;fRH|DC[Nъ[hf,GXr1yVW0o {Y| =; SϬrߗZ#}k5`dMȽ+JMNT{Z~0^dǟP>t!+(*|դ`2y>50VAˑO qP˒,!\ _:FvPUn6T!Oawc6:zTjNcs3A>ꨜ^N¾|3'הUW=(GQpH!?ԴlɝQ)M۠=W(-x ]&3; _%p:%z?N-" Xħl & -jOaijaD?/iCc(3ƒWrPٓ.:Ҁ9~AVgqn型,='iٖ=EY20xuщ d̮q!$jÔb,!paӄx$6戌AxP \ic_qaH4{fsAX# 1̫1SYIwmV)VdEM=N?BlgWIu6C]μВ&=ו"X# 3b;>TPx,Cv8@T`.@~M9ҼpUjow`? [dtDCre0N*| $$4.pAZmG/uy n sEJ 䫏Ub3!*GNsw6c B" ! `o:rGחѧvTk߆yqbc{SYv@FA@?!sUhhFw1Ӵ[5 LfT+ޠ|LOś|(ԥ_l'%<ܮLi gqh1X';'FݫvS9xc6RH5ĵ9hE*\d{fD]N_<ﯔ L To^?U:Oh zz5.&P~kϵ=Zz b/>F0pd0& CK:qvt;2wǴA"9l(BH#H'pC`!9z h˄{߲_%7_]FzA|^WF5h5gDJTfEeY@'Uz:v~r 0 D(g˘T9R|b\nۀl G/%`ClFs%3n@)!jCNR7Űwt0t|uay ӧ(\v*~e.,"^6# E Bf̓F (^[4[/-*I3uDUS!w@$PiEfJVtvC"cZ pb3]U2zSb+7k0Vaf$",yki"գJK}x=V9  ۽{rBXXdg6wP vYs;C#,מ;4N/>AYNfUב$?fBr]E~0DC+ \)@Jbu:dٟ}Wkx#RDA&l9n(Q͹VY'vHyӋT_|$ѬMޥOM4g 8ϏK>& hه,7g ǰX <q%ٿYL =Jb]sN2hݦ䕼F-X BGOn줼›ll΁.BL4!bfTۇUMD~M/pq.V%ϐgSo)JL^^gUOicKf(hʰ<58E0_X9Hf a L,}a2EBz ">=Èu5玠j|n:F%K0+_TIPkQjn9<Œ8CaT$k0Dޥ(\?nSC@HM h(Wdd.44bp1(Xq>Ljq\I޽'ATQfGo;+\ V^ +^%(h׉pĮt)z%HxVS:?+N MpYw܁h GJY WqK-j(noFI:l٥nЮSv#!aU܏TX"$.zG/+ʤ3tZa6T> ɣ3MZx F%*`Pt$"=zіb4BSB( 7czof ;.cp'iD1#^svSm8[GjA#"Ģ &Y~x@bg!/=]wH%`ZuU?f͙Y. &.gS]"-2#@b˘ԁn{nW4E4|Cł;;Ц޳zBGߨJrTM4 ew90b+#и"br Bc'IěsvүI~\:C+=}1TDRtinGoc%T0iƄ(K4Xdb2yEt,{AghޯkgmtjS]dp D5[|tҚ1\]91~ ^րm*_S)q}4hC1lLp|#oT;e2z E!)ZRREP{;σE5G4fs5{0ӯDs v+lP޻\)8 5 $vT) g;GUXTt@qཆ\$z" B3@ 0xA$ґ ~wuKܙKBg$% GH T+>PT<`x,yy(H;U"OLIƏu츊C[h=m&` P P,ABBjF8,v́( P>aDjHF3Y)~OÚTlZMWimx P!cD<1S@ 0%Ah4LO Jq P#AE,<1S P!D<1S P!D<1R 0%A4LO Jp P#AE,<1Sh P!D<1R P!D<1R 0%A4LO Jq0 P#AE,<1S P!-D<1SX P!/D<1R  0%A44LO Jp P#ARE,<1S P!qD<1R P!sD<1RA 0qAx4LO JJ5JlÂF'Ўg]bb'Ҥu1`/}"AA* X:Trƚ9F=m "ɨ_A X>nOvϦ$NK;3FlڲV;XeI9ނsfbƮ4Μ&qW9b5Y#*$ݮ;X# h :2>T-+ACLVch#oh%ѵhcOKl64⇖eGwbE̦p)>/rD,*{a;,q!#tD Rd(8᣺p P,AE,<1]:'+}`H P!D<1S P*D<1* {lX_A` 0A4LO JCS CIGl3WBs6-^Ir44R,?15M @.]vkfQ.'ScW…)`[`D oarAzpjZrmi-.'NcnĶnP/M# &GYaG܅]1f1Eh^kb8tpgVY P)AE,<1Αt)A Oс PCD<1Nhr^ 16M= 4__ ദ8 P%D<1[? 2Xف 0)A4LO Jz(󣱁 P#AE,<1R P!=D<1R P!?D<1S 0%A$4LO JpP P#ABE,<1S( P!aD<1Rx P!cD<1S@ 0%Ah4LO Jq P#AE,<1S P!D<1S P!D<1R 0%A4LO Jp P#AE,<1Sh P!D<1R P!D<1R 0%A4LO Jq0 P#AE,<1S P!-D<1SX P!/D<1RA  0~A44LO JJ|G(]>2 ^w9y9 !8G0ԡFJ R{3op^". Dbdꌏ4؆aōڷz^$TTzJj`F_ޓl쓈-CͥI^&F:d"<%@ܴLUAxjl]V,a fBCTXoTO@Lu7Yi,lئpl L϶Y>ƖȻ ºe #.pΗ7Cp2=!0NU| #f:v=0]E5_x.6![Á7j $i7 [Nf|qTĩA諼ۇ5sF[g5#ɳQ&XCYG 6/QSTTD9Tyazwe<(aY)b-|ҫ\,:On0WD|-{ZP ~UMj@*N˾l@  PAE,<1*bHǟUL͕>Id.DhjB wrp] ҿ/G (M9K1]`\dJ?P @ h PD<1>fi#,߭äl'X}xxm&eʪuC(#5@Hfkd5iX17hοGg]9ޘuBt0}U54ZQ!>cԩ^  PfD<1P 1HCYԯS%p+J9H+Ns΁6 (3ٙ/$p  04A4LO JuW-7d64'O\HC 0 P#AE,<1S  P!-D<1S X P!/D<1R  0%A44LO Jp  P#ARE,<1S  P!qD<1R  P!sD<1R  0%Ax4LO Jq p P#AE,<1R H P!D<1S  P!D<1S` 0%A4LO Jp P#AE,<1S  P!D<1R8 P!D<1S 0%A4LO Jq P#AE,<1R P!=D<1R P!?D<1SA 0A$4LO JJD5+&Uy!JUff4I\ythM1Jp=s\\'&MLhVg TUq5̽S/I" C5:alM,(n1Nck_ )FE&Q}jq>%p0'őT`9Ph5 %3ieH)ļ@킛BۘPg2 xWN;{5xUK?3 ơ'諡J.N+.Mc\+Xs:2cW1HdnyuvKݲLIa\D-ʊ.BhuD'$]$X_O|WU0R|34|AYa"̺.Q%)szEࣻP P-ABE,<1Kj3,U.!( P!aD<1R@x PscD<1X1*9Iu}DEn\5RWCE\)/|:L=,2ʼnB4ݨz-}Ǔm ͡TaっӁ@ 0EAh4LO Jcv::J<_OwOHXGcq; 1 P4AE,<1^y9o=¬5 ;0ѣ P#D<1^lu6っ P!D<1R 0)A4LO JDΎ㣱 P#AE,<1Sh P!D<1R P!D<1R 0%A4LO Jq0 P#AE,<1S P!-D<1SX P!/D<1R  0%A44LO Jp P#ARE,<1S P!qD<1R P!sD<1R 0%Ax4LO Jqp P#AE,<1RH P!D<1S P!D<1SA` 0A4LO JIƯeV A^ >YFO_>%+Hq'vms(Wd1mVfe)oU_m7ğ|dn9 aUw̘9j~my$<<5a+EV5p$>sy(, ً1-\[]lz犙p`xՉLiu0rD%tv!Z$#c*t3晕Qpt?z?$}.羟+ Cm^D#f[ Y ռ 2, x#_%m-:c:`ngqeAyLy7 O* j-Rr0[i4:=ƕcEL|_*d~/a`:՝Ռ`$qV P0AE,<1aΛEPh;60 P!D<1R8 P-D<1aΛ0p;M+F-?A 0A4LO Je>g-2~g)0bN}{l\]tƾ*eQ3fc}~Cs@I I@>.]/4!zE45d][>ro"C0d['Z ৪sw$Pfc2@ģifJ~esc\XL(ۡ%L$P}>bPKgϫA/wƁ P8AE,<1᭎,W:h{" )#j@ P$=D<1$  P!?D<1S 0,A$4LO JfLw~afVnڣP P#ABE,<1S( P!aD<1Rx P!cD<1S@ 0%Ah4LO Jq P#AE,<1S P!D<1S P!D<1R 0%A4LO Jp P#AE,<1Sh P!D<1R P!D<1R 0%A4LO Jq0 P#AE,<1S P!-D<1SX P!/D<1R  0%A44LO Jp P#ARE,<1S P!qD<1R P!sD<1RB 0Ax4LO J? 偷wNʘ+gaOHIN/ TG-6Q~4Q k2L F_Tc肥Dl}bZa4#fU͑|!]-(h7>1A*,2z}[2 @bϗohj<GX)GVʖiS{:-L{n ?)pDq1գ #,*G޿)_*up ,*ߑ*qy5NY*owb%f?:?ȹ镖&}]3.˯9̭3`Ngvҫdɞ3d؜Y 3!l2=6>@VQ@"hkͤSkpS4kl)>fUPjtR:JmTtgڢ*3[c-m3r6|r Vۥ:fѴu!poFbۭ5 Үq\R=RH;d1p P^AE,<1tu(K{m 0:Gsz,|/mk/;D_ǂУ@H P|D<1t7FSoB&\xˣ6rx;]x?_M4H)Y_RQ΋MEaq >iO?F%-w+@7 P&D<1 dW#` 01A4LO JdjO[h۲m h P#AE,<1S P!D<1R8 P!D<1S 0%A4LO Jq P#AE,<1R P!=D<1R P!?D<1S 0%A$4LO JpP P#ABE,<1S( P!aD<1Rx P!cD<1S@ 0%Ah4LO Jq P#AE,<1S P!D<1S P!D<1R 0%A4LO Jp P#AE,<1Sh P!D<1R P!D<1RAՁ 0A4LO Jཹ 5*@0%>u׌k:#U;N qik% _dUr&6 k=C4oHS|zs/z=b]co5*7^g^N}$E'" ra{yKz)]Uе_B5,N{D`m!4XVj^3DD)^. ElE6j|3> kcxӮ'vܞ6Zdy uNlU4ݐz>g7!iit}3Q1"ut~FOgܧkj &.𛐖?.tUnj[7pHu7ZxcoL@Ñ1=KVƘWuض ;?1ppzpUI0 PWAE,<1tqA5he>UCނ+.e0Nu`js#JXH@ P-D<1z!"҈siRxe^Hݏj oAVLNj[%`5+Kb'&}ҧ{]ͮ NaLk C~1e1<ͨS ֎ٹaDJ @X P/D<1~>tO6{:ר+&ŽUl 7wFɤioe.xT 3|y8楳`fП:!'rM!n>o2&O[5ށ  0PA44LO J@=Vv?Up@pca0v8w  P#ARE,<1 ]1 P#qD<1eu6Ԁ P%sD<1gx^'A 0%Ax4LO Jqp P#AE,<1RH P!D<1S P!D<1S` 0%A4LO Jp P#AE,<1S P!D<1R8 P!D<1S 0%A4LO Jq P#AE,<1R P!=D<1R P!?D<1S 0%A$4LO JpP P#ABE,<1S( P!aD<1Rx P!cD<1SAց@ 0Ah4LO J:U|tFHZaA^ TKzQ&B+R3zT[Ԛy %*\Qԅ'4TAWVPO m *LH4e Bumrb­(0O׉ "Ira[)q^ :cCX$ |*5!-&Us, NH$᣷ P)AE,<1`Br P%D<1ۢ( PaD<1{d` xd @voW)dԓۆ7`nkZ ҍNk83DVpˊ&`Ё 0BA4LO J哮OğCȆQC ) nwк P%AE,<1hlu6ρh P+D<1h`Kž;vk] P!D<1R  0%A4LO Jq 0 P#AE,<1S  P!-D<1S X P!/D<1R!  0%A44LO Jp  P#ARE,<1S  P!qD<1R  P!sD<1R! 0%Ax4LO Jq!p P#AE,<1R!H P!D<1S! P!D<1S"` 0%A4LO Jp" P#AE,<1S! P!D<1R"8 P!D<1SA# 0A4LO J{<~ ]}&Lhfepнjۖ6 dB; yzM%Ҷ84I:Dm"6_\3V 2Ъ-5740$ Pc!K %?3 (4x)AKYIwkuC;k6 i*^ W+!9t`|$#ٚJꡙW K]%I*Qq_6*1Z`6;?슞:{~n} ir*XTk̟,diFVlhI]MC\g¥V}˪l#RBJg.vkqT",>it$WER٬L@" P*AE,<1jO([Y8`" P!=D<1R@" P?D<1{(#s/~^.3FmMmYj {RY3Z@f>XH#lJsY\vn~f1m.+_Cg}=ڻ Cbr,CA&nλq|3԰*6Q56T@# 0A$4LO JDh̦TVѨl~A^jE6.*5V^ ZWL6IV+ES"h4e3dw Ȍ5eT MOJkk,P.;99ݍ o>)oK4`#P P0ABE,<1paFwC(+\`=Q#( PoaD<1{+@7HnaPnE^+{ POlG"\Ql3B=-g !9pS GnaiH8mУ#x P)cD<1j͘0s=0$@ 0%Ah4LO Jq# P#AE,<1S# P!D<1S$ P!D<1R$ 0%A4LO Jp$ P#AE,<1S$h P!D<1R$ P!D<1R% 0%A4LO Jq%0 P#AE,<1S% P!-D<1S%X P!/D<1R&  0%A44LO Jp% P#ARE,<1S% P!qD<1R% P!sD<1R& 0%Ax4LO Jq&p P#AE,<1R&H P!D<1S& P!D<1SAv& 0hA4LO JKJC؅d *[Fs; >72K)2Xc%9)L0)H1:3Vy.+S/|˜d^(CJn$sJ@S[ hgH!G?|Ze:l@Sjdjuzd\ٗ/3<b♙H=uN؈ݠ&Zu #j14мT`"\5Ӂa3;ZBv+Cd D%z"f}. +@O F&u y 6ݳx.5IaPO>SVf_!ӼqxxSb1%qчP0-xå__a'8Z_M@NAnP7dnPY%Y)Eʥ/c7:]A.}sQ>O a>Nw U^fVL]9Vj)n- oEV~Wѱ,|V|"ihV|銃MxR _n _O$1=Z,ULx<)wn\3>@p   j\"+fFl먕 94_W ecIɗ8aܟ_!n{R^LF;-i:~!(4jIAeg oZRW>"XHޡ 2mi?Qgz>Ė;;t&ڂ|#ےouBj9u_ cƸ:|34&$ g!(;4Q8uQQmhy}f0bVD.CxR$4C>'$]^@Zst'p3 iZW/g]`L:[P,*u5'Kvx`êԻaUI4} 9N5u;q% bDEbsXP}5c6I} ͟,hdzp'R{%c:ftB{ `VY\WRl4.E3^+*S <*jWe#} B;U{IZFоX TnQڲTa>P#N*n#孆_Q採)⺚ OYs๔( P/ɚ9HF558듘'7m2#s#@9ܙvKǮI{8]Su]"y-YA&5a!_-cˊ7t\cC4,w׭4[uÆ\s.q 1A!-!ű*x%n{IZ.1G3xq7qUlCy/yfg@†}! 7Zf:OwtQwDғ"VE@hىFO3v\67D.LblIa:vQxz-]kB=u͚Dq/UumWS dARWg v'y *y{?tiRHo3ɻ{u[|\N5`si )&ԫȬqQO#?J Nf5C0R):I1{=߅#Ou׹7"OI4gL1v6č;[.=-sPNM8zCܲ޾lZt͔]#%m>L!+ 3 W6VƲ/]lyGn|SX2.4aA\~!qX:+}cݬRȫj!@oda6wQD 7Nb{*Kρx{VUL5l&r-07܏tzq QvZ. #5VM5jE * [L!C"fؔ=I^qT,:o] qKl(3`x:3b}'v>ES埓VDÁ&s,o4g$80S&pI gxC]*0h^K4Ets{Nv˓J)/4}y\. FT'PY=1r]ǃA,273ѐSXdY٬֒k*M ֤]|t۔VGV.ƔTQgZ\0eG=Px: jPa%{c>90 X¸[]. W1h^ xD}(Jp?ஓ,bK/|c՜NԹ,<90Z`^|3752?! Q?b’Klf3dfs XXns(Iѫ̿;3Ic)ZeW)PJ?BKcEp"~e5Ty4y7 5tJni4 I 8/AҪ0NJB06:Fkc:[\XF bWjzS?:s8\!)LtgC/p TOv&@v`Pj)H5j굧c -K,@&nP,RvX/zНWUB!}F b*PM >0G^B( 3mFS[7S%js.u]L79W^~/猐V\Bg*tԗmvuwB%k wGKD^PCrTLrQqٱzUl_ڏZ4b(ǾD|2cL7d"G4ݷ~P$N@(ZyFO J_*μv{W:~PQ3ߐϱaS=""o;Zv;d5wy,EIAtw'Υ"/nXyVwۮ%nJ2@SBA,h]?Y4ZwLDouޢ!#6DR^ l;VMHgE?2!6^I.*D-^zI_dBgU-RFW }j9ëǧQVM>H~[D* 'йc`dv}1w> U1l/48A=Zv15i= y4J{?,<2rie|(&J2YCt=sX{Sc=:D&~@4ղAdLssذ,^Mpa2 N2=?F쾐t"ZF3& Jʒe[̘5NbF1GQcФ6 `8tNK\dtk} u\D <kIċfGZաQ)f@׎*nީH3vb]f#dH s;gPRx?>ƥNB4Ae!i|'L^ Rܿd2xEȤ!^o#|B!݉V]kixcqY)NL?r## \vٝ@ÅH!@!2%Z f*u\]d-6Š%!̯dj[; ((@"TF>Ӫ(eئxi,դ u?~=D&E((.B#]`.ի aUO # AHtGa0nȱ?NaM7MctVӃɹ e(Z:/! F%\3^ ^/V?/%)H;FBƅ@g-"k6ouC>gfxo6XblO2پo][eV`"Ӣ1 \L/ר@T{LH~8PGpݲ5܊Y^,EdECО{p01:7QE3@Fr: _b2Y{Ux # 2Mgf4 MebiW@ ľ$//'px(Bmy3m|&_[_}U*}O"S_6es3:{zGʐc\_ڟ*o%dE/1(J䱐k(F$Z=֏/Pnhcy wbfr oߣ.vWWvmO,˻=VJ+i]^{ypf w߫a Q2KndI}NV6yowⴎopMjzƀ@ !  ax` <\29)lV֑nnI^."ܭ|MvpT˘sf/&a®UK5侀$opsc*aKjopj}&IKB<Pި!Ok MLD5f}P|=UDqovoV]˅,-lttX|4u2Zl 6 ֘]^גa!s>vXLߡf"&r<©\D ,p6EUIƂ3" 0+J,4aU{4(T**Am;!=kpMxV&(Ä4@7VQ9Xjc+*jBΟuZy3pE S6I m2ҟAWC7H"DTr~x sNBWR3r ! 媐K{"oSBG5AmvƄ֐ؑ/Н+eQ[@q+ګ_h=3q,?QM8,ir18e'mJH}PNRڞR`ɥUCsڐ=fiAJ@":LՖ_=7"3\ MT})EHY(k#k/dJyn[#íFk- X5߬)n[-X,gC+86}4:;bPUv|{ˁmg8WdŪv_9&`$+%@^ <3 ̢JȯiĴߒ]FR:A%;Vb:;h6|%A [wiu;Rp9~,hKH}N[SH2"{++9bN Vd`rڛ^1؞6YJs< Ֆ˧LʟN!ϩܵ.Y D R--ލmc >?ڤD k 8./:rRTxPO08/IO׋{d𜤲{NΩ!w_yH"%e.XKA2ѹB1ݷ?Vx}N9=Ja TϪhI%߁Eb]A]1`}h=hXolmf)X[8iUFy7VZ>T3tQaׅȈN(*dsC=,X7> TjsԠZEx#clפ-dv7Ot4^Dv6Iey=U1xϒCu@%XG,. 0& GVbcCa(y!&}$%Qb]h\&$f=˜}T-R;7}&2=oݨ'hgy*O`>tݰڹqk SlxB@mӾӭ2a!DgOR8q򗃼DQ8zqZ4w967t Eg$ u)DI)iO-9~np}):7Be+cc&[Hiw ;>la_dg?WX;=:.m_CԟSd֑^Dl䯧6ɟĖ7+!Z/r^+)J 8g j| lOg*{ u`h ?);7 ʡt /, :B 7ecU=5|Яw:zv;u>/d3ZAhrWU!֊(L6uRUZ-0\6aE< L1,'sSdžT$lI wu@*Fλ1lc"pkX{ՓOGf6 ?01˱FQu!c~ɻA"Z,]zӵ^ l-1s g9.\DV ;YRc%/>;JV$I xL1~d+&5R3gݢ ]܂wTU?tΤ%>RhN2Х%"#WLo}$+H@u!Dg2[l @B*Ԩ hܔYDgځȉC.%Z(ρc-7]C p#pz0EddGK Qn'23QdAǞ7؀Ӡ픱H+صO(K[YY TȚkFнRcCPYGtyW..ٱnSsUR/QnPOf%Ru_+54iH:DNIg*Er,](:6t>'jgV[#:8}MA{fbO0ϖl [O"33{%g؎D"xcsB2SsNd+x y{ӕ(:KK_qKtA, .-.4oQKuqe;˃L:QxP[}dzڲ%̝5 qo![$˚ ] D3oK Ѧ = jyKfVHo5;&R 9vd/ͧwfL|q EcVWME9C Y6২u w wMbZo)_l鷾{`>;u}0 U<ׯDVbe"݊0huY ^wqtAZ?8s o~?16aK 8Ywޕ= $ 4ܭ0wX<8imQp\kU"[pk w^F(m>%-Y7F}5D2{$ś yZGsg}JnG,F58'yKlQ 'FnjsEn/V lݺvZ0O'X9,FEèV oXJEpq@re%V"d9$RyDUBmϭbk+bTk34U?zC&{5ZEPd*]뼰y3VB}"J/B͌E~3xq1@ne-_$1<lm#>[4˕g(YO-ddqŠ[`M^bj+ ygJDq̸w}QaلIVWߛFXk:pR4ָ<7 ?J='P1$w޶lΔ^m(X}8!:ܰ Pmc{)WV t`Ղ%S|n0"yjQ`9'|=tAP,=LFV{f mR= )4ʮʺs~jBy 10nҢ(PϕԒTQyw/kGxt)VAq$;12jWaH:n0T~.TXx}D078nξ_B>_k$\ n$gE?MR U I5bKBx(7h8fm~,窱hC8d@j۞ ƕXL"h;!,IVc$W;'#Alye;"i H k21(҉` C*mDP-ŹnK>HlK{)rMn˂W0-1Z t^۱ߥLŸa RCX :Љ>k[:rsl4@1> 0rՈ ͡ʨ HloGikc̒lM8e?gT;-4K]^[Ȥ8iZT\[M׀vA_[D܌!\ ]Q䋋X+XkddObhFn:% FyGoTYfqIrUuo+z !D?QHGm'rs>| hbCP;lnnN:xjPfk83LBUÛۉ86 6o}y:^e kb_e$No[mEޝ\Tמc'D-gPQ3)8cy6|6/G JYB874!ښfP|sկNtD;%7R#K]]/nК5i(ϭs,u9S!ې(IA$LZM<(ؑgm@E4W;1LvVxVvM\ߠW(ƲnG]ٻzN4]Z)FGljuf:wYQZ,H.mLH?ɹq7EH߼Om[-Zf<{ݥ2gD^0MBkbo5@ahY5f}HfG{H$k6 E#<0AҴTkd$JM%={ @ټˁ"jKӒ%Gq!!ac1^Ls :NRѕN(aZUA\78lAK-nNFڨj^2"S#UW<' "R~ªG"\Q& ij~kw^<&Z5w&ܣg@ u֦wq}/d >'X1x:&/^7Z|*;͏5}@_{>ޮke[c?8Υ.*=%"d'l6<1XvpS›F=.PL.k!Erd!=8'7 ?VX/\۰C\x%hc"TwIq M,c p9 FwVJdޱUr,=빵Lv*:Ş[ ab;ҧ"z$Kj߫Uk.u*Z}w0?nLcORO*A-lL j}6Lg'guȎZm٘0gq af~lqimm{9ϣ \[&I"Qn J'n6ae`5əQ֒2nNcAծc.}Bg+=?k;RH?Znr"oicM'SI}@YJT:Pn7e/bU%p"iAlżu=%I29(L 8:e(*Q$;=IZ;X\1N?=G˽`V@>/7Y:O*a5o;Da:W5T+E4Sj0Qee[+_iiS,̶e\v„tc^k&ٰpw?c:p$D!'z3Q` zT %xjMŸeB +(-D;9nʢjHιfwY|ŏ$o{r|If_P,CEIw%j7.[{0_nlDNҦOK U=DX =upmی=REn@ȖSV8_/*RS>e؟4k_}Uj65^.ް"/e3T*_q:v04 x@ts /6uΉJ<: EZH rzNcs1Ξw u BXΗ@Eq_QB(#A}c${}i `\"7ja`M C۴:t,\;/ *Wk7PcVr"' HeB;[D+-sئLדymaxz)3Inj98+snޡhWh 8jSM)ں1㔎Ef1:#VýK}?>ۥc1ݹTZknd38BChޑާ3J|+n&"\8]z2Z)se+z40" D-R- ߑJ^gW\PS`׋~K*>A8 =3*RPe4Ԓlu``mم& 2 )Ԍ{" SDk՜`o7WקkL\O*dBİ!02Ѐa3IGM:zzR4=XJ#[4nhbdwT0d.ץ?w/7&h8/$QJdm+jW1;'Fc̻[EzD6AOF %Ha_u" xEY}-g=?U'._;@^7FO/7M\"i*3uN/ZO952ik\Ӥ~$Z!W׀L$2nCTs2TB=Up'NWw1̱Fv,[*\ ݑP٪fPs«n\jv|G< Jhr`Cu>ӎo+o$܀Qj2s}Nd !?r:н 뒔캂 v3GE ͍#Ú]l"Cea{Ԗa,ogNP&1Gږ1!lF) &NL-IZv)G*rLfY~VY5#?a}qSB "vR_)z|N:Uʰ 1"9N,oO`UeuڧG5Cq_P 9镝m!C#:e bvj=sڳz>U] Zh;HA}bd1-#T)rg?~MJmAE銮]Atod-Z 9Eu6mQ!3!=t&K$ c?@p NbK/"-X"!3]q.13nDS׃ J?̩!Gt 1֙[Չd2&:u@' eQPa<{Pӻ'Zٴf>r.M !AEB4}5.= J):bM;(hgÒhL{ChګGv _nSkNK\ DKOO5K>`4;\JxcX'/5c3*,pu#.#.O--Z+ݼ]o ~E8?^]IV,@iֵl UYg'A8q$cNUpǔL>|lZ|8c4c+FcF@ ߩy2#w #!B>Pfg[9HQVz~5gn $c9{!esqm~yhYgWlT0Eޠh\@S>*@ZM h-Wdd.4)bp1(Xq>CLiq\^Pa'hDQfۂ9g [פfK\Lī pĂzRDȿh{Iʏ~sjz@)Y7Ch:А.O+_7 (n_#FI:ljٵx̮~+#!U}O+oLb[ׁ֣aAE+BDT[gz b]/63.hS@pJ^F"L3)&ideoЪ 7ܳF1" E IH/9)crVwx,?"Ģ xhk@bg!/=]wH$ؾf͙YH6S`FQJDFx:c.)2O}"a퉾!b~SoYY!#CoEoY*joe|¯FPZC2?<~2CHW4.+xilq&]fw7>W&ɞ1$l~I)!`(ƣk+wK6k(>yD꘿Q]"stgE.>^V3dsVo6Ǻ\Wn>vMR. q ^wm*_S)q}4hH1Lp|#pT;2z E ZR۫-;&P,{;E4fs5{0ӯDpLv+lP޻\1˻{5 \z}@mg;Tt@qཆ\$z"B0I1@ 0xA$ґ ~wuKܙKBg$% GH T+>PT<`x,yy0{%bę=|#}U6 i-gM Q|N\8P P)ABBj@ݬȁ( P:aDjaPqB@>m7W@€ x P!cD<1R@ 0%Ah4LO Jp P#AE,<1S P!D<1R P!D<1S 0%A4LO Jp P#AE,<1Sh P!D<1S P!D<1S 0%A4LO Jq0 P#AE,<1R P!-D<1RX P!/D<1S  0%A44LO Jp P#ARE,<1R P!qD<1S P!sD<1SA# 0Ax4LO JPFdY|DtCIJ0 ~*|POPC9o}|Ey}r U{5!E^6+W5Z3/[kDzDϓe3yVh¦S4$O?of:B:`=W/L1c^@(}CQ4&Zjeﳳ:B  up%E4zEL&Q遣p P,AE,<18I{BZpH P!D<1R@ PD<1]SAd˽FoDD'2 /UiMTlFSs/էaJZ_ )q>C^g[TvPVG.C^:l,+Ł@` 0yA4LO JGs %k8 a)n)嗄FL9or"~M4/T1#EUiR ޱ]ڪ=(PwX P0AE,<1xBAc'J\qށ PPD<1]l[z^C~dO:7`k !Oj/ɲćB8 P!D<1R 0%A4LO Jq P#AE,<1S P!=D<1R P!?D<1S 0%A$4LO JpP P#ABE,<1S( P!aD<1Sx P!cD<1R@ 0%Ah4LO Jp P#AE,<1S P!D<1R P!D<1S 0%A4LO Jp P#AE,<1Sh P!D<1S P!D<1SA 0A4LO Jٷtx10 P/AE,<1 6vUrGocd P!-D<1RX P)/D<1 6vUrG5@ȁ  0A44LO J^&J !Κɒ>`͹\?['*ච?{ #D>(ּ4nP#+}) yǏ8Iɝf)y君.73/^}s3RIu1 ^T54\%́ P>ARE,<1IP.3YÀȃy%:@ci@ PvqD<1h}ZToBFCiirWo5ߧb8mޛY}7U Oo̮ z-r,Dր P+sD<1C\21Z6  0%Ax4LO Jqp P#AE,<1RH P!D<1R P!D<1S ` 0%A4LO Jp  P#AE,<1R P!D<1S 8 P!D<1R  0%A4LO Jq  P#AE,<1S  P!=D<1R  P!?D<1S  0%A$4LO Jp P P#ABE,<1S ( P!aD<1S x P!cD<1R @ 0%Ah4LO Jp  P#AE,<1S  P!D<1R  P!D<1SA*  0A4LO Jؔh_7'u ǬIQ2]s{[jo,OmjEuI{_N~yS%3` 'zZ ̼ȉ(AmpʛciDよKaԊͿ:Glhw"(3Aiͬ,踞IЃËJǡ!ТU\ T`n,Ce<[[|o8+Ѭ5Ö{.r+eqz G:d7V@  PAE,<1m]X#Ot-&bbw!(ECo3:\LB9liķ`Y ݅]I0)n+}VX7djK'ܵjBc_1MCr(! h P-D<1]vwkqHL ҁ  PDD<1͗J\fJHGG.7ջ  0%A4LO JyP 0 P'AE,<1'$  P!-D<1R X P!/D<1S  0%A44LO Jp  P#ARE,<1R  P!qD<1S  P!sD<1S  0%Ax4LO Jq p P#AE,<1R H P!D<1R  P!D<1S` 0%A4LO Jp P#AE,<1R  P!D<1S8 P!D<1R 0%A4LO Jq P#AE,<1S P!=D<1R P!?D<1SA& 0A$4LO J 3e0-{޺dTdyDzf0~B;!88m VKG=#'D\t_zUߖ `؆QaB*!7 >'F a]ry 0#-E|ea_X"\g<]ZYT ěfȄ He)rjk+g'f:rT֍`:uXxPm3f al56+P P+ABE,<1Uru<t( P!aD<1Sځx PLcD<1,B*gEqRwrf 2YYZ|2í?~|U@ 01Ah4LO JdL#v連 P.AE,<1@47@m P+D<1~m%"X =2 l P&D<1cV M磸 0*A4LO J$*v*ࣱ P#AE,<1Sh P%D<1Ϡ P!D<1S 0%A4LO Jq0 P#AE,<1R P!-D<1RX P!/D<1S  0%A44LO Jp P#ARE,<1R P!qD<1S P!sD<1S 0%Ax4LO Jqp P#AE,<1RH P!D<1R P!D<1S@` 0A4LO J[^c 8 Y Y[eIڴy& skyS1_%p5)&q%_e&W>YBCqvb?~3!In<P7<*TpݴVh@|Y;7G$35'x_rD@HFxL,حl$ }M<υ5F P*AE,<10q@o P&D<1cV M磻8 P-D<1>tJ[£܁ 0NA4LO J6kdvAO&v ##^bh(9/wΓF@m P2AE,<1w@MebgL \ T:JKJLvƒU`.LZ' P,D<1ݓjmj` 01A4LO J"?Mh P#AE,<1R P!D<1S8 P!D<1R 0%A4LO Jq P#AE,<1S P!=D<1R P!?D<1S 0%A$4LO JpP P#ABE,<1S( P!aD<1Sx P!cD<1R@ 0%Ah4LO Jp P#AE,<1S P!D<1R P!D<1S 0%A4LO Jp P#AE,<1Sh P!D<1S P!D<1S@ 0A4LO Jf?ItH$'w@T_w-IWFm6`LEz[R+ݪV,o1(0讐I@WHeGJur"k֎)<'.55vM4B` ٣@0 PqAE,<1r }F}v>570k͑Ic~[P؉} eSg_hȘ`L/x̘?[+FS P--D<1S G,97X P!/D<1S  0*A44LO JWP?р P#ARE,<1[ @ P!qD<1[ @ P!sD<1S 0%Ax4LO Jqp P#AE,<1RH P!D<1R P!D<1S` 0%A4LO Jp P#AE,<1R P!D<1S8 P!D<1R 0%A4LO Jq P#AE,<1S P!=D<1R P!?D<1S 0%A$4LO JpP P#ABE,<1S( P!aD<1Sx P!cD<1RA$@ 0Ah4LO J|^,EC Nr1b%. 7 #o&-K w̬Ĵck>04X%8AИj e<7C]`բIKʍv<ptT- 1 MF/g `'ܽ*"X#e@$ PQԲOj@" P*AE,<1۬`m%e1" P!=D<1R" P)?D<1۬`@# 0A$4LO JOH$ .#b xaiHo8iC8YUP]6?=;!DO]. CZ5@~ StyL#P P1ABE,<1ڻmGvf 0*B ҁ#( PDaD<1lHl.=vHEPǂ|⏪'ɸ(a#x P%cD<1ql$@ 0%Ah4LO Jp# P#AE,<1S# P!D<1R$ P!D<1S$ 0%A4LO Jp$ P#AE,<1S$h P!D<1S$ P!D<1S% 0%A4LO Jq%0 P#AE,<1R% P!-D<1R%X P!/D<1S&  0%A44LO Jp% P#ARE,<1R% P!qD<1S% P!sD<1S& 0%Ax4LO Jq&p P#AE,<1R&H P!D<1R& P!D<1SA,& 0A4LO JRCG,s4\IĠpmFiNOmqgEEB];0(,xj&RJ(y3nw.>+\(:eKY1`T0!og0'r.&$V,aAR7.yŇ+-.%qGbn &}r?UAyP:s[ob/y{a 2˼H릳_:X D m.>CuN B EÁ "g(  @@@P(`hﱒEemw?v;Όd4Xpg^#j14мT`"\5Ӂa3;ZBv+Cd D%z"f}. +@O F&u y 6ݳx.5IaPO>SVf_!ӼqxxSb1%qчP0-xå__a'8Z_M@NAnP7dnPY%Y)Eʥ/c7:]A.}sQ>O a>Nw U^fVL]9Vj)n- oEV~Wѱ,|V|"ihV|銃MxR _n _O$1=Z,ULx<)wn\3>@p   j\"+fFl먕 94_W ecIɗ8aܟ_!n{R^LF;-i:~!(4jIAeg oZRW>"XHޡ 2mi?Qgz>Ė;;t&ڂ|#ےouBj9u_ cƸ:|34&$ g!(;4Q8uQQmhy}f0bVD.CxR$4C>'$]^@Zst'p3 iZW/g]`L:[P,*u5'Kvx`êԻaUI4} 9N5u;q% bDEbsXP}5c6I} ͟,hdzp'R{%c:ftB{ `VY\WRl4.E3^+*S <*jWe#} B;U{IZFоX TnQڲTa>P#N*n#孆_Q採)⺚ OYs๔( P/ɚ9HF558듘'7m2#s#@9ܙvKǮI{8]Su]"y-YA&5a!_-cˊ7t\cC4,w׭4[uÆ\s.q 1A!-!ű*x%n{IZ.1G3xq7qUlCy/yfg@†}! 7Zf:OwtQwDғ"VE@hىFO3v\67D.LblIa:vQxz-]kB=u͚Dq/UumWS dARWg v'y *y{?tiRHo3ɻ{u[|\N5`si )&ԫȬqQO#?J Nf5C0R):I1{=߅#Ou׹7"OI4gL1v6č;[.=-sPNM8zCܲ޾lZt͔]#%m>L!+ 3 W6VƲ/]lyGn|SX2.4aA\~!qX:+}cݬRȫj!@oda6wQD 7Nb{*Kρx{VUL5l&r-07܏tzq QvZ. #5VM5jE * [L!C"fؔ=I^qT,:o] qKl(3`x:3b}'v>ES埓VDÁ&s,o4g$80S&pI gxC]*0h^K4Ets{Nv˓J)/4}y\. FT'PY=1r]ǃA,273ѐSXdY٬֒k*M ֤]|t۔VGV.ƔTQgZ\0eG=Px: jPa%{c>90 X¸[]. W1h^ xD}(Jp?ஓ,bK/|c՜NԹ,<90Z`^|3752?! Q?b’Klf3dfs XXns(Iѫ̿;3Ic)ZeW)PJ?BKcEp"~e5Ty4y7 5tJni4 I 8/AҪ0NJB06:Fkc:[\XF bWjzS?:s8\!)LtgC/p TOv&@v`Pj)H5j굧c -K,@&nP,RvX/zНWUB!}F b*PM >0G^B( 3mFS[7S%js.u]L79W^~/猐V\Bg*tԗmvuwB%k wGKD^PCrTLrQqٱzUl_ڏZ4b(ǾD|2cL7d"G4ݷ~P$N@(ZyFO J_*μv{W:~PQ3ߐϱaS=""o;Zv;d5wy,EIAtw'Υ"/nXyVwۮ%nJ2@SBA,h]?Y4ZwLDouޢ!#6DR^ l;VMHgE?2!6^I.*D-^zI_dBgU-RFW }j9ëǧQVM>H~[D* 'йc`dv}1w> U1l/48A=Zv15i= y4J{?,<2rie|(&J2YCt=sX{Sc=:D&~@4ղAdLssذ,^Mpa2 N2=?F쾐t"ZF3& Jʒe[̘5NbF1GQcФ6 `8tNK\dtk} u\D <kIċfGZաQ)f@׎*nީH3vb]f#dH s;gPRx?>ƥNB4Ae!i|'L^ Rܿd2xEȤ!^o#|B!݉V]kixcqY)NL?r## \vٝ@ÅH!@!2%Z f*u\]d-6Š%!̯dj[; ((@"TF>Ӫ(eئxi,դ u?~=D&E((.B#]`.ի aUO # AHtGa0nȱ?NaM7MctVӃɹ e(Z:/! F%\3^ ^/V?/%)H;FBƅ@g-"k6ouC>gfxo6XblO2پo][eV`"Ӣ1 \L/ר@T{LH~8PGpݲ5܊Y^,EdECО{p01:7QE3@Fr: _b2Y{Ux # 2Mgf4 MebiW@ ľ$//'px(Bmy3m|&_[_}U*}O"S_6es3:{zGʐc\_ڟ*o%dE/1(J䱐k(F$Z=֏/Pnhcy wbfr oߣ.vWWvmO,˻=VJ+i]^{ypf w߫a Q2KndI}NV6yowⴎopMjzƀ@ !  ax` <\29)lV֑nnI^."ܭ|MvpT˘sf/&a®UK5侀$opsc*aKjopj}&IKB<Pި!Ok MLD5f}P|=UDqovoV]˅,-lttX|4u2Zl 6 ֘]^גa!s>vXLߡf"&r<©\D ,p6EUIƂ3" 0+J,4aU{4(T**Am;!=kpMxV&(Ä4@7VQ9Xjc+*jBΟuZy3pE S6I m2ҟAWC7H"DTr~x sNBWR3r ! 媐K{"oSBG5AmvƄ֐ؑ/Н+eQ[@q+ګ_h=3q,?QM8,ir18e'mJH}PNRڞR`ɥUCsڐ=fiAJ@":LՖ_=7"3\ MT})EHY(k#k/dJyn[#íFk- X5߬)n[-X,gC+86}4:;bPUv|{ˁmg8WdŪv_9&`$+%@^ <3 ̢JȯiĴߒ]FR:A%;Vb:;h6|%A [wiu;Rp9~,hKH}N[SH2"{++9bN Vd`rڛ^1؞6YJs< Ֆ˧LʟN!ϩܵ.Y D R--ލmc >?ڤD k 8./:rRTxPO08/IO׋{d𜤲{NΩ!w_yH"%e.XKA2ѹB1ݷ?Vx}N9=Ja TϪhI%߁Eb]A]1`}h=hXolmf)X[8iUFy7VZ>T3tQaׅȈN(*dsC=,X7> TjsԠZEx#clפ-dv7Ot4^Dv6Iey=U1xϒCu@%XG,. 0& GVbcCa(y!&}$%Qb]h\&$f=˜}T-R;7}&2=oݨ'hgy*O`>tݰڹqk SlxB@mӾӭ2a!DgOR8q򗃼DQ8zqZ4w967t Eg$ u)DI)iO-9~np}):7Be+cc&[Hiw ;>la_dg?WX;=:.m_CԟSd֑^Dl䯧6ɟĖ7+!Z/r^+)J 8g j| lOg*{ u`h ?);7 ʡt /, :B 7ecU=5|Яw:zv;u>/d3ZAhrWU!֊(L6uRUZ-0\6aE< L1,'sSdžT$lI wu@*Fλ1lc"pkX{ՓOGf6 ?01˱FQu!c~ɻA"Z,]zӵ^ l-1s g9.\DV ;YRc%/>;JV$I xL1~d+&5R3gݢ ]܂wTU?tΤ%>RhN2Х%"#WLo}$+H@u!Dg2[l @B*Ԩ hܔYDgځȉC.%Z(ρc-7]C p#pz0EddGK Qn'23QdAǞ7؀Ӡ픱H+صO(K[YY TȚkFнRcCPYGtyW..ٱnSsUR/QnPOf%Ru_+54iH:DNIg*Er,](:6t>'jgV[#:8}MA{fbO0ϖl [O"33{%g؎D"xcsB2SsNd+x y{ӕ(:KK_qKtA, .-.4oQKuqe;˃L:QxP[}dzڲ%̝5 qo![$˚ ] D3oK Ѧ = jyKfVHo5;&R 9vd/ͧwfL|q EcVWME9C Y6২u w wMbZo)_l鷾{`>;u}0 U<ׯDVbe"݊0huY ^wqtAZ?8s o~?16aK 8Ywޕ= $ 4ܭ0wX<8imQp\kU"[pk w^F(m>%-Y7F}5D2{$ś yZGsg}JnG,F58'yKlQ 'FnjsEn/V lݺvZ0O'X9,FEèV oXJEpq@re%V"d9$RyDUBmϭbk+bTk34U?zC&{5ZEPd*]뼰y3VB}"J/B͌E~3xq1@ne-_$1<lm#>[4˕g(YO-ddqŠ[`M^bj+ ygJDq̸w}QaلIVWߛFXk:pR4ָ<7 ?J='P1$w޶lΔ^m(X}8!:ܰ Pmc{)WV t`Ղ%S|n0"yjQ`9'|=tAP,=LFV{f mR= )4ʮʺs~jBy 10nҢ(PϕԒTQyw/kGxt)VAq$;12jWaH:n0T~.TXx}D078nξ_B>_k$\ n$gE?MR U I5bKBx(7h8fm~,窱hC8d@j۞ ƕXL"h;!,IVc$W;'#Alye;"i H k21(҉` C*mDP-ŹnK>HlK{)rMn˂W0-1Z t^۱ߥLŸa RCX :Љ>k[:rsl4@1> 0rՈ ͡ʨ HloGikc̒lM8e?gT;-4K]^[Ȥ8iZT\[M׀vA_[D܌!\ ]Q䋋X+XkddObhFn:% FyGoTYfqIrUuo+z !D?QHGm'rs>| hbCP;lnnN:xjPfk83LBUÛۉ86 6o}y:^e kb_e$P:GQe?2r\$x}bGڅGssvq(HY1Ǵ ZjIpWJͼ)_! ɖBN,yb1WQVfUA1!Ą=>{1TjoD"O05z}]6!O咼͈ JKcѩOu!+0D{i-Z Lc:e|ASU{MPm847and /QG e(&" 4! C40sTo%K( l39iDn|cؾ;akFPhQ 9NzJt֧T e  RfB|tfpyXߎM@;PгϮSSIӁ, a\o4Jc, @FQIZ6m&aD9E_ C= }nj!O ^i!++W@!sLo!ؘ4\ߝ-8va:;֐Dy86AM]%Hܴ ހ7壒9IΟtupe 7zvL)ћdp=XmR,,e!rFUIBkBw%+9L, X!#4_ Oρ9z9\di|}ɥogUpοVԭ0jXAw,Ͳ2ޘd'W>$o9zwFcZCU+xАs+o/ $dT0Ҡ\n.E#W}Os ֩TH:]KkҲ0췬1},"S9VD98jcm>[ܖ( t+W T3L>hSo8Io"6[1e'hSGZxu!#_r?2+T]q?פPFWڤJa^#ncHqGn-}vXkhˎ!nwNJtxK5b^{9^TCz[p[^:?{>9!r`_&qٕbTяr1E /~g_7ojƸi/wK]|V=Ij ClMolpJ[94OSg{F wf:HIB+j^a@N7S:mPzIl2-+`#'/htt(%$/o 1g?UDwT|%Ms ~G@"w!~&t raU*JO39x9UF{kI|9lR!iY?7h%mV;SY߅a)7[btf4o+͙,YW CvT\Y} [J6%#gNخ#l5O6z#b_q(muT۪~i 90DaoRVlZEȪeR/~FUޘ*Xխ= SxFN1M *}Nьz}Sq )~JvW̘ @aDj(Ean @R9]6r=󈸧=} J;W Z~N7G9huA @UIȷ'hkN#W ^JVwZvXu'IoXc^HHE^2tqh9$kRB<^ 뇵 >X,zbcׂ] \zihSFy̕:1K1=vhf^i=!@Rd:)m[_[BL* cG[K{,6Wܡ_[˯ܦ0vqBqOX?ޚ>%xg)ߺWix'ȄV[>+I"L8X!1lWMLM=ErpjrF+gR* IƝm-1[dtI9S13«f\jlڷC$+[Ƀ H+N-Y\$h%;x' җGo\X(ޱE#Qt.a k﫷웈tR?q}wߑRޗ'԰YW0>?C%&{Zr; !gx NL.S8sWPZNuYm,MƭCcJ¢3cx~eNCb bT.Ba0< 9ȳ\M6{J˦A̷R99e(7C?BeZCXd;h?`a3?ZB@@ =z؏¯ٰO,kǵtIGQ0E!gN=E<")122A8_ϳ:# bz(株0ѓSeoz C=YՊu<N̩ iw@B > '#Q ,y`g׭ KF8gՁP'8upgt4136ja A0~wp-_.WWjx2 A _hiuDcW5[6nih+y/8s8i1<{겼_$@M2V)ȲKy∪,zSP"y$ʃE^[6iPZ{ ՙb3'_|ĵuxToǺ@kya(@➵;j1A<49b.K^JaOqܚ=%0XRr _{JFx=EoewχDk};}lakyɱc iИU>j9); >L3!RgQrI|X'?>L7@>Ҫe`h|FbE\| ,p7ipv.bS@緋-:%= VQ:6Kzd`a̔~Ur-sFsdAp3`BݸCñf?dg/b,n-9- ?,M*{[ @(gHhɢ-0*LEƕO8U%1uiAN+kJ5߷ݤ]i7& z.Iǻ7liF=xЧ H'u hD@Iwa;k#'ϾF B Srr[4i!Xwz1 +[ {!v9btI=koᕦ|ĝ= g5L~dI?Jv3HjX)zcqJ]M~ 'bpQ://wWHǴKwՇ}6>e-\ժkͱW[SF+>bnJ$\lA!Zna?%4[#̇ii5Qj!aHgiNɔ-@Nd4`#Ynpc鬍^L]4[?9%3d}WjdP>@l-1,&x/ali heሾBЌ< 0iA$ґ ~wuKܙKBg$% GH T+>PT<`x,yy ; #{5|2pd*P P&ABBj$zmy` 0M( P3aDjsr=O-wt|=x P!cD<1S@ 0%Ah4LO Jp P#AE,<1S P!D<1R P!D<1S 0%A4LO Jq P#AE,<1Rh P!D<1R P!D<1S 0%A4LO Jp0 P#AE,<1S P!-D<1RX P!/D<1S  0%A44LO Jq P#ARE,<1S P!qD<1S P!sD<1R@ 0Ax4LO J8T^ɐ#{WV$2(ȕ*uI4ЄҺ-*Ϻ\NcF{@U/d@ 5[!%@(16null]ILpeJpVdꙎ WqApz+%tz&s3a;3K}%w\ JZ Y .J zm@  PAE,<1 *0۟W_A-:Ή8c4,g]Am[ɤZ+|Bf67[U]:^WtT[-;;\j(Gk8qFt| h P)D<1cl tÁ  P5D<1XO /7w@#֮A!Á  05A4LO J,YHu=opC 0 P$AE,<1Jѣ΁  P@-D<1wZ,UBX7gY992{N7nL X P!/D<1S  0*A44LO Ja3?:ᣱ  P#ARE,<1S  P!qD<1S  P!sD<1R  0%Ax4LO Jp p P#AE,<1S H P!D<1R  P!D<1R` 0%A4LO Jq P#AE,<1S  P!D<1S8 P!D<1R 0%A4LO Jp P#AE,<1S P!=D<1R P!?D<1RA  0A$4LO J-.^0#ɮwsě{D$% ax񘝍+zњObac i:hsBgfᔇAp RKTjjOT^Y$`"n][c%vKIRbS3^9Szp,6•}ӸI z)_%9m*6.V8sEz"V^ hUpZ:eX7ŁP P7ABE,<1ecmf˂¯Åڠe( P!aD<1S@x PcD<1ZR=YB9>6ɭsz <`3"s0Pa/a+(w:n(Fc,iNV_^$}'}ӏ7w=!ȁ@ 0:Ah4LO J-G/ Pw u0>j6` P$AE,<1JQ P$D<10d P!D<1S 0%A4LO Jq P#AE,<1Rh P!D<1R P!D<1S 0%A4LO Jp0 P#AE,<1S P!-D<1RX P!/D<1S  0%A44LO Jq P#ARE,<1S P!qD<1S P!sD<1R 0%Ax4LO Jpp P#AE,<1SH P!D<1R P!D<1RA` 0A4LO J-&w;IH]Eq&&zbpoY[>AX7-D/d=:E硞!Ék Ÿ$߄5} )A-gN;f!8wb9j 4Rc<8 xcы#L(HPDh[hW\nCl|?M =ޖNԖBEvZ/@^B]X<\G¶axխ;zl!Vn :"遣 P+AE,<1ecmhm~2 P!D<1S8 PiD<1^C@.lZAɇ`+a-Rvi=\i8=j fJl֘m`Op\ 0gA4LO J, ) 3hde!pXՒD}v`nBѮv%NͼqK P/AE,<10K(Ӵ#!܁ PN=D<18{ %jL9b,LCe/QZ,9~2{ P'?D<1tw@ 0%A$4LO JqP P#ABE,<1R( P!aD<1Sx P!cD<1S@ 0%Ah4LO Jp P#AE,<1S P!D<1R P!D<1S 0%A4LO Jq P#AE,<1Rh P!D<1R P!D<1S 0%A4LO Jp0 P#AE,<1S P!-D<1RX P!/D<1S  0%A44LO Jq P#ARE,<1S P!qD<1S P!sD<1RA 0Ax4LO JO@JC?|G%5 z4s4j_Q3zDj˚0z6s' ֟;,wȜ:no- E t6} i K=Ձ6`R}8,/݋;DmothŵL$. U50y*Ắp P?AE,<1/6;B^a2Oq' h:/DF~JH PiD<1/Ag {%1̖yfz%KB\5o4x#sYss43ݤQM;a?8~f[Um* ѐmĦϺÜQ<=4T`6R p+Shq$iL7j $C EC[`LD ZQ݉֨H>s#vz@ ȣ0 P[AE,<1/0% !@N2Iw1eVRޙ_upy@@ Pt-D<1/5'JPS'A.T[, BVϊ*Լz@x ??;>jI IM'\!сX PC/D<1-,^ {ܓ^XaY҇LlдL*BZp   0*A44LO Jqϣ= P#ARE,<1S P!qD<1S P!sD<1R 0%Ax4LO Jpp P#AE,<1SH P!D<1R P!D<1R` 0%A4LO Jq P#AE,<1S P!D<1S8 P!D<1R 0%A4LO Jp P#AE,<1S P!=D<1R P!?D<1R 0%A$4LO JqP P#ABE,<1R( P!aD<1Sx P!cD<1SAg@ 0YAh4LO JF@A5tGРH+ӶpMZk @o89;K3)"j_ϩiuj\eAO32L)BK}i-"/웊4jI`.^&=xu҇.!s|dKq{N.fb"Y{.!H)&uNL9c=< HoY=t!%[7m[ re; w?7JX ~hmu7FVqJ/>Y}iZ82n@!,v<ρ? cW$. P-AE,<1.@M==+O:Zq P!D<1R PSD<1. m]S~`y*CPWzH͡@>8>51ǁ 09A4LO J<_r#S\;`끣 P.AE,<1, De6 ͡lh P2D<1,EwN }mJ  P!D<1S  0%A4LO Jp 0 P#AE,<1S  P!-D<1R X P!/D<1S!  0%A44LO Jq  P#ARE,<1S  P!qD<1S  P!sD<1R! 0%Ax4LO Jp!p P#AE,<1S!H P!D<1R! P!D<1R"` 0%A4LO Jq" P#AE,<1S! P!D<1S"8 P!D<1RA2# 0$A4LO J?QZ7!LKLU@" P)AE,<1- M==*q" P!=D<1R" P(?D<1- M==d5@# 0A$4LO J3VynK':k;CE>KxZ7 ~/Nx4 {fY?K?P8_e(9ֹC PX`n*C0bzR-9Rܲ]m9hw7#P P3ABE,<1+_$\`1 5t'@#( P2aD<1,p{l;.( }#x P!cD<1S$@ 0+Ah4LO J4h `# P#AE,<1S# P!D<1R$ P!D<1S$ 0%A4LO Jq$ P#AE,<1R$h P!D<1R$ P!D<1S% 0%A4LO Jp%0 P#AE,<1S% P!-D<1R%X P!/D<1S&  0%A44LO Jq% P#ARE,<1S% P!qD<1S% P!sD<1R& 0%Ax4LO Jp&p P#AE,<1S&H P!D<1R& P!D<1RA& 0A4LO J6[}!MV 'Ԇ`0v L;j:xԱ)b- X߹$H$ǦrvB ')έn-[nuFڗ>\PQ`M,KM k[%jOƢ(]I)Ԃ"j .۸^0y-ӬcSkYu׏[_@T4L AA\L&Hzi"&_Ah8Ԝ?Cu6u0 E* "g(  @@@P(`hﱒDe?mw?v;Όd4Xpg^#j14мT`"\5Ӂa3;ZBv+Cd D%z"f}. +@O F&u y 6ݳx.5IaPO>SVf_!ӼqxxSb1%qчP0-xå__a'8Z_M@NAnP7dnPY%Y)Eʥ/c7:]A.}sQ>O a>Nw U^fVL]9Vj)n- oEV~Wѱ,|V|"ihV|銃MxR _n _O$1=Z,ULx<)wn\3>@p   j\"+fFl먕 94_W ecIɗ8aܟ_!n{R^LF;-i:~!(4jIAeg oZRW>"XHޡ 2mi?Qgz>Ė;;t&ڂ|#ےouBj9u_ cƸ:|34&$ g!(;4Q8uQQmhy}f0bVD.CxR$4C>'$]^@Zst'p3 iZW/g]`L:[P,*u5'Kvx`êԻaUI4} 9N5u;q% bDEbsXP}5c6I} ͟,hdzp'R{%c:ftB{ `VY\WRl4.E3^+*S <*jWe#} B;U{IZFоX TnQڲTa>P#N*n#孆_Q採)⺚ OYs๔( P/ɚ9HF558듘'7m2#s#@9ܙvKǮI{8]Su]"y-YA&5a!_-cˊ7t\cC4,w׭4[uÆ\s.q 1A!-!ű*x%n{IZ.1G3xq7qUlCy/yfg@†}! 7Zf:OwtQwDғ"VE@hىFO3v\67D.LblIa:vQxz-]kB=u͚Dq/UumWS dARWg v'y *y{?tiRHo3ɻ{u[|\N5`si )&ԫȬqQO#?J Nf5C0R):I1{=߅#Ou׹7"OI4gL1v6č;[.=-sPNM8zCܲ޾lZt͔]#%m>L!+ 3 W6VƲ/]lyGn|SX2.4aA\~!qX:+}cݬRȫj!@oda6wQD 7Nb{*Kρx{VUL5l&r-07܏tzq QvZ. #5VM5jE * [L!C"fؔ=I^qT,:o] qKl(3`x:3b}'v>ES埓VDÁ&s,o4g$80S&pI gxC]*0h^K4Ets{Nv˓J)/4}y\. FT'PY=1r]ǃA,273ѐSXdY٬֒k*M ֤]|t۔VGV.ƔTQgZ\0eG=Px: jPa%{c>90 X¸[]. W1h^ xD}(Jp?ஓ,bK/|c՜NԹ,<90Z`^|3752?! Q?b’Klf3dfs XXns(Iѫ̿;3Ic)ZeW)PJ?BKcEp"~e5Ty4y7 5tJni4 I 8/AҪ0NJB06:Fkc:[\XF bWjzS?:s8\!)LtgC/p TOv&@v`Pj)H5j굧c -K,@&nP,RvX/zНWUB!}F b*PM >0G^B( 3mFS[7S%js.u]L79W^~/猐V\Bg*tԗmvuwB%k wGKD^PCrTLrQqٱzUl_ڏZ4b(ǾD|2cL7d"G4ݷ~P$N@(ZyFO J_*μv{W:~PQ3ߐϱaS=""o;Zv;d5wy,EIAtw'Υ"/nXyVwۮ%nJ2@SBA,h]?Y4ZwLDouޢ!#6DR^ l;VMHgE?2!6^I.*D-^zI_dBgU-RFW }j9ëǧQVM>H~[D* 'йc`dv}1w> U1l/48A=Zv15i= y4J{?,<2rie|(&J2YCt=sX{Sc=:D&~@4ղAdLssذ,^Mpa2 N2=?F쾐t"ZF3& Jʒe[̘5NbF1GQcФ6 `8tNK\dtk} u\D <kIċfGZաQ)f@׎*nީH3vb]f#dH s;gPRx?>ƥNB4Ae!i|'L^ Rܿd2xEȤ!^o#|B!݉V]kixcqY)NL?r## \vٝ@ÅH!@!2%Z f*u\]d-6Š%!̯dj[; ((@"TF>Ӫ(eئxi,դ u?~=D&E((.B#]`.ի aUO # AHtGa0nȱ?NaM7MctVӃɹ e(Z:/! F%\3^ ^/V?/%)H;FBƅ@g-"k6ouC>gfxo6XblO2پo][eV`"Ӣ1 \L/ר@T{LH~8PGpݲ5܊Y^,EdECО{p01:7QE3@Fr: _b2Y{Ux # 2Mgf4 MebiW@ ľ$//'px(Bmy3m|&_[_}U*}O"S_6es3:{zGʐc\_ڟ*o%dE/1(J䱐k(F$Z=֏/Pnhcy wbfr oߣ.vWWvmO,˻=VJ+i]^{ypf w߫a Q2KndI}NV6yowⴎopMjzƀ@ !  ax` <\29)lV֑nnI^."ܭ|MvpT˘sf/&a®UK5侀$opsc*aKjopj}&IKB<Pި!Ok MLD5f}P|=UDqovoV]˅,-lttX|4u2Zl 6 ֘]^גa!s>vXLߡf"&r<©\D ,p6EUIƂ3" 0+J,4aU{4(T**Am;!=kpMxV&(Ä4@7VQ9Xjc+*jBΟuZy3pE S6I m2ҟAWC7H"DTr~x sNBWR3r ! 媐K{"oSBG5AmvƄ֐ؑ/Н+eQ[@q+ګ_h=3q,?QM8,ir18e'mJH}PNRڞR`ɥUCsڐ=fiAJ@":LՖ_=7"3\ MT})EHY(k#k/dJyn[#íFk- X5߬)n[-X,gC+86}4:;bPUv|{ˁmg8WdŪv_9&`$+%@^ <3 ̢JȯiĴߒ]FR:A%;Vb:;h6|%A [wiu;Rp9~,hKH}N[SH2"{++9bN Vd`rڛ^1؞6YJs< Ֆ˧LʟN!ϩܵ.Y D R--ލmc >?ڤD k 8./:rRTxPO08/IO׋{d𜤲{NΩ!w_yH"%e.XKA2ѹB1ݷ?Vx}N9=Ja TϪhI%߁Eb]A]1`}h=hXolmf)X[8iUFy7VZ>T3tQaׅȈN(*dsC=,X7> TjsԠZEx#clפ-dv7Ot4^Dv6Iey=U1xϒCu@%XG,. 0& GVbcCa(y!&}$%Qb]h\&$f=˜}T-R;7}&2=oݨ'hgy*O`>tݰڹqk SlxB@mӾӭ2a!DgOR8q򗃼DQ8zqZ4w967t Eg$ u)DI)iO-9~np}):7Be+cc&[Hiw ;>la_dg?WX;=:.m_CԟSd֑^Dl䯧6ɟĖ7+!Z/r^+)J 8g j| lOg*{ u`h ?);7 ʡt /, :B 7ecU=5|Яw:zv;u>/d3ZAhrWU!֊(L6uRUZ-0\6aE< L1,'sSdžT$lI wu@*Fλ1lc"pkX{ՓOGf6 ?01˱FQu!c~ɻA"Z,]zӵ^ l-1s g9.\DV ;YRc%/>;JV$I xL1~d+&5R3gݢ ]܂wTU?tΤ%>RhN2Х%"#WLo}$+H@u!Dg2[l @B*Ԩ hܔYDgځȉC.%Z(ρc-7]C p#pz0EddGK Qn'23QdAǞ7؀Ӡ픱H+صO(K[YY TȚkFнRcCPYGtyW..ٱnSsUR/QnPOf%Ru_+54iH:DNIg*Er,](:6t>'jgV[#:8}MA{fbO0ϖl [O"33{%g؎D"xcsB2SsNd+x y{ӕ(:KK_qKtA, .-.4oQKuqe;˃L:QxP[}dzڲ%̝5 qo![$˚ ] D3oK Ѧ = jyKfVHo5;&R 9vd/ͧwfL|q EcVWME9C Y6২u w wMbZo)_l鷾{`>;u}0 U<ׯDVbe"݊0huY ^wqtAZ?8s o~?16aK 8Ywޕ= $ 4ܭ0wX<8imQp\kU"[pk w^F(m>%-Y7F}5D2{$ś yZGsg}xm/ +an P5l[k&#acx'gp+yǚYT}Z SA ! Cρ\`R{#=[Hy+zgiî9Kݹ ry9/',NIjv]®'6C̚:?*h[AK49.OjyR2 :SKq|J/nv?*lgoI3a Msy/e*3!]#3q7#=yX+X+gζMDTmᣔrxP1a4_T /疀7zq,_tHI88BTߚ?PoBL7:۸A4)i5$?T^m:#8.{Ր\}j8J9wي?Z AZnzu * [*Џ(WeƿY#^okaZGxiÂ!}dۑDfSwoY n|N=TC#9hI6(blC^DxB~wA$ tx})bYQnHEwN ]hU$xp[?5SD\}[~IJ]ih`RA92}K1$Sޘ1p>t+Ȥ _Lz D eeDv5͕_ !E~Қ'f =H={›J顡| bMWJ% 0UE1bY:fTIQV2pDXsY׼3YS CyYB8LzO4!ϐ+ &HPoTvӞ^FX6J6N5] lC'{@FoxA}ՀćܞmZJe?Ia)B. L9AcM@" =Af8> "'0 +,̜Ͳ5+rA<~ULx_R &L Sȿ1 }`x=j V[Bg!Bv*ǂKgSԇX9ó7$lU\]0huJ/3L azH=@:kj]D}Q ӆҪ2Qs)GٱVGS6,2{Ѥt y3 >2;^ (9X`Ibo,ڋw,0Tb05HLÄ!FMC=q!8{9Aw& NI!id0dpB5y{ZuQ)Y\(t12@&~sh̵h3s#(5Dmơ`Dn"ԣčߖю|Ve毻'Hy^6  PM~ ZXTʥմraQ'DEŝ92o_ o EF-L45U QDVSQi݇VV5|FYmDf TY~sΏ*KդL1¸z\d$8Lv)ib&5%d"oXxu<dҫRLȹmoȇ>ȁ Z7t`IK.#1K˱8uhk4dm07¦7ׇ^ "b>D2H)hsLjO97"5]bnj#zyK-A̢.,mq˔ڔ ;JU?dK蚱/I:6mWQ%@51^5K'o w k&`G^ Xմc8ȩUgz'ȶ崨;6R!~"\9k9Z;+EQH_J ?q2I5&x!1*D9|հ9c/~2*|))Fi_Ԩ9fY6꼛28} ~JCBOi"Bg.aw&A8[\-Zȍ|bZ&wg6xѶ,>9L&ʗH|+)frXsBLϰh?VTөF=/joO1QANJGm7^af UEVL@;R?[z^(dX 'RafHv=Q+4 Ҵx{^JȹmƷҬi,HDjÍh@~{Dne#2Z~J;K$KHo_, *]|aC ^%Ar';HdE0n[6BL0K-F r <a/癝k3x\oSoXI^m\9Mf,ej`wrgYnhK޺˦AR1#˞I&W3yF%*#AVnDhlt9zL.?!,s$CE`4pdQDlxKOExk ZSI7{N8g[ڄ c?^g*L}hQBлW3:R^U'ev?XB {M3TşHZjۮ*_?`P[xzV8ZئL?tby5X'8-_-UNk g/oA53 /Ả1CRz79JMoɊ8snQmT&hY{y cZg< %w μO?r:лT4uArf= />#ƿ@8A*VEHȞ ^՜^ʹ=;) wa?UmGP B/;;uzt-}*rj@cϯEX6Xg];t>}1U>͗ ]G( H ?Tt3?@Y_Sw!0"&ѽp&ȳ'G ::]@>Ҫe`h|F}"E\|R  pipv.bS@緋-:Uhm;\!W*7zer8q%'o* 9HߐQ !2Z SÇP|Pư`s\dn]m\e~iP|&n ,0 p܃w~V8s0U_o7S2/([H?R SemwwvC"c]O p_]U8u)+7y>_R!lʅki"2 ҕ%f׼N+3)YyHfID]s`LckKX _EO»tpgwRTs#%2őO1V8v l(sKbF.υ07z;Iw9I7{??d?Cfk\X18C"(c_PVyխM&`":ŖSڴ-`Id`hQ9@7MsGK>&Ercޢ΋Dt' `.X;hxr+uXXu而b].F搷l0,%a|F-xyYnY~LDIHՎ̨ kKǥ?jԯ\3/;4y ұ`a<٣@Ubӭkي<,) |N%p'HZ( L>|lZ|8c4c(~F{؞Կ ߩy2#w #B>Prg[9GVz~5gn $b{!esqm~yhYgWlT0Eޠh\@S>*@ZM h-Wdd.4)bp1(Xq>;Ljq\^Pa'DH Qߙ 7hP[פW&ɞ1$l~I)!`(ƣk+wK6k(>yD꘿Q]"stgE.>^V3dsVo6Ǻ\Wn>vMR. q ^wm*_S)q}4hH1Lp|#pT;2z E ZR۫-;&P,{;E4fs5{0ӯDpLv+lP޻\1˻{5 \z}@mg;İTt@qཆ\$z"B0I1@ 0rA$ґ ~wuKܙKBg$% GH T+>PT<`x,|ߺVM_t5$Ȝ>p P)AE,<1*j*!kƁH P!D<1S@ف PD<1* B{l[@1d&[ދyVv)tQB?棹27z!^t?H"`3( /qߍ+_7`6ajRG\7uKþdq+TzbteL?ʗMER"i#BJ&$m*@` 0A4LO J#

/%??xve$L.>%6𤓣XE A_Üp1fȋ~E(>m h*O'nQSyzӆG(KVXtav,xݸ3d 3Y-p-MzG6/ GM<~AٔB:YQo'hR }uqmۈ&5!VICfUjZj7E*_:g6Q0a,;]<%zw4 SU{Oa^p d*pJir# SJl2)Vf蛗֗OE 5˽8PMРmJ>xCW P圢*5sb.|x6{Z0}DBC.vpFb@8:&ݝf>I%hvX},Qe{Bi$mdzNO^1}ԯW|L/*}z+E@ PARE,<1)"/s!jR_'pPvsq! _lK<[/K {y溿6OFpXǭ&D~1^tRĘB4b1Ketn @ PqD<1) igWA;ls\/h#w^%8^ $3 I8P6+xxVM@k3>=޵HYQXޖƜm%mTFGy0`UqoQvbkH@{ Y)fbtkׯ?=()R@P PSsD<1(v;ߝIcVϛGjf|?Cy +'PZ>H ,%rj@ggߣĒz-r ov4^8:,v!N.qfjM~ c^ ޭ6향ân2P|7a}l6a6L  PgD<1'.A'ŸiDF*rC@{3W_*J #6PG|N1P>/a 5R7Ɂ  0;A4LO Jn@ϸo|4ea9 0 P$AE,<1 Pq  P(-D<1#CE X P"/D<1AJУ  0%A44LO Jp  P#ARE,<1S  P!qD<1R  P!sD<1S  0%Ax4LO Jp p P#AE,<1S H P!D<1S  P!D<1S` 0%A4LO Jq P#AE,<1R  P!D<1R8 P!D<1S 0%A4LO Jp P#AE,<1R P!=D<1S P!?D<1SA 0A$4LO J ѱWPVYB!+Y|;4&A/BJ5tݧO 7>kDDM8.ȇj-M/o?;lط`{t#݇YM4ҀU#ģ~6%"茈!# `%.?!ʐ7`RIgxnGGȊE@}5\J%z]z'|Cϐ"w&o[D(SyIqZ]+~vW>Lnb=ԪǍ p,G9` 6+,2AbK?~l_K?wԽ?4a8pm{)`ȫC%(!tz9-P P)ABE,<1'l`6]jݣ( P!aD<1R@ȁx PcD<1'O{籚rF0D 8[ndQ+'gsZzne\š6%)R4#!0kz93xY(-n h3~X/}E٠1>YϒOZ.MaXKtLDzK|GɁ@ 0;Ah4LO J JpP 41hx~K0(2? P&D<1%^rC 0%A4LO Jq P#AE,<1Sh P!D<1R P!D<1S 0%A4LO Jp0 P#AE,<1S P!-D<1SX P!/D<1R  0%A44LO Jp P#ARE,<1S P!qD<1R P!sD<1S 0%Ax4LO Jpp P#AE,<1SH P!D<1S P!D<1SA` 0rA4LO J -f]Dq&9dKPHu7<ָwB"NFDxF]vƮV%@~ M|HkuǮ>Π) rx]}\2bקfnX iNGňߨ iWGc)*b4¾$Ad!-!⬖ TjTM[9w1+X ې*ILAI~ Ú +@ P!?D<1S 0*A$4LO J"8k;P P#ABE,<1R( P!aD<1Rx P!cD<1S@ 0%Ah4LO Jp P#AE,<1R P!D<1S P!D<1R 0%A4LO Jq P#AE,<1Sh P!D<1R P!D<1S 0%A4LO Jp0 P#AE,<1S P!-D<1SX P!/D<1R  0%A44LO Jp P#ARE,<1S P!qD<1R P!sD<1SAn 0`Ax4LO JˮuBn//82Q1L̋INrɭ @:g @e~XBjl!d4+!FRT^CQc[Ӻ1 xH4jέ7 ^8$U:ijg,x%(6+|-(؎) 6˝ BOa4@<7 ~x<Ӏ[X祡DZ3 jf8^U' R\vϬq>"ubm%bo6v9`d^F+qsL~%܁p PNAE,<1%B1=_*ĝHu!Q)J\Z.]"au!68ѣH PiD<1%B(R#$h*k:tcXGa`{H6C?e Gmy$dۗ*g A P)D<1$!2Y7N`` 0)A4LO Jrj㣱 P#AE,<1R P!D<1R8 P!D<1S 0%A4LO Jp P#AE,<1R P!=D<1S P!?D<1S 0%A$4LO JqP P#ABE,<1R( P!aD<1Rx P!cD<1S@ 0%Ah4LO Jp P#AE,<1R P!D<1S P!D<1R 0%A4LO Jq P#AE,<1Sh P!D<1R P!D<1SAH 0:A4LO J2sx0~dt1OݰA[2Q,uqݓ!4]sE=ƣ Yl;QӭQQU6Aϭɩ 0ҍzAz[>#/YKg(y}\QZ+I{+4WRx@-GO\:\IGU6eWǞ ЪU2{0ӝ%^g 2fN E~|]bi_RE+HPb8x9F;a|™{qs  06N2Ş'Iё 4;[ '^90 PkAE,<1$D U.J2H7/@GZq03u0vW3Y驴j]hku' P]-D<1$Bfw ma4NcG.\0aYh@ٛiךX&Gd 1ݠ 9؁X PJ/D<1#>ʤ'{ -{Kb^4왹mhyGx  0%A44LO Jp P#ARE,<1S P!qD<1R P!sD<1S 0%Ax4LO Jpp P#AE,<1SH P!D<1S P!D<1S` 0%A4LO Jq P#AE,<1R P!D<1R8 P!D<1S 0%A4LO Jp P#AE,<1R P!=D<1S P!?D<1S 0%A$4LO JqP P#ABE,<1R( P!aD<1Rx P!cD<1SAJ@ 0:-V jZ}GqBֱ ˘ rWOWMћr/gm'-s[eEY]& .c&]{#b aH@]4w@=aCu炜@B E "g(  @@@P(`hﱒEemw?v;Όd4Xpg^#j14мT`"\5Ӂa3;ZBv+Cd D%z"f}. +@O F&u y 6ݳx.5IaPO>SVf_!ӼqxxSb1%qчP0-xå__a'8Z_M@NAnP7dnPY%Y)Eʥ/c7:]A.}sQ>O a>Nw U^fVL]9Vj)n- oEV~Wѱ,|V|"ihV|銃MxR _n _O$1=Z,ULx<)wn\3>@p   j\"+fFl먕 94_W ecIɗ8aܟ_!n{R^LF;-i:~!(4jIAeg oZRW>"XHޡ 2mi?Qgz>Ė;;t&ڂ|#ےouBj9u_ cƸ:|34&$ g!(;4Q8uQQmhy}f0bVD.CxR$4C>'$]^@Zst'p3 iZW/g]`L:[P,*u5'Kvx`êԻaUI4} 9N5u;q% bDEbsXP}5c6I} ͟,hdzp'R{%c:ftB{ `VY\WRl4.E3^+*S <*jWe#} B;U{IZFоX TnQڲTa>P#N*n#孆_Q採)⺚ OYs๔( P/ɚ9HF558듘'7m2#s#@9ܙvKǮI{8]Su]"y-YA&5a!_-cˊ7t\cC4,w׭4[uÆ\s.q 1A!-!ű*x%n{IZ.1G3xq7qUlCy/yfg@†}! 7Zf:OwtQwDғ"VE@hىFO3v\67D.LblIa:vQxz-]kB=u͚Dq/UumWS dARWg v'y *y{?tiRHo3ɻ{u[|\N5`si )&ԫȬqQO#?J Nf5C0R):I1{=߅#Ou׹7"OI4gL1v6č;[.=-sPNM8zCܲ޾lZt͔]#%m>L!+ 3 W6VƲ/]lyGn|SX2.4aA\~!qX:+}cݬRȫj!@oda6wQD 7Nb{*Kρx{VUL5l&r-07܏tzq QvZ. #5VM5jE * [L!C"fؔ=I^qT,:o] qKl(3`x:3b}'v>ES埓VDÁ&s,o4g$80S&pI gxC]*0h^K4Ets{Nv˓J)/4}y\. FT'PY=1r]ǃA,273ѐSXdY٬֒k*M ֤]|t۔VGV.ƔTQgZ\0eG=Px: jPa%{c>90 X¸[]. W1h^ xD}(Jp?ஓ,bK/|c՜NԹ,<90Z`^|3752?! Q?b’Klf3dfs XXns(Iѫ̿;3Ic)ZeW)PJ?BKcEp"~e5Ty4y7 5tJni4 I 8/AҪ0NJB06:Fkc:[\XF bWjzS?:s8\!)LtgC/p TOv&@v`Pj)H5j굧c -K,@&nP,RvX/zНWUB!}F b*PM >0G^B( 3mFS[7S%js.u]L79W^~/猐V\Bg*tԗmvuwB%k wGKD^PCrTLrQqٱzUl_ڏZ4b(ǾD|2cL7d"G4ݷ~P$N@(ZyFO J_*μv{W:~PQ3ߐϱaS=""o;Zv;d5wy,EIAtw'Υ"/nXyVwۮ%nJ2@SBA,h]?Y4ZwLDouޢ!#6DR^ l;VMHgE?2!6^I.*D-^zI_dBgU-RFW }j9ëǧQVM>H~[D* 'йc`dv}1w> U1l/48A=Zv15i= y4J{?,<2rie|(&J2YCt=sX{Sc=:D&~@4ղAdLssذ,^Mpa2 N2=?F쾐t"ZF3& Jʒe[̘5NbF1GQcФ6 `8tNK\dtk} u\D <kIċfGZաQ)f@׎*nީH3vb]f#dH s;gPRx?>ƥNB4Ae!i|'L^ Rܿd2xEȤ!^o#|B!݉V]kixcqY)NL?r## \vٝ@ÅH!@!2%Z f*u\]d-6Š%!̯dj[; ((@"TF>Ӫ(eئxi,դ u?~=D&E((.B#]`.ի aUO # AHtGa0nȱ?NaM7MctVӃɹ e(Z:/! F%\3^ ^/V?/%)H;FBƅ@g-"k6ouC>gfxo6XblO2پo][eV`"Ӣ1 \L/ר@T{LH~8PGpݲ5܊Y^,EdECО{p01:7QE3@Fr: _b2Y{Ux # 2Mgf4 MebiW@ ľ$//'px(Bmy3m|&_[_}U*}O"S_6es3:{zGʐc\_ڟ*o%dE/1(J䱐k(F$Z=֏/Pnhcy wbfr oߣ.vWWvmO,˻=VJ+i]^{ypf w߫a Q2KndI}NV6yowⴎopMjzƀ@ !  ax` <\29)lV֑nnI^."ܭ|MvpT˘sf/&a®UK5侀$opsc*aKjopj}&IKB<Pި!Ok MLD5f}P|=UDqovoV]˅,-lttX|4u2Zl 6 ֘]^גa!s>vXLߡf"&r<©\D ,p6EUIƂ3" 0+J,4aU{4(T**Am;!=kpMxV&(Ä4@7VQ9Xjc+*jBΟuZy3pE S6I m2ҟAWC7H"DTr~x sNBWR3r ! 媐K{"oSBG5AmvƄ֐ؑ/Н+eQ[@q+ګ_h=3q,?QM8,ir18e'mJH}PNRڞR`ɥUCsڐ=fiAJ@":LՖ_=7"3\ MT})EHY(k#k/dJyn[#íFk- X5߬)n[-X,gC+86}4:;bPUv|{ˁmg8WdŪv_9&`$+%@^ <3 ̢JȯiĴߒ]FR:A%;Vb:;h6|%A [wiu;Rp9~,hKH}N[SH2"{++9bN Vd`rڛ^1؞6YJs< Ֆ˧LʟN!ϩܵ.Y D R--ލmc >?ڤD k 8./:rRTxPO08/IO׋{d𜤲{NΩ!w_yH"%e.XKA2ѹB1ݷ?Vx}N9=Ja TϪhI%߁Eb]A]1`}h=hXolmf)X[8iUFy7VZ>T3tQaׅȈN(*dsC=,X7> TjsԠZEx#clפ-dv7Ot4^Dv6Iey=U1xϒCu@%XG,. 0& GVbcCa(y!&}$%Qb]h\&$f=˜}T-R;7}&2=oݨ'hgy*O`>tݰڹqk SlxB@mӾӭ2a!DgOR8q򗃼DQ8zqZ4w967t Eg$ u)DI)iO-9~np}):7Be+cc&[Hiw ;>la_dg?WX;=:.m_CԟSd֑^Dl䯧6ɟĖ7+!Z/r^+)J 8g j| lOg*{ u`h ?);7 ʡt /, :B 7ecU=5|Яw:zv;u>/d3ZAhrWU!֊(L6uRUZ-0\6aE< L1,'sSdžT$lI wu@*Fλ1lc"pkX{ՓOGf6 ?01˱FQu!c~ɻA"Z,]zӵ^ l-1s g9.\DV ;YRc%/>;JV$I xL1~d+&5R3gݢ ]܂wTU?tΤ%>RhN2Х%"#WLo}$+H@u!Dg2[l @B*Ԩ hܔYDgځȉC.%Z(ρc-7]C p#pz0EddGK Qn'23QdAǞ7؀Ӡ픱H+صO(K[YY TȚkFнRcCPYGtyW..ٱnSsUR/QnPOf%Ru_+54iH:DNIg*Er,](:6t>'jgV[#:8}MA{fbO0ϖl [O"33{%g؎D"xcsB2SsNd+x y{ӕ(:KK_qKtA, .-.4oQKuqe;˃L:QxP[}dzڲ%̝5 qo![$˚ ] D3oK Ѧ = jyKfVHo5;&R 9vd/ͧwfL|q EcVWME9C Y6২u w wMbZo)_l鷾{`>;u}0 U<ׯDVbe"݊0huY ^wqtAZ?8s o~?16aK 8Ywޕ= $ 4ܭ0wX<8imQp\kU"[pk w^F(m>%-Y7F}5D2{$ś yZGsg}JnG,F58'yKlQ 'FnjsEn/V lݺvZ0O'X9,FEèV oXJEpq@re%V"d9$RyDUBmϭbk+bTk34U?zC&{5ZEPd*]뼰y3VB}"J/B͌E~3xq1@ne-_$1<lm#>[4˕g(YO-ddqŠ[`M^bj+ ygJDq̸w}QaلIVWߛFXk:pR4ָ<7 ?J='P1$w޶lΔ^m(X}8!:ܰ Pmc{)WV t`Ղ%S|n0"yjQ`9'|=tAP,=LFV{f mR= )4ʮʺs~jBy 10nҢ(PϕԒTQyw/kGxt)VAq$;12jWaH:n0T~.TXx}D078nξ_B>_k$\ n$gE?MR U I5bKBx(7h8fm~,窱hC8d@j۞ ƕXL"h;!,IVc$W;'#Alye;"i H k21(҉` C*mDP-ŹnK>HlK{)rMn@pZJSR+q":vtM"Rf3a%A>b#9EXjrwٽ jLC0SP_1m!z=0G]NЮmD28v"8>tG FKiVÛgI$No-W509t,яsy.{Xi=58AJ@%6ZpDe]0hy?7ͳ c+ݚXk =ah`nY?> F+KkWǏpYn_FNldc'pX Z'SqUnYg cO3Ѭm 2-h(-y4VmШo՝5 Wkx7M$˳ 2@t8^P,ܖ{{#9L? aK}; SZh,yb#*"KxBzR^p{ u8iv|Jf?jat'`֥A;CU7-lsO ޤHD#49Y6i?6^DQb9IR#쭊LJud579X{=+nԐL]2$nFbsW9osƺ~Ç`N.zH>,ޘ(.lEhz9[\}}Dh#M7cڪ>^7մc-͓8i܀` N<$Hpj,zQ}Ǽ_#At"ڞ&Nte1d| rݰWUUg 8QBDYؐPX)&@.*;wN%~J}=Ǹ2ț[v^SR t4CmZ/\S|;D CÖ&k+mvIbk-SPL(#fSaZ@h)'==WqZ@U Їw uHvi\H/5cTԁ|ŶmUoѿgN騛ljnQ_xُ4(pC(iˀ$:ޑA@=^ b2p?$nW9bd': &lDB)q)!2895;}8j1,p8r_eҼ6:ɟ `oB:;,& TaF@'Uϗz%CF-.m[ӯ陵+('&P9tN0H}:/Ba{H8eTAw&Ai*@CP4%sn,&/3Ϥ5 ')WSLFxj 'k~IWfB AY_!"n-P$ViSTMw?D1B1wv-ǩHmdn$',Ln$:db``}! K&#*1ꈼNKN@9SͭN S3x!Ū,m\Nx'& wJV,Hގ9knI xn5}<>d> I*JȄVBRQLj$ k*aW@ڽ/C6Ɛ4K-Y&4J҆&ccf@*oq( !#S|ͻWÉ'u B*ߜXB$v̑ȮɌj/#\JB&"$ /z_`i|v*-_v?=b x70'K14/2.G /5kaC9޻D a6]zx^ʫ1wm IAM3=ECx?8w{ {xP < ߜ/t'l%ni^]ҲPudnN0[@sߤ4-62nkS(‘h3QXoEeَz:me#|{4P%֖*}rLQL4&byK*g v$V9]m력lWSS*1J836 Uf ʡQKv8a;ʊx\7(PFZz +!UM\YFP"::Ր!ocm>{-x pxƄ S }D%„8 J)炨T|\8M9Ȉ5LvjƳ(d[*TH w'}]`z۠- X9xI'}{`z@eJ 90B>y܃Lk ֶԲw0@_KmRB.weʃ~55f6Rʿߒ{ǒ6, Nu:p4o׍v&h(#>ʟS;^8ƭx+\J)}]x>z:i"Bk>OIwmMop+@~]Dԉ!(Ͳ^Dm`_wb&FeKy>f#{r@U&'-=`yd >Im}IFA J# )',ft@o;+&bLBTF b4a n;ePr+Ұߎ"آ (NJSu\oYd#27aS*ȩeMQp6mMk2d+nKl| J4Ў22o qeLQl ZJ5}tM3?_WD32׆8Q^޻X-{#W1t=341^9&hfsvJ^ЯœjkK0ˆko"k`ȬHe),5':*01Rp+kK|2̊=N*ǢO5Ȁl~B{<0Q/bSK _c;=wd-@XFS z,< k rfx!G$J6'C: aJvb;E,]G˾ޙw;ɒƩgͻwK?jjӚtb>e(mܾjP2i\uH4 >^^|.5Ffh>Hw-bڂG{%D /َdJ]br\ HIQqrgQM؈Q1r'I~kHj+sgxOxP{>4hf{َdf=0DP~̙#"{r<9ּ*[Q3vؤ]N׷8/ TSMej`\@W2y0+G .+EoR}嚧^ VqcⲯO%|E5=÷KM'(yY`3jU1H¬5*/vCmȮ]]'剬4Sΐ_ 2M7ix{#~ggDTk)YX/_5|ȴzv'Od},]%B/\ Q91igK\q{/2x32/$ u oL 9}^^vҵޏ5Q!) ;Sדt{H.~p5l6,0A2[iq8M#[7B X>Aļ!J+ bU=\T3oH۩S4w(HR6޻;!1 8/L *|a?]&Z5+O䴸2lH 津Iou J$ VvpbVNQ<\[hny9w*/\V)E!Lv6c]zv+M; Qy'THAyJWK?H&T=x#RDk9FId?Cfk]LX18C"(T2Vpyխʆ`"7֋PCc 'A 3  !4q0/6a,rT2ɣ^3|.`3ܜ3UbC(E=l%=[#c1uN$;8_6ui sIgыR@~A2Nv~fCgȽVJC2\22o?=i/oR\< s̾(L<ў2ӈgKFg#f=UNsf(hΚȰ<58 3#ُLwA^2cx{[ii hW??é/_eG:AG VJ@Q $/oF7)R&;K!J*`H)ǀVV f)&qaNXRYjɳWt|J=ϼmkY՚čn55q:4lieNxtg2>1 jݗ)؛(wޅ6e=t6DVUnQ*e3+*!>4psBⰊ熖(^jaX'mueh&0tz)Pu6L橏̉#gIMi \QE/Ln5c]_ ] >K4XdbyEt,{AgpzXwc\ ZˍUq^_Nq05جSEBS?zڦKpnK\.@P.!qY ɟ<PByQoǂƑp^$@ 0wA$ґ ~wuKܙKBg$% GH T+>PT<`x,yyQ'o'zynѤ~!{bڢV8zPcB#ƜQXgQ1 P P(ABBj&  dG( P3aDj&Sœ~trjSx P!cD<1R@ 0%Ah4LO Jq P#AE,<1S P!D<1S P!D<1R 0%A4LO Jp P#AE,<1Sh P!D<1R P!D<1R 0%A4LO Jq0 P#AE,<1R P!-D<1SX P!/D<1S  0%A44LO Jp P#ARE,<1S P!qD<1R P!sD<1SA 0Ax4LO J#/1g . kg6zTUh%sPDQ2=܎du*pGmi*cqGRm"$4?怂k&^+ӇpxvȀU/q=BMv7=Q15Yãʝ/ʍsڎZ-IP[GW6ُR[?p P+AE,<1k?rqk .H P!D<1R@ PD<1hMr6h9w'1{ZՕDox()ގ("5\K)UFᇾI%PE08;܅IA5 P%˕œə\5W@` 0qA4LO J+<5 c,8+#)0H—t|STEq_@: nPa-YA P.AE,<1H T102ց PHD<1GTtN.=bA-߶NYa>G/m 8 P&D<1}O9(! 0%A4LO Jq P#AE,<1S P!=D<1S P!?D<1R 0%A$4LO JpP P#ABE,<1S( P!aD<1Rx P!cD<1R@ 0%Ah4LO Jq P#AE,<1S P!D<1S P!D<1R 0%A4LO Jp P#AE,<1Sh P!D<1R P!D<1R 0%A4LO Jq0 P#AE,<1R P!-D<1SX P!/D<1SA/  0!A44LO JwIii$M E|#(ETh2ʦ QA'=с?!t1= 7'U eR?.Su)MnLm9,v9ڴ+9(R]jG?IA0B0I!U"0!cfx|)c\edB빇j@}{\j8:vRONBYaG0؞FA]Qnd :|=qvjt~؅hӝG͛[@Mׁ PIARE,<1HrvvT3 +eDArh4g PhqD<1H1c¡J% B '3Q9r0C3 6 #՜[}m P+sD<1u? 0&Ax4LO Jp P#AE,<1RH P!D<1R P!D<1S ` 0%A4LO Jp  P#AE,<1S P!D<1R 8 P!D<1S  0%A4LO Jq  P#AE,<1S  P!=D<1S  P!?D<1R  0%A$4LO Jp P P#ABE,<1S ( P!aD<1R x P!cD<1R @ 0%Ah4LO Jq  P#AE,<1S  P!D<1S  P!D<1RA  0A4LO J خ4 T׆rkփ|p%[DW_.`;FW^tkZYAg7+(WWUZ9.Yp۩YE9*V,1`@  PAE,<1J,6>Ob䒵fte2ࡂ91~tқ4YM$7d ZwB͂!Vп#q< MF]ɞ+a h P+D<1 r1?πс  PCD<16ew)7NCW&XO:h,8iWP〣  0.A4LO JǂiU~@ 0 P#AE,<1R  P'-D<1p' X P!/D<1S  0%A44LO Jp  P#ARE,<1S  P!qD<1R  P!sD<1S  0%Ax4LO Jq p P#AE,<1R H P!D<1R  P!D<1S` 0%A4LO Jp P#AE,<1S  P!D<1R8 P!D<1S 0%A4LO Jq P#AE,<1S P!=D<1S P!?D<1RA& 0A$4LO J: 1i\I z/(ЏSc?;mE~ ]yPf HMe @;W}K z.!Mrv)NKQRbN_WvxCu 5@?;a*'d3B;EOzb@ |u8(*&܎E{!Xf)QZa5ةWÄɌxӝ(!E_Dc<9^q תÀ~J$PS K*ma$P P1ABE,<1ؕ3ԟ`( P!aD<1Rށx PPcD<1fJ:=O O+ܻR+3E03$qNa2 Z1٨O[@ā@ 06Ah4LO J3Xg &_mT,:@ѣ P-AE,<1K.=! P.D<1T",zU}: P%D<1o͢rN 0%A4LO Jp P#AE,<1Sh P!D<1R P!D<1R 0%A4LO Jq0 P#AE,<1R P!-D<1SX P!/D<1S  0%A44LO Jp P#ARE,<1S P!qD<1R P!sD<1S 0%Ax4LO Jqp P#AE,<1RH P!D<1R P!D<1SA` 0A4LO J< j/p2c;$ )3TRSk/p۸toa"1U(<28utGyVčr vm-,LGcb /늷8"ĥ-xNX ">s¡0= @>#-N/Srz!_.IPBڝdy_m,6C,S, P+AE,<1Nj8|.0 P!D<1R@8 PyD<18uʔv+=:Yk(Qr3Aw2,vBr-%$6,4e͵{>`aCFW).Xt 0nA4LO JμXx.[G}߶Q.f\ &ȵ+h3Z5޸j5ͺ< xօ7$=2q P.AE,<1V`% _{7 PT=D<1|Mb _YIM  ܰ'HfΦA7[^#2E4t P!?D<1R 0)A$4LO Jv] _WP P#ABE,<1S( P!aD<1Rx P!cD<1R@ 0%Ah4LO Jq P#AE,<1S P!D<1S P!D<1R 0%A4LO Jp P#AE,<1Sh P!D<1R P!D<1R 0%A4LO Jq0 P#AE,<1R P!-D<1SX P!/D<1S  0%A44LO Jp P#ARE,<1S P!qD<1R P!sD<1SA< 0.Ax4LO J|Р!1mGV<{ȤqIA̘ر&XbuhB9%T6;TsNS1Y/c%aͼ(`~R%*}J0LDC{cvk.p uv$s6XǮGD/+"QBqQ@\w[GqВM69K/Tш|J{~a@,J~0@x9r'&u 4y_Լ_t+um#ټgY஥' Y>iuB!Nf=O~4b㌪p`,Ƿ@ P)AE,<1p%xLL P!D<1S PpD<1[2)p`0fӚ=1WBaizw9ղҷNo٨(Ik/+*n Ё 0BA4LO JG^הH|ݭHB `2㧜Ѵ أ P,AE,<1 *,]Łh P7D<1I̲1Kρzp|^㊠ P!D<1R  0%A4LO Jq 0 P#AE,<1R  P!-D<1S X P!/D<1S!  0%A44LO Jp  P#ARE,<1S  P!qD<1R  P!sD<1S! 0%Ax4LO Jq!p P#AE,<1R!H P!D<1R! P!D<1S"` 0%A4LO Jp" P#AE,<1S! P!D<1R"8 P!D<1SA# 0 A4LO JIPM<-;z>yO wPjZu#m0i^cuUpB-"<(sYsʺβNFpGF҆!Ef"wO%wODaJW HW9 \UA:^S t JSݮW7 eONln;(qim__ƠVQۊ\:,_G&᣹" P+AE,<1p*lW" P%=D<1[9" PR?D<1=Z]) M!b7EjW ̀u%2􂥏3ȺByЁ# 0BA$4LO Jpx¦[כ+f+ҋ >`#P P&ABE,<1h i؁#( PJaD<1=Z]()nlBfF[8h!3Yd2[2=v.*@-#x P!cD<1R$@ 0%Ah4LO Jq# P#AE,<1S# P!D<1S$ P!D<1R$ 0%A4LO Jp$ P#AE,<1S$h P!D<1R$ P!D<1R% 0%A4LO Jq%0 P#AE,<1R% P!-D<1S%X P!/D<1S&  0%A44LO Jp% P#ARE,<1S% P!qD<1R% P!sD<1S& 0%Ax4LO Jq&p P#AE,<1R&H P!D<1R& P!D<1SA$& 0A4LO JFr*m$:Zv'˼4$a+MIQӋ[B׿f>62剌c{B\qpչSb7I'>cR2"Zj<]EG5vkvэ@@:MTZ kK';> 5W^ʶ>Y ;FUz~}7 ZEjwR {ˋ;IYy 'pCuP E "g(  @@@P(`hﱒEe?mw?v;Όd4Xpg^#j14мT`"\5Ӂa3;ZBv+Cd D%z"f}. +@O F&u y 6ݳx.5IaPO>SVf_!ӼqxxSb1%qчP0-xå__a'8Z_M@NAnP7dnPY%Y)Eʥ/c7:]A.}sQ>O a>Nw U^fVL]9Vj)n- oEV~Wѱ,|V|"ihV|銃MxR _n _O$1=Z,ULx<)wn\3>@p   j\"+fFl먕 94_W ecIɗ8aܟ_!n{R^LF;-i:~!(4jIAeg oZRW>"XHޡ 2mi?Qgz>Ė;;t&ڂ|#ےouBj9u_ cƸ:|34&$ g!(;4Q8uQQmhy}f0bVD.CxR$4C>'$]^@Zst'p3 iZW/g]`L:[P,*u5'Kvx`êԻaUI4} 9N5u;q% bDEbsXP}5c6I} ͟,hdzp'R{%c:ftB{ `VY\WRl4.E3^+*S <*jWe#} B;U{IZFоX TnQڲTa>P#N*n#孆_Q採)⺚ OYs๔( P/ɚ9HF558듘'7m2#s#@9ܙvKǮI{8]Su]"y-YA&5a!_-cˊ7t\cC4,w׭4[uÆ\s.q 1A!-!ű*x%n{IZ.1G3xq7qUlCy/yfg@†}! 7Zf:OwtQwDғ"VE@hىFO3v\67D.LblIa:vQxz-]kB=u͚Dq/UumWS dARWg v'y *y{?tiRHo3ɻ{u[|\N5`si )&ԫȬqQO#?J Nf5C0R):I1{=߅#Ou׹7"OI4gL1v6č;[.=-sPNM8zCܲ޾lZt͔]#%m>L!+ 3 W6VƲ/]lyGn|SX2.4aA\~!qX:+}cݬRȫj!@oda6wQD 7Nb{*Kρx{VUL5l&r-07܏tzq QvZ. #5VM5jE * [L!C"fؔ=I^qT,:o] qKl(3`x:3b}'v>ES埓VDÁ&s,o4g$80S&pI gxC]*0h^K4Ets{Nv˓J)/4}y\. FT'PY=1r]ǃA,273ѐSXdY٬֒k*M ֤]|t۔VGV.ƔTQgZ\0eG=Px: jPa%{c>90 X¸[]. W1h^ xD}(Jp?ஓ,bK/|c՜NԹ,<90Z`^|3752?! Q?b’Klf3dfs XXns(Iѫ̿;3Ic)ZeW)PJ?BKcEp"~e5Ty4y7 5tJni4 I 8/AҪ0NJB06:Fkc:[\XF bWjzS?:s8\!)LtgC/p TOv&@v`Pj)H5j굧c -K,@&nP,RvX/zНWUB!}F b*PM >0G^B( 3mFS[7S%js.u]L79W^~/猐V\Bg*tԗmvuwB%k wGKD^PCrTLrQqٱzUl_ڏZ4b(ǾD|2cL7d"G4ݷ~P$N@(ZyFO J_*μv{W:~PQ3ߐϱaS=""o;Zv;d5wy,EIAtw'Υ"/nXyVwۮ%nJ2@SBA,h]?Y4ZwLDouޢ!#6DR^ l;VMHgE?2!6^I.*D-^zI_dBgU-RFW }j9ëǧQVM>H~[D* 'йc`dv}1w> U1l/48A=Zv15i= y4J{?,<2rie|(&J2YCt=sX{Sc=:D&~@4ղAdLssذ,^Mpa2 N2=?F쾐t"ZF3& Jʒe[̘5NbF1GQcФ6 `8tNK\dtk} u\D <kIċfGZաQ)f@׎*nީH3vb]f#dH s;gPRx?>ƥNB4Ae!i|'L^ Rܿd2xEȤ!^o#|B!݉V]kixcqY)NL?r## \vٝ@ÅH!@!2%Z f*u\]d-6Š%!̯dj[; ((@"TF>Ӫ(eئxi,դ u?~=D&E((.B#]`.ի aUO # AHtGa0nȱ?NaM7MctVӃɹ e(Z:/! F%\3^ ^/V?/%)H;FBƅ@g-"k6ouC>gfxo6XblO2پo][eV`"Ӣ1 \L/ר@T{LH~8PGpݲ5܊Y^,EdECО{p01:7QE3@Fr: _b2Y{Ux # 2Mgf4 MebiW@ ľ$//'px(Bmy3m|&_[_}U*}O"S_6es3:{zGʐc\_ڟ*o%dE/1(J䱐k(F$Z=֏/Pnhcy wbfr oߣ.vWWvmO,˻=VJ+i]^{ypf w߫a Q2KndI}NV6yowⴎopMjzƀ@ !  ax` <\29)lV֑nnI^."ܭ|MvpT˘sf/&a®UK5侀$opsc*aKjopj}&IKB<Pި!Ok MLD5f}P|=UDqovoV]˅,-lttX|4u2Zl 6 ֘]^גa!s>vXLߡf"&r<©\D ,p6EUIƂ3" 0+J,4aU{4(T**Am;!=kpMxV&(Ä4@7VQ9Xjc+*jBΟuZy3pE S6I m2ҟAWC7H"DTr~x sNBWR3r ! 媐K{"oSBG5AmvƄ֐ؑ/Н+eQ[@q+ګ_h=3q,?QM8,ir18e'mJH}PNRڞR`ɥUCsڐ=fiAJ@":LՖ_=7"3\ MT})EHY(k#k/dJyn[#íFk- X5߬)n[-X,gC+86}4:;bPUv|{ˁmg8WdŪv_9&`$+%@^ <3 ̢JȯiĴߒ]FR:A%;Vb:;h6|%A [wiu;Rp9~,hKH}N[SH2"{++9bN Vd`rڛ^1؞6YJs< Ֆ˧LʟN!ϩܵ.Y D R--ލmc >?ڤD k 8./:rRTxPO08/IO׋{d𜤲{NΩ!w_yH"%e.XKA2ѹB1ݷ?Vx}N9=Ja TϪhI%߁Eb]A]1`}h=hXolmf)X[8iUFy7VZ>T3tQaׅȈN(*dsC=,X7> TjsԠZEx#clפ-dv7Ot4^Dv6Iey=U1xϒCu@%XG,. 0& GVbcCa(y!&}$%Qb]h\&$f=˜}T-R;7}&2=oݨ'hgy*O`>tݰڹqk SlxB@mӾӭ2a!DgOR8q򗃼DQ8zqZ4w967t Eg$ u)DI)iO-9~np}):7Be+cc&[Hiw ;>la_dg?WX;=:.m_CԟSd֑^Dl䯧6ɟĖ7+!Z/r^+)J 8g j| lOg*{ u`h ?);7 ʡt /, :B 7ecU=5|Яw:zv;u>/d3ZAhrWU!֊(L6uRUZ-0\6aE< L1,'sSdžT$lI wu@*Fλ1lc"pkX{ՓOGf6 ?01˱FQu!c~ɻA"Z,]zӵ^ l-1s g9.\DV ;YRc%/>;JV$I xL1~d+&5R3gݢ ]܂wTU?tΤ%>RhN2Х%"#WLo}$+H@u!Dg2[l @B*Ԩ hܔYDgځȉC.%Z(ρc-7]C p#pz0EddGK Qn'23QdAǞ7؀Ӡ픱H+صO(K[YY TȚkFнRcCPYGtyW..ٱnSsUR/QnPOf%Ru_+54iH:DNIg*Er,](:6t>'jgV[#:8}MA{fbO0ϖl [O"33{%g؎D"xcsB2SsNd+x y{ӕ(:KK_qKtA, .-.4oQKuqe;˃L:QxP[}dzڲ%̝5 qo![$˚ ] D3oK Ѧ = jyKfVHo5;&R 9vd/ͧwfL|q EcVWME9C Y6২u w wMbZo)_l鷾{`>;u}0 U<ׯDVbe"݊0huY ^wqtAZ?8s o~?16aK 8Ywޕ= $ 4ܭ0wX<8imQp\kU"[pk w^F(m>%-Y7F}5D2{$ś yZGsg}JnG,F58'yKlQ 'FnjsEn/V lݺvZ0O'X9,FEèV oXJEpq@re%V"d9$RyDUBmϭbk+bTk34U?zC&{5ZEPd*]뼰y3VB}"J/B͌E~3xq1@ne-_$1<lm#>[4˕g(YO-ddqŠ[`M^bj+ ygJDq̸w}QaلIVWߛFXk:pR4ָ<7 ?J='P1$w޶lΔ^m(X}8!:ܰ Pmc{)WV t`Ղ%S|n0"yjQ`9'|=tAP,=LFV{f mR= )4ʮʺs~jBy 10nҢ(PϕԒTQyw/kGxt)VAq$;12jWaH:n0T~.TXx}D078nξ_B>_k$\ n$gE?MR U I5bKBx(7h8fm~,窱hC8d@j۞ ƕXL"h;!,IVc$W;'#Alye;"i H k21(҉` C*mDP-ŹnK>HlK{)rMn˂W0-1Z t^۱ߥLŸa RCX :Љ>k[:rsl4@1> 0rՈ ͡ʨ HloGikc̒lM8e?gT;-4K]^[Ȥ8iZT\[M׀vA_[D܌!\ ]Q䋋X+XkddObhFn:% FyGoTYfqIrUuo+z !D?QHGm'rs>| hbCP;lnnN:xjPfk83LBUÛۉ86 6o}y:^e kb_e$No[mEޝ\Tמc'D-gPQ3)8cy6|6/G JYB874!ښfP|sկNtD;%7R#K]]/nК5^=A~Fb,MdL(}N{[X$Y!iGr@2P33(rMwaV!5}DmUy;*S1cŷ mn~~+V=j.4Is-݄P#Ce;7<JhA-Hiz_ dcE=J;&ȚO.4Rn>^=t2oVE}7ՠ2|݃=BBpH663AӁ@н/ɋ!rҪz1E[r#y[3 a5ȯk]:r9E8x_%țq 's2#m_ nA0Djٗ-+WcIAV SJ˛ܭw+iI ^^pw_4DD |5WFsb (J{bC``D4mkms.;uk8fk/f =o6Pɇ7ɀkl;2]4#ja^քCj ǔ /_if}::3jЌSeEm1=Jg421N`#U#,;kR'Q4wn7ڗ=q_aƤ~E OO2#jC^p^B2ػ[fDYOv^ \f "PBq)rk29ݕ#>PfA iۗ TF#$yl jWp<Y %]V;r(^[kt+|U]q]Ҧ#RjlPSxw61{2X.k fHUFt79hVw--wB~=*j0!yz&{떴q­(e/Uq!e߯MA)r14ۓvQKS5g匨"Rjv? 4y3aeZ^}qEH7Դ$"agKvHpjי6A*r|QnbN \.hς7sb5f3gHcqݔ*N~:XqM E3n}G<͉M,-} ߣ͓0OHUomqo(AG[Yy@(2OD{)#J~b%nΧtA+ XwnoLVtB~.f|Q ;ҥf5DZO5߈tb>e(mܾjP15y\uH4 >^^|.5FCh>Hw-bڂG{%D /GdJ]br\ HIQqrgQM؈Q/bGS*\J U1aC)2j>XJ|.WB+s@B*Wq )b qij iSvЋr;XZl^ yhؖqψ~|ح?X#4Q>ulBePIt콹l8\D$B? )J6ԭ2D_fk$G!de"I'?vF"䠁?uQhi1U0kmBN## )C|BF'?ʉ[A95W I|sT'Z(`\BKR{ w=23ua"(@ F " ̂^-娛{PB.D3~J~*f)yg}ag0 ? Hѫ&@y;Fe$INآ)>rSYOp+7\YpmqWÛ^kmQn> Sϓ<-y[yE^Dr}aVjCQCmȮ]]mkg+.uϯq 26?ھ#ugeD UvR4^"\>OirXK&_*1P sjcdΊJV^4jKR/Z`rXlޙ(rȼRkDon,3yF+P\)è>(j0nXH2e..2Xq8xJC6n ,1Y|yjC,P>& a',| z&cof&&N_hQScmwvvC"c]O p_@Un*M´o{f41ɉrǁde<5ʹ_`iJe3YFlXH"$x.նRsET? j(¼tqq72a fsڻ"W|*kӱXiZ6P za| ( _,S/Q##SoAI,'I u1`4S4OPyئDBd? E̡$'}F)$zhZ>" !4q0/6a,rT2ɣ^3|.`3ܜ;{UbC(E=l%=[#c1uN$;8_6Lvqi sIgыR@g/F2Nv~ FgȽVJC2\2o?=i/umھ[l s(L=Oў2ӈJ䖶k#f UNsf(hΚȰ<58 3#ُLwQdd6 3`Юd@GS_P;0-Pԏ1t cUx@FB:{[-"ϵлn;oOxY#ر oCB?rg -7B߰ 2\~'HPƂޘq{FJ["J*:ƨ̵p$tCvvlZ%J׏vtR%z1N#@O\@Ј}>9S.w iO|emc Oi9ey  ·h6'UC[6yzdd0Q*su ޏqVX[`XͺEX/bYވ)eK ˚6T9җQ32@*ɼY'iF*D.4*pv8i!^ꁲBj(C&9RbQ&x=q~x1N*;\DvQSAN< k1N3 sVM̢sQ}l_3Z$mq|2[֖QJ=Fx:c.Vqa퉾!b~SoYq!#CoEoeXjoe|¯FPZC2?<~2CHW4.+xilq&]>^wD/E*W&ɞ1$l~I)!`(ƣk+wK6guf ,_^(Eh93l/Ual|ˁ]?ZTYqcyj+·;tW)u|8Ð/k;if6/^I>?B$a&~K8>hG=XkB-)mҝ([=|iF{9YԘ "8&h~r(Jg]T k= .=K>|63ZbX*: M8^~.?=Y|$y 0bA$ґ ~wuKܙKBg$% GH T+>PT<`x,yy%{[ɼn4` ^56m@ H) P P"ABBj,~( P%aDjxɒ~Hx P!cD<1S@ 0%Ah4LO Jq P#AE,<1R P!D<1R P!D<1S 0%A4LO Jp P#AE,<1Rh P!D<1S P!D<1S 0%A4LO Jq0 P#AE,<1R P!-D<1RX P!/D<1S  0%A44LO Jp P#ARE,<1R P!qD<1S P!sD<1R@ 0Ax4LO JI1I7 b/nWgC!.TE_0Xuf0b/R "*G}g#}5 c!Xj{u4bk&YF^K&߱͂^pU4^`FQ Xu TG!Ġ駤 R?]{9Ry&s H9p P.AE,<1p}vU2;5F H P!D<1R@ PD<1[ GݘbE }Cq.bE61N' x\rh8'DKOb@y'jRt~OCPv 'G$Ul}q@` 0qA4LO JIo{4H>%kJD>Rgl= oC (b~Y-d 2hN&dexj P)AE,<1<!7Ձ PGD<1Z'sĘlaqz^7(6~ᝨ?8 P)D<1X9^/^,:ې0  0)A4LO JzE+|w P#AE,<1S P!=D<1R P!?D<1S 0%A$4LO JpP P#ABE,<1S( P!aD<1Sx P!cD<1S@ 0%Ah4LO Jq P#AE,<1R P!D<1R P!D<1S 0%A4LO Jp P#AE,<1Rh P!D<1S P!D<1S 0%A4LO Jq0 P#AE,<1R P!-D<1RX P!/D<1SAB  04A44LO JF2*Rghv\NTqӌ|wɷ伹0Ê=^/:~g c0΄rn%,yx?Ʈ O43@\P3~_E1^ïm@ϭuRAvR][ҫrawRjD"PBY.l„/cvɸqC]ӡ)fpMğځ.qy>,P C_$E8̃jqX8]a*2_3g멳W[B>vI ͔ m5sj0 P4ARE,<1TcI6WT!_b(R@ PhqD<1U=ݟEu-AțwVҨ4g{*D8 XQ94ڱsM|y;Ew P/sD<1%H, 01Ax4LO JoX`M*p P#AE,<1SH P!D<1R P!D<1S ` 0%A4LO Jp  P#AE,<1S P!D<1S 8 P!D<1R  0%A4LO Jp  P#AE,<1S  P!=D<1R  P!?D<1S  0%A$4LO Jp P P#ABE,<1S ( P!aD<1S x P!cD<1S @ 0%Ah4LO Jq  P#AE,<1R  P!D<1R  P!D<1SA.  0 A4LO JF~K+w3OކaPVKm\ %B%bnGүW.21J(۞rŭ- F\kzF l {mn)tPg pV(LO]#r^V#nPLNLx<86mKV=+dA7'%r(cz؅]إf/tPL.( g yh_,=!f \mº Od7(5(f)_~2)p@  PAE,<1t#C%w;s Wk3~/Ѻ7i(e[A=@){0 WrGyKlLaRfsLpL#Vlx/ffR PY=[8OEUN%tY h P(D<1p51GO  PZD<1$~rbQG] WJ?FYgo;.$ (ƘordLrAh4LO JMScuun\%{! H;e P(AE,<1N%r_|ȁ P:D<1='iH%OGU c:<54*` P,D<1xܻ\jp 0%A4LO Jp P#AE,<1Rh P!D<1S P!D<1S 0%A4LO Jq0 P#AE,<1R P!-D<1RX P!/D<1S  0%A44LO Jp P#ARE,<1R P!qD<1S P!sD<1R 0%Ax4LO Jqp P#AE,<1SH P!D<1R P!D<1SAh` 0ZA4LO JDv0O-/ a95p ED:i6+r|o)3 i]O HjtNRdw  P!?D<1S 0%A$4LO JpP P#ABE,<1S( P!aD<1Sx P!cD<1S@ 0%Ah4LO Jq P#AE,<1R P!D<1R P!D<1S 0%A4LO Jp P#AE,<1Rh P!D<1S P!D<1S 0%A4LO Jq0 P#AE,<1R P!-D<1RX P!/D<1S  0%A44LO Jp P#ARE,<1R P!qD<1S P!sD<1RAU 0GAx4LO JF^6g[D5 u vLWDA3V/DD::ks83qaTpCа2oA9iHcuhJ*aq2vsyrJjǸF ŵ :^zX[ _ItTSP)Ӓ9s*#0Dw@7Ϝ\rDRNOTłOEs@z=E9p}g=yQaK6 ߁JT* 1}4H B'D-a_Ձp PGAE,<1XD{'I_xTF 61].W@H PD<1յːS7,F>#UҞNVOQpZ}YQ]gDz-O<Z?f"ޚ%ߖ7ސ" r{OTZB_Ԃɝ]8࣯ P!D<1S` 0)A4LO JHw& P#AE,<1S P!D<1S8 P!D<1R 0%A4LO Jp P#AE,<1S P!=D<1R P!?D<1S 0%A$4LO JpP P#ABE,<1S( P!aD<1Sx P!cD<1S@ 0%Ah4LO Jq P#AE,<1R P!D<1R P!D<1S 0%A4LO Jp P#AE,<1Rh P!D<1S P!D<1SA 0A4LO JFؗuދ RIͱ+RN X51m%VA,Z"`n~! o=nrq$cxR@CT3 <;$%a/ٶF>}C61=0cgTxyty%lyV"`)C5ZjZ7>7 Vi$Vo@ P-D<1<+e~oЙE,//ӤD)>I n+ZHJT.$ZT8'`&K䞀A' D#M9Sy09JH۴5n"J@zX Pa/D<1<+៞Ύad86(cNy^Gux$rL@)}&'`%zg  0.A44LO JYCVz  P&ARE,<1Ty懠 P!qD<1S ѣ P!sD<1R 0%Ax4LO Jqp P#AE,<1SH P!D<1R P!D<1S` 0%A4LO Jp P#AE,<1S P!D<1S8 P!D<1R 0%A4LO Jp P#AE,<1S P!=D<1R P!?D<1S 0%A$4LO JpP P#ABE,<1S( P!aD<1Sx P!cD<1SAi@ 0[Ah4LO JDrX&G u%("x`~ NB2o11pwt"m'ҽ?-6a>&g3ڎoRp|#ROOмDĒV+s:vi16ڝ77v,ac3pG;ϴ1!1QjZ€VEY3"& P$AE,<1U`<h P*D<1?ljA P!D<1S  0%A4LO Jq 0 P#AE,<1R  P!-D<1R X P!/D<1S!  0%A44LO Jp  P#ARE,<1R  P!qD<1S  P!sD<1R! 0%Ax4LO Jq!p P#AE,<1S!H P!D<1R! P!D<1S"` 0%A4LO Jp" P#AE,<1S! P!D<1S"8 P!D<1RAl# 0^A4LO JETRW,'Y: A@&W<Y=U chTZ|7)˪XGrf8![Ȫ_f+[򱣞LOlm֦E>|1Q7Cow<[KuqjI OP@(FI <r|#!x gXܿf ul">rk(kvdudcrR/Jx׳`pSk'N ^u0@+;P>TgB{#)ʢ?)5,Md cZN>\Do"ݶ0cx@z9MW\/4g>XgAGE]*nbq~G$$Lap|U鎶ѭ2\=ߠgi;.̜JIQ1 DaCIj7 ˊ]3# G &\=$&vQ1ȲQaJF%kF~sVĎQK Xj9BYݥɜ`DĖx*qQ{{ֲr@eYd>r+7v22[dDi<1< ?;LF0,owƚ{w̸d@M)Ξ-׀(ú+Fq{xPxlSlC87K uƴm$w`܀ ]zu_K,ھaLrbQcDS(Gm9/q< qXLW<_lDTJWшejd B*n}^DyPZ>^dz)LnZ2 5.3s0w IVG'2):@jfVYCj:m&rU.\u2 ]ב>╠0E-{Jk.3qB|&c-VVwE26[:}bV4/v~ ŘQIG(&L) rb")D>عW7eAFpi\I6.,AbVj wIb4M;cХ觪*:4FhuK+jfhB.ʺN. {xlξ%ѣsːxz;]^VdD徧#(onlc$lQkY(MmПΣN2gV [݈ٮo`g # E4l:026Tknz)]w;`ktUWH[ *WX:!h1xj0''~EZ?7lj$5]WHEqwlz~hPlu7?,L g wqiX"wCPnUMsv+oEV±Y ǽQ`uMԋ蒔l*=q=w[_#Q^@٩QHep5.J"Pa#+Ӷk@Tne3bsg^>byrp#e/ Ww*XG !=w4 )9e, HVV-RrL7P W P]U5c4[+:jS\sG}:uf^zr{ =^|MdpŮ7ou·z6n6OLǿ+)cWֹE'fq&P›"v.|8񟥘:P o 8[d(DgEWaW^BPF1s6c=u37 wDk6r6Tǝ kxNm.j*]ԮNH~uF/(qC&:%'# 8*LR#ZވMc},Z}#22"5P}%IYϨgy;T`U!lL*Oa{> 츳 2 ZwN.ΊfLc NB_JS`v=NΣL2,aׇuOqӘE.i!|yD^lV7Fes ~u(+Z2~!ޞz&d!N[^d+CjXη 2<鍖|GJw@J2NE^ t;tOIvP3ϑ"X"܊hvmA c%:nks&ʴȀy-t]lac+hH/e̋=kHyJ1;I/ΟO`_NFٮ9BYk%sE50#MB&kܧ{bTJgi|?HTA 9z45UIPQ4?A+z!hk+ nv$M@S $FH%6(b,a}rOI $Zh?=ע9(vd˾9#T hCl"Ʌt5'g-5N D3NK`Р%VE&Rx 3[| R;"sĩ6!%ԎaEp?㏀ϺW@2{p]f>U5(Ҿ|u03tʳ(;<ģ(<_?Gppy`ژ3SS¿vo B]mcv\**{zx 9)#W\}Ga ؃xXq*_0f&=kbw{oL6$mQ>M G?SS[aA#߈70ҭ6Uٮ1E򻓍'R]wl>c͚M2BZE8t ]ZW YDcڦ]sM40su|Cq~"{|7ݮ↙2NdK`t,L`2PReޓm K+Y=Еps/{7._#Gpߔ%*XUP_.U51#I[XeرBj{x DnFY2[x<YSBq)ک>NĦW#3/vYAv6y{bMs%?EA?}KAX2gU}_mǖJ6٭P.|/+qKvtj1D.8Wol}Cht7ApY}/H`O%5L'W%T%RZim'F5mv382広TCEbvlxVjְ\tY,XQK? άME|QZ6a&$00rء:Lh$ p*ȓ0wq+"u=;2]SVg%D0&yTqzWQ2+ /@d3A5cZW Lp]gSFFWI|z?2 _5eQq,'cQ`!L4*^ڭ/q.\e"p~|UwRռ|z..TzIN4q&H1QthMpf@=:@ƭ(? !ס Y4#]2afd #ҕB{TX-wyg"~#ғ%+ݡ2}nq/PpjJP"MF H܉P~ɱ˽&Iq:TdشT u.W|k oAXm1_I}:^L@I1tu|eRd/#㍆xu\'oF.39;c L(_ u`_OHLŷϥ {|G7~ג%jzBp$@u`,]Ŝn#Zq8-=CNMPs;BD`yO:r Sh / VGRy]ՂUx~ҡ 5v+_C '`Ԇw Q `[_2Й7%hŗ|b@ &fqP iN.Pm:wʝzm;0ϲ6pLAY! Eq- 4|+O"8fF-kuN[!qpZJ:IKiEj W[Xz:nprU*rVc[(X h,%/¹/~aoZÈ!7pF $mChlA7c՟AlgYa jn])?'T Z瘶uu$(oʸĹF֥E7H+^d=0BD<-"(O7g=f j֗lux-LӠMKo[8Y&uli;'ZchOSE`DIo5k{#N@677(p!'HNޢ ?U19##+C@vRkEJN] />LQK b%tBIqm9Z؛<~ S"J;gRx&&HުHbYT8ݵ09CUD\n=ZK*>46U_9;yXЋ2+$wbNu@ش`eGIc(yP=ڪs_-Fj&A/WԯYTzANl)9o"Re_QΔk9ysHվalȩL'O58{61q~Æ~VHYGg|%3̤D')146_jų̌B0ˬ-q/5hiɽܗթqYkw-]- SAֽl7 /d'1=c?,@x!5] e|M }fk࿾ƚ+a <wZ`x\aL$Hu@#8傧Ee.c]khC:( FLpVRNʡ<Ѣu9ref{^E`K+ZnL^ ~ !`2^Fc&?>9J)ZG^YQ.FDs_~z;j)ebgu'OV>>+-YR b?Nas ~:p3)dzwzi i;}Za1,C#KM_8ngHU/>r4_ .\o h(p_nq޴(r| #oR51.,|a0ߥ;^pڼCdXDI y Ƞ%.ˇȗTr_0wg1KUUH M:\r*HTzRA͢/0f>L[7 TSsܴ[͇'`AN]u ժtaŸhs?0 _'s3DOAqcz>%s c w꾽D-K|wsC>a&J'"R)Q[` 'RD  (GymT%cvվtwP [ŘUС}hc mWkpMqǽCӢ#cRބ?B͖'$C ClCuy|p@9mvO3}_!4B`g3:i7aZΘ05$E ,aL?up2=X`tܧ8R;~E%% @l5=[2, (P ޢ&-9U9vm\9&)dRzp,0nZg-16'ZRꟊpna݋ޓ`•}țP"fSB'}Cc`+ eКr}0]A)jTdHX{[c5a20BA!";$s{vShyPY'e2C]b>ihatˆv^X@}Cٜ_Axܹ;,*5 庳6ԩeE> ÛGԖֆz{atz;an9#KLxBWԜgC̈́gJa^p fQdge$PKEu.9vtfl(;.vZgJXo{*wy'tc} [cքw|w2D3 @v&Tp[AҧNɌx cmMTm>΁ qWH[ iJ͂_,λHadxaَ#́Ofp~6- @K7C悳t|d49v×f"' e-֐i:xO1>)z:V×Do>%M.ȀaP=ܞkm}*',BMt Dx.LnBnhrs. @`̣D?lټ8L7cza_(Xww6x=OeS *7V&ٙI 8%~7i[(ʸJ xxF/A P(!G .a9u~+9Y1ߤW(u>OՋ$|ɻrAu =o3z:Gn<sa7IjugހzwL5Jb9ϲq8H%X%Tw#XrWNM;Tj+s'f&j P^\J dT=q% S0zPYvԾGWZcߴG]_a Seal+$= i=%w&A#QF|Ti8.HmZA8 "OumY³~15x0dkTJgCep/2rX-\E(\*v<+Hl3cMte+cgJtFHy7yqDB .sBWgVv< [贺GQn3̹RzˢQ8tnA<2)tےiD_??rhG=ې[#UMֵ%p@Q|{C}ahb:HH$P;(Zul Y!"*HteBÃcd4[G{Rj4)3x/^)s+>enͧ4՗GpAM#Ҏ%/Ж{D8sklӖvq<ڲݍt@T  'roNbT^}_ OS;?w+ rOS{&idxg08d(7U׼+!*,o+6U-a҂-ĤY[* xY(oIMWM 62sA0/DL^{gdrFXn:69S[M8*NVv*ޥfIW} 8ɞ ޵ =>wɁD҅+>'')ۯI 65X聪htڏCv2π9V&Mto@ }#IUUxH}'P_ƆM'K&zn7r76#"} 6{^f"k:qs™2uT6] $tz 'n2o/q6&(cfA 0Ezoqx_T#`gZ![״ohH&)\6sZ9M:r.N+*Sl?Jݙʔ>*} 9oCÐYVIj`2mJ6tL{?fl=u1&)>qT.9ɞKG,{oU./6\"aZZ# PsI׆jsjˍqJ3hYp Vںk&&@г_{^KYye&}V|JhPL G2= C=?v Ћlδ KYf/杋% / !cIw1\|>1v RH~m^+TmRv<:/_zng{OՖ͕ uFjRv_`Cw2~%kVeW$4w(a_k%^M[pD$ '/H"F iF:dMeUH?i=w*Jq\-ߜ{?qQszIh9{7\fxG(1tnS)m or}atdA*u@Y$5*6m6Pncj/~1(ڶ0U̪뷫! vc`(@_5N+QȜ`}!ϽefkZz O 374asdNY BN7E$;iZ d'& Au7hM`XٹfogLw$uGxGbQrb]B:>)%%@h=s|=q#U1Z*v|f2G'VQg4^ߚUoEz[Μ dM@kȕ.^'rJH Rzc1Oܞ~C4ٶȇK|* za1TXƫ+l#!CFl}5T)U]QpڅD hQaZA:-XrJsslp3N*bW-Mǵ>,;fqmO%%0^VPerbMʦcOQZ6 'Wb5Jyռ?F؜9ϛg3nfG;罔a*x_H"2T'LW(Z_8?KHd."YP\:hp PaĖӌXlQndDdqHr>=LA82(!bG G)du1%Qy:> /JmGIN7r2=nSaq [0A]mv-?vvU]1ny5=q?UsW:Su:$ Ҟ~b BH 4$ !zF,s8¡M J ܁ 0NA$\D!d@-dMy\x{$#{X ϯPD,. [}}+Q> :E|hNRPb` Aor[!.C:2~#,⟉B~Δҭr9fy+ݓB&Iu F(ƕE <|  'P32".i#O!25)Ü-}wʸSc^)<ϢrՍX_#a\09xY%X nG9ȽJ\jx[Y'TPGy:b :ͫͤE6a=a製 P/AE,tiMD2$b󣭁h PD/ P)D{<>&Zqӌy@ 0jA4LO3pz#JޜºgvGˁy[(CAё?ȭpaR&pa!);=)!0 P%AE,tiMʁ PX-Di<9@r)l3\Z[#۔.%sH1TMr+D:U(ÁX P5/DheC~YBQMN`h@  0/A44LO3pz#JKP?:w P%ARE,tiMʁ PqD/ PsD/ 0*Ax4LO3pz#JUp P%AE,tiMʀH PD/ PD/` 0*A4LO3pz#JT P%AE,tiMʁ PD/8 PD/ 0*A4LO3pz#JU P%AE,tiMʀ P=D/ P?D/ 0*A$4LO3pz#JTP P%ABE,tiMʁ( PaD/x PcD/A@ 0Ah4LO3pz#J$wjs"QeD vK##SZw3۝NjWp;(&)$T Д#[VO5e'U)SAMvj>q48/s~$ c-a5,S "3" Б[PQHDZ^= ?gD@ҌMߨ s9̥ hp]0 YR'6FTW R􈾱hů^}#2 kx",sx:AeLKȱ䞖:JvhJo6&䏦~6 PER=vG@ڪ*( 2q`e]@ PrAE,tiM/BeEmx#^SMqUJ_e{GR&~BlB]σ﫰w.-8Y6V P*D_4!l#f !乨mA P\D?]҃tHj.P1KE z*+>w 볭#LP6"Gu7 02A4LO3pz#J=MEN=0䣳 P%AE,tiMʁh P#D; PD/ 0*A4LO3pz#JU0 P%AE,tiMʁ P-D/X P/D/  0*A44LO3pz#JT P%ARE,tiMʁ PqD/ PsD/ 0*Ax4LO3pz#JUp P%AE,tiMʀH PD/ PD/ ` 0*A4LO3pz#JT  P%AE,tiMʁ PD/ 8 PD/A  0A4LO3pz#Jhh2rN`<BDė5 V8m$e5m[m;O>ɵB*l]?Jm ghȉv.,vNdWF@ )1\A,t*,r32Űgm#M sj D6ȩ[D\EbGٳw0>ͪ}g7˽5A;ߜ\6ᠤk)T%|p}[MhsMML]XriHTE / B)c5S};ȵlU2B#G+]iX5$rs;d}~bYlO,Ѷ%Ӿ2g1r$gHmJg]`\PB? &f+ѣ  PZAE,tiM#YdLp`&"j<No^KRfStggc=DvBoŲ7bߌ<]P]  P-=D5ih]=(<p  P^?D5;`iwmw1 r@7&Dyq=ht%]X𕹰"vͣف  0KA$4LO3pz#JWuoQ<)/ݴqpm@ P P)ABE,tiMSo΁ ( P@aDʛ1TG̳p Q̌AZǢ飲 x P$cDbŁ @ 0*Ah4LO3pz#JU  P%AE,tiMʁ  PD/  PD/  0*A4LO3pz#JT  P%AE,tiMʁ h PD/  PD/  0*A4LO3pz#JU 0 P%AE,tiMʁ  P-D/ X P/D/  0*A44LO3pz#JT  P%ARE,tiMʁ  PqD/  PsD/AO  0AAx4LO3pz#Jpb3Ahm$xq@}BX;{q=z1mTuZ0+.Bo046*#%)cUsH"0<\Rob,׭*)M?mv%0ܱ&wp=|pb_Ge1^+˄bIUTeH*{(!t \xAIoB_ Rbq=WsC>Ԏ p P1AE,tiM Ycv#*"@`@ H PD/  P)DK9p#bw8` 0iA4LO3pz#Js+c)glAVЁ PBsD&9_vϙ241\{ʣu&o&HH$Qb01 X 0,Ax4LO3pz#JgOp P)AE,tiM $H PD/ PD/` 0*A4LO3pz#JT P%AE,tiMʁ PD/8 PD/ 0*A4LO3pz#JU P%AE,tiMʀ P=D/ P?D/ 0*A$4LO3pz#JTP P%ABE,tiMʁ( PaD/x PcD/@ 0*Ah4LO3pz#JU P%AE,tiMʁ PD/ PD/A\ 0NA4LO3pz#K2jd?R ~TAۻyC \b}[gMY34aΝ1@W[Q* RlFJ5ruQTfåDR(Uye,,ܠ]LӾq}27+; H%TY T]!øNWeX:ݷ;s= S} >G]:X-B\+̇Ӽ-fŬZoBUJFHBBPIiȞ1Q"a "keFL!kvxtȅӭx՝ݎe98\$ PeAE,tiMQ;9D%cZ>MnY%tV&͕/d7TcSSxVqzR{-Õ Ih PaDbu?I@T{/q:-,uY;LW]J:z!f27jfv˕>*1,˃O5S6; H P_D v-02FlNbN3)'URw$P`P "VH>f:@ہ 0MA4LO3pz#JA2u)PPu=Q+9*Bm:zQ0 P/AE,tiM!2LӫU`$:aÁ P5-D 9(կ—j*PθR0?X P/D/  0*A44LO3pz#JT P%ARE,tiMʁ PqD/ PsD/ 0*Ax4LO3pz#JUp P%AE,tiMʀH PD/ PD/` 0*A4LO3pz#JT P%AE,tiMʁ PD/8 PD/ 0*A4LO3pz#JU P%AE,tiMʀ P=D/ P?D/A{ 0mA$4LO3pz#Kl,>4* .hYnR pi?s NNGKL2.Dgb ͼ -p2MHm@2i伝[ɘ/4v<{V%c6 LuٲhʞF*5-.YH3L,50ر}^#η\րɲuT$"Wmɂ(F)1^#Ҝl^g*5P4p>uٟےftUɗCV;4/ձ%҃VA݁'/ }rf*0!?H*UNG80h#:7`Pz?/y1܁@ 0NAh4LO3pz#K>m=KKuqbR:/\{v8 yMƇ P2AE,tiMq*Qs^ǖ A Ё PBD^퍥V[rL<𵙇U&pA  ; 'pS!Y8 P#D_ ; 04A4LO3pz#Kx_64$ˀ P%AE,tiMʁh PD/ PD/ 0*A4LO3pz#JU0 P%AE,tiMʁ P-D/X P/D/  0*A44LO3pz#JT P%ARE,tiMʁ PqD/ PsD/ 0*Ax4LO3pz#JUp P%AE,tiMʀH PD/ PD/A]` 0OA4LO3pz#Y!D &!It%#T!18T@#+a |Jqq(U]? 2X9bB)bJBDd|9aXHQy8;{Y$c}|# @x5hXo$B_kzx~&~ JnͳDzEoì>dua3'[Z1@)(QDK9S-|J[iNʤ뵽)?#urԫSKf@o$'=E/]zY,.q3ڊۀ H P.AE,tiMbiIiCУ2}W"磱 P#D7UP~@T8 P/DM5%?'Le n$ 0iA4LO3pz#Y?-0e{S6exೂ2lzh֌=6ή{`*>{(Ɓ؁ PJAE,tiM`FNbty RF!V 1gYRUs)d݁ PO=Doy=kHO,@%Lo%+^,m㕪plՠ>0Á P5?D_>Ո{@_ 0*A$4LO3pz#JTP P%ABE,tiMʁ( PaD/x PcD/@ 0*Ah4LO3pz#JU P%AE,tiMʁ PD/ PD/ 0*A4LO3pz#JT P%AE,tiMʁh PD/ PD/  0*A4LO3pz#JU 0 P%AE,tiMʁ  P-D/ X P/D/A!  0A44LO3pz#Y:{9]K>LTN8QL؎3GGu`/dSOKNz({aeОH]%FwumyEUk,JOfQ59Nz}Q-b`do!/Z.jgw.An7z= "Qk؅IIIhs+d@Pgs~;ICАT;@*O#8|xz\S˧Ա$Ł  P7ARE,tiMbI2,j@Krmv/$ Y  P#qD2zf 〣  P+sD؜BPPg~.-0.Qh@! 0\Ax4LO3pz#X_9@sz h#lt z v+.c3bfCw 1!p P)AE,tiM@S!H PZD~V[>^ת_ʻq`Ҟ0* du۳l꓊\#P,΁! P@D@:=ABrm)yО#gY;Cg"` 00A4LO3pz#J詬Gp7K 8" P%AE,tiMʁ! PD/"8 PD/# 0*A4LO3pz#JU" P%AE,tiMʀ" P=D/" P?D/# 0*A$4LO3pz#JT#P P%ABE,tiMʁ#( PaD/#x PcD/$@ 0*Ah4LO3pz#JU# P%AE,tiMʁ# PD/$ PD/$ 0*A4LO3pz#JT$ P%AE,tiMʁ$h PD/$ PD/A% 0A4LO3pz# R]cgjHzuF:A@tّ V#~id-9xVvhqī6ycBFYJ+ }hAؔr!Ͳ5(\:Bv ֥%X?1zOq(gJ ":G~se{=2\E1R%Z4_ e]݀ ٲ5SS2XƚF0{IrZ`aaPJLZLIs~sQu7p&(֡R.}bbȌ }f<7Ç7,:K9'n<Vȿ?kVYzx"teRp62۝*Hg2U8B{#)ʢ?)5,Md cZN>\Do"ݶ0cx@z9MW\/4g>XgAGE]*nbq~G$$Lap|U鎶ѭ2\=ߠgi;.̜JIQ1 DaCIj7 ˊ]3# G &\=$&vQ1ȲQaJF%kF~sVĎQK Xj9BYݥɜ`DĖx*qQ{{ֲr@eYd>r+7v22[dDi<1< ?;LF0,owƚ{w̸d@M)Ξ-׀(ú+Fq{xPxlSlC87K uƴm$w`܀ ]zu_K,ھaLrbQcDS(Gm9/q< qXLW<_lDTJWшejd B*n}^DyPZ>^dz)LnZ2 5.3s0w IVG'2):@jfVYCj:m&rU.\u2 ]ב>╠0E-{Jk.3qB|&c-VVwE26[:}bV4/v~ ŘQIG(&L) rb")D>عW7eAFpi\I6.,AbVj wIb4M;cХ觪*:4FhuK+jfhB.ʺN. {xlξ%ѣsːxz;]^VdD徧#(onlc$lQkY(MmПΣN2gV [݈ٮo`g # E4l:026Tknz)]w;`ktUWH[ *WX:!h1xj0''~EZ?7lj$5]WHEqwlz~hPlu7?,L g wqiX"wCPnUMsv+oEV±Y ǽQ`uMԋ蒔l*=q=w[_#Q^@٩QHep5.J"Pa#+Ӷk@Tne3bsg^>byrp#e/ Ww*XG !=w4 )9e, HVV-RrL7P W P]U5c4[+:jS\sG}:uf^zr{ =^|MdpŮ7ou·z6n6OLǿ+)cWֹE'fq&P›"v.|8񟥘:P o 8[d(DgEWaW^BPF1s6c=u"|TSԪIv|^:wJ=pslT׫V{v)3_M1M48術ZJM騾@҄<,9)[j%1)NwC6}<2eN_pR ݑԗ6;bfanSЎOmRe wEea/ M~.@M?ZWRЦ6|m0*^6IsOkѢr*s/;-!|ZThו6&LѤL70~oftmXm:NE9_3p@@Υ ]ˆЄ;ILNf3)t&"dF*52I$QAjD)/!|qʃVv?e!0I8Q8XDDEDNBd"}[{d\;4&eAHFCna}N ƽ# kn7B<%&=s/3U,je,5>R.j$y>;"5㺿Rar}\gQ(fmz,&(ZqF_s3NA+saA*nhy]JP™U9`#|aaQ.i|FO!:9&s7z끞>&0k^;|Xh¦Wv]\N^U Уo(}Yh~sgVlh\He&s)b)ZBYo[k2""'\O=aGv`kb%swuZmb:`c(r~r`swLlI 5=8[c'Iz6܇#\ul8Yy$BoNtT?dM05i=B"?ІW$- /,qRMMw_ ծV Q8+JryBמ*l'(f成&hkȶћ&jh`G7]oҘLf٭D DuyI}w:ު1GBUEU8c#L@_.7f[Ad3: tI P-%QngxZ"ʸ˜q٪$LbjGG2٪`%DV++j+;fJd12s[s @t=.w!ltp!F)4ztmGF-PGr tS;#plngE :w~[Wzdc9Q27kMS*# NZN5W1yً,!S.x䧯k7{2%f.ٮHۂ-EЫyw~].PV2)#ܓdmtFnwvQZ5gwKM`j .4Q+OU1wgX ~ЯVhBWamZM3H wh {7:/%"~fh @Ãr(ehc,g7qXM  p 3M%Ж̅,p9nE5ڮJ#reڙ|&9'q4{d7e^vBI_(gׅFQ4Yhl=0]wq-zs 4"Fhj%+F^=IB 8.4V7.tQ/DL`F?gt3Q,mt L3 XDžA7ϹK 8tpm@bLn{L]QENv#i)S.4Àm`%0!aڙ1&3AJw:VU_$ nU>UX wo{ xc0Ѕ =>E,*7EXWG% %UICw#Y"c e?@zVB}V?:ޔ#8j`N='U5e4Œ 4>xt{t±c2Ezڟ| `Z],9htɸx} p=i&8vkcdȠT-SOS.& #6 2O $x7heq~\RVJq) [ S9uxڌ=%@J8vҹ[2dT ~G+ohmbm/0^>Aهߏk0xkS/Cj٫͑҂3=Q})aeq9o׮mT(>1: O7u Vt^+\Tє4*ʃ(\ڔ԰긽BOE;#Ʈ֛?z}<|R3E=Fi@Tp% >:8pJb*klUUMD7AP1'qBf7\/'nw/VU[ T#fV"1,vfw7 SaJ!x_O  C}nҜ0x徣7Qބ?v_#I\^wY]1]f8D:Gh6a*è6bA9r2bgGH&KLf'}&%$)ԉVfkof:=o4(AvңZCU/(!{ j/}ʌaB%zq6 /uoPaVDץCz5Ua]"߭`1|5jRiHqvk*2 dţWy$ ! 9؊hj)[?n/m ǩ/'ݸ [#8S%qeo:ܨޑNđ ګߔʗdkAfgJ{-N$ԭ9gc&o;iD-?L6M 4 oOw;߬{ A T.aXOSӻ*+e9yXX#28` ̀fqfA黆ҕ($N5B tv"vnR]ZԵT`<)@\ڢ~X2)3r3NGޟUu3r:VĀ)rܻ#ݲ>)ȡdz&Rg;=u%~G:-<ۻz>83>FTgHчlKZꪁ8%U(QhDS-["C UAM"w>]0?=NgڨZ:/oS/ S\PunIsuӲ&c8PIz,`}(bbk+':8|6AgNؔEQ;0-p~zXB"2rEqtX2V:5Y5/!\ݚbg/M7)zc։%@ύi-S)! lQ {9ڡ5_"\ #QM\)/RIe\Y:LmP GI7-x6\ W9`+˸Կ׷KZmo!bWq#Z^4^l%dqzwHh5*A敖 Dہ[K8|@#̬e5%ّ3H %(M^1:ZVz-ulGTuIcH~fʐ:b nS]^ vL'N|J~79:fy?#(|I_@+{H̲S,/Rt~Yd bոA@@n*2ZXPh@#Bf](9o ٴ}EתdQڟEG/dqNje‘.9qw5J ]M?^>Ls]L!(0%Yl 8Ij7m"VEY$wЉ;`n?i 6cr%?,P5~X pzM<4]52r1K4J!PYF^,2 *'8zQ#S"`r@Sa>>H h@E2T,s{3V]QGIYGGwUm(f hj)UUL1!V֓ 5((jf:oت,RJ:)MG2UgB Nkn-Aw$&xۊ;':WR5 2+¾_nyq)6B2uM]oco=wLJ +d'QHj((u~}1 szw8s)ڷVlCe!7<5so-+xO w:M! 0ZƂ )v[c5@QU=.NxFsWuIgȦ)j$x(rMJ]ps08C8:T{ʥud0ZrYJs~&sB"o/tA`VZb>B(7G*O/w'¾`GEy)C % }fkƚa~6*hB a'EC? SvR5F|qoG`_HD4;^эrɑ*ebi`K+'sZ>N1c#ǰ O7ɄC`2^~c&@=[8Uހ7b8 Kt֡W8BuSeUYWC^x N̐V`ǝmƱ;z榋#>>,c+Q24 pa25"jw ZO63;gZ"#SH> O!4RLſ+s=9/T{ -hJ~87:z 9 ((IG@)I[!) c}Zu_}Gql%0^/Q[I|'-_, :)_P>۾/9E-'/1"opr?m2~Xs E֋أF'uH kxzM-#쿂]?N%n,*v׍X.|[5ɋK;̩̿qNfz8=z,A0ެKҹS6yW-Aq2kBHFèb >= [!F8tPd$ xٺ-1\s׃,V"}heyۗ(kId`\q|$ {ea/}uF;R5-?&ȑwk{a'Tp#!"<$_c"$ti4:ȈsYSR6Y;]1n4NkD,˫4L@f-ceݭԩe mVMԖֆz{tzBjkJ|>to.ܑCOp:13aG:1&!%ވ!5[K5,u::ۃ,K֦uH,@p3>F¾MvVYfy`!l*G%"RNkM8}Ы}{3L+ 6Zk{Ӵ'n]mTEhrs.B\y* D?lټ8L7c„Б՞(دI;RVP<k%!]k,$=.LS'1=ʼnCYԻBIX<(rw >f T.W .ay-9C]Ci(ۛn.OՋ$|ɻvuk "R:T'H-` M6aNJgV},M4B`5Tad}$xA'SO`kI=T/hcV; 8"Yԓ9^<5 2";VX|!*_, ~cf0c_UO;UW[ޅ1 !0&͐W2:Rת$9Mt:(_ۣ l/nia_!}oCVJgƝY&D`PӁ7'.23'W=+~$s$=(yޏ/ytC&=F.y3Lo`H{D!d*x\{a`h]FСSX;eX"/GG1e˪]|=lI[i$+M"N+3#d _Bmo7bQ*ߪ16UNȢUFGi+r3$M&Cq R5MMaRlt 5 re&OM)ԵtZkz ]J 2C%}ٙ{y¯ RY$v'H`ŅʃۆDXҟneJ5?7p`_O^[T`+U$506h&?Eٸ3wgIlfqjT&➉Oɩ{z\K=uK ͪWrhkxMR]Ź6 ^ ~L a֣bJ3pʀ8I;eQWl#elm]{C5A@ Y%y~(Ad2sڨVܚspZ&uK~%>m\2qDS ݭV`uN2!kD EMP0kS [fMETʼ&׉0n$jV:5ޞ_&Dq&&dX\"gefĦtzC#;ਈ9R]CS`I~oIR[iغPp=s'`5.D`K/5y-(~1q`wP9B 6z+7Yfc(ߖA N޴x" ->ZVz֊]l+dɫn nV?}DSc}o^eT&wqA/+<5.!{ahpG7}'q϶lGrF>r6pV'AFDT~#kJA'i;w|@pDm!Rʮz^yv6BF2], 7LqtxA|a4QHer`*`*}mJ7[Cvx{͂G]p7v.{-Ai^'V%.o⛩R^ "Q~*6iC=L3ޗ8NSYˢNOo?ac'2uf6S@[_yӟ1UBIhRyU$O l㑟hY/ˀVT+7\,b|7tv9ytuq <[*[D,SqPN .oؑ3gi0LijqNCM2k.RRfA ܌i#b{\ozfA[s~ uaGeU3v\!Y>5~cu;QSo@)xK[ Cϊ.3BL@Bw|b9#<*XMׁ 0IA$\D!d@-dMyX:MUq 42͋2sRݤ7^Rd뾒겾ge&u.UpοQwMt.9> 0 P'AE,tiMI3De@ā P-DW93lU e:.d91F>CDb-Q^RK$Z@ø!c㯘F9Ws`$FWӹHR%@]'tKo_J--4{Ҟ N- ;ަɼl2>jﮟ@e(ȖzuҥbI0'۔Me.}%ņr2uS ̷'3§%rVQ,c@R-1 =z]lJvHGl}5(ԂhUy/5-M!ԧkA3dcQ\2"|9$-.ŽՕݡ ]:`3廒a1OT^͜"y$57F&(Pr3 msr/z7J“~$emx +ACɯ~+U"7w;y45#Ibp-w2^ 8*}FT>+4K3/0ԨHCzY`V(T; L|<^jx̵C &[ 4 ^K$FA PAE,tiMm`i.26{Q eK9(!0k磘֡I6W:A/H/8S/q1w2/c"e*8N90ϯ6^ V[3V0Dy2= (<4Z 6z[? Hn2WvGkE4H]X* Lf AWz*ȟBI?݁ PODp7C g RH*PdC)CຶLxFl$i.@܁ PDYc/\ĉf-QD23"^D t$@)M#;%\bn;{m d$GukIBnlA(BC.:$/Lԕ;cp nl6O*Kan㍛sD~&_W‘<,ȇ3M 0YA4LO3pz#":SLC~Fo?-w4dOtPag620jM連 P/AE,tiMNQ: 2h PRDdw_C_EpU_`.̽-ٞÙ;直b":ހGoq PD/ 0*A4LO3pz#JU0 P%AE,tiMʀ P-D/X P/D/  0*A44LO3pz#JT P%ARE,tiMʀ PqD/ PsD/ 0*Ax4LO3pz#JUp P%AE,tiMʀH PD/ PD/ ` 0*A4LO3pz#JT  P%AE,tiMʀ PD/ 8 PD/B  0A4LO3pz#L145)% 7pJ0wN>t5w{ :{e7aMjJ4MI,744lT3m7>q=tyv^x W}0H@EmAZ:&ˆZYfth*&TvckA?s^YH3#7f= WO}sչBؖH<[R@WOď 5foj},*p7%(GU*|?/R+yD,sJ4j0>LVڰNsN}bďRݐxq `a24$o!]Urr} C<{G89`1wreW=%bnF ']ƒQ=,*?U.tFZ˥0,Ǿ)"@  0A$4LO3pz#PJޡv6ߐsS%?EGhBuKƇj\VJTkF 爕 >Cm[ +:oQŰ08pYw7Ł P P7ABE,tiMy΃VAQe@]ׁ ( PIaD Bտ@W[ϜLbpV2( ,]wɽDˣ x P%cDOWwd+ @ 0*Ah4LO3pz#JT  P%AE,tiMʁ  PD/  PD/  0*A4LO3pz#JT  P%AE,tiMʁ h PD/  PD/  0*A4LO3pz#JU 0 P%AE,tiMʀ  P-D/ X P/D/  0*A44LO3pz#JT  P%ARE,tiMʀ  PqD/  PsD/BG  09Ax4LO3pz#tX)$7݃^i~C.?b m@3qȣIxtZzF3RxV+?_TTSJ[,=~4!+`+ˡ_K_[ 9˘3 iUWPЄ{XHQGN4ǺЀ6WeFB93\nys?jD㥾() AIrkt*2@YrqEa*9.O $µ߂kA)n6j|D_zPTp}7xƌM{hn3t;Yl[r&VKi(7}쬋 JZREwI:| NA[O$KdB37kLstՁN|qI%r'=h %-ǡ;g8Bh:\ErURa|jM-]yoS$טLi1m0HeX"\BRoL |˙A^=w\p$ GDL44/\ ۅ5(u p P/AE,tiM(Wm-%᫁8ԢPK H PD/  P,D6h4c(Fl7~Q@Ё` 0A4LO3pz#Z("/o T9F=T2 }6ӟE#C5uzW,L=g)pa:jd{b6aӿ;J%Lfjkq`̈́eIGޟֹ논XfΙuTszߣe^$,`h;V5`Ӂ PEAE,tiMСbv7ʇL x왖C@  PD:]<ס>sP\T|]*idj]"Q#v]Q,|u c.TɲN IE89TiY+3bc_o+KWLmx|8 P%DU_wtK!o6` 0*A4LO3pz#JU P%AE,tiMʁ P=D/ P?D/ 0*A$4LO3pz#JTP P%ABE,tiMʁ( PaD/x PcD/@ 0*Ah4LO3pz#JT P%AE,tiMʁ PD/ PD/ 0*A4LO3pz#JT P%AE,tiMʁh PD/ PD/Bk 0]A4LO3pz#Y`˯qA\NB키ewR;:~G|l oeoOPWϘX#םZx+%OF(oV iN(tn2F)0hmWe|v%4sV~hiZ[f` t2()26"BRLi,4SXeuJ/ fWº?~ թKƥn[˒] N$%%8-rc!|4sV+Oj.^|E]=E{)Uv/3P C WbGfbo-_P@Q83Yb۽\% rκfKSRb24 Xwi2!GrS2"8jo 5 "mhJIQV53yfS^@BAm&l̝(sSߦse9vk?cE4rfAoR@":Fhm3Z3MVW4ʎ=Q{GJ EۭK&d J2"報2L0YC˾W!bb^aI 0 P2AE,tiMGy8gg 7T>+ң P#-Dך~@3ࣻX P-/DRaPx mͥI7~| @  0zA44LO3pz#WƜCRM A pכUxBCC](~i:?"ka⧡̘Mȃm'M ?7,  P%ARE,tiMʀ@ PqD{ՐXb5W)+&>pWsc}2*Stw% -K3y,9 2W(N&r7הa/r o@1ʁ P<sDԢbq1>*B\EF0( o Mxݣ 0/Ax4LO3pz#JI&-;p P%AE,tiMʀH PD/ PD/` 0*A4LO3pz#JT P%AE,tiMʀ PD/8 PD/ 0*A4LO3pz#JU P%AE,tiMʁ P=D/ P?D/ 0*A$4LO3pz#JTP P%ABE,tiMʁ( PaD/x PcD/@ 0*Ah4LO3pz#JT P%AE,tiMʁ PD/ PD/A 0A4LO3pz#Wٶrkte'Z%~@%i(uW-2ÖrڦY gIMt GNGм)sRR@L_ZZ;f׎7pB<2 .HB>캨MV竚g=^p)z]iMA6p35m&X)C9ՠ "(V V5]=6F^~ُH eԞLpDwf)w=U`x ge+ԸMMX Նe)4 PnAE,tiM5aW{ lVUK*IXȦ]Pj\ѹ5U.!e0j̞3p+K@Áh PD&aBnM@HS#}sp1;-HX&< T8\nsR<;m1D$BkUtFYmZ(n$%abD=uI9Fzy[/R'x/YTfr^OBy75zXh^&8M֡v{T(:ktOPYLQTgkΕxM@UWpóxN1øbgjjg`_}*iX WF9nat@ TQ+XM˹CށGoO3@\@P PABE,tiM+wʀnQf4;Tta)%r`NwϿ6 6/)5. .58i  17:-#HggPݕŕk#7ǯ"߻h%)=*aā( P6aDM>R<uIٗ*L;b|GTJZH@x PcDSDYnO˱E rñ%)ae"Ƨ,*1<`yNu27!H{hd"HB*E(,Qr(vEeI H77#k5fO{nP@ 0WAh4LO3pz#KPu^4D NZgN@~FBtQ]$f QwU7 P.AE,tiMO̡!'C_P*aŁ P7DS,YJ> &Nxaut`E銠 PD/ 0*A4LO3pz#JT P%AE,tiMʁh PD/ PD/ 0*A4LO3pz#JU0 P%AE,tiMʀ P-D/X P/D/  0*A44LO3pz#JT P%ARE,tiMʀ PqD/ PsD/ 0*Ax4LO3pz#JUp P%AE,tiMʀH PD/ PD/B(` 0A4LO3pz#KQt?7Z7{UŦ_+N'F%s4Di[%..dc3M/:(%rLCٶa[kjyŷJ|tK= 'j{3lij!1$/蘪ߖ6|(;BGlܸTm>í?bl2OnԆDX:?(A㱁N]=5fW@v6JI9.& O  sh嗹S] o^8;ׄe_'ӺJg%uu([P^к0 DB%7]W֑_$2xQ/CXtc9kg馘p~iڊ՜CuFjFZ&pUܫ61e#NZ"DF|0pX* -(-zW'P=̀ P-AE,tiM׋SgA5 /ϸ!@ P=D sNAǬO0)e3/'ڵ)8U ! uw4>u)Y#y`F~q˨(倶/X^9)7pv`1j!.>Gc߼uq́gC_#h E P&?D C6bI 0.A$4LO3pz#JMUXE@ݣP P%ABE,tiMʁ( PaD/x PcD/@ 0*Ah4LO3pz#JT P%AE,tiMʁ PD/ PD/ 0*A4LO3pz#JT P%AE,tiMʁh PD/ PD/  0*A4LO3pz#JU 0 P%AE,tiMʀ  P-D/ X P/D/B#!  0A44LO3pz#J8|LjYKExU@>|Z@\"G^',OZJ;V䅅ں &:+*:mk2Y%Y+R<zom>g7l 8vݪՃr{):Cqh1o㺆$t#&J"ؖ"Q?o xJ .*(|r;L}_Iu 4f]8I[ A`O4ͳ]d`jݜ}E0o5IU@iHjD}FQJe[ܟƲ3tOFpcERM+Ȩ1g.GF YuB_"ܼS0^j(Kh噐UV .~]<^gwGK|f7=tn>Z 0!<˔h~L)4I2e/,9M썃ˉx:QuV^fZ   P2ARE,tiMzUF?B&Pc  PqD/  P,sD JөΦ[pc7|! 0WAx4LO3pz#J7  Uˬ3#-&ul)NQ%> ;yJ`9a!p P%AE,tiMʀ@!H PD g Yea5pT^&StN&8oA0~קXnLmaS7wD  wP~aOAHB 󆿴] YN$%V]%@Ű+f\[El6f N,|fB臯;Z؅RIӎ#B.lHG5Yʸipnr`7ϰWoKPry%kyJ訁-ӌkώ"<-LuLΊbU%=CfNc\;3[N&rhu# <&l;co{J^UJRU*C \HY3(=wudS|kb AYq²4p=⨟Њ57K`k? );:*˴sj鷓~XM#o0Cuy]d_9Bac峣Lc1XW' "*eZZ{4kĎRT*9 M|:)U3amƳIr`__\Y (5Ifԁ uU}1|Q 6o3[oU2sP;m !`x2f<Ι;*<Ӈ}È 1˭!zċ )@y+]A š#xдy'3NSBm`R @%0 PAE,tiM߮`/S# e$_zNX7QGɖ9p'x#ITxgkwQ'sގ'"*_ܽȷٞ \ z --#@Va)/JUA&:lG|BWK3kH> Wz1ljKvi ;l@ǁ% P9-D q3͡q66SLACbg[ˁ@%X P/DL}DN]C[+# \j {._#+=K3sF@Mey*" "՝uMxU5ʌdxc wɈoR΁&  0@A44LO3pz#JEu>(iifأ% P(ARE,tiM&rA% P+qD,{cAe{% PsD/& 0*Ax4LO3pz#JU&p P%AE,tiMʀ&H PD/& PD/& 0*A4LO3pz#JTCuN &u "g(  @@@P(`hﱒ4eǓ 5%Ǜy.$ɫFVQ#Ik#ǩ~QNMVGm7)  G JvDk6S9ظlqbQ 5Y^V|h1fAP {<% dڂߙ}iEkM< j*5\. %&((4yCl"DYU[gƮMN, ncޏ0ܡ' */M뻾+|k%,oFj7w|fƧS8Gnΰ@;e׬=:y03ѐ]4gWjqo(cD tǭ.{)(lP }/2?~o"Y<* 8-x/ij˒Rda cv}?D=پuy+S/fhYq j0o.: ||J|ZgQ-i*d,%:&wJv81?c;m^T{'7]1R'ꓐcNj<$Gށ:XU:xrlZ1: ӗAd_J^R6WhtCT&N}JWb(ns6WnNnWB>B{#)ʢ?)5,Md cZN>\Do"ݶ0cx@z9MW\/4g>XgAGE]*nbq~G$$Lap|U鎶ѭ2\=ߠgi;.̜JIQ1 DaCIj7 ˊ]3# G &\=$&vQ1ȲQaJF%kF~sVĎQK Xj9BYݥɜ`DĖx*qQ{{ֲr@eYd>r+7v22[dDi<1< ?;LF0,owƚ{w̸d@M)Ξ-׀(ú+Fq{xPxlSlC87K uƴm$w`܀ ]zu_K,ھaLrbQcDS(Gm9/q< qXLW<_lDTJWшejd B*n}^DyPZ>^dz)LnZ2 5.3s0w IVG'2):@jfVYCj:m&rU.\u2 ]ב>╠0E-{Jk.3qB|&c-VVwE26[:}bV4/v~ ŘQIG(&L) rb")D>عW7eAFpi\I6.,AbVj wIb4M;cХ觪*:4FhuK+jfhB.ʺN. {xlξ%ѣsːxz;]^VdD徧#(onlc$lQkY(MmПΣN2gV [݈ٮo`g # E4l:026Tknz)]w;`ktUWH[ *WX:!h1xj0''~EZ?7lj$5]WHEqwlz~hPlu7?,L g wqiX"wCPnUMsv+oEV±Y ǽQ`uMԋ蒔l*=q=w[_#Q^@٩QHep5.J"Pa#+Ӷk@Tne3bsg^>byrp#e/ Ww*XG !=w4 )9e, HVV-RrL7P W P]U5c4[+:jS\sG}:uf^zr{ =^|MdpŮ7ou·z6n6OLǿ+)cWֹE'fq&P›"v.|8񟥘:P o 8[d(DgEWaW^BPF1s6c=u37 wDk6r6Tǝ kxNm.j*]ԮNH~uF/(qC&:%'# 8*LR#ZވMc},Z}#22"5P}%IYϨgy;T`U!lL*Oa{> 츳 2 ZwN.ΊfLc NB_JS`vTA =:r.޽'v&ø=Fz'NGvò%DdcArwP%h:6өDt?򸱕)z{Ni)M"N ,~ol`x9OJ7 ;:_[WD+@89Ƶ ?TʶNdfmGgWm yzh FqNDJowYa`*fP5mTAex _[ 3wJIhP mO)8*{mnC8:ʥ\S7H_ 'XFØ]%tB@9`AEv|wR\~g62 + NE> zmObɟrd-A ('bVvLXFݰ$j#EgRqt?{c.I$lI*gűmgw7 XͶTZ)Gxkj{qR5& l4C%$ vx·, 4ZM BcJ YUKh5nq,dE)5K阎锧+ ~UsY}ΘG%]xlYzZ@/sNL~f%OL-(LVB03fEn2G%T kf9/O]M?K: Q+6BVcORza6Wҫ.7 u9`>|~਱O[0HC:EKwβN*$H$ c^uN6Y[v | ,o&Nv1Pa'x3)W,EI` n&NG=̪R(1XWw/5U6#1s^8osѓP2 j CA*qKQO+xeku=X#)G ,UtC0Jwg(S~٪"eLQ?!Q,0 |dvH耷@hK͒6>[ )iD/U HwY^KT)à6PBTY!ۉq0C! U[̚2uip({Jq~ Ψc,TH3M\?^S(gyMϫCqC$u\= Lb,|wfr%e+Fv;))$/xu$?t؉d3y#nִ0=Oݣh!$o@ZDlܵSEOJǼ8 N wvL74Hq|(Wؼ%P=wJTR!ڌİh̬en748P8ohp*%c`P@J.E`j0^ "wW^ ^9yp)_a xBrL%%nRÌ.S$$e Mqf ~cys@㿺3䐾4c/r (-p{.ٙc^]' ĕSBY\ԕĿ "f/vg';C Wy͘U.wXe-n t4,0m2a׌H&\%oPAIcb|^dX?QJjj*H:#;EqƆA']TQ4\he3 â#{+Dg?+z(T FӼR^,Sws!S>Di +WB E :|wf۱&*R"N7Y]A-IQjhr3 IC\uzC q$joM;{g5gQ[峮 Q_y=v^ij1E%q uP6SxwlY"8`$&R5kC|Znj`W [ $}0+چʖ, 7O@3*^YSKa$ezkT,&FhBP T] kG_ߨ!:?LM0KfQR79ĵ>2O w¹Ā~bfvyY] U 7{#(4m2e,oĎkOH=V_. _Xl5[?y0ssv@5 }>lB7TaC7T B WG⟫6eM}#(P/ȱ@Gy# 썗VΒℵ"0_~n(Ĝ_?k:S,T~rMhfYsM*8,HRAL.IY*$s_sIS p}1ܒrwַ.j"gf?hȢ{Q(Ǧi1?P3 ^&*! %ٸĢ؜sT!YVye ˢLTyc+ Kf>0IT۷MX$a~++) ͬPr+9 SepE2Nm=[~;x50=L'nc>N7HWq;"Q`I YtSyA2G&.lewjs(.Ozt;H)}DIdoF;ј0pԹdPq20s)V6% 6b.Fp"tAYQGj4g5}?1 Ɉ%0qR`omコF)yRw,޵{dEPvNԼ6E\&dσy1O} R??!6@ !C b'%6(jh3@ec.n-O"=O'8k>(r',W#DqejP'şMl ne.8{\[w BlDg- (11¼ YL6˘?|:ǤDI;UK76ټ]3)P^^q:6Wb͉ƪ`{,/ma#1IK6. Ơ^R1mZ ZXzļ jbZ VQk!(B$xIg{TKEhQc%CǷsfQ*UƐ'&Ux<^<, h P?KYfZu5ԍ@N%I2K#Zc3R0ӾȐ%?b.a̬a6߄cŹ3 7s*F0%.N[оXtP%8kzEɱTо鴂CG^ l'՟?/q}'-v0␏ E20'e l嬕"{>Z<)hR';*m摖LlBAC&T K4ߨ{8y"Œ [;"mJ_9:=,D: ImhgGGj\)ymyݵ}J HnS]!09V@wr5W/h'^5. Mjq#nbg(&̓DJS:԰nRm:IWEbl R(A.LFߊZrԕ1kdQgFb`{3?^#YCu˫x>É%}~WH1vi{į*n^҉6X9;\ѺÐG!b0o~ ڳQo1g^F9r$FOC]BZIv0qh8\!&:=- Cfl?D): J\dE?ƈ-311a ].3lB=:w? ;gQ_+=tk6 5TTHeͽ}$d-oBG1&f]۫Q^_)kP~&yu}/퉕4lTEs*[N% 3NirFn"pctiyMH=X9jg s\,kεVgb@'ְ7`W%rp]«j2ҩöli|E`Ll Z3ܢ⧞^|P\w>;_ռ;+i+}YzSff.]oP3t5gGFc*2ME⇰ϕpT[s`d`w ֶdA{hψHSmO /&TYnBaEPB/jGL+866NKCHUw&x8s0:RYLaLz@\a:w{\$)#qp gC6=9j7aͫ!@ͅP4 n(h]؆xC@r41/ݕl0gSB rOS{&dxgBa(bIYu(7U+")b+6U-a҂-ĤY[* x%^58NL\܈ӌ 62sAo/DL^{팢C| PmUNm78T;CkjvU[v yzz;@&/*@q<3@r㉋>wɁD҅+>''V9}Ň/I 62Xt4GIz=/>9#EU^L:UݢAKؒkVs ӱzE?y] OL7r7؂6#"-EY6{^gbx"k1qsEԩAn2un^ 6\$tz 'no0!L (ncf A(5'YFGiur3$ƴCޱolR5MMaRlr HӾ+*SlHR3y((_#qXdJ:͚FbIN/o  >;+Aʔ>}*} 9oCÐA YVIj`2m$$#aMj=qf6֥@| M]eNT"ު\`^mR4Ci5Jw斏 ؃~(S`m.3ǃ[ [xE+#e88(2ˎDw[+cjb 8B}y/3Gp !3?zTN3\+(1hᓏ-'=jDOZ[mhQ4 S0տ;fdMdUMwxwJ9F\,cpofE_>ye&}V|JhPL G2= Cu=?v Ћlδb KYc)u% / !d w1\|>1uRHsW҈ d7?Gu KguoA>V[62'٪IN]zLUwbZ VZQ¾Jj8j!d!IAw@N^ݵ0 iF:aeUH?i=w {݁q\-ߜW6PgszIh9{7\fxG(1tnS)m or}atb*]@-{S5*6m6Pn0Z;15 YUoVBK7JPkVe8m3 B=g{4ִ W,.go+)ciwp!&gPS+:Μo/&>Iv VNL]OaZFoK%?r:yH븎|-+b亅t|Su9JKJ7!_(z穐&{G ªbK9tU)dNnY5Miʫ}Xzo:s&*_u~I>5Z/"V Oe{bR)y3\M?r~xxf".ö5VScbSaݱ~%_Kqr8Ugv- VSF, ֹoȥ97HӀ̓Ĭn:qV{jei}Kn=Ƕj9`@G4Shy)-+*34ZzXRfW%W!7-j^qD[qs&Q 9=*)NʼnN#+K}tʭ5rթ5񁳏`` p)8}zK UàNPMd;XI=);4.!bNje_Bs"##En* @E =fw9L?V)-R#jHmr=eJ,!$lT4u:kPװ ðyVŢߣ}r0g FiPO,&ׁ 0IA$\D!d@-dMyڙ.,ޏnAh4LO3pz#J,t%4/RҁjmF YZ,#G鵛MLۋ~ {ѦV0&OOJ+ l $'dD{tׅnvʔ1DzsaDm'tȗd· { nUM%Hl]x]($iZĒփj]PYSj$lr0W7>d<vI,~nDoO Qy %9H{IL+ˠuNB'?G1.+<ޅnӶ#͟ %d2hvBuҢRzO?tWI5gT|~H;?+Gh^,!FQcYC?Z-պtV*ӳsz}[&.ޡ+0 H PdAE,tiMB#!2$e7&kOvtxҗUj*kK~{Es&M P4D*A3X A|ejݲg PcDU)=8 {%j~F7zF=FOާP3[\a}S^P󊵞6ǣˁ 0=A4LO3pz#JSj`r2hHaj P%AE,tiMʀh PD/ PD/ 0*A4LO3pz#JT0 P%AE,tiMʁ P-D/X P/D/  0*A44LO3pz#JU P%ARE,tiMʁ PqD/ PsD/ 0*Ax4LO3pz#JTp P%AE,tiMʁH PD/ PD/ ` 0*A4LO3pz#JU  P%AE,tiMʁ PD/ 8 PD/B  0 A4LO3pz#Jgg6YIjZ|SM | ; [g[ĵ*q5MsJaN&+Y!-YW̿9Y [cfc_BvD>a倫mV10~y U.ǬYuu'+A e̻}c&'e)(<?"I.YFB^=z{`(%nr Jh5ĕgLTfPQioIU,c<#wՀ.>rŶ%+Y#M?'03G/T"Ti]DFۯľ@uzt9#kVRdĝaɑ8f:oS)R }B,+I+>OUo1.[kbO6 FzK^%7}6VN2x<$D2&9>6Zb5gK  PaAE,tiMK]{rEF+L%~ll-px̎Jÿ¢گK'LW<@+a  P.=Dw~ F} O>]pУ  PT?D{ W0If*(=($KRS"m2Z"5ֱ̘AЁ  0BA$4LO3pz#JxaIDeLr %_Q`%׿$@ P P3ABE,tiM.Կ !)# }"g&pƁ ( P8aDmW$}#sG9:% x PcD/ @ 0*Ah4LO3pz#JT  P%AE,tiMʁ  PD/  PD/  0*A4LO3pz#JU  P%AE,tiMʀ h PD/  PD/  0*A4LO3pz#JT 0 P%AE,tiMʁ  P-D/ X P/D/  0*A44LO3pz#JU  P%ARE,tiMʁ  PqD/  PsD/Ac  0UAx4LO3pz#Jyez~)|_N2Zx{h J`"|11Y@?{F&Ox@#Nwb_tݒAb++f! #Vp5Cikla-FZ-[TYđ|6;ױ!_gKᕇQ%O`0 p P-AE,tiMJ$$xڜG1 H PD/  P*D 7ya@qI@ H@` 0tA4LO3pz#JpBD(Iu9Fzٲ2r F4w j>&B $Xd 0g; -#!6Wӣځ PLAE,tiM]-_,\R‰0dkddax53g G  P_D-d8;}ӺmԙzQm[j)d/(q` }C&A#Vt_f<:;N@8 PD/ 0/A4LO3pz#JE#N P%AE,tiMʁ P=D/ P?D/ 0*A$4LO3pz#JUP P%ABE,tiMʀ( PaD/x PcD/@ 0*Ah4LO3pz#JT P%AE,tiMʁ PD/ PD/ 0*A4LO3pz#JU P%AE,tiMʀh PD/ PD/A߁ 0A4LO3pz#J5U+{ Qߞv `튴Y{(ѷJco L0o# Jc;\\ȁvOP=a.BC)V.سr`Σ%fN}`tIY0@ 2GY%Sk9)#ݩS{*t%&\Út?œ&4B=FexR Ԟ /R쫋c5ՔjIkC*CP '$+ܩs>Smغ, 2[jl P5)'p#n]0ݤoW}OV-I0 P1AE,tiMID:O;[<Y*a P-D/X P'/D,G Ȇp_f iu@GL/Y\j xWU*@N#e{{@k_TI?7,Q?/>p(kFykv4s$5&". m?kQ$߮ ]&k7%o#(5 ~& "JP7r2ZD=!@ PAE,tiM=q$G ;|9s[T`x6}[iǗHq:QjZu1r GR N$Q3d}G 8}$E0_jWVxP; 2gHFr݉qoX~~,g6Ach|( P-aDjH ZC Gۣ@x PcD:> r j0!m-|>L)"\K;ROm^v-[hC7>.hyp2_jd6w&3y],=*ځ@ 0ZAh4LO3pz#J4YjM$GI@rv>4 IjU *$} =Pyp P)AE,tiM#k81 PD/8 P%D9>Uy@. 0oA4LO3pz#J4GM%!) HleFc@9j}K̥}0𹀋oˇ@X@k]-< P.AE,tiM%d^ѣ PR=D9cjs 䀦->_>1w`*H"=G/'vQ.\Av1$ࣱ P#?D}π 0.A$4LO3pz#J8+wWP P$ABE,tiM *( PaD~mx PcD/@ 0*Ah4LO3pz#JT P%AE,tiMʁ PD/ PD/ 0*A4LO3pz#JU P%AE,tiMʀh PD/ PD/  0*A4LO3pz#JT 0 P%AE,tiMʁ  P-D/ X P/D/A!  0wA44LO3pz#J5 30Ұ6HSd"ٜ2S"~DIdNnY/MU{`aQk|4ɗBz,O xհ e_MQu rVuĔ ײol${rA Qz }2I=]\*siٟuen?B#-Z27^ 0_]H6Cȕ$؛?Vշ( ;>StAs2BdYgrϧrcהrr:?L o:U j\c[ٿ6[䚩9=b 7✐ҢeUcxazʁ! P<D,O<CX ㍊J= "` 02A4LO3pz#J%7PA=0B" P%AE,tiMʁ! PD/"8 PD/# 0*A4LO3pz#JT" P%AE,tiMʁ" P=D/" P?D/# 0*A$4LO3pz#JU#P P%ABE,tiMʀ#( PaD/#x PcD/$@ 0*Ah4LO3pz#JT# P%AE,tiMʁ# PD/$ PD/$ 0*A4LO3pz#JU$ P%AE,tiMʀ$h PD/$ PD/A% 0~A4LO3pz#J5O=+6 9o)>-YTpR*F-9!lc* )6\;i 452-Dͷ^0DjNqKK(޻cۓə$!=%`MXrw*:N넨hF=Ȗz'z*|D#i*\d<ɷ)RO4Caۈ>Xuo8$`CUx ~4IPXrh/kl9qۊT\G!~ ˇo h!Ȣzp*b`9<K}jZRER[++1 = ށ%0 PPAE,tiM&=$O͋B"YJ%p@0eopM% Ph-D9_X"aRCp?֌ȵhַ K6u:?f()7πЋUδo *N(/ Mց%X PH/D::ExT\ ^8S4!^reYTt1}YOM7rcNˆqɁ&  0;A44LO3pz#JTׄ=fT-1oذ񣲁% P$ARE,tiMM@5% P!qD\hA% P#sD]f  & 0*Ax4LO3pz#JT&p P%AE,tiMʁ&H PD/& PD/& 0*A4LO3pz#JUCuAu0us "g(  @@@P(`hﱒ57e?Ǔ 5%Ǜy.$ɫFVQ#Ik#ǩ~QNMVGm7)  G JvDk6S9ظlqbQ 5Y^V|h1fAP {<% dڂߙ}iEkM< j*5\. %&((4yCl"DYU[gƮMN, ncޏ0ܡ' */M뻾+|k%,oFj7w|fƧS8Gnΰ@;e׬=:y03ѐ]4gWjqo(cD tǭ.{)(lP }/2?~o"Y<* 8-x/ij˒Rda cv}?D=پuy+S/fhYq j0o.: ||J|ZgQ-i*d,%:&wJv81?c;m^T{'7]1R'ꓐcNj<$Gށ:XU:xrlZ1: ӗAd_J^R6WhtCT&N}JWb(ns6WnNnWB>B{#)ʢ?)5,Md cZN>\Do"ݶ0cx@z9MW\/4g>XgAGE]*nbq~G$$Lap|U鎶ѭ2\=ߠgi;.̜JIQ1 DaCIj7 ˊ]3# G &\=$&vQ1ȲQaJF%kF~sVĎQK Xj9BYݥɜ`DĖx*qQ{{ֲr@eYd>r+7v22[dDi<1< ?;LF0,owƚ{w̸d@M)Ξ-׀(ú+Fq{xPxlSlC87K uƴm$w`܀ ]zu_K,ھaLrbQcDS(Gm9/q< qXLW<_lDTJWшejd B*n}^DyPZ>^dz)LnZ2 5.3s0w IVG'2):@jfVYCj:m&rU.\u2 ]ב>╠0E-{Jk.3qB|&c-VVwE26[:}bV4/v~ ŘQIG(&L) rb")D>عW7eAFpi\I6.,AbVj wIb4M;cХ觪*:4FhuK+jfhB.ʺN. {xlξ%ѣsːxz;]^VdD徧#(onlc$lQkY(MmПΣN2gV [݈ٮo`g # E4l:026Tknz)]w;`ktUWH[ *WX:!h1xj0''~EZ?7lj$5]WHEqwlz~hPlu7?,L g wqiX"wCPnUMsv+oEV±Y ǽQ`uMԋ蒔l*=q=w[_#Q^@٩QHep5.J"Pa#+Ӷk@Tne3bsg^>byrp#e/ Ww*XG !=w4 )9e, HVV-RrL7P W P]U5c4[+:jS\sG}:uf^zr{ =^|MdpŮ7ou·z6n6OLǿ+)cWֹE'fq&P›"v.|8񟥘:P o 8[d(DgEWaW^BPF1s6c=u37 wDk6r6Tǝ kxNm.j*]ԮNH~uF/(qC&:%'# 8*LR#ZވMc},Z}#22"5P}%IYϨgy;T`U!lL*Oa{> 츳 2 ZwN.ΊfLc NB_JS`vRĥ =;$|YXE[kL4_f*+w. W#Ӂ=|lu )ةUq-u?SCj gbcoX?z'xuR?46CsT$s-הђM"o/&O!(ܦQ׸!^h/;ܻYwH"6Mo ɴ~v^p/<:v4T׀BC1MR`1J &>^x1sZ%}|?"[d>: vzr8;,b.Ͱ5s[*au>.A3 C'Ϥɛ@Es6-`l8<=ۏWɀ2RXJ:Q8Iv)#=eeTH]9qUmPqSS|BC:}l\'i,v}Tڻ3C?B "RB,Uٶim 2F->9}MM]D]7=Q[7ͬD9;i F"=rK:A{[>0IȒ-æ  3n&[FӟFZ au*fm4 |T[bmŒoobpCtR WT!UHe[~N1\If!!BS~3Dݩ)84t͘ $[)Ul|:mxS&2焭`7K)mĜ˧lC}a6F&SII{KrNFC)oA HQNCJ02D\nD"ZJ?e){z^-;HiK{mr10 whό썜%]6_zhvd!JeT+1"6tďSv9a\oF޸}flPou.~-s` |"ÃL*P S TBюy̩tq- lT6ʩfJ_@V"͗)t~Mu<ybs"ԲK:[_7W$ \R8ؚAJAa @zX˥Cf"&~-KbD!m TE!Փ}k5wYMO~"MD`s_,\@`fܶ)]s >jR?ǝhM~cAg ejEŻC]^> @n)&Cý7ښIn2$4ZneWBq, j@v.p#u1ƥL8&s䣌yVweFNut b(Q0}YR _a$3h[?Wj[c4fpo7rOVnQu&uuwn&΢QiS=lO퐽x.]Y7ݫТgHYisޜZ>gxd #}kἣ>kWyn>1#KޠiNf{Daht>COA.>`@_Ropb "6 B֧}K0s p#vx WK]ݸC !B^mJ A OI-N q_8mݡsy' qNcKZGV:m XIYa958qzn4)RLc?}<'Ehܬ櫆\5Sޚ$u9Z5'uU8\7=ホU}"2vMuA+F+PemBNsE$2֭.6\XQA AwwFju-<^A=Y(ޛcΎ⁇@BȷZȄrM $ s pMc/^#V5ݚ\pʥ6fXY0LH<_PΎj7eT`4QFuzz%Sy; m v(DH;YCN^agt,Kyn0sPn+ LV(ŷnK4rSմ~`)mҍ'tGmSFEtZPAuofM|ʆ*TJMbÌfZF+p޻"}7UڶQ2z*BS@haDіsGEbKqT59[d/Iuyig~8͘;ed&h7e$l58ޞ?֫w-uyu(4wN[9ºbk^v:\psI ҾM; <THM;QC'0 ðkӚIˣIa~"^&TC2&p-=-{oU:@u!}NmY8#*BuLFc6B'kF &("WҁV;Fa-Zڡ9G;H&hE9bF6o uWLJPl1V u׎r@ݩf;tW U1& RvN[wtgϥ)QJ`G氷~ Yl' E+H擞w!=.]n7Bz1/ЉcW$uD;KYS&%^iԟ~DЂ($"()3,sJDݭ 6?$.Bu^΀4-.h`Iֳ T+t&Ӵ!-}.E"o.4$ ׏GplCM%}GԎ@]b?ܠ՛ uk-]^M=<GIؑz+ҙd 8"o ?_B!6 u֗ڞ#vۋ{g~>>-Q#%oZ =:@MCݟNyd^#1GقIdʮM~~"kiMӯp4wm=*pqnTfǖ΃%%5J,*4jTۦvU5~tf5oL"7R3XoTfL!Gn ΋zD o!]vUncSWl7)>$G= F5)۳j/O MLBǵӭ`åklq ֥-A?}[.'ɉppYaJՕ{$ aA%MEJ9Gw$TCo  }4"N&:V6j9v%N쮅u.&xtK_΢9#0z[kc4dW뚆mhYOCW@._ݛ|% K[vJ˜MxS@HO5HW3È|GWwSL:P]wϘip KViR gar(Vjc_HKN#ssDeŜ@Q x"Bg/)/.5b y|}-r4|e&#m#A\L8QLnj^fHRy0>;)6틾VˋRa}o'Ltz)=hG" e1[PះjjtRKgϽpI\K,ew`ZFLr!AcDY{g- PN k@ԹqSQ @ܾ' # >ƦQdHX@SO뮃 m:yqV(5;l\%}dM]v}@M,JKf5' h?饕xMR8lUV cK߼oG? %v6U&f` c-ߊZ tFAvB2 5԰dy?v" _ AC/kr`` `DDiI.ɼj L. _tWL9mʽk>n&?j|lc'2{㤤7/E6ͩVL)ifIs*K %D X'NeҶ݊'%|6o*;--Qc|Q_>qrIoP<ΒƐDh37D8iXG=i"|YOb9JHv>%~7iD;Eok#xxF/A#i'8] 90tʰedNwG[T%˚hDkLZ:G^#g٠Ϡ ((Y17oi>1g]F$r$FOCvHBh(~vC5W@_⩿Ū&=ÕPٛ.#5NR6.**f4RmdV)Z^ŮήЇ^zxj+s'j&j ]::e݆)_t 'Dٲv^GWZcߴG]_a 1al+$Zvm2 %o/A2K F."ʶ(2y ePR#j҈w~z5&\ЉJknlW6ZlH=¯m`Q UO7ߨ;EL4Uk-ղL76؄}"" + nI/\Dm࿺5zꄥΦSX6<)tO:ŒT~ Hj*37BYͭNZqjwv5$ډQ\Hא5Wku ;N.h we[7<{uЁ>C\ɩzeY6*tv5;c(#{,ķE`:6=US*[M8*NV!uޥ?W} 8ɞ ޓ "m>wɁD҅+>''c1ŇI 6|-GIz=/>9#[U"rL:r߿ݢ@G Kؒ[vVs ӱz<? OLMLobH{D!d*]d{ah]1ƽvdvʰD^cT˗Uֻ^wJCr޿.xЭ7P;pHs|e'Y~A ž݈ DpN0| IW2(|:>9P}?tG{HJA55J1Ler|iN6֥QH䠡XǩbPQ(6ko[M8}d:C .N,.T2'Ɣ+vg;*PxD'K@v(H zd ZI&ɵ+zМ|VM.e j1{?bFsc5,1|3$\s<=Eym+D>HTW|~nil}nqBmXyp<b)^&fH .A\r#[W^t0Шkkt}AJ;0PY 7bF|_DG bE^a7Ԝ8l8bz oB#8$hBʘ53&k"e^Okļ|F"蒊wO+P 1#MNx&z{.w32SGfxT=! TDFN)cȩ^_fua7Zϋ$~e a(i~I K񎓪"D0%GxONo.5Aѥ/Gd ~YlڈОw_ofO'k#WCs'YfUTJ#Xv0s,cUV6L@jt!p#[>IsAX=уpڅD hQaZA:-XrJss|LoGN*cmLmǸ>G,;fqmO%%0^VPepS4?cOQZ6 =^یJyռ?FQ;&XՐזG;罔br/*|X"2T'LW(Z_8?KGd."YP\:hp PaĖӌXlQndDdqHr>=BE982(!bG G)du1%Qy:>ImGIK7r2=nSaqv6 شU]ov-?vvU]1ny5=q?UsW:S=:$ Ҟb BH 4$ !zF-8¡M J ׁ 0IA$\D!d@-dMy}\rqwTU!z\ /(ҠZ@NjĩqO/,Ba>z.+\Dԓk\7۔9 P1AE,tiM&q*\~vL]@ h PD/ P/D9V_i]2N~FE( 0WA4LO3pz#J'DhǑ.K*h[-0/ Y0 P1AE,tiMm mz0 ж| PW-Ds;KsmE:ϔ4$[ڦy,=]n+=ɁX (Hb'[ƁX P8/D+3+"tP9hFH  02A44LO3pz#J&C7F  P%ARE,tiMʁ P'qDGzDh{1mnZ(9 PsD/ 0*Ax4LO3pz#JTp P%AE,tiMʁH PD/ PD/` 0*A4LO3pz#JU P%AE,tiMʀ PD/8 PD/ 0*A4LO3pz#JT P%AE,tiMʀ P=D/ P?D/ 0*A$4LO3pz#JUP P%ABE,tiMʀ( PaD/x PcD/A@ 0Ah4LO3pz#J4J!4ڌua0R'YWZ3f{r|񮣏}  9lƶ߅91TBb`!j2o K?_vU^񣰶tO !E E"GR˵`۲~uhXj_xt-&[ѿ`R_3xX>q PNzGE %b*M32ȐFHzXbݚ-$|* )oaS3Yh>D--ְqh{E^[=IbBbD2jՍiu@ PxAE,tiM&BsrbiDyC(Y*đh7OQ_@Ldq?&Yi0.JMO?;ӷQj`Pf@ PD9b`EXJ $ ٥C6I=4>S\V"L2bWNlf36YRh Fq##C]ؔyhx3ż*=W?bxX2JœK PeD:<3zAT'h^K( <kϠ#̫b`Nm@#`%(I?xd2_r d4P΁ 0@A4LO3pz#J7zQ>KQ3 Qw8 P%AE,tiMʁh P$D&Ϋ` PD/ 0*A4LO3pz#JT0 P%AE,tiMʁ P-D/X P/D/  0*A44LO3pz#JT P%ARE,tiMʁ PqD/ PsD/ 0*Ax4LO3pz#JTp P%AE,tiMʁH PD/ PD/ ` 0*A4LO3pz#JU  P%AE,tiMʀ PD/ 8 PD/A  0A4LO3pz#J4mr鋿hIvtIq*S'q3Us(8ZIB@\n?stg[1u7 Nɬ|qs k +1vz,c 3/K^ruR6@Z-d@9ו/Qk;Щl9U{KF8#K_OA FƧ IRxQN+Rׂ؝(:7o<V(#xnE}L궿adE- .QG/ YL"p4ΨI|I9a695`*M^na3+]^"\`392G.W_O7)Yf ف  PKAE,tiM&B![lߪLC*݃Fϋ#Yr;tݹ'  P(=D^X4f+ ;  Pj?DsI#Jf@t'P&O㞒̀FR sdHvކ+}/ e_ I2'B:}8`yOYDq  0XA$4LO3pz#J'~zk>>[aVè~1p"Iɖ%5f6aŁ P P7ABE,tiMeV*`ˁ ( P=aDpq;>2#{41AWƱNY x PcD/ @ 03Ah4LO3pz#J%%GquP  P%AE,tiMʀ  P#Dtcb-  PD/  0*A4LO3pz#JU  P%AE,tiMʁ h PD/  PD/  0*A4LO3pz#JT 0 P%AE,tiMʁ  P-D/ X P/D/  0*A44LO3pz#JT  P%ARE,tiMʁ  PqD/  PsD/AW  0IAx4LO3pz#J4@I17A| wL@<*bg9gZ}lypQwpf'.%%pmկΤ&|YKHЉ.UV`̜*YPJLz᣺'`v:W+Or|F1m?j#E*C8cm~@ET(9Cg"ۓ@x;Q?:YXLEa#B^.6+JvZuREḁրV>>Q Cu~Ls]TꐃA. ApGʁ p PeTvYW)ԣVq\5<&TxsocMJB~l+7Xy棶8 P(D.HFIx֦T 0.A4LO3pz#J W P%AE,tiMʀ P#=D Öb[ P?D/ 0*A$4LO3pz#JUP P%ABE,tiMʀ( PaD/x PcD/@ 0*Ah4LO3pz#JT P%AE,tiMʀ PD/ PD/ 0*A4LO3pz#JU P%AE,tiMʁh PD/ PD/A 0A4LO3pz#J4^!& )msܿ w *$CJZ!]--E}PfMڔno{1 IkXwJHpPMj; 4rC[&bͬ}At.\)̰d)I)Jqܔ2xU.쯒s nFm`ߕv%a@ؓ>h>|Ȱܾ+u$'Zr.׏!6 Tw56[$QکS`R! 2!/Wr|cG)]0 P-AE,tiMnSK ĔzȠ} P-D/X P*/D9ﳜ, $4 O~(@  0vA44LO3pz#J%(WcJYx5bM)$ N4#6(7fh /9&@sTǵWjV.dJ PYARE,tiM`*K1ĺ pyPU,P, /4B*ϕ E'R70WMm~]@ PqDs9 d6n@fÂx:Dk[!$$7 BInrn͑{vK<+MSӁ PEsDOA~w>vΉM:>ZA_rBuOh"~I 03Ax4LO3pz#Ju.ӄ+J>p P%AE,tiMʁH PDnU PD/` 0*A4LO3pz#JU P%AE,tiMʀ PD/8 PD/ 0*A4LO3pz#JT P%AE,tiMʀ P=D/ P?D/ 0*A$4LO3pz#JUP P%ABE,tiMʀ( PaD/x PcD/@ 0*Ah4LO3pz#JT P%AE,tiMʀ PD/ PD/Aʁ 0A4LO3pz#J4Q rm3Qx?J?,B=Q[v Y*@DaG7r?<sd||F/+B6yEc{@ƈӯf}.5W۠Xc@rr~AK=c %=J`˪}6uOA~*8O@nk~se*n=.*<,{?pxdg6t, O0ƃaˍ w WֽѤu*YqQ" H6L{i&yDtXK҆6\ &YS97OX|I\!` Ҭ(ֶs`|NтÄ\%zsvyn'J89 PeAE,tiMs}~dA2Mc%c0@2Q0N'*+G8{hl';7vjA@h PD9Y+ngJ$5A  HUWCڒ' T-*:&5D:wFV8j1B3k"ǥhdf8[oNW =n33ǽ?gjk@ H@ PrDs꘴yGWj_jŏ=|ն[sGj[lҧ*5Mrݹ>nRFYTX?ΰM6`+9z|H2܁ 0NA4LO3pz#J'D7TRo%lw\V5L߹y/V4\p0 P%AE,tiM"jU P+-DÖkY䰀P@飭X P/D/  0*A44LO3pz#JT P%ARE,tiMʁ PqD/ PsD/ 0*Ax4LO3pz#JTp P%AE,tiMʁH PD/ PD/` 0*A4LO3pz#JU P%AE,tiMʀ PD/8 PD/ 0*A4LO3pz#JT P%AE,tiMʀ P=D/ P?D/B 0A$4LO3pz#J4)>Am=K{9\)h'%cA,/cpY^EMe v\( ΝYᒎ& 8`4sVh6zG$ܴs6Z%T:mAp3@&W+n D/ O^55,go/ST پ4@~@s b& fk}΅(^>s+][uMh wG%1?Gz"t.x)Y=zZ ӥ/e(닻}*NA*Aj*"> ɣށP PPABE,tiM8%O~/9ySxXc|,|Cs_៷˹ࣺ( P,aD_]h% K]N@x PcDs^O5`fUX"]+1]N6|څ,dװgv|ASo9dՅm<1vf+$̹'d0+3@ 0\Ah4LO3pz#JcvHzaivŞ%'1c9Juqz]Vۛ~!$`Á P5AE,tiM'xR9yizIT_5 ʁ P<Dd|%ӕZz$`s PD/ 0,A4LO3pz#J6:K P(AE,tiM? ᣭh PD/ PD/ 0,A4LO3pz#J6:K0 P(AE,tiM? ᣭ P-D/X P/D/  0,A44LO3pz#J6:K P(ARE,tiM? ᣭ PqD/ PsD/ 0,Ax4LO3pz#J6:Kp P(AE,tiM? ᣭH PD/ PD/A` 0A4LO3pz#J4ug*UA7% کzT0ڸn^#1Vg@"f*g(12_͌wbnvzv׈)ZJFJ.ez` *D_#Z; ;hmEP~Q1ֱ:k:Jy٠z3Fq=(_04'.*;D<e29k`飣}_Bz 7S'ЇBdJr6{S W≪~:8\p謵?‹\VÂ1ot>D @ 87a@ԕo؄QlZZ:3IpҺyO>+UCAt _jaZ$35(Xߣ#Zⴥ*6c& ^hp"^G wY?NZۣā P6AE,tiMo0{ib?R=^Z?O`@ PD/@؁8 PDZ|LL.U},C l H1T tmm&eB`_ ]E}d &&yt4\CT3E+\^j $Q4rReu+*r{o$$!x+0ǃO.pf\") >Tt xX%l͌PPK@ 0A4LO3pz#J'56DGG+JRLy; dr*-_6I j}OOJP+t&"+S՗-sm"ܶFNд@6`Ł P7AE,tiMV\uݕ|Jj0$eJr@ P=DXV! eR=}_ցQͺ`]j;e&yznO!8;ܓ;ơMҧ\n |E$ lQJO0yi~ˈ eJL8D<ͣ P'?D.ٌs l% 01A$4LO3pz#J{ViP P%ABE,tiMʀ( PaD/x PcD/@ 0*Ah4LO3pz#JT P%AE,tiMʀ PD/ PD/ 0*A4LO3pz#JU P%AE,tiMʁh PD/ PD/  0*A4LO3pz#JT 0 P%AE,tiMʁ  P-D/ X P/D/B.!  0 A44LO3pz#J=:+#5xlu&)="1XSKajk$W 0c #VWM:+څъ'Q3wWIX DPΝ%p2kdOŖX݁s0&%[EjaCtLAQ6 }uNIgXgG] `NQ-F.O`/alg;)ad v&rl3 k€ ʶ%_(RB2DH62p6E3V8/1+Qs: Vs(]nNQeʚTT6zǿeDz2ŰZ|b"Vq}BiUGޥxET E0a8LLFt%jCq(5{9LzDl , cgIrS͍n[EjAiQM䷵l_MzjmܳTDlĬ@nw8E+(`ȁ  P:ARE,tiMoP ?^mC$Vkn+  PqD/  P&sD_^FA43]5'`A@! 0Ax4LO3pz#J@h-A?ow0OT.'YR@&F M'XAj0lt]=_GY H\*t !p P)AE,tiM;*ԁ@Ɓ!H PD>#W۶9 blҧPUoq;e{S6py yAV`>]8yMb<،׼l(5v2N}^b4aRYRA?aӈK.Y}`U{[,ہ! PMD/4Ł}ќ!WfCp^5 cb %dVVr<Ɂ"` 0;A4LO3pz#JS`#:,Rmb" P$AE,tiMM@䣭! PD|"8 PD/# 0*A4LO3pz#JT" P%AE,tiMʀ" P=D/" P?D/# 0*A$4LO3pz#JU#P P%ABE,tiMʀ#( PaD/#x PcD/$@ 0*Ah4LO3pz#JT# P%AE,tiMʀ# PD/$ PD/$ 0*A4LO3pz#JU$ P%AE,tiMʁ$h PD/$ PD/B% 0uA4LO3pz#J=:dLj]Mۃ/ jի(&GZB\M%ALnL -׬=/P$H h%Qu؜*Ɋ;JDy`of3SmvGͺ ! V)v9@͖{4 [R_=`D}VWϗqcur*DOJ_:L싞7Z{^dK5wRd=lqxp[PNxTI+ y̽, HA͎jMDrg`fg q&ĩ5s*P$\ܔV1m/ ^|dcU`٥wddOU{C&cTB}gƊ8kNnXǙ}a):hY} l]`|9>YzGAH I1D葲ai&r (%wTնO珱YE-UH.@]_"Gߤw-9$B? rPPrTݛC;,Y3^u ~ϛA@x{& Og,(*Nkb Ea1oy5kXM؟%$@QŦ9O 3a ɍUi6ށdr:$5H.ZKZ_ Gyn20U\ܓê&'9S?G{4;׼IrQ0~oqrS[sUJ+"caUPO"|dM:u^*@%X P/Dy@ģfCNym5w|ܚ/vCCBohr'}0bX<e *$ܟ} 4IקSxtA$Ca_6( Τ*p΁&  0@A44LO3pz#J(ɾqe0rxd`BvL% P%ARE,tiMʁ% P/qD9N&EU_n(4P.࣭% PsD/& 0*Ax4LO3pz#JT&p P%AE,tiMʁ&H PD/& PD/& 0*A4LO3pz#JUCu7炜@Mu "g(  @@@P(`hﱒ5_eǓ 5%Ǜy.$ɫFVQ#Ik#ǩ~QNMVGm7)  G JvDk6S9ظlqbQ 5Y^V|h1fAP {<% dڂߙ}iEkM< j*5\. %&((4yCl"DYU[gƮMN, ncޏ0ܡ' */M뻾+|k%,oFj7w|fƧS8Gnΰ@;e׬=:y03ѐ]4gWjqo(cD tǭ.{)(lP }/2?~o"Y<* 8-x/ij˒Rda cv}?D=پuy+S/fhYq j0o.: ||J|ZgQ-i*d,%:&wJv81?c;m^T{'7]1R'ꓐcNj<$Gށ:XU:xrlZ1: ӗAd_J^R6WhtCT&N}JWb(ns6WnNnWB>B{#)ʢ?)5,Md cZN>\Do"ݶ0cx@z9MW\/4g>XgAGE]*nbq~G$$Lap|U鎶ѭ2\=ߠgi;.̜JIQ1 DaCIj7 ˊ]3# G &\=$&vQ1ȲQaJF%kF~sVĎQK Xj9BYݥɜ`DĖx*qQ{{ֲr@eYd>r+7v22[dDi<1< ?;LF0,owƚ{w̸d@M)Ξ-׀(ú+Fq{xPxlSlC87K uƴm$w`܀ ]zu_K,ھaLrbQcDS(Gm9/q< qXLW<_lDTJWшejd B*n}^DyPZ>^dz)LnZ2 5.3s0w IVG'2):@jfVYCj:m&rU.\u2 ]ב>╠0E-{Jk.3qB|&c-VVwE26[:}bV4/v~ ŘQIG(&L) rb")D>عW7eAFpi\I6.,AbVj wIb4M;cХ觪*:4FhuK+jfhB.ʺN. {xlξ%ѣsːxz;]^VdD徧#(onlc$lQkY(MmПΣN2gV [݈ٮo`g # E4l:026Tknz)]w;`ktUWH[ *WX:!h1xj0''~EZ?7lj$5]WHEqwlz~hPlu7?,L g wqiX"wCPnUMsv+oEV±Y ǽQ`uMԋ蒔l*=q=w[_#Q^@٩QHep5.J"Pa#+Ӷk@Tne3bsg^>byrp#e/ Ww*XG !=w4 )9e, HVV-RrL7P W P]U5c4[+:jS\sG}:uf^zr{ =^|MdpŮ7ou·z6n6OLǿ+)cWֹE'fq&P›"v.|8񟥘:P o 8[d(DgEWaW^BPF1s6c=u37 wDk6r6Tǝ kxNm.j*]ԮNH~uF/(qC&:%'# 8*LR#ZވMc},Z}#22"5P}%IYϨgy;T`U!lL*Oa{> 츳 2 ZwN.ΊfLc NB_JS`vRĥ =;$|YXE[kL4_f*+w. W#Ӂ=|lu )ةUq-u?SCj gbcoX?z'xuR?46CsT$s-הђM"o/&O!(ܦQ׸!^h/;ܻYwH"6Mo ɴ~v^p/<:v4T׀BC1MR`1J &>^x1sZ%}|?"[d>: vzr8;,b.Ͱ5s[*au>.A3 C'Ϥɛ@Es6-`l8<=ۏWɀ2RXJ:Q8Iv)#=eeTH]9qUmPqSS|BC:}l\'i,v}Tڻ3C?B "RB,Uٶim 2F->9}MM]D]7=Q[7ͬD9;i F"=rK:A{[>0IȒ-æ  3n&[FӟFZ au*fm4 |T[bmŒoobpCtR WT!UHe[~N1\If!!BS~3Dݩ)84t͘ $[)Ul|:mxS&2焭`7K)mĜ˧lC}a6F&SII{KrNFC)oA HQNCJ02D\nD"ZJ?e){z^-;HiK{mr10 whό썜%]6_zhvd!JeT+1"6tďSv9a\oF޸}flPou.~-s` |"ÃL*P S TBюy̩tq- lT6ʩfJ_@V"͗)t~Mu<ybs"ԲK:[_7W$ \R8ؚAJAa @zX˥Cf"&~-KbD!m TE!Փ}k5wYMO~"MD`s_,\@`fܶ)]s >jR?ǝhM~cAg ejEŻC]^> @n)&Cý7ښIn2$4ZneWBq, j@v.p#u1ƥL8&s䣌yVweFNut b(Q0}YR _a$3h[?Wj[c4fpo7rOVnQu&uuwn&΢QiS=lO퐽x.]Y7ݫТgHYisޜZ>gxd #}kἣ>kWyn>1#KޠiNf{Daht>COA.>`@_Ropb "6 B֧}K0s p#vx WK]ݸC !B^mJ )SgHU_儶A2}-5o|J8#1׏|^t&I돵ʈwYj n' V--M1v-) *Sn>[;̃^(=`\p,0 j}<22)ÿRl3sbk#=zM8Vqil#YmVzۊh?UHe[\mE6DԃN8Q߀pY[#¡אڷZbMH,@!E3'wmcO*M $ CtP$ty/%͈ք,KEj  t߁ѫ"f 6Pb ͜/m9)'@Txع ɬy0~tS|253IY Vѵ3^ tqpZ耀kiEt ؀ʴ*4e#Xet֕OF:rf36SA]6?=]֑k 47sͭwUc!KNT|{az+/ܰ5HZᛉI 8PvUI 3!d:n(s4aN0⫻sx~.e C +$`{h,J@h/Y^@OD`߭PURnztC7,"+[ҁ /u ظ?3V`pI-"g x"B>D19^4) u֯`팳9>FE2)NU8S)Gv?x}}VxOSW0x ƛLnѠ_!">;P!8Ll6"sw&G#Z0}2iҥ{yQ% sϩ>gJK[(8?E~W_gjpCjUP[Iǘ.5lيlujzA\vϿ0sއ'l=QnM㾆: g+ 3rzaTSKlL  HLXJM>Xs%z4ܱeԩ4N's] g==xa\83tf' 5M+3׳,,k2XTiE2Y&P]d˪) hD@ˋu+cs2ܡl0t3sm&`j%i/~ۮĺgu`whx{^F/*HD n-3"OqI'$ `]W+Vo-ekƻ8HmI\?AQbDodZ\n~ p?܂34d(2KI݊Ə}ɝA@.e7sfԳBCwu_z Tn~I3@ sЄߗ #< -|@gve 3gYqk:3?]i"cDKu* {[ {D1o?។kqӌ?73{ {:BK|^Gݱf iW sɸz企bR?2h @pAP=J 2O0iLn~ma{!!`ou*e]6z[\:DݨHDD*- /~C❻ʏ.ۏDWt\Q_7:EA| le//0hfI0L)j|ؘjE`laGΔ&) qh*/.[7 QD%\0__Iٽ$c-,`4HLS}w!ТWt8X:u!Avw>O1C0f4hN>E(**g,}p6 Kdw,O;\A`UuK/ˠQy'(ր1o 'c8}M(ʨY}'#Db4]>řOIlfl.vH>= #4z_9I媊EApD^M=ǚ('-BDw-oɁN2hh>`@+Ħ֫.+elueiҊx*(i\PuYFBTiL?+(C&xdzRlgx { ӟ=Y!ns&-uY6֌'.#xC6'FhE8Z5Gg3Ni4 nl:jZY;tE]qDV9' K _G(O]/:$4 w!gP LkeC!tY m s% d'/SzR?kS~{K 2~ t@ʭetځ')JL_$l.I_c+`GVU\71%)vPP,CDȏj?P]Ac6ҼNmw*ڗW[\nJhAgElI=1q1[Ge,_X8Aџ`J Oun}|Hb dvџ= kNa MP?^4Of%d_ >$(2X̥D ֕z933-&p7[ zĴ8R;. >P[ݭSqK:]up"?vr3Uv]50#Xlָs !:90e+qf\fKЀ.H ,*ҥC3W)2拣3JSܝM¯m]$W *Fa#!$;(K0VU WSLawsdKB hj|6(/i'a$K?V߱Xaý,}T_mhiRXC;ϰ<㆞.+HnUOHM` Zy5/{ȃEoh?s?4jL$we$]YИ^m1eLGZ\OKt ·d]8ȊKy9"§Vꞣ~^J^sTV["*LOQ'HhDiu.b!`z}:r P$= }s%j+5܁o)enm7_NVVP:EcN#s;tgNeq=ΒC,a: j;44j נ;MZ+&|`]S/9P8tQIuo%O[b7oUH!e08gAj[6OM/Ա=P ]J 2@%xXzFi-GؾV/ \ɇ_TiraG='A[)x@{2 jawD4NM0B;PuPdl*]N05zo0 ZgyKʂzҽqq{-`FJ9W̑]+KJ3kxMR]Ź6!G^ a8dboz@Y2j6xa P4,ג^wa@,ʝ /2G}I;ܗACn}m7h0Û%@I2i1EnO![EOr}atdA*u@Y>n-5*6m6P>0j/~1(ڶ(U̪뷫! y.Ha /dN07_6e Y2M5d='~  X]I2Te An EMwUxWESnBQ~,IOܳ7&l.##t(j J.s}NRxiٗJd>IpR]@w;y>391df`Vz[Μ d=f+kҕA|^'rJH Rzc1Oܟ)4ٶȇK|* yF1TXƫ+l#!CFl}uT$U5QprD hQaZAq˴Jss|L@mAmL/mǸG,;fwmO%%0^VQ d&&w1E Ɋe/mer`p< r~vI>%ڷ2ek#19Wx Xbt,L r]F*^UiNMq {WvL@!Ŏ[ÀVT+7\-B|7tv9ytuq <[*[D,{=x3gi0LijqNCIk.RR'fA ܌i#b{\oz~?fAZzs~N߅ڎʫf3&' C2}j\v_dS𖗝 A\fZ(o\/H!<*XLׁ 0IA$\D!d@-dMyTڳV;M嘌o^ͤ rKGxnafYCH G0`; P{ϒY XL@OmEAYBK;؃ou~4 @ lFjq!q{/zZQ]F j@@rPYP P.AE,tiM >,9MkG̈Zwh PD/ P'D:|nT.>12A@ 02A4LO3pz#J+b6:sGEѭJ:Z[ h,3BIסL[ǯ`YhA9Z)kj-5uC7()Upe{f9ϊSBZ.@~O* MɷL~7Iy\PXR̲Uvt†+9فWՄj*t_ 3 U . #U'p$ ojJ6*77D2CW 6n^Ҟ&V>F٥jA:Âa@WBTo>{3/R \m)*Q|mD|Xx!т{P2 rPsrNj;J%9 246z_W@a݄{,3Ќ$Xlq i{[/\G%G>y*Vl\0;Z9e{#K70Q@0_? qN?o.=K2ې glQ7m1r Ĭd﹆>=2g;ǻ۞d W~Bws'B['lE!xhf`1FWYj-ޅ׍t-YMz&)ޣ2r~9?j7ʠVsUss8eela,#VΝeyZ^h&;]~964kt 02A4LO3pz#J\zSCXh:ࣳ P%AE,tiMʁh P"D#w="࣭ PD/ 0*A4LO3pz#JU0 P%AE,tiMʀ P-D/X P/D/  0*A44LO3pz#JT P%ARE,tiMʁ PqD/ PsD/ 0*Ax4LO3pz#JUp P%AE,tiMʀH PD/ PD/ ` 0*A4LO3pz#JT  P%AE,tiMʁ PD/ 8 PD/Bȁ  0A4LO3pz#J(8"H< ^j)a5ٟ1vOYNmgUQ[A5_AeWnBZqNpV=cڮ|I^`4~ [hn{y}5]S~ઁ^BՋ!B0V$fOlEqboe,W%حNCXW4 ۼe nDRx!E)U P7>+ p/Ňكu8U/(?V@Wvŷ,j{66@`۪Rdēߝ>JLKh'؋h*싃fENCZAl_QtygEc=eib*³n&/QB9AITXĤd(M wWVa(oiw7S S8φՐ?YLRQLy⥢)sF =gerx_C[Zu3&:FLP˿۲JR=NV?SOC$Zq<)e0"UB pE 4Gٲ :-˜N 8@b]^M* !x h@  PzAE,tiM'1An+CJez»A-nX9,EYR? Κޟ&ZL_96aBgCrTnja+V@ׁ  PI=D8%糦}݇zFC"D_mZleGCA  P?DvzZRI_6YLւ# `Hj\Tk$A t4xwEfb tqt\H&uh ]2x; Uw ۂY?a *t$8vs"͕ ^pKYy2Лr{?e~F]!FQe2R|,E2|̼:?ݬiCOM3ց  0HA$4LO3pz#J f+x6Nh͇5X!m̛n P P&ABE,tiM5IFmс ( PCaDo6 3'5|p*I-fR'%j4snwpYFP x PcD/ @ 0*Ah4LO3pz#JU  P%AE,tiMʁ  PD/  PD/  0*A4LO3pz#JT  P%AE,tiMʁ h PD/  PD/  0*A4LO3pz#JU 0 P%AE,tiMʀ  P-D/ X P/D/  0*A44LO3pz#JT  P%ARE,tiMʁ  PqD/  PsD/B'  0Ax4LO3pz#J=8㷶9o|őJ־0o_9ͤk0; m᩼iSgdY]E g~/:i2_DzA~]HxY p:b:턦([+ Iml$gKmső )Q )ncC wOCh?]`'03l159~KΙP&Y)خ !_ +Fڀ9ႝݣ<&k`c w}(z q^8L@a%@"ge貑=YdH=~*DzBwj7|YNG/Kd )֙95ݓ޽> U?GIOmSM9ş ux+\SgNԦeْ€ܨf 4PǚBU`QyUL0&s^0gi&81xāy~|@+ĤLۈ53˃wQ`|-W& p P-AE,tiM z쾷CMkPn>p H PD/A  PDi `~,P}*g!UB-OM7IZsr5a5M<:j9MЄ%,y~G&nݡ΀^C}oIsC=g-,?Ԧ(aՕŝEglez1Cm61_z?4܍q-){AIЫh<(1S H`NһOX/b#sW 4Z~ΟȺՒUo,Nっ@` 0A4LO3pz#JYmو =b (]v>q4J-pHwaJ .c>aJ|D_('g\LBwzZ5pmp*~0A^4@+)NQ$g8*ć3K{>>pDp 9֩JO sSlT8f3I91o#)B_] (M@ 0 P-AE,tiMo]w2pA P-D/X P&/D^FRqĔ"xA  0ZA44LO3pz#Jȳ r'ʩj[}`mfj_W:6@`=u}!.i!$͈, P(ARE,tiMoa@@ P~qDE6AeR]QXLP>I]Tts!r+8$x> 1?z %x.:3F@0<xHJ;u[{dH1с PCsD tcYLx}<5 9A4"(6NY@C:cGK4o6v;n21рA&\tQD|)g_dkW7qAYoAӐԴC0:=M uϧ\ۉP Oِ z: V# }~Aj`[3MXaz ӦqXj((nJT% 6Qg٭#k@π PcAE,tiM R?y؏3bڼʟXs9sQ frh.4NȠGᥟ]iH3z2e[v TXށ@ 0PAh4LO3pz#J!w7yX{1h8Մ5fV`}:HA P0AE,tiM ˺@NTZy/4Ɂ P;D*ߘc\>6Rh;{M$S%m5t PD/ 00A4LO3pz#J vtw^€ P$AE,tiMxh P$DT|$ݼ9 PD/ 0*A4LO3pz#JU0 P%AE,tiMʀ P-D/X P/D/  0*A44LO3pz#JT P%ARE,tiMʁ PqD/ PsD/ 0*Ax4LO3pz#JUp P%AE,tiMʀH PD/ PD/AŁ` 0A4LO3pz#J=9d>FЍ#泿+o$)V?Ԅ_/@PmUJ㋼sVۉ9}.Q%>g[m1 "J4өqwUR&؈oPw65$ÛF 22M+u0K&әcS'"rg u-4ƥ˰{tD 񲕶fe!_~Cjb޷ro$]0) ӡ sm|f=ì 6I6@[F#q̏D;GqmOwSqQBExP$`Xl{y H+m c`_lהf?%9=⹴FMVelLCBxYcb/XŬLpǂ;76P=ԣi P4AE,tiMox+_f]h5 PD/8 P(DaA8;ǽ H%`^q@ 0A4LO3pz#J(cȒ+~3ɿ5!(&gkN#!",<..0zw8rĽ8u]t#od.ĂїGDd|XAO}[;k)Ł P7AE,tiMbbR(#L:. 1@ P{=D~?\mn;k"(SCtYS u#L< l ߱Juk4Ĩ\ZQ5<1=+Ť+}"YJpK{ ˯+ P+?D]!v!T4 0*A$4LO3pz#JTP P%ABE,tiMʁ( PaD/x PcD/@ 0*Ah4LO3pz#JU P%AE,tiMʁ PD/ PD/ 0*A4LO3pz#JT P%AE,tiMʁh PD/ PD/  0*A4LO3pz#JU 0 P%AE,tiMʀ  P-D/ X P/D/B!  0A44LO3pz#J=:f 3$m8Ӻ0i;%@ eg`9qF;`AànR̪3ҮTovPwzthFbtlVvVD]* ". 撙eXyLK I=^*n{YZe>)Vh ǰ)9po7F#>1^U{+aRiPyA8˴QDi]>ҤյQ-phL=Fq$Dr/?i\x:\%?94!n<_,oz[v@哐! )Jm.?38خ,Jf|8>}!+8*^i;`x,Vkg>ۗqp~F0"G eZ ~\>dWT>  P4ARE,tiMuV3^7r2GjO.z(  PqD/  P-sD$ >Wue`! 0oAx4LO3pz#J( ++ҿiLy4/ Rd :ZqS Rw7b|ZgeNn;pprm c/U0<+}@_!p P-AE,tiM٭9s7>@!H PqDҥp+%k~&}E^7|Ѩa~0gs-]8ڪ&; 屐Φ?BI [X+t?PvV2W%v X67 S~Oz`:WL5ΜDf4^'.>OSM둾H}塀eaR Yr( $,H)Y;3w&rJ0IRֳj&# tlGo+r n)QHڐ \}D3|% P-ARE,tiMΉq(zpʁǁ% P9qDo86FKʧN/nAMGnFo% PsD/& 0*Ax4LO3pz#JU&p P%AE,tiMʀ&H PD/& PD/& 0*A4LO3pz#JTCu~PCuc "g(  @@@P(`hﱒ5'e?Ǔ 5%Ǜy.$ɫFVQ#Ik#ǩ~QNMVGm7)  G JvDk6S9ظlqbQ 5Y^V|h1fAP {<% dڂߙ}iEkM< j*5\. %&((4yCl"DYU[gƮMN, ncޏ0ܡ' */M뻾+|k%,oFj7w|fƧS8Gnΰ@;e׬=:y03ѐ]4gWjqo(cD tǭ.{)(lP }/2?~o"Y<* 8-x/ij˒Rda cv}?D=پuy+S/fhYq j0o.: ||J|ZgQ-i*d,%:&wJv81?c;m^T{'7]1R'ꓐcNj<$Gށ:XU:xrlZ1: ӗAd_J^R6WhtCT&N}JWb(ns6WnNnWB>B{#)ʢ?)5,Md cZN>\Do"ݶ0cx@z9MW\/4g>XgAGE]*nbq~G$$Lap|U鎶ѭ2\=ߠgi;.̜JIQ1 DaCIj7 ˊ]3# G &\=$&vQ1ȲQaJF%kF~sVĎQK Xj9BYݥɜ`DĖx*qQ{{ֲr@eYd>r+7v22[dDi<1< ?;LF0,owƚ{w̸d@M)Ξ-׀(ú+Fq{xPxlSlC87K uƴm$w`܀ ]zu_K,ھaLrbQcDS(Gm9/q< qXLW<_lDTJWшejd B*n}^DyPZ>^dz)LnZ2 5.3s0w IVG'2):@jfVYCj:m&rU.\u2 ]ב>╠0E-{Jk.3qB|&c-VVwE26[:}bV4/v~ ŘQIG(&L) rb")D>عW7eAFpi\I6.,AbVj wIb4M;cХ觪*:4FhuK+jfhB.ʺN. {xlξ%ѣsːxz;]^VdD徧#(onlc$lQkY(MmПΣN2gV [݈ٮo`g # E4l:026Tknz)]w;`ktUWH[ *WX:!h1xj0''~EZ?7lj$5]WHEqwlz~hPlu7?,L g wqiX"wCPnUMsv+oEV±Y ǽQ`uMԋ蒔l*=q=w[_#Q^@٩QHep5.J"Pa#+Ӷk@Tne3bsg^>byrp#e/ Ww*XG !=w4 )9e, HVV-RrL7P W P]U5c4[+:jS\sG}:uf^zr{ =^|MdpŮ7ou·z6n6OLǿ+)cWֹE'fq&P›"v.|8񟥘:P o 8[d(DgEWaW^BPF1s6c=u37 wDk6r6Tǝ kxNm.j*]ԮNH~uF/(qC&:%'# 8*LR#ZވMc},Z}#22"5P}%IYϨgy;T`U!lL*Oa{> 츳 2 ZwN.ΊfLc NB_JS`vRĥ =;$|YXE[kL4_f*+w. W#Ӂ=|lu )ةUq-u?SCj gbcoX?z'xuR?46CsT$s-הђM"o/&O!(ܦQ׸!^h/;ܻYwH"6Mo ɴ~v^p/<:v4T׀BC1MR`1J &>^x1sZ%}|?"[d>: vzr8;,b.Ͱ5s[*au>.A3 C'Ϥɛ@Es6-`l8<=ۏWɀ2RXJ:Q8Iv)#=eeTH]9qUmPqSS|BC:}l\'i,v}Tڻ3C?B "RB,Uٶim 2F->9}MM]D]7=Q[7ͬD9;i F"=rK:A{[>0IȒ-æ  3n&[FӟFZ au*fm4 |T[bmŒoobpCtR WT!UHe[~N1\If!!BS~3Dݩ)84t͘ $[)Ul|:mxS&2焭`7K)mĜ˧lC}a6F&SII{KrNFC)oA HQNCJ02D\nD"ZJ?e){z^-;HiK{mr10 whό썜%]6_zhvd!JeT+1"6tďSv9a\oF޸}flPou.~-s` |"ÃL*P S TBюy̩tq- lT6ʩfJ_@V"͗)t~Mu<ybs"ԲK:[_7W$ \R8ؚAJAa @zX˥Cf"&~-KbD!m TE!Փ}k5wYMO~"MD`s_,\@`fܶ)]s >jR?ǝhM~cAg ejEŻC]^> @n)&Cý7ښIn2$4ZneWBq, j@v.p#u1ƥL8&s䣌yVweFNut b(Q0}YR _a$3h[?Wj[c4fpo7rOVnQu&uuwn&΢QiS=lO퐽x.]Y7ݫТgHYisޜZ>gxd #}kἣ>kWyn>1#KޠiNf{Daht>COA.>`@_Ropb "6 B֧}K0s p#vx WK]ݸC !B^mJ A7/  4m wxșUI]x1"(?|ayjtͱ@ӯ\P#Z!$5~\t6~0}" %@g臭јuEZɡ  |ag)*6akQʯļ)$O")W3{VudemBNsE$2֭.6\Y?QA WG8,-y\}P_-yi&{زQ]#Ql^ {"!GsJGJ2ONH2PNl ~\0bUqiғ 6k%N4vȴ8P֌.`ôR.Ha@tp9%b̌[{F٧*9[:N7'|wҌ/w8Y@Nh*՞Myb"A]6?=]֑lA=mݸ0ry>>% ha|>WV~$-;Il_!xp,@3}NuA)Zv54L{RK&xU΂/ A+֋ө.vmnY矀km >䛴ܤ0/iGG f,l"\K[ŇT%ƾ+x \{.XE񽶿ULU 3Ǯ^L@iW+z]nbz:dFE2M&}yfPSE H5tv[ 4%O6 VBn}B/ %x0lnP-ǖP /}5?1#lAF(ΦOu͸l0(ʽ_&[ד8?FΞ!TvN HZNkz0@iߘv\( 4 xEݛ3"WI+f'V3l2)Ce0aZ\`452O|A.iڌyp4CeJ_9! WSႦ߮K Z л,2}-QA\OhsQްO(<>ZUnXOnalj5Z[?P3]O="|/P a ͌]N_;c3w`1#FSj0R.?Gsp" ߛD]'l8٬ Fz@@:>X|`pV _k5ϡf _U|M:oz%ic(blղbP]9ad}3쪹?`d$.l2ʍ9Bga|V^«:˪)QLqe俵(z8=u\xmik< Y9,㭲E+sx.HuؗA6 {]X˙xD(GжD m5)5Dyb'q&n.Jǵ\ؖ;GmEɁ ) Jt&tj9N 7T)xAZyl9Bx;NBj g)"z큏f (WydbSb[!9g6KѲ*YILㄛ^9^-1@CsQRAHh΍rɣ#h0{P%^l|ކ׾N"NiH#8Ce{2.|TH9(:>Ҟھ7| *OgQsQGV ] @Bc\BͪYPW4h~J@o8។kߎül- o蜗" j"-˭H1&/ ? 4r=(9F uMf2 `fw=OhRBz&k8(b&7?x8p0[+7ǝ Xa%TT?NWDG֘y4h;7ݬԃv1T8U!ۊ; ?厈#Hl6{M+2z~Ñ!bBs:x* %A%7xA4ḖM,n@26?{E:Jl֢ž٠Dهpa9h29VP`NܜգكY*|WYCH_)P$U,Ed-m[,ym+Z~ %>0܉xM ]cc v_Tjv='\ae,DR"LV@-ߋĿߔ8K|f=vmVTKX|ykpٷҪ=w&fwh<CA9k&FUMGf%!^aF y8rҎmJ5貚Q>3MOZcuLkU~M L 0XTo@\k ڀ6ZPQ@'#Sj\jݩ?8DW<#J[`ԿzXͶ̐%,G[X:{;A(S#@@QF4X!Rnã.X㡆 H15<:,ڇَ}U<$'fNSkpp XvyAҹr]I蚧5U@έifN|N@$aJc&<nj6B\ZK^֑{58S],5̢ d a $ Dj02;hϛ;mjM @8n}+%d*gnFa3?VxP/D_F=luXlҺץ0rX-LJ(X32,0Jl3c0w e*cgF,zQ{MzQ\7uV ׳x;eCd.lUJ}L2˜H:7LCTm /ލIOkm̓~ muA{h}1:}/&ʚYlBaK56 0^SchWXpwiY~u&r] Q_oŬT%-0 ֲoˉrSZ}駑>QxQu,m-zqÎ*`K7~P#OPѪ[ݔqufBcoX_Co`D7O]HbIK(Þm}MgMiCcQ#sTqW@aV \PW[6lI[̷f l ǕqTb}::CGr#N0'l ʁq9:{IOEކc%'`P;ĜItW߮$7ج8@_i sMF8RDuX7uCE1f%UUܶ~cy| ˠ77/2=u(n&oEl=GE<.m34EX.X^b3X;eX"/GG1eɪ]\@l@I[iN$+M"N d]_Bmo7bQ=>Ӫ178U  ǻRӨ>DgqI #qhUoぽjj% sh+.%D8r|iN6֥! 䠡XǩbPQ(6ko[ݚ8}d:C %z}cJ~3(| "Ts?‡ ;Y9=ynQV$xdڕ:3K {?fl=u1&EPz%?O&\s<=֒_Qw{oU./6\!g4ZsKglB,ؽjˆ.qJ30گqfwʢ٪Fںk&&@г_{^KC zQd O탤f+Q슗 G'}x?%ZmtdHWHhc6q뾶*`֦̚)xM=]gY|(tѮS2473"ȇw|>+>%4~(&gKDDdB:܊EgZNpxJۺ@p널t+>H: r$HsYiD~m^+TmRv@0:/_zng{OՖͧ= uFj*v?+\ei3$+<(a_k%^M[oX$ '/HiF iF:h eUH?i=w3Rq\-ߜWq1szIh9{7\fxG(1tnS'׭ځ"9>ﰺ2 :,{6wKZPH)8MT)ϼ/ڌ9oDLA BUuՐ;Mصcd0y /dN0_ոe Y2M5d='~  X]I2Te A E-WESnBQ~,IOܳ7&l.##s(j J.s}NRxin4WJd>IpR]@w;y>3913dh`Vz[Μ dJ@kȕ&^'rJH Rzc1Oܟ)4ٶȇK|* yF1TXƫ+l#!CFl}y\{8 YǠ᝵ nѮ 2´t[İ ;,e2+>۫綃ڙZ_RۏqXv%y*JKza&.ʤ hǪ l@'&):{ɂǫx/uڣw$gjɔC!,v{ʻTb`n1RGt2M\ujo|`l", b9'^eApL=(WCwGcGWKN1cŲEM"!Ƞ"3; v ƜG4)%Fvd6*MWk<+bV}vѾCk9;QUtLzݹ<}VfO}_]N7Jx^H"3⋌Г4+P9HO #m4('ׁ 0IA$\D!d@-dMy~aUg~ǖfϲa~7OUhU q^DS6Ai,-o@h PD/ P*D:f[LQ* ~SIm 0dA4LO3pz#J(9*pCݼCHQމڪې9) 4c4>{GmK+0 P4AE,tiM<_y XO0\ds1ң Pe-Dsk fM4vM&*ΎwFqَ듑o- _9.I+Ur o i/dq奆5q9BρX PA/DdjuҸ)&ƧyTrDp(@=!  0*A44LO3pz#JT P%ARE,tiMʀ P)qD[U]1jzN g PsD/ 0*Ax4LO3pz#JUp P%AE,tiMʁH PD/ PD/` 0*A4LO3pz#JT P%AE,tiMʁ PD/8 PD/ 0*A4LO3pz#JT P%AE,tiMʁ P=D/ P?D/ 0*A$4LO3pz#JTP P%ABE,tiMʁ( PaD/x PcD/A@ 0Ah4LO3pz#J=7;~Y[f-OH&:% fJaG"sy~d.¯X@S}~(d@P!<0ߞw>8`gPeXکg;7;Gtwʺϲ5q\N'l@uӁnZzEs( r(ҍ2CL7wfb뱬"-5VhagoNd1 PpAE,tiM'Hƒ"'R#9A8nOFC9O3L(V0u룖v(n3OteE1@ PD:$Ncj;i>]'&*I _0YyFɏK0|'[%h(60IS-av,F͏#|,Ӝ 9:iMGxѝ[.҄iOot PfDO9Ϡ!Qp+`)p#iP_cԁxwA+(PdOo wBcÁImCT ց 0HA4LO3pz#Jջ*7VI ւ \ʎI:+FTQր P3AE,tiM֑̓:gwMoxbIO h P'D> [D P(D!i7 g 0/A4LO3pz#J&O/p񁣳0 P%AE,tiMʀ P-D/X P/D/  0*A44LO3pz#JT P%ARE,tiMʀ PqD/ PsD/ 0*Ax4LO3pz#JUp P%AE,tiMʁH PD/ PD/ ` 0*A4LO3pz#JT  P%AE,tiMʁ PD/ 8 PD/AÁ  0A4LO3pz#J=@9=>4lp&(.xw|oIHEh'ʨXIRu.*؋93aȴծFdZw'T2:JSkO\(u?h7M+_e,ꖏkgCHQHP҈m? 3!GϙI(D}'1Ldz)(ÄΟ{Е%U|0{1egu蒫6l1Q$Z9Imh.͡;Ku4_PwIL =eՙS9LhJ Ck{NRC|(d*Ax` hNSJzh/} *"eQ{'4|(0ـ@  P}AE,tiM'MoKRKl 0gBtjՇCWu0Jג[50V^ra8~?C,DoȤD"w?6Ł  P7=D;+k{atk |x;SCP  Pa?DtNj0;z1&rT/:d?=Ԩ]3BKP@&SK/v~yt>q  0RA$4LO3pz#J)?RCiG1ZD>z.%[埫m׶Ażq" =^<;tof} 湜$ _3K]T惀>ij>+Ԫ4zaQڨ:l?q,U87Vjm_Ub&W"8r֝,CDucY4HU,4Mg}Mei "gygNo| ij&B֜>c m:=r6b1 #zG;*gAL\_~и_1П+L1EMM3],|P=uIo:D}ZW&=TJ0s,W#˛ |Ȓ1^-TQ)/krj1 p P,AE,tiM'{-B i H P#DnBو@  PD:Qʙ~EZ6=RF`&}#QP=zj~ׯ|ᅰ`@D?zR zBZ޵7c%ro$OQ*_d8(x2Oa)7^>ti51<҅ԉ5_Φ0^hc@` 0|A4LO3pz#J=F)kɫM|ÆX6X-2R!K~ճ}Bsήm/aBp5HgcJޓsx%Hs2IFʁ P["V'  0VA44LO3pz#J,Չʈ@\9\7Yuz <叩H۠^uTk@x P)ARE,tiMj; PhqDsDM,YiDeU SqjP_z3uٿ/! wGiݠBP[y6;=#K yXM}hiYsD/D׉} ^T?f@tA@j¨;wT5R~Khʾ9V./M^g ϱi$3>a@h P(D=RmRa*&e PZD=FY%T65~F{mSۧ**a8"EnF07N>0Iqȁ 0:A4LO3pz#JD^?d(P2fMq-0 P)AE,tiM \OLR P*-D;xuIn tZX P/D/  00A44LO3pz#JN+9Xw@У P%ARE,tiMʀ PqD/ PsD/ 0*Ax4LO3pz#JUp P%AE,tiMʁH PD/ PD/` 0*A4LO3pz#JT P%AE,tiMʁ PD/8 PD/ 0*A4LO3pz#JT P%AE,tiMʁ P=D/ P?D/A< 0.A$4LO3pz#JiV[J24 !R#ĸSp tVI@,Ms.br 405kSB | {OKp׮oHL%,X"sȓQ %Kf"EZR֒oeClD'dP P^ABE,tiM,GGSIKKD͌ܣᲬQD8&컕<Ե( P+aDBKyfg5:lџZi̵>W@x PcDBlF߸:65]حD]T^U];%yfO׀tr#uFB@@QUOS$l{9ϲHªpKh|dGnP@ 0\Ah4LO3pz#Jj'#O<%c ~\ nۻBC݆H0Ũ P*AE,tiM,D͒M(Á P5DB.Wc)ZǼjpUIU~ P"D\AEوI 0/A4LO3pz#J.fw:ࣶ P(AE,tiMh PD PD/ 0.A4LO3pz#J.i{ף0 P%AE,tiMʀ P-D/X P/D/  0*A44LO3pz#JT P%ARE,tiMʀ PqD/ PsD/ 0*Ax4LO3pz#JUp P%AE,tiMʁH PD/ PD/A` 0{A4LO3pz#JV%݂$)qV;ʛ- P/AE,tiM_Ce)@î PD/@8 PxDB:N8ٰ S܃k/ 䣘j?EvOXBx`EQEcBbR;[c$x+ da(KD՜{| 0dA4LO3pz#JV/k! BƛMh*N f yN䀯s2&?L?Ʉ.`ǁ P9AE,tiM^D}s,y[D$ PT=D++AN wEW\AA|R`T/w!$E  X P#?DA{f  03A$4LO3pz#JaF,(*DR` P P%ABE,tiMʁ( PaD/x PcD/@ 0*Ah4LO3pz#JU P%AE,tiMʀ PD/ PD/ 0*A4LO3pz#JT P%AE,tiMʀh PD/ PD/  0*A4LO3pz#JU 0 P%AE,tiMʀ  P-D/ X P/D/A!  0xA44LO3pz#JO+HC݃ȗ2xx /,V@Z#oBTVQ@~EǏVzoFgGεŹC?]q5ugS[4^aA1V*[<@2.{U*sCyx6BӥAkcٷ]?#> R._G1ݽ5גRvŜ8L"TOe_]vDw9 ed;W};w-ݼ_2kzUmnqo5XdQw 1sB=A:ޢxSr~Q| O*},$KfJ+d;/   P.ARE,tiMSpǢ ;o'/0  PqD/  P(sD{o1=4P@! 0`Ax4LO3pz#J?ohk[d>5re([QXl2ϣ!p P.AE,tiMZ&RnH8!H PWD{' t˿q\C|$n#+#l_X& ;NqnHvY9☤RyA6%ࣺ! P,D{ AIuVE"` 0*A4LO3pz#JT" P%AE,tiMʁ! PD/"8 PD/# 0*A4LO3pz#JT" P%AE,tiMʁ" P=D/" P?D/# 0*A$4LO3pz#JT#P P%ABE,tiMʁ#( PaD/#x PcD/$@ 0*Ah4LO3pz#JU# P%AE,tiMʀ# PD/$ PD/$ 0*A4LO3pz#JT$ P%AE,tiMʀ$h PD/$ PD/As% 0eA4LO3pz#JU;;ȣvH*A<i}%hVkwIVb2mD|J~@0|y8l/D6 w`yMBKtڋTt6K=Xg(8bWA v# OD沐.=Yp>/O# q:v6I,z*T*ۚ1;?D[U؉S :Qq &M j^n]#dn$4zEg;{l4D:L:ְ.UD)(`ѣ%0 PXAE,tiM.8Ol7\8Nk/`_A)[_hU#,r%X PZ/DI XI3M? ׄl)Ƥ=`4dC~8Bdn׃.=.B>*&  0RA44LO3pz#JfR`քQ#RZG69m8Z~0Zi D,הԀ% P,ARE,tiM}$a > _% P2qDk-r :GS % PsD/& 0*Ax4LO3pz#JU&p P%AE,tiMʁ&H PD/& PD/& 0*A4LO3pz#JTSk']N u0#@pPTg pipeline.pdf vokoscreenNG-3.0.2/place-to-keep/gst-diverses.txt000066400000000000000000000121131362045215000217210ustar00rootroot00000000000000 #include #include #include static gboolean my_bus_func (GstBus * bus, GstMessage * message, gpointer user_data) { Q_UNUSED(bus); Q_UNUSED(user_data); GstDevice *device; gchar *name; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_DEVICE_ADDED:{ gst_message_parse_device_added (message, &device); name = gst_device_get_display_name (device); g_print("Device added: %s\n", name); g_free (name); gst_object_unref (device); break; } case GST_MESSAGE_DEVICE_REMOVED: { gst_message_parse_device_removed (message, &device); name = gst_device_get_display_name (device); gchar *classes = gst_device_get_device_class (device); // Volker g_print("Device removed: %s %s\n", name, classes); // Volker g_free (name); gst_object_unref (device); break; } default: break; } return G_SOURCE_CONTINUE; } static gchar *get_launch_line (GstDevice * device) { static const char *const ignored_propnames[] = { "name", "parent", "direction", "template", "caps", NULL }; GString *launch_line; GstElement *element; GstElement *pureelement; GParamSpec **properties, *property; GValue value = G_VALUE_INIT; GValue pvalue = G_VALUE_INIT; guint i, number_of_properties; GstElementFactory *factory; element = gst_device_create_element (device, NULL); if (!element) return NULL; factory = gst_element_get_factory (element); if (!factory) { gst_object_unref (element); return NULL; } if (!gst_plugin_feature_get_name (factory)) { gst_object_unref (element); return NULL; } launch_line = g_string_new (gst_plugin_feature_get_name (factory)); pureelement = gst_element_factory_create (factory, NULL); /* get paramspecs and show non-default properties */ properties = g_object_class_list_properties (G_OBJECT_GET_CLASS (element), &number_of_properties); if (properties) { for (i = 0; i < number_of_properties; i++) { //g_print( "1111111111111111111111 %i\n", i ); gint j; gboolean ignore = FALSE; property = properties[i]; /* skip some properties */ if ((property->flags & G_PARAM_READWRITE) != G_PARAM_READWRITE) continue; for (j = 0; ignored_propnames[j]; j++) if (!g_strcmp0 (ignored_propnames[j], property->name)) ignore = TRUE; if (ignore) continue; /* Can't use _param_value_defaults () because sub-classes modify the * values already. */ g_value_init (&value, property->value_type); g_value_init (&pvalue, property->value_type); g_object_get_property (G_OBJECT (element), property->name, &value); g_object_get_property (G_OBJECT (pureelement), property->name, &pvalue); if (gst_value_compare (&value, &pvalue) != GST_VALUE_EQUAL) { gchar *valuestr = gst_value_serialize (&value); if (!valuestr) { GST_WARNING ("Could not serialize property %s:%s", GST_OBJECT_NAME (element), property->name); g_free (valuestr); goto next; } g_string_append_printf (launch_line, " %s=%s", property->name, valuestr); g_free (valuestr); } next: g_value_unset (&value); g_value_unset (&pvalue); } g_free (properties); } gst_object_unref (element); gst_object_unref (pureelement); return g_string_free (launch_line, FALSE); } // GstDeviceMonitor *setup_raw_video_source_device_monitor() void MainWindow::setup_raw_video_source_device_monitor() { GstDeviceMonitor *monitor; GstBus *bus; GstCaps *caps; GstDevice *device; monitor = gst_device_monitor_new (); bus = gst_device_monitor_get_bus (monitor); gst_bus_add_watch (bus, my_bus_func, NULL); gst_object_unref (bus); caps = gst_caps_new_empty_simple ("audio/x-raw"); gst_device_monitor_add_filter (monitor, "Audio/Source", caps); gchar *name; GList *iterator = NULL; GList *list = gst_device_monitor_get_devices( monitor ); for ( iterator = list; iterator; iterator = iterator->next ) { device = (GstDevice*)iterator->data; name = gst_device_get_display_name( device ); g_print("%s %s\n", get_launch_line( device ), name ); } gst_caps_unref (caps); // pacmd list-sources // Der Audioname steht in den Properties // https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstDevice.html#gst-device-get-properties // https://github.com/GStreamer/gst-plugins-base/blob/master/tools/gst-device-monitor.c gst_device_monitor_start (monitor); //return monitor; } void cb_fps_measurements(GstElement *fpsdisplaysink, gdouble arg0, gdouble arg1, gdouble arg2, gpointer user_data) { g_print("dropped: %.0f, current: %.2f, average: %.2f\n", arg1, arg0, arg2); } #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { setup_raw_video_source_device_monitor(); vokoscreenNG-3.0.2/place-to-keep/hardware-acceleration.txt000066400000000000000000000001001362045215000235170ustar00rootroot00000000000000 vaapih264enc --> linux only msdkh264enc --> linux and windows vokoscreenNG-3.0.2/place-to-keep/lineCounter.sh000077500000000000000000000005501362045215000213710ustar00rootroot00000000000000#!/bin/bash cpp=$( find . -name '*.cpp' -type f -print0 | xargs -0 cat | wc -l ) echo "*.cpp :" $cpp h=$( find . -name '*.h' -type f -print0 | xargs -0 cat | wc -l ) echo "*.h :" $h h=$( find . -name '*.pr*' -type f -print0 | xargs -0 cat | wc -l ) echo "*.pr* :" $h ts=$( find . -name '*.ts' -type f -print0 | xargs -0 cat | wc -l ) echo "*.ts :" $ts vokoscreenNG-3.0.2/place-to-keep/statistik.sh000077500000000000000000000010021362045215000211120ustar00rootroot00000000000000#!/bin/bash begintime="2020-02-05" echo "Commits seit dem: "$begintime echo "Anzahl commits: "$(git log --shortstat --since="$begintime" | grep commit | wc -l) echo "Eingefügte Zeilen: "$(git log --shortstat --since="$begintime" | grep insertions | cut -d "," -f2 | sed 's/^[ \t]*//' | cut -d" " -f1 | paste -sd+ | tr -s "+" | bc) echo "Gelöschte Zeilen: "$(git log --shortstat --since="$begintime" | grep deletions | cut -d "," -f3 | sed 's/^[ \t]*//' | cut -d" " -f1 | paste -sd+ | tr -s "+" | bc) vokoscreenNG-3.0.2/preparing.sh000077500000000000000000000053011362045215000164420ustar00rootroot00000000000000#!/bin/bash # This file is only for the main developer, so it contains a mixture of # German and English. It does two things: # # 1. Looks for new words to be translated and writes them to the file # vokoscreen-version-3.ts for later translation on Transifex. # 2. Downloads cmpleted translations from Transifex and writes them to # screencast.qrc. # Testen ob lupdate auf dem System vorhanden ist. progname=$(which lupdate-qt5) if [ $? = 0 ]; then echo else kdialog --title "preparing.sh" --msgbox "lupdate-qt5 nicht auf System vorhanden. lupdate-qt5 ist bestandteil von Programmpacket libqt5-linguist" echo "[preparing.sh] lupdate-qt5 nicht auf System vorhanden" echo "[preparing.sh] lupdate-qt5 ist bestandteil von Programmpacket libqt5-linguist" exit 1 fi # Testen ob tx auf dem System vorhanden ist. progname=$(which tx) if [ $? = 0 ]; then echo else kdialog --title "preparing.sh" --msgbox "tx nicht auf System vorhanden. tx ist bestandteil von Programmpacket transifex-client" echo "[preparing.sh] tx nicht auf System vorhanden" echo "[preparing.sh] tx ist bestandteil von Programmpacket transifex-client" exit 1 fi echo ============================== echo Create vokoscreen-version-3.ts echo ============================== lupdate-qt5 -locations none -recursive ./src -ts src/vokoscreen-version-3.ts echo ===================== echo Remove language packs echo ===================== rm -r src/language echo ====================== echo Download language pack echo ====================== tx pull -a echo ============================= echo copy language to src/language echo ============================= cp -r language src/language echo =============== echo remove language echo =============== rm -r language echo ==================== echo change in src folder echo ==================== cd src echo ========================= echo Remove old screencast.qrc echo ========================= rm screencast.qrc echo ===================== echo Create screencast.qrc echo ===================== ########## # Pictures ########## echo '' > screencast.qrc echo "" >> screencast.qrc array=""$( find ./pictures/* -name *.png | cut -c 3- )"" echo $array | sed "s/ /<\/file>\n/g" >> screencast.qrc array=""$( find ./pictures/* -name *.license | cut -c 3- )"" echo $array | sed "s/ /<\/file>\n/g" >> screencast.qrc ################ # language packs ################ array=''$( ls language/*.ts )'' echo $array | sed "s/ /<\/file>\n/g" >> screencast.qrc sed -i 's/\.ts/.qm/g' screencast.qrc echo '' >> screencast.qrc echo '' >> screencast.qrc echo ========== echo Script end echo ========== vokoscreenNG-3.0.2/src/000077500000000000000000000000001362045215000147045ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/QGlobalShortcut/000077500000000000000000000000001362045215000177615ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/QGlobalShortcut/AUTHORS000066400000000000000000000000331362045215000210250ustar00rootroot00000000000000Authors: Evgenii Legotckoi vokoscreenNG-3.0.2/src/QGlobalShortcut/LICENSE000066400000000000000000000635351362045215000210020ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. (This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.) Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. {description} Copyright (C) {year} {fullname} This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. {signature of Ty Coon}, 1 April 1990 Ty Coon, President of Vice That's all there is to it! vokoscreenNG-3.0.2/src/QGlobalShortcut/README.md000066400000000000000000000004711362045215000212420ustar00rootroot00000000000000# QGlobalShortcut Crossplatform Global HotKey for Qt5.1 and higher # Configuration of PRO File You have to download library to specials folder in your project. For example, name of folder is "QGlobalShortcut". And include this .pri project in your .pro file. ``` include(QGlobalShortcut/qglobalshortcut.pri) ``` vokoscreenNG-3.0.2/src/QGlobalShortcut/qglobalshortcut.h000066400000000000000000000014031362045215000233450ustar00rootroot00000000000000#ifndef QGLOBALSHORTCUTPRIVATE_H #define QGLOBALSHORTCUTPRIVATE_H #include #include class QKeySequence; class QGlobalShortcutPrivate; class QGlobalShortcut : public QObject, public QAbstractNativeEventFilter { Q_OBJECT public: explicit QGlobalShortcut(QObject *parent = nullptr); ~QGlobalShortcut(); bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override; QKeySequence shortcut(); bool isEmpty(); bool isEnabled(); signals: void activated(); public slots: bool setShortcut(const QKeySequence &keySequence); bool unsetShortcut(); void setEnabled(bool enable); private: QGlobalShortcutPrivate *sPrivate; }; #endif // QGLOBALSHORTCUTPRIVATE_H vokoscreenNG-3.0.2/src/QGlobalShortcut/qglobalshortcut.pri000066400000000000000000000005501362045215000237120ustar00rootroot00000000000000 INCLUDEPATH += $$PWD CONFIG += c++11 linux { QT += x11extras CONFIG += link_pkgconfig PKGCONFIG += x11 } win32-mingw{ QMAKE_CXXFLAGS += -Wliteral-suffix } win32-msvc*{ LIBS += -luser32 } HEADERS += \ $$PWD/qglobalshortcut.h win32: SOURCES += $$PWD/win/qglobalshortcut.cpp linux: SOURCES += $$PWD/x11/qglobalshortcut.cpp vokoscreenNG-3.0.2/src/QGlobalShortcut/win/000077500000000000000000000000001362045215000205565ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/QGlobalShortcut/win/qglobalshortcut.cpp000066400000000000000000000124501362045215000245010ustar00rootroot00000000000000#include "qglobalshortcut.h" #include #include #include #include "windows.h" namespace { QString strShortcuts[56] = {"Esc","Tab","BackTab","Backspace","Return","Enter","Ins","Del", "Pause", "Print","SysReq","Clear","Home","End","Left","Up","Right", "Down","PgUp","PgDown","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12", "F13","F14","F15","F16","F17","F18","F19","F20","F21","F22","F23","F24", "Space","*",",","-","/","Media Next","Media Previous","Media Play","Media Stop", "Volume Down","Volume Up","Volume Mute"}; unsigned int codeShortcuts[56] = {VK_ESCAPE,VK_TAB,VK_TAB,VK_BACK,VK_RETURN,VK_RETURN,VK_INSERT,VK_DELETE, VK_PAUSE,VK_PRINT,VK_SNAPSHOT,VK_CLEAR,VK_HOME,VK_END,VK_LEFT,VK_UP,VK_RIGHT, VK_DOWN,VK_PRIOR,VK_NEXT,VK_F1,VK_F2,VK_F3,VK_F4,VK_F5,VK_F6,VK_F7,VK_F8,VK_F9,VK_F10,VK_F11,VK_F12, VK_F13,VK_F14,VK_F15,VK_F16,VK_F17,VK_F18,VK_F19,VK_F20,VK_F21,VK_F22,VK_F23,VK_F24, VK_SPACE,VK_MULTIPLY,VK_SEPARATOR,VK_SUBTRACT,VK_DIVIDE,VK_MEDIA_NEXT_TRACK,VK_MEDIA_PREV_TRACK,VK_MEDIA_PLAY_PAUSE,VK_MEDIA_STOP, VK_VOLUME_DOWN,VK_VOLUME_UP,VK_VOLUME_MUTE}; } class QGlobalData { Q_PROPERTY(unsigned int id READ id WRITE setId) public: QGlobalData() {} QGlobalData(const QGlobalData &other) : m_id(other.m_id) { } unsigned int id(){return m_id;} void setId(unsigned int id){m_id = id;} private: unsigned int m_id; }; class QGlobalShortcutPrivate { public: QKeySequence keys; QListlistKeys; QHash hash; bool enabled; QGlobalShortcutPrivate() { } void initHash() { for(int i = 0; i < 56; i++){ hash.insert(strShortcuts[i],codeShortcuts[i]); } } unsigned int winHotKey(const QKeySequence &sequence) { QStringList list = sequence.toString().split("+"); QString str = list.last(); if(str.length() == 0){ return VK_ADD; } else if(str.length() == 1){ return str.at(0).unicode(); // return Key Letters and Numbers } else { return this->hash.value(str); } return 0; } unsigned int winKeyModificator(const QKeySequence &sequence) { QStringList list = sequence.toString().split("+"); unsigned int keyModificator = 0; foreach (QString str, list) { if(str == "Ctrl"){ keyModificator |= MOD_CONTROL; continue; } else if(str == "Alt"){ keyModificator |= MOD_ALT; continue; } else if(str == "Shift"){ keyModificator |= MOD_SHIFT; continue; } else if(str == "Meta"){ keyModificator |= MOD_WIN; continue; } } return keyModificator; } unsigned int winId(const QKeySequence &keySequence) { return this->winHotKey(keySequence) ^ this->winKeyModificator(keySequence); } }; QGlobalShortcut::QGlobalShortcut(QObject *parent) : QObject(parent), sPrivate(new QGlobalShortcutPrivate) { sPrivate->enabled = true; sPrivate->initHash(); qApp->installNativeEventFilter(this); } QGlobalShortcut::~QGlobalShortcut() { unsetShortcut(); qApp->removeNativeEventFilter(this); delete sPrivate; } bool QGlobalShortcut::nativeEventFilter(const QByteArray &eventType, void *message, long *result) { Q_UNUSED(eventType) Q_UNUSED(result) if(!sPrivate->keys.isEmpty() && sPrivate->enabled){ MSG* msg = reinterpret_cast(message); if(msg->message == WM_HOTKEY){ foreach (QGlobalData *data, sPrivate->listKeys) { if(msg->wParam == data->id()){ emit activated(); return true; } } } } return false; } bool QGlobalShortcut::setShortcut(const QKeySequence &keySequence) { unsetShortcut(); sPrivate->keys = keySequence; QStringList list = sPrivate->keys.toString().split(", "); foreach (QString str, list) { QGlobalData * data = new QGlobalData(); data->setId(sPrivate->winId(QKeySequence(str))); sPrivate->listKeys.append(data); RegisterHotKey(0, data->id(), sPrivate->winKeyModificator(QKeySequence(str)), sPrivate->winHotKey(QKeySequence(str))); } return true; } bool QGlobalShortcut::unsetShortcut() { if(!sPrivate->keys.isEmpty()){ foreach (QGlobalData *data, sPrivate->listKeys) { UnregisterHotKey(0, data->id()); } sPrivate->listKeys.clear(); } return true; } QKeySequence QGlobalShortcut::shortcut() { if(!sPrivate->keys.isEmpty()){ return sPrivate->keys; } else { return QKeySequence(""); } } bool QGlobalShortcut::isEmpty() { return sPrivate->keys.isEmpty(); } void QGlobalShortcut::setEnabled(bool enable) { sPrivate->enabled = enable; } bool QGlobalShortcut::isEnabled() { return sPrivate->enabled; } vokoscreenNG-3.0.2/src/QGlobalShortcut/x11/000077500000000000000000000000001362045215000203725ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/QGlobalShortcut/x11/qglobalshortcut.cpp000066400000000000000000000146361362045215000243250ustar00rootroot00000000000000#include "qglobalshortcut.h" #include #include #include #include #include #include #include #include namespace { QString strShortcuts[49] = {"Esc","Tab","BackTab","Backspace","Return","Enter","Ins","Del", "Pause", "Print","SysReq","Clear","Home","End","Left","Up","Right", "Down","PgUp","PgDown","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12", "F13","F14","F15","F16","F17","F18","F19","F20","F21","F22","F23","F24", "Space","*",",","-","/"}; unsigned int codeShortcuts[49] = {XK_Escape,XK_Tab,XK_Tab,XK_BackSpace,XK_Return,XK_Return,XK_Insert,XK_Delete, XK_Pause,XK_Print,XK_Sys_Req,XK_Clear,XK_Home,XK_End,XK_Left,XK_Up,XK_Right, XK_Down,XK_Page_Up,XK_Page_Down,XK_F1,XK_F2,XK_F3,XK_F4,XK_F5,XK_F6,XK_F7,XK_F8,XK_F9,XK_F10,XK_F11,XK_F12, XK_F13,XK_F14,XK_F15,XK_F16,XK_F17,XK_F18,XK_F19,XK_F20,XK_F21,XK_F22,XK_F23,XK_F24, XK_space,XK_asterisk,XK_comma,XK_minus,XK_slash}; } class QGlobalData { Q_PROPERTY(unsigned int key READ key WRITE setKey) Q_PROPERTY(unsigned int modifier READ modifier WRITE setModifier) public: QGlobalData() {} QGlobalData(const QGlobalData &other) : m_key(other.m_key), m_modifier(other.m_modifier) { } unsigned int key(){return m_key;} unsigned int modifier(){return m_modifier;} void setkey(unsigned int key){m_key = key;} void setModifier(unsigned int modifier){m_modifier = modifier;} private: unsigned int m_key; unsigned int m_modifier; }; class QGlobalShortcutPrivate { public: QKeySequence keys; QListlistKeys; QHash hash; bool enabled; Display * m_display; Window m_win; QGlobalShortcutPrivate() { } void initHash() { for(int i = 0; i < 49; i++){ hash.insert(strShortcuts[i],codeShortcuts[i]); } } QVector maskModifiers(){ return QVector() << 0 << Mod2Mask << LockMask << (Mod2Mask | LockMask); } unsigned int X11KeyModificator(const QKeySequence &sequence) { QStringList list = sequence.toString().split("+"); unsigned int keyModificator = 0; foreach (QString str, list) { if(str == "Ctrl"){ keyModificator |= XCB_MOD_MASK_CONTROL; continue; } else if(str == "Alt"){ keyModificator |= XCB_MOD_MASK_1; continue; } else if(str == "Shift"){ keyModificator |= XCB_MOD_MASK_SHIFT; continue; } else if(str == "Meta"){ keyModificator |= XCB_MOD_MASK_4; continue; } } return keyModificator; } unsigned int X11HotKey(Display *display, const QKeySequence &sequence) { QStringList list = sequence.toString().split("+"); QString str = list.last(); if(str.length() == 0){ return XKeysymToKeycode(display, XK_plus); } else if(str.length() == 1){ return XKeysymToKeycode(display, str.at(0).unicode()); // return Key Letters and Numbers } else { return XKeysymToKeycode(display, this->hash.value(str)); } return 0; } }; QGlobalShortcut::QGlobalShortcut(QObject *parent) : QObject(parent), sPrivate(new QGlobalShortcutPrivate) { sPrivate->m_display = QX11Info::display(); sPrivate->m_win = DefaultRootWindow(sPrivate->m_display); sPrivate->enabled = true; sPrivate->initHash(); qApp->installNativeEventFilter(this); } QGlobalShortcut::~QGlobalShortcut() { unsetShortcut(); qApp->removeNativeEventFilter(this); delete sPrivate; } bool QGlobalShortcut::nativeEventFilter(const QByteArray &eventType, void *message, long *result) { Q_UNUSED(eventType) Q_UNUSED(result) if(!sPrivate->keys.isEmpty() && sPrivate->enabled){ xcb_key_press_event_t *keyEvent = 0; if (eventType == "xcb_generic_event_t") { xcb_generic_event_t *event = static_cast(message); if ((event->response_type & 127) == XCB_KEY_PRESS){ keyEvent = static_cast(message); foreach (QGlobalData *data, sPrivate->listKeys) { foreach (quint32 maskMods, sPrivate->maskModifiers()) { if((keyEvent->state == (data->modifier() | maskMods )) && keyEvent->detail == data->key()){ emit activated(); return true; } } } } } } return false; } bool QGlobalShortcut::setShortcut(const QKeySequence &keySequence) { unsetShortcut(); sPrivate->keys = keySequence; QStringList list = sPrivate->keys.toString().split(", "); foreach (QString str, list) { QGlobalData * data = new QGlobalData(); data->setkey(sPrivate->X11HotKey(sPrivate->m_display, QKeySequence(str))); data->setModifier(sPrivate->X11KeyModificator(QKeySequence(str))); sPrivate->listKeys.append(data); foreach (quint32 maskMods, sPrivate->maskModifiers()) { XGrabKey(sPrivate->m_display, data->key() , data->modifier() | maskMods, sPrivate->m_win,True, GrabModeAsync, GrabModeAsync); } } return true; } bool QGlobalShortcut::unsetShortcut() { if(!sPrivate->keys.isEmpty()){ foreach (QGlobalData *data, sPrivate->listKeys) { foreach (quint32 maskMods, sPrivate->maskModifiers()) { XUngrabKey(sPrivate->m_display, data->key(),data->modifier() | maskMods, sPrivate->m_win); } } sPrivate->listKeys.clear(); } return true; } QKeySequence QGlobalShortcut::shortcut() { if(!sPrivate->keys.isEmpty()){ return sPrivate->keys; } else { return QKeySequence(""); } } bool QGlobalShortcut::isEmpty() { return sPrivate->keys.isEmpty(); } void QGlobalShortcut::setEnabled(bool enable) { sPrivate->enabled = enable; } bool QGlobalShortcut::isEnabled() { return sPrivate->enabled; } vokoscreenNG-3.0.2/src/QvkGlobalShortcut/000077500000000000000000000000001362045215000203225ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/QvkGlobalShortcut/QvkGlobalShortcut.cpp000066400000000000000000000053011362045215000244430ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkGlobalShortcut.h" #include QvkGlobalShortcut::QvkGlobalShortcut(QMainWindow *mainWindow, Ui_formMainWindow *ui_mainwindow ) { Q_UNUSED(mainWindow); ui = ui_mainwindow; QGlobalShortcut *shortcutWebcam = new QGlobalShortcut( this ); connect( shortcutWebcam, SIGNAL( activated() ), ui->checkBoxCameraOnOff, SLOT( click() ) ); shortcutWebcam->setShortcut( QKeySequence( "Ctrl+Shift+F8" ) ); QGlobalShortcut *shortcutMagnifier = new QGlobalShortcut( this ); connect( shortcutMagnifier, SIGNAL( activated() ), ui->checkBoxMagnifier, SLOT( click() ) ); shortcutMagnifier->setShortcut( QKeySequence( "Ctrl+Shift+F9" ) ); shortcutStart = new QGlobalShortcut( this ); connect( shortcutStart, SIGNAL( activated() ), ui->pushButtonStart, SLOT( click() ) ); shortcutStart->setShortcut( QKeySequence( "Ctrl+Shift+F10" ) ); QGlobalShortcut *shortcutStop = new QGlobalShortcut( this ); connect( shortcutStop, SIGNAL( activated() ), ui->pushButtonStop, SLOT( click() ) ); shortcutStop->setShortcut( QKeySequence( "Ctrl+Shift+F11" ) ); QGlobalShortcut *shortcutPauseContinue = new QGlobalShortcut( this ); connect( shortcutPauseContinue, SIGNAL( activated() ), this, SLOT( slot_pauseContinue() ) ); shortcutPauseContinue->setShortcut( QKeySequence( "Ctrl+Shift+F12" ) ); connect( ui->checkBoxStartTime, SIGNAL( clicked( bool ) ), this, SLOT( slot_setOrUnsetShortcut( bool ) ) ); } QvkGlobalShortcut::~QvkGlobalShortcut() { } void QvkGlobalShortcut::slot_pauseContinue() { if ( ui->pushButtonContinue->isHidden() == true ) { ui->pushButtonPause->click(); } else { ui->pushButtonContinue->click(); } } void QvkGlobalShortcut::slot_setOrUnsetShortcut( bool value ) { if ( value == true ) { shortcutStart->setEnabled( false ); } else { shortcutStart->setEnabled( true ); } } vokoscreenNG-3.0.2/src/QvkGlobalShortcut/QvkGlobalShortcut.h000066400000000000000000000025731362045215000241200ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKGLOBALSHORTCUT_H #define QVKGLOBALSHORTCUT_H #include "ui_formMainWindow.h" #include "qglobalshortcut.h" #include #include class QvkGlobalShortcut: public QObject { Q_OBJECT public: QvkGlobalShortcut( QMainWindow *mainWindow, Ui_formMainWindow *ui_mainwindow ); virtual ~QvkGlobalShortcut(); public slots: private: Ui_formMainWindow *ui; QGlobalShortcut *shortcutStart; private slots: void slot_pauseContinue(); void slot_setOrUnsetShortcut( bool value ); protected: signals: }; #endif vokoscreenNG-3.0.2/src/QvkGlobalShortcut/QvkGlobalShortcut.pri000066400000000000000000000002161362045215000244530ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkGlobalShortcut.h SOURCES += $$PWD/QvkGlobalShortcut.cpp vokoscreenNG-3.0.2/src/applications/000077500000000000000000000000001362045215000173725ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/applications/INFO000066400000000000000000000001101362045215000200400ustar00rootroot00000000000000vokoscreenNG.desktop vokoscreenNG.png vokoscreenNG.xpm 32x32 for debian vokoscreenNG-3.0.2/src/applications/vokoscreenNG.desktop000066400000000000000000000006361362045215000233750ustar00rootroot00000000000000[Desktop Entry] Categories=AudioVideo;Recorder; Comment[de_DE]=screencast Comment=screencast Exec=vokoscreenNG GenericName[de_DE]= GenericName= Icon=vokoscreenNG Keywords=Audio;Video;Recorder;Screencast; MimeType= Name[de_DE]=vokoscreenNG Name=vokoscreenNG Path= StartupNotify=false Terminal=false TerminalOptions= Type=Application X-DBUS-ServiceName= X-DBUS-StartupType= X-KDE-SubstituteUID=false X-KDE-Username= vokoscreenNG-3.0.2/src/applications/vokoscreenNG.png000066400000000000000000002114601362045215000225070ustar00rootroot00000000000000PNG  IHDR\rfbKGD pHYs B(xtIME.k IDATxi$u&sc̷^]U5{a7MIJF a$B#KьF5ۀa@!aÀe5lcZF#ElQ\bͮFĽGȼq3^u$4tew"_VfFDF9;9z^ sUU??? U9 Un i~7-9 #ιs"rTD2fή^zLUHT"mU!mv6}^TU5tR靇z D… z'_ҥKx_훼Q8 1 `0z`0__gTU)p FUߞ(`#c"5сC:$GNUGVD1>~{{op@@w7f֫Wsn$ɚ@kh@CAߍ%JU+(* `vc]U:/UP4cϻommm… {j Akx4M'O ^.-;G"\+cD!TU'&D4Uŋ.d0->%I7n>}D۱GA;xsQ${X0Dd}q`/]4$h``c#"38Oܻ}8]+$ ;z׻.v33fYkfܻMp,^[o""y㥗^?ꌢev!Bo-RJ# 89 |y,=Z3ښPc }3ŋ͌wN:s6_W"+WTs?T"[$) 9泪JD$QSm:"*T')E rkkaۧPoVm7/^8V^rv;P 3 f3;YWU x6+HUAZ?L<7Q{o q.]a[Dv`pߡ3ybnkkKT zB 7.^8A{`߉DD?PULNgLaNgr *rj%Ȓ5$,IBb$eI )<%[p2`2`7vmĮ6MI`7105P66\["N.;s!> pqAPgCJxsn5V]" P8[>,uR:֭[%33yntc#DlVa6+w ZZ5%vV r"@ RJ/#7ZS2jOvu@ƪ'U/7.I&İ&Q&;ð21Ir- ~{494O: !VNDy@lRZh7F{ҥK#O:UmҵV|9D ?9TUaQؓGe'*+{1CEcdQP&O58?KɎ@PŒff] U0 $ϵgٕUJ U}Yj$KYHd)k%Me&$Q&1ey WMjB3:|H!̌~keDtׂ4u 䯱I"r˫5KSU[xc4I}׻ޥwBr0ý.ȁCEh4*(< K8~|Pq1'YEij'OsY:X+NaE`YVSVUY /Jm P +W_C. 轅DI#I"IkA ÉBp*prZx'Q Ρ,JPTNKo̿uJ&Fb8Jf>"!fDa&F0auOjkGv%UífYS kbX԰ Ua3ȧ_ ѷg!ĝ֣4Y V>(Y($)fGD`GRU]… D h Ja!"≜ང3 bRR"Q 7 o{4aW" |ͮy  ;a4P IJ _P]i\UDTAs dBZYAiJ5FNPVP%܅$ 澑kOG2D9# %6^0AH !uĺ<%*v'z)I/%K ynSrY&Ӥ<_b2 uD9gjWۑ E0\qO枧EzM+_joppҥk>uů^p9t9yKYvsI!™3{[Pk Bxp-?V_0A,/psgކ6NI%p:M2˯\osQ|"<{ uVĉZIPZlr(hYC0opy1t^:||B .: I.5e% u ]Ԯdk6M%,3=<'-kk ?X%VfE0TΤ ҟO4`[.\ 8ʲ[nMDĵSBЃ3J$QMNIf9^C@0\ (rJ 1w06#pHlg~ ǤdSsiBM$XҩC_;  $/ 0-,ät:+-ì:)S[aV8qNvNaRp(:UT@Ma4j<`RڵV32k=6{Zc$i-&QfCD@;9o8(@]\7w(c#.]ŋGwgB0-@ VkZ9e0ZL$i0)Xq* qƫcͶth ̌(`0X3Ic'*`VT:SQ8cAb=G4Irс~(@;.qrA0֓\7VAOwa=֏|5L2I}.K pPsP/XDAjA*]Qejl䉑4% K)KR!3!av^h,x2TY8=T@L "bA5{7)2ctTheLqQbHWAv8)A~a;HmM@Q Li).&N)T IHհJjTgp 2ANv%UYj$MXħN];`"k, `|S1P"қ7oxfgx 8_a0ja^ b_veBcm 16VrAɣC֚c;mCx?=Bb2^y ޟz1!0%!gIat]: ! )cef_Ok]]KD" PTeM2#~Bq#+z⴬(#:dFMsN 66Ewn/ -Pm8rͪċ%r6dy'X 'K `R5$,uv%UUR=[=qW&ݱh6F9gmndztVMN5.JE-]!uS[$]7!PdPj jHhc)Huh/)u#GS2D)XZK'mx[VH Ϳ+lM|<xpj6JS©(:Hʴ,Kn&k%w{U`x饗KP>J*G6у[+:D'tb>c9 HA(C@KߪQu#Uafp|ۡωIS()hY +0_;*L{x,G䏃7_(<L"jT( y&l qA5MkZJ4), んM" =s47cks?{;r$M 'Ḍry*|ܞ=1ipp+Oרb ђ/ G #)ĎS"C{,JqF]Wn"¤6w \`C3 =LhS60?,~mD|D<|v03czh- Y)RLmZ%90x+(o#7!@ ,3;;;7b)$jѼH2vDDVƣŸP`qw`8"´ZW h(bϣ! ?,!9Ш`)i'1$,y@n" ;q툝!N Ṡ8,}rhЊ;¬hNx-Ri4u@GeZ:ommy(ny@^8BpX3# RD_UЗc6 -k,/b|~,e]^q9 E %D@dmybVR uWqMdbuVZ]dP0I0g4 "ɖ4ӂ"T!_ |Rj/`#SA% + Tg-9[: !0i $ ?"-PR["E!ѯN/UZ =<ïPp҆fP59][$ d.[Klu.K1Qg,, R(J1i%a䳢*ɹZ/T ;ס, IDATj/}KSM[3DǏ~80@ P+ JuEi10)p#cVې~rn2i+N<eȨlR,JP9 TP $=Mz뚭#k_$+' Dŷ耥5a7"+])*ˊ=a 1>*)( ::x;:D5Re ZHmڼ?TL#¿<)NFj\g҃̔E1"M)ps@4-Xf2i5dǎkWƫČɬpހDCQ2zyy СXݖ,ݘD r?sXI+9a`2sXh8JTdV" q\?ݾA _;+GN`69xlѣcuɬtlt.0ua?aa,$;-]#*9k!RvEDXLZUU *0u#%.9vbMO'{wLl5Bnܸ{ܹ3UOBƓR%JEu0t2'$8*{츴/s]%~,PʨqCiF;C`o8d:DeQ9 EU̐)E;:ki:dOj[}geq\U*Bs[L|.,U̿A降Nx]3waGh:4x( P`dHbg#ViT+9\=WZh&3D==9m~qIիWs.^A\k-@ь%=ySQӬt0`nQ i@e(1C%;I(XRcG ^rWoc`,1 qkx/cULC8['t׃OT* V1Xqs8r4p:F{{rrw)QUWkKwEMj^hh4 bDhy5B_GaFmK`>&,< CUFJY:c3T[ S޲y]`;l (_~剟?K\ U>Oۏ AcØwe!Icǎ?!{pdsOG@LgʪBz b8PVTW#2 qdc8~>>=]Qq(bD0Dd3q0v]NX2+ƕe3Lvf8¦Q$ff{fNZ۴ p_D3(֭[a+8y4/|j H 3lS}KuQ.{Dlf1e`ৎگ- T4:W㛼2S=B7=":s7uPT ӽ9W_qnnd37n9! VM ~ [2Rp…g(O};;{g?K}48v!;_qGSOx<|ikş8{'31VW0pM\z_/K'c6-98 +XXǩ8v86661XY3c6a2PQIJNd]!z= [W+XGQxfCh}VO\С'v两[ 8f G-&!Jv/B(KŖpQ=b]wuaPz(l$``8EQI[ٕ{67IР p‹"f Á^h^R0׿@j}=?d}1R^C,KX?vO_|z;w?ǎ('KDQE|cGG~3uЇi IR=z }ϼ<=~V֐ HG1qP?)`gGJW%ۯP8V `nEUv"i15(r9e:8enh.CF)EQhj̏?80=3Ԭ,Kjg>޳>;iMw`:(4MaԮ$v{rNFDmaa!C &CG>u0׋JÈC ǥdǐ9K0} S~;\cm&Fc2a:-eſxȲ$Xt$Sу@Dp5\ |OG_GJ H؊-$;Je'| i-,vܶgl:c \JR?>pRI:)d:)AJ^+_O3"͓ylz㴺n}Q HM">0;ށzE<㵁ZE=;MTp#.]ױv2`N3j"̡"&)w5)~ ΝEXY[xlìs )PzJ*Kߊ4мν3^L" > DCSì V&N9˅#._+OTIi公e%m 'n lFw46_GUEQ<+]_MmSXCzdĨ{o<)( | ^^ϚW֠ys[-Jұ^2 tKO!>'ŠwA\ U,a<';…9qɏB P#3uϼg8cx3}8uw4Eep:Jl6/;Y'v_kun_ Ɠ *T(i3jE3"CdKr7XqǼ !: pѝ|QѴR-m9Ѷ 6)D1LUOSkB@X@SO G7*MXʱ i:Xݤ{*'Т€S0GM:=Nm2e}S_}>W'~vY['%\x߳xy<#AdY]P^|M7'8}x1Pٿ?/Ayߟ`hg\ r rPrx?O*v:)0ĉ"B{;XP2<-DP傁 t- x?,jto3v(AH@i!bXWa,ިqQy BQ-,޸nS8g1$NV G(gLҲ^Q:'g̵ݾ{iHhGËV q'VŠ0^Ӑ>p,5+<[ia,f>? O U{mgOԹbTbe0tV#˿˰J$^EYDY|/N>io,(III /"y;{cU1V* ?XE{"B0 )(Q D+.wWDqT_ NCWCf*U{QiaQN0(BU?*u4D^6?n[cХyY]:+JSUUiEGDg~ܭ[^ ܖѼd.7/hR`ZKmh8$ 3sh[Kܩ>{}:y(~O.Ko  }Q|߇w1$p"X1LkO ߸>!s~tTW?s+*S !}:ߡ#F,+˯K h%BԝVVVa҄ƣ!a 鐘-` 0nzĤ1)iG睎@KY Nԁh:]%m{RU:ږuTEoT6DYQoּɪYU-P 9.EDG8v$+Ӕa^Rt<-fj^ !B tG]AĩMO0 eHL?_ "o`2Clªk c/v"ThdVl}oD< 8N;~;_e9 !DWM[&kIK321@xypb\8<|z?^ _!"l= dNz x#xX_[E$%,~? c`>x:$p uSx|#HH#H5s]`Ta{0g ڭ\~sOc_ڵ7` MS%gi﫟5O m+xجAO4{ȇ.iYZc@E_K[ԚAc%J7 L k&UE%Cf:81PGn9}3tS}d2!όlyIy]Sk<;KN@'?IyQW/c{7*>y?Ԃ B {OaFUVï*b0XE!Mxկ0m$=؀T6 ([m-u5fG8~8Lb0W/EZ2^6u|ax啗`LH;s~9)/ÐۃIH$ x[3ߖݚ[hv;HKJg{S|kV1c\]çҜw,c=Q:ؤ*j^~w"EAN&2@9>RdVie&XQRG{fNoPeMfʫ1GOߋਇ)T> >7ߋ3OC{2Pnw/k kVVאPM\`W/_{ HO?N>8$ dGNoO|!*^z'S33le{vX[;_{o\CQ̰yT}VO/Z`4j\(찹I^=I]3|-=>x4!ʒY`V!p 7, LYPnuޢ;Xf)TǏz %MʲhmK.@}=mD{{{x<w'zt3棧LZ+2T&qVj_(vA_ IDAT/U$ mРRYY}us/~̀vM~'>Gݏ;$y8w7y yއj B Cn/_> hSP~szA0:(<%TWoc ^~ cum8‹'>QVK"a 6Tl,"o\a>8`s#M6u$&IK8#U#IWA苙|^ת.KڃsXKQ*M+Uz"rC#C]Uׯ4hZqYlEeap@znqŝ . эbs;L+T~VX\7R!Uf}%d`<-ŗ^-|틟Ǚ_6 LgMu(~|EWbm}YAup`x0lp5QQAG[(fo]CYDUBYhx{[?AA\~ {$F3cwg7%ƣ b$b2d[$ܛI]a߹^uwUoӳ3 +!E"iIhm ;gٿL#d*Dq`%0 0*+׷{eVϐծ|ι|;ߧ8d jC:#kb6.c4^+=n"8v`.RdD4 JbDqBATNmA%3sZbύ-/*Ȳ $sԛd~B ^"6pҋuϜhH+`AC4c0O"j}1 |_t`{v`-y50A%Lro7w CA5|sv4Uhu$ 1ևn5]t/#w^` 䗪"8í86#!g} &ph6hɧ>Oz Z+ FcؓTf_k?@рR!SEJW̌z,xݤ&{^mAR}=Z!9{ <[xx"}~vQ,/M[1`"me8;{L zcùO >Y)KXjTܗł'je23יLZRc=[r/.YAeoZra-}lX kL&y"MH"~gNccuuMA_/+:,64!RB@~j\zZEC*k-N#tx:\ "'O? A<JJTH*o?fQdx@`8cxPQO )!~9h joƏ}׶8O$Do_ߕQ.e(e"ͮ04E#΁P5/C rSbu< ]UA1ETXF.LЌD[Hu(PĻCi.^;2BK1sdj;0H)j$6Ӎc /Ӽ{ H@&Sh޾tGo6"C [ cۆ (*P}g)Z*OUBC7W% ?\g>dt%/^K4xZn#K/788< ]D hl3Ӣ}ܒ#@QʩCAb}]dR@޸)DJ!{tٺ4v; e2߹-^Ulj 1^^ҩ,h1840R bOiY0&Ke%}JM;5jA\؁(%(jkR/9"z嗃{1b$իUOרIxZL$94 }~BʢW/R} bz B(R;`\vwR u"\&, ~3js.]G8f-\%0 w_@mm87")0fD$$>ƃ!F1_8~ q[6C7%9'W^5OMὂD 2/: r$pgN;)ԑXy|V'^ޞ%b4 _~ AGIMmο$RՋ%FUse23ʽ@%ֻ(R&' }&޽\n\Ȳa DB膙䉈4IL1oǭwΐ`1 0\E?Ik I5[y&}x wp}sE5s0g!dÚ>A:l`Fv|_l)g/fsh l_88b0ςu2)%~sZta87Q!`A 1@z MclT P*A;"o/\'wȹap\wmg}-W(x5׋ /anR0T}EX; &,Ay 0w0F Q8q8Ee(C%ڗ%EQ TtB֋j'Q޾ܾu B "©!E@!UDB4|K2}&لam kb8=uWG@ļwsUCl αk&DHAʇ}"ۑi;qla2k: !fVC $Hz5)\aRĔgntV  @);;; b=%Bo$ccD*xg lҒ6t2VZ!!(acCHX8Uh)C:ft`]|yYփΞRA M 2밨zg '()2%iM )C0;xp߹U9x@)$I!}/C\P `YDލ!B {>COGByeROۃR)pe[F1._| 0_(YP @B@ABc0c4^z k -h]$ԩ(K{%<$Cd&0f6"};]{;Bm6͑gNJTFy`Sobxoql< YbVi/2wCg %'$-1i )r}Dަ xՊ*Ry,_3N@IF㌍ }vν8L,C?[W.C=3r&/o@R^jب :pv*a^G? tiQRP9'UZ#?W+Q ;h¹R5 F!"@-$7oY#z 6>t377٭t8ܺ/a44f{Xxm1xsOR @a`?{%dQm= @i HFs? k(;*?9G0D"ԢZk5GU_ʗq!t )kpvy>ixr;h6jps%!aLӆvH5ed-}փ&gmI6!M@V53^;L9yd74| a _(Tnb[\cCՐ(Qb?!JJ0[LJY^y3"Lwu?"W{SVSgf{#n{f)Μ¼"jv)0Oa%Jx4Bp&RBC#10U蠕AЅ1@A!d0<k j'ij?>b4Ib F-ck7o㍷/Ob()Q`mu VJ ɗV怟15(DB9 ;:7n\G@ZA)4 drj aBxJ:g>>>dBBqY-<ؗ;{291#3S5]]%%Ijs sezyY Aw[!:M@A[E($9Lq q-)Idkk,w':{2)"R`0楮5TMUFp#Cj,x=>)dAр1RHd ܇>Ήmt:hHQo#P;ĉCp8 {Ȍ-k?xWCiMjB4`l azz&;c,݇ \1> ^z z{Hx09`M%  9ɐ|:bhjo^n%1U!&c3e!5[spΪ.RuAKEq%tlrϫ23 \m)MaˊvѬk1IIpxH3y =t/@v\`9 ` >b~pa;< RRd_D&fxX  $νDg H0Ο[JJIPkL:PO|O?0D(B; ZC c-,7Yf$jQv N `0 odh6h6"DQP"E!$=XJS &&=DX?!Ӈ s B#Ph"=Q28gO]NZ8[&BD R~m[=EA 2a {:NCfy=yB7Wd_}u+dY2XcXډj'<{nZ81{C8'@ =w_~e|' `)a8c޼ys"Z.Obߪ3+AŅsݜrw2[`L <1}m50\e"dipbc ksB4#RjB #*94'9F/}_7CQGjDFVC@! 5B_ T'=/{p.C$0F>Tf vYk@9>bp(sR T/XeރTRkQlԑwS(2XxNy~y暱SˮJe@eQb"N >IbA׏!/P<{h9OǨ3 M FbIF.YF1g?~M$`j9bI3 \p)q {ǐrZ'cTux΃ދ 7Rxy g-Μ^ R8P8<KQ0|Z%1%qMWc :P?s2qPEa"BԢf =>7?*U&{{wz7WBs܋}j6\jijDgƫKDBlA*j.|fFG&O-{ĩx>N\lU}PXrڌ%`(Jz,Bw)%H=V.xxJ ifثd%>3_ys=7 `_A8jBtv*w@Aw&y/=,mD\z |$>@۵$1p.1ܑDEQB(@ӗ^h4AF^I'ڟn\z7aYx'#Ш"z zDQA% TЪfB;p;q{1=FxHXk58?5i@@`==sz"0&#ȋi9^9e~GĻ_1}%Wv0 w*~sMA4+w@ fH;{Nb#dDdm,ԗMx<8zA0)U3,'Wu"p`§O #V`GosP9lkͦPR:$pOwr鎒4g3gqk\ T~kio{:Y(kW. ?_v}E;(@`5j&,Z8Sۧ?8Nqm\r/~xG1I28:xX,ً6*PI\1`γs\C9=KAiوQXcFzTY]pieC?=t+͈: W4KC,ȑ{ M 8YQM_d(qf|"Ќp8Y__XI)z8_I$ʤ1`E+UT" Q7pȲ1 i.;#6fÌDW$ϸ|:&0D- ;;rPJڕx?@IhB%1Zm=O\[0y 8}Z Xgj7q.^ \~Յ G҃DѼ2 LĜC[E! Iv{7 P}rgCcavڣNByxc%:9]̞ĺ IDATnjxfcRN@ ԙďP}?. f8&4@!6t2}  0#t*JΘjzX8G̀J&Ω AiV(q[*~<`C(Fa¤1vn=xEÞ+Ϩ0r ӥ' M9-s6ڊwfifsEoA$8# ǀw ǀe?Y6slɔ˄JU9yYI^e-ݦyPq3158vI6PەЌ":x]6AȟE+)x`g22RW^= X.`l}e2H$ l ITi7ݥ$D  (kH hIG߭lN_ yw[L}׹.nPbRq0:3pA)UOh8W?nH)`3plnHs8tn8Z_:'Pl)% DdCӆsXc Zk| _`.Xb}} kMbz=DF}C% [ i ,PZj[n)jclcmѺLy9Eɐsk\| Qn).@, 6-QPgD _n-#( Tg(yV+s2B* R.j^(%/ Tڕ%k7D`*>El2sK/# V>.X~bAT t2Ѣ(1Z o+`Yst"wݍ%l9_#!~wwҥx睋9AQaenw ah.Z-^3g@!1s-o5W]u WC?qԢpuq$J'{qϝS"ACuM䊵 < ƲS.pUA,zT`x:tDE|x9Ϗ9 V=X|T)ͺw#ȲtB3h Žj PYl[nM6]2|pKJ( ہKV3,dPR ~֌1|qaAޅs AT=yl:]sce~ݎO >`u]qZ&yڧN၇ŝ[p,g~‡>anYfNsg l+bѱňZ ( q:!LDH 4ʦDGâ/mMr qdȹvQU-<2p hkA$(ǐq<€$'$֚9 kN$T.vB޳ׯ_XkڅCeW2N03ރ5of@59⩕VC cXg :fBvf9-ADjP#@Z' 1z|/[/}qKF4*aN:@'O> 0#Ri)%?'o?CٜJ|lXH{+RD =e­X@RIre@<$N,wfEV*Iz3t$U}/-ὔx wWy.3-Ft>vDF0[컌+ǁЁ0ꏍahѩ_~Y݋ `Q`4$I&V]>":fp+Q}^<.\*n zu1 1*,oC0,UfʾT Q<  c0aoN jQB)S?O._N~?\~nx<]ٹ4I!#pĞY~/~O[[dzDa+!s2'#|VA V-=(B`YDSA㙖T wkh iKƁ (381p>0M0ir;BT\$tꍜOOE&"\&\X9p)777OV2.NIf8N 3wi@*V AbO&vExC3n. ĚAeg e ic:V Kqf"8^hB()sO|F+6QE?7 \| _OW_&4C;fj!H(Rՠ{Sg<+uZ )%C\K!IRAHT@%-{DYwho W/~-` )AM7<ή7E-Swi̓`A.% dfhp .Nx?A2 ARFCc8LLTgBC*mwmB{p8k὇J#̬ʤYOwDާLhw:xqrs++m.)EQ( h6jPt|4I1I2\| /a<A (ل Y܁$Ej z084dvV\i((q̔,fvYl'H@ ̓}*#4:$qeʿՒK`yTRKQ1ʕ*(t1")5-81R&UMNDS_&$­[KK) VEdX딧\w!GuFa)r::6nݸXs9Xc9O _2+υ]"Iw 0 c >1<#8ukݕWEFN@#j oFap#k_ՋFj*B&n1 Cu4m<X[I 3{Awbrv215TPf C&By,k8ͽ%Zm<.s߼DǗ3oD".O7u.Z ٟAwup " ,B:Iw/I^x DQ}ưv \)Cv!{CKl EN? ++x9$Cd,d{2j;󔓀$2(XRˑ?P(,5L,F爊OV-Ix鉾T^@MKtQ.y_I%D8ZKSW p1w {OD|pp%C܈k֔Bzg F ^qĒ>şRa12Gj<0?&qT{h4B @$i 2d|RFP,݃2@O='zgOķ6{H;hd)XJ&rƟb(yPo!W(uxIg l 26%sW0!IL 1ণc>usVMSPUXq漮GZ&"HR#3 ?8!1KAU4Mp8 z$]. VF/)N&kKY76[)Z?}g[H[ĩS}&ȗPZ Fn9B=1(§QEv!Lgc#Iww $ (Oj2D Ƞtr`ØVۆ ֍ܪ'Z=%Ο9CĉQ'GD*` C jtbs7G)zr*>%[d lf|GQ 4Q3@Z!,eĎ06e? Xj@cI&PiDD|Gd `|5FY`Χ)j(#|^ۍƆg(q|(YdYY:zw˷6k"4|YW>7n≇ȷ霃¿ןwBhx?"338w!Yޫ.neipxx8:w\EJ GuҒO}JR \˹E)|BMfΥKEУCp?{$Nm7qz1ZGgsXdjZ)3(GI" 96^DQLhokۑpmZY} geOrHl3< ^-wDo[|qO "`c%6Z3V0R?uJ v"es'fdϞ&wa@(iFBɝ2R.hb:!M5ὲOUKHEu^?$')9k?o ݸu;hNSۧq v nHh0K<'"KS5v$A\kKWnQ< ZE(Ml׌SJR3o{Ni3hLG)e8x{ri#Hڬ$ % _TTzsi;[Wa'ݸv3i|#Ω/-T[5ˠƪENp@Ƥ䜛pQg:@z\{^'sR(rIF)5qbѨm˖Os@t7.NV[ěosg`1xqp. Bf` (D Yi[llc$aXq&?@6lWuf Ν " B*:}l o1$i !8}~Y#uO!n08GѢqf.{Q 5mP(d{K[t@bo(o5hzM\\VOxBN?Z{R (Z$&##d09;{)%ǪZ z^ a"3Rhaw@ߺ}K9n3.my"ɂ-o5瘷7" r!1hsv*&GfY*5T"13G޽HSue9u =K)1 4McTTR7g`(~TcN2X2} 4oǣډ-888DQaNg}| kSQ$ ~!޾|iQI<ɗR?ƿ7_&66FR8axhqǩ tT+J?:fk{ Ʒ@ zNF jV?Qbֵۧ=5ZËy0l_P=}D  [{WՇVx5q H 20cG>} GCi$Ir59F2#b-@#"umt:tX_[E^2F޾}Kpk=\eiSHn ݱSc0P0L:efi$J(=K`<M$l Ztc4x)`"W6WxܥWHZb8Ix)MG} g߇xZg>3AIݿCzs@|_Bff!#H9ogm7џ 5t:عqYH`0!(x1IR,<޺xIFOe ͣ*MTg(`_/#!o]zqqj*M|Zh6fT|-0ګH2[0Vyu>_}RFW&HS_4H(u;x9/| !tQO_'jL6D05Z )sE_QỶiLWqq]}cv],_5L& qMz r8 ci4MaLV̹J2s3 9Z< hu(WxwqYw}hZPx qYݷî]״ Dw/[qs+@B)kka1SW$DA:L4WS (9OIVF|O'~]ۻ{ΞF:"jxoF#xӹw \&₻t}ll>4CY&t)@gql>8)Jr@$Mdוع=bɈ\+3kڗnBh@8hL3cch&AdL4iLB(3}?HChҌ IRݍ^z5\bw_w.=, }{95!aK A-*;o%A3Ǐo~v v9FcnЯ;KJ`Qo0@?L8[b~|ꫳzsZiZlqʕk|2Zz}=x ຃,7QqVVVjS|%I^mlll`kk nͤeun5>}8B’@̟wQe9m8?V/!J4$hwfyj/^^pue ?@{Pi J !8S@"Ϗ96rX IDAT I l!O$pwx~nlA"^z۸cJITY?bey̌uCMCv$t}opkm pIA*;eIRV. ^Ysex`QH9lL X' DjѨKWM4cʼ(c )6Pw!,>8m>La #u50?ǦmSLo~cp{c:>yAO)eZdyFZ!.Ͼ %ÈV ځCoӏ?g]H@$WLnwp=ne6YZdQ%j2Ή=,F5nʀz p! s7CoǶ"wpm47]I(/bvvA?`kk W^í[w離NB Ag'i܆;bAv.}F'm6aYo77}7o^GCEA<&ɉH0MS)Ҩꩧ:&Qւ9%;4KK?M+nBD&\k՚+$  F2$Pzn*- \y\_KYE0 lܾ?M4f2@$3)!؅N<$$:#zpm//왓#^؉Ge|_Fׇe{^ŕw=: s+,b9eQ0<,ye`k~C:_׺ԓOa.^ׯb{{\wxa6Z6n\ÛoF@"ʦi$8g)EF{wׯPJliZAE ĸZT9N]12gKqdC{ (#m'ѕ_0r"w ^@J)e?0 %P>a˲2fڋ/1@LqPŚ-o)Js+SرcXXXD p(DLES@UʼNE>&0=VjbT::pCtjIpg: yѻw7>m @cb 0ay[HB Z0ݠ "$Z5/ b(bw0 RS2ޤty} 4G@€  D&HXLs+R >^{ΞNَqh-_|ʩbin[߸70t,Jݺ7[,sLɢ>Yϱify25 `LքڽzP$۱ o+hZE>~}w|U nciܣ ;Ms|fWpwcgϜgp4 ?kZc}}̌EVCsK][dƢ_ 8& qP8mYW [8= ¥rÚ^4~"U} Cz@υ7JFD΄HWDx w0JFa'?1~ T.@6@D XGH֑oӧOX4dәa"|Tm:x.lvJ6V{ ՘D>Q0 AM4OO`l-:{MlZA~]Vk}7p(%qM븷ɒl!\D؉5!33K :5" To<|k_~{u)0hh`2~+bREX>9KKS "@AP&R6yWį8 ǽ^}W ekuz AHxlkCܧ<1Tі B:N1$LƝ۷s=]1c 0jStg!gpݏp&f땔MPN}Fk7 eZUҝ-nké33 B ,jR;^L#GБ7!1tF",0L|2\.Z6|W򕑒͵7 66Ȭ_#Jȼ2>׉D8#ׯG?yPV^xa^uܸqA0M_\K^BټO %a0n0"\ "soO0 ø36,9dJgLU!*dPNW0p=,5k ]ѰlDdb =luZz2əiݘ̲ϱ͂|mpAEqlę7#Ǐðl7q%=As.\0p5'bwI(EEԒ҅- ((SS΂#Q?ep}?}Q}O]ha&X^au-u{iqNiE ئĎ$ ,,d~*81w0 Gf5[aƚܬY4V@7Ӱ %rDPZt 0 iQV5VV^ƝplmCՆ{PJzI>rf0SNobb^ÁlBI9N}^ ôhR"$y, a=353ﰨ́L'?`N{̀?0sȮٴljv;`ggn^gsq\z?+!TAeAˬbc0`0$Opt}ܱgFx1ڝ.~W>VK/ڵkRic}}hv*4pp+R1HFAeL†) wC$!9F!y}7~a_%$E00Vˋ(0M)C6 ņ no8ȦJ=Ės:}}f++:"+p&ǩT`yq,.-cwg 'ϟF0b6.z. pArlM>}Ϝ'q\YEQCFPRkcЍNjElY6$y;F el9Uv@}Qlpj !@yDCI* Z$WAIII=t]z},//_*nߺOyìw:QxS&#D{1V!NPn$nwW^?yXXX/~<R*Z ۶!BVKuaΟ)@R rl wGH@ 8M%H-)_5DYa;DO !t0 c4-K)BC[AUTG9 ߯&"8_PO(u!D ӽ/j&:\zcJX\>Ex 5N9 ۶PmkTkUH)PVvb-ض'Ot QUNC0GbSYԜ_d)%<;AD~R8UsY K2Z?m2 0&o|i 5`0`X\\.?2@_}_dv:)$ T;oc r"]24&Bwʫo_zǏW_%|@ak>aZ6l)5Q !< ,SAaw L?E$Th ~]%@PB`ww7pc\s={ 7o֨ *mz]e@>K Oi/p h,تG)de(%5,//7y /">|G!:6677QVaYٶF{SB5VRXu;SdYmwr0 s(X̼tEy… E.M EZ766 Lژ JI^7=4!'ܧ>D2q &4ul{d0h>PmL%aF:-"BFq/@Fwn0C@s`fvȮI֚3s6tj i0 öa\i̡hH&Xjqf&n`S88GJ)Aqw 4 XY*Gviѥ( }q-(ғ\ɍ {_M*t},A'e* BbnEcV J;Q@DG4,V%+3lX!`~0p_pMWZk ۶ vN! C⋘Cƻ^B†!-D[|i@C2g`\z (BO S 4R>~28^}^X K~eWec 1DnѰ$!܎=X[_sgK/W^A߇eYtvga&LaٺM`U J2\70 E.^Y$㼘wJ)ܿTkC(85^$8ѹOB6i>M'v9׎z h4} 0 yj: ȶm?jDD\0S KJ3w]6^(3 +̼@DɴwPxjuGFZp(B#q/@_.O0KKABYb@(B!INTz"2 l&eBXC'H<Ҫσ y L6*o]4 $>"gاN=98tDǭ[0#BܸAev(9'EE3HdA@l|z2C2ڹ37%!R?]n{7R-AY?Y|pNZP7߿`=)N) ߹{8}$y.l;@`GрaU~OHCLKO03'Ao2!yzkr$IJ,\z3}ի*WdÛYs wl+A=y''9":NOveBKW:RBd 0S.)%83Đ %aX[*).dL "ʽG[F? ݻ4o  accnx8>\?GlKT3gAvhpY8@, H2P$ y$UǞ30WqI7~ O@FxK8}$py'?E~Aj HH pm&G'ôL\u,bCR}/Vq41zu. IDATkƒIH{$IB!Ur`)ɍd>*7(L YrXI\F] r`s"Hsm722HK$G~dkOrQ!$)2-CJLn5Xǐ NJ4cu]V@H ?pmApjӧOA­[wΤҳ WN:G}F_!T ,SHP8@2D"R4#Ƞ #E={0<t0 \v%>}oF&\%䵮 k)MDrO>li*e*Bԁϛq)t{)yk:n^NITdLH݂èHI6 OٝK+K)o%'!Ŵ'Oi=}^,xeM$ ôtdUjhkN4F:})]xzKni΂ -悖*u z="Gy :lc$T> U {'J){OADXQ> hD ?R? RZb2+iG œ\EIILaJzΓ IfJThqEy|$uM E@ Zd4iX\\DB){y㺟9mqIv"ʬ`FH13MA n aTT*UTk3,BVExa غѺ lk(FZss |w;OC0.vqY{R"I48ʎC)$1KzQL.G c)]WaZPd(a6?^t1B֭[Ӛ#@X ͂v{>NAx3X޹yUFˋE=,Tt7]L<%-*CB@PĊxJ | c ~ЛVlۂc4ϟ:/`̳#l*1O#2O:޿6bH"}ܸqׯ_Ckw O>hܿwγ za}~ DtЉTNwnn֬Qi.@KOκ.8AGҲH QFRS>2L#(GIeJ w#eC26!q!A !lUDjhugޯ]P X~,r29%k`.>MJ/zd\;.L Lh0gtW`cT.ǘ԰E%R403f*Thwi#99XN=ٯ eXZ4Қ$ ӂiU @kw}.{_:q:u =8!} iڨX5s u 0W@q"' ) q GQ3a(#Ziq(3nGp) )SBӏTTac@iwP\:;+.!ǵL5) T&ۖA^,9ӂJ/.tID 2|q5s/ 7ǂzz &2$ Ce@FOΦ؁B'I ѿ84jgouHeetHk7>D1|G. QO>S ڭ6]yR ÄSb^ .2Ǿ tג 0 ӲDE1@HE'b \ssspg8I 4 SV={]H)ǒ|]71(W_}~}O* <gtL.ӂjR'mI=WWa~` tSOa)OBi8C'/M KL< c gLG'Rܬ0;J- FN033Ӳ0#=qs_Gw&KBtSEӰ ڻqqYHI@tai߹sNǔp{i L#u N݃m ۩Yw0_ѰNt&4z333#=p֢$^@0% `B9b?&h̴ &"K)(\-Ӂ\)ynFw=7(bhʁݺ0?a"0Uq,zw?7o &gK lFغJiXѰ ڇyE}+K8Pۛ}e0  DQ$28tp8r򋧴˥DưL AZ}m~@Q1tt"uoshijuiMSM),. RӼq\*eii3!-] h g@Oz]0GqRǃEB?]g(&[Zٙm $Œ;V%N`7Wa?O ނ܆4?+C5Nu;LD Gxp6R Ɉ:At[6jf@= mXNi4RT Kqpy`xL3#!z}bQkNK-82}v˙^`wzd Pq13XkhsuaO@'IACdʩ/@ϟ]>J}!DpYt ;C*: >fx0>CN)JRJBiea&.-&Hل&lgnuT*( L@Ũj҆QJ1O;B5(;ːd(>|-Ib;pZK"!z80(MAhUTeھdsDDR.+y PD|z,Ai^/")g$C6I X؃!  ]TJN2~Y=N9*{KRJYmz0]ܿWe+MBcnG^/?G~Z&(e@) Z'$jעӞ0 ZpiH +̡0 Dq& f_}U@?gڳ/r`0 *JW,uky: ʓzػ8BEi8.7j&׵(rEw9\n&o$׀hO ILc8ѓ?6>P nn*[Aj,ӕI}GfBF7/bH4A+D`(!܂ѠN;(w&8ztB%ζ\<S e@g :j!Z00AF^i m2aX}4zMc<caC`6VVq{k7Q`J ÀcY=x7q_<38*Z $#;5Ӱ)3A$IhD!(`:ex }2!E$I=,}XjP D=0p'Ftb-ݥŔVcqq}M~ys(Ԡ1+&a9eA˜DT"Jh% B{Va8I d՟;u]$I9HAD$E(ӂP0 3 "U=_@x0{VyQq:pId 2a 2TZL!vѬX8$-|3p` ױrJXT:0a #Q,TꍔlP4ad2a [[[B$Iy o\9~5   `c"( 9NxGV"!Wi "!\<H?kEҏ`7|صTR s>s矀E.A0OI\mò,(`TdD E;uTg2L D*M2}m[pl[[[ L9 ш#Qe%SIRR@v/udhZP 3Pn86)30Th!qB{|˜}.v%y X1{Г;< P, {PI(DO ("Œ+rF;Jc㰜:X%K ݫxKPR^.<j:C^/ " ,·~__v:ģҡ\uP*K-uZ=X* #FQ3 m4 ߂ʹ 8 f$su VEAQV9N _{77FjDY9vO<>ҕt$aH i,%A4g;iA&8[g9,`zBEX__(j$$$dڳd0Jx.e !0q@q04g#8>'x @SF}ff: #M٦ &́FJ ΧB'F"!0aΘJU~qr!QIe}x@?!E{YiJHҜvn^G)Дˑ+rhXk b ˃L{p)%1!`'rTY!ca8177ÇWqm"ܽ3>y?9zoxon]`C&f0 N 7eۨT0-R?Fs15,( cch q8Ѱ:# $IBva*c2l[mܺuw|-U4G!40juzʜDʚQuLQq[+HkyWYT1fSx{2 93,Rn,Ʋ<-ofN"R6JPk=ݞ1l3/n3O䧁`ލ6 4`؀%/H -lr$V*ĵ*3+3r!"΍ܬD&VEe==WRqm+RqRL]޾F]+G4un=}Xד`xdБZe 4̪ʎ[ fAPolp܌lMeȇHqo=0%HM<Ynѣ?mЪv̼Vσ@u:*#a 7H"=8ué{W_}N8$+U 79eA#.k,rELMi-?;H̝9 4 KabfHyÊ +ζbØOi-Xh Bn\ Ƭ<y'poDہX,z>}O HAF3im0[l]R P։!q3coJDFCk"(pl$j (!fKgV_ bhASj*KIhLm|eY⥋xч\,fFy??wy:t__W5 ,%E#/,z0HH5HYb d%! v!I3`cbvvv|7 y> J{@f`{pvOF))mށN˲Z6I;d8E"BnK0[cz0f=s3S]i)"JشyDc-.>@MP:D" HԄ1\ԐEZ+rpgY. Y#woH ~ wA;*O&(GT;I\=x8"&SN,HD# Ӥk!fVgڭIf0CJK`D҄Zk|1eY)U.8ݸdMr.:cDvXt@jWc1ΡpQ'oDIDweJc]w*n!-R*˲,hqw Lm0[T`Kt.Q۸ .<D9^[k#pzbXM%wLXPF,1cȲ GGxgOxA&DJ|estFg, |(KE(Qrq'yqz}hzDXwPcmx3F ZG/si7 6T ASD$L&FȲ ׮] d(.E3vKҼ64b¦o rO&bi~i  k^>MȒK/} y>p8x_t:ȿ$kJ$ Bi:Xܝ64xD9gO*uܔԈHB6Ng#MKxd8uY_|!wC/;GUڬOB,31ɩY94riu'>'b|)`1Y͛G}aS2+*e'EQNh.}TW"~u!t7ٽƫ&N P<.34 5`c'>BPD'C3*RJllL1O0 1ꫯ<O>[E"\[[ \y3+^%X"M%zm<쳨nؘX$?Ë7I> 4&rj{է&8C]3tZ8h0!@a/$͛7]pogu 2p0+až*E#hE[1|t,4>uQw"z$_RGrVFL600 y<3J'>>It`%%h u9|߸Mqp 5 SH!ĺF~ !aA܁ |Wƍא֩M&vݹ, ŒhtǗ>a}N_MH>֪txFn,ƭUSpk@: Á="pgg@3phD[0nx  |]gOhSt|0QB^F./ڠS]vﻚ{Gr>b6MlmmƠgg`flmncO~8"qM@4yЎGzg0 (H[,o1Jpocq<//\ ?oDp3jGYSo-kgg]ǎ9%,F2<N,Gq-!4żjRBeͽ@XÓ-` 6X(6z=5(V5>ܕ DH0Z5M@M:8PQT^,j1Å \GƐIƸRy^gX.,-LvD9%>_" +ЕM 5Fq/ٿŰY$V!5gmzZ[xk/߭|sWUst[B, ,s.s>il!cpo12z"F$S9_,R,LDC:\ iu8 BƍX'8pn+Գ`!;gvSE*M&+7\D ^.HЊ/A)#Q\ 4>]^kԃfW<|.@pL[[w;Bb\ _nܸ__>d Q3ړmH@? B:Xs.;0F7*8 $b=_^ vފL]K7fl )Jy)pマC.z$ ] Gq=(2m1VE&Xwn9^Zk@kSCb<h:t>iۿC|g><*+sP`"ubQX3A *T!t],`tii _y_o|eYb:b4a4~[,( ^g4Msp_JoFn8;ɀH ?̓WY^ zC<$goQ6_+ZSo4_|O?8)ೀq eD777ct%R gc a heɰ+;ԎC͆Bq$ V&a :2P EӄGX JG"=5C+>+̷4;(`4I"n gŵk~O=.]pu U0.N FA%*ֶD6-x7} w0͐9`8=M 1X( .s:>gJ-#voptcV'BؓL4m}a/֯ເLѠT^ i $~. AFkmߌ. Àl HkY9)R 7[WZЈ]u֎5==_x\'IS84AAY)Lmթ>0ǡ91M>vl˔H+x:/SO'˗h 0%2>1 |.nܸo}[xQ%670M?-GU((wGf2&aZ]P)ⷖssҹ ,`IXi:D1=eh!H!JwKۓGw[7# K@(wwwyؿf/q0l߰LnنQjuQ7,eR\7``ڀxɝ+Q#}'PM@IB˦,#iH=;mKZޡͯ&]hHYf/|X"F//C|A\t fH6PJ,Ka;;;y&~7ބ[[[y>x%䲘SQ8Ps=2 OD*p Hbg5][Ӊd'Ye bzCn,J!RၪK$ NFZk}Rx67g:Kd ނ?GZ;5CoQ p 7 J=4XARL6ыk`XVG(7A }hd Mr RyNyb4ac ] _4Mp yH=,GUU0ƴ dY1y>h4l̤ceYrU(k&<3!]L@ ! $WE%pv˘ CĎї@]m[k_4A"WUIJS;稘1ϟt isZk]O+xLFpRڛ#16]d@B z$1w.IZPhhf5(E5Btǵ{ʂ>Dw3.\ofTEu)nz, KSIʲD]טL&k[f9y ̞t$Lx0`8Zr"-XY,KjI%0mkf  ȇkS) 2N)e.P\:?T ūʠ퀱݅Y@ d@Qnw]Eet >#}?v{r 5٬*L$ DēacY9B>kn#X}#)uc?g @@P=B"A Ɣ -DZ/gL7[ oمOs9bodze= 93JȡjH}[GR ezi>P`kچc{s/*uPWVR\n-SsdFDݯ嵉$A2e$3$٩pVa>tmM2 = OT(>_;:vʛ)-N/Y'<;P2h!I33beY4M)p 5 c?]b4flm\0~\pSpS!+m HCaGrX =Y9pm4? D9»zy:D[$M9I2iF<-X]׍0FlC:$ r0[nUjuUUEEgdBĒR&JBQ d$s3 ź R;%vz)rs <( & avLtCLh]6?=; `0><<,rccc:0&f{#< ,ѬpL&̭{;s7m{B6 PHݍ`_ӑ)b % x?ȉ{$VEdZG-cq>;bv韨czIGGR^P$$KBJy|@iw۵p;<6UYVQRb*ˢ惂qRfJHr2!(2 b2|O+vl2ћwxwoƏ\^|S IDATB" }}! $@YZ[@%)UR* /dP!`frRoMR%|M` JÑ__&XeMAݴ#4bO+V UԥxMcZ>4b~!;z~ 'Fߕ垐Ls$e!I)!X--ډ}j1h eDUW4/jK-Y!HF,(rȔ @r r$3 ƵKbbY;/ gtҔF fE[ V.Lã29sV) 2=yeb @8(,2*iVe0)mp4+SGӼCW|!68k! [ CPPYpѕ1K> 1>tJs,=YG(&zxËfqtx[ |W fI:~@!% !!m9C0nhc`֚ RBY) Rs,HnjdF[G  1`J2 I#q:ą{#xggw †õZPMx$(\ڭ+W*{fd2> !$ga8<<\ nMiZjA a٢dDu#(m _w H#?( 3dQ|[dȭB=<XgĕRTy0?번fXDȵ^;@|um'gJߦD+H$!q%yP3%Cc"3%s1%٥"~ qȷ"Rk{ٙc0[s>}CG S,vwL+K MĀ@hD[ 3caSy ӴS2m,*.k OA5yæv{)6~!4`BD'Y w ?#ͨQPDE1WiwX\pV'13Z:Cm>֓˙MI؁PDu 2%+5{AiZ}Z&@,B C!!S2I[ 3!̙D)Cֹ8ş7_`GoCo¹ Ď0SʟSn2$PZߩSk8V%>['RP< 0=<_c2F8< 3U0m=X=qGwOG}13N&@Inׂz4=6{{p팞 Y ZXPp9Ӝ^UA+-1%\B$3&9m]/rd9 ¢U%GMբ\'8DNSi|Β0@diGIGd<Qi, @81PG%hn6ivN֍qCˢ<Ć 5JiQt?-D"=XC*ǝA"湋R8G u^]9Ɯ9U5fUQX-뒸^jQ/"&/[HPI9HA7DȌ'!`mpz食3҄٭9ni.lc?Vtͷ>fö `а<.B'`$@WUU <>LDւ>e CM>u8,GH; yZ|ts{. )p -D=x}밊JAcC1w$c)_K#`fVf]UIuɬJ*U@2(gHr &LA"Ɂ!) 6aـ]n32!PkSIіV>D)q֌ :wfėodAKF~1FfƝCfT dHbI5Dw-86?Er:v$TDl@6TUˢmLj*Fٱ~PFxחvS]6vD_,2˯2SZ@b fìb֕Vfyo<  |%@IXmAĦ"d 9LR Ax4=:Y7EiOBͷΒ￸Aύ."qhAINYU_|1yI8v}@L̦k3X)Ϥٞ  hmx64]^x֪@DK*t=#U=!-V!BPQi@ ABgO{=^}EZuMPV WĞBگT$2eWNjH5jy@EHc-ʀ3e7Q,*_4 @2Ô TI]W^'3yR@?F1\."p4|v+p G|1_n$=q`_.iGMA]fZ qzPfThw7Ճq;(%,@H/nRK DaA)=az=-lA 2Zc֌Ώ1UE" +u@ ʀ |p F X-3.RV}b$lOSHa' `\6mv,"ѵ9"u|Q~Z ":BcpMy1׾24؈MBa/ )"Gʁs%9'U:av!2f(q*z2 FAR*K7^㽽9w_ؽwR@y0`GXu.J)( FEyT F E8F۝gN={j:~O9eFY+kL }=ns( Sh#VQ6:TӗǷ=l=*G3Y⒢G:qdnV,~W-6aHpجwR&eh^vpxGCZ#m@Kr; 6.)tHD4+X8\  'J{:_is|YiǏi%W[t_UM`ZU GY51/{ءsn`j^=Q.pѣv=KKD, %))` xs#? GX y !N()^f)e9!m\ҁXG{?@wÙi[!p_F_3[c?i8I Y/oReEͫFycRw{Ut[@]7Nt/qu0*ABt.QWFA^gZbLdLAb<@Dp`I0R$$NXJb)f $N$q"ȄV?KB"'w"e" N$!I 4i&N!'IbZ00p-3‰99; $ ,1F~0A<*@; 5)E.0 +%9mzATJ5 iC3 m33Djږ?ug={F6B5 zƲlUL>B bh` - ְ, 8N̉ k|,m4]G$ AZFK$0IBJb)}.I A,`)! `!` \ԶI!`V'V$v,Jb!RaIg4?![o-OAۛI}4wDv.C Vg3VH"(mPCZ3+eHi VR-!6` f(mvVNæQgSbgƸ R)ӒAoFDW -\r*\Rd#sB`IqD$M*&DJp*ؤ99i kRYTWP.,@"}IXa"ba/ k ˬͰuuR1Q {0h/?Z=O$N 3nx`TUUuei!_/߼9٢VFl 2hs5LmP+CF Vq3XաoMddi] w:U~C1Gah%n®bn JiΫ&`͙'OI%D¤&TI%L&S&0iJ,g%0YIp<'B5*o:Y4ή ""I!JSy0F j$Gp;8QمRg!Rg":HIǢ,kmϥmV roϳ+W&ev/򯝨 cpppp1h1@iЃ Ÿiq#LQAM ȧI.Wd==,aHXHW. N`w?^YZINZ"T N%,I$LId 8,!%@S 3H`&O`L&mj_GgSو62:5Zv׃`##-M$϶F#W~cՍ]c[z99:n2ֻ|6W:ܾ^f'nߙO㰲#RdI::!E,AsN}N~OnU,'ZV֠`]$uAH&udX&ľ>8D [籐d\ȩ$¤FL$qjTM* Y"L5&YB&P󞅍Bmí5t\ې#Lv%ۂ["򽜬kﱡk^4AoT$AN Uxūѓt%Vq9 '8Ϟy׏&R2'&MF$&K$4!NS2iJHaL'`!`D껬BD@J2BN}-42Xui}tc( vĴj4 9WhdpD~EШ<$ N7֟t|x;c'Kt%P1'p&wvvfn|a~̒>zΧ7W ͝&@BhhqT+*] (2.w? #f{85֟tz"\sd撈>AD1ƴdá19_T`9z7w-kz?kZS6"}B(f~$b ^,bX Qd\SE!e& @'#δb<{|g` >xW4zu>ycpYד@Xd\h4X#;fn߾}5ۆ;w1FZZ)}RFkm꺖DO>}p2B… XlmmM:M$6N"CJQG̬Yc?ypt !4Dc+ 9;aB P>٬ozp*J|q;8kz289M/=ɶֵ1Z.UUycJZ)UuVUUop>Eѯ޸bg^'x`!'Fu%DϽlVP\oxիWA0anha"R)(r$sޮW`\_˚'4h4*>}ג=яdՓ:`kO\L*o>u#(kvGUUv?,tڧZ㻥C8^|1j!eDxSIwZEY aj7+P^z!_u\z@g~xjɲLu,UQUQbyƇjXb933I)IA; !5kLpK~ J_qX9(|D J6ѥ5o*M #3ѢD @< RNẰn:ZWNxl[xuKF-ZkRJA){PJQ|dZpľ$1> !D$blf|>_ O@xTX9MS1Lҭt:1ij4ZDsϠ55XFV9KsZV9ryMf>ں.QO]ag!>VoDBJII 0uCLľ4:x[JF>Nh4J`<yi.H9._wg6&k@!675l@!(}ct:EWEpQoF)-4]%e_tÿ׍^"| ~) =?Xe믿r$"04ND_>_gaJe:c=> ׮]pT,>^׵ 2YX]`2.NtLqvgX|z:ӣ{<6`$,&9w7ch=Ը/'X[eR@9z;uqǃ>8aKRJ#ݭYA{ؽk0|18=z+W_G$2` a1 }M>D}8|>'uMvio=믿06h謬15u5g\JnkJ0|>u1GeNӳy7^ n|L~82w+/(7|N5meYva{{{{0 Yw b~gܝ:P".Aui4=5ͲLܥ濧l Ɲ9 eܞ4 cBWWϞ~٧ UUG0^yGmChѺC8nK_w3wO}S̼}ܹ)t:V7:f;G,㸨^3r~w~ ?uG1ʹs6FQ+;ҢAwtԾ̓/>uGt th:<|\7z0M,w:c]+… ?~pM$:߫1899Buy䑷NSpzt .={Zq^#sĽ#|]={?uGp7773g`8ͽ^ n{7qq5:ӣ} 4MG⊿WU3=c%X+P'+1!J_}򅃏Hđ'_rA[ 8pCq(3;3Ua^ 50HHJ]]]]۫}VQeUm̗d&nMBDO~v޾}.^D7779@}9HZ||IBX2+)! +DwX葙HB;w UPz=kZݲkг|Y(HjĢp/~J;־S-[oK.ݹz*ܸq; 8km P%/^Zhu!*(A( (e@șeg:h،1xŋpZc z=lعVJ =>m@fr-kYC}V x+ܼyf~NЅ;wwz*8.:Kr cd#-:7=6+{qRz"~<ir֭7XT/ihGs;9Z W_{ߞ={vS]yNִ]Aʀs>KI [c (VA=i ڞs8\3>`$"#q /oݽԝaxԩS/moooXkC[[3(xX bO[ƅcJD,1cP!)WyPj}H<ͽ:*r$S9 <Âd&"sDqxD\cLs䜋~?>}zڵk{;رc0~uƘ؍JD1Vh R'`U!,_N-`mYm=^/!Eq"XiK!IvZ,=Q 0 1FKAFc߽͝FrI'ziUU뢪*MD"RQB=LS;Rˈ("P1+ > \=>T_ޯ,x{ +?YuZQJ,?W@41FCDlф0oO*~HDwdtӀ_!^Μ9wޝߞ~XkUQOu]`^,K;pYk{N&a8ޞVpBQ@WE,}r%[鼞 VS<-%߰\1sID 3e悈 M|&61+-R+D9iXV쏫:6  >4u]o 5M4`0(1^Ea,1p滻d2 {B<>Q $ʙ⠖5O\@P6^^z_,"3Af.dRDL>KAD@DrP(ib4g "s=3szHDQ<{=|ֽ@x֭[+WV/"'h !<B8UeY>4#M@UUOEb}F~4't2LG|6E,8cۛ, 33]2XX0l{3zD0옹'"NAMH =/JScfqfxZykR0܉Jʟty߾\||Co4McMӘi\]u]o5M4V]׏TUSIq;l!ŵOu1JC1Q_D ņ͆Q//jD> YqL Ң#+0="{yCf1D4!y/O;6H:loo/ Y >U'"V-.c|FD"rOI8)"'Cp%3OA*Sbfc ^+X~Q/?Zv`vEdz><phϊOsOI? ;;;݋?3>l@IENDB`vokoscreenNG-3.0.2/src/applications/vokoscreenNG.xpm000066400000000000000000000310121362045215000225200ustar00rootroot00000000000000/* XPM */ static char * vokoscreen_xpm[] = { "32 32 661 2", " c None", ". c #CBCBCB", "+ c #C9C9CA", "@ c #CACACB", "# c #A9A9BB", "$ c #6D6F9E", "% c #8387AA", "& c #9196B1", "* c #A1A5B8", "= c #AFB2BD", "- c #BCBEC3", "; c #C2C4C7", "> c #C4C6C9", ", c #C5C7CA", "' c #C5C7C9", ") c #9999B3", "! c #6367A4", "~ c #7E86B8", "{ c #757FB6", "] c #6C7DB3", "^ c #6479B2", "/ c #5D76B1", "( c #5D79B1", "_ c #617FB2", ": c #6786B3", "< c #6F8CB6", "[ c #7793B7", "} c #809AB9", "| c #8DA3BD", "1 c #98AABF", "2 c #A1AFBF", "3 c #ADB7C1", "4 c #B8BEC4", "5 c #BBC0C7", "6 c #BDC1C7", "7 c #BEC2C8", "8 c #C0C2C8", "9 c #C1C3C7", "0 c #989AB2", "a c #6E75AB", "b c #9098C3", "c c #909BC6", "d c #919FC7", "e c #91A2CA", "f c #92A6CC", "g c #92A8CE", "h c #92ABD1", "i c #92AED4", "j c #92B0D6", "k c #90B0D6", "l c #8EAFD5", "m c #89ACD4", "n c #6292C6", "o c #2C6DB2", "p c #2668AF", "q c #2967AD", "r c #356BAB", "s c #4271AB", "t c #5178AC", "u c #5E7FAD", "v c #6C85AF", "w c #798DB0", "x c #8795B3", "y c #9DA5B9", "z c #C2C3C4", "A c #9A9DB3", "B c #6F78AB", "C c #8792BF", "D c #8F9CC5", "E c #8E9FC8", "F c #8EA3CA", "G c #8FA5CD", "H c #92ABCF", "I c #8CA6C6", "J c #7E98B8", "K c #7F9CBC", "L c #89AACE", "M c #8FB4D8", "N c #93B7D8", "O c #699BCA", "P c #3377B7", "Q c #2E73B5", "R c #2E71B4", "S c #2D6EB1", "T c #2C6AAF", "U c #2B66AC", "V c #2A60A8", "W c #295AA5", "X c #2854A0", "Y c #254D9A", "Z c #355498", "` c #99A0B1", " . c #A6A9BA", ".. c #747EAD", "+. c #7A88BA", "@. c #8B9BC5", "#. c #8FA2C9", "$. c #8EA5CC", "%. c #8DA5C7", "&. c #7B8CA5", "*. c #717A89", "=. c #70767F", "-. c #6C7780", ";. c #8298AC", ">. c #92B4D3", ",. c #93BADC", "'. c #619BCB", "). c #307CBB", "!. c #2E7AB9", "~. c #2F77B8", "{. c #2F75B6", "]. c #2F72B3", "^. c #2F6DB0", "/. c #2F68AD", "(. c #2E63A9", "_. c #2F5EA5", ":. c #28539E", "<. c #264A94", "[. c #8490AC", "}. c #B5B7BF", "|. c #7883B0", "1. c #7284B8", "2. c #8196C2", "3. c #8BA1CA", "4. c #91A8CC", "5. c #7A889C", "6. c #4D505E", "7. c #85858E", "8. c #BABCC0", "9. c #6C6D75", "0. c #5E6067", "a. c #94A1AD", "b. c #9DBCD6", "c. c #5A9CCE", "d. c #2E82C0", "e. c #2E7FBE", "f. c #2F7ABA", "g. c #2F77B7", "h. c #2E72B4", "i. c #3068AD", "j. c #2A5FA6", "k. c #184B9A", "l. c #194492", "m. c #7183A8", "n. c #7C88B1", "o. c #6D82B7", "p. c #8096C3", "q. c #829BC7", "r. c #9EB0CA", "s. c #5D6378", "t. c #81828D", "u. c #8A8C93", "v. c #BFC2C6", "w. c #181A2D", "x. c #393A49", "y. c #A0A6AC", "z. c #7F8C99", "A. c #4D82A8", "B. c #2C86C0", "C. c #3177B3", "D. c #307AB7", "E. c #2E81C0", "F. c #2E7BBB", "G. c #3072B4", "H. c #1A57A3", "I. c #11499A", "J. c #124294", "K. c #687EA7", "L. c #7E8CB0", "M. c #6D83B8", "N. c #8098C4", "O. c #7F9BC7", "P. c #96A1B3", "Q. c #737897", "R. c #6F6F76", "S. c #151728", "T. c #CED1D6", "U. c #7E828F", "V. c #A1A7B1", "W. c #89909A", "X. c #373B48", "Y. c #4D6178", "Z. c #2E5E8E", "`. c #283B67", " + c #3072AB", ".+ c #2F87C5", "++ c #3081BF", "@+ c #2D7ABA", "#+ c #236EB3", "$+ c #1760A9", "%+ c #1255A2", "&+ c #124E9D", "*+ c #174A9A", "=+ c #6C83AD", "-+ c #7F8CAF", ";+ c #7188B9", ">+ c #8099C5", ",+ c #809CC7", "'+ c #757E90", ")+ c #A7ABBF", "!+ c #7F8289", "~+ c #606371", "{+ c #C5C9CF", "]+ c #9DA6AE", "^+ c #BBC4CB", "/+ c #4B505F", "(+ c #29293A", "_+ c #607287", ":+ c #3B78A7", "<+ c #27608C", "[+ c #2F88C1", "}+ c #2A89C5", "|+ c #237EBE", "1+ c #1B74B7", "2+ c #1468B0", "3+ c #125FAA", "4+ c #1258A5", "5+ c #1452A0", "6+ c #2F5EA6", "7+ c #6882AE", "8+ c #A2A9B7", "9+ c #8693B1", "0+ c #7189B9", "a+ c #7F99C6", "b+ c #809EC8", "c+ c #626B79", "d+ c #B3B7C0", "e+ c #989CA3", "f+ c #B8BDC4", "g+ c #ABB3BC", "h+ c #393A3E", "i+ c #B8BBBE", "j+ c #919EAC", "k+ c #7F8A99", "l+ c #6E8FA6", "m+ c #2F95C9", "n+ c #1E90CB", "o+ c #1B8BCA", "p+ c #1884C4", "q+ c #147BBE", "r+ c #1172B9", "s+ c #126AB3", "t+ c #1263AD", "u+ c #125BA7", "v+ c #1957A3", "w+ c #4974B3", "x+ c #5978AB", "y+ c #9CA6B7", "z+ c #98A2B7", "A+ c #6B84B6", "B+ c #7D98C6", "C+ c #7F9FC9", "D+ c #667687", "E+ c #83868C", "F+ c #242634", "G+ c #6A6D7B", "H+ c #ADB6BF", "I+ c #A1A3A5", "J+ c #B8BDC3", "K+ c #4D5465", "L+ c #606777", "M+ c #5B8198", "N+ c #1C88BA", "O+ c #1392CF", "P+ c #128BCB", "Q+ c #0C84C8", "R+ c #0C7BC1", "S+ c #1272B6", "T+ c #0E6BB5", "U+ c #0D63B0", "V+ c #115CA9", "W+ c #2F69AD", "X+ c #507AB6", "Y+ c #4C6FA9", "Z+ c #96A2B7", "`+ c #AEB3BE", " @ c #667FB2", ".@ c #7B98C5", "+@ c #7F9FCA", "@@ c #7996B6", "#@ c #6B7178", "$@ c #2C2C38", "%@ c #9095A0", "&@ c #979FA9", "*@ c #858D99", "=@ c #141529", "-@ c #545767", ";@ c #4B7F9A", ">@ c #118FC4", ",@ c #1297D4", "'@ c #108DCD", ")@ c #5390B4", "!@ c #708594", "~@ c #67747F", "{@ c #657583", "]@ c #4F769C", "^@ c #4B7DB9", "/@ c #4E7AB6", "(@ c #4269AA", "_@ c #919EB6", ":@ c #C9C8C6", "<@ c #617CAF", "[@ c #7996C4", "}@ c #7FA0CB", "|@ c #7FA3CC", "1@ c #7A94AF", "2@ c #8E959D", "3@ c #99A3AC", "4@ c #343749", "5@ c #33364A", "6@ c #8D9EAD", "7@ c #515563", "8@ c #7D909E", "9@ c #1E80A9", "0@ c #119DD7", "a@ c #1095D2", "b@ c #6D8E9F", "c@ c #626568", "d@ c #58575A", "e@ c #565558", "f@ c #575758", "g@ c #545658", "h@ c #616E7D", "i@ c #4E7EB6", "j@ c #4E7BB6", "k@ c #436CAE", "l@ c #8695B2", "m@ c #D5D1C9", "n@ c #617BAC", "o@ c #7895C4", "p@ c #80A0CB", "q@ c #7FA4CE", "r@ c #80A8CF", "s@ c #8CA8C1", "t@ c #646E7B", "u@ c #333745", "v@ c #4A4B57", "w@ c #8F9DAB", "x@ c #6E8294", "y@ c #4583A1", "z@ c #1495CD", "A@ c #0C9CDB", "B@ c #578EA8", "C@ c #585859", "D@ c #424347", "E@ c #313339", "F@ c #383940", "G@ c #36383E", "H@ c #444449", "I@ c #4F4F4F", "J@ c #5A697E", "K@ c #4D7BBA", "L@ c #4970B0", "M@ c #7186AC", "N@ c #667EAB", "O@ c #7A96C3", "P@ c #7FA3CD", "Q@ c #80A8D0", "R@ c #80ACD3", "S@ c #7EA6C7", "T@ c #7A9BB4", "U@ c #7D9DB4", "V@ c #78A4C0", "W@ c #75ACC9", "X@ c #50A5D0", "Y@ c #0F94D3", "Z@ c #1990C8", "`@ c #5B6268", " # c #505154", ".# c #35363E", "+# c #464850", "@# c #50525C", "## c #505460", "$# c #445770", "%# c #5B5F67", "&# c #44474C", "*# c #4E71A3", "=# c #4C72B2", "-# c #5F76A6", ";# c #ADB3BE", "># c #7286AE", ",# c #7590C0", "'# c #809ECA", ")# c #80A2CC", "!# c #80A7CF", "~# c #7FABD2", "{# c #80AFD6", "]# c #80B3D9", "^# c #80B8DC", "/# c #80BADE", "(# c #80BEE0", "_# c #50AAD8", ":# c #0A8BCE", "<# c #3486B1", "[# c #555A5C", "}# c #383B41", "|# c #4C5362", "1# c #5E606B", "2# c #5F6064", "3# c #617187", "4# c #525867", "5# c #5D7A98", "6# c #5B5A5C", "7# c #4C6388", "8# c #4D73B3", "9# c #4D68A1", "0# c #ADB2BF", "a# c #8A99B5", "b# c #6784B8", "c# c #80A1CB", "d# c #80A5CE", "e# c #80A9D1", "f# c #80ADD4", "g# c #80B2D7", "h# c #80B4D9", "i# c #80B8DD", "j# c #7EB9DD", "k# c #48A0D2", "l# c #0B84C9", "m# c #357AA2", "n# c #545758", "o# c #41576F", "p# c #525C6E", "q# c #5F6D7F", "r# c #514F4D", "s# c #717782", "t# c #777F90", "u# c #7F8B9C", "v# c #606165", "w# c #485C7C", "x# c #4E72B3", "y# c #3F5C9F", "z# c #A8AEBB", "A# c #A5ACBC", "B# c #5876AF", "C# c #80A0CA", "D# c #80A3CD", "E# c #80A7D0", "F# c #80ABD3", "G# c #80AED5", "H# c #7BB5DA", "I# c #4096CC", "J# c #0C7DC3", "K# c #2672A3", "L# c #505354", "M# c #627991", "N# c #646A78", "O# c #7E889A", "P# c #72757F", "Q# c #9CA1B4", "R# c #A0A7BC", "S# c #8E92A2", "T# c #545559", "U# c #496087", "V# c #4F70B0", "W# c #3D5BA3", "X# c #99A0B3", "Y# c #C2C3C6", "Z# c #4B69A7", "`# c #8099C6", " $ c #80AFD5", ".$ c #80B1D7", "+$ c #78AFD6", "@$ c #398BC5", "#$ c #0F75BC", "$$ c #1575B7", "%$ c #354048", "&$ c #727174", "*$ c #7B8598", "=$ c #9398AB", "-$ c #B9BED6", ";$ c #BFC4DD", ">$ c #B3B8CE", ",$ c #9597A3", "'$ c #373A41", ")$ c #4C6AA1", "!$ c #4E6CAC", "~$ c #4861A5", "{$ c #7C87A8", "]$ c #D5D2CB", "^$ c #4662A2", "/$ c #7F9CC7", "($ c #809FCA", "_$ c #80A6CE", ":$ c #80A8D1", "<$ c #75A9D3", "[$ c #3080BE", "}$ c #106DB5", "|$ c #1072BB", "1$ c #295B84", "2$ c #47484A", "3$ c #797A81", "4$ c #9499A9", "5$ c #B5BBD0", "6$ c #B8BDD3", "7$ c #A1A5B4", "8$ c #48484A", "9$ c #3C4D6C", "0$ c #4F72B4", "a$ c #4E69A9", "b$ c #4B61A5", "c$ c #65709E", "d$ c #D0CDC6", "e$ c #4E66A0", "f$ c #7F96C2", "g$ c #80ABD2", "h$ c #72A3CF", "i$ c #2874B7", "j$ c #1066AF", "k$ c #1368B0", "l$ c #1167B2", "m$ c #2B4D6E", "n$ c #3E454D", "o$ c #6C6C71", "p$ c #84858D", "q$ c #75757A", "r$ c #3C3B3D", "s$ c #253045", "t$ c #21488F", "u$ c #3D5DA2", "v$ c #4B63A5", "w$ c #4E61A4", "x$ c #4F5B95", "y$ c #CCCAC3", "z$ c #6173A3", "A$ c #768BBC", "B$ c #8097C3", "C$ c #809DC8", "D$ c #80A4CE", "E$ c #6F9DCB", "F$ c #2068AF", "G$ c #115FAA", "H$ c #1360AA", "I$ c #115EAB", "J$ c #1E4E82", "K$ c #203550", "L$ c #1A2533", "M$ c #1C283C", "N$ c #192E50", "O$ c #0D3172", "P$ c #103787", "Q$ c #15378C", "R$ c #2D4694", "S$ c #44549B", "T$ c #3E4991", "U$ c #BBBCC0", "V$ c #7E89AD", "W$ c #6579B1", "X$ c #8397C3", "Y$ c #8298C4", "Z$ c #819BC7", "`$ c #819EC9", " % c #81A0CB", ".% c #81A3CC", "+% c #81A4CE", "@% c #6C97C7", "#% c #1358A6", "$% c #0E55A4", "%% c #0E54A3", "&% c #0D52A2", "*% c #0B4FA2", "=% c #084390", "-% c #073679", ";% c #06357E", ">% c #08398E", ",% c #0B3890", "'% c #0A3089", ")% c #092883", "!% c #08207E", "~% c #162680", "{% c #1B2480", "]% c #A4A4B2", "^% c #9DA2B8", "/% c #3F539C", "(% c #697CB5", "_% c #667EB4", ":% c #6680B5", "<% c #6988B9", "[% c #6B8BBB", "}% c #6C8EBC", "|% c #6086B8", "1% c #2B60A3", "2% c #3064A4", "3% c #3467A5", "4% c #3969A6", "5% c #3E6CA7", "6% c #426CA6", "7% c #476EA6", "8% c #4C70A9", "9% c #5170A7", "0% c #5570A4", "a% c #5970A3", "b% c #5E71A2", "c% c #6271A1", "d% c #6671A0", "e% c #69719F", "f% c #6D709F", "g% c #A9ACBA", "h% c #C1C2C6", "i% c #8F96B3", "j% c #8E95AB", "k% c #969FB4", "l% c #A1ABBF", "m% c #A2ACBF", "n% c #A4AEC0", "o% c #A5AFC1", "p% c #A6B1C1", "q% c #A1AEBF", "r% c #A5B1C0", "s% c #A8B3C1", "t% c #ABB4C1", "u% c #ADB6C2", "v% c #AFB6C1", "w% c #B1B8C2", "x% c #B4B9C2", "y% c #B5B9C1", "z% c #BABDC4", "A% c #BBBEC3", "B% c #BEBFC3", "C% c #C3C4C6", "D% c #C4C5C5", "E% c #C7C7C6", "F% c #CDCDC9", "G% c #C3C5C8", "H% c #CECECA", "I% c #BDBCB8", "J% c #C4C3BF", "K% c #D6D4D1", "L% c #D8D6D3", "M% c #DBD9D5", "N% c #272727", "O% c #242424", "P% c #383838", "Q% c #3C3C3C", "R% c #404040", "S% c #444444", "T% c #474747", "U% c #4B4B4B", "V% c #5F5F5F", "W% c #6B6B6B", "X% c #717171", "Y% c #787878", "Z% c #7F7F7F", "`% c #878787", " & c #8F8F8F", ".& c #B4B4B4", "+& c #CFCFCF", "@& c #D5D5D5", "#& c #D9D9D9", "$& c #DADADA", "%& c #D8D8D8", "&& c #D3D3D3", "*& c #838383", "=& c #818181", "-& c #727272", ";& c #666666", ">& c #5C5C5C", ",& c #545454", "'& c #4E4E4E", ")& c #4A4A4A", "!& c #4C4C4C", " . + @ @ ", " # $ % & * = - ; > , , , ' ' ", " ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 7 8 9 ", " 0 a b c d e f g h i j k l m n o p q r s t u v w x y z ", " A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ` ", " ...+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[. ", " }.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.d.e.f.g.h.^.i.j.k.l.m. ", " n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.~.G.q H.I.J.K. ", " L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+++@+#+$+%+&+*+=+ ", " -+;+>+,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+7+8+ ", " 9+0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+ ", " z+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+ ", " `+ @.@+@@@#@$@%@&@*@a.=@-@;@>@,@'@)@!@~@{@]@$+^@/@(@_@ ", " :@<@[@}@|@1@2@3@4@5@6@7@8@9@0@a@b@c@d@e@f@g@h@i@j@k@l@ ", " m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@C@D@E@F@G@H@I@J@K@L@M@ ", " N@O@+@P@Q@R@S@T@U@V@W@X@Y@Z@`@ #.#+#@###$#%#&#*#=#-#;# ", " >#,#'#)#!#~#{#]#^#/#(#_#:#<#[#}#|#1#2#3#4#5#6#7#8#9#0# ", " a#b#b+c#d#e#f#g#h#i#j#k#l#m#n#o#p#q#r#s#t#u#v#w#x#y#z# ", " A#B#,+C#D#E#F#G#g#h#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X# ", " Y#Z#`#b+c#d#Q@F# $.$+$@$#$$$%$&$*$=$-$;$>$,$'$)$!$~${$ ", " ]$^$N./$($)#_$:$R@G#<$[$}$|$1$2$3$4$5$6$7$8$9$0$a$b$c$ ", " d$e$f$>+,+($)#_$Q@g$h$i$j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$Y#", " y$z$A$B$>+C$($)#D$!#E$F$G$H$3+I$J$K$L$M$N$O$P$Q$R$S$T$U$", " V$W$X$Y$Z$`$ %.%+%@%#%$%$%%%&%*%=%-%;%>%,%'%)%!%~%{%]%", " ^%/%(%_%:%b#<%[%}%|%1%2%3%4%5%6%7%8%9%0%a%b%c%d%e%f%g%", " h%i%j%k%l%m%n%o%p%p%q%r%s%t%u%v%w%x%y%z%A%B%C%D%E%F%G%", " E%H%I%J%K%L%M% ", " N%O% ", " P%Q%R%S%T%U% ", " V%W%X%Y%Z%`% & ", " .&+&@&#&$&%&&& ", " *&=&-&;&>&,&'&)&!& "}; vokoscreenNG-3.0.2/src/audio/000077500000000000000000000000001362045215000160055ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/audio/pulse/000077500000000000000000000000001362045215000171355ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/audio/pulse/QvkAudioPulse.cpp000066400000000000000000000111551362045215000224000ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkAudioPulse.h" #include "QvkWatcherPlug.h" #include "global.h" #include QvkAudioPulse::QvkAudioPulse( Ui_formMainWindow *ui_mainwindow ) { ui = ui_mainwindow; } QvkAudioPulse::~QvkAudioPulse() { } void QvkAudioPulse::init() { getAllDevices(); // QvkWatcherPlug monitoring only new or removed Audiodevices from the PulseAudio server. // QvkWatcherPlug does not return any devices, if the PulseAudio server start or stop. QvkWatcherPlug *vkWatcherPlug = new QvkWatcherPlug(); vkWatcherPlug->start_monitor(); connect( global::lineEditAudioPlug, SIGNAL( textChanged( QString ) ), this, SLOT( slot_pluggedInOutDevice( QString ) ) ); } void QvkAudioPulse::getAllDevices() { QvkPulseGstr vkPulseGstr; QStringList list; list << vkPulseGstr.get_all_Audio_devices(); if ( !list.empty() ) { for ( int i = 0; i < list.count(); i++ ) { QCheckBox *checkboxAudioDevice = new QCheckBox(); connect( checkboxAudioDevice, SIGNAL( clicked( bool ) ), this, SLOT( slot_audioDeviceSelected() ) ); checkboxAudioDevice->setText( QString( list.at(i) ).section( ":::", 1, 1 ) ); checkboxAudioDevice->setAccessibleName( QString( list.at(i) ).section( ":::", 0, 0 ) ); checkboxAudioDevice->setObjectName( "checkboxAudioDevice-" + QString::number( i ) ); checkboxAudioDevice->setToolTip( tr ( "Select one or more devices" ) ); ui->verticalLayoutAudioDevices->addWidget( checkboxAudioDevice ); qDebug().noquote() << global::nameOutput << "[PulseAudio] Found:" << QString( list.at(i) ).section( ":::", 1, 1 ) << "Device:" << QString( list.at(i) ).section( ":::", 0, 0 ); } qDebug().noquote(); QSpacerItem *verticalSpacerAudioDevices = new QSpacerItem( 20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding ); ui->verticalLayoutAudioDevices->addSpacerItem( verticalSpacerAudioDevices ); slot_audioDeviceSelected(); } else { emit signal_haveAudioDeviceSelected( false ); } } void QvkAudioPulse::slot_audioDeviceSelected() { bool value = false; QList listCheckBox = ui->scrollAreaAudioDevice->findChildren(); for ( int i = 0; i < listCheckBox.count(); i++ ) { if ( listCheckBox.at(i)->checkState() == Qt::Checked ) { value = true; break; } } emit signal_haveAudioDeviceSelected( value ); } void QvkAudioPulse::slot_pluggedInOutDevice( QString string ) { QString header = string.section( ":", 0, 0 ); QString name = string.section( ":", 1, 1 ); QString device = string.section( ":", 2, 2 ); if ( header == "[Audio-device-added]" ) { QCheckBox *checkboxAudioDevice = new QCheckBox(); connect( checkboxAudioDevice, SIGNAL( clicked( bool ) ), this, SLOT( slot_audioDeviceSelected() ) ); checkboxAudioDevice->setText( name ); checkboxAudioDevice->setAccessibleName( device ); QList listAudioDevices = ui->scrollAreaAudioDevice->findChildren(); checkboxAudioDevice->setObjectName( "checkboxAudioDevice-" + QString::number( listAudioDevices.count() ) ); checkboxAudioDevice->setToolTip( tr ( "Select one or more devices" ) ); ui->verticalLayoutAudioDevices->insertWidget( ui->verticalLayoutAudioDevices->count()-1, checkboxAudioDevice ); } if ( header == "[Audio-device-removed]" ) { QList listAudioDevices = ui->scrollAreaAudioDevice->findChildren(); for ( int i = 0; i < listAudioDevices.count(); i++ ) { if ( listAudioDevices.at(i)->accessibleName() == device ) { delete listAudioDevices.at(i); } } slot_audioDeviceSelected(); } } vokoscreenNG-3.0.2/src/audio/pulse/QvkAudioPulse.h000066400000000000000000000025431362045215000220460ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKAUDIOPULSE_H #define QVKAUDIOPULSE_H #include "ui_formMainWindow.h" #include "QvkPulseGstr.h" #include class QvkAudioPulse: public QObject { Q_OBJECT public: QvkAudioPulse(Ui_formMainWindow *ui_mainwindow ); virtual ~QvkAudioPulse(); void init(); public slots: private: Ui_formMainWindow *ui; void getAllDevices(); private slots: void slot_pluggedInOutDevice( QString string ); void slot_audioDeviceSelected(); protected: signals: void signal_haveAudioDeviceSelected( bool ); }; #endif vokoscreenNG-3.0.2/src/audio/pulse/QvkPulseGstr.cpp000066400000000000000000000102471362045215000222570ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkPulseGstr.h" #include QvkPulseGstr::QvkPulseGstr() { } QvkPulseGstr::~QvkPulseGstr() { } QString QvkPulseGstr::get_AudioDeviceString( GstDevice *device ) { static const char *const ignored_propnames[] = { "name", "parent", "direction", "template", "caps", Q_NULLPTR }; GString *launch_line = Q_NULLPTR; GstElement *element; GstElement *pureelement; GParamSpec **properties, *property; GValue value = G_VALUE_INIT; GValue pvalue = G_VALUE_INIT; guint i, number_of_properties; GstElementFactory *factory; element = gst_device_create_element( device, Q_NULLPTR ); if ( !element ) return Q_NULLPTR; factory = gst_element_get_factory( element ); if ( !factory ) { gst_object_unref( element ); return Q_NULLPTR; } if ( !gst_plugin_feature_get_name( factory ) ) { gst_object_unref( element ); return Q_NULLPTR; } pureelement = gst_element_factory_create( factory, Q_NULLPTR ); properties = g_object_class_list_properties( G_OBJECT_GET_CLASS( element ), &number_of_properties ); if ( properties ) { for ( i = 0; i < number_of_properties; i++ ) { gint j; gboolean ignore = FALSE; property = properties[i]; if ( ( property->flags & G_PARAM_READWRITE ) != G_PARAM_READWRITE ) continue; for ( j = 0; ignored_propnames[j]; j++ ) if ( !g_strcmp0( ignored_propnames[j], property->name ) ) ignore = TRUE; if ( ignore ) continue; g_value_init( &value, property->value_type ); g_value_init( &pvalue, property->value_type ); g_object_get_property( G_OBJECT( element ), property->name, &value ); g_object_get_property( G_OBJECT( pureelement ), property->name, &pvalue ); if (gst_value_compare( &value, &pvalue ) != GST_VALUE_EQUAL ) { gchar *valuestr = gst_value_serialize( &value ); if ( !valuestr ) { GST_WARNING( "Could not serialize property %s:%s", GST_OBJECT_NAME( element ), property->name ); g_free( valuestr ); goto next; } launch_line = g_string_new( valuestr ); g_free( valuestr ); } next: g_value_unset( &value ); g_value_unset( &pvalue ); } g_free( properties ); } gst_object_unref( GST_OBJECT( element ) ); gst_object_unref( GST_OBJECT( pureelement ) ); QString string = g_string_free( launch_line, FALSE ); return string; } QStringList QvkPulseGstr::get_all_Audio_devices() { GstDeviceMonitor *monitor; GstCaps *caps; GstDevice *device; gchar *name; GList *iterator = Q_NULLPTR; GList *list = Q_NULLPTR; QString stringDevice; QStringList stringList; monitor = gst_device_monitor_new(); caps = gst_caps_new_empty_simple( "audio/x-raw" ); gst_device_monitor_add_filter( monitor, "Audio/Source", caps ); bool isMonitorStart = gst_device_monitor_start( monitor ); list = gst_device_monitor_get_devices( monitor ); for ( iterator = list; iterator; iterator = iterator->next ) { device = (GstDevice*)iterator->data; name = gst_device_get_display_name( device ); stringDevice = get_AudioDeviceString( device ); stringDevice.append( ":::" ).append( name ); stringList.append( stringDevice ); } if ( isMonitorStart == true ) { gst_device_monitor_stop( monitor ); } return stringList; } vokoscreenNG-3.0.2/src/audio/pulse/QvkPulseGstr.h000066400000000000000000000022641362045215000217240ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKPULSEGSTR_H #define QVKPULSEGSTR_H #include #include class QvkPulseGstr: public QObject { Q_OBJECT public: QvkPulseGstr(); virtual ~QvkPulseGstr(); QString get_AudioDeviceString( GstDevice *device ); public slots: QStringList get_all_Audio_devices(); private: private slots: protected: signals: }; #endif vokoscreenNG-3.0.2/src/audio/pulse/QvkWatcherPlug.cpp000066400000000000000000000132271362045215000225550ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkWatcherPlug.h" #include "global.h" #include /* * QvkWatcherPlug monitoring only new or removed Audiodevices from the PulseAudio server. * QvkWatcherPlug does not return any devices, if the PulseAudio server start or stop. */ QvkWatcherPlug::QvkWatcherPlug() { global::lineEditAudioPlug = new QLineEdit; } QvkWatcherPlug::~QvkWatcherPlug() {} static gchar *get_launch_line (GstDevice * device) { static const char *const ignored_propnames[] = { "name", "parent", "direction", "template", "caps", Q_NULLPTR }; GString *launch_line = Q_NULLPTR; GstElement *element; GstElement *pureelement; GParamSpec **properties, *property; GValue value = G_VALUE_INIT; GValue pvalue = G_VALUE_INIT; guint i, number_of_properties; GstElementFactory *factory; element = gst_device_create_element( device, Q_NULLPTR ); if ( !element ) return Q_NULLPTR; factory = gst_element_get_factory( element ); if ( !factory ) { gst_object_unref( element ); return Q_NULLPTR; } if ( !gst_plugin_feature_get_name( factory ) ) { gst_object_unref( element ); return Q_NULLPTR; } pureelement = gst_element_factory_create( factory, Q_NULLPTR ); properties = g_object_class_list_properties( G_OBJECT_GET_CLASS( element ), &number_of_properties ); if ( properties ) { for ( i = 0; i < number_of_properties; i++ ) { gint j; gboolean ignore = FALSE; property = properties[i]; if ( ( property->flags & G_PARAM_READWRITE ) != G_PARAM_READWRITE ) continue; for ( j = 0; ignored_propnames[j]; j++ ) if ( !g_strcmp0( ignored_propnames[j], property->name ) ) ignore = TRUE; if ( ignore ) continue; g_value_init( &value, property->value_type ); g_value_init( &pvalue, property->value_type ); g_object_get_property( G_OBJECT( element ), property->name, &value ); g_object_get_property( G_OBJECT( pureelement ), property->name, &pvalue ); if (gst_value_compare( &value, &pvalue ) != GST_VALUE_EQUAL ) { gchar *valuestr = gst_value_serialize( &value ); if ( !valuestr ) { GST_WARNING( "Could not serialize property %s:%s", GST_OBJECT_NAME( element ), property->name ); g_free( valuestr ); goto next; } launch_line = g_string_new( valuestr ); g_free( valuestr ); } next: g_value_unset( &value ); g_value_unset( &pvalue ); } g_free( properties ); } gst_object_unref( GST_OBJECT( element ) ); gst_object_unref( GST_OBJECT( pureelement ) ); return g_string_free (launch_line, FALSE); } gboolean QvkWatcherPlug::func( GstBus *bus, GstMessage *message, gpointer user_data ) { Q_UNUSED(bus); Q_UNUSED(user_data); GstDevice *gstDevice; gchar *name; gchar *device; QString audioDevicePlug = ""; switch ( GST_MESSAGE_TYPE( message ) ) { case GST_MESSAGE_DEVICE_ADDED: gst_message_parse_device_added( message, &gstDevice ); name = gst_device_get_display_name( gstDevice ); device = get_launch_line( gstDevice ); qDebug().noquote() << global::nameOutput << "[PulseAudio] Added:" << name << "Device:" << device; audioDevicePlug.append( "[Audio-device-added]" ); audioDevicePlug.append( ":"); audioDevicePlug.append( name ); audioDevicePlug.append( ":"); audioDevicePlug.append( device ); global::lineEditAudioPlug->setText( audioDevicePlug ); g_free( name ); g_free( device ); gst_object_unref( gstDevice ); break; case GST_MESSAGE_DEVICE_REMOVED: gst_message_parse_device_removed( message, &gstDevice ); name = gst_device_get_display_name( gstDevice ); device = get_launch_line( gstDevice ); qDebug().noquote() << global::nameOutput << "[PulseAudio] Removed:" << name << "Device:" << device; audioDevicePlug.append( "[Audio-device-removed]" ); audioDevicePlug.append( ":"); audioDevicePlug.append( name ); audioDevicePlug.append( ":"); audioDevicePlug.append( device ); global::lineEditAudioPlug->setText( audioDevicePlug ); g_free( name ); g_free( device ); gst_object_unref( gstDevice ); break; default: break; } return G_SOURCE_CONTINUE; } GstDeviceMonitor *QvkWatcherPlug::start_monitor() { GstDeviceMonitor *gstDeviceMonitor; GstBus *gstBus; GstCaps *gstCaps; gstDeviceMonitor = gst_device_monitor_new(); gstBus = gst_device_monitor_get_bus( gstDeviceMonitor ); gst_bus_add_watch( gstBus, QvkWatcherPlug::func, Q_NULLPTR ); gst_object_unref( gstBus ); gstCaps = gst_caps_new_empty_simple( "audio/x-raw" ); gst_device_monitor_add_filter( gstDeviceMonitor, "Audio/Source", gstCaps ); gst_caps_unref( gstCaps ); gst_device_monitor_start( gstDeviceMonitor ); return gstDeviceMonitor; } vokoscreenNG-3.0.2/src/audio/pulse/QvkWatcherPlug.h000066400000000000000000000023241362045215000222160ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKWATCHERPLUG_H #define QVKWATCHERPLUG_H #include #include class QvkWatcherPlug: public QObject { Q_OBJECT public: QvkWatcherPlug(); virtual ~QvkWatcherPlug(); GstDeviceMonitor *start_monitor(); static gboolean func( GstBus *bus, GstMessage *message, gpointer user_data ); public slots: private: private slots: protected: signals: }; #endif vokoscreenNG-3.0.2/src/audio/pulse/audioPulse.pri000066400000000000000000000004721362045215000217660ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkAudioPulse.h \ $$PWD/QvkPulseGstr.h \ $$PWD/QvkWatcherPlug.h SOURCES += $$PWD/QvkAudioPulse.cpp \ $$PWD/QvkPulseGstr.cpp \ $$PWD/QvkWatcherPlug.cpp vokoscreenNG-3.0.2/src/audio/windows/000077500000000000000000000000001362045215000174775ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/audio/windows/QvkAudioWindows.cpp000066400000000000000000000111051362045215000232770ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkAudioWindows.h" #include "global.h" #include "QvkWatcherPlug.h" #include #include QvkAudioWindows::QvkAudioWindows( Ui_formMainWindow *ui_mainwindow ) { ui = ui_mainwindow; } QvkAudioWindows::~QvkAudioWindows() { } void QvkAudioWindows::init() { getAllDevices(); QvkWatcherPlug *vkWatcherPlug = new QvkWatcherPlug( ui ); vkWatcherPlug->start_monitor(); connect( global::lineEditAudioPlug, SIGNAL( textChanged( QString ) ), this, SLOT( slot_pluggedInOutDevice( QString ) ) ); } void QvkAudioWindows::getAllDevices() { QList list = QAudioDeviceInfo::availableDevices( QAudio::AudioInput ); if ( !list.empty() ) { for ( int i = 0; i < list.count(); i++ ) { QCheckBox *checkboxAudioDevice = new QCheckBox(); connect( checkboxAudioDevice, SIGNAL( clicked( bool ) ), this, SLOT( slot_audioDeviceSelected() ) ); checkboxAudioDevice->setText( list.at(i).deviceName() ); checkboxAudioDevice->setAccessibleName( list.at(i).deviceName() ); checkboxAudioDevice->setObjectName( "checkboxAudioDevice-" + QString::number( i ) ); checkboxAudioDevice->setToolTip( tr ( "Select one or more devices" ) ); checkboxAudioDevice->setAutoExclusive( false ); ui->verticalLayoutAudioDevices->addWidget( checkboxAudioDevice ); qDebug().noquote() << global::nameOutput << "Audio device:" << list.at(i).deviceName(); } qDebug(); QSpacerItem *verticalSpacerAudioDevices = new QSpacerItem( 20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding ); ui->verticalLayoutAudioDevices->addSpacerItem( verticalSpacerAudioDevices ); slot_audioDeviceSelected(); } else { emit signal_haveAudioDeviceSelected( false ); } } void QvkAudioWindows::slot_audioDeviceSelected() { bool value = false; QList listCheckBox = ui->scrollAreaAudioDevice->findChildren(); for ( int i = 0; i < listCheckBox.count(); i++ ) { if ( listCheckBox.at(i)->checkState() == Qt::Checked ) { value = true; break; } } emit signal_haveAudioDeviceSelected( value ); } void QvkAudioWindows::slot_pluggedInOutDevice( QString string ) { QString header = string.section( ":", 0, 0 ); QString name = string.section( ":", 1, 1 ); QString device = string.section( ":", 2, 2 ); if ( header == "[Audio-device-added]" ) { QCheckBox *checkboxAudioDevice = new QCheckBox(); connect( checkboxAudioDevice, SIGNAL( clicked( bool ) ), this, SLOT( slot_audioDeviceSelected() ) ); checkboxAudioDevice->setText( name ); checkboxAudioDevice->setAccessibleName( device ); QList listAudioDevices = ui->scrollAreaAudioDevice->findChildren(); checkboxAudioDevice->setObjectName( "checkboxAudioDevice-" + QString::number( listAudioDevices.count() ) ); checkboxAudioDevice->setToolTip( tr ( "Select one or more devices" ) ); checkboxAudioDevice->setAutoExclusive( false ); ui->verticalLayoutAudioDevices->insertWidget( ui->verticalLayoutAudioDevices->count()-1, checkboxAudioDevice ); } if ( header == "[Audio-device-removed]" ) { QList listAudioDevices = ui->scrollAreaAudioDevice->findChildren(); for ( int i = 0; i < listAudioDevices.count(); i++ ) { if ( listAudioDevices.at(i)->accessibleName() == device ) { delete listAudioDevices.at(i); } } slot_audioDeviceSelected(); } } vokoscreenNG-3.0.2/src/audio/windows/QvkAudioWindows.h000066400000000000000000000026451362045215000227550ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKAUDIOWINDOWS_H #define QVKAUDIOWINDOWS_H #include "ui_formMainwindow.h" #include class QvkAudioWindows: public QObject { Q_OBJECT public: QvkAudioWindows( Ui_formMainWindow *ui_mainwindow ); virtual ~QvkAudioWindows(); void init(); public slots: private: Ui_formMainWindow *ui; void getAllDevices(); private slots: void slot_pluggedInOutDevice( QString string ); void slot_audioDeviceSelected(); protected: signals: void signal_haveAudioDeviceSelected( bool ); }; #endif vokoscreenNG-3.0.2/src/audio/windows/QvkWatcherPlug.cpp000066400000000000000000000075201362045215000231160ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkWatcherPlug.h" #include "global.h" #include #include /* * QvkWatcherPlug monitoring only new or removed Audiodevices. * It has the same behavior as under Linux. */ QvkWatcherPlug::QvkWatcherPlug( Ui_formMainWindow *ui_mainwindow ) { global::lineEditAudioPlug = new QLineEdit; ui = ui_mainwindow; timer = new QTimer( this ); timer->setTimerType( Qt::PreciseTimer ); timer->setInterval( 3000 ); connect( timer, SIGNAL( timeout() ), this, SLOT( slot_update() ) ); } QvkWatcherPlug::~QvkWatcherPlug() {} void QvkWatcherPlug::start_monitor() { timer->start(); } void QvkWatcherPlug::slot_update() { QList listCheckBox = ui->scrollAreaWidgetContentsAudioDevices->findChildren(); QList listAudioDeviceInfo = QAudioDeviceInfo::availableDevices( QAudio::AudioInput ); QStringList stringListCheckBox; for ( int i = 0; i < listCheckBox.count(); i++ ) { stringListCheckBox.append( listCheckBox.at(i)->accessibleName() ); } QStringList stringListAudioDeviceInfo; for ( int i = 0; i < listAudioDeviceInfo.count(); i++ ) { stringListAudioDeviceInfo.append( listAudioDeviceInfo.at(i).deviceName() ); } // Add new Device if ( listAudioDeviceInfo.count() > listCheckBox.count() ) { for ( int i = 0; i < stringListAudioDeviceInfo.count(); i++ ) { if ( stringListCheckBox.contains( stringListAudioDeviceInfo.at(i) ) == false ) { QString name = listAudioDeviceInfo.at(i).deviceName(); QString device = listAudioDeviceInfo.at(i).deviceName(); qDebug().noquote() << global::nameOutput << "[Audio] Added:" << name << "Device:" << device; QString audioDevicePlug = ""; audioDevicePlug.append( "[Audio-device-added]" ); audioDevicePlug.append( ":"); audioDevicePlug.append( name ); audioDevicePlug.append( ":"); audioDevicePlug.append( device ); global::lineEditAudioPlug->setText( audioDevicePlug ); } } } // Remove device if ( listAudioDeviceInfo.count() < listCheckBox.count() ) { for ( int i = 0; i < stringListCheckBox.count(); i++ ) { if ( stringListAudioDeviceInfo.contains( stringListCheckBox.at(i) ) == false ) { QString name = stringListCheckBox.at(i); QString device = stringListCheckBox.at(i); qDebug().noquote() << global::nameOutput << "[Audio] Removed:" << name << "Device:" << device; QString audioDevicePlug = ""; audioDevicePlug.append( "[Audio-device-removed]" ); audioDevicePlug.append( ":"); audioDevicePlug.append( name ); audioDevicePlug.append( ":"); audioDevicePlug.append( device ); global::lineEditAudioPlug->setText( audioDevicePlug ); } } } } vokoscreenNG-3.0.2/src/audio/windows/QvkWatcherPlug.h000066400000000000000000000024031362045215000225560ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKWATCHERPLUG_H #define QVKWATCHERPLUG_H #include "ui_formMainWindow.h" #include #include class QvkWatcherPlug: public QObject { Q_OBJECT public: QvkWatcherPlug( Ui_formMainWindow *ui_mainwindow ); virtual ~QvkWatcherPlug(); void start_monitor(); public slots: private: Ui_formMainWindow *ui; QTimer *timer; int counter; private slots: void slot_update(); protected: signals: }; #endif vokoscreenNG-3.0.2/src/audio/windows/audioWindows.pri000066400000000000000000000003241362045215000226660ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkAudioWindows.h \ $$PWD/QvkWatcherPlug.h SOURCES += $$PWD/QvkAudioWindows.cpp \ $$PWD/QvkWatcherPlug.cpp vokoscreenNG-3.0.2/src/camera/000077500000000000000000000000001362045215000161345ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/camera/QvkCameraController.cpp000066400000000000000000000257231362045215000225670ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkCameraController.h" #include "global.h" QvkCameraController::QvkCameraController( Ui_formMainWindow *ui_surface ):cameraWatcher(new QvkCameraWatcher()), videoSurface(new QvkVideoSurface()) { ui_formMainWindow = ui_surface; sliderCameraWindowSize = new QvkSpezialSlider( Qt::Horizontal ); ui_formMainWindow->horizontalLayout_45->insertWidget( 1, sliderCameraWindowSize ); sliderCameraWindowSize->setObjectName( "sliderCameraWindowSize" ); sliderCameraWindowSize->setMinimum( 1 ); sliderCameraWindowSize->setMaximum( 3 ); sliderCameraWindowSize->setValue( 2 ); sliderCameraWindowSize->show(); sliderCameraWindowSize->setShowValue( false ); sliderCameraWindowSize->setEnabled( false ); cameraWindow = new QvkCameraWindow( ui_surface, sliderCameraWindowSize ); cameraWindow->hide(); connect( cameraWindow, SIGNAL( signal_cameraWindow_close( bool ) ), ui_formMainWindow->checkBoxCameraOnOff, SLOT( setChecked( bool ) ) ); cameraWindow->setWindowTitle( QString( tr( "Camera") ) ); QIcon icon( QString::fromUtf8( ":/pictures/logo/logo.png" ) ); cameraWindow->setWindowIcon( icon ); connect( cameraWatcher, SIGNAL( signal_addedCamera( QString, QString ) ), this, SLOT( slot_addedCamera( QString, QString ) ) ); connect( cameraWatcher, SIGNAL( signal_removedCamera( QString) ), this, SLOT( slot_removedCamera( QString ) ) ); cameraWatcher->cameraWatcherInit(); connect( ui_formMainWindow->checkBoxCameraOnOff, SIGNAL( toggled( bool ) ), ui_formMainWindow->comboBoxCamera, SLOT( setDisabled( bool ) ) ); #ifdef Q_OS_WIN connect( ui_formMainWindow->checkBoxCameraOnOff, SIGNAL( toggled( bool ) ), cameraWatcher, SLOT( slot_startStopCameraTimer( bool ) ) ); #endif connect( ui_formMainWindow->checkBoxCameraOnOff, SIGNAL( toggled( bool ) ), this, SLOT( slot_startCamera( bool ) ) ); connect( ui_formMainWindow->checkBoxCameraOnOff, SIGNAL( toggled( bool ) ), ui_formMainWindow->checkBoxCameraWindowFrame, SLOT( setEnabled(bool ) ) ); connect( videoSurface, SIGNAL( signal_newPicture( QImage ) ), this, SLOT( slot_setNewImage( QImage ) ) ); connect( ui_formMainWindow->checkBoxCameraWindowFrame, SIGNAL( toggled( bool ) ), this, SLOT( slot_frameOnOff( bool ) ) ); connect( sliderCameraWindowSize, SIGNAL( valueChanged( int ) ), this, SLOT( slot_sliderMoved( int ) ) ); } QvkCameraController::~QvkCameraController() { } void QvkCameraController::slot_frameOnOff( bool value ) { if ( cameraWindow->isVisible() == true ) { if ( value == true ) { cameraWindow->setWindowFlags( Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint ); } if ( value == false ) { cameraWindow->setWindowFlags( Qt::Window | Qt::WindowStaysOnTopHint ); } cameraWindow->show(); } } void QvkCameraController::slot_sliderMoved( int value ) { if ( value == 1 ) { cameraWindow->resize( 160, 120 ); } if ( value == 2 ) { cameraWindow->resize( 320, 240 ); } if ( value == 3 ) { cameraWindow->resize( 639, 479 ); } } void QvkCameraController::slot_setNewImage( QImage image ) { #ifdef Q_OS_LINUX if ( ui_formMainWindow->checkBoxCameraMirrorHorizontal->isChecked() == true ) image = image.mirrored( true, false ); if ( ui_formMainWindow->checkBoxCameraMirrorVertical->isChecked() == true ) image = image.mirrored( false, true ); #endif #ifdef Q_OS_WIN if ( ui_formMainWindow->checkBoxCameraMirrorHorizontal->isChecked() == true ) image = image.mirrored( true, false ); if ( ui_formMainWindow->checkBoxCameraMirrorVertical->isChecked() == false ) image = image.mirrored( false, true ); #endif if ( ui_formMainWindow->checkBoxCameraInvert->isChecked() == true ) image.invertPixels( QImage::InvertRgb ); if ( ui_formMainWindow->checkBoxCameraGray->isChecked() == true ) image = image.convertToFormat( QImage::Format_Grayscale8 ); if ( ui_formMainWindow->checkBoxCameraMono->isChecked() == true ) image = image.convertToFormat( QImage::Format_Mono ); image = image.scaled( cameraWindow->width(), cameraWindow->height(), Qt::KeepAspectRatio, Qt::FastTransformation); cameraWindow->setPixmap( QPixmap::fromImage( image, Qt::AutoColor) ); } void QvkCameraController::slot_addedCamera( QString description, QString device ) { ui_formMainWindow->checkBoxCameraOnOff->setEnabled( true ); ui_formMainWindow->comboBoxCamera->setEnabled( true ); ui_formMainWindow->comboBoxCamera->addItem( description, device.toLatin1() ); ui_formMainWindow->checkBoxCameraOnOff->setEnabled( true ); ui_formMainWindow->comboBoxCamera->setEnabled( true ); ui_formMainWindow->checkBoxCameraGray->setEnabled( true ); ui_formMainWindow->checkBoxCameraInvert->setEnabled( true ); ui_formMainWindow->checkBoxCameraMirrorHorizontal->setEnabled( true ); ui_formMainWindow->checkBoxCameraMirrorVertical->setEnabled( true ); ui_formMainWindow->checkBoxCameraMono->setEnabled( true ); sliderCameraWindowSize->setEnabled( true ); ui_formMainWindow->labelCameraWindowSize160_120->setEnabled( true ); ui_formMainWindow->labelCameraWindowSize320_240->setEnabled( true ); ui_formMainWindow->labelCameraWindowSize640_480->setEnabled( true ); } void QvkCameraController::slot_removedCamera( QString device ) { if ( ( ui_formMainWindow->checkBoxCameraOnOff->isChecked() == true ) and ( ui_formMainWindow->comboBoxCamera->currentData() == device.toLatin1() ) ) { cameraWindow->close(); } int x = ui_formMainWindow->comboBoxCamera->findData( device.toLatin1() ); ui_formMainWindow->comboBoxCamera->removeItem( x ); if ( ui_formMainWindow->comboBoxCamera->count() == 0 ) { ui_formMainWindow->checkBoxCameraOnOff->setEnabled( false ); ui_formMainWindow->comboBoxCamera->setEnabled( false ); ui_formMainWindow->checkBoxCameraGray->setEnabled( false ); ui_formMainWindow->checkBoxCameraInvert->setEnabled( false ); ui_formMainWindow->checkBoxCameraMirrorHorizontal->setEnabled( false ); ui_formMainWindow->checkBoxCameraMirrorVertical->setEnabled( false ); ui_formMainWindow->checkBoxCameraMono->setEnabled( false ); sliderCameraWindowSize->setEnabled( false ); ui_formMainWindow->labelCameraWindowSize160_120->setEnabled( false ); ui_formMainWindow->labelCameraWindowSize320_240->setEnabled( false ); ui_formMainWindow->labelCameraWindowSize640_480->setEnabled( false ); } } void QvkCameraController::slot_startCamera( bool value ) { if ( value == true ) { QByteArray device = ui_formMainWindow->comboBoxCamera->currentData().toByteArray(); delete camera; camera = new QCamera( device ); camera->setCaptureMode( QCamera::CaptureViewfinder ); connect( camera, SIGNAL( statusChanged( QCamera::Status ) ), this, SLOT( slot_statusChanged( QCamera::Status ) ) ); connect( camera, SIGNAL( stateChanged( QCamera::State ) ), this, SLOT( slot_stateChanged( QCamera::State ) ) ); QCameraViewfinderSettings viewfinderSettings; viewfinderSettings.setResolution( 640, 480 ); viewfinderSettings.setMinimumFrameRate( 0.0 ); viewfinderSettings.setMaximumFrameRate( 0.0 ); camera->setViewfinderSettings( viewfinderSettings ); slot_sliderMoved( sliderCameraWindowSize->value() ); camera->setViewfinder( videoSurface ); cameraWindow->show(); #ifdef Q_OS_LINUX camera->load(); #endif #ifdef Q_OS_WIN camera->start(); #endif } else { disconnect( camera, nullptr, nullptr, nullptr ); camera->stop(); camera->unload(); cameraWindow->close(); } } void QvkCameraController::slot_statusChanged( QCamera::Status status ) { switch ( status ) { case QCamera::UnavailableStatus : { qDebug().noquote() << global::nameOutput << status; break; }// 0 case QCamera::UnloadedStatus : { qDebug().noquote() << global::nameOutput << status; break; }// 1 case QCamera::LoadingStatus : { qDebug().noquote() << global::nameOutput << status; break; }// 2 case QCamera::UnloadingStatus : { qDebug().noquote() << global::nameOutput << status; break; }// 3 case QCamera::LoadedStatus : { qDebug().noquote() << global::nameOutput << status; #ifdef Q_OS_LINUX camera->start(); #endif break; }// 4 case QCamera::StandbyStatus : { qDebug().noquote() << global::nameOutput << status; break; }// 5 case QCamera::StartingStatus : { qDebug().noquote() << global::nameOutput << status; break; }// 6 case QCamera::StoppingStatus : { qDebug().noquote() << global::nameOutput << status; break; }// 7 case QCamera::ActiveStatus : { qDebug().noquote() << global::nameOutput << status; break; }// 8 } } void QvkCameraController::slot_stateChanged( QCamera::State state ) { switch ( state ) { case QCamera::UnloadedState : { qDebug().noquote() << global::nameOutput << state; break; };// 0 case QCamera::LoadedState : { qDebug().noquote() << global::nameOutput << state; break; };// 1 case QCamera::ActiveState : { qDebug().noquote() << global::nameOutput << state; break; };// 2 } } void QvkCameraController::slot_error( QCamera::Error error ) { switch ( error ) { case QCamera::NoError: { break; } case QCamera::CameraError: { qDebug() << "QCamera" << "General Camera error"; break; } case QCamera::InvalidRequestError: { qDebug() << "QCamera" << "Camera invalid request error"; break; } case QCamera::ServiceMissingError: { qDebug() << "QCamera" << "Camera service missing error"; break; } case QCamera::NotSupportedFeatureError : { qDebug() << "QCamera" << "Camera not supported error"; break; } }; } vokoscreenNG-3.0.2/src/camera/QvkCameraController.h000066400000000000000000000037721362045215000222340ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKCAMERACONTROLLER_H #define QVKCAMERACONTROLLER_H #include "ui_formMainWindow.h" #ifdef Q_OS_LINUX #include "QvkCameraWatcherLinux.h" #endif #ifdef Q_OS_WIN #include "QvkCameraWatcherWindows.h" #endif #include "QvkCameraWindow.h" #include "QvkVideoSurface.h" #include "QvkSpezialSlider.h" #include #include class QvkCameraController : public QObject { Q_OBJECT public: QvkCameraController( Ui_formMainWindow *ui_surface ); virtual ~QvkCameraController(); QvkCameraWindow *cameraWindow; public slots: private slots: void slot_addedCamera( QString description, QString device ); void slot_removedCamera( QString device ); void slot_startCamera( bool value ); void slot_statusChanged( QCamera::Status status ); void slot_stateChanged( QCamera::State state ); void slot_error( QCamera::Error error ); void slot_setNewImage( QImage image ); void slot_frameOnOff( bool value ); void slot_sliderMoved( int value ); private: Ui_formMainWindow *ui_formMainWindow; QCamera *camera = nullptr; QvkCameraWatcher *cameraWatcher; QvkVideoSurface *videoSurface; QvkSpezialSlider *sliderCameraWindowSize; protected: signals: }; #endif vokoscreenNG-3.0.2/src/camera/QvkCameraWatcherLinux.cpp000066400000000000000000000074021362045215000230530ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkCameraWatcherLinux.h" #include "global.h" #include QvkCameraWatcher::QvkCameraWatcher() { } void QvkCameraWatcher::cameraWatcherInit() { cameraCount = 0; oldDeviceList.clear(); QStringList deviceList; QString path = "/dev/"; QFileSystemWatcher * fileSystemWatcher = new QFileSystemWatcher(); fileSystemWatcher->addPath( path ); connect( fileSystemWatcher, SIGNAL( directoryChanged( QString ) ), this, SLOT( myfileSystemWatcher( QString ) ) ); QDir dir( path ); QStringList filters; filters << "video*"; deviceList = dir.entryList( filters, QDir::System, QDir::Time ); deviceList.sort(); oldDeviceList = deviceList; cameraCount = deviceList.count(); for ( int x = 0; x < deviceList.count(); x++ ) { QCameraInfo cameraInfo( QString( path + deviceList.at(x) ).toLatin1() ); qDebug().noquote() << global::nameOutput << "[Camera] Found:" << cameraInfo.description() << "Device:" << deviceList.at(x); emit signal_addedCamera( cameraInfo.description() , path + deviceList.at(x) ); } qDebug(); } QvkCameraWatcher::~QvkCameraWatcher() { } /* * Add or remove plugin or plugout devices */ void QvkCameraWatcher::myfileSystemWatcher( QString path ) { QDir dir( path ); QStringList filters; filters << "video*"; QStringList newDeviceList = dir.entryList( filters, QDir::System, QDir::Time ); newDeviceList.sort(); // add plugin device if ( newDeviceList.count() > cameraCount ) { QString addedDevice; for ( int x = 0; x < newDeviceList.count(); x++ ) { if ( not oldDeviceList.contains( newDeviceList.at(x) ) ) { addedDevice = newDeviceList.at(x); } } cameraCount = newDeviceList.count(); // waiting for data from CameraInfo bool b = false; while ( b == false ) { QCameraInfo cameraInfo( QString( path + addedDevice ).toLatin1() ); if ( cameraInfo.isNull() == false ) { b = true; qDebug().noquote() << global::nameOutput << "[Camera] Added:" << cameraInfo.description() << "Device:" << addedDevice; emit signal_addedCamera( cameraInfo.description() , path + addedDevice ); } } } // remove plugout device if ( newDeviceList.count() < cameraCount ) { QString removedDevice; for ( int x = 0; x < oldDeviceList.count(); x++ ) { if ( not newDeviceList.contains( oldDeviceList.at(x) ) ) { removedDevice = oldDeviceList.at(x); } } cameraCount = newDeviceList.count(); emit signal_removedCamera( path + removedDevice ); qDebug().noquote() << global::nameOutput << "[Camera] Removed:" << removedDevice; } if ( oldDeviceList.count() != newDeviceList.count() ) { oldDeviceList = newDeviceList; } } vokoscreenNG-3.0.2/src/camera/QvkCameraWatcherLinux.h000066400000000000000000000025561362045215000225250ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKWEBCAMWATCHER_H #define QVKWEBCAMWATCHER_H #include #include #include #include class QvkCameraWatcher: public QObject { Q_OBJECT public: QvkCameraWatcher(); virtual ~QvkCameraWatcher(); void cameraWatcherInit(); public slots: void myfileSystemWatcher( QString path ); private slots: signals: void signal_removedCamera( QString value ); void signal_addedCamera( QString description, QString deviceName ); protected: private: QStringList oldDeviceList; int cameraCount; }; #endif vokoscreenNG-3.0.2/src/camera/QvkCameraWatcherWindows.cpp000066400000000000000000000101771362045215000234110ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkCameraWatcherWindows.h" #include using namespace std; QvkCameraWatcher::QvkCameraWatcher() : newcount(0) { } QvkCameraWatcher::~QvkCameraWatcher() { } void QvkCameraWatcher::cameraWatcherInit() { newDescriptionList.clear(); newDeviceNameList.clear(); oldDeviceNameList.clear(); timer = new QTimer(this); timer->setTimerType( Qt::PreciseTimer ); timer->setInterval( 2000 ); connect( timer, SIGNAL( timeout() ), this, SLOT( slot_detectCameras() ) ); slot_detectCameras(); } void QvkCameraWatcher::slot_startStopCameraTimer( bool value ) { if ( value == true ) { timer->stop(); } if ( value == false ) { timer->start(); } } /* * Return removed device */ QString QvkCameraWatcher::removedDeviceName(QStringList myNewDeviceNameList, QStringList myOldDeviceNameList ) { QStringList removedList; int x; for ( x = 0; x < myOldDeviceNameList.count(); x++ ) { removedList = myNewDeviceNameList.filter( myOldDeviceNameList[ x ] ); if ( removedList.empty() ) break; } return myOldDeviceNameList[ x ]; } /* * Return added device * Wenn myNewDeviceNameList das Device nicht beinhaltet wird es hinzugefügt */ QString QvkCameraWatcher::addedDeviceName( QStringList myNewDeviceNameList, QString device ) { QString newDevice; if ( !myNewDeviceNameList.empty() ) { if ( myNewDeviceNameList.contains( device ) == false ) { newDevice = device; } } else { newDevice = device; } return newDevice; } /* * Is called periodically by the timer */ void QvkCameraWatcher::slot_detectCameras() { QList info = QCameraInfo::availableCameras(); timer->stop(); bool deviceAdded = false; QList cameras = QCameraInfo::availableCameras(); for ( int i = 0; i < QCameraInfo::availableCameras().count(); i++ ) { QString cameraDevice = addedDeviceName( newDeviceNameList, cameras.at(i).deviceName() ); if ( ( cameraDevice > "" ) and ( !cameras.at(i).description().contains( "@device:pnp" ) ) ) { newDeviceNameList << cameraDevice; newDescriptionList << cameras.at(i).description(); newcount = newDeviceNameList.count(); deviceAdded = true; emit signal_addedCamera( cameras.at(i).description(), cameraDevice ); } } // Ein Device wurde hinzugefügt, Funktion wird dann hier abgebrochen if ( deviceAdded == true ) { timer->start(); return; } if ( QCameraInfo::availableCameras().count() < newcount ) { oldDeviceNameList = newDeviceNameList; newDescriptionList.clear(); newDeviceNameList.clear(); QList cameras = QCameraInfo::availableCameras(); foreach ( const QCameraInfo &cameraInfo, cameras ) { newDescriptionList << cameraInfo.description(); newDeviceNameList << cameraInfo.deviceName(); } newcount = newDeviceNameList.count(); // detected which camera was removed QString cameraDevice = removedDeviceName( newDeviceNameList , oldDeviceNameList ); qDebug() << "Removed Camera" << cameraDevice; emit signal_removedCamera( cameraDevice ); } timer->start(); } vokoscreenNG-3.0.2/src/camera/QvkCameraWatcherWindows.h000066400000000000000000000031721362045215000230530ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKCAMERAWATCHER_H #define QVKCAMERAWATCHER_H #include #include #include class QvkCameraWatcher: public QObject { Q_OBJECT public: QvkCameraWatcher(); virtual ~QvkCameraWatcher(); void cameraWatcherInit(); public slots: void slot_startStopCameraTimer( bool value ); private slots: void slot_detectCameras(); signals: void signal_removedCamera( QString value ); void signal_addedCamera( QString description, QString deviceName ); protected: private: int newcount; QStringList newDescriptionList; QStringList newDeviceNameList; QStringList oldDeviceNameList; QTimer *timer; QString addedDeviceName( QStringList myNewDeviceNameList, QString device ); QString removedDeviceName( QStringList myNewDeviceNameList, QStringList myOldDeviceNameList ); }; #endif vokoscreenNG-3.0.2/src/camera/QvkCameraWindow.cpp000066400000000000000000000154421362045215000217100ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkCameraWindow.h" #include #include QvkCameraWindow::QvkCameraWindow( Ui_formMainWindow *ui_surface, QvkSpezialSlider *gui_sliderCameraWindowSize ) { ui_formMainWindow = ui_surface; setWindowFlags( windowFlags() | Qt::WindowStaysOnTopHint ); setStyleSheet( "background-color:black;" ); setMinimumSize( QSize( 160, 120 ) ); setAlignment( Qt::AlignHCenter | Qt::AlignVCenter ); setMouseTracking( true ); // No function, why? vkCameraSettingsDialog = new cameraSettingsDialog; connect( this, SIGNAL( signal_cameraWindow_close( bool ) ), vkCameraSettingsDialog, SLOT( close() ) ); connect( ui_formMainWindow->checkBoxCameraMirrorHorizontal, SIGNAL( toggled( bool ) ), vkCameraSettingsDialog->ui->checkBoxCameraMirrorHorizontal, SLOT( setChecked( bool ) ) ); connect( ui_formMainWindow->checkBoxCameraMirrorVertical, SIGNAL( toggled( bool ) ), vkCameraSettingsDialog->ui->checkBoxCameraMirrorVertical, SLOT( setChecked( bool ) ) ); connect( ui_formMainWindow->checkBoxCameraInvert, SIGNAL( toggled( bool ) ), vkCameraSettingsDialog->ui->checkBoxCameraInvert, SLOT( setChecked( bool ) ) ); connect( ui_formMainWindow->checkBoxCameraGray, SIGNAL( toggled( bool ) ), vkCameraSettingsDialog->ui->checkBoxCameraGray, SLOT( setChecked( bool ) ) ); connect( ui_formMainWindow->checkBoxCameraMono, SIGNAL( toggled( bool ) ), vkCameraSettingsDialog->ui->checkBoxCameraMono, SLOT( setChecked( bool ) ) ); connect( ui_formMainWindow->checkBoxCameraWindowFrame, SIGNAL( toggled( bool ) ), vkCameraSettingsDialog->ui->checkBoxCameraWindowFrame, SLOT( setChecked( bool ) ) ); connect( gui_sliderCameraWindowSize, SIGNAL( valueChanged( int ) ), vkCameraSettingsDialog->dialog_sliderCameraWindowSize, SLOT( setValue( int ) ) ); connect( vkCameraSettingsDialog->ui->checkBoxCameraMirrorHorizontal, SIGNAL( toggled( bool ) ), ui_formMainWindow->checkBoxCameraMirrorHorizontal, SLOT( setChecked( bool ) ) ); connect( vkCameraSettingsDialog->ui->checkBoxCameraMirrorVertical, SIGNAL( toggled( bool ) ), ui_formMainWindow->checkBoxCameraMirrorVertical, SLOT( setChecked( bool ) ) ); connect( vkCameraSettingsDialog->ui->checkBoxCameraInvert, SIGNAL( toggled( bool ) ), ui_formMainWindow->checkBoxCameraInvert, SLOT( setChecked( bool ) ) ); connect( vkCameraSettingsDialog->ui->checkBoxCameraGray, SIGNAL( toggled( bool ) ), ui_formMainWindow->checkBoxCameraGray, SLOT( setChecked( bool ) ) ); connect( vkCameraSettingsDialog->ui->checkBoxCameraMono, SIGNAL( toggled( bool ) ), ui_formMainWindow->checkBoxCameraMono, SLOT( setChecked( bool ) ) ); connect( vkCameraSettingsDialog->ui->checkBoxCameraWindowFrame, SIGNAL( toggled( bool ) ), ui_formMainWindow->checkBoxCameraWindowFrame, SLOT( setChecked( bool ) ) ); connect( vkCameraSettingsDialog->dialog_sliderCameraWindowSize, SIGNAL( valueChanged( int ) ), gui_sliderCameraWindowSize, SLOT( setValue( int ) ) ); connect( vkCameraSettingsDialog->ui->buttonBox, SIGNAL( accepted() ), vkCameraSettingsDialog, SLOT( close() ) ); connect( vkCameraSettingsDialog->ui->pushButtonSwitchToFullscreen, SIGNAL( clicked( bool ) ), this, SLOT( slot_switchToFullscreen() ) ); } QvkCameraWindow::~QvkCameraWindow() { } void QvkCameraWindow::closeEvent(QCloseEvent *event) { Q_UNUSED(event); emit signal_cameraWindow_close( false ); } void QvkCameraWindow::slot_switchToFullscreen() { if ( isFullScreen() == true ) { showNormal(); vkCameraSettingsDialog->close(); } else { setWindowState( Qt::WindowFullScreen ); vkCameraSettingsDialog->close(); } } void QvkCameraWindow::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); if ( isFullScreen() == true ) { vkCameraSettingsDialog->ui->pushButtonSwitchToFullscreen->setText( tr( "Switch to Window" ) ); } else { vkCameraSettingsDialog->ui->pushButtonSwitchToFullscreen->setText( tr( "Switch to Fullscreen" ) ); } } void QvkCameraWindow::mouseDoubleClickEvent( QMouseEvent *event ) { if ( event->button() == Qt::LeftButton ) { if ( isFullScreen() == true ) { showNormal(); } else { setWindowState( Qt::WindowFullScreen ); vkCameraSettingsDialog->close(); } } } void QvkCameraWindow::keyPressEvent( QKeyEvent *event ) { if ( event->key() == Qt::Key_Escape ) { showNormal(); } if ( ( event->key() == Qt::Key_F11 ) or ( event->key() == Qt::Key_F ) ) { if ( isFullScreen() == true ) { showNormal(); } else { setWindowState( Qt::WindowFullScreen ); } } } void QvkCameraWindow::mousePressEvent(QMouseEvent *event) { if ( event->button() == Qt::RightButton ) { if ( vkCameraSettingsDialog->isVisible() ) { vkCameraSettingsDialog->close(); } else { vkCameraSettingsDialog->move( event->globalX() + 30, event->globalY() + 30 ); vkCameraSettingsDialog->show(); if ( isFullScreen() == true ) { vkCameraSettingsDialog->ui->widgetCameraWindowSize->hide(); vkCameraSettingsDialog->ui->checkBoxCameraWindowFrame->hide(); vkCameraSettingsDialog->ui->line_2->hide(); vkCameraSettingsDialog->ui->line_3->hide(); } else { vkCameraSettingsDialog->ui->widgetCameraWindowSize->show(); vkCameraSettingsDialog->ui->checkBoxCameraWindowFrame->show(); vkCameraSettingsDialog->ui->line_2->show(); vkCameraSettingsDialog->ui->line_3->show(); } } return; } if ( isFullScreen() == true ) { vkCameraSettingsDialog->close(); } } vokoscreenNG-3.0.2/src/camera/QvkCameraWindow.h000066400000000000000000000033751362045215000213570ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKCAMERAWINDOW_H #define QVKCAMERAWINDOW_H #include "ui_formMainWindow.h" #include "ui_camerasettingsdialog.h" #include "camerasettingsdialog.h" #include "QvkSpezialSlider.h" #include #include class QvkCameraWindow : public QLabel { Q_OBJECT public: QvkCameraWindow( Ui_formMainWindow *ui_surface, QvkSpezialSlider *gui_sliderCameraWindowSize ); virtual ~QvkCameraWindow(); Ui_cameraSettingsDialog *uiCameraSettingsDialog; cameraSettingsDialog *vkCameraSettingsDialog; private: Ui_formMainWindow *ui_formMainWindow; public slots: private slots: void slot_switchToFullscreen(); protected: void closeEvent(QCloseEvent *event); void mouseDoubleClickEvent( QMouseEvent *event ); void keyPressEvent( QKeyEvent *event ); void mousePressEvent(QMouseEvent *event); void resizeEvent(QResizeEvent *event); signals: void signal_cameraWindow_close( bool ); }; #endif // QVKWEBCAMWINDOW_H vokoscreenNG-3.0.2/src/camera/QvkVideoSurface.h000066400000000000000000000045101362045215000213460ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKVIDEOSURFACE_H #define QVKVIDEOSURFACE_H #include #include class QvkVideoSurface: public QAbstractVideoSurface { Q_OBJECT public: QvkVideoSurface(QObject * parent=Q_NULLPTR) : QAbstractVideoSurface(parent) {} QList supportedPixelFormats(QAbstractVideoBuffer::HandleType type) const { (void)type; return QList() << QVideoFrame::Format_RGB32 << QVideoFrame::Format_ARGB32 << QVideoFrame::Format_ARGB32_Premultiplied << QVideoFrame::Format_ARGB8565_Premultiplied << QVideoFrame::Format_RGB555; } bool present(const QVideoFrame &frame) { if ( frame.isValid() ) { QVideoFrame cloneFrame(frame); cloneFrame.map( QAbstractVideoBuffer::ReadOnly ); const QImage image( cloneFrame.bits(), cloneFrame.width(), cloneFrame.height(), QVideoFrame::imageFormatFromPixelFormat( cloneFrame.pixelFormat() ) ); cloneFrame.unmap(); emit ( signal_newPicture( image ) ); return true; } return false; } signals: void signal_newPicture( QImage ); }; #endif vokoscreenNG-3.0.2/src/camera/camera.pri000066400000000000000000000015121362045215000200770ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD unix:HEADERS += $$PWD/QvkCameraController.h \ $$PWD/QvkCameraWatcherLinux.h \ $$PWD/QvkCameraWindow.h \ $$PWD/QvkVideoSurface.h unix:SOURCES += $$PWD/QvkCameraController.cpp \ $$PWD/QvkCameraWatcherLinux.cpp \ $$PWD/QvkCameraWindow.cpp win32:HEADERS += $$PWD/QvkCameraController.h \ $$PWD/QvkCameraWatcherWindows.h \ $$PWD/QvkCameraWindow.h \ $$PWD/QvkVideoSurface.h win32:SOURCES += $$PWD/QvkCameraController.cpp \ $$PWD/QvkCameraWatcherWindows.cpp \ $$PWD/QvkCameraWindow.cpp FORMS += \ $$PWD/camerasettingsdialog.ui HEADERS += \ $$PWD/camerasettingsdialog.h SOURCES += \ $$PWD/camerasettingsdialog.cpp vokoscreenNG-3.0.2/src/camera/camerasettingsdialog.cpp000066400000000000000000000035551362045215000230410ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "ui_camerasettingsdialog.h" #include "camerasettingsdialog.h" #include "global.h" cameraSettingsDialog::cameraSettingsDialog(QWidget *parent) : QDialog(parent), ui(new Ui::cameraSettingsDialog) { setWindowFlags( Qt::Window | Qt::WindowStaysOnTopHint | Qt::Tool ); ui->setupUi(this); dialog_sliderCameraWindowSize = new QvkSpezialSlider( Qt::Horizontal ); ui->verticalLayout_3->insertWidget( 0, dialog_sliderCameraWindowSize ); dialog_sliderCameraWindowSize->setObjectName( "sliderCameraWindowSize" ); dialog_sliderCameraWindowSize->setMinimum( 1 ); dialog_sliderCameraWindowSize->setMaximum( 3 ); dialog_sliderCameraWindowSize->setValue( 2 ); dialog_sliderCameraWindowSize->show(); dialog_sliderCameraWindowSize->setShowValue( false ); ui->tabWidget->setTabIcon( 0, QIcon::fromTheme( "camera-web", QIcon( ":/pictures/camera/camera.png" ) ) ); setWindowIcon( QIcon( ":/pictures/logo/logo.png" ) ); setWindowTitle( tr( "Camera settings" ) ); } cameraSettingsDialog::~cameraSettingsDialog() { delete ui; } vokoscreenNG-3.0.2/src/camera/camerasettingsdialog.h000066400000000000000000000023751362045215000225050ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef CAMERASETTINGSDIALOG_H #define CAMERASETTINGSDIALOG_H #include "QvkSpezialSlider.h" #include namespace Ui { class cameraSettingsDialog; } class cameraSettingsDialog : public QDialog { Q_OBJECT public: explicit cameraSettingsDialog( QWidget *parent = Q_NULLPTR ); ~cameraSettingsDialog(); Ui::cameraSettingsDialog *ui; QvkSpezialSlider *dialog_sliderCameraWindowSize; private: }; #endif // CAMERASETTINGSDIALOG_H vokoscreenNG-3.0.2/src/camera/camerasettingsdialog.ui000066400000000000000000000132111362045215000226620ustar00rootroot00000000000000 cameraSettingsDialog 0 0 278 320 Dialog 0 48 48 Flip vertical Flip horizontal Qt::Horizontal Invert Gray Black-and-white Qt::Horizontal Remove window frame Qt::Horizontal 0 160x120 320x240 Qt::AlignCenter 640x480 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Horizontal Switch to Fullscreen Qt::Vertical 20 40 Help QDialogButtonBox::Ok vokoscreenNG-3.0.2/src/countdown/000077500000000000000000000000001362045215000167245ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/countdown/QvkCountdown.cpp000066400000000000000000000076551362045215000221070ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkCountdown.h" #include #include #include #include QvkCountdown::QvkCountdown() { QScreen *screen = QGuiApplication::primaryScreen(); Width = 300; Height = 300;; x = ( screen->geometry().width() / 2 ) - ( Width / 2 ); y = ( screen->geometry().height() / 2 ) -( Height / 2 ); // Die Optionen Qt::Tool sollte nicht angewendet werden da bei Auswahl eines Fenster der Countdown nicht angezeigt wird. // Die Option Qt::ToolTip wäre eine möglichkeit, gefällt mir aber Optisch nicht da ein Rahmen angezeigt wird. setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint ); setAttribute( Qt::WA_TranslucentBackground, true ); setWindowTitle( QString( tr( "Countdown") ) ); QIcon icon; icon.addFile( QString::fromUtf8( ":/pictures/logo/logo.png" ), QSize(), QIcon::Normal, QIcon::Off ); setWindowIcon( icon ); timer = new QTimer( this ); timer->setTimerType( Qt::PreciseTimer ); connect( timer, SIGNAL( timeout() ), this, SLOT( slot_updateTimer() ) ); animationTimer = new QTimer( this ); animationTimer->setTimerType( Qt::PreciseTimer ); connect( animationTimer, SIGNAL( timeout() ), this, SLOT( slot_updateAnimationTimer() ) ); hide(); } void QvkCountdown::startCountdown( int value ) { setGeometry( x, y, Width, Height ); show(); countValue = value; gradValue = 0; timer->start( 1000 ); animationTimer->start( 25 ); emit signal_countdownBegin( true ); } QvkCountdown::~QvkCountdown() { } void QvkCountdown::slot_updateTimer() { gradValue = 0; countValue--; if ( countValue == 0 ) { setGeometry( x, y, 1, 1 ); hide(); timer->stop(); animationTimer->stop(); emit signal_countDownfinish( true ); } } void QvkCountdown::slot_updateAnimationTimer() { gradValue = gradValue - 20; update(); } void QvkCountdown::paintEvent( QPaintEvent *event ) { (void)event; painter.begin( this ); painter.setRenderHints( QPainter::Antialiasing, true ); QPen pen; QBrush brush; brush.setColor( Qt::darkGray ); brush.setStyle( Qt::SolidPattern ); pen.setWidth( 0 ); pen.setColor( Qt::darkGray ); painter.setBrush( brush ); painter.setPen( pen ); painter.setOpacity( 0.3 ); painter.drawPie( 0, 0, 300, 300, 90*16, gradValue*16 ); painter.setOpacity( 1.0 ); pen.setColor( Qt::darkGray ); pen.setWidth( 6 ); painter.setPen( pen ); brush.setStyle( Qt::NoBrush ); painter.setBrush( brush ); painter.drawEllipse( QPoint( width()/2, height()/2), 125-3, 125-3 ); painter.drawEllipse( QPoint( width()/2, height()/2), 100, 100 ); painter.drawLine( 0, height()/2, width(), height()/2 ); painter.drawLine( width()/2, 0, width()/2, height() ); int fontSize = 110; QFont font; font.setPointSize( fontSize ); painter.setFont( font ); painter.setPen( Qt::red ); QFontMetrics fontMetrics( font ); int fontWidth = fontMetrics.width( QString::number( countValue ) ); painter.drawText( width()/2-fontWidth/2, height()/2+fontSize/2, QString::number( countValue ) ); painter.end(); } vokoscreenNG-3.0.2/src/countdown/QvkCountdown.h000066400000000000000000000027701362045215000215450ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKCOUNTDOWN_H #define QVKCOUNTDOWN_H #include #include class QvkCountdown: public QWidget { Q_OBJECT public: QvkCountdown(); virtual ~QvkCountdown(); void startCountdown(int value ); public slots: private: int countValue; int oldCountValue; int gradValue; QTimer *timer; QTimer *animationTimer; QPainter painter; int Width; int Height; int x; int y; private slots: void slot_updateTimer(); void slot_updateAnimationTimer(); protected: void paintEvent( QPaintEvent *event ); signals: void signal_countDownfinish( bool value ); void signal_countdownBegin( bool value ); }; #endif vokoscreenNG-3.0.2/src/countdown/countdown.pri000066400000000000000000000002101362045215000214510ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkCountdown.h SOURCES += $$PWD/QvkCountdown.cpp vokoscreenNG-3.0.2/src/formMainWindow.ui000066400000000000000000002662651362045215000202240ustar00rootroot00000000000000 formMainWindow 0 0 710 428 0 0 0 0 0 0 QTabWidget::West 0 72 72 .. Screencast 0 6 0 0 0 0 0 0 48 48 false Fulls&creen Reset Reset Help QComboBox::AdjustToContents Wi&ndow Help Help QFrame::NoFrame QFrame::Raised 0 0 0 0 Area Qt::Horizontal 40 20 Qt::Vertical 20 40 0 0 Qt::Vertical 20 40 0 Magnification Help Qt::Horizontal QSizePolicy::Minimum 40 20 Countdown Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Help Qt::Vertical 20 40 Qt::Vertical 20 40 Qt::Vertical 0 40 0 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Video size: Free disk space: 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Vertical 20 40 MB KB Information 3 Record Time: 00:00:00 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 QFrame::StyledPanel QFrame::Raised 0 0 0 0 6 QFrame::NoFrame true Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 0 0 535 233 0 0 0 0 0 Help Help Qt::Vertical 20 40 Qt::Vertical QSizePolicy::Minimum 20 40 Qt::Vertical QSizePolicy::Minimum 20 40 QComboBox::AdjustToMinimumContentsLength 14 Help Help Help Format Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Frames Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Videocodec Qt::Horizontal 40 20 QFrame::NoFrame QFrame::Raised 0 0 0 0 0 QFrame::NoFrame QFrame::Raised 6 0 6 0 superfast 1 ultrafast superfast veryfast faster fast medium slow slower veryslow placebo Quality Reset Reset QFrame::NoFrame QFrame::Raised 0 0 QFrame::NoFrame QFrame::Raised 0 0 Quality Reset Reset false Audiocodec false Help Help Qt::Vertical 20 40 Do not record mouse cursor Qt::Horizontal 40 20 Help Qt::Vertical 20 40 QFrame::NoFrame QFrame::Raised 0 0 0 Videopath true ... Help QFrame::NoFrame QFrame::Raised 0 0 0 Limit of free disk space Megabyte Help QFrame::NoFrame QFrame::Raised 0 0 0 0 0 Show in systray Qt::Horizontal 40 20 QFrame::NoFrame QFrame::Raised 0 0 0 0 0 Show in systray Reset Reset Help Minimized when recording starts Qt::Horizontal 40 20 Help Starts minimized Help Reset all settings at the next start Help Second wait before recording Help Qt::Vertical 20 40 Look for updates TextLabel Qt::Horizontal 40 20 Help true QFrame::NoFrame QFrame::Raised 6 0 0 0 0 Hour 8 Minute Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Horizontal 40 20 Start the timer Help Qt::Horizontal true Stop recording after false QFrame::NoFrame QFrame::Raised 6 0 0 0 0 Hours Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Minutes Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Seconds Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Help Qt::Vertical 20 40 0 75 true Format 75 true Video 75 true Audio 0 100 true 0 0 361 311 0 0 Picture Available Qt::Horizontal QSizePolicy::Expanding 40 20 Picture Not available Qt::Horizontal 40 20 Qt::Vertical 20 40 Help Qt::Vertical 20 40 Qt::Vertical 20 40 100 100 labelAutorPicture true Qt::AlignCenter Donate Qt::AlignCenter true Translation Qt::AlignCenter true Website Qt::AlignCenter true Sourcecode Qt::AlignCenter true Qt::Vertical 20 40 Qt::Horizontal Qt::Vertical 20 40 Qt::Horizontal 40 20 Online-Help Automatically Automatically Qt::Horizontal 40 20 Copyright and license from pictures Qt::Horizontal 40 20 Qt::Horizontal 40 20 Qt::Horizontal 40 20 Qt::Vertical 20 40 75 true CTRL+SHIFT+F10 Start false 75 true CTRL+SHIFT+F11 Stop false 75 true CTRL+SHIFT+F12 Pause false 75 true CTRL+SHIFT+F12 Continue 75 true Play last record Play 75 true Open folder Folder Help Camera 0 6 0 0 0 0 48 48 false CTRL+SHIFT+F8 Camera false 0 0 Help Qt::Horizontal false Flip vertical false Flip horizontal Qt::Horizontal 40 20 Qt::Horizontal false Invert false Gray false Black-and-white Qt::Horizontal false Remove window frame Qt::Horizontal 0 QFrame::StyledPanel QFrame::Raised QFrame::StyledPanel QFrame::Raised false 160x120 false 320x240 Qt::AlignCenter false 640x480 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Horizontal 40 20 Qt::Vertical 20 40 Player 9 0 0 0 Log 0 0 0 0 48 48 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> 75 true Send Report Help tabWidgetSideBar tabWidgetScreencast radioButtonScreencastFullscreen comboBoxScreencastScreen help_screencast_fullscreen radioButtonScreencastWindow help_screencast_window radioButtonScreencastArea comboBoxAreaSize help_screencast_area pushButtonStart pushButtonStop pushButtonPause pushButtonContinue pushButtonPlay pushButtonScreencastOpenfolder help_screencast_execute help_screencast_audio scrollAreaAudioDevice comboBoxx264Preset help_screencast_videocodec checkBoxStartTime help_screencast_starttimer checkBoxStopRecordingAfter help_screencast_stoptimer lineEditVideoPath PushButtonVideoPath help_screencast_videopath help_screencast_limitoffreediskspace help_screencast_showinsystray checkBoxMinimizedWhenRecordingStarts help_screencast_minimizedwhenrecordingstarts checkBoxStartsMinimized help_screencast_startsminimized scrollAreaAvailable help_screencast_avalaible tabWidgetCamera checkBoxCameraOnOff comboBoxCamera tabWidgetLog textBrowserLog pushButtonSendReport help_log_sendreport vokoscreenNG-3.0.2/src/global.cpp000066400000000000000000000022171362045215000166520ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "global.h" #include #include namespace global { QString name = "vokoscreenNG"; QString nameOutput = "[" + name + "]"; bool VK_showOnlyFallbackIcons = false; QLineEdit *lineEditAudioPlug; #ifdef Q_OS_LINUX QString version = "3.0.2"; #endif #ifdef Q_OS_WIN QString version = "3.0.2"; #endif } vokoscreenNG-3.0.2/src/global.h000066400000000000000000000020271362045215000163160ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include #include namespace global { extern QString name; extern QString nameOutput; extern QString version; extern bool VK_showOnlyFallbackIcons; extern QLineEdit *lineEditAudioPlug; } vokoscreenNG-3.0.2/src/help/000077500000000000000000000000001362045215000156345ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/help/QvkDownloader.cpp000066400000000000000000000046621362045215000211300ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkDownloader.h" #include "global.h" QvkDownloader::QvkDownloader( QString pathLocal , QObject *parent ) : QObject(parent) { connect( &networkAccessManager, SIGNAL( finished( QNetworkReply* ) ), SLOT( slot_downloadFinished( QNetworkReply* ) ) ); tempPath = pathLocal; } void QvkDownloader::doDownload( const QUrl &url ) { QNetworkRequest request; request.setSslConfiguration(QSslConfiguration::defaultConfiguration()); request.setUrl( url ); QNetworkReply *reply = networkAccessManager.get( request ); listDownloads.append( reply ); } bool QvkDownloader::saveLocal( const QString &filename, QIODevice *data ) { QString fileInTempPath = tempPath + "/" + filename; QFile file( fileInTempPath ); if ( !file.open( QIODevice::WriteOnly ) ) { return false; } file.write( data->readAll() ); file.close(); return true; } void QvkDownloader::slot_downloadFinished( QNetworkReply *reply ) { QString filename = QFileInfo( reply->url().path() ).fileName(); if ( reply->error() ) { //qDebug().noquote() << global::nameOutput << "Download of" << reply->url().toString() << "failed:" << reply->errorString(); } else { if ( saveLocal( filename, reply ) ) { //qDebug().noquote() << global::nameOutput << "Download of" << reply->url().toString() << "succeeded (saved to" << tempPath + "/" + filename + ")"; } } listDownloads.removeAll( reply ); reply->deleteLater(); if ( listDownloads.isEmpty() ) { // all downloads finished emit signal_fileDownloaded( tempPath + "/" + filename ); } } vokoscreenNG-3.0.2/src/help/QvkDownloader.h000066400000000000000000000032071362045215000205670ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKDOWNLOADER_H #define QVKDOWNLOADER_H #include #include #include #include #include #include #include #include #include #include #include class QvkDownloader : public QObject { Q_OBJECT QNetworkAccessManager networkAccessManager; QVector listDownloads; public: explicit QvkDownloader( QString pathLocal, QObject *parent = nullptr); void doDownload( const QUrl &url ); private: QString tempPath; bool saveLocal(const QString &filename, QIODevice *data ); void execute(); signals: void signal_fileDownloaded( QString ); public slots: void slot_downloadFinished( QNetworkReply *reply ); private slots: }; #endif // QvkDownloader_H vokoscreenNG-3.0.2/src/help/QvkHelp.cpp000066400000000000000000000244671362045215000177270ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkHelp.h" #include "QvkLocale.h" #include "global.h" #include #include #include #include #include /* * The remote HTML-file and the toolbutton have the same name. * * Example: * QToolbutton -> help_screencast_fullscreen * Remote file -> help_screencast_fullscreen.html * * We write as snake_case, so the underline character is the seperator. * The first section is help, this we need for set for icon and installEventFilter, see constructor. * The second section is the tab in the sidebar and the subdir on remote. * The third section is the name from the function that we want help. * See also QvkHelp::eventFilter(QObject *object, QEvent *event) */ QvkHelp::QvkHelp(QMainWindow *mainWindow, Ui_formMainWindow *ui_mainwindow ) : uiHelp(new(Ui::help)) { connect( mainWindow, SIGNAL( destroyed( QObject*) ), this, SLOT( slot_cleanUp() ) ); ui = ui_mainwindow; uiHelp->setupUi( this ); slot_NetworkAccessibility( networkAccessManager.networkAccessible() ); connect( &networkAccessManager, SIGNAL( networkAccessibleChanged( QNetworkAccessManager::NetworkAccessibility ) ), SLOT( slot_NetworkAccessibility( QNetworkAccessManager::NetworkAccessibility ) ) ); resize( 800, 600 ); setWindowTitle( QString( tr( "Help") ) ); QIcon icon; icon.addFile( QString::fromUtf8( ":/pictures/logo/logo.png" ), QSize(), QIcon::Normal, QIcon::Off ); setWindowIcon( icon ); QStringList helpStringList; helpStringList << "https:/" << "vokoscreen.volkoh.de" << "3.0" << "help"; vk_helpPath = helpStringList.join( "/" ).append( "/"); QvkLocale *vkLocale = new QvkLocale(); connect( vkLocale, SIGNAL( signal_locale( QStringList) ), this, SLOT( slot_parse_locale( QStringList ) ) ); vkDownloadHTML = new QvkDownloader( temporaryDirLocal.path() ); vkDownloadFiles = new QvkDownloader( temporaryDirLocal.path() ); QIcon iconHelp = style()->standardIcon( QStyle::SP_MessageBoxInformation ); QList listToolButton = ui->centralWidget->findChildren(); for ( int i = 0; i < listToolButton.count(); i++ ) { if ( listToolButton.at(i)->objectName().contains( QRegExp( "^help_") ) ) { listToolButton.at(i)->setIcon( iconHelp ); listToolButton.at(i)->installEventFilter( this ); } } } QvkHelp::~QvkHelp() { } void QvkHelp::slot_parse_locale( QStringList list ) { for ( int i = 0; i < list.count(); i++ ) { QLocale locale( list.at( i ) ); ui->comboBoxOnlineHelp->addItem( locale.nativeLanguageName() + " " + "(" + list.at(i) + ")", list.at( i ) ); } QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); QString valueText = settings.value( ui->comboBoxOnlineHelp->objectName(), "" ).toString(); int valueInt = ui->comboBoxOnlineHelp->findText( valueText ); if ( valueInt > -1 ) { ui->comboBoxOnlineHelp->setCurrentIndex( valueInt ); } } void QvkHelp::slot_NetworkAccessibility( QNetworkAccessManager::NetworkAccessibility accessible ) { QList listToolButton = ui->centralWidget->findChildren(); for ( int i = 0; i < listToolButton.count(); i++ ) { if ( listToolButton.at(i)->objectName().contains( QRegExp( "^help_") ) ) { if ( accessible == QNetworkAccessManager::Accessible ) { listToolButton.at(i)->setEnabled( true ); } if ( accessible == QNetworkAccessManager::NotAccessible ) { listToolButton.at(i)->setEnabled( false ); } } } } bool QvkHelp::eventFilter(QObject *object, QEvent *event) { QToolButton *toolButton = qobject_cast(object); // Automatic language detection is set in combobox for the online help. if ( ( event->type() == QEvent::MouseButtonRelease ) and ( toolButton->isEnabled() == true ) and ( ui->comboBoxOnlineHelp->currentIndex() == 0 ) ) { QString language; if ( ui->comboBoxOnlineHelp->findText( "(" + QLocale::system().name() + ")", Qt::MatchEndsWith ) > -1 ) { language = QLocale::system().name(); } else { language = "en"; } QString vk_helpPath_locale = vk_helpPath + language + "/"; loadHTML( vk_helpPath_locale + object->objectName().section( "_", 1, 1 ) + "/" + object->objectName() + ".html" ); uiHelp->labelURL->setText( vk_helpPath_locale + object->objectName().section( "_", 1, 1 ) + "/" + object->objectName() + ".html" ); return false; } // Selected Language is set in combobox if ( ( event->type() == QEvent::MouseButtonRelease ) and ( toolButton->isEnabled() == true ) and ( ui->comboBoxOnlineHelp->currentIndex() > 0 ) ) { QString language = ui->comboBoxOnlineHelp->currentText().section( "(", 1 ).replace( ")", "" ); QString vk_helpPath_locale = vk_helpPath + language + "/"; loadHTML( vk_helpPath_locale + object->objectName().section( "_", 1, 1 ) + "/" + object->objectName() + ".html" ); uiHelp->labelURL->setText( vk_helpPath_locale + object->objectName().section( "_", 1, 1 ) + "/" + object->objectName() + ".html" ); return false; } else { return QObject::eventFilter( object, event ); } } void QvkHelp::slot_cleanUp() { temporaryDirLocal.remove(); } /* * To first we load the html file ... */ void QvkHelp::loadHTML( QString value ) { QFileInfo fileInfo( value ); remotePath = fileInfo.path(); remoteBasename = fileInfo.baseName(); disconnect( vkDownloadHTML, nullptr, nullptr, nullptr ); connect( vkDownloadHTML, SIGNAL( signal_fileDownloaded( QString ) ), this, SLOT( slot_parseHTML( QString ) ) ); vkDownloadHTML->doDownload( value ); } bool QvkHelp::isFileInLine( QString line ) { bool value = false; for ( int i = 0; i < toDownloadFiles.count(); i++ ) { if ( line.contains( toDownloadFiles.at(i), Qt::CaseInsensitive ) ) { value = true; break; } else { value = false; } } return value; } int QvkHelp::getCountFileToDownload( QString tempPathFileName ) { QFile file( tempPathFileName ); if( !file.open( QIODevice::ReadOnly ) ) { QMessageBox::information( nullptr, "Help error", "QvkHelp::getCountFileToDownload\n" + tempPathFileName + "\n" + file.errorString() ); } int count = 0; QTextStream textStream( &file ); while( !textStream.atEnd() ) { QString line = textStream.readLine(); if ( isFileInLine( line ) ) { count++; } } file.close(); return count; } /* * ... then we parse *.html of files and download all files from remote Url and save local in tmp ... */ void QvkHelp::slot_parseHTML( QString tempPathFileName ) { localFiles.clear(); localFiles << tempPathFileName; QFileInfo fileInfo( tempPathFileName ); QString tmpPath = fileInfo.absolutePath(); QFile file( tempPathFileName ); if( !file.open( QIODevice::ReadOnly ) ) { qDebug().noquote() << global::nameOutput << "QvkHelp::slot_parseHTML" << tempPathFileName << file.errorString(); QMessageBox::information( nullptr, global::name + " " + global::version, "QvkHelp::slot_parseHTML\n" + tempPathFileName + "\n" + file.errorString() ); return; } int countFiles = getCountFileToDownload( tempPathFileName ); int counter = 0; QTextStream textStream( &file ); while( !textStream.atEnd() ) { QString line = textStream.readLine(); if ( isFileInLine( line ) ) { QString fileForHTML = line.section( "\"", 1, 1 ); counter++; if ( counter == countFiles ) { disconnect( vkDownloadFiles, nullptr, nullptr, nullptr ); connect( vkDownloadFiles, SIGNAL( signal_fileDownloaded( QString ) ), this, SLOT( slot_showHelp( QString ) ) ); } vkDownloadFiles->doDownload( remotePath + "/" + fileForHTML ); localFiles << tmpPath + + "/" + fileForHTML; } } if ( counter == 0 ) { // "dummy.png" is a fake, we need this if no file is downlowded slot_showHelp( tmpPath + "/" + "dummy.png"); } file.close(); } /* * ... then we show the html file */ void QvkHelp::slot_showHelp( QString tempPathFileName ) { QDir dir; QString currentdir = dir.currentPath(); QFileInfo fileInfo( tempPathFileName ); QString tmpPath = fileInfo.absolutePath(); dir.setCurrent( tmpPath ); QString htmlFile = tmpPath + "/" + remoteBasename + ".html"; QFile file( htmlFile ); if( !file.open( QIODevice::ReadOnly ) ) { QMessageBox::information( nullptr, "Help error", "QvkHelp::slot_showHelp\n" + tempPathFileName + "\n" + file.errorString() ); } QString value = QString::fromUtf8( file.readAll() ); // Antialiasing for Font QFont font = uiHelp->textBrowser->font(); font.setStyleStrategy( QFont::PreferAntialias ); uiHelp->textBrowser->setFont(font); uiHelp->textBrowser->setText( value ); file.close(); show(); dir.setCurrent( currentdir ); // remove all tmp files for ( int i = 0; i < localFiles.count(); i++ ) { QFile file( localFiles.at( i ) ); file.remove(); } } vokoscreenNG-3.0.2/src/help/QvkHelp.cpp-In-Einer-Datei000066400000000000000000000227741362045215000223560ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkHelp.h" #include "QvkLocale.h" #include "global.h" #include #include #include #include /* * The remote HTML-file and the toolbutton have the same name. * * Example: * QToolbutton -> help_screencast_fullscreen * Remote file -> help_screencast_fullscreen.html * * We write as snake_case, so the underline character is the seperator. * The first section is help, this we need for set for icon and installEventFilter, see constructor. * The second section is the tab in the sidebar and the subdir on remote. * The third section is the name from the function that we want help. * See also QvkHelp::eventFilter(QObject *object, QEvent *event) */ QvkHelp::QvkHelp(QMainWindow *mainWindow, Ui_formMainWindow *ui_mainwindow ) : uiHelp(new(Ui::help)) { connect( mainWindow, SIGNAL( destroyed( QObject*) ), this, SLOT( slot_cleanUp() ) ); ui = ui_mainwindow; uiHelp->setupUi( this ); slot_NetworkAccessibility( networkAccessManager.networkAccessible() ); connect( &networkAccessManager, SIGNAL( networkAccessibleChanged( QNetworkAccessManager::NetworkAccessibility ) ), SLOT( slot_NetworkAccessibility( QNetworkAccessManager::NetworkAccessibility ) ) ); resize( 800, 600 ); setWindowTitle( global::name + " " + global::version + " " + "help" ); QIcon icon; icon.addFile( QString::fromUtf8( ":/pictures/logo/logo.png" ), QSize(), QIcon::Normal, QIcon::Off ); setWindowIcon( icon ); QStringList helpStringList; helpStringList << "http:/" << "vokoscreen.volkoh.de" << "3.0" << "help"; vk_helpPath = helpStringList.join( "/" ).append( "/"); QvkLocale *vkLocale = new QvkLocale(); connect( vkLocale, SIGNAL( signal_locale( QStringList) ), this, SLOT( slot_parse_locale( QStringList ) ) ); vkDownloadHTML = new QvkDownloader( temporaryDirLocal.path() ); vkDownloadFiles = new QvkDownloader( temporaryDirLocal.path() ); QIcon iconHelp = style()->standardIcon( QStyle::SP_MessageBoxInformation ); QList listToolButton = ui->centralWidget->findChildren(); for ( int i = 0; i < listToolButton.count(); i++ ) { if ( listToolButton.at(i)->objectName().contains( QRegExp( "^help_") ) ) { listToolButton.at(i)->setIcon( iconHelp ); listToolButton.at(i)->installEventFilter( this ); } } } QvkHelp::~QvkHelp() { } void QvkHelp::slot_parse_locale( QStringList list ) { QString language; if ( list.contains( QLocale::system().name() ) ) { language = QLocale::system().name(); } else { language = "en"; } vk_helpPath = vk_helpPath + language + "/"; } void QvkHelp::slot_NetworkAccessibility( QNetworkAccessManager::NetworkAccessibility accessible ) { QList listToolButton = ui->centralWidget->findChildren(); for ( int i = 0; i < listToolButton.count(); i++ ) { if ( listToolButton.at(i)->objectName().contains( QRegExp( "^help_") ) ) { if ( accessible == QNetworkAccessManager::Accessible ) { listToolButton.at(i)->setEnabled( true ); } if ( accessible == QNetworkAccessManager::NotAccessible ) { listToolButton.at(i)->setEnabled( false ); } } } } bool QvkHelp::eventFilter(QObject *object, QEvent *event) { QToolButton *toolButton = qobject_cast(object); if ( ( event->type() == QEvent::MouseButtonRelease ) and ( toolButton->isEnabled() == true ) ) { // loadHTML( vk_helpPath + object->objectName().section( "_", 1, 1 ) + "/" + object->objectName() + ".html" ); loadHTML( vk_helpPath + object->objectName().section( "_", 1, 1 ) + "/" + "vokoscreen-version-3-help.xhtml" ); //---------------------- new anchor = object->objectName(); // ----------------- new uiHelp->labelURL->setText( vk_helpPath + object->objectName().section( "_", 1, 1 ) + "/" + object->objectName() + ".html" ); return false; } else { return QObject::eventFilter( object, event ); } } void QvkHelp::slot_cleanUp() { temporaryDirLocal.remove(); } /* * To first we load the html file ... */ void QvkHelp::loadHTML( QString value ) { QFileInfo fileInfo( value ); remotePath = fileInfo.path(); remoteBasename = fileInfo.baseName(); disconnect( vkDownloadHTML, nullptr, nullptr, nullptr ); connect( vkDownloadHTML, SIGNAL( signal_fileDownloaded( QString ) ), this, SLOT( slot_parseHTML( QString ) ) ); vkDownloadHTML->doDownload( value ); } bool QvkHelp::isFileInLine( QString line ) { bool value = false; for ( int i = 0; i < toDownloadFiles.count(); i++ ) { if ( line.contains( toDownloadFiles.at(i), Qt::CaseInsensitive ) ) { value = true; break; } else { value = false; } } return value; } int QvkHelp::getCountFileToDownload( QString tempPathFileName ) { QFile file( tempPathFileName ); if( !file.open( QIODevice::ReadOnly ) ) { QMessageBox::information( nullptr, "Help error", "QvkHelp::getCountFileToDownload\n" + tempPathFileName + "\n" + file.errorString() ); } int count = 0; QTextStream textStream( &file ); while( !textStream.atEnd() ) { QString line = textStream.readLine(); if ( isFileInLine( line ) ) { count++; } } file.close(); return count; } /* * ... then we parse *.html of files and download all files from remote Url and save local in tmp ... */ void QvkHelp::slot_parseHTML( QString tempPathFileName ) { localFiles.clear(); localFiles << tempPathFileName; QFileInfo fileInfo( tempPathFileName ); QString tmpPath = fileInfo.absolutePath(); QFile file( tempPathFileName ); if( !file.open( QIODevice::ReadOnly ) ) { QMessageBox::information( nullptr, "Help error", "No network connection\nQvkHelp::slot_parseHTML\n" + tempPathFileName + "\n" + file.errorString() ); return; } int countFiles = getCountFileToDownload( tempPathFileName ); int counter = 0; QTextStream textStream( &file ); while( !textStream.atEnd() ) { QString line = textStream.readLine(); if ( isFileInLine( line ) ) { QString fileForHTML = line.section( "\"", 1, 1 ); counter++; if ( counter == countFiles ) { disconnect( vkDownloadFiles, nullptr, nullptr, nullptr ); connect( vkDownloadFiles, SIGNAL( signal_fileDownloaded( QString ) ), this, SLOT( slot_showHelp( QString ) ) ); } vkDownloadFiles->doDownload( remotePath + "/" + fileForHTML ); localFiles << tmpPath + + "/" + fileForHTML; } } if ( counter == 0 ) { // "dummy.png" is a fake, we need this if no file is downlowded slot_showHelp( tmpPath + "/" + "dummy.png"); } file.close(); } /* * ... then we show the html file */ void QvkHelp::slot_showHelp( QString tempPathFileName ) { QDir dir; QString currentdir = dir.currentPath(); QFileInfo fileInfo( tempPathFileName ); QString tmpPath = fileInfo.absolutePath(); dir.setCurrent( tmpPath ); QString htmlFile = tmpPath + "/" + remoteBasename + ".xhtml"; QFile file( htmlFile ); if( !file.open( QIODevice::ReadOnly ) ) { QMessageBox::information( nullptr, "Help error", "QvkHelp::slot_showHelp\n" + tempPathFileName + "\n" + file.errorString() ); } QTextStream textStream( &file ); QString value; while ( !textStream.atEnd() ) { QString line = textStream.readLine(); value.append( line ); if ( line.contains( "" ) ) { break; } } while ( !textStream.atEnd() ) { QString line = textStream.readLine(); if ( line.contains( anchor ) ) { value.append( line ); break; } } while ( !textStream.atEnd() ) { QString line = textStream.readLine(); value.append( line ); if ( line.contains( "" ) ) { break; } } // Antialiasing for Font QFont font = uiHelp->textBrowser->font(); font.setStyleStrategy( QFont::PreferAntialias ); uiHelp->textBrowser->setFont(font); uiHelp->textBrowser->setText( value ); file.close(); show(); dir.setCurrent( currentdir ); // remove all tmp files for ( int i = 0; i < localFiles.count(); i++ ) { QFile file( localFiles.at( i ) ); //file.remove(); } } vokoscreenNG-3.0.2/src/help/QvkHelp.h000066400000000000000000000041741362045215000173650ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKHELP_H #define QVKHELP_H #include "ui_formMainWindow.h" #include "ui_help.h" #include "QvkDownloader.h" #include #include #include #include class QvkHelp: public QWidget { Q_OBJECT public: QvkHelp(QMainWindow *mainWindow, Ui_formMainWindow *ui_mainwindow); virtual ~QvkHelp() override; public slots: private: Ui_formMainWindow *ui; Ui_help *uiHelp; QStringList toDownloadFiles = { ".png", ".svg", ".css", ".jpg" }; bool isFileInLine( QString line ); QvkDownloader *vkDownloadHTML; QvkDownloader *vkDownloadFiles; void loadHTML( QString value ); QString remotePath; QString remoteBasename; int getCountFileToDownload( QString tempPathFileName ); QStringList localFiles; QString tempPath; QString vk_helpPath; QTemporaryDir temporaryDirLocal; QNetworkAccessManager networkAccessManager; QString anchor; private slots: void slot_parseHTML( QString tempPathFileName ); void slot_showHelp( QString tempPathFileName ); void slot_cleanUp(); void slot_NetworkAccessibility( QNetworkAccessManager::NetworkAccessibility accessible ); void slot_parse_locale( QStringList list ); protected: bool eventFilter(QObject *object, QEvent *ev) override; signals: }; #endif vokoscreenNG-3.0.2/src/help/QvkLocale.cpp000066400000000000000000000033221362045215000202210ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkLocale.h" #include "global.h" #include QvkLocale::QvkLocale() { vkDownload = new QvkDownloader( temporaryDirLocal.path() ); connect( vkDownload, SIGNAL( signal_fileDownloaded( QString ) ), this, SLOT( slot_parse( QString ) ) ); #ifdef Q_OS_LINUX vkDownload->doDownload( QUrl( "https://vokoscreen.volkoh.de/3.0/help/getLinuxDirs.php" ) ); #endif #ifdef Q_OS_WIN vkDownload->doDownload( QUrl( "https://vokoscreen.volkoh.de/3.0/help/getWindowsDirs.php" ) ); #endif } QvkLocale::~QvkLocale() { } void QvkLocale::slot_parse( QString tempPathFileName ) { QFile file( tempPathFileName ); if( !file.open( QIODevice::ReadOnly ) ) { return; } QTextStream textStream( &file ); while( !textStream.atEnd() ) { localeList << textStream.readLine(); } file.close(); temporaryDirLocal.remove(); emit signal_locale( localeList ); } vokoscreenNG-3.0.2/src/help/QvkLocale.h000066400000000000000000000024641362045215000176740ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKLOCALE_H #define QVKLOCALE_H #include "QvkDownloader.h" #include #include #include class QvkLocale: public QObject { Q_OBJECT public: QvkLocale(); virtual ~QvkLocale() override; public slots: private: QTemporaryDir temporaryDirLocal; QvkDownloader *vkDownload; QStringList localeList; private slots: void slot_parse(QString tempPathFileName ); protected: signals: void signal_locale( QStringList list ); }; #endif vokoscreenNG-3.0.2/src/help/help.pri000066400000000000000000000004411362045215000172770ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkHelp.h \ $$PWD/QvkDownloader.h \ $$PWD/QvkLocale.h SOURCES += $$PWD/QvkHelp.cpp \ $$PWD/QvkDownloader.cpp \ $$PWD/QvkLocale.cpp FORMS += $$PWD/help.ui vokoscreenNG-3.0.2/src/help/help.ui000066400000000000000000000020601362045215000171210ustar00rootroot00000000000000 help 0 0 400 300 Form true TextLabel Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse vokoscreenNG-3.0.2/src/information/000077500000000000000000000000001362045215000172315ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/information/QvkInformation.cpp000066400000000000000000000112411362045215000227030ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkInformation.h" #include "global.h" #include #include #include #include #include QvkInformation::QvkInformation( QMainWindow *mainWindow, Ui_formMainWindow *ui_mainwindow, QvkSpezialSlider *slider_count_down, QvkSpezialSlider *slider_Second_Wait_Before_Recording ) { ui = ui_mainwindow; sliderCountDown = slider_count_down; sliderSecondWaitBeforeRecording = slider_Second_Wait_Before_Recording; connect( mainWindow, SIGNAL( destroyed( QObject* ) ), this, SLOT( slot_cleanup() ) ); ui->labelVideoSize->setText(""); ui->labelFreeSize->setText(""); ui->labelInfoRecordTime->setText("00:00:00"); // VideoSize and FreeDiskSpace timerStorageInfo = new QTimer(this); timerStorageInfo->setTimerType( Qt::PreciseTimer ); timerStorageInfo->setInterval( 1000 ); connect( timerStorageInfo, SIGNAL( timeout() ), this, SLOT( slot_StorageInfo() ) ); timerStorageInfo->start(); // Recorded time elapsedTime = new QTime( 0, 0, 0, 0 ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), this, SLOT( slot_timeFirstStart() ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), this, SLOT( slot_summedTimeAfterPause() ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), this, SLOT( slot_timeContinueStart() ) ); timerRecord = new QTimer(this); timerRecord->setTimerType( Qt::PreciseTimer ); timerRecord->setInterval( 1000 ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), timerRecord, SLOT( start() ) ); connect( timerRecord, SIGNAL( timeout() ), this, SLOT( slot_displayRecordTime() ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), timerRecord, SLOT( stop() ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), timerRecord, SLOT( stop() ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), timerRecord, SLOT( start() ) ); } QvkInformation::~QvkInformation() { } void QvkInformation::slot_cleanup() { timerStorageInfo->stop(); timerRecord->stop(); } void QvkInformation::slot_timeFirstStart() { elapsedTime->restart(); int_summed = 0; ui->labelInfoRecordTime->setText("00:00:00"); } void QvkInformation::slot_summedTimeAfterPause() { int_summed += elapsedTime->elapsed(); } void QvkInformation::slot_timeContinueStart() { elapsedTime->restart(); } void QvkInformation::slot_newVideoFilename( QString filename ) { newVideoFilename = filename; } void QvkInformation::slot_StorageInfo() { QStorageInfo storage = QStorageInfo(ui->lineEditVideoPath->text() ); storage.refresh(); ui->labelFreeSize->setText( QString::number( storage.bytesAvailable()/1024/1024 ) ); QDir dir( ui->lineEditVideoPath->text() ); QStringList filters; filters << newVideoFilename; QStringList videoFileList = dir.entryList( filters, QDir::Files, QDir::Time ); if ( !videoFileList.empty() ) { QString string; string.append( ui->lineEditVideoPath->text() ); string.append( "/" ); string.append( videoFileList.at( 0 ) ); QFileInfo file( string ); file.refresh(); ui->labelVideoSize->setText( QString::number( file.size()/1024 ) ); } } void QvkInformation::slot_displayRecordTime() { if ( ( ui->pushButtonStop->isEnabled() == true ) and ( ui->checkBoxStartTime->checkState() == Qt::Checked ) ) { QTime time( 0, 0, 0, 0 ); ui->labelInfoRecordTime->setText( time.addMSecs( elapsedTime->elapsed() + int_summed ).toString( "hh:mm:ss" ) ); return; } if ( ui->pushButtonStop->isEnabled() == true ) { QTime time( 0, 0, 0, 0 ); ui->labelInfoRecordTime->setText( time.addMSecs( elapsedTime->elapsed() + int_summed - sliderCountDown->value()*1000 - sliderSecondWaitBeforeRecording->value()*1000 ).toString( "hh:mm:ss" ) ); } } vokoscreenNG-3.0.2/src/information/QvkInformation.h000066400000000000000000000033561362045215000223600ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKINFORMATION_H #define QVKINFORMATION_H #include "ui_formMainWindow.h" #include "QvkSpezialSlider.h" #include class QvkInformation: public QWidget { Q_OBJECT public: QvkInformation(QMainWindow *mainWindow, Ui_formMainWindow *ui_mainwindow, QvkSpezialSlider *slider_count_down, QvkSpezialSlider *slider_Second_Wait_Before_Recording ); virtual ~QvkInformation(); public slots: private slots: void slot_cleanup(); void slot_StorageInfo(); void slot_newVideoFilename( QString filename ); void slot_displayRecordTime(); void slot_timeFirstStart(); void slot_timeContinueStart(); void slot_summedTimeAfterPause(); signals: protected: private: Ui_formMainWindow *ui; QString newVideoFilename = ""; QTimer *timerStorageInfo; QTimer *timerRecord; QTime *elapsedTime; int int_summed = 0; QvkSpezialSlider *sliderCountDown; QvkSpezialSlider *sliderSecondWaitBeforeRecording; }; #endif vokoscreenNG-3.0.2/src/information/information.pri000066400000000000000000000002141362045215000222670ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkInformation.h SOURCES += $$PWD/QvkInformation.cpp vokoscreenNG-3.0.2/src/language/000077500000000000000000000000001362045215000164675ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/language/ca.ts000066400000000000000000000357721362045215000174400ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Seleccioneu un o més dispositius QvkAudioWindows Select one or more devices Seleccioneu un o més dispositius QvkCameraController Camera Càmera QvkCameraWindow Switch to Window Alterna a finestra Switch to Fullscreen Alterna a pantalla completa QvkCountdown Countdown Compte enrere QvkHelp Help Ajuda QvkLimitDiskFreeSpace Warning Avís The recording is not started, not enough free disk space. L'enregistrament no s'ha iniciat, no hi ha prou espai lliure al disc. The free disk space limit is reached. S’ha abastat el límit d’espai lliure al disc. Limit of free disk space Límit d'espai lliure al disc Megabyte Megabyte The recording was stopped, not enough free disk space. L'enregistrament s'ha aturat, no hi ha prou espai lliure al disc. QvkMainWindow Fullscreen Pantalla completa Window Finestra No filemanager found. No s’ha trobat cap gestor de fitxers. Please install a filemanager. Instal·leu un gestor de fitxers. Desktop session is a Wayland session La sessió d’escriptori és una sessió de Wayland To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Fins al moment no s'admet el Wayland. Una captura en vídeo mostrarà una pantalla en negre. Si us plau, tanqueu la sessió i iniceu una sessió d'escriptori amb X11. Sourcecode Codi font Homepage Lloc web Translations Traduccions Donate Feu una donació Wayland desktop session detected S'ha detectat una sessió d'escriptori de Wayland QvkPlayer Open File Obre el fitxer QvkRegionChoise Area Àrea QvkSystray Start Inicia Stop Atura Pause Pausa Continue Continua Exit Surt QvkSystrayAlternative Start Inicia Stop Atura Pause Pausa Continue Continua Exit Surt cameraSettingsDialog Dialog Diàleg Flip horizontal Gir horitzontal Flip vertical Gir vertical Invert Invertida Gray Gris Black-and-white Blanc i negre Remove window frame Elimina el marc de la finestra 160x120 160x120 320x240 320x240 Camera settings Ajustaments de la càmera 640x480 640x480 formMainWindow Area Àrea Reset Reinicia Magnification Ampliació Countdown Compte enrere Video size: Mida del vídeo: Free disk space: Espai lliure al disc: Information Informació Record Time: Temps enregistrat: Audio Àudio Frames Fotogrames Videocodec Còdec del vídeo Format Format Audiocodec Còdec de l'àudio Quality Qualitat Scale Escala Do not record mouse cursor No enregistris el cursor del ratolí Hour Hora Minute Minut Start the timer Inicia el temporitzador Stop recording after Atura l'enregistrament després de Hours Hores Minutes Minuts Seconds Segons Videopath Camí del vídeo Limit of free disk space Límit d'espai lliure al disc Show in systray Mostra a la safata del sistema Second wait before recording Segona espera abans d'enregistrar Look for updates Comprova si hi ha actualitzacions Help Ajuda Video Vídeo Available Disponible Not available No disponible Start Inicia Stop Atura Pause Pausa Continue Continua Play Reprodueix Folder Carpeta Camera Càmera Invert Invertida Gray Gris Send Report Envia el registre CTRL+SHIFT+F10 Ctrl+Majús.+F10 CTRL+SHIFT+F11 Ctrl+Majús.+F11 CTRL+SHIFT+F12 Ctrl+Majús.+F12 Play last record Reprodueix el darrer enregistrament Open folder Obre una carpeta CTRL+SHIFT+F8 Ctrl+Majús.+F8 Minimized when recording starts Minimitza en iniciar l'enregistrament Starts minimized Inicia minimitzat Flip horizontal Gir horizontal Flip vertical Gir vertical Black-and-white Blanc i negre Remove window frame Elimina el marc de la finestra Donate Feu una donació Reset all settings at the next start Restableix tots els ajustament al següent inici Copyright and license from pictures Drets d'autor i llicència de les imatges Megabyte Megabyte Screencast Emissió de la pantalla Player Reproductor Log Registre license Copyright and license from pictures Drets d'autor i llicència de les imatges player Play Reprodueix Pause Pausa Stop Atura Open File Obre un fitxer Fullscreen Pantalla completa Previous frame Fotograma anterior Next frame Fotograma següent Mute Silenci Move menu Mou el menú vokoscreenNG-3.0.2/src/language/cs_CZ.ts000066400000000000000000000355161362045215000200520ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Vyberte jedno nebo více zařízení QvkAudioWindows Select one or more devices Vyberte jedno nebo více zařízení QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Přepnout do okna Switch to Fullscreen Přepnout na celou obrazovku QvkCountdown Countdown Odpočítávání QvkHelp Help Nápověda QvkLimitDiskFreeSpace Warning Upozornění The recording is not started, not enough free disk space. Nahrávání nemůže být spuštěno, není dostatek volného místa na disku. The free disk space limit is reached. Je dosaženo limitu volného místa na disku. Limit of free disk space Limit volného místa na disku Megabyte Megabajt The recording was stopped, not enough free disk space. Nahrávání bylo zastaveno, není volné místo na disku. QvkMainWindow Fullscreen Celá obrazovka Window Okno No filemanager found. Nebyl nalezen žádný správce souborů. Please install a filemanager. Prosím o instalaci správce souborů. Desktop session is a Wayland session Desktop session je relace Wayland To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Wayland zatím není podporován. Nahrávka ukazuje černou obrazovku. Odhlaste se a spusťte relaci plochy X11 Sourcecode Zdrojový kód Homepage Domovská stránka Translations Překlad Donate Podpořit Wayland desktop session detected Byla zjištěna relace plochy Wayland QvkPlayer Open File Otevřít soubor QvkRegionChoise Area Výřez QvkSystray Start Start Stop Stop Pause Pauza Continue Pokračovat Exit Odejít QvkSystrayAlternative Start Start Stop Stop Pause Pauza Continue Pokračovat Exit Odejít cameraSettingsDialog Dialog Dialog Flip horizontal Překlopit vodorovně Flip vertical Překlopit svisle Invert Invertovat Gray Šedý Black-and-white Černá a bílá Remove window frame Odstranit rám okna 160x120 160x120 320x240 320x240 Camera settings Nastavení kamery 640x480 640x480 formMainWindow Area Výřez Reset Obnovit Magnification Zvětšení Countdown Odpočítávání Video size: Velikost videa: Free disk space: Volné místo na disku: Information Informace Record Time: Doba záznamu: Audio Zvuk Frames Rámy Videocodec Videokodek Format Formát Audiocodec Audiokodek Quality Kvalita Scale Zvětšení Do not record mouse cursor Nenahrávat kurzor myši Hour Hodina Minute Minuta Start the timer Spustit časovač Stop recording after Ukončit nahrávání po Hours Hodiny Minutes Minuty Seconds Sekundy Videopath Cesta k videosekvenci Limit of free disk space Limit volného místa na disku Show in systray Zobrazit v systémové části panelu Second wait before recording Druhé čekání před nahráváním Look for updates Vyhledat aktualizace Help Nápověda Video Video Available Dostupný Not available Nedostupný Start Start Stop Stop Pause Pauza Continue Pokračovat Play Přehrát Folder Adresář Camera Kamera Invert Invertovat Gray Šedý Send Report Zaslat report CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Přehrát poslední záznam Open folder Otevřít adresář CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Minimalizovat před začátkem nahrávání Starts minimized Spustit minimalizované Flip horizontal Překlopit vodorovně Flip vertical Překlopit svisle Black-and-white Černá a bílá Remove window frame Odstranit rám okna Donate Podpořit Reset all settings at the next start Obnovit všechna nastavení při následujícím spuštění Copyright and license from pictures Autorská práva a licence k obrázkům Megabyte Megabajt Screencast Nahrávka Player Přehrávač Log Logy license Copyright and license from pictures Autorská práva a licence k obrázkům player Play Přehrát Pause Pauza Stop Stop Open File Otevřít soubor Fullscreen Celá obrazovka Previous frame Předchozí okno Next frame Následující okno Mute Ztlumit Move menu Přesunout nabídku vokoscreenNG-3.0.2/src/language/de_AT.ts000066400000000000000000000353111362045215000200160ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Ein oder mehrere Geräte auswählen QvkAudioWindows Select one or more devices Ein oder mehrere Geräte auswählen QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Auf Fenster umschalten Switch to Fullscreen Auf Vollbild umschalten QvkCountdown Countdown Countdown QvkHelp Help Hilfe QvkLimitDiskFreeSpace Warning Warnung The recording is not started, not enough free disk space. Die Aufnahme wird nicht gestartet, nicht genügend freier Speicherplatz. The free disk space limit is reached. Das Limit für den freien Speicherplatz ist erreicht. Limit of free disk space Grenze für freien Plattenplatz Megabyte Megabyte The recording was stopped, not enough free disk space. Die Aufnahme wurde gestoppt, nicht genügend freier Speicherplatz. QvkMainWindow Fullscreen Vollbild Window Fenster No filemanager found. Kein Dateimanager gefunden Please install a filemanager. Bitte installiere einen Dateimanager Desktop session is a Wayland session Desktopsitzung ist eine Waylandsitzung To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Zur Zeit wird Wayland nicht unterstützt. Ein Screencast zeigt einen schwarzen Bildschirm. Bitte melden Sie sich ab und starten Sie eine X11 Desktop-Sitzung Sourcecode Quellcode Homepage Webseite Translations Übersetzungen Donate Spende Wayland desktop session detected Wayland Desktopsitzung erkannt QvkPlayer Open File Öffne Datei QvkRegionChoise Area Bereich QvkSystray Start Start Stop Stop Pause Pause Continue Weiter Exit Verlassen QvkSystrayAlternative Start Start Stop Stop Pause Pause Continue Weiter Exit Verlassen cameraSettingsDialog Dialog Dialog Flip horizontal Horizontal spiegeln Flip vertical Vertikal spiegeln Invert invertiert Gray grau Black-and-white Schwarz-weiß Remove window frame Entferne Fensterrahmen 160x120 160x120 320x240 320*240 Camera settings Kameraeinstellungen 640x480 640x480 formMainWindow Area Bereich Reset Zurücksetzen Magnification Lupe Countdown Countdown Video size: Videogröße: Free disk space: Freier Plattenplatz: Information Information Record Time: Aufnahmezeit Audio Audio Frames Frames Videocodec Videocodec Format Format Audiocodec Audiocodec Quality Qualität Scale Scalieren Do not record mouse cursor Mauscursor nicht aufnehmen Hour Stunde Minute Minute Start the timer Starte den Timer Stop recording after Stoppe Aufnahme nach Hours Stunden Minutes Minuten Seconds Sekunden Videopath Videopfad Limit of free disk space Grenze für freien Plattenplatz Show in systray Im Systray anzeigen Second wait before recording Sekunden vor der Aufnahme warten Look for updates Nach Aktualisierungen suchen Help Hilfe Video Video Available Verfügbar Not available Nicht verfügbar Start Start Stop Stop Pause Pause Continue Weiter Play Play Folder Ordner Camera Kamera Invert invertiert Gray grau Send Report Sende Report CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Letzte Aufnahme abspielen Open folder Ordner öffnen CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Minimiert beim Start der Aufzeichnung Starts minimized Startet minimiert Flip horizontal Horizontal spiegeln Flip vertical Vertikal spiegeln Black-and-white Schwarz-weiß Remove window frame Entferne Fensterrahmen Donate Spende Reset all settings at the next start Alle Einstellungen beim nächsten Start zurücksetzen Copyright and license from pictures Copyright und Lizenz von Bildern Megabyte Megabyte Screencast Screencast Player Player Log Log license Copyright and license from pictures Copyright und Lizenz von Bildern player Play Play Pause Pause Stop Stop Open File Öffne Datei Fullscreen Vollbild Previous frame Vorheriges Bild Next frame Nächstes Bild Mute Stummschaltung Move menu Menü verschieben vokoscreenNG-3.0.2/src/language/de_CH.ts000066400000000000000000000353301362045215000200050ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Ein oder mehrere Geräte auswählen QvkAudioWindows Select one or more devices Ein oder mehrere Geräte auswählen QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Auf Fenster umschalten Switch to Fullscreen Auf Vollbild umschalten QvkCountdown Countdown Countdown QvkHelp Help Hilfe QvkLimitDiskFreeSpace Warning Warnung The recording is not started, not enough free disk space. Die Aufnahme wird nicht gestartet, nicht genügend freier Speicherplatz. The free disk space limit is reached. Das Limit für den freien Speicherplatz ist erreicht. Limit of free disk space Grenze für freien Plattenplatz Megabyte Megabyte The recording was stopped, not enough free disk space. Die Aufnahme wurde gestoppt, nicht genügend freier Speicherplatz. QvkMainWindow Fullscreen Vollbild Window Fenster No filemanager found. Kein Dateimanager gefunden. Please install a filemanager. Bitte installieren Sie einen Dateimanager. Desktop session is a Wayland session Desktop-Sitzung ist eine Wayland-Sitzung To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Zur Zeit wird Wayland nicht unterstützt. Ein Screencast zeigt einen schwarzen Bildschirm. Bitte melden Sie sich ab und starten Sie eine X11 Desktop-Sitzung Sourcecode Quellcode Homepage Webseite Translations Übersetzungen Donate Spende Wayland desktop session detected Wayland-Desktop-Sitzung erkannt QvkPlayer Open File Datei öffnen QvkRegionChoise Area Bereich QvkSystray Start Start Stop Stop Pause Pause Continue Weiter Exit Verlassen QvkSystrayAlternative Start Start Stop Stop Pause Pause Continue Weiter Exit Verlassen cameraSettingsDialog Dialog Dialog Flip horizontal Horizontal spiegeln Flip vertical Vertikal spiegeln Invert invertiert Gray grau Black-and-white Schwarz-Weiß Remove window frame Fensterrahmen entfernen 160x120 160x120 320x240 320x240 Camera settings Kameraeinstellungen 640x480 640x480 formMainWindow Area Bereich Reset Zurücksetzen Magnification Lupe Countdown Countdown Video size: Videogröße: Free disk space: Freier Plattenplatz: Information Information Record Time: Aufnahmezeit: Audio Audio Frames Frames Videocodec Videocodec Format Format Audiocodec Audiocodec Quality Qualität Scale Skalieren Do not record mouse cursor Mauszeiger nicht aufnehmen Hour Stunde Minute Minute Start the timer Timer starten Stop recording after Aufnahme stoppen nach Hours Stunden Minutes Minuten Seconds Sekunden Videopath Videopfad Limit of free disk space Grenze für freien Plattenplatz Show in systray Im Systray anzeigen Second wait before recording Sekunden vor der Aufnahme warten Look for updates Nach Aktualisierungen suchen Help Hilfe Video Video Available Verfügbar Not available Nicht verfügbar Start Start Stop Stop Pause Pause Continue Weiter Play Play Folder Ordner Camera Kamera Invert invertiert Gray grau Send Report Bericht senden CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Letzte Aufnahme abspielen Open folder Ordner öffnen CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Minimiert beim Start der Aufzeichnung Starts minimized Startet minimiert Flip horizontal Horizontal spiegeln Flip vertical Vertikal spiegeln Black-and-white Schwarz-Weiß Remove window frame Fensterrahmen entfernen Donate Spende Reset all settings at the next start Alle Einstellungen beim nächsten Start zurücksetzen Copyright and license from pictures Copyright und Lizenz von Bildern Megabyte Megabyte Screencast Screencast Player Player Log Log license Copyright and license from pictures Copyright und Lizenz von Bildern player Play Play Pause Pause Stop Stop Open File Datei öffnen Fullscreen Vollbild Previous frame Vorheriges Bild Next frame Nächstes Bild Mute Stummschaltung Move menu Menü verschieben vokoscreenNG-3.0.2/src/language/de_DE.ts000066400000000000000000000353771362045215000200160ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Ein oder mehrere Geräte auswählen QvkAudioWindows Select one or more devices Ein oder mehrere Geräte auswählen QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Auf Fenster umschalten Switch to Fullscreen Auf Vollbild umschalten QvkCountdown Countdown Countdown QvkHelp Help Hilfe QvkLimitDiskFreeSpace Warning Warnung The recording is not started, not enough free disk space. Die Aufnahme wird nicht gestartet, nicht genügend freier Speicherplatz. The free disk space limit is reached. Das Limit für den freien Speicherplatz ist erreicht. Limit of free disk space Grenze für freien Plattenplatz Megabyte Megabyte The recording was stopped, not enough free disk space. Die Aufnahme wurde gestoppt, nicht genügend freier Speicherplatz. QvkMainWindow Fullscreen Vollbild Window Fenster No filemanager found. Kein Dateimanager gefunden. Please install a filemanager. Bitte installieren Sie einen Dateimanager. Desktop session is a Wayland session Desktop-Sitzung ist eine Wayland-Sitzung To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Zur Zeit wird Wayland nicht unterstützt. Ein Screencast zeigt einen schwarzen Bildschirm. Bitte melden Sie sich ab und starten Sie eine X11 Desktop-Sitzung Sourcecode Quellcode Homepage Webseite Translations Übersetzungen Donate Spenden Wayland desktop session detected Wayland-Desktop-Sitzung erkannt QvkPlayer Open File Datei öffnen QvkRegionChoise Area Bereich QvkSystray Start Start Stop Stop Pause Pause Continue Weiter Exit Beenden QvkSystrayAlternative Start Start Stop Stop Pause Pause Continue Weiter Exit Beenden cameraSettingsDialog Dialog Dialog Flip horizontal Horizontal spiegeln Flip vertical Vertikal spiegeln Invert invertiert Gray grau Black-and-white Schwarz-Weiß Remove window frame Fensterrahmen entfernen 160x120 160x120 320x240 320x240 Camera settings Kameraeinstellungen 640x480 640x480 formMainWindow Area Bereich Reset Zurücksetzen Magnification Lupe Countdown Countdown Video size: Videogröße: Free disk space: Freier Plattenplatz: Information Information Record Time: Aufnahmezeit: Audio Audio Frames Bilder Videocodec Videocodec Format Format Audiocodec Audiocodec Quality Qualität Scale Skalieren Do not record mouse cursor Mauszeiger nicht aufnehmen Hour Stunde Minute Minute Start the timer Timer starten Stop recording after Aufnahme stoppen nach Hours Stunden Minutes Minuten Seconds Sekunden Videopath Videopfad Limit of free disk space Grenze für freien Plattenplatz Show in systray Im Benachrichtigungsfeld anzeigen Second wait before recording Sekunden vor der Aufnahme warten Look for updates Nach Aktualisierungen suchen Help Hilfe Video Video Available Verfügbar Not available Nicht verfügbar Start Start Stop Stop Pause Pause Continue Weiter Play Play Folder Ordner Camera Kamera Invert invertiert Gray grau Send Report Bericht senden CTRL+SHIFT+F10 STRG+UMSCHALT+F10 CTRL+SHIFT+F11 STRG+UMSCHALT+F11 CTRL+SHIFT+F12 STRG+UMSCHALT+F12 Play last record Letzte Aufnahme abspielen Open folder Ordner öffnen CTRL+SHIFT+F8 STRG+UMSCHALT+F8 Minimized when recording starts Minimiert beim Start der Aufzeichnung Starts minimized Startet minimiert Flip horizontal Horizontal spiegeln Flip vertical Vertikal spiegeln Black-and-white Schwarzweiß Remove window frame Fensterrahmen entfernen Donate Spenden Reset all settings at the next start Alle Einstellungen beim nächsten Start zurücksetzen Copyright and license from pictures Copyright und Lizenz von Bildern Megabyte Megabyte Screencast Bildschirmmitschnitt Player Player Log Protokoll license Copyright and license from pictures Copyright und Lizenz von Bildern player Play Play Pause Pause Stop Stop Open File Datei öffnen Fullscreen Vollbild Previous frame Vorheriges Bild Next frame Nächstes Bild Mute Stummschaltung Move menu Menü verschieben vokoscreenNG-3.0.2/src/language/es.ts000066400000000000000000000357011362045215000174540ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Seleccione uno o más dispositivos QvkAudioWindows Select one or more devices Seleccione uno o más dispositivos QvkCameraController Camera Cámara QvkCameraWindow Switch to Window Cambiar a ventana Switch to Fullscreen Ir a pantalla completa QvkCountdown Countdown Cuenta regresiva QvkHelp Help Ayuda QvkLimitDiskFreeSpace Warning Atención The recording is not started, not enough free disk space. La grabación no empieza por insuficiencia de espacio en disco The free disk space limit is reached. No queda espacio libre en disco Limit of free disk space Límite de espacio libre en disco   Megabyte Megabyte The recording was stopped, not enough free disk space. Paró la grabación, no queda espacio en disco QvkMainWindow Fullscreen Pantalla completa Window Ventana No filemanager found. No se encontró ningún gestor de archivos. Please install a filemanager. Instale un gestor de archivos. Desktop session is a Wayland session La sesión de escritorio es Wayland To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session En este momento no se admite Wayland. Las grabaciones no mostrarán más que una pantalla negra. Finalice la sesión y acceda a una sesión de X11. Sourcecode Código fuente Homepage Sitio web Translations Traducciones Donate Donar Wayland desktop session detected Sesión de escritorio Wayland detectada QvkPlayer Open File Abrir archivo QvkRegionChoise Area Área QvkSystray Start Iniciar Stop Detener Pause Pausar Continue Continuar Exit Salir QvkSystrayAlternative Start Iniciar Stop Detener Pause Pausar Continue Continuar Exit Salir cameraSettingsDialog Dialog Cuadro de diálogo Flip horizontal Voltear horizontalmente Flip vertical Voltear verticalmente Invert Invertir Gray Gris Black-and-white Blanco y negro Remove window frame Quitar marco de ventana 160x120 160 × 120 320x240 320 × 240 Camera settings Configuración de cámara 640x480 640 × 480 formMainWindow Area Área Reset Restablecer Magnification Ampliación Countdown Cuenta regresiva Video size: Tamaño de vídeo: Free disk space: Espacio en disco disponible: Information Información Record Time: Tiempo de grabación: Audio Sonido Frames Fotogramas Videocodec Códec de vídeo Format Formato Audiocodec Códec de audio Quality Calidad Scale Escala Do not record mouse cursor No grabar el puntero del ratón Hour Hora Minute Minuto Start the timer Iniciar temporizador Stop recording after Dejar de grabar tras Hours Horas Minutes Minutos Seconds Segundos Videopath Ruta del vídeo Limit of free disk space Límite de espacio libre en disco   Show in systray Mostrar en bandeja del sistema Second wait before recording Segunda espera antes de grabar Look for updates Buscar actualizaciones Help Ayuda Video Vídeos Available Disponible Not available No disponible Start Iniciar Stop Detener Pause Pausar Continue Continuar Play Reproducir Folder Carpeta Camera Cámara Invert Invertir Gray Gris Send Report Enviar informe CTRL+SHIFT+F10 Ctrl + Mayús + F10 CTRL+SHIFT+F11 Ctrl + Mayús + F11 CTRL+SHIFT+F12 Ctrl + Mayús + F12 Play last record Reproducir última grabación Open folder Abrir carpeta CTRL+SHIFT+F8 Ctrl + Mayús + F8 Minimized when recording starts Minimizar al empezar grabación Starts minimized Empezar aplicación minimizada Flip horizontal Voltear horizontalmente Flip vertical Voltear verticalmente Black-and-white Blanco y negro Remove window frame Quitar marco de ventana Donate Donar Reset all settings at the next start Restablecer todas las preferencias en el próximo inicio Copyright and license from pictures Derechos de autor y licencia desde imágenes Megabyte Megabyte Screencast Grabación de pantalla Player Reproductor Log Registro license Copyright and license from pictures Derechos de autor y licencia desde imágenes player Play Reproducir Pause Pausar Stop Detener Open File Abrir archivo Fullscreen Pantalla completa Previous frame Fotograma anterior Next frame Fotograma siguiente Mute Silenciar Move menu Mover el menú vokoscreenNG-3.0.2/src/language/fi_FI.ts000066400000000000000000000353101362045215000200150ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Valitse yksi tai useampi laite QvkAudioWindows Select one or more devices Valitse yksi tai useampi laite QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Vaihda ikkunaan Switch to Fullscreen Vaihda koko näyttöön QvkCountdown Countdown Lähtölaskenta QvkHelp Help Ohje QvkLimitDiskFreeSpace Warning Varoitus The recording is not started, not enough free disk space. Tallennusta ei käynnistetä, ei ole riittävästi vapaata levytilaa. The free disk space limit is reached. Vapaan levytilan raja on saavutettu. Limit of free disk space Vapaan levytilan raja Megabyte Megatavu The recording was stopped, not enough free disk space. Tallennus pysäytettiin, ei tarpeeksi vapaata levytilaa. QvkMainWindow Fullscreen Koko näyttö Window Ikkuna No filemanager found. Ei tiedostohallintaa. Please install a filemanager. Asenna tiedostonhallinta. Desktop session is a Wayland session Työpöytä on Wayland-istunnossa To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Tällä hetkellä Waylandia ei tueta ja tallennus näyttää mustan näytön. Kirjaudu ulos ja aloita X11-työpöytäistunto Sourcecode Lähdekoodi Homepage Kotisivu Translations Käännökset Donate Lahjoita Wayland desktop session detected Wayland-työpöytäistunto havaittiin QvkPlayer Open File Avaa tiedosto QvkRegionChoise Area Alue QvkSystray Start Aloita Stop Lopeta Pause Tauko Continue Jatka Exit Poistu QvkSystrayAlternative Start Aloita Stop Lopeta Pause Tauko Continue Jatka Exit Poistu cameraSettingsDialog Dialog Valintaikkuna Flip horizontal Käännä vaakasuunnassa Flip vertical Käännä pystysuunnassa Invert Käänteinen Gray Harmaa Black-and-white Mustavalkoinen Remove window frame Poista ikkunakehys 160x120 160x120 320x240 320x240 Camera settings Kameran asetukset 640x480 640x480 formMainWindow Area Alue Reset Nollaa Magnification Suurennus Countdown Lähtölaskenta Video size: Videon koko: Free disk space: Vapaa levytila: Information Tietoja Record Time: Tallennusaika: Audio Ääni Frames Ruutuja Videocodec Videokoodekki Format Tallennusmuoto Audiocodec Audiokoodekki Quality Laatu Scale Skaalaa Do not record mouse cursor Älä tallenna hiiren osoitinta Hour Tunti Minute Minuutti Start the timer Käynnistä ajastin Stop recording after Pysäytä tallennus tämän jälkeen Hours Tuntia Minutes Minuuttia Seconds Sekuntia Videopath Videon polku Limit of free disk space Vapaan levytilan raja Show in systray Näytä ilmoitusalueella Second wait before recording Sekuntia odotusta ennen tallennusta Look for updates Tarkista päivitykset Help Ohje Video Video Available Käytettävissä Not available Ei käytettävissä Start Aloita Stop Lopeta Pause Tauko Continue Jatka Play Toista Folder Kansio Camera Kamera Invert Käänteinen Gray Harmaa Send Report Lähetä raportti CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Toista viimeisin tallennus Open folder Avaa kansio CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Pienennä kun tallennus alkaa Starts minimized Käynnistä pienennettynä Flip horizontal Käännä vaakasuunnassa Flip vertical Käännä pystysuunnassa Black-and-white Mustavalkoinen Remove window frame Poista ikkunakehys Donate Lahjoita Reset all settings at the next start Nollaa kaikki asetukset seuraavalla käynnistyksellä Copyright and license from pictures Tekijänoikeudet ja lisenssit kuvista Megabyte Megatavu Screencast Näyttötallenne Player Toistin Log Loki license Copyright and license from pictures Tekijänoikeudet ja lisenssit kuvista player Play Toista Pause Tauko Stop Lopeta Open File Avaa tiedosto Fullscreen Koko näyttö Previous frame Edellinen kehys Next frame Seuraava kehys Mute Mykistä Move menu Siirrä valikko vokoscreenNG-3.0.2/src/language/fr_FR.ts000066400000000000000000000363341362045215000200460ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Sélectionnez un ou plusieurs fichiers QvkAudioWindows Select one or more devices Sélectionnez un ou plusieurs fichiers QvkCameraController Camera Caméra QvkCameraWindow Switch to Window Basculez vers la fenêtre Switch to Fullscreen Mode plein écran QvkCountdown Countdown Compte à rebours QvkHelp Help Aide QvkLimitDiskFreeSpace Warning Attention, danger ! The recording is not started, not enough free disk space. L'enregistrement n'a pas démarré car il n' y a pas assez d'espace libre sur le disque de destination. The free disk space limit is reached. La limite d'espace disque libre est atteinte. Limit of free disk space Limite d'espace disque libre Megabyte Megabyte The recording was stopped, not enough free disk space. L'enregistrement s'est arrêté car il n'y a pas assez d'espace libre sur le disque de destination. QvkMainWindow Fullscreen Plein écran Window Fenêtre No filemanager found. Aucun gestionnaire de fichiers trouvé. Please install a filemanager. Veuillez installer un gestionnaire de fichiers. Desktop session is a Wayland session La session en cours est une session Wayland To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Wayland n'est pas encore pris en charge. Un screencast montre un écran noir. Veuillez vous déconnecter et démarrer une session X11. Sourcecode Code source Homepage Page d'accueil Translations Traductions Donate Faire un don Wayland desktop session detected Session Wayland detectée QvkPlayer Open File Ouvrir fichier QvkRegionChoise Area Zone QvkSystray Start Démarrer Stop Arrêter Pause Pause Continue Continuer Exit Sortir QvkSystrayAlternative Start Démarrer Stop Arrêter Pause Pause Continue Continuer Exit Sortir cameraSettingsDialog Dialog Dialogue Flip horizontal Retourner horizontalement Flip vertical Retourner verticalement Invert Inverser Gray Gris Black-and-white Noir-et-blanc Remove window frame Supprimer le cadre de la fenêtre 160x120 160x120 320x240 320x240 Camera settings Configuration caméra 640x480 640x480 formMainWindow Area Définir une zone manuellement Reset Remettre à zéro les réglages Magnification Agrandissement Countdown Compte à rebours Video size: Taille video: Free disk space: Espace disque libre: Information Information Record Time: Temps enregistré: Audio Audio Frames Images Videocodec Codec vidéo Format Format Audiocodec Codec audio Quality Qualité Scale Échelle Do not record mouse cursor Ne pas enregistrer le curseur de la souris Hour Heure Minute Minute Start the timer Démarrer le chronomètre Stop recording after Arrêter l'enregistrement après Hours Heures Minutes Minutes Seconds Secondes Videopath Chemin d'enregistrement de la vidéo Limit of free disk space Limite d'espace disque libre Show in systray Afficher dans la zone de notification Second wait before recording Secondes d'attentes avant le début d'enregistrement Look for updates Rechercher des mises à jour du logiciel Help Aide Video Vidéo Available Disponible Not available Indisponible Start Démarrer Stop Arrêter Pause Pause Continue Continuer Play Lire Folder Dossier Camera Caméra Invert Inverser Gray Gris Send Report Envoyer un Rapport CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Jouer le dernier enregistrement Open folder Ouvrir dossier CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Minimisé à l'enregistrement Starts minimized Minimisé à l'exécution Flip horizontal Retourner horizontalement Flip vertical Retourner verticalement Black-and-white Noir-et-blanc Remove window frame Supprimer le cadre de la fenêtre Donate Faire un don Reset all settings at the next start Remise à zéro de tous les paramètres au prochain redémarrage du logiciel. Copyright and license from pictures Copyright et licence de la vidéo Megabyte Megabyte Screencast Enregistrement de ce qui se passe à l'écran Player Lecteur Log Se connecter license Copyright and license from pictures Copyright et licence de la vidéo player Play Lire Pause Pause Stop Arrêter Open File Ouvrir fichier Fullscreen Plein écran Previous frame Cadre précédent Next frame Cadre suivant Mute Muet Move menu Déplacer le menu vokoscreenNG-3.0.2/src/language/hu.ts000066400000000000000000000360541362045215000174630ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Válasszon ki egy vagy több eszközt QvkAudioWindows Select one or more devices Válasszon ki egy vagy több eszközt QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Váltás ablakra Switch to Fullscreen Váltás teljes képernyőre QvkCountdown Countdown Visszaszámlálás QvkHelp Help Súgó QvkLimitDiskFreeSpace Warning Figyelmeztetés The recording is not started, not enough free disk space. A rögzítés nem indult el, nincs elég szabad lemezterület. The free disk space limit is reached. A szabad lemezterület korlátja elérve. Limit of free disk space Szabad lemezterület korlátja Megabyte Megabyte The recording was stopped, not enough free disk space. A rögzítés leállt, nincs elég szabad lemezterület. QvkMainWindow Fullscreen Teljes képernyő Window Ablak No filemanager found. Nem található fájlkezelő. Please install a filemanager. Telepítsen egy fájlkezelőt. Desktop session is a Wayland session Az asztali munkamenet egy Wayland munkamenet To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Az időhöz a Wayland nem támogatott. A képernyőrögzítés fekete képernyőt jelenít meg. Jelentkezzen ki, és indítson egy X11 asztali munkamenetet. Sourcecode Forráskód Homepage Honlap Translations Fordítások Donate Adományozás Wayland desktop session detected Wayland asztali munkamenet észlelhető QvkPlayer Open File Fájl megnyitása QvkRegionChoise Area Terület QvkSystray Start Indítás Stop Leállítás Pause Szüneteltetés Continue Folytatás Exit Kilépés QvkSystrayAlternative Start Indítás Stop Leállítás Pause Szüneteltetés Continue Folytatás Exit Kilépés cameraSettingsDialog Dialog Párbeszédablak Flip horizontal Vízszintes tükrözés Flip vertical Függőleges tükrözés Invert Megfordítás Gray Szürke Black-and-white Fekete-fehér Remove window frame Ablakkeret eltávolítása 160x120 160x120 320x240 320x240 Camera settings Kamera beállításai 640x480 640x480 formMainWindow Area Terület Reset Visszaállítás Magnification Nagyítás Countdown Visszaszámlálás Video size: Videóméret: Free disk space: Szabad lemezterület: Information Információ Record Time: Rögzítés ideje: Audio Hang Frames Képkockák Videocodec Videokodek Format Formátum Audiocodec Hangkodek Quality Minőség Scale Méretezés Do not record mouse cursor Ne rögzítse az egérmutatót Hour Óra Minute Perc Start the timer Az időzítő indítása Stop recording after Rögzítés leállítása ez után: Hours Óra Minutes Perc Seconds Másodperc Videopath Videó útvonala Limit of free disk space Szabad lemezterület korlátja Show in systray Megjelenítés a tálcán Second wait before recording Másodperc várakozás a rögzítés előtt Look for updates Frissítések keresése Help Súgó Video Videó Available Elérhető Not available Nem érhető el Start Indítás Stop Leállítás Pause Szüneteltetés Continue Folytatás Play Lejátszás Folder Mappa Camera Kamera Invert Megfordítás Gray Szürke Send Report Jelentés küldése CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Utolsó rögzítés lejátszása Open folder Mappa megnyitása CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Minimalizálás a rögzítés indulásakor Starts minimized Indítás minimalizálva Flip horizontal Vízszintes tükrözés Flip vertical Függőleges tükrözés Black-and-white Fekete-fehér Remove window frame Ablakkeret eltávolítása Donate Adományozás Reset all settings at the next start Összes beállítás visszaállítása a következő indításnál Copyright and license from pictures Fényképek szerzői joga és engedélye Megabyte Megabyte Screencast Képernyőrögzítés Player Lejátszó Log Napló license Copyright and license from pictures Fényképek szerzői joga és engedélye player Play Lejátszás Pause Szüneteltetés Stop Leállítás Open File Fájl megnyitása Fullscreen Teljes képernyő Previous frame Előző képkocka Next frame Következő képkocka Mute Némítás Move menu Menü áthelyezése vokoscreenNG-3.0.2/src/language/id.ts000066400000000000000000000352571362045215000174470ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Pilih satu atau lebih perangkat QvkAudioWindows Select one or more devices Pilih satu atau lebih perangkat QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Pindah ke Jendela Switch to Fullscreen Pindah ke Layar Penuh QvkCountdown Countdown Hitung mundur QvkHelp Help Bantuan QvkLimitDiskFreeSpace Warning Peringatan The recording is not started, not enough free disk space. Perekaman belum berjalan, ruang bebas diska tidak cukup. The free disk space limit is reached. Batas ruang bebas diska tercapai. Limit of free disk space Batas dari ruang bebas diska Megabyte Megabyte The recording was stopped, not enough free disk space. Perekaman telah dihentikan, ruang bebas diska tidak cukup. QvkMainWindow Fullscreen Layar penuh Window Jendela No filemanager found. Manajer erkas tidak ditemukan Please install a filemanager. Mohon pasang sebuah manajer berkas Desktop session is a Wayland session Sesi desktop adalah sebuah sesi Wayland To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session To time Wayland tidak didukung. Sebuah layar akan menampilkan layar hitam. Mohon keluar dan jalankan sesi Dekstop X11. Sourcecode Kode sumber Homepage Halaman muka Translations Terjemahan Donate Donasi Wayland desktop session detected Sesi desktop Wayland terdeteksi QvkPlayer Open File Buka Berkas QvkRegionChoise Area Daerah QvkSystray Start Mulai Stop Berhenti Pause Tangguhkan Continue Lanjut Exit Keluar QvkSystrayAlternative Start Mulai Stop Berhenti Pause Tangguhkan Continue Lanjut Exit Keluar cameraSettingsDialog Dialog Dialog Flip horizontal Putar ke arah horizontal Flip vertical Putar ke arah vertikal Invert Balikan Gray Abu - abu Black-and-white Hitam-dan-putih Remove window frame Hilangkan bingkai jendela 160x120 160x120 320x240 320x240 Camera settings Pengaturan Kamera 640x480 640x480 formMainWindow Area Daerah Reset Atur ulang Magnification Pembesaran Countdown Hitung mundur Video size: Ukuran video: Free disk space: Ruang bebas diska: Information Informasi: Record Time: Waktu Rekam: Audio Audio Frames Frame Videocodec Kodekvideo Format Format Audiocodec Kodekaudio Quality Kualitas Scale Skala Do not record mouse cursor Jangan rekam kursor tetikus Hour Jam Minute Menit Start the timer Mulai pengatur waktu Stop recording after Hentikan rekaman setelah Hours Jam - Jam Minutes Menit Seconds Detik Videopath Jalur video Limit of free disk space Batas dari ruang bebas diska Show in systray Tampilkan dalam baki sistem Second wait before recording Detik menunggu sebelum merekam Look for updates Memeriksa perubahan Help Bantuan Video Video Available Tersedia Not available Tidak tersedia Start Mulai Stop Berhenti Pause Tangguhkan Continue Lanjut Play Putar Folder Folder Camera Kamera Invert Balikan Gray Abu - abu Send Report Kirim Laporan CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Putar rekaman terakhir Open folder Buka folder CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Kecilkan ketika rekaman dimulai Starts minimized Mulai mengecilkan Flip horizontal Putar ke arah horizontal Flip vertical Putar ke arah vertikal Black-and-white Hitam-dan-putih Remove window frame Hilangkan bingkai jendela Donate Donasi Reset all settings at the next start Atur ulang semua pengaturan pada mulai berikutnya Copyright and license from pictures Hak cipta dan lisensi dari gambar - gambar Megabyte Megabyte Screencast RekamLayar Player Pemutar Log CtatanLog license Copyright and license from pictures Hak cipta dan lisensi dari gambar - gambar player Play Putar Pause Tangguhkan Stop Berhenti Open File Buka Berkas Fullscreen Layar penuh Previous frame Bingkai sebelumnya Next frame Bingkai berikutnya Mute Bisu Move menu Pindah menu vokoscreenNG-3.0.2/src/language/it_IT.ts000066400000000000000000000355451362045215000200630ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Seleziona uno o più dispositivi QvkAudioWindows Select one or more devices Seleziona uno o più dispositivi QvkCameraController Camera Webcam QvkCameraWindow Switch to Window Modalità finestra Switch to Fullscreen Modalità schermo intero QvkCountdown Countdown Ritarda avvio QvkHelp Help Aiuto QvkLimitDiskFreeSpace Warning Attenzione The recording is not started, not enough free disk space. La registrazione non è partita, spazio disco insufficiente The free disk space limit is reached. Limite spazio disco libero raggiunto Limit of free disk space Limite di spazio disco libero Megabyte Megabyte The recording was stopped, not enough free disk space. Registrazione interrotta, spazio disco insufficiente QvkMainWindow Fullscreen Schermo intero Window Finestra No filemanager found. Filemanager non trovato Please install a filemanager. Si prega di installare un filemanager Desktop session is a Wayland session La sessione desktop é una sessione "Wayland" To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Al momento "Wayland" non é supportato. Lo screencast mostra una schermata nera. SI prega di eseguire un logout e avviare una sessione desktop X11 Sourcecode Codice sorgente Homepage Pagina iniziale Translations Traduzioni Donate Fai una donazione Wayland desktop session detected Sessione "Wayland" rilevata QvkPlayer Open File Apri file QvkRegionChoise Area Area QvkSystray Start Avvia Stop Ferma Pause Pausa Continue Continua Exit Esci QvkSystrayAlternative Start Avvia Stop Ferma Pause Pausa Continue Continua Exit Esci cameraSettingsDialog Dialog Finestra di dialogo Impostazioni fotocamera Flip horizontal Ribalta orizzontalmente Flip vertical Ribalta verticalmente Invert Inverti Gray Grigio Black-and-white Bianco e nero Remove window frame Rimuovi bordo finestra 160x120 160x120 320x240 320x240 Camera settings Impostazioni camera 640x480 640x480 formMainWindow Area Area Reset Ripristina Magnification Ingrandimento Countdown Ritarda avvio Video size: Dimensioni video: Free disk space: Spazio disco libero: Information Informazione Record Time: Ora di registrazione: Audio Audio Frames Fotogrammi Videocodec Codificatore video Format Formato Audiocodec Codificatore audio Quality Qualità Scale Scala Do not record mouse cursor Non registrare il cursore del mouse Hour Ora Minute Minuto Start the timer Avvia il timer Stop recording after Ferma la registrazione dopo Hours Ore Minutes Minuti Seconds Secondi Videopath Salva in Limit of free disk space Limite di spazio disco libero Show in systray Mostra nel vassoio di sistema Second wait before recording Secondi di attesa prima di registrare Look for updates Cerca aggiornamenti Help Aiuto Video Video Available Disponibile Not available Non disponibile Start Avvia Stop Ferma Pause Pausa Continue Continua Play Riproduci Folder Cartella Camera Webcam Invert Inverti Gray Grigio Send Report Invia segnalazione CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Riproduci ultima registrazione Open folder Apri cartella CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Minimizza all'attivazione della registrazione Starts minimized Avvia minimizzato Flip horizontal Ribalta orizzontalmente Flip vertical Ribalta verticalmente Black-and-white Bianco e nero Remove window frame Rimuovi bordo finestra Donate Fai una donazione Reset all settings at the next start Ripristina tutte le impostazioni al prossimo avvio Copyright and license from pictures Copyright e licenza immagini Megabyte Megabyte Screencast Trasmissione schermo Player Lettore Log Registro license Copyright and license from pictures Copyright e licenza immagini player Play Riproduci Pause Pausa Stop Ferma Open File Apri file Fullscreen Schermo intero Previous frame Fermo immagine precedente Next frame Fermo immagine successivo Mute Silenzioso Move menu Sposta menu vokoscreenNG-3.0.2/src/language/lt.ts000066400000000000000000000355621362045215000174710ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Pasirinkite vieną ar daugiau įrenginių QvkAudioWindows Select one or more devices Pasirinkite vieną ar daugiau įrenginių QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Perjungti į langą Switch to Fullscreen Perjungti į visą ekraną QvkCountdown Countdown Atvirkštinis skaičiavimas QvkHelp Help Žinynas QvkLimitDiskFreeSpace Warning Įspėjimas The recording is not started, not enough free disk space. Įrašinėjimas nepradėtas, trūksta laisvos vietos diske. The free disk space limit is reached. Yra pasiekta laisvos vietos diske riba. Limit of free disk space Laisvos vietos diske apribojimas Megabyte Megabaitų The recording was stopped, not enough free disk space. Įrašinėjimas buvo sustabdytas, trūksta laisvos vietos diske. QvkMainWindow Fullscreen Visas ekranas Window Langas No filemanager found. Nerasta jokios failų tvarkytuvės. Please install a filemanager. Įdiekite failų tvarkytuvę. Desktop session is a Wayland session Darbalaukio seansas yra Wayland seansas To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Šiuo metu Wayland nėra palaikomas. Ekrano įrašas rodys juodą ekraną. Atsijunkite ir paleiskite X11 darbalaukio seansą Sourcecode Pirminis kodas Homepage Svetainė Translations Vertimai Donate Paaukoti Wayland desktop session detected Aptiktas Wayland darbalaukio seansas QvkPlayer Open File Atverti failą QvkRegionChoise Area Sritis QvkSystray Start Pradėti Stop Stabdyti Pause Pristabdyti Continue Tęsti Exit Išeiti QvkSystrayAlternative Start Pradėti Stop Stabdyti Pause Pristabdyti Continue Tęsti Exit Išeiti cameraSettingsDialog Dialog Dialogas Flip horizontal Apversti horizontaliai Flip vertical Apversti vertikaliai Invert Invertuoti Gray Pilka Black-and-white Juoda ir balta Remove window frame Šalinti lango rėmelį 160x120 160x120 320x240 320x240 Camera settings Kameros nustatymai 640x480 640x480 formMainWindow Area Sritis Reset Atstatyti Magnification Didinimas Countdown Atvirkštinis skaičiavimas Video size: Vaizdo dydis: Free disk space: Laisva vieta diske: Information Informacija Record Time: Įrašinėjimo laikas: Audio Garsas Frames Kadrai Videocodec Vaizdo kodekas Format Formatas Audiocodec Garso kodekas Quality Kokybė Scale Mastelis Do not record mouse cursor Neįrašinėti pelės žymeklio Hour Val. Minute Min. Start the timer Paleisti laikmatį Stop recording after Stabdyti įrašinėjimą po Hours Val. Minutes Min. Seconds Sek. Videopath Vaizdo įrašo kelias Limit of free disk space Laisvos vietos diske apribojimas Show in systray Rodyti sistemos dėkle Second wait before recording Luktelėti sekundėlę prieš įrašinėjant Look for updates Tikrinti ar yra atnaujinimų Help Žinynas Video Vaizdas Available Prieinama Not available Neprieinama Start Pradėti Stop Stabdyti Pause Pristabdyti Continue Tęsti Play Groti Folder Aplankas Camera Kamera Invert Invertuoti Gray Pilka Send Report Siųsti ataskaitą CTRL+SHIFT+F10 VALD+LYG2+F10 CTRL+SHIFT+F11 VALD+LYG2+F11 CTRL+SHIFT+F12 VALD+LYG2+F12 Play last record Groti paskiausią įrašą Open folder Atverti aplanką CTRL+SHIFT+F8 VALD+LYG2+F8 Minimized when recording starts Prasidėjus įrašinėjimui, suskleisti Starts minimized Pasileidžia suskleista Flip horizontal Apversti horizontaliai Flip vertical Apversti vertikaliai Black-and-white Juoda ir balta Remove window frame Šalinti lango rėmelį Donate Paaukoti Reset all settings at the next start Kito paleidimo metu atstatyti visus nustatymus Copyright and license from pictures Autorių teisės ir licencijos iš paveikslų Megabyte Megabaitų Screencast Ekrano įrašas Player Grotuvas Log Žurnalas license Copyright and license from pictures Autorių teisės ir licencijos iš paveikslų player Play Groti Pause Pristabdyti Stop Stabdyti Open File Atverti failą Fullscreen Visas ekranas Previous frame Ankstesnis kadras Next frame Kitas kadras Mute Nutildyti Move menu Perkelti meniu vokoscreenNG-3.0.2/src/language/nl_NL.ts000066400000000000000000000352201362045215000200430ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Selecteer één of meer apparaten QvkAudioWindows Select one or more devices Selecteer één of meer apparaten QvkCameraController Camera Camera QvkCameraWindow Switch to Window Wissel naar vensterweergave Switch to Fullscreen Wissel naar volledig scherm QvkCountdown Countdown Countdown QvkHelp Help Help QvkLimitDiskFreeSpace Warning Waarschuwing The recording is not started, not enough free disk space. De opname is niet begonnen omdat er niet genoeg schijfruimte beschikbaar is. The free disk space limit is reached. De vrijeschijfruimtelimiet is bereikt. Limit of free disk space Vrijeschijfruimtelimiet Megabyte Megabyte The recording was stopped, not enough free disk space. De opname is gestopt omdat er niet genoeg schijfruimte beschikbaar is. QvkMainWindow Fullscreen Volledig scherm Window Venster No filemanager found. Er is geen bestandsbeheerder gevonden. Please install a filemanager. Installeer een bestandsbeheerder. Desktop session is a Wayland session De bureaubladsessie is een Wayland-sessie To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Op dit moment is Wayland niet ondersteund. Screencasts zullen een zwart scherm tonen. Log uit en start een X11-bureaubladsessie. Sourcecode Broncode Homepage Startpagina Translations Vertalingen Donate Doneren Wayland desktop session detected Wayland bureaubladsessie gedetecteerd. QvkPlayer Open File Open bestand QvkRegionChoise Area Gebied QvkSystray Start Starten Stop Stoppen Pause Pauzeren Continue Doorgaan Exit Einde QvkSystrayAlternative Start Starten Stop Stoppen Pause Pauzeren Continue Doorgaan Exit Einde cameraSettingsDialog Dialog Dialoog Flip horizontal Flip horizontaal Flip vertical Flip verticaal Invert Omkeren Gray Grijs Black-and-white Zwart-wit Remove window frame Verwijder schermkader 160x120 160x120 320x240 320x240 Camera settings Camera-instellingen 640x480 640x480 formMainWindow Area Gebied Reset Reset Magnification Vergroting Countdown Countdown Video size: Videoformaat: Free disk space: Vrije schijfruimte: Information Informatie Record Time: Opnametijd: Audio Audio Frames Frames Videocodec Videocodec Format Formaat Audiocodec Audiocodec Quality Kwaliteit Scale Schaal Do not record mouse cursor Muiscursor niet opnemen Hour Uur Minute Minuut Start the timer Start de timer Stop recording after Stop opname na Hours Uren Minutes Minuten Seconds Seconden Videopath Video map Limit of free disk space Vrijeschijfruimtelimiet Show in systray Tonen in systray Second wait before recording Secondes wachten voor opname Look for updates Zoek naar updates Help Help Video Video Available Beschikbaar Not available Niet beschikbaar Start Starten Stop Stoppen Pause Pauzeren Continue Doorgaan Play Afspelen Folder Map Camera Camera Invert Omkeren Gray Grijs Send Report Stuur rapportage CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Speel laatste opname af Open folder Open map CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Geminimaliseerd wanneer de opname start Starts minimized Start geminimaliseerd Flip horizontal Flip horizontaal Flip vertical Flip verticaal Black-and-white Zwart-wit Remove window frame Verwijder schermkader Donate Doneren Reset all settings at the next start Alle instellingen herstellen bij opnieuw opstarten Copyright and license from pictures Copyright en licentie uit beelden Megabyte Megabyte Screencast Screencast Player Speler Log Log license Copyright and license from pictures Copyright en licentie uit beelden player Play Afspelen Pause Pauzeren Stop Stoppen Open File Open bestand Fullscreen Volledig scherm Previous frame Vorige frame Next frame Volgende frame Mute Demp Move menu Verplaats menu vokoscreenNG-3.0.2/src/language/no.ts000066400000000000000000000347511362045215000174650ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Velg én til flere enheter QvkAudioWindows Select one or more devices Velg én til flere enheter QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Bytt til vindu Switch to Fullscreen Bytt til fullskjerm QvkCountdown Countdown Nedtelling QvkHelp Help Hjelp QvkLimitDiskFreeSpace Warning Advarsel The recording is not started, not enough free disk space. Opptaket har ikke startet, for lite ledig diskplass. The free disk space limit is reached. Ledig diskplass grense nådd. Limit of free disk space Grense for ledig diskplass. Megabyte Megabyte The recording was stopped, not enough free disk space. Opptaket ble stoppet, for lite ledig diskplass. QvkMainWindow Fullscreen Fullskjerm Window Vindu No filemanager found. Ingen filutforsker funnet. Please install a filemanager. Vennligst installere en filutforsker. Desktop session is a Wayland session Skrivebordsøkt er en Wayland økt. To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Wayland er ikke supportert. Et skjermopptak viser en svart skjerm. Vennligst logg ut og start en X11 Desktop økt. Sourcecode Kildekode Homepage Hjemmeside Translations Oversettelser Donate Donere Wayland desktop session detected Wayland skrivebordsøkt oppdaget QvkPlayer Open File Åpne Fil QvkRegionChoise Area Område QvkSystray Start Start Stop Stoppe Pause Pause Continue Forsett Exit Avslutt QvkSystrayAlternative Start Start Stop Stoppe Pause Pause Continue Forsett Exit Avslutt cameraSettingsDialog Dialog Dialog Flip horizontal Snu horisontalt Flip vertical Snu vertikalt Invert Invertere Gray Grå Black-and-white Svart-hvit Remove window frame Fjern vindusramme 160x120 160x120 320x240 320x240 Camera settings Kamera instillinger 640x480 640x480 formMainWindow Area Område Reset Nullstille Magnification Forstørrelse Countdown Nedtelling Video size: Videostørrelse: Free disk space: Ledig diskplass: Information Informasjon Record Time: Opptakstid: Audio Lyd Frames Rammer Videocodec Videokodek Format Format Audiocodec Lydkodek Quality Kvalitet Scale Skala Do not record mouse cursor ikke ta opp muse courser Hour Time Minute Minutt Start the timer Start timeren Stop recording after Stopp opptak etter Hours Timer Minutes Minutter Seconds Sekunder Videopath Video sti Limit of free disk space Grense for ledig diskplass. Show in systray Vis i systemstatusfeltet Second wait before recording Sekund venting før opptak Look for updates Se etter oppdateringer Help Hjelp Video Video Available Tilgjengelig Not available Ikke tilgjengelig Start Start Stop Stoppe Pause Pause Continue Forsett Play Spille Folder Mappe Camera Kamera Invert Invertere Gray Grå Send Report Send Rapport CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Spill av siste opptak Open folder Åpne mappe CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Minimert når opptak starter Starts minimized Starter minimert Flip horizontal Snu horisontalt Flip vertical Snu vertikalt Black-and-white Svart-hvit Remove window frame Fjern vindusramme Donate Donasjon Reset all settings at the next start Nullstille alle innstillinger ved neste oppstart. Copyright and license from pictures Opphavsrett og lisens fra bilder Megabyte Megabyte Screencast Skjermopptak Player Spiller Log Logg license Copyright and license from pictures Opphavsrett og lisens fra bilder player Play Spille Pause Pause Stop Stoppe Open File Åpne Fil Fullscreen fullskjerm Previous frame Forrige bilde Next frame Neste bilde Mute Stilne Move menu Flytt meny vokoscreenNG-3.0.2/src/language/pt.ts000066400000000000000000000356441362045215000174760ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Selecione um ou mais dispositivos QvkAudioWindows Select one or more devices Selecione um ou mais dispositivos QvkCameraController Camera Câmera QvkCameraWindow Switch to Window Mudar para janela Switch to Fullscreen Mudar para ecrã inteiro QvkCountdown Countdown Contagem decrescente QvkHelp Help Ajuda QvkLimitDiskFreeSpace Warning Aviso The recording is not started, not enough free disk space. A gravação não é iniciada, sem espaço em disco disponível. The free disk space limit is reached. É alcançado o limite de espaço em disco disponível. Limit of free disk space Limite do espaço em disco disponível Megabyte Megabyte The recording was stopped, not enough free disk space. A gravação foi parada, sem espaço em disco disponível. QvkMainWindow Fullscreen Ecrã inteiro Window Janela No filemanager found. Não foi encontrado nenhum gestor de ficheiros. Please install a filemanager. Por favor instale um gestor de ficheiros. Desktop session is a Wayland session A sessão de área de trabalho é uma sessão de Wayland To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Neste momento o Wayland não é suportado. Uma transmissão mostra um ecrã a negro. Por favor saia da conta e inicie uma sessão de Área de trabalho X11 Sourcecode Código-fonte Homepage Página inicial Translations Traduções Donate Doar Wayland desktop session detected Detetada sessão de área de trabalho Wayland QvkPlayer Open File Abrir ficheiro QvkRegionChoise Area Área QvkSystray Start Começar Stop Parar Pause Pausa Continue Continuar Exit Sair QvkSystrayAlternative Start Começar Stop Parar Pause Pausa Continue Continuar Exit Sair cameraSettingsDialog Dialog Diálogo Flip horizontal Girar horizontal Flip vertical Girar vertical Invert Inverter Gray Cinzento Black-and-white Preto e branco Remove window frame Remover moldura da janela 160x120 160x120 320x240 320x240 Camera settings Configurações da câmara 640x480 640x480 formMainWindow Area Área Reset Restabelecer Magnification Ampliação Countdown Contagem descrescente Video size: Tamanho do vídeo: Free disk space: Espaço de disco disponível: Information Informação Record Time: Tempo de gravação: Audio Áudio Frames Imagens Videocodec Codec de vídeo Format Formato Audiocodec Codec de áudio Quality Qualidade Scale Escala Do not record mouse cursor Não gravar o cursor do rato Hour Hora Minute Minuto Start the timer Iniciar o cronómetro Stop recording after Parar a gravação após Hours Horas Minutes Minutos Seconds Segundos Videopath Caminho do vídeo Limit of free disk space Limite do espaço em disco disponível Show in systray Mostrar na barra de tarefas Second wait before recording Espera em segundos antes de começar a gravar Look for updates Procurar por atualizações Help Ajuda Video Vídeo Available Disponível Not available Indisponível Start Começar Stop Parar Pause Pausa Continue Continuar Play Reproduzir Folder Pasta Camera Câmara Invert Inverter Gray Cinzento Send Report Enviar relatório CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Reproduzir a última gravação Open folder Abrir pasta CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Minimizado quando a gravação começar Starts minimized Iniciar minimizado Flip horizontal Girar horizontal Flip vertical Girar vertical Black-and-white Preto e branco Remove window frame Remover moldura da janela Donate Doar Reset all settings at the next start Repor todas as configurações no próximo início Copyright and license from pictures Direitos de autor e licença das imagens Megabyte Megabyte Screencast Captura de ecrã em vídeo Player Leitor Log Registos license Copyright and license from pictures Direitos de autor e licença das imagens player Play Reproduzir Pause Pausa Stop Parar Open File Abrir ficheiro Fullscreen Ecrã inteiro Previous frame Imagem anterior Next frame Imagem seguinte Mute Mudo Move menu Mover o menu vokoscreenNG-3.0.2/src/language/ru.ts000066400000000000000000000407341362045215000174750ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Выберите одно или несколько устройств QvkAudioWindows Select one or more devices Выберите одно или несколько устройств QvkCameraController Camera Камера QvkCameraWindow Switch to Window Переключиться в режим окна Switch to Fullscreen Переключиться в полноэкранный режим QvkCountdown Countdown Обратный отсчёт QvkHelp Help Справка QvkLimitDiskFreeSpace Warning Предупреждение The recording is not started, not enough free disk space. Запись не начата, недостаточно свободного места на диске. The free disk space limit is reached. Достигнут лимит свободного места на диске. Limit of free disk space Предел свободного дискового пространства Megabyte Мегабайт The recording was stopped, not enough free disk space. Запись остановлена, недостаточно свободного места на диске. QvkMainWindow Fullscreen Весь экран Window Окно No filemanager found. Файлового менеджера не найдено. Please install a filemanager. Пожалуйста установите файловый менеджер. Desktop session is a Wayland session Найдена сессия рабочего стола Wayland To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session На данный момент Wayland не поддерживается. Запись покажет чёрный экран. Пожалуйста выйдите и запустите сессию X11 Sourcecode Исходный код Homepage Веб-сайт Translations Переводы Donate Пожертвовать Wayland desktop session detected Найдена сессия рабочего стола Wayland QvkPlayer Open File Открыть файл QvkRegionChoise Area Область экрана QvkSystray Start Начать Stop Остановить Pause Приостановить Continue Продолжить Exit Выход QvkSystrayAlternative Start Начать Stop Остановить Pause Приостановить Continue Продолжить Exit Выход cameraSettingsDialog Dialog Диалоговое окно Flip horizontal Отразить по горизонтали Flip vertical Отразить по вертикали Invert Перевернуть Gray Серый Black-and-white Чёрно-белое Remove window frame Убрать рамку окна 160x120 160х120 320x240 320х240 Camera settings Настройки камеры 640x480 640х480 formMainWindow Area Область экрана Reset Сбросить Magnification Лупа Countdown Обратный отсчёт Video size: Размер видео: Free disk space: Свободное место на диске: Information Информация Record Time: Время для записи: Audio Звук Frames Кадры Videocodec Видеокодек Format Формат Audiocodec Звуковой кодек Quality Качество Scale Приблизить Do not record mouse cursor Не записывать указатель мыши Hour Час Minute Минута Start the timer Запустить таймер Stop recording after Остановить запись после Hours Часов Minutes Минут Seconds Секунд Videopath Сохранять в папке: Limit of free disk space Предел свободного дискового пространства Show in systray Показать значок на верхней панели Second wait before recording Секунд до начала записи Look for updates Проверить обновления Help Справка Video Видео Available Доступно Not available Недоступно Start Начать Stop Остановить Pause Приостановить Continue Продолжить Play Воспроизвести Folder Папка Camera Камера Invert Перевернуть Gray Серый Send Report Отправить жалобу CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Проиграть последнюю запись Open folder Открыть папку CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Сворачивать окно при начале записи Starts minimized Запускать свёрнутым Flip horizontal Отразить по горизонтали Flip vertical Отразить по вертикали Black-and-white Чёрно-белое Remove window frame Убрать рамку окна Donate Пожертвовать Reset all settings at the next start Сбросить все настройки при следующем запуске Copyright and license from pictures Копирайт и лицензия с изображений Megabyte Мегабайт Screencast Скринкаст Player Проигрыватель Log Логи license Copyright and license from pictures Копирайт и лицензия с изображений player Play Воспроизвести Pause Приостановить Stop Остановить Open File Открыть файл Fullscreen Весь экран Previous frame Предыдущий кадр Next frame Следующий кадр Mute Без звука Move menu Переместить меню vokoscreenNG-3.0.2/src/language/sv_SE.ts000066400000000000000000000352661362045215000200720ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Välj en eller flera enheter QvkAudioWindows Select one or more devices Välj en eller flera enheter QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Växla till fönsterläge Switch to Fullscreen Växla till helskärmsläge QvkCountdown Countdown Nedräkning QvkHelp Help Hjälp QvkLimitDiskFreeSpace Warning Varning The recording is not started, not enough free disk space. Inspelningen är inte startad, det finns inte tillräckligt med ledigt diskutrymme. The free disk space limit is reached. Det lediga diskutrymmet är slut. Limit of free disk space Gräns för ledigt dikutrymme Megabyte Megabyte The recording was stopped, not enough free disk space. Inspelningen har stoppats, det finns inte tillräckligt med ledigt diskutrymme. QvkMainWindow Fullscreen Helskärm Window Fönster No filemanager found. Ingen filhanterare hittades. Please install a filemanager. Installera en filhanterare. Desktop session is a Wayland session Skrivbordsessionen är en Wayland-session To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Wayland stöds inte. En skärminspelning visar bara en svart skärm. Logga ut och starta en X11 skrivbordssession. Sourcecode Källkod Homepage Hemsida Translations Översättningar Donate Donera Wayland desktop session detected Wayland skrivbordssession identifierad QvkPlayer Open File Öppna fil QvkRegionChoise Area Område QvkSystray Start Starta Stop Stoppa Pause Pausa Continue Fortsätt Exit Avsluta QvkSystrayAlternative Start Starta Stop Stoppa Pause Pausa Continue Fortsätt Exit Avsluta cameraSettingsDialog Dialog Dialog Flip horizontal Vänd horisontellt Flip vertical Vänd vertikalt Invert Invertera Gray Grå Black-and-white Svartvit Remove window frame Ta bort fönsterram 160x120 160x120 320x240 320x240 Camera settings Kamerainställningar 640x480 640x480 formMainWindow Area Område Reset Återställ Magnification Förstoringsglas Countdown Nedräkning Video size: Videostorlek: Free disk space: Ledigt diskutrymme: Information Information Record Time: Inspelningstid: Audio Ljud Frames Bildrutor Videocodec Videokodek Format Format Audiocodec Ljudkodek Quality Kvalitet Scale Skala Do not record mouse cursor Spela inte in muspekaren Hour Timma Minute Minut Start the timer Starta tiduret Stop recording after Stoppa inspelningen efter Hours Timmar Minutes Minuter Seconds Sekunder Videopath Videosökväg Limit of free disk space Gräns för ledigt diskutrymme Show in systray Visa i systemfältet Second wait before recording Vänta x sekunder före inspelningsstart Look for updates Sök efter uppdateringar Help Hjälp Video Video Available Tillgänglig Not available Inte tillgänglig Start Starta Stop Stoppa Pause Pausa Continue Fortsätt Play Spela upp Folder Mapp Camera Kamera Invert Invertera Gray Grå Send Report Skicka rapport CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Spela upp senaste inspelning Open folder Öppna mapp CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Minimerad när inspelning startar Starts minimized Starta minimerad Flip horizontal Vänd horisontellt Flip vertical Vänd vertikalt Black-and-white Svartvit Remove window frame Ta bort fönsterram Donate Donera Reset all settings at the next start Återställ alla inställningar vid nästa programstart Copyright and license from pictures Copyright och licens från bilder Megabyte Megabyte Screencast Skärminspelning Player Spelare Log Logg license Copyright and license from pictures Copyright och licens från bilder player Play Spela upp Pause Pausa Stop Stoppa Open File Öppna fil Fullscreen Helskärm Previous frame Föregående bildruta Next frame Nästa bildruta Mute Tyst Move menu Flytta menyn vokoscreenNG-3.0.2/src/language/tr_TR.ts000066400000000000000000000352421362045215000200770ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Bir veya daha fazla aygıt seç QvkAudioWindows Select one or more devices Bir veya daha fazla aygıt seç QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Pencereye Geç Switch to Fullscreen Tam Ekrana Geç QvkCountdown Countdown Geri sayım QvkHelp Help Yardım QvkLimitDiskFreeSpace Warning Uyarı The recording is not started, not enough free disk space. Kayıt başlatılmadı, yeterli boş disk alanı yok. The free disk space limit is reached. Boş disk alanı sınırına ulaşıldı. Limit of free disk space Boş disk alanı sınırı Megabyte Megabayt The recording was stopped, not enough free disk space. Kayıt durduruldu, yeterli boş disk alanı yok. QvkMainWindow Fullscreen Tam Ekran Window Pencere No filemanager found. Dosya yöneticisi bulunamadı Please install a filemanager. Lütfen bir dosya yöneticisi yükleyin. Desktop session is a Wayland session Masaüstü oturumu bir Wayland oturumu To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Zaman zaman Wayland desteklenmedi. Ekran görüntüsünde siyah bir ekran gösterilir. Lütfen çıkış yapın ve bir X11 Masaüstü oturumu başlatın Sourcecode Kaynak kodu Homepage Ana Sayfa Translations Çeviriler Donate Bağış Wayland desktop session detected Wayland masaüstü oturumu algılandı QvkPlayer Open File Dosya Aç QvkRegionChoise Area Bölge QvkSystray Start Başlat Stop Durdur Pause Duraklat Continue Devam Exit Çıkış QvkSystrayAlternative Start Başlat Stop Durdur Pause Duraklat Continue Devam Exit Çıkış cameraSettingsDialog Dialog Diyalog Flip horizontal Yatay çevir Flip vertical Dikey çevir Invert Ters çevir Gray Gri Black-and-white Siyah-ve-beyaz Remove window frame Pencere çerçevesini kaldır 160x120 160x120 320x240 320x240 Camera settings Kamera ayarları 640x480 640x480 formMainWindow Area Bölge Reset Sıfırla Magnification Büyüt Countdown Geri sayım Video size: Video boyutu: Free disk space: Boş disk alanı: Information Bilgilendirme Record Time: Kayıt Süresi: Audio Ses Frames Çerçeveler Videocodec Video çözücü Format Biçim Audiocodec Ses çözücü Quality Kalite Scale Ölçek Do not record mouse cursor Fare imlecini kaydetme Hour Saat Minute Dakika Start the timer Zamanlayıcıyı başlat Stop recording after Sonra kaydı durdur Hours Saat Minutes Dakika Seconds Saniye Videopath Video yolu Limit of free disk space Boş disk alanı sınırı Show in systray Sistem tepsisinde göster Second wait before recording Kayıttan önce biraz bekle Look for updates Güncellemeleri ara Help Yardım Video Video Available Mevcut Not available Mevcut değil Start Başlat Stop Durdur Pause Duraklat Continue Devam Play Oynat Folder Klasör Camera Kamera Invert Ters çevir Gray Gri Send Report Rapor Gönder CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Son kaydı oynat Open folder Klasörü aç CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Kayıt başladığında simge durumuna küçült Starts minimized Küçültülmüş başlat Flip horizontal Yatay çevir Flip vertical Dikey çevir Black-and-white Siyah-ve-beyaz Remove window frame Pencere çerçevesini kaldır Donate Bağış Reset all settings at the next start Bir sonraki başlangıçta tüm ayarları sıfırla Copyright and license from pictures Resimlerin telif hakkı ve lisans Megabyte Megabayt Screencast Ekran alıntılama Player Oynatıcı Log Günlük license Copyright and license from pictures Resimlerin telif hakkı ve lisans player Play Oynat Pause Duraklat Stop Durdur Open File Dosya Aç Fullscreen Tam Ekran Previous frame Önceki çerçeve Next frame Sonraki çerçeve Mute Sessiz Move menu Menüyü taşı vokoscreenNG-3.0.2/src/language/uk_UA.ts000066400000000000000000000406021362045215000200450ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices Виберіть один або декілька пристроїв QvkAudioWindows Select one or more devices Виберіть один або декілька пристроїв QvkCameraController Camera Камера QvkCameraWindow Switch to Window Перемикнутися на режим вікна Switch to Fullscreen Перемикнутися на повний екран QvkCountdown Countdown Зворотній відлік QvkHelp Help Допомога QvkLimitDiskFreeSpace Warning Попередження The recording is not started, not enough free disk space. Запис не почато, бракує вільного місця на диску. The free disk space limit is reached. Досягнуто ліміту вільного місця на диску. Limit of free disk space Ліміт вільного місця на диску Megabyte Мегабайт The recording was stopped, not enough free disk space. Запис зупинено, бракує вільного місця на диску. QvkMainWindow Fullscreen Весь екран Window Вікно No filemanager found. Файлового менеджера не знайдено. Please install a filemanager. Будь ласка встановіть файловий менеджер. Desktop session is a Wayland session Знайдена сесія стільниці Wayland To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session На цю мить Wayland не підтримується. Запис покаже чорний екран. Будь ласка вийдіть та запустіть сесію X11 Sourcecode Джерельний код Homepage Веб-сайт Translations Переклади Donate Зробити внесок Wayland desktop session detected Знайдена сесія стільниці Wayland QvkPlayer Open File Відкрити файл QvkRegionChoise Area Довільна область QvkSystray Start Почати Stop Зупинити Pause Призупинити Continue Продовжити Exit Вийти QvkSystrayAlternative Start Почати Stop Зупинити Pause Призупинити Continue Продовжити Exit Вийти cameraSettingsDialog Dialog Діалогове вікно Flip horizontal Показати горизонтально Flip vertical Показати вертикально Invert Відобразити Gray Сірий Black-and-white У відтінках сірого Remove window frame Прибрати рамку вікна 160x120 160x120 320x240 320x240 Camera settings Налаштування камери 640x480 640x480 formMainWindow Area Довільна область Reset Скинути Magnification Збільшення Countdown Зворотній відлік Video size: Розмір відеофайлу: Free disk space: Вільне місце на диску: Information Інформація Record Time: Час запису: Audio Звук Frames Кадри Videocodec Відеокодек Format Формат Audiocodec Аудіокодек Quality Якість Scale Збільшити Do not record mouse cursor Не записувати курсор миші Hour Година Minute Хвилина Start the timer Запустити таймер Stop recording after Зупинити запис через Hours Години Minutes Хвилини Seconds Секунди Videopath Зберегти в теку Limit of free disk space Ліміт вільного місця на диску Show in systray Показати значок на панелі Second wait before recording Зачекати секунд перед початком запису Look for updates Перевірити оновлення Help Допомога Video Відео Available Доступний Not available Недоступний Start Почати Stop Зупинити Pause Призупинити Continue Продовжити Play Програти Folder Папка Camera Камера Invert Відобразити Gray Сірий Send Report Відправити скаргу CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Відтворити останній запис Open folder Відкрити теку CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Згортати вікно при початку запису Starts minimized Запускати згорнутим Flip horizontal Показати горизонтально Flip vertical Показати вертикально Black-and-white У відтінках сірого Remove window frame Прибрати рамку вікна Donate Зробити внесок Reset all settings at the next start Скинути усі налаштування при наступному старті Copyright and license from pictures Авторські права та ліцензія на зображення Megabyte Мегабайт Screencast Скрінкаст Player Програвач Log Лог license Copyright and license from pictures Авторські права та ліцензія на зображення player Play Програти Pause Призупинити Stop Зупинити Open File Відкрити файл Fullscreen Весь екран Previous frame Попередній кадр Next frame Наступний кадр Mute Без звуку Move menu Перемістити меню vokoscreenNG-3.0.2/src/language/zh_CN.ts000066400000000000000000000346131362045215000200470ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices 选取一个或多个设备 QvkAudioWindows Select one or more devices 选取一个或多个设备 QvkCameraController Camera 摄像头 QvkCameraWindow Switch to Window 切换至窗口模式 Switch to Fullscreen 切换至全屏 QvkCountdown Countdown 倒计时 QvkHelp Help 帮助 QvkLimitDiskFreeSpace Warning 警告 The recording is not started, not enough free disk space. 录制未能开始,可用磁盘空间不足。 The free disk space limit is reached. 磁盘剩余空间已耗尽。 Limit of free disk space 磁盘空间上限 Megabyte MB The recording was stopped, not enough free disk space. 录制已停止,没有足够的磁盘空间。 QvkMainWindow Fullscreen 全屏模式 Window 窗口 No filemanager found. 未发现文件管理器。 Please install a filemanager. 请安装一个文件管理器。 Desktop session is a Wayland session 桌面会话为 Wayland 会话 To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session 尚不支持 Wayland 录屏功能,您的屏幕广播将会是黑屏画面。请登出并进入 X11 会话。 Sourcecode 源代码 Homepage 网站 Translations 翻译 Donate 捐赠 Wayland desktop session detected 检测到 Wayland 桌面会话 QvkPlayer Open File 打开文件 QvkRegionChoise Area 区域 QvkSystray Start 开始 Stop 停止 Pause 暂停 Continue 继续 Exit 退出 QvkSystrayAlternative Start 开始 Stop 停止 Pause 暂停 Continue 继续 Exit 退出 cameraSettingsDialog Dialog 对话框 Flip horizontal 横向翻转 Flip vertical 纵向翻转 Invert 翻转 Gray 灰度 Black-and-white 黑白 Remove window frame 移除窗口边框 160x120 160x120 320x240 320x240 Camera settings 摄像头设置 640x480 640x480 formMainWindow Area 区域 Reset 重置 Magnification 放大 Countdown 倒计时 Video size: 视频大小: Free disk space: 可用磁盘空间: Information 信息 Record Time: 录制时间: Audio 音频 Frames 帧率 Videocodec 视频编码 Format 格式 Audiocodec 音频编码 Quality 质量 Scale 缩放 Do not record mouse cursor 不要录制鼠标 Hour 小时 Minute 分钟 Start the timer 开始倒数 Stop recording after 此时间后停止录制: Hours 小时 Minutes 分钟 Seconds Videopath 视频路径 Limit of free disk space 磁盘空间上限 Show in systray 系统托盘显示 Second wait before recording 开始录制前等待秒数: Look for updates 检查更新 Help 帮助 Video 视频 Available 可用 Not available 不可用 Start 开始 Stop 停止 Pause 暂停 Continue 继续 Play 播放 Folder 文件夹 Camera 摄像头 Invert 翻转 Gray 灰度 Send Report 发送报告 CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record 播放最新一次的录制 Open folder 打开文件夹 CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts 当录制开始时最小化 Starts minimized 开启时最小化 Flip horizontal 横向翻转 Flip vertical 纵向翻转 Black-and-white 黑白 Remove window frame 移除窗口边框 Donate 捐赠 Reset all settings at the next start 下次启动时重置所有设置 Copyright and license from pictures 图片版权和许可条款 Megabyte MB Screencast 屏幕广播 Player 播放器 Log 日志 license Copyright and license from pictures 图片版权和许可条款 player Play 播放 Pause 暂停 Stop 停止 Open File 打开文件 Fullscreen 全屏模式 Previous frame 上一帧 Next frame 下一帧 Mute 静音 Move menu 移动菜单 vokoscreenNG-3.0.2/src/language/zh_TW.ts000066400000000000000000000346751362045215000201110ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices 選取一個或多個裝置 QvkAudioWindows Select one or more devices 選取一個或多個裝置 QvkCameraController Camera 攝影機 QvkCameraWindow Switch to Window 切換至視窗 Switch to Fullscreen 切換至全螢幕 QvkCountdown Countdown 倒數計時 QvkHelp Help 求助 QvkLimitDiskFreeSpace Warning 警告 The recording is not started, not enough free disk space. 錄影無法開始,磁碟空間不足 The free disk space limit is reached. 已到達磁碟空間上限 Limit of free disk space 磁碟空間上限 Megabyte MB The recording was stopped, not enough free disk space. 錄影已經停止,磁碟空間不足 QvkMainWindow Fullscreen 全螢幕 Window 視窗 No filemanager found. 找不到檔案管理員程式 Please install a filemanager. 請安裝檔案管理員程式 Desktop session is a Wayland session 桌面工作階段是 Wayland 工作階段 To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session 尚未支援 Wayland。螢幕將會空白一片。請登出並啟動 X11 桌面工作階段 Sourcecode 來源程式碼 Homepage 官方網頁 Translations 軟體介面翻譯 Donate 捐款支持 Wayland desktop session detected 偵測到是 Wayland 桌面工作階段 QvkPlayer Open File 開啟檔案 QvkRegionChoise Area 區域 QvkSystray Start 開始 Stop 停止 Pause 暫停 Continue 繼續 Exit 結束 QvkSystrayAlternative Start 開始 Stop 停止 Pause 暫停 Continue 繼續 Exit 結束 cameraSettingsDialog Dialog 對話匣 Flip horizontal 水平翻轉 Flip vertical 垂直翻轉 Invert 色彩反轉 Gray 灰色 Black-and-white 黑白 Remove window frame 移除視窗外框 160x120 160x120 320x240 320x240 Camera settings 攝影機設定 640x480 640x480 formMainWindow Area 區域 Reset 重設 Magnification 縮放 Countdown 倒數計時 Video size: 視訊尺寸: Free disk space: 磁碟空間: Information 資訊 Record Time: 錄製時間: Audio 音訊 Frames 影格率 Videocodec 影像編碼 Format 格式 Audiocodec 音訊編碼 Quality 品質 Scale 縮放 Do not record mouse cursor 不要錄製滑鼠游標 Hour 小時 Minute 分鐘 Start the timer 開始倒數 Stop recording after 此時間後停止錄製: Hours 小時 Minutes 分鐘 Seconds Videopath 影片路徑 Limit of free disk space 磁碟空間上限 Show in systray 顯示在系統匣 Second wait before recording 開始錄製前等待秒數 Look for updates 檢查有否更新 Help 求助 Video 視訊 Available 可提供 Not available 沒有 Start 開始 Stop 停止 Pause 暫停 Continue 繼續 Play 播放 Folder 資料夾 Camera 攝影機 Invert 色彩反轉 Gray 灰色 Send Report 發送報告 CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record 播放上一條影片 Open folder 開啟資料夾 CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts 開始錄製時最小化 Starts minimized 開啟時最小化 Flip horizontal 水平翻轉 Flip vertical 垂直翻轉 Black-and-white 黑白 Remove window frame 移除視窗外框 Donate 捐款支持 Reset all settings at the next start 下次開啟時,重設所有設定 Copyright and license from pictures 圖片的版權及授權條款 Megabyte MB Screencast 螢幕播放 Player 播放器 Log 日誌 license Copyright and license from pictures 圖片的版權及授權條款 player Play 播放 Pause 暫停 Stop 停止 Open File 開啟檔案 Fullscreen 全螢幕 Previous frame 上一個影格 Next frame 上一個影格 Mute 靜音 Move menu 移動選單 vokoscreenNG-3.0.2/src/licenses/000077500000000000000000000000001362045215000165115ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/licenses/QvkLicenses.cpp000066400000000000000000000065521362045215000214540ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkLicenses.h" #include #include #include #include QvkLicenses::QvkLicenses( Ui_formMainWindow *ui_mainwindow ) : ui( new Ui::license ) { ui->setupUi( this ); QIcon icon; icon.addFile( QString::fromUtf8( ":/pictures/logo/logo.png" ), QSize(), QIcon::Normal, QIcon::Off ); setWindowIcon( icon ); connect( ui_mainwindow->pushButtonLicense, SIGNAL( clicked( bool ) ), this, SLOT( show() ) ); const QFont fixedFont = QFontDatabase::systemFont( QFontDatabase::FixedFont ); ui->label_dummy_1->hide(); ui->label_dummy_2->hide(); ui->label_dummy_3->hide(); ui->label_dummy_4->hide(); int row = 0; QDirIterator dirIterator( ":/pictures/", QDir::Files, QDirIterator::Subdirectories ); while ( dirIterator.hasNext() ) { QString string = dirIterator.next(); if ( ( string.contains( ".license" ) == true ) and ( string.contains( "template" ) == false ) ) { QSettings settings( dirIterator.filePath(), QSettings::IniFormat ); settings.beginGroup( "license" ); QPixmap pixmap( dirIterator.filePath().replace( "license", "png" ) ); pixmap = pixmap.scaled( 50, 50, Qt::KeepAspectRatio, Qt::SmoothTransformation); QLabel *label = new QLabel; label->setPixmap( pixmap ); ui->gridLayout->addWidget( label, row, 1 ); QPixmap pixmapSpace( ":/pictures/space.png" ); pixmapSpace = pixmapSpace.scaled( 10, 50, Qt::KeepAspectRatio, Qt::SmoothTransformation); QLabel *labelSpace = new QLabel; labelSpace->setPixmap( pixmapSpace ); ui->gridLayout->addWidget( labelSpace, row, 2 ); QLabel *labelAuthor = new QLabel; labelAuthor->setText( "Author : (C) " + settings.value( "author" ).toString() + "\n" + "License: " + settings.value( "license" ).toString() + "\n" + "Source : " + settings.value( "url" ).toString() ); ui->gridLayout->addWidget( labelAuthor, row, 3 ); QPixmap pixmap1( ":/pictures/space.png" ); pixmap1 = pixmap1.scaled( 50, 10, Qt::KeepAspectRatio, Qt::SmoothTransformation); QLabel *label1 = new QLabel; label1->setPixmap( pixmap1 ); row++; ui->gridLayout->addWidget( label1, row, 1 ); row++; settings.endGroup(); } } } QvkLicenses::~QvkLicenses(){} vokoscreenNG-3.0.2/src/licenses/QvkLicenses.h000066400000000000000000000022541362045215000211140ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKLICENSES_H #define QVKLICENSES_H #include "ui_licenses.h" #include "ui_formMainWindow.h" #include #include class QvkLicenses: public QWidget { Q_OBJECT public: QvkLicenses(Ui_formMainWindow *ui_mainwindow ); virtual ~QvkLicenses(); Ui_license *ui; public slots: private slots: signals: protected: private: }; #endif vokoscreenNG-3.0.2/src/licenses/licenses.pri000066400000000000000000000002261362045215000210320ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkLicenses.h SOURCES += $$PWD/QvkLicenses.cpp FORMS += \ $$PWD/licenses.ui vokoscreenNG-3.0.2/src/licenses/licenses.ui000066400000000000000000000051451362045215000206620ustar00rootroot00000000000000 license 0 0 800 600 Copyright and license from pictures Fallback and own icons Qt::AlignCenter true 0 0 784 560 TextLabel TextLabel TextLabel Qt::Horizontal 40 20 TextLabel vokoscreenNG-3.0.2/src/limitDiskFreeSpace/000077500000000000000000000000001362045215000204135ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/limitDiskFreeSpace/QvkLimitDiskFreeSpace.cpp000066400000000000000000000106721362045215000252560ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkLimitDiskFreeSpace.h" #include "global.h" #include #include #include #include QvkLimitDiskFreeSpace::QvkLimitDiskFreeSpace( Ui_formMainWindow *ui_mainwindow, QvkSpezialSlider *vkSpezialSlider ) { ui = ui_mainwindow; sliderLimitOfFreeDiskSpace = vkSpezialSlider; timerStorageSize = new QTimer(this); timerStorageSize->setTimerType( Qt::PreciseTimer ); timerStorageSize->setInterval( 1000 ); connect( timerStorageSize, SIGNAL( timeout() ), this, SLOT( slot_storageMessagBoxByRecord() ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), timerStorageSize, SLOT( start() ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), timerStorageSize, SLOT( stop() ) ); } QvkLimitDiskFreeSpace::~QvkLimitDiskFreeSpace() { } bool QvkLimitDiskFreeSpace::isStorageOK() { QStorageInfo storage = QStorageInfo(ui->lineEditVideoPath->text() ); storage.refresh(); // Stop a record if disk space smaller 250MB(Default) 999MB(Max) if ( storage.bytesAvailable() <= ( sliderLimitOfFreeDiskSpace->value() * 1024 * 1024 ) ) { return false; } return true; } bool QvkLimitDiskFreeSpace::isStorageOKMessagBoxByStart() { QStorageInfo storage = QStorageInfo(ui->lineEditVideoPath->text() ); storage.refresh(); // Stop a record if disk space smaller 250MB(Default) 999MB(Max) if ( storage.bytesAvailable() <= ( sliderLimitOfFreeDiskSpace->value() * 1024 * 1024 ) ) { timerStorageSize->stop(); QMessageBox *messageBox = new QMessageBox(); messageBox->setWindowIcon( QIcon::fromTheme( ":/pictures/logo/logo.png" ) ); messageBox->setWindowTitle( tr( "Warning" ) + " " + global::name + " " + global::version ); messageBox->setText( tr( "The recording is not started, not enough free disk space." ) ); messageBox->setInformativeText( tr( "The free disk space limit is reached." ) + "\n" + "\n" + tr( "Limit of free disk space" ) + " " + QString::number( sliderLimitOfFreeDiskSpace->value() ) + " " + tr( "Megabyte" ) ); messageBox->setStandardButtons( QMessageBox::Ok ); messageBox->setIcon( QMessageBox::Warning ); messageBox->show(); return false; } return true; } void QvkLimitDiskFreeSpace::slot_storageMessagBoxByRecord() { QStorageInfo storage = QStorageInfo(ui->lineEditVideoPath->text() ); storage.refresh(); // Stop a record if disk space smaller 250MB(Default) 999MB(Max) if ( storage.bytesAvailable() <= ( sliderLimitOfFreeDiskSpace->value() * 1024 * 1024 ) ) { timerStorageSize->stop(); ui->pushButtonStop->click(); QMessageBox *messageBox = new QMessageBox(); messageBox->setWindowIcon( QIcon::fromTheme( ":/pictures/logo/logo.png" ) ); messageBox->setWindowTitle( tr( "Warning" ) + " " + global::name + " " + global::version ); messageBox->setText( tr( "The recording was stopped, not enough free disk space." ) ); messageBox->setInformativeText( tr( "The free disk space limit is reached." ) + "\n" + "\n" + tr( "Limit of free disk space" ) + " " + QString::number( sliderLimitOfFreeDiskSpace->value() ) + " " + tr( "Megabyte" ) ); messageBox->setStandardButtons( QMessageBox::Ok ); messageBox->setIcon( QMessageBox::Warning ); messageBox->show(); } } vokoscreenNG-3.0.2/src/limitDiskFreeSpace/QvkLimitDiskFreeSpace.h000066400000000000000000000026421362045215000247210ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKLIMITDISKFREESPACE_H #define QVKLIMITDISKFREESPACE_H #include "ui_formMainWindow.h" #include "QvkSpezialSlider.h" #include class QvkLimitDiskFreeSpace: public QWidget { Q_OBJECT public: QvkLimitDiskFreeSpace( Ui_formMainWindow *ui_mainwindow, QvkSpezialSlider *vkSpezialSlider ); virtual ~QvkLimitDiskFreeSpace(); bool isStorageOK(); bool isStorageOKMessagBoxByStart(); public slots: private slots: void slot_storageMessagBoxByRecord(); signals: protected: private: Ui_formMainWindow *ui; QTimer *timerStorageSize; QvkSpezialSlider *sliderLimitOfFreeDiskSpace; }; #endif vokoscreenNG-3.0.2/src/limitDiskFreeSpace/limitDiskFreeSpace.pri000066400000000000000000000002321362045215000246330ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkLimitDiskFreeSpace.h SOURCES += $$PWD/QvkLimitDiskFreeSpace.cpp vokoscreenNG-3.0.2/src/loadExtensions/000077500000000000000000000000001362045215000177035ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/loadExtensions/QvkLoadExtension.cpp000066400000000000000000000050631362045215000236510ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkLoadExtension.h" #include "global.h" #include #include #include #include QvkLoadExtension::QvkLoadExtension( QvkMainWindow *mainWindow, Ui_formMainWindow *GUI ) { ui = GUI; parent = mainWindow; } QvkLoadExtension::~QvkLoadExtension() {} void QvkLoadExtension::loadExtension() { QString extensionsPath = QStandardPaths::writableLocation( QStandardPaths::HomeLocation ) + QDir::separator() + "vokoscreen_extensions" + QDir::separator(); qDebug().noquote() << global::nameOutput << "ExtensionsPath:" << extensionsPath; QDir libDir( extensionsPath ); QStringList filter = QStringList() << "*.so.*"; QStringList libStringList = libDir.entryList( filter, QDir::Files | QDir::NoSymLinks ); // Testen ob eine lib im Ordner ist if ( !libStringList.empty() ) { QLibrary *library = new QLibrary( extensionsPath + libStringList[ 0 ] ); if ( library->load() ) { qDebug().noquote() << global::nameOutput << libStringList[ 0 ] << "Library has been loaded"; typedef QWidget*(*CreateWidgetFunction)( Ui_formMainWindow *GUI ); CreateWidgetFunction cwf = ( CreateWidgetFunction )library->resolve( "vokoscreen_extensions" ); if ( cwf ) { cwf( ui ); qDebug().noquote() << global::nameOutput << "Extension was loaded"; //myUi.extensionLoadpushButton->hide(); } else { qDebug().noquote() << global::nameOutput << "Extension can not be displayed from the loaded library"; } } else { qDebug().noquote() << global::nameOutput << "Library found but not loaded" << library->errorString(); } } else { qDebug().noquote() << global::nameOutput << "No library for extension found"; } qDebug( " " ); } vokoscreenNG-3.0.2/src/loadExtensions/QvkLoadExtension.h000066400000000000000000000024011362045215000233070ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKLOADEXTENSION_H #define QVKLOADEXTENSION_H #include "ui_formMainWindow.h" #include "mainwindow.h" #include class QvkLoadExtension : public QObject { Q_OBJECT public: explicit QvkLoadExtension(QvkMainWindow *parent, Ui_formMainWindow *GUI ); ~QvkLoadExtension(); void loadExtension(); Ui_formMainWindow *ui; QvkMainWindow *parent; private: public slots: protected: signals: }; #endif // QVKLOADEXTENSION_H vokoscreenNG-3.0.2/src/loadExtensions/loadExtensions.pri000066400000000000000000000002201362045215000234100ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkLoadExtension.h SOURCES += $$PWD/QvkLoadExtension.cpp vokoscreenNG-3.0.2/src/log/000077500000000000000000000000001362045215000154655ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/log/QvkLog.cpp000066400000000000000000000067621362045215000174070ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkLog.h" #include #include #include #include QvkLog::QvkLog( Ui_formMainWindow *ui_mainwindow ) { ui = ui_mainwindow; connect( this, SIGNAL( signal_newLogText( QString ) ), this, SLOT( slot_addLog( QString ) ) ); QDateTime dateTime = QDateTime::currentDateTime(); QString stringDateTime = dateTime.toString( "yyyy_MM_dd_hh_mm_ss" ); path = QStandardPaths::writableLocation( QStandardPaths::AppConfigLocation ); QString logFolderName = path + "/" + "log"; if( !QDir( logFolderName ).exists() ) { QDir().mkpath( logFolderName ); } logFile.setFileName( path + "/" + "log" + "/" + stringDateTime + ".log" ); // If more 30 files, remove the last. QDir dir( logFolderName ); dir.setFilter( QDir::Files ); dir.setSorting( QDir::Name ); QList list = dir.entryInfoList(); if ( list.count() > 30 ) { QFile file( list.at(0).absoluteFilePath() ); file.remove(); } } QvkLog::~QvkLog() { } void QvkLog::slot_addLog( QString value ) { ui->textBrowserLog->append( value ); } void QvkLog::writeToLog( QString string ) { #ifdef Q_OS_LINUX QString eol = "\n"; #endif #ifdef Q_OS_WIN QString eol = "\r\n"; #endif logFile.open( QIODevice::Append | QIODevice::Text | QIODevice::Unbuffered ); logFile.write( string.toUtf8() ); logFile.write( eol.toUtf8() ); logFile.close(); } void QvkLog::outputMessage( QtMsgType type, const QMessageLogContext &context, const QString &msg ) { QString txt; QByteArray localMsg = msg.toLocal8Bit(); switch (type) { case QtDebugMsg: fprintf( stderr, "%s\n", localMsg.constData() ); //fprintf( stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function ); txt += localMsg.constData(); break; case QtInfoMsg: fprintf( stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function ); txt += localMsg.constData(); break; case QtWarningMsg: fprintf( stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function ); txt += localMsg.constData(); break; case QtCriticalMsg: fprintf( stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function ); txt += localMsg.constData(); break; case QtFatalMsg: fprintf( stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function ); txt += localMsg.constData(); abort(); } writeToLog( txt ); emit signal_newLogText( txt ); } vokoscreenNG-3.0.2/src/log/QvkLog.h000066400000000000000000000025771362045215000170540ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKLOG_H #define QVKLOG_H #include "ui_formMainWindow.h" #include #include class QvkLog : public QObject { Q_OBJECT public: QvkLog( Ui_formMainWindow *ui_mainwindow); virtual ~QvkLog(); void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg); QString path; QFile logFile; public slots: signals: void signal_newLogText( QString txt ); private slots: void slot_addLog( QString value ); private: void writeToLog( QString string ); Ui_formMainWindow *ui; protected: }; #endif vokoscreenNG-3.0.2/src/log/QvkLogController.cpp000066400000000000000000000025731362045215000214470ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include #include #include #include "QvkLogController.h" #include "QvkLog.h" QPointer vklog; void myMessageOutput( QtMsgType type, const QMessageLogContext &context, const QString &msg ) { vklog->outputMessage( type, context, msg ); } QvkLogController::QvkLogController( Ui_formMainWindow *ui_mainwindow ) { vklog = new QvkLog( ui_mainwindow ); qInstallMessageHandler( myMessageOutput ); } QvkLogController::~QvkLogController() { } QString QvkLogController::get_logPath() { return vklog->logFile.fileName(); } vokoscreenNG-3.0.2/src/log/QvkLogController.h000066400000000000000000000022471362045215000211120ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKLOGCONTROLLER_H #define QVKLOGCONTROLLER_H #include "ui_formMainWindow.h" #include class QvkLogController : public QObject { Q_OBJECT public: QvkLogController( Ui_formMainWindow *ui_mainwindow); virtual ~QvkLogController(); QString get_logPath(); public slots: signals: private slots: private: protected: }; #endif vokoscreenNG-3.0.2/src/log/log.pri000066400000000000000000000003361362045215000167640ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkLog.h \ $$PWD/QvkLogController.h SOURCES += $$PWD/QvkLog.cpp \ $$PWD/QvkLogController.cpp vokoscreenNG-3.0.2/src/magnifier/000077500000000000000000000000001362045215000166455ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/magnifier/QvkMagnifier.cpp000066400000000000000000000267671362045215000217560ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkMagnifier.h" #include QvkMagnifier::QvkMagnifier() { faktor = 2; label = new QLabel( this ); slot_magnifier200x200(); resize( 2 * distanceX * faktor, 2 * distanceY * faktor ); setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::ToolTip ); //With tooltip, no entry in Taskbar border = 3; label->setGeometry( QRect( 0 + border, 0 + border, this->width() - 2 * border, this->height() - 2 * border ) ); label->setAlignment( Qt::AlignCenter ); label->setScaledContents( true ); timer = new QTimer( this ); connect( timer, SIGNAL( timeout() ), this, SLOT( slot_mytimer() ) ); } QvkMagnifier::~QvkMagnifier() { } void QvkMagnifier::slot_magnifierShow( bool value ) { if ( value == true ) { show(); timer->start( 40 ); } if ( value == false ) { close(); timer->stop(); } } void QvkMagnifier::slot_magnifier200x200() { distanceX = 50; distanceY = 50; resize( 2 * distanceX * faktor, 2 * distanceY * faktor ); label->setGeometry( QRect( 0 + border, 0 + border, this->width() - 2 * border, this->height() - 2 * border ) ); } void QvkMagnifier::slot_magnifier400x200() { distanceX = 100; distanceY = 50; resize( 2 * distanceX * faktor, 2 * distanceY * faktor ); label->setGeometry( QRect( 0 + border, 0 + border, this->width() - 2 * border, this->height() - 2 * border ) ); } void QvkMagnifier::slot_magnifier600x200() { distanceX = 150; distanceY = 50; resize( 2 * distanceX * faktor, 2 * distanceY * faktor ); label->setGeometry( QRect( 0 + border, 0 + border, this->width() - 2 * border, this->height() - 2 * border ) ); } int QvkMagnifier::NewDistanceXLeft() { QCursor cursor; QScreen *screen = QGuiApplication::primaryScreen(); int newDistanceX = ( ( screen->geometry().width() / 2 ) - cursor.pos().x() ) * ( distanceX + ( width() / 2 ) ) / ( screen->geometry().width() / 2 - distanceX ) - ( width() / 2 ); return newDistanceX; } int QvkMagnifier::NewDistanceXRight() { QCursor cursor; QScreen *screen = QGuiApplication::primaryScreen(); int newDistanX = ( ( screen->geometry().width() / 2 ) - cursor.pos().x() ) * ( -distanceX - ( width() / 2 ) ) / ( screen->geometry().width() / 2 - distanceX ) - ( width() / 2 ); return newDistanX; } void QvkMagnifier::setMagnifier() { QCursor cursor; QScreen *screen = QGuiApplication::primaryScreen(); // Lupe an oberen linke Ecke setzen if ( ( cursor.pos().x() < distanceX ) and ( cursor.pos().y() < distanceY ) ) { move( 2 * distanceX, 2 * distanceY ); return; } // Lupe obere rechte Ecke setzen if ( ( cursor.pos().x() > ( screen->geometry().width() - distanceX ) ) and ( cursor.pos().y() < distanceY ) ) { move( screen->geometry().width() - 2 * distanceX - width(), 2 * distanceY); return; } // Lupe am oberen Rand setzen // Linke Hälfte am oberen Rand if ( ( cursor.pos().y() < distanceY ) and ( cursor.pos().x() < screen->geometry().width() / 2 ) ) { move( cursor.pos().x() + NewDistanceXLeft(), 2 * distanceY ); return; } // Rechte Hälfte am oberen Rand if ( ( cursor.pos().y() < distanceY ) and ( cursor.pos().x() > screen->geometry().width() / 2 ) ) { move( cursor.pos().x() - NewDistanceXRight() - width(), 2 * distanceY ); return; } // Lupe an untere rechte Ecke setzen if ( ( cursor.pos().x() > screen->geometry().width() - distanceX ) and ( cursor.pos().y() > screen->geometry().height() - distanceY ) ) { move( screen->geometry().width() - ( 2 * distanceX + width() ), screen->geometry().height() - ( 2 * distanceY + height() ) ); return; } // Lupe am rechten Rand setzen // Obere Hälfte am rechten Rand if ( ( cursor.pos().x() > screen->geometry().width() - distanceX ) and ( cursor.pos().y() < screen->geometry().height() / 10 * 8 ) )// div 2 { move( screen->geometry().width() - ( 2 * distanceX + width() ), cursor.pos().y() + 1 * distanceY ); return; } // untere Hälfte am rechten Rand if ( ( cursor.pos().x() > screen->geometry().width() - distanceX ) and ( cursor.pos().y() > screen->geometry().height() / 10 * 8 ) ) { move( screen->geometry().width() - ( 2 * distanceX + width() ), cursor.pos().y() - distanceY - height() ); return; } // Lupe an linken unteren Ecke setzen if ( ( cursor.pos().x() < distanceX ) and ( cursor.pos().y() > screen->geometry().height() - distanceY ) ) { move( 2 * distanceX, screen->geometry().height() - 2 * distanceY - height() ); return; } // Lupe am unteren Rand setzen // Linke Hälfte unterer Rand if ( ( cursor.pos().x() < screen->geometry().width() / 2 ) and ( cursor.pos().y() > screen->geometry().height() - distanceY ) ) { move( cursor.pos().x() + NewDistanceXLeft(), screen->geometry().height() - ( 2 * distanceY + height() ) ); return; } // Rechte Hälfte unterer Rand if ( ( cursor.pos().x() > screen->geometry().width() / 2 ) and ( cursor.pos().y() > screen->geometry().height() - distanceY ) ) { move( cursor.pos().x() - NewDistanceXRight() - width(), screen->geometry().height() - 2 * distanceY - height() ); return; } // Lupe am linken Rand setzen // Obere Hälfte am linken Rand if ( ( cursor.pos().x() < distanceX ) and ( cursor.pos().y() < screen->geometry().height() / 10 * 8 ) ) // div 2 { move( 2 * distanceX, cursor.pos().y() + distanceY ); return; } // Untere Hälfte am linken Rand if ( ( cursor.pos().x() < distanceX ) and ( cursor.pos().y() > screen->geometry().height() / 10 * 8 ) ) { move( 2 * distanceX, cursor.pos().y() - distanceY - height() ); return; } // Linke obere Hälfte if ( ( cursor.pos().x() < screen->geometry().width() / 2 ) and ( cursor.pos().y() < screen->geometry().height() / 10 * 8 ) ) move( cursor.pos().x() + NewDistanceXLeft(), cursor.pos().y() + distanceY ); // Rechte obere Hälfte if ( ( cursor.pos().x() > screen->geometry().width() / 2 ) and ( cursor.pos().y() < screen->geometry().height() / 10 * 8 ) ) move( cursor.pos().x() - NewDistanceXRight() - width(), cursor.pos().y() + distanceY ); // Linke untere Hälfte if ( ( cursor.pos().x() < screen->geometry().width() / 2 ) and ( cursor.pos().y() > screen->geometry().height() / 10 * 8 ) ) move( cursor.pos().x() + NewDistanceXLeft(), cursor.pos().y() - distanceY - height() ); // Rechte untere Hälfte if ( ( cursor.pos().x() > screen->geometry().width() / 2 ) and ( cursor.pos().y() > screen->geometry().height() / 10 * 8 ) ) move( cursor.pos().x() - NewDistanceXRight() -width(), cursor.pos().y() - distanceY - height() ); } void QvkMagnifier::slot_mytimer() { QCursor cursor; QPixmap originalPixmap = QPixmap(); QScreen *screen = QGuiApplication::primaryScreen(); setMagnifier(); // Obere linke Ecke if ( ( cursor.pos().x() < distanceX ) and ( cursor.pos().y() < distanceY ) ) { originalPixmap = screen->grabWindow( 0, 0, 0, 2 * distanceX, 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Obere rechte Ecke if ( ( cursor.pos().x() > ( screen->geometry().width() - distanceX ) ) and ( cursor.pos().y() < distanceY ) ) { originalPixmap = screen->grabWindow( 0, screen->geometry().width() - 2 * distanceX, 0, 2 * distanceX , 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Linke untere Ecke if ( ( cursor.pos().x() < distanceX ) and ( cursor.pos().y() > screen->geometry().height() - distanceY ) ) { originalPixmap = screen->grabWindow( 0, 0, screen->geometry().height() - 2 * distanceY, 2 * distanceX , 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Rechte untere Ecke if ( ( cursor.pos().x() > screen->geometry().width() - distanceX ) and ( cursor.pos().y() > screen->geometry().height() - distanceY ) ) { originalPixmap = screen->grabWindow( 0, screen->geometry().width() - 2 * distanceX, screen->geometry().height() - 2 * distanceY, 2 * distanceX , 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Unterer Rand if ( cursor.pos().y() > screen->geometry().height() - distanceY ) { originalPixmap = screen->grabWindow( 0, cursor.pos().x() - distanceX, screen->geometry().height() - 2 * distanceY, 2 * distanceX , 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Oberen Rand if ( cursor.pos().y() < distanceY ) { originalPixmap = screen->grabWindow( 0, cursor.pos().x() - distanceX, 0, 2 * distanceX, 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Rechter Rand if ( cursor.pos().x() > screen->geometry().width() - distanceX ) { originalPixmap = screen->grabWindow( 0, screen->geometry().width() - 2 * distanceX, cursor.pos().y() - distanceY, 2 * distanceX , 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Linker Rand if ( cursor.pos().x() < distanceX ) { originalPixmap = screen->grabWindow( 0, 0, cursor.pos().y() - distanceY, 2 * distanceX , 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Fläche originalPixmap = screen->grabWindow( 0, cursor.pos().x() - distanceX, cursor.pos().y() - distanceY, 2 * distanceX , 2 * distanceY ); label->setPixmap( originalPixmap ); } vokoscreenNG-3.0.2/src/magnifier/QvkMagnifier.h000066400000000000000000000027461362045215000214120ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKMAGNIFIER_H #define QVKMAGNIFIER_H #include #include #include #include #include #include class QvkMagnifier: public QDialog { Q_OBJECT public: QvkMagnifier(); virtual ~QvkMagnifier(); public slots: void slot_magnifierShow( bool value ); void slot_magnifier200x200(); void slot_magnifier400x200(); void slot_magnifier600x200(); private slots: void slot_mytimer(); protected: signals: private: int NewDistanceXLeft(); int NewDistanceXRight(); void setMagnifier(); QLabel *label; int border; int distanceX; int distanceY; int faktor; QTimer *timer; }; #endif vokoscreenNG-3.0.2/src/magnifier/QvkMagnifierController.cpp000066400000000000000000000037261362045215000240100ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkMagnifierController.h" #include "QvkSpezialSlider.h" QvkMagnifierController::QvkMagnifierController(Ui_formMainWindow *ui_mainwindow ) : vkMagnifier(new QvkMagnifier) { QvkSpezialSlider *sliderMagnification = new QvkSpezialSlider( Qt::Horizontal ); ui_mainwindow->horizontalLayout_8->addWidget( sliderMagnification ); sliderMagnification->setObjectName("sliderMagnification"); sliderMagnification->setTracking( true ); sliderMagnification->setMinimum( 1 ); sliderMagnification->setMaximum( 3 ); sliderMagnification->show(); connect( ui_mainwindow->checkBoxMagnifier, SIGNAL( clicked( bool ) ), vkMagnifier, SLOT( slot_magnifierShow( bool ) ) ); connect( sliderMagnification, SIGNAL( valueChanged( int ) ), this, SLOT( slot_valueChanged( int ) ) ); sliderMagnification->setValue( 2 ); } QvkMagnifierController::~QvkMagnifierController() { } void QvkMagnifierController::slot_valueChanged( int value ) { if ( value == 1 ) vkMagnifier->slot_magnifier200x200(); if ( value == 2 ) vkMagnifier->slot_magnifier400x200(); if ( value == 3 ) vkMagnifier->slot_magnifier600x200(); } vokoscreenNG-3.0.2/src/magnifier/QvkMagnifierController.h000066400000000000000000000023621362045215000234500ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKMAGNIFIERCONTROLLER_H #define QVKMAGNIFIERCONTROLLER_H #include "ui_formMainWindow.h" #include "QvkMagnifier.h" class QvkMagnifierController : public QObject { Q_OBJECT public: QvkMagnifierController( Ui_formMainWindow *ui_mainwindow ); virtual ~QvkMagnifierController(); public slots: private slots: void slot_valueChanged( int value ); private: QvkMagnifier *vkMagnifier; protected: signals: }; #endif vokoscreenNG-3.0.2/src/magnifier/QvkMagnifierDialog.ui000066400000000000000000000061451362045215000227150ustar00rootroot00000000000000 MagnifierDialog 0 0 295 204 Dialog 130 150 :/pictures/magnifier/magnifier.png true false 30 30 Qt::Vertical 20 40 &200 x 200 &400 x 200 true &600 x 200 Qt::Vertical 20 40 QDialogButtonBox::Ok vokoscreenNG-3.0.2/src/magnifier/magnifier.pri000066400000000000000000000003521362045215000213220ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkMagnifierController.h \ $$PWD/QvkMagnifier.h SOURCES += $$PWD/QvkMagnifierController.cpp \ $$PWD/QvkMagnifier.cpp vokoscreenNG-3.0.2/src/main.cpp000066400000000000000000000061621362045215000163410ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "mainwindow.h" #include "global.h" #include #include #include int main(int argc, char *argv[]) { QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); QApplication app(argc, argv); QStringList arguments = QApplication::instance()->arguments(); if ( !arguments.empty() and ( arguments.count() == 2 ) ) { QStringList arguments = QApplication::instance()->arguments(); if ( ( arguments.at(1) == "--help" ) or ( arguments.at(1) == "-h" ) ) { qDebug(" "); qDebug().noquote() << "Usage:" << global::name << "[Option] [File or URL]"; qDebug(" "); qDebug().noquote() << "Options:"; qDebug().noquote() << " -h or --help Print this message"; qDebug().noquote() << " -v or --version Print" << global::name << "version"; return 0; } if ( ( arguments.at(1) == "--version" ) or ( arguments.at(1) == "-v" ) ) { qDebug().noquote() << global::name << global::version; return 0; } // If call from terminal and local file not exists QFile file( arguments.at(1) ); if ( ( file.exists() == false ) and ( arguments.at(1).contains( "http://" ) == false ) and ( arguments.at(1).contains( "https://" ) == false ) ) { qDebug().noquote() << global::nameOutput << arguments.at(1) << "file not exists"; return 1; } } // Initialize GStreamer #ifdef Q_OS_WIN QString pathString = QDir::currentPath(); QByteArray pathByteArray; pathByteArray.append( pathString ); qputenv( "GSTREAMER_1_0_ROOT_X86", pathByteArray ); qputenv( "GST_PLUGIN_PATH", pathByteArray ); #endif gst_init (&argc, &argv); QTranslator * qtTranslator = new QTranslator(); qtTranslator->load( "qt_" + QLocale::system().name(), QLibraryInfo::location( QLibraryInfo::TranslationsPath ) ); app.installTranslator( qtTranslator ); QTranslator translator; translator.load( QLocale::system().name(), ":/language" ); app.installTranslator( &translator ); QvkMainWindow w; w.show(); return app.exec(); } vokoscreenNG-3.0.2/src/mainwindow.cpp000066400000000000000000002452541362045215000176000ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "mainwindow.h" #include "ui_formMainWindow.h" #include "QvkInformation.h" #include "QvkGlobalShortcut.h" #include "QvkLogController.h" #include "global.h" #include "QvkScreenManager.h" #include "QvkLicenses.h" #include "QvkLoadExtension.h" #include #include #include #include #include #include #include #include #include #include #include #include #ifdef Q_OS_LINUX #include #endif #ifdef Q_OS_LINUX QvkMainWindow::QvkMainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::formMainWindow), vkWinInfo(new QvkWinInfo), vkCountdown(new QvkCountdown), vkRegionChoise(new QvkRegionChoise) #endif #ifdef Q_OS_WIN QvkMainWindow::QvkMainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::formMainWindow), vkWinInfo(new QvkWinInfo), vkCountdown(new QvkCountdown), vkRegionChoise(new QvkRegionChoise) #endif { ui->setupUi(this); sliderScreencastCountDown = new QvkSpezialSlider( Qt::Horizontal ); ui->gridLayout_9->addWidget( sliderScreencastCountDown, 2, 1 ); sliderScreencastCountDown->setObjectName("sliderScreencastCountDown"); sliderScreencastCountDown->setTracking( true ); sliderScreencastCountDown->setMinimum( 0 ); sliderScreencastCountDown->setMaximum( 30 ); sliderScreencastCountDown->setValue( 0 ); sliderScreencastCountDown->show(); sliderFrames = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayout_5->addWidget( sliderFrames ); sliderFrames->setObjectName("sliderFrames"); sliderFrames->setTracking( true ); sliderFrames->setMinimum( 10 ); sliderFrames->setMaximum( 144 ); sliderFrames->setValue( 25 ); sliderFrames->show(); sliderX264 = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayout_x264->insertWidget( 2, sliderX264 ); sliderX264->setObjectName("sliderX264"); sliderX264->setTracking( true ); sliderX264->setMinimum( 0 ); sliderX264->setMaximum( 50 ); sliderX264->setValue( 17 ); sliderX264->show(); sliderOpenh264 = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayout_openh264->insertWidget( 1, sliderOpenh264 ); sliderOpenh264->setObjectName("sliderOpenh264"); sliderOpenh264->setTracking( true ); sliderOpenh264->setMinimum( 0 ); sliderOpenh264->setMaximum( 50 ); sliderOpenh264->setValue( 23 ); sliderOpenh264->show(); sliderLimitOfFreeDiskSpace = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayout_27->insertWidget( 3, sliderLimitOfFreeDiskSpace ); sliderLimitOfFreeDiskSpace->setObjectName( "sliderLimitOfFreeDiskSpace" ); sliderLimitOfFreeDiskSpace->setMinimum( 100 ); sliderLimitOfFreeDiskSpace->setMaximum( 999 ); sliderLimitOfFreeDiskSpace->setValue( 250 ); sliderLimitOfFreeDiskSpace->show(); sliderShowInSystrayAlternative = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayout_18->insertWidget( 1, sliderShowInSystrayAlternative ); sliderShowInSystrayAlternative->setObjectName( "sliderShowInSystrayAlternative" ); sliderShowInSystrayAlternative->setMinimum( 24 ); sliderShowInSystrayAlternative->setMaximum( 64 ); sliderShowInSystrayAlternative->setValue( 48 ); sliderShowInSystrayAlternative->show(); sliderHour = new QvkSpezialSlider( Qt::Horizontal ); ui->verticalLayout_14->addWidget( sliderHour ); sliderHour->setObjectName( "sliderHour" ); sliderHour->setMinimum( 0 ); sliderHour->setMaximum( 23 ); sliderHour->setValue( 0 ); sliderHour->show(); sliderMinute = new QvkSpezialSlider( Qt::Horizontal ); ui->verticalLayout_14->addWidget( sliderMinute ); sliderMinute->setObjectName( "sliderMinute" ); sliderMinute->setMinimum( 0 ); sliderMinute->setMaximum( 59 ); sliderMinute->setValue( 0 ); sliderMinute->show(); sliderSecondWaitBeforeRecording = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayout_7->insertWidget( 1, sliderSecondWaitBeforeRecording ); sliderSecondWaitBeforeRecording->setObjectName( "sliderSecondWaitBeforeRecording" ); sliderSecondWaitBeforeRecording->setMinimum( 0 ); sliderSecondWaitBeforeRecording->setMaximum( 3 ); sliderSecondWaitBeforeRecording->setValue( 1 ); sliderSecondWaitBeforeRecording->show(); sliderStopRecordingAfterHouers = new QvkSpezialSlider( Qt::Horizontal ); ui->verticalLayout_29->addWidget( sliderStopRecordingAfterHouers ); sliderStopRecordingAfterHouers->setObjectName( "sliderStopRecordingAfterHouers" ); sliderStopRecordingAfterHouers->setMinimum( 0 ); sliderStopRecordingAfterHouers->setMaximum( 99 ); sliderStopRecordingAfterHouers->setValue( 0 ); sliderStopRecordingAfterHouers->show(); sliderStopRecordingAfterMinutes = new QvkSpezialSlider( Qt::Horizontal ); ui->verticalLayout_29->addWidget( sliderStopRecordingAfterMinutes ); sliderStopRecordingAfterMinutes->setObjectName( "sliderStopRecordingAfterMinutes" ); sliderStopRecordingAfterMinutes->setMinimum( 0 ); sliderStopRecordingAfterMinutes->setMaximum( 99 ); sliderStopRecordingAfterMinutes->setValue( 0 ); sliderStopRecordingAfterMinutes->show(); sliderStopRecordingAfterSeconds = new QvkSpezialSlider( Qt::Horizontal ); ui->verticalLayout_29->addWidget( sliderStopRecordingAfterSeconds ); sliderStopRecordingAfterSeconds->setObjectName( "sliderStopRecordingAfterSeconds" ); sliderStopRecordingAfterSeconds->setMinimum( 0 ); sliderStopRecordingAfterSeconds->setMaximum( 99 ); sliderStopRecordingAfterSeconds->setValue( 15 ); sliderStopRecordingAfterSeconds->show(); vkTheme = new QvkTheme( ui ); Q_UNUSED(vkTheme); QvkLogController *vklogController = new QvkLogController( ui ); Q_UNUSED(vklogController); vkRegionChoise->setFrameColor( Qt::darkGreen ); setWindowTitle( global::name + " " + global::version ); QIcon icon( QString::fromUtf8( ":/pictures/logo/logo.png" ) ); setWindowIcon( icon ); QvkMagnifierController *vkMagnifierController = new QvkMagnifierController(ui); Q_UNUSED(vkMagnifierController); vkPlayer = new QvkPlayer( this, ui ); QvkHelp *vkHelp = new QvkHelp( this, ui ); QvkLicenses *vkLicenses = new QvkLicenses( ui ); /* Wayland * If start with "./name -platform wayland" comes a Memory access error * On Wayland we have to time no access to GlobalShortcuts * We must disable this function for Wayland but not for X11 and Windows */ #ifdef Q_OS_LINUX if ( QX11Info::isPlatformX11() == true ) { QvkGlobalShortcut *vkGlobalShortcut = new QvkGlobalShortcut( this, ui ); Q_UNUSED(vkGlobalShortcut); } #endif #ifdef Q_OS_Win QvkGlobalShortcut *vkGlobalShortcut = new QvkGlobalShortcut( this, ui ); Q_UNUSED(vkGlobalShortcut); #endif QvkInformation *vkInformation = new QvkInformation( this, ui, sliderScreencastCountDown, sliderSecondWaitBeforeRecording ); connect( this, SIGNAL( signal_newVideoFilename( QString ) ), vkInformation, SLOT( slot_newVideoFilename( QString ) ) ); vkLimitDiskFreeSpace = new QvkLimitDiskFreeSpace( ui, sliderLimitOfFreeDiskSpace ); qDebug().noquote() << global::nameOutput << "Version:" << global::version; qDebug().noquote() << global::nameOutput << "Locale:" << QLocale::system().name(); QDateTime dateTime = QDateTime::currentDateTime(); qDebug().noquote() << global::nameOutput << "Log from:" << dateTime.toString( "yyyy-MM-dd hh:mm:ss" ); QLocale locale; qDebug().noquote() << global::nameOutput << "Country:" << QLocale::countryToString( locale.country() ); qDebug().noquote() << global::nameOutput << "Qt:" << qVersion(); qDebug().noquote() << global::nameOutput << gst_version_string(); qDebug().noquote() << global::nameOutput << "Operating system:" << QSysInfo::prettyProductName(); qDebug().noquote() << global::nameOutput << "CPU Architecture:" << QSysInfo::currentCpuArchitecture(); qDebug().noquote() << global::nameOutput << global::name << "running as:" << QGuiApplication::platformName() << "client"; #ifdef Q_OS_LINUX qDebug().noquote() << global::nameOutput << global::name << "running on:" << qgetenv( "XDG_SESSION_TYPE" ).toLower(); #endif qDebug().noquote() << global::nameOutput << "Desktop:" << qgetenv( "XDG_CURRENT_DESKTOP" ); qDebug().noquote() << global::nameOutput << "Icon-Theme:" << QIcon::themeName(); qDebug().noquote() << global::nameOutput << "Styles:" << QStyleFactory::keys(); qDebug().noquote() << global::nameOutput << "Qt-PluginsPath: " << QLibraryInfo::location( QLibraryInfo::PluginsPath ); qDebug().noquote() << global::nameOutput << "Qt-TranslationsPath:" << QLibraryInfo::location( QLibraryInfo::TranslationsPath ); qDebug().noquote() << global::nameOutput << "Qt-LibraryPath: " << QLibraryInfo::location( QLibraryInfo::LibrariesPath ); qDebug().noquote() << global::nameOutput << "Settings:" << vkSettings.getFileName(); qDebug().noquote() << global::nameOutput << "Log:" << vklogController->get_logPath(); #ifdef Q_OS_LINUX qDebug().noquote() << global::nameOutput << "CompositingManager running:" << QX11Info::isCompositingManagerRunning(); #endif qDebug(); // only values with modulo 4 == 0 resolutionStringList << "320 x 200 CGA 16 : 10" << "320 x 240 QCGA 4 : 3" << "640 x 480 VGA 4 : 3" << "720 x 480 NTSC 3 : 2" << "800 x 480 WVGA 5 : 3" << "800 x 600 SVGA 4 : 3" << "1024 x 768 XVGA 4 : 3" << "1152 x 768 N/A 3 : 2" << "1280 x 720 HD-720 16 : 9" << "1280 x 768 WXGA 5 : 3" << "1280 x 800 WXGA 16 : 10" << "1280 x 1024 SXGA 5 : 4" << "1920 x 1080 HD1080 16 : 9"; vk_setCornerWidget( ui->tabWidgetScreencast ); // Bar for start, stop etc. connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->pushButtonStart, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->pushButtonStop, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->pushButtonPause, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->pushButtonContinue, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->pushButtonPlay, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->radioButtonScreencastFullscreen, SLOT( setEnabled( bool ) ) ); #ifdef Q_OS_LINUX connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->radioButtonScreencastWindow, SLOT( setEnabled( bool ) ) ); #endif connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->radioButtonScreencastArea, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->comboBoxScreencastScreen, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->labelScreencastCountdownText, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), sliderScreencastCountDown, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->frameAudio, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->labelFrames, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), sliderFrames, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->labelFormat, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->comboBoxFormat, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->labelVideoCodec, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->comboBoxVideoCodec, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), this, SLOT( slot_IfStartAudioCodecWidgetsSetEnabled() ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->frameVideoCodecx264, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->frameVideoCodecVaapih264, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->checkBoxMouseCursorOnOff,SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->frameVideoPath, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->frameLimitOfFreeDiskSpace, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->frameStartTime, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->checkBoxStopRecordingAfter, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->frameStopRecordingAfter, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->checkBoxMinimizedWhenRecordingStarts, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), this, SLOT( slot_preStart() ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->pushButtonStop, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->pushButtonStart, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->pushButtonPause, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->pushButtonPlay, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->radioButtonScreencastFullscreen, SLOT( setDisabled( bool ) ) ); #ifdef Q_OS_LINUX connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->radioButtonScreencastWindow, SLOT( setDisabled( bool ) ) ); #endif connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->radioButtonScreencastArea, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->comboBoxScreencastScreen, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->labelScreencastCountdownText, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), sliderScreencastCountDown, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->frameAudio, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->labelFrames, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), sliderFrames, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->labelFormat, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->comboBoxFormat, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->labelVideoCodec, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->comboBoxVideoCodec, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), this, SLOT( slot_IfStopAudioCodecWidgetsSetDisabled() ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->frameVideoCodecx264, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->frameVideoCodecVaapih264, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->checkBoxMouseCursorOnOff,SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->frameVideoPath, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->frameLimitOfFreeDiskSpace, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->frameStartTime, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->checkBoxStopRecordingAfter, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->checkBoxMinimizedWhenRecordingStarts, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), this, SLOT( slot_preStop() ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), this, SLOT( slot_Stop() ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), this, SLOT( slot_Pause() ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), ui->pushButtonPause, SLOT( hide() ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), ui->pushButtonContinue, SLOT( show() ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), ui->pushButtonStop, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), ui->pushButtonContinue, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), this, SLOT( slot_Continue() ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), ui->pushButtonContinue, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), ui->pushButtonContinue, SLOT( hide() ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), ui->pushButtonPause, SLOT( show() ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), ui->pushButtonStop, SLOT( setDisabled( bool ) ) ); ui->pushButtonContinue->hide(); connect( ui->pushButtonPlay, SIGNAL( clicked( bool ) ), this, SLOT( slot_Play() ) ); connect( ui->pushButtonScreencastOpenfolder, SIGNAL( clicked( bool ) ), this, SLOT( slot_Folder() ) ); // Tab 1 Screen #ifdef Q_OS_WIN ui->radioButtonScreencastWindow->setEnabled( false ); ui->radioButtonScreencastWindow->setVisible( false ); ui->help_screencast_window->setVisible( false ); #endif ui->radioButtonScreencastFullscreen->setText( tr("Fullscreen") ); // QT Creator sets an ampersand, translation now here ui->radioButtonScreencastWindow->setText( tr("Window") ); // QT Creator sets an ampersand, translation now here connect( ui->radioButtonScreencastFullscreen, SIGNAL( toggled( bool ) ), ui->toolButtonScreencastAreaReset, SLOT( setDisabled( bool ) ) ); connect( ui->radioButtonScreencastFullscreen, SIGNAL( toggled( bool ) ), ui->comboBoxAreaSize, SLOT( setDisabled( bool ) ) );//** connect( ui->radioButtonScreencastWindow, SIGNAL( toggled( bool ) ), ui->comboBoxScreencastScreen, SLOT( setDisabled( bool ) ) ); connect( ui->radioButtonScreencastWindow, SIGNAL( toggled( bool ) ), ui->toolButtonScreencastAreaReset, SLOT( setDisabled( bool ) ) ); connect( ui->radioButtonScreencastWindow, SIGNAL( toggled( bool ) ), ui->comboBoxAreaSize, SLOT( setDisabled( bool ) ) ); connect( this, SIGNAL( signal_close() ), vkRegionChoise, SLOT( close() ) ); connect( ui->radioButtonScreencastArea, SIGNAL( toggled( bool ) ), vkRegionChoise, SLOT( setVisible( bool ) ) ); connect( ui->radioButtonScreencastArea, SIGNAL( toggled( bool ) ), ui->comboBoxScreencastScreen, SLOT( setDisabled( bool ) ) ); connect( ui->radioButtonScreencastArea, SIGNAL( toggled( bool ) ), ui->toolButtonScreencastAreaReset, SLOT( setEnabled( bool ) ) ); connect( ui->radioButtonScreencastArea, SIGNAL( toggled( bool ) ), ui->comboBoxAreaSize, SLOT( setEnabled( bool ) ) ); connect( ui->toolButtonScreencastAreaReset, SIGNAL( clicked( bool ) ), vkRegionChoise, SLOT( slot_areaReset() ) ); connect( ui->toolButtonScreencastAreaReset, SIGNAL( clicked( bool ) ), this, SLOT( slot_areaReset() ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), this, SLOT( slot_disableAreaWidgets() ) ); connect( ui->pushButtonStop , SIGNAL( clicked( bool ) ), this, SLOT( slot_enableAreaWidgets() ) ); ui->comboBoxAreaSize->addItems( resolutionStringList ); connect( ui->comboBoxAreaSize, SIGNAL( currentIndexChanged( QString ) ), this, SLOT( slot_areaSetResolution( QString ) ) ); // Tab 2 Audio and Videocodec #ifdef Q_OS_LINUX QvkAudioPulse *vkAudioPulse = new QvkAudioPulse( ui ); connect( vkAudioPulse, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), this, SLOT( slot_audioIconOnOff( bool ) ) ); connect( vkAudioPulse, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), ui->labelAudioCodec, SLOT( setEnabled( bool ) ) ); connect( vkAudioPulse, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), ui->comboBoxAudioCodec, SLOT( setEnabled( bool ) ) ); vkAudioPulse->init(); #endif #ifdef Q_OS_WIN QvkAudioWindows *vkAudioWindows = new QvkAudioWindows( ui ); connect( vkAudioWindows, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), this, SLOT( slot_audioIconOnOff( bool ) ) ); connect( vkAudioWindows, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), ui->labelAudioCodec, SLOT( setEnabled( bool ) ) ); connect( vkAudioWindows, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), ui->comboBoxAudioCodec, SLOT( setEnabled( bool ) ) ); vkAudioWindows->init(); #endif connect( vkTheme, SIGNAL( signal_newTheme() ), this, SLOT( slot_audioRedCross() ) ); connect( ui->comboBoxFormat, SIGNAL( currentTextChanged( QString ) ), this, SLOT( slot_set_available_VideoCodecs_in_Combox( QString ) ) ); connect( ui->comboBoxFormat, SIGNAL( currentTextChanged( QString ) ), this, SLOT( slot_set_available_AudioCodecs_in_Combox( QString ) ) ); connect( ui->comboBoxVideoCodec, SIGNAL( currentIndexChanged( QString ) ), this, SLOT( slot_videoCodecChanged( QString ) ) ); connect( ui->toolButtonx264Reset, SIGNAL( clicked( bool ) ), this, SLOT( slot_x264Reset() ) ); connect( ui->toolButtonOpenh264Reset, SIGNAL( clicked( bool ) ), this, SLOT( slot_openh264Reset() ) ); // Tab 3 Time connect( ui->checkBoxStartTime, SIGNAL( toggled( bool ) ), this, SLOT( slot_StartTimer( bool ) ) ); timerStartTimer = new QTimer(); timerStartTimer->setTimerType( Qt::PreciseTimer ); connect( timerStartTimer, SIGNAL( timeout() ), this, SLOT( slot_startTime() ) ); connect( ui->checkBoxStartTime, SIGNAL( clicked( bool ) ), ui->pushButtonStart, SLOT( setHidden( bool ) ) ); connect( ui->checkBoxStartTime, SIGNAL( clicked( bool ) ), ui->labelScreencastCountdownText, SLOT( setDisabled( bool ) ) ); connect( ui->checkBoxStartTime, SIGNAL( clicked( bool ) ), sliderScreencastCountDown, SLOT( setDisabled( bool ) ) ); connect( ui->checkBoxStopRecordingAfter, SIGNAL( toggled( bool ) ), ui->frameStopRecordingAfter, SLOT( setEnabled( bool ) ) ); connect( timerStopRecordingAfter, SIGNAL( timeout() ), ui->pushButtonStop, SLOT( click() ) ); // Tab 4 Misc videoFileSystemWatcher = new QFileSystemWatcher(); connect( ui->PushButtonVideoPath, SIGNAL( clicked( bool ) ), this, SLOT( slot_newVideoPath() ) ); connect( ui->lineEditVideoPath, SIGNAL( textChanged( QString ) ), this, SLOT( slot_videoFileSystemWatcherSetNewPath() ) ); connect( ui->lineEditVideoPath, SIGNAL( textChanged( QString ) ), this, SLOT( slot_videoFileSystemWatcherSetButtons() ) ); connect( videoFileSystemWatcher, SIGNAL( directoryChanged( const QString& ) ), this, SLOT( slot_videoFileSystemWatcherSetButtons() ) ); ui->lineEditVideoPath->setText( QStandardPaths::writableLocation( QStandardPaths::MoviesLocation ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->frameScale, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->frameScale, SLOT( setDisabled( bool ) ) ); vkSystrayAlternative = new QvkSystrayAlternative( this, ui, sliderShowInSystrayAlternative ); if ( QSystemTrayIcon::isSystemTrayAvailable() == true ) { connect( ui->checkBoxShowInSystray, SIGNAL( clicked( bool ) ), this, SLOT( slot_setVisibleSystray( bool ) ) ); ui->frameShowInSystrayAlternative->hide(); } else { connect( ui->checkBoxShowInSystrayAlternative, SIGNAL( clicked( bool ) ), vkSystrayAlternative, SLOT( setVisible( bool ) ) ); ui->frameShowInSystray->hide(); } // Tab 5 Available muxer, encoder etc. QIcon iconAvailable = style()->standardIcon( QStyle::SP_DialogApplyButton ); QSize size = iconAvailable.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); ui->labelAvalible->setPixmap( iconAvailable.pixmap( size, QIcon::Normal, QIcon::On )); QIcon iconNotAvailable = style()->standardIcon( QStyle::SP_DialogCancelButton ); ui->labelNotAvailable->setPixmap( iconNotAvailable.pixmap( size, QIcon::Normal, QIcon::On )); // End Tabs // Tab 6 About QPixmap pixmap( ":/pictures/screencast/author.png" ); ui->labelAutorPicture->setPixmap( pixmap ); ui->labelSourcecodeUrl->setText( "" + tr( "Sourcecode" ) + "" ); ui->labelWebSiteUrl->setText( "" + tr( "Homepage" ) + "" ); ui->labelLanguageUrl->setText( "" + tr( "Translations" ) + "" ); ui->labelDonateUrl->setText( "" + tr( "Donate" ) + "" ); // Close GUI connect( this, SIGNAL( signal_close() ), ui->pushButtonContinue, SLOT( click() ) ); connect( this, SIGNAL( signal_close() ), ui->pushButtonStop, SLOT( click() ) ); connect( this, SIGNAL( signal_close( bool ) ), ui->checkBoxCameraOnOff,SLOT( setChecked( bool ) ) ); connect( this, SIGNAL( signal_close() ), vkHelp, SLOT( close() ) ); connect( this, SIGNAL( signal_close() ), vkLicenses, SLOT( close() ) ); connect( this, SIGNAL( signal_close() ), vkSystrayAlternative, SLOT( close() ) ); VK_Supported_Formats_And_Codecs(); VK_Check_is_Format_available(); VK_set_available_Formats_in_Combox(); VK_gst_formatVideoAudoicodec_available(); VK_gst_Elements_available(); QvkScreenManager *screenManager = new QvkScreenManager; connect( screenManager, SIGNAL( signal_clear_widget() ), ui->comboBoxScreencastScreen, SLOT( clear() ) ); connect( screenManager, SIGNAL( signal_screen_count_changed( QString, QString) ), this, SLOT( slot_screenCountChanged( QString, QString ) ) ); emit qApp->screenAdded(Q_NULLPTR); // *****************Begin Camera ********************************* vkCameraController = new QvkCameraController(ui); Q_UNUSED(vkCameraController); vk_setCornerWidget( ui->tabWidgetCamera ); // *****************End Camera *********************************** // *****************Begin Log ********************************* vk_setCornerWidget( ui->tabWidgetLog ); connect( ui->pushButtonSendReport, SIGNAL( clicked( bool ) ), this, SLOT( slot_sendReport() ) ); // *****************End Log *********************************** ui->label_Upate->clear(); QPalette palette = QPalette( ui->label_Upate->palette() ); palette.setColor( palette.WindowText, QColor( Qt::magenta ) ); ui->label_Upate->setPalette( palette ); connect( &version, SIGNAL( signal_newVersionAvailable( QString ) ), this, SLOT( slot_newVersionAvailable( QString ) ) ); connect( ui->checkBoxLookForUpdates, SIGNAL( toggled( bool ) ), &version, SLOT( slot_doDownload( bool ) ) ); QvkLoadExtension *loadExtension = new QvkLoadExtension( this, ui ); loadExtension->loadExtension(); // Hint: vkSettings.readAll( ui, this ); vkSettings.readAreaScreencast( vkRegionChoise ); vkSettings.readCamera( vkCameraController ); vkSettings.readSystrayAlternative( vkSystrayAlternative ); vkSettings.readPlayerPathOpenFile( vkPlayer ); // After reading the settings, we read the arguments and run QStringList arguments = QApplication::instance()->arguments(); if ( arguments.count() > 1 ) { qDebug().noquote() << global::nameOutput << "started from file:" << arguments.at(1); vkPlayer->setMediaFile( arguments.at(1) ); vkPlayer->slot_play(); ui->tabWidgetSideBar->setCurrentIndex( ui->tabWidgetSideBar->indexOf( ui->tabSidebarPlayer ) ); } } QvkMainWindow::~QvkMainWindow() { delete ui; } void QvkMainWindow::closeEvent( QCloseEvent *event ) { Q_UNUSED(event); vkSettings.saveAll( ui, this, false ); vkSettings.saveAreaScreencast( vkRegionChoise->getXRecordArea() / vkRegionChoise->screen->devicePixelRatio(), vkRegionChoise->getYRecordArea() / vkRegionChoise->screen->devicePixelRatio(), vkRegionChoise->getWidth() / vkRegionChoise->screen->devicePixelRatio(), vkRegionChoise->getHeight() / vkRegionChoise->screen->devicePixelRatio() ); vkSettings.saveCamera( vkCameraController->cameraWindow->geometry().x(), vkCameraController->cameraWindow->geometry().y() ); vkSettings.saveSystrayAlternative( vkSystrayAlternative->x(), vkSystrayAlternative->y() ); vkSettings.savePlayerPathOpenFile( vkPlayer->pathOpenFile ); emit signal_close(); emit signal_close( false ); } void QvkMainWindow::slot_newVersionAvailable( QString update ) { if ( ui->checkBoxLookForUpdates->isChecked() == true ) { if ( global::version < update ) { ui->label_Upate->setText( "New Version available: " + update ); } else { ui->label_Upate->setText( "No update available" ); } } else { ui->label_Upate->clear(); } } void QvkMainWindow::slot_vokoPlayer() { vkPlayer->show(); } #ifdef Q_OS_LINUX void QvkMainWindow::showEvent( QShowEvent *event ) { Q_UNUSED(event); // Call slot "afterWindowShown" after the window has been shown QMetaObject::invokeMethod( this, "slot_afterWindowShown", Qt::ConnectionType::QueuedConnection ); } void QvkMainWindow::slot_afterWindowShown() { if ( onlyOnce == false ) { onlyOnce = true; if ( qgetenv( "XDG_SESSION_TYPE" ).toLower() == "wayland" ) { qDebug().noquote() << global::nameOutput << tr( "Desktop session is a Wayland session" ); QMessageBox *messageBox = new QMessageBox(); QIcon icon( QString::fromUtf8( ":/pictures/logo/logo.png" ) ); messageBox->setWindowIcon( icon ); messageBox->setWindowTitle( global::name + " " + global::version ); messageBox->setIcon( QMessageBox::Information ); messageBox->setText( tr( "Wayland desktop session detected" ) ); messageBox->setInformativeText( tr( "To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session" ) ); messageBox->exec(); } else { qDebug().noquote() << global::nameOutput << "Desktop session is a X11 session"; } // This is only for GNOME if ( qgetenv( "XDG_CURRENT_DESKTOP" ).toLower() == "gnome" ) { // Problem 1. Limit the availableSize without the top Menue QScreen *screen = QGuiApplication::primaryScreen(); vkRegionChoise->screenWidth = screen->availableSize().width(); vkRegionChoise->screenHeight = screen->availableSize().height(); // Problem 2. At the first start of area, the Gnome menu hide. if ( ui->radioButtonScreencastArea->isChecked() == true ) { ui->radioButtonScreencastFullscreen->click(); ui->radioButtonScreencastArea->click(); return; } if ( ui->radioButtonScreencastFullscreen->isChecked() == true ) { ui->radioButtonScreencastArea->click(); ui->radioButtonScreencastFullscreen->click(); return; } if ( ui->radioButtonScreencastWindow->isChecked() == true ) { ui->radioButtonScreencastArea->click(); ui->radioButtonScreencastWindow->click(); return; } } } } #endif void QvkMainWindow::slot_x264Reset() { ui->comboBoxx264Preset->setCurrentIndex( 1 ); sliderX264->setValue( 17 ); } void QvkMainWindow::slot_openh264Reset() { sliderOpenh264->setValue( 23 ); } void QvkMainWindow::slot_videoCodecChanged( QString codec ) { ui->frameVideoCodecx264->setVisible( false ); ui->frameVideoCodecVaapih264->setVisible( false ); ui->frameVideoCodecOpenh264->setVisible( false ); if ( codec == "x264" ) { ui->frameVideoCodecx264->setVisible( true ); } if ( codec == "H.264 (Intel GPU)" ) { ui->frameVideoCodecVaapih264->setVisible( true ); } if ( codec == "openh264" ) { ui->frameVideoCodecOpenh264->setVisible( true ); } } void QvkMainWindow::slot_sendReport() { #ifdef Q_OS_WIN QString eol = "\r\n"; #endif #ifdef Q_OS_LINUX QString eol = "\n"; #endif QStringList stringList; stringList << "mailto:"; stringList << "vkohaupt@freenet.de"; stringList << "?"; stringList << "subject="; stringList << QString( global::name + QString( " " ) + global::version ); stringList << "&"; stringList << "body="; stringList << "Your comment"; stringList << eol; stringList << eol; stringList << eol; stringList << "Report:"; stringList << eol; stringList << ui->textBrowserLog->toPlainText(); stringList << eol; stringList << "--------------------------------"; stringList << eol; stringList << "Settings:"; stringList << eol; stringList << vkSettings.getFileName(); stringList << eol; // read conf QFile file( vkSettings.getFileName() ); if( !file.open( QIODevice::ReadOnly) ) { QMessageBox::information( Q_NULLPTR, "error", file.errorString() ); } QTextStream in( &file ); while( !in.atEnd() ) { QString line = in.readLine() + eol; stringList << line; } file.close(); QString string = stringList.join( "" ); bool b = QDesktopServices::openUrl( QUrl( string, QUrl::TolerantMode ) ); Q_UNUSED(b); } void QvkMainWindow::slot_setVisibleSystray( bool value ) { if ( value == false ) { vkSystray->slot_closeSystray(); delete vkSystray; } if ( value == true ) { vkSystray = new QvkSystray(ui); vkSystray->init(); connect( vkSystray, SIGNAL( signal_SystemtrayIsClose() ), this, SLOT( close() ) ); connect( this, SIGNAL( signal_close() ), vkSystray, SLOT( slot_closeSystray() ) ); } } void QvkMainWindow::slot_IfStartAudioCodecWidgetsSetEnabled() { if ( isAudioDeviceSelected() == true ) { ui->labelAudioCodec->setEnabled( false ); ui->comboBoxAudioCodec->setEnabled( false ); } } void QvkMainWindow::slot_IfStopAudioCodecWidgetsSetDisabled() { if ( isAudioDeviceSelected() == true ) { ui->labelAudioCodec->setEnabled( true ); ui->comboBoxAudioCodec->setEnabled( true ); } } void QvkMainWindow::slot_areaSetResolution( QString value ) { vkRegionChoise->setWidth( value.section( " ", 0, 0 ).toInt() ); vkRegionChoise->setHeight( value.section( " ", 2, 2 ).toInt() ); } void QvkMainWindow::slot_areaReset() { ui->comboBoxAreaSize->setCurrentIndex( 0 ); } void QvkMainWindow::slot_disableAreaWidgets() { if ( ui->radioButtonScreencastArea->isChecked() == true ) { ui->toolButtonScreencastAreaReset->setEnabled( false ); ui->comboBoxAreaSize->setEnabled( false ); } } void QvkMainWindow::slot_enableAreaWidgets() { if ( ui->radioButtonScreencastArea->isChecked() == true ) { ui->toolButtonScreencastAreaReset->setEnabled( true ); ui->comboBoxAreaSize->setEnabled( true ); } } void QvkMainWindow::slot_StartTimer( bool value ) { if ( value == true ) { timerStartTimer->start( 1000 ); } else { timerStartTimer->stop(); } } void QvkMainWindow::slot_startTime() { QTime time; if ( ( time.currentTime().hour() == sliderHour->value() ) and ( time.currentTime().minute() == sliderMinute->value() ) and ( time.currentTime().second() == 0 ) ) { ui->pushButtonStart->setVisible( true ); ui->pushButtonStart->click(); } } void QvkMainWindow::slot_newVideoPath() { QString dir = QFileDialog::getExistingDirectory( this, "", QStandardPaths::writableLocation( QStandardPaths::HomeLocation ), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks ); if ( dir > "" ) { ui->lineEditVideoPath->setText( dir ); } } void QvkMainWindow::slot_videoFileSystemWatcherSetNewPath() { if ( !videoFileSystemWatcher->directories().isEmpty() ) { videoFileSystemWatcher->removePaths( videoFileSystemWatcher->directories() ); } videoFileSystemWatcher->addPath( ui->lineEditVideoPath->text() ); } void QvkMainWindow::slot_videoFileSystemWatcherSetButtons() { QDir dir( ui->lineEditVideoPath->text() ); QStringList filters; filters << global::name +"*"; QStringList List = dir.entryList( filters, QDir::Files, QDir::Time ); if ( List.isEmpty() || ( ui->pushButtonStart->isEnabled() == false ) ) { ui->pushButtonPlay->setEnabled( false ); } else { ui->pushButtonPlay->setEnabled( true ); } } void QvkMainWindow::resizeEvent( QResizeEvent *event ) { emit signal_resizeEvent( event ); } void QvkMainWindow::vk_setCornerWidget( QTabWidget *tabWidget ) { #ifdef Q_OS_LINUX QPixmap pixmap( ":/pictures/linux.png" ); #endif #ifdef Q_OS_WIN QPixmap pixmap( ":/pictures/windows.png" ); #endif pixmap = pixmap.scaled( QSize( 48, 48 ), Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); QLabel *label = new QLabel(); label->setPixmap( pixmap ); label->setEnabled( false ); tabWidget->setCornerWidget( label, Qt::TopRightCorner); } // If new Theme, set or not set red cross void QvkMainWindow::slot_audioRedCross() { if ( isAudioDeviceSelected() == true ) { slot_audioIconOnOff( true ); } else { slot_audioIconOnOff( false ); } } bool QvkMainWindow::isAudioDeviceSelected() { bool value = false; QList listCheckBox = ui->scrollAreaAudioDevice->findChildren(); for ( int i = 0; i < listCheckBox.count(); i++ ) { if ( listCheckBox.at(i)->checkState() == Qt::Checked ) { value = true; break; } } return value; } /* * Set a new icon with a red cross */ void QvkMainWindow::slot_audioIconOnOff( bool state ) { if ( ( ( isAudioDeviceSelected() == false ) and ( state == false ) ) or ( ( isAudioDeviceSelected() == false ) and ( state == true ) ) or ( ( isAudioDeviceSelected() == true ) and ( state == false ) ) ) { QIcon myIcon = vkTheme->VK_getIcon( "audio-input-microphone", ":/pictures/screencast/microphone.png" ); QSize size = ui->tabWidgetScreencast->iconSize(); QPixmap workPixmap( myIcon.pixmap( size ) ); QPainter painter; QPen pen; painter.begin( &workPixmap ); pen.setColor( Qt::red ); pen.setWidth( 2 ); painter.setPen( pen ); painter.drawLine ( 5, 5, size.width()-5, size.height()-5 ); painter.drawLine ( 5, size.height()-5, size.width()-5, 5 ); painter.end(); vkTheme->makeAndSetValidIcon( ui->tabWidgetScreencast, ui->tabWidgetScreencast->indexOf( ui->tabAudio ), QIcon( workPixmap ) ); } else{ vkTheme->makeAndSetValidIcon( ui->tabWidgetScreencast, ui->tabWidgetScreencast->indexOf( ui->tabAudio ), vkTheme->VK_getIcon( "audio-input-microphone", ":/pictures/screencast/microphone.png" ) ); } } #ifdef Q_OS_LINUX QString QvkMainWindow::VK_getXimagesrc() { QString value = ""; QString showPointer = "true"; if( ui->checkBoxMouseCursorOnOff->checkState() == Qt::Checked ) { showPointer = "false"; } if ( ui->radioButtonScreencastFullscreen->isChecked() == true ) { QStringList stringList; stringList << "ximagesrc" << "display-name=" + qgetenv( "DISPLAY" ) << "use-damage=false" << "show-pointer=" + showPointer << "startx=" + get_x_From_Screen() << "starty=" + get_y_From_Screen() << "endx=" + QString::number( get_x_From_Screen().toInt() + get_width_From_Screen().toInt()-1 ) << "endy=" + QString::number( get_y_From_Screen().toInt() + get_height_From_Screen().toInt()-1 ); value = stringList.join( " " ); } if( ui->radioButtonScreencastWindow->isChecked() == true ) { QString xid; if ( ui->checkBoxStartTime->isChecked() == true ) { xid = QString::number( QvkWinInfo::activeWindow() ); } else { xid = QString::number( vkWinInfo->getWinID() ); } QStringList stringList; stringList << "ximagesrc" << "display-name=" + qgetenv( "DISPLAY" ) << "use-damage=false" << "show-pointer=" + showPointer << "xid=" + xid; value = stringList.join( " " ); } if ( ui->radioButtonScreencastArea->isChecked() == true ) { qreal gnomehack = 0; if ( qgetenv( "XDG_CURRENT_DESKTOP" ).toLower() == "gnome" ) { QList screen = QGuiApplication::screens(); gnomehack = screen.at( ui->comboBoxScreencastScreen->currentIndex() )->availableGeometry().top(); } QStringList stringList; stringList << "ximagesrc" << "display-name=" + qgetenv( "DISPLAY" ) << "use-damage=false" << "show-pointer=" + showPointer << "startx=" + QString::number( vkRegionChoise->getXRecordArea() ) << "starty=" + QString::number( vkRegionChoise->getYRecordArea() + gnomehack ) << "endx=" + QString::number( vkRegionChoise->getXRecordArea() + vkRegionChoise->getWidth() - 1 ) << "endy=" + QString::number( vkRegionChoise->getYRecordArea() + gnomehack + vkRegionChoise->getHeight() - 1 ); value = stringList.join( " " ); } return value; } #endif #ifdef Q_OS_WIN QString QvkMainWindow::VK_getXimagesrc() { QString value; QString showPointer = "true"; if( ui->checkBoxMouseCursorOnOff->checkState() == Qt::Checked ) { showPointer = "false"; } if( ui->radioButtonScreencastFullscreen->isChecked() == true ) { QStringList stringList; stringList << "gdiscreencapsrc" << "monitor=" + QString::number( ui->comboBoxScreencastScreen->currentIndex() ) << "cursor=" + showPointer; value = stringList.join( " " ); } if ( ui->radioButtonScreencastArea->isChecked() == true ) { QStringList stringList; stringList << "gdiscreencapsrc" << "cursor=" + showPointer << "x=" + QString::number( vkRegionChoise->getXRecordArea() ) << "y=" + QString::number( vkRegionChoise->getYRecordArea() ) << "width=" + QString::number( vkRegionChoise->getWidth() ) << "height=" + QString::number( vkRegionChoise->getHeight() ); value = stringList.join( " " ); } return value; } #endif QString QvkMainWindow::VK_getCapsFilter() { QStringList stringList; stringList << "video/x-raw, framerate=" << QString::number( sliderFrames->value() ) << "/1"; return QString( stringList.join( "" ) ); } QString QvkMainWindow::VK_scale() { QString value = ""; int modulo = 4; if ( ui->radioButtonScreencastFullscreen->isChecked() == true ) { int width = get_width_From_Screen().toInt(); int height = get_height_From_Screen().toInt(); if ( ( get_width_From_Screen().toInt() % modulo ) > 0 ) { width = get_width_From_Screen().toInt() - ( get_width_From_Screen().toInt() % modulo ) + modulo; } if ( ( get_height_From_Screen().toInt() % modulo ) > 0 ) { height = get_height_From_Screen().toInt() - ( get_height_From_Screen().toInt() % modulo ) + modulo; } value = "videoscale ! video/x-raw, width=" + QString::number( width ) + ", height=" + QString::number( height ) + " !"; } if ( ui->radioButtonScreencastArea->isChecked() == true ) { int width = (int)vkRegionChoise->getWidth(); int height = (int)vkRegionChoise->getHeight(); if ( ( (int)vkRegionChoise->getWidth() % modulo ) > 0 ) { width = (int)vkRegionChoise->getWidth() - ( (int)vkRegionChoise->getWidth() % modulo ) + modulo; } if ( ( (int)vkRegionChoise->getHeight() % modulo ) > 0 ) { height = (int)vkRegionChoise->getHeight() - ( (int)vkRegionChoise->getHeight() % modulo ) + modulo; } value = "videoscale ! video/x-raw, width=" + QString::number( width ) + ", height=" + QString::number( height ) + " !"; } #ifdef Q_OS_LINUX if ( ui->radioButtonScreencastWindow->isChecked() == true ) { int modulo = 2; QRectF rect = vkWinInfo->windowGeometryWithoutFrame( vkWinInfo->getWinID() ); int width = (int)rect.width(); int height = (int)rect.height(); if ( ( width % modulo ) > 0 ) { width = width - ( width % modulo ); } if ( ( height % modulo ) > 0 ) { height = height - ( height % modulo ); } value = "videoscale ! video/x-raw, width=" + QString::number( width ) + ", height=" + QString::number( height ) + " !"; } #endif return value; } void QvkMainWindow::VK_gst_Elements_available() { QStringList list; #ifdef Q_OS_WIN list << "gdiscreencapsrc"; #endif #ifdef Q_OS_LINUX list << "ximagesrc"; list << "pulsesrc"; #endif list << "queue"; list << "capsfilter"; list << "videoconvert"; list << "videorate"; list << "audioconvert"; list << "audiorate"; list << "filesink"; list << "videoscale"; list << "h264parse"; list << "adder"; for ( int i = 0; i < list.count(); i++ ) { GstElementFactory *factory = gst_element_factory_find( QString( list.at(i) ).toLatin1() ); if ( !factory ) { qDebug().noquote() << global::nameOutput << "-" << list.at(i); } else { qDebug().noquote() << global::nameOutput << "+" << list.at(i); gst_object_unref( factory ); } } qDebug(); } // Check format, video and audoicodec on tab availability void QvkMainWindow::VK_gst_formatVideoAudoicodec_available() { int rowCount = 0; for ( int i = 0; i < globalFormatsList.count(); i++ ) { int rowMuxer = 1; int rowVideo = 1; int rowAudio = 1; QStringList listElements = QString( globalFormatsList.at(i) ).split( "," ); // listElement beinhaltet muxer, Video und Audio for ( int x = 0; x < listElements.count(); x++ ) { // Mimetype is not needed if ( listElements.at(x).contains( QRegExp( "*mimetype*", Qt::CaseInsensitive, QRegExp::Wildcard ) ) ) { continue; } bool available; QString element = QString( listElements.at( x ) ).section( ":", 1, 1 ); GstElementFactory *factory = gst_element_factory_find( element.toLatin1() ); if ( !factory ) { available = false; } else { available = true; gst_object_unref( factory ); } if ( QString( listElements.at( x ) ).section( ":", 0, 0 ) == "muxer" ) { QLabel *labelPicture = new QLabel(); QIcon icon; if ( available == true ) icon = style()->standardIcon( QStyle::SP_DialogApplyButton ); else icon = style()->standardIcon( QStyle::SP_DialogCancelButton ); QSize size = icon.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); labelPicture->setPixmap( icon.pixmap( size, QIcon::Normal, QIcon::On )); labelPicture->setAlignment( Qt::AlignRight ); ui->gridLayoutAvailable->addWidget( labelPicture, rowCount + rowMuxer, 0 ); ui->gridLayoutAvailable->addWidget( new QLabel( QString( listElements.at( x ) ).section( ":", 2, 2 ) ), rowCount + rowMuxer, 1 ); rowMuxer++; } if ( QString( listElements.at( x ) ).section( ":", 0, 0 ) == "videocodec" ) { QLabel *labelPicture = new QLabel(); QIcon icon; if ( available == true ) icon = style()->standardIcon( QStyle::SP_DialogApplyButton ); else icon = style()->standardIcon( QStyle::SP_DialogCancelButton ); QSize size = icon.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); labelPicture->setPixmap( icon.pixmap( size, QIcon::Normal, QIcon::On )); labelPicture->setAlignment( Qt::AlignRight ); ui->gridLayoutAvailable->addWidget( labelPicture, rowCount + rowVideo, 2 ); ui->gridLayoutAvailable->addWidget( new QLabel( QString( listElements.at( x ) ).section( ":", 2, 2 ) ), rowCount + rowVideo, 3 ); rowVideo++; } if ( QString( listElements.at( x ) ).section( ":", 0, 0 ) == "audiocodec" ) { QLabel *labelPicture = new QLabel(); QIcon icon; if ( available == true ) icon = style()->standardIcon( QStyle::SP_DialogApplyButton ); else icon = style()->standardIcon( QStyle::SP_DialogCancelButton ); QSize size = icon.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); labelPicture->setPixmap( icon.pixmap( size, QIcon::Normal, QIcon::On )); labelPicture->setAlignment( Qt::AlignRight ); ui->gridLayoutAvailable->addWidget( labelPicture, rowCount + rowAudio, 4 ); ui->gridLayoutAvailable->addWidget( new QLabel( QString( listElements.at( x ) ).section( ":", 2, 2 ) ), rowCount + rowAudio, 5 ); rowAudio++; } } rowCount = ui->gridLayoutAvailable->rowCount(); for ( int x = 0; x <= 5; x++ ) { QFrame *line = new QFrame(); line->setObjectName( QStringLiteral( "line" ) ); line->setFrameShape( QFrame::HLine ); line->setFrameShadow( QFrame::Sunken ); ui->gridLayoutAvailable->addWidget( line, rowCount, x ); QLabel *label = new QLabel; label->setText( " " ); ui->gridLayoutAvailable->addWidget( label, rowCount, x ); } } ui->gridLayoutAvailable->addItem( new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding), ui->gridLayoutAvailable->rowCount() + 1, 0 ); } // This is the base for format, video and audiocodec void QvkMainWindow::VK_Supported_Formats_And_Codecs() { QStringList MKV_QStringList = ( QStringList() << "muxer:matroskamux:mkv" << "videomimetype:video/x-matroska" << "audiomimetype:audio/x-matroska" << "videocodec:x264enc:x264" #ifdef Q_OS_LINUX << "videocodec:openh264enc:openh264" << "videocodec:vaapih264enc:H.264 (Intel GPU)" << "videocodec:vaapimpeg2enc:MPEG-2 (Intel GPU)" #endif << "videocodec:vp8enc:VP8" << "audiocodec:vorbisenc:vorbis" << "audiocodec:flacenc:flac" << "audiocodec:opusenc:opus" << "audiocodec:lamemp3enc:mp3" ); QStringList WEBM_QStringList = ( QStringList() << "muxer:webmmux:webm" << "videomimetype:video/webm" << "audiomimetype:audio/webm" << "videocodec:vp8enc:VP8" << "audiocodec:vorbisenc:vorbis" << "audiocodec:opusenc:opus" ); QStringList AVI_QStringList = ( QStringList() << "muxer:avimux:avi" << "videomimetype:video/x-msvideo" << "audiomimetype:audio/x-msvideo" << "videocodec:x264enc:x264" #ifdef Q_OS_LINUX << "videocodec:openh264enc:openh264" << "videocodec:vaapih264enc:H.264 (Intel GPU)" << "videocodec:vaapimpeg2enc:MPEG-2 (Intel GPU)" #endif << "videocodec:vp8enc:VP8" << "audiocodec:lamemp3enc:mp3" ); QStringList MP4_QStringList = ( QStringList() << "muxer:mp4mux:mp4" << "videomimetype:video/mp4" << "audiomimetype:audio/mpeg" << "videocodec:x264enc:x264" #ifdef Q_OS_LINUX << "videocodec:openh264enc:openh264" << "videocodec:vaapih264enc:H.264 (Intel GPU)" << "videocodec:vaapimpeg2enc:MPEG-2 (Intel GPU)" #endif << "audiocodec:lamemp3enc:mp3" << "audiocodec:opusenc:opus" ); QStringList MOV_QStringList = ( QStringList() << "muxer:qtmux:mov" << "videomimetype:video/mp4" << "audiomimetype:audio/mpeg" << "videocodec:x264enc:x264" #ifdef Q_OS_LINUX << "videocodec:openh264enc:openh264" << "videocodec:vaapih264enc:H.264 (Intel GPU)" << "videocodec:vaapimpeg2enc:MPEG-2 (Intel GPU)" #endif << "videocodec:vp8enc:VP8" << "audiocodec:lamemp3enc:mp3" << "audiocodec:opusenc:opus" ); videoFormatsList.clear(); videoFormatsList.append( MKV_QStringList.join( "," ) ); videoFormatsList.append( WEBM_QStringList.join( "," ) ); videoFormatsList.append( AVI_QStringList.join( "," ) ); videoFormatsList.append( MP4_QStringList.join( ",") ); videoFormatsList.append( MOV_QStringList.join( ",") ); globalFormatsList << videoFormatsList; } void QvkMainWindow::VK_Check_is_Format_available() { qDebug().noquote() << global::nameOutput << "Symbols: + available, - not available"; QStringList tempList; for ( int x = 0; x < videoFormatsList.count(); x++ ) { QString stringAllKeys = videoFormatsList.at( x ); QStringList listKeys = stringAllKeys.split( "," ); QStringList listKey = listKeys.filter( "muxer" ); QString muxer = QString( listKey.at( 0 ) ).section( ":", 1, 1 ); GstElementFactory *factory = gst_element_factory_find( muxer.toLatin1() ); if ( !factory ) { qDebug().noquote() << global::nameOutput << "-" << muxer; } else { qDebug().noquote() << global::nameOutput << "+" << muxer; tempList << videoFormatsList.at( x ); gst_object_unref( factory ); } } videoFormatsList.clear(); videoFormatsList << tempList; } void QvkMainWindow::VK_set_available_Formats_in_Combox() { ui->comboBoxFormat->clear(); for ( int x = 0; x < videoFormatsList.count(); x++ ) { QString stringAllKeys = videoFormatsList.at( x ); QStringList listKeys = stringAllKeys.split( "," ); QStringList listKeyMuxer = listKeys.filter( "muxer" ); QMimeDatabase mimeDatabase; QStringList listKeyVideoMimetype = listKeys.filter( "videomimetype" ); QMimeType mimetype = mimeDatabase.mimeTypeForName( QString( listKeyVideoMimetype.at( 0 ) ).section( ":", 1 ) ); QIcon icon = vkTheme->VK_getIcon( mimetype.iconName(), ":/pictures/screencast/strip.png" ); ui->comboBoxFormat->addItem( icon, // Picture QString( listKeyMuxer.at( 0 ) ).section( ":", 2, 2 ), // suffix QString( listKeyMuxer.at( 0 ) ).section( ":", 1, 1 ) ); // muxer } } void QvkMainWindow::slot_set_available_VideoCodecs_in_Combox( QString suffix ) { ui->comboBoxVideoCodec->clear(); QStringList listSuffix = videoFormatsList.filter( suffix ); QString stringSuffix = listSuffix.at( 0 ); QStringList listKeys = stringSuffix.split( "," ); QStringList listKeyVideoCodec = listKeys.filter( "videocodec" ); for ( int i = 0; i < listKeyVideoCodec.count(); i++ ) { QString encoder = QString( listKeyVideoCodec.at( i ) ).section( ":", 1, 1 ); QString name = QString( listKeyVideoCodec.at( i ) ).section( ":", 2, 2 ); GstElementFactory *factory = gst_element_factory_find( encoder.toLatin1() ); if ( !factory ) { qDebug().noquote() << global::nameOutput << "-" << encoder; } else { qDebug().noquote() << global::nameOutput << "+" << encoder; ui->comboBoxVideoCodec->addItem( name, encoder ); gst_object_unref( factory ); } } if ( ui->comboBoxVideoCodec->count() == 0 ) ui->pushButtonStart->setEnabled( false); else ui->pushButtonStart->setEnabled( true ); } void QvkMainWindow::slot_set_available_AudioCodecs_in_Combox( QString suffix ) { ui->comboBoxAudioCodec->clear(); QStringList listSuffix = videoFormatsList.filter( suffix ); QString stringSuffix = listSuffix.at( 0 ); QStringList listKeys = stringSuffix.split( "," ); QStringList listKeyAudioCodec = listKeys.filter( "audiocodec" ); for ( int i = 0; i < listKeyAudioCodec.count(); i++ ) { QString encoder = QString( listKeyAudioCodec.at( i ) ).section( ":", 1, 1 ); QString name = QString( listKeyAudioCodec.at( i ) ).section( ":", 2, 2 ); GstElementFactory *factory = gst_element_factory_find( encoder.toLatin1() ); if ( !factory ) { qDebug().noquote() << global::nameOutput << "-" << encoder; } else { qDebug().noquote() << global::nameOutput << "+" << encoder; ui->comboBoxAudioCodec->addItem( name, encoder ); gst_object_unref( factory ); } } qDebug(); } QString QvkMainWindow::Vk_get_Videocodec_Encoder() { QString vk_idealThreadCount; if ( QThread::idealThreadCount() == -1 ) { vk_idealThreadCount = "0"; } else { vk_idealThreadCount = QString::number( QThread::idealThreadCount() ); } QString value; QString encoder = ui->comboBoxVideoCodec->currentData().toString(); if ( encoder == "x264enc" ) { QStringList list; list << VK_scale(); list << ui->comboBoxVideoCodec->currentData().toString(); list << "qp-min=" + QString::number( sliderX264->value() ); list << "qp-max=" + QString::number( sliderX264->value() ); list << "speed-preset=" + ui->comboBoxx264Preset->currentText(); list << "threads=" + vk_idealThreadCount; list.removeAll( "" ); value = list.join( " " ); value.append( " ! video/x-h264, profile=baseline" ); } if ( encoder == "openh264enc" ) { QStringList list; list << ui->comboBoxVideoCodec->currentData().toString(); list << "qp-min=" + QString::number( sliderOpenh264->value() ); list << "qp-max=" + QString::number( sliderOpenh264->value() ); list << "usage-type=screen"; list << "complexity=low"; list << "multi-thread=" + vk_idealThreadCount; value = list.join( " " ); value.append( " ! h264parse" ); } if ( encoder == "x265enc" ) { value = "x265enc"; } if ( encoder == "vaapih264enc" ) { value = "vaapih264enc"; } if ( encoder == "vaapimpeg2enc" ) { value = "vaapimpeg2enc"; } if ( encoder == "vp8enc" ) { QStringList list; list << "vp8enc"; list << "min_quantizer=20"; list << "max_quantizer=20"; list << "cpu-used=" + vk_idealThreadCount; list << "deadline=1000000"; list << "threads=" + vk_idealThreadCount; value = list.join( " " ); } return value; } void QvkMainWindow::slot_preStart() { // Create Folder if not exists QDir dir( ui->lineEditVideoPath->text() ); if ( !dir.exists() ) { // check of QStandardPaths::MoviesLocation QDir dir( QStandardPaths::writableLocation( QStandardPaths::MoviesLocation ) ); if ( !dir.exists() ) { bool myBool = dir.mkpath( QStandardPaths::writableLocation( QStandardPaths::MoviesLocation ) ); Q_UNUSED(myBool); } ui->lineEditVideoPath->setText( QStandardPaths::writableLocation( QStandardPaths::MoviesLocation ) ); } if ( vkLimitDiskFreeSpace->isStorageOKMessagBoxByStart() == false ) { wantRecording = false; ui->pushButtonStop->click(); return; } if ( ui->checkBoxStopRecordingAfter->isChecked() == true ) { int value = sliderStopRecordingAfterHouers->value()*60*60*1000; value += sliderStopRecordingAfterMinutes->value()*60*1000; value += sliderStopRecordingAfterSeconds->value()*1000; value += sliderSecondWaitBeforeRecording->value()*1000; value += sliderScreencastCountDown->value()*1000; timerStopRecordingAfter->setTimerType( Qt::PreciseTimer ); timerStopRecordingAfter->start( value ); } if ( ( ui->radioButtonScreencastFullscreen->isChecked() == true ) and ( ui->checkBoxStartTime->isChecked() == true ) ) { slot_Start(); return; } if ( ( ui->radioButtonScreencastFullscreen->isChecked() == true ) and ( sliderScreencastCountDown->value() > 0 ) ) { disconnect( vkCountdown, nullptr, nullptr, nullptr ); connect( vkCountdown, SIGNAL( signal_countdownBegin( bool ) ), ui->pushButtonStop, SLOT( setDisabled( bool ) ) ); connect( vkCountdown, SIGNAL( signal_countdownBegin( bool ) ), ui->pushButtonPause, SLOT( setDisabled( bool ) ) ); connect( vkCountdown, SIGNAL( signal_countDownfinish( bool ) ), ui->pushButtonStop, SLOT( setEnabled( bool ) ) ); connect( vkCountdown, SIGNAL( signal_countDownfinish( bool ) ), ui->pushButtonPause, SLOT( setEnabled( bool ) ) ); connect( vkCountdown, SIGNAL( signal_countDownfinish( bool ) ), this, SLOT( slot_Start() ) ); vkCountdown->startCountdown( sliderScreencastCountDown->value() ); return; } if ( ui->radioButtonScreencastFullscreen->isChecked() == true ) { slot_Start(); return; } if ( ( ui->radioButtonScreencastWindow->isChecked() == true ) and ( ui->checkBoxStartTime->isChecked() == true ) ) { slot_Start(); return; } if ( ( ui->radioButtonScreencastWindow->isChecked() == true ) and ( sliderScreencastCountDown->value() > 0 ) ) { disconnect( vkWinInfo, nullptr, nullptr, nullptr ); disconnect( vkCountdown, nullptr, nullptr, nullptr ); connect( vkWinInfo, SIGNAL( signal_windowChanged( bool ) ), this, SLOT( slot_startCounter( bool ) ) ); connect( vkWinInfo, SIGNAL( signal_showCursor( bool ) ), ui->pushButtonStop, SLOT( setDisabled( bool ) ) ); connect( vkWinInfo, SIGNAL( signal_showCursor( bool ) ), ui->pushButtonPause, SLOT( setDisabled( bool ) ) ); connect( vkCountdown, SIGNAL( signal_countDownfinish( bool ) ), ui->pushButtonStop, SLOT( setEnabled( bool ) ) ); connect( vkCountdown, SIGNAL( signal_countDownfinish( bool ) ), ui->pushButtonPause, SLOT( setEnabled( bool ) ) ); connect( vkCountdown, SIGNAL( signal_countDownfinish( bool ) ), this, SLOT( slot_Start() ) ); vkWinInfo->slot_start(); return; } if ( ui->radioButtonScreencastWindow->isChecked() == true ) { disconnect( vkWinInfo, nullptr, nullptr, nullptr ); connect( vkWinInfo, SIGNAL( signal_showCursor( bool ) ), ui->pushButtonStop, SLOT( setDisabled( bool ) ) ); connect( vkWinInfo, SIGNAL( signal_showCursor( bool ) ), ui->pushButtonPause, SLOT( setDisabled( bool ) ) ); connect( vkWinInfo, SIGNAL( signal_windowChanged( bool ) ), ui->pushButtonStop, SLOT( setEnabled( bool ) ) ); connect( vkWinInfo, SIGNAL( signal_windowChanged( bool ) ), ui->pushButtonPause, SLOT( setEnabled( bool ) ) ); connect( vkWinInfo, SIGNAL( signal_windowChanged( bool ) ), this, SLOT( slot_Start() ) ); vkWinInfo->slot_start(); return; } if ( ( ui->radioButtonScreencastArea->isChecked() == true ) and ( ui->checkBoxStartTime->isChecked() == true ) ) { slot_Start(); return; } if ( ( ui->radioButtonScreencastArea->isChecked() == true ) and ( sliderScreencastCountDown->value() > 0 ) ) { disconnect( vkCountdown, nullptr, nullptr, nullptr ); connect( vkCountdown, SIGNAL( signal_countdownBegin( bool ) ), ui->pushButtonStop, SLOT( setDisabled( bool ) ) ); connect( vkCountdown, SIGNAL( signal_countdownBegin( bool ) ), ui->pushButtonPause, SLOT( setDisabled( bool ) ) ); connect( vkCountdown, SIGNAL( signal_countDownfinish( bool ) ), ui->pushButtonStop, SLOT( setEnabled( bool ) ) ); connect( vkCountdown, SIGNAL( signal_countDownfinish( bool ) ), ui->pushButtonPause, SLOT( setEnabled( bool ) ) ); connect( vkCountdown, SIGNAL( signal_countDownfinish( bool ) ), this, SLOT( slot_Start() ) ); vkRegionChoise->recordMode( true ); vkCountdown->startCountdown( sliderScreencastCountDown->value() ); return; } if ( ui->radioButtonScreencastArea->isChecked() == true ) { vkRegionChoise->recordMode( true ); vkRegionChoise->repaint(); vkRegionChoise->update(); slot_Start(); return; } } void QvkMainWindow::slot_startCounter( bool value ) { Q_UNUSED(value); if ( sliderScreencastCountDown->value() > 0 ) { vkCountdown->startCountdown( sliderScreencastCountDown->value() ); } } #ifdef Q_OS_LINUX QString QvkMainWindow::VK_get_AudioSystem() { return "pulsesrc"; } #endif #ifdef Q_OS_WIN QString QvkMainWindow::VK_get_AudioSystem() { return "directsoundsrc"; } #endif QString QvkMainWindow::VK_getMuxer() { QString value = ui->comboBoxFormat->currentData().toString(); if ( ui->comboBoxFormat->currentData().toString() == "matroskamux" ) { value = ui->comboBoxFormat->currentData().toString() + " name=mux writing-app=" + global::name + "_" + QString( global::version ).replace( " ", "_" ); } else { value = ui->comboBoxFormat->currentData().toString() + " name=mux"; } return value; } QStringList QvkMainWindow::VK_getSelectedAudioDevice() { QStringList list; QList listQCheckBox = ui->scrollAreaWidgetContentsAudioDevices->findChildren(); for ( int i = 0; i < listQCheckBox.count(); i++ ) { if ( listQCheckBox.at(i)->checkState() == Qt::Checked ) { list << listQCheckBox.at(i)->accessibleName(); } } return list; } QString QvkMainWindow::Pipeline_structured_output( QString pipeline ) { QString string; #ifdef Q_OS_LINUX string = pipeline.prepend( "gst-launch-1.0 -e \\\n " ); #endif #ifdef Q_OS_WIN string = pipeline.prepend( "gst-launch-1.0.exe -e \\\n " ); #endif string = pipeline.replace( "mux.", "mux. \\\n " ); string = pipeline.replace( "mix.", "mix. \\\n " ); string = pipeline.replace( "!", "\\\n !" ); string.append( "\n" ); return string; } void QvkMainWindow::slot_Start() { if ( ui->checkBoxMinimizedWhenRecordingStarts->isChecked() == true ) { setWindowState( Qt::WindowMinimized ); } QThread::msleep( static_cast( sliderSecondWaitBeforeRecording->value()) * 1000 ); QStringList VK_PipelineList; VK_PipelineList << VK_getXimagesrc(); VK_PipelineList << VK_getCapsFilter(); VK_PipelineList << "videoconvert"; VK_PipelineList << "videorate"; VK_PipelineList << Vk_get_Videocodec_Encoder(); // Only if one or more audiodevice is selected if ( ( VK_getSelectedAudioDevice().count() > 0 ) and ( ui->comboBoxAudioCodec->count() > 0 ) ) { VK_PipelineList << "queue"; VK_PipelineList << "mux."; } // Pipeline for one selected audiodevice // 2019-09-28 tested and ok on opensuse 15.0 und nativ Windows 10 from USB-Stick if ( ( VK_getSelectedAudioDevice().count() == 1 ) and ( ui->comboBoxAudioCodec->count() > 0 ) ) { #ifdef Q_OS_LINUX VK_PipelineList << VK_get_AudioSystem().append( " device=" ).append( VK_getSelectedAudioDevice().at(0) ); #endif #ifdef Q_OS_WIN VK_PipelineList << VK_get_AudioSystem().append( " device-name=" ).append( "'" + VK_getSelectedAudioDevice().at(0) +"'" ); #endif VK_PipelineList << "audio/x-raw, channels=2"; VK_PipelineList << "audioconvert"; VK_PipelineList << "audiorate"; VK_PipelineList << ui->comboBoxAudioCodec->currentData().toString(); VK_PipelineList << "queue"; VK_PipelineList << "mux."; } // Pipeline for more as one audiodevice if ( ( VK_getSelectedAudioDevice().count() > 1 ) and ( ui->comboBoxAudioCodec->count() > 0 ) ) { for ( int x = 0; x < VK_getSelectedAudioDevice().count(); x++ ) { #ifdef Q_OS_LINUX VK_PipelineList << VK_get_AudioSystem().append( " device=" ).append( VK_getSelectedAudioDevice().at(x) ); VK_PipelineList << "audio/x-raw, channels=2"; VK_PipelineList << "queue"; VK_PipelineList << "mix."; #endif #ifdef Q_OS_WIN VK_PipelineList << VK_get_AudioSystem().append( " device-name=" ).append( "'" + VK_getSelectedAudioDevice().at(x) +"'" ); VK_PipelineList << "audio/x-raw, channels=2"; VK_PipelineList << "queue"; VK_PipelineList << "mix."; #endif } VK_PipelineList << "adder name=mix"; VK_PipelineList << "audioconvert"; VK_PipelineList << "audiorate"; VK_PipelineList << ui->comboBoxAudioCodec->currentData().toString(); VK_PipelineList << "queue"; VK_PipelineList << "mux."; } VK_PipelineList << VK_getMuxer(); VK_PipelineList.removeAll( "" ); QString newVideoFilename = global::name + "-" + QDateTime::currentDateTime().toString( "yyyy-MM-dd_hh-mm-ss" ) + "." + ui->comboBoxFormat->currentText(); VK_PipelineList << "filesink location=" + ui->lineEditVideoPath->text() + "/" + newVideoFilename; // Write settings to log vkSettings.saveAll( ui, this, true ); QString VK_Pipeline = VK_PipelineList.join( VK_Gstr_Pipe ); VK_Pipeline = VK_Pipeline.replace( "mix. !", "mix." ); VK_Pipeline = VK_Pipeline.replace( "mux. !", "mux." ); qDebug().noquote() << global::nameOutput << "Start record with:" << VK_Pipeline; qDebug( " " ); qDebug().noquote() << Pipeline_structured_output( VK_Pipeline ); QByteArray byteArray = VK_Pipeline.toUtf8(); const gchar *line = byteArray.constData(); GError *error = Q_NULLPTR; pipeline = gst_parse_launch( line, &error ); // Start playing GstStateChangeReturn ret = gst_element_set_state( pipeline, GST_STATE_PLAYING ); if ( ret == GST_STATE_CHANGE_FAILURE ) { qDebug().noquote() << global::name << "Unable to set the pipeline to the playing state."; gst_object_unref( pipeline ); return; } emit signal_newVideoFilename( newVideoFilename ); } void QvkMainWindow::slot_preStop() { if ( ui->checkBoxStartTime->isChecked() == true ) { ui->checkBoxStartTime->click(); } if ( timerStopRecordingAfter->isActive() ) { timerStopRecordingAfter->stop(); ui->frameStopRecordingAfter->setEnabled( true ); } if ( ui->radioButtonScreencastArea->isChecked() == true ) { vkRegionChoise->recordMode( false ); vkRegionChoise->repaint(); vkRegionChoise->update(); } } void QvkMainWindow::slot_Stop() { if ( vkLimitDiskFreeSpace->isStorageOK() == false ) { ui->checkBoxShowInSystray->click(); ui->checkBoxShowInSystray->click(); } if ( wantRecording == true ) { // wait for EOS bool a = gst_element_send_event( pipeline, gst_event_new_eos() ); Q_UNUSED(a); GstClockTime timeout = 5 * GST_SECOND; GstMessage *msg = gst_bus_timed_pop_filtered( GST_ELEMENT_BUS (pipeline), timeout, GST_MESSAGE_EOS ); Q_UNUSED(msg); GstStateChangeReturn ret ; Q_UNUSED(ret); ret = gst_element_set_state( pipeline, GST_STATE_PAUSED ); ret = gst_element_set_state( pipeline, GST_STATE_READY ); ret = gst_element_set_state( pipeline, GST_STATE_NULL ); gst_object_unref( pipeline ); qDebug().noquote() << global::nameOutput << "Stop record"; } wantRecording = true; } void QvkMainWindow::slot_Pause() { if ( ui->pushButtonStart->isEnabled() == false ) { qDebug().noquote() << global::nameOutput << "Pause was clicked"; GstStateChangeReturn ret = gst_element_set_state( pipeline, GST_STATE_PAUSED ); // so wie es aussieht hängt er nur mit Audio if ( ret == GST_STATE_CHANGE_FAILURE ) { qDebug().noquote() << global::nameOutput << "Pause was clicked" << "GST_STATE_CHANGE_FAILURE" << "Returncode =" << ret; } // 0 if ( ret == GST_STATE_CHANGE_SUCCESS ) { qDebug().noquote() << global::nameOutput << "Pause was clicked" << "GST_STATE_CHANGE_SUCCESS" << "Returncode =" << ret; } // 1 if ( ret == GST_STATE_CHANGE_ASYNC ) { qDebug().noquote() << global::nameOutput << "Pause was clicked" << "GST_STATE_CHANGE_ASYNC" << "Returncode =" << ret; } // 2 if ( ret == GST_STATE_CHANGE_NO_PREROLL ){ qDebug().noquote() << global::nameOutput << "Pause was clicked" << "GST_STATE_CHANGE_NO_PREROLL" << "Returncode =" << ret; }// 3 /* wait until it's up and running or failed */ if (gst_element_get_state (pipeline, NULL, NULL, -1) == GST_STATE_CHANGE_FAILURE) { g_error ("Failed to go into PAUSED state"); } } } void QvkMainWindow::slot_Continue() { if ( ( ui->pushButtonStart->isEnabled() == false ) and ( ui->pushButtonContinue->isEnabled() == true ) ) { GstStateChangeReturn ret = gst_element_set_state( pipeline, GST_STATE_PLAYING ); if ( ret == GST_STATE_CHANGE_FAILURE ) { qDebug().noquote() << global::nameOutput << "Continue was clicked" << "GST_STATE_CHANGE_FAILURE" << "Returncode =" << ret; } // 0 if ( ret == GST_STATE_CHANGE_SUCCESS ) { qDebug().noquote() << global::nameOutput << "Continue was clicked" << "GST_STATE_CHANGE_SUCCESS" << "Returncode =" << ret; } // 1 if ( ret == GST_STATE_CHANGE_ASYNC ) { qDebug().noquote() << global::nameOutput << "Continue was clicked" << "GST_STATE_CHANGE_ASYNC" << "Returncode =" << ret; } // 2 if ( ret == GST_STATE_CHANGE_NO_PREROLL ){ qDebug().noquote() << global::nameOutput << "Continue was clicked" << "GST_STATE_CHANGE_NO_PREROLL" << "Returncode =" << ret; }// 3 /* wait until it's up and running or failed */ if (gst_element_get_state (pipeline, NULL, NULL, -1) == GST_STATE_CHANGE_FAILURE) { g_error ("Failed to go into PLAYING state"); } else { qDebug().noquote() << global::nameOutput << "Continue was clicked"; } } } void QvkMainWindow::slot_Play() { QDir dir( ui->lineEditVideoPath->text() ); QStringList filters; filters << global::name + "*"; QStringList videoFileList = dir.entryList( filters, QDir::Files, QDir::Time ); qDebug().noquote() << global::nameOutput << "play video with vokoplayer"; ui->tabWidgetSideBar->setCurrentIndex( ui->tabWidgetSideBar->indexOf( ui->tabSidebarPlayer ) ); QString string; string.append( ui->lineEditVideoPath->text() ); string.append( "/" ); string.append( videoFileList.at( 0 ) ); vkPlayer->setMediaFile( string ); vkPlayer->slot_play(); } void QvkMainWindow::slot_Folder() { if ( QDesktopServices::openUrl( QUrl( ui->lineEditVideoPath->text(), QUrl::TolerantMode ) ) == false ) { QMessageBox msgBox( this ); msgBox.setText( tr( "No filemanager found." ) + "\n" + tr( "Please install a filemanager." ) ); msgBox.setWindowTitle( global::name + " " + global::version ); msgBox.setIcon( QMessageBox::Information ); msgBox.exec(); } } QString QvkMainWindow::get_x_From_Screen() { QString value = ui->comboBoxScreencastScreen->currentData().toString().section( " ", 0, 0 ).split( "=" ).at( 1 ); return value; } QString QvkMainWindow::get_y_From_Screen() { QString value = ui->comboBoxScreencastScreen->currentData().toString().section( " ", 1, 1 ).split( "=" ).at( 1 ); return value; } QString QvkMainWindow::get_width_From_Screen() { QString value = ui->comboBoxScreencastScreen->currentData().toString().section( " ", 2, 2 ).split( "=" ).at( 1 ); return value; } QString QvkMainWindow::get_height_From_Screen() { QString value = ui->comboBoxScreencastScreen->currentData().toString().section( " ", 3, 3 ).split( "=" ).at( 1 ); return value; } void QvkMainWindow::slot_screenCountChanged( QString stringText, QString stringData ) { ui->comboBoxScreencastScreen->addItem( stringText, stringData ); qDebug().noquote() << global::nameOutput << "ItemText in Combobox:" << stringText; qDebug().noquote() << global::nameOutput << "ItemData in Combobox:" << stringData; qDebug(); } vokoscreenNG-3.0.2/src/mainwindow.h000066400000000000000000000125401362045215000172330ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include "QvkWinInfo.h" #include "QvkCountdown.h" #include "QvkRegionChoise.h" #include "QvkCameraController.h" #include "QvkSettings.h" #include "QvkHelp.h" #include "QvkSystray.h" #include "QvkMagnifierController.h" #include "QvkPlayer.h" #include "QvkTheme.h" #include "QvkLimitDiskFreeSpace.h" #include "QvkSpezialSlider.h" #include "QvkVersion.h" #include "QvkSystrayAlternative.h" #ifdef Q_OS_LINUX #include "QvkAudioPulse.h" #endif #ifdef Q_OS_WIN #include "QvkAudioWindows.h" #endif #include #include #include namespace Ui { class QvkMainWindow; } class QvkMainWindow : public QMainWindow { Q_OBJECT public: explicit QvkMainWindow( QWidget *parent = Q_NULLPTR ); ~QvkMainWindow(); Ui::formMainWindow *ui; QvkWinInfo *vkWinInfo; QvkCountdown *vkCountdown; QvkRegionChoise *vkRegionChoise; QvkHelp *vkHelp; QvkSystray *vkSystray; private: QvkSpezialSlider *sliderScreencastCountDown; QvkSpezialSlider *sliderFrames; QvkSpezialSlider *sliderX264; QvkSpezialSlider *sliderOpenh264; QvkSpezialSlider *sliderLimitOfFreeDiskSpace; QvkSpezialSlider *sliderShowInSystrayAlternative; QvkSpezialSlider *sliderHour; QvkSpezialSlider *sliderMinute; QvkSpezialSlider *sliderSecondWaitBeforeRecording; QvkSpezialSlider *sliderStopRecordingAfterHouers; QvkSpezialSlider *sliderStopRecordingAfterMinutes; QvkSpezialSlider *sliderStopRecordingAfterSeconds; QvkSettings vkSettings; QStringList resolutionStringList; const QString VK_Gstr_Pipe = " ! "; QString VK_GStreamer_Version(); QString VK_getXimagesrc(); QString VK_getCapsFilter(); QString VK_getMuxer(); QString Vk_get_Videocodec_Encoder(); QString VK_scale(); QFileSystemWatcher *videoFileSystemWatcher; GstElement *pipeline; GError *error = Q_NULLPTR; QStringList videoFormatsList; QStringList globalFormatsList; void VK_Supported_Formats_And_Codecs(); void VK_Check_is_Format_available(); void VK_set_available_Formats_in_Combox(); QString VK_get_AudioSystem(); QStringList VK_getSelectedAudioDevice(); QString get_x_From_Screen(); QString get_y_From_Screen(); QString get_width_From_Screen(); QString get_height_From_Screen(); void VK_gst_formatVideoAudoicodec_available(); void VK_gst_Elements_available(); QTimer *timerStartTimer; QTimer *timerStopRecordingAfter = new QTimer( this ); void vk_setCornerWidget( QTabWidget *tabWidget ); QvkPlayer *vkPlayer; QvkTheme *vkTheme; QvkCameraController *vkCameraController; QvkSystrayAlternative *vkSystrayAlternative; QvkLimitDiskFreeSpace *vkLimitDiskFreeSpace; bool wantRecording = true; void checkVideoPath(); bool isAudioDeviceSelected(); QvkVersion version; QString Pipeline_structured_output( QString pipeline ); bool onlyOnce = false; private slots: void slot_preStart(); void slot_Start(); void slot_preStop(); void slot_Stop(); void slot_Pause(); void slot_Continue(); void slot_Play(); void slot_Folder(); void slot_screenCountChanged( QString, QString ); void slot_audioIconOnOff(bool state ); void slot_audioRedCross(); void slot_newVideoPath(); void slot_videoFileSystemWatcherSetButtons(); void slot_videoFileSystemWatcherSetNewPath(); void slot_startCounter( bool value ); void slot_set_available_VideoCodecs_in_Combox( QString suffix ); void slot_set_available_AudioCodecs_in_Combox( QString suffix ); void slot_videoCodecChanged( QString codec ); void slot_x264Reset(); void slot_openh264Reset(); void slot_StartTimer( bool value ); void slot_startTime(); void slot_areaSetResolution( QString value ); void slot_areaReset(); void slot_disableAreaWidgets(); void slot_enableAreaWidgets(); void slot_IfStartAudioCodecWidgetsSetEnabled(); void slot_IfStopAudioCodecWidgetsSetDisabled(); void slot_setVisibleSystray( bool value ); void slot_sendReport(); void slot_vokoPlayer(); void slot_newVersionAvailable(QString update); #ifdef Q_OS_LINUX void slot_afterWindowShown(); #endif signals: void signal_close(); void signal_close( bool value ); void signal_newVideoFilename( QString ); void signal_resizeEvent( QResizeEvent *event ); protected: void closeEvent( QCloseEvent *event ); void resizeEvent( QResizeEvent *event ); #ifdef Q_OS_LINUX void showEvent( QShowEvent *event ); #endif }; #endif // MAINWINDOW_H vokoscreenNG-3.0.2/src/pictures/000077500000000000000000000000001362045215000165425ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/pictures/camera/000077500000000000000000000000001362045215000177725ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/pictures/camera/camera.license000066400000000000000000000001311362045215000225610ustar00rootroot00000000000000[license] author= url=https://openclipart.org/detail/170690/webcam license=Public Domain vokoscreenNG-3.0.2/src/pictures/camera/camera.png000066400000000000000000000405011362045215000217300ustar00rootroot00000000000000PNG  IHDR,,tFbKGD̿ pHYs'ttIME IDATxyWu￷zU3-Yeٲ-YȲMB I C> lż%@X^pH!NLbL,U^de-O[GUwU=3R3Us=\A\Y\)1VU19B! Er f 3pA'yl|_TlS^V6ͬ΅4{N'9qXy¸벲5>uRN6cZw GďJ\Su --Vb'oZAv+ã߹5z`]BZz'kp C % եX+G7._+v89Z9=:ͽ[oyJs{4^9\Gl9$\3=VRbE<+@p[WU?__>k4|;[HTZwS>=c6^SØ ܡ>>/>xe`gIM)8Bh֬}U-Q~p쁵d6DU!gjΩ |D|,}Xݏb[~` VnGKdGȏ*ܾk>}M_XWhlRR~*LGX0?>͟?sV~Ji / TC _G?s;2=:`WǃѬoOߓ߽+DˎocA@puRZo'7jl!PMG+|&|JNj^x]+#lSyy_>E Vĸn ;VkV oxV+٪hPBhu տ.?V?kVˤw3a6ۃM߄X9'nq,ZulV _-CtO7_3A =X5 >ֺhC84X6rx;a #ob,KğDۮOM1l9QO|`{2\D . ?jq9|Ϯ#=P Ľ ra  O=t[^|[pA%ZC+,  G캫3|Vܡ e`::fpv-ʒ՛X h"{Sx~ ɒ_V!o|%\>w$*At?k")X_iLM [S'pL_1H߉#j72loɼJ%*PF %J DB3v ϗX~xGIFAX$KEJ[-!N>'4Cg8#߹PCDu݉5;d"igrHAG$KrJog/ ePu NH 1 Y:=F/-X0{w+3XP+PAY9<.lAaFWY޵]`G \Ps \yX%.qF%dhoKwm(~UP2)fR^x>m^`!g[v7勌j%wd8Y*OA&黮3 kXy'Qss8YE`^K r [q‡#W`Wyypƌ>ˤNwi]l ^(A~ OSsDZC l C,=Ւ[/;.^!Muf<4G8Uq^8XOVLZ-?/6O9Wm(. oŲGXb%@^P_ ew?~YuzvL]hD`n9EXџc]Y-ߌ2ɆgN9lrp+DKGxBԡ,3E؁pE4ЏJfeVe'o#2fNq񴕀lHSz!^ujZ"he!oatYu&._cF8 SVFpL+05\RXdcg|^-h8i*;uָ7ŵ9ܶq }'?KlvO08=Ǚq (uNQ8(pY=ʳmCPĩ%ʜ˛ {G83mUy|cP5OzMkrGڡYLmy-c/1ߤ1=_Rfy@^?rwRp1hRePun8M'`?[PtfY|s%Wb;I-"g9^E%qN:LgJا7X¾-+Zvc:({|wurɄ0o9jT3dK&n+/Xn?N4epig]dPO P > R Em0"(&Ե%K/kN<):4.5;ͭ¨\hA47LJץ˱+W  RFe-=_2:}/@R5TrdDĵr/ɽt 7폘k܊pY")kp9%g^@ۮJ AQ8_ƙ`2qӫ ^]+L;pEΑwЫ2kl# '[b( BJ*U*$ɀkNLe,y"zeax= E|eGLv'w"<Ǣ)g=>r4W'eiy2gU$I#iH"sAa!FTk='(0`j+Tr];{^ =%QgM$E6qԟՙݞ1yi`ͤb^p $D"ȓe3 0`xFgICpcrV^N>E(_NLe"kJgKސ_ jxTg;јp8d Q"yN1„Ӱ0G(z K-¨Pf WA{8nT&ZZGbPY63V wԵ=-2f6QYp"V1iLx<]T,vɭ͜l|?8Z`#uέ)N5؎K0Ō8me ,p~14 X1Aдoǻ֙-iJ#41눶<1r:QeI*1fc2^;%CISc<bG`w{$nw>PRd5-`%q{%9a0;/7ut~-^K8v3ۣ ~1j>vLv ,ͭTf-sX+(2ZCvo#PҔ0>rr)_/u I2 p7 }U0+`*wVvGv:Tef큚Vł*OrM\C*,ʨ[0jO}Qbu2V;m][N?2֠u#wvr.PX͚z垗.ԗ g T8\*g>2Ӧsr=Rͪ}UZt;FwE =4rIN<0;HT*WID'TB? Ì2DžP 5Zΰ^U ꎏ U#9PeY͸w9-<~SӬeSlYvI,9rTRA[%H'iV˨}橰64%DoxZ~Jp⺝tN/lf.84e餳=[me!J鷤FT|v?uNyM{Hվ_u?ӕ =*,Q*VͪmK%IaSR&,aFy#g$#,p:l`u2`RjB^ᎇ'vOu,h CAlfj]wӖ^zeMf*LsͬjҽA"pH0a)$H8QV1X>mD- c] 9Y?E :܍3Rk^`OndS[<"v^&Iʵs+lOQW+N1ieiC361RLEcVe#+?Hed}X=QdbXثQ^k'$!4"qH4Y0Ua{eץT(Ymz hxɳJ/iŒyNø:H:9Fj( T*)H<8- :ֱ!qc>~R $c, bشac,I"Ӄ}?-~2ojU\2|bA#F**u%&<%g`@zL uǫ1KHAV P5klCb3NOb #0j ܭyPb8v= Qa{8JHWqJ2f bDeɳkHYLT~Y"`2Ԭ GikUQpJa/e2VL/N2eG)H/ uW5DA0Y Iv1 %2NnUqF:֓IV8')0R)3`[3nz5OM( ϒcȱK}|DʭlAS*UZդ0M9kUV'kϘD%bZO}9ڊ[ %Id(20 }5Ecsl~gn(m;=2I-zL^4%%eӗ,lg ( W%". **H2J̓}:΍i i Ң}fڳQhe,#`*ZCʈbU2+1ʸIXE6֣ p9l b<]*ƃ/04ZY=iI_;0HGIJTgSTH^B=sIGH1 tjbiv2|I-Iq|Ti?[Y (ʉb֊\޳mry kax<ҢWIÕDI$EIuZPQ.|ib&Cuy$7/`QbznbpKg VZcm tDz7Ts2k qK,cA\Ҝ}:T :~/Wzh/1m#(!U{F̊ XCX` mX8d+ZrnPIT%fh>6p=1D#F(1"NUӇr3ݡ6B) bfLS%Bj)CK 2aɡSGXjPlY#41}VܹARfT!iNy B,3WT,ve#NDo$?` i'GQebQ,ohjsn+lɂZ,H#5sXHSF )YـV1WCGZ?NeqA Ԏz2:lŢt$d>wj$*GQ_g3Eְ#TI e\N(%Cy uJ)?<;Zr˜^E,cO  dM% H7W/’:X Җ1r"rdH!CyLLzUCKqլ#:vg32E)Vu<]]vt[6߼XuU$M%Q$AUJrUhIJ)2U+%;s-R!eZ6$C1/UvtE[1[y &穬˲QAJ}Wɔ~-ʔtru b? 0v\QwU(Zr-Y,ލ IDATH͠?Ŋ5IǬUPs63h?5EhPLzp@>Ӫ_`()aР%. !mW]jB+ZѰ@K-t /6KhlE}S#J%CT %<=tY 4Q%L%;DQ"FئK ,%&i7rXjYDQ$Uˤ,Q(T 5T𼨃'W+CA-]iTdK`aCX记}G|[W%^VŪԫͪ%D)z+5-֫RWaɺb4H^*c'7T#S.po-egwf)(ƫZOZXOjsE*uBkk (J u}nuWdLӓ#g etB cQFlᶐYY.iD}yj$ V樆6?r.9'U&W(mi-+p*9}3pX`q9tQe]<xEbK K,lo|qCwھ=.xP6xжLt*5w3iJub) i]$CD59}fcp+b[3V5 ʣa9RvTH]PDw+<'v, -ʒsw(zU2Z kJsaSO|nYdKX)X[SAUZm,& c;1r ӪA3U'ˠ-vI@h,Rgy4?Z֠V,0ta#HղJ0bO"xeK2Ȕm_F3,r+sɬX)hZ&PP-8/8 m7k;Xm ǁNc˃/1dP@;б>}<-|mbrGPhFƽ #lda=od9ywtjYd%26A\ GU_8 E!hSPc^ gB^iӭY vxh8}*C=q(} ̰H*ܿ Y_U*-T2A*Sd~SNm1L+0O2EsiayL54I 3HZ{9SZ2T 9Ҏl(-of v,yXբ^,P2n WuY3F`v,e$ԑ`Cr2 jB{OLw<,.Ɉ{8$SL-({*3]v,e,#Ʉc߾'Z"%4c-;mXDXME;Z5d4v+V% z%MzUY<CAqTr,AZW,Y"WMw2KMa~&: %n ?d2=N$p(V7L0FjB5QB_ k|4UFu_f'[?K11eRö!D!N4A&+d5CdUefFδL 2zU Y<5zq[e1Ȭy_/Vy,3l_`TCx~h,} &äQaT &eJJYq|>Fтs>nV ߯v!_bN–F3FI 䂔(ᒤCR@EτR߼V\JI)(]jIMBc.ߢE480m?xB.Eb>Jw**څBiFLPd͌9Lh;0fO-xQЂgTF))mz6CV@!TvLv JŶ7c[gS֖l#sSxݸw$\˻V`utzv%TpcmQy%GƄPqYG^Dl\)/gz]_}>KT_bxIV9teD ۺXKT-:fzpg?p/}\+;Bn0F 3aXJ&0)W|Ay}ݲ5 ;NHĘ6lwDsScSeÔbS\3޽%kEK6hMpi 9%I$b-?S8 (M"?'q#mժ}*-B>+#ʱn r'= ﲚXOlMp,׺4,^#><ۡ={XMigѝdS"[n+lfXdY('-7 sN~żN+cB3` 9 ]F%cݎB!@~#OţucB'|T3Z)" ZiÀRɅ]r2kϔ篜sZ#.Ke .XW!T|GpcBs d9z<vJpai:Z#N1N1}IU(V֝ ;\Zf`ݬ_ej`)N]r,r5Cͯk_`qwUS-wSyNܖ$Qp3QN5>3 [T3&CZrV\zGȮX"pcUS|ooٛPU}E =^fb}c,p!/ڙvy6:pjh$`2ʾG:k-m͞Bt0Uʝ%͆uꌕ8} ˼hSe#Ks6v_qك|GA|P*u*s MblrVwrRxoNXcB{1E56Sc\c_ ;$n N"V΁ZP,ꫣJ2Ě&,T0̵튕%9Cr$X}<-+4Ģj TeJ3MA{cOё8`7jUZaƥ([z)dY;&(1"J1 xL;z;bSo"AW ӼbiWóPb=̤f:K⩽rŁ=̫@3\ I8]m:X͌{=Rd =՛;:Y1~,ǬjDxKt+~(2XW* `X%\Ԫ;:Ϻρu0qD} Z9/(`Ur,Hc)^tcSswlk;>OqP>NtGʬ^y,R$>YdQf1CE]vhs՛ ׼;ˡCy=U}#A2@GI)eQFl$*' 6 'u|~()t됫pP yr)PB%F뗂VT* cO,Ec#߽DWO׭J^C%zf-)S+AA?ĉXPbavį|vlfRS,X]!]4{.]C;Sa*z]@37H(h)uLuEj|®Imjڥ:jMwj;MW|qW]tOo댲&ֻn[A J)iW&'졗ȿg%2mD'uDKJʔB:)} [2e̅T[. ߺ.TvwFv\DѺlL, /RiNkSKKQtv ,z6wӪA uK`%mg° & e}eA"'߱qInvB, f/y.C[_d?=M?fCܹd—}w/_Y"V;$߱r J~2!$&>yryťKk1Ѷ %]ALYC w=.ڳC \.X\<s=>Z8$Ə`߸azѶ[y{OvW((727^sW|pM!W 5pD]`Q<=X͚ j2w6GW~؝L?v:XFeXjF}W/yXhoxxiVqIu%|I.'BJ9޲,X'PFs) xS7"Xo*bd'.𺫾Ɂ|= KԽ xXGoTφ2^tܢ|?Dzowˌ5y:FAx6Jm+g{‹B Ӯ}Cq'v\`=#+gw{ZIҊ3F rn+xhuB~)ZI*zEwYQ_H]hê,u3Cx%FtyL/(/RWXǕ.݉ %]ULDx8)Xǔn偕0C N EU5(Rִ>Z>6)M%^:V^ Q-2௵yT =c$tj_WY^kev-֭ I6iTKWI]WIzzlWqPG6!T=VM ywb=GM"y~b==|Պ➧nY^%]:\O;_V|xRzx;/Ѳ[ XןM8OgV.=kj*omvĭ=.1&?KXO]kqQ_%SnեiWˏ?ޖjXoե;`yJ}V׻p=&y}]m꟱ο k[]轡/wpoWz.n/{Hg׿v:?z:V=[(X] w/C;(~{;#7anrrPgu /c;$޳뇡g2<$ߵGʏrK^o~ 4+?ԪX=? Z=Se/YU)XSCP>XvM5tP`:>d,!Zuo;ኋ=[>aT~MIDATmK='3O;,8X *fw߳&oW{E=eOX7unꝱuu۪N^ 3yŗ>Lmr!;;-= sJ$g=zg=zֳX=ճX=YGONCµx#pIENDB`vokoscreenNG-3.0.2/src/pictures/linux.license000066400000000000000000000003471362045215000212510ustar00rootroot00000000000000[license] author=lewing@isc.tamu.edu url=https://de.wikipedia.org/wiki/Tux_(Maskottchen) license=Permission to use and/or modify this image is granted provided you acknowledge me lewing@isc.tamu.edu and The GIMP if someone asks. vokoscreenNG-3.0.2/src/pictures/linux.png000066400000000000000000000313171362045215000204140ustar00rootroot00000000000000PNG  IHDR,,N~GFPLTEURҨQ?[:S6޴\xd^߬BȢL^N4Zd^>,tN"֮Xzd~d9& G/ ׬ ϔ x *~ ћ NJtSam ( r yז w ߥ ٳ f1  CФ _Ɏf l j0ڣ ,Ύ ؜xN|[ \Jr jK)tI~ ɣ }Sw T`ÚrXI05x0\RF,x*eC `>~b a’'X^J~DGr.,l$lq?wLy3ƶ U;~/ 8&hlEhT0ϔGm-N~4^VD<:\Ҍn$k1r< ,,,444 $$$DDD<<<,\FB )tV"4ɭ#VEqM r` ֋fuBi 7E '9^k$GW2\UxYC\¢p+8K ߔ$pjpS|0VpaŒD6桥napP5([vB M Kt:Ey#1RM+kp['YZYEQ*ด3dufӘO6,! "P>VZMRiz0` kT6\J4*|e VWbj=sMKgVi)sŇ7PTTUlj{%X9`V6Slvu}+ɔF UEUV 'MɔE3[ , ͭLwb+|"'d<L5] lo#x5t>ʱb&ĸ͋< \[R2`f%&|sa4$1Faii ),^`: Uw(/SXK\sZi)Q0Xz5!D"YHao'^ p+ԏm6*9m`n>X4'Ap b-D٪NM+MB\%9O>xO}1M&`-QXMcL*W\>>zO>xg?'dVtud`PDMSb[,6;N|"]3MیݢG?at)J\[IG-U!d{].=y ?4BtŬm5~wɉvJ{`u:-`?;}p=~$6fSVhp_vXŶ}r ,Ot*o͗_.F^X(,:,_Wg[Ǖb,S/M "-֧V.;Tƌ_.q~sg$ůۭ+;Еyhh… νyܹsW[[G?v6ȯsM+^' <Y;ֹ7^~3qSH07pw:@X6*+NV+z[0^~4,1Ӄ+qM,ݶ^eGPZչW7p\7]c7?l_X`(.D%Da]Ni]~m7 f =sUQX֛oR#DXlPdׯƯo7vea`fhfdNבƛoݾ\Ĺde4ƨǢbB~bF( ~jx⿾tT&o;.#*ĐH1u|{AX)/񝯽x<<73@X,Ȋ יQ;f܆6\ϴ;豨_ybº&C> ?'z:\zo4{g&PWC8\x0 `=x|gy//?E]4轵[o{Ktu|r{2`$a1u4 /sh;s&GPWVf|0 Ff-$hZ:zaj޳6ip>5@ʍik/t5nRDYZ& '77515} aA8z u;Wn݃&XЕh5mN|8GNiy|[o?hŎd…7/H:;߽[$V`] J&N걥2[7.?Kw!sw^{ D]1oay/^jÇ ̚pa"?޸q٣};m}O>|hO;&QM ?K R|zQeV'kI3|f5ӃWo?γOg}Q .bR@T$S,I4C1 Go|k^{^H~*K{ɮF1dY*'PY\-*˃==և;-K[%Hi?i wZAU"YB3I1;URZ߼=88zAŋ-m ࠚatYZ*t" A2u@}s{f1W3Ըh}_|u+Oam+4zH+;aO .3}s`mp9* pXw~z=|>X1 k1N\lKyg/cTeDC룠f3V{NId'$g e4e Af럮 Ow΀pT "EE˕mpBO.Bܖ$&_OOwXw3Robj8 k[:iu`ϯ+YIbqM/,XXhY񗗧o~}YvP[˂wsD x"!EOϿ?xO X)x`tBw2Zb9!J+5PU=/7,&bR>'Ȧ/g %5jdk/^fZ^v-^ 0A@DӳYYbT> L$&'&(4ݭNS-KJ7DfEut bD{.NJx~RD!>I}P8 $JKy#RKieY`adx~əkApTVD욓`O-W'Owo` LԦ*:V|:U O*F2p(yE%à;aצҎ(Cu;QJOIj:<*y$iC)H2x.0*M3Z9*8-Q<1reŠ'DKd;ǝi=N>  b-W^>Xbh=H]#qBn+Ag#UEY0l&;lxZw}.-h$JHq@b-Ztb~ 78{4\8e{W`}WYɴ0#„(gnbP  @[]"Kt(]_cui&$XH8m0߸v(M!{,n{,jˍ~O7轤 H6d5EwHAj<譸`PqjTU)nҟ|cV}S LBTk͎+DƶFz+, QVXahM %*YFk\yp|( B@rZ1|\ZXXz _ 2m)*p bR*E7B K At"m*!Jx;pBH#ڡBޫ8D'Uw56޶ޛiH;Uؗ wU% w2VHa˹_u$Ri  K#QX?,3RY,OZrw3D'Yx8W_MSq;K=̖sQd#{f[SѴ 6 , ړWQaU7DE.sX5_?Se(&+M.,OÄŅ8ٽu+x QIjaٟTh9x"NԖդ jȌU`  iS5McݲYeQ-ڶ(bR%VL&*kò%R K!FOaVl]jzFj,6uOj,Ѷ (ᆄ%w00"$5l%+14R9MB/-厰4*;9l9,>He>r=V 28ՈT43ΚjЈ`a2ܮoJ4fCr6QT T0,唎dj/6Х䠴q]9`SZ;h,7HXlXJIO 8eN0T94LA+ Ȱbq-/DT`U4A]K K.I2ZKERJl)ڸPVF*Lj3+K7(Jlu<7֓RfrNjoUF\T0(MOeL%6f[YDYD.Yt ׀8!' ݲ֭Yh%`qQ^lj֐hl-X숡upt'Lk?+}q*fE WamLZtN"@)9g  o|ƾ΍ɴ+62 *|n~`2Vޏ#[  +ZS 8O7- Gws/VֶĪ ,Bxjå{R=W*iI`] gCd^+3B +YS[:.sIRcxRWde = "`w>/uJQӀỚ (dFrRsx qS_/, K{bR֭2;G(6{a{M14BUa!޿*ܪ5gU]*`0|=Xgm4~30y Q@nXVԈ@E)c|}{:znuVh9??^/37`~6!K*).r}/G~6^`8ilJްn0\_۩ j<NR5b=?|(rsF(_6N=&G]vMq uvޗB0k:I*EY`V63gp(ĻFba^o#x J NIZmK,V32R$-ah cAe=ODYM. }z_gpx槸 GOW8 ;дP8T+!o\9tŗqC3s. %V7͠o_GSJiGӰXVTͪ||gʲKƍnGLϭX ݆;`vWg{o\sRh VIDAT1DcHttJV~y>3yn+5gss'{VwEW-8b 8SSH%ڂXgǕ,x4 H-.ިRT gm6>x !=C}齨PGk9G:z«Ul 5la TrQZF#r8J #l6 jKBS "&:0HRenXźq6zO+xyB0Cғ<J‡*DK:} Iˇ]]/DfLSo[uT o>#SmVRmdheuݧo(~>߀dO./d+~UGuΆb>,-v>,é#sQr5?x!.Z ?&J Mm (R=<&c;,,J?bp\K/qÆRxB(ZH q!06:0 ay!m݄*<TxJjZX`~;\\EE+[ abڱ;G1Cg?[LE3UV#);߻><D .t$v[8zMܡK2t]im dtVBDS㦡Mew˘(:9irCG_ rӌTZ,l2e]5梙7\REnNvhK@zlmݪNmR;L{)-Hsol1d3hWJ%xPiwOV<`%OJmՁo]NP[T fz~.s",U7k!sY(^ =k7z!Kx$%HY#.Ꮴ,L]Y*1*R3UIJ-;'O됣 cd?)eOgO%W)7"ɋ8}ˠ/.ŔudZf&5 Z-6I Q 5KS 4{1I iMSu9$̝m:ېEy0ÇN1B|~w哒v gEClzԐ7V' i) s,\7Q>>;RNM;x3J>8TnM\RqH~= bt54k&J6nLYl+1h58F-9ڐ9j([S'vYg=˥ ;>"ֻSXRyem#I-w. N8ziey$V?8 Vx9N=8{=Ti2yPV/f잣G1FlѡۓNJq,N˘w?kHɔZPc̎#=銱x}cc/lfrOE8C6UH,n3}q*rV*,%},΋YwBry\85)Tt8t#B>~vY΂{?Nc-mqevl%բP$5X&Xn?JMxBThpJR5ok[mK&w$E֓5ġ$ q-{ S 88~Tfuj=3=qf`_N"!Ec҅i,ٮ}6Q1R>:vc pX=J;T#=ar{@+TWւ.)LЀNϸ{ڰj6WcN+$p]8.D-~zk|&c_8 6\Nebvuy{}kke#27kRVy1btDR]ֺ4.,u!~V9Uoe9F[[(l^<3;W8E7YV0'QeS+ ֮ 5rc}gzbAcAmXT'D 2n'΀jQl~1R;ʡ׉Ty:35; ѠSuZ[xu]]92K b)^`zX,ܒoPU٥R7v8 wܗu)v Yzh?mwvnF/ 7Ce* T_k`]&\1"S/Y%{=a0=3CkJ{\t ʣ2I1؟qۣxyRMk &aQ+o{ֽz$:=`+.hpIa".LQQmD&1+sɭ~h.7Xaw˭q8,ġbvb8V3S؄6Bّv`iDep g_OmB_V=;qL]`흝h陱{is2`R=ۥPREf*3 B)FrG~qAWHͅEYFUX [gX*i V(]LªbQ͜Ϟd20Ch|4Q?+Nx` Y{|=`k < نXh P:ǘFdE'HًMjc/TIFhaºA=f=@ZvBKi$8fO=1<= a$WXI!0d$ڶBcYݚWXwV <ZZx6}̀fzznzcvdh4:aMtt)cŎIj-`S gB?\hv9~:@xʞӳ-` {1(LR4Fa}G>|`4x3g]V?vk"Nf=kַ>>>>>>>>>>>>>>>>:|Z=~ n~GW{drDDSR5>E4@Tj:E (*^J%ޔRv~Gߧw?c7)~[?C?ưʖ"f 4S 7B) p+9pM^ ƿow~&\ r@0ll ( H I8, hB:Ǜp+WTr(DuT*Y.O_c[;.XDJr) LKΉ9s*rIǨD$ěY!񦝛dݏ0>>mNyy+i =z]Oӷ~'?•!}.Ędv,l4sMjm9~l>տbHPΗBt7A1>}x$dUd.m->zws~xG_gs_w/P %s`n5n ޻\ HHDH%2f3 e#gO{^wX;gy)ޘF76C.g |/TtUq:`L11c,H\{&ׁ\[/jt&^==>;8W]5ԙBBAD|sU4px_=%=s|Z ^|cQ$5Dy iJOȇd1Y>$ I`@e$i1kGcGա\E(X.,sŜub_!""7#l/K?>|?E^TЩM堯dtצ`X`$q: G (8<'|$ 6~ MiCUP,XYg\g99U{OUUU%*P(>| DC}Afv?3`<{5L8>^2ہC8 lf\м!I3IF' SF #RMb፱X#Pď`Dn@QbbVǨzX8(J9ٿ~9z!(F@L ȳD^ \PA?_hG⮷#4>:xjo]Ϸb'lsExp{7p.vbb $IMs͓7MFcAfIAPD8+m8P1'D ΢NDT SE|̮_Ջ_y:UYPeQJPW'\~^{wswk8w}ׯݧe"|2 m4QsxH2 28I66wN#,'Rlb+$6TGxԍ`L 5XCjMp2D Xm G(rpXpW.]'z ^`>NQ,)%ZG'#P>^.wmYs3}RMTsţΣ1|43as{xp8ؔ$IHM F0ꕢ,+DztKǢ<_c̿& BtۃZHCĒ'A0yx>dĘ[(8{QU%,9Ϲr .cp鳏08nyH c/~zp{^yG~7mIUd nkWMQgO!3lei6L i"tr^;EVV 鯀5 {C6X!KleX;'e_-!IĨ/nUEM;x{>CX_ o%wKRk-rk-V06%͇m&[gܻ3701{*Fy?[T,+\0{j`Go{@;vF TZa%lr0c 3KĐ4Xc<̖^ă4O<W/=l*!*cg<o x_ix: XgGske|q4/^l^~b}.;'βxI/ c^rpYQTʹid5tO 40}"oL] (F}FlKM'^W_)vf$>GEht=ޯq]6PwU S;N X2WR(co730deZԒk C}qԟGf }b 1&¿xxso{ZӲULǹĎ''i{Af-gdk3*l rr.~|uy?x bRI]UyjU U }K L=ɛ9q& ,|L}u :u>o $&mY"s 5[Ԓ'D_-끂5 xsE,+GQ|Y(B7,WT*<#k a&'7e%KĒXp>yOG>OP,x$Bo+K \_#"^gܗ|D59'^J”i0=pg1N  U9lQqeV?TG* Dt_QD2L %O ik8WbBDKi+N*z4Zѡ <.yt̗J%J^4ЊEQW\=#SNl 97eocHB9xsqrwƒNg>C9z) rFUT`:UE2__kqǾwdĚ/>*I 4;vOcc:"KW8WQz(=P_/8XV84ivIKf0MD0No&H^׶oV;4@ 5V:cp"O(*eV EŲ5֡8f6/p!P|Dg{3e&LSF!pBfJ>h|v(Ԋp"rbw_Ǯ߂ _oV/C6a8=gӷLF@`ezPrzKGczJ0C#0̅i'pbs$c2龵q~$Zht*bI{,Aߥ^*mWbaY&Q$g#~@Q:b3evXՃΗNTa2 =|k98a"p3|\ ?<:k#{w'Iy x%yBla{T0NQzQ:e6w\\?,9XVG>눟' ÄI$esg6}4ȗ+0 XO81=zD4M8'*1R+"*J̗y1r(ABgm0Mֲ$)s$<]D^g^ {J.>e|}u3T 9s$Omq= gSa%6#(6R8b[ Lh-wD/Fz5F[, ߎ?G?mjdQ`L($ >N)VmSZc@ЪR%W,ʊA F!0l\0uz+Pनc3t}Evs[^wo?({;m |) vI3y6[;'cXQzfKՃ+yއd0 i팽͜ݍ0!MMӧW=6& z( o܈6eB+K\%T}A)[er^k cC.nb%-> dJ,peIUV b.导t_o2oKÌ]1Vx P1?8[_q_K%ey*lSv)'636Fa(KW V6:,@oj1\#~\!gѰ-c؞". Z^Vj*^=X=|Y//ləLGq0('w6y˾ yb`(T .`'@oNjTR`$2<Ωg{f6 e_T\\=,XB B%LifF07 _OWSG{[-k4Pv(԰eׁ嘬a5u^U䩑0egr`BQjpRT^T%Q~(4\z EvqA  u[|m2}|wrm}ɆQJD 7ǎ^ ͓}K9uyЃ`s (as;ausp!O91 C2=-#ՆZ'Ftc_Ky5jb(hЄmh+ސpAGtIC!ϬX#̗d55:ھ*EE0K$AI6Is",6@Ddi^zox;߷Iwoz,ytxۧͩ f߼\;(zPrm^,H"[o{pj;ix`IZ|SoXzk掲b.=^P` G؂9zL,<ΫyF΋0AT "V$t Sl0/)ˊX2:N" {/yI'Ŋ|#*`Qnq3~!?t,t+ef>TFÉgrv7g[l$ӴK811K?#/u&z=F4`TA;58&!hwWk{agiA n1j+g6FlSf P.:A/"jQ,ksřL,(+3|YnVΞ$MK_*|kq%4v^Ag`oX&@T$ls}. y(H-BۀY"lM,{gwᧉ|_jg .iXwڿ ˯p&urNзZDbWE a[t|%l WHG.ʹ,c)c+/z ? $iVU2T*/o_yq]fWeٺ R" V> |=cnDVd%2Hh%QkWp8_,*#&Bgl^^xɋǿ:Hp[>/~*|5aE~ޑd#F>}+'Ot:Ze) Džke^Raw#N' :nh!r$">=FR~jë*QW1h8H!YD!-Kݝh-y49ؠEkm$_+̖VN33,FDRk 2eR,TyHLz9|o];Oœ/틞9gg r,AɢtX6&595Nd&Jt}ߊ*gZWRn7{F 5H8;qnAV2|1"bU8Xt.zMqsWEdIh1+.3?<@ L?}{7><{oI^vy/BՆE[9}{Y Kg\j^;S;u͟bێ=?Z#v5z_RGzLu_c4}C]߿c[ C6,ahc@[X~|MY :\E|F-BmcA f$P-JUd*kcP>{gVDv'Wn+?+Q]7NQsʫwX28tӭݸR9|-y͗X {i$Q@#|$m|nLإ5 6UX/f-L%q8OHl22Q#x#8i"ƨWf +l˪"O͜sOp͜8y$[P^0UN뻿o<]}[A^|5U8W8q =\F bPR_qy\Z 'm$MGv͢5't,OZ,s&ֶv3BmNIͥ72"+f'U7RNjLx(,<] S#\ƃTPnҡ IDATpl>R._xBfׯ-Ƥ1m7=$xJ*ncyp96O+J`^AAjń^}m~Y{# > ^ R oWm,_mMv'^ E;EۉkfVJb1Fojh#F)*rHb$Oas39<_<'x5|qN9W*V%iUo@1|z͌y31[_9frٝlet&D:|S6{N@(+AzC;Ⱥ8 _d+݂y Z㋪6Ͻ [kcM "zjE|@; * *&FGEՃ{ʡlOr)I"9{u((1gTyGO{:x"2F (Փ%9ӝsl%IQrvX(֙$0Id`)>j+zSg7P%On <( Ҧ&%`HaѰ`j'wX~(3FYby*I[ny-2]Z+ގqO{w:V+5Iw3$IBYi\Sv,5, nVZ+3ZO*o7z|}S̭\x5QHk}GEkto!l 4if#aA`"{!Ơ5Z:|P=tqV.KRU0sn<>' &"ł|=R%IGLvp:1a(};(/]#i9N8rfJj_~=}/^ t똭"f)d?Q9FG8zc/+˨}]K,=QDyQibls3L1HFTE#=!,6[6f|ï|\Qc S=I>$8d&|Hb/r uX断q7ѧ]0N0~uOж48 h{u/-ViCG9J=N?^Ɔ\Vm/Q z05YCQ@ZPU'# YB##̋=tic䖓Sft*gnUgB.?0c`Π"yL< LDEKaӜYgIAi/ X$ew3e*Jru`1h|7jƩ6jPV Dcڀ;[!m fi?KSZ iԅaT@ x5Q{#jX9542ѐ[n|W. IRIJ*/Q$[; :69Il|paU}xI~VF\էң!4F7j5a"ALSts+5 :&5KI; ";ޔ>>ah:ʓXCXύz4B~ }P#FUc*ݕRÅ.*[VjFgt5>yKh:G>\\O7}&d kT;w;?j~﷭I2'o φظV)\;K*=1aYВ {]:xzS ^۠*oO[EuZN鉨R֨"SAN,i Z%h;a7X?ߺEaĨ1FnR/gK:1'r+Wܲtd2ɉtY<;oPnQW/'YurwC ߝY*TwU43޽ͽ#sDº+٢ >q^U]),*^ni\~D`m>~f-`Nt~@ԩ 7HW?d_])V:Ɗ:|Qz?[GILO2I|Wİ701T/J%ׯR,YnΞx⥷'>[~wes Ey5<~<6OM66{GRc峤6aiu-m;3Az$hŭ!Hn~\נ}#e߳#vۓB=N2@Os/qĎO413RAc/>5i G:H݇1:f(byf%O9/2 j5Rπ vG[b_Ih=N#za%scrC ͳݯu066ǙەFv7RsbkHjHD =c&sDR|D>$$EQ6m>Z /q(]C L F{DZoԿ ^> G+^'d[v r_-(sLt<?ܢ+&AZ.S ]w) Q&)i5:«[~-V&JHtY!rL ;~XPlD ƋM=zg:\Z5lCm)ԭx |@:B,HUQ1Xњ "q"^Lhj='@MX7aLPdh鼿t}Y^_V3'OѓNk4fwu<ҧη+jaSMN& 58YV=^kQn\Nk&[N_葈k\G k9N_n.tb$Ҏǿǫ<`40`xވP:-:bU1(kKwp閥>mLӌ'عxQ\x̊ wk0TbAEf MԘ|8%M1IKӠ_VJ}3ܦ#0H ޺ŶYu=r5Ni0NIW\G<l?\p.uc k eG31SqFYϵ+ci"b4w:+s*h]Ġ4]NНS4E}+f%X W7=:T^‚w&1*j3^"2Lhs7Uh`ň/*Ml&";aM. qzus2$p I%9i6 r8dQ4@I! kwYzCLrC_>$N J)GA:ŽwSX,u *zz~-kQGp;bdkDnQVEl sdVljd4`II|L;<%u6B"ƒ،,iRPEXV.RV6~VVNElmV%ًm DڨCVFZŒ'D"qq'3{}f А0p0h*=U\!Xg*7pR`0L@ i^5w/1cag 'bOC Y;vPMZlH:că2e,XDcOH !NjhQG!Vc2#ЙXϿq";8R)tj׫=rAVTNTCVHiXH(G2zFД16pNt9r}#f)醎SfIU,RxVF51ƐFL}m4r2.XKaDюeWMGNECُ_Cj#ҪHM##roI(=y"&iHm^{:Y +&MKg@k +jjUpnQ9**XkO:Lz1 @2$sO+&# ΂7bI>ĘAgMĬA~]cir=/ {OhPSB-_:q1|Ut}Y ht0%DT0g/N lG$$K4%BxD+[|Y\k]bx}Qԇ_U>+U{B'(&T˪|8MƌcJ;9QxsooY;'|#Ofv&JC I!bLcxއڿķΠ3ǎ,8ZKzDzEQᘬsJ(|-/U9~Qp;z?tw&j6_ ]EQpq 8{@*!}ZsO2H5g;-+΃3XڨWuWir?I |]o[O[n@kS2,~sօ_b= U*D$F ~QE^昖2iVtFkT;:FǵaD(|,Vb=5 ި#o1F-X#$Q1!t/J4K$G#F!:acmwnZ0e7bHmBd1Jpʪa7M#\CPg) D>*ٙ P=aHWFd ծ7/5+ u穻~Hb?sΩTNiV5/Z-7Xj`02cfoi!&Ɗ5A1s1ґy7DHbvO>TXcIL Qp. uځ>*r }*t2=fiݱ2#Ф@}v~Xs@a'!mFF6Ԭ|ƺꨓĬ ~_UUfIwqo 謴SlrղtK﵊ԛ0S`BU t@9d] 7p1AaL4r+4aBWWScHӔ$IBJRYIPIQ1[;'A%|1F02ڸFB |!j:jDH c=>jFN h,SR[b|7Qe%] !Ś^ݢpb ^w{cUJci'm7'P@ ^ Il=d6<`\o6]q]7ZN*v^_oRm{9DRدWYwbin@h殳ޔnkA^g{:ɱ;hOk0ܽ{K7/«WV}=T+8'Y5=: Jŀ؈S_Ox"X#1ό&kV. b Ƙkv]kNe)*$[k[_V:1]2dҫc8.C~#N4zEXLuWZp JU e } H$m؉qfubtZ3ֳL9hv9P $fuՙ!d"vO^%8F)W5ho:R/Ӣr:Mlwq[eMrP:o_qAPKK G+ Aʥ %T }-ԶPY "TNݲyNc&!GB V{卆*+jSRzdy mb.oTȁ\uIFCnǍte閪Et[&FXa`Lӂ6@k[`=hbbUkd9edtuګNk`n_T@ G#**mBUnIO$&k'Kgea4jBzB% {uԴ:UDc5M~ަq_@f^rt|Y8|pQGFhūJg轪5*҂CdoBRzvtk~A_?Q&`:)-(Ye=@ƶt3P4r z1^q-[+W'cD}LL j엨Q,L1 /}!X6 B㯪vP/UXB"7E$ k|Q t+A1<6 b5V;KH ^-lZ~g1꣎Amq0|SaHM"84NlnTRC HSShL@`[ >#3! +FD Ωxa~PuKx)-YT AOtf<1$F:G&jZ=ٗxՌ`+Ps끢^^Xy- ?9^Axe#g ل//[/jF+::>SQWC5ndy koN1\gO_#=(ki&+KJ$tZ 퀚7nOX=?  wԁT 9c@O="j½`Qբ|eF8@P?j9p5Q6)E,KH @5j<܎ IDAT*r+zgOy#T؄Tyy[b߻*}u(74J`{0}А!So0S^ODƽ`hz>nBDe C,6*OL*,@Y(Шf40eubfV^T}w`,W lmXǫEb! $˕ϫv<ݾ0,6!-!ƨ7_9y E;v@"NB7DY޹ N\zƂ͖nMV]HU^,=ڌm |<4s,x:(}OMqsG W;@vu} ZрŶzos[ `?o}ma)e7>,5^_rIͶCG\~I9/x>_ي`~%Qihp`YܥO a 8/LGnaҶOmX3f_AnT3XV?'{,IFHazcMtHBڵLډxGIt7 `??E q`CrU~oP,sbNvݥF UYWNZ==_u/ܳM{ 0AtNC30Z]x8=` å?8`Ad\{cBV؎uA6W#lBl!psZFmM(8Zj. 8ٳP-CZ`P%D{Tɨ~qo1HMHZV5j*Gt9k u))6 ֛ 4 9#X8a2$xjfӰ@TΡ};4}?g~fjux8' N3Fpp9ҿ@k-_f{}.[#&*c } 0w}u!^h ʁ\ԠjbҾ AQUAB؉F L H-V1 {;vۆhQ5K.\ FFܻ;(h@DņXFųkdVHGbvselɇ=)@WƜܘ8ISU PxvzW'c@f|<k  )FľCH V]memw.:{7XT61w"HofP'BͨI +="}.{ vրp|>F ZTنBꭔ"ᘨ6t :UL#%UU E@ NYFp7vs$;~RJHZ-d&B:k)Met|@)?HU9|{"d"5 t4e8uFdOC[:Hf6ƒCZ]Hڧ+JG05UMcKqhj Vk%1Hxc܆dfSXvv[U ^f ᬮikJ2@tmm]+U1wkA]WWt_SfuL* ^dO=㚰L 8CI%$Y[ɴvٌ;ltj0OY[OxaejŴY麏ˠkϐ݇$ÀC٩e6ez^vJKf}JQS>5$._DTć~u˓DNk~㴩ͦ^b}ͥoAP8 PaIB vc*PpV/R2[u}ZזT)PXu??nַqි1bup^n"b4CMX4;jvZ6F>cOM&)zZ){s#̜nr0m妃}wR>&,YT (rApfՄY|JѾ;юd|.]);g!!F.Fݖ۾AwFH!3R _-SX?P3nҺLgf:{lVg]'Ez„J3Lߓ=⒊$hJbBHq1!jdR\钞m6 gE:Wk&D5!%nBBJ^Tl}LT!!̠]So.jwhjǶvz'*G~Vn2V'BJ]zeJ K9U耫߿B˨3tɴ]Jd!E[6dt\֧ŝXt|\f3TcX^A3fK&ညPT>rg*?L H .%#5|[\]{ C[7o[!Pd܆_7?){E:{:iJmYcZ߮83"$EJj;3=(zן QMY꣩ jWk22V*Mp6i/6-ЉxW{e5;b*)t0D3K $]nSaR-F|nUUKf}2v?npxv%-jr*0SK }Ӵm_sҥ"ns))H3}O1p/L%M f i)wt7IV^]ן, 5w~~}E"pff&] ۃcIM8:`!`M>xXJ[m7~Lmÿ^X,jpcWs *B9߈28.ZҼM멓:]]c5?GImb>"/ έ)^SuXܹtni69LbB[ (,ĝ1%h vs2f̴g0S5 )dNANWiSI}V^r&e cJRr eV):)6I&,(UN]2,bh-P |2iRe)0D3WLfͫ.Wp. VmP祒 Ug <53Q9|b0xqSG?p; Zqrr"S8!"k y|;t[_T6IP1t8u MS>!0p I@} ~G @ B yݭ&u5@ec9Bὸwu2mLU;NICmY aaчt"Ѹ1r{|JQ9g}(R tӤCnS~}ؽwILgKdֶmJ orjB.prH H a<%3J;c8|Ox玧ЇhB8=[`u>'(pQq?9u_z1VӻLgnKYUyLj$M)iF __ކrϪn";Bxgѝ۪y^`ђ6Rz!*l_H8VNlyiQm[P{Pct2p˶ߗVv^@^!2NRzj1F}zٵhud޴'p `g7:=Z G3aa/:۪>hC2kkWn+E~OvL򯫦6r cp2w'UЅ_|p4C})vS\ziE,/&m\MK;*G]-[4MZwi|{A]Wo'mSفƔ46C܄4`fAU&"e;@GXMn4M=ktҶZDKv?l7nnu20դ:fCX%!9y jk@A;80,(2՗=r"l|O+O>j-c ]3SпUyQx&ħ@طၤ ͚o`2?1נsj%󦒔Isx+qrlY{\|#Y GjhL)lz]fB8rU!-]\w1NVʇYy*btY\ק:U ,Gv+./9C wm4MӶLZU}uVM!BHH糾ΗQYXw΋"嶇+[}%< @)G\pwr}Ys=k3@l\իrk"%/yx?/[/>'-"Nbg)Hg gN]BRqE,y {Rzv)nO;p ΅ڋ16,JIޱw}ZZWm٥IfM*qAUiyav%E {֪Ԭ2i11pL=3jssnDwE6aZݻaZocJl꛺&ŭc>JQw¢I.B4YQKQ#§ s$/Bx mϛKؑ>&ضxzwbs^ gE_?/OW9צ]4m郜Xխp8S#p%s.>t8p߃n_ P>4|& j\n¢}[{W{o65d؞.rA&tҸ㶪MufKsΓ|HIJZPS3EJ)>~^Nw.U5Mst|\&B7f2sY/!a-즲_b*C8|uǥ(VPX9?4k?+z!\3`q`J"5HIuE?ow; PS X-x5iƎxP'N(j7LCL-|wG#dyo͢z16.&mhWs$rYZ8#Sj5UvhkywywR XV~}zE+ f*z/5bF3Y];on}Tuc@fb L=`zbFL)|AZ"&mX;Ĕ:U@ ʹISr(d6ֈ RxN'WGyܼ{xZ'R ʼne,e2~rc߇ufmmlmYRI6㑩y=֫St VlH*3jҌ vlkfb980O/Y{'Mu\U8֛h7oJOY=뺮˂.SkM> ^%Uv|=#$ZS}zr+{w\7=adv>^MZ}PG^&mMb@982DUD^&g)xAjTh" +¤|af4T 2WY5YWAX&;͐7۫:ލk3K9p ?iT! x;W/gۗN*/jeW\+WbEW|`),tK|sEO3Y7J`ꗿ&NԱ'mnm ?tFϾ|cXZ@ ~P~k{1hӢST2#(iNc|mފsнJ)iJs*z‚V] )k;jZ40)=K̜%4*d^JbDvܦ[!5yG/c˟JDǍĞE9lϣ|7P͢Tnzi^>6UZΝ;/|A䓮c& IDAT:8:W $'~៽_j~Wg";>G@R]%Wyok3o*jEalH9Yٴ{]4 PDޜmR$I D8ϝ=Cw!٭>mUT/A+,u6WH~ZP+eej觍7k_q4ilkw\̏X{ '׮>+ λ0s?9Vo{ۿ~ʵ:1M:N"YWU",Q8&fKIq.@ sPV$Nhny{f֭tl:lIېc {|9zB+\2L)3IPQPwcA-!~i1i7s`}.#yAW@3^Hj(nRy(93g PFs.q4JG*_yy  >&ӗ}:1`J1);^0 _'Ϛ/LY[ʑsd9O~?-?8s # /WU)1@Se]+U;qDPeJPï"Tٗ DnK;uY[*/H4"5u!*z50 =b-cX\7 j. Cۏ.!8uLfza]r;lJհ6}m (c@2;w(ifBMux<<66kk/df''+{+|gAuH^#hp{Σܿƣ/=> { B]4&R]f6N޹ B)_g_[t&oWQE+\[ʋNrWEj}LQC4ˡPp2PH) @8kgٍ`Zy4^\ʌ/3V7}:j=H7ZEe7/PnP1+ykfH?hx?oZ`6RJuJK'PW*ԕsNPS%ˡ&R@Ps#N{ڱ7 Y[5}eL?Gs'J<# 8J ȿ JN"% 1 ˴˝%!ɮQokˏQMacp>3P-iSQDuux4i_u0_?֕LCTsLx {q>/q^CU$?*]Jk,nm/s ARބq!"-%=X,Ba^^ߢBkA[9XUR06ڰ˫1|iҺ n ` $cSy׊J>9c/`J)T7 N9c ,%r4F IUˆ%![ 2 1u!0}ioXhn> }]yѤ֦r"ؐ@]C]O=&_x z- "ro?hmN7>`E8}o÷w]'?o|w2`cu!4Uiﵮ<*D#nMW܍IR]97ԉT&[nC:ɶ2tR6N/^w18kh@۹\ U;{9Efe<0->]B:\G`dCK LW'wxow/^c?._ziVI#$~G߃|3ކ]c!x~?NabmebRY+{f0!I4uR;ɶ ƕ^1g 5Xl6Κ&u͕{0ӵ]{1y/ayp-nϾ[oN\<H.y`)"ߕTg'gȔ{ƾkᛴik#UA62\LEǜ;`dZ꣮kl pȼ{:9 ! W4V6xZI喒{ d4 i̮D'8UH#$,)LQ|P5 mrB`JvrG}T>/kl7M䶁Iwﶇ/ ~ ւ| oy|?GX|u5>.#c Si'6McZ9/@iYۆ  @" f> tMՒYTn ~>t"Љ9RI iRxiQV ILMHJ\=c`;?kfm*//sI8[SO?}O=s/1G6;?#}%6 h59SJ'wAI+ _ץ#'׮^f~P~1@sq/ yCoǯ<6|zgWoBl9#yUjLfS*ySYi&%"|M(&T sLS3-%Ӕ)QU{Wt$Ӌ ?4* `s0ҕjЌ܃10Mwf)Ɖş O1 v%Ja S!NeK:at婧s9>YO,r?&?/C?j#'>/Z>~Ǐ=Q?3 ]'"䃪z;t*v:uӦl.ji݇eS'y-/XH1 ,U)&FhB4`'%P$ EA@ &9[%`SfRR{ҍ@R8 6Q^1jc#Pd-t8Y S-s]o?'uoT^W=/^<Q}o?~>.#jY $ceRBtV^fN\UǬQSHqyX:=s"[ִ41MUꄊ)ŭI'Q)'a 2߿Lx0 9(b✊soYw35sp0 %@͎_9w45C7e+w Df#< ~YgEs&}}o(x^I<?·`ϑC!t8=]]S''t^ɐ7ƀ<7c`U%S1h!coo`]nAi"6S4cc~^DSb1 }S}>bؚZ\#ETS{Ju+U}Mx. WIS10ƈJ+Cn(};3T5߮a AMfN)sbIQ^V|4L"al_b3 AzrbZ-gND9s"ǺnǗu]'ӄd%[gQʢi raQdZ*=чj:DR=/sQ*O6iLVbJR{歹P, +?1i;WU3K1E53SMbE\mUz'TH#$sm 1rQ& 4X;ztmW:}]7ãMBn/E`ΟԂIW&@!$:tDB6j1ؘ]<(%ɔbZcZ1HPZrkOc̜8_EUWRD)&n}Wgg줝]]:@B \ $ ݃b'' /]>z}VV9:rUMTH@ 5hް \~nB:\ vMr ˶mo~"S$CJ ŊXrCOGI_DII&85!* )EMԹ,)*dBIH0sLUMca=ڧr͛պIX{vέ4,%gY}0 @\Rrj K+sQw jrynqsTu-u]nE'U&jd4X 16*Kɠ,N0ԍΩFLH @ SKNG f&d5%$Ԯמ{W_~}{˲<[k}UU]==3C(0V0S#D# Q$F?A(A~Ė)GNa HK Y"͈C~k?V~sUSR{꾺jo=,1AWjc fӊb qg,샬yU"WrS(挀! Ydd4!Q(AC079Lg3'TU3}ԇ0t%Vؾ%դ#f\|9n&y/"LJ@ [FmO "1R o[ɽ5)fbe" 1+"VD`an4+5P̛bw?~"KD{'Ep${I*R*S̪$4MUX5r1[ 3!8x^H:jx! {cVz4 G`(^B=%M圓C(E8W "8(ؕL<Ozt( Z 6*M b/v+MIb$YH~HO7& BD˚1fdvvw k-ق=К?+?vnc/4(sd2vJ&sw!4V,3$c=#X^t|bN"qiuB=yː'$bpZ$!R4" $ u?kgMWk6YtxH@gAH3+6Z$i0'ԛɃѩhR ČntŜ$J]J]eP*8TU)ٜ$lW]?3#fB =w # *&&Ks W/0!&*^!Ǫ$$@"! @ '+m-R@)@T(xM8AY9kkb""&mҐf}MYg6QeZ'4ѓDȽ5锊b\c WkX b^#-"~&{}5-fii/euUWskRpVa IDATЌB, "Њ(!CBR vi\US. K!Nj-ǧkgh҆A|Ĕ"#]RH(J)Jo@$ ~Si5y_M$詈 dA^$)XN,ζ.m-.Y\ҵ#! l6ߧ5 YN#䬯5Qc PqkG^9q_IJhRu~Y7"`~Pܺ[TR^z׭YO1Op)"(Kz7ehpwJۈV f$=+ AEV@"$H* Pj.HCA ,p+ nJ13@,`Mz .kC| ^ij%}J䷈plQm]Hi@r)`@(`4">LW D t;mGD0_5<~ot80+k77,իWM43㪚KsxW= b;bxtËK8<4kpq|f "OV+BA!{z=lmm?HP5u($@S74D t6FR 3L@Yznzi$QWSD|碄s/5'?m @B"&` I6DLC fc'֖=@4s^'`B) djH^$KJxiV J1+x0۝bgwj`A/q\ \ FL Dap-{/SO}K_Ͳ@+Fi=Mzj)?tm˿_zX/5'?ЎO@v01q/Qg`""z3i(N2`ޘwYj 5,E{$ϣ)iU=Rh*1vv14!M6tiW\hiä9$Gd0IS0(PJ33k= $`͗{jp'F[Fk4ߺfsϩ7xC[k @Co"{\?O[vB?Iff<ͦ 14kB>9J)"1/2V,*u !:11 {H &RE 4ݻ`EQZ ,Oq&/nb4(Y!ISi cR(K-G`L&t]+V (~NqJAe5 $EߠH[l5Z+}si";V5 E(}k6 uh k]RlM{6U芒1P`"c`L$qHs/틏hIZ _/&)w|U_#Yypx_2?AY/y1돻,HXiS 4|>tUUt~Zzse !Au]CeX8=8ucyzu%3L κF01^"vFkhf l,(px 6|$Њlɾyuy&oqKyIk-D4%7oy{ _덶.[C>AD"9xow  ޢAmc B-'-I4,KG yb0ϡ5/D:ܓľ@5661AWH0$I,<"gPBG D!I "F`fM y饗<(IRhc2~߬7׺p/uOׯc" 6n5zDs1a@A`+YyA"x㣂f<f)`csǯ_+P*NXgЬ3}9.^“ׯڵBy')^̂ L2B^@/ 6a /}9風+p ' o|}?Zo5<OL AGp)ЂlƍmXkMJ)(ŻĤ@u(OGŒCL0A C\hTgK]Jq|,Eem ѨmLX{Z}*VA!Dl 6$X1ăk7^ {%z`ۓ '?7~ W֛k W V//!<*%f X`2Bi,Mg9Lb"?Zii^>@!xZ.62 GFY?/ӆ0Kޞ.Lh4M:f60:ƞ\@]BlC>S)"$ jw_7~[RGTW<@~_._߭7Ժh fi ZY"4c>bs(<@`RHҭm`I$I g+!ӏڊHpIA+&ܪULF9HH5XihNuЦ`eEE ijq]ʫ֭;<$ */IW=_>$?vQ7qJ.BJ )>f91L`m~~Ն"1l7 Msz4ɠu,ۀΨ:\B{ bY(T*)Øt Y<4Fl@>J#00C)Rq=|[z^yuzpa Xw^z##Gs$ȧDS"6 LHAf&X+ >ay#IiszFװFc+8W xgovxG#@)}*jiJ*14c)}lPf nݼ_|nx2'BcD|%}~?7/kmGm}η p[>"!QlmUޞ =59EQ͛obwgpU<\y*6F̃XPLd%) 8f|{|!Y8{81zzVj):FlB"}fxs޸&nܸ{v1Q Zs %_Yo\oo7;-||ƌ0 [[ J(HHq({{cP%ʢl:Dž 0oi-"vtB87B -J>*D tkX|Agk8Pב\Ν۸y6nx ImppBpepv~_ρx?Lkx4Myli1֚1eLyh`6 5 +c?bwwǝpRHր=X;K!i?ADD\2| k_#HT? \cu\^x{co78K;; (w{+Y5<ƍ_'EZZ$EgZL< Q}׹.\H޷L5vw -p0.!,|4t A" 3ijN ?s"|Wz2)#" 4@+JiH4BYޥ{%vwKL&uT!‡ 턝ޤE`) ~[Erfޟ<#)!Yhs80k=B8*+ Q7w}f׼UUco/=Ft1V4e.$j`{`4pXPilV(EiCS;V8% Z3f$ IH #I,8Sf<?Mx4]"&}"X^~?"#>jy@ipHQ)0B@4@kBB:g!TdRb:1/jE]YTEUE{;I@chQ XtzFX39]\<ɨb>/NJ֙%=D-5f`syD Y>A(`!C=} 2; iEog֢,5W ̋>2nrSJm`_?GYl>z9t;izImmbк H)^'u4ZOFk`jbн.ӂ.kĨ;#xyXhh9 ug b^5 eT+`K˫"RKx _x3eE"T re6Fx(aBW1]GlŐb3X m..mK.V AVFE€ #+ VO +f%UݠnTu,Qu@W?Ὤ7/?EIOf&yKzzuK{H$0:Gwuk`W ȼMyh1( XNﻢBB$$hTkLgʢFYW( eYx;)o ܜL2KCZp_kD>ψ`(õk=\"Iږ]Z c6=~ی?_P"%{ثM;hN+Dꖐ?B~b^aow)eiQT%f)0OVEOdg߸65<`') b 9rlm$!@saQ EH-ZCpzTQCLĢXzyQi|T*6$X8t=[AWͳGw}""#Ohc.npbm!4KrZ'.b0;;% D:Aj8 IXɤ;{L%,Fa4b0 ˲F\ωп.gp5Go=}\4^uHd#hd8V¦U+q.tyc# r:TttqU]c>-1k8C$I^كUU#H D/LpnI!v.eYa>/QʲBD /cORcFw2b8җ; "PLZӀ#JB?x^׉dyYFV[?v։H{+x_b: .LW&[P*o= aH ‷ B:TԀP |^`6 ]sJE$T2HZQ cZP:X \#>Og7og?zO)a"l8ࠀր1=(e2F[4>@> B mz`Rq@*bBH+â{hrGϪnzu+ {U^Ƿ;1O*A2CHYxrXQ^>πHf"6@O2ǝtZHp HęPzKnn rp@k'0gj֯[|4uӠ4uqF Z3TJa8Q`""C ! x1"tNV,X;c"6]"?dDkQ^# T/`Bm V B0`VPJHB1_ A޻hhO `b&-T}IZk="@kOA8TE]9E!=`>X{M;`vr3DqPޫƣǡ4aLZUFkCw@iKkBSX#0X[&P 01|d]Ah11G=9۫X5<+D[\pED"1#|N&Fh+O 12sa!ZS;sE Λ=(setG;r/@C٬dRn,@ /ltޞ.,`=E|Ue gy "=CDQO Tckk6p._!`E0zO"ϮT`4\H0HxH+KcoVޢ#;[5(APEYG1uf (8M'j$@POk]3G{Y,n)?O 00B0?^Dtf6i{dyl n)/p_]!Ja2z*2Aڪ &BsX:*&9L?š C^뇼@idfz)673\NZ- 0gz$< Ac;l>*@)?$v_3-9I0g2~/FȲJl? S_ G{) M?)z/y(\4}dYmx1fR0zI{aڃ8[tC`B|ggʪR lo0HMl:Zas }Iҥ*}>৉p(ci z晟n#k[)fZ Bp+g=W`Њ!>dzNy4f0{fQ`6ƒi~?pcϐ 62QƘ#p k앯tZ!M2: 4M@ɡ>ά|`^z{DEc -nN.zF1//*XFFeIf YXN78(M9* {el;VZoqp F9H^t$~4SO]xK)];l1yȗxW^SA*H#/x4tآeϐqW.QK+GJbF?/lhh Y"ؾǟ0ey$x1UGkGqO myX4M B]hi iڂUU*5M1B[d #F.X-9\e^[:Y'+,3" 9ylD@?BO繿]o}p{;sZ0D^,sˋY!\&$" Ɉ(uirVrв@՟P?6?>.b"hDA%=ÛֺWxklV(c\}F|' {qww њF>~p^s~ZSt'.:8ꞧkp\ӿ<_NՙDt!}]k[Uި*{,t2YS:#u:+_~x|#xz; ߍop90.\=$'RטqC"*g4Va}(a[^|f|UL {^vߙ7ܙWbګq\8Y n~=Z˼4r\+4jPEa#|+@@DvVp-adZŢg;9kWUf^V9ȏ~pJYzm:x7?!P( kW6a}{kF^^Trz"rSdY?W"=쌾% Vb`Ho "R{_ޞ_}uAԑczA1_q(84xRY?bBǞ3^h=4s&j%zsZ/ʕ:6D2_vSBK6҅뺽"Gduv{u4D ސN0t9k>u @sDUP# 9"XydUUA%*8`w q͋@ ' ~tL|O'pt~Q?2"$#tA]|9/$g: <4u88؟^tq&BG}ޢ,(kZގC@.b_:B׃ iK QO?Z',eViͻSsxE8!88doow^OE¼8uAY(UU"󅱇1bNw:@h=b/ +*F 8IUUJj}\Vmc 'GWNq>+D?A贮 ӻ88p}7#DG7QyQιBսUUE}[#o AD{_6M7'ι;~vVwLx=?UDwwl6.Uk u]ODitNBfhN?=Ǿ{ipI脺y?i=LDctוR=8ʻ,KxŁis,GuIwu@<2t(u]/}޽{o9&?o#;9@Ƣ;yC<pVwXy$c'!etֆ~y_SJ]$"Յ걃ytf-̇"U`Zeldt,[HuڃrWfY!"gy#?[5:> $9oC-+N2gẓ.<3γweY.nl6t:x<>vww1Q%}Zd2wyZ;_uzn=M1g9SʈKQy|Jhd;y?.T8@ '|իW??Gtc$ <`0@C$`C^꺎-p 7o߾շz|>Eğ3'?۟7ec@OT ]KoHj(ŠvGQFq3e3ZHhd~T@tK>wUn2O((& ! m[ϴ.N%'URrK)ZGD|J !( ,7evn_5Mb}66L///o\5kە8W \JR]ಟtpI@!}ٹeQnGUU-r@xA8MEC1¢D$hteh4$I>q ي)llRz4S],EQ<=??/(Pb`[$g< B@A}iy($$lyn7_}˲p8Qe"b ׊RkRΥVU8yzzzxxx@:0rs*H`_EA+z~Z G㭼~$IY 4M (F>Z+z4MSe\.ˢ(쾝 ),mM/0t@ςAZi]ʂt`OmH6yA\3+Ǜ5 "CZVNŌ6׈,G]XWz D8M6zpb>vf#_ /Oك=8FxN% G Tѓ nJ ;18 7>p|JoO"\@O!N k?gM\O+P\]9M-+~@s0Wۧ%^k!pB{ӵ (! p)E&9ύ|. ; @q] Po.! jg8^k14E@(L;~C{z O\ϭ|ަ=ByԲOB pSMt#?6w^3@MTT' @k=ǺJs=@%)FW`߭ۏ}}fw]s!@u (tAhhgeV,nIENDB`vokoscreenNG-3.0.2/src/pictures/logo/000077500000000000000000000000001362045215000175025ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/pictures/logo/logo.license000066400000000000000000000001451362045215000220060ustar00rootroot00000000000000[license] author=Volker Kohaupt vkohaupt@freenet.de url=/src/pictures/logo.png license=Public Domain vokoscreenNG-3.0.2/src/pictures/logo/logo.png000066400000000000000000002043051362045215000211540ustar00rootroot00000000000000PNG  IHDR\rfbKGD pHYs B(xtIME9; IDATxdu'[kW=~_|i"EI8qAA&ȇI$IsN:unznUuOU:o[6p88pq88pq88pq88pq8[??&In{^D8KK0-"QNDι(_^q8>y#X*ukZkʃ; " VU-BUZ"38+W2cMDD4$@ `EQO44#zQXDh2h灵v5I U%U%"ғ" odR"T51sZ}V8ɕ+WF.c'Dꤼ1~8  XX]U' (Aυӧ ^ .\ WEmR{"Q(^~zR+AȉHQg\|0ǿpf- ڔFI͛7'OZ-^SזE R^y~s (Zdvʕ;g.]r8]+ܐrDQnJF9jh1b4sczC($g%Dp Z;N[;x2Ie3;};w$:8 nUQ@o]kE}kڼ_;Z[ҫ0U *dDT5#@^ uVzʕHזdFD4R˗Gp|W|9a7nT1_džuF$HcHoMɵҼ2\ hgd+W JŠOfe% %g!D$*i-Ixd %˲mHv|øt)(fzc9в%g34jTݯ}.5΁ʬ.ةPe; "ʯ\j^FAD^R""@YAp,IUTD9sQ0 A$Q(BTᄶH:QX?W{Bt7vQThX2&%WU޶K.+8f.]Spp&iq4Mwn߿{7^q$1.%$ $.0$f(3 Lj((9%Q%U6R`7mGh Aj%@h[T*Ձ&F:.5cc"'ZW^xwh64^Ej$qŋi0Azg[ߺubc$1. Yˆ%K! Ha 4XÐ%YĸNl$'vX * D9-I2_usTScGXDgWiҊ8$8+a*Ϝs E[WD' Edt>%W'K@0Der֭ct2ɫ^9yrE8A 0 YMʆ4`Vc< pE,n{CJVFc*z/J%@"(*ʥgQ>&Rhٗq:S#џrB,Pj,*%LJ'̋ڿE>e۪`ʕ+;%0T@Qf u iEP)/ֺ`PSUDpNa 9k{!qPN6 D2 өNH[@! R%ǁ J?WWBڵЮtEƅ!ihX. XCbJ@@ R 4s$Lw'OԠDX$gCXq~MғDL>${!M@򒣸[#6n{:)=rkm+YY8ˇ.n)n@_D4,Ö_{s=O,p@9X0$t!$u VVZ[JDQ7:-yXQ8SNTX j)V)~yՂm)34|8 &4!k vQ"(d8dIbvqXޏNĒ%0PäL*!ary U _seu^f4ccXEfih2<_o|z u71sfc;mxbݽr˗/$\)jx,s;3su@f^0S7fRvnURƱ5!R͏{-Q 1f˗+*P!a83Pw14* F*?k-yFy+@8 DXDt7S[8QqUfҀa=8 IBoD!\Ć4\/b׍Hzߋؕ]0A OtVIV3'k{.iLi& O6xJb$"[_ycmmc=h%Dyǥ@d"St9}j;L&N&Q@R\Z4u`gfZ9mZVTqC[ UtCKeC8{6 JƒV@RZzN=@PQݷ4DOzu)N)V2RUℚR;1{A[pq@(V. 5 0b59e ɔ)pR@c܃a%IHOm~݃@M_ADdJpk4= Dݝ?.=qBU:Z+wYkuvwt?US ˝NӍ 6⧦$S5tbK7m2Ke] ZZ<ϹhՇL |R|c]H"`"y![*inr̓g3@Rg3K[hU O|jT s9ɋW "|@Eeju $Ih{{;FUqM81"{©Q;"uEqU{J(Ԙ m$_O WKbom!-ļ)"BEO̭A̓ЩXIEJ v-\Esy0'SE! X޴}qs}fΟ6BCGX!ef{-g)\1'9UJ6MQ8${w+GLӚMyXw[&)e5FR$I @ԕv% A#զsN-n.ܲɻ&3_oU@VQQpofv#ʿ%RN֖*u~|tyDP>@uj7yOhЅT+r. 믩?^x<掭X}0!Q#vC9b/c  6bؐZ 4ڝ4YcxNfK'!Xc@ӡ7oGfcI$Ɓ)kk Lqp "Eܭ}K.o2m^`Y^19Uq<]RGW9^C\0Y P }ik!?[Ot0`,+HXW_5ӨvD'A-.'jVhKk+ߨ'Zlk;Ծ0rO潓B / V,G jg8x Po)`K m; v(ga>-2U(X@%^55~yںj!j .2n^LgbR!eb Z p WRa 8;  c dx&MVb՘SP@epnmI[6}%b ]y8@0MM.4s\P-y XRϦ,~ ȶ"/r©*}k {y74mJ U4M]綬 !KbゐՉb8ε$ gKnO\|V̬a`f>SEKfD9a_ PGF 55L+IBqP^F9v7aEDspB'e ,w}'W浍ryוlh&&/d2>DuE8(cFljKQpZH:pk7WN @=hdut`4Aav"$2 L&.2뜛6i{FѸТEYшdUȭֲȐBxВ VKG{-,k,+!.gW܄rNZ70 t04C;&lbg{ >&D"* Aj'H:a!wx4ؑpGk~LV֏)QQU)8tòFu""D WvuzO|x0uk7xԒКJ`VѨ\RZ k3USL2CYVy gPm:U8 IjjżM["{i< h6'}$ I0b)R1I,^ɵ3W Aj.Ԉ5I'Fd! H0잉90pȄe|tK?qȓ?++G Tmذ[5v iюaaRH5,62XhĥssHcZWSP? <j ђ4q$F\ySX%`ii*(sf:Z'Sё˿~A,Ziar@Qn58v{@ѸX[J.y!*ewISfI5bKw:]D1wxֻA6'q}p:޻v݇Sw&_a4Q"@"1pGXY]Cjk+v;:-w -P7ޒ?.>m84EP ,L8-읨=M9ii& jfL."۸_Rti.gQa2 &RܦU {E|Nڌ4s,mh 0 F sՀaҝ;wқ7oz͇t|B]B1AΎ~zZ#DuNvG܉1aif#ԛ'9'eV8A*ѢlOY2H1=z RGzMܹ}zݣX<b9s}{ \gC$ PQEepj_x]aoRI`8qU2qC`mdUl&$SPr>qH($Gn^Dju_[H_,smA1 xb55K6c.9s݈ / Z~pZLDHT&NE+vx=0v3V}^[?jVSB(&B`".~ [U\A[w着.cee[{3#u+  y8~Sxg3O8vd 嬏Q` 4iaTTk= 8d2x4MpNI]GMW&.:߮,\&}2(Z}V acDIh;U0WRJ?~3݇FHҢ13OıM s8tl- 1\y nߺdd[XXkO'Q…xg zd󘦓 yhxDJe憊h*Sﯴ*UmEI2=W'^BӸ6BR`"BsYi/` 7oTu* f4I0 ZS7|r1f^wgS|;o!TnS奤L(pq\+x:s;N!uE1&S ž:U[c@!ܩG|8~2]%Z҃ԅB5-i=j'j{sdB-iP(Di}EW̄4f"BWƣ\R".xMhLAqWኪU%/+hU{uh7bZŸzqPKiPGAߦe3 6*`uQ1Xe`CFDTІy!IԾp `,~``[$h"̬9K-g~{$6rd-* P*j`CjX)B,w "BfiZC$JH‚VIgb >/_WAAX4c:xgq _<.): bFa-Nf<ˠe샡PY>Wv$IդnI|R0TiZĉkgsgaƽRdCeU ?Td~=Tm WA` -1UL%Z'Fw7{7_y +H#`(͓'O3O _iDaQ3Yx_SXu //o ߸abX$I__ç9U FU7a Dȳ1]&(CU%U+\sQc^5T3n6 !],?{ = Cז^KהF\z[v/n\Hq?v9&QdbgMs:i<05=sIMxpvfͭ @v1̃qa&`9j2|_2p(?'/)؈8|F!zWCB޹zSH#;~"6pҋ O= rm?s_:nLCARy56LcC/~y<'>>0 P8n7on1h[)uTa |sxWBb_64 ll_W_ڋ'߻8E6\39vvvi1Wh0Ffg4M|cVVqI9sME`Z#~dtj7uYyCAC:H??|:no޸n4rd~=q?,}Sp4:I UE' Ooo6^( K[wa<"dF`~/wnӅ  epls= 0 G7߿_(W/O//GN, wu㷾W׎DIV -x _c"loj|t r+6j?ڎ7eF]lB-^C}Ws3k;>yiҞG/¬Pf&7'8}ʕc/_Ոe_繛L&FQԩW<e'JY0i@I5WN:``*Ls:ѡ޿~oѻAG6/sHAǞ8_;/#Ϣ?^{tkt{q1  uv{^Ŀ{wx)I:ӧ 67bo0č[  xK&@!9nG'N$P16{tҽ$=P3(mןtķ7f}\}d@}zַ3:gJ FqR'`m{ {4#E=#QZ`Vs- Ah(Stk'cõ(>xpPg:(YIUm+DB#QA~4Vtw?#k TBټ܀Vq3M0NSpo:HzGM Ξi|ԱcXv`bXkogtV9hn`0B}~%py<øq}E1@ =Ckk/?_A߁- ͻ[4'TB+*~L&XY÷ѣGim}C8ΞʟÄgSzg`&%Feo-> <SB-+cip3D|Dw@#,X05Y4PViVt4:J-,|,K0) :TgD9<`@%"Z YQZ:F8/=%* ѽAkI)Tm3.lи 7 '|DQH\7lc^7yEz'!!_s⋟Ƒu}|Uk}q@ ܓy`g+p3}~ko0ꔒ`7\H+_Eu;vAvnoN})Y6:lݽ?֏@D8q$N?tnN;[[]~3y㯾A?~ Ǿ?W& {7 ((Ald1A?LM (E-d`ޱGMRX-@g+y~R8N湀gNNMu!9K3z v0x͛#~ @_H+1PI)[i ($<ư:r#U`ZCKEbW ntj#1GxtpXGEug#!}hOE"ҋ@llg ݯ# lmawi" #Wܸx Q ` b#\=~Cu;;?zü􇿋\^3Uz Ss}{%VG$e\ěVל)#F?V94T#j/-EB=uȵBP@bwTH^88خڣԓ퍲eԒZZKMDwx0vF[V.ŲhOn޼9L&|zk 6"cj`<),ׅ-`\ 9/ w^yc\{?} Qw QF_2{q sv53ɟ1t]a@P".taIs8Dl"JE'ŗ%<}4/j|8h4| 8';IY+! vvpmjlj:'0A@g:h@,Am߉=B(Q0+-v{lG{T\0p.P)';\` S3;W1n"Vhh5XPH<ebVtobeR8r*0в̲mDVe*5LXDX_nle"2@U5Q/<(˚:̬p2dqN dtc=*:ISdr{ņ'L4wn<=+}\8q&̔{`mnWpSW-Z~:ݛLIr(~i<F 9!<ȣbek-v0ɳYï"{Wy$ɚ<@Eal>F&'ΜţO=K&1$GN(~waȮc&o}7?x+o^e)&) ./wCʡQP#wDpraVS@cPK'sF~`B!4ܕfۣ6?ځ4v(Fy+YrN\#R/L*/@ l IDATPc 曣hV&*y$?q$ٕ݉5Ϥ,6<0f0Eq8ܠV R}GITRh"7D3 I޻eVfVVrQFwUuVfsIҁ&RVQN#vSYr"NZ!6 MLA.٠ 6HA Ltq_/aY5"k;/x7h"R@"JY(A8wƃLy^'o/>?z/}iʯ~:yuJ_Zklnn{~?x;Hk-D"H@|5FAۻȳ V%q\|+&AA\_ _-]zO#vTG:߸|A!/VKxx;4YDj:w*|zJ#OS F <(@Hc+/aQo"˱~\ rc6&Kw'MQ?wvxޫzCǒgBdHW@ ; GF]{1#,4"Mo=T$EO= #s,ݡcylZ夏ª4Ɲdά'޺,"il( шFdu|{"] ;U( o"ai8=?(YlZ&FzC`8Uw;W=:k 5IcRe i{nf 2kW3Bg- Ɵakk@-J`MdLlJÛx7Ͽ0/ =qE^`i/3t,YQՈT>"2?G:=,\#ЇZM~ KWj/K{y !FlΊ?{_Pw߄]@AV ^ W~I}1M9A2k9@< P`١B%F9ɰ2=G4 yfҌz tsHGc13T5VhhM;ֽuQ~Q)Ib:(d>988ȎzZmQ&MD(0hu)k7>gE@WjO| ޼0 wlsXZo@!U< H?_p}hc)D ȖM,<az؄ZDi_B5ΜYk z"k& |`E)8m)Rw.6?ݹ(x؃CV8, Aw7FF-AཧV{vNA0q&bY L {!eHf~Ugt BŌQ?+ҙ'[iS@:,t|PX '2̃G5ϳk9c]7S,V*1"cKFLU 0FA+BUfug?+pDN jww7M#6,@E=5>Y0̃If?tbBYY-4 ~A7+Z[0j5WWqwI͛g 4jVr/TPP* "6ZGR6Rc*J~8+8XjqX^^F;s{jcpxp_[4 pEZՠTRlSVe~wg9F Q 5hPØ֤T wݞr}>\ރ/><B//y{jik@I|fܛD&u6Cw2'U OD%&=bV8ң%&2ZQ`0HZuhiL‚1[Mfd% D3 '&&zD 佣0aG;`&DQcw._ZDtXkQ~#t:0ZC]? `al! !`t c&8{:]Z TuwK,cL@*,+fȊORh^Çᅬ?c`p!WxKj_ʼQw8Ԓ4ApE.IIQ5 \fOE'W (9CqIÛoiq%y㞓$1"0ZO j^0hp_㐹,0W8gxqj;&+&DVCXNYc2~@8[U+qQiϐd^H_tXT8+h!C |'th* Bf`dH3296ƽ?|ݮG(hֶu߅m`W@CQ!Dh5j̔4RĒ ˴xE0H+8ܿ%1(0h 'מ^9&m:ٶ̤)t+8 Lt#S! q>'ˉ0xNȋiɬ$y"XtJcCՎIZIʓ+Qy :3Y)dW_Ekrm">6M骘 C°z,sP$qT`=w @(ϔe&DLCsx ?8"%H\EVIm6C,I `ġL hV-Y2][ūFO 2) ]~34X E,6,])R`T'j%Gɒ_ G>yUV͗_~9:8EЈeyCA)g?*|F{8ϠObBAD{a380wm aX,/Ր&/TE++1ji D0 },Wv!ysCh_ŗp~#Z xã&Y EVq:<|o˟|!dz4TU2(U(;aFYBi42^\RHa"& !d}[TtF*:$ӯMP 'g:Lp23#w̹cqKFC2Xy^cΪq!ibXnDnDUƚQ-Ui=J "W]>IpT5.oq',p^RHGU"ty_h>i7) @Y_8$iNxi$60Z#F"k1ft*~ 5$I4IPKI "9F 2$]} g-#,7}enݹW:`fZ QdGׅ&q<~cAHH (Cޗ T k $FeZ(rB$'fcΒ a؃tI SoiKiؿu<_zߓӣ WA@HX ($ҕc4rwy]g6V"VL4ZT1j!kHzw;>:@DW8g5ef!}c,),FINA w)#{0P~tb;Aj=7r$IWpE@TSYUf]J~fʀҝQwvs =jizV^K14AH֨ΕWl#'kd!!le=^) Bƨ1h@=eS$ϕNR!:mi2fafeVJtr\ƆA/g\@eJA)ELffaN96'ddh`y@h7,ꉁ"TųLk%c4g+ņ jvy?%O^J^)i J) ՈK~"T4aqQ^x~r `\} U[~@HF(2@ il",(FG! Ͻ<7@h #Eɴ1QQ&QAJL#U":(V(㴛OkI T9HfMJ)࠷vbS Z^bEE2Ďy6QgB%|U []!I"f "c0r8 ,*q+ J∌s;IZxͷpkfF6qEAaiy ?S◿ZZvz 4yᰶ/Wqd2z\+cb z8<bo[w]]@Ξ?v{877)99ZC'5!33j4scܦXUA)rc2BǴQO#SZ)).C}yccVbFhtHib`A־IW$"g ܐ :+NƍRV{X]nEGB'ZDrzXP9?~=3$q:ȂCyC[csAXvKtOZo!nݹ4QKqÝΛ{x|@ygE-8F@ZaemKKa#EHi8<`k{`{{sK#Rwl,4뗏c^)EV((cёh73 sW2 (9fj/Ul9>SF)㥝 F-"uw|$(W[.*P=bF\?̆t:ncc8b³Zp+7pSs׼ّzo h6bhUGNEᎽd[IPX$Q`wyj(}|[;0Q$I A7?kWpY$I$Ь`c@ؤ$R9F?0Z!.^+W e9>z qs[ fH =du $RȄE\ᗽ4bJ \rY&TXLv+c %$A 0pȍC$VBBlƎ"FB&GWHkbnA+˜@d1 , @~*Pf Awww38IγJS_HK$ӏY(pYTUV8 @cKj.,ȸv,=SC1#sDAh4x7 mJpT="k!Ahq(2hk eˮTHZF̌<tyXPCGB42`ҕ^n,Ϫ >4A `ʽWFgADh4^4~qi13ܓչ`y8;"fIY]{Ibv2B6hn}bABUDG,wIVMcϢVnNYQs{1& AlIZukJr(\(g'JL-  EZ+lLy>. m(URa>x`6z9''q8`lEasΗTN ݫb4LMq=1S32b^,44C5zd@ FQ#5G u3 H1I+%*"(+Xc4:W+aНϢpU04 {zn0 kZC)d ZxiY.{mɥϜ=R&g=>BX/@_9^BZzf+AkaIbQl5hj5&)LRڸ CQhI\ /xrFf z*d᪘xg ƔJlKQb Brq|y떄!!M4[@!?LfA`HA[ȳH<ѫ @9iE(N;m?E{d18Л>;ET܌ '售P TAkdd=*E\iTF`f1X#b0d#BqdY(UX]{[yV?!3Z"h)"3籽Ar8_\:>‡qwhC:(FZ#Clڋ8s<Ο[˗VFْ[_JK!qFn>D ϯ\h4 /:(F㑤d,(ߏEG|%TfONY8K BB>T\^k% )EE=W =.[*F#/cÄih$x5\t@#^!8"^<#[.`T0.^? Ν;wL t}8Y>6 !~nboɕ' A8RA2@ `a XoF*EnɄQ3Uv`8B/n3LmfOܮqj/'<žIn )!1g15떘ӹ`,HtSh1FS XGkIH?WH1&A *u!_2^G@i^] . ˝4jV}C9WX>:BBLi.,#N"ᰜx.Lud<o}g# ]Bsbmdwx vxHK7x2VTEZ1hdyZ&F<B_]e =Џsgy(ag*|zZ Ȁy"hrS0?=FE"f M NfvCP=oF$ IDATkvr{ Op8 \2 E4^+EDYXGK0%h)#L0JQ,Ím G8< w5q*m '1xSR+ZRAA^̂,/P8t%+Xl55h4xŋ|kkkxO#/Q6wamG7yGHCāT4E%A*8EF&206*s Cq-pyFR+g-i@[z1Fj_d]Lw23!#6s?I9ት o&#/bk;Ѻ%DÑ!%FEmIg8]PՏ,J 7gzVD$C܉lVM;"AzN.G/|RdL :70bsk W9 0֔vU2y9 EZhm`W*sB5sv/rqMŕe\zEX__CuAqpƽw^?@&QE> QWd^~ZA@ (]AfSzLyHi!AZE+k'u9 2IƜcZi͉n`wO?yˋMV_@c=kE;\o@:I:"ʳSpI;'zbRBJU+It&#;:24* UJ-}߷E0Zܜ`V?0'h0(\!`4)B Dت@D +EJ9x:_fKWE%A.ի94Z KXX\wi{{׮]EspDpHƕ;sS0{ YAO?s_x\r z(1txA s :8Ko;֖ŋ Y0;x?6580P*)c ^Kpn@PˆwA=@%PB%uzk'ovnytOJNy2VKJġ0hz KͨDMj)1+FaAaleqj(@MDEb~lO8wX@( WSE@l" ,T ̟t "0(I}!IC ⊜|ξ>­80C.Ǡ߁61 ûmTkL8T*OxO'~*bKRpT0Q[;씷JT~=)UQ[ !]T)uBCJ^l'Dž.()rTwp<&t$DZ2f?vζѳ62͟'N)59ܳ`/-NsO$>Hn]v?#9V" EDIl(:.'F8ꌓ*.L}1 3p8,ˊ`tQҬo41 /C/#GiޫW"Z^gQ^{PF@WA!? /@8+cx8s %l(׿peH(_=Fc&.( sԅ+eGIX{{$I g]"dM;D\S((M J`! |?*t❏!sQd!BIUk[(Q:3󾚼'9i\,hB`87K|4N y =g>_@RUn_~qgK5F%1JC{G>IP3&qC ,^/+"j)HDE$V+nִӆD rCW9b7l5# $Ddҳux1p\z? U#D"9}*~u 5J'[NT|M:=SiM焓MԈTd=RN{63bBBЦY~.@*R9A7ŗG-M!wȇH{݁ڑ@J(7E7ڢmQ(Ntr<9=bNjӜz>y1S'|7kUO iOiGZVY zx6&,d>v#*)…8 R171dQ'wHK|'Be;!b8c/Zsۀrů/ȆbgA6>ٜx7sC,..Z R6=ʐXWvEQ;KW(^B|bh"~)1ux)|+/3zQLoD.'Yn@oŗv2XdBYMІ(&Mk]dς}H<!8ƅ.bm,gdy_o~E1u{PJU`b!(%[_pV#N[(] {!6Mh$L/CQ̌22waUN}uB ]wnޣF ᣛKP}"zaYŠzaQs>&M[Za[:}/W`$+\dP=|_-ZTSJT,0iy0x<+a bW:C='}93יL*$edH k\˿`|ZtlI6Ȃ:H%82ɉI{ @0Vc?CdIӔz^;w\sL9(_l~)\VZ'/wh.e2?Ǝj/Ik-EVkDs~}| 7w tCm&&<}|#VU]pT‏n[osnqTLjؕ'pΗkW7W{[wwLt9ۛX?/Q}]" Z%^v6DT_xwlX[{=֥dyc_uruukejIE#1aI/Ź _nWۀINKh/XT .?ǿXy0޾y="7I]u4W֐.C'*ɢtP]=/ 2#;xe4V7@TvmX\J~l}μ zJ#R)S*)0KK8sAꇛ)<K~?L!̂VVj* /Hc~^?*Qcc5f~lu}b8,Zz=%F +έ|g0Ԍmg΋@Ffh4rg%$A^Çw~i==y7C#3,<c30zJ~KEq' x'aΕk @5Eh/rYx㷿x啟έƷ_޺#.`qe {p\>ô&*^cS_]o V㍿c4kJ3L}5)Hݠ?WX_jPb (8M'))Q@ 9seM\k`EEE$5;ka gqeуѭ7+^7EO?_& 4v\X/ Nd%'b'Sj+ɲ{H4 pAݰ*뭃nъ!fu 6N,ؠFADqHrws%(lXa&"x3!ǁ"NwnqpCt#,9u<ˈ+_z gADfܤoߕ"h4q9yZ\YpaUT&:isW5Y'v8(i':/ nOc,BsU-z- i8`h n^A~Y &(E0 b$I$I5uk)j:W0 z=4-afMr]I眻Ś{b VXSiӲ1g,=IO2dH=dp d""3z8FE Ȉ~? S{{&ٸ#1)3ЧIȓa[w3+ݻ"@E|U!$i8δFJ9xJ&N 'IfYvZ4'95tD@SOq|8Gȵ.5BLt1 o*<ς~6dp͘T|{/>\/iU_hVpg?C[B;~xGO9ǩ6ӄ [\D\2䬱Pa1v!8'Q/K:P;y$/;@i y7u0Q>N8=c!$Egs0R(!&5`eevpl} w;b@DOth v6ni֭,ק1v,\F' Ax"g }@f3J03O1Ɣ" r`F)2ۏ9I5K/ViU:QXIr:sx~D|zT3bGHO->Ek!&'I +41i=O|ݗXKPZk&akk C|cQHiq“'f׸[|n0 }FcE# c HذaT?V>{: ׅ(~xȻ;x],ipJl@{q Fo -9`8FcemaG!Z\_]hnlq7 kQ,kTp?@,$mXbyw͞k7 fhg401 0@D}Z ffAq˺$*`4,CEFH"j}t:;^45GyAŵkhm9ZČh XuK0yd?@>C d?/o|_:.j:wwwigg89^~06q[ f9T]$p'Vy$I!>{{{88GF^p8vwvpE|2:ĺAZ; d*',PEW-UbLD882b]Y X10@!-"'> 3s: è^7Eɣ,ziKUq?<2S|*K>/,_Ӓ,As҅RW^#׫xi@)4-  7jXW/ XB{1 H҄G! x^X(D}u[\DP2pyW6^gj}f{V!X*qݷ{ֹUjolnO$ nݺM?/^DX4EȲ yYx H!(ۭ6.]7o>::&˗/c}}6:Lv {\:uC磂L:P8J #|* P$I`mlltIԪ|$heS^kd2+7r4INDȳr\\z00u?9x8BHS Rs;l6uܹu ;І) R0YV2Yk e -~ 6; j7XjU(G ]TeTd0VM4dQҹЄ,,Cc|cVk5 S>|ݣcz]q )%.\8k׮͛Ciq8&}/8֦^hjauU\nÃS #qhn^7nbkk ^/J}wHXI+)gp-Šѥ,"JL3Ch㟩HjX"^o\S҆pͶIJQ`Ugv20wNji>r%c3[yfrrîL~FpBѢ йu}C纨uJs]x sq|҅TyA4FwaA$G#6pJܯɌ \^ij+\B}uݠ6Lڀub*QVΔ<}TY~y @'Wvʚ~ &H:.=z=~x= }!VVVݻ}iw#;Ue I(`P:ZST!m훸|Z6޽w}Gpp_l戢Nnݺ7os=",7\1^_jQ $p4(\$+PZc)˨: #B* &9 DiG:vx<t0_ZX4M8 A@9.IحVP_@cu/rF%\Z|Hqw 6A_wpn)$Ow= NN:h6x睻xpEao;qwN>J,d Hi5 Gh|ymKq ~wp |WoNuFZ@֭[jPo4 M,.́}H.PB(a]t3 l,J?3x֘y룏>z;J\TzYHUـ9== f :W֡|DK|+6T%bәyA晓Čf+UuDIoO_OSDQݻ} O_9hd>ZkKb-XN Ag5k\c8"RvW_}/];#mq||l=FvQkue88 5oI1iJ|Owܹ~!Ḧ"$h)$N/ή,3'''qeyu!zq.ʵAk3ƀ#ExE͈dxM#{n ` Ncx)3dYH۴#,O C6l 5ح5XuAZ׌!韒9[q٫7Pk^ C. `b_%.68pg+.g@]2j6QĻ;_ iի/;wn#ܿ vABqɇu6%Lˍb3A\fHe1f M2D)N:_gp]ݻw'''lsl6FaDoheEMNsHRxd)q7u5\a:3c`U,#?m5,km#k+Z']1yiHY4)cu7 eY$Bv]? Fuq+F3 :K14.c\N~mV ~s)' 0a}`-[H4 NYo};~ᣇu7oo~ܺu GGG⋯poqr҃xp]gA~ޟfy\xʙGJY0= ?I]+}6 ܾ}<*to,N| tVgWn`&!|W•G3׵5\| ge/, gYf։Ru0g`Xd [TqNsY3],b9  `<驎85h)<J nTޮ|Linxe{V`uj>y5(Z,509L.3cBKnk΃mi_Ȋ(K` Tg+k{r  ]]0ęNId{ajؔdi*Qh_}o-$ t}/W/N#tcܽ{կ]?~NcݕIDŕ梬pQT2UIiJ{8[!D0>Agx/~~O?''R]Ԃۨ5g88Lmx) Bhy%e4$}G@)2~66VMyV#0~ <,ac `0gY* E`kڔ6f(ʱE~UȑGe>&O2 UL&L)`&WWyz :~FM]%5hBRRt/`ǯA***.`I< .*c !ETVdchxBwhN߿]""lnnݻx"vw}C NGmb2>r`7DaBzP&K@dxPV:\eaħ>+\x(`"`}}ApOB9e!8 ;j 7V#>#Iuf7o73B bKN'8jj4VTO3Q3rZ)ӒDC 3xPDՄťd-@RBrv=i-̍RJ$145gQ0Lz[uĕw.P{m6tptCshv/]ã#|WxpV4Gir( Qpl* L Pa^T3DP-0q9ܺy{o<#Qtrw8~nX%?s)8R`0NC ~/ `J X)(㬬Da\qR%a\8J(*[K~Y\j8,ak͞T' ]gTLEpNCV$0 J5%5g(AjT g<dZ ՝&*{o z.\/w..@}(ř\T.M-@ISb6.+g9YL0%Ȧ\'QԛƀA\?RxE \pzގL)~+%6^|[!G8'ƾ:`fZOJf)6S<Ǟɓ'0 "U.@n!lTIb@L(G@I NBwcApX pa{-NL4*If6獵D,Îq=HJ~az_101>CgI\E~6oy:;ʡp;;c0b0W^kDqC.ʽ($JAI$PrUyPҁ JpScW؛) ?KY`#v{x?ǟ# C!z0@ـvD3=ON*ZȑqfDo,3T(7/c~T?7 h4XHD4K4 J 抛Vy~a4cN11晓fq3̜ rM (+#ib&T] T|]YΌb{u>zFӧOC^~kkr &;y( RăHBHHLuRJHlP+coVî+eoÁPok61tNCpt ˲g؃ )}G;h4xw+@pGCӡ,k f+Έ*LPNEe,zjV %$S,2 '0Yicۦ'r4]@ QYnsDx~W SDb~FHX^b }qӊix&Qu$1 Dڀerjg*",$Y=RmGjrf)a"Ib/q5 |= bN_-N|[K)&}߄7Q<x MڀYĴ "h@8>XHi"OHdtAs:ۈ,!66q{g<V AUdHyxBN}Y2iHJij&Z4Eb8~ @E'TbQpd$N4/xSa!pYy0)8 qi3i(< SDb~@KA%SL3kAQAIL"OEގL3a*f* r@`P#0[*.:z4Eo5|q7Pʼn^ᓨE+ )(Z@}rzh+Űey4W:wu {YG}wlE6:I0Y9HH=|K/୷‡~n0 1 &LsJ{WrfhZ-U bQjdoF 4]?FP,DQgYˡTӍ.JEj'lhX""2[WG_iS+eDE^JLz"GVڇ*Kk7EcLw~[0  a^{_wdG? ?xK "(%)NN8==Ņ p <}qj$IEr@tj +_hNAI`% T^\pGLTgؓ> "e%m6l/ױ`BBkLajLsU_ixA{™g^NfXq& se37EE7%-aD቎S78[ Mnic цDSdHpGtpp~4Myܹvws6C9!I)`:.\ׅzp q<[< p||PF#?p ;C^z#?cJ#81>Kj>|M;wQ!Ic1cnyQh%麶I()(Jsi(p>h1*\8j 0AEѸjX@9W.9 tG 2ͨ b|6GE+=nJ ,A?Z4;\CU,U l-,sbgc0`i*ډUdhH Bp! hu{|zzB̌f / Ct:+#?Q(Zh_VRIH@E <(NKZka`T^9t!4!la:B kp6$~@)@% I8 ՍY0 ^uS0\qw 3JB? ݳ*p)8h GA|2@f  3afxfH\x0Ғ !/\Aft:Jr677l5jR IDATS('LJzgGv̌O)RH`7-y !B .{' /6 " ٠q;՟Ν;BH&߅h_:F5`Օ{j"ߕ|2Jē4SP/'_t z""C4RJt:`0dl{FW +7J9 _Z8Wgz6u`q/LBLϛbFtX"]^N4x\3r 0WC'c@3=aɖcLP@*i9$jA W\Oc0L9l.&~ Q;n ;q\8Oo`LcJI6yܼ W[A ;a4 C 'A5X}~]z}ܺu oBqDI@xсQ0 + ˙ .Lf4:~a@881ƸK㓓aT9/ VWZv*.\)1ȳ [/߄O0ş B=@vr< DzFF>lBFE Q 6`Q+bf&G FaOZrs}Gk-!@_yE ,pDQ THO3CkM6T5SdaXI] EAĞ3rSz_!~"9~30Ţ =rHJ2=9@iHX"IiQH ou#3F#燳? 4[wO# _)^c {Poҥ+ Ca( sy$A>Z+hv?Nԁw5/AЌ]h zTH9B"K3 4u,(HέdhHA i?sEl<+U6^D((~T oSm']o;1 mq9@*muQpϖճ+zU3n9 X]簈h4!%Tr0fhc<VSip`0"3:AHqOL:WVV^YAi !iMм{ǐАN#$ x5|_Gp`ō7`&]|q!"c<G:I*KdpׇkM[u@dCi!i|?@V+/]Τ t3"Agl8D IVVV&( 8Fy`{Jy0sFV\{U>"LB&}ESqlA\$3胈z[NZRmȡ-xՌn|9̯fug|όJ"2|Aȅc@֚Al_tǖrפsPF 3 ~Ȳ > E`cԮ c -u܂g:1vס{ c4" E(B&Z%] B:< |l4p<g+)$V7ڭpp)NTh4OB3Qb.?K3"WG%9*Dž3I-Д  > f@"B$,057oaQY%G3(´ {3 Å9Ͳ9̬G*A* 7hfש9sK '$DaU:RC5hl"y =Bzb_|I<t 9,1q<<o|1!z<ʯc}}~Gtku 4slw02|ŧ>طp S|*wh0-K<ngPڅQbDq5DǨ4*,h4Juar0D"\a DR H^L9qy<.p!y1 Y`oģg< 22v,lxfXyd:?O(i5K Ԙj[9 rQbT>w;Hw?$!-@-$^ESȃ/w ~a"f?*LNb{+_1 ([h>CHj\ׇ㸨hl]D^[@k4-+:8 Ešg;b-YCeqehAT1Vo裏=1=>T-HPW`\Pg0%]2B!khAq#s2o(-fAaNhv4S cQByAuOagX_Rp]J*l^uO{-}(RraX8i00y6ݎ] bG O{gs,.̺HZx T4Mp8*`5g(Kp #Jr)",:xpT]֩ߘvhɋ4_v/l }fk "9˙0TѝTTS ;`X;uΒYf}& UbxpW/ B$HL&X)r\  `umͣ&^MtMJ 5,$,̼FKou]z:w}A0u E.o?<Hx !DxiX#bRaͩJaj*`!;$qQ9B BYʄ Pij)@0s)K9OM>D>x%[}|`\!,Y@+EI`H< kF)"-^(ٍKs03o/`0 >`6nwye(ar/MNPOl\S0o<}$I&k&,qA˗oau} ^`Zm `v*ӧ x5=]V8Ic0!T-"T q)OA 4;[sY<:U r^TYY0f6Zk$8af#PUJYF`hIq[ӓj h gNg3*KÞH帠2! GK+%dX(j$Fe)K-6"Pzv)3r6V:0LR!&`*^{"%DFk48u'E-FP̞k뛸yoC! #Mh#,*xdk X)ʅa ϳmwE VP mEIX)wq}v3P Bw9^(mmʮͿ4ELM,K@Z@խ¬6 3I4FQKaE'ܟ?'-!243B1o5x^ܲs!Er!IΜMJLYuu1`s^l WVpty׾~4`:/o )B&*lB:`Z4q!%8Yn?q42 )h_d3WK,-82=S⿢¬TV(DiFg\ar9C]leJ sFs"+1KZfܼ}Ao@$EdybBiN3m Sb<xFop $`[1iI9B_'!=z-q9'hz uWpCdOQ3zؾtVK cuVV6C! GȲJ9hV}^[__kXHH.ma }1$BPԀ<(!hcy^$Q2brgEKQ31v'S""A@=pdf$qV[N[sG@,:pu@JynjK!0kM)"c" $Y-^t\¦_ڟ/,KgV C܂ů- ҂}tces_B= 0 ,X*?! ػ)a/lC 2 hW¥70""hs=cs66#2$iZL aX#Cım]+ c}">^owwB oe ,5&ӳr𢝐ʈhF撒\k%M. UOom^TH$0%>41Y ` u *[mB3-ZJP 8IsksY~rY9MYpsaJ}spHAɄ$ZǞqz=|7w/q<~c$.\2gם[نYG y5p]zu80u$URJPad0En} 'Y110m=z MHRlt4{I\;f[ltUuUw5\ "afa0|G Ao W i(ȦT-!NWUUYbvl Dc uZ/)@ Q9X@ֵM<%n! CbyxڵkHEQRuF88xڙ%GwF: iLH]72kPbQADW v\d\83kj*fFf O_=H(G`t(Jݺ|g& %e@9hzj0vP_p2 4B Q5/e| BUðR @_9hK5U&=f,%MSʲ w><]ݗAgx'/;co8񅃧;~j ABeVh:?@Knta‚Z*"h+XX @Hk/Rc AXEx7Zʲ4mYJP遤e&LR5Ijl֬Uc&^=N qёl69WEhù\Y} iDZt"'F8w[cEQRcY dP`]Xmi/#c63{,ä`0O 9xlTAY裏0 7 )t%zHH)Q@ >\Et[0ӄk0y Z+L k^y|ᇘN'-1/m%t8Rb>kl<<~iJ!qNd٘b5S_&shCp>NN> QJmBڱL*0͝ZEȀXvYs<J{ ctߣmuo:`%Ȟ D4~3ٺfT;E$@PXg\Mj%CL&y<ϰٔ{o{җxDtvwÏ6.|ڳH/D͐I̭ 44{]ǿe "8geP[UQKn4 ‚*OBK4% Ν;x7\.1ΐ9&2z=t IDATHUdʧN'jwQbFdUrmE"8n݀su9H0F;(߿_VҥKֆuP̠W˙Nd#De@o6R[;TYDfd70s }OrYZN ԑ@Wp8jyns򶛮TdNy1|2,+?/[nO_𓟾d_N1f^+W1t alP׮G/6=0Ǚ>(@tW͠]n <9 L)_&i$BuG?ܹ (ZFo ^O( v" Szv "z:Z١M/3ZQAy^o~'''fL&L&-8 IW@H<pCLP(*+V+[8Mz饗*@2X YΝ;rRHH8-$zZ^F9ÓvkOC)ƹot0Ӏ3rPvTb=xd0<#F$m P:q{l4DP(/?N/'$Rf@xͷ×_Ɲ;wO?hAK'I 5HCX4y< ltRa4鬦W^$֞̋jmƴиs6qvT9O1gN@DfO~)hFP<]zyL#O ՕS|)j+d4Z[gQ2e0R v];vԙ&Vc<<.YX0 x@ <ZG5l\h@vɶZwb?2mBMI3v}s*U4M10No _>ӘE ,Z?"Ѹ o[!M{Q`NkzbZe"R OuCkdhPm֨kd~-n~Ɇ u%1U zeQ7Dŏb"y:x+W P< uxKLs岄vu%uaZF ~,ŗ ᚲ&p)ÐR;dҸojDzt2] Q H@ n T-Jr1c2bX`2:_~O޸/}y<^z}@ WƮzm 2i"{ܖL]1a-0`{c~⣏b6a6c6Ih6=+ם5FϱqэhEy!zմTst ;&`;BIH]Zs!PJ4%֊Ķe<\VfJk_E3]ƍ'n`Ivǀ1`e>- nH6bA qhonc $ph&S_DPl4 puܺukY<c:mwTz-ɟ >6>gk_=qɏBCдM7E61>BSg%k6^&lYm$J@*r )aVHjğW_E&NX,zӶ83\q||ײG]DAR$ew{=8vDx2l;XhP5eic 4QIAMŜ@.2}caDr}<h]?+22=.<&Pq,p& <>;gl&[cm,¤2ϩε~ۿx,xx  AMǬ7`wtvsd相Da͌ جV0޽wOpppl1P]ײ^ŲFN}i }pO΁Q%Fs\_7UN`Xhק{N`^7ͦ<88X~N6J3drubHRV˜w?m_7>PX!Q)#42 ̀sL" 8,^ţ<(5X'`WncR*@o9}ku&馕"T Ԃy 6 ΅mˤv!haa YVGp;#M`6 ygldxrvqg҉Pa?_Զsԣ `<5$~UܾIzrR[@%"Sy; dl?+duҥ j' tjZ'AF4Nu5E,?Dad1qZH1V014 P+f,Qdq1CTeٶ@)ow*^Fb6@c038::֭ |x^p>kp Nj~Sv?HjQI`gMy2b|LYlֲY<ןFT-uʈ0Ha""7hw7*1UD4C+yd JBPTNXԘA|mӰ`h]$4i"K6}%7~fW%[{$Ӊc^F_A=*-&^[Z[c]@gsK/ye. ΀k\Nz}VDk-7v2q|/*V`+4tB14 S$Utgf$ jrT7Os6`˥K0[{./_g?LS=RcC2Qb9 AemDZUBe=%AAlMi?aHMAH)hHK\.o}6y|իW1XkTk#- 7$|D"5 [mJTΕni.;7ī?Oqttl;9Ҵ(Kklxvm-K!ZΏm'o? U(FiETUNo6VF$xF*~Y fV4@k^.뚈LO&@"Sh;Irn`;7ʀ^DPHl(t4Nh>MERojrȺryau"#Sɗ]ИdC5,}#}6`]+#e>VB<95jj%i[QΩ\)k, T4,KpzRneY_=iegfB^.l &_`l:BbjU2˲Tk%Zb:{eޭ %ժz]aA;j:4N== otuh@Gah,DQ(RqP@NBXN༌7E$;XM{(r 5׾ܬv?;~ո|:Gfr eY!eA IFo7__g?t,C1 MJlVI`^c޻g|(˲\,kM6RMIK\eutj}_FL[z@@J4 xm.-*vy)vDHZ]Gx CH HhY"LĢi8g^zWկ6b7&><<9XùۛBtUj݈ ]~xbK)0 ]rǕ `T8}1tv"o߿VkY6ҫB8;KM7t4.6HukP$]Ԏ:&6 iJF׍TSϢy9 4 ` ?|nH m5,UjS"NF;\:B3Dy®d;̽=[\wG9XcJ?H|rQ,X2UC\Eߗ=5mr kI`~nf7] ݴ^cR:4a{Yu6h 0;O- F$]3"fC65FUײXNk. RF%t& uv6ӂl[@Ee4œOL,Q˜m+BՏG{61mit ?ͯ͜r3yի4dN*#%Iɤ9tv:8H oz;q΂%k4u_+RYHF, A2LD'h3 Qf" ])HH =E߾ˎ cU:5KU9^jM,fMNH"֍8[0$ZcjAꒄW !K_= a7쥐i+#$i9K[따֛Fp)oCPC' #lG}wC`1!mgyG8'R7Nk4G M&ljsG)bGeD>m(}֧oiUպI5 )TSF줝 s,Zjl\,XIU!*IgҩdF|Qe"Ǿ"B$hlbP[0Js,l|)xP M&ԵSouR|M*q-) Q`y f8ʀ#8縪*Av6$Kڮ6PMXjϔM- ߐiE=)0cS3S\^2ѥ7(PPXc{Dw2: Nm) #3,>ᚃl5K?MOZ=V # #sv*`m9m*ҁi(S@'SdI:J&MSGBΡD(D-pR`i'IU^NNJ9ԭ9Mv=~FY-zZGJ'K!K$L=9'UUq468@mV~T] 'uX.){ƝXO`L3p'C몱w0X x,8RDDLyoQa.xe,5ARtm|gl9"xs_IuBR/I솤)IlM -9fqhY $Mu.I2)}t2ҲPkmuK }oUHZ+yx4'.O`kE*9uLソ*+dK$,5~) IDATx<@(dh=^6M!#O "Yd:1@@dU% (= xh,kh.`$dذޣ_3XHڕ6p3Ux2Ȉe)OF ½H23vH; qNOuNbEd" ! (:IP:Cs<(|:"Eo[3DGWݥ:ݰqrӐkl5/f]`?hbaicʍSxO88)@\k4XkyZZeY癧z&@XXkij`R..rO} {4h@5gftFpזjX< xT:cݾ2ҳxDBv;6s$7p!fCҔ}¤:k;:eS(syRȴc3?KEPFt9(<V}p+{]v2gt knY*)˚ʡ ijDJHZby:cDh`:´i4RjAA~%ZV"v,U`-#K@] H]}qcQxgGgЏ#qGx {Bn&XFU;`8J36m  );*8Ph?!&/$nJ[75ॶ":("j>D5|S( 5xBntpx_]=/m\`FMbFdaa'-Z (3[Ƀ\:驛D"jVFYd ??|+<@!s h ۷˺W [DɭkE u9V#D1fICo.WWplp&.}D_ 'jG|" 8a-&ΰM@M$c?lWʙmDȀTҞ""7ZCW,l[DowB>8 HxUcy'E[PXvJƋ1Bs:YswDt<L`ZdYF'''r2dhcQֲh QJՀS\hE܊BTkЊD|X1;pXF''դN$8>)i%ض."/D3^  >2eK{>oDgqnt'8q`tSCkKEΝM $"zC#oZsW Q5ET{o!e팜]7hSgFQ4s*,ee2`-qXc8+h8k։X'höuseXVw"*I hn3H فB6B^iP4`T$#^ODͨDoIh@2?خ4 NDQv9k5󦶴6B=+I4qfSC,!jS'M\Վ>_]|2[?s-VDHNDN$nAېş )$Oe;2Րwg+l7BMo (h"L㸕B8m6Q,ݟtjst.Cv!&!6j"D ;V1iS.&I@&6fF'JI#'qb F+N4$kT S Sxh#rEJL!MC~B~^ v$KęY7Ʃay#k@'2]{8Ο抠?F|YDOuTAc<@UU;dD0)(XZT2":::N>62̭%Z+I ъ!립&I I(8iLþ>ĚVָ|*C'!]٥έW=O2 ғ[6%fKG^;Jצ^:C"a-V:.FCaTkhcU B uZTjy^e?u-Y_5u_(DSv@,K[UlA46ɗ?wxXQIXk5\T{Zhjk3hʊjR]VP&ZքD+ 躱:RЪĉRmcGz?4o#Tqo?4v&LK#GӨJw/I9з>N,~1p։J 7ʴnԥfrR" 38kYk]$f7vcOMkDwu^4A+pې .*k3V$$AM`iSthm+-YzqEDygڵ`f/ frP< O8FUtΝU眎c:aZׯ_?>q_PV~^G/Fa% %Bz."b1N\}_1=_fKwXk]Zu]O1/ K07ӁfieYt9$q5xTq]ϓG%vFt֟#YHatbe&6Foe8lg^mHιp?fį袈x_|KKAr$ڞVs O^c ;i["ij3L_P̱ACgDVy¶^1d煋r2h$sQJ4eFt[^*l4dk4MM4u]۪Y\qUU\׵8d,_stڦ G|l 9|BD5Tι^{z-wG1D>6[.]=PJ';5PTBRl_biDJqZ?c_c# Glt?pli:0ظ96*:`l!ֆ({4mYki~ 3Kuװֆ ZJۜ^)RJu}q1*IJju#H#tN8Fx|__4 q3Pk-UUZzRyf&{ODJ)QJIND\EE>ܙqI_*J|_B8<ѡ(֧t1RڐF 57J hAeY6b˲t͆reYrYF5i{iX=1q#=7hh;,/2R8?DpD伓le%"No4t/5(eYڏGs!N&SOݏӣ8E==QJNw=<':юY,37ȚA7\#ƊٖkRՎ! Q3V1G(‡'<ֺ( ]E-f|zAeQ~`6uOz,I)~6'"lj0썷+o|.77M> Ð,Qsjc#8*y}n}TC`vؕy b ufgHnq/SO"|̣.q}L;;ed\^Vxc Q3(q|=fō#xsT9)Ro~S~Fyd 1k7o~o٤`Ãhx\46u]ۺmhuu]s4nl6v^f6[n^s]ֺS_'[ 2"MQ x2%(fVQK(_1~v` QCCu{05YDDѺ2ӆb $I(&t2L(il2O<}cu΅M0j8i 5vB3)8F5e;ة7cc[z1 M~ƿc?1RwL9ťd_AD2n)p"Q7'"sXTDY]pqKA! pQD:>>kcdYsq=#/|դG3+kriQ9rΑuSEQܽ~{ CD &aEۆjTjXJ<κ{o|>1fRhp5@&T6! "'RD[| c![87Z'y+xnc4f! GEcbU`ߗ\Å8Öei}n>,nUezƼ';}F?g;F?RlE. pq]fs<χ/19y{v; K}S1kY_|s|7UUMsd2ɽr1="-Ɲ`O?w˂dzӋiz~R)o\{Ykg"E1xa}hY>Cs(a|*v8u] c!"m>0V<89zAz [\{2[Zy{j# ^Ahލg*r{\8 pqd8(o\{4Mb4NMTcQ7{g-d adCgOk=D<lp/ pq e7>1LYZv8:3FLg59>]Dž8PJ=}''$2x$ cFHg*ď{1?64M!8.c~|4Z"cT#Lce1`9}ù pquY}ƍ|>P7 گL JLg8.űcl>?{d6RHi#ǭᇆ}į1m$F4}7nܸ@^8#>?׾V^|sNcb@gwPC-حA#pIDAT*ᡁࠉ)'AGs7s_8g4 )f3x XYW`qS`h=F| y< 9׊@qP44{ܿ/Yk+kmfuGQ!GQ{`c#sxv-{WWrEo-ooRZ 0A6`VHgk 2`ș#ΔQS6o[^,6)P(vzaܥ?uYu 3D9VJUUիb? }ů޽cD<*gnmww,]眴x\xNٰS"7'5'M0YksZkR{_7Mk]ٽn9981,* I(mj+nKkY )SVxu"o޼ӧ_qv/5vȜ椩6uʀ \oS/oZ9ұ(ڄ!#C=9;%pTBsFq{yc{ #&oGc̬w"0YD"Evm_޺uޏO;QB/"V-AD8}4pn1ʠuƘZ1Usbc%zpi<]+W?%·nUwkgsD993rrTM1g4DO?u]v$Aɲ$b% 3%1RByzqq,G !Ci1Ɵ6Mc꺮۶^Yk{cLMD=Tp~3NZw{^I5FW UDPЧD \ίddžADBpEDBb,˷DgXor>Y4hZ}}_V+vˀ@{1F;sl4M&_ E!KDKD!%!H@"xYAly+5$)ېmJuTv1Ɗc-ef:[$ޙkF )ޒ|1޽{wɓ?Ykb==ć1+k]m[m׶m4M]54M#UUAUUpH'''q^zD1FDij?xbekVWE ;%5e6eM }TBM"bيg抙k*"@DFW" 3J)#!3Rgʞ " |ł"? ޾};}뺮3_'Csm{4 íjucZpuauG]]nUUUfgq;ii88M.4͛fqY1Q1"yX0nAYu1xs8fv"R3F&0efTD.2$jFfy!gfdYD Aо@.+%!*-%/_a0 0VU}@̝"$Q,KlS3ML;D1ގ1~DDGDtc"1"<WRj鬐N "'D=3`53133GfHDTɟ&`fD͛_PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP ;(IENDB`vokoscreenNG-3.0.2/src/pictures/player/000077500000000000000000000000001362045215000200365ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/pictures/player/fullscreen.license000066400000000000000000000001541362045215000235440ustar00rootroot00000000000000[license] author=Volker Kohaupt vkohaupt@freenet.de url=/src/pictures/fullscreen.png license=Public Domain vokoscreenNG-3.0.2/src/pictures/player/fullscreen.odg000066400000000000000000000221231362045215000226730ustar00rootroot00000000000000PKiu7N.++mimetypeapplication/vnd.oasis.opendocument.graphicsPKiu7NٌThumbnails/thumbnail.pngPNG  IHDRzAIDATxj"AEr& ⶣX]S&its* n `j胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(턟5>v>T>(p9>?Ʉ胢nǸ >(Y.>1{cs E}|p_Ev(胢>(胢>(k_=x^eke>fd>UƵ+YqmC}wS!Xk8C_vNeqyhy|p|mُ]X^_¡C1$Y c83["}\nNbXaP/b>Νd1, SAE}PAE}PAE[7啻A'3VM4}| Yx<6}A1k.>hٞ Y~<6}qSOcM}[GIM4}}B3>h#T˦>vLcM{p<6}AE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PxT.IENDB`PKiu7NjnAAmeta.xml 2019-01-23T15:36:072019-01-23T15:43:19PT7M12S2OpenOffice/4.1.4$Unix OpenOffice.org_project/414m5$Build-9788PKiu7N settings.xmlZ[s6~0}hņ$f6阋$\/;,JvX,kp)đtst?B| GZ zm]':!' K.y[n߸ Wf2l6727bS=Oa?Ù^>B o@{SC]#7rJHdSEۑ{P~r yM){9dw/}"* ;-|D!3I3"  <}l̜CS1  ʋ*~_>kF!"@dڞe0ݾIմּb 2nR['>ާґ{5ԝCR?jSS0b۴B1}/|gFj~x7TG'sӇXhSnZ`*>zr +sshJ{tun,,pKfGd|Lszd'8 Q\ M,g7?`$;<ɤMD0B aw( ?=i !oOvucUC̒3u+3r!.HHCm ʯRk<_Nӱ D U VUmIy|2S[#Rr}? kbC)Im~"dNL\M+ۨx9 gq8ZE[ Grul*s| .ΝqYUm6[x^8ߓ[N}XP:vm`̨;ӂ!Mƽ2d[ԲCm 5{d;jHn,5fMN^i݊~qJʺg%Onx 4u8v]fiv5=Yjo2ڶֳ*~6[a05 ^pgRgZ.gw}Ԑxy2 [h0GR;P'7:zPKrle$PKiu7N content.xmlX[s6~`8$6;3}S93MjQIwW"_ɌM~viTW΁ xuE:Iyƚbo}4xi7 ݋&D242Qi[F'ڗ\ͦkV{%=k9%#js>|szŮ8UܺRmqq\~l|mN\FeO+Τ.BT!TN Q䦪 \漉l΅lu4%uRR2[UNwQ\_HU*X;{m9CH0] o-KQ0EOJ^%?l"L ,}c2iIk2cH3fF֬]N4l{ua2/h˅ ?rQj"B!ȇv;0z^N_ ss%LQ4> $a2Zav) "ޫ%6om13|lPd8V9tǕyc~ nֆn7P浤?M- -YD5Bxψ~ގ⵰l*ҁ ޑeE֮mHyO*#նLYsVU,x%?H ?{X~p)v(W~Jʊ^N* ֜'5kCxdxyouv+W [=[Es}]έ6@}2q(;eE)E'5>xv^:^tQ&&V|*تԻ(;QByɒv&)-\HGoM{eTݕ7 zGN[iZ=g|^cv/])ɼr&`48)xQrqnaI8o2;::(~7OQB' 0IūMfVqWwpjok'˫h3x|Dll=nQeƢ66L7{u;rv~B!ax:c_ q #xX0蚡==O\Bq:^%3/*; ܓ=4 '彇9L9ɼ:4x u{ݦ1jcCZHPKJ+FPKiu7N styles.xml[r6}WpIh^$'j9^2ә8s"A1Hp@P}/ )P"e*/Q2[{w7)eS?l g!H6~|o.`qLB%XWKe<+pPљa8Cht0|G%BC(8%B(y}8|N "tuU vucs.^;(l̥Q]!*b}hS-Mk.(YA}{ 9%Z=`)CDY9O뗌e찳hZt"ƣi KyR z*ⱀLMLz1?sF"eQ:CMe4H&Szm{g8Chz\lNi hf(u)qGPEWLu TɶNP,ʝӢz0xE5#ځ҉3SԟQ3 1mz{ڤӮw4ҵo_4uxH8Z Q! /*=ņLlo`xXaݿPZfs;vdˆ9E+\ǒVR|U۰rƢSZY*^A7+9o ?w}'Q=^{:t|>-wpA0 x@.OSw=ԣYO#C#;o͑[ڃ8C\?eV}ܫFwnohf`W{}ppK')UOR{Q'fFC@eB7I~-)FE#_ogwѩ2uI^fDT{tw|M:5ymK_yv̎id݀TS*zQ 8Y,_䈘^UoqG.`bPN+ڪ^)* IpJ~|R{-_;DF@~b3C*)w JĸK|ߺ+]wnPK֞1PKiu7NConfigurations2/popupmenu/PKiu7NConfigurations2/statusbar/PKiu7NConfigurations2/menubar/PKiu7NConfigurations2/toolbar/PKiu7NConfigurations2/floater/PKiu7N'Configurations2/accelerator/current.xmlPKPKiu7NConfigurations2/toolpanel/PKiu7NConfigurations2/progressbar/PKiu7NConfigurations2/images/Bitmaps/PKiu7NMETA-INF/manifest.xmln }{`iBI{''AT/&2ir0lqǚVjjq|/~BB"y =Y(J&IT$-}lzy%ݳ-m /Sƨ.jBF+ ~dEz_i֖AQ_3C>SݲܱI-cc3&!HqwMD0ՅGgutet9^G,m, B;ϱMG sConfigurations2/toolbar/PKiu7NtConfigurations2/floater/PKiu7N'Configurations2/accelerator/current.xmlPKiu7NConfigurations2/toolpanel/PKiu7N9Configurations2/progressbar/PKiu7NsConfigurations2/images/Bitmaps/PKiu7NӷMETA-INF/manifest.xmlPK6 vokoscreenNG-3.0.2/src/pictures/player/fullscreen.png000066400000000000000000000216561362045215000227200ustar00rootroot00000000000000PNG  IHDR~~q pHYs+#`IDATx xN׾&^!C<c UܶGLQSc91jJJ %j H̭!T qZbQQ!D*ݞ:Ta~?ϳ{߻wֲ%%%8{Vݶm[mooM9r\F]zI& عsۥK>Fe@5eʔ~7n/_>}zS2  _s-\}BBZ͛O?- ,&,,˝;w>ݼy3{DDo^B  ̙3{?DF9L,>>Ulkg͚}Сc\\\~.]:&&&OJҥKWZմUV˨~| ~I޽}<ͿCU;DA&Agwj?n@~}?˿]hQ?#wwX* 0ٳgw{ngqqqn~}J%A&w'f~Ӝح?`tk֬ir"=~2[l[^T?`pOA^?`pǎ+i&^֭kOvg,~7+y1c 8344Ĉ#Y?`@/n랚3y>o̓6[yV>"Aw߽O?UL5_n?X3gNW* 0bŊi34~0~\rJAL-+,,ˠA&Pq@һ!!!=gLrvvOAD[%^p`zh 6ӰaT?AzPQ?dGݱcGj8q ~ <)57| tܹs;5jk> 3; xoOݻ ''$0~!ׯoxV& jVZ۹ Xu TE8xm>Ν+lw; f['mAi bkL^%;O[^~=/_ޢm۶ ev{tkL^?~X֎;j9r?{쩶wުv{~XuK)Hy~XʥK\O0a p&AtmVkT8ps׮]5vQ 0 u~?~6Q_fM*&M4 o޼W~uL%ŨsS 4' ? o*VӱcJk2C>6[Q^M?~ W@F ۷oh+:|p={4)hyʕ+?sLQu̞=vJv2ګ*Vi//(&0:ul5ym߾փ_d1@~ ?@~?@~ ?@ ?@~ ?~ ?@~ Mܹs͛i}Ճ @U&L0hz{{oر… *e%%%9m۶_~~ddbŊ?TunJ-[ꫯOeڵ999%Q%nܸ#<""7..Q_suܻw/39W7N}N?/rj)+W6Sر&I_}U/5kܡ_͚5[9s{T7K. qTx~j<(PEPDe 0պW+ m11c U_iQt.OEղeZ(_aС778C_~̌3z CEFW^o1׮]˭:u8?ؒ:/~J@ܹ&?W1/^Ν;Yy'4H=z0 DSW 7o̮ NvѣG035Z/_BGٲem m={ y#""|<.F9קOC 7B_ Ս߾}{- @[jUvPwfKlKߚ][J^֬ݻe_#jݫ޽{58\pppP-S^ 5eVz4tSxɒ%mth2۷o0[l ѦeUvQcY?}ZBChCְXvmc7o\Osjk+Z%K<%53gG)W4JSyJݻwWZ8ʤ=IMjī ((((X7Ŷwު 6\o(SЛR:D[ S^[jL۶mjz/mϦzcjO*r}lޛ&Oܟ+/灝;w=uԾf(C0Rs-mڴ>ӏ,XAq J? 1Q׶mwk I{ZO__:;t yGÿ>:&nZ)kydΜ^ӦMWi"6z;sW_CkK.姤`L翤CK69rİaFX4&@~i޼ )^M߬uKu:t4+..΍@rssӄ,uTPgZY?D:|M } `F=ֽɑ#Ǎgϵ~^ mٲ>Y @ф&MQnݺ[֋: m ٳEi`ݘ N+*tmY+RٺNNF1믿~O@/x<-Qw{u,YՉd5a@+ŋ۲. '휥Ʌ ʕ+O˟eK EhuaCzA+W\ϴ 4a×6l߰a;hGwyg6JY /Zۂ8yd N"kO\-SDu..^]@F1o߾*<"J**՗c3JaT qسgO5 /[ݻw0ҪUeV#͈StL8q̜9Ǚ3g(0EѣLx6#PE2dg֮]X4C8))ɉ QhfԪu߸q㵚ik󵙡*O qyuqF9Eh%ߛi= N2ߘ1cjuP} j<ҋT^cf˖f«l@Ч˗`0iAKӷhbZZb Mq|-LvQUr#3_|pM6+ ݔÇҀpdd>l߾.UVjkl1%ZHֲeot=zX`A7ofq8ٳg%BٲeZ:mVyj;vpDD2`NuK/f9ʍ(nnTT>^D=xl6[ᄏZ{//Պ70\8|! ` `} ԬZͮ-Tynzppp]^՜M7^JKCqx=Z5O+i`ѢEnݺ>ڵ[.J*"#} 111yӵk9ڷXbPi>ȑ#G,]7 x4XۺuiJ_{VU7В%Kܹs'+N֬YifsVB'L0(,,O:Ux4XYa9! Ac@@N\~}CuiP`hViذz}Xfh}'ׯ:̙^T #VkvŋS<M0ɕ+ׯV[x= >wڵܷo~<ֽ&R⋷ojz]vqZ"ݻYJ(q5J;wp׋ZBA ըQc"-II& [lŢj֬ɐ;v_yQ!a@GT@~ @~ ?@~?@~ ?@ ?@~ ?~ غuk3gMLL4svĉ944HPX^^^Q~)iNcs/XM.B֬Yh}c6۹ci.ށ7n\Bl4~ M)Rl&MDFF圛5k2{ h)<'YTv~*T8o䮁ֹѫLk ~ϰaFߺu+Q=V[Hr@fnsblZH%F1j'wGq@bŊ?[ٽesWҥK.Ҡo৵H#͛7_QvrNdָq@r]v3zaF9={dʔw~ h4-ܖϯ~u}w? *t'r-2\ڴiD[ErW@iLF~#m f9TRe_ws7@ yT>}g~ isK;wk.ґQϘ1wzΝ;uuu.ҙ{OJJrJ|_S}@o͚5wDEEy|w6,Yd g3 `M6]U` vgyxxDOAls N럥"OAL %$$[<]t RZyɒ%mgmvq\~ РkZ? ѶڞѮbjoSrT?`Vhj_Vƺz[^JuA~_|aj}O}N[T?`Pꖙ:ujXGs>UXҥy{{oڸqc^5ZWHT?`p15W8A&ѤI5jyQL_֭jL@?dȐϞ{h@[|O*.]߹s'k={T?`Ar} k-WW=(XT~^ʛ7yh@Z{yLIENDB`vokoscreenNG-3.0.2/src/pictures/player/move.license000066400000000000000000000001471362045215000223520ustar00rootroot00000000000000[license] author= url=https://openclipart.org/detail/310138/cursor-cross-arrows license=Public Domain vokoscreenNG-3.0.2/src/pictures/player/move.png000066400000000000000000000064561362045215000215250ustar00rootroot00000000000000PNG  IHDR,,N~GsBITO pHYsI>I>;tEXtSoftwarewww.inkscape.org<PLTEֵtRNS  !"#$%&'()*+,-./0123456789:;<=>?@ABDEFGHIJKMNPQRSTUVWXYZ\]^_`acdefnoqrsxy|}~ -IDATx[TU+HȪ JTbKVGfYb)6b"h5 n)[@zfc.3O?z2rf|?'cY"۠e,+](@H0d;gEcHvDC3˯`vAK+V,Z?(*Y0@90,ed>͊Rs(8ԦG9D=Ǡ%.q Zuԏ?yzV&of4L;HmrZVeb4M8~OT2ƱU9b.rͅ9|\Z7+iCb-mvRjgqf5b=w*κ;8J%~ V'J*ˉU{k֖xej=VoUMzauX2{" ˓({YD8 $I|U ˛"rn\m%}o6p?V'vml .fjбTco5Y/X ,X,X,X,X,X,X,X,X,X,X,X,XzY ?e~5,c:(|,c5֜ne+f"߆v'lcm|b{ 6K޺w:LW=m;}5W Be`j$XZ!U?L;b!!)>XF*kYq,.uUw3 y>3X LyRɌ`qvh|PT\\;U25]%WR\MW5YYZ\vXHUO5UZ08R$'O&-$%L|f_җ/37M4MQ0e>nU* y*1Mp X>{R\@\%/ɇ|`}\y]V(eҏ%;@|XvMPk־/^ūX #%З_3j^d]^ޣ E+gz[RGm?4%'joasʹWIT~[5AT;ZbDkL*[xhgg@+r+4򵿴zn$دF{Vn-Uyuhas("'] :y^q{W7xrY~0 s߳cҷzz!hhgXUxhڣ⿤k9y٢q[="/W&0T"op@&^>ST~z?yR1\BkV bzte|`=@]y"];IYzOV9Q<`l9'\= :Y$h4k90XY/>˚!>q8uib,bY`!0eşocN4M:D)klcy #4ƚ矯(;6k&6L68Glc]LV?>􁒼)&enD+='6ckó)+Bֱ=SJG,c$7Z+QbE ćs=bbߢ/fi` ,` ,` ,` ,` ,` ,` ,` ,` ,` ,` ,`ϓ_,7X_j VlMٌky Z+Ąi_fH\*3wp972e+)ʎC\f$0VBqyU[ZB[e5e({YSR|eEޚ%T7s9t^ ley_NoPʥUKBduu75wqtRIӲU,5X %ђrd Vf˥2)gM[/L2Ι:%fSV3 S}ٰU$:iVCVAΌ6V &Sx03[OV".Mc@$ʜn e$VG#KQUMpO:JiZfԲTfTk\3 yp(`VzY1췪 ݔG@VVUa(\d+͑/.@9IENDB`vokoscreenNG-3.0.2/src/pictures/player/player.license000066400000000000000000000001451362045215000226760ustar00rootroot00000000000000[license] author= url=https://openclipart.org/detail/185065/mp3-player-vector license=Public Domain vokoscreenNG-3.0.2/src/pictures/player/player.png000066400000000000000000001011321362045215000220360ustar00rootroot00000000000000PNG  IHDR,,y}ubKGD pHYs  tIME72 IDATx[$y9utNI!iL1܋e9«X፰a?'?/Xٻˋ%.)P.stwuwuU=9~Kgz=ʪ|ؑ/~RZ]!9X\.o?s;3vFL^{:^f}1v@5cE֒eYeY{D`Gk`mcl\.?1GטC+R-Jj u2xHa51H2ƼlÛ9QWk%.[V\3/|Uk}Zk>ODO1ƞ&ƞbQEt[oR9 |N)}^q"\DQMܸq @p'?cR s!9cs^Wz7u;w33u;wc;]۶]X "H)cQOZɓҜ! Z:}EkZoD2N. J)\zW^]?"R w~>'"a6lJjZfY͡^1'>2f ,+eY+@p-uv@;&6-!Dsh(՜sUs9Ì`M^}պ⛌?ZhFDą`s&Y8y&nܸ~~R ?0 ޛ?&h P*QVPPќijaaaj d9:,K[?ζx$-mT r6m=,3fuHկ~Z?Z 3ՑȖP!ݻ`o|1is`܋sT9eCk,Qr²PK(JT2`vvjsEF~f"BHs6meBclm۩ `scŋ4୷ZR~G)m_Z/[B@XXds]%%?~:HPSRAJlFRk.[BXm eT*T.CpQ[‚mP*nkZFj•RYi~+ /leT@ =drx3y1NF8T'.,Kd(W*z333E'Tp!9[U/JS?2WTD]^p!6x0z$7|>mX}m{$,g HAt/SJ\VWWQ 8 CGq~ALLsz<'?S^+c~Y @woo}N@J+ l61Ӛl'ŅlQ_oMõ\k ){iðUJepƷݿz["ؤDEp\u8 q}'p~CJ9O21cq~bN6N'8c+9$D̔.//O?էwy?60zh633$&=5KDI Ra ?O>$` ]!QCi18FE6~GEqy<߃醴{\߃%{<Q_f'lA]k q/I(Ζ],K.…/X]]{9-cZCXMP ,+֘P8}47 XDYrt%C1`3]?[&b <`z}?q &??@a CDa0݂0@?.nq@&O#n.غ=lmnaӁ:W/?sj}rҥŋ[X;[#'YqaCܿf ۲8Zk“O=oZFOb5\ p"Pb`'Lp k %Kd[F#[ QP8p]& o= "H#2e\!D<8a,ju _ah-} 20:vZ;NB+5IPX@bXRJ\Z긽ϯIMk}%Rʂ0cM;6д 4aq=B#XvD ~HSo 8GDL~|h}8Nws}ǁ 0LiXa4s'=WS# R?}>xgy XzZ뽑ǔ:e ]WZ$itxh0jaian$ FJ5A)̀ hf0!W@PШ Ɓ*Ja~?!;}΢&;><'2wH'_W ``)zDY,0i8jp1|ƫ&֔mI`P<]tv],n<ω Y-(@%W@iT8P- R6R3 )EwuX+VRJA}•+?ĕO?E׃m'BAE`moooa5 ư#J \c Qb~нrLsWncTp YZԀ@Hy,l`3$fXYqzBeQI4J,Qn6(mJۤa3@ڇt/"1x>yFJ)z/^o濏+W>ū7|3ORE5K3:>`!Y8;8McB=,*w!2 ܲ+@!P˾S6?&5;Ui8Jf x)tlrA"O.-GD5&1#j*VWOcuu'OҩSO~//EET~Xf/r7BGI@e Kz>bق?@|QGڏ$ObMBA {reVʕŀR DiJO߃#Ab8ec{}7R}Jeܾu XXXXðް+L'{[GGIpl1x.6giN<& n*N/ 'D%UIU~ v28e8)BTSQPcww}uVnJ(q{. qL $b %vV5 :UfE@"DQQ .NZN w ?=\zA`f^C+v05ްʚ&Im%r%WҒ-2 0_Nor4[Tq7i9ϋ/~@)qz.b)^<9XnZk?-;,5Lw>FaJ%X=l BMLi0vx5؈Kد$3kg`Y6I^)%XD$Es J[ Ʊg2VTSlRF~%uT'<=ٵs9+HTra}DQԸ|1_i|h*naV*JX1baL 84"@+;J)Tk5T-BlooEE5/W2ֱd o*n먔I(/FbE`4sӠ5Z3-43vu6ڈ㸦2ww UXS7lj6[{ Z,G1:2 RWGPZcaqtYu)J)}!RpXDk  hR(X&t?`X4&()qji 'Ny}/]@MD qR_(hi}s8 P^&y8!YB~ֿĒ A"QY@V;.y"2LJ駭h*),aYϡv%>+,(Vk#"ZQ0]OHD`VQ4:6s]ZaMIa 7a-;Иa1cYG~ǚ%()jp@m(OA`)εm5x~b%LK0#L Fa,6*MW _$5VՑW} C~r{{6NW&:%r B\AJa`1iX@iBp0DR!V2B]m0ȸ51}M!ڸG` VHc6ىކRq%KHu#RNAgAq.H['LT nsvҶ(15BH@)i ku(vDdAyFa`U(&-=)5` ae -r93i aD)pT*A4kS,/\*07; kȥcA溮QXXgZHkp3)+SL23Yņj:CV/%.!ј+284 H?w[Vq< 2EX 8*BEM+rZmKHDP2s :ƦoQ jV餒R J#^>緶j`K8D}jF#O8&q JŌKx)r?dZ_^kJ΍+lnn}х^4G,0ÚV(cl A)jF1Ya2 ĜP!T:otcJXgώ+ Cܽ{7VXX %,.٢h9R)],lt'V(jGM?:wRJ!gc/lAiŰa`e= e36PFaMX@&+|QXA`kk ZkqFauL_qVuRnrb: ;ԣܤ|EIBbvvv%!ZFa`nj- bL=XyY {RaPeuH% HĮn᫴Y>pщvRJA8Oh"h5Hk(sـ$^6"0FJ*DZ6Pf4LjNOT`;bUEG߹sfzdN׃yZy s 8vKiLN2KX®bDas$ADjb7mEй,56668'͑6:І Y5v_=,#1h.BfJ6X;@]e/DŽPa_a `I) lKH`DMe{h\1q*cFXE@*tyϢL Q!u`)(ZwghcY# GV̓+u =4FU0 փHjB Uok313gϢRkssRJH)\5k 0SY9HoBJN֬5q uD0i5/S %*+ّRJllldBsh`UH ۶Kk ˲h6AnPZ&y0W~$D}@$JcYSR̙37lۈQ!wh`)΀Ul[>%",olZ_7KubXFa=9$>E1'!u ֒C*kww~JŽ3`KV<(cf[G3%4 cǀ™3gFvnhuVz)'nPJy)S3[4zD(}Z $x9{v,8,{uVȐ`uիfJccX\Awb ~0SFaor$~ %qRեĩ%7q]vc>k=Wz{jj*{o L3RuKƘqeK/1\-cxADAR!!F@н5;;1辳p1:c`@쫯Com'A<1vwwAD\Fe`Sa)1S*9\χ%4ĂRkҨ2 IDATgq CFVٳgG8>coݺU7? _95Y\g<$1b<}WL1#)l{QZ|D>BZՐ cq EauS 1jO\E>%N0ht%gv.j5( u~ M- c\>izdt Bs<UaN$q=D/]DQXXGnJZB _لe MU#xz+/+n(3 4Aw¾K~܈}0 W<31,u \iBYBF\= }߇y( \}sE1? >RT*X[["[TXq#3 %)TZcZ#1Faq!jl$yTp,Te1"tn4D{A˓3YՁPJetN߽{w֌*x5_k!r5UH)eF|?ba,%v~ǩ4wä )ZfϟeY#naӁ 5qͨ2:JNr ae Hd JV2 XM򵾈1†a׋wE섄@&]t υ FB)%޽$g042:r;`#Tq&a"p,V6Ʀa/L#jxRJassA@kUXGf/BOk~NRX7)=X InC*ڎcRR'ͨ2:j5۝u^zyuX8X`eefhfT`R :D?[S`eMkzr,)d8w**F}jG:Oo;;; "; 3fH` $'b&+SKPdѸ;%1mGwC:Y߅tF3u ?ǐKIFZe6Ӱ"ս*CY0TCYJ'hoOfmR$8lF,l>x+HT RL+0%t R @:SgI@I@P2F4ȷ(2F1\?;wꫯ?!(:XwR".|'{ϟ2:*`fF]R r AL7}6~W?C'oMnEpJ{ >T5$ y`XFlN(qޖr0 8bkm<; ~ A}N:QdR)8^>)T JɤAҐJBF*)=/UZއ~$}Av3+333Zݘ,i *1) řHB=assW^y6a8-3 B4R%t(|,aVzR@JXf v]7oހce1)~3ޣ,njT*-XG#q,YONe E`UU$RV9yi 2ť:ņ[KRRBJO<*"t޸qc-3 mVtLDòmD(e^= ah@ٳg9bffB02 N{.vvvp-\~v2](( !N8q& C,#Vq+۲GQd8Z hbܽ|`ij><<.\9P*(YI-ۺ.\{666rzXU|PJMB)uqfx`I KkA3\,`6\E,-BFW~kX__f1lPʎɓ'z 7q5;餳ϣX.\QQXN{z&ò()*laV<|ExgSOa~~q4.^{}>lmm X[[[*\}t6:0 q"۶=A6Kobi !8VVWs_K/ !D^KkX)!TLCݲ~*aR/}KxgqM'?ヒW(]BT8^XS5)&vp%,hB+)w 90jԩe??ĝ;w4umFQXS{o@?'^էl&PT6#2m˒j[x"fff nO 2ƠN:s̵Zmtr904fXer>,:Μ}?NSe6N> +5#([<id@z43gpϔl FJ%i(˙Z~bSf#9X__L=.;Wv~53 vH< Ss KȂϓqF_XٳgqIRN\7Ց2oTRU%M gTWg\\\w : ,>n!R&k%"@=7Maf16lZA<4Z$ t$\|?.s(X[[CiRٿ CKk )%2aN-;>|v;mVۭ6M׌2i^w/8"SXj a}nFK.>$硔IC%)z.*a){8,U9NVZ?`?ԓK#%(uyQf5 7)rXK%x(tWUt:V#Q}s{.Y>ቃ88i_1Mp88ti\*8J),--~~#)XyzySJne5mM=Q-+_ KAC]{/SJ,>}sssy.Ӹ/a@٬cg՘Yb@|kkkmܼu .]J YNYVki/e5mVXY.V~,#0(˯<ʪjamm-/Fx\ETT/%{n:}8wo2c N^Ns)38CpO`'̲m1#KiZUɟ 'gKqefvdq7ce|8ct:T* R1h5Uİ lL {TRR2՚ATyϢB>? <σIzYҭ^\.^loz 7_GK/pXV'N 8Nʗs~=:uy޳QM3Z7UYVc-{{ҏH=C\9P9}!~>8o&+@5e V J/,,⩧G?B5[m>Μ=;RaXY8ڙ3x~v YvADVB 1 .ֺt0mlhZ<  Iz ¯6O._Η0qέT*Z#c}lom9 KζptO_89K8 ZqԩSx~C]z e,3fuxSJu`)7 0'5f NZ>lP.l6F.W|MT;5G>Cd"C 8 ˲ rׯW AxDj5p666{AJ/3Tձ ,e(XZZ޽@Qal6/lnn~᭷~5~9,81y._~6\ׅ&!2>\'B1Vޫ3R 333򗿌ͱXgef1D%9;*wZU,!FDDRIծ8Dwox$emR _wK['yys!?[8}:l\S̊NC1u֛o˗ZWuqF>v? Z}!"RʪfXSa (i˶y(*>m㜣9Ӝ5oJR&NBTA8ؕR>mQOꘝ˃1ܽs[[9e&(*Qw;w&L g!cXYY:UP5UPXIc{N IDAT )03 #AiUlZö,1.aeyXfrT8xݟa%Izt:àNj!7Qŕ&޽ q`YZFސ1'Nॗ^©Ea fq/` +kufsss֌CpϘ~7cѡV0r!҇t.&}~I BRERW9 J>I0=tD?vp}v;;;XYYAZɓz.XZZBR'p]T*<މQqAlכGRۘ֡QXigiZkXB4<p^2XRTU˕XidFI`DCA|и6VVVl4333AV7۶a6j""qN]?jX0I`K8n< 1XnEMj0nq1ڸ{% N00VB *)@E)F`g7!y׈_XX@^GEo$s8FZ8h4m;OUJoffJ -afbXnqP&myXV*+~xӟEId [6t K8Ff$w*ڋtXXeiooݽ=-ܹ+Wuv.I4V8UTI!-\wg 3e^ S8s !eRT~>~U?MWJJH)X1znR0 |L-I{%\rr?FCՂytf ۶+lQ` 3i ^9!qyzc _+3|C0DQk\^gqN'W^`EdIɳ2)%vwwۥRiڵk+0w:)<tnj 0Lz) 'c-=Y9Pmә1:033j*fgѨדt*;5qH.p@zI;y"PrN,]|$lZxٌ6 Alz +u ݡPҚ=Jiٖ0DZE9"jiYC7ȹ)Vj%2,--AuXujͦZưbXfYhJ%\nChWĖ>Xgka@aa`׮]N$jl6Q՜`KUUA. 8cvj"0lp C]C\=ZVz [Izý^o62Jcv-ڨaİT>7fz#(Ngulz}ӴkIx!w碹-uy1AA ;p-F3t}7c4Mhf&aO~Rgmưr>V*h6pa ut:XYY feHeAucyefr |Ү#A4|>7:Ef\^&_ob LA>,&' Ŝ÷o΄a24,$e/oHVUXԲV>ňvIpȲ,9.}:Xs֩i@={ĉz*Z&:"tͮ+d=2(%7 ٽZ NgXɀu=9fӹ\nXӴ1dBi6 R ՃaQJeL_><^E B(bw{Bz.⥗_F\z6,BI<  b㏟ݻs7k 55 V+,MӜ˲FL<Ͷ > <0˱ Q;hQ͛X\\D(af~eOn| FFGA`wihn}: Aͭe遧{uzF1@14QjEqfPJGu]?M$Lc9 CqF>+VPh)%O0E4睺MSSSEI.z$b&C^ymLOMAUT:tb ^#b}֭,+JQ9zǏ@Zk јK!wD!d0p;/VůWLg]2^s8"TdQ'`|1::6Ww;111tE)uCT+-Z|rge,gfnƛ7n8! j>Zv sssV(.lGGXٳ“O>baQؐeYwxX,hVvH!ٔ+ɍkʢ$*ʆ uf5Me(n*KUUx@X?H麎'|N=YÊZ~94p1먱v!;z=:V&zIӴ'&&iX!d w6VJP(8XfbQ wlcYaƍt:,lfgg133skU^]K3MB|}>ʚrqۭe -iPUǎ+ǎ91aɀoX+vX`*QJOٴ+;6)0,EQzOba&0::?{)oRٳ5ܸ`N9G\.cǏ㳯g?0/F& XvW\I=]ʲ,``^/[i+0M ,!w* J5xWK. "}|~SػwS z^9?O{op"!V^x >sU&g۸q®NV ZtN+f.D&!ѝRaXV ڴ/Fw:qs=LLL`Ns ѣ{0~.V>:8/UUqQx) [yFE4 s󘛛KnA)i$2}97Nha)g>SlQ( s#{9˲wԩSz4bZ^cll *N<|2_@MpvكG8y$ۇR)aW\3k,kCIZ kƈi{KR@;y`gΜޢtRbXIXL 6!0SZ[s?.xgqĉ j%o?34M cll Gőp5-Fiܑ144]vaϞ=سw!'"?(Y:*LOOڵk{F,^(K+}`eE(? 1 ]a \s%TX 8uݻw033%d1[7ns%]<~t4 ލ|>vQ+tͦ@uile&a&JR=Q Ss3M:kE$ojrj Fo|fn6+xE|iT*aJ(UPY  -!^|X\\t& r\V=cX雄i6BP(6R]^/a4Oܛo:LĽ{xw4$I~^( J*vލ _( Qu+ /^K. )m @uZ-G>F)-e. kR Ţg@),R\v V+d 2Ν;>e<8rAUUt]ct3@|m|7;S ;wFiqo* "tS9z{, kkD1ٟA!/ r_jXĻ:y=X.Á17?MӐ1G0scz-Z-+~] @ ~YS b J)]'DhZ(qauӘh_mX7pRxUX , `xꩧm rV(YS9X,ڵk8<&&& cxTەͼ b 0,V' KWַPzzjU^]]Ys7  LRi"r;B>YE绫BH__(B;k~Uo͛;oۙIVqYB!uOlxjF`vve~1EA$ͦg$Ͳ,,..w˨T*L) pPRIvC߲0=30p4PvY˗q9ܾ}|+Puled.5sRȰj.gwQ4Y2pQUvW._v,msR|_Q<ؽ{thXn2 V icnna`rj nj:"{}`KClII^( JŢ3;oM ?r.yo ϝ^z%;oرcػoFBZE\ht![\l66099{X\\t냼QB̲,EӴ,x4Dc/g Iw,gv:3 ךMS!ݮ> SSSSlcc޽صk:rt\4M;0lbfz3332,Oم6ct]q9v+rV6R1 S-1S(xZZZaN gX~FKl7ӇkL[Z*122jrR$XN*61000`td||8`e#IH)ue95<;xR8\u6t:ܹs'QUֺN0?7aYv֭<::|>YG3+I,֐"Q,xLR2INޙ8y1W~x[ɤÇvZ,ۖeeW+3 |)jX"+MBB ]Qs9 l0<ܓo>PPV1??˗/?B2,|h4PVQm5*xӋa8p~QQ?ɮxXIM5Ji&@duT*9ٙ9|NӘqW30zZZzj peBs;dv0jؕJ%L) /`%MANT!gRPX}­[3{0M3{QrRy9XUU?A';AB|cZBZ F|e+ٯV7!%3ScYIܺu δ+II`rǎJ% ,Fr \p\9UQUrJ.vLPXZXӧ;o6g>C_/44 CP(@UՁ6C[_H-zX;$SZo㯼qFؾy:è2/`׃2Z-:O !_wZVP`;!44M,8}M3Ð{D]VszZŁX {\FZERA)J( (NVo4 ]L IDATaB 6w !gΜYfSX>ZI%:Űv[ǽs׮\.xxh/Tf^f!S{Ǩ0R(u:iRZ"$p%BBpZ62q)SOL_a=s=vR F҉:/ͼMZQTPPcWPbǫZ^ 0l\(vm>p/l6c2c}4`y 6FpwèjN'y q7RڂxzD{adMuMszAY BN1 !M)KJΜ9s!`mWX~&!gX#P\'j@:[n67u4Xj ׷TUrŇa4֢tݭAA)}(z7ժn&`m !=2oP.l0|=,HUU4 )V9߁{Do xWPg;u1lb/wi4a:tÀrӲ@73\}Bt)˲M Z%-Ick?\y"EA[4o 2%)2N9{ۂ9ӤLB)EY$ܰ,c0w-Zu}… ˿K `=&ኸBؐ4gYK1=jbg^4^:[֞(XI`crJ,ru@dW!܀G<@~|>_+ *~EQc !Yu ZI΋hϲ,ڵ vJ4?o)2bZxǎu_0* r+P+kk5u>e& 42'^UD>ba~&2 `R: &!ȦEXu70,6y`8|"zڻw/:Xf/|F)4=vZͩx*.~:iu$UUQTly:uI']aN]}g% p*IDs&;L(*'X^^UUqZ-|ᇱy^]Z7dMZJ):#ܜkC ƘΫ^=) cNLk="ya.cnNrP1{@) Ƞn?0??fyy~Ee26 hC\wt:IgYgMz)kD[h#טΫ Fyxw2 1t~C^(O9赍7$P&<$X~ۘ QHg<Öcv={&&&*ܔ) vmkM.,.\OnEcyyN9:} ˂< Z{Y*T*a+,<Ā{2a~SQ&%25/+nBLQ^{"@y+ T'!'uSҋy,Ji@vכ R+ LDX<˲0;;naBy ^EG. \.d0]IܷS@q0X׋&t0?ˤ? ! `4GKz>ƪ e:)V۷oBF##R8nݺkN(IN>nN0?01]%0cV)?z;F>Zo GQ"H)^ "21*΄m;RJ!KT*>^˘2ZOq\.OaսRA.:7k TyΚܢ874H bCQAJMVYw^3B vH}0HfO&^|UnSSSNXFPo40<Nx@X dw^ <|@[T^' ~/s.A3|x`QA Wd~!@ׇxׯB 6S >U!0%k{rl6MtjG*orךL%ίEIݦ8ev,03*H ө*E=,ؒv\>q]}0[!OkLPS.Q(zխ4́H ש.$s'T$TWbʃ fa`;X2h4v /B(X^$A]bu_Ug1q/èQF^S4Z-gJa7 A@Op뱓1,oPqEUUMBTXJ24>bzQSL\o]ױ^0&?⋻B8QU`md6O2ͤ}jbAz+;`b-M*ԯ˅$z qa"UA 4cE1 22.٤(,&.򋫊5E0eQQD в>܎>d0xK>LcY%gɂ~d/S6EhE =iWƋ5A6STW~+~s@mVqUc2ڌ[?y&9 eQMU>(foqw N'uEM9σSd:  !73xOH&`&% a2&{ 0 ʂfWJ#FFp ѫ LT) rgY/h;s㳫~B.eu>$!ر"$`4N2DԐ()Fװتy2 'cRŭ5 5EaeQjfGC@2|h=a;`uU? ҧ'XU~ B ׹&}/ p~L+ biaecd0 +Fnt˜ I>˄,`QJx.i,*2mxDIyUAl8ChXaL+.IvIrYAY/!d, iUvQ؎lC%"e51-OjѰ"eA(hTQO8"8_ ]Bل52X@T]+ʺ(fa,x^Lσ(H Xa]f%mzK?ez1S T+=^n`ގ˯P%~v_?}dR T€Hdc_2h2%)Wh[|Rwk[cw׹^A^ZNIJ4!Ga*#FG\dgZlEa`I'xeretu>9zyk'[q@+h[/վL2c켜).ż /5HœQZb&8:^eQT ~ Ͷ̪( 2$!ҹkq^%g)':T֏ iRqXSZ&dg1Dl9*щ%ly:mw3(!.q1q`q }=om5x<'2 'x i~7y:nβN,s6Ѡw\R/@{ý.t},[I$DMXwQJ ;(7`d#Gߒ*uӦB @*ܹa 4PTВeQIkH΋>YM?jI jF}..mYDZicTc S䆊gm&DvHGCbp˂R{ {+Bk/RLnă[; ۍy)`N п{Uԉ & CiN, v>R"%;MZ-VKZ+lv XKKUH_\ -R{QX46vz}ƻ[0xa>j)44q-4P[l"ɀ>?BHryN2U3eCP Gk%y&2+D3c+n:eM2!2md EaUA/Ŏ2~Uܟ2UcN,no?ƒ(/^_^@2 +땽(ʆ˸;ETD\?.]>_fw9TVR4q)vωWVǖ!"ch0@3 $FIMD-?`#_5ΠJq~aOeخL҄vþ,d}!xb<  bK~ !.c bP2,.cx7h[k9<dczUi!d02u2 ii&.:x$.< zC9'ӝ% 1(eɚqM^˲EzA7rP0Av b_iU\?3N y_#Xl9C X# ? FȘ[QJBOL,ˬt ӷE 0dZz^(lLsTVLO[c&-Xgu_"<@0_ea^Gd6Aua z/Y:츲`:~, ^`ؾ3姟D>옫؍8GX^Q= J`X/t,L3*хsaMPCT?@%ܲ(N/4Q7 Q,vM3HtMeG8ad20a]&Dc\2-Q;9}& `KC+? pz|,6%ğ`|۟m=&y2f`$l)/02\ e5.x@UO+Y3S|K9pb[7SJ? aw)F-ɚ f^zmT1ũFd>Qt1eLݝ!X,ܡa{}#v^/`3>4IנӫgXGcIys 2){}o0?Ogo(IHI B # sE`jfj[qu.Qt5?&K5 HaTf2Uث$fń L~ eK^ݙ6eae8mlذ$k VdL¨ŜLQEY3&#.l" v%aSW{nqXȀW !?J Ӱd/*ً 'cVs=` e7a{4L:]eˈ^)5aɚA_N2AU3W0n-*8$`j]y=Bvǂ$6y]x"kVAQ;ݓ/J2,*JXF >9 aQ42L.j*M`ץ ?'\yX0,M)}Oxvu- 0v$`Y4[ :?Y1KHv32~l) ¼Qd50Y1jRwmu]WBȻPJ_`А1zeeء0sRUL,V)Y\2 P2$U"L ~:wD'J)? DqEaiv$cL0 0%{dM=K͑%Z4iՀM~Յ}R5 ap}z e\@,6qo%I*+06lIET&Jgw/!`m?A&`*S.AQQ+(&ndc'V5 ` ,x _$,cSJ0?ǖOe"q:O'}E.ưUT/*`l*"jh>peB,dxvO80a6%99(q44&whKVz9ɘ2`lM;*GC/=]?]BHoG\{0{QٓѓhXaq+( @iJl)%PQRx3qkoŬӜlƺث; `v fMX *[=4잋2 Laם{"`CIDATɂlي ☎a'-k=e=kYpP`F]#ِZ*ư|Nzi`\;&S1ʾ:m2^D)Lw%`LJll0wB^X,d2숰]ybXBYIR|Ϗ}m`8Ec`7a0`\XaӯKfwuX*5`~.]!>GGFeQ2n5&`35Q-7Xَc2hu܏kv:cc%mxO)-15 O1vcz0-JiO}Oi;sRXxf<a]) $vy˵ xsݮU΄\W!n+; ^",* uwjl\֒IENDB`vokoscreenNG-3.0.2/src/pictures/player/restore.license000066400000000000000000000001511362045215000230620ustar00rootroot00000000000000[license] author=Volker Kohaupt vkohaupt@freenet.de url=/src/pictures/restore.png license=Public Domain vokoscreenNG-3.0.2/src/pictures/player/restore.odg000066400000000000000000000224021362045215000222140ustar00rootroot00000000000000PK!7N.++mimetypeapplication/vnd.oasis.opendocument.graphicsPK!7N2`Thumbnails/thumbnail.pngPNG  IHDRzAIDATxjJE^04r"滬; &E??~lM}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAeLooo_.ߕZ"|ǘ>x|ߤ>Lzx8Ű>Lb8xe^&dy}8>L2#`}|6!n.k  f(3exX_2إ5(㸽xej>\bWǥWA{Jڥ[nc* CTW7[T}\3)e(x8rB8T>}6g& 0 #r}5r}eFLȉa>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(씷^IENDB`PK!7N>AAmeta.xml 2019-01-23T20:45:552019-01-23T21:17:02PT29M4S3OpenOffice/4.1.4$Unix OpenOffice.org_project/414m5$Build-9788PK!7N settings.xmlZ[s6~0}h&nl1^v%,C}%C2,1,5qۙ2 }\WxFZBxwg`]~3}!uqɑr /o."Fp / LCD^wg dyWX8?W(aԐ!.H>pw.KNE]O)}Z-(^Ҵ<\jKP< ?8F}F{C+t.R17@ >_5C+  /:}" ooŷ@ E*V) ?Xן·o"[~<2O Z!υJHeS$Fq PWgDŷ؃Q 9o1Jm-' PŒ#|x ~ELty=!WXLҥ.G.x7q 9]ƀח>=='@.lr@.`o4-6oآ~<})['nҕgiDǢ ա`vhbVTWzHk~N>#] x/2yf<8T ǵ)-^qzFr wuL%ΡI @ ݈":c R5%Fw *]QrmM"|zg 勌qD!JbW.g¡;yMQvȯ9u3'Yi)6A6Ⱦ5hq_=}s [et4Li~yXKK=sdmY/ݰI\Uɫ~FߪiF tƤSsV&Tۋ Z(DZiUp!~\5#9ԜBG}*'Cm8jFצI\u؎_gV%ij`V}pL2{q3S_Y# 4۪zpXi|MR'ISG@x1O2;!L B|$:,o&)z>/PK!p$PK!7N content.xmlYێ6}W vhs黦%XWKe<+pPљa8Cht0|G%BC(8%B(y}8|N "tuU vucs.^;(l̥Q]!*b}hS-Mk.(YA}{ 9%Z=`)CDY9O뗌e찳hZt"ƣi KyR z*ⱀLMLz1?sF"eQ:CMe4H&Szm{g8Chz\lNi hf(u)qGPEWLu TɶNP,ʝӢz0xE5#ځ҉3SԟQ3 1mz{ڤӮw4ҵo_4uxH8Z Q! /*=ņLlo`xXaݿPZfs;vdˆ9E+\ǒVR|U۰rƢSZY*^A7+9o ?w}'Q=^{:t|>-wpA0 x@.OSw=ԣYO#C#;o͑[ڃ8C\?eV}ܫFwnohf`W{}ppK')UOR{Q'fFC@eB7I~-)FE#_ogwѩ2uI^fDT{tw|M:5ymK_yv̎id݀TS*zQ 8Y,_䈘^UoqG.`bPN+ڪ^)* IpJ~|R{-_;DF@~b3C*)w JĸK|ߺ+]wnPK֞1PK!7NConfigurations2/toolpanel/PK!7NConfigurations2/progressbar/PK!7NConfigurations2/images/Bitmaps/PK!7N'Configurations2/accelerator/current.xmlPKPK!7NConfigurations2/floater/PK!7NConfigurations2/menubar/PK!7NConfigurations2/toolbar/PK!7NConfigurations2/statusbar/PK!7NConfigurations2/popupmenu/PK!7NMETA-INF/manifest.xmln }{`iBI{''AT/&2ir0lqǚVjjq|/~BB"y =Y(J&IT$-}lzy%ݳ-m /Sƨ.jBF+ ~dEz_i֖AQ_3C>SݲܱI-cc3&!HqwMD0ՅGgutet9^G,m, B;ϱMG sAAameta.xmlPK!7N!p$ settings.xmlPK!7N5 G content.xmlPK!7N֞1 styles.xmlPK!7NGConfigurations2/toolpanel/PK!7NConfigurations2/progressbar/PK!7NConfigurations2/images/Bitmaps/PK!7N'Configurations2/accelerator/current.xmlPK!7NMConfigurations2/floater/PK!7NConfigurations2/menubar/PK!7NConfigurations2/toolbar/PK!7NConfigurations2/statusbar/PK!7N'Configurations2/popupmenu/PK!7Nӷ_META-INF/manifest.xmlPK6 vokoscreenNG-3.0.2/src/pictures/player/restore.png000066400000000000000000000126041362045215000222320ustar00rootroot00000000000000PNG  IHDR  !l pHYs+6IDATxt׹,& d(* 4ۘb'{/$DK*DG$$!ӱMj,/Z5v;3wNNp`w{άٳgٴiӰÇ3ţSNGҼʗ/k m LXF*2#B}Q$(tGݺu $5h VŐ!CSxyy=~25(Ulٲ F5k׮WŎ;SM<|jvN0ԫWAvnݺuF\F#99 5(9,XΝ;Q&ڶmk5(,aaaBjը DTŀ"v?Æ /IMQ@U9@U*5Ѿ}\  BjBM赦PjCǸW^yGeNM (% ._U!5q@@U&ݻ@M * DDUh* D~Gk>4hr SgX٫سgO?-U_ 5(UѧOh;RjB&,x7nB;efP~jQYh>j.]$SWsUHMqDTYj3\{CXj ٛ&rI&ߨ*&޽[@PUѫW}rDVEӦMVCUPl>%_eo@Bٛ&h*dn45kּ" XUDU" ^KT7AM (rE'_* DG^+? 0ҥKǔ*&]V@[&Q@UѲeܒTիWQt$UAM)rUV9ũ jNȣIIIEՄ\z"{EUR8::^9|p+Wh! 1W]PUk&7#(@=] @PhUn:˴*&\HMKSRRիwD@(U!_t| RpE'{9h5nK.5-5jZ?=tQX\mڴL/cjA71wܿhِc.l,EIMMm۶m3ݻd.eN(yyy5Kh6'm忇 @Veȑzoذa$#( yr̘1K QD @ @(Q@P(FJӧOhL_>}zAzڵ aaa;@SL)NxI .4߿c…z굏П f,XǏWf͚y?ۣPѯ_=@_>ARf04iП 0Ο?0'SΛ7O X(HM6ZѳgX@]ƤDqQ"Q ܹs.}+XhXB[@((JE/كxQ>/t2T͚5 wIvaQ ٳP6)-!œ0dIҭ[L1mڴ/ϖUD0V*P *|^$@=(Q ̙3n" s"]&0-20N>\k0/^A@@>aQAؕ(LqѥKd.@DR"%KQF```,IhMêU%yeI0@ *AJm)D0A KV00|}}S!ߋgjQ Qhذ%ER֭{w} (~ڃ@CD{ҤIg͚5Y&CǢP6)=r0d)RCh߾f͚]@PaHaȒDQzW\qD< $4j" eSoaГ (xQ.*ذaH=À J' yqZ^ CT6=ÇWVքQky[CԚ0 ZF)شi0-CLwqq9 ^!oJ%"""M5 àVAIJns!oJ ERj4Iؿ7ĉ'ɽm.EP0VPP$7oZjՇW^(,8~x{YR- "._RB[lyÞawh۶mYzƊ+~4C!!K{!څ @¸vZ]DAA( eS$UTydka!JQ!um) oa\=Y70l$1BrALV<]m۶ʲ0.6mdAYV°(Znռy,1,JAal߾}5a `]իU0v10XZrZqرr\(a|W;shhԝ;w\ׯ.D!="GvDƚ5kQk׮//* Ю0Ν;"K)YJ#e!~+EgϞuM.I @&ER$)0G) a7T0M7nX@ƙ3gdÜ0 " )IC݌ @nݺErcݯ֨Q_D֬Y3`* v0 &aX00P @(QD(QD (WBZ\*UzbV+Q)6l)/obQy]`@@mҪUڵkߒ9e4EM7nBOOt-[n\֩Sfzz)W6(NNN333SΥ=2\و*?4a„˯ܹ+Y$fyݻS&&&22(?52MkFnnnˤ$&*MЕDAM&L"''Urrr#ɌjVAO٫*QP}Hvv}6ˆ! !\M(<}T|=#(@5W#Es"T` Ӫ; rrC"9NU aaa&_`&ds?yCOMMKDDKQyYU!cڌ( R;PdDh&Jr"y;U(@5!KK^}bdP"9qDCy9# &Vȇ@@MYiii^FiD*f…,]WELLLoFQk"88x~S"BDGGaPfѣ>aFQXhXkׄd@ QV>*9fQ5a{ePr_KQPTŋ?EM(={c&qML2eRrB+eF!K,yߖ5!/_UP"رccfYM=Y*{Tj@@M/ҏW՟B@Mȭ[j DDU!*v*3(5aS% y[qf Q Xta?WAU QMބk9! (C-[G{"22r3( kbɳɷS"Bڵk 3(0[]{K3PS٫*PVEJJ_FFF[#(j@;v fFX&pn8UOU ˗/͛7hHUL۾}fQkB{UEbbb`fff#0 bŊk&UP,T&M%U5++,fQ5Qg0KUl۶5fQ5a*ߍ@\=քiU[Ό# (EML8oZTjXЩ[lyGPDAU=;;H6Wbč7~ `ȗؼyPDD2+..U(Zjj´*O&WBjBw: ؞999pE &VUPBb߾}rss[@`ի{M(TTTŦM1Ljb„ g$fLLLoQ5Q(+VAg45AMUDGG9yd #'Dk֬Y5a*d@a$ SN9ň j 7`4.&W{KU ]"g䇠VZw˗/1ý3f_-F6/`IȒ=IENDB`vokoscreenNG-3.0.2/src/pictures/screencast/000077500000000000000000000000001362045215000206745ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/pictures/screencast/author.png000066400000000000000000007654671362045215000227350ustar00rootroot00000000000000PNG  IHDRXۘbKGD pHYs  tIME K>EiTXtCommentCREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 90 gG@ IDATxڬOmۗ1ޯ~Uk*RE(@i H *b 66h#HhA H6"FP6bG 1,bCICAaR={91\{9{ךs1}ߠ?@DP&K U-No{j}:'3RPQ?PUND<\_~fAD`fHymWY{k}׿ss2]8{"WSy~OVCϥL^s'9PO3/WDw~we?o?~-^'z@Uqd-]u2Wܻ,8 ~ľ'FJ Dsv@!"r˗/x<_vn`ӧ_S_ܟWү!"(l͒q?댙9 z YBDf?UD9"ӾWYoBM$3=Ԝzԭgz@ι쯍g[iK׬a3 _&_T??mx[+L-x[e<>8D6jO3U"kV+Z Z: fU@mUTNR2H/7?r=|kyA?TϞ:{>|:^Dfkfĩ4M4ϵfF8||h Rֲ!=jBۮ. ZOճg _/uR,_A)%-mdlR^$/=Ȗâ)B}9NUXOwH)Mwጛ=uf?P~uP\,sOoCPm;;fU ]sճzLGWt̵ Tc/qUK;^{*Y@s  Q`\W ma^,.@4[m<ߜQw!f, $v+h[KHX<'Uy??O(HY7ߛDπ?x,W3㕇9W_UUJ?Ÿ0?>z?W`%\-}gՖ~GQ[!+=]e5{\ g'ڇW=pgkyu^-96W{l]¯sy'rzr\"j~NI38x:{ $7ܳuZcWm۰;+I 4'}z28uIMN~_k0tIQExaj?+/D$%'2*,WS4P^{tP%-)~oYdW#_}?S>g_Ӂ: dl勃3XCIPiďWLԉpIZ$y0IMy=;쭈!r&UA3,0^UKf\3<蠞ν3zchp̞?UU1sQa/8 9:Dob^eY~}Տx0*Q 1^,K} !}~JQruȍMW*YX3S9eȯ|I)uxϯ{%Ϙs=,*e^T0+͹ܟ1U]YzglM>W 2yV!_18Wg6 2̶mt%+$}q.9@sx5T9ހm+:geJv }6猷r۶Wzamg۶n%̒wyxN{➌?SDA9KGudkX2B tI<1-O_oiRLjϨyjk>mhT2>T"?KD[ dRUpeFBAO_6KPG6~mjav@ƀz~N},w՟3':C@APVӼK$&_ͮz_ϘϪg %qzꕶ}),=yiOYNUm32,fG= }J?_f+>jAM(|ٹ7"_HUW-8`FV6~@q)׾G~&JGHQuHk"W 6jRB&o_ʘmWJ3Vڭ~mVu |K,ɉ6*Mޮ-b2W6F!u نOd;N]&dH^ CT e,&NV%@WxesY4}v?V ![V){VaœERq.rb.KzSeLjvi"{K= -}mӳgaŪ?2xb939 R:N{gJnU=`j䚗,%h5\7顮*&D׌dU9(W"=a#b,xpd]3}e/+}ݵ*abIWK?gINiD+T[ ձgfqȒj?'J2UЫ|fwN?=7="Rgrz@ӄ~DDXEΜ,D9sI+/w6g?ŸuiE#|Fha^ep6[rJ%9EՔ$zOȫ>%iiQ=*סWdU{ler Jegg^Mg! z}sTnc/i&z U27GRJ5>=nF6X3h=ukzHN܃abxH}O@[k%&WCZ 3qoo/oѶ I}8^vY _/H~o 1 ҥjaBTy LJV>f-2e/Ju\yg($^cO*Gr}Z-BQ Yk&bqD ǥV@I!pM:r RUf"haGI`B 5m.8VFʳ P) zj=#Ik? h]D#i·/cJKZ 3EkCD(ՒM"4颥֬$ƥ0fSE Y;'!Q)M(MD@:tf H ɥ++!9Kwt)AeO{tJT~d'b" SCrh[XV1MPws`64Wb۷QB PŘhC|Ù4hY`$&gLeTVٔg+DZbӵzVSZ첒ohAcTCJU!z֕iMſRrIn܆jog-S1Wi?#trUlmswn2'ma{3b8s30%¾CdZ_Jɓb:_}2#qG 9WK=Ju5峤³,O_P;ysl;ɞi>Dt}IjL9j9\u7-fERGi=T4gaM?1z^y=#j&CN^%&ԪXyd} ¼J^tc=AN˱,KgHk_H+MǸ,j9ό=esbStI sT4I#&{ S2-~oqxk #JP$`V{{a[6=@;H VU{SHp RR~+|TY{Gld`~<=#?lǁc?MwJΙ2p4R쌳SaiR;tc5?ew(?NCs[,W U=9M[LV3<#/u#iFeZZʦVphd 4bWi;;#E}G^X_ruF1 ga!\Ɨd,Ӡ}W'z,6lݴ ث+ȤBJ^mgV}%Rҿ ov>RAG@[d~NF~zrJJ@Q13ht هU@쑏;;T)xx`63<)TJ|R6w@"(eu2o!$hmk&ឝS6(1:BdI"!zD΢qxοx~s챏OC|_"oj23.xdxgM>UifnVwtҶ3?L60(g_9݁=9 $,s QWِ/"hs͕pSsﴼg&—2!kCmƂȉس },LJ5K9kJ_,{[d~8*A=iGhF V@=qW5WԴoʓCp{#9 #>2I 8@b= Zy/[ʗeArTz1rU=~d|Wp:/u$ˇtW 4 hgX}\=OaWP-= f2zd~K_}w|@TK;8,׳`2 9{>cʮ~J:NhUxt`iȉ;fý>cOy=CrY!~rv߻=7F$'yj_fǣ~36{_mC>M2giC2>M!P'5rrU2xD vJyH_VJ5.i.ap" oPIpgAϧWg??Wq@;l1]L'$ \Ws@09ԯYLbmƜz~$6wQmqx9G+8[@D?8xw|(2>j0fQʸaSS ! SyP׃u>#LS'/) ɯ>g|:=WR+mKg;Fta2F?_ P`[|5Uʫٖ?罄\hV,,SGNa OsbB8'Jyd޾WX`6Iӯ|IVl+<Z8qʐ*?KT3G0SZ}ศ:YqpִU.{Mx<=o^j0Uv00H/|CȇᄉYa)WGgF8mM/BsSagdһ)My! {ΗH }vW nۇm mLIgǤ59uߜԣz |R$\H,HM5IU58^6n̦ti9>;ެ+K͚w6۝A 3]j< GfٴM5 n֤n k>4La:+3t$;>W.l\WÐG8ȏK<='f;gYcmG,禕ʔJ\- /' ^_S n׏_G Hxͯ۫׋vN18OT AȾb^G\|FSaq+tmiڭh6Ť|?aruO0W6*ZaՕz6B Rfh0ܴ^JC ?CC*Cs;3.݃ZW/|fZ1hf*EYqm D d[ o=_"U : AjTx [9%$-z"]o [BT^&:@FfT'Iΐ~hq'zVݘL={٢W=%dKPi(z#u$ Ύ}ԭ ̪hѴȢоkU 3#?]ak3\tcpΒx=tK;J\Bw١ɓ^E=4.㽠g ۬=l?BM7,jO!MdHZikFyeJteG!rfk #aC_x_NSi"G{7vS5~<ޭ nHyxg$3R$GF~ #"?pL|h>%ޫ mc( ♍΋q[2~gXKcZuGj|&x6cٯ4Gq=o=yzV֮ ۉj\/>zVGj0^6_©ztɔ}6HnEdzNRQ摮! ϐB3@Nض 7h¡^)f/@P[ 8 aD>^b'4G&1'%3%&ך7Og6Yv :B!b@:,PV -PKĠjB WN w^ 碟:<|g;MgWslGC*SL$spwrʳ= CҒɥcyl_5դ!a-R?^>%:cb} ^@6Z?z?p'1;sQLe:G"z57xڽm ȴNӶN:gYugQ) \0r}<`9qܻʘ x|9 yZI9U!ZnρDu45d5bƭUhZSJ>;3CՑeT6(MaXHj-(` +oRr'+Ur.WNG;WUuOMF5\d徍LF o[3ŇY%pj('LI4>Fdyq \+L6)}j_)DCXOtBdT:#Wz9Uo5Fq0ݘYYu* lkR}'qsX[ s@V4+L('bRՇjc.KaHh|Ay'z(ܷ;5{= tz_۴fS"#7.=n7)>+/~nP lxx f;bl'M@5r3خxqlwZp!a>|x2u#^ f^JF"\DUpHNCpC`cQC0b%w^m YhlPX}ƧJAfya{QU|!NPi V$[g('[D3T|Rj FqVK5HdάvfтdȦ%͘A#[E\|`R>+4 HO*,+汸 *siHŜ9IDLnbMWM$dr$TnjvfQ7V:!V*#[Fy "0Wm !V1OaScG7Udְ>Q7oHd)qUCPKs^<YJ(2Ui4'h4{+o5{HTlhtIkuc^iB' xlHKnr7YGkKvm~1%_h+F՘B  Cmelu&u8 6;p*K<>wQ WQ&lۆۖJP=t3#ُHz Akvq M6=*zrw !VdR;@!g9rVPjj0H+1-O(dS`c.EBq'"wDZCo169hf 'musڟy -`%% mZVUlP҉L$˔H911g#*kt:гyUfM[X>(zeH/f' 4i]!n֒03Z9~fZGD)l#+h{W]L'/+sC{Bn=T"m3a2(&~\t As[8@\ht%{n)n`Db1ۏ7CTsr L ?`iWcOA  r:M6#J5m87eȶcOoxKn{¾%s撓|ʶRy!c9 ⁲ʎdͲ_j[94hdBR XoUx)%q"T`g5xQ6l=sIHN4I~gOoxno@bl 8"ؒ\\2ϋF \!ޥD ԙ" f@|d(Kģ_%I@sk!0s?WWhKk-Ԑ`F^I&Ӂ['kGRYzym"C 8H`<&:ׯX Z9;c r{KìzpN'Ɯقd #yrDB o `cZDz|$ c@uBbDlc=HTw9g8Y`J()a'B" |*pd m`f%P-0:MU< yc6&CV;gȂ2!w`T Ŭ95zj?LxYzvezy[GSyWϪnweBv}p8O<Դ e:b2t.PSu *XߵPm`D+eY+-a17MSu9o"g  Y!"`*Ce/GWW杝 $ȬfTdchIf%ӭIlĊsK{M"99,s|0> = CZ᢭r <’QH/cUݲ Q>!'XUghТݐ54=ȸMl+ %>7v cf=: a#K =Y_3nocKCX鐫UL>lnOlbˁ^m3TP.bɎbi@|UQǒLf$! #0"n]v3X, `M)CHd))G6oH 6Pڑn77A 3WxSj#gZW}.Ϫq6-TL3:7nN5y\ ,ky6pVixW%ռK!-;H-7S2=eDJ@˵qHYΥBӵhmu5t);3QfݩqJL|Oe)D1>A[۞{ % D WN)pL_'NJcBRW◜:'OQ.Z8YQD qJ>D ѯ>+~4vNv(!kMtDq8sH>Cv(AR8H ;UAvnH-c.W F9R2Gi@ L:2_ zZNk/U]Bdשsw\%/oq[̵ F&|o0y"iK쳞zZh 5:b u0^ZKh d9{|#!;pLm/-P?KgF[}e 5aF98 pD3MM)^0 .d}+ HLhJ{ %-%| ad3#d$=?j0!a{C׾E/F>96Wqjh) Q^$R`)=#@) HD>aK}'$Eͭ/Ea#)㦫&W-A>8 EF`d߀!>hO*l"犼 zc)OUWsf/V .l', T3~?%3V\d7.d> 9vTz2dokk(3s\Gh#2 e>bpa9)$tl[ߨF8Yu"e YzL>vpn9Yyj6Ze^1daؐ|dd;~6m Ad6S[%9\ ]۶uRRM8UG~6zRz-WǶF <(f@Ϋ6!69i ۃÏ ]aWL#flq}@v#I(܇E5EzK\XZ*gspHsGs5@\`G7U#31`.uТ(`pDlN^Y\,Ej5Y4rR 0P+"z=>rْ}rZ0h$r?Z;&VE IDATKb T_a7i-hb*Br~x,y8Bzr6v ; Um+sv0]I8;Ľ ' E8y]*Od')K\XU Lr)Ke0@=Y6QUKH3W~M%<]+ݬ.&4($n++Z W=)sK BIImf"|˹}Č }K>7 [>ElޫJC蹾s WUl -jMKz}ˬW?Csں,投ix>xCt-$\}@E)dd=Cz8R|FQ/&?[Ny0%Š \$O2YbV_ʁ5#~&@uE7qj~xnTLsFLш$K1Panyo=LҸgR_wPžJ_ 8̾fND 5 o`݂_2E=Typ3/~3qtp>Ɗ]$-T҆;i#yn0"s [cɚQ}S`it[^(]6d)&9ʓߠ\uVsGUv9nqk[ϗ䮻d=#*1{Lr/ለ!bGI!?羃LB>ڱmNHeȉ!a6MظqcF.> RS}xfVt-Y?O-/.qv& C?pW(}2J'"`6nۆ㸻y$XXwNdv v1ٸa]|>vƞ[2Wє6$?-z(u@i1F_>Yvg%h~}\RɈ$%KvH Ih}ݘDM. |KUņMf3j^F^Jӆl !R%>>}VG1uW;ؓ?-;q[W:+7#:[iO ĶID`c߇:;OХ5 nj7>̓0JNdBߔRa,漗@0B;;<<[ޟb6oˎ6}F4 BNd)mgBg6ڛ{˴ʪ#7Czl_SQi#̚/K$<Ƀ K?تQ}ܰ贩e2eADU%t f6}("mF0?`2#Zm۶$ff9v'|Fq2IR'n_musg\ۻ1OC!(UI=.]ldrSG__46YJlLpihȈb$#T`dҬ밮gT(kqT8rd(%r?2~G~AET[vr]5-IURڠ=CI(6# +_c54ЄXtj߷Y@6Ž8( }M3 {)^ qՀX선fGuH[7ݚ|qwwqDͫv!;vþ﨓 R)tʪT/_"*XFRNPXTAjxP}3nUɖBvNLoh{2$A*qBEq spq¡=2aMb&7hJ}q~fPH.:H!,0$cL 5MK ͸2}?k #.Ue-Acc ]7.WV0dSw"$JrL 9H2֣2|HC`n,h@$۸d>DhBiN6i1T耀pAx@ځ dtDMhbK9nUe0/[ј;SUDoi ?Wݐ4c; =1cc,n 8Pcp!ϣ(#CعJ$nwgoINeX>B}^$ lD;&fG:̦f:Vl/8{cV|6k5g(̄ "RnP`/7{&7"avZ[Yڑ63l[ ۷nHpO_}OJЀ{yJՄuy`G-kDjX +:}^c52/oT(&uTȝ"zE8D/?oݯ6e33]j\fJ):PRuA0Ec _NL05ܑjZJl\{?0'&k%| ?kmWێ7=3A#k*`Cx4@98 Ģ*:y% b ՝¸7VAS1N`!A&i}c*9Z^*#huإTŅr0o>JD: |t_ @ [Je+IY, 1;>?+Ӝ#!71T5#QZQV Ӄqbgha3Vgc.+/+vy>uGd!tBuvTݿ?Fj$т[455jaRK{A\MWiOu~ŋƊ5>DJps뤻YuEO-QmWu/ 64aBJٟD Ǿc[+43 5kp3 ;c`` D7!5z qw۴B.s~:i&&"桺}1 _}zO~ nf%GU+II\l"`r -"|9WL.j=GߧOf/JÿHx/+Iij! ek?ҮTh6Ś-m0~s٤,}Ngℐa2g97j qA ȿcfO6VRwlHc^re8S b&kkgH=z0aH3PD"s<|9p3R`9cZ}^a:bj z}9njQ411Hgw!A<%xzigיh)թFGXau}>@ΑH,ب5+\;5˲³,J}g9| O[3n7W?W7_vΊLb\w [ 0R {+Бۺ2 ؅eW|0<\0ss6&h!.Uv"vRȽ/o6lb-\]| K.@2;[`bpk%^{beQؐan&W/U֟u.F nfSbf߻˻9'+\ٴjlKmeX!h.NU?xȮqS/p`Q}=`{09 mm;*:t7֝4bJL0FÄr(nU'e0Oy n\@KRܣ`4B7zkts$GsQtԻu47fC ((;f7סn!!d'|~~~[QY,T ɥ$$2@}HǺkJzd2t^.wIXoV 25(U͊/=6oh_ AB mjk6Y7 GƥIi50K(}IW;iQF)yfX3@fsxcC~4ۄ!e 8p%[!S('uR2rضh1rЪ\]MgxsM9,ƪ2Y <&gTu*3,yu#OlΝEkԓqH|[#*1{+74KYDvXU| ,!pأ^Y4U<\s-M{W>D`j6e+U ɚ&r^ڐRfW% LOio;~ cH1Pp5mTd_ c*X4׋K=9ty=_{؟PAFAJ?Atlmp;$#ҝOf~:`Ah˳&V*2%a.=c:hqCzbFCsƾm&4'+q6NEJ\b⢊#l;ڿ5`eԪy&玙 ugK(!_j0RJe-铊_6D8ms>*ZG:Ba1jEdu ٙFD#?O4{] ̗uF/37s$(8 fs59r7S|Vsi_}?ωCAzOJ$19ߦt)wY{# fN8]!i" j@C?FkV{P׆@!N) s!fJ `SIhP7 ]e87Y*>r,[q4$۫ixn9oFdiJ8 [7dp'cް)D3OξUcNT۶ s\=8'RQqޢҦ,ŖA1`$D|v`Jq^e*AyzΪUf얨3Blj!W>b~߬馂n :35^}_q|άgB!o_m\GLңݸͪnm݂WEM/<ԓ̈]:S?9kTSo|I#7R=J^!d~k=M fΝ iNiYe1^Xҵ 29T_X@fbGЫhU&% ϧExX0%o!9ԁą ن#H9' 81y ؂|Œ,]6 gt$?`al`c>Lr-$ ιHF|TޤB,"Jx#r0mVVLf [_. <9sCj75E9{8r[tdd{|_i 8?Ci8]2 djf45LR4$LϘފ?jCC˜ўsFT30+Ʉ %vXύ&W|%Qn .ޣS2`-'0ԊBO(>??QOo0 C鄽ꞙ.׍2[ҕsB_1gW*ZD%{uݭ45•+:|Q;L{GM^uxkۡoT΁*dgc|ntwZ:b^A!% `N͓:g2怮x=}_]dy~ᄐHP5%$owp ~}jnĊ b=ݾn؎y3 4Q:w:f֛:G"a5J}͙p1#Қӛ$vF =5а@noSٖ}iijX.*%PXZw̌8|djQ8׿7gnj4&_u'k ys54b@q FӍ ])2pOGaeXݸÈ3DAc!r8Xu(3@۔,1?QN"Pܹ@} 9;(,O #agӪj++9a%WhǕr?$Ga#o1ˇ&$#d\gW}gC5w…CZm]n+ 7Ȧk0Ħequ 7<F^t ԶVbWḥso庼b9KĦ<4<21ApyS9Z/;F񄖀9ݔ;~=xɋ,Ė>LAꜲtH`@j@G̡|2OYcwg>6sdw7w^]82d &k:z5T!b}%$i ,7r/ĵ九`+ !cTu_kKDρ#W4Me{FE@]ͺZ@Jm\@fn%Ƭc+FӧQD/wWO-h,vl FȸfV| D N uzC}*3;DPU6SSw o  &E|=;Z\M6R)4@b)UcGu7s1nHeB mi^1Q}x3w\0֩H Вת MQOvRZV_76 ?ĿF k)mwZ섡@ѡh=ݓsNWUʁdaKGxi-H@q(|Nbnoc׉4V1( 4 b-3?Ank"Пcq1)t4LF`1U R-(FNo. xîg=-IPRБ!jdqƏ~ gI|7Vk3$E9VFPԟSHע[{v*_\-82Hd_ޠ6fR p'q{43؏3q]4rgmvDM梋h4HT^Μo]fڷk:ztٯeNk:۵Mid '%D>aX$@N!YفzH7kF#`wm)v= <ʉfuzMw$>kI^Oђ2YwxҧPsb`$Pд#e<ա!+&mNk"<@AH-Od_iz6#wئqXyOq-* ]׽\լI>'5Igų| Ym\KߖSN¯_?:U$QLω  B׼;WFDV&݊20e4L48NŶ1 zz6I+d/ g(FT,qzӐSm8-vKbv+κxm%% ?PV#\hܛ &N-;v(>˳ϗR&qyC/킝(c<5(6ʑfԳ JET+Q,(iwF``AGc"O&Ss\(˜k#!q}BC^ԕĜTwo}L< 8!.F xhnc}*3uUd#;;ڻdtT $=jtbB'l`| @|\9$O ΊZO$bmRTxN]*D )P;K7:t^Ud($:0uZ ;<uUq'^Ҧ>϶Pw,aLR3ZҤM g`(؃+#Lj[7]Ir"{ԪO?s8a߫kq{|m 2!5s*0VcBr427TOØ|/X^Z8=}Z%)p>?7o( Q?n^R2 U7c7kFn3V }9zIrdƳ[Q+DbykBZ~`ޯiދp)x;]ͺ@A\Uq#\NqpYeK8{M#Jˮitj8k%VяEbM!w!!(:0:_H j}R"+pP;'z#@1|O)"I뵂<'KcT7~sa 4J^2-vqvՋiK'VtWou7"ͻ#_=lcwOXyɟw,VTg*31$FlMRJ(@"nlLXE6Eflo$-mHXoѺz@ Kilf$AJщG*C5Q~Fy#7!k!8q6w~EZӗq7m"sS7g c$Wm8}/8i Lv ȫɹq)?OQTI3ybMSϦ`b`(AxUSR e$ 5g3~ oDLZyK")!{ #7ФBuٍb%5zuR+"գډ^FjC͜o+;v ;d+kMk}93M 5 M*HpPqYĭ@@9;! 3܊g13'paރ DA9Wbp>l C6Dy T# nA4κWғWb\ M.=_:ɽJ:XM>9H}*N<7F7yѰk]^ |Oj>6hU'sviɐ.Q3 EZxJNցiwIH{v_] q687v^1MtQKJx o#wjB(d(^? KizIe4wH~&ܰr)%w9!~y:~T}<%88/u)4j]\DI5L[M hLji+Mós68Ljlb M^}b*Rb͓֊S*d2@~x{@0fֹΜ~~٥Z <IJgY~uN::V[8F__%ai/a|pbh #wVҷRUZR4wߝLZF}\gmƱDeDn@DHym\PvKu W2H7ᶥF'֬2o`ƆLP$čs0 w3>ߘ$Gϖ7̤aݴs{竱I\ӡbtvVE@yehtӢUco3pdН7~qƾOL"s-4I?pJijͰ>Y<IАZʼnaW!!%*OfTMPPkEF'x<|9CSUU7{rDnww& wyř\* +A_E ,1FQ\]0Sm㌽JtDw rűP a`p~v5/,};0tߎbTt=#'! WZgb MlLC9{EJyҏeM8H )Du=!92vNelicF=v:hp0&g4x)toE\?il8͇ҧ~Ry7/6rCi q}]1ҜhGF݋aAX1l(C5$7]p[@N>/d\R >rc'H5ɚLt x.tJHW>~@~P"|!/4h.Z0gmtg8Sb۟93<}ݝXW$.jNv׿Gnpܛ= q-T)ƖtDKݜ-ncO!k~kh~v3t3 rouqMYI}PP*RϏ|BJns")j9uLjpl|SdC6ۭ^ N{Y7q?4-^)rE44ʈir1]>Kh%G`0sZ3Qv$'Οq'ĵc5F}8/ձ\X SPʮ hԮk͵Ylux*bj 3|]T):2~~j{[1O- `.=IZN>q~"Yn[eӐ~D~fWGIMR]\-e VyvkW/'Ϙ(ՓLܺrxhp}:8<3'T95ʊ[^f)={U,JLKS4U (x?P梇3:.!;*'#g}x@Dog#MhBI#T۝6ºOel7@V05cUJ{s\s+΄0s|n Ȯofu2bm%oWHմ>Q8&]wbg{oSK{Fïgvī yZڐ= q98lxϟoxa+:}m0wXuI* =%kW sf-<%y! T5D)q7;:q.͉摴fPbBO _wiMSEtZ"X ^C N*FUsm[1mn3 RUHP2sjUT^G^Z-%^ -H|GmS{{@=o6w٤t}^A̠۵,S*3^H^nN[{r,:oefpC5hF#Rj$ Bݙ-B:Um,r}VInoi^_9&XBM MH8gx 猟?|9|脍AQ0rf(>`9)OZ"Pd"76;W,s^&' @3$?d^n9IJ v}Ӷw4EB10tjSlx| 5T\ꜨU2X(U$VLH),O%9yنXlmOaɦ)rRpBڧW%8 !Ft+)r2Ě$xxC5Q:2|V7)HG 6N/@f `9rjZ˷LJehN ̵0:弜jIKQ7CasBTw:2H4צ?oٕ_a+ nɻ^7vn%*C:\cHo:{vl;߽^h|+ ΟcJzixveMYؠ2u1bP;~ϟ?1A}?Q>?& ?Hp* Յܤ^`a@\eS& ܘ ȷRʐ?h~;V.P||'o;)d7&dnP[^VBތ*A EOk]qui+5n.9#Wk3O5u7M)1]@-'4geIC(QC =៳Zɳ|N+7)vwV Fx`RO|>Oj1WκšqpÍY|6qARyqUNT.VX/Wz#w0-׿o(onR]k{(8\X_ԉ5wt]/~ ~EʺP~Y,}FcZz^w޸Mir&e4ɶ>=03x aI%'/6 R2(?7$Rd쉤R+Y';{|siA]]x&bIQ@**`|rZ9p\bw5W!C#ܯci4V;0dp dYTsQX07CRXN P: ~~ӑLˀt%kB@='h lٯE5G NҰN|碗`;uBZ5SמZօYK)wЇ^/ō>-:M3J~g|W^i*RǿqpW*uWmTvh?yBVld9r EfB'?Q'2{gCeC65Q)M.͊0Ϣx/HUy4 V;ݤbD`%zxsahne[2$^tm zn"Cf˄؝s sU5;<AlDZ"4M]ai+w9Tε,(>wOeWgbMܚOuk3| hfs?7} 'kѤeϡ5369MWr%SCD=@ow0[;ژFVe)_MNh*D/I4$n/z,y! %(o{H] &>V IDATfd#I3u$籑;fDR,nJ.z%FMf^hԣC4ly>?Ǒt>wTqW[9֖Oi'Ѫ8 jSjXA J% FT+G.C(ZL>MTС΢m] <0|a: M]NizHb nU@!=^M{"=_t!=9"HTh)Hak w4wfF&*DBzmVST?1?nbIJ4JO<L߀61_$7)"`wIS8C6aW%:TՄ!Qi4tZnI6Ժ+hn;h/.kxsMd*l&P9^H=уңU׸rq WڅY7m"ɔDDny LOPbObIaF%38edI3)7}*Bٚ(}iY<5`&%UaMMTce6s'-3dB`~]_ɤ)<6tLl<"rOKDtc ֡iD "PZ1Hܛiz=۲aͪyk6L ug pWeʨV)LD&VBΔpZ6"h@jA)'RX'C9ɧ! P&=2yxo/ӡ 2&eO 2u[zQ;dN4J$B. ]|wfOɬIFޡ'͡cC{i d` ̙{6 O4skcElEu6cR*,:$ < JkEʓ4aHlR0B;{MmCUUAHN#hZz1RvL) }UFB:LR%̔M>x>D Մ?p{]w tP)քb[VZND|ckV||A8on Zk<ѮakQ!*!}_5mpΪ7gjg =!NVeALipQӄ:vY~Yxg 2u(]N2ZɍaQ FNM} mό W٥]㡓o=xrxGz-l>!(@&mRwHF+C#v8 XRN,#'QBR1乎^ `Ec|r/n]׀){>1rf5D~3_ݗvř,NJnJK`<*ne^\Fx6gM&Q'tmg^-\ܣ"c 00žc .⢓*aO_Rj;H!cD7ϸURir c?kp{9%?w,tNqX)RV"8Df*ZlMպ׆K)`(ekPri{"*1> z~F3G}zԏ>m"!(_ YU)c:Un[ҐDӻWnam!ct*c.+y~:Y}J/|pm{0Dy> glAVd.H25X֑\6SٟP@J_ڮV,Wg3N'rNf O# <Й2j=50](RwS+x|I>1X 63Y#P;?:??R f2R3hⅷ><{,cMVdsL.H=7R,o/I!߅p*U*5marT"ʕ]Y]fqۗ.obLdkd"$ˤS_ /{0HR9k*2Ts`0fQCo G8,IF9Tӝfa1hZR)UsR9{~V?9#[2He3lr()%(Y/C5Ԃ||yr3nT$ML%LAUJi4,Nc;.e\WZu :5M3UutW2_Kʫ)}HRwS&غ%2GXw=Լ3/)vjkRwρ;!Q'\[po"y||@ВsR[#6ێA6wV VE:ӿމO䐡<=0:niħzXq8.QG^' Y/nH^sVlhBno'=qRׁ(舋8BPՈZM&#busnMxnlۊgR J=i2-$D1VP%<Pr ,,4" \2x YE3f.|iܵ#brSGTjH2/Rw/pŃ=fLJfw\$gϏ gai8=sRR/4z|'.UZ1j턎+jf4$]cT]2d=+s1f(\\3C諀@( 3  Ȫ-:& } ۡ,C0MކG5ik,+#"5uHviAXkgFaM.?S ߷77]Hh^fJ@#<{CnX}@wxQOYj68Vfe?ީ;|a\ܦMUTgi"幖|VR<۲9C]Th#i<_wkSρ{N4ğ?x-$4=۞sKshz'RO c|9A.]D.p.9#seV}b0!SJ:p!Qi66̱v{uiY<{dV%R(xc4 yq_Rvq$;g| ~)RG#.d8.pCZ]>L"}s֞(sRNl(X4sA|HLX͆-]<WԶkQfpM}$0d7\g[{72tjIA&O$Acʑ J5J:vq 7fΫR}9g2*0~2Y}B<<(bZ<GtmAJ<8?xO7;ɥ:J R%uX9اju%[ '?y0kCcM]Lm]?q" _өݼ}Wle2lb;]iZ?۵!/Ύ.` فj;ƺmHm}+b 62ѦLruv / 8|ai$!D QFNrĤk8ߤu (<@Q~^ iN{^ HNܝ\''Kc XJ<5i"q64v*h.f=ߑ'/i" up Ҵu156\09$kX -fcb#w}z iZOJ'@|$,'N(R o0^; Z@8KVk1B z?"[ك B' dWYVfɊ|6h9xoRM^RPEus>d5S2b6kL:p C"CNPT(>)e2RvA>jDD>]ea^͂1֪=Lqj[P@Uk5afL~uR7e(4Q)F@UkO C37;y9:DIcd:#\W,WUay82vBse\ٹߙ*_n"&0oa}ơ1~s5^&i"lr_^3]Y=k2Y4Ma[12$b. v.y',͜5L 2Ϭ<+q؏Ycl|d"X^D&aNpJvE~Qǩԭ>怔a1ؼ1d.qi$*dL Nq_ѢƂ9".R2beزG׳kAfqRI19$$nr]{%"$< gm}6N*N_Sو87mpHQ"a SrwICOD1soFP8jc_(׸EbxWhiukcTx!iLRׂfϡ2r Wd]YaՉ"Wn +8_R[.xu):IzY !n06hoXm_5_hvAiNV$.#(Lw)ZjuXs h=$x-)Q?gtPЌ%S 9hӝsi|nNw!Oj|'K޺My $UDQD-v<ǛpND# LLMi--kVΖ6\JvǍUs 3F΍bmRG߀ub>%vuMU%5VW{Mi MS __HcOD([NK]W?9Qyױݳk_gp>Y7) coN\}>G(uRk"1Fn]0C&1JijG֔C'(Ci3采,S(;JeÅZ InRԢWAG0Q#u#܊!1#wb('3f7$2NgH/'(Ki櫕,ľ)d5>AðS!߰?6Q7h=1D`IF**.)h9Mqߞ fSHGTɠ\YQN?bEFy ?D :PŜZjc?RgژQ4K)(\Z جc]װ 1swWh'h10/{u s+ ͲSX}5d}j9^l$ ]|Esvx8J:6dvaqk>s58_M"M#1ktj=p@ӎ`n0u]#{50TjȌ-3:G3魥3Xq-Z<5@JiaybwrHp0VMi ]ckd*io!KpځBowC$nIFAZv)K_C= C<䘸S|7{MlPNhɂt6#Ap|4mk)|kvإ!޶fuG궋0FR1|2͓5nڐy#5HFB#Li߇Ivua;;ZyRN{ԈVy-M;J ":e}ҭ?Nk{,џ1! @BvY4yw@34}?+ }q4Dр&! $Y!ïޝ\oAz_uucM A|ψREfÓq$B"ۮ9[NVZ!fu,đKr@.w1 ($VUdf&i#!f͍Ķ3Q3v9"wY \"Q Krxы/u"qy∘%f g¤4x7>DIV7H)%| K#J9PROG-j# IDATn&wrS4Q³T1SBqOLE(fK7)"#b9qէdVbkC_y8. <`l nx:/bP]Pa؞|k]gpeѰDRS{P;3Y0M3d[&>q$ynښKِP-Gxvsxو2;2qɧܼhd*}M4Ѷf>P ;餔O;wܪi&(p#|O1#z3 Jش2r~.P :ωk}_-X!KݬBH%MX!)&T&d"<DxmH } ӟ! (@9A'j=:d*γ@JHY$8'Hc0Sp% {jZ1ɹ fۈ N7Cj1c̷31-g8gK;9}LEODzVYLU}*;}$ݘ;6{n{SG~ӭiNzFu׳xH1js3Yͦi c(*6ew H,DuHb•#=*E }Flt4i2kx8G}sFHٮ3gS.5U3؜AZ! +t87Yo0H9όYV`vV3haSq{l%*^[kEO!vVjy1xXQ Uʻe$S)8 72W' b.C5 u{4dPvIHN'Sܫ5ænP+].mJQ݊Q?\3M8=]¹,0^3A}M<a3jqWFpydk嫯LMw+f 2_|T2OE|]Ns{l<>kUZ3F.sšb_WbݠZe x Ζc-WxE <⭧)(F-*o^i 7>vmcԜb{&9+ZdXv 7oXs `mD@yBNFJ&`fJ`̄g$x3P6}Z'%1FJg[+>??|> xjUʤw-ػEia; M~m]b0&5 Үa<(zb(%3S8x߰;{2oݝ[3+#;gq ƞ8X,HI|ᕎr=|ZG:qNXk4\/%^$V&&读خ4S3V7 ַ>V xFC ڞ )Hi%di =0Y&Qz: ə% ]]wűl>RENLܭ<}Lbz< #^'>䩘1Yvk vR!.qv,Zްfp.kp4) $LuE べȣ0x6%_[} B" tBPX5#XVZOW͐<愔RMMgȜ̳@i%wHN9"q{T#]qNHt^㎽ Y Jr6,yu7_^жqG"F-Vx=P=8ޜupQx=ϲ)󒓼ft]6 R|y au!^kn iW@wZ;+ߛܺAwḛlTտ]vIQ]dMF, 3i08c snZ1pMmmtt|Ӡi1V쵲n7^[Uihڸ ٤[Ä!S"!oVHBw]=bLb )dDqF2Ob3'=v|fIsoj<2hO[tzeλ>^V4)mVwf"Ah"rpjS'J0fTI 0W6q}uQb }yh#֟H@ƠÞh>2ޝG2UmVD#`K} Α8?6UB${WĤoO _EƗFkPAsQ 7UE]ЁS)ޅyQtۨԡ625(4$s7c64+3}j{x1H\݉6Ī.{g&?| EzHIT5 fhΝpc+O.4iUx{AjkHv=b݅5l|Ki.~uCّSp TtuҐjG!.]z%拯dwMMWIK}WKos'~D@3P&vqFmğ(pq٤!OEm4Zhҭ.;P6(WߍcQMى(maH>{vH DDj#K)q{1t-zJ)TXNaJ,ߊ00%s9=aJ 6<+W&sś`7,`Ϛ#3?Xw=OT->jET}+n-[[RS#Rl˅wZ%5.dOQhROQb|L{ev΀xʼn_]T'>EIorzA jsM;Q+&L%hy0',BJsU׉ 9F3^0b6> `o ȫb >F_An]j}B#A7jn(xx.7!9 nG#X18'|A7~mD]@CK^XyV$BAjxÞCMcMHuО(fP)l^[ BlPNw̽? TҟAʐR[ynOzܚ&YOW qOA!F<+>Hf<)7ehr8O;CmLYkH>?@gݽh#'D@Pxdf q 0ϖEs6OS-[.J88k`duy?zY7ϫ%UjF.n}Gcctq*[cg q_}b喐7w߾W&o0M~`t%l(`ִCX( P25+9hŦYޭ˛!z6h0޼umD J*NEm"L.Q?3%ẮW/Z$8zFY}ќPiYtsa:<7օ4sXcȷEBke4?GJ̨Ḓ(z)i;/(WK"iXhE]4G[mE_lp;Wyawb"0RΠ?TmQ|Gȏh*.=6gz$IcfY=3wy/w@.%_Fq =HЋZ,sNwWe#22,ӷ*+;P#R|_粮ؼ}k0C Y ǎ[kqk|a15&bhDxem(m۩wK` Tݽ흑1F :m s#Y2ZkhZ\P3+ݐ(㽶nj`?v|$0g[@p0ܓsڕVr~ǎ2m>:mwU(rX>b}f%*<1ig `3P|K@ffX"̐ ƙ ;}ՙDiѼlT'DmERyK*y5ɡQ0:u;LJ85Q (%(K -C,/s͊cCiߺUm|HW]DTG 6Ck}6w\}A6?mlmtIGo\LKWM w^o "U@mfojul?n-b ȹ;3P(VQ^>4nf3}a}l*=F>O27?YTCRJs ,EZ;Fc=63-NBe;SͰ2f*juGW1}lә~΂61*mK.=3QU>?R7n8lG-o2{mjV,?<#?Gr rMyL ͊ ه;Cyэiskx s~jmˈ}~?op}yAC: *xy@7zxV?MLGYm>?ﴟ$kunxk !7O*jqTx۪MP>o;g{4r S|W,ˀ|AuwTX(N]im6Ms,_˨`FrH=}"NAMEfKqFТR!^xcV3In]DTFKf2o Ƚ⒤DnIp4R*NW0d1b CD @(Ed_a;@%}&=yƫ*vͷYDH`$ @s:"֔-ja E҇š]T5:ʿ )~޾Q֊9 N)OrM1 r#©K' )Ek5"yYv㒾ٶ) R窶  >uHk UwV9|g~7?a}ϛϽ4|z#hTg?YxPUg'ztH:, ۣuNq}Yܣ8GVD~Bj5W!ڰ2˜LÎ!Qv,itf\vPt m>ոͩ y`)@jm ZCl$*` /VZl9RT+H`07>Jyf!Ck5"e4ܖ`-~?؅>,Lä%yȴ9c0)fl,pv\ =nJ)c=g~?}]]NBهxgk"7on"{1mSeR0VEsI+ T*_tJ^! Zz OKuDl1p5B<-=!rIF‰AC2WR7K=EkKxwq}+둠-HipSt!!d^+ %gx1u{r]g_m8v.r*E޶CrFJ˲xK(R_˿_~Tڝ*Gx8ta$Oۦ>2>RΞ.~fh=7ۇ6򮠣 >.={»yLA <&yцQsN${cE=xGۻ\`i҃~_@`!>M\l"Ļ.AWjҦqn#DܞBIpF;:kv`g hјsd05) oN4ѐrăv.uiA[U=švP6,ZhPN8)ҨsRufDB7m'~ 0ezcY&0oّkMAϩ١2R\:!4~È~KY ’Bqh Cai#|Ŀx=ŻrcY~<PpObL3L[Է'lD܏>{,Gi߆nc8䝮fxl? ژynX4Wǩ!+Z\Ms>AwfD a9jLyq99܉] uZ(thc[U?Z lz3[ %u]}YVSZ<'U渿3r{!Ct%j)t@?Ğim8sv̩{YQqX^^>㲼 ~ƧAg i6f۹4͙YOTqd>xς-G8}嶯}pQ%eA2>|nsޮm_u7 lWY?W{xR? 89 9jn4q9I|8;By3R.z#zwLk,\;JW_t5^Ǧ-ڪ:U²*}k qg m2$NMSpB ZW ּ҆t |O$!N"=K (i`r1dc͑7{*8;J.eĀrˎbvm{[ȋLB!N~`WCp*.zyyRQWF֢ l9_pbݳEhQ5Oz{{C)7k.9/ӝײWgqsptn!X^^Jn3{3G*ц{gLBg>fy}0+|Ddn#^Vhxl*ΟgggUGfgwHӳZ5O75gv#%2(a V2Kr\thfSeyhvtc`.nT=+Z-HБ Bqm*Ϫ4([bcڶM)XɒaЊk8}3D:6Ę{S|]-tuL+ a>GHؤs)z9>>SJ{'"/% T\/ ^no: B3 %,#Z[jJg|*~~7RZ_tc7$pT幧ƍ苓x<0 ۇn 1;Ǥ=F^(SȐLᆴn}݂LӌAs-i vЄzDż{+fz[ز&l3~mZ(.5jS.g,_s: 98b=@ZGq3\$R; ,Sx' y)☘T)f~ ^٩ Lb35kQ(0K9Nd1paq+os 6uO6`X0į}_z.AHBIuPS9oJsun@9}Q!X+g@5Vs~g0ߘ7N-l&ORx!ǘC6 6m8PNh%| g LCԆ$^;Z7ߏuu_[|o[W0:5!UVYxlqT/[]-k 4<0!>OӁ۵M 8̏ju۠{Y-}w_r?|2g8ߣ{f ?=73GԖu( 8=uH, #"iPml a?nظF[ufb塚W&t`p GiLCzdA'p jD?f fuȀeͳHI#nQ5|*h|y"hd F  (@Z֯[t0^9gk=URIx\H0˝2ݳhZx1=ƐX95cF@iUlB7fe"* 5Xz O"!ފᵔ:9}u @Hg#aZf1Z{뺎UV3¿7gg3x|\ 8gbG_gn_to}T*dJCjy_D>Զ'T3fcxnZ4nggBpTʊjv3.)=),{ЂiC.o1`}yBnE̸9l.?kAR$dWQ<54l)oƁP/:~ݪּK$fYpYo!XZA)a#M ޲$NxA8g];+S9|xWɉ#-6ٗ!u.¡'ZC}ʑ^㤧&" )R Z@$V(>WM'b`Y@~{rkHJC[ 5S|2RC]kl뺎umtj[ou ]΂i\7١x>vzz]jn"P~ fmw+ݮ d!]KAYP=kԍGͱi2=lqS ޻c^gc6+F !QyvP}M96Z]y5u/aJB} !,}3Ѷ>A:S/gV%of ZZWNh}#Mst@s\12)R! `!n*`]oqxC-$VA=^*ÎƌZߠ`VIjU|2!T5$Ƀs^l#+yӭ NӶlu ö!1Ł̀Is{/j"K"xYĹ NP6ԵDF?M5EZLGDV,[kt!вƆߖ=,8 ~`L$'P4rݟ[f1L3b#r.ihYE(ҝzTgz6+IuNw w = oiG @!s,y|6vFdAJg52 [cFmkJhm`2,pJ.xy#l!<7a:LpKfq4ut ` êSv;oGn7'vh Ղu}C-*%lb^v#QAx9EX9bsMɃ,}y2!8.FlkHz*X}ӭ̀Z*Ra~wg=*P ٣ܗۺUT ga;3gA;M!Ql<1dfpER[CS u6`L[1%j@c#:K %摳XnV{c2b9eWE@r@l3" RMة*WRv$ 42Iyv;;M~hHĐEO):;u҆xeGk#ZFr) 8@A܄^yQ=! Z[љKKz;7XD6ȕZp[߰\3Ub]5=>Y2Z0dZd 6-3dN1 k'6%$AY"$rZa׎P({J ĀrdFJ;`{Kr4[(Zq~2h6kF0לhWIfcv\#ˬA?vIx;0 l,ɱzq_LeFYC CzR'#0|b Qj] UXA IyVE3{nk WbmCMKwik]p&[ :fo=<_ @p\Mt#2UTNJUP]U?֞¤)d+;o6Ws!`as^рՎHںyRSEpkT+>ed\Hk$Ȗ[ FPS}^٢J؜QQ*<j D{N.T+ 8f%)H`WWR~QP"{Ri$ Uogj oooA=!aJe%,yA7dLf`Wr(s;QE˂Z*Z%XPh J֬nhuUEm*`e#KȁKB#>%gކrxPHE[$z[nx] xYP ַWo (Hxܚ5`h 5= FP6g@K"qׯ_Gok|aִ rJXذ_y-( k-x[W%V X"G6q1֪FUd"ϒmiSF⼉{r*/'zz};GO0m$ppٳVba~Hy{F0z$d:ICmν+-T:D;SMQ IDATxH친=p>FuGIJ~muiOjtnՇ  jf`vFg#ꊦ7@̟l\8 &1+z=T[V4{oz]$&|HTHJ@K80A\Y !X2Չ Zxotb̦ Pۉa)b+a?3@"x+ZP+u90qPpN᪙ʐl9ЪRzo@\m'w:~6 ;9=md6 lTR>l%n7e n#.`u`$I(Z 5DES*ӝTLBV3)vTA]$aDf,K7*@J3SK XZ|4 2.FN$`!@y̐Y7ֲu{"]m2ozӇ}ATE:DZ|tvuD(k>@e!~&@L?@`aռ6>2ޫr_ɤtߡ?ۙ 5+_޲H5ԆnqAmR|kOWt rگX`Ppj8 {'jĥ2 275Yb6V] u0FhEKy[=Ժ_Yd w9ݳ,~XiZd zIP[E52vg4#ƴkN*dČ8@u0)dqP*mgjف` H#lϧm<Ꭺ[deH$aIBd>-˲Ϥw/aǹ5د{9Rcz?i5e\S 85P!-}k\P!bB#@#m98E;3oD>mN&{iB&m|3yf ݆9_yPY wۇ-#{pw'G;}5yr}l@[gB#8H7{`LYHS=-$**=-65Py St : +?@N0 Aj£Y.0f6$NX$mgZڀ0h$D늶W¢|co EDKF}vgH$"@I.h5v{2DoȔ9jٙwԫX/HMA(M 3T]ȜP% &>HP{s!9@|d{:ސ"r7$Ò,Il`ޣ G] PϾ,|]oaZ$ Jk8_+L$b\ ^/N,`wqMU/j+/}gZDI?Khfì!!:%V*i$y!5dX $\=}tx2?3{}2i[͚f%T̷a'Sa˒ߓp IS_k:3= =e%Y_t;Ϩwa?iP$A)6LKd0lL٘JXRzH$LoXT]GbM ^Y˂f DK5|o o/[W^.:'F p<~wA 51tXd:QGhyT_݋|v)r㩼 EՕ"|S!%lK) h wtzdt@m-K۵MX^ﰑ\uPJzkl< M+n|j5|-n w8k;f'|j) Uȗ+ &iI{H&_@ٶ$.@kΎGuM ]x!)kӁƣNWj%.{ یg}~;|X`@MF׃fnR`pΞ\WuDhm ̀V _$㧗\89{%$atxf0 /Ypk;Mq"4|JuV} uf'^z1[盁N)Ϩ=5zknCK4z}6ǍB#HQt[(t*?x/ΡMQG7G#VfL?D9]|Gjop'pzڲ~8O'}Ϊ`wͅ"^*Xғj}yg1G4"Dƣu60alp W8jCiVJ׻$s %L\0ް6F3-Аϩ7`BikUӽS@QVV5PQhkxoCAnV&vŢ*ַL K"D$Ch}nW* Q|j(!Tj6"3 3hb*bYܥJS՗  E qRkR({{,m<` `:Z[ {I\tǴtK^JI, 2wXB)3 ^C%Jo[HsK>w1i:؆ZƜ e#'21AOL<,EC3њᬛmƮfX׺k‘[ܢl L{T1l<8qҏJ#DK@1R0m)%_[%9Ĕp}G6AJ PHsB+-T6fFNbɡdguox-U89Gˊo߾P V|?ey~;| ~ 2/hwkm^F6Oz]sv[(Ėems`%4bTu0rA"BmkT` ˲mD%%g_3 wJ,`=M ~Pݬ\^>a!Ʒ[AetM0ghG^ּEk U7յۘi5ԱhT"\srv-Hm 2 ^ϗ ^҂؅= ȒݓHA^W :P$%#z __fnZF*g#\]9#xǝ)-T9/\2??sׯl^FN"HRtlX5\k ϣ"v6Ws?t$IBzW1N`~{ĤOӧ>QnmhS~1HQfB+`- )2ER{} It51=Do3Ii* i٘DPdrXBQn.6ŭ`<ZEFu$0@$ z[:oW}߅L~h |7^>?㵾//S`TSM,TюYg bjӁojk^O˂tIxY2XuM/+ַTCQe*lPk;: >2$ syT9L~Q(^3Sx<&p֕fNj ktN1$vY(uXoUc +!E䋩W?o~}Ų|;~P &dh++.샀ػ|s$aG{ׂ!F3260ߥR[MBZ!mZbmZb9>%okƁ+%g2 Ҳ@H,g],v- sM ֛kAY(Ӆr§L X #ifF">.uoogg,E8;zC;.pe͐곹<Q{>|{y<5C{ ?*{ Oj"΋E1|/ώsJiiUb*vVC 5ހ ̣IU_%n-N;߳<Ї+ۓTW1\t1;~eSY(+Ry Ck3 PP5Tk,`Zi鏼͢If>!cFiq?{ ./ H^ Fa0WZyӧ/x}ӧO0%tsןQo} x4 ]MuGR:xŽ)Q[_~n,bSבjE&f911Cc0Ύm(c2$Dao|ĂD*` lĆEzpʠ@-.HGPÙ9_q].~=<Rf%gpJ^H'ڰlE}Ђ ^. .숽d7)1<- pxZ T"67,0VP4 m5۶qM{!xS'|W\~>2g3!d3V:}3֘C^%׀!zNSqq#Ղ1<'yTsFy껴5Vue4Pjmpw))-:K׺T~* VZdy=9-Յ*X̍܋S[GY to(xLUShuD*y~sJXY[PZJd \W愝 E/  #?9zſˏ3e+TGd`Q(nm;1U?| _&g/Ni,H!Q'$dɨYФgЪh2M)~XYBkhhNU֥~tp@D!;۵{ԤUg!rEQ22gbŝ_2gח񾊹)DdChhV g y<ƆYqY~JW{s[ $%uq4cv`_*z;׫1bpj:[Lr>><$`Q,$QxsTe[ny] G_%~4 |ݩYWzvB:0muxTS&I魖9D烲UW.,MNP P X$!)ǛŜ{ IDAT5/,@fT-ҐR'JxQƷ[C\=-Pu#j9gQFaKZn 2*o5x)9Zm88D[Ikn-:[yMy l@@ΧI[(3hR iq{fGk٩+} Pom;.ܒ&c˵OejY|jtc'SuaE;vwlY(`.Owy$:Lq9}3vD\oϜu^7-[JA[ Z3΋@Ǘ= <k!*nnBdXKO d׷i / 8IdO nphh+ $Q0Q :xipϬDH/K{ւB̄E6x&#I9 ,Q2?o??wP}&z] m3W`m05keˆpɎkZ< @ ,Z+V{ɋϧHU.agVoL|QB*1j+Pb1|9Xc6'HԲy}-nW)C6`iV";;VǛytSC>].KrzLo T䳡}o3 oן~o~O_~D] XZVPs8LV b AU7KF#-*9@ #wfU_8x1(LڠuE+p%Dp~νAh⽎;Z BvFP#vls \K]/ ]e8~tśҴ5?b}6 ϾۂW|&J#ЌŌ ϵ+UC!x@* 09;qJAűaⶾmZZZVma CfO?!O\+<|XF5C Ẃ`.jحbxH%wG3ݱt~ p%g\@.), VX"._pu#2]/XH'[cGFu5߾~p!_  F愄t3Ծ*4ZnjJcgqU<-ôDYxx.=^^$q0j[3ζq\}CU6؋F*ISjטRAtbrV-1܈Y({k~Ss t]qţ޲y/m#lWf63z߾}My`J3q o ;gBSBYzYϟ/03LUx}}Ų, 2eܐ$c]WOi͂5c%HABo@o!_Iboei(e^<6Z{BD) -ͱ%q2,ӻ'ʫ_R[ZQWlj^@P]>% v66K{RKqBz0mP1moY#7ih&kㄹg買ZkvoWeuuo#wh=D?0+οi_>Bݎ(݆9BsZ+0涒vj 07A FW/?_@3鄟~Z5l^S jU#|S>di)*3h؄(⦨&@l'FJӬ|>GjQ] mLL iֺԈPV7p,K'WJ/ ?O?{|~_|=~A?ߠ+&)'MmE++RKf֋/S]FEy#P;Bi:Т.~hhJ3H5c@+}>ܚe)xzINc.m3h-sTΟW{fxEZWO{3{:ӔC}*LjߔcWq_/JS躠GYm<X5WA% &A#ĽҺqy#IX)HAa(&(1D*Ro[v'K6ֱif[ЮEz$wAUҼ!- pQ{ĥG{DG6G䣷*>嘀0ާ\s~ܜbTT_#^_$bL'!A|Uា<&FA3~g4Sx’&Fa9|YfEcô.,i6?dLahb\P^l>f R/!)aN_~uҔ Cf? Ƹ| 6<( 0+,Q z PCK)OP/uBy8ZP\Srp;z56mBQ0sXy "GuTqwfdAV5!p -ժ[E@OO8gjw U;6߻yjhM!iy>?@׆Ϊ~@++Uu"[@xP@:;;];g[VV01c|QgN6z; #?ϸ\.he uzfPrO>[1޴9_B\2r(p`/r'ho꠻}q 쨃Q o#VQ%[%q9U^Uv),{HwA@pndJkU֕,"̌'>(O`|E[|Cx{~K_| (vM 92G*cN YUȋu;׬BKAŭ*q7Vry?z<Ŧ.A]/x'0+ֲ\Y,qma 6 9cJw@~oo5r\b'0QCi$7vR BWw% QuNΛ= t0 -*T3݁7@tUbow:cft+Ka@tv!u+yCFVV$izɭ9( k3{8w[Ym !6&ꂬ 錢 Us6&CRB^[@(l]IV턣SCӽؾ"N(9dz}O={-~lZK.~һ'>^u^5>vo mt`=aŏٚ<9u%,%R&OOEDOH' +"O38'? Z~_ן~WԠZ.w5eީfkK“;('vNPSB \ [}Nў (5hQpfIh˗/XD-yy3 RJX k JrN#UZlp3sy$mrŲ`]/H}R*BgԵ5^/PZ` DOGjx'J@֎ZIl.۠-Mw䖪6z9!Og1oe !L ogH8E0Ϡ<#M'$|S0Sh]}& ,I{CQcZc'vNHyF]~>2jX.XKZw"4÷WruDŦ`%jorQ{b!xy8G9VgQ|_^YswCCŃOw}`mϿy=h4@v xZo[?xy{߼Ӛ=lθ;ḿ3q qjk۸G, E%չ9;5|6'[bVoUYE)4%)W&wu/~/?I`(sn: 56NL 6]0"x~` 1{5۬"W U`).hajs Ea`۔yֲ^P 6pNl#Z{ )Z[rqRrG7R/h8 eqդy{^N)Dds2S|iC]@Ѐ>#?C3uuA]m,D2Z]\ Ɣ@5P~ ~lEk<8Bn"%AV-E1M'y)` #ڐ1 Nh ԲZDAae.vVrl\<E9cR.H f|SU|~)n"ݫ*niOgg^W3~uU}lo"{_EzP$n٧{pW˾U6;ҽ}C^ c/yB{ߗ@­Խj+p}sndvUYAoSU+N I0s_>|$񸄽//o\3~(-^eivAE->~9/D(bSfp?{ bmm@%B x>CRrF7zCRH԰:Nϳ#mSID̕CfFBk6s*4ZV ٸ#61#F:G v=y?3#U_o:1c#]kjb =rte=~̬Q0-G fWyCVTJ`vcQ APJ \Ygt/eF`w19߶~h΃g+'30i0;nEVl07(J3,HlD fzÓ kzxKF뢫"7Ա"nPcȨ|㦓X4ۮZJ*=hKZ9=/y_ޮ 9)w?O'7=jk-i1斏Լ]gסaBHY-?fέESFU\./(~uowK ~?yc3_|zaN~4 QԪ!Q@ʊf #qgYRK" XBMA,(LJ#o^DiH &s|SqAFo[ڦ(5b4MI<ӱZQ0e_'RtagG' Zj4EFg5_x(l`SޭS@D.3f=t PE[̈́ja,~ @Pua4foN1dh=B#hYD {g+7OgLӄ$ u9No m)`8AiB~?E sZvps[ ^i4MX\FM1sF0:Pb >BUE<Cv|n(A',=WΣb;b ;T,D*`:FJɡ5Bv7 [LwUcX֣[|KmPtkƁ©# aw+O`0 pjp0 tL'hC@sguV.I`K< hVS >Z@h\fԿ1ւ1xT*G3ˏn<#pbV-7+q"qyy_ \q _Y;=MrFm)4'vszn#AltTϢ5 \]? ^}c;vHMHi7*$ IDAT q,VnC@i$!Ξ}ּ2[NaV]9Oе`-+-ކS@=Ô-,b"ZE\(XVu\tjUaJ*v(jT~/G-ܰ/a#1a(<3!HbHdP e 3B~iKE,@sP-e' ,ISFJ 0] 5 d(Jk`UX,(u]C= K#vpY|cp0'4sdzWA*LGs a?¿5{T|oDԇ1f[/z[ خM_=}Y8>ǺYXlM#[&nD@wMoCeW~ ͒ozMYp>yvO{xߦG A E⠭xebkHNô޿_Jsg|03+#γT1,& r0v:F+-yzL{ϺJחװA9sFey85),kFK&} 7o578F"J ߨdi0)>g *Ƞ Ah-av\+ 9IH]$ٳo)ZIhhpqۤЈ!t*>%`JxZfW̧)e @Bnfʂ\ jy "!{V'&8 x%Eښ۩aN 8E^V;Z܇I>qSg`(8zKVCruޒAx0+6#.H=X[Q>Cn=676sN[Zƕdpd0ס~`'>eA]<I}v5{J p 0x7l-mX̪7 _Dk#w6* Xa~z56z0ɳ'6S QEPe_a{dU6d h T!~2W h]15@. YE!nZq::*&Yzbc{C8*񴉪"4pA)cYBBQ=S0q$u`~0c@bZ^Zksr\X{ MFG[,ˊ򊶖q̘d (h]ǬP^W 2O1Q`(]E5H*.yO9[tJ7&.uScƝgE\oUzJa޴8v߸Xk{ >oTt}ս9#Uu n5Obޛoі޷cj_yĠZiÌiJx ^^]@I R:Z5_:܉٫5%#O«gP[xY}oܺY X׊/_@c&FsF uyM a)]k G:$vPoDnP7SuA+h$br?۬"a!h%6d 0MSohu$7_^8gX P%왢L-ȝQFo<,^a9f$2"5*)PZ6(bm먲) Ngio@kuTkD^ޜJeA.e|}OhY+j`Y_,_*l#G䆜cL!pNT+fcMC'h+EKG{ͽQ*?ܽp==esf;/~xÿ3ȍ)WcݡtvjL.q')]:ǹaj^j Џ {v]7#zJ I&qµ3ŘӕlOZP/ehiȀڀZ}si[Ogq#VM#BwmVVݙ>sE!bjnF6zIrP%R]LyI(},ڭ'rAo$yǖc&V(6;yүWv%p'=M}LoJLT}ct`2bּ3矉{cAݽJٞ ON"1k^  -}4`k6@ CM;(L{{TUE-53Q<FngH@\ 91~Y/=EukR [] ZNHipނI#ωAA( [|4G~D1T7 naǒ!&{oxn2xǸg^nL~<2Uݏ<5ch!ڻH-JW_NxM_ EX:Sa䚴^ [Vo=qLa6Q-* u,[jk/Vhi EK@s%]΢:e l Bx:Zs5m,Z7LszP7ϳoOOOZ'^kjucokm&/ i(k@sO_ StR”)s$. kPZPiS VԲx% s3,`|yyAsЈ>EaasME9M@Q4XzTv ȷo /V{ )nC1Uylv7TG{{^ΐ}#_)՞&<uo㑼H<ջ/ؾuTDہRzjHȱF|*Jq:bqӀ7 zvcL)#gDG}<28݈5*aOhJa\?kG XA:C&8yzuAq3PsjT<ׁ$3 AH${1|4ȁqRcZ-<Ut MHK.Km QIDn;! FA[ '6y# 3j]l۵:,^C]V\VCA 3%C ICaԙhbaon-4Nn{u}po%Ha>޲]S3}o 58ne~xrw*̾a=X[s-JbD8(bmXƜ. sN&SrCZTRkpUv]VsRi[lގu{Ӿ4f] 3-o{">!%ɴf *F #,6ZJ &s:#yZ*h 5_9ھMxSKR+6uPwNBCc՞IX434wM*9yPMp0/}?dwH: [j^' [P0w + [Dl(<hsvᖣY?Nͼ ﶈ$­ٽԎO~3Qnߣ3{}_y}8w8),4{Kky:a{bARƜ3Vk4$6t{]T7_`-L](;=Ww gH1=<4YeЕxM3[xRJ8N9q8f1oF$&W甼1q+;nb!pv RJiJ&0%M;ϭ?C Og<,Ao`{9rxNF}.Sv~s)3w*֚٘>Ȍ쟏׾~6! I y"b\^_b#*fR2B/Mq'!8 %,"9(Zm)4Zq)& rvCaа ίhd[TGA#:[ٗzm>433!R86*{fc^N7۳)*ć>EՇ%oԇ"J6O~cϸfQ?>Y?psΨ:fhFH_x 9ORdIȓxB*!S!1+d&hmsǵn "l v=~@X#$aˑϨuuaMCS 終C vmw/k aŘ|SR#WzO$OH1V%BK 3y#TϮ6~%b]eipǡak- tʨ~u: FwcQ%h32WgH+׋Yu֣Etm8 D`6-6zֲVHoCDJ[y0O#NJoKYz O i ba^uj@]ΓKԒV~ݮ@]6_`

,\!e,Z:1fv-N}sm xm{Tm e-{XsƔP$'gk KHftY=Ѿ5bo>om+'YENu(p{_GIfͧ,-p3hg+j=Pdh;pj4Gc'u$a,`fٚ,ȒPp^+_X O WkmPհ; Ոz-J ?#k nd7o!6ڽt'RÂOE8C Bw'.\y*׭=H*G&kֻ"kqtĜUC߻M>4C)9H ~RJc6FbVqdb $x>)];A '\"P:Jj%}B뛁yl%heXɘH [!sHt3}v:`>GƠ=gZA҆DחH!Y@{ɒV "2eZ.(δM˜ͯJ tvOa\fյzsȴ0 ,n#*}s{)ѭ]ޡm'r+N>"1E5h\hh|b"oл>!!P$eY*= հLC FN4L(mE+tu{H|/lѭ d\sqUE?5= YPaH<᜝lZE[3[CՆ o+bn͆0[M6G{ LUn3aV>?zhuHV8&amry.|\OrC%?tbJ mwcn[)VڋEJ)X4'q6R Lۗ˜O$Q̄Wz8 }8p2 [" 6쳢.b8I?%EZ @Xn:!8دD$RzXiv1L)|ە(r<%CWp1+\@u*b A80&\J)()֊Slۈp2b4FS@<T= kDB2\yT`OtnhZqmw]np^nd>NZAcXn;=)V|_Z\E\JV=6+^nÏ 'a.~} `"zI0%>C,pt46%JYDt'qO/ &Ҕ1XkՌF*/m`P]`tU){ U/= J~<2?Xj En Ў)m_&5}֙7){ݣMy]Iu4*ѭ}v*_}DFZlu9" Pn߇IWnqE&7s6B?9ojzW|纮Xkq>k% 4~C:O IDAT%Ԇ. r\L b7St6:x]:<.TQs_$*>ړn |}G@I-5?L՜zmLa^@Y@t6(;EjЀPkA+^U6-09cX(3ĉM0S"!@~ISϐt: T8O5H@~R1uTǁqDӕ|O :|^mY\L0>wVokp!#iujF9{,ɴtRc$XiiTh@FfgZЕ jI5j&ΓWd8IF jC]Rt?'ՁQ>}BK1  @=*`63S` b8sNgǛ̈́yJ!(mv0 v{-{{-n8}XP."n~{<ܼv݊ArZ,L{Inwh/45`a0ߪ])Rb< 3ʇi_ɵkް/ ӜPۊ/_~ƺ^*I34s<~$q.{F&֮(%W>+6U{@fS9vh?k?G .$MC$bfA)Q2yF#Fm;m3XeVRd쑁sjh 6 +fh6#!h@Fj[D .4UP{3ɭs ݊۶SBt"96lO-WPe}#4.jѵR,fœFvђV. $6kq_k|B P] e n +\ALK6|LъڑJ+*Ug.ϴmzު{><ۉ>^aD.:l1qÇ0F `RX$T{!т1~unHsWQo9mЂ vFu}qGl7W]{xkJĜMqWkۙiv!{\? pDg)ϼD!qDW9eA$>}r$=qP| Hj-N1B@)~X4Y4d h $b3))i5o=OޕhVQ JsXq:28tNӴ[;vxd8tzlmWvvSڞwOu_B:ڊuMjw\}#H}u֐@t:61Ͼ*|l)ڢ\PۢͲ+E*1g9y}ȼ*8"hhN7d:.}8ٵDz6QС%Ȩk $48OgLE }(*/nz AXDn[NjNJl]"-{$Qx CdWSx5R m*#hY}~#c#7JNdfGj .eŶjTj.TQ6StlM3ZuA2B9<&}?J8T].uzv^[ۗ,,t m@y*=o7omb\[<9#L9,,רF#G!m)Z](ꍵWQJ# $}2a,ޠ@Uz# @nևm-Y/yZEy}xmL&˶[qcVfty0>{$-݆Do|SO?cw(;qj#PD v3uHwWZ KT#|_o穷yr )McSCl3D )ڳ+&e:ZH>R܂"\ݙ&s^k)oknO-IxG3'E4h7޶Vz3KeYVώH )Jhe$Z֔V M T(4iv86ж3Z[k~]fy鏵(䋰 mPr ӿ] Ѩ%C"RA>A%Gzlo9ܧSdtwЙ tHF_ }mr>& _ܧm7~vXH .7vS+]wی->ۮ*i'u2(N .+֯0NOOx>ͨ3^XkG07j7PS ռ Cב*xnF;?XucژV߲|L5g~fsrS 0{[4r"uW#;?&aF0Ai܈?xZMg6JZ6G%Ɏ:4~I |$WކD8o }p;ƍWOSϕg E|pa2bϦ * Vv<XRŒ%1J"h̔\;`emJ d2Jv>R- UtGU־EWZѥ9^vf;UiO 8G]l޿(Ir6Gwr>OU}-A'.X YJZz 7?#d>Ž-K=/3NT['=f5C|qZ, ~_ׯ_p53f8[z@I'-P`L(2R;"]XQg陏38rJq1J_ĸuŒ$U[J;ϳdIRQb|sGޠ#+5l#s~莤+#REIq7|;;f;}XM5EV ,0~i!}ɠ"BL$a~98#E%mb (2/M$$"PvT$ZfNhjQ*Q?S<4z)(?r4{Dn6-m~_3 Qfh>3<bJOثa8'X]up'n?jWd*A&}_~]C=P-+/LsUB#}prukzI3v]iT{XJ#m1h,E@0$Y&sX(˗/xbeJ $SiR^+wxvCU`+"@{&[F&&& EUpC)˫e"^r1`’PԢhn@;z35LUMLDӞyb*c/jόdqLCAmYHRrZ3ZGBbC3:W!PO)ziY^o~3Oz|uM:N-{Fc2U *5? yTU6j̓*. T7n;Ju&/楅M -Sr¦ 64^ NoBДmzqyR^e٩g?w!hxgѬ]^pC)1){̱A1s;u: 2N16TA6劗KUUl~׫po_bY\./Hն]9s ݭұ~a^./3 >>>:,F^}Tc , !aއ2r~F\ ϊiZ0evL)79-K^jiEmSb) rq8#qߗG/W}o_Tô\M$fܠIط9К]Ljua1.ҳ dq( kvhE=/?ϫ SZ|GƚlG5V-1(զ?3LA5 >&}xҒQJ=3c Wx21luJyWX[;=<]ݳmX1G`Ry]pq?!APezź^]%C#ڤV;s`{o41l gA읢GV 6``R2[^gb e6\6E݈"0Q9_slNX:WH8?Si <eFKd@'Ü3e]W㟺3% _r3ldauz&mquh۶!_oo/X=Wv_- 3w4\w'ݣlNv &OrO C.zݘnfXԆ%v{^:;mwCb ʌ| fcڶVRݦ PE#.]ŚGSAL Hrf'B)% 8]i00Db?9E`wH|i Zv4j6&S%KVL5vɅtNrwsB?G4#pK|z߾վz`68"`!6U0_ )5n}$DvJ0rƒW-xbG^*}-Xq ^=X D ]hEzW*96҅:Z5soJ =:L̷j臒`cI_N%<-ϪIL]& i˭D{yl7w8nJ4=P~rt/_W\.Wr}./We؎$%qZk޻cPeq%$N_࿧@k /˂~`ȅ0U*XS/J)&pݠvޠZ*fٽ7H6|jBd6*_˺STP 6~<yEZ^mf]W02y U:jŘ}g34 {r[ \hfS[קI/N(٤[E.%@GT`d[Y.9aE-1x碣Gu9u%x=(Db1NT;(þ&J3xاS )pp]xy@땰>P@ 5>uŶڤ 6mسڰݛM!+`_v{Ǿ}R dbM 5^4z45+UVXOB a:?b>(}ypVHB"PQ Hd!?(5?%X_|/R l(hmO'hC\С!i m8 Nv,zk5g-{LiBEDfr1L*CGlB* s:D n.fDE}PnV(hk3)K2CJ|׬DhJC;fVߡa![3j%/fz+mJT"V4WnPԴ@3dp}O88X9ֆZ4*?Uƞw?$(Xx,_?O0v`Dڠtt8?UL=Th3|z}4=J,*>>n톔~ 0Xjg00S@b>=I?ބH$#eg!1aH=D p"Ӡ2QypxOD@" mUPCMwa5ؼJ`ݜƸ:rPǡj\_J1n+FN/PũHkjY|, 3|xNدOf4 Wَ;[>KZONjMw*3>HXņ {~!/CWNzMH2zdnZ(1Z3%žWl[̧\2Zr"oR* (;T;%*3'5ɖnRvb|_d`(lզ$#$τjhHt zhz2 ]IDLlvEȏ3a MU>͍<qMƹGHW~;'#|ag}qg]n@ ٍeMYm? 5?^c7#ץ2#`ӊu1BGF?xRwxRP$Oi"qYuw8O{WW*[S&< >%Z٘̃Xv=]谣;nQK0s5M EVAm$d41kRCpRѸa **Y,S,P8<~ օeIw~`*.K v<L3ھ?kx>`닑9MPBGe>f +`#;X_uBm%B ҍ8c5fYH xPGQboێW]f˲/FbJz` @>8BiRl|HY{HckFK T;vJfav%u3}ES<"7L' Vw,][n+jkaCIi"`Rn=n>Gijmiޑi1HB(Z1 T˒AOToÿo߾=|_~X]0e K{ٿH3?7}K u.,عK}ՅjwEudI9",7W(7D P MFDq25n߀ Ao]s8yMF@cWg+dࣵTZiy\twZm GH`hh>Xwea 4H_l#:]`oJ;1Ku˾Wu〕jٿ8OR/N3WIT4Pvth?0i?gWX\%1Z)+/(-a/// &:"-zyHJvir22;*JV%͊S)[gɋ kV.LbY;@PX&=^h)sq5;S:>>BŨrh.{{SN~:FKHFJ<ڟ/G3̎vG1V+PZ"ظ'RH!fĨM(@f:__+$.JQP_meE\n5ʂLtR gA*vP sE:ݾ*ZD)~!5#L1뜒Sb]`1:1B(i` 9n K6v)`γU5)uUr< BmPPFlZ8~}OKg=0J&z);}`;>UM伢^2xb>c^ͣ)@jA߿^nZ|`76z}1kjli6 ILeuNkMWӭӀB#О>Y5'>q^$tXt6˔abL+Pyբ1 TbT̐ff:hʨ''Ŗ\fAR[RFc~t6x/Qnk^\PGU@WGG>.\a1<ϨL6U+̌7`zqnߒ_Lq~3.s®).&euƙ&g5K?3g#X\VLR?ma9d␪%@ lq)=&fUh+nKa/ Nh|Qd%$e\”e4Q*nwe*ѐ ./W\/aPp^A+#]ف 'КTo([A]9sXW'MQd~L]ݒ_]-bVG̞nS9SĀĶH:P>e/K*]kQ,lS|s +AHW"Bl 054!yꊿ~gQj 0 dm_䇻uymCMԧng(YQ ۅV4qWgE' r׫ H)!gBo}3m 6ː%|Eli>`$RВ+PWZi] RV΄m@.+ [ SNT anZФzK3d6T)Mqyv`$ˍ- 2\9<2+P>b8B8.k6$6:097e2(K}qVT(cA:*3vomVhcPZX-eB;|)C " {5ɹgv$hwm뾣^9c憿\{78v%(h'F%P+K3>&t\ R2:iYQh1R[EcŴ4-m_~^ rbEc#6oX.+|7]$Fm jP;14Vgx6ad#UD1A̱in|P`$%a |o.DzaV{z&hr06%7*6U H .H~مl,8aB(§XXN RV=2#MGXzìqsLTd'z{W˒E%P*؃^ێmƺݼ,w=GaQ+ּXj6PS ^I&`jP)fEN;;3!Kr6,(+Muw͵t!RSk4vx06s:zyc8+w\trq|_z]rYKZ"ְ$+, UԲYʽTRaYlI2Y"|Lժݯv K/2#/ {mSFbƃ?܌(,:-h||(T+q`LA:wz&,k‹XW%nM6t䦣ri6='KI7٧}\Bx6i1&꺮X" n@N#{}Ve&aE>4n.Kn\&BS#m ,Oш6E!Re.,ഘBV8Ѡ7Hz,|(Or^Jƒ^z(Qz,O(?="oP/WӐ米8VWc9L[㡛w/g/nHS.˂sHHnSHWU9(X*F"Z8b}SyWky*V:~!I{N D&ct2q{Z+vRi}uLޅHQ>N9Ye,d x.KZkq Jӆ 7Qew ۂ_~!<#%hB"852 Ol`?Hv^Db"ID4b,2!zY{v 7c||q/b̫]EUώ۾ZNObG>'YLJKB&#g7r8>j-Nl9: ΃#/S1>z`|ZE liK =%qqRi*=$.aNMaU;PU`RtO[k!uk%UρV6}/fWqkYUc gsyGวMxs&8OY, h>V쵠j\cxo~Vƞ5;&-sBY+^V@qsiV-p TTT2ZSJ&O ˂LwZ|}3Yt)XR a)%jY9@->,i\ Nޫ;ӰXKA~Pss>̣>=d3%=4fAĢl#nZY1-Uhޭ4X]| })gb< A˹;LiҒ-VmCwSީB{\pr,`5ƈi},ʰ,˚ UpU,^Z&j+,a +`w(ޡ`;jxz>ϴʏ gŢ(usE+B.&OU'O ԃ.:a vDBJjeiLBQT(7ew#s&ji="h7|=d"b]/>"> eS,FI9꣰ZwlevB]<3cb\8ChQj??BwlζRBI ; %K&BN69Jݶ 5M rζq]y}}ŗ/_@o/W+Ⲭ.j:b>b Wbǣ EXds-Ga&n\Vj2JxgK@|N5/`)6h"d^Hqe`]PbG!#!Ei[#{iP 5I(nR='jfZhN-:xaJą֠sc+M\U7gC]ܣHyrmg@5O=zK5o 3L ~T0չtJ)uI4r_cYq -UciĬ9,˂igÛ3,dQ0wZ)h|>h*n|w=g_Oߧ>zH5ex`vˈ#kkq;Mr\Z~( )a j*cBR 8"䔡RqY3ү_0 o//Xr%aY %c]5Tpy]o@- VNt&} bR+J3KU.C:{mGg ,:1Qm@!AN6 ?(O<uv ͙/u"Tqr;n{9Tf)rN4 Z`BR伎صik7O**չ~D)3x hA͘I=jf7(M`v]ZVEN5Q"lDѶmuGKvJhܚ{%FՊ422o4W5+V㱍315WLƽvFVGZh7Tv.G HP8Fч#9^^ް^޺($ķdvpsHp0r)6ՙ-Z*H f*wb IDAT c-ÌCpJz?F爳…Ψ2>"kS|yE|j\r#ȤQULaϟa]uf ~JaE )-XdW=>l ,aH뚑>;n˅ ) FYD ˗7 |BH:B3uy/'+7дRS,mJ]!9lӒR28сx0Z*G$tW/lfW/Ñe>9c^ ^^F+Ee0XKM Y깚<08΁ZQ;{Y'.mգ=c尩U;_(yeWR"T=z[+>쵺b<qg^QJAVkL%l y&,A F͢VQE>P1bS>fk@-n".4{nYZgv(B,S&\,n^tJ /ιv?{ >!zH)rqo4"ӽ8;=Hm-Qqی}hw_;j{pK)[ h SS\V$5o^A{'nQA-ѽP~|tá hbʓ\i^y9>r@=77ňYw׏q hD.lУ{!G;+YX*Rю"ðj|Ư9'{@R4Lߙdd5;t[m+6 P>kivGk(užU%c]w톜U,)aw#"|Les9@]QKE(+ Ή9,QSEiΖ NWOE *]HDw:U;n,ى˜ `߷edbJbݢ: f}7_VG$Vk JD(ɺ|>wcjg+n2<=%lPl*v*1 3M3W4'\U#Qer_Gi|\F)L"oSF; @NanHl*C?E|<%OY8SĪKܶ ߾ *^.KşAG$VRAJ`׹latTB.%CmՄMŮNcpm'6bs5^j]"3Tt\gg,DI$?X̨89Mjz%/=6~Mb>R6.QM Ê v)\@ZҰIۆ7[5CRVgx6ZkVuRw缉,#1|pdH?=ϑDlM3d|sC7 X} /6 E)'|]Ĺ}U{(Ǭ[FًǴh+:$*IH>MR9Ýg4xc΋vW2=_|ruQ)_?l?y$$:},}@#C%$1^80 5@%@¢@ US/QӂdGqeVUg$rپ;ڻ_7+lm> <[ؓ8rɰeASg*)oj`5_}&ޅ7_|2eWڥvpLax Å)D}2o" 0+=\X:vLi7Kڌ̨EЩ#w*L`6by!6R#Y؈Y|ܛ:|^&VQȕڗ,VSgTBmU|W| ߭w$0b)+_MlkAsd9CDcyG`szF|ᢛ /{fÁ~0ӌnc@ O΅@Kj_  zPk7wh0Y {:xwWթ5paοutO=BsDj80(yL1;azyV>N%Qc5!5tlR@KFQ()Xf)jU DxAQ=a;L..PFncBvl23f :/eS#~rѩsz>_>0αp.uUY : 31:֙"H~ b\=@"WCoeЊ {&:yi$bEa1-"N yVS0qonC%٥x=xxyw:}Pg՘wLcQ?Ĉ+O߻DɎ̇rǂх3;܃ONAdtD ?#t0:~c$GOn(~$r>>D=|~81""*elTQ9N;=!<}\;lA+jh{AmvWXV"Te«*hҰm?.L] H^8Pz瓒 S3@ &WKr25邟YtL!l#3; ٚq~^ZHkNMJ˴4sQXTxBxeAlruIL)6e^,Ƙ\X߾:4qRiL<:gP2BaɡF3Ne"1էo)}T HGaS[fŭx_Ղ^YRo#|@[$6٘]clM9?0{ _-zOEdg?g/{.B_ϻ M#&[(Fх:.b6CQ@~agDDtP9:*^ycy|nv| ŝ')~.@0S1!n' (=l;gYdv+,*ykSh$*6A'&ZOniJC!![. yAZWA4S )VkBQRjHȫ“?Gq8Ih8B½SKC&I4ҊWMv)M XAQvuAL &6hA)tZ_߾?}ß?p__[08R8&&""3}ѕCĎvx=:TFt8s^qX;W o3c#*matϣG](.RX;(L4A-hVFzx:#Ⱇlw S ȿļܟ@W=䁺Bv.M:#܁}CWߓeYMy r\V:t}Vv+DIbu2'8ԣx5-F<,*=PϻDDm梏-os&K!gVP9t\ömF;ArXRt%1 PIpū{Z%bJ TԍDyɋ(Q,/`4DDB1hm$OURJ|ŋc)ެ^,Z̏|Y;7doHS)Pb_{dϣhrg{Z#@a,}!Z0B ݹmHXW6ڶc}{Ueƾ|acyT0ί?}GY0Z AS؈|߹NEXWW(,UoOHZ韥&*-qPXb]U.66!! nbq^Gm+z+ޱ /.vG~sҿ:ΒeY_=mx].iB6?'wxܝA829'1[_@`ԓpe"c6=wXx1ՓM <l;g6Ӏ31y8kRxth{>j'5(UAb͋(MP<<j(F2W_$TE϶L-/nvٻևpsb19Fn>n@brzꇽw8t:AD000Ջ4Ox\%"}9W !ab+H?}ڟ?C .bXY|?]|ԧB)eɑEݶǐ٧DhJ"C'vPZr}їC9 ёf+\pi!/@>8i,2ehT"ְs~_DTDhcf+;u>v{t 7p;q.59Y5SL NLgȻDn<}~]ҟ]2B>1.6y_UJcTg#g=Ԩϊe<+j~q(>u}oҫs_U͂;6ZcvCK4Am"~ Hj٪vaJHb]Ncף$NJ`Qp ."SrM/L]u+R߷)tO&~լ {w 5~/:/^UiCg;DzaV{}agqXLOrfVH yY}љp"j)+Z:$]y_>_xaqd] 3h\,>`u꘸ "ɠgESa6ŒQa^֏] |^!]. Ph#UY ?g3ggG|H'>M}hܝ%b:_dO7٣G[s?]>RNτ ?&ק}t {~X`ZK'XZLHyH*5h3gKH4]2t:v0|TT!H }||ƌ' xXZ CQؔpRQԺuW,Wp^{:LB}2iLqfk-N391~H ;GDGw]?0G٥YsSX-~OϺyt4>Tv#0RMD, " 2fbA:5yM&FCRE9ee$8iMgT}?7"t2vd: ]EfgQ܉PEǎwD  8/>9njd{7Gp8Zbo{Pvc)YI4iZbk+` LDƸ͒\usAO AgΪRUKq6q |47F6D2QLܺp. ; #H>>nMNgT.)#779z$2F$/cXU%|WOD&2ٕqk*WԼ^l\^ JE=\ѩO՘m:Y%zyVePOxg2(?o?`>3GF|Agy=?Q3~ugFȾ8}]ήGyLT~DsiM+;5p\%j .TQ;)fIYc2G#*Ylm f0Li>(M m*7 jJVMhBz7$~aPTނ F# tԹTRa&ĺru{)XZ ?SQkW@{,xZ$ GM,kB͑kN\xRJP `G?s RyGrVV}šGk!+~cͶǢw XxAfcJYQTk.[mx ߛ`PAGjS@hsdU\FЁA>YR5)G}]꫃>@q,ـN?{:t3xg~l~2=x[_GJ=aBf#G&Lwgγ)z'y {脜!jK}}IBQ[ )ܻsdtz1ʦ5٣{۾6TN6eY #箑uoL$iK~^{Á!~tW˄J}sI|tO1z=r>G; .~jFwÌ")O#iytٮkߧ*2“݇f=#UW% bkbiS#|MA B#N.{ },Uu HNDl0"\mKZ|k}Nn*X]I '$A@;4saƯ,(m3fBajX~a 2e5I d2vȢ 'L҉c`6'cYZ믹x:g'}=:#G*Sk]);ۇ l2 \nb6%Ŕ(3_W=;շ&AAOwk IDATu{xvY`(*W (~>[=Ʈp%u>7ZmwB>]0MѺ'FzJ}ƜWi^B/>n`|2{19(wՀ{޼sw?S}%s>!fq~.~H,N*{;g2tw'EJ޻z媮"> o?}50fo+T|u⇹vBəӶFFdX,@ό۞!v~> 1Dٗxe~-+ʺ^,w/,ʀ=KB+i& hدQ="HLܨ2G 3TkA?,؈/8ҨX1ER֠ypfɺ_GBC`$=s`5f׺,rX_7O0O.a&_ѩd[hkH0AkSxΙ|:ܭOk1D |ƦMwh^.U{_ێl+fvRPKN@6gc5Z.q:vb.#8c!h͆7wxχkE;]+ ~v'[hM>ßp&\ג O,tG ;2Oh&32BT@$Bihuf}GݣT'(j@Tmh*&nlJn|%m{$({u qA]N{/=\_Zvzځ3|*w:gKgʏ?#R^U=k*5jezGe'ZTJA)ċi:\ :,\Ysa>dYdihO:t+wE>Jq dAVဦl=-^c9EکQT {T;3Xd`Ұ Qpje[)d#XC9 \lػ!] $Iv"D .2Siw>tUMJ^[`aZOa>,)Eb&yHFzH7_ކtH֝(hY45iؚgowWG Yc#¦ÈrJ!+Xvoz:CC.%>7O/cTz7=N0z+N4'nR#לOgs.&gվu+g:A^OZL>e֞'+fC^lgh2fwq}nƞя,"DzSP2A`:1Hdp~L!BpLrlJ`rt.P Ъ"R /C^5kf`h/lymfNB_J>=ב;뺢5t7sOchXj$mL[u +ÔN>ᘹ[T)Pٟ@q$l3$_GL =RWK94Z|AV5&x=Ih?6 ۆ~~g_ƿ~~#uKR(U}]_V7Xϔ`RGD;$eS}F|'!XJd"{VwM{ "|w~N8dnv3u+du}1fe<|5DtE?eL =]6BYV_2Voů]חD5R]Z; 5NeȽ ~D!SENP&(a:ާiI:<3Sqs $V3t̐aY nTO"ҵNB3*ad9.>}~Z{e-u#C( ^x,B݉f0$"})| 9af }"gU:/eMsFe3ܭ}k1?1.xAL/p%U}p^3wGw4_o 2%kTob;eo]BFy$}e_w*Wȹ; lptzI~Ofۂq`{:\Oʳw㎺%Y{7hw/>518_Lt5  F/GuY%A MY49<`*kM'X0DZn:}&(yc1:mT(f'?LX8dYOR vIU78LRYҷS6RbpF{"H~cxOg]j0Q d\AUmإO''za+4%4 vi=-&%EDUC2)=# GKY.f:M'N6%4{6:!2(~2\ً尿~vXY|ϛfb|ZLU=gk{~_{83H&d0pg*d愺N!I~ `l&P?- V1  VgkPu-[ƭb\k4d&\y\SᘮX%tGw)M{|!3Zϲaq<ChiG8Eig8nic?b=j7KNw! Zv7 .I`t=UEI (w@wQiRQF ⹙Tyܖ6Ub.ݸCZqd*+ZD tZ9vR@ ei_ bPtx~v٢KY^idrY'lޟ[ \rTMw/ڠ͵h<|k *Z}d5EIxWAIa6|X^ XJ;P.{Ͼ᯿o4 T.ꖉeOWeߗ&I}Z-Þ6`&r Q)[QM:QdbSAQqG(\n#wOO5wz3e0SG`3.L{H%Byk;Z ůyZc4-ЧN2 pA4|y)T움ڎ}i1+!H; fơXء63BeR DV{D}wa& K$i1]`džidXXԢM-\^4d- ̺KT@,&]a6BFn!Tq \+J)JmH0gOHQsc| -5N&IԨ\(ԒdtaJ{٥L2>*<__^o47ە>O#+tw`-_& Db_mO4 (iUl^tiZ(=gO}*Sn`.G?ieTߛwD6h#Ԁ]FF.quwTߓ)iX d.ܽ|ݢ6@[ } Ml`( t0wO"@ŝ~ޛkyt΅pʼ~|! }4MzIưrd.`g+v>^۩LRG+]*G5DCi0,o@'@Džbڲql G'ɵvl_"*=&&[)>$FJaɒ0*cf'Z'o;VԪ(e.f~\ϠG9LkwixI@VaԲ)F(eT4_/|X4 u D|N:ԾQJ*UpPQ8J'c ^s87*V5kY{+Ė1eD9ObY:Ja,5T$u b)U '9.5mr=Dtn ƸZ_>آ1%XZ<DQTo"TWoh$(b1M&@P"rP ¼%0%&/9=4M5)3J?J`ZFJbCaki`rMpNȧV ! enN>>hͥ {8x@i0움 46HD/4'ct F֯cJ6GKg/'ygHs&GJKBV검'0-W M+n@-\T,k4]P+2, ty.d$?'tH:+{>'MΔefބõ.~GPyi ]Y;5 ۯMxUT$OO㫂9wg۷g8?jZ^kI4ꡙlpp\w# 0Fr0۹R/'Ѿ &M=0pPݡFؕRJ7hR;9_OgF TDbPh7LNNT;nLk OV7ԋ.=xDl@dL:Y&:JhF$Lpgv;6QHk(\aA;DªδEި{(9Ih2J=u7#^@eq6e+`Z >Gܐ.xgyd {dHG4nփlw'Ґ.F™cʡeݥi ON5Ѝ C %e

x0g͉iQBFmN.7}'gg]OR7fc ě хr"-#)[+K88]++r#; G|1}ƟU&x{9f]M{5Eaz.s+K#7+;ybw© IDATh&n,$S1zh3ujģy2EQANHmp\4Q_u<{d`4&^/DQ_}LLNcrODچe-8/rͶmq(ھXjm3s/dqR=''ƺ,CYf|q&~ct~u+D>scK6?7CCDv>ds nցÔؕӤ湦˲`(HNcshWպ 2{ٟ}Qnހ2~={Z9 ~7P>}.? GZNrpqy%[y}XfN^q򶨜'?I3dKW*gnLƧIokE4ܓ0 ٓsCu^3{R@tt1Y4L; IZBaK 1(-+₅`"QpL!.O ]V&Zd'~xe"أCR,+9^¡o\nfN5'1A0@MbIkJIй3 0V{]j86oЛ!ݚmTȫK~j> 9홛.!;28e}`~DV>u@ Aѧ b2_ϡvѬԸo{2C1E1u{ʆ[|#S:+4ƾ+沏t A=mow}M!0)`hXL%BiOo,(GI ؕ8fx?OnlGtKG uu q8 %e7Z'HJ:L|H/¬4]JX?P9݄4.nx=HRD}Xa[тV Z(k{&hS!g7fGœGX 4`}ϥc/Ӻ Z`  £0/(K5PR %d3.ߤKҼ?N؏֚i6nGY} 47'W ;c3u&WU+z=X}gL득s=mB}gjf_ }w4F)fm_ tk(zX:yZQ6{KOeFg0Ds@I mʑɡ>(ⵕ/=8ҼJ?qiYr{Y@;nwuC|J2?MgMg?Ѽ{ ęNV`O nf+i=P`ZwG+a/a!"*v72 `h5@-2$Nƶ}ސ {T*TŁmďxcD9e2F;T9A7HLQս?5Ůn9I3ҙb#sly06 _Bqg<*ʄ \ )X6b4#hZݴfdJ>r@Pu!h bb<022ѲI,rRamcuTڊFACW<}{B4赵^|wYI32?(Lw\.i0;yHk|ejD3ou/KRdK,OBU})JC1Ƹ^L4A3a+PEgv#9'.(ɴx͝c݅:lO:cnh:0 o6*|h"=3ӦiJ\8w"gov}|*>0QɕY4x#d8çS*}1Ι3-zpJcJ(ADH%^=Z@j3;͸3w4Y0A'߷) /Su^枙lC7,_T`( 冽56/ 4Q3¾ 6QX<{3Ϗ+]j 5q/l+#I3`m7KIHDKaP]:VʂW7jf奸B G!Xւ, ,+7 QP\gg8gޱ.K!Q3w'X ,qSR,奄})ֲx M u ?\\X`m;{d 4|].mY !L`2O0GREXM8dj6slN ;;Ul*h0 إDͳ=-@11B]*UtSZF6`l(q) gc8Eq!±~K]]B60D԰',dDXWƯ_!WyJj^H*i듥[0z羏&ѽZ{Z#hܷƎ,ٷlnJ·|XtNg`_{vk썯O*:ATFWs=;N^6iPJxtbçRgR4EHyp tQ? {' Hd9j}X]W}Ϗ#ōGgEq`xQxrg[4:s3٫IJ"T^6 *=+6ݿw ;f]p';]#^!,>>aйRp@- zb) kxm"ť/ط * z&L!8LD~_,#xs˂屢ĿǂZ~u7w UHtjhKjg<^ǯ_x|f"29EUQ"Ծ7h(ý&|r%L97z_w@&4 zx (TȧfSm(̰֜ڋ0zFLdS*DYpH#_}(Ŧ`v]k09㳤]ǼsEΒCc1bƜW< ,۶M>[dZ/1&Œlt[j>{uci=MDr/q xWY(3W&;z-wKÂM3k)Kepϐes3=g FD 䱬e6Co2 Ⱥ4eEQ )C@,i6[i>zIHǯ/|<*6~۶ۭbeQO5Z/KjXH(jNZ'{eb)5}e5Q}˦x4v!,1zpv3"D ZДglRj'7G]=ݜv ʽ<껃^ ˏH2EAX7->@j%DhQoiOAI8U٧Mb!]5׋n=:˻~ | >w5_bIL0"0sf. ¯;Dz*jo{Fe  Td6',ˀ9.׺ez ^ⅶfsE⥲6\ ʹ#ruM-[=5kARb, BRVGK t*b@DɰNbX8+C]@T|Y<Ys(TD,ҀeͼEyW4A׀fCIJ=qt!<]1\j`bPI..aT|~tNJ($h&=#mw^-&X"7h$u֔^2g9fh)b$KSHc )*ߎԦlB c#%ĩw江$@cG*o }qBgUSjUSiZ o~ub'^ jY<_N'HUؕ Kp5|aMgIYOi9NBWAio5"=LaĬr.g8_+ჿ F^_-5^MЧk<ody%%{V.,ب4B=UWHC,;~o0c꺿]fC% *ɂ\^0NʝL&H u K<~B]{7 J(H!Hhgp:aĽ;8a{ΞBd^h*:Ur#;@> hJH-@v4 va %|7꾹al5ߏ:zq&&Í_= У0R'ٲɺ= iIL8NXpHg-4CjSn.̠H+);(dQ*1];rR~~`זh3NÀlféjxTdԵ4^dq{=uC|x!{>^yMž&G)$x`ZÒ}jlh$MWOڝռ\bLSUK'YA8~NúqjnoTå՟bx2i|FŠڜ'L%93q~? 1v"v$m-=# IDAT*>tQΆ>=ig!ʀPؾ`f:Ֆ90<Խ?#\pV,F6¯!?)@wEq>߳2 _AIY(f`zNmyn|ws:I~=$tY{gu RġCeYͦhd>8ܚ) LI]Jq7 :Y{Ԛa% sEB ]XP3"Z'm(Dc1)S W ZE9 *1ʕaa9,#X(/xDCT:+928KdjqH j" Ekk(M|J5 (y0sNHR rlN0'/ꌌhT"j~}-T4ms6s5zyU s\sYm['M2(#[ףrp4ާ}u\7v=X(\LyEۧ N`*?avJz`J_e1_MuoWt|f&M$JPlEk%h bL %oh<9eTS|] GL+ #9,!Ɣ_XMݢ- lC\R`M{ÜD ?udJ 0aBvVJ1h608ܗ_a{O AKR@UK^)-Y8w^p_ ܕ1+iew'!;'a '2se?_WkgG0N򨳴؁[ IМvI:fz^8+v>DL>%\1Ug"HbL}su:ޓ`#&:6)IAб5FH\2`v|°*Q:_|QkSMS *P sȵa&zN9V 4 l=!8tE&r?hp `_)$8m {=}SJJ`,@c%&W0aDdCwHuF^{|"lmi =CɩJU}i@'ai7c3<SuG ]GSԺ B܍"(Fl^zkϸI)uu}뤟y;HO&Wd$|SǼ+;>6ø$e p.3ij{fz7';w'(hs8ޛS^n'|dW%ht{kR OM Z,㌟~mP#&B\tK1 f))C7_HH>HA4ZzK 7FKLp)As*krL1-p9XM RAP03(u9@W,[wꯇ-;AXw꼩8 _}|hMl9r֓ЛڭV1 {zDLr{1^}5?%ﭧ;,f?t̊~U? sĝ^ W0GDS@CsKȜM8HS׬;bNIivAi-DI+"{$ )Kw' fh6r^<st0Jd:H t#wl.RƵH= NEVptHarg#aXbuG&ҁ4UzH@OnyDc@Q)X؁{\MC/39&@"R'L؈3rLSq 6{=.P3Ύʹ?Rb/ȁȍ~{uҏK%nFwƻp+»z8I{9rNP't \Iq˃ʹ֭"NDg~h㑤`ɼ7S꡵ Q y J:;- efpL C,. eYP'A zUAK8q+;V[&N(exn1Md|lwx!t#Qvsy/A#X$V~~P (]&DHt[ATm bcIqhhY8\wfa5貂dUP}}y>ղzuX.T:47,BXGfjm;ә9愞M|df˘gyN9P/i7f$"r'G]-4.?bmgBѬ9مݐ'x cƦX  OO$qÄ}`~L ŮNc $% ?;p4`yXZ\*@ᤔ,MN閫O*`XsVeF+J7S(W7(hh},,+2L ƣ\zփiܞ|?o.9㜢ZT"FqMg )15!]\M*w3xGs7 ʜ {j^1^C8NlzC7w:Աyo' 'Ⱦ·Ole4<#bt%KS3`PBv.I&Dxz0?BK~;r'DaЀ>cȸ;܇'QP!&IA?أqM]h%I$l@DO/alSStChn:|AB:|YTD4" kyGrdZ- {{)z. 9J^߳0G0*6TSwp:QpY;i*-%[~}  ¡a +; N7 lܗy$=r/ @t p3 jeY2U4Նf)#[d_z$s d=OϮ Kc\i|Z  s~pϙ%I$'NAO;_tfZqi 0aPGE†֬bS*BAyᎣ[bX8([A H@@J hF%7A f.%@g5[EupŃyB|LP(#->\j_#갸ϙ$dqre"RuNYf$kϊaCOB#a^]s gnx0%/6!'^-`*w88 }UbF*3:`v^FcYhPB"ZuXUϲb18Zm ke}3l!Z_No@`\p>`vO|v> tx&t9N]{z>4ŷ|m)MQF &@NWW=aV"9~9PU( yܧᶩ۵QX܄LPR$jfMST ],RJZl{`23h)hlbB:T(*bQ$=KR4FX i›&.{@/",ŤDu+ > C7׆''LguJd~滭]pލXYtEP`ȑ<8sW=%> lfp8g/΂Yz!e jjq)uÉn'gĠ vn%\ 6+Ղb J)Ok(o#Hks# wgF:rM܅r/ ԓ:s!I iM\u#O&yq\Nz?v41gL pfA}nLZ㿘A@F(X(GlMW&ľGYdU2Jj ۾$kwc0Dh5SS8.8 i&V]8I@W`Ct ڣLR{љPjźvu'MQ (N*|G`!4 ;霙xbrՋTwfᕏp{m]s'Z't ҳSӟ0Mwݫ:8Wݴxb- |'8E  LڜNfd8rkOu셱c)Aa6K B OYi٤aEA cF>% dߡaH 0_DE ggEN[Ft Gh:S{$kbAl/QH/q j鲕}r$EjʕŢă15' vXu؅d4utww'D3E"5C-`5͓DL@oTˀ.eA0WvnYX 23^CQiv`Wh^|8f&w]lΟJ:݆( ō&xm˫PE!u=EnB%Nd|2&A6$G64!H^PuiD05.~qXץ[Pq҆|kYXKIE7EBAQ퍻u- ]ɹfYsORUD?R,*{[Yy'IUٲD޿ͬmx@ 3򶝈cx{gE$u @F5Jc L RbJ}>LgR"ղ"oFRWaL."6j[@{Ae!(pήk&NKUTUW)Zr3T5!)żAXAS~\c5@3TKNT5,:傟o?d$uF e9؀!rM 4JzoIqu3yfNHB`5+DWtjթDy˥bn]r!s<iU!.7z17D0XAXTARM(3?|a½ ل:Va1PEkpJ= 8%PgcDL嬝o2I)fmx,䤧~`=gv3C)sqTU-Qc 8L؁vx@|o&0E;펵s_PFEMLcMl֨9$8E]͞BF L,A&-Nyca^Vq>Soj}Jq<.BCDmM3aK>PXH8ksn~ԇjfZ4`W 2;W ;sV(9?-cC=lT@hPSyZ7M1uqL;yk\{ rlAp"T|]i[DU)ɐM< :2H =2%_ӄ)͘]r*)MȔcQڔ4!<B#u3rsd+ڋլyEWMҠA[%j犓'b9FmI: ٢_IOtaxd;de h6mTT#S $m6$~:y$~ϭE2[a QՒH@nh&OESF"j)a pT j 7ZMY*8:5VQb%_͗>h\uw#^hkCqd_eNgAN_kv/[긡E>߁*]gg>Gѹ0EG:sl]? ?Тus{?şEzd琈^<&/"Ux.")\\D.iu37@`ϐ  Ƅs39@ʘ|ebfL[ZsSdMbJ*kJt1bMkUz=|XSl4{Wtj agr4@Yu]r{ꡒuqUލ<X IDAT=VN&wQJr-7l(K Ә3 й)0zsܼzUݕcE;wL;/h;>tl)=,e뉼-<'=%Bܦj`0wFeUBҰaq ʎu?ȸ$GbЙ1yOyx<ӈE棨=oӎYx_UlQgjb%8NX͞m^!R`0`q:(P wx0>|'`I# %8YцYb#Rh,k#5vg(/g2yJ9]'v+٦؍׀@BDm-3^gn>>u8-g%~T}[?M90c*3Y;*;~NY{ d2'd#~r:kM^V{S3Ku$gB&^NĢ2ӃN;r~ML<]$H6TaH2 NRlr5MM/oSN$yGs_*\Uc?D+ABT0N.䛐0ڠI,̄"6-f 1Ũͨjpk}s?M@x:!j](cif<5Zuk9krg{ƜMapm(ҽS? 93b&kPh VuKKCj>bz;VW <%?+̳3o(dr`:! }Pz&Wv-( U<}g$u >{Quֆ߳w1[x‘_xZL4sޟmℯ Z[mv=ȭò;.NoN#ϙqI? Et \~b H]Dc y,q_>aPU`bTq>١6{U|Tg!Mgc#1R0@ -#6LrXMb90gA$)[~Pմn>S #]+uصՂd{ȅmIc-ݳxjWotL &=Dq֨/Ch4gbWSnG#䀉Ve{"{>KO _ϫD 3&U)G|968Mv_oh$gwĽ ,kwn+c ~WlFܼjƖjOPD_H8K|DA-1;kK-Hc :gxZc2qCbY Nh5KjWŐ3(3xi;;{@8EXϊ:9!čV41YIL2Ǔh)7^fvh٧fk 6vNnplxY-#ߎ:yk}[:~yW=r)r_p6VnǃgtbS7pEgJ6Ak.Uʹ2sA\%=25=r6Ujd$0v&uu# *u>fePŸ).| 0e<#c|5U$Sp`24cD?kU Un{y/BO2BR;ʺjdY3%{Y ˊ4cJ aibDt /DKn'("@z.~9P;BLPcT5DQŠ栅7preɳem 0Ax( о&-\}fÆIjdcZc!Z ZPğ)"3mʸ@÷[C[ܚÏa)9,X$EVMHᙬ9G9y<Ͷ>;΄3.LWm×CeuwxۿѠ<SJl&{m2G7!cF0)RI~к))MƇw4=t#sAL(' Y&uuKo5%L3V lG)+.]2]MTgF"Bx[bZP)+~ɚz^ہPDܣ6>"Zkydžj-7Q:1f)֪QqP<46t$ 6tkki]3o@~j_gC!&k~E'Ǻ*S:rF*U|o|v[aI!8W-!JZ'SFpmfi|#֪l+6aYAB%k%<\Pɨ9 ҔL[w%0+ ]%{y83H;wh v=,tw$=*Mv!gga=,mF* klcJy!}Y^T5TN^-*Ȣ*D4Üc[f[ge :E" pwq0:&P,հ|.iUwrã_Y=0trtjj(qeX$c,Vx ALD۸;Bv$x?nϓBHrA0VeOESR$5"[m\> %r8Ŝ >lqT2.ukF'̭#6MGF R9EE{X"(؊;?=xF<+wԤ*T=b_٩{}>y;,`,9!Q;Ʊu,^2s J 1#EuugcB;x,+4 jbԄ9g&(ޒB$&L`dUd18qJ>]tu&`M qc]W53#-`ݐgK"rt`dW ت[ 1al~XGL՛}5JSJGl=ElBDƱ 2 k(be>u$|W%fy2`ؠ9#i'za}F-.e\s*(Ȑrhzd={UPZ\SPZI"JE/D))w8ܫJ?z|~~ׯ_:+~ }ֵgݸ;zB:hQ|LЧ6 Yد],snoN÷htwz7N9om5uzU66Q$WγTH*L.b3&ˌ&cJgeϙt ,adG[ȟ(13?悄lO*5i>{ Y"ȑX g4g&ߧT!Pֶج-Y5xlS9WҤBKYTm.8aȗ3`(wҍs#r֫1jU`T"H z-늉)9ߪ,L=_m:9qo;J'%Q0u%nO3'OO23`Bԉ1t[ZH]q[n7,ev $*HzZE)yb32l00ٸΌupʩLJfK.{KNO2C!=3&3#urցne~45MaUE1gtď6P=Ѹ1aM?YԬ_ 39<4?Afl g4?N1?`0'-%̗T6JT7?@P!`GASd5¼̩D8i +@@W-'AQg&dr&IPbKSh9gh/3%pHyMN38i` &Q}Yt(ֲ@;nwwܗˏ7$?P0&fg ɱQYd 5$M βɏEmA+X!j\`wգFcOP)}1 kH{CضQbF٣lv*3݌PuFUz%'dkƙncl#i' RM4#]j?m@GdN9gy``J+ uAY~hr[Q" PV?׿u]1])\[A 3sQ IDATd&`ӔP;朐iSjZH`֐t:8lXԨ|Wp7\kEYVrIźް;;nVΘYHU_& bSN`r{ꢢhZx5ҿ;ttmhzҁ]:,Cn6KK]"ZxW F*1mVpmhըhci!T%W,X}NRz'wZ Rt9:@Jȩ<\_3{6.Mm!cNtS j\d=t[ 0aP ^A2Ly}ȨFeE+>˲`YV,eE-3G.rYϟ?O">*_})Uu;n{L'iSpnL}q'V$UPoQ9lCy6pe>LH;߸oˌ.29A"%yl 3*r] DUT+ 0Ur5MxK y<Ѧ L3-  jT꾎pFvOlN)Y:p݌.uY~}UvZEf.=1TU3cRlĞ VLD}-ކߝFcӌ?ZhU*J]()~Mh<"PBPZ)$i)T8yŇxrRl8i 7FjD!hQᘆUMa^]Ȗ4sp)S $ȭp; {_1{VKІNAW^Y+Qyqkf眱XRrGSU, T"uC. ֥v[kɫn=u"7C15l~' fg\t,ՌY0BƟO+W3D8n),XXc;h-T3\1%yh$09KGHTuFc*ӰvYJERv<ϘSuf3f#/ Ә]8BzcASoDWaY5V孥ifк[(q}|zw]"=&H8,bXȫWd,O?NCRK FnQn.m}M*4P*iUi;p{s=UGF\a3ڠ؋ 8s?j U.zQV'l,ڡ}p-9&}w$T{Bݷ[ceu]&hN=k&cm]g w<+N: fl;X)O7=v:A?ns¯ggvd [oͿ9g U2C-wX~P]pa$df3*R<b%@E͈ȔPսoZ ;T8 s)6CfT mPpBm|QhX= *nʾ %QPM96̦PN)xJɪI(vy dR J P'?X,2erŖS].RIOAr+Kg68L"Cc o=y"3~gr? & Ęej(uOb MπsCm7/oK_; k^;O6QkEŁ)2wLeX\Gl:s%B΁VK ++?KnJ~~~7u4]|N%2@j"tѝ>"XZ*UYw3(.UfDsJ'iL{q{z@cKؙ HUxqnl|rO5m-U XVV,?翁sϷ+~̓G]m$JjBn\R^C˺ܱ VWas²)* H]A1$}$ܠNގ"'):mph]7/.VJEUuH«)[B֥b-wk 0\WiB] J[< /q08}c$M^kjrkȱ~ˁ$8ًth%=BPTVB> QpٌzF'v`d +f%2n3hQ{]  uƺeâuwh)^ԹppB1 o0.q179("8j5CW>Lp_8Lr3YQR`v*N*.8a߻5Sx9)nAv%X} R]x Fo2lt4.XaIng2 x5mA i0qA$yS6f$!M3 =Ά#FwVx-6*5tSBX11bF}Џ;eFykBi08![LCIqi*(*dxnd`YP?ޱ~_`)`k2PRLFi fKD_nx|Dz.̉2;I)eCڰZ{114'^-i~RSU3z0`lo -gE$^JYCT\YUXH+SȂ,@ ?~[u)nAmdM)y,  4hI̴?&vvhR3ܪ B8{+@"(UEYPC΍J#Eŕ@zAP U`äPV-҄Ĺ[ZZ" zmptm\.FWLTiSL!˜(*R)A4ع&ZH|pn0sF gU {DfdfL7QAU6U0% 1`ήD a-dA[x*%FyFظa<͘kR`^``,{S(ٮ4`FѸO?PfƔh3dJBxJC5gE1oօa.,c/D@Տ}e]6譭]y23g#<2 8ʼj7q?S5HY³g H*laY>`w_.9m0%v";?\N躮2QY1g%pF4PcQK- li 4{B)NE-|hm+9X;@EG.N>.^=5C4o53Veܠ(A#꺠JtʩgVNhԱzt;[<O~["h'jkG,T_$*R"13kݏڬ(ʹz;G7_j5G{#tZd3767n`=hU꘹vutdR.YN)(]MUCl\fa&Eg\! OBCd*H%DHUP~ } *L3 ~b,̠vsB#z;6ĮD(ed;LRކ26{o'y&}j{$}ܬ8k13yyla/_viP~?mn}`ITo%)`)QpV&bN FYo//zCҊ:OC#.-߉So.+BF.Ѧose_`؞6L''~"DY҆EsLTrA cCZ!ȭn J:9klb4l͊N4k'.⿎PyCke۞yT;F_bcZo-:v[C0L>􄑢W @rb^MNbĨ䰁պAުw{-55ZE uCM@4FN[5y]Zs sݢC ^)g*܍/^eF>nHE$k_B [(qΪ{Q7f]2S13Ȝ#7J9Nۊ}A3)(rbŌ̾sR+߬ ܝ@: L)OSa<[Gn@b2祙ź,V6qϽBЯ EJ7{bq̒W ]P]k-"W< nM ,RBXw" 9;8Uye(afkD[9 8[me[<> V|Ckn)] b|VNN13wJ (v5YǙp7c#̏==摞fN%D>'?&6?ti@)X=}Voo8槰zgkݰ">:*D(u>$,#$ob+ؼo.&t#:2XNi$6E(uO}(11aM=<{Vꁨj>U>=B)luԐx $ZtaxV@;ܱ?+yv yJ\pc (iZAQZ}~SSvW V)۠oR0U E5CmX`<{r\+,VY,QˊZueYP){Է9cfouC[Ά^97 (FE|/U FEW9;zZa»=[z|[F>j1_ibfXZݞƄ٫6w8{IM(TGB^]fDE*D|ڻsM C m؞y"oܜӖoMԱC:L];UV6[(lsc49i p9ԉR'IU1jLm,&jϊY!k-(*hWh- 𵏒F_+ZnFyqwd⾜h~I9A+O/$ Σ>(g=!xeȺbAu ˌyNb"Msog ;Z]3ZP_. e@%6 ?L^]#Ey4MbLF:7yfQ-R,|@jƆ1 hݔ"E)ա,[;z]k1|r=kqPCBՇM>PrU+Hs-;xF*_8a 7ρԔ)mcuZII|*;bt5!A[Ǩ kX|%`jfwĻ>tw"r,Ouگ jˢ`5j13+K:v*64`5GaEqR6m єם4)ϘV@ [ڡ[g;uVq=?"m̘M[Ӑn> i2w7 >iz^ˁ*qSsngͦ}+13vQ8ډFQ7ȸ=|ÐLZoXoԳ|`.7LdL1֪1Mso(P+~w\Qn7{*19zX9_bB0lD ~]e)M?p߸[RvɘSQ 4vbGY$e 妜#N0냸0d @պٺ@J@1 rJ ^9̺+\̴K>*HJ9C'ĸQg VԢȗma(0o-stg+-oT1 jƃ%N4{Pޟh/+pxݾ `?Բ*ClJ*f? )f6&j_xc:ᚽB!FIBZrZ<$wl]ȁ`^EJsJU~".j @7BKX=)*USkME֡ UD0KX0(FUܳ0X׊O??~V* ZU `b$0 BœvTHW_#ooA4$&S( 4soR˾ Td۞Z%lLL, a)Q F:ZSj-RmLmR~@o=N,62uukDbgմo6aF7*QM_e3rB$[g$c(3#qC(iURvm`nW2Ȟd)%1 ^7Uh=nXzJc$g]L| wR:ng1 "q O[f@ǦVWXX?~a} l+~䄷0`F@cnJ}sqk?*=r52 { yu:TDJF3<v!)"cYZT7=Jөm6 (n;>>n7n|cYlNf|Jr映(y,U BIhTQTpZ+ &>3uaU}SʊQ̫ZjHG:BMbfF6uUW}Cf~8 WyKlĖ}Dd^PY:(2I3ѭo&тGZCep=Mۼ[+G)qLluD1)RlQ᪇jd]m[Nep aWsz4xK雞DWC&ꕦ9%Vk'{m5yX)WvOtqM_K+w,*U&6DY=^UuK/MxLXpzѯ?JP5ҊĊ f7RdÕg\HbsASFy)xDJS@wj5r8)%g|uUQRY.Zsݔ>U BjP$TU}]p `UC1M )eXb50Iuw j٪@1T-.`H rG fIF(ZPԩ0A$԰uQC2 qClc 񭣂|0DLuoPZOA[w_6W V Tr;KVf"{{6z6aE> ٷJ5ʖ2 ^'1;8Н7T"HU5U sSAC1mfmQU0A,mskYiֵB$>ccKv(|TSھ\j 'Y[;$ËzaS :qY}"}zx8SmуO+l'MoV**X.(_(`p)!q?Y;0ݙ^u|w~kGfbDPq-=4ı03Ω'Ob'LU wn-8Ek Rv9Pk>~e` -u~M 1o?_nB/0CL  ?޽I<"3dw3w5۵ $Z#̈")6uʌ)2VDeLQD-"8j3INǜU6R$EP{F&"1Z]ffi M#"[.)?&apts1{S~B]]31Cjx!gzJCQn 5 @BdU$mWGNvٌJ=,0mڋD]k0wqѦ  @@ Lmmd3n"oSJU. '.}V)3ZP[L{/eٮբ%'| k++W,g#tb`Am#RŲgg-@`S]NljTj<{Nn$(h8+Ur^/LFWɽb#jMXԞe0.‡۔ՈYU|3lI𹮨bBHCl)+(޽C%U\M(&?HD@g4kݡnٔl+l~F3ΓuX5[g1g@h(u71͉ (d0tzD[f!6wB@xQ;h'6B͍*+wxIY!z'APZ'_⢢Oπ!D"H}>3 BX p, ,Jf*Wѣ7y?Z -9؃}!hmy^=5B-=D*UEtIRR2>}ԝb|YNx07tݨwrVZ OZ;WocZԭqH1Q@ 0=b3nuڡָ0R=ƿFԠf0AXK.x3.9cEZ\_ٍԟA͌6?kծtZ=j;Hlf(̚I7N kum2p۶vUXom,H+ l9pj"x|jfn5 ೛6en,Bojaq1dme] u iWe4TKEj>O=KXAaC4V U")K<̏ 8FDb(NNv !1cB)bXHJƏm"6d'd!aJ 7HU@hv"AR+Wlm"fl^Qu@~E)nؔk-L=bkK - 5P ,dyUjLyLR##eŵf\ ޟ@4+P*a鶁H֎(ts;Ʈ*Zb!z^s?6W5TDlvf6N'[ ) )eh5F*T*"{̯؄(8ĝ*6h9:@Nձ4])4b"I#@zCN=Rxr^5.SDHK-Tk8hU+ledmF!bcU'TA )Xק{}="*GY.2y# &'gť*.qY4dy9!BAXXk:E [zO[|9!! ܶu="#:)y(*ኘH@jQ- xT'gcϾ^h' @ھ]h@UYaԁrKeE^qGDt@(>oQޚ%J*-x[9[B=X(%%H1}d:\HAcbEba=&;LrEY6Npp#E yD&]ӭ.vYunoTSZ q"`p+>~-T}F3T2J5?dhO^5) `E7AŗeϿbڵ"!V@XU6k)\PPBD C9#Δ+X/X֊(fTL%ћcp+I \elhER0 J{zUbnZ{ؒa oޡi~ k;4Jkp @ZгZnhshR>o3*TbՊuqWˊ|l*llFşOuu!rߟ,X2q0uރͫeVkfKv|VYoE:HQu-2|JT|4wF5[>ْ&z{h~o֬Hִ tW6 |* )y>c}>czMTp >W*%c|ժ$RY"L xG˒lL}y(xxltf{&Ѧ$nR$hMUQ6[u$xjhW*q͂K^r]q-+RԂ N 8#SD/ᳫJu(1XVe^q^g9f\*(E #{#mQx5CM)=mjke{B-L,gUnb'Q%P2 "dt6:iZ2dfP4zL R&z{C)h?{[ E7bnͭ{.@5e˧ IDATci㦝(Z1 wGB${Tιǭ51P{>j6`.U1`-;X!8^nM T"RVF-Ə57׬x|osUW%,d@&bS%h) u]{El5f2mf;ļ'?oq:lPk_FO[a;xs ?95H6ti,_eYaD_#Ư{m~lxpTn0 lvYU2^%%{h^yi2to18FhXHcr3Ͽtp䈉m` R j^\\Pw7&nfD&D' qJ1tSv5 aJl p,ːBhK; y'ћy:ҭG,q oٺJ.`u޼fWK"/˂`.f &h@L)BB1JD`6>cfT?!Y~oEؘu*lhaN-\ Ur7zs8~>XfX²V[=-"T2Md]Q{ lk!KALv-(*9l6!v ^ee;1gvY];_Hk3uY[S_K]mH]=T5}n*"cqE28%EG`:EGJAŔT +p.82iY2-V5{ѡr(5-Fqzs`KAYR"4Ç?}Nml1fܿnC-Q}%k8\Wnٔ7OQEW}r7m qoMK>s *u'#:B :VJsA+* T]6KYB \mL!$A:.D6dQ>TF) HDZʒmUgnR)\qY23>WXBf҆ٲwd`*՟z-:$4_vO0$RFQKZ+@J;&*U#J"7 u{E0y %Z1j?΀XIݯTB>{dWh ?[EoZu?̔=PhI/?zk;hh i_ߍ^r{qEu+&dZ ) %˝elY7y[||>3K-e.dZqUFF@Z1FTla데d(²h=ӝ z͛אa6ܔ#|p8]no|o4˲xgdXVHn0 tv{EsCrȰV7M{0pK%jys67-Cv; [/wͯVaa#RGyFMj!ZsT'&YBH]@?K78Qs) y8+n0_櫓|j.먿jG2c`}yLj-O(W'e\+s%u#$T ^%QC Y+e cȶp)@d節_ȴ^KY]?4k ɲ+kť4%MD%k@ǮmaŮ*,?/zgJ )H@ܸ^<,/|z5cd$!!Nw34ql&)z4Cgbrd;8<)Ϗ}I>k׼g<ϛ~7큞:ylLa6K #lX7W*V[O? k,FFLU6-HvzO@g"Rq)/i-xWv]qY (P~4tIgJSMEjsYoO]N*&B(UQIe&)bbA 6_24t\S ߾~-~o>|#+~O?r>"jN&}m"qk5:sA"0kUyiS0+=NĈѪRW݌R߈>Ư`a )gݖӼ)BV >VhHTƃj|:e˚VMpS[u}D*V. ܮׂ󌏗(VN(~1`¦mp tf-R5T֢(¾s# >|7|o7|wt:ro~ ?G \?314!}S:Ǧ4sU[_{OvmoE^Bo̓|S'^oA>'l;Fy-FY|dcvbcn1&7O|aF7s~.eKd辋JUGͫܕ.AjJn }Rq] \ 2BH#j t|}PhfR鳼D1Waڜ̷ 0;gXq(k+Bl"tXj!F5X YJ p!QH4A%%)DkwivyIf{؁c/gܩ~6;cubb*˦ȴP[!GmkF[xgolD[JL}[ 㵶j;T%04!Ʌ{M)Klg6ކ]E(PXQbDaƪKGp<"N4= Opu+CtH''88猲.Xg49g,yL4&OD׫Io?W_}}E|/ӟ??'?ycD4S(5;30omsi= Ɗކ*l- )i7m߇_פ9~=G1RDߺ=7xXOw63|Ah,3gD5w ua?T"Yԗ6WLfMf@&wJff0[9wN6 >|GDGbio[6y-׌Og􌟟q] 42mSlɭu32}WfI <)~Mx _sjL6s{Ϭ'9c&Č $FR2G-.Ѥ:XłHF 倀 0CЌu<?UԍOڪ ˆ<2{G?l2B @"mm}UҟYi] fhlh5(vvߧ 7v41aߛnO9Wk6H!&<>(n XTgqx aU{Dd5O:@y!P%g9 wDekGעXeEi7_0#B$_Ǐ__:+C$0]m\]6%"ݵ6UڛDt+Wuk'dOYϱ(xXDH)N"CQ/v ;{5;A<|ی;*'Ϳ֎! \OԢc>??Alƪu֌D)b E4Z"z+P#ȕcQT,J uӾPeW}^͛U4 C6hϚg@kYȵyYϗ+kb@:}VPqU,e^g:ƯHկ~K)p89apv,m@ U+q>s RBQ&VbYHt@ qB?1FP5!Dc%'_jl'ڀk3'޸*jUd5TU`R7rJBͮ&ѾOw8uxO$>j5jLS_>e?>0¡ <.3dH͈j)0a iJ} L@cQL΅1%?&ɰ",$`U$kV/)D8Y G$` Iڳ}Xh|B]! E؟`^||~ok.PYc x ) iv *0YRόcyhÃoSr޴; Nwvt&n g\{: fƐ5.njM}9a- #52vd0”uz17O,.k`Kz|6NGBO2VEXg8a̠{: Pc6f·˞O*qxVBi"\}dJ~ 6vs$WUh: 3 P(B҄»xx|@:= F lM<jmӦ,jfd%Rz+^,zFS1>"/)yYq~~^믿o׿t:<=ؽ-p6<)k{WgR-md1 pfAyzZBwV+ky :v&z6\^ K޵{m$,r ʫT0"B $L1d VTxpE'͖\広X#Ch@\Fx.Ll{756S 2|/3֜C0t4Z@Q!hcSŸrLy,ndZ@ds޶a/ V;a O쿞yWDm_qx ӫ7@<2UwStgAd zu7 m1 _"l\ŵ~v4 ~xR+vi$ieңRR`cKc ml1Nb5$wWgkvZ-VTr5nJ~Mɬ",չUE"„(J»8#{Ç1= q: CWwۼmƪLJ!'ŕ7uRmyHWiIW)g|7 /3j-8N]nj$6BJv[G9|&وHv\t%EǏd/,oz*Jfež|Jp;Fǔ T3@2Ti.sTyzKG1A.ni?Șwp4A\[Zl^SQZG|Ӻ+\DBAW %<_3*gR0ƻLR<6* #CZ{`#%3#+:@<9 q:Wh{!TR B ei1MHpg̔b(*l%񍡊^7=3aݬ ~HV>tK)J#='} P{e|t)CheaʪҠfWhVV鶟-AĞf Vu6U6g)AU-62c8MRm ]X1W_pz@<>;;N-Z%o>֦R+&vשz[ёAˁ;#)n$mvu]~G\^θ\.6LQJ~w{8}Ӫv8CSbX+."Ӻ3t-Q\ NMSzAnQf(L1'F('[\*(x'@iy)NC kEm2HR0PUT~ZK\],V{ 8[0lcU,^_0|@PVD8lJnM+/=DdL6vr6^:Moh\ hBꋢU3crۡKP6爪n,6T c妰Hd)u#RkOogE% €r|@5_!x:$D,` _SxN- IDATGDT[]JWR+կ)`xYt4HSbZvXX<$A6M}_?ryE  K; &!MykOZ;eaaו}kczoRlŤWDK֘W|x:j{ *2c>?#__e\)=!!q &i&fEObحhiC&|RUݼma1*"Rwps~ggG,x||7?G=֪ݔSx8_AX>lȷVZUWލLv*Աl6  f-dw*~5C{~tF*B$V'AmHmGլ:N) ZJfs+@ LW.yϸ.+ZR 5PɲkUe>#|y|#~g\W\.WmTiꔯf?8 ~8F5˷΂BOWf_?ϖ".ˌ\ eŲ,8N2QTvR tw] il;0sc3VFT3?U}*sm޾ {;5¼$$ ʼ`9_eEdqYZ筥v`mVnL6kO5Hvve#>q}1B =BK;׊R!h4 =eYq:qL?Bu^T!-Zrz ,ǭM Fe1牶b[E1xB:~ P`pPP" (2jn[f&bS[bm W]ldkn纝}*N=@܌!,!1gXaZ&oד1^~EoA3j7ݍ2qg$ 9fYn 䡆^3L00vSsŋD^0% Bd8o˲/`YeYA0S4cu164MMUL61$s*%F#!a(PԲW6RϸƃmhWaJmjhk_߽{vɢDR˲ C"fKuQC[E,geN=\3w bM[[uB||K%-jSI)oyo1nk+߇߾{-f{tmhAθ>?!_fPk0&():r12ȅ*܉ƑtT.UXyC<s;A TktFa`M,ȡ!q:UA0EcYWk*@N乞z">PELLyght'm[[/% G }vԊzɮj;I3HPDR"a#Ԁ+"ZƗ*Մdg@2J&تڼ(’6fB0թMTI 37poV&**~3_;_MuuZC2r땛&9a ю%dT +aɊRqQ/s\׌k.*^6Sjt.tvh, Aܿ8* wi#crkgu븎[hzxni?ͳϲ8F[&A8 nҗڤc{q#YheNnW^gce@>{YZ0Qwp-@=;' dY0<,3&g Sp8qLى*fyxu݆bq~׷Z u0Ntjmd'V*.gog>K1 )%-j"(n>S!~?$nwuϞ0F|on5A@AR@F@l6l7,sYY< ZŸXGQ[ k 1JR + E@Sꪝ+e$bSeڂL/y)c޴D˦uT_ZULJQۘ5}.wEw;Y_vgP ЮOEMӺlz*k.eт{\}ӈThۂ"m?W邥V]_Bdy㔼k@0 {v6shT`sJU(WӬ7L4yIim}*ذwJjGR+3"H,lkAU~j'BUo[oT?T Uv~2^5"׌ryz9y"qNEd{bֹ! -d`>-Cn>n[{]ڑ|[;4z,=`:ƈUcf.Q݆rf@>1!"B4MUAŴVψhت{͏LHJB@AV{H ina- ̌qo1"@ت,U 1rA\W;`CI1BjS|Am uk9s)sm`B*|:a8鴃{G s ^mH6Jڨ͹~m#@N'BH]=Tψ4[QKUXexY _/ ^f,pBѪ7ےع47`IJ3i␙fsHJ/iqQb0PeC{C %A+*2:>ˈ 7J͸vɪD* Ƨ)Y;:|aǯ1QSߑs?Vrdbݚ0kM>-Q|ߣQrɏ~*YNoߏApڇ1g ϳ"`y{E[HZ1 9o4u6lbʡRD tȐa;b`yra %q2wuAv!AU2٪y<.l :򅨳^ LBFgLl?J&Ld/mz][YnJĐiOc!! z,IQn-^V"&~6RsYz|FMO۷d) [n D1̹Uvr(}t^<=V9֓ҎȆxݑD-zqan-^;QվRJx>x|(CƠiwB,MjEfUOpX3(gNV amMꞙABڪ`)[iXK"u× ~mŗK()DĠ&hҐ9_cn^eH~v񾂈@ifcVA;3F~/q)wc,)%V|G̎3F/%p ۴]Z_" UKƏR:~+x9lT;G6%ƍhȣzG#ٻ1+rĉqγS`_b'M>.)+FN.hv+zxU9C~]6^ /(U*9B6r=b`; nnb}~F+pV\W\nWG۪Ov~{(>y }ڱ'o ق ܃f4^1'WTHv=`Jk(m"槓=GrJ}%jGnҰVŭ4\˺Z~{y2Z"J+x:<|] =]h<ǭ^so2P4v{b>#vd"=oc 7gv20?^5;͏sUtmy( vqzbA3d?̿\N H'ppLHprƂAZJq:G-VU/w=VHNXo\ɂˢ(9/B"]i'¨HAR9sFfy<Ӌ1.e=t/N ߙ}E#\03Ta#M֡K2qGM eHHDZYr=)p=w-hPixz>~O XWXŽHKW~@H"?ek.7|{}Az}[Y wHv̗i*^{V5L<{k.C_B}]ajA}Qvr/>JU]6ovnG2{>{ ➁l_W un# eݰް]p҆)L'i*Y='2뇈)ME1!QE,du{8d&k@ߓ!'Ř33yZK{$/jvَmՊVd̔fP;))4[D2ABF(=GҚRi2sf k-~@Z+HȞGL\Yrkr]=yوI<) hlbS$4IiV؈Pςy>پ3XW`Y׾`Dj8XD,Sn&ae![W>4c7~a$h=u(<]Ǡ2jmW(G_`k4'!d|ziv5g\?f6#bݴXѪUP`rm[mxY6_^)PAhy2 jvQB.<Ԃ z$nO!p4[ogiПv@DOi<C9K}nԟ3ъ̾6@zޝ5[Fnڐ![cg!0h`x_Ў>ʑ!j}WcA'i R胜RѩG+L{N; 82"Ť`;rY t,{NNq'nW/ ư5S j]ϪTVz\ ^X*4F1.)ꈴ- Ly-4F2R&M^CɋaryBR; | US[,dO6Y"VP#p;֤wH) fQmL,v'+,a/ P453s&T̳:OپvRihB cTPSZCr(z=(Ⲽ"VT@cuS#s6]4rΦ%4;SK^!JHC\Fg*)aBxOMj*lb)g<<uH¦v̜HUlܽlxmx^ւׯr]Z, ӄ" BPV{-qDZ^CQ@D<S#~7bir֮Ƹu_d_%5 Cc2',m#n}mi>Li JS ֐%g'-OhF E3 A )[ҚMMZIk۹SyYNvxlx[<-˻?x:ZPQT nUCh7ʞ```\ klkj ҆-,r=YWa4G/42-l}7Dsc|kvs2PJE>[6E\.XCwCNH@).MegYH=BQ!$O2Ҕ{QXd[FS392@o dȴS̊@5[ON϶PJ52R,w:nզ )!f* Ҁ4Op渉qbJG A4.0#U|X{+mϏZ+ny IDATjlW˟TedAϥ4$ VV;?2)Wg LP{яrgq@:6${*840NNP%C3$hvK#wn` |',&d2PU6?g@`UX7lL)&;ؕ=LsPʀ.d `]ZkVjW <9PpxlY&_>=??lBW w4Bb*oimФxل OOO8OHd!Ϝ J@+vQVA64ÿcY+km)^|_ ~\_.x oޓ|pB'ns!ϹӕC1jD\&ŢhLcR8=Doba`]W򾢉;ߟdzOdǕȕ*)" vupLݫw[G['cMG"wxjr-(%ec2l~ QWXnV'W]"r,8&!4&w;V!6 xz޽O! ѥ eD ۡ|^Hhik e-XJVjY3~)<:5qec+BN*ZٰAՂKmrY_^ Qmd?.nTϱy4cP.n#( ؝l-93bǃ;qFJU'>r:wLPPI$Ϻ±|ԁ8}|T\-!m3vyj1uXlHjn&Ŕ'<3gcL*jzJCy/aY69-R'8PuR7ZS 3(;9e$=aE8.Vc6!NLƟu#Xp J< !PW*oauqwFjxjn~gDGpQ\~gC<4f&N"`\-L?ƫ$Dž]SIEdeէ>}dN[E@aX0ܸQE F7ev֖U.WҌV _ksj=\ SQtaLHԗЩdRV&DlԹrsDԥF}G$<^ks„kYM9*j䢞dgLl1?9VuCfU"ayo}oW|-UōLѪ Aa/46,ᵌ&wؠwGgAɏ¡g"g:~+}-fl F{SI6tcr=X$:tDžF8/}i!HG)+}bpgM2 ^YQi} @6=MDt3*(7' i ݩB5E.4c.;Hz1gVuoemd{9L1meQ=%{phuh:{.#Uiy~xJS/U>mWL q-ulvw ?Z;壯οg[`$B[AٌR JL6K4Bq"~;?daQx*]jH;:L˰csF ^պ Tv٫1oo`mxX3>v] ӔEp;onİLn~5ZRvSȳ}wDT㵆 Vᙑ HdRoڐy8D{u[1O[w]W|{yW8gd'PѲFPuAў>] MmW3wT # g\BKR1#DZV,ye~gשEb55bnض 4Ti 6M^ ^/ EA7؎Zb;!R-w46H;Dw1a}cQ.OOg,'Y1e k{8\Cc;^r׸e[;ҿu]M:}NS {]WgpJ[<NgLZ@Ppo3;y'|qTC}lr=H཯cG#珊-퉡zmYQn f{;bBJ^]U{iEݣ}17+^=!d;_'ΕL>: Gخ!@B}TfX0C\6ޟ#"btp\ *7[4u߅ײy ۈ N3-{4){p2Rl0{&F0_ɺ:QN:#5*3Quˊ߾o ]DyĂD42^¡x4+G);2 QNƃӣrcRJg+lA enwX J6"ِNvq9AxƦ .|}RKK(m DHGP a& 22׆-U">36q$1YG4LӄVљ0x鎍y[Z{'X!9xqz{OOO{{t{؝CGہ!G3?*7$;_byxr?(XʊuBʊԚ)̦›sw{hBS~0-A;|ZЬ DMdpCsf r~OW'оͻHَ. w>\@ڸ!qq`VOѰ4 xDO I4^oi/#⫀sLUĞ֩ǤeˆgH%0fX3 xծd7{Ds3?Um[ШjUUpf+SV@k0I/0͒_J){rGDz |w]{DUii^=UL*4XZOx:S;m[k0q2 ߿|×ˊE`I;]6hfB]#mq.]i(2u~EӰ<5,#5hY!"(c5R]h?n-~aӢH8>CZSkR>֐rB{=bzȮɞ{x?*ju܅}I+^)j.G}%`jYP.&`smN.*H8E˵!i9tDj,[Ж#ƋqDd!qySkvU)"~Cģ.zН`;22 n;zgo8 ufa&-!b"{\Y*b!q!c;wqnI\h(61[@:]PœōE#,&̻8gI߽"-6֌t\7o%OtrœfJ ^ =(*"߁*a|}oi9$Fk#&c:eY:@#OfWe朻)GhEAs i>a6^ ~~MP󄵆l V!܀͋Q̒qX L c?E{m% xO1eZiHt~z_#PTRw0<>vGǣ|Sfޜ<3uEJ ^@ݻi{'NKCC }Ng_ǢI?ǟhWGnV$$Rh]Qn7T"ZD)yi1S664HC+]( b0U@Aq` :!g0*[6L/ێ%EƴH7MT]6x5b;ϕj[@zAv`juDY(eux7~4utVҀx.;u v&p.c Š -@l%|n=>f2C ML#Q/ޥO.H's{Jk;*vQ^{9'4fTQ\/o+~+~k 2$tEp(]./"t"" =ptK Gi@HaJǔ%4`IQ!AQbE|̲n8`{$uM%?K`CLRgٺ\Z,7+pzQ4!0UnG*?RSYJv&iBmhbp<X3WLգL~8J Flmi`֊WAdos!I`7o!}wk>O3;V ^`&!C~t{4>C\(GEwGQ5t[]on7H<`4r݇8dONHPoFJwgu΃\ev@| mT=^K?Oa'\T4Q;cM_m>nB"H@Ku7l)6SҰm*>Q#5:b"^,)Q_#Y,P]z(1'_X7qV鞹ڇy~]{ZS9>=hңRڍJ@-f7*Y*c)]/WV-1Z<Ʋ@ߖPτҀIYrSHs1\!]$}'܋LlVSV˜f9^H "< @2ti<x 5U8> ))Oh`xY~y;^ //NdiJ{8Ceվt#  EyZ>0q, ] @KL>DZEJlE)AMJB=CG74eW_LkA] <~DžG6Y[}X W.u0(Ƚd>"c_A" >#h?SOj”edq#|1dK)ev[ a.F3>(0jw(]4AԒW1лPZ75Nʣd &uuBeY`'48'%^ ˲ /WVP J'T/41jqJN g;254O.0bו\ZCj “=h<|[P wH=;*慄6h55t&L8tVP64Kf9N6ڌ ^ |߿|ů &M!I. Ќd&s!Ǝ::2"4&4DDրjxPH:iG#0n Aݙ-%;$}tש[pW"_{eݶs?~SOp90'>WtcSf@luc t%RbLyBM3ԒT|]kŲ^,KoooXgz%w&ea2Γ%`GP-Oc }@|Dۋv~zDC#1F6KH ʲ)9g=ѐH 7&+o_ ,,IR IDATm39gdQ|P%VTm>v3u9م9!P))PϘ4df68R:?o@Hֺ_`SѰ"e~ gRA<XyjfA [jbų~pK7ܶmi6OXѾ(g2BHЊ}u]-c@ӌ+1-yزA(8OI HLoZ U"B-Ix͐ۈSGd>7(V.[,ض'Hf`7ҫa;'̧ ׵F)3㔟@Z!u2R"#5)ySO~ %"P_Wv^m 4mVe0A1N(q}"̧Lb{:Eyk𯯯_~o_mli/JqF!Ju[L+٬FlA׸;r`&!艔|La=e6">*=N&QE=??¼<'LyBI3uS^.W1J3'Q lP20&θ'Yk-viЊmCU\2FrR0miX+N>Y*n|E.)cN3jR?g+8'0fШulJsZ}_kv|O_+8MC*#xOJ0yu Afnm6elX!s_,L.y?;f*Rk-/q2T'A;4H;PYGN&9M6j9(E˒asXDxEdc$ԝtC&O^PߌSUr]&ILV${ƄF]kE-rry/QF 1tg>}䈀QE%fPN\2ҏѹP$=%ttt!.߿7R{Ś La+v&+ :1D]Ȩ,7& B@U?UQJ+ -Uݽu*EV+q3Z6 q~'`;8Y&+/ۊZZ/[mo7xzD..v[{ŞڧKpY (υUtF3qdw%k(Ns>6}pG.);zl@`ƒɹ3˺vF>q lnPӮM>3.x6ԑ9egb, ۶Bv|wZ<83Vn_5<!6-R_͢ph-^,|ѡʹ/2~tG14RmkuJ9T]јcE xd/?Ʉ*McyF IQDպ7lj=&Ǜ3r*h#' %F!~b[K k1f*4?qu0lV( ju[M]+*UL1 ?$ōUy MC!5Tnrŷ/pXʺ4=TtKOB1}~}fFhkbNc*jE&sL=I{ t50 AP %=]b\SzQ3%Oa>i>x6LӴ9bA{m.;wK[qN/#I^0`B/⫉ ͕;>?7ϻZ莞2h@.eL{kǏ)$ēo ;'o2a] mܠۂ)j#& '<%rB7͙nN9i}K1An+IXKU&*FBꘫmj;Q;0_.o4Bix-6E0 <uXƇ:?!ڋʐNhbn&E@k)m Mٗ9%glqmȜ13NH [mBED(v,> aMzr\q..X6< Ӯ{>ǼN}d fҾ^pI|ɂ݂eNyߑRsAc9@̼#- M&颖 [Z 궡x, mjE۬ƭ/n声f[ 1DgcI:PO"+ 1Z1Egي4hz"F\.92aaPE |o߾ay:džN5 O]J&[مa>+يvknQ41&T(6i]:!CM^1xuu(((`v-bS-VW_$6FtB&`B)  dF%*ۆ ~~yŷek0 Ew엋=dPرû'ބy"*l~su{G@?Q_#d SJ)]4=U{Nl7w>;R1v_G 4Myzz2Su]#>GCz"#Gٙ# xYCøug9KQFS6傶^0I)6frp1]Ms?hr>FaYD+lƀO}* rȴx\<4ϧߎS|; ֿR5-n{7*(ń;۶^\uk褺Es)iA?f=S`kIظ1J|)+FYgvDX+B?QۨBGǷۂۺzU밵=5 :^D:XMiqZ>^},Uq3VZLpJو8a鈸Vl1SS ԋ1~5ޏkQ8'([I2>Hdښ/1] avRz:Gs=|Fg0” Nm^^^'<aJ: m!/5kH/㘕&+Ls28}k >l=Du5LvR 0? CPPOuaUk n5|T{ϟqŀ%Em?yw(:`9D6B n30mN:L읫Y=.)G=v Sc ?86O TL 󁾧$?QZ$.Be` 1"58~)ػy)Sg6ƛ4%Hy0M lyi20;4~I ekDh,Hbχv6Z(a>gfМprG2 Gjw2R3bw62a-ۆW\.x-6RCEmWqLAcٚ# 4̲azɑt:Ֆîhd.b)'61{ NPtB} /ͣG4]b7˽COĺAȸ/nik) CX{f>X@3`ᬘǎ/98%+W+6L HP yƜ388LN@q;吜F`0"n>۞muXNS3ypAEN%>t "b/bK i{`6f&kBM3RJ|B~(˼s1IV l軵 Pu"4!ٳ=:GQVgsnLIʊض۲r7\j* |Û (#3^.rr<mP6pi Z@QlO <ݨ4gh:h>|tMm/fmo{6S@)N+D%T7ϙ Q$#T_߿_.zmx[2-71F2yBiIM`a(Zu O`n}ldیz~6dzзt]@SJh}>?u*gO?c-*nO>D"Ɣ)˗ mۊsKe驏eb7A:^b%+R1ϓ)}lzrRdZZ+\2])ۭ[DTooon^k>Q8CUmJV}S7у=:y_;\|@@[! (+fV`h1e)I P0p`Ƨ9Mq>Ø̘NGt07jྵVcG  wQ8Ӕ c$Ӕp:%>onI[`sD:ya6nMxihyꔬSeV6`M610`+c8q0!)a+9eYЖFZ&d( RA8ɺ^ڕ3! ծF,Z~aS&iweZ&0y" #߫ F⼫7;+St 43T{B-䀕MՊʊh|]?~?_ۭ2 P x]g]21ّCBWYELHނ'$1VqJv!ѽΏ+.<[wYeYpoxJoS(;HtnU )rw*utQtn7r>{<>'-[FQLez5K7猧'd*qye]~Q={D8{ec-]Ug4hfe;Z BdCEw`ƫnZ^SK2+Q|.^m;\i=w6 a{C̚ ew4cJ~7jw]1ת c` g{RD~!t<1 qEglT$lu>fCDžVIG1ӼcfV (o({[bSfNSaŦgZr6u"" r4A=r|q┑i'[O3y&P[EP<~.? 2rv-"Гy!DH)?3p^q>eLϟs 03&*y}׆պdG!#B}gQGpȳ3 E~6?̇xEjA[n j܊Ad|4D'#vyj GX靂YUUC%ƐnxO͈p}gozTƏZ7 6c4ߙt+Dxr1 aZ=ɨ')C5i0ew(2swq0=RuCkFBy MQjB+HZ :'P( [AU.늷e߾?~vMw@_sE09\H@ZI :O='qp ~Ѳ'W5|!_$x[N.VbLRA`|^Qn7\l9<[a,U/l].MPJZ6g]*8ojGj8? ƫq^䵷hAΞ李~@fǴMB@δЬg{,˲uS:u]{lj k#sG:wo=I) ]`+1,oc[&h9[ʷ*=)-`"07C^+.Z)bJO5xunexPd< !]#MIٚCCbg@N 4 pAe-`88³+rՖ&'`Xsm{HƠm 3fiMD IDAT.ZA!<ϸ\.H.)\L1#G0~}VpreΗ1ozH Mrb<-r˻|3s.vhU|+ZMAɢ+)Ԫ;Sեɰzzik] G3m?_wSF)*1S Gqĩ[mLF-U^Gށ>nT@L0E/=~SUiHu*:'ƖUL@`0aOt[,s 4gghG_cB׬T"-16Sп]+;tC{7uGh;g3c5nԪAXFk ?i GH,H5a^?N(aķ SSxgZYSh:9RI.΁v~B 7e=sxǟG-]sJ@:? *c/-2ίubMcȹkE|w ~B:y'jy]d_}Ɨe뫡 CIJy"<-CӟWsN#C'Fxd3.O6?}( %FNxjQ$8_ߥI d.DػQ::{aB8lc :6.FJ͡֌j5`Mg?7бv*l=RcuEεԙ6j6EHޠ.Im譍jZ Yca8 ~bPe5zՃ%(!F_> vWDmT:.c4{=#Ŧ1p< Rt?bZ29z:p񄟞#)m;i/Q4~J ɻ}t h>2 8b~oKFnH:cpMŖTQh1 RJM53vQqDKU|T5}h!UX /Kv{T<0}Gy"\mM(\u-P$w-W7o\߷3F udJȅ7B #-2t# K$:pZ@-+OltkQ51{ 4atFKF΂[w_U"?/O)ֻ-rʊ.T=|UP=AQX gb4㼑S,#yf6TkړV,(b-KH"6dἎ@Ks|)&\rק = ɮͪ#]9:_YVV@ޝa2촐kX069Rr?Kq8NWW$"yAז7::%|O޽| Àoq[AE-pQl4Rj뙳/}e.IU$.˂qqws.賛ƛnW#Gˊy|oG~(z_Fͼ]|n' z&9L7#!kh0},'敎n*g94 c09עa6&!fL1r4W+rN #N*V q\3&&p)Hˌ2 p: /+noNjbH@qp.xUl㈼.ک<}+D*& G744S?h)tSҢ 1c,qU][aPBs\twg8`}]W—EU9ƈ4'X./{Evp8[Ty.wip{{ =x~ٸ֨T S wtx#. b1lk5lsLo$Vw}[ܿ+ $c[a{v]~8uQ(+":ꉤ`N ޏNo TM2;UFZ1d;_s9Κ,HE]*'P/gĔ޵pF&}g\kai"Ek&䞴`c;fw 8>z8lȬ%M%2rpSz kcG6ekCM}oBJe}-. gFNUoFw&\Jt* 5(7,PXi>ZJi"Zm7,&5ƺm0X"6 .:e..L-՟0k^NXwlc zRE*,;8d0:c^Ηpx: ˺`@!pFr+f7hSly4L>w#5yu6{fhi>=vGiøEpUo`Z*RrQriLR 6v} ,4e#gJ8X׵Mx|7&\.']1Fު0j]1#b8wx!0QlixV?ɩTu&W[w.s9V2r3FO| ,Yh3;8PH.TWmP& q\}@xw{t]9Բl5T1T|#ŻKЖr%rЀ>ؑײo ⃪'Ͳ4AƖgIfJwcA6N,3vuMw]GmdQ)SN4rEWAy Bشz,*\Y3JINu-*y{w *j vn!.u73?Ҏr|q7fg[8w*kE*'.TFf$Mܘ) `-1KZ!g1e]QSn287778ׯx~~3ue߻7wn[:02 b﹩G-fvRWKš@ZJsZm ͎Ѽs ʾ[j cvΚ uSYW\4=y'v+ e CokeQ * %T w=:' f`S+j-B( xT&$ R+cƹV|#GTv1 uYdӁ gUOxϯz挒Ue}s:iopj{EP&1|٣||6Zvf:aEAU˔}Ϻe!?CxNx-. U-0`NkJLǃ>Nރ^/EQnu"JŲBp0N$t? rxx|##nno{g-(?cOF~r-DX}zVtV 0C$chdVb{ aSWPwd,;U]zK{TQ0uOl탽co~hb!1cNTp%mxK-q+} havQD&NП_Q{B kc@ہTgTՁ\P [0G:B=m@oxxzJq΁E[Z8, fPa udbݤF90WGbPJAb1 EEfJq0tY< p$pY2|V&(j6#y>#:O'KFʋu)(mS)4fChIAFa8N&#]K<δuuoJ=ucHmU+{%UBnտO @&x!1tΔ3MmO+'+skUΚǧĔ=OwDa8p:t{ yFgvS/0m7%ߌR}S( Ol-):K ʚP H]W=5G@o"Ֆ Q3'h'"-o7x{ㅮXU."@PtQRNh̨MT6y&q޲D}gb?*piR;h21 `lIz֟i8m\TAUT u*m?S ة}uR5`#>ɁkQ}.$-K f8b~Ef9Rw vz ?3~wzXĠӬy\7,Y^d#73'oA;![jFᶑ."8ŋ5@6nmS)+PջEm`axMq^ ^5` aOp8 "/\ Ti0NwNqO G'Ԣh,4PzC(SJl:}G J)޿###J1[s/+ |B}||)! [nlzeQG%ސȈbEW *5z^KԄ. .B! "ijVW a%%{pEu f#ґ`+B[ yom#rʹ]_#݉wp!ׂ̘K_2CmO!o#{ {kTo,bAt[t)@S8 7GWūajK3c:3\AdEfT&Tt ^^qI ˊ ,y_^SVoJI/b1ӀyE*gR@+lFG/1\.zz&b42'W)8kĀ0֔p0|_( ^fFiy휞繧tl"cݷY!0}$b ԢDe^m+甯 ~p8`^.gT1p<`]Wp8aY[aWͶ̩0irKd}.sӭ^B 8u! ׯx||s?RJ3j }ɴl>WW~?ۇnӈ/j; '=2C8sjA#$\woHg$#Nշw⊪WR/n^/ vvJ=EوX>ܲzuD|77zT5sbu85! 3h)D秥3e2>Th`Ao EՎ;f4l!W!,Z4HͿ+7W详`uvfٟaA4t200eO? O^Q3UZ윽OpML%pwTdϭi˲,owW!bmGySxU۔-|>x<&U5{{k|yynooq>Ϻ|޻N {l]+Bn=Ӕu9&cWզUdp^iT+w8xO XUqvKn$(Ac;V/?gaݛ߱yXlޑ\ LT)t~5kP7qc[ 9eoz]&tQQ4l=֕D떃oa;H2,5__b r+uyzH6uX!Ϝ ߵ1iyQaLjAT,UE,y|r_o_TjLX-= 9\'s0 #~;?~1ɖ#aT~wfؕY,׌e-T0yY[@ e^P@8b<pg\ " +u5Kwt'/:!q8|p=te텲[%N֝ZGHrMTt9{sч(粏NS?´٦~H(eS7\VP@~ "TmbD1R {{N4 CZ׵G(\.'L u_?{/ƀiԢ7{bY@X˲hZ|T-#؁~8/l#B$䮻J)c,\I08 \_x!&ЃGo|^6*V0˺חkY_KlS3W7ih n@; (h#“ts| VKv zc92#8M"JZ[Wh[j w2bXh9 S<:WV;\V὎fa?@2 0Ov!\;5;F(/U Rٺ,xYϏoorY~ԄQ Ŷ i&}o3&1qS!/mj@F0P+IRTqY2sƼ&̹"9&=*!FGL7y, 0 |x'UJ.^frHKQlE0iu]qceY߱&-<9&MԞU'6U^`ݴf"@wy{?fDz>~d\D, PsQ\5XVq"3[unnnzncyq:a/`]z8z7׿bGoi-}KE#ƈPni)Nr,}\hv={2:ߒ""zw!`#1#D֮,5y[ tSH60/aBA]OHQFЦly,e1`ۨ0tLh#`h<2<ԽbV!CQj=v7_>ӄgYntte넘Rk*lǗ_u BCkS;eWAmo|n$/j{Rp, TRu"FY /O+=k(!s&_I&O`r<ƛ{w/ ??!"+~[Tίx Na—/ p㳎7770;t{{?Mv[(Oߏh}X޽fcYUc /\YEv]45Ɍݡ7s3|G4u%F f4Ytۢ)@h]z0J^xKo(A6)v0b{7: Dn?_1iP~ RNyj.n  nb+ 0McZCȗ8Wy#ҹd8k'Dcz[SJ:Dи 󪞯|y`5J50B5Ķd,Qv% L04G  x OVj D(p(PhRe%X`U= U$y[xq;rW=RNu2Ҽ"͋MZL:FZgYkFa)N傛(Ri0^ׯMPs8 "s#GzfDĤy% a({.$y;'׵.2[q U'48@R:=uZ9g\p&tsq{`|Mi6 NI19gu ֕ˊzԤ`\)e O`=0K4DG2k8s7#EmMӾ>omw/mZd~V 0lWH*1DcN+.!*~gg<<<۷G8N>G?aŸ{mt<` 򂜳rdIADe+)a[Pu(Ӊ88?Ͼvȇ{gbR $ D&fE{Z&6+'Wui t*L o 4q0)IeZʁs@W]w1xB HnQj)nEgZw^#ᇼ{_~ڿoloMpۗm#U3 FIkD+M 3eC.4ӮeZΡTr?h"~yM5782 ;Mfj_(j#רGH=jMѽrU[Tue)1^Z*kb! *m-z'_wwq ?fI0:s^u#;D)e2㲬XSƜ ` A/P4+5Wxn~v(O`6-2>}BƷ'=;۴m5GÄb::}?pSAei:O=b)p8t Jyi;HsUowݏ[U+uj06(2 RZ}m=NlOW ZJA}o&EM ~!(˗/}7a}ww7x9??~?~{Ni=j!a cO4@Ƈ%%ӧOr5Prds.,eg[s{ц@` )eŶm6Nq$Yv Ϩ#5CQPb7;іb*EG fT+>F%l~ E?u}$௽ࣉ`z̘Q6Vt3I;ݷ!RH0I&ݧ M4-@VjE*";Z3eLJ$R4sa,5#x2U`:}A( ˲"i: Y{XNdk ǯȁxa@R{Gw:y1G傚2c^.^WƃIW!_~ARJ駟Il_"7#.+ 7;YFj޳vC)n=P1`Ox+_b@V5|"@P3,88 z6R&n ].تV h4e},dDE պgRߡ]5' WI v:Z`}[Ŷ,~K<@VŴkH+Qۭ:Ŵfr)!g,vC 뚔ceI& aD{|iH;cjꌖzzV&⽊QUwC14e 2!N@4ǵN; IKI} 8D1 q"c1Fƀ Npz K("UFAr9WIgYVE*[7BwUԘ^=d@2XE5E=>sqwj5%q#e&ɵ\nNJnz/s\s-Rj.!wz8v+C/ҥ*0NWJ˷9ߟj%:GD}DԳwDn+jI{̞RK0T|w\L(iK| nfԮDZ+rF - h&eմ'mX RY䃾:B &UCPr\ Tvo2ܛ@Zřiڱ(=*k: (n$0m57 ʃ @&8&8W:`)1:ܜ8C&C<ག-72E=˂Kfq!.b-] #ga\Qxx(T8Sv[aou˲AX?k*v$3~/>SůI:xr-rB͸bZh3L *T\MQ׬̪ ]rR2^an! L4(JP[-(Tt&*RBWP^|Av&%+x<(Q'  ёc)5rN=zع-l鎊Lpq@i!>qa+f+n&Ӡ*NLq L$B:]EPrAO˂?Q@`3Uw#8\q@\G,i8)Ϙ᠇%a8Lt;x<"<>>(gTHS1BrZzF 6ྷ-0fSl !"8MҲQd]uT난udKtm{y:nCAߘMNlek:\z/~ju IEjBUks+/Y%5A(FqB7y˦&gF"Yd#Ny)|~G|߾}_~+lO)8 p~Q逻ͦy{ɇjիn֓H LGwh8ӟk$,+PVPY` ؆UbFقTt^> 3 CtVv"ڥh\'TUaQ܌Sړ~m݅ƒ bAAq3?!)#uƼxZaj*I5w/, IDAT`gp:nQfW.Y6UrqW7 Ow.D8nG4l/`k_'8rȍ1X{Jsȼ :cγ]mL® F0NC넁CpcDD@BKIsEUkU\dR n\"N0{ bN'< 7'a33jm]ݏ^.ཀྵXt#q1da+:]N\#uTmžagk?V8l>=UDEo1Y}D+ '%m,+ G5t~[ߐbJ/98`V_sv& O?W| ՟FZu]?A"§OZt:uI)dn$7iY6/ ?|h_;3v׸!]lȒE,gPI`C @̈́]gkKW-DAXyt i}Z9ԺҰnnl8̪y=ڏf]{?Q\W6}lAŻ5DL"&j `v?)0vȦ ջΦeA01Xh5`7KHK`-+ҪWCd.{\1zUQHuP+@;Hr?k}hn!SSFzш(=̉C/1x#(U' UB`۳/r_K1c 8F{D7* XsI+gQd%Dd&&J(KI[z.r!z$t+l&M2KhVW%<CUFFOZi 2sI0$Ț" U PAWͺ2$̐y+K\+s_KoF!3!#0G0 8Hݐ*r9u )!<_òEuM'CԢ sM#;M*h@q"H)PKD)1g,3fLϱْ}P*HٶrѨ>| 9Fx᪫Qb0 G&YTHRadP@u$o-YAnIȕ^]\#we 3+Y1xFP(>e{;,I&NZ߳ȼkg߷WDfi.D1m$P sTM&]b.L4`G 5p8\W| ˥s|t*_~ ^'mt!z423GӢ]Ɛ^q:nGi5ߔ)Zf k^W(dUfVbt9j 9<NnF$h #yvI1Pq3/\5/&yR3$'򗱿ڰrbAO9tpe.&FO8 ]e?#}yxH:KkK\{RP:Q:6ٟ'D!sIh'8G}Qh(H,Ҿ-@Ⱦ~k-g Y2s6>}7%(%F >}1{Hom70vsWҾ Ηr_2MgaN$Rs)#TS%VP3cy Q(֑T)EHUŞSewV6SZj~T tVLk^~F; !2$V7ʊOWHnq0^g 0fH|l{" *"&;A&ŏ_$궜n7 4W}[ dLeNPٵṚ3\y =tL)#\+eBH,`n1 vJahD QM5#h. &q^|<<j;JPU(+uӴ0I1~FZH:b}f_LyUDla߶NՕ+sկ廋4Hbh73O%9hHMh:;& R|CyyUoUť5Dugx͊ǑzԊZW=00XʺszI3\ˮefC@ ])%AJYl?>%bqDk =Li81638<///w?>w5+n#hc+mYUIvdAu,@k*~] bc&gUV-KEDrˇ1kYE*c\Uј BI(!!'Y9@^4BHJm[c3OOOr!s;˗ϴ kg(-#)OSi{: x{;a&l{v޽{NS~FOIG৴d ~0+9%#RPL[HٚHZt\1au+m+"Ic$P~_1DB/\b%)S -03[4ODh׾tA|>c'\m`lG2 .(+5 Ћs,a d`VX?IzK IԘſ-Fn$ŀ5T=#\QYk13y-G;]H¦RAiZ'ϭ՘0erEYpRPFA(ǀ9z}Ty>")!s+Vx!k˶# C? '%<eOOW4M{oQ,1y " ǰL!Pk/"Hp(cN N,|LPR*0?ˬ@72,ˡ&(J>`jT.R4 BD=ѐlFÒ/ys\z>~0l)˰D P|Wĵ`NթpPm[=7gDX–KۺJ$p1pBRƓxu4glOI#qm=s*OM~`^"G1T6H !T8#Ηc .40 6B+ԢfÎ#q:p>u]CHZ!ͶCӴF6tVbH[7tޗLk k'$N9"@~ ??ogI([Y19s])nj|'>fG#˵lW̳)UeL\sxe)d>'J6T3I3x#88X "vF ZEWHӶ&IBb"R"f@7K*!Xd y^SBVi1O@BE!%yEt *諙!F^$ìXզbBaOnIoq0LC.# FF0DSB^mX|i50Jcm`:[\3n[L(>IT IDATWl[ku ("3t|<>;3m޿n',|%lc:GHA(,#$*E2'B/ NoQԆ̒D12B A(ucimmŐ'0-9DH,#NJΓ1WqAH\"}%oRR.ğ[SNjQlWZ)=D!EBAXH@$hQ1wG_ZRp}0N8#.y\0; >:yXBV;Z\#aWK(x!u@WU:_;)I3jI 9)z))̕e:pD^ U*M-R~G-SO'c}̧Hs|*<ӁCEF!#%,t. 4AQCe`#7Q(;<ҁHH84 j^/KN ȾD5{]gz}f ! {jAv͟۶`2TfZse%EG /+[)xHm꜇R~ ȋkuxܸ#\;BFO<D*7K_\o03*\|R'םj d,35ʁXh 5jcdspd ̔cЈԢ6 g7kI̞H 1@d A4)>mcDia"]xBDt>Dgs~ievD r^,iz-m\@yP,(jxC?lPghkn\7kOp`IQsobQk̚li^i}N]3*>"^'e˅*CAЬ9_|~)g߿3%E4MסlدZ5E*-R (*(_*/lIģP5YH6BI6 {UG)|( 0#@A%:d5HЭN߈gj&ItMȉ.ȘB%CLa["9RЂfZHhb8j-@ Mt<$ t00@0@*mM׻{{1Rzbq.뚲 d%h Qڥ:HξlXET$y8Z0\mk94/M4ZB>|K&gq[>X @܍*n !8M('@LFK=u`(kSI c 871ZP6kV.z]p˯[n  IHD҇ 2*TvZ Xbhڶ~8ѮTΒ:|F9~wDrC8O0y&4 )U YZ?BJo߾b#wZ*<>>b::R Ą=jF{ʴ9Q~X 葼G#DpH0MD$hc*?HMB*dRf" ʮC:$gb[ QL)R/U”P+EKůvo$VFvQݥ}B$."DI*$E 8l1'%4eƫSQIAl#@RMb"Y\PǙ%$Ih3y&̳$59XgI)Uh3gQDP(I6!-3"YEj!tgZ||zBF#%qu!4Z @wx}~&N&2{mmYM>,mT]וԕP>0eȭ7ÕCU1FFWmݘ>jjlܵ~Y5 +fd+@-d-߳U{6B6ɸ<I(K|/gKӘQ@Ԡ\9f_g*".'H)ϟ?S̯驰{j<}޿O8Fxڸƴ}hLxy0??|p|Z#􄗗9|1paX!b 0.f_gJ79hgoaH,U]|1rgdoT9*FiCb_%n%ADW6kA(iAvR4D:T5J)jdH0E1RVeZ(5@>IOyΑ~6/x9qFؘ&Vk0L͑|Iz󼐆<#Hv1Xy ^ Ch+"( ZQJ($Z? '9v1ϚiQe1s/-{fi?=A5BJXĮ۠vfmzI=1E-v AkIOnBa, кnw(؜q^l68%XpՊTն >"ih7\ooGZ0ubGiC?o1F "Z0QRC ƈHOkR焀Rf@>XŰ4*~쨽ךFj50JTsT$v0\aF@4ok:U נe*Y4u6-"Dn V2h.p)aa/f%tK|㕶m ^^`޽ Jyyy) |e!"0+as$cUp鿯0϶DROLKZbId, %w-H c#q Rg2zSE(-*3`C?\?Ռ~^ۘNb<%Z̢J4VIIRXQ] Z8$HY 6.>dp2+SHPa٢G xl!vBMP1\IfLZ'gc L|j*p"٦4zB"[fJa^LE4 urBc$zE!lH!TjI1Q~=ގu Àn$Ul:NY-`N/HJc{ip!3}O z9pdT6tK)˥ 41-"Ȁ#qnX,yn$y9 XmN<`{\.">8>Gx(K>qu1,qv_7Yn3)k L|/CEdׁJ&(R[z./DQ 94@Iiyb 1r9@K0bH # !p׌, Ħ<{%TJ0L|PjT#RBk W\.'u)R׏MGA 3=sx`g;p|4۳#q< c kx_Uߥ3)(Њ"E!Kft)hڰV&p$JȵSx)?]v6$rYU%K(܄ dީPZA(E-"׈|\6 In[mU}j4fTtϘֹ~r^*%>yAʨ[Vg>ڎH~ȭ2~ONaM]hs@ ċxm6Bɛ~N|-`@[36cp{D\ @s0rRamq+4$0KS ]PeĩkHn50r&jYڶ́M/aW,I/'7UT*yIMXnT=)jq˾j_A5˵ވv]IC!*VN3׬]~6U/#{#wRwGa$N.h,b0Ϥiί+εO8V,7+Q2[*C8oy\.xzz=!Xxu%H镹@[y o%\-oB@r+EVU0ڲ gfЕͬE!sz3p9jUI J232bD^?*ܢJRFk_4o i90d .9rU`#.0x 5VВJ-H>emee9Έ1.\SD (o=I!Б6V11ѦXJ{nDy R4)W{U vgWp[C 68\g=l@%6uvFp?YK3P!p{Hs [<==t8cl#%t,P\u"i4DFAe:LӀzYf!Ey <3uc"Ұ6ZPeV6|`J!5 1wh/t?mB! Myפ0sB^QHBu#E)qJ [\{Q*6cEYn޶>=c].0r` 1Tku5]К5N3o%l4M8n#|91kKcIv,J'>H/w7(F.a;3ip9_َh?<"&a!1$I*TDL5'hjS\*]Js3)vNPDUavBcTX¹7 jEg`*y vVD/IA%rotC@b(:0:I+eY1|7JBHUdt'Rb3L WAXy #bZp'Jba 0pG]x^32Э0-2H9][ >ZSZx#X{lTuCܦmK6y9ܪkLų|:~Yu{l)V'v m:JP!& cg>bh<G47\/=>}>O??{gp<8_W tx3_IݐogL{4m 4'W®3ɉ@БY:) 8*LV 4*@ı[DcURBIMG %J֞;!x%X:T= =´J2|')O$rRQ@h& -[n7J*:I%qep(XoP N4W$P^1([Z+pW<%Zbti[E|vu۪߬cj*U|0k"O\y VWNq'+ip_;]HQ`gXGီ`-)Sg'Z%pnT7O]a$캮,Rܧ4ADQډ:TW*AfwضzSsf~OckN9/" S" b, ];2 )wlο;F\.e^{KDT,|SKסm;MyH-Gz&?<7RB$Ym_/7=NtCKၻ R )n;/gd%/l᷷Ǚ}k:##~4_qq{4<^ pbg^ǖf%sH À7t]5xxxSJVN9*wM+zZh'pw~#iSW %)[)}GIM"B,$ r"~DDpkӷ|ڥLUS"NN!#x Hb@gbƛe>!'<,9 & bt83ޮW.%  mL sfE!Q",[˜"Ȟ|qcgFZÛs+K P.puV65!)faTfS ,`gZd[z=}ww?Rq:@JM]#22yq4PHv-v][ 4u;a0\q|{!^EP$HMi>-5*rsUWW/+l [zfg)"BȇSPYrA3+yUߌZMsJLȹToRr~]<4nS &! 0 媕PƱg@,جN}/.]y ʺί&<Ӂ W8{gSJ'/scvvOzl7_s1-~WN݌p/ooh7L6m$m[`??Ʋ,[p;ƘY@ɐ/AȐ/K6С%!KIPC@]ZѠE|Vʪ!w8iFOEخ*|Fx}\l),0x `N;śW7WKlhH? 8z쟎-#R ]8bX1\]]5~'!gV>!tbK~ECO>~O?}K><oER8s!9Ш@/6 MJb6/GOkRٓQ*S6L.Iħ8U*VHY,SuYK9T&}@q:2ͬKц.XVYF%7 X,Z4 jXLnz mM*kڀmcO?#vH=0?>?|tc;X;b5R`쀺Qt jSx%$ub,~׷st/~7=>B翉 BVbYV֍v Dϓi8ZGJM?||rHWS 902#5*-gBB":e 깐! ""z w> M6--,S? vOnU]bW_UBj?1$Af3 l0=̪t*Ih99Cw!"G3̈́Nr!ӈB*DAO!fP1xv{1muh.K3 noo^ɸ?A gC/k*]#k(2HF0reK'8#}8 JG`1Z}>`N]7n} BFXGn}@lˮP-(ML-(LiP:|Hlj6>I#!DRp$/6l{9Td:!&A"g Q/7L! 7*LϬ1g){ Pɢ"!CM%!F$$/GذjǤyf)8%S֢ϟ x1dơ=A ~n؝NPUB5?yXH iie99+NCO:qsZ,44Und64r\R gA0q(f/h.xxx!%ł In1Ԩ%*JE~4 >cEpg'~ڈq:vh1UI$%UgZb!XUUE'+a(-ZoHjqOMׯLH!f3{~NI2GY%q"*?ϴF ꛄ3g/Usrj=_GiIUlq3*)l'1]Nb(l$$2+ZS80h D~ vl6n/q8at:Ms:B0&bwPUVuBmVV޽{n;y_A?_ȑӦ<0;ՒܻmU 38ϟsnL=Y/RF` LuDnѡj4ftiDfm?[u&v` QN(_߈E,6D,`uvIfx5B01R)xGi*ԡeb\%TEiS[ TUEPpQoLJ23ZX,KV@myfAk%<"aר*5 sSv5 >ErT)eIj*4 1ۺUfA4Z })˲i0{_dP~Ə?"V.GgŇ?b4=Gt]z<N^ cף; 2bF;|Kl4k'xHZH|+ď{bךqf%~g Dh@V՟T4/tVZ!Ϩ/]\Q  hRBK% f!6yNj褂g:mc5 7 >0KPL) 8O+8ZJbXNlK5L3捲0IhQ khS񄻧GGF]A7 d]!BEA\zc~ʖyRKTҡϜZ;S&-Rʙs83VދyQ-*AfU7A+EPǦir_iO Z\.8rek1a0", Q)1Z UdJQOYdԩE[;۩59tεVX64HgLsgfɯg 8ohU+SPK8řo4e'&1NO W9v[1]=<4d%g&բ(*tߧc1z,:"s&qiN:Psi3n*(Z 3qҽ@BPnz3`Ԟm\9HrI?!/5xxo!BGٮhp}}=Nh+<==0='h&?^/E1FZF $4T"X4$ы,N؞EÈ G6pi]Ym Qc G46y)o/%e6!8Sʄ뛨KA)n)ϛ,!r,!e{Ϋ=i z xNzQ!Y+hGƛMخ|x}N-\.!Ą!2ũ<-.dn$=gӁ6nR[͂g2HƑr#5mRSr50P`Y|'EI2Z*TZQh|'s3ilZ뺆u"Ċ2ԓRs}Kȴ6O~ +iJ,JֈBC 4LRGHTQDH-4bݚqW6"D(xIץ޻=3!d>ib>|w}{P qX6}uGH_`k<<2SUR  C+Ԋ~ P.="CmI R} %?-2=TS^J_(4HTᬤ* S|"yӘYꟉ}ҩ;D%&фw È:<>;xx8x*k(:2/˅<\Uqě8%#6Ma~-3xa;J5t3,)soߣY<{bK>t ObE;1 J0.:w֐S<R8;\z%_2gsƘ98gCk,L#JԪN>DGZ,W_C)鈫 |k<>?ԡ36HTԯBURÍL]7W_}NbRc A~691@R#|%jQ Ŋ7:dJ*D@[3aZ$= 8>ۤ0g`,4Ü{RLݘ>V*AF~c-{B^)WiHy5J,x7۴4RB:谙Bb$OΑ*m[ 4 gDẮk1 /D]JdA}@'{M8{MRǢs'JH(ka*[uO>AkwaZqu%m3/uy%G !ƌQ ϩUHCngPJ+h* .hf,RH* ֍ ϸ=J Q\měBYXP 3 2NB8\RWAjL}(߁_}ѩ[ < 1qÆXtZ>8=$kD5\|=x|,y'$BN4jl_n]#CjjD 6 8 翊Hg&Gt^InC[jP(‹b\HEjFWJjT|TyN^URU@W%RwBA`^o\0:QUs0 jF@kK7M 3CofZ䑔2 "ϛ#8Z ]b"_KoG pG(T jq@IXHZbt'%zPFzޑXNLEiYM B+88x/%*fnp9v8r$ֵPt1#ix Je֤&mZk:[C])H딤T"OoBgֺłRgSBb+muv0 8Dn̈PUMUp UU?(n q m{ )ٙRJ}O޿48b"ߣuSjEժu#pp7&+{/^y cm%EoK)wrjig9L Ez )#rOTDxRT xZ#1笳 ![ijywBViln8ܒZe5 %($r,!>as^c$:MƍmgI<4MMXDi]nS%ςS՝s؊|!\X, ˮAޒi3**2 >$p+g3~1W#dsmH Lؒa{|ybs\^^x8`߇J2}kTUޮqRB) 4|/#Jm.6 0੫! Tv96ūDmB5ǥs' ÀfK0H ׯ_cZ4((dBzE ';dڸ[xPPS.!Er ]icJiTj9Z(\fsڴG4LμY#JT/ NA?4p- T TSI4mkUe٬:,JkIU7}BrE O(w? gn j3zs[Gga|ZisΡb&RF )DU Ǵa: qY,K@I,7t gj߾&cxX4Dz noBǏׯ9mk, \^^׷`#n{-uXUcퟎxxx1_gh+<>>aVVmMϖTU 07[hg+M۶xxCy:vwww0 Y?/<1ogGD;ByO"EtT%4gMs 9ۈ]:jJYA"%BhD< jzӼT(EV   :tK" ÞGGn+р;dt-#BDO$p)"D8'sw8VFg8Dax(TuqW5taH]sJ07b30AQe&/h.,}*Kd1H,I$I95-ٴ#/Oғ| J* Y؆Ȼ"0"H~p: db#%N9ylp8p{{9N"]*d_Iyj79xtғXe8RD!`GFc\-ֵVDUP| b )GAWmY𞔝B 8:CO YBA:*樼mLʞ E'*t˥MA)%g~r_zKg 9Ӏ~V}7iwL flWwwwPJf_Œ20}ҫkz~-Vڶū71i=tdH;a{:z`{曇@DU!_ wJ \__p8\άC(x)Լ*k}~ J)\_`Ӿ{O>AJ )į"_9QH bvc;"Pd ͌ +PPZC:S%(EJ# 1,RrEI X*ȠINUtDD)$DL!"U J.z ;n >.CY)t9 7=fdloF8ƈc?Ӏ. RVPB.YfCTZؗF.PU5TTZiBqsp5` 5*H%Ѵ B e8B\YEIeYLb yT/0] P!ED4;;"ZkNHJkQ>xH-1^&n?m0 98.F=`#k,=< 8#*E~BH>XgbD+@#B(vQCur)O1quuSCiE^%]7@r"j@W0flN{iZO +R<[Y;b07"BD4OҤÉ(1b(H5*bzW5 YHNC,}V@PZXhF T)IJmTΑ~\LD.^q CĈf9oTA@zHH,W0À=hZ}綛X_lpNysݩ˫+kд- b 5޽{3O7(4}qyy+ !%af>O=Ol[|kq0K)OXV@ T I80G9[ " I,M ˳4+iI2?3 bd|qK pt,STxa#nO ai0Psl2<#19@C d%"w 9ꋐrV5H{я<GxUAG H2L ̔)>҉:gSe ΙSq9Gj^~T3E6frX~tPUeH ɇY5I%EkUIʪj['ϥ(w<==V5h&8^5궚n0i\0+ ^FWv$@6 gсg)1s3esBL{FI)<s໒ uV~$VjjTyCWSbk9LTgsЪкBoiv8Vhh%SVpZU7-gϽZkl,4D0.pXc^z/Kⷿ-8cGtn(o<5nTM  r777X.)5Bߝe|9߳ϔ߇ÁѺƫWgfW^~Ǐq?-Ϊ0]E'!6Ft-ft&ĺd"̕gU턘1?u R˜ų|jb M|ӹI(AP wkJVЪ&phL eN(*mqC !}y%0WR*88aq0X|˯kl./,@A\R{p9&LZi ) |2CQI~sWx.ǗLT~JlP/xM1*Ai+>Otx(c(\ejswwwxxx@mۢ^XWϒu2m1!J__JH<~U>e jVNvtlEVY(!8Zkfc9n0'n 56+˕b2'(RuM Puu&t~dX|O-d(ٴNvZrXzɉ&iSX>L\^ulPuY>ת>X-aEh, US]zVUJk]N}Sx `NSdOw<RJV|L~h^ngwӟ pͨ IDAT_|{h3{,ˬZ͚Wg\]]bE\.+,? !nhݮ4=/EzD|ڶz($VAuYiFF63ͲJҺѢiۛ4WhM?1][I )]sVL8'E[@BW\]UmlJsbuIqxgs쳹,Z2@^rg|,|bFN@;KWo`ZwUScY7=a*Rفt:x@7wr><>>b^׿5w}{Uq{{7o@)ၼʉ]\.__Fu駟P5y)o㋋ l6t]gMd~Ǜ7o^g|BԴ| ޿x-TԲ^Fc"=,OXC&BٚLZ:K L*OMi1w|\M&HY9K^$ 􋇆@p=8@K (K&IIO]X8=X*G\\!ijDC!2(XugJA53aڕn2dfABJu$.2Z>ARHHVjIZ FgaC70VdZj }f}A^c>XlpDi% z@ _q1ZLD%5Q|BCF`mȋ3$`q6W{YadQߛ0n)Y"3T5 n=!ЦAP\9>KҰx YQe4XÉ.5~sDPEhbMsLk N-Uը͈2+DbbY8ӁKA>Δ|wtMta Vh5\x,...,3ZUR\yzoG9g0@x@!c0$TݛM1/jkcsez:WW0ݻws{<ܤtxz#CN'_|wǏ?orݻwiDr@h|%ɛ?B D`PC~oܥ s>jApH^/\IqI5^V8>&=e|Jgyu\N::ZĨb ;N")`C  4.1[rȜ[z~DF!Jl04;oMD/*˴)6lXιEa!n./%K~b~[k&zKZWJaK334?<-78A|qUT-+') [M$hId5} y.'{JMYp N?=nSס6 %Z~xu#к˳JYS;CkU.NYaJo/ @&(u޸0}47[֚iPk+Z/S͹S/q)-ey$S#Ys֎ 60ÈXeTaY9?-rfMi9Ik[CQ-ak#y?t5QK_DJPBUp T%`3TI 6w6<}^ԭ#{YbIU $@Ty"z:СHw:1274nHmlYht7:=[#۬2?fL$K]$IS B9.W ls*jK++~MZ;g?WwUo+x9{Vߗ!Bxx ~M1>1j(ּL`yrqHk.s/BϿf_$(2|~#`)>c:69$8,CXOx?`EEq]N)Igh9.ٜd4*gQy΀=ɟWunBs!C?\A4^i,ġvd+@c;,k]nDM n9xb؄p@]יv!<tqrb;:(%'xG J`L\IE kl*0]X4MϚvJQŲZ- CzU $RVk[gsX7?wNY4ң3C(0BͲ]`Ѵ ˮB@ŁY9bHU,dw_)}@]SUym @zh=Gcj[Mzk-PA2C͈JkH0t=jV〦+#AWAHD48:H!5A<Bj{AF? ,WlG<<> zT5 @epf!R s_<:@ @2h9ob~ZyfU r"EBKC@\N]RJ>rRxvJ%*Շ>[_i=k~vkQ k [p0!:DZ3?i`ࢄ֣rj!JI;-V>KfZpgj V*0HEjDg3b-Oy)Uy,욄3fK#$ U 7UkYF29op<斫v?״ \tdfp|"^19ę"3} mjTqR癟K1$(ԀԲcX\HοI(33:11W2ZVNjLss0&A,TӌX)EqcE ^hZe.e~ݫD Ѷ-Ws}t(S]yѓ؃فRn)EDpjMyo/3dI4N%DHB3,"XfjvZL|Y  eq O5Bo Ҡij#XKfqZ,(f)^yv13*PHD)@JG L,l+N"k@P2}E(~B菟 >Ϙ k#u逝6͜$$yv})nK.:xDHLkuE}{MAK 5bfHj@ Shnډr4D'Emv8:L9=gM);l3*J, Gڶ͛bA"㬅&g_iUE?'Ԡ#nqPRd7pEض!"6}+Gl~83Ld( <@@jc췔 nEcY1YpjFlWww޵t7ЂŢ .!jp]6*S!L) c5*Y.xCNWZ ђdO'y98R{fse8R (3Lg2HCCV=D \rŚwV:N~,+;6yx1R_AHJ[ Z#8979.i&P`͚CqWqpijœ16kG]~Z,hw]12U yB`w(:E73R !P&eEI#܅H)|lox7R !x>_=c[}!It~~q$u)uq(7<}_Κٟb_){xS\__CiכM4Igg߰BI"W"B&j"opf^lډua-i`x6 sZF YBfR:EJz]ă"P^rhpzg6ul[o./[/M#"$!Z(ȍS xxqV681 ك?ͅV,o  IM=nH݁ٿDWA9^ x @S1d]>HH/Jb*ޘvP$.a' ]aB@ -(0b$A6(F/%)tCl ňPBdivm :Y"87ц#,R.olޅRf D )BI;TPS5FbV:B A-%W"ZHI%4 nTQ=H5۸GȒ 2KC+9&͹B.cxIcJ,1xSE!mp 1XI[ZqwwϠffSgR@5u' eMz`a`  C*Q5%noB.znx'O>KW58>^a!#EnJ>Lxpv 65qp}uE+?qs}>`?‹/psw<@ NQbshAwxW1GO¸2B`Zan+Xkq'^0CBHH  (!~ _V#}8|x > Vb1oWJ.WX&d}1%jX|W>PpQ*ӟ!@CQխ(uS% [+JmaW&g moi;\=vDmXA`n&K ! yPT,J䬵:Q@=A^ʚ+;ܛ{ߟG?*v1zsmS{{9$uH>'q/E6QD9 '4Pn91ơЊԈH4Z׆O5}ؑ6Ȧi''QHk{>iS)#9ob sp$ uKbL0FlYvKV|JXIM3ad2*S'"tdH7fU Syx^;3,э-pRXj9dŗxxD ,I:5tY@ 6q\6h v;xJK,xjA/%~ɺ)mwp΢,kslwY 34M/>|=“'OX۶.~ԝHb3u!pttsz*|嗿,9 ]իWT->z=a^xŽБ"o9Uxy8Or6" E%QB.9 ^hHO혼QE'`OX$&3q ^2*$ϔuxJ|W` *6C Ɲ  c 4͒U"9Àn싪r0v}/iO8( -7,b s!x&ĄU4N>*R`ɮ붴9k dv0UJr(R`&,jzgP5ɏq0[H,_Rl9T$#U>̭?яе=mZ bXr+G$HSJ $U]g\jjM@vqsI^tVM+g;!1X(8hfR@JTZ|N}<6"P8Bnj( $愀d6]dÌ9p:W=UQ( '1x' :?3]d^=&\yboCȶ?^`=0z:ta wnmzȢayUCHqr(J OBQk !1##N{{.g$L|9)fJobOipsK'9 ;V!Nt6/xHg_"X-A7GwGK6JC0=Fg!Fƿj3A;gN˳'2>P7 LWFL#.at ޾}|FŸ8 ]Hyjk ,h2GLBVfָ]cX‡prr̪d 8>>;X|!,K<}WWWxnnnp|t \^^Rȯspvv(Lӄ c19U?޽Ë/uO>U_ě7o4 .~S1- ,&7M8@QP 4PRs;&yYrZ {á68g+1u3etCUi1@  *JD].LII aOm!b q.@Xߏ;cN;`r#AnnXzz[lG\ۀ]Tat U7B#HX?&oPRgB ņ *i'#5P4BHP2Sqf%y<!1N{6MSl>bu4a$ / EA]8>^AJm֘s֐FbjH +sc]tMk7( %m U8RbQ((Q(#e ;Zx7wvB$Z&5=lF#Ee2G , [b#)(s=*%}Z(2TBJ"ېcªcRIٖ;L@r@yG3JJ^㤌\-@ !P,}fX@X,H@CH4#޷2 O*r];18J1W@*B=!y^T IKiޭGݏKMm(*,qyNqΡ*ضfGe&nl"#ۮ"%8_2x.prBۺigeQܼyG\'r7q{u (affQrB1Y*ͷTB`ƜT5u BC&tnnn ' Y\:H$ &wgGRv??x~\_aEe },Զ-~9ǘ ߿.gGqyyo⫯1?~+XQEH- 7gr@|J''=2A7GF[!D0[Q(xV91N<Ǥhԃ烑R@mvF֚SD }gDxe-Aaً4 2D=t DRAp:&N ?0h\=6mmc3a(qLUsx5ͯ&j~%U$QRO| L'h;Q@p N ;5_p1bޔ"!h k9}?ft(Hʡ)݁&P?Yiֽh ʒ`nD'awRD( 84gU1+,%$Sz7y`4PRo{ѵ r33W)T4G=rƜ4f^>BycZGAB):hJCSP*ߘw ScJ%Yv;n|,T<@PY)>=T(D)m6#K֩HSg]V1+Y BPob QUh}RJХA#vtZp^,!bNQF@Y ge:gذ-._})%>}O?{һW7zA&etn0 Tx9lphn22/i8s!(8 Ix}!E.bI?,2k~3uaFx˱fΑi6F*HE3ᣂл wm1E Je ^sL L$ *NU a-&),1`L g=FNI|ޟ;=|j@yY $%XgofDڨf%=O!KT|t\#u1L4 v\u]gB&e 9B{ p?x,q }R<qH-SL $yă(\ r%*ҝ"B<'o/ h<9L ٙI56Ⱥ4.BPX.*)WB1x |ﭗu,s_sznH)qww]|} YMd5k'%c٧- mۜ6 b\'8==_quu9O&kZ`"/Yv9{+hMłݷh)pqqbFFqa!q?OC>8 )/))KBҟ.8\|a8 Ͽg{S|-|!@ 2 m[2<'|,\^^>3:vt83>ȩ+2)j@x-R~\>)U`*snYi^t!Ggw|=ۆ|cJTES)0MSnMMv)+wSbuS̿gRAҼgBQrW+7m{tpIAښld>*%JAy95~k1у<*)!( x١(E6J9uQa8y[Bdh wf߃c9&6&0A?]:SMڶ-L^ުgmwޘs<J.Kv;m9Y{[H)駟( [[h޿۽!x"wyRĵUuUjhZ|Fk/782liOa4gl$֢:ܠK*#8@tA14l$ުē%v̈}JVXPTHJ3PIP>"@J;<-Jk8%0=:!sv"mii'EL--<"livͶmۡAJdiUHj;&cucn :`TNŪbn^*Qj:JC+ln?"{YbL!J)Tn"B9KC֚BcR>q>+yw;@ΙuM(T4Q`}6O@,yÄtq (uEIPlR*z]`&l6;X!-?Sy?RxyhxUQf$qیӅ_;x=ggggŋWhjRbsw!ZX58>:_~O %0?!Rx16 ^ 1=߷9]͆@%wvvqqwGPxviH\Φ/\BGU %*l2˖b c7<>5H&%BT#Y $bD0$~s}3JAKL:gq׍n_ma Q) uU6w.L\B4wϖCy؛%ODbEg{#$Ԟ)Njz2q~uϿPCN90x?qABPU_uٞv_ 0Ay_~/+4{UyA甧oJC܃;Ei>NQ_>|w;λ"6-B9`8dƕ I6uol-BP2N(Xi>(<0N&i*t+NzqG8(FG)jNz˔[xZ k- e`Z!`b(GA'N&h}&Qg88daLJ }?O1]%zN4PJZHO$g!U3~DeO@{:Rmai#)f?eF$aAmPYIaLLDcZ6#VE\]NDmVe`8-^Jq/ b]G&eP[X#fI1N]>WY7_S{,q^ge mruG = O|r}qN-ts*3'*FbXT,Ф`M3zNyu72Zȃh;) IX@]4Uݎ>k- 4A^ 4tXVۮf-Ǻ!{UiԪD[kӧOK\__Ϟ=C۶x ~ZkS|f߽{ϟ{| U]ɓGxm4k%J @J;v\\|iW_ꠢpe Oez6?S:m[,v*WWW$09X;;KtIATK(|CxϋI*1A3$)x84Asҋ!B|\B3=!RS|+ [" y~;f۷ = ${O),In;0AIu} #n؎4i D &oh>R$$W q֐\15A0ܓS d*>ZhBcIQhI#0H-U3Bȩ({sxS?ԤO)#hYK>U<"^K:1zY fDAJ?=bR zaO8T 33%eD9T2e6/ 萗Xy#T!%PJ9!W7gFQ`dNi lpq1Tz qG#%LtPj*p˺FNт:1>7Te,H#~!cY`Q^~cUEEwz~y1,AzR(Shv Σo;B9(!Z,}uHbKoܔ~ DTTТD۶|jmn"z~B˯uaB)Q LA]*҆?_=mGqgaW O/.cOS]":)7; s&*l}1>΅CnxD<!,t8sY$D!ܤ$"~c J~OpWDGo@^,#s-P$eO7KKLF$Ԙ[RDDNH~:PwO:FWlOUs\b'Oa~I ."T3uY\>qGOB.i,8oFAoઝ8f[J>f֚N8BXh|CY =%h,="SLYTYR 4A%udp{ǞqQOaYS qP{%8BkERJZ@E=:Ci8YTyL1$&+ReicMJV A)NdY(Hbt+aO=s31$A1Ѭwd{ vPU\iVJuwkAX EqREv%@R{W1R0*4\K'{ɰPQDpNov{joTHq`$KMJRx Ȓ9E_2税,]?o| bX7>?w)Sq}VylJN9~^ʼ (xW F)_Mԓ(Ǘsը"07wd(Iڛ:2CP csQQTrӭ{==aPtgqAvG |_  4o'Yy3W7ר}7|sq~w~M`s|Gqv6 @y \7]^L\Pskƭ]rإW>2j_g_- _Gr=rpifȕh|0g:mO';Rģaw`1nqsߒ|sf\hش1h #S&,6;עɹBcr-ڶmi]B)d2(I9~x4k38ɼ0eF8' @3rRÑo6 N9I1%>.x]=wlb -^cd?$_^doݼ)?oyp\Rv-_YǑ-p>Vs4K)Ab=B|_%Z,G:pٱ˫:S89ƔDG3RͲz'N}y+}f$pBuj,="^u UE]h@ǩītB\hoAqa|_ %X=I 4;ak~zqF)!߆a>@+J l?RhśCq>@K[k 5}%T%~K+UڛuF}{hx{) ]5*DDɲm`WZL~Yeg"":\v^Uy,7M7D dҼbss$w!N2 M =W2Ι߶s"U11|(X.y96  ؜oKDA"piuޜ|++̋Rƒl <&wԝk6C#dA6\%Qg,à銃6,"'q& _a _[]϶hEWqCmCxjݑدv[\_#xn,럷G?] ^=–;v%3r7KVtb=G=Yi٤cga7 SgywVUͮgNEfN ].{W~.ݟ0U.ܧ[T#l\+;Leos}rh2osS7ߑxkq-oBPRD$xf[Fh:+*\uJ,js*Mdכ~ ?%ELY+zh>m pq$9sFx8b4dcFEi RL  .԰;( E"T4$JLgT̶d9wUu@)EEJITH*z'd*RoU" 57(d-tg@[lcuH%Fq`E"zDi#ԄHLdf'E?qr'1&j3#}(z_3Hx3K9oJG1_Dr1бD >Nev'PHC V88 ~ؚղlǹiOF/ZK!68΁~hۛAPQ$Yh4Y4*UThlZY<9lnvD3P$$){CJN;Z9 *$p=aɨ .N:0PJwUp {GPm^Z\@GkTDלbk"jBԗ߲N:Kͳ_^7A䂋]-g5*t ,1NojFosȷO, dܯL[蹦;,O|qV& = <ߙ;.3㥂_ꤒaeIB)gb/&B+hh)ض-zJ(G^l4?E3;jZcaNCĠd^e(;ti˩=cɽ7 _,3.h~r -P"^&%+bW mOXrV{rƌ dB7N);Y$XRW~ҤϤ񤭞ey@]hrwL8ޡg>6޲_63ƭCapq)rRO[:7Y/)3MD@8&b@*[T/O6@I="l"*T@Xkykm7 оQm!V$voOEFb{k[ MN ! b*$9SU2H8qKJ3"(E?ظxMܧ`0xA:T3'Bt7{"?ydsq~Ugv9mmA/z LUේSܧndʹK:{}J)QG !*>^5^ib|>m{@1 h%&i=[ׯ_q=wm4sHdvC?12yK \rʂbCԤ o׬Dsn0=Ⱦd/u޲Ѳ]g83=[jqW/a=`C,כ \z12h}ۻ_Ag&g_IБn}K$&__%[$#/phNϤ[DOՅ 9:V.B(o kGy(<0BRfOҥ;OzLmK֚[HrlKi_O& A  .{ 3,MK!uu xi`%x}嚍`#j\ 7z{دg*~e\DXH=N-U.#rns݉tSNy~FK#MvXZ{{{o0޾ԕWۃ~"C{cLwH}Á3௘s6|dlAC?u4*3R )f=)֎H2}g^K̚w=nղx/oZ?{ΰ|F lk&Ioޫ!qꌙ^i3x^KWdta Acn+>SWq6<xгZovHvr9\"ǸӪHfCBbaϡs|US.8BI$]5 8N+ۘ~$o4Fp?+dO&6:c]ꠃG:hIwQn=CG.L!(&(xbmO G1)"blbMׯ_WPpCsRnV`LɧZ,bo`ޞ{{\b[k4H]_EGЄgF F %~~uS&6wh"rdu~fYt2(ui< lCӛnS"yNt}% _>%,ip /`@Zac]=K KWFWEA oN雵xe>^b$}0I+b~0$ݱeF $4z)Xk&S2}g8RNǶE5dnJw{>ljWpY0qiЂm۴uŜI!}4f.B`SE)&%:K%16?zY=FX=\*x>nj~evo!+?w? l `X/P?|Ws[-uu 5v^ļ%kNBxf7xԤ N[d 4,rN ׯ_4TCy{hl=Oxw9篾?ۗ-+۶`#T &I ,&tF"b8]]D(Zd+\sn$IqZ{wzJErϪGq3oAoE9%,rKV 3DP*do۴ێ ƏiE"B(͙#v)tTEury%] m3:o=ϻNB<՝Kq4юcFo7 I@ eGfQbMqM۾=k-/̎;B%soU-^J=;NCK)EJ XlnR Q֮7rĸ}nއi9،t\U~,tTi}ai/QV>~Ⱦ&2ɝQYsq$_诬2w~TŠ'?b Wʟww4Ӻm^7mʼnX6-Ck,!gֵ4q?%_[6)#'&5+M]_Bﻐx}ϿUULKl߿)T@n,%*%=&7q@ j-qZwўFAD")r=/!MD ƈ&~֤-tnyaQ%Gmvh م"PZH^o,_]fN;> f)2N13nm3镝뫯qΧ٫|4А]鿥pL/T9WLV=;WnLr \ GG] iy{vbFqP .4 %'C+q7R**(Fڢ]ĜT)^TJU#\E]X ,&[W泚4JIx?xQ-Ah2kVAύr*aJguϩ"(Gܚsf^WKjַv>FHf),^5%ћ~/%qONM\>12~ ]F4Bڲ73{ ⛀Z40.Po+<z8,qzYvsamWlZ(5C&CtsoӞ_BS) w5{ $ b1BhVa JXcA>B'uLfn(aQD͛@Atm% jݮ@fʮ#E5 D w$h\k O]3OD,}Xp& cš 8m;2z.rӶ%%^_ 1Ta ] g:?0پ_ݞ&lٔ16N÷1t [{ΣL5* h؅Ž{S4q1wU ;u/K 4%t|@n SUxߎ% Uy<6a3YM%_Ok͛w"(ì(d+bUoޠ;TNRfVt'F*5΅w%JQ( ӂ)AP(Bk ,E%PΡ2a v*_h9S kDq8{~yQ٧2 EB|W=5OQdKCWiG ]̕/ zPPgD0qgEʘkXcy7X ɰkivdc>,PHfۇSDj)UDBxC,Z1A?)JèD;}3\Z w |:z;^=#s 3*wKENQ}IN'r+[MMۓL{~ۖuqj)iơz)J8g$X"KtnNʥYsݴEsBE*A5Hݺ5nTORٚۿҫJ*BUUVJ>P9H RP:Dt a_p@b +B!kٴQK_.eHij)b=3(t1:$BA2{^dH p;3pv+*M@D7mcrn #EE^*{d1RD*T)6J̻_f 뾴\X7te | s$V&N4 әk=T 1eYGlwwL\NMvtމlp8tHєvj.'6>o)H $oX$k˙-W*ULQ3j8:~< UuR!~Sr뒦=&;.%0gUm$tÑKH(.֞ޞLZh F#B$U8pk"ʢITWcENKs0:LNw$p)xP=Ok|/*9\j鑉N߭m|JBn)ll{VNkDnL?eRО=O_'8\HQl_N׎7GUѮ3 sUWy} a/n Gu݁!FBhȃ5=D<~L2zWTS$ %u BʌE)bu]XrbwIcnC7rh)f4B྄"kP{TO|iXq(p|;ZN1atA@ҙqzb.AbfiMQB2Rپ/Vky*ǣgE-u']i3PEUբFG0,7*UtS/Gu]]5{&&S$JuH N]F3i.{ayZ(ufBu͚5n޴৊*g .imj<^c=j y/b w%]<-ٽ)iA&. ii ]1K2+BtG A*8qthLC}f-Ȣ6ygs&xFdzѺ3|{/D5NT1}cc`bYK!4QYI:23jz˕yplGDB[xG3OeQͨ>f$~o/U93*-NV-zݶ=>J}leEܢcFV"Dn.Nз0( qIAT$} _,9 {ȵ,V+B2(}QY5 [i*>.ߢ@-.)Z[bf-!ֽR5hWQV1_p7kRc@>;[A476MU,ڒ}ytLH~EN΅ txB3+>ATL9Dq0,7qlzX->DNOW,0Zr¹{^v؁u[D=>) b"zb9h.v:Љi9t(ªxm ;ˀ)< !-3(XRś6XhAVGEp?Jـ{ ]4Vc:DP,hRjUbcaԅBBsPlayn=NQ(5Foc2(!FQfIE[*PTR h0(4X`f\9xOɂ̩gN[d穋'3vZCO²-H bXuMܷ 3}Ʒ)94hBljr6Ҿg*]|r;][k&  Rw9{ӝ/^kߣPMYTUKMt`c\ 5>@L꽶"a= һ(cN<նRjUЕ%ݡlnpk5۠u( ZP*Vn oV́H_9yw^|> nfv&^dN 3?U˭쐓Lz Q~0g Sݦar`FcAYp3c,૞-k{Z^ bKΫ ,R Fe%fpݨ!mjÝ}"Ϭt|zq ci)LжzϩfetŒ|6gbRRkÉU6-c+[ov{sҙU=-DQ_>t2mt \>!@m̚+2|1~KTo1Ak t)n&/Th`ڳZ KCwkR*Z %*R6Bx\\D4z J 'U^+ObH!1AB>^F4$^ i}g=fh+/fW@UVGDt]G,Fvo~7 1U4ى&r|J3i\ϔe "W9Qy"W@j???Bc[qWqqJayh "8"pC4.Rotjk/ 4Q#&% w i[L?yKGCD1ICj!hJ˧VbAyȦ\4h Ny"oO,c2ɖ2s&Yr u.˜dk9v0)HAY-z-̲mS-H\8xNDH"Sy)޳u'Bj{jd ƍn#oRp3e~H>[!(Q˦CH%U\m:o A݆o{.CWꠘ J,{ 8F ̌nKd}6Ao=&n(Fh>G2 S ~Φ*(.CFa4qiEʪ[3SX Bqc:$osp(1:ɇd6@ ⍧ut| g1w*gt5\1E1E zࡈ{4ΖrԻ"(j%oe(c3N!n9͛>MY♫ȶИd+v4{*\_JќݬY|ug([X|6iF3:ӼN촲<)osu!;Z2Lu eӟ`\W3Hl~lVEW1E}b`2C T 6Fަ : F:LIRkQw1iQ a15gҊ9CҠ詨#~CAS1 pbɳ*dHQ~[>@1ꆀ Ut5%Ol^h_UƌE{ V ڃyU_Woi;iGZ {v^pTMxS_Z z :)Ly-McJ.I49ʖ^pwGg1kter\&Yt[xӵkި$n,/ [X]J͵tNR#&Y|UTY~cīD5i-gs- K U<( lU|l|<> M) A)t+ą,UUC8 l̙Iyԡ^3)F[0Xil rsڑ Rd(܄E:+c݀㺊T4,t'EKh/10J e4ֻA{gtp&N^C#3ΰ»RۦV}_  s(R{1*]Gx e p80צP,FmDcvܶA\l/AQh9na::'f˜Jsg7d0ζjN*O锳}@s~ wNEH<Tc.4닔v۶lEEH1V,E1z"@!f/þkش;YuV9C/3 ^  "qZ>J {9NvE3c9dPt\ J؈ܘ J7a}YB`UF!Ěfp`xϬl`ֳ_ltJ%ʋwe_iTEpQ#rL}5v6fW&f3ْ: ,ڿ1-f[ggu f}̣\*# (4v_i Z@gN<~eȇuP"_9*fRZg].WtVT:o$zNYMi~Cr~R)OkyeXz忢%O11wsE(̇ZF0x[?ۃBx+d*CtEaaq:U q9P¿x16\`9}8nB Q=Ea#Ճ,\cFUؓޞ $`q#qŁ>ωc@&Q;7fDQw3 ϧ}< %pB`H5c %`цfby1,nDi5T]Y'9ʼَGo3yD,GGT*= T%#g)Tnk2(Ɖmv$nktه1d;wU 9qs%)hMNi*3.7Tq.([kmH,*|6r>1֠exBZe,RùIWc_B JŦ~!Ti矽&R IDAT?U EjtE@bU"JʀFBU-ғ>ϥ7=?еv" Tey')U8Q )(f 侀o. #*TFk f@JA O@{#|0- W1Gnέn&xM7ZsvȧOknضmXgtX|=@5m^z܊ a#^s<λ=3@|_d$SN_ǣlUiNuư^b"h#63s3]pRjz9y)T"֞ȵcnL ;aH]r'd5ΗɒّW]XtvhĕG-?>?ǿg>J(x赨AdngX<F9aĄ qH':aOɬ Q@I㓪D{'\STY^IjLv,SUdY>񟏍PPzttBI[:\Lvuߍzn~~HU=ۏBJ3oA$ǸiW*xr's2;#^>SkzNWΔfxֽ􋹥M\OWcf!kkuXdC1<,|wkB6ӫ]o;ɩf >10:UPUTm j )cK΢rD1zTc)|o;"cbEBDVD@@DIt%x)7/;qGqlGmMTϏ[@:qC)V;rKpP;̀6a20(WϽa}V;!B=9A0W= P37C1 J٣Ԣ1y;r辺R1ɍft×Ji@.!ŵi'㍜s3 S̑ːV9O] -wi2`nL1ș uy"cem) Ї"wRA"bCtJ0D_A(|ACP4ɖg 1$e4M HHތ~鍎Aic0|leN"3X7^}Y8Bi.C}2'6ַ D‡Ka/ƽ {בӀ OӃWsgSCBMVQ7)'l]!$ g5!'iӜ[wb#~$ %ؔql\ziyz[殙f,As0r?T}eUIx:Hl-& n??QUeS*\2SDڑK \TN;"(Wpn:_%F3nG`h=:hg9i5Ӹ4L2 DEPꠝQfgOv1ue%F!&<hę `.Tv"|jh4-NfFTq‰^[Tj}%բVg;R0,?\x,%ݚa1bKD3'%Mq2j֑}f5YH>ҁ97 Q3Us?@i"-lٓjϲޗ5Լ_ILc!bƣ-8HqfCysMO7{c>ѽ\L[eV1E{kOg]b3u޸`_D `!~S{b;]y(Z>VتHѨ]AS%rW.2Xc(j9Nz1YɁ}:X\ލӚn-t-I֏-%!4/Pa.ʽ5'ͫ= Ej-(|ZJQ*oq.ݳ<Òwu9zTdx60ԛMdH{<+އf1yuĖ*+an7( NӜz8 j38JBEF'*e~݊<^=ʫMCy\fCb`1e3؉A6Wv-@zYHo+Yۿ>>gM(b¦ Ө9!S}70創q"u{FyžpVnR&k K͢fr/{S4j-20e޼j Y"қ>ª[Zj4}HQFQ 0E3K*{n(K?+yKƨs1-n@ϱD.KS+O[vߋn¦n#ȶm"bfylld-nSR W4َH.bs"jZk-=J͜{)eF&(C|ܗV iGNK[g^FI7O7t#댢Ճ4,<9l߿#8\?޶KG҅Ȕjw?ywFpv?#TuN*I/$=DX~v:/@]uAoADa"ASi H 2JwyefjSGzceXn e:e߫9ȓP*:m"n%X$Jƨj\zRpnR&Ãs`s#5{Iaa U3HMU5%gլ!!&}6#)jp;1^12s ԌXr(%*%["@QG܏(G uʓzxz9DpL'8(5ǚ6奀P1GTji 8bک\ bjfW𙷞aڿ~|x<>U-@ obf3S@8"σJ7zq@);@Q*i}yxj0skF) ]FʳtX4Bʗf QȄ} Ur8w2zZTzxTx{GҙUR )NQ 6ӵGYL Ӣ+:"yF@e2\|bWzܫ.m,dzRvZ"_Pd$PwOK;H"BȖ/ DJa3)SinQ-G1ƹBBy\VH]N}@zHfKlư%_ ô*&FװI, 82*yԙ4=ligԞIaA;haT-&~漓l{. 5UB;5cn Zd"h@*LŶpxR?~>jWAB~av Jx4/ՇkUf[ow8LgQ _e8c=..s5\ Ԏrvغ$ѝeUGb1&hRf<д ٹiWk : `5@ӝYk; `@k__ [CAA/S4Pk6hѥyI1l|uS{]׋U)N_eHOY],<'$z]Ijڄ6j˴*.I%ܩKWQ>]M{'H爔iu=5gZ~Dxznd,gQJaQ)2-"0מ#hrY Ȍ\CL>m@e.Y<Т= TD$1t+g4ڿk>LdEs-܁atO3M:]E lTLeW*œ(im6p* d(F#Omc; u.`$)I%QXYv%⑭ Hde^ж`$+ԶfC22Aټ!Н&c񺩚U#tJ(aQ/cw9O^r7NK(fl,k{vm͵9 h{syak򗩔A1?g4JZϕx̓>avkгJ) w @?c!]\r=sa0I}FP2|ZZbg!SQ]7Ϗ>>z<>[3FBsOCڬῤF.L;Cmӟ,#x&t'(z#&QST=/֎Ӥxhũ{sF1 tZ =FDf%{gHDj`3K`UKfLf;bgF0K"$zFE{Zk۶5}]#r xfik  >xh7eoX6@GܪZٷ¯ ϵup]3Z1iv+:=#3k?L@ص a_\3u1qjY/eWeUQnA'Dk!(e(J?D5zhO;Hp/YYt^cӋzs%[At2~QgUmw;JX]T^Uh ѫpvܗ.&N;~y=1SS= Y<6(~9c&JE?XSkP{c4 .Ȇ*WM᷶e FoRDfe2Hn{>=P1c7A'e7 `:$9j{)%-/k~M{A0]F!]Q`DRGsX8JJK04sDS c~Ki {wҀC<!.$HM'0.{Z"w޽ٿ׿_K5Xʌ`F b@ M.x om~@K)E:-&"3@m\} -jڰumg ֆ W ?2զDTDX2!UGW5Re9X ؖhu #I oͶ5QF*IܬrXٝY4XR.LDxܰ:P&-]$%;UM LȎɽΞ\ x$8.dfڿ~|=<~ JQ¬DLj ԓM A}gwxgŹ@.Q"m۴VpuSm3ӂ=H ~;&IgםJ,  `YֈvpLUDw%:3HP %U@d@9^|/!>P{de@oj?mYAmtMه\hÃ0x<4{nPE~3mۘ*|K)|0Wu%c*q@4h(2+AS?33,yZ\M! 7ÑwolKEE3362sExNi ٣H_`gXHnרWO]1[9,Դ y^Zxg^DY8 ş)mJM5[ڕJ#!عӝgL1g~B/?%{ݎ}U.s`-%bqo4/K- /{"eI/]k. 12ҩ,`#x(΋ْ'1UFZV (T% 4H6ayBQDl68(߁9WU5!{KRYf6|O@գd0/#Q|gqwf>fA61zcuB2PnWPiywѩyb-T{;M!P}?+ u=ALJzDt!;E^*f u:6U Y9="s!ZTۦyI䢎}Sk"՚̐^\jvUByWxcW*dj~xX? m0&~AU53wkSn;NYqvFNy>~s'(@;\9KjU [xU 2cFMd)RGaC&Te`6@4”**)r5ie31'IU5'3xR333S޳#Cw:B~=r.cW͊jam"1:[X6JR^y@R Dv.K.HW ֻ;*MfQd WCK6@0r&sGMb-ZѰziffyEp([𸼷2r_r9w9bwMssn8 K.a$31jkvXeLjY=*CwF?^joϿyhڢ^mxrovUy01:N-:'*?Q,^vƔd DwbH~>THMhRPHJVUJ"q6g wبNx;{L2X0&3m9r_ߑjs[Hex4|lr~ `fl:wQ<>>{rpzpw ݚfl`(e]DDS܋hpk5N++K9 mJ\&BYe҃ʁH2l|f ,wu"NJV/\zaw= Lq۽ eT%'iMjB̒u2Ar/VL+訞l⧽ 9p |HQӵZ:a㰂祢UHVRoI=DuGj[ Gw"u1eH$К$ڦ7pskOsMxr{,%#R9D#B␄kIͲ AbQ&}3$;C>u j[zT0htx$zt=D4\3dV#śCSB__[{lZ`*Txf K".Yf2n>I.3Y>0gg?V[ZKΏ{˱Xu6)zv;kʥx<.ӭe7yIRū՗Ev0(.Ox'B,gY*Kipω^Ei/"b1ln֟JZ4@ [NP*aGD(0Tҟ;|D?'Utš'+69>@,f0Kko,%zܬ"i̞)8W 3vD j"XEHŅ@3P+(pL(x3'?=A+{/gHΉ %}{$ƘJ ej~yRBN&_0m9!Pb7]Uԍq-,7n}5Az8j}""DL꽯TW*|Y.LNƩ{TVEuК5兝W_w-,ΒT#g:3v|PAll$-fSrXm&je=Ͽr2&p7eVIX4"wi!4Dh! &zGd.嫊dzёb8Ji]w."Y{fmx 4 B==<"6̶6+rّr?M#"*YU#qy8rųirɧ:Qfjv߽{!mk&gwTN[!ssGZܦli={WU>!M}_~Ammkjm:Rr~R;kyQZC}Df΍+.#zS7hn/?T/d̝xY |*ϟk/NGNJ'ءpeOD7͗jr|ۭ믜3VoBRy*m+af[z<>)jh H=ALt6h3:%Ƹe*&k,-gѹܬږFWה%K{B'ω.[GB R`h$-\T+lf`0Red5Q. *r-!<`=UWzKɶc"J3P0!ڨPJأK54kfýt7U@0qKDtJڢ9m gjyN>_߽w5SurM&+cT宖kf*1N g:KJT?@'OswUsR| 7K: g1 cAw ^ۮ-r8p*o r}dVf{o&o*1,ϟ?Ͷ%a,f+l<|*D@c?*4h*!ʶJ /nB4,r gڈb6B>qD9{Բr6|s"y7}z_vnf1ʒF;Cd2iE=ZY w4 3D$Z;if=6:a߳-=&)JEhffCxwF&V7hY#!%T#l.}o*E{7t{%BvWߚwza vڥ{ZSM hϯ>>>rAe:,Cr9t5*wӬ5r/ŜTEDv8 :nsXO:d"WzUp5Ap?I!}XubzC0Ja3L2ŏٱ+9:G!?N8:5f(F*DE+%J5#]s` H;5T=^9=Lc}Gp%9I>Y:r]󞱡эd}AFZu'gX=#A}(Y"ܣ'iSSˠTBs΄O ºxu/VKa""Qij!s\w>ij7kb#Ey C_ʫ!rY%Cߓ". >(] *h LHhUFj>=ޭ隫pq:$-¥i_׽R%g=L}D=\Q2yz_SH.iHg34w?3g% E&YlJJѯ)BX3P6ktr! [3+C\{/}ӭx^]SQ8o<C蔠TpxgʠY@vTfx%3=,A->荵X J{+L6؆!t {WX&A*&6d T= Gx9ds>`S$$- jgXl;NZe>ЗZﻻB!Ry3X(ٺﯯYMea&/{G,>:wSsN,ʅ.L6L}u~K,ً2sH2=f+B( _l0qdԕ9wKFqbE{Ċ ̈ |cM{t;?ɔ,u[u Hi)i>VH-x9Gr뀿"]ըtq^~<9CrUڸ$#_ YSPjOcOM dgI.QAZ $+ˑWZW_gdI PDӕBۨvjI4D: :m$ IDATųU~M |6k=ӑK76C#J~*V4ݿL/swǹY֠ ֠!I" gYjT=G.k`߿߿fT\NdN>u=ZKG _HR9űStmlX1\]γ9^{=+V5c6޸^0:@)7:\SA*#<p1͗;D| xPŻҗsaCwj:GCO7P_F9j+ 6 w\YhB,+Bϯo72m*U2nzZBocBZ*( vTgiD3Ră K<:D"k[nѶ<&K<_eD)TF9@cA.uj?wS帵>][J-*WU@R+EX0y'J65:cR|:A+O6G5u\#E~8l2U kU' povrڣysӷS;3aC3\\řntdݐ4sXju9jª!i\2G2& ~\٨O;}oMSi[Y51ͮjq߮Q,TN)TEPBtFqEIFk&1H(YqG93mClz#Bt鐋ıqW4L}J@ MK.jk Un&3BVySbb<5k֚@?3Z6b:#\*У+(v)Lm|}߻*M72VI~eI}̌KVlntVt2et;əRiK0BiLȝq>fC3Q*%2>>>H2ۓ@Z#>oTS"] m)u6h0t 3>U]ȀDJh7N# j52_#s#'!j3Uٹqa JL ڐ*胡W2C|6!'\DػtW ;˘ ?^cjҹְkmgt{cMSU8uɓz7c#Z! Bzؿ{sQbG$8GP#s_U@5.vp٦{7 bZ\yhѺԙ`M1'[DWECLEL$:& WJ3X"Z @#/Kei Sa@U4LUwiBat|rE+w!߿xC[kPSvFt.>)iRG JZ9Y{xcJaweB$鑁xe/0/츉ɞZ G{|Wɮe9[Gk`xr!D)C2 m(9u}})׸t^3)hs]{U2",AKctug۶1fP ANuITt =t㋧}P wͻlKKvA1؜.s/*$rHbPH\ /Sc+\hFWAxsѴ[@:.VNi<.Akv2EO@0\f{Z57TBw24,8KASc>~f: Dm=w$M,ZY?o>>%w@N AwOp"&ϊS@5 E|lpY;!`ΈR,"!;4\AIV PR5q Ff`D/cg{ CaUfʣCjkUk\^y#amhѷ.2Dܕ!Mp0.[F@'[!8YX?咼$߳0)>!8)S4k]|5ʠ[D -yk%0LOMfn Qއl" )as?{L&Q1޵C*˲Oq.lb8ʽ[(\:42󹝎Qw60ɀ\ҮFGHlX!yr[xv98s1Mp^Lui-] _tI%WMq12oŘ/`~0Sg`w};Ecl޳S;WV#.$)UI&0 vJ^kZf?@[@(Tbpw,fʗ j{DDW}1>guGXDAɵ{k[kOo=;*q5˾۶iWE4{k6E8߲i?8VrNE9笐5?QnkhT-/ʯ RĦ u/T8? Dü\;efɻ~Y|YHtI?@[?gԞG~+RD \OVW%GRHbdέ?Zk~rg7kh!@JNY0P kx?W 2{aЊ];-լD:icS_HTҟ M4PU73-P7w?NݠH$"hֈ1Xs۶V   MA+ _<ňSkI#]?}ߓXDy9D~iyZqYF\X^ \q>1W5B=T,D>Z߮oA܁//Ww)ҋl*o^kb^wұ؟Yv) zCRXj&<-M"j3_P~`=.D6%qIJ` ׋/}c%n7,9^{6(mcC ao*%JܥTiD5ѠVa8Ua|ڗ TB.5w( L")H" fy[)~-Ϥhwl@aL^+Qh3{lښ,M oң=ZSBm\J["•x>΁^,Hr_Ex86zmrC}HO{[TdsjdȾREd.I5&@>x5bdY% B͔JD$ A€q`bfR=.t|V+ȫw̒Lꜱ]w6FO wŊRW㰬K/șUxkA'p9xWiqzIϬOlsZ1NivN=I17zDd\lc="!6} Di~1"BI\.墪Z/])1LAE13SQPTS 0%fUև*#zǏժoAYJJ\k@~] CXaϓ!t`y>tS7דLw~x/>/fЏD;<ڋ#^<(N`-aN oozv9 "hdx N"gz!P (Kd(4!-"5LPTs;FrJ7YQeҰ#fX/W=8C]HpHG[]`5U+S%#F?E]+P1Kirbs`K5%PR֜{D7͐cFJq!?>+{+XfTP/\J[ZZ1WKt4j鶇{ϏR%4,ǫY]Wqt{v!k"3 dGI%G}ME![xF/(A9}FױS+@y켿O)qsjoy5>`f9dt\O$PܧzjV]*ͯk)$a۶#y釸3z !j^@jRHh u:R4D)|ڑҙL2+-m3+ӈu1Դ`^7̔6v2"ف0 {XDJMϨ(sbrJeZD"7OSzxq(P`[~c0 x%'󙧚dP̊][Gώ51,3vߙKMe}o5RJSq\BJbr-=Ӭm9/iQ+ЬyRz_͛uZ=mzҷw?]Gz"{`{d~%6r8^&&Y Sw6St_HnO+ckZq>Vg}v_M y0~yZ@WG51z%@vMTVV]}~~BOFVt3&ΉTUDRz,MA7\%-K8(j=-rV+'I0Hvb5 *Q0ncbENd' "RVqø7i#>8W 9޷_+Ys]ED0#7G3v93|Mv7 Xx,&k|pFTmbT$v +eg,UQԊ JP2"Iƹ>ꬸ |X2̌18Ae[GI)nQ9,ž. \,VlVX64m.ŶT JE@AST޽]:e 8"9W ;jۜB*J)N* %boP%]iWxbL3q=dDYqo9#NF[ <*#t+.e9qՈʥ? {`e g`v%B 8=B_ ȟ+ r|T/֝Gsӕ"fXɋ,숴6QϨӣ{qWnsqۜ;Cnӝx"pMh14Y~j@Hɚqcsk3EFW Rb`t/Hϛ54 Q 99s)||mgK\`0'iQH=]u;Pï0W5֧bUd8r99fi*p׊*GW=SQ jK>!թ#[0n)[c혷'ܰACVxt!u,` ъ#0\Z]:-y0`@EhbE i,2WUmlk{ֈvuo 3%8:MN02 ^EMH'KQ. ,n,pӿ\zŽ>SOZ{B Ts~_;&ZX=Jb{ _(N =)LS9%vi?>o2E[{L(7[Xv!R *"6.R~g3fEI()ro]9֫HXMJQJ)! Հ6\$,5{m=/Ցȱy HT u{B$0d[wg7nsrGCGN>qx0j͡l·D&U bZK`#KI7,ѳE(Va᎖(#"bb3YJ<;{"{21ky .Qqb>Y?8*,#VJw@q0L> 1ڴXN-nq?tkmeeu#/_յ^W-7:<7gQj?* @ùo) G8ekUp[ 7Mh-xOd7oWM>ʇ\/mRGGHAL hʬcbjpxSp'iNGtCXVsĉ-7ޥS(J5j'MNBV*o߿_kʣ++kSi&{'G^}na䰦ɇ-LMāSn[fIP2.V;rPed!1Kw»=*9'~ewzQ,Ufd{O60rQ$Ђ-zB:Ğ 7D̑0kFxGwlB `DL%%zf(ȁD@h!PEаT]Z썾GDp8rs"7JP|l2H1"Lug:ŖՏ)ImB[: SS3x d^G8D&}PO/x oŹGuˈ>(^ y/W;9Ie? w7Vq3d"rJ@0A 11].wRZ Fh5M,0ޡA[WiO{(=aޚJ{kmw7 f4Z4Eu29ـ$K@j$&x.{G)E-_N]hzK(uc@DNm &fI\9T)D7)PV&ՠT`Z )3b{o ظwÜԫGR͌.O68|0Zr(Lg/Ъ: ^9Fo)qvrt>y4Hj[\޶Rt??O۶Md'՟:PGS1I```X6q.5 y^ҿF.Xݏ_0Ȝ.}zqPxpJMa<0P.ck0d^ 9V =K0Tw0ԊpAA?V;ʑp󀭔*kǧr d\SuZL*RBVXT`jR6 Y5 `ty|'Tř5gr PO|^`VM1QR*\TH͇ttj=n-?Y8Ơܵh`H&NǾZm+|[R6ڢ.j{ZD#~q->%ȕySV7s/\73۶ޮySl?~,OGK{G}[+ ь |Ž5.xa]/yhx\x4z#4i(%@A;=+SGɳ~)*% x8-2gd=uNoT dP$& ˜H]oͤFfb*J!+E"ϠJ[ &ScG52豎y_ _13 xFI3 ) vAʹ"D2(XI;V=q 1&],oEM{0b^BQ- g8n+eCk8 ";qلxDk{l6FTc-PP83tIYļ"!*I8@ WZ/P1@ֺ>ƒZlZjmɻGqfzZ&ǚOZkC׷˻ߗUɎujo_%*2;n֝m{Y|>8nELwa|)N/={z-x:]}z81> g2[twFed}3 iF8N:“#Do ,n44&Hf +.Paθ!MMHnvwZ.ҽ"3*! G Zi(Z g0pe?A**lPL{]ڌWqaA\~J}^q4Ll |LP댾>`2fq|9{CAjVF3l"6=ߗx\.zR궑ϽqT)<u>zMnuX?o?4.>("ʀ?X_W.GȱqcKRry)K#yo}x=c&N.Htx:g̹b!Yf;0CE{ZwI+\ҏStN+1ya$bvo9<*H A>fOj;sobc=A֟-!Oɿ;?Kkm湎5 Z\ ޚ.uVI}~6v/bdS/#* C+i̼ߏZ밆`Q_8SSs]ks{7F A@=:sY<"2E)"YJy-R6\.4P3BLֱ^Z.CL=t&@o >˒{%H3TD=)4GRe"ĝBh~~^?m< ٓ8`/23 tTrM.W9ϧ'ϑ@qB&Oq[1uW \A S2k'ePHj cLRBwnfQ1PiU\^‘6+TQ}nIڼr K蝝by;k'Hͣ1sҥ`wZB$(y7zEH/ZU<4$Z8jE{7٦*it{?-=H&U;{BŌJpNE%FS4<ߺ֚@;#9fPA|] QC1lНݝEmɛ-"znm5IaTsםˈ;Rޘ}Oyʜ#/E` Y}n 'A7w+ǏzzœT0XpNq&؃?2dj\yx9g^w,bq=B^B8i0q n(47ڽzrLZwwNoو)̌<#b7 bEvH-Դ$u,(35; EL' Ɏ5n*y 7k)w[s%"`t kD88힤0wb_(A)͔ќ7չm*Kľ{p8Us A:CD𪒣Wgx6ΌZj\#jZ(Ŵ@t- *@ T N.TeR B#>zq"\}87!Lz}?{kIvSGF9{1]/o(W!?+]ou+wiZ8}o :Wr'z>E 6vYŃ2l`Β_^1>k=c0 ,|=D&QOI ǀOa"U'Af SlO):(oY0J0k\3?3$]\kA% .s[XPhP$P -CWN|P"T `QQA~<]iJId=z w{kכRJ (aEre7WπZMU2,N L3rhŪEԝi {Jq{GU 91 IDATUᙗdK EG %!&jCJñfg80EQQkX,쭙PErtUe%/;]0 %S}'ߒ3>&C^{Aƅ~y"$Tm6\8RKhs2h88p=?Ԣd[WΜ\sj$:L5/3qYas3K;;ui$ĽS45K*L^u$3!bNj|=-H a>m)Q7i="|k`Jz#a&*—`v[񳸙KV_pi)!^҄ڊw' OSg5sRya`BT1EzJ ~i E 4EFOL}6hU n@nhfa-E%CQ0ZkZr}"ok fI魗j"kꝺ+ 7r/=<p:q 8"`bqԕĩ y^ L"f^igL*Xptb/k7x$aI$ǀ4g\fx,f=vUw!2SIF.JH|f% ׹rw h *A챖QG㳦4ֽoȃ";|4G^v PTC]DP4 >{^{(\ER"Bg耜 *`ج,,)("&f *;^i#̫)\p&P{yl`nT ZQ'"yiɬd&Ꮺn ZKZ3n$bY& 9_|;_ԃ*t?56" ɖg# FhZ#xtd(B$3R{.|^) xxyxLL~Bd$.ͲO;zlENsޛ?>(a3k'f(2a'B?1> ]7ZR$1{WJ1Y*ZET)`d+d@Fv|*hd{+PG*17I1AJAnKH0VB*[ٝc0u}-s6{xrUV3o-(@q@Ԩj2d-Wl(C bG{4}ZH8(P6{URLǗ=r)W c}wu"L0mԣ' TIQF@*! wiӥēeZO3OJeT+SInMJ=2*{ )LAZ5J. :w.3.#]IeNRn3"RYXZiA'uƓL:J% Cg}0\]{4(gRQ(N_DIy(֑/t]V;=QP6X> KytXӛ#Y fGNI_U['c}qcKN=A; PV8֚{sG4 \oޭ^D̽*peWNiJ R?iAWwqL* X<޽ =VBE`ԍX)R{|t"{{Own5E8lukZcСr]BF-QG8z6ֽ@pO܃*f XkM EajC.BBLjEU!@[N9 =lbaVm@@Y `HøВtth~Mm3kh9??HMfd l!W?. zH<{B\[믿Jŝ݃ ,3j)UE6f, Ҥ](U||{ko֚eArMGQ3(ffN~{gh:wev)4>6Q9ʋL'(Y"d?^}`cr|!N8yrwT;G'X @$Ou?tl'T(%(Cӭ/88q✭!_j/oPqfC CTnE9*@-"sURAXl$s:D su&3]ibt*Z(T%]dTBv 19=3/3Tr/ 1Sw jd}o=غ"d@k2F1µQ}6HihU1=ɀEȳ\2]tRRyT~)I#w̫M Ub6+6)VZ4ۻCĬ wr"f )RDJEbeR˶OOa|J)oj瞧ݥPCzsRܙxrYIl`jbid齷RLj53HZ)OHOI{5+a3W"s"y "#nS)ZF@mTGݻnfqN`dd@U^bl s֋N6-ژ$"b=\ybۂqHZcm"& 3AY , J mmRx:ZXR2HHp PUp )6wVj J5'Y{t aefqZ8-sM:8㬬 {[~u}x^J)a;NߕFW*W47{;qM*[g2.h cy^rp,BGLKwg""L(QdB@U:1MD@ 2S pHTuiRL5h aiʢebH7![w (&ќٲ~^Us0MPQO45)W-\-Sd  ,3;A@7*4i:Уp(l:nQx %"M"MTe@) w<ncn*7Q:(T?Ja! 35Br$>.#۶ _;Jzܻm%SHRmtyEKU R%&Vtw}Z . VE5;@7I#2n%UZXV5)_Ǻuc]qb%"xZJ9N?xʪfO"jbZAzH8]ijHDp]U= i`xQG Ǚ,#n#7ɇS?< RzK0aK~HÞ a*P24"Cf ʓ'"=P#W%'@z1KUx]s%Fl/m^ѯGOH϶]mKQ{h3"Igj[T,Di}f$QC)[@DI"WaXpx_!/_ܧŎ_TjԣWENhǑBHϝ895uH)#eD@IJ1OH &6lw]V-d{|]DЂgN=oeY!h{$_O?y[jBP,׼˾ 4-VY}TB ̩v'(7ucd.$4 EEU@llwT(A̺FrLNd*+6*̓翼ȍX)ހ;ݻDG6&jɩ%}'F]ӉD튺w:Y)e-%VPUUZ-"b\j%WVa;VJ%SK%a!@sX/lDkܦ?m+xYLy{xivzo=M [E+M'zo=;VGq9q2VO+.13:$]#$:Ñ|φ3^ 0N&- '$9=E{&ڥV$#*]Uoݹt}1(yo׽l(׿B)?R߿}?jv0zh{< h3,8tAPoeBlفAU]H3 Vrpk"UkwYx`w0-a fbzL7h254t HB-B4z]r&Q.bbs)bGpo ]PՐRJ\~P/o]M6-!{Ss?zغG R/oo>>+~Kl eɚ}32Ӈ:,r7a:xr<&>9WM [oޏQE=|cH q>o$sdkGJFcz>EZ2iOLSY@2sЍl=`D]UQ` Z (S"%H &-0 HJ!֊Pw&jxVwbͩZ "*,H㷏zԢh珿[=_ɷoo߾]r;돠bnVhpx{r2oЍ \ՙbV#~)@]UH߶3YŒ-KNZEB"  kDxQZo,FoUm$An1(.҇ċ*NEZ#[Rkoju~jb[jU A;Cp鱻 "߭S𗏏 +TսGoR`}1MnK__J4{2?'''RO-('8Lײi{J|p0eݙsӼPl6Qbv?Z )C]i4K8%",5|r! I2J[-fQioEQc,!] :3;Fc "l*쮱8XY ˠ}[DXؘYIUfDOOM 3n*')RLosq^ 4wސ^;^> }To)m_Z%wf&Rٗ[|Ly9^u+ٷ^ 5^b!$!WSjјo83ŝUr_5tތ2(ynვ/!dS v'/NU}֙9|'­-,nY-*Ei $bi2t#ϧ u %?*7Va4Dv ps.p+2ϰp ܷ.DF$5:A$@BGӤ%<9*#Zv,Or{0;fɢGB{JTJhӮfRFt0ZGxC Uq#DQct^p3{v=5|NMWm+֏L!?BTᓷvP)렚|SxW6=˵RWYYF3DՊ3HIAPc0 JrLa`0"QE:dr)+A xnT$%2LD ,&-ӷzMpQU1ƶ.!whΟ?LфUUXD"G HPڮDLMUZk"ǥ}BLb)b eޭdZeдS0C/Iٷ~DuCx&!8>FvH>q%Wj\]\DPW5ED[?|<e'<vn^߂?;箲UP<ގn/gr0fPٷPWKrՋR_;4U ܈q!9z+|p%2j5ߍ-/5"S`0`jMt@ v>#(k>J 2 q0kH/36!@tS~cT*? u̦ I !TeeF20TΌ53e"_L />Ipf>^?|_~>-뫛k>uKo(moWo'1|%N✩%oԐO UJ}=՞%-SIxJSSpi!/6Xճϵyx>J8[CZS_Ȭ* əPR'`g삪"ae&sW$ ʖ g{*i/rcBpXp N{uPp}F,uҫg VRd\ao۞i|ڟZ`k׏9%yGPj[,tIo' nt5R܍n*wQԠF[K*DDoȪ!hz?DW_vXZkw]O mۂ=]a:& G.Ғ@0i)Q釖H뺍1ܽbN\$!Y'$Lb,pY5 dJ P 6Ơ,;'e\wvƢ:d^; aR#w?~tϽ/#  Sϑ#e #!qY4ҩ bXJњfV|ffȅ"*Rt\ R9!&#9vy{FD' s} Dd+2=wD;+o;$Ǟ^/Dr\ڥRߎjpv/߄Mhfԡ k%@|IxO\!+xgKrn{yΉ\ 7 Ʌ1&BFDzm"M1b Ri]x)ȱ61Gho+~9ta2exhܓSLھdhX$V=C1 ÝoYR*1Flv%)EYpP6BC9hi7!g冱~~x??埉Ӷ4Vz8t tPiD;`^Zȑ+5Uw[k*|D: #FOz$"pKڀUR‰RM*“U&>6l4 yXH$<% $D[GzKPLp8֛10qA8{x>|mtħp01!jK m F($}|󣲨8U~0g'QG6HU&<'$Nux+yb{Ir/c^F+Y1v*WKM*~?N~}ۜwV|~/{b $47X. ,;v,v]L򷳫تI&0IӦ S3N/yF$FD_u;u.`ϑ) j$g iՑ*^sQ^FD\MUϟI$)62D oc#|aˇ݇xPU֔?~z oů 11/?c=/*bʐjbFfKSՋ!3D2"cۼfI`!e:Mo,s;{$"1HB HV52TRKyIm|8٢]6Tdg, jY Rѥ۱lif VblBzFf:9s"Y˱r'vhm-wȔǖ4H^`H)fA{2`SrDdؐUlVDY@ٹ` H+y?Uśu98r|d]A3%@W/{T;z-qGYO|Y<^(ޙ zb*p!nۣ^6JM1FB&4*TO?|t&W2XT&[g]cn>2᪪m1U<U3t^׉${Ji3;ҺB9Y<7xm5< ,ٚ-|N|Xͷ^K%/7͟Һb߶OĖHdfMVA>sd:ܐLD3ɱ/G4Ġ @ĮBE2CDyJERPD酀~ĭ5Qܷp_ԛBH$!L#SHtrme5$M_ QVmuL!|uu"SiOWC76_}^Ł:h~n} _7}]3f^hPKhg11#dbo ^h; qw Y "D0nڌԘp:oLJGPRfNu]Z0m۶}JZoTh /zq * eRi%eNP2vWsr$RX)C8y%yCdRJW;xA$xx8}R.>|8=>ߏ/침QÑY3Ǡ=E}+~ Unj-een8͌T֚0YVug.)B~(vfeGtb{bDg$db{zlMwh̰2˱ iLToeVXc $ LؼZfe6(:OKϜ,+io0j>X33IT  ̑ 6)tl|L~N1q)YDI]Dڹ\οsK彎G)/@+jʶzT #;bO$$c| g'bp0(=`[掺 ǭRWߖXqcŕ]^WHTT%(!BKhu"o?<<|}9yͣtl`f ["QXTEdO&XS!f!扟*͢wdRpe&&<3N܊Mg0V@搐Ez۟>P݇?~_W_>o&N'FcfLDMT@Ιg:׺7bxBFYkeYz[S(0f5, 23s[9շ;GF4&1[o>~7ߜO^Dx--Oqtn!r:TUE+KXWOZlYAɞl#9rɐnFDʈ 7Ѫv~^ғ<;̻݅LeMP1`)*zJ3X[;|;,OKjR0Y\)THp[y-6: sl(hpDEĹeQӾm.,F}[M)eRϾFPيDb1=-oـ'FoBܟ/o,LXʠ.shF%*\[rNSϾW/WzB@I}^-{oE`7/"^rK)S/F0O^~V (ު7-K #Ϟƭeeĭ4y: WLoYD̝ҼyUmuNy^̼pwղ?ޙq;RUu9,ſ/~/~>}?J\vߪSP{$&fE8XϜg`t攐f4ƈȑDؐFy֚GeMD_>ٶӷuD3*B fAk 8*E$3&D>lb`#5[fV.aތ=QUִ("~U{ST3R-.w8 '(jE& !:5~㠧cey |%Zu;t+&q:~pO,˲TRT(#׈(>FZ7=د/᫏-w?}LA@3SiS,.l!NzA!|A 8̴LZy$HA`&Kxp>&|_>HF^C4&4C` _ulg_Ϟ!͚ ]1CɬqJL Xl+@ ?G 3'ҷu-÷@7DO@YTE(3#÷ֲ5[Jg)fFt HPHWm᫻$1&JquX*-ca AB@1" [ڶFA>6DTƖ#4)D9GΗ1F*^)/jc/"|<=RٹZ"e)̫Kט\ :9S]p[@jpz%A/!󇟀Y#?KSxv\'s!^?aj'e!}[}B fep( m|`b֤ 4d>?|g5*2=¾<>o_uY~E6ܕhaiW|} &2QEx1NdЉZ4&H0T( ezlAβmϲլʓ:NR( $=7'#JDHXT+kF9,5$"F ݱVZL} kю.Zu/. }O,3ˆ8sZ\0*=^k$S'*Lք) +!%ե֖)&ܬu&KZcJJPQ+ {IX%㗈2EXMD]Ԅ ,ʱ@󢎿QQ8KJŒ#7$\^K*…?f?BKn+(JW֬PJ&pT4>Ӎ^ɪyu_u b ;o)78]D-^ܓ^b_j&Kї_5(ʷr i QL)sHG|~8sbl^~7k|~}Җ_Tbadg]¤43?tUIA1LLhJRIEE3)#%}JD#,SH9I5N"ldJF z#[@jSbcn1fCr!Kv>]ܔȈLa!"Eh9u#HE+Jf+{(>}Q 2M:hj$ *gJ!lix-e4)FqufE{޻ @fD1 @yF:*.&*=dGG(NIA9r;vm[D{k[zE rF0a'1gFn)J-Vn}slo3_,_d'ao׳ )dM]oKo]3֏*?=qy;%O>W<_֛\*U˗M|{UOyn0Xk P%hWwe633c5ſݟ˿ŔZ?, taHkVQ&aro !_7Һ!b{*}yB?k6kWJB9"#)L"YQ;Z2vEuX0.lT\ĥO\(p#qbkE(VE"" {j}. V*Z'!³ΥcU bm$T#oSb#s X8IJd%EDx<AHQ:"d`GY[>ֵnR@U5PF&XSQI:8rI#f5#._U=)ʌh7 .IYO4ߋ 檞-1#\ }:[BHVw·Y =)n75ɮ}UZNZ!VZ.wa˝[7 .|3=xW\5&WDGLޔ{K-Ƈ woǯ~auI37BWc6URuh 5V15YZRKN01aX؃3J|չ3DMH#fl9:H/o_3#cZ͠4#}Kt0++iytL$)@das@MTjR$Sr}=@C\{02YIګtm͌BMxB9s "JJkLYbAă#dgny]G-McdY%N 1%|8V+zc H 8%1zmNFX#9=xU;sr%BPD= voW7_RvLK|y\F 733M0.^v IDAT<3K3I%xu_w au+jpx7x?[:ȁDuLnGe@HUm1ϙ^{_|83wNtdm>(Ѣ!EU'fbrnu.:gnӑ@w"hު,cUEs6rC%)5&DuQꚫ3!zd>Z̚} f.8D2#'w{*Pq20Tsͤ&HSC& pIZܤb VB%5B ffY<5a Mm8cmPBr 싚J..RPJd~wO{Gqy{xI`W}\.dY7RյO""q!d'C;ݚC%٩'2Oqm=ϿQ{Lp}/8b%V!Eu2J _k>|/rh_?.?~\nݿȞD5:!!IƍD਴OSXefӃ3 oW!c!IͦPCE!10- YABdeaHH4A࢟wRM$66 cBLEZ r.J: ƽV'frFnɩDsU]cpop2E $$)L&^|&ܭ L`ya~ H")֞!pIS-Kv^/_y* FOP"y=N^Rszk^"D"<)$A2I3F(b=ψ-+'֞ood?g!ɯ$ \{ y$SP&U.P 0R \z'Y%Jnqg|zUlށykjf^Yz&;>tat-Z+K0+I@ H/DNp!?.o>|8?ȇzzlt8=~9t]xw[,mθr,Sۘ6v i#1DZ[BT3%ɬ{_ؚsƃ"MI%5In*!E/)FJ~iDRK0M\ 羽t^÷ !&¬lL*Nxd"PY u/I>"g> 6ɜĎ`%-&wzSBAֳv5mXDfP.I3fF *K,Xwk̨"B]u#m*.@2\ňmmTfejƢ]tQ9~rL ᥆e;HΛ4+^xt˲O4襧@U-&d=żyBAB Yx8uvY}?S  '_|<_|prsd9tiĶqpLfMx(G aӑW -jv OYeOT޴OG\H &AwhɫE&n]맳BI\fOT},3g#f^$VmKh -U+Kkˬ:.o9&(=(EwFBreSEp#)98I U@LT)3R<9R6/gDP7jJhHE96CDr)@XlyfGD0 RwETfyY Wp KYθ:,KVz(cPiUyZ21bsA0!]3=6o׬ LQTx- A bOp}o + @YAP#}>7KX%l5'%FݏVz @-*ƹWŖJf «j1Vf"&f1 n}0o-ZfֹRَF)"1 7""ʪD|.Sw|.W쏦Z7%ܹ%UC˅;_x y1cmzۃPU5qe>]ݾYIݴ29j߃V\I\Bw+k-tƑG;3c;c4EDAe-$c/[njԌd-YRfr$F*i&48R7S#J2hf˘Y=D2y>#IES0WT{z]en#YK7$rA cQV9zMiͥP |Pm3$L* A#$U %ڛބ7E oAU!KOS$ZEvT܉YUYp$TuMyi^Wz-˪N#CIك+(3ɝ8Re3coGݕ=HT}lQiyNlM8Bt1Gb)IUU:@pI3 /hxp֯nkt:x.ZUto%HEnBk}ܮ͏kK+Y'Q^^}_UDLk'ͬZU!JVgP67aޗek :ƚ%:yǬ9.7Z-=p-5Z)996XMD Bv@8zZfDSU[)J,!,ZkfTGbae9fb<UE蔦~!ebLljպ&!za^e2[={-e!g sS6UbMD[}Y qA ݡ/Ӡm23=Hf>RFDefQ +bfP9Z[z7Jض6 e;<ƶqFluWJv:TebβNz z]Z`jxf@M8 D(p E#7=Ĥ2f,\fvݐ0l[}9ODo*J79Ucl_tD#Q DP(n' 1) XH_՝w{[u[竅\9ޚ<]9tj`P.7tp0Z9Z#\|dsqR޿BF3?~?tt{3m̬l&jW@mvܭ-ukR0mM3+%~.|Ϲ;PoV,|Nɽu%pKC)rTq!YQshffu2~f6JE6!,Y%<2ޭjT,'[Qc,%;fɷ  SV3b{5}N_:RQYE1"Ef&  D>9-<2z0Z[Iu6kr>=fn (9慓{<.>w_vLmػ.Gz/Y`orc6J2ձc2Ґ@e_# &ۚ .Մ #ܜbRE9r7[gD )!SDT$3%%3K]COT)|6>} -YϘq+uí{מVL~T޻^_ tU? zLT蹧_K۔>svV8W#g'ԁ}^a֚PN:+KQfEm4yE-T̠9~Ol|r}Ɨ<VçZfE$Fr̬] ڙ"v~}*FGP'l592E>̀WP8$Nnxz*V̀brF%0ݫ_6:S9&3d|}Y.ԑ MHy.˲.K$EGkmQվVzyY/e!ш*BLi 8l1-*$ JH=3ݽ{r@s OVB!CK7u ۺ0KQhpL/+߿= YH{B1*"J >D޷ݶ}&pj5UEPʢꬍGZcmw PAs%afDM`,nCDMrqjȃfT#< gVQ Y"3w83/#bgmR%m8 ݕ=ymo{`e- T츏ںX?l&KEK:-Ւ('=8V^5FZXfV׹ءXTuE$ԯ\_PG"))$?2ҧ"E\e>O9tjh+ݣ,t{FR"3B(ɐЗl $̪]PpAӟI / gSbq()t1sI8&'l葠,Tp}@ˣz}h#g]q6jy.{A"'E3"xh;2J4ξo" ,ZD2 U^^,^LdQy^x!KPjJ %f縢.[5́4Rjkf:euob EPu LQNיH(\?`^ W<%`4٪- A/~~}cfE댙GCHS]X`ef \Y[gIpEL+?fRH":!eɠ$"!-iZ|bQmTy), UV,+ط@ZVrOSev*ఁRxFd(b~m@c;F_փ]Of+|w}J-tdb>A IȑOG-mI<>VԈ,zi#YYR8 ^"Z|5pU㾩sRL\Ta=e'))"k$$sLeg_a]fo[j?,:T稧rk~̌ \VvPDLy5{w\j@d$*0qdt!Q0Q,Yz{%D)m{1af|qu_2Q 5%NxFyNAI,H'3:UJ [2/$"aR՗L0t].—;*8Y^Qd󨷃ThˈmDt\Y%22եn953 g ]% f}/gAA_~6=ss|;~1@$uԩ_=Yud?_NG Nz` DUdrI'#=U8U|,[3 /3,nOO﷏߫}fsU|YUT}eiL #rFU!O"L*KdD,R8 &@{Z ΂+J$"ęI*XAHD-8jM̴9X+0`%"N|ݻ3Kֶ],/ZIYD, : M[្ ,"f;} d1] PYl96cxNO#*,m}1Nd5+F rI9JL2"iEcɴJlqDvzޮUDe$ٽK(.xeFAY Ѣ)l2xs[diLyf-R,`22.38+T~6:b3לG:Y-+ks[# (QO~C1Kp+|("{4O$G=׭p851IW}qUO{ͻ-<˜2M([k‚D\*rF3UgƁяaV&GAv'pɌqUs`:Hw^/;޷b(o)V NPHFt0D1)"ɬA@n6 RBmX9$MZۭZM# jP% /C4Rff$>©ADfHn(t;}>S1m`E$Gi6yc|E@ 6 IDATHhGz5j`wm.뵿?*UEF0T"k=!ƔkSuO6=zEç<֟X"r.kq λз ,OF/Pyn,rX\|j ix=Tu+?q4EyF6xBLJ&O9<= D{F+=@2PT\V5߿}.^BN*_B"1c PFFV+Ղ[2FE GPf넎>W/*tPa5xRf{'"VceՉ < XhJgNZ6uR7c.S%Jv|"FSH f"e,6Pi|>8cBH2DR*i3}'ɉ·a?O8Q6i ̅D-<@GtP={~򡲈Ⱥ5=ܣaB(#2br59ܙG`81k pT$9 RaNdo$a씄&K4Ȭ?fV]"3חuߑ X5?$rS%z**2MSBjYO??7 _?!T#P%c8+ psS$% @MEts@1ĶaV`2K7~L#BX̅57(Ft`n%p0@DTE9ong.nXN'dhnaCd&VhcV^JrB~꺉1yǙ1-l=Ga{aIo?z]۫RK9H Xq%O " W9?OX*ISUV%zr1~!J>zxK#p=#7Ee]ua=(C#HU$ U\!L"m- kzط)P A!F7H ~n9AXc$QU7EDLG@PAGGiF)(\RQfTYUD803/m!MHeT5vH'05Iə}̆39H Ϥ2^ Ә;Q& 8FDcvx nfנ!ݽ2U;ówh_Z^ouc&BRq2"FUBaQn Hao,(d`FE:@QAq.`z< CԪOD. :twyGO~,j5~RwƇo8up ' 8PE?#㤕$>fHOx"o>ϤfdT 镖z%b=#QT 3Na(w>ulRcmUMZXSŒM*KW},|w$q=gX[: kFI2==$J6YDQxJdmK[+ Ó| cR@IzyBΤD-]I &H:Z UEg{Ѝ  J)D2l214i@ wvp~hmukt4` 2\kvl "v@ ڀʹUùweggKwR9a儬)8RK6͓E le%1}|zYc;P&9;",^jGvwfa=(W'< RXq85V# -f3o%NVSΙ+Wte#FOr"jDuU;d90΢T:pt#4Z\u]WB*+SEIDJ $r"[""pGAtt3bP5,CD&!3¸^kk"Dne,Җ&̬C( nĺ2Iiff ^&XjsFXVE2$ẴL׈kɎ BpQrRkG/F N V{@"kd"j}UV+3PdwO%>Ge!T8((":I`!HEy5w^pm88,nĩ8,{Rk x *=$)vd6܄P:pSI@dnu"DU,\rf֠ҘDudiTj!(1?'XṲJdž1j&>H8u;D" Z֕YߝT z{{{,b5ˌ)\~{_f{w  E)[dzfD<,n/˲,r&zQi=wdU28"R^шO>.bA33,2B%(R:Ir9B9[af "Fa\ y+fTVc)L{'Й% YFD%EMY R@I.MUBR1>6o䞈ju%݌ $MY:IeKҝ[xhdTX @%WP,ǿgTgP֝FA&ix`J}CT{m_ls> L^y@Xz\_Bg.r,[km]4Ȫ)CYk]ۿ].۷]ֱ|[e6y2!.VCTI1 3m>ϕѩ8E˲KeEd^^^^^_ߖu}yy-RV,Cu|2eY}߶-3mi?^e(v9w"% Oȱ]ݻ]#4<0KȺ{.!t23zXF Ϝ0oٽYiy_2(RíJw&. XԮ{ntiiuVK- W͋$$0b`{'"}E߀o/^ܱo[6eYHxr,;T%*EPT?9%pR 3))!Vll 2"+P,fqp"ӺjDԁКG/=lS٬'2 c_Da":Kedv?KȤMD,[ ^GgB@98-o{./eYT˅G-IIi.˶x4%n޷2`}{݋ަ˲\5 l^烠-G$.+ʼnYdFk{宄(uwOxSV`$?{Uߗ@1 >sVIqtΣmGc}b+8WDj(qX u}{{򢪗zmU{Yck?pZ䤨;>k(&P=g]}s{n{9@9Q3N\}Y8Dr fJwDxpR Gq(2(pR7K:dq|ZU{Ԙ:\ҤÁ x%CInKXMQHy? Di2r<"UH".G?_sw?M<p)Y4ӱ1(C#TEfPؒE B.ؿr8{O}ߏrJ03K%`JޛG\Jѕ%4-9C8ݬ!`_(έi2~#=a-U],s dJ PΏ-9y1bo{=3EW1d>{F,YTZVXe {fr?)>fa^܉UH b=[HRvQQ;^%n{:{7bU #+X-ˆ N4iLMHZ7F֦dوC:xfnG=BTp>1KS\#pßwOmavOh9!Q_Ki[.^.׻I݆>>nwD8ݏ>tbJ0 -GIA'=!NIbO/9돀/x"Y y Y `%H;;Օܽ;CI Ee|>n}Q3-Đ$*X5`u-zz*rARvX޽[rULrwLj/io]<5FffK@!v62{\^Ѵ .d}m47PThLK!Py,|8!?}ҙdȅ#rm:uնBT˺/n۶}DAfmwoەUXti Lhڙӓ ,BD)CgRifԠGrYOGD V[Ci33%j~O/']4rn~j.f?Yc\QL(i> /#G,ʺ 1' 4Mldn_uTu]++x0BqH>ޓ{^+S&zbh>[Hs$;XfҳXj9C{K< Xaԉ,3ց)bTl4PgnLB{w߾~mo5=ns#Pa0"k9E[9m_ebrNF3#@)7j8h\`aaf?[Ğn1AN'a bԘ ee;6c5`t/o=D)\? }N#n C*/i1EPSZ/I==lG5t,e/l~[OSOj:UbHȜl5-f߾?Oooon c˙6fp.k"iur>e(=p)5t5Kz#KJt@'jf1`eTZ[&!5KpկFD0g1p)-1S%Q ky"3-B[HH Fr8J,ƞ IDAT4֯%v9ef#M d2 2O(I9ŮGv9)HaIVif$a]@Д:zxOiyD)ҋ38~ڠ;ID ZeF Qaemu}ʲ.K[iʋ&qJHK28q=,f$BTpB|3dqPU^2~b'nWc<KdMϬG4ѝ\5 cGϑYϕ_vW9RrPIH.*3 Qj v*ТeR 9j3[u6Iy.كUt$A?9jT&-8%~L& .Y8Q>)t:%X A +tSICDD)^ƸHNzuH ̔jMT+֒.31:F +Lی;DQy~gIbima]nu|%J%z"A}`Dr4A"MA}9281v>%5ʌPF_5TkUxĎϚ摸9xH $'0(js>e$cd=:^Ꭱ_1qP9#Y<n0Q Oi*;`ez7T UQʤeo]. WRNŔDP9tviH̠=FnQ0q\C#<:s\9C! 0 fF3C@*b`NqimwC.]E-$`P G7Dz}Is!>e,҈ڈw||(2KPETyՆZݗyV,@҄xDe&|`hwъHGzӫXTe.%=HKfHMerL.4~2U }ʤiL Jc*kcVYk#ͺYF߿wtcWZ:BrYÍ(-,:P<#{b#ޘ5# Vy48.DD& pIR0IBY=3FdϬs:7y* J,ϙG2lsV6GۇIbuK&^Fs]MWZGuDL/œGA*Jy@Dۆ e ŀ'|YxSgf}}%Fxydx:L\~ba$r2d)& dprZdΠ~湠Bt FWf-4O@Pt &(M-Al m{O8HM$#bd3M&m۫`p^_u^.KDz(YZXR֣Тo}붴19,T4QqcBR52 h0sJL0f'q*,fL-sv{IwH<AA^gR zͷ( wHdHɬ$ATU[ʣK^;q%o[7 IHE"˰B%@'g`E1 erTutSUm߾CΏ^Tym Jj{{uÃ#Y?z;Ӷ.G#Q@Y@ͣ[ 3#b6>c>z,HuuV z:x*v7 ~d8WOòBgY!ȧި##>⬠)|#1a[|3{~ҹta pPYo5D^օI<^!!!-J}@HDfھl[ifD҄-tz.{'фNzܨ!ҧڍ=8Q=Y䀅g 2HdTuB Jhn J k}ۻ7Y^b N}۶o߾uy{{{}}}y4asYmh%' F <'6i<gUȑɨ|HDJUD| X愩xLUeAg%KZ# {D,TT3.4BPكD% p(8tRft﹝ 5\5c'A7D244‘p}. !tĪhS'yPГeGftrdN|C젝ٚFSB4Lfm[RfcwM%E 2'8>4)tNby,q"a1KEJɝwl͇CX2),i'K1L_N{(>}f۷?~mM[`͙z]8,:)yag<^B^e"4ddmVmLẹKt݋3N҃) ?QIrUS$"*@w0zY6yh8DM,m%L=ICבo_ot]_Tz-$m>?>>~\ŗd"H&@ 7"z߉Z&D1LX"qbJTdemg`&&z3{`jz9 rX[Jb]Rc7EdՅH0̫/^hƿB}ꎪ !#eimޫC6'SHiȚg9f˲\kSʄح4cP;'Axֲ)҂$s' u fǪ8ҘTLҟ/pEz%O`/όsIu 9Aj}c59/>"g`Dn햙ZSO$֞! 3 ɵ' !ޮ6!C$I)!WvuH?B%DTGAA =_v:`6OfVC>^L3){L#8B*CG3 K۞M0dT!CHtmoCU#BHu֔x!"wv?1_). JPV %(I$<qBニPX⪿II9,CP4Hd'ZзZO4AH"s.NZG۾>gѶV_=u(`oBz5*F7iI M W:"@6xb9?g#y9˃Tq{D I!C1iuR$6k Xrϟ~yvTHvk**񟞾S\EtkR9"(j2kA+ƈqSi@t~iu3eu+*0RRD'Re9LLԨQR#Il5lxz9rK^D+Q!@I֒qB bpr'fYcFv?[C~ifbrMIbkm[T|<2(Ȃx0߅«i-53i+Y3>XYrIwoLS ,`:E\sKL3"(P>"߶RT+;qǦYg%'zE,{bGvo6rߊX,{PWGD$46R;R^cU!@'`. ]qũ}nv6G.ݛ|qxf8qgݯWg,㲙DZP0iko{+U>-! F_Ϸc{{A *aM?cڦ%R[QT693FX8(wtYբYZ҂0hR15[Z]%`&FEN2ĩsTdAs K):3H)nAhNU. (y1xDHLFjZ;T IcM)VJڶ]Upf!J5A˽Ry2ݽ̬iSQuE4?Y{[QQdE6>qRŝ!dS- R';U|@ =el8 IH?}Ok-˥{8ap#䏭$̌e| f:#VpKοm[q۶ uULSڨߋHmۦ,UԺ@ooyBQpw\ |fߜcMTn|ޥsͶK;~>>%n£c~Ǝ{DDJ3Xd&`a2Hmss"QOU5_fMGŶۥ0ۆǏ}#="1P$"{S*!G8(D`R &n 6UETT4%(.M-$nsm*!u9*ޯhi"ԞM3D:&=ﴧX ϝ:Oiawmm{߶k~-t~Z_C5;#SdY4'wFrWÀ088Z3x"@@܅ Q¦H+g{aoS[x؏j!Sԇc~{+*:dmƔ W@uQJZˌ_"t$ƻl:δ[jNWD=ܛ _a!ϔ:+V o]j0z3L֤ > j 񶷦?x/W"SI63tt3 ofNJaµ)]9j""ڶmTC LaMd{^DkEr4  TY{K|+ǀ?PJ]1S% 3ȱ7(:ySgkmD*Pop\ L1ZNwofeafpF)T%{Tmt~Xos ýT`j,S=Mm۶ p<>?܏}A;%@4~̼|B&MZU  n PX%>׭}|\?^s{ir}})zQ>|,qh/YL"&\RƢ<(_+yܬYyw9Ui${X j#Sw'Ck?GdzԿ+3336dt̢"!fc"$r?C Ü;[E9떏7Ds+T45G`#1R͐f5 @#֚,^M2t]m?HD5Es{wؾ?R"ك#ߓ"0m 3T60 BƤbft,,w_ `-)b"C0ihc+9m1 ەRkJJFǁ !%c87X6*9=bl>"R w ЦeNJ%YcQ=bt$R۹11ER&TH x(JYV3`ye|_CA0cIF$XIkq~q SNdO!7~j^SoN؇›04JQئס=I'r LQGR#x! rAk1aU1?LhD'HzF)B 0U*"CTNK*ʖȇpHW ~3aGʻ$ztW澫r[SC$UD۾DZ\?)-PVڍY*Zx!k2U p;lkF~H)Vz>)8P_ ڛi\DIqp+P삉hPmjmffbR(@C IIawA-]!A 0,oؐ:KB{T/Ϩ!jP0{ "¦Ba5J6%ZC .6ҝ v9g8O S\9DvDF"YQZ¬g[s D(HH0 [k([zٯJWl!fi!qF LtVS&*6N_eg}Euz]?1)PR<(-Jf5Rȸt{-9Oa_K4񶌙wsfp)  $N>'5xZ癔پ3#tzx?'[7ֶ;N)FܫN\r[V+]n_ޯU#2% $ÙBeH)^Gw G*W4TL+N@?X Z2U 8"tɔ Pjp㲉ʬ$ 9uT)412wܹͪuՃDz796$i(nj(xKxMX v֪fR)"j˒f 1`M#ddwx??~qdk46զ#|ڽ{5iJȁ IDATԠi5)fZsmg>ȏ u5C~H*UEY D~u,(ӹ _dvLHo۶8s>?;!.E2b 8{\j{\i2|5w>o^&-i#,gHD+ B6/GRi+˱Iƫ;0Tn50Iф:Z5ijޏسWK>᪒šI4@16H!U@eif{FQ`PVε\3 iN6 (ZJhr~)Q<&efV%Ӑ=Mb r+5h]1`څUl-ٜiC[Y65g!+"MMj 9sJMJZV_E?_׿aZYPpJr: VdZYO4uz<$$nJSU$Qq)ˤEk@zzKp?DЙx?Yꜚ?̔oV@MX͆ -l縆dvȧ6XtDdH$eL}I0H=#c`,DmZCDqɌk} uN,2bB˃N nw{m` J:J,x![X% %KU^k\+1aAh6cH RHEwDfZJ5v|~~ޅ _*z΅n[Qr6bVo J-w2MIn(5'2r9)*aL513????_x@ZA i9:͡#/jTdje10$i_7v)ƀDs>5AMlqV0Z4Hnc15>YUcMϗyb,P(7BCz>u-U G ?jmU S_]ףwx @D?51N@a}W-׈\Yf9y%U) Qȱ f*b!+rb$29* YyvKÎbdHL\=ٱn#k(%z[KXSmįLq7Õ8Oo LoX 2D,- %ueȲ5uu&[Yuksj2fCJy :k3-DO L>:NV-%j]G"3$4i?| 5.}̨BzmCA.BҶmɲӫr3b"?ݻGUYJzzcLv65dT\MQ4fV`m̔&hA"! v@ ~5M73`jؚR4B@ٸ#+HڵAaT()E,;PnSwuzg{hĔqִ=Ed6KW =fVL8LԈ% =Тajf덋Lt!d@2HH¸k$N-_Sߏf?7UsRVν.mKr>uΒ+?h\_hDzI7_wȌ?V7T⁺?D;`.3W]0O kv9NȮbY /6 @/Ti^[똵;ֺ5 bVOQ&8rw9WJwlA6)"C<YaLMഒH"5CmBj"b ij")%[a/KVpʵFH ,8 ,ͱS سrkCV1Ѫl관XiO(|dh!1>5>cڥ6~mVaGQYTѪ!i)D6 o),RUy=Ț.^"K/~6w4"ew?f62T$2U5\[ kt?@(4ԚK:sLoIC,khISCxz)Q2$wS9#m1/ϲ[++nj|*?ݘ|NY<'zݧw v_3_d@)Rka|NrNWyufMxdj|%nfPSِW zzƂϰl\C#=Agم:YmG9xi5T/7Zވ ѬPҸj)H3+G uDe!@7w2Mo ()$Of8YbDX|c&˜ձFt%#B*Qsf6䭩5&8m5JdD #c9(m ܊wK/;)K\ {RԻ=GB3K@IQEB65!)c (ZIJp|??σж.hKHTi=Ǵ/bׄp}PbԿKk7KZ} k:'/@_R_y^>W,YH),7g\!N[ܸߗ-WgPALm&Ha'2kAV_Oz3jsP/ؘzJD$Kr[)|k"_d3mTd$F*s*6i.Zma `.mI^ZRbR3uL?|VaLP5T+v>d_rbKSR=cܰy&C?m]D^T&+ }87Wg};oTz| s\fnn㇓8 L`bz'eRk(f9rTH !RfͶ]6:%r:ZS 6lᅭ7$!Є xՅ h Q?T ^w*g*T%7kK-CH[z9h H@&* i <\2롧6PҳS>3| ͑19$D '2F\D.tuV3̶}S u+m *T%"0X=-&Z$!36m[/515ݬ0ݨVֻr,s%c;Mj{A_ EUgUp_2-!eB{8^/xK/筏 }}2igjJ~oN`!pQPኙbL]) ?ھk( d( ZSmU)[3!yuDifDĦ}Q,KBRR=P6f&ȌXX ZSFsdM7Ǿ(;E`$#\mhnL&fV!zJAHnAͷf:r'8υ uj];AG|ȩ*l3mmߴ2q7\gC+UsChڵH~z{ PXw|?;[&]bT@*L))dU<男L֜Z8T8!,nuhVٚKJFlmT5b6Yؚ[G|hEOw[Z*۶=g* Gwo+OEkmч#+E:' .6Ub{3R"%k~|x|4idֿzzf}<;_)q޷6nl(ex)Y[+F s¹\R?zЩ_ k[ .;Ds|5e|=~yL|.08{qZV-blWeqkܬVgdd7"I2II"W?"~dh_EZ(Έh]vzFȁm}g "[,`hJ kE-$H!3lM"#B@StYo?~DHoR %=т+)8lU][x^mfmmKWp~[=TvQlvzv/+ 9\uq(@ZT<1Zv{iQ7ƭ6~(Cm淎Q􈎁%8܏bM̚8YkcfH9U"pOǘQ>"cHEԒ9t!Ϗڴ޸OksoOG<C v7e9>Vߚ]aUܜ\H.p FaB;APp5K$F8ROqJOz9lʺLsQ+iQ\pL}Mg 21ggT:(L4Q ;'`e)JzG&4y\ +[jm5K *=2dUed%MTRZbgnրPL܅Tʪ'Pm; `;l) kֳg__7Ԫak'sqUXk5PH12&~u̬,%ә?q|P(ZkmWLF4'NY{z=k=-N,Tq&n1gy" ][RfPX~eZ yvGz;sy'l8z-~zhRnYi7y̲ꏬt ܙGFg& `6nGf6̤)X<{du0]S\J II 75mfHy(.s@^ =E cQ dBIbeobQYY @,ef")62S Zd'E'B^vm;=Y$ɣ\ N7ڽjCO=ˮ=λP5ce* \P`CE7 ٶ^E|mkkz?mfgr\.oo2bJCU%iwLꦾ>v_WaeR^0uf_fi0-gӀF|SD*?& < gSHjK%pٳ,zfdn~f g9BFWū"c|>LT1E_Ŀ|_2v[&.Soq@Lᨸ!ӝ"$L "7`og*3)Mۨ U7`Z`Y!Ib4rEyÓss\MREJm@W{|\{SlfhI'5d9}x"zu]T/P6IVaݜ괚n!8Kd$T 8 b4 e)zxキZ`~ʬ#D{0~~ן㳌qm,Ak Td:c[IĊ@2S§".8& c7GFqdsWcsToJEϲ7N9U|9:_G^Di5L IGy}px`1,sT@B4+VF'v˃ r2%[uq (y3a+UEJ8٤-Ly ۾͙ G0) Ֆ3e=Eri3SkyȵR#[k @ֽ5m~>2{ۆsa3=z3ڌAޑ2 *QNJGtqXFj!$h~BF'I/&K8W~TM,G Y1 "zwO{?႘X/*aҚ TSWU2^[ * i "Y@8i DO pS9YpNb,ǯ~"OLJ|;/X~!e{JDecji0̄)ee"c1]$ף^J~-ՔT$SST"Pml= FifɄ EGf8~J&"5 S2f]"!_+E啘iX3kWP$lDGt+mGJPou^)W_GQDf%RW{jD=bf}gh$e~Um>~ԇ?3LEqhV[rKyTzOn{9RUWjVL/e6Y|QE٥}~8kn#~=W.ޔH̺%c 7SRN< 3*"LFK2]cDZf2C*v!b)H0J7cX(Rc\SAtz.€8Xq~[^~z0 l7x;Eiܷfh&mE8 ^Qq{!#ϵr/M`}Gwq?TLAo*0t=I Zf:55%rk IDAT͒R{?[lZy1),Md${8((紪1)sy@c7(NfCvܖ.|fr#.55h$jkyTͩHN͛r EW̞FԃöAJF3*}ZˢWYwayoP^ٝUc",„K+e]7Vi6zˆk&TMNI1K"Y?6Ĵ{Qf`іEwFRBLŚ3?2ߠ C=Q$,4OTtjDlyDz\ڦLd~ܶm.a)2P!6f5-'(Qx޶KHdzd)|Dje`ݞfdRYR]=jsՐ?m2:Y~jg&-!ѽkeA2iLg^?(a*͘pDEGH(w9_wWʐrJvR lP2Jy46VbĠʋj2"bYmpdw6TTjDѮ$FYխm^KJݬxwHR7e!LNJWceIWO֏c߫KZey,<]D]Ϧ IM5{5öm=6@*|lD0]r&N-eya+P-mϮ43ڮ1hOM32[kmCW9rV?p?z^2WWkZݨ9mwJ-턂u>;TVim=4@pN eݦj7'-֓{qԾ_άsѶwA)rEpr}gz=#630o%K&/]HXn8>GuM*oαgƓZ+odNO&)J|GA& /cTn KN-)H @B fh5rOD %5M1TUtTU4jJEmM?ŭU G}e;K>ˣ5+52v1qx~ڦooo0,==G`{}lRIkJ"PRm[r:ZjވVvsdz؆W4amc3vowFOdhU6ՍT#)=p BzTp~9WHFR 3%TUSkս I- C`]Xj~!}O_5z>LS֟X[sɳ aE{e)GLK+Lz`WHjFGG״Y-xUh2 v8Z3Y"MU7 YvmkdcPkݡԒ%)2v% lάiMw={Ow^=F@ئ:v$BiЬ1\<=ݛnMBzw&Ԋ'j&Ȉ dE ӥ*R-@̬UiSzUmI+GҊ0U3%6tH!"mm7!'ijױXUU}, S[uTMm3[Ed>QF`~wسҷ>qD@(Wn/CyN4\֓p6E6`W 5})2{ݎ|u~@aKZڊCX1y iLfZ(׸xDM͠LImj;xـLA`(RIda*$DjMgf hjN*))"zeEmlY{@.|gSP߻X{zl@FQ$I ][*5^F#yYWXF]Bu'h*16 <@4U! Dx0H1֗e8&,}ۦ[+ @&Je}ynMI3ڶ:ܽ5,,,W\7sxYv{P:ѼA`&0u[k. jk=1Rbz V#يώ:VNeZrhThwd;51=#gF_O#,ƷI̮3^뻙+c//|ھG~6[U]}r6I1 ax+OK¬% 2 rl#L$3 I +Vٴl["=M"AtYϘЄCp,(1Қ*JV!h&4u>YwєBb$4D B.sB# e۶mm;GvZknUOAjmn8ݣKr ؘBTCԂR9Y=4U4AUύεӬ~ ghCv"rt2,ozr3 ,*Ȉ(_nG5=fqx p"'AOʊ[sdSqc #vGQteھ0AD vm%*"Z ukzipU|fŲ;kĘJ5X"ĭcMv AGS4SP?pq$Wt"Uwq̚#A"S9iemYGEF 9ؼfY싿u]}F*r+ 㹶]R #ߌfKfPXoxFh%Q_yDkEc'U^ ~ ӭE@`%O6秱EnNԟ1=,|.^V{_Z7~Ӫsce\|m(ǺWuSGOu@n ;2kD!jN^^ F~Qz.V[)x;?&B˫ i:x9Js4~\W.5z`LRP`QXB>`:Zwo WDuIhލknl(:MHFu)zIC(\^ -WW-i%G#hsUW%[A" p *UĖPnQ,߿mfޛG7kTT*ݛ&kBGY|K?9<ׄ?32kl0[LE;X) a1sۍ 8 )4wҚ cXzf~Khe6fz\{ Pɱ|)BǿNVL@?{S<??Miޖ-GyX1rg{di-[z#~N@v6ޓN'S:~Zy!2/cFtvxp3KvG`j;Q7bpݼ^ܓGT7 }UkmrtTRÜP,np BEUtG2?k-e\rVi4P YFQ2%13Fi ]/MF,3hD#r;5C3wnJʣ F~2o|۳]mMU3"RcmB7iE{OiG12`Ugn2[>DE}e F˪ f )d"8l׈>`Q3<^^$.saffu6-!7^tr'j5 {ӧpvz)0LNW^3 p~^}DݩrS$^'mc$$G] ^ BL$@3_hC9 Gw};HRf-313 F.nNDgSd EDfy> kPк5}iffDd W2f$f5?{ofYvىjfFnJbWcĈQ6;Ѯ[:`|1Ydq_vj40."`-e,3F* J1Y"[u'$v61dJ4?A6)R@xJPd f)B`&4`.8f|O^≪u,cwUt<>gt fFFm瘠P6ιwM?Qv|W}h4P3?omGe>!('1:vf$qmYinOf>Q<ONv&ܚ-/ UiH9O~\ݬ2 5S+2tZA[sKd,cZdr] ߫<3G1;ݘ_0DP2Cª"[%;ᄛ tDx*H .ئ 3 մS_=IS`pc0bo f/uӥԈzyXm)0ccZ<(!A F@ݸVWZkkL(لMY[jt~fx:sCp{e]d\B7X~@_{Z[fzw~*'/qh*gke:=yWA!pr?nWO[)Wؽ{R^_X\:_ eh,s22UtzkфCmcddN-s R`s (\NmZ8;gdУI:&9fpi+gVV7椳 r!c2p5͛rєtںݍ@W kVKN;(51UW5T:_EbkF Iel9N!"HQ3g)` LTLd9=JQ¹?&s"%6yiϬ䣉?oOe VX ngZ/6w۳br@RF'megGJVi0Nf[r!w^cfv%ۧq5'g'W>n2D?;MEGŶ/߈AihΆܤ; Ddj-NT^QwX5fc=\떢٠ezMSޑe6b3Kk}Zc]yR.&s6GsK_-__ޭ7U=xe֊VfPY*i%poMIeAl*f%5lk,27p)*C:Yu3Jz,CBvLɍx0U=#gZuaAKt2^ip&έ4O#Xu.ЀuLYR_oi J'I{AD_ZqℝkVw-5w 4۔z:YT )B\VSvz'; !u@ˎfwѺ[R>̽Us e ۜĦr͙16##4ѴU@enּ/YpK2ڤqu]Etllh&f ~6)'%\ $yY'&R ! (F[&BiDQ۫m VQ3wc.;YSϔ2Uق鎹gg,'TҔ$Y l~-^qCxg޹0dlᣍwnE+xb=/ ,7ޫ[fֽgqj\/VUIdq>}JJ>͂il{Iӆ/ &_L%f>,JdX<*~+bGoggH0J9QpFFGLpDi7Zۤ #P Xu Xݻug,]Sh GgCbbb"^#EMk *'1rgJQC2du7^w{_~zSuOUx8іeY|q_/K{/e HK_=(ǹ4)"֥{w*\8w g GDDh IݍRѭ po}DBgKB@1T9f3@BcM0OPY9 Y5ݝFT%2n@9n*֘ sm1vB9"1GM)i4j[o+gswg7QOb,bK8O]#V}{ümQpގY ΅۵ Z$8 Gxea (q n`g^ "e% ,q~ٌО܉IߩG4I96ɓ0rF8Uڐr,l^3e2Ɂʳj阻7ZfcLƔvnֽ8QRF&Fjޠd6"@C#~5ln6Qn3HuIk@6FZG4NC1LYk 5GicN63l;.OR <2G(*iCҔL=#c"Z֞1uȐR8_mTGS2\y iEq@-&==D>=xUkrNEe_z\=leP֦k~\ ?oU8DOo;-$~m]PItq!ntwݥ0 IDAT<-L)\ܻ,&$YV6h}TȽc͈X ƶf'NDjhDO)fÏXG!ݽG37kxAz{?zk.Ų,#c 8ߩFnh0hyׯW8T%=zD2RXiּU|?R=_Ed%T`4zk@J֪QmRq#3iXgbeduQBI@XIn) ExfxݽME)ϾGXMrG&T=_k DΛjPO@.k|n2۟:${ wfM:Fhy;j}>M^h$d:^ӈ:`ɶ?=:jLK^!Qeنp /Lݭ.{*Mqc3wpJ֌Ēcg@8!s #w$"ϲ,Z#j-nL lˣ]fEfmV~bQX/3{>2Yjz̛t+o{SyWuןRG=LsczNuv5m=̊9w膚Qf`"z#u]M쭡)hVkzï\ O*?q@|]ş%)H^*|/pS*:8`J 1ۣ/Je ZYܫIW3!9ؽޅQҺՍ]Z֬6w7ogV"L kK^e)S9VSv' # yAAk^5Fֈ))*9Kڤ:5pUI &82sD\SS4U˥FϔitW[6Yn@1-YX+Oh(X ywsWvf9̧YkpdPڱQoLlCϰ]KxߵW?9?NzC)^~*n? nK#5:{69>?KluY{;ۨlWo-݅DJDTI|L`(!ӻ/CDuow-3׌:\|FXj'-0; 5Z)*旙[RlSP4fL(E)܂cD$R!7DOnZ̹/K-1bxEONt4vAtpbCFfrjhf)Rz݄v\a@d]9VmW"[{b^%f9Rɼ5flrMs<ݛ96 ї8ZMo]tͱ1ɦ_ȆCܩw]Ӻ_gXRnYcs jաZPsn2V\Zw?-˲x5,FKiS?晩;ožd-.)"W}(C)ٴH]5V"# _,T,gș?X~9ʒJ+V!#Nȁ)<;&:HSFjDM?Ek#2#{];J Q^.@w2Z1-p7/F.bHDшPIIE A,rQ{DKY`}5ܽx|<6 +3A60s2JkY {;Fdyց1xqeFe_=e ?[ock5Ga >6[~ {?Hս5\=₮Dg3F5PFm6򢹱uHiV>#In^RUeQ? ZRn1"H;]ԊHzs8҉A&+>PZ63²WlTSk\/kZU<|VVR{ U&{(MHeB}㕛,y|c5M[4'{e>~ޙ2W˰~snW;95t[7]%TAr[v?걾uR]sovޅgϾ?|]"_ŲHNiRet=~-'hk] 8An ̯Kv<9F?yKzz;";#axG.t)D11U1v~#{[QT=佌h`lrwL[)ZkPʚwmYyfKdYK((ڣ{DF RҭM zEٸNJ*P!NSi IwVJu( X} 4HJ@XfC&FY?PO'tFlo|CTDq?~[{ wLW78^-5a!v~ 3F|dž9e\[&qqOè`>qd?O~ {0wN ^Ý.'.Fi^IКk3ѭ7 $R#^_YӒJJշ5p09[)PJlOvdLPg Frrsj}z ?*5?iFȌ nɨEfdUTR@t^ߚnBzG̏J>BFkS|DpNn9jN]gR6̚yvP%6Y1lJ-wQcjeʠћ{v^n4 D^:m3l+vgB(s9XGĀ^IR6⚕9ɜZ:<ƛza緄 U1F3cFv˩C^[nz; nOWYyQm-2&~p֘)'*w}CU%63@*"|d\ :T$ݚI8o Wc2\bq-8j[XL~Һfʧ'~̺a:VHrG<ӻ'_P7&ފn_T_(:-WWTSI[by 0 *["͑!hsuUz ϫ1hu^&u^}/ƶi2ը#kbZhk{ofXwJʛ1 v3j'c̭dcx'Q|";0:Ռ4kuU$JխY+OԔ `` NY#Q923x" 'wŴVk;1VDN6EDFl~L#'-HRMUߦ|i3eJIňUg9cf,mŎ eؚc @j%3TĤ鹮(JrDi3 (C+, 9;:d/;.vCӪfy)?ruY2ǎTJG 1fu=kkXث_CEћ5qff#٢8f4l+EݵGŚ}srNj?b_xǾtN^-[Ezm(3-VOE)lr=l*^XJփn4BS~$xv\Rk5"4a-@d#b@F7Gkc 5oB(у˲<?if( $܄J8j|F6Q nhrxFĨ[6fQ33bK^2w$&Kc3{.cJa{(394$rhFw˙JH/#SD2sZ뺮0iS6Ơ-T" UGpͬNX}412!7PAe}R+WE*PV kA>J5,) CfX}p8Ɂ"5S꿟~_[3/hmaI2dU[hO4P2|~{Vkw8ОELⶐvQu ^9<=Oӧۡᇃp5u5BY/PEL_=g/IDQ=]nW>ha$A{k\sjRnt3/AkN% 0@U(3VBk%SFغF|% , m?JI925*Z lx mWBMLmH$8a)~fO2"#FyK6ERXmmt8_źz/h]wfu8JA /H=TJ`A2ޗ& _ Q C3r#1"R'>JH0{ Yw7mf(2E(g 8{_zL̑jj+խxFDX#EfЩ%r(3KՓ}+ʟi)Gkħsa,):m="e;8ær|oGul dm?8+gnRwlY5ܝļ6G&nb55fyU )w@S]Y*+6Sc̊*U lb6׭Q8GfK=ڻwBڂ9jLaWl Vڀ2C9uϦ&jdjݻ[0 l/P /G)uлlrLzˌp\ݽxYf~pE=NC}^>nc짼~?0?p~tZo kʰ)m~7giC:mB;`_[_ D#^Ԩp)a0& cͩ=x՞6rN¡QO];Ujg~J1[i࠵ sa&a5y#SXcudE7L9ܦ6.U i9nfNOsim82М 9ZFδE2(+3̡PdyPlf˲'UA*[‘Tͮ5DuZdO̭˝͒s~۱"lWC3~C,JIzgN .5F:mwI~B7ĥmRs[0zU-_=|lZ~GrN`XXZ$-7SXsh k IDATt#SVd&)6wG :o\}9c$+Q|{GlȻa椷6kΑȀ| "eXfĚ`: 1cnm3KznӘe( `+g[!rbt0_/ mQLj ܉sLdpcWl)TGUzIKNDQU.T)8q4SBkJ>9b-<4Jw;x]@Ӂ^ݮװkrn+ݱ,M呶u22O$Շ?huG}^$;[둰UL1>a<\[F=u$n7^YF39ؽ=aq932&(QI!{ZDuCO/)s6rd#DT{*'e\sU) wo.w'-___ki}x>#F[u~H-KG2nni.Kj3U;k&拱pH9Ew׼1*a(Vdּ'3v󌭑x<ܝ3\'umjV5 \9hIc1u!ɫutmԹJ ̈́1Q+P73+sBff4_c!ocDHf;" 3d0 IUFZwvN֪Y1 ƽD zu5>:e\16%~QjhOQݥ/WGl?xjO3?t*n9?tNqJu'UN;Vy8)cpq|ұ;vAn3/kI`|)r so"Bp|f.䴒Yknfwso=~=~Z{<ǣ%sϿ=G}cin ǯ8N&M5YYC\BMza^KfཙW4& t;Q5{{oJhbwYJQd%@FI-)!A929si]VC dzdYYKd#ͲZP/t}nIWV<nվ(yRiܤv#oq%f-?K~l$fR5.Δ SmCO]9 ޸SbS9m*E|U9[ fcb9DycJO|UL^q~.Qgutr̺d0d>I޻%Z eL0@cɡc,VE;vS'Xc29`m3N $.j/c'<{ӟ|+Sw6;(^\G '[}&яD:3jq9ek&Wf`+7İrLټf(PapZi/أY_|tofXZoD:3ª:[i)Y#s/ht bfټѻD WfaJ:35 i.P={LI1 yK-;1ƺV8A![I/2B/scY6TH] MVR yI6M.z`{jcVEeRe`7<c`&bl0XchnKc̈ʣӉڎPu0O뭔ꇹPܩ{5ci=O[nkEdeuVgI"3 w0Yh#h(BYyi4J*|,tSǾ-%Gklݗޗ݌sz@]S֖/l+S! dRx*9.O{ٍR,"Bi}Tl{m͚7oE#G1256$!&6yGOmG8*`*†m;y<_-PrM <\6 DfiPL`34_7RAFfO2% ծ) D-LJXQ'udt2|ToHoJ>VތoFKlz];T~bZs}\? lq]ϏM O 2p vG'4On8GWkuH[ҚSn*_AA(â >NWnZkxI}yj/fÚن00Y_*122u TT ĂѮMXN|/D S1oKK ڹfw*nxRm=q{ާvJ0U&KS,RV@aE/Z-7wLc˙KrV*z8> ]RR6sZ&T@FD?rWǩ~*h&I#%ͲA 0ǀA8R5mY_'ÁT]A֌{Sy݂!b".O`;Mۍ{=T䶯}49v rl#@w'wmku[I+;73"Aٚ=cZ#,d믯_/_O As:磻XEw_r>2Y.IoD`Kʺ*?U@psZ9fd+nxW[[GEF %gљ2zaJ*Yso^ ,HPY7*6řPBVQ:J^4"S1–^0a1yA%jJʍ!chԦP*fufO_GF =~T\xBq'd4T|]jnDzqO6i隐k䦶6+2VR Hofm\,@6 S\U̐`iӢ)C£(b+{\#Vf[ ;C_%Adej4ωP_PFL\h9F8kc5V>qrMI\9Zx/֠{>+`YVȓxvbd`pFVoS|\i=c4pdpvv%,JpnrE :([Ǡج5r]Ce Q_۬5kE(g XHҧqK$9&nddv}\3Օq! 9=nY9%;#Aa]D"90Rգ 1چpeIL-TXŦ-ŧ&̂.Q#bQ&1`\ 9p=BG$RU6$ Q: Mi(C0[ucr.4I01'\X*se >ș_Q?/>Ⱦ<)ȃ7v#YH92V_|.uꛨsTt22C(A$ʙNOh.|rrg)Y|PqIH9Wc3;_M-@:ST0x5s JdBV%5@&xcPS¿yf&SI]' h[JnwOm=;ľ؟BdY/yh~KI{6WM/0+Y5_\kw>Wiʩ2qŒXLktexG(@X3JI5AXc"2j3(RقBb43o#F07!4L%/k^/*քL1U1GE$ !KI)P跸dph,*Xnkx2U9-$e W}T^R%%-"+N.ė]/Mݧ;5ka5CxiO2_Ҳ+Z`n[ŠeRaEY(f,W:j!BLʔќ\^az?ObFB0ɋs "Obb`B~cUOt1$"2w%N "ܴe*mֶ+QҎnRLIaxnDY8L`:;ROS{,?~WNy}/JGwb?dK1{~w:~N1K:e02"̽*)10#{̵8#iAdZCk& 4i,4J.R%0&o z^٥&D`IwRe5DyؖM7sGw= H7n"9Q)PU?oՍf(N!"dO—niF ?V.j2*^)-U,X5eybVX_"t^9 Vf&ZgMc= P!y&)JKR1(Y:g A9[DGf-&b.mLWebX}e`5o?Lӷ 9cvȚkVpbH)AyZ-ds,Y@tT5'I|ti|/ zSP{V< bˀ'Gj8M(G/_ω6慾`eVJb2E) kpdNYhW&nO bO?f$Eid @Bn!9$™j}EH%1wGGItkxX*3K$ő=BB:dX:6B{Q4"+T+%w]N՘rEn.H$|P -#&ړ1j1i))$b"jS2=">>y%x_ޕƝ[\|:5MšU;Vf ]LRtR$AI",fF<++F&钙 R2^C#1Ĵ&VPo< sTs`Nu^|1j<ʼnGkmoQ5 X_?CcP/|Oʹh=G _Itz < XTE{s%mfG-NO6u|K"JebI^~H!Û(4/|Flņ$zV=w!NBL(-2u޻d0DrHNz{v], 'lVpvEO2\AָqUgPN%dn47f6\/2s4{OXQ^+xe Z)sV43y_ƴIpPfewѤ"V$O; e^i*Vn%Oׯ \.ϟ?ǃ>Gղ՞Dy%=(3Y*?hz|qXg lq] 8T~#>ig I],^}u6Ο:{Xb<>`,L99uA"VJsR6(UIQ^P֒T@G7oo952(QnJJ^)A*2] xٱ^RA*,m)F Kuadw&3Fo}yyvmO?Ek Z,& aac!&Um `GPȓ J!&k:TB* wkIr>Yl$,a +^mUijG ҳ2PjM%)A/3[Ug$%쬹Lg1ZRR6{fR=$| r&$L#HULGFPV(#2GnmH\ SP\|:o_ݝǿ~ֶVZ>J^Miiw}Qځ:#S?X<-OƃquJ4ȓ6irh \ J0&1ҮL G5* ET!8R*tk5Ue$S갤C 1n~xcDX㢍hD53)UTM #8jg`-$h IDATDPP>#1# $^+u}b]m'Fu1Fj JS_fQ3zB׾1&B5ńV׌QHc5ULtjn}0Dt:T=3mDD 4]Bͤ~\;1ֈo믿^bzﻈo#l=]*V[F\d"/ 0~"}~p(~EgMI_.ͣ_8b?gmo;98 4ۺDHx9Ѧ]T2N܇1FFn"$^0efvhRVl֚2%a%i0\*O ӳj_ L.x1F(Ҕzl N}t Ki]S/7U+. ^'#>eL/Y~ckB&4a{O?$e"Ό”9 Df$䋵khkͬ M 6H4=+u~#a̶JT%mnjj;* Ywym[r1﷾~/tݶmGi0&XݧoI$ 3)M"fӧ X!@2"@ґA(DI֌X2D$RU YHtDȷXUN$"V_\hO Z[1%yd q{Ai[ĕ%H[@ʐ>b1ͤjkUUpEt\/}kE\_ ~{~{.<>@j~XkהP?u;]j-dC!?X4)p&ژ}6¿~\HNW$Ԗb!6AŜ(HI$fGz:ed ^)0J[jj fj[ n%*˛HD>ihLASTP PDϐcm~z8 uۮmۊZN/3ILM'TɳdE8^Ka N45yyv4wO2ė*E̪%\ߕ5Aj&Y貳|yF<O )|(+|`Y<#d?+Ag_D-W\FfJlAf<(,cYG3cyfw}}G.m<ݽ}?~X|~Mɢ4_XgeA9½҅Oz6~L=1J|~' ?d~C).wv) +O_=]~i 55eD 0 3MG#62bgAI"lLr\=^m63SeU!aXPX[N (S14dy)+͔.E~}pyzzlfZh`U,.YS*df܁ ~*s., B*J9|gdzR_A1RBbTV$PUCʜI8χ7Aəe$ cfkvtfuR(Pij, ECsYYDh{$v+3N'vN$)x+YD&)YI'.t!ɑ(a-A&]⬻SazD}Pc%1aJ*Ëw>"5пB\bc|OyP_ָ?i-*~85Y28w [L_W\1OGmyޟo/GW{rmD)&kԅ-zM~ٶmڵY+y+Nhbئ'H15OWqqw Ⴠ3%Q{}1"3egnomGaZ&UgƉ2UVVQVXEkp0k "ՂBi1;cbg⬾H)dTQV+30VB1E5iŖ%;Zc [XFfKMofTSZ\K/ιff%GlI=̠YHkZ$RAN/W O}c~gf$eZA$!qO垙۽&)B?s: iS2sԠV|^%O9K(&r<)s\,ya`٭#*qo/׿+aozBJ @Vf21VO&D8pdIM̶͊g<0VB4VHkW,DLlDP RKɉjT7 <%G0bچx{1ex>f.z. ҜطsS382) ϬY*EfDx c UYHw$ISs*i^ALA𹪶-bC @8jx bhN~QMdRœTA'SkMsrч9 G3"rxĢ }H Qbe16@2{ؙ)Tb5)Biћs..۶ G&HiFP&=bc3CU>1ky}8)1ȓ-xc>E'a䜎 [ i|ϟr[urlNxC 76nz[7ۯ+G<0/a3$:S֔eƉLn,!J{7 rۮ龏f̚\k66S53\r2[c!ai( IgJT%zgF甭O>S8Bǽn@tYmjyLoShjHi޵ȑ4O4$Sk1JN`Żp@r"3Ff>LeFLPL2߂̜qk$^ [tU[Wo"DY r@fF;T 8GxӨ391Ew@DYYZ4iwQCV9;3O!/6rExUgsf`JԧK2<5T-BD?X"39r;y! Y\P cJS։`9c\bחĸdFWQ2MUٙŰpD0651;3eیeURCTID`[hM Ji3&5vmD428b$# GAHLj1}d01F}N>|D ϧmېl $ZXRv$')o e !txIAmWaq8\trXŲ:4P}/Cdj!d.+fey  A#.ڑn"03Dqb f[B*jfYCww#$3TPj@p*1q}_~+_/O[k**B)3*jtNc1Xr3O!pg+Ty* V}3BŴ!zQ&!#bZfb3 Ǩ.V0"½1#ЋYklZ(eeB*y '-J$pF P5 xaɴqE;fu*-W-|Uɂ:;G= =Z?iqW;tszԊ5`%ii' {Oj^2;*)L@6NL xf$(()U5Zg & 9Θ.eBt{DxSaHT H0=ḞPMsVapӪ"p>aۗ1Xֽ VyyR)< _ZH?/W@[>fN<7yDon?h e/4i<(Vpe7bj9 ef)QHF6WBimOͶfV mm03V?vc=]M)ifF$ZIPBacf&jgf,3",EWKw=ýg$3sƈ G{df>ccbZk׭1L$MM 7*2XE %AZ|DeOyr$[DrJfKB"b٬ZQLED (Jb,J[؋RP"+"X * @vy|Uc 2ǥ⹦œMl6L^80uK[NX߫"BD8I6? TR)32rTt4!Մw^Ğ .ޓhb DWc΂ZM"眎loxy﷼h돋J6)=&&&ýq2o?O̢Zk*fffvVpz f.kEV1SsHEAEGDwwHD(+U 8Yk%jM/J6SMY0Ku=gX聅 ["" `-tf»JLZ VVkj>LL$XLmCN#sZz4\0`(L#bi%)  (V SY&O*k}]"2ɑkSqrZ.׳LTmmvNXc&̒4/]@&з2&9@xfwLYViYVsdmGs ʈJ(i23 xDEv\.˵2à{11 Hʾ^`LjCy LH"ZB{&K )"q0e9ݻ3o/R׉M~w0NHwJ`G@LTza[{{?Y3se . d};ޞ˶5S$S6n[XQ 6#r0CU(qKkYVPB\)kkXJ҂m*EsdL1bT7>2F"="=4r wψ9YG^3kriz^ ar-xK)ՇoA Q8H (`?.ixQ?cGXۼB̝8e< `+hi3rm&!3T ALP:1_Ȝ|Trή:&mۮv`ATqNdraz~$Y8,~$lk2y3C) edSdΆwE>V6֖^ *]rR@"%'V@+P@˿?D|P=~sb1 O$IK|M!(|[=_qkKkWugfnm3Tr%iaۭ^Q3f Sj.uڄ$([L*LԄ_Ӝ3{jG ˺%=~w%(1ͥ]IhEA&Eg "Ϡ2#"\iå3" E \(]V4< "B4 D8"D'LASX%3çloS\' c'OEt 5}) IDATʇI9go.E§ \߇b ԅ vo/_IzmWcS!J%YހrR#GeWVY,1Ruk=X{֥2WO$EM*-Z1Jo Dfr"\ऀd>tY++`,dY F*LAEKi*9},ȧ^Q% ]FQˈ}EM+HPH@B,!>p,T_mIO#  $GHh<?qo^ PV(L 0\/3rdT7e9mYk5Hya,g)4fﯯ_~m;Zc[xf)TA`L9Gr>ƌ! BąL5E c8"9[軻IxMьDf~aNOTrQ٧ @DL J3e% _M* TM'/qwfJZEd%>9HFBTe2罬vx6lr1{JSF, "DEdU7#yw8Kh=+P{?œ䱥|wYUi}$.\oXO¾bZ } jY߰?{_6GևH/хpϛ|?оѹ\I[y#U <^bvQRNj&l[UU%[ 6\v12Ld5S+t RcAgVݴImj8"߯HEޮiڨ!A-` `qv{^___=1hjP p"vB8H[x8 e)}8b`q763Mz7#H,ǖ^R q-@AUfq^S7Pe~Hf'mHYdn:L'Fqb?+l7|u.|';'ufLyȬ^'a|jWثI2r~m:g*DkK#4T BԭS2/|F6̾{f>>1H׍2@vh=N5uJƠn c%Tt3$Zqd=U`2tL'j)Cȁ[Q{h0\=DzɔqL\/s`|"RpB: .0+9[WEfIe*sO$fbb07Ki_#L̇h c׾Xld4P}Ƴ _z~S‰p^(Y~>?>~IzW&q_-He*vĕ%efdoc0C@*ʛ0K, P*x۶2,XI|J3cPU/`y˸U;w_b#멸εcx~=??GGуbel#`NyۈLYؘ=LAW,4D8 JQ B4u,E0eѢ6<G]٭˜beyT8:DUfǔ4C /ca> N 2YZyk$\`'Ϙ1axY9|eE< Y>#$3aoͶm3k^ [@$ANɪH(2#pxxш Lxoy$q<C [)`c#cZJRF'yjrʲE]~oycujK_r~2~={T^`ట|;.?^\1Yp~7+ӥمҠ6*# #c~L. U9@zξr4ZYœZ5˄Sh( j OQ*9kusȌ& c_z)ƛZ~uVKf"B#UMh`kM n x:*wHgO4Ԁf VIPbɕ)1yt(K&πX2Agt>&B뎭[Ktrj<,"_8INJl<&gUD*XX8AJ.$(/S%oԘE ϑ b^jJ,˨.] x QZkϱR1J&%gz}wDJߓI9HYX:EtzBKiQ,C5p ֦}.zhaY۱izz#C[,MC.moG{4ho˴Y{o/e(}ljj3}ދ^V5Vb7/"h#r)Wb : 1N-%'QDےݮG=3|RwSN~ y:fdݴ\K'eD]e#SF0,D=yK<ȧ{`OVEw?'K>;暚LZ"U3k_ |Qq{WK$~>1sp`bvncZ(L[SC0ڪjgݛ8,_EfU )ݫ]ИIc;#UY@F5 tu=2#<ͤ3m>K,QT$O~Bmb̊ (̼yKFҺlYuY-"T<A6^\<6“M̨Al>mi*Ży|"p7"u^DUn`8WhGO8zt}qJBxN]3.j6Ȩr I@ij:{ߎ]wOڠcqv􃛼u}#- @It1%<8gh&mi5Ec&IPDTAP4DYmږ^o2bI4%Ufa"b# Ytf%cI e($Bӿ[ +jEmM΂`Oa XI j˲/,6Wf% j[Zv;ӃLg6! &gbnnUGL{Qdp)`xbI>[ydY5I9*Db]o]:ED#p'%4Fo gS ْY)Ul Dr`g0݉Ǽ~DD46x 'o5r*KETXadPBXXBO?֏K{\HEMsj4xZ323Kr]7Fg3dwtV6m;& DNh7\oz#sXґ k]ep=J [EF3?O!s_L #ۆɉnԯ~I/i|VD4b.eRQBI7""Ld۶Z}۶uZL:2*ZL 4B F8Wᐑ%uqófk5)ND2α_Sm]nzy||tTGef QR`,Rz`_7eH@"JC#Ok-C9˱1ä o&lrZ8#d'Av:'mNp' }ɵ/^N/%fjB~ˊ9Z"fl;<AY!tg P\r7dD4٘ԗ]Xj`h  ξyQLtb 7tyЭmO5~Y?.u2D G72Yvpr;!;P%'L*]36f`eIb C 3}܇9N'{\&."mBwc,Gz^<%$/|6hƎ-ʣ3B\jIͷzumE^7m-&!<z @ x&loL6Ycb%9%bz"Aȃ {L?&|{i nneݖ} i*L]aV@IV2(G[aST>ѪyaVKePew3HfJ>hGnJ =si.rʨߋ {ޥ\!I`wGm5:Gh_Y^8wWOI?vWSx)3@V=d,a2RFdA^z %Lppx4w"/ocQ XY,"Bּ* Ѯk~zQ(7CjsyY$(B\D3tD4y."iyP5O#HYTܱ{;y֔ =ܽdlm|CQSCӪߪ_x[>\%DQDTL1B Lj Jn4Fb=07?aV\jDJG't:"C<#ud]}5I*mreHGSH uOn?jS_Y"py\-Y 1&Vʋ~:,F r ?J/j7D"<=! ujp4P0C'-X83(zdOIeYB/ͱznҮ5>m~T' |2.Cz 9pw4Mzg6>R@⳦|23f髯'L'0Uu]׈ֱg6b؛C7^|q`buB,[V'yI=sl FtǡJ3E{__\__#g"fcG` @<^~Y 6&5 cH(}C!@<<6޴ ZntnsGm%hS[Se3)f ۏ#I%؈VX+vk/ˇ6)MŦb:).ȰM^i}yXÔ~ff5~~/~w3oO?>|̦i*$0]a9rsX:c?a 8<|Yﭤ/d?7l>%}۲n-\m.hPRf1梥EVD,d,"=DrY>kXBLdہ#ds^0)ޠ(1$><^BXOLV2 G vH q3OeK<Χ<4'ȊlN4D#'rbluU7efh\T 9 ̈@)k bo-̚zNbY-C9̦s/O?ӧm]̪7^8Oom]^ǑЋпV\{ᅭ`?1w{.ݲ=x[[c $f$2EEoӉq`^LsͬXѩEA)U믞y]/VD6R OZID*R*D"H(r6, f#BjT*UbWpwy 'ߣF2`f#0Rd?&tq삙형X"w 7 obbުIb3 <ꍔx7s(Z2=̧R SϑNP hPkAj+ezG"PRe i:O\Xd:<Qv詇]m۶mY,{`m5{{qȤxT7l.7TNj|D>|?~IlY֟=airP.]8rs( eYu{u'ݎR:@όz(v88I ݯJ;X[dM͈7Y*I^L%gBتF[-$|2NlK1&M^ƒm&Si !!$_Y_ (G "wUWnnBdeKDaf"D moVɴNEDH-(yrDlhz[xh6-"܃K)|6;ntd$D$ dbtqZR;DQ5ý3@$yg7[4",7Ϋ&h٢3<&+'+ʪKH*h#Hn&L4=٦*PӃw3Ur&f -AvfڷGDTb܏m5p! y: @e~?/%MۅBi78ﭜ}uPU(cھuǿF>g4ċ0kxz񺡱+rZ>gq):;8hj]|]*^ djē4\7g+=ӁڃJ+hDI,342 m`" ;7CypFmNc>Ü!T,=bl>~tM*Y{'r2bL4HͦyϧiJ)1c(پ} mA-ʤ:4顜}zz_׿_'f%eQi~$8"G$-6Zwn:I.:b1T1<<^/v/:1$W>>s_51ސdv0zje,u[T[ԅj)ʅt2>#e@;6ZbqPhfA,$pG4@j # Psz{橿SRor/O.קeTOs*< QK!;8#;&1CDKJt*i7DkεE L%Ԗnň4c ?ZޟO_黯L`M93}+*Rq1kJgYw:)ZԤvѧb4VWkv]?ry^|C!Z%u`ODmFn&{&́g{g9oC v}jأEO/ ׎V7Eeb om=."\ʤdlğ}N OS1Q61 ta>O'j`a+ZU2x3SFuݧM( @SҵRg2eyp2ZY)gޖVkLNt:41s"nٔPb:ZP#q ̦f2?NjfE̦“`I"xQ)D4L CLJѩR{.H"y;㇓͟8WP5p#ϮbdyCc/A \`VLCs+q&ce LZ~$a(OH8Xt$Hqľp0' ^K4Obf)gߣo`AJӃ_}6ti&-g:c`T*mZ@U$(y.CՓrE,Dw GזÇmR?O?^ףUU!tw 7m{E7pOd9d_ edkIKs,^[^i_KeYY3gutbuY.fr6O64BrV!ʦIPr<,j͟vBu;4eȅGŴdExZ:`V^0mOv[Vu  +kD00CȌYOU86XGC4:eYgEKF?D5RO%pG)SYeN^jQ9IqTW+q*, aͶJ{m#֥w<ͬe`$3""AR*N'7@b pbUzbvo:3eY./˲lWQ\oDDLzGK{V"ZP(u]?~׿r?,K)@{#L8XtqDPB 5F+}/|cޜSGCΗtz4z‡9vyry " @ݶu<ŶT5x|4٘81+$d}JdNϹ*@r @Rj}!!{4kJ)qwp"49@|(D(umcOT)3w:G-U[kiHSF >2_be(2ިLDEN*b$(ip%GQB^ x:8q=".g-,"0"<]9P b[+ix$&^aB0Ff $߇`t(RD+"a/s5o ab%=0I)2meq糪ZKn?4ҥ~?|ݮכW04e95i>l\v}jEY#o>|_o{||P]ץdۺz>gDTwY|9l'~.t}\f[3>֧^vN?ל}|$z˛{&+]Fcz^"Sphe]/7iOjDliNSֱXMEqڝB">NeO˖tCNTCҽujA$bJӘs5 ֶu]S\}&*@|>p!U&!Ak]O IDATbBp4l ELA\T"Q^f-C'#bBvv#*̕D]QE(.c9A $"7lrI #><fDVg 9p:N@tNbN#;vMm1A-"!ԄvwXoׁvwYClD~8J Z?aoxnlr2?g+YrթRtRcS&Q \duo˺˲ξȖ$[̲c;2M4M t2UuYO>n#,iPkއH$uꦦ#T(Dv !1y /(jǯz,>1 VoYbԳ\ݛj_ h D^BmY>~\xkDZL;%Id'_kf Nv1y3:卙2 53LMNu'IʙAXr{]QoVo`f+w&JƦh _h[=& 4t+ic'@h:c9rEI[۶V[0O\&tD50cr):5]\MK.LL*VHؽh!%A)"&! cNl>nf!m":L͒>1`wāc'gƤt.%]| d*jopvwZ )$"&SH0MSA H=[eK===zn!}o f2pdVu͓nC.< {*.ִٞQ2튶9QCdHz Gָ1b2^I5ZJ`]jLJN*Emͅ\!̦[*CR]ڪɈddD臌! r~֝%O8˽V{5j~keOћ8C}Tޚ"kَ 4@4 ^+Zקo~y]jܶzk݃YgS1HZCEGz = FU k}jYv[=H.t+?^kU<122GWz9@)APXE|Ȥ9[eM]{z|'=0 "m|Zۺ1RoSy*RҘ/н%RIT㾤hA(s$TGU=MiQJQbM͔+WrK0Lh^!"J)@Ȟ!<8D|Ea%ʗ.4X6%E@bN]P% mʋ鍥9DI09zn FSkQ RH9E@gig퀘mc5A:.de!*DLiHR!HG:0ډ#Ft}NFOw@"c9V=mAɲřRhpO-/?׿dP!UMҦ aa+I9 ^O}'OJ$&%QhbM޻36FM)֭qy;5&PKDhg-|:^6"~]`YiA=1 x7# ^ҽܼzmOuNfH͓ٔH &,׾b 1ɗX^.8PLkָ4\jĮy:F˴Zu]mf*:"x B@QV/UbjTs ecB6\J"hD1\.7eZDVW,V4DPz4poXS4l.U|sSFjtq@Wj1su7p\(x#bN;t *89A"ECvS$p5Q%%5ٶ"i|:M%Gr:!!/Wh Z>ߟ>z] 5leP{\Kw=Jlm &cMcz!Bd Ji:;3bcXk B92!"( @Eu]Rw7y R#i[{//^n_~u*jt62"娞>NblF*?4p3)Ctb$=P΀$әj=QUoxgΟqUMiDu8GջP?:w3pNTy ? CJ2 YK,e)!&F@贋Dq;!̑Ǻ ;a)(/E {5z}yٸ -0憔%CxH2BZp8I }zzbfeKwXىK7"VpKڄq+̅5C=Fq<~G =qf=Ӳ~bAY|'F OzEkƤaL$gS@l(&Б %r$=%>=q۝:c-XIȿy#Qݻ\<}ZU<)&]ɵv ׽}~ߟ_7.AӺ8aFΫTJyR0cßz 8%rg#/57]p%͌cplA\ɿZG`cf(dga|G‰U]w?ߢnh$mm JQF:K)Z ӘY3(Q9@̐rpS) $JE1 |`s'3] +!.,`𸛵[責RT 'e8юޖ"B!`0/U]X ȈdօEYH &EEk -#V 2kȚ+`fDkr E@$l3n[D82/ i?CLJMB.:<+A2 %2 iM?D'9OL Nq :LC:nC:uI8Lə"3Lơ uGi^RtyZ.K)QAf=6mo󽽚?o/=?7{F\DZ\7eB8z yRJ*N!Ǹ5@q,Ji Ყ"&LHCN@ Md$}f1HwY9q 9r4/00& E;سg%5, n]2ͱJOKfOOc@̎!eTC5OƴG>i?뙽0:5bI",>Bݶn ‘B@)uU,Ux #8BJR2iBݩ(3;lN3(1+1^3NOQ+}m>TJY.UТNZh[x9e:֮CYܽ .c.\Tu8A8yIMn8JN f6r "pB&H%P0,,ܡ>SKE web|R?KpKP-#LܕK<[߯K@pET e.DQt ᒲ*zAӵ%ED wrj3YhA4({AqpF!p%,.S-,eYG!BQ!5 27{{n׭˗}B0`C4$ ^w#b:`>sLA8yDa)"=jK͓x Xg˵\ֺnFDk.[뵪ZӲ]kҜLխ#gG%;Kp*aA?5Bp0.8b0ߨOQ!?d>2Άa}Q<{~9 $" ]Էu"/R/EDpA6DFX~",UL{Aw7TR䤣+I7a5c&-JrT8zLI^WR%ដ*RR$.B1A?DTɉdxG$¹~"\!D2K8gdN3S|ܐ䇅\'#B9!D$PQuaHt']jd,y ʬӧeicMʁ|Ǥ\gc&3=R8)00"u pxަuw)Xf}D.e\jYj"F.97,Ǭ{oݾ{~~1wQbN v^k!ntDފ1HxԱTw!3vr< T^< $a֥֚Ƭ`MB\A:'jkqn!l=N,wg:0rZD\]04 ={yTn뙩 #o͝l2 ۛmmoy"\>-OOOOK-eQ)yh#0y0`[mn߮zz}Ri|ȵ_`N7NL#e5H̤\_O<=DŽ0;0k%<|^K),{S݌5|dNϕ< KmR:#9"Bg]5AEm@  njc'GDs< G}g`á0ovg,'k]֥Tk S5X5y"" 6!{h#@((;ZXJ)e槫m8AO7I+<0n=>"chx 0|\y+\r28"JD% qƤ G0T}HPIޚ}YKUȉ'XH]#Nu!TW_.*f"eLBAqd~d$NkDLHr| !| k/~dnDġz7f}[-B?U/˚-RX6GsC0n}}{tITjxu="4BivT'|1K:@C2F;4 /lؔ奜M(g!m>gCJQ9!DƂ>~hzG](}_Ɵ]!=wsrZHg8 oҮd0ES¨>-,"yK4NO ȓA揪Jss2<,^CT N2X!YK) H"M?D i ⢏b Fd6" Ak-;(yːgP:IfQp2Ac 9Sq lk BRԉvq B2C0UϢ%̇Q.Զ1bPZF.鎕D3VW4iL1Y9w2ƚ:YXGh?,JH&=$)9>J|ff6^p\s?{ +]c?{z'ηޚmwn[eT, ZZ,E#>DuP $9]|EE4O"%[/}[GTU1#Qqe=;XF1=rPF~8 $Y picSHbǯ0'`2Q32hACzR{%<~|c|[ ~mϯ$U%:s$˚uF!#("#8NV 4'!2 =];,b paeYu]ץ"j&tf`z7tvv}M:_, Oq8=IG6_vgʻbr#qq rq{O^M-=9d//)vS c?a@}N.Ŧ3쇥6ӜȽ2=1 bg>{CǟCa[9nmy KiY벮k)a– qLJ%q}?~L֪&=2(TU8貒H]|J HcZ# #\D#fF8J>fv$!Ir P.),)4Id;5 D}0Ȭ1%`dށ]_^KY·f=|oƒ#TEI xX~̓=JuUUzVN84T\D|켻":xL ѭ}y?u]ٛ(،S:%#(-0f8 !V- -c.)#{ Ycq:)к>_ֵ>]RjNQ oݛ[Po龦"g#zo_ݶo۾hA& ,goIElɠ|{p#?@:ByxU5y:HĽ,UEe]NmSEe}4V"Ċ'VbQޓRf IM>@OƧ(ohfJYca4݅r%Xt1$,^"l SIK$US("55R9Rr%iXd̙i˶_~oOYgXdԉ#jC1@D!]W#Af0zm'E0{YS],)0e݌.e]kj#ٙ=uebECvmח^m"|*XY4y)ɴy]C&>h9AAofxhf)DPє -hjn]YttxcV&%cu=11j8wxg1=)_R^3ɦw#ӷq2P?4 |5W+Mj#?ž+I 8}npphK- I|&MJ9 %XR8'YKv$$[2=,E  +$oj \htR2gPi'E#< <1@(SDgL8ĬfKɟHPS&TU˒3masn0[G)X8,` Trp79?~m]' M#r>̃"\:b& Rxs,S@ JZF"skE,R.O. q/|%GᰶQ#$"0Qݍ~}ۗⰱ3apz80CPS({Z逛ھO di LLHeY,M&tDL杞`¬[m<$NGd&<'voNNC]ژ<6tyo(8X߱ D?pL?]O^(GlQd $7kMU2h,-֢R#pMO4X" &U>,׊)EVd`H, N Ӝ0}HyOtO@euI59ZVwQ")VsrGpyD<>"wf6+*T0'Ѥ{P@7}hʙ)1ZBarjnfֶ___[ӧE%+Ӡ4HU$m?x3 Z)g< ڙxV;c۶\o]XLmd 16~ 3תZKqj/~ߟ_ZX0"LJdpi5TaLg/(BF [(L:~2g-;Ӻlۖp/ٸu%Gߚu0Σ,BU ~s}(cYeY=_Ҿ'}rZ'$\I"2aE1 czIOj^ @PlnMVy, RZ,B"tƄw> f|(RUma-#t$C:eJx~\MN1dXK:?Q̛ysޫ=ۚY/!'Z+ f\U)71%I6"\XwpTr:ɵGf4aC?If{ǩž0x83J(GX\[peֻE3HIB e4xa%\viF2 (ELXIfQJ/#܃<$s+taF.J C~^o_?˗_^_vj$[X8HJ? QPUj)ֺiгID@Cųa~|^c\<5ƚ fd*"RȰ -趷/ߟC`91gĄ[6ȓsjԌp6ty^I8bR b[ xdpor)=S0"8Vo <49M@-Oˢ%mu>}2˥rDL({-A0hdlN?PzG{__#?5^f=zKD ,UuѲhWGKsz0H3!1{͵dB"".,*y x܄1H9ܲ??"r?{{Zggfz "֚Edra%! Ggg"*R@#QjeyLG 8KETY4r;  w^߯v_ܛkpumߚۅS Z ++gORs:bԇDD='e/2sRVMIsFGHrR!a@qy(aq `~{ٯX\BĢ '?r&(x$ !a-4f ɉr!AZK=`,`kR՜NulBSV5WFKN~ͺYHFs-"J̪JߙD#7z[aMRS9l}-wcϋq?p{x7"2o۶޶m~^zp䩿s7& $A!!CNZypb)=c.y_u6} iYk]~ן*_7fUlSET)ԥc 7~pBVJ$-!J{Vᖥ"ܽ;eOZˢ~7?BaןUeZh<"?/xo_"|pli^b"h  n+zco&8'  Y)79(UQcnsSI:$M@"ZdqxxyrzE<= YX, *UqH>scfoz}廙wGgv^O?JEqߍ L3@)ȉnQa%I |>k]{{F@sVp9rc^`;L0/$ 0q #kk!0tjx$JT "4쁹 )Idu>PhRÇE$jg YEiY4T3;t<|o|ݭ3C(CۋIs $fs9),eq|$&y_ *E_h۶-B$b {4p(D|(r#35,I4r"?ÁlNc-ąeZ aZi/rY0+C4C!J)rX}d񟀯qmN?y5SE6t9e4&p3owwcn@̪RVGӔNw<8Qcs 9C֘=e (NiWm6!#"->_0Tټ޳c5 @HT,﷭736 wJYTÌPa:1 DRW;@|9[kѺ\o߾|}Qy?~ }+8b&)Vf'BqfPZe)Tr{gRk' xfN`i$@T 9fTApθ#Y[x@9AeѥjQ@*Jlx뷗߿>k{CUjA`Hj,Q"p|.h59܆4LIM1j,DPAEXTk]r)YV}߳ ﷪cUk-mAab&VQ)rHY"0XV*"%"y뚦͌'(zw{˨wjVmQo@y:6I@#2{o[;GSm -,"ʥutDv&{4r&ᝈ'e r<2Ԝ# - L^11Q 4I -F>Z|{rB8֩CeCV`,lo>M*^Չw3ڷF||K0x-T%u@M&}1ջ~\{ bgA.yIt^ztyek#3ޣ28s*I۞d»2Gsk= XJ)ST.X!$qTϤ2NH EZDQN5h-RtCH6[% JeR0% pOoFXYS~.tlܳ-ÓPmzӊADg}GU<$OuN{f@;8Rd MZ`sS!"'Xga9WdSaq>s8p#7!u5۶.~~zO?AH66H4m\kު~C5+gmVLɹlCUaOEnc>`&eg( d%fsʁ\tY=l֬[x.=QƫUPnntߋ,O\fb@CQzA$ iNDpGsv^o~nzޓ>yf6ԐuYQCRp}"KT nF  R5%"1جOF' Y"lHFU>S IDATյ0UJ5H 1=ro__}˷mS9˘%a;I~$ڀ"Io]L*0Ad\.o#b`Y{˧O5;%姟2rہM{E P<9̝q < 䟳ȦҠ"TiYYz &CaSr #,`BQW<(U*T,EteH -0ЋK!8Gh,LNdC%<ݑ=jU$WؤUySztKR[kϥzY@.U jܶѠF`۶0ֲ,K.ݝrH`pϫ"E+ ~ȏ/]k<&Q"p w =KȥYNaMv@Kapj?ɢYF\Npڕ?~}^}7lQ)#y\ sDO* N<6i)j G("IÀAx5ݞb)% mY?O"ssU"kova}mb%{̼u dk{_gރ:ԥRqZ/Kk-uA>˺IQHpAFB8Op`GXN9r$̢V+qc>=4dȦ8yL:x7g@*s'Gg`WP~{!oUPÚRh< R̔PgW-lD V ,fc܍N[|rq2j: cNK2XޢRK9m_/e-t3/rY.e)˲$ݵE޻ 5[0V]k啥6O>q#CB2ovH m( AJ*P#\:*sI{;,ti7m?2zU)҈n:4eݼyU;>TUPKPu]2K|RbfhQkjfak#T e(q&A(o|K+t\.4I^C]{V[BU޷[x}DCd!=оG&"þ0fGXQ <tr.CW^%A񊹺';dY)eaqt@= Wl)„(X!y, m =E[F` *rV\E A P@qx"9#K Xk\߾|r/{YSQ⺷.h*7-h;aa`eVw Bhޣ !O}jE(Đ6w"Z889"j ((|(~;~[ۄؒG's1ȇuT@6w\Nj+MX7|ο4kȸe㮝ډ0]p0ysa"Y>DKelӎ*u_5Kmjr'ܷa2cZ('֚7WPrwkm+2b"U9|8ߍ%px]<܎= "t2 Sq\>JdB0ۢܠ˂ H5G#b&_w}}EŝBI50},j BLqhrD8 J8+:(67!"p)6pFB~b&װ Ls LG&ZIVUar qqEo_?˷߿}{̫F!̴<-3}}vr$1|Ll=#ep6slHQS.RK}3d̮"VNս6dvi|"@_/她X.Hߑt -03VoHHA&~ 0DՊ1'{qeY2RX\u($iށYSv pZmV[e~OVAe !x(wpmI=-FLE;zT~ӝmnMS dsh~$]ϝ7wBYt:;TnvV!,,e,UMrº\.2{OwMvzDZbw\vY]=Yw+3y)nwzc뺇wրxTe9N:ste(˲֦iqpz!⺮u]oei]W6Qg_AiOE|Wǻ.OXlpl7zxӶ,(%0,!sR@O)}a|̭DDîQ݈]wM}fKHwf7fۜ06Lbv06s|("HV ]V2T\-˄B2€$j K[rx.q7xo/ϟ__[5 tw!0rz,TdUl7ȇZ֚frʕS/Ȉ$FӢRD8 #"T7575z3UZTUO򼮿<~^)4_%iܱ3al! !!7.r\ĬRx]6`)aq3QJcW<=1skjղubΦRڲ{p  @U#Z0 n@`fIî˒b( y>ϻp8g8*!'|`gyq|8co W$X ?-pܴ-r+Z]d HaL }?D7 Ay[*#4vsꏤ_8 TB}+Y "6Ţ;n VL6ȡ[P)SKq{7UFS޶~852fY5G#da숑(eoZ0x']R4?=ZɳMn?}<c>Ή0(-CZꖙ }$IBA݅sXژû@OZ[xqfڢV#Z"iD_//oϵ)0Lf_^.__ߚǁ zCLcAD% >L4U30*HeQ0UQSUÅaHJG<̂Hºۮ7Tg%3ݞa( "뺆Zʡp<;v]n-!l)irα_,8'ahl#t!xDFMoKc>2nGuHe~{2RE # 3"%[;Dnf BJ)<0PhTG ɗNAf}` r?,1, 0'(鲋@U70LjpA \[8R&bߎ8 2xͪ7#4`F\HQ6*SO6a? 0qN0S 1$H2s8\[[=E!p ˁyja#׃ÁI#xe5A)e07i=6-yfn}hPpEZ.-X8{#U} T@BB3s$>Li "5%ވ j֚U 1|++N.ՂzYcQb0jbw'a??_."Ãl80z >}.]f5VUptZ Z XJA7!ff0oKoiHR ]qUT["֭]݋Q r7BtR 40r"e7{9浣T漕E:@X1u$r1 sR^阹 o 6zc6L)C4ˀ$%H V p<)D"i)Gp2`@Is|^48 4@f.X7)̄MBE7R9#j8BS\׃Gx(&]ZTnPy^Rh:a_g3(`{akҊ{@D`nA};Ԉ-ϯ~ c3GUrDmvwnq]|ARB@Dvxb"eYJ)u]q,gf23 S rXq8N4ȿ>-̣O vPu{Rq yb/Q1fQpAMy2!R^S]|]h蘋~7bs f:]SߗemDn)e=lCr2㋮K0-ɑ"!,q(dxkNO R#0%ζ<(+G$hlE0, $0 \S,UuYM;",o8wʷeW}a Qz, 256hKlw0s}2b3 bq[Uj>[TOҚEvm^ukpYj0/tw˗Ww" -Nn7p]B)B@$ {uOFiJGivsc*v1F̶|3q!Wbܪ_&T1 efȦRv5)]_)=iU"5!l})t:̞eyzz"/_*`@LVӤF IDAT]]4Sk}Ky 3n ֙]gN Ėn[_'F$Čj H% 9'mhwRhki=ս9RȽ'4Avw@e4čǼ:2Q#?Ob\|>y61yrӑ04h瀇3SD n @>k[#rpWq@p>??NɈ (tAF\=JYfLe`0܃nfn۽9DS8a@ ø"7;=-d1SeQkk٬tloٜĖdUDS)z>exww18sI7;03hm9.L65ڮ@]x&.if XjMmpaUFf³00[uF2X7Gjdw*MA;b:2[aO4uҺObDԺkF5"p8R[U[5u"pi絶ixxh]Y~u[QǟfmZT=LmskۿnqW-;g17ی ^!gZ+{GN5pD6pbFpB $21/TJҶc_;@, 77̯wеۙ~ I-yXeYJ9R_97'$B˺|}yG'aGs۬('t0p w^V35ܝz|gӊ >pwwp,<"锚,#KܘHoYC!_,7%/x< Weu(," [.\D"sўڷL-oSxH#p}N M^%W犒2PK;[h%_zRFpXOwb@nB 4WCop@8as h-</23 3S't rd8YXhmŃ #ĘVRHWy_׿g.ݺ<2Q{K@Ysrه0Rdn?M18ГK7f"*jv^絪0LS[֗pxoۯΗW[yqzd03Sp<2k,D 8M뫪m9!`#OЦ ^EpOU)ny)pkX")Bȫ] ɾ1[A 5FX[Z#J?7SB TӴn@ ,`$V)RQ,XJr9Cu5xu]e^ץ2NS7?<<4yk4qHx jCaPnэ[Ŵ?+qr=kS-gCE4EYpGy&zgoMG#jXD޽g@׹w8$jMQPzӖF)f PR)N3(P *Bpr3s>O#څeeE4]كf`fBߨrDR X$lr(Ml!iAOMun՘k˗o׿fe6 xSBWn u9^9ia(FdasOl, 2shգ(iDukk,zY׵-fsC\=&seYjTUkMNXAZn.Ŝ]q.x0cZ d̀{m shjq 0tUZAFe]!hY'Y.m|Zѣ|^5UD im5c={)%# /p`42 2WȜzĥbia*b0 M}p Ó:5 Eaf@=얜L$D$@$HcV {py %2qIE< eX;/EngaT-M ݲ )H\1a:_[/o///z8I\0 {E`#a,Ј$Owa( I߬$n*(@1WEAWUuf,u5 <̵P2)0mmYaRyCq,s'Y)LWnf&TqD4riҞehz.}mw]9󴲞&򶔒Z>eY"7Hތ ;eO<$"aӞ_d~=<<<9>Ͽk6,OӴO)xSB|\?S~W2i2ϝypQ6o%fhهdGy&ck30q0`: ,E 7B<7nC2$__CNE80(s 8iX !# @ cdfIψu˅xOB EQxB7 vGHW~-qB7Lf6pYG^s#W^oêK[^r׿bCzbRyd1OH}ZEZDAhJX~z<}:<NՍ1a6sh ږU/Ug6 XyQx<\ru+AeY/0# "r~~{m(z>wpxk߲fyz0be,e^WQ(ϳro+ UZ Gީc ٬C;W` #d- j Hς,@U; հEKs:7D:e䷥Ŷw3:i/~<>2G5~958i>OӜǬYGN?UY Ed/ ufEa$^əK><&j7Me{i-WzWovdSOow5o8+"sr(oӽa0UUq*,* ]e Fbu?|8eWD_2/ae᫏=nsUxK :Ä>۞Cޝ]Kj>ko}νmPm0腰 }esa;M`03f8Cm҄ rڌnȌ~N"H@7וK:@JԕG:#3y\ Î ODR`N@my:PkK""wց@`T %1>u:ZrDUW f,,o/_^/o/©(2`a)q`Fx1&V :S=Ի˙+D0Q h\G"`ڂ,] K3.b00nҢ t@|!8FDm5!}DLus@R)63ݏۛ4mӆ_pPas0`7aja-9M[}ͬ Nt:ݣ!"򐨚efݘAʗ/_2Ͽ;gD|˗/vOo20}9pr 1/Ǭ?]W~=Cߏ,[X-C5ɞfn-\}dusNI{F`fJ8 Hw9ew=x=.z"CdBHm @3D"% +ugv琽$چHtѠNW]3&wӭEn(Mkݛ9 ˻ 77 Bgm>" ,[jjz֦y]e^/r/EmH4A) s@uD.C0Ey I$Ow~zx:# ]k6EZg~YK]WlnXTĊ $sB2րjmu^뼸B4PfM݄4ONU?NCɈH|2c}QlCGDKnuKVq[8-~IkW\1t*+fζ "<U{BmNcʛg/J#qܮߪi81xhV"BSwG^\U ?|>}{<pyOOGx|}}YJ!FU23",ri]{4 rt Y퇏~f4`pm7(("AM;B&"]9Eס_W8cˈ̡M>]Nŭg( 5=\7%z)  2vo{fWFIi4ƚkm5=6:?6UUmMuifa5c̬o oK`sU[[kF@$($g"ZDX0WozPOP6h0Dn!R gr$S QR2J'qBF#?qx #H8l>v\<͗e]k \ @A b6p*S[M0MSk+|Iÿ~{9>}>՗o0w,%򙆲}qjUuY⌃ (e(0"fCv٦ָvlIz7=a: B]=b#j7tW&]ï\]Xk=ϟ?Ω=3SiίO_ry5M×/_cu]zpwwVOS)ӧOi oU$@YM`0#-Cr]l3m$@/䢐kٖsA@<(4 Lqw .ca9&fj\{|KްMC- {?f*K" 1` 2#5b VC0V#BݪU3sH7mnllj6P3 oꋵKs:ϳ8}]4MԊsd08(h+R`: ("Kk>L#0d`ml˥43y8F ZR,iK)=j3"r eaFa,xp81&ڵyԠ@\Z{]d6{yUEia7GṺ:/ڴ0z:_u,t8P""?e@7i<`!qP_ךw *j˝x23f]ӡ H:NVW 58+"V8Ji˚E6Wrd4iWh`(J7b(Z/2 sOv\ PeYE4Z<|dTמ0Fգ*pxHG0 A\պপ \O6M|?~~}}y= sk_O!U "xOtXJYUb>XΣ1(.Jkw_d0쇞qaHhVm=.`0t!\Gww͐Îƹ=4`s!ǒ&-D̷l8  ;+~(A"uȜw4``M"6]03Sok]ֲZTaDBR>ֵbHSK5Kfu%lEHI"2b IDATIqixȃ  hHebanjEb1@ƱwSuke,8P9:Ledq(QFIBAbdD@5 ٹ_^k<7 %Tf$T,V70vmt bZk1<:/K˲=Ytť*s˺uYe2%'=4&6uꘂhjjnq ]tT[ffnAy箺4hE$rARstv8CC~tͣ͞t7K),dBD4Myyzzzzzz=~ZMRO?DϿg2s)}_~LJ s\iR%1,H[R9U p;뒘+)x )9Rj.Rj*ZT*ss-i\%;ތcr!R1r%Nv%"!@,(=ɀb )G:.d q.ՒXu#?y#g/14u"Rla7Z& `07"T96 "kA0"yƌOΒY-5tie.ŀ ,^w͢@`9d614|ZMsn;šs[7hvx6p@HDbPrJLbf|]󐢈ͬ 16wgi)%T"*5oƄe `{#mof8h1FJ)90\#Z)Ek-W4-jE 9QYHrF0֪!RkwAiןCfz8wTUstB_2|y5[DTЪ`RJ}wؙY]Zې jk9x liWT<& v0JJ08(HraųJ!lU wۥM DML8kEʢwn36<&ke =RjbpyTf+W}D^T4Ms:0!enA] @5 o3Ң1dPDմ:]ZQ@/4NS VM[8_'"H6F3ڤ}4[Ip80ڜFD8~Qkϯϵݮ?]5M{>_n6q=;_)do["W=4RL4 D26#=!xx"" V}BoK5c;n EoֻT6T%~5X\U@b[lZ~ CŒ4Mc4Nm_i2YC%Dpg2rr2H-*0 X_3Bm͎i`mNSE|/ARJX_m&EJZtH&ݙ܄M %0w#S hcи1PDh2zyV@l#  sԵs6^S8M! ] vMGBv;qۍ!}@y `Cayj -E=n`["֟4MձߟD/9vkꕍF}s`Gb)c5:%/ib"72fu[i yk/q+>k{ofvwwGD.}fx41>=]/<>>5rQʹ;>t>x<^ה~yyϟ?yoleqŶ"WMt[.%09`JS00d3 KE)M"w2m!7K[m"jw;)ЏUZeYcUIU\iobd$ ۩!䠲--bn51樞>XDCCZMD=kՔeOqrK+(@Q1UěkRJJ !RmcZ3u-p8 BuSߒ,\v<}}t{Wm@t׾=Ii8mUٲj۝ AԘ8FncӄаDfׅPAC1-E撯st:_ǔKQ pbXk)<clz/eZqp )p [u)w%2ϳ;U}u8_WD$/*4M}iF˒A& FH c#0xV123 !n5JIf&kέ1qڎشVaADnmZ+MUr]?ZL蟋ٗ4MUWKL+)0봺%(D941"Y:\mLirʥ2w!5Md1D2a\?phvg0~-˿og}4?<</  M???{#37M7ψ|<7e,lXKJ[K<&bE%w-nA1U Ukfc IDAT V1c\yUDEjJ%Mm͍[j%v }U5"y+Cܸ_ -x)0҂#/7>00"*";S0sՁ I U\s9s*ej5墢D"9RLUSUV9T &,Q3q谈 |L_FWF_S|IXy Rq9iHfn!)UV[P T"S Zd i J1z*cjRFC2:W8RlUaiTuJ"5lE;\hYS)4uN5&D̈M¤h9Xp^q<mb#ʬ)%=qjMǎ@] mT's аV!ԍ05W,zt6"Rj䰽q-J^y"!977˓u 8^E.ƈ k+c5=$Ĕ0OA%b3c~<}wQ\ZpZ~N__?x]f;O.YD{4OtxxLёooo~!"8WuZzjeu£RuA˜-gͫ j*efЂ"lr0xIBO+@k!ڒB*\ 5#(A3%`DCC3"1/B^;D䋂ymjv/^ RN2z@ՃP]s=E\jH 1Ur-9ZU0yD1RZmuZ֩K'de,KP3&d@~m!/oM[Ly6M]z6p40 fޮVE6< "aďY LM2&bMd,֊̦]O>`ܺ cBNf]J3V/rZ,"I.PF}>4-# R.mb3~+*bAEZh_Wf"\F ` ( h4@(.ӪDy{&&lDu/ㆱp-1 fFV"qPDC:2seq\\:ڨfjvƔܶ9{b8nȄ-Կ J.IԘTLڶIM٘VU+))mKmhS@tkͬ)՚#S籆p8nbW\_fSN}S *Bt5U\aTJ-@ZAKDдDLmH2$A5\f`n4M0\mE=6Y|SeǻsNe92icÖ~Zf4\.k5gg4 /1Mh`gcoJPCA\4 U@@-VR$ j *(X6ч @mME1"RLk@PYP fBBH^n4סATT E "Z$@R$"E $ceBzsK`)n_o6Nqmֶ)U-eE\fж" M4M7M\b>Mzs&ʀGZr!s`v]WJq)!/sJHTkJh w0Χ/_ b6fִ㧧] ~i)]"t:y/Ӈe/!QL]sww7H@ߧ|Csm+:X5+':xۓQxtd). b`2b‘з%@BBS`a =n C`X"eR˘iLqjc.c9؂(.Kl" bFQ{ ƨL^ќdʪ蒰_jx>9Yj$۶j*%9n{i.YEGRRu' Vk5CW P@& "S (ar杅7\(r>:#ڶ-"mK4 ?==1EDJHI樂*` mvaGsI4M|=heBB:ZPު_fm1fr򬡉 8ӄ)Gҹ l|چX6Tm 쳬°enT-բw94 Q(EB4b9@5y~zxjƏG>N3fp>ϧw4ᬵsJ Cv!www[OOO!_>[R}Kez}=7P)@'x_%y]3"(1" jf M71JŰ22!&! < 3R=.q(*@6N1e~1F3^GIrm)vλ*`"5O<0x܄fn*'/JUXkTMn +M| |s.Ms+MQ }hV%oݶ[JιiI9xf.ڌg.})K/eǻx\̬]l{<9g:χ|lǏ?>??,q~mF_mޮuFn|u]?|"Bx||g7zjo[. 7kc3x6X#}25TcD P+B#3LJ|DR1"oo<=kc# P5 3@XiтOt̲Kk@t#S"c%f h?p/"4|6 M@W+$8xiʃHA*T \a!j "BPtE;gUEL@~*l`& Xh }DDS TL(:\Uf!8-P , &bC%d'y4'x:]9ؓ|Gb71rwwU}{{rR_5c*BmluyF ?u{Uz2I*IQ5Ъ۞ꂬⲛz]pPn5[}ڞ&,ŀ*&Z͠ !Wma6HPjl˯uWb7J\p!"ِ (0)s 8}y&Q2o ir1@K׷?}t\>>>W?֔=2qc)"v~D?ї/<0뺗˾9@!|kz/ =ik~HTiZ-O(8 ] VUA5!";S q}K!*70ƿ^ D"o-\rZj*rbH.U?/=5EpAmM wLjEE CsהgB$5R<}\̦(-fkOO2OuZ-8r<~|wwf^zlo.tC%>x!޹:79ʺp{7&%"{kx>_~Ɔc؄cZs)x~B$ -vgOiWT_^^d_'THB iH2 q5Xt8 WZm ,k#ɪ ; B [, Ŷw7-#pn̚T[햇Q<CiC1BL98 "ÍjA ISCisyy;}\vX7ޓUkcIDz;^f){ǻ{܃L1۶8aSb֚m""hض$6MSSJA4bP ƑՋ[+6i3K<==^oAt:L>ޢCHeso+EJt:˺~k:HMݥ6QR,Z]24@,ݔ̥[9cX[\bEkiw]3nV;iZvmުE-[rזks*BQ=!tڶ?_߾wqrڝukzsɹ^1~m/_v"Ƴ7pǣΥ{wRJ?|m%Qu)WD&DYM<5Kk$g6m#c $c @nW0<%(jw ,e4T[hq=,9z֠f@n#XUU@o]4I`fu  DLLS`!!qwb"n@u棑xЎVTu_<H-MAd. s" g"A*]䇸auoy&8hi 89m%|>;k\Ty8EKF}-7% xz۬@Ui|-'As HFƩ.r,b}z5k㕦i=%=ׯ˕95mb+$Ru~?T4^׾}XﭘJ)MaoH16)]/?V^='R֪@&~,xLd%u1(Q̼э?h?|-;a,q-])ED]&F&m[%r9{ o4BWX+[l"KF񡖟|7+ߜN;92"2sUj]׫ӹ.1r9]H OBpuV[vkn^JXpa?$<5MYD+_5vr:OP?ˆw+HMۧ]vl 3[^#0Xն}:nnn0cǑ(!"~zWgy ?ܼ}YUn믿:~ga۶_|1]Iu:5w"n+bp(|kגjbMeR#%8z8j=. nŚK+,lSh5;X2Bl-Vrrq{[=ʺZ1眒> CQU|>"-\UfͶK6Ls~y8;M IDATL~i@麦/-dx*9WLJFDez1Nި{"@"fUG!FU_:wAVpR*sJ JO>PLy]m,!DTśrf!2r&fńH{#n(5HR*79Fs"w*ylp8|i8"m7j޲"Ň`4[x4??纼1e!vvW^ǜp:O1M}s+ZL!xc 81Uo}}JJ8^LA 9&I\p^ ntDH/1f9UFuHjpFk:PUdVQ.1M( ,GHΨ-@@;"e+P]m׋h]": 3f.YJ))Sc%K[JȬ{U226O4shr;b7c79|WM)҃YⰕ[?+TY'vW\Mj4m۶it:=>>!U9Dq(mׯӧyo~w󱽽}|2 0 s>mxcC۶f9_UKCU,5ϋ lq\mr)p0(YR*99!1!8~=1%EHU4kD$\.AQ@DrqqY"~ιĥva"M^#UPJff>/38;8vbJE5;Թa yZ{r!3~s&<4;iB\8m&"Mˈaji8Oι"DгyJ1朳qZE1ξmIT iHMs>OqHnce.LAˡʥy6]8r!f""Kq(<`6KvyFA]eSZX4x5???[=]oۧ]s,ֵ0IM1R (c+I~x: DTYa2|4+qji@m{ij,oz/Ux8lrԍ.9cke@uqr*S–kd4Mvl~ws*%Y'o7t]_p.t<|$&7S>??_]]}p8|wsGDKSe#0ΏqfIFOl1IDPxTyIrz Z D°Q>"/^aMZOՑE9g&6ڧϢеsyVi㔊c̢J28'K]m7WWWa$ݦS)) `YJVusm9KfY8y64J 5 AԀiD$^,d.,Hgh|S;!4FfQ",_.D\e!\"l}6b  SL ""5rB#t"JLNJb{}b[ڊ5:|QBWSlj:3!< ۛ_>=84.Q-jiPDri?J9$]` RZM*Ud$] ي,!*0H9R 1O<4lwݞI~cݿ 9*„OYK vͮ)H.ejv=]5 V=T > ~EVQoNEEY (fj}u٣Z0Xڀ"on I# D$*, dQ1 .F' EŒ2 +D3s|'pYw ",$lShgDBrڤLB@Gp(aHDp*UTy)e>M欮qs04䬈A4JɈ t9{I)M# #n)ayF"{C3kOTk4m)EmcRFt$!i$eS) x@t޼t{]yr\ '"q>g|n8G}(]?<YUnorr~>f-\vs>|^ݽ_Ov@Y_ j(p)J)NGzg#rB*Rh|Ť~b1 ˍDKYoTͦåiΫ٪~ l%AP\vr'cq`P)ۑsr<<22titXX)$+·5{NIEyḿm̴;8h~ʖC2I@3}֊J3@ιcl׮17e+/pY%۴ B :j&' 󩤹2(L/(sqoW0@7%̑%"ejJ!R,rl/. >yz4%Cכkۆ Mdu}}p8޼y5n6+kڇ8 1?y?Լ>|piگ_Rs)Mۄƕq===8ݦ?&tqtx-ÔsV?zxzߙ~BϮFU2:yvŽbRe4 +ʋ Uz`V$^6@83d. N`u_]1`Rl{aḁx0SLpxr|?"2= B@9QZ/&#H!Gd .hC ".1Rm8%O3&ⴭ/ @W4OD* /X":(:L`͛7f{8b0 ᾶzn9G*Y/fQ:K.B$RazQ;t!UZղeפ1TxJٶsl6ǣ!Vj2r2J{Z`sh1F]XWhP%Oia ¦"`:8 |>w)pʂŸ0/kL@,@?,${(U!)Kg-TdO`f*[=Y~ݚ;oo>??o 4d;ׯYRJ!,˗/#\_ooqn^y==v[$<1K6y|zzHww۶ lX!TH5: K7H%# j%,)j)ē&@QU b[H"KA.ȭi&V.mTr:~bQD*:BL&UZf2[#ΌZ("fZ `2KS"8Ϗa ioWt4 D/BO^\piW؇0 ,D|5JJ=3[hժ_ӵ-E[KBGl6]?>>Vq}lqd|e)9v<™K.R3.u%@,PGY].N:VO9͸lcS%XfY !@9 +.9 h4Ucj%fyV*CqĊWz7@)"!E t"JIcBz_:`TK@J/7XfKVZb4*Ns6[ om+mk+y{}}=n?Fx"4䜇aX4!Rڶ5O?B_څnTX@UvOp([!|'FX*9W@Yq'`e _P&[8p`jL k^Kė&xE U6s>kY "f ETSX!Yb`&4bLSTC 5{Tr1)i.pp8<>?ςݸ&`J]@Ēy5XTzg{-6v,w?Eԑ[KV."' "@dkQ b*:XbPsx_A TԌ΁ETDBPեp8t%o7}۶4Yf *Xׯl^__Mgҝ] Y$'%r%mpVUPd.䜈"oL"J5I)@ayߴ,% oM4EK(  XCUi&YVRXfS@ȦCɆ}慩jDjSkLjm4ѻpYܟ msfVXJb!8EmV,"‹Лߣ"|Lx2x*8_RƱϧBmKMPxߔRF~i!V0~,9C `.TJ-@jQQu#"E: B)F q'{`볒Q*<4All_h9rBrS.":sv%n]/yëkX#sj|*eYwt>Msl6]]dcakm7"\2Ј25WWc"Ңk2ϚU* llP5hn>EEEk%ﹼV @J6X1IUsn&k*1Apûq8N#"ctWW7Ւ"ZBp&4QDN~iO?7>ǻ*0t]}~~?af߾|Յ%aVmWDc!r ynIfR.r ⾬G) 9"@Wtj'EwPșƶvkyGJ.Йi(.JNPD*(B-k'P0oE.H)2ey> |>)+P|ahD {-DwP%tGnv+8pUPxi8`. nZ -֪&shIED|p<Ġkyу\bd= gI`閖azAz,j8bl xtզiˆc., C{粗Ƭ̋D隶G@,QĨ;%o3:GQ甚 b),4b琙Q !,PcDR*R+4 ! s,wWq]jOMiIJy [zv:Ǫ\5P- Z=jcf5*TU =8w- !BREQ~"(:ώhfqgf$;hK^o>}o73ߴ=?~p8"#'_Sw?sONt:=sam߅t (3Cr΢f]0K)&>Y2]D.Aj ZwVkB}T,/!̶0M@ IDAT7C%ά(*夋m| ڠw4;EYe" vΐ9mۭ*1im1 ,B0uP8$Bb˥EkXFJ)fG6\^j]IEB1C<9apK)%Mo~6tO^h9ŋ DC 60 "Q:ιnߵ mRbBl jjB CvcQ[R:㍙ heJk._T !9}{IVATDsΨZi0mJ8tfά#n]?BR)HIce,\ri{{Hduv2mqLL!"s.ۻ;ٻ߫WcJnvW9~vY]l~D Ƙ޿_~vLo}o(˗o_|>׿~_~9NF*]ъ^r-Af "B.Q9Ć4-"B@NEuiTMUr`.YpRO8KgQ Ds&˝]{op`vFѧY kg[Z;*N\ȜҜbJ%ŒR)yO<f$l\h:6@.I`J,3TY k.Ja #kyʳmúuy&sS.j'/!Ǝ̮NTY$ƩB]m[8No޼1s4TrӧOmkHKF. ;罯N&-,eh/5TQ+ObIR"Ҷ`_ca XIZ5t̴.Ѿq|/ Bӌ/{ y6T_LF>ԷPϪolT N?g }2!nun\ƬX.s!.t:S|V<P? of V= I9#?n~oák72x১9|]z*rkeJDx u,aT J!@A@СeSgh1 `<#m/@h34탉/ZС* NLE@眂Յ Q}IX Te)9K,yyN ?Jw!L 9N<6GīmJp8(n3nZ94OmOχl߄MsLJM? "?~߮lK{.YK\@ ;-\љ֟UFl,Vc]ST%5+ƪw"OwdGgFv,%FcI&XUc`J*l.YsNv.yvڦGNP}ew٬=?mumN+TZϠ ^ {h/auXET"eU}Wê^ Hp8w^777777(Msl8Nd6M!jn^O@7GvlV- "d&1Qʾ;Es_6̂L뵶+RP5ߛaw{E1 $1m#v~O~ۿ/uWWW3hg;M'"_n˗/yZr~7(&;q%q)EH1T6%$t&ϳxD/wҦ 9BPVv%vZs+h`˼P3l* u,aQFBGK KOf.')`\i2DNd,:<0'ߨ[z#G1R(H´VZy jHZs *)R@K`EEXUYKaG)X:qDiVXU(:U$$@ 7; B 3%#bJl6FW!98͍  Y#2cE۶ !<<=~9+yӜJ*M P|>|> ߿իW1yq<{O!vM)@sz/I^ys:޼{wBẔ!_z\]J6uDQQ]ҜkaVX%D`[#8U]/O2ERXOHݢž]UC9o@QYV(T<9%*O*As¬F)YR)SLqiIȡ o9ϵX-끈R`;hjanIn]AWnf[˷Նig2 }6Z{0ߓ^#Rm$.2Ri["b@K4 3Tt̗ǏOOOdʮ65V%2DUfۆiXVwjoyͧ˕ rwMy/[{VX^jehYhc2ngPA"kN,m˭jI\])^h/*KEْh!8;60. ~Jzx<ޮ`۶-q?|41Un_u],6X4uq8ͩ|߽{xx?!""]J0 +x:=~2+o~>c!9g;ݗi7aQ !DD@A"@ARc.ZwcN]Lu 2qI1՚2m~$9s|L<ʺxwyE%0laې),繝)N`|neN9df,pJ4 qHGx/ER,gf^l-;#|@Z1AQQޯFphAhq1}mnuEh`1R8mHdLI)"Vj$u̲҆R_y]]RhN߾}n߿? Cҳ3O tMmwysNM\38TSdovtiI兊 4QV\Xruqe,d[\E8sQ˧iTGm "@@9ǔ@*fmLL\vy\ƭZpT-w6^ KH`;"QRAaڅƻffK27Xr^rj= "ۖ !bk JN%o6paF@ё!6߾9N}ۍw^ϟo߾9D~{&xzLJkmmUx|>?>>T~~|<ׯc!y& <}D0\]o kYQSǧ{}J^&~j9:f\Ŋ<0~ݲ {J`dN(*'BVm*GZfC*̕@Q `1[k(`9H |)%Vȉ˂= 3"V:2%&p \#OMZ G s* r"Jaf"%NM(}nhؾM@MnX}P 0[1JЮlZ;2񵲙*jr!o>NsdeoaP[߾{w"^o{?7ߜ!ƩC S?<!i1џ/ݝN's] yayߝswW˗/DbbjDfG@hN9z. j@ B Xi;s!2ևb++Z@T @ k鰂* :JvDpTK `EP 0ePPT`")ΫBYJ)(% KseRJe0 8/y"QCm,HD xr<:]ׇ8p)7iN6MIi9rkEes錩SI@uGP̛ $K)|EIK9"(*QrT{b >4 +ibaC 7oKynb>>?s)%(Ww4*RU^'4ψJI2(:m6ߤ95Ml RvSR9\J6;+ЊhKa1%fo}aΓXF⚖`ӊheEd~U gڞjG "8OH0z_q.iD: (cKY,67!ׯa(%Rʜ쮯`&},E #\8U}),›ƦjNȵJ#myBի4NCio۾~ ޾y4yܾ@i߽~6chX8񻛫aayx|(a#s{ޱJu,98~|_?޴W#I43_"22l\Mbv4 {`c.nרjJU"%Jrl>XD${~('Nd>a|xx`a<ðn///f?^l.~xh!]^^:TTV $ZRi(5{(3YTIr0œjkKnE,;e@9P0ɂhyBB "mŢTJa``TEDU91'wHCEUX&.9s.DDGEp #m7tge9O"`V26l(oTPJZܖ˼kXRX2x$C'a_So`)FCmQ<=tefB hI!f΄^`~],cCH TcH)^f7)n眍m4?\Ϥ"ZJ*v|4pSG>QLd"D1Ɣ k25Us>T՘RՆ/Hvgc]dЧqEp;sk#Xݢ]_I׽8w4-PR&!IB4ٓa8 MJ6ϼ>AU7fw1q,/K*"|!nsxs@plO>ƺ UDdgϞ5Ms*]S%ooo1ޛa~c|؏ŋϟUMLi%6PTYUV`"ZDp-gXҳh,"V3@DGsϴlZkV9RġzMquHEUYWBvXuMB&|ɻպДs\UCfjO޻3۾O\br:vv)Ԃ`)BDvb{p>iӬ/..?OW^{3}4)annnBw}}mEpmۦi^x4ݖQqUQdPpΦ'm^`J)gdYD'ܽzR(`g{#ЧL2Rf!Se%}=RK\F @E`?5lmr@թUvr24 )};ITArD An![=kb2͗L?b>gșkw3J<ɿl̲ Yꝙsb7 '~j q9:[V9ɲ'`9Wz8tÃq!k4͘!qi#hG^/1/GFC%#.a<:@O%Ex_6 mj?OQjq0k:Lv!qřcv 2]w Ч>g&ܭ(Ra⬲ Rx,im]3VԐY&v:tD!g6ziqQ@i8T1 *C2X/#:;Q)dfݣWձ̥zE"T2C]/wͥ\tDt:2 n!)C+%EItgLRPУ'%e:R(Rpђ+ǛI{l%았P#f@ĢZ*_+mB~soZ೔ęGCNUU~,Ez'Iz"s>h ts('@"XRV mFsfvF,'耀uRoHqPCewؓw GWbKɗmS۶Ҙs\UMޑwV2gt4㙷K9i[:$]mճgTykvonn~H)[۶޽{w82Fs۶+x<2Ӷ7޼{Ͽ//޽v\|9n/Iَp~6 ֢rS,02ْIe 1j v:notz|2iUpV}&4 \U&! '',%\o_i$`k]";djA眡wM e .a1Ɯy7sn1.L/lX(|o>';`ѥ b Rbc=rjO%0Xϟ//on;"V5[M`4D]R*T,%fv>bῌ5U뺥7mfǮ-ן~z4bRJV^\\}? ?ٳgx<www"BT (B!`ԢGͣq򶺅vԁ5/"9Zc[%B)?=$> 9? XFgNqӄMTYPLM˻5nX8[Q2K;}=ﺞ5+ 9!bUz20u`g3HEX `sb!k9"ϔFl+uoM},N;`AhT:JZ2@qKI9<.0=<v{qyylVUUv]J6tDT7v#ZR*40 c֔4,(L<9T)`9IT P%߲ɪet[gsH :G1#pap 8y9R悎4,DXJþ1꺮:Xh<0tڣv4FRb!vgR4*%ykzIVqZ`~)8$)+vM)G" s.u 1ƺd@E]חKZ7W]ϟu=w[7Ϟ=kcO)!Nϟ?#w/.'0x.0|zEҜN'| ŋ/__5۫}_1f+CcQe%ЌI@h: ޡ7<ɮ0=hwn)QpMS2I7ve?#֦Dy*\e&-L\=nw$(D"TLٯ 6M"_R_Üi< Vr%_/4^pqqa030N6M)oǏ_|ݻn[=GԸjevk{oonF DY?͡'0)K90! W"2d1ܕ0=+1sHU=D)8Y&4(QTĂa ySsfsS:\[ds'2e-{xMK8\JN%¬-U!gs~}w];nߵcQjECUSJQUkQ v먺<8d靯QbNEaY`fe9g %9P(dJ A9sareB zT1WW_Fľ(ОZ[؎c `{fnˋks—c8E Nq_FjƔRUcY1S/9za7R{cP\9'"VUe[sTRɥMW轿ceRyx1Z&bsl7~Bǔ9;tUyA4ɻ*2CUŪK)`A]\CUն!U1VO- ^_\RR?VU]ƄDfOR`ӛ*ĮmaxYSi:Vwzw\lm*`&xwjOv{Bz6M8ι?x׷AQ{}0;|:PہdH!h"B:Kɉ-mRh.g>upzNC*J1sn6VM< 3)t.8ְ_(YZr_My9gup3VYNhHm66xi%-u' "0+Sjd"#Nr2V^5p8Xn%td kϚKDNS6XRD][foV2H ΪZ)eX|*r[.QT'3ɼe(sI)EЊUYXl41޴s&94)~tR? qЬVau͠-D?Nh)2>M-좋!bUuC~Շ̠|lכ~dPnBa훪~!?͛~mтvEbs<ñժ !p8(ӧ\/RΟ?-OEyHRgvV妃SdG5@o mRz[ڈGs4=5I)X7-E=aDdNyb* B.RTr攋"n]=OSU^Nf]-jI`&ieHO]kY~Q "ٯN!9=/S%9j̕rQYa◯xn3)ŋБu;9TڥZl9aH$$@vMc!+ 7')X`(N1F#*L{;EM" b"BLGs2`10sV50NW4jYYm< "[$rFL|&*Q/> @˨`"*; jV,؜sJ%F*pq[crtǢjZ-ZU6 u{꬗j-RJN )w=0}lrMI}}}}:~PW&C݊k|8>!0EvBw Zq^C_~=__~͛gĝ'Avd[F J T2"DK$a֐l08SL0  USU1THD23;';9a6'k ΁HqtR֛s!:ţszA-QE!U:0-.lRs VM.C]W΅S*DZd7!"|IaQ"`dGcUƅXJr-S@%)PȑbJSqXa0k@AQ -vq@1ƒǤVv}"B4Zp)u]ok眛-P@AU3@00jcnW;S"vmwCch^_}]nfnNӐƶ]7>XWuS=?z/}ƺ@ !**\;=pwWJ ??~?\^^>_~y=^]]YW7nۭm`ֳ!(S)oqݞǏso^ǹ}u1MY Yyv~.>}H*zrdh @WTPeE$3TVLf8mi@lĦYqsq+c< I%^^\^y0e\9&˶CZ2ȥϥ0rS7Yb̾^!1 .Ny#t+OӸԜ6I_ i&KR.SX*g?VIc'M(D`V* 3w.늀J:-f bgEG~p.tx:뻮..7DTUa^+0c8bQJl12ػI;tuDbHDz4yPX8*ʹI9vdVUQDDQ;{d,r)+du]UTuɶK!..*D5["B#ZJ,:9v,$\0ii cUJZވe!Y ye%gf6)5M;}Yszvnj{wyH^rQUUhL|CP7^8bD;vz~ݗ/_.-Yݹpyy=%Զ Yۻ?͛7(]w̮ϭBov;x/x_~]gӧOMӼy?}<?#"9TR<^c d (<9 \PuAǩo$Bj :7 *Xq-S/I," P4EARObPV) \rA.`fGI9؞ƾiʘOEUIDAT>I]ʭ^az,{$  S7wH2'@j{!BUTFd_ ޹V,1Vv^3KV`kPsh_N g~&o 8q C@$U.*T,/iL91"x"c@~^0%njmVrKXs)ӞMVڶź$%\S{Myt1TJ CSc#rTU0@pAY:.ss*U\pvq'諛g ?>cЪj]c7<ݷެT.i@/=>Ç~P^bp.zǑv+w{AˋR?~Yz\>k} F}+_v#Ǯ}o^\\kCAHu S޹pw"05QA%&r=ZjQtlK>ӣΐ2^lG"[iyBN!* 0j u`&d@H |f8\;RRDJ&SϪRJ'@@x(܎Kx~Meȩ8Z;qT5u#"y"t( 99xQA3hÐ4[6\jX-iZs~t+|`y s0,!k'3"3C.ot]EЗR$1+N.hXCVUYg. {_ו#*)3  eQ(Xq" !Ӻ^cwjAݖ` ?P9BryrUG_U"勲i*C>lqUy\AsXY}p~eaoUm)%unD_l686X@<Šf_*Dbg)PaU>4yb5CzkOm%2 [O*VyͶYs\UU(7 /azŹfӝNDͻ{CYuhltXVU|ww^:_n??˗/_ˣ0(rKPQ zU"G jNmSE*b]A5!")y"3:S WL'"%B)1fb<UEAtUV!0- \JʥJ!V#6'`Q-)w%nDzoC0`4|WX$J*CZU6~62&.,g.!8cJ*c1p)2Y Ι y*id.28T85Eaʂ~""D nj>-EبYƪ9 Cy8R˱}t:C֒4߾}\bK9x:UmF[I1UWiam7aҸn_|u...޼y믿{{rm͛~u]R2%Vfe\x0H\0 S do9s"(DQYxVY"ZFXΤ)c{42N˘F\)b9 %p'%BDpB䑈UrYXe BDUU}W P)%gV a! 8*!T%)dHs8[>{ Kq-q=mAO%O5*kQ]*Rئ*P촔E,T% u=C?>̊^=!#&:M(Y"7UmE8@TD53"zsyȫعGɓBp"RQ֑{om2]KӠHz] xUmG_’NUB&4W+SF)O+LcLUe U p@%1}MvMdS($9X&a 1a!]pDn5w9HRGe*6alͪh D!9g!jH.x~lsYlQ0('?/E$sQ,,Z)t;mvŪ, |4!H@IiLy(%HʙULOc$D^9Q/η($[ k4cW}]˗/>3.P0mYh={x|-^PUop8ڸɅ87_ПZRx9O>1o_xxdϟ~e:D\Uw}^V}2f?}t{{Ϟ??ȥBUWqsyZh2࠘i&zp h 1CW lHd  B d]W ()N23u DEtɲ " *SPA"N&K9~9+(0fw]۷c HA1DfG.SUaѮq _!\"y˘}8Ӳ=`K:\`M ;gR. <f;{x^/_ΰD(X {8d3zeۡ/vpe B.D]?kSJI hy5[uw=]턾Dm8V|)B0fR?-"1F.p{?` >s2.qpv(TzR[)m[Wh9P;Mٝ78R'jULv i!s9w]uAM9 Ha8S()ͪaN;Q,5CV) 9P'ڤ"Mf%q# *&D@Tn }Mql#r$ͦPJ}:c;>Ƕj\)C @rP\J .NU7>OL_H0N*V]cGTt-2G(@9[. Sbm@qfu6H M12mW6|p3yr-:V]BMJ).%9Lzq8ՒgɅRRbL5 6%LAJONˑ…i g4EPhIKǓas<j2|(zZ8!!qpʙ_\]Bn/:}o[YbGceV윳-Dcom?_>nls e݊P }hp)8O)9 +:Q'<#:EgY!h(f'C$~Ȫ0Q@dTƔRa UDPGmN}A/rǶd @G#[z'' #%Ć@ r$Gݎ/:" 0uܧRO6fn]I#3SG0z+emuZڥŠ'drb@R* ^T<IAe'cJsb֔Tވwλ烽vٙw Q{q6OKeE+wRjnԈ8ݻwFYty9|^׵։SIe) "8%<"bb*̌e;Ǐ7i\qi"wmd߮ט?=)~?v˿p?oqٿeY~ o1|̂_}ܖz}᧟~zzzڣ%q#p8Ŷz\yiG3֪Hأ&h PQO x a ЃI"H `9"6Цwz-b&a1 M\-fjQ C;`'vvw-\R꥔E8PL"~7״Xى}ݻOFD t770 sE8'!pu&pH!,ם_04)E,憮`j\u&nZTmv9!3"PJYkK QbP7H EZ"fft=\ؿ!88161¶96(HN`NֺYp!'hoiZZ=e{#>x,7|*[ceD ںy^ꚲj+k,}"0ߺh]Pݭ 諊$ )iг)0DDp\ n͛G܎qJ_,ixq0ZaN!&|p8rNaӺ)*)'X:?#Y_[k0 Zz/)jqe~הMzǿYn  @anh[+/Ǵ}c6G >4NlX $݄qp,wƠA(v ) (#(B5 JG< 7-6p7@'&1h1lo~Om0 H&־8@o\~-B(aF,"]?vN*"uDkN#V50Bfr̴, GUD Z)33u#Q8U]B"3s Lxp1F0ua@ :D ?N3("$EVpaip+Q='dC,cjJ,"](_gvсkaHe*;RZ 1}eI Ofn1IDjcyP>Ny]gfN2RSjYo(,"m]Qr"|-e<Tv>#"yH)wluY(KRk.0*|3 6xʐ{tn 6\aB)j -|&)q(%fnz󔇸{VIENDB`vokoscreenNG-3.0.2/src/pictures/screencast/format-codec.license000066400000000000000000000001371362045215000246040ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.0.2/src/pictures/screencast/format-codec.png000066400000000000000000000304511362045215000237500ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs B(xtIME" p: IDATx}y\guj}վxd[e1d0dc88@Yrf9IfB`p2%@Xb Yjk-^~]ջlCzRԥ.uK]Rԥ.uK]Rԥ.uK]Rԥ.uK]Rԥ.?'B~N_T,m -&H#%h2f. % %!``S0F(FxE `n?*`8Kѳ6l8wۨU8/yɽ `)yǃ9<J)b Ca0M`n0 rx'Z7Ȥ犩G@dkx$Iz$ @M+A+i(K(HR(J4[ן|OF_|f 54q^mlD U}#X( !`zj33(/9_7OO܋y>`(hFсh4 Mӄi`̄i1w$J  J (R蚆d*D"a  yKJoғO>["%ȟͽң QlASS#eao ÀaȤ3G"D.E6i2p<A "EF0B(!;mJ)8ʁrx\c`H&S08J-1b~>?%}s ]=+1]סS0<4A3}(@{gYY" .9\YٙY bll \֍{# )>u3wSU[lEOO7dEqkA5\680W_ie%Ua*"vPmutcӖMy~Uqp2T2!N9 #eǟx≉SxgW? ?$Iؾ}z6@QdWdnT*@Ӵ ](r/ff*a` T?TyKOPEyt,"c t/@ 0e2Y:H}_7Oŧ;8|}|φܱ^yk(,|/ ly1|>O|_Tzا ص644|9$ѹDz}nm ^okpC٧?.B q;b#_Ai"9'>Eޏ}쏯`B~ݽpx]ΝR@Dˣ&'p9LO;a|$r7McDOp۶c߾} 4MY 9!z!{OW.>@LOO *cy"t I>Rda~υ8p?0$Kk>w;V,/[fggqs].#H~݃ӧ~6lBKE/F*e8Pt Xԅp7D" ؿ?*LMs?_Μ>1;b|ǖ B1ULum`TPXi< 4i22ʴGv#:3XW^x/ϩ]_*+@{Gَ5L.w|ep'>qg~q%[ !-+uoPx."6AJo/^um~(r;n&/~JI =bLG.]{ '6 nIEQ|+(]5i61eoEr0 G={@)׮1撞巽_OKz7a޽ eHg(V~W%Ϸ_$a]˗{([L{@V?νwZ+L%mu V$79d:/xf1RjyAplY. ]`IvSiH$Ȥ3Ȥ( 6@!"DQ,+x< ^7t }Av킡z*#}~3`} G"xG!$JZ~4L躎d:PV|YU]E|;ގƚk||c㘞Yv@+"ttv  WX0@)E>Ǒ` ~M䱏?x팘(PNl6bimL:t: J)t]i@<^h@)uLc}L玩R@igE!Y  #,_0N1221dGVK,Dц(&&Q({CP.Q/,NF )\tclJ4](H^DžB1ud{DiT`JE Ba)O))yf\g_n&~ht& /@ ;؋t]o<O?_``͸>?Iۗ\TP_}rsRIf~EVp[+01>S/D>_V. 2t@"k0L @0 (J` 4IIڳD*tuvP̗R*ޙH$^(hGcs .C)8JA u2P>?~?C.W.g sJdY& 20;3ήN0f:&V?MmV_~طoFT&YqQg2V堕4 BQ!RBA$)h庺Ma٭c9-݆EAefܶ6re?<2+e|J:x>t&mW9Ȳ I4/D(B>s%l&שiэC7tG**0'ˇ0$h2RiLMM!O"_`Ⱥ` BhSSS䂸(HG{WZ!B 9~J7KS>MXA44061nUFnTBQl۶SSa lioin6p}hha(Pd-#aAO}Nz-;L2@>wx}011󢣣 6{躎d2D,t&dm0 ^ "TUA D(\T>dPhIŻ[= `U?zudmV-G,xp+ԩ:i]i'Ԛ-oq6NT/q󘜜pE"aBU=sd\x }mVu99?D"D""rsmga/xsL!L $J m[ctt(J2 dYk0 <'/|ag%^x]6E$a^8|B h||b 8Pj[EAɋ"z{_/TnHs~ߕfyif t Ӫlp T`膫r6D[-Z&/OrUiq U}0Μ>ׂ ! UUA9 4;ax"+UqE@pl ^ MͰ9XGeŹs|hbR锃x+Z(J3l6XwK\n0}(~ `hmnui?- u@xrk̡k\-\]AxSrUqGU!Qu>_@>BB-\niQ+JkFNb["R^Nɍw.{ysҨZeO__ IC޸K9 jSS[͸6lUyV/HڛL&ng3YQa C 7g {! nVR K~. U-U2pHp8haf&7 mǭ,_H\y )sxd`㪛V,="H8B]wAORcbHU+P>'~G&C,CP$IĮwUmu+_kJc(Aإ|r@QT2eAIwڊ'|qee ߾lCf2U濜|33"nvȒTj!6u-ӠKn ? 4uyx,իIܝ6Be/0@Wľ 3p Gu|O`f#w:[^(LOO#0,ȣ{F0\"jp0 .+2X} Clj\Qtz3muHq}{67zq}qpbILNNBd I8N!c 8Cnn0!Ɩ-eQ&s^ g5!i~C$ bA c*$JsZ x7"2YtTt} j@GzM݁׮c|| ’-pB9flڴ ^wyW=dF^ʃ+q}@(D" 4P*ਗ਼I%Ȳb4%/]P :'&16>i.y)EG!6|>^ܶVtcffxBqx" !m@kk+~7!^N⬭8[l33364++ l`eY@XDX,K(ٻg%QZAi owRIC_Mi''j :;݉N \ B(Q4@$ⱘEJ0@\<9'Ʊ}2~?B0rÃ/Xl6D3iy0Dɫ{*>W/_[г/I2< Q K8wJ f( N䞈''?nQ8EV֤řIɡnTַ6oՓ*_,+ Ї>if f)ǣ5PܹOU蕳X(B,$IXaSWfT:X'NK9C$AwW:::49\{$)xT|~4Fٍv~{A8vΟL/6QU3Gʋ(H$ WOedipbQ\.X<欨V@0;;^<>ꁃektb\T|/`6>4Q={v(=LJG"tuv![Hj6v*ٍ۶##4?S'O-{gЪ)xU+Pr+Yea Żヵ曷rcի΅z >]شyX㞝ڦ2L;5!W(# _cbb ;Q/q C$t# Wӯ*U=2E ]=ظa3AdjjsxEQTp^~sxwok A?N@ň۶[ovLfT4bY y>PJC"6I<6> 0*(Vdd@,aZQ=*sB0c8r/QmEm!5|غyxbq\x miV/q$RfBlLQx3֭X,:qۑL&Q,<`l| pT*-0f  "61mao9\mek 6m܄+W@׭l# ]/Pd+prB9^u[=@1 @Le׋}wbbbC$I6Uqy`æ ۬Mĵp45ثvN+QrL[/_^Wsc^tr)2[f(<2 ifpHӳS esCl6x"d5W  !Ѐ3{&&&j4 C*xC'H%Hr/َ'1::d#ʞ[ ÄE6c ?atuvA$}Ad Tj,!͡T*7tPB!*$iijw_ XH.krrjyeMOYa2uek(5,-jW(^/4,?{ Mf 4%^gM<~U-Q00p:FFZP2qM =z_9){u+ZUZf͖{cx^DKSۚ/r0-+sk18y#C|! چb4D(V]<NjGX#뺓 %=Qz dmif{s TYE4<.ڔgabr'~z/_XK~kixUS :\HY22V=Y p•^E 'zoA7ŀ?H(z ɖ-iE2֢l68zE\t9r;&[Zh01d~bY2ixq Gc 2>C "D#7b33V<Wq'p WP0bpvJgrUVzNV3MXܙ @ E(4Lę3g:z$ CeMxr nݶ#u.(x;MM-kƧF׭4L;z I{D*t,'Z7lSj[:֠Zr7E[ΥL ɉ9C8qredi0ѣo>}wVJl-./^L}W+twTn:oZsy=Οhll!p`[tJ֊t*l6RD"a\.(s7d+<6a㦍T­RsB 5o+׮.&SB8Y0.Nf3s켕ǚbmBL6h"X)EQDC{G;TcFV FQB~MRH&,Le466UL7aAACC7oAgW'-vlm[j* ~oDCe羃'O8GUCN2%5qk /tfgkusۏL@!/r H {Ů[Ta !z簕H"*F}~6C6E! 4A9 Y BUԈ;w80#؝svy:tyOJ)ͤD+/mͺ5+-8жmy^ M7U |i"LV|YV`ۖVwKILo21_cc욳&tuwU C3q:?xLu21ٽ_מyO"/Mo.B+ojF@b떭xN.$ҿd:T:X݋'O@$BADhkm]EDA}bM~|q,Bp%jҹ9|ȥJ^UTX$ܶmۗ-6-\.S\Qw7vl UT!cJ22fӫcȤJ%JLqDўY`)Q=>xT/*"\G TXdz %-eNgJ059 4 dVJY!$ 3fN&b 2д`oy z"|oxղiۺukňڜL&uR;vnAKs+ju < _mJ9Ȓ YV K֦YR^-019=.lqG@Vdi$I$ $ $I$5;B 0v8BrSOέXvg([V]!l6l6 z+mێh$ X4 t]a``0H u)컁 v.^Urfcz ^>sz=cH$A5誢BQxTE(% ΍EPJ`xB!\.l.t:dh`E/wѵJ߿+p۞X7R޴e <"<08B>`0P5Ė[ց?$ ֭kHSkWWDJ$Ȉ{n!z xުQQ+/Q*5RI$e]ÉxD|@%g&qRP\)3Y&`-DKkkEaH8<ε6Mϋ{RUwL$ M%7%I,KxB`.G:C!%xsYM}n5 y @,K!<$YF[[+:;gB%{3ѽ9P}}7+pΎeݝ;cpCSS3|^Eqd+8Q;"53A]X3: z05)v ] X.x44Dd?GWnU<Ƕt/J#,i ~|GCQ4|.vBA ؂ 1n27ucF7 ]'6d._xj_HJj[V&pkR@XlgAT]>fn< R=U;g ,`&űc8)pb84z,kmdUMT\mW|yoͨF&GRFmv] `ltΟGߴֆ Z/)DLZEًM 5LVʟx,?W$k86w1$hDgYǥK084|ؑxUX @h),^(~]^K$H`?{hmhg3#g,R3h[/eZjʿAy6g ‰}3?kfi OjY:R\8Z\oL~ \ s#/]YrAq#]@5 = (%}N>|XyRX XgFqnlrбNRԥ.uK]Rԥ.uK]Rԥ.uK]Rԥ.uϵkH:IENDB`vokoscreenNG-3.0.2/src/pictures/screencast/help-about.license000066400000000000000000000001361362045215000243000ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.0.2/src/pictures/screencast/help-about.png000066400000000000000000000277651362045215000234630ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs B(xtIME 1ٙ IDATx}y|}+iuز.Kcl hɯ$MMB Ip҆$m(%MB  ߖo$Y-ɺ{cwvgy&4;;;3=v]mWv]mWv]mWv]m.)Դ|8( `"$2R/27#@ t P9AܦܚÇ_%؊W(b .ōXN)&@ߠ,(  4lzU|Bm J,& eG ÊL ?F0˝~@)Mv *㔒T{u`[꧊I0wΨl7L.¸\f ez^?/uR'j;qG6O$OxQ!_7lvU c+]q5!Ytv`ΤB,U3bbi$BF.[{pE쯼}Gk t3[rmK:R~ o6ܴd"n]6 "I]*ŁS xs9S* %^zw*sHڧ>`JB%3Kqiqa\vu'0vNcuFz *捳JR혅HqqsT诚MGJUICJs>S!QZf$n2%(/T=śJJ<$DF-{ Pz?P]us/.G]mWo͗{^ `H?iap9p;m{܅'_؅=kWMrݖgI{W(u_XMU*EՅ˨j\lACK7WW{\61Y(+ (΅$ a56|ZjlP2LyQuOpm w-aյvXʪfa&?d0wO c0{\;{,;0xQոo@ [t͆; ,v鯭Œ`H<U5Iz2( ;SǍƊ|~9lT9ӄ~f.݀n*M^%@ڍ_XK\3O=Y OH<1~=K .a@l7Q ӐIy\ǺgbD L#o=obl͆'}kw]`L$ ۭDZ`-"j61kDCx4AEy33P<:3mp7{Z,6m~#g0Ki$~ lV ZZ21+ g;րr'$ h(t QHE!mO#ϼ`H?E^|z pzxwQ'o݆3KS^;_ xRkqz5$ zm6bse1sb6w+*wb 0vq%8% 8|R/?ނ- Ixҙ lfh>z2$Ct~E̟Z4J(탏@)% dwʗwt]q79kzu/f'e|h7|=@2J|d&N5@. b'!xXfOL/΁bzpEkpg4W'X(_?ėtv5 %s' %T%FQ{!{aޔ"d:AɜI8QՂ ͝Pۮ}V<e{wiփox|6&2iS$` d"HDHtW^t۹$$ka˾s苖-ΙpgՎ>qL E"'n$-MWxmv8ҖHsT ¼'N` 3`ns\8VL7=R\_\tmuC(2ǯ`sL|-o⃯Q8$, ;.fPAAnNdp9Ye( P*a3!AᣛƱf8d%A, i2C]O,8vi`MOr/o209b cf.1Y(¨lF@-R<3hf/茁hGK->6u7>C&0i"MlE$m +>Ǿ)5 Xh|1xeq`RWxPyqӅ}޳|/CI>!!Hn~"丐ᴂB ` DD"-2vجxrXQzԅ%sA{W?Fg1([_DC[/ΜowUopX( NoES / or"I<#0BTUMn$9  !eŘ\(K+ %VypZYϛ ߱r*:nm(_M XN?AIT8 K)3t"SNxUUE0M0&ۍS hZ*Et뷏 /V];Y{gḵV8(Q 7`ۇUZ`K`[*IOKP(Lg7aNr{6y9pmBgĪT%@ٚPYR>ZxDl R.MdPL'M`9HE(J)Bmm˧ Ç]jO`tOE~9zVєKSC2r:vZeSc2#!Vba𼗷UBP;-f $IX,X,e%~LxA:W[44,_Ζ2DTo{VY`ܮx]F`:svظ*ضۙr?i,Y.bjjHtqÇ>\lŅ^4rp@h -tey]vE įw;m29l1{P8ZMmBXZX, (#7wˏ!6YBˆљ_EۆLG,*V xGyc $& Ğa S~NI P7_?q"Ի 8pZP1I6t@iB+4I@*Ԥ= ?7P{]Q@!iG^_[BA WUVYc,Ij jVq(w$'v3@k ÛDW3l&`ʍYf5kqKf{IH[S Լ=\܏5mxu9| 8ӌnN@ۏG?J(qcs01W7dY¢cc:T^9lV\MTG{ÈqA6'J"ξ .u܅^[xE\ PH>"zC)GRÓ (6šrڮ6@ ]/^,Tl?Bu:<'LDVUCgLzs5M]0:G4fG"t!QP!n_~0_ IOԴ/TpE Hl. :g|qP**[$*8FJ{qF`8d lIJ)"*E8"w4oJshhYNoJZm%9^1wbAlV9:X7;{u)|%l;gσM&K)Ag_KEQq; PCo )ژnh(+`"]24P*^g.4@6U,ȶ 0ob>26CF} ;}b3=źidM8_S:JHT!98Gx^mSq:xE wa@ `eL; htˈD" "e*#夲?ef,nDH VfFh"] 1ȓILJ|-=F$jLct`!K%p2Æۖ#?,P־="M`АL{@ 4IճT֣ p?g8'U@Jfo@?cR:i(V }0Uf21GzoM(LщvU 4&!@I~$"A*@ ) ق1l=}A/t)4LAM2G<{yn[f?SJ!IV+:BhD@3@8)^P9JTXA+yB^_}P [r̰PR6LSt7dz90 ,a,^XL=6P b !l"Xv)U{P A[g,S#Z0hdH@x:A4tőf(JaV!<6c0 n#PtdZg`ԡ,aL~&sGc!>ҐMpl3A?[CI$B:B`Bf&à$^&a%>p;LL YÌ}ʏĉAcGAsx*O+2tP fSBcx147&{qx=PO?U~-/lP"}! G nOI5RDzR&f  @ANS#hﺡcoHTBZvU~A w,Bi%yx*:}!io)K`#QnX^c?v<>0@H7dxL a]BbH~n4cP,qv12Vr|@j=?CUm8Vf La 1s# f z\ 34)K_x6sj߬7yhp>̽M-s:mtYጂD맔K zw՗uezbjh4Vz~Ј@b NNj9 $ @ЙfG|`0 {ۡ;vZ1؋L51/.^ |͆ހn_ۏ6%#dў$9!UX1RTf{!OEDZFcgJt2.5SIAʡ~}&ϧaES#.44<7?+l$05(snvYdj"9ь=U I7e|%0!4D&$a8^Êaq{>aU_;yg6d*X 7LL_>IƩ ]hNX/䥓7;5J9!4 )I8Au =V4P5@?wG;2bk_hlT0Km)`D#DLSiIP(UM=yͤcRЗ#ٌ)YF?=Gw_@{TC'&DQfMPY&+hJ.fK V8fqƎ&I"*E_A8 WxNӯˉICγ-JړF!BI%13M v2Y_0Vu-ll1MspSI{F߇#H;tn>9myeZ" \sĬXDQEdDiݨ΁^f9^;}3sJ33"BN e {2̬7K/H=ә1Ba':P>&T&. O@R 2pS=1*ńb>oSoc[zw7sn4۸lx\6'I X8Zݎc/j$cA6~h46]eF^) @ ܳYx6Ž4h;@v@{WjZ@"ǏƠ '#CM5vt>7m(F_o@hi0"wa. u8t%!*Ɓ9SKcgeIJŴ(t#O:_WO9ۤ[6Xe˞XZ5{Y%x##us/He6m0Zرԙj%BZD.l4CeH'P>t$S ~PyA;[qXɾtkZ& 0|pߴf:cΠvT|t@?|NN+CFlpXb2`D;de` d0 oPѝRɯe L/%TTJb 9;(^?nĢ%nWSmՉ6&.>.Jt_{+$Ρ   " =ɇ!I}e|h`3K FfVziBGO{ 5)b"*yIx֪3i34k)GL'ĕp/ݼA?K͙e/pd̙(쭽 L,}u pa룧-{b3]Q %%)oFڍ,&(lțYw=ded} 1 qU c˾?\'"}H˧DIR@a2^K-%cJ {X$^2^xColY @4q[ (]sP,[`rG42R5m5 zff1r\ƞ\ۖ(vIDATqߢX^1 \]ܿq*3c7Q`'S4|ӒXV|-~}:s_;@'1b'lkHՅxPml1ҍ? o-,[Ƒ#JHQ1[z 4ez?T];e hg nxo 9`oY潧Q)G^za}~7.4w'-qt5Oʾo^!1& I5JQU43MK+ J9AMh Mg&[]$?yy?~^"7m~lP2 oYE ׿|mBC ލ>,,1y}E8 4e{7? 6>7i >1@UK,'o1b+x8z>K+W)-۾ ~C^<+!eSB`ɘ3a lN b'W 7`Dâ (a>y9l"<;z{"/)Ǐ/ZR׍[uz ]*{ K8؅L,Eaڸ<"U5"ʀ˝]KJgs & @ >h9؁$6 gĵr;-p`7,vzJ%uMp;pbVE>`(bMJƨ 4G߯`0& -eCw/$k/7ï[?eȋWޔga^BgO@SY)@ b _\L,A*KU}_X Z7nc)F=mp| ws&pT؅G4L\6{,FNGϭ6&@ԃɀhMmM+r'vf/dM NW<㿀ӯґˆ`]X|?Q{o3߼#*5kh5?lVnj[F3 $ Fg߿~3N.*[TNնE3t 1,y@v&/PA Y3`\AL.c`L)S[ąKTv}aOWtwc,Xg,[w/ngwѝj|P1$p:dL(Ē̪e k ?^ڧF]Uۿ}~EF>q$-y4P<&J,W6W)^T]@c{Z:|hG0lyLrX1:ۅ19nz08ţ2=) sQp˭왰'de$H@FP!}'#Y}κI2xש+: P"H榒3K\+{fH68_C%du!m ? .w탢I:TU}J_ɾ6ׁ2Yt{DPک$?.ܹK۲ΰr"MQJ5oR|u'{/~x:1y @], _Qd<dϨI֜"+XvdHV(bD8@,B,NB,(~J#~HՐ] 4}Z iRMu@DDHgSj")OO8D Ik==4zhM O"i5%t%hcAH:oct IIabKGD pHYs B(xtIME4 IDATx}ypיu7n"A-QxuXd)ģJSu֙M8$ld2ʦf6)gjsMd6G%>2,KI$R$EI^ .ʒI|U]hA{c>Ϙ 6EQT)RQQ7aY/tNy B(cCyq<_YxW"Ig<6!MYOr_~95:/[q6q&w}0LT' &TaSpW$!<fffvs"(Y'9?@FIpqعs'^CZf=}8<~dDQvveĸ(h^to|/B!;wĮ]EA<O֧ <9-{,EX ^n^^2a߅B׿ʅB=z&{>3_-t( (#%&H0@x<LOO͛E7AO>ײyN!n6qQSᫍQfO}]}.xh4ƠjZ(++Cmm-z=|> EO:ueyGB} ?Ux`Hj:g|&P$6($IZFÁJD"A|N{w8PXTT}AB=W*%#V !8,lh4(//FCy7}*h-[@3RC+$T!"K (/P(h4B!fC466bǎ4PE!/>;6a$G@թ__s\0~?dYqFss3}<3 P\\ {I_ (DQ!Gii)b|j)@UU]l HN߉Y;ڀj@ ۡjw 8t&&&vR;!~TF555]֍֨?( ߏ_(B$t:8 0 ,jMlL\F!=Bt:8Cmm-FGG!I| 76੧(rsFGGE@cccD"D"FZ 7oFKK fsFr2H$Áh=~xÉ'=NEQ,PYYD" K"qDaquD"aqڵ 'N@uu1hE3KJJ(8֢ pqap8&LexO__.$IDOO@^ ?aBKt, V+A@GG0117n׮]"M A1ja__AE' @$|gD" _=Z[[с466&qV",|a\zOɺ(%j4~:pA@II jjjP__-[`ӦM \k6>ٳw(b0dY y=9!իƁP[[ jL3,,,F!`V;ePWHsssp F4EGjH066_,N@|J ڣGٳ(//gV$Z~mN,PR7IMv=-Ro޼t3x<)ⷿ-~_SSS0գԂTPVVχh4D"\~j|+_\@#x===(**f^_=KQv1;v ,oݍ&Rk^H!ԩSjp:Euu5s5 ~c(ʫyW8N. 'OdhDQQPUUz el6~e@JҥׇAhZl6`֭,K?d2Y177koaa! FFFf(B8F$A<fCUUԄVƬ9l08pϢ׮]COO!%$HØ@SSmƀJD"A~n/~q(UTs1n:166~DQD"Bk.|GCCC^LPzh r055Ū`Qaڵ 4T n9áC066A.3N>O~̊W $\auF͛7cӦMLMMa||SSSc@ y~W\a?x^uV #hZ8Byf`߾}844>  % ^/,,,_144ÁVl۶ 4)ں'eee `>aL#$ e^W~}S+I,[[[Z<Lt.].~]oQ\pY hmmet0J˔Ȥ!!lزe ^)\K ;n ~&l.ߏ2c` mjj*' bpp?O ڊ[b֭Ilvtt0LAb1}¿kG_VVndjw~|R''>ituue\i୷… `Z؈FףQ1<, v{FO>ּ/KS_rvԭbh40 (//GUU*++QQQ˗/̙3affGMVGPggCY\cc#8W^y}}},Jft:QSS([>)LIz4KۼCѰGz>Ev:2zĉuDQ|%M ?bFGGׇh4p8 ^ 455a֭hiiI@EQ>F뚚Jrұw3 (**B8FFFXH$vB^BQudffp5yTzqM&&<#xȇܹ;v`T \.bffA-.ihh@ii), ( `XXJ( JKK__+Xl 9p?0b֭,NA(B @,cDQ\I$p8u ޞwW>ڂyl6b۶mسg`ۡhzY[["z#R\\ggΜK ϶(RFV? +epFPe=ӟ0LhiiAGGGR9[w:`P_ZZ YK/aqqv=<"+gEEEC,#ϟ/_꟮jر;vDp5twwr SᡇJ`?y&n4ZZZXfIm"IK ?!YkWSy0^pEp8j0M;wc$IB?FFFyfl޼9I+ٳgqyt:L&455شiSRX>e~XCՅꘆ,k; N$I[͟_5!#]6q 7K~,8~@1Kuuul ^hXxh4JGJغR@տ,8wV+v;#zdRŹ@f;_ϣ W^E0\Qvx^\vUTTT(** aZTWpDVEqq16mڄ۷ND2A{^k(ݰX, XcCx?K `ΝPd$zLNN.p?xPYYvF5[FẺ:ֲc<Ϻݸq jBCGEх58IBWK'5558r[\/ 7o^{=ztWo} ?>hooG[[꒶tiԏgm)HN'f3$IbbǏo_FQ2 10(zv`޽˶w[8s .^uuu@CCL&S5Ti^/,,dۉLV$$z%RfgN#G'Ƨw$a||8s t:*++lNzp0~L~P릋ΘLu2cE>!ܹ'ODww7z{{>tƺnVjat:Q\\fy Ԥ b`cx(,—Ş,ʲJ<xY7^Vg@s?4?99 ͨ`vI Y6ZRǯ(Tg545YwQȲi͛(Y?4(..NB.i~@Pejْig+VAȥv3픭+$IxL`u3i|;}i/ Y\\d.:}~i]`*S{b@<+<3[ j\M [V%\0LL&wG 9Wh`&n͠Kw7owtNc0LIw mA~OQw^IG.I-sAAZ-ao< 3ڔ ITv/ki-@FaK1:;; !?ne(n䑭T>NhL#mC I OzޮȇU ?cp.zZ$vYN+lhL~ <@ΝS7MjEAAAc%h7jl`*YV\ VZX,IIĨ1/-Uyht7DRV ĖնhC ?ߓH$ܪ;<Ξ=eI#FՊbv0 q7@AɬOlTÐ5 ^fѧOw}8@+pjll nh&-тҵie wB -@ c@II xO ыk *^xBEQe󡿿p`00`KZJX,ƨ橭W:&SCCCo"0[@~|SN]?|QnYI&Rccc\Rxj2uz=L&iS~8f866$I7R5FGG64@vAc?~g!Ǻ_0:nqZ1vߢt:&$Sk 0LFپC`tl_{=FJgou `|+Ӈwh4TVvnX,X,1Q;D-l)A7;;aqܣ=}{QyEQvUuvvh4{iTރy~5 ێBf 6|011={rP!d=///G8f[(?=qħu "R|>\.X,L& dE~Բ!<3܆A` n*krĉQ/+/{^ͅb_$D)H7\.OϜ9NνCk} pӛ)bl"} ۻwU7)>3 o+Wl6|jB=6uuud$,'\Ն0%ǍR^@?g%IGAB>@9@D F]]],lKCuՐ^Nc6C*e~D"v>O8:%E&@2|BQghhG/-k4477GIwc?`ũ('OW*( Ç B|>r !IDATҡPXXIp)8cRJmNޙ F#J| Gh/-D}? gˀb֭[zYgNFb4pItV4zXPPyK6 L0wA~޵k`<@`x1Ѩ|\|󯯯OjHg[$A(b@aa!QSSN4,|8w[%e||>ςH0ڗ퍥,r,?uJ8B tN+|iiii'BapQZZ$+H # wKY:~<[oZn޼(ԧFCCCO=S\px7A"% Iv}_!TUU9 ZHPXhQn0y>mt6(L6t>EwGV'=/<tmg[8("qInBEQڵK|'5zv4ᰴq\pkw{PÈD"z3LQG CPd\fzMMM '^ٳmmml'|Yf~"\%Ν{ @,AB_KPСC;,y}BtNH$066)Z}#W5o<_L_͆jYŬMMMlCMM ~ao#g\"'t(0/<8q"h>0ڵтnѯԮ$Id\4nߟ3F@Djm ])24 'E8رz>hASSQ >sr=y3E Bܢ(W#Dr>-t:n޽8Ff3!FIt`wƍ /F>P6&`˖-p8I§[رchoo_<@( wܹ(>Aמ={n2ə1|۶m7 fTVV2vM4MN&8Q+**KKH$@ ׋YF$BHm .,,rma !EyyyFNŋNرc_WU cO.<_o޽;g[~HzlllM u_Q%Tv;FFFr p8 ͖9LNNҒU@`hh۷oq0L{xP( ;vLַuL~@!$(Wwj ;CJ.++A"V5 Μ9n~T!p:eФ~D͛7155͛7#H8 X,D(^Y}Az6F@@PQ>F]vMDU-??xСC !&l۶ ͖r =ݣ< + `0is͆Rt紖0nCEE|ɣ&iKQ!$(_Qoos=Y.Suԑ75ԮG $طo111Zgv娬VM{L&Vo.|'>4=yjݫj[!,J$D 2!u(!TB!6sz}LBW ?`ZaZ_4'sT1o T4^^Ѩ׾6}m@?\Xn2Lzq\4~[F6DZjvvxZ|ZBX?ᘮ e*VI5LE \322" Ӹwn@yוœq\.lڴ <ϣn;OU~6[JR G#EA0d(EQ [,WUU!zQSSrtǐTV8Z<ב*|h4(,,dիWoY&;V$Gfd8Y3 HχjpǶn By f] `Ø9׻A+ E9gff*++yoB,"H3|toޕ|y;OϟgF({.ODP2\605MlX :::V۷oGqqqʲ;m[ݤ"\n4a6Q#z{{,OONNō7V_|tݽ{GL&ӧQN[lAYYYZ$IìI{4)DFU7R(^vs~~~Edd{s HQ]] Œ#IkFETŧv#I'p8i J3MvwwAk 9َ?y~gꇘf8N8NEZeX pݘKl8 B{ \H+=Rd֭ǵZQҠL&fl6l63OjF1~AF=)Dkqqׯ_b )m ϓ"V__^?"^\]أZtv^/_~#O?^] XHH,njkkwƽ 8n !psBQ1Q/bgTܕuzeZ@H@Μ=t:P____PPI<_qRH)"kYZ#KԪ(,{Ee$IcPhxjj|(E9 V6p- HގӄSs>_Iz~; Xk?@RoW$}P2Lw};%+ri|Or %FP@kwp79?yIENDB`vokoscreenNG-3.0.2/src/pictures/screencast/monitor.license000066400000000000000000000001361362045215000237270ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.0.2/src/pictures/screencast/monitor.png000066400000000000000000000453451362045215000231040ustar00rootroot00000000000000PNG  IHDR\rfbKGD pHYs B(xtIME Db IDATxydy;.U^ׯަ8 p-fQ?,JG! A(QA Ac 801l0( L0%Kƒu$yD9~{w;'ܺUw9sWU}?8:-@M5TSM5TSM5TSM5TSM5TSM5TSM5TSM5TSM5TSM5TSM5TSM5TSM5TSM5TSM5TSM5TSM5TSM5TSM5TSM5TSM54S"8_~n/B6c+2UG}mE{BzoZ7/qq|@k9=ELv!_Z9*fp W_^׿PCw>~Qpi>4LR J),˒:k8?kkvi+y?mR?F3GE^$jO>u]d=$~$իku_A?_VZ?z2!]JۿۧDV,2$1/\:tSm4kö9]uq :8+=ϡ|}ʳOrqȳGL6LӌBiKck H|,{x Ux}{$XyWOm$i2Mgm4@+:g ^Rz^搯 + ~^RS^e/\h`]4-(8*Be!g&x=d R>u&RE ymRy5*?ix/Je&H[^x wD@7+_C8[shz1)qZjzhi>d1PG?tNSf^!d)} 0cǙN#5+)jZzKT~PkZzqt @)vh{6zmw12P#NɈ^ssZm0{4S7}Y5#IR:EvMX$K]}S=gZ0phcu:3P/dp\/xQnl\гRcvRA'rw -^{ǟu6VM)mˆe;g]סkti,p p(wA)9hSH)S_eMK24,ww⟧kAƱ):js.chhZh4h ÀaNAneKv0&3  (| @|*@O{JL1)mW7x$Al?Ј 0Dgi*[xhs %gUhB@Y|D8nai)B@ [x΍ < <||@ DP!_\p@tKs[ƠtIj5쇟ao3aW&H>4& 22] 6Lϫzt' %0劝xK.E۱W7S`E{;i.P(0LuRL*4Vy1Y3ϑ+gWֳH3/;$^u'2wu7=s]H0J)8Ѡ`yHi4l nBmS-3S ƪ5#0K~k$zxY6# KLh <)N/$ 07?rƍR0ƘЩ!xE4ٵb'|\\ 0T4H?+* ^o05DMj/)}(yܗ"ǀVH{.Ǻ @LI>@Ǟ1 [:ܤ,c(|F?$ƦÅ F&=σz`'.=儠YQksX@PH0 @jrKJCH=nO4I$ lstJ ڱ\.?ns>.C7`Ǚ8ѭjrNɎ8p0ꑎ/l lMt-@'BsKg92s?y8Щީg¸z %1UɟA|swՀxpk4}mlԨSLHH>5e*iľ:j*e&&y4yLo.b@iq% i„L ]h<%x4# SfC#D'ڬ፞NP׊i[ l,U\ճu"|23213 s-|-<sQ:sU@C|M]˗4񄇶 #ztLah^*\&̍G~LVMmh**} T Uv6:7n6- ia@cm%N, Du72uEa%ڪJYx8HL)(ub2&Q1 v\D5JaN !mNDvC5A~%|-D?<]]*4"lV';Q}*Y8 DsV?4^YTDHV!϶D %}ӀIȤ 8@%z\rK0gM;0ưsy% lCVf@ N>J)4MDz)@IhERdLȰzui!R=I"SG@=CY')1cN7H|AW=NƠ"&8M8!;ppCk4 &i~i'(0D `M }ڳ!ԧ"ɮz 3feIzc|ƬJC;+bSi:y곩3cI@p<bxm Z-4l6tM\̓N5i[`0!ciǀF;.*Pf'?(xl,qTiR}5 \&gxqݱCH$|7lN:ɚA8:0<ݧN EU#up\4XyD u`Lj**%֔ I8 TIxyX-ÃEz/4'rq8B\ 8t/Iv䨉U wڈrݼ -z ]6> r,< iتY^9T|hM>NRpSucTX(*zDC|yTړ)D/*BIV.jZɞ1=?P\Sι0&Mc)/ҽUuq'mpl4 𾍖ɒQ"[ދ~K|By̬wB#8((-๾izlURa.6*+v"2Wԗ/ SP['zY&,>ϘU$J`u -~svp0l6a& ]n0L:hKbcH$Q- ԏZ b=ϫ籧\̋h_Zxڱy[q;'צ?_歷ocoaeee\15k¢ ftWs3a &RRbۚWPMXH y<GU{Axq"uUǮ4ߎ3OrE_Wpk-x/ŋ72v,9ǒ /`.8ΚPt05+(!9Zm%5ig,'R)< 0&80\o>ڮ8PVhYH@)]uFJ):j@0`y|ds Y4$NXu5\uY 5HbH⺞퇧4 $?K[Bpݻj~~t$) /&qZik`*NkEƍI.OCwuNEҺ K:* 2B'[F/ŋ3>;@"Op !d*~1i&ܐ̓/XxDJ-qjvzӎ$XeJeה Nǃ0PF ?*i:OyFv+yN]ZKiVErqn,Io#Og}#>JkU`s_=}EЧRJz*д2gu (4HzسѠ]Bpgj>!Ayu]xBY w`k݈QJk^~iy yT4$8z$IJVU#1r`L89dٴq^թ) :LN Svֽk#&Z"R"4UV{ @W0nA&JǠ&!*}1UD4fUKkn>*S  ( g$lb֌t0|{ c.|FJ봢#e*2$FqYL~{}"a$\7Nj! lfM8 M`hG3esLgg\fysU$}Fs`A7.ńGLlakKO(4JZv'&Ay( O#k% &@Z\TQ~WStzҫ$dm݂#8K6Ge=wxdwNiU:~\h-7W3MEwUgfZޘ$ , 卨0vn4x$qI0dT;jx5V MN>&R?d2ƪ[9#;N.6J<6,QģKgJ.FqqΣ!s"s_dFwp,]h4fxd&.jmZI'`p|B$>?( H$sX)Z;=n;wPk:z*# j'Z$9y@0i6ǁT0.:\TQh3̀:dUyǁ0ưgG&2iت4<~T扊hB3z}j%S6`$p1nUs?K'W3NPIJO<vY.U}NjxE3/Y ľlOpl@+jR'<t6Z,A4JNǁX27E2q~C7v]K0'A<*+mQaE?LzH3Bׂd"sy:줝ѫ%qmcqt0ƒWҺUtzlf)k߳ 2/(Hl0g\H8.9.WjKՏ{`B_v?w~CA,QX,ii,\ Koh IDATj՗:^k!([ 8(,7Z*s%686B%Z_+SVWWmN\>ґ"ߊ䨾oI>]E$:Ij@<!UUu*fg$|aջbp-(4j@RbK몀jUHIJ ; ?!Rj/>֚+wN2 BM#iY2'>n%0+.: =w[Eu`ˮﳲ}=kJ),+y D 78ֹOW D/ WLNdAcɲZ.3XB(<}%*ebE2-0!iG6Y*3?U ]hd1US5-GȫM~7뺞ͱ߷@sf-:ܥOBP!7t?Jץ)g< )~ XpiB6N'K @䲦<}7~FA >RK6[|p874+j#cCI/~k4"MtqM0R (\ L|x w\.)Å:=pFjuQMv?2ڃu,[p)f>,N2kc HTV 0N$=Qf>'30,V/,;6a>-V4a => h4Xcք#&z͔tQl/1px-gj(&ϛYC@#'f5Ek, >h Pj@PHU ⢓MU- 2yW4;JiyA<ݡlK1hL0葘nh\ZT`yHƯڷ/m3mEU^4QJBDhA:mԏk 0a!rpHbEèX(lrBH"/R9T{"?AA@9xji=ki-5рf|$& N:h+NsGTsHxpZ~Q-_*i]5nZ& ZXqQ"$5l6L6SP &ی$dN׏;"YE 4& YHYZiyT˃:dEAGzWT%*a2?** Ιp:k5[VOD6sȅ`U [jpUi= -!0zQbeLzM.$|@)Y 'N4 YW}}giV>J`2hMOp$5] $\r `%^}U JsQxk6P= P_Pb,~_}}DD d@\ J/ 0M06\aeʎ噻HΟL /hUbtߎCs.,¹`?8kmOe6 p7/mQ@ ?2i}DN֥|XF':KO{ U l^ "ڱG-%I pMBˀXޤQ4+4Q{ڰh*@VkmaeXʂ0p=p8?]ǯ=_ڏ{i|;͎تZ]~jn &,.R<[QF8-S/m=1p ,W|D,N2zi["@,%8oHp4qgU*DL1 qh(<iKo֣֋A-Wó@R.y50(Yt (I.ം:;v5W\6N#yʲa fQxI (MiOqJ7b $%b_d0.l/>\;f4V~oX'[X6PziVKjA巉N .GP 3~l6EYl431)H|2;,o$fG% سy-_< $ CN34J%5H̹% 8&> ~X?CaHj ܊s>'`8J#<\4[v5<Vʚ6  l-S+@iU K'`/tiXN>`k5$ bpQ+O0`@}ph#bEtO=0s_f2b oO,24ZɭuS("Q D5E $)p Lҿv-(uU/QJpѐ`F9X@;LK~P zVkiy(X&q(Dckׯ_'7ns~~iu]hQ=\l9=-i]յij=:(s%j^ωWnܸћw`=iSmB0.BȢ:E 67a 6џ ūB7)}3g>?0)x7=}En ac)@AE {~U:~ Ͼ=Uի{~jQ\t kZ埲 0 _^GKH_9ff935Msh6>{wilnn3O~=v 3ܜ#16YS?"<+J?A2OaYn`0 @ <*e$`Ѓz%),cU1*?AiQQ' \^=J]IY,d~GV _XC? $Q t;p$1͖Z{n"=T7(ɅTs1,& 2F\Fe'%h-UwXSq: c%0Bsܐ3P7GxIfe mêP6 !7/q}QsX 1E~xw8'O`Y\sBPH*eUE,췘6x+x=J?e_lh_5]7 1v RwwGLR{g/e7n??!Vy;;{~w_fbp:U7W?p=_4᦬ \$Yce7\?O"(~D)ŸrY{K?o~ ;;;Kϯ|+{ ` 9'qYV)Uv̦nVE|McOEϼv ${!^oQ!hh!nAWs;q^ 6L(e>8KI%HFWglͰndwֿsK, 8d67;!d}bGysp7߄eYi^|P sܿ7&D44M!&ļ_@TIʸUZFP"8lF_~+_ŪOܸq?s?焐u]Uާ uq_~ꩧ~}7i^zr_peY7dZ99_ִ~^~eW-,D%EZo="G/UH#84$EJX4ƓS ]#No#[6 I3wc$eIhcBB!s aLSOu&Npy!8y;E}2Tx]#;58ByoYa`AIg}Gϳwh]xGNlxѸNvZ웛8u.nsG ,cnywAVmE%y @~Yq+>OuM({['ǞDž dqlPJrBBhw2 Oƙg1KSJo~ڲ^@s].FpE5KH)Eӌ6666.])%$6+y8s~GNAZw^{5axBӏ^`_u:=bqPn#%Rz>TBNnħ>#|-f9s?ӏC!Yi* @QY} 5O~艿a .\<~9VIڴTPiǟǥK"s=3~.yW0dsYaEE;sgO!zE+WO *RDQ8pzp0JZ.gBc~ ﭭHanY]gs; @v5ϞEBHsg9+W/16ޘe?Uy&L׫׮ ԟ./34i 0Gf@ ML4Mg\gwN+3N5:W΀}*L#f/Z挘€}s9^ Hf\r|ܿU*Ą(ĉ3>_B._=d5^|GiO-B(-jD3lbcccBQIUZkusa'UH'`lDЍ0^]i>2֙^5?XO' _" *Q(hHIv?Vsl èjg%k sZ"/F&m& LnKnvlYK":LZ1jsxF($T#Y\ <.X\sNǏ$u1 zC |0[Ѳ- Cl6a6pC/QJa&0`0e DE\ǻhGC^+W `*^Xf,?hH7'`fo]PQ:ȘsCkY8d&&FCuz,B Zkٶfl?qTTɽ:%x}j;&2{r?3-!$[7O|(zagwmckk kkkc8C4 p`૿ fFf o**f!rIdAιuBy_u4a~W^u 񗢒8PUamqlnm@oMöZCX5n @lj*>I8g x^ne8Tr\S7 ZIDAT۝#meQWJU/z@~o %ڀ_)QkZ@ʔn>B%/]76 +++‰[ؘzQZ&i;/Ӿ9G3Oyؘ`k_ =T[˿Le`&࢔J?TP*̙3^2kkzE%!h&VWWq?uP+<5eVS~9z:p~m|ܼy3wm%.>1Hһʾ|3Ν !2ue#fjpYln̠ZD WPDu nHe^۴UԚ֭[sg/]#E@y&tիh4m0, - {8fv'Obcְ#P/Pwpxx]=C^,ܼ6M{~翹o\| Y~EkZUgGsɓ>zkTxVVVl4^] [Z{+++0M"u'eࠃNe:u~ܹ x[o{P]iu6|*miPaBpil8$,@44 Z-4 ci4'gށѢp؇eKU:VJ`޹O k?mvi^#piP3Z@U<{^k=sԯvn8}ꖙ((E7ݻwaYj}=<֭[UTϋ ʔ 2L!3iڇ~?_oEvJ "0p(fK@i{;ܻU)^_KW.J/jx|h{ w} ߵBK$LrgޔZ֥luL|^e=e3;`0Xpʹ@!(_ b 4Q8s̹7ۍ"KȜg~?ܿn Q q*}gT _`~KnW9dkeFxjeM.BDx[yk^tRm`@`р $ 4yT~C峍'N\1~)]OMMi{lul=p];@[y*2CXT/%0YI*>'wnk(4 m ,hins ^~}Zܣb>EXh/5PYGN&>sUg#(,e*,: 0CF  ee֝O T 96,<2b1F@ HnRiD.xPQRe@ii4_%$ie 9y5Y0i9gudLeP'%֟+~R~0 < @uAgEl*Y:X>ek*?M'*(jL <@>FPOeY9s15(Q_@5k0mfPFWQk HA*-`L } ,CX$L}y$9_3ef *EB̠|6MjO X9^3Č(r35abKGD pHYs B(xtIME !o IDATxwՙ9Uչ'Q $DHk?^l صͮ븿 z &0Y"QM]UGuzF$$yNEK+>3g+W>yW ~ M?tN9WƛkO xu@x^\sEEǃ7_U^!»VNJPTgMqY)avw;u[RxQ~S=?.7ͣsMd߾Z*+B!u˲0M˲0 T*UUB R]=x"AWW'!nfO_r}IJƳ y<̜=S)-+%H|Bpˢk>oËOoTX~B'Pp1ǻtdzgtx8w _4OGDHP yl>/rơh8|hGp׊o[w[\ٸaE5`!D"f`W0 LDuUJH$㺺Ro| ~y!y((,*ggp/,@4%^Ts —6o,?ذ~5jڀ;{)-)@4E9kpHi%ť<4.ڴiS쓼; ~ UU̘uhy~?]\ͼⲛټ)SA, YTSSz@ill@ W5M;RJ,0Mf]QlXO&_-+S8 nM(mN@(P\\|ݫ Ny/xL4 .<ͣeMh@HȾ[[K2Ȟco?HR GiyGsN?Rsϝ@QǞ VJ,,&fN>Ǥ#m=U7O:{S޵F8}8&t Y:evWas_e[#$HJg\`mn$HeO9tSJ'Juڷac0]@UU Eё5 UAEZiOIghi xs\=~p>2'!p}BvkL*<>vd= %,v߲$t#A=nFʬ[454?MKJwCG?:h$F:áBu|GrOzlWII)7~f>#q)vnc>d=oD^vTQIn|,iaY9UA`ƆFq';GON½G(,,7'к9}zݺuc׭D O@5)4ϠA@б#KRq:V yLP(K.;30OJ}2;//q)-unbIGYyAڵQ;k6K .PC<)C 2YY亁&~݃,R$v,!HZuo}+~Z@A:v[&A׽\ݍG/S֭,=XoAi pK.NP@5h?r5  OR-k䠾|^Z7Ne.eOZ$8@2$ɐdbb12 d?9|SzvW@'١/ ^8EQĠ-LJd2R)㭧bG~93 @ZnŒeY({=:EHH{w~?kNh"љ:tD"4\5SwTW7 xwR}p}=g a)d2F$cAr+( ]DNZRZd N!> HXd'ؕ XE<ٝj '{I h9}𚦡; 4Pwx)OvR_$k\D %׮[9ftQ*+*1x<!4CdlEKWW֓Mؓ@=5Lh,J$(wqʶ}>սl1!*`j,]rE%nb%c;#SDZR\B~~>CہerbevY&RVVDbMmC~$h4F[k)4L{ %?o?GN,^PQQAAA;_熜"Ϊj>M;&SYYIqq yM(;?pjhEut'Y w/?_LҌy)0 )fPOA~iIk'ЉT:tJN:-An{o9U]Փ_?7 !ʗF0DJ>~&';kM$LX/7qvvv8,ʊefGQm+dI4 E]}A<,)I%3=H40+n|rRr5F7t@Sha5QH`˲P c-XTGInݿBn.g:H($2ؽ7|WWq I 6<ã$|9{] <܈TU!asAzzܺDN0vƫmRXXNέ9QG])% pXH$r BCJ铈\̆ /w=1{4۵ oDTUe;v.ސBoHNZEBZ: ^EQ4 ;>QrekpqPUt:MkkΘ1ygRYP;)?YЌ?Wsެ(~uM *B`͎ʿ]~7~i&'PcK,\MLd}L: y;3Bt 0a|>pD"d2p@UAyY9P<y%R Q7`Z'Tôؾ{?Gt w|'r+u6šB!$I>&NL0≚xH :@Qb1{\BQ"NUAEyi:jV: ?/œ f+54NLX@`Zw-;v/G8M唔poXxup~*b)))(8<;Zb 5 <[Bx<%񬙶I>;fPUUM2# C̽Bb7PhD-oKēX-_0,XO:.fq=wv?K`&bSQQt6v9:(ƥs%8Ec43ux`I={8ty?Z~mwp'Dʕ+5_H,S$NvVb]"wRsٲe-FzxlK>ˌ Jd2N///wIxcˇ%tL¡ ~, $|I:5:fw@|JdͺoR,]Yf=cP8#SVVƇ;wͤ ϞO$hlicq.Գ`}e[3񹩟l\iE v ̀o_-%fu`d2?s7lsϙs9H%ijibF|t )娇[>)_ yl]il9;q!I2I㫏jF͚1?osڇ?f>yKsQMajbgn*whn7>p?w:e%Hg72y8T% sΚ5 .'?/4MR|~a1|a?/\Aݻj"۴7ܮS,'+e ML_PO2EW^f s ey%ܼg6șħ )gy+LU:HL\,?;H_7}Kxxٗ= 54oja|U9b08H~k8EW]L0hq͝ml~e3IAS޽uc82>Iߊ!L_,Yx?X?ILW香Zߒus/ҋAUUB[JJ)ywyW^3g.`k6_ٚ'.mThuS%-ۨ(s7g!۲Lf9p s݄!455",R4hEݸqcrtWqsΔT4T*͑^v{OWʋv244RQVP}3k0ybK\֯Qwc Lͷ^ޱLxS1 p4 \|Y\yyLXLW@KK"!?ǕL0%;qYetZ(/-FS5[s//-dd2lщinoBQ*++IR"aĘsżm޼#G_# K^q娪¼sJ)U#> $P^ZD&TmM/֙:pC Wqų\+@aʊ*(GbQ\1oǻrd5sp搟FZTH ҆WSxgO>]C")--$N%1`_'sfT9=(ส2~ 7yU*r8$\ͣnX1Lܪ2K ΣiAg_xdJE^s?n0ٲd UJJ1 %ۚSϮ=]CF'u $::UEUUttv 0waB 68dVꙔ9`.`:'U#-&錦&Ҕ4*lxwO͝qRD 䵏Igꉑʘ[΄b)Kܒ+dr, MHӮw,cS rIF__B0a #Dष~0sZ5> LޓVH5vHDӼ[]t 6 lKP\6a֞4*SL2]M2q9>8ǝ3Du*+*imk%"55k6F2B7+sTƠ+ᮾhLZ=;7mL}RBQQ(dxZԒD;3i~Q:it ӟ;)/+D"!k.ZgM;0K̮T^ae0Ltwʿ,^ve T 6 5%ѽ^[_/73id<S9N,qgXO*R↚kMpL_w<PTyq[2Ktp@VpA}ckQA$ĉn_6;f>wY:"nN!A0F鴊ŋj^]~O9+&G#~wy0e֓ B>mXCٿSmmsnƝN&i :׉RJ*+?*B@B>k.k"/+ΧKZ&鋧_AHCưǓĺ[42nw+ F|H }qZ:w4z>pV4&;9>w7ܘ5ΔP(LsKL'yQOFog&]z<+ͦKZt荥߯uCG]-d >}]Ht-A8%tt7+W@,@Ss7nP7tIn\vı΂&MK.wR%{Y+?A; "Vb!hmmAJYnZڥWo7ol|* 0U &Vs ő$=Y(Y=D:m >SOg^L#cE^7,/  A*m{ Kro3W|n5C]TwvuH$r-A. rAǝū5y7͛7[*Lv)H;;xu덧 !f||Mlp4_;<*„'Si^v_wS5 ? #$I*+]85-@-8.#ɸSۋJ0L6T63>sʆ?VL]72}CGUsfO f*NJ};پP=(>?kP, OIJ#CngwÆ 뮝iʎ#3*+'`Cb;Yu``&t]Į]8٪l\3o%&gsӤ+"xǂ{زj΂x\(JUq?MZɴE]p_ӿy}WAQX Z*)+-ws=~w rj% JWt `n͢ʆ6x[T%U ,Yp1EH Ag_ g}}+nd|#P4|EAQ5K|lmF6+>]f7n_x$u@Ikk Iii <HgL]x<ĕ56?ȧ(t+en`R.QSii UJjvioΦ=4wuG}Na=bGUV^f!8 =<*8"eAa8FA4-oPoio&|vMО0(QY̽`*Rk9{AE44wټ#tl|EP]ݽy>g |+?iӦآkBX7mmhb70t!HnL9Y?YݼޞnѨpE vm\iii-}p",sm\#($U|֫|Ah"o6L*((U~Oo?o ϭɾx8E rY3ஷ t N+ǵ-ZVp`Mz]A,eɂ(;3iX~@,1s4]H{l]=EB0lmd {!>?O[fdZժ2wLzͽ. *h?u]ƮH;[ő# K.{|tuGu)`iSmS3 M*A pO0n=H) :B)+  I8o%1>u??Ձr3 MӸx%L4M:@;98 hʮVwަ mX'BKWp>.Y5>>wyiae{Xw+Rb|<Mfʤj! ~ƴ B:l:7p=4U_͛;ZEhgҒ}EdMgZ uϭXjܰ# |Pkk `H$;fsGnJMDup8˲J DKOLv/%6<Ι>Ui1L ٗ⟟FKg*5GWS-iK>TF{CxVYW܊Ol\uB%_Fu8P'&"v1u{ PJ |XŻoeZ4:Y9x B?{cgq O<UѨ(K v>/w}˖T@w*-oNęc~ݤeYo>:;;ziSk/c6(`Wהˮ=uE!/EaNAE|tXo[yaK]޶C1P$pȀP(1N]Uʛ=߶"&q6-H)j͙~ Yt)^x!K.^W9H$\P^V&^WZU@J942Hcz=/E/A//l9Bc{_?cm$z;@ղ [j>B0?@Eg>w^UX7{ç "gx,c;oފ@ @ gz~lVqP-M㜏 =h?1)f?hQMOi;?hE5_˚l y(ص|wô$_=OE)٦.[vkfƸHDQyg GR  phmmF7F J}l'KKe,E~n^ sIiz@ZճCѦx]ԁPv$-4w T 0=տ{g x׻-̝s1B!L$I&Gq5>q܍dTXh˰H H0Li [`'4ۢ|_!,Xg3up,R C*ZiiUVgSmZ <-r~>hX@wJww ' 4p.`-]0}{0PrWU[hqU%^Eٛ׷Vڣ6CI%=rϷsvO A8(/DOضc_+vx [ri-CX12Aꫯ wɤMAA!>9zSXXH  ɮc{[m`?=cȠЏ(y)+- )I2Y$߲$=mRjGjK!P"k?ܾTk7a`D7#HPc{7w}`D"RXP{ngNZŖo{{kopb&@Hݕ7a-BpgOSշ5A,0OƺHzo{r0ϫPohLņMk<Aa {1#,hq, z{όg4DWR)fb(td2I_fvΎۜ1-koSO=2ýVQp>͘N_4N \ Ɩ#T񨨊 ԠS ~>Usyu!>?dGlFjw?~:0 HdP:m˖{KT8JISs# ih.L&O7/S| D;Q_hV vMӬ'O}O_az3r4E聅pGS,IW_֮2$d=W0<B >3jwg=>5C9F HX&s/,(( !dCCC;zg 9 53CH+ EH3ꡲQP -4] Th*R K2U~e#d/C{pYQCmPDmjj߿g2r{30 ftHX(}PԢD"MOo$ݣzH33(b櫪 ~#Qhomu3/࿞&?j! |-FI@!PÐls TFHtˆwd@ P"xh,E:GãjߧQVīüh/;vN 7{lݽX{t%GaGpFzrr4GىHDԜQGCNk+p5B@/BQJvpbzH孟=fx11['r w/8a-qåP˲ `+~Q~xѽ^<T*C<'+Mv׭iy_~4xL@m#>ޡQu=>HY8Qr-@/U!JARitDۮ:vuz߷wwU5ghxWr@ŻUش?a] (XGlyɦFJH9#2"#K-tF'&:eF#*4gq-Y&Xk3G*ɗ/̛*KĻںqȳe3 8|%d亙]+%.-6naΤK.6_\ǞǍ:.v9ˤ.&rtť1J3Fb]f&}y製2Zuu4r-GȜtaOos jrͧ{2aLΥH-꾤/tw lZ"GSnbbI]`n;׹{`S {:2&F}$\|bY&bqqwDd"͍ zApJ#21<}[Ii1Ǡs;=|R% Uޚiz?TS։w| 7^~[O0F::#Rg4P d.aMZ#ku DҼibUfӉq2[78wNh&, dN`e@|)RƟZV$`*hHGD&pe  [3gV&&@6dfbŀx:/HnY9NyI]ʤ[8EIݲ &cG$  2-~)F :%M1K$2;0>`!keb!sn"B6b` ԗDd"3Pea(!NViT r!>Ǧs-\h1bK J={gn*PSKbd?^0WG X2Kө_1f~cn{nw N:rx _O5@%)u͵ Gɾo~eU75wuIWĔ`8 LA"KRbY]Ɉ}u}\SݜN;~=|rk]Oɏ<1-&d%D&%(o?3!Qz`':)rAmĿ d`%eb I&pwa>9E)א/SX?C'[i2xS,# M:zrxL$a0T&xap1bahYJ+],%\8>&ECcхI3'hNa ˉ_\VVmaWrE$Je;jWovƵf@3fSB̦.(\>ݢItv3d.o>S%f7+ήx$ &D!#i?I:]`h]DD!EY$,&=dT{r 7?T;1[0e.g>2%#c ˜c_x|٘u 3>W>i$*9^dX()S̆{{5񮪈3M~tXVr,KvX;BJd"8"Ad"H +GIeR콭LT]fGc%[]iV%:I󔋕.qBILfs侢|EQ&@Ksh1gA'yL_HS:X)suAn&'h.Eu, mjeZxWN:wRŘdDrfk߰}9#S9ɤՓLd&?\xZ>,#d"G!A~lνk}Db{NW)\k !979y~|N۔o<ܖ2 GSiOt"tFbekO_ܖ~izOܾL^h>}_tVs/jfo^yb'Ne\3ℌ{ĸߐm^Un~*qe_.zɣ$yAZGb~sVJ~}ff]Ӹ jrosz@F2pQ1EL3_^JFe(gMdǙMA4y1> ѷ;ȤB 3(YPD:dG8 yR5 NwurI%7:a" u9*9o >=A]xf'FOm94&G#7P=~ZLR8K9G8d_al󧬎 \)h(JjYBK<ԕe@|W%\$ōrh,b>@!Y\󥿠Ԁcr^,kЛx,{3L\N^o¥̩7 2+WQ/<)5|әm5[F:هǿX0qmn"2!6ebJd6TuIa02x2 S&J/_Y  D2PuoᶐƫKj8U_fl\3=Q" C9Ibe^]PGn1;2͜uJ(hj8ذ]3tu@w%Ud/YNz-ܖ\ĂDxoJB&$ȊL4AJE&B:tPEm42.NSLPra(*IՒқ)Od("aUMR4riB,h);J6sD&YILsfQ tI׉Efa4$_As1L|  eD+]X*' vRЙȄI5ɶ3^TZ6L~d#L*_qb/kvzܡ L=7ԷHEbP_̋eαX2vj7:Vԫmu_ rZ= 7~ܖj}wN=n^1`H_J$R? <|,VKOm4*D ݊P Sb ̂]R7ؾ1Ld#ȀX>]#8$$6$"Ad"\42y T zba VÐZuMډjx7\}ڥ8 v|qOz|e &6BXoes͝u zÑ p"OFfi<-qjy8,ܘEPiV9}u)&YVr4vCĂD"Ad"L 2 2D&DrXFR_"2,`l@@ AG`I%D8`ϽIe&&=bU+.E21uO62[HU-?I;ZX=btaWݝQ~X;7|gI^m,-֤WW^++Md.g n)j$Gc<ǻx9>o_kot/^,NoU]w^eޔ$M&v7uJǐ]v]xb![鴏EvɫX.2&SFg<1È&$1質rr6[ L6njz]JC5f"3TUjq\o,Ԏi_ K,KFUZ_Jň򀱉C-%9h뼦;0+ p&P4;8ED9BY5N] %(H[4ϼv7*r$bzHGd"+I 9rO$y#&v4[?Sz}IENDB`vokoscreenNG-3.0.2/src/pictures/screencast/supported-formats.license000066400000000000000000000001361362045215000257360ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.0.2/src/pictures/screencast/supported-formats.png000066400000000000000000000162641362045215000251110ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs B(xtIME =AIDATx}yՙ֦ҭ{7L6 !33@1ɼ$$%!C8f;/gY`HXBIV }Z-vKjI-KRs~-%/+WH2oJd,]K(u/ #` Qt?3رwհ,dw޷NE߱s'[1&-/) uOJ3GJT\r˽10|5}.WCE(f:Ԇ?;( 9h9j?u]|C-dX~}\~~C^@>lǵTRҦ/%@!\w)?D{{;()\~kP%>n7*pp|ݕqk}ĥ @|7V>x<|[/XoLd>ԦG|ywaBE`pa<:i;`Б%Ƚw߱E%\nhZAi@Rr8K_ s$Bs}PTTd8sNI+8ѝ9PL n(pRC֒Ⱦ)m}YLM浑 OP*hX~yN,/! 8s r| 55͎UD 5[0jj^YB*BJ A9Ȋ Qu3A~0XL ky$`ĭ0ӹerJ=@2P92\Jr@ؽp|, G2? yiZʻ3na`Il1(39ii<a41  - Lކ,eYTTW]RKtOdUU1*4e€4Od=9>qF1:4 ; E:%L`B)-T jlҀav@:g$L/DN$,3CvuD!8N} iC,֕'ċr|qKK񭛶}Z\d*880RI@R2$[I|lnd.mKz1(rpX؟y1(>@E+8D!cBrD.VK)wV:|(ؠ\ԖZիq FX &C>Ftgdٹ>_VRt2SX H7d,g: Tg- & >@A^v'0 `2A+i1$yaY%F&:(u;2Z_z@ 1qҧ{uFxv)t[[~| QsSeM,)Q؁T\_z%%q?aPV NDP &8}4`u/}9L_b}hBnw@QXaAǡi[Xٝg~iKY D ?`ddd0J}_Gg1ӾžH.IRJ°ld$ oX݈; eY47Ckۉ )o}y;(]tExbhmks̕XU*,A0h[484ԟgfa!IT{ܛh?L2Fs p7nu>l*v;pCeY6HRf6?R j*k;v0sJ,'O5/Ȱ~\WaW tN|&ЇHPJ!DKE{,h!p7qFmMl|K]m::z`HXS]xq7>'pmw@?cnn.vQ=vQč7$?Lǡ UՆVmM;i(_A0.R9,s~k֬3zx?ĉp߽?@}}05MmjR0̂`Յzgþ[eEjk;M|TJ  9~&ɖ~O>gϞ;p!-UX\ bb^8{6\:s4M3Smm W$nwnxOo⥗_ix׿g{Q\\B\.Ad'$I1fr-P~o_/yN S|uU jW',U`YRz%J\`KmG{ M~ @. !QIE\{S'ÔXS]a Dr<Sť0<2ܹ@Y ].s8|CǡÇpۭ߄]aALMM%eԙ)ov; (#f|]jBl)M *U/;@d/bm:;ow=֭[p8v(>5ذ~#AKu\^^rcT#-@v37 O>]]p/kq㍻<8Cyy9^oT6x۽{QaF8#[/q0L0!:$PF)0ߟ_N; \җ76saa8 o\bfvXyTXa0 ,_#t@›C!%Ep3š!%YȭE w-ob0 l6111|ÁGBkkkŊsa 4vU ^l!)H_\{nfݚe&dk1[> %}zBlB؅"n ?]|; (btt(H~#eW8{ Fh~n7zZ=:\vlEg EV,׏H}(=BU|p[cFt.PFOOyl/6|# fEaKk`^f,!&`YTT7B9Fw߇k;pA===xhPX~[ڋdm8B)s}kKDs]Y.ˢd1 H,E_? J)^x8zQUU><^h9@oC.;( e,XY}r H͙*X,֔" mia9x^&ϡ߻oQ]U.2+7ِ,83_7"$ Bj OLȶIZ¯2.H4|B Vli$?T0 VZ0 :_ln^ X3  }0}AXWe%Ka4{ZH,$C-o\SMV$şκ kAX<&@%Tm>:*fH Prd0YwiJ 6Cq- 7 |R&j(ohrTfN (|6QLH}FcJH"$$(fqܒG|Q4΄Ph&0;Yap)}<ٌ@"gq*eVE=ӛj`,B^}z֯/N  -A@pkHm:^i%t0 H3 k3ʪ0[ccϣ=cccrE7CUY3XϬ\|&aXPUAII)>wa_bb2>1y*H anv~#wEy @)Xڙ"kdܵ#GO`Fp ;1fXr|zS4(u1XUd`0{=zvQ$DM@=SMmx띣(*rYl sۼ> BZ?ZvxX,R}92eR/0jDSL+ɶ=3;5M{'Z2!d?:}GЊ-fQUAaT;e#VhIzg83`dt333lr Bb `:wN{'*+ kC:i&)!GvkwO Kyyz F H| I{{z??Bj(@PxгH V>ؔ9\ ]9.pM+OarrҰׄvG@ `G__/t3 ͛7TKͦ[Ysŕa:%C'˲o@GYPM+vq'O7XM5//(Q57#r1~,'rV}׋F6P~@(KjRȲ nT˲6BQv4QdYƣ?晞LLji]7kus$0z#5iy Mݍ5Mk0$ ,CUՔ,\.::;033!lt.gRgvP>.Y^ze_S&h`6͎rWfMMR?77ATO$)eVe\r,&c ? &|>:aEdY[iizz*zz{xq9a tyW=Ϗ^+1&iyҮZ }}}S"BH,qy`6aQ\TPJ߇cǏ 77=*9~zI9rPWb)8ƵJc>n2ӧDiYgؚdejjCC ;%%p:9M8:ᛙ?BR:;6>)jSj^WW˷ lX߁JyS?iooPg5kt%;_\RTaxϚgR>~&BZ(_( c*>k6o)rTPik۫JURJ(D[k(N(Tc(y޾iL%ɻJaΠv4yqBy1_X;&D#"t&,>F(,I8FHӥ~, @xq A,%/yK^ (r$IENDB`vokoscreenNG-3.0.2/src/pictures/screencast/timer.license000066400000000000000000000001721362045215000233600ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=https://commons.wikimedia.org/wiki/File:Appointment.svg license=Public Domain vokoscreenNG-3.0.2/src/pictures/screencast/timer.png000066400000000000000000000346261362045215000225350ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs B(xtIME5._ IDATx}y\UsZ{uU% KE??4⸁| '"l*Hivҝ}Kں ~UչuvS]>9I+K{z'wQyBCUy{#pWlLJ69p Xp 2䌄A&,IH%SHhk9 J\z/QKM$(bq8h@]nNvB{J-G$IHƓbGcDNL!O>J1L@,],~v)z)P͆hhB&GS9B惁B{MUT2P0)L!L)p'O .۶m$vJlm"^%KAںeIA"D*B:,P$ @(BaX <&@D 5 U0$@#YHwPVڝ YJq!h7/ahi^&,ǿ,+Gb̆őH e$nyhBB{R,MaX@BUf062qPj)zf~x}? "w 'a͆r9 8" #"kBM!>5XI=+P(D . nN+TIAb3ݿ姕X_n${9vZüJ `j:i$)]~ׅmz4 ꪤKdq<|u|l9!Nctp!ˊ^d|_-m.H˔u6`)` !RLbltH4+b· X?_rfi(f Z%fnG!߯*TB2;!PjRr*b}e_QӍs-z"S3! O He = G1! e(8^ C@]u8eTJgE밾<Q!aDXʐs*pG+w9g{0 ~|r#ÓH0{Z\s^PG8 !Q=YVJHĢiD"iSRvȏ-d875**1{$%w=pmcQ~;k\8$I#K\gN!,qȁeȲUU dkX 锌p8P0L~,)/hio4t:bv&hM:~ЏbmyƹS܌ցcYB &0>>c[@BϺ[p\pp\lZҼy*$R"(dYPLMF0>l(c \ =fu sw\/Ty:-.o{/m`t$R6fwgMMTr(Á44ԣ>AjiEa<&)D"Rj.```#C3P:}0 ZtfLGE~q )hjENÜMC΍\0Ify %RWcȲ0[S87YQG|hlk" TE:F߁HDcf^|}/_z;P\|DQa2ƒ՟'x4x|2ACKЉDƃ-+bL33A!1t|J7h3hұ(R!DgM/!y'𩿿aKqߜ@h4#G +>U lBh7΋e˖xI}$!1$|UF :,:Q?ʲ`0H87vCh&Z` l@AsG'nMT0ۋДɊ_s)1 %85Z>@Jc >Lr˻0*ׂ%2!'Q{L3B:!h/¡x!-Y= Y=·n:?~G?Rdh[܉y a0::  ؄88V}:z)x<%OA|UL1f6y/N`k+0jg߰xQZګzD?EQ{;XZuz41C~W/o[( M>~o <C011Gt _ P8XV,]ڍ͛On XDp_ coo \gU:Dg'8 Eœ?r뭫ƨdӡ3б #Sfh;kD!^HR: >Fe:̵w޽[}Ko>h>D0 YRd>B 8v)X|9)*Lbo\7 )1 p`E4__Bt-+TBR"I.+u,T,{b8TsIb`Yva @ehW6/OW,.s!h Gk2>p: t=يEdrZlsx?wy)tJA\q'TʔKa#P+Fwm6QrFB] m ,Nx4 ^`,\^/ilٰ7ӡ?+>XUy|3/jC8 S=>{+\™GA&>Ap~P0<t_O9E{OƧj)DS.<ӇeY^yvGEdϥ8E&#rcQ@1#a8\n`=@@pᆵ+6j KV,æNCPJqQHa K غL728 ұchAg sPUTU xma:5k_;ǁ9H Æֶ=25LB,2;HSHivBVuಏ\!/zދ`YǪpR ֭gqޯ`d?0g44-" gN0٠ GsYgXq$ nM>=2ͤ*H% ] wb?ɨx|^`r213foe(4p\8lM7J[-mu\4ݠw+bT"TU*X Gݺ|ap IsqHcL: !p`vIcgx/{"&d U+ܬ`Dǎ ZR;B(vn=S hU؋Bp!0k W\O{@.@cˠ~X[QYcg Quޔ^g<CKUZO^^`bdɘ(ry56oXT+T Oo~5//8fDo@>tJX,ӷhq{%/| h\~5xG(UiQU ۠}!x+(x_@J'DհkE*l=g#E0@12o%K֧. -ൢpLM0;ɩDAݦYk׮A]]]@1瑊hYNB'1E7SNU9  TUJy,̬U5&*l"_d3zhyt.MZ"U@Kѽ ,,Xn6Z[[Uƌu#' 2 j `dn ",@l~J y@0E|~ο`%;Y8 \ӗ Ounj_A&-sUlܸ >o~ nw>j ϷoY0$TUdKF Kѹ%(UQ0>4`|M46*^χVB$MbMXnm2xp ohm$!L3_v*[Zk} rMPL#T y>L0 Àa.28{P0Bde~J t۸>GǴxv{=\\yVCX4||;Zfj }CV0𣹪AL9Nn @pk ֐QJ19:b^Gc{%ӂ.KvO˲e  l,3N7-|e8wcYw'.84<5DILL.4;M_ @|ꁪU3\.8aф{AHٲx q/uht F- GChkI庈sOn! 1*w0j Oݼ],x?8=)Ua_)ȶm}uQvt- @+usl ;l0b[sCH3a(R7Pj4ՠ6b*Pw2T-lsX:Bf\3c,^'C.^ tqw֏Xvj1y[_;M3j?>v/15E2=U?L@PٴR};hq`^*N9ao`6 2 fgg ,SP͜뽏?سo\~zNF<[@5CY{}`ӎkD*@2=,Hm4 L"v/,Z4/,C!h ܰq ذnx CW>g_˵ Qœa)9a` WiUn/$ C%z p^PA574A⌅NVr956xU\тH /J^fP52]|?3 SWȍ S 4U.˽ 8К4fL2xe.ܴJN'͓W{"7uM/AаȥCT$*P'n W [R:T2 p{6ޚp <7;(((j]5byRjRB߿{9D=cG_#BI( UAH1북`@VeI$ߏj X]EkjiV-Gp8c6&|þw(G?^vO?ƌWVUʙxZ L7x ֆ2,ypvU`صb7RO߂^~+WhHKx)3 ,`0"q>p5XDPDgghkO'|J6 +)\I2+wpݺ ɤQ-V5g?f{9ع%\rFo1HS_÷kƾ 0q$ 2hji(XENfcʨKRx7\IYRf`hx{{`?dY|>:~?{Q|\bO|>|k_Î;Ӄgy_>^e]E@%hEQ0>9޾8|K~hd{s,96Q6Tu``Şm*e-Ag:Id24֮^ARar5ygyGgIhذa~a45eŋc͸+<~㪫>{’<,d=C"C2@ScKߤ&X@ ޑL+.I* ,cv9A|# :VD^Wƈ`|[Ggg'~a8Z~ffXzm#c9aDc*@ wIjVFCBjNKTGNY2TFh6I̋] K +055?yxse ْa $Za(5I (,`t TjJAl#qsҙTٛL%K`. ^xaE¹袋oV1j%|ژ b6ϷGk B@P%ު9ir|sB-+Zj-~c477x uYXjBEʹ 'cKL3( 4Zl%fs8Qj -_P}oB_i R9v%no RT`i P=reI`bV[h]Wet->!_>X֬Yc~*ּW(bY ;54ʙ v'zT2]09K؜UҨXnFۧ,(0PYֽ-m9>n/V\ ӽ_1yUSSSs~ohh?ٿe˖5 QaIR8NaY@Gۢd2]0 FY6"WeQ*C[ѯ_s|[K;Z!I,g!eըÁ<0==~okal۶/\o-ɬr(bQGTUۭĘ>o۩T`v[Qk*m P$I0lNzﻹ]:A \JWRJqg׫hۇN: 7t݋ЎIDAT޽7x#6oތm:,|3WUSj! J g^3&f f?9nE ( cFD$B:3SI՟mTr(NH$q7g;9xa٠#0&NPb,yT=ŠR ͖G @] !tK~c+~kpU-)j-dȘbrb@ٌl*Cx2Zx4odhvNd25w1@ /)8/"nB8ڵ'a֭f#BqmS3%@؜Y2[ p7/ar:L: A!nєHfJ@PjgQ2ĵ^[;_ʗm۶d%z!ڽC}VBH ZB(cJ/HrTJ2@"g.\귒o;_v-Dz1 !G¡Gs&8uMRR@x<7+R`0m/R6_Nc׮Y=Aq?(p]W)ODA#q s$)QCiF`<aϹH1ūfjw&hǕ/@13 i6|wpꩧ JXirg.$Km(aF5'G?l=w=R)65;W&{A*ً$\ &jU MΫ!x傞,ˠeOěMd?{*0V,_}E4<% 4X h7p|cABLSJ*jպU`;̍Ð2q4w3A@W,a<5x`6'.@)ū/U$ɪ㯢.7 6 !溄}{W(>a-S2GF`nBɷip׃< {B-Ei 'p_w 95ȪeZf`Z  $ Wf5 fo|p4+q8wU3A&|;#Ӿ6[#ۻ"8h4^5W#JЪ`!t"Vr,@!vt荸YP;wݵ=u=)4hl ȒgzMT$W;+'ʱqhn|=Gد.HR tZF/=c( R؉ $j\@jx} @$H\_-תjU QIDAKK+8l(rgo7ƣ&M"ҙԍ;w>ˊYHzdE~Z3@T? ,eS:#CfF'aH)ESS3'(m <.>dz^N`{=eS `+8='/3E>ӁH(u5x| 8(5ZÉەk\Qhll2^z~Wn0BS=RG<ػw6O O,:xt@AFѵlnrBń"4;X<E!DZL @}D7=Gz;}7~L*cO_Eo=jUl>G,]oJEkh0pHĢi[$  JuY@%:lTTXX.+gډf@ MzU `再fAuOן:N!pV Kf]{|Mp$A$xZ?"׋p(d.7F:-a W. 1xMNVd^Oݜ(*|977/z~'W/SOGG20x ok: L`d+d<Ap0,^/"fZF"BAt/aӛLX'J.Ȱ6|jem?v3w?ŚSNSАIH:pńȱC+_sB"<pNkLR 6NDh,D">gAC__ :;U;ɉ!XqɦpK3Rzos_ z/upC:aX/UU3}y tc6XH z:0va!Y J" ͱ z Hwy Ư`IkR81]ٗ_DBW bQ%Pt\47_@TUE4qD6L  ,Z "m׬#o `Y---o!`J]f-ڵ-34m#4{ͯzX %|BgJ Xr>!SdY,D.O"U;bxpǎ kY'X˲PUBL@)rHg2H帜.0fgp7`.'͌:TUB)>͝zyyf{`&g\.pa+"K"Ax}~^!2 47ᰣ,$ TUwDpAVds]^47X_;aa,>qX}i7h;ʒ{hDht||9nw}c[̓O\.o3 ТW@hfG{zlD'G|_;̮t:*[$soݴfũ_b\}k3wL8rXtT˲xI8MXnv)5e2iZ!jn<~8r Riz g0?S^7.'`o/&GrfJ:/?d/* [͹7ܴnX5P;\.,^-R&45}P$hR*ƦNݲ8z_AbY 2$xjC= }88 !b*ƋϽ]E:.g=2h[ҍnӭ2ٷD$j@Ǝ]ss󥀀jbižy,\qXt.[ _ ۴Q$GprČͶE:,Z҆bU7.[&氃 kZ {Pr־KV6i| )IJ޳{{x-(I@iٗ\Vk|U G@$, ݁5- 6sLF$F'062qT^}%fU^K!]?tЬ‘+F2¯TQ Pj,ԍmYս ÚqWhn48h 8ƇVfawaDx[ pږmtgvWΞvMDے%95H`rtI@ ˷1U&xhjFpZ <@aȒv҉{ɑ<(UR,/s(nxK~c9hh`Xt6 ' JDe@@F -mon2u]t"WQh#Ͽ'EJ^)!j5=\ns.y~Y]|X)/ hD@˲H0H(H(T2Y^3rݹm6;>?< q r>:>0'T*@`}.$*AE.Vt>irF)a 479\*H(x4d"T"t*9rׂMQ|X$aLjb.jDСo>sa)%@P-(W46:ˋ Tzy5׬lTV>\ )iRm A9_S)#P!R_h`! '|]gS'`Jo@\,_ hו,~ N!)? t?s߉ T@ _@eky2H._50QoV-Jk9cPKQriy^TIENDB`vokoscreenNG-3.0.2/src/pictures/screencast/undo.license000066400000000000000000000001371362045215000232060ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.0.2/src/pictures/screencast/undo.png000066400000000000000000000430211362045215000223470ustar00rootroot00000000000000PNG  IHDR T pHYs  bKGDEIDATx|7LB 6 @\zKoOK 岶6{cmӛqz]43k>vvvޓ$I#hT/!Z4+vEY<jtGmBt #Zl 1R y JAa_.h5Po@A$h5!$`(,F@p2]<1Ѫ}cO2e⩉V4 >FZ Ѫy>aZa#?$ Ѫ5!0'Yϣ~ jcñ>hNJQ=hbhտ%Hn(?M!Zn0;!F^4}~` QqA!ZnK,R7GF^?CH`V=4{zPe]*;8oUQ~C&Zb#> (/kDe# ѪWKՃb'+ sе ѪOHbݶTZxYU]2pڿ'TV| ywSc &(I8յ Ѽ)ñzPL N~RN 0Dޖ0P=J=(f ]>CqJ'3 Ѽ t+6zP,r/m`>[*I`]-.Fj +>{0gC4/RlyzPlY.*.ohAδEyo &BI_;Bԍdt=!QD@Ъ ;I!g7M~ B{4. V(wa(cޫ" {C4m䇍1N7EGэNڤV(cVAh`Xl+ɹ'4 QY ;(ލ \-Rhi ƅ g0V(J6 f[a t`YmEz)=(O[90(fQi <l|zPl:* (9@lf(A@*?kC4hb]ݳPi~ >$g3a5Fv; ~(?kC46wlKK$ʊ3B0FV.YuhET 0Dskx4Vw8v`cqh4QJF$ovktA;N UyW 0DsOScA1sX+t>}l lo4TV)&W*cColdIzPe] #vP3 4FV ѪJmc&vCWa~TVAyn H!ʻY!Z6$*+\>e_X)m4R| Ѥ(IRQ 0` rqhk-R6E NC7a3 sE@(:$ݠ}^!Z9Xt36F]:9搨*0DXxM& Pse= ќkq^l zP,G90Ai?٥bWAi(QY2V ќj8~h8vQAZ0Md-I9 7<!DeKRZ]=D!hX8nwQQ&&` 2$1A5ت2E L FKb?ڷTZ ˭@8Y$k;:#@x&2jplE;ۿJ_EvQdϯp\~dlH i dCaO);&;aEGp\AEj%ñowHTVI>EI !.Ob+ 4Pv 0Be..!F,.F cuyiOj;sv[ '&)CI%oayrU\lO$A&WHq };zS;^G_^n3~`$ٮNy6WRC=ZGBFڪ gH& ]˸cJc7-x ]^ p2rGf@a)| _Z7Ffz Z5I|rw8>۞*WDq̎Aa6ݳ+T`7SQ@>ahl F63UV Sۄ&T ֣U(t\oMC[zM CK"yؤ~u] )v|t*hJϷo]/Jd3N##D 5 |&ϔM9ڠ c08W3P%Z6aZ)6aH^C5G1T XsU\>z.~Mlu7(sHօb;GM FîvlftݙQ7;`7{m< sE#3 |_AW$}qEv*šc?%qT7d?Ù7-9 }I*'{U x 8Aѵ _P3_ZhUiL>8azMy?v Q(l MLk$_ݚ0;.l:)g#N`S*8 m[VgVSP`4nγBt 62KP̄<0A'>&{2Hڱ5NyйoaX[-@|_ kGE kG{ܗ06O΅y}`>!?DAEYcI![~o2'*QELxdOtAki((gf+.j"/lK?Myp,,d=n`#7{/+\C\H]i`{*gFAYD̘O?^$ ,=nH ttyy 7U0A}J)z"C0 Ȗ 7zHz& 0o'ˢ*L{՘^лv*<>X_o JUNER>Ey-H e) _~G>7p= $F&_UYso 9.j?kAKn6 +5h(,ҳF~ȚOKsX=%'$̮<8af`+Axқ6g ȚTqp}~[#8q>{~n4uɛB5= U/Xb p JN̝d$yMbvV;Pw8O JZ9*]bfQe(<+f v  (:W}UXʉCi[4-:"v(`Wm LRwF ,G%TۄٵyB%.-*^9(#e#8NO#t f7G'I `d=cYdr䑧0 s#s L%9Kqr(H?&Ww﫭U>1!FzC|N(. ֥0H+ib2y _}% t1m#-EOK{7@kN,,{oE N_m¿A!!X鳇^AuvMrl=9Zn#ʃG osX.svٲUt-kuA<{=4OK)f >Q~F$1C;~#TV:7NeSo-!y/|r4iv"aր<bPNJI˚mmKM496tPlJTr0Wu¬ ĉ;ljT2ky]gRm-zP_+6ٯ 0WŪ!'Hq eeMKQ }_ecI`l2fNtrwN92&n߸w;ŎdOY<J$.MY 8d7:XǪYy'G`4p^ ɾ  ;];H]'؁ @ Cslt ]poo7|;FK^ okW&`ʙ@W)ff!k``~(]Xv* vK.#IOF)KQywCo?w4m//J<%DK%${׾ `T(I @l69vM K>\x:cwzp/@M{n0c9&땐X=¥! rDuE|*V \* X>8oM×$tF٧be4@A*]0; Lø;&0X&:@bМЎ!(cثɼ#4yؼƉyN|VêVS:xaSg/.M@0 VeD8l>okT0J@j(t)E= INZc 🅻2m0Zoxy@v6 ÝJMpA"e0 m4Jۆ=5ag,fzy';[[hToBZ3g iN/,T]V4a6D[3v.]Ly< r{8Vަ %ojs,RљS6FI_"AF1VA) ?Nʶo5ڿ w+T;)8M8/FJñXdyB3~YV=k]{;3_ms[BbtӤ~P06/GS] ÉQF%vܛᰨ5q˜|f~R[ kXEFbbb3t@}kEFܘKu_y/Iac$okfNyJ[6*R 7;Z>x (YP}5~3/c%ye` VGK\@Nm.KMIx}=ւ7lIftX{Kg;W"8xC(;(yMD?-$ciHBHhgϱm +5f8tOy- @ ;]ZY]vc2f0yEꬄf9$ebrړu/9!'_~(lor܀~" t!T;`nCڲ6~syq+xTAWuB7˪I7~ۛSVLC٧~^PA'| qEn3pN'G1*| Az`GʦN<y=fNyZ]9{Hd>NEy[%OBy4 1:x1>(us[p4`=\9 S.Uf攧F}mAVqgg^ *wح`6d–癿yJ*{9ς53<=**[Oa,9f>g+puwLZَ7qH'RZ=6}Yƶ;6A`8~AϣgI sY) `>}'tNA-Y'Т񷠬cOAr`&WW0H;r1< Ҋ]R>3 OyMr8V*<.x}:V 0i^>bJ$:2e>C6]))O34 CywzB5?ĵ3[Pq7s;s2./ o[TSN%wglLq2X~0CCY`6w/n}vqAcY5%jZ3s~щ x\U5 hSIuu茢C ]8yOtVfY߳m=54ĉYrS`E`ږ(!: [{A yS<ɕ8H59 JH 5Ù*X#ZAh{3Nt7繂רӗe~G.Eת]͔Sp8 JH, AO0vFI1F;VW[0s1;ul?Q~Oj&f'(!:~wqz6&plu'HխE~0̺~k/f'w=q) =QX\uC܌{wU|Kkg?Òh֎=l> ?ОmۑLҊDt'D6٣0źv^FO>"JESR ?)> dWS !EܨTxgCS748¡{h&rjw8r`(:7{Ekph`|&H`u)O5 JHfdTҋe0jJ"Mky=*$A9}^zxU FJWªhfNy"%$Ay'C"}+b>TܒÂל7|!f'Іwk5ckk0sMԵ{}r;oTJLU$N68 rҭ(x79`iϩ\ RcEa{뽡whf(C`Yv_CY0GHkZ0}R_wqalF< F5AR#ڳyp3of>,'/úV^C"B",5a)Or ɹ1e`0KWa>l %9k]IÛ8a┧ipb,FIdv- 8`]^&wֈ h┧щ]^ւ Fzr,my-8㜰JhfNyJGGXO`H0G/<5SeXڻN3&4<%$l0o#yqM,^^k~ ov4qʓ/ڻ^{i1`ci^W^pm ~[)OPB2e`# ƘFv:8 *hNyjT s]x# sr:W Hj`7v}g|%7lΩ=튮C寰֪61}Vx3NHa^кּ_XFb Oy19g;MZH 0|a]gx#RBB8婆RX{עI>UNu+XX*Sj<>BP9[)a\An~GX4Sb+0wƮ>Z9SvޅuC3٢Fʓ;"EWcś׹҉Z9s8($kڔ7@X5eM6ԸH154id_1}P;%,=sd%I-RjcqJ7h #CN_`^o#P46;n4j#R>5F`(}~{ldiCX-WP+aC<]iPmB!nc~ Jy|uMhF842/YǺ%y`\*h3Y7w3&9iٟOFh+?†P7;]w,DFV5rN6<䠶I|;iVhT>^4{3!j؛N9MW-~"[9FstۂQAL&m Dϧlh?*"*zF4hCHt t^SQUX=YW2_hnmǫ";<0Ӱ͜Ȇ Vm8cngDsg)n%+u[|~-6^ͭ vfmx=cȜ`~tlsK̻ͽ#Qi*[oAGc[0?/Z06͢WDskhzXWo>lxThnksJu`ec}й;oB ]/SV1')H ōFm<-܂-}P1g<3 {wд} c}t5.4cok[N(`2 ;Z0n\bx~~"ZzLhnilyƹ{qC0u򛸟?%w?h`l;g'A9ZpAjYX ~5;<E)%zH*oi'۹mX(⯄PC2l5ZhUޔau3{[0%EϟMj&pCL?KUuNQ;!ZZn$TbEkx9XóyX#-׃rmy9it>ڹކcD/V-"†EmfI Ȩ;9a-.F "jϒ#jϟ9ˤ'J*m 1kFA\X#P8}hP?1 %p"{Q}Mϖ -> -_[։D6"= n>d}OP)PyN}=(.R.\(cMPTa(iş"Gbz3ٶ~ܾ圀#y[tqtSSCg7DViMUhҸt-򛞣&&h{MMtHDωVyaS6oC4껤 ѷЇ",jA^ɶh6H0{L9Gܤ>|5# Pfͥ-"u2;oV vzǀ'ѿFsh. pL4NVכbZ(}kCc&In/91JօxtM\T+"/ڵLK<|u';YK=GEPkP" Y @k'Ao"^PFŀ82sK2-EVFČ[fӂQĶ&怀X}M#=.fx26q-nnM yƦ<$^7cnXF_⣥ױ~WXQFA&_^ZY>N1B P!Ha[ 95_h0wDڳ>@40ފ?%д8==7f jHNi2l`YM6 B'w6R   W3s)yu'` bx9knE< !ܱa-6QX3߷mYJMV&F)F$QvJ陉sR뙾] м~f6XV W+!@QyD1w5Q ԧZEg4Ùr+pX+N\7uC]4`VQ5&0wÝa bbmkQ]tl3xP$Fs꣕; K󢆁xT' GѶA(u}}taE!z?; =ꮲh( FKaS8}he~~ddX߰oY]ttc}t6<R)K>@ȓsu#QҒd3,߄yp*%1Zhr?4k?)['Fg h:*o04?a|Ro`.B !aط-_~`iO~k"":GEFwo׾K;wiv_{x`Q= ʼn w_}:!wFNՠàq:,C>OYsn?kW\W2sk#}|yKXpPufGDDt!,,#~:Ev?=XT}~AC_JM(^v\ t:Wcx_ʈD'վt~:Z3MSᚮQ?ea=z{>$ڱKQw}8sDva]ԃE,!a]w| G>4DIVfjwPgxSa+О+@G@@@[ :sЎ/Й Yo ݳt.ڿfqI| }Ww;upX !]9َt {*sB#`٣} ~{xW+(óz;HoΓP6RxʋTX0 * ga eXõPƶZhR_v/5eվϡ?f#"vzټ=WGDbHX3E (-$ZO}} H5G2wfPT\<n?tt o&pV'CPueEVy#}y6ᯡ?f?ᫎ~w;Gӡs;B"޴%(aOc0t!C.5by- 0K j®!jΕxcE06ڭ[ 5VC&5C]"@@AA'}o=$eҷ8T;VOAsab*gT\ϟC~ Lÿuf!4రO~G0`0i m_W!eg;OB5Q,Ճ@_B b<_A켇{NA#(m6A}?`k_=aao[ֱ76oB# a__`}I. EH> w9i׆Xjhmȹf>q O #!,=Q?ߢے8$f߉2@3K7NW^l3cDبzaw {$_?@9K=@x,\?KPG¡NylK.Vx_*sSïdI/|R paDv銧,{ -o;xui%Iã?k㝿1Kh-~g~b >AT8?sxQ#XtX&\:rEwI:JB^Ce҂AǪɶ:Ig7KA'Q' Vz 3#_ }A_ҁs?4wڵplq?$46>*pϿ#g<Zف#,CkV95s!`hrV{0G0 [FI1:'ܦ=F1 ^޸?gd^aݺ'NmXcPʂc)! mљ1schG =Ch=yo%f)xAGCNzoўB- WçnƳ^GET łt 9đzs} .A:=F:4,)u0x1QA F91<,x#cAJQdBW?D AN 8x*P` y<a&ɶ=܅6Pmmq7ONUjKCU  ?;O9uKMXC.GXh` 448 }7-3P:m@4̶JP# ,C-5W!x@JAsյږ փ])(zI\8xūF.6h ,YQR D 濫^G.|}, mC*G+T=A(nvZ̤f݊[ŋht$ (GX)0w*8yE1D+@*DpYz)~ە+4j K,Z]! o.trV%*>z E,TKTX xx,% )DXUtD[)cWO5z2Z>ܣ$o@ h\(Awa]TJ$ttˣe&V(,`wQkTh/C#e2< x s'ȵ)cWF  Ԃ?mh RVz @QGXziֆ[= )kĵЀaױBDDa FJ '׀k'N򶧍Omv@{v 5$<9x*em`E {K! i pMi=iH*  OI5pUVCW6x)ç@ =h RW}TCCdZpHa 5\#¤BUW^6r7jpѫo}7TJ#iU15' moHd@D**U@Y[rO[WZCUW=؆{54#F TCz"5Qa"lh4XiLH9ըiV'm^5xѫo}ay+Dtئ¤o 00+i %ߡ~zpON0x?q u@7IENDB`vokoscreenNG-3.0.2/src/pictures/space.png000066400000000000000000000002711362045215000203430ustar00rootroot00000000000000PNG  IHDR2K^kbKGD pHYs  tIME ,5"t5iTXtCommentCreated with GIMPd.eIDATX1 Om /:IENDB`vokoscreenNG-3.0.2/src/pictures/systray/000077500000000000000000000000001362045215000202605ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/pictures/systray/record.license000066400000000000000000000001361362045215000231020ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.0.2/src/pictures/systray/record.png000066400000000000000000000132731362045215000222520ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs B(xtIMEA#1HIDATx[{p\ysݵ-!9dl ~\Bƙ&S'!04IS6 MBd2I -MEiH(g`_86lIc\v]]]dL3f0x`+ +9fHªXV>04fJ5L)/zx(ƥվƥ"[)@i1Pk ȏSݜOeMP09$D ΁lrNawC Ҷ!`珩~lotj9+1P[[kzW(eL8Bz~&FUTWb:$7nD|F( y<DT10 \ Ǫ 16H:a2=q!g &LWUU ={V\AJXr!oR{R΀jX{7[@oj7 pCd2@HY1VAQ8H@]ZM!mz)x &9/>2(c\,xiz7P !3:/:ZH\u>¤30.@YIH Л`׃) @;A)@Cߪܛgd%>o>zԨx|S4M|!Zc|Vа{7j² yCC{{!]2 Rh^>$}>4#pOc੧e@ wpɒ* 1xWW\7֭[u]_97 C|we2+@Ԅ<Ķm<>Ϟ34Tv:/:Cς0T J4h{;Ȟ> $W69Rmm_ 1ihhpS}$JyqR7ӏqH}=V<0KA%L>(t,t;6mb55Hp2LEl3DFU yEeeevddD\6Z$i lj|H]V&dfk9,`=<2W% Tr ҿ=d6\n9VYtZ=MQ9Req| %XWT@;PdABAXׅ;8u"(6 ސN/ 뼮p7'P[k=qw`@= M{KŔ2ש58pBI$ilPm{Tz@ԔJ]okkvww˅ZZZIǎuˀoGrv!s d>?cl)l- 1Kc|9܁DZZ׃.N)Ds[6{T]ݨLQ<, f1ز݌.Ѐu1uD6[Z$`9Ġ3,Y',ƈ\7.>QD5uEi0M"H;ؼر+ɶ/@<8}}/x) BLG$p=$4 ߯pzz = @ܲzIYK5siky%}=|z}=D6 ʆee~nKQg8JAg*%`6d6 5۶3㵵j!N$|zqn [ADፍMx9Jќ jO|f*̂r0T Bjb}Mo$U%TUUsPQQ5䷝<)koH3 i) ZLcM/1XOD0,A=W ÀaXhQEYo0-5o:{6[ ~(T ")lh2!3z+T]]mhc ܮ鴦ih4j;b&}WeDa ~3g L ]gLPm' 4 - !xO>|Ή.\@EbBSz/_&)Rݽ{@KHSVVډP#MM2s>ufG(*j-x.̱gA ǁ7: d  7819 0l۬Kֱʓ8 P}D<3|NkE744măƒ1PYXrepq_P ͂yP6 ɀr~5[Z0zU( "&Pf1D"bkk<})d TJf edKs]88C.y@q>-RE]}5b=~+zzS6ilTEQ\jA19YPs#ؒ"+XbLUH 9696f;>2oQ5E %Z.e55vAr6a a&'u"mg: iȈP3!e5Bq d@SS1>Q7f8I:mC*vK1ˊQlp[4 *:LlB.v=0Blwl Es ~.σj!ZZ6f F8\{C*i4M=%nR*#9&ܮ.t<F}M~'!ׅ,0=+*IQfGPW81Z:D"sCBଞz}WU璊k{X],vk- hlYʆI qDŖi+ɢ ݻfF3 18%jG7艰AQ :w N[E9i^QRJ*=D.1fl%Sr*[l>C8Y9BP(`91Qd%Q'ؒ(W NmmeQ0]+QP81$t\tjE&eA (p^nnJ,pFF+%nc㔢(PEk( 54TGUUhr`H O4Ƀ/g^N8 ^S* e54T0 Eɯ_?D`I)g3&?v%52]]c?90SB~8t`,ħn aN^} 4uuu:CC aQH~ʙKP2S0G1Z}=D:\*ƘTW6uizv )yv(K.^0UjU, Mҫ>h.xQF[ O1+yQ}rsΡ5gGHM3>i98Hytt We\k1rn.;WQ[k@[oA.:ӟ\u%ZթܥK\o/LJ2 cU|sh}.ˆ0BJ+V'&'-MZ[A/\(֬{.؜.1.SD::".\@nh(c/bewn&7M3=oWCq)sb| !UUXbvSJ)6"+W>c^HO/zk+C u//^dg'x4Ț5`9]:P8,Lk`aL iZϽh +jaylݻ7ߜ9^JA]M 5}0}v~"SnQ\d>P.RtfMMdoؐS %L& _"˪hֺgǤ?66D֬n6TSIx Xn8] s*mg =dG|?#("̦M/}iD[M0fe0 CtFmm3 1K[ |.wbnjLӜJM]4 ⷿtj륗wCCC@t,6˖AZD: Ӏ?y\7G}a\ LG"smhxTPoⓓa c_/&3eW]SO=\uM!80sH)O~R5kHlv|`k$8jnEtJh:d&op49 19 s0ӄH%P% ǁ;1\W_{ L aG{ιܹsgڶtD+LJIMMM.LP׻XsgIq]G g2f*nc{TGu]~A;eH(`4Q؈Xc#jp3 )eAZa1aY ׅ,V~wo͛s@62:yG?\ f}m'?Ink---^Ll˖?W|.XVLT\#b1 Y0z#G.^T00@m{oGWBvL(: 6{oiٲHtzFу.嚘VH] 9(дQD}T_zQ<EJ8;-٬uܹ?\X WRNRmݺUٲevH}k׼dR'5С;ej` ,uY4ꊖmgԔ;11?~gYEBvKЕy^@jMP]]ͯ:Kty9>>.Ros5ZIENDB`vokoscreenNG-3.0.2/src/pictures/systray/systray.license000066400000000000000000000001451362045215000233420ustar00rootroot00000000000000[license] author=Volker Kohaupt vkohaupt@freenet.de url=/src/pictures/logo.png license=Public Domain vokoscreenNG-3.0.2/src/pictures/systray/systray.png000066400000000000000000000174151362045215000225140ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs B(xtIME m:*IDATx{y]Wy;ۺVZ,%YlKdmrE0C8LjBjB`€8!JHj S$K`;2eK{rsou?qdns߹;ۿsPVvm7E"`i3 TDR0st2_-z:ZoQ7 Dh\D&XdY}&_kcccطo ;) Ib, "V%x'9n""J)VJ={J?x @/׾uŶ}zcu-8V9MzO5/-V]뚞6%_E0+ Ed$n.]A.UMB &slhLPSNOO/@U*Nڷj~}Q ,fX$Ơk&Ҏ-➊kܨKʾJlu}n0EXH@(t466Ѣ \2iEvi%srAD|ȑ75~@m#a)T(zz|"MRH)hGBjab&\I MsBqxZ(j#&JҤ+S-<2KK^V+ Z!0# @@$"D4'"3 R'Q('NlV ~$)i 5@e1 Xy<3PCdbO [cRc% D DX , ):K**]D e LkDd޽{V4j'OqGZe4ӑ\>#^@KRAJudn C*{enKn%- 'ʟqf_E؊XH4d|6)x5:4M'&&`tcO0SkB$LoT\տsXcE1>ɻ}#(NpZ=Kh[pVJeΚRٜ4*.)v܎m= aRBD6^JTPfjjIDjhj e,hE)dh߁ɏ6~}ww!vp}K=(x{-B?-Fd`2J-ҸZFeYh ZZQQ̖v!039sADi}92˭7,ؽuG̔m}sZ7k׭@زu+ w٣Z.; {ѱG|^9thsDHep0a`ؘ~M`f>x<q1 <š܀HBن?q(Uzqia7?xO}? O#M۶TG^2O >ۑ&D>EOb$x7'Y} !<NjݦW~ S/Q4 QFlRj܈,KF^HF鰬5j"={vzU_ #ŖRtVp1*q!g00PE.[yf8 .߂z0 *En 4}J5j}qV#g#I dm$ sWI02XTOѩ{'J$"b"P7S+UD."KΝAZCk:꽽_ 3 xKwǖ k7WBh`jS(O)ѹ>"&x'řlHZgMDt@[oٻcs@*yncH&ECb5n[ hC,lXZ`F#N$ J7jMK$Ea3b||?zѸou =e\wM~~BˌjRe{ k27(Te9'$dԕ[(ª\WL!z 8q>*e^wu0XfN8N<-F#^uЬݸ޻p crb!wAcaVW?x _ŸjfE|> *89>'2'T uܮR!8.M@s1RtdR`ZkWsRY(J4I|O Cb;'>nq {n&X b|#wbhd5$s~x#j X,GFم_h4, t2Ezj)[nfVY& h'5"F8K fv;8. J/P739rl۾J{\wv|vMqb`IOO۞˯R rԲ'}")b+ZJ:5Ur1HY\fa %m@'(qLMMoX?24ʏIex x~z$b]-};^| 7z3u(6؉?c6Ɔޞb9%7rJg5C5}JYz'S<$tyjNQ58ވUJ,'Z߯^/$iNMM5G/ʲV % p%Z'\)

65Tb`pN:cRq/3$oZm=KVj^zY?{?&Ys.S"N(P}ձ{FZ~T+b$/dfőg ({ē<)cS38s~֛>|xZL[h2+@X"Y痚@<8-[FqȋjèSCX@Ԟ u8WEJ};Q7ƛnDňܪEME  @{377k꺗5b!tM4/XK>=33L8/R.C;. @ih+ u4*0~FGG122S/aƪ]\?BH a#"HԠ|M+?66vI<)2ASD:~xyRV %A"hd9}X V~=h͏ 0;;v`vf ֍l:!TUT*k6VbZΒs ciۉVڲh%*Nu@ΊM=J(yEJ Ø<A;e!ET*^q? }t9>#GZ;ۃly3G08O?G;r#‚F3-\a[^cf\:l%a~u{t/~X0ߊ% %;E.HnzH6=.vxǻ~0*7k3Ou4t_U@mX  c$I%V4KE\x>0g"f"Hsh]7hJccckpwqUčy([oM7"T{j(x%T+=a=<; sT|O=?_QVhYkcm.W1p^}lڴ^CRbA˱h֦,GP~+'0ne* YJ@gGn݌/}K Q<4M-?v2\ǁSxGj`5IZ(yZW sܹs hp1_}W]-P I JjxpQK%x @kDwëѪԻ^I!pS}%y<ӳ oh6cuQΎvqK,_wl0HfyYe)ҙ.<ğ=SP<֠x>u\7 o ZXH`<[F_oӑRnp)N4 *%W48֊|˹v^!$_$ ,j'YȴNq*rz[k~;Z}ꮻ0:/ߎJ"YHTW ."K,CeQ,̶.K']IfiG""#~|'՛D)c%Ċ $aHY eE6f23$ݧllx\аފu}$4S&vaHq "qOA&v5"H;0`EB$Ij"g rr}m EKE_ْmmmWk).xK⢧B\$&b! KǓQ_ ԫ ѥgOf#~ݼ1&]XXDDvl L]UJ{~3ZkZk|}vƌ1ZrkI2ƘPVJ%X(1%eڏ7C-gWlekmj5Ƙ4 IqEQ8cn0 M6c)GQd8|o9K޳D^ 0if>}xPpDE4d~~ޜ?DQqFQAi89k-d<Zk!"J)(lj;)O*""hmNt]y^Ν; /3 YLDi LE*I$XiJ-"5MD*e7߉-J) RJyS"~;\.w744qwN9o 믿?q[VຮVJivg^un{R9|w~.y5͵ӡxI)<|0~.|7jCΫr֭[CdN+VZZ9}87nmddd88xGquW\eyC|g\k qCYCD@w+/ffcql HgffLiNZ .,,6<:\g\nPшfjL0 9 C84M9MS$5U*'gڭ|BPkyj;Ho&ફ600QufmۜiֱR*&"" rB;vD&HDkm65MjZh[Vaa!;x]w nݺ;w^iӦ]q~SNyl6v;㘓$!%0q800lEQ4laNaȟEd?PsIENDB`vokoscreenNG-3.0.2/src/pictures/template.license000066400000000000000000000000411362045215000217140ustar00rootroot00000000000000[license] author= url= license= vokoscreenNG-3.0.2/src/pictures/windows.license000066400000000000000000000001501362045215000215740ustar00rootroot00000000000000[license] author=Volker Kohaupt vkohaupt@freenet.de url=/src/pictures/windows.png license=Public Domain vokoscreenNG-3.0.2/src/pictures/windows.png000066400000000000000000000012151362045215000207410ustar00rootroot00000000000000PNG  IHDR1GbKGD pHYs+tIME7.IDATx1J+QNX,%9nƝLc`_!'X{A>ZK(y|yTe+%cow.f/[K**$rMChVt\V`涇 D E X,`,`A X "X,`A E X,`,`A X "X,`A EF:cX,lSr?z[4q.hkp[V_x.l^_{]]h1iξ{g>|I[6{WI?@{fn坮[L&\˔yk"X "X,`A E X,`,`A X "X,`A E X,`,`A X "XX#O= WU>k_K2 }C:IENDB`vokoscreenNG-3.0.2/src/player/000077500000000000000000000000001362045215000162005ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/player/QvkPlayer.cpp000066400000000000000000000751361362045215000206360ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkPlayer.h" #include "QvkPlayerVideoSurface.h" #include "QvkSpezialSlider.h" #include "global.h" #include #include #include #include #include #include #include QvkPlayer::QvkPlayer( QMainWindow *parent, Ui_formMainWindow *ui_mainwindow ) : ui(new Ui::player) { ui->setupUi(this); sliderVideo = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayout_2->insertWidget( 0, sliderVideo ); ui->horizontalLayout_2->setStretch( 0, 1 ); sliderVideo->setObjectName( "sliderVideo" ); sliderVideo->setTracking( true ); sliderVideo->setShowValue( false ); sliderVideo->setEnabled( false ); sliderVideo->setMaximum(1); sliderVideo->show(); sliderVolume = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayout_3->insertWidget( 12, sliderVolume ); ui->horizontalLayout_3->setStretch( 12, 1 ); sliderVolume->setObjectName( "sliderVolume" ); sliderVolume->setTracking( true ); sliderVolume->setMinimum( 0 ); sliderVolume->setMaximum( 100 ); sliderVolume->show(); parentMainWindow = parent; oldWindowTitel = parentMainWindow->windowTitle(); uiMainWindow = ui_mainwindow; uiMainWindow->verticalLayoutTabSidebarPlayer->addWidget( this ); QList listToolButton = ui->frameMenueBar->findChildren(); for ( int i = 0; i < listToolButton.count(); i++ ) { listToolButton.at(i)->setMouseTracking( true ); } this->setMouseTracking( true ); ui->framePlayer->setMouseTracking( true ); ui->labelPlayer->setMouseTracking( true ); ui->labelPlayer->setFocus(); // Need Focus for F11 in windowmode(GUI) QIcon icon( QString::fromUtf8( ":/pictures/logo/logo.png" ) ); ui->labelPlayer->setPixmap( icon.pixmap( 128, 128 ) ); ui->framePlayer->setStyleSheet( "QFrame { background-color: black; }" ); ui->pushButtonPlay->setIcon( QIcon::fromTheme( "media-playback-start" , style()->standardIcon( QStyle::SP_MediaPlay ) ) ); ui->pushButtonPause->setIcon( QIcon::fromTheme( "media-playback-pause", style()->standardIcon( QStyle::SP_MediaPause ) ) ); ui->pushButtonStop->setIcon( QIcon::fromTheme( "media-playback-stop" , style()->standardIcon( QStyle::SP_MediaStop ) ) ); ui->toolButtonFrameBackward->setIcon( QIcon::fromTheme( "go-previous", style()->standardIcon( QStyle::SP_MediaSeekBackward ) ) ); ui->toolButtonFrameForward->setIcon( QIcon::fromTheme( "go-next", style()->standardIcon( QStyle::SP_MediaSeekForward ) ) ); ui->toolButtonOpenFile->setIcon( QIcon::fromTheme( "document-open", style()->standardIcon( QStyle::SP_FileIcon ) ) ); ui->toolButtonMute->setIcon( QIcon::fromTheme( "audio-volume-high" , style()->standardIcon( QStyle::SP_MediaVolume ) ) ); ui->toolButtonFullscreen->setIcon( QIcon::fromTheme( "view-fullscreen", QIcon( ":/pictures/player/fullscreen.png" ) ) ); mediaPlayer = new QMediaPlayer; sliderVolume->setValue( 70 ); mediaPlayer->setVolume( 70 ); mediaPlayer->setNotifyInterval( 40 ); QvkPlayerVideoSurface *videoSurface = new QvkPlayerVideoSurface( this ); connect( videoSurface, SIGNAL( signal_newPicture( QImage ) ), this, SLOT( slot_setNewImage( QImage ) ) ); mediaPlayer->setVideoOutput( videoSurface ); connect( mediaPlayer, SIGNAL( mutedChanged( bool ) ), this, SLOT( slot_mutedChanged( bool ) ) ); connect( mediaPlayer, SIGNAL( durationChanged( qint64 ) ), this, SLOT( slot_durationChanged( qint64 ) ) ); connect( mediaPlayer, SIGNAL( positionChanged( qint64 ) ), this, SLOT( slot_positionChanged( qint64 ) ) ); connect( mediaPlayer, SIGNAL( stateChanged( QMediaPlayer::State ) ), this, SLOT( slot_stateChanged( QMediaPlayer::State ) ) ); connect( mediaPlayer, SIGNAL( volumeChanged( int ) ), this, SLOT( slot_volumeChanged( int ) ) ); // Funktioniert nicht mit Pulse connect( mediaPlayer, QOverload::of(&QMediaPlayer::error), [=](QMediaPlayer::Error error) { switch ( error ) { case QMediaPlayer::NoError: { qDebug() << global::nameOutput + " " + "[Player]" + " " + "No error has occurred."; break; } case QMediaPlayer::ResourceError: { qDebug() << global::nameOutput + " " + "[Player]" + " " + "To play this video a codec is needed. " "Please install a codec pack."; QMessageBox msgBox( this ); msgBox.setText( "To play this video a codec is needed.\n" "Please install a codec pack." ); msgBox.setWindowTitle( global::name + " " + global::version ); msgBox.setIcon( QMessageBox::Information ); msgBox.exec(); break; } case QMediaPlayer::FormatError: { qDebug() << global::nameOutput + " " + "[Player]" + " " + "The format of a media resource isn't (fully) supported. Playback may still be possible, but without an audio or video component."; QMessageBox msgBox( this ); msgBox.setText( "The format of a media resource isn't (fully) supported.\n" "Playback may still be possible, but without an audio or video component." ); msgBox.setWindowTitle( global::name + " " + global::version ); msgBox.setIcon( QMessageBox::Information ); msgBox.exec(); break; } case QMediaPlayer::NetworkError: { qDebug() << global::nameOutput + " " + "[Player]" + " " + "A network error occurred."; QMessageBox msgBox( this ); msgBox.setText( "A network error occurred." ); msgBox.setWindowTitle( global::name + " " + global::version ); msgBox.setIcon( QMessageBox::Information ); msgBox.exec(); break; } case QMediaPlayer::AccessDeniedError: { qDebug() << global::nameOutput + " " + "[Player]" + " " + "There are not the appropriate permissions to play a media resource."; QMessageBox msgBox( this ); msgBox.setText( "There are not the appropriate permissions to play a media resource." ); msgBox.setWindowTitle( global::name + " " + global::version ); msgBox.setIcon( QMessageBox::Information ); msgBox.exec(); break; } case QMediaPlayer::ServiceMissingError: { qDebug() << global::nameOutput + " " + "[Player]" + " " + "A valid playback service was not found, playback cannot proceed."; QMessageBox msgBox( this ); msgBox.setText( "A valid playback service was not found, playback cannot proceed." ); msgBox.setWindowTitle( global::name + " " + global::version ); msgBox.setIcon( QMessageBox::Information ); msgBox.exec(); break; } case QMediaPlayer::MediaIsPlaylist: { qDebug() << global::nameOutput + " " + "[Player]" + " " + "QMediaPlayer::MediaIsPlaylist"; QMessageBox msgBox( this ); msgBox.setText( "QMediaPlayer::MediaIsPlaylist" ); msgBox.setWindowTitle( global::name + " " + global::version ); msgBox.setIcon( QMessageBox::Information ); msgBox.exec(); break; } } } ); connect( sliderVideo, SIGNAL( sliderPressed() ), this, SLOT( slot_sliderVideoPressed() ) ); connect( sliderVideo, SIGNAL( sliderReleased() ), this, SLOT( slot_sliderVideoReleased() ) ); connect( sliderVideo, SIGNAL( sliderMoved( int )), this, SLOT( slot_sliderVideoMoved( int ) ) ); connect( sliderVideo, SIGNAL( actionTriggered( int ) ), this, SLOT( slot_sliderVideo_KeyRight_KeyLeft( int ) ) ); ui->pushButtonPause->hide(); connect( ui->pushButtonPlay, SIGNAL( clicked( bool ) ), this, SLOT( slot_play() ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), mediaPlayer, SLOT( pause() ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), mediaPlayer, SLOT( stop() ) ); connect( ui->toolButtonFrameBackward, SIGNAL( clicked( bool ) ), this, SLOT( slot_toolButtonFrameBackward() ) ); connect( ui->toolButtonFrameForward, SIGNAL( clicked( bool ) ), this, SLOT( slot_toolButtonFrameForward() ) ); connect( ui->toolButtonOpenFile, SIGNAL( clicked( bool ) ), this, SLOT( slot_openFile() ) ); connect( ui->toolButtonFullscreen, SIGNAL( clicked( bool ) ), this, SLOT( slot_toolButtonFullscreen() ) ); connect( sliderVolume, SIGNAL( sliderMoved( int ) ), mediaPlayer, SLOT( setVolume( int ) ) ); connect( ui->toolButtonMute, SIGNAL( clicked( bool ) ), this, SLOT( slot_mute() ) ); timerHideMouse = new QTimer( this ); timerHideMouse->setTimerType( Qt::PreciseTimer ); connect( timerHideMouse, SIGNAL( timeout() ), this, SLOT( slot_hideMouse() ) ); timerHideMouse->setInterval( 3000 ); timerHideMouse->start(); QPixmap pixmap( ":/pictures/player/move.png" ); QPixmap map = pixmap.scaled( ui->labelMovePicture->size().height()-7, ui->labelMovePicture->size().height()-7 ); ui->labelMovePicture->setPixmap( map ); ui->labelMovePicture->hide(); metaFrame = new QFrame( ui->labelPlayer ); metaLabel = new QLabel( metaFrame ); metaLabel->setStyleSheet( "QLabel { background-color : white; color : blue; }" ); metaFrame->setStyleSheet( "QFrame { background-color : white; color : blue; }" ); metaFrame->hide(); metaLabel->hide(); QList listWidget = ui->frameMenueBar->findChildren(); for ( int i = 0; i < listWidget.count(); i++ ) { listWidget.at(i)->setStyleSheet( "QToolTip { background-color: black; color: white }" ); listWidget.at(i)->setFocusPolicy( Qt::NoFocus ); } } QvkPlayer::~QvkPlayer() { delete ui; } // Funktioniert nicht mit Pulse void QvkPlayer::slot_volumeChanged( int ) { } void QvkPlayer::slot_hideMouse() { if ( parentMainWindow->isFullScreen() == false ) { ui->labelPlayer->setCursor( Qt::BlankCursor ); return; } if ( parentMainWindow->isFullScreen() == true ) { ui->labelPlayer->setCursor( Qt::BlankCursor ); if ( ui->widgetMenueBar->isHidden() == false ) { ui->widgetMenueBar->hide(); } } } void QvkPlayer::mouseMoveEvent( QMouseEvent *event ) { Q_UNUSED(event); timerHideMouse->stop(); if ( parentMainWindow->isFullScreen() == false ) { ui->labelPlayer->unsetCursor(); timerHideMouse->start(); return; } if ( ( ui->widgetMenueBar->underMouse() == true ) and ( pressed == true ) ) { ui->widgetMenueBar->move( event->pos().x() - mouseInWidgetX , event->pos().y() - mouseInWidgetY ); return; } if ( parentMainWindow->isFullScreen() == true ) { if ( ui->widgetMenueBar->underMouse() == false ) { ui->labelPlayer->unsetCursor(); ui->widgetMenueBar->show(); timerHideMouse->start(); } } } void QvkPlayer::closeEvent(QCloseEvent *event) { Q_UNUSED(event); mediaPlayer->stop(); } void QvkPlayer::slot_toolButtonFrameForward() { if ( mediaPlayer->media().isNull() == false ) { ui->labelDuration->setText( get_time( ( sliderVideo->value() + 1 ) * mediaPlayer->notifyInterval() ) ); sliderVideo->setValue( sliderVideo->value() + 1 ); mediaPlayer->pause(); mediaPlayer->setPosition( sliderVideo->value() * mediaPlayer->notifyInterval() ); } } void QvkPlayer::slot_toolButtonFrameBackward() { if ( mediaPlayer->media().isNull() == false ) { ui->labelDuration->setText( get_time( ( sliderVideo->value() - 1 ) * mediaPlayer->notifyInterval() ) ); sliderVideo->setValue( sliderVideo->value() - 1 ); mediaPlayer->pause(); mediaPlayer->setPosition( sliderVideo->value() * mediaPlayer->notifyInterval() ); } } void QvkPlayer::setMediaFile( QString string ) { if ( string.contains( "http://" ) or string.contains( "https://" ) ) { QMediaContent mediaContent = QMediaContent( QUrl( string ) ); mediaPlayer->setMedia( mediaContent ); } else { mediaPlayer->setMedia( QUrl::fromLocalFile( string ) ); } ui->labelDuration->setEnabled( true ); ui->labelSeparator->setEnabled( true ); ui->labelVideoLenght->setEnabled( true ); sliderVideo->setEnabled( true ); } void QvkPlayer::slot_openFile() { if ( pathOpenFile == "" ) { pathOpenFile = QStandardPaths::writableLocation( QStandardPaths::MoviesLocation ); } QString file = QFileDialog::getOpenFileName( this, tr( "Open File" ), pathOpenFile, "" ); if ( !file.isEmpty() ) { setMediaFile( file ); slot_play(); pathOpenFile = QDir( file ).absolutePath(); } } void QvkPlayer::slot_sliderVideoPressed() { if ( mediaPlayer->state() == QMediaPlayer::PlayingState ) { playingFlag = true; } mediaPlayer->pause(); } void QvkPlayer::slot_sliderVideoReleased() { // if pause und video not playing if ( ( mediaPlayer->state() == QMediaPlayer::PausedState ) and ( playingFlag == false ) ) { mediaPlayer->setPosition( sliderVideo->value() * mediaPlayer->notifyInterval() ); return; } // If pause and video playing if ( ( mediaPlayer->state() == QMediaPlayer::PausedState ) and ( playingFlag == true ) ) { mediaPlayer->setPosition( sliderVideo->value() * mediaPlayer->notifyInterval() ); playingFlag = false; } mediaPlayer->setPosition( sliderVideo->value() * mediaPlayer->notifyInterval() ); mediaPlayer->play(); } void QvkPlayer::slot_sliderVideoMoved( int value ) { mediaPlayer->setPosition( sliderVideo->value() * mediaPlayer->notifyInterval() ); ui->labelDuration->setText( get_time( value * mediaPlayer->notifyInterval() ) ); } void QvkPlayer::slot_sliderVideo_KeyRight_KeyLeft( int value ) { Q_UNUSED(value); mediaPlayer->setPosition( sliderVideo->value() * mediaPlayer->notifyInterval() ); ui->labelDuration->setText( get_time( sliderVideo->value() * mediaPlayer->notifyInterval() ) ); } void QvkPlayer::slot_play() { show(); mediaPlayer->play(); parentMainWindow->setWindowTitle( mediaPlayer->currentMedia().canonicalUrl().fileName() + " - " + oldWindowTitel ); } void QvkPlayer::slot_mute() { ui->toolButtonMute->setEnabled( false ); if ( mediaPlayer->isMuted()== true ) { mediaPlayer->setMuted( false ); return; } if ( mediaPlayer->isMuted()== false ) { mediaPlayer->setMuted( true ); return; } } void QvkPlayer::slot_mutedChanged( bool muted ) { if ( muted == true ) { ui->toolButtonMute->setIcon( QIcon::fromTheme( "audio-volume-muted", style()->standardIcon( QStyle::SP_MediaVolumeMuted ) ) ); sliderVolume->setEnabled( false ); ui->toolButtonMute->setEnabled( true ); return; } if ( muted == false ) { ui->toolButtonMute->setIcon( QIcon::fromTheme( "audio-volume-high", style()->standardIcon( QStyle::SP_MediaVolume ) ) ); sliderVolume->setEnabled( true ); ui->toolButtonMute->setEnabled( true ); return; } } QString QvkPlayer::get_time( qint64 value ) { int sec = (value/1000) % 60; int min = (value/1000/60) % 60; int hour= static_cast(value/1000/60/60); QTime time( 0, 0, 0 ); time.setHMS( hour, min, sec ); return time.toString( "HH:mm:ss" ); } void QvkPlayer::slot_durationChanged( qint64 value ) { // Set lenght from video on slider sliderVideo->setMaximum( static_cast( value / mediaPlayer->notifyInterval() ) ); // Show lenght from video in label ui->labelVideoLenght->setText( get_time( value ) ); } void QvkPlayer::slot_stateChanged( QMediaPlayer::State state ) { qDebug() << "[vokoplayer]" << state; if ( state == QMediaPlayer::StoppedState ) { ui->pushButtonStop->setEnabled( false ); ui->pushButtonPause->setVisible( false ); ui->pushButtonPlay->setVisible( true ); ui->pushButtonPlay->setEnabled( true ); sliderVideo->setValue( 0 ); ui->labelDuration->setText( "00:00:00" ); QIcon icon( QString::fromUtf8( ":/pictures/logo/logo.png" ) ); ui->labelPlayer->setPixmap( icon.pixmap( 128, 128 ) ); parentMainWindow->setWindowTitle( oldWindowTitel ); vk_showNormal(); ui->toolButtonFrameBackward->setEnabled( true ); ui->toolButtonFrameForward->setEnabled( true ); metaFrame->hide(); metaLabel->hide(); } if ( state == QMediaPlayer::PlayingState ) { ui->pushButtonPlay->setVisible( false ); ui->pushButtonPause->setVisible( true ); ui->pushButtonPause->setEnabled( true ); ui->pushButtonStop->setEnabled( true ); ui->toolButtonFrameBackward->setEnabled( true ); ui->toolButtonFrameForward->setEnabled( true ); } if ( state == QMediaPlayer::PausedState ) { ui->pushButtonPause->setVisible( false ); ui->pushButtonStop->setEnabled( true ); ui->pushButtonPlay->setVisible( true ); ui->pushButtonPlay->setEnabled( true ); ui->toolButtonFrameBackward->setEnabled( true ); ui->toolButtonFrameForward->setEnabled( true ); } } /* * Wird von mediplayer-notyfier periodisch aufgerufen. */ void QvkPlayer::slot_positionChanged( qint64 value ) { if ( mediaPlayer->state() == QMediaPlayer::PlayingState ) { sliderVideo->setValue( static_cast( value / mediaPlayer->notifyInterval() ) ); // Show playing time in label ui->labelDuration->setText( get_time( value ) ); } } void QvkPlayer::slot_setNewImage( QImage image ) { QSize ratioSize = getPixelaspectRatio(); qreal ratio = (qreal)ratioSize.width() / (qreal)ratioSize.height(); QScreen *screen = QGuiApplication::primaryScreen(); if ( ratio == 1.0 ) { image.setDevicePixelRatio( screen->devicePixelRatio() ); image = image.scaled( static_cast( ui->framePlayer->width()*screen->devicePixelRatio() ), static_cast( ui->framePlayer->height()*screen->devicePixelRatio() ), Qt::KeepAspectRatio, Qt::SmoothTransformation ); ui->labelPlayer->setPixmap( QPixmap::fromImage( image ) ); return; } // Testvideos find in source code under /vokoscreenNG/Videos-to-test-the-player/ // Example: // Area:450x800 scale:1280*720 if ( ( ratio != 1.0 ) and ( ratioSize.width() < ratioSize.height() ) ) { // Adapt to the frame if ( ui->framePlayer->width() < (int)( (qreal)ui->framePlayer->height() * ( (qreal)image.width() / (qreal)image.height() * ratio ) * screen->devicePixelRatio() ) ) { image = image.scaled( static_cast( ui->framePlayer->width() * screen->devicePixelRatio() ), (int)( (qreal)ui->framePlayer->width() * ( (qreal)image.height() / (qreal)image.width() / ratio ) * screen->devicePixelRatio() ), Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); ui->labelPlayer->setPixmap( QPixmap::fromImage( image ) ); return; } // Adapt to the frame if ( ui->framePlayer->height() > (int)( (qreal)ui->framePlayer->height() * ( (qreal)image.width() / (qreal)image.height() * ratio ) * screen->devicePixelRatio() ) ) { image = image.scaled( (int)( (qreal)ui->framePlayer->height() * ( (qreal)image.width() / (qreal)image.height() * ratio ) * screen->devicePixelRatio() ), static_cast( ui->framePlayer->height() * screen->devicePixelRatio() ), Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); ui->labelPlayer->setPixmap( QPixmap::fromImage( image ) ); return; } } // Example: // Area:800x320 scale:1280*720 if ( ( ratio != 1.0 ) and ( ratioSize.width() > ratioSize.height() ) ) { // Adapt to the frame if ( ui->framePlayer->height() < (int)( (qreal)ui->framePlayer->width() * ( (qreal)image.height() / (qreal)image.width() / ratio ) * screen->devicePixelRatio() ) ) { image = image.scaled( (int)( (qreal)ui->framePlayer->height() * ( (qreal)image.width() / (qreal)image.height() * ratio ) * screen->devicePixelRatio() ), static_cast( ui->framePlayer->height() * screen->devicePixelRatio() ), Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); ui->labelPlayer->setPixmap( QPixmap::fromImage( image ) ); return; } // Adapt to the frame if ( ui->framePlayer->height() > (int)( (qreal)ui->framePlayer->width() * ( (qreal)image.height() / (qreal)image.width() / ratio ) * screen->devicePixelRatio() ) ) { image = image.scaled( static_cast( ui->framePlayer->width() * screen->devicePixelRatio() ), (int)( (qreal)ui->framePlayer->width() * (qreal)image.height() / (qreal)image.width() / ratio * screen->devicePixelRatio() ), Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); ui->labelPlayer->setPixmap( QPixmap::fromImage( image ) ); return; } } } QSize QvkPlayer::getPixelaspectRatio() { int width = 1; int height = 1; if ( mediaPlayer->isMetaDataAvailable() == true ) { QStringList stringList = mediaPlayer->availableMetaData(); for ( int i = 0; i < stringList.count(); i++ ) { if ( stringList.at(i) == "PixelAspectRatio" ) { width = mediaPlayer->metaData( stringList.at(i) ).toSize().width(); height = mediaPlayer->metaData( stringList.at(i) ).toSize().height(); break; } } } return QSize( width, height ); } void QvkPlayer::vk_showFullscreen() { uiMainWindow->tabWidgetSideBar->hide(); uiMainWindow->verticalLayoutCentralWidget->addWidget( this ); parentMainWindow->showFullScreen(); ui->widgetMenueBar->setParent( ui->labelPlayer); ui->framePlayer->setStyleSheet( "QFrame { background-color: black; }" ); ui->widgetMenueBar->setStyleSheet( "QWidget { background-color: lightgray; }" ); ui->labelMovePicture->setStyleSheet( "QLabel { background-color: lightgray; }" ); ui->toolButtonFullscreen->setIcon( QIcon::fromTheme( "view-restore", QIcon( ":/pictures/player/restore.png" ) ) ); ui->labelMovePicture->show(); ui->widgetMenueBar->show(); ui->labelPlayer->setFocus(); if ( mediaPlayer->state() == QMediaPlayer::PausedState ) { ui->toolButtonFrameBackward->click(); qApp->processEvents(); ui->toolButtonFrameForward->click(); qApp->processEvents(); } } void QvkPlayer::vk_showNormal() { uiMainWindow->tabWidgetSideBar->show(); uiMainWindow->verticalLayoutTabSidebarPlayer->addWidget( this ); parentMainWindow->showNormal(); ui->verticalLayout_4->addWidget( ui->widgetMenueBar ); ui->framePlayer->setStyleSheet( "QFrame { background-color: black; }" ); // An empty string resets the color ui->widgetMenueBar->setStyleSheet( "" ); ui->toolButtonFullscreen->setIcon( QIcon::fromTheme( "view-fullscreen", QIcon( ":/pictures/player/fullscreen.png" ) ) ); ui->labelMovePicture->hide(); ui->widgetMenueBar->show(); ui->labelPlayer->setFocus(); if ( mediaPlayer->state() == QMediaPlayer::PausedState ) { ui->toolButtonFrameBackward->click(); qApp->processEvents(); ui->toolButtonFrameForward->click(); qApp->processEvents(); } } void QvkPlayer::slot_toolButtonFullscreen() { if ( parentMainWindow->isFullScreen() == true ) { vk_showNormal(); } else { vk_showFullscreen(); } } void QvkPlayer::mouseDoubleClickEvent( QMouseEvent *event ) { if ( event->button() == Qt::LeftButton ) { if ( parentMainWindow->isFullScreen() == true ) { vk_showNormal(); } else { vk_showFullscreen(); } } } void QvkPlayer::keyPressEvent( QKeyEvent *event ) { int stepSize = 25; if ( ( mediaPlayer->state() == QMediaPlayer::PlayingState ) or ( mediaPlayer->state() == QMediaPlayer::PausedState ) ) { if ( event->key() == Qt::Key_Right ) { ui->labelDuration->setText( get_time( ( sliderVideo->value() + stepSize ) * mediaPlayer->notifyInterval() ) ); sliderVideo->setValue( sliderVideo->value() + stepSize ); mediaPlayer->setPosition( sliderVideo->value() * mediaPlayer->notifyInterval() ); return; } if ( event->key() == Qt::Key_Left ) { ui->labelDuration->setText( get_time( ( sliderVideo->value() - stepSize ) * mediaPlayer->notifyInterval() ) ); sliderVideo->setValue( sliderVideo->value() - stepSize ); mediaPlayer->setPosition( sliderVideo->value() * mediaPlayer->notifyInterval() ); } } if ( event->key() == Qt::Key_Space ) { switch ( mediaPlayer->state() ) { case QMediaPlayer::PlayingState: { ui->pushButtonPause->click(); break; } case QMediaPlayer::PausedState: { ui->pushButtonPlay->click(); break; } case QMediaPlayer::StoppedState: { ui->pushButtonPlay->click(); break; } } } if ( event->key() == Qt::Key_Escape ) { vk_showNormal(); } if ( ( event->key() == Qt::Key_F11 ) or ( event->key() == Qt::Key_F ) ) { if ( parentMainWindow->isFullScreen() == true ) { vk_showNormal(); } else { vk_showFullscreen(); } } } void QvkPlayer::mousePressEvent( QMouseEvent *event ) { if ( parentMainWindow->isFullScreen() == true ) { if ( ui->widgetMenueBar->underMouse() and ( pressed == false ) ) { mouseInWidgetX = event->pos().x() - ui->widgetMenueBar->pos().x(); mouseInWidgetY = event->pos().y() - ui->widgetMenueBar->pos().y(); ui->labelMovePicture->setCursor( Qt::SizeAllCursor ); pressed = true; } } if ( ( event->button() == Qt::RightButton ) and ( metaFrame->isVisible() == true ) ) { metaFrame->hide(); metaLabel->hide(); return; } if ( event->button() == Qt::RightButton ) { if ( mediaPlayer->isMetaDataAvailable() == true ) { QString metaString; QStringList stringList = mediaPlayer->availableMetaData(); stringList.removeAt( stringList.indexOf( "AudioBitRate" ) ); stringList.removeAt( stringList.indexOf( "maximum-bitrate" ) ); stringList.removeAt( stringList.indexOf( "minimum-bitrate" ) ); stringList.sort(); for ( int i = 0; i < stringList.count(); i++ ) { if ( stringList.at(i) == "Resolution" ) { QString width = QString::number( mediaPlayer->metaData( stringList.at(i) ).toSize().width() ); QString heigth = QString::number( mediaPlayer->metaData( stringList.at(i) ).toSize().height() ); metaString += stringList.at(i) + " : " + width + "x" + heigth + "\n"; continue; } if ( stringList.at(i) == "PixelAspectRatio" ) { QString width = QString::number( mediaPlayer->metaData( stringList.at(i) ).toSize().width() ); QString heigth = QString::number( mediaPlayer->metaData( stringList.at(i) ).toSize().height() ); metaString += stringList.at(i) + " : " + width + "x" + heigth + "\n"; continue; } metaString += stringList.at(i) + " : " + mediaPlayer->metaData( stringList.at(i) ).toString() + "\n"; } metaLabel->setText( metaString ); metaLabel->move( 10, 10 ); metaFrame->hide(); metaLabel->hide(); metaLabel->show(); metaFrame->show(); metaFrame->resize( QSize( metaLabel->size().width() + 20, metaLabel->size().height() ) ); } } } void QvkPlayer::mouseReleaseEvent( QMouseEvent *event ) { Q_UNUSED(event); ui->labelMovePicture->setCursor( Qt::ArrowCursor ); pressed = false; } void QvkPlayer::leaveEvent( QEvent *event ) { Q_UNUSED(event); ui->labelPlayer->setCursor( Qt::ArrowCursor ); } void QvkPlayer::resizeEvent( QResizeEvent *event ) { Q_UNUSED(event); if ( parentMainWindow->isFullScreen() == true ) { ui->widgetMenueBar->move( ui->framePlayer->width()/2 - ui->widgetMenueBar->width()/2, ui->framePlayer->height() - ui->widgetMenueBar->height() ); return; } if ( mediaPlayer->state() == QMediaPlayer::PausedState ) { ui->toolButtonFrameForward->click(); ui->toolButtonFrameBackward->click(); } } vokoscreenNG-3.0.2/src/player/QvkPlayer.h000066400000000000000000000056141362045215000202750ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKPLAYER_H #define QVKPLAYER_H #include "ui_formMainWindow.h" #include "ui_player.h" #include "QvkSpezialSlider.h" #include #include #include #include #include #include class QvkPlayer : public QWidget { Q_OBJECT public: explicit QvkPlayer(QMainWindow *parent, Ui_formMainWindow *ui_mainwindow); ~QvkPlayer(); void setMediaFile( QString string ); Ui_player *ui; QString pathOpenFile; public slots: void slot_play(); private slots: void slot_setNewImage( QImage image ); void slot_mute(); void slot_durationChanged( qint64 value ); void slot_positionChanged( qint64 value ); void slot_stateChanged( QMediaPlayer::State ); void slot_mutedChanged( bool muted ); void slot_toolButtonFullscreen(); void slot_openFile(); void slot_sliderVideoPressed(); void slot_sliderVideoReleased(); void slot_sliderVideoMoved( int value ); void slot_volumeChanged(int value); // Funktioniert nicht mit Pulse void slot_hideMouse(); void slot_sliderVideo_KeyRight_KeyLeft( int value ); void slot_toolButtonFrameForward(); void slot_toolButtonFrameBackward(); private: QMainWindow *parentMainWindow; Ui_formMainWindow *uiMainWindow; QMediaPlayer *mediaPlayer; QString get_time( qint64 value ); int mouseInWidgetX; int mouseInWidgetY; bool pressed = false; void vk_showFullscreen(); void vk_showNormal(); QTimer *timerHideMouse; QString oldWindowTitel; bool playingFlag = false; QLabel *metaLabel; QFrame *metaFrame; QvkSpezialSlider *sliderVolume; QvkSpezialSlider *sliderVideo; QSize getPixelaspectRatio(); protected: void mouseDoubleClickEvent( QMouseEvent *event ); void closeEvent(QCloseEvent *event); void keyPressEvent( QKeyEvent *event ); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void resizeEvent(QResizeEvent *event); void leaveEvent(QEvent *event); }; #endif // QVKPLAYER_H vokoscreenNG-3.0.2/src/player/QvkPlayerVideoSurface.h000066400000000000000000000042061362045215000225710ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKPLAYERVIDEOSURFACE_H #define QVKPLAYERVIDEOSURFACE_H #include #include class QvkPlayerVideoSurface: public QAbstractVideoSurface { Q_OBJECT public: QvkPlayerVideoSurface(QObject * parent = Q_NULLPTR ) : QAbstractVideoSurface(parent) {} QList supportedPixelFormats(QAbstractVideoBuffer::HandleType type) const { (void)type; #ifdef Q_OS_LINUX return QList() << QVideoFrame::Format_RGB24; #endif #ifdef Q_OS_WIN return QList() << QVideoFrame::Format_RGB32; #endif } bool present(const QVideoFrame &frame) { if (frame.isValid() ) { QVideoFrame cloneFrame(frame); cloneFrame.map(QAbstractVideoBuffer::ReadOnly); const QImage image( cloneFrame.bits(), cloneFrame.width(), cloneFrame.height(), QVideoFrame::imageFormatFromPixelFormat( cloneFrame.pixelFormat() ) ); cloneFrame.unmap(); emit ( signal_newPicture( image ) ); return true; } return false; } signals: void signal_newPicture( QImage ); }; #endif vokoscreenNG-3.0.2/src/player/player.pri000066400000000000000000000003001362045215000202010ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkPlayerVideoSurface.h \ $$PWD/QvkPlayer.h SOURCES += $$PWD/QvkPlayer.cpp FORMS += $$PWD/player.ui vokoscreenNG-3.0.2/src/player/player.ui000066400000000000000000000260301362045215000200340ustar00rootroot00000000000000 player 0 0 744 400 0 0 0 0 0 0 0 QFrame::NoFrame QFrame::Raised 0 QLayout::SetDefaultConstraint 0 0 0 0 0 0 TextLabel Qt::AlignCenter true QFrame::NoFrame QFrame::Raised 0 0 0 0 0 0 0 0 0 0 0 0 Qt::Horizontal 40 20 false 00:00:00 false / false 00:00:00 0 0 0 0 false Play false Pause false Stop Qt::Horizontal 40 20 false Previous frame < true 40 false Next frame > true 40 Qt::Horizontal 40 20 Open File Open File Fullscreen Fullscreen Move menu Move Qt::Horizontal 40 20 Mute Mute Help vokoscreenNG-3.0.2/src/region/000077500000000000000000000000001362045215000161675ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/region/QvkRegionButtonArrow.cpp000066400000000000000000000065221362045215000230140ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkRegionButtonArrow.h" QvkRegionButtonArrow::QvkRegionButtonArrow() { } QvkRegionButtonArrow::~QvkRegionButtonArrow() { } QPixmap QvkRegionButtonArrow::getButton( QColor color ) { QPixmap pixmap( diameter+penWidth, diameter+penWidth ); pixmap.fill( Qt::transparent ); QPainter painter; painter.begin( &pixmap ); painter.setRenderHints( QPainter::Antialiasing, true ); QBrush brush; brush.setColor( color ); brush.setStyle( Qt::SolidPattern ); painter.setBrush( brush ); QPen pen; pen.setColor( Qt::black ); pen.setWidth( penWidth ); painter.setPen( pen ); painter.drawEllipse( penWidthHalf, penWidthHalf, diameter, diameter ); painter.end(); return pixmap; } QPixmap QvkRegionButtonArrow::getArrow( degreeArrow degree, QColor colorSelected ) { QPixmap pixmap( diameter+penWidth, diameter+penWidth ); pixmap.fill( Qt::transparent ); QPainter painter; painter.begin( &pixmap ); painter.setRenderHints( QPainter::Antialiasing, true ); painter.translate((diameter+penWidth)/2, (diameter+penWidth)/2); painter.rotate( degree ); QPen pen; pen.setCapStyle( Qt::RoundCap ); pen.setColor( colorSelected ); pen.setWidthF( penWidth ); pen.setJoinStyle( Qt::RoundJoin ); painter.setPen( pen ); QBrush brush; brush.setColor( Qt::black ); brush.setStyle( Qt::SolidPattern ); painter.setBrush( brush ); QPainterPath painterPath; painterPath.moveTo( 0, 0 ); painterPath.lineTo( 0, -radius + penWidth ); painterPath.lineTo( -3, -radius + penWidth + 7 ); painterPath.lineTo( 3, -radius + penWidth + 7 ); painterPath.lineTo( 0, -radius + penWidth ); painter.drawPath( painterPath ); painter.end(); return pixmap; } QPixmap QvkRegionButtonArrow::getPixmapHandle( QColor color, QColor colorSelected ,degreeArrow degree ) { QPixmap pixmap( diameter+penWidth, diameter+penWidth ); pixmap.fill( Qt::transparent ); QPainter painter; painter.begin( &pixmap ); painter.setRenderHints( QPainter::Antialiasing, true ); painter.drawPixmap( 0, 0, getButton( color ) ); painter.drawPixmap( 0, 0, getArrow( degree , colorSelected ) ); painter.end(); return pixmap; } int QvkRegionButtonArrow::getWithHalf() { return ( diameter + penWidth ) / 2; } vokoscreenNG-3.0.2/src/region/QvkRegionButtonArrow.h000066400000000000000000000030361362045215000224560ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef REGIONBUTTONARROW_H #define REGIONBUTTONARROW_H #include class QvkRegionButtonArrow : public QObject { Q_OBJECT public: QvkRegionButtonArrow(); virtual ~QvkRegionButtonArrow(); enum degreeArrow { topMiddle=0, topRight=45, rightMiddle=90, bottomRight=135, bottomMiddel=180, bottomLeft=225, leftMiddel=270, topLeft=315 }; private: int penWidth = 2; int penWidthHalf = penWidth/2; int radius = 20; int diameter = 2 * radius; public slots: QPixmap getPixmapHandle(QColor color, QColor colorSelected, degreeArrow degree ); QPixmap getButton( QColor color ); QPixmap getArrow(degreeArrow degree , QColor colorSelected); int getWithHalf(); private slots: protected: }; #endif vokoscreenNG-3.0.2/src/region/QvkRegionChoise.cpp000066400000000000000000001612271362045215000217440ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkRegionChoise.h" #include "QvkRegionButtonArrow.h" #include "global.h" #include #include #include #include #include #include #ifdef Q_OS_LINUX #include #endif QvkRegionChoise::QvkRegionChoise():handlePressed(NoHandle), handleUnderMouse(NoHandle), HandleColorBackground( Qt::lightGray ), HandleColorBackgroundSize( Qt::lightGray ), HandleColorByMousePressed( Qt::lightGray ), colorSelectedArrow( Qt::darkYellow ), framePenWidth(4), // framePenWidth must be an even number framePenHalf(framePenWidth/2), radius(20), diameter(radius*2), penWidth(2), penHalf(penWidth/2), frame_X(200-framePenHalf), frame_Y(200-framePenHalf), frame_Width(320 + framePenWidth), frame_height(200 + framePenWidth), frame_min_width(320 + framePenWidth), frame_min_height(200 + framePenWidth), frameColor(Qt::lightGray) { #ifdef Q_OS_LINUX if ( QX11Info::isPlatformX11() == true ) platform = x11; if ( QX11Info::isPlatformX11() == false ) platform = wayland; #endif setWindowTitle( QString( tr( "Area") ) ); QIcon icon; icon.addFile( QString::fromUtf8( ":/pictures/logo/logo.png" ), QSize(), QIcon::Normal, QIcon::Off ); setWindowIcon( icon ); // Hint: Qt::WindowStaysOnTopHint is only for X11 and Windows on WayLand not do it setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint ); setAttribute( Qt::WA_TranslucentBackground, true); setWindowState( Qt::WindowFullScreen ); setMouseTracking( true ); screen = QGuiApplication::primaryScreen(); resize( screen->size().width(), screen->size().height() ); screenWidth = screen->size().width(); screenHeight = screen->size().height(); hide(); } QvkRegionChoise::~QvkRegionChoise() { } void QvkRegionChoise::setHandleColorBackground( QColor color ) { HandleColorBackground = color; } void QvkRegionChoise::setHandleColorByMousePressed( QColor color ) { HandleColorByMousePressed = color; } void QvkRegionChoise::setHandleColorBackgroundSize( QColor color ) { HandleColorBackgroundSize = color; } /* * x, y is middle from blue frame */ void QvkRegionChoise::vk_setGeometry( int x, int y, int with, int height ) { frame_X = x; frame_Y = y; frame_Width = with; frame_height = height; update(); } void QvkRegionChoise::paintEvent( QPaintEvent *event ) { (void)event; QPixmap pixmap( screenWidth, screenHeight ); if ( recordemode == false ) { pixmap.fill( Qt::transparent ); QPainter painterPixmap; painterPixmap.begin( &pixmap ); painterPixmap.setRenderHints( QPainter::Antialiasing, true ); HandleTopLeft( painterPixmap ); HandleTopMiddle( painterPixmap ); HandleTopRight( painterPixmap ); HandleRightMiddle( painterPixmap ); HandleBottomRight( painterPixmap ); HandleBottomMiddle( painterPixmap ); HandleBottomLeft( painterPixmap ); HandleLeftMiddle( painterPixmap ); HandleMiddle( painterPixmap ); printSize( painterPixmap); drawFrame( painterPixmap ); switch ( handlePressed ) { case NoHandle : break; case TopLeft : HandleTopLeftSize( painterPixmap ); break; case TopMiddle : HandleTopMiddleSize( painterPixmap ); break; case TopRight : HandleTopRightSize( painterPixmap ); break; case RightMiddle : HandleRightMiddleSize( painterPixmap ); break; case BottomRight : HandleBottomRightSize( painterPixmap ); break; case BottomMiddle: HandleBottomMiddleSize( painterPixmap );break; case BottomLeft : HandleBottomLeftSize( painterPixmap ); break; case LeftMiddle : HandleLeftMiddleSize( painterPixmap); break; case Middle : HandleTopLeftSize( painterPixmap ); break; } painterPixmap.end(); } else { pixmap.fill( Qt::transparent ); QPainter painterPixmap; painterPixmap.begin( &pixmap ); painterPixmap.setRenderHints( QPainter::Antialiasing, true ); HandleRecord( painterPixmap, frame_X - radius + penHalf, frame_Y - radius + penHalf, 0 * 16, 270 * 16 ); HandleRecord( painterPixmap, frame_X + frame_Width/2 - radius + penHalf, frame_Y - radius + penHalf, 0 * 16, 180 * 16 ); HandleRecord( painterPixmap, frame_X + frame_Width - radius + penHalf, frame_Y - radius + penHalf, -90 * 16, 270 * 16 ); HandleRecord( painterPixmap, frame_X + frame_Width - radius + penHalf, frame_Y + frame_height/2 - radius + penHalf, -90 * 16, 180 * 16 ); HandleRecord( painterPixmap, frame_X + frame_Width - radius + penHalf, frame_Y + frame_height - radius + penHalf, -180 * 16, 270 * 16 ); HandleRecord( painterPixmap, frame_X + frame_Width/2 - radius + penHalf, frame_Y + frame_height - radius + penHalf, 0 * 16, -180 * 16 ); HandleRecord( painterPixmap, frame_X - radius + penHalf, frame_Y + frame_height - radius + penHalf, 0 * 16, -270 * 16 ); HandleRecord( painterPixmap, frame_X - radius + penHalf, frame_Y + frame_height/2 - radius + penHalf, -90 * 16, -180 * 16 ); drawFrame( painterPixmap ); // setMask(pixmap.mask()) is not working if enlarge the Area over the full screen. // Remedy: We draw a black pixel with a width=1 on the left top corner and setMask(pixmap.mask()) works. QPen pen; pen.setColor( Qt::black ); pen.setWidth( 1 ); painterPixmap.setPen( pen ); painterPixmap.drawPoint( 0, 0 ); } QPainter painter; painter.begin( this ); painter.drawPixmap( QPoint( 0, 0 ), pixmap ); painter.end(); setMask( pixmap.mask() ); } void QvkRegionChoise::mousePressEvent(QMouseEvent *event) { if( event->button() != Qt::LeftButton) { return; } switch ( handleUnderMouse ) { case NoHandle : handlePressed = NoHandle; break; case TopLeft : { handlePressed = TopLeft; handleKeyPressed = TopLeft; HandleSelected = TopLeft; break; } case TopMiddle : { handlePressed = TopMiddle; handleKeyPressed = TopMiddle; HandleSelected = TopMiddle; break; } case TopRight : { handlePressed = TopRight; handleKeyPressed = TopRight; HandleSelected = TopRight; break; } case RightMiddle : { handlePressed = RightMiddle; handleKeyPressed = RightMiddle; HandleSelected = RightMiddle; break; } case BottomRight : { handlePressed = BottomRight; handleKeyPressed = BottomRight; HandleSelected = BottomRight; break; } case BottomMiddle: { handlePressed = BottomMiddle; handleKeyPressed = BottomMiddle; HandleSelected = BottomMiddle; break; } case BottomLeft : { handlePressed = BottomLeft; handleKeyPressed = BottomLeft; HandleSelected = BottomLeft; break; } case LeftMiddle : { handlePressed = LeftMiddle; handleKeyPressed = LeftMiddle; HandleSelected = LeftMiddle; break; } case Middle : { handlePressed = Middle; handleKeyPressed = Middle; HandleSelected = Middle; break; } } mous_delta_X_to_blueline = event->x() - frame_X; mous_delta_Y_to_blueline = event->y() - frame_Y; old_Mouse_X = event->x(); old_Mouse_Y = event->y(); old_Frame_Width = frame_Width; old_Frame_Height = frame_height; old_Frame_X2 = frame_X + frame_Width; old_Frame_Y2 = frame_Y + frame_height; #ifdef Q_OS_WIN repaint(); update(); #endif #ifdef Q_OS_LINUX if ( platform == wayland ) { clearMask(); update(); } if ( platform == x11 ) { repaint(); update(); } #endif } void QvkRegionChoise::mouseReleaseEvent( QMouseEvent * event ) { if( event->button() != Qt::LeftButton) { return; } handlePressed = NoHandle; update(); } void QvkRegionChoise::leaveEvent(QEvent *event) { Q_UNUSED(event); unsetCursor(); } void QvkRegionChoise::keyPressEvent( QKeyEvent * event ) { if ( recordemode == true ) { return; } if ( handleKeyPressed == TopLeft ) { switch ( event->key() ) { case Qt::Key_Up : { frame_Y = frame_Y - 1; frame_height = frame_height + 1; if ( frame_Y < 0 - framePenHalf ) { frame_Y = frame_Y + 1; frame_height = frame_height - 1; } break; } case Qt::Key_Down : { frame_Y = frame_Y + 1; frame_height = frame_height - 1; if ( frame_height < frame_min_height ) { frame_Y = frame_Y - 1; frame_height = frame_height + 1; } break; } case Qt::Key_Left : { frame_X = frame_X - 1; frame_Width = frame_Width + 1; if ( frame_X < 0 - framePenHalf ) { frame_X = frame_X + 1; frame_Width = frame_Width - 1; } break; } case Qt::Key_Right : { frame_X = frame_X + 1; frame_Width = frame_Width - 1; if ( frame_Width < frame_min_width ) { frame_X = frame_X - 1; frame_Width = frame_Width + 1; } break; } } } if ( handleKeyPressed == TopMiddle ) { switch ( event->key() ) { case Qt::Key_Up : { frame_Y = frame_Y - 1; frame_height = frame_height + 1; if ( frame_Y < 0 - framePenHalf ) { frame_Y = frame_Y + 1; frame_height = frame_height - 1; } break; } case Qt::Key_Down : { frame_Y = frame_Y + 1; frame_height = frame_height - 1; if ( frame_height < frame_min_height ) { frame_Y = frame_Y - 1; frame_height = frame_height + 1; } break; } } } if ( handleKeyPressed == TopRight ) { switch ( event->key() ) { case Qt::Key_Up : { frame_Y = frame_Y - 1; frame_height = frame_height + 1; if ( frame_Y < 0 - framePenHalf ) { frame_Y = frame_Y + 1; frame_height = frame_height - 1; } break; } case Qt::Key_Down : { frame_Y = frame_Y + 1; frame_height = frame_height - 1; if ( frame_height < frame_min_height ) { frame_Y = frame_Y - 1; frame_height = frame_height + 1; } break; } case Qt::Key_Left : { frame_Width = frame_Width - 1; if ( frame_Width < frame_min_width ) { frame_Width = frame_Width + 1; } break; } case Qt::Key_Right :{ frame_Width = frame_Width + 1; if ( ( frame_X + frame_Width - framePenHalf ) > screenWidth ) { frame_Width = frame_Width - 1; } break; } } } if ( handleKeyPressed == RightMiddle ) { switch ( event->key() ) { case Qt::Key_Left : { frame_Width = frame_Width - 1; if ( frame_Width < frame_min_width ) { frame_Width = frame_Width + 1; } break; } case Qt::Key_Right :{ frame_Width = frame_Width + 1; if ( ( frame_X + frame_Width - framePenHalf ) > screenWidth ) { frame_Width = frame_Width - 1; } break; } } } if ( handleKeyPressed == BottomRight ) { switch ( event->key() ) { case Qt::Key_Up : { frame_height = frame_height - 1; if ( frame_height < frame_min_height ) { frame_height = frame_height + 1; } break; } case Qt::Key_Down : { frame_height = frame_height + 1; if ( frame_Y + frame_height - framePenHalf > screenHeight ) { frame_height = frame_height - 1; } break; } case Qt::Key_Left : { frame_Width = frame_Width - 1; if ( frame_Width < frame_min_width ) { frame_Width = frame_Width + 1; } break; } case Qt::Key_Right :{ frame_Width = frame_Width + 1; if ( frame_X + frame_Width - framePenHalf > screenWidth ) { frame_Width = frame_Width - 1; } break; } } } if ( handleKeyPressed == BottomMiddle ) { switch ( event->key() ) { case Qt::Key_Up : { frame_height = frame_height - 1; if ( frame_height < frame_min_height ) { frame_height = frame_height + 1; } break; } case Qt::Key_Down : { frame_height = frame_height + 1; if ( frame_Y + frame_height - framePenHalf > screenHeight ) { frame_height = frame_height - 1; } break; } } } if ( handleKeyPressed == BottomLeft ) { switch ( event->key() ) { case Qt::Key_Up : { frame_height = frame_height - 1; if ( frame_height < frame_min_height ) { frame_height = frame_height + 1; } break; } case Qt::Key_Down : { frame_height = frame_height + 1; if ( frame_Y + frame_height - framePenHalf > screenHeight ) { frame_height = frame_height - 1; } break; } case Qt::Key_Left : { frame_X = frame_X - 1; frame_Width = frame_Width + 1; if ( frame_X < 0 - framePenHalf ) { frame_X = frame_X + 1; frame_Width = frame_Width - 1; } break; } case Qt::Key_Right : { frame_X = frame_X + 1; frame_Width = frame_Width - 1; if ( frame_Width < frame_min_width ) { frame_X = frame_X - 1; frame_Width = frame_Width + 1; } break; } } } if ( handleKeyPressed == LeftMiddle ) { switch ( event->key() ) { case Qt::Key_Left : { frame_X = frame_X - 1; frame_Width = frame_Width + 1; if ( frame_X < 0 - framePenHalf ) { frame_X = frame_X + 1; frame_Width = frame_Width - 1; } break; } case Qt::Key_Right : { frame_X = frame_X + 1; frame_Width = frame_Width - 1; if ( frame_Width < frame_min_width ) { frame_X = frame_X - 1; frame_Width = frame_Width + 1; } break; } } } if ( handleKeyPressed == Middle ) { switch ( event->key() ) { case Qt::Key_Left : { frame_X = frame_X - 1; if ( frame_X + framePenHalf < 0 ) { frame_X = frame_X + 1; } break; } case Qt::Key_Right : { frame_X = frame_X + 1; if ( frame_X + frame_Width - framePenHalf > screenWidth ) { frame_X = frame_X - 1; } break; } case Qt::Key_Up : { frame_Y = frame_Y - 1; if ( frame_Y + framePenHalf < 0 ) { frame_Y = frame_Y + 1; } break; } case Qt::Key_Down : { frame_Y = frame_Y + 1; if ( frame_Y + frame_height - framePenHalf > screenHeight ) { frame_Y = frame_Y - 1; } break; } } } repaint(); update(); } void QvkRegionChoise::mouseMoveEvent( QMouseEvent *event ) { if ( recordemode == true ) return; switch ( handlePressed ) { case NoHandle : break; case TopLeft : { // Move frame_X = event->x() - mous_delta_X_to_blueline; frame_Y = event->y() - mous_delta_Y_to_blueline; frame_Width = old_Mouse_X - event->x() + old_Frame_Width; frame_height = old_Mouse_Y - event->y() + old_Frame_Height; // Limit min if ( frame_Width < frame_min_width ) { frame_X = old_Frame_X2 - frame_min_width; frame_Width = frame_min_width; } if ( frame_height < frame_min_height ) { frame_Y = old_Frame_Y2 - frame_min_height; frame_height = frame_min_height; } // Limit max if ( frame_Y <= 0 - framePenHalf ) { frame_Y = 0 - framePenHalf; frame_height = old_Frame_Y2 + framePenHalf; } if ( frame_X <= 0 - framePenHalf ) { frame_X = 0 - framePenHalf; frame_Width = old_Frame_X2 + framePenHalf; } break; } case TopMiddle : { // Move frame_Y = event->y() - mous_delta_Y_to_blueline; frame_height = old_Mouse_Y - event->y() + old_Frame_Height; // Limit min if ( frame_height < frame_min_height ) { frame_Y = old_Frame_Y2 - frame_min_height; frame_height = frame_min_height; } // Limit max if ( frame_Y <= 0 - framePenHalf ) { frame_Y = 0 - framePenHalf; frame_height = old_Frame_Y2 + framePenHalf; } break; } case TopRight : { // Move frame_Y = event->y() - mous_delta_Y_to_blueline; frame_Width = event->x() - old_Mouse_X + old_Frame_Width; frame_height = old_Mouse_Y - event->y() + old_Frame_Height;; // Limit min if ( frame_Width < frame_min_width ) { frame_Width = frame_min_width; } if ( frame_height < frame_min_height ) { frame_Y = old_Frame_Y2 - frame_min_height; frame_height = frame_min_height; } // Limit max if ( frame_Y <= 0 - framePenHalf ) { frame_Y = 0 - framePenHalf; frame_height = old_Frame_Y2 + framePenHalf; } if( ( frame_X + frame_Width - framePenHalf ) > screenWidth ) { frame_Width = screenWidth + framePenHalf - frame_X; } break; } case RightMiddle : { // Move frame_Width = event->x() - old_Mouse_X + old_Frame_Width; // Limit min if ( frame_Width < frame_min_width ) { frame_Width = frame_min_width; } // Limit max if( ( frame_X + frame_Width - framePenHalf ) > screenWidth ) { frame_Width = screenWidth + framePenHalf - frame_X; } break; } case BottomRight : { // Move frame_Width = event->x() - old_Mouse_X + old_Frame_Width; frame_height = event->y() - old_Mouse_Y + old_Frame_Height; // Limit min if ( frame_Width < frame_min_width ) { frame_Width = frame_min_width; } if ( frame_height < frame_min_height ) { frame_height = frame_min_height; } //Limit max if( ( frame_X + frame_Width - framePenHalf ) > screenWidth ) { frame_Width = screenWidth + framePenHalf - frame_X; } if( ( frame_Y + frame_height - framePenHalf ) > screenHeight ) { frame_height = screenHeight + framePenHalf - frame_Y; } break; } case BottomMiddle: { // Move frame_height = event->y() - old_Mouse_Y + old_Frame_Height; // Limit min if ( frame_height < frame_min_height ) { frame_height = frame_min_height; } //Limit max if( ( frame_Y + frame_height - framePenHalf ) > screenHeight ) { frame_height = screenHeight + framePenHalf - frame_Y; } break; } case BottomLeft : { // Move frame_X = event->x() - mous_delta_X_to_blueline; frame_height = event->y() - old_Mouse_Y + old_Frame_Height; frame_Width = old_Mouse_X - event->x() + old_Frame_Width; // Limit min if ( frame_Width < frame_min_width ) { frame_X = old_Frame_X2 - frame_min_width; frame_Width = frame_min_width; } if ( frame_height < frame_min_height ) { frame_height = frame_min_height; } // Limit max if ( frame_X <= 0 - framePenHalf ) { frame_X = 0 - framePenHalf; frame_Width = old_Frame_X2 + framePenHalf; } if( ( frame_Y + frame_height - framePenHalf ) > screenHeight ) { frame_height = screenHeight + framePenHalf - frame_Y; } break; } case LeftMiddle : { // Move frame_X = event->x() - mous_delta_X_to_blueline; frame_Width = old_Mouse_X - event->x() + old_Frame_Width; // Limit min if ( frame_Width < frame_min_width ) { frame_X = old_Frame_X2 - frame_min_width; frame_Width = frame_min_width; } // Limit max if ( frame_X <= 0 - framePenHalf ) { frame_X = 0 - framePenHalf; frame_Width = old_Frame_X2 + framePenHalf; } break; } case Middle : { // Move int deltaX = ( old_Frame_X2 - framePenHalf - frame_Width/2 ) - old_Mouse_X; int deltaY = ( old_Frame_Y2 - framePenHalf - frame_height/2 ) - old_Mouse_Y; frame_X = event->x() - frame_Width/2 + framePenHalf + deltaX; frame_Y = event->y() - frame_height/2 + framePenHalf + deltaY; // Limit Top if ( frame_Y <= 0 - framePenHalf ) { frame_Y = 0 - framePenHalf; } // Limit Left if ( frame_X <= 0 - framePenHalf ) { frame_X = 0 - framePenHalf; } // Limit Right if( ( frame_X + frame_Width - framePenHalf ) > screenWidth ) { frame_X = screenWidth - frame_Width + framePenHalf; } // Limit Bottom if( ( frame_Y + frame_height - framePenHalf ) > screenHeight ) { frame_Y = screenHeight - frame_height + framePenHalf; } break; } } // end switch #ifdef Q_OS_LINUX if ( handlePressed != NoHandle ) { if ( platform == wayland ) { clearMask(); update(); } if ( platform == x11 ) { if ( QX11Info::isCompositingManagerRunning() == true ) { repaint(); update(); } else { repaint(); update(); } } } #endif #ifdef Q_OS_WIN repaint(); update(); #endif if ( handlePressed != NoHandle ) return; QRect regionTopLeft( frame_X - radius - 1, frame_Y - radius - 1, diameter + 2, diameter + 2 ); if ( regionTopLeft.contains( event->pos() ) ) { setCursor( Qt::SizeFDiagCursor ); handleUnderMouse = TopLeft; return; } QRect regionTopMiddle( frame_X + frame_Width/2 - radius - 1, frame_Y - radius - 1, diameter + 2, diameter + 2 ); if ( regionTopMiddle.contains( event->pos() ) ) { setCursor( Qt::SizeVerCursor ); handleUnderMouse = TopMiddle; return; } QRect regionTopRight( frame_X + frame_Width - radius - 1, frame_Y - radius - 1, diameter + 2, diameter + 2 ); if ( regionTopRight.contains( event->pos() ) ) { setCursor( Qt::SizeBDiagCursor ); handleUnderMouse = TopRight; return; } QRect regionRightMiddle( frame_X + frame_Width - radius - 1, frame_Y + frame_height/2 - radius - 1, diameter + 2, diameter + 2 ); if ( regionRightMiddle.contains( event->pos() ) ) { handleUnderMouse = RightMiddle; setCursor( Qt::SizeHorCursor ); return; } QRect regionMiddle( frame_X + frame_Width/2 - radius - penHalf, frame_Y + frame_height/2 - radius - penHalf, 2 * radius + penWidth, 2 * radius + penWidth); if ( regionMiddle.contains( event->pos() ) ) { setCursor( Qt::SizeAllCursor ); handleUnderMouse = Middle; return; } QvkRegionButtonArrow buttonArrow; QRect regionBottomRight( frame_X + frame_Width - buttonArrow.getWithHalf(), frame_Y + frame_height - buttonArrow.getWithHalf(), buttonArrow.getWithHalf()*2, buttonArrow.getWithHalf()*2 ); if( regionBottomRight.contains( event->pos()) ) { setCursor( Qt::SizeFDiagCursor); handleUnderMouse = BottomRight; return; } QRect regionBottomMiddle( frame_X + frame_Width/2 - buttonArrow.getWithHalf(), frame_Y + frame_height - buttonArrow.getWithHalf(), buttonArrow.getWithHalf()*2, buttonArrow.getWithHalf()*2 ); if( regionBottomMiddle.contains( event->pos()) ) { setCursor( Qt::SizeVerCursor ); handleUnderMouse = BottomMiddle; return; } QRect regionBottomLeft( frame_X - buttonArrow.getWithHalf(), frame_Y + frame_height - buttonArrow.getWithHalf(), buttonArrow.getWithHalf()*2, buttonArrow.getWithHalf()*2 ); if( regionBottomLeft.contains( event->pos()) ) { setCursor( Qt::SizeBDiagCursor ); handleUnderMouse = BottomLeft; return; } QRect regionLeftMiddle( frame_X - buttonArrow.getWithHalf(), frame_Y + frame_height/2 - buttonArrow.getWithHalf(), buttonArrow.getWithHalf()*2, buttonArrow.getWithHalf()*2 ); if( regionLeftMiddle.contains( event->pos()) ) { setCursor( Qt::SizeHorCursor ); handleUnderMouse = LeftMiddle; return; } unsetCursor(); handleUnderMouse = NoHandle; } void QvkRegionChoise::printSize( QPainter &painter ) { QString widthHeigtSize = QString::number( static_cast( getWidth()/screen->devicePixelRatio() ) ) + " x " + QString::number( static_cast( getHeight()/screen->devicePixelRatio() ) ); QFont font; font.setPointSize( 14 ); painter.setFont( font ); QFontMetrics fontMetrics( font ); pixelWidth = fontMetrics.width( widthHeigtSize ); pixelHeight = fontMetrics.height(); QRect rect( frame_X + frame_Width/2 - pixelWidth/2 - 5, frame_Y + frame_height/2 - pixelHeight/2 - 50, pixelWidth + 10, pixelHeight ); painter.setBrush( QBrush( Qt::lightGray, Qt::SolidPattern ) ); painter.setPen( QPen( Qt::black, 2 ) ); painter.drawRoundedRect( rect, 7, 7 ); painter.drawText( rect, Qt::AlignCenter, widthHeigtSize ); } void QvkRegionChoise::drawFrame(QPainter &painter) { QPen pen( getFrameColor(), framePenWidth ); pen.setJoinStyle( Qt::MiterJoin ); painter.setPen( pen ); QBrush brush( Qt::transparent, Qt::SolidPattern); painter.setBrush( brush ); painter.drawRect( frame_X, frame_Y, frame_Width, frame_height); } void QvkRegionChoise::setFrameColor( Qt::GlobalColor color ) { frameColor = color; } Qt::GlobalColor QvkRegionChoise::getFrameColor() { return frameColor; } void QvkRegionChoise::HandleRecord( QPainter &painter, int x, int y, int startAngle, int spanAngle ) { QBrush brush; brush.setColor( Qt::darkGray ); brush.setStyle( Qt::SolidPattern ); painter.setBrush( brush ); QPen pen; pen.setColor( Qt::black ); pen.setWidth( penWidth ); painter.setPen( pen ); QRectF rectangle = QRectF( x, y, diameter, diameter); painter.drawPie( rectangle, startAngle, spanAngle ); } void QvkRegionChoise::HandleTopLeft( QPainter &painter ) { QvkRegionButtonArrow buttonArrow; QColor color; if ( handlePressed == TopLeft ) { color = HandleColorByMousePressed; } else { color = HandleColorBackground; } QColor colorSelected; if ( HandleSelected == TopLeft ) { colorSelected = colorSelectedArrow; } else { colorSelected = Qt::black; } painter.drawPixmap( frame_X - radius, frame_Y - radius, buttonArrow.getPixmapHandle( color, colorSelected, buttonArrow.topLeft ) ); } void QvkRegionChoise::HandleTopLeftSize( QPainter &painter) { QFont font; font.setPointSize( 10 ); painter.setFont( font ); QString string; string.append( " " ); string.append( "x:" + QString::number( frame_X ) ); string.append( " "); QFontMetrics fontMetrics( font ); pixelWidth = fontMetrics.width( string ); pixelHeight = fontMetrics.height() * 2; QRect rect( frame_X + radius, frame_Y + radius, pixelWidth, pixelHeight ); painter.setBrush( QBrush( HandleColorBackgroundSize, Qt::SolidPattern ) ); painter.setPen( QPen( Qt::black, 2 ) ); painter.drawRoundedRect( rect, 5, 5 ); painter.drawText( rect, Qt::AlignCenter, "x:" + QString::number( frame_X + framePenHalf + 1 ) + "\n" + "y:" + QString::number( frame_Y + framePenHalf + 1 ) ); } void QvkRegionChoise::HandleTopMiddle( QPainter &painter) { QvkRegionButtonArrow buttonArrow; QColor color; if ( handlePressed == TopMiddle ) { color = HandleColorByMousePressed; } else { color = HandleColorBackground; } QColor colorSelected; if ( HandleSelected == TopMiddle ) { colorSelected = colorSelectedArrow; } else { colorSelected = Qt::black; } painter.drawPixmap( frame_X + frame_Width/2 - buttonArrow.getWithHalf(), frame_Y - buttonArrow.getWithHalf(), buttonArrow.getPixmapHandle( color, colorSelected, buttonArrow.topMiddle ) ); } void QvkRegionChoise::HandleTopMiddleSize( QPainter &painter ) { QFont font; font.setPointSize( 10 ); painter.setFont( font ); QFontMetrics fontMetrics( font ); QString string; string.append( " " ); string.append( "y:" + QString::number( frame_Y ) ); string.append( " " ); pixelWidth = fontMetrics.width( string); pixelHeight = fontMetrics.height(); QRect rect( frame_X + frame_Width/2 - pixelWidth/2, frame_Y + radius + 5, pixelWidth, pixelHeight ); painter.setBrush( QBrush( HandleColorBackgroundSize, Qt::SolidPattern ) ); painter.setPen( QPen( Qt::black, 2 ) ); painter.drawRoundedRect( rect, 5, 5 ); painter.drawText( rect, Qt::AlignCenter, "y:" + QString::number( frame_Y + framePenHalf + 1 ) ); } void QvkRegionChoise::HandleTopRight(QPainter &painter) { QvkRegionButtonArrow buttonArrow; QColor color; if ( handlePressed == TopRight ) { color = HandleColorByMousePressed; } else { color = HandleColorBackground; } QColor colorSelected; if ( HandleSelected == TopRight ) { colorSelected = colorSelectedArrow; } else { colorSelected = Qt::black; } painter.drawPixmap( frame_X + frame_Width - buttonArrow.getWithHalf(), frame_Y - buttonArrow.getWithHalf(), buttonArrow.getPixmapHandle( color, colorSelected, buttonArrow.topRight ) ); } void QvkRegionChoise::HandleTopRightSize( QPainter &painter ) { QFont font; font.setPointSize( 10 ); painter.setFont( font ); QString string; string.append( " " ); string.append( "x:" + QString::number( frame_X + frame_Width - framePenHalf ) ); string.append( " "); QFontMetrics fontMetrics( font ); pixelWidth = fontMetrics.width( string ); pixelHeight = fontMetrics.height() * 2; QRect rect( frame_X + frame_Width - pixelWidth - radius, frame_Y + radius, pixelWidth, pixelHeight ); painter.setBrush( QBrush( HandleColorBackgroundSize, Qt::SolidPattern ) ); painter.setPen( QPen( Qt::black, 2 ) ); painter.drawRoundedRect( rect, 5, 5 ); painter.drawText( rect, Qt::AlignCenter, "x:" + QString::number( frame_X + frame_Width - framePenHalf ) + "\n" + "y:" + QString::number( frame_Y + framePenHalf + 1 ) ); } void QvkRegionChoise::HandleRightMiddle( QPainter &painter ) { QvkRegionButtonArrow buttonArrow; QColor color; if ( handlePressed == RightMiddle ) { color = HandleColorByMousePressed; } else { color = HandleColorBackground; } QColor colorSelected; if ( HandleSelected == RightMiddle ) { colorSelected = colorSelectedArrow; } else { colorSelected = Qt::black; } painter.drawPixmap( frame_X + frame_Width - buttonArrow.getWithHalf(), frame_Y + frame_height/2 - buttonArrow.getWithHalf(), buttonArrow.getPixmapHandle( color, colorSelected, buttonArrow.rightMiddle ) ); } void QvkRegionChoise::HandleRightMiddleSize( QPainter &painter ) { QFont font; font.setPointSize( 10 ); painter.setFont( font ); QString string; string.append( " " ); string.append( "x:" + QString::number( frame_X + frame_Width - framePenHalf ) ); string.append( " "); QFontMetrics fontMetrics( font ); pixelWidth = fontMetrics.width( string ); pixelHeight = fontMetrics.height(); QRect rect( frame_X + frame_Width - pixelWidth - radius - 5, frame_Y + frame_height/2 - pixelHeight/2, pixelWidth, pixelHeight ); painter.setBrush( QBrush( HandleColorBackgroundSize, Qt::SolidPattern ) ); painter.setPen( QPen( Qt::black, 2 ) ); painter.drawRoundedRect( rect, 5, 5 ); painter.drawText( rect, Qt::AlignCenter, "x:" + QString::number( frame_X + frame_Width - framePenHalf) ); } void QvkRegionChoise::HandleBottomRight( QPainter &painter ) { QvkRegionButtonArrow buttonArrow; QColor color; if ( handlePressed == BottomRight ) { color = HandleColorByMousePressed; } else { color = HandleColorBackground; } QColor colorSelected; if ( HandleSelected == BottomRight ) { colorSelected = colorSelectedArrow; } else { colorSelected = Qt::black; } painter.drawPixmap( frame_X + frame_Width - buttonArrow.getWithHalf(), frame_Y + frame_height - buttonArrow.getWithHalf(), buttonArrow.getPixmapHandle( color, colorSelected, buttonArrow.bottomRight ) ); } void QvkRegionChoise::HandleBottomRightSize( QPainter &painter ) { QvkRegionButtonArrow buttonArrow; QFont font; font.setPointSize( 10 ); painter.setFont( font ); QString string; string.append( " " ); string.append( "x:" + QString::number( frame_X + frame_Width - framePenHalf) ); string.append( " "); QFontMetrics fontMetrics( font ); pixelWidth = fontMetrics.width( string ); pixelHeight = fontMetrics.height() * 2; QRect rect( frame_X + frame_Width - pixelWidth - radius, frame_Y + frame_height - pixelHeight - radius, pixelWidth, pixelHeight ); painter.setBrush( QBrush( HandleColorBackgroundSize, Qt::SolidPattern ) ); painter.setPen( QPen( Qt::black, 2 ) ); painter.drawRoundedRect( rect, 5, 5 ); painter.drawText( rect, Qt::AlignCenter, "x:" + QString::number( frame_X + frame_Width - framePenHalf ) + "\n" + "y:" + QString::number( frame_Y + frame_height - framePenHalf ) ); } void QvkRegionChoise::HandleBottomMiddle( QPainter &painter ) { QvkRegionButtonArrow buttonArrow; QColor color; if ( handlePressed == BottomMiddle ) { color = HandleColorByMousePressed; } else { color = HandleColorBackground; } QColor colorSelected; if ( HandleSelected == BottomMiddle ) { colorSelected = colorSelectedArrow; } else { colorSelected = Qt::black; } painter.drawPixmap( frame_X + frame_Width/2 - buttonArrow.getWithHalf(), frame_Y + frame_height - buttonArrow.getWithHalf(), buttonArrow.getPixmapHandle( color, colorSelected, buttonArrow.bottomMiddel ) ); } void QvkRegionChoise::HandleBottomMiddleSize(QPainter &painter ) { QFont font; font.setPointSize( 10 ); painter.setFont( font ); QFontMetrics fontMetrics( font ); QString string; string.append( " " ); string.append( "y:" + QString::number( frame_Y ) ); string.append( " " ); pixelWidth = fontMetrics.width( string); pixelHeight = fontMetrics.height(); QRect rect( frame_X + frame_Width/2 - pixelWidth/2, frame_Y + frame_height - pixelHeight - radius - 5, pixelWidth, pixelHeight ); painter.setBrush( QBrush( HandleColorBackgroundSize, Qt::SolidPattern ) ); painter.setPen( QPen( Qt::black, 2 ) ); painter.drawRoundedRect( rect, 5, 5 ); painter.drawText( rect, Qt::AlignCenter, "y:" + QString::number( frame_Y + frame_height - framePenHalf ) ); } void QvkRegionChoise::HandleBottomLeft( QPainter &painter ) { QvkRegionButtonArrow buttonArrow; QColor color; if ( handlePressed == BottomLeft ) { color = HandleColorByMousePressed; } else { color = HandleColorBackground; } QColor colorSelected; if ( HandleSelected == BottomLeft ) { colorSelected = colorSelectedArrow; } else { colorSelected = Qt::black; } painter.drawPixmap( frame_X - buttonArrow.getWithHalf(), frame_Y + frame_height - buttonArrow.getWithHalf(), buttonArrow.getPixmapHandle( color, colorSelected, buttonArrow.bottomLeft ) ); } void QvkRegionChoise::HandleBottomLeftSize( QPainter &painter ) { QFont font; font.setPointSize( 10 ); painter.setFont( font ); QString string; string.append( " " ); string.append( "x:" + QString::number( frame_X ) ); string.append( " "); QFontMetrics fontMetrics( font ); pixelWidth = fontMetrics.width( string ); pixelHeight = fontMetrics.height() * 2; QRect rect( frame_X + radius, frame_Y + frame_height - pixelHeight - radius - 5, pixelWidth, pixelHeight ); painter.setBrush( QBrush( HandleColorBackgroundSize, Qt::SolidPattern ) ); painter.setPen( QPen( Qt::black, 2 ) ); painter.drawRoundedRect( rect, 5, 5 ); painter.drawText( rect, Qt::AlignCenter, "x:" + QString::number( frame_X + framePenHalf + 1 ) + "\n" + "y:" + QString::number( frame_Y + frame_height - framePenHalf ) ); } void QvkRegionChoise::HandleLeftMiddle( QPainter &painter ) { QvkRegionButtonArrow buttonArrow; QColor color; if ( handlePressed == LeftMiddle ) { color = HandleColorByMousePressed; } else { color = HandleColorBackground; } QColor colorSelected; if ( HandleSelected == LeftMiddle ) { colorSelected = colorSelectedArrow; } else { colorSelected = Qt::black; } painter.drawPixmap( frame_X - buttonArrow.getWithHalf(), frame_Y + frame_height/2 - buttonArrow.getWithHalf(), buttonArrow.getPixmapHandle( color, colorSelected, buttonArrow.leftMiddel ) ); } void QvkRegionChoise::HandleLeftMiddleSize( QPainter &painter ) { QFont font; font.setPointSize( 10 ); painter.setFont( font ); QString string; string.append( " " ); string.append( "x:" + QString::number( frame_X ) ); string.append( " "); QFontMetrics fontMetrics( font ); pixelWidth = fontMetrics.width( string ); pixelHeight = fontMetrics.height(); QRect rect( frame_X + radius + 5, frame_Y + frame_height/2 - pixelHeight/2, pixelWidth, pixelHeight ); painter.setBrush( QBrush( HandleColorBackgroundSize, Qt::SolidPattern ) ); painter.setPen( QPen( Qt::black, 2 ) ); painter.drawRoundedRect( rect, 5, 5 ); painter.drawText( rect, Qt::AlignCenter, "x:" + QString::number( frame_X + framePenHalf + 1 ) ); } void QvkRegionChoise::HandleMiddle( QPainter &painter ) { QvkRegionButtonArrow buttonArrow; QColor color; if ( handlePressed == Middle ) { color = HandleColorByMousePressed; } else { color = HandleColorBackground; } QColor colorSelected; if ( HandleSelected == Middle ) { colorSelected = colorSelectedArrow; } else { colorSelected = Qt::black; } painter.drawPixmap( frame_X + frame_Width/2 - buttonArrow.getWithHalf(), frame_Y + frame_height/2 - buttonArrow.getWithHalf(), buttonArrow.getButton( color) ); painter.drawPixmap( frame_X + frame_Width/2 - buttonArrow.getWithHalf(), frame_Y + frame_height/2 - buttonArrow.getWithHalf(), buttonArrow.getArrow( buttonArrow.degreeArrow::topMiddle, colorSelected ) ); painter.drawPixmap( frame_X + frame_Width/2 - buttonArrow.getWithHalf(), frame_Y + frame_height/2 - buttonArrow.getWithHalf(), buttonArrow.getArrow( buttonArrow.degreeArrow::rightMiddle, colorSelected ) ); painter.drawPixmap( frame_X + frame_Width/2 - buttonArrow.getWithHalf(), frame_Y + frame_height/2 - buttonArrow.getWithHalf(), buttonArrow.getArrow( buttonArrow.degreeArrow::bottomMiddel, colorSelected ) ); painter.drawPixmap( frame_X + frame_Width/2 - buttonArrow.getWithHalf(), frame_Y + frame_height/2 - buttonArrow.getWithHalf(), buttonArrow.getArrow( buttonArrow.degreeArrow::leftMiddel, colorSelected ) ); } void QvkRegionChoise::recordMode( bool value ) { if ( value == true ) { recordemode = true; repaint(); update(); } else { recordemode = false; repaint(); update(); } } /** * Return x from window */ int QvkRegionChoise::getX() { return frame_X; } /** * Return y from window */ int QvkRegionChoise::getY() { return frame_Y; } /** * Return x from record area */ qreal QvkRegionChoise::getXRecordArea() { qreal xReal = ( frame_X + framePenWidth/2 ) * screen->devicePixelRatio(); int xInt = static_cast( ( frame_X + framePenWidth/2 ) * screen->devicePixelRatio() ); if ( xReal > xInt ) { xReal = xInt + 1; } return xReal; } /** * Return y from record area */ qreal QvkRegionChoise::getYRecordArea() { qreal xReal = ( frame_Y + framePenWidth/2 ) * screen->devicePixelRatio(); int xInt = static_cast( ( frame_Y + framePenWidth/2 ) * screen->devicePixelRatio() ); if ( xReal > xInt ) { xReal = xInt + 1; } return xReal; } /** * Return height from record area */ qreal QvkRegionChoise::getHeight() { qreal xReal = ( ( frame_Y + framePenWidth/2 ) + ( frame_height - framePenWidth ) ) * screen->devicePixelRatio(); int xInt = static_cast( ( ( frame_Y + framePenWidth/2 ) + ( frame_height - framePenWidth ) ) * screen->devicePixelRatio() ); if ( xReal > xInt ) { xReal = static_cast( ( frame_height - framePenWidth ) * screen->devicePixelRatio() ) - 1; } else { xReal = static_cast( ( frame_height - framePenWidth ) * screen->devicePixelRatio() ); } #ifdef Q_OS_WIN if ( ( xReal + getYRecordArea() ) == screen->size().height() ) { xReal-=2; } #endif return xReal; } /** * Return width from record Area */ qreal QvkRegionChoise::getWidth() { qreal xReal = ( ( frame_X + framePenWidth/2 ) + ( frame_Width - framePenWidth ) ) * screen->devicePixelRatio(); int xInt = static_cast( ( ( frame_X + framePenWidth/2 ) + ( frame_Width - framePenWidth ) ) * screen->devicePixelRatio() ); if ( xReal > xInt ) { xReal = static_cast( ( frame_Width - framePenWidth ) * screen->devicePixelRatio() ) - 1; } else { xReal = static_cast( ( frame_Width - framePenWidth ) * screen->devicePixelRatio() ); } #ifdef Q_OS_WIN if ( ( xReal + getXRecordArea() ) == screen->size().width() ) { xReal-=2; } #endif return xReal; } void QvkRegionChoise::slot_areaReset() { frame_X = 200 - framePenHalf; frame_Y = 200 - framePenHalf; frame_Width = frame_min_width; frame_height = frame_min_height; repaint(); update(); } void QvkRegionChoise::setX( int x ) { frame_X = x - framePenHalf; repaint(); update(); } void QvkRegionChoise::setY( int y ) { frame_Y = y - framePenHalf; repaint(); update(); } void QvkRegionChoise::setWidth( int width ) { frame_Width = width + framePenWidth; repaint(); update(); } void QvkRegionChoise::setHeight( int height ) { frame_height = height + framePenWidth; repaint(); update(); } vokoscreenNG-3.0.2/src/region/QvkRegionChoise.h000066400000000000000000000076231362045215000214100ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef REGIONCHOISE_H #define REGIONCHOISE_H #include "QvkRegionButtonArrow.h" #include #include class QvkRegionChoise : public QWidget { Q_OBJECT public: QvkRegionChoise(); virtual ~QvkRegionChoise(); int getX(); int getY(); qreal getHeight(); qreal getWidth(); qreal getXRecordArea(); qreal getYRecordArea(); void recordMode(bool value); void setX( int x ); void setY( int y ); void setWidth( int width ); void setHeight( int height ); void setFrameColor( Qt::GlobalColor color ); QScreen *screen; int screenWidth = 400; //Must set a value. Under windows comes a QPainter message int screenHeight = 400; public slots: void slot_areaReset(); private slots: protected: void paintEvent( QPaintEvent *event ); void mouseMoveEvent( QMouseEvent *event ); void mousePressEvent( QMouseEvent *event ); void mouseReleaseEvent( QMouseEvent * event ); void leaveEvent( QEvent *event ); void keyPressEvent( QKeyEvent * event ); private: enum Handle { NoHandle, TopLeft, TopMiddle, TopRight, RightMiddle, BottomRight, BottomMiddle, BottomLeft, LeftMiddle, Middle }; Handle handlePressed; Handle handleUnderMouse; Handle handleKeyPressed; Handle HandleSelected; QColor HandleColorBackground; QColor HandleColorBackgroundSize; QColor HandleColorByMousePressed; QColor colorSelectedArrow; void setHandleColorBackground( QColor color ); void setHandleColorByMousePressed( QColor color ); void setHandleColorBackgroundSize( QColor color ); int mous_delta_X_to_blueline; int mous_delta_Y_to_blueline; int old_Mouse_X; int old_Mouse_Y; int old_Frame_Width; int old_Frame_Height; int old_Frame_X2; int old_Frame_Y2; int framePenWidth; int framePenHalf; int radius; int diameter; int penWidth; int penHalf; int frame_X; int frame_Y; int frame_Width; int frame_height; int frame_min_width; int frame_min_height; int pixelWidth; int pixelHeight; void drawFrame( QPainter &painter ); void printSize(QPainter &painter); void HandleRecord( QPainter &painter, int x, int y, int startAngle, int spanAngle ); void HandleTopLeft(QPainter &painter ); void HandleTopLeftSize(QPainter &painter); void HandleTopMiddle(QPainter &painter); void HandleTopMiddleSize(QPainter &painter); void HandleTopRight( QPainter &painter ); void HandleTopRightSize(QPainter &painter); void HandleRightMiddle(QPainter &painter); void HandleRightMiddleSize(QPainter &painter); void HandleBottomRight(QPainter &painter); void HandleBottomRightSize(QPainter &painter); void HandleBottomMiddle(QPainter &painter); void HandleBottomMiddleSize( QPainter &painter ); void HandleBottomLeft(QPainter &painter); void HandleBottomLeftSize( QPainter &painter ); void HandleLeftMiddle(QPainter &painter); void HandleLeftMiddleSize( QPainter &painter ); void HandleMiddle(QPainter &painter); void vk_setGeometry( int x, int y, int with, int height ); enum vk_platform { x11, wayland, windows }; vk_platform platform; bool recordemode = false; Qt::GlobalColor getFrameColor(); Qt::GlobalColor frameColor; }; #endif vokoscreenNG-3.0.2/src/region/regionselection.pri000066400000000000000000000003561362045215000221000ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkRegionChoise.h \ $$PWD/QvkRegionButtonArrow.h SOURCES += $$PWD/QvkRegionChoise.cpp \ $$PWD/QvkRegionButtonArrow.cpp vokoscreenNG-3.0.2/src/screenManager/000077500000000000000000000000001362045215000174565ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/screenManager/QvkScreenManager.cpp000066400000000000000000000101211362045215000233510ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkScreenManager.h" #include "global.h" #include #include #include #include QvkScreenManager::QvkScreenManager() { connect( qApp, SIGNAL( screenAdded( QScreen* ) ), this, SLOT( slot_screen_count_changed() ) ); connect( qApp, SIGNAL( screenRemoved( QScreen* ) ), this, SLOT( slot_screen_count_changed() ) ); connect( qApp, SIGNAL( primaryScreenChanged( QScreen* ) ), this, SLOT( slot_screen_count_changed() ) ); } QvkScreenManager::~QvkScreenManager() {} void QvkScreenManager::slot_screen_count_changed() { QList screen = QGuiApplication::screens(); if ( screen.empty() == false ) { emit signal_clear_widget(); for ( int i = 0; i < screen.size(); i++ ) { qDebug().noquote() << global::nameOutput << "Name from screen: " << screen.at(i)->name(); qDebug().noquote() << global::nameOutput << "Screen available desktop width :" << QString::number( screen.at(i)->geometry().width() * screen.at(i)->devicePixelRatio() ); qDebug().noquote() << global::nameOutput << "Screen available desktop height:" << QString::number( screen.at(i)->geometry().height() * screen.at(i)->devicePixelRatio() ); qDebug().noquote() << global::nameOutput << "DevicePixelRatio:" << screen.at(i)->devicePixelRatio() << " (Normal displays is 1, Retina display is 2)"; qDebug().noquote() << global::nameOutput << "Vertical refresh rate of the screen in Hz:" << screen.at(i)->refreshRate(); qDebug().noquote() << global::nameOutput << "Screen orientation" << screen.at(i)->orientation(); qDebug().noquote() << global::nameOutput << "Color depth of the screen: " << screen.at(i)->depth(); qDebug().noquote() << global::nameOutput << "Model from screen: " << screen.at(i)->model(); qDebug().noquote() << global::nameOutput << "Manufactur from screen: " << screen.at(i)->manufacturer(); qDebug().noquote() << global::nameOutput << "SerialNumber from screen: " << screen.at(i)->serialNumber(); QString X = QString::number( static_cast( screen.at(i)->geometry().left() * screen.at(i)->devicePixelRatio() ) ); QString Y = QString::number( static_cast( screen.at(i)->geometry().top() * screen.at(i)->devicePixelRatio() ) ); QString Width = QString::number( static_cast( screen.at(i)->geometry().width() * screen.at(i)->devicePixelRatio() ) ); QString Height = QString::number( static_cast( screen.at(i)->geometry().height() * screen.at(i)->devicePixelRatio() ) ); QString stringText = screen.at(i)->name() + " " + ": " + Width + " x " + Height; QString stringData = "x=" + X + " " + "y=" + Y + " " + "with=" + Width + " " + "height=" + Height; disconnect( screen.at(i), nullptr, nullptr, nullptr ); connect( screen.at(i), SIGNAL( geometryChanged( const QRect ) ), this, SLOT( slot_geometryChanged( const QRect ) ) ); emit signal_screen_count_changed( stringText, stringData ); } } } void QvkScreenManager::slot_geometryChanged( const QRect &rect ) { Q_UNUSED(rect); slot_screen_count_changed(); } vokoscreenNG-3.0.2/src/screenManager/QvkScreenManager.h000066400000000000000000000024201362045215000230210ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKSCREENMANAGER_H #define QVKSCREENMANAGER_H #include class QvkScreenManager : public QObject { Q_OBJECT public: QvkScreenManager(); virtual ~QvkScreenManager(); public slots: private slots: void slot_screen_count_changed(); void slot_geometryChanged(const QRect &rect); signals: void signal_clear_widget(); void signal_screen_count_changed( QString stringText, QString stringData ); protected: private: }; #endif vokoscreenNG-3.0.2/src/screenManager/screenManager.pri000066400000000000000000000001761362045215000227500ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkScreenManager.h SOURCES += $$PWD/QvkScreenManager.cpp vokoscreenNG-3.0.2/src/screencast.qrc000066400000000000000000000050401362045215000175440ustar00rootroot00000000000000 pictures/camera/camera.png pictures/linux.png pictures/log/log.png pictures/logo/logo.png pictures/player/move.png pictures/player/player.png pictures/player/fullscreen.png pictures/player/restore.png pictures/screencast/supported-formats.png pictures/screencast/preferences-system.png pictures/screencast/format-codec.png pictures/screencast/microphone.png pictures/screencast/monitor.png pictures/screencast/timer.png pictures/screencast/strip.png pictures/screencast/help-about.png pictures/screencast/undo.png pictures/screencast/author.png pictures/space.png pictures/systray/systray.png pictures/systray/record.png pictures/windows.png pictures/camera/camera.license pictures/linux.license pictures/log/log.license pictures/logo/logo.license pictures/player/move.license pictures/player/fullscreen.license pictures/player/restore.license pictures/player/player.license pictures/screencast/monitor.license pictures/screencast/preferences-system.license pictures/screencast/format-codec.license pictures/screencast/microphone.license pictures/screencast/undo.license pictures/screencast/supported-formats.license pictures/screencast/timer.license pictures/screencast/strip.license pictures/screencast/help-about.license pictures/systray/systray.license pictures/systray/record.license pictures/template.license pictures/windows.license language/ca.qm language/cs_CZ.qm language/de_AT.qm language/de_CH.qm language/de_DE.qm language/es.qm language/fi_FI.qm language/fr_FR.qm language/hu.qm language/id.qm language/it_IT.qm language/lt.qm language/nl_NL.qm language/no.qm language/pt.qm language/ru.qm language/sv_SE.qm language/tr_TR.qm language/uk_UA.qm language/zh_CN.qm language/zh_TW.qm vokoscreenNG-3.0.2/src/settings/000077500000000000000000000000001362045215000165445ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/settings/QvkSettings.cpp000066400000000000000000000337201362045215000215370ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkSettings.h" #include "global.h" #include "ui_formMainWindow.h" #include QvkSettings::QvkSettings() { // Dient nur zum anlegen des Profils damit das log erstellt werden kann QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); settings.beginGroup( global::name ); settings.setValue( "Version", global::version ); settings.endGroup(); } QvkSettings::~QvkSettings(){} void QvkSettings::readAll( Ui_formMainWindow *ui_mainwindow, QMainWindow *parent ) { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); // Clear all settings if checkBoxResetAtNextStart is set QList listCheckBoxReset = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listCheckBoxReset.count(); i++ ) { if ( ( listCheckBoxReset.at(i)->objectName() == "checkBoxResetAtNextStart" ) and ( settings.value( listCheckBoxReset.at(i)->objectName(), false ).toBool() == true ) ) { settings.clear(); } } parent->move( settings.value( "MainWindow_X" ).toInt(), settings.value( "MainWindow_Y" ).toInt() ); QList listComboBox = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listComboBox.count(); i++ ) { QString valueText = settings.value( listComboBox.at(i)->objectName(), "" ).toString(); int valueInt = listComboBox.at(i)->findText( valueText ); if ( valueInt > -1 ) { listComboBox.at(i)->setCurrentIndex( valueInt ); } } QList listRadiobuttons = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listRadiobuttons.count(); i++ ) { // We have no settings-file(first start after install) but this object we want set as Standard. if ( ( listRadiobuttons.at(i)->objectName() == "radioButtonScreencastFullscreen" ) and ( settings.value( listRadiobuttons.at(i)->objectName(), true ).toBool() == true ) ) { listRadiobuttons.at(i)->click(); continue; } // We have no settings-file(first start after install) but this object we want set as Standard. if ( ( listRadiobuttons.at(i)->objectName() == "radioButtonScreenshotFullscreen" ) and ( settings.value( listRadiobuttons.at(i)->objectName(), true ).toBool() == true ) ) { listRadiobuttons.at(i)->click(); continue; } bool value = settings.value( listRadiobuttons.at(i)->objectName(), false ).toBool(); if ( value == true ) { listRadiobuttons.at(i)->click(); } } QList listCheckBox = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listCheckBox.count(); i++ ) { // We have no settings-file(first start after install) but this object we want set as Standard. if ( ( listCheckBox.at(i)->objectName() == "checkBoxShowInSystray" ) and ( settings.value( listCheckBox.at(i)->objectName(), true ).toBool() == true ) ) { listCheckBox.at(i)->click(); continue; } if ( ( listCheckBox.at(i)->objectName() == "checkBoxStartsMinimized" ) and ( settings.value( listCheckBox.at(i)->objectName(), false ).toBool() == true ) ) { parent->showMinimized(); listCheckBox.at(i)->click(); continue; } if ( ( listCheckBox.at(i)->objectName().contains( "checkboxAudioDevice" ) ) and ( settings.value( listCheckBox.at(i)->objectName(), false ).toBool() == true ) ) { listCheckBox.at(i)->click(); continue; } if ( ( listCheckBox.at(i)->objectName().contains( "checkBoxLookForUpdates" ) ) and ( settings.value( listCheckBox.at(i)->objectName(), true ).toBool() == true ) ) { listCheckBox.at(i)->click(); continue; } if ( ( listCheckBox.at(i)->objectName().contains( "checkBoxShowInSystrayAlternative" ) ) and ( settings.value( listCheckBox.at(i)->objectName(), true ).toBool() == true ) ) { listCheckBox.at(i)->click(); continue; } // We found a setting, then we want set or not. if ( settings.value( listCheckBox.at(i)->objectName(), false ).toBool() == true ) { listCheckBox.at(i)->click(); } } QList listSlider = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listSlider.count(); i++ ) { if ( listSlider.at(i)->objectName() == "sliderVideo" ) { continue; } QVariant variant = settings.value( listSlider.at(i)->objectName() ); if ( listSlider.at(i)->objectName() == "sliderCameraWindowSize" ) { if ( variant.isValid() ) { listSlider.at(i)->setValue( variant.toInt() ); listSlider.at(i)->setMinimum(1); continue; } else { listSlider.at(i)->setValue(2); listSlider.at(i)->setMinimum(1); continue; } } if ( variant.isValid() ) { listSlider.at(i)->setValue( variant.toInt() ); } } QList listLineEdit = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listLineEdit.count(); i++ ) { if ( listLineEdit.at(i)->objectName().contains( "lineEdit" ) ) { QString value = settings.value( listLineEdit.at(i)->objectName() ).toString(); if ( !value.isEmpty() ) { listLineEdit.at(i)->setText( value ); } } } // All TabWidget start with value=0, also if in Qt-Creator is the value an other QList listTabWidget = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listTabWidget.count(); i++ ) { listTabWidget.at(i)->setCurrentIndex( 0 ); } QList listToolButton = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listToolButton.count(); i++ ) { if ( listToolButton.at(i)->objectName().contains( "toolButtonMute" ) ) { QString value = settings.value( listToolButton.at(i)->objectName() ).toString(); if ( value == "audio-volume-muted") { listToolButton.at(i)->click(); break; } } } } /* * */ void QvkSettings::saveAll(Ui_formMainWindow *ui_mainwindow , QMainWindow *parent, bool log ) { Q_UNUSED(parent); QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); if ( log == true ) { // do nothing } else settings.clear(); settings.beginGroup( global::name ); if ( log == true ) { // do nothing } else settings.setValue( "Version", global::version ); settings.endGroup(); QList listRadiobuttons = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listRadiobuttons.count(); i++ ) { if ( log == true ) qDebug().noquote().nospace() << listRadiobuttons.at(i)->objectName() << "=" << listRadiobuttons.at(i)->isChecked(); else settings.setValue( listRadiobuttons.at(i)->objectName(), listRadiobuttons.at(i)->isChecked() ); } QList listCheckBox = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listCheckBox.count(); i++ ) { if ( ( listCheckBox.at(i)->objectName() == "checkBoxStopRecordingAfter" ) or ( listCheckBox.at(i)->objectName() == "checkBoxStartTime" ) ) { // We do not save } else { if ( log == true ) qDebug().noquote().nospace() << listCheckBox.at(i)->objectName() << "=" << listCheckBox.at(i)->isChecked(); else settings.setValue( listCheckBox.at(i)->objectName(), listCheckBox.at(i)->isChecked() ); } } QList listComboBox = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listComboBox.count(); i++ ) { if ( log == true ) qDebug().noquote().nospace() << listComboBox.at(i)->objectName() << "=" << listComboBox.at(i)->currentText(); else settings.setValue( listComboBox.at(i)->objectName(), listComboBox.at(i)->currentText() ); } QList listSlider = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listSlider.count(); i++ ) { if ( log == true ) qDebug().noquote().nospace() << listSlider.at(i)->objectName() << "=" << listSlider.at(i)->value(); else settings.setValue( listSlider.at(i)->objectName(), listSlider.at(i)->value() ); } QList listLineEdit = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listLineEdit.count(); i++ ) { if ( listLineEdit.at(i)->objectName().contains( "lineEdit" ) ) { if ( log == true ) qDebug().noquote().nospace() << listLineEdit.at(i)->objectName() << "=" << listLineEdit.at(i)->text(); else settings.setValue( listLineEdit.at(i)->objectName(), listLineEdit.at(i)->text() ); } } QList listToolButton = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listToolButton.count(); i++ ) { if ( listToolButton.at(i)->objectName().contains( "toolButtonMute" ) ) { settings.setValue( listToolButton.at(i)->objectName(), listToolButton.at(i)->icon().name() ); } } } QString QvkSettings::getFileName() { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); return settings.fileName(); } void QvkSettings::saveAreaScreencast( qreal x, qreal y, qreal width, qreal height ) { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); settings.beginGroup( "AreaScreencast" ); settings.setValue( "X", QVariant(x).toInt() ); settings.setValue( "Y", QVariant(y).toInt() ); settings.setValue( "Width", QVariant(width).toInt() ); settings.setValue( "Height", QVariant(height).toInt() ); settings.endGroup(); } void QvkSettings::readAreaScreencast( QvkRegionChoise *vkRegionChoise ) { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); settings.beginGroup( "AreaScreencast" ); vkRegionChoise->setX( settings.value( "X", 200 ).toInt() ); vkRegionChoise->setY( settings.value( "Y", 200 ).toInt() ); vkRegionChoise->setWidth( settings.value( "Width", 320 ).toInt() ); vkRegionChoise->setHeight( settings.value( "Height", 200 ).toInt() ); settings.endGroup(); } void QvkSettings::saveCamera( int x, int y ) { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); settings.beginGroup( "Camera" ); settings.setValue( "X", x ); settings.setValue( "Y", y ); settings.endGroup(); } void QvkSettings::readCamera( QvkCameraController *vkCameraController ) { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); settings.beginGroup( "Camera" ); vkCameraController->cameraWindow->move( settings.value( "X", 0 ).toInt(), settings.value( "Y", 0 ).toInt() ); settings.endGroup(); } void QvkSettings::saveSystrayAlternative( int x, int y ) { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); settings.beginGroup( "SystrayAlternative" ); settings.setValue( "X", x ); settings.setValue( "Y", y ); settings.endGroup(); } void QvkSettings::readSystrayAlternative( QvkSystrayAlternative *vkSystrayAlternative ) { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); settings.beginGroup( "SystrayAlternative" ); vkSystrayAlternative->move( settings.value( "X", 0 ).toInt(), settings.value( "Y", 0 ).toInt() ); settings.endGroup(); } void QvkSettings::savePlayerPathOpenFile( QString pathFile ) { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); settings.beginGroup( "Player" ); QFileInfo fileInfo( pathFile ); QString file = fileInfo.fileName(); QString path = pathFile.replace( file, "" ); settings.setValue( "Path", path ); settings.endGroup(); } void QvkSettings::readPlayerPathOpenFile( QvkPlayer *vkplayer ) { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); settings.beginGroup( "Player" ); vkplayer->pathOpenFile = settings.value( "Path", "" ).toString(); settings.endGroup(); } vokoscreenNG-3.0.2/src/settings/QvkSettings.h000066400000000000000000000036241362045215000212040ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKSETTINGS_H #define QVKSETTINGS_H #include "ui_formMainWindow.h" #include "QvkRegionChoise.h" #include "QvkCameraController.h" #include "QvkSystrayAlternative.h" #include "QvkPlayer.h" #include #include #include #include class QvkSettings: public QObject { Q_OBJECT public: QvkSettings(); virtual ~QvkSettings(); void saveAll(Ui_formMainWindow *ui_mainwindow, QMainWindow *parent, bool log); void readAll(Ui_formMainWindow *ui_mainwindow, QMainWindow *parent); void saveAreaScreencast(qreal x, qreal y, qreal width, qreal height); void readAreaScreencast(QvkRegionChoise *vkRegionChoise); void saveCamera( int x, int y ); void readCamera( QvkCameraController *vkCameraController ); void saveSystrayAlternative( int x, int y ); void readSystrayAlternative( QvkSystrayAlternative *vkSystrayAlternative ); void savePlayerPathOpenFile(QString pathFile ); void readPlayerPathOpenFile(QvkPlayer *vkplayer); QString getFileName(); public slots: private slots: signals: protected: private: }; #endif vokoscreenNG-3.0.2/src/settings/settings.pri000066400000000000000000000001641362045215000211210ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkSettings.h SOURCES += $$PWD/QvkSettings.cpp vokoscreenNG-3.0.2/src/spezialSlider/000077500000000000000000000000001362045215000175165ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/spezialSlider/QvkSpezialSlider.cpp000066400000000000000000000136431362045215000234650ustar00rootroot00000000000000#include "QvkSpezialSlider.h" #include #include #include #include #include QvkSpezialSlider::QvkSpezialSlider( Qt::Orientation orientation) { setOrientation( orientation ); radius = 4.0; // Radius from begin and end off line lineHight = 6.0; } QvkSpezialSlider::~QvkSpezialSlider() { } QColor QvkSpezialSlider::vk_get_color( enum QPalette::ColorRole colorRole ) { QColor color; if ( isEnabled() == true ) { QPalette palette = QGuiApplication::palette(); color = palette.color( QPalette::Active, colorRole ); } if ( isEnabled() == false ) { QPalette palette = QGuiApplication::palette(); color = palette.color( QPalette::Disabled, colorRole ); } return color; } void QvkSpezialSlider::paintEvent(QPaintEvent *event) { (void)event; distance = ( height() - lineHight ) / 2.0; // Distance from top or bottom to line handleRadius = height() / 2.0; QPainter painter; painter.begin( this ); painter.setRenderHints( QPainter::Antialiasing, true ); // Background from line pen.setStyle( Qt::NoPen ); painter.setPen( pen ); QBrush brush; brush.setStyle( Qt::SolidPattern ); brush.setColor( vk_get_color( QPalette::Mid ) ); painter.setBrush( brush ); painter.drawRoundedRect( 0, distance, width(), height() - 2*distance, radius, radius, Qt::AbsoluteSize ); // Foreground from line brush.setColor( vk_get_color( QPalette::Highlight) ); painter.setBrush( brush ); painter.drawRoundedRect( 0, distance, (qreal)(width() - handleRadius) / ( (qreal)maximum() - (qreal)minimum() ) * ( (qreal)value() - minimum() ) + (qreal)( pen.widthF() / 2.0 ), height() - 2*distance, radius, radius, Qt::AbsoluteSize ); // Handle pen.setStyle( Qt::SolidLine ); pen.setColor( vk_get_color( QPalette::Highlight ) ); pen.setWidthF( 2.0 ); painter.setPen( pen ); brush.setColor( vk_get_color( QPalette::Button ) ); painter.setBrush( brush ); qreal onePixel = 0; if ( value() == minimum() ) { onePixel = 1; } if ( value() == maximum() ) { onePixel = -1; } handleRadius = handleRadius - pen.widthF()/2; QRectF qRectF( (qreal)(width() - 2*handleRadius) / (qreal)( maximum() - minimum() ) * (qreal)( value() - minimum() ) + onePixel, pen.widthF()/2, 2*handleRadius, 2*handleRadius ); painter.drawEllipse( qRectF ); // Handletext if ( showValue == true ) { QFont font = qApp->font(); painter.setFont( font ); QFontMetrics fontMetrics( font ); setMinimumHeight( fontMetrics.width( "5555" ) ); painter.setPen( vk_get_color( QPalette::ButtonText ) ); painter.drawText( qRectF, Qt::AlignCenter, QString::number( value() ) ); } painter.end(); } void QvkSpezialSlider::mousePressEvent( QMouseEvent *event ) { if( event->button() != Qt::LeftButton) { return; } // Press on Handle QRectF rectHandle( (qreal)(width() - 2*handleRadius) / ( (qreal)maximum() - (qreal)minimum() ) * ( (qreal)value() - minimum() ) + (qreal)( pen.widthF() / 2.0 ), pen.widthF()/2.0, 2*handleRadius, 2*handleRadius ); if ( rectHandle.contains( event->pos() ) ) { mousePressed = true; return; } // Click on line if ( rectHandle.contains( event->pos() ) == false ) { qreal myValue = 0; qreal myX = event->x(); qreal myWidth = width(); qreal myMinimum = minimum(); qreal myMaximum = maximum(); qreal distancePixel = myWidth / ( myMaximum - myMinimum ); if ( event->button() == Qt::LeftButton ) { if ( myX <= distancePixel / 2 ) { myValue = myMinimum; } if ( myX >= ( distancePixel * ( myMaximum - myMinimum ) - distancePixel / 2 ) ) { myValue = myMaximum; } if ( ( myX >= distancePixel / 2 ) and ( myX <= ( distancePixel * ( myMaximum - myMinimum ) - distancePixel / 2 ) ) ) { myValue = qRound( myMinimum + ( myX / distancePixel ) ); } setValue( myValue ); emit sliderMoved( myValue ); } event->accept(); } } void QvkSpezialSlider::mouseMoveEvent( QMouseEvent *event ) { if ( mousePressed == true ) { qreal stepSizeInPixels = (qreal)( (qreal)width() / (qreal)( maximum() - minimum() ) ); qreal stepCurrent = value() - minimum(); if ( event->localPos().x() > ( stepCurrent * stepSizeInPixels ) + (qreal)( stepSizeInPixels / 2 ) ) { qreal couldValue = ( event->localPos().x() / stepSizeInPixels ) + minimum() + 1; setValue( static_cast(couldValue) ); emit sliderMoved( static_cast(couldValue) ); return; } if ( event->localPos().x() < ( stepCurrent * stepSizeInPixels ) - (qreal)( stepSizeInPixels / 2 ) ) { qreal couldValue = ( event->localPos().x() / stepSizeInPixels ) + minimum(); setValue( static_cast(couldValue) ); emit sliderMoved( static_cast(couldValue) ); return; } } } void QvkSpezialSlider::mouseReleaseEvent( QMouseEvent *event ) { Q_UNUSED(event); mousePressed = false; } /* * Show value on handle. * The value default is true. */ void QvkSpezialSlider::setShowValue( bool value ) { showValue = value; } vokoscreenNG-3.0.2/src/spezialSlider/QvkSpezialSlider.h000066400000000000000000000014521362045215000231250ustar00rootroot00000000000000#ifndef QVKSPEZIALSLIDER_H #define QVKSPEZIALSLIDER_H #include #include #include #include class QvkSpezialSlider : public QSlider { Q_OBJECT public: explicit QvkSpezialSlider( Qt::Orientation orientation ); ~QvkSpezialSlider(); private: QPen pen; qreal radius; qreal lineHight; qreal distance; qreal handleRadius; bool mousePressed = false; QColor vk_get_color(QPalette::ColorRole colorRole); bool showValue = true; public slots: void setShowValue( bool value ); protected: void paintEvent( QPaintEvent *event ); void mousePressEvent( QMouseEvent *event ); void mouseMoveEvent( QMouseEvent *event ); void mouseReleaseEvent( QMouseEvent *event ); signals: }; #endif // QVKSPEZIALSLIDER_H vokoscreenNG-3.0.2/src/spezialSlider/spezialSlider.pri000066400000000000000000000002061362045215000230420ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkSpezialSlider.h SOURCES += $$PWD/QvkSpezialSlider.cpp FORMS += vokoscreenNG-3.0.2/src/systray/000077500000000000000000000000001362045215000164225ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/systray/QvkSystray.cpp000066400000000000000000000151441362045215000212730ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkSystray.h" #include "global.h" #include QvkSystray::QvkSystray(Ui_formMainWindow *ui_mainwindow ) { ui = ui_mainwindow; } QvkSystray::~QvkSystray() { } void QvkSystray::init() { QAction *titleAction = new QAction( this ); titleAction->setIcon( QIcon( ":pictures/systray/systray.png" ) ); titleAction->setText( global::name ); titleAction->setEnabled( false ); startAction = new QAction( this ); startAction->setIcon( QIcon::fromTheme( "media-playback-start", ui->pushButtonStart->style()->standardIcon( QStyle::SP_MediaPlay ) ) ); startAction->setText( tr( "Start" ) ); startAction->setData( "Start" ); stopAction = new QAction( this ); stopAction->setIcon( QIcon::fromTheme( "media-playback-stop" , ui->pushButtonStart->style()->standardIcon( QStyle::SP_MediaStop ) ) ); stopAction->setText( tr( "Stop" ) ); stopAction->setData( "Stop" ); stopAction->setEnabled( false ); pauseAction = new QAction( this ); pauseAction->setIcon( QIcon::fromTheme( "media-playback-pause", ui->pushButtonStart->style()->standardIcon( QStyle::SP_MediaPause ) ) ); pauseAction->setText( tr( "Pause" ) ); pauseAction->setData( "Pause" ); pauseAction->setEnabled( false ); continueAction = new QAction( this ); continueAction->setIcon( QIcon::fromTheme( "media-playback-start", ui->pushButtonStart->style()->standardIcon( QStyle::SP_MediaPlay ) ) ); continueAction->setText( tr( "Continue" ) ); continueAction->setData( "Continue" ); continueAction->setEnabled( false ); exitAction = new QAction( this ); exitAction->setIcon( QIcon::fromTheme( "application-exit", ui->pushButtonStart->style()->standardIcon( QStyle::SP_DialogCloseButton ) ) ); exitAction->setText( tr( "Exit" ) ); exitAction->setData( "Exit" ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), startAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), stopAction, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), pauseAction, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), continueAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), continueAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), this, SLOT( slot_setRecordIcon( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), startAction, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), stopAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), pauseAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), continueAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), this, SLOT( slot_setSystrayIcon( bool ) ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), startAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), stopAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), pauseAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), continueAction, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), this, SLOT( slot_setPauseIcon( bool ) ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), startAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), stopAction, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), pauseAction, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), continueAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), this, SLOT( slot_setRecordIcon( bool ) ) ); connect( ui->checkBoxStartTime, SIGNAL( clicked( bool ) ), startAction, SLOT( setDisabled( bool ) ) ); connect( startAction, SIGNAL( triggered( bool ) ), ui->pushButtonStart, SLOT( click() ) ); connect( stopAction, SIGNAL( triggered( bool ) ), ui->pushButtonStop, SLOT( click() ) ); connect( pauseAction, SIGNAL( triggered( bool ) ), ui->pushButtonPause, SLOT( click() ) ); connect( continueAction, SIGNAL( triggered( bool ) ), ui->pushButtonContinue, SLOT( click() ) ); menu = new QMenu(); menu->addAction( titleAction ); menu->addSeparator(); menu->addAction( startAction ); menu->addAction( stopAction ); menu->addAction( pauseAction ); menu->addAction( continueAction ); menu->addSeparator(); menu->addAction( exitAction ); setIcon( QIcon( ":/pictures/systray/systray.png" ) ); setContextMenu ( menu ); setToolTip( global::name ); show(); connect( exitAction, SIGNAL( triggered( bool ) ), this, SLOT( slot_hide() ) ); } // This slot need in this class void QvkSystray::slot_hide() { hide(); emit signal_SystemtrayIsClose(); } // This slot need in Main GUI void QvkSystray::slot_closeSystray() { hide(); } void QvkSystray::slot_setRecordIcon( bool ) { if ( global::VK_showOnlyFallbackIcons == true ) { setIcon( QIcon( ":/pictures/systray/record.png" ) ); } else { setIcon( QIcon::fromTheme( "media-record", QIcon( ":/pictures/systray/record.png" ) ) ); } } void QvkSystray::slot_setSystrayIcon( bool ) { setIcon( QIcon( ":/pictures/systray/systray.png" ) ); } void QvkSystray::slot_setPauseIcon( bool ) { setIcon( QIcon::fromTheme( "media-playback-pause", ui->pushButtonStart->style()->standardIcon( QStyle::SP_MediaPause ) ) ); } vokoscreenNG-3.0.2/src/systray/QvkSystray.h000066400000000000000000000031121362045215000207300ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKSYSTRAY_H #define QVKSYSTRAY_H #include "ui_formMainWindow.h" #include #include #include class QvkSystray: public QSystemTrayIcon { Q_OBJECT public: QvkSystray( Ui_formMainWindow *ui_mainwindow ); virtual ~QvkSystray(); void init(); QAction *startAction; public slots: void slot_closeSystray(); private: Ui_formMainWindow *ui; QMenu *menu; QAction *stopAction; QAction *pauseAction; QAction *continueAction; QAction *hideAction; QAction *exitAction; private slots: void slot_hide(); void slot_setRecordIcon( bool ); void slot_setSystrayIcon( bool ); void slot_setPauseIcon( bool ); protected: signals: void signal_SystemtrayIsClose(); }; #endif vokoscreenNG-3.0.2/src/systray/systray.pri000066400000000000000000000002041362045215000206500ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkSystray.h SOURCES += $$PWD/QvkSystray.cpp vokoscreenNG-3.0.2/src/systrayAlternative/000077500000000000000000000000001362045215000206215ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/systrayAlternative/QvkSystrayAlternative.cpp000066400000000000000000000176511362045215000256760ustar00rootroot00000000000000#include "QvkSystrayAlternative.h" #include "global.h" #include #include #include #include QvkSystrayAlternative::QvkSystrayAlternative( QMainWindow *mainWindow, Ui_formMainWindow *ui_mainwindow, QvkSpezialSlider *gui_sliderShowInSystrayAlternative ) { ui = ui_mainwindow; sliderShowInSystrayAlternative = gui_sliderShowInSystrayAlternative; connect( sliderShowInSystrayAlternative, SIGNAL( valueChanged( int ) ), this, SLOT( slot_resizeWindow( int ) ) ); connect( ui->toolButtonShowInSystrayAlternativeReset, SIGNAL( clicked( bool ) ), this, SLOT( slot_ShowInSystrayAlternativeReset( bool ) ) ); size = QSize( sliderShowInSystrayAlternative->value(), sliderShowInSystrayAlternative->value() ); setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint ); setAttribute( Qt::WA_TranslucentBackground, true ); setScaledContents( true ); resize( size ); QPixmap pixmap( ":/pictures/systray/systray.png" ); pixmap = pixmap.scaled( size , Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); setPixmap( pixmap ); setWindowTitle( global::name + " " + global::version ); setWindowTitle( tr( "Start" ) + " " + tr( "Stop" ) + " " + tr( "Pause" ) ); QIcon icon( QString::fromUtf8( ":/pictures/logo/logo.png" ) ); setWindowIcon( icon ); QAction *titleAction = new QAction( this ); titleAction->setIcon( QIcon( ":pictures/systray/systray.png" ) ); titleAction->setText( global::name ); titleAction->setEnabled( false ); startAction = new QAction( this ); startAction->setIcon( QIcon::fromTheme( "media-playback-start", style()->standardIcon( QStyle::SP_MediaPlay ) ) ); startAction->setText( tr( "Start" ) ); startAction->setData( "Start" ); stopAction = new QAction( this ); stopAction->setIcon( QIcon::fromTheme( "media-playback-stop" , style()->standardIcon( QStyle::SP_MediaStop ) ) ); stopAction->setText( tr( "Stop" ) ); stopAction->setData( "Stop" ); stopAction->setEnabled( false ); pauseAction = new QAction( this ); pauseAction->setIcon( QIcon::fromTheme( "media-playback-pause", style()->standardIcon( QStyle::SP_MediaPause ) ) ); pauseAction->setText( tr( "Pause" ) ); pauseAction->setData( "Pause" ); pauseAction->setEnabled( false ); continueAction = new QAction( this ); continueAction->setIcon( QIcon::fromTheme( "media-playback-start", style()->standardIcon( QStyle::SP_MediaPlay ) ) ); continueAction->setText( tr( "Continue" ) ); continueAction->setData( "Continue" ); continueAction->setEnabled( false ); exitAction = new QAction( this ); exitAction->setIcon( QIcon::fromTheme( "application-exit", style()->standardIcon( QStyle::SP_DialogCloseButton ) ) ); exitAction->setText( tr( "Exit" ) ); exitAction->setData( "Exit" ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), startAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), stopAction, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), pauseAction, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), continueAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), continueAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), this, SLOT( slot_setRecordIcon( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), startAction, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), stopAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), pauseAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), continueAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), this, SLOT( slot_setSystrayIcon( bool ) ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), startAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), stopAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), pauseAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), continueAction, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonPause, SIGNAL( clicked( bool ) ), this, SLOT( slot_setPauseIcon( bool ) ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), startAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), stopAction, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), pauseAction, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), continueAction, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonContinue, SIGNAL( clicked( bool ) ), this, SLOT( slot_setRecordIcon( bool ) ) ); connect( ui->checkBoxStartTime, SIGNAL( clicked( bool ) ), startAction, SLOT( setDisabled( bool ) ) ); connect( startAction, SIGNAL( triggered( bool ) ), ui->pushButtonStart, SLOT( click() ) ); connect( stopAction, SIGNAL( triggered( bool ) ), ui->pushButtonStop, SLOT( click() ) ); connect( pauseAction, SIGNAL( triggered( bool ) ), ui->pushButtonPause, SLOT( click() ) ); connect( continueAction, SIGNAL( triggered( bool ) ), ui->pushButtonContinue, SLOT( click() ) ); connect( exitAction, SIGNAL( triggered( bool ) ), this, SLOT( close() ) ); connect( exitAction, SIGNAL( triggered( bool ) ), mainWindow, SLOT( close() ) ); menu = new QMenu(); menu->addAction( titleAction ); menu->addSeparator(); menu->addAction( startAction ); menu->addAction( stopAction ); menu->addAction( pauseAction ); menu->addAction( continueAction ); menu->addSeparator(); menu->addAction( exitAction ); } QvkSystrayAlternative::~QvkSystrayAlternative() { } void QvkSystrayAlternative::slot_resizeWindow( int value ) { size = QSize( value, value ); resize( value, value ); if ( ui->pushButtonStart->isEnabled() == true ) { slot_setSystrayIcon( true ); } if ( ui->pushButtonStop->isEnabled() == true ) { slot_setRecordIcon( true ); } if ( ui->pushButtonContinue->isEnabled() == true ) { slot_setPauseIcon( true ); } } void QvkSystrayAlternative::mouseMoveEvent( QMouseEvent *event ) { move( event->globalPos() - point ); } void QvkSystrayAlternative::mousePressEvent( QMouseEvent *event ) { point = event->pos(); } void QvkSystrayAlternative::contextMenuEvent( QContextMenuEvent *event ) { menu->exec( event->globalPos() ); } void QvkSystrayAlternative::slot_setRecordIcon( bool ) { if ( global::VK_showOnlyFallbackIcons == true ) { QPixmap pixmap( ":/pictures/systray/record.png" ); pixmap = pixmap.scaled( size , Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); setPixmap( pixmap ); } else { QIcon icon = QIcon::fromTheme( "media-record", QIcon( ":/pictures/systray/record.png" ) ); QPixmap pixmap( icon.pixmap( size ) ); setPixmap( pixmap ); } } void QvkSystrayAlternative::slot_setSystrayIcon( bool ) { QPixmap pixmap( ":/pictures/systray/systray.png" ); pixmap = pixmap.scaled( size , Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); setPixmap( pixmap ); } void QvkSystrayAlternative::slot_setPauseIcon( bool ) { QIcon icon = QIcon::fromTheme( "media-playback-pause", style()->standardIcon( QStyle::SP_MediaPause ) ); QPixmap pixmap( icon.pixmap( size ) ); setPixmap( pixmap ); } void QvkSystrayAlternative::slot_ShowInSystrayAlternativeReset( bool ) { move( 0, 0 ); sliderShowInSystrayAlternative->setValue( 48 ); } vokoscreenNG-3.0.2/src/systrayAlternative/QvkSystrayAlternative.h000066400000000000000000000021711362045215000253320ustar00rootroot00000000000000#ifndef SYSTRAYALTERNATIVE_H #define SYSTRAYALTERNATIVE_H #include "ui_formMainWindow.h" #include "QvkSpezialSlider.h" #include #include #include class QvkSystrayAlternative : public QLabel { Q_OBJECT public: explicit QvkSystrayAlternative( QMainWindow *mainWindow, Ui_formMainWindow *ui_mainwindow, QvkSpezialSlider *gui_sliderShowInSystrayAlternative ); ~QvkSystrayAlternative(); private: Ui_formMainWindow *ui; QMenu *menu; QAction *startAction; QAction *stopAction; QAction *pauseAction; QAction *continueAction; QAction *hideAction; QAction *exitAction; QSize size; QPoint point; QvkSpezialSlider *sliderShowInSystrayAlternative; private slots: void slot_setRecordIcon( bool ); void slot_setSystrayIcon( bool ); void slot_setPauseIcon( bool ); void slot_resizeWindow( int ); void slot_ShowInSystrayAlternativeReset( bool ); protected: void contextMenuEvent(QContextMenuEvent *event) override; void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); }; #endif // SYSTRAYALTERNATIVE_H vokoscreenNG-3.0.2/src/systrayAlternative/systrayAlternative.pri000066400000000000000000000002061362045215000252500ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkSystrayAlternative.h SOURCES += $$PWD/QvkSystrayAlternative.cpp vokoscreenNG-3.0.2/src/theme/000077500000000000000000000000001362045215000160065ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/theme/QvkTheme.cpp000066400000000000000000000117711362045215000202450ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkTheme.h" #include "global.h" #include #include QvkTheme::QvkTheme( Ui_formMainWindow *ui_formMainWindow ) { ui = ui_formMainWindow; timer = new QTimer(this); connect( timer, SIGNAL( timeout() ), this, SLOT( slot_setTheme() ) ); timer->start(3000); slot_setTheme(); } QvkTheme::~QvkTheme() { } void QvkTheme::slot_setTheme() { if ( QIcon::themeName() != oldThemeName ) { oldThemeName = QIcon::themeName(); makeAndSetValidIconForSideBar( ui->tabWidgetSideBar->indexOf( ui->tabSidebarScreencast ), VK_getIcon( "video-display", ":/pictures/screencast/monitor.png" ) ); makeAndSetValidIconForSideBar( ui->tabWidgetSideBar->indexOf( ui->tabSidebarPlayer ), VK_getIcon( "multimedia-player", ":/pictures/player/player.png" ) ); makeAndSetValidIconForSideBar( ui->tabWidgetSideBar->indexOf( ui->tabSidebarCamera ), VK_getIcon( "camera-web", ":/pictures/camera/camera.png" ) ); makeAndSetValidIconForSideBar( ui->tabWidgetSideBar->indexOf( ui->tabSidebarLog ), VK_getIcon( "help-about", ":/pictures/log/log.png" ) ); makeAndSetValidIcon( ui->tabWidgetScreencast, ui->tabWidgetScreencast->indexOf( ui->tabScreen ), VK_getIcon( "video-display", ":/pictures/screencast/monitor.png" ) ); makeAndSetValidIcon( ui->tabWidgetScreencast, ui->tabWidgetScreencast->indexOf( ui->tabAudio ), VK_getIcon( "audio-input-microphone", ":/pictures/screencast/microphone.png" ) ); makeAndSetValidIcon( ui->tabWidgetScreencast, ui->tabWidgetScreencast->indexOf( ui->tabVideo ), VK_getIcon( "applications-multimedia",":/pictures/screencast/format-codec.png" ) ); makeAndSetValidIcon( ui->tabWidgetScreencast, ui->tabWidgetScreencast->indexOf( ui->tabMisc ), VK_getIcon( "preferences-system", ":/pictures/screencast/preferences-system.png" ) ); makeAndSetValidIcon( ui->tabWidgetScreencast, ui->tabWidgetScreencast->indexOf( ui->tabTimer ), VK_getIcon( "appointment-new", ":/pictures/screencast/timer.png" ) ); makeAndSetValidIcon( ui->tabWidgetScreencast, ui->tabWidgetScreencast->indexOf( ui->tabAvailable ), VK_getIcon( "dialog-information", ":/pictures/screencast/supported-formats.png" ) ); makeAndSetValidIcon( ui->tabWidgetScreencast, ui->tabWidgetScreencast->indexOf( ui->tabAbout ), VK_getIcon( "help-about", ":/pictures/screencast/help-about.png" ) ); ui->toolButtonScreencastAreaReset->setIcon( VK_getIcon( "edit-undo", ":/pictures/screencast/undo.png" ) ); ui->toolButtonx264Reset->setIcon( VK_getIcon( "edit-undo", ":/pictures/screencast/undo.png" ) ); ui->toolButtonOpenh264Reset->setIcon( VK_getIcon( "edit-undo", ":/pictures/screencast/undo.png" ) ); ui->toolButtonShowInSystrayAlternativeReset->setIcon( VK_getIcon( "edit-undo", ":/pictures/screencast/undo.png" ) ); makeAndSetValidIcon( ui->tabWidgetCamera, ui->tabWidgetCamera->indexOf( ui->tabCamera ), VK_getIcon( "camera-web", ":/pictures/camera/camera.png" ) ); makeAndSetValidIcon( ui->tabWidgetLog, ui->tabWidgetLog->indexOf( ui->tabLog ), VK_getIcon( "help-about", ":/pictures/log/log.png" ) ); emit signal_newTheme(); } } QIcon QvkTheme::VK_getIcon( QString iconName, QString iconNameFallback ) { QIcon icon; if ( global::VK_showOnlyFallbackIcons == true ) { QIcon tmpIcon( iconNameFallback ); icon = tmpIcon; return icon; } if ( QIcon::hasThemeIcon( iconName ) == true ) { icon = QIcon::fromTheme( iconName ); } else { QIcon tmpIcon( iconNameFallback ); icon = tmpIcon; } return icon; } void QvkTheme::makeAndSetValidIcon( QTabWidget *tabWidget, int index , QIcon icon ) { int a = 128; QPixmap iconPixmap = icon.pixmap( a, a ); tabWidget->setTabIcon( index, QIcon( iconPixmap ) ); } void QvkTheme::makeAndSetValidIconForSideBar( int index, QIcon icon ) { int a = 128; QPixmap workPixmap(icon.pixmap( a, a ) ); QTransform transform; transform.rotate( 90 ); workPixmap = workPixmap.transformed( transform, Qt::SmoothTransformation ); ui->tabWidgetSideBar->setTabIcon( index, workPixmap ); } vokoscreenNG-3.0.2/src/theme/QvkTheme.h000066400000000000000000000031031362045215000177000ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKTHEME_H #define QVKTHEME_H #include "ui_formMainWindow.h" class QvkTheme: public QObject { Q_OBJECT public: QvkTheme(Ui_formMainWindow *ui_formMainWindow ); virtual ~QvkTheme(); QIcon VK_getIcon( QString iconName, QString iconNameFallback ); void makeAndSetValidIcon( QTabWidget *tabWidget, int index , QIcon icon ); public slots: private slots: void slot_setTheme(); signals: void signal_newTheme(); protected: private: // If a Desktop has no Icon-Theme as Windows or a broken Linux Desktop then QIcon::themeName() return "" therefore we need pillepalle :>) QString oldThemeName = "pillepalle"; Ui_formMainWindow *ui; QTimer *timer; void makeAndSetValidIconForSideBar( int index, QIcon icon ); }; #endif vokoscreenNG-3.0.2/src/theme/theme.pri000066400000000000000000000002001362045215000176140ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkTheme.h SOURCES += $$PWD/QvkTheme.cpp vokoscreenNG-3.0.2/src/version/000077500000000000000000000000001362045215000163715ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/version/QvkVersion.cpp000066400000000000000000000025311362045215000212050ustar00rootroot00000000000000#include "QvkVersion.h" #include "global.h" QvkVersion::QvkVersion() { connect( &manager, SIGNAL( finished( QNetworkReply* ) ), SLOT( slot_downloadFinished( QNetworkReply* ) ) ); } void QvkVersion::slot_doDownload( bool checked ) { if ( checked == false ) { emit signal_newVersionAvailable( "" ); return; } #ifdef Q_OS_LINUX QNetworkRequest request( QUrl( "https://vokoscreen.volkoh.de/3.0/version/linux/VERSION" ) ); #endif #ifdef Q_OS_WIN QNetworkRequest request( QUrl( "https://vokoscreen.volkoh.de/3.0/version/windows/VERSION" ) ); #endif manager.get( request ); } void QvkVersion::slot_downloadFinished( QNetworkReply *reply ) { QUrl url = reply->url(); if ( reply->error() ) { fprintf( stderr, "[vokoscreenNG] Download of %s failed: %s\n", url.toEncoded().constData(), qPrintable( reply->errorString() ) ); } else { QString string = QString( reply->readAll() ); QStringList stringList = string.split( "\n" ); if ( !stringList.empty() ) { QString update; int i = stringList.indexOf( QRegExp( "Version*", Qt::CaseInsensitive, QRegExp::Wildcard ) ); if ( i > -1 ) { update = stringList.at(i).section( "=", 1, 1 ); } emit signal_newVersionAvailable( update ); } } } vokoscreenNG-3.0.2/src/version/QvkVersion.h000066400000000000000000000011321362045215000206460ustar00rootroot00000000000000#ifndef version_H #define version_H #include #include #include #include #include #include #include class QvkVersion: public QObject { Q_OBJECT public: QvkVersion(); public slots: private: QNetworkAccessManager manager; QList currentDownloadsQList; QString remoteVersion; private slots: void slot_doDownload( bool checked ); void slot_downloadFinished( QNetworkReply *reply ); signals: void signal_newVersionAvailable( QString update ); }; #endif vokoscreenNG-3.0.2/src/version/version.pri000066400000000000000000000002041362045215000205660ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkVersion.h SOURCES += $$PWD/QvkVersion.cpp vokoscreenNG-3.0.2/src/vokoscreen-version-3.ts000066400000000000000000000357521362045215000212710ustar00rootroot00000000000000 QvkAudioPulse Select one or more devices QvkAudioWindows Select one or more devices QvkCameraController Camera QvkCameraWindow Switch to Window Switch to Fullscreen QvkCountdown Countdown QvkHelp Help QvkLimitDiskFreeSpace Warning The recording is not started, not enough free disk space. The free disk space limit is reached. Limit of free disk space Megabyte The recording was stopped, not enough free disk space. QvkMainWindow Fullscreen Window No filemanager found. Please install a filemanager. Desktop session is a Wayland session To time Wayland is not supported. A screencast show a black screen. Please logout and start a X11 Desktop session Sourcecode Homepage Translations Donate Wayland desktop session detected QvkPlayer Open File QvkRegionChoise Area QvkSystray Start Stop Pause Continue Exit QvkSystrayAlternative Start Stop Pause Continue Exit cameraSettingsDialog Dialog Flip horizontal Flip vertical Invert Gray Black-and-white Remove window frame 160x120 320x240 Camera settings 640x480 formMainWindow Area Reset Magnification Countdown Video size: Free disk space: Information Record Time: Audio Frames Videocodec Format Audiocodec Quality Scale Do not record mouse cursor Hour Minute Start the timer Stop recording after Hours Minutes Seconds Videopath Limit of free disk space Show in systray Second wait before recording Look for updates Help Video Available Not available Start Stop Pause Continue Play Folder Camera Invert Gray Send Report CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F12 Play last record Open folder CTRL+SHIFT+F8 Minimized when recording starts Starts minimized Flip horizontal Flip vertical Black-and-white Remove window frame Donate Reset all settings at the next start Copyright and license from pictures Megabyte Screencast Player Log license Copyright and license from pictures player Play Pause Stop Open File Fullscreen Previous frame Next frame Mute Move menu vokoscreenNG-3.0.2/src/vokoscreenNG.pro000066400000000000000000000072541362045215000200410ustar00rootroot00000000000000#------------------------------------------------- # # Project created by QtCreator 2017-09-12T21:33:03 # #------------------------------------------------- unix: QT += x11extras QT += core gui widgets multimedia network # testlib // Achtung unter Windows öffnet sich damit die Konsole und qDebug() zeigt seine Ausgaben. TARGET = vokoscreenNG TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += main.cpp \ mainwindow.cpp \ global.cpp HEADERS += mainwindow.h \ global.h FORMS += formMainWindow.ui RESOURCES += screencast.qrc isEmpty(QMAKE_LRELEASE) { # Try invocation path of qmake for lrelease # NOTE: Usually from Qt Unified Installer win32: QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe else: QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease # As a last resort try to use lrelease from PATH # NOTE: Usually from a distro package unix:!exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease-qt5 } } system($$QMAKE_LRELEASE language/*.ts) TRANSLATIONS = $$files(language/*.ts) # language packages !isEmpty(TRANSLATIONS) { isEmpty(TS_DIR):TS_DIR = language TSQM.name = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} TSQM.input = TRANSLATIONS TSQM.output = $$TS_DIR/${QMAKE_FILE_BASE}.qm TSQM.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} TSQM.CONFIG = no_link QMAKE_EXTRA_COMPILERS += TSQM PRE_TARGETDEPS += compiler_TSQM_make_all } else: message(No translation files in project) # Clean target QMAKE_CLEAN += $$TARGET */*~ QMAKE_LFLAGS += -Wl,--as-needed unix:CONFIG += link_pkgconfig unix:PKGCONFIG += gstreamer-1.0 win32:GStreamerDir=$$(GSTREAMER_1_0_ROOT_X86) win32:INCLUDEPATH += $${GStreamerDir}\include\gstreamer-1.0 win32:INCLUDEPATH += $${GStreamerDir}\include\glib-2.0 win32:INCLUDEPATH += $${GStreamerDir}\lib\glib-2.0\include win32:LIBS += -LC:\gstreamer\1.0\x86\bin win32:LIBS += -LC:\gstreamer\1.0\x86\lib\gstreamer-1.0 win32:LIBS += -llibgstreamer-1.0-0 win32:LIBS += -llibglib-2.0-0 win32:LIBS += -llibgobject-2.0-0 # settings include(settings/settings.pri) # region include(region/regionselection.pri) # winInfo unix:LIBS += -lX11 include(winInfo/winInfo.pri) # countdown include(countdown/countdown.pri) # webcam include(camera/camera.pri) # pulse unix:include(audio/pulse/audioPulse.pri) # audio windows win32:include(audio/windows/audioWindows.pri) # help include(help/help.pri) # systray include(systray/systray.pri) # information include(information/information.pri) # magnifier include(magnifier/magnifier.pri) # log include(log/log.pri) # QGlobalshortcut include(QGlobalShortcut/qglobalshortcut.pri) include(QvkGlobalShortcut/QvkGlobalShortcut.pri) # player include(player/player.pri) # theme include(theme/theme.pri) # screenManager include(screenManager/screenManager.pri) # licenses include(licenses/licenses.pri) # limitDiskFreeSpace include(limitDiskFreeSpace/limitDiskFreeSpace.pri) # spezialSlider include(spezialSlider/spezialSlider.pri) # version include(version/version.pri) # loadExtensions include(loadExtensions/loadExtensions.pri) # systrayAlternative include(systrayAlternative/systrayAlternative.pri) vokoscreenNG-3.0.2/src/winInfo/000077500000000000000000000000001362045215000163155ustar00rootroot00000000000000vokoscreenNG-3.0.2/src/winInfo/QvkWinInfo.cpp000066400000000000000000000106051362045215000210560ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #include "QvkWinInfo.h" #include #ifdef Q_OS_LINUX #include #include #endif #ifdef Q_OS_WIN #include #endif QvkWinInfo::QvkWinInfo() { } void QvkWinInfo::slot_start() { setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint ); setAttribute( Qt::WA_TranslucentBackground, true ); resize ( 50, 50 ); lastWinID = this->winId(); windowTimer = new QTimer( this ); connect( windowTimer, SIGNAL( timeout() ), this, SLOT( slot_selectWindow() ) ); windowTimer->start( 500 ); mouseTimer = new QTimer( this ); connect( mouseTimer, SIGNAL( timeout() ), this, SLOT( slot_mousePosition() ) ); mouseTimer->start( 20 ); show(); emit signal_showCursor( true ); } QvkWinInfo::~QvkWinInfo() { } void QvkWinInfo::paintEvent( QPaintEvent *event ) { Q_UNUSED(event); QPixmap pixmap( 50, 50 ); pixmap.fill( Qt::transparent ); QPainter painter; painter.begin( &pixmap ); painter.setPen( QPen( Qt::blue, 4 ) ); painter.drawLine( 50/2, 0, 50/2, 21); painter.drawLine( 50/2, 50/2+4, 50/2, 50 ); painter.drawLine( 0, 50/2, 50/2-4, 50/2 ); painter.drawLine( 50/2+4, 50/2, 50, 50/2 ); painter.end(); QPainter painter_1; painter_1.begin( this ); painter_1.drawPixmap( QPoint( 0, 0 ), pixmap ); painter_1.end(); setMask( pixmap.mask() ); } void QvkWinInfo::slot_mousePosition() { QCursor cursor; move( cursor.pos().x() - 25 , cursor.pos().y() - 25 ); } #ifdef Q_OS_LINUX static WindowList getWindow( Atom prop ) { WindowList res; Atom type = 0; int format = 0; uchar* data = Q_NULLPTR; ulong count, after; Display* display = QX11Info::display(); Window window = QX11Info::appRootWindow(); if ( XGetWindowProperty( display, window, prop, 0, 1024 * sizeof(Window) / 4, False, AnyPropertyType, &type, &format, &count, &after, &data ) == Success ) { Window* list = reinterpret_cast( data ) ; for ( uint i = 0; i < count; ++i ) res += list[i]; if (data) XFree( data ); } return res; } WId QvkWinInfo::activeWindow() { static Atom net_active = 0; if ( !net_active ) net_active = XInternAtom( QX11Info::display(), "_NET_ACTIVE_WINDOW", True ); return getWindow( net_active ).value(0); } QRectF QvkWinInfo::windowGeometryWithoutFrame( WId child) { int x, y; Window root; uint w, h, border, depth; XGetGeometry( QX11Info::display(), child, &root, &x, &y, &w, &h, &border, &depth ); Window parent; Window* children; unsigned int nchildren; if( XQueryTree( QX11Info::display(), child, &root, &parent, &children, &nchildren ) != 0 ) { if( children != nullptr ) { XFree( children ); } int newx, newy; Window dummy; if( XTranslateCoordinates( QX11Info::display(), parent, QX11Info::appRootWindow(), x, y, &newx, &newy, &dummy )) { x = newx; y = newy; } } QRectF rect( x, y, w, h ); return rect; } #endif #ifdef Q_OS_WIN WId QvkWinInfo::activeWindow() { return (WId)GetForegroundWindow(); } #endif void QvkWinInfo::slot_selectWindow() { newWinID = activeWindow(); if ( lastWinID != newWinID ) { windowTimer->stop(); mouseTimer->stop(); // Cursor resize does not show in video in the first Frames resize( 10, 10 ); emit signal_windowChanged( true ); this->close(); } } WId QvkWinInfo::getWinID() { return newWinID; } vokoscreenNG-3.0.2/src/winInfo/QvkWinInfo.h000066400000000000000000000030331362045215000205200ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2019 Volker Kohaupt * * Author: * Volker Kohaupt * * This file is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * * --End_License-- */ #ifndef QVKWININFO_H #define QVKWININFO_H #include #include #include #ifdef Q_OS_LINUX typedef QList WindowList; #endif class QvkWinInfo: public QWidget { Q_OBJECT public: QvkWinInfo(); virtual ~QvkWinInfo(); WId getWinID(); static WId activeWindow(); QRectF windowGeometryWithoutFrame( WId child); public slots: void slot_start(); private slots: void slot_selectWindow(); void slot_mousePosition(); signals: void signal_windowChanged( bool value ); void signal_showCursor( bool value ); protected: void paintEvent( QPaintEvent *event ); private: QTimer *windowTimer; QTimer *mouseTimer; WId lastWinID; WId newWinID; }; #endif vokoscreenNG-3.0.2/src/winInfo/winInfo.pri000066400000000000000000000002041362045215000204360ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkWinInfo.h SOURCES += $$PWD/QvkWinInfo.cpp